From 195763d04c308ee8073ec96215f5143aa1a2dc00 Mon Sep 17 00:00:00 2001 From: ShawnCui Date: Sun, 24 Nov 2024 00:09:56 +0000 Subject: [PATCH 1/6] Initial commit --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..b6e14f1 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Scoder-FrontEnd \ No newline at end of file From d7290361502f637f0dbdd73f1dc176186ae48158 Mon Sep 17 00:00:00 2001 From: shawn Date: Thu, 16 Jan 2025 10:23:42 +0800 Subject: [PATCH 2/6] v1.0.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b6e14f1..8f5ed67 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# Scoder-FrontEnd \ No newline at end of file +# Scoder-FrontEnd From 09c0943f33256865a674f90d4bd5345e19f6fda1 Mon Sep 17 00:00:00 2001 From: shawn Date: Thu, 16 Jan 2025 10:24:07 +0800 Subject: [PATCH 3/6] v1.0.0 --- .idea/workspace.xml | 125 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 .idea/workspace.xml diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..b602581 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + { + "associatedIndex": 7 +} + + + + + + + + + + + + + + + + + + + + + + + 1736132139158 + + + + + + + + + + + + \ No newline at end of file From cfc1c4cd7b51ca2d9dbbe086fed4eb620f96ac04 Mon Sep 17 00:00:00 2001 From: shawn Date: Thu, 16 Jan 2025 10:10:19 +0800 Subject: [PATCH 4/6] v1.0.0 --- .idea/.gitignore | 5 + .idea/Scoder-App.iml | 12 + .idea/modules.xml | 8 + .idea/prettier.xml | 6 + .idea/uniappSupport.xml | 8 + .idea/watcherTasks.xml | 4 + App.vue | 63 + LICENSE | 201 +++ api/config.js | 82 + api/custom-request.js | 136 ++ api/index.js | 22 + api/modules/base.js | 23 + api/modules/message.js | 23 + api/modules/projects.js | 58 + api/modules/user.js | 35 + components/add-btn-fixed.vue | 100 ++ components/add-popup.vue | 72 + components/img-swiper.vue | 21 + components/navbar/navbar.vue | 34 + components/no-data.vue | 90 ++ components/popup-empty.vue | 42 + components/title-operate.vue | 90 ++ main.js | 57 + manifest.json | 125 ++ package.json | 14 + pages.json | 117 ++ pages/home/add-or-update-projects.vue | 186 +++ pages/home/add-or-update-team.vue | 401 +++++ pages/home/components/community-avatar.vue | 104 ++ pages/home/components/community-hot-nav.vue | 92 ++ pages/home/components/post-card.vue | 69 + pages/home/index.vue | 72 + pages/home/projects.vue | 119 ++ pages/home/team-detail.vue | 125 ++ pages/login/index.vue | 403 +++++ pages/message/direct-message.vue | 251 +++ pages/message/index.vue | 202 +++ pages/message/team-message.vue | 262 ++++ pages/my/change-password.vue | 50 + pages/my/index.vue | 81 + pages/my/my-projects.vue | 110 ++ pages/my/my-teams.vue | 114 ++ pages/my/profile.vue | 289 ++++ pages/my/static/add.png | Bin 0 -> 3078 bytes pages/my/static/community-active.png | Bin 0 -> 3481 bytes pages/my/static/community.png | Bin 0 -> 3599 bytes pages/my/static/discounts-bg.png | Bin 0 -> 5042 bytes pages/my/static/discounts-select.png | Bin 0 -> 1657 bytes pages/my/static/follow-active.png | Bin 0 -> 2655 bytes pages/my/static/follow.png | Bin 0 -> 2781 bytes pages/my/static/like-active.png | Bin 0 -> 1563 bytes pages/my/static/like.png | Bin 0 -> 1595 bytes pages/my/static/message-community-active.png | Bin 0 -> 2026 bytes pages/my/static/message-community.png | Bin 0 -> 2098 bytes pages/my/static/message-system-active.png | Bin 0 -> 1489 bytes pages/my/static/message-system.png | Bin 0 -> 1555 bytes pages/my/static/post-active.png | Bin 0 -> 2197 bytes pages/my/static/post.png | Bin 0 -> 2261 bytes pages/my/static/user-bg.png | Bin 0 -> 7763 bytes static/app/logo.png | Bin 0 -> 57963 bytes static/nodata/collection.png | Bin 0 -> 9221 bytes static/nodata/content.png | Bin 0 -> 9900 bytes static/nodata/fans.png | Bin 0 -> 9282 bytes static/nodata/network.png | Bin 0 -> 7797 bytes static/nodata/news.png | Bin 0 -> 9134 bytes static/nodata/order.png | Bin 0 -> 10139 bytes static/nodata/result.png | Bin 0 -> 9993 bytes static/operate/check.png | Bin 0 -> 777 bytes static/operate/checked.png | Bin 0 -> 867 bytes static/operate/copy-url.png | Bin 0 -> 3880 bytes static/operate/create-community.png | Bin 0 -> 3792 bytes static/operate/edit-community.png | Bin 0 -> 4424 bytes static/operate/publish-community.png | Bin 0 -> 3380 bytes static/operate/publish-post.png | Bin 0 -> 3396 bytes static/operate/remove-community.png | Bin 0 -> 3583 bytes static/operate/setting.png | Bin 0 -> 843 bytes static/operate/wechat-share.png | Bin 0 -> 4287 bytes static/tabbar/chat.png | Bin 0 -> 615 bytes static/tabbar/chat_active.png | Bin 0 -> 580 bytes static/tabbar/community.png | Bin 0 -> 2403 bytes static/tabbar/community_active.png | Bin 0 -> 1324 bytes static/tabbar/home.png | Bin 0 -> 1061 bytes static/tabbar/home_active.png | Bin 0 -> 693 bytes static/tabbar/mall.png | Bin 0 -> 1063 bytes static/tabbar/mall_active.png | Bin 0 -> 1240 bytes static/tabbar/user.png | Bin 0 -> 1359 bytes static/tabbar/user_active.png | Bin 0 -> 886 bytes store/index.js | 11 + store/modules/websocket.js | 135 ++ template.h5.html | 43 + theme.scss | 128 ++ uni.scss | 3 + utils/replace.js | 3 + utils/uniapp-api.js | 11 + uview-ui/LICENSE | 21 + uview-ui/README.md | 110 ++ .../u-action-sheet/u-action-sheet.vue | 192 +++ .../components/u-alert-tips/u-alert-tips.vue | 258 ++++ .../u-avatar-cropper/u-avatar-cropper.vue | 291 ++++ .../components/u-avatar-cropper/weCropper.js | 1266 +++++++++++++++ uview-ui/components/u-avatar/u-avatar.vue | 245 +++ uview-ui/components/u-back-top/u-back-top.vue | 153 ++ uview-ui/components/u-badge/u-badge.vue | 216 +++ uview-ui/components/u-button/u-button.vue | 668 ++++++++ uview-ui/components/u-calendar/u-calendar.vue | 649 ++++++++ .../u-car-keyboard/u-car-keyboard.vue | 258 ++++ uview-ui/components/u-card/u-card.vue | 301 ++++ .../components/u-cell-group/u-cell-group.vue | 70 + .../components/u-cell-item/u-cell-item.vue | 315 ++++ .../u-checkbox-group/u-checkbox-group.vue | 123 ++ uview-ui/components/u-checkbox/u-checkbox.vue | 285 ++++ .../u-circle-progress/u-circle-progress.vue | 221 +++ .../u-line-progress/u-line-progress.vue | 143 ++ uview-ui/components/u-col/u-col.vue | 156 ++ .../u-collapse-item/u-collapse-item.vue | 206 +++ uview-ui/components/u-collapse/u-collapse.vue | 97 ++ .../u-column-notice/u-column-notice.vue | 241 +++ .../components/u-count-down/u-count-down.vue | 318 ++++ uview-ui/components/u-count-to/u-count-to.vue | 241 +++ uview-ui/components/u-divider/u-divider.vue | 158 ++ .../u-dropdown-item/u-dropdown-item.vue | 133 ++ uview-ui/components/u-dropdown/u-dropdown.vue | 301 ++++ uview-ui/components/u-empty/u-empty.vue | 193 +++ uview-ui/components/u-field/u-field.vue | 392 +++++ .../components/u-form-item/u-form-item.vue | 436 ++++++ uview-ui/components/u-form/u-form.vue | 136 ++ .../u-full-screen/u-full-screen.vue | 53 + uview-ui/components/u-gap/u-gap.vue | 54 + .../components/u-grid-item/u-grid-item.vue | 127 ++ uview-ui/components/u-grid/u-grid.vue | 112 ++ uview-ui/components/u-icon/u-icon.vue | 336 ++++ uview-ui/components/u-image/u-image.vue | 267 ++++ .../u-index-anchor/u-index-anchor.vue | 89 ++ .../components/u-index-list/u-index-list.vue | 317 ++++ uview-ui/components/u-input/u-input.vue | 397 +++++ uview-ui/components/u-keyboard/u-keyboard.vue | 221 +++ .../components/u-lazy-load/u-lazy-load.vue | 247 +++ .../u-line-progress/u-line-progress.vue | 143 ++ uview-ui/components/u-line/u-line.vue | 84 + uview-ui/components/u-link/u-link.vue | 89 ++ .../u-loading-page/u-loading-page.vue | 19 + uview-ui/components/u-loading/u-loading.vue | 104 ++ uview-ui/components/u-loadmore/u-loadmore.vue | 206 +++ uview-ui/components/u-mask/u-mask.vue | 124 ++ .../u-message-input/u-message-input.vue | 316 ++++ uview-ui/components/u-modal/u-modal.vue | 286 ++++ uview-ui/components/u-navbar/u-navbar.vue | 318 ++++ .../components/u-no-network/u-no-network.vue | 234 +++ .../components/u-notice-bar/u-notice-bar.vue | 272 ++++ .../components/u-number-box/u-number-box.vue | 366 +++++ .../u-number-keyboard/u-number-keyboard.vue | 159 ++ .../components/u-parse/libs/CssHandler.js | 102 ++ .../components/u-parse/libs/MpHtmlParser.js | 581 +++++++ uview-ui/components/u-parse/libs/config.js | 80 + uview-ui/components/u-parse/libs/handler.wxs | 22 + uview-ui/components/u-parse/libs/trees.vue | 528 +++++++ uview-ui/components/u-parse/u-parse.vue | 648 ++++++++ uview-ui/components/u-picker/u-picker.vue | 683 +++++++++ uview-ui/components/u-popup/u-popup.vue | 458 ++++++ .../u-radio-group/u-radio-group.vue | 129 ++ uview-ui/components/u-radio/u-radio.vue | 272 ++++ uview-ui/components/u-rate/u-rate.vue | 275 ++++ .../components/u-read-more/u-read-more.vue | 179 +++ .../components/u-row-notice/u-row-notice.vue | 273 ++++ uview-ui/components/u-row/u-row.vue | 84 + uview-ui/components/u-search/u-search.vue | 357 +++++ uview-ui/components/u-section/u-section.vue | 154 ++ uview-ui/components/u-select/u-select.vue | 420 +++++ uview-ui/components/u-skeleton/u-skeleton.vue | 199 +++ uview-ui/components/u-slider/u-slider.vue | 257 ++++ uview-ui/components/u-steps/u-steps.vue | 200 +++ uview-ui/components/u-sticky/u-sticky.vue | 157 ++ .../components/u-subsection/u-subsection.vue | 356 +++++ .../u-swipe-action/u-swipe-action.vue | 257 ++++ uview-ui/components/u-swiper/u-swiper.vue | 347 +++++ uview-ui/components/u-switch/u-switch.vue | 162 ++ uview-ui/components/u-tabbar/u-tabbar.vue | 331 ++++ uview-ui/components/u-table/u-table.vue | 85 + .../u-tabs-swiper/u-tabs-swiper.vue | 491 ++++++ uview-ui/components/u-tabs/u-tabs.vue | 372 +++++ uview-ui/components/u-tag/u-tag.vue | 292 ++++ uview-ui/components/u-td/u-td.vue | 64 + uview-ui/components/u-th/u-th.vue | 62 + .../u-time-line-item/u-time-line-item.vue | 81 + .../components/u-time-line/u-time-line.vue | 41 + uview-ui/components/u-toast/u-toast.vue | 221 +++ uview-ui/components/u-top-tips/u-top-tips.vue | 122 ++ uview-ui/components/u-tr/u-tr.vue | 25 + uview-ui/components/u-upload/u-upload.vue | 672 ++++++++ .../u-verification-code.vue | 164 ++ .../components/u-waterfall/u-waterfall.vue | 188 +++ uview-ui/components/uview-v1/uview-v1.vue | 0 uview-ui/iconfont.css | 908 +++++++++++ uview-ui/index.js | 140 ++ uview-ui/index.scss | 23 + uview-ui/libs/config/config.js | 15 + uview-ui/libs/config/zIndex.js | 20 + uview-ui/libs/css/color.scss | 155 ++ uview-ui/libs/css/common.scss | 177 +++ uview-ui/libs/css/style.components.scss | 7 + uview-ui/libs/css/style.h5.scss | 8 + uview-ui/libs/css/style.mp.scss | 75 + uview-ui/libs/css/style.nvue.scss | 3 + uview-ui/libs/css/style.vue.scss | 185 +++ uview-ui/libs/function/$parent.js | 18 + uview-ui/libs/function/addUnit.js | 8 + uview-ui/libs/function/bem.js | 5 + uview-ui/libs/function/color.js | 37 + uview-ui/libs/function/colorGradient.js | 133 ++ uview-ui/libs/function/debounce.js | 29 + uview-ui/libs/function/deepClone.js | 23 + uview-ui/libs/function/deepMerge.js | 30 + uview-ui/libs/function/getParent.js | 47 + uview-ui/libs/function/guid.js | 41 + uview-ui/libs/function/md5.js | 382 +++++ uview-ui/libs/function/queryParams.js | 58 + uview-ui/libs/function/random.js | 10 + uview-ui/libs/function/randomArray.js | 7 + uview-ui/libs/function/route.js | 122 ++ uview-ui/libs/function/sys.js | 9 + uview-ui/libs/function/test.js | 232 +++ uview-ui/libs/function/throttle.js | 33 + uview-ui/libs/function/timeFormat.js | 53 + uview-ui/libs/function/timeFrom.js | 47 + uview-ui/libs/function/toast.js | 9 + uview-ui/libs/function/trim.js | 15 + uview-ui/libs/function/type2icon.js | 35 + uview-ui/libs/mixin/mixin.js | 63 + uview-ui/libs/mixin/mpShare.js | 18 + uview-ui/libs/request/index.js | 172 +++ uview-ui/libs/store/index.js | 19 + uview-ui/libs/util/area.js | 1 + uview-ui/libs/util/async-validator.js | 1362 +++++++++++++++++ uview-ui/libs/util/city.js | 1 + uview-ui/libs/util/emitter.js | 52 + uview-ui/libs/util/province.js | 1 + uview-ui/package.json | 39 + uview-ui/theme.scss | 48 + vue.config.js | 1 + 239 files changed, 33712 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/Scoder-App.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/prettier.xml create mode 100644 .idea/uniappSupport.xml create mode 100644 .idea/watcherTasks.xml create mode 100644 App.vue create mode 100644 LICENSE create mode 100644 api/config.js create mode 100644 api/custom-request.js create mode 100644 api/index.js create mode 100644 api/modules/base.js create mode 100644 api/modules/message.js create mode 100644 api/modules/projects.js create mode 100644 api/modules/user.js create mode 100644 components/add-btn-fixed.vue create mode 100644 components/add-popup.vue create mode 100644 components/img-swiper.vue create mode 100644 components/navbar/navbar.vue create mode 100644 components/no-data.vue create mode 100644 components/popup-empty.vue create mode 100644 components/title-operate.vue create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/home/add-or-update-projects.vue create mode 100644 pages/home/add-or-update-team.vue create mode 100644 pages/home/components/community-avatar.vue create mode 100644 pages/home/components/community-hot-nav.vue create mode 100644 pages/home/components/post-card.vue create mode 100644 pages/home/index.vue create mode 100644 pages/home/projects.vue create mode 100644 pages/home/team-detail.vue create mode 100644 pages/login/index.vue create mode 100644 pages/message/direct-message.vue create mode 100644 pages/message/index.vue create mode 100644 pages/message/team-message.vue create mode 100644 pages/my/change-password.vue create mode 100644 pages/my/index.vue create mode 100644 pages/my/my-projects.vue create mode 100644 pages/my/my-teams.vue create mode 100644 pages/my/profile.vue create mode 100644 pages/my/static/add.png create mode 100644 pages/my/static/community-active.png create mode 100644 pages/my/static/community.png create mode 100644 pages/my/static/discounts-bg.png create mode 100644 pages/my/static/discounts-select.png create mode 100644 pages/my/static/follow-active.png create mode 100644 pages/my/static/follow.png create mode 100644 pages/my/static/like-active.png create mode 100644 pages/my/static/like.png create mode 100644 pages/my/static/message-community-active.png create mode 100644 pages/my/static/message-community.png create mode 100644 pages/my/static/message-system-active.png create mode 100644 pages/my/static/message-system.png create mode 100644 pages/my/static/post-active.png create mode 100644 pages/my/static/post.png create mode 100644 pages/my/static/user-bg.png create mode 100644 static/app/logo.png create mode 100644 static/nodata/collection.png create mode 100644 static/nodata/content.png create mode 100644 static/nodata/fans.png create mode 100644 static/nodata/network.png create mode 100644 static/nodata/news.png create mode 100644 static/nodata/order.png create mode 100644 static/nodata/result.png create mode 100644 static/operate/check.png create mode 100644 static/operate/checked.png create mode 100644 static/operate/copy-url.png create mode 100644 static/operate/create-community.png create mode 100644 static/operate/edit-community.png create mode 100644 static/operate/publish-community.png create mode 100644 static/operate/publish-post.png create mode 100644 static/operate/remove-community.png create mode 100644 static/operate/setting.png create mode 100644 static/operate/wechat-share.png create mode 100644 static/tabbar/chat.png create mode 100644 static/tabbar/chat_active.png create mode 100644 static/tabbar/community.png create mode 100644 static/tabbar/community_active.png create mode 100644 static/tabbar/home.png create mode 100644 static/tabbar/home_active.png create mode 100644 static/tabbar/mall.png create mode 100644 static/tabbar/mall_active.png create mode 100644 static/tabbar/user.png create mode 100644 static/tabbar/user_active.png create mode 100644 store/index.js create mode 100644 store/modules/websocket.js create mode 100644 template.h5.html create mode 100644 theme.scss create mode 100644 uni.scss create mode 100644 utils/replace.js create mode 100644 utils/uniapp-api.js create mode 100644 uview-ui/LICENSE create mode 100644 uview-ui/README.md create mode 100644 uview-ui/components/u-action-sheet/u-action-sheet.vue create mode 100644 uview-ui/components/u-alert-tips/u-alert-tips.vue create mode 100644 uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue create mode 100644 uview-ui/components/u-avatar-cropper/weCropper.js create mode 100644 uview-ui/components/u-avatar/u-avatar.vue create mode 100644 uview-ui/components/u-back-top/u-back-top.vue create mode 100644 uview-ui/components/u-badge/u-badge.vue create mode 100644 uview-ui/components/u-button/u-button.vue create mode 100644 uview-ui/components/u-calendar/u-calendar.vue create mode 100644 uview-ui/components/u-car-keyboard/u-car-keyboard.vue create mode 100644 uview-ui/components/u-card/u-card.vue create mode 100644 uview-ui/components/u-cell-group/u-cell-group.vue create mode 100644 uview-ui/components/u-cell-item/u-cell-item.vue create mode 100644 uview-ui/components/u-checkbox-group/u-checkbox-group.vue create mode 100644 uview-ui/components/u-checkbox/u-checkbox.vue create mode 100644 uview-ui/components/u-circle-progress/u-circle-progress.vue create mode 100644 uview-ui/components/u-circle-progress/u-line-progress/u-line-progress.vue create mode 100644 uview-ui/components/u-col/u-col.vue create mode 100644 uview-ui/components/u-collapse-item/u-collapse-item.vue create mode 100644 uview-ui/components/u-collapse/u-collapse.vue create mode 100644 uview-ui/components/u-column-notice/u-column-notice.vue create mode 100644 uview-ui/components/u-count-down/u-count-down.vue create mode 100644 uview-ui/components/u-count-to/u-count-to.vue create mode 100644 uview-ui/components/u-divider/u-divider.vue create mode 100644 uview-ui/components/u-dropdown-item/u-dropdown-item.vue create mode 100644 uview-ui/components/u-dropdown/u-dropdown.vue create mode 100644 uview-ui/components/u-empty/u-empty.vue create mode 100644 uview-ui/components/u-field/u-field.vue create mode 100644 uview-ui/components/u-form-item/u-form-item.vue create mode 100644 uview-ui/components/u-form/u-form.vue create mode 100644 uview-ui/components/u-full-screen/u-full-screen.vue create mode 100644 uview-ui/components/u-gap/u-gap.vue create mode 100644 uview-ui/components/u-grid-item/u-grid-item.vue create mode 100644 uview-ui/components/u-grid/u-grid.vue create mode 100644 uview-ui/components/u-icon/u-icon.vue create mode 100644 uview-ui/components/u-image/u-image.vue create mode 100644 uview-ui/components/u-index-anchor/u-index-anchor.vue create mode 100644 uview-ui/components/u-index-list/u-index-list.vue create mode 100644 uview-ui/components/u-input/u-input.vue create mode 100644 uview-ui/components/u-keyboard/u-keyboard.vue create mode 100644 uview-ui/components/u-lazy-load/u-lazy-load.vue create mode 100644 uview-ui/components/u-line-progress/u-line-progress.vue create mode 100644 uview-ui/components/u-line/u-line.vue create mode 100644 uview-ui/components/u-link/u-link.vue create mode 100644 uview-ui/components/u-loading-page/u-loading-page.vue create mode 100644 uview-ui/components/u-loading/u-loading.vue create mode 100644 uview-ui/components/u-loadmore/u-loadmore.vue create mode 100644 uview-ui/components/u-mask/u-mask.vue create mode 100644 uview-ui/components/u-message-input/u-message-input.vue create mode 100644 uview-ui/components/u-modal/u-modal.vue create mode 100644 uview-ui/components/u-navbar/u-navbar.vue create mode 100644 uview-ui/components/u-no-network/u-no-network.vue create mode 100644 uview-ui/components/u-notice-bar/u-notice-bar.vue create mode 100644 uview-ui/components/u-number-box/u-number-box.vue create mode 100644 uview-ui/components/u-number-keyboard/u-number-keyboard.vue create mode 100644 uview-ui/components/u-parse/libs/CssHandler.js create mode 100644 uview-ui/components/u-parse/libs/MpHtmlParser.js create mode 100644 uview-ui/components/u-parse/libs/config.js create mode 100644 uview-ui/components/u-parse/libs/handler.wxs create mode 100644 uview-ui/components/u-parse/libs/trees.vue create mode 100644 uview-ui/components/u-parse/u-parse.vue create mode 100644 uview-ui/components/u-picker/u-picker.vue create mode 100644 uview-ui/components/u-popup/u-popup.vue create mode 100644 uview-ui/components/u-radio-group/u-radio-group.vue create mode 100644 uview-ui/components/u-radio/u-radio.vue create mode 100644 uview-ui/components/u-rate/u-rate.vue create mode 100644 uview-ui/components/u-read-more/u-read-more.vue create mode 100644 uview-ui/components/u-row-notice/u-row-notice.vue create mode 100644 uview-ui/components/u-row/u-row.vue create mode 100644 uview-ui/components/u-search/u-search.vue create mode 100644 uview-ui/components/u-section/u-section.vue create mode 100644 uview-ui/components/u-select/u-select.vue create mode 100644 uview-ui/components/u-skeleton/u-skeleton.vue create mode 100644 uview-ui/components/u-slider/u-slider.vue create mode 100644 uview-ui/components/u-steps/u-steps.vue create mode 100644 uview-ui/components/u-sticky/u-sticky.vue create mode 100644 uview-ui/components/u-subsection/u-subsection.vue create mode 100644 uview-ui/components/u-swipe-action/u-swipe-action.vue create mode 100644 uview-ui/components/u-swiper/u-swiper.vue create mode 100644 uview-ui/components/u-switch/u-switch.vue create mode 100644 uview-ui/components/u-tabbar/u-tabbar.vue create mode 100644 uview-ui/components/u-table/u-table.vue create mode 100644 uview-ui/components/u-tabs-swiper/u-tabs-swiper.vue create mode 100644 uview-ui/components/u-tabs/u-tabs.vue create mode 100644 uview-ui/components/u-tag/u-tag.vue create mode 100644 uview-ui/components/u-td/u-td.vue create mode 100644 uview-ui/components/u-th/u-th.vue create mode 100644 uview-ui/components/u-time-line-item/u-time-line-item.vue create mode 100644 uview-ui/components/u-time-line/u-time-line.vue create mode 100644 uview-ui/components/u-toast/u-toast.vue create mode 100644 uview-ui/components/u-top-tips/u-top-tips.vue create mode 100644 uview-ui/components/u-tr/u-tr.vue create mode 100644 uview-ui/components/u-upload/u-upload.vue create mode 100644 uview-ui/components/u-verification-code/u-verification-code.vue create mode 100644 uview-ui/components/u-waterfall/u-waterfall.vue create mode 100644 uview-ui/components/uview-v1/uview-v1.vue create mode 100644 uview-ui/iconfont.css create mode 100644 uview-ui/index.js create mode 100644 uview-ui/index.scss create mode 100644 uview-ui/libs/config/config.js create mode 100644 uview-ui/libs/config/zIndex.js create mode 100644 uview-ui/libs/css/color.scss create mode 100644 uview-ui/libs/css/common.scss create mode 100644 uview-ui/libs/css/style.components.scss create mode 100644 uview-ui/libs/css/style.h5.scss create mode 100644 uview-ui/libs/css/style.mp.scss create mode 100644 uview-ui/libs/css/style.nvue.scss create mode 100644 uview-ui/libs/css/style.vue.scss create mode 100644 uview-ui/libs/function/$parent.js create mode 100644 uview-ui/libs/function/addUnit.js create mode 100644 uview-ui/libs/function/bem.js create mode 100644 uview-ui/libs/function/color.js create mode 100644 uview-ui/libs/function/colorGradient.js create mode 100644 uview-ui/libs/function/debounce.js create mode 100644 uview-ui/libs/function/deepClone.js create mode 100644 uview-ui/libs/function/deepMerge.js create mode 100644 uview-ui/libs/function/getParent.js create mode 100644 uview-ui/libs/function/guid.js create mode 100644 uview-ui/libs/function/md5.js create mode 100644 uview-ui/libs/function/queryParams.js create mode 100644 uview-ui/libs/function/random.js create mode 100644 uview-ui/libs/function/randomArray.js create mode 100644 uview-ui/libs/function/route.js create mode 100644 uview-ui/libs/function/sys.js create mode 100644 uview-ui/libs/function/test.js create mode 100644 uview-ui/libs/function/throttle.js create mode 100644 uview-ui/libs/function/timeFormat.js create mode 100644 uview-ui/libs/function/timeFrom.js create mode 100644 uview-ui/libs/function/toast.js create mode 100644 uview-ui/libs/function/trim.js create mode 100644 uview-ui/libs/function/type2icon.js create mode 100644 uview-ui/libs/mixin/mixin.js create mode 100644 uview-ui/libs/mixin/mpShare.js create mode 100644 uview-ui/libs/request/index.js create mode 100644 uview-ui/libs/store/index.js create mode 100644 uview-ui/libs/util/area.js create mode 100644 uview-ui/libs/util/async-validator.js create mode 100644 uview-ui/libs/util/city.js create mode 100644 uview-ui/libs/util/emitter.js create mode 100644 uview-ui/libs/util/province.js create mode 100644 uview-ui/package.json create mode 100644 uview-ui/theme.scss create mode 100644 vue.config.js diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..10b731c --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ diff --git a/.idea/Scoder-App.iml b/.idea/Scoder-App.iml new file mode 100644 index 0000000..24643cc --- /dev/null +++ b/.idea/Scoder-App.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..3366c6e --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/prettier.xml b/.idea/prettier.xml new file mode 100644 index 0000000..b0c1c68 --- /dev/null +++ b/.idea/prettier.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/uniappSupport.xml b/.idea/uniappSupport.xml new file mode 100644 index 0000000..dad36bf --- /dev/null +++ b/.idea/uniappSupport.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml new file mode 100644 index 0000000..fb0d65a --- /dev/null +++ b/.idea/watcherTasks.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..c4ceb35 --- /dev/null +++ b/App.vue @@ -0,0 +1,63 @@ + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..551653a --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022-PRESENT Kaivan Wong + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/api/config.js b/api/config.js new file mode 100644 index 0000000..ac386e6 --- /dev/null +++ b/api/config.js @@ -0,0 +1,82 @@ +export const HTTP_URL_DEV = 'http://127.0.0.1:8080'; +export const HTTP_URL_PROD = 'http://127.0.0.1:8080'; + +export const HTTP_URL_DEV_PREFIX = ''; +export const HTTP_URL_PROD_PREFIX = ''; + +// uView UI HTTP Configuration +export const UVIEWUI_HTTP_CONFIG = { + baseUrl: process.env.NODE_ENV === 'development' + ? HTTP_URL_DEV + HTTP_URL_DEV_PREFIX + : HTTP_URL_PROD + HTTP_URL_PROD_PREFIX, + method: 'GET', // Default request method + dataType: 'json', // Expected response data type + showLoading: true, // Show loading indicator during requests + loadingText: 'Loading...', // Text displayed during loading + loadingTime: 800, // Delay before showing loading spinner (ms) + originalData: true, // Return raw server response (required for custom handling) + loadingMask: true, // Prevent touch interactions while loading + header: { + 'Content-Type': 'application/json;charset=UTF-8', // Default headers + }, +}; + +// Request Interceptor +export const httpRequest = (config) => { + const token = uni.getStorageSync('token'); // Retrieve token from storage + config.header = { + ...config.header, // Preserve existing headers + Authorization: token ? `Bearer ${token}` : '', // Add token if available + }; + return config; // Return modified config +}; + +// Response Interceptor +export const httpResponse = (res) => { + if (!res || !res.data) { + // Handle case where response is invalid + uni.showToast({ + title: 'Invalid response from server.', + icon: 'none', + }); + throw new Error('Invalid response'); + } + + const {statusCode, data} = res; + + // Check HTTP status codes + if (statusCode === 200) { + return data; // Return the response data directly + } else if (statusCode === 401) { + // Handle unauthorized errors + uni.showToast({ + title: 'Unauthorized. Please log in again.', + icon: 'none', + }); + uni.redirectTo({ + url: '/pages/login/index', // Redirect to login page + }); + throw new Error('Unauthorized'); + } else if (statusCode === 500) { + // Handle server errors + uni.showToast({ + title: 'Server error. Please contact support.', + icon: 'none', + }); + throw new Error('Server error'); + } else { + // Handle other status codes + uni.showToast({ + title: `Error: ${data?.msg || 'Unknown error'}`, + icon: 'none', + }); + throw new Error(data?.msg || 'Unknown error'); + } +}; + +// Install HTTP Configuration +export const installHttpConfig = (Vue, vm) => { + Vue.prototype.$u.http.setConfig(UVIEWUI_HTTP_CONFIG); // Set base config + Vue.prototype.$u.http.interceptor.request = httpRequest; // Attach request interceptor + Vue.prototype.$u.http.interceptor.response = httpResponse; // Attach response interceptor +}; diff --git a/api/custom-request.js b/api/custom-request.js new file mode 100644 index 0000000..692f7fe --- /dev/null +++ b/api/custom-request.js @@ -0,0 +1,136 @@ +// API base URL (can be set as needed) +export const VUE_APP_API_URL = ''; + +// General HTTP request function +export const httpRequest = (opts, data) => { + let httpDefaultOpts = { + url: baseUrl + opts.url, // Construct request URL + data: data, // Request data + method: opts.method, // HTTP method + header: opts.method === 'GET' ? { + 'X-Requested-With': 'XMLHttpRequest', + "Accept": "application/json", + "Content-Type": "application/json; charset=UTF-8" + } : { + 'X-Requested-With': 'XMLHttpRequest', + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + }, // Headers based on HTTP method + dataType: 'json', // Expected response data type + }; + let promise = new Promise(function (resolve, reject) { + uni.request(httpDefaultOpts).then( + (res) => { + resolve(res[1]); // Resolve with response + } + ).catch( + (response) => { + reject(response); // Reject on error + } + ); + }); + return promise; // Return a promise +}; + +// File upload request function +export const httpRequestUploadFile = (opts, filePath, data) => { + let token = ''; + uni.getStorage({ + key: 'token', + success: function (ress) { + token = ress.data; // Retrieve token from local storage + } + }); + let httpDefaultOpts = { + url: baseUrl + opts.url, // Construct upload URL + header: { + token: token, // Include token in headers + }, + name: 'file', // File field name + filePath: filePath, // Path to the file + formData: data, // Additional form data + }; + let promise = new Promise(function (resolve, reject) { + uni.uploadFile(httpDefaultOpts).then( + (res) => { + resolve(res[1]); // Resolve with response + } + ).catch( + (response) => { + reject(response); // Reject on error + } + ); + }); + return promise; // Return a promise +}; + +// HTTP request with token included +export const httpTokenRequest = (opts, data) => { + let token = ''; + uni.getStorage({ + key: 'token', + success: function (ress) { + token = ress.data; // Retrieve token from local storage + } + }); + // Test token (remove in production) + token = 'dd0847da213958adf77e88a2cfb661e5'; + // The token is stored in local storage after a successful login + let httpDefaultOpts = { + url: baseUrl + opts.url, // Construct request URL + data: data, // Request data + method: opts.method, // HTTP method + header: opts.method === 'GET' ? { + 'Token': token, // Include token in headers for GET requests + 'X-Requested-With': 'XMLHttpRequest', + "Accept": "application/json", + "Content-Type": "application/json; charset=UTF-8" + } : { + 'Token': token, // Include token in headers for other requests + 'X-Requested-With': 'XMLHttpRequest', + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + }, + dataType: 'json', // Expected response data type + }; + let promise = new Promise(function (resolve, reject) { + uni.request(httpDefaultOpts).then( + (res) => { + resolve(res[1]); // Resolve with response + } + ).catch( + (response) => { + reject(response); // Reject on error + } + ); + }); + return promise; // Return a promise +}; + +// Custom HTTP request function +export const httpCustomeRequest = (opts, data) => { + let httpDefaultOpts = { + url: opts.url, // Custom request URL + data: data, // Request data + method: opts.method, // HTTP method + header: opts.method === 'GET' ? { + 'X-Requested-With': 'XMLHttpRequest', + "Accept": "application/json", + "Content-Type": "application/json; charset=UTF-8" + } : { + 'X-Requested-With': 'XMLHttpRequest', + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + }, // Headers based on HTTP method + dataType: 'json', // Expected response data type + }; + let promise = new Promise(function (resolve, reject) { + uni.request(httpDefaultOpts).then( + (res) => { + resolve(res[1]); // Resolve with response + } + ).catch( + (response) => { + reject(response); // Reject on error + } + ); + }); + return promise; // Return a promise +}; diff --git a/api/index.js b/api/index.js new file mode 100644 index 0000000..ea39b61 --- /dev/null +++ b/api/index.js @@ -0,0 +1,22 @@ +// Import user-related API functions +import {useUserApi} from './modules/user.js'; + +// Import project-related API functions +import {useProjectsApi} from './modules/projects.js'; + +// Import base/general API functions +import {useBaseApi} from './modules/base.js'; + +// Import messaging-related API functions +import {useMessageApi} from './modules/message.js'; + +// Function to install and register API modules into the Vue instance +export const installApiModules = (Vue, vm) => { + // Merge all API modules into a single object and assign it to $u.api + vm.$u.api = Object.assign( + useProjectsApi(Vue, vm), // Add project APIs + useUserApi(Vue, vm), // Add user APIs + useBaseApi(Vue, vm), // Add base APIs + useMessageApi(Vue, vm) // Add message APIs + ); +}; diff --git a/api/modules/base.js b/api/modules/base.js new file mode 100644 index 0000000..051c198 --- /dev/null +++ b/api/modules/base.js @@ -0,0 +1,23 @@ +export const useBaseApi = (Vue, vm) => { + return { + // Uploads the user's avatar to the server + async uploadAvatar(data) { + return await vm.$u.http.post('/file/upload', data); + }, + + // Fetches the dictionary data for team skills + async getSkillDictData() { + return await vm.$u.http.get('/user/dict/team_skills'); + }, + + // Fetches the dictionary data for team goals + async getGoalDictData() { + return await vm.$u.http.get('/user/dict/team_goals'); + }, + + // Fetches the dictionary data for team experience + async getExperienceDictData() { + return await vm.$u.http.get('/user/dict/team_experience'); + }, + } +} diff --git a/api/modules/message.js b/api/modules/message.js new file mode 100644 index 0000000..f1d9117 --- /dev/null +++ b/api/modules/message.js @@ -0,0 +1,23 @@ +export const useMessageApi = (Vue, vm) => { + return { + // Fetches the list of direct chats for a specific user + async getDirectChatList(userId) { + return await vm.$u.http.get('im/getDirectChatList/' + userId); + }, + + // Fetches the list of team chats for a specific user + async getTeamChatList(userId) { + return await vm.$u.http.get('im/getTeamChatList/' + userId); + }, + + // Fetches the chat history between a user and a specific receiver + async getDirectChatHistory(userId, receiverId) { + return await vm.$u.http.get('im/getDirectChatHistory/' + userId + '/' + receiverId); + }, + + // Fetches the chat history for a specific team + async getTeamChatHistory(teamId) { + return await vm.$u.http.get('im/getTeamChatHistory/' + teamId); + }, + } +} diff --git a/api/modules/projects.js b/api/modules/projects.js new file mode 100644 index 0000000..74ad556 --- /dev/null +++ b/api/modules/projects.js @@ -0,0 +1,58 @@ +export const useProjectsApi = (Vue, vm) => { + return { + // Fetches the list of all projects + async getProjectList() { + return await vm.$u.http.get('/projects/getProjectList'); + }, + + // Fetches details of a specific project by its ID + async getProjectById(projectId) { + return await vm.$u.http.get('/projects/' + projectId); + }, + + // Fetches the list of teams associated with a specific project + async getTeamsByProjectId(projectId) { + return await vm.$u.http.get('/projects/team/project/' + projectId); + }, + + // Fetches the list of teams a specific user is part of, within a project + async getTeamListByUser(projectId, userId) { + return await vm.$u.http.get('/projects/team/getTeamListByUser?projectId=' + projectId + '&userId=' + userId); + }, + + // Adds a new project with the provided data + async addProject(data) { + return await vm.$u.http.post('/projects', data); + }, + + // Adds a new team with the provided form data + async addTeam(form) { + return await vm.$u.http.post('projects/team', form); + }, + + // Updates an existing team with the provided form data + async updateTeam(form) { + return await vm.$u.http.put('/projects/team/', form); + }, + + // Allows a user to join a specific team by team ID + async joinTeam(teamId) { + return await vm.$u.http.post('/projects/team/' + teamId + '/join'); + }, + + // Fetches details of a specific team by its ID + async getTeamById(teamId) { + return await vm.$u.http.get('projects/team/' + teamId); + }, + + // Fetches the list of projects the current user is part of + async getMyProjectList() { + return await vm.$u.http.get('projects/getMyProjectList'); + }, + + // Fetches the list of teams the current user is part of + async getMyTeamList() { + return await vm.$u.http.get('projects/team/getMyTeamList'); + }, + } +} diff --git a/api/modules/user.js b/api/modules/user.js new file mode 100644 index 0000000..6638a51 --- /dev/null +++ b/api/modules/user.js @@ -0,0 +1,35 @@ +export const useUserApi = (Vue, vm) => { + return { + // Logs in a user with the provided credentials + async login(data) { + return await vm.$u.http.post('/auth/login', data); + }, + + // Registers a new user with the provided data + async register(data) { + return await vm.$u.http.post('/auth/register', data); + }, + + // Retrieves the user's details using the current token + async getUserByToken() { + return await vm.$u.http.get('/user/getUserByToken'); + }, + + // Fetches details of a user by their ID + async getUserById(userId) { + return await vm.$u.http.get('user/' + userId); + }, + + // Updates the profile of the current user + async updateProfile(user) { + return await vm.$u.http.put('user/updateProfile', user); + }, + + // Resets the user's password with the old and new passwords provided + async resetPwd(oldPassword, newPassword) { + return await vm.$u.http.put( + 'user/resetPwd?oldPassword=' + oldPassword + '&&newPassword=' + newPassword + ); + }, + }; +}; diff --git a/components/add-btn-fixed.vue b/components/add-btn-fixed.vue new file mode 100644 index 0000000..a7affb2 --- /dev/null +++ b/components/add-btn-fixed.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/components/add-popup.vue b/components/add-popup.vue new file mode 100644 index 0000000..ef90713 --- /dev/null +++ b/components/add-popup.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/components/img-swiper.vue b/components/img-swiper.vue new file mode 100644 index 0000000..8339536 --- /dev/null +++ b/components/img-swiper.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/components/navbar/navbar.vue b/components/navbar/navbar.vue new file mode 100644 index 0000000..8b61e09 --- /dev/null +++ b/components/navbar/navbar.vue @@ -0,0 +1,34 @@ + + + diff --git a/components/no-data.vue b/components/no-data.vue new file mode 100644 index 0000000..9ffbeb4 --- /dev/null +++ b/components/no-data.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/components/popup-empty.vue b/components/popup-empty.vue new file mode 100644 index 0000000..51917f3 --- /dev/null +++ b/components/popup-empty.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/components/title-operate.vue b/components/title-operate.vue new file mode 100644 index 0000000..6ca30f4 --- /dev/null +++ b/components/title-operate.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..8dfede8 --- /dev/null +++ b/main.js @@ -0,0 +1,57 @@ +import Vue from 'vue'; +import App from './App'; + +// Import uView UI library globally +import uView from 'uview-ui'; + +// Import global components +import Navbar from '@/components/navbar/navbar.vue'; // Navbar component +import NoData from '@/components/no-data.vue'; // NoData placeholder component + +// Import global theme variables +import appTheme from '@/theme.scss'; + +// Import global utility functions +import {replaceSale} from '@/utils/replace.js'; // Utility to handle sale replacements +import {copyByUniappApi} from '@/utils/uniapp-api.js'; // Utility to handle clipboard operations + +// Import Vuex store for state management +import store from './store/index.js'; + +// Import HTTP configuration based on uView UI +import {installHttpConfig} from '@/api/config.js'; + +// Import global API modules +import {installApiModules} from '@/api'; + +Vue.config.productionTip = false; // Disable production tip in console + +App.mpType = 'app'; // Specify the type of the Vue instance as an app + +// Register uView UI globally +Vue.use(uView); + +// Register global components +Vue.component('Navbar', Navbar); // Register Navbar as a global component +Vue.component('NoData', NoData); // Register NoData as a global component + +// Add global variables and functions to Vue's prototype +Vue.prototype.$appTheme = appTheme; // Add global theme variables +Vue.prototype.$replaceSale = replaceSale; // Add sale replacement utility +Vue.prototype.$copyByUniappApi = copyByUniappApi; // Add clipboard utility +Vue.prototype.$store = store; // Add Vuex store instance + +// Create Vue instance +const app = new Vue({ + ...store, // Include Vuex store in the instance + ...App, // Include the main app component +}); + +// Register HTTP configuration after creating the Vue instance +Vue.use(installHttpConfig, app); + +// Register API modules globally +Vue.use(installApiModules, app); + +// Mount the Vue instance to the DOM +app.$mount(); diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..e7f1c7f --- /dev/null +++ b/manifest.json @@ -0,0 +1,125 @@ +{ + "name": "scoder", + "appid": "com.scoder.app", + "description": "scoder", + "versionName": "1.0.0", + "versionCode": "100", + "transformPx": false, + "app-plus": { + "optimization": { + "subPackages": true + }, + "safearea": { + "bottom": { + "offset": "none" + } + }, + "splashscreen": { + "alwaysShowBeforeRender": true, + "waiting": true, + "autoclose": true, + "delay": 0 + }, + "usingComponents": true, + "nvueCompiler": "uni-app", + "compilerVersion": 3, + "modules": {}, + "distribute": { + "android": { + "permissions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "abiFilters": [ + "armeabi-v7a", + "arm64-v8a" + ] + }, + "ios": {}, + "sdkConfigs": { + "ad": {} + }, + "icons": { + "android": { + "hdpi": "unpackage/res/icons/72x72.png", + "xhdpi": "unpackage/res/icons/96x96.png", + "xxhdpi": "unpackage/res/icons/144x144.png", + "xxxhdpi": "unpackage/res/icons/192x192.png" + }, + "ios": { + "appstore": "unpackage/res/icons/1024x1024.png", + "ipad": { + "app": "unpackage/res/icons/76x76.png", + "app@2x": "unpackage/res/icons/152x152.png", + "notification": "unpackage/res/icons/20x20.png", + "notification@2x": "unpackage/res/icons/40x40.png", + "proapp@2x": "unpackage/res/icons/167x167.png", + "settings": "unpackage/res/icons/29x29.png", + "settings@2x": "unpackage/res/icons/58x58.png", + "spotlight": "unpackage/res/icons/40x40.png", + "spotlight@2x": "unpackage/res/icons/80x80.png" + }, + "iphone": { + "app@2x": "unpackage/res/icons/120x120.png", + "app@3x": "unpackage/res/icons/180x180.png", + "notification@2x": "unpackage/res/icons/40x40.png", + "notification@3x": "unpackage/res/icons/60x60.png", + "settings@2x": "unpackage/res/icons/58x58.png", + "settings@3x": "unpackage/res/icons/87x87.png", + "spotlight@2x": "unpackage/res/icons/80x80.png", + "spotlight@3x": "unpackage/res/icons/120x120.png" + } + } + } + } + }, + "quickapp": {}, + "mp-qq": { + "optimization": { + "subPackages": true + }, + "appid": "15646153" + }, + "mp-baidu": { + "usingComponents": true, + "appid": "" + }, + "mp-toutiao": { + "usingComponents": true, + "appid": "" + }, + "h5": { + "template": "template.h5.html", + "router": { + "mode": "hash", + "base": "" + }, + "optimization": { + "treeShaking": { + "enable": false + } + }, + "title": "scoder" + }, + "vueVersion": "2" +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..647edd0 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "Scoder", + "version": "1.0", + "description": "Scoder", + "main": "main.js", + "id": "nx-temp-shop", + "displayName": "Scoder", + "keywords": [ + ], + "dcloudext": { + "category": [ + ] + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..2166eeb --- /dev/null +++ b/pages.json @@ -0,0 +1,117 @@ +{ + "easycom": { + // Automatically map and register uView UI components + "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue" + }, + "pages": [ + // Define the pages included in the app + { + "path": "pages/login/index" + // Login page + }, + { + "path": "pages/home/index" + // Home page + }, + { + "path": "pages/home/projects" + // Projects page + }, + { + "path": "pages/home/team-detail" + // Team detail page + }, + { + "path": "pages/home/add-or-update-team" + // Add or update team page + }, + { + "path": "pages/home/add-or-update-projects" + // Add or update projects page + }, + { + "path": "pages/message/index" + // Message page (main) + }, + { + "path": "pages/message/direct-message" + // Direct message page + }, + { + "path": "pages/message/team-message" + // Team message page + }, + { + "path": "pages/my/index" + // My profile (main) page + }, + { + "path": "pages/my/profile" + // Edit profile page + }, + { + "path": "pages/my/change-password" + // Change password page + }, + { + "path": "pages/my/my-projects" + // My projects page + }, + { + "path": "pages/my/my-teams" + // My teams page + } + ], + "preloadRule": { + // Define preload rules for faster navigation between pages (optional, currently empty) + }, + "globalStyle": { + // Customize global navigation bar appearance + "navigationStyle": "custom", + // Use custom navigation style + "navigationBarTextStyle": "black" + // Set navigation bar text color to black + }, + "tabBar": { + // Define the bottom tab bar configuration + "color": "#8F92A1", + // Default color for unselected tab items + "selectedColor": "#171717", + // Color for the selected tab item + "list": [ + { + "text": "Home", + // Tab label + "pagePath": "pages/home/index", + // Page path for this tab + "iconPath": "./static/tabbar/home.png", + // Icon for unselected state + "selectedIconPath": "./static/tabbar/home_active.png" + // Icon for selected state + }, + { + "text": "Message", + // Tab label + "pagePath": "pages/message/index", + // Page path for this tab + "iconPath": "./static/tabbar/chat.png", + // Icon for unselected state + "selectedIconPath": "./static/tabbar/chat_active.png" + // Icon for selected state + }, + { + "text": "My", + // Tab label + "pagePath": "pages/my/index", + // Page path for this tab + "iconPath": "./static/tabbar/user.png", + // Icon for unselected state + "selectedIconPath": "./static/tabbar/user_active.png" + // Icon for selected state + } + ] + }, + "condition": { + // Define condition-based settings (optional, currently empty) + } +} diff --git a/pages/home/add-or-update-projects.vue b/pages/home/add-or-update-projects.vue new file mode 100644 index 0000000..78b4009 --- /dev/null +++ b/pages/home/add-or-update-projects.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/pages/home/add-or-update-team.vue b/pages/home/add-or-update-team.vue new file mode 100644 index 0000000..8f99faf --- /dev/null +++ b/pages/home/add-or-update-team.vue @@ -0,0 +1,401 @@ + + + + + diff --git a/pages/home/components/community-avatar.vue b/pages/home/components/community-avatar.vue new file mode 100644 index 0000000..65f9973 --- /dev/null +++ b/pages/home/components/community-avatar.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/pages/home/components/community-hot-nav.vue b/pages/home/components/community-hot-nav.vue new file mode 100644 index 0000000..5b4939d --- /dev/null +++ b/pages/home/components/community-hot-nav.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/pages/home/components/post-card.vue b/pages/home/components/post-card.vue new file mode 100644 index 0000000..8a017f5 --- /dev/null +++ b/pages/home/components/post-card.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/pages/home/index.vue b/pages/home/index.vue new file mode 100644 index 0000000..10b74af --- /dev/null +++ b/pages/home/index.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/pages/home/projects.vue b/pages/home/projects.vue new file mode 100644 index 0000000..d7925a3 --- /dev/null +++ b/pages/home/projects.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/pages/home/team-detail.vue b/pages/home/team-detail.vue new file mode 100644 index 0000000..3f9df5d --- /dev/null +++ b/pages/home/team-detail.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/pages/login/index.vue b/pages/login/index.vue new file mode 100644 index 0000000..fa40c9c --- /dev/null +++ b/pages/login/index.vue @@ -0,0 +1,403 @@ + + + + + diff --git a/pages/message/direct-message.vue b/pages/message/direct-message.vue new file mode 100644 index 0000000..434832d --- /dev/null +++ b/pages/message/direct-message.vue @@ -0,0 +1,251 @@ + + + + + diff --git a/pages/message/index.vue b/pages/message/index.vue new file mode 100644 index 0000000..64898ae --- /dev/null +++ b/pages/message/index.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/pages/message/team-message.vue b/pages/message/team-message.vue new file mode 100644 index 0000000..ab08381 --- /dev/null +++ b/pages/message/team-message.vue @@ -0,0 +1,262 @@ + + + + + diff --git a/pages/my/change-password.vue b/pages/my/change-password.vue new file mode 100644 index 0000000..a5c3b68 --- /dev/null +++ b/pages/my/change-password.vue @@ -0,0 +1,50 @@ + + + diff --git a/pages/my/index.vue b/pages/my/index.vue new file mode 100644 index 0000000..59b1ca8 --- /dev/null +++ b/pages/my/index.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/pages/my/my-projects.vue b/pages/my/my-projects.vue new file mode 100644 index 0000000..a667273 --- /dev/null +++ b/pages/my/my-projects.vue @@ -0,0 +1,110 @@ + + + + diff --git a/pages/my/my-teams.vue b/pages/my/my-teams.vue new file mode 100644 index 0000000..8b41e58 --- /dev/null +++ b/pages/my/my-teams.vue @@ -0,0 +1,114 @@ + + + + diff --git a/pages/my/profile.vue b/pages/my/profile.vue new file mode 100644 index 0000000..05afc2d --- /dev/null +++ b/pages/my/profile.vue @@ -0,0 +1,289 @@ + + + + + diff --git a/pages/my/static/add.png b/pages/my/static/add.png new file mode 100644 index 0000000000000000000000000000000000000000..65ee3a2d5f3714e1ebf491aae2455166d2e20694 GIT binary patch literal 3078 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 Ugge~DLI3~&07*qoM6N<$f>CMRYXATM literal 0 HcmV?d00001 diff --git a/pages/my/static/community-active.png b/pages/my/static/community-active.png new file mode 100644 index 0000000000000000000000000000000000000000..571dcbc31a64f7b87cee84db3b67eedde63525ba GIT binary patch literal 3481 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 literal 0 HcmV?d00001 diff --git a/pages/my/static/community.png b/pages/my/static/community.png new file mode 100644 index 0000000000000000000000000000000000000000..07258ae4f0fa2e665fa79a79148c6808cf845515 GIT binary patch literal 3599 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 VOOyJHj}`y`002ovPDHLkV1n=e^%npD literal 0 HcmV?d00001 diff --git a/pages/my/static/discounts-bg.png b/pages/my/static/discounts-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..3a22a2101759f17f6f7e0cae3573bc087ab5e6b9 GIT binary patch literal 5042 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 literal 0 HcmV?d00001 diff --git a/pages/my/static/discounts-select.png b/pages/my/static/discounts-select.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a42dbc509403afba326c225d05e470bb775291 GIT binary patch literal 1657 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 N002ovPDHLkV1gLq_#^-T literal 0 HcmV?d00001 diff --git a/pages/my/static/follow.png b/pages/my/static/follow.png new file mode 100644 index 0000000000000000000000000000000000000000..9a779f5b3219bf5a50473c6d4adb6bf0335288e5 GIT binary patch literal 2781 zcmV<33L^E1P)PxJ;YZIL=$qX!I;1_IGr2To|v6V)G|lgNa09PA->Qi-`3Aa1#Jr1pqDp5CAB0G5nil z^Y2ptZ~y?FS5nh=|JoK$QSOua$@h5gkPQJrVV! z)9J^1dwZSG3<3zp1+cxnT^Sr4YyyD00N@&rhVtU_n&ZF!27v#tCJ}Ke5lxfyc};qk z$n^aHaDOZod$7H|oqty}Dh8-&+EPR`0pP=H}+BRaN~q0Ic`P**!cwyso#mHxpJ)Xn>84jnissYW4sC?=pKo_KE{U z)MQ!K@4^Z!hfddZc33;*(dD(WEgsBdGPm^f^t>5{S15o|b58@njnX@^puO2__Kux9 zcm6Akph{^rZQ3*~o6SB%L~A`8`$9UMUKK`@VF0qtJ>fZ)4DQG2bUHo}ZafTd_SQo~ zLnaY@Rf2ShXt!lqx0bTWk^psG=MeDSJYxnYgy7KdwhzNFEH6kz{FZ5&TPx0FWGHw} zdP}ys-=@>)PrqH7^DkU#@(ChhC&$Xka>i6Fgam3(2Jt@vz(=K^{%kh8IZEfwxf|7wifV!?X1Ay?H`Bj(8Tb2Ul|1P~Ndv5mT>=WWbi0(ps z3Ic3zZ;uQP4*pHLXP)eQ)wwr<_}Rw-G!uI~bXJ0;!mbUMATkm(czsA(E!51Q~|$9su|?5wWf2%b_6h zAw=ZDAyz^|F6W@OZGR?}N}Ud()pebZjL)~o|Ww8XA}nLr79xUJEOu9r zTbF#f8u@_ad)~I~*{M{D>&Y?0FpM7(QGSgN2_ZHV1!x!sC(v`H`&}o5=qIZLL4sT{la|Lb)8!s`#mA*OO|DE6*FeU$-lQJf7@`Ua>6e`Y?+ROQY-hF#yP$#}*;PHw(>8Bogy&+vbqQ zcIZYTk;&dh)+I;OFbs}Ke*pkC`dm7lt_e!ZWL_9&p+xi(%d+yvIxL2wbeg91BI0fG zm~s)#iN~11oq?G%XR=vv@y(9ry3Wqdqj|zh0LJ6-8x=+QgCtH1A!ZdZ?)zmghVAcX zrfJ?jA;=^X!!S7K{H*->fDnSa2nB~>7(+zFYt1Q&vMiZQ9xMpZFpSki#Jv<&_i-Ua zF%QZb<7|SD^JyW(>{6vm*bR_*@E~VHeC)V_uq^ArBAd--#JMS()f&?@pBgv7wzjr+ zkBp4G4gl415rK{%EU-MCuIt{-%Q}w3UNl_<;BlE&76<4(qKJ6LG|k##i!%)42Sl_< zmM%lC>(+O5b+L1(c(k;%Tcjsd7?S{xBalWhPvCWN>)3_z)UZoRW6^XbwXilVGeCX;_H#6#0G z&NrVz#P`bYr(D-9%Z7DbA5FIZuXxfe%jznsK`xhU+vbZ8&Stn!trtSDBMCK{nwsWC zqfrLQV0oNYRrTi1&Q5k-7YA1kj^nWAxSr&35)oGhrG|xs`^%+BBr>m~qvMharDVa& zo#k@dgqo(Y9dOY++86?We*(bGLI_R+`8a>jah$!L!gs)NoRy^cv~)=*8%um#*+zJrmw!iVNB}rNL@O$}wDC2aPW1KlE!@9< zza0u76ZzYQ0PqPR1SjHU4Z|?5a$T1-nFl#KpSuODIe)h;4D$kQL)~A==lPV=_&r`# zRkdXM_U)l=b-W90YHFGjjYfYdFH8B;pB=~fTq>2~`}wklzwrwIhhwqW(y|-BEY;t- zN5tK=wY9faa;3~E)r=W4M!V$0!^4LwY5&VA<5vK{H%+XZ91+!9mc`MaVo$_CwG0585TB8z8R)V$A^%(%{7D9~w`ivJ;=mHcG z_e`2J>CQ@QvK){B7oZ2LtE*QAb@06W!)S1nKHv)b1b3Dz@vdP&23%pkn8{?;PUsbO zelbCh5CGs|`3j<}WFQD+&?5vsmetkO>%wTRWSA(j!v&v_aK?j(+%)bkCwKMADe{bj zuLJHCLhx-aU*?1!p^vDaW3h)ooS`7%ldkI?a9#Jv*|TQ{Dt!n90521fQ7jaU*NXPx))k#D_RA@u(ntf;-MHIl_+eyySY9-CyzD=SvQf;+LtEN(0#a2b7prBy=qyFQ^ zA1Y{7kQQv!O0{B(TB;&QwFnBeRRjes3Kc7UVymq}t1W&exqZ7wLXeu6yWJ-fW{+#K zmz>F+$sK)v9XC5O@3(Ju=6wu8oeS1EADjfNbqiPBg0^kXRZ6`H01E)1S46(EEbFa& zKL1WOoBgZWFRj^pe>#Oo740svUe%sZeY#aq*8#6ypEy$_@ zrqk(LEX&$$ln)VcbreNc1Hes)sA4EY+~|4UW7UAHDj*TP1^{;$#lK|crTTX|oxaF` zpA*A}VYoP(&F-%>WHkYih`Iov#VGwKGd~#vG&MENPNh=c008O#L}Z`u`^#zu(6;SM zlu`wYgkji`&1Mf21GuhxyNK+F{|m!#UN)Qkxss4ovmg%x+=hs67^~!Rxm>!px3{kZ;12+Bp=n#k%$ue>AQ5TT zY?V>;Q)XVCq;!I%R|G+@XQ~5QMC1cNvsM%l*Lt3}IZ5eaO9Q|F0NBiYd`bg4jP+(gPCFRse{7%RiZUc8NI@5$TO+$kN8~excI( zR1~nexw);Oq2UMsoNAWm7SHq6lvtii5%Ke)wmHoF%ajFdZEc+%hT%s5aJf-(5CG0& z=3h%JPwlp?Gi^th`TR=5Rcwj6u6u!qybb^zMM^%+%#V~(+Hsr%h6C>PE@E%&ddle3H_(ZMQ0=I^#V65w`%qx8ndjJ~%jdu&1X- zkCiARzQJ@leT8LN_W{7i%>3%`UPLrQM1Dd=>$;bUh>qi8*@cK7ipcJA4{5zbEz88oNo85DGT5@E-OGGsRNJKgeYd5>+7T@<1)5fB~6`2!KpFi@MAInE4>;H)`76R#Eya}inS z`~IQ2u^yYZlZ=WnFW0&F=Yx@B16-2GDig{7fdJ zo$ZoRQx6CVIpg>r(9yygX4bbd%9e2h#xvNqeVS70ETvQ- z!(8_4WjvV6g%t-Px)^+`lQRA@u(ntyB*MHI*1+dHpUsQ3pZRZ!HZfM`GkgP;+_C?U~A6VE>|ByCBq zJF{2R#6TjbXF!Y)DWSc2%cYhWBvGp|(L{+R7%?IeQ9%<>h(95u(nw4}PkOu0Ox-2N z^^TTy&-O0NKiBNey!n3SO=sS`S%eBNSmAtd5wP4nTyhUumNkW$w=?q$L_EpNUnAlh znM~&Gj*gC=QV(Fs0fi7d0ANu8kQ2XcnAPOJ`^IZQA#~q3doWI3L!cGpg{{~=Fe^0o~Qqo zQr_Z$U+=>Mz#Jml7c^uk0Z|BX3;?e1L_b4BYkh!tJU-bljJ=3h=MBIv+qUPI4WMON zx4Eu+)+2^t%u1zFU*!TwDeIYetN+X}jH#(q>W3g9OXfi##A*Oo|c|v;~$C;2$r~fPh_$>h3?7dq>MC(R9 zpb%m^04(u@enLbG3W+Y@>BUMZ9r*-S0$*g3$)wTM)%807jMpj=aivmfeIdnpp3a;) zb*gsTwr!^aqtpEdX-wO)ENiaoy1RY5j^oTor_*{G_A7aw-a$l*gVqx`ppttbsPTkuAfgq8L`x~>G4p3R@2(@F zA4e@nU64BGe>3nr0wUt+a5%ibwYBwVv9|pHrIdFua{>`R zQcAs&-*D;DrDJPqYQ6^m9b5J*i1>a_PtT+0TkfTl%b2YFy^OHsa?4Zq?ETa^IrcMBEAU#AN2I}bPjft)>G7R9G#2tL$o15GV@qO zjO1wPml+r~U^E&X)6&xN_mC70vr&D0eYCo|S`V-vtRE(#DS>)$Bmp&uWmylnuKS(` z^$!t6D+*9bnPleYJgA?E=-P?`G)?m$B2M$5Qbd%f7(gM!3;@`l19UeLeOfVqQp&Z= z+!yWvz%e4aDu0VA>s3?;q4#J%w^}gWQMP~u0*<*vv}Z7p%mr=qBehMKruh;g`bV)} zyw&rZw4{bDXAkOQ*fpNVik>^m640`&Ij-yGPRH5B?lsC1P)fOxnf?6f5hA*wSkzaJ zfM}ZLuZVc12epof{H>xNXW0RI=hfWJd?pbcs2C3lAvOa*vj=pLh^C+KP*PSN^peW@ z&hhfTEdcR(rBt$F027JC0>^Pa&N<*tS4thM7(gKe0f6ZN9U!8a1D%=6W{P^5@Z$h5 z!JD3|l~ONM44`FM_qndC6U(|VB2H0C9SIz;si|qEVHn@|hP}JL?twZQ?t3AGPBSj^ z?Cc|=*@LlJXo_Y4ph`D34C9VeD)mLKq2}i1aoKEE1Nk5Kv_~S5)xEvFfnIz0eP%Kl ztgfzJ=(?`X!u91_48vHFN~Jao6|e;Wo&bP7-QC^uJ3BkiE~jDB002ovPDHLkV1l`ePx+q)9|URA@u(nthBUMHRr`tDaqN57+zZsp^^RAtcB_L;_I+0(!v@0zuFt$XB=s z5;Z{*P!Hk>Xb{DSrz95-%D-p%FepWW`Rs`q~Ns$RW%H3)ln!9AQ0_5u#Oh4)%;uLW~P!1w(%rBdl) zWe6Cvh@AP$jH*I zTerTKM^!GD->;Oq6#$M##9xPDxS>;R&d&&mnR%nN_L_FWjWIH9KbU^^ zJa3;`t@iIcK&|x^i1>Y{-sg$vo_6hW0cFGh;BZ7NE2UJXBeC4EnRjmkz&V|SO8s5| zjWL%4z*UaSKN8W$y9V@qzoL}78WGRxu#aW?eGLFkCZfOPS)x}!-}kGY=lv4^mN;wp z1Z(Ystz@>eU=Rc!j^p?tM6Bj1ntn$_5wPBMCY{>$3MhSQt*=AG3!MHRA)?O|0yM_# z0{~)y{foi@z_mnl2>?Vz+Y|vb#_X?@itF{d%#3EKR4V&MQS=HTjwCOmD2i53O-WKh$!o8L1E^ndWk9X0F5yc1^rZnG4lp%?ay4n#+Z8n;3VhW zMMShY7tk2)cpPdn3EuSdk+I-Ng5 zM8^~X6f246oFBY6j;oDEBit#P7L5x4J_`UxIZbaOqULtw`~JA+dDd|@vOJa%(Yvm= zMN`xm;|9HN5YeiB!%2U6fJtQJddB~hN~MX($;oNQiccWoC)4LRj@LFCjVHSSoFby~ zt^iC1;r9UGPP=as(Y2{QK@ee9D2a@NAh!z~#c6-2VWW~(iv(`3`OU9V(05F~a&Ja;E2pn1^!TK;J{1w~Z~%vE zqt{v=gNPEYrDc+cCejD3^_7VDUFZ81MD&B9nW9?jpCjVe9fjpSL$Y-9#TfG_037G6 z&(DQnc;8R}N>0f0yq5t$G7PDMIW7#t$K|0~tuBqCXbJ$vlF!lX?Ch#-+qTKR*er{@ zsMdPU$#2TOBAaM7uj%&D)BkzLC1cF50HA3t0C<6jB=(#yK@fbAnYTE?pC_Utv&yvE zCM5r{Z(5O=zhtd-PtH97WgB$@93LNFH8wU@cY^&pA%OE?7c)O;tzDbyv~uOj ziBhTbsx#A=nLlK$m2~2Q(#nE|0Ki`Wz$<8~*FDesLakQ&bHV!a)$*pO*7}0PL%s?C z5@5^Ubb2m0=mNmQMD*EK@>}LbwbmODQSSGO7D>5(xtlAnJivB>lOvK?YN@k~)>&)s zDh!y6@K*ppqV_aW&x4g*&SoN#6hdx(v{yi__05QQuA_`NpF`VSpmw~QkhKuU@tMqg z6f^sXn7y0$gquPap_1XAnVC5w>#n5I?TN|&Ana90~U`qGBP6b-%S=v zGs&f#mTt@~EGRK%^X{X_^;xA-`B)ssPsyxd=Iu(Uqr)(CgY8A??lhqEI59CXHa9nS zGXR|7N?>LQ8ZIQF8{GHha`^zI)Jx7(noj3=hgvwwLdH1r!Ce*6WfxgEal0>Lme# z#EC&xQAE5d3`6%+&1aA1H*|MDXRS(9?6bCW?56g(hjy)X|=ElMQ_J({Ot7fv}_XtFaH<7fm3u4uorMwj($I6@9`G=FFbsbX52x-%m4rY07*qo IM6N<$f)icb?EnA( literal 0 HcmV?d00001 diff --git a/pages/my/static/message-community.png b/pages/my/static/message-community.png new file mode 100644 index 0000000000000000000000000000000000000000..30e0d6274516cbdda15a2768b47416b3402a7d3d GIT binary patch literal 2098 zcmV-22+jA2P)Px+>`6pHRA@u(nthC1RTaR`d2hRI_k*gtn{Jzekcem$BN5aFwZRXfQPdJvkg&1V zI-PrGw(Ux5tO^by7-e;ncITcqLqbvi0NqH?h+3mXLBOvVBSs}^ph41hKM*UzZoBUu zb2jfy?#|B6yq(Tirs@4_=DqXoIlp)AJ@?#mAHo^l@C@gJvw*Gc;j%kgtKq++* z0PF&QD*@nK0C*k%9`!u$&U`-qy=K3_rVdf1)W-pU0AOV$5JdbA0DQt2BhXE0O#vJj z81Q>~dhS5P;RIISPefM(04I=Lwn)PPw`|$+vW||9dzksXNv%P|>x?nqPAb0~xrPE} zGMQIfYrhWwGVk2>6aah~5sz4F-zIYs5!)Ss2Z`vN%P~BuY{LMx)>ks~y#Vm?GUbo7 zwY6>DzkmN^d|fGZ0|0!>k$aAa%AZThP*tuWfLiOF%sc`BZDrcNv3Bj+R4$i0;a<<> za^A6H$DRd%HSzUTt5$W4j*h-qi%M(V#mx5rz(z#8+ZeOE+B2sFI505K-rL)2BodY> zv52_W81vPolq;oV*uFBpABJIPu~>W|0pLx{{6$CZLqsIgqGGEF7`?Ge5U~#cJhvBS z-U$FQr`+}*0Jx!=QW35fP$~6!0Jzmr_*)`+^RfX`snoi*wzk`u`J+p%V--3*?EC&z zV`F2F*YZTYfZ1$zeHe!S0Dx7o4vE-75FD(ev!Vwxnat~~wLbxX^|cIj?jM|)nHfBA z;6N#uRC~5wKIVSue#eVDgCN*f6HqDjI{+?NLaxW3dy4@OpGS617Tq#2`UJho%FnmRv(xpxSA}Y;Wxn6Y+ zp6(%9X_#7TFDn!Z66rx}-OtRWwU3$q83cipMOwpy5k$bu+hdEZwbvI41=&qNE|+UN zdi3ZCM2sDEoQO(0lveTJUI4h=2_$=rF|swAZ%V0u1Hd`a-;jtFY}sD&L$pF>^#vj- zZI_f%#{r-_0-PnHQWD-09;^WPIU*`~G@VY*I^~b&i71AhXMV|hP$?yw<~>f_$P!Ur z{-;u@HNNjZ=iEC?MCZ3ukWotg5CGm68_mpD1wkN*wnWj_GV`BXd6__^)H49EE{5nvwab7Hlh#xb?xI5?aKI-~k4KS0*^jK>p$BdI~aHFRv)LP%i%$ptMpCO|1QcFd^ zy8u9rz2YY2g4>w+$DZdcs>w`DOgvSOhpPdmQmJ0w_XTi1?PBJKf*{xw8#FXDv|(;; z?n&o9TWc>Y7K>6&T+kMIFr7}n9ufZl0DeN(Jnebjhx7UT?-R<;i`5#UT5Bl_-ptHT z`o4et*w~l=%{Q&}f{iW!{FI2^Q%Qftx~SHAH#6U{41-@l#I4IY0;>hMlNq&|8IfCrd)i(`xgpEoRZfLirzLgs?! zdDlsG3lVz}vHWb}?QRJ@QhG29!)wdKb@|(=2T*H$88iRNJtJY}Yl0wfvzh91a2dl= z=8=>K?sHSA==r}O;s=c}QZTOA>H$5Ib}fU zad>!m^~}u70RXtROoJp1vb`y~*R|HKV&*5}p~lQ7`uqD==W;n)>xFLLzWq`}++?kN zpja&awU&HC0AnT5*_|Z73+5^!?wgyN+bh+u2u?DPOB~~#AfngQGPa)k4Fwbf(&_Z( z=*%E4|HpR8@wDWL{pE%t;;qIQcUMpkOT}jz4k%ibQWCc1E2agz>m{r{!pv_Bf?%Ry zR8B`t0hIoShKBm)=H?`P%Tlsb`&X1>KGF<0>9c8o(z$%3(AU>@3p2}}u2c+?q`>pM zA6aWNK@iBt2u*8E1&pnhQ{%3#u8s0Bo*bfDYaa`OK$eN7xBm-Z(-+m)> cpYb02AE&TGbtUYNNdN!<07*qoM6N<$g1XTEL;wH) literal 0 HcmV?d00001 diff --git a/pages/my/static/message-system-active.png b/pages/my/static/message-system-active.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab89933e3c7d8c3c7f88018cd3bc533c274377c GIT binary patch literal 1489 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 FV1lIX-8ujO literal 0 HcmV?d00001 diff --git a/pages/my/static/post-active.png b/pages/my/static/post-active.png new file mode 100644 index 0000000000000000000000000000000000000000..f270b4bc882125a70b8605c9ac1f7f50504fbc3b GIT binary patch literal 2197 zcmV;G2x|9Px-Pf0{URA@u(T6>IKWfec?-fnk6rQ5P|&o|p;i@X$LB0&_9pb)K!R0*U7R9dAP zpfrGB4JcAAqC_4l(H7k$DoqW4@DTBpfJ6~BiZN&ik3STHxHI3mGu@_?K$)3)k2#Zj zH+OIE%$?aC_Cb37yx;lGJ->Ut?{^+E2(NR&*Ev2o2yn4Scu_}iczF2GAP7DQ0G9&5 zaR9J|na7erS(E?^g~G9p<7@(e&j7&k1fYG)eAr?I=n&BwM7&HyRs(>Oaeba=<|7vs zz~SNHp&$r82LP7M0{VoCL&++eSh16 z1voM?a!8}mxIjcU1He187+gg5BH~Whb$2uxjireA&xGFD%>3Yj1L%3)(T?L>Dk2*J zU`316^rYiB3TjuSQh7;rJkQ&Jh$pG*j08rN4;QRi+RmT`}q=@_{!JzAX z-`_PS0Ey_$dIS+sNn@x5u%{7GNn>ZVTHTkWV~klRB1$50#DB!hpN$CS9KE0MK16)G zwf3pk5+D`|g%3N9qZEH80J!OwDQN(}&!cGR{b?ygbS(gUBSk*fG4nU02yPRRt&xFO znE6cr5cC}2=;-M3{rmTCL_{TxV_JAzM#S-Yy*{>k_wI?DyVXZTcK|>$QVG%MX*JWl zn?$7f?qkvVD?8`KIJ%BGP(4TC@>oyX zb^ys3V}2tdS{r7`pQ32p2LQF10s{bL${zy2MJXG1GP8E-ZL1g}(tP)}Xz$(3tYeEz zIRGFLY0`aTO8dDm4A)jFl_zEas=0O9vSrH$1_ty4osqB=BI1{BMbmj zgd!pz@_j!^IPH(9t{P+Br8Ex!CndE-L`h|Py5nUHCWpeMs zwOVamJEm;qG!g0XjLWiLGILz6bw)C+411n;svb`Oct`5kY6JQKr1sS{o_A;}QpS)%OBg1{hn5#rY??Spj&{5x-^eAtpK#556T|8KNl$n!P zV0I*v=hX1<@DV`}+zkMyM!H5ox}QML*cgrz!lN@ zznJ;hJO?^mU$J7vNMB#yRAG;Z7g=ky3u!BJ29Suf=hI3?Wh*m}=iQ&A=R~CWZfYzq zA}9F1pIbK0B|tsCTG2EG5g&6L=i*YSq>XZ}c%FAXBHj=wz8Vdga>pQZ2~h8g&Nq|t zs)*d=`@YUw+O}WDnEOQJT-_`pPx!unV(wST$YGuAX{kd*ZSNov>7-0sqVx|e&xB!k zaivoEW1IV}`A+9HDpT{(Jcs8jg0Ul>=Mf_6htLszQgnJYUaQrvN!O^+v~4mGkSmz^ zdwJlRSD_Q7PIdAkn6zVz`DoOVtx7%@k&=j9S*cWXeApCY%;_RBH7E|l@U(W(PTHF{ zfa(Mhy#WAj6p_p04n5)AgG-hy**q~Z@joI;-rq0?g27hf{&XJ$ov(_GhG9R$Jsl}hCw-5BdN!1s&DLjbT;=|68? z(v71t)$J)jb)r}-uBzATL)B{a?=y9(m-~7Su$RvD!q!26z4(grY2#o7=kx3L;@$rT XPx-k4Z#9RA@u(T78TiRTV#H<`vo1B}E>)F#$?JP#O~nqKE`t;wMsUAS|NNvcP8c z-8=iBi%UQ&bp^DsBG|m0IrC=9|_c!UH8o# zb2c-Z+3CD}?`@y^L3;k2d+wR@d*|NY`Iv|BHWz%G+8EzNQ0Tb2mmb^PBQ>Jhloyld;9Le!NE$cDoQDJIL?EJ z_U@1j#E z6wXD&eivoe><6%bL5V!jHneL@-&6BFCFZQFJvOGhasDMCnOD&mN^ z&2`<|BY@W-;;wj~VHh899OuRVCqUF%f0mhr;;#k(GsEdgMEnT=xUTEU{i!O2Lg8LS z{C0|bHW1NwWRp@#^4-SBz*`3o9&8&K83~#WP$_kKMDJ4YzPF0ULKMTy?0cRk1X5Kj z%UYJp<%pT5A{C27uf4s!H@=%nDam)&M(fWL(Pddi=ggwEZC@hMVrEIqtr^A{5%);6 zDwWDE-}i;`XO-^m?&Ynmtvi|dlL^HT0KP#)o06NAQj+h^j-L5MB&FPO(h$I6vG|Tk zrP3AUuFI=taxasHUL zrIeC<_e|pX9Ov0aK*hSYZQmG%;iIYCxNmZD za`o1&Ta#&E+Pv0!fSJD+JqUszIL-I{V|4+Hj-f(CX(**jK2Dffe%)b2^j+6|buPf7 z$bB6E9!N3eFM}Ys!S{VBsxw7vy@Q#*B8$wt-}AiWv7WK#xI3tn`UL<;ZI~s$lV}|{ zaNvoNk&*w-6__xkX_{pKxHV;CYez?is#V1(r6k|2iU2+bl-ZR_2;{a-{?_}nOGphUF z=W;n+DwUG`S1o^LtShC?L&T?;`TdE7W2R}Y8yXrC&^0A$gr^C`FpSSQj*}#u*^j8K zYOOyk`HPt^O}$Y_#W78DW1~!|wf-10?@qDsC^N6|Jn#9M$RY);buTk}v3@R>YcG{b z2kJhev7+>Aqobp}QMr_yT#3r-%zU@!c|WShu|lD66C(aFHF|i_FpO&)$9bh58;K(> z`A$-n$ZJG&)@=K0Ci-HrcxI(i`L2xU5HYR)YiWV9x`6nlTI&sA7(S5Pi-^xi!7v+B zR&!b@CC4)^%YH^gak-Ycr6$05SD{e2LXIZ@d@yB6O0XXw;{EX`LDsvvx=zXG^D>0J zC8h6obadFYm@>=TuC6XKpU+DX5toJ!648Ap6v5=?=mkXpkV<~WfE557FrS_F2iP?g%Emu`KI7rfEI|0ACWOPI>w? z0IUFj_a&YmW9FMZ&--!1s1h5LQj+hI_x^k$dbw#4OdHZ#U&YKranh~wqESTrg6q0} zIuUTPS1BcV^6tpa8$=}JC!>z4GN%ZpqAC4bKQqf+m{A}g;@(Q7vN}D=n=4SIl;pd3 zu=E@eC9goH*%JmBTh&^h&CHJjz!mZg5ywo^ys*)HIU9JTl;pdq5ePGH@jP#Rtskpt z03#CE!pwI>FZ~-4T~Nz`de@7^;#rkSWxB9u=370_lP+XdnKyva^C9ByFbpNS8;NMR z*8NF(uC>0FnWx9{VHjRqE|+VTjq?dmj<1Y2V%ZY}f#v)D{#sFpPRD)Be1D`n5d=Y7 zJ!6ph1St3AkrbE-X5Mt@(4kGW+ApP)ebO&*Uh4~ZGT?I^-4OkeTJf%!cU0&CStTL-}=402IeNJ3Di$R;{{=nZKDaDVKUP z_H~4aZmjp(EE<5Z!_nNvV`iDjX36vin0i1iI)DjcSt}nk)06Zt46iAd%RjFN+=8-b zJr2r$WK7c(kZYqO`eqOW=QJ|vXm$i2V&<<#&c8%NQ^VO46{Xabh$u&Pm+QKJX~bSr z0V<_F!OTx1qWpiQ=Deg4N9U^BRDj}yZQCotFw7ItpXcgSGxs$eU^AU-hOLtToAE0y jq>YmiT*zO)8Snld=i1h07fJp500000NkvXXu0mjfzt~6x literal 0 HcmV?d00001 diff --git a/pages/my/static/user-bg.png b/pages/my/static/user-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..e1472d34a3b8bbd926cb68a77e8a1549903d45ed GIT binary patch literal 7763 zcmeAS@N?(olHy`uVBq!ia0y~yV0y>E!1#rO4JeYdW5p^U#aJBV?!>U}oXkrG2030& z7srr_xVP6Xavm_?aXy%GrsUeYYfj5PG=FA!^o0NI=RNm}SU3a}92yuHnOHb_#BQ|x zeo@z=4CMndGH9UOBj?mA-!t>q1Q%MMBo`Aufzi_1t zjX>3M8lEmdi=Z~P?UsitRS*EGW>)R=fH(!H;y}T7X1G!oCZ@LP1uBA^aK}o#tAi_T zZ~&_2pQ54!@&!c2;k*2Br2-rr67L!(xv0Q>lCa}9LMam?<6+x?NgXh)Oe{R*_Hd=6 zo(6~LXiRgACT~#g8qL$A1sS+-94);^t1M8}Fj`NKHcr5;ywMifXfqVto*!*{k9Igf zovG1Y)@auf+(#enPmhkAfJS3R2N6aG5y0baqk{;eg9xL82;jl$(LsdKK?HCkX>^7I sR5gqaB8(0qj1D4z8%fk1L^!~|Dexet_}vgS;4CqNr>mdKI;Vst0CH7?Ayq` zB#{xuFpJ+aW69~9@Ap0L`}_Ayjrq*}Joj_o*L~gB{d{J%XLXp3r0i~U9Rg8ThloNT z5Jm_+)lLWvIHCgoAXIxGbd+NV#DI!t^Y{{#$ogxjArR_azh3{q212|3dhnT)i|YFQ zwOfWK5C{W!g!YdkM-GQktsPTQ(?H@j9zXoYA8}N_J~57Z;}dBiaWubdzUkm(efqyOVuLb_Kz`qvw*8>090;_$H`w%M1g_;VK z;ndXBG_*9}LQ79ezR)w!Q!Wha7e>m3iF{$%yik$fMMFae{{K-DRI4AT5`YLnw>H9!X@GIk($O<8GBLC4fKXG>&`{IT(9zKX z;epDVEG5vg)9u`M_!Rvv?JEodjvPn)!r~bPPv=%bby_h(Qde)^Wn$*s&BeWE{{dl< zgQ7>JkIBd$ms2{Ud{#wO?VPTjzJZ~Uv5Cbs%j;IwHnvXAF0O9w9(V5D_YZjR@KIp+ z(`OOSBVR;CCnP2%r=+H(XXND<6c!b~Eh(+4{!mj}_p!dAt-YhOtGlNcJv=fxHa_un z^4rwh&-sN#>=JHy1!x;<(*b|iX0&BK>|j3Bw6rv|4CMJxQM-XF4LdE}zQgo8PiZq; zaoiqs<9z&Sw=3*+xSJ z7L0}+0*8>Q7TqGD$hp_A(mksoeJ$e)a3WhOtN z0-oa}KZYFhY#sCL3>2XT?@V=;jdwiLqEhDgAFp(G zL~H&$=dJVqbu1lY4?(Q9kSe9G&LC~s1f~y6AR^yf8_E&{p2OT5B6GXwmyaW0fJ+U}jXY zfA`tHJw|s2ETH%=JFMAC{|;D=6oV!u4TC<#U0a{k)pu=ajE1_l(4=k5k}?|bDP&jp z%N1!LS`G}`3VaybJ91KS71G`@xWb+haiDw^BFLGz3NhDNg-o7J%z6IfI+)B}@+U}5 zZhZECxfSKS(H>i<0$g10wHZW3*(kwRFeGXH4dJp&_^U}jPfpdWn?e10pGJbOSnHan zQ(Xl{rQUL-&zp$PRZ!?)QU}$3@;XPw*q?2R zw%>Hczl>mGG|UTNMWI(SJ2%!l{`V!&zmuy!NweApe06r2s}Q!b61fUFEzPHfM0~7C zTZMFYpjOz^zQ=tc`(SgzMmQCS%6PvR@jbY1f?sj`EBL7{kxi1d=~CLW*f=JUv?aXW zGpgG%gMC~XKk#$4hqYTNxbmkM&sA38Q(K1{{X2hh>;D{r`VUWZ-VvcW{m%klW=6X+ z&`!dddXK24M5u(X;O5i-iqvcYJ35Z8i|uJ!L4>*-dUeB|f4vnI=8`_dLABaWs&?@U zWw$k7Tm+D68*#C76*6|UV-@m!%ACm9Dc3Ir-<#HtwFnGPbn6W{=%=y8fv6J)XVkAZ z9iv15Z+1}<2p%03#hq)h13bZ3Xv=Wd#}OZH>iBQ9VVUs|dbOwU3z0g$jN`FdqlKR}=MfS#HqGOKJ z=^``=fi3?ba92A>)rEu0TrQFnPgRoE$LnXikCgeR}3VLFTw;J@#Z)J)Eidpu&+Vk&5iC z;O@9t0c46iVhSFSm&PpDx)4 zI&ZY6ZDJBD1%!eJugj(pRw1^?%|yOo0P-ztwUbm;hy<2}uUpn2%MS7L@R|ePw=H*o zS|{+2-NYZR(amN?!fmfo@K4vc2z(O-XZ{3i+8X*zkQ0rGjp-ubS^W*%`2Ds(ByQV^ z*y;3lo`->L0eDdG2$&>X4idgKA~ui3PWv9L<6ni`(0i>?Zj?4~5;qeFN&PJm{WJG9 zBquBV$vBpckwY(mG)c*};d0@b9Syy43>)L2WZ10rxPitiaxWP8>$+pF{uwyxVrR6= zX6v|WRDLDWjSnZ^LV2+19MpjTzFTAR=REv<_;UW_*eA@U3Ke?JC;%hg^chtF@2i6p03u~xv; zDBiI~#EjAirQsA`7C$wRrSE+htna9who|6caGa0LZp%}BP{Id3*(hTkoAL`MwqXB`yqQ!Fm;IZ07NV=4 zuXGH}U9?VE{xg)Wk*=hW#NR=M62AcCGUmu8zP%Z^wlgM#iu!_ zZf^p~8iNs>C#KC4Gs@T2c&&u_Q!H$W4=7I^iZ54(oL1JD?xvH9B#@K12n75QeWf~! z;Ah?RuMb`Rj zG#3OZJs=HREb(UxnUELXTAPB2WO2Chy_;rtJ4Dl6)KSkU>{T_)HML~x6mO4*hEH8a|i4GY@J)SLANay=>0 zhIKsaG%J|;OBpA!Hl2;)Arw)#L3*_ncdC$coPI-yELQK?CaV529yI=M4M#43wLvm9 zBv;RCg>%csEH-WdG-Rz%2D4sEBfsK-B_IiuWDK4IB$|>cM8M(JmH5js-~kMGasjmh zAi4=(fD(f+jR7QeE2k#E_gBQKkSlIlAG70z_Hw@{G{}rPdJbq`IGH?4178LRvR;nB z4OSsx4?uB;i~_dSma@-o%Z*~?(7v#3WgYS;Y(zg0`8Up#E*Od^5+S=p=9($>0a%KT z|6Ni6GY=uxCg~d!r`(HUcBVML4rNia=o&U)cKw#J<2!mm;e{*$xq=FplG zK#o}i5>7B)FMYzRD5#0ux<=xkdd?g z26ZonoQ%*Y*sz}nhUNH-~;l(@bMX${tf+eR9Gz1U&iHQ~_Oqo;{3W%LXK?3nRa0scFY z2GIq+ug0qL;~?V3)nD~t*2>%2d|rLIP5%+0M1$z~CItT(%au0;JSu?N|Jc0$EuGPO zZ&E7#P{9E*>)T{5Yu`XmPEFhZJU0g=9eH$+TssQ>ocwDkX_Sx{lC)XfP;X{*GLVAu zKx%3eN4kJr*WLQl;L70);TeNJ;R=g{o%5%U)(L@^*K@nJB9uU3Rk>tCti{>-piMZm z=)Hl5{xT3n#YiWMX)P4@$oW&^|4(4?dxUT1i}T-VhX( zA-ZJbO9v(gbNYR;$@ifkOPYUN`nw`-?G3-hIobC&hb2bVTYSZu(V3l(K!lNrcjcl3 z;2p7xOEQ3WFz03=J|c9nWiNa*Y|HIo{yUa{0n$!w`j)QSV94RXT%OsP$G@tLjbTwj zUXf$+H#>-(-gJL*RU1bI{;aJ-LT2T_)^xt^U*1qhioQC_|7lGm0l;XKHX3UAE8+f` zE&dIzZ94J)@i`!lZ_)aIYf)&^)(`{L;f4aSMqn5x$td{?K*^GFVJOIp@D)NVnSf0B z0A9V12(%ANpnagDOlt;29+UuVN!d%z_8B+H3Y)<%?$5b*)&S(3U*HT1!LNYL28zm( zVFLtJ<}xLD{hgw|5oZ+q6+O4k#KeHXw*>CrIoLma?6{${Ko0tb%YKTR{wl`*C$|Sv z&;}G{(`E6tQ~m9L z;Ig+zIVtWS%Ufi%i(|s90KFdMFEgVdP$#miv>{(ml$u{GQ)~(-4q=i z7y<+yKz_1L4QzG{sDRpWDN7Tb*}^~;q+QsSSqBl_YgRs%T8l~(P6o9+kDhd^_d`!| z%DDSW>-`JITOZzL--423{=b4;ZM;1KXe^tuCPlnhJd%TU`HKOV%C_q_ogiyprtHfu zd`5r}`z2r9Ba+}p9yVnZryGk>$O;H3jm9r_bnH-Sr~(BR&gAtZ<{BO>5UL6kN%~`BDhYwNbF8Tb%=pdJfJ>9ht&OLIZ`S}jpAks_ zzRS#`tTx^{-a_lF-%M8e4|a%`*>*>&TlOhJt<$5Nv|2U<>-GBPDaFe2rFIf%+9)0g zn+ovpG`|s%^}Flupjeig6NJo~*tN07zuj^SoP3e?AKH?3$IuYK!ao3~-?r}b`nLIL zh>w@>qzXU^ThN&XOC@ZMStV(ul61JU&05(A*4!lqWxV>s-(W}iWezWG;%nGTZ6G{4giaR=9o2dc#qA~}nb2b}! zsig?yMQr;y#d)!X-c!PMPeEf*yiW&!x4+Nff1;pd#M%HnvN-->Q4$nLYj~u8Eo3@(!a2-f9mgJHExnJ{v6ObAOBZ6!y>~IzNwf1YhtH4FB%Svm9rR zJJC#HmWwTeu_^3cHt*+@t3d1`W)npW_Qy^}YNIZ!7%q>5;!f0&n1zKbb%(pFMPhRC z+jAUOArV*9gGk#)S0Q&FKcaez5w2Fz?sX;_vwbCI*%s`VB5oVVx8yhEvzxCYF{$AZ zG6arTtZ>UJ#D=JQ=3X`WOXLz-A~zMS+SXU&eYx?uf6_9cWMB9}>fHS@9F6v05K52g zo7Cdf@cM2uhM*($yP!->=?R9Cqn`|C>sAIf4_fqipsEJ}rZEX_+D-EpY zYL#DiO-V;HjqXc$F3fFsmiI_lOUPlpp_T(zP_`*^3)v4slXZPM_eMo3gJu`?l`R;$ ziEV(z02ka+#jOPoxrgzg5Jrg!(AHex(KpFY=e3KzkLahUW476*D%X_0kegMDr#Fip zKrG4oG-OA6b=L8HD>GO-CI>O4VGtr0PKJ1hev|sTf(UxCUTY2yI!h5w8i3WHKwr*4 zzBFW`R@?=zKC6fi=@QvfhULdj#Le<{P+0PtNKaVH4VzHdVtxr3nB9fEGX_ zL-HrvI!L_CEb`sA7J6hD3YY81di!0+7w*r7lNYSAv6@2+!9oogX3z&vDPK#DIrV*l zpMSb+IQOx26pboH;pBIp+8w(MWfhDdnN%Wi&pV3oNBVk-N$pUAO!iwx!^VVb=L}ln zIgFd7lgB&4>I~&eZMb2R4^|=csqvvCCVlVNQQRZsn-%XEP4jQ&ZR!YxRS4$Bu~6dE zRS4~qmQ=wB)SSb^A8fPh*jjr1zAwpuB<*z#mySQJ0@DxXIh(Z zRsM&zp5{m0ppf7Zc6xnoK;r4nnH!xnw2i4FK-V zcw0ZF292-s-=%bNfFLN%EptHCU~5!O+Bn8uEo&9>u|AEGp13m#3tZ2ftO^v#*zqeH z{Dq`aRAsi0JTwD5l~!pbBk{IP_0$S##r%TCMPa~38@f3A~_ z>~$uG>$=iaOtgqoZzn&smyp6ih}hrY*Cepx-|zfNQjm__*$9%(K@c+6ko^@AIDZgc zqjlq}kV-xuF8mb#e)zJ{J7ga^I=ZL#2DwiXhSzfmOE6%zlK>VwLgsr>kB|V4luFLvFallPN4vFSjpHd0cJ2L!w0t{cyN<=f^#~1woP+rz44b zic74lR#bEJ-yJR8(N+q(P~*l9J4Yg3<(5S@!Es_=3A^glK*T*Ieb_VjzK?1fzf_yh zp27P+Cf*wrp15{d;QFNC+u&%rIIgZ&&vp$9e_AROyV3EVy#6ZNrEqOzaFjU8PcETf_NfUT@g)#tgER z4R@eQ@9fJ|f}}l~e?#5y=PU7}eN&XyL%UcAl?JvznSb;x0be{KfBfSyt<4fGVS?TOMe16_FAFW#q z2SDS5-%Rt(_C?_*C-z*ukPgthvsrKeXsdqDj9uI9lqef4!Nv+e8kvriUjX!3nFeIw zyB>D~MeBeH622+HvWT^=>zaz(Lpm3jeatSBhy5Zv7Z$0b?<@5l+*7*?zqbm(o%sF% zWlM~!pu-6tKhMT$=Z4ZOGOO9Gnf!*3xy*u`>LzU;54lDx^4S%R5_8|Fo=O^#(I+Gu zUKj~Cn7({5q;T)7v18XWv+XC-l^kK;j)P$9u@#snF%pNwPT%gj)BR|lLT|_Qr^_dO zz8lWhfu}2`U^jrj>-C~(BJ$=!AMP`cx4yOt>HWUKn>7*4S*dQ>Bp2xSByT1KP>Q2s z?Z!^J6!n4`l;mpToexI`!PXFkdQ$f{m0mcSDEhURIHmrKNeV_T5JJgz_j^$Q%(~N( zOs}^g*Xl$nK3jdRgwGz?`}o~Kzj*s%I@fo-Ho141MR$#HrmGOTi(pJ_q^3cPuGj=F zH)To_Gd~jjAy?+%p}lzJqC{Q`CO%@(*gUf@^typDRFO6>BaNg&5&^K14Z|29XzjAE z46*W5y_U;sZuCsDYcV-+;%1N*XWqfO%WOqoqX}WX3d!xBhT~6= zsu1+zBwC-QJ8alv4``x(xW{;o$rqp%UWkGNwkmmQBR(wolzIKHjVIz<*JbO;vl{v$a|U1 ztwL%|V15g6u0iFlBtC@$C+{wQDtk1Y!GuMA9DIbrI3fu<;lm&DO}@c*AiZpys6?+| z27D<|H2xJVrcYdE94p%eo6=CI%hTrku)W#~E7y$D!-1MpXd6BVD z(;v0t(8!OE=!^G#V7BI8&EJb1ba-cL6bbX+E@1crk)#4@4jc$m5|iMlq3S!8bX;9! za%p`A&gcBY$f+CrlXIjQpI4+NkXCgxal)t>55)FI_~Tv{n8AlGrZ1OGErv(w?i5QAAfAiFa#1VAK{NVsizG(I^a@X-Fi~AO0Hh0`Enmm!!E*a5nerAVH z1Yzk6-f|6Y0mmJ@9>w_pQ?0GQg?qq3Z8uAAw@nZQlQ7Hr;`0Lwty~^i?!0v^MBYzJ z;aV|Vi`%u!E7!hGx@hW-vtXf~W#6gmK$Nh*2=;f8U7L)&(2E@%`hn^_%nQT3&7^cE za~e`VK!8<9Pb!J2KJgJb=%8Y_5O=RW7_;?zv+t1}_|%WI;_NSZ&);gTtECbSB+0>V z#Ny=6V<&O_PVfhC%YL{9?%;4cKKD>*N@mW5du9C^ce(N_Km0+Rnsi_P?4jw$!~{5s zjn6%^3da0S+Hq7fXwT~UcBLO$$+W;VMA zxem!IdD@oz^g5n8Xq)!+&H0CinsQems2(WE8nufgO3=WKj#$m1YLPpq1`c-%;n4xb zo`(pexAfQT6MJtlT)9YJ{iX9K_wllCxg@{RZUSErs4V94!V+8LS>|@>*YzXb*c43; zYD($!hi0%PJ8=$TT)U@FO@tN`4$UnbcC$1)6guY6h4Kp}S4$zMs))@CmN*3PKUFZy zg9NKvMI=#$W0>1>rS_Vq@Mq4);u)G-xieI zJrxmt&|*Iym$Rs2U~A97Gfr*Fz8O@c$%T@%Ue}fbffXv{D&w6EBJ_bIat9ws5%k9b zpIZ7jlLkQ0=@0fql9+OniLqGUxq}_@=8kMJmP0c;ShBC*svfryq}^X&RS?Ox=e6q( zL3_zlG8PMG9+{5$vE)wDc?{MdgAhz4DtBjhnL!1J>tx_mI{7ak?{m*iFlC>dE`yb;1vi$7<%)F~J6; z2|wIXA1>{i8+>$A-fA@X?5tVmELV9ADb;cRct@6JL08u2VUi|!)vw#_cG*0mns{B~pTeh>0VD1pxdI792B29;st!?wMX z)hf9VB2|ZyPXy_Xe^db1LP}??So-$a?21vMkOJ5_Q`rK;sLpbK$>QJNO)ws&l_mZ_ z4wpUJ;q6n^ZMA^xnC~YTeY)C}ui$09E@7Gj9a1JvDx5&(P0=E{lN+kx!{c-2 zV+xJYk9+$xS0OO=q!^zci=WxPX@4|7VG5hM)g^OmY=6TM@3RL7E&*^WA_l^Tip??F zgFPlAjpuOQqfzhlhs6xkN!)X1XU@H^MOE+m=+o*jGuDv#Izt6Y{D`Rh12t4`p65p3 zNcb^0?3&3&5Hk3A9*T&Kq6H1C3QN3kGFpzxg&;V ziM%GH&OuriFG~q|zO=r3?L>X-Dr9^=Lg120Il_7n$PxEvv+R! zJ-<~*X!qPbldyxg%XX@muy;bu3h&6BRfA1B0K%1vXpoe6kQ%aBxe9rb^?l_e@+%vO z_3Bp=lcV!M#mR1zDtJ&nJ*K3c?ne@+7j?)xUGiZELH8J(-jm6pbF+rhJ`d?lnUX1z zQwZ}IVZAyrP_5Y>Zx>V6SZ^?ZMl;r4QnS3x&aPN5uJ|4~;f5Uo(G`ojhVb3(=0i^m zJL)tS`QgojM}-F0b1~!ZG9#9+i+#NWQ6aohe$<^*Q2#6(o>FEnH!^#xPzO&xvG-Qu zmj!A-N|yjLI|D$_iPTuUTh6L>6%wofZChkf`8m-(ZOFiI^ug5%Fe%iK%zFkunGw`oPgPhY@1;%KDkPyf zq#a%H-R41lt=$UH{qFjJXzSu!ihK@dMGPgshTZ*q>;nQ5gS$!pGcvBJI^ofcfyM&lptx`N8b-Z<=Im}8Zyo5bq}q+({af=AT{MvF=r&Z^QYVU_KtE1 z-es%=W!|%3P{@pucV23P-n8Nlx9l>PW`&3_UQe+)gta+3XvksO8`D9sBqq2NVwM67 zR{AtNCj!)-AOEq$cu!n(no5wn&#%@|F(ywTEKqzDn##d<*gOW!Mu6f;OhF@D`U|tc z6GSk$$Z+U#{(zH)k|hnet|Z1ACU7)H~fry8(|`v`0pt}t%$PJ>+S%E_#7 z+tMt{$XoN`Sr)I|{rL9iDKDiwX?}a{0&~*W1>|_pXdQv?6@Hhy^8S1r9cC3$^IE<% z7@Jgj&lKlVdx|*j>Y4c%hRxO+E%derKnjYeyYIcugTLuhv7A5T?T503D@_djEL+Y- z*rk4H^f&=lpJiSKE&N2FLg7=)F(oeU<4xvyVTZ%5ehB8M>-ls_9h=H&ivHB&4kLO+Sn?ve!I2_Ig|_$n|o*sglE=IJX(Zr*|lncO`U@MW15(LfTg$ABxXYqpQ^)`IdGT9{0najCgbM+LOEIFFzbL2&>SOUQ~anqbU-= z{`_hjTY3#5Dw43-F+jqsbMmNyfN)aRX z@ub!d^H2H@@ond-EE~F8q+eN8?-`E_^pf;+OtwXveQeCQW0Gx!y>E5` z%Rxj+J9&tg6d7rUQC#OwLh1dG?k1B# ztRRWSTe9wzg&ENoWzlp4>3j5>dgNny6^jFdGx&#}h29jqRN`sXe>O}xI#<&yoyRwi z^$MzXsBlq1-cuK(YD`T?A0Tl!xCebOS%n07DSMBAlEHSjNf9#RT=(u$e?qg9o0Amr z+y3a&X1!(4r3262X;rqzyzuAHnVVwh4unKR9-V47)75liuQ_u3WP~65N%o`Z*+YjE z`aQSu`~J@@`+)c ztVTAmDWGXJixVB3@g&o$IisgT26@sjM)QkIi{=cry|HTLAJNTRcx-;yV|6N>bI2D$ zr`~`R;6~VWkHqYPmqt{oS8x^w`>~>o zap&#C&~|qgXzSpCCdaDl*zv93;sYSxZy&#*^7BpDk?=r;W&p2mL2j%^^>&vQPqzXK zf9e=+(YSTwpZRbBk6Z>lu(`}`s zYx>8(WS^}0@cDMzd9m;x(;ngarKNo>;ItyPC0>I4+|#m zK^J>^IbAS?F05kY`3en*rn4SEfc7*O3Q zvEifxcoCHnIUt{UcZaqgHtt?{5>)8gJ#PmXC=#6hwC7zp|7(SA6_R2eybG12HTF|B zYb@l&2_a2ojs@O{d~s)+aItZC9~|33e1*E~;0I1JDPWrs%peAxEBbV7kM~<+X}(Jf z=?CpBsVwLB-*5^S45sqnW>?FJ!4?rSNZWlrnCA~ZMA#rhch@#ozuxn}Ntw~03|0Dc zyg0A$w4v7$oBydNkj7j+13?1VUk4P3;_f;GPNaK=$!+fY=(GBpX~8xL*2g}ZG%B^{ zM-<(Y{ql8I{W#Brk18|NATH-Z@-=T5u-akZ0Uv$3;22$XS9P}9Zlx+1>)sdT5AGH` zikbE>XgKdJ0Y%<~)P0)DJ;)s*G!|Q*Sf7@dE~dXLO!Ea&nJXdfin9K5QdK{pENV3P z!PWPBoX$HQrT%IsZ}C>8Zn9u|O<=B3t}WUtM?h^OZh!CZ~Sge3I8lY@qaR($n&}0xqV(@O2axWWJzTR`VCU(U~mQ_eSz|J(z zm+rOn@v28V&uB%Ep2Bk<%w*!_NQ1zAZ&WCdnpV=w+l2*KzOy_L=y1+_A6K3|wlAhJ z;uP23g4+`O$DH?tF7w2LU`+rO>ID=|1X+W?0f0PYGnZL;-AtvrG%~_+q#UBKuhY4u zSI}lJ%flnh_L6ikQOyXUhodHYU{jUkmiKGIUR()gaCE5($ws(^JCRY7jWet{<~aB* zvW3`t<%#oU549cRLcwoZ--^Cx4_vUV6g&-=Krx|)#`;CoRX|NS`sy@&wT(%4z>gJI zQfmNPHPIT`|G5WQABvMO^hXRI0v0*v<=Cz|u(vha1#*(rf3dK6QXqqd@cwJ3uxI$x z7yU^WyPjG>K#X(#xKN!eHRE8yrBHWkrMxkxK1uv!6CzoXz*CREqBM7&!~{#mRgVUg zus(({nrgSWoHW;sx*EVLrJ^6reIV?ko~rm*@cCW7x!ub_&CU(7$ktb4*vT#h;3ky< zF0h{6m4*j*5zgXXd1m9DWrqG?jW!E;ZlB$I=YGk%#%q@W=7zOIrzd=?5%K|nQ+WwY z(;+yv5R1wrFcKe1i_Jb*g)m;RxQQ;$FHb2S5#r_MKlMmFYpkxG*3vRu;reCXs@TS! z!+lou%4T)KG$k2X!yoHxUl-rkF*uSrc6`w70IC3nJGyHrnr(*dmS;cCSaE@cKRxuT zdCkiV)5qOdAkfm^JID3_VJ*wHy}N?j>ke!5LyobU^D0jGdeuuiyZ@I zDvHplwUcMJocQxwCvxj%zjm-^_;(VB0H>b97w2V20UiH94hBCAU=+tBm@X1(78REVr7=_4(=kRd5!)7TlkD>I0Sd&@>3XrBx1Ob3v8fD&3mWqn2e}A>BTn8#pU1SBVbdj zmC7?(@TNnk65C%uf|9(adNZ^+lCN}-PZTWr*tnvRv0?e zUCk<{({)*Ya0I@yD!L+9Jdok@fhbp{m)DZtISS*Y8xWOy6n41l4ukJ%95Q_1CCpsM zi5w0x-({}Q!tbqg31SLhiahG*g%!eS-gIoFRIvVo{d zB>6+$8-1>!>7nv7j-Dw*20HgTo9|ZUL|Vx9?JrzVb7EmT9WHhd=5MH|n{2M%XQZ~g zCn>ZMhL#~Qg1U(|gP6WIinN!ouk9$Gfmxpmf>{^~9XUSvbvkBW*aM>Uqq;(b2m+&R zjytv+>q~sO;H@-*oIalOgcd$zJu;v5GWM5c%|HqNP`+Gg=0=P zv-$LxNMz$L`P9ql$+^`ua-qK(w9Pyby0kx7<#P`&%g}K{nx#RPiW_@YA@GhjScU8t{A4a8wmTHOxg3Ex>+U6K6$g%$5O$i|v-ZTCj(kmvA!1?m{Q+hs6P%}t zG^lbW4(3ufD>Jy-q>Y6MtEUg_WZJXK6YW8{IBcYT8HV+Ps z4&p>zzE1mN_}~`JekP&46~Y9KJVfy&Q-!`@w(7j=$1Qb^pAQBFOIGT^0z^jv5V|T&r z217~W#MFwzUwC47;`+3n>XdRfm?mDiQWVrC=6+h4i!>D&Z5I`&QFk{>yOO!@{jnM@ z=AcQsi-F?XuE#UIy^5^kb3SzRxNtfwQdO6_Z14e`^_|n4Q=N%sH9R2NthNwo7pdKA z)Ps%>xB2>PSewHQ9+^Xjh>s-fq#-dprILXuRz?^O=F1RxB7m=F5noNuAf*TCFL`Nn#V-dhJwxC8HeiFcDOu?2-ee;?;dWhbhtan=scH15Wrmb8$Myl z^>e}O2)f1*?0o4CT#U+@wXFK0DU{xC7Icun220jUEwh5SrhWY>A+jtuYBkM-XC}3| z&YKcEaPVPC_Ik&qS)sO}06eDjk615ra!s9gfMdzg>?cINc&v~RWA$jlSw zzZnWUNyIv<2+hz|AB3phgL$aiCHAm=P*l*>ttweo*Y&^qReAyNMt{5z!I4-@lKTeF zubW;@I+mI<75mPEN6gOB*8fbg%n{!+S|7M>-q@)DRXQOWAtrQn++qra6H<8$x0ie{ zSd6^;&I-TH{U*LvL9FnJO2%YS@c5}T>s{w}UaIsEqv1H#^kNl)kgVTUC5&$n?ggBUH%zTKd^_69!fHi|%JngyKb^*Vli*STCL zKhMm5*nwIaQuT$(q&n5k%x9DEmxH+Di6mx}H>R)pCxC_{K2%c*28APHXJSXT$KU9) z%x}MG=xm|`J-)L)WzT3z-|h6~=t@KYx0zFs!rf9$&^4?b+~sAJ<#i7CG`%U?J@kWH z`_!G3_}hKSC1s`dKR@=DSiI+@@|C47@mKFm+U^mqmv&G`sw{Ak?LLChXTO&-?rEYI zKTam09~b(8w710646czE>eYUHZ0HtL`;?W%{WEkgGVa>x<(yM_UN(&!)axsJa?rN)V=-5uHx~w3UvqIS<@6#Wd{-f=G&h82J6xX;aV*|d2Od4^i@?~<5_UNZ*JKyY)&`q`eOZ#-Q5CH|(fUEL*nN4*5i0o? zrF}x(rAUm~Ad(+qn8oEJrx%Cq-XS=%!l#1k%Ez7>e#<93YhUue{iRjcH1?&B3}B41 zh)O|__>sx(p;$+Z2sRY0ms;yPbCzv##NkP= z^F!9Wl7#*IFhqgTS+@T9cH3tA*Y}##qu#TbM_g8g9FdS}33>2s#(ZWcwxwxXk(+3q zX)}+q_zfDd#NcFO%?7;?#=U{03wh=|PoL^odAAqS^%nuo z+%`9lCVk@#T8eHx+r|CUSN5!9_%*TE8di>b1PtOmVlmzJpi+h{FR<>DX8SCk_l845+{Am8--CHgyz5}lD@-MZnk}2xkf&* zO^m6GFYMBkP`bc!@{Vys`S3d1jI_qXCm~u#)JCZjKVDKtoE*g5W}6vw!5{FcIzr&V zNH-ee21oVg-F-eAy?A6_pb9nBdwW{$rpo!tr+6Dw;fJmlwxs3~fE-l`q}ZYKZqR;d zM%%m-#8k~asGNNuqlOXTW3md#LAW+o3_2RNF+e;G3}{I zI!)74#=P_1Oo@}qCLv4*v~sr2U_VU)ytc<$Wy5y@JkAJZguoW!lt z#y**+2asu^N$JTz?Dt@JK61Wf*S4?-WznDX>VmsvtOJFs5pRIK1+ie8!`&zD&(&dA zTTIIy=(7QhD8i#Bd}U$MZ1S<+>0;mW!%P$HBdg|i!m2ap)r6nMPk+r$aShrOBm z?VbCDHT>;o?Bg{8b5nMotgjP(UHGl>#*;KX9@|vS$kPS#!o!-=LHPY%jCp}|L$OtZ zOgN)6^u0%k0_cNzC!&ry2!AQ`hVm_9G!I#dmj8hgA&O=>|2%To=$!J;oQIg^$B2Bk z=|;Sg4Kjh?jq@08=0-PA7h@};9Gpa8)2j95Z1Fmb$caSk1V~2us}L*rBZJ6+BgA{} zlpHbLrj_Avwy8F?H0zzkO9p2TOmx7s+K_l^RF=3->kL=(9D$gDvT#6KVfW%*`>>JP z2X>TVYO_vx8h<{}K0CrER8V5x-%t_9*Vy9gj*Ou#nKA$V9e>TI4h6ckH$n5I6gfSQ zKVu`7ZoP6hvgp+x#U|e9yMiT!Phn-xkGM})i@r}6KsC}}iNr?=;)u!<2-`z$SQ}iP z5BkQOTjJEm*B4DvA`c3%JmVdD$q|OQt1R|ebnFL1gP2n>&h{s~&?%!g)A7Qt<4{^@ zixq%V_skJP32g*fT(TPoT41V(pjmyIn(s9(6pnuuFp{BXXLj6Y57fqQu^hv)e{gL*sSNX_vONN=>#Yey{Pl1L8tI zOP~`z1hjPif^Ue>_oeMrv(WsvL_NbnohFoDjTaCG=#D%^5O$@G#w}oWKSV6twefhjBi(A3qn@#fn6uSmxs@yj65VJL*<0JhZXjHBMEk~h4RvuvGIV#q zW_$Qh^X$&LRR{~q=+ZqoHIEdWn-=easj-6veC4Dv;?y7ud}vS;C&W!$ zeo@?5WWT3%;t^W$a{(W@NAh233hMK`t|Xtk()F}1AF5Fj9JomN;UI7}z01{1^65m{ zc{AyM`>ROnC)CCk8fNaoW-L&FQ+_I4G=FX7we>y#z-;ZO?8v{Aa^7sWlxH5;OqdYe zROEM5>F@UEgPo_8Usm80Rh^O}|8COS&(5&0cYRV}kPZelup;b}CV?+<*z}btiK%mF z5Q=`h3b{g1YBw>*UM+dkA<*3Jcna6OjG65;xpcl{A20McGL9q@E#$7QQ+wQgOgbu;{6#obyk*7_FAB(_N9SQ;Pk( zA|q&hodIp-Lj|f)q;ORJb&YeQP|_hEmbu8sBwk#x=G-cz`jyGNV)ufFe@#Ggss^^$ zH4mv0XcT3}c9Ts*Y~>;`5+s9ZHk``j+-XGR-&B*p zwf&??NA3^XmoWxAK{cs#_CAt6X1x1nHO7L(Mn!z+b^T2*!3(E8GD!F3yq|dVg`(1# zEQPTj1uv0p)ZUqkhQl(1-A*LN@wwU`C*f5H-i243QySa&g^J2rkHIvLU>UE#G2Dz< zF}XUWJw!FI3+sS|we0a>oF|^V>h6;rbJw&|GtdZ>NML0C`TkpK|-BM@dYjtYl9#&HNZWeDB zhx{WS>D%hxstBf888p%pZ-*phJVy6K>FTtG^+!n@m`^$GVB)VQ@;+04TjopscW1J% znAEu5=(ypi?$fDrbN4NLb=+cB)Wy1=KvaIx?I_`>bn9ALu#bT~+#Va)jT z{_>K&mm#%k*kb&>HdL(dEhkg$fcw%eSI=Ajlrkx5^?1sd|F}~%h6aj75_aWd9V4+N z#8Mv)(&s~V*hbhc_rO+Z+3JVQSp9UoMx2ss%`;v0IxW%9ZiQjQVnk&L9HYh~*&8~v z7&=ov_xU}ds(P;JZd07;XBvf|L^FZBx4KIbIo;d7&Z=zhA?dUoLTG}GdfSP@e{>+aQ?jEM9_~_)cQ60>+_n zhmn}ly$16U(_gP#8HESCu_r~^xL=5N2(TYlZ>@LF&5OD@rjrd#vqV4m6!z?fn(VBT zLFi-#-wBq>bF0eTM@S)_`+~>uXHaWP4*^%bEBQK=8A9!6kVP2;EUI0x} zTr&8?;WN8!?%>#mela3Atz#%Q7NhOZn@VD~#28l`A$=}JLc3nK_I)3Km7}Adhq~?E zZ}E!bN$Xpk%deP1w6f^=_;xs21f=#Wn0X*;L+`>_$Q$DBg9P**5sW@#vUH!IY1`BbVJZq_X~5kP19-c{64JU@(>ag(%zz}h-I zCs`d6=ac!cMEG^8iY!Vj$;lW6d{lhlYBia=p5u-zNPoNop_ z#T9?1w3H@JAO;36;Io1HA{Twl;pR7kwoXgHk)-T9>yOZSS<{hESQ*WTsd) zx;h1MdUlM6zr2oIc7CdIpP?iV6=uL5O|D-M;m1>Q6skXJIOVKCZU(tLJIrTF3C(=SvC9ke-CnRoIUwn z!cxDM&RJJALyYO+NwMeU8uqMhxz8H^A75Vr4dvVatt3T=lAS`7HM?w+eM>^fI?29g zmt`guvTsRIlqI{#o^|XLlAS@el--PF8fND1z5Jf%dC&8{@Bh5#bjBGojk)jZy1wh@ z^Z90$u1q|`mq0cT+_eA0zs*r-)aAJ7aFZ(da;)X`6C?^`dq2pb2l?=Rgn37zd)Vbs z&5Y+N0&}|b4c-(dIbe)Jhwa3MlW4sm7LgKOVeK5T zvi4nx@Ry=jnB?I!c>stif-%jSQr7G2WvTGF+w&p1+poWFBFcI`xNHk-N|<|EmK+EG zaj@@QJFP4vWgMz|K1PLypo_%}Z9!LXT6yjTuCIQERoU9=C3lpC2xa)B22*B_LjctB zDQUBIQGBWw?}5$PY+C61V;OAR&X8jE-o&86KXezeHy|W02@+yOviIuZ@pZy`t}0VMT*5sciz6 zd#f1cjh^DUQ)7Wb$deSFa|gj<_X~L5G%(Moxk-G!e^l$)@kFAVf%^tkm^NrgQ{4sb zhyIZ_q~IAK8pm3J+K+PeW*R;U`?&XyK(^{%io`azXc9~uI!pDJLYsOKP68+J zr(5?I$)qvxo`O>j57ELb5N!(B8xgR*N7>AODZZc~t?~^Xf~XvcN$zgaKs`CP`BLkM zjV>cts3ptf>Q%(6h-aBl7}z&I;Zxj`_(t+`8J+})v09R_v#{ys9%#(_OLxCIseUGH zm5)0F`^f&XeE=fT64`EzTzL5h_xRO(O;G1fe&!e>_{{M1il+djs0qG8A1<<{k%NRJ zI2U2yU04H`AJ+jCEBr!2StMPLjw8Q4m#_v%LirRGKmV?`n9QT8Z*6hMXM@BL{R~;t z+Xa8lO*?jFTpE5ZIOE=^|3<&7ad2UE{pWy)5uGn)W-qRvViNAPFA>n3IGnWi=VK=0 zk?kKrSM}wRZ@;rTQ(o?U!TJc-ni!ce4g_t{Ced`=blx5 zc5bS|2xG%LUH6Cb%P3#+JD4*%23;%OlSEHCLAY6nbS0#9%T?aL-=TYtLC`!U-O54Y zva3KEYa+js5)F2rI8Fw{y~6qGf{b{y>&^>UO;07eK6U2~gZjs5Z|n5d$$Sre#?3FD zu1XH^TxrWKfhOjGH$(D~Ci7T>A%Z{>AZ-eu+xk=(NjIKi{@9M$N5Pp1A2oO|>=W-x zq@F#ot9riT>6x*T;5%Sxo<6@HBhp;Mx?#Q;S6OOnyuhFrfQhY=j+Mj;(R?PCauLnn z2Gl>)C7Oln0G8QlK=1#67`G$d6KQyV#_eBXMiFukfw*HtQW&f1dtJl2J{@wjS^UkL9QSTT0*`Lg2sJbbvGTgwOOJ<~?9e z@dt3}a#83SYa5LL$iHVBw{o=?9YTx}8`Kj-bHa7WQiaFbT?q0&Y6!V&K&F3w65%6F+1pc8d z39y^m326cuINoo7*#Uj<$GLDz)Wvy5E(PfPrl_Cx3M8*O^yt;U`j!`fuvBUniuY1P z)^d6;hU{ytaw8AgKFf-k{rX-%XO(4PDj1O{Z((nZ z??d6L&!>E!EFy6dnsD$1>Mk3(r9Z$pFwPSUyV=!uYR2}zB(!uPO4EsbQ=NGyvtxlkg>R*sYdD94{uULy}k`C!W z$kL+gL461=qFt5b%tAZ@$_$nc#H7NxUG<&p13z& ztv3kYmVT4{2pJZV$Y!sff`^l@C$Q#ANRc!YHm0}N{B2rEG0baVo6)KEFkxLXa3q<8%Wdp-K3am zfGp%8aW4Cn9-H@jgm>gOQ1L+$o#YbuC#Zl@RVm}R@0**K z?D?IUkD|f<2q(9O8GxVrp=56y;oN^ofRL>IKatU1Q7kv_$+TApK|T3d#jXR zTg8G~#iQWVN}f0^tr>twn2b8GF}S}^=jpY{@RJT1x1FOn>uOfdw8x(k9SH5g1`Idg zn*b3_byAKG0-ZSAPjIBl;L$1qjz{IsKcag(#yo59cWj-pq4-PT6Z@CqvapK=t|=cA@c z&P3Hb9Pe5-+YGdpz0b1-pYd=`RTd%_iijlSR#do+hk(u@2e~wPxQP;9v^FqZ_}Ks4 zzhpL!Yb@KZD^&_k`NikS18u~B&wRTw(9N8h`p$I1P2%k^eZsBR(~Gc68zBl2ZM2S$ zMf8(Au7O^6Wn#A6x-5=iIi31foB82YWV=yozc}gQ5I$b^t=2qKn0EaPOBLnOubPOr z+0h*`z_{iU$6Z-vk^Vebm!5on@|#xaRmyG4;GT}33`c}YP)fx-M3)z?3KNb%wxpgF z)RB{v>`&RHzyqb-5hl``%?dehOXW(A^sXRDm->5r36#)TDcqiIWL?dVOKAo}cVuqn zR`cO5Fv3?H&uOT0BR}UHok8tG;M1bzfi;s0b6YO2h=(aZ>_HC*-o%82#T}iySMVr= zO7nW#p#HrAdA5)7R#i7pm#+Ujt+{$bsGud`ty|dVbe~mW)gk$O9{-7a+Z9W|sf?|J zlMZ0ZW}jMtG>-1A;Vgx8Jk-ME1Qb|DdG7xr9cb7pA?L(NQ3}sz9)hFxDk823vJm`hhT|(yIIi zY!?oTM4aeMd?btqy(esA>L^5e6$|hGOYy3(OM)lQ<+vy$w0Uv9Ica|z$cTDc$)o;K z*c-;Z@(Z8D8otnmOn##Z@=)*49tfEIP8p_9penb0g)3wS!y6Z?kVy$%o#HCdeWBWk@JWQ}ptb{?0 zozd8s0$NP9L!<2t;mqd4ENu;YyS=Z>nvPNrb3__?neV@yIGxG_^!2HLP7jby2dH2C2YLN3IiiOE^G(bAPl)jSS&MaI zar=*2zW20@W9j_I-2+v{x4m&nQj0^J!M4B&s7Q~N%Or4^Mwai0h%e}8S-r@5nyPu( zAwcE1`Ccgz9JKa|9ISzNlCL!(dhudNZwHsH-{-#+5BkLYJGxe4J~hZ2ttR&~(f7kg zE|&f%svP1@H%haj=7kNZ<3VEg3>Zl-!)Ps6v@?t~*nP?7t^IXx-=Pm~UdpnDtz*Cs z!DR@~jsek;3SqZi3epwPN2q6t)Dg%;_xxwC-GF|j{&Iq z;Q7u#0p!{BNpC2n%r&s>@vGEV{9gi`awKo`8+fsPnxkz3jw)rc5*nK4QgS8U2=m1v zx45vlukI?RCqxcP1J2#m5p_6+lQ5?Lk~eqpS>sKv4e6ctOPk0_f>-Ofv2dDqC>;j- z;87=*w_%=&(BGNENV<|Arit}f+R?&MMOGBrJ!(Gd>9u5$8y5Ig@@-&6l<7BN!MsZ6 zLkehCg#ig{M!k5?Q1qQ_<5frrcTS=hB#cPU3@7DSPd-emo#P;44B6hpb6N}ma9-^; zDp%ajQm5E2d&0DEqJ>1YrSZ$Jf$`8_np}EG9d9-q$ZOP4$c6X`-rE3U5=C$!+wCBh znRTf%qRj@b6)s`}k7(!af8kfhy}D?$t%=~!wk^QImc`ISC6W);aEp3TJ;AUo6Q6^c z5%X!;6tD;kXS-L7m+nghb$Q1~*1ke>20$toeBOE^Oa%+*96QmIYJWN*kx@~Z1j&H4 ztL2;eBF@mET?(d&QD8B)o9{#Q3VH^Gw;n-zqNmVH@Xd^p##>?Dx&5xrN;$sscb~_U zt$5>&m*l4s7t9FhUBnSid$9^LcE>~dYMfL0h*FcEPfxZ}^_e0TUIVh412)Iq|=HM6$)RnVhPn>f9a z&fRVwKe**BDgM}NjS`gz1>y{JHiO8%4pt7e)eG(c-lx7U)sy|tU40PB>NTA8{$L^b zC1kTLEOMFL<$!ferw*wmG6RJqq_;QW8hxcV%jWL|j^9{Pywd!I^{<$~$dmpeUMqL2 zz?oNCVA4&DgRi~=8#57XX#FrQ@Msyv-Gtpv3gU@HTnL4CdCKQ+xKr61v9lxg#(-Hvt?2>6P_!Qi-qJbzRwDu(XGIxe?u? zZ}_q{dwFi=0EHhNO=xIM{ITg3WnbC*u<$8N2*9J!n4AUt2ci;UjE4yzLHfSHo{)`N85k7b?{-v0iU*hR-Z;Ffz zvs-W#tXKa_A?hWa)#rdw?lRGvzvWKckA!T~Aze7gbwLw|H4eW=up%1H*3C(EW{&x+ zFPz&R@gBq2;hkE120!tr3KXK zV*AD_jlJDqtCTDaj%agEtpR!y z)N)Sc5>kpSY|9H@KzwJKnLiYH=#04Wmye3wB+tFhyp0#S`P2N+N2M>TFFq{gNs;nJ z|B6hB#v5e^Isri82&l-`2;VQ|9EE*G5~PFFnrg_|tulo4QIDV>VpVnOJFX5DNZrXj z)JB~G6aZV8+=&96Qm}{Y<>Gg=SbCrv6EeZ{3Y}hcN8T%~Up9`eO1?m|uN33BzT2+D zuEQ1@xw$jCKxIk?nPeG8DeApA)_O$C(G>a=Ns$g&oPXQS21IGhiRTfc^JneJ??Jl) z`2tDtwglPXx!7W;ZpJ6?z7Z73z#ab;3GNQp)M7*Bx11uahYhv%=SpVJ<49#^@Rwsh zMhe=^kV~4t(2*8?hkFlri!|DM6wJ2@N$2?%c{a;&Ab+J11kcE2Vb@)k>4dv%xyCcJ zKD9`mfz@tZQp|T^tl9=-$EcrF9>x4V$r9wRZZNFo4&kaNdO z4jsZ4;T!jm3#ouaf;@C5DhHoHZ&SI!UOp_+1=|Io9sOdi)LU~Z|%$KvINIBY{8TPT^#^s52$+TuS!mADb=LJp;d`UQYdj-`Fn{yg zDT9K32A_G+jp799Gmp`fDvGnn&@Rhsy(1HT@QzGQPV+yYgLnF=Ufu#vuPK5pOgGPG zbE2LCxhfqd@mV#r4{H6n(QO>G)(z@u?|i?!3ylP`9#Wsi0^$?Up#yW8Rp2fQgs*e??q@fYxz z%a;%9zTf$o(tE#E4961LOtomE-ny9N=2i)txj$GdO)L_&e@Fh=w zfnDbp25RI~VmM%rD52A{bE`Zj_7w}<^(8<4Kr$Mh;1EZp?VPEiw6c<$WliaQ6T$I` zk61yDMJ|-VJ|&SZnwXE1#EC+|Lqsd56NM?A-nU7Uk!^oZy=&W^;=C@- zPyLzHMZ9FInmu=`k{_wEcEfX1lkfkfP(%~t(a>401%|1l?nc8cZ=&p4aV|*#*P8F& zqOSSu|k3Ymg81qAXsZ(9db37My$h#*F*Fv}%M)K;^ zRAnCXmGe7ZAcI}M@B+=`jR0#0vIR;)j)~_UCitN;bC$AJjC7+fLf5PIC|yi;51zz> zy|qK{)(VPJPj8Vfjvi?4{>atA+5&Il7Hx^!~b@0jr=r5ftv8Ss@obV&HK~ zC&Wn?1edw2*1CHFvOHi1Cr9+I+F*#?f?l zcGvH72jQd^{E%H6I{-QL~Z){Fwm z3smAFRefDT+UzF>x}ID#HF@mm?x}pRKWsT;*)=+(w8D zR~>3qPy`}CN+5!(JLhXn$Llvcu`^mYSi6A`yh;QBp6_ooVm|Qd_wnzYGkb*Q){w;X zi?ufzM3O*mUy7VEhiI-6L8(kf<POCbcjRLs+5grDJ`_Y^1g+fe1vugQ$((88azT31 zGZpD6D`}jiRfBuw%(ubKm-7UNr-*pwEk~O!w$?FF$&m}{*WuO>uf$g{E zKX*u%lJFpyjE+KdV0Jng=&j0HrLm((uV4$TTzJ*=9U|y32L2KqUcfcEZeEM~G_>1f zI%A@3wj(`57Q=f=nMG_>l)vqkmP|l#z6h+kv3c+5nUeP&Y$a}e-Ir6Czvu1qF+)*s ztS7MEtze`HIqLz?#S&guZM_mER;g1{_ohAEq%&pla=>rVt0}_XmwS&;*Bh=@Lcvuk zcc_`y;8d;BqwU$+6pG%(z!%MRbA9 z^$g_VJ=ZY@jd%m--KBDr8#+j)XmM)bZYEu8!m_E0oXRNZonFYOKv6(_wW z*I8%<`y%$vPV%j;-{nIwC&O1%18%nqnu}|@ex@9&8OJ$M$y^ds!JfK3u$Zmts@F^mX1h zs=(0^L1wLO#z}+R`)-!4D9-|yS0lDRtaVamW;&YkGo7#SB~S+j3B@Ywl!=Q+z?*Zh z-h!Jxur1IepgM#7lTbS&nAHh8`;^dWs_4ho_#`4<^|OCq)9Gc`K8ISn@8jKbQ+#xW zJN1K5N@-y2& zhpDon>{~Y%jR5@mGy2lLBRpysz@MM4LSO&zRGE`5?kveg?GwHEZsA^TEOW7?t9_`S zpw*SU%t;lsYRHt>PK7MCu5{*{+`9_ymja?=6tF@nYjd`A7edwLVi9z@qJtwEu*W{{ z=U%e#MGQ^PigZ??Uc0#}d)&@NW~YIIJ9GM&0%tKBkDiuiO{SD~IbsN;HevQe@h}7^ zns8vr=p~NDl za^DzT8uJh|mb|38*M0fa<|`Juixd3!I8O;)Oi%$ z&hRwNf-t#UFjvXwI{Z1q5W9_4n{~U>a9VRQbKBC}~1V4^q;Vul#qTWRAUNFWWw9 z>o-JqvLypzj@~-^5lyO|P?8dZZRE2ogW?-%iC$NY2ATpFGUTc>e+Dt^gB+cI4j3o3 z3PS~v1|YW>_@T8dW1Ei{w;`HKOfg{cj%(omrn`dC78IW5|BOffpNj7P`Q1=y;_)0+ zP=5ysq{r0PfPdBB)n%v*K_b}KS#&Iph(2N~5`I5`0^<-f)x5f6ujM9p{994wXb2%oeoL|l2(T*%-q2|MjuP{5 z*sXZ@^ypF~Mz)>pMC-=Mcoj3_{8$%5dlDIR|6y1g8xTM7Efu4k;L{cE3E~SX&qDb3 zR9wWA%!9n>R`!ra_Pc8*iz% zLp1PDr;6ZrK^BF;;=ITf``EW;?H&^^3GU~MB)1Zp0%w*Rv2EqYW z9G`=YN2ri9!<=)2_q4(&eR6Gk16Cy1XnC)Qb0DkM^Fz!Dy*-~#fleKrJ7Cw#^dm0@ zE9@?7k9*!(_4W`i2+5_zKSY0}Tr?+Ls)lGf zu}*ES*|dbirG^Kr9d4uQX7%rx&3PqG!Z(p4d`D`8h%+776R3LIX_rF-5+ z=+?2?n+N4u&W+7Ye*Ayr=tpMtdP|iO^(FoYyo-4WFj!z!@4yyv(HBAR4zF3+={4l+ zIFe1UJ3Fc*0}7E+14(+LC+2EjQ*bW@syOW0zv_tRz08ySLUw`X;oI>SL*9B55)E>z z))9WT5!mH6ZV^Jk@*Kxv(v!^`qY08`xaUV#{BWXEQ&Wmvl*E)*5T#(mK659g`?t;& z>R(>Z*5K2EBn~OC*n{ITJj`HVfcvu6TdeERgU_SQjGm7oRfa=0R%YFVSkL7%W;_*O zGYfi&wYS8)wQ`AU)IJy|-Xw92!kmEQEWokOSO1EGVYUGIn=GfM|Fr2G_%(j*L~_yE zuZwd@A$aXAlWzLu&zT;>9u&W-E6P87uMsK6oJB25LG=D$5iD(k6MKMi39@a5(#Oa1 zqHL=|b-i`9#_L2bjcd?qm&uV>&nj!uX3}FNdZFwOb{{v`4d$Z{O7DAn$egjotYd;F zbUsFz3gH@WTuFbKtjfw;6<;PhgbR!2K-g-#y+R{_&1ytqwL|9#f*IXfAhT8(u}XSo zE7r){x7(}Hg3Q`vsu%pKl;z5i`poWXhTtJ&cDl~Jl4&X+0Lh?oIZTzHjHA>gRAZB@ znz55H`)m`x?~F?yTGD2@nl~yWYiWP&%)2fW%x``j3=Og% zLxA$TVNG71+YMf|Y^Cp8wA0p}*52sK=PVK5ZiYIze1Wa!8o?*2K~*je36cjF?^CKc zL3|j_Hf1^CSYUDl_2ltqKf+-AhT1$ef?1r}eZP%v&`<&61gN5%9MC3Z(@p4hC z5$22FmTe#IxwAW^mwX`%1~~Hf;zBl2KuQ5P*p`8Z@{kAy@PMhK{AIicret9>=}a#t zO~^_QqkjG7#Yhs?wKci(_fMj)Aw6>lB7aC1>hVmq&7-aSgkL-tgX`w3zGCYm-^hrn z{-m&Tbnxb#nH}PN;7?tEe9O`c;F5nSwhoCVGqbMqJdi{%sw*VCPjMfQcGss&d6s3R zdWsc44Zmomd6Dt(Zf0J(LyK+n(-o1 z^Eed+0!*Ep$&1cfQs20g8f@o}CJ=4(sQ0dv2pahNNJ>l7oaBf?WqF{wUO}G65dLa?P0WR_( zN%Aj6WERen!@zzS7VCM^E%Uj9{-q?B6)U33aAn)qXFftHzdlpG)Q}-Yqz>35>XxL7 z`(v_u!pJ3`mnvXxi49_&Uy;0UEF2)C4^Un0OAH_%z}s25i#pLh4q#w$spvl?r%SV) z3b8oRqzWa?3rGmgpOOtio?{R(_B%2A?zKP65R`4Sa|k!l_+nT!SZA8Q6pPN$g~7E$ z@s=&9s0X`N9>pKKp>)JTkXE8}z0aBqGRw1gcaag4Z3me5tqYwaKF-Uutl?m(8VFfRlm4$nDOXG_s}fYj3-}sA0(bN<6_e_Y41kb z^L%0s{s&`_Q$>aA(o-!G@WD z3tdPID>Ecq?&vAO;KSY|uBLq%e;JP|4WlFaAZB2+`!7HlzJFOfNlC5{^Q6*pE&J+N z`TJW652Zg(!A>N(=`CIdl``9mC?5`;;&ga(SEMO-el`WFKL@i6(Smh7wM>rl^!8{K z3Dc>ZRMK=SukS=$449D7ek33Nf+79HUy6!dt-J~J0BUJxOP6>z3{iUt#tmH!uI|Av zL-#i_=eG8(L$pN(p6#MeC)h;{vfAE7reiuf+MZmEbhrF4dGTceN|Kea}xEYU8HFnRg|zx!Rt>3S_8Mmv6}3 zotm<+5?d1!^WxOL=%(Nm_#m%v1-=fP^QknjoqdBtfj}#fe|7$}7byoYz)OzA2qdFOAGjS~SOo+NAwv(YoXIL+Fd-nu$-4lT>GQi~TGog?q@Z z>L>1Z?ysAYofF5qjjadP^t#!8&IT?QIIdgXNkgrfTb@RHGH*rhOIlga-1)GS$#yR< zuXv&K`sF0OTIsAIz373tt-CcB!WnjZz}0ji+vNgw0Qhw)v?!QbJJtf?3V#2kn4ogl zqgpMxXIUNeYWTI*^h$>N!fED1cuM@_(IhzB>M%PPNC%A2(?J&GOz4_NO~cD@)UELj zuPnW>Ov320n`SZIub+db9^IS3)x_tQS1!IZq4kvS20Pr%x=ee+n{+`KqGcmmgTE{xb1;lxGh~T{ zxPBP^c2l7pe@l*;doeHi_B~7Wn<(GA(q1}}S_D>T5BZRRAkF~z;`oi~%J0%>7Io}$ zFU#fAKoxdQ#8Hx4cE(16DB35ecvAP5{f<^4C}@gmaJe-nt4p#LYNi-EvGHW+4fd=Y zp97Dx(s8Rx786qZo_}m^8Y?F_-kfUKN8xq}SBP$ishnyxO=qHVm@&@q>E>d)zJZ|W z=cmU&lshY!lgiD_=BuwjF^&2H`2LRjq0*K0gyE|r@7qFm7*@@FAxYgrFIbGU{1jps z{3*lN=jty!zVRVYnOVyqte0qln1)w*Z`v%H;exhIan#yaYgK(s=K%RMqlUIMs+U&V zSH0efggH1fL(XUx*g_o)YbKtUDMbif66}Sa@3t2U>yzfM`EJ_2iL5T)no3l5-xIt$ z?p0f^W#ew1s^7o%#kFGF!L@?leyln5l2ak8tVW^z(FE8W3E=yJ?%yR9(Y2!tAX6$h zkr9O5==^hK>o?9euNq>aeev4UyGpGfwT&^EvwAR|dH1#XuD74kWJa1Bi`SmDb>FCg zbeTh{1?S4Uxhjj8bwh#DD}CK6#Tpp`y&Cjbx=`n~odh^D(rG8Qk*8NY0<+Q^1*CnO zBK!*7Wb+>^30qi+*mLg@!Tfe#A!oWzfg56D)$diNl5Se z@$;W1dsd@4TDgLYk-J$kcACVVw4_F4vST6X+16i*x%|TEc-Qa9M)c8{kLH@{Y=IZw z9sr;ObPn`uQ{Z?IHK5Qm$kp;Y=oc7h7QHY8OY6+3u~x}IfSvVSM&fSdSxX&gAg5NX zKeKV|6GKR`b+5(oD4OH>#wWeHLqMvkcl;Rfzb6*{4@1+Ke{Y$tcY!%IU?|Nn)cFsS z_22UYWtgqU0j1)>7;Iz7n@m^o&O0>ukMMX%rRn;TM%+asOB-DUVV#42!TO<>fPJ}YjBdl_ZTaTj~hYE z6b`;A^Y-jZBpNi+s99tBpH)tNf10RbZe}Y?!hj3}4J4s4?$Ft+=Cs1 zept!QnekGP@`&(DHrWitkgnf!HLt-S3iPAYNx-N3)c zY85Wb-Ad&R?Q5_3OglC++hch)D_ju%C3>Xes z!t7b|K}*s#|8#tSlNi0bVY|u&9I6Y=JWZfpOpHM;8H5@mg@z19w(=Vr0R*Or(@0nf zK^Y5Gg9IWAjs@{XQkZFYA;|`u>(~9_QTyJn+>w;78MNfmV05S_X)V24jbh+Ywc)d; zc6RrO=Ti=K!A_0@@3tW6fX6h_qx#QdTig5IkqGuibDS9Z+4)Bi)>G3B#@yScm${l% zIUXksy-I?zR8C`iBT00N%7Sg#RHK)NYv@jYrBl@ZRBuyhg_$YR(Byh@m*U8r8C$=Y z(P;>XQVjb^&*!O|VRnn&v@Un!!eM%&SI%3tJxgmNe(TK$>{s;d$~-tT|A~2&t*B>n zLPCM2w^)v7h5+7S`Q`SuE0f;cM}GI}iAHEl^|jwBS4px2cU=8qPc=4ZnLEyViH9~g zY6|0~5HRxV`jYbJcH_cdTE=Xwr;S-p!oHy(TF@CgB||6&k9!m1kOb*6Q9G{noZ+KO zT(<-^=2!;*QkZ)e3GLN9it(jL_)J$hMF}OHR8zRuqf;UJv#Lom^G7h|x?QrDwia-+ z3!pfmt!}9nmj8uk`E;jU0cxKT+`brOdsR+#&enzSAe;$a5M4(wU-}ZKcf?t#l+D?c zUWL#w%vh*&Q5$?tE702&sfM&e5d?p4rh^sQz)E1fHyal3?-OVGCX`LOSbo~L zTV}(4w|pD#aBxs(>SfA~f%}~$&A&^M@z1q_D^0j|fG*4n&_yZf){kp&m|0b-HjfOK8jDO1x@cohvIkgDh{ajbY7;Q5u~ zLfb-iqMJpRvV=X=btk+<9Bfq9G20R%BK0)vSH;=RF-}`?Rl;w2>5l2LQ5mY;|M|+X{QadsR%}?k?R5UHi@Aw{k`kw zRxJ8?fPBZS+l9o3&FH6^VxrpPS3A9VKkOtF!Z0koHG6Cn`%bs8ZQ zW?bL(1?6tGE>g1=?oSkd!{^x6HIk8)^zywtYIfT3)#G!c5>6^LYtxF=?$&D)zjQzD z6|7_xm!E1lbD~05U>7U2klgt6`dIl?e%z$_?cdDN0FvAGQvarKjnBO|b(1%bZ@|gh zpKdOgudtAqg8)n(YX#9f!@lC+^1TndGGAxq4ealjuFy=0KdoPUS>A}+G_-N#dcT9k zSRLFxcQ4m-_IsAq*={LP1k!D2`T{lFpLzNpi60+6}{O7QXO;12lHX{RW3X zOpEz;PWqDvw+;(ksM%0>PQd(j;+fvT_Yv%Uu+Q+>*moIm`)u@t+(s(Lx{R8-J%Q;5 z$^LT}ihEQSme4V9!nHyYI~ljUNCm2wU8pI6BV-IW>n%qW&K8Fxcui8p)XYla!Mz}x z)P0+TiN<@&RkQ7L$~Ca`pKZm$>fMNoIP)hY1HT0n_gcLIeRW}dMgZ_*_&*Zz(4~Zq zPf9_|FX=HNI$y8lrpBo|q>QE8R%j3D1zwQ^NXA1AVTbCr$3udhDYo$rtCwRh>AC@EQp zw=d8bY>Z96V5U`>5HlUenR%#>#|FTso-IH4OHuN8DTgdO1UEWti)TM{#{V3xs6|ed zE{mlfvg1emA2 zk0ZI3W8f1?lfvRlg-Ndp71j`-jc9CwS(ff3*)P#uItUypTn`+c!|1_gqD&p+w|cos zb90|m5{z)m5M2$hEO*2Fn{&)YNLduV9i(9#u>F!6dRvr(2tsLXeW;usBcIvJV| z@h^jD2p_N;rja2WZ)6nZ0Fqxbz67>YvIyXMV}=AF&XH3{Fnll)*^K%4{uX%Ie-ysz z$8|G9+V3%KGQ_9^iWp!_%UEVvN`3cEf-U3s1xR36dS=T^b^n6s3jjZeM5K_Y!1ucY zd$4oTy1fMPo%<#(smo#^e9)6p_5JK zr{Q=R>@=Wgf4~CN1(vz2h%ehymSKM;-8MUXHga2_mn@x}SX{42-d|ry6}}dIs(b#Eox8w$1I!g`>RJRpWL(DBb7o`;nQ@? zdIlbb)iDtA2dIudy9-IVW0SO#UnKqnoTRXQ<4xB5=b?hsu!)6FCGS zMLnip8*Q>*k%yM)%xaOt6Bwu z8PsZd9)pm3i|&r%vqg)u>Q=cSq`E6@Wo1KuVRHcF z@-GwLvC$##XW@;b_#$+_YKBUOnG=PO?FwKKr&4lT$(ab2HFg0MyNALYPzwAs3v9$k zYnGG~(59m~rgbbm)Bcx^@9*OL+~hIiDWNgrts&;@^16@j^VEm%c|-WJqidALa`Q8+ zC7C<1{tPEpC(-AXEPP*u7)EPsq0q zOSH58dk1WppsDe_G$pa1(ZQA3e$n1klRGx=WNu>9^-@i~#F~mh)iu z!)YYoK5yn%{~ImUyfp$Mp1WT;D+bPa_DIY`z~gypP$Z6bAWUckL!q{n^qm*2hN2Y? zhD8NFEX<%b_XBSdC*rFtmnR)`!Z-e~^qEp53T<+2WLDSID2^E}SuLSR>}QwyO*4Um zq3$gW&Hu7nu4I&3V|A{NaadX)4sTMuLoH>lN|&IWr;yTWTi)V>#fZu0|()M7$Qz9Dy#Hb3`5 zO2V7SC?wV;eIb<=m5Am(-3@E4!G4SU!X4)qEx4AxvEehTns0sDol_#7ey?OjVO$oYFe6+F!(s3^ znCbb?_)?IMgBG$p*Erq96MNBH97JxYA6<7k0&qBowiFj^1bdQCUB5U9Y)?U(;$u09 zm)RmA{7=!;2w8CL#jsC2i4_9lDrX3#-DrB}v~85!J#&@}{#3x5tr%f5+tzWGEpT-BUTMwl@iO z($0AtTV_&+NGG{H)IM`=>5Pu;&;WEsi4ENO3}`MSa#wR19SdWSegR7;L)YxQ4QDPF zZ3hM;GJFP`1<^4Pc=8RHfp$Btw~PJAS<))lS+{;f`@4bP)ft4!eHn7_&Xj}^YA`cH zZcI6I9bt|bL}E2ygsah;l|i261cpVKj28h-#%wa)EP6*P-vd@`>~qNMa?~FZnR{8+ z;3be3VdUJyYq##_acZ+Co-9eEU|l$2>Z6Z#)YTLIaP0MDzlz)o1s)R^+slGLUtg-z zwb;U-5U!TisUYpEefewSjn3;_?bN4&H~~i@Zvg+E;rFwpNfP_w@op!)TM|Yw1v??x z2$Wm5;Y66~xahoLLRQ*Jcc`l$FM}r278eC2^HL>PihQ0=H~vy&e!yLTjz*~=3=NbU zM7%dBrf7Pz&UrI$3VN^wcK;}xAm~}vw->y#q}em@n+0QSh2G6PAZioO9xLHFA_;B=MFs0jT+orwC{%AUE-5|t+Kww;(iR%x_@FIq?EY-z?!rOZ3Y7p>+-6g&Xqv2-paKFaqox)aA_yu3FoW;B@67~k`+fiCfhWnm$-VDA<9B}Nyo>g- z8ItRyQ~8da%-5fH()!;l6d&@{{A0=h+Ryq1vR|^(H!!HeC4?8fhy^oD9HaQboDZ&w z9|H{;S!sgL<0=|57@-gp$2^PcQfPDIB!GlC!HEdKsiR;M+^#q%YUV|RA7@rpCL z>w8o9p(m={9}oU`BiPfa^s{qI;=Fl2bzgKJS?V>buJ?Wn`nuAI6rpMT<2Pj|py69dC0t9#Qse%rM+;Z{oS?dhpemrRyCydS-2V1Y(1bN>J6dn9c;%lz` zNv_0#eWnYCJ`NZrz4*&r^j=*MUa*fcOcJ39`AMguOE=Hddul~?oC4Ej=``Q`6^LV_ zf5-$y1*~I*FIJ5?BX^GTJ#!8ijN;VV(eF>?o+1SSwKq@lx<@iMKL#_Ea_kMRLE&~A zu{?*}qSU%c^URnb1{)d@v6;v(Z1mu?ob^vtI}+t6|@|MfWf;@@Xqj88x1S2;gA#CUD{ ze4Cy-`90A4-wjkdcb^^q>p?5QoQ{Dx3kPlc1yvvTZd*EeXHvP&9-~(SZec%Pf3oPg z`|o`Rzh0Q;Gw#bje##au*Rsz$a{a7s{db;!=~|REPFl08+pTkkh4&-QJ&S`@de44V z_t(8|(^b{~86*HI;rBiqCKcKVrxre~Vt*8$H7J_>>O|805Z#S*f4kDRWM^Tpso>KG z7kEF0Pp!H7vCym+))Jn);1Ak$^DXJ|ei~{Og@--dYpeo|w`i4F`M9rr{NUhc6usMr ztjlr|cHCde*;`qvT$aP@ad!Mnr^YiDPW*6Wwe$NN{#2ay;VPp6|S2G_jE3;YY1L0R2U29wCrWMoZ z0PHCkIIX#jzaoPqLwL)ax;1I@*v%fn(Uv%N=BXH|Gd= zYQkodNkI}Hf%~jncB7(!quG$t?^hq`S4|gYGRt6nvvuxGO=3+gf%V{wzqnnTq{sW> zR`d=WJQQPE^tSjcdzo1}-zRl<>E0XDw;xV!wR8HUg(VJ-6Kh=o)45Z@e0JRJ*)XZ@ zUeYk>^#Nvv_SDe&OW`vtoWWfc@|Xp|>cYasAWlgS)QjO@B4}?4`_3c4MPe-v@Jk=J|hV>Hq3M_wB>aJNR8NC!_l>*7P?}P zImr_5{1M+7`5W{Z$4wj8K85vv6roYU3Mb6%c7nY==v-eCtQ>GH2x`B3^Xkke%Lidg?hJ&qc=;gWj@YR6+1)EX zG|Uz=i}k>?HYIb0#C7|{b;NWjcx=_N{&N8IS1#5x%Oo3)orqhMv$H1t;|wS|j?y+rCFk5HLb7U?GRZ zcp0ji13Jae02T=|)h2Mk$7Sg^qcVtxEpmgampuE6YI&{ap`goKhhzlQW0z#}kjguQU^ z_z?s*SrrY5>0J=stj48+RK1#3ZZ{cm19X#3>4p9oP~!p}{%vHX0#9`|vK%uq6BHs> zQ+5FvY^uTd-D`?iYpTZ2GG)uB2%65|=RPPn-AwFdz7su&a-_hYH@#jC`{n#_1WlLSw*G}X1?FmIPZ4d~Gg9t??ok@({Uv=j*o)G!WQE+23svn7j&U$XWV z875A8D=kI>kn9)NZ)K6HlT*-A^wf1SU5=($V;joelEz?^*RV*CGt7Wwjv)Rwkv=y7 z*s#Xc;A)!9iV{u3bdFa*9c)6LY&qU@V4?BdT+;-#V!G#i1LBZ0IX+^W!;ivQu^DumbVkF05G-%D-)oxzcVftWpy@;&K-W$207+{KZ-svrwjT0 zFLWyq|M$^eO{+?LwGAObtDg<1f4Daw7=F* zFlm|YG|LjhE7h!f1)5E)f^wr{oH_tM4Wg0Y$s{BK)e-*_rx0C-$nmm!Lx{{2N#?)( zhj3XR>NBk%32I2ORxFf8We0hj$+3OfE}+Aom9~Z57) zdw*jr0CX$V!N@jczv1H{DWjSV+KmFQ4%{C|g3P-Uc~69a)cdi_HSpr<2uK#bC1gyo z;lSjIvMlDK=3x>-l9Z&$yWuxeXFzeNst7tPKR^D=*V&gF~4{s}Y&NdBsJvS1;qmK90faW}uvo zAFxOGw|XcN$}#ik)M&YyBgkbwHbHbBs==~Yytq3S7iQHuJ3j!qpC(ueffc3{>rKz z(F_m+sS`W}gQ0RHMb(ugEEOX0AUvKjgP&!HY4UZn3L4D9B7g$qe#TS0M%P+=wH-Q2 z?m36oS7VAl{=i7kLJ0s+95@Wwi-hLj$mqfHE%AZ;<^6t-tXl#LMum)WP|ae(Ej&^o zK6l7iDPaq$W(|$0Z$z2E2hA{%2N4;dI%YiEO~F+a-S&TeZ#|=@`>6f6Z#*1}8-<9e)(%d4>W(82Q}L|gb0};{dZcI=3Uxe2d$%+2mrUXUkXR|^xnq+J z#Vh^O`|$@TNme8*Sf_Yg(2>I{*3-_B7CXvGN8bYHLL0$+9X z3%7Iuw}3y@n@GnvGAbG?-T9NAF_OH@0fD1y;R-E;zBhp}D3qHaGfL0yR)}?AvBxko zdjJLs%&b@n1{6C^-ZHC9<|6`=)dPc#!yidg9ju{1<_DX^ zyx)iG8nOgMCTS3FzQY=Ug}r(OWH;#1qj=#-}molSgm~IViz%A{dm(2^OhDOXI+J;aVt7 zoc+!wi})|9;~HlWGTlbqgAN%ZZxFVKLfVy**ls6DYQDtitys&vW81r@b6x6YCvEs zgNZ9O5%a-MM!P#iBWH<)E8I~9(aX zep_bLu+NYwFbQo)s_{afrYGIPKLPf}cHsZ^OZbLei%Zvkxw;vy;~}+0DLa&;9MFw` z(%Lg}Di75I@Jq=2I%Sbf+79U}#A5J~R+ymd!XXqW5uZvDY9aRTSX3*>4um669?>4{ z*<*RT{1}A|5|pP>Ot1l->Rl^O<)Ylto`MMU(2k5I8?~ovGIvO0|yhqMFOZ zi-z11wOaJZM3*5F8_}(W8wnK-qI;1bl2FJ(OT20kne2R2^MaBwL|5hDpa2w5V(AS5 z!8--$34?FiSdn(tDA+h6)SGZMfV*DNc#p z^0aoqmgW-S$pwdnhwKf}=(3<5u=V-Fq$&bT9Qhny5*J^^kvr)?*a6$!e? zi!K?|wg}zUy5n-fGv$0Ybmm5$^d~I=n3W}jSaoPA09{!~dS?j_l|3#J-HNtS0g_c_ zBlE)bai`<<>P%eDg-#QSFedcaQa&7$1=hJd3#00!J_0d_*hWm*q~$99SI361^qBuj9RJA_bQq-7m(uB7Fm4P97QuW1F1sxC2`vWCdslJs30c0B0DfFT0%9{>{a1vyxLGp-xHMCIu^9vSa+WE3~rW zgR2$Qjy+LIIDdsRauh%kfy`ZEpU4slqzH&goojMSBIckn1nLn6Tg4WkLr`n ze-;KEbgJCg9_!d1XXU7(`Gya?DZG9w}UicZMsH6Bg=9&_yj3v{tJhE1ce-GjUfuV@I>#o24mT@^I zv@|ELXR7bMVG>Kk%vP~ihw;UR^2*>x1J`HuH0Xrd6Z0h#_O6Bjg|f(}yBA$(Ly z$`vmP0FQ@cppYsFj|6j6gnc5-B>YZ3E>%)@k;p^gxU5$d^*5?9f@?E5de&FK6rlR6 ziJ)&}qO8OjmF)-Rg3>aZyxq2pdlr?669~H@a18o$e3wAiFQ(u9?nBdqq}jQ;T{hI0 zDq*Cqq`+hpxLQ^(T|{{f%e>S*{HmIidnyQasFxCYKrGZd_0HnIv}CK2b1~D`%fDDl zAzDb=1vMA@aj|vB>tQXhQD9r0Oq8Bwrl}>3@uOc+2OMcF6gKGu-zI>;55G>aeR%$Zd<>qtA`3QMl=ErtPzpdfS}OX0s}FeI!Lk(c>T3v?$C5p1-LLw zs)@263cTm$ZgImcu0{WO>8#iBk#<|YUA!TtG9B&pn)%Tp6cZB(kQ@n`@BFNK8Zyzb z;Gjr>#bc1hJ*rTvob(oyMBr4`tQckq)%>DPn4#*rk>CGcKNB7*_d2413Z_5O*T9od zjeu?S6<+V+jEtRPsk=~-zDK9McrYDUY-1`KV?{%Zz5fD#FwT+IHv~f-ubvL+Ps?Rb zYg`}j*O~QIYi6`HU*7GM{b!7C+1lA#Gt0%Q%xjlycO|<~-3yyzxRX-EB;Vz6%&H|q z&Ziw;qJa>OuEF(H=byxI0~U)s19~$JSS>Nlm9Q6(w&r1VGTRGude(u-D-^4yzRshy zALR~|CHfpq{`EwN)-Y*)nsBD4h)U0B)*sqw`1S_xsqO8rZjc!reN8Zh;H1wmsi%?| zN$WaEdvnWO!1vKIHfON~#xSaa?F#2=nUNOgTm_utJzX)!Ir;4Th1}M(%Xgmta#}c# z_cd^^v#|9EFCFH<1g~nFnVfgv&(`%7kJTDfQ_pf}6% z=69B&q8I&#;oL?_CWq#E2?RG41Xlurv&0vk4HxzolQk9_(VefBWlp}bYd5X?2s3i- zW0(lvevr6uo0TuMO5s3U*GW(DCK&S-UNvaHU^`?EqUav+zV*a|3v_wHUfg(l%k9oe z=jKHP>^-v$&c%uh-`~!_7Ehb?BzONuKlGGAIVA#wF=VEj6ek{}Rl}8?kaM^R-iJ|V zmN2^-EBuE$Nd1eM_#rgzMxu>@Z$0^wSvfrht<$3E=)c?CYOY8y>n&WsxH6?O%c0!< zo08heg6&|3#~!}g^V<`8f7FkCiC@HOoTS&soNs1UP3I!3)8B#2+L(#&qj8tj$9UIC zwFF8>uKqb5G9(@neq2{b)BxJ$q6xJDo#xQcST42?7ir(bZL3*xsr>X5N7rwi#n+ke zT(!iLSSo%{OCVqVZP{;^_^|lP5dSnX1iHd|d!5^9tu?LnJcS0tD7=pVg&El{UufUG zYY*r|UpVhxhI_v7w`L~q1hh{5?$K-`JAs8$z{Q=rncdJs_R4g|V_zL+imm0j3*zG% zi;b7T-D|}6>uBu{Tf{={pd+)ee==@~*&y6K3Eh2|)FoOiJ^)ULO!EK>O#dF-?X(b7 z>qU3DS{cgg>~5p+@4$?tm_nJ5)!MAIsRIo!0W^36&$-uP3OZ?TUYLmlOz|9OxHfgL zu#VaOfO!oGa{Gysp86L+0Qj~UR(5=gH{!fTFK}+K+5;y#n3WT-fK}VRB!jlLFstA* zs1p0dlK=tV`~B@J>6gP^HBkb(%rk^Zn_z*HOOjv1egYT8hCAGIpb--jrqnoF-U$qUHmy{2KA<;Mu#ETS zz8!|HZ)a*!%V8m*_C}_lkM|TXAWhJ_0mI0Ao!kG%D&Sl64Ds3c@%+>EUsurk4`ajJ zs(6Yn{}z4Qo0(TAyPr3n6c!f$DzP^AE&*?7fVj$n?GDL#uun4V+7w*KMkc>r#0~>9 zdn0ilFs)1uKqU7~4^8wIko{`;0c3@e(}dL*@R%4Nk$RAO%%dSAR&BEiMTz~>fZfd2 zqt{pd;@RI1|8=nOiE4_EbkEt&=;!)oxC1) zh;GlJ@nLFN7o>+3W5lT3K&Xg(p%^dI;eCa9TIw#PAExe2?6Q7 z_k=3a6A+LRLg4bP`{Vw*XU&;4d(X3HKQpt}oHcu$$WI?s8R}Jb(+iD% z;K4cvpr-p3aVvvT*at1l%pZyp>_iNw>Lom1?ZR6?gsTWlD_fIdFUoiapm$JQ0DJ?rA z5-)rmhlU+pm{(U*D=Mk$>*TVs6BO#qFW_%&-C0HDN%JpiIpVCQhLVv%uBtx4tV-3? zoc;VshNm1S!;UdnYHHeXLc(!ND;0&JA0x)i#gI^pyHwE(u?TV@zDODLvxh@&@HgXhj{>+W*=&)(ejR-^V*7*=Y+SbYELSyGDD7BPFvYvpD^80eo}1 zB4J`p8^O9a#(n4^eK=1sHYW_E%XxO0AO)%&v7g;^5pn79R@iy&!ObAulK}`k$}ip6 z(Q%6V5EUE=l!;umPpW(eG$}>t%@g|5Vy$LIUP;9`{uCfOvSQ;p@n=N>tjN)Q>*aN& zYlDt=lHonD(x}hrrZ&5H>nHg>scoTlX-Xb=&8ed)fyV;P3)rd*Aire+c4r{WET#3Z zLO>EkF8e)cJ(*z{v(IUsHW^BjtK$e1x`vt$`WBPA4}Y7(DxU6@tLw5c z$}vgNLn(W>==eJJa%+%MU+{h0o*(o*SC<}Xd0zb0qz!^1P>$ezwz_k>u&5=U0bkA_qse{*gF$$h(=y1|D(>>%)G=|ma)*jR_}`4{D@eBt2?Uv5F7 zi=|E42K%=;#Rr}+U*3JWMZK(eRW$a#9DZsF{$KC5vC7!lReQ%&;WnZRlF8l-U~iG^ z8!(6OC_nmm>7K0PgZTAJFr#VU2%Y_C=~Pui$U~G`_>3<`my6X`MyY@2zk7}TRo^Nu$3p_18Cb-YX$< zA!8MUX~r#$VtEPM@!DsN7HpyDz3h0Hr^ zm3tZ}yYLzK5X}}9m=mm5ewQ}f{z3MKqR=_|Pi}Lho9fu7mNn902Bpg(r54Y(K2h#A zrb)pM&Wwgz9HtHmUsvmg7@0{iVOi#Ks<{eL^qgo2N?*cR?INpM<69ZXuIIEKsq za6fZ0D#X548^wms~R1=aXJ-Keu?#rj*HHGu5a|SEuA!md&s|Z_; zdOf_@I6v{c)QPQWzhT-*!cA)&33If4pE%!?)SV$kl+1v<_<${(ZDhxcR?Lz{^90m` zC%4LJy_rB4U};^3n#FmUX*t+k-^X3s`G8Il7jEpQEqC49vbF}!hWh_>OC*SSX?+`E z9LC6W&$=zw8yp4Fldw;LG9YcP9Jm7dNy=cIx^Ve#xZRPZER^_x9s8)s;^=GY+{=hk z=|ZoCjdJr*&-eb_Mst#U?f(r6PxMX;;9mF7alvB>e-M4yUbs}0^jC99^xJzHp;7}R zIZzfuVUmuQZ=bC<|B^^j7p?+vgk2)u=aL`41>stdg2d0Qd)>RIbMI>B!N6dqOr07m zEaj_2Qaq>^@z=f{=b8_ahodg$@x%C8i_`oxlS&UbPcs+-cDCP#Wx{3xDD?@KCqG%+ zf9n-VWqs}B=_Pv^JG^D3r(hXFPNTD|Es#F@yLSRu{KS>YY3@JuNnIFiZ=MX|sqsmr>nbq{7Y(7 zSpRg|4);z}uVHr-t-IXoB%Ns?H8291r!&}K=MpOtroa2BM7^Qw!;SmwuJ@nEdf$EC zRU9J+`}DORQ>J26*;>|a4I2+53tGxfefpTy$krWzum*tC$~_nw_)eB_mTa#pG$31N zQ?uW<*j;gr9B~H1Xe@;ETmA6M2$gS!O zcUc02{?yTXSTB_&-e@q!=wFINaDsSr&1A#%Vv72`&c8Y;d`@pS=r~4AF-cvU9iY_| z)(4oQCB|pcwMB@Kx!Opek7qRTI@W-u0ZX~lk#IH`py_uc_lsCYJYc*6vaPet<*iwH zuD7QQFqRc;`uCwX6x7U91`RbR(3N{UoH#V&h0R%|7JhBYzqgRCWJIT!OBVxVdFsyl zF~|K;Q_0_lf9SCz1c10D?jb{^wRHjLAm#Pm>&_-_X=Ts5F1ow3KLk_h5Qk#p+iU8O z=g!NW!LZqAAegI!k!o- z5$+na!C(%yJuRAK5UH|@WFHD`E+9Ld%;cXO?N7+g70pTPLRAI>l?eHR} zyD=#tSjw2oN+vqAt%2r@s80l;WdoejN9i4RkBlwc2Z_`C0HKLPciwc5RrP4OD(HHz zNz8mz@s$X=o7KOb0Hi(_5NHQEmMdiN{Z>(1UL|uIuk3SS&SNS4eUXvV7x6!V(a%PL z*c_~PgKktOd~ak=j+nS-jZ$f@zfu|d&4GJ)XO$oxWiUgG;MKb^XZy*L+Yhqq#7tm` z7uG<%mLnz>kN?PD9v6-(;}*_*PP=Kb1QVRme>3;W?Xe6kR$C;G3vs0qdeE(H{_TDF zbHh*8xw^*BDt{c_G!91hq|$xM2ZS^vwEP|~(NWrV6~rhxPCU$k&J}`nQbKi^9g36d zY_Eu*g<#_e2F>|TtpMOP^-fNEbjo+5X;wEYk6Z||p+OW_2T~0%h@i7w8Dlbp2)Z&L zri$sbNsy*Rc97q?+ei`vR>?_x{qOac9kd`eDIfrc?XxRgzH&=yVKFP8JO*~?{|oe)4RDl}{E zN8>0FIG%`QnzN}lNx@Ge+ZA2nZjIzUj<|)pA8I?|w}XQhg{ykRK6p2t9_KQgoyLYc zf($+irm0c&zn7)<38@PezCC|9A{pjL+n5_55Hy=ccSGK1Kpl3_ z0Zya?!-x-t!-NPqB2kvNP0;UV-knSF^7@iyeLnv_nObq{gX@@{3Iv4i{Qp0w*MI+?qz5hs zv1h4CO2o2g;1y$tgFgFTv468OpDRrY5+Y3IU{4piu7l}B+} z?n&;D(n#1!BAqSh$G*wZ`!rDzxt{RjL#cMmsBo7CAiipQWp3#x53%P)ZpmbOh39MN z*{n*?oe{Yf#yD?(6;uoAmae_sgb^Mq_6ImM+Ms4#7>CK(54-l)~O?^14xt>&(CZg4Clo96-7I%4H#<=4ij$A5Cad)m%`gzVOc zZeaL*3W6N<)sVaCez0U(W)fUF8sJx-Q!}L14{@UH?5$NF!>!h<8z9VqBZD(^hLPA6 z=Y^BMc?hlr0$|)(f1-xYanWBaTE1j^qk{^!Eo=109Bpy}%RdN${%T?G8YYpN{r@R$ zzV*(x5>EbEGsHHwG-fm-hpVS(6TEkD4R5Pl4!%f%-^GAR!SOXdChMsS!+nL(W+-ji zk8g5}ht{CC8DXaX8Tkp}OEutwrp)nJC zNu>8&LWJ`9b33;e5xukqRhz{9?wJknk<+Z_XaKYUhX+k*44I@3yr!1fCzU8N`yD4f zVkXG|O%!TZ{(D&*9r3A}Mksdly@Mbqk9X#Z82A}tlC8OEAJocu;nGv)paVB74z1lZ ze~WoiK>SHgSR>q7K8$nFS(aGxl3Ilf0~_FLx-t-rU0Mf_*UmW3Q?XsgqY85D z!On)75={^pOt}#tCTdXM`%bT$9-qpPjF{5Yl<%}8UG07>6VO+Pg5WD2DPsW2GAdV5 zWOMO1Y1@h6W|QUtaA4Iw{3|5aq~7oc`p__&wMZ&c)~?7=PKo!o=hm?G02>rKBfb%c zIr_`#w>UBgT`K(@PDiRrP7{7kmU0fD!2+rxl50_K2n`QL`F*2?*z(16*-#tMZo1PD zk&5lt8dc>1c~QJGscpKgfZds_+HOvhvU~hr+D2dyTMag4>F>K|8ZDpwpof*CrtFPs^j@R_FKW+`=t;WOJkbsM@GK@`tyk&_rfQwW`m^ zYqp*Qx^9rhh#UUWS74;wer~}fjy4+xq=!P&(BCF~QGEHCyJ==r30qJr3t0khN``PeA-=&8(O4)iehu7?N+oJ8-Mz1txsW{j5S!UD< zWV$kCFZOD{EETa4;Okym@9<4uRlbxlkFBag8M0;_#Ii*@*IaV_wko{d<{BNS8hj5W z)~i&hAi+8S1La>)&aMviVvh1?ow=x*=B$RunY%C^$3`QOdPOAtX@_vI_YwW$x?Ulan-VT$zoKD$>8O^LnVA^nQeQMR?+ zflc={^tunpIlec{_e@vHwWYH9i3;x>%s+Z#3Kp121t$WL z7Lr-=nziVseRs!74{cjhfwcgqb~^_MAP7CVWNXKNMys!S6#Yh{sxcr%a2mcLu2dME3CRm;I^I5Tw-e1?u%taP@3yZ3!;{g= zb#cOivlclAU+i=_Tph2&!EK}RGA@g+yI^$ZhO;e|A9!qQ_zYa7{01347Hr)5*$9*7 z39M-5BXqmUX?+o^qy25o4l$!?>*cV#(DMEu8-iy@qLMC1(p1QEEKAfwN*~Yn-3pll ztbINctEj4&4hm`Gw{`#}zZsjC%^9s;RM236*A^y2Tw}=QuKR&8dk1Ha(nJUIE$K)Q ztE~ms5}=8U@-KBzYmJ8vkDV4;K!X0P@{gj7QAG#wpuC?7p2NNRkPWU{hC7BM8eG__ zOJ3?MB{%X3%X1MSTPD)N z5cr!z{U&O={@r^nSnciuoaJ@c;L}6-v&HrKn!^sR5=$*qcp)hq@uO)O&oDLn;h;kQ zWg(-AgMdLm(=lJ#>QaLSblm1Q?i*SpRhZWO3T0|AEk#zH78Ilj00x=2)*lCxlkJ~!bmH;0; zcC4n?JkiYP!1HbSi}j=t_;|`}St}g1Zq5k=*JdZ$Bm6boBi}}+HM{RoyJB~oGsVxH z&n`b8i`E%4%)5h-Xd z`40q5V7Ft?+j$!#0i`6CmroD#LT#(AwP27rnkzc>5eFPz;YCrVnaK@qx#yX+oh*D( zKhQuBa7*{M+rI5sbQ&bdCx~q~gw8>d;e3 zq~>Jeod1&!*ShX!hLo0kf!P9TqfvoEcg@o=K|Um{mf&1hr4v=Cww!(Ka4v^>JB>|@t1HQKK}{TCqi z(V%3KPY+&iB=T{#OSopI2`clh(^JiIoJHO$)?r(;!bm7p?)+UnT~gi6eqn6GThHh~ zhuUdv2Gq@k-NvzvA8AMKY%LDFM{J4uK=Pl|%)@u}zzo*{<9gvE=?ZnQG}W{uz-w$J z_&ofzVL4suZwBv)dD9#I=HJxI|Iwqy?i+i1D0WXI_1>H%1vV3s_o3y~#pXVIT^7DF z=xMUwX}!yz`l{0A=3^!lQbgCf{4+!8JEM92;Cm{QfzoFR6QfMQljwuPBg;Cl87hjF zq^9c#!Ly{`Tok7RHsB0($wpmsZ_Rxu=Y(=icn<E5e-CV!UM689LXsm6y7`R`&v0`)zEe>C|&tjRJg_Ux?Z ztUEKEk$rFOpv#cwH%JmGReRN_;4_-3(bZL9e07v{ac1rX>j%LKXpztVQcbj_g)D9} z5+`j})xZdQH7Ay`m79+a{meVWF@D(Vl5A^)knVvXo`3Y)!r{8H>K~CmC*k$oh8OhB zJo<`ES-?sQXFh%;0U`;M>lucksKEai>A>%x%l%f zIJ$SXTWIC9DI3Ne^wU>Q%_*Ey7h4YUUzCliv*-!WGkUnQ2-N(6^_DP{Zq@6-tOV@2 za|IYK@!kIBD=^>Tm-k6<0ME>L z>V6@ezS%v&E85$Ak2s7ev@rzZR_V}@z?8~d1D382baW`~a)xoxB`t4PqS$beP)V|r zO|^Yg#j<(>6Ho2#ZP0Pda1L?6CHNg(`IxfTmpX_j5<}xj8+#i8(MV+kIVAQ*RHw+Lz z_IhGJ2@awyVdGacmImytbz6v`ujA{HdVw$3)bREKkJ`lLCVa{}Qa28|ek%+1HznA| z8Y(8rqrE`}i-@rhL#tO3%dheF(o6hBamc&c8fuhH)<5($);Z9&EDfvD6(_X{!AbBY zZNkz!qj+SY-SzjMwEOxKK$imUQBHb)7fu6EC-;3A#|30oHvC30I}642ub%uDDI;!n z7D`ZV21O*-8&H^TA)aUXR2vonoD6=eH{2@oJAK=kIFOYY6)OSkPoj!NJxxXblyshC z+!~XO20hWkWY%;^zIp3@r_QVO^QD@U%3F`P)$y1zx}(A~9bvDnQyEt2>YPZM*+b*^ zybm2p6r5g9GKT`ofc9`9o(31el|gx{)Fn&(#LoJAZ`158!}}+ioW6pJOiju!GWUXi z!t{jLXOhbP<@-Cniwp`O#+_$G3GgEFC4o~NOH^Pes7tuV*j+P1Gt|wMoz>ylXN7p} zY?~b;KjYG5A1IyuN26z3*J_HZP9N)F%`VSs{}$P854$r`F|w=wW&{2{63#mLfNoZp z6iJ^dLTQ9Ou;cFcXr_f4jol^zxr+b=?ivlCZ!XwBxMXHr^!9E#%T;};`m{~ELjM%B z&hJq6sVEe}g`wRu`wo*yeYTnde$+(RHHtX1p~qlU$K|A04!tk}z^}?#L_d_5?s$ev z=4T_`1=Z*^O#pBu&r+Hnt^Kz}EATj@(5eXZ)VshYENNpJ~L31g`ZlB-( zmwl5bwl4SZDE8`SPOs;nkRM;@R|e;P0CMwHvuUo#8Ak(n9#53%q5^!`g^+@A!5cXk>d(rK}&GH@g@6s z1&05rEVJR)oyAHQ!TIi&F{*WygJ402wtHSNGQjQHO8>jgnuho;RlzeXPDbDL)|FP8 z3}yNf6It65aDfoZXM9(D52d+BlEe6Vp)M9nv|VE;{>S8=npfCWAlR{bdoX&XISGnoWZGNQC7s zWqdIiS{L#*y3VvFzMts*@M^7gb;>x6A;Rc=J&mF0SVVXX-H%j?8!^?r_0=y$*-wD_ z3DY*4?fzFSjm<*px6ysX`>i@XWaStn?pg%%GUT^di2I2TbL8#h6RZ-{{ecP-fc3ckaxO0897p-lV4f{k6y&~uH#a6oZppXT*JwKpDcS6(fa7xYF)v9 r^UUp8L5wk~F0#SVFMfRCZ=zv|3lbmDkpcYgR{=GZ56TrvU%vkzvp6;T literal 0 HcmV?d00001 diff --git a/static/nodata/content.png b/static/nodata/content.png new file mode 100644 index 0000000000000000000000000000000000000000..951c2be452a32617efbedb523a215b2a7af62685 GIT binary patch literal 9900 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 R|NHGlRY^;+M*e;H{{e1lbBzE1 literal 0 HcmV?d00001 diff --git a/static/nodata/fans.png b/static/nodata/fans.png new file mode 100644 index 0000000000000000000000000000000000000000..15a5b9ff36abfdb4e07fc13c054e04b88362e608 GIT binary patch literal 9282 zcmZ{Kc|27A_ka6BsDz@D3T3OvC`&~|_H70uM92&yWjA&qqy;mw@9V6X8S9XJ%Wei^ z3)u~kbX_jewzdmpdYIj?(P=XuU~-p761`-(Eu*W}_5kyP zj?xZ~%V&-sYJLf}-aK;T7{gH4RO4`1SI74EXM}`oPptGdH?wzkSck2$@_@xU*xB93 zU|8`9jE#*02IEk}{-5mb9_;V44>eVD3Wu7s^!@w-=D`8mv*c9G{G&tD|Kw0}*#0L~ zbAYI*-TyaWv;9j?9^P$l@8EwE3XA?T{rksSUuPb6==A-yHRjS1V`=HX&f+5D(6q9$ z|0v^J_1vSF$ob7p*5cxRW}k?E*@>$8M;}Ai{>*Ko(R*`q3>=Qt+{}cRorsR!3#qw) zK!}Z*MchBX<7&-G{^XR#*4i+u5C+?8!;?$MBtz5%$8u-pb0MtBj)Joq+*% zV|V@gMr9={?Bi}=&~EG(#@BC*PoH*5N|`u3Gc1e|8n#nW!K$cWe~;Tc zgj`m}jQz435xHGdv|m}p&d=YEPuNRKXGBHsB>vdT&e=yG_t0qO*Ka$?DU7yuc5dE& zYAVCekAcN9tE$)}(tboFBO{YRB(hMbeP3TjQWC@0ch}2%udr}GFla9zV7I)S#Tt0Q z>{b2tZLgqU7lYXg31zUR-yFoq1--erwBQ2?jzW%y|)h^qhz<=fWMH}PrCS1x) zSIBlB2vc3xTAANg5;xWyK0@{%ZTs3w3`cdmpK5sTU1n{FzJ#x%{O4oiaFht1j`i-xu8sG0^zf6!2r8Tse0=|&HJA76Dc)l6%@Dk*k zai3AJvEjPo?w7ZfKOWq+TM<>8H^~kN&I$5zymjdJ|6l&HD}sCoLvTWkLf!1NSgSbC zt&ecVBYFVi6~*(~ni|Y%Q(_ryc1Z)7^h@fK(8_`YJpdx=EGt=upXG3#zA1Nl|3c{1 z{O)SfY8A2_JuQ1sxt6)&MMjLfQm^7iZ}1qGEcw#`mdKttV?~+wvWnI!nGWSKXO3>? zqIP}y=#UiK4TCO;7H$WO#LD-YDJ|~x+n%t=q4%;qj#i*?6f?FP_|-mzq!RUaXgd$R zrT0RqvaeFC5pNAL@__uCIb&->lw7xs=tG9#NyT2CFRJ*F5SqisOoF7I(i?M?NEW#Y zuiqyZK~RO@9A8@cSs*4UJ;_(znA6iNVT&DNd0&7B*KjDLr^W2hojw;WctQVxpD>c7 zum-G77XHw$pXf!~LEQ!p(I|D?)p#*EiFYrB61MxRMS9qQm{%jVRJyfXzrI&&90}q? zd-^H`E00nzPjjZ40b%<{LI|W;f=kPCVw$B$CAxi1xaLUA5rr*;NU4EPwq)|e94mRz zoamA=FVueuOYQQqC*GSxXRLMaF@P@W10*Z(bJ}mp0f4?dkOqHGedsHbL;nVNM4$Dc zZ7n`^v!3;xa1fn2W~)L>fJTX;p8ikkqDKXjK1eK)!@E*Yks2pGkCt`Q!2a3-0HAe$9~D_L+CR! zQ@h&^{<9pV&9Vb63^Z2;Evo5L^5r&u4&CK+{zxx%(eDUIq*lty&&3`_O@zj5z0c?e z`PU@qrgrM0yqdX^KatD2`$4^8yf0URgB`#Egc$ZQm@)DQ*w6uNM)(&pL#xw?$=;3l zDF(}cyy?$gVJ_qYAPRtQ(%wk`8M<|pf{@2)Q}<# zvwTlYXQ?*L%q-y{2`UDkr0a-AFYUl}g(AK5`#Op=s8a(RKs))@Nz}!`iVG! z8Zr3h;?AY5icy#><`(V2A_v!3e!jCqUZOO`CW4GpxU0O9;}{X?mN95rk$Xt;q$+d| zVg0FdpVx%~ek%&#($Mc#$tW5jpm4}}l~&)Jji?}^_w2t|0>PoMAwybi;iv=6hkgRA z+i(0lvP<3LVJ!9rCjporD@RmUdQP&?BnS?+bgBQm-W*JlbOs~=u471;ys{2HL3aSA zf;CZ5+}}VPT7G~jE7A+QQ&p7(91y%?%BK)RY9(+xZ4Jv5yj^(krNq3Dpu`-V(bfws zPJmH=P`T)Te*OA=x7~^Mr_Xew0H5X1U<(1mXkrZ@l=s zO3#%@!*@zSdb-x$O$LtrRWD~@@I!*J+Ib(0JPw$9@xxd87Ud)*{|Ydxg*cQlw?w4| z6mz$DP;V(yM8q}{$=W>!uO8w>e{y#o1Oi^3uy*ZM;x0gz4* zaU~|Q6qmlD`y>HrFTYY`QgB`X2A{&JTRMOhs*Um%2gh7-&fcyKH@XXWtJ}Udqc2&!X&|&@plDlUcX~d&XzwDb5X{=|@6l2>*r%NoChP z=etm?U!UfnT`9R_M|7*70Myp@{n5an6PV`c*`_8n-DN1$vhod0{%xPWua^)`rA+83 zScUkI5YtBhNcGDcN9V#Gz|cjaV0qHCW#wm+M#x%$)dL7C6#Ka-g%`eoJ$q)7`+PCI z7=k#=Q;u}#ohr4*lRm#Y6hwAhYxg%-yExyt2|a!KShu>dPZ&425;bzQ^ybQv#DF6B zTg-h@aB`S}YKm#s`I))$f>NF}fHLKxl`&5USC?Uz5W4g#-cGCf?df@YsJq>3jleiX z>;;8dlsO3Y5TsZ~IT$0&5!&YwC zQAjW3=hpc_a$b;id5D3SSz)dPG3E5hx%;AA+fbh4>pN(tJi-9~EC%}@ zv0x#{jwEr`KhcMuGwJ38=UD9=wM3Va_-wgvHC2%*E^a5wUz9#WIV4d}N_##22)N~( zHMJazp*Nbe4Nwb~!Oz?JVf?c6V#9fjivlp`fv}cV&JM(3RYOOQxlqF%@0nPe0;@K( z2^>g!5ow)7&f79HDnYXCivYNI%QHXrB|OB5Pl}mPlB_HwQjP5YR}7I9!+7OMZbb8S zD|Nqo^(x-^BEKCtks$C8R(S+_Q%`5B(V?fOBg`xt^Ew|bk3XMo2x^b-cwLRQg3&s4 zh1{W0APs`4w5eD0t0-gypn|`#rnrsY>3f0`@i6Bp-~oW!j2rgStJt^ggV{s}v-`nT zKUXI;2l`W$QzJwlKeK!RI^%?s!@Qx%GVL4fOmqM%ujKyZe#|G^qg#(rbES(O(xdfa z(04isSSQ?29_)%_uRAWG?giZBt>TQTc`lH|FI}Z={*8Rk5$RM<%~i1m9mYBiDRILE zzuurY2C4BtA-O6#x~;;IcuDi)r92*dkHgu035BH_N4EV^AmhE;(zLb$h0xhXnf|T@ z9R(F77~uNKqn}V(XJQgn9`l$qTCuGiZqr#}+D`c>kCMZ<)3Di?=SOL7l!W$V@gd$R z>z5cuP)_fvb_citO4*?XG5^2-vgZN>?fYFvMdTg?&MkvKS4eISo0~j_Wwan{H02r9IFD{H$5#q~z3iP+hS?GD zdKsb4#K=ZOtGpr+ZP_s!olerGaq`2GM}?{$xfDjsQQA4o6kI-fub@kmiKzv8u28w# z+QrdS6>MR2nVEgV2Z;1Cgf~|MKGSV;#hroma9oSFsQA24yS1e3>xu7|aYCR9^geBe zzD#L919spT(uus6Yu{NqlZJPT1=R!l=PtRFvqHp!A1l%PUiw|0k0(9;3!MPwgU+C^#Y zNKG%t`=#V`mC7G+4)eTd%EhY68}W%x`)@A$F2=iG{a4(fWfm%(zD1zOv>j9M?$35G zCAg*audq`mJ+9Sc-&V%@829)Yu5Cj6;y^0mP_YHGla?}x&UQ9uy$Hnp+Alsie*FC?>g`+yXFrOghJhVCOos=yEgC^Y7_Hd=N$YUrv{##o$6>pkgnebYhURuq;q znApNcu(N-;{iy)s2i>zQdG(B+-eJ1Swe@a)#!Pljqp2~g{0Ht5A;lXVM@Uh1#>Yvt zha#<1U~!xu9^<7G^=Mb_mWjW6qEZ+1AY8j2m|wvE?!jb@EVFp|LlfdS#zO@@JRtT0 z9t`U&4PF0Eyvt|pDLqHY9*@kqv-LzIn=3u!UK6@u!92uvmUlQEaD^twFKtO!vY5*l zaNQ4&Igl8tXh2AuN3VE8_CLFfdYNV@)}En<9QRSOyRx$&MYF~|sq@*H9@Ug;&*YlS zZgfyjo%=~Sss#5sT6#JthU6KeVHy+Y=^qE+%UAiy*9KG&z}pBfSda1W+bgV`E95wFk70(Jj#f0(^Gz%wlVPvh@ zR)8|`ZOOvjBti!n~BUEfb-U@4oH)-EmE9q^%lT-vMihz2Teq z)k%QET)VIIknb)~p0{Nk^14dSRM*56nrJYB@NM=!-sc^brC~6#UE@X}*cXF5|07c< z(yc6+A3wM|z)d?|AtnN$n_0OB=Y5nQ*S{h>pRDidRv%EIPyPUV+}IpjPW3D)ZT_n% znoXGcK7Q8}Hi|Z$)uo}*0pE*MJ}Ad@>i{2mJA8JTc+%NNSikomQQ^uvfUHl!m_it z3XLQ)Vh90zbQJ^Vfpo2+FMs}R*r*s>JMFw1B01(CzWi|)j?=P=&$Ln)-(B+*bP_k< zCzuuGXzs8s!r%s$-;o!wnc=7aWZ1M}o}}qfl*NUd21I9^q@Gkj`8yjW1Iv@rPiAiG zs&bkpN=8ub$YMJ9R1seIrP5FY&3kYldCPfxji+GyH{*y`z(K{ED=qKi!{kpP^ZBlH z;@cHt0lgjDdqwiLqZ{H{44`J`yS~mh*3!UBN?1a3m!#?Uqt5bcyM0Se!dxiJ`AO7Q zrjKFFlOT0V@I9+af1g*^3M&e%ZC}Am?X$a6bVsLWzFD#M3Ep*UBV`4xb&*QY?=F9Y z`?Hlz=|J;_P=SBNKuDysJzx6j>pa-Tv~SI95`uAyRt;Bwv&3{J0tqlw0p>pLvKd~H zJ0(@K(JLkjm>_O0y1!3QE_;PiWSb|GnlpM=WlCUCq^-@ePm(YAu*djIA9bmoTJ|Uu z#Q*!F{R{tZcmJ_(+u>J*9F^kho(CldAGcHWB<+&`%rVryRO|KOzw&3Lnp}sQIlR_W zAEyKAi&U~8?zh2lv()DlmMXg~2-jA^EooYDvA}Isc)o3e1F1M@YZzd#KW_pL)lPd& zOZ|{{4BRTa@~HEuo(r-cK-DQ~ra1KC^Hn8uPqL*gsX z!`GCFV8!t5yXrb2AoOmBp`nttM28en6CF5|@UFj}HLH zh2;IvaP|SqgtCAPTV@JT_=ImR?sF2{V*8C(IKalu?zo#32TK&OQx4|Gfb);3vdX86 z-TCMu0@6$U7OYk!|2S08EJ`q5${TkKM(%ctm1&c2&P+~)UpobD;w#pwnr2euG0bcG z+BAALD>HT}dgR(dF5PfGqp-)Al9SO(O>EWU6;GZ_F|jnsc~z9U42>tB%lRw&c}7fx zgW4P{Z|`e@Xalxu)1pi_4fH3gJTUB@0a8D~+ls)I?3sLdv`fwfuHR4nCfO+qb9(hw zX&#sadJ-hxf&dg2zZ(lZ$vHQ7Lur+!?yctE#@4sQd6!4s(e1?R!bzuQ&zZG0Pjv`f zpgjJv+vhvjRBfM^26G4V6INXhh6r4zJoiTGx;EV3>ZiV$2sla~NiNg43aDHy8b!I; zUz>vfNrthylCLcg`}Gq^tg7?P?`zJA-1fSs9(wx1ZQ7vBRCB!fg!)aVH-+SjQR+8E zCO&-$5HA@@wiXpk)X6<_QK#Q${l;}EcIYQ9X5ib!wbZ0^neu_fggxESne96TPip1n zy;nW3KH};%+#)yJP(lJ$CXIH|8T2v2YCI zcAS`^MtngGh-@XDZyEgHI+u}%`*H@_6=|ma)Ism*@l)U=5DBCl{ZJ9oF7XWQ>na0?WX?cb{V zzw2e@D5Ypa3>K7ro#68OYTHDr|SI>LgoKDo+wssJzeWSj))_BkffEC7<$tHpi=C(AU7o>@rYx8Sz zxHflf)YPTRwF^C|vSkQdUmGAw2f7&j1pir162W)c~Y;Z8t=x;~6gMt#KUMWm=Q$UOFd-K7_&wGw_7UqM(G9F@q+9yYH|gAFuVA4m>7WwvQ{}6J z)T^~du)Aaj{W`7IfdrbJn2D652eGmyZb)LDtJ(n8->i+}F6qc!yus1j)In;!MKr)G zJ-OdM^)QFOX@jo&1q)B=RGQWXe)+2%KgID+EHLL{WKA|m6kj!zeoH0zZIMHhl5(Y9 zkw))YNNR8Nm;e|xh?BvrGJsEOXdXTqKa7U$M;j|k z<)*hg#|}z{aVw%iLetDa;j_02*6xL_H^J}pU7uq9BstmsB&jA&ry_yrxWsF-6L(Fa6MPqHD#y3QEv%L2Rlf=|Bf@he3B@%rQ9tA4cW*oNXObqGpLaCm7> zE)O6{c67HW0zG|ajd|@COQTWM;OSLDjG!Lpoo84VPvS;{0A)Z}g$I6QUV9d{dfqokvcg0zFkN`36$ zCx;GRPXdi$(@tXWSB#x62Qi}RSN3}>$909TE}nVutEDdv{8?%MT+4(PMNpy8tsZhR zxym4j51Y1nn+B3nPlncB; zLoW1RrC7}#`E8mc|F~wmFw$((kDd&w1G&7jm(CcxIdEJqZAmHVCaSmVxnx%;<+Gb* zB#o$KqfMmhiH|3`TrhK`229}3>v*D^;IFIQTdnFg9^;Dw#sca;6j_ayN+XgLq%YSy ze7C9w-8rfy%_F_~J4v5?OgS#yHB zX||l3;f3}@_15+dVliQAb9shvLL9X^m$<_B4l}3?EyuuAVBD*2pU_dqu0nZAlKG#f z+(iYLX3#F0BcQhKzc)IF)=nkn+8CZ+DPy(2xua8B!=Za>m%@=KEAMO>VnK{CMiq6) z<7L2TQqf5}IwP?6cj1$7>UPp1lsWo3iFRPgI_~pJukI2e_z&L1P5kP`EAB2-;I|O8f!4_D%0oWMSCmYMB}C ziK^>Z#ru+9vEs|TTcxuHI%BuwQXaxKasuUJG$zEEqKY@Cd2VH&tND9ue<~Pn!{k!2mfH|X$iF_;k2&y4+|J=X$7~t8PO2) zYsxZp8$NDtrLAyqptA6l+ve>^rx}#4_^P=hv<|SJV1oj5+ zE`8hX&(144C^L&Br1&=8nvlDntc&$})^j@qKN)%O=V4D5cShp5vnSr1_E8DZjyQ3` zK-?riQ}lUgSR_i|xZU4*j75B|W|Y6o$__DT;!IC|i?dp2v)wzf4pz3a+Obyqd-|>^ zD)SeJxMm1`Bpl~~-8_Fe^z1zMym8BOUbjS{=7mu>*-;~NSn|>4 z0W$g$oGavhir#CR~g+f(pTLth=M_B!e_U1X4)yiF@INXqC(r~uo!EbF5X}CfbbKQat z5=o4R*-cJ9J3c0#o>DqG$k{o>|CRP0ed+9s8XkVuys7BY%>N#JSt;PkY;T`*a&k_cbEeIomh|Z8{P6Jn z;DGe|H*sTwP+E4jyGtrAA(mGV3yX+fV)0c~#QXvpPE1S3x3->t`*xm^if?Z}Z)zf; z(WI!TGYp2*&`8S6Bz*pi&&nqJ_;KFbOV0gD$jKpOAPLFI_=E)f*E~XXHF0}~G%!F$ zAn<>7NOAG_-`m8*B>dnYIU@3mwrIaLi0i+Jot@`9d!(9L60NlT!}FGwa}y9vrAfBA&iVrsI!i<^LXmW z1L};Grx)JU74Pp)@Oek@c!P(-2~knR{e$zhHA2vPLii_QSQwEyZAKk`OzIP!n#EIR z?5Ly4^F8_0Nki&{P95fKbc}%SVDGBQ&KbQuhVd-Q9{N^MGvDIa*HArN|LHSU;;2<5 z3T;?XG>^)!*=kX!EovWX%-HIKg1^3~Sya}@02F-vGtyeT)*t<|$ta{!)Vu9gOa0nc zZ2HltZ+gV8`Gz9qm=EXP+z;}>e9=zJs!6YB18jihfCir&3(5~ zzkfIzJKx!y8uJYMy%7Efht3Q5JCiN@*8L>`zrEdBe75uUsG0N)8R^?;Fx=YGTr#*v zVW6Yq{h_C&Vd_7()A50ppDr|)T*_5?;Xm>JDa}UZmGRB!3rZn!{*ue5?%|5qh>lAP z%%gWA52r>`dEUlbK4fy{s+!ZXyH~eAk829l-&>G=fSCAn%tX8ZA3Cu{uxefr{un1z zH9hTPvwg-*;PJsebbIs2=Qvh%7!5$=5wH{J>*HfQ0Y)O@z6&PrA9c&Vzo|~g!v7&y z>CEj|NF=uVfht$@-ir5!*BY{Is(b3!zE;aZ*JNL942G9kyu@zMF(@Kx_PmsH(s@M$ ziqnUf3l5A^agV!pn^?CP`qQ?2!TXc{mWj#&BJ4ep_YP{}Qa~Q86+P8;>VAnHEfQj> zH*-*(gP#gTuY|2RX}Wr!sp6_GN@jLH<_2GrEC{cfQ2yXq6$Z3N-E=m8Zy;O^@|wA~yV0g$@s(5Uxe36Ex$-qi>s4gPKeZ9O!+qx9c8DFU! zbN{t0prNS4J=|Ch)gXutG7R7pGqbEy7rdsEQK$@^`Folywz*cbMK1kl-{GlJWY%On zWpuCnoLp7qcEQvsV1BbL=3$SiP|q@)`qBOatFK9lnqWOeNQW27WS{I**lmg7Dc9v3 zJE~{b$rw31kj4TZGnNOUBMZ8f;yanH006fkt4x%aIK{jRAead8i+4Zq~-psijAshd(A}#q> zn)q3cl=5ZokB=^N+`CNAh*-&3zr@JNc_NR6_PaGL><8zD&3d!N#5O3yn+KrUmB0_t zh55yTYB8H#ZmY?&fuCn)#z5I?GE>5mP(6352BKN9vr>8vO!nIt@UIHiRs4_EaUFv?~gw6WOJC zfZZ-~(Djt--4&6d7@AGzHl3C#v_Z+tgnSM zyDq*h**n^-~+JLYU^joP5jFhY#8K!S6p$cqGiU%Okqj*ic$d6D>!T zOLg&58u9!4xpUz+v*noAKu$V{^|TDim1`{)RQQLJQCo0C(vQcT$0|At3XW_52 zq7G#4-f?6v8Vb57E|m2P)ETa=nH=+zB39yi6Vy+KPLC5sn@p3*iLu$9byU3wz!LQ@ zPnmY?>;vR3OLTIYC?@;qI+Uu!#)KQdH720;fy1t;aLps8Klm!Dz_h zIEkkk7|!k>8x)M!>hJd!PT`~+TYAhv_rG$#O5JDN z^l{sLr{yWbt0`x|;ETs{GH__E5}d7ed|Vz*vHX+e>PsER^-;tM%!PUe07^04I|n|v z`&J?XT#u7GTdA)v4-SVC$K@^IW3Z^X0HJu4XWhWEW<6W>4Yww z<7snq=Pwy5C4=nN-5sgyFIw`t$}(gdo%AZxDsh>T%AC#R8)Q&J2c=k42Keujlq)GQ zXkjeOSv3|lYT%*`006cUYL}>Wmo}Vvxj3)-WA*#kxPXpjO9IzWua*~PFHJuqzrOHy|4J|xWvQUDQ7y!@C=xH>kjZnb z3pq-ja%r?_@et?v6(@?hsQ$|1>zgiKls|R+fvF_aWKb9x{SKoLh_Spao?=AG(E^y0 z1UNY*0i3WNFK)4z09>c$u+afF6zTt5p4OMj6$(gTsXZgWoY}#ATb_xj_tPq3{aqj1 zhn#EeE*S9QdWWz9)W%&9<3eReVD^Qm0@*pnfdID@utvxTkbC zLt5teT&Rh=VyRm00cxs1_Up4oFaWf>q8wA^gs#yShKZ1JS|c`{LoNMr(U#^|=>DP? zMgg-zQej1XJ_VAU_N}1~F?n>V4xMFBr9MXbYv)}OjAGl&h~*EH>LZ5PV8Na7r`02%_2 z20Ti8QZJjYVD6;CD|+c{OoGJ)ytV;Udyw^~FtVH5X!jT0clZU&Js9oaF#~lu7E$%m z*EeHLTwdmNa|2!-K&3+T7RVBy-iB3&QDv;0yoGqapVds))mg$Q<9vybR9p$2Aq-YxnQov4&x=p%+dMM>M^89&pD0{p2H&a$ z*u~4f11+74c{vXb!Cl&p6fO22xim;(1|ip2T|IRw7q#_x?Di5~3wKR%aR(p+L;vLN zFOQPMbSuoa<7!&OC4Tv_3-bvNGHw9%KmqLl{Q!=rk5Y2_SBGYCW)g4H!*YN_LJS8d z#cdPPXpFe5fv+pNME^q`)&bI%c_t3CT?=BU`yD4b z=wa5#3!tLNIHV%WBXt=N*xJ(6#o@Dl#oeC|POh38x@B9wRO-jpMh#&AD}u zL^Gue=(N7=>E!)sAXN0pe!hN14dr9PEK621mVa&O`^ovui5#Oo)TSTfA;rJ)MT>%6 zKWj#QJqUI7PkxfvTxp$4!}LoYs4w!u{T|uQ9h6b~b@t>r3Oxb}xs<-1gHqaTsw{A6 zcw3U%c_Nl{%qmpI(!$*zw7<0AJD}8E7#`L zB=MS6&ZghXk_N*zwyB)ABM?kTnk@*SE$T2%uo1>MlA~h40V63X5X`0gEevGB>6sXs z=)_tFS$*Im!h=5AJ_ix z9I!~$+KWq%(}t~wmt>3G+^>YNi`1ueU$|TZ*piqOy5>?{pgZFBBo-Vf)idd!7+&%L zjA5ySh>W*O#2+;V8bHKq1rZ70_m|#G62+8??4+?n@W80SM;Zv+Dv>=4f2nc~-mwC4 zOUZumnbbRPoPIdBKK-&O&gs<1-2KbgBv#QZ&?dpv^|`!59XxL%cG&}~GTw5cnhfU* z-3HZxXP$sD%J;}V|AhB&yvG87)ISbZhJcD5R&=SR1q}S@)3=gfs#|y2yAOH!b;>_n zVhy|myw`@Vr|jdstN* zn~UKaiC}B{r1D^2TVpr-Z7cVF?#!bVB0DE`Xt*mDEWIyrSa9lXzI*=I^C!qXRsBct zLW#=i`U946;1@`(!Ir!K5`Nkt~|3fk6SGBDhvE%)2F^b5UoJ#{b7CzU( z81)HX9#eI$koZG?w#fZQZ*Kt|k&i3S2q1r{4cw9eOv38rsQjzRKqJ1LNALA@UVmYz ziH4@6Q?=BbYQYxBUs7Ac&w{1qEk_k!O)^e&-cxM`e0f^WX2#fYE|!Vaho0I!_#)1y zR)sX%HgsQ(2LEh~m%Fih^MD&Q0UboD`AB=*QFZl?%{9XUegqGofATV`ycF>AaLp5U zv>Ara>EhsCuD&E~clKcQD@%I;qIG|g?{fe{&ixM!YinNZjiy#vH~XwVws3h8JcfPC zeb`%lU>!X18tgVk`>vc)vJ3;XV1BlyIUkAd4<&BG3$(}USqCK&`r(BJW`3;23YTK1 zWrmx0#T>~v`0Xw)S-y=Ag#l0NU%p||-hXUd^TO|+Q5SmwbK8I+t&EI2Ct|9F5M*+f z+uvt1qTUfK1fhuy-ZtV*qj`*V(7Ikde?lA35_!Un)=jXd_m&L2`F-w%`EJcm?;o1H z%o69ra4+PER_6;Cj?gywspokqGgkSzn$zLAScoGZD9=ULa_Bo1?7qC9X`MwbZZ)Q6 z=3G3>UzzAV7n_B?Kee=^r?zPZvwkLqnoCVYe3hX$bslYdcVSP1KSXHBD_>BeE-&LD|3BK>(hpZ&ynBO z@iwfH)JnH^j1<$r=aq?&hltGC`=mRSJiobCmO$_zYVqsNA75m%i$~;h>x-tqyQ!&N zEVE+rILGJ~8CP#?{GTl&5-7YLHU=@-E=c))xSa|xSnSJ+`pNM|Uh41h+oLFzHDQKK z_)&d&)+mw_HCVWrK&6(Rw!}#0{i`MU#YMR$A$%Ms?XeKJ;zJ(l6&~Kf+|9R76ilVU zmt6HKwfbQ8)AvhK!d-D5b*BrevNhNXKQb)=3!@o}b@;ywYi(1mqQJVR?$_IO)tFwm z?@=EaD=dRBF~-)txrg3sA9;`yF1VWI{%M9+H^9f`-D~RT ziRJ`P6Qs$$9gE8~r%-;`vIH0b06Ai6k1(vy`DgBFA>+#{Cjdka*WG|0<*~;gB@PSk zM-A^YgbL^Sur_`Ne-#s#b6VdM&Xe&Hq~CR?537d;=d9P25y4Zz;;rhFZZl)NU*}4& zi{62eMQXS^e31#FM|2}(1>O}ps4^s;Up{AN#4 zpU|=1Yfe12Iyc|B1q&x4b=W)re#8(g- z58kQF^&#ZpWIynNB%T2;|PBWaECwJ7F``G+Qz;r{aDqnB?9$}73` z#biqU4Hb^LWYfuoV17jDkFasSyFx(Nq76Ho6N`{prkgA-?^Mw4;N8s`4`JR4V4RV$ln>-#%V1Y)hlZvCjFBM| z2AA!;|EeC~p*B~eyFM80gWT0BWV|-s#=!J;1{j;ws{M5WIhZ+0r&xz@6eXgl*&3#jQx7+p0NY0+g*jOwakB|SZDL#wj2jY)~*vjit8NnxvEm9@#9^WttmUoeTCJwE+<99_E>T12#5BVjVu8paF zS}B%&Gv|hOs2XYx&hwJ>;)Yfv?Vgcsl@8^<<`C1{_$CHgJ0EClMpEw}4-o$5R*)-v(3JwsS{00_ePQC3MN9LutSNIT%<4S4v61!BQ5As{ z+w05d05f^uMBjfB*Zo{dV61i5*r3{3s__(1wK||h%t`llh)i8LJ`;+KJ$ppfy6t3; z!WWx9*QPrdaifM+HA>c&6(R(p-yAArNC@7qN|{rM8=l?{_@{^ce$zTI!~eat)q=aM z{x$uAM1Wm2ry;mz`ca*(e&GuN@f+_h2}Q|vn|Kgn?@}VvTJ+rcB3J1sjwFkpdLTjeSB#}KdB1)64cnwgtaD~u9&jjCG+&t^GTii5Hzc~f z)eyj#Szdbk-dvxkty-ySQx|X5NtQv-=1bfgqTT$RpTk#7_b^F_)y|A%mLYiw>V491 z`1j-L4fKr}`Ajd}g2$+eI)+W*wS`jG8gbsYeqDz4G`aC&{oglAhZ5=)nu1gCRaCBqNC*AQ5M`i2JFEE~~ zeRvOZNh6>F+EF8BE;^yn@|V8u6M>orVZU1Oa(*YfWa zgS|NO%Kb`6mfKTI9Xn5?jNd`co8+C8efS&}QC~OtXC^o5+j7e#>c(F|`op+&AQM|l z6yqWe$F=!o-5?10bOQ-Besi(^9L>Hki;2GM=Ud6_y^KyE-20GIhyS#CgetgZ2PrG~ z8pq$;gjQDHvKufi%hvkAwjJZ$aLmz@<<)(D*Oi;y%bA=S@wU2@VPyw~S?~Dd<04U&L|1DSByW(B`S1_YsgfIia_PjSR>_k0rO=zp>W4F@jGom#*20_vKx_a ZJe@~kYVMyL{P)XBPuozdO4Bav{{X#9Og{hs literal 0 HcmV?d00001 diff --git a/static/nodata/news.png b/static/nodata/news.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d3423a9dffb50c8ac4d6349a24e7a36c8f89de GIT binary patch literal 9134 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 literal 0 HcmV?d00001 diff --git a/static/nodata/order.png b/static/nodata/order.png new file mode 100644 index 0000000000000000000000000000000000000000..72e0cf70ab16bf5cb8e5b63706aeac97836780e6 GIT binary patch literal 10139 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 literal 0 HcmV?d00001 diff --git a/static/nodata/result.png b/static/nodata/result.png new file mode 100644 index 0000000000000000000000000000000000000000..0b0209a5a6a60c656b02a2f10bc158d0406238c9 GIT binary patch literal 9993 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 Hu0mjf^nqmA literal 0 HcmV?d00001 diff --git a/static/operate/checked.png b/static/operate/checked.png new file mode 100644 index 0000000000000000000000000000000000000000..1e4000e82f83085e519abca37e56edaccff13f67 GIT binary patch literal 867 zcmV-p1DyPcP)Px&9Z5t%R9HvFS4~J1VHkeinVlI|WdkwrupN}ZG_p&7kO%2f=BdN7D;9X@PYQ{m zU4PPku*fb6g`nAK5tBW1G7p(VA!v9o!cJj=Axn8M(cPWho%v#Be^_#qMk_gM3R6W^L@dOyXf{z4xC>5YpqM|{{h7^^jh5Cq_Uw+OqPLtDEHzn^6k zB=9bBx`G1$yJ}9oG3xp?0d;j2480CxVnQ(xph0rF0@DCa8ml%&oIA^-xmm>AoPwvl zVPgScMkDYWz`Bn#M?FrWJ3a4Mt5~dC@vxl42Cf~yIHv?0uLXEC@<&n>2nnQ{Sl+Pq@0sR zz&Hf8r+Kur2;ey2!=wVQHv&06TyNeGP+M!k%8ClNN7h4-#ixb9ToN8X#-X)Ugdh-> zmsPxY8Af$Ahf5blFvif+6UO{^v#w84)RNGA8P?QrxN}>CBoU%f1|opx31jaf@Oq|-e z?3Q>d&UF~s?S!gB9NrstyG)}XK8&>EypLnu3;A3~Gy-{F$zq|<*YW%;rHNF@>sp>5 tk=KVwf<#`QW~r5%x5w$$_OVyb^M5TPx@;z>k7RCr$PU3qj=)fxZYnaN5*RtOLhvQOBog25_+EYSq1qT=Zh6||t%o}*O( zi>+0UoVp^4N_%PrDqw}9$J0`ehlITfDj@`9OD2#6vWJj;A(Om$x93jQnfGSq&6_uG zCNS^cx!-rc`~Bu_-~AQ>Z~t;Hj0Pc7!S_r7kO+_j0Am3}fgl2u1OhamcNoM7Lc2iG z1fT&x4L~mfD1*lD3@AN~tdz^%JY?c^!tE&^2UF)fXf$&{={x`o042YRAmjje{vfo$ z2XI$>wUW$T<>eiK>@L+q!z~5qVu0vDsXB5ILIG+3$k*U?+p!?Y;HpAhrB`R*Vp8ra zi~_HF2t2j{i9(Ik17!dCWc2Vafnpg5{1uYly=*ADL9h*enzu1OwZy%h^&Lyx z-pS#jP_%2-0`wUGI=A=do(?#GY(xnEDsE42b59p)0FrBX2*7$!jC1E8RO3y+PGqZ) zrQhkUKHalqeS2;KwA#%8=DSO95A)p*lW7GOPP(MD9LfWdQ?v*mTL45VEv%REYXs^QZD5H$)|p3D1HYN&$BDDl0tehFA9PUh)P?7n@Nunaw?;^eWfulal1h2ElLPA z?067z6k6RPWG2?=+Jhg^WBxGK!>rY9GmLl!dAN?jR;Yk=%2z7ag#4PcBb zLR>?%wa}0SxGU|X+%d@qB&T#1zMW`E6zPEE8r}!R3v%VUuIUIqK$d=`6dgzdq}Lqs@9XFW zE=70Fv|%rk_e(LeI0mHGP*`vs*ruFOu$;DyFqx(~GDtcGB*(Dt8n)WXQLHO8`;o2B zw8y|cAnZMZVuvdd_-L&(K(NH#dx~v9*h^mrDY|AJm%Qbl!5+Cr&~#fbkG28HDgFSU z%#`l?6xRURfb2BU6RS8NITum@Q{gav16N#y3Nz&3r%4xcoUj3i;ZuOQ>G(c3YG4zx z^-l`!k%A6$Psf4xzc6fEbsT7HR(K#5$An_q$N(e<`(va|104Y>jT{PEy0E9A6JOT0 zqs_#-QTHOOnTt`NCfVBWOE^Pvi$4UVzgJf}<$IeN;*Za!jKQ?9K!?m*IUetpHDX;^ zBf6=>=E^l70XYg_hUe8PPlD&-!|_4-C=d}au9|opZRx_5ZWG1@=x{@5077)) zGiY~x2ktJYk|%`oRC&nO4>*Sm0@522Q0Q?lbms?Trg$YO5^GbV1=Ji*@kVJQ-oMlY zwpa9jp<04R#*W16DNz_5AoOs30GWFq6 zvbR&Cu_j6Am)FkmxbH+2_BUR&DPL@W4!dp|hv`jHVtFvX56Huf-@;C0IQn9P83YTeRO; z-h^ih>m~D$-H7Vxkl3TnPlrC4NXV-gKoe+U_`cVQ#myH}U^DA+>y<1i% zHFJ_MX2=H5W?JL{RpNBm=Dr14X)AgG$uX3OS&$PX80Ct5VC z=<31zW0g4HX$i*I04?51jYfQsA3m>c#g?j8o9z7v(2%psRtbsY`I z@^_+*A;>At1n6GpC_UTyt6z-8gJVL?LY!?g;+_-LD7$J2MnaGd2Q%U<{_*z~RN)*?p@w-A{A_vCr$SrZWH9W{dxYsUR!P=5W*9Df$fj-Y>$OeE~SR5tO zdtt-GzL{YS1`~D3&(+vj+b)n=?D))4iq!AQaIuS1ag_8!f*iwt04!3mSIJ$mS&$ta zjN`3F?37@}um{E`70r11oN#u$m=J+?MNVv6t6K2*8P&JeT?`PfG$_868ih59kpuUF zm(O3po29mw4|`yITG5Q(p1Ta|rw&`kXLgriW)l@HzWsmFJO;=G0Lha7wkkAyFD)9Y z5-n|0h3!U6IwBtQY7dOfmCbnatQZ*KcsEUG8D>XacFR9t$NuF;6_l_|y%8W0ZtTP< z)?#2V20Lq7vE)>(fR{Zmwp6y@iL-TrnX!tQN%TT6cuKMSOf9xnt6=37)e3E5n|g=0 zyb#&~qpFL;jGrzEUh)!y{BSU1yx=s&#`@1bFs!Y$w!om2;;FNB*ktFf;?zG&R%6o1 zmMnIR(8{7$kZ65cG*((IQ;dCe7l*mWDo|{7>0@9V${26H^jUvwLtcKSPGCB>2gWmn zm+`lX76nHniFNUg{PI9KlA}e}?g=Dox z4tL}UPg7w!4GM0JM^dmb2_3teJn8_9{!XTZ_#-*k4@aB3P}{AV&y}-#J~N#ZZ2*XB z#>MF)1CW2~1PejCd5SrC75K45=#apCtu{=weCuY!U)HqY;nOuRspQ*%|Kjk_K;{ z2{xc&=J!1%^TBg0j!>2F$c#AL7BTqlz&6;p|CQSGryZds=G%BiSTD_XcIi7?Cji6x z(s!_-1M~7#^FCBYcN$%$>QA`kvl9_Fyl@1fhlF&8B$kkD1Wl zNsG3)XBc@NfqR+VbQpc+CtUWa=;Y9KX9@x|gFdyp>e_MNN%`5n|G>ZydC&Nv=_+RC zRSY9E(C6g9L{`xasCiy8!u$qJXZssEkSTL%S(6xnx6_2~K+JuI9THB-bO-VXiWY7_ zDmu!YojC!MLi&ms0BGqkA^Kp6U{7$Ql$R1C@RkS|Z5)p~^DE7s?!)S{aFkQgmGrYI zF?cN2GUwT2r)sdxiHq7F6C?3vn$Xj|)5K%J@hW_$hCi;7XbW6P&C8ad5ESW3_9MpY zfzcuO`X)6QFdq z(AdZPtL{Bfh0?3yULGt^b6wgfJTGFVXJ9;dvIgH?5%;31 z4!;^5VpCVlFN!%F1lbAPZ0<2(VL=sskPrjn#h};-Y3l_i7Bj581*Iyk zzMDfRA*JuHA?S zPE^BS_0BGp-h0}yuxL~K&}u$jkvM?Gm9v0N{RsPYUYJ$*<4a9=t)u}R*MgbXVd4Px z*I^}zy7&^cQ){q)#vKtscpxSOGsA1j92MC~F#9F(rHNG%6BpCOGEsbql$8QRp+w5&4c?b(+(lFrOf}vw zi7y$yd`uKi#?M6Ym8*~kh}+6lFmZeZU7Q5PodsR`Me&t9k_w6nC6D?=@f8Jg0E(JL z!3ORpzOs4ZsCc4mp2bY@6_y+Vj0X!#TI?yl(yM?slwKVG#aEozdx{hHgW@aSEkBjr zkTp+UK5lzw3}1nJsmEf`cFF@XXpr1|4HpyJ50hzyql#;CkZ}(ngZ8h70Ia`e>R7SI zC191kqF!=97)s+_Kv+-g<*{9}7NE=tZ@9kEa{$?h5dKwL#k^bvqMzRVfDBwD&2_ET zfMS{2E=IDI#awj=wgK9Ake#ARe4KiK3@l@(H3rgp?AqDzH5OM%Ke-PT> z1FRx}Cjsz&K&&M+r$Xm%0Qkv(CJ~?s0LHR{1^|r&GywqZiy|dPfHwk!r7vZLwrT)! q5#Y-J%~=r5DP*MxbH#cQBL4?5kGd%%@ik8X00004lnVEP)Px@ib+I4RCr$PU1^k5#TEYUd%X^e%dm+a7C~7>R16-M1P8-nPy-0vY?FY%kFbLR z$};RK3eK>^a{wV>km-ToL?sdu9Y~BGi5NW~2#SCl9oYtD>vi6%oa&yQjd|U#`}KR> z%yj>nbEfLPTlcG~yVR|^gcSb`9Cf*wHDJ1nG1e78TM*hX;1&X90_-M$Yyh){hCx1n zc>(%~ft3>QBN$EsI6*{T`pjhqi}D+tP30j|sxjwuvX(M=vjm1m8CVv8HVNkOB!P-$ z!XAOyid`-$Nicm)(h!~h%xVTUYI{`M`lqnf0dfX)UD z{8~;24!o3UwOX8joXtS@8wY}t)QAz-r+~28=kvRYiW-+DK)x}PFdUE(BiL<{h(=s02wmM-AX82xH&cYX2_Ld?XwY zr_=i+gS-jA&533<#pqoCV`B;n8@!!Jz7ht=`0>pA^Ci#AV3iPZbn2JfoF&&43IZ?!Db4v)uq| zua%kWyFVQ(6R7Wwt+wM@#-Rz2;lr(+)}#5<F*GsMEcYfNAk^RiFDY;I(b8jOl7*pb8L&e;tWL zL_i$F-A>3T(85EyZw(0u7*@D7!=)q_ML_sTpFP8KB$W=ATC^Z^=`5gCYXL29Av9}7 z$jBhrY@y+Ky@1=zaP}-i$&U=DzLRn2u#D5Ed2&h0{7O7-dq<^{M@2xKPVY(vIq6na zt5$?xJ|g0Q2ShY!BE%)t^XFxJ@`;3he<mi4@RS!rQ+3Q{VE8aI z`t}te2vLo{gv=CKX4t)3!q$QS0tq?qi-|42Nwl}CnfGVyY`4UmD^EYsrmo-#6{@Xk93GiO@S zu%R)lLJ7PpR~VKr_u=brj0A<;ev7SD(PpYhTdgJqr_(!uL0+SE#;NV!t($-u(=D)C zlM6 zVDNeXA_V=B1`P<@Uoo5G1DS)ebg6MGg@FIMTp1M+^a`$nR|3k|S4L!^bDgndN$lIy z<;x8F_e(f%P{Q%!GW`D9r-UdX2uinZA|B`|qFJ-pbQ9mc=FasQq*I8=Ch8Qv3Q+-w zW0+?N7@MPI)~o5ut*OO}tY{O10_Tq1uD_RI-#!VFq~Ki2$2Z5SOP2%C<315xx{A2Htq_c5Rs9754B!92aQLtk43}^{6aKYsO_)8a zJn*Gr9`Ok=XRglx=aF9)vfak7*9Av2beLx(F_y1_M@>x@FSe-iz)MSICD4JtV4D*j%6=e=OnModI0B1PuJG34QvQV;TeZ=;zH-P*yQfirknHjoMaV z-x37G>GZt8z{Vty{xzg{Y-;wb^2@RjKEzkXt1Eof!06mr!06vw;`UV}DYTU}ZXBQG z_0r2e-D6(_+URoGp9ym4aJomG^D0DjG42% zx`*!lW~n(jou1wd?0vmv7pFUNgb4!%MBcl(X}f4~rJ2dMsR@6u=(;j~_(8_ma}3?? z5+I6^x3ir)1K9Fr7J0^VZ~yhz zLwbSxD9e`G(5O-5K2xW8^*s(|$Rmf-{Z{}_B@%?Hw0idzF>Y++*|%p;8MbW?Ibht+ z;KGR%i#l{j!s^w2{Cu%?u5Y{nm^8_PE?txlxwyZ=Cjqy<`0we#CiLzdd0Sn--j5H8 z;|LX~7w+5Sbm|*W95dRCK7At3_PkX-961u2<-L9-!r@Q`kb|-8MSs)~3Xf;K@O)%Y zwr}^Ncuz>c?b`{MF(a~BzWX0#*tAJM&z%Pv$>H=I16VutAjZ~m&KwKw>Z&|bxv4vC zy0;=wIAMYXT@_|F-=?Nc^(wB6nw;^KlACK&+`f(;m5`ek+O{}=dAYWT%KhL$2}_sh zY5vl;@v7~ba7g%T@4Xkm=KR|_&)24()3zaRh2@^dijq#11%uHbI8fB1ka=bxbg#X5k zv*6x)A{zpuvh@T6QoRRcevY>yZZ>|L1@|N$kR)$eMWx_S$q@F?HP=`Tx-x_Q~D)Ssq;MG8P8U3K?@gHBOdqauhem&UYosN9+I$jZD@7! zqh%gZh?Jyfh}k>T>E1^=W}1v1ZARY|bqos&{n-1jkYm`fgMcYhlIs|5=O{+1le_*8mU(f`>->^)sPgUz6(8 zqNF8T2LUngI>Mqw)|l=SYPpWUoxYwuMfC4yikga4)v8MRb%eTfVaH-YFf*QC*y+(j zjGEq4Gpv&m7j{C{mcAJ%RR^B1D{ZAL_@oB^@hfeanS>@yNcFZ<6O5F((iQ^5*h`;x z-z{MJwDhG<#Y>;*YthDC_6)7eDA%IPx2-$|q#q85cwms2e-g0D<;qZgIDmg9{j^46 zgsp;#x~DZlCUE-k85IK6)@gS|!1vUWyMk>NJ7sG+Bb^j8s%C>OJA~GqDMrA6lP@<*WoN zt_AS9p4p8F9C9j?x*(fz&-VO`Q<0dAxBsovha};T@pD$v zd@I7G@<~Hct^01Xu;>2N4(&f8TsC;)-^~S?2Alg_DVqd9U z;Jzv-p~`M}17N+Q8i?0r1NtB!;F)L@*WwwPs^DTggo8oJP*JfJsZ_@*-m#STD}jI+ zk&1e0q+j{6wN^q({evfu4LpmOjETuCp`>Me!833HYdlx&^OcHuX`x@WudXYkx^D5d zgCNZYqimzA_h=B7AH+687GJ8ZUX%v9id_u@B+LQN`;sKza|~>(p3g#Q6BfA%v_TZD zuhc9_q>XO$-i8AbW+^+HW%~U-Cm?4t(EWP9JFh|%yk706fUwzTvAU{Oy@}p8aV?St zNYx<(uR=&{6c`2r=wKW;#2?B!3c?Oqr2KFVkHm>Lc1kG$NL99Zr3RV2SpvhO3@l5B zC(ut4s8}ZK5tyx*S0spCZ2I*`IY4R-mEWT``^?>l3tbXFuPWk_EOIO70JHB)P0000Px`0!c(cRCr$PU3pkkSC&8Ty;=o<$Y#KxIId_=({{&>nP|utx2Qc4Fk`1R?cO~` z!I;S+A}GOh+sQO&oKCyM#H7asG1F>mOn>8&j{5_5Q1`?z#8e^Sk$+?JflL@NY)m$&o63)MQmdd>k-}L{?>(KmhqDSe0R< zMWtqGiX<3?trsk51%jd(Mrk&I!qUb9bDuD4F9T_V2t();l2)dWhR_fxd1SOYJwsVevs&FbV|3M*CpJERP0ITHt*b`>GB@}9 zGs>F53kXKBfYOJD0k8q$i(u)H);5;3?zhBO?mwD4`73_~>MwnOI^LDd8SkDM(ywyp zE2LGqjM6<4A2<-aiHuVN&Ii!ZJ0f|-?jW}xQ5&;mtE*GeYQ>rt|m1#=Em#CZzozra={pj&7PHxqguxkQXy%I*}J+-tX>|I@(dx?#LvOxtJbOx+zr6bm$ei_meL_<+;uLAp zM)}Lk_nDqi8yb!Ax2GT5^5bv(>4#r{{LAatrYh^>PLO7;)*mK%3oWBE7%VZhv;ORI^IeKi(Hn+c ze@ck;#TyXxGc*?mU+Jr+Eng7a%b`hZoK!iUub;vjkknOo4=I{r(#0~?m+7pL^+m-y zhRo+9173jG!XXa^|Guwy;CuupqzroWme|Ube8Ma~0l`3_rhMe3-X5D0B49CPG4^E~ zS~}5JK+-25=}RA6>8(*)F@p7n2BXA9dt%3P)xil!>YCdbiuyqX{xA`w?JNOnOm$}Q zwh>R3VJA}NW4*)OP|xtW23hs@C4E{L47FsnA`b%|GpdCNR{1!UeY zD-S5YjebcwR>akmkU+pQ|4hN8NfbmyiQ5y=*vP=ei!^-o7aFRnxWO4amV|jPs(}11 z+uYQ|z{j7MBn8FtNW;M+zZ?9oo+RQC5ZsW^uQd5$cjmyyk0;^97Zosa1SJkhFI1(s zY54qeD_pt4bSdEuhNFPgpkR*v;mE6#JZ+rt2uRwB>OWF#1LjI937(ZDCK9k@i4ukn zlNJc~=F9HT@X<#WsHm{d7?K27xk3%Gv7Tq4)S%E|%|{RK9P|@+zPbQ{`=&Hy6Rre$ ztBz6$@Y4lKm_D6yE*Cs86kUvASU7cxhX2}c0gD9yH?6+%iW;J$J%e(unua}l%%aH~_l0Rhz=17iuu$W%e%5OF%f9|^U!0o=O9z<~p1xL?O| zf`SIa*54TYX|5BkHLUqy@yoj~p=95I}LH{MV~XsAz@NHRe< zDnc-7Ywf=Xf`!liV1lwT&!FIJI$Ugqn>V}a9(`|N!_lTCq9OOl zhl4kH1SD-)?LA5tF-WLj#gxaHk(H$u4F(FSv5|$QW)_SF9N}Q|M?yjfKz~K4^bWG? z%y8!&LD~Cp$4ptcPz`_i+9C@W*ft&7Qhj)L++$q;!6O0Mk|)jvVi!8CjDFU^sx+?oVz`V0 zf;Ei#W~$>TgmW0BF0cNbqJ6+G#EfB#e6Yi0v%cj1to@rmEZ#Nfmo{DIXe@1MT??fT3zxg`R~9K@ z=1hM3BJ5_V)dq$)!GwkaXtnlk7>z9G^`1v`(r6N%e_rLUuTN?|zcblQ?PUrOk0hss$3dW43U}z#~ zi)Fcf77Gj2H7wk`N!!9DsAoouAYuBnj&O*tL5E<3g(0vkWNk1xokw4E;{PYu_N1@J z;qf|KZ|1EoU8ih#>^<=n@}tblQ}Ob^(JL<8W`>4_j<{1u2*B(YlrVWR#i_7eIYEJ* zKTktsB!6eq0fwU<^yss*rEvziq-2S{_xh3TBj2|HlDe$ss6zM19DZUIR|;cOZ@sDZ zNsKe&z4uL>z`*G1;-9Mo`zm}CxGO{MU^xE!)vrw+V_!ZyBcOma^xI>_yW{8D07+k5 zuao+;t2-~7HmQ6D3UNdi6m(vuQc@^Lou}lr%(=EH6&P421|)NGms;G!5p-}>wCk`^4)Cr?`7=rOCa1cH&ChKg9&CnXq;mfv{O=reRLjLWX2 zTgRLmMa+Hc|CVU)j@jdHWnA<>dszXqXLBDHLDP0~UWb{9%halWWuJSFg5}G&N8gz< zRyb5-cfiokK;dx3qHf%vVf%J7w6xke@s{cH#wS`+TCIH$pd*Q2TB-t`dyacq-L=aM z|8rVIsDP)ytlbEm_a9}sCv>-3a9te;>> z^CZa1Qo-Y6y{BW*)Lr|U(HSUQwMqqJ$9OJ}%T#8j(K$1ag^k%7-X^iTpHW&$LqVZ^ z*}{NiVS$EIxnH|RL;e=|%wIaB?IDrAsM$)IHL@kJ3k%f{>k@5s$FaVift=h9W%>Sl znl9lG2hE8S7TEV`XGM2vVT(<9`rdrY z0B9=XxB68TBqeztn`nG2Um;xz*PS1RvarPb1$u^Hd7367!1;6^w}QTWnTDOa?0`f^ z6R>%ccZ+P*s|ILl>dXWeAh;Z!Ib#7_2EBbbIYy}eE@rlTxeA_`;2jVQTrONBA0RBj z_Fh07Y1jMr8QAfG_gS|w$LNfktyr#t3Ed4yw=Y>GG;G@@?ULo11IMkW+1cK$r+IL36pP>-^RqDQ0(M1atFl&}){{px5tb4s<3EGsa z?v(CzuUl@V&Z1KPzMH*VfJB4?6clJcqw(y4U%x@ajve;diK%6bC^+`?da5@dW^dZc zd-ti<$br5_n%MsrFIK{I8687!e4$^l{%sYE@#51U-NA!qID5|S7>*iALPkb6JBHy+ zb@GQ!QYb*{h3oS-bmCq&&WzQoxxqk-X?>Q_sXx-wm5}l*cSIpDp_5(`TtrZCqx8fd zkdTt1@VZPnz&m@^3I`9_!yq`D-rdqef{VQ={LXh-)#+Hs-P93SeCjC*7XGYtXcF)E&yGF1N(I2ijlT0W0ZUNz#uP3WC`E_OaM~q=K4-Rfv)HwsfTeJ;(cZYp z!5tKw8O28|oxm72jD)qBzSG1Q70$_(FUpI&IyX7skKVcs$N>uKjJ+RsK1zUbv)9+D zAuP;yhB4sVfO_jjIW%o?qulX7S)7?c1PQ@dvql9`k-iTIb<0M%-n5kz!y)Ar4BWU* z!==B|PCvsjTX31elro>0(QR8vk=fp`+1g-Wy8z$-0z)G+W+-6BbOrAW@5v`Am^nk?b1RaoAy9FbfsGrx@i;U zk@C5{$K4`BBVfY@6VyErb_0YjAIS6nUJmTomaXsOk+vq*cBKY>c%&^dl7Ofvg7>oI zE+ove=jWT?c3B|6;5gETj0O78=eThsytcM`4t;tWtq8{Z|6xD$8K{r*&}Uye7VRo@ zT&A{e4cyGYwtXIpwkh`&RRDYgN6I*^-O^RMey}ZHjAr|USJjoPy}CKhD_P6 z_$yDo)05th>U70l904)WUat6SV4=2F{1tz4f`ac@>4u89;?HJrttrV+)F%Wl!ITgo zYfM!p*P~)SlL5hNVx>dF?`vZ1W^nK#Who$$>>_1kCV17je~?Ie)wqL|;AQ;cL6Q72 zeq<&1T!lD5WP7f{<}d~ybP9Hz)yp6wJX&@Yy`i zpmfW#d7WlT@L@?OGTr*HWG9^xe0mjn#M7$|P=b#W_n^m#oiio)e0R@zzS~v31s}NQ zXBK-aUz5J;kX=Mcj8^Fw?_QB8sswHxMcRr!ykDxFIPDeByGQ^f= zdV9>vpZZ;CWe3D*iRE7Sk)}2wi`0eB3H0kdVugiUb(qlBW5&3ud{6I1iLIB5E?|H- zn81Bs%KJmtQ~I#87hkf^_0=2Sw9=L6Hb7jvfJY&eHG>xrjA8+$4-X3* zI0Q?Fw6?LNb-yLPa=+sZ59!1!yrv!jh%4K8yiU`QFpV&TP9bS!iqu!2<7rohvYckM zx^u?psxR?H0^wqlkD|u`;@(v}N3YUHO;$C;#{r{AWL1U<1WUyMt>{l!RBE6pl3?t2 zl(3`~fT9^zX*L06ZD$F(mN08C18J==N7vMvLmJP2kv+3iK5_bA^Zx_75W0c(Px>?ny*JRCr$PoqKRp)g8ybzk7ER0t5(ofRJo>Do;VHbvi;x0+q3?TF2=~r^2*K z+iA6yY8~yg)jrg*I*3qP+X{9Dt)eZpjC~9mNR+e{0YOk63L#mNKoXJ|Hm`l$^XuGA zmTVrIy?6JXyPL544+EU@JHK;2_q>1S_ah|xZ|BK8WQ>bsbpX6su=*5=^K0xVGE|0rKz6xjDhfXY<~1Nnv$K*hm&NP@(N-bo z2`qP=idl|{jPik0G-fJ+&R>A}`v4p!bW5hB0TBI0I5Hl=l3b5W#iRmJ-*(^5%uj&?z7=74msrYbJ= z2|Ox_o&?u z&PTjK6ivI&NE;XeqV9Iz!o;s%LOXCHZD%G86Vt6mj#;7u*;QGnsOtM8{%p!j^Tv{v z&@43V>Sza&QGrmo`>m0BY8y+t#*-&_N?hdn!ca1X1frI?S26gNc$7%x?b`wb`kGek z+7_u@A_EED^mQB`F_%lp@?{X}gk$uaNH>oWfhgtfr@@?BRmlKJv_TZP23>Ux4y4;4 z;rKAV10S>*XJb|031(2yu7n?-TqxB9o?Kp?u^6bDWX8&e$vUq$hRbnIA| zi!o|1j8L|OL1Fd@a?I>+_cZ{BQhsJ5Slnx%p2H%^4Oye`w*@)K7z9Sbp^&mk6czj+ zydnDn(ak#@!kx4hg(g3NFK3U!Yx8rFu0-8#;Y7O+C3X*AL>(faxWdg=`)I1X?YSJKc zNob44QTW|c$718GEKnGX7Qetgj~9!_rXep)H7)&pj~CY+sE72eBjLCxDxBL3q{2N# z37}@U4p;Z(XX4436Z*h7=hJY_{&P6%(=c8oY+sOz;;d1oq2&L!HYh{tFF0%=Uw>W~ z>>+Ad^&JenD78>Y!XI*t!(%fh43PfEIuE}4am&Sj&rk^4=jUK$c7|b1>bwCI{;y7c z59uDNR%^wDF9m@p+w&tqFdhds3=dO;Mq?&=0oR()E+Ygefid3^eKJXkoijoyYc7x1G~pZ3wiLBLCM zv+>ouF+=M2v&v8Lxch?CI`k7>C5j8D6Ly}=Q_`Gq8wuN~`TCg?u&!X7p(1}*>%qOB zw1C4>>(l%81v$7WLQnZsRV#j8)oMt-m5GGUKZ)>8&2mN4O05(uOP1c9H_gt%_oil= zD&mE+ZTQZK=00=5wV7#n_cH@clAm<9;>VTt!_X@vRCNU@W!3uO)-$GRn1IAOj6YnS zg}bJhgAr2o<@$Df<9HLap01*wbM07|*QX}WoVkGe`wek6S9P5ZM2FGm#L;FYq86tQ zF8!) z-x9kFxjFSocO+&*dONjM%Y^darrCz|`rGx5laH7|p9kXl~7ml;WUpy(vvm3cY1 zHP_fOHI{~W>0BGWdA#rZ5{n!w@(|%YeaJcqV5SuUt(1{Yz+dL);7bPg46&5`T0=YT zINAis`*1U=ozj6c1IRLyOLkg)SFPXj-7wMkuG*|luQzsJ)zR|^gs+Fq3b8(Y3n}H* z?O@0o6HF>SMxo&ScP!^lMvMCA`A*#SQ6v1x1w%hS>Ck&fKtIkhS{a$?GF8Gq7Up8f z1oMZ0M)i8Lxf5SG(g<&|!RW4lmNY;nI0*l`G7r~{>vj$&<5$+wg`18vqEjR%jcy=G zFl0@1DA>6u7guM>gHiEm7ruD75$(wfqi4t}cQ=7KVQw&ToeJJul!q(F%JbN?_ktHI zKWKm_v`v@M{j88l)SS>|@8mQEZ!OBhyfN}%=(m0=K4?H|k}anq@H<87?&`fv_HPXH z(^Zr%%ERo@PAk5xL1i3n^I`d+1~dnxU&2~a2V%UJkfW1A9me8Gn2{mRpV?8}@a<3o z8vVlqhE6nibYl16;>=MFlrGMLE9_v;lFutl$j2Ri6d$Tjlo542)!At4@%!Z&-7u!6 z%j+4HoqiM@Y(TAS!-RO6J#yZ4wp~z7NmH@!n#q_PgE@}Tx>t7vP;{^!Zf_EuP8n4` zbU|g;74Eiq(eJTM=sqB6jW>YegAJ(c(hnYn=db$;*Cr!}3rq6{eV<`P)1CEd!8zlT z&fyCKK#!4wO=dt^k;{sxTh@X9wXwsVWBLKc*1?Hg?sEjIfOrLCQ_TgO>XZi~ zG@Ksr`0#$4&x+ACii|;?BS7+l9V>wN1moEn4?ebOHFdhnkJ1*eTp*Di?C7P+eA4Dy zRuI>#Ccj|lW}$Yjru2>Gn=M^Zfkb}NrVm>ZAAQCHB*2W{*Lv__yS+=>(_I0SN(O?V z9(_XMvuN+<3u1bNsWIdEx;7kYvu=EHuE#5p9|v*@1H) zVWS+4N48W_Xw^_b#iBX{Nx6x&?gNS2O>9t=J+&@H3mi;2QjQah?nqg6T!p1m-9t%= z+CzdvSIX6RoHSsetMMLHQqK6}U}Cj1{-7$Ua1}8Tkru8Zs7)%Mizz5_1Gff`Ub5Vq;LS9$ivl^CCjAKWtt|l~iEK0Zh}LB)vIkC-@CggRonf2g2du|NpVBNa%nApPdi-||-v-bXw!tA{fKPyFyKt&6hGKZw37~&j_RS$iYgyr*qWZan ziHgBoBEbcE6^M2dbD8F(-Fid!a@b~J3PW&9tMfnHPx>{z*hZRCr$PoeOYO)fvbC-@V!0JV1&d$s&UwR;0eDR_$nY1f>pEMMW#hLq&>h zRq&CGVmsEhSRso%Dvp3WoL~j5S{$5OtAZnH1;+=dqbLYMLLNeRC7XTS`*qGH82v953yzuI($B)}*fqqRFVLOl$%K`&* zz{kK8Fc+GZ*p3WD0RomPfWNA|u+oky<8{~uq@OQ1M1}Sc1Cs!_?QCQQb%hD2(4fw$ z^XG5Rpd7nY1G#ASd`5hO4000hDASL^sM?qk%{N;P3HSx@}4uh}YM2u?~GL z0lm_#ygTM&;GhEK>S}+%hIHDO77)=h6wo_47#*uzK+(aMrqfeQ0}*oueALIhs1On zYYrA(Y;>Pu7)Y@%Fqgphr7P93oR2~CYW;=x8_|IwApJ`l$LPSnj+q^}5zU!N!(aut z&WM>MB@pieO((IUe{u}irp%}~owW6&E9ay#NTvqjYkIT0T5Z$OY9@JvmAKkpFsidM zIt5Z(8W=~!t1=NHm$$tJnCa%)Ifbi}=_M%;anh%9;Op*kxRfm)hB)NXsPMF8Cyz;i zcpnVRWj(j5k^zzwnpZu$<5gFOK!igAK@+{BOP+xzQ{u^e36Eaw#?J>U*j%aOu2mt_ zNj)J?YFddh)YCe0oahjU*Vp(=%uS~o{Vo`!VC7^FdgdQ#^0qn+V;4IEMYtJN`-^^) zsN$o52)`+fS-8A(6<3{6ja>qL81HT@6SOfVU=h|qTkn15_-!53z&IY%2sxf z1eczwV8yK-rrU(BN#PI!7~#*@Z_c3 zZov^KL;+PT7+Cc9v8HvT%+f#@YQijE^LbOU~7=Or29nR(+f4++Hv2G}oJ`5*%3KJfy zEid|`sJm725??^{j?X*B7zdjepYGOiMt?%z9*XJ0w^V8v{bUHb zxYi@}M_Slb+I1eEp3{>q^~qBZ5CvhHX;u*MjyS0UHM@IWv?9Z?#y=y zC~k}xYTO!Bb4bUzj|FY$Apo&5v3gFyb1@(#zQ$z$CTD?uO^HxCDi05g>e!(0@%I|8 zdMebeJhuugnc&71ryGOvyMKhRX0v8WrVJ73{_SB7OlY&_q- zYnV=;`3~vWaJ6DJJ7=s5x14VdM!bSoK8<493t?z_^S=l?SHH=Jv1GEOGe`mGw~y&XZHBH*vrxG|vjk-do++GebA z4n_-*1yt;7TtmPZn{;cs8Zikk9OuTE;hDkctm5Z4H4kaBcN?i1&%mox;>%uxqDuu9 z-QvcTXUc=|(#KIuf3f}il1gzB|9=ye_yXGi9wM=lw2F4;0ZS*kF>07R7_V-Q;`h&I z4Gdw)+AexXJ%HY6X-!flv8!Hjs~eY|Di6lLzlh?_=fa4#O!AVNVz$`*qK7mB+4JT| zp&O{UEj_!F(bm8DRTOtrgb}fA6K+&83Q$RDV-y7QRyU({m`K;d13Wj`g9`@B6X%_8 zqPX?hFv7NO!VM~cp=AvaVUb-m#e;JO%7gL#HVqS2gb;Lgb(@?{3`iCXS-lH^)l)n; zYk)i$8+T~9WmyP;u)(j@kz``X@-+&N2gjbl5Sz3Yr+V-cuRIu^?9y=4Ga)pzH~u=J z@)VWUJG$)c*Aw{XR1Z!qmIp(e`rWuBghRn>)PJH(&C6a#JWag42ro_b;N%m`AFUcy z?U#Er+^{5s0|BEs98b5&5!1LU-v)|zI&-F=OYE7`CBG1H0N#>GK>C^k&B zHS8Id*kHo#Kj^rAQP2_3c7q~zn2f=~xM-jGeaH#TFuc9w^^BeS1dI@>4?1lsG>@j) z{BF|$RmpLLH>T&KU(d{arjj*v_kJDMKOI8lfvyKbw5j=k%BCaSCF9+=I>kA*`ETk- zj_QLtu6sI!@9VoJj2IAcge(41;%k)d}w zjdd`DIX-^wZiS3S%OK{7)pL3@JIdMNN@_KbrZ8jihA65mp1_$IKQu5l?a*4mHc`-ypACI!cNt!0w@_=q7k|eM;XiCk7Bz`tEpY}I^O+O z_8D)I3p*{VEop|v%2@>&-D-+xjAuWH;u{-RQnldul+0#Qhx%4UXTJ-M63(~rTsp*WB8>9GgkNmMb5z-e`8a}I(SZ}Ip(Lx|u z4+pHh%Y&btWbPnJ*BQdAaI*~)Ya$FWU%mFZCiTcS<--9&C|OTy{J0-s@puo0d5u|m z_cbzJ{v_(i4qR+FKir{VZ-bG6E$uYMp4N!<5{Zw`{HOpB{*QY`T?^R`&RCW zKM6?Ee&R1?PVoh9B5=|N8zsow?Tcj4xXyx#r94md=AMbQ>?6tenb?-OWFYJOsgvG~ zmTAP>oO^0KLy}fLH69lw_ZWZrP%M9pKPE~pTt&J>G1KhWv z)*RW5mjQg48JJxsExk=T-H|HdS~~5qyoaKQSbc3Y-Qq?Rj4cD zF+A)9kXV;(bBNJKitBYQJvfp{9|2&bgeTB<0$4|^tdA)9>qJBXqq5nNF6)3KHd@@H z2k0yiP6sd;pg{z90qO(r@c?I3jjO7_!8hPwR3vb*`e5U a>-awcQ%2)|Bxoc60000Px?xk*GpRCr$Poq2Rs#T~~#lK^3pvIt?3AOu;JT?!Sb1k_?hE2zba(Spj6P)g-^ z%4uENo?7u(t<)rnf(zJ+D79D>tu$CS3<`okfg{M8pg@2S2xPrIzk6Ro^76KO-`x9R zc)x#mhs^xuH}k!BX6|oQ)N?YPq63OcsNiCtJ8&Teok*Y^&<2C1K$347B`D4S$Ec(L z#X(>Xu$x4-V6a);&7t}{WmVsVGZxdC64Edj3#6F<=p_Lt2gMqa$WhbD*ULUSZuJ5X zBb(kB+zL!anZLb}OJQKJ16YA#shVm2jwyLF@c>gaGHFKwQ-E~fQqMpLw%h^^dfT1H@QJDizG5l5`YJ zw9UXxMh2xMu!KbBs~PNabEqobt^;B$<~+{ud*By9BQGZ9!WiYilQiW)HJu_C_*b)Z z6%Zqfp8}5qo!y*-hrH!Rc8|*76}QH81rTE)DO9i+gYj+&9#g)G)l_nan#Eq-a%cy{ z$mUw$c?{a>7PemTQyis|X=)ZLb;_j;5Mv>YDd!Pj4tVq(p>rji@sg|Z6Ex!2Y6fM_ zSk&&N1rXy2l4)!{Dc{#2)OV0aE@fP&=J0K_vPTVwkxdT_-UWI_E6jJi|4tNFshNBo z%{-z4#K>Y0unOoHjSvl}?>E2%mBB`*b8-xbkEI2tUm=Q#Y9=2#nV%y- zd~e44aWH}|c_DDQlQ+dSAigu>ZE?6y8?j7YABmbJEFeZE-AG_VgV#;jSzae?E#23Ua0W;Kgt!PX@xAU;dq_6B5JsxQw*K27Np%<>o< zkoc|2O#p-5x&i`XIwX`MZ%2%6;0oFgg^oXf4#S{XM@VW76(vwo0LQ?mad^qB^&FA6V%0JP^#_}?>dI%<$v`dR%!+hBHmi@k7_YfDOBvSqTzUl&!#R6cq z*YcU;wdew47eVt*(G9@D?7KvT zyWri)E-}}}_92zQebx)(BO{A#Kp$;GM9OH`1JGkqq^+H`TQv!aqVmphHg4p-wyO;K zRs-S-BRk;vb|n%_SPAEKi(GUkE!RB=d$f9dI*}rHAKA8&xIn_|%s0fyW-10t^^OuD zw@IHuBZ=E|k>vU-*Wmh0id)r8Ua|nmLN4snJeM~y2`1;dKkUxs@WmrAVm_3egk#&_ z!0P&@|9VbkFue+p-7ZACMzGKdZukrmT-ITJwG1|A!d*3DZR9E}K;_;CMG}}BbK0Xa z=&sB-@XF|&gdI=kns=bN%buuPo`QX=AU!}hN7*UJnFhO-JD!5JjtL|y<7viG!D?+x z?J^qmBy=8ax0k*4AJ2t~(=bW=`vQ>7!~4sr~EW59}LH18mc}=01+@;T#+#A+bR{VdJR-qe+y?oeX|xm zxZBbObe|ZSN8bCeQW8kSj1~wW{{*g!nFuoQm~6``=mv>`v1lLMo(Bny!;kRB71j+b zHndV1ndG8kpirzi;qwQ>*u|g{^e#jG2k_Bs5N*J4iOi0Gwmt*@oe@Dp7n&HXQ${vB zF-UcRy*-u#=R$8uccO{T6u|0Rpt1s{?t~_-B4hmRI#{963=r9ad{-8MV*<#jm{zXl+_7fJoYiM6GP2VJ7E@c$@T}5!oSJbF71( zz~{fWJWqP3L)!E9&!ycfVbxEfnL#vtE9xI0Rnuvi0=;g93nzwFJ{krb{@ii_IwaYZ z6b!u&hCc{m{IW|Q&W@!b(gdXbY*_)fu_S0W2+kh};v&?zC5XLTwkFx{1%xw)t)6ZA zTU%b&adu&_+ESHEA9G94IS-Q+bd)5-ySiL=H$)@+(F_=?Mp&HFYtsz4hV4P;OVL zH$l&vpzC-LJBgPhdaM;ApO>ZPz#JGj$6XbCMH!qq3KeHSz;D_X z68+RD0?PImVB=$O!jt52fxurGJLO`hF);R7Xx+=br}D&JIJgc@?6mJ+3`6F*_vDqFfUn<%UX!hDY5#|CFpS;4Z7)cjSl0w_WD~qT z2Fg4-=uHEamnPi4cUaq$TO@DBwwK{#KD6ltJ$?3%?XN&lm~5}z#zJxcmC4?>;jJIL zC2?)OV#1aGF|u&q$)QbOxN$u+YUbYL3bw|TM_ri`>LoaIg zA3=M``R_-kkHFGyP%inEU85RqKyEwAb-fZMO42zONp4Y}FR;`qHA!L;FHX0f`~x3D z{@UO|oZk<6TpjrDZtJ*eIm%fT3EXofo%nC)8Zur!dZbDUVN;OvsZCGl>9bPHTU4|^ z@OUjdL%*K|{+pYID}Pr~-?rtBvvrHkkiO5E=G6{NXO6*_AtI)_jfdnxP*!Z6C-Sd9 zN%U6#TLO@p7L9VHx zNK_@sL!j)m?>spL9fv|nm}~jkd6pNwP6`?H=|))ejMBQARh<*^=T&^z`dSwyVJI@s zlTOwb{N5bsJ0}jP8?tYqC2(5_`gH1o1+)qE(ZZ4|5G@;8RQ1$PxAGik_OG% zS=Pp2Bz*S00~;RFYfX$awTAC3(U*LtWjDAX7n&#AT~a;m1&pFRC^>Ec)3`av2Vj-$ z{nOvThKKcxWrs_o$!APJbf;$$m!1)Sf|RSh-@XDZl2{OrZv$~^*zuyBWz^NyUV0|q zSrShRt84k|^0Ak|%ml$1w^#Y-NA2gUu8M>Wn9 zDVG;73Kkp`?}~!ecvIqK^8y1>NCgwsY!A!k`MoLe!jfl!iCtkyzcVFXdKF?{dbJvq zcyZ$TQ=GUOlz91WE!mnQQk{gq;hk+^s#y|vuEFcR>U)9vnxL7L-ISSF(_z54okt)h zZU2M8^l%l|oJgkq4eIbAf~!SERQAp0fSkwFQMdk zxyn&wlEeeSig`Ka?AOtCKx!QNsZ=nJO44Iiy~pmViK|WmOGspXpn6eu*+tUcGeD|= z5x=ie?gg{PRr5%Mj6oZTRait59`!Ft8A`{`TfUkx&2w$qTyz#nP%89+AlGRvT|7ZbN!s zrG_*N#1%cwg%s$LS3C#B8j{G7iUc;qbG>Q31H^yEW*oi201WyA-A#ZDI*~v--^Zt9 zsEw*TTy(e?&gr|s~W`s{|7{NDpQQf)H literal 0 HcmV?d00001 diff --git a/static/operate/setting.png b/static/operate/setting.png new file mode 100644 index 0000000000000000000000000000000000000000..0fa886256e70fe53119591b8cace9ea9b93d9bc8 GIT binary patch literal 843 zcmV-R1GM~!P)Px&1xZ9fR7gvuR$YiyRTTcdeec|m4Cdk7v-j9Q^pNO7L1x&KfuR{h^q8a|s67k` z;$L9p-&5j)m?$NJ6lOoqMo4Oq52B!m8YIq(GR{5g9PUg?Va{CliY<5Kdgjczb7?>B z^{wyQYn^ZHeTZ4Cfq{XA-upcO-T}}A@Ks-5-@%cQkq6z&_UnTUFPQtaf5m zb;KC+d6FdG0`N2O6bjVq^|>UsklYGjZkJPDGsbLhG#aOiaCw1B9LMWP?grqxm7j~B z@!oICvg~T-{u2Rf?Rx;e0I;w};!e0H`5np68jZ%C5O^$Lt^FFnNB@I3pL*YW|8ACL z=V`5d1HgqYdG`tPg`qW1n>udIXQyM zBC@!BfG+`T>`A~F^Fpv%9LGZ>4;Qsy3ges`Qq^gg(h9uyFJ)Oa?3@d3IbI;3ByEx; znYDHkfCD{M0AQ7f{LtUu-(RcMZjgLFNARPFe9&&u2>>7VB%rFlr)m0T+d;1wV~(rp zA^?v7d_OTU@$vZh_`N8K1}c@xEdbBX`1%YIrqA%UMd;+5NeYA*?T`svZkuxs(1@P ztt9V~h%9-0*~M{unB-6wky(dT^)HeuMdV`sy50w1!K|641A_s+X|-BAo6Y9k5Y9h1 z)i{nfklYn+@m_>f^%s(#h{*NMyuv3lilXPL)#^4?-CSh9rwGU^s=8f7&K4c0^wE!^ zXkMjK*$ZGTfJ%JxwwbCe6_`r0*1ilN{I;wBkgDpDG))fyc-XCt{{djG VNGL3fo4No1002ovPDHLkV1f;Umz4kj literal 0 HcmV?d00001 diff --git a/static/operate/wechat-share.png b/static/operate/wechat-share.png new file mode 100644 index 0000000000000000000000000000000000000000..6f9b37da0f70547ea8670295c7bad896bfc1600c GIT binary patch literal 4287 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 literal 0 HcmV?d00001 diff --git a/static/tabbar/chat.png b/static/tabbar/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..d933897787f906f0f9e3fbc3692df6aba0e95ea7 GIT binary patch literal 615 zcmV-t0+{`YP)Px%AxT6*RA@u(S?z7ZAP_y$!Rjp1r~@>WCrCVj)pUR=T_o;c4V8&MINyO05aU$% zS0eH8-W_m{hkytF#Dn99Odxdztr@64&PN4Mi05QL#cx%JqjlrCen!Hc$ps7j>;kCcC)8b*PdDqe%)j7xwKdsE55 z5da1p5stQu4hlK2kj;s!ey?C~yex4YD{2OY)VDu2*T!~RQUI@;VyfYhMCfmQb7RHI zK&sOy+9u8fJR^`Z;2F4R-Esz^h0Pu3;|y2dE&ZktL}0GWyF@UwO*jFi zpPmlwJDTmh4h3rJA57q0z+A`81Y9F^uXYcgfj{52@<7@msfhpp002ovPDHLkV1igc B5d{DM literal 0 HcmV?d00001 diff --git a/static/tabbar/chat_active.png b/static/tabbar/chat_active.png new file mode 100644 index 0000000000000000000000000000000000000000..5d206beb7c3bd60c51d9970f07039378c94aa9cf GIT binary patch literal 580 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 V*ErD}0$cz9002ovPDHLkV1jH%Zj%52 literal 0 HcmV?d00001 diff --git a/static/tabbar/community_active.png b/static/tabbar/community_active.png new file mode 100644 index 0000000000000000000000000000000000000000..789876bd056ec74ad714c46709f396d1d55303e5 GIT binary patch literal 1324 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 b1&aLzntWV5U+DEq00000NkvXXu0mjfb2vJ$ literal 0 HcmV?d00001 diff --git a/static/tabbar/mall.png b/static/tabbar/mall.png new file mode 100644 index 0000000000000000000000000000000000000000..4b594c0bd5b05b530b8485f31762e963cfd7e5b9 GIT binary patch literal 1063 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 Rtm^;(002ovPDHLkV1h-;h*JOn literal 0 HcmV?d00001 diff --git a/static/tabbar/user_active.png b/static/tabbar/user_active.png new file mode 100644 index 0000000000000000000000000000000000000000..643a6d181494d812b4edd32bedbe70cf03885c78 GIT binary patch literal 886 zcmV-+1Bv{JP)Px&FiAu~R9Hvdm`iIDQ547jC+TRbwu{)zounuQ3$>u&LKIxMaZz-mBEG6$LVTc~ zz+x4@g!PH28>I_3E(FDepkNCYijri`r0v3@QSvx4CAF_Kb8jY%Ob3Q6<~)A)9A{WWt^nHqln~Kv*LAN0s5AoJFtFn|xBQ4T>Cs4pEv3{KjhqdN#UwKim~KR4V8?Mzi^$_38lCS%bjEevCpxkV zGRDA4se1q}m^i5;JIc%#O>7wh+qOMUMExdC){+&G3D5I(o7gf2R!aQ<&}rhNj_e#W zcbVAQ_`p$2iD+%Q$dxq!(P|w2j*ePup07fY8h)yEGg{;2La~q10Kc?BMdyfQ(pH-x zYuuWf;WUg5E#PD_>BQslK@ssMs{{alVCfW*E+X;=p=|)R0@wne9l)k4R8d35 zPZ5~|Fh@l5ztwk!h{nt1@>o8fcY_vF7r3XVXM3?&yaQl}h^!!EVZMuqe+6*gvaHLQ zOlD>+TWbQR)9LWWCFt*z}yHk+NOrCSp?olbX`N~MpjhFt)xLhs9F zv(qb~YXU2!9s)RP8l5J~KVs%{fxxL$YM@f7d5?3BbRZ33~FyVzF;_cGf>KX+McXqRXg1Vune3`fr<5vd=C7vDP+}Ekjt50pLb+(N zGBYm=>V}B0Ne(wTo~z6S=df+tFNx^rdXwnb7m-(<=N${m;q(3wqGPZHGDFP#pe`_g zxKip3fI}?+s^{V@Gam-vSFOdeSWBb3yE_$+$HxHd{ZG)J%H{Il^z?LYrT;a@%iiAJ z_Cld>sd^XO2VnC$!~X%`x9ri5j*h!iQ&Ycd`O`XatTU*Q`N#qP1pu^RJRSE-?*IS* M07*qoM6N<$f(PQB6#xJL literal 0 HcmV?d00001 diff --git a/store/index.js b/store/index.js new file mode 100644 index 0000000..379a2af --- /dev/null +++ b/store/index.js @@ -0,0 +1,11 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import websocketModule from "./modules/websocket"; + +Vue.use(Vuex) + +export default new Vuex.Store({ + modules: { + websocket: websocketModule, + } +}) diff --git a/store/modules/websocket.js b/store/modules/websocket.js new file mode 100644 index 0000000..9e2da06 --- /dev/null +++ b/store/modules/websocket.js @@ -0,0 +1,135 @@ +const websocketModule = { + namespaced: true, + state: { + socket: null, // WebSocket instance + isConnected: false, // WebSocket connection status + reconnectAttempts: 0, + maxReconnectAttempts: 5, + }, + mutations: { + setSocket(state, socket) { + state.socket = socket; + }, + setConnectionStatus(state, status) { + state.isConnected = status; + }, + setReconnectAttempts(state, attempts) { + state.reconnectAttempts = attempts; + }, + }, + actions: { + /** + * Initialize WebSocket connection + */ + initWebSocket({commit, dispatch, state}, userId) { + // Ensure any existing socket is closed + if (state.socket) { + state.socket.close(); + } + + const socket = uni.connectSocket({ + url: "ws://127.0.0.1:58080/webSocket", + success: () => { + console.log("WebSocket connection initiated"); + }, + fail: (err) => { + console.error("Failed to initiate WebSocket connection:", err); + }, + }); + + // Bind WebSocket events + socket.onOpen(() => { + console.log("WebSocket connected"); + commit("setConnectionStatus", true); + commit("setReconnectAttempts", 0); // 重连成功后清零 + + // Send login message + const loginMessage = JSON.stringify({ + type: "LOGIN", + userId, + }); + + socket.send({ + data: loginMessage, + success: () => console.log("Login message sent"), + fail: (err) => console.error("Failed to send login message:", err), + }); + }); + + socket.onMessage((res) => { + console.log("Global WebSocket message received:", res); + try { + const parsedMsg = JSON.parse(res.data); + if (parsedMsg.type === "DIRECT") { + uni.$emit("direct-message", parsedMsg); + } + if (parsedMsg.type === "GROUP") { + uni.$emit("group-message", parsedMsg); + } + } catch (error) { + console.error("Error parsing WebSocket message:", error); + } + }); + + socket.onClose(() => { + console.log("WebSocket connection closed"); + commit("setConnectionStatus", false); + if (state.reconnectAttempts < state.maxReconnectAttempts) { + dispatch("reconnectWebSocket", userId); + } else { + console.error("Max reconnect attempts reached. Stop reconnecting."); + uni.showToast({ + title: "Unable to reconnect. Please check your network.", + icon: "none", + }); + } + }); + + socket.onError((err) => { + console.error("WebSocket error:", err); + commit("setConnectionStatus", false); + }); + + commit("setSocket", socket); + }, + + /** + * Reconnect WebSocket with delay and limit + */ + reconnectWebSocket({state, commit, dispatch}, userId) { + const {reconnectAttempts, maxReconnectAttempts} = state; + + if (reconnectAttempts >= maxReconnectAttempts) { + console.error("Max reconnect attempts reached. Stop reconnecting."); + return; + } + + const reconnectDelay = 5000; + console.log(`Reconnecting in ${reconnectDelay / 1000} seconds...`); + + commit("setReconnectAttempts", reconnectAttempts + 1); + + setTimeout(() => { + console.log(`Reconnect attempt #${state.reconnectAttempts}`); + dispatch("initWebSocket", userId); + }, reconnectDelay); + }, + + /** + * Send a message through WebSocket + */ + sendMessage({state}, message) { + if (state.socket && state.isConnected) { + state.socket.send({ + data: JSON.stringify(message), + success: () => console.log("Message sent successfully"), + fail: (err) => console.error("Failed to send message:", err), + }); + } else { + console.error("WebSocket is not connected. Cannot send message."); + } + }, + }, +}; + +export default websocketModule; diff --git a/template.h5.html b/template.h5.html new file mode 100644 index 0000000..8f8959c --- /dev/null +++ b/template.h5.html @@ -0,0 +1,43 @@ + + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + + + + + + + + + + + + +
+ + + + diff --git a/theme.scss b/theme.scss new file mode 100644 index 0000000..387f956 --- /dev/null +++ b/theme.scss @@ -0,0 +1,128 @@ +// ============================== +// Primary Colors +// ============================== + +$app-theme-color: #5758f6; // Main theme color +$app-theme-light-color: #aeaffe; // Lighter shade of the main theme color +$app-theme-deep-color: #8a90ff; // Deeper shade of the main theme color + +// ============================== +// Background Colors +// ============================== + +$app-theme-bg-color: #ffffff; // Default white background +$app-theme-bg-gray-color: #fafafa; // Light gray background +$app-theme-bg-gray-deep-color: #f8f8f8; // Deep gray background +$app-theme-search-bg-color: #F4F5F8; // Background color for search components + +// ============================== +// Content Colors +// ============================== + +$app-theme-border-color: #efefef; // Border color +$app-theme-text-color: #333333; // Default text color (dark gray) + +$app-theme-text-gray-color: #8f92a1; // Light gray text +$app-theme-card-gray-light-color: #cccccc; // Very light gray for card components +$app-theme-card-gray-deep-color: #696969; // Deep gray for card components +$app-theme-text-white-color: #ffffff; // White text color +$app-theme-text-black-color: #171717; // Black text color +$app-theme-text-black-deep-color: #16162e; // Deep black for text +$app-theme-text-money-color: #fd4558; // Red color for monetary values +$app-theme-text-gray-white-color: #c3c6cb; // Grayish-white text color + +// ============================== +// Special Purpose Colors +// ============================== + +$app-theme-navbar-tab-color: #696969; // Default color for inactive navbar tabs +$app-theme-navbar-tab-color-active: #333333; // Active navbar tab color + +$app-theme-card-gray-color: #8f92a1; // Gray color for cards +$app-theme-sku-gray-color: #f5f5f8; // Gray for SKU-related sections +$app-theme-shop-gray-color: #888e98; // Gray color used for shop components + +$app-theme-points-sign-bg-color: #f0f0f0; // Background for points/sign components +$app-theme-points-sign-label-bg-color: #dfdfdf; // Label background in points/sign +$app-theme-points-sign-value-color: #696969; // Text color for points/sign values +$app-theme-points-yellow-color: #f9a906; // Yellow color for points +$app-theme-points-blue-color: #5758f6; // Blue color for points + +// ============================== +// Shadows +// ============================== + +$app-theme-shadow: 0px 2px 8px 0px rgba(27, 25, 86, 0.06); // Subtle shadow effect + +// ============================== +// Z-Index Values +// ============================== + +$app-zIndex-deep: 0; // Lowest z-index +$app-zIndex-normal: 19; // Normal z-index +$app-zIndex-absolute: 99; // z-index for absolute positioning +$app-zIndex-fixed: 199; // z-index for fixed elements +$app-zIndex-page: 999; // Highest z-index for page-level elements + +// ============================== +// Global Page Styles +// ============================== + +.page { + min-height: 100vh; // Ensure the page covers the full viewport height + background-color: $app-theme-bg-gray-color; // Default background color for pages +} + +// ============================== +// Global Slot Styles +// ============================== + +.slot { + // Define global styles for slot components if needed +} + +// ============================== +// Export SCSS Variables for Use in JavaScript +// ============================== + +:export { + // Export theme colors + appThemeColor: $app-theme-color; + + appThemeBgColor: $app-theme-bg-color; + appThemeBgGrayColor: $app-theme-bg-gray-color; + appThemeBgGrayDeppColor: $app-theme-bg-gray-deep-color; + appThemeSearchBgColor: $app-theme-search-bg-color; + + appThemeBorderColor: $app-theme-border-color; + + appThemeTextColor: $app-theme-text-color; + appThemeTextGrayColor: $app-theme-text-gray-color; + appThemeTextGrayLightColor: $app-theme-card-gray-light-color; + appThemeTextGrayDeepColor: $app-theme-card-gray-deep-color; + appThemeTextWhiteColor: $app-theme-text-white-color; + appThemeTextBlackColor: $app-theme-text-black-color; + appThemeTextBlackDeepColor: $app-theme-text-black-deep-color; + appThemeTextMoneyColor: $app-theme-text-money-color; + appThemeTextGrayWhiteColor: $app-theme-text-gray-white-color; + appThemeSkuGrayColor: $app-theme-sku-gray-color; + appThemeCardGrayColor: $app-theme-card-gray-color; + appThemeShopGrayColor: $app-theme-shop-gray-color; + + appThemePointsSignBgColor: $app-theme-points-sign-bg-color; + appThemePointsSignLabelColor: $app-theme-points-sign-label-bg-color; + appThemePointsSignValueColor: $app-theme-points-sign-value-color; + appThemePointsSignYellowColor: $app-theme-points-yellow-color; + appThemePointsSignBlueColor: $app-theme-points-blue-color; + + appThemeNavbarTabColor: $app-theme-navbar-tab-color; + appThemeNavbarTabColorActive: $app-theme-navbar-tab-color-active; + + appThemeShadow: $app-theme-shadow; + + appZIndexDeep: $app-zIndex-deep; + appZIndexNormal: $app-zIndex-normal; + appZIndexAbsolute: $app-zIndex-absolute; + appZIndexFixed: $app-zIndex-fixed; + appZIndexPage: $app-zIndex-page; +} diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..2e688ea --- /dev/null +++ b/uni.scss @@ -0,0 +1,3 @@ +@import 'uview-ui/theme.scss'; + +@import '@/theme.scss'; diff --git a/utils/replace.js b/utils/replace.js new file mode 100644 index 0000000..e7534bd --- /dev/null +++ b/utils/replace.js @@ -0,0 +1,3 @@ +export const replaceSale = (sale) => { + return sale > 10000 ? sale.replace(/\d{4}$/, 'w+') : sale +} diff --git a/utils/uniapp-api.js b/utils/uniapp-api.js new file mode 100644 index 0000000..dc60f2f --- /dev/null +++ b/utils/uniapp-api.js @@ -0,0 +1,11 @@ +export const copyByUniappApi = (data, msg = '已复制到剪贴板') => { + uni.setClipboardData({ + data: data.toString(), + success: function () { + uni.showToast({ + title: msg, + icon: 'none' + }); + } + }); +} diff --git a/uview-ui/LICENSE b/uview-ui/LICENSE new file mode 100644 index 0000000..8e39ead --- /dev/null +++ b/uview-ui/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 www.uviewui.com + +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. \ No newline at end of file diff --git a/uview-ui/README.md b/uview-ui/README.md new file mode 100644 index 0000000..ac3d28c --- /dev/null +++ b/uview-ui/README.md @@ -0,0 +1,110 @@ +

+ logo +

+

uView

+

多平台快速开发的UI框架

+ +## 说明 + +uView UI,是[uni-app](https://uniapp.dcloud.io/)生态优秀的UI框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 + +## 特性 + +- 兼容安卓,iOS,微信小程序,H5,QQ小程序,百度小程序,支付宝小程序,头条小程序 +- 60+精选组件,功能丰富,多端兼容,让您快速集成,开箱即用 +- 众多贴心的JS利器,让您飞镖在手,召之即来,百步穿杨 +- 众多的常用页面和布局,让您专注逻辑,事半功倍 +- 详尽的文档支持,现代化的演示效果 +- 按需引入,精简打包体积 + +## 安装 + +```bash +# npm方式安装 +npm i uview-ui +``` + +## 快速上手 + +1. `main.js`引入uView库 + +```js +// main.js +import uView from 'uview-ui'; +Vue.use(uView); +``` + +2. `App.vue`引入基础样式(注意style标签需声明scss属性支持) + +```css +/* App.vue */ + +``` + +3. `uni.scss`引入全局scss变量文件 + +```css +/* uni.scss */ +@import "uview-ui/theme.scss"; +``` + +4. `pages.json`配置easycom规则(按需引入) + +```js +// pages.json +{ + "easycom": { + // npm安装的方式不需要前面的"@/",下载安装的方式需要"@/" + // npm安装方式 + "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue" + // 下载安装方式 + // "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue" + }, + // 此为本身已有的内容 + "pages": [ + // ...... + ] +} +``` + +请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容 + +## 使用方法 + +配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。 + +```html + +``` + +请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容 + +## 链接 + +- [官方文档](https://uviewui.com/) +- [更新日志](https://uviewui.com/components/changelog.html) +- [升级指南](https://uviewui.com/components/changelog.html) +- [关于我们](https://uviewui.com/cooperation/about.html) + +## 预览 + +您可以通过**微信**扫码,查看最佳的演示效果。 +
+
+ + + + +## 版权信息 + +uView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uView应用到您的产品中。 diff --git a/uview-ui/components/u-action-sheet/u-action-sheet.vue b/uview-ui/components/u-action-sheet/u-action-sheet.vue new file mode 100644 index 0000000..c5eb51a --- /dev/null +++ b/uview-ui/components/u-action-sheet/u-action-sheet.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/uview-ui/components/u-alert-tips/u-alert-tips.vue b/uview-ui/components/u-alert-tips/u-alert-tips.vue new file mode 100644 index 0000000..c8d9fe9 --- /dev/null +++ b/uview-ui/components/u-alert-tips/u-alert-tips.vue @@ -0,0 +1,258 @@ + + + + + diff --git a/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue b/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue new file mode 100644 index 0000000..c67035f --- /dev/null +++ b/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue @@ -0,0 +1,291 @@ + + + + + diff --git a/uview-ui/components/u-avatar-cropper/weCropper.js b/uview-ui/components/u-avatar-cropper/weCropper.js new file mode 100644 index 0000000..6b7297f --- /dev/null +++ b/uview-ui/components/u-avatar-cropper/weCropper.js @@ -0,0 +1,1266 @@ +/** + * we-cropper v1.3.9 + * (c) 2020 dlhandsome + * @license MIT + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.WeCropper = factory()); +}(this, (function () { + 'use strict'; + + var device = void 0; + var TOUCH_STATE = ['touchstarted', 'touchmoved', 'touchended']; + + function firstLetterUpper(str) { + return str.charAt(0).toUpperCase() + str.slice(1) + } + + function setTouchState(instance) { + var arg = [], + len = arguments.length - 1; + while (len-- > 0) arg[len] = arguments[len + 1]; + + TOUCH_STATE.forEach(function (key, i) { + if (arg[i] !== undefined) { + instance[key] = arg[i]; + } + }); + } + + function validator(instance, o) { + Object.defineProperties(instance, o); + } + + function getDevice() { + if (!device) { + device = uni.getSystemInfoSync(); + } + return device + } + + var tmp = {}; + + var ref = getDevice(); + var pixelRatio = ref.pixelRatio; + + var DEFAULT = { + id: { + default: 'cropper', + get: function get() { + return tmp.id + }, + set: function set(value) { + if (typeof (value) !== 'string') { + console.error(("id:" + value + " is invalid")); + } + tmp.id = value; + } + }, + width: { + default: 750, + get: function get() { + return tmp.width + }, + set: function set(value) { + if (typeof (value) !== 'number') { + console.error(("width:" + value + " is invalid")); + } + tmp.width = value; + } + }, + height: { + default: 750, + get: function get() { + return tmp.height + }, + set: function set(value) { + if (typeof (value) !== 'number') { + console.error(("height:" + value + " is invalid")); + } + tmp.height = value; + } + }, + pixelRatio: { + default: pixelRatio, + get: function get() { + return tmp.pixelRatio + }, + set: function set(value) { + if (typeof (value) !== 'number') { + console.error(("pixelRatio:" + value + " is invalid")); + } + tmp.pixelRatio = value; + } + }, + scale: { + default: 2.5, + get: function get() { + return tmp.scale + }, + set: function set(value) { + if (typeof (value) !== 'number') { + console.error(("scale:" + value + " is invalid")); + } + tmp.scale = value; + } + }, + zoom: { + default: 5, + get: function get() { + return tmp.zoom + }, + set: function set(value) { + if (typeof (value) !== 'number') { + console.error(("zoom:" + value + " is invalid")); + } else if (value < 0 || value > 10) { + console.error("zoom should be ranged in 0 ~ 10"); + } + tmp.zoom = value; + } + }, + src: { + default: '', + get: function get() { + return tmp.src + }, + set: function set(value) { + if (typeof (value) !== 'string') { + console.error(("src:" + value + " is invalid")); + } + tmp.src = value; + } + }, + cut: { + default: {}, + get: function get() { + return tmp.cut + }, + set: function set(value) { + if (typeof (value) !== 'object') { + console.error(("cut:" + value + " is invalid")); + } + tmp.cut = value; + } + }, + boundStyle: { + default: {}, + get: function get() { + return tmp.boundStyle + }, + set: function set(value) { + if (typeof (value) !== 'object') { + console.error(("boundStyle:" + value + " is invalid")); + } + tmp.boundStyle = value; + } + }, + onReady: { + default: null, + get: function get() { + return tmp.ready + }, + set: function set(value) { + tmp.ready = value; + } + }, + onBeforeImageLoad: { + default: null, + get: function get() { + return tmp.beforeImageLoad + }, + set: function set(value) { + tmp.beforeImageLoad = value; + } + }, + onImageLoad: { + default: null, + get: function get() { + return tmp.imageLoad + }, + set: function set(value) { + tmp.imageLoad = value; + } + }, + onBeforeDraw: { + default: null, + get: function get() { + return tmp.beforeDraw + }, + set: function set(value) { + tmp.beforeDraw = value; + } + } + }; + + var ref$1 = getDevice(); + var windowWidth = ref$1.windowWidth; + + function prepare() { + var self = this; + + // v1.4.0 版本中将不再自动绑定we-cropper实例 + self.attachPage = function () { + var pages = getCurrentPages(); + // 获取到当前page上下文 + var pageContext = pages[pages.length - 1]; + // 把this依附在Page上下文的wecropper属性上,便于在page钩子函数中访问 + Object.defineProperty(pageContext, 'wecropper', { + get: function get() { + console.warn( + 'Instance will not be automatically bound to the page after v1.4.0\n\n' + + 'Please use a custom instance name instead\n\n' + + 'Example: \n' + + 'this.mycropper = new WeCropper(options)\n\n' + + '// ...\n' + + 'this.mycropper.getCropperImage()' + ); + return self + }, + configurable: true + }); + }; + + self.createCtx = function () { + var id = self.id; + var targetId = self.targetId; + + if (id) { + self.ctx = self.ctx || uni.createCanvasContext(id); + self.targetCtx = self.targetCtx || uni.createCanvasContext(targetId); + } else { + console.error("constructor: create canvas context failed, 'id' must be valuable"); + } + }; + + self.deviceRadio = windowWidth / 750; + } + + var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== + 'undefined' ? self : {}; + + + function createCommonjsModule(fn, module) { + return module = { + exports: {} + }, fn(module, module.exports), module.exports; + } + + var tools = createCommonjsModule(function (module, exports) { + /** + * String type check + */ + exports.isStr = function (v) { + return typeof v === 'string'; + }; + /** + * Number type check + */ + exports.isNum = function (v) { + return typeof v === 'number'; + }; + /** + * Array type check + */ + exports.isArr = Array.isArray; + /** + * undefined type check + */ + exports.isUndef = function (v) { + return v === undefined; + }; + + exports.isTrue = function (v) { + return v === true; + }; + + exports.isFalse = function (v) { + return v === false; + }; + /** + * Function type check + */ + exports.isFunc = function (v) { + return typeof v === 'function'; + }; + /** + * Quick object check - this is primarily used to tell + * Objects from primitive values when we know the value + * is a JSON-compliant type. + */ + exports.isObj = exports.isObject = function (obj) { + return obj !== null && typeof obj === 'object' + }; + + /** + * Strict object type check. Only returns true + * for plain JavaScript objects. + */ + var _toString = Object.prototype.toString; + exports.isPlainObject = function (obj) { + return _toString.call(obj) === '[object Object]' + }; + + /** + * Check whether the object has the property. + */ + var hasOwnProperty = Object.prototype.hasOwnProperty; + exports.hasOwn = function (obj, key) { + return hasOwnProperty.call(obj, key) + }; + + /** + * Perform no operation. + * Stubbing args to make Flow happy without leaving useless transpiled code + * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/) + */ + exports.noop = function (a, b, c) { + }; + + /** + * Check if val is a valid array index. + */ + exports.isValidArrayIndex = function (val) { + var n = parseFloat(String(val)); + return n >= 0 && Math.floor(n) === n && isFinite(val) + }; + }); + + var tools_7 = tools.isFunc; + var tools_10 = tools.isPlainObject; + + var EVENT_TYPE = ['ready', 'beforeImageLoad', 'beforeDraw', 'imageLoad']; + + function observer() { + var self = this; + + self.on = function (event, fn) { + if (EVENT_TYPE.indexOf(event) > -1) { + if (tools_7(fn)) { + event === 'ready' ? + fn(self) : + self[("on" + (firstLetterUpper(event)))] = fn; + } + } else { + console.error(("event: " + event + " is invalid")); + } + return self + }; + } + + function wxPromise(fn) { + return function (obj) { + var args = [], + len = arguments.length - 1; + while (len-- > 0) args[len] = arguments[len + 1]; + + if (obj === void 0) obj = {}; + return new Promise(function (resolve, reject) { + obj.success = function (res) { + resolve(res); + }; + obj.fail = function (err) { + reject(err); + }; + fn.apply(void 0, [obj].concat(args)); + }) + } + } + + function draw(ctx, reserve) { + if (reserve === void 0) reserve = false; + + return new Promise(function (resolve) { + ctx.draw(reserve, resolve); + }) + } + + var getImageInfo = wxPromise(uni.getImageInfo); + + var canvasToTempFilePath = wxPromise(uni.canvasToTempFilePath); + + var base64 = createCommonjsModule(function (module, exports) { + /*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */ + (function (root) { + + // Detect free variables `exports`. + var freeExports = 'object' == 'object' && exports; + + // Detect free variable `module`. + var freeModule = 'object' == 'object' && module && + module.exports == freeExports && module; + + // Detect free variable `global`, from Node.js or Browserified code, and use + // it as `root`. + var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + var InvalidCharacterError = function (message) { + this.message = message; + }; + InvalidCharacterError.prototype = new Error; + InvalidCharacterError.prototype.name = 'InvalidCharacterError'; + + var error = function (message) { + // Note: the error messages used throughout this file match those used by + // the native `atob`/`btoa` implementation in Chromium. + throw new InvalidCharacterError(message); + }; + + var TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + // http://whatwg.org/html/common-microsyntaxes.html#space-character + var REGEX_SPACE_CHARACTERS = /[\t\n\f\r ]/g; + + // `decode` is designed to be fully compatible with `atob` as described in the + // HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob + // The optimized base64-decoding algorithm used is based on @atk’s excellent + // implementation. https://gist.github.com/atk/1020396 + var decode = function (input) { + input = String(input) + .replace(REGEX_SPACE_CHARACTERS, ''); + var length = input.length; + if (length % 4 == 0) { + input = input.replace(/==?$/, ''); + length = input.length; + } + if ( + length % 4 == 1 || + // http://whatwg.org/C#alphanumeric-ascii-characters + /[^+a-zA-Z0-9/]/.test(input) + ) { + error( + 'Invalid character: the string to be decoded is not correctly encoded.' + ); + } + var bitCounter = 0; + var bitStorage; + var buffer; + var output = ''; + var position = -1; + while (++position < length) { + buffer = TABLE.indexOf(input.charAt(position)); + bitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer; + // Unless this is the first of a group of 4 characters… + if (bitCounter++ % 4) { + // …convert the first 8 bits to a single ASCII character. + output += String.fromCharCode( + 0xFF & bitStorage >> (-2 * bitCounter & 6) + ); + } + } + return output; + }; + + // `encode` is designed to be fully compatible with `btoa` as described in the + // HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa + var encode = function (input) { + input = String(input); + if (/[^\0-\xFF]/.test(input)) { + // Note: no need to special-case astral symbols here, as surrogates are + // matched, and the input is supposed to only contain ASCII anyway. + error( + 'The string to be encoded contains characters outside of the ' + + 'Latin1 range.' + ); + } + var padding = input.length % 3; + var output = ''; + var position = -1; + var a; + var b; + var c; + var buffer; + // Make sure any padding is handled outside of the loop. + var length = input.length - padding; + + while (++position < length) { + // Read three bytes, i.e. 24 bits. + a = input.charCodeAt(position) << 16; + b = input.charCodeAt(++position) << 8; + c = input.charCodeAt(++position); + buffer = a + b + c; + // Turn the 24 bits into four chunks of 6 bits each, and append the + // matching character for each of them to the output. + output += ( + TABLE.charAt(buffer >> 18 & 0x3F) + + TABLE.charAt(buffer >> 12 & 0x3F) + + TABLE.charAt(buffer >> 6 & 0x3F) + + TABLE.charAt(buffer & 0x3F) + ); + } + + if (padding == 2) { + a = input.charCodeAt(position) << 8; + b = input.charCodeAt(++position); + buffer = a + b; + output += ( + TABLE.charAt(buffer >> 10) + + TABLE.charAt((buffer >> 4) & 0x3F) + + TABLE.charAt((buffer << 2) & 0x3F) + + '=' + ); + } else if (padding == 1) { + buffer = input.charCodeAt(position); + output += ( + TABLE.charAt(buffer >> 2) + + TABLE.charAt((buffer << 4) & 0x3F) + + '==' + ); + } + + return output; + }; + + var base64 = { + 'encode': encode, + 'decode': decode, + 'version': '0.1.0' + }; + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof undefined == 'function' && + typeof undefined.amd == 'object' && + undefined.amd + ) { + undefined(function () { + return base64; + }); + } else if (freeExports && !freeExports.nodeType) { + if (freeModule) { // in Node.js or RingoJS v0.8.0+ + freeModule.exports = base64; + } else { // in Narwhal or RingoJS v0.7.0- + for (var key in base64) { + base64.hasOwnProperty(key) && (freeExports[key] = base64[key]); + } + } + } else { // in Rhino or a web browser + root.base64 = base64; + } + + }(commonjsGlobal)); + }); + + function makeURI(strData, type) { + return 'data:' + type + ';base64,' + strData + } + + function fixType(type) { + type = type.toLowerCase().replace(/jpg/i, 'jpeg'); + var r = type.match(/png|jpeg|bmp|gif/)[0]; + return 'image/' + r + } + + function encodeData(data) { + var str = ''; + if (typeof data === 'string') { + str = data; + } else { + for (var i = 0; i < data.length; i++) { + str += String.fromCharCode(data[i]); + } + } + return base64.encode(str) + } + + /** + * 获取图像区域隐含的像素数据 + * @param canvasId canvas标识 + * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标 + * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标 + * @param width 将要被提取的图像数据矩形区域的宽度 + * @param height 将要被提取的图像数据矩形区域的高度 + * @param done 完成回调 + */ + function getImageData(canvasId, x, y, width, height, done) { + uni.canvasGetImageData({ + canvasId: canvasId, + x: x, + y: y, + width: width, + height: height, + success: function success(res) { + done(res, null); + }, + fail: function fail(res) { + done(null, res); + } + }); + } + + /** + * 生成bmp格式图片 + * 按照规则生成图片响应头和响应体 + * @param oData 用来描述 canvas 区域隐含的像素数据 { data, width, height } = oData + * @returns {*} base64字符串 + */ + function genBitmapImage(oData) { + // + // BITMAPFILEHEADER: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx + // BITMAPINFOHEADER: http://msdn.microsoft.com/en-us/library/dd183376.aspx + // + var biWidth = oData.width; + var biHeight = oData.height; + var biSizeImage = biWidth * biHeight * 3; + var bfSize = biSizeImage + 54; // total header size = 54 bytes + + // + // typedef struct tagBITMAPFILEHEADER { + // WORD bfType; + // DWORD bfSize; + // WORD bfReserved1; + // WORD bfReserved2; + // DWORD bfOffBits; + // } BITMAPFILEHEADER; + // + var BITMAPFILEHEADER = [ + // WORD bfType -- The file type signature; must be "BM" + 0x42, 0x4D, + // DWORD bfSize -- The size, in bytes, of the bitmap file + bfSize & 0xff, bfSize >> 8 & 0xff, bfSize >> 16 & 0xff, bfSize >> 24 & 0xff, + // WORD bfReserved1 -- Reserved; must be zero + 0, 0, + // WORD bfReserved2 -- Reserved; must be zero + 0, 0, + // DWORD bfOffBits -- The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits. + 54, 0, 0, 0 + ]; + + // + // typedef struct tagBITMAPINFOHEADER { + // DWORD biSize; + // LONG biWidth; + // LONG biHeight; + // WORD biPlanes; + // WORD biBitCount; + // DWORD biCompression; + // DWORD biSizeImage; + // LONG biXPelsPerMeter; + // LONG biYPelsPerMeter; + // DWORD biClrUsed; + // DWORD biClrImportant; + // } BITMAPINFOHEADER, *PBITMAPINFOHEADER; + // + var BITMAPINFOHEADER = [ + // DWORD biSize -- The number of bytes required by the structure + 40, 0, 0, 0, + // LONG biWidth -- The width of the bitmap, in pixels + biWidth & 0xff, biWidth >> 8 & 0xff, biWidth >> 16 & 0xff, biWidth >> 24 & 0xff, + // LONG biHeight -- The height of the bitmap, in pixels + biHeight & 0xff, biHeight >> 8 & 0xff, biHeight >> 16 & 0xff, biHeight >> 24 & 0xff, + // WORD biPlanes -- The number of planes for the target device. This value must be set to 1 + 1, 0, + // WORD biBitCount -- The number of bits-per-pixel, 24 bits-per-pixel -- the bitmap + // has a maximum of 2^24 colors (16777216, Truecolor) + 24, 0, + // DWORD biCompression -- The type of compression, BI_RGB (code 0) -- uncompressed + 0, 0, 0, 0, + // DWORD biSizeImage -- The size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps + biSizeImage & 0xff, biSizeImage >> 8 & 0xff, biSizeImage >> 16 & 0xff, biSizeImage >> 24 & 0xff, + // LONG biXPelsPerMeter, unused + 0, 0, 0, 0, + // LONG biYPelsPerMeter, unused + 0, 0, 0, 0, + // DWORD biClrUsed, the number of color indexes of palette, unused + 0, 0, 0, 0, + // DWORD biClrImportant, unused + 0, 0, 0, 0 + ]; + + var iPadding = (4 - ((biWidth * 3) % 4)) % 4; + + var aImgData = oData.data; + + var strPixelData = ''; + var biWidth4 = biWidth << 2; + var y = biHeight; + var fromCharCode = String.fromCharCode; + + do { + var iOffsetY = biWidth4 * (y - 1); + var strPixelRow = ''; + for (var x = 0; x < biWidth; x++) { + var iOffsetX = x << 2; + strPixelRow += fromCharCode(aImgData[iOffsetY + iOffsetX + 2]) + + fromCharCode(aImgData[iOffsetY + iOffsetX + 1]) + + fromCharCode(aImgData[iOffsetY + iOffsetX]); + } + + for (var c = 0; c < iPadding; c++) { + strPixelRow += String.fromCharCode(0); + } + + strPixelData += strPixelRow; + } while (--y) + + var strEncoded = encodeData(BITMAPFILEHEADER.concat(BITMAPINFOHEADER)) + encodeData(strPixelData); + + return strEncoded + } + + /** + * 转换为图片base64 + * @param canvasId canvas标识 + * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标 + * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标 + * @param width 将要被提取的图像数据矩形区域的宽度 + * @param height 将要被提取的图像数据矩形区域的高度 + * @param type 转换图片类型 + * @param done 完成回调 + */ + function convertToImage(canvasId, x, y, width, height, type, done) { + if (done === void 0) done = function () { + }; + + if (type === undefined) { + type = 'png'; + } + type = fixType(type); + if (/bmp/.test(type)) { + getImageData(canvasId, x, y, width, height, function (data, err) { + var strData = genBitmapImage(data); + tools_7(done) && done(makeURI(strData, 'image/' + type), err); + }); + } else { + console.error('暂不支持生成\'' + type + '\'类型的base64图片'); + } + } + + var CanvasToBase64 = { + convertToImage: convertToImage, + // convertToPNG: function (width, height, done) { + // return convertToImage(width, height, 'png', done) + // }, + // convertToJPEG: function (width, height, done) { + // return convertToImage(width, height, 'jpeg', done) + // }, + // convertToGIF: function (width, height, done) { + // return convertToImage(width, height, 'gif', done) + // }, + convertToBMP: function (ref, done) { + if (ref === void 0) ref = {}; + var canvasId = ref.canvasId; + var x = ref.x; + var y = ref.y; + var width = ref.width; + var height = ref.height; + if (done === void 0) done = function () { + }; + + return convertToImage(canvasId, x, y, width, height, 'bmp', done) + } + }; + + function methods() { + var self = this; + + var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度 + var boundHeight = self.height; // 裁剪框默认高度,即整个画布高度 + + var id = self.id; + var targetId = self.targetId; + var pixelRatio = self.pixelRatio; + + var ref = self.cut; + var x = ref.x; + if (x === void 0) x = 0; + var y = ref.y; + if (y === void 0) y = 0; + var width = ref.width; + if (width === void 0) width = boundWidth; + var height = ref.height; + if (height === void 0) height = boundHeight; + + self.updateCanvas = function (done) { + if (self.croperTarget) { + // 画布绘制图片 + self.ctx.drawImage( + self.croperTarget, + self.imgLeft, + self.imgTop, + self.scaleWidth, + self.scaleHeight + ); + } + tools_7(self.onBeforeDraw) && self.onBeforeDraw(self.ctx, self); + + self.setBoundStyle(self.boundStyle); // 设置边界样式 + + self.ctx.draw(false, done); + return self + }; + + self.pushOrigin = self.pushOrign = function (src) { + self.src = src; + + tools_7(self.onBeforeImageLoad) && self.onBeforeImageLoad(self.ctx, self); + + return getImageInfo({ + src: src + }) + .then(function (res) { + var innerAspectRadio = res.width / res.height; + var customAspectRadio = width / height; + + self.croperTarget = res.path; + + if (innerAspectRadio < customAspectRadio) { + self.rectX = x; + self.baseWidth = width; + self.baseHeight = width / innerAspectRadio; + self.rectY = y - Math.abs((height - self.baseHeight) / 2); + } else { + self.rectY = y; + self.baseWidth = height * innerAspectRadio; + self.baseHeight = height; + self.rectX = x - Math.abs((width - self.baseWidth) / 2); + } + + self.imgLeft = self.rectX; + self.imgTop = self.rectY; + self.scaleWidth = self.baseWidth; + self.scaleHeight = self.baseHeight; + + self.update(); + + return new Promise(function (resolve) { + self.updateCanvas(resolve); + }) + }) + .then(function () { + tools_7(self.onImageLoad) && self.onImageLoad(self.ctx, self); + }) + }; + + self.removeImage = function () { + self.src = ''; + self.croperTarget = ''; + return draw(self.ctx) + }; + + self.getCropperBase64 = function (done) { + if (done === void 0) done = function () { + }; + + CanvasToBase64.convertToBMP({ + canvasId: id, + x: x, + y: y, + width: width, + height: height + }, done); + }; + + self.getCropperImage = function (opt, fn) { + var customOptions = opt; + + var canvasOptions = { + canvasId: id, + x: x, + y: y, + width: width, + height: height + }; + + var task = function () { + return Promise.resolve(); + }; + + if ( + tools_10(customOptions) && + customOptions.original + ) { + // original mode + task = function () { + self.targetCtx.drawImage( + self.croperTarget, + self.imgLeft * pixelRatio, + self.imgTop * pixelRatio, + self.scaleWidth * pixelRatio, + self.scaleHeight * pixelRatio + ); + + canvasOptions = { + canvasId: targetId, + x: x * pixelRatio, + y: y * pixelRatio, + width: width * pixelRatio, + height: height * pixelRatio + }; + + return draw(self.targetCtx) + }; + } + + return task() + .then(function () { + if (tools_10(customOptions)) { + canvasOptions = Object.assign({}, canvasOptions, customOptions); + } + + if (tools_7(customOptions)) { + fn = customOptions; + } + + var arg = canvasOptions.componentContext ? + [canvasOptions, canvasOptions.componentContext] : + [canvasOptions]; + + return canvasToTempFilePath.apply(null, arg) + }) + .then(function (res) { + var tempFilePath = res.tempFilePath; + + return tools_7(fn) ? + fn.call(self, tempFilePath, null) : + tempFilePath + }) + .catch(function (err) { + if (tools_7(fn)) { + fn.call(self, null, err); + } else { + throw err + } + }) + }; + } + + /** + * 获取最新缩放值 + * @param oldScale 上一次触摸结束后的缩放值 + * @param oldDistance 上一次触摸结束后的双指距离 + * @param zoom 缩放系数 + * @param touch0 第一指touch对象 + * @param touch1 第二指touch对象 + * @returns {*} + */ + var getNewScale = function (oldScale, oldDistance, zoom, touch0, touch1) { + var xMove, yMove, newDistance; + // 计算二指最新距离 + xMove = Math.round(touch1.x - touch0.x); + yMove = Math.round(touch1.y - touch0.y); + newDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove)); + + return oldScale + 0.001 * zoom * (newDistance - oldDistance) + }; + + function update() { + var self = this; + + if (!self.src) { + return + } + + self.__oneTouchStart = function (touch) { + self.touchX0 = Math.round(touch.x); + self.touchY0 = Math.round(touch.y); + }; + + self.__oneTouchMove = function (touch) { + var xMove, yMove; + // 计算单指移动的距离 + if (self.touchended) { + return self.updateCanvas() + } + xMove = Math.round(touch.x - self.touchX0); + yMove = Math.round(touch.y - self.touchY0); + + var imgLeft = Math.round(self.rectX + xMove); + var imgTop = Math.round(self.rectY + yMove); + + self.outsideBound(imgLeft, imgTop); + + self.updateCanvas(); + }; + + self.__twoTouchStart = function (touch0, touch1) { + var xMove, yMove, oldDistance; + + self.touchX1 = Math.round(self.rectX + self.scaleWidth / 2); + self.touchY1 = Math.round(self.rectY + self.scaleHeight / 2); + + // 计算两指距离 + xMove = Math.round(touch1.x - touch0.x); + yMove = Math.round(touch1.y - touch0.y); + oldDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove)); + + self.oldDistance = oldDistance; + }; + + self.__twoTouchMove = function (touch0, touch1) { + var oldScale = self.oldScale; + var oldDistance = self.oldDistance; + var scale = self.scale; + var zoom = self.zoom; + + self.newScale = getNewScale(oldScale, oldDistance, zoom, touch0, touch1); + + // 设定缩放范围 + self.newScale <= 1 && (self.newScale = 1); + self.newScale >= scale && (self.newScale = scale); + + self.scaleWidth = Math.round(self.newScale * self.baseWidth); + self.scaleHeight = Math.round(self.newScale * self.baseHeight); + var imgLeft = Math.round(self.touchX1 - self.scaleWidth / 2); + var imgTop = Math.round(self.touchY1 - self.scaleHeight / 2); + + self.outsideBound(imgLeft, imgTop); + + self.updateCanvas(); + }; + + self.__xtouchEnd = function () { + self.oldScale = self.newScale; + self.rectX = self.imgLeft; + self.rectY = self.imgTop; + }; + } + + var handle = { + // 图片手势初始监测 + touchStart: function touchStart(e) { + var self = this; + var ref = e.touches; + var touch0 = ref[0]; + var touch1 = ref[1]; + + if (!self.src) { + return + } + + setTouchState(self, true, null, null); + + // 计算第一个触摸点的位置,并参照改点进行缩放 + self.__oneTouchStart(touch0); + + // 两指手势触发 + if (e.touches.length >= 2) { + self.__twoTouchStart(touch0, touch1); + } + }, + + // 图片手势动态缩放 + touchMove: function touchMove(e) { + var self = this; + var ref = e.touches; + var touch0 = ref[0]; + var touch1 = ref[1]; + + if (!self.src) { + return + } + + setTouchState(self, null, true); + + // 单指手势时触发 + if (e.touches.length === 1) { + self.__oneTouchMove(touch0); + } + // 两指手势触发 + if (e.touches.length >= 2) { + self.__twoTouchMove(touch0, touch1); + } + }, + + touchEnd: function touchEnd(e) { + var self = this; + + if (!self.src) { + return + } + + setTouchState(self, false, false, true); + self.__xtouchEnd(); + } + }; + + function cut() { + var self = this; + var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度 + var boundHeight = self.height; + // 裁剪框默认高度,即整个画布高度 + var ref = self.cut; + var x = ref.x; + if (x === void 0) x = 0; + var y = ref.y; + if (y === void 0) y = 0; + var width = ref.width; + if (width === void 0) width = boundWidth; + var height = ref.height; + if (height === void 0) height = boundHeight; + + /** + * 设置边界 + * @param imgLeft 图片左上角横坐标值 + * @param imgTop 图片左上角纵坐标值 + */ + self.outsideBound = function (imgLeft, imgTop) { + self.imgLeft = imgLeft >= x ? + x : + self.scaleWidth + imgLeft - x <= width ? + x + width - self.scaleWidth : + imgLeft; + + self.imgTop = imgTop >= y ? + y : + self.scaleHeight + imgTop - y <= height ? + y + height - self.scaleHeight : + imgTop; + }; + + /** + * 设置边界样式 + * @param color 边界颜色 + */ + self.setBoundStyle = function (ref) { + if (ref === void 0) ref = {}; + var color = ref.color; + if (color === void 0) color = '#04b00f'; + var mask = ref.mask; + if (mask === void 0) mask = 'rgba(0, 0, 0, 0.3)'; + var lineWidth = ref.lineWidth; + if (lineWidth === void 0) lineWidth = 1; + + var half = lineWidth / 2; + var boundOption = [{ + start: { + x: x - half, + y: y + 10 - half + }, + step1: { + x: x - half, + y: y - half + }, + step2: { + x: x + 10 - half, + y: y - half + } + }, + { + start: { + x: x - half, + y: y + height - 10 + half + }, + step1: { + x: x - half, + y: y + height + half + }, + step2: { + x: x + 10 - half, + y: y + height + half + } + }, + { + start: { + x: x + width - 10 + half, + y: y - half + }, + step1: { + x: x + width + half, + y: y - half + }, + step2: { + x: x + width + half, + y: y + 10 - half + } + }, + { + start: { + x: x + width + half, + y: y + height - 10 + half + }, + step1: { + x: x + width + half, + y: y + height + half + }, + step2: { + x: x + width - 10 + half, + y: y + height + half + } + } + ]; + + // 绘制半透明层 + self.ctx.beginPath(); + self.ctx.setFillStyle(mask); + self.ctx.fillRect(0, 0, x, boundHeight); + self.ctx.fillRect(x, 0, width, y); + self.ctx.fillRect(x, y + height, width, boundHeight - y - height); + self.ctx.fillRect(x + width, 0, boundWidth - x - width, boundHeight); + self.ctx.fill(); + + boundOption.forEach(function (op) { + self.ctx.beginPath(); + self.ctx.setStrokeStyle(color); + self.ctx.setLineWidth(lineWidth); + self.ctx.moveTo(op.start.x, op.start.y); + self.ctx.lineTo(op.step1.x, op.step1.y); + self.ctx.lineTo(op.step2.x, op.step2.y); + self.ctx.stroke(); + }); + }; + } + + var version = "1.3.9"; + + var WeCropper = function WeCropper(params) { + var self = this; + var _default = {}; + + validator(self, DEFAULT); + + Object.keys(DEFAULT).forEach(function (key) { + _default[key] = DEFAULT[key].default; + }); + Object.assign(self, _default, params); + + self.prepare(); + self.attachPage(); + self.createCtx(); + self.observer(); + self.cutt(); + self.methods(); + self.init(); + self.update(); + + return self + }; + + WeCropper.prototype.init = function init() { + var self = this; + var src = self.src; + + self.version = version; + + typeof self.onReady === 'function' && self.onReady(self.ctx, self); + + if (src) { + self.pushOrign(src); + } else { + self.updateCanvas(); + } + setTouchState(self, false, false, false); + + self.oldScale = 1; + self.newScale = 1; + + return self + }; + + Object.assign(WeCropper.prototype, handle); + + WeCropper.prototype.prepare = prepare; + WeCropper.prototype.observer = observer; + WeCropper.prototype.methods = methods; + WeCropper.prototype.cutt = cut; + WeCropper.prototype.update = update; + + return WeCropper; + +}))); diff --git a/uview-ui/components/u-avatar/u-avatar.vue b/uview-ui/components/u-avatar/u-avatar.vue new file mode 100644 index 0000000..f449fa1 --- /dev/null +++ b/uview-ui/components/u-avatar/u-avatar.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/uview-ui/components/u-back-top/u-back-top.vue b/uview-ui/components/u-back-top/u-back-top.vue new file mode 100644 index 0000000..12ffb33 --- /dev/null +++ b/uview-ui/components/u-back-top/u-back-top.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/uview-ui/components/u-badge/u-badge.vue b/uview-ui/components/u-badge/u-badge.vue new file mode 100644 index 0000000..eafb65d --- /dev/null +++ b/uview-ui/components/u-badge/u-badge.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/uview-ui/components/u-button/u-button.vue b/uview-ui/components/u-button/u-button.vue new file mode 100644 index 0000000..94c0c28 --- /dev/null +++ b/uview-ui/components/u-button/u-button.vue @@ -0,0 +1,668 @@ + + + + + diff --git a/uview-ui/components/u-calendar/u-calendar.vue b/uview-ui/components/u-calendar/u-calendar.vue new file mode 100644 index 0000000..7d088e3 --- /dev/null +++ b/uview-ui/components/u-calendar/u-calendar.vue @@ -0,0 +1,649 @@ + + + + diff --git a/uview-ui/components/u-car-keyboard/u-car-keyboard.vue b/uview-ui/components/u-car-keyboard/u-car-keyboard.vue new file mode 100644 index 0000000..6f22f94 --- /dev/null +++ b/uview-ui/components/u-car-keyboard/u-car-keyboard.vue @@ -0,0 +1,258 @@ + + + + + diff --git a/uview-ui/components/u-card/u-card.vue b/uview-ui/components/u-card/u-card.vue new file mode 100644 index 0000000..4ae4dee --- /dev/null +++ b/uview-ui/components/u-card/u-card.vue @@ -0,0 +1,301 @@ + + + + + diff --git a/uview-ui/components/u-cell-group/u-cell-group.vue b/uview-ui/components/u-cell-group/u-cell-group.vue new file mode 100644 index 0000000..065810c --- /dev/null +++ b/uview-ui/components/u-cell-group/u-cell-group.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/uview-ui/components/u-cell-item/u-cell-item.vue b/uview-ui/components/u-cell-item/u-cell-item.vue new file mode 100644 index 0000000..1a36646 --- /dev/null +++ b/uview-ui/components/u-cell-item/u-cell-item.vue @@ -0,0 +1,315 @@ + + + + + diff --git a/uview-ui/components/u-checkbox-group/u-checkbox-group.vue b/uview-ui/components/u-checkbox-group/u-checkbox-group.vue new file mode 100644 index 0000000..afd891e --- /dev/null +++ b/uview-ui/components/u-checkbox-group/u-checkbox-group.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/uview-ui/components/u-checkbox/u-checkbox.vue b/uview-ui/components/u-checkbox/u-checkbox.vue new file mode 100644 index 0000000..f50e52b --- /dev/null +++ b/uview-ui/components/u-checkbox/u-checkbox.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/uview-ui/components/u-circle-progress/u-circle-progress.vue b/uview-ui/components/u-circle-progress/u-circle-progress.vue new file mode 100644 index 0000000..caeabe4 --- /dev/null +++ b/uview-ui/components/u-circle-progress/u-circle-progress.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/uview-ui/components/u-circle-progress/u-line-progress/u-line-progress.vue b/uview-ui/components/u-circle-progress/u-line-progress/u-line-progress.vue new file mode 100644 index 0000000..eb138c5 --- /dev/null +++ b/uview-ui/components/u-circle-progress/u-line-progress/u-line-progress.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/uview-ui/components/u-col/u-col.vue b/uview-ui/components/u-col/u-col.vue new file mode 100644 index 0000000..dbde4bd --- /dev/null +++ b/uview-ui/components/u-col/u-col.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/uview-ui/components/u-collapse-item/u-collapse-item.vue b/uview-ui/components/u-collapse-item/u-collapse-item.vue new file mode 100644 index 0000000..b69146f --- /dev/null +++ b/uview-ui/components/u-collapse-item/u-collapse-item.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/uview-ui/components/u-collapse/u-collapse.vue b/uview-ui/components/u-collapse/u-collapse.vue new file mode 100644 index 0000000..791db6e --- /dev/null +++ b/uview-ui/components/u-collapse/u-collapse.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/uview-ui/components/u-column-notice/u-column-notice.vue b/uview-ui/components/u-column-notice/u-column-notice.vue new file mode 100644 index 0000000..c5a0901 --- /dev/null +++ b/uview-ui/components/u-column-notice/u-column-notice.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/uview-ui/components/u-count-down/u-count-down.vue b/uview-ui/components/u-count-down/u-count-down.vue new file mode 100644 index 0000000..7765e59 --- /dev/null +++ b/uview-ui/components/u-count-down/u-count-down.vue @@ -0,0 +1,318 @@ + + + + + diff --git a/uview-ui/components/u-count-to/u-count-to.vue b/uview-ui/components/u-count-to/u-count-to.vue new file mode 100644 index 0000000..7ae36a0 --- /dev/null +++ b/uview-ui/components/u-count-to/u-count-to.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/uview-ui/components/u-divider/u-divider.vue b/uview-ui/components/u-divider/u-divider.vue new file mode 100644 index 0000000..1515d3d --- /dev/null +++ b/uview-ui/components/u-divider/u-divider.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/uview-ui/components/u-dropdown-item/u-dropdown-item.vue b/uview-ui/components/u-dropdown-item/u-dropdown-item.vue new file mode 100644 index 0000000..14676ac --- /dev/null +++ b/uview-ui/components/u-dropdown-item/u-dropdown-item.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/uview-ui/components/u-dropdown/u-dropdown.vue b/uview-ui/components/u-dropdown/u-dropdown.vue new file mode 100644 index 0000000..4b0177b --- /dev/null +++ b/uview-ui/components/u-dropdown/u-dropdown.vue @@ -0,0 +1,301 @@ + + + + + diff --git a/uview-ui/components/u-empty/u-empty.vue b/uview-ui/components/u-empty/u-empty.vue new file mode 100644 index 0000000..92dd6bf --- /dev/null +++ b/uview-ui/components/u-empty/u-empty.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/uview-ui/components/u-field/u-field.vue b/uview-ui/components/u-field/u-field.vue new file mode 100644 index 0000000..b4ac56b --- /dev/null +++ b/uview-ui/components/u-field/u-field.vue @@ -0,0 +1,392 @@ +