From c7f14a8b21c2400f8d509a64dc19260216fbbcab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 30 May 2023 17:51:51 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E8=BF=81=E7=A7=BB=20vue3=20=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=88=B0=E4=B8=BB=E4=BB=93=E5=BA=93=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E7=BB=B4=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui-vue3/.editorconfig | 21 + ruoyi-ui-vue3/.env.development | 17 + ruoyi-ui-vue3/.env.production | 20 + ruoyi-ui-vue3/.gitignore | 23 + ruoyi-ui-vue3/README.md | 83 +++ ruoyi-ui-vue3/bin/build.bat | 12 + ruoyi-ui-vue3/bin/package.bat | 12 + ruoyi-ui-vue3/bin/run-web.bat | 12 + ruoyi-ui-vue3/html/ie.html | 46 ++ ruoyi-ui-vue3/index.html | 215 +++++++ ruoyi-ui-vue3/package.json | 43 ++ ruoyi-ui-vue3/public/favicon.ico | Bin 0 -> 8131 bytes ruoyi-ui-vue3/src/App.vue | 15 + ruoyi-ui-vue3/src/api/demo/demo.js | 54 ++ ruoyi-ui-vue3/src/api/demo/tree.js | 44 ++ ruoyi-ui-vue3/src/api/login.js | 59 ++ ruoyi-ui-vue3/src/api/menu.js | 9 + ruoyi-ui-vue3/src/api/monitor/cache.js | 57 ++ ruoyi-ui-vue3/src/api/monitor/logininfor.js | 34 + ruoyi-ui-vue3/src/api/monitor/online.js | 18 + ruoyi-ui-vue3/src/api/monitor/operlog.js | 26 + ruoyi-ui-vue3/src/api/system/config.js | 72 +++ ruoyi-ui-vue3/src/api/system/dept.js | 52 ++ ruoyi-ui-vue3/src/api/system/dict/data.js | 52 ++ ruoyi-ui-vue3/src/api/system/dict/type.js | 60 ++ ruoyi-ui-vue3/src/api/system/menu.js | 60 ++ ruoyi-ui-vue3/src/api/system/notice.js | 44 ++ ruoyi-ui-vue3/src/api/system/oss.js | 27 + ruoyi-ui-vue3/src/api/system/ossConfig.js | 58 ++ ruoyi-ui-vue3/src/api/system/post.js | 44 ++ ruoyi-ui-vue3/src/api/system/role.js | 119 ++++ ruoyi-ui-vue3/src/api/system/user.js | 135 ++++ ruoyi-ui-vue3/src/api/tool/gen.js | 85 +++ ruoyi-ui-vue3/src/assets/401_images/401.gif | Bin 0 -> 164227 bytes ruoyi-ui-vue3/src/assets/404_images/404.png | Bin 0 -> 98071 bytes .../src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes ruoyi-ui-vue3/src/assets/icons/svg/404.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/bug.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/build.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/button.svg | 1 + .../src/assets/icons/svg/cascader.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/chart.svg | 1 + .../src/assets/icons/svg/checkbox.svg | 1 + .../src/assets/icons/svg/clipboard.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/code.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/color.svg | 1 + .../src/assets/icons/svg/component.svg | 1 + .../src/assets/icons/svg/dashboard.svg | 1 + .../src/assets/icons/svg/date-range.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/date.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/dict.svg | 1 + .../src/assets/icons/svg/documentation.svg | 1 + .../src/assets/icons/svg/download.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/drag.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/druid.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/edit.svg | 1 + .../src/assets/icons/svg/education.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/email.svg | 1 + .../src/assets/icons/svg/example.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/excel.svg | 1 + .../src/assets/icons/svg/exit-fullscreen.svg | 1 + .../src/assets/icons/svg/eye-open.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/eye.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/form.svg | 1 + .../src/assets/icons/svg/fullscreen.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/github.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/guide.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/icon.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/input.svg | 1 + .../src/assets/icons/svg/international.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/job.svg | 1 + .../src/assets/icons/svg/language.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/link.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/list.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/lock.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/log.svg | 1 + .../src/assets/icons/svg/logininfor.svg | 1 + .../src/assets/icons/svg/message.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/money.svg | 1 + .../src/assets/icons/svg/monitor.svg | 2 + ruoyi-ui-vue3/src/assets/icons/svg/nested.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/number.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/online.svg | 1 + .../src/assets/icons/svg/password.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/pdf.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/people.svg | 1 + .../src/assets/icons/svg/peoples.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/phone.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/post.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/qq.svg | 1 + .../src/assets/icons/svg/question.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/radio.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/rate.svg | 1 + .../src/assets/icons/svg/redis-list.svg | 2 + ruoyi-ui-vue3/src/assets/icons/svg/redis.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/row.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/search.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/select.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/server.svg | 1 + .../src/assets/icons/svg/shopping.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/size.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/skill.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/slider.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/star.svg | 1 + .../src/assets/icons/svg/swagger.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/switch.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/system.svg | 2 + ruoyi-ui-vue3/src/assets/icons/svg/tab.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/table.svg | 1 + .../src/assets/icons/svg/textarea.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/theme.svg | 1 + .../src/assets/icons/svg/time-range.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/time.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/tool.svg | 1 + .../src/assets/icons/svg/tree-table.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/tree.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/upload.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/user.svg | 1 + .../src/assets/icons/svg/validCode.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/wechat.svg | 1 + ruoyi-ui-vue3/src/assets/icons/svg/zip.svg | 1 + ruoyi-ui-vue3/src/assets/images/dark.svg | 39 ++ ruoyi-ui-vue3/src/assets/images/light.svg | 39 ++ .../src/assets/images/login-background.jpg | Bin 0 -> 577784 bytes ruoyi-ui-vue3/src/assets/images/profile.jpg | Bin 0 -> 275351 bytes ruoyi-ui-vue3/src/assets/logo/logo.png | Bin 0 -> 8131 bytes ruoyi-ui-vue3/src/assets/styles/btn.scss | 99 +++ .../src/assets/styles/element-ui.scss | 96 +++ ruoyi-ui-vue3/src/assets/styles/index.scss | 184 ++++++ ruoyi-ui-vue3/src/assets/styles/mixin.scss | 66 ++ ruoyi-ui-vue3/src/assets/styles/ruoyi.scss | 277 ++++++++ ruoyi-ui-vue3/src/assets/styles/sidebar.scss | 238 +++++++ .../src/assets/styles/transition.scss | 49 ++ .../src/assets/styles/variables.module.scss | 65 ++ .../src/components/Breadcrumb/index.vue | 66 ++ .../src/components/DictTag/index.vue | 86 +++ ruoyi-ui-vue3/src/components/Editor/index.vue | 245 +++++++ .../src/components/FileUpload/index.vue | 218 +++++++ .../src/components/Hamburger/index.vue | 41 ++ .../src/components/HeaderSearch/index.vue | 179 ++++++ .../src/components/IconSelect/index.vue | 111 ++++ .../src/components/IconSelect/requireIcons.js | 8 + .../src/components/ImagePreview/index.vue | 85 +++ .../src/components/ImageUpload/index.vue | 223 +++++++ .../src/components/Pagination/index.vue | 105 +++ .../src/components/ParentView/index.vue | 3 + .../src/components/RightToolbar/index.vue | 105 +++ .../src/components/RuoYi/Doc/index.vue | 13 + .../src/components/RuoYi/Git/index.vue | 13 + .../src/components/Screenfull/index.vue | 22 + .../src/components/SizeSelect/index.vue | 45 ++ .../src/components/SvgIcon/index.vue | 53 ++ .../src/components/SvgIcon/svgicon.js | 10 + ruoyi-ui-vue3/src/components/TopNav/index.vue | 192 ++++++ .../src/components/TreeSelect/index.vue | 156 +++++ ruoyi-ui-vue3/src/components/iFrame/index.vue | 31 + .../src/directive/common/copyText.js | 66 ++ ruoyi-ui-vue3/src/directive/index.js | 9 + .../src/directive/permission/hasPermi.js | 28 + .../src/directive/permission/hasRole.js | 28 + .../src/layout/components/AppMain.vue | 67 ++ .../layout/components/IframeToggle/index.vue | 19 + .../src/layout/components/InnerLink/index.vue | 24 + .../src/layout/components/Navbar.vue | 191 ++++++ .../src/layout/components/Settings/index.vue | 241 +++++++ .../src/layout/components/Sidebar/Link.vue | 40 ++ .../src/layout/components/Sidebar/Logo.vue | 81 +++ .../layout/components/Sidebar/SidebarItem.vue | 102 +++ .../src/layout/components/Sidebar/index.vue | 54 ++ .../layout/components/TagsView/ScrollPane.vue | 105 +++ .../src/layout/components/TagsView/index.vue | 338 ++++++++++ ruoyi-ui-vue3/src/layout/components/index.js | 4 + ruoyi-ui-vue3/src/layout/index.vue | 111 ++++ ruoyi-ui-vue3/src/main.js | 88 +++ ruoyi-ui-vue3/src/permission.js | 63 ++ ruoyi-ui-vue3/src/plugins/auth.js | 60 ++ ruoyi-ui-vue3/src/plugins/cache.js | 77 +++ ruoyi-ui-vue3/src/plugins/download.js | 65 ++ ruoyi-ui-vue3/src/plugins/index.js | 18 + ruoyi-ui-vue3/src/plugins/modal.js | 82 +++ ruoyi-ui-vue3/src/plugins/tab.js | 69 ++ ruoyi-ui-vue3/src/router/index.js | 175 +++++ ruoyi-ui-vue3/src/settings.js | 47 ++ ruoyi-ui-vue3/src/store/index.js | 3 + ruoyi-ui-vue3/src/store/modules/app.js | 46 ++ ruoyi-ui-vue3/src/store/modules/dict.js | 57 ++ ruoyi-ui-vue3/src/store/modules/permission.js | 138 ++++ ruoyi-ui-vue3/src/store/modules/settings.js | 38 ++ ruoyi-ui-vue3/src/store/modules/tagsView.js | 182 ++++++ ruoyi-ui-vue3/src/store/modules/user.js | 70 ++ ruoyi-ui-vue3/src/utils/auth.js | 15 + ruoyi-ui-vue3/src/utils/dict.js | 24 + ruoyi-ui-vue3/src/utils/dynamicTitle.js | 15 + ruoyi-ui-vue3/src/utils/errorCode.js | 6 + ruoyi-ui-vue3/src/utils/index.js | 390 +++++++++++ ruoyi-ui-vue3/src/utils/jsencrypt.js | 30 + ruoyi-ui-vue3/src/utils/permission.js | 51 ++ ruoyi-ui-vue3/src/utils/request.js | 148 +++++ ruoyi-ui-vue3/src/utils/ruoyi.js | 246 +++++++ ruoyi-ui-vue3/src/utils/scroll-to.js | 58 ++ ruoyi-ui-vue3/src/utils/theme.js | 49 ++ ruoyi-ui-vue3/src/utils/validate.js | 93 +++ ruoyi-ui-vue3/src/views/demo/demo/index.vue | 403 ++++++++++++ ruoyi-ui-vue3/src/views/demo/tree/index.vue | 281 ++++++++ ruoyi-ui-vue3/src/views/error/401.vue | 82 +++ ruoyi-ui-vue3/src/views/error/404.vue | 227 +++++++ ruoyi-ui-vue3/src/views/index.vue | 176 +++++ ruoyi-ui-vue3/src/views/login.vue | 215 +++++++ .../src/views/monitor/admin/index.vue | 13 + .../src/views/monitor/cache/index.vue | 129 ++++ .../src/views/monitor/cache/list.vue | 246 +++++++ .../src/views/monitor/logininfor/index.vue | 225 +++++++ .../src/views/monitor/online/index.vue | 106 +++ .../src/views/monitor/operlog/index.vue | 291 +++++++++ .../src/views/monitor/xxljob/index.vue | 13 + ruoyi-ui-vue3/src/views/redirect/index.vue | 14 + ruoyi-ui-vue3/src/views/register.vue | 219 +++++++ .../src/views/system/config/index.vue | 306 +++++++++ ruoyi-ui-vue3/src/views/system/dept/index.vue | 278 ++++++++ ruoyi-ui-vue3/src/views/system/dict/data.vue | 350 ++++++++++ ruoyi-ui-vue3/src/views/system/dict/index.vue | 313 +++++++++ ruoyi-ui-vue3/src/views/system/menu/index.vue | 441 +++++++++++++ .../src/views/system/notice/index.vue | 283 ++++++++ ruoyi-ui-vue3/src/views/system/oss/config.vue | 382 +++++++++++ ruoyi-ui-vue3/src/views/system/oss/index.vue | 372 +++++++++++ ruoyi-ui-vue3/src/views/system/post/index.vue | 277 ++++++++ .../src/views/system/role/authUser.vue | 172 +++++ ruoyi-ui-vue3/src/views/system/role/index.vue | 560 ++++++++++++++++ .../src/views/system/role/selectUser.vue | 140 ++++ .../src/views/system/user/authRole.vue | 112 ++++ ruoyi-ui-vue3/src/views/system/user/index.vue | 608 ++++++++++++++++++ .../src/views/system/user/profile/index.vue | 87 +++ .../views/system/user/profile/resetPwd.vue | 57 ++ .../views/system/user/profile/userAvatar.vue | 171 +++++ .../views/system/user/profile/userInfo.vue | 56 ++ ruoyi-ui-vue3/src/views/tool/build/index.vue | 3 + .../src/views/tool/gen/basicInfoForm.vue | 48 ++ .../src/views/tool/gen/editTable.vue | 198 ++++++ .../src/views/tool/gen/genInfoForm.vue | 281 ++++++++ .../src/views/tool/gen/importTable.vue | 118 ++++ ruoyi-ui-vue3/src/views/tool/gen/index.vue | 296 +++++++++ ruoyi-ui-vue3/vite.config.js | 57 ++ ruoyi-ui-vue3/vite/plugins/auto-import.js | 12 + ruoyi-ui-vue3/vite/plugins/compression.js | 28 + ruoyi-ui-vue3/vite/plugins/index.js | 15 + ruoyi-ui-vue3/vite/plugins/setup-extend.js | 5 + ruoyi-ui-vue3/vite/plugins/svg-icon.js | 10 + ruoyi-ui/README.md | 3 - 248 files changed, 17465 insertions(+), 3 deletions(-) create mode 100644 ruoyi-ui-vue3/.editorconfig create mode 100644 ruoyi-ui-vue3/.env.development create mode 100644 ruoyi-ui-vue3/.env.production create mode 100644 ruoyi-ui-vue3/.gitignore create mode 100644 ruoyi-ui-vue3/README.md create mode 100644 ruoyi-ui-vue3/bin/build.bat create mode 100644 ruoyi-ui-vue3/bin/package.bat create mode 100644 ruoyi-ui-vue3/bin/run-web.bat create mode 100644 ruoyi-ui-vue3/html/ie.html create mode 100644 ruoyi-ui-vue3/index.html create mode 100644 ruoyi-ui-vue3/package.json create mode 100644 ruoyi-ui-vue3/public/favicon.ico create mode 100644 ruoyi-ui-vue3/src/App.vue create mode 100644 ruoyi-ui-vue3/src/api/demo/demo.js create mode 100644 ruoyi-ui-vue3/src/api/demo/tree.js create mode 100644 ruoyi-ui-vue3/src/api/login.js create mode 100644 ruoyi-ui-vue3/src/api/menu.js create mode 100644 ruoyi-ui-vue3/src/api/monitor/cache.js create mode 100644 ruoyi-ui-vue3/src/api/monitor/logininfor.js create mode 100644 ruoyi-ui-vue3/src/api/monitor/online.js create mode 100644 ruoyi-ui-vue3/src/api/monitor/operlog.js create mode 100644 ruoyi-ui-vue3/src/api/system/config.js create mode 100644 ruoyi-ui-vue3/src/api/system/dept.js create mode 100644 ruoyi-ui-vue3/src/api/system/dict/data.js create mode 100644 ruoyi-ui-vue3/src/api/system/dict/type.js create mode 100644 ruoyi-ui-vue3/src/api/system/menu.js create mode 100644 ruoyi-ui-vue3/src/api/system/notice.js create mode 100644 ruoyi-ui-vue3/src/api/system/oss.js create mode 100644 ruoyi-ui-vue3/src/api/system/ossConfig.js create mode 100644 ruoyi-ui-vue3/src/api/system/post.js create mode 100644 ruoyi-ui-vue3/src/api/system/role.js create mode 100644 ruoyi-ui-vue3/src/api/system/user.js create mode 100644 ruoyi-ui-vue3/src/api/tool/gen.js create mode 100644 ruoyi-ui-vue3/src/assets/401_images/401.gif create mode 100644 ruoyi-ui-vue3/src/assets/404_images/404.png create mode 100644 ruoyi-ui-vue3/src/assets/404_images/404_cloud.png create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/404.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/bug.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/build.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/button.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/cascader.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/chart.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/checkbox.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/clipboard.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/code.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/color.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/component.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/dashboard.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/date-range.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/date.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/dict.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/documentation.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/download.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/drag.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/druid.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/edit.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/education.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/email.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/example.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/excel.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/exit-fullscreen.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/eye-open.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/eye.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/form.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/fullscreen.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/github.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/guide.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/icon.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/input.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/international.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/job.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/language.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/link.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/list.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/lock.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/log.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/logininfor.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/message.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/money.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/monitor.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/nested.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/number.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/online.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/password.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/pdf.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/people.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/peoples.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/phone.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/post.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/qq.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/question.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/radio.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/rate.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/redis-list.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/redis.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/row.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/search.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/select.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/server.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/shopping.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/size.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/skill.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/slider.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/star.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/swagger.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/switch.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/system.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/tab.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/table.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/textarea.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/theme.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/time-range.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/time.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/tool.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/tree-table.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/tree.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/upload.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/user.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/validCode.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/wechat.svg create mode 100644 ruoyi-ui-vue3/src/assets/icons/svg/zip.svg create mode 100644 ruoyi-ui-vue3/src/assets/images/dark.svg create mode 100644 ruoyi-ui-vue3/src/assets/images/light.svg create mode 100644 ruoyi-ui-vue3/src/assets/images/login-background.jpg create mode 100644 ruoyi-ui-vue3/src/assets/images/profile.jpg create mode 100644 ruoyi-ui-vue3/src/assets/logo/logo.png create mode 100644 ruoyi-ui-vue3/src/assets/styles/btn.scss create mode 100644 ruoyi-ui-vue3/src/assets/styles/element-ui.scss create mode 100644 ruoyi-ui-vue3/src/assets/styles/index.scss create mode 100644 ruoyi-ui-vue3/src/assets/styles/mixin.scss create mode 100644 ruoyi-ui-vue3/src/assets/styles/ruoyi.scss create mode 100644 ruoyi-ui-vue3/src/assets/styles/sidebar.scss create mode 100644 ruoyi-ui-vue3/src/assets/styles/transition.scss create mode 100644 ruoyi-ui-vue3/src/assets/styles/variables.module.scss create mode 100644 ruoyi-ui-vue3/src/components/Breadcrumb/index.vue create mode 100644 ruoyi-ui-vue3/src/components/DictTag/index.vue create mode 100644 ruoyi-ui-vue3/src/components/Editor/index.vue create mode 100644 ruoyi-ui-vue3/src/components/FileUpload/index.vue create mode 100644 ruoyi-ui-vue3/src/components/Hamburger/index.vue create mode 100644 ruoyi-ui-vue3/src/components/HeaderSearch/index.vue create mode 100644 ruoyi-ui-vue3/src/components/IconSelect/index.vue create mode 100644 ruoyi-ui-vue3/src/components/IconSelect/requireIcons.js create mode 100644 ruoyi-ui-vue3/src/components/ImagePreview/index.vue create mode 100644 ruoyi-ui-vue3/src/components/ImageUpload/index.vue create mode 100644 ruoyi-ui-vue3/src/components/Pagination/index.vue create mode 100644 ruoyi-ui-vue3/src/components/ParentView/index.vue create mode 100644 ruoyi-ui-vue3/src/components/RightToolbar/index.vue create mode 100644 ruoyi-ui-vue3/src/components/RuoYi/Doc/index.vue create mode 100644 ruoyi-ui-vue3/src/components/RuoYi/Git/index.vue create mode 100644 ruoyi-ui-vue3/src/components/Screenfull/index.vue create mode 100644 ruoyi-ui-vue3/src/components/SizeSelect/index.vue create mode 100644 ruoyi-ui-vue3/src/components/SvgIcon/index.vue create mode 100644 ruoyi-ui-vue3/src/components/SvgIcon/svgicon.js create mode 100644 ruoyi-ui-vue3/src/components/TopNav/index.vue create mode 100644 ruoyi-ui-vue3/src/components/TreeSelect/index.vue create mode 100644 ruoyi-ui-vue3/src/components/iFrame/index.vue create mode 100644 ruoyi-ui-vue3/src/directive/common/copyText.js create mode 100644 ruoyi-ui-vue3/src/directive/index.js create mode 100644 ruoyi-ui-vue3/src/directive/permission/hasPermi.js create mode 100644 ruoyi-ui-vue3/src/directive/permission/hasRole.js create mode 100644 ruoyi-ui-vue3/src/layout/components/AppMain.vue create mode 100644 ruoyi-ui-vue3/src/layout/components/IframeToggle/index.vue create mode 100644 ruoyi-ui-vue3/src/layout/components/InnerLink/index.vue create mode 100644 ruoyi-ui-vue3/src/layout/components/Navbar.vue create mode 100644 ruoyi-ui-vue3/src/layout/components/Settings/index.vue create mode 100644 ruoyi-ui-vue3/src/layout/components/Sidebar/Link.vue create mode 100644 ruoyi-ui-vue3/src/layout/components/Sidebar/Logo.vue create mode 100644 ruoyi-ui-vue3/src/layout/components/Sidebar/SidebarItem.vue create mode 100644 ruoyi-ui-vue3/src/layout/components/Sidebar/index.vue create mode 100644 ruoyi-ui-vue3/src/layout/components/TagsView/ScrollPane.vue create mode 100644 ruoyi-ui-vue3/src/layout/components/TagsView/index.vue create mode 100644 ruoyi-ui-vue3/src/layout/components/index.js create mode 100644 ruoyi-ui-vue3/src/layout/index.vue create mode 100644 ruoyi-ui-vue3/src/main.js create mode 100644 ruoyi-ui-vue3/src/permission.js create mode 100644 ruoyi-ui-vue3/src/plugins/auth.js create mode 100644 ruoyi-ui-vue3/src/plugins/cache.js create mode 100644 ruoyi-ui-vue3/src/plugins/download.js create mode 100644 ruoyi-ui-vue3/src/plugins/index.js create mode 100644 ruoyi-ui-vue3/src/plugins/modal.js create mode 100644 ruoyi-ui-vue3/src/plugins/tab.js create mode 100644 ruoyi-ui-vue3/src/router/index.js create mode 100644 ruoyi-ui-vue3/src/settings.js create mode 100644 ruoyi-ui-vue3/src/store/index.js create mode 100644 ruoyi-ui-vue3/src/store/modules/app.js create mode 100644 ruoyi-ui-vue3/src/store/modules/dict.js create mode 100644 ruoyi-ui-vue3/src/store/modules/permission.js create mode 100644 ruoyi-ui-vue3/src/store/modules/settings.js create mode 100644 ruoyi-ui-vue3/src/store/modules/tagsView.js create mode 100644 ruoyi-ui-vue3/src/store/modules/user.js create mode 100644 ruoyi-ui-vue3/src/utils/auth.js create mode 100644 ruoyi-ui-vue3/src/utils/dict.js create mode 100644 ruoyi-ui-vue3/src/utils/dynamicTitle.js create mode 100644 ruoyi-ui-vue3/src/utils/errorCode.js create mode 100644 ruoyi-ui-vue3/src/utils/index.js create mode 100644 ruoyi-ui-vue3/src/utils/jsencrypt.js create mode 100644 ruoyi-ui-vue3/src/utils/permission.js create mode 100644 ruoyi-ui-vue3/src/utils/request.js create mode 100644 ruoyi-ui-vue3/src/utils/ruoyi.js create mode 100644 ruoyi-ui-vue3/src/utils/scroll-to.js create mode 100644 ruoyi-ui-vue3/src/utils/theme.js create mode 100644 ruoyi-ui-vue3/src/utils/validate.js create mode 100644 ruoyi-ui-vue3/src/views/demo/demo/index.vue create mode 100644 ruoyi-ui-vue3/src/views/demo/tree/index.vue create mode 100644 ruoyi-ui-vue3/src/views/error/401.vue create mode 100644 ruoyi-ui-vue3/src/views/error/404.vue create mode 100644 ruoyi-ui-vue3/src/views/index.vue create mode 100644 ruoyi-ui-vue3/src/views/login.vue create mode 100644 ruoyi-ui-vue3/src/views/monitor/admin/index.vue create mode 100644 ruoyi-ui-vue3/src/views/monitor/cache/index.vue create mode 100644 ruoyi-ui-vue3/src/views/monitor/cache/list.vue create mode 100644 ruoyi-ui-vue3/src/views/monitor/logininfor/index.vue create mode 100644 ruoyi-ui-vue3/src/views/monitor/online/index.vue create mode 100644 ruoyi-ui-vue3/src/views/monitor/operlog/index.vue create mode 100644 ruoyi-ui-vue3/src/views/monitor/xxljob/index.vue create mode 100644 ruoyi-ui-vue3/src/views/redirect/index.vue create mode 100644 ruoyi-ui-vue3/src/views/register.vue create mode 100644 ruoyi-ui-vue3/src/views/system/config/index.vue create mode 100644 ruoyi-ui-vue3/src/views/system/dept/index.vue create mode 100644 ruoyi-ui-vue3/src/views/system/dict/data.vue create mode 100644 ruoyi-ui-vue3/src/views/system/dict/index.vue create mode 100644 ruoyi-ui-vue3/src/views/system/menu/index.vue create mode 100644 ruoyi-ui-vue3/src/views/system/notice/index.vue create mode 100644 ruoyi-ui-vue3/src/views/system/oss/config.vue create mode 100644 ruoyi-ui-vue3/src/views/system/oss/index.vue create mode 100644 ruoyi-ui-vue3/src/views/system/post/index.vue create mode 100644 ruoyi-ui-vue3/src/views/system/role/authUser.vue create mode 100644 ruoyi-ui-vue3/src/views/system/role/index.vue create mode 100644 ruoyi-ui-vue3/src/views/system/role/selectUser.vue create mode 100644 ruoyi-ui-vue3/src/views/system/user/authRole.vue create mode 100644 ruoyi-ui-vue3/src/views/system/user/index.vue create mode 100644 ruoyi-ui-vue3/src/views/system/user/profile/index.vue create mode 100644 ruoyi-ui-vue3/src/views/system/user/profile/resetPwd.vue create mode 100644 ruoyi-ui-vue3/src/views/system/user/profile/userAvatar.vue create mode 100644 ruoyi-ui-vue3/src/views/system/user/profile/userInfo.vue create mode 100644 ruoyi-ui-vue3/src/views/tool/build/index.vue create mode 100644 ruoyi-ui-vue3/src/views/tool/gen/basicInfoForm.vue create mode 100644 ruoyi-ui-vue3/src/views/tool/gen/editTable.vue create mode 100644 ruoyi-ui-vue3/src/views/tool/gen/genInfoForm.vue create mode 100644 ruoyi-ui-vue3/src/views/tool/gen/importTable.vue create mode 100644 ruoyi-ui-vue3/src/views/tool/gen/index.vue create mode 100644 ruoyi-ui-vue3/vite.config.js create mode 100644 ruoyi-ui-vue3/vite/plugins/auto-import.js create mode 100644 ruoyi-ui-vue3/vite/plugins/compression.js create mode 100644 ruoyi-ui-vue3/vite/plugins/index.js create mode 100644 ruoyi-ui-vue3/vite/plugins/setup-extend.js create mode 100644 ruoyi-ui-vue3/vite/plugins/svg-icon.js diff --git a/ruoyi-ui-vue3/.editorconfig b/ruoyi-ui-vue3/.editorconfig new file mode 100644 index 000000000..5b1a80448 --- /dev/null +++ b/ruoyi-ui-vue3/.editorconfig @@ -0,0 +1,21 @@ +# 告诉EditorConfig插件,这是根文件,不用继续往上查找 +root = true + +# 匹配全部文件 +[*] +# 缩进风格,可选space、tab +indent_style = space +# 缩进的空格数 +indent_size = 2 +# 设置字符集 +charset = utf-8 +# 结尾换行符,可选lf、cr、crlf +end_of_line = lf +# 在文件结尾插入新行 +trim_trailing_whitespace = true +# 删除一行中的前后空格 +insert_final_newline = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/ruoyi-ui-vue3/.env.development b/ruoyi-ui-vue3/.env.development new file mode 100644 index 000000000..ac4d2c13f --- /dev/null +++ b/ruoyi-ui-vue3/.env.development @@ -0,0 +1,17 @@ +# 页面标题 +VITE_APP_TITLE = RuoYi-Vue-Plus后台管理系统 + +# 开发环境配置 +VITE_APP_ENV = 'development' + +# 若依管理系统/开发环境 +VITE_APP_BASE_API = '/dev-api' + +# 应用访问路径 例如使用前缀 /admin/ +VITE_APP_CONTEXT_PATH = '/' + +# 监控地址 +VITE_APP_MONITRO_ADMIN = 'http://localhost:9090/admin/applications' + +# xxl-job 控制台地址 +VITE_APP_XXL_JOB_ADMIN = 'http://localhost:9100/xxl-job-admin' diff --git a/ruoyi-ui-vue3/.env.production b/ruoyi-ui-vue3/.env.production new file mode 100644 index 000000000..18bb273cb --- /dev/null +++ b/ruoyi-ui-vue3/.env.production @@ -0,0 +1,20 @@ +# 页面标题 +VITE_APP_TITLE = RuoYi-Vue-Plus后台管理系统 + +# 生产环境配置 +VITE_APP_ENV = 'production' + +# 应用访问路径 例如使用前缀 /admin/ +VITE_APP_CONTEXT_PATH = '/' + +# 监控地址 +VITE_APP_MONITRO_ADMIN = '/admin/applications' + +# 监控地址 +VITE_APP_XXL_JOB_ADMIN = '/xxl-job-admin' + +# 若依管理系统/生产环境 +VITE_APP_BASE_API = '/prod-api' + +# 是否在打包时开启压缩,支持 gzip 和 brotli +VITE_BUILD_COMPRESS = gzip diff --git a/ruoyi-ui-vue3/.gitignore b/ruoyi-ui-vue3/.gitignore new file mode 100644 index 000000000..78a752d87 --- /dev/null +++ b/ruoyi-ui-vue3/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +**/*.log + +tests/**/coverage/ +tests/e2e/reports +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +yarn.lock diff --git a/ruoyi-ui-vue3/README.md b/ruoyi-ui-vue3/README.md new file mode 100644 index 000000000..199f19652 --- /dev/null +++ b/ruoyi-ui-vue3/README.md @@ -0,0 +1,83 @@ +## 平台简介 + +* 本仓库为前端技术栈 [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 版本。 +* 配套后端代码仓库地址[RuoYi-Vue-Plus 4.X(注意版本号)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) +* 5.X后端需要使用此项目 [plus-ui](https://gitee.com/JavaLionLi/plus-ui) + +## 前端运行 + +```bash +# 进入项目目录 +cd ruoyi-ui-vue3 + +# 安装依赖 +npm install --registry=https://registry.npmmirror.com + +# 启动服务 +npm run dev + +# 构建测试环境 yarn build:stage +# 构建生产环境 yarn build:prod +# 前端访问地址 http://localhost:80 +``` + +## 后端改造 +参考后端代码内 `ruoyi-generator/resources/vm/vue/v3/readme.txt` 说明 + +## 内置功能 + +1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 +2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 +3. 岗位管理:配置系统用户所属担任职务。 +4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 +5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 +6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 +7. 参数管理:对系统动态配置常用参数。 +8. 通知公告:系统通知公告信息发布维护。 +9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 +10. 登录日志:系统登录日志记录查询包含登录异常。 +11. 在线用户:当前系统中活跃用户状态监控。 +12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 +13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 +14. 系统接口:根据业务代码自动生成相关的api接口文档。 +15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 +16. 缓存监控:对系统的缓存信息查询,命令统计等。 +17. 在线构建器:拖动表单元素生成相应的HTML代码。 +18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 + +## 演示图 + +
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
![]() |
+ ![]() |
+
您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。
+自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明 。
+推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。
+ +n5h2T|E`&xjm6UM(Pg_2bJ_ha-4(O+{h3lLUAgFVK}AjW zN9}&|=T6;qjXjr``GeEaFW&3n(+ zoqZYjGJ4U+DaSKjYRzAKY0JLizt0%Ae_xkxyZ*Q7|E-Vtoh!{F_$zLB9+_Ud{oBu= z)*1GDcz?AA?6LYA>~myE|NnnC&c97MxMBT=Q|#Igx#ZoHCa;+KUg#e0kNt<8Z=@KN iipJf1pep`@KkU^6)|g3ts~8v<7(8A5T-G@yGywqkCzcNY literal 0 HcmV?d00001 diff --git a/ruoyi-ui-vue3/src/App.vue b/ruoyi-ui-vue3/src/App.vue new file mode 100644 index 000000000..31839f20f --- /dev/null +++ b/ruoyi-ui-vue3/src/App.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/ruoyi-ui-vue3/src/api/demo/demo.js b/ruoyi-ui-vue3/src/api/demo/demo.js new file mode 100644 index 000000000..04d40256f --- /dev/null +++ b/ruoyi-ui-vue3/src/api/demo/demo.js @@ -0,0 +1,54 @@ +import request from '@/utils/request' + +// 查询测试单表列表 +export function listDemo(query) { + return request({ + url: '/demo/demo/list', + method: 'get', + params: query + }) +} + +// 自定义分页接口 +export function pageDemo(query) { + return request({ + url: '/demo/demo/page', + method: 'get', + params: query + }) +} + +// 查询测试单表详细 +export function getDemo(id) { + return request({ + url: '/demo/demo/' + id, + method: 'get' + }) +} + +// 新增测试单表 +export function addDemo(data) { + return request({ + url: '/demo/demo', + method: 'post', + data: data + }) +} + +// 修改测试单表 +export function updateDemo(data) { + return request({ + url: '/demo/demo', + method: 'put', + data: data + }) +} + +// 删除测试单表 +export function delDemo(id) { + return request({ + url: '/demo/demo/' + id, + method: 'delete' + }) +} + diff --git a/ruoyi-ui-vue3/src/api/demo/tree.js b/ruoyi-ui-vue3/src/api/demo/tree.js new file mode 100644 index 000000000..4c7ebc070 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/demo/tree.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询测试树表列表 +export function listTree(query) { + return request({ + url: '/demo/tree/list', + method: 'get', + params: query + }) +} + +// 查询测试树表详细 +export function getTree(id) { + return request({ + url: '/demo/tree/' + id, + method: 'get' + }) +} + +// 新增测试树表 +export function addTree(data) { + return request({ + url: '/demo/tree', + method: 'post', + data: data + }) +} + +// 修改测试树表 +export function updateTree(data) { + return request({ + url: '/demo/tree', + method: 'put', + data: data + }) +} + +// 删除测试树表 +export function delTree(id) { + return request({ + url: '/demo/tree/' + id, + method: 'delete' + }) +} diff --git a/ruoyi-ui-vue3/src/api/login.js b/ruoyi-ui-vue3/src/api/login.js new file mode 100644 index 000000000..649f59c81 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/login.js @@ -0,0 +1,59 @@ +import request from '@/utils/request' + +// 登录方法 +export function login(username, password, code, uuid) { + const data = { + username, + password, + code, + uuid + } + return request({ + url: '/login', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + +// 注册方法 +export function register(data) { + return request({ + url: '/register', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + +// 获取用户详细信息 +export function getInfo() { + return request({ + url: '/getInfo', + method: 'get' + }) +} + +// 退出方法 +export function logout() { + return request({ + url: '/logout', + method: 'post' + }) +} + +// 获取验证码 +export function getCodeImg() { + return request({ + url: '/captchaImage', + headers: { + isToken: false + }, + method: 'get', + timeout: 20000 + }) +} \ No newline at end of file diff --git a/ruoyi-ui-vue3/src/api/menu.js b/ruoyi-ui-vue3/src/api/menu.js new file mode 100644 index 000000000..faef101c4 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/menu.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +// 获取路由 +export const getRouters = () => { + return request({ + url: '/getRouters', + method: 'get' + }) +} \ No newline at end of file diff --git a/ruoyi-ui-vue3/src/api/monitor/cache.js b/ruoyi-ui-vue3/src/api/monitor/cache.js new file mode 100644 index 000000000..45a9003df --- /dev/null +++ b/ruoyi-ui-vue3/src/api/monitor/cache.js @@ -0,0 +1,57 @@ +import request from '@/utils/request' + +// 查询缓存详细 +export function getCache() { + return request({ + url: '/monitor/cache', + method: 'get' + }) +} + +// 查询缓存名称列表 +export function listCacheName() { + return request({ + url: '/monitor/cache/getNames', + method: 'get' + }) +} + +// 查询缓存键名列表 +export function listCacheKey(cacheName) { + return request({ + url: '/monitor/cache/getKeys/' + cacheName, + method: 'get' + }) +} + +// 查询缓存内容 +export function getCacheValue(cacheName, cacheKey) { + return request({ + url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey, + method: 'get' + }) +} + +// 清理指定名称缓存 +export function clearCacheName(cacheName) { + return request({ + url: '/monitor/cache/clearCacheName/' + cacheName, + method: 'delete' + }) +} + +// 清理指定键名缓存 +export function clearCacheKey(cacheName, cacheKey) { + return request({ + url: '/monitor/cache/clearCacheKey/' + cacheName + '/' + cacheKey, + method: 'delete' + }) +} + +// 清理全部缓存 +export function clearCacheAll() { + return request({ + url: '/monitor/cache/clearCacheAll', + method: 'delete' + }) +} diff --git a/ruoyi-ui-vue3/src/api/monitor/logininfor.js b/ruoyi-ui-vue3/src/api/monitor/logininfor.js new file mode 100644 index 000000000..4d112b78a --- /dev/null +++ b/ruoyi-ui-vue3/src/api/monitor/logininfor.js @@ -0,0 +1,34 @@ +import request from '@/utils/request' + +// 查询登录日志列表 +export function list(query) { + return request({ + url: '/monitor/logininfor/list', + method: 'get', + params: query + }) +} + +// 删除登录日志 +export function delLogininfor(infoId) { + return request({ + url: '/monitor/logininfor/' + infoId, + method: 'delete' + }) +} + +// 解锁用户登录状态 +export function unlockLogininfor(userName) { + return request({ + url: '/monitor/logininfor/unlock/' + userName, + method: 'get' + }) +} + +// 清空登录日志 +export function cleanLogininfor() { + return request({ + url: '/monitor/logininfor/clean', + method: 'delete' + }) +} diff --git a/ruoyi-ui-vue3/src/api/monitor/online.js b/ruoyi-ui-vue3/src/api/monitor/online.js new file mode 100644 index 000000000..bd2213780 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/monitor/online.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 查询在线用户列表 +export function list(query) { + return request({ + url: '/monitor/online/list', + method: 'get', + params: query + }) +} + +// 强退用户 +export function forceLogout(tokenId) { + return request({ + url: '/monitor/online/' + tokenId, + method: 'delete' + }) +} diff --git a/ruoyi-ui-vue3/src/api/monitor/operlog.js b/ruoyi-ui-vue3/src/api/monitor/operlog.js new file mode 100644 index 000000000..a04bca840 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/monitor/operlog.js @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 查询操作日志列表 +export function list(query) { + return request({ + url: '/monitor/operlog/list', + method: 'get', + params: query + }) +} + +// 删除操作日志 +export function delOperlog(operId) { + return request({ + url: '/monitor/operlog/' + operId, + method: 'delete' + }) +} + +// 清空操作日志 +export function cleanOperlog() { + return request({ + url: '/monitor/operlog/clean', + method: 'delete' + }) +} diff --git a/ruoyi-ui-vue3/src/api/system/config.js b/ruoyi-ui-vue3/src/api/system/config.js new file mode 100644 index 000000000..9b93886a3 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/system/config.js @@ -0,0 +1,72 @@ +import request from '@/utils/request' + +// 查询参数列表 +export function listConfig(query) { + return request({ + url: '/system/config/list', + method: 'get', + params: query + }) +} + +// 查询参数详细 +export function getConfig(configId) { + return request({ + url: '/system/config/' + configId, + method: 'get' + }) +} + +// 根据参数键名查询参数值 +export function getConfigKey(configKey) { + return request({ + url: '/system/config/configKey/' + configKey, + method: 'get' + }) +} + +// 新增参数配置 +export function addConfig(data) { + return request({ + url: '/system/config', + method: 'post', + data: data + }) +} + +// 修改参数配置 +export function updateConfig(data) { + return request({ + url: '/system/config', + method: 'put', + data: data + }) +} + +// 修改参数配置 +export function updateConfigByKey(key, value) { + return request({ + url: '/system/config/updateByKey', + method: 'put', + data: { + configKey: key, + configValue: value + } + }) +} + +// 删除参数配置 +export function delConfig(configId) { + return request({ + url: '/system/config/' + configId, + method: 'delete' + }) +} + +// 刷新参数缓存 +export function refreshCache() { + return request({ + url: '/system/config/refreshCache', + method: 'delete' + }) +} diff --git a/ruoyi-ui-vue3/src/api/system/dept.js b/ruoyi-ui-vue3/src/api/system/dept.js new file mode 100644 index 000000000..fc943cd41 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/system/dept.js @@ -0,0 +1,52 @@ +import request from '@/utils/request' + +// 查询部门列表 +export function listDept(query) { + return request({ + url: '/system/dept/list', + method: 'get', + params: query + }) +} + +// 查询部门列表(排除节点) +export function listDeptExcludeChild(deptId) { + return request({ + url: '/system/dept/list/exclude/' + deptId, + method: 'get' + }) +} + +// 查询部门详细 +export function getDept(deptId) { + return request({ + url: '/system/dept/' + deptId, + method: 'get' + }) +} + +// 新增部门 +export function addDept(data) { + return request({ + url: '/system/dept', + method: 'post', + data: data + }) +} + +// 修改部门 +export function updateDept(data) { + return request({ + url: '/system/dept', + method: 'put', + data: data + }) +} + +// 删除部门 +export function delDept(deptId) { + return request({ + url: '/system/dept/' + deptId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/ruoyi-ui-vue3/src/api/system/dict/data.js b/ruoyi-ui-vue3/src/api/system/dict/data.js new file mode 100644 index 000000000..6c9eb79b4 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/system/dict/data.js @@ -0,0 +1,52 @@ +import request from '@/utils/request' + +// 查询字典数据列表 +export function listData(query) { + return request({ + url: '/system/dict/data/list', + method: 'get', + params: query + }) +} + +// 查询字典数据详细 +export function getData(dictCode) { + return request({ + url: '/system/dict/data/' + dictCode, + method: 'get' + }) +} + +// 根据字典类型查询字典数据信息 +export function getDicts(dictType) { + return request({ + url: '/system/dict/data/type/' + dictType, + method: 'get' + }) +} + +// 新增字典数据 +export function addData(data) { + return request({ + url: '/system/dict/data', + method: 'post', + data: data + }) +} + +// 修改字典数据 +export function updateData(data) { + return request({ + url: '/system/dict/data', + method: 'put', + data: data + }) +} + +// 删除字典数据 +export function delData(dictCode) { + return request({ + url: '/system/dict/data/' + dictCode, + method: 'delete' + }) +} diff --git a/ruoyi-ui-vue3/src/api/system/dict/type.js b/ruoyi-ui-vue3/src/api/system/dict/type.js new file mode 100644 index 000000000..a0254baa7 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/system/dict/type.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 查询字典类型列表 +export function listType(query) { + return request({ + url: '/system/dict/type/list', + method: 'get', + params: query + }) +} + +// 查询字典类型详细 +export function getType(dictId) { + return request({ + url: '/system/dict/type/' + dictId, + method: 'get' + }) +} + +// 新增字典类型 +export function addType(data) { + return request({ + url: '/system/dict/type', + method: 'post', + data: data + }) +} + +// 修改字典类型 +export function updateType(data) { + return request({ + url: '/system/dict/type', + method: 'put', + data: data + }) +} + +// 删除字典类型 +export function delType(dictId) { + return request({ + url: '/system/dict/type/' + dictId, + method: 'delete' + }) +} + +// 刷新字典缓存 +export function refreshCache() { + return request({ + url: '/system/dict/type/refreshCache', + method: 'delete' + }) +} + +// 获取字典选择框列表 +export function optionselect() { + return request({ + url: '/system/dict/type/optionselect', + method: 'get' + }) +} diff --git a/ruoyi-ui-vue3/src/api/system/menu.js b/ruoyi-ui-vue3/src/api/system/menu.js new file mode 100644 index 000000000..f6415c656 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/system/menu.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 查询菜单列表 +export function listMenu(query) { + return request({ + url: '/system/menu/list', + method: 'get', + params: query + }) +} + +// 查询菜单详细 +export function getMenu(menuId) { + return request({ + url: '/system/menu/' + menuId, + method: 'get' + }) +} + +// 查询菜单下拉树结构 +export function treeselect() { + return request({ + url: '/system/menu/treeselect', + method: 'get' + }) +} + +// 根据角色ID查询菜单下拉树结构 +export function roleMenuTreeselect(roleId) { + return request({ + url: '/system/menu/roleMenuTreeselect/' + roleId, + method: 'get' + }) +} + +// 新增菜单 +export function addMenu(data) { + return request({ + url: '/system/menu', + method: 'post', + data: data + }) +} + +// 修改菜单 +export function updateMenu(data) { + return request({ + url: '/system/menu', + method: 'put', + data: data + }) +} + +// 删除菜单 +export function delMenu(menuId) { + return request({ + url: '/system/menu/' + menuId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/ruoyi-ui-vue3/src/api/system/notice.js b/ruoyi-ui-vue3/src/api/system/notice.js new file mode 100644 index 000000000..c274ea5ba --- /dev/null +++ b/ruoyi-ui-vue3/src/api/system/notice.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询公告列表 +export function listNotice(query) { + return request({ + url: '/system/notice/list', + method: 'get', + params: query + }) +} + +// 查询公告详细 +export function getNotice(noticeId) { + return request({ + url: '/system/notice/' + noticeId, + method: 'get' + }) +} + +// 新增公告 +export function addNotice(data) { + return request({ + url: '/system/notice', + method: 'post', + data: data + }) +} + +// 修改公告 +export function updateNotice(data) { + return request({ + url: '/system/notice', + method: 'put', + data: data + }) +} + +// 删除公告 +export function delNotice(noticeId) { + return request({ + url: '/system/notice/' + noticeId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/ruoyi-ui-vue3/src/api/system/oss.js b/ruoyi-ui-vue3/src/api/system/oss.js new file mode 100644 index 000000000..7d8002600 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/system/oss.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +// 查询OSS对象存储列表 +export function listOss(query) { + return request({ + url: '/system/oss/list', + method: 'get', + params: query + }) +} + +// 查询OSS对象基于id串 +export function listByIds(ossId) { + return request({ + url: '/system/oss/listByIds/' + ossId, + method: 'get' + }) +} + +// 删除OSS对象存储 +export function delOss(ossId) { + return request({ + url: '/system/oss/' + ossId, + method: 'delete' + }) +} + diff --git a/ruoyi-ui-vue3/src/api/system/ossConfig.js b/ruoyi-ui-vue3/src/api/system/ossConfig.js new file mode 100644 index 000000000..f29076283 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/system/ossConfig.js @@ -0,0 +1,58 @@ +import request from '@/utils/request' + +// 查询对象存储配置列表 +export function listOssConfig(query) { + return request({ + url: '/system/oss/config/list', + method: 'get', + params: query + }) +} + +// 查询对象存储配置详细 +export function getOssConfig(ossConfigId) { + return request({ + url: '/system/oss/config/' + ossConfigId, + method: 'get' + }) +} + +// 新增对象存储配置 +export function addOssConfig(data) { + return request({ + url: '/system/oss/config', + method: 'post', + data: data + }) +} + +// 修改对象存储配置 +export function updateOssConfig(data) { + return request({ + url: '/system/oss/config', + method: 'put', + data: data + }) +} + +// 删除对象存储配置 +export function delOssConfig(ossConfigId) { + return request({ + url: '/system/oss/config/' + ossConfigId, + method: 'delete' + }) +} + +// 对象存储状态修改 +export function changeOssConfigStatus(ossConfigId, status, configKey) { + const data = { + ossConfigId, + status, + configKey + } + return request({ + url: '/system/oss/config/changeStatus', + method: 'put', + data: data + }) +} diff --git a/ruoyi-ui-vue3/src/api/system/post.js b/ruoyi-ui-vue3/src/api/system/post.js new file mode 100644 index 000000000..1a8e9ca04 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/system/post.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询岗位列表 +export function listPost(query) { + return request({ + url: '/system/post/list', + method: 'get', + params: query + }) +} + +// 查询岗位详细 +export function getPost(postId) { + return request({ + url: '/system/post/' + postId, + method: 'get' + }) +} + +// 新增岗位 +export function addPost(data) { + return request({ + url: '/system/post', + method: 'post', + data: data + }) +} + +// 修改岗位 +export function updatePost(data) { + return request({ + url: '/system/post', + method: 'put', + data: data + }) +} + +// 删除岗位 +export function delPost(postId) { + return request({ + url: '/system/post/' + postId, + method: 'delete' + }) +} diff --git a/ruoyi-ui-vue3/src/api/system/role.js b/ruoyi-ui-vue3/src/api/system/role.js new file mode 100644 index 000000000..f13e6f404 --- /dev/null +++ b/ruoyi-ui-vue3/src/api/system/role.js @@ -0,0 +1,119 @@ +import request from '@/utils/request' + +// 查询角色列表 +export function listRole(query) { + return request({ + url: '/system/role/list', + method: 'get', + params: query + }) +} + +// 查询角色详细 +export function getRole(roleId) { + return request({ + url: '/system/role/' + roleId, + method: 'get' + }) +} + +// 新增角色 +export function addRole(data) { + return request({ + url: '/system/role', + method: 'post', + data: data + }) +} + +// 修改角色 +export function updateRole(data) { + return request({ + url: '/system/role', + method: 'put', + data: data + }) +} + +// 角色数据权限 +export function dataScope(data) { + return request({ + url: '/system/role/dataScope', + method: 'put', + data: data + }) +} + +// 角色状态修改 +export function changeRoleStatus(roleId, status) { + const data = { + roleId, + status + } + return request({ + url: '/system/role/changeStatus', + method: 'put', + data: data + }) +} + +// 删除角色 +export function delRole(roleId) { + return request({ + url: '/system/role/' + roleId, + method: 'delete' + }) +} + +// 查询角色已授权用户列表 +export function allocatedUserList(query) { + return request({ + url: '/system/role/authUser/allocatedList', + method: 'get', + params: query + }) +} + +// 查询角色未授权用户列表 +export function unallocatedUserList(query) { + return request({ + url: '/system/role/authUser/unallocatedList', + method: 'get', + params: query + }) +} + +// 取消用户授权角色 +export function authUserCancel(data) { + return request({ + url: '/system/role/authUser/cancel', + method: 'put', + data: data + }) +} + +// 批量取消用户授权角色 +export function authUserCancelAll(data) { + return request({ + url: '/system/role/authUser/cancelAll', + method: 'put', + params: data + }) +} + +// 授权用户选择 +export function authUserSelectAll(data) { + return request({ + url: '/system/role/authUser/selectAll', + method: 'put', + params: data + }) +} + +// 根据角色ID查询部门树结构 +export function deptTreeSelect(roleId) { + return request({ + url: '/system/role/deptTree/' + roleId, + method: 'get' + }) +} diff --git a/ruoyi-ui-vue3/src/api/system/user.js b/ruoyi-ui-vue3/src/api/system/user.js new file mode 100644 index 000000000..f2f76ef9f --- /dev/null +++ b/ruoyi-ui-vue3/src/api/system/user.js @@ -0,0 +1,135 @@ +import request from '@/utils/request' +import { parseStrEmpty } from "@/utils/ruoyi"; + +// 查询用户列表 +export function listUser(query) { + return request({ + url: '/system/user/list', + method: 'get', + params: query + }) +} + +// 查询用户详细 +export function getUser(userId) { + return request({ + url: '/system/user/' + parseStrEmpty(userId), + method: 'get' + }) +} + +// 新增用户 +export function addUser(data) { + return request({ + url: '/system/user', + method: 'post', + data: data + }) +} + +// 修改用户 +export function updateUser(data) { + return request({ + url: '/system/user', + method: 'put', + data: data + }) +} + +// 删除用户 +export function delUser(userId) { + return request({ + url: '/system/user/' + userId, + method: 'delete' + }) +} + +// 用户密码重置 +export function resetUserPwd(userId, password) { + const data = { + userId, + password + } + return request({ + url: '/system/user/resetPwd', + method: 'put', + data: data + }) +} + +// 用户状态修改 +export function changeUserStatus(userId, status) { + const data = { + userId, + status + } + return request({ + url: '/system/user/changeStatus', + method: 'put', + data: data + }) +} + +// 查询用户个人信息 +export function getUserProfile() { + return request({ + url: '/system/user/profile', + method: 'get' + }) +} + +// 修改用户个人信息 +export function updateUserProfile(data) { + return request({ + url: '/system/user/profile', + method: 'put', + data: data + }) +} + +// 用户密码重置 +export function updateUserPwd(oldPassword, newPassword) { + const data = { + oldPassword, + newPassword + } + return request({ + url: '/system/user/profile/updatePwd', + method: 'put', + params: data + }) +} + +// 用户头像上传 +export function uploadAvatar(data) { + return request({ + url: '/system/user/profile/avatar', + method: 'post', + data: data + }) +} + +// 查询授权角色 +export function getAuthRole(userId) { + return request({ + url: '/system/user/authRole/' + userId, + method: 'get' + }) +} + +// 保存授权角色 +export function updateAuthRole(data) { + return request({ + url: '/system/user/authRole', + method: 'put', + params: data + }) +} + +// 查询部门下拉树结构 +export function deptTreeSelect() { + return request({ + url: '/system/user/deptTree', + method: 'get' + }) +} diff --git a/ruoyi-ui-vue3/src/api/tool/gen.js b/ruoyi-ui-vue3/src/api/tool/gen.js new file mode 100644 index 000000000..441791c2c --- /dev/null +++ b/ruoyi-ui-vue3/src/api/tool/gen.js @@ -0,0 +1,85 @@ +import request from '@/utils/request' + +// 查询生成表数据 +export function listTable(query) { + return request({ + headers: { 'datasource': localStorage.getItem("dataName") }, + url: '/tool/gen/list', + method: 'get', + params: query + }) +} +// 查询db数据库列表 +export function listDbTable(query) { + return request({ + headers: { 'datasource': localStorage.getItem("dataName") }, + url: '/tool/gen/db/list', + method: 'get', + params: query + }) +} + +// 查询表详细信息 +export function getGenTable(tableId) { + return request({ + headers: { 'datasource': localStorage.getItem("dataName") }, + url: '/tool/gen/' + tableId, + method: 'get' + }) +} + +// 修改代码生成信息 +export function updateGenTable(data) { + return request({ + headers: { 'datasource': localStorage.getItem("dataName") }, + url: '/tool/gen', + method: 'put', + data: data + }) +} + +// 导入表 +export function importTable(data) { + return request({ + headers: { 'datasource': localStorage.getItem("dataName") }, + url: '/tool/gen/importTable', + method: 'post', + params: data + }) +} + +// 预览生成代码 +export function previewTable(tableId) { + return request({ + headers: { 'datasource': localStorage.getItem("dataName") }, + url: '/tool/gen/preview/' + tableId, + method: 'get' + }) +} + +// 删除表数据 +export function delTable(tableId) { + return request({ + headers: { 'datasource': localStorage.getItem("dataName") }, + url: '/tool/gen/' + tableId, + method: 'delete' + }) +} + +// 生成代码(自定义路径) +export function genCode(tableName) { + return request({ + headers: { 'datasource': localStorage.getItem("dataName") }, + url: '/tool/gen/genCode/' + tableName, + method: 'get' + }) +} + +// 同步数据库 +export function synchDb(tableName) { + return request({ + headers: { 'datasource': localStorage.getItem("dataName") }, + url: '/tool/gen/synchDb/' + tableName, + method: 'get' + }) +} diff --git a/ruoyi-ui-vue3/src/assets/401_images/401.gif b/ruoyi-ui-vue3/src/assets/401_images/401.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd6e0d9433421b3f29d0ec0c40f755e354728000 GIT binary patch literal 164227 zcmZ?wbhEHbv}9bvctoDTaP~sM>b8GdnEpp6{OD@WG0gja>2Q00`NZqj{_kJ&_xJA` zH*fxb`Pe(9?C_JPyW<=G-@o$o$ TTZQ6^5EV3|6f0S{PN}h`&Um6Up;f?Of^Fw zLsdJe@G>P5ciAivPJId;=6*5=#;zd;@IkD+&^mvr|hHl2X$%^K6yg@7}MZkeOnu z6mIHk;9KCFnvv;IRg@ZB 27Wn$&SDKp(S6y5Zl!|aKR)dQ}DhpEe zgHnt0ON)|IgHqF!L2fFraxO|uEXgkl$ gnqYmtzE+-j#U+V($*G<$wn`Pb1$vp8DOQ$-&ZbVzZpIcSF2;t2u4YcoMlP0) z#-`5BZqDXzmToY;F8Rr&xv6<2Fuf@Vy(T#If|3L%Sgc%9i!#enQ{0O3a}~f|x5~ur z7DJroLG`BKc8d{Cz4~?vHu|6lMv8ElP>_oohzU-cpmb`dfXD!;c`3F^MN0N|jQ{`r z{qy_R&mZ5vef{$J)5j0*-@SeF`qj%9&!0Vg^7zri2lwyYy>t84%^TORUA=Po(!~qs z&z(JU`qar2$B!L7a`@1}1N-;w-Lrew&K=vgZQZhY)5Ze MTG_V zdAT{+S(zE>X{jm6Nr?&Zaj`McQIQehVWA U}Ah^D #VB;-vzOlN^DibJ+Q_@({s#;3M9 |C+$$Wa%OB?nLStvq(_yxH_qm-FUaxPC)F z`^ue7H}5}C5v#p(x$ohN`y5a229P;Rx50H<$T7{@C~W>lLB1KN%d)K0e;-bf9^G zjKG_=4G)*3a5pm+cwD@2pyTqr&^r}vOtw8c-WAGZx+!|3a(Mh-wP(|N6+KSvWWUB2 zmqdJKT6A7mvobU3+^!^+v*#ucc1M0IFCg^(l~~_Xe!^QoN&j~dDA`9&)tqRjY;vExs&fq+wwOz zx0nX+?zJ}9bm5H(&+EH4n3x_sJ0kGC$7Q?P!}jUQY0Y;;B%WSk?tis;VRd=Ty~E;S zapu;+k7pcO{e52M-ru~8hg{6%FPk)c|MB^Ce0+t;-x(X;sy}G>dGz|NdXYxA2mhOR zcB#uW@oC<8&?1s|K(d9wGvZ+zZ&b6Q)${_5M=c+xeqU(#x~C(aL2F<6xz6(ySCs0$ zpM9~Q(_qsirE0UPa) |Cm?n#P_TdUT<6_B$2f!<)7BQ#zRt# z2f9v#omTtbxaZp~$KG>Q&oj0J&WT#H^~tVZ_crZ~yY-fBLlZa4_SdowdCXs~Wv}1) zZsV%A^Io@!ui0(y(>;IBwMVPp?0fm`weA6@hy;V3yTVrJA7V4E5<6@sFgt6V==*lP zL$AuD57bCpcQ{zyEfAyIepBgA_VI#k(MG&SR`D3FQ#7{Ncv{xv_WKjY&kHv7n?FDG z@VL$IRR+5qA1^2@H*=ozxoN7J@5f7w8MjKf_>M>Cu1z=`^Wa?Acb&4y;`y@82jb+d zO*>Pj-~D_kXysp~J+EASpWfy@rn~*pU#INv5x-uZ{oYjfpSNPW5r5vH%g-O_Br$Yq z@B6X7)OsG%y@~59f7DHhj{Elixi8l`OHOC*6-F;jy8fBJHd|J^i!*2SKJyjpwCxVw z)Jn7a%`u@`hvChm(0SH}=1iA7@LoeD-r{3`{QTW(7tgBO#nc{@yXT9I|AU(TO~&sT z<}55e|My+3*}ICjUU~WdUhgSCQNww#KjPo-AJJ0wjr-2W{cj6DHJ@SY)4g)K`E>_g z%U)tT;qYqfi9)Uf1{NL$Mz$lV&aIIO%;q!J{oVOoRy3i3k>@}IcSAQLXF(*B&X2vK zj0rw6Jqz#f9gyXcbYT>DFq3ghn t{EJ zEVpn~jxwwdS|e(E@9{o9i;3PmJCx3IFqr)}jN;2-F;G5VF+ VUTz^L&N&mM#dVK8}d&jPPi0uc9pa|mVX}MVSjJqgt(R |Rw_Hk0q@v% z-P5=6sOb5dc*aY8p0Rh+g9!qiXVSKP>Nen7Y`i?uLr=3|){T tyQ;6_cwew$A2Ika-M6jJ* z=6YN+X!=IuuuD0ai-fc;yQnrS2=IDo;u&>W)XbOB%5|AtcGab|jG;>;MKhVYtSoB$ zikIH>IpED+?mO|&<|Vt1XdZ5QwQH$gz%r31t6p!bv?_nZKV5O@Ghg=!*S?1`G%5+K zz9Uq?v|MiTO1TxQex9(h-s{D`UTFt|YqVyl$ce2vQFCX;# 5Y|c>D1l*DWENu)^$AMn2us2bN~7W!e%N z;}Y%7bot%t4SE{6c}u4=FmKq#Dt<#dKhWUL{=hI^;hc3>ySN$W{3?t8KjUd`bpP~* z$A=sk#b+#F6mq!tX;yiQzz&Bb)@-|7dgiRRZRN7w7F_wJ_O1M*?Y-jVAEGWE{kB)@ zME<)RZ#J1{@AosjTf@-n-FivS;-JBc_YJGPTW<0d>=)2;^kLl*^8VEVCV>fg@5*K; z26j{&5cyKTbI3Z5Pie;yK{KUF&4@!>HzF9hHWYHGTHF&Z=09xU$C#J>Yu`IINp@+q zO)orZQlw+TmpSBZGMndf_NUiOcD691LmD-yiY*bR?cQz@l(`ec);*I;Y0fgnWmV5K zV-_5pprbeYc1 )L|9-EwN2xj`4iuLPpMiJDI&x8@kwSxi6 K zzsZtr#h0GH7hRh6jCGmu-Y(XZ1>G!X4lsQ?lc^P;z&u}Ufrzm{W6 E)*;?9TY>+4du*58gK#TVEGDZnmHMLqlJ3L(0?_ z42Pe3=3PxlxGy~2g2AY+(A;kJ)6;G{k679 `QE(YPVZ%ysA;K zu-M_5@N)~c|6LOrCaP~SxBLI|NON8Z-;rMxFV 0w}{F6DK zpZiq!C^1xZF1LHUV*lR*;p@LMeL29eLB5h*t-0~m=jiVz#BJZ7k7Kym{ow0CdG$w! zgZ|tSSNM6u- v=#=y7=Gg)eJWpE~qtBxi{!26tTYuND-Id zt|$|I-XN1vBea9*ZFnQ|f%;?H8$Yu%@CGojCNzCXuW33~r}QE~C8AnqM(t_$LWYbQ zK67Tn7XkVnqLLb=rZZ~HZ{+`9-fVTDnPF@5mGm0Mf~HpY(r4`D_Sds47qtBP(i|+< zVz1tMBfLe(yyb*@t7dwuMMLYCCp9t$TdT|KQg#%6`Q9d!-exY)Bx=#T;Cbsw_4ZHZ zty{M H^sB41)cL8*Di1CttwjG8a(jky(dT^fb`Gni+q zcRt)w?2yq}xT5j@_Rc arJgSv%VPFNx?XWN%opf^lvKv*-r3Nf8}wKf0!`XwqKM z{>;34YX|dHp=KWqG4M=(IOy+!SuYBv89+hxo}*GyUg1yd1rn>b+JI z7_L;PujcSOt|4|aqw3C!hHuN8WUm( pN-@GGk(&=jPtm6`lMSyloy=YBMl? zi7;uo(WTPZe|K{~!;f++m1=Q=312k25*sJzIahMctSwURH)ELi_(tsu4Rf)|i6^H| zJa>Ge>*R)B$B7)mlguLYWh}zaU1wC|G-O*Tq_tCDr?bXfqwNO!WNU>!<49ehpA%Cj zPu|YnX46@7>~qp*i76)@Ntv(Ib(>k$|GnP(WzBz{2UCtSO^6npy4Psx)bI+=%Ie#X zYq%Cn-DxBpH&Y`)v!W(rYSH6~`VG^{i~7noPLsVbt>*i*FWYU4UNV( c;}i6bGCOomi{cQk_*u^=(E5M*436aK_uQvzcuGyooN;FRgrdV!wG<{~{G6VD zappY9?gf!%QjyI3E2lbh&TPHez}Qg4`k{q4W9I&)Z5ff1EjLd4r7`K*^4Y%+&GwU= zy=i6NAU zT%e#;rL@X|=Tw;UvV~V}XzN$a(%QAC={du!)+n{6WV>0(LM)8&Q#HQa&}R0U5!SqT zWjjMfX7Dl9CHAwDTh-#8q?$h7p+95hq}0Vr7EKrGyOta}%Q}3O?)Pib*(aAyC>M)u zwRdecaN8!6ZRt^DwY(&1d0Ex+iY$F|#YDp^%l50zFOM`kX1<~&YDHUC4Z8tT`>|yL zi=85+B;qU?+pShkiCQ_`oXOY9p?8&2!>l hlS{F$&!n+ z>^}Ny&DQjYeO)@dC)b2MUUOmA+Mwx7HK$hWT;yz;wb-+H?X9SFf0iW}xvbsK%J@)g zosILlXRFq3a!pMw*4gjsBydV3?q |2Jyg z|6fcG&76$Y@*b%zF+CQuqbW{x%KDIv>v?}~yqLkd#8dTzr;Hr;CXLmM{IAo>jnvg= zZ<1ea=d?j>>#AvC%$qf4uL#?q*0^c?=^vXNq_;R(Z*hs<;wHVtDw;Lq(~4`eOfqgQ z4WHoD|7fcJ>}CJMH>3s6UJ`n`{Nd%4K*>4L*(JH(wkDn~PoCYMI=d`=_Jqvn((LGo zxv#gSi%pf6+Ai~9n|9`Qr}pg@E4LdQ-yZaGyN-FTq}%qU*@gd$QrfC_C|Ygz4BlQi zdxzt;9X+q}CUGY_hVEp(zI8^nY5a$s3#4}~vfi~Mde<`VU2|q9)^u&woV}$>+kDOJ z&EaZE8@V^}Dx_9euGuQR{`jq(i#PA)y}euYo7I8a>kn}!`mWl2boScgvlH&F(l{-> z-nT5`gVf$>R(tD%_g?c}c|+U$*6zLSxAvxf-uobWMa%7|^QSjFjb5oeJJIu)@vGhY zCg0j8@GP8Ld;d|d{Q_!9AG`OruG;^f^V>d-$NP`G+GU^?J1e_zC3gbT8ePskJHwBK z^8d-_o|ACc^x(U&gPhZX61oqbE=$wcqA&aA-~qSvx- !@OOpJ2XnO#@UYA-med*JM&7^WvSjSp+i-Fq|l!5{M@KBr&qVS0Av zoRYzLt$_32dd_PuIREC%d5s6>pYvQ$SGe%V=Ym?og}Xf$R2N*hapr=`gA12=E-EWr zJm+&!DdFPDo{Mq|E*|}J_ROAh-+Im|$evZQz0?(T=~~Stjkk<4Z!dmYbLsY(OB#PK znb=-3<2|qI%Veo*{_)Q#+gLOEwWl0&O`T&;xz06l=RM_l*4TURN#D0d{<$ar2iDHC zo_pz?%q6SZt9rVZpVnOd{pRYcJy*kHuST4@8awx@n(sC1+-tXtu1ASBy>kUx`pX)zPF(2^UU2;Cj_xwYf zn{om-&)GD!+A@f-++a@dVhPwBu;!+m!L7`>6W_nNJkyqG8Sg1J1|JLe&Nh}?g`zi~ znapT9!@#^Dr1R~~<-XzDYH!`Y!YJy(Aam-dg*j92T)*XKJ-5xhA(-mX9>ciTm+AhM z5&;Lsgv)pD@tQRVGT*now{?;b^Mo76SsB;so_Lj;zb4i1|6*064GP{&e)+0SH}{_0 zk?ObS3d8?T!pyuv4EzFqC+2Qgw~gWBT6v>vruIov>w9>lH$6~oaOBH7DHWtB z$5wui` Qm(+3TM8{1a T`D`Ft;D_G$i~{qNc9M=zJod%p0WFqZ)1TE3TB_f%Hyd&X7#dUM`0?t*<-L78?_FBmyDRTlcddKpa_-H2hi4z+-hZom|D*5ur+K_w4)1^d zd(R;M;qklIjERi@^geLR|G;(rDaUl-jddTm *1uV=CpN9& zg|z%9rTb3>9T ^nl~s+lEH{oT_M{qNdI+O|i-h29dO` z$yq%@B{hyyX2;5jOfO~Nm^Ei G9`lv4 zE|N^=p6j9eHSRyFMCqod9Skb5N|rkUXPwb8v}84?yzF5bY#{pO%%p{L&n|Qi%8Swz z(VWD?IBi$4m%q~$PoI@(3kysyo?9H%ukeCPgJJ%Ls0kC7CW|TES`zklOYX0->=@HD z)eCF0%@5qtDgHU{C(DC;!TpQAak +2hmPtWt+z3uJo9mTKjo!!0t{rv;Y-12^Vc6@w%VzPGpxjj2S zKfkcpd%oY^U0+|{*qnX;+}_>a-#<9qE$_c?&(F^ vyCIJS?`#};~tZ19dj7Xo~?M?XY=jFVorm98c!y;h-Idf zu>^25av+x@E)2{J3mN{v)7iYm%h&0=f~GT-)e%!3{}$;^YSotNKat|I^o62|P(uk< zgOZHc)S}aGt6a6ZmANK(s`9-pKbtpu#!QWMuOxQ8uUOipWFMv}SJ~8T W0+s-cFxN%A3%JGwT7tC70_jozixdpFZ z929%d|M6YZ#PtlzzVyo7S;6r9*SD>|MHa*#aFk<<<67`xfi(YT8N-qegQUfsBA*?Y zTMd=fB4lm1dH&E^a>7(4@V}_d&kG6~43ZJM7%N`QKVv4wG>5C $;D*l&WioWYVn90DFADI2)gAZrd#1A@8E7qiJn%e6&|mH zt#d|V$+tf 1md_I4bZ|A*9F)c{do(lsD!$OAtD9LqAJ2bggoYI=|_`gWE(^OD$U6OOu z*+ZpaMaZv`h?rAr%1-}XqjT $tS!@`SeyjfS~G z(F`0-on1;5Ray1j6Ek|NCrz7fTEQ`O#@u;1T#|FLMdmLv(duhxUA|UBOJq$0W5>E} znqr%p__l9bxp=kM-nDWYCvG{sY~?hDLnr4R-POJI{Ivbk7=? tZ?Ye$@{V$u?eret*-Dev6syQ#uaPKvl-0*RR(Q>ge ziMJ`YpBa0bcz!7mvlZgX+`QD(^%~~~!K_I(j+c41o)U~@m>#qBhDemDj^(PLvr3Ii z*wz|veRZL!b@$U0@tq|vQ}#M;^}n|=is_H9$`6jK2U&{)bbEF@NR;T7G+!pMbJLTP zGmNwEo!Pnh`S}IT-EzLWw!FN&BA9x~_5LbnCg$@(H52}CXR=|FeQ|65aR$BGS07lv z$cHogZI`d+n8e_?C69g8@vtTVH;soaB3j!MS|!p}U`ehTiS-w3f5bFu9jowa5E4>- z+-ouKLPFoX*blc_OP?HnJi&m$Qnts1YkP8uPEdNvq?tcCo=!25(%_gBe9y^YTFfn@ z1HAramQN;$dTBmONSXK2YewV^iP))GhmNMrDY>>YWR^ujCMdb?be&wsruAY$i&)l+ zg&k_EUM%V{d-Y=RfrFecmrO}olwMq+B#6{blVM A zeEpv3!NZML??2Vt&~xY9vo|U$duPA>B!BSq?MI*Q>22wK_4DbAUq^p0_h)4Cy0b;F z#*FR$0tR;RsO*T&IWBEnZ+eR>E?$%9{ce@SGV}N%k9c|Q|3x;HT}k#GI`un!*cFn_ zMCs+|c~uB6b;`P1^=OO3rnBqfoNQaY*^M)GStT?6m8_cLbkTsZFQ|0ul&H&V*V-JB zVrS62;T7vGX5C$^vvF#UuB48n$vW-CUHfj8n&$e3alZamG?(kCzWu>%9Oi~SKf <_MuvoXi88^47VVN1P1Py~#Fd0qHYGgbygs$yVV8H$ibKsB zdorAw)SkF4uGDopp};Hp&f-bGan6dSF3S%bk0*NQ?Q~)eSS6s$W$aej)S$_BQng)U z*@MN?)MW%xxP1OCU%(YV>F2$f(NWu O<2Y!e{aIl`IA1GYw}Gk+Lh5UF)zz`xn+k}+M;Ed5*9bst_%O}y~yWy79z+gC{)Ns>}nnd5U| z`Ts3BLEY_}ZaiC&t8h*4wgSWXAS1^uFIiu67e0y$VdQ*o#CTx))(zaQtl|zI8uz7z z1~Ia5&Pj0CBXcf#ohduRg*RMW1_B#6* 3+bSy&m^c|NC~{RQ9p$c+k8@cJt+VJJ>74d$^s-wrg(L%W-Xn zv(7guukya8|5tkj^mcJf m6*luCHFWQ@!u`K3mS4yXQIme7^gh zHQ)XEqM!PYo&Wj#Ubg0)*B|*c`9Gg~KCa{X_v^GXlf(k!=o{~a8UC=caD3}w4qH@x z<1_2uHIBRfFH~r7o1M@+C4EQOl|G+S&i7yDOkm(yr kj<|+c8RB8g8B-Em!B+{W;i}z`eV!}z|A?ErRSrtp3Pmk@?#!nDmNC+ zy^_N7QQ&AmpFn9=OtYkaWV1=!C(flymdxk*aKb}Ph^cN$>T@Qy)BGVDggp)~{S)DN zCQ0h^j1xY~jHaJFlV qx3v+XC(=2d;3{eb7W@1b(0;I7GR z0ygS=msXxD+x2;_*Ow;UiJpEH%MP@EJM&!V)yngAzczF4(m813+U}wL R{nXWURbN*p@UD(H?se^9r6LPrgg}OYjo~E2FGLe6W7WFl&$SBH zROCRGUftg>#(lJLf+HV& zVFUNtubz*7?3tIkRN;yrqdZ@AYg>VSWC#OCLVN!N|Kj@O-igy^m`!d-5)zrYV4?Et zJVv3uMJp%BaY@ceVVt&VbG07d`qUoZEqn5d%PSdL_8v)I!%@9#{?RjmdZ$lH?mm0P zI_$tnh6`8k%#yo(lH>B-Cz^UUS{WH0KYhD6d`BfC I*QB!Y#0#PHbCE*6`(_^htRBGa awy!nUC|$B`=J%yh7S!qL!)# z_gk%qcJ#Dy5y^@0iG94nxgzY1%hru&w(ULg>Ty77@y;L*Dc8BoJ1g}ycd&+sJ%|+3 z(EM5wv7B{x$TP#dH#>S#woM7m6)3j+e6v#iN0pz2|AmazOZ{&f*D9NGUt3ju&@Qm5 zEa%eJ*!%a+&W>z2ySKiHPwv%r35IQ*&RHKAe@tOsG *M1N?G|Q`wNshjzkDypZ`&4ex%xMA86NNn|5+~g zzp>zl`JqOO1LlXCc={&BGVs}XJmg|-3tK47&QZYJVyd#@VY}EXhecdJrfyK|vVC*> zP?yFG52q4?b1R(M4WETK)mXYIF5=R^m5|J7!RC2;f~LsNS^a7ZE0^&5EPC*S%YD{_ zlvbm MF) (P*s{mxz$z{ti4Tm- z;uj3MBY$pP{m7P6>bWzkz>!%8*c)Vn92Ha>vi+MplOBBF_}R3{fct}=k8uCyX#pD( zT6tC!%CYnq6iITb^tA7<{7~^p+Gbi#2jefhMMV &foaK5y@!{!|C#OEk z$;%%qs#h17yNJ{MH6!DNRvlUQb$;EAUlmQ94;_#TEEn&rw>o_Bt8)DNLWauJ_h-tk zCC*v +<0G0CHKVHXKd@**)xUfn(p-T#2sVMd9v31 zhVSb{i(7dCam>$B8s=60mzm%k)VMdLB5tSfwA%{1IIBK4SjbIk|7gXzef9z?PM7C- zMKTTEM-Lo4^XA^?=f|97ck=}=f7Ez&%bs`D8fVWJSs7k3pM2oiN(}}_{hP+dzg4fF z7qZjmWLbZKb;a^Yf8K9V38*zcznbaSm-aL7b^f(!@F_FCFP_71wZX WKBUFdk4kC{wzD<*BvHFOl>H_EpcC)pjs&Jyfv&U%Q}1 zJf)HA;{_+NH6NUpIyW-kb#N3-3Gme1?YQ?4L*vcA1zyTW4zel~I4kz8XYviX#8$qb zp=7H*t3ZMSYfOi$aF=`ij2R0V>?gSV|8%gRM_FUBVp)fq@QM7IK#6(c=TjQw`V?Do z_c+Qvj9~uu^dcwwWhL?809T`PANy4tWcP_}>u!xzh*j!PQd0Lk=@s>9(u^}p)XYzw z^sD+bc>&K-4R_B|L9;$hS>dx(EBxfCuw9>~CjXGrNq^a<_Mv}T^OC2W3zjo`wgpY| zS74CWuXK%-`aHwn<5N}sPNp~|W7h31X^$-|&!$Ixo>j3z&1}18PvWbf*>_YJ4Gw#r zE3!(Q^Gw9?t=`HrCDSg?e%HceVLEep#jWC^4=t&NXC=>?oeSn-j(D#2xzb-z?8^cU z-xW@_Gf%fFO`ggASKVCE%B|Dt%OZ)hFEqZdyqIofK6wtW>|9&>TY*trTb3MiN!Q}+ zx-@N9Nzd1sl|JcSmuKDjvdrS_O26_`m**LIEPZB^X{GtAQ2?ns4yjB2qSPg;p6`>> zhA!h(dZQ`URge+5qvFJpqLVrML`2w~oTf4`gmNBoG&I})U_-_CO%^K{#L7gZci;c; zzT3$6_9YIln)B~Z$E1Z>mx QJ z2)wyzdDPlZJ(G>stX_OqYSvQKss1;&F6${fyHrf?!p20VJzKLw881g%J@83&>4coS z2OTc _y>I>EhR|>D5oT}?wy8Px%Hnl42_N&qkU!GoA_HgPlM=MjOD{3C= z%fO?Q1q?OEVm}|qyElig<0r4pqz`QIRs#C}Jbti0nQnC^?OqMb7ZnC8mu35o@9cPO z(^CDsF5}N<6=6G{2)}v#KR?@8btK%kJ6HX~a#Qz=xc$~#AIvJs rds)D0t{^yEDeh|zqig% z;#E9#!l_f;#3H#u`^JrAuG?=loO^8^bTsujwH;z^*ZeVK(PXtf7E5?U)ovzsTTAR* zIK|WHr{mN$h9{e*i>X=6>-N6IuxzRl&x_kaDSjK&W*ZiHCi4|-x~bAr=C_i0Qq{DC zd$VoyZa(jOEXcJ;sFIEAF-O-ufrc3#Ca+#hm3N6c+~Uh}Gj&-zSJor(SyojJE43LM zG$p3RS;fzI*ZS(!boL&p<1D+*?s8(-YS*-Sjnk)FC)e-l+mN+!_Lo!K8#`=|GL$`( zX;2g9ieWhTpZ$7Rz?IGFDhJ*!dv#N)Z@E!S0t44|x6*eChh%?CZ7@< @TI99MsS4ly=`ck>eQ~ Zm2nNc!Got+o66tA;nW38~${hPTnKFsa`c8r{iqLgFWr%MU8)O zTxjR`%XYC@G1uediAfUOfg#*35V zx4(0@7YS)-$k`;zDRN;Ce*u53zzPTEV1fPKh6&Bu7sOe71N1p(J*eK5B(3>n`DzBc z{FcDtg^GWs+X%%lv?Mwt@CFKOyKMR}l539Wue=*9Tu}w>77YhjeJYr88~Hnp6%<&S z+?@nj1iK>6EE3y(;;3HL$L<84#S+Ioj{P^9^|2?zXR*}v6UWSUee5mhSuFGXhk(qb zjnU;I%>S?aa1jX*?6o_ySixJ+L;qdj1eG7kLR!;ZSq+3H<_DyRsdApYaq!^;>m&Cs z9pE@@D6*-o-^WRP <6NEwQgo&M*>qrV#q_H2(&n?(;cn*ImTiQu%@=duzy;?e*} =T*hm;osHJKYfOYT}?d0w3!PQ zDow1NJAcuNzS&FT>l;^YDASviT`00~N48#jS(n((1Mzko<&2EQ2T%I$UbB^9`>Bgo zNs}wOF5NIc(|m0I&HFlbSDUUsc&46o_9(->=kMe<_Z>U({+-_AJ3qeOsCsqn&F=$m zccq+hJdpoU?yU8Uv#hq2PbJ)TyBjPzk|M(SYIleB;zPYMiIq7iJSiR_%AEhF+DPiC zns@8CR#kWirTI*eRaFW?4`GXDHi+pC(h;x!tZx zFh^Wn#Wc(JU>WaMW9=Dh-yYNZ>veABEuYlcMYY{U=P$1GeCf0`VUqXBEmhM$c?An) zB&?ou?w=)3PIHofrR3tGJ4>Hvp7iQvJ)qP3Nho>F?ku~9mRpWoTvnZRZ_cj=udXkM zJ`JA7TE`TjzDw8Z0Q+4Z2AK!Er@rT_v#U)}yLaM8q1xf;#_~`8?3~1TZMpEOd9r@( z{D-%in={I||M>7|<$R5N 2}*>Q)xxci;8UhBtlr-t{O zH(dWSTS)AXt5vpGp&-L@N (#mDLIqwRV&aFE;^YFaH zdncXdd3$uKaTRJYHcYpYsLGfnTV}{OLq)BMdEum4p-YyU$Q;lpDh VYSA#Sz?jAYig}RSXFtrPqDHYT+GtD zsCm$VNnN6#@jv^zsR=q3!ZHP~IQRE4G;X?-bNb?(^NS4hG q{Rls_5M9U{WyFJ#?Yu?;Mv4eJZt{SNs!Vo38gptYyAh)#>~GM8fTEeecZ6 z*@qcC59l`EG?UQf+L dhbsT9s&Ot)?@b*8#akXoR|4_Z*#+U z)`!W@Ot`pe{<(h8kqEF$OIhAvd-U}BfWHghoDXRHWg&5Z;hx$Fxmi=%nOS2Pn3!xD zAFXR;J|UP}UGDv0&8O!bFAnN4_U&$FO*Ut`w6Zbs{bK=!sT1s;6b8h8jXw0xr{a+4 zg?G%NGvavpZaDSzK43cG<#jkB;;`JW5A6;-iv-#|jwnfe?C|heBsBfR5jCriodG?I zM3#FT)r$Jq6|u+vj6%UaooNfY<9r&~RV3W*iOyNqlaa#6e6FHNL~CMwrVpdU _Mr~XD275U#5p0;6|N)>Y+ zsm|VTLdtCuceBky*}Ve0oM#oW&VQ4vY}m 5{t0aB9^X6~4NkhXd~|m~rMzn$+Bt;BhYhC2AIp z7H0})eV()3NzLl|N$@z=ho0p&&pppq-TFN5$C>4J-y{2HL{6Ucr)3etg3e~-PJt`~ z2g3=BB44Xu%?8NShRypb$N*D62m90HnP2CD2AD+mwjG;wDd=t0{)D-wou<5zxwE0_ z?7TR^hUG^d=G=Z?aru1E6efYp%BJQ7dl8|+U w;OPuDtYGZ}|l$>den|8L!adA{I3ia(eoF~V(b{m7_kuyQbTgwk@ zIC~{YPVz)q{h_OObsaA3@45FxTkm+ww0%$CRB=75Jh0>K8@cugE55vaese$L>tCln zGX3y~b7&NMz&WXG!W`Syk9wwG($>cx2@qZ>x%r28l3VW!C034xkIEZ+XS)5LX0nod zsmCOpnLCd>H%#;9l39Fpi{|UZQ*&)X8>=n#GS }=9}ZSbWwxBkpLFlfk3P;TOY={? zi}7lIbIZ8#z22_FEUzDaY*^3Ny6eN2mTQ~e8#=m_{K$E7{{BVBmbyRXf86Ex=FMSG zsL|xfVE$k6UY6rny@tjKCx*Yh3=5lsV ?E+%m5Zc13hX?*O2bDzqD9Zc>*uXZr^|8p#S%;~}v>BOS7W`;tM_JI{oQfvcG zIQ0f|6+Ow0EW5}s#nj{G)69^B$R{(be?%}dh~8^Znx(eF(|NXq3TOJ9d!d!fd5e}E zP!lP8_tSB{`X5Qx1?56s$)fp-R<7V+%+Yk6(8RZ@d0|Lc6w|^Er;95l)yg?6mpYmG z>e-4in=Z9wEh| 2_jW g+WBhg0X=Cp8#Rs{ zKTA0}cO;(ZZr}29-UmI!|En(Ms=U~?aNX{H86PIb7KaDAimaO#ZczKhD&w{%@Z|9i z%F>e?){97_`* nQX|S@3!4M=5n@A6+g!_e1YbtMbTj?ltLNkbkcKO%40Dc%B1H zCl{^pX+3MmX}d|w?(so}b0HeGTeRHV6W?uhtakju;g+xa`S9!|Z+x#hPrmDXhM_8! zkHz J9 }M zwIVL_v{{Uv(>G-UhF!cH!ntfT#TW2D|2Aul|K|G@NACY%-|k+&<&RCY+>ccOj8ER` zvvRJO_dlnA@rrB#>$S&?OcDq7Kesigk-sqYquz;wd{rNs6?hhMxO*HDn)RVY!)GB^ z_=!VeyFRoU^ep5__c$zd>qDF6jyr6H7EI4RerUJ3p(x;Putz;&LZO{Z(%DrLTm;QF zvbQNGvI?j>s;+y`v8?EUNXw4{tYL;N3@nSp^H&_btXD9xFk;SScJ>U{ms3wSr+zsk z`CQCR>&nEm%$!8It2YkXuKUmz#Gu0W*kZe7SYwmymiT>k9!E7zggTn`EL8d~?kO!4 z#MSX =@xtM1>VLU#g+4s|i$(nmqRBz8<3Vn58N^kR1-Z>$M{J$woR!LFT z-mBoH8n&rz$&!WI tnuo@VJ$(~G!BZQCn_*KM%Po$3 zo-6v-I_;T{I`7n#=gN+~o3;OlqP1&>cLv+%w(lj&IVPUOQqKQCY1+SezW2jz=oEJD znh25h0FR# sQ6s^2N+puuy4M*POcfi&l0o z$)3An)rJy%v87q-HtxvQ=i(^soVxR1?5s&S9Yu#u_Hk{^-G1tVrG9;Rhfwjwn tTi5m4<6K9=%jCI9t|n;MJ=m-N)B|e5k*-r}oA7TW@*=zJ3 wlY+j2G_|k2J}BdHcFpFnPCwjI~zv$BQzq6IXfskK^hznsKT@C;HK;bk2*O zGZ%ciTaqT2z9!SU_v@FLmzY}@tYu13u)6H*ng3x%*CNmU`5_SwtGzaqn=WTsGDl$Q zYb(>m3yM=VMlsxW)w#Z9`iihA0-|~6wu<`S)U^tGv2|}m<;9IR#W$?5-DV|uZmXgu z153Vmdlt_zwUm -3c4|L#qH|3mr1dINo?n!jOYFWQ~V&;EVx!oYM#VZndSdlL=j zHy*mUVGidD#}&?vLSZi+aPmj3aA{xgF}$f>PLDB(Q~lP2N9^yW&N$R{s`JExHa)pR z&dvJQZZP#|Us%D^uavMtxyypX@^FjJ1dEhDQ;C~S3>KRho=niTlW6Gowb-drD`RH3 zlru`N^3inbXA7Q8ixv9$kS~4F%4ZxY|7N(%&O5YoVX3!E n+Y>j1jvk92PUYc %fzM32TC^x zZCU+an3F}CYvbj&BEeiYn;vN^up~^1-I}8!pzHPY(@u}lg+`2x?9+N~vsJ!r5?U|B zdEqt(bIFs}dJ5dv1oM;ySmvZ@oLI*FA?~-HW84wXGq*b!drW-TJDBb#8Y)Y0Un*4K zUv&D|@r}!xHYso}k8xt+Hx}A_T1n+eFfG_#SjE0_|MZ5vEy LLD( zDmxA^PM&b!?Nc76bF&%OU12{cRnT4O=HPfj=f*+Y<-En2g?!~Fz)gFbKQ57j9=*j@&&=~E4PN~SE~GCj%S&v$aFW 9 zZsx`b5}kbAi;m}5%@0`Np19CLg&{P-CDLvGgAEquqDi@o4J}EMyYGK^ar(|=mB&B! z#C_eBHj{xvq`IXw-=44DkFhMSt$%_|F-MnwreyBKS+jMD(-Sf|X3kl%bY9-VzNM@C zCr?ex 0Cr+1&fX00!B^75hU z_bh@hweGtA)a3Z>$1k6~QLCNs ;+3THaA(cVpvRtR zCf$KHk{aqh{DQ|B3mynRbLeL16N^3SpSFGJ)@4i16bojBu)1(+ZT0d>@UYO>xh_ON z JNtu;%k7Yze`5iyC$m)05QnOU!*Ru}&`g(fPk}BrzAKhUFYk3ns?lkq``Zy!C zhsVfHhwam>lSgHKr>aRB>!0nOR=JOD7W ~N;6LZltqlpa zoa-(<;CedoL43>J-tfcC@*mn0i?vNIw6rVx{CJq$u;9SMP8*$w1YVU%2}<2{UpGAB zFuzpc+^2NIow<_j)s7}6y=4cIxeaH1m@~og(Sya!CNd{g_}Fc3I<@Mau~41TtunJ| zdUO!$v*}@Nmd9pjd1R_dWUO28Y*wt%N3}W2wo0bXEO}M%u%_afrTpxuUy+9kliz5r z=!)nve7;aw!fMgtrdym`i?uvfWh^L(`gM$Ph99S $t-dHNS0F>cseDPZt{k=1!qo*cXLCVd%}46ltx6J2;Z_e_~IA^-T&1JNEk z6zUa<6ot8GIh<;(iS{_0WFvF(q|nJfJZIw9#GE?b|KJQ0qn)txXJtL>#A1GC1z+b2 zKQ0~GwArVBf{Ac&{vqRD_v=Mp%Om5BOHNk3kV(5fTVg_%rK|c5(;IDT{ysb$xLNo6 zos#Q+9oZ|^H B(aEP@t|EA+9t{UAo z#yrKmXOA=uep~$KPh0Nr^LfwW1q~1K95&o|vUu_L5>6HOiMzP^ZvV{^UO#`qfd^@7 z56ZX?&t_m`7Wb$-%zEJP$)8#?%isJ`TYY@p<1cL?{^c*LI@ayxxY56{>ht~P`fA~o zlj7?*IeAvw@QI( $g%{6quTQS>?|zJ-%Mz?y&})OFyXL`=tMTPHPJ!`KRE9+73`>tP`aJ+qfM~P zr^_csp0{&{owi+L^OR4ESdQLcIb~p!)g2#mU*KTD5#5~z>7R|2g)exlG~2cy>#4Fb z|C19d4u1T|R%H{SP~33*)5VGG{wdLXjUKKtBA-~=T^{TbvOH+t)HBIygYsOqPM80# zo7iT|xvftv_ z?QQZ#n+4*2oJZ5wArIlpGH@}RU_fo>uX(zt7?!px-queEnm(5$Xv8%U#>6{Il zc9!aiY%Qvux$97do>*%`d*R{J5&9haO4@gvx#GO%c;kVqx1APu%@(?R=dsrH?pse@ zK9xKFe9o&6YDaI}@A&v#uW#y$?;rHm{?7aQd3i&K17{uEvd;-;ge+3Ic2+KMcptN* z ed8!=-bjjAx(NxN$zYUB>-&TUyGMDpyS|&v>*);N_+3 zoAd4Kj f#i zjGNUAd@CL*iEMi&&v~=9qK!ejWQ9`)`>YuqT^bGTPMvy5jf=Pp=6!g;$#E^?P?GYU z4yJBf1&_u3)*%KiZT2U2FirHBr;yUv>3Y(cA^03)DyMbSN~UR=2A%ghM4v?{&rt8M zWSMD`^KvOi# w=q)wm1$0@C@bZ&f~@9{DZOy+8k%=8M)GKF1Z)3+1d*7S%6m zT(-DqUSi@B`3BFI9Nk=o2bZODZO~ldJR|ebGIj?o&1GF$kJMJHmT+mSZaP;LwCe25 zUyjpvMSW&u7LZ^#$Qmqj;I+Z=u!Sm|4tk4Ub^W~~-mp?tXTpL1oNNNx-P=NJyro&r z>K$6kfA5*d!m_-k*I}Ec2pBl+EHYTYtihwhw0@fEj@>6V1qJ@dlKM5R;JxJ6I-_+m z+_MZeELCUG>DV<*#K-**)9OR-WY|7 ;N`e4S=oE&;qP;&eqIa<=KJ;k#ggfH zR#M=`{ R
F)DkM#J1dU{Ho{ou>0HU=AVA;_E#Dw^kfLgvLDT0v-ri|>$E`m<*gZP zT2&`|!VV~}xh8Q$NMI9Bk S4RkaWM0oQS7fz;SHP@ 1j0_P zirIC3y4HqN0p-ktq3 qeb(qkksTFt(;WTwFl1Rh8fRNuX)C|;^#qsFXO5E zniI|Uo;+99=P=W;Xt~YvNK5z-K3Y5fiqH`sMVow!y``5X6g=DW#5CLEoE-A*8&FMf z60Ii4dAYaX&N)a!UuR8(7(0`qW}N^ZSHQt+tN9l+zARk;YUnqlBzo AU~o$Cbr9mK8E`HYvUT{a;%@z1+HzFR!7qE4d^*kdc8ytb58-zYxBb00yC& zY4aE8&Y0Cdcj59C%8T U?98&a1fGBR>>>^PWYAXGPj@6gG^awqE7 zp1M#hwtLOK0~c?Y9_c!M^PXALm4dyK?mx4Y $w6@gIjD-&t#kEgk`+Qy4 z!FuKTxD)}cwnbiRRz9-b%JywB`|@*4)AqKSOuW7|?V{Nmw&`n~*7bk8x^?wAiMxBZ zo8=UUt<-qn-~8O`N0mg_qpW38+`=)u2OLix)c9 h|L1L_V88i{AMius8STwC!h*b=i^5pRtec<%5^%Sq6vd`u@nTS$<#o zpDE-02JK99$N!ZaZh;GgKTcIhXb$99z}&35;JZTW=CvChaxqLYP;9sPu>4TF=9zY- zPU9Yp`_+Pr9w>FM{IOlBS3pBaB+jJkz+(=zb7D$d&fj)8O)ysQRA_UXwjhOz*Wl!# zUf)X}o^S+R`mne^RISr#nl6LDVqW7i%|lZY)+sFGJ2&&>p~;!cHaz3Y-L &Ry1G_kHPanVBd9?hfkR6dDoEDH27(CBUxoBo2YS8LMBxqbf} z?=H7xyYNzdab6ei66RU6dX_F(HS5Gu9fO1h4)KZ!XEID$PDQcqIuz8nM#VrtN9(Xq z^qY+fKD=Tnp28%wR{msLk>h`Pk4;)_>x(2Fypg`|bY<=~n-*=it*Nmmb7hV-73s#j z(qn4enXpIt_~a)|8}(%F?Yiw=&JrT@LGy22QohVjJ1>L1@iKRgA6V|-<9TqJ#hN!9 zpPQQA9aY})oAa<+(;rr5ndu6fM5Nsn3(bBvJuK8vX*N7yseQQcldEa-)J?~XnkN?X z+RqmFA}*P}^vs3(BDLK|Z*2L~b!kUP!E0S(?k}4R%)0}(+FElfo1Q)u^Y-i&6{pxD zjmZ7mzTVs+@WAAD!ExR1cLd5lY?CRwADha~78Ah8%vlq3kd^Jm+8lPn@--ezo!ti- z9 E}@&?IOnqMdJ65e=Ir7?9q32{(>5jx$g6w9vn7b= ~)7XtS|rX%4+>z@88cC%h&(=^=A9~f4@H**Z=?L%k}*Ke}5o1^#6+#FtQmWR531@ z!w`9ZWl5}F?#0gzKQbC@{wi)@z0-Z4rFetmkI)O8@>d>+JH4=bQM<7DucYSyiPs0MUOKa)XFvF3GI0xe@Mdin3~za9+}`I-YYNEg^wNV$jM$P%y!|Z z-p-G_IbSBr%r0>McvX-!gC{{gzoW?}ud5~g$KpS16C9mpy{T=!^6>Yj9n9PZ-*?+& zEKxT1WcHfJKXHx |SirNC!)B+QX EvnV zdzLaRv^@8F;+i?1k`HNT3n1-BlV#v$Krh;LUhbWjWNGr(a{i;OkVd|T%|Q{7b{D1$ ztJzAO%|UCT*56q3bw$fIhM=_-K6>ms&nVnjXt4YK2b~_Jm24_kcGR7Bmlcd)WZ=lH zZEH`{_b82IEEj3*m^9hBi;p3tJZH+BxjNHkq&Cf-w{)4j;q?4j6PK@R*DopTU%$0Y zPOPV(Pe^Rr{sKdeg_{{A*B&?-vGGV%Q{}0P(OeC+doJB@In&;>@8*5GLmhorA3W3Q zI(v=b#PfGb`WBP=KE408LT=Zc^6%eXPHDRJ^{`m? Gc5saY>H4u4hCd1bQGT*uk-4uxKcG+((b$skr#c(pda$f_dV2bW)8iD?U%wbs;m z&5HEw`rI2Ejte?B7J6UYdP`e>!`>LiDPMnceTZJrGF4LSF^9&zBg@6urM^lOr5szM z<2~Cta>BFxNsTxDzR@$`cVDu!&+lxpX|^%%i5YdVTHB`aZO*LTRIBRH&akWT v-MOBB4_wu3#9@7^qqk17{7zc5I0`t~Vm z-}iv|PIGI1 8JMexbP=U(+Hcgzn}GYKUw_|MO+_QJDa=7#j9YQ8>3Mfqc) z8b?~I16Dlb7v;IQfd7AOg)5V^(hR0{wVn(mE}eA`l=y`jekn zhn201`>UK@_A~5=T&Y=}w~Ce7B_`?=BcsAC<`owgM6syNN>k3_k|_D*$RrTr*2%=i z!Pro=_FM2O3C@@gU2B)5zL4ZTxQoeAp2bGPX>*5)gO0r7A;z`;H4l4Mv9efKY|@dr z6FWPc>26We>aFS-t0!)l8}hqt_N$;H4m&6Bc-^++#8iQN!8_ZuJJ;02bm+_fElSdt zXAZukEyEgIWFW&m`)a}7d5aA4)t`sOFzudOvw9=PlWB)O9%s8yogK`)VZsJ!<>E(< zr)wEv+)gc@QgdpH! 80V0vtQ0x#d08xgvl=YoQp7M&DbrOR|vuYS$ I%QpcwAYd!Sazou-wn~IOB$-|B@QJ za(66Wym~?9tFQ$p$~bvy)+IjSGMKPhpr!u7HqHs*I%WLtHuW8PeIn}) tN@!+lPgi+g+6;3iD%SnnZq!x!qE9n3$i+b4c>w4V#}!1vy;)NQgFWa6NEW zk1t;(L}qn@>;6!MejABoK~Dw`5fLNbhsw_Kf2VmEzA@;qjd*fj#k0lvUp_ !Smbl 5uBrw~UDq=oxfi~Co5yHrmvx^xe6{`RWr z$DIl-1STyJnkX2Va{zSywpYAMI}1Yqs|!c_Q7^sO=WX8vF5+fTN!n85r(P{0;&T0a z-}V0ujhY4?L3u(VO WQGiR7f@@lBb&V4 mLGX3JXV*+m;SZ{5>vu%kGybMKMTmh}gPl8>HA*XKKNkdfo;)v$;I^@pzA2|RzX zWTVikyH9m*^vr$s+Wh{@%Wpn9a$T7^>F}qY%5t-&z54a*&dp|agZp!1nWu_QF<&yz zp5cestlg}y<{#-?s>PI1B&clRxKXC;$+7pz3nnO^{y%k%hr!aVQ>O>)s+nn+c6#QS zAF0t#+LX`D={HgO ilO^H*%mo_bNUHEf1=hW%v+I?1E+NCVCBzUc>tw-)H z(Kpu?*i4-DR`tV@C0oyM?F{9feuHg&>g!9l3c_!P?>+kCTBob{hPwq~yzJ+edT-pi zZ@JaP;yc_$DkrDxjx=l0*u3+sT~g&Vb}RQa`io~TbPKFH`tnMs|N6FE*8^`>ZqJ-A z_(9Qp0)udg_~W~~y{2C~ AhVY-? zt3Es`uK3?@XOF^{m-$ovC*1uj^IrPF@p9j!y?^8Ot$iS0{a;i#f$Pr1fcXE7Auo>K z=e>C5_ybAiSr-~ag!&2|v^;eA7}zRf_TvG+ TY8T)#6lVN(&q%+yaGQu%}(W~NDp`fYqNTUTa6ie&aB&!=;$CJChL)rJ)}%+CDB z8MNT64+F!j4n3octjT{1mPdjX+Otm&3+QFnRQd44sj}?IOTLy<#s?W|UM Laz2Pu{${$6EDp?uyl)_PRE|q7uhEdu8Hw(Jvz^E&FbS_0ehGj zmBf=7_MP*RVLd*Tr@;AS5QmS?;fxJEm$w^R{|TDKmJ!2qidFbb@7aYbWWK0!%JX(z z)W5{N`BH$p?$;|J;d5iyBjTIBUXCtfXyg?&uysE#ufgDWt+&jefRn92w)L3k0$GjA zY3Dzha^)(&`pRYJf6<(iXUAOS6RTP7t+=5T(N)3euzEuIV$b%X#s{wVWKZ1;h~C$6 zbISCe=2D5}>(u|B4W7}v`KqeJhn@VQ4h2@PG*l*JKh_oC`^}$yf8FnQd%nN>{r&*E z{+|y=#Pk1rJfXh+&!;oy@Be(h;I9Ao%azyf99cy*9IC&_-OyvYc-nv7;aA7H_cy=T z@c!3fhVK7 d!EP!2Y8C7 z8BW^%TSdcNv&k=RL;n&V_$IIoJxg`cJx@p7`ZR6FnWyDkD^EYreLnGuw}Afq RhM*$n&|JZYSv4r+hA(67Gmex%DpaSo-(zd>S z?;4R5zcdc92{UIIPnzQ209s3_q(3>cc;S-Oeaq&>uUxaKN}p@}1_qAi&3h6II4XMf z9*)!J>&hw4IC5rU&GxLKU1zUY=}Vp{KXmnu$<~{<7%$&_QhlTC_S07?TQ59({QC8> z2M0HP{3OTm jTjxX*uz>oU6plvNbOFxO5(gdvQADnEbJx zpE935|JXR)ZQ?_Z|I_A_PD |YjL2xQmR zvhjMwdZ@r{#;ILxLZR*}gKYy=aIuM8Te(e!_s^`a>WU6pC-bVpJZ|Z2UEE^Rx|HYL z8eZuyOE#a@dhfir#{Fk(vzdYZo|f-Y@2n-RUpl&4p!(uZiJ~XRd`r?QvVVS9ZpmUT ze0Yzt!?Z1nsweJKRNuPms&3Tod8yAfzr5*_SNt%`Y5Sb}y9(346+LJuh&(t~W=6rB z&`)Z@Y6tT4u6eifpI`a>P0{S_-%?_G>IMGKO%{J9e_^`#3DpCof;X>UzpeX!VuQ)6 z%h&fi%Z0uFdvVRh`5eqlCwi;ZebN{F7y7<(!2=#vy&or f?_1ep4o$0%a=ez`GL*R- z^_rZ!ZRZs%;q?3@aG=X~TY2&nE1#Xry{5-HQe{H!9Z>D`@A{BBb 3?|0qI@1JJD~czSX6vtCWtg3? zTS(~Pvdk5y!Z%deta4vBt0Br`eU?i{j@+3;OLP89)# x+U%VX;Vi|XSn7oIsD z*wWhIt*yxxvSFRhv3=gB*3a(vt+)D9pOF5BHB)Z8F#R}WazN|Fq6hlIU-ZHXxR}MS z=r!=pFEC&fTwd@&=+(MS?=`sVFKpD2oPPb|aqe5YPo6lVGNEAKtR3Eb9TP%g4jpZi z5ZKhnI{D0}b3uV;KA(4B*Zp$ArTRuABacIZk(_`-0>jx*wGY!ympgnAV-DDT M;ke%KH(Rdf{eHXSIij5YuP5Kl9nZwP;MJSmOq?%l44!N@p5Odpv-1KQ zu4S9wIeya>DA@T*uHxOcHxG*)ZC^bte)#uwhrZ&!-OrWR{FS=TuDetG&i|U)4 z)?N4+edym4(*v?6dNPi_zV&j!@m7X?uj^wg;uk8MVC7^w)yQNc%QiK@!7q0LyVx3G z*7*X5% hp-?Ik|$DA9vtIZG1UHHnKE#xkH;RffZs}tB?d&fSQXK-ZU zMgew%KMtINSMB+(>1SwtiRX#_;PUvdKttStha#Q_4lIhD$Yy&dQm{0@wPsQ2MYed6 zD9Q8%M|Ha%^c><=zTmav*r}6+ESX;(3Eg_(X0hm9N5YX<;mCmFBA*oc_db3s_LpOi z^|N&oRyi+`R-ei2uurcmX9>n;-FFTXm-#H!$~E`!O)8qy^F&tbF2~8cjafa0Q&iq7 z2%MHe9s-wR;9)qy@STAHdM@9*j8*H_ysGSS4ea}TcG@NAWax~hNEwb!p#v;6Q{-Ee z-NEA|qHR+Q!q2U6UJjZJy?^@g2PVczg;jp*ldp?>7x3Ho`+tM00Y_peBLhcDV|Pz_ zwpdkoyO3D#wCOGtLg|b`wKEnh)X}fZoLjVL<*FsKi|2}Tt=iPPrj&90=AAuqVjOkb zIi~J9TpH85jbX)+)2Uk<+7F$%6yDr@;PQ=`dydy%xOv}Re_zk_2hSE8+&Ry%@%cNI zCDXT?z5lALzqWV#&u{OtUp4Y=ef|BdtBH5JouJA0rg?i99*Z>zv#*+Sq)G0_%hx4^ zNyoZmtkVvQYb`mEsbcv5t#zmFQ|Dft_MI*nMrs>pN+;f$^HquYM2B_h(O}5~i2)0_ z7}i-=OnL4;%WC$rtRDg^LL%9w-uhT3nipx;rU#@zv14jfW>qaowD+5EUxTBxm%i z>{{E7y9&G3&gOa_7E{yt({#3u!RCW=p1m{WxqfA#OV3ipV@2E-AD!5wCLPoxIXg}9 z_lq*UpOG#v<+d~RoD+SpCG*0n@aRHW7Ka?ME#7w~)h<2Qc*l-!jcuTn>3bbsyFYry ze|9W=a;owDjDiC@^ {=E*&7Wo_ENF2MxWUw_;gfKv zMuJbVfs1F_!^DpFbABjx&AGs+)II6K!bhC?hjtw9(44~2(x=9fk<2gNVCKRg@UP=2 zQ}>w_PEBsB4kdHhnQ_XAnc8VS<@ezWd@?mUGhBMQQ`E+#{E #OGxb2wt!zWJ&EIx!l>EUrNAKui2ZfBor!7t|UH!n}LxG08|73KJJti;s zx=%Ktr|CfS<_$BLQvcs*Jf$5Yd#?F!*V*PfsSEDrU!UPH!R(@A%!ch#O4yq=pD?+6 zu;I4VY^zeK3jSP&2VqlAnR8G0yujh Rkq(~f5T zQ<`;=GalTHI&etvN %YsPN Y{aVLSN4k6?IR~YdbfBPfw72 zdEB?^)8x;)QdF&PTDt7w>)N<@hGz73kK3j~Wfn${-flbWep5AJ>Kf)JTuw-%7@)%V zBwAst^LnqBj<)<==qSd@>BpTGf<`f1S_(vT%@&k+t&Li0pe!_ji-p0v>nUgyW8cHV znZLbcl0hp|szgLswm&a(dEL<1q^>XK5ggAU(%jQqqAwy;-H}k&H+@F%gq-kr(B@Lz z+3E8ZEnlHBVRG8CmFs7=&dG@H-mtydU~^G?;g0=91{{rXLiGnugz59GDd{|UA#_vE z){EEdPoFJ~<2Zi(zMk0bBMjRfJlDF}cmBoO7Oun78HM(}`zAMW#=39c&-`Ni_+#sC z;exw+s+jikO1k?t?QG%toO+A>qm*6l6$XnH9Os(%cS>1m{rRze!HE<(!~cAb$}UBD z1?WUO?dC9E;xk1gglkcSu((~DcJ8-7TLqRKUU-1R&!)pf^Q4>M>|axM_^k+u@Z!C+ z`_*UFkcODfuGPN`-mF%M_nlR{wJ~bz*8R8Mu`CeFTg6+n-Egb4_=M?2H4~pMJ!<@6 z?ZMPNEI(2tB$Bl2CC$s`+?c%m r zFAKa?U!U%)_UDHquiX;!`^~>AXWqL%Kj&SXo$R*|s~H{n^WXNq`tg;WrCyEY1#=@) z*u;7Nx!8 |kos zShd25`T9l% ckvZ*WflhQLTm1&jFRJm9Ed|IEqY(m`3$T-7;Qzgwhmq_LxJ1NuJ zyrS|MV}nu9^7-!HGSw${n9X`Jx5?_3#}X|A1tn(riUXkwH-|EuY3nmuuyV=%4lZw| zMj5M)MWGc^)4JA7JGfF|dScV7& KQeThPx%s^&=jUR_gWp2m^zBQs z>+#z2DNU$wj$FG<`!TiUP7WtEx4-#x+Tgg(=3-fu1Dhnx?!QTA- zKYR|cmMFwFT~PG*Y1(Tc!C=Jc=Uw%IOT5Ek3#Wj_-a}U(G~H!7uGuly`D)*yyB$o? z*_qpv^P69nDvPgJ`|e7SgKqgH`7LYTt(EXk{Bp+Pg{;!Upq}V$9Cga?emtJwuJ`lF zl<>TtPiLgB`-!D6)?3NWb7M^vm#E5y53l7zF6?+Tr#iu$TXw?SO4iMf4Guh*5ihWZ zuh84hT=b+pUybAr=XVD`+VMR2{dhOCqwSf~(=XbbkuzC$_?vG0``RZrgB|NmT)uAT z@ZIomz1uHe_D%bCJ^J2IbmlFyQNzRDSMmx^u5UVUwz1-Yw9A*6GzXJC{Dn+Q4*!=a zx7U25pY|pA{$sI@&AeeB*kwv2Z?H79@e66Ugr8Wjhr@$Oi0NR}1m*{PAsXx1?mcKy zS7_jIHfIo-=a+0^5-CtTVgLSx537xw7xBk watK+~Up1tr+f7BpmQDHQnYQpEJAb@xqDabF&|FZLqM^eD|RD++-#R^XEs!ZW#6` zc`SZ$O=GhWlMrk57a6(!vJ-ArK?VKb!Wi`^n@c5~f0n!w*?!`}-;WbyUO#^Qq{7Ov zuCJw}CYIeR(<<~I@&Z9fG5igsO`M}$RUoq)vMl6}hPH@1o1=_o!d}oupm!-EEi4Qc zq4pf@hd_fA+h!b6T*=D7!BufKPd|~1`%x7)i^`O>)#u;OP7vcOu}bF ?Trfk &b6YK5t(;ZF}+sjxO!80)CZNR@*ZRzX&|qQY3OdV$Tal z`Q2^O(NAA5F O=h_#$HWrKONAJy6sQr3+RqnanEuSB4>NfqTd0=LdY1yA0-Ll7~Om%$6s2P=( zIJ-E;?{j2yhV&%wZtJs$`d-QM?%Lq@=vQg~4ZpO<8-j0d6S~uH$MQj!r=njgq%+uP z-{S-9&rekvo;Q5x{Po49>Jov4($z~}n!Zr^zK-J$?~5mwcNxSdJAMD++jc!+zSESN zA3Ip?EV$2P`!DRz#De?ve1c97bpAzdoBN;ho$L+QCcb^l59O}AMm*pXjoQ(|Xtihh zp%yis6^Y!OZ;l;q(y6dm#Gw$iZIQU{FLfp9$9p-Fx-A~eIMkzGSJBjG%FyZ5X1k7I z;e@}UC*7Jnq-M5snN7N|WYXLP=BXVnpC+hIRdXm; 8Fwy7(oCi! Q#T=-Kfdyf~<};Xs&&vx>{( VZkIit0w41D{vUeXwrW<97VrK;FRb6l zahzXdP{Vlm^M~%Q=aM!|65XD3VAVZWopXDBe7wD3S8j#Rr;{4X*L*sq11g5MrJiX! zqoRJGfl1Wi0{c0E3q9*Nd1CIkbT&_VZ9GR-q}FM-H%Dv}qkI3$5>76k7-uFKt+`Ch zfyI`lojNfG3OQqz&)K4W>(Cu{*4V= {IQ&b zpYz+^>JQ(!_Q~u0xiCTgz01cU=J_mdI^Ul=%+UP$E#o^Yp7};!Vt6KeKYjiDoFCtP z0{VA+voe@p^dmQ+zUXV*44%!OV<)WN^h;W(?;qcf$$RR5{d(;D|H{|>GCTz_>`xf~ zhHZ0DFLwdGJgJTge@ke1!(pT{^9srDVBt zc38^G^|kp=mJ#(;a5?ez0;|WB+v1T1$I^E(USx~ykr52v;I=pNB5QO_lF*zVJB__Q zGH32t%z5vIh4i$*{ss|8X =8w?m6d_YZL B9j=APcvERm|Pn!3Je(;dqzQy3YA>Srumq+TvLDRS=o#j97(T0Upqf;F3a3}zS2 z<>=nBr_n&9y?Acn-lIj?2TN*_kDX1~w*HXN?sHc| LNcN{)Kl2uyo57V~ z VLy@BVhnAY^Goob-uh+|^>a zZu4`ySB8F@7!|Yq(1W|C)5OH(cUNCL*UGApn6R^X{Su>^8TzZtd!()1Ts)_xq<7YT zXiWZDwDpX&)!h$kDn(w1Eb?R*{GiAnc0E04wb-FuU#A)@Pj6q9yZcn*y XPp5 (V2RRxYI%!DU95 zUT{pDH<4lfj0K%;OPhSOl9b!Uo@OR5Z2R=0>8whW`^p(}xH?u%>)Ev`VpEios=}JM zMK7mw#u#X5Pye^8YxN=l@2BeyNp)pva7kFZtewVVz`d#Z;I8KXTTe emUvIyWKmEdB5Kq(!-^<@6Wf_@AosX>wGxyr!0Yi znMY#7deJ7eJqA-`e@Jn#lxY^|O?|h{yY+}#%m;&svKclfj{21`%urUb&Rnm`RpXO# zsyN{H>yyH}-z;I2VP5oMzsTv09A|DiDQpsWB2?3~K)k|X%SA_?vtKSlC-QQ?UX4g! z`}JB(`P;A86WVpZ-AI|9`|W1N^4j(6;&0Y$;}BP2Sj)k3rn>Z;9uLEoi@N%~rp(3L zH<+If6L8pk(a64f$AL~^!HWHU+=dmK ~o|G{y#0rnD_Qn zMv0xq3kRMJ72B3vZ?t^VxWP{KUeS%7r*BeL%u{_I`D0(T!l7_Z8?mFoox5aC`v0_& z+!Zca{gToA{b7dF>;E3CInf`-^xehfzuu4Q>HX_}*hTm+eQT3ozu{%bf_~LM&O7`* ze0)3of!)Dp!G;GIzEp=lX=|`uk zb$#Ax2b!C`61dqs%=mttZqZ(mu#Jm@MTqH4tG2+x{c;|&x6f^8&17E4`(JfG$2{Nm zFOwc}7(^VBo#fCO)x7XVK*kZs`6@}*r8FSttDFI!z@;zC-Wkli=xWSUXR(cQy?O#~ ziwYhT(^o57>+2WOB2 i6I!ZXcL~17svyQg(_c zx`^B<@LC(S-r+_eX8@}m1838u!?Vu6*y6YP%{!(<_ekIMx7!W6jX0*?cn2CSFyIr) zb7D*?Ztm?%H{|FDt`+N_KEtVUQd(F2%moXzDupuVEn2bCMXsu3`Kk@mCzh?>xUIpE zZ*o@GwC($|qIU0LC^~RF&2VYs))VJu$?-KaGII2szhQH#w_yIw`?{@tSFSyHrfqQg z4#U3Z@ATzF4mVu6^#1#5|Nbklems9U FIKt8Sb$qX{StxGi`m4P_XL=|0DCx znOadXFBab4*Cw6Jc!tAh$*PHr-v4L0v`$)dYU;wMK4A`FiDM02S+{z=O$zs$yS?S% z8HO+6J@b|ci1FT
Id)y(>I=FDzq`=-5B+BcGC zSDp9m`2Fn*dv5&0*t$A7t|Q_ddD l)WEMh5m z$j6-&alFmi=S5 `r+o z>)O0BP*Jevl03yIDwgRz;f~`=6)9i8%%}W3GLutNcX@U;F*1MMer2L#!_Vn6!q+h{ z%Dxa>aATVH&Yibrtvq1)Ksm)MDQ%YLy+TK=l6mD#b9x1&y5@$NHE=Dm5?ru?qxRJi z4YkI)j;@8%eP%sNn{{f(^JNR>O> nn)+*R&m$`ahxYxV*<7=B*0b8J4FhO@}p84UX%4 zK4Wq{=kr;M=W9Nnvw;uYy4-%m$o#zOdF%nh>Idt&XYG8`$as8_K o%s8gJV0d@$T0r@_N==X#kf%Z=N8xT(3XG8OsZ;q)K1Z!=2@1a74a{B$nMYj{qytV;^=Avg@)p4s}~*7 zJAXZ%%zba?`iZ;ke&4^BXLs~%a9mvLyKt?#qYN_5T7Pcc|7FMeAzbT!`I~EE_AH;n zxAC>ydEgY^`gy^%f6QMq_vN+D*^{qjCw7T@o?DY^^m?5iIx_3m{;}nFP`mZZ=LdCL z?`)q?zwK{y
9qJMiI{J$l1mpspe)bHL088?^ilh-jw=jFM@lFMeFTl#@n zQs*YCr+~xkjr|#le 3-4;TT6JINO5V1d zYgGV?$DNzArfF<8wG_+{Z+IwzI% bN#m&|^c@*|aV}hFFG%d)was_;WJ3a7rbk5Qk?~Yg@d5h)|(-v5-jn z#7VZD^}dZ0CeNC!Gc~T5Z_c8{N}WCP8D=h7-EJT@ZN;iJn{(|q#5cBV*_~kEnj5x# z&tY!^zU4U!j-1Y0U$yhhMXP-$4wRH#x~W%l=w$z`2Xl|N6-z#RUd?s)fY7cNFXXx= zo_haY?s0qAv#-ws_kZTt@bUDqT%l!+4<4=EZR{@Ql=gj<=%ViiQ7+94PN7>m^5YnK zrKiVENnuSnk*I9@f0oTo?bLleI-NUJ*p1cnTP0*~#e`0HvVHEBKax4@TU2HG|95Sg zHM4zD(7bb>1Z%BMAHLYhI4LN0Ysa1QYuA|N99Si)vvTA4eY1FPPdRrhHc8T{+ME0B ztOTo<^L)dC^ 6{vI^Fxh!6RJ88z%)CJlf^=!K&`hcJ{}PQ)1s#8?m=PlJ5JI z=2p1$-prGWJ ew}rV@9X^f*H(JT6$@Vx?6oD9&^agt57zy+;-w{we>m;re4Q&pA;vy z`!FQ;h$(4uwyWqxrj#oCWvW`4#bsV#bjY&os)*Cun82U#tM!(S01sO#A6ra9@bvwT z1 9euV|swB@rKR)uuT+~%kix>D@WOU2b$N-yV6`)A3$q)Ot~@ 1&0y)Y1 zJjaePdao{)Gx>kV^_&xb)S(&L;%mQL@-ct=1#gp4keQc%`UmzmU27efel*20o|I46 z^YymX5g$|L!qpExUzXdmCg+kX`@5D0zQXgGAF=&kdxXJ8dX2+<^MHTr*{iH4{yghq zZ0PWusoJ6ZKi^{R)5jPbpLg#NU(Nrf@u~FzxwPBaU#d4hj^$~vK2fnn?!&V<2L6JV z)&liQKQ8&-W5ah^T+>GU{O{M*;+OyL{w=)g|C}oRZPIhpx?@kgTe{^zx%QW1kCr#= zx^P=O{>RG&%s#)xFP^^dyzAxpdoJIV9P+ktew1Q(%yP|Un&sL$s~vF%1v;47xYkrz z2{`=z$9hmk<3ja??pqAm3I|ujUSN|qiTIQA;6RhF0junkTYoA94$WR`kpJKLA?MC( zP8+6vNH^DU{JChFv(S|f*|t|AS(7W8<;8NFRXLOdPo}x7H{F<^AG1hg{)WSvpd 3#CX`_n8LE&z%21u53eeHaaoh<-Wf4FROGDMO0zWI#K<`_q)-b@K88~a zUr_tm-c=ix2k<3z^DV8&18;)%kU1t|%E?d= L4QCWe?4CL;q_-las$lxO z`8qQv%ublQVEGE8S?P0DtebDpUlK2}e%n;J=DJDS_ty8e>}KTKceHTh;>`>-$IeE` zWpy&{Id?VEqkGG>+fD~=Ub*v7cjL79Gml{zc<)A{n^)VJLgsX zes}F@HoL%Fo~o(0L`+sNJT!0TUVU=Ha*i06Y+?JzJuh??+jq!xSL$pxTymoAAJcyY z15LrF2d3)G=1g(dS!P(o{PCuUXX7Jz&t+xzK1~Z)dSNzKLYi{L6>*dKn^jnHf1P4G z5$U#4>h^|`RoB9$cQDNg`KVx4=N!W5-W zH)<{S_KEgg@^$L M4CAN?cvpLgGeSEH&ylB!2$wxCUq^q{8F&)%SJa#dIvtLgrQ;FqRrssl?+$!&d z=?z{}=T6V@%39epOLdjHaEe#^%H<(k>MV1$HocfSx$4)cb^Gcrt@35w@L^Th-dmG$ zJdRfx% z!~K5GmuuPY_x^ac`u#q&HLu;7I3uc4*|&uyG{|%Pc>QiiVZ~B|E&TeMboR>|tU0t< zJ4B&ivY_^%1IK)m=A1Yva-5OzguhzDTX~+6Kkp7!Pg6A7#};98lvQPVOw(Dt1A-gQ z={)H<#A?Hw`{kmCI^IH4{wX6f8^fDVSLI?RH0;R@d&|g@GdtkR#mwWqPVB~)Ys>hV zIeND+m2KZ(zP};9(P)nx%e%u5pHv;#@xZG3!FN&SGq(Bn!ZhZseO$!Dr@t$L=R)59 z4Rg*LTJANRzi{Vr;rWIP&)(VT9eMd)?Opqupk;E$Uq$rAvAz#)igVleJxb1M-=WEl zd-m=NX0(~QYjxlHx3v%crM%qir+?_PJ p@$yv2X%Kj#DYe>`A0peeAR@`6@^;Gg5##vBZd7mVf!L@i(c zp0lz3ebZe5xeODIO%6>fq?y?S+gU$f 9^KFF~$?T|> pY o^y5>LJcC4dYf?w&8@UN*Uy&>(`=F zB&ED`JAFPsxO|5F=o-lrJpslOq!zkuutZ%Y#m8_OeN?i$s_W^Q&(8y3UF`st#TF_; z4Mm(1o&q}-f+pr0UkF%J5hH@z7eLVx}_r|I8i}!&JRI_UK(LsUMcCpLvksmQ2UwW$hEU zG0b_*X{2 @#}U_1JM|?VD|v z5-SRVj;;P;w@z!P$n!Inj`M@8f6aU8XcduP_w@3ox3f2JGxdAy5qbNh(=TK0JTGR8 z`|ct6_AUoz|NJ6-(0!xT{wu%#nF=dZKI7$JVP;cnQTQ+aQT2v!HJ_V@e4SEzW~B zu^fJF*%=y~?e<@uKkQIhmXO$KYtpeuPhs7TYn^&(K?yx3ZI_kg1=dw0_Z~bek;q`D zwkRo8uI2y(3!4h7GPkGD!Q>Y43l)wNH@ZkJtPGwen&K~dU{iwR` _|+R zwn14Ya+#*njM)wbYU=Tm7}IsK-#wZ#vs1v})EwK~nIa2jU70y${$zny&(yl~v^;0` z6*Z+TX_vV0LM80p)a4QrmYFaVv-wzgviiPjToD%gY|=`R`EiA>_}3e)>SpIr*|2EN zlw*~d>#9pu@vulO>w2_ow!wzgUaOy#>#RRx_WI4{3vSwPw_FL!Ui)9|NY}*NSqmp^ zc+0<3>Zfk+fmsa?cCat9e!~^0wqTu=){RrE_e^Z5UMu