From 59c644956bc775bcfeee3efbdca35c0836a806c2 Mon Sep 17 00:00:00 2001 From: mk <2403457699@qq.com> Date: Wed, 15 May 2024 20:11:09 +0800 Subject: [PATCH] init --- .browserslistrc | 2 + .editorconfig | 14 + .env.development | 6 + .env.production | 5 + .env.staging | 4 + .eslintignore | 4 + .eslintrc.js | 54 ++ .gitignore | 24 + .postcssrc.js | 13 + .prettierignore | 1 + .prettierrc | 24 + README.md | 1212 ++++++++++++++++++++++++++++++++ babel.config.js | 22 + jsconfig.json | 17 + package.json | 60 ++ public/favicon.ico | Bin 0 -> 4286 bytes public/index.html | 27 + src/App.vue | 14 + src/api/home.js | 6 + src/api/index.js | 7 + src/api/user.js | 32 + src/assets/css/common.less | 70 ++ src/assets/css/index.less | 35 + src/assets/css/mixin.scss | 36 + src/assets/css/vant-theme.less | 688 ++++++++++++++++++ src/assets/css/variables.scss | 3 + src/assets/logo.png | Bin 0 -> 6849 bytes src/components/TabBar.vue | 54 ++ src/config/env.development.js | 9 + src/config/env.production.js | 8 + src/config/env.staging.js | 8 + src/config/index.js | 3 + src/const/index.js | 0 src/filters/filter.js | 37 + src/filters/index.js | 7 + src/main.js | 39 + src/plugins/vant.js | 53 ++ src/router/index.js | 30 + src/router/router.config.js | 11 + src/store/getters.js | 4 + src/store/index.js | 15 + src/store/modules/app.js | 19 + src/utils/index.js | 110 +++ src/utils/jsApiList.js | 7 + src/utils/request.js | 58 ++ src/utils/storage.js | 35 + src/utils/validate.js | 20 + src/utils/vconsole.js | 3 + src/utils/wechatPlugin.js | 12 + src/views/login/index.vue | 46 ++ static/image/demo.png | Bin 0 -> 26026 bytes static/image/secret.png | Bin 0 -> 35693 bytes vue.config.js | 171 +++++ 53 files changed, 3139 insertions(+) create mode 100644 .browserslistrc create mode 100644 .editorconfig create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .env.staging create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .postcssrc.js create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 README.md create mode 100644 babel.config.js create mode 100644 jsconfig.json create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 public/index.html create mode 100644 src/App.vue create mode 100644 src/api/home.js create mode 100644 src/api/index.js create mode 100644 src/api/user.js create mode 100644 src/assets/css/common.less create mode 100644 src/assets/css/index.less create mode 100644 src/assets/css/mixin.scss create mode 100644 src/assets/css/vant-theme.less create mode 100644 src/assets/css/variables.scss create mode 100644 src/assets/logo.png create mode 100644 src/components/TabBar.vue create mode 100644 src/config/env.development.js create mode 100644 src/config/env.production.js create mode 100644 src/config/env.staging.js create mode 100644 src/config/index.js create mode 100644 src/const/index.js create mode 100644 src/filters/filter.js create mode 100644 src/filters/index.js create mode 100644 src/main.js create mode 100644 src/plugins/vant.js create mode 100644 src/router/index.js create mode 100644 src/router/router.config.js create mode 100644 src/store/getters.js create mode 100644 src/store/index.js create mode 100644 src/store/modules/app.js create mode 100644 src/utils/index.js create mode 100644 src/utils/jsApiList.js create mode 100644 src/utils/request.js create mode 100644 src/utils/storage.js create mode 100644 src/utils/validate.js create mode 100644 src/utils/vconsole.js create mode 100644 src/utils/wechatPlugin.js create mode 100644 src/views/login/index.vue create mode 100644 static/image/demo.png create mode 100644 static/image/secret.png create mode 100644 vue.config.js diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..d6471a3 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,2 @@ +> 1% +last 2 versions diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ea6e20f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..54e3512 --- /dev/null +++ b/.env.development @@ -0,0 +1,6 @@ +NODE_ENV='development' +# must start with VUE_APP_ +VUE_APP_ENV = 'development' +outputDir = 'epmet-work-h5-dev' + + diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..8deecc0 --- /dev/null +++ b/.env.production @@ -0,0 +1,5 @@ +NODE_ENV='production' +# must start with VUE_APP_ +VUE_APP_ENV = 'production' +outputDir = 'epmet-work-h5-prod' + \ No newline at end of file diff --git a/.env.staging b/.env.staging new file mode 100644 index 0000000..92749e3 --- /dev/null +++ b/.env.staging @@ -0,0 +1,4 @@ +NODE_ENV='production' +# must start with VUE_APP_ +VUE_APP_ENV = 'staging' + diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e6529fc --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +build/*.js +src/assets +public +dist diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..610b9aa --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,54 @@ +module.exports = { + root: true, + env: { + browser: true, + node: true, + es6: true, + 'vue/setup-compiler-macros': true + }, + globals: { + defineProps: 'readonly', + defineEmits: 'readonly' + }, + extends: ['plugin:vue/essential', 'eslint:recommended', 'plugin:prettier/recommended'], + parserOptions: { + parser: '@babel/eslint-parser' + }, + rules: { + 'no-console': 'warn', + 'no-debugger': 'warn', + 'vue/script-setup-uses-vars': 'error', + 'vue/custom-event-name-casing': 'off', + 'no-use-before-define': 'off', + 'no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_' + } + ], + 'space-before-function-paren': 'off', + 'vue/attributes-order': 'off', + 'vue/one-component-per-file': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/attribute-hyphenation': 'off', + 'vue/require-default-prop': 'off', + 'vue/html-self-closing': [ + 'error', + { + html: { + void: 'always', + normal: 'never', + component: 'always' + }, + svg: 'always', + math: 'always' + } + ], + 'vue/v-on-event-hyphenation': 'off', + 'vue/multi-word-component-names': 'off' + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fdc3bc3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +.DS_Store +node_modules +/dist +/docs +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +package-lock.json +yarn.lock \ No newline at end of file diff --git a/.postcssrc.js b/.postcssrc.js new file mode 100644 index 0000000..1b534ef --- /dev/null +++ b/.postcssrc.js @@ -0,0 +1,13 @@ +// https://github.com/michael-ciniawsky/postcss-load-config +module.exports = { + plugins: { + autoprefixer: { + overrideBrowserslist: ['Android 4.1', 'iOS 7.1', 'Chrome > 31', 'ff > 31', 'ie >= 8'] + }, + 'postcss-pxtorem': { + rootValue: 37.5, + propList: ['*'], + //selectorBlackList: ['van-'] + } + } +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..42061c0 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +README.md \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..26e9376 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,24 @@ +{ + "printWidth": 120, + "tabWidth": 2, + "singleQuote": true, + "trailingComma": "none", + "semi": false, + "wrap_line_length": 120, + "wrap_attributes": "auto", + "proseWrap": "always", + "arrowParens": "avoid", + "bracketSpacing": true, + "jsxBracketSameLine": true, + "useTabs": false, + "eslintIntegration":true, + "overrides": [ + { + "files": ".prettierrc", + "options": { + "parser": "json" + } + } + ], + "endOfLine": "auto" +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..880838d --- /dev/null +++ b/README.md @@ -0,0 +1,1212 @@ +# vue-h5-template + +基于 vue-cli4.0 + webpack 4 + vant ui + sass+ rem 适配方案+axios 封装 + jssdk配置 + vconsole移动端调试,构建手机端模板脚手架 + +掘金: [vue-cli4 vant rem 移动端框架方案](https://juejin.im/post/5cfefc73f265da1bba58f9f7) + +[查看 demo](https://solui.cn/vue-h5-template/#/) 建议手机端查看 + +
+
+
+
+
Rz$KlnO_H2c< z(XX#lPuW_%H#Q+c&(nRyX1-Ia dKR-%$4FYC0fsCmL9ky3 zKpxyjd^JFR+vg2!=HWf}2Z?@Td`0EG`kU?{8zKrvtsm)|7>pPk9nu@2^z96aU2<#` z2QhvH5w&V;wER?mopu+nqu*n8p~(%Q kwSs&*0eJwa zMXR05`OSFpfyRb! Y_+H@O%Y z0=K^y6B8Gcbl?SA)qMP3Z+=C(?8zL@=74R=EVnE?vY!1BQy2@q*RUgRx4yJ$k}MnL zs!?74QciNb-LcG*&o<9=DSL>1n}ZNd)w1z3-0Pd^4ED1{qd=9|!!N?xnXjM!EuylY z5=!H>&hSofh8V?Jofyd!h`xDI1fYAuV(sZwwN~{$a}MX^=+0TH*SFp$vyxmUv7C*W zv^3Gl0+eTFgBi3FVD;$nhcp)ka*4gSskYIqQ&+M}xP9yLAkWzBI^I%zR^l1e?bW_6 zIn{mo{dD=)9@V?s^fa55jh78rP*Ze<3`tRCN4*mpO$@7a^*2B*7N_|A(Ve2VB|)_o z$=#_=aBkhe(ifX}MLT()@5? OV+~7cXC3r!%{QJxriXo9I%*3q4KT4Xxzyd{ z9;_%=W%q!Vw$Z7F3lUnY+1HZ*lO;4;VR2+i4+D(m#01OYq|L_fbnT;KN<^dkkCwtd zF7n+O7KvAw8c`JUh6LmeIrk4`F3o|AagKSMK3))_5Cv~y2Bb2!Ibg9BO7Vkz?pAYX zoI=B}+$R22&IL`NCYUYjrdhwjnM x_v=-Qcx-jmtN>!Zqf|n1^SWrHy zK|MwJ?Z#^>)rfT5YSY{qjZ&`Fjd;^vv&gF-Yj6$9-Dy$<6zeP4s+78gS2|t%Z309b z0^fp~ue_}i`U9j!<|qF92_3oB09NqgAoehQ`)<)dSfKoJl_A6Ec#*Mx9Cpd-p#$Ez z={AM*r-bQs6*z$!*V A4|QE7bf@-4vb?Q+pPKLkY2{yKsw{&udv_2v8{Dbd zm~8VAv!G~s)`O3|Q6vFUV%8%+?ZSVUa(;fhPNg#vab@J*9XE4#D%)$UU-T5`fwjz! z6&gA^`OGu6aUk{l*h9eB?opVdrHK>Q@U>&JQ_2pR%}TyOXGq_6s56_`U(WoOaAb+K zXQr#6H}>a-GYs9^bG P2Y&hSP5gEtW+GVC4=wy0wQk=~%CSXj=GH6q z-T#s!BV`xZVxm{~jr_ezYRpqqIcXC=Oq`b{lu`Rt(IYr4B91hhVC?yg{ol4WUr3v9 zOAk2LG>CIECZ-WIs0$N}F#eoIUEtZudc7DPYIjzGqDLWk_A4#( LgacooD z2K4IWs@N`Bddm-{%oy}!k0^i6Yh)uJ1S*90>|bm3TOZxcV|ywHUb(+CeX-o1|LTZM zwU>dY3R&U)T(}5#Neh?-CWT~@{6Ke@sI)uSuzoah8COy)w)B)aslJmp`WUcjdia-0 zl2Y}&L~XfA`uYQboAJ1;J{XLhYjH){cObH3FDva+^8ioOQy%Z=xyjGLmWMrzfFoH; zEi3AG`_v+%)&lDJE;iJWJDI@-X9K5O)LD~j*PBe(wu+|%ar~C+LK1+-+lK =t# z+Xc+J7qp~5q=B~rD!x78)?1+KUIbYr^5rcl&tB-cTtj+e%{gpZZ4G~6r15+d|J(ky zjg@@UzMW0k9@S#W(1H{u;Nq(7llJbq;;4t$awM;l&(2s+$l!Ay9^Ge|34CVhr7|BG z?dAR83smef^frq9V(OH+a+ki#q&-7TkWfFM=5bsGbU(8mC;>QTCWL5ydz9s6k@?+V zcjiH`VI=59P-(-DWXZ~5DH>B^_H~;4$)KUhnmGo*G!Tq8^LjfUDO)lASN*=#AY_yS zqW9UX(VOCO&p@kHdUUgsBO0KhXxn1sprK5h8}+>IhX(nSXZKwlNsjk^M|RAaqmCZB zHBol OHYBas@&{PT=R+?d8pZu zUHfyucQ`(umXSW7o?HQ3H21M`ZJal+%*)SH1B1j6rxTlG3hx1IGJN^M7{$j(9V;MZ zRKybgVuxKo#XVM+?*yTy{W+XHaU5Jbt-UG33x{u(N-2wmw;zzPH&4DE103HV@ER86 z|FZEmQb|&1s5#`$4!Cm}&`^{(4V}OP$bk`}v6q6rm;P!H)W|2i^e{7lTk2W@jo_9q z*aw|U7#+g59Fv(5qI`#O-qPj#@_P>PC#I(GSp3DLv7x-dmYK=C7lPF8a)bxb=@)B1 zUZ`EqpXV2dR}B&r`uM}N(TS99ZT0UB%IN|0H%DcVO#T%L_chrgn#m6%x4KE*IMfjX zJ%4veCEqbXZ`H`F_+fELMC@wuy_ch%t*+Z+1I}wN#C+dRrf2X{1C8=yZ_%Pt6wL_~ zZ2NN-hXOT4P4n$QFO7yYHS-4wF1Xfr-meG9Pn;uK51?hfel`d38k{W)F*|gJLT2#T z<~>spMu4(mul-8Q3*pf=N4DcI)zzjqAgbE2eOT7~&f1W3VsdD44Ffe;3mJp-V@8UC z)|qnPc12o~$X-+U@L_lWqv-RtvB~%hLF($%Ew5w>^NR82qC_0F B z)=hP1-OEx?lLi#jnLzH}a;Nvr@JDO-zQWd}#k^an$Kwml;MrD&)sC5b`s0ZkVyPkb zt}-jOq^%_9>YZe7Y}PhW{a)c39G`kg(P4@kxjcYfgB4XOOcmezdUI7j-!gs7oAo2o zx(Ph{G+YZ`a%~kzK!HTAA5NXE-7vOFRr5oqY$rH>WI6SFvWmahFav!CfRMM3%8J&c z*p+%|-fNS_@QrFr(at!JY9jCg9F-%5{nb5Bo~z@Y9m&SHYV`49GAJjA5h~h4(G!Se zZmK{Bo7ivCfvl}@A-ptkFGcWXAzj3xfl{evi-OG(TaCn1FAHxRc{}B|x+Ua1D=I6M z!C^ZIvK6aS_c&(=OQDZfm>O`Nxsw{ta&yiYPA~@e#c%N>>#rq)k6Aru-qD4(D^v)y z*>Rs;YUbD1S8^D(ps6Jbj0K3wJw>L4m)0e(6Pee3Y?gy9i0^bZO?$*sv+xKV?WBlh zAp*;v6w!a8;A7sLB*g-^<$Z4L7|5jXxxP1}hQZ<55f9<^KJ>^mKlWSGaLcO0=$jem zWyZkRwe~u{{tU63DlCaS9$Y4CP4f?+wwa(&1ou)b>72yd rFvm`R j-0`kBJgK@nd(*Eh!(NC{F-@=FnF&Y!q`7){YsLLHf0_B6aHc# z>WIuHTyJwIH{BJ4)2RtEauC7Yq7Cytc|S )4^*t8Va3HR zg=~sN^tp9re@w=GTx$;zOWMjcg-7X3Wk^N$n;&Kf1RgVG2}2L-(0o)54C509C&77i zrjSi{X*WV=%C17((N^6R4Ya*4#6s_L99RtQ>m(%#nQ#wrRC8Y%yxkH;d!MdY+Tw@r zjpSnK`;C-U{ATcgaxoEpP0Gf+tx);buOM lK=01D|J+ROu37qc*rD(w`#O=3*O*w9?biwNoq3WN1`&Wp8TvKj3C z3HR9ssH7a&Vr<6waJrUzdLg!ieYz%U^bmpn%;(V%%ugMk92&?_XX1K@mwnVSE6!&%P%Wdi7_h`CpScvspMx?N zQUR>oadnG17#hNc$pkTp+9 lW+MBKHRZ~7 4XWUryd)4yd zj98$%XmIL4(9OnoeO5Fnyn&fpQ9b0h4e6EHHw*l68j;>(ya`g^S&y2{O8U>1*>4zR zq*WSI_2o$CHQ?x0!wl9bpx|Cm2+kFMR)oMud1%n2=qn5nE&t@Fgr#=Zv2?}wtEz^T z9rrj=?I H*qI5{G@Rn&}^Z{+TW}mQe b9=8b<_a`&Cm#n%n~ zU47MvCBsdXFB1+adOO)03+nczfWa#vwk #r{o{dF)QWya9v2nv43Zp3%Ps}($lA02*_g25t;|T{A5snSY?3A zrRQ~(Ygh_ebltHo1VC bJb*eOAr;4cnlXLvI>*$-#AVsGg6B1r7@;g^L zFlJ_th0vxO7;-opU@WAFe;<}?!2q?RBrFK5U{ *ai@NLKZ^};Ul}beukveh?TQn;$%9=R+DX07m82gP$=}Uo_%&ngV`}Hyv8g{u z3SWzTGV|cwQuFIs7ZDOqO_fGf8Q`8MwL}eUp>q?4eqCmOTcwQuXtQckPy|4F1on8l zP*h>d+cH#XQf|+6c|S{7SF(Lg>bR~l(0uY?O{OEVlaxa5@e%T&xju=o1`=OD#qc16 zSvyH*my(dcp6~VqR;o(#@m44Lug@~_qw+HA=mS#Z^ 4reBy8iV?H~I;{LQWk3aKK8$bLRyt$g?- + ++ + + + + diff --git a/src/config/env.development.js b/src/config/env.development.js new file mode 100644 index 0000000..046d75b --- /dev/null +++ b/src/config/env.development.js @@ -0,0 +1,9 @@ +// 本地环境配置 +module.exports = { + env: 'development', + title: 'e联社区', + baseUrl: 'http://192.168.1.144/', // 项目地址 + baseApi: 'http://192.168.1.144/api', // 本地api请求地址,注意:如果你使用了代理,请设置成'/' + APPID: 'xxx', + APPSECRET: 'xxx', +} diff --git a/src/config/env.production.js b/src/config/env.production.js new file mode 100644 index 0000000..fc3e233 --- /dev/null +++ b/src/config/env.production.js @@ -0,0 +1,8 @@ +// 正式 +module.exports = { + env: 'production', + title: 'e联社区', + baseUrl: 'https://epmet-preview.elinkservice.cn/', // 正式项目地址 + baseApi: 'https://epmet-preview.elinkservice.cn/api', // 正式api请求地址 + APPSECRET: 'xxx', +} diff --git a/src/config/env.staging.js b/src/config/env.staging.js new file mode 100644 index 0000000..0f67f68 --- /dev/null +++ b/src/config/env.staging.js @@ -0,0 +1,8 @@ +module.exports = { + env: 'staging', + title: 'e联社区', + baseUrl: 'https://test.xxx.com', // 测试项目地址 + baseApi: 'https://test.xxx.com/api', // 测试api请求地址 + APPID: 'xxx', + APPSECRET: 'xxx', +} diff --git a/src/config/index.js b/src/config/index.js new file mode 100644 index 0000000..72a4fa1 --- /dev/null +++ b/src/config/index.js @@ -0,0 +1,3 @@ +// 根据环境引入不同配置 process.env.NODE_ENV +const config = require('./env.' + process.env.VUE_APP_ENV) +module.exports = config diff --git a/src/const/index.js b/src/const/index.js new file mode 100644 index 0000000..e69de29 diff --git a/src/filters/filter.js b/src/filters/filter.js new file mode 100644 index 0000000..e8bb4c0 --- /dev/null +++ b/src/filters/filter.js @@ -0,0 +1,37 @@ +/** + *格式化时间 + *yyyy-MM-dd hh:mm:ss + */ +export function formatDate(time, fmt) { + if (time === undefined || '') { + return + } + const date = new Date(time) + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) + } + const o = { + 'M+': date.getMonth() + 1, + 'd+': date.getDate(), + 'h+': date.getHours(), + 'm+': date.getMinutes(), + 's+': date.getSeconds() + } + for (const k in o) { + if (new RegExp(`(${k})`).test(fmt)) { + const str = o[k] + '' + fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? str : padLeftZero(str)) + } + } + return fmt +} + +function padLeftZero(str) { + return ('00' + str).substr(str.length) +} +/* + * 隐藏用户手机号中间四位 + */ +export function hidePhone(phone) { + return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2') +} diff --git a/src/filters/index.js b/src/filters/index.js new file mode 100644 index 0000000..a889078 --- /dev/null +++ b/src/filters/index.js @@ -0,0 +1,7 @@ +import Vue from 'vue' +import * as filter from './filter' + +Object.keys(filter).forEach(k => Vue.filter(k, filter[k])) + +Vue.prototype.$formatDate = Vue.filter('formatDate') +Vue.prototype.$hidePhone = Vue.filter('hidePhone') diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..92f038e --- /dev/null +++ b/src/main.js @@ -0,0 +1,39 @@ +import 'core-js/stable' +import 'regenerator-runtime/runtime' + +import Vue from 'vue' +import App from './App.vue' +import router from './router' +import store from './store' + +// 全局引入按需引入UI库 vant +import '@/plugins/vant' + +// 引入全局样式 +import '@/assets/css/common.less' +import '@/assets/css/index.less' +// 移动端适配 +import 'amfe-flexible' + +Vue.config.productionTip = false + +// 日期格式化插件 +import dayjs from 'dayjs' + +Vue.prototype.$dayjs = dayjs +// 提示框封装 +// import { Tips } from '@/utils' + +// Vue.prototype.$tips = Tips +//开发环境使用,生产环境自动取消 +import Vconsole from 'vconsole' + +if (process.env.NODE_ENV !== 'production') { + new Vconsole() +} +new Vue({ + el: '#app', + router, + store, + render: h => h(App) +}) diff --git a/src/plugins/vant.js b/src/plugins/vant.js new file mode 100644 index 0000000..343ce83 --- /dev/null +++ b/src/plugins/vant.js @@ -0,0 +1,53 @@ +// 按需全局引入 @组件 +import Vue from 'vue' +import { + Button, + Field, + Cell, + Uploader, + Image, + Picker, + Popup, + Icon, + Toast, + Progress, + NavBar, + RadioGroup, + Radio, + Dialog, + Tabs, + Tab, + Tag, + Steps, + Step, + Divider, + List, + ActionSheet, + Checkbox, + CellGroup +} from 'vant' + +Vue.use(Button) + .use(Field) + .use(Cell) + .use(Uploader) + .use(Image) + .use(Picker) + .use(Popup) + .use(Icon) + .use(Toast) + .use(Progress) + .use(NavBar) + .use(RadioGroup) + .use(Radio) + .use(Dialog) + .use(Tabs) + .use(Tab) + .use(Tag) + .use(Steps) + .use(Step) + .use(Divider) + .use(List) + .use(ActionSheet) + .use(Checkbox) + .use(CellGroup) diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..5889228 --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,30 @@ +import Vue from 'vue' +import Router from 'vue-router' +import { constantRouterMap } from './router.config.js' + +// hack router push callback +const originalPush = Router.prototype.push +Router.prototype.push = function push(location, onResolve, onReject) { + if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject) + return originalPush.call(this, location).catch(err => err) +} + +Vue.use(Router) + +const createRouter = () => + new Router({ + scrollBehavior: () => ({ y: 0 }), + routes: constantRouterMap + }) + +const router = createRouter() + +// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465 +export function resetRouter() { + const newRouter = createRouter() + router.matcher = newRouter.matcher // reset router +} + + + +export default router \ No newline at end of file diff --git a/src/router/router.config.js b/src/router/router.config.js new file mode 100644 index 0000000..34b3015 --- /dev/null +++ b/src/router/router.config.js @@ -0,0 +1,11 @@ +/** + * 基础路由 + * @type { *[] } + */ +export const constantRouterMap = [ + { + path: '/', + component: () => import('@/views/login'), + meta: { title: '登录', keepAlive: false } + } +] diff --git a/src/store/getters.js b/src/store/getters.js new file mode 100644 index 0000000..93634df --- /dev/null +++ b/src/store/getters.js @@ -0,0 +1,4 @@ +const getters = { + userName: state => state.app.userName +} +export default getters diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..1ee10b9 --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,15 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import getters from './getters' +import app from './modules/app' + +Vue.use(Vuex) + +const store = new Vuex.Store({ + modules: { + app + }, + getters +}) + +export default store diff --git a/src/store/modules/app.js b/src/store/modules/app.js new file mode 100644 index 0000000..7f81758 --- /dev/null +++ b/src/store/modules/app.js @@ -0,0 +1,19 @@ +const state = { + userName: '' +} +const mutations = { + SET_USER_NAME(state, name) { + state.userName = name + } +} +const actions = { + // 设置name + setUserName({ commit }, name) { + commit('SET_USER_NAME', name) + } +} +export default { + state, + mutations, + actions +} diff --git a/src/utils/index.js b/src/utils/index.js new file mode 100644 index 0000000..cd14bd5 --- /dev/null +++ b/src/utils/index.js @@ -0,0 +1,110 @@ +/** + * Created by PanJiaChen on 16/11/18. + */ + +/** + * Parse the time to string + * @param {(Object|string|number)} time + * @param {string} cFormat + * @returns {string} + */ +export function parseTime(time, cFormat) { + if (arguments.length === 0) { + return null + } + const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { + let value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] } + if (result.length > 0 && value < 10) { + value = '0' + value + } + return value || 0 + }) + return time_str +} + +/** + * @param {number} time + * @param {string} option + * @returns {string} + */ +export function formatTime(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + if (diff < 30) { + return '刚刚' + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + '分钟前' + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + '小时前' + } else if (diff < 3600 * 24 * 2) { + return '1天前' + } + if (option) { + return parseTime(time, option) + } else { + return ( + d.getMonth() + + 1 + + '月' + + d.getDate() + + '日' + + d.getHours() + + '时' + + d.getMinutes() + + '分' + ) + } +} + +/** + * @param {string} url + * @returns {Object} + */ +export function param2Obj(url) { + const search = url.split('?')[1] + if (!search) { + return {} + } + return JSON.parse( + '{"' + + decodeURIComponent(search) + .replace(/"/g, '\\"') + .replace(/&/g, '","') + .replace(/=/g, '":"') + .replace(/\+/g, ' ') + + '"}' + ) +} diff --git a/src/utils/jsApiList.js b/src/utils/jsApiList.js new file mode 100644 index 0000000..6d3cd63 --- /dev/null +++ b/src/utils/jsApiList.js @@ -0,0 +1,7 @@ +export const jsApiList = [ + 'updateAppMessageShareData', + 'updateTimelineShareData', + 'getLocation', + 'openLocation', + 'chooseWXPay' +] diff --git a/src/utils/request.js b/src/utils/request.js new file mode 100644 index 0000000..6788f91 --- /dev/null +++ b/src/utils/request.js @@ -0,0 +1,58 @@ +import axios from 'axios' +import store from '@/store' +import { Toast } from 'vant' +// 根据环境不同引入不同api地址 +import { baseApi } from '@/config' +// create an axios instance +const service = axios.create({ + baseURL: baseApi, // url = base api url + request url + withCredentials: true, // send cookies when cross-domain requests + timeout: 5000 // request timeout +}) + +// request拦截器 request interceptor +service.interceptors.request.use( + config => { + // 不传递默认开启loading + if (!config.hideloading) { + // loading + Toast.loading({ + forbidClick: true + }) + } + if (store.getters.token) { + config.headers['X-Token'] = '' + } + return config + }, + error => { + // do something with request error + console.log(error) // for debug + return Promise.reject(error) + } +) +// respone拦截器 +service.interceptors.response.use( + response => { + Toast.clear() + const res = response.data + if (res.status && res.status !== 200) { + // 登录超时,重新登录 + if (res.status === 401) { + store.dispatch('FedLogOut').then(() => { + location.reload() + }) + } + return Promise.reject(res || 'error') + } else { + return Promise.resolve(res) + } + }, + error => { + Toast.clear() + console.log('err' + error) // for debug + return Promise.reject(error) + } +) + +export default service diff --git a/src/utils/storage.js b/src/utils/storage.js new file mode 100644 index 0000000..8105661 --- /dev/null +++ b/src/utils/storage.js @@ -0,0 +1,35 @@ +/** + * 封装操作localstorage本地存储的方法 + */ +export const storage = { + //存储 + set(key, value) { + localStorage.setItem(key, JSON.stringify(value)) + }, + //取出数据 + get(key) { + return JSON.parse(localStorage.getItem(key)) + }, + // 删除数据 + remove(key) { + localStorage.removeItem(key) + } +} + +/** + * 封装操作sessionStorage本地存储的方法 + */ +export const sessionStorage = { + //存储 + set(key, value) { + window.sessionStorage.setItem(key, JSON.stringify(value)) + }, + //取出数据 + get(key) { + return JSON.parse(window.sessionStorage.getItem(key)) + }, + // 删除数据 + remove(key) { + window.sessionStorage.removeItem(key) + } +} diff --git a/src/utils/validate.js b/src/utils/validate.js new file mode 100644 index 0000000..e9bd1ba --- /dev/null +++ b/src/utils/validate.js @@ -0,0 +1,20 @@ +/** + * Created by Sunnie on 19/06/04. + */ + +/** + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path) { + return /^(https?:|mailto:|tel:)/.test(path) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUsername(str) { + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 +} diff --git a/src/utils/vconsole.js b/src/utils/vconsole.js new file mode 100644 index 0000000..dd6121a --- /dev/null +++ b/src/utils/vconsole.js @@ -0,0 +1,3 @@ +import Vconsole from 'vconsole' +const vConsole = new Vconsole() +export default vConsole diff --git a/src/utils/wechatPlugin.js b/src/utils/wechatPlugin.js new file mode 100644 index 0000000..90e6ab4 --- /dev/null +++ b/src/utils/wechatPlugin.js @@ -0,0 +1,12 @@ +import wx from 'weixin-js-sdk' + +const plugin = { + install(Vue) { + Vue.prototype.$wx = wx + Vue.wx = wx + }, + $wx: wx +} + +export default plugin +export const install = plugin.install diff --git a/src/views/login/index.vue b/src/views/login/index.vue new file mode 100644 index 0000000..d25101f --- /dev/null +++ b/src/views/login/index.vue @@ -0,0 +1,46 @@ + ++ ++ {{ item.title }} + +++ + + + + diff --git a/static/image/demo.png b/static/image/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf476f96857a268df4e5becb2e714476bf9a3b3 GIT binary patch literal 26026 zcmcGV2UJt*wzlK8(nLY&kc||jOP3k}rAY4`1f&xX1*8QODI!gJZvxT@p#-FaEiD29 zp+h1dO}f-j5(58npL@=}r`~(+IKN{!FtT8+tgLU&cRug?Me1m&P?0l{gFqlEHPr`t zAkaA{5a>MRl}o_?1cBwMfiLHt>!~P$ss>nAffpAX6*Lt+++ ++ + ++ 登录 +++下次自动登录 + 忘记密码? +yWzkyM7) zbb2nG7wHDu_odi37wV}s4d)PLn&2lc6Y_`Zhh@mJ9LLHR)6WkMrKFdoh(7|jEU$q; zzp7so1Kt1ds}ty@h5`lzN)O392NJoca31u8JmeDS^NkBspm#i1m_Wbk|8byHK!}wo zm5rxV=(2X$_M)2!Y#VVcCygq +QR3!QO_QhK%Z;J@1ebVC=F{z`N}HezCHCF|4b)%yjoKhrIj{ zCR%aQrD}4zTK4X2b1PyAOv 6c`5PEiIYX`Jx-S! zsa!HpZiO$~HgCh5&wbDIs47C;FVZ6e6EG3&n+>yUMn-1Aw?AfIsI-Iq__+M`R6Fb5 zb=1j{P( xQ!|~z{(4yfviq4M%p^QKyxlHN z&PW}0j (h!=SK0c%S;evqaqYR0Ie&zI+>ttB)i{_m@ z$l2bUt2NQAvTHA5{Gw&{QWXo)$HaGaCgvIP=WQ+h#P7cv9Hf~>)F#bM thBYq&N$bZliq@g_qvJ1)i`Gp1VJyJNN6 zl`fdA<-RP<@JwrfWHf@m7prQsdxzFlqkJib*`ozfGBGlu|5^Gwiui+XH+YUdh&^zD zdA6ho_1pZs?a_7wq(#s Y#RKncGppHT>(ugmEaF8`B|i_U!a&2bJWF z `LU_%!d>4oF%mmekv|SG(O$5VWm%{QU zoRl#MDT_;J6FPfn;Uu}jy8n=OfxkWVQ5 sDr8Pgb8_iE1$0CbLg|9<8AQlejo#Bx#;fm zXWo6rGIiVsu`gQeNFN%Pa{^qX`ggv)rVh6z6j}4Gm9y60zP8WQf5ps$NIF`3$U)|Z zRKy(oDBWmrx^y%VOqzJe*ea26eeE0^?~)w6>1vG|4gC}(5i>v)G9zCnxKf-;5tT~9 zGup} WLu_R=-Vyn~xfi4^5?!Dr=(b47;2XBcqn zHHbwrUfbXy$x%`ubn0Veu9|C%x~pXqrsWB9zG<9;W*I#^85)+?u-op@Fz9fBG;@e* z_zaiqaEoxKFxyRfV5owA*W{iPxZAVcYmBP7Q;_Z@Dofm`o%1;T?$Q1NwU=$yOR*w7 zj4wQ3ddT-4dg-jz?FQ4r;v#2=d*b*-(wCm Q)_C`*~4-h z0@1(yi*}oIh3vsT)`N~)mQVZaAYi#8?!e=Q7yGKq$>e%2_14*!`IO+&jyBD){=&>M z#=urd)J_aDiY63zC^%R2i?zZaq!Ea~F8*BlxSh B#?EgU;CRpU<{oefu5+bZXJgw>412W$&+O-VwzhcYS91xiI>+DB z!3n-I#MP0x*^|TN!E3 N^OV@~xZ&$tkc{NUu zj?w0Lt!IMd((;Evl%;z(H3jt1Ql^0vv-!^_Z;#!^+pKxN$RqT2aLEhJ&u3-QuCeo_ zU{d8%!g#<$s+eBjUgx8uQivZaO*of*6%r`Xvj5hxoW{Dur=dRl08DqfWPNJik)G9d zj}-CxQiv6>$Zm6UkEf>Y!zQ(cp$d|UTP2q+U3x1)%_cj!KWxf(geUrkxF0fA7!N`$ zfI8GY;gU6I>tTs0FSl9RNx!>iZS_1nZDOGd_+ZXDK2@77Ye%@S63&|Zt4tz-JPkj) z?r1b_k7-9xoIRCpIf~1rlmq*6%gR_!4O3ILKF$1iw*{lWK7PeNMmgkkv{>G7k+dsx z_Uvf90d*6#n+(6v_Ykrt3ehiYo4*Oag9;gsy*r4^Yt7S}4W8j|`py|t51({VD35M^ zZSWEJL)GTA5Z9JHS?j3ndo&l}TA6JPJpR1p#aa vZV&UQczgV {U$ZYmtFR5t3lH2qmziBrpeyZt1pAs znS$>*xrOE7$ka+$B}R%L@;e2yWk#wCek?qCc*(AI*I7~zlE}cCSw)rX;m}jTdJ?L* z^Bi*cyz7*CW;^`p?qbh-jfM-X5ElN?v&-_^uM~$7d7JbJ`{M2X*5JAqhSO$r*sFE7 zopiH*fy k&g&f4HTBwItZ;4TOF9sjc&8r)SGGbeI69342Snug+tC#m$rjX zM{JJ<8?vrKo-HUIeWEtBXNjDe=Q?Y=hT7TRO`$M5g7>eg<+KM2z&Fl6ya03P3>mM` zt5sjJ^qI1stIZ{Cgfk}22)btLOSTC39c^7&=67mCqSD_Crn7rGJ8SNacr2D~;AT$` zY< p|Oq=w;+INi$ens10VJ^2(_N31>yj`XZ#b9+D zR ^-85!x~$4y9q zr?T=M;%`~VwHomI@dq#OY>%>9lWnn~gieO>`g60Sk)G{^2)gz@_bRgEZqbE@6Gay* z)A8_W1cR2KVRMOheez^iag?gZ+`iF(9sRrAb&_76(G`C_p?M$T{&K#h0tLPlH5MDh zQ^>esT*2I0Bq7b^bat+0v9wK+JzZS%5 zaPN9y-X?3|06bfiub8L+UR&$1BBmd^cCV$7jEV$sb<#7>WBMtY!Z`__OOv;;#MF*9 zxtbeR&z?wG_`cw>@Ljjn1EkqKy_+>DQnwV&o_afwcD4-Kr%sq3`REoqxcb ixe kfaq4cx0G=c^!rQO-;YQp9gzNGY!AW!cz!xsYKQzPbQl2WqvwNETxHeE}$I+)AL zuQz~^SJq_otVn*(Sfb56dZ4TQ3g{Y!7()7#nS*HXc_lAJjJE8~gPj+-W3iSpG`b!h z9{R!NN)V6!94@c^P<_??-i8A^g#c-RmBuZH3#>vHu?^C#;qGopx)@wXqLxBz$(bSSdVZ_Obu2 z011^sou$n>t@woI@VGeK}YsX+%j*{M@^5T>j>Ebp2PPxpaukccg!$8OV_+#fW1F zwGZ!e@_tHkI+3`+Vu5q33Lh?KU`X$&rN)f-f9%D_ULid3w)NXFHfpC19_pEzr$~M} zcY9svd5iB8_LjvCin-hJ{?aE?sVN;Dw~YsTB_;KaAg`Q7wA7l}j8Ibz4ef)!^^R)| z-c-Q#SMDYH7k}HC%~B)d>Xv_??+1gHGfMC|Wu7aeB9^7+Q)Bk=l96M 6w#dWnY_D7NTU1WK3f(Wbg=XQU*XbT`su90Db`h l*JcvVEu5fJ#wd(4 GH$6rzb=Bc|u8K!PnVBMR}N;}gRM#tFms*7|?-wmfz%WmUk@Sd_O_7TePY zyV-|~A8}bP70v8SHebw+iVNB==<*vvqzbHOdAONjGFGetY{gsn#RH63Ov!}gTUf00 zl6T__icS^`dA3eB^zPl&C3_)@r1?-*yR@95xMTCU%EMvfyh4Ac7)7E66YSo~PJ;2t zywIub4q1cXQ(Cy7MSlX`W^wE6bPJw}_u#M_xT!$gE6ChiD~Df=gPa}_;1ugDYHSC5 zM{j){G87dXs58xup>;kND|7P&Y*y~AwVEfSd9$i&EG#T^ec83#@}KaxJj?X$PoSw| zRWH6Ju0&@aa*+EesrB{HM~q*!{F+?hprrJzmA2y<7vECay7Bzr5+<|Vqj;B-lT_n& z=2(G<^)_=dYIz}cxP!nV! yV6#*j?2EjK`=rA=qm l 3)YH+<`~XUS=1#ZiuOfv{s{7`@H{)_@3)hFs7dQBbnJsCCc4L zU~lr{5LJb@W&b^rwHlw2>j*(Qb8XFWX~H=(-%x?*VJWtzJv@9l-|CCB)+TOetpg(W z#r&o{URzQqcJ>qkxNfRWi99g-31Dz9D$l3JZ>`snb=D2jl1anEdK$of<5)?3`L zwkTxldAcTrnQHr>VOU_3zo5AOIFB5CAtjDt`pb)H?+HS*2E0E=^wY@OJT6D#3*&@G zWssQlfLWpy0~3>(b+3- 9p(M{lLCwk8gJbn}q_Q(%Kl*3O&~3GXU4vl9q k!dPfuPEw7DlhVJdWdP5_Q4UNx1Q$`zY;2p+pZO)w-mamgXt2yre=}IB5EO* zdJ?jsRp4vDR;xE;MT5+2b9L~>3bl?}_o-!MtSHwv;#ONQ>9tFYAv&*Z$Z|_z?xFxA zu0dDK2c~U4KQ`FW_FM;C`huCMHg*i+G!`Vf#XBf|P0THTlaYuFSM->c6kT_D2n^4t z 25lK(J5J9E&CBj~ArRqn@eir=4P>0+Ji|3jMqs&`$b%d4!tZNkHpa^oV%o^*A z|60-lbFg(C<7vsO@61m}5b73E3Ozn9rOc<=n)&& Z7~{#IQ!MXuB{58pEtk1HdhgQI#9HFYg4SErBD@d&;;`2JUn@QR6- zhSbmsi)8O%ApYol*Wi6Po6JGw(NtkKb1u;r{Fu+l9Mhzu`BciXt~9e>G}whb@aQ|@ z1G>WJ$LTNvJ2O69cEih!w|Pu4YEZWz_Z2!;m=2){vh{3;>Nb|h8TEx)`21Lay{ya= zP{>?#Z^R$ms;jJHapH_HazCks=_7~RNE%4O^nI7;n4n8+F@|=r@O&ez(}Mz}-tmrS z7ZGHxU> J8Gxmd)0wY_1Jc+d$skBh@0p65ZA w9hgSrJ z@+7$#omb%bJ9SV=9dg=uciCpl=6C3*RiK>-DmgCFLt^&D+tGgKPM9Q96y6@~@SX=3 zho;MoYJ}Lp%5vI!yS*1+`92#h-IJ61E(>}kvA|oZ6q9i*6($5;2RlZ`jCFq?cpf{% z;d+l3qS3U8KTqqO1)Ba~uYikjlPp)A)?sUoG| --bDVO@%`hYPzqAGb+eew9BYUlWD~RbVb|5>{az=-k>- zsh#6n@&h- q!kW7mBf!WgdA0E9lBM;31Y`^1$cIBkfIdzxq<-Lf|Yari&1}j-7O~K6-A0 zhXqCB;TR--3(cvwiIuu0Z#`);=D;`}yER*!%K9SE!iTM*MTZrV!yuy-Ou3V$Zx3qH zR1ZNi-}8>=?YG7V@5FpZ_}n}|VpD4~2YM&_)85CkxUuxtacwkK^!wXI5^EOp{9R^y zi5{?{=gjJ#a&NP~CLApHVD%>%+)j*c%OA3>5B5$W2zxy9&slN{?m^^*cuxFc(573B zH&Z@HRItv5v!<@$K1T1@^Pl(%v{lI8mvr)rJTI*xI{(YdJ^BkUI-sEFQ2*uYKd>eK zs5t+FfARnGz@?C}v9bHtE+{P0fB9cnDgWN3)YymQsz zBR+llWY(+9wDcmQw6qj6J8Qka-e4z|qZHBY5&!~a+o@lWlapfwFcrCi`lvmNoPWi; zr;kGMyG;smJj_fZv8?p$PM{TXOZxqtg~a@ZhKBsCuJ(4t$%d_7(NN=*8BHcKGdpbC zSy}Z94{*q(msNn~5)u>)Pfkw8&M;xYU@FkL7Su7FCayND7FmNAK3CE5BA^gF|h2 z3aePHVJEb!gth;R;rJj12H`Pv%_2{^2g)-CRPpoY&%1WJUY$3NNKa3{rP uTSs7fU7rGf4A{cJ$WmnQ?4wZaxQae=f0--eEXf8KsyL zW>!|5*p-BIgw*3{yj+yC-di1uC XnWjV9|>_$5=PRPQ9`6 z3(iEE5_o}EvT^GTn)05p2?1I!N>SkV(y`Ke-Ht!ft2IxoQ51E{RA5f{ur!faTg}+m zi`9E`9|L-d>@fq}xn iB_kajolCvMvlWcVWGiv_uDH0N`qZ1XQj~`_DFwfY)0-v{ z;nD@0Q&UqvpI)qEba%-q)6h!bs0=me-DOiUvzoQ_W?7yaY8rDREhTlZ{S}0*IgS36 zB2y_forLJFBpP^}i33wHHX5hf)Vn6GY_EyI$Lial;}yL#uQx%!!uAW7U$#t&C=3n` zM!dcZC*$DYs84#P;T1s*wn}x4riWvE9{G57)>KNm8i7k&L_U=Uenrh)gc5nz!JMAc z4skv0Selr%lo(pjuFYSqC;T1SsMI)BGBf9JH7j`dqLZi-ZDIY~dU>ovBMPRSo|jA) zr(a?j%+I@gxS%r|^ferd6n2prOP!0m{lV=7^p5_Ib;lz`5ve5V*fZjQ;bByh@8wgX zd3({4n$|~7fr;mn+G)Vy0hi;vqP@N=rvI+2ti`B0nc2ejt??lK6aRcW yg^&KQTh76bY=%$(U71Ayfk*)h0NuEcj(eQ(@4?5;FwGJmVfMv1Bm~b#` z;Q#0y!UX#LD y$aM3y;~wfU4B8c6xIApt(B5C z=A8?7IpxjSgr&@z=<94Y%>tN|YDJym$fgL|F>ouK=jb}c&$oB8?p+#R@*^nRn=>y- z!&U)Z`(Tr=P2;ziUCsAzla4~M@7}d0$=L(Ken~tr2mqDij&)_384rs)U2FH0ORDOr zLAZ!m3jbPPGG>X_2Q-Ey6>1~JlH`fW@M5Hdx@gG3d&4tcX0Vb=VChubK;#mid(-N7 zD(?(3=JTLM6(7Lke+kSk|8@l6Z c DgZV(89vlwbnQesS=H|_fOm@s>> zUXRQ5$u3)%d<5PLj{{1Ov4K^F#DGcABmEo|SX#ws@q1PUiuxi#|6|x#0jq*5<&G!c zRj|Cp6*Dy4r#`0e98>MzG-t>6nG#$gx U=T$`o$&mdnA{%kUZGMd~U=*(tSiHfaW7s zFwreg&`{alP{j`=6c%aX#}u`_iC%E!u3!bJj(978A@Yp=0RhatQ`_?*oG)7gh;NOH z_#oZ|eAXh#S^R?!)-T#_@(u3FF}*HQe`z0Llo2_W>QUEeV}Ei_BhAX6M^Bxl%oVSH z ;hSJ?KSE8cx znlW7Qm?mYuGm@6McfCI6i$;}Cv?ngRJx&S7R6w{xTequ6%^kLeef`i|%<63K;!ClA zS-c8vDy%6Vh9J|CZ|pHt3guAR_zOiIyd_n5_R(-PgH@V}Lcx#6&lHIO>TA^S?QJmi z yREsM<_42{&82McH+
jVv*{7DoVOBR zzj_yi8Q#G9PGwGB>l-=w={T-#>>;!y(1p8Hj5$>&AR+UCrFI>8JzSXQgeC$jy2ET# zMHyqdc`VHnh(pC }z#ox+RrHh3|LEJYZLfO09pMLR!LF%V`$;T%*O{Tik8=p#066qRRk`s)N9T zPPol=Ju0Lx8)=n9TL=B}vfFE4NilKXVToUZ-|BvfgJh5eH(k *NmLJZJo_df_yW~5@D >d~ciDNTpE%(Vd75k7Pm0Q;3AOS!xnZptzJ?OwM)^oX zt)+UXNv1p%X!zd?Oa1o}_SdPZOq%^?MT)?v;Kd_|37+M?67uUV1t5$6$Nbel|CRqu z9 bl OB)p~1D7+n+Ex@UvhTop+$Zu;4wk#AzIO&%NuxiUG zPzXIK;%iHPo>xOtr;5J_^dte={gacxd%oKlcSS_>)YUk6x Ou(^&!st51qhqURti<*5iqx82w@Vw2%iQZpCl# {^5Bw5nt?^UwcwU_TO)lbOkvB6O9dQTof5FE^ZN z4lo#<$&Y*UDN7p&)3Q!lIL^N%slIZTXGcO*Mo0-JNs~+PaJW?I>8n7z{HojX;IV4< zc|H#@86cdO8~f#F7C}*4TYIv0x#q5fgwf3@l;WMt_*(P>) ybCCpNJ%?itA6*jrs;Y}o z_mkTOGg|=$#cl_c5`AlGUuhcY-FQz-4AH2$>*~Y9qp9?DR`nWs66;V-^QF@0+gh%p zmq3eZDiBUFH4lgH{5D;p=1^P%H>Wh&M5rB++iXlIvEji|S5Xb(Yp)K(MFno}E4(J2 z@)2ARW8L=d8Bof-75IdzmOH?i+b|}k0@zAP4Zk1AP5Un;!YV*j+Un5`<>Yc^1!-cY zg{5_ai;rwzqVl$dHiv>aj(bK#uf5{7E~|R0#KQ9>@Gm~@y{HB%kl%=>LM}z;u Dm;PpefQoy6C9t4{e08(hiUo2 zZj*DrS|cA|0At(c@#DN}bq_4VJHJl6@ME`D!T|$E7%-cW|I}Qg;_1iF?A_=U)=hji z8m}mv|4sUj$t6E4#>5>92|RlGlN#XD>mO8lK}H1aWB`R!aQPkE1E4lV$6oRG^h6wi z!`L?C;^HDKn+2WC1{6aQzJ*4r_pv;xWvo3QMPpMG#LgQYrPr@f0f9o%=S!<&o$l(q zy$wxP?<5KuWbygZzy#IOsO^gGHqvhCtzD=xz6u%;k`Pz{@+`K;^S`|+@A&dXBc9ua znu;ncTSmxTZJ@o7N6H2F!0i{>g#5@aoNG&!=_Qc{-Yq7E+O?kbrD98_%_xDT@+`a^ zF^G~opiMxdZpQ?`k*zY-{vgnM4$+m!$VlK8(H?Ak 8Of3jVJ?yvWbV)BjepF#G~{zH|R%bxqKv&B&sO4N9}6I=8utu6~Me`9Xj> z)Jtrz(-w$Wo$e@sKm#8CeL1CNyy~7$Ug4}ZX|xLAh5H*R*F;T3R9dd1LsxKbmsnE` z8C@j>%SFc9geI<7Q-ksrLVjG}ew3JhJqmNz4@)_!t_3~v@bq0R&v6(zHD}@W&-dZC z#K*Eo)hHn4AwNbAHeX!_tCIs^;vD{qt%hm9WH$W^$W8nTlfwC*>0{s<>CdbvfS9r4 z|8*F7_GxX+#Yr+HC8cAv>tV>RSKd>6qWtUJ^8c!D{&Na4{SxS3Pk--^S88i(ZDvt? zQ4 49okM;No^ToHr^*j0TO@Xj&1SDdDhpc;vP%V+gM8T(^8wd%0cn9KqS)cx55d(h(m#NSRB zx6;+xX*4uiTeLVz@rQ@-C_yf#R$haFP`?$-B%`7L1#Knv04Lo|dt2)UY;wnilBXx& zxGbx;nBcPi67*7bibetG9TBfyy;8)`crzxvd2(yWuXngPvasZIjjZW9Q^SQa35|JS zd}juEy?tkhkyXoPALzG(_v<0@L4hLs2L}>Kwd_3IqVj6pDYQ2vns4$J?^?Z2NF?iT zDDr|(9M(=StgGN*0i|!yd>Sol9OBAKOG%D)Wf5zx{Ndei^3Dxd0%meoS66jSjULWi zi3s@6HWO9q87Z~fwxXQOwE7$h=#WG2u+3tET7C^GdhOUghJiT_D<62Y9ez0k%Ny{k z(^sBjVB9t^m!BoW}Z!{2`i6vfsxv8Y$fT5+O%`Yy#y)pINl!1AK z(#M)T&j(nB42d R>ZniZrwSfuUrv4Po@4U1P`r%{~ zYi7qs3hXU+TYsysl&_2(k6KvJ3*sNYH;*Wj>oNAT`oW~X#ts7EqGHL-RKFxYDnd3$ zab_poPj(nixYl|vZ1Kr4BCD0buy|-=_(8dGn9Axns=8(enZF<$Pk>(ELf;w0*4hp2 zbiu9whO9dV=(4V=UNkoRjvOg<`Cb94CZhois=s+2-_sMJTQj#)9Yfq Swd1pZ|lv^Lv8+)jo!Q<20HgGBV5uo6R-8n!@+)F~qXT8R2lM zS;phz0C@O`G=IwKqWr+*C`L9mc@CJ34g1DyuwhLLrcn=e^oFRP$<(~&-%F_3MQO&= z1L~W~nU1$y8uSj4$0an~iMX<6BXWm!$pOeFVIf{lZm?!Xg@Ac!#ohI-E$wjt@;Oo3 zFIQK@-WCKrNZZ!=w-ed%- 4=`r#x#n)A#K(3Z;$hYxTnhipi=C6 CtfRt&NDmFDtG31h#iO)aqT2nmpvP zohr-8P88Xx=UDMy{>=^zJrX`bh>L2y+)Msla0pjaRE!>sV@{8bd?)MIfmA#HNmHr& zH{b6io4+Ftp{D?CuyX0ZB4lxguui-z??RVTzL${Dra7$s_Rx_mtyftb1MS>gN5lm9 zK{!^UQVC~bATMr3(I)t{EH6eG)`@1wRbr)AX92|k5vAqt-`_4poxfalRa8{;VMeH& znAi=UA1#gcQpKSa%ocOPYQA&6Ln)EdgI{3N%4uSn(c`IPqZDS)4=Iqfu+)q-_3gF3 zD610i`iLFP{$}AorlV+xR*b^Y-ZzBZFrZ^gEq)f_`w@RzilTv16lJu;@AW*u)AXo; zsEB*C_x`SP8P)X0j)tg~zNKqhe1#zzNP-^pc0MT)>QSjhE0 FfdymnN z7mVd(J{TMk%*9{Rxo~h<%e+u!{HF0I&m^;sRf=M|g65@)B%*WPBQSYHBtpRZijdP- zspRWe-2iUIIPC5&LZ@j<8&5i- J>bj;`_Pp^JS4+W7TE&G5NQuk%|*2Y(xu zy~3226-z;|=-^DD$)eArN1{8~`b d*VQ?Da#etf~OQaLw}VPb90 n6nQUkNMw>S6glWY6uD4T8b8aXs) sdcKEG(?rV>WpXps{AXO!liEfsrgP(aREpj?)gGnVAWH zCc$abW1=U~a&&`4BCU%$14iRyc!~lrm6W_`tYk>8-!(FVnv$lQg)Hga%Y zIi@T1B1m;8o^ijk^TEpMDp|mR1zmTynCn;L7O02HfZ{KrJnB!a(jM{A)(yL*e~RdT z$)&GeYg*eg@#gTMOo+Q!$`L?`Z2vT_U#|xs-#jxbD;4q3+VJz2H(e<-b@Wagw(J3O zOqticrc3}uE%v?uOp{S4$>(Sjl6Z|vnS(CZ3V**EMm7RSh2GT2yL5G_6*{CNB?xUz z3>TM^t_MHwYv87{{l%d0c&_@C+bV9@?L!r#k8FAJU4gcoEFk(mhdX>m$8GN#0PrG9 zj6{b~PE4^IKQQYt4S52)2=6-r?&be(SK KSu2aa*_s-ASlH7e6zm8@gytr z(}VH14Ce8 {T+XdRfaL>yNy`Pf$=&%i*m1;>U9=LqeA~I~_GtGh$@u0(Q#CRS zfRmZ6-{-#mwGnAQdGUwGedyLS&e-C&rgv1q*C&*gkY@gy`=xe6n$2T&)4X05+- A*XG{TF2BuipAe*Bcsc)?tey?^D08WLr1NUl{h2$}Blc+P_hXQ2Ww!5bbcma$M!) zdCbL4@C8NOPGRT7tG(C%aQJVZ{e0SPm?5Zh-MR%kA@XLL65z};+uPd&bM01af1$rW zuJmLyrtsORKsiB&RS9Zt^|iR(&MwMBCvJD6v9GttU8~#?JqLd5pEs4}HrvhAu&{&P z7)&mih$ZOd1PP{ipx+y->t|XMu@e%}#@+(fc+#ZYj%R6bd9hbBTd&TsLGvT^Y}#2= z?5DVq2#9u>9W8mL0&cKJf4n$9*O}kx-r3|oZ|Pi86hh3w@oT>{P?*s-SZ;IQXx=eU z5!G!aAKS4tlxt2;{vhi*(O@r99pp9}_sLzOO~61IKaVKXVXZGWE>Be?ty`Fw2U!F0 z1eb|!R {iEINBbayC$mTaicV7?rY&cViy#phCm~)Yx48%SW~Qv zG9hxi_G@f}8!-kKkT p>}z$P8DDTWhI9<$_R$OK!_v2Y1^lZbN5 zGHRPab{FkRYsnS5&8Ci&A5gJ294zEU4&4C{X#QT%#=9n~vZ$KhkuFwJ= Z^Z`x`PU;Wb#SZiG*(D*p+Ktac~m!OVr%W}|AXGTUbh{p+98f+Kb{1+8f0 zTQsPG-EH-jdy7kj&hnyhyUSw}QG*TO0FA6-<6wlbf}W| z0zp`so{(PH{bX)XC=2`-$l@iuZX0c%Php`rl7X %rnE zllB~cKbPBhjBrI2zG#;`Ukq|d$$3rPW}yzX4lNG);0c>M6nEdm9Y;AQQ7?1 Hq*YD$eZ 3>(#3}5f@{zy2 z*z>Cu(VOL#%ndrzM_-vxZWaT}Q+`MoeyPtz1K2+x|AKcJ{R1JNOdlukV^*h`@R6rZ zq5`R(k61Naa^p|=P`yKZj&;K6OgEyoi3g%}r+V?y^7k568}npdSynW?l-ucdo78lo zuW`Sm^pgo4MOolE$ yw8bnDcpZ^t+Apd`-My#zWWER{!~DF)3nvMA_n8jl &okQ{gfGXEpjH7PKW=b#Yr^n^- z@_GE;&n%7<&>#O#PEFFElo+D!55N41!+)qr{tnNwL_^qESSV$DEJp7FBdZ8MKmVx9 zQvZJqs(8dYLk!@gLnjYQW`Ksm6}JcIth+!qWU-tDw5V u z9^n#F-i6+1kE+ONeD+|0m5ogh>CNKbn3N3;V-4m|;Pa~TwnFxO1l hQx) z64ReWqQp8x1E0AtkHUn~tr42H4i((@W{U|T$LYV?y~3VvAFf38mc_227h*52>t=M@ zq2W5F_4Y7c{(geKT);H|43&NXis{=^sK#mjC6M3HKMU3@+JJ4-H8ixa2eu+Zeq`db z+#+#mW7wq0`We?>^qUSek33OhheUv+--NGeizMAxxEzt{%;L#uEJv zXUHgXHCeZ?TGmyClnhf{A!1z9^L}@I9-6iRnX11{)@amr!NSCT25WXjH1tYkl|&ML zv-LdQ7X8LRrlHOPz_lCxc*Q+G<*X0L(PH>*FG}8GVf7@d8Md)Kb|yKe2mDSlLD|3a z1G};pf}mgjY$w%mII v1HI*&1UoFove7 z>X*oY6*niF$)kM3tDyDpYA<{~O6)Zfm238nKch>?NUgrB00eHV6XJba z8t0wFUZ<>RR0H&J95t+&aBHA}fP@>bYvaWvgcR#vblrsGFb>hI4G+m_;q(ZCh%>Iy z&3bdi!YL5j0N*)xKgi1fqi9=Yz+2xs9^Yt-;N?s)`HV J~n53=yRDE!GXjr_i5xcG1LuDf?9=xLn6#2E{>(N 0a0v2=Awf|@?Rm$;#900_APF^+} zxEJ;&CMG3gy%9ix;X;>t4dyG^JuKAmuR>o2RVF6qIXXHjS oKxer|-*UJ1u7 zDkNNF`VsJ}s)NrAp=26>%O2FM@08`43FHL^q6njn$ti2*OMsxRyQd7gC;4|7K2Fa5 z3)Eow7QqPyA*+0-&{mDpi|{Ebo&aD2SF##wd7OJJE2ya><%++*zceK!<&BV(l675f zY*Lb~0$=~#p7pVnQOYLfBsFAw-ezEOj3(an05thG6@}$zMUhTPcyp08k;aR|R?QzV zb#ERDI7aYdAIfCSdinzC9bp&iRUjEso)VgrD-FiRjR1DyKTgU5$SYI?sJUOf;#j2g zHZqgyHXl0e>gH&B+~B?!=P&^ji%R(1nxShGw>h(l3$B~J4tmRITBIixuoD8irJuDj z)~T%0AlclcwU}i9cl2M@4#is{kr|v&Yd`L6-|jnp&TVepU++Mam$)XBLt=OI#(hNJ z*P#p~uHr{3fICpi4{{6syL2sTtseeP9dNu7)cM5{^>_zMZc9;^U%kUI7LH#o+Gq%i zoNT|4-OI<^1}IyoUEP8^r_&};Uhn$ExtAxalT3AL*icMtR@j5ZE?f3bcLpg2w$RT2 zP2+J3zo}M-gg0?Z;gBMTcO;aG_nI81*!csnZCT5E4a}pFG !Uw&X%oRc?}f~^xldTe$=%Pi7c!g|fY?T5~t z_MuqADG@zy(67ONcwg(PVhEF)G|{^)@5FI+)T4Fq6OnV0z_uF?5>Kd==CdI41%x!W z>zPeKuUSy5HK(rJ83?g6xx=(JL6A6M=)F~S9&`-&${uuNl^Tx_Zww^pTt#&~=mI3( z)#1$(5^5pJ%*DH#9m7eBhAPYNqmxF@{Tf_DD+U5p{0DqyU?whFvj59WEb$*r+%08Y z-v 8D&dZY6U?X zvMcuhv+9r4?x<=w1SIN0wfEkO^pN%RTv!U@-cftmPi}@oLBJ@F`rA7V91rnJV5Xg* zXb9VSgPR4Yy7ljcgiGY|Pa)C1^PUEK@SZnH Rd5#!3QZ56RP zR{T!1o@G{LnlZ4$AL^1>i5x1iKosP8+8>x2$dQB=q}MLmi>@Rwa0v;mq$TD3+-T=Y zX_Y~jP}(1Dr;zz_0V!+5Ew4PLOZ0K`k0B!O$Xo@&EM5;VQBhG{XM?*=!GVFY8(43( z5x_eh257wSNIm2GNa2+Hp1#5{w^7=H-BEZaed-8GJMm>iM8u$K>Kjr743Q`9zJwN? zzqi5u#QWx&wsWsOGZq=~&Z^#n1o&MJ|H|(I vp{t?KIY|D!(T5XOL-Xv!wA3aD6XlCpWyPm`Y~0*V zOI_+5SR=NOOZOyK8uKKhQmbu#F=$Ff_LK~Lk-C~3$K?P;gRc?f`{ZTCfQ{NU)eFO} zUsGZSQw3;IYio_0S-#iAe*5_FKbW K(0!jpIfC$JUCDH{{KtMX7 zXC=~25Tr;6agl(6NnDkpAVowZ5Rl%JT~N> )28YsX@rkSwa;@x7e^VE );nBTM z@?-$)tX1sO{I~@5^60IQFxZzuVn^GEHDHs4#*R>?POwFF719V;ivTL6`eS>UX6j&g zA?4k>cb}}>9^Sc}b>r5>KV#9dKF_L0?*F>KiZo)iuy!#yc<6E-an+?pRK`XxekkhF zQy6M(AVMSl>yUlB?>2bF;6Z|z9>TKnhMx~1%gefFp7WrgRH)&?4>avkmkAi>`%{C+ zwe6}pfVRa-5BvaOWdu8O#kB!r3@)M8l)FZOY+UtBd=6ZKfcEImojWS}?k9wq3pA~8 zj=2zD6Cr_Tz8UY$K+2f}#AO9G0s*g(H`Z7iY}$NrdC_O0e=dqe+X`=Yjlg OeS5BJPyG}AwwwGT{2j)`V6l>5pt)z3j2x{KRXc(neZJO) zQ1DjYF?zjWe&z)ie66XB=XFau2~%LFcWNT|dO^$z4XAJ6JK^qh;Gj9L+_WlU9w1k8 zJ8S{L4t%x1_p#4QYc*q(*Fd(Bnsk2G?NmY}R)0+&&z#B`209V(#ftIK yrPR4&`%b|= zOIPPZpwKfvy-R)+Tg9fGc?U$LP@joY=(Yp6Vk-dNOBqV=<@>xuq6`h@qk7e+hJl?k zaq=R2u!B-w _#wyGW4*;v17J-!s)A4o@x0|j3o-BJ UVZs?+xRt=Q%E|`Bgadlu5G38E z`G(`gSpE4p760m@q lPBt92#;*g*n;MM2v-WD0{r1t#TM!x1;HRTiO7-po z;%R-Ua uyOrgpOWLFmz26B@daYgx-liT5+CdLppQGfGyU zI^R};T-GBzbh{3sI)~Lq!u`s0<5UBNwF 4MVt^6B<#{XTpSfRQV2?( xW}4O=WhB?t?x{FRava3TX}x*3?_i|)sw6EZJJ(ZaW5ayR|_Ck6qb zkF~2I`xDRxp-V290E)bS2@hy#mHuWuKmZAE3r!+#)RRR`1Gu{$G+C14v6bRId4>aD zCMPF(roS6)RiU%m+VhYd4mzM4DsF6k5*C&IF`yt@E|WZYP;gM_ PgQV1Ew z#a&~~$T!7w>|(-+LT+{N1C8<#B8Gw+U9fsUUNmvkp+RU0Zs;~R2M`fU5BAr=p{paq zB_(ou{u5B6aQ~4@N6S@MyxkMuctTe$%r)A6&knY-=VvDyTB2GR{9%1NYh)SSCSQ*) zks^>^!yFokHu;aEr88$cY`sQwgl-WE|BBg9DbOKzLMt`=dd;O3bUA*XPds(@>rp5@ zpa8Q`@mHhPsj}VI0V?tl MOMR~VcKCx ze4JHtG#Pk A)F>cPx?@uASW~b*%5!ifTTzVz1rUAoR3E`C&?V^thy-nGWK$)vN$Pjt+>57Tw ziIWd87N^tjw#~lVkVK}OiqLiLyURVVw1#I!e8=Yvg|d))zeQO!34WhBbVTjnqbGms zfcoQrZM4`u+;;!}s3`Y-)AkJvJhj0j+Q3x`O7gw|3DgF0-%@0wJHA0i^mbnXR8Mbe zZ0mtk?St)D{x^W7sKE =%3L)sb3WVYN#|flAWa&;vzYdvst3-5fP5w>lr82V zT|3;sXvF5xvvG~PM$G}pxJq{a?Yv9{NsmHX60xlFS&g7P4dc1O;(yPnE3J+s_Blb| z{*4 4DX5>_Mb zq-X)H_2MJWFS&X9{s(cD4l%&`RKqLPZr^$naO3D49tOtJodMY(mZoOv(|i_AXBF9W zh=-s$2b>ymMy4|aGd;DBP1ws!+vaEuf10z--QO*bk2$;2u>~?Zp;ud1q==xER0o)U5L)FX!MK_+;2;LhQUKT13Fz)W` zl<1HW-t8gd>+74WDH7xFe{$wSRETAVbi|gE AAw)Kw=j?c9R!t5qnO`7pgwY_Mnvn$jLUeNYsI@*3p zI;A= xZj;;RLaiAzi4b}SC ZTrGfz!}xFy?)iZ@eDUJ*ng#xs 4cAOhB>;p|}*gNy9RFKQh)yOn`!U305}`uhRBMsR@k zmxBexad>t`1BP0)_?%f85=65s^;%w}pO$tX={_P$YAZ}~ABl1X`M@gTG!a1#Wo~Es zqN)u6+Q~lwI2!sI_#R@j=UZwm{4;GEA;tZu y ldk$tbiInsys#R0uZWq9!Y1} 9t zl|j*BVMU O9y_{Utcy$hR>Rn^oy*}1CRzb2=zRzh6AJ{O-f_8rb4%xXJg@p_B{aTp zZiS9k?;i{4zO>A>(%SShXyLs^cY;mq!b8Rv9O~FT%&5J9^kzD^E^jZlug{)vAWVAe zsQhJ!$=R^=z?;mcsdHarAT2Z_h)D42HTlCayDVC{-r?a|f__FT`hL#ir>a~I=q-J% zE3$<@w!Sv^l%*UdymfS2HsBs^6z3x^uyE?Cjk_VQ;^bp+BT%bpiI_U~1%*GbVVb u&~M2 dQlN?IZ`dW&Z)$ hp>F#1EFNp=M$g+eaUsLtQxVfpp z>+72Fi2_$Iuia2yUwVt;9t^sBEF4nD#Ok%WIQ6)t54mY>ti+Y7d-L!3kk(9m 7Wo5b0;rAEfDX0l>9L!N)# z`Wn9#@E0JQ*w`AznkhuUN`XPbLGTZ}L{jeV*;F{;+}cQV5!q4;X@S_}`oERByE5M{ zr FBQu7OS81DD4dsehd}8 zGHads6OWT>8^x%6q|sBtOQxM-G(+(YJ3gu$(?P9F_RhUCO-hE^*7Ls}zv4Z9bNMZ> zJ~_*;6 vHhj^cW zZwuQEytJXATu6%(^kqWvY^faIsJjelN*oXmJG7%=5!hAv)e{d>+`hUHKyGChyYDLl z&@^M!)RfVdi4e_MdGD8*OhPR+rj&g&p4jjn+0MiKUKaaV`3;@AvD!~W2@oURB&=F8 zSNz9C^ut?3H2$m5l3|53BI_mt(#XND&I?1AvlGcpiz&+1X!7PT@zweK4WDxckWyAZ z(i&Pj*_YlrGjmN s-mIWdEIh&Rs$(`w`J3fwmcvxf;T;Xum$P;; zkWe@Az*$b}9EljLbhs%74lSdiR)o`2kg1JPp=^GyWN>5g{y1NMou)VeT65>BlKm}2 zg`>p0pCNzb`eG-zY^Ou$nm~$ZE1=e_i$B}I*yg9lB=hqrNk*s+XaXp>A
Zm&RhCy~IBGK#nlSxCg#4yjc7uXFtb#wb|x$QZ`OC7-(Q;kx@Zk z(5_V{)^4o7@(?iMEFE6%ItT7Wji+UC%J5^~zJQZzi5xiE7QQaG#-MtWte!nl+JpSK z<&9e9>x}nhhBvLxM$EXVhO^UMu0c`$7SD!EH?wZ%f`3u<$?#a89J-{Q$!+0S%GDxo z$P45s*-F=UzVieOo9=EU7+t?w2^D9>(3gl}0Y3Xx#jEZ@L)SA&$o7Uw2fk>UuJp!p z*3R|?kJcSto9Pc=obp^brFeo)xz{`gHrI0JPIvN{7J#qZ_PE4p3xW|{Fpra}M0D06 z8@OepwZ!Lh)dWo%WKvG(98f_iydrrmQF3T!gKBIW7CN>Pkn2)xzzA;}m+=%gunTfD zB&O(;eNd06dy*vHj~(Ewx-v~^L;HSw@-(PT40wf^KUZo@?m>mi3t(Eiwu-s`;#=xf zvj6Ke4~lBr1zHSttT-c!LJ2km!Wp#d6zSkv=+Hg{&Fayex-2Ucu%$B%6Vs(v&Q#Ur;Wqe~ )9bf7RvtTMo~01u}EKGM+d~ (`{Y(oGm7-QAaMHT38Mf11Q9Gb5=)FR~D$2MsTB}ui1|-9iOgf**6U|QT z4Q(R{Iw;9C2Tm0~t{lp)-cAsph)ZK`swcM?2gmoPYL&D0%oPGFM#y@O93_>oH-5W* zxrMm0Svw#tPs j+q?t+Uj8Yah!gGYz;K+GVp)ap)dW8uTK*{4iq^U zs~Z`SWC1@Y(D literal 0 HcmV?d00001 diff --git a/static/image/secret.png b/static/image/secret.png new file mode 100644 index 0000000000000000000000000000000000000000..c57b0744a77489b62cc1db6a446fd2f76b848bf9 GIT binary patch literal 35693 zcmeENMO2(Ym&JkxCqQs_3EH^32X}XAT!OoV;O-FI-Q696ySuyFH2<90&T>|>;S_!9 z$yZ%<@2mdq3saC2M})_L2Ll5`l#~!r1Oo$i2Lpr1hlK!rA|+In4F*O8CMhDQ>;`_? zj_ips*ZkoV+jT8YdPowl5S=hj^j4E+?SQH(%8r3z8>fz1PG=F~Uq1kwd@y(i0s# zXPcmTbKo4l>Jeub(G6dpMCSDkB8g5^hmM@uz+$Ryn t7(xOJP9#&nbGNmNAQ}u!03sf21hE4d zG{h!>AZ>dN3lF~;>DD3hg^Ct{g?fH@Y1fPZ^AZfZ^7n5AnSRamRaO^p*T+RAB%Fkc zEKwr0VR=N&{sNkB7z 1ytQlE7m6w#MW9j|@&vLW^6N&Ikd|(BIn(qM66)Es z$@!cf?Mn!e%~B=jUyq@iek}|a4oU$Q5}by$%D|lBE8P?nC^v7oDln#z2tA43vZ}v- zw`b(}*-~Vz*Q;oupWNNu*=^U$h9HlHOCe#9s;1{k)%04N!q}h?e#`!FY(m{!OMN+S zWlS}Fj~ifomRE%%E#ZQ@(0n?VynA4@p|v(-YZmOT>N#;=u5Gao!emP9?-Qi~WE1(k ztZYE1Qz%28$^i4GA)((wXMIhph3HVhGW^W#>wW<`9lXUT DL5@!nKd(U%(Lj-`av9X?7269zU-i9xKKOnDW6kd(L@e_GD(j1yO z`+Q)ryRbjKtd0*4bGn}6sqx11|HGtv%tGa68h(4&xaeG0Nb(oI5hWFe1@oFx-?QhU z;X~oUKMt#s?UH>XA|8*xrg6;X9AWS1@XbV-u-%qbF#FBVt}7Poe!fu2-*60$EP4w} z&f0Fpxpw#^Q0RS=wh w%L4dLA?s6RY2h6hnmyZNNv;FZjaZCp7!%l*D%x~W~n-S3r_auxR2EGU=L-=A) za-HNrxpbQEqPLy@>+P~Ym!+D?bLc(6O2D3gP@y&b%`GRh7W`%ik0QM%hU4$o$fZRa zCZ0u3l mcC$j*2k-v1XQaatvNz@yevX 9@DZ#&7M%!*5;nGp_zs&t!Of-s zQZj?W917ldK~j+vtUsZZv7}q5bk*@EU-rZ{i4$<6(bVCYF2qtXkJ0Rm1+20qj;DUa z7%oGJZmxCdRl`vTQEZX}JO$$Tu>zH#%RDBK9^DFXzu|8wE1uw&2%>&|Z)Nna?e2HS zlRoc`5|2P4z{9HJWLI@sSs9&$Q3Gz6Oiq&C8K(<)4*;e3Y10d*=xOdK@+$6vqLwo1 zW9*5xV|ooUcu!@ sT!cw&=P^G$@c_v1pbh@Y3`GJtq=K0hpIS9wV_;3lMH=_c3 zEL_X5=shwRxV1Nbi&nG$hCDR(#gGiK1a^YVtouZMPI7b%`LXEw9=Q$PUM<2`Z4rCc zY`#o`XgMMx0)<#kULJXuIWg6K4EeXO8)uOAq5g&b2A=69WrH{cVcDzidr(|KjZuuK zdn(kN1yO>aJw|DF82l6DhN8Bnru)^ls3` tK*&^U%w;s0 z!FO_KcjC7QThE=#t=?FN>vCJKa0@ +)%@t;nDp0bV+pcZeE5mR zRf0lgcwsVAO~(0BH(e@Qz3pYth)Y!wQI8HwPG3NP)nTl061En~mao>asHqkTUmY2| zq-SvoU4TSGdU RG|I|60GJpsNZ%Na#mH37Gv6+v&>L7IX<1 zkNISmKcDP^{@?6E1rUb9X%z%9&>r*# pmL~kFFr7aSOn$$; zKm7Y}!hqd~w#ZtDw+FOA`N!cFuw81U7O`#dex1@kOWSy*__{;*@hHyv6?zaQ4$40o z_oo$+#2@c*luq2dtjq0V;Z*83aG5Jtx~&B|;&P5zE!*~Q-f>u%vfGR|6y)TBUXM>Y z{m)gi&;5+vG0Dm1)#}LsJ1Ypd$!kC}T4roCYeSqdA>qS{=H?WWXD+F~vPE4yI8|Vs zB1pI^-)J9GQnw$OSXd#bsi|9CFW&uEh`?KOmbSFISE!=zvl%aun(VfE^j{G2Sju*U zeKU%x(*4jlAc-F#VB~%R^P~wZXs5`+r+y?DSX}j)(t!DhBBE&t3R!BTVtN>8c9jWI zEc)ftfU^Y9DV24R1%zR|ngsZ9{Sz4rtmBaFm&<_w8W8{Retmp>eH|N )l~QL`3#9 z*=nmI$b Ev&I8g@3*Gc&|4j`yb;mnNI^+jCN@ zDkonsc3nGP@RhA>Z7+_GxjY|# Dc?Z^2b?bM$-&Iy>)Iu|N z&G`$&D)e-gI3KGZx(X9@#eb<_TX4Xw1v|lJr1sOfLc%VBeMbrnNP>Pk^4jdju#6z| z6jp_r27_P%;qqf3ApnS{MA*MxD4&HSxG^vw_DJX786Avg{}b}~CgZ|WyqdT#c+1+1 z2Ku+%D1BoWE&>n2{TB2)MwxkE@bC7}d~dXDaXKC{6|U-z#kG+H+MI&qNi<^DV-pxx zFF4;U5>x+xUS% R#p?|5@Z%cC52U3g|@KdFb`+jtC|*DmdT5ANJdQAfmu{MO7fI zujo!d$-r=luwZJeW(^(sJQyYQ3HvNMV2Fl@f?;x*Jk+WRr=oOsabQ_N{dwKa*X~N) z5SGWY#i!HB+w?l1&}Ka9eXs)QA|l|nKN=9a`em59LBS8Pgk$QO)n@=qRjaR;A^e_i zcMCb>s|$riE*)Y_lxR@zkAwXFP;@#i@$_QZ;gOL@9Q@rIeoC(UV<}}ycAf%CnQq%~ zi$Unvsa58oAH;rNu1xVH4)*smxm_osih|}5{s`tyReizub9ujFYgS5cZ%rgt^~Zlr zoZwfVE7LcJ!oOZJMX0_BQ = z2n-C2D$<_!o{BmQ8W<|rOBa6yrk|c_lJvhVl<`o%PzaHB?Ls?I*6lAI50H25nr`;T za|kz-_@hi!8x0cC?;AmYFpdlb){kfxdMwO7{cNQ%cN?k)>jd=aCNavRp_Fy6s!CO& za6f8_{^wkND1Tj 0SzUgLQ1A 4A{PYNtT&r{99n2%#R3AOej!VA}9>0Am;*7V0&UxkTW3PBGI7m zP+Na3KsI@xtnyg@GdUTy>kHKp{{&4ta}e(5^AVvyTq6ATD-n-8<#Iv(LI=eU*Kj zUjw{#j{DUGaZv%l{d+7W^dHd +WqwGnb>}i zmia*ibNU7Dwu*h|AvC+lmaughpE9x!uDMuk+9?1b%!1frx-Q9o7*3p`BAmxe=*8XX zjMtD)r-RQlCF7u=f_Swz!?)GI=i#Q`E8{=}<*ISRJFZ@074e7Px~y+@6%HD9B-Aq( z-;2X|3uBfiP8|jC_ON=AAB*3D#JA~a4{LiM3Lz2J9ng)|`z)dFhH`k;u6dJ2%h*2s zv1gKeITZA;b{jr^rPTR8=W!9$_OTwb!4xC_zDEINz6b@^$Kkh*ti{Ox@LJzl*Tu6_ z*SL0jbHJAJA=OmKAkLu4VJWI=eiPNU>ginmG5zg&32XP_%*%&YmO)2S{e`G`$Ay`M zxDM5b7PRCf;@Ka^bESJ)m2LM~yPAx*%*Rs~5%jN(O cT z?OwZzu097}9G o4Tm}S!R_`Cm +FSh@-8&lfLDZ*&Jq8HC>P(wM^o;{tl6#;< 7UJ;=%npO$UO&%!I%<1PDUe=Veb}x z7twC8lnkRA)9&`(d*q~K8Uk5xiOfOJ`y?Ob8ZVjdQH`3XCmz)V5fpRVjkuMBeiQoP zh3mrm`}L&W;m0e20Mqu0BXIfJuxD&nLLW{NSaEkB(3j4;@iELFc2nCVU;Hmxe)1vU z)|a%G2kVihvO4$Zx8!q%uD!i|;~((;5;D*>pN9^^uY<*m@nfZ+a{U*wX8)S! zOmfznQ{B@G8L?ua*` AClY$ucB1YNlpmn_aw;9Lvqs9sB{$pWqq zmwasPJiU}+*@Cy7l?`o*-Q;lsbyzI?S%XbIAsX{dj&nhAto24->zaL8d5BChr#z+2 zh1S*cuJ%d0X7$@h e`SIB>!lwPOd{83r2^`S^&7VSHQy_N1S{O6}@_J_;+8@F?W z;A_N5mA6V7KbML0XoRbLaky#D{g#YhWk*iv$Z?YaGH}{<1UB|9t9-Q=Z;$4`RF3vv z3z6!E>w=r`JH4H{Ev?ozT0NJk%$g<_OKD0<
U{oz}?OU^V0bk8`0WX$shUqx8e`bjoIsMw$l$$JDn-DiF0Nru`o8R z2hYclw7XMS7>utrD(ei+Rxh_;Vv2HjHuq%6O5UapHMZ`2{CTyNtlhbx(ZOTjNQtaD zFuj7_Yvt(NMKi04t!(XDNG_FKA0TdOcIfIZD9@3pb4J*pN7A>)bAR=8eveK+A$^ch zevrIaPRIRP_EU_i&+lIEyyIGGc&@|}cqJ%S?rnJ5`Nqm%AG%tpzq?;* bjH$ z{|5oO6rjiUesw)S@=T6ab@;ju*c1#zwFm}(K{5&=+AZjOyXgo(dZg7N@%tdrVUi4i z7Mfk~;WU^{YFs~-lbz?`xk%(LAR7?ZwAOb1C0!nJ#F5zUbQ#nSKHTs!ln9f#{w0ev zbx`+ZCz#b;d2()#v2nWAQgEx|TINYB4JXOQGNIp7!^Vf3k1|u!MBKs>h)B aEvK;_4A5Hhsq}a^7@Wcy&D5fKNcF^#WH~$@7KdHlSW>x*ti#N5 zIW0D9>Af)9D8+ Xj(#qaRze=8WJ*DfHlAHqaFO+K%HZDp z_QG3t5JNhM@# 5hg*0~x05^26a~xVZzFpIogyvF6sb#5fmH&(v5556T=!xWIRG z;&YgG-9d459SUcZIw)&(k-?V#p?8kQWFv$}S5C%coZ{DgW-g1IQWkP#X4DJ*;uxOv zB^z+Qb1~~sJ8itiZ>AvbY$x2wP`-9n_+}NcP*gXn%i-3kMqvNC@b@(%FpsZwhuqfh zQrWq!;c&1OR?_2soF3WzXh(hNr{$WO@Z@eaEujwCC}rQ;`7U&t(*Z^$+Ptj){NoOO zXQ$cda+}UXwdC`XpgAJ;Ki=DAs~esjo3%IPBk l2Lcfds$obccEW# znuI5%wFPXRpNYL8p9Rqd`_>XAI$UT|N+K3chU!+<>~|vDN~?Xidc4Sq*CoY#o>g`> zwma_btfJO(Q#{0b&Kmo=^Gm91!@>!4IOiKm)1o2SUxG|Vc^dUfo#yUz*W~1EV&{zu z#Kdf3|Ij8;O7l7- @Y&2UnfLW3(1r z@@>CaH_>5?lHjXv4A#B8R67IRH> +z-&e=jUuetxMw^BSy|!NgEFEI+XmhD<7-)J??8dE9o2GdUBWWe& PCq%oBk<3uVrW?}&L#Y2mzia;+EV^=-d4>D68E$arV(gVN~6*2Stx|5 zm11{s{Eh2i#kP%7JM8)TVwF7CsI>uT 3 z(OS)Gl)r(@nRJG%tsHxpG=8JSB=8rY&UO%T;XtYz?di2@MW}raT>o~76e(d@(yv6O z;u(ujz|&y(`zE7=W}h%@j}oUu4wkzva^1^Mhl-@-Gyta70=0=!2+?g$0|~FrZb=8L z$$Hq5%3jgonl1 TzOWo?Mi+r!gZN`tKm+U*Yk|rVxLLX#gFp5O8Q$>jjA89C3R$ z&21xKQe-CF8XkTURG2SdA{G_9J_AFZD~1L;V{RLH($qDF0qt6jj8SNNaaGyDNlicl zyR_wzQ9s7xaf0cFn_=#DaXOOVU7?U}Q)YD0*-uM&t3>Z99L^wpkY1in8&h_Zj<)bC z(1?<3QqiS$A`9r;Z9ZrjS11qb9v# jk?v(0X2k;4p=XqBrL z)>B^Y58}prG3`wo``Ho-?`PW2=z3Y$sL1y5t9Hf>`Ci)t^qZ2k qZ*b+<3Q%bS^cxm@rC$L6+!>ZR647Y_cPRf5f$<(EJwBE?xwa zlalOtQIoJg$a06CYdTbzYMoA+n84+DY2@%WJm91{uDpN44c&HsQ8KAl;(`#nGF2x( z&YtAcy)-g!=xt>mgx=D3dDE4U+amUPhBR5WGh5N$4-dJo$y>>Prfc{tB&>IOO+Wln z^N(6xWu}nhXERtecU#U$>U%&%xn;6{15idYkuq+?U;fm74a)R}g%9$ JlmmBB!J88j%%&pzx11zMhP=FRd2gjn(&z6(BIaxs;i{JF z!D$c6R>+O}G=Y$-;vWj##S!am%1bZJs7PgNEj)8L+X6u+BMd7Q?y(#mOS#DW$?TFl z=hpQXrK`?RJ?T2)qiW?X3SYvLPRcmi%kSOK)#(>bKou )yBhzcoc!}!X zi}sg7Y%Y!vHr`E4WAjYc5K1FURxyd{0t-ucAkK#Ks2`>RZYzEQ9p|mJ4XmU*a@ 5H?gGVE9<(V^kdWFd!(7GyZ*1}e^$G0)*2}+J8sV2N7X9N zd1hZEDPP K_9cEAM>Ph563TKXymoqgtNRxL+nV*#G*-2z`Wd zxUWg6a|%Kg6*8XVtk$8Y$i}5MQ&?bWXIoaTpA1Rf-|MXoBEM&PNYf3;L^(x2RykXM zrJ`KY_Zw`_&D}G(!VB~CH5m*t63)P-#+r`(&_Z$qjCMzG&dvW8<(?l87D_tnZ<7Mv z9kD?GYG-QL7*`yp7D|zhOcNr3^y>Aa4_-;u)Eh-O*>-@rYI*3IgQq{d>%nsm3AW8Z zpF$*0Tv&<5%s|SHxYz;o2k!Y-y_39>W#<+Zi@(P@lF|%|$6e)eQc{+-A+CBWDFhDP z_pduoyxb$q?dujZaTnyq3*3a>tF2=P#Eg8;xf)=!YuHPk$gLY; op10@2XpV?=kKF>sIEfVo$|gE z-~_0Ia0K#syTN2+xP)@c&nGU^?WH*u8Qz(8?Dk3+7Z<**(O&%OuZp21J!CsZqp>id z4vhd6Ry$Ptry<6swc6OYN$$1pD`c9z3w~*PBkT<(ZLpLDwU!|^cha}-rxg?P^KlNO z)9paD6G=?pgnjq?wTjM08f6^hiTGuT_4{!e^E%ffibt=5mKCiG%b1w;`Cv=mYC5l< zSP5xY1^x~hH}<9N?q|VAwn-+JMzFihi1mvRjvEZHIH}Av?hV}`8CT8larE4c`*mwA zG+C!qaTXz_rq>WcNGo#bG!m`Sd|nSBvKK;;rhB~85)Ew=5e)|q+0=5TB0@d4mHk$> z- 3-#KOHZBas5crs}A2yhYLmR{X(nojX|AG z6F)(qfN~(}CWg4WXA^xmeEeC@)*i+6jC&AaU(#0btcGwCc&^l> +{OP{h;IdERCPgR)M9m%=qWeMll{*M+QtdN99 zyDMY;o$=?*LrziXmv)8nnv8O 2iCFm@Ab+8Y4d$Eg42mlPhh|~a z7}mEr1Xj6`3C87bczPJi*4bziB}J(eVd&g1Xzsap0#htTB@xRILeF|<`dGDG^uqE? zl5BSVnr#WmjI=oLN7XjO7gQAcnH9_@AU( NJWn>)Myxa0I#@TwqY%)xz6#ROs_=8wM_bO&~l~MXi>~M)K98xCw#;# zl|p;<8ji)2;PTOfa}~8B@R()I@v2mhPgYgXT~w*`07ks`Ixr Bq>W>4CFF?%%&Cr&ffGz5h#-wpBWf?NK35KQ0FF@EBL6(;g-vF>3r6f$mz z5fvaCG2-$z8@D4-(MLP53JIqzX~VW z;uRMtEXIW|srO@8H0h~p?aE!9TYRuu$?N}C48N8&t@AfF26H*N-x#Kh=FYy0jUc>f zU!0R)XrKC&w|Cyq%30~p6Vaf2h3@Qk4d8wv(-G{qUBi56=icdLlB;g8efj6uM9FU9 z=q8Y!fpH0UtIOL)*;J|Y^G2ES*r^Vhm~tgZ)mrb!mfNQmPtw2g=6mo;J^?0G3da3W zEB>6;RxN~Fo4+_Gz^To`842(E!Mxt70}U0CXW_<;mb|c+&UsX=Q!K6QEHu>=W3d%_ z=xEjTTmTGm=*I{LwZGX?KVIr$HE~4hoi)&7&Xl{%chky!c3n-#WOyNfocFN_&a*~m z#WLu7Grq0LG{T)-;fqs_piG+-D^c>3_6a3E@R|^R7vWJ5Ybp)=$QSY}s(x04si2xR z+#}luGZUY!OAl|{wm7xQy#;U6S6NL{7c@3OLX-oU3?6mISPIWhxgc6oAGEkf*FUv7 z#8uSAuvpg18P@z3(@+{5nyR!kuA6_agBYAA`{%q<5m$ LKfdTb$W!>Q!fqa @f6!(58 zz4)5(R@oL+LDJS^trTTHq&~`i2AK?%J;HnZ#uVR;!;apfFb*EJu~|#Xabezf(fpi| z&O`A?EGKZ+WXXMP2J>S>^6!?im`fwl$FILLzXW|lSaPn_4WQD!#;36|(H2C6!glM& ze be5yZXh}T#Rz8 zy3}OrC6oFv%ZQct^n^lM$iFKzHIQ 9i$&A{Oy`CNlEH)Ns`ceMe0u+=qg5tJyYUC@bZ17l2NXnQ3>iuzex% z2bU#YQy3;C{=F)ugMiO{c7i}#zndquu)#u+kUn|*TV{nutJo3kyT{s@c*B0hn$*S~ zijG^VC{|Mj?v^}SpbjUZb7#9j@43rU^x8xQ?z{s6Ix}x0k+7HjzZFfj@eJZx%%eH0 z;Ru+j1>J{hQ|>$M0uY`D`3sPlygIDlxV1p|vo(K@;!Uk?_|3P>=Vh|wQ{?l*mkoBf z*vlH~N0DEtj4aD@P?z)#ol#9+bB-x`EVIuu-UC4p{@DoPi8B8>G=a$NJnU4f-$84? z35K)z_VA$_1hUXts=zt+_mA?*tH`mupT@6L%oM~xSRvN;?^YK+|3psNr>pJ~$lMLd zO}fvJAg$qA5*RU;x1g(l5F1`rUVkf`+#NJa?70rmy?%{&-zFdE*7Wr=wq-l1Uh1Sb zr~s{6fBC+vUyYU3Q*>S|`j$Z{TeMlciN$&4mLse_VzFS(g(EZJt+l>1B2qSy@2VRa zJaOeGz- 7YtIoPX=o9^Nyskd5#@yFW9!QA;2^ z;~Iy1zg=BusJuDRlt_EYQ-V)Th4*ymekvWE^zH6yf!o%`*%@dYB|v(5tOJ}EOs6}2 z;MuCSGrUCNc+1LZ*K=DDX0$Wcj1>Kt3pER(0_1KF0|uk3(?`f6iDtwH$$J475#$?q z_yA{CKW;wpQ6D~*?HlZ>fU5#=!kI;vmLr?J%`m9PelN)slh(KrcHY(mgy*h^Gxi|H zds&%L+Laoqi;M4_E-w}ETkWh}3gZt*DXU$Bhtu@7l!^OqWzgCI49}uUh$_=t5dhv7 z!Ybw%)8T0phT+0S{9ZWY`vdS{9K`Sf5*oSg#Zz0x&>#l5- H#O(YKxIvr2ks}8uC?Qw{!h=P(D z2)kL%I*}!JR*el!NAZN-RbH+cHyQL%ri~p6Xtz<4ZqL6*ltUdL%MiniugZ5<0E6Sr zoWN)Ezd?nJTaBH$4za7*td8fC)2GJB6Dg_;s{A2s1=+HrZ+G3|@`Uwlvut?4x68b^ zDBP$8a!N|vBvU>&pVSH4uS27{b!V1X7^fUn(^FNY`!+8>*}0oI-Pn29>)r3Rjrl26 zUihru#qQH=xNb~+2ozA1&TSgolWo0V J z+fa|(wVN#IQ4;0era)he?iw #N zpnHBn1WFLWLM$xbcU<;)Laq=jUWPRIE)&ph;q1=2l&J7;sJHol&*J} z=;&ZN5X{jka@{~r^YM6XQ#ez!I@`aHmQLDzGdx)Dtk*e?SweN4SlFBD7>Nw$^xW2z zU#ZSu{I~>XkA=xxdAc%@PsogN0ZJT5&nM0i*eX>c(Q{cfBT1>l*f{@M-Q4fAK1jQ* zduw*U-v}r6>Ya$
3$V>*5zA!~xuAe|Mh{`dfFj~rS2kK}x;y+* z(O5mapEQDi=@!H*Oc3f~DivF>euP=c(A>JrU(=~(`*H@Jb{aE!^_*aZK!<#iFaMKr zJwfBqbiajEB`uux^k6k_#l*)0;Wc22OirGKS688`=OVYP!z)5|;`NAv@j!^hXfJV% z#mYNT&pq$Ny#Cv}1;w#!c+#3xdffe)@l#Zy2gg4ZO01{()z0A>fgK=!%gI8%) Zb7x@fn=8YS&@ zR)wM3HmhsUwRFNeWz6kA$H|PMx$=X`(I$D-{mLx{+naIL Z zv$oZmjkFc{+4=bPhH%kV;tAncmLzF;vz&& A737;zS$x|#I!la_XXCp%{7U+js_pJJ&HTB{1;gJf8J)&&quj_| zo|5X>Psz6v93PGCwix?7m%SN;FYGZ41q_6Yzl=qPnGBkpo+imR5aYL=gvrSpur*}* z{Z?7o*~LVL|Cw8(`EFRuJih3(*i9}Yb}vh;(m^68_LOsNPd41PtX+;a(a0%LIUeWp zJHYUZ$8zWjr}d)iD(>jE<~Z4r)=SFEUmP8E_s>Q+jr}z$6E0!ge0#Xq~@6?YT_dRc*T+l>1({b>FUa$AagOn4mGE*cV3BzxYx&fnFp8_=8 zq6A4XybH`xL4prakj~<_`VVxFw&D^UB){NSsskxBd`UpcI8nOfFpzNK@l(%{MXf0U z5>CW`jYN=Oj)8_muONRtlNj`%H_q80`JNamg6ZeWXKx5Nu8eaS{zt*hV8)CxpYr!f zAFll-W{b%4#I6;@n*Ef3ggfU!2ALFYuk@(=+K`RKjty{O!w(D?=-!IAgN66Wvs^FD z5Xu09C*xbE51l|)?DdQWe400_S6(H*XnyV2z?^H_jW;E&*D~WrF$-@a=ntnm)rrt( z+{Mz7Sx<3?tH%qUmwAt@Kh3mHRyY;Pe8FAry_x`QzvJWM_4RfA_O$Q`C9EZpC?5w3 zE>q9_Tx4i$*mO9Ri<@48Y)i86UcNtCrY0Ebs{HKXO8U`J!TOOy7;AXRr<{d1()JUl zn~_?1Srn#Ul3`zFAx^PM*VLi>JxSWi_cl3&&NJB$0$2w5?J{+K$i7=~I-PG?y`Bfy zhZBq@_r6_&HA?T(X| $hgs5H zc$Kqby!`hG3z_*1EoAEmMe!0`S6 r-XnQ5y! nM^yRvTsLNv(CP| z%uDb_mRh_yBHK&rMpjdveljgYx1lH@9@mh2=OgF1-%Qyx;^Uwh4dB3`pCx()5;2zT z$=3ogzWc|qEBw3A;7drPN1HE8+q^(IGSV5((HS6v_jC%Uh{SgEPU=IV4*K5n?8il~ zbIf1;SQ>@B$eyN@8PBAI*$QLs8*V-A*zMxy_+ckEdb8%STBH$|>pvEaU?c|H+QTUu z_=%6Q2X5tlBnicm&s}6_(I~JZtykuQ%FGeI0XM@bqDr24w(gnfoZiP{`5Lvh7LL>M z7p=}E>+tySW~%#lb*zo!rn*taMXbYZ#QW6gt!^ auIIj(SU%-qPqup#_ r zbD0=)GXt5(-GonFi@fZ^=*_qHEm$ZUoYHd%ag_?I0!E7$$7=~|s|ar)^LJJy@8l^oR5-hlxblT?0j&`e z_RHz5&0osi*|{*!I9iClrO{Ag*bUQ0&WvNbUapEt{i#9@#%O@rFByJgtR}B?^3-C& zMVHVQfDjx))RLSs38!TB*uNYO_dFGz{-z`EWw+nULP_!Ljf60_Xu){;tJ8sSr=zgS zm2EMp1ugq)+;9rgl6bWcdKTR|&%?0Fc=Sk|A~}<`ioQV%UA`3jFJ>6{5!;l4v{&!Z zD|sZ;F1N;sAMe}tb~boe#jav%Wd@7tSonk-$Y?Fv+vChp(66$i$D(xj!4?0Y(1^fC z$CD_LJd_6@Bk9SZ09r$49g{CYbOJ*Km9Nbs+O8G8&1gM_Qkno?R>z|!>|^qV!%e=Y zxn<@gL3J5P%b%3gT@mGcM42OB+$q*67DOjw C(Q11043dN2*6@u|9x?lqkbHSFonCS(D@4D1_sTNZ z7Eg-CYS?!OaNU$`+s2reOJ$199r-3$aw8%B-^9Y0Q|S%nDOFI($=5@kQSx92f5nTa zz0+#{bcQk*KYHZH=tohTWVD#5j^Ir}_X!f_su@2b$~m|Q>I}hdeq#tk2 xzntMpeZYr z{ecQ*0>AHN1a}AYCZo&YgDCjNrvegPf)yk~?-GE5K>UVmY?d4^++}k2*MM0qodOLO z0DcSXk;OP82GOn%h<3kxH6;bnE)YcHTNJ TYpvyvY={VRb+|)R3gxT*j>3xpZ&91 z_!Mpe|C%F%s)cW$Ff{r F8epU 0YX2{kXI(o~_22*o;@4 z=Sc{ycxOkmh1c(~)Lgnou|z-a|Hx h8&k8++7lT(Uj!QWB@}4B0)F4dFqXYX}Xt zboI97w6a38+TL~=+POSuX37lf`x(so&7o{~d2sT~UPXxYdNvzoO?z|k_xCeuCrykb zohq48XUwx)=hTO9nIq$I)Tv_xI$D0+o^fgn=bzOnCq&MOtgVNz#@tVfqWsqSYw?Zo zl`R=u0joppx*Hj>)-#=s=F*0e0rfh~N-k;5Zf%V&wd8mWWsx%5U*!X^7QcEe0hPo5 z98Bvp_GI@wHM=WHJEo5+#e*o4gFt7N2riHgaIg}oT&7b!qPej=Cq1+TeR8a#r4`Bq zR-Qwe8Q)B?G9fK?;K2^NGG@e_!;!&Wm@%s!s1i%;ELpwQn0fLi4%=DD6T#Dw>*P0b z^6%OHp~f%!L?HR88w9BkYtEDwO~YN8hL%QK$<>|lc(bZnBZWfwR?93SD|+~NOl6is zpXp>nJTe9uyP7+UI~ ^KGe?7|sYtxNW41@G+V|O~89 UiL+dM={Is9xVx*nm?nKLPOVuP@?nW$I%=3{P*K?{szhduS3~s{}mT)@LYBY-4 zLn-g&{ =I0GCwk (RNFgu4$aKE;-D?^9ccGTg5S}I7R6Kp8- zCun60A~CKuL$Rup$|r0y7CRvW6&6{I6H!~s+?Z}v52@QEE7ZZ >kT1tI9Vh#etl@nJz= zABLjN8V*8G5K!aVk~Bqu5Ht{k$Re LkA5#p+zC99U#1b0D98pD#BzqXp