From 516e479187c71901b4eec41637202ba2d1a27125 Mon Sep 17 00:00:00 2001 From: jlzhou <12020042@qq.com> Date: Mon, 28 Oct 2024 08:53:14 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BF=AE=E6=94=B9docker-compose?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin-ui/src/router/index.js | 14 - admin-ui/src/views/system/oss/config.vue | 382 ------------------ admin-ui/src/views/system/oss/index.vue | 374 ----------------- .../resources/application-local.yml.template | 2 +- .../src/main/resources/application-prod.yml | 2 +- script/docker/docker-compose.yml | 17 +- script/docker/docker环境.md | 2 + script/docker/nginx/conf/nginx.conf | 19 +- .../server1/config/application-prod.yml | 44 +- script/docker/server1/config/watermark.png | Bin 0 -> 17414 bytes 10 files changed, 65 insertions(+), 791 deletions(-) delete mode 100644 admin-ui/src/views/system/oss/config.vue delete mode 100644 admin-ui/src/views/system/oss/index.vue create mode 100644 script/docker/server1/config/watermark.png diff --git a/admin-ui/src/router/index.js b/admin-ui/src/router/index.js index f00014c..4cf50bc 100644 --- a/admin-ui/src/router/index.js +++ b/admin-ui/src/router/index.js @@ -129,20 +129,6 @@ export const dynamicRoutes = [ meta: { title: '字典数据', activeMenu: '/system/dict' } } ] - }, - { - path: '/system/oss-config', - component: Layout, - hidden: true, - permissions: ['monitor:job:list'], - children: [ - { - path: 'index', - component: () => import('@/views/system/oss/config'), - name: 'OssConfig', - meta: { title: '配置管理', activeMenu: '/system/oss'} - } - ] } ] diff --git a/admin-ui/src/views/system/oss/config.vue b/admin-ui/src/views/system/oss/config.vue deleted file mode 100644 index 4f2efa1..0000000 --- a/admin-ui/src/views/system/oss/config.vue +++ /dev/null @@ -1,382 +0,0 @@ - - - diff --git a/admin-ui/src/views/system/oss/index.vue b/admin-ui/src/views/system/oss/index.vue deleted file mode 100644 index 27e0632..0000000 --- a/admin-ui/src/views/system/oss/index.vue +++ /dev/null @@ -1,374 +0,0 @@ - - - diff --git a/ruoyi-admin/src/main/resources/application-local.yml.template b/ruoyi-admin/src/main/resources/application-local.yml.template index 34bb80b..01962e2 100644 --- a/ruoyi-admin/src/main/resources/application-local.yml.template +++ b/ruoyi-admin/src/main/resources/application-local.yml.template @@ -25,7 +25,7 @@ ruoyi: enable-storage: true # 启用存储 access-key: ${ruoyi.name} secret-key: ${ruoyi.name}1415926 - end-point: http://192.168.3.222:9000 + end-point: http://192.168.3.222:9000/files bucket-name: files domain: "/files/" # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/ base-path: "" # 基础路径 diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index a40cc6e..36546c6 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -11,7 +11,7 @@ ruoyi: max-height: 1500 th-width: 200 th-height: 200 - watermark: classpath:/watermark.png + watermark: /server/config/watermark.png default-platform: minio #默认使用的存储平台 local-plus: - platform: local # 存储平台标识 diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml index a1a5ff8..9ce10a2 100644 --- a/script/docker/docker-compose.yml +++ b/script/docker/docker-compose.yml @@ -125,11 +125,11 @@ services: container_name: server1 restart: always image: registry.cn-hangzhou.aliyuncs.com/awl/base2024-api:0.1 - links: - - db - - redis - - minio - - mongodb + # links: + # - db + # - redis + # - minio + # - mongodb ports: - "28080:8080" volumes: @@ -150,6 +150,7 @@ services: TZ: Asia/Shanghai ports: - "80:80" + # - "443:443" volumes: # 证书映射 @@ -160,9 +161,9 @@ services: - ./nginx/html/:/usr/share/nginx/html/ # 日志目录 - ./nginx/log/:/var/log/nginx/ - links: - - server1 - - minio + # links: + # - server1 + # - minio privileged: true # network_mode: host networks: diff --git a/script/docker/docker环境.md b/script/docker/docker环境.md index 7e6b3c9..ea4fe3e 100644 --- a/script/docker/docker环境.md +++ b/script/docker/docker环境.md @@ -2,6 +2,8 @@ ## 1. 安装与配置 +宿主主机:`host.docker.internal` + ### 1.1. 官方自动化安装脚本 - Debian diff --git a/script/docker/nginx/conf/nginx.conf b/script/docker/nginx/conf/nginx.conf index 1ab66c5..7445abb 100644 --- a/script/docker/nginx/conf/nginx.conf +++ b/script/docker/nginx/conf/nginx.conf @@ -33,6 +33,15 @@ http { } + upstream monitor-admin { + server 127.0.0.1:9090; + } + + upstream xxljob-admin { + server 127.0.0.1:9100; + } + + server { listen 80; server_name localhost; @@ -60,7 +69,10 @@ http { # return 200 '{"msg":"演示模式,不允许操作","code":500}'; # } - + # 限制外网访问内网 actuator 相关路径 + location ~ ^(/[^/]*)?/actuator(/.*)?$ { + return 403; + } location / { root /usr/share/nginx/html; @@ -73,7 +85,6 @@ http { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; @@ -84,12 +95,12 @@ http { proxy_pass http://server/; } + # 反向代理minio,需要创建一个files的存储桶 location /files/ { - proxy_set_header Host $http_host; + proxy_set_header Host minio:9000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header REMOTE-HOST $remote_addr; add_header X-Cache $upstream_cache_status; #Set Nginx Cache set $static_fileLNaRCRJo 0; diff --git a/script/docker/server1/config/application-prod.yml b/script/docker/server1/config/application-prod.yml index d91f048..36546c6 100644 --- a/script/docker/server1/config/application-prod.yml +++ b/script/docker/server1/config/application-prod.yml @@ -1,14 +1,44 @@ # 项目相关配置 ruoyi: # 是否是开发模式 - dev: true + dev: false - # 本地文件存储配置 - upload: - # 资源访问前缀 - pre: /false - # 物理保存地址 - save-path: /server/upload + + + # 文件存储配置 + file: + max-width: 1500 + max-height: 1500 + th-width: 200 + th-height: 200 + watermark: /server/config/watermark.png + default-platform: minio #默认使用的存储平台 + local-plus: + - platform: local # 存储平台标识 + enable-storage: true #启用存储 + enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高) + path-patterns: /upload/** # 访问路径 + storage-path: /server/upload/ # 存储路径 + domain: "/upload/" # 访问域名,例如:“http://127.0.0.1:8030/file/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名 + base-path: "" # 基础路径 + minio: + - platform: minio + enable-storage: true # 启用存储 + access-key: ${ruoyi.name} + secret-key: ${ruoyi.name}1415926 + end-point: http://minio:9000 + bucket-name: files + domain: "/files/" # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/ + base-path: "" # 基础路径 + aliyun-oss: + - platform: aliyun # 存储平台标识 + enable-storage: true # 启用存储 + access-key: XXXXXXXXXXXXXXXXXXXXXX + secret-key: XXXXXXXXXXXXXXXXXXXXXXXXXXXX + end-point: https://oss-cn-shenzhen.aliyuncs.com + bucket-name: base2024 + domain: "https://base2024.oss-cn-shenzhen.aliyuncs.com/" # 访问域名,注意“/”结尾,例如:https://abc.oss-cn-shanghai.aliyuncs.com/ + base-path: "" # 基础路径 --- # 临时文件存储位置 避免临时文件被系统清理报错 diff --git a/script/docker/server1/config/watermark.png b/script/docker/server1/config/watermark.png new file mode 100644 index 0000000000000000000000000000000000000000..aec18b587940437a0f7e06523ee989484782d55e GIT binary patch literal 17414 zcmcedb8M!;yZ38rYuh%T+V0loQ`>%O+grC=Z*AM|)^@kHxo3ZG^8RuDJIP7Tl}skN z#&hSMOupA=qEwWmkrD6_z`($eWo0B(!N9;1|C8V#|9M(XM!x=Kkgj5~>Tqyy8+*#T z|H{}^6x1dE{y%$ve}8>_eSUs^e0;pWzrVe`y}rJ_yu3U=KR-P^Jw84@IyyQyIN00U z+u7OK+S=OK*jQUzTUl9IT3T9ISor<>_w4NK)YR1Y`1t7P=i_8DPDE0OAwY9a?)zy`il@%2gWo2b0B_%~gMTLch`T6;| zxw)B{nQ3WhDJdyQNl6I_32||8F)=YwQBe^Q5n*9rAt50_K|vr8$j{Hu$H&LZ%ge*V z!_Cd@-{eJ1{A&MgriGiTk{Z~z|B;dZ@2t6jTH)V_@J=#1u3%t@=>JLJ^IM>ge@;R- zNo_YZM+-Mk6BlzZQJ|x#IjNMji@B$xi>)iExEl9KS3~T-df5M|C+=cy;%4pWK&ozS zZw|)F$HLCV!p>n2WM2aVBL$O{5LNfexioJ5B~2qpa-M) zUfJTi<0uAR_<4YFSzjYOuQ=Ft{d^aHkdXf|oB#Ykw8hW;6gMci&~)`q)P3-B5mNgo zy$odY@Fzo>j9c~ZE%GGH`dVb2&U{>K<+xIC6>Dj|ei!Usm_x~L^KH3?%1K@Fh zeMYe7e)hZSG?xKS2UBrmh}xtPB3Xl#7=!4GKqCz|gg-Payv~$FM(1)<8AYZI+N61) zX*u}G>k}9b?q!(@dryp^7#3)XIsOs@UuLDDS{deEL6T;k$#hAs`~0Zw>x{TX*413 zl(KN3PfUJNuci8h;gLLJ^V!!I=Qc*zUx0r#v)G*#w|fe9O!Z`Pu?+FJXJ@N3;&~^4 z9e<&Fz66wVsQ*KUNaVB;dllWveCPSyccs9;g5)x5K_}>aki;WulTMZfsOsF%cJ29s zA}aoQyLA$|CSeti5oq7kU?Ve}A9jO6CKH7HDt}De$^R1tUx*a-!DCQ zMN10By!D8NTYvo?*F!NUlzR%BFj{JkG0}nDVISIQtfJM-+izMZ4>1h~vZDsXm|3al z^zr@cXZQyIsaU4qP%(W(E}=`xYCVN$w&@rv98EBF4B8t`Fj7Q@7{P+&d{k2b1{ z+bZkP>jDN3Ivq}{NKb<^M;Wv_3L>KnilU#Yhm^1edwvMtae?y&;ALCMEs0?pA|z#a z-j+c5Fhh+%;>jj;K=J2qJl}$LKvr*dav!8Jp&BvJ!Yc5R`$iKe7NJs!_r<~32ejS= zO4TdS9U-T>GQ%rE7t8%alc&1bURyRHm|iZTSf%v%e|3$OZ1%Dau1;L*S5?HN&L`1L zh7d_>Nzr|byrQ`lO@KR}o&I{ar}=rGzWdY~!WT%wqrw7KJZ&J4SZ?eNO7{qB1~Q(R z>noz(t(W_JSeqa<3(&vp>rf|5* z)I%{Um>h)|Yba46hoAGgzC(PD;;l19^~R;Tq~9ijTkFTDRFH_lZL0$NJC{ooaO_G@p6Nl_M8{o(g-P=zO|^u%@{== zqc7egOQl|hi=&|nX8cP3CjCAmJg^Za{MSw!PgiyTNZ&}-)fqPWogC0Z9w?%ze$d7;?L`9J#{8b4EHnw1?ZXUS*sW2Nlc{q^m7H5_TLzC}?){1^ z-Y=gBRm+bonucZ3>PBFJw#U)vV9B{BH7XMhw-m!2IJYNRWH(%b$&SXl1mp76hY8VR z$r)PjT~NMB7xlHf;On0c=}<0=Xk0@T_z5r+8w@KW>wb=hc`6|=ZtEGFqYUXl?P{)pTCjU{9o7GIw^Zo@r3442gm3sn$NBt=B0mjz0Z z!fY=T493gXgU!FkoDb?i{Tse+!wpUN4?_KpNlH(XHTVR<+d?FKt3V(6hj+0#YFIn; zaq0)|2>H|dYSL)yC=F^_lo7;DmO~dz^ZoBec{(LDGc_sr>?)TOEWs>INhWDOV(*f7 z_k*a&dOpDAhdq1Xi_dA6bJDj<2-b=v36P<~A6=>H;%Pk(pI&50GBNUfPS)*HBNE3_ zQ8c1g0aVQAVG`V-XtLoI?qlp$>EgdNMbji4Vs=0^1Ztyk-mn>%Z*->U_l)w!csU*y zcFB>-?8^F(?zHjTnX9T0?L>7{$5u^^KNcFo1M3+M>zjwQyc3uqg(H;;7>0@4s~QEx z@EnKS>zybBl?nBt0}r_8IPK;CntX6t1vT1oM}oCs8Xy&}wj=3t?Qf9iw=~-&h;6$* z$jF&Er_C`0Z4$1(cYKZY{o>W>*E6C(y*+}Rz+1j=K)>tg<3CsQ1?ozP(-pmNMDTy_ z(&dRLJ*A*vtsY-2p=q3V0F1z5 zcIztm3R^xohmU~^j$=l zceC+z_XgU;Lnp|%WcdeC)*rKbr+V9o(ZClZ+$>=8C`CY~=#-@;=ev=R55NK|L)7bJ z9$l9zkzj9jy?+eR4xO5Y@KLl=wD9lSt(S?U(go#feTX?~r2jHy4@*(Icr{(i8DX{2 zT@tsqsgmhBq*;UYVY`p4D8%Dy|3Hm((4)HcagQizmXOdB!+yhnywL1j~#D$6s z+41&nqhswAy@M}jh66&Lg_w34`j}$DrxeL0AaAApg*e7csKRt@$@}(K5(gQ`&(}Xi?1p=>8l>bh{8I6uGlkzrM(%0SDhW9H8z#{W z{TiCvyi{p-K_U~ySTKhrDix-HcUQxmIf@~!ok`HAqyN&7NcVYd^UHyvfWU%X{e z-3ZSJO8#44CpX3~u=DCZd1ieI^|$`2Fj1@=xW}04oZz@^AgF(n*@`(^8j|Hb)giN~n_{ zH221KGszjAC(2Z4W!YB}UdoOwI)(6>@#~RuQva=kbB%#i$%|5$J2(A!RH7K>*;^H+ zJU-+-TF;wjYQ5=AN9(T#k>SVTD6W1{4}+!$gNR2X|`! zCST5Bjuvk6Ece7gz}L(B9*JxuaAm&>@eC|kX-w)7r-yOCEIf-8lOHTZc{SsT*&=V1 z8>?yf&;6NW{@EzxC@)r4Hy}tv8|pjDJtg0F1q&8fXPdCxRph(FaosBAAtds%R0e$k zMOV~*KYr}LO?DZY$$eTQT0<7Hu1iKQ$#n+>N4v6bKd|dQ;p>*GdsTD)N(Gp{#YA0j zt=_|%3y!68E1!5YExz0u1cbIC`3@;(UYrA0cgBm0#y%oxU45}>$$*1(2 zjN+@^zR_26H#IVBLU5N&Dug>QjA?PW)ohZi3qO=mGo3j+9vl{f zJm0~$`GI0Q|5g*bN*a~{8BzI5E}-z#j6A2`rJr7_MBv61ucBhsYG%`?|?B1uxro&Ae{RE;#?wbTAv*IGEB+7q8pR;ji5 zA4N}%Y|hx6;p{snBaIxF6vRVuO>x%`pS}KdrOfD~oZ8~BhWesn1ioHpkoI;L3UJ6J zvu(~5_Q@WgmNU=ubBVNqE&w%jeEn$NV~>4tzlM2>-yfXbh0*ssuNJwt!{{`NF9>T0 zH9&`Ul}&J7h_cY{uNsP)POD%fq*cwOF_Z)1; z#7r8XrVsY-VpG!BrMLl4Zjvp*$bu~kiItHWQ1?#6VmSsFaPHOQNO)!LHfCnfy|}-` z&;Y9;>qEu)c{}EHGgL4$NHNQK{O2)4TIN04y?3vpIP~plim-D)I>T@O%iaIGM`8h5 zd-CYgOOeBeUDhT?b+`Bi{PLEy)&L5fl!~8S@ev!b0cVS)W-`W^Mjrymo`$AhtMb#C zC@)sQ)-+;fD)WwS@5)tcqJ~bq2i^M#t`%xOnb(hA-)nEgOyqf808USS{6P049FG@~ zr$S%*0SB^~fQ_aJXM$XBA{l*3_xp-u2WS~~1t?SOwQbY8vA_Cub8wElR?TEmOWhO!faEhmifo0PnX)4FtPx0B|b)wb<2ZLvO(=#f&Db*v%^gS2CigHmZ;Wfc6o^y`qL) z#h9l%KR*MALjfRGg>&8L&EMOh1=spH%gQ^uBXqYh#s$DY_VGf4(k+p;awr$%re|ln z%R<-7F_f*AVH8<@&Dt?62RGYnMion$72nK(hLHsX0?|}JO?c@gf;SMHPpF3)ulQOA zQn76jhR0Bu(hYT}6d$Go&Nk4Kw?)i8v676gHqmpdh;x(G)*O0^f48BnY{;iAyS6Ou z^qVXTzZ-+`_ovL?@CZ0$NA(Qp)yD&Bq*^Gj+(;ZA8IY2F)vL^76EBzMTwRP|@{3XK zRG`;wn}9L7Z?$a=I#Rskj8=!wU0qvIjR6W_^D-Qp_)$}^Fa!;)2@X@H|c0069zsq{Q zejgjV);P!ZJPxr94OLAG2uOFJL6~w6#}nV4iJDya9IgJFe|@{Z><)B;_7ku9OAGz$ zZ7gM++Z+d3Bvm*s{ z1;JP}k=@TYO8=!1DX^^{sa9qsv&f5vBk=?zX4~9Tl#TGlb6p>(qHmcoY!i#Qr*Ypf9V%lj-8l7e=Wqae48KI9p)s4Z5O&v! zNt1rWK&nVhNUmC@fX#3wdYU)$rnOw#qt}O%n@^k&4~C~;-BC;LZYR;zoEknjRl>1Y zY4Qh@w+o_8BRJMx1`pDY-b1qK7xTpiD zbnEy8X*JBTyup3r*MZSq^wH`-Unrtb(u`cZdcrGQ)`8q8^Yy0?Sk!06QDg@{Q|k;8 z)!;U)3%;&^B%JQ{+j0JF>ENxxj;%mMlexOc2``A2ZKCzV^iTf)XW8=C#~geP9hpty z3PTV^BnAD{krHiv7JWY`o3hf0^E*~C+d~o>ocVpA#;6i5?``2ZFG`5cJ}+Ma99iMH zhdT17mt>vn_lXIs(>OQ|2BaHHX3J1GttgqX67 zk1}<+dBi}{1)Tx@tGUe4c9{KJwD8G@-8WI>&tfd_;K~(rYv!qtU7A@iiyIW2V@eZ?e%ZE zAY;jI6bZk6DJ?I8&c=M`tVm8MV!ba2lo`$bdReNrH!~KU+2E4jF~VbC@w*wyLnpY? z^P(Wt-WS~6mpi~_Gdkjyzc#akpf*RSw{4Z4W{GkAJU*xF@`x(l#YlLz}W3nWv5w#SABD{WQ67*3kOb(rq>dzT$pPerxseWceYc3Nx(jAEqgNs` zpN*YQ{lzny}9~2u>05=RZ5(>)K(o>#e z8=N|AUpx=53iPoUah@L-lYP?D@^~=_hc2c&)quKm+iUV-AVur#Fg}Tf&K>()USG;4 zG;?MT-~G@^7eP7AC9RR1r8qxDIZ3iD?pm6NAu^}pPA*BOismW3>V~Lj#N#1oaNlQK zZ1LQiuvDx<;_2~O?aqtOnBWSdz+H#x&PomgPu{4$u~httHPl>S2w%@?3A1?x{_->T zo1n)Zb!u*Y&XiF8TfdgP3o=gMGuX)v!fOd-?IWOEWXg}&a7mTw%{&# zD^9~X5BlNN!J^Hsk!cc!I8C+N@1Vo0q4pioKu$LOw=niUhP7#6XcIu!%IYYi9H^qAB|BRABaPT^0d3Cl_F>;D750X#lsZw zTds7(_0)BD9Mc$ikV9ZR^GFiLJo*BHmgz7|J`L;f*KI)lX;J>vI61D*bPJx_kE3$7 zjnIk*4#pS6d4%ga9q$Npyxq^Ot+@l*p~i?n?qvL13LYfpCp0@1%DNS ziP;rccsy=lIm8(Ghck+>$+FFQHr!Pg(G>-nUk{whB;RZvq7Zmxi!n_e)SHXadT>R5 zE$!`$CA;%d5ZZ595S`UgU)5Lj2B*NOdI%ZE5dWOjG|SD9ToyUmcz*oa;kC+oYPHS# z`n(27qz^ZZ7uNo=EG#2B%?PQQoM0~Hgo*zxG)4*^QZQOL)BMRVJhTCEiE-&_Ak5q4 zwMa{o>qR7G`!Ymj87nmq@qCOKm2Gvc)WDNH0t z)cI#gd|!Cs!QTSI=ml%sJKEj#4?-D~IPF}+hpD0d)i*Mx^hX&b`X|+&O4YWvYtjQN zMehj~%8a%yZqs3?irghaGy4D%dLF;BP)1SqMu@H(Q>3k$mqc@6Ye6fD!cR!7+YC@HcjZOL>JT#K*t zR=w{}6}OB0F8X5R_zUN-Gm3OaTP5oA37zp9%`#F3W5r{`daK1cN3O#bxAf({HBVz2 zbJQ5z`Mj@H#ZBP7ojsg3@2hb<#ZOc4<}R=WBHWuMB#)6*&uLnVCaUu%8Ue|zP`xY2 zJwK#Oxw1o#ELHKfj63L-Y_!=;v|B5aPvvW)&)hW1!V2bEECq+f@ zo@P3=gM$Q%zwG7w6BI_v-2H0w?~p zE<}@a(r+to+pRo3*|r^&3cMi`A=6X~j8p(dpqY{iV$=(C(?2a0X}$OHH->Ehc>wOB z7%S#cx|>j;*&r`#Yy{6SF&oX4cr|EWQY*)&hXW~=@WWdsm{`AAa(Rx^l@o-N=c-Ar z&6xWdm%%FyY$3VXa7tig98EcZ?Z%yFK1K^J6HqjwsqP7_g+& zmL60#SJh-zAd29PPuT&e_t5YS`}4x@O-Pmd=kc89ZQ?JTN9WWS`&-xuwg ze|DVv)LeHk4%IjCbRVyJ)~$m_)Yl(ju^^UGabs#uLUiFbXfA2W`_Y#L5KfPYt>$U? zu$ch`Dkd4i=@LkLU!(DqpWzhw&hhz391pnu47nF#j5rgT`VYlm{O#6wdGzgYP-J9O z#W|l(Hv~BlBXX5RR6JCKuy+ne3u0MnX6+(fGChKlHG!Y!bw z&_W$nJFVGNm~RrXM8;1W{Hjhlu7Avx5+jH^)*GWHty<2lWxJ2b=P^^WixN0Qp7 ziNHjr6#ev1Z9GCd4Wg^7YU{7Idzzfy+> z_6^D215zWTsO3=(`Yo5Y7pCj2UGe*q2btcv9*Sg}{$#E_h?&UoYHEhTFXzF;@iH!{ zRH!K=rlE#V5jL>OhX%#C&%HT5N}DAnF|A#BPO{Xo8IWd(YuV*sKcBeVs zvDeZnO}s3NCvMv~_5F?$9Y_SHrt{BV&Eu_M%!blQlU%wyB1@G~R~c8(uS1^%ZJkrE4>BF|LcBsy>fyOF&48YI1S=| zdX@>QcS7P2y%PW7J3w^XH313|I1|o_Z~#yq7(I6Szu&e$4W3k3zbB*jq8{!Z<7cr( z_CE(EJ-oKI!R7d6V+EB>_&T5}YEJ45oIKW(TXxR=Ho@tjln;->xZLb{RP+pB4{2AC zu(=qjzMTy?rw|_tQ7Z?wzqO!&PmpC`EohhBLm)XNAV2rnrxLjMT3yGLg}0~3_2L6v zd^?>gRtfE*wk*N&4uxABJoOgpoV7hW+mU4U!$0t>L+J}#Js6@2R9S)xO^>*`pIg7J z3qQh|VVG&_c)2i>gmqDtA7u9#q1m%FTrHdRNM#FFWT1%l$&7+sR2>B{(lh)odu8aRR zIbr_>x*U`2#SP~R{gXBq?h`)qpS+rOb>ff}#CiH|-2a_nneFdG4}BGlLd0_3zZ!^P zgzjkD6%1Z;O_coh+25IkCbLl$-+=)>b(VnF*Uh58628xgbLd_^%U$zs6i#-QSA=cw zw&}^Q$ioAn8<$jq&mZGOF}(u<+KJ`gL;ZRBcDNL2^+yS^hYmm14gx+u`%jYEBXpMU z|6DDPQm|*v7_>U8kyV+DaM(OiCKfFQzU2k{reISL_*O=smP)lE{=PFyBK+n61gvLk zr>xbR3HwUD`*2cAQ}Q3=)#l@8tH~*c>+-ES5bTm=^~y6YP3x-PwcEEJ2c+S$dkGz2$L_X@=0sIh%2|`o4fQ{vx5cL2B z50-Rsj=i#8JR1a0J_o)S|5Mrs!`xVNVgsCkq(ot14*8amuu~>Ay>L%=1c~J+sQeQpYiLaqB$jk zYEHanzfLqx1f`*$C^5<3$30JsohU2MUwYv*7NHYt%>(ljhhvvbXI6Wx_ltCF)sU&R ztJ1%Jc0(hN3P4VSf+hTUZx?6rlx7_|b~hCg0CAs)?~rQkVk;|gjL`gi_nSdZCkH<- zqj?kU-nHWu8?9|Ft1(ApRKcP$m?ncQ_2Cc6o5brI?4jsb2^TcTI0APlEnh2hUcJ4$ z$`qvpz$tFgcB^N9_uFG+J+*5)t%YNlI$}EMPSK>(N#1qibZ|Y$E{oJf5kKXQstq1G zK#4*Taeia1O$BZ7>Hd;`KaidTLiPsdC>Z6u|2)oIrDTF6VbO;E!;v8%MyXs{^jmxs zz5p>Dm&oCtupoJo?tOv6hAQGCPSTYk%9hi8Hl@5y^7wnUbnv_&i5Sjj`-<;xLZJ~! zj#sW7d4F3`TlvrLoO^$+yd1f)1lVc?fqJTgb37)wq&A68sKG)yVtD$^s_RA%ziY;2 zTPI{qI5b3OwSYvm@Cv$QhMCPax0`a2zCayBla{@hZfrBg%;Yf`yL`zQiq0%W1)NA0 zuFrRa25BqmCZ#noqf*|%m|*{_aJ!}2Ib;;mEE*NWPI@vm*obpCZ8S1UO_(I~F={)< zp>V`zqtB0%-xTj{=?KNiOWm22j=gC8M};>sb)-k3gYX?u;BcJ`k~^;7P{jtMQy4sd z4g{Vb-JTwIaG``Y24O^{oBxRFO~$sTFF*u+NsanPbwZ?z>VVBg!|2!+;}KS$q(?in zXVz-%k=G=S)^hrO0eM7WoJP{cjX2?2A$xB{C1#{OTFV@Ajq`)^erXE!N==oijLO$ri8PLuHO6*bqfbNh%gKG0m5CHU%KZm6_HH<#SOa7 z@fE?t8@pP)@8}Df!e?&>kK(=!47#ce+=*d{&$&RQ0kz1yB5mBZl3xC9d}Fg4yqSHdG>Ma?W!PXBP8+)5wPgwvlAmn!>)9dM z`yH`i4fnafS`^xUV;1g~b(vTc5Jqwx7xFav?C5pm_(f02USc-e#-la5vNkc zp0;PMU&B?vuGsdjAA{R2fzCZ^P0tDgzz!gFcV^Tg#JH-T3Y6?K?G4QFOzb_ln|p{b zo2=R5?;6KdBYMgaCH&@MnVMtBwLTJ$BYVvQm@T2&_;dQ77888JE;Np4k8Q0t7d<`;ZK-_P360O=DQE-hsw}i70Mg#4q3QptVqjQrmi% ztzoV-trDXZim}2&hdH59uyq&;_{quvjF z&k;@TqDj^}bKNeK57xFCjq9#4-fwBexFedo(^2K^^Q| z_$@zT=G&n5l4S37h5QgtG!fJKg&s(H<#K&UhgXb;8e~`7z zXfoeU6&9dOO1PN%p*DWtvnm0Tr_GWo)1xE%Hx~e7gsZ4QF#c-Tq-?tEvQ`mp9s4j9 zgAynGPAyP3dfq9&9>-~nb>lGYty2lZ$(A1J|EtEG!R$#esYNSp*cvq@vy@ zV75do7tED2RushkPtKLg50=T;7Awn6xYhX13zGzbCY zF_SBV-_FcuKUxzX*vEcoDCRE`el%OGM4cu=mq_*)deBR6GKIn8z!p$@ZNcpq*ZO?4 zm?VBpL&&KPy&0{I*Rcifr|H475`JqTw*pUi(U8d=CRfM{wBOk z5Yy{l?{YYAm4wvIX$9xaxh_%W=D@@h0nD@O(-9jVo;g!Xjl3Ni;vPg_Hh@m>n1YA- z4lwzI(1K{k&ayZu+RNt^P}A1wdd%SBBrdtVH?-qpo-V{eH^Jh+Y0ih2{u`++OYxa% zvM0PC1&a~PmTIoY{TP)z$~7m1qmh`zE6ox{ zLytc(fi8X?rJ>5#o-S|as5c<^Rwz~32H6MowD+Q*5QpMM9!s9*lX@N@Yggc?rE$)#5a$!1aGk zb|YmMXlRNyhqjGqx)zu;ThXF$N>E2s!@hZr*r{Sys#YsD3Seo@ZI8ClWVbaLUPA+# z@yj`2tT)A7&Hst2tk}q+^lOSLH_WBrB@LypWxEb>&r;mHt|z`#9x4uRQXjRY*5ZX% zytuSu`^}CHDH9ACeM97Cz83fT!#(D+-f;kYLbZ@JbVT<-4S=K<;d?0?_a*djdLlFJ zQo&`+T$6Bjz|AKQ{~w#jBxhFHGk)f^DoZafuJ?%VgBWk@# z)~GhpS>a|BQ~tIytO#aB=l$;nW}9pqc|5HBT zoARZ?y@7l!2MQ6UGu7j!@$w`SB8+&LFoU3A4NKh&h;HyoTw{%#ms$i>tMmbn8U{b6 z88c_X*)#|x1{IoRZ@*sz)SjhyCh!JY`;>_Esgl{I)~HnC5v9VOzNlUkbsUPT`b*~f z6ESt-^eqyBSlY>Gf%S#km^>0^Qb{W8f@;oHh%ZHr9L_S-ajH#$haqBAW%|GN`3>HQ zhRVn+id>LJBe<#?kGFkqr0d3ujPD%8pzx~b8p{)z78#jRMP|gZvlbFj*2!*`6)3q` zOviu=c8XeQ9cwugEWCAHFq#XQzK;f4brIlaNHF%QzyXZIAX8M2?s4QUcAWy|{VU?ZDm|W^cwEQDdyZV6=(oJyAF2L|$hVXr6{<@&{u-N|ym7 zS$zt&T|Dr}0Qxi#Oup6INnifNUO!R7nU%Nhwp3|TUx<`dkjuBKaMupfjcl)xx*`%Q zW8r5lnX=wKj!B&NN+U71o*jLS>%5>R0e_&Yo#E4OXqN9uIX=g+FqrpsVzl3;wU#Ji zp_XK6dam_bAhv-Ca8X{0m`k@&oX!GpESl}T`^t}h#1=p;D9@Tys(hSS%hk7bJrkh{ zrO7Uga7uwV=V|#SJ`yJuvGTVCr6r%6MrIfRC%i^5jOq^m;Ew0oM}G&?61`F0TARXO zt~wrdh99q-cjs^rJ^IWMAdw*2QCfb)aFHv;r$`*~K@t{cEBX|(@>CJ-JxF^;&b)Ri zEE+(v;-sT<|64;T@aSPJ_U9gf`y^P_f-#`w4yZz-lNY2_uXv<;{EtI2Hbm)^C{I>_ z2SPgC9bBc5_Vd%PZ7PSTa(T>I(ZIrCXb_W|n~!(UrM; zB%9AvU`E69e0ZE%JKMHU>3Hz z&sw$0lzUqP=!n=_B-{Z{Iq#f|c$$!hHW>FAKDB+F?6|=CFR1E##EUHrC}U#^4+A=im((e&E7Ui37P zGhY*Di09Q|_{%T6PXK-CYQ~v)t&LH32>MhYrogLhkX;>PRpND~jFnJYhJ zjXG;JI7nD`<9xc{vncx61oALEl`bmlp*nV9icG~SuA4epn_$fRj%p&SRVBCIPn;`A zSh_9>A?u7aI3C!{)>>^!Q#J?cwd4>eolA52(}n+eIF&FJl`=sdA-*4zBFla|abTw=uax*wInCV+?RmB{u%hVapTxHY20A zga|5|B_^CcriAwi&^{I1i^{0vC&gbIWQb6c*ER0;#0OE80I6r$E>mm#A&$j=#ngM#*44N2#sVNirEe14y=e1xjA_ z!8NEOgvEE3ji0zri6U4Q_*Z=@jR-PwAF4Y$Cq#TF4(}z9>#eRT)V)r!f;TjJGtqC!EMRh{gREveBk&`1&r#sZ+zgadTHy6;`y$6SgFCK zBgJ7Ann(^uk(z9dT2hp}I$^ZL8!0HJ1@4Bb^az*YCXe?*lxNVSa(|f@QTz3bAy0y5 zCWdl2n^J)&8!Apz^yq|jzFJbK;8LZ`BqP7pkx6!Zd)x81j|Nlc&L7P};|TdTdQ2iE z!;6afy62)A`oDY9Q(jM_*+rJ0%b4epI8d$~)%gIne?2&t6(=zTHupMy-wb24Ea&+I zQEXy)x^-3WN_?IriNF?Xr9qYOCk2CNSb!JB_LL`fR_P@Gz&Wx!Gvq8IJ0U9ExK;oc zibPA09FjtZbw1NDb3BmW_t?s&rwy6suy6Yhvi90^!(~WPi#(ZFcF9c?(?f{zN^>Jb zz4}V&`Swy$`gu&?tSQ(mm_wDLa#qVo-FX9`-4|oL@JU!DCf3DuVg%^!ngy;4-{{ur z4S8uZSKU%%k!Rg;;}`Z&R}mph%Wk6gZCjwGwj&__J@h(=%(h!K`(7XxSm- zTDVtDZVdNROmE_w;zn8!DrkGlND+Ycq;c}0zfan7)L)wJrQd|o z3O2wSnZB3uRt~5#x--z2vncb)%3zzpAt))mn%Ds+a3(j4v5*=Ou|qkOwGFMv7lw5k zDa>AcIB(Zw_w=t&Q=Lc70DH5JKL4JBRhuZ4asZ;+=5XgH1&H(+;%Un%khGi2%9d^T zy9x2S645L0*V+jYu0M3#qvkeNf2A99^smdx!pRq+Z3n2BVGva3V_5m|un}y;Yd_1i z;fkWYxX27y8_(vc74yduSna1t@Q#OmA5O*?$LV1rxlQk%crG}XN%NMl3e&7-O;Lv3 z8)+nFAXbfZsmDN^s8vqr%Ju>nD!`uM)(=oAC&7H^6faTlZ=Sla*anU~-Kb1!9ct65 zpw_zKwQzF85+dMLD>2#9CiL~^&Wg2qoKDVPltRby&P#9VvhQ+3f?Ri+z zz;6^wLNJgu+^tn;AZ!67uzcyhF}_-thz8b=rZrd$4VSh)Z2rK?j*xj(X?2g36#GZr zQ~y(CX>@*MtHlhpK}S%xw7@47AV4TIR-t5d$k~*;5|EIIr?%=dtHCKT__0iglUzpnt07l$ zY-Qof@1@s$H%I*%)oq-uZ(qQ;A~mYX8R5h&_dC=$Z(AO|e2U2*SxzmLp`y|A`G@O+@)~>Hz4Aa>{5}gcqi|C=U97xv1(-{Vqo*p>iQ%AK;L{x!RXk2@Efvp^~ zg^uJ;jPtaV$#BP=I`-M(sunI0UeI%jh)jnj3e^87a(CPYt;=JUcoTIT)!S;Gq2*K+ zyQfsqszN6dqY+S2l!;mH21(C+z5bKc?Rur#}XxK?Xa&9Fo z5za+1!X!#4LbFcm60Xba)0frTBP*^8Lp474jv+_JrN~NG3p+a)GM0nzdRTuqhJEq{sq%$y0;=}Up1#d&@ zxhEsR)<}@kjtmus=!p@yHez4wM7&<7H$B7;!GqGtpBiFVa~E@A{uxN_B*bZGH15S-wzevpWzA$14QfjfG?2O>)`* z*4TU{oKvKH0`Bi$Lc7`FJ0}O3;^;D;Rr=p*8sTtm<^V8zsi+*MCG(L2J)zvV50Pof z8X*KY*)dQKlKyf8E%^G8{T`YOe4E7UCr;!FrN-JaYw?Y8#98SF9-;z_XU>1-mDq#t zHPD9n?SNv>5;P^A#pu*yk3|}hH7Al3?veA%%$ddkJ!JE>Ttw#ik8}#ekaJd{cQHowics}N?dIHGz>I)nURv8el%8V}Q^qbm4k^v=PEEJf}!X77~A5-%u!JV`pOL$yG>S)FS=_u|ecvraC!Z=+ZH z<;J>+rGVMoEj*zx6LHt^JyW;$qzbK%NB)Su={th)lw`nFz)H^kMZ!)^&#S;=BBq1R1&H$V z>28dYVQXu6@MlK!-%g87MpsvqiT`+ZV9tk0Wr-0?pIaVApLn(Xv$D-s`Bn#^t&Zb`$UPsei0q{E6<<~5HlSe%JXO}Q($=JGprFYlfVRn=?nmtEZKusCl=-)-Qo zdr`mFt1}#I>tAlS5r|Xre*2Zxo&AdAq)6aKwL?`)w+CNQ*4;2!)nwv^t!o}u{x#s( zVYKNTqnJR>KYpv1Thlq^XZ&w@Uhzch*QDPKrrl2`Xsy^VwM(^lr@PuJw~zM{ELCOy z99GKp_L_6@6{qTiYNm7I2W2<8R4r5C@cXRnCG)-cW{Tg$*e&`So2!6RNInnw5-SV2 z4xO4LyL+#cYR&%xdfT`%B^1+SgPC@g&zP*ax<;+J_tdq&`3*A#-n8oda5XDz{eAG> zzQ?~Tu3irR^yB@3b1hdkJ&!#3ct7*8BZbug?APk~&vaZ^7X*}R3{}yp`g)&Lwg11F iMx_Rc;Ev!w`Oj?g(w3<0(gPmuz~JfX=d#Wzp$PzNTdwZ_ literal 0 HcmV?d00001