From 580c7d239218a5c59b3b880b4c771e7a8d579665 Mon Sep 17 00:00:00 2001 From: ismailmasseran Date: Mon, 6 Jul 2026 13:24:42 +0800 Subject: [PATCH] DONE: fix error where image not showing on digital card, generate letter not working on prod (#5) Co-authored-by: ISMAIL MASSERAN Reviewed-on: https://git.koppkb.com/KoPKB/My-KOPKB/pulls/5 --- TODO.md | 6 +- be/.env.example | 7 ++- be/.env.production | 3 +- be/config/mail.php | 2 +- be/docker/common/unified/Dockerfile | 55 +++++++++++++++++- be/public/images/logo/logo.png | Bin 0 -> 46863 bytes .../utils/member-digital-card.utils.ts | 26 ++++++--- 7 files changed, 81 insertions(+), 18 deletions(-) create mode 100644 be/public/images/logo/logo.png diff --git a/TODO.md b/TODO.md index f934127..658bba0 100644 --- a/TODO.md +++ b/TODO.md @@ -18,8 +18,8 @@ ## Present to Boss (2/7/2026) [x] discuss logo baru MyKOPKB [x] layout footer untuk surat rasmi -[ ] maklumat pekerjaan kena buat dropdown untuk nama majikan -[ ] tambah minima untuk borang permohonan (tukar jadi caruman saham potongan bulanan) +[x] maklumat pekerjaan kena buat dropdown untuk nama majikan +[x] tambah minima untuk borang permohonan (tukar jadi caruman saham potongan bulanan) [x] tukar waris ke penama [x] ic dan surat pengesahan majikkan perlu mandatori [ ] semakan lembaga tukar jadi maklumat keputusan @@ -27,5 +27,5 @@ [x] surat attach dekat email selepas bos [ ] pembayaran pertama tukar jadi one-off [ ] syer maksima silap tukar jadi rm50.00 -[ ] letak sign digital +[x] letak sign digital [x] running no anggota dalam surat dan masa. \ No newline at end of file diff --git a/be/.env.example b/be/.env.example index f0a4c9c..cc40028 100644 --- a/be/.env.example +++ b/be/.env.example @@ -67,11 +67,12 @@ AWS_USE_PATH_STYLE_ENDPOINT=false VITE_APP_NAME="${APP_NAME}" # Browsershot (PDF generation via headless Chrome + Puppeteer in be/) -# Required in Docker/Sail. After first sail up: sail npm install && sail npx puppeteer browsers install chrome-headless-shell +# Local/Sail: sail npm install && sail npx puppeteer browsers install chrome-headless-shell +# Production Docker image bundles Node + Puppeteer; keep NO_SANDBOX enabled in containers. BROWSERSHOT_NO_SANDBOX=true -# BROWSERSHOT_NODE_BINARY= +# BROWSERSHOT_NODE_BINARY=/usr/local/bin/node # BROWSERSHOT_NPM_BINARY= -# BROWSERSHOT_NODE_MODULE_PATH= +# BROWSERSHOT_NODE_MODULE_PATH=/var/www # BROWSERSHOT_CHROME_PATH= # BROWSERSHOT_TIMEOUT=60 diff --git a/be/.env.production b/be/.env.production index 80a9c56..d0ac0a3 100644 --- a/be/.env.production +++ b/be/.env.production @@ -105,4 +105,5 @@ API_VALID_KEYS=86f58825e5c1e0872d8786092d47e3bd,6461fc5390660c55dc47bdfcd85ed9ae API_LOG_KEY_USAGE=true PUBLIC_PROFILE_TOKEN_TTL_DAYS=7 -FRONTEND_URL=https://mykopkb.koppkb.com \ No newline at end of file +FRONTEND_URL=https://mykopkb.koppkb.com +BROWSERSHOT_NO_SANDBOX=true \ No newline at end of file diff --git a/be/config/mail.php b/be/config/mail.php index 3b53d7f..8341d09 100644 --- a/be/config/mail.php +++ b/be/config/mail.php @@ -124,6 +124,6 @@ return [ | */ - 'logo_path' => public_path('images/logo/logo.svg'), + 'logo_path' => public_path('images/logo/logo.png'), ]; diff --git a/be/docker/common/unified/Dockerfile b/be/docker/common/unified/Dockerfile index d6a5f7c..49c5063 100644 --- a/be/docker/common/unified/Dockerfile +++ b/be/docker/common/unified/Dockerfile @@ -46,6 +46,19 @@ COPY --from=composer:2 /usr/bin/composer /usr/local/bin/composer RUN composer install --no-dev --optimize-autoloader --no-interaction --no-progress --prefer-dist --no-scripts \ && rm -rf bootstrap/cache/services.php bootstrap/cache/packages.php +# Stage 1b: Node + Puppeteer for Browsershot PDF generation +FROM node:22-bookworm-slim AS node-deps + +WORKDIR /var/www + +COPY be/package.json be/package-lock.json ./ + +RUN npm ci --omit=dev + +ENV PUPPETEER_CACHE_DIR=/var/www/.cache/puppeteer + +RUN npx puppeteer browsers install chrome-headless-shell + # Stage 2: Unified production image with PHP-FPM + Nginx FROM php:8.4-fpm AS base @@ -79,6 +92,37 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && docker-php-ext-enable redis \ && apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +# Chromium runtime libraries for Puppeteer (Browsershot PDF generation) +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + fonts-liberation \ + libasound2 \ + libatk-bridge2.0-0 \ + libatk1.0-0 \ + libcairo2 \ + libcups2 \ + libdbus-1-3 \ + libdrm2 \ + libexpat1 \ + libfontconfig1 \ + libgbm1 \ + libglib2.0-0 \ + libnspr4 \ + libnss3 \ + libpango-1.0-0 \ + libpangocairo-1.0-0 \ + libx11-6 \ + libx11-xcb1 \ + libxcb1 \ + libxcomposite1 \ + libxdamage1 \ + libxext6 \ + libxfixes3 \ + libxkbcommon0 \ + libxrandr2 \ + libxrender1 \ + && apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + # Download and install php-fpm health check script RUN curl -o /usr/local/bin/php-fpm-healthcheck \ https://raw.githubusercontent.com/renatomefi/php-fpm-healthcheck/master/php-fpm-healthcheck \ @@ -120,11 +164,20 @@ RUN echo '[www]' > /usr/local/etc/php-fpm.d/zzz-status.conf && \ # Copy the application code and dependencies from the build stage first COPY --from=builder /var/www /var/www +# Node runtime + Puppeteer for Browsershot (letter PDF generation) +COPY --from=node-deps /usr/local/bin/node /usr/local/bin/node +COPY --from=node-deps /var/www/node_modules /var/www/node_modules +COPY --from=node-deps /var/www/.cache/puppeteer /var/www/.cache/puppeteer + +ENV PUPPETEER_CACHE_DIR=/var/www/.cache/puppeteer \ + BROWSERSHOT_NO_SANDBOX=true \ + BROWSERSHOT_NODE_BINARY=/usr/local/bin/node + # Set working directory WORKDIR /var/www # Ensure correct permissions -RUN chown -R www-data:www-data /var/www +RUN chown -R www-data:www-data /var/www /var/www/.cache/puppeteer # Create Nginx log directory RUN mkdir -p /var/log/nginx && chown -R www-data:www-data /var/log/nginx diff --git a/be/public/images/logo/logo.png b/be/public/images/logo/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bcfe6257ef849d7f2f341dd4080a0ecd9740cc12 GIT binary patch literal 46863 zcmcG#^+Qxq7d1SDfOJVnhja`KJ#-_ffOJc@#Lyu%C?QBUNOyOGATl(FNQZPv_j`Gs z?|t6C;QN7rJ22dH&pCVVwbouIQbSDv2lFK+2n51WQj~oQ0-tyd{Vdi4V<@~`q{ZRBJ z2t*4~l9kf(%Gh7@_S2e~LqA@2J3_p#MW_%G3P`(H>vu3h$>L`Ryi{!{qM zlAXZ;wYlToyX00{CHw^pMlQw02Dv?_IjvHbL(Gqo@u~X|x3SX)g3zE;Gp5v3NUG@a z*x)<2qlHtfw4sHqtW!#JD-60&eChwZFfz!%K>xdfYvjB9zl;1=VOamWV&r5s{NKmu zZIxF4`}wE0l$0?^|97RR|F-%6``;LJvXk+>VgI{|Pa@{}zxTz6tN;J^R;s{b-9$$c z;h~&Hf}?O#Hr>2VM`Aq`2>&}$xRwH<92$Z@R8@T}imz<}tBLLLWB66sp>NGWcOh_Q zeQDi@F5-*|Mlw}E4!`?pdLA)Q;I{m_TUWnDxh#e$tW1*6&>~6zTqW>glYctVmwywV zm8~t`im98F=Su-pd6^)j`FW1Kl@l*Ky<47$NHDl1l59RPcq~1nBHMNG#X;-T#XwHH z979NTC5jg|2-5kD0HvMBX5FN5$>c%XZ*X! z1~E5_DK8t@Z;6SWHAakX^gO1w$H)uaX#UUMnNWZQ*!%u$%(wp~GS(xQrqW_eLNw!> zn=q*_(a4_GY>iWEzbhvg|raHW8oxYWE9(_7)E^% zJbDW1WQnt2BSQ<)BowyF`wQHcmNyHHP7_9gPh~-l4bs_;p?{0@VkX_`>k-nIT&S`G zxZCJa9h6csKZ~Ja)U@UV!J2zDlb%wOg&mMizNdo4EjXPRSPAiGM8>!amMn-Qk47@B zwI$C+x^grhm}Y3Jzfl2Gqe}XG1%oJ$c-zxK9J@Q%!(b=6f$7kJ*Qi$Dg9qQBobDjr z6>5=%Bi53oA5l2($I+^NbZTlE|BkC3xygl1k{k5L0$c4j=_WgpkgurxnHZ?Vr1@&; z60L_%2brw#l-(Qj5ECo@0VSn~GkH7sr~1_vhqSRdx(Wx(R+~DmhEnlk-gh+z+P~SJ zpZbRf8_(2!Yv$V!P@!F*m`PZPJO^CWTofE;h$&v(R^`6E z6_aSH-*mC!2*1et?u5ETxSP_GF*ZcR|ArFODHD3+r#TIVuLcBq)wSjO@CO^4zJ0Xw zT*WcgpdP1s*B=gy9AnFOnF4jQ_RC=E6k&>dw&aTbK9~Ofz@2gw)vchz!tc~84e5TG zk&4>3lwG8#$;^Uu>+}%ez*#D3U}JYVoN2!6vr#jBDaNF7g^SIgb;5*2PJRuFKVeP4_ussjte~YVf+`4RgHOse z>@&mgPx^9BP@{A(b$nl!3WDmVt<25hNBi;L5WpS(f!dsHD5uZ?}Zk_q}0ecT~Bb zGaP@6;0XJ_fj=OO-uhExknW96sD3uLXmwV)_FR+-#V12QZqNCi?fts+afho!{56br zLhvxR&q=k`m>`?C#N1Yz9D<8~pU`uD7}IT~u5^BorH3`Ji~EY68OVRqHS=T0V7`6f z@Kt3MGF2wEJD#Agy%{IS?NJXC7PUZ>w`zkW-cAf%C`NQ@>?@g$ zeb$Nqt|Bj~;6qV*-owdf3WQV0Ph+At9RDYI4Q&m<2B8IIvmC!xw>@{8`>svofliqF zbhj*G5;aiuk!^NKyVm>lffiG0nhVM)KPD;LP(=*3)>n&Y_QFA{t#y7OWW)Z$n|FFJ zTsqlMGG-Rucfg`Lk4cilwI6gfaQ;_mK`LEl#f*I>wT!zkQD{fCFgWQ+h7M-ppM&F?QAS;l2V~LlH zr;@7hMEAV4KYwd!s_%UK>VZxGOyAmk$}qhsBuH>cv7=WG?8R`=@oVa%rC2sxNV-40Z97XwQukA3 z$>LD(w$9Qkx9ne3G8hD!7C3LKER)}n?%?u%u_V>Gho?N00+C8W_O@8f_}X;+xw@@K z0SDE@Qz>^B^!_IVQjqt$5C9kbYCU~URER8Ok-f#!72dS$6ctEIw`M;+*VHy-C59~B zc*wE1aAfq>v+NLG8s7ZFeBdqc7~CG{=SD@x>Y=QDyDQTcQQf2#jISy87W- z>8*`Zq7f`5`1RBMto8m%_RmZ^o=|Ai7yv2^33wJ0fLLz;7DMTwn%o_B-y*{(uAMx#)>V2}yxE{v@kQDruurHb+e}QVjuh&lKyLG&TTsS8KpP4t zpQck?U9VP!X-lJy_c^`xDm+|A7-TanlczJjhnhSkrl8gAMR1&i|(mF(G1p2N`2gkND{k^6Den~;#ePz~40IDM6#0=1U_ga7GQ9_UKiPoYET zk_hA<)P%Qhiw}=dtoJioSP5l;B>+iE^#p?o<*!SpSqxRu+*wk%W7b~Os>q%h=oRqG z5SI^v-fxfAQrv$l@l zBq!qwy{z~8we+Fm7E!#maSlyn(8I}6(Sl=)_)?7#n7~Yu_Kq5zIovzI>CMbTs|7YH z5EAD9-a}KY74Aj)ep5&AMQZDMVFrEu=JnlPx2=)Y*fkW+oQwwp9|r=ndzxD7VC}Mq z-E~MSjd4#Vv?x~Bss)SDl5{KEN1Kv)Do6$C$^P#~6I*5ADW|%HuCc^a>*~N1v3Rfr znRR#>J!ZL1G<<&TZs5WrK~=;j-Je+0y!#e8ac}el2l>xX4kUfgs%Rh{LMQ8h|Bwao zbtQD1os(#3clV8dQ7WP1xu?RaRm3K~q-n?r?e9+os=Xw4QyyV1%Rtr$M@m~fGo7=0sx3;^@ZDpRGN^3eCTm4!3X69m`Kz4FoKc6) zquz)6ZspML-Tae9Oq~v`C>Xgj8$;ia?y7aFRF&t6=fTglG{9tq*Mlr34bRGSs-l&t z>DCynfAylkcL+eZi+Zis%9@UIyo+>iaR>+?5CRX?S+T7FY_9{oQPEMYNALNevx2@X z@5)TaTg`F(f-fyhk|t6AC*1mNn9Z~#9e{`@imAh*v?PI?@iKOao3qW0lH;+t zd@byok+oLrhvexfR0|B`pV2CP;htnE9}9*FGxfFOc0X?oIb()m z&EPRaV$NV2ZW)MJmmE^k^T4lvO1=6_vR|BeA9l!5qKHXqzVZ?(fWtLA=5xLK0G-dP zc0q>cIm=^;5}k5L_dh52VU*E=(apH1=Sdf^To3-bXQkWv?M#91;2&SxWpf{uunDF8 zd#{)e>C9@Uj_t``R z2;raA#QaS1DU8E?t3v$c)pw$xK3@R6e#8^ef>1v#x-A7Z56#AKzs8H<~mX$TRfimjpCV$t=r-P%maM~ z56*^j8(UlSKGUbqTRvR`XEdoN=&Pq%tRfnAkYv9p8eBhTTrufSxr$xBr%n(R6)uWi z)(T9_+so~E76j~IpY?==ywZD$-JcS(RE()DpUVQXwZiPA>oEV3FTL6-IJ`KCVotpp z_A*S9#B~?bMaaxn2Hw)$pgW0JY80(IfSPu2%2*?R$UMIVWqNG%V)5!ulT7PRr7c9^@alphL`22*g4E z^9xz*@MpX)2>@o8e%|u-jJ)TepjM;{!z-HGVcjrY#ModlsK=4YYu8g^d}dnHWV>^& z(a|8n`bRbWqOf@w4ny<{Jf>a@d^CuK1hPCbSq0P}RAsoo1@ur3RjmD&z$HWu-rO0T zh&B&P;MO9#5^#3Bu6s^ye_?Lz8R1d<(SxOiCl2SF2uu|Zuknp`!OeFea0Ajd3eoBJ z-*aA_I`Et2w*&T06Lz)BW)iIrQ<7 z=D8{*UVAM)MvgHo#_N=r6Y;Es6$}mwA|ew)Q_|YskCC#L!Xy>@ko+#1K_H1fGHZb7 z^r%C5m}WMUA@MlxR0LGMcs)x9>U#PMNQ#=}3N}c=2IqI3(wrPWy1-1Le;!nkEv`3= z%nK8f*DTHYa_8mi^QzwO`AQZb!?|G{L32ckpar=CT=!d^&y?dIYE-a1EXjy$&(QG> zLc=`vGUEMuvyH9UyN4eXICbknjE4hpk;R(NP-wunCf07-6i8i8KLtU*K`TD$uII#L&4f{@ih0>amTM6plHJj`*H8P9 zx{pO_+r%AvMbBOJl^Dkcf6A>+EY@aVPT6vRv+*tE?rwfdf})+%w-ctIfbu6K6+%4v zyWU(a9at}Tp^nx2_nVJQR52#K8)v9d#UQ`JkC~4bO}GI|p_hplt8+Ek-*ehy_!truV(&xI1dYwJp2ILp+tXlRfMj~5Xpx2_``I~~T)IdZY z*2tib#9Zd8PYIf?6^xj$)U7LgzxA%f1jXgjE6MUayZ3v4vj5hhmBaJ|C*ai9YxezDCj_LVq$Qc4J#Y1v;8lW+7^w4J$9!b zZDZ2^=~J@=qIU}e(9QXs2ESr>I&JSGusz$F9aRN`ZjW1-Hf@p!5Ml85wW`=B=E2m}J;gUCoCnS;97 z$n(A1L0k&WB9R_HWttoB>a!;NAr9YnBaFx-j8jF($Xw3GyjyaM!g&o|C+5})3WGVU znuX0vfsgl|!?lgsZfg7Da3X?&%$lpBQ56fi9JKGdt-faX2O3lrcrY*YMVf_H^A}ZB zr$^#`#u?$!)C3bUcw&6>JMK#=vWFT(5-GxcN0-?zFi_Qe9XpS2Nd#SpVsIPs?%r1@4AiO7F3vwbPbr4z2mz_#l^Z#5`MKm z+w?{H%|AdM&tGRnsd14tfXxa}Gjr4D67y@0%^X zknJ3C!&S#}y{SN}WH{2RvhB)TfvE>Fl;^s3_%+{E8{7_mQPE?bolU8$tEsDV(};Q< zpCCl{%c?p*c!_4w5*&E#*9;o-tDa`fl<7zqym>>ge@>g2D1US2O*&8YkPZ?uPkE$3 zB>Bw#vmSA_AJPpE9I@SQZ8HwJS;bf-t8RFJ-?kjEDH~!GI{GGmd%%_BfTQK_U z3;CK2*5oAh?{js;Dkf?609gA@_g4kR{k?p+9wsS0tG5U;40M$RuptNB-i#h#qD!EP zjE7y14?PwGQQm2(!zscJJi)0rec*ungqyMTSP5hN5g}RG9f}A;%RP53WXfUr2<#9E zjQkR}H1EF?nZxYVyWD{n=jZ2})ns{7-}HE0LLhrKt}3|5Clr4g3D1C(jx`xH+Jj;iw{Y^3a-?Rj#O>228@-%3XFZP0 zCb(5-^DJ&YAQep43@352M`_d6I2*pn#qMK4&(#~e`sA7uoOD{XSU)P7@MkS%7{y+{D@0MxyY%r}lNgH5;ek7yrK>S^^LYO%g;_^2WwX ztTjIw>8Gw%o@EE?4aXB8%kPls2&&tTaHlk@z+#+4Ov&yGH8_JDV>6dkLSIr@uuEDQ z_J1Mf>hJER^jQ=>rO<71I!eEKfUeVX9*~-fGa|^fb?dCq zlb6lE2tg8Xva{`Z{!qm2%PufG-B(+#t8!gr3KkNNM~;VcrrS<~stLuxVfTjd@wLh% zlz5vI04t0MR&K{LJ}v~vhsb*}m}K9>EOF~Z*Y-02s88zvOs_lDY;@ZeJ?LI0t3vA^ z2^W*fZ#+aGw%dTf)qNKVXnID^6!$Xs(u8M(NtOnitCbzAP#=j_9pK?vr)X{g0LSDL z5fO=zzv|r=XD!G$I5?nN)+{MrLi`Zhr!jr;je_%^N4>Lnk-y%YvzMH=fkS1<;Hb2W z6Gx?`-aDsSK{{1AC^gG1VR=Dyw#t#eYqI8tOP25&;vubKtDCke&rz{fH~2QcxL1!g zs8_7~b22vljsh_|fDKE=__mN0v0Uq)7wXOS&C2+%G@3RsA9=nHcV!4F2V38v?ac~; zK$w{FAR(cC@AMk0kv1MRX4xwIU=fvDdbBX(!$hy_>OPZR4+!DoMgtxi9<|?ljzbUC zDN#(iG#L?nScdJo_~maT5ZFeU_Q#Y+@}sRD+d@7B0xxDDnWfLW&^1&zLteGS`L>Cj zK#|iU2eaf!2V^ED(WAxI9l=%$_!7g4HcsEm6xYv<2fCWkfSzQRE;@&sBf8UM&jXU}8+eZsaj>MRtfl4Orb-#jWNYZ+rbms@?Kcs{AMD8lbK#Pi0)t{IiiJj6;+8JY ztI9EUap`YlmAOkf-beW6u;kH(Va5GP5W!k)9HYPStjmguBEUGW>&eI%mi_ceg~bD1 zdijg4h8DUti3qt& zNHQIXDr#gSj8aKr$L}N*cH>vU*o)Xdy*6gd6Ca_bqj$2k)l0>!)3{-n>h={GI8c#^ z@)=;{2L81ucnqLt=_KC=)cuuzHthiemPa!1h_bIMOL%NiB?k7n7R)xq;_=W`Se6#Q zwd>iN4~H!ORwI%@EEsMBcVaKU5R!vp@Vpz}0(hz@|{waCp_lp`^I@_j+M!;XT)Kc%jQt3jv)*M0WFZ;N10n>vL-s8o%S7F6_Rm z`q<>_UaLAWqR*oAK84FwmiFK4)qZ=sQ^Ormoxu92MY`63(eZyWwn!$ zij!05Hs@sv47WCg2I)%)bXX9>Yr4sO)Wm&j8>?-xv$RV67KxS&yRz4q>JQ`;Pl#qk ziU-a^siY=z^59E$GLTa zym4PHNZ{{5tr}~xS-Lw{1CUUDzag=;jkm1> zXy$)XiS1gyA4rZamgpYE!z0%dg^XzP=a6=DijXTWd=$rRfL*uk;(@x8>z-3~@&g`~ zCp%B!lLn8%n$@`;JnRRk7&A)DnbW3eRvspmt1d!W2ix1aQ}_0^7P#rJHT*gFCT2&n zo4F61p$%sPQREPgs#$|W7oj910@A+UwdD~_PKzSYPqT2LoID?Nl$}UwLHw0~4k{OQ z8@qyN)kMRvQ{oRc|JMs(w<0$6%auz)*a~T zZ6W=q_oPe9UuJ82t{Vu*gHe@3h=`pA50u=ivJ_MrHaQs$d2eMhs~_KL#o|x2g`4@w%N`+n^&fbepsuX!OcgD^ zdqX$R!-PT+HdnzBlh!EEv_~dr{M5{&_ai!&t?L$=H-Jg~6U`^Au{iDzja9m0TeTp)cQmas{e3N4S+`x!ut@G)y6!IwRAiT}H>>Mj z!MDF=WMs@KP_{Xv zIPocS<+;q&EXk{E^J}9kN;6_q=B}`Vs#PmxeHP9`l6?~M&(UV$;Hzaq4EjGCAO5yF zHp)N`Mo*yO2NIQL8{0hfkK6a0ax%3z@4rwmk)e5t4-7ve2C;KmD_RqsdScy``2R*a z`fAcKH8;`jW08K@!4QmFqIhParFG<-@+Y7WEWC?OQ{)1S9y%y2GeEso1FJcgwSh|?@P>-xe-xX>6th2!7TuW~-m!m> z=tLlGo^-%x!-^X!MmpLPLu`Vmro$yx+-EHZDs%K@`YIKDeIk>Ut)Ic9i1v06%%F|H<`I5cu zntJS-HyDMkUi8R?MwR>D2H%=iWe0u1O$2Lt4(5ywuN9;W21eUJzZyFQ?|JQ&NbMd zd}Ftj-;emljuxGQo%c9!z7z0n06)Y=qbdS?%$SujlV9N}Cu`EWXrZF8sh-Io|Cm3X zGlc!#2lVMAtGqwxc^;4p#<2g0S*IM=^F<47r=BJKN;_Yw(or*~t`-x&!Adi*garpA zA8Y>uNnU9UR@ZEBRkVIevHE{KMLC`77x!qY74_cXxF$c1o^8w8pSRRlEf+;9K1FVf z>9Gz7fv=E`kFn4+W)F@qV9RTAaqTBy=(!sNTRR|4G~7179y{%5Q?yWv10SyKhCHvw z&JDC8igihMR`QNMB&(S;(-~|D*4`c#iSbt)l)8mn`ecfrBhM!@w_h_7_{XOT3oY-6 z^hvDc#AElRKV-+@w$S<_G#61}~q5G$H@M^v>8OHEZI{1g}EDQ5tO(4ugLh zj?Or9@Z*L6+XAWO+8dV?w7TaCkN^A|c63@b`>_e;ek3b9KXc(-=yY6G^-H2DD2#GmcExN1Woz^gGiAB-( z8+WQ3)cMe_+iPhpE4uj9$fmQz!KugLg*CT~kJG+}vRAd|@%LQaOOVCvF7 zKub?Qyt#9*m&j`zZJE{4p_(u!z!DhayRpsBHe4s$BNTtzqoRpMnQ3eLcjp!_pnyT} z(q_>cO+?+*qsEp@9cBCPbY6@3hB#m z#d=qT+ojGIhqP%SP2E%;c*&K4A2-ZZBK$e148ZZ>kuFlhD1TX-R6b22CP0)q3-@dM zXb?z&K}SdGdQRqS|F^F1SVj&5Hrs9{utu{$VHt-;98qg`=Gwagqp7*V>&#L@pL-Yom0gs5f6qpX14m z@ZEzy{{||PiV&sb*i=laM2wC6Cw%`ekTM@+luP;&C)%Aqg|93z%pA2%O6iflQ@|B08AW6wCd)ibZeSapNUjG0kJ~SK8sSwLDz$8<% z%2n|a-L$nWkdix0%C6SF`zpc zf?xgEZz?ha%0%SD!oM3M|1=XT0+f~yR@&;OYPHh*6DH|N31LUinBxEB)Y;3Ua%zLd zhd}BK<5I1V^U&wBE{jp9&RYCnz*ceQj95)$?+D?y&x%~LTeUJ|>>LDI7uLu^uMp(w z02lkg){0nd{0K;Ka0(#RT!J|*H2kvf6s$vRPsW<_==muo2?^vW-C02N2H?)X!-G+^ z9G%Mv9I|UmO_K-{1>w2Ah^Q-7L`&IVPUyePW9^tO@a!URowsSxvl!R)dve3%1kb{CQXIfzXkXbfgl&n;dpa| zkNQiq;vJj@HyLNDg|QA$N(2SjFz5%Ld=PxChMkb$%>cqz-}m%7uE)e|NmO3$=xO zo-5vDBdDL5jlW{O)nI)7w5%qwU3hM1Ze;R~{j+QwlxW>lYukg*m)WMl52&;YUnlLW zJr9ZqjLLFyK)Dnz{7FtcLgDd%iIDKghcXfUQOeqvCZo(bIR{mU7UG8A^8*D$Zz0r5 zt@`~=6L@12QOcxomWXBLaNuY$if2@LryN1;;@{R6fXjX;7ZM#1oxrgEr=sQh2*>vK zg;zOuR<`9I=+`~#Ms>2^_ohj(d-cGzb2Nj85~ysxp>b;_D`5TkZ`Z%XpqOMRwCV)V z^wNQdt4+{HXG8n)AHhR-!!?hh+D@BxZIAVZPb$V6bLS6CYNFV(xfC(Tk0E9Ylqcud z3=0Cq+_HXDba^XW6(TQJemp`|L1>j1;<^|4hmu+7`Wd! zJ9dLh%F*&z*r{bVhN_ZNDctNQ||QFu7@HD--CiE>nEO_8aX#_fp6YzY z`-7{}#hG}kLz~Or4pdUvoHn^qsXzGlD}xp(+=ZIT&alM7kj)m|VmgD{LG2^McY%ln$IXZ>>*gJp($scr#6`VfTO`X5AgWu)nNO#~<` z(}Ugf0-vpqe`0!b$3OrT?!o%sMkFWzV6*ARyJZt%xqwK%;l3s76ei-jCJd4u`(kPw z<+1lp-mjzbfn*S~`xG4Gia?he z(EkX!>u)l9JI;5ZnFgmu!Y_;)d6^JlMj-k9`vZJ}Z)IISQur=|V>q@h9Y>?q&Hkvp zH&qn%6fx^d(f=ZGCk=x2-~6FxMF1?uN z7+7AuqJ-l?I{YCY^$U=r0y)YEbBoB1Bn=F-r)L>41=s0$l;t`f{RM;e`Z6X!dD|DV z*?hLh379j>Ys&4{n}ctR)Zt(N->xA5!Q;v0_>N+~$Vs24O%?V<$l|aYLOnVUn z=<>_S)qCV1x$WH{B=;B87hbN|FOvh@qSspsvmH>Y31sm^p9uwQpHR-n@1)8J4DRgC z_gy+JoJH9;T3d<7&;CjKjW$WY^oN5Tf5h`p-<@3x@7I&@N<@d^5s`f7uOs)^l*u_? zpVaz~6L1(4KS8_UjUgf_VyDmJ1~q0fZqu_kz#P0$mb-iCqFsmx+$^i{JZLPgESYvS ztGtxfnk6)+S@^CU2(kg17>lUHW}7ju>bl0M7|q}q41@c-{@tJksF%CSQBs?4MRAD2 zjGydEF(&ElzZY-9Ev}FRd#$qP`y8GLfUs6#qk|qTXKXt*kDI#UW+tx!xbXLF(O+=F zz=%7G9HMSFTiLO|_*8F?04vXy<_J7AXg$mch+h~lkzQ_ z7wYNo5{`@ET90EtJMdUoWPd#jh>no1V2{1Lz4?j1&EUcJsc<;?lkEsJG6nRv=sU~3 zhcb}Pm#^)*3vI@zA}MXH7Se=xA$2|W-vX(^{9GpYJ!vw;Kb&DX)S1-R+4P{{^GQ9{ zJ)1F-SFW!2H@KB*$qsb4xzI5|3@z3G-VwJxA27PP$7$9Z_pvxW4^Q`DlU}n;6a)Q6 zE64kPW1LHl5h5b_9f=i5>GRA4VAYQqG0V@YBx(HS*hAxDBpB}wiq&+ z%R5b@Ip)?7c)}%;o=~Zo(%d|-%zV7-(q}YbVMLOAVhHjk^MgNy#Z~EXJS4fTQ$!s! zmlYaqHyQ}MR3waEzAf3zZ^b`Q0cAc6kXQDjXxDDP7=Ax)0{{;9I2HXwRC(?k+DdJ! z{|GV_GX1AnqHEKw*)pm|KY6|pmXe4pGTDt08j-%AHzxIa{*bg+bUmX{l0KvPn4qrcE8kD!52~us zpoj5&_hsk5TZ`m;2%3w(KA6=-ZDL)|Cgyne@|HD!YPfm#EZDqsVWuRa!5Y5?$h`tW z!r4${>)E2P>`&jMC{tI>1G#8m7G$3`yHfKUi7{$O$DWO2TJEg@xNEk|UjAG4F(F7H zR8-9!>s^Hp^X^{2l^I>oKEA@!RP{TZvb~*iSwy<{_i60sL(3t)NL0RQCGuojV05H> z6`I4>pymZ^R^0aIU!J*aWV0sxvH1K;Ju)LJmw^i+xgPcIh&!`lgj)zIB91<8k&6rh zeAJ6OIuc-!Z7-b?o=B|`T?dVj;7mD!sXYbP5dpcYFDL{0TP3lT`)A%JD~VeNbv!mX z7U#Y@EfEP;Ssr^76?pgN-u=ru#D-LzmnO6#EiT)~>>p#I?8y}O4jPaJ=2O!RD}UYx z;hCqtVI)DBy-h;+tHNS1D9fSU#w3EAoY_^-P(@p*pvrT-Ec+JE@P?x)IngH&gZGt* z3O8@6H^Y@^DWDBDGj@E>xz^@ckzcYVYHHZqY~S+mbv>Oh4yex&MpY z5ZYG-h2si9?28*__c@7vI1djGqa16C4xBX|TrrN+EhnQ!eY%nhU)>c)$-~k3*68OA z0X0!33FP1@gjG&N5WS#UBu$VE}h}@@T{)Vx9vW6xxXOp#1$chzc?M2 z*;G1`*&&N0?hAuKwv0 zE8sKA3pB+QoHs|Oj0rru`LpUt9C;aqm44s}ZtIH*6#iA^yff2~8jGv;l6tle0CWwbxF7#Pb(4bG zMPaY_(@CN&xR^J2j&u)Be<*Ib_O|jXbIY4Ql%c{Q+3n?;F#Nc9eI&!Jx?1Oz*5GR} z;~e9Z&wDzbcN$>o?j5tyW`e4&rCU6^CuUjLk~=%QnB3b7Ff$*L=cns{bNf;=A+nR^ zUy5bNpS?ZIxC}DcE#KtP>#9Rq{Ti{@OSXT!k_SwIf?0iNbABW_KW^E-@UZ;hvDtMf zvRCox=-CX7d1qpKYC)4Vsb_LS)+O4J3j1@*5AFJSw;Ojrr9Ki+_;;f2vk1Cn7V?0L zuhosjPQQ=(k0aIoFNW|Z{$Pw2mg50IjlHpq^SU(7ac)J^gGh>bP#tcs? z!oN?4h($buExh@c(bZ!lyTYT_mlp8Cu06_`tSe$o15kPLwt}hAX|M*WWSv2uh8M;eZVx8O@UPQ z7&xB?D0BA-u^}dAYwWb&!Z=9jUylhG%yj{0*aYe6`>L%k+@n-2=;3RZ(8m^v&bP1S z>K^m#7J9u>s%xo~mGO%rj$4ow(>b}=_X4}#k=ik5{$){d%^ z<-Iy6=9=zRP~@lE-t&+T0&WsHv2;0`8f}7r-~S}N&qkWih5qO8p#O_cJjzc{{sVAh z6+@%01OPa^F>^k>-3q9xKg9ih!#F=ze`6>cv_OkqO5N zSC-xW>e@>-_Bo&CINB^AF(74AHp=Jlh8nTrNUfxT`VE`3zsI1zB zsdqW(@p;+1utQ9mNZ`S-87`uQi_{u=z$B(sm5+-=QYFJTq71-k!tC^?wmfTCO4UVz zR`xfj0aOCl3c5M=c#`C3vOI<$7c)W!eSDo5E$k)zto8g6qaMc}2SjOG5o?v{@i=m! z$rk(S&nb#sHS1A9WrcAYS-7`Kxc!|o!wvOqajEO=TLvO=m?5sm+T&2ZLvIwsHnR21%_sD^y1ummXm$>!U zC@H?7VTm|Mfkpb<9ZA}}VBD0r!d<+Z3UB>TbqK!C`1)Hn&dBh^Wr2Y-Na#xsmZ8JbHQ)=Q9!Pb|Jvuu8syUTB_JY^J;a}yc>%D9k#Ye7faz9aWiDUP_O5uWj615d zqle0wz`KfgJQeyEbBSitzE+%M0P|K;6OeIobDA4jUz=-=OPyOD_j3+y`}`$!iKn$F zQzYYiB6`~?uQB+CsK|KS35CgUc!>Y-Pc;WU!!!HNqX8ovN$2L(&7A;t4ZQuD$1>ij zNvCrEm501dNf%tx{Xa}`snJ0NPUTgB@0mcr0im+%htH4GhQ1Gc%i&2OA;FEGhe$;G zh24+4s9wQT&_EnnizN>23N^_+Y6fb3eyu)X?5z^H+tFqh9`09MuV~YjVd$G}rd0%Jqku>V`Iyug>7W$S+OAx$u43$4=sa4Y zUQ#5ScpxMv>cw2$W`tdH`VEV_GAa|>9hjZn$)5|9Q>S;2B};HPKz#S>mRq$=bcDoZ z8J)Ib(JFKNLUD()eXZ~S;d?P!Tu~u*(#?Y|Rz0hN)%Y=ZUfXw%W_NeD9P5+yLe(S! zYy7@2+srzobZe|??p%Bbd$Xa-#;&5PovGUK_K~M<%vP8>M{o8o7{cCl`q%ld)?Fro zvr|I;!vA8V_+Z|o{+Y*v8KC z$HxkM9xISv%lv`gqLCrh4YhRt6P5T^GarafE4blW5P-7z<7Iak1Ylo5A<~rhF9BoN znRk@4N`@}-$_7x3(D#0EMh)q%-WY(Y2Hs=S#m@>=`wPFA!TVA2@7*}2UW;jWqT_Jv zUaL#M`KOB@vqhqzmiH;^7Y}J}{RxDS5q{R+E1ms;j|)u~;sJd)g3ZRhjw31emo#;A zw0~*_&*6VMqDL-AQYL1K6I17?u|4w)Ot3&2NjJqgrn`f~N%wmz9oByJ5|`<*AwO9d zri5tgI3J}!7+2{gNE1uyLqlgU!%ZQ_olE*_DuWWTz;HrK7w3>5XJNSSkdqwhxX9yA>H{+n!BqdYm*N{uk<1) z1v)*alDLf*el_#gReTqWmZUjqed#8@^rf9S+w1?(bd^zUbxk+8LvVL@cPQ>qqy>sg zaf%dof;+UhJH@5AOOfL4!J)z3{mb*N_5H}7tef0>kIb3bd(R9c<14`QZ71`bH7x94 z5j|trE06tMU1GD*D)Z3h@tih6%;Tx$YANqMdT{9aSJG6$s&YzmQ6~#XGG*Xgiz!U5N_9AgAv_)8SM-F}b() zq|2?>p}A(qm^}aG9?}sO_5hs2h3xvc0>~SFCqI2mFZ#`DC`2X*Ai{yf+C%-1Z>c4C zc(Djj&DDXxf3OU7JjzckBB4zqtyk7{VVnt5M=akp$Ltpr;8Igt=ia_S%BDvkeCg^* zQ1iNfcz}ljM+Srr4T5Uyy+$EUUeojDGsXQ^&1iLHMOclQpAA??LE9nD$P4C=YiC!} zRK~EicX+oxmBE^rxZY#8gc!YYM%Jy!AE9@E{X=aZQaUktzGrRX(S+lsF|JT_ zxbdsuhItV1=U${3o0mRrAPq{_;>tjPXV0?-tZg>&O)O=S!x=d5dsfo z5jfg#tAyz1tMJ}bDNj%t|B2E#*W7zv7jHsBg~;>6xv-}d&x#epNsMT)&2I~a^1>$6 z)##mYb7?>ti&7njgVAdD!Xl_i$G*C$Rq~6WlC*}V?6DSF^CCh6NJ~&sia;-EoQ^Kz zU+(@ZEeOWN$*L#GxhD@RujM@3b?TAc%IeI2^7@6sJ0C8wWa2wd`s}=9e}znGywKrZ zN0Izdr$>_eZ1qs}Zi7^EROW<+JvhXaVA;8v(~U8(OhI40_yt~r zDp*i(3_RPu^)c8C}_LHzlL4f)$WCzwjW%Ho<$ia(#@BTXCw6Tj%1RN+j8%v60T`T?Ba)sT8yl5wUbuW(=w0H)= zHXZxnKaq7XaLM1>5a}J-Qn<&crd^`a+AawuUZNA`s;9rUCk}HBCt)Ali~Q=W_%E&O zV%x1K?8a)mH%!UyN1CTF=-SQd1*THRA>q0vYNEAHKd`a`=|bq}c=wp6W=S*jps4lC z(tH-ql!{!dd){+2NrAMQeuj(J0C?1#Ecu%$?flmpio?H=ak4f3EzWgIBOt;$`Fq;% zA0cc|t$)jESY9aP!|U@ssq=nyi*alD_xs69+0UNCcnb_{y8f4g8wv3G##WH-?dr8z zcpcB5vmej_FYNEn>42WaZv~+>>dz~i3SpI^`tf$)`UxDZymLnixMVZ?^V`5{B`a}m z@qqz}EA15YYn{}|Zxt--rj1NVA!ep!+M31`KDOTS_YG>QJIc8-BYx91*j>cD&SvIf z*0~v&kO;oN89mY}W1G9})&br4y-_4Z)n&DtWOGk#ZM2d%fg-%kQjwd3jeiUF_N@Wa zSEr_5*sQkx>?vA0Blo2t;eE(mc%9FUTj2Br=G)(l^-}p#g5kS_FMHn?>5pZk-jjS> zBW?Ilt@L3)+GcP}pkCeeTthVK4H_B~E+U`6v0t?+=^4*=ryb%A3CHG$foVqal8T5C zaK{EOr>8wMg*r5-z$i{P!7sv}EJseIqcQU$*E>ANfPvM*dBPKm=I=6vaq4~JivsVR zTyLbjV4jKCnDqQpKm|;DMwI%UPAa-n1xt57bU&OGoO-Ki#dku`eZs9Kc=B9T6VcZX zm@++o&#?HgLP%E!yjEAwV4XW5tw2xHb&-jrnlfZWby(8{qF1u`*V*RfZzK zbzE8brF@sdl6?SW&e}DW8Tp47=Y*m3s1a;H+v}h9bksDPE(ITi37mDSU)+*!vEzxd zo;jvgj;Cp_fJirem85XFjFjj;v-!fLO?@i>LSn9GX5m!07w!=w1U_tES zubCcsPU%NZJwHOdDrMmD!XK_9v1y-7_}#B)O2;&TG-FfnQEA-<6)`6Lk62be3UAP) z{Llbp>{#5pb$3-c*cGipuWSEM90bt-hjHK!R9kar5WSfi%lU6ETvEV5mn&tPL^WP0G7|F7@IJZnxt!r=;R5RH z0G)8_dcRch{!0%|Q5K{p4xHaR$~%TV!Yzj?pRMc{i{-GGn-?WK#HFN# zI!j?5;G0j_L7V0cWV}F-V}6SELcn0L3Kk0*%0tL&`avxQ#)dr-CYgqf3YHk<#q$&# zAZ8E;9&|k=eoqNFcqB|CAC5e($K}Ux0lcw=&O1CqoQH}LDiMmCgZLWE4|{e!Wm}mF z7_Y`FL~Ok1OSX-3^!6BMN+XJiPT{wAL#xJ3f&ADF2^m>Zg&7%H@H09n8&%RP%OWn< z9u07c=b@6G?Z3vs%b)dlrfk@wWHkrESXjG$#r!bkSE;uP!Q)67mXf~1#(|@s`3)}u zvxN&Fi%Av-?Mtl@Jdyicc7tVB_9eGgcyqK`DDM{Q-Jb-WlbO72y@kR60z*p;~jWrjB%+Om0Ul4zN<#Usk5RhlF#&p$H@LT5EB= z-cAAdSpEbG%oMDrV}1ZKYFx(Dc51Dql*03Z!7rz-&F78}{|MuJYcRutRRq5+d*sXg z8-0Hh+_X}E=f88OFhgV`7?V1V^bkRktPD&z@AdqFybyqzpQV$=Hr#X@FY9aM<<}tq zx^1vzv*2DoRZ|79@^XI1n>c21wwsl)^}8xn+mIWq^=4HG*!-;N7Z2Ql2cE$Q2_&>X zn1#r_Z9q*p#(yRpomRmr^$;x=c3-HN((J1KYDNM6^ zom>`{yfoPe8?@9RLj9bXexu4Z{^I8`6CCOpq$o0u&X1>akrL!qIrbPBb=M96^)hFr zj_5Rv;Rw@+5S!eN^+~)@{HVD4Mdgh$8F-f;515d0XUD|!`x5*%T{NYmopyqS)7bL# zj#20V05lXLb06=0$hbE^URv`oFcSrcHCP-HcX*umV1)MN+`Y4iiatw{>Wy-?=${m@ zN;aZ8t-1H|7CSJWTbWvWN>s`fjLp_ODVS3xrmx^6*B*S7nns7tq}y}^a;@;M)MIkC zj2lxDLbc7kY9{9Ea^b(Y+sXhFl4_LL5xr0QSbX~OPJf_3Ad<0yyaE~xny_DS?3bG9 zESz5BX##}Ej%kctZw^!yA6qBUB_bVFzl@&U_ehX|bcC;0TeGsDqvJ;wyjOo>4?*YB zSM2TYJnKbyF@~hb`k&v36G7CJCBi-6|ChNp1I}rcn0qrq1fvU)*QZ1 zN(Po#C-k7Jg551u%YuO4^`9=ARRACOmy;VV^0kuh-&Zlq-SY0nzWwG4bpP7glVyX_ z_-KqPvMv`{wlv?Fl|B$;2D^ih$z@O}wo**kyMSQ#Np1w~15yHP5xQiHQ3Z}-CXIJ^ z(DS{>e@@TU$QUUcgw)NdGiY^{5VyG}xgW-6ecC@BpS4{H;S5%;jZ&8JU_3o4GjpIV z(SXgzk|v6!g`4~Ekc=~UG^XoRzF8Qr>a@lP5PqgTYcEN`6!zwgAto2^nGUtuJ-jR=qsMeff?6A^W`ET zrq+mQ^TRE;>`Z1vu_LqQ*+AOp-?O*p5?rT@y`i$e`K79=NZ+`%X!f13{4tl3m{<$n zK{ZR80?s5{(FhlHXeBzhgU~#nJcBN6yML~?6R;ZS8=&}j9cnktiK|C?=|eF^47mBY z^dSg{CD-Xl$Ca>1{7hHio0Tp**&>g2Fn~qQ@f_SQj_<>yCz z++iS3W(#(mCrce2l`+vBcF~DgvC2q3PH2NcH(AY(t6f1O$WiB00b);N3nvLyJ?~)A z{TrX`L$hj*nBRKmc0~jLQ3APuUZA_QIJa@(kPPzY_duMRe=Qvi987F%YpTz6YEQfA zClhyqp^eL6!E+|alA|!&r?`ciTVzJ2f!UPbgkjk4!89_XKwA<_7B?Hv@W23<)*wthOA|5l01$YeL#(@^@o`R$SHQi<(3 zr=`Uk!S2wC)D2zZrV2}XY0)o+GHwda8*O2US zBcvLGP55Mr2Qic${5D;xrx$`#jt1}=T-GqPUPPbnqoiLAe@b;8??D4+qt(?~PDj2CD8X}P@Uh=Z;2JU^=&`)ie*vZ;@KhH5j{2lUkdJMFR zRrziCnrx%9bJmcqhXVhG5hoeVCm^>vU?DN)P(7*y&>Eu44w4X#fzZ=`u{Rfsi&56$ zz5EA2XU-ys9gACT5j02SP)$?_cq<3o6t3A*g&MQYcomShM$V_t9p|7xlA!*zby4>R zVw1&HV!{eL=+#>A8&zdueFoxPeWlH+NM%Dda!6F;ZUhrqR*kW(z2kONHy*NS063&O zVlGBvdfHP~)J3G$(>odC$vU)b57WuQ^5aawUwPP9E$ejJZ3>cIpf9g-!+E*7Iyww! zs2qX$f$wiEs8VC_+w{~I!9erhJzefkjm)2N;d63e6ws{p72;I0ExTGC%y1^I-Qp zDV!16kh@cNGJP~V^F*Sn>*^ma)Qw&A(p1XwRX?G5t&Tq#vZQ^F`Bgs8%rb$=c0 zto2W!KPP5q(9vJ@a}qiAKi^ZtWKwJ^{=JzGb_F5fGGPFwjortRQiI#}(d68cKXE0| z`wj~O-r52&dvvD}O*ybricACI`=yVgR@wr+P7(qhn6Skcy^X9Om8AhoYlov~99};o zQz=A{0Il@>VO1W)H>G(C#=@thnEhhH2jC9&^%M%gbQdRTL!HH04*J%aDdoq z|GwS@a%S8(`pw>!$=J4&NE#=$+}$v1xHsZ{{KVl1~TnL#%cj(UXmzgqskQQe?9Z*{H42fzLTf2}*_ z^pc_FKCdp%U_DM#4d^+iOOrx~KW?Rfo%ESOl8w_z|MQxqX+5of5*9ltS7Lz1o{IRZ zyg)*mHcFUr%#8?Q)ydJPrj?a*q^N24Y2&f?`DKC|by~M{o5VOVA~c0G*EZD(fkztV z0@t~};@AAp@2)Pdx&C$y>fA)#=5H_pgYDj7u zyHCYI<)^DcXo-pv5T)LG=$cCPupM6cto;NJcb&+t9C2QbDy|Twf>#ulPL~TI2OA^R zu|JA7=%wNz{b!oZiN!^5dwBtk-9WnHZ0NE5r{{Yt0%ZA>-Nm&BY3pMSv2T7wi#!7x zV!Fa%tlS3u-~e3!7ij0#C~c`EMFJ1K#h139LVk+VbZ zw#68!B~^&41|EUVfy*ldfVyIhVA`@dYl21jeYu}Uv7xFx`U(C19A7FbzOw_=;y>$W z?8%-N5+C0%@QXe$z-}m|mT|Q%7x2+{%1#b=dCBQT_KhWVb8pX|F=n_${0CLBMPC6M zRd@k~D`mCsPFL_!;7ywB2tOJa>d^v|O+N!IfBH!Iqu3gyOibJ)8Pg&1jnPEw{tWQR zRuoL=QplqmGFU2T?3x!cs5puN z^h>)`{rW|C4&G(#PLwKe6RjT4g_h(v-0u#chKq)1kA06(?t;@J9{8!)NBB>(Px8Xcu52?HU#d#G{eY@a%SWd0zYq>KCF9ogWcl@tJ~-=!fa#Ikkx1ynitnBLc(0s#up*U2AeUIK-`+nX z*p}x~=Z?VOKY!*`om@LOVKpj*Ki(in7jz^tA_MYIFDO0^g@OH9LA>rz7w_q*j$(di z7&&e!#KtlHr~tYatcVhxE0o_z?rz#jq_i;zcz{1SWoXPy+g*=dK3DvWkNlJl_h+-4 zYxS7;fO7osSzjejN-mP7gZjk3Rkit{I~ykT7@uB9htm>lqWSXuTGxLP`E=rmboND} z8DsS-yr|Z`$aVB3Wd&hse2m5CYNM(!%+nH&y_2=_pxn2<_6yfvO}=;bzozbA!z&$1 z22-_(aCVqYj#DWcyPaL{rCe#oo@Eb_y5Na58A41yU`QCxTB4|mDPB9Q41;Q~?cp_m zzMgb;>i^9%qO!mCAZLWHl#1LXCd@w`KsCxdK5=Z1Xf(v=TO)eXfOIikS8OJzkB>Fz z^mhVq+{Bb+=aMX@v-5IztOMWi-q1_zJ^XJ2f@2G%mLuE+c6wUSffBGQ3WM~6bimto z{EmELmMEUAx>U!uKTyj!j^F-{K@(rH*hmK(_0ZZdmckzgT1{^JLMn2$coA=Z9}BU) z1_fzG_e;y^}GSsE=0 zaZ+n_axB$#y&@Vnd>!V#CPgH7FKzf#PRr|BMvrHUBHz6JPu*fg4LSBU$Ak*hX2hQ# z58hJ@O%FV;WQ!6~T>T>4MIp=MC8irVV4kED9F{HErKOhjK+ zPHs)cEG@BpSpkxtv~6=-M>~lRE{2p4;ISprKJndG4OI|}*WB2dx?WF0`V=@Xz$dGS zBkR2&dK;CV36Gn)-xKlOEf#`;em^1s4qLarx|W7-7vqh6LEL~;_sZiC+Yf*-7&b;4 z=?z1)r>AcR5?^4R00up&2R*Ey{juQj2yaOMzzRD`>v^lFT2Id!m3311Jl)K?GJjXw zxudD%UwjLxhnRM+p9V1^iVCZU82z6yX*0ySS9Abten-agw`qon*ci10?Qa{6eBN(6rTCoPYeP&k{XRRbq^cWSR8q+L*>x z;q)A4O_4-i&e80e;ibrxtn-v5f9rYg>CQXK8^dLFMPsUb3`JywLztqh_Vv^ zV_64>^T$UY6nJCSljgCudb(e#luni-4bX?YhI#YuY#dZfrMuLJatwLh`)xbP%$6u= zAkV39Gl4e0;hzTTv^(#f%6T}Qlj zUuz#}gF+QxPU)9S-yh%;!+ukgmGI$`j3#?{i*H5K42F6^J(HBAM%2UUlaUnRn4$_7 z@-od&1%jhAby>Wh*fyb#a=e3t;2&;{;pgy^v(vdJe* zuI(#bQie(!NPWhH!~m9e8$%SM^25O51mit(88fhjmA}p9m~1oeWQxvoZ*4MrXq6vnda`G0&ZJfA-FMI;x0?<|V&r$Mp^fJ|wzus1hm zrE@96dYlbACDUvLdUNvIbFGWX7`A2&_xyZ;K`>-EH8v2=a{WK-yq|@aM z$Z#F2GwCAqx(r=Eu^RL>2UthVyYqIBVDT$jQOn&ouR>DUEE1hq}Wiot5b9W>Ad;4<{qKWbxf9w-`_YkHMk$?J-Y`Njfmjf!ze@p3{eA0&7Fq~ zDws4ymG=@Np}LyOvfb1(x7(Z>49$;X!9@C&;PO+MD$0Qe$D1kGJ-soCcM;eJYJ|2oUpNAf< z)ietKh5J5bWbv9?wDDb3l+rgpL~YebYk}YvADCsKt;W<5bdT4=>c5kCpFR~< zwR+G}7ryG@9rHd>EG%0OCv?6>B=eyY-#PbdGIstG@>y=Do_x!*5_K{DahTz$B(-1J zYl@gG1BaiZS=_F(()HXKYm^0{II^C>uh@#@W&96`N)Ta~J^n+F*Z2*;Hz?`+$LCMX zTh_B3%M78d(+1+=XQv)nmC+JOs!K4M@SM1a>!)m)f)h6Q43{!MECF*9IhWD3v767T z2{B$tc@j9|fh)R*I8GjbW%xohfXG|<5lbwQroC5&;-|ShDYsmR(6z2tH5IS<$Wgp6Dj~xcChfV9gzS?uNg?2$OA9=Igy@pdt;XT%b-V?b#c z584Gmd)xv=APARpj@IMl$UD{6NW_ILk+gE>2JZ zNs%bDWYc7b@!^5w72nOf!A6vJWp{MapW%@yPgrN$SVw6!wU^n@C}hX`Q<5S=kRnL9 zf&-_0ZyzhI94L|fthH?ASS{Lmao4p*2`R;}ivejZ5#jl>AX41w<1Ph4;UV0oxJ z$gx=UxXNV|3(jOwF;=`0=pIchiD&*7NHd)iwZUqbZrf}>x^}CU!n+}$uhN>#J;q5M zFZ%QkorqS77N<>DAvJ^ynHrG=Rs!~fiu4N&MgTy7iVqeUW`ad>?R#%#wW5VVHmC$6 zpAUeJq~ul{!6Qm1?>wj0cxfcpvY2&9^5>AL_fLL+6bkmpVE;<{W`-q%wZ$4jb zb49^gy(~xiXUX_N`Bfrle$h@4*q>o`P8aS$xDZXh5!Q=%yo8DbqjWB+y}d!h;8|sU ziSy6V!n?{!zMQc!1?cP}xs#k)+^-ouEoAtc7j{hb@+SRr#C#)t*cYVR+k_z&R)+MZ zG1(ml=aej8M9?-#krW+E^{3J6jtp)R*`NOL-eNLax7|pEB>)N-SMjT>QEn?$nz6P* zMu~SKrqK@54}99ULSNWi(P!X6M1glYDPoCLubBz~&%SPr-KzLi=$fZYhGo`2vRq;> z9zBqPLi5|-zCxbrw0eKRZoCY!w8KclWoHC{G7N+q*GIVo{_82zKYc8!83 z`DP;OeHe|&cQs#{zc%y?GrQRWoK9P}m!L~~rc`2-38qy#X_zYk=WHp(%>(#>%@K%fpkxjs1P zJ$-|T3@G9a`{578TP znIS{1r@W5Y zzMmtqzIvRO?JTB>?m8@HL<6^49>A1M{HGV_s|^hzvurUTOiaK59+t0yG%5^(b5)Jk ztALY}O;iB-;{?aak@r1512Z%%$YN1`vl!S=TNpIKHAB@paE%Uf%~qb01oCs+ZY=Xo^KhElB`oXKWP3iezL^g1cVL8k^p_ zTM#*se-M;+?>ek{H`_l$@~ofze&??y<=2b<5#gQVCC6C@RZ-Z+!)?@MU4 zMWeOmNC+Dg2rDESyHX7}L%RMA#hEbd?7G$J+V{3RB+yM0C(-dGvF+@4Hz>GSBH<(D z2hB?46>Z%Jf1U%SMV$*OMEU>HgdMm{a6|9$W!267OGEMaBKg!5C8C@j$|)wB5jUV0 z_rgcFf47Z?83sLpk&g8F-XG~vHUp*XrO`QymPvPNX7jYGc#`BVvME_N@o4h~3*WMR-v45L7 z08?(2DSwa+b~xdkkG}$9B1))doHHlojw?XXdhA*z-cG;&lw#I^6#3%=bZiPYRrV#j zCC5Z*jcuI4?Rp7>Exvxfx|jK~E?->e@ZgAOK}?4FZZGvak(m|pYtCBAYSjxGAw=Ih z&L#gU)d`HZK$#Bi(uP_ReE^olgKfO$44Ci;jxVu1IIJj zXn83n{6$h71ocvU;y2Wb|8YfrU_EniDGpHCx~+)-zp}=X;KwoN3CO~Fd+%;vc4C_1 z|3Qm{?Y)K;t{Gfy!uY;W6sKO7J*{E%q?UMhOaKi-U#UJ5R~PZ3cP|OM2ef8*F~jg) zb9XdP==iCH!746pekwGrTeI0b?r8JB4)6S+CYpxF^_M>@H0A3@7zNMs0XEzx0MXW# z6^vryRgCP}R~OkjDgA|*7717PQ8%fJa`rix3T}M`#!%A=XMzc|{fyoLswZQ9@U}*# zF`#HzkzC8!&a?KI8fw=SFMJ3KpOIq3soG)P-IKJAs0As!#N?=a^0V~R^SeLT<{LC@=`c2Wy=>dSI@P0YkK%b6*fI z07u7+j5DN+k~m2ul~z?svjJv(=yzfIHAouvjj11j>4YLNkOXdhMOm(f%I{0{RYT;~ zC=h+R3KfkVQ`kUDF!(AaC#&ZvVDXGxooq1s$9;r3#vTlrHUyrQJM#_~wfOvVWU!q^ zX0?WzxtU;SXWe54=}uZ3F;eT(qJUgV5}-Ji194W$tNdL1`c~|(DmqPv&D#j|!W%Vc zEOyZxU%6|B#0PGqcJr*fb)BASRzm6P8!%ccGBYz-I3^R zC@8sUO0)S5D}*JxA9Ud4+|hO6bp+#wZi*Y(3~Gas<_i&qhp+)L z;IFBGaj@4mfHtb=p`R}XfH_Uw`vk8y$@N}9bQVF{3vZNfIEL=#YAUZoA06{Q1%Osb zLj-wfiSQgjtgRuRf6|OOO&{die?!@=*?xL@6Y<-jr(&;TBZD~d57V0aCV{Euvz4}D zPFFB<)LMe%%BOkmnQ-@XTP()9&?1xLU+Wlt=3iOw0&>d4Rei*(P1^@LY=%UN!rbI! z+z$ogN6>1hsNWH&v_*W;QOaFb^6hh9HCZgn$VN1_`wubcuLTQ>WK3E768yWMa16VA z%mD_JtKD{9wGENH$v-12)Gc7zzZ=aD`+L3X@1TB*?(iWZIq6e6O6ud^ueqm{>W5 z$9Wl3WAv?RfB9N|fXw*nAlFZqi_`g+_b0w{Rqff|{EBl`MVK+S+%3arj%-yTKPW!jif)sLv;N!=%pK6CW~jbsDLj zp%{@TQ!{ixFhB2yljbk-=}Q?Pa>Fz)fd}qI{5J$Xdl=eU-#h+#e4?pGjpiZd=kF`FRVJXAS^@6h1BgW$ zNT>$9s`PKQ>n-GD0|F31W}3!b6hXb@m&v$-A`};M{PMe>-fbIl5URHrG|iQf7Hc_S zoVBDEH?Xc<04)XGZx^4JzwbJRO$nlm_rU&0(;$EPhRB86A18%W4w-Eko(%&MJadf|s=vp5QnIT}Zf( zoM+mM4jZrHNh-#KqXmh?C_d_B-#uWqfDsCP zce>B|*5Vc_&lkSoFKZq(67`zz{mVgvh)$bjXH=au{%7|%mbBo;YIH1{3WqzYs2*XG zh%QC`#bHwBz;7wY+dpEywKbIaL9>o;G>cMXF?cC4{NT5W$oUR*4tFk_V{c-H&Bd{L zXP&hv%uy^Zx&^-g5|;!JU*9J#T3$szA?k|wbq{6Zc>zl=14rC$T#X3aH&BZBTld#% zZ$+d2PJ)cUI;3x7JcoKff=3n=tHM7v)Ia-NRYIWJEke}%a8NS$UyH5tnvv_p(h9-P zozP>p;|IzI2tIamje-lP9qRSKEjE-)Uj;GbYuDU>UIKZ+Ss8=O7Z^~ zQ0hkem#8!471fY0!xQ3^(w)e!1cj$Sa~eB)U3wLr&$7o(eJ`T(OM!US{Fk)A;aTFi z1mVvS85T=l$=@(8A&zvjrauop%rCxCpFB1-y~AE`?m;jSW>Tm!(M{2J0%to(#%qJy zc+8CS|5$f@W+!wq@-Rw3AG%tbHPzYP4I>!T@4q}`z@?0QgQSaiCe@k`vC6ANr37{Q zbAkw^8u36EqGW$tSPo0WzS)+tpyt5G+2vowvNP z5l~;qv|?*(J0a?M_VTSi9OHO&bo38uM)B(T1YMKamdOP5((T&UTo|lhC52uQm1QqH zz^<`Xy|R&^QCLn3LiPtU*M*xV`4}a<`R()DV_Ei%N6tjt+^sZ4uiP0_AE-+xjV1TU z{H5V^MFcpZ_A9&iN184&b#7R9kSS0$?3v<3i?nd~l|6Dp*8f!o1=@QdR54<{Ga+tD zhVhzd;#MJc8JH%1H-}B9YGM0_Y<_VAe<6k3A&wH}0@=kiLOPNXM(FEikD;3z2}&9O z)C4$^y1|Zo`zamX-H{)SmQ`7+(imhaZCl>`y`#bAErrS$#b0LIq7XPx_~Fxj-hzha zny62krx;bGZSNCbei3|dq!o-CCRIEf+v3T|IA2qOgJ8#i#&0zYJ=ixRW2a*RNq?jt zmd{RVSl-JYn;4l2rRnXj5G3HrH8;h_Zf>x=rIsvBR8rYST-pqId3bqMij(`<2x0&r zNh;6>|0l(?v8L@f!Hx75v;Ocl!40pkc2+Q%H$st@Q8bUJH5|xLr7i&!Avn(d1epL_ z#Lno8Yy;`iEKPW=RV$iO_?1|){OsZnov;<4G!DhM#0+uH`mrCoSS~3*4Dq$m3k8x_ zSW{D)O(viD{Wos33wxr?1A*txeod{VUCF!_)ZcKsXNQGY|lQAIQ{O(s)QB4WcTSB}E*-|+_-MALvZ>e-H%;6e`bhV=okz{*C3{{8>Hr?q};}Co=cz@S-2`O;{#}e`?f;< zl6x9n7RtrcWC%FuA6da=-XIe#oBy5;6`xA+id)3N>P(@Z5{VfVr+O-Z4%hciWERfp z&=m=&%t7m?%&=tNnr1BtLdszd!FmS)siwLsz}jP7SbW{NV*fW<<}CsMgG(E;LysS1MLl z<4bn+nDVDzWcwv)#x6?CwTA6(hhYL)4)f6N9Ymxv2V;Vpe%B6J6FR~kC(E?; zNa8a%^p#r=n{ZW^L8Oy3h1Kjt`rZd)thzN~W9Gj*t19e13XLf;t3%hF(}(*t*ED1I z1?~4J{e+R9AK@Yc>-XCdjc;@BMzTf8qCM$)35lvpaIJ;2ZPjtjl-1e)az|mpHv62W zB0$4DhxAj8rn;4Gq*ML7z*6Vqso~+NmOs1RWaH}y?681nD0XMaV=)*84dr2{8BZR^ z17(cXC2$y-;+dj1LcC7S?d6Dzh2`gouAiPSy?&kW_RiDP)%GiFGU)_jNvr-@Z4wv3 z5a{EAD}jQZmhxyy@ZIEK$FI_9jO#;vj}sX;d=r_L5BKMZ^eV|IthxjS)r;!TV!Vbi zgD!2!E<(Im$yyYp6-SRjl3PKGi;L=M>;`uc|Hjge-P4a!mTOl1qcoDQ&GlrIeF#-* zKa{~APY7;`wKp|2DJv7}Oq)xLpNx-;l)o+Yyrqaxa4?8Rc`$TCGa8=SW~6s8bP3Be zY)L>5sr5tXY94qKF*TnTivRxEGPzEYhdc*CV zYR_0fgp5J`erf2?U{KSHG?&S!j5*={qTl$!wi<+HB_5b~fgIMTR#P0SzD2`%t^gpA zoH|K7IM+zdnZ7qXj84EtHH!T&lv((wW|LZ5Z&5JAf`d@Ygr=!zh~liA!G!BvvU^S4 z5IfK1dw0@!b8{o?dw-VGKOT~Q{UKS)3WfTt{tFwlD9PBf?ZmOeblm;^vdm~+kG&5L zJ{gVX!ee7fBoh$%MN?Urt^y$gskyoNjTupmL4hGrQumofd6QpXvG77i-RXyF8sLJs z`XBJ@`~MV&PyuLfud<1@ZOM#?4=vQBqtTo;x)mn3qr^u;>jg87DgfG#1J_{-V>C@R zuYG_Ko0`Q46(ab@i?_ujvf_E6isLjLL*_G>c*xk#7(w7yI4;hJZnTH@AE_RK(gi`- zHPEc0u!o1;2g~pqY2+^l)ocPc+rq?Nm8F8nQc1vCN72h&4(pj0``Bf##VS4Xz2To& zfYw~$mxwD3CO!d1#?qth2+EK6_iv$6d@2_FmTxHexL*y+3jFW)RYZGkR_$wZBxSj8 zm8|=dwu*S*xN7RfMS+^+Z~UZWhj&1gzk%q-%l5; z#_r@O^T0Aw%)=9M@Ds(9FqID)NXA-6H1gL@*ZnHhz%a6o6T*yTStXbtX=r0gq7&RQ z!KE)-Z)5nmUZ2M(B)Q|~zenMuu_gmY#>mUvzb1Id@Q%`W)&6sHb5r8C^Pim5K~>3r zK6o5_?z=nuT~oyJg5Kl)E`=CbU0qGc?W&qrq@_G|cM9f=QOg!s6E%4!V^d4buI`qwnk+3waRgVI^tJX6mT=H z2i=>u48WYYr>FZwYIf?-r0-HU$aeOGj8bZThX<-N`P?E@kXsq*>LwVfiW@5c`Kd?H z(#(vZWCB>jprglOkJ+qd5>O-O;NZ}B6%Ra`oj0YfWtzkMcq{!Mxnr>vP~=V)td076 zK-l5z!ouN;fq}h)jm?9&>y1?sbeAt$j-|?FqAYx^!`I2SB8^=E6bkOa0}6HA$8;O8 z{Do<0X*qwn-&Z>}tX$oB26J=IgxW;i?^X8*=*!n%#;xffLOvgZmJ$%y$J)-A)1Y&^ zgN3W}&>U!=dPxt2zA{3?T?nZr9b<1flq0q^t%19aGaC<}?Atobp&;|6=#MB3dMtLd z>Ov|sp_fxPpFYB%c!mpGXor(rV$Y8Js8B382EC?lHvmYis%(>HGYNNm1@wL4M37&La`S|e1gZT%&V{Zr}ddq(_Lc>#njHK>-|9`JpB0ci51LHGpiXwjg%t-R{ zHH&+SdlKDzWBi6Xi>?Np3MgqQN(Nb$B%pWbR;D5<9d0(okIS<3@Ho-Fu)@@1ptOyU z9vMP6w4okg6e%iYR8y#ObHm6$pnfAA3K0W*?mZME%=4?K-Co5}k{@zD@D)D^O%8kJ zA@pI<4?;VQr`n!1vwPf)(Al4w^xQlj^HS4@&UZXmPc62I`+ud3#~xUrD`-X=TnzCqwP)|Mge< z{qsTJX8Zp6?``v3z;gm6=}!UYVV(k~NpcEV4EAoddr$l?rjVMDKiGv#%7%;FhfV*n z^zuh9(yvR zgwjBsf3jhJT~UkuuzJ@4?J*}jpbjW|fUi?^@Mz)^UATm(jWB~(W!%MY>w^=bGgiCn z49U3Un({Sq4J|7MSBmF0YNO)5x{vjeIco@8si zxfZ#n55%Gt+WW_pzAxEOE5Jf+cT9YeS2dC#T6#yIGcPJMAcVqz03Enttlj7?)7;qh zc8QzJh#pB(_C`4Mp5wmoqD`sd6#U}+uC9)VS7$Fh>k}3)u?SDu;R$l6@z2`6oCkOz z$r47iEq$9`G6`$4heI+Jz8-f&{tbLW3^ssK9q>K3^_@-UB3csE#=C#%c@)~N?0!Sz zivD3ISg*Py91UTt@^jdfaWoXmEKWXz`p$=!_fVzS-6fVWw8mU7sjQo!*rJ7&PV>q; zudaP(bu~N1hUSU0&<3xHoGNC>G#eF%T~()9(TtW>*sqFN!Kg=1sDUH%S%%W#CGwSA zQ6%`i?iX5M**0S5PN4Z*cxv7S@;FOkV!7v9^!PblfuTMFITZ`WO#+hokm=} zs}cDS@Hg2zjnUk}%BpgKB<-_K<-)3lhQ@T!F~s&^YK{jr_t9T}Gn*dpmpMl31m&!r z@OrH+(=swHF76#DeG+Ax7T-KyZY5@8E+!>OAfWTHR#0E@zdJkuK%aek@npR?N^Q<; zpgLh$RfXxo`aQj(Ffyh8;$Z0lLV!(1Rcn5Qy8Jh-bS5$A626=Vm62_`r$Ad^^_^3O zWM*z;d@$B+0m>Fh@uBq=ndU}5J?$7LX-gNAw^Fr34gXU0b;#qTqg4)Kp$S|ohHNQq z{Zz73uOH^oF{RkIfzvl;z^hKEtgD8uE^c3d0!64oXG#ec6dcjM&km7#D74=rcV=(*f4sM1rCnBi%YFwS$!3)(w7Xy1gw5*!g9v5$7nG?sCcV{r*GwLKJ@70DGW! z&XyHyzBVf4?~Qv#r5@Wi?#R%~`gcWG)P)mF)N5jtCzj1zbT|W9iE$hzM|KDN63YZC zk%2yp+O+Qm4c{$K>AN3R+M5byjD+Ay-m<4=;7b1ZQC9Zo#5I$8@frF0hDi>en1v>B zuCcUQEzXOmx=J=`jZiLBp9q>JmLi49vHP8kE`l?a>7zcoc3)g5QT+}^u4hh$3oI4{ zy1X6HD99^t((Jjg&(2u=d(TCZmtWcIBWSe28FKCIFMo^`NHETY8AttvWuDJXoj`Aj3>RYYP=_D*KHWL4RMEGNpYsLNSp7%@XYK_zxJ zI3MKUVl8b~0wqYbd9qJVOWjyKrnSs$Fc9F_dMdwSeU9q>ybH`^+iYj>xeof@yoj0-eu$3(V!t-Y1co0 ztYJ=EA^byheIrk7XJ>0`QsuHxyJ+#qYV}LStMm6TM%48lBz`}NOPX+9Tz-5Bw0*JOK9qDx4i_ z^GT;0A}0>Y=IGD)h^!Xcrq%m*hf7yFo=7iMkE@oBL@|_)fGEEsRbgpU@~WzaAW@!L%+955f2$Do@@2 zG*x)8Wj;Gs3IXfKM3Y!a2WcR|K9H4_Rh`^!Z>5#h0X2&aAMb3&uDIP_U0%+RnR*eS z=Sjx|8QrxG~1y-9iOATq=kk3=|J90>N)*GL|-#( zS01dQ9|d0UhxhxL)2glYY!lhtIjAh!)jRS@gD%2;6gWUp=W2FLj`Jhv8oY`o6U1M% z|BZf3)zL}~k3une_HH_V=^fV3>K~OG;l@W6pW$Gl8P5k^%QUe1BczUlv~+E&F@$v` z&&drtE25_33<=wvkyUD6Z@_G~kUt;x)< zFFP#L(3zM(?O4P-9WLJqIzgOYu(QzdP}LotGkx^+bR{P@Qxmp-@LWovh3KTp%Gq!x z&~qyM=$_!J3^PPT1jW`cSB6f2nJYnJV_7O#rQs+jZ}9;5a{yehA2M#Nf{bbe;=)M& zFfEHsf^3qr!u#{gWeN+qq#f|bG&0)@Dphha(6HZwSrCm1-!SR@mZsdwy5LFi(;;sBViZ&r|z`pIA zmu4NY@Xp=N^t1&*YhqnP-!E{B-fx7Ty^U%Wh@PCEm^j14ZaDp>s<;cBx{(Cj+(fy% zhv50u-S#2M=_Wr8`!Tvw?6{pR;So+j zejR+SVUp$&<#BOvMVg4yPpiig!P2nPy`QbltX)s;ctemH&MxP&n9wWMk00j%hrG92YSP1vn;S(>cD(l2 zSJF@H?0b=J_;n0<&FZQJ5uUSrZ(fYZ9tpqW#<)&3R~EM?Yi^Lex? z%JT8hQ_>`+rtVBp;wIMZViVF!ilC*CFL zYp-=4#C%N`E`f`isd1tp{sODFMt_E3@Z2RST+XA%Ca>E}1$HfU!gL!zNxRmC&V5hN z>%3F9Cph_?BV`z6y?{Ozz7YwKT8)b8C5;usuGEhgI!@+5*rl8 zJQ;%i>u3Z069h)_gkD!IAvAX=Kd-+;epD(;OX9PB3|u~_JbVBEvRh)!G%{!)gl|(+ zV+|&Voxe^|?BQK2J8U5P|0?#_tu&!*0uB#)dPbO?U(|}~o*ie#cI`5KuV=q6>DYca z@>=OQiq3<7w$!iNbhX zRh%yi0`ONGIf>qHeA*h?)tWjPUUJ>ZDd<|ai)&Wi=1~IbdEYG|GZy^Dc$Z&x*w!A3 z7UPw*w|AAlf@=naPcif*h?S6x-4d&lGsEp(wv!o)xsUPuD6}K*1XiHiI8gt>P3LL+;$&0U ztf9I;bhy4RQ8qzwzLDXALyz6#-3c4WZ2j~h4$QO=-%G2Zwfo!U7@_dzJ;OH=8CsE! zhg-QOs>&Go^cyw6(dgMu#EW`D#wrwN(-k=vj0I0o_`%05xzYldV$|(F7eeVl-G1+^>QhAlH3^ zI>wSb3W{MeFom}9RbLj>U1r2s*jTj$=8u@jsiESsR zMqR0U3HQ>K4pUo4ktWiCqbV-QE6(Heh~VOK7s<8gL64br+b);X zx8^pMJ}VQ2<@`l+1e$A|gjLrdkS#=HzR%6d=4Y1ZonXR$f?bvVcm( zy!N(bvy@H?YMtA3+vr}clzs!pr!W+wNDkBG&ta%WLrXv)5Wx%PCjP=6`xdQS$G`7T z_HI$$SNC1xZ6J#M-S+O-R5TZ+ z`dVgvHCMF&VsIKSFDs<4($~(^{@37Q4Bd)U@DXHsiV)gm!>7MJa#&3KF7~0bXxh^o zN^>Q`!}Em`VEseyNbR&OvMh;B45jQLH1f#CJ!g&LfI{yI0wN|8aC>vjw;lk58|Qct zRu-0HXK`mJ5tK5SeCQ29Pjb21i^sMFszlQFqwBFliR|~@p=wp8cA*^Ei32mPKnqKKBa8F6)!W_1I zY4ev+{1v`CKfx!Wf81ROLl3;34SlC`=WJTZm@E!EeYYa%cs870o$3Duzu_QV;gm!pd~>TEs8ED?5!&4Th#)EU;%9J4uUdwL^TDgNU ze+P?7#$S-lv*wv|4=CVp+k%cN7k ze&Tc1a?=tp>U}V34cqxCeCZ@SGWq*Eb86N|@`@jC;o8~|cWv6S98L3r*H z!5IH(WDor3r^=7m+p`!(0G^1v<6BGVmdxGRUt;#)wTpLP)MtSyCp4_r!6;v=cQ;qO zc1rXfWazi&#`l0Zz;fv)%+;xp$SMUR2Q3-W?RV|se$>oJ?sEj_qA`}#5QonNMuW1n zBaVrp7$vAP&OGJ$+l)l#lJ=NqQ&P5a(`E`@L#liEsu6XvN*>da)(8)28rjNH4v^Ig(P0W9JodzD3(EHZtA^JS2C+Cz?pby*LPuCyvqtGs;|!9G&r@4ciAlW43aF$ry=)2HNx`u`4t~-`s?&xgTEI{(T}{GQpR-rG_JS` z^8^r+;qnz%LYFWPI2^{oY2GVC2-@m+N#5@_qvGVRzy=g>^sD1mve*2>0n!w%lz_{S1+z$%e@59TU^ixg3BX~9ec|UGh_gbPvHmH+sIkAv4Z$jW1ajka0uQ>MIR(>A6}#F ztOlfK0w+Gudy+g3+P=O# zJM8P}$~XkW`yI*=TL@Rr`!?E45+WB1`ze~WByGivX|Q00D2p09xuc#|;FM&|=f~zx zbS%2@W>A8N94cC68fQ8c%`am3wIA+ufc!F_$UbUHo{6_*Gff&j87Asz`#2Q#8}yE^ zt2J~uv@me`JZueYMKwynP2o!z&q38`k4IQ03ysjywBSWnE zS|=Vq!c+>m1FIHCrPoC0X2j?IJFtBVr5*e(T`x%Fb>sFjqcNjlSOl{c^bk)F3?Y4w z-P^zpJ=^x7ZfloqOho>GifB?`-<6<3-e52F8RgD`;)fB))9YCItDc8JMZkviA+PV5 z8+{g&3H26R6X6Dm__2AEUF)Z=v&}S^&qlo%-&jsj)l6QM`@qf`t#uNhXVu)_66B8gL2KoGR`QBKwdfc=!O?3eU3H2i^FeKM88V?rf`0!3T86CP8B24Awxm`kc@IB0G7UV zKp8FzR=Y(pyW-pHvX4mP~;Ae1G(X&_={pw%JpEH6+EIhk6-&TecD%O>7NDo%ubz zp{C#FB-t?MvdKkR*44fA2YQTgVSD2i6O2!y*5 z1sNYbSxQH(5LE)T1O`^p?YTvSI$z)vr@xSc(BzlYTCmevtGV0NypS;0G7Dc-Nj$zz zMu>`rriRm0Z9bx(9n|^>u89-WQ~In6^d63BI(dMYu(JR9^$EgF#?ABXyAn(}lDq5i z*F>UV#C9a`-F?qmrLt>p!VuWdp0IEIt%72}ZAjOYnFfyrM29qB_m{L_P)NsB*!OIpx;DX6WH9fA~F8*G9j z0z}ZZdpa9WAZvWma5{iRhSZ2&%;7aqOr9>@InwBe)`@WMdUh`l;s?$~L97I#7faF6 zXst^Lwtr>_{PcZq4^qUen9PnAr$oV&iMBozWfn_u?302V5eiSlE>lpc{k zr364T$vWfkCp6d6#bGU9C-lrS)=ctd6}(m%=xUpO;PU3kJ6j>zeALIN$XaC&>O%_M+udUaKDvY+mZY+{T)+}{73KR2Sa6{)mwd5qm!wxCBQu_j3uXIvbS=Q z7XmA)zr^O$nt1BiuvaPZGEf?Qu3;xYS}7s#l1c_9B`@PbQQH7SIOj-h$(x}PQ1^fE zyG#9$W#2@Bm0%T`NyVGfuIV}<1jhhyrhz7bk3hn2Bf52|Vn@6aN1!*Y33cty)-9xV zt5E$`596QpoS%;SAdB0K?RXbsx=|@k;P5l96~6KW{gzy^QbPX9tZ*;YAZf1}ic;kZ z4Kb6vHlf?v{U7keaHUFDVfQb)aLP3A90_3K+0UmujgNOqC8V<;0-s42j&yd*V%TjO z(5hqqy00m8v8jiGbU7v2lh`4{04Ann4;`J(Nb&f{P5$n$v4I|!rc%wbe!4jODWdnB zF5V#GX{o>XN+ms7J?nv=@opc;6HW?ad@&V7y%gu_BxQ~S2}tETWsV2 zfcigCO$rbKLyz!1tIl@BcEZ|vEtYpXD%1fx4eia&dyF@Gzbn9JJofbO`CU=YMPy)L z@C{`F;-EnjNg-sU>=Xt9lss-%DxsJGmJ;}!L%SUjZR*^ra7&sD?e{Z(>W`QaMB{G| z#ejMnY+~r07uG#Eao2w0QQaN;RT(woG@)*vyE~BlCxQHJ#jIy;JrZMIh{rS}?G}tU z0BVT0M9M23bY^zR+9=a>vl7F}nPOz8&=A3ve9Z9ZzAN^M9N!2T%>J1hp(f*+=_Rpx z;;op2s_c#mtvmN=X8xCp9g%=cs*}-AmvT!Bs?WKNeF+_^Zp*-ywjahr;t;YJ+0oYf-X6k9rvr=H;6An=;Jup!*ti6h zNb5mBC5Z3mXkPX+Tw%|29kVT3kk2CSTj)y^^c;Vth}xNgkw_kM>ORvMm0OSsZ^e>- zN!a1SP4c0h)2Nk0@p3^G1#CF3#P(>OyPS+e>wx+gXp-E@vHFIVL$`dhJP%Z`Sub3U ze9{N!A5gpX-ajViOr^1xZzrNXcIwGwvmxAQ-#W}cH~#jy1pKkHfpGSl@{vSWl}lJ( zU;t}T1@Hdu$%4{&t6~fIt@iodv=hCbATZj3iQGxEaJ{Cs|1diOP*1mo*-G$^=-jtN zIs`+yYjRHWI`wL;JjBGRby!GTnsSG3d)uyTOYx?^PZ8GG7UlA#?-QiBeMgnY?))6((N=M_L z^L_uF1M7PPzKZ8!b8WZ9>~@*vmn(bsId zS=J-^0A22ttXPCIQcIWAj<8@+yx?R}O*VfHUo{ugtUl;@)Aj*dy|bX+LL!|Cvp1Nn8e!kbZTai@H~Xx|A|?hG_%j*?+Iu)o>gT*I9#{Z@F@_No3T0^B88QHM};`1t|c~;v+AG zIf|?Vc)p^(HdQTF%8|+Dha472GaIxr;v<)-LIm!!IRWXKly1@OdhPEk7<_!`Lj*g| zX$QF*!n6&YO<{LK%PQ)~$UmYf$Awk1>Gbt(ZpgdBSs(`~x_|=7Hz&v_V(J|0c(e9F z5Igwg0pp?0JIO&Kqh9i%!W-^TFNIb0t_JQc%yL>RFM*?tVIlk7XG>0^s*(l_$y~}k zQ~Q=lJeb>CT-d0T%&MO}XO60r7v8}sQQamp1mZ>eRTsF>yHZn^Cb% zbyl3P;W`i;)$XU5Wh83)f}m{6r@PTo|FG0~_;$Ut?}pmr4=;-9+-$4AVY2Y5Cc#;8 zai-O(y)-colj)TH4Fjb|KxaRnhZHl`Lkb&lL-{+2S?&5`Z9sX%?I06~zXSU=AUBC7 zEF$%x<9rgr&=O(om^c~F{ZYy;)O7~mm38>MQMzQk73~5iee_s!$UZA)ZwnD_yC&|L z6(fchFG-2%Wma)$%2nLnYUQ~VD_Y?unF>+HK8>(XEY09C*WXbF1PsAu zY?V|rRB&?Zpyb6N8PVma0$XI~k4JqHSFgZiDh@??fQUV*!)ngR7h4MIS9*$9SR#M( zwbOJSkC*R(Xxm?_ue{j5d>R*kZ#bZh61Vj8&rcj0H+%TcwNKn&&V8AqzSYfY41KJgH{dcv#SA4_t@u(Mh}VLx;*Ys`mReJ~K3} zMy@;#L{=H|-Wk4*gzjYnenkgYMcry&_R|~`rFu7868$!Ni=I5NqJ}1WwaD2h8HK35 zWIYEyvM?IdfSH&e31QKyWJ++Tqet|GdC1PGzrZ2yb;?Cy$bCP&-@|5(5>$vM^&8WS z*e+?Vv8$)M-$ zZaIwjYIi*3M(yF=nP@L3I?I*fYB4g`gf`1Zj!sq!g^{KRZ{@L_@6$Xx8kENe#WPPNf42=9 zmm1H{r~h!*cZJ=VXR(zla^;#8;J$Smn@M{ZEX0|0cOncHfg_h*9Ng)u4biD{e1y5V zCHA%V`mkXEI5uZu&4TnJXlV3FH>iw7pjgrP0sx<%RuE#Xh#x!lP}OQ~oPC z5|gt6RX^&h;Z7O{eBXy_Tj0f!CD>SjQUXuF6}EqzQbs<*oVdNIz}s>b1i9lcQdmDL z5|%P4!CFCB9?QvItWJ4p>$k7TcPXXcHjiy!>No9M5n^S>B%FBR^m!zOmT}W8!TY>H zMPTq3%CjGB6k9nKrkh)2h>hP3nI*w4w^d>!2PC_tw%b8=LDIC6 zvOn|e5D|4$#?csV%DeDYd+U~8YN`Oq(;5%44cLB zv@_>GH&o@`-{SKAfZwA=MaY2NU=Z?fW9=E@P)m$Jg)aR%Z)t7!Dsnxa;2KWF#=!>TEZ8wt~}_xcrvvd(eCJ zr|lOl7jVTMFLUnzLthddl_%C-30^3=QK=gu@+iQmACtT1k4&vp}2f*s)57sj49%6cnWPHw! z=DY8y4a-ml5j4=HDUotUnOi>uq2{K_7V^PCc!ZZI|_H zSjEouhvG?wX?_QW^6j_QxSL_Rc&_JD!CC#1k15doWfh!Gvy%axPV-7OjSD_QL+aI( z??$hkPd297jb}O1Dq+y*vm5a*`W^?JPg^e=~Uy zvzNxG#$I8lLlIviReiSFj~CT5KX-=3{6DT?3La_Jl;F`wU*T-(8#-ks+*q(G9_px9 zX@c6qPhM+qOOUJF?5oXNC=>LPz@DBCb@kSUkxbV7t))|9<{Wu$4dp`f-Tbs6sb zChDDZP`Ld~+5-5PD-pr9#IE|Yaf4Evl|T0c!?D5KGlHiE&|6^^IHHp87QygjPA`~G z+kA)q%|p$-nS*^R98x=vciIJo(ism2=`GKy4=19f_cEsO*vX33H_Dw&rEJzi@5w03 z6@^U7zU7(^pSL50$}2(Z_tq2?z;@qy>gzw(5q}JjKAI;#k9ka{)Cedi7c3`G=qk&;8%ZDcT#;PIvOLDrD-az79pv$l?Z-6}}kNrMiXhZG}*XyzS;GW+jhd!P$)jgL&$zA3(iRNQmSS zcu2k811M*triv*;Xzq9upbaY7G1&PsFNUC4GdlY zUAFxa+u;^pRt4boxEsD73t*qpAZg{T+tz=$)|A~zdaKb3*OBBk-dCy{ofY*LX~Jbk zzd8TeXg^GjiRJTJXsNo@)^$D>tz#`_R ztIhV40k3LvTviF79~Iy@KX;pmUeplSF6OPq$^3>!C6pTUGjXRDjGjzp%ngSkvfq(8 z*WU&92H?Z9F`QkH8swY(k(Z$ris^#O`Hrhc>^**>#W+9t1}#K~_#uZentdji0jj_5 zJJW0BvfKnQ6yd)SDKT+b^imr|0>N*Pm;48WIebqdM3OVW_px+xxe8BXTH*I3NbY%z zSa%hjZQ?VOiX6ENjQ)19=Ha2!!A&7w1)alqJqTW4=(aB@FpueI$Rzm8g80V zo)L^LnzDaRAoW``6c6bgmg3OX4OLk)E^6es@nLJOcvb;4EOL)rwOtY+1dR%ig*&RL z!-t-yL9P6YMustMLiDUy7r%S{w3q0>;zqx>@}qV*`8B&}clFKmG^d}j70{pvY$<8h z$$6Od;XZdYth|p1`B^0y+0h?N{q%Ke^1o;)hipq8_ zNh1y3n**Ok2YN=fb4iMzHwT}YKrN|*6B*jHjPR|{pOg{n@nMug6(5`i_9=`{3ib5y z-9)wap$Z-q>V@tcJTvJV(;v$-=g76Av)0Ep$$yVuw@DRi27ELYctqXrRDycHNaC$O zlu=0$9sP@abQACO(gRWRxY-Ig@%^MVzn(OQ41IYw5Dvzl3bs?5A&WV)!XxrO!ILa3 zmh%Tc{iIwaQ^g$?vRM6qz7s)me<{~05e-hOK-`9{LY!ENGT%R5K1bfihQwaHL#GQ4 zejT)(ah2O{fxVcR&1RWdDmOJsK;}}G?W=ra*JxBy@1o;ds|j9a3NWjGw(Ig2 zgo@n5jn@+dC9&J-4_y8(&P>X^^gn>-{1?r=kg6>S<)G)JE-Enhq};^7#>10_L2{if zY+U*t_AhR1^u>geHIif3szS*@bK*;!=;5cJK^4+_z(9t~zm7QW>0Zo-iS1Lb*Rix^ z&!3JKpXr3JRsx~8JFN}DFB9tjV(E~VRD^`E(R_2cmLVE8JEqvI{F<+Odoxv${r@_f zjQAVqAjgJ{mYqN1W23c66PiQyqUqkj%m)8o$!cCClO3fBLGXu9s4g$4u4dZ(wLhH! z7x{5wK74&~p?~K;)>^*Ny)f^P9_gw zgu%uMQa~o+vy+1aN03i=o|J(;_@8u5|D=oS#4U>=6CsXShPjY)98&p^Gxz_{%#fv5 zL$8v#*Y(oN6C%nhctrLoT`7-E{x>Oq2OvSFG6g3#YuT)>S19uswn=o!mLu>LBq^=^ ze`2Nl6>B~|*QQT#x#pPm>@vSat!*@&|8y}3s**4BvOD~@t(k#*7BF3tkfUI1QobwR z^X+H?fB64qW$-WGnIN6aaMIexHxM=jkV74N2!I;x^ zBxtM%7hDy8g>x%7HO1y4>Gq!zEcGuyUkWgcQZCykDTg|(AFXR6oH_7CKmQZQ` s`&-ys`M-=1C@UV!FEalB|5W;nM98WoU)ZJZ2m}4eN-6@%KNtr59|`y5LI3~& literal 0 HcmV?d00001 diff --git a/fe/src/modules/profile/utils/member-digital-card.utils.ts b/fe/src/modules/profile/utils/member-digital-card.utils.ts index 81f23ed..46e28ff 100644 --- a/fe/src/modules/profile/utils/member-digital-card.utils.ts +++ b/fe/src/modules/profile/utils/member-digital-card.utils.ts @@ -14,14 +14,22 @@ export function buildCardDownloadFileName( export function toProxiedStorageUrl(url: string | null | undefined): string | null | undefined { if (!url) return url - try { - const parsed = new URL(url, window.location.origin) - if (parsed.pathname.startsWith('/storage/')) { - return `${parsed.pathname}${parsed.search}` - } - } catch { - // Keep original URL when parsing fails. - } + const apiBase = import.meta.env.VITE_API_BASE_URL?.replace(/\/$/, '') - return url + try { + const parsed = new URL(url, apiBase || window.location.origin) + if (!parsed.pathname.startsWith('/storage/')) { + return url + } + + // Production serves the SPA from a different host than Laravel storage files. + if (apiBase) { + return `${apiBase}${parsed.pathname}${parsed.search}` + } + + // Dev fallback: Vite proxies /storage to the API. + return `${parsed.pathname}${parsed.search}` + } catch { + return url + } }