From 716a9e60b92135bc82137f26618e594deb005ad0 Mon Sep 17 00:00:00 2001 From: mk <2403457699@qq.com> Date: Fri, 21 Jun 2024 09:14:56 +0800 Subject: [PATCH] init --- .editorconfig | 23 + .env.development | 23 + .env.production | 24 + .eslintignore | 4 + .eslintrc.js | 8 + .gitignore | 18 + .npmrc | 2 + .travis.yml | 5 + LICENSE | 21 + README.md | 51 + babel.config.js | 24 + build-hzw.sh | 14 + build.sh | 14 + build/index.js | 35 + jest.config.js | 23 + jsconfig.json | 9 + package.json | 102 + postcss.config.js | 8 + public/css/lowcode-mobile.css | 45 + public/css/lowcode.css | 21 + public/index.html | 17 + public/js/drtest-url-map.json | 3 + public/js/url-map.json | 3 + src/App.vue | 11 + src/api/bi.js | 3 + src/api/cms.js | 227 + src/api/demo.js | 1 + src/api/lowcode.js | 39 + src/assets/404_images/404.png | Bin 0 -> 98071 bytes src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes src/assets/datapre/icon01@3x.png | Bin 0 -> 1335 bytes src/assets/datapre/icon02@3x.png | Bin 0 -> 1005 bytes src/assets/datapre/icon03@3x.png | Bin 0 -> 1260 bytes src/assets/datapre/icon04@3x.png | Bin 0 -> 917 bytes src/assets/datapre/icon05@3x.png | Bin 0 -> 554 bytes src/assets/datapre/icon06@3x.png | Bin 0 -> 249 bytes src/assets/exit-full-screen.png | Bin 0 -> 411 bytes src/assets/iphone_frame@3x.png | Bin 0 -> 32098 bytes src/assets/svgData/fill-drip-solid.svg | 27 + src/assets/svgData/font-solid.svg | 16 + src/assets/svgData/icon-bars-solid.svg | 1 + src/assets/svgData/icon-d-solid.svg | 1 + src/assets/svgData/icon-database-solid.svg | 1 + src/assets/svgData/icon-down-filled.svg | 15 + src/assets/svgData/icon-down-solid.svg | 16 + src/assets/svgData/icon-download-solid.svg | 1 + src/assets/svgData/icon-floppy-disk-solid.svg | 1 + src/assets/svgData/icon-green.png | Bin 0 -> 35356 bytes src/assets/svgData/icon-green.svg | 15 + src/assets/svgData/icon-n-solid.svg | 1 + src/assets/svgData/icon-orange.svg | 15 + src/assets/svgData/icon-org.png | Bin 0 -> 13017 bytes src/assets/svgData/icon-play-skip-forward.svg | 5 + src/assets/svgData/icon-play-solid.svg | 1 + src/assets/svgData/icon-red.png | Bin 0 -> 14752 bytes src/assets/svgData/icon-right-filled.svg | 15 + src/assets/svgData/icon-right-solid.svg | 16 + src/assets/svgData/icon-s-solid.svg | 1 + src/assets/svgData/icon-satisfied.svg | 18 + src/assets/svgData/icon-solid.svg | 26 + src/assets/svgData/icon-t-solid.svg | 1 + src/assets/svgData/icon-table-cells-solid.svg | 1 + src/assets/svgData/icon-top-filled.svg | 15 + src/assets/svgData/icon-top-solid.svg | 16 + src/assets/svgData/icon-un-satisfied.svg | 18 + .../svgData/icon_act_collect_data_inter.svg | 18 + .../svgData/icon_act_collect_datasource.svg | 23 + src/assets/svgData/icon_act_datasource.svg | 21 + src/assets/svgData/icon_act_meta.svg | 16 + src/assets/svgData/icon_act_quota.svg | 17 + src/assets/svgData/icon_act_service_list.svg | 19 + .../svgData/icon_act_service_monitor.svg | 18 + src/assets/svgData/icon_act_set.svg | 13 + .../svgData/icon_act_system_authority.svg | 20 + .../svgData/icon_act_system_dataset.svg | 22 + .../svgData/icon_act_system_monitor.svg | 25 + src/assets/svgData/icon_act_system_report.svg | 26 + src/assets/svgData/icon_act_system_role.svg | 20 + src/assets/svgData/icon_act_system_user.svg | 19 + src/assets/svgData/icon_act_tag.svg | 15 + src/assets/svgData/icon_cell_close.svg | 6 + src/assets/svgData/icon_cell_open.svg | 6 + .../svgData/icon_collect_data_inter.svg | 16 + .../svgData/icon_collect_datasource.svg | 21 + src/assets/svgData/icon_data_datasource.svg | 23 + src/assets/svgData/icon_data_meta.svg | 18 + src/assets/svgData/icon_data_quota.svg | 19 + src/assets/svgData/icon_data_set.svg | 16 + src/assets/svgData/icon_data_tag.svg | 17 + src/assets/svgData/icon_file_close.svg | 3 + src/assets/svgData/icon_file_open.svg | 6 + src/assets/svgData/icon_info.svg | 1 + src/assets/svgData/icon_no_datasource.svg | 268 + src/assets/svgData/icon_service_list.svg | 17 + src/assets/svgData/icon_service_monitor.svg | 16 + src/assets/svgData/icon_system_authority.svg | 18 + src/assets/svgData/icon_system_dataset.svg | 22 + src/assets/svgData/icon_system_monitor.svg | 23 + src/assets/svgData/icon_system_report.svg | 24 + src/assets/svgData/icon_system_role.svg | 18 + src/assets/svgData/icon_system_user.svg | 17 + src/assets/svgData/icon_title_logo.svg | 3 + src/assets/svgData/icon_tra_close.svg | 3 + src/components/SvgIcon copy/index.vue | 63 + src/components/SvgIcon/index.vue | 56 + src/components/dialog/index.js | 10 + src/components/dialog/src/main.vue | 164 + src/components/folder/index.vue | 68 + src/components/generator/config.bak.js | 784 + src/components/generator/config.js | 655 + src/components/generator/css.js | 18 + src/components/generator/drawingDefalut.js | 39 + src/components/generator/html.js | 398 + src/components/generator/js.js | 280 + src/components/generator/ruleTrigger.js | 16 + src/components/parser/Parser.vue | 191 + src/components/parser/README.md | 17 + src/components/parser/example/Index.vue | 320 + src/components/parser/index.js | 3 + src/components/preview/api/common.js | 196 + src/components/preview/api/table.js | 114 + .../preview/components/addOrEditDialog.vue | 184 + .../preview/components/cascader.vue | 191 + src/components/preview/main.vue | 3108 ++++ src/components/preview/table.vue | 642 + src/components/preview/utils.js | 513 + src/components/preview/validate.js | 91 + src/components/render/render.js | 124 + src/components/render/slots/el-button.js | 5 + .../render/slots/el-checkbox-group.js | 17 + src/components/render/slots/el-input.js | 8 + src/components/render/slots/el-radio-group.js | 17 + src/components/render/slots/el-select.js | 9 + src/components/render/slots/el-upload.js | 24 + src/components/targetInfo/index.js | 9 + src/components/targetInfo/src/api/index.js | 22 + src/components/targetInfo/src/main.vue | 174 + src/components/tinymce/README.md | 3 + src/components/tinymce/config.js | 8 + src/components/tinymce/example/Index.vue | 26 + src/components/tinymce/index.js | 3 + src/components/tinymce/index.vue | 88 + src/components/tinymce/zh_CN.js | 420 + src/components/toolExport/index.js | 10 + .../toolExport/src/api/batchImport.js | 50 + .../toolExport/src/components/card/index.vue | 31 + src/components/toolExport/src/main.vue | 426 + .../toolExport/src/styles/index.scss | 57 + src/components/toolOptions/api/index.js | 60 + src/components/toolOptions/main.vue | 485 + src/components/toolOptions/styles/index.scss | 125 + src/datapreLayout/components/Sidebar.vue | 121 + src/datapreLayout/components/index.js | 2 + src/datapreLayout/index.vue | 75 + src/icons/index.js | 9 + src/icons/svg/button.svg | 1 + src/icons/svg/cascader.svg | 1 + src/icons/svg/checkbox.svg | 1 + src/icons/svg/color.svg | 1 + src/icons/svg/component.svg | 1 + src/icons/svg/dashboard.svg | 1 + src/icons/svg/date-range.svg | 1 + src/icons/svg/date.svg | 1 + src/icons/svg/example.svg | 1 + src/icons/svg/eye-open.svg | 1 + src/icons/svg/eye.svg | 1 + src/icons/svg/form.svg | 1 + src/icons/svg/input.svg | 1 + src/icons/svg/link.svg | 1 + src/icons/svg/nested.svg | 1 + src/icons/svg/number.svg | 1 + src/icons/svg/password copy.svg | 1 + src/icons/svg/password.svg | 1 + src/icons/svg/radio.svg | 1 + src/icons/svg/rate.svg | 1 + src/icons/svg/rich-text.svg | 1 + src/icons/svg/row.svg | 1 + src/icons/svg/select.svg | 1 + src/icons/svg/slider.svg | 1 + src/icons/svg/switch.svg | 1 + src/icons/svg/table copy.svg | 1 + src/icons/svg/table.svg | 1 + src/icons/svg/textarea.svg | 1 + src/icons/svg/time-range.svg | 1 + src/icons/svg/time.svg | 1 + src/icons/svg/tree.svg | 1 + src/icons/svg/upload.svg | 1 + src/icons/svg/user.svg | 1 + src/icons/svgo.yml | 22 + src/layout/components/AppMain.vue | 120 + src/layout/components/BiHeader.vue | 233 + src/layout/components/Navbar.vue | 95 + src/layout/components/Sidebar.vue | 1029 ++ src/layout/components/TagsView/ScrollPane.vue | 93 + src/layout/components/TagsView/index.vue | 370 + src/layout/components/index.js | 4 + src/layout/datacollect/Sidebar.vue | 113 + src/layout/datacollect/index.js | 2 + src/layout/datacollect/index.vue | 75 + src/layout/dataservice/Sidebar.vue | 116 + src/layout/dataservice/index.js | 2 + src/layout/dataservice/index.vue | 75 + src/layout/index.vue | 121 + src/layout/system/Sidebar.vue | 121 + src/layout/system/index.js | 2 + src/layout/system/index.vue | 75 + src/main.js | 62 + src/permission.js | 150 + src/public-path.js | 3 + src/router/index.js | 370 + src/settings.js | 5 + src/store/getters.js | 9 + src/store/index.js | 25 + src/store/modules/app.js | 41 + src/store/modules/bi.js | 325 + src/store/modules/demo.js | 22 + src/store/modules/global.js | 18 + src/store/modules/lowcode.js | 13 + src/store/modules/permission.js | 425 + src/store/modules/settings.js | 30 + src/store/modules/tagsView.js | 287 + src/style.css | 4 + src/styles/form.scss | 321 + src/styles/index.scss | 137 + src/styles/mixin.scss | 33 + src/styles/sidebar.scss | 186 + src/styles/variables.scss | 36 + src/utils/aesCrypto.js | 25 + src/utils/clickOutside.js | 77 + src/utils/db.js | 54 + src/utils/dom.js | 231 + src/utils/env_init.js | 36 + src/utils/get-page-title.js | 10 + src/utils/icon.json | 280 + src/utils/index.js | 166 + src/utils/loadBeautifier.js | 28 + src/utils/loadMonaco.js | 40 + src/utils/loadScript.js | 63 + src/utils/message.js | 33 + src/utils/parseUrl.js | 59 + src/utils/pluginsConfig.js | 13 + src/utils/request.js | 112 + src/views/404.vue | 224 + .../componentsSchema/LinkAbcComp.js | 37 + .../componentsSchema/LinkCategoryPicker.js | 57 + .../componentsSchema/LinkCommonSelect.bak.js | 353 + .../componentsSchema/LinkCommonSelect.js | 135 + .../componentsSchema/LinkComplexTimePicker.js | 87 + .../componentsSchema/LinkCustomerPicker.js | 37 + .../componentsSchema/LinkDatePicker.js | 163 + .../componentsSchema/LinkEmpty.js | 15 + .../componentsSchema/LinkGoodsAttrPicker.js | 89 + .../componentsSchema/LinkMoreTab.js | 164 + .../componentsSchema/LinkMoveSection.js | 37 + .../componentsSchema/LinkNumberSection.js | 37 + .../componentsSchema/LinkSelectBrandSimple.js | 57 + .../LinkSelectGoodsBarcode.js | 37 + .../componentsSchema/LinkSelectPersonnel.js | 52 + .../componentsSchema/LinkSelectSupplier.js | 44 + .../LinkSelectTreeDepartment.js | 212 + .../componentsSchema/LinkSelectUser.js | 80 + .../componentsSchema/LinkSummarySelect.js | 135 + .../componentsSchema/LinkToolExportGroup.js | 358 + .../componentsSchema/el-checkbox.js | 50 + .../componentsSchema/el-datePicker.js | 63 + .../componentsSchema/el-input-number.js | 71 + .../attributeBox/componentsSchema/el-input.js | 71 + .../attributeBox/componentsSchema/el-radio.js | 50 + .../attributeBox/componentsSchema/index.js | 8 + src/views/attributeBox/generator.vue | 1099 ++ src/views/attributeBox/render.vue | 82 + .../bi/components/backgroundColorSelect.vue | 58 + src/views/bi/components/dropDownComponent.vue | 517 + src/views/bi/components/fontColorSelect.vue | 59 + src/views/bi/components/iconSelect.vue | 215 + src/views/bi/components/rightComponent.vue | 2408 +++ src/views/bi/customReport.vue | 1409 ++ src/views/bi/dashboard.vue | 527 + src/views/bi/dynamicTab.vue | 95 + src/views/bi/index.vue | 58 + src/views/bi/tableEditor.vue | 1549 ++ src/views/cmsTemplate/editJson.vue | 614 + src/views/cmsTemplate/index.vue | 574 + src/views/cmsTemplate/viewOfDrag.vue | 98 + src/views/dashboard/index.vue | 105 + src/views/datacollect/collect/collectMain.vue | 1468 ++ .../datacollect/collect/collectMain_new.vue | 1241 ++ .../datacollect/datasource/datasourceMain.vue | 832 + src/views/datapre/dataset/addApiDatapre.vue | 995 ++ src/views/datapre/dataset/addDatapre.vue | 759 + src/views/datapre/dataset/datapreMain.vue | 1318 ++ src/views/datapre/dataset/index.vue | 73 + src/views/datapre/dataset/siderbar.vue | 464 + .../datapre/datasource/datasourceMain.vue | 883 ++ src/views/datapre/datasource/index.vue | 28 + src/views/datapre/enum/enumMain.vue | 1196 ++ src/views/datapre/meta/metaMain.vue | 2214 +++ src/views/datapre/quota/quotaMain.vue | 1149 ++ src/views/datapre/tag/tagMain.vue | 1456 ++ .../dataservice/list/dataserviceList.vue | 848 ++ .../monitor/dataserviceMonitor.vue | 1056 ++ src/views/formGenerator/DraggableItem.vue | 176 + src/views/formGenerator/IconsDialog.vue | 116 + src/views/formGenerator/ResourceDialog.vue | 85 + src/views/formGenerator/index.vue | 1118 ++ .../formGenerator/tmlTable/api/common.js | 122 + .../formGenerator/tmlTable/api/request-new.js | 6 + src/views/formGenerator/tmlTable/table.vue | 559 + src/views/formGenerator/tmlTable/utils.js | 511 + src/views/formGenerator/utils.js | 154 + src/views/iframe/index.vue | 23 + src/views/interactive/dataShowTab.vue | 157 + src/views/interactive/dataTable.vue | 51 + src/views/interactive/databasePicker.vue | 239 + src/views/interactive/index.vue | 63 + src/views/interactive/sqlShowContainer.vue | 473 + src/views/preview/config.js | 311 + src/views/preview/dashboard.vue | 104 + src/views/preview/index.vue | 449 + src/views/preview/main.vue | 171 + src/views/redirect/index.vue | 12 + src/views/system/authority/authorityList.vue | 842 ++ src/views/system/dataset/datasetList.vue | 1905 +++ src/views/system/monitor/monitor.vue | 1040 ++ src/views/system/report/reportList.vue | 1385 ++ src/views/system/role/roleList.vue | 1295 ++ src/views/system/user/userList.vue | 483 + tests/unit/.eslintrc.js | 5 + vue.config.js | 132 + yarn.lock | 12496 ++++++++++++++++ 330 files changed, 71506 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .travis.yml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 babel.config.js create mode 100644 build-hzw.sh create mode 100644 build.sh create mode 100644 build/index.js create mode 100644 jest.config.js create mode 100644 jsconfig.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/css/lowcode-mobile.css create mode 100644 public/css/lowcode.css create mode 100644 public/index.html create mode 100644 public/js/drtest-url-map.json create mode 100644 public/js/url-map.json create mode 100644 src/App.vue create mode 100644 src/api/bi.js create mode 100644 src/api/cms.js create mode 100644 src/api/demo.js create mode 100644 src/api/lowcode.js create mode 100644 src/assets/404_images/404.png create mode 100644 src/assets/404_images/404_cloud.png create mode 100644 src/assets/datapre/icon01@3x.png create mode 100644 src/assets/datapre/icon02@3x.png create mode 100644 src/assets/datapre/icon03@3x.png create mode 100644 src/assets/datapre/icon04@3x.png create mode 100644 src/assets/datapre/icon05@3x.png create mode 100644 src/assets/datapre/icon06@3x.png create mode 100644 src/assets/exit-full-screen.png create mode 100644 src/assets/iphone_frame@3x.png create mode 100644 src/assets/svgData/fill-drip-solid.svg create mode 100644 src/assets/svgData/font-solid.svg create mode 100644 src/assets/svgData/icon-bars-solid.svg create mode 100644 src/assets/svgData/icon-d-solid.svg create mode 100644 src/assets/svgData/icon-database-solid.svg create mode 100644 src/assets/svgData/icon-down-filled.svg create mode 100644 src/assets/svgData/icon-down-solid.svg create mode 100644 src/assets/svgData/icon-download-solid.svg create mode 100644 src/assets/svgData/icon-floppy-disk-solid.svg create mode 100644 src/assets/svgData/icon-green.png create mode 100644 src/assets/svgData/icon-green.svg create mode 100644 src/assets/svgData/icon-n-solid.svg create mode 100644 src/assets/svgData/icon-orange.svg create mode 100644 src/assets/svgData/icon-org.png create mode 100644 src/assets/svgData/icon-play-skip-forward.svg create mode 100644 src/assets/svgData/icon-play-solid.svg create mode 100644 src/assets/svgData/icon-red.png create mode 100644 src/assets/svgData/icon-right-filled.svg create mode 100644 src/assets/svgData/icon-right-solid.svg create mode 100644 src/assets/svgData/icon-s-solid.svg create mode 100644 src/assets/svgData/icon-satisfied.svg create mode 100644 src/assets/svgData/icon-solid.svg create mode 100644 src/assets/svgData/icon-t-solid.svg create mode 100644 src/assets/svgData/icon-table-cells-solid.svg create mode 100644 src/assets/svgData/icon-top-filled.svg create mode 100644 src/assets/svgData/icon-top-solid.svg create mode 100644 src/assets/svgData/icon-un-satisfied.svg create mode 100644 src/assets/svgData/icon_act_collect_data_inter.svg create mode 100644 src/assets/svgData/icon_act_collect_datasource.svg create mode 100644 src/assets/svgData/icon_act_datasource.svg create mode 100644 src/assets/svgData/icon_act_meta.svg create mode 100644 src/assets/svgData/icon_act_quota.svg create mode 100644 src/assets/svgData/icon_act_service_list.svg create mode 100644 src/assets/svgData/icon_act_service_monitor.svg create mode 100644 src/assets/svgData/icon_act_set.svg create mode 100644 src/assets/svgData/icon_act_system_authority.svg create mode 100644 src/assets/svgData/icon_act_system_dataset.svg create mode 100644 src/assets/svgData/icon_act_system_monitor.svg create mode 100644 src/assets/svgData/icon_act_system_report.svg create mode 100644 src/assets/svgData/icon_act_system_role.svg create mode 100644 src/assets/svgData/icon_act_system_user.svg create mode 100644 src/assets/svgData/icon_act_tag.svg create mode 100644 src/assets/svgData/icon_cell_close.svg create mode 100644 src/assets/svgData/icon_cell_open.svg create mode 100644 src/assets/svgData/icon_collect_data_inter.svg create mode 100644 src/assets/svgData/icon_collect_datasource.svg create mode 100644 src/assets/svgData/icon_data_datasource.svg create mode 100644 src/assets/svgData/icon_data_meta.svg create mode 100644 src/assets/svgData/icon_data_quota.svg create mode 100644 src/assets/svgData/icon_data_set.svg create mode 100644 src/assets/svgData/icon_data_tag.svg create mode 100644 src/assets/svgData/icon_file_close.svg create mode 100644 src/assets/svgData/icon_file_open.svg create mode 100644 src/assets/svgData/icon_info.svg create mode 100644 src/assets/svgData/icon_no_datasource.svg create mode 100644 src/assets/svgData/icon_service_list.svg create mode 100644 src/assets/svgData/icon_service_monitor.svg create mode 100644 src/assets/svgData/icon_system_authority.svg create mode 100644 src/assets/svgData/icon_system_dataset.svg create mode 100644 src/assets/svgData/icon_system_monitor.svg create mode 100644 src/assets/svgData/icon_system_report.svg create mode 100644 src/assets/svgData/icon_system_role.svg create mode 100644 src/assets/svgData/icon_system_user.svg create mode 100644 src/assets/svgData/icon_title_logo.svg create mode 100644 src/assets/svgData/icon_tra_close.svg create mode 100644 src/components/SvgIcon copy/index.vue create mode 100644 src/components/SvgIcon/index.vue create mode 100644 src/components/dialog/index.js create mode 100644 src/components/dialog/src/main.vue create mode 100644 src/components/folder/index.vue create mode 100644 src/components/generator/config.bak.js create mode 100644 src/components/generator/config.js create mode 100644 src/components/generator/css.js create mode 100644 src/components/generator/drawingDefalut.js create mode 100644 src/components/generator/html.js create mode 100644 src/components/generator/js.js create mode 100644 src/components/generator/ruleTrigger.js create mode 100644 src/components/parser/Parser.vue create mode 100644 src/components/parser/README.md create mode 100644 src/components/parser/example/Index.vue create mode 100644 src/components/parser/index.js create mode 100644 src/components/preview/api/common.js create mode 100644 src/components/preview/api/table.js create mode 100644 src/components/preview/components/addOrEditDialog.vue create mode 100644 src/components/preview/components/cascader.vue create mode 100644 src/components/preview/main.vue create mode 100644 src/components/preview/table.vue create mode 100644 src/components/preview/utils.js create mode 100644 src/components/preview/validate.js create mode 100644 src/components/render/render.js create mode 100644 src/components/render/slots/el-button.js create mode 100644 src/components/render/slots/el-checkbox-group.js create mode 100644 src/components/render/slots/el-input.js create mode 100644 src/components/render/slots/el-radio-group.js create mode 100644 src/components/render/slots/el-select.js create mode 100644 src/components/render/slots/el-upload.js create mode 100644 src/components/targetInfo/index.js create mode 100644 src/components/targetInfo/src/api/index.js create mode 100644 src/components/targetInfo/src/main.vue create mode 100644 src/components/tinymce/README.md create mode 100644 src/components/tinymce/config.js create mode 100644 src/components/tinymce/example/Index.vue create mode 100644 src/components/tinymce/index.js create mode 100644 src/components/tinymce/index.vue create mode 100644 src/components/tinymce/zh_CN.js create mode 100644 src/components/toolExport/index.js create mode 100644 src/components/toolExport/src/api/batchImport.js create mode 100644 src/components/toolExport/src/components/card/index.vue create mode 100644 src/components/toolExport/src/main.vue create mode 100644 src/components/toolExport/src/styles/index.scss create mode 100644 src/components/toolOptions/api/index.js create mode 100644 src/components/toolOptions/main.vue create mode 100644 src/components/toolOptions/styles/index.scss create mode 100644 src/datapreLayout/components/Sidebar.vue create mode 100644 src/datapreLayout/components/index.js create mode 100644 src/datapreLayout/index.vue create mode 100644 src/icons/index.js create mode 100644 src/icons/svg/button.svg create mode 100644 src/icons/svg/cascader.svg create mode 100644 src/icons/svg/checkbox.svg create mode 100644 src/icons/svg/color.svg create mode 100644 src/icons/svg/component.svg create mode 100644 src/icons/svg/dashboard.svg create mode 100644 src/icons/svg/date-range.svg create mode 100644 src/icons/svg/date.svg create mode 100644 src/icons/svg/example.svg create mode 100644 src/icons/svg/eye-open.svg create mode 100644 src/icons/svg/eye.svg create mode 100644 src/icons/svg/form.svg create mode 100644 src/icons/svg/input.svg create mode 100644 src/icons/svg/link.svg create mode 100644 src/icons/svg/nested.svg create mode 100644 src/icons/svg/number.svg create mode 100644 src/icons/svg/password copy.svg create mode 100644 src/icons/svg/password.svg create mode 100644 src/icons/svg/radio.svg create mode 100644 src/icons/svg/rate.svg create mode 100644 src/icons/svg/rich-text.svg create mode 100644 src/icons/svg/row.svg create mode 100644 src/icons/svg/select.svg create mode 100644 src/icons/svg/slider.svg create mode 100644 src/icons/svg/switch.svg create mode 100644 src/icons/svg/table copy.svg create mode 100644 src/icons/svg/table.svg create mode 100644 src/icons/svg/textarea.svg create mode 100644 src/icons/svg/time-range.svg create mode 100644 src/icons/svg/time.svg create mode 100644 src/icons/svg/tree.svg create mode 100644 src/icons/svg/upload.svg create mode 100644 src/icons/svg/user.svg create mode 100644 src/icons/svgo.yml create mode 100644 src/layout/components/AppMain.vue create mode 100644 src/layout/components/BiHeader.vue create mode 100644 src/layout/components/Navbar.vue create mode 100644 src/layout/components/Sidebar.vue create mode 100644 src/layout/components/TagsView/ScrollPane.vue create mode 100644 src/layout/components/TagsView/index.vue create mode 100644 src/layout/components/index.js create mode 100644 src/layout/datacollect/Sidebar.vue create mode 100644 src/layout/datacollect/index.js create mode 100644 src/layout/datacollect/index.vue create mode 100644 src/layout/dataservice/Sidebar.vue create mode 100644 src/layout/dataservice/index.js create mode 100644 src/layout/dataservice/index.vue create mode 100644 src/layout/index.vue create mode 100644 src/layout/system/Sidebar.vue create mode 100644 src/layout/system/index.js create mode 100644 src/layout/system/index.vue create mode 100644 src/main.js create mode 100644 src/permission.js create mode 100644 src/public-path.js create mode 100644 src/router/index.js create mode 100644 src/settings.js create mode 100644 src/store/getters.js create mode 100644 src/store/index.js create mode 100644 src/store/modules/app.js create mode 100644 src/store/modules/bi.js create mode 100644 src/store/modules/demo.js create mode 100644 src/store/modules/global.js create mode 100644 src/store/modules/lowcode.js create mode 100644 src/store/modules/permission.js create mode 100644 src/store/modules/settings.js create mode 100644 src/store/modules/tagsView.js create mode 100644 src/style.css create mode 100644 src/styles/form.scss create mode 100644 src/styles/index.scss create mode 100644 src/styles/mixin.scss create mode 100644 src/styles/sidebar.scss create mode 100644 src/styles/variables.scss create mode 100644 src/utils/aesCrypto.js create mode 100644 src/utils/clickOutside.js create mode 100644 src/utils/db.js create mode 100644 src/utils/dom.js create mode 100644 src/utils/env_init.js create mode 100644 src/utils/get-page-title.js create mode 100644 src/utils/icon.json create mode 100644 src/utils/index.js create mode 100644 src/utils/loadBeautifier.js create mode 100644 src/utils/loadMonaco.js create mode 100644 src/utils/loadScript.js create mode 100644 src/utils/message.js create mode 100644 src/utils/parseUrl.js create mode 100644 src/utils/pluginsConfig.js create mode 100644 src/utils/request.js create mode 100644 src/views/404.vue create mode 100644 src/views/attributeBox/componentsSchema/LinkAbcComp.js create mode 100644 src/views/attributeBox/componentsSchema/LinkCategoryPicker.js create mode 100644 src/views/attributeBox/componentsSchema/LinkCommonSelect.bak.js create mode 100644 src/views/attributeBox/componentsSchema/LinkCommonSelect.js create mode 100644 src/views/attributeBox/componentsSchema/LinkComplexTimePicker.js create mode 100644 src/views/attributeBox/componentsSchema/LinkCustomerPicker.js create mode 100644 src/views/attributeBox/componentsSchema/LinkDatePicker.js create mode 100644 src/views/attributeBox/componentsSchema/LinkEmpty.js create mode 100644 src/views/attributeBox/componentsSchema/LinkGoodsAttrPicker.js create mode 100644 src/views/attributeBox/componentsSchema/LinkMoreTab.js create mode 100644 src/views/attributeBox/componentsSchema/LinkMoveSection.js create mode 100644 src/views/attributeBox/componentsSchema/LinkNumberSection.js create mode 100644 src/views/attributeBox/componentsSchema/LinkSelectBrandSimple.js create mode 100644 src/views/attributeBox/componentsSchema/LinkSelectGoodsBarcode.js create mode 100644 src/views/attributeBox/componentsSchema/LinkSelectPersonnel.js create mode 100644 src/views/attributeBox/componentsSchema/LinkSelectSupplier.js create mode 100644 src/views/attributeBox/componentsSchema/LinkSelectTreeDepartment.js create mode 100644 src/views/attributeBox/componentsSchema/LinkSelectUser.js create mode 100644 src/views/attributeBox/componentsSchema/LinkSummarySelect.js create mode 100644 src/views/attributeBox/componentsSchema/LinkToolExportGroup.js create mode 100644 src/views/attributeBox/componentsSchema/el-checkbox.js create mode 100644 src/views/attributeBox/componentsSchema/el-datePicker.js create mode 100644 src/views/attributeBox/componentsSchema/el-input-number.js create mode 100644 src/views/attributeBox/componentsSchema/el-input.js create mode 100644 src/views/attributeBox/componentsSchema/el-radio.js create mode 100644 src/views/attributeBox/componentsSchema/index.js create mode 100644 src/views/attributeBox/generator.vue create mode 100644 src/views/attributeBox/render.vue create mode 100644 src/views/bi/components/backgroundColorSelect.vue create mode 100644 src/views/bi/components/dropDownComponent.vue create mode 100644 src/views/bi/components/fontColorSelect.vue create mode 100644 src/views/bi/components/iconSelect.vue create mode 100644 src/views/bi/components/rightComponent.vue create mode 100644 src/views/bi/customReport.vue create mode 100644 src/views/bi/dashboard.vue create mode 100644 src/views/bi/dynamicTab.vue create mode 100644 src/views/bi/index.vue create mode 100644 src/views/bi/tableEditor.vue create mode 100644 src/views/cmsTemplate/editJson.vue create mode 100644 src/views/cmsTemplate/index.vue create mode 100644 src/views/cmsTemplate/viewOfDrag.vue create mode 100644 src/views/dashboard/index.vue create mode 100644 src/views/datacollect/collect/collectMain.vue create mode 100644 src/views/datacollect/collect/collectMain_new.vue create mode 100644 src/views/datacollect/datasource/datasourceMain.vue create mode 100644 src/views/datapre/dataset/addApiDatapre.vue create mode 100644 src/views/datapre/dataset/addDatapre.vue create mode 100644 src/views/datapre/dataset/datapreMain.vue create mode 100644 src/views/datapre/dataset/index.vue create mode 100644 src/views/datapre/dataset/siderbar.vue create mode 100644 src/views/datapre/datasource/datasourceMain.vue create mode 100644 src/views/datapre/datasource/index.vue create mode 100644 src/views/datapre/enum/enumMain.vue create mode 100644 src/views/datapre/meta/metaMain.vue create mode 100644 src/views/datapre/quota/quotaMain.vue create mode 100644 src/views/datapre/tag/tagMain.vue create mode 100644 src/views/dataservice/list/dataserviceList.vue create mode 100644 src/views/dataservice/monitor/dataserviceMonitor.vue create mode 100644 src/views/formGenerator/DraggableItem.vue create mode 100644 src/views/formGenerator/IconsDialog.vue create mode 100644 src/views/formGenerator/ResourceDialog.vue create mode 100644 src/views/formGenerator/index.vue create mode 100644 src/views/formGenerator/tmlTable/api/common.js create mode 100644 src/views/formGenerator/tmlTable/api/request-new.js create mode 100644 src/views/formGenerator/tmlTable/table.vue create mode 100644 src/views/formGenerator/tmlTable/utils.js create mode 100644 src/views/formGenerator/utils.js create mode 100644 src/views/iframe/index.vue create mode 100644 src/views/interactive/dataShowTab.vue create mode 100644 src/views/interactive/dataTable.vue create mode 100644 src/views/interactive/databasePicker.vue create mode 100644 src/views/interactive/index.vue create mode 100644 src/views/interactive/sqlShowContainer.vue create mode 100644 src/views/preview/config.js create mode 100644 src/views/preview/dashboard.vue create mode 100644 src/views/preview/index.vue create mode 100644 src/views/preview/main.vue create mode 100644 src/views/redirect/index.vue create mode 100644 src/views/system/authority/authorityList.vue create mode 100644 src/views/system/dataset/datasetList.vue create mode 100644 src/views/system/monitor/monitor.vue create mode 100644 src/views/system/report/reportList.vue create mode 100644 src/views/system/role/roleList.vue create mode 100644 src/views/system/user/userList.vue create mode 100644 tests/unit/.eslintrc.js create mode 100644 vue.config.js create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..fd3eae8 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.js] +indent_size = 2 + +[*.vue] +indent_size = 2 + +[*.css] +indent_size = 2 + +[Makefile] +indent_style = tab diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..a827138 --- /dev/null +++ b/.env.development @@ -0,0 +1,23 @@ +# just a flag +ENV='development' +port=3003 +# vue enviroment + +VUE_APP_ENVIRONMENT='development' +VUE_APP_CMS_INNER_BASE_URL='http://bipaas.elinkservice.cn/linkdata' +VUE_APP_BIPASS_API_SERVER='/linkdata/linkdata-gateway/route' +VUE_APP_CMS_BASE_URL='//store.linkkids.cn' +VUE_APP_OPTION_PAGE_URL='http://test.kiop.linkkids.cn/kiop-web/field/toRuleList.do' +VUE_APP_EXPORT_PAGE_URL='http://test.kiop.linkkids.cn/kiop-web/task/toTaskList.do' +VUE_APP_MINI_APP_URL='https://miniapi.linkkids.cn' +VUE_APP_BI_URL='http://49.234.48.41:3000' +VUE_APP_LAYOUT_URL='https://st.linkkids.cn' +VUE_APP_BI_DOMAIN='//linkdatatest.retailo2o.com' +VUE_APP_ST_DOMAIN='//st.retailo2o.com/p/h5-databi/' +VUE_APP_STORE_URL='//dev.retailo2o.com:3003' +VUE_APP_CSCS_URL='http://test.cscs.retailo2o.com' +VUE_APP_MINI_API_URL='//miniapi.retailo2o.com' +VUE_APP_LOWCODE_URL='//ams.retailo2o.com/api' +VUE_APP_LOWCODE_DESIGN='//ams.retailo2o.com/page-designer' +VUE_APP_LOWCODE_VIEWER='//ams.retailo2o.com/page-viewer' + \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..d1f78ba --- /dev/null +++ b/.env.production @@ -0,0 +1,24 @@ +# just a flag +ENV='production' +port=3003 +# vue enviroment + + +VUE_APP_ENVIRONMENT='development' +VUE_APP_CMS_INNER_BASE_URL='http://bipaas.elinkservice.cn/linkdata' +VUE_APP_CMS_BASE_URL='//store.linkkids.cn' +VUE_APP_BIPASS_API_SERVER = 'https://epmet-preview.elinkservice.cn/linkdata/linkdata-gateway/route' +VUE_APP_OPTION_PAGE_URL='http://test.kiop.linkkids.cn/kiop-web/field/toRuleList.do' +VUE_APP_EXPORT_PAGE_URL='http://test.kiop.linkkids.cn/kiop-web/task/toTaskList.do' +VUE_APP_MINI_APP_URL='https://miniapi.linkkids.cn' +VUE_APP_BI_URL='http://49.234.48.41:3000' +VUE_APP_LAYOUT_URL='https://st.linkkids.cn' +VUE_APP_BI_DOMAIN='//linkdatatest.retailo2o.com' +VUE_APP_ST_DOMAIN='//st.retailo2o.com/p/h5-databi/' +VUE_APP_STORE_URL='//dev.retailo2o.com:3003' +VUE_APP_CSCS_URL='http://test.cscs.retailo2o.com' +VUE_APP_MINI_API_URL='//miniapi.retailo2o.com' +VUE_APP_LOWCODE_URL='//ams.retailo2o.com/api' +VUE_APP_LOWCODE_DESIGN='//ams.retailo2o.com/page-designer' +VUE_APP_LOWCODE_VIEWER='//ams.retailo2o.com/page-viewer' + \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e6529fc --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +build/*.js +src/assets +public +dist diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..f7e9e91 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + root: true, + extends: [], + + // add your custom rules here + // it is base on https://github.com/vuejs/eslint-config-vue + rules: {}, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..be2851a --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +.DS_Store +node_modules/ +dist +dist* +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json +tests/**/coverage/ +.env.*.local +# Editor directories and files +.idea +.history +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..4746105 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +sass_binary_site=https://npm.taobao.org/mirrors/node-sass/ +registry=http://npmneibu.linkkids.cn/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..f4be7a0 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: 10 +script: npm run test +notifications: + email: false diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6151575 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-present PanJiaChen + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..674af97 --- /dev/null +++ b/README.md @@ -0,0 +1,51 @@ +# vue-admin-template + +## 功能点 +- 集成了友盟的上报js +- 请求axios集成了上报功能 + +## 构建 + +```bash +# 克隆项目 +git clone http://code.linkkids.cn/fe_web_public/vue-admin-template.git + +# 进入项目目录 +cd vue-admin-template + +# 安装依赖 +npm install + +npm install --registry=http://npmneibu.linkkids.cn + +# 启动服务 +npm run dev +``` + +浏览器访问 [http://localhost:9528](http://localhost:9528) + +## 发布 + +```bash +# 构建测试环境 +npm run build:stage + +# 构建生产环境 +npm run build:prod +``` + +## 其它 + +```bash +# 预览发布环境效果 +npm run preview + +# 预览发布环境效果 + 静态资源分析 +npm run preview -- --report + +# 代码格式检查 +npm run lint + +# 代码格式检查并自动修复 +npm run lint -- --fix +``` diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..5dc5c4a --- /dev/null +++ b/babel.config.js @@ -0,0 +1,24 @@ +const prodPlugins = [] +if (process.env.VUE_APP_CONSOLE_CLOSE === 'true') { + prodPlugins.push('transform-remove-console') +} +module.exports = { + presets: [ + [ + // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app + '@vue/cli-plugin-babel/preset', + { + useBuiltIns: 'usage', + corejs: '3.5', + }, + ], + ], + env: { + development: { + // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). + // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. + // https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html + plugins: ['dynamic-import-node', ...prodPlugins], + }, + }, +} diff --git a/build-hzw.sh b/build-hzw.sh new file mode 100644 index 0000000..baeeec6 --- /dev/null +++ b/build-hzw.sh @@ -0,0 +1,14 @@ +#!/bin/bash +NODE_HOME=/opt/nodejs/v11.6.1 +export PATH=$NODE_HOME/bin:$PATH +export NODE_PATH=$NODE_HOME/lib/node_modules +node -v +npm -v +ls -al +npm set registry http://npmneibu.linkkids.cn +npm install +if [ "$SER_ENV" == "IDC" ]; then + npm run build:hzw +else + npm run build:hzw-stage +fi diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..f1d13b3 --- /dev/null +++ b/build.sh @@ -0,0 +1,14 @@ +#!/bin/bash +NODE_HOME=/opt/nodejs/v12.22.12 +export PATH=$NODE_HOME/bin:$PATH +export NODE_PATH=$NODE_HOME/lib/node_modules +node -v +npm -v +ls -al +npm set registry http://npmneibu.linkkids.cn +npm install +if [ "$ENV" == "prod" ]; then + npm run build:prod +else + npm run build:stage +fi diff --git a/build/index.js b/build/index.js new file mode 100644 index 0000000..0c57de2 --- /dev/null +++ b/build/index.js @@ -0,0 +1,35 @@ +const { run } = require('runjs') +const chalk = require('chalk') +const config = require('../vue.config.js') +const rawArgv = process.argv.slice(2) +const args = rawArgv.join(' ') + +if (process.env.npm_config_preview || rawArgv.includes('--preview')) { + const report = rawArgv.includes('--report') + + run(`vue-cli-service build ${args}`) + + const port = 9526 + const publicPath = config.publicPath + + var connect = require('connect') + var serveStatic = require('serve-static') + const app = connect() + + app.use( + publicPath, + serveStatic('./dist', { + index: ['index.html', '/'] + }) + ) + + app.listen(port, function () { + console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) + if (report) { + console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`)) + } + + }) +} else { + run(`vue-cli-service build ${args}`) +} diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..4fa328a --- /dev/null +++ b/jest.config.js @@ -0,0 +1,23 @@ +module.exports = { + moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], + transform: { + '^.+\\.vue$': 'vue-jest', + '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', + '^.+\\.jsx?$': 'babel-jest', + }, + moduleNameMapper: { + '^@/(.*)$': '/src/$1', + }, + snapshotSerializers: ['jest-serializer-vue'], + testMatch: ['**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'], + collectCoverageFrom: [ + 'src/utils/**/*.{js,vue}', + '!src/utils/auth.js', + '!src/utils/request.js', + 'src/components/**/*.{js,vue}', + ], + coverageDirectory: '/tests/unit/coverage', + // 'collectCoverage': true, + coverageReporters: ['lcov', 'text-summary'], + testURL: 'http://localhost/', +} diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..ed079e2 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..34efa44 --- /dev/null +++ b/package.json @@ -0,0 +1,102 @@ +{ + "name": "data-bi", + "version": "1.0.0", + "description": "A project named template-manage", + "scripts": { + "dev": "vue-cli-service serve", + "build": "vue-cli-service build", + "build:prod": "vue-cli-service build", + "build:test": "vue-cli-service build --mode development", + "build:stage": "vue-cli-service build --mode staging", + "build:drtest": "vue-cli-service build --mode drtest", + "build:drprod": "vue-cli-service build --mode drprod", + "build:hzw": "vue-cli-service build --mode hzw", + "build:tm": "vue-cli-service build --mode tm", + "build:bx": "vue-cli-service build --mode bx", + "build:yl": "vue-cli-service build --mode yl", + "preview": "node build/index.js --preview", + "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml", + "lint": "vue-cli-service lint", + "test:unit": "jest --clearCache && vue-cli-service test:unit", + "test:ci": "npm run lint && npm run test:unit", + "deploy:linkkids": "scp dist/index.html linkkids@10.250.14.5:/data/web/pc/linkbi && scp -r dist/* linkkids@10.250.14.5:/data/static/pc/linkbi/", + "deploy:elinkservice": "scp dist/index.html bizcent@10.254.0.144:/data/web/pc/linkbi && scp -r dist/* bizcent@10.254.0.144:/data/static/pc/linkbi/", + "deploylc:elinkservice": "scp dist/index.html bizcent@10.254.0.144:/data/web/pc/linkbi && scp -r dist/* bizcent@10.254.0.144:/data/static/pc/linkbi", + "deploy:bx": "scp -r dist/* root@10.0.2.13:/data/web/linkbi", + "deploy": "npm run deploy:linkkids && npm run deploy:elinkservice" + }, + "dependencies": { + "@sweetjs/link-style": "1.0.0-beta.3", + "@sweetjs/post-message-tool": "^1.0.4", + "@sweetjs/request": "2.0.9", + "@formily/core": "2.0.11", + "@formily/element": "2.0.11", + "@formily/vue": "2.0.11", + "@riophae/vue-treeselect": "^0.4.0", + "@vue/composition-api": "^1.4.6", + "axios": "^0.19.0", + "babel-plugin-transform-remove-console": "^6.9.4", + "clipboard": "^2.0.10", + "codemirror": "^5.63.3", + "core-js": "^3.37.1", + "crypto-js": "^4.1.1", + "dai-js": "^0.0.12", + "dayjs": "^1.11.3", + "echarts": "^5.4.1", + "element-theme-chalk": "^2.14.1", + "element-ui": "2.15.6", + "file-saver": "^2.0.5", + "js-cookie": "2.2.0", + "lodash-es": "^4.17.21", + "nanoid": "^4.0.0", + "normalize.css": "7.0.0", + "nprogress": "0.2.0", + "path-to-regexp": "2.4.0", + "relation-graph": "^2.0.24", + "uuid": "^8.3.2", + "v-jsoneditor": "^1.4.4", + "vue": "2.6.13", + "vue-router": "^3.5.3", + "vuedraggable": "^2.24.3", + "vuex": "3.1.0", + "vxe-table": "^2.10.22", + "xe-utils": "3.1.11" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "4.4.4", + "@vue/cli-plugin-eslint": "4.4.4", + "@vue/cli-plugin-unit-jest": "4.4.4", + "@vue/cli-service": "4.4.4", + "@vue/test-utils": "1.0.0-beta.29", + "autoprefixer": "9.5.1", + "babel-eslint": "10.1.0", + "babel-jest": "23.6.0", + "babel-plugin-dynamic-import-node": "2.3.3", + "chalk": "2.4.2", + "connect": "3.6.6", + "eslint": "^7.22.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-vue": "^7.7.0", + "html-webpack-plugin": "3.2.0", + "mockjs": "1.0.1-beta3", + "prettier": "^2.2.1", + "runjs": "4.3.2", + "sass": "^1.52.1", + "sass-loader": "8.0.2", + "script-ext-html-webpack-plugin": "2.1.3", + "serve-static": "1.13.2", + "svg-sprite-loader": "4.1.3", + "svgo": "1.2.2", + "vue-template-compiler": "2.6.13" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ], + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "license": "MIT" +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2404286 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,8 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + plugins: { + // to edit target browsers: use "browserslist" field in package.json + autoprefixer: {}, + }, +} diff --git a/public/css/lowcode-mobile.css b/public/css/lowcode-mobile.css new file mode 100644 index 0000000..ae187cf --- /dev/null +++ b/public/css/lowcode-mobile.css @@ -0,0 +1,45 @@ +body, +html { + height: 100%; + margin: 0; + padding: 0; +} +body { + background: #f0f4f7; +} +.page-root { + height: 100%; + display: flex; + flex-direction: column; +} +.page-root > [class^="page-node-"] { + margin: 5px 10px; +} + +.page-node-form-filter, +.page-node-table { + background: #fff; + border-radius: 4px; + padding: 3px 6px; + margin: 6px; + box-shadow: 0 0 6px 0 #dfdfdf; +} +.page-node-table { + flex: 1; + overflow: hidden; +} +:root { + --el-color-primary: #3862fe; + --el-color-danger: #f56c6c; + --el-color-danger-light-3: #ff3a00; + --el-color-success: #36850f; + --el-text-color-primary: #121212; + --el-text-color-regular: #121212; + --el-font-size-base: 12px; + --grid-item-content-border-radius:18px; +} +.el-button--primary.is-link, +.el-button--primary.is-plain, +.el-button--primary.is-text { + --el-button-text-color: #274ffb; +} diff --git a/public/css/lowcode.css b/public/css/lowcode.css new file mode 100644 index 0000000..42959dd --- /dev/null +++ b/public/css/lowcode.css @@ -0,0 +1,21 @@ +body,html{height:100%; margin:0;padding:0} +body{background:#f0f2f5} +.page-root{height:100%;display:flex;flex-direction:column} +.page-node-form-filter,.page-node-table{background:#fff;border-radius:4px;padding:3px 6px;margin:6px;box-shadow:0 0 6px 0 #dfdfdf} +.page-node-table{flex:1;overflow:hidden} +:root{ + --el-color-primary:#3862FE; + --el-color-danger:#F56C6C; + --el-color-danger-light-3:#FF3A00; + --el-color-success:#36850F; + --el-text-color-primary:#121212; + --el-text-color-regular:#121212; + --el-font-size-base:12px; +} +.el-button--primary.is-link, .el-button--primary.is-plain, .el-button--primary.is-text{ + --el-button-text-color:#274FFB; +} +.el-button.el-button--small { + font-size: 12px; + padding: 5px 11px; +} diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..81c22bb --- /dev/null +++ b/public/index.html @@ -0,0 +1,17 @@ + + + + + + + + <%= webpackConfig.name %> + + + +
+ + + diff --git a/public/js/drtest-url-map.json b/public/js/drtest-url-map.json new file mode 100644 index 0000000..9029529 --- /dev/null +++ b/public/js/drtest-url-map.json @@ -0,0 +1,3 @@ +{ + "cjy-backend.darryring.com/linkdata-gateway":"cjy-testlinkdata.darryring.com/linkdata-gateway" +} diff --git a/public/js/url-map.json b/public/js/url-map.json new file mode 100644 index 0000000..0db3279 --- /dev/null +++ b/public/js/url-map.json @@ -0,0 +1,3 @@ +{ + +} diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..5eec2e0 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/api/bi.js b/src/api/bi.js new file mode 100644 index 0000000..21d527d --- /dev/null +++ b/src/api/bi.js @@ -0,0 +1,3 @@ +// const host = process.env.NODE_ENV === 'production' ? '10.250.14.114' : 'dev.linkkids.cn/_dev_proxy' + +export const COMMON_API = `${process.env.VUE_APP_BI_DOMAIN}/${process.env.VUE_APP_LINKDATA_GATEWAY || 'linkdata-gateway'}/route` diff --git a/src/api/cms.js b/src/api/cms.js new file mode 100644 index 0000000..81def10 --- /dev/null +++ b/src/api/cms.js @@ -0,0 +1,227 @@ +/* + * @Descripttion: + * @version: + * @Author: 张齐 + * @Date: 2021-07-12 19:33:47 + * @LastEditors: 张齐 + * @LastEditTime: 2021-07-28 18:57:42 + */ +import request from '@/utils/request' + +/** + * 新增CMS + * @param {*} elmentObj + * + */ +const addCMS = (elmentObj, site = 100996) => { + const addJson = { + type: 'add', // add/copy/link,默认add + page: { + // 初始化页面信息,type为add时可修改所有,type为copy/link时page字段可不传,如果修改,只能初始化page下name,outputPath,validityEnd + name: elmentObj.name || '新增页面', // 页面名,大于2字符 + description: '描述', + category: elmentObj.category || 'activity', // 分类,channel/activity/config,默认channel + htmlPath: '', // 前端页面地址,原样返回,[siteId][pageId]需前台自行替换 + outputPath: elmentObj.outputPath || '', // 自定义路径,默认为'' 只能是字母、数字、/、-、_,且最后文件名不能为纯数字,开头结尾不能为/ + autoPublish: true, // 是否自动发布,页面内容会随时间变化的选true,默认false + validityStart: 0, // 开始时间,默认0,时间戳或字符串(返回到前台,后台无逻辑处理) + validityEnd: '2099/12/31 00:00:00', // 结束时间,时间戳或字符串,默认一个月后,超过结束时间页面不会自动发布 + isV: false, // 是否可视化页面,默认false + outputType: 'json', // 输出类型 json/jsonp/html,默认json + template: { + // 输出类型为html,且isV为false时手动配置模板,默认可不填 + engine: '', // 目前只支持hbs + source: '', // 模板文件,有值时tmpl不起作用 + tmpl: '', // 模板内容 + layout: '', // 模板layout + }, + dataSchema: elmentObj.dataSchema, // type为add且isV为false时可初始化dataSchema,可不填 + data: elmentObj.data, // type为add且isV为false时可初始化data,可不填 + }, + sourceSiteId: 0, // type为copy/link时许指定源页面siteId + sourcePageId: 0, // type为copy/link时许指定源页面pageId + source: 'cms', + platform: elmentObj.platform, // 如果没有指定租户,则是100100租户 + } + return request.post(`${process.env.VUE_APP_CMS_INNER_BASE_URL}/v4/api/third/pages/${site}`, addJson) +} +/** + * 添加CMS页面 + * @param {*} initData + */ +const addCMSPage = (initData) => { + return addCMS({ + platform: initData.platform || '100100', + dataSchema: initData.dataSchema, + data: initData.data, + name: initData.name, + outputPath: initData.outputPath, + category: 'config', + }) +} +/** + * 导入Data和Dataschame + */ +const importschema = (elmentObj, siteId, pageId, platfrom = '100100') => { + return request.post(`${process.env.VUE_APP_CMS_INNER_BASE_URL}/v4/api/third/pages/${siteId}/importschema`, { + dataSchema: elmentObj.dataSchema, + data: elmentObj.data, + source: 'cms', + platform: platfrom, + pageId, + }) +} +/** + * 更新基础数据 + * @param {*} elmentObj + * @param {*} siteId + * @param {*} pageId + */ +const updateBaseInfo = (elmentObj, siteId, pageId, platform = '100100') => { + elmentObj.autoPublish = true + elmentObj.validityEnd = '2099/12/31 00:00:00' + return request.put(`${process.env.VUE_APP_CMS_INNER_BASE_URL}/v4/api/third/pages/${siteId}/baseinfo`, { + page: elmentObj, + source: 'cms', + platform, + pageId, + }) +} +/** + * 更新CMS + * @param {*} elmentObj + * @param {*} sitId + * @param {*} pageId + */ +const updateCMS = async (elmentObj, sitId, pageId, pageDes, platform = '100100') => { + // 如果有页面描述,此字段作为记录页面冗余字段携带 + if (pageDes) { + elmentObj.data.description.data = [{ value: JSON.stringify(pageDes) }] + } + const { code: inportCode } = await importschema(elmentObj, sitId, pageId, platform) + const { code: baseUpdateCode } = await updateBaseInfo(elmentObj, sitId, pageId, platform) + const importFlag = inportCode === 0 + const baseUpdateFlag = baseUpdateCode === 0 + return importFlag && baseUpdateFlag +} +/** + * 发布页面 + */ +const publishCMS = (siteId, pageId, platform = '100100') => { + return request.post(`${process.env.VUE_APP_CMS_INNER_BASE_URL}/v4/api/third/pages/${siteId}/publish`, { + source: 'cms', + platform, + pageId, + }) +} +/** + * 添加模板页面 + */ +const addCMSPage4Tem = async (name = '', outputPath = '') => { + const dataSchema = [ + { + name: 'config', + description: 'config', + tips: '', + dataType: 'input', + typeName: '文本', + meta: null, + api: null, + uuid: '74089936-252f-42cf-a640-0abff3c527dd', + index: '0', + count: 1, + path: ['config'], + key: 'config', + lock: false, + fieldsInfo: { + returnType: 2, + fieldType: 2, + fields: [{ type: 'input', name: '', desc: '', defaultValue: '' }], + }, + }, + ] + const data = { + config: { + data: [ + { + value: '', + }, + ], + dataType: 'input', + }, + } + return addCMSPage({ dataSchema, data, name, outputPath }) +} + +/** + * 服务端增加模板数据--增加 + */ +const addCMSPage4TemService = (params) => { + return request.post(`${process.env.VUE_APP_CMS_BASE_URL}/template/templateAdd`, params) +} +/** + * 服务端模板数据--编辑 + */ +const updateCMSPage4TemService = (params) => { + return request.post(`${process.env.VUE_APP_CMS_BASE_URL}/template/templateEdit`, params) +} + +/** + * 根据 outputPath 获取pageId + * @param {*} outputPath + */ +const getPageId = (outputPath, siteId = '100996') => { + return request.get( + `${process.env.VUE_APP_CMS_INNER_BASE_URL}/v4/api/third/pages/${siteId}/pageid?outputPath=${outputPath}&source=cms&_platform_num=100100` + ) +} +/** + * 根据siteId,pageId获取CMS + * @param {*} siteId + * @param {*} pageId + */ +const getCMS = (siteId, pageId, platfrom = '100100') => { + return request.get( + `${process.env.VUE_APP_CMS_INNER_BASE_URL}/v4/api/third/pages/${siteId}?platform=${platfrom}&source=cms&pageId=${pageId}` + ) +} +/** + * 获取站点下页面列表 + * @param {*} siteId + */ +const getPages = (siteId, platfrom = 100100) => { + return request.get( + `${process.env.VUE_APP_CMS_INNER_BASE_URL}/v4/api/third/pages/${siteId}/list?platform=${platfrom}&source=cms` + ) +} +// 获取模板数据 +const getTemsInfo = () => { + return request.get( + `${process.env.VUE_APP_MINI_APP_URL}/common/cms/publish/999/lowcode_templates.json?_platform_num=100100`, + { + withCredentials: false, + } + ) +} +const getDynamicTabList = () => { + return request.get( + `${process.env.VUE_APP_MINI_API_URL}/common/cms/publish/999/dynamic-tab.json?_platform_num=100100`, + { + withCredentials: false, + } + ) +} +export default { + addCMSPage, // 添加页面 + addCMSPage4Tem, // 添加模板页面 + updateBaseInfo, // 更新基础信息 + updateCMS, // 更新cms + publishCMS, // 发布cms + getCMS, // 根据siteId,pageId获取CMS + getPageId, // 根据 outputPath 获取pageId + getPages, // 获取站点下页面列表 + addCMSPage4TemService, // 服务端增加模板数据 + updateCMSPage4TemService, // 服务端模板数据--编辑 + getTemsInfo, // 获取模板数据 + getDynamicTabList, // 获取CMS动态Tab栏配置信息 +} diff --git a/src/api/demo.js b/src/api/demo.js new file mode 100644 index 0000000..2a85cec --- /dev/null +++ b/src/api/demo.js @@ -0,0 +1 @@ +export const DEMO_MOCK = `//mockneibu.linkkids.cn/mock/10/api/list` diff --git a/src/api/lowcode.js b/src/api/lowcode.js new file mode 100644 index 0000000..168e366 --- /dev/null +++ b/src/api/lowcode.js @@ -0,0 +1,39 @@ +import request from '@/utils/request' + +export function create(id, name, templateName = 'bireport', outputPath = '') { + if (!outputPath) { + outputPath = `${templateName}-${id}` + } + return request.axios.post(`${process.env.VUE_APP_LOWCODE_URL}/page`, { + targetType: '4', + name, + terminal: 'Web', + outputPath, + path: 'none', + visibility: 0, + canGrayscale: false, + templateName, + }) +} + +export function publish(id) { + return request.axios.post(`${process.env.VUE_APP_LOWCODE_URL}/page/publish`, { + id, + }) +} + +export function fetchDetail(id) { + return request.axios.post( + `${process.env.VUE_APP_BI_DOMAIN}/${ + process.env.VUE_APP_LINKDATA_GATEWAY || 'linkdata-gateway' + }/route?/api/queryPageConf`, + { + apiCode: '/api/queryPageConf', + dispatcherSystem: 'lowcode', + param: { + lowcode_id: id, + is_publish: 0, + }, + } + ) +} diff --git a/src/assets/404_images/404.png b/src/assets/404_images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8e2305cc973ad2121403aee4bf08728f76c461 GIT binary patch literal 98071 zcmZsD1yoe)_qGfpFmxy&-5?DTB3;rUAxKDvbVzqeiAZ-S3L@QI(jWrT-5rArH4O2c zxq5&1-u3_1I%_Gcbl>@Z)@`}0ni zgTxS1Xz2Sp5LyN$jB+`(TK2go0$*ON+wYG~Qz71pR)(>+cvvo`d01{Xdj)u2?ZXzy zmA;x1Nzp_;m7?it6=)ebdFi9=K=7-zt#9B^kGF`IzK;CC(qMy@r8#>WqG2@cS5uox zXbf0B@c&#i)!^b0Mb!?4K=50dqjrDj)8Y7T(OQwKjh4xB0;y*hgfuAsToL#vtY-x2 zcDPC4UD@TJ&X)ylS~p2s{Vm(V1wS(C*u6kTtf;l}x2;9RDSK|B+2Q|vU# z5g|>`3ves^tw-x#pW$kM%4o{)rRUjP-bFAxh4kKaDr2nlD0Ny3>QcfT2w<51UE`{O zQGN&5UTB2YKA@#pXv;7`0|{yiD)FUE4eA?4@$j%fYDMKsqFQWUi?UOjnyuv<1_{u= zug?(m3a+6reFd6hu*h(3OM4>q*mTc~Pg?D7J-n+TvnsoY9 zWoxbD->+xD=K*Q$(+jLna6%I4kA`x*GDPIgI-Zm%UVn5!@S7kc4LW0oj3yb?d`)8c z7ej523IBV$9&o#~u-m;%@UGl)D|$=WY^|@KLU`Ac)l*@|602_{T4+M7IA6dbP#2AL)Eg1u&)lV@(b^iSAa}Wv>^6+>!0CyZsvtcv1&Qq&svN z+sZThYEIutRzAD;PdEXgWle?>lIf5kVEHlvET1a{;shO{ zn-EQLhR|g}l#-=7bY$DeCw*BaO6=ZCIRr)2d3ye8*IdkaiCqEbd9ba|DSo;7ROxl@(%P?=XHjX#v%4uLDStHz#?vp;8Jp~psBrurXiozhE0`(5iED>LBhfh5__U^oInU|$yP zEjDz&{zwWAxMdUZr8h#Q=vPr46k)9@kV_jypUZrWZ3!8{4Gc-ISvP>EqE52=OPg%cn3_A1Z+SuWO*0}uNWds4s zAhHbNeJ>FWsaCAW5waW9L4FA9Wr=FLpr*j>!WUNfY>TSb`i)Yththth%76Sc@)}q} z#=A@s1{4@Z>WAs!^^cH?WYrfik`9X{fiIcaicws{R=?W(`}oTdF7Taj4mNRDu&>;I z{4zufM6pn&*L_0n^uS2Kp2m8rj=vHajm%)0ZyNTcn@wug^UjqFs9J#iwD=khPyY|B zktqP6M89)9&wx(|%4a*P;&Jc6s(^o8=aRB(4Kgwpm-fAp_?~bxq0|4UPCxmP54Nw` zf8KveXS@t^YI)NG0{})#k;X3S`owvLhXtN)LG8zL?>f|k6Y<^+zeU_~P(n_T3cesZ z8M$)|qkPrp{Yt_1HBT1+ zO$}G`mF#sBF264SZO#=YiEgoZnB0y+E+=?at|BLr{=?)Ir}<1cztP~%gOtGG__6o( zMm~b3uxF~!@$Upjl>b=+yK-RE^|!b6=#XmBAb0Kk0yP63l$@RoTOm8=ocSwp{*zOYGx+e}se(;LO3e6?ei2{2&&Vv#NqBGgg!wJ(!R2P`LBb7c^&8 z?_}TM;6eYN3D70K&z~p#{=4r}rQ6HpW`vHNQ6cYvu$FmNk@Ifi=~0v3F+WPqS*X{> z2_Nn)^R~a;O-srktbEh9S&aNYACRic7*z#8+=w0Mna;iy>`*~9X)GjuDJ%2()!vdB zZ0%@0nm{d0Hybg!I$Csmq{VC#z5?Jn182ITfa?C@E(zU!0=cu06u$Y?}# z)Q!Vd5YFX{PI!wE)k>WaaQkvEERB9y_+J|{$ekI8#RaR>HTob-4E2h#JB02*h^Df6 z+hbAf6XDe)%Bk-yG^;-KiykYn{3G^*W_{J-^WXPidjIz05b`1L?_RQm-0y&O7;DB? znhfbMQX7`Q)xWCPdi9+!bnTwM4~5>a6{jc@y+8h6f(8CFuG-$*J2Knb^#~b_$kXV(?y&%;wLJv#A=pR$wIksq9h{$)&wK4AHHGojB6 z2(7_D+CMG$3c1i4)v3GYWLSQ5Fi4E)uPOqkT_=lR{&dUcQ=+q{7G%ZnFRo#YhBB7T zpTT4KG6XDdObk4tDsUWL!nCY;*QhBHa&fhy=Rzuuu@v+LHImBfsx)g-H;d=!^}p?a zgG^77#$I}a7(~GRLzx^(#GUa*ujinA+$hxZSd|yfo)lV_E1uj==Sh=$LkwNEasOf) zT5`b0yEWGfLaG^o+eYhw|&EXwMkEM>mX1|P;97mZ;zVY)Zsr#NQ z_wXNtrD+7xw4BGGkPG2sC178@xc9VW`wjIKq1&9CoxjJoJ{NDBp#buct7%`48WHE) zC$>LXBJREU2b$<4faQak(xe%J!T?_wMX2wIi)RGlMfr1i&r78EsVhp4-iqCvF&mHG z4kS$mO(x`l|FPc44H*0NiCw@p1ufF6T1qrfZx zWV5;6dMF$~gZGYJq({OgEp7LSuk~T2jza-BbAVZV3a>nup0jCE;N8am$F1!WO{#9F z%ZtF*))3`(x4OT{&;Ibpq5mgm{eg5pR8mNE`+AdK3E!M1R^k^_?eqFd6IT^(Ix_RdbaCSknTxXyUb|;m z&nNLmSwmlEZ7K+W|5x57X?vWEy@v0lp0n|tEjaXJUEYw9gaX7 z^uv?6E_PQbj8#SqOIQ0dtdeinTHL0b>j}|=KjZ()=~AFKB8@fg?{KMr7-*`eVN9v2 z5+(3xlWu4Te*okrAKMW0)Vu@Z-fg&P#851~z%5(K3%P>WkTRft_~S4dR%F~-z-#%4erE*iyIUDsI_aw!@R(+*>ZLLojl=EX;6?#;ZLvr}?BDkWfMk8f46 zly8wLw37nqASMlS?e0US<+1v!ZuJu)o=388_yaKFMZa(&D8r_&%q$fZ3;!1>^11Gy zH&1jY#kjMB{(5BY4VdEIM{#~yf1SA&y(8`ZDF$CA#^sPyKho>0h@rMeW|863S2=5b zZI*LJ9-puF-3MKE)x!UULqU`HK!EVidubDLM*;EsR7K7@Orc9%wX6s~WvK{qfnBqS zdPL)Yb>-qs`Os_K<6M_n3M(u4Uxf>>_qOZ-@3gObHKXsUN)R2Leg&}D3?__yiWf2{ z_V(gf^NLae+P38aZ?Jgbun=?<`Y)FtSr$1)N&!<)Ij|Hl_DA<$3TbL0u@oA_Pu=53 zPo9Vv!!I_vf6b{+B`MUR`4m&}!#^f5CPR^?F3DHuO97sVgG>x75ne&Bz@{VV{7gnk zz8pm<GC_er@IEsh z=7|sF0pe@QiuD95$$$3Lq|hqpBYVqOF`P2;GOKCPD)>t;&-s!xZ6Jz5f8M#F4bB9D zOoaNMO_xXyn1JGe19K1ta!J0G{E&HVTagC;yuR9vu(I*GVb9~LyzHxGW96Qzj^QDC zE5ak9qmHPu7iTq@REe+X$-7)cl>80e4z-=L?xp<4*t2f}Kg7z~cc!4y2C3ucni?(e z75ZH8?}@;V(BeweHxn$bx($aD63nujoxUaXE=Bh5z3nT-JrVJl8`doS#?v+%74Wa9szPtaGOjx8g5fJYN_27HkJicm~v@1-<} z=W)j=oqqC*zV(;aQ(H2V33Wf}k58JCua0sVA6TvIxx@}&yk;iI5dXaG(c#y2Ia9d* z#BG`lPxe*;<8k0(!0r7>CAY`SYLb6L48Ai6O&lTPYx&rh(3%eL+-H*_-hgW~78pr{ zot~+JNFcA#<@circTpjM-F_~Dv}@90IQpwjj_|L$2aqngFHQcV>5gVpD)#EfvCH8X zJ`uyzy7SDjemiuw<618slKkzNKqLfa2n!~@1*bm+(w)%w!*Q)P|2(#-(mL}HRv4Mg zQm8<>^G3{Aw#Z$6Xm2=s|066T!!JM%k?jWis-FoDxz7xDSlmL2rBBR`P|pqRTQo>8 zL?C~^Kw^%_`UjEioZ0#v1)6#A$I|JdN)OaT__=giTkbGnlfr;+LlYC8?ae5GTDFhc zdIc)R2o+ZybDfS7&D}Drw#-E>P%E+8Y4hqD`sI6)1gJ?#q4+3$>{87bS;qMtfBFBJ z>;4i@z9z!ze@nySP$v=-d%_-N(;>EmFErFAzEQPm{Mzwm|lFqUBuc9NI-DcEi1#S=7N~U6xl7j!oQ23A>GoOCz zu0p#A=$Xd8@q5I)xv<){ovZFNrVr)1zbKQgP9@^=CvwF8IWZ zNc?lp$>(V1gmqWooCCW!CtVxP=Ce86&vh}M{{0;zP9QWnasl7{W*~V=bYa*TaUQb? zo31v}b-tP!wp&WVNC_^Rxk&M7s4NtWosm9ztiOQqHqWNR^Z9yT#Kj8fZe6_*wqfro2X#-n{{aPZ-%v-r`uHAzt5cdI zc=SZ1D4J4B_7E{?n+3yKJT|Kl^({bi|l+Q!jcn7xl}x1MqMkULV?ct=_mz zelqcVi2J`-$wF?gN9x({!1C?NARW47f7xM!DYuxa+LGXSku;(Q((ad}-*XG=87a#* z_qLd-MV`|x3T44Il;|yPMop}pTE(n_UmtLWFy}q^h4?@l)1AXwfNl#25WC-`;+|m( znBiDcJEZwd5~TSWx1Ez7uAzS@*kHymO4-ZA(Uz@rRVjc2I3hMEt zfbZ1wmLFA-VzxpnW7{5f=A%wtsm^!hv@faA{FKODZwoqK>gEtF_xvmZ?~ZxiC^YVQ z|9?JtO31xW@F`AuqX9_s9~GDLIm(Nrc*<(;$M4O6D2;k@?+ZC}ShUd-z&I`^vbp+h znB`!{hwppFhV32vHTJvcPVZUS5}=Ue|B`&%XgifJL=I$2^<$s+pbq@-*kGp%@vem^ z@pBXV)z*$R-k|9#Xs7IF>IM+?NB&!Orq(|SWY7o_up1xdwF99sfv>K!6DwU&)>7Er zx?Gv_CR-FYp_MpWvuz-8kSV~(7BC?fm2HOV$WliWir*Z+#L}PnAGc5jbd$xzv|I|nA8yRK z5ZJiJ?7XFdoubkp&CJ55^plmn;;2l3yP4a5PG{XFQwp%L(|gmbA)GwDDJ1mERH(v^ zXsDeLyvf8MB?A&m{5e*NB^`~dRE-jj(vkxmZ5rKIpqwn10gsato-wTWfN!fW*Rn;b zp{(nR|4 zt+nh1hx~ijq4^wm)4oM5mVI1RPWVUFBE=B!>t|LN4Ldb$A$x8%ATgGU^w8lhurIzd zfy@ndCcapnr4I{ycx^b4^)lrpt(xC-rJ|Kjm#Q7``M<9iq>#j8;Po7+Q-}#ij@`-h z9rf7i_ve83GwHfM>rq`RUn2jp;%NWVJK~oIO#V|!pga~qfbeZxn^tswR-;JJfj+5si4i|3iE<2-3D8F^f<b zL{D5BKg+S}W6N8Ls2gGFnsRB5KZE&f_k@`KT+q4zUc7?#}&R{u6s_{6ZX_c3;&Z_Q?#CkO)G$u%5{DcU%B zvqJE}u-y7%w0^p;8u0Pm8s5)s8qHPErTcZ_&Qwp!C}+5=s5}RJMyi04LzC)eL6rCq z^M9&WkRmcqCEhy+csh5sgzdoGgNVC&2^mV!S$1~zJ`>+dJEWpqj3zX*cE1o`ldqJP ziDC`HxME3);a|7$ep<9`X4nuW5i`a44y(0?Cy|JAQWN{t>@sImEox4X8aMP-#$J(4 zGW*-R5KdkdH0QjC7&^z#2v~aQg@z@~pPy2!NOAbL;_-oAeIY@2`;A->U@cZ!r}Mz` zgSEUx9oCttaX(H&#$%t9a44HSVg9aJUzCxGuxMOL4u$fdYwy<7$i8`sZiP92L8<3b z(IoM`%bJ!`i&9Pmy0J5-9&G6iLQG#2qU#S4tywRc^Y<`wi1o%SK13^UN)g2k+J;4 zZ|&+AVX!!f5RmK+t|DPl~W-1C^UN3iax* z=qP`5R^~UkS*aSw=<_cDB|K{~4ZlyB;7?TM9s+7gnXpFod!U1o1|Cm(Jg{*Wm=?STJhVV&FP z&R^e|g2d|gZ9!rx@z%!rD6ZFK^yjN(`t++b0s(C_0^;wcugdn5j7HKOm)|~P_=_Y2 zy}{>(SvAs1Zz%k=K{2YjZ(vRQ^gf<#17!9UQ$ls`!@jG2to6Ik37<>ukirY|pNeuS zr&RRuf8$rPX-n6NUA3Qr*rKxb!9IWYS0f@CN2OiR$~c*#b3r(8k?Wz?NvjeE@rz8< zNb=taXf_Ne#}9ZDD9|A?@7ry*zfw2T1f!O@^kr{-1ZPjyhCi>B7`t$<88ND4rNH!a ze(Xn?Y|!@Xs`PZhFU7BG(>D29lc>ApLXZW81m%$IQXM;BTNRLdGZfpc))!X$S#@D; zUltUjVE`S7r7ZyTTB!CUS4icu^B=r7MwUZNKQJwTwEQLF&fuJOX#Y~bw7n1BgX5Cv ztF#mGT3Mp07rc=&*UtNxDVA$CxmNN^jdx+Oc`4jIMx>J)#Bb4>= z@&6(|0)PU%U+d3a6Grd`EwIVDXIp*B8tHo#)S*3p#b9vkL!78~E_+|Bt>|3r9<@=w zngkXv-w*Fa9>YNF8FXG9gCqtM#l?j;0d z#97D}K;WRP$zis!I+_8|-*9*qLKR{z%j+WlvGahZjJ%>+y zSf>u!zMdsH?>94Q>?13Q!Hh);he++PhbY%{$+M>!1aP-32oMbB+IZDIwO=8gKL7)* z`AfBY#p^-gym$51z4^IqE9-gdN4&c0@}Y>v_fW|P;s;4rr3^&u!3ZQ$Q4|ix^L{LSE;(JsBjeBRuvZmC7!jovh5X{^DSijU z2D6=qm2LhNjC&-}zL#`0k2@`lIN;mEoo)f~oCy9!4&8g-a9jmYs0WB_K&__ve%BuM ztKaZtCXIt*m!Wb_O}CT-JCw(!$X-H9!FmPPenpQhS|`yT`Coz(xfWEJ>|g*$yue~L zDxcU)K4OlDpw+zW4-sxHs5v;eyem-@FAlu71YX`pyl`fl)G*U~p3e>+K}*z-(Mh>Z zQ6uKvFXF!iYd171%kiKrHOcE2EE09s`*IXm*`%U7z)n{OpsP@5c4i_w@4+oT_ocl) z+F{GQcL}GlC*hx(0|TjD-?0`61y;fjeohOW3+J>Rs+l|Z%4u+HuO9#+tC9y9>Qwa4+X3JV~6|6 zPokd>F=p$TQM*L|Xw9rBDUdl&el_~{;LB*PgRZRG1-jB3`WD@PqE|# zzWFoi-V$+R#?QAm=Pw+|9zF{D9WvJBz+&bsS%vTktsOy4&m#<)=|c5#JH}QUA5_eT z+0IS*VBp3>UySh@UY4??vP5P>k^*$F4 z+OG!t>ZuOL4u;20=a->CB(#OB{0h;AXKN5P|>PLUl5&cbh z)dfMDHw=^Z5h4V@mYRlqIqp4n$4Qm7rb=gAs%*r%ImW5)k}A*=JYxq|q+|8AYSLHN z!fmm0+zz7{OMNzgk`o~(CpwynUI>w~OlkS9!U+0!2=O~F+Q%45^xl#UhX(APlMV}`a{w|Ah zSpoMHee2Ew5@EWE1d&xmv!Pj`4{mcXzjUj`^COp03-LT#ybpkNS3BY71MTpIqd+Kh;X5VWdJMqPE!u@-gG1X z{{HjAXQwQR-Pxjm`ofy-A47qxaIb^(Ks=SIPl(B@hf~+zCXcReee3s^D&^OcvG|Mp zJCG2wTPgmOzm$`x5OVP@FEQJ_r1-zT5_Hu8-pq1!|Uvrpmz z)slQ`wlgvV@oZm+I>}tzyYW{vgT(%baHT+=vur;7dhH?;}=^>aPu4U_w3*Z3rZNq&=M z31MVj{!ukp5ho!JF^Jw@vDIC4$ezh#?i6tv@c*Q+Q>pH#h5p83%wvWtc?^sES;>+= z|NLo9ku99OuhQuCj5zk-BmDy~z|=P%kNBGdf{Kx%<3M`Z2C0gDJ>&8kZ4;&3&BaWC zg>DJlbIB1MT7o4{l=+1<{yjG1EF9f*x9x+ zEwZs*GBGcAUUr$zAJzr!*i#+4b#01=>-*kO^uJASsl0U`lv>98V})rXfkR+x_!C+` z0;NCjea32@uAMO?c`tm82A=I6B)jARGzJ5{X1<*EEZ(kNUjt$x`zgEBsKxCImP`6{ zllLW-Ae$ke#p`JOm!wp_$))%pr}~!$%VmnU7d)X8VR1x`XbI;R5Z~+%Ie%$ES@r<; z4^1Yk=)IEw_}AuO`XB3e#2efb(WPUH~2*g$9{9=RnkFxE4y2m7!e&VgbiHy_V7 z6$QZN?a(8-ugkVVEz(Y0Rz-M0RgeqyhTPP^GV387HT;k{!s2K1LHcXBQ-pYmH&yRz zsL$c;EjoQ;$rd{40A6b4KjB-`O7R=VKX1YW0+5GO{4FPf zgp+9Wrh$^~_Si=CW<^#6ZA3D^^n49y$z$py9KL!e%28V6DF=}JsY}q zL5sSP_FT%5ACN|HR^d-~{6;BbR)D(a|G?g$3yL5ZxmZ@xdDa;*T^;UFFPn0WZE!Y` zZuE9g$3mRl1L`@M;Gt^qnfwD@7qyR+&P%FQgyh2;x72!Z?CqRe2Ta4y06|fF5 z=+{@snF46c5yaZ7$*skt!o%gKyfG)rL_%D_p&gp{I3AZStia%Wi)wV9Lw=hxTy@Lb zlaP&|Dm^17QMVa=K=c;pht$|eU3#G7V-9~3hGivM>TeqLdw`z9wEW1;xi5UR-(_AS zrx#x=r{fYo@hWHaaOXUCd&wj0isGD5%<^|j(V7YHz|f~54y*T-n zfNBSF_vgj{!RMIQzpgG%^A_yzRH5``a$S+p$@_8a2lnQ(ic*Et!_va$Sd2kCoQR`uXZI1N0L-86P2}qKuXJQ$OI4IrH>i>w zcj3DZ%Y`VW@mq;AEDzEmD*-A=HDik}c%_%=p=v}&6R_68b5AGouVo$l7d|+X?`|+F z;JwSW;<=oNiccagOP`5@@&DlBu4G`_;%RQ5D>82BoX80`yUFb2^q6)tY- zhuqf%Vr7LDK4I2dPUjp}LYoezkYc=2UE^YbYsB3zA9p^6WT-{s-0p0mV{6e`cX!;AP7Kb9Sr(ZA8g_c^S+_P8og#oCu@WWAWkfxA)dh&0uZbpHG`dD>WY@ zs{-y!U{tV^Ibt^ zBkVbQLBSy+sk#F)RX5($Xo{cfmA%JyUh$YuR$vWc?G{2%jQL6&;}tL-*0WypaS5xa z)jxoAeii>#ug`Tb6sLe1?zi^KR z3~x+EucSj1m5|!#5VP^klrJppC<^!ihskN^NgNh&hP|Q`>Tu!|{@D ze;-ypIawvtpin^+Q71T`)0A!Iu;m(K6&H%fCJp`8A&P>Br_x*iG&$UiI>p{PWEXcX zTnnq81Tc%TzR-mQfV~jEIE3y1HE2w7);A>PNhDyT-e@l}U^im}KU84=nAeJ%U@tpF z$8-MVtGL^1hQje-*-nlz42B8jHkrYx{ZMh(Co)GUji#7Bf}pSC?)rErvt#zzdRiVG zR}Q`qW>~<-@|Wgkfuagh9c@(CP}R3WTz>F?{5FT$_C%mt2#|j1K&B6yPMg}m|0Rqc z>~b%ar?Ds!M9{w1+8eV?wiO^ujg`2va|=x)_O552YVnGwJ6FH?5tWwh&~hjp`yEoi zyeu5*;te#lZHA`6zUfOHUG5jJpJ$6cW+ETn)3y2Nn;7}mi&OwESrrNMX23TA)!B2^ z2R0r&x^eu-b{u^u)M%5}O0Ws85NX2GVM^Frr92Do1~O;k z$aDcGLel|3rZ};iKlp-+I_>?`I~7Je>l%q>F=WCbl>#aXS|Ujv`P>DF-5V7PsExFW zI7et1-VePW?_$7TX>+3`tM2=Vhxqd|7djc$i{yb9!K(*8tRlfpHCQM$n>m1x$MQ2N z@T2(sl%+h#Mfz1zsqG7KVQy9^&MPv7-(q&q4!}dz3Oc5cVNCC|_2W&}lXzxMU8{^M zElP!-mbgz$=6L5`&agzc5FRaWLFpF7EIVHh62AZu2@S_~PI>y0i(T6EPp$i0)+z6X zH&&1h*B_6Q=kW$>#Qv#PT>*T}84T42{IaXOY?D|wHzLPa&8cf5Ik;IB?`GMfGqo`< zqF{}|aQztZYW1sjOGjO3G~!1k-(qVE6{W*0gUcGR8ZK_+)tXW=1$9nO64xN1lT&9F zvW@bqS+;zc1Q^=#G#qw!;p0Lqk%grwq7o{MYpQ2QBi*GZpWEV}rH>Jx0;FFS6$vGi z+kx7jInK6j;BgLtgdsXjuMqzF-LBO|4jTNB8Z9EuM$HGX<6W+$(B~0#P+Y&}7N#&n z)}Y8t)xdE=ccE#cLq#9|UJXMgGZfqFcwx%yc)x;4!aiEblNS@}c@PeOnjtVsrqr4| zQN#!o@yxu(-&UO24fwaH9HV!ZX@E8TQ;q~}5?ovm*W0-N)H7mp?sa2`p55@RElDy* zP~=Gb`t?20bSdKP#b^1Q)p*u(cZ0pTl-bUGd#Dkc3qn=x`RP64rS%_7;hpJ3lh!}DnAHJ4=u zCC=L6td2M!;`rhLI{x%0&}^nz1)oSBJ_QmooU?BW7C*#OT5b8>-aQx`oc>7jT$X-q z&&mu|-nZU6*J~1mBdIBStd!#I0w;?*G{+{?X{8&Di|D@#X!{f-8zSP`fR0B?YQIf{EiyAvE)ZP@hT=07jChp+NS0 z&9Ye-A))c@R$PP%-xw1(SWvpgq@4$cS#60=>_kdiFsv=FOl{p?zuBW%Tr6{RJT&Vn zg~_y*_a@Xtb41eHeV8Qf^_cN0KMA<^Qhv(u&7Rk6LLHhY{Ptx`e^G(0sL$(nIWnMD zh3!2nVBRRbEZO%!S1xWvK`z_dRf~!D(V)=NaC|vMB_kMOfbj%;5V^@l zBcVeXQ;kS<4iN^(a5C$CqL?JveAKU#&+HYAT0dXaU!mpMlaG#@8dZy>G^&w_s-ttl ze}y)#XTTg4%o=V}7P1YRs3wi;$MtdIRTc(G=)1OgS@Kd!h||6|9v^-IW=M?TEu;H$ z8(027qt@eb%)6Q3yGsdzOO(mJd5VfHv7-;l^6_rM1Yy3TI9}j=x{7z<7_OLtMzT!Oc zRdY*nd$dOl#qwQw-*f$x#>!W(zFYmY3wpA$+Gde=oA#-q8vZ$cGrC|( zdArb@5U*|go=uC~+=i!H?-XP9bKU)<4|~fmt9idT;sxvyR}a5j@0SydWIxc@yJ{E- zC5~`8iwDSE&XVmQvyZGp>xlG%+px#P?N$nh(A!Js-|E;122wVZOxj`y!XQ$|`!(z! zh}WLxJeITqU)xzL|ITDmC^&@mtvT&ovdr$goDh;IOMFLdSJ(rV3B9FOp{P?YC;W@7 zL4%pvc|sKjE0?MY(mHT7u8#C((WEzTkcM~o8&R(#6{T$Nsp4+61R;$-P#OjRolz>m zIbeY=!R;#g#-fjkn+?f+m64&^+KhR6b69L87QRT9pN@|prw}$~oyO?NNLB7{xAT6`3nK1g&`t&bh4kA_TM7D zPNX|U4Rmj11Ca?_Z-B(_cmaMU0t{UTb+Z_q@UWca*F1_S5v(cvz@OEhSY7`$D)DG- zC&LWFpG2_1swTnlt)zOAgb`NG^11(HUuJFfV2%4nfSr=$hhf@=*^5xlNiTm$lU8#D z7G}5eB&=+pxpep`3H&>5VyN`PmK46PE4z^A&lPzzJFQsbWcDj(N_$S%(|lSW$zFH1+xuPR&DKxs113IT z_-|7z+K0HipL|5Dic*0~yXicGvHzjP%cLvdbO!Maty}m=d|79tS&*ey9V7KD%W(%z zHnyoqz@@ITs_lWt|CSR7EC-XunFLr)7{uUC(HLTiquI#yydAajSH-Dor1d7^oeYR) zP?pj1Q0$ zFqxb=UQt!^I6C>Nl;MUl%MgP*Y~-7Zb=LX$8`t~cF#wZZ^{hTb8d?H^6ov(koOY3FmJ;F~M!Hl&;$yeZe^%_*T z&nzrf>$B!Vrxm*9rbeNwllFA|QO!X=UL4oh&89u{xGrab7xW&xm~%sYN+U8t&_k!V z@i2&>lz&E+@c{~tSl;(!fV^+N7t~TDTg&-KiNNi{b=Z*J@b~l2w+a?6oZlYuWk2C^ zX7Ok#U-yt2RkL~eIwX%>F*g6Y&O5tjuAuv!$D~EMl2iJgAexZ&14imantY3~DJYxv z_V8QbM`*jWjzQtP{zG3MbFZ!XN+Uy(0Us&KO7k1uO9p?Z&&@8)Sun{qpeMqu{GP$A zBNUkmZ>2~}n}d}bXQxT*e1rTlJmJrO68Zh8rBC2+VpK{5_SIL117)~B5}nb}Z4C9W5)ZD+M)ihZ8mNid{+_H*+AWae3IGv3sZ!m9FATHZFb@SLgZf z&0&x1Ymh6`g-d`+7@SZQ)i?x;o3pS;=2sNP_9k;O_)FBN>(byi6mbJDg;KZT6yz3# z8IP9$H6kWMw1Lcv>N#9{%0?T^mJsBV#GL!EW#4gw+9>dr349L84kZb)l(~-qxq;nd4RFS_9e!~UaqLJnDNN;S82Nt zy~9%Bo82DHpA34r>ueco^zSIh3++&Tj(H+{(b#`|9{m3Z!>sg2Y))|psRK_9X9!}J z*uuSM^U8xOWHZ_|=Xx`_E?Y|F-;d=p&rw_ow2P#HHXdSSdjNPglxo)LH%J+Tyfv6 zXW>XqV`oeTX8-wfUiiz;7;KAb_cgQ+?OD#T_*DXL*+@95b@s%jGD)31JB#RBm=?#( zvtSS5dIN`siIu{lMTv$Z1fEpQ@yp4MGZW#0;1;IX-|`N34$z$694267K*_`S0(zYh zv~loLNbaY9iEEzIv()$afmPur^nj`fP{^(RaKQ-cK83ga=l2wbRMrj*yXJcL;Y96* zbtp+V-rp-GhXtLM;>DHvp@EETJ_GS(pZ9@T%cMv<9Lq~W&;>;a7@(uZe;lq2I6UtO zj6x8Q+Kxt5=(gO_&PHNpH>)SnGoMjCk7`%LjkcbuT@z7rm^A>#fF|a)E6cEh`G@u$ zUg#|?q6=*?Pyt_ZnuwTEe+8wigkM;apMXyYEi%|^L5sV^Z`>hruvrM z`8;qd42MJlb4!t)h>Y5ZlYC|U$Hgvz)1nUgEDf)Q^mAG-tA2=llTKF`6kOTjOoc<1 zeyeygaR7+2{CLu<3_^kUk~x>9-=8f;vlZoCsfv?$gwZTacbroY59OE)E5(ZQbxe}a zp+2;mZHuwQhdAM+X4JG^?|UL%9%&6@)DA%EIa?9Oug2@Fn*BD$>zV)h8fFxk!Aj)2 z+P{G(ziD_KT!x+7o>9?%c~R!}VMac82K?p`-R)6uAGHYG@%G$Mt9N~w&fB^iF-*4( zD7V9kQ)8%Q>!hcT+I`o1k^h_TgwW$E+9S4S>9szO3MtY%w<&jjjBFTg?0)M znPVAdYb|U!?e+uCjnWO*9Tb3}20mDpr}};3cmz2KTQ{ieLcuU10ZM6~@a%Pg&A$z2 zhOzKZvozG(2Rc@-a~MpfbnrSm}fBhK>yi8FSy*>#*j zohK;Pj_}2deRhpMJ_JUpXY`BDMUId=xt+3!FSg8UiKhpYA;&${|BYT;aG2`q_erMQ zwXw9re8Cot*Dacp=e#Bkp9$ms{_~q(~E~W9fsu3F@6~HIhAG1fO1t z3}*EX<+ZkeZ-20Ryma_|%8WbqPJs4M29cr+h=UP7M67Jm8A~RgisfIhPY$}Wu+J!5mp~py zvQcQdpLV2To4(=Y^s!cV6iRKbz%jO&bSx9w9g)t*&rFh2qv%) zeaWmT1{7(?7Y#>KuckPN+;PX?b&yIp93a z&!MWZ;3E%$tm7-RJApjf^&CwhDxDP*+9G(wK9hB2Y#P~bkq>x_91~70%%x!%c>?m8 z>T8VFN!_B#@DO>BhJ6@PW&#%%8koMETzJvU3%Q43P(Pon^n6Uu@!Pd}MBSE60mN1E z!C%YB248gPtEG#OKtkUKZh4)>5j0H7jD{PRgfsgupLNC6n}?KPfm=E8fK#NY3d=u4 zDIWw>F@w5L(BM>$#USr20W0%lrfAkYm{`?TSIGWdYBT0vX;vZ(Ft!dx zR8yRUFk!p2A@woKby%dC@FQXolk9g}71GYm@b5OO;~M!GfDHI;tJbi3GUM?^m?vN* zL1zb+zmCm<0V|1N@KZ^H?4|BZUIt(-cr?7~RM;{|>q8q(^>AWfa>PB}8>;sDEHX;( zw2=QPb4h9Vfu_}>tLy5M2b$e^2EQ4mHvV#gNl!c91vCKBuC|o&Dy%5VLYB6z9RzMRFNgI-pRaB&N z0HHNCC?NbuaqXv8tQCdARxo0u&54((w|8jpXi2ONM@|Zq1jt9S4|n#~&7N9RZyrt* zJMvuDy1|Ma#XZpK!;oR{O*XKtekGj?(5>BQxdnFoz>3!;ZbB~%)mHnLJ&&d@MY7cc zJg4hxq8bTT`;k2mZ%v@f95Z=IGg=?2p$>%mqCmI%tLa1Fq+$&DRD@^M9pD6Iuz_b6v|Q zmv~^7t6lHb(JB4D+hc7*wUv*{z8sU6nncMW0l~!ijjEVxPeCXccDkm6NqebVA2nX@ zdY3)F)Gao)a(bSc|NiNdmDn;Bn@n&(cd)J3(pWeT_ z(Yq#}`x5M47B%=T$+uWHqJYzfVcEM3a$H>)CXz4|<;|HkZoo{>qqKG)RKPTZWkHKf zGcMo@K7)7IbqNyW1f)Y=)KZ-J!>NxybwKK~(C#V6`s~wCKS5nxGhtBI0o5TUFB`Kf z4^#z2_gZj&I8$_uS-sWV)fT`(XGv_wy2L55GWpZOM4m|>q8r)+{&odMJK4R?sx?9V z*KjYcjG-ppWZZ0;-LQmO3OQe(zx!Uo7GmHkDK&Y{Gu-W4m0NmV_-$~RR3e0u-l!*b7ibQWDH-!|7BoPF<^duGj=nRQyjtLL{v$6VXpMCO!Z8e&Dl#r9~4Is3d)DS01NQu6)*>1lFCgd7&2Bc%$C+zcl(b z$xi@G+DDUXM2BmD%H-h2`x5$@Au5~52JWt8id5A(R7}?#ddY^WUu1hTcwB6W-SXp4 zl5=|&>@N+>X|G7y)ZyAZ(VT!8^VT-x)HNR_hwy@oH?OEFG zS6%BUOqBd@Sy~*`>|s*rac~;&PDo`sgF+Ys|(46;9gb6C2S*Ja&o( zqF?ly2HM|6roPQgMw7?anzR~>bnLcZQKpU_DG>O4u&doa-8;0u4H?QRzshQ2*HFKR zXmo&oR6%_(!lsK5>_S*RR4q0f=+tZ%Sn) z#isMc53y8KcpmH0A9p7!25sUIeuv%Eu$vzwa7KfFho6UqtMlI3jLBrsDjY! zl)7Auq_MKRfa0ZKSFMEzTj$#9LviGKRsRorZc zXaGAzgbJF5|HIZ1)Ifp{waUh&!^K9WC5U=w#=38Pt2>E(DBPm6X=6nZ_S4qjm;To5 zab`rmzQEh<2Bd=4#S^E>2cX-9x$Nr{QdFN(?ujbT#tQuV_k}r6C^wGT`j(QVdX69B z&i_++@wddENFD8tcNwPtR%ny~iBd4Mz&a_q(tJ6+QJI9K*QZG?f1`ELUu)e_iLB2R zs3re4{U4;zoYJ8(UG3iUG_+5TXylL${&y9C;ZmTi2o|c8M~$U@`z}`O@C8-KA3e5< z;R&^>3jW$+Uc(tr^BD(*Zw93q7|YFtc^Sb|b=83jR~_W}l5Opg?q2Md2`2x0OjZCW zrOBkuy$1N+ft=;3fqdFZ)*ANr@A^AXVLx@986i1oM zgSMlCh33E`>NW}LZXpA8`A4r)``QSTkoB8Vv+uRN}>4#tEW|0qi; z@A-%OwxNVw$cJ_*0+vL<*aJ@~L*$;k<5~N{P z|0nY+urvWc2AzkA&hXBQ8amu>s7_=d*hURqGC@(EWcXz);W4b$wuM;dhyKg-;0fZnD@Z9GysG$06DTq zDMdxAJBI#VHOkk=!jIu~bErD;6u;M&3M zvyXoPD4U&#HvPo#!uaRHbc0=qZ6clvUR=WHc2BRdxeyOd4w{nvrz2@iA*>LSeXe&K*h(Wx2WmCsE3$ZaX;ld3u~|nME;o?I-b_fn(GSS=888Q1W zu`7|J%{!Y;zA=rGLVQ1Y}D3XjBI;Y02fcg!|19sOvBrC1dM+0UcB7JwajRAZc-)Bs(w2!ow8$L`g`H5 z?-bdCWEE4(xt$h%eCh1#KSBPZLB`&mtYWfU=mLTt9a67E<5gMUAGzCo^$YMngzd|l zrSUL^yF;gQ`AD!s{w=keKeQ*VVJd=v$$ns_vlJGNUk5M|Cd%5GVPl{8#~HHLYo6@` zhnG$V3i^76=9F*~DFTm#VXQT@?JotI3L>*q7ChhDm0#-?5q|F-AotpS8~)Zh;MGypLSqsU4$5oHlFgVpeU|gQ)P~-Yhg)$ zh^3MHyYbm+p?Pvd77hKw&eQ(x?Ozp{(y7$rgX8*XjM6_>^o|5kAQqq*_a@Y&hThlFXD_Mes?+N<~#8LLVdkMgo% zzwnz(+(L?T2aEqS5AH+|5`DLtg??oak}aOQ>WwnRKf7%4n_M-Vp*&c6E?o4#ISx|U z&XMigzQ|+?27fs`zs6nGka0O|P-a)~&1;?TN4CHg_aW4CYbZ9oO(;Qj$5u8f>PH(l zU0f!at1u3_uQaL)W*hQ5+DWD4$&co&23G|lB8SleyriAh)jU!7(QHMMunccqwg z(ET;31Jx>IZNvS)&@@>Ehd!*7CQpGp!>yxR z0+~*xTx66s@S_hCp#I~eE8pu^#Ga7;rCmG+DvLI_WZA92zl-<4QPuY}{ado+i4~VG zzYHyy11Iu~mbBLmUqi<}Q^d*UR>zw-&QOgFEfu<)?^yLW?qt2H+_K#{$&>%Y6^pwR zJnSB(^LIzyzQPnhS#F1}YJ?S&+s6P*QL8CxUL7ZgkGKJ4i5J|>=JRa<--Tnxe`uCT z%5Sa2tkaSE9|suc$6TTCtL)O9q^Wnk(AU>t83F+Y2*O7E``5?3E#ER$W)2McOK85p z(vHJcHDJ+io0v2zVXdBt?qnk_$Y-=-m|Dj~H{1A~!bMjCHe>YGpDse11y5mZ!OvlDO!^}qtKvO8AWbHifx^S#9iv0~ z&>#!rxp9$!n`?tD*$j5wDnH@(+K&fkxs_9KWE?zGIuIH@=!pBfO*x)JAFLbJrH`nY znq>}aA{USUcSekl*(lMG{$}g`fJc2}h*4B#|M1J`+Uz;Dzv#y~5BFKSB#P3?DWc=0 z^#&wnIZo8Aw^~}?lxz-<7RxP&2=n6E2NGSUtGh}8jDl6pn}&2vcjl|@vnG23)~0RU zhUP)iVTEyJz?0+vMF#bw|F|e#0{8ubOg>h*nT3M4Q=h$-b=f*ng&-v)NVZxkH9|lPR%8g1l4)l3X2hdDr~@^JpwyBcg9J?5hR2CvFAI^`WC z7x;)ZpgVWZS%vu{3Jrg%mU{u{3;m?s{4P|T@wm7;{ZzM1(EQ8N(x6gkhOrN{YLsjn zs9FJPjnM02ClEhYoEo*V?R+RGY7-`M-~Twn54}Fn&%9h&D>K64N!T#1z^ddE8`k3? zE4nv_HU&$ab=pS4aGqD#o*wJYy6n0pzv@K;q@z8RYwGz?a1{9M?aAp+|JIo9+<)>? zek2R%@=fqPAhL%7S(W~@kIdoHymp~-`{K^4vvY*;vPenk$)<*a)kuRh_BJhvvNHxl z)aH5vfxNH0Ay1B#bIncgg|qW?tU=FG+Qcj6wRG(!lj!EN(ZcuG;h0uq3DW1x72%H0 zdzO|sT_F8(N?7QC>;3<_gJXDpX+T{HU6U)E0!5ayjQjl7T&FksfGXe7z!T>eZI*LP z>-F{7Qj1z-^^UTszCh^xHHnmb7-wdOha05kr`Cl| zoRaK{QJAPZj`bvUQ26)A0z{lqaL&?1? zF{qTscxo>bNKk7R++`F}kSGVWq%^cG`IL~&t#Y_jK>#gz0rRk?Hz zN#kvXUkdnWihj!mKlB|+(=v!Te$e}|{KAg4>bxt=gS@tIakB~3gmH^``wRa#vin(< zEUGB)F0dh9A>Eal5%fg8{L;jFALpCY_pWrEuK_He97$tbKG9?9}8$Kb@`hh<~mU2jdee{?N>=J}NJ|70xzkKL*Ca`*V;j9-+}>Hir0 zo`Hb@LH-P`|4zFe`My7A0@PkwdU#02Z~qaepqY1+!QfFHYCwsR%3g$;ve+?3QwT?vS&IU%A?En2jV= ze;KgvAE3GsCA}C?B~^O#4356;iDYBCOh&`KN^uwNaDZMPE02ouWyHp6jbzC6m9w9P zV~nl_Kt6PuqHb^QUp0%R$c5TTsmc_gEd54Hdi^ESZ11MC_|N2X{^!vpRsAL*8{c8E zw#Sm$ffh=wSdp9m@c4UR!fB1EMwkOrUHs7y%(H13$tFL)V$gL`>n8Am1rAfu zrKp5w^~go~*yq_Gp_kyurR^&zM{m+*>hBFwc}Z=)eIwORDAcB-FR=9ee%!Y?!hkpM ze`vOakKXb2bbTx*Cr9l2CuGPgV+-Eyz)$f(W=PQS-rlX7ZlgU#@z%VeLR=~ZGQ0&+ zZDQc|ixx!u5-y~MX~QU=N6#XFe)HPj9Pjkk#{LSvh7j4pTAa#(V!bebxN7~Jc8473 zWK?&2Dlqh+#REl1%nDZqWrg*px)r9%g>gO9R)A8D`jN#sAZTg%4n=Fz+gXixU83()q%hmgX<7SvF2Tpe3RA2CoY9DKD$;)MxxZ4#--G{}7uPf@ z2Wud&$e6r;oZtT|O%v!I1tIXY_P{}it~j9)@Y!dr1IS9f&79N)L<3%!c3&oYLV4QZ z<~WFcH@SGD?B7ea5u@40u&+nl%f}vr8mrms6%^e}83l(R4~D-R$$Q zx)`uulwY~CeCFzS;JXAur_w^t`)F<1xwiAOy#k93Gt1%*rGamf0Tpe?q<+>YZw>Ix77%zKgt*;E>ewVK(@21ncMBoZ?nFuzAyc zd#S4X{w$++HW=+IZ#1%L$WH+jR;<={b%<*7-)lQ}1(NK$lZi||E%XPzd!penLs0Ew* zyXHd{6wpc7Hxm0dTZLE(1uMEwC58E{30r=;mZPv)EGk(WQ1FB*E5>uh!7VihzP zO`$*X%MN%OBQ$J^&kiIo6Cw)xyF2>Ub~9X3&b9kHgx7nEv>mM9DVAei_`1IXD8fV3 z?VK|LT8xB>3*$h`m%wf_(2}ADDvSBz9HTFEex8@QKr(z(cGalPB9?F`_3i|RqvLi1 zRCYaY4uSLuZf#5G8VGZ;XC}uIt|T4l6C{Ug(wlD9**tZ>FiH45$wF^G<;~ z%tix5Yu|9AQ-J13=q#=5Xu+u813xW5P%=@@Bt-+946>oM73#oezx?wBvs7(#tubbG zeEY^$-xeB|?hQEe!fP@!Mx@lXc?%Y(hhc+omP!mazu34UV#vn1C^mIg^6~7K5f-st zBwo5~^7?$4LI{@ISvLH9U`K26QdodjN4F(L7N>8&$j829>74MQxo*48Sp|49?1%0B zEih(zm*C!c|*@!PRCPQcPwXoZAQak}H%5u&t zdGo&&@uG)?#>LySJq)~ej(^4bZ*OlQQpHFUEHZ|J5}g-6V942pg*)Ojeh12mg8|&* zqyCjbB8g_I0DCcHOVHyL$@0YJVo&zm=vh%~MRuQXU=rSpz)XVO_o@XE9!a(_^CH*sH-|4dGeeAM6Br&VJ`4 zR!qsY)0)`2lIc&3q;=SVXND>cjS+G-zudlL4;=1Dn&MW~#@vMcWUa+!OtQUBKj#<8 z^mWznj_?1&ydX%B^tEtA4_AmgiFohYe@R)T);IUOGQM+e-QOJ7h~i&F21?PuaNw0W zjuIExaiN&Du4Rnxf`e>t=AJZN+Ej6^qBlbQAN2=AakaGVdRAKRc;XH|XYGlhn;pjw*!un56VA;9tKDQak*;frJ_Sh@ka7Th)? zs#;PCH#}afKh&+7m7VKD+ZIjo1NpGBr}BdJmf?~&0i<_PQMusMcu2MzJ%j1ZkfcC6 z8?XdwBG4X$8+_oRSR3;(J0Z6mdGt!zaDVISYfnBcr;kzbFoy0iTzX{waaF+Q4OwmK_=5Ikrcc;ZYE zTCUuusO~FLJfnjg5Hb%Y4m@GNOz8x^8Nl{86FX*%A0A*UGEVH5xrt~7zIWT@p*bL+ zpQc-q_;?8Rh5X_{aU%qHie&_;Th@`kE`o03gd3X#fvW_)6^dGmchzZNuLTqdmj2d& zQ@1Zkf48kNW&oeQy6ez?@$J_~^#hsrxSCm`=$d~FLSaMZYd9 za((3{C$j2sqc42qWb^L2;{<-S{8{rU{ir~P>%5YzIkW-4SjWBm|Ir=?tWDL z=&-APb@%Pmi5^6C7UEqpMpiTheLS6dB^ON9B;qoX)K%y4oX8)&=kWvA`arjKJzSbs zZ`3s(aU63SUM= zxEo`{c`$yKOz+0Rj2(qbV3+&rXNFmUl1PV~38Y1O z-cvI5AkFXz`@fiTFqsX3(AIH&h7(cAcLLK)cz$ChCB`66R>lqkB1h3opuYO($bs)D$-9fw6j{-hc`Pek+9!G^5OPXN zUu;bz_hm_fCsP^@L;T=MXdXCO-p6H!!@TfsDj4ILC^#uqDqRzk8$~T6!3I#od4<1Y zMWWDPN${5q_xNsi4>0<7yzE}lSB*)OytfmPRMH>MK_R7^-s7%w3ae0X_ATg{ymh`W zt)a(u;*CJm1zQ9>)td2H*=i@Jq0C(iMBR(^rZU5i$_;1En_tXe&hw^Tp^rPpPXO&> z{VXuyk}~qNah6Kbs&!6v16Xl;@URCb^F)O`DbLhah(4uksa|qfM)K(vH*OXSBq<$T z40fSA+`^NdE%$_j;nzz5kBKzQo<`Q`6i_~cW872aNEH@-TI;b&b9uu;L_jvwZa((V zH2?WQTq+u%Z=C2rx=}(aCw1_j;}!r{X&8 z*YNC2<9qyK13DIGGuViP)A@cal~flzJSW5+w%d_LDeCBIlGZN%3rZKavBJ&CdB%%n zhu5cfhLJOnw_I}rqKQHnIxN=hyZ53y_xIsFMB#pa-INW}Rih*)2-Dr?XyS zBtzo;P&2Q~xK>+tbZfsJ??p`;5hkDkJ`H-JMUlw8*)=u4d)j?{`$gw4vTa|7?j_bM zwiYgqf7I4GfaXP|U3RyOL8!If4yvY+vL{D^mAA9VLkHbD=RQ8BHvZQOtCeH(ug>{Z z_S}F-^o3OirX1m*kk~Eo-S#FcWEjr7)aZcpNbGmMVIY|B5=`o}!#M;dH>6Yiif8YU zS?&D(@pJ;it+a=GE}kb|(W?tC*Kr!g^j$Q8M91tpuT8Mt^M#;^b_S1Uccap21MY(Q zL5~md4t96*#ROR;hP5+YQ)U_yV~Qd<5a)XRv)#OKHxu~jXk}&rBQM^Ye^XR;Q`U6* z>_&md{U?#cO&BkQM7hmDIzr-Lv!0{e4fKr}!tncb`O0#AWs#6Yf!;b1IVviOzn{3c zkr^6lwINAX(iw%%WzHdU#d$#elLHwYh*osl{7Yy2Ld`xRXW^5hl~*gtBOiU6W^*zsVuy&S zuaH01^5#J@3x}kbk_RB1PoP(l$khOJoZ#-srQ)-x8hHw_HSWFq%(V~i5917*-a-&3 zw+YZR6Sb2tHMNtY+qNl>ziD4K-Zoc}R5jXV?lLOaXr!)Arn&GRF}FaPxSgaj_$}rd z>=vIr0oz_qK6~=a3_*%XP$^@MiWbZXs(kT@48wQDKcF=5^P9|w z<$|iGpf~e^vx+uHLKce+CTVZfS*dYxEjfW};!yomTQB`ATI6)bEZJM3+-nW@$mTQI zuyh6J5Jd=;BOIq0>~eJEA~pm^=W5h|ig;e`&EDPJQH4w+-+sFHB;={*y{LT1rdy|{ zr&^^m%wa2g+fHL zmm{nsV62SV)0dSq4%x_<;niUF>!X(2xW`SRJJD!@HeoGGL{e9D&6kD#Of~L4dor{G zn~KQgVI1j`;EW)`4+(UaSrlg_V=f<8(FkyhsQd#FjhAPxGGB*3&QR`qJ4nD?;O5ml zhVgoNau>*xIv3gIr{omv{n2Z95IAAnlyoV#u<8P@nF}T81%1yme+Ax z^D$4a9|YZ(mCYWhFDtyhtrULMtb4Py+#vds=)K+L0)fB{e<8l+v%n6h;D^UH-cEw9 z^aJ0_^N(sNioJhXk3-*GSPxYu6_`%KLL5FU2hQ$9GoDmiBs#cU*vkh==Kj0A|BU+R z!KjaV%;`|>e)Lg#oCefe5ij7i`IXPfnQ3qN-s9)aKDnT_SOVRQg-}5`o-2`op5#!y z-$u}u@LzYp_ z0LJ~*iW{muUf^nw6>ibMe`)3_J`q z?&D?8oFm|bo#r&Sp>XqDu;i*qwCF8Gn8Hah_N0x?p^d%1qpPV{pL$zYLJ_Y9D%e_Uox3It;I+E+lqtC z`iPman259v9u30jpV&luL;ho zu{kHD#pRLuyJHzpZLT(R>=fUqcVZ)F-$1p&P5OjS%3{AXyBVzo>BIZ54yE_+?P6Oq zu`3Z>$7AZIwffiKuTQNO-}n1g^+5O;vqX9s>)ZrleXS z;9uO)MrEV?dgwsP`=4V~aRF{s88QCrHYx*zfRb>msE?*!{jky2HH^$Mko&B?4+yyO zXQVQHKn%|3;lK+i)^07bhL%&WhDq-=zko=7-<5b?hzo-7p(bw2PW>Q7`s*u(KfLR_ z9+GBYvQo2WbN1%FA@kG6hYpVB1vSVX0gl0BY2-(>}1T>7*CXiYOiv?!1J>!>wd zvg|^TP+9Q=@{v~9$n!};qSl$e2PxNHKmm~b6QZ6OJ zqxi@qOVZ3xsGWaN`p$svhukY|H{})Ubmb5>_qa*|B8HvI2>Obw(c^nB z9c4vuDH)5pC=i+-4j@SBFMgz37RI5$>`*9IrlEvw-Rl$3THAVsi!!#-*wADAiz4^O(^qa}0P8NLGEDyldQ_VdyKvbb3e7ikAA;=q+wgLTs~v*(mumVG%{e}gH-u1MCk+o) z#?Bqi##51Pwx?&DfJmSRo>LOX2CWxJv_QmM(~I00!bj>}>+tS*P(b;03Sn+tWb(8Z zWPWp`C3P zMZF^`16hL8D8*FM7WpGY&RZZ0XQzw^wen5tir5KA$Oz~Wv^{3blUTD4>qvS>=71lz z*FG~{nfTieB9<#G`1xi?)=azd|nJS?6YNe_|J- z_#rCfw%s#-Sjt=Yb1MkuyzAKb3Z<$Yhu<#ZW+oiovhDjw(sAwESeg2D*01D6C(p7` zG2dcc6^tt^jIS?HMS_AnjEawz*rAS42|3>ebFhmwnRN{*8mx=G6q5u9-T#F;HXzK+ zNq4zsu(^Dd{AodK#DoT#;U?r}|18mm z?rzZviNOpt3wsPeSTwZ7r~bl|_ueH1eEof11Zsq)jbUU}`qxX!W@1P5RSgx5C{kJV zgseT!{?#IEQ4cOKA^w2VF}{7?7465<@9l`x=4+o`xMpobW>(8m-i}h>fM6U+-**QY zv%E3;=ir~n`)@e5!Es~<*YUVBI9FF!a2Q+Ta?MkjgTzk|Rx!s#rO2o{Km5VxOG z-Nuc!3_!KqLb^)J$@BV#bcW1OVv9>g!eDKR|#0#{Zr+BlsZ}FXwJXi(ZyElYISes!KO{6OlUJXs;31y!T+%A6>yn+;6Hg;`}VRrPOd)Cd)V217YwdgU|783 zO?MX!JO@=OC?R6aG?@%M8hq5lRKlf)ab6V!RR1 zaFg9k`2J$qw_n~JjsoCt*VV&Ze;eZOVS#f$mrvcuij~dBTehbAvqPYIC!O8wq{3VI z_F3srQ$@?3E+K=HTtonSiuL6eD+N2Yc1TZS>E@q z9*KM3|BX_FY|{r;^Rau>3^)-?|6j11_4k|A1!`26n;hu5nUdtsCTCF> zisFzW6#pGsYWjc-xR&S{%RZUqcaV+Y>WYs_!<^3=3xS(??oo$#%MoI0FiuEd;mss0 zQN_~NEAW40SL;K8z)(k?pQ*o1(Q;9|ZnDDP^mB7t5AB2UkQzI)`;|9bgK^i(RebVB z7nQI)9(*g)sw92TNa^|~bB>kfx=dR5^l5SegWmRKR*}s{$ z5|R~M#|@Fl4zi`Y740w^P(Ssh7-kOg^HU0g5b!L&o+h5(G}u2a+6Yo47##kSbAokX;PtNz(G8wdzJz5%+N9+x>?&z)eK^$XXR z4sOkoktYO|uIYPkCV_Dcjj6({u#N9>#0^(*EVcS$tWR zyDWNv(qQKeoLBn>Bj2HKpS!sx4s)weE+3mSj%)bb7m7lDY1@d+CClGy|G~*YVjo4X z`9hELX8hJSo}p2barB<$&7)VGV!Z&Kt1}gMelg3fyY+|bmUfaKT`Iq=n>qN7FClh9 z&G(rz(#*ij@cW)ve|3n&HvuUYm^}lkV2%S$puyoj*_Y{?#wEDLM+NPfh4|AYBOj{$^y_^1?5qJLv(Nv=P9G0`Z28{bEJ zQI&H4{!kwkMR^RgNRPg@H}_|*XhSxzI90ybGi4;B)Sy+gCS~%|&69nQ^NHFr4UOEW zna-mWS}?*E>O`DO+;g|ohY)kKN4AC$zQF!4(DVqs1sv%PaJw8w3IIKDb5QAY?Nen$W7}Ft-R_5$X zW>!v6M4u^6zvIa5bzX_eUEp6`-R+Cr5#!e}*GIGo$l&AspB4c0D7?J958u+q$A>xa z#lP%Cf~rYHV)nWl(t_9YKZqU8x;GUr4hdW`T*dlR0o9wXC9r}cPg|Gz}oNt1TLZ>gJcn(jG|SnSb{u%8QL+Md5(z7(vQ6 z*}CvK6AG&NJG16pJ$`iwalGK(tNiuL?WEZu^LD=54Xb@UmNrHA_6mqwy?h<$Q11DF zRbCkO1BUPyH*Cr5ApT&QH&Wq0(0={YLc@xZ>PFho8Y-*en_8ao*iJq3b;b#R<&(b< z4|pf`{sH)0Fs6O#P9EO+x&_*K|w^3ELP<2Ebmpoj;o>?cn4 z5X7GHF7D;w=xY}DAm_{`@4NKn4sFyA-YC@V&d41$HV+LTrFF7O<`s-N#0Gr0-1A(x zX(Qed&(6rU3&oCz*?ciNMQDPiMj?6?rQyTr~TPGlPx6LxECGG3)7xcCE-eXD8*8 zQas1M{F{M>wNK3Ri$p3YAwzoOw9keak@2%>b^;>f0F(@bk@yg#9cfDI$J=rLHH|~2Nvu2p4;#)XwZNIN5yV zMnZ6m@cBvXYFjIzu>FDSM@jf&)I*u<%&W`8Q5z@kVmQ_6@rW-pBW{(Ep*NYwumsxA z!4`#g@)$K7PtMk*Ex-5kaKD8yKbM9x{m!-SdS}~chKAO1@cMtHd>sx@R5*z1DhgkB z9v8$xGZ&*1T{C1Oe9cbIBAR6uXDAhQt~HH{sbPl|Ru$#^~xQp8gb4amCmY8rNb+Cn`71NVh1;Q zW2TobSTq`1)Ft1bT)c~0e^x3+`j=Ii(}K2JIS1g3 zcH+ryZd}=|zgqub*5hE5MTm3HPF1Fxz&nErePyI;AfVI&y3)|)>`AEEr^WWk02!X>@KKpZz8X;|1r4`}|gC0VoZWBr;6;MxzI@~6)Sn@)F&{gQrr~X1@{Jn09uj_J_ zq$=}Izs?!F&@xc+9YexCH(@AWJh(x(gXeRqmAL|;8%#2+L#I?~euR83&XpzEj_nH5 z>0dqE*+&f&8}Uw2EQwj=qcny`ZoM5r-%jg&hxHk!`t`SA$m>tun|={bxwsMZns?`3 z6Objdo>fH(sZY`Dw=*Nct&%fVo=@jrgOX~G6`l*7*HZu0j34)f>i_WpZ_eRPr#kTk z+VRVJ#rF!&X@YHh zoRwaCntEr9?LX{b`QZWP8`nl4_74rR)Z^x6&DRUA>e)-1GTn#h=glH#r^YjNW?P*o z@yPa%-GHW(+~jys9+%tZ{O!E*-_w)6?J1EroWU+GSUWpKH4S5i)kq+ z)>kiQc$s;SlGNF7Hx|CWRnBxfIhxk_WE=D@HkOP>=eM*b3y&;QcQ9=XcbL!CjxnCk zadrI9mX1(_&gd5FC(qf*@mPcZ!|)T$7-+_8`3>79@1}bX8Cf2QcD&yqENh30{*7i6yQnQ7&DG|3n@!rKp%AvfC z{(t@&puUeKCBfuU%%c~6Oc`_9Sc;1qJ7<5-rB=|B=>B%dsaNsL|L2Yr=kPsy@sfr4 zQWA~O>F&zUpFU|Rz41hL8Zeb*0JH6=hr&xr|2exHrb6_e4=UcVYo;H%#; zef@2Py)XZ6pF2B@eJShvZgy)X3Ld}m$zs8Zq(GX#ALHGkC1i5C>`K<_6k5IXDrb_Y*!J$iexkJb4ox z5=6gUWA^u#cH9P(VV(Z#JEuMUl&jpA!LnoDRCsk8m@%wX>hs+tQrBwirhhz%r#nh5 zPj3u`2TK{WYcfNXb83*R%+QptZG^)Hx(wK``nK$Al7Z{OiAp&TW2(uKxhRGc*}-u2 ziJ)VOlI^DFLH^b4QsZUo^JMdP%KT1nnca$&mEHG+a5wG#gKq)N=5Kwk3Zv5zPYyhV zlegZ>CvHiDKgiSdoLdDq@>X9#uf@v`zp-F&ZnZ2xG_FL+C2Q@ zG_BcL1+OM*jf4to(vHQ!kaeUI{W~%=yMBv2iam(P-bj+s(742j+jXO1{S}s_!!vCX ztGa1?AIKsCH1pnqVMyzRqy&LU(Of(XWdPBa6}*aYca_BU^g6f4eJ{qlIX6F&`^$mA z@RG2+(Lq_wu$e$m>~rF!sY9IliA?d^l&pa9n=D1qtJ~r!4`Pbw_@OYSp~$W0L9wyA zZW+F6FAE&Pucet11pnm+)*yfeQOK!LYNV65FBeh%H9y>}o?-lov*)ZWElsi~S^jXU zL=nq=4V0r+(!A(t887|Y_wehWkI8#x4YEeG~G9Yc3_4$?7nH%NEakl%Pe-+LVU5A1#Ib*(sKEj?;n zbek)hNB-u*Y2@1i?)D1O(r(ULFXP&qX0PPEBengGx6`ag(QUU#kebYn`mR_qTB zBd~4dnV!G>wY9cVF3`H`r@e?7IN2bm{<+|%R(KUj;Dt5v-t;UWekH7NLAYf-{Pa1p zQo;3Ia@B{RX#F$ok78vjQo40Bwr-i_l^$%zY=&PBZ{kVL$%NV&K6E3G>(dmdFj> z)TpeA+yOzTuHc~~v2_Jzp#5>*=#{R{oXwcmGnW z;u05^0>o>NS}gJ_9&&YP2I=0Tyi|sAkVdWNdwjgVyPYdg2iw0@Z2F0bd%I~Y9iDv< zc9fNsO;!$P1mvdpo^jpIh89jXc1OoV4M!u44Cyq0-?WVAJ23|3LELE5j~THZ+RFyB zem>U|@*f&;q*2@6htK1ROi_;Eh#gMiE$LzLNgP)h7iXOWRIW~d_>NX^XKtK@E@4m8 zUHG^bFKiDf#*-$RFPu58X6%YwZdjG}=N+PsDEh71-2L0I%sfDSpG5 z4IV+w!dp)iwvudlW|e+&HFzc+tVh=}&mm3jL~JW@o|p?y-YgMv_E+NhIJ494iE?u~ zW@Rw{Ookm_V3;@2&!7j4-~YaRHChzCJt6_pf}wgq)beV?{X>^E<$vks;$NJ=k2I~l zitPb-E;sJ3a$hT`DLYFf4!4Hp&nZc2tImBN0o)IjP?E{#&XS!KB8%d4QWz=oc6H&? z(s#X_A=as(d??Ge;^In)pzZK$r}$rvni6SM7<*X^u1%;nhq`IuK3V>UHE{>_q*h5I z>>PJxMPQxLG}n}&p^G?m+XrwKF-JP~D(|Dc^`6gmYF9lsECx=j4=dreF!_lX2+pW3 z$v5nhPW@I8vkM*z!)%mvIGPE6nW$}XfXZ3C;y(VKS{qHIY~dWx@&;#r+sz&4@p6m9 z7E`O_7c^U_2JmC%ExjK0xG(MdOgf#3{F}I*3X`HgQa3#QM@2A*=E)W^@d~u*_oX(9 zr>1YHBL{sghp|W6gC1jmt~Au3ZUkHZyj>e0U^vF?jq?QMGkYpZ`6Xe3dGzfoeLn^MDlbf}mAB^S)s_4NJt z0=PNC5WlS|0e-JY8fzPFQ~D4YB1fS4S#wpiwrOWDM~Ngse8;lJ%^&RSby7RoaP$XZpm9xGzJ^c_BC;KZP zD_Xb#7x9kxHEo{nJg!uzSq%#=<{>!bK74^&C0>AiLsd<2YZs!^UF#^gOo$rIYzC$? znDS_?KKzmo9o0h#VZ(eT*QY2>#Ne!cDBJZw3SY$4bGjfiN;4mTTl64OROmt3q=*eK2`L`@qCyZifShS6Wv zE?TheR-K99(*7IK`TRMA0XkkcYO_R_^g!rvQ>J(vTHWuv{#J@dM3A8Q%N+Mv`&D?u z1^?@T91zGj8a4^kyJsb8>t^~V%8C;pVyM#RB3CTmUXZ?^_%4`~SR%Y`*NTI^6V31yq_C#saqfn*F_qDAk1;cPl-;T^EwLAhT0vV-mYkE8s4}?D* zlD^GQbCy=jx3L3D@8YJ=uD@@8EVM$Ou+N^xX73hv8*^KY92~x!$a)9-q0R(hEod{N zp?fSolCpYDtH=Ras|f`}s0jPqRS^qy1VLxH+yMo6CBdv>I1D9t{sZ}O?yD)~K;cfd ztv#ol+RpIWRYltt%1!kZ0yL`Q3Gb-9V9q$eK)>e&B9_;{qw%MV*1NTk%%A@ymR5XN z&=4*>$nin9yX;z?eu_V9TCO#{)HhT$#8dP#y+p8m>C(!f z*{uNj90Pq8H*3Wxi?mL68k39Xzs%+wbe^=ezasRFbZLIOeJkESsX5?!?o`eTs;T?1&%T z5k_zDcUwged|jtc9FER*@_s6fjdyWr`92~^qB#a=29UnVnRjh?g?r>HSK44-3AwM0 zSSn{87YEPn+hhw=n%$@n?S7UuEFE6V5AyP7UAM3*9(7;%Y%?yuW<`QnwN>cY|4Gt? zL2Qk!>|w76^KOBqX3?wlY_*Y*fA4fH*;&&KZpa4rG&8I6*CiLdgw1q4CdeuOrurdb zzYNbfUz>aVNW+cVBkP+>lFWzRqNT~VbNeKQDqA>dt%G7Z|6^@jAGg!5~Rt3-XYq?Iw z9*5>(M?zc3=Uc=a^bCUNueJ5VUypGb@WRhrZTe7wn2q4oJlcr_!@$K1gK!|qGy_@>;btPXDjsGB9uTbhQh7{jZCtnB7hbGP02+JNy& zcE3hGJ%c#y8n06+io^s=0`j88E+ss2W0u{Xl$&gbP@h@;y|*Xqy{qaX7e1dM%rU@r zd0faiijMjv-w!@XdV9Y<+O!@NUX0XKu74%aQ3xOusjG6E<;bX@uV6%!)+8!SBl#n# zu^}e7xR+;Ng5W-olrZ3+vIFKl-|*dP*Kn zH(d6wHINX4VujOpC9#v2`6ylr#kO5@0rQMeRWeYtU$2CVmC>si$fof! z+=DM4Egl!k0R(R)o{6gx_GCR)rGf?+E!uwn>;5h2{*m%9z1aH+{U$ntBQMru6WFY3 z`@_#;1#`}CVZt8%hGEO(kNv_|jxYB0gXsn#Lk1F6B4llwxPqP0VPL$+cWS2kCMlK` zt>$_Crwd!x@+XP9fcWjQHD9=I*LrgIL;YP zs@{(dx$f~@>07FdU+b~2PBT8C8fYnO)nB^mn% z2l&uKO(*Tz{BF=cKvf8q%3tVyU)2uRMZJJv6frrhgiP@xj+m38#V=<>|Ja3~8Is4# z&tlQUt1MoBpLAWF=9KBeo%+!T_wd!~Q`x^i=^eXQYmU?iy_(L{s-=Ofx@r98PesXb ziJGYB4dMyT)ncDvn-h*vT0^}9!;{YeV)qSR-am(drvXv5p)NKKb0@OL78g^7)2d@i zBQJA!>WJ-;+P9pda>B0@pE_0z{SVmT?}HR~+?I%q0VSc*)WwuF)@DWN9FJHm~cJEUQH2!Y2=?P;zjO0Ha8rQ%34~}N$)JEv!B`;>5gYmDYGL4S0B{RWuXGcfJ zSqpSGov?M6Xw>(p4i4MREz^=JO54?1Mfg>1ciyTKR_hkmQR|%^H?{&)ffy|XQPWt9 zutlv^TqAjv(Z*G=PlroSq@%z}sc#3BUd$8mJ#IE;Vk4}E1a?Emeg^N*C%7JEDQ_Dl zB3Rt-@Wuy>3lb^q0A??|<>TvfVnwKh1{g8&9XfT@;58BxF^}ah(KWsmpuM$_mmQP2 z@Tp}4XkjHFcifZx1b=h-lSLOAVyZY(a|Ibze=m|E-PiLg!n16KMzNL^B0-?ors%Re zJ;-%)usFTOrvV4EeHyQ1#Rk(9#`S(Feikw6^yulUuK}HzVLme#CT*sdBJnan z9%UwoCd3m$^!|>a39uwnt4P>}a%5y#J?0kfQz&%>C0HP^om5yU#q@}u2_KYlv+-@G z<4d+fydVq&&40k^ZajRe-T|{u`YSzM2#)b?x5c{Ds6KNNJQR62o9dOt-ibdc$l0%x z%Ydy4Zo!Cs&VYc#clTs>c4afccWdr#`>2R?unI^e^iSI05#6+Px^BBlSngDSg+&Cw$q1`R*HEHUymT#Gdm_7wXwYEl`h>Bt`3q%++&UYx0whM+BZyQ zd~)86D268p9^?-v)=D2F;8O6*9BRgna zmRr^aApo{^T^u}f2cz)R6T+SRPV#KiBN$#5M06nrKfvMtx{hTI<$03Vij}#Hm?9hs zW=DGcaop|J_e8c3p zT?=`6T{|J69#~sh5hXx#60v@$7JO-i0Otq}B?}Y};U!_ULv&?TNwpJRVU_@gaIdqy zf`F$tYjPY@SVIZGkWS*K`wTb3zJV5D93Z3V*4~WtTyxw~dM|NoyVKO3XmeQ?>vFfv z@OG;0&ro2b@rkk4dXcJ?@MnI`nkJl@1^4YYoJ6_{m&}fS#n>(5{PsE5^KzN|QV2Au zzkeu)Nfo)*By`runhaXZd?w*o#mH~K9E{3$8*@DH*S^{w8Cl{mh>NE9 z*dn((iEMvJuTRJE9iO;YlXW)(n@vN@QVZ5nv#Z>|ZowDI+w@@1!It+JF%AnKzfDvv zGNciN4L>YpI~7XxdoV@tuSS%%eZw=_VaENWum!hJA4~<+g5L%BOD z#WrIC!p!P#d5UQO@nh}+Dk0t^!9S*2+BPc@Vqt3x;(HQ=etYvP;n-n=^!$Oph?|v- zI$h5Bdw~Eig3rr)%*qiH@L`m<)h<5)c?_4+j<+7V!izVm!4m3uF3eT^@*2#8(Agj4 z7l@a$5$61J>-IK>Psjm(LwMQ9qSysg4eD^;C3-D!GvIwv`2?40>>UfT2z9GqeTxpI zvA-(VMiCny|Ft_E@m993^z~zKe+FIKQ>weo5~nqOApcumT+wX$kmuyiryXxrHny9( z_F5Y?1I>g~&ZoO~@7|qpJM2&Nu@%;wn&#!@L6Sgs3pI`=6XZw}vRrr9Ce?8>AEt8= zL+oM9jz0 zF5c}{CdB<4jkBY`AEF1?%I!??Q|YH1?ZA8nDHTH?=LRXWnJ|B^%@;2plv+WxG<5Pg zuPYvHid5iCJ%L0%Fy2z8BmeeABYn@6vC<|gZ8&YT&>~`AEHR>(9wKe9PK}4X7E%9h zyJYCiZSK_e8`nZC#3V_!Vzje39b@94p-VRz+v$DO@S4(pcT2qkqf(^i$t+QeD@IVVRBI;HZT;k% z8#nq}-USB8EK_q68eE*|ouG%25i{IZ<^?25dB>E!bUwLNR=e`b(Rors8JjQuB^57* z5N6i*G+yeWbw5wODBW@t;$Jz`3mkJG9K}HT$w}S%Ut2#`X;WMfTuBV4VR&{#Q8f&F z|6HyN!86f}xevIH?2$9QqGg>}ESJT58t98iPVndHnH$N(&9xOi^+b<9f3&b4WX#zk zzmW__sACVBF|oKXa|gZmPR+UCKsJ2#MR7zRfmC9TFnWj+y^Fz@jJqX0@X}K8;&;{E zQFT?W_==x>&w+U!1NO#XetEJ4UIvNW4e@)QT6p^FVLyx_?fb7L^AmS%Zy!0hBza6WifAcgr$AOU@fjgm>Dt*P@t!$(67pSSJpev?R>p1Z3NttGml89 zfXoZawl&$5v1d@;)>+jPITmj{iH(sl2{iv`7!jlP8v8g~b?r)9v>s$F080G)&SAgv*bEX5Z7K z%2T};KRv)FQtAZh&JqiKt$;M;e*-G6ox9q}nYV=HzfuZO=3P;a^QW7V*0MidEuR}1 z)iTqOh!puq22EwpofTasHkIRp_%UC!tWgf(5zFj2c2Z(P_A+2Tt*rn)4z5ppCL#~o zjC}LSggjVsA2T|y#)=Dmh^c_imvs;wKGt|Y92D6I-@G{czGgMB`mPbCtQ!(Nx7oB` z^s`t<7`)s3SQRr+gY%>@hEh(FE8pqUQMZGPhdiSM&x~0teNA=Didii8@@2{c{Ffd6 z9}ff^$*OemiM`a|WDSML)m`(7yx(8=D? z5G*iTsq^V;E@h?YOz)!0vYUcU{REcyV8WU}p>;GzmyF*yZxoqV&pFm$8tDdJYld~W zN$Ih9vZYm9rATRojDyI>D;h+kYEV@O^e;i`O5tIfD&^Hd#i1Rf7SV%{BPTFL*L9-(S$(P zr3~}D5%I%H`Gbzzg}UehPjXLt-cBf>IfCdTjA=bSKGWGm(4D=ri26y^-u9G& zC-0{&uSLf_Y-_|#c)hBiXW%OtCkMWMGTniU1DpR)4sd=M+p$ly-%&VtQsg)x^i&Kc zwq>yNQ|E@Wk~@wj=5;$+Sy=&{@0SP8fOM_KqG4KX;QXh*{eAgSJ&<1~vEB21`AmE_PI3I;4E~htCAGyFEpY766JLK>*$?&_elER+03h`CnBx*ijXK2T{$Xk;MIAuqV?%&ipVyO8f`P#61I0l z^O3q;GLgK!J+zakt?ylWekk_9gUHl(>)ZG`*)cYTc&Vlm68Y)mYQEW!3`xd_^oL(w z%}ec+?d;hzRF08=qTwwhKNz^G^A3i)(-m^jBe|-B>iLSXv3 z4{HBvo+V3o7PdLeD2v=&(Vd~hxE}w-%k~>|ss;tm=f<)iE`uiZs&DhSrDtA?MKrb4 zj4o8S6~(ua<`$+D>lBSADlb~xzg}wI%xiN#ds%#bypx;7a<1#XY^BRi{ryKrGaT7> zxkf~m!Cq>yQStMM`}wExq>X=^I2^bKQbrj41%|XHP*;?mmm%h3h{IqB@vAbz^Pda# zS~=5^rC;sRFlJ!ac&FYwa9NXA4k6djte)usx*JeCEp)Ur`-6~wZ}{}=M~ORa-Y7mK{V5lRgxL-VUXoYl5zil7z)`A}Jm-CXB|TgzF%?ix{zCqc zWq==zd_m{~f^9Kx);SOQTG8Eb5@Pe+y*1iDt$gVwyDUH!uU}{lM+%-K>`a|?>g2kZ ztHyTH(|dx5cIG(D1~$~IEIbB~LL|RK(09`vt&cv@Wy_qaf%7Y*%Ux*2RG@4~0!z1! zI(|GRX3N{}TEgn%3w?bEG2JQdFMnC{d6$|WFq!;(ICt66Wt$@^+yu#qcZ7h4|M0y1 z>VBpTznZ#rL8^l}pczLo08k?KwzXtUhJbp`JmfaV_L`K&)~h`qT}CMb(Q$%Ed@v|&Tw!rpsua@C_W|jN%q$PZYrA~#7A@bDU}j<(+KdUVckS_EN%qo z{TDZ~X6rbmVCt&selMA7EA#wRXjnYa&WwfG!AE9$S_v>BzrqkI{j%y<|LNBFfOV_V z4!P>CjIDyqF8wq6gospe!>-rb%w;lUVcwsd<;$fZ5gwD^)kMQ2)mr}G?>b-XmBB&Y z(4c$4MvQy>6v|$(gE}i+&eZJ|mPV?`zY@*&Ea~-+eA;A~ zb!(txUEYNg&SoH1H&+mIjQyMIRx!L7r30v1BX`$;XIWo6zy~ zcKf}6EPN@JrvpUzrL+YWsk^E}(?Gza>v}&-1g|5Ok%TmC=YOR7bp)2H*;m4wHk)D( zU@fe*%Pv_@r9ieyfhNuvtcBI(GBvgM!pfRzlB=Uafr?}z0xx{4d?(9MYEaQATGU`e zu~apIN|b{k&|pfS5yTwD3RH=908v6?JS48&Ss}CV_Pzygqj?lz_DHH6Q5<7^Dc*JK zC9eCjOhq@Z5Hxj>c;T5ydbeXznYd)Z8=h2_Tu_iAB86@MUfEx+UK?z$-|~|x**EPt zU>Q7SWe?As*;QN2mK#(U&mYkn=}<)2h_p}i_q3>VrtoQ~3^THb$7&ko`a*-uk`gxu zo}rNVOK3t}B#G>;W$HE1tknA+36ZMzxjRqn8$G?A5+j{3bdaBczg>qDL&qMYxZB-1 zuy2x@s=S(x&XBjPTtt2>#axHdhYV{oY>6UK^)vw(kE^BNa6UA1%YYWH?>$Iek^FtS zVVD95tS8j+hbkG++}sWr+qoUe`NQ%nZMcP|2#^@n{=+MaG_Usy)zzdSG93sYdBa2_iOrU9p+{~4N6RYr^NsJ+Iwy#Dv@8E!GreXu4D-u*qk238HxG=t{lSel`s?1ysQvZ_>s&@88h8 z>YWXnKuP83o>fXD;Zg^TK+bOg44kB&%!k%j3__Tz1{32fEch$x01a;r%q`G0tIy4+ zFAf%-ckxVCe;B^9^@!YE`inT9+_oQ8*t4HOYr@>G7i-(Tw>2h%^h-dAY;9^rJn8Q= zm}qu$8eYSLyl5r1ao&UuiFeS*&-P0v5cD#tAJ)W1O^o*Lvk9B%Jd zqsAFkqKDA6zA0fLfj$b4VvX+V$aKRTni4sZrj;Rjxvh+vSm{j@L$iykvo~j9P6MIN z?A2oqR!D*8flQ}qwjF5Znfy&fuMU0ZeI_Mq?qLNr`3UA3%C3rVY*sov>ujYX&y-+m zTqHk@oY73KBRb=uhBr{;zu^-3j`~LXfh!%$>dzS59Ft=e+bt)>E__|z8x?Ai+&BsL zQ4#n=ZKK>~L&WMBH^2M(c6WmQLev0Ifk_?gti!83Jhc~c0KUh2D`1|X96pZmxVQa>~;1ESu8XqERMM%WdBvK!1OR?{JDU|KpC;F7@L3H_f*tqgQGA2xqZ* zRCRQHMDACo7FB@Oeql^+$7!}BA{Ari>#w7@O&#IWimP9nJ? z$MVOg4e&|C*%oDkW5Xu~0r>H61?yQ7Ab9yUCw?6S+|-qkWrqyMKSp=&f(*x=v<)P z$C!1^nzQ~-R)%Y2RX%^*(2J?s-P{f7Rx`;@a8fgc(tz$6S%=?hL0*~j?|_hjibepi zafu4wYh(Jdud2+JBnR=7x9cT6iKo(H*8zKseg^|5V7^D z5APUe6ybBCgH{luWd+@4MUsDSn7$&Z1;+&6-vp-JLXcUk33u)*n1)Q>Rs!W?mDFNYAZq}st( z3a#g{2NfJ6>O2V?WeD{*;WbyDnNP#XB+(6hs+jdYagwM3Ylm;~s)1BJuU<;i#2zOF*xKxe8hT&nj-!a^-t);&2qmh z9|!GTtPc6wm0C)UzNR4&)(*W-If^_tKK@YSNW|2vwCJxXpv!_Wp=w=IKTioJXkXeh zXOU`pX}=j7jharEh@OVP5SvBr)#9iIDP}G!OtF*sLDcJ8G!bk5>3X2IzkS?o*hct1 zzk8R>=EA{q0nrhM@3-S<5M8P=^h_{~KlJbg1uy*yZcE&1;Y~yi=g|Btds5x*d^?1(jf1XSVC}4yls_|q~-j5;Qdiwl_aCD#%tfRaJd;uk2Y#H zRJ;}A-)tW#Sz0LyKsnvL`74n*e6grkxgASLiDE-tO@l4;l6<-Upo|hv;e=|vmkg<) z?KQBXH1B-YNb zZ4Mt9kQ0y=R(6$=l-PY^W(C@T@$e;K{5y)~aZ8Vhm@U2HyzWTy%I+Z^t?Ij8i#~<3 zS4w%cR9VZ)mvs9*_`%(lCORqXpc``&daDP8OS|ro)c?~4l+0+w4d4$vWqdUqb&4RCC zh?9>1^~uRr#aDe$iNg_A!~XOva$iN;$2bj$WG?J}jrHK$TndR^j$$tb(#USI9u2m2 zWes*5`>>SNjYMk)Y=iEEU-jh|Z5B;L1{TnpjRdX0&b0 zvfu>IpBqBZ3K~^2yNeN;C3MaC{yz-SjivQ-!QR@IU*cG=F^JW>o`W}EUR%6l@QxBg zUw`6jmVPOd$8roYo;gV%D-!2l;U9^)l;ck+OlBQ?bB2=GY>nb25{=V#wC@6`Vh-Ld zBz_UTR5m{=qK|}Yk2NK9%2s&~W5RQlQsI34sDX0x*1 zNOj92z3loP5Q=?DlYDKeI6#x-qR;Pms9AVFkYsBU!U6?H1n~KJY71e0424;~ym>2u z?FO9~95$o`Vm=3scidSFbhHd8w>BfqF59%o}4>{>X4=E^@>y zF4E>hX@~e36Q2wCdqx>m#J#aFCfpvI-|GbElXtwITWKS%LC$md(_Ph^nEXGmgjoTK z#GWUwWoJGIs}D&-w#2QO8byR8F^8*rE`zH5c5S<;$(EnV+RuSNE#S>n3scDmM93U4@EmPGf$Cc#8_DDe)c~FD z*i7sb6*M|>VlPjch+nQY&6g|;(9~^jzm>6AB1oIXF4Z10EGAoWulFap~bR7Zdr`04na7yU$7UY`c=n4fO`-Nt+B zXWBU!G_Ycc8*u3MY!_Il*jb&i?zS?`vo1%l?!S}s2}T0wK>WsMJ<49bWiUrOk-iO+Ms(0SW?Q}6Q;7)7f=G?%mSvKMi&vwH2hGQv|opqFiR~i zoT5US&dH~#c{ox#36ig+HI54wQm->~*`SXWlX}ZU>sZ=}J+;YUAKp{Y|1ctui%o3& zGTI~PM%xVN1VnSXkCjR#_C*|SR?T$ndwt`S=Q6eoBcoVWA>mA~&lJZUcj{}RKcr%F zs{wX@#!bt}J{CPI@!J&td@9ilbb2F;yNuYNt&W>-1T9?p7?jD=F6alSo9)`#TNXT^ zj}dQ*U?1sGQk2=bMTqZX`FOeckb*4rK4!taoGm!^9`)_H2$g`Ii>}NGNpyg@Wc>Qf z69ZSp21pL+i=Aew)n`G)jR$;D9cWk9_C0iH7^SEmkZ3>YQiHCY0UC-P=uq5hI$7gQ zy?GCkb$+(e)L+*g-404F1K4yMK%f-8FexL5L*vpRpRrIvrF;iXQH}K2d z;X~Yhbfrn#i|nZ(kphRrNj$Fn(D;?#rN+!{t3INCJuyuzLIeg~eBhE}g$B5Js(Xfr zL-a}L>1K;&&V*97Gkci#HS%IeWKEFxG_hq`aC07?>~>_Po3>n}3AkS_-Z7QiRUR2D zZK7bdG$yDX5%HTo=H>(Av9?*wF*1o3E;Z zRAinm8uKl3> zO}QS9XFLqZYH^_*zKa+i8Ax`*w#VCY*_Z-*TDKA+dKY23A2}QnWa`Qj5$IGBk7N;P zj#Uvm>%fqQSFhv8>bC0tsL*8s*-40DE3mn#gX=P#g6S$L0nNd^xx`gNy+$t|1(ZB7 z)0#Qab5^lO;%|0nhRW28={ADfk(nF=%8&Y`7pzmQ?2$g2GptHP<2ZJw(u+tAai>w?G+y_ws%Q;M`D?{5aF ze}u#k&{rW-;1!sP8r8-@WHxrxW-1?OQ?jr@0u{YFDNTG5KC zlXd24MLA;&xTmG{4H?>5vI6;>+%UU=#6{~`bSidRwjO4i8(sd>DA2}Nk5A} zw)UZrDld@-?!{uSMFbCXO-=A00YNNINP89se3S~=Z8&|K1*zSg?e{~^c_!N4;|Z4H z!|-h>BVZ9L{PYWA2!{wFol<53gA1eSdp{ zTFFMUk|z=*+j)zpLp#AXjv9K@E=0A1!V`&+;2hvoc0I5O8FW@W3l@MNUn2`EP;TL8p93vMKk`2E5hZI&>{}D4{9Zb3v6un*U@S;xy zTBV<~O^i2ee^{g(6SXi$yi(!t43RlqD%)Dve{{&$5tT7!Xk{=4X5w%0cx9-z?5-^p^NBHO z=d7ciCO<5A2lScTte?(smUHjh&=sic{rcc*SVlkDnJ){}^a#)YoCFTs9g8;>Y4j>G zv=SVe)(IE-z^44f`n7K&!2i2ng(MM3kT&E}1?mB1IP4}Fw$w`UDKWUUXc8T>y5PEx zZ>D}De4X0$JwrluJoGy=VlyR}k@qv5k8JaNiU`hy)bVt5)S#n=3lxIhJLpU-$Vd}w zQDf=UCl_0fE+f0U2-Kp!BmiEoK=1Kfw=y9 zt!Y(_ZaZ#Ja+u^^+V)5HZIT=OskX?^B!9d#J(+~||53jy5Df!V303#s(fR?(-r7Fw z04=5%Fy!nnmw2qArc8yCXH|Rchu%s^CA2aH4&G|Zn|G6?_fFc>Ejv{Z?wbiLmo0{( zvMW>*?N)2ReADc#EfN0NFv?v~x%(R2u=|r*e}^YZ&NQT@wk|lcNx=9yV))}JOzDC@ ze!Nhwtk3SrgM4dxNA%cyr0XNobgqTW<0ay$NH8XRw8`u`n0zh={&~;Or7d#gWV9o zr~%9G7Qz-aWB2yY3bWbH;Oc}&JL>>3oz1mynCiEv@!4(`?ewj0(oX?UOy878tjEb< zrJh(DAu2UYqc~GZH3@NA!b3VWr0A}RwMuUy1A2yhQuwo~d0F{E;=wqb=sEWB@F-)k zMac*_<*|5>^qJaswEKEax zaa!H42~~B}*zJYBPQ7xjWv&_qG5GQCwu_|ksIk8ZaOFvII#?KCoy=BzgipT|I_%Kf zYQ^6A_6GlVD1X4>ru$TRyP>qbz)c*rUjcHK8A9%Y@CdA+KmRiTFC_g43HNcmWVefs zmVG0Q)PW2ii5IjD!s(}0@!(QtdNK@1jD8Q#b3aw5`Q0Tirz#Vg`fYGt7We*p0>-Q- zW;o{|Ao-|(=cCyr_o5JKYO!>iMZXraowae}lw#^P;XtH0s9X}`s0{db&+X7-9%Af3 zf2zPK`==weo$IHoaT`!Z#*FNZRH}g#C!`*S0xusf@^6Fol9@)|Hy8=aaCBODtf7G;~C4nIMZ0M#KJ9G^(*dx*r-}k(Xg6E zu(QDV##SZOLCEihdGa^S^mr}IwAI$^r_t+(p-?SiC@aR>*hjnml-EeGtR(ZFDg#kst#3G??FL{6DJRfxD8f z3m1)@j%^zq+qP|VY-`81JGRxaZQJVDHafZc{m#APj`I_$YRy%1KAN#Mc>C)iU{=(A z_10U9$E^U9{)FF?87Vc)?$b3?aaMVSjCzq%l|d)|kc{tO%0q+Qd7&a>eI}DvRpy*?ylVaF4GadkqLz z1Pi#aH`qbsAz~9BorMG%j?@M0Amh~08&0CZ3Zfw(J0>Z~()u&c-+9ZhUCF8mB|{=` z($~qs)NxhMyoiGeHs_ruUUkGLOLgB9<6HeP&Qn=#mJ6gK{dix84Wao0EC~Ip%99Qk zNKbKx9o(rIJ}iY-y?$+v)W&=v+n!aNni*9MZeJhI;q_3s^QC?Z%Tl0tUUyk@?Bn3+ zZ*OnENS{nraI)nVY=4-laOlSQ5WW<){hu*5nk@g$+P$_TDl^fy!fh4sOScPm5>s)o z@RExkl4XA~U9~rdae7wm*{7ma0t={lc`Cn@Wp-gNs(*M6%--Z4QyHj&v`6tzed8%@ zGB@-na>24d^FXKhN-n?h@D{X6q%7~nc4Z_G#QLar`FE#@V_Jbo_J0`ScUNNhn19VT znN%(kkBg3Q#^B@wK49qkoCtyj_JuV<7hZI}S&Hcu`xkVjn#c;Itvv;DI!I^1>QUVn z%TmnJCtmF(vA=n6tk~CEL{JRt1W{b)l@h(L{d~9DiSYohC;y%x)e%&X!B@oHz=H6y zt5tu;n`mpp4mJZRVrmr~0E?;ud0Fw_KRf!yPEFFVsYIgN(i}C_;>;&a)Ex?wNvOWM zJo#HRy<=SI$VUI;hvV500sk*Qyw#Q23DaY3m9;CZ+C8)bQxV#z#^No#WxFrbxenjB zRKCNv+G0RJ#ni5uQGJ*qOX5}|BAWWoEd0psHyBDLR0~&-;c~FcW%r#Kw`#j4YDM@F zqX($bA+AcDq3J~m&c2KFmKj3G@?^l#WZz|}jaZhY;%jY?74smo@)gqv=4 z0~5X2^F>Bq`v&d@!xXBtjDNFZ&5uW5#%}jMu7!L4+Ih*<&V7Yp7Upe7Sn1?J*<*Ur ziciolGLM}YiTgJj6;r&?3%80@YE##?+-@G}2`+F0XC%R+Vz7E_;nbP)&XI$4xRQ9*0*fjD6IBfZcAE&JNwz z99kKe%k!+T$l@s82M&Qul;ROK|b z{S|G16Su0~avvvhQSE`4rVJAnvolBa4xK!KuSmXD0cUFE3ZZi$S+Lc;`DlWftr-|g zNd*X7;j-1!$=*A>I44gTjzU_L@);8LHTEh=xj(UDmphitzs5 zy~r!b=Va`(I_$C`$;sHY=(t_@XnvRvmMtLGyKU0z zNCb3bHF1JXC%m?xl9Dz7r9#2B%bc55{;<=V8no{nlO|}mG2ZX5wD93_s-nr)w_xR9yicPDyZIAfGD1_=E|Mrd#L zr=lx}>D0|hg_7WfkDxaFdv9`V5`52s(~&yPC(U{gDW(LH8o8fD(kF60zEXCyy~wQo zNzeZcdS`RYU|1DRTO{{X1PfQuX|do!w(e=7_CuKFGqsnAlU$GXxjJ$6rD~${sA2&a zVIuSEjvZx8yk*4TYMg-`Sp#!t>F9`&8hOs=JQwa?cjs_D5Yw>RFJtS@N!oF)GdMTuAa3lyLjwOft3X=3lVy`d5KP`xm0l4Tp!lZHx2$){>l}gRyguUdE2f zX%;S#^WthDh|*$wWZ_w`kq$xN9tNBz{X>zY-sqE}aW8aL-2dXR=K5hyNepH7=_(wG zRva8Cecyu`(lf7^>zplLQxbg>|0-})+O*(i*CGuE)KRN2nZdF|1&mPSjCE%K* zH^HYFzjAkB8A%xx6w4ADc}21ukox#O+?xu!jSg-sl-)Wa*ST2 zsxnGqZRXj5P-1Mz=HFoHHa{*%VlTe(dN8PZv>m@2dEUP4dRK|-<4_~{1z9NinP2aW z(Z{Q!6@SyPGf3iDYK9+zhIR@pP<^6jql$^n;7>=#fYosLT>hM;ydyg@=EfvZH+&8O zvf#PS+w671^cm&Fnomr61=9_~5xtdxKv>bfpp3%c$9uQ#QajNp#o;s=R}VsVFcFEH zY0YVyYTt2GBvp2IXu zeC!a97UMd_V^=2G9!=kOWI7T61x+cZFI0E~q4ECc19ELhO?9FmyFKf1tQYZ$hl0%y zru0k7b=z~%Xd!$N*`ZTeP)ckxk%u3%>x-|797#esX6``JKkhJ#bCpUnB_y0!NYLb! zY~P}eXzhnDz8pcj1e+p;79xv4F#CX0QLohKPm_UT(0zG3Y}iJbM(-j-?7ic|bD5r@ zIV&(0`VN|73G^XTC(`E8X+RtELJX(kII(;IXuIRPTSj9<*RKE;Yp;@2YFI=B>Qc-K zk9ivi5$*cl&D(@la1eO>x8MpgJIr7au(&|5(76;yDL*YM!$1bUJ7kGgQjw&~2imistlOBhMsEyPZ-j+>bNVcQyV&Lh(O0_4L8)j@IZ_H3dfNTp4-y+&H5Vgmzwo|>jX zbN4;*93;B=6Mpb&NMd4ejNSsz#vb%_fUVqE0LE-^x9N#gw`Xm4r`Tf!A(tC+DqXQu z>07F3@)~ZViyPccig5;HgwJi2&a{e^3v(8cN0tAlFk@nX>1cQMRdpQ{qWJd;A#r5? zUrn5W0T><}W$cR9EUKtNsT4x#_V$N1-bM1KYYpL)xCPBH{h9jkEo%@Vjx_(#67xE8 zlGVbkC`F5O2gYRpfpKc*;QXc5(RQMb^9AA{cHALtz7)Hd#$BRA^zw|%VgejEOaX+i zEP-M3T8f|vxFCw1QoZ^eWWetdp9sA!0XqsKHf^hvql%dT$n@fh!PL#q4T0xC9!^o0 zewDlXNiJloiVzczN^`!FT{j%#E{U~)XVhv}8R>(Luj#KOKGNl6K*52qGt8A~ zS%uyQO9V~|o^hN0)Xs2a@;Ku+XU*(3G}v9Yx1}$BdMb8z{#Wn-TXo*Lp$1dyGA27i zYY>M9=IzBdPa_BvzOzMqHze!+?<|mlc|m~T9L6f9lO%iwA3K~JV4v9VAo1c)kauHD z;I%9rh-<5fLT7+xV=?}j5eO#8SfL&(UY~Q^K;&_W_XA!!2SNb=#?PyA@Td`y(-Zff z&hvt<@G2(|f9^NBN;~U%n#2Q$))Ft}Xd`411hGGja0k?3cxP(fE#i3D7?$v552MjV zEIpapJ2Q6Cj2Wl#?;m;2ZM9~Qzf`G~L80Yr172y!G*hYwIv4H%gI11|XZ7+cP&HJ|0 zA38W|Qu63+uq71IbaaI)D8rpH43%hMJgE@|uNiZaL`jUpSg`u+DW{F-M#GUhJ)V2%;bhKYk|)GBls; z7j9DYvaj$ZBwBZuFumZ=iL!nlR;8%ZRi?O&AFV2+ovf~`)H>+3IT|M?bZ1Ik`iP%n zfBGHZ?fzbM_dr@y*qF|i>(uXx2VM%KV9+EWI0z4|cX(0)Nx)S=$N5?#t2wLYs+oq% zWt#sYh3;Kc=SN#XB*$>*c3rZqb(!P65kqk#$@&{7K$Fp(LrQgKHRjPl#VRISMX^Z-WPC&tZf@`7RYu zeX4wFhhH}`K}9)wk}ssn1jLe3e848ad~@efp$8#(l!GbPHHUc$Wir)@mRoA;5n;~= zEQ)jbK@{6kONoT?L7Tdq?Ic=O*yLFIsOuB0Ra!tus%oVKXfPCGHceFDC2ZyC`k8Vq zjK_PMB~s%nnUysD+*wslacq$wwd8i+AI2`DBz>=#xW;LbP5y$A5Z3E~&BxQNFc4=etchoi z8)8_hK}ay043DCMuR$}ieq-cb*A^I~`x;J=#$u_#qx#wU_Tal4%m2}YC(+>tg>Mxu zM^@qSmMkb~Nt&)Emhuchg7%u7o!pBz*dcpZ;_h)5-RjKA z3PQqLH*0O~5mv=n=xf{$3{8gB2+i~jhR?en^>&=kI&Dt>)WqGefsKVzC}Qd2xa|3H zfuV7x9UBScpl==JJs-v%RBt6 zHTnqT5REkr?O5p_YK83F3wr6O9y6b{ZX<(^!Q{Vs`A+bNwHtV|Vw8I1XqXxGcCNL^)jZRAm{tD7z@ zTbap~URg5GCwp{4JXe!45u|pEArQ$3DINmtrbjp)i=#y~>!H?*P$CQ(dT zPnrk1Gc8Kkl53~ZCaUmwN$*Y+YYn6p5l?K`dc`T8HLQvP9d9d62Zz2w^9*!!-ruAy zq2nE5ev%@iaAAWQ6uvF5kpO+Hb&b+}NO30Besgw~y9!82@nS>;17iMSPyxOv_edZ^ z*u#tvMmtSagN{D%qWR!4gchb?wvAAUDlm|C`UeW=YZn+{GcDtB+ue|{d!e($w`iqH zfzpb4S=x(s7dj3|F+@njcI zSy7O~yJx2L1*7Cymr`k@7cs`#x(iqH5ZS0v$LogM82rF!h|(mn_*aS*?Zt{~#FJwP zj)zO)n+Qy5V@`?K!ClCiWYFayMt<-yNi5Ww`Qb?vGI^AekEI8QVGy}tHKKzpylCv$5Qtyv8#NIlEoy4wzU@$Nw+8Tqx(MI`9v}6E8tqcR&dfiPCTcXv- za461f6QahALJw^1Kq6z+2-;5ZvDr!lH-{Ok)Oj~;Pf~Kt0y-uS0-9Gd%X?RNm)5;R zn>u>(=Z6#AumiwWX#mybC5>tr2TEovpw`dV5=>}s9_+8#!)(TTf;F$~o6}oZz=3sn zM1ts42CfnlP6em0Z6;_gxfgU~0+Ezw+XxOg1OoC}0H|2j;}a_#O-K4ZYn$;7dg@jx zRzn5;UOa-MY%T@_8u_KyG`OJz)=p3|<{@FKI75`?^aT5va`ke!LQi3ohLh0lY~iLO=}Hp06IY ze32Si0C zBPzz(78}IMJU&}XLh=~9KB;uzKa4`8w9n{NJxT2DPwo}RvXxyWB#!1c!y317xm(9C z1`HEfK|tnLVZ!#RJ-rnA#)#)i23*b_q`Op@l(>$_k{7Vb$!XoFytJ*I=W%&D*}&?`cbS}CNXF(TQnk7g5nD5f{{9%p?TnxvOb z`i@rc6Qd_r-VokabB-1uNgCw`EUdJ-Q_@6eBO=E!AQi$YnuSe>A?u&?-!z>kdY#P% zl{u6^$}90*501OogNgo0{XWL`t_eE(+0r&0jfjh#+;ST- z(&qg8801IPtb@0R?^ zKyQ}x+9ld%9~aiMZfE}Pm(wDuH1%+jWC6XO3W;m+ZG=x}Tt(#mI-`nbT5C+e*5yT% zszV$iDjWp9nHcAI5s!Qz*s9S!snlo+^03lPS4TI z4||obKaKtMzZfY2W)S3&7~{emZJe|_f#K{!ltrsi^`O`V!_`Dobm%#W2%J(j!&5O^ zbU5jO*k7kWk2RRe#ey=HH*1s#R0#j}%aa|dx8LRA<}w=T$+1*?EkUAtGZ+%beHC_M zk7{z^ItM05V2h(nl5ozPz3Y5en80R`Cr5rhR|Js;!^dCQT>W3*_xM83P8k@pS5eX|aZrA1L4XxVqTlmr1KEw1VA zbiuabZx5gpUcyK&5|hY8=e(%pX0Z_4{UD1#!G80ApbjI#22_Gs(xqDG(cjrE|Ebu2 zC>>SMNYJem-eoU-BK0##{o}EEhat+YVhyp<94DkB-xA9d8r~u@S5T1P9YN=0;#y$l zx{&8`LT4(rTKs)n#tl-?iCN{=zs={fK^Z#%)8yGO+lxv@A%1dyG#P5By^$Y6wM^T& z@Dkb#BF1E@y(a=YNsSU3x)B{hN4SoQvs&^OMZkC?u*6vSQgZy&IS^+xN{6ek`}#G( zF_2wW?3(jzA;RP3T+E+W9^y{y~c%@LbotcnVF2i(nRsLk^$jbfa z)PVEVR%EAx?4q4lhP5hiq_bzQEc=E|Ei+uXbFK5b;ONc0RmSMmL@(-%=<_6-i<~=g zksBpJ95y=|N!fb73MnlB&R&qkSsxmW6Ayy`1A4r$ zy5_SWh>ox&HQ-*pMslkF0bBnwsm|~+2Fr*B07_$2%dZ!^G$o&|HFO(1Fx$N#ytcGu z7uTs7jCH)D-efSN7M*|;WOE|n7ctaO%wx844jr^(jdD*VgX7saFVl$n-E2((Ww=Y4 zIdvt0VJM*t#Da#>K|!^(Ka25QKeEoWWa}N_s2M=f{vM!J%43fAF7(5R?$e`EnL^;0 z*Z`IY*-Pi}tM9*3DLBgyZ{|gmjNlb3IsO!|Lg++NOH(y9wV#ultSf0$&oQVdo+o%q zaal+=-N`}0l=zVC+0O-Q9gcQM4d;NuI#Ac$7u{2XRK5bLc!$q4hN(c8bNMx2$LU^l z*>L5Q?kM!JGN=fp_!Bp?J?Kc*%-~db z6`3kPrF(y7x%efG$&R7OBX3oQJ)v8K*582Sj_h@39fKYFg`O=+RvJne24Mq*=`)K|i zjHt{Y+l}>0b6Gl=@mFE|MEj!w^1meVxIt2s!pp!Vu;jA{_-#JvF71`V=d;+pE(w9h zrbVa#qrUF$Cs@k7lr@QHSBGK)0rrjj0{Hg8$S!I7D}gn!!*&jHN0f`8R7i9z2|dDJ z*N00>aV4U)j%wL~Kj=W*52e@DgTOS34Gh43a!R*9EDp`?H_l@zTey&c%8K?j{9%E$ zJes|tniUO}=_*m&9s{9xO%@2etMaWPv9jW^6{Xal0^IRWW`s&M%42bi_V6XE%UZqF zCh1wLRmr+&H$1)`SX>{SM?n;>LkEhWe)vuBqEaW7SRHF%SRl6 zn6`Mnp~x=H>SJJZ#|=++_A}(Gt$mL-GJ?HaM*(k0KoUyZ}p5S=EQgeEgMRp4!$j;F!U<= zl*|8?@zO1<>XbB$2puqx*^gsX!s5bi!Q=pXeHn8zIZ-_1XkNwHzDIvdK)zB*+4Pjd zxwItS1#6yK#vIs{1boXXFG=26=Ox0R4HAc>|2M<>y38$B4w6=?r=O(^(8s?w!PjD( znb%3`4CbQ4-7epLYr@!?I3Z0^W%a`+eg`U(Z-w6;y^6X%v!K~E`iR{JIvomu_G#9% znX&CIWcrkx%XS+$Qh&3#qv@^>5XPS@!9*D=`(DB(H*<{}O}7(-MItf_P-I*AAyWL# zK58G+)Hf8WgPO21;~j)goh2Jn+Y%LBt{qLjCj(?y966(}n@nJdYcJ7y;f|z_xQ2?r ziYar&hutiX+6DbnrfI><; zBWqSTe5Av?Xksj3f##lgI)ON=)>7PSCRggxQ-ki&R=x2sP3j9V@ssx)Dod>zBqG0Z ztC%R9I{w{&lqYWKPDV*-mX@HdpHZrC*cgA@LrPvZ|W;VzP3WMNG!4F}4-Fvm&ifY3z2l90KaCNqkW$VR}_ zHX_6;9v_a?NS1nUNkQ>Id4OylTS|lYAv<`A@+2KX77A#!OYzP^5|U2Qa5c`6nGo^X zsc>|0=Or2rE#gprp+`qE_XQ@>28=ulV?}o@BHl#hJzK*2g_AJ~x9+64MJQ*{t(e>b zIk|4}R|+Z&f>2bcF+BHX0OX;5O13vM0}LmeFaSmpN_=6PqBn>9xuM0Ejy<02989N^ z5Sr$r%<3(d@g_xPxn#oq>G~M$7G5R&yJ=thCedQC>JT%prp}SNRKXT(1ZZp<>D~S!j}ESBI7ht^zB=%F{c*g zKrX-vkN~xJRP8PK)*l;5J%-E*iwS?;oqq>X0oiE9LiKC$FcKP-SIIDZOY}bR*a6Av z*3sa(%|6iVgjrt`GAUod*ISl|&X%QxcGB$}}@NvOq?|>CwZEzfAsw znaW4&*Ls_S=gDjXR2zmBz)T97vur(@s(9iZ&dDdFi4MeS!%K(t^vz!;spUbDy`Gq?Jg@oLGNj|-!sH%!VZ)%Ot|5U}@jIQ14>Ufmy5+ln zuMr|i{yCMnwD|Swa@sYd+;r|gjA;x8LPYS#!{FN`rkA}(^6j||)OFw?R_LuVC6wj! zWm0}!{Kepp_Mh=qkJH|oU*$GXjh;JwHkkoYNjWb=}K{yH(g!xNDt z&q<?eQt^qb0)7m^t;d}O@yUnnr)uQ zVx}Q^IjeDpgdHZ^G!%+z)^NfW+SQwCn^q(Kj5B&Tpvh~bicZl9(KjG4*3g5yAb+mC z%3#(5ND*1JAI+13xGDZkMMIQitN*hdG( z0UE<69T~O%Q({OILA zeYL{5Q~bswnnJlv3~NHyZMCN0Ae*|J?Of1t;H?wO&{gg&nH+3^Tu3A(Uj1r=3aCsGhpXFDq0cGN?q}Tnu7|=T1E!%f#sA7 zCtp^XTn$S;HVkIqx{?Rf8nHklCa&uWn2cMe z(atlHI(EUt@D|*J{n&jY_~G@p2DTl^`a{$w(tUCY`H}`6dSom&1VQStf@wF^H4g24 z6Zj!MvFg9xD=?uvxXL}$T~w0jq`*=KAnp3G9AA0mDU(|*Lun&*M18mm1kulAA@ z_LhK-k>bQ_BybEa46C2c6G)_B|#}Y=&7FxWE zS_);oN9+H^e2sBhKPG$xgzk-lfE#HAOx4gTdTljzeqrwl_^f z-o|I4&AmPUdYa?h?xf2PMlgO=M#Sx>xyI86gEFl}2K)ko2t(qhOtd@y!)9JbJ+Nsi z4z#a&a>Y{Ckf0y1ZN&14Ac!N%rA0BRa;TI1F<%ahJl6gY;FAlzd5JUi<%KRkCesuM)y^+5WT?Y@tct^2%BdBWB_+w0tJsZ{jIf zbU@|yM`~wIp8Q!foQo1j6QP2MlRoAIEL3Wag86^Y-Lh>r3kOoMrs+BMfD*$Eo_x7-vg{*8DuXm9LWvmJlE zv9%i(>CI-FI;vD%M*rPS5d&U8Z+!5{ztmzSF4le_-q&)}{@U#r$zd_B+b?JYrUAJ- z2%CEDvBG?Y{B#Qd>zp?=;0E>Agsf%kVy`1ptuG5|b29M?gE&NLiK8Ywg41e1*;pA% zPt+qFtM|^VW7}t-m0isYmQ{WEk6dDKfnedOJGD#W*G@p91X*M8U7OCEMJ*AFB8n31uP3R!Dg?xDn_#KOBSw7mR#!MVj6BX% zZ8*@@PLN=%AqMDQjKp3@cZvTIO9|Z`Ix3X*{02;zJ6OkP3vBxQdE2wBXV_tNJAv6XV}v&J5>WBi>z zYGKx}9v|UbgFP5X?J9isLSZdq*?y<2&D1yE)^4D0>34Nb)%2jFq59aUu1&g=lk8*A zhODEPBx~hwS^mxViAJZbdhFVR_m$5Dyjg6-4u>)TUzY5#xaeqj)?6!9knOC_5(mUt zwSRV5yj#S_f4uI68Ee#pRc_SpQnOjekp@Jb|qQ&FE>0|!T&3z7>8%)DUDn^eL}$HJ|hchkEpCGj1>0 zgx`uKcbZ>jbXSDgVu~DEAW1~G#I*o~h3RSS=M1YIG7%$6S2=QN)J^w9DkyX+IMghd z&jh-G96!-F#6%Xo{wiNPo^+A7Y%M4IA>ct@k?&9T3u;{%QlQkOi(Bo>=wyd^$p_ML zwIrZDZ%AOKp2*8>2!agE2YHQRZ&{N!;nNs3kUs+(ExK!>HBszIH)!MQx7nT4I?M(v z!l}?D_&8Cs*^5-@8kJ)whlGoL&w1i|wuGr$ZBSz;*pnPy*$y=OpWx@AtfU18g@Bn4 ztBOlOhSYy$L}E6Qv>yq+1i&>0(gF3%FgD9-PekM`arv|^O-5v&30}oD`|^kFR-^2o zZgG3iVMNIA|A#?o@g$r@jv?x>7jbt9>=zlggAuYIo3AZQNGJQpnM4O=TeU&w8=?9z zmsO*b$l`f`sy0+Uc#(Vcj2`|UfuefZGC}r37jg%(0Y9WK&D>Wy-_ifYSqOPVe9L(X5n zWI1J;FOL_dHe%D643?C1fw;{!@Q!BUd!+T0DD%%hKNUOJ`RE9WGh2NKyu5EJqq#>5$Xoiw!7OwH4u{o&#I-$0%*J1aMKW z40{wP&g?7Ke_>v4OT67q=R8ZCo&+mfiyZE&Yu=ItLN)r~{>h)ne46~aNze(p+apJZFm!gV;w#<+RPoRvb=+`tu-+(i zFiP0n;k>m}t;CP9poBqCtRN}ovqMkDi_jt6kKnsgn5;j*fgI)ug8&7xW2zsk{6jUD zS!l)E#h-^kG>i*jP5`MS=&?(E-}4PRK(`BC#mHoXZl;F6Xx8xVZzgtoJ^zEx8chRZ z=}k+ZR*g(a&EzKc8hoN|^;Pu#-h~Gs0_}1>I^at7tgIu5xs1k&g0hAcC=}F`+T=z+ z42mpN40yyX9adW5lMXoyMm(R zBe>GvyAetOn4a`igWFmv?Jh^er?y=xczse}*tq>wXg_#z{kfz$XaT8y()a02FnNT* ziFnKLuW4i#)*Z|uIWc)89>X%u2SV=|jdq7SZ*vX^{;r=0a-hI;vv#sxz(xnY8aSUw z?gA|Xb*C=b?76fYHdKt_Pd&;M(PI4?3&2)>R9!ec7XRyjcPFJk0h7aFAocFENN8;X**lt%v%w!rblS ze=~ozw;)H@&jX#Bhdw>>XH!-ApJXV3xyY93w@^t)psoi`{Nk!Gio)iCim1VCT&~%a z?fE_}i>lwTUT-O#FmCc5E$uBqw3XaSWYW(~_GMU5cb2Uje~LP;)pjpPyERL^4H-m4 zPwx|QGi8%oW%culXqlCkC6oMh$^A!d0$gEvkZoXy#kSiDqm|8M>Eqm1@qtOMH~;nq zVSaxO7AEYB-hvMxfidwx)+9h%O1F}9llFEY#(ri#ZuP#(>(p@{#WY1Y@n$lp*y2|9 zphiN^AiZ#|bM&C+>LwrJb+!oOVG%kYyS=u2*%JD%(Z*wcf`DBOA_^fV;z!Kkgf?_l zVjs#vs(hvN%=UWn(~S2{rZZsy%&me^)3ooE9a5A_W|J30xna({gj0*7OY(J*!;_3F0pboHQ|0AC*Q9--C&JLi}uMNln zqp2sx#j@el31VX8$b-yGdHo5}oaiJ>>m>jhCU9QlUee#kLa`$S6@$d%WrXlbq2aZK z`3*!Z3-E4$y+G~3lY)=Q@rIVh&Q@(%jgmM+|c;0kdbm+MuL->uv1;Wn16N6 zZDL8VCFh8hKk=kj>k>JR`qt9iK-|n1d>#%%YJmt{)Gkn$**EKCip;_80lO)_k%QZX z{9H@=?M%td`6xo+NjgPg{c5rccN`%A(fwqgj6Zhar&gNcpwaRHECHvdX`=wJq9`UZ zEVX;-3Cx|riSxYjAbWpS0vnp^&>CUbrtc&8JZo_T17=Gh9!4U}W&tx^+S?kH3SWll z^VP}N$M>AF8AE@H*viKN+DsH;X7(Y2y0~~4Ma&T&Cy2J^95EoUP8x&y(PJD7N(N>c z4g!%j+|I=ucqsY>N5AG0I{i=NepAy5Dam)t1SKX>;Jdkm3R_CRP5zB)TPciLDcQ2t z4ZAPsQ1#i0m2VTj@ts@RG|lU@$$yR?`@-begH!CW^?bbBj)3%^4R4&7CsQa_{|;eF zhrp;y=4V^vL=V-QhuAChUF}2h&a|?9lDDa?bta`PMp|49N%u>9w#VRbqMYRBK)w(H zlivFP(jST~%v6hck3A$hhvr|gEp58Aa!bJRV8P*BywHK4qw6PmSaQi&>-g{!L4x7s zU5(N;H>}HgeL6$KOF|6M5XzYbBevFDk)?f#bdPkD4AK|7oDn$m_0ExAt#!^jE7UH& zS^nEvd59kF1#Vxbfr3SCMZ#*!Le2$K@730oUY8j|W<;M93N?BC>YzOnNWzlO5kJqr zsJNRGz}7TiNI>RtwENlQixli1*&O3u=wm^HpxuHm&pW}1TQnBC;pM+U-%Ao2Q2?kw zmBlhUIIjWkA%s*;B9L%k$Eue6sewdazU7~o><-MWb{TNOh$hRFwJG6w~4 z!}wGu*3prK{ROZ+2WI||J`QyqteG88Jp`tJ_faHQI|?5zW|f=L0uGR^b)4OkZfNCj zI=pM=L2V{c)nO`#nC%*U=#N&6Yam=srCG7g>Rm+VK?)PL)Lpy-mC&^kpobnVeJS2w z0eGk+Ds1v}4GaS%L)w~@j@(iHTs=I{(NL^oSi*Jaxg8j^Zl4!}7=aI5!7}fFF3 zWsnZas=9_#-rzmJw4e~w^&vbV(A`=J+Z;%k4$)nv&L~2o9hI_Jx?f`nf_V;%0%$g9gFzc&&0`?cot9Ce^+1|llBw@@_lSQ?_zsC}=W4L>5 z)Bch?aj>*6$PU&DWQJiIX72Tb$nW@zNGOz`_Ry4TtZu%_N|HrUH(WjoUru(Fe zyTYY6LT63K*-#B=PE4zt(V$yBpA~R^Dq-V4_9Ghe0Cqyb{~b9&kL#`8n!@kOADH7= z)Q!MC6ZIpqa^m-TM4u3Het3gqCR1TZNGtV2vkxTg)P=oFkoavsl(QZL@I3*Q9i^7& z#zNr&9v@B7Lif=s;e(dpWkAq4<@j9iONj27c-v5-gNf!l3g$a%290hT3yZgk5N{OR zg>}5-$ou|1$*EbRpi_^;-K|NUer|e=Lxe^ae+Xmy>&ZaJL2oD0dLAzPCS%D!!1T3f z|HN?EzG*0cUEP<^PcSUVy9-e%`c#!4p$!5EB@5xU9&7%PTCSP+ADC=VHLiAnA%9z? z97NAhMG&!%HuQOJd;Vz`C4We4J_GG3J>E;pj*&g$G}Q_mXydb<0on z2y49c?SqFk&mVOMQC7#rNH*3Nlhh-^Bf}!b`@Fz|;jHTqR=-PI!Ep~@0=3ny2(go{PdJj9sb*RrbM zYZK(fp(0^yR~Aoi{Ce>d8$QLvNdgx(tkP<`^5jD25xI|Q)j}^#YZcG`!_-^GHTl2q z!<2%85(=n*q#!v21nH1YrF*0_6A(rZM5P-fCFFCdKzQyTv{r||Q&QaxIsYoaQavq7gYD;484HQ1VG;a{ARY#wv%tB|7uB=E&)(`7o5YR&9g}=4l58{%!B$p+ z#J-Ty8|LA_l>_SP1e19tGh{1#9<6aMdou=J9@3fwTzn{5Jn1bk zAvym2j>12zlLP-Iw(Q`|Pidu>nxpG8Uaq5yVJTw{!~^X z`eZ14a>6h-p{>~7kH7R2Xe4P!uYD_h$N61g+p8B4COoa+4p|Bxam;8dYQOY*Dc97= z^E9|sPIo&tL+iXizAL+X{_Eu3J$AE?)WD%6AxOFUcm{U1`KCsy0CYFJfzr=gzHsLq z$qc16dCyIaXo-Vvk!0~T93(!u|B#Qj8_!RLChi37bme#?0a(OMZeBNBt~hm8uk-DY zB4POu-28#dY(;xRo&v^#F~+cU!XvYupYFgaM!>WRuWLyoNGqkLZq zCbv{xqqt`Jmi+3s`1kx*CUIxEeA}61fU&H@43BCxqU+mw=ROTj9Y^jqRJgFI5s6ib z#VW?rwfGRf=pxRPUS(4)#{V>p?J=}j6}&N_{N_;e6I^H!O*lVQ?Ttxc?FFhIL=NSD zpV%s&*iO{T@YVETm3=}ULWB*LWyyTVy>%PzYNIlzUGAj6r)VRc&kxu&SP=1srEg$C zvj3IMNn?yee#x2omTNUt<({v!qeKYE4)1?XrkYe*7A-oQT;%#XK)Tyu-1&k;?)g}@ zYPta5YjDCgX~n(FgbJ~~mwOU!NXDDEBjzpOw0mLV^{hYxc94DG_#+<6uuvPFZ)1X{ zdJpAaSH1ZPiZfSWa35V9o;uu$hCu$^ z=$jo)@xqI|nDV(WS+a4Rqjy=k(scKQS(oSB{?@>UI&ps19eypZC;M9>8aOn-*&Y0H?pmp^6|T(?(1G4GmcaCSG2G-k)>fQ;&GCn3SsD`g z6)hs%u!rYVLe zLwrjoARZ)}(PMy;>|MtgyLx^;G(Wo%!Cg@( zQ8ElmiX_M61kdiun=Ez%^^mS_h6a-^%#2qQCsiPO;?a)p^w&ZEUf&22Elt(zP+X$! zZ9!D#?CIFMAc2zBba5X+15;B$icF0f)#w^K$56c%OYK(8@`W{2PH~>ytN88Q=IC#b zPkM8oSWcOkc&Ug8il4KXXG*N;Z(e4pZVpIe0dtWwNa+=%$Z}Lc1`3=$a;?FoGr#Zr zEX0K28k^%1n4SAzuK$_Lb(DcBbMoEMhW)dL5F@MG8GE%9(WOJsQPPXQ*YW%V>BF~m zwa-6$^)+dpUE$N!a`b<#OcP+AE{!Z>lI}|@Q{P>N4~XJxIe!%QN{Uz7;XWtx+&2{3 z?l#6I6o!;eQt@#I?^mJ+NHY@!CpA3``nf;Fb=uVISzyvhfnKk+h^f^6ZA2&$EpgQ> z@dY8l4B)`?6NNO5ZU(@(F-GjHpLt+^->|x=sra$h`}8o)>fZrrvRJWNcZPFcaO2}% z)`)AG&M7d*fO?PMscU+i)S38rG{+5Ylcxj^L742WsCmETi+>fb*!!Ahn^J9^IW#Nk z*KJdMu{UxulD~9`=GQw;+-1(3v;-dV>f2arW~WTtlyEvQTu+uP2R4h_BPmT?gLxGX z(Ts>z4W6*Sk{Gjr`)eYsb|yIjleMu<>?5OjcJIHfY-z{>A+J}$2PPw3$#>y-=gkdA zlpC7TOqIKiydBq!t|n@qJt=*Z=BYzLTqSAYZjlq~ge#bn;V6Cip?_A*g8UhK)vO94 zNM_$n#56;{`$w9KA`+i8ttu$*idU!fE!}jUVW~1D^c96mW=agBgidwU6B`K~-w;jW z=ofcUNKM@ruN2$aP>P6i{CkYOo>4?3__$b&fj1&4yS2~m^Km2?-Fr+S6_2MLO7JeQ6m8q zf~2Eo1^Xd92>1dM9tLB3C%^W_gWp^^J7|lyE^;+Zh{~_}-*^>_IPCR`S7)$08 zJ6U*d39xr1JB~x^;l;4z=2qhoqx+u1i}^anFZMD*sr}QgrswvGl`2YmKm_bSN1BIv z!9Wwj#w)Z$NfTr=^=4H3a_NTW5lj9?=r_JE3vYt>sFhMi zm65YY({Xi&xuda=Gq|Hhw?DSm40=x`jZBz&j1?KwNOEjdUKqtaJZd0%4spF|Q8mGSf ztKv=Sgr{GD0KuU|T(bwg3Qe7Q?OiDy6`?jTD$iOLxGtE7UQ&2M{)_;xg{9FxJaBXJ z6uew4oyYgwW%E@)K{e^~GkbLW$FI3td@+(14>my`N|stTBJ|~DAhpUbq-+;F&;e26 z$n~%(bRNx$kzA_3R;(%7ogC$}5S`K9%|N1w4%QfDX_#qII;;y$nIg^<%Y7Tv>@M7| zY-k@cc3f1szB7KXG2W9E25|XNJikcY+bqXgyhE8i2TxIK;`=DBlo~X`bV>0&s~!OJ z=aSlcNIv|B{-dWI-BNtTR!*L9_~6cZYXuCs^j-)%!kqG-1tBBnCHNr&zr@x50MDE` ztq~c~S3b3QO(fMSO!e&@y=jQVChasjM*B?PgtSo#Nw`* zVSS$lWc#sI^uYaqnB)bTp$=4OvnzBKMEH1)Ug@{J0|NrbemEBfh<-iAY3MCD(<9wy zIy>i;@5feGxV1)=cTVtNmYD=l7j)4a(psOWLOsMkV8P67f*P@bRo4Tb=NkRDA2@-5 z6h3VfUPw$))SXP99Nl;X8Lpz3&yt(jhea?2CZ#-$)PVFp^v~z5B2htZADaO}4WP(z z*L@P#_L%h~hHLCp|QjdY%o6l8yuQ` z+}TO96esD*TGIur(-l9@;iz!WuK4f4s*%+Tnp!_{)qTGSHFV8ivnLMX-w@(FTg;ga zvfBoG8G#t{WG%P+P42h_*qESKox#MybWzd^s6>5<7 zk@58=G2l0?3O42R&&?PkB8iv_7x0%Yz6*;&z7(N;)A4~U;LGS9{va(T-cX}}#~od; z-_C+UBu`L(ucQR>+jP=pzLRiAjoNv?d57cDNB!du{`P^2B!d#?oK4i`dqf+`UwaL# z-vjGn9#i^i#B#aZ#XzBr06z^;n8cc6!txy??;G`>Fw6qpaqjEv%rX@Gr_lnR`#|6u zyY_$0NXL$BXzG#HT#e7S29H@XJ^X36kL1OhvcI2};7H&FP2J9j9NZ|n`b#BG?-c3P zwp8{Xx32i1AK`xa+vGt_;WFzPaB2Hx%ZFEfMF}X*0HS8O`0R(0ma5 zmi#o4m9K>KI0u%8o9~NmN~H_Ze`@ec-`shzGf=zW2ce8Q3H-GO{oKaS!j2_j_KN@=d4N7YFe8ZPiDz<3+l7DZ{yAeUX_;|Q zcLp!RU}0j{*d?{P4tk*^ zZIOvyNf2Z&<%e90!0A*TaHDA3=d%(D84EeMpjROgJ|g-snm)6!n%q#e=K_!-y*?;P z&V5OR4-RtNNu>w`w&xz<=;D%`CauKVtLQw1Rp(X0sa{~6$C!g#@~2&MoedlHs@gr#i% z?jGnLvV0)(p`pGZQmk1RrWkQ4GQ*ixL#|EqNkEOD!^*>B<}ugu4c1jGWplqw!E@Oe zy6?J191Lq?y*lIZeTlJt_IZui(1wh$n9bahs$cx_N&QNVbU<6ILTZSV0s*4vxCGgI zb72?14c0pU4iDb>%^Wb!$HZ$+Bv2=q09x>i*>pRKCyt`TOJH=2OeV2)P|aJP&3A=p zP@H{C{_&7cG@g~s=GBMa?Q<&$dvWQLFOf*@zg)`=AKF???OLx;%gUkN;$^WOW*E4P zE9O+IPV%*N-3tN}?i{7nk8MdhF{_K~9|m*Ee;jYmPWGJUt!$E!a0|?^3_U8ut4`cKdsBL1d*@81tkXEDu|>Mv%$7K}vCfWdb7 zc2;Xb#;PW?c>B@P*5;ZUfmWl#!>`=haiXyEzW6nO!PyULh4qatuqw&<_aR7-|DOh> zBQT*5ci<1yi{f>gt!IZ=5_403`=UK5l-d_fsR_cz;yM;x~L@p=1N zVZQG7-ar2G!X-<_<$hkJajow`708S+DI8+B$t<2v@Ear`L6;|E(Em=h*jq!%Az!?i zp}-%MUqFrPRcOR?=^t(g^$!>QAlt{=l3yz4F3w~3zNN>}27Lx@yXrnOKO@J;W8>lf z1cVyq0_Eug>0=5ZMehMir@Yu|fzrE}k)7ea$-;QIoza%^xxd-LObac>8Samh6jABk zSI+E^XJq|_!jZED^`Hsg!g?6frIYQ6PSS%$5s0sRs$RwW^{PHVrXh8hC`3*S#l?R; z%z|dZ1n%~U;1=3?%VmXxyIdL~S|vk1{7NEy6T-^$L7RX9fu%)%3<@5#Y;YHRjpmNs zSaf*ti++tLSYrHztx~*~(jF-vQqTctveG|-?Mawl1C zwoW#OjO3KL!%f_E6KS_JR;jP4iPz?EwjoOeROo>VqLWUgGVS#GAItUF3xx~3*em$R$d}NdZlI;NQ``-7`wiC)w*3Z@;>F#_$Rm=KIX; zUJWVQ%?al9X*2ZVAN>#4o-6`Cu#@-r?1>J*4Y@!jN8#RW+=7F9>&9N6PB9vio@$uy zK?;vjgrlhcgK)D}^4+Ty$~QjB^S7_)Bn4LHkJCg$to4)A9U9hsY@mp(wbZ2dUsY@p zYaB^ezC3KFTO;Y77~V^wvx?u{6V?cIIX_QdkO<#4H{KK1jRDO+@5QBZwnB7niW3k{ z7n;vU3^wK3+f?mSr6P(cC%-{)pF>bGI6AXZXH6Np_yfVK`~Z3-Gwk8yFvZNS25tsd z?J^}GSLC@3X1;#O|=AX-~K-3i2Vii4JYsNG-1_rm_a4mY@MORcHs9fhwFX=^xS!g4lgDkS|$-a)p;j| zOW2WkwSL!INdRX$)}!5jd2?(4cn^0&iphv80txwpiJ&5Pu+01LVJFz=Zw8rgxH0dJFf|jI+6W2GTqY^al4~F^3@~XsdU#K&wb-+ScO+Ua?`juC66>x@>lSCt+jVC zv1r%#3c8M{RX+FfXdd25M@DY`KgR8dn_NA~Ircb)iAaxNg}__M&w3I~DQ<>vCA=Tk>pStnjxBsS-Z4_BBF zEpOb`(rhxng*e8*MWNS?=WnPkU({(6iO21?;_7MF1bHKzS9X(51$$lBMq)ukPALK<7TeX%P`;yv8+|NcB=QlDejFzvU8<-M;a@q-jTww==T|$pb1*7Q*A1P}1pAISr zl8qs1(%5=8T|B~1#=UaB@#)TaP{0Zd*4E%SjO4qYJMJ%~G35xv_sCBE{ay@FMJQg8*|I|+cnEsM?V?7f0Qf9FRFE$ zKA(5-1R&XVGJIT>`m`cycoIa zgdDW*xjO{nm*w}lrJ{sZ}t0LG3bZ;=d>o#~d?QM^wElapV3*Lfu*a~hd#gIN4(D_V8udf|#NA1>xIW|)@ypJE z+~*@rfP5&+OB=eSuXkq0BWj>#Cn4u7X-%ha5R(N?QUHqHdjvl`!(0pgrc787THBW# ztH%mt+T`_SAK&kOsYy2A_tCJCQ(eyU+64wVFXe>~}}>A$8M zw}Sj>LFt(}aq?G1XX$Y(%1uU1hv~8minohWM5-u5>S+g_S8HxMp&>;952>k0k?5Gmvb7H1r_n3qQ zHdS*erpj6MK0Yu=a3~!umNN9*OrSRs+NnSRr$hEb&d!pHeL z)AQYf8ao6e%`pwN2oO(SnTLVD{Nv*O+eLMv-Rbh!IeFKDN_GnaS4dli?`%Q)j@_^} z;x19bHr3Snu1fuZdMX`3wD|O!>q--b{Gyci_;hb-Ra#R5?PUs+l~xAGz&1&%Gv}qO z|Eu$7cEt)$y6_3E8acZ+0+?%UF3r+E1#*)^{eT~8Sc4X#lP}y_KRN|U?OnY;Oc^S{ z%^%}CGWC(1$N1 z5{6|4HR5pyN8gLpgfNsnz@i<23YDmA+|#qCgGc9;yt=G>sug}2>@UX;1@(V{N|`H6 zuG8pl!QaoRvhRcY-lnuj?J`Df9=?0Dr?S}hI4ir0_XbHuUd+nzJM!`P zgOcOy-}372@m?P@m~X2)Dv`1c9L7GSM{LK}W_MR}%jS#k4Z-wcHPsShLx*Y{I*Z#SeDV4FixIie}YxU}_vCOA_UJ5?JZH+MI+`X_09_J!$MdDS!zFjcyp zF%+XS&a9WvE4txaJ?gb?jM8QE)KL-^N^yreY_RMXh1&HQQCCHSv|U@Zlw)u6AG!?J zxwIi$MqV-&NpXCWLpTTO+$~;C`Q9qe{lU;xhr=}NfSL=ak1wJd*5>(Ud0!~w8P9*d zqAY<2^Qr_pe$3o)RQ(~3$`Mv*-3AqPjB5Sz4`QR5JLg#72~le%WT+R%A8#C4 z!^A@F{vA&x$)7ZtjUJaYP$unLbxkE<#qjEk^N#Tkl;{z*(|K*}LA_L=7*6)^ke-{u zLpb>%Rc#C+;d$rZKQ_QK??ggm{;(?%v7Y9qQGfrC>|_(VH8`67k4%!A0roSyAr;l=q=SqWxK`gs)$D zM1PCPIRfhhoDI-JMi(c99xL-V{~x$^tdV{0_J2l!=D8-DHD^3Ue%C=vt4LYjrDBKX zuq9%4o^qAI!GC!4Tc+*6lXQw!?@o5!<+GJam=Oh*lWT&Y$b@tDXx|8M-&2`Y4IZ91 z%#DBY8)}G;gOKFy4ca2te06@5Tx6JlbWu*(fGly|lBV-Bls(>PV zl$yP#x5tG_jFhZTHR7z!ooDqdgq{}o;kG$9Uf7SKqwu@XbaA8DkG?&5aeEwc-mQ8Kg5C{$hwU;B@4ouKOM{Z?2x;4%y8}G*F$5ff zyA)6%g?9`sI*8dGb%r-AZ!tZF`&LF+mS6p0vsY$7HoMkLLL0sU=3PCs>gj73J{Pw{{o^$X?OW=h!#3$yePr%8=j z;>;gRKg1$(AG{NW_nZ3|m^}B`G5PLt*HTXC*;nsgW*$oqer9%INw33@N~X^8!E(V@ zKFl%(evfh`w>~n!h2?^|ymy?Hs=hK+)K0W9TL z?#u;pehg68%uIg3xT90Sn&DpYjgBW4sSDd!XMUUY$c znSu44bY*p=%Z_bSm=r^K_eKck6kSb=-Pj+P%Kqtw-K7EK+ zYsfr#A=Q1xx{rx=v^%DRB=UapI?F8AOxP-NH7v@D;i~9}UcS1|jpXOw?BiJCS~j|4 zHk`l(y*pT*wtSiMU?-Magrb1Qj4U}`1DEwi{MXw+qL)4F6;b*Z|A8{E zD}lGytWm*?NA*sv=U}v=)7{3yiyR^~U~VHmyLpOZ(eW+Y{+FM5Khcl3cCrJzX_)Pp zRu$Ww@9~tLf!W{!*=^nR&p*x*cQys$^t&LhTI6|kAOE1?UCyhMm*DZ(Rm%M_n81eEx+w`-3 zgl=3l{Yvs9o4D4)wAatRiuKQdf9mMZu}QlL&9T7pJC7EB)=z^2$AYR`25-Eaf`Ef6Ikl-7=lCMfL>}R#ofpuZn zbISNol=BMH#Rdnhee!WY_a#^>{^_50m{OsIIh2W~G zqe_Ul9T&h}z~;9-(nss3hpMquvP!o1Le~i!L`0%i) zR)(v;^O@X9x>OSv^uA~Kp8-WIm%aQz#M^`r=ywm2*afV{R}@ zCYE*GA_MTI z!n*bL=OrafOs}Fh5biCjkwX8=a5<9g9^aD;fLA)&jD`$jLVns{evQC5sw;Ue-Xsgm zTP6BAV`0MG()dKXSwy6J(F?2XN&YxY1js(wg z_SGf!ZdJ-;Ro}fy2fQqh3PNxORH#_rIbfYMW~`G&dDodW8FDH|z)FrAzpWBSkC4mk z<|APmErMfHb04iCWFfupyyX~-py^Z4TO;}1>t8|~G)k9Yx-Bq~m)P5N{on1f_Vies zhC5U)7guOIL?V&t$|=tIc8Dgo`A$I3;Q>ni&Hae~B3@<%GkA!fC?2xDrZBJMZgxWc z%q1PFW(6r&9_>Gxv{J!qhG74zyA%$!wzBK{#)M}X5ukJ~KA@0Nx$}i1lDnhu`U?Jl zbRe4eM9rH2nSXZb;;fxt+*#S7*gE!+zCK*5^nm=rYrc2kf5|JI1Ct;d^M0+8bfn#$ zl^$w3PUBf0{hBLe>gaBC{_IAh{WD|R5{UMV@qf`JmTydoXQ=@{|E-t;fnp=@k1g_!0`OLBD z0CeLYw_=HIo}_X)T$#@E-*A|K!k#vl~rG$d4x8eN-4W1FnYTVu3>- z`u2OfmSTL1UEHnBvDd*3{-v5kR#67(4dq&Pq)*43%DI91(sMtk$n8#E~ ztjJM4>aYm@FGjDG^1mo@={?zq#5o@Z+pAx`nCK-}vmwCyvm;hM;j1-28_xK5IGO{U zzNlPFiKpWPMD9zf3}XG4T5a`e`L1#gKyjNhD_%}xz=~OEv8DzO)TIzLT&|4qK}8uX z&MKXsLNnEN?j{@kOkl5j1O8_%%E(@mRE_3x*xmX$Om7lS-(CNbFs7&45y`|JX`RR^ zgySo;Y$HeHL?c=R^K0b_r!>yW{UemvyIvXjQJ||J<#1RKk~n9Uh;G+M);_tUXm7Px|Oty zVocT%?&ystCjT93M;_A$&-UzSU~_f6Z{@>5U2pnHU2l-&$e^Z#v$FMF={fec32$v} zx@@x*EYssH6ZtjFts`ugW9FUc^R7t}q)>(9-=wp%>Va2D7XrGjq}D69>7%TXqLpmt zARkEFNTyPG7AH*yI*fPmyboE1qYgbQsHPZzgiM(Oqu`qrk>>r!W8Ok zGI0Yg=3Ckv*ckkvio|vusO*Z$g)F##_!BiTuTCT^8X|7AH!XYi$M40?_WLt~FVP4Y zqfp`#cMw3%%>bQwYdE3bR(vhKWpz6a-gV3W!TW>N@5E`~Z@6Sk!b{gd+xfw|yfaZ~ zPH=rQXM+oFo5|-3-x`DA_8ZjUzHa%7XYr2I;Y%z$9ENoNlU8P6`k+Wq>$3PI`H5X~ z5yc%}aNczxmdSx-sY-FRBf}cs-*FBiaC1WjzY+}%{pDZLrB_V90@N47qir-QqN~-t zW2DJY0l44la;~o^4W79S6`S`p&EURjFbxziqIet;>#K25D3>y7CLj5J>&G0xb}L5l z$i(OMMWv!ky~hw`)klr$bf@@*Xq{vms<`Bxc1d>0bLBW4!FW`@r1Bs&RIL;SeWj$4 zu2MZs(^8$v4d_ig1v6IPMYan!z#2_3lb6aHJ_03su&?Ogy-kifG^FJ4z@NhzIQt;o zmij+v4*T9QMUM8p+zV=`K;I?eCt@xSH!15UCdD}qMNi*Lbi`C9Za4hKp$UG5;l{#_ zbwxtjPuWZzMDE~i%<1t{aROJP%W;X|_IQ{-JfgA6qBS#@zCqz2im7CeHgv_1r1sas z?Ni0`$g$GD*z!yPe&7$P-btZigSm)ucwUsGI;*$~MAIJuu>0o9TKh4?bZ7G71Sv`BGk3%`4+#U~pGnpB>IC~jvMDo9a4eK*pcj{bR z+*n`lk9V1p{;vE(JSBk3E+!B9B<)KKs$*mWq%EK9rEe9@tmH5db#_7+x1C#k*Q$8e z^l{75aPqkzR%VHFfreJFF*oe-c^M=4qhId#7n%-_e3Jz-35BqUO1aqWTr69inF6KT zrZJ?0Pm#tSx!{pg@cBmGZLdrDW`5f>t{kR55l^bz)(d`Bt1KCZa&&5_&4>{C35ZsB z9!1|%A*?@Na(B>^zkrF9NBEhD(`~NSSE3`ZA85Mr^nEYky|APIi~l|l5HM98YlgE; zCS*+Sykij--qS%y7NC#GV?9-p%-&ah`XJpmw8+GbP3=0wtpk(7&h8aEL*IwWj|eer z;%5glJUq92n^)-+3Fl4pn|A$`O0R=3(s{oDQa*RbcE_&$*q6BUTDqJYv;*nM?_Pe2 z;y|{o>Bs^v1uZglux*d>@jUPLeD~JCERhGm353sG!*I5Zgr7Gmn?>ABn&8e+(|gEG zY2%1SY42uIX=7#xwUq05=f>0Sdgb&q88qXI&^nO}tAc#XyuQRb(!$P31 z@2v`^m%K~ve$-KvpIverq38J{#piaKBx&5+|2C3ysLfre(9xC=7Lqb_pciDx}fCYQOO@3WDhVB zlyA4x4=H?B`%6R()0}G^iV6zp1us!3y<4w1Zj*@)eQ|auMl^n+iS4qQ{nh-Sdtn^F z&KCoas60@PQ%cFK7P;*jWf^#B0kPhv9$PH3g507GmD^VOC6>VaqaYwszj+!g_Qvf0 z{IjPIu?jMT`ss1o=Ybd)wp&oQ=2%;DcO&ja_28`=zG_KfQNp%pe#L0u;H?vM@b&@u zL*04FWi6I_=h`eXuwr|LYiVnG@b)^^xmCQ(wPR$krQnvgBdiZxb$j_!K+;x^Yj>Dt zR>^i+uGO9~#;KAuvOMwUcc^{HT+$C!xWTkU>g2G zv63LSeJ9+uNKqy4JLb4C6*=H0)MckGkHrGmex<2-*L%GG$Kou8f3h_oV})G^2-Wg) zubJ?alL=^t_3qo;OuE|LvcWLF%JH9OMeh9HLkl7L?V>HvC9`@ve*xrhj>=r=uO`-< zzhgY*sh{*Qh=(XNgJUQB6x|}Bi#!c; z)kri$fVhnfcxQKG3w@9=pKb!j;}=&LJ@u11{(Et8fLtlG@kT8|VQ9?C^`E~=GA4&X z5*scek6 zy|+X1ZjVb+csHs7sbA1>#^F4Okt!t1`VAV3HMKWL8k>U5-UA=_XnN_Ni32w!@gBKo z1vRe;;m1xyZYhQi-TM4q2flWhCv{S@-F(O4q#~C%@*Y$#Jd+s33`cONhx4GH8-q$! zyj@Hsn17Gvm&{yzFS{Ppkb^YI-D~5U$?~inOHwJXX-JiXwky8pM$`d*>SI!0xvV~+ zSi~vhTk_L=OAqr62Ef&vCqNU1f~iEksvQ{rE(!hfpt4f??|Q^-b>4;j13P}%pgRId z_up5efOIM;(!B#yG5+;3>|_(l>s@OCh0wi&ZOE^y6avKn0>#xAcux_t48?a38z+iE z>)?ms&2V~3!XwmAdTR&-g-+2x&6nvgDWKM>LkR=+EZz+NMm-p?!sx!|?pFCijL4we(>u>3!lN zm#mrpWAwV9duRk~Iou2k4QxUW_4w~C{!)M#Hov@OInk}O)n017##-v+hR@7d%gh@)#^-+qI0ZjV_#i3!Oir06XLTYXDF3Z5 zYx2Q|IiWvnI6P=T7ESX_i;|^ak)-g*nX>qWU1Wx`OzTl!fNJw81}zk~^sN_dHr*6*sB9y9vcjn-uLtGtl}gwot7Kg@ zjfcGAfV%*{eJ7B4qW{;TQdAp!<4M`MvVVx2oZed&-6@CuxVIuN)yhbOytKG1Bm0wc zzOzi~|Kb7&Vr7WQpr-|4OkLJ~fXbH-!*4A(M1eO4YJq$zsrSduD+-n~ecw4BcL@jV z9Sq)ZedhnS9EQLJimcz2+@mQ+kHClSog2u9;dy7Uu4Um7DAUpfcjI28Sm@@eQW z0a81867Zn=)~aDz*wfT8M<*N@SnFJXHL<675d5+Hy1ifFMBLADm+<$!tat@t+C0|d z975u&oSufC!HTwD0nWZ?@=$uu`_4#dKhQ;)CpGX%d^<-qxzM49WP}$&@fY5KpD#>H zA0pRUdK?Pgq6_`g`4Wb1ylZ#fXh(yk+vG%>uV@abq(FQ&rsCph8Vr8RUE$HF`^UB@ zkvCANp?7=p_q_vWoN!P)){@{n;F1sM^nb&r*4SRTh`QIDKa@1lTXv3@gu&hYYspJ# zp=q`8aKX4OV95XRM+Er&(kfq7n{u&^?svcO%Y`1dy3b(c@hU3(lWQI{#|7irbc#k2 zM*aHf=d??vEDMyk+n)Glc;9S!j>YAL()tnPbyXzV7wl!(gOT#0nwSiIh*l!$ ze`<`Fr8Guxwoy4*Avv8@?r{|`Uxn-Pg!w+|oK>3frM!;fdDb8wq|Nj0sQncX^zAox zqqODCs;)14+I}fBZLpES)uDOfLk#=KuCv>EN$M5DCY|QDcz>uRLg$Mjgt2?@9_A>>_H&{zS=!N}>oQ zmh0UM>_EQVK1Z8_O`b$zI1KR+8tXhmJTEY|2!_|m&e^WW3Sdrr+|x=X#&A=Q_NMVJRg}b-0gx>go{(T;MLg7{ zcYU)se`$M!s(ER(@nBa3Ug_7NUgC@kX@1a~i@S^M(+N1Fur#nLCfBjX^N}~R3SDHglG%A()6y!t65f* z<<)~J9z9jM2KdL)xQ~MuBK;5Vviu}{lWI~~H3c~-ZOcsj3d!6JG z*w0C#;&=Ht64tuQvVmuJ8{1W#8)6pxIqLdpFjckU28GHK{@BdZ70}nMzP!z!!@B!* z^`NG`am+r~sD#w0gi7gyyCHX?SK{I7D5@ag!mF-uj^p{c|xV8C#TRO zTiRf}H@{1@r07PAjkNCxNrDAUGLiIkE7$GgZeKva^aTB~dHbb|bO?l3Ua>ycHVUBQ zB_=OX{E=Vm&Vlb+O?$dDs4{NUH=o6Gu`|c7+aeE!I+BWxUnMF*Smrw*S(|8_Gv@N~ z9l}mCoZuqtHeaII>VlWpP3`RLGRD{|EtMS0ofKpXRMBOm?)H!}P=GYJ(~B&(Xq1)C z6v3KF9jj>x2o68qBAwssQlo+ah?hEXN6EQD`Ef=)%5#tT#Mh$BWs(HuDVvAEVlDfI zL8TT~x?qRNrJe@Bwd8-6%z_UEH{YDh%HHfMf3H<@eq-A=|72ZGj=X|r4_i1&suP=! z4Xl5L09PT*y~;wlH#VFRsrhxew4Fe+IbYsX!4rlJOh)A+B<%Rj+Wqv)}DK^}`9;tQxyVYI%wndKHvhP2H8jHU4wc zaoek^VnNxLDa7vM7=NTc=|fZH=n?+IT>7Tk*WY`U(3;?~t+-SZgXp=pJDnKOH9E*+ z)bOn`n(n9b164+vRlO+&huO>`GrUi}!lih0NqxckeS0rztmOW#go;S;@>(u;}+8BYI77GtSh^C;8*ZQcnb!B5+MIN8$9 zn$Unv#TLuxa?kR^N9R;eX3Vcy1dJlMo9|~oWXKNZ`d~D#oskuHvqrnY+JQo-35vDZ zuVxuA3;oSjv%Nv&acDt0?NBEZE2U9~?{(W#j6W3x+%{UA3|Zh$NhX|8bQL5DOA;ih z$FZez1`RL-r{{Q57(P!u_CxtSP6l+7ROi^IM_GaY(X4m#xe*aw)b?Miy4x8?w#}Ie=2?uc` zu^*VR#@Kh4G$~YOauLU`Ec!h8dPg=cb8$I$kN%VKA7bN6j+m5_*yR%oW#Sn{dl=7P zY@m(6JRQfGrt&$8KDj$)Z#oo`8o|Wv_%_J1X1b5x$$>cS?3w6pYxD)^OXTNbjE;t= zMj=L|t;*+?W0}wTkLSiEiwkwTQy&Cu!tnP#;x|Lv)5hr~7~SP4uv8wS17j?Ac@RmUdLE6Kh9-e!ffpxtXu7XCwcCf9XJr-#jx{ z(t+a*8)911k|k9oq5LI^*x#hGgGAvD%~m+k3=M~*gB$T^XHN$?*35g0L-7JgH!pOh}(yP=p>t0@K}ZM3uIQJl?<<2?CE8vCkD|U zzEs;}`*m@?ZY1{tjzbiURk^=@!spPI`fKBTf9hUY9I+d*RlKxVRdwUYk%htJ+nomC z-#arDw3W}KQuX$SUTcZ^Gr4UMKrRqpxd*Al&rF}%ES`o86KUeV29!*Xn-NNt;hzcw6q4glC>>>(*hmhgUecuy;B~)Eswh2pDC*!Gj3t%ao}VI8qRn-kF{g$r?84;>73?tR|McWt2P~`I|Lr_lUqFjUkB`; zP&w1|`8hQ!==g@8c+G2-`}VHBubs^FROYU(TUYIj`I7FKb9MgqvFv1zjzuHWO-}dc zS4@7^ODxw!nr%R3;TFax@4o)y{*=_NRUlyXum;Itq@1v_^kJ8+PWzrpE{JDvptkNk zPbm4)uEOAh=YE2gP?U*v7_6L|?u)KoD{M8b>%P&37-R*QVrL z-vOEi-Z{Op;09FW>wdr&NemV?WI|sMwOjWHf?|^T#&f9@S)asdh6DhLZ+{4a3$8fdCP0oZOY`2 z3+e0f{cu`;$IYbFS3zyn0hNwV&exisjaH_@xi^t)G^Pk*V;$Pc9&s6*W^?tcDAuSZ(Mu*`)9HFYq@D_-pP=2OjEfV^v?oqL(AhO zT>JaAq!fBxPZ41tk}*rF_lqmO;6P~7R7&2vv|#z6yQB}C1h4DtI9|l+T(}t9_Kmj= z!zu#0CXtB?>dy`w8~I>*z#bR{xRn^p0Mv5|6_x;u)I!2lqE7Vz(KfSo2C2wFiDleIDE2eyXM85YyoKYK~m$q&nFp}`1RT5{>oe8pR8ZU z8Qg!REWXdPUsO=LV9)FLwr@B4+PdNV&iis`a~)c)jE8;Wd6nzqFUMv_2DtN<8JUs} z>w$-qO(p&D5D6_10P~J>D)|dip(b=~(;z?dCXk0g4*ZEcxhvB)Zac9{{TuMl;bM2H z-kgH*_LqZvjue6=joddbcT}E&vwz%EQD{8*aqrAyp!99$!UJ=%vkabKQW{fh-ylEG0dr_5K!G7s0m@YWXLX>C`D(|K5u(6JGzMi}(t$P#kgtSiKwqVG`} z&{hK#Rm?Vx8M`&0g54wfx@^C`cAEacHTBgztT2s+*G2#QDYi~LB48e;Ba?hWDy_Lg zQKdY0qAAbYk9~f>#B8g4te&xt+T_Wh3iN=^d@lrj%Q|O%AXNS`%<^dp-G(uox#_l)sZa9F-h_87G&2i|-wW%0ISv%YMX z1MzCJx8pGD^|JxA9=1sg&R1{93<`>wZe1U%5Iz!|)n?axa(-x60P1h}V)s3+rjPTa z?}sP-A8*Y6q$}TYDOI&i+mST5mubfq{uy31CDCGw*abl3=;w# zM-vY#B~kUCzds+rRRL|r0>2YB<`xmP6nZpNX&EWy&d;j-iii>qr$;l@IGQID>vMl& zg<2ZR`>O*jCQj@ZST{|e@MmzxS(ED{>!&}N;LKjQ`6qsyK%S8ZM+O^^|6q5 z{kY>mbB>UkZ7P3Y^&I}|WB)d3%B3)04KdW&9e%=HX5M==IyuLHc|fYSfA9WY_#f|0 zpnpc1ToKYa>tM&4a`_?9t*14N=I6$lC%H39D;^w8LiSG}aX@|ITE5$TH$3x=aPU{Q z`q8Gy!*zwCv0vj=mXX3ugYxG&Na??}-0E=QC>*Z(dVB2D>$Q8ccRzLPE8bDx zS1jElk~#nfw7whLb;w!JTXgkrdR{K9W_mERF*7z4Lm{d5^CX_z;wTXEE}&MJ>tA9p z@r~OScr9n`Gb;Ld`JC;^Q*OQ`6UY+y;^PO10YD|yyr_%kf#ho@^?{fbKgsUj9dXpp z;?Aiqc&2`F(T#zY3Fj=-CU3+~3=N^!B2us&E;To^oV&T`fo}DAaa!=#&DPZX5@$HT%u%>7PTF0E$oLto3a6k~)O|wB$YXyf_B%WqsGdLm|sTxx-V% z7F?o5J+ITw_CvS)5Ted)T{TlvUs5puT9$i6IDp1{?%YHy6jkA~F8OH(t|95HKwC+$ zIf}~7?(c~1I+Bxxy9-}cZ8x*s77rgL%CZdyzK!`fDN@^L;v zbw%!Alp3gQYuTlj{~Yu%IB1s|&2~z;sCqVRbwmZ}7N^-;KM^2})*68PX*<%sd|)C* z+$%QV>Sj}8YMf`+hT>I{4iI>fnhV@i!2WqskNAFA`_|__vr%lI^R9+D}K zNB!X9s+?`-Oc&GG6Win}+qNX)urFa^dGcxNAD2YY%lFf<7v`(5kLO>c?0)KYl7?G6 z^8Bm1bdLeo9wzL%dol?GMNb_|-M6%kXBZw4d4B8($1`;N5vHZE@tEorO}4YCIOI5Y z0*r+KpmeyE1U^=hFF2IpiEVJRPtfZ`buN2YKnrE!rAyLJcSvcGs>3yLM!o%aH#&BaGZ@H#OKj*E z^Y1DfS;|WTvXD#f5v;YAu9a5uwt!zYHu+u5-~tf&kD!DQ6dH)@g8t!`?JV%zudj92 zaayIr7jZWG5xYgjy(xEElEB>MFb5@e%;HboPudMJ^+}ctSHI?6;dmF{+ zgb91R-dKZgNmNK6?c#EUP@L%}E)(J3$|_%Q#kpIx8jqIM-Cc#c#i=Kd;|ZPEmPu&{ zUuM8D;!$3P>UQ-xVMg;$IbjDGW1 zXIR2Zalr$o@g*ULej2=%nnv^2GB{gg)(o$9GUE83ZF$)=qo1_Qy`{Yf1Ay{Z5k5{y zBt9hLON5%J%NnaGZB8lOFPQRM=Pgz*EiMvE{~GQK3~>R-K$?&*&==Zr^cA{P5;xQ& z=8Rr1z7|gFU|-qE%eAD-&!@MLH@_UP8&Y(}*Ven4DHFC|f&HnH^(B*P-SXsmwH@>u zXA``K8-vQYY%yXouB$QQWPM@Zgm^oL_uyH{S-AOS%YC=OSLvCF?&}kfolv-8ZSuY4oUtRz zby5e6HkMh_Z?p5xuNnVxFpLiDygYx+L*)YVCpuzO@vp*x zu7{fnDo?&E!L_{8_aQLZ^{MMsuKg~weZD_#yWtQyjB7jSP#);kgf0(is;hRRpAPpv z+s8sy`eiI;SqEpKAn_~?mA|;GcTh%G>8)alS3~jt&F5a!AEUHP@5%!m%WJ#n_t_kj`yOAoH^03XV+^h2bo*L17aLRNncp-;+z)(z8yuGK9@FQ%U|Mnk z;Ll3~)XJGDV~utAZcsh8?W?-tOA8%SSD00$P8dbD?w>%dV2&pfm4RVh%W{q?l5$L; zR!mVNm0$!O+CMO)^4>XmdU*fE1Cy~S!tk!iUT(G&you+|w`t}kCDP=gV~~mkcS4NQ znC`59jZj~?Z4a%>7Hx0;Xavi+$X}0)qMr~+14?1GF+)8J!zD>rDu7I!_N9s&&OOVh z>=6e}CPI>6$U{>x8cCg=1-BSsF6p4PD?-J%D2soH-OUWAXy+ECw>W#(1wk(wR>7E1(QtU{Vzc<`B7< zDDR{A)gVtk!eLu!63H9b>5wSy>Rtt^eLhwlrpZL&fQ4rRMd4Y-LSRWJT*nVQ+(7q2 zy7SHL)mJ?d%uyLDS%M?m;n2{4QfiZ3EAF`=&f=p~IZy?7Q_LoY5H{%EZ?EAt?% zPa0Wk{dRACy?Uh`7-x;Hfrjxdl);sbYSal)@C0t#Su96S1v;M$D4%e!QjYMK z&4{a$UX&cQYMxrwWCrDEjW@Rc$>Zmf!6sC_MR7BHzDNm_as8PY!(-MgCI{-u&d=Qy zx{rxWAQ3cx`20FB*$SP{JfJqpih`W|ge4gRJ7jVQ1R5)(+A3((7j>oJIG@#h^RSZigbN9; z^dtp&LY&|Kw7|Xo5Co#clRJZ!-z-X&cdiF%jCt|*CA)vhuIu;XR>d@tp8$(ixITN&te-Y8G6^ki-d-1VUN-rpRv zo%q!J<#-eNHM)4{NZbD3H@|fbC^|CgZnA6()Ks7f6fSMz1(Y1yw}$u}`LPgoz~ITX zSV2bG0fv?=TSq9>uCwOIyl~pnR@0m~?Uu~|!z|f#pLZkZF*9)<5}|X;Yn3oL+4{%1 z?}dPa)jfO8`z3WQ|HXJ&|4GnEG~1Bs(x%c4F3|DIm28rE=4jy}Z2M9iwW7^&?4l^G zV=}eCwF{!2A6wo~#CVc){A=%@qWw~zw2 z`j@yG@PsG~^7=)FLcCLCffN|)UM$7C@wlwhpFq*<33EhBaW~O!zq)(DEdDP5+3SOJ zvF~aXgl&O>%5_=)t^0;yy4qj;Ey8_(W#2_}2D)~mb?BM!ndUSy5&(QIqOJv`sY>jE z9i-N!FKkWde`>Zux1>Oe#kK&J_)?9IHKjFmlpbyBIf&uR;398WwUF40W$kESnzL=OeZ^*zCLvvV%->p`vP{*wsfu} z#{Nm^%>1WXS_jf4s$Z*3n;#9gLxFXiq~0jLuPpaU>2*2N$XelfP$i^M{zpOfL8e&( zv8_;};s(MkMD=wd9pi^BTB|n9l^ds6@Hn*@1bs454p>8L2<5f5V5dq5rCxknIg83Qh8@?(3#>q4{l^s5sA7fGtjBeR9HXff)75|k{Pp_$U25E!pjI@q1|(pjSoCf# zFR*7w@OeNHOV--p#%nKsUeCTjA9J$?g1NZlh>u~wO`pufwWv5nqdV&xCh7<=V zro1t%UXg#M%*CKtFDK*YHxLMy3E%QcA+bH=4dnixVy+IKJvehiUdjpsDj`><;Ps-x z$N;adCpvlI2|s!wEb!WsNJK5bF)_tqgnoEc2=IuBfE4#kOsea3f-NiX<>x z9pt<=SVCvFw)vI%_Gw&V*&Dn}m#n{Y?Y37%X%SAyrmc&2;6Vna(&Qf2=sW!OI}j^Z!3Zyo&%Ql zO*SW&MegZ3M4&g8>OX203d&|+)5^X7TobI z<_&P62+7=BSo8+6vo`!U*4k~qWPEf2XBDmOKyoYj|aLxKV?J!P@=T?O6ZgsHO5Dxp9KJe@^3fwoOYUzZ#aUXBpF&>_<-EQyGw%?)6XP4FsT8Xf}{WT>8V<0az-ZlGE z&jAc219(FruR1;pur^7uJG|_~PG`RRzBxlyTFsKf+6OL(?>Pe*`K$nf>ptEm$uKtU zk~C#kYtw61g6U$64`gJmG5_&{{pxe7?JH;gV#1~8VBBf5GGVZf9KzX>gcB8K!)kdh zfr3`f`S9CQ$Z=={5;RbqXV!r^r4>Hj*<)^5RYBeTj7Am+n*&5-IHvlSQBi`-bl&ba z$rTm42>YhLgp50}K+!a)EiI3!{9^IL*+cg>fUG^_+vg92$q>xhq*WzruV4=Clu(A<1cUl{Qqr=2|m& zy(~|qc{6KvOO^b8M%JRg>fKPKgFyXm9UTg*e=E(Eo~|5wVwLaeSYzpeRHUOT*kCu* z3YXdDPOgE2z_KpgC1u4`($qmpS;Lcu{&J1YZu@0VYUdg0F5jIm9AsYpGf6Pd&+>r2 z;8oFQxdAXHumm+%&`A>Fl0eU5WP!uxeS9TZ8hgM0-Ffw)6KM9d_W$Nx+h`mc`@c=| zF)&S~)d-JTV4C{sRv^Lkj5!t&UbUAr!k&j!9fHuA5{=qY#C4ly`6zl|m@ftl-}_^; zcq*X!^R>1%$23ldiKn7Fk>~(dqYZQVm-AsGjD^5${**vGPk}ieSDH8rLXX-eNB~KG zQe1Dpi=kGeqKlG~^qM5DjInc8P9QOtk?7CY8pmc|Z63^iF5@+l_+sEtbP5vL;$#>P3h?2)k@EZ-+I$V25xj)Dr&pv_-)IOn zP#!c=;+eB~+gkV8tQ&nzB{R=-X0*+9^b}M#YW#YRr*0_$%^LwF*gYaaKI= z-D7lm(EgS1RN`Nd3r-RQrtcme!+nm7dcnn)MuB*D-t3WRoe2Mi&(&s7u0Wg(-U&-^ z8>DW)h!miI6pl__-wBPL#$SG-=UDuX>0klq)^Zeg|E=3f9ZZ$cX7UDk?vEs>60UgE z2e(#&Y|CHJYml>wBL0x_K0X<+0RMZ@bB->uzME?wto?_)>y#e$hduea<;9=<>FD2c zd7)MXj0h{-yh48D7ls3ifkV_Y6K?A9huf-=|65e|m$UFRIE)ePqTHT)|IKx!H8bgvayg9lxinH7nDqPv2unEV(QF z9k6j(887D_B$)kBO;-d1P9kW_E6EJgUs*+PP!bm#zRY{{__O~^I~xXKSmn1I8|~j) z=tg}GdCjO#g=t+WsA`=zxZB`T@phHOWcbo;Wl3CPD!D5dmr`&g)( zQxVGhI?Wb9j2lmWUHEr2m%!1ynd~(AJuZwsMld2hF*%NLZWc73HPR&(djCk$1HXFw zCQDqRgR^(WYQ5~w<4~DBSBR60AX~6&N&QO@$ng-IjK|xN-@43aDN3)wtZ(ha%-Q_! zTtUtLK6l=PiUfmpY{1CHKzyTUK#1)lCvd6LZN@Wi5b_B-&uxx<>V`l3UwMsAb|5uJ zEkyy;V?_4%wAGYYbzmJ5yZooON+;GyfRaL)SA{h75@iPwjwymH39r|ZgfIoeZu(OopF)z_jntdSv0!H;=EAv`-=0$-*fn_sL zIow|?tlG|$Rw`Vi``%A%mFb&5?xfFC@(@y_`&X(1Yu^?CtCm8JNRfvE$#2BL?pr}^ zi?`p6qE*HB{JCO}6z}gDnU;;_4FBBnVj~>nNVMTX$LRi(f5{5)5i-Z5kV*S((>Fyf zX3EtB1oNU+c%OFT3gi>IzkrUaCHNy0;vYbrA!k3*x7MEjHj;^bGJP;4v*{$zS3^o& z?x){zK4l%ps|CC#JguDU&c9y*AjRS354fyPUO>i8HNhYG+*Ms3#0mc;B&NhfPm~Q0 zY+7t(g!!M5Py-_o4C*}hhY)j+DKPh*hNz0;I^VOvg)18{27l03w5#SS@$X-B$;E&V zjm@3EA0(M)36ewXJ+M@r^OcD(gfJu%%M)Wr)#OEqs<%1)8J7&S>43N-@bY=b{hlnv z>4hTz#hT;QyIxXC=lU*{m~)%}v-7cV3`qFr8#Lsq$b`CW@^2gNWq1%XnAD{{A=s{( z6h48>O7D7rF0E`*JYslA^R6V#Agbiw+x<`e6$COqG7JCi>-!CWT_z5Rv5fyl4;Hrk z%YZ%{BtyR=%PR11G%-$E`*%ktw9bRs_-DKfpDDa8Zw65J{Jv*-Wq dMholi;b+%;xa{z=N(%6GUF+u6VhyX1{{!?kDDwaS literal 0 HcmV?d00001 diff --git a/src/assets/404_images/404_cloud.png b/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..c6281d09013e0a2c5f8e699a0a6038d9480291e5 GIT binary patch literal 4766 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 literal 0 HcmV?d00001 diff --git a/src/assets/datapre/icon01@3x.png b/src/assets/datapre/icon01@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f7528e66c8d155512098cc151c87783197c069f2 GIT binary patch literal 1335 zcmV-71<3k|P)S`52m+wWJlQj6b)-;XL?TeJVE z{eD#H+lt*&@ad;s>k;;qpK4>Tf{ek!?O>UdE8m%8Q-Aa&)Qg@DAiJJ=U>R_~2dwV(% zXg8~0+n9n3buPQ7p$>0{a$Y+^4!tx+1GB>OFvj|e;-lyFf6s-TC{9<;ykot$RgjMF z-J#$*kb3REc6TP0Un9G>e*-5Nw))hWHJXsq>gy0l4>da1TJYjBtVS0DO%k8ej?gg7 zLG<+c4Fy7RTy;I@;`%4WPlk$hu<5^ z16`m11|ao&V|}ITJEWh<-8qQ9?jZd(2Tnm$2eqJnn*&!65-~A1tl!49m;c^o-;Th3 z%Y*e+N&xOh3}+8R)Ja$b_!YezKj!@K5qE=HA$~+LAKxD^g1k2&5asuD^zBE_4#DvPRzD5*k?fc74s4=*u5gSn9Orw zeg#Xq*?Pr{BK?ZjLO5rG(o948q7myyFhV@A(?alY*jT>B`#nLrgHz9=31s4VDRz2x zWhD6tea3(9r+WV8^FM>WmOv_y3s2 z6BGX}F>KihickG{85|0_(X^=eInO5d?|aX41jhGfZucLUqph6}#W%w9k7sgJo$nVP zCo-hJoF8HS^GhryesTEDe;sl0Rr|X?iZ>6CGC zdsHNu`2QJ*@Jz)7%lbzF!?7l&b7Dh~k5e!rCJ_j4(KznSXy!zq8ip6d4#Du2JD^7mt^ te!r-KW3YKYtNQobDt|vPLBac#{{f2fFszc0Rj&X5002ovPDHLkV1mq}r~Uu{ literal 0 HcmV?d00001 diff --git a/src/assets/datapre/icon02@3x.png b/src/assets/datapre/icon02@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b99c9cc3e563b83f014774a42c4a644c7a5c9be5 GIT binary patch literal 1005 zcmeAS@N?(olHy`uVBq!ia0vp^X&}tO3?%s&MFN17M}SX=E0F$A4e-38Vgt}DiIO0{ zV21w=0tyWa?CTQ(-rqm4Ki**eh4mB8Kghp$*Y76-1G9~%i(^Q|oVPP?Z(FUv<67>x zW>LldKmX^;W$G^CP|5r*DVw}|UX8?PAN zQGs88*}1~MHRJ1nDOoo5ahi%O(OYA*O6}G$oNc|c)MszP^7kiZzEGb&nOVb6;FHHU z)y=|BG~DHwrZy{`{p`$;n({|4Ni#{*^HS`cL;2x?ihL{hdsA-j;G4&A`|aJb`WN5c z)&>PRKD@@vbok7CPF}841zi7U9Pu&Gdiwmhk7d2Znf0A#j!*D$`%&L_km1q|^~v`b zd_2oU?yPysa3)u!=tmg0;*8rKT046~3ms=fPkg93b8pB&gBM-ZYhDNRur<~TmY-pk z+1#>@b?JnhyHOnnGlJyHrh49;A6BaJtZ|i5Bq^4GsNvWkZY`+hs!y zMuVd8LPIY@Z*}V_Wd@1?5!tgzZ8LS{EFBm%ql}@v1b>3x@ksUM3wwNMeV&16SCs8!o1UP<>x93BO-u_~GW&kT&b|o=Y zk9lEPA}>C7-?~-aDqWu@l<{zv=5I6iC7V-D9TlF!xYu{m+w83!cMI;Y_Z4q>diBh4 zVO0mG9ly_Rn!DFM{rk>RTXv1Na}IYr57%u=-YE6#`NWaemu|e24w!RxrB$P^ w*4)4A8dkOFvZYT=d1E}k;N>ON`TrP2Pbl0x)Ub{dnAaFQUHx3vIVCg!0Ju*0a{vGU literal 0 HcmV?d00001 diff --git a/src/assets/datapre/icon03@3x.png b/src/assets/datapre/icon03@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3a95d9daf3bf48ba58b8531c7b8e1748f6d6eeaa GIT binary patch literal 1260 zcmVyUuxUn=x5#NWDr5&{S82COUt!=ML0V+Ou z)&p&NK52We7wo}??~9wmsm6;NK8c&JRRw$(Zi)$A8a|oM(Q5M+oVgh$bqhQ1BHFy^O?~_7GG3rspGC4JxCJQwUz#Hx-cZqAaT)t@uH4~56cv%3)jSS(a-SR z_w*lIX`|Ox`wb*`o$)#o0^n^hU6HN&;)-eaY1V7kc=({$tF1OlA=KG-Ts`UQnBMc) z>K+7ha^FDWuiA+F(KfrP&(`#r7mL3QiMfgyQ`~F6*j!n=08oz+JFbfl3n1_qOW|w; z59I^MW5AbEvpMXC@qvG^lzm8e!R!Q8;EI|J6xn=O1O`41_dqrv+Wvss5QB9pw+0^; z<-p3=wxp1;15q!9CX(8 zPq6Vpg*CnTm4&(ZRE0H>8 zPF+MR^EsCnTy5=G|G>i<2<2tFG>+cm05M z+5Cv^AL&asAu_U>Jks4|d7fu&V2;{9E?&9D*vRzn|GJx%zwkwlN9|`QQnT`~P?_Y` zG*64~de*9DG|zC4B;D%D)-+n(-TP-oLS$tBVDFfiGp{D<%$S(%BacV7dx^xw`2el9 z;_<3|d}!BNaK4~pzEki-v_Jsoo9`R{`BV7-8LZD|z(}*;_PKP0ln!&&)^YD7>64M+ z=EFZl`je=K0!rF6QOs<>lq&<>mFCOZE*M@8a)Qk$yjo^!t6J z-;X5yektkqbBVv-O#1zB;_ug!em|l3`yIvKk173rQGt7Kd_SxF`)$SF4-67`zw#fv W$RX0=nEw+10000C~c9n0v znU;4)#p7T03MtuD3~iH>^;RSVHHvvHzJ0P)T&lTfi%g=^&$)9Vek~8-eh|3PYubJH|GS{G8HxAZ2?UfjD-g!@wW45L^{XEPy-yGGF~%-X(4x*Zl`vHE@@`)EduYU0j0 zi&<|zK0G(<-eYfH`_>B;8)sNA6`#qzHR-i-zE1v+BMy(xO}^=@D#>y}?daZhjniMI z@~>fjXH(#`Z1cfA^Zs;5Z$H#lQL}8m+_}Pach42oOwbc=;bB~_y=md8&wFltHo6_3 zCnM9&o58o-x}axw{rZC1wHpgoG`n4IPQ0vKx-X&hw_@7Mlby#dzD>Cn+i2melv43c z#C@r)Yfd6xw`>gS53f$Slj;YUqxRIluGOn5t9F=j`?hMEo>PTG=9YPhCq+}t*q)`d z*$VrMD29r@Tys>CebUOFSn=brs?S#?oX%Id)^z;XfA`N9xBXqbUnAiFVdQ&MBb@0HqbXh5!Hn literal 0 HcmV?d00001 diff --git a/src/assets/datapre/icon05@3x.png b/src/assets/datapre/icon05@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf329a1256f34c61135306c2b2cc62efdc41329 GIT binary patch literal 554 zcmeAS@N?(olHy`uVBq!ia0vp^^MQB*2Q!dVob1UCq|5?*LR?jH{{z9KZU2D+6Sw^b za#eFdq+k;euZlOj{d|3;{G{)!lFH9>L(SfUceLr}v{OsF~YqCe@`WHU0epVenJK8Y#_D>W3zVxFP zO?UEcHeGkhcgEVH(!4`CTQA#I{obQpES#ntd+zkbl3P|vN{dQ&|2^ilzE^Lr?sMxu zM?fsw2Z!7F@3+-t7R+kqm$$2l{?eL#`u7LLlZUk5C%&C`UjE02hljUsc>nnDzKZw# z#TTR=Zf-p(%GXE6;zgIPV@bUw^6HeDAt_Gk?`s{QOz< z>NDrl=hmmr9}k(YueF1J-}&^b^YgXs<#+fO?E55N`(6C((bvC3fKkWb>FVdQ&MBb@ E0QLPLj{pDw literal 0 HcmV?d00001 diff --git a/src/assets/datapre/icon06@3x.png b/src/assets/datapre/icon06@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee46bdaee7cfee7fc830887e4708db50b21dcaf GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^X&}tP3?xr~{22(OgaUj*T!Hj|RA3jh)(R-fRubeF z%<#XV-eLdVi93RUA`?7a978JRyq$iR*TF!<&9HGks{osT&H=VJ`@5^PpJZD*-2P&% zKdE|-`qXW#o%4%XZMutoFL!3H;5{|Xcfqo0>8-aGiAQhZyixMW{p~7uaoKxG)0bR} ze%G5+pE^B%>5UDEhue6i%`{C6-yh7mw`^+glQqeE_DPmhbeiU?7Kf!VyX?4El+U+k hUnTFUlbcnnPx$RY^oaR9Hvtm%T~@Q4mJYq_)Tth_<`4;3JsA(n=65EKFycLJM0PEux*BHi9BH z;sZqR1%#bjtGz|uU?gB5Swi+E1XjszxjR4K{g^r26)JwD;{N;}0jk<__ihN`WtwYg znr@3o$IMzW?nXPHst&xC6&?r$Hq9)mc2v;dB(;F$c0g6{fjtqq$n*SU+H|Yx8E^{R znb|?vCX5ZCsvZHmg`^Fj>F%E)g!Qt5zXSUPtO9-DeKg12pF;>&!*^o>vMlSm`(YuW zFCslNYsWMn#;EEIum!A)=84E{p68v30%mEjsMu%@EUIC#PA#Bzpmv}XM8G%jHV=s0 zy(J>eXb>ey(rz>wMSjnW;xtV^L}YCeih)NnyPk=Js`>=%h{)wAMkm23%d&HKKL#Gm zY`+X((L=c0_ksFO_*WdL_Q#}bo#y=>y@vBPD9fu{zz=t2%pu$fymbHo002ovPDHLk FV1nW6wCw-@ literal 0 HcmV?d00001 diff --git a/src/assets/iphone_frame@3x.png b/src/assets/iphone_frame@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4de2772e1acf7c70d2943d2c9b85462a9b20b55b GIT binary patch literal 32098 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 FV1nc + + icon_颜色@3x + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/font-solid.svg b/src/assets/svgData/font-solid.svg new file mode 100644 index 0000000..9ca8e4a --- /dev/null +++ b/src/assets/svgData/font-solid.svg @@ -0,0 +1,16 @@ + + + icon_文字颜色@2x + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon-bars-solid.svg b/src/assets/svgData/icon-bars-solid.svg new file mode 100644 index 0000000..ef3bb9f --- /dev/null +++ b/src/assets/svgData/icon-bars-solid.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svgData/icon-d-solid.svg b/src/assets/svgData/icon-d-solid.svg new file mode 100644 index 0000000..e1bcc65 --- /dev/null +++ b/src/assets/svgData/icon-d-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgData/icon-database-solid.svg b/src/assets/svgData/icon-database-solid.svg new file mode 100644 index 0000000..fb56b0f --- /dev/null +++ b/src/assets/svgData/icon-database-solid.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svgData/icon-down-filled.svg b/src/assets/svgData/icon-down-filled.svg new file mode 100644 index 0000000..c3c47ab --- /dev/null +++ b/src/assets/svgData/icon-down-filled.svg @@ -0,0 +1,15 @@ + + + plan2_下降@3x + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon-down-solid.svg b/src/assets/svgData/icon-down-solid.svg new file mode 100644 index 0000000..6e262d5 --- /dev/null +++ b/src/assets/svgData/icon-down-solid.svg @@ -0,0 +1,16 @@ + + + plan2_下降@3x + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon-download-solid.svg b/src/assets/svgData/icon-download-solid.svg new file mode 100644 index 0000000..d3a98c4 --- /dev/null +++ b/src/assets/svgData/icon-download-solid.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svgData/icon-floppy-disk-solid.svg b/src/assets/svgData/icon-floppy-disk-solid.svg new file mode 100644 index 0000000..025a566 --- /dev/null +++ b/src/assets/svgData/icon-floppy-disk-solid.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svgData/icon-green.png b/src/assets/svgData/icon-green.png new file mode 100644 index 0000000000000000000000000000000000000000..8063816d26111f19fce569f73c8dea36b6d02aff GIT binary patch literal 35356 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 UELh-}Iet<8 literal 0 HcmV?d00001 diff --git a/src/assets/svgData/icon-green.svg b/src/assets/svgData/icon-green.svg new file mode 100644 index 0000000..2e5c70a --- /dev/null +++ b/src/assets/svgData/icon-green.svg @@ -0,0 +1,15 @@ + + + icon_字体颜色备份 11@3x + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon-n-solid.svg b/src/assets/svgData/icon-n-solid.svg new file mode 100644 index 0000000..6141229 --- /dev/null +++ b/src/assets/svgData/icon-n-solid.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svgData/icon-orange.svg b/src/assets/svgData/icon-orange.svg new file mode 100644 index 0000000..ba6069a --- /dev/null +++ b/src/assets/svgData/icon-orange.svg @@ -0,0 +1,15 @@ + + + icon_字体颜色备份 12@3x + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon-org.png b/src/assets/svgData/icon-org.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c50231d5024c12aa391bb05b6495034011e212 GIT binary patch literal 13017 zcmb7rRahHL6K-%ykOD=6mKK+m7AO$hTHH0bySqcN;>C-%#a)62x8m*u*AU$GeE-ck z*XQD$cXoF!_GaXn-HB3Gl)=NH!~p;Rc;CKCs{Y4b{{uGWf0Eyfcj`YvaaENO2ULzx z9sIYDG}r!Sp`ZX@{ZGdRphQ>$(En%hA1MC=0DzW<0zmtZQU14=hx&g{z4FlhpZ-5X z>`jeh0DxQKo1~b!7YZ`_Rg-~+`^}B7<8H7hQTJ;iBJ4~445rTQc)WBR04wV2BhFQtzTg|u2aP! z5#x~Q&{82``t0~P*0^sWE;5&fE@MJNL9Ez-P-(Om$#2`q&*wW>*eagP*KJ*VXQ^kw zgTr)Aa@qLjsXw-$+)!;uNQ7%=Oz*+`{zz{4`GR&9frQz-ExYj)I(WuuR3}|Gs5zJZ zp00PTgITR+1Fg9#h)G=er3s=ECuoSYRg6VtOGMhP8P-{-T^#W}1go3SA*1@D#Fn2d zNCaZvRR?76DM?Epu{;1(iLEGk}-#v(BKGE0AVwQIg;_X&aBu z03UVb!4eFD*=gIL!4+J7wh9G8E6!xfq zc+Xq?B~a-v+bdth<)u~)R4eUAlZG1RR#jnzPy1FZWm?o!VEZ2H2lghB{)!1qQZ?Nw z)b6jRQ-4S0Mxou>v9kH`UuHeftWMtA>PcvsPh#e@kUj@7yd~8M-FYFK%4Lu2;SEQk zX)8nQiYstE(&ty*QbCR!fhLP{hxYFcfevWkOMxqHYG*Z;#qu7i^DGYV-*M}69WRuI`L_q5KOLzaB`hp~{l)3j|7Obw(E%aAoS%dQ>I>Pnrx4HPXqEOwXR2t*iOj0--DIbA_BGuFdLLvB(Ct%kh`pzDqYN z9al0WBku{m&W|)@%XEMv*`A>2j;)7nx;%`rTLEm3zw;#LBSS5c6&ttjU&Ry8+Bnu! zBfo0ypySTOX0r;#<&ihzt|UISx^%3Y9*1IFrjuQr$Rd(wJ#U;Aj~;y=W}3Fl&P6qIl3M7Jj`zZ$ci9XV63zMztNZUM>=~*Rw-zis5i3yZN4QI*k&Cm*$s0RYG-kRQv@o ziULhBF)oh0#>`wzg_pjFjWh>#*|25XLWYJD=?zAPaof-#Ny3s#2Rm34&hYu@zWAR} z+x>(wH#a+~fHCAYCKE+OU#Gmo5S6ur`u*|n*`)n(quB!-u=oPrn zYn6uiwsPCHeaBwW*OXsh3wW=4p$pc2u74dO3)_J4oF_|RXwwu?^8DkivNshHhb#-T z5m`>11LDt*mP;4)`QWOVbTe-j;AUR52Pl`)+>BhCgfy*T3=he*_|@~Sb^tE~uW9g` zF5GU5M;XQ~APL*37v)&7m&mX~XA4tm;K^6l;L3MbM!yosUA+uY{rnUN? zj~VQFf7+^;uU$5TmuDiUr`|GtI{y^DkCx(zrOvlH6%n2qm52hM|GHX(GnlpndoRvvSQ8m;ai}J zcDd<=D0Dtld))%GdIgU8!%Dg}()z1uH(u}eZ|c2gDb=u_`)ob^ZAf7CRP>6r7<@o^ z;_SvE)83K{iwhp$D7JlJO4-~9=p3q(xzL&SF%1lWw z+g%=G-@#(j;n|8yGlBu*7P2-+$x>Y^G#@n#ezsQDm@Hj?v?LhS{q@f3-jK|*I85(S)K)rw zFJDm~90oL$5C}r`mR9^VSVX$H$Nd9Y)X37#e@{nQetd!J4Mo(zHQ1asUK?jNIUK#V zg$)sX{svO@_z~(MH2av^Sj=BN?ZnYUSlmMAt@w`HJ_fTp1jX|wfK5my#4g29<26>R zCp>u`PXQc`;p1DMW82kspIJcln5A0zNLp17M_*GH=fH0 z4ISEOuVvP@Nv2R4;z3ccku9bs)6kkD8TaksFJ`vNcJps$fZmy35-M8gEv<~3NO6}x zVu9Gi2dP-9u+7rRuuSAu7h7&gJ+&xIl*&V)lZt~+naYD)HMz_Y zGO1IT&VSk?RKqf#YrYn2BkL=@W!+@vTWe{swX$eWOPoF6!fehcmn}{^O8j{G!7WIF z{hifXpsJIEWVYKo6=hw8xjF~dcNJ@G&cXdUOy{7M$!|%i^&{jXvH+J4>e7Fjp2b5k z4^&4}0_ykbkK0w-y>ZGbf8(1c6@x(3y}}SevqmnM5O?qTyQ=1xHgdadDJp&m{>7`; zp?`?;N!Y_A3UMk|c`ra0CYoG%?D+GG)_8MGg*hi?LijzmMv&>!|`KGK=KqJ#)W z;W6Nn8RfLA_x$vShQF4k(Cr+=UKg*^Ak>r(GZUcXyUQSR{{pRv3OCqJ)cm*KF#;K) zIS*i@T+ihGZRN-g>|%;_A8xOHP0CtL17RAh%);Qgi2Wl>Fc%kqRbM#8=WbH>=V!$w zvPYESB}J$uwyi5C99Z3kc_C~3)#GH8G%#sQ(G!jbI!XFL!W^VvEWvuKe7W}{_MpR-1LeKF zFwS0}b|rxJR0i@I-TTCH?$PV@TYXkWrOEbuwNc=N)n4i9okqek14pXg>e+8%S?{^` z1>i&2jHM(PlkGVaNDkS4p!w_9%OJCfJ^PXEy?n3tM9~InOf7G-6?!DlTqT`V6Fa$< zVxX%eR^juybf#Te%^Pm}6{?W5fkB#rquOEz`SLwvQkatTqPjwu46HEMx&E(0!pXae z6rB2Fehxm(2}o;_JEh*Qz4p3>hptxHJFOg=r)?30(51i(QYoMfdEOUXxTan7UD2ja zEGGi^A#2xO6(}B3{$~GOr=~X!`Hwf`l?pQa)}aTu8DlQX(o0RQf1&Jxgg5`%y#5s} z`m}{dV6?#&GWGQfW#beuABG#;W~Pq*CglStg1Ud2|L`ykkvXT)T-bY-gT)H$NffLM zLqT+Hk(8kK!Xj`$r?9_`!3#Z4{Rc>p22r<`j9IP9`WI*Qa*BQ(_}^)}kg=y^OBioB zr2MD#pG`6$=(QKz*DJtRni`CiB~S5`kHDUkNx~N>w9b{mm**jU*sG6yaK}!^g15D+ z2kSu#;nEbXpxqiyg06xJOS(54hCp_jxE?L{wW9;S&aGHUbib zndf<8Ed}3TUp-C4rZG-#e3KIm&g|dFA35Vi(>q$?Klb2MbE={1`aoK1ubpx}r}LtJ zNgfdGW1rUFGaXM)WAUUI9VbXT!hd_x}jC|fD$@GC1=S^}#H3hxY8v+dFkd#k3^ zTym7qUXtcLH|&;*HTqY9owUa5E&QQ|-9ek*Fk)D~FXx8u&1=#Z#w*4|tEF_ATFNAE zs-!#V{uuMW)>LlD4*n@~L?Co*ft+3_T53f?iG2tA7#6t2)g9SJ75`Dkg5UYy*$%^mFhEfH3i|55fS*Kok7xsT6Vv$<5UU8FbV23vWznyDwC$l6^1e{TboaLr1;D%+eFJf zH>(u8^HTx%vQ&m7az@$sm9|R~0MpVyKKVsh@>Y8n6<%JFC(1%!0r*%15Ua-)*mp*} zzv@hbwth0W9NWIomyX`a2|s>f8ISJ3Y{Jds3G(MZv7^4mDU4JrmA_6xQ)oD-^x>xf z`H^#X;`JCqBd1Vt8$ zK-f0P(o9n7P)38@J~&) ztA2Be!h_;S`ci4&4SpXovX-1 zO@(Scs4(O2e0CrpqPMe9CJp|PxW>%b6&EZTmZxxJqwOS=3Z}ik^nCV3d2lWOBR^@= zJ4|C;X$3^-SHy3IzeHtMlvQ`bGNNnNwRzBn=$Ynx=3j!cOZ2?GoFEuJlyj|{5$svd zM2)fTI1RkD+t#?LpS&V#l995QqvQ?{rJA_g`xlE36?t*oJda5>J9azBWF6tW5C2_I zxy$F=an1vaFe&I`ers_lKa^Q(OlY@9Tc|E+d-~5>ufl!EiY1MrpJzquesj~-FoLb> z5BRLvpI>y#=BZ@&KiAWKVGmj}H|!Jyl0_q)55meLm5jRT4XMFn%_99iH{Xv-mr=YZ zE|4c_=Q^6Bo`$b-;0}=k8yNXQ`6z z{a%QF@1bIrAv2;fH~eF9aKR{GS4vvQTKV|Rs5WFzef7c=-fx0cc2zMr8)Q2%rIj_N zmfKNjloJeGy*O>zyk?mw_ipkO&H2&i^Hgn_T#HUt9u0S=cjaJn5gFpP6+V&MYPkZC z`N#0Te6aeEH&<>&>aOjKQ&0$VJGLhQ&>r~zrjbI!_Yho}z%k;(PRpa$OGyIbUC=YB z#`N8d4%0A*K$?dZ;?@Z|shE9*Fr0D-c{3s=Nw`f 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 literal 0 HcmV?d00001 diff --git a/src/assets/svgData/icon-play-skip-forward.svg b/src/assets/svgData/icon-play-skip-forward.svg new file mode 100644 index 0000000..4046425 --- /dev/null +++ b/src/assets/svgData/icon-play-skip-forward.svg @@ -0,0 +1,5 @@ + + + diff --git a/src/assets/svgData/icon-play-solid.svg b/src/assets/svgData/icon-play-solid.svg new file mode 100644 index 0000000..b91c897 --- /dev/null +++ b/src/assets/svgData/icon-play-solid.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svgData/icon-red.png b/src/assets/svgData/icon-red.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f55ca6803783243c1a689c810adba046b18ea1 GIT binary patch literal 14752 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 PJ5owaUbI%&FzEjPf-eG4 literal 0 HcmV?d00001 diff --git a/src/assets/svgData/icon-right-filled.svg b/src/assets/svgData/icon-right-filled.svg new file mode 100644 index 0000000..a894ca1 --- /dev/null +++ b/src/assets/svgData/icon-right-filled.svg @@ -0,0 +1,15 @@ + + + plan2_向右@3x + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon-right-solid.svg b/src/assets/svgData/icon-right-solid.svg new file mode 100644 index 0000000..899786d --- /dev/null +++ b/src/assets/svgData/icon-right-solid.svg @@ -0,0 +1,16 @@ + + + plan2_向右@3x + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon-s-solid.svg b/src/assets/svgData/icon-s-solid.svg new file mode 100644 index 0000000..872260f --- /dev/null +++ b/src/assets/svgData/icon-s-solid.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svgData/icon-satisfied.svg b/src/assets/svgData/icon-satisfied.svg new file mode 100644 index 0000000..f0a9fd1 --- /dev/null +++ b/src/assets/svgData/icon-satisfied.svg @@ -0,0 +1,18 @@ + + + plan3_满意@3x + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon-solid.svg b/src/assets/svgData/icon-solid.svg new file mode 100644 index 0000000..662ebe8 --- /dev/null +++ b/src/assets/svgData/icon-solid.svg @@ -0,0 +1,26 @@ + + + icon_图标@2x + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon-t-solid.svg b/src/assets/svgData/icon-t-solid.svg new file mode 100644 index 0000000..3a55269 --- /dev/null +++ b/src/assets/svgData/icon-t-solid.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svgData/icon-table-cells-solid.svg b/src/assets/svgData/icon-table-cells-solid.svg new file mode 100644 index 0000000..6981a69 --- /dev/null +++ b/src/assets/svgData/icon-table-cells-solid.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svgData/icon-top-filled.svg b/src/assets/svgData/icon-top-filled.svg new file mode 100644 index 0000000..7f6d995 --- /dev/null +++ b/src/assets/svgData/icon-top-filled.svg @@ -0,0 +1,15 @@ + + + plan2_上升@3x + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon-top-solid.svg b/src/assets/svgData/icon-top-solid.svg new file mode 100644 index 0000000..b87217c --- /dev/null +++ b/src/assets/svgData/icon-top-solid.svg @@ -0,0 +1,16 @@ + + + plan2_上升@3x + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon-un-satisfied.svg b/src/assets/svgData/icon-un-satisfied.svg new file mode 100644 index 0000000..520c0d9 --- /dev/null +++ b/src/assets/svgData/icon-un-satisfied.svg @@ -0,0 +1,18 @@ + + + plan3_不满意@3x + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_collect_data_inter.svg b/src/assets/svgData/icon_act_collect_data_inter.svg new file mode 100644 index 0000000..c72b56d --- /dev/null +++ b/src/assets/svgData/icon_act_collect_data_inter.svg @@ -0,0 +1,18 @@ + + + icon_数据集成_hov@3x + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_collect_datasource.svg b/src/assets/svgData/icon_act_collect_datasource.svg new file mode 100644 index 0000000..ac1c0d2 --- /dev/null +++ b/src/assets/svgData/icon_act_collect_datasource.svg @@ -0,0 +1,23 @@ + + + icon_数据源_hov@3x + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_datasource.svg b/src/assets/svgData/icon_act_datasource.svg new file mode 100644 index 0000000..f822006 --- /dev/null +++ b/src/assets/svgData/icon_act_datasource.svg @@ -0,0 +1,21 @@ + + + icon_数据源_hov@3x + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_meta.svg b/src/assets/svgData/icon_act_meta.svg new file mode 100644 index 0000000..0bdaf3c --- /dev/null +++ b/src/assets/svgData/icon_act_meta.svg @@ -0,0 +1,16 @@ + + + icon_元数据_hov@3x + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_quota.svg b/src/assets/svgData/icon_act_quota.svg new file mode 100644 index 0000000..b9a21ba --- /dev/null +++ b/src/assets/svgData/icon_act_quota.svg @@ -0,0 +1,17 @@ + + + icon_指标管理_hov@3x + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_service_list.svg b/src/assets/svgData/icon_act_service_list.svg new file mode 100644 index 0000000..65c1950 --- /dev/null +++ b/src/assets/svgData/icon_act_service_list.svg @@ -0,0 +1,19 @@ + + + icon_服务管理_hov@3x + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_service_monitor.svg b/src/assets/svgData/icon_act_service_monitor.svg new file mode 100644 index 0000000..176b701 --- /dev/null +++ b/src/assets/svgData/icon_act_service_monitor.svg @@ -0,0 +1,18 @@ + + + icon_服务监控_hov@3x + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_set.svg b/src/assets/svgData/icon_act_set.svg new file mode 100644 index 0000000..064eb48 --- /dev/null +++ b/src/assets/svgData/icon_act_set.svg @@ -0,0 +1,13 @@ + + + icon_数据集_hov@3x + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_system_authority.svg b/src/assets/svgData/icon_act_system_authority.svg new file mode 100644 index 0000000..41942e5 --- /dev/null +++ b/src/assets/svgData/icon_act_system_authority.svg @@ -0,0 +1,20 @@ + + + icon_权限管理_hov@3x + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_system_dataset.svg b/src/assets/svgData/icon_act_system_dataset.svg new file mode 100644 index 0000000..201578a --- /dev/null +++ b/src/assets/svgData/icon_act_system_dataset.svg @@ -0,0 +1,22 @@ + + + icon_数据集_hov@3x + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_system_monitor.svg b/src/assets/svgData/icon_act_system_monitor.svg new file mode 100644 index 0000000..b840ccc --- /dev/null +++ b/src/assets/svgData/icon_act_system_monitor.svg @@ -0,0 +1,25 @@ + + + icon_报表监控_hov@3x + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_system_report.svg b/src/assets/svgData/icon_act_system_report.svg new file mode 100644 index 0000000..184cab2 --- /dev/null +++ b/src/assets/svgData/icon_act_system_report.svg @@ -0,0 +1,26 @@ + + + icon_报表管理_hov@3x + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_system_role.svg b/src/assets/svgData/icon_act_system_role.svg new file mode 100644 index 0000000..6674670 --- /dev/null +++ b/src/assets/svgData/icon_act_system_role.svg @@ -0,0 +1,20 @@ + + + icon_角色管理_hov@3x + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_system_user.svg b/src/assets/svgData/icon_act_system_user.svg new file mode 100644 index 0000000..004b466 --- /dev/null +++ b/src/assets/svgData/icon_act_system_user.svg @@ -0,0 +1,19 @@ + + + icon_用户管理_hov@3x + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_act_tag.svg b/src/assets/svgData/icon_act_tag.svg new file mode 100644 index 0000000..78d86bb --- /dev/null +++ b/src/assets/svgData/icon_act_tag.svg @@ -0,0 +1,15 @@ + + + icon_标签管理_hov@3x + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_cell_close.svg b/src/assets/svgData/icon_cell_close.svg new file mode 100644 index 0000000..1764d8f --- /dev/null +++ b/src/assets/svgData/icon_cell_close.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/svgData/icon_cell_open.svg b/src/assets/svgData/icon_cell_open.svg new file mode 100644 index 0000000..01327cf --- /dev/null +++ b/src/assets/svgData/icon_cell_open.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/svgData/icon_collect_data_inter.svg b/src/assets/svgData/icon_collect_data_inter.svg new file mode 100644 index 0000000..a39ade5 --- /dev/null +++ b/src/assets/svgData/icon_collect_data_inter.svg @@ -0,0 +1,16 @@ + + + icon_数据集成_nor@3x + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_collect_datasource.svg b/src/assets/svgData/icon_collect_datasource.svg new file mode 100644 index 0000000..07a4cb6 --- /dev/null +++ b/src/assets/svgData/icon_collect_datasource.svg @@ -0,0 +1,21 @@ + + + icon_数据源_nor@3x + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_data_datasource.svg b/src/assets/svgData/icon_data_datasource.svg new file mode 100644 index 0000000..3215dcf --- /dev/null +++ b/src/assets/svgData/icon_data_datasource.svg @@ -0,0 +1,23 @@ + + + icon_数据源_nor@3x + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_data_meta.svg b/src/assets/svgData/icon_data_meta.svg new file mode 100644 index 0000000..ea59c34 --- /dev/null +++ b/src/assets/svgData/icon_data_meta.svg @@ -0,0 +1,18 @@ + + + icon_元数据_nor@3x + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_data_quota.svg b/src/assets/svgData/icon_data_quota.svg new file mode 100644 index 0000000..6608c36 --- /dev/null +++ b/src/assets/svgData/icon_data_quota.svg @@ -0,0 +1,19 @@ + + + icon_指标管理_nor@3x + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_data_set.svg b/src/assets/svgData/icon_data_set.svg new file mode 100644 index 0000000..bf00264 --- /dev/null +++ b/src/assets/svgData/icon_data_set.svg @@ -0,0 +1,16 @@ + + + icon_数据集_nor@2x + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_data_tag.svg b/src/assets/svgData/icon_data_tag.svg new file mode 100644 index 0000000..e3bc722 --- /dev/null +++ b/src/assets/svgData/icon_data_tag.svg @@ -0,0 +1,17 @@ + + + icon_标签管理_nor@3x + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_file_close.svg b/src/assets/svgData/icon_file_close.svg new file mode 100644 index 0000000..fa8dd86 --- /dev/null +++ b/src/assets/svgData/icon_file_close.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgData/icon_file_open.svg b/src/assets/svgData/icon_file_open.svg new file mode 100644 index 0000000..2bb4ba8 --- /dev/null +++ b/src/assets/svgData/icon_file_open.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/svgData/icon_info.svg b/src/assets/svgData/icon_info.svg new file mode 100644 index 0000000..7b92732 --- /dev/null +++ b/src/assets/svgData/icon_info.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svgData/icon_no_datasource.svg b/src/assets/svgData/icon_no_datasource.svg new file mode 100644 index 0000000..0984d94 --- /dev/null +++ b/src/assets/svgData/icon_no_datasource.svg @@ -0,0 +1,268 @@ + + + no_page2备份 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_service_list.svg b/src/assets/svgData/icon_service_list.svg new file mode 100644 index 0000000..d9c99e9 --- /dev/null +++ b/src/assets/svgData/icon_service_list.svg @@ -0,0 +1,17 @@ + + + icon_服务管理_nor@3x + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_service_monitor.svg b/src/assets/svgData/icon_service_monitor.svg new file mode 100644 index 0000000..24c2aed --- /dev/null +++ b/src/assets/svgData/icon_service_monitor.svg @@ -0,0 +1,16 @@ + + + icon_服务监控_nor@3x + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_system_authority.svg b/src/assets/svgData/icon_system_authority.svg new file mode 100644 index 0000000..8ca88d5 --- /dev/null +++ b/src/assets/svgData/icon_system_authority.svg @@ -0,0 +1,18 @@ + + + icon_权限管理_nor@3x + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_system_dataset.svg b/src/assets/svgData/icon_system_dataset.svg new file mode 100644 index 0000000..817358d --- /dev/null +++ b/src/assets/svgData/icon_system_dataset.svg @@ -0,0 +1,22 @@ + + + icon_数据集_nor@3x + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_system_monitor.svg b/src/assets/svgData/icon_system_monitor.svg new file mode 100644 index 0000000..be3dde0 --- /dev/null +++ b/src/assets/svgData/icon_system_monitor.svg @@ -0,0 +1,23 @@ + + + icon_报表监控_nor@3x + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_system_report.svg b/src/assets/svgData/icon_system_report.svg new file mode 100644 index 0000000..9a85100 --- /dev/null +++ b/src/assets/svgData/icon_system_report.svg @@ -0,0 +1,24 @@ + + + icon_报表管理_nor@3x + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_system_role.svg b/src/assets/svgData/icon_system_role.svg new file mode 100644 index 0000000..84b1062 --- /dev/null +++ b/src/assets/svgData/icon_system_role.svg @@ -0,0 +1,18 @@ + + + icon_角色管理_nor@3x + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_system_user.svg b/src/assets/svgData/icon_system_user.svg new file mode 100644 index 0000000..22d145e --- /dev/null +++ b/src/assets/svgData/icon_system_user.svg @@ -0,0 +1,17 @@ + + + icon_用户管理_nor@3x + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgData/icon_title_logo.svg b/src/assets/svgData/icon_title_logo.svg new file mode 100644 index 0000000..bfdd3be --- /dev/null +++ b/src/assets/svgData/icon_title_logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgData/icon_tra_close.svg b/src/assets/svgData/icon_tra_close.svg new file mode 100644 index 0000000..b563809 --- /dev/null +++ b/src/assets/svgData/icon_tra_close.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/SvgIcon copy/index.vue b/src/components/SvgIcon copy/index.vue new file mode 100644 index 0000000..d1a877c --- /dev/null +++ b/src/components/SvgIcon copy/index.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..2b8bbd9 --- /dev/null +++ b/src/components/SvgIcon/index.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/components/dialog/index.js b/src/components/dialog/index.js new file mode 100644 index 0000000..fcbbe40 --- /dev/null +++ b/src/components/dialog/index.js @@ -0,0 +1,10 @@ +// 弹框组件 +import RetailDialog from './src/main.vue' + +// 为组件提供 install 安装方法,供按需引入 +RetailDialog.install = function (Vue) { + Vue.component(RetailDialog.name, RetailDialog) +} + +// 默认导出组件 +export default RetailDialog diff --git a/src/components/dialog/src/main.vue b/src/components/dialog/src/main.vue new file mode 100644 index 0000000..0bcf8c2 --- /dev/null +++ b/src/components/dialog/src/main.vue @@ -0,0 +1,164 @@ + + + + diff --git a/src/components/folder/index.vue b/src/components/folder/index.vue new file mode 100644 index 0000000..ae6ee59 --- /dev/null +++ b/src/components/folder/index.vue @@ -0,0 +1,68 @@ + + + diff --git a/src/components/generator/config.bak.js b/src/components/generator/config.bak.js new file mode 100644 index 0000000..843443a --- /dev/null +++ b/src/components/generator/config.bak.js @@ -0,0 +1,784 @@ +// 表单属性【右面板】 +export const formConf = { + formRef: 'elForm', + formModel: 'formData', + size: 'medium', + labelPosition: 'right', + labelWidth: 80, + formRules: 'rules', + gutter: 15, + disabled: false, + formBtns: true, +} + +// 输入型组件 【左面板】 +export const inputComponents = [ + { + // 组件的自定义配置 + __config__: { + label: '通用输入框', + labelWidth: null, + showLabel: true, + changeTag: false, + tag: 'el-input', + tagIcon: 'input', + type: 'input', + defaultValue: undefined, + required: false, + layout: 'colFormItem', + span: 6, + // 正则校验规则 + regList: [], + }, + // 组件的插槽属性 + __slot__: { + prepend: '', + append: '', + }, + // 其余的为可直接写在组件标签上的属性 + placeholder: '请输入', + style: { width: '100%' }, + clearable: true, + 'prefix-icon': '', + 'suffix-icon': '', + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + }, + { + // 组件的自定义配置 + __config__: { + label: '单选框', + labelWidth: null, + showLabel: false, + changeTag: false, + tag: 'el-radio', + type: 'radio', + tagIcon: 'input', + defaultValue: 1, + required: false, + layout: 'colFormItem', + span: 6, + }, + // 其余的为可直接写在组件标签上的属性 + disabled: false, + label: '单选框', // 此属性为了让单选框的文本显示在后面 + prop: '', + }, + { + // 组件的自定义配置 + __config__: { + label: '复选框', + labelWidth: null, + showLabel: false, + changeTag: false, + tag: 'el-checkbox', + type: 'checkbox', + tagIcon: 'input', + defaultValue: undefined, + required: false, + layout: 'colFormItem', + span: 6, + }, + disabled: false, + label: '复选框', // 此属性为了让单选框的文本显示在后面 + }, + { + __config__: { + label: '数字输入框', + showLabel: true, + changeTag: false, + labelWidth: null, + tag: 'el-input-number', + type: 'inputNumber', + tagIcon: 'number', + defaultValue: undefined, + span: 6, + layout: 'colFormItem', + required: false, + regList: [], + document: 'https://element.eleme.cn/#/zh-CN/component/input-number', + }, + placeholder: '', + min: undefined, + max: undefined, + step: 1, + 'step-strictly': false, + precision: undefined, + 'controls-position': 'right', + disabled: false, + }, + { + __config__: { + label: '级联选择', + url: 'https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/cascaderList', + method: 'get', + dataPath: 'list', + dataConsumer: 'options', + showLabel: true, + labelWidth: null, + tag: 'el-cascader', + type: 'cascader', + tagIcon: 'cascader', + layout: 'colFormItem', + defaultValue: [], + dataType: 'dynamic', + span: 6, + required: false, + regList: [], + changeTag: false, + document: 'https://element.eleme.cn/#/zh-CN/component/cascader', + }, + options: [ + { + id: 1, + value: 1, + label: '选项1', + children: [ + { + id: 2, + value: 2, + label: '选项1-1', + }, + ], + }, + ], + placeholder: '请选择', + style: { width: '100%' }, + props: { + props: { + multiple: false, + label: 'label', + value: 'value', + children: 'children', + }, + }, + 'show-all-levels': true, + disabled: false, + clearable: true, + filterable: false, + separator: '/', + }, + // { + // __config__: { + // label: '多行文本', + // labelWidth: null, + // showLabel: true, + // tag: 'el-input', + // tagIcon: 'textarea', + // defaultValue: undefined, + // required:false, + // layout: 'colFormItem', + // span: 6, + // regList: [], + // changeTag: false, + // document: 'https://element.eleme.cn/#/zh-CN/component/input', + // }, + // type: 'textarea', + // placeholder: '请输入', + // autosize: { + // minRows: 4, + // maxRows: 4, + // }, + // style: { width: '100%' }, + // maxlength: null, + // 'show-word-limit': false, + // readonly: false, + // disabled: false, + // }, + // { + // __config__: { + // label: '密码', + // showLabel: true, + // labelWidth: null, + // changeTag: false, + // tag: 'el-input', + // tagIcon: 'password', + // defaultValue: undefined, + // layout: 'colFormItem', + // span: 6, + // required:false, + // regList: [], + // document: 'https://element.eleme.cn/#/zh-CN/component/input', + // }, + // __slot__: { + // prepend: '', + // append: '', + // }, + // placeholder: '请输入', + // 'show-password': true, + // style: { width: '100%' }, + // clearable: true, + // 'prefix-icon': '', + // 'suffix-icon': '', + // maxlength: null, + // 'show-word-limit': false, + // readonly: false, + // disabled: false, + // }, + + // { + // __config__: { + // label: '编辑器', + // showLabel: true, + // changeTag: false, + // labelWidth: null, + // tag: 'tinymce', + // tagIcon: 'rich-text', + // defaultValue: null, + // span: 6, + // layout: 'colFormItem', + // required:false, + // regList: [], + // document: 'http://tinymce.ax-z.cn', + // }, + // placeholder: '请输入', + // height: 300, // 编辑器高度 + // branding: false, // 隐藏右下角品牌烙印 + // }, +] + +// 选择型组件 【左面板】 +export const selectComponents = [ + { + __config__: { + label: '通用下拉框', + showLabel: true, + labelWidth: null, + tag: 'LinkCommonSelect', + type: 'select', + tagIcon: 'select', + layout: 'colFormItem', + span: 6, + required: false, + regList: [], + changeTag: false, + }, + __slot__: { + options: [ + { + label: '选项一', + value: 1, + }, + { + label: '选项二', + value: 2, + }, + ], + }, + placeholder: '请选择', + style: { width: '100%' }, + clearable: true, + disabled: false, + filterable: false, + multiple: false, + }, + { + __config__: { + label: '门店组件', + labelWidth: null, + showLabel: true, + tag: 'LinkSelectTreeDepartment', + type: 'storeSelect', + tagIcon: 'radio', + changeTag: false, + defaultValue: undefined, + layout: 'colFormItem', + span: 6, + optionType: 'default', + regList: [], + required: false, + border: false, + document: 'https://element.eleme.cn/#/zh-CN/component/radio', + }, + __slot__: { + options: [ + { + label: '选项一', + value: 1, + }, + { + label: '选项二', + value: 2, + }, + ], + }, + style: {}, + size: 'medium', + disabled: false, + }, + { + __config__: { + label: '时间组件', + tag: 'LinkDatePicker', + type: 'date', + tagIcon: 'checkbox', + layout: 'colFormItem', + value: [], + defaultValue: [], + clearable: true, + disableStart: false, + disableEnd: false, + showShortCutDate: false, + + span: 6, + showLabel: true, + labelWidth: null, + regList: [], + changeTag: false, + border: false, + }, + style: {}, + disabled: false, + }, + { + __config__: { + label: '复杂时间组件', + tag: 'LinkComplexTimePicker', + type: 'complexTime', + tagIcon: 'switch', + defaultValue: {}, + span: 6, + showLabel: true, + labelWidth: null, + layout: 'colFormItem', + required: false, + regList: [], + changeTag: false, + }, + style: {}, + disabled: false, + vModel: 'time', + }, + { + __config__: { + label: '品类组件', + tag: 'LinkCategoryPicker', + type: 'category', + tagIcon: 'switch', + defaultValue: [], + span: 6, + showLabel: true, + labelWidth: null, + layout: 'colFormItem', + required: false, + regList: [], + changeTag: false, + }, + style: {}, + disabled: false, + vModel: 'category', + isBeta: process.env.VUE_APP_ENVIRONMENT === 'development', + }, + { + __config__: { + label: '品牌组件', + tag: 'LinkSelectBrandSimple', + type: 'brand', + tagIcon: 'switch', + defaultValue: [], + span: 6, + showLabel: true, + labelWidth: null, + layout: 'colFormItem', + required: false, + regList: [], + changeTag: false, + }, + style: {}, + disabled: false, + vModel: 'brand', + isBeta: process.env.VUE_APP_ENVIRONMENT === 'development', + }, + { + __config__: { + label: '商品属性', + tag: 'LinkGoodsAttrPicker', + type: 'goodsAttr', + tagIcon: 'switch', + defaultValue: {}, + span: 6, + showLabel: true, + labelWidth: null, + layout: 'colFormItem', + required: false, + regList: [], + changeTag: false, + }, + style: {}, + disabled: false, + }, + { + __config__: { + label: '员工选择组件', + tag: 'LinkSelectUser', + type: 'selectUser', + tagIcon: 'switch', + defaultValue: [], + span: 6, + showLabel: true, + labelWidth: null, + layout: 'colFormItem', + required: false, + regList: [], + changeTag: false, + }, + style: {}, + disabled: false, + vModel: 'user', + isBeta: process.env.VUE_APP_ENVIRONMENT === 'development', + }, + // { + // __config__: { + // label: '滑块', + // tag: 'el-slider', + // tagIcon: 'slider', + // defaultValue: null, + // span: 6, + // showLabel: true, + // layout: 'colFormItem', + // labelWidth: null, + // required:false, + // regList: [], + // changeTag: false, + // document: 'https://element.eleme.cn/#/zh-CN/component/slider', + // }, + // disabled: false, + // min: 0, + // max: 100, + // step: 1, + // 'show-stops': false, + // range: false, + // }, + // { + // __config__: { + // label: '时间选择', + // tag: 'el-time-picker', + // tagIcon: 'time', + // defaultValue: null, + // span: 6, + // showLabel: true, + // layout: 'colFormItem', + // labelWidth: null, + // required:false, + // regList: [], + // changeTag: false, + // document: 'https://element.eleme.cn/#/zh-CN/component/time-picker', + // }, + // placeholder: '请选择', + // style: { width: '100%' }, + // disabled: false, + // clearable: true, + // 'picker-options': { + // selectableRange: '00:00:00-23:59:59', + // }, + // format: 'HH:mm:ss', + // 'value-format': 'HH:mm:ss', + // }, + // { + // __config__: { + // label: '时间范围', + // tag: 'el-time-picker', + // tagIcon: 'time-range', + // span: 6, + // showLabel: true, + // labelWidth: null, + // layout: 'colFormItem', + // defaultValue: null, + // required:false, + // regList: [], + // changeTag: false, + // document: 'https://element.eleme.cn/#/zh-CN/component/time-picker', + // }, + // style: { width: '100%' }, + // disabled: false, + // clearable: true, + // 'is-range': true, + // 'range-separator': '至', + // 'start-placeholder': '开始时间', + // 'end-placeholder': '结束时间', + // format: 'HH:mm:ss', + // 'value-format': 'HH:mm:ss', + // }, + // { + // __config__: { + // label: '日期选择', + // tag: 'el-date-picker', + // tagIcon: 'date', + // defaultValue: null, + // showLabel: true, + // labelWidth: null, + // span: 6, + // layout: 'colFormItem', + // required:false, + // regList: [], + // changeTag: false, + // document: 'https://element.eleme.cn/#/zh-CN/component/date-picker', + // }, + // placeholder: '请选择', + // type: 'date', + // style: { width: '100%' }, + // disabled: false, + // clearable: true, + // format: 'yyyy-MM-dd', + // 'value-format': 'yyyy-MM-dd', + // readonly: false, + // }, + // { + // __config__: { + // label: '日期范围', + // tag: 'el-date-picker', + // tagIcon: 'date-range', + // defaultValue: null, + // span: 6, + // showLabel: true, + // labelWidth: null, + // required:false, + // layout: 'colFormItem', + // regList: [], + // changeTag: false, + // document: 'https://element.eleme.cn/#/zh-CN/component/date-picker', + // }, + // style: { width: '100%' }, + // type: 'daterange', + // 'range-separator': '至', + // 'start-placeholder': '开始日期', + // 'end-placeholder': '结束日期', + // disabled: false, + // clearable: true, + // format: 'yyyy-MM-dd', + // 'value-format': 'yyyy-MM-dd', + // readonly: false, + // }, + // { + // __config__: { + // label: '评分', + // tag: 'el-rate', + // tagIcon: 'rate', + // defaultValue: 0, + // span: 6, + // showLabel: true, + // labelWidth: null, + // layout: 'colFormItem', + // required:false, + // regList: [], + // changeTag: false, + // document: 'https://element.eleme.cn/#/zh-CN/component/rate', + // }, + // style: {}, + // max: 5, + // 'allow-half': false, + // 'show-text': false, + // 'show-score': false, + // disabled: false, + // }, + // { + // __config__: { + // label: '颜色选择', + // tag: 'el-color-picker', + // tagIcon: 'color', + // span: 6, + // defaultValue: null, + // showLabel: true, + // labelWidth: null, + // layout: 'colFormItem', + // required:false, + // regList: [], + // changeTag: false, + // document: 'https://element.eleme.cn/#/zh-CN/component/color-picker', + // }, + // 'show-alpha': false, + // 'color-format': '', + // disabled: false, + // size: 'medium', + // }, + { + __config__: { + label: '汇总方式', + tag: 'LinkMoreTab', + type: 'summaryMethod', + placeholder: 'sss', + tagIcon: 'upload', + layout: 'colFormItem', + defaultValue: null, + showLabel: true, + labelWidth: null, + required: false, + span: 12, + showTip: false, + regList: [], + changeTag: false, + max: 5, + }, + __slot__: { + 'list-type': true, + }, + action: 'https://jsonplaceholder.typicode.com/posts/', + disabled: false, + accept: '', + name: 'file', + 'auto-upload': true, + 'list-type': 'text', + multiple: false, + alreadyHave: false, // 此字段用于控制汇总方式和导出组件是否可拖动 + vModel: 'supplier', + }, + { + __config__: { + label: '导出组件', + tag: 'LinkToolExportGroup', + layout: 'colFormItem', + tagIcon: 'upload', + defaultValue: null, + showLabel: true, + labelWidth: null, + required: false, + span: 12, + showTip: false, + }, + disabled: false, + accept: '', + name: 'file', + 'auto-upload': true, + 'list-type': 'text', + multiple: false, + alreadyHave: false, // 此字段用于控制汇总方式和导出组件是否可拖动 + }, +] + +// 布局型组件 【左面板】 +export const layoutComponents = [ + { + __config__: { + layout: 'rowFormItem', + tagIcon: 'row', + label: '行容器', + layoutTree: true, + }, + type: 'default', + justify: 'start', + align: 'top', + }, + // { + // __config__: { + // label: '按钮', + // showLabel: true, + // changeTag: false, + // labelWidth: null, + // tag: 'el-button', + // tagIcon: 'button', + // span: 6, + // layout: 'colFormItem', + // document: 'https://element.eleme.cn/#/zh-CN/component/button', + // }, + // __slot__: { + // default: '主要按钮', + // }, + // type: 'primary', + // icon: 'el-icon-search', + // round: false, + // size: 'medium', + // plain: false, + // circle: false, + // disabled: false, + // }, + // { + // __config__: { + // layout: 'colFormItem', + // tagIcon: 'table', + // tag: 'el-table', + // document: 'https://element.eleme.cn/#/zh-CN/component/table', + // span: 6, + // formId: 101, + // renderKey: 1595761764203, + // componentName: 'row101', + // showLabel: true, + // changeTag: false, + // labelWidth: null, + // label: '表格[开发中]', + // dataType: 'dynamic', + // method: 'get', + // dataPath: 'list', + // dataConsumer: 'data', + // url: 'https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/tableData', + // children: [ + // { + // __config__: { + // layout: 'raw', + // tag: 'el-table-column', + // renderKey: 15957617660153, + // }, + // prop: 'date', + // label: '日期', + // }, + // { + // __config__: { + // layout: 'raw', + // tag: 'el-table-column', + // renderKey: 15957617660152, + // }, + // prop: 'address', + // label: '地址', + // }, + // { + // __config__: { + // layout: 'raw', + // tag: 'el-table-column', + // renderKey: 15957617660151, + // }, + // prop: 'name', + // label: '名称', + // }, + // { + // __config__: { + // layout: 'raw', + // tag: 'el-table-column', + // renderKey: 1595774496335, + // children: [ + // { + // __config__: { + // label: '按钮', + // tag: 'el-button', + // tagIcon: 'button', + // layout: 'raw', + // renderKey: 1595779809901, + // }, + // __slot__: { + // default: '主要按钮', + // }, + // type: 'primary', + // icon: 'el-icon-search', + // round: false, + // size: 'medium', + // }, + // ], + // }, + // label: '操作', + // }, + // ], + // }, + // data: [], + // directives: [ + // { + // name: 'loading', + // value: true, + // }, + // ], + // border: true, + // type: 'default', + // justify: 'start', + // align: 'top', + // }, +] + +export const EmptyComponents = [ + { + __config__: { + layout: 'colEmptyItem', + tagIcon: 'row', + label: '行容器', + layoutTree: true, + }, + }, +] diff --git a/src/components/generator/config.js b/src/components/generator/config.js new file mode 100644 index 0000000..0f49986 --- /dev/null +++ b/src/components/generator/config.js @@ -0,0 +1,655 @@ +// 表单属性【右面板】 +export const formConf = { + formRef: 'elForm', + formModel: 'formData', + size: 'medium', + labelPosition: 'right', + labelWidth: 80, + formRules: 'rules', + gutter: 0, + disabled: false, + formBtns: true, +} + +// 输入型组件 【左面板】 +export const inputComponents = [ + { + // 组件的自定义配置 + __config__: { + label: '文本输入框', + labelWidth: null, + showLabel: true, + changeTag: false, + tag: 'el-input', + tagIcon: 'input', + type: 'input', + defaultValue: undefined, + required: false, + layout: 'colFormItem', + span: 6, + // 正则校验规则 + regList: [], + component_id: '', + }, + // 增加此属性可以使组件可编辑 + __vModel__: 'input', + // 其余的为可直接写在组件标签上的属性 + placeholder: '请输入', + clearable: true, + disabled: false, + }, + { + __config__: { + label: '下拉框', + showLabel: true, + labelWidth: null, + tag: 'LinkCommonSelect', + type: 'select', + tagIcon: 'select', + layout: 'colFormItem', + span: 6, + required: false, + regList: [], + changeTag: false, + component_id: '', + }, + __slot__: { + options: [], + }, + __vModel__: 'select', + placeholder: '请选择', + style: { width: '100%' }, + clearable: true, + disabled: false, + filterable: false, + multiple: false, + }, + { + // 组件的自定义配置 + __config__: { + label: '单选框', + labelWidth: null, + showLabel: false, + changeTag: false, + tag: 'el-radio', + type: 'radio', + tagIcon: 'radio', + defaultValue: 1, + required: false, + layout: 'colFormItem', + span: 6, + component_id: '', + }, + // 其余的为可直接写在组件标签上的属性 + disabled: false, + // label: '单选框', // 此属性为了让单选框的文本显示在后面 + prop: '', + }, + { + // 组件的自定义配置 + __config__: { + label: '复选框', + labelWidth: null, + showLabel: false, + changeTag: false, + tag: 'el-checkbox', + type: 'checkbox', + tagIcon: 'checkbox', + defaultValue: undefined, + required: false, + layout: 'colFormItem', + span: 6, + component_id: '', + }, + disabled: false, + // label: '复选框', // 此属性为了让单选框的文本显示在后面 + }, + { + __config__: { + label: '数字输入框', + showLabel: true, + changeTag: false, + labelWidth: null, + tag: 'el-input-number', + type: 'inputNumber', + tagIcon: 'number', + defaultValue: undefined, + span: 6, + layout: 'colFormItem', + required: false, + regList: [], + document: 'https://element.eleme.cn/#/zh-CN/component/input-number', + component_id: '', + }, + placeholder: '', + min: undefined, + max: undefined, + step: 1, + 'step-strictly': false, + precision: undefined, + 'controls-position': 'right', + disabled: false, + }, + { + __config__: { + label: '数字区间', + tag: 'LinkNumberSection', + type: 'numberSection', + layout: 'colFormItem', + tagIcon: 'nested', + defaultValue: [], + showLabel: true, + labelWidth: null, + required: false, + regList: [], + span: 6, + showTip: false, + component_id: '', + }, + __vModel__: 'numberSection', + placeholder: '请选择', + style: { width: '100%' }, + disabled: false, + defaultData: [], + }, + // { + // __config__: { + // layout: 'colEmptyItem', + // tagIcon: 'row', + // label: '占位控件', + // layoutTree: true, + // component_id: '', + // span: 6, + // type: 'LinkEmpty', + // tag: 'LinkEmpty', + // }, + // }, + { + // 组件的自定义配置 + __config__: { + label: '单个时间', + labelWidth: null, + showLabel: true, + changeTag: false, + tag: 'el-datePicker', + type: 'singDate', + tagIcon: 'time', + defaultValue: '', + required: true, + layout: 'colFormItem', + span: 6, + component_id: '', + }, + // 其余的为可直接写在组件标签上的属性 + style: {}, + singDateType: 'date', + disabled: false, + }, + { + __config__: { + label: '时间区间', + tag: 'LinkDatePicker', + type: 'date', + tagIcon: 'time', + layout: 'colFormItem', + value: [], + defaultValue: [], + clearable: true, + disableStart: false, + disableEnd: false, + showShortCutDate: false, + + span: 6, + showLabel: true, + labelWidth: null, + regList: [], + changeTag: false, + border: false, + component_id: '', + }, + style: {}, + disabled: false, + }, + { + __config__: { + label: '复杂时间', + tag: 'LinkComplexTimePicker', + type: 'complexTime', + tagIcon: 'time-range', + defaultValue: {}, + span: 6, + showLabel: true, + labelWidth: null, + layout: 'colFormItem', + required: false, + regList: [], + changeTag: false, + component_id: '', + }, + style: {}, + disabled: false, + vModel: 'time', + }, + { + __config__: { + label: 'ABC组件', + tag: 'LinkAbcComp', + type: 'abcComp', + layout: 'colFormItem', + tagIcon: 'nested', + defaultValue: [], + showLabel: true, + labelWidth: null, + required: false, + regList: [], + span: 6, + showTip: false, + component_id: '', + }, + __vModel__: 'abcComp', + placeholder: '请选择', + style: { width: '100%' }, + disabled: false, + defaultData: [], + }, + { + __config__: { + label: '动态区间', + tag: 'LinkMoveSection', + type: 'moveSection', + layout: 'colFormItem', + tagIcon: 'nested', + defaultValue: [], + showLabel: true, + labelWidth: null, + required: false, + regList: [], + span: 6, + showTip: false, + component_id: '', + }, + __vModel__: 'moveSection', + placeholder: '请选择', + style: { width: '100%' }, + disabled: false, + defaultData: [], + }, + { + __config__: { + label: '级联选择', + url: 'https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/cascaderList', + method: 'get', + dataPath: 'list', + dataConsumer: 'options', + showLabel: true, + labelWidth: null, + tag: 'el-cascader', + type: 'cascader', + tagIcon: 'cascader', + layout: 'colFormItem', + defaultValue: [], + dataType: 'dynamic', + span: 6, + required: false, + regList: [], + changeTag: false, + document: 'https://element.eleme.cn/#/zh-CN/component/cascader', + component_id: '', + }, + options: [ + { + id: 1, + value: 1, + label: '选项1', + children: [ + { + id: 2, + value: 2, + label: '选项1-1', + }, + ], + }, + ], + placeholder: '请选择', + style: { width: '100%' }, + props: { + props: { + multiple: false, + label: 'label', + value: 'value', + children: 'children', + }, + }, + 'show-all-levels': true, + disabled: false, + clearable: true, + filterable: false, + separator: '/', + }, +] + +// 选择型组件 【左面板】 +export const selectComponents = [ + { + __config__: { + label: '门店', + labelWidth: null, + showLabel: true, + tag: 'LinkSelectTreeDepartment', + type: 'storeSelect', + tagIcon: 'radio', + changeTag: false, + defaultValue: undefined, + layout: 'colFormItem', + span: 6, + optionType: 'default', + regList: [], + required: false, + border: false, + document: 'https://element.eleme.cn/#/zh-CN/component/radio', + component_id: '', + }, + __slot__: { + options: [ + { + label: '选项一', + value: 1, + }, + { + label: '选项二', + value: 2, + }, + ], + }, + __vModel__: 'department', + label: '门店', + size: 'medium', + disabled: false, + placeholder: '', + collapse: false, + charge: false, + checkedAll: false, + multi: false, + filterType: '', + tileModel: false, + ignoreDepts: [], + // 需要的时候就放开并配置好 + // platformNum, + // mode, + // departStatus, + // selectedOnlyOne, + }, + { + __config__: { + label: '人员', + tag: 'LinkSelectPersonnel', + type: 'personnel', + layout: 'colFormItem', + tagIcon: 'select', + defaultValue: [], + showLabel: true, + labelWidth: null, + required: false, + regList: [], + span: 6, + showTip: false, + component_id: '', + }, + __vModel__: 'personnel', + placeholder: '请选择', + style: { width: '100%' }, + disabled: false, + }, + { + __config__: { + label: '品类', + tag: 'LinkCategoryPicker', + type: 'category', + tagIcon: 'link', + defaultValue: [], + span: 6, + showLabel: true, + labelWidth: null, + layout: 'colFormItem', + required: false, + regList: [], + changeTag: false, + component_id: '', + }, + disabled: false, + vModel: 'category', + isBeta: process.env.VUE_APP_ENVIRONMENT === 'development', + }, + { + __config__: { + label: '品牌', + tag: 'LinkSelectBrandSimple', + type: 'brand', + tagIcon: 'nested', + defaultValue: [], + span: 6, + showLabel: true, + labelWidth: null, + layout: 'colFormItem', + required: false, + regList: [], + changeTag: false, + component_id: '', + }, + style: {}, + disabled: false, + vModel: 'brand', + isBeta: process.env.VUE_APP_ENVIRONMENT === 'development', + }, + { + __config__: { + label: '商品属性', + tag: 'LinkGoodsAttrPicker', + type: 'goodsAttr', + tagIcon: 'tree', + defaultValue: {}, + span: 6, + showLabel: true, + labelWidth: null, + layout: 'colFormItem', + required: false, + regList: [], + changeTag: false, + component_id: '', + }, + style: {}, + disabled: false, + }, + { + __config__: { + label: '活动属性', + tag: 'LinkGoodsAttrPicker', + type: 'activityAttr', + tagIcon: 'tree', + defaultValue: {}, + span: 6, + showLabel: true, + labelWidth: null, + layout: 'colFormItem', + required: false, + regList: [], + changeTag: false, + component_id: '', + remoteSettings: { + url: `${process.env.VUE_APP_CSCS_URL}/cscs-web-in/o/promoattr/getConvertAttrList.do`, + params: { + excludeStatus: 0, + status: 1, + }, + method: 'get', // 请求方法 + result: 'content.result.list', // 返回数据层级,逻辑参考lodash + codeFlag: 'code', + successCode: '0', + }, + }, + style: {}, + disabled: false, + }, + { + __config__: { + label: '商品条码', + tag: 'LinkSelectGoodsBarcode', + type: 'goodsBarcode', + layout: 'colFormItem', + tagIcon: 'nested', + defaultValue: [], + showLabel: true, + labelWidth: null, + required: false, + regList: [], + span: 6, + showTip: false, + component_id: '', + }, + __vModel__: 'goodsBarcode', + placeholder: '请选择', + style: { width: '100%' }, + disabled: false, + }, + // { + // __config__: { + // label: '员工选择组件', + // tag: 'LinkSelectUser', + // type: 'selectUser', + // tagIcon: 'user', + // defaultValue: [], + // span: 6, + // showLabel: true, + // labelWidth: null, + // layout: 'colFormItem', + // required: false, + // regList: [], + // changeTag: false, + // component_id: '', + // }, + // style: {}, + // disabled: false, + // vModel: 'user', + // isBeta: process.env.VUE_APP_ENVIRONMENT === 'development', + // }, + + // { + // __config__: { + // label: '导出组件', + // tag: 'LinkToolExportGroup', + // layout: 'colFormItem', + // tagIcon: 'example', + // defaultValue: null, + // showLabel: false, + // labelWidth: null, + // required: false, + // span: 12, + // showTip: false, + // component_id: '', + // }, + // disabled: false, + // }, + { + __config__: { + label: '供应商', + tag: 'LinkSelectSupplier', + type: 'selectSupplier', + layout: 'colFormItem', + tagIcon: 'nested', + defaultValue: [], + showLabel: true, + labelWidth: null, + required: false, + regList: [], + span: 6, + showTip: false, + component_id: '', + }, + __vModel__: 'selectSupplier', + placeholder: '请选择', + style: { width: '100%' }, + multiple: false, + disabled: false, + }, + { + __config__: { + label: '汇总方式', + tag: 'LinkMoreTab', + type: 'summaryMethod', + placeholder: '', + tagIcon: 'component', + layout: 'colFormItem', + defaultValue: null, + showLabel: true, + labelWidth: null, + required: false, + span: 6, + showTip: false, + regList: [], + changeTag: false, + max: 5, + component_id: '', + }, + __slot__: { + 'list-type': true, + }, + disabled: false, + name: 'file', + alreadyHave: false, // 此字段用于控制汇总方式和导出组件是否可拖动 + vModel: 'supplier', + }, + { + __config__: { + label: '汇总级别', + showLabel: true, + labelWidth: null, + tag: 'LinkCommonSelect', + type: 'summarySelect', + tagIcon: 'select', + layout: 'colFormItem', + span: 6, + required: false, + regList: [], + changeTag: false, + component_id: '', + }, + __slot__: { + options: [], + }, + __vModel__: 'select', + placeholder: '请选择', + style: { width: '100%' }, + clearable: true, + disabled: false, + filterable: false, + multiple: false, + }, +] + +// 布局型组件 【左面板】 +export const layoutComponents = [ + { + __config__: { + layout: 'rowFormItem', + tagIcon: 'row', + label: '行容器', + layoutTree: true, + component_id: '', + }, + type: 'default', + justify: 'start', + align: 'top', + }, +] + +export const EmptyComponents = [ + { + __config__: { + layout: 'colEmptyItem', + tagIcon: 'row', + label: '行容器', + layoutTree: true, + component_id: '', + }, + }, +] diff --git a/src/components/generator/css.js b/src/components/generator/css.js new file mode 100644 index 0000000..c078128 --- /dev/null +++ b/src/components/generator/css.js @@ -0,0 +1,18 @@ +const styles = { + 'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}', + 'el-upload': '.el-upload__tip{line-height: 1.2;}', +} + +function addCss(cssList, el) { + const css = styles[el.__config__.tag] + css && cssList.indexOf(css) === -1 && cssList.push(css) + if (el.__config__.children) { + el.__config__.children.forEach((el2) => addCss(cssList, el2)) + } +} + +export function makeUpCss(conf) { + const cssList = [] + conf.fields.forEach((el) => addCss(cssList, el)) + return cssList.join('\n') +} diff --git a/src/components/generator/drawingDefalut.js b/src/components/generator/drawingDefalut.js new file mode 100644 index 0000000..2589baa --- /dev/null +++ b/src/components/generator/drawingDefalut.js @@ -0,0 +1,39 @@ +export default [ + { + __config__: { + label: '单行文本', + labelWidth: null, + showLabel: true, + changeTag: true, + tag: 'el-input', + tagIcon: 'input', + defaultValue: undefined, + required: true, + layout: 'colFormItem', + span: 6, + document: 'https://element.eleme.cn/#/zh-CN/component/input', + // 正则校验规则 + regList: [ + { + pattern: '/^1(3|4|5|7|8|9)\\d{9}$/', + message: '手机号格式错误', + }, + ], + }, + // 组件的插槽属性 + __slot__: { + prepend: '', + append: '', + }, + __vModel__: 'mobile', + placeholder: '请输入手机号', + style: { width: '100%' }, + clearable: true, + 'prefix-icon': 'el-icon-mobile', + 'suffix-icon': '', + maxlength: 11, + 'show-word-limit': true, + readonly: false, + disabled: false, + }, +] diff --git a/src/components/generator/html.js b/src/components/generator/html.js new file mode 100644 index 0000000..a4fee41 --- /dev/null +++ b/src/components/generator/html.js @@ -0,0 +1,398 @@ +/* eslint-disable max-len */ +import ruleTrigger from './ruleTrigger' + +let confGlobal +let someSpanIsNot24 + +export function dialogWrapper(str) { + return ` + ${str} +
+ 取消 + 确定 +
+
` +} + +export function vueTemplate(str) { + return `` +} + +export function vueScript(str) { + return `` +} + +export function cssStyle(cssStr) { + return `` +} + +function buildFromBtns(scheme, type) { + let str = '' + if (scheme.formBtns && type === 'file') { + str = ` + 提交 + 重置 + ` + if (someSpanIsNot24) { + str = ` + ${str} + ` + } + } + return str +} + +function buildFormTemplate(scheme, child, type) { + let labelPosition = '' + if (scheme.labelPosition !== 'right') { + labelPosition = `label-position="${scheme.labelPosition}"` + } + const disabled = scheme.disabled ? `:disabled="${scheme.disabled}"` : '' + let str = ` + ${child} + ${buildFromBtns(scheme, type)} + ` + if (someSpanIsNot24) { + str = ` + ${str} + ` + } + return str +} + +// span不为24的用el-col包裹 +function colWrapper(scheme, str) { + if (someSpanIsNot24 || scheme.__config__.span !== 24) { + return ` + ${str} + ` + } + return str +} + +function attrBuilder(el) { + return { + tag: el.__config__.tag, + vModel: `v-model="${confGlobal.formModel}.${el.__vModel__}"`, + clearable: el.clearable ? 'clearable' : '', + placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '', + width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '', + disabled: el.disabled ? ":disabled='true'" : '', + } +} + +// el-buttin 子级 +function buildElButtonChild(scheme) { + const children = [] + const slot = scheme.__slot__ || {} + if (slot.default) { + children.push(slot.default) + } + return children.join('\n') +} + +// el-input 子级 +function buildElInputChild(scheme) { + const children = [] + const slot = scheme.__slot__ + if (slot && slot.prepend) { + children.push(``) + } + if (slot && slot.append) { + children.push(``) + } + return children.join('\n') +} + +// el-select 子级 +function buildElSelectChild(scheme) { + const children = [] + const slot = scheme.__slot__ + if (slot && slot.options && slot.options.length) { + children.push( + `` + ) + } + return children.join('\n') +} + +// el-radio-group 子级 +function buildElRadioGroupChild(scheme) { + const children = [] + const slot = scheme.__slot__ + const config = scheme.__config__ + if (slot && slot.options && slot.options.length) { + const tag = config.optionType === 'button' ? 'el-radio-button' : 'el-radio' + const border = config.border ? 'border' : '' + children.push( + `<${tag} v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}` + ) + } + return children.join('\n') +} + +// el-checkbox-group 子级 +function buildElCheckboxGroupChild(scheme) { + const children = [] + const slot = scheme.__slot__ + const config = scheme.__config__ + if (slot && slot.options && slot.options.length) { + const tag = config.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox' + const border = config.border ? 'border' : '' + children.push( + `<${tag} v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}` + ) + } + return children.join('\n') +} + +// el-upload 子级 +function buildElUploadChild(scheme) { + const list = [] + const config = scheme.__config__ + if (scheme['list-type'] === 'picture-card') list.push('') + else list.push(`${config.buttonText}`) + if (config.showTip) + list.push( + `
只能上传不超过 ${config.fileSize}${config.sizeUnit} 的${scheme.accept}文件
` + ) + return list.join('\n') +} + +const tags = { + 'el-button': (el) => { + const { tag, disabled } = attrBuilder(el) + const type = el.type ? `type="${el.type}"` : '' + const icon = el.icon ? `icon="${el.icon}"` : '' + const round = el.round ? 'round' : '' + const size = el.size ? `size="${el.size}"` : '' + const plain = el.plain ? 'plain' : '' + const circle = el.circle ? 'circle' : '' + let child = buildElButtonChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${tag} ${type} ${icon} ${round} ${size} ${plain} ${disabled} ${circle}>${child}` + }, + 'el-input': (el) => { + const { tag, disabled, vModel, clearable, placeholder, width } = attrBuilder(el) + const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : '' + const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : '' + const readonly = el.readonly ? 'readonly' : '' + const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : '' + const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : '' + const showPassword = el['show-password'] ? 'show-password' : '' + const type = el.type ? `type="${el.type}"` : '' + const autosize = + el.autosize && el.autosize.minRows + ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"` + : '' + let child = buildElInputChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}` + }, + 'el-input-number': (el) => { + const { tag, disabled, vModel, placeholder } = attrBuilder(el) + const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : '' + const min = el.min ? `:min='${el.min}'` : '' + const max = el.max ? `:max='${el.max}'` : '' + const step = el.step ? `:step='${el.step}'` : '' + const stepStrictly = el['step-strictly'] ? 'step-strictly' : '' + const precision = el.precision ? `:precision='${el.precision}'` : '' + + return `<${tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}>` + }, + 'el-select': (el) => { + const { tag, disabled, vModel, clearable, placeholder, width } = attrBuilder(el) + const filterable = el.filterable ? 'filterable' : '' + const multiple = el.multiple ? 'multiple' : '' + let child = buildElSelectChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}` + }, + 'el-radio-group': (el) => { + const { tag, disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + let child = buildElRadioGroupChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${tag} ${vModel} ${size} ${disabled}>${child}` + }, + 'el-checkbox-group': (el) => { + const { tag, disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + const min = el.min ? `:min="${el.min}"` : '' + const max = el.max ? `:max="${el.max}"` : '' + let child = buildElCheckboxGroupChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}` + }, + 'el-switch': (el) => { + const { tag, disabled, vModel } = attrBuilder(el) + const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : '' + const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : '' + const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : '' + const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : '' + const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : '' + const inactiveValue = + el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : '' + + return `<${tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}>` + }, + 'el-cascader': (el) => { + const { tag, disabled, vModel, clearable, placeholder, width } = attrBuilder(el) + const options = el.options ? `:options="${el.__vModel__}Options"` : '' + const props = el.props ? `:props="${el.__vModel__}Props"` : '' + const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"' + const filterable = el.filterable ? 'filterable' : '' + const separator = el.separator === '/' ? '' : `separator="${el.separator}"` + + return `<${tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}>` + }, + 'el-slider': (el) => { + const { tag, disabled, vModel } = attrBuilder(el) + const min = el.min ? `:min='${el.min}'` : '' + const max = el.max ? `:max='${el.max}'` : '' + const step = el.step ? `:step='${el.step}'` : '' + const range = el.range ? 'range' : '' + const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : '' + + return `<${tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}>` + }, + 'el-time-picker': (el) => { + const { tag, disabled, vModel, clearable, placeholder, width } = attrBuilder(el) + const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' + const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' + const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' + const isRange = el['is-range'] ? 'is-range' : '' + const format = el.format ? `format="${el.format}"` : '' + const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' + const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : '' + + return `<${tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}>` + }, + 'el-date-picker': (el) => { + const { tag, disabled, vModel, clearable, placeholder, width } = attrBuilder(el) + const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' + const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' + const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' + const format = el.format ? `format="${el.format}"` : '' + const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' + const type = el.type === 'date' ? '' : `type="${el.type}"` + const readonly = el.readonly ? 'readonly' : '' + + return `<${tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}>` + }, + 'el-rate': (el) => { + const { tag, disabled, vModel } = attrBuilder(el) + const max = el.max ? `:max='${el.max}'` : '' + const allowHalf = el['allow-half'] ? 'allow-half' : '' + const showText = el['show-text'] ? 'show-text' : '' + const showScore = el['show-score'] ? 'show-score' : '' + + return `<${tag} ${vModel} ${max} ${allowHalf} ${showText} ${showScore} ${disabled}>` + }, + 'el-color-picker': (el) => { + const { tag, disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + const showAlpha = el['show-alpha'] ? 'show-alpha' : '' + const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : '' + + return `<${tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}>` + }, + 'el-upload': (el) => { + const { tag } = el.__config__ + const disabled = el.disabled ? ":disabled='true'" : '' + const action = el.action ? `:action="${el.__vModel__}Action"` : '' + const multiple = el.multiple ? 'multiple' : '' + const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : '' + const accept = el.accept ? `accept="${el.accept}"` : '' + const name = el.name !== 'file' ? `name="${el.name}"` : '' + const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : '' + const beforeUpload = `:before-upload="${el.__vModel__}BeforeUpload"` + const fileList = `:file-list="${el.__vModel__}fileList"` + const ref = `ref="${el.__vModel__}"` + let child = buildElUploadChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}` + }, + tinymce: (el) => { + const { tag, vModel, placeholder } = attrBuilder(el) + const height = el.height ? `:height="${el.height}"` : '' + const branding = el.branding ? `:branding="${el.branding}"` : '' + return `<${tag} ${vModel} ${placeholder} ${height} ${branding}>` + }, +} + +const layouts = { + colFormItem(scheme) { + const config = scheme.__config__ + let labelWidth = '' + let label = `label="${config.label}"` + if (config.labelWidth && config.labelWidth !== confGlobal.labelWidth) { + labelWidth = `label-width="${config.labelWidth}px"` + } + if (config.showLabel === false) { + labelWidth = 'label-width="0"' + label = '' + } + const required = !ruleTrigger[config.tag] && config.required ? 'required' : '' + const tagDom = tags[config.tag] ? tags[config.tag](scheme) : null + let str = ` + ${tagDom} + ` + str = colWrapper(scheme, str) + return str + }, + rowFormItem(scheme) { + const config = scheme.__config__ + const type = scheme.type === 'default' ? '' : `type="${scheme.type}"` + const justify = scheme.type === 'default' ? '' : `justify="${scheme.justify}"` + const align = scheme.type === 'default' ? '' : `align="${scheme.align}"` + const gutter = scheme.gutter ? `:gutter="${scheme.gutter}"` : '' + const children = config.children.map((el) => layouts[el.__config__.layout](el)) + let str = ` + ${children.join('\n')} + ` + str = colWrapper(scheme, str) + return str + }, +} + +/** + * 组装html代码。【入口函数】 + * @param {Object} formConfig 整个表单配置 + * @param {String} type 生成类型,文件或弹窗等 + */ +export function makeUpHtml(formConfig, type) { + const htmlList = [] + confGlobal = formConfig + // 判断布局是否都沾满了24个栅格,以备后续简化代码结构 + someSpanIsNot24 = formConfig.fields.some((item) => item.__config__.span !== 24) + // 遍历渲染每个组件成html + formConfig.fields.forEach((el) => { + htmlList.push(layouts[el.__config__.layout](el)) + }) + const htmlStr = htmlList.join('\n') + // 将组件代码放进form标签 + let temp = buildFormTemplate(formConfig, htmlStr, type) + // dialog标签包裹代码 + if (type === 'dialog') { + temp = dialogWrapper(temp) + } + confGlobal = null + return temp +} diff --git a/src/components/generator/js.js b/src/components/generator/js.js new file mode 100644 index 0000000..07c538e --- /dev/null +++ b/src/components/generator/js.js @@ -0,0 +1,280 @@ +import { isArray } from 'util' +import { exportDefault, titleCase, deepClone } from '@/utils/index' +import ruleTrigger from './ruleTrigger' + +const units = { + KB: '1024', + MB: '1024 / 1024', + GB: '1024 / 1024 / 1024', +} +let confGlobal +const inheritAttrs = { + file: '', + dialog: 'inheritAttrs: false,', +} + +// 在Created调用函数 +function callInCreated(methodName, created) { + created.push(`this.${methodName}()`) +} + +// 混入处理函数 +function mixinMethod(type) { + const list = [] + const minxins = { + file: confGlobal.formBtns + ? { + submitForm: `submitForm() { + this.$refs['${confGlobal.formRef}'].validate(valid => { + if(!valid) return + // TODO 提交表单 + }) + },`, + resetForm: `resetForm() { + this.$refs['${confGlobal.formRef}'].resetFields() + },`, + } + : null, + dialog: { + onOpen: 'onOpen() {},', + onClose: `onClose() { + this.$refs['${confGlobal.formRef}'].resetFields() + },`, + close: `close() { + this.$emit('update:visible', false) + },`, + handelConfirm: `handelConfirm() { + this.$refs['${confGlobal.formRef}'].validate(valid => { + if(!valid) return + this.close() + }) + },`, + }, + } + + const methods = minxins[type] + if (methods) { + Object.keys(methods).forEach((key) => { + list.push(methods[key]) + }) + } + + return list +} + +// 构建data +function buildData(scheme, dataList) { + const config = scheme.__config__ + if (scheme.__vModel__ === undefined) return + const defaultValue = JSON.stringify(config.defaultValue) + dataList.push(`${scheme.__vModel__}: ${defaultValue},`) +} + +// 构建校验规则 +function buildRules(scheme, ruleList) { + const config = scheme.__config__ + if (scheme.__vModel__ === undefined) return + const rules = [] + if (ruleTrigger[config.tag]) { + if (config.required) { + const type = isArray(config.defaultValue) ? "type: 'array'," : '' + let message = isArray(config.defaultValue) ? `请至少选择一个${config.label}` : scheme.placeholder + if (message === undefined) message = `${config.label}不能为空` + rules.push(`{ required: true, ${type} message: '${message}', trigger: '${ruleTrigger[config.tag]}' }`) + } + if (config.regList && isArray(config.regList)) { + config.regList.forEach((item) => { + if (item.pattern) { + rules.push( + // eslint-disable-next-line no-eval + `{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${ruleTrigger[config.tag]}' }` + ) + } + }) + } + ruleList.push(`${scheme.__vModel__}: [${rules.join(',')}],`) + } +} + +// 构建options +function buildOptions(scheme, optionsList) { + if (scheme.__vModel__ === undefined) return + // el-cascader直接有options属性,其他组件都是定义在slot中,所以有两处判断 + let { options } = scheme + // eslint-disable-next-line prefer-destructuring + if (!options) options = scheme.__slot__.options + if (scheme.__config__.dataType === 'dynamic') { + options = [] + } + const str = `${scheme.__vModel__}Options: ${JSON.stringify(options)},` + optionsList.push(str) +} + +function buildProps(scheme, propsList) { + const str = `${scheme.__vModel__}Props: ${JSON.stringify(scheme.props.props)},` + propsList.push(str) +} + +// el-upload的BeforeUpload +function buildBeforeUpload(scheme) { + const config = scheme.__config__ + const unitNum = units[config.sizeUnit] + let rightSizeCode = '' + let acceptCode = '' + const returnList = [] + if (config.fileSize) { + rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${config.fileSize} + if(!isRightSize){ + this.$message.error('文件大小超过 ${config.fileSize}${config.sizeUnit}') + }` + returnList.push('isRightSize') + } + if (scheme.accept) { + acceptCode = `let isAccept = new RegExp('${scheme.accept}').test(file.type) + if(!isAccept){ + this.$message.error('应该选择${scheme.accept}类型的文件') + }` + returnList.push('isAccept') + } + const str = `${scheme.__vModel__}BeforeUpload(file) { + ${rightSizeCode} + ${acceptCode} + return ${returnList.join('&&')} + },` + return returnList.length ? str : '' +} + +// el-upload的submit +function buildSubmitUpload(scheme) { + const str = `submitUpload() { + this.$refs['${scheme.__vModel__}'].submit() + },` + return str +} + +function buildOptionMethod(methodName, model, methodList, scheme) { + const config = scheme.__config__ + const str = `${methodName}() { + // 注意:this.$axios是通过Vue.prototype.$axios = axios挂载产生的 + this.$axios({ + method: '${config.method}', + url: '${config.url}' + }).then(resp => { + var { data } = resp + this.${model} = data.${config.dataPath} + }) + },` + methodList.push(str) +} + +// js整体拼接 +function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods, created) { + const str = `${exportDefault}{ + ${inheritAttrs[type]} + components: {}, + props: [], + data () { + return { + ${conf.formModel}: { + ${data} + }, + ${conf.formRules}: { + ${rules} + }, + ${uploadVar} + ${selectOptions} + ${props} + } + }, + computed: {}, + watch: {}, + created () { + ${created} + }, + mounted () {}, + methods: { + ${methods} + } +}` + return str +} + +// 构建组件属性 +function buildAttributes(scheme, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created) { + const config = scheme.__config__ + const slot = scheme.__slot__ + buildData(scheme, dataList) + buildRules(scheme, ruleList) + + // 特殊处理options属性 + if (scheme.options || (slot && slot.options && slot.options.length)) { + buildOptions(scheme, optionsList) + if (config.dataType === 'dynamic') { + const model = `${scheme.__vModel__}Options` + const options = titleCase(model) + const methodName = `get${options}` + buildOptionMethod(methodName, model, methodList, scheme) + callInCreated(methodName, created) + } + } + + // 处理props + if (scheme.props && scheme.props.props) { + buildProps(scheme, propsList) + } + + // 处理el-upload的action + if (scheme.action && config.tag === 'el-upload') { + uploadVarList.push( + `${scheme.__vModel__}Action: '${scheme.action}', + ${scheme.__vModel__}fileList: [],` + ) + methodList.push(buildBeforeUpload(scheme)) + // 非自动上传时,生成手动上传的函数 + if (!scheme['auto-upload']) { + methodList.push(buildSubmitUpload(scheme)) + } + } + + // 构建子级组件属性 + if (config.children) { + config.children.forEach((item) => { + buildAttributes(item, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created) + }) + } +} + +/** + * 组装js 【入口函数】 + * @param {Object} formConfig 整个表单配置 + * @param {String} type 生成类型,文件或弹窗等 + */ +export function makeUpJs(formConfig, type) { + // eslint-disable-next-line no-multi-assign + confGlobal = formConfig = deepClone(formConfig) + const dataList = [] + const ruleList = [] + const optionsList = [] + const propsList = [] + const methodList = mixinMethod(type) + const uploadVarList = [] + const created = [] + + formConfig.fields.forEach((el) => { + buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created) + }) + + const script = buildexport( + formConfig, + type, + dataList.join('\n'), + ruleList.join('\n'), + optionsList.join('\n'), + uploadVarList.join('\n'), + propsList.join('\n'), + methodList.join('\n'), + created.join('\n') + ) + confGlobal = null + return script +} diff --git a/src/components/generator/ruleTrigger.js b/src/components/generator/ruleTrigger.js new file mode 100644 index 0000000..09effc0 --- /dev/null +++ b/src/components/generator/ruleTrigger.js @@ -0,0 +1,16 @@ +/** + * 用于生成表单校验,指定正则规则的触发方式。 + * 未在此处声明无触发方式的组件将不生成rule!! + */ +export default { + 'el-input': 'blur', + 'el-input-number': 'blur', + 'el-select': 'change', + 'el-radio-group': 'change', + 'el-checkbox-group': 'change', + 'el-cascader': 'change', + 'el-time-picker': 'change', + 'el-date-picker': 'change', + 'el-rate': 'change', + tinymce: 'blur', +} diff --git a/src/components/parser/Parser.vue b/src/components/parser/Parser.vue new file mode 100644 index 0000000..2c04d10 --- /dev/null +++ b/src/components/parser/Parser.vue @@ -0,0 +1,191 @@ + diff --git a/src/components/parser/README.md b/src/components/parser/README.md new file mode 100644 index 0000000..b91be7e --- /dev/null +++ b/src/components/parser/README.md @@ -0,0 +1,17 @@ +## form-generator JSON 解析器 +>用于将form-generator导出的JSON解析成一个表单。 + +### 安装组件 +``` +npm i form-gen-parser +``` +或者 +``` +yarn add form-gen-parser +``` + +### 使用示例 +> [查看在线示例](https://mrhj.gitee.io/form-generator/#/parser) + +示例代码: +> [src\components\parser\example\Index.vue](https://github.com/JakHuang/form-generator/blob/dev/src/components/parser/example/Index.vue) diff --git a/src/components/parser/example/Index.vue b/src/components/parser/example/Index.vue new file mode 100644 index 0000000..87d2a40 --- /dev/null +++ b/src/components/parser/example/Index.vue @@ -0,0 +1,320 @@ + + + + + diff --git a/src/components/parser/index.js b/src/components/parser/index.js new file mode 100644 index 0000000..0a44b2c --- /dev/null +++ b/src/components/parser/index.js @@ -0,0 +1,3 @@ +import Parser from './Parser' + +export default Parser diff --git a/src/components/preview/api/common.js b/src/components/preview/api/common.js new file mode 100644 index 0000000..c16f50c --- /dev/null +++ b/src/components/preview/api/common.js @@ -0,0 +1,196 @@ +import qs from 'qs' +import requestUtil from '@/utils/request' +import { handleEncryptParams } from '@/utils/aesCrypto' + + +// const REPORT_API = +// window.location.host.indexOf('test') !== -1 || window.location.protocol === 'http:' +// ? 'http://test.report.linkkids.cn' +// : 'https://report.linkkids.cn' +// const BASE_API = +// window.location.host.indexOf('test') !== -1 || window.location.protocol === 'http:' +// ? 'http://test.base.linkkids.cn' +// : 'https://base.linkkids.cn' +const BAPI_API = + window.location.host.indexOf('test') !== -1 || window.location.protocol === 'http:' + ? 'http://testbapi.linkkids.cn' + : 'https://bapi.linkkids.cn' +const BAPI_API2 = + window.location.host.indexOf('test') !== -1 || window.location.protocol === 'http:' + ? 'http://bapi.linkkids.cn' + : 'https://bapi.linkkids.cn' + +const ENCRYPT_LIST = [ + '/table/calculateCheck', + '/table/filterCheck', + '/table/saveSetting', + '/content/getTotal', + '/content/getData', + '/content/getTableHeaders', + '/content/getLayOutPageData', + '/content/getLayOutPageTotal', + '/data/getTableHeaders', + '/data/getLayOutPageTotal', + '/data/getLayOutPageData', + '/dataset/executeDataSet', + '/dataset/sqlDataSetSync', + '/dyna/getDynaParams', + '/component/addChart', + '/dashboardfile/save', + 'component/updateComponent', + '/content/saveTableOptions', + 'component/add', +] +const ENCRYPT_SET = new Set(ENCRYPT_LIST) + +export default { + // 请求远程配置 + remoteServiceRequest: async ({ url, params, formData, headers, method = 'post', withCredentials = true }) => { + const newParam = params.param + newParam.drill_condition = JSON.stringify(newParam.drill_condition) === '{}' ? null : newParam.drill_condition + newParam.skip_condition = newParam.skip_condition ? { skip_key: newParam.skip_condition } : null + if (ENCRYPT_SET.has(params.apiCode)) { + params.param = handleEncryptParams(newParam) + } else { + params.param = newParam + } + + const data = { + url: `${url}?${params.apiCode || (formData || {}).apiCode || ''}`, + method, + withCredentials, + [{ + get: 'params', + post: 'data', + put: 'data', + }[method.toLocaleLowerCase()]]: params, + } + if (headers) { + data.headers = headers + data.data = qs.stringify(data.data) + } + // if (['put', 'post'].includes(method.toLocaleLowerCase())) { + // headers = { + // 'Content-Type': 'application/x-www-form-urlencode', + // } + // data.headers = headers + // } + // if (headers) { + // data.headers = headers + // console.log('headers:', headers) + // const contentType = get(headers, 'Content-Type') + // if (contentType && contentType.indexOf('application/x-www-form-urlencode') > -1) { + // data.data = qs.stringify(data.data) + // } + // } + // 把数组参数join + if (data && data.data) { + Object.keys(data.data).forEach((item) => { + if (Array.isArray(data.data[item])) { + data.data[item] = data.data[item].join(',') + } + }) + } + if (data && data.params) { + Object.keys(data.params).forEach((item) => { + if (Array.isArray(data.params[item])) { + data.params[item] = data.params[item].join(',') + } + }) + } + if (formData) { + data.data = formData + } + console.log('转换之后的请求参数为:', data) + const res = await requestUtil(data) + return (res && res.data) || {} + }, + // 导出 + exportData: async (data) => { + const res = await requestUtil({ + url: `${process.env.VUE_APP_BI_DOMAIN}/${process.env.VUE_APP_LINKDATA_GATEWAY || 'linkdata-gateway'}/route?/content/export`, + method: 'post', + data, + }) + return (res && res.data) || {} + }, + // 导入 + addImport: async ({ params, formData: data }) => { + const res = await requestUtil({ + url: `${BAPI_API2}/czyl-file-api/task/addImport.do?${qs.stringify(params)}`, + method: 'post', + data, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + }) + return (res && res.data) || {} + }, + // 选项接口--查询默认配置(废弃) + queryTaskFieldConfig: async (data) => { + const res = await requestUtil({ + // url: `${BASE_API}/bmc/field/queryTaskFieldConfig.do`, + url: `${process.env.VUE_APP_BI_DOMAIN}/${process.env.VUE_APP_LINKDATA_GATEWAY || 'linkdata-gateway'}/route?/content/getTableHeaders`, + method: 'post', + data: { + ...data, + apiCode: '/content/getTableHeaders', + dispatcherSystem: 'report', + param: handleEncryptParams({ + report_id: data.report_id, + label_id: data.label_id, + }), + }, + }) + return (res && res.data) || {} + }, + // 选项接口--查询租户配置 + queryUserFieldConfig: async (data) => { + const drill = JSON.stringify(data.drill_condition) === '{}' ? null : data.drill_condition + const skip = data.skip_condition ? { skip_key: data.skip_condition } : null + const res = await requestUtil({ + // url: `${BASE_API}/bmc/field/queryUserFieldConfig.do`, + url: `${process.env.VUE_APP_BI_DOMAIN}/${process.env.VUE_APP_LINKDATA_GATEWAY || 'linkdata-gateway'}/route?/content/getTableHeaders`, + method: 'post', + data: { + apiCode: '/content/getTableHeaders', + dispatcherSystem: 'report', + param: handleEncryptParams({ + report_id: data.report_id, + label_id: data.label_id, + path: data.path, + drill_condition: drill, + skip_condition: skip, + checked_dimensions: data.checked_dimensions, + app_code: data.app_code, + }), + }, + }) + return (res && res.data) || {} + }, + skipKeyGenerator: async (data) => { + const res = await requestUtil({ + url: `${process.env.VUE_APP_BI_DOMAIN}/${process.env.VUE_APP_LINKDATA_GATEWAY || 'linkdata-gateway'}/route?/content/skipParamSave`, + method: 'post', + data: { + apiCode: '/content/skipParamSave', + dispatcherSystem: 'report', + param: { + path: data.path, + skip_condition: data.skipCondition, + app_code: data.app_code, + }, + }, + }) + return (res && res.data) || {} + }, + // 级联品类 + getGoodsCategory: async (params) => { + const res = await requestUtil({ + url: `${BAPI_API}/category-api/categoryNav/qryCategoryList.do`, + method: 'get', + params, + }) + return (res && res.data) || {} + }, +} diff --git a/src/components/preview/api/table.js b/src/components/preview/api/table.js new file mode 100644 index 0000000..e86d2ab --- /dev/null +++ b/src/components/preview/api/table.js @@ -0,0 +1,114 @@ +import qs from 'qs' +import { handleEncryptParams } from '@/utils/aesCrypto' +import request from '@/utils/request' + +const ENCRYPT_LIST = [ + '/table/calculateCheck', + '/table/filterCheck', + '/table/saveSetting', + '/content/getTotal', + '/content/getData', + '/content/getTableHeaders', + '/content/getLayOutPageData', + '/content/getLayOutPageTotal', + '/data/getTableHeaders', + '/data/getLayOutPageTotal', + '/data/getLayOutPageData', + '/dataset/executeDataSet', + '/dataset/sqlDataSetSync', + '/dyna/getDynaParams', + '/component/addChart', + '/dashboardfile/save', + 'component/updateComponent', + '/content/saveTableOptions', + 'component/add', +] +const ENCRYPT_SET = new Set(ENCRYPT_LIST) + +export default { + // 请求远程配置 + remoteServiceRequest: async ({ url, params, formData, headers, method = 'post', withCredentials = true }) => { + const newParam = params.param + newParam.drill_condition = JSON.stringify(newParam.drill_condition) === '{}' ? null : newParam.drill_condition + newParam.skip_condition = newParam.skip_condition ? { skip_key: newParam.skip_condition } : null + if (ENCRYPT_SET.has(params.apiCode)) { + params.param = handleEncryptParams(newParam) + } else { + params.param = newParam + } + + const data = { + url: `${url}?${params.apiCode || (formData || {}).apiCode || ''}`, + method, + withCredentials, + [{ + get: 'params', + post: 'data', + put: 'data', + }[method.toLocaleLowerCase()]]: params, + } + if (headers) { + data.headers = headers + data.data = qs.stringify(data.data) + } + // if (['put', 'post'].includes(method.toLocaleLowerCase())) { + // headers = { + // 'Content-Type': 'application/x-www-form-urlencode', + // } + // data.headers = headers + // } + // if (headers) { + // data.headers = headers + // console.log('headers:', headers) + // const contentType = get(headers, 'Content-Type') + // if (contentType && contentType.indexOf('application/x-www-form-urlencode') > -1) { + // data.data = qs.stringify(data.data) + // } + // } + // 把数组参数join + if (data && data.data) { + Object.keys(data.data).forEach((item) => { + if (Array.isArray(data.data[item])) { + data.data[item] = data.data[item].join(',') + } + }) + } + if (data && data.params) { + Object.keys(data.params).forEach((item) => { + if (Array.isArray(data.params[item])) { + data.params[item] = data.params[item].join(',') + } + }) + } + if (formData) { + data.data = formData + } + console.log('转换之后的请求参数为:', data) + const res = await request(data) + return (res && res.data) || {} + }, + // 选项接口--查询租户配置 + queryUserFieldConfig: async (data) => { + const drill = JSON.stringify(data.drill_condition) === '{}' ? null : data.drill_condition + const skip = data.skip_condition ? { skip_key: data.skip_condition } : null + const res = await request({ + // url: `${BASE_API}/bmc/field/queryUserFieldConfig.do`, + url: `${process.env.VUE_APP_BI_DOMAIN}/${process.env.VUE_APP_LINKDATA_GATEWAY || 'linkdata-gateway'}/route?/content/getTableHeaders`, + method: 'post', + data: { + apiCode: '/content/getTableHeaders', + dispatcherSystem: 'report', + param: handleEncryptParams({ + report_id: data.report_id, + label_id: data.label_id, + path: data.path, + drill_condition: drill, + skip_condition: skip, + checked_dimensions: data.checked_dimensions, + app_code: data.app_code, + }), + }, + }) + return (res && res.data) || {} + }, +} diff --git a/src/components/preview/components/addOrEditDialog.vue b/src/components/preview/components/addOrEditDialog.vue new file mode 100644 index 0000000..7845378 --- /dev/null +++ b/src/components/preview/components/addOrEditDialog.vue @@ -0,0 +1,184 @@ + + + diff --git a/src/components/preview/components/cascader.vue b/src/components/preview/components/cascader.vue new file mode 100644 index 0000000..f398877 --- /dev/null +++ b/src/components/preview/components/cascader.vue @@ -0,0 +1,191 @@ + + + diff --git a/src/components/preview/main.vue b/src/components/preview/main.vue new file mode 100644 index 0000000..fb3acbe --- /dev/null +++ b/src/components/preview/main.vue @@ -0,0 +1,3108 @@ + + + + + + diff --git a/src/components/preview/table.vue b/src/components/preview/table.vue new file mode 100644 index 0000000..37f2723 --- /dev/null +++ b/src/components/preview/table.vue @@ -0,0 +1,642 @@ + + + + diff --git a/src/components/preview/utils.js b/src/components/preview/utils.js new file mode 100644 index 0000000..3040c58 --- /dev/null +++ b/src/components/preview/utils.js @@ -0,0 +1,513 @@ +/* eslint-disable no-restricted-syntax */ +// import { Loading, Message } from 'element-ui' +import qs from 'qs' +import commonApi from './api/common' + +// 递归拿到列的配置,因为列有可能是合并过的 +function getColumn(columns, item) { + // 如果当前列包含了,直接返回 + let column = columns.find((perColumn) => perColumn.field === item.prop) + if (column) { + return column + } + // 如果当前列不包含,则从它的children中去找 + for (let i = 0; i < columns.length; i++) { + if (Array.isArray(columns[i].children)) { + column = getColumn(columns[i].children, item) + if (column) { + return column + } + } + } +} + +/** + * 处理url + * @param {string} url + * @returns {Object} + */ +export const getQueryObject = (url) => { + url = url == null ? window.location.href : url + const search = url.substring(url.lastIndexOf('?') + 1) + const obj = {} + const reg = /([^?&=]+)=([^?&=]*)/g + search.replace(reg, (rs, $1, $2) => { + const name = decodeURIComponent($1) + let val = decodeURIComponent($2) + val = String(val) + obj[name] = val + return rs + }) + return obj +} + +/** + * iframe打开新页面 + * @param str path,如果要跳rmc或者scm,请在path的query中添加domain=scm或者rmc + * @param str 新开iframe名称 + * @param number type 1 打开iframe 2 普通跳转 + * @returns null + */ +export const openInIframe = (path, name = 'tab', type = 1) => { + console.log('打开新窗口', type, path, name) + if (!path) return + const realPath = path.startsWith('http') ? path : `${location.protocol}${path}` + const { domain } = getQueryObject(path) + switch (+type) { + case 1: + console.log('进入跳转1', window.postMessage, parent !== window) + console.log("path.search('/scm/')", getQueryObject(path)) + console.log('domain:', domain) + if (window.postMessage && parent !== window) { + // scm,仅支持短链接 + // if (domain === 'scm') { + // console.log('进入scm跳转', path) + // // 单独给scm做处理,scm中tab标签路由必须是全匹配,不能带多余的参数,是个坑 + // const purePath = path.replace(/(\?|&)domain=scm/, '') + // console.log('处理之后的链接为:', purePath) + // window.parent.postMessage({ type: 'scmTabOperator', addTabPath: purePath }, '*') + // } + // // rmc + // if (path.search('/rmc/') !== -1 || domain === 'rmc') { + console.log('进入rmc跳转') + window.parent.postMessage('openInFarme_' + JSON.stringify({ path: realPath, name }), '*') + // } + } else { + console.log('非iframe打开新窗口:', realPath) + window.open(realPath, '_blank') + } + break + case 2: + console.log('case 2 打开新窗口:', realPath) + window.open(realPath, '_blank') + break + case 3: + console.log('case 3,location', realPath) + location.href = realPath + } +} + +// 操作列点击跳转事件 +export const redirectUrl = ({ row, openUrl }) => { + console.log('openUrl:', openUrl) + if (!openUrl) return + const queryObject = getQueryObject(openUrl) + console.log('queryObject:', queryObject) + const { openType, openTitle } = queryObject + const url = openUrl.split('?')[0] + const urlParams = JSON.parse(JSON.stringify(queryObject)) + delete urlParams.openType + delete urlParams.openTitle + // 动态参数 + const result = {} + Object.keys(urlParams).forEach((i) => { + result[i] = urlParams[i] + if (!urlParams[i]) result[i] = row[i] + }) + if (urlParams.params) { + const remoteParams = JSON.parse(urlParams.params.replace(/'/g, '"')) + Object.keys(remoteParams).forEach((i) => { + result[i] = remoteParams[i] + if (!remoteParams[i]) result[i] = row[i] + }) + } + // delete result.params + console.log('打开的url为:', `${url}?${qs.stringify(result)}`, openTitle, openType) + openInIframe(`${url}?${qs.stringify(result)}`, openTitle, openType) +} + +/* +转换字符串表达式 +data: 要转换的数据 +expression:要转换的表达式 +*/ +export const compileExpression = function (data, expression) { + try { + const keys = Object.keys(data) + // eslint-disable-next-line no-new-func + const f = new Function('row', `const { ${keys.join(',')} } = row;return ${expression}`) + return f(data) + } catch (e) { + console.warn('转换表达式失败', e, expression) + return '' + } +} + +/** + * [isJson 判断是否是json对象] + * @param {[object]} obj [对象] + * @return {Boolean} + */ +export const isJson = (obj) => Object.prototype.toString.call(obj).toLowerCase() === '[object object]' && !obj.length + +/** + * 合并列 + * @param {*} mergeColumns 合并的列,规则为 + * [ + { + "title": "会员信息", // 合并之后列的名称 + "children": [ + "xx", // 每一列的field + "xx", + .... + ] + }, + * @param {*} alreadyColumns 所有列 + * @param {*} position 合并之后在怎么插入到所有列之后,left:最左边,right: 最右边,common:在合并列的第一个位置 + * @returns + */ +export const mergeColumn = (mergeColumns, alreadyColumns, position = 'common') => { + const willDeleteList = [] + // 构造需要合并的列 + if (Array.isArray(mergeColumns) && mergeColumns.length > 0) { + // 遍历需要合并的列配置 + mergeColumns.forEach((item, rootIndex) => { + let currentIndex = Number.MAX_SAFE_INTEGER + const { children } = item + // 判断哪些列需要合并到一起 + if (Array.isArray(children)) { + children.forEach((child, childIndex) => { + // 找出field在列中的位置 + const index = alreadyColumns.findIndex((columns) => { + switch (typeof child) { + case 'string': + return columns.field === child + case 'object': + return columns.field === child.field + } + return -1 + }) + if (index > -1) { + // 如果找到,记下它的位置 + currentIndex = Math.min(index, currentIndex) + children[childIndex] = JSON.parse(JSON.stringify(alreadyColumns[index])) + delete children[childIndex].fixed + willDeleteList.push(alreadyColumns[index].field) + // children[childIndex] = alreadyColumns.splice(index, 1) + // 纪录它上一个值,用来做插入 + if (currentIndex >= 0) { + mergeColumns[rootIndex].firstField = alreadyColumns[currentIndex].field + } else { + mergeColumns[rootIndex].firstField = null + } + } + }) + } else { + console.warn('多表头配置错误:', item) + } + }) + } + switch (position) { + case 'common': { + // 把合并的列加入到列表 + mergeColumns.forEach((item) => { + const { firstField } = item + const firstIndex = alreadyColumns.findIndex((columns) => columns.field === firstField) + alreadyColumns.splice(Math.max(firstIndex, 0), 0, item) + }) + break + } + case 'left': { + alreadyColumns = mergeColumns.concat(alreadyColumns) + break + } + case 'right': { + alreadyColumns = alreadyColumns.concat(mergeColumns) + } + } + // 删除需要合并的列 + willDeleteList.forEach((deleteItem) => { + const index = alreadyColumns.findIndex((item) => item.field === deleteItem) + alreadyColumns.splice(index, 1) + }) + console.log('合并之后的列为:', alreadyColumns) + return alreadyColumns +} + +// 合并编辑列的数据 +// export const mergeEditRowData = (columns, row, params) => { +export const mergeRowData = ({ columns, row, form }) => { + if (Array.isArray(form)) { + form.forEach((item) => { + if (row) { + item.value = row[item.prop] + } + // const currentColumn = columns.find((column) => column.field === item.prop) + const currentColumn = getColumn(columns, item) + if (currentColumn) { + item.title = currentColumn.title + } else { + console.warn('【行编辑】编辑行找不到对应的列名称', item.prop) + } + }) + } else { + console.warn('【行编辑】编辑行配置form不是数组') + } + console.log('合并之后的form:', form) + return form +} + +// 错误消息键 +export const errMsgList = ['message', 'errMsg', 'msg'] + +// 从接口获取msg信息 +export const setErrorMsgFromAPI = function (res, defaultMsg = '操作失败') { + let err = '' + for (let i = 0; i < errMsgList.length; i++) { + if (res[errMsgList[i]]) { + err = res[errMsgList[i]] + break + } + } + defaultMsg = err || defaultMsg + return defaultMsg +} + +// 解析url,目前主要用在编辑场景,弹框编辑,行编辑 +// row:当前行数据 +// url:配置的url规则 +export const compileUrl = (row, url) => { + return url.replace(/\$\{(.+?)\}\$/g, function (item) { + const expression = item.substring(2, item.length - 2) + console.log('expression:', expression) + const value = compileExpression(row, expression) + console.log('value:', value) + if (isJson(value) || Array.isArray(value)) { + return JSON.stringify(value) + } + return value + }) +} + +/** + * 新增和行内编辑,弹框编辑时调用的方法 + * @param {configUrl} 请求的url + * @param {formData} 表单中的数据 + * @param {success} 表单中的数据 + * @param {callback} 成功之后的回调,编辑之后要更新当前列,新增之后刷新列表 + * @param {errorCallback} 失败之后的回调,编辑要恢复数据,新增要清空数据(可不传,关闭弹框已清除) + * @param {type} add or edit + * @param {global} 传入当前上下文,用来做message和loading + * + */ +export const requestEdit = async ({ configUrl, formData, success, callback, errorCallback, type = 'edit', global }) => { + const loading = global.$loading() + try { + const { method, params, header = 'json' } = getQueryObject(configUrl) + const url = configUrl.substring(0, configUrl.indexOf('?')) + const requestParam = {} + requestParam.url = url + requestParam.method = method + let mergeParams = {} + if (type === 'edit') { + // 合并参数, params为url配置的参数,formData为表单修改之后的数据,重复的数据以表单修改的数据为准 + mergeParams = { + ...JSON.parse(params), + ...formData, + } + } else { + mergeParams = { + ...formData, + } + } + requestParam.params = mergeParams + if (header === 'form') { + requestParam.headers = { + 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', + } + } + console.log('【编辑行】请求参数为:', requestParam, this) + const result = await commonApi.remoteServiceRequest(requestParam) + const { key, value } = success + console.log(result[key] === value) + if (result[key] === value) { + // Message.close() + loading.close() + global.$message.success('操作成功') + callback && callback(mergeParams) + } else { + const msg = setErrorMsgFromAPI(result, '操作失败') + // Message.close() + loading.close() + global.$message.warning(msg) + errorCallback && errorCallback() + } + // loading.close() + loading.close() + } catch (e) { + // loading.close() + loading.close() + } +} + +export const formatDate = function (fmt, date) { + let ret + const opt = { + 'Y+': date.getFullYear().toString(), // 年 + 'M+': (date.getMonth() + 1).toString(), // 月 + 'D+': date.getDate().toString(), // 日 + 'h+': date.getHours().toString(), // 时 + 'm+': date.getMinutes().toString(), // 分 + 's+': date.getSeconds().toString(), // 秒 + } + // eslint-disable-next-line no-restricted-syntax + // eslint-disable-next-line guard-for-in + // eslint-disable-next-line no-restricted-syntax + // eslint-disable-next-line guard-for-in + for (const k in opt) { + ret = new RegExp('(' + k + ')').exec(fmt) + if (ret) { + fmt = fmt.replace(ret[1], ret[1].length === 1 ? opt[k] : opt[k].padStart(ret[1].length, '0')) + } + } + return fmt +} + +// 遍历选中的项,目前仅支持两级 +export const getFullPathByNode = function (allSelectedNodes) { + const arr = [] + // 遍历所有选中的节点 + allSelectedNodes.forEach((node) => { + // 如果是一级节点,直接添加 + if (node.level === 1) { + arr.push(node) + } else { + // 如果不是一级节点,找出它的父节点 + const parentNode = node.parent + // 如果父节点没加入,递归找出所有选中的子节点,并且把父节点加入 + if (!arr.find((item) => item.value === parentNode.value)) { + parentNode.children2 = parentNode.children.filter((item) => item.checked) + arr.push(parentNode) + } else if (!Array.isArray(!parentNode.children2)) { + // 如果父节点已经选中,但是没有初始化children2 + parentNode.children2 = parentNode.children.filter((item) => item.checked) + } else if (!parentNode.children2.find((item) => item.value === node.value)) { + // 如果父节点已加入,但是当前节点没加入,把当前节点加入 + console.log('不存在节点,直接添加') + parentNode.children2.push(node) + } + } + }) + console.log('arr:', arr) + return arr +} + +// 递归编辑级联选择组件,获取值 +export const cleanCascaderData = function (arr, res) { + for (let i = 0; i < arr.length; i++) { + res.push({ + value: arr[i].value, + label: arr[i].label, + }) + if (arr[i].children2) { + res[i].children = [] + cleanCascaderData(arr[i].children2, res[i].children) + } + } +} + +// 规范化多级目录的选项 +export const setCascaderItem = function (list, itemLabel, itemValue) { + Array.isArray(list) && + list.forEach((item) => { + item.label = item[itemLabel] + item.value = item[itemValue] + if (Array.isArray(item.children)) { + setCascaderItem(item.children, itemLabel, itemValue) + } + }) + return list +} + +// 大数据默认query配置 +// 大数据需要同时读取数据和汇总数据,type:query 查询数据 type:summary汇总数据 +export const bigDataDefaultConfig = (type = 'query', isBeta) => { + const defaultConfig = { + // url: `//${isBeta ? 'test.' : ''}report.linkkids.cn/lkrpt/o/m/report/queryData.do`, + url: `${process.env.VUE_APP_BI_DOMAIN}/${process.env.VUE_APP_LINKDATA_GATEWAY || 'linkdata-gateway'}/route`, + method: 'post', + page: { + sizeKey: 'page_index', + indexKey: 'page_size', + }, + success: { + key: 'code', + value: 0, + }, + result: 'data', + total: 'data.count', + } + if (type === 'summary') { + // 汇总 + defaultConfig.total = 'total' + defaultConfig.result = 'data' + } + return defaultConfig +} + +// 获取门店数据,假设页面中有多个门店组件 +export const getDepartmentOptions = (searchForm, page) => { + const selectedItems = {} + searchForm.forEach((row) => { + row.forEach((item) => { + if (item.type === 'storeSelect') { + let currentObj = page.$refs[item.prop] + // 如果找到了组件 + if (Array.isArray(currentObj) && currentObj.length > 0) { + currentObj = currentObj[0] + const selectedOptions = page.searchFormData[item.prop] + // console.log('$$$$$$', selectedOptions, selectedOptions.length) + // 如果选中了值 + if (selectedOptions.length > 0) { + selectedItems[item.prop] = selectedOptions + // console.log('####',selectedItems[item.prop] ) + if (Array.isArray(selectedItems[item.prop]) && selectedItems[item.prop].length > 0) { + selectedItems[item.prop] = selectedItems[item.prop].reduce((pre, next) => { + if (!pre) { + return `'${next}'` + } + return `${pre},'${next}'` + }, '') + } + } else if (item.defaultSelectedAll) { + // 没有选中值,并且defaultSelectedAll为true,把所有的值全部带给接口 + selectedItems[item.prop] = currentObj.getAllStoreDepts() + if (Array.isArray(selectedItems[item.prop]) && selectedItems[item.prop].length > 0) { + selectedItems[item.prop] = selectedItems[item.prop].reduce((pre, next) => { + if (!pre) { + return `'${next}'` + } + return `${pre},'${next}'` + }, '') + } + } + } + } + }) + }) + // console.log('&&&&&', selectedItems) + return selectedItems +} + +// 把查询条件中的多选选项改为字符串形式 +// 目前使用场景:查询、导出、url弹框,搜索区域confirm按钮等 +export const setSearchParams = function (moreChoose, isNeedSingleQuotation = true) { + // 把搜索参数带入iframe,数组形式的数据转换为字符串,和查询保持一致 + const searchParams = JSON.parse(JSON.stringify(moreChoose)) + if (searchParams) { + Object.keys(searchParams).forEach((item) => { + if (Array.isArray(searchParams[item]) && searchParams[item].length > 0) { + // searchParams[item] = searchParams[item].join(',') + // to-do 是否全部处理 + if (isNeedSingleQuotation) { + searchParams[item] = searchParams[item].slice(1).reduce((pre, next) => { + return `${pre},'${next}'` + }, `'${searchParams[item][0]}'`) + } else { + searchParams[item] = searchParams[item].join(',') + } + } + }) + } + return searchParams +} diff --git a/src/components/preview/validate.js b/src/components/preview/validate.js new file mode 100644 index 0000000..071f013 --- /dev/null +++ b/src/components/preview/validate.js @@ -0,0 +1,91 @@ +const emailReg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/ // 邮箱 +const phoneReg = /^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/ // 手机号 +const charCNReg = /^[\u4e00-\u9fa5]{0,}$/ // 中文 +const charENReg = /^[A-Za-z]+$/ // 英文字符 +const charEnAndNumReg = /^[A-Za-z0-9]+$/ // 英文和数字 + +// const EMPTYMESSAGE = '必填项不能为空' +// const INFO = { +// number: { +// emptyMsg: EMPTYMESSAGE, +// wrongMsg: '请输入数字', +// }, +// email: { +// emptyMsg: EMPTYMESSAGE, +// wrongMsg: '请检查邮箱格式', +// }, +// phone: { +// emptyMsg: EMPTYMESSAGE, +// wrongMsg: '请检查手机号格式', +// }, +// charCN: { +// emptyMsg: EMPTYMESSAGE, +// wrongMsg: '请检查是否输入了非汉字字符', +// }, +// charEN: { +// emptyMsg: EMPTYMESSAGE, +// wrongMsg: '请检查是否输入了非英文字符', +// }, +// charEnAndNumReg: { +// emptyMsg: EMPTYMESSAGE, +// wrongMsg: '请检查是否输入了英文及数字以外的字符', +// }, +// } + +function validateFun(check, value, callback, msg) { + if (!value) { + return callback(new Error(msg)) + } + setTimeout(() => { + if (check) { + callback(new Error(msg)) + } else { + callback() + } + }) +} + +// 纯数字校验 +const number = (rule, value, callback) => { + const check = !Number.isInteger(value) + validateFun(check, value, callback, ' ') +} + +// 邮箱校验 +const email = (rule, value, callback) => { + const check = !emailReg.test(value) + validateFun(check, value, callback, ' ') +} + +// 手机号校验 +const phone = (rule, value, callback) => { + const check = !phoneReg.test(value) + validateFun(check, value, callback, ' ') +} + +// 纯汉字校验 +const charCN = (rule, value, callback) => { + const check = !charCNReg.test(value) + validateFun(check, value, callback, ' ') +} + +// 纯英文字符校验(不区分大小写) +const charEN = (rule, value, callback) => { + const check = !charENReg.test(value) + validateFun(check, value, callback, ' ') +} + +// 英文字符和数字校验(不区分大小写) +const charENandNumber = (rule, value, callback) => { + const check = !charEnAndNumReg.test(value) + validateFun(check, value, callback, ' ') +} + +export default { + number, // 纯数字校验 + email, // 邮箱校验 + phone, // 手机号校验 + charCN, // 纯汉字校验 + charEN, // 纯英文字符校验(不区分大小写) + charENandNumber, // 英文字符和数字校验(不区分大小写) +} diff --git a/src/components/render/render.js b/src/components/render/render.js new file mode 100644 index 0000000..389fa8d --- /dev/null +++ b/src/components/render/render.js @@ -0,0 +1,124 @@ +import { deepClone } from '@/utils/index' + +const componentChild = {} +/** + * 将./slots中的文件挂载到对象componentChild上 + * 文件名为key,对应JSON配置中的__config__.tag + * 文件内容为value,解析JSON配置中的__slot__ + */ +const slotsFiles = require.context('./slots', false, /\.js$/) +const keys = slotsFiles.keys() || [] +keys.forEach((key) => { + const tag = key.replace(/^\.\/(.*)\.\w+$/, '$1') + const value = slotsFiles(key).default + componentChild[tag] = value +}) + +function vModel(dataObject, defaultValue) { + dataObject.props.value = defaultValue + + dataObject.on.input = (val) => { + this.$emit('input', val) + } +} + +function mountSlotFiles(h, confClone, children) { + const childObjs = componentChild[confClone.__config__.tag] + if (childObjs) { + Object.keys(childObjs).forEach((key) => { + const childFunc = childObjs[key] + if (confClone.__slot__ && confClone.__slot__[key]) { + children.push(childFunc(h, confClone, key)) + } + }) + } +} + +function emitEvents(confClone) { + ;['on', 'nativeOn'].forEach((attr) => { + const eventKeyList = Object.keys(confClone[attr] || {}) + eventKeyList.forEach((key) => { + const val = confClone[attr][key] + if (typeof val === 'string') { + confClone[attr][key] = (event) => this.$emit(val, event) + } + }) + }) +} + +function clearAttrs(dataObject) { + delete dataObject.attrs.__config__ + delete dataObject.attrs.__slot__ + delete dataObject.attrs.__methods__ +} + +function buildDataObject(confClone, dataObject) { + Object.keys(confClone).forEach((key) => { + const val = confClone[key] + if (key === '__vModel__') { + vModel.call(this, dataObject, confClone.__config__.defaultValue) + } else if (dataObject[key] !== undefined) { + if ( + dataObject[key] === null || + dataObject[key] instanceof RegExp || + ['boolean', 'string', 'number', 'function'].includes(typeof dataObject[key]) + ) { + dataObject[key] = val + } else if (Array.isArray(dataObject[key])) { + dataObject[key] = [...dataObject[key], ...val] + } else { + dataObject[key] = { ...dataObject[key], ...val } + } + } else { + dataObject.attrs[key] = val + } + }) + + // 清理属性 + clearAttrs(dataObject) +} + +function makeDataObject() { + // 深入数据对象: + // https://cn.vuejs.org/v2/guide/render-function.html#%E6%B7%B1%E5%85%A5%E6%95%B0%E6%8D%AE%E5%AF%B9%E8%B1%A1 + return { + class: {}, + attrs: {}, + props: {}, + domProps: {}, + nativeOn: {}, + on: {}, + style: {}, + directives: [], + scopedSlots: {}, + slot: null, + key: null, + ref: null, + refInFor: true, + } +} + +export default { + props: { + conf: { + type: Object, + required: true, + }, + }, + render(h) { + const dataObject = makeDataObject() + const confClone = deepClone(this.conf) + const children = this.$slots.default || [] + + // 如果slots文件夹存在与当前tag同名的文件,则执行文件中的代码 + mountSlotFiles.call(this, h, confClone, children) + + // 将字符串类型的事件,发送为消息 + emitEvents.call(this, confClone) + + // 将json表单配置转化为vue render可以识别的 “数据对象(dataObject)” + buildDataObject.call(this, confClone, dataObject) + + return h(this.conf.__config__.tag, dataObject, children) + }, +} diff --git a/src/components/render/slots/el-button.js b/src/components/render/slots/el-button.js new file mode 100644 index 0000000..03d801d --- /dev/null +++ b/src/components/render/slots/el-button.js @@ -0,0 +1,5 @@ +export default { + default(h, conf, key) { + return conf.__slot__[key] + }, +} diff --git a/src/components/render/slots/el-checkbox-group.js b/src/components/render/slots/el-checkbox-group.js new file mode 100644 index 0000000..3250889 --- /dev/null +++ b/src/components/render/slots/el-checkbox-group.js @@ -0,0 +1,17 @@ +export default { + options(h, conf, key) { + const list = [] + conf.__slot__.options.forEach((item) => { + if (conf.__config__.optionType === 'button') { + list.push({item.label}) + } else { + list.push( + + {item.label} + + ) + } + }) + return list + }, +} diff --git a/src/components/render/slots/el-input.js b/src/components/render/slots/el-input.js new file mode 100644 index 0000000..3f54898 --- /dev/null +++ b/src/components/render/slots/el-input.js @@ -0,0 +1,8 @@ +export default { + prepend(h, conf, key) { + return + }, + append(h, conf, key) { + return + }, +} diff --git a/src/components/render/slots/el-radio-group.js b/src/components/render/slots/el-radio-group.js new file mode 100644 index 0000000..208cac6 --- /dev/null +++ b/src/components/render/slots/el-radio-group.js @@ -0,0 +1,17 @@ +export default { + options(h, conf, key) { + const list = [] + conf.__slot__.options.forEach((item) => { + if (conf.__config__.optionType === 'button') { + list.push({item.label}) + } else { + list.push( + + {item.label} + + ) + } + }) + return list + }, +} diff --git a/src/components/render/slots/el-select.js b/src/components/render/slots/el-select.js new file mode 100644 index 0000000..09ca4a1 --- /dev/null +++ b/src/components/render/slots/el-select.js @@ -0,0 +1,9 @@ +export default { + options(h, conf, key) { + const list = [] + conf.__slot__.options.forEach((item) => { + list.push() + }) + return list + }, +} diff --git a/src/components/render/slots/el-upload.js b/src/components/render/slots/el-upload.js new file mode 100644 index 0000000..bccd48a --- /dev/null +++ b/src/components/render/slots/el-upload.js @@ -0,0 +1,24 @@ +export default { + 'list-type': (h, conf, key) => { + const list = [] + const config = conf.__config__ + if (conf['list-type'] === 'picture-card') { + list.push() + } else { + list.push( + + {config.buttonText} + + ) + } + if (config.showTip) { + list.push( +
+ 只能上传不超过 {config.fileSize} + {config.sizeUnit} 的{conf.accept}文件 +
+ ) + } + return list + }, +} diff --git a/src/components/targetInfo/index.js b/src/components/targetInfo/index.js new file mode 100644 index 0000000..470df5c --- /dev/null +++ b/src/components/targetInfo/index.js @@ -0,0 +1,9 @@ +// 指标说明 +import RetailTargetInfo from './src/main.vue' + +// 为组件提供 install 安装方法,供按需引入 +RetailTargetInfo.install = function (Vue) { + Vue.component(RetailTargetInfo.name, RetailTargetInfo) +} + +export default RetailTargetInfo diff --git a/src/components/targetInfo/src/api/index.js b/src/components/targetInfo/src/api/index.js new file mode 100644 index 0000000..d5dcdbc --- /dev/null +++ b/src/components/targetInfo/src/api/index.js @@ -0,0 +1,22 @@ +import requestUtil from '@/utils/request' + +const request = requestUtil.axios +export default { + // 查询指标 + getTargetInfo: async (params) => { + const res = await request({ + url: `${process.env.VUE_APP_BI_DOMAIN}/${process.env.VUE_APP_LINKDATA_GATEWAY || 'linkdata-gateway'}/route?/quota/getQuotaList`, + method: 'post', + data: { + apiCode: '/quota/getQuotaList', + dispatcherSystem: 'common', + param: { + table_id: params.table_id, + report_id: params.report_id, + app_code: params.app_code, + }, + }, + }) + return (res && res.data) || {} + }, +} diff --git a/src/components/targetInfo/src/main.vue b/src/components/targetInfo/src/main.vue new file mode 100644 index 0000000..7419657 --- /dev/null +++ b/src/components/targetInfo/src/main.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/src/components/tinymce/README.md b/src/components/tinymce/README.md new file mode 100644 index 0000000..65c01e2 --- /dev/null +++ b/src/components/tinymce/README.md @@ -0,0 +1,3 @@ +## 简介 +富文本编辑器tinymce的一个vue版本封装。使用cdn动态脚本引入的方式加载。 + diff --git a/src/components/tinymce/config.js b/src/components/tinymce/config.js new file mode 100644 index 0000000..74b9140 --- /dev/null +++ b/src/components/tinymce/config.js @@ -0,0 +1,8 @@ +/* eslint-disable max-len */ + +export const plugins = [ + 'advlist anchor autolink autosave code codesample directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textpattern visualblocks visualchars wordcount', +] +export const toolbar = [ + 'code searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote removeformat subscript superscript codesample hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen', +] diff --git a/src/components/tinymce/example/Index.vue b/src/components/tinymce/example/Index.vue new file mode 100644 index 0000000..b7a3bfb --- /dev/null +++ b/src/components/tinymce/example/Index.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/components/tinymce/index.js b/src/components/tinymce/index.js new file mode 100644 index 0000000..1e83179 --- /dev/null +++ b/src/components/tinymce/index.js @@ -0,0 +1,3 @@ +import Index from './index.vue' + +export default Index diff --git a/src/components/tinymce/index.vue b/src/components/tinymce/index.vue new file mode 100644 index 0000000..4b2df8d --- /dev/null +++ b/src/components/tinymce/index.vue @@ -0,0 +1,88 @@ +