From df309d088cabe55d337cc6101d3ef8f259ddac19 Mon Sep 17 00:00:00 2001 From: Laurent Dubertrand Date: Tue, 10 Mar 2026 04:13:32 +0100 Subject: [PATCH] PWA --- README.md | 7 + client/public/apple-touch-icon.png | Bin 0 -> 16463 bytes client/public/icon-source.svg | 21 +++ client/public/manifest.webmanifest | 40 +++++ client/public/maskable-192x192.png | Bin 0 -> 17634 bytes client/public/maskable-512x512.png | Bin 0 -> 36698 bytes client/public/pwa-192x192.png | Bin 0 -> 17634 bytes client/public/pwa-512x512.png | Bin 0 -> 36698 bytes client/public/service-worker.js | 77 ++++++++++ client/src/index.html | 7 + client/src/main.ts | 8 + server/dist/index.js | 165 +++++++++++++++++++++ server/src/index.ts | 230 +++++++++++++++++++++++++++++ 13 files changed, 555 insertions(+) create mode 100644 client/public/apple-touch-icon.png create mode 100644 client/public/icon-source.svg create mode 100644 client/public/manifest.webmanifest create mode 100644 client/public/maskable-192x192.png create mode 100644 client/public/maskable-512x512.png create mode 100644 client/public/pwa-192x192.png create mode 100644 client/public/pwa-512x512.png create mode 100644 client/public/service-worker.js diff --git a/README.md b/README.md index 01e18be..c46dec1 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,13 @@ The repo also includes a multiplatform SwiftUI client in `apple-client/` for mac - Generate the Xcode project with `xcodegen generate --spec apple-client/project.yml --project-root apple-client`. - A build of the Apple app automatically rebuilds the Angular client into `apple-client/WebApp/` before bundling it. +The backend also exposes the latest Angular browser build through an API that native clients can sync into their local `WKWebView` bundle cache: + +- `GET /api/web-app/manifest`: Returns a bundle manifest with a stable `bundleId`, latest `generatedAt` timestamp, and a file list containing relative paths, SHA-256 hashes, MIME types, sizes, and download URLs. +- `GET /api/web-app/files/`: Streams an individual file from `client/dist/client/browser` with `ETag` and `Last-Modified` headers for native caching. + +If the Angular build does not exist yet, those endpoints return `404`. + ## Backend environment The backend accepts these environment variables: diff --git a/client/public/apple-touch-icon.png b/client/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fea2d8e9c2c71cceb557f694e8722efb05d9d5f0 GIT binary patch literal 16463 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 fwVgS{#n{gA|4-9E{u7R%0mw=#N|pa-6!d=p8h + + + + + + + + + + + + + + + + + + + + diff --git a/client/public/manifest.webmanifest b/client/public/manifest.webmanifest new file mode 100644 index 0000000..79636d7 --- /dev/null +++ b/client/public/manifest.webmanifest @@ -0,0 +1,40 @@ +{ + "id": "/", + "name": "PrivateChat", + "short_name": "PrivateChat", + "description": "Private peer-to-peer chat with Angular, Fastify, and WebRTC.", + "lang": "en", + "dir": "ltr", + "start_url": "/", + "scope": "/", + "display": "standalone", + "orientation": "portrait", + "background_color": "#08111d", + "theme_color": "#08111d", + "icons": [ + { + "src": "pwa-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "pwa-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "maskable-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "maskable-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/client/public/maskable-192x192.png b/client/public/maskable-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..874f5d912ac3e4c7600e843042c3158be51816c2 GIT binary patch literal 17634 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 LS3j3^P6|`H9$PyxJmXUoQ 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%0A+^O43 zmm_&gu8D=g_|sHRIvC8?wNW&7aV88+42L%!yRhHCa!E<(A|Sv>Soxv#r-n{whtj+C z?AWP^A=Yo=Q4>~OF--(ovt-IjX#sqp)Q(Aah?3tM2*;M6`m`HUbXZoXcScaS$B9LO zzesYXxJ~9rhTc5p+p5}-7#k<+*R8SdB(1~8EK5_~T=|&fTpF#mXgr=Guv%Vz(%(c2 z#MVsoQB?Il_~w`ZPkvMYI`n*lLSe;q3Xe;XL_Q0)5sK8D=+Xi28D5+FUr!uQDnxX{ z;gp5HSAQ8pta3JK(qj$OwjLydD(t6K(swhrN_#D(W=H8Sn=1UJ(KCOA(5g)6 zz+1FdrDQ*wpHP z5f0rG+;lu>a196&%Q{A@XFBmrMAggcnnl)kW4F3FHqSMe zn`(Osgmr72Sv%6JfFvjoGEx@EiT3?U7G-6~<4TK$d{LvBD`{^9ulLq$;$3@-Q_y_Y84M z-=v!r-0PPH>+7L4wlCo3E&~p^|g3dh6Uj zv08zOqk;7e8DCPQnHNaFI2G0OI&H=g^bc+tS3boqK{PXfhSYQX0c?Dy@jMcYIqE|3 zAFcA*B>hE}OOQNZz!auR5-O1?CRCGQC9W4MktO(BP2Ex(Q*lQ0FJJU2KXWN5s3=}} z7=B}DbolXfhYfy((qPS~9HUvE<}c)Q4C}kG`!9-~W=^fw^X=}FuIQTPI@rveE!NB} z{!Hzei3MKHkp7-Vk#v(-3&fa462hJ#GN@oym`7p3KKSef3fd|pJDezz&w)4_kV+rX zRJmBob%0e%Sj$hl@i_tF+=0b-8*W7uXVbTmn&NhrqcE*M zM8N{0iv&ySyt^4@N7CAw9vAuKDUzn!s%!fgCeUu_u2PcG=V))|T?1$Fk0~MDUt&Xf z4et5#s?wrPVJlT><7BV}=7_n%!M61fva)q77a zv{6QxB|5ZW_Hk7uB1E5Egm0h;0C~g<3gB$qVwx<99#2ri>DsMhQu5S3`^1zca#KN& z-;RrdyXRFaK45E*V3++k%|atgi0ghT%RIaKOyV`m6H_mnYSsro4E&7!UL3d4^I=M# zNL5`K#s`M#q?OS`%Dtgbo!Ns5BT(aEU96Y8+;;bj6=NoNE`cK9^i8pU2_EN2JieML z(NEY8fXW-Q-#cpm#s%!ST`9e{xw8jdsBQWx{W~KfdHm>^==35)GGtxJ?gicCBE(RO zKhjnGOQafT2$_&>E7>S*0IUHcnvdf_c$6!qk?_{8?wcTtKvW426*gLEaARfYoHwS+ zHOefZJQ7y>L)+Z*i`N*`ys>e%a;uj>Q@q|W^2wHwiXT7McI2w_HK~UBKg4!YZ*xlq z?4`OU-z7X`_8x;O!X-lY$U=$go7NxHl49^UCuU2W79a@F8NQIgfJ(ur`kmK3`n^mI zb_hu5lo1X*%E;(*mCh;yNsD)3C=#GDIc$#%a0s%~PjS3{3FckX;u&8KbAVo1Cye2J zx9yyE7}fro&}yq)h!zVBTpW7LEO>ZAMii;1N_>|DUEZfCgNI@=lhwnQ0tl4Li}gE? zIiGA53pb2MLv@0`O^$P~D;^Vz{Ca!o<;-84oQcr=ZnwY#i+nNlp4FD(9>}dQdLVtQ zdF4+RW%{vNobA?Lo`vY|`lNM(3qR3tcoXt19`3aQ7|4}wrcrzuRNVF@R&3UkhIA1J zWwK2FG5n|3wy7q5EKe9S33pZ8whzWdDuaeh#A;ZmB;K($t#PzV9BuhnO87b zeaT``^|?Gd_)H3(w_8Wx@q+zgE_j@mS+J>7&cc+~xW35T_WF6E$Eg6DC#>r=?Ttp% zS67M*>J$-@>*!JnP0OM#v-?w)xiB4`MRM=lhl>v-6Lj?jskGQGO09Caai*nsnsRP~%xZwOjzcdr6#ke&~YY zxtHsZ66MZRbiU%bXhWb#)Cv2iIlNa-yhvbU@5|IiBvPg{2MlsrkNJ0j?`tXyrby47 zBl56{NU&v9sejm21G}`(5|d3_zRNoPfMqjVtaNs`szdpmreHlwWQ{);dg!}d{h~o9 z1OTh8mfRaNZ5oDLujzL-GuBt5r9FBOkB0uV>zj%;_|P;!5d9{SAjd0QJLTN(s_OFS z=F#<)f{7}oO*hB#$ORf8BVL;59JJs@xXWPr@}#l%j$Bz2hE326CO)D+S9Y5=oe*ad zVtWPSA}_bl(`#F`HZXem@sb9WA4;I@j))KB=*GU$Mm$%%MSp2)@vPSwnX~C*Tllk? zT6XS_l`A@#Uqn#yKk9Pl#NgeUJOSy+F(Sq}vyryumZA=b(j z1o3Sq)$bUa^HI;m`DC0jzB-eFd!le3@OI6{V0^r$1#%P0xepw~R8bzb&+T*fB5}Sd zCCAcbAq#fK7ajegEpSLy$g#^-!}%TA=R}u@Ym7b9(Jg~}k2*A5X({5QDmPgq0AFS= z7`aDT*k=Gnrn)6f^~f=n76Wc)AU(&sawEp4YJsNWUZABmr}3{NHB??wziUqy5q2~o z1Fefi>AGUOwkNU8fymT8Qtr!I^emeGWBp7iC(O2jusFuKAH7(%y7VxYsM1+4O3zLl zlVSICr<%wrHEs;dG|$3bv(~b)Zk9Jv7PtO6b==&^4v<9TA)$+tQ#i$*sHnZep^!IU zzRogl#RLC@9l4q5Q0H3G>?66yMyB1BZ;rBqdO3iHJreKulmA+uO>Xt*ey@QAW?He2 zO872X#0*Z(i0v)?+3I^|yMPQ!h-2=F!39!76yl=cXNqk8`^=Ic<9!*@!z)NInwUNE~=u>2-A5nK>OXu}kf1Sv2byr!m($m{ob~Ka<&H+Z+xL>hw72!3j9s zG!b{@sdkc0DA()lmB>NrgE70IN=l^Z%BlrSNN>tDn1T=%j*GMDya@CL9u6uI9E_KD zcY9m_LvvocAEm+e`X8|xHcu@Ci@(woZf|AV;YgMH#L*4y5I}re)^@tH?JNxp7#T4e zkaiUgK7lO6O|)D&uAOMUhH>CfM@7?tm`ba#@^FS~&7_`*Brk~A!emdt(j^L<{h-e* zn@&CG!Iv4cFtunU;Ox|kL(;TUqI)g^;D^X>anD4|Lswy_N8po{e4vZm|HnnRsj$hg zuUnX!pEbT@JJ_u>(FPZYFL<0^O7ZB4TLg+PlP1<~>vFBXYBSOid16uVZMj#TJ6`%Y zt%P4+3L}yTck%*cZ)q_^@my#XX0Xz%yY_ruHIMr=%DQLm5J-0 zKwIA(?Gm5Q@+E0kMiYe7h8lt$)<=8L%T5hh5zu#4R28k)HZ6`@GNZ5l@j6w(PK2Heqi5 zpGB}>X<-VBG?rn@jCl!aAG$)oRs0a&X;kZkIEvyqa-#`8b--6B08$VH+#|%5cLg_~ z%qz+Rm=LfPFGAQid@Mk~)OqR=EYZXul)bDIj(f)=76k>+<=6=o5}_v`bx;a2oNZ+V zhDG~-(xx@5KlpQ8cOTX&^gJb*dud>riWKn#Q^j5w4o#EoN}SemuKii0I@9YG!t$|k zQsuxZN^zDp6d5p{4by z9F??7or{hZ!1L!+_MJ$!BcH^Pdtra@V1Uf|8xghg;?g$maL}OLReMoTnZ)g#?lYrS zO1*oiJX`)3AlA0zTYt`S*YFyW2B_z{iq)Mlp`puevFCsD!@Q2prM#`-KaWS_zEw<^ z9g(Eh1To)zh~5E7K9|hwPM^nGz|!*6;c93^562^i+N~m`AepIm1NI{azaVBZHgRHR z=y;=!%tKY@fBe-^1ME3$qz9X^LJJo3fOECro}k0{XPT3 zZM~wQe$b_lXg_!4d*Yt70p z*rC|No25I!68^esCRz?4yJ@H4sv3pgg$I+H5tL zx3SlGRC-K%7j?{#G&`LFD^l`qgLEWml6azQSm0(^r4$>;aTEWVNqP9QCg?f>hIvj1 z10m`!t3i$a;Tl&y`?UPUFNf+AVqwtG2VQj9=Pz=kpE`f2|Dg^10bm0iAjVGBG%{-n zLqf6g;ZRcSGiLw*J8 zOXU3bodE?h>=$YnkPhGZWktph4tg*q?WW#s!SIr&{&1z+p;o3`fO6S}!|OHm8wFR& z%@o#o|GiIbd<-J2QNV~Z#f|o%P6jFV1OICDp*)pixrJMVHegMPWA>uO)Y&&#U2M>n z;>fU6+n4sqqXQ$X#`W-vVqv|Q&Af>jXs8}G9XSq_SfF{eh3|+5?&Cxz zapaG#d+rFqXqHnCrm>REA!bts0UNT(s=7EyK(>$mPJ)WRe4u+=tn?$DZY+}f6pshdJ(EpE>&}k}t`>**v$WBLHT?!n=6zizNrK8JOc|NCcQw za$*f00ghFc68vu{*L?U%ag~{Jc#gWD0#^gxWTq!MP=JVV`h4XZF&5dLlZT^5z}KUm zek8`y@-I^~toB=~f*}bswgr&$-$8k(xjWHWG=AzSu|^Xl^8#Mcu!v^ikgk+%-H==% zVi@4*Jw=?KL4Z?CaOYeQu_cO!|UsLV8}Lk=qm_{(&C|L1VfH{K5u!$64I|F z=`!c=>@v4|aLylqBd;}OqtW2Wy&xzC226%bbg~FAw7w<8k!?5N@=XpTiLh+SpC7G& z_Lwh=DIh>5@7xsd`V8(+QC0(lf(_-o<2uiCg(^q#hDM_G+%n|yGr)=uvHC$K}N$n$GV3Kh?MZkWE z4{ROglHIKn;I9OGau09UEX>dS{!;6%E3p2TfKk-nm!t=e4%|W)KEl|XQxvhI%kfm5 zLh+w{Sl-%Ie|(B>H8@UM@nN4@xtj4@Ds>8cO0_sA+>jmt{~TFdE}L82i=q*Evc>zb z%~Z{4>62V>rs3HTPZupvL%x#I{}as1w;4ch*ytZjHWQP$hl1wQGiF1$&?H}&5tg|$ zG+p@-$x6pI4E?qm3xw@0!Ab5@k1LmxkkIB!xMKWb{E48V&zEnXRYk&aWI_thgcx%C zSP+(PpMX+tQL~5dHud0yr9xDYG`F&V^hV`ypZJ(x&j3PPyDlp^j?8?I(c`YEk^1Oq zCMPJsZrZ2eklo`ABgPI#a19e_z`_w~%96Y*+0hkp^wA36$`3K~p{xf8k98%*R)G-N zS9q;!40gi%-ES##P#)}Sv~P{(c0yWq71z?C@DSH8l(6;9@h6Pflnyb2?xg zffUgNrG1r@bNZQgDwv#Kd9K;v!1vQ2J-o5&?HQ63`)7fb826gUdNy`taTyW}Jyxt@ z9-6zj1rDD_VcNmh$B3F}M8o*ARNZ&j1dW@C1w<5}Aw!seH^+7ClETCYOJj@1&_BaZ zPqnC`pzU^=z@Iv~k&_^QdPYB_V*O!@#6^GYq<=*2V}hVNJ4+}NxA8N2TI@+Sc9#pgEBl4G<4A%E3yP|5*=OpG zKOz7p5{=v0KH%eCW(E;n5kYHzG9!IKuZ~LFr4(hyzOlZ6)`rG|=qv4yK^FK(3|S;} z_!l8(F6e0c#)&`cK_`05q7**zJ=CmNEE0Ofk=4qDzRc`axR27o!TS%WH2!d$=2cMkk&Ea>!?zC0 z4^LRIGb&zd!)R9QlUTbSguMPF?~lm4gW=uoAhi7V@@c?%rnzEe6l3acst(hnI;!I5 zH>c@Whv|p(rQrNlQR^cG?WSc2cv53BdbxNPtTGM8logRJFmz{BoR)6!+i>mYbcfnK&6Lfj z)Of=;9p1Q1KI6@-CC4sDQbLrpo^*-Iy#+yY&S#>YKPv8muqrXGa2cPvV zOENQ&05#+A&ouX6n!$g^a%eHdY!AWS{3{10`0LA&??B7`61#b?oyoAh7N?4yjd-zD z;ZJ;TMe|Cwhj*g6(Gv`ycuP3(Xu`vr81B!@$lc~!@zfoPAWSE(X_t}srd1-tl z8*R94v6zEN;_#9t@Z`N!TaPXayGnhj`Bu7paNoe&OQm=TBA`3qu@t1dB#x@Hx1K9! zGiv$c^$&(&aL`=_X%Ipyn=+i}Xea6X6<$Edpt8z_>$~rYa}Y$iT06t!8fX!Tcy9Dp zd`to^-lxH)z_Ul~sXVic8@p%q(XL@P2X;oi(D=thDV>AMC&lQ7N=<_WutdYu^a?Uo z18%)pO4{DgS=F~s{f9Cm!wM1Moc3p~wIp5ZD~PD9k^LyXT{-FoWce@qX)X-Ows_-R zPCbiRE=t46ixHY#ukAjN-^O!X2&a!yOI&xQ@n;N0T3Y_w!QzqgoN2FlW}qQPp(YGl zn$%iyB=SDi;_p>|P^!#Co3cch3bzZ;^K35|txIN?$W&|Iduo_UDjn;92%4x6Cf(Y3 zw+Sw;Dh!4aUpHqt23Lo(k^beUO8+VB#@WJ)N@d_ln!{k?=@^qO~~2?rON zxf_;mfNQlVBqZeMC&fO^9Mi8PQ=XyVVKO`tR;Et1>leEv(a(f{FMuRKIP3=)MsG5; z6kWZQ+1wjR-^Jbno7l=6$}$6DKYpryjn3-PAKK(BL_M-W6_oQrou%&Sqwv%jh3{$-#U_cEa&Z!E_HNO%--^7bH;_E1-)6Jku zvy-oMB^mH*-=Y)zO>D!EZWm#~z{CniKi&GqMKsuhH;4#^%$$72c|qD%!vg8S`Fbce zZ>9>o&i8@Nnij}UrxY>_wNIAXOXB3sah@}-F{!_Xc1f3J#s)&><5qV9m`HNxqA)*g zJY%^{oE|zdsd?{`6pJ%2y;!wEOiLLDED#y{o;8((fE+h+e#XClA&?$z!Hs+>BudSl zXjjARqJVeb6S1!zJ=|KU9bZ*xQs1F*JJv~m0a}Z@vU7&H?S)+b!atHaEE=~2r7VB< z;1VmVoYPou?(TGS=uaR=p108FP%vJ>{Jei^7q4L z0ySm1Vx>E~C00NvSS`_QrO^I{Jm1lC9Zlrr;@rp6f7fx^3=*56^RPWIO_Kc! z@8%@^>pAD!DRil0;`UPLV0MXKeq*QFQ1AT7k3x46zW9xFk^a>_*hlEIzlottTMY)I&gX6|=c?7sYrh^sc^!-IT4#2eHRl%x0opO2I=tYe_a6 z)vkNVgT82jc7#KHsj$kcsHe8XU;_p_U;z6#vwKL$>nA~Maz6)#6{IR%s|9}&T|1-T zX?dZNHRK&a*_G5XBPg2yVBZ#}3jvo%mR--}^6lT*z-H(v%J>3|yzm~U;k`7>+PgWg zPtz}rrA-WNB%%i2;Y%hv3Br7t+_{kyk{bbW=dPyhW@gBW2FmL!QAsAK3bk+XIH!6! zkXYpCd3F)VW5xDaT1;k$)R20 zpBKtt5g59!QzL6_;x?88KCsbW+Q8&wt*E@UAQH4%{__=;4fxGiEqQJOz9nf&F0j1> zD8|3!)KUM#789g{t%Y3~*d36M8!ux(H1me=WRjfMJTVHS1_1C9Nl;;-4wn!3n80A3 zfj)=`ENl3zr?xW1@ZN{N7J$mc={?nK2>yedfB#wowF;zWd+{^md3`?Cdzm(cvh?40 zBKQRM(A>Ay&FEI6q57c5fBQH+F@!+kAupxtoL2YH(64ZwM#YP_1RpM>Ad= z<=q%f(zl2~i9@g={_}x9WnoHxSw*;+{x@+ilUkALfYaQBqzH9~7Cuq3Kn%gDBpa6Y zNrO9;#c371^TUygLw%ZIO{F+1Hdf0t+6BAbXey@Nxiet)2?n#zR8&Vh zXI~fb{7cdUZBY)&RbUb0UnK)b%R;3&*jY)aYTCPTY-25)DL-!9cA#d+ZekD+mdVRK z9ddrYv0IC97tQD@4Z?~j8tV5x2s6=f6#K)ss;IoPW)vz9)67gk z;1JgJOQE>$M3Hh^@l}ER339SLm`T=`u#<%P=||j^ZsLTn^OmB3Bse%xfBQML+{%#3 zMEL2NnG8hnVcL6#Wp7^*GgAAB^;oIR9%uPXznNc_qe{55fbmlB^WWHxVs6W7z`c)t^r@6emGO%~6Jy_%_4{>oVIb`A7`eO?j$0{wia-2>sC3h7 zTEmE0;3*mjG%+0WXA`DV;b@&7p&6sqD;Ia7QCqu^b_DP3&Xblabw4Y9cB)q{*Z-~p zKToHq8FJgG1w@)j`$bx=WV|rtB*RMi=#t@d9Bw0^X9_mo#K8`7wv;P{$#tu0P{W8X zRm>Mj3cdwVZL5tB9v8rhNwDryUGdG3Z}szYZ!QuPspb<%4mW#G%(h?{jmyu>NmqsS zUPkfal0a_sGNU=E{4!ew9s+W;9g5_-7Y?fp=uWgF2gkikDw#Q0vwhu5!WS;o!E=1Z zdYi1YVm)+h#%lr$$@A?_iLZ02AuTr>hEX)$eOECBKO~9-^}&OV*55a!6p3XPW*!iMwJzT$L_}|@RyKe< zLqG6s7Bwy+tNzbkR!F=#jS|C8PS!UMxC;Ew9N_Jv&~u_o2QP+iEF1gHHR|JDlVX2% zLcv=#k`97s0?F8RV-<~Dpf&^%YK6*6+&yJd@+ZtWSmB(VV+hU#?`JP~4fPz$@ANF* zzF<>-zLR7Wk^UJ>?T4_f#q=6$S?QLQ$HrcJkrLx|muVJELN?&7B&}<_K<_PM2@&){ zwhek%cWK4%`ot`=IVe!B%5y8kii_iH9%7AbG~eI%xJtD%6Dbef<5OsJB^!LP{S1_+ z3fK_hSU_;RoPK#F_^po#ZRir6W)!)4v@T!jPbteKb3Cz-Im@1RuTk?j^k~B_tnCq! zakxtH+_Q&QDY7kD8@z)VEU{8yYIH#a;&YLoAm{uvbusvU2O*~kQF7sf{8u*T)cIgU z%apu3Qz!_Kg~z~jYZ7!E(oG9qZclNO4(daQU%n0wN8^4{g=hY~7M z?A<+szCu!@w!lRv=!EI%J;WEhz|&7wt z?*&_ddi>KhcESu~R5rK3I}cORS09Idl@troZ8e>EOYl~{iXj<7t3?f5j{ zU~PmI;s?!Smv#J+WJw(Tdu{M$_TT?ULO0P4KLNO0sI;ptv%tb+TZpZkx8v@1InKBp z96zZ0BQkFCw1NqH+DXu`ZK)KYVwyLaDN<5jk6pRVG}B5lgli{B%#vpWiMnyG$O8tVkro7X!fzNv8&)~Hqtu9q@5(CKeHR)x{`H9otNwfo zkuZlFB7}AN`foB|{&?UR)boDdK~;Fo{NkZZ5o1pPiRP#O-1${b{UHv*3BE&?om+Wa zFkjM$W*P%t{A^Y#7L-H7K?n&Iw!kbR4Ad=CO?QE6b22NYzP_ zI(QZnp9LN^+*(z?_h1^FtNWK|($q+J-hkaIQ$lz~V)5?j*z5M(5V~k}B0)8fE@fJW znn_U7qhKrJ^9$oNI9`66Cik4T9p8l*yjFXl@eaEUHq#!UY!}gL%jIbBh*>}L<~utn z9-w!Qv1GE;K)-GCsjn5O`g3+=?An!}q0(8Mz*OF#c(%2?t5M`==uyo)vi$$l_0?ff zZ)@8_E2$EK5-KSTO6L}(LmEU{MClHRA!Q?_BBg{%cXtg^Dka@8h|)3izzj3r8r<%^ z&v(xIk9v8{uhx3j)6abm_|wkpRWGZN^3NZ+Y+sg(>uasEL4#VystEmDtCX?|0qFnz zNb`bR^l*Z(hl3A4YnqL;nOmegfW=xNlZ$fs)#~T#)032(tjB5tcP#sQ-G5lLx*_Eb zPcs&SueRpOnCrxUXQT=^wdcCrRR;QNSdm(&1%&J*OU}oHzZN2sFi|2nBsb(<#xm~` z$O*;%&}L)^k5|P_WaZo%pCJnmYcF7$KwvN@AJl@dne)dtftJzuy2qM7yeJkxmADAs zH*6w>v_bDE=xl?E{I4^iq{8c-XQA4xXi+ltxmXX*%yh@ng?{xRT}mvYPW^_1!UJl{ zQK};G+tF^8G^KGFXS@lK5VDE_pIx85|C$2A~yi%V6QCN3AN%js`6Ex zSpusJk|nB{L_tDX!Z)+r9hGfvfmz85A0mmoS5k_B`!ThHd+ROWP0VJTN`5?6ej$0_ z;cdC|k?2X!<5xX4gL8ASv4@NfJt4~|`o7CA2bQ(DXte3CwqpoR>8}_x>#Jvqcb}T0 z@u!|GSqw7RYNBl1fX*NhlNnNHCwi@KjRV_IBU+r@poW~iR2a5bL7cl&n0vAGbF~8) zua>;1Y%}aqkz&kpnNVVoN~W2}r>`dqhW&h)hU`<4Bbh(CU|4NaDZZV0%Vq8Ds8PK? zgF%V-`9cF;1ubtw3zN|9=ZKjSnTc|1F|UoO&_0ve#f9$lyRJnvo^L<=KrwHje?Y&l z#i7ZTc+G_{!;e6!pHlYtetZHONUxmXF1#@6YA{GOUu-GgMZlazV{EU^}nw_-)EN7}iO&~EoVt_^B1xxdC`)3xJ95!2h)m&Y1`}SuK zedZ?XkRg@j3;UkR5^G*h^|<+&p=(cPj^K*Y2!x{aVF!mEH(m>;WsqBQfX^2tInX#+ z-wjQqK_=~G)~yyBhDN0SxP;b!bLUlC7c*^z11^FA?!d)%sDTj7i?Qqt#k8x11RZZr zh|P4F1F?}PJ>;>mg$0Blxzpv?9K!_d}`ePA#W;iX$21le^1GE`27IbcTT|8J1F-R`3D5jR3?^-JYB* zeT5w%ls5bRqq1_P&gHd{o(l~cmjcqSUq~{RQWWX(-9iqDVT;yPb>8LLm^5-WO z$ks6$+l7xIqw8(=ENvn#ty{V${&e+wUOOJd!_y0%Fm4uZXy!-jwK*A)G3R#G>10RX z8+1i^jzFF$N>*!lVgBwDNB0KT z)3_Gmo*J#&v|-pp^Vx7I%zDq%9_7dEsLKm+^T-HfrlEP1ItP=dIE8+GUENQ^+Qld_ ze*!75?HI{a08fJT6)-S+=DTTLLyry^Xph6}+i)?H?ec-5Y4YQX^wfKKuWVw`j3$j1 zUw0iWLAX5uzi=qMPoHS+;dBj2wYl9bV~%`&*mSS@u4v7%6oN9(~0=UK#4|C4#S=$1JN z?TE~~dnZe0pYna(933VUMbBBa+AY^Hxa<{;Ev|-B32ro@MC)u`HJSp?OXD2o!`>S~ zJY|En{kH&0}9{Y#dtCLgNlqob03KoY>WWB$zAj=(+fINAIv0j z$GbJ!z62ARryzl|XV@g{)fV$jInXGz#ZI+a5{A-1Fr??E6DW^>L!*v~cHnBtvh;_*G9X#iwTT z5B*VH1Mt^m12K{`zzNr6oNK5*6tKo^m(SW#DenH~Fa^LNz5UV#j{~Atb{{~6h{P~W zH82g#?5((&=1>I3Wv$^#_5nNtVj0D?(h!j37nvMb-Q8lY792 znhMXMp-yDKpm|~u8PjuFK|svB zPt7gngF~M&#T9yw-mF{8z+@f@P=rCV#h;sC595R?pyT_jKY?31WnmpBWN91&5yUt%csc{pDJ3R@-z?|{t>p9p z3`|$F&F~zdGLf!rEZkhpfScs;)0Rg}<8qiyznzdC0fVgwclb^qysJBSehYF)Zs@#T z_;THFn?t&)RdUdU*Fxp8#m)5d;21>39(tiMb5Ckq6ZbNW0td71MS=n_${8Ax8;I1u zeVbkpv^wG*_|hgGh`*pG5LXeK$ub=YQ}&dPms?jz{Sh+Ik0T@`2)Hc#c?_)CFSu#x z=qfEYET?_6k)ocatWI~6DfrfaQAF`{dV8hRe(5s(>UL6<1O z{GL35YWz&oTYs$pQ!qHm3W3T9agse=HE*l&pSrf6$3ME3>G4) zJqgXbkC(nuS|TQ%e|4odZ_jhGb9r%WdJBg5oHxfN0e@6suqyxDqGTSca^Cw2gfNLqPf=)T;x2;-X$ikmkHm~(!eew9!* zki}))3uZVX(kLl~06z;>-ksh-&3`(|>90`_YBk~i-Vep9k#EnR4}sR58GU;9#HaK7 zj7K4z%$VmJ#Wr4~7AHqDt>52XUii2-U|{8!Md-g{2{#-t;Kb+nx>raYG$2Dr9_jx~ zHjKY{rAc{?M%-(I{!k9{d8hRq1ZbtYqgyO(ANt}zNuW3qZ}Gk^vq_N610}ctSF%^e zC+5ZKW{wwySm1DD)?~JIto*u#;MPYF6XL2|TGi<|d{7rE^HYvFZNXu!N!Ssz3ExaMz}?tuNC-BD-M|K5mp4^q5tTL& zuJ>;7wQ`!!ywHbX%e;x!CC-K&E-!(fJJ~9m_`m6H70WHH@p2WJ|oZodfAqGe{#(zEJh%lb-@z-|vxCEx94`0cMlE zblhOs=(acZ#AyTSk$7I2{vukRfqHM^6R$34tP5xh+itjkCg^c{k2=IQ&YdV`G5W^G zez<|iRtnNlcSeotP8PN_T4b>eJpSs67!zwYuxADdrFIjLC|2l1u*}pGwW3?c7r!la z|6sr2Z#xU$85?m`926{+q7#+vkDrYnpj#twxgWzu#d_(+=%6t^HmDMN&sI&aesu|6^yUVZ!;;L2NYY z4O*6Q#pSh$#?Lq*rM{hNS%FJOW1FL5YtXn~hCKf%q9 zPg{o=aoF6})M?wdos{HE+vbNyyCVILJJMi0gf$YtUXBAc#96u;p`@Gcey~ zEHd#UO@H=GZLf>a!(pJrZv62%a_D@q#dvdTo30p?sGa0c-I-78m)YP*wF%~glnWTm zWE`ncY3Qc+KJP!pUQUC?(nvA78FqAQ*UE6(0?1JCUo|!7ac^ho0;!h>@SIkUfG(_9 zg0Y6A3Ac3(&>^Q+Sk2gZ>I)4zQ>@CoWTGG|mfu@ZttI(*)$|nlAxjG*D|U|YP2CmQ z*eR)pr*?3aOHO%b(e%Rl{3so&d{$~*6T$)CPK=s3`rHfxm}2p=9W!LQVQDoZIC@v8 z_mp`FE?D5p6X~Yd;2TWXJ%l7{=DHj*2H)=XS1T-D)2Z$Qa;7 zMk#wBcp@ef@`}KZi0{Jh06)@3cf{q_I|Cp@my!b_dC-?<{36XURQ`{F@PeJMh6OC7 z4`gb6P3*^uhD7luT$ddu+-XGoF`!dEljZaR+9i_4J+jufSND_nrPNMH}v9fUfB})aUO` z9@@_r#KR8B`HqKrULDRzw#oQ#c8p{uzVSQvaRHePuLuAJj|B1(Fd=7r+$H zU3=t+&q0R0eS1^O5{n)SH^hu4H?(cnAO2_90p z`YV_G%7}xP3{{JUaf{nGkO7n&mZla2UN-xsDq|n>nA-d(J=p3$uAFD)1O}2 zbN$nZPMwZc-6rwNgc<9mz0f5#GG5l7dAEdgGheR_rN`gWwg-Tjf8|N6j4f6JskHfo&)|O;4Yipei z4|{)Y)6|ihwvpjgk#CdP_FL=PTZy`^gT}j?bp+q0h@=*P7^J=7fyQu_6!G*NZ{j3? z&g*k|{6J4iUS$3k3;-B*1Zk|0)=R%iZw0v5`GPMN(ZYT}Ldo=eTWmXy15z!bb;neC zpnCx?X8wUwjvP3zR~^NsF6 zv9EGAdwcLiHwlw(bQ3>gcbK2|hQF_xy>jRKbxueK&*?$CInrL?1ROgY$cz?U4;#5_ zajnS5n(jxu7258NX4}_}XG&%@rh%{Tn^g1C`h&hq5TB*ea%`GkRcEj7=N6@Dv>tFZ z=#Oy4_`!;zFX!cVNpl3M41%Hh>Yp5awKpf&Nd)b02bS?uN@gFI@)AJ2HXH&&IJmnM zni_!2eN9dVEAWXo_r$>p|Jt#riaKcyXVq8;bhN4Kd{7ooukI6k!Fv@PcPlua-1r_C zbUp}?<{64dyXVSvh=^n8xuXerT`mt`5QigL&clY^)vA_P+EIQ}na0C|%oE2R<>|qsWEul)c&>htclEYmU>&ECd^cr2E+2+P!p` zGEFXS`=O>RX3RGVqV{PI`)W{HRORjaNaYnu`I&`zd?2{yHi-uT#HpYuWF&mF0YQR4 z_rg)9WO?CLjFw8dXPXsH)$g&7E__g8j#yr8yxP%BY%TyM<#Emfz~Zw^tVEFu;_MGu zVf6yl`}*dI>-(_wtJxFAV-%@ut7F~|t1C#1W^Q(moxaAHhW#86#*LMUPE4F#91}pQ z4tZTIpreWY?xIOfsmUSc942=hiVJt zQKl9_F5ETIn8M_9jJg5q7fW{QR~j@d`za5npVwNmuch!!yR4L@*7l_dna|O>%v4p8 z8Hs7d7Kf5hSx#3|I3d45`d-3Ub~4qW{)bas8I3%B{%}02)5SW zL44BVGG|SS%8_Wmq7P@j?o1VgVw=!rqE{*+&|V?0npl6ztCvqc=smK%M99 zHa;4W+j`eheXe%7)JVHoWbUhE05hWL=k7+#5*hM~z-=wajGH~oyjE)xzyXq0I@hcMg#xpW{&_hxE?quA}?hFYx}j zTTg??T{ghBCXA#L&w28HTl!pS%*X@0pax^-8>!>-_~L_MAaUFC`Vd!1;_rEjW^}n9 z0eZ5sA`}fzE19#8gvwVyx2swmK3Bw!(4^hSco6N^#FKo+wi!1eC^c&hNStpna_~YQvmoY&N4;m<2R%6(*DKLlR+h>vd zD8fQXxs|Yn(QJJ!LdyPT<=jNwNnlrvf1XJ#dErzpLxno<7_P?cXWH`cTS!J1U zqMg0@!)+i(4SF6!#;c4)Z!oB(fM$2Z;`U6CZ-9HkvA6+YU<-whOUB{;n%${1ykU5x zr5*kmcFpYI#QXcVixTEm!InT40%NS|w>5P+^mSr`kO`?}vTCYdOM;F2{11nnmoK8)ikv!h9un|-Pq z3IidC0G4eGJR&;~di_sad#k8_?L<>KOtnj##t(5OR|)iQCvX+5r|AGPdWS`L8n1GH zUSPfvdrf%qcE6NgsE*v;bg)_y9#2DXo7I7wsiZF@qG34Lu&9_HsauT242`?)X*rE1 zSx^W`5gAd|jj6~B<2-<`yqT*CF)VoZ+ivt#dM=pLRx(XYI&Dhe2RWM5?d)MAqx$7c z-VI>1;e(;0N(2PEvf3^WWsKpyM6htRpls8rp--Vya?jVX8v+ZyC*z(YuMHVO#k|x* zb00+mZ!^JIaXexT3=v|Y?>>7%2wKa+9@#dwIYe$}P`n3gzmrxPNZFIfJG7SMZgC`7 z<_Q7WN*|{SToK6oR#PQrtEHFwKEx;Tchx$hi-zt6Qxw7q<3K(ZwjeF2hp)qVS0< z=)k{l6jBW%on`|X(W{26H+IYOnZ1^Axbqz1DJaq1rBj%>{Z;_px9!gYM1XJY{^JDn z-)r5sqF@j@zy3lUmdOC(&ohCiEBIi}Pbgv3P~+f7xqS@804nfaU!OZ+$95a*w+Koa zUIi3hCUI=`U+5!n^If-dsf;NCOId~S;+AOC9X~!FGng@2c|PN9+thKdcFPZ;-E=B| zxx$)xth^{_8eT4hof9moj61enJK~bj0w-RG z^_|}C>;1qfOG@P|=e?g!=NR*+=)eRH6;1VNM*tLUvNdS8ez=S{seRj6#>c%m=?!uA zNBJRo6F0#<9<*`dfiJUyjtV&R!*@hOWZ4jWpfJ#Im!hP&?hoS_NOURDpYW@A!`0qc zyrxyA?U+$Vr-X*1U?s#pHvac>pklgMH7Q49IJH2g$cs!(kR#bv+W3 zzQ}$AP?|LK^GojlW|Gs+(gk;r{TJi%b1eI^E6svE{fX_A3*48}=Hl{k*S=eErA6re zo_NQjE7XP?3oJ*=r$Y*4kE1>L3y(PD|9Z1zp-Bqc&tE;-+&)gziJM+dhl*nM%(2WM zsgy~1?;UY0bGtco#oYBMV8?GxpkT^`@E}ehdNo1_=ZNiC7^f*gp3|wHOi_eD&jHk^ zu{Y+-j#JOoWf0#Kn@%X8AwaeD=P3++G@m(?YTBrFc6^E?sAeX)dyCSwuN06c0CAM% zEp#P;!9!FI&#Wttle$;Cu}yYG+0asR^75y>fvyPbVY9gJ&)qzQS0zB4zh`217(nhj z;v?m~!UAu6;;UkMB9uZ`;n(Mgn7YpVv>mI-DqJ4g^h~UhH=f@q2;`Js5OYxAPSadS zgQA}`trt7Xb6h=r7XDZt7}z~f5f%&F^UKql$!m`U5walaDgkY*La!Sv;J_2q;Ch7v zd9Q-;%LheEd%926zh&c4`MC**geD;K}ao2(Wp zm5Gy=J5k1z8#PXMQIqc`M~7#_#hSN9k&EN4S4>UQv?GS^AK$^7$6&Nv+Q(a?tQCM5 zTfcd%j(6AioFFdbZ$e^1O?`_w0skBhTMC|q-Kr(I6 z#yPlAO(JUdr!KZMw*Z_R&18zEAi*5fwSvwlI{4c{EM&ZS?Fz4X4O@jcC9`x`#_4Wt z-Env8``W9-FAe#X(J$Z|%P-P4gA5rHu0S^yoL9v44koVf4vXSFNeB_~`hDNqLc~Us z%z{0GTaCtiCKczB9{TX}*CQT2^k|b4iE;xXrf?{H?cHB(84__6pCYROgd-JtI< zcjLf|vEQ!h3+AaH`(xxxCW_mI`KW`$OJd2Fhv5BOkJY^Z3LAb<+Uko@)1U_xyw9t1 zQ=>iYwb}}3d&;bib&4LiUebKfK$!mq`6EZiwcLI{R=U<*%xh~Zl&SI1YWS8(+2$k@ zA^^XIS48am1(dhT6bil+ryL1jWQ2RhtWtIX#070pi<$!1P;kt$A4^{694Di1V0~{a zQ4>?|{_JH>^@nEGi2g&bA8wAyxx-vZJzO+hg0BZy0>2E>KTTw9ms`xm0-Lh4GYi+Nv7WKi_z#D9iUQ9UI>}v=K+p z(XpWi4=?7!1B4*qG8|Dh8UpwZqoc2Gnd06x8iXSv!-^lJAZ*m0R+biZNk~Dd34DMY z19Dc~6**fFwsMQ9ha5k$s6$#ur>3#WI|c`uu+;nA4`Pvo0I5c}=TQake%{-Wkf*LG zFXJ^obCS@{VmKK}%Hkn|EgHDv;ATvRyeL1E{_2Tm%1hdsPqN+b1~;KPj5PbMkV;(& zbNt`#kE3NGQ3GgR(OnU~&S`od8H!txPQ^dA2#xY5ad>Lnm28Q4xN5avI6t-95YcnF zm9-2Sxkyd?PYc=W7Cy95#j49=P$d?{r zkU?2d#ZDn|H=$WRJ*u_s{T_YD`pqAY(a~qWHs%{;GL3H%xl`X0mg?~dQJVQ)K;`-? z^*3poVF|K${#_0VvJMH+AYW!+F2ecy`656hE%wnFBRAYC++($#6suEKJ7L%Lf%Ar& zx)8>LgR%E_8T%-HeExbbB-yyZ%zF#g*);8Mw(T56C&coX@@YFDoMI#vV{aPqPS}0b z1wFtgMy`TAqEqJbNO`#_(#L!Fj-L)ro6n}h*uhJp=|o8%WoPvc_bMFxg;ykL)l+b< zEWAMVZ4atr|CQ(Gg5iscKAOPX@{(~xffdc(FmZgI?oqKoMTk-+jie!QZN+aDCidQ- z-v`6e^bvpBw6WK8zaXW%(Sys@;6YDLSn_Fq(kek9Gu{gcyKkE~a4uHF@J6Ns{?Wa! zU%+ab-tt4+Qp;dDtKS0Nl)`8xY@-PyaYX490MaLCa*nhS(TC!{gco1zvq_1L*X##t z{}C*`LA)Vjx+JqJOJM%{Z`NR$rk2K2?X*Dq>vdcnI`w(I>az!60Sl-b?KUcYpdM&$vcCn@DSX;Bime0B_qN$O2e3=q7O8Zi$E+tu&O>Ba z&%d$}t{KlW+AvhBI*l7q{cc8NmW>H%oeaGEE&c}#@ZSA+MThz_5(x|{@7+YeYU9zy z@*ce77{JT8z3$uA!+xFx4|w@^5lI4Sfw9G=Wz@zT*3QM6$YH?M#`C2xTBNCSU?EiO zfc}@$7Q@SJl*}7n{#lU|jW>l+vSV^}@v&C8;}}p&GZoblbbz8cR7M!GM<$tk;R1j{ z52zzQ3=#&7aPM|KZwoNY<0}nIfdFszqYQ@BG^FP(ge}+NQVi~->&{xbDw>0Jd0uB2 zY{-1kX&XiB!u%s!9;^+HIVfq-S2Y>JR%r41Ofleo?qcM1Wf01mcGpgaF^`6rAcJ*= zy3s@)Oe`Dh8jW?Z8}7bf|MEA2-^h9EDs09GshgStU^_s##(*w#`Uo6LP?E?lxi87J zdLsLwe}1iJov2ZYW$!d;F?nvtNa4wQ#8Y`{;Pn1^EG~!5zy5;(bk}Tzh*;h?_zU{X zu0ZH!m`N7vI8oL{)&mMBdii~l|({1=R?XM{mvP1Q*T zjkBv>S8NE%jGDtP?a`SikeZ5qz6G=}0A)g#0PE z<`O!g-r>f;Q*Yc${Q^5q>FZFByqXEb*(lPz?l==+8UigVI|m3SL{pZta3cTvBdgw5 zSFaq)-4y)}#01``;dJ!wk(SkylK@gbkV136d0mSnh{VMNy1&Ca!S>fGK54V>DTsq8 zv$c0hl+GP`xBJ)B=G=>Hy9d|BB@|QCBz&LI!E9y+NG}99kcnEJ`6Q$wku;c~pO2m# zv3&7y-O3bJMNl!n#egMcF=8hRnmaGwMD}=J#rC^s>ocG$*oHd;s1gR-;mmDvMo$3b zSc+PGK;94eWiTjD6hC|44q*1#<ZR%w9)2jb^#9{iA413Gfr8Z18@coH0ENAnTmzs)xPbI`cKuN#uT=3cT-?H>3 zUHViNFL9V|HQe!lyA^+)N8kK_`&okdbaHa5U{1hgCre0Td~n)kL5or_8}C-VOLwfw z!v*M!8{rZ;v$IBX=8cUZ94Iu6QwIa3L}Hw&^hVl57_GYZ8Sv;(5+`V5cEU5@&h4`u zb&fYY7KwRr`{`WVb|O5EIXLZUL|Q){UsIaS^SW&V=c6RDmrzR1Uy6^xmF0Wy{AwND zJcAv*ibb0TAd3KM}%kRpyA3;kn9_;At`#uSowZ0eo#?eW%A`-__BjaFm^|_1Mp)p z=VuTvwU`hE+MMXOU}UozYNCb8^sa7r_28AFEEfY2^)A{cHjX{F3^=oOZRqFw0#7}icxZwrX zLwFLx6Ta%pRj1Op!uGo0mzCH9E4=A!0f*kNgYs0JWeP7y>!I*Q*k{6PlSI1d`CDZ- zB0zr5)u;11(&?gCj>3lOnD@eH)7R3p{3hhRcdMnv<_w|c3owF64#g=)NXgq-%^|WJQDAaY@Ub^rz0_Q0FD0ji{LCth zBjUYEzG&FcLbjz}fITnQqeYC)<=xsb_35KjSB8EF<2&$CqR{<;ME&Kr(v)}8=DWy3FJ#&D`Ak#^ZU}T?YrW9gkL%eYoE&#*x)Qe@8N7IH{ z@H~=9ZNQ%nR#3nMO7iM9qSUt%qT^%XEG3ggRt5)7c$JW8;!p}B@*tuv`hxk3DS^vD z1gVA#eE|?=xGQpo0KEofjJdpp%V>jI#nRBeY)4tKzsJB8c*hO-_b2KW`Ws}A5$>WP ztvX;{wOSe-yvFA8Ok6~I3vd(dG6NE z0-8CpI)CAv(tW|zB*k5S)xfz@ru(T%E<-AqBbtY+r7V~e)P0&|(u@hd_v3{#(iBV) zVJOF5@P7cr&bTYMkrNv*#bK^CNeDw0UwlT8*%^2pd|CfQ;lJ3CCkg{sKL9`M1;D4s zG5evF20@N(2EmADVaJ`d7Nqz98=+UP_BZk0U#o{hF~9W6+-r7T3)A-IJZz;cCIU~I zLrm^VtqQpeV4hUPK^`CsZT>&@Nt%F_>(R{8(#Is#b9=spO^ntx@^?I42(kA8);#z< zj>Z^QW8#iDF9K2p`?K`m`z>bzxCYiY%{kzK+_|l5=^)-AQuIU9N)Um1 zD_yHchOo>KGpKHWKWz9-UfHD1KV0ty;V6zjI!Jp5ZPhGt$IAlP`bRkpI6{JdNE*+W zGO9qGs4?*nB7kC zK!}6DD5_axeK2)a@YenqztOdfsy+daoQD6&qWa=0@EKqD_q1Bp%vUNBOD3k5pHEFQ zplCiI_ zc!@ULqhLH4*W3c=Za{h^^2$RKA?vQg4>#xdFbuD}?obDPO4p!rMKreGyV3mNF7R;x zZ|`rt1XdZB-N)t7X@5pbaTEBlTzJX@8g?GoWSpap{PFzKJs^|6X^8)|D<_ZIPP7JV zC~EOEou*rUL~B6Cz7&Uk2qkmeBg3gO#b4z=9NRXaPbxj37OATF4k`e8Ts7I!b*S5r z7G?V#DF|fwf?o;1J^K#|^0TvxE2e<6Yv*o@>ArprdToLU0vLN7{IcDz24(k+w!wqL zosQ3>_}>Jj3}nCbkSbgiyElNH=2;U4qv zPkQ3m2~rq&CN0~QN21gghe&ry!YYP`)VchKzC&OubZjeTGN6g=Ju28a~Ar4%Hh5@itJ15g)s)g&0q;`A1 zjI52O9Nsw;g5(x_Nk3B$|6|4Ji^Xda{WfluyW46fs;I<4x~c>GzTiVi*k;p{)0?9K zX%uL7V?`F;Je$J$ErGwbi@y4y(=n8n8WYr^1fk}RW1Nd$O|>Q1ICkR&`3c-&01CXn z8g}oTyex+&F+Tvwya%fSG+RpCp?Q^vZw$)bPxZNHg=e_ITo z%^pQ}nIED2x#}wUk1oPoXBQfn{itJGuW^BKC(<-KvHx+*IG+CLiqg2hYh>ES8g#z? zSRoX!oVJ&YM6 z$ZqRJ=}T$L;=v9#*)tYJAd~}hFKdo(dKApQ83cgOx;5Rv6U+qjN`;ua6vf53ib~8y zTlC95v>ahgk{(J&4i6$&gUy$T-WkVpSl)e2JS#LUzhE7o}3?SC}4WCKVoj6h+U+`{bYXl0vF`=fBSZT7)$vr zJ@d_69w^~G0aS{{MRf?yb%8M*=|jB6(K2Uh01V9hhZ?}u?;@vCDmLv0=QH9y`QE06 zK*D8A4yWnN&cR_jEJMuLZ-3DcSwKZ`1*9)4z*g>cN}Qx@Hj6`jmfP~I?(Yj-bM@pk z@|LVEmVyoP4D+{{r~RLL@d_s~<3hBlwrqo+?i<&;UL+QGGEWDjiJtS|k$goR07E^QrIM$!fymWiGNl#&c&|8l7RVraimyib+gMCDa2 zRfkH?Bfukn3sjub!pR;(y8vD<#WP;;j{n1}7B*Ipoe%;2Yl1k@ukT#%x12d)5Ayxk z4G{ZNa3lPH5)yCx}NQ@TG6kGmqw35xs)im*QgTCV>LZv~hl5Dy)KzyWAQ_(L2=NKcIH_>W!vL~K!S38 zZT7zvYc8WLiM`l8X6ye%z2|$UCn=N9&jie<|F)XIjm9a(B6^oFiXsM*# zFW08-!CYE}IRO(Tu9XiQWuSL{(~Et6C?x%<&fRPVPSvq=5vEtqdfJ{qG&`?uxWNy( ztSZ8M6fCthfcmRB4yd1hIeamC2folFmWIw^rOa6NhiD-~)F)5ph3Eh}dBfqZOTsQd zwf@`Ko}IEQ_{fYTlA}PWHTk#N8(?W(npS}c{6h*#X@RO&;L`wR43WXpfBcScW((Q5 zC%c$H?atkcFpv67rRUt4>#eW0xM^SrG|ZR%5gY)={4I~a!Xt&@ANc6SpKV0WhpO-5 z?lMJ_S9dT4eX%p~KVhdkYW*54a)$&E*Zz+S+dFDpmQ2kh8nkA=@0}aDYuEJN51!f1{)1`Y<8s;BHh4OFL43mSycZo*O8oN{&N6|DdB@@oFY>sclAD@#Y3;@j|bb9a2C98_Yh*& z29l}3zJq#k=9#&;u(;8lZQUqG0*jKQPq3?3f{1j?4z?fJHu|-a_g6xss2-RHfxPrD zIFIf+P(!w@26Dp>&fwcOR0!uBo&2OYij5OTM(T3~Y%_StA7{P~_dk}!(va{QZi5EH zUzjksKE^W-P)wJ+Zg?4k;_g0_q4VT@yQi5mMVEf~AZjPhEmn8L2lNR4n$rH~3T+26 zddvrZkE1?qrAsP@+9Vgsi)zAio1X_`$wqw{r#@PT?h}hbbk2*t~ zkVQ$c(UvmAGs;8Dpi;Yjx;FEBH)$Bo`q2e@9^qtCd#YU=b$8Y1Bnoz@GtzdK?=3`q z47ffI=X}YQ$4Kar`E8UrzY$ZcXWBr6l7)C@6ICZOS|8Y%d&Rcmiy1|Xn;3HoU5Pad z^^2e{KdM^5=;%&A!VEGl>ZFOF`ZdUZc7znc5qfu>c&42J<#D{S#qzPUc0U|kbA_wc z<@7jp=SZmEoZ^~PCDCt4ptA;JoNvZb{{j;DIRI^F^JJi1o5Z@}3I4UbbXwbkH)@^Z z_(*pbug3?uASnNZBor-$rU*2^kyzsxc(3L31szmZtOpXYqD;P9%M{$B4!U6X4!XwP z`$-DYbVc5K81yr9$3z0#2oA*A<04~)Vp))hP=&&PJf(;y_}`)pO8b8(rWT4Xjti9; zLRLr}Sho<)!TM8wi&nKAIlT4fOhf)_cjqq5X?PyNi$d_0YHCR})xJyu)j{Jfv4xO* zQR(NuhKSE}5l$vYqwti(U9O5_|ETXiCi2?iRislVi{yaVJ^D$P_DpnfL$x270I$Oj zx|L1TW?l{8J^o%yo_MO~F>th4qRnZJco~Y44H+&|aF-fFvG%YjXW(FxmaaQHwOp;u zRWwKIT+Wxj_2$|5N9Y30o-AlEIOFbA;1_59Nw;MK_fF!$q*cAtYJP%$A)L%*$=bnFK*Y&s-{= zps}(&&{INvvktrf!OxR1zVCGAc+V3c8Qt{H>f_7=_wkY=)6-jWm) zloYwe1O5~gOgBFdAoKopfur-Ir;mOA?+do^%Yl0Y;rjat9#0)@+&wHEUHMpjbD+T~i>3XfIY~VkC*zQ#IWX5OZT3)ucp|Nwhl|U-6 zpZW{&D_Q`7C!NZ#s1!a8FUONVv3=rc4!`w={u%v=iB4v){kxicSXEZ_>Tiu}#_zw$ zT5oGqp|&aXj&uO#1IHgwQnnrUA6G{+cb6ptLz3KH#bqUB=FS1fKH+31NmHqfM_xxb zSkOrG6-=;9a`>o|#z0S8+Hmga4gsS(Q)(8SJF&085V=;K0hGQd62MpVd#lp%oZ;LQY2p4bQ~$mcEK#r8a5kM7^& zhn0kd1|QUPnRFEOLyx-)h1}yJ?5P#+6(Ob$$s3`H54&0oHk07K5g!@yXg?XF`4cKw zUeVubEGTZ1b~b1nCO56uo(JcTZ~tJUM@vsvxS|T{N=yI5)rrfH-u>X?>Y^VoMKY@8 zs&0N%&Am{N6AWv_OiPlWr8(Z!5{T7bz26&oR+8_XMbb{QdaJZtIACe5Mg02s-x`u8 zw;9f@=nZ|Ma@r5?v`m3GB98;}IYr;@{hOnyR@7I9GXAqI!qk5O-}l$r+xj&>u(s=9 zLcw+o_`dAN{m4d%nhzs3KyyEkxyyvhQI#VW!bO6P%4b7aprYIo{gWy!2Kh#btcW{` zU>s_m>Ds_*(KW8M~s z+hc9SI=FE3xgKV5_*N-R5397AOCI>H z*M7IWa5w5ElR$rR3#|AHZYw24LJ{$wj_o+oml!TO-iKN)zOBXy8&e(Uc> zdwlOJy$%H8&iyXm?AGC}SME9;@`YA-VKG@l_4_|vT{QQr|+V?o9IB}+$ zJ^!lo53ky01+;2~7yT6N!524F&emoD&wcM5*EO*&TXZqBQ%fy$@OG6zoWrz%*D9AK z_gA$itnFJ6VCbNgMq0*KWtrymHJv-#Q1raGFcSdh$)5)bSR!-!+^b0{c%W9PzV~hfide$w!dWQ9pP|nTwRZ)i&=w{*MR@LSEGgH*8+dE4 zw9aF%8macwt^Y0`{`t15f6EO=6Wtj>abG-j>??N5T!AxoP?tO?1gHSK-v5^wzz~Np zk?9k#Eu*(d7waPw2QPJTww4ra|J?go5xy;TvPcS>Pz5%+$$aGqNprsSiRZbaMm6eL z_IQ~Fp5+@P%&~H)1*49M!4F6YATiFgAAhwYR<}!Cps_vx90~}ed!;7k%i8+3TfmU6 zH6kKZRB6@PGs|c3hTPqoan$GCf=pmTSx#e$L|*htLy!_KvTNnRX!b~naS6FpEe@<& z6peCu2ogsRxT6AQ-AB62GUQEQtGldAgvReCrpYjL591>(So0LbRRV(9S|vVLA9TQJ zI_4kubqN?&4M-noP}$D?;3`UQg78nBB>x&I9#BkT`(u^%tWj>bcezA<3&1)jlL7 zWh!h2F-E4V{x)x#dM$mZfRH9eIn2MexY#N9m-o>}*prF|BMe|W*kehJHr24zH}Pdn zR&4b4krm>5%tE;-U}Q%r-cZRF;C`-Xcy}n_J>Pk6ByBOlbD;URj-jvH@h;b!jU(9p za(8}7q~4LemD9#{VN!6sID=B0b)2#gg)M6wBg=2Ju(K_o$~T_LRNVysP3{)!@@OxA#J& zB!RmX0r*}G75aO9II;u3+P6a&Tz|RWhB}hjV3n6>(6JtNq+TVYuNA?NAFKy^&o@t; zdTJhHKZriu`prR2Zkt}D<=!V?>?Aa@`Xb&vjge&%n$t;hu6<6a7S@=O*nG#>x)!d;DkP`yh!c0NK-0MT&%AuX z#I(0q_Oa6wCx?^=v8EKL!dL2lK6#f2*a!`*OMY{HKwHEWk`?$j-UaA=gI=-^?^}Di z*r(z0?4Ub|W_+3vY-xV$S3hap+$}h1M`U2{_qcC?7geeH!I)dv9Y{tD;h@deh~7IV zww3&9z}p{;GJ8#GN~fc9D@cc^!Cw~nW;I*BGb+mDBHqktZ8FN>wr|#^4uVh^C z2XuL-iNx0?AN9nZpvYcy&|oC$Gw$~}@bb@;2s855VkucCmQk_3Wnae z%ZqNsj@TU}I73U-YahgQ{q~Bt_$5(KQu@~AqPq%_+by5Iv2JXrW&LD5z+d|@Qm+lc zdK)ue-Ng7I+VECXQ{QaCD0+cZ$<0@mwEaP{74!Q7>(X_S28aa!ldNpNFlqmcWkKq7 z^E+j&G+rBjWa8I*CJkx z7D)8SGRY_3Yxb}3c!2J}+AKH285ZL=Ll{@hgPFdN!iTVARlQ%j`bqBCuc=m6g*_v! zi{fTjRwUl|w0#zT7RCGPIa+04{*GQT{b$ragI)QM z$JOwB1mxspsq@1Op+5V<@3Rsr#pcf9K8_UTK>dR4(vFrqzCIRb{Rdj^3#tKSd$(mi z@rcTEKxYa$m`c|$>7OpZ5hl-$xW;f}-nmH7`Nwn3XH0Ty1uWd_py6!88Ltn1E%^%vBHZA$O z4knheP(d}eYtR8WKcu>R>nr$te7Fk{^ww#J;_f;qdz*3EBV?nMzW&fVlSVG@fb6cQ z=)G$ph?+9gpLBG`9+`K2@M8^`D3A=mzOC=VH){2ZG>#+9vdpygK@0dh085P6(|p#A zF5t)Cx>z*l#PSI0%+coJU#-v2Wh=Ja1b`F+s+7sgd&_F+FncYyM!H$7 z%j3T2nJa@{de~nrvlq1L{FC>tYq^vAu_2mhn6daG+=9QJ<%KG0Lf$S>;Q>nqa*Hy* zgXO0T5HVZ8A2$WOx7K&ml8t;zLeMG$<-Zo_(QN~E&-Gg=<(vf=b7l3Zmgr)g6uW-y z<-mhfBL{qB->XJ?)$;Rkld=vv`s^2{K)YRabefIqY|f;N{w~iVkM+I~n+d5#>}@=^ zt(|a_MEqOIrh7*2p9NnTHqBv)ua@USujlHM)#K)7pK8?qg89NM<+P}$dq!#4fT#N2BW2LGbHIeB49QewmA z2g&VDZ=zvDp9S>{%Tk8X1x{rtsjE2v{=!iw+XLqN}LM$$a` z*B8T>Hbo+R^A+xKp0r<|70{MEtuL0-AUwjVbA3)RTWOH1)a{arNnF3z?Vv#4a?XuvB;8y$5I+ z_sq4Rt+c>80?Z!2odql+i}2*A#vm(`njx~;~EI;&4yl2Hou30-aY=F39mVHUuGhNyc>K0*ZE?M z5V-jG?eUQH2MY6R|15`0=0WN<<(%v{WDpdG%DFvz6G_ie*hH1h1@gF{Ogo{TTIM&~ z0+8ZxO^r*2DNCZJovxj!C9u7A;Hkh@>9p-F`O6p|@~j5#OYIrM^$)k2agioZ$tRL* zE-3eQqwlI5a-&(SdP_ygDo@oZ84#rI4TiH+Y#1SS3pMz$XtRpXuW5;UGZYv$L50FX zUU0BPMHf1%;Vc8wy5w*Rj+}NHyeBhcyTu*F2_uG)x2Hn!9FF$|noexu>B}JW7@}db={-kSj z`PB(7H#ESkjqER1Kv8|#kbDLcDWk+{O8o^Hy^^P_w)=;>PWeVLbXpO`t}|`{-KH_JL~kT;%zgx~Gvb&tjGoy^hXH+~u6ZYm@VAQbBJAlzCx@ zwZpKZ;@9mD_A7USN4u|~}Rf*Zr6n`0rM*`J2qT{uM z#E{UF@>)k)(N~Y8*9Ax+&;9jK<_BJp?8mK9!(^8yYq{VITgU~Ab~~)aNGuTLpxI&& z-fHEetzdLU8zYsE+0acH{)R+b{jDpzEXG*4BkyxObV(6t=JjVw66U2Y)SE_NSz_1~tkLF;YVl}>CC61IO6$jLwo3gxc~k-9Q? z@X}C_9J_O+#xl25uu(@)RoQvVar_O@6n zo{aRk{vOu#FE>t`Kp|g393jkoEml8gijvAmeLofnU&*VLcdfG#xvCP5nQ=|hwwN$l z5d7+Q>sZPgDMTUP!Y7<3l4psG(F7A;cH+1ixLU?&AmCvrD0hD1KDKHYR_Ll&mD_&Y zE?N`YVv+%0IKXP`)K+}!MbHrQJjl8hn*go>#JXF9MTQK;U$%q{s!d)-D73O6Pu*a zm>~gp8y~lm0e<&O3{504UcFtE#T+ne@`3zNdMYyI;3ml3Zm-1+`>fH08WW;{rNtmR zPrm)lk)OK&`n}w2#G{dgbHzc}RxGE@?&pXFljyGLEA8x#*~}W^SsJu072R%NJyUhy zue9DGDWgq%a~FpxF60=ZBH%|9*~R^JPs=Odib}DOCIBMq5p=1NYy!-9_e$1r()%O3 zAUHno^#Y}ecQYCsk#h;vG9GYO?ulk=EgSUqSoKH8VY_Qw11BqkIT83A+2V z$6qUZWbf6V5Fy-$AK~#iH6YOKnt1k8Rw*Z`=jWJdqxQ7MVxZ+qD?#Vz7>ly5^W$Bf z&P0$hZ;azv$9|Dk0!>{t74c)jzMfDPE8+{~XUaa90?kH1JcKzvm9H}GU#dTZ>{{bM zwp?Oi@26_3S!@`nEGQs2Y>wT}`((CSYuWdrTMUu=O~?9&yddH->UU`=ecY1K#r#yo zG=PN({j*+zx5gd@>sbs7f0%V?8C5NWE6Gzt9LtG#d%)~=*HV9k93Jd#DIdtcDPh-J z?x}V8ded$?88QN(?VcSHnrQX478=Bb@Sw<<{mAHqYow6U#1LK9%I25{MWFCd zt0Zf{d3*Y=DO0zc2P>dae9APAB(4#B+Slk#F4c;Kub5b_{>5Dlwqfc$ssrt+Hy?4( zJ8dz)o?LRL`zaxZfRY_=k8oqS`KJ18_6!tJQIUxr%V8EG>r#Q&bNZ8$340fZySoRL zbOu1S!Ly=mU$_)E+HCP`V!k&R!!MxD(FubTXPekB!MRHajGDE40ts)3LGa{C1%zZS zjvThW<#~^x(1z$?J7!bUyA9=#sGF6sI(>Yr`yN$F?ys8z>nkw`qzuK#%qziQ5x=!V zSQ|SQPx81-;!0)|&wBQe?1)GpkafC#dsQv{uicm9s%R8+~k9S8QX{2{So66>JPLzc2eqAqc}7zW+Qs_>?t!ini?Z1D`uBZ^*6_jHy2L|b~0+bcqdtr~hh+Tt>@^8~_tzi6#Y2w5hC20pp2 zVwvVC$9$_o^dh(~lEWrE0}sXrNB=0mV0?Czm>fF+;*_eUT&uX%1{zRL{)58jCzG*F z@%D=B(!9pE(*8loh9V!AI2*ku$X1RuQJ#m7dC}`f|9ZeIHj71VOZ$`QjzS~72Dz)D z+;ua69U4q>KS8gP6p_m8Ub3hQA=cmMPRMID0H1IU-GZ@&0s9$`&E-NATezhE)KA@f zr(TNBZAyP?`O<~yAG%T+=0}nJn&?^fw>WV;8XFl|aL<1s&1k+S+zVeZnn`%c5I6g; zwRrDHvw?Ak8gtXz%w!Vmi21F_s-aHt zn>Svl)gaq|*Yam7mQHPD-;Q^xMDq}=9%kDw!aiX>S1A94E{%(#7v#8VC#K0U;#rf$ zqIy9zJc#~Wi|7j0AEAZ3-Efpb;+Avx+xl_rI**WNy?-h<25fcN+)iMn z5wzEE$}+bMTXpr=VaAL-+-J#dzj6JJq`B2I{Ak4NBxHGzaP>7whs#!$&Pw2bfgG~QZ6w-Ql$WM-)W|$x%dQ1QrL>Z0dS4%O!!j6S; zKVsw~L#tpJ#JsWtA2cq*Ck5mTVX*t}JmeLC0Y^x3!`OH#unay6nbplZJ&Cf*YZ`tL z-z&G+=T&3PE`cUEFh?dHG_;Z2SnLLfTx>EPIM3-+{&muqRe_rl`FNSA zIL5^H{Dmyq)|3z{XITi$y}ukW*YY#dIr`agKtXZ~U_xaGdhK7Nu?}0 z$XdMmdqUkkdoj*ZB20?G4;;gZPxsWd8rxv${a{zt)@wwrcw~ddl|JM7<&Us02!Zs# zG?5JgNL#`jo-kwyHxy{}ViQN3$z8r{blR`G-2Q>2DSdYjQ#~4z%`dJ(0vRQ}tv@m3 zNzB(YcC2Vfn7=sQ8k)XZr!OfgeE_fc)_h{&_dZpl+87pN!IDoq6G-!Qpa8*{YsU6rsRA!b5oNw>4A_!-a;M^9Q(k9Sw=*qT(Ct=aphZBsQ z^TY##!ai{~X4ef8h{mZ^^7An_8H-C}K%JK%2#qa;E}zrS=~@4>=EOs$ zNZh4)`et)Lc3{r@(35TCZNYeo~kV8sg->eP7^va88E!g5ai-7-fHfj%rVBc9w`8v_GseyqCR4_;7peTZ^YpLo`SjP z>3Zn#*Og~=P43;Fcs7!I!|%HcR*$$yhJvh1^*zwCV)o-~;gDA*l-I5;E*en6pjJ6~ zilO~2hLezkiuF;_GY8QciO!AwO-lY_UuS|*A3Rmk3RKELsy{y&c0kXAaGcA*r;%Tj z_g}BZd180;I!+ckhh402FZKe3trG#5)dYP9AJ$PP``IL8JU9!Rbr%&&`x`p#14i*` zS^f9n;fo7W&5LKHoAjyCYfHvb@AP;iMer>R7C5peKn6nbh}laajR|b=6Znh1)gfXXv)o*7iVOpj ze7sHmBb_+)b>vTy>8g?^JC#wnnnpcdP7?5Kj;JoLka#C;xcKsGzBjYkOHV?y6|T<@ zzxiNznMBP6%J!q&E)-};;_ju{>D9Q!*`X9@`agc;;C-R~un+x|nT6Jd@*CPh)v}dEJR*9`>gj=*B$6sn^(y&?DZ2)YcSh(Mw(k3yDr`4(O8^ zrfq%^zj_+2uYhgMeUCkFUQ7WIcet5y%r{0|fj)85EaTj%k5;H)QRfEP_A4d z$eLGgI41>G3Aunc)d**Nw!>-WKO=vP45tCXVeB5rwMDy;oX*hgfM$pAn=V34=8@X< zgjPPo{?CMX4p*oXY~Obgk@~~SycbED z>74fo6NRom)tnM&UGbLfL+jsYTHR>EaG1w(K!c71kfLH=BJK|jYLFXe6|fS1B_Sp#2i(8^gUoZ=d@Hp}>XaUhj7PO%tw-V1E5!Ss+zOII9n$ ztsQrA)Ox%I?*O(1pR+KFjHt;X&PTdI6>^Xp1~Y07d_X2R*3UX9>!Ac~ghV)lGPZH( ztB*$MA&e60x$#&fLu#S(;xIqTP;B`=6rp3XK?~2-z1TXXFZfVTTCO-@`rQN6(o)DRlSw#VULX~0B=b7 zn(Q%CN`T;g8^v&cYBo~RK`+v{^YZ!dRG{y3AH&OKe<1D(cb({u1RlG7y(yQ%c6JB+ zKI%$+VQvD|6s*#X`b_o`E>r&LB>0K>D5054U9U;vMPDH_t%#Aphpg;V9F|ztAYHDV6Y#r5;g(`1E z$``KgN_wIdvMo*_l6ue-r%_(maYK35^C}OT70jiic}DJNHp${kqQaknl5gsQA8Y_ln^ijSHKk6b)=n%^MBou1>2zXOsuP? zD>V#6;W6B;%4+X|1!!a%`W`Nh^q`+7hU~x2e8Zcw@@R6qvg+cWFg`qY)xY8?0J_D% zoNdLc*V+mvQ(~=?itIjRuzEs}DiLyzu+uSamxRUXfV@w{A#CMLfh!OR#BhVIKzgM{ z4-hM#LZWf~>c}ZgY$pl#zwvb%%-q@#eVad*IZZ`wn3wwZ-$_fiS4UgJ`VRglfAn(Y z`Gft~sWj?8`YxYP2V3bXqJk0zlR>wXqIYu+HYezypzVq@l8Q@(2d7k)85d-bSJw!u zZ^_{Hco5NtB!Quk5tJWpI#FB_$jaKbDo;E(3==$Hkhv94geA$RUoU*Z~#7;^6*wFFNCx0AI@U^4fl)x}CirZiIs_iVn7qt$# zWWb(MSRinmqf>t0^w zddw7`PXfcOuWZkag7GuTrcu7BTVD2?2~Y(uQ1;t|Jxpjn+9l>TErUIxFjpafSc|@* z9e!S~WM^ZO&5dE_{$<49$Qem>dvsl^h~}&WA^Z7>F}A!R;c^%eBTk_~RPr$nU?$_C z!3{t=|GUl;Rb$?$hjWWrVIDT%!OiKg4)#SZu98T z%k{0v{}i#Rs4MZv&t|kWzd>kNZWhha_Q-+(mmjF zYMqyCLE8bIo;b_pkK1k;&PgQ_ei)YFDaJ18kGLG};ed+)4pGRickrDoBzb)Wjk7W1 zOu5xk!#A?_#EJuR;%h&{LljH}h#dKbYPWrR5i3}KP2kM0 z=9aET>{2J()YSUo^y#8~w?}LQ*{!_)3=yV0uv{2D!xmf6NmyIH?;8T*M#qYJCTDuo z(a4dx8m4CKI>~rs=Ic)}LG@#+);`!v(n^~@m(wx6E)fGt_f89E)gA(LOclDhL-uuGWQF~sa(Y=l$964E%Dx>>SzWM>F5c2puzGJT2-QCwEQyR-!V6RbYr@UWmC`fpw&3yz@ zV!$3K-8|OrSoZFX0#osxs8M`2u~BBncA+F&>=!W^qd_@<{1QBGc0!U(XY`$D!+bAQ zTy-)~1+Gj@*yW^uM`~>2;D6}8=I1D77yIfb( z60_}7$OwIRDG~#HJtfNfckp+KkZ9!w$7m+@f|MBdPXVZVFBTXaZegUVVIeWza3^F3 zEsZtC3tp{J{PA1c%tbS;Do_^auq`w~MC>QS&#L*XK8!a}&ZO%L^A3qzNy*BrpDyIs zq-hpRh)_f3Z{x$Rij>dn#2%E_dbWRITc<~AX)upZ| zaQtIa#(|lR;sQyXSi0Xq#Qw7=5CvaVGwGEjb2jb1f9G3|)1JoMzK=D=Ym?qKGJwaV zkkRx*Id^2Q(bvKH->*rS&d({G$b~7v_kSm*Q*qf+igL;gtfpH!^}_NuVT*6WX%3(< z(ruNR@R!>q7!W7aBGCzl+{IRoJ3hB~ufyQKt?lpWw=Z=3kO7N@<)GkH zhbziWobLiQ1R=e1-ppQV)w+dr`U_`aor7=PL#SLRu|*gBYSa(E$d|akMQ~5sKB*48 z@$_!6p~N$eX8l1Gxb**iM%>NkC7vu&sJA#kmEJ*Cz}!`7yAaxlVSIOJXjU)|vfXTL zi>$Zpzdlp%NE>xLH=lIN-HizdJZ+KlF5+-u5|I?1`Gis#PyRE~vLWpi2nE$6csdEj1kU~{kVN7tFG+PJ#1H^TVuUacHCg@bc3kM zwDce{JyEu7c#nIAMyQ~Wc(A%N4;Jo-x!A0{^8;_Mgv12aW^g{F&~1#~o(!>kWhv`G zmN-2$EEia5%O!L}^w1}h#~Awf>g0+FJFTzVGn+BSqe|TW(SLKwb}@JdAiG>uTPjeZ z_^L4h;kIBsN*R}GQ%<2|UK4y_zyEx(gG#ZEro%56<7|&vL}(l6TnSP2IyzQzn@_Y^LB~LrY$sKS|}D z;*os}R2AwOSYCQY$Sh*H*85mp?vp2|)z|&dv>w%3vl$+;&*GYk%GGDIx}bZFD;G!Y zRj*^_@d%g;H?2>71>Zb^>N!qaP-Lj zmM!6bGkDV&vTk*D$eTO7d8Sh&-cF`mX5W6kmSjbL+s2~+B;nvDnUaG5$^yz@BH9fQ zE&{Yl!R^ryvZe*_#EF5ems!+etJ*{H?|^eoyX-Q2V`EmSu)E9t9n+8nY#W3-fo$gD zN_9NX>t`sI*wb`v-;yb7JaNmH*8TR$se?!4B`YD5-RWmP$AQWg@_hlZF@v3n2}ydC z-wY3Bs-wUIme&6)PZelvDe=2H1?VIX)N{)fOp_)1hV0l&n&95$Eya+i&{`qVwU9lhz@+#h16a&@x(dLgZZ zTj+8`R)&bO79NJ=PAeok)%m%%?U3s7{ghaZpW|L1OM~lj58^JU>0&D!Azi${QaV+o zDO0gtQ`0h#;k_*fUVCGyc=JM(J0xDxVRZfZ$d}NSzdx*LCz&6#sR)CMZ=87$%f%J9 z=`(yrI>#J%V*RA>x-MywKi@3V(TaPWd1fxQ#`W z?Z;DLcli6#{fTt%eNb@`!~dBr{>Y6PFH`5QGnYL1`QB9k>$*)tDC*1l(t3z(VMU+8 z%PFTTwQhSpHxWd`^neULRS%z{K@+9LQl)T8$%>X|s2*4P{-z@A)C`9HNPvh0;!6h@ zOb)0MvRdK)E7_>8wnCBRdN(Oo3ZEv!r0xO4{-%F1FK5ns;xM1kdx>mfC&onoye3V0 zlryAvamFOMrhmkqJU+=&8pl$qd1tzB0tCm@n|joknVOg5&1vyp_7l=lStah~^GB3_ zG+jhmzv;<+TJgDjD8t85Gc8Un=uLwJvu==e50VCN9SZobz^Zk!f|{S<9mCM^7Dq}U z*~_qABhN)V;wE(0o_(H@o2HoMz}_RRqkP*6Lft>yjJGK~ z;a?lQXg;D0YE7CkS6(WBxK37FzN#N%YO-btn>7zY(iHSQdHLCr>dfMT_sIpv;!R2= z)?WmsucN^j^sGtl!L5)Pkaf40Z&flc_b`~m@(nVo?lJf$7H4sK$kW)d!CgRuJ%nhR zNWLaq2FT36GQnsUGbaZ2KekjmvtCeM`=pO@82X%vtjc3e*r!5OZqv3 zNyKXsh}cuJ{Km#x$wij!7tc%2ie^3#|V2{trboFZx4lK9s# zj96h{4ppgvgPge`z8&2ruJI&Sf{qqZ9D{sfXT-)l{3+eTbK$$8mA5p9e^w1u*@z$^ zKh^(yqebW8LA-ffiY}R>K4J>6%vZLL%HY5DHbVp9xo^P^oWWPy3$6gwsP_u^&K9Sx zVMvbW7RwYeX|lW$JgM<(>OPBkB1zud%5T1Q&|$u2TkO6g#gyxE#c&-_Q6$sl*=J}1lX}LAdqd|!uKx(5NU(Uz zfF%`mtyymCl6Kn> zorp$>TPkN@)bGeIe;C;}>AT{iBdOk5>!70QWRT3kN<|ZZQZ23+%>YqA2;b(ySz3aN zI>9KugvchMbYp%&1K0WK@D8hay@wc(JI$UJ#y5mHk@CGt?jR z*X_U?>Z1FXyFr-|Z-g<)?+H0Re7kJyHt7=9pcxQ-w^C^t7RBSqTQZ?!L1vpSo?rb? z>Xwi6KT34`Q*JcE?qM4I3&H9?^8XrLs*$%n~i!8zYrz zOqel8c(aKkzry#kQy?rzox_ELVDSHA=Rn_W%dCSwqx%AFBnelV zZe%S>*o*A7A2;F3LP#|>52xzjQ_DQSeO+_f_0WzF;ami1&|<3lScYPn4I+qE4Ei#Z zzEh(pr$4%5Dq%0b2n?Kmw$>as=l} zWJYd9uL-cbgXL*8b%_IXhO(qkH{_|yZ#M?KrArhYG{eJ*5qJl{XyA4J%5HI5;&C_J zR~Y2*OQMo||dGapk)Y&8j)K0yNOq_X& z+w{I4{w|OqCEuf;a3bNTYd4|JqB#Md_Kk)&EuPtoiJrY4tTCdjAn@m~<1a@jy1d-j z(&~LrkZPM3-sy0i#Eh9!_VF(9jt)sn+b1Q1n1uwM$)N3DBR`J%+!fKrC>HMQx09dO z@)2S`{a?AFy|zzI+z=IZ(&=M7Vr9+!xS&29BK>CFh_TvD|D^tP8iYIm59Lxkdi^jAaV*XIh z2^#_wO;mF4{|fq&ta8|aXce}E@Lwi9p9x{GWMR+Eb+`Ue&~Y(GJcOGnbhFVCZY}tS zTY$quUa<2eZ_~J$E-{9G=r!tmqf`a#BVq{Lbxvyls`Fk?cnK4NPd67Fno?Fp8v0%@ zD_!f5PHk;|9cy&UnlPk-eY2w7oOt-|Te8KtxZypka%3R@EoqRT=O2hHApuc(SJ$_* zKu4SQI{pRxC_Ze1)q19#qM1Tvl|X!54Z(2-HP040ExmO{`QY5Pb~kF+S1$8?1R#cw-u6WtdGiAb0Q8-|^$jl^B>m{(W--gciJqoNL}%!+z!_mD zbk8L-JLGm-uLy{zoPm~j4>msxMxgMhm$_*t=a_bqi;o;zx0f(5F#$po5Qk80&ZuR0 z9BCxnPvxjxUsK3GITV{y5T>dX>beT+@!DCL(Erm9;zNgsFc3oy&XUg8>d($MR*b6N z+g>nmOtzaAX~IQ=7;iPlKcSWtGQQV2{L9=Lmm8SkeAq_pN*a)E^;LVfY1(~6#67=5 zU~4@wL|borniR9Ux7gxgcga2#=>8B@TEyFROo$tAf=xJ~`}n1u^}SaWHvhU&qv{?t zhI4&0;xE1ss!Nr_1}p)A-RT$}Dm!k_1}V;vt(4b_^Q{JhKk@3ifVsORSW?=@H;K&_ z>P0%07<+p7zZFwwbO#T5KBaW3*HW-VKKAowS{yKUg$m|07MnA45Cxl$Nv36Srix0c zd1Hn0|CWFG6QD|yw@6b{&s>SGI>y^VTIKLw|FQqi=t)1shc79b2X90neY3BUqv?>} z@uUl6u*q*rc`?W<0Z9?`wDUeu*sK;Vs@5UDdF0ty;_BXNT4<#+dJq0T{)Lx$EYF_AYoJ53L4Y%SQ0ickvXba_QETS}9{w5OEys=i2?qcm&x*9& zyFUhW-_zmuV&17}YP5T^l%34n5Zbuw1^|zJ2bet8(J}silWkjaZfRj)h+~D&({#g6 zrT(oti?>haI{q$CXWnt(Ms2a$;EDU$zOCFKU&Z=W``n2=55h0bxMkO{oc&iAuN(ir z37?wn_r9`h+}>zwdvLwY1owvdrV;*@mk!Ldj_IM?+WX>d6|i456TBWXZ!S}By_L8|M^|9 zJ(o7;m5TlhZkZo`{8zEdoHWMd?c%&P%q=F{UWXNkws^M6i~q2EU>0&#gKzC`P3{#k zE13%R*8XuWDSq}exBT#}`G-GzQCU^odXl+T@acVx8nKkPBa02M&j-52dG~=;I}7GL zyTqy$JX^~A{+Ca|;(9riEGe85?`m8=nemqY&+CWJTDEikXct}0{)?^t!NWjNKaNlN zf&U6i@BCX;bw#>Zy)az7==oGv=h=)_E4TekbKsp3El?-*)Lr0PSJJJ!37kBq80yV_ zFOvVJlN4)XD|mLqZ^EJP96hQ=e`hh&f9tuny}!QW)t##5{k5JB)35el|H&%&b5VPFh{*c* z_kMA}V-Pqpv%bIec|YsPA?f1T0q>l@{AQJ7yUE`3P+wEHG2Cdzyc6ecyx+a!&P=_J zsnvbiVyo44uM1XG{bAcW?{%?Z7n8Qedd(W=2j@lQuB(Y3ZF=@6L#0lA?M;S`;L_)c zHX%8tw?A%=yx;yQ?}5MxzED|aog@6dhQOg(Y%~e;pV;cXxTP}7;FEAiH zLGo$OA#D!-F8OKyEzcK(x$Jp%^x$4A*UVTphdEid`Pp(dXEE&-x!M2f>;m)VH;y+N zjaD1zI`L`wwJm=GzgU0MaKDSQ@d3uNl|pA!s>3w|gvZF>{f z+3v-mg_~adXJ>n-`+I}=#BSgLAF3s;5hW>!C8<`)MX5lF!N|bKOxM6z*U%uuz}U*b zz{=EE8%P=$%!}t-kD?(rKP5A*61Rr;OdExP8Z_WGlw{_n7MCRE7U0&iLwv#+pdJQK LS3j3^P6|`H9$PyxJmXUoQ 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%0A+^O43 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 z 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%0Ad`>?OTixE%Hgt9^5l3HsNRL0X<}c`-DT9M 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 OAS(AX@0Q%L2>E~Ng;B@= literal 0 HcmV?d00001 diff --git a/client/public/service-worker.js b/client/public/service-worker.js new file mode 100644 index 0000000..ac3537f --- /dev/null +++ b/client/public/service-worker.js @@ -0,0 +1,77 @@ +const APP_SHELL_CACHE = 'privatechat-app-shell-v1'; +const APP_SHELL_FILES = [ + '/', + '/index.html', + '/manifest.webmanifest', + '/favicon.ico', + '/apple-touch-icon.png', + '/pwa-192x192.png', + '/pwa-512x512.png', + '/maskable-192x192.png', + '/maskable-512x512.png', +]; + +self.addEventListener('install', (event) => { + event.waitUntil( + caches.open(APP_SHELL_CACHE).then((cache) => cache.addAll(APP_SHELL_FILES)), + ); + self.skipWaiting(); +}); + +self.addEventListener('activate', (event) => { + event.waitUntil( + caches.keys().then((cacheNames) => Promise.all( + cacheNames + .filter((cacheName) => cacheName !== APP_SHELL_CACHE) + .map((cacheName) => caches.delete(cacheName)), + )), + ); + self.clients.claim(); +}); + +self.addEventListener('fetch', (event) => { + const { request } = event; + + if (request.method !== 'GET') { + return; + } + + const url = new URL(request.url); + + if (url.origin !== self.location.origin || url.pathname.startsWith('/api/') || url.pathname === '/ws') { + return; + } + + if (request.mode === 'navigate') { + event.respondWith( + fetch(request) + .then((response) => { + const responseCopy = response.clone(); + void caches.open(APP_SHELL_CACHE).then((cache) => cache.put('/index.html', responseCopy)); + return response; + }) + .catch(async () => { + const cache = await caches.open(APP_SHELL_CACHE); + return cache.match('/index.html') || Response.error(); + }), + ); + return; + } + + event.respondWith( + caches.match(request).then((cachedResponse) => { + const networkFetch = fetch(request) + .then((response) => { + if (response.ok) { + const responseCopy = response.clone(); + void caches.open(APP_SHELL_CACHE).then((cache) => cache.put(request, responseCopy)); + } + + return response; + }) + .catch(() => cachedResponse || Response.error()); + + return cachedResponse || networkFetch; + }), + ); +}); diff --git a/client/src/index.html b/client/src/index.html index 574cb26..679e609 100644 --- a/client/src/index.html +++ b/client/src/index.html @@ -5,6 +5,13 @@ PrivateChat + + + + + + + diff --git a/client/src/main.ts b/client/src/main.ts index 5df75f9..37cd657 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -2,5 +2,13 @@ import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { App } from './app/app'; +if (typeof window !== 'undefined' && 'serviceWorker' in navigator && window.isSecureContext) { + window.addEventListener('load', () => { + void navigator.serviceWorker.register('/service-worker.js').catch((error) => { + console.error('Service worker registration failed.', error); + }); + }); +} + bootstrapApplication(App, appConfig) .catch((err) => console.error(err)); diff --git a/server/dist/index.js b/server/dist/index.js index 0849e77..b039f96 100644 --- a/server/dist/index.js +++ b/server/dist/index.js @@ -43,6 +43,9 @@ const approvePendingUserParamsSchema = z.object({ const adminDeleteUserParamsSchema = z.object({ userId: z.string().min(1), }); +const webBundleFileParamsSchema = z.object({ + '*': z.string().min(1), +}); const wsQuerySchema = z.object({ token: z.string().min(1), }); @@ -240,6 +243,45 @@ else { app.log.warn({ frontendDistPath }, 'Angular frontend build not found. Build the client before serving it from the backend.'); } app.get('/api/health', async () => ({ ok: true })); +app.get('/api/web-app/manifest', async (request, reply) => { + const manifest = getFrontendBundleManifest(); + if (!manifest) { + return reply.code(404).send({ + message: 'Angular frontend build not found.', + frontendDistPath, + }); + } + const etag = `"${manifest.bundleId}"`; + reply.header('Cache-Control', 'no-cache'); + reply.header('ETag', etag); + if (requestMatchesEtag(request.headers['if-none-match'], etag)) { + return reply.code(304).send(); + } + return manifest; +}); +app.get('/api/web-app/files/*', async (request, reply) => { + const parsed = webBundleFileParamsSchema.safeParse(request.params); + if (!parsed.success) { + return reply.code(400).send({ + message: 'Invalid web bundle asset path.', + issues: parsed.error.flatten(), + }); + } + const asset = resolveFrontendBundleAsset(parsed.data['*']); + if (!asset) { + return reply.code(404).send({ message: 'Frontend asset not found.' }); + } + const etag = `W/"${asset.etag}"`; + reply.header('Cache-Control', 'public, max-age=300'); + reply.header('ETag', etag); + reply.header('Last-Modified', new Date(asset.lastModifiedMs).toUTCString()); + if (requestMatchesEtag(request.headers['if-none-match'], etag)) { + return reply.code(304).send(); + } + reply.header('Content-Length', String(asset.size)); + reply.type(asset.contentType); + return reply.send(fs.createReadStream(asset.absolutePath)); +}); app.post('/api/auth/register', async (request, reply) => { const parsed = registerSchema.safeParse(request.body); if (!parsed.success) { @@ -1123,6 +1165,129 @@ function inferImageMimeType(imageBuffer) { } return 'application/octet-stream'; } +function getFrontendBundleManifest() { + if (!fs.existsSync(frontendIndexPath)) { + return null; + } + const files = listBundleFilePaths(frontendDistPath).map((absolutePath) => { + const relativePath = toBundleRelativePath(path.relative(frontendDistPath, absolutePath)); + const stats = fs.statSync(absolutePath); + const sha256 = crypto.createHash('sha256').update(fs.readFileSync(absolutePath)).digest('hex'); + return { + path: relativePath, + size: stats.size, + sha256, + lastModified: stats.mtime.toISOString(), + contentType: detectBundleContentType(relativePath), + href: bundleAssetHref(relativePath), + }; + }); + files.sort((left, right) => left.path.localeCompare(right.path)); + const generatedAt = files.reduce((latest, file) => (file.lastModified > latest ? file.lastModified : latest), new Date(0).toISOString()); + const bundleId = files.reduce((hash, file) => { + hash.update(file.path); + hash.update(file.sha256); + hash.update(String(file.size)); + return hash; + }, crypto.createHash('sha256')).digest('hex'); + return { + bundleId, + generatedAt, + indexPath: 'index.html', + files, + }; +} +function resolveFrontendBundleAsset(relativeAssetPath) { + if (!fs.existsSync(frontendIndexPath) || !fs.existsSync(frontendDistPath)) { + return null; + } + const normalizedPath = toBundleRelativePath(relativeAssetPath); + if (normalizedPath.length === 0 || + normalizedPath === '.' || + normalizedPath.startsWith('../') || + normalizedPath.startsWith('/')) { + return null; + } + const absolutePath = path.resolve(frontendDistPath, normalizedPath); + const relativeToRoot = path.relative(frontendDistPath, absolutePath); + if (relativeToRoot.startsWith('..') || path.isAbsolute(relativeToRoot) || !fs.existsSync(absolutePath)) { + return null; + } + const stats = fs.statSync(absolutePath); + if (!stats.isFile()) { + return null; + } + return { + absolutePath, + contentType: detectBundleContentType(normalizedPath), + size: stats.size, + lastModifiedMs: stats.mtimeMs, + etag: `${stats.size}-${Math.floor(stats.mtimeMs)}`, + }; +} +function listBundleFilePaths(rootPath) { + return fs.readdirSync(rootPath, { withFileTypes: true }).flatMap((entry) => { + const entryPath = path.join(rootPath, entry.name); + if (entry.isDirectory()) { + return listBundleFilePaths(entryPath); + } + if (!entry.isFile()) { + return []; + } + return [entryPath]; + }); +} +function bundleAssetHref(relativePath) { + return `/api/web-app/files/${relativePath.split('/').map((segment) => encodeURIComponent(segment)).join('/')}`; +} +function toBundleRelativePath(inputPath) { + return path.posix.normalize(inputPath.replaceAll('\\', '/')); +} +function detectBundleContentType(assetPath) { + const extension = path.extname(assetPath).toLowerCase(); + switch (extension) { + case '.css': + return 'text/css; charset=utf-8'; + case '.html': + return 'text/html; charset=utf-8'; + case '.ico': + return 'image/x-icon'; + case '.jpeg': + case '.jpg': + return 'image/jpeg'; + case '.js': + return 'text/javascript; charset=utf-8'; + case '.json': + return 'application/json; charset=utf-8'; + case '.map': + return 'application/json; charset=utf-8'; + case '.png': + return 'image/png'; + case '.svg': + return 'image/svg+xml; charset=utf-8'; + case '.txt': + return 'text/plain; charset=utf-8'; + case '.webp': + return 'image/webp'; + case '.webmanifest': + return 'application/manifest+json; charset=utf-8'; + case '.woff': + return 'font/woff'; + case '.woff2': + return 'font/woff2'; + default: + return 'application/octet-stream'; + } +} +function requestMatchesEtag(headerValue, etag) { + if (!headerValue) { + return false; + } + const incomingEtags = Array.isArray(headerValue) + ? headerValue + : headerValue.split(',').map((value) => value.trim()); + return incomingEtags.includes(etag) || incomingEtags.includes('*'); +} function normalizeSignal(signal) { if (signal.type === 'sdp') { return { diff --git a/server/src/index.ts b/server/src/index.ts index 02a60ff..177b8b6 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -171,6 +171,22 @@ type AccessKeySummary = { createdAt: string; }; +type WebBundleFileEntry = { + path: string; + size: number; + sha256: string; + lastModified: string; + contentType: string; + href: string; +}; + +type WebBundleManifest = { + bundleId: string; + generatedAt: string; + indexPath: string; + files: WebBundleFileEntry[]; +}; + type PendingRegistration = { challenge: string; label: string; @@ -233,6 +249,10 @@ const adminDeleteUserParamsSchema = z.object({ userId: z.string().min(1), }); +const webBundleFileParamsSchema = z.object({ + '*': z.string().min(1), +}); + const wsQuerySchema = z.object({ token: z.string().min(1), }); @@ -461,6 +481,57 @@ if (hasFrontendBuild) { app.get('/api/health', async () => ({ ok: true })); +app.get('/api/web-app/manifest', async (request, reply) => { + const manifest = getFrontendBundleManifest(); + + if (!manifest) { + return reply.code(404).send({ + message: 'Angular frontend build not found.', + frontendDistPath, + }); + } + + const etag = `"${manifest.bundleId}"`; + reply.header('Cache-Control', 'no-cache'); + reply.header('ETag', etag); + + if (requestMatchesEtag(request.headers['if-none-match'], etag)) { + return reply.code(304).send(); + } + + return manifest; +}); + +app.get('/api/web-app/files/*', async (request, reply) => { + const parsed = webBundleFileParamsSchema.safeParse(request.params); + + if (!parsed.success) { + return reply.code(400).send({ + message: 'Invalid web bundle asset path.', + issues: parsed.error.flatten(), + }); + } + + const asset = resolveFrontendBundleAsset(parsed.data['*']); + + if (!asset) { + return reply.code(404).send({ message: 'Frontend asset not found.' }); + } + + const etag = `W/"${asset.etag}"`; + reply.header('Cache-Control', 'public, max-age=300'); + reply.header('ETag', etag); + reply.header('Last-Modified', new Date(asset.lastModifiedMs).toUTCString()); + + if (requestMatchesEtag(request.headers['if-none-match'], etag)) { + return reply.code(304).send(); + } + + reply.header('Content-Length', String(asset.size)); + reply.type(asset.contentType); + return reply.send(fs.createReadStream(asset.absolutePath)); +}); + app.post('/api/auth/register', async (request, reply) => { const parsed = registerSchema.safeParse(request.body); @@ -1685,6 +1756,165 @@ function inferImageMimeType(imageBuffer: Buffer): string { return 'application/octet-stream'; } +function getFrontendBundleManifest(): WebBundleManifest | null { + if (!fs.existsSync(frontendIndexPath)) { + return null; + } + + const files = listBundleFilePaths(frontendDistPath).map((absolutePath) => { + const relativePath = toBundleRelativePath(path.relative(frontendDistPath, absolutePath)); + const stats = fs.statSync(absolutePath); + const sha256 = crypto.createHash('sha256').update(fs.readFileSync(absolutePath)).digest('hex'); + + return { + path: relativePath, + size: stats.size, + sha256, + lastModified: stats.mtime.toISOString(), + contentType: detectBundleContentType(relativePath), + href: bundleAssetHref(relativePath), + } satisfies WebBundleFileEntry; + }); + + files.sort((left, right) => left.path.localeCompare(right.path)); + + const generatedAt = files.reduce( + (latest, file) => (file.lastModified > latest ? file.lastModified : latest), + new Date(0).toISOString(), + ); + const bundleId = files.reduce((hash, file) => { + hash.update(file.path); + hash.update(file.sha256); + hash.update(String(file.size)); + return hash; + }, crypto.createHash('sha256')).digest('hex'); + + return { + bundleId, + generatedAt, + indexPath: 'index.html', + files, + }; +} + +function resolveFrontendBundleAsset(relativeAssetPath: string): { + absolutePath: string; + contentType: string; + size: number; + lastModifiedMs: number; + etag: string; +} | null { + if (!fs.existsSync(frontendIndexPath) || !fs.existsSync(frontendDistPath)) { + return null; + } + + const normalizedPath = toBundleRelativePath(relativeAssetPath); + + if ( + normalizedPath.length === 0 || + normalizedPath === '.' || + normalizedPath.startsWith('../') || + normalizedPath.startsWith('/') + ) { + return null; + } + + const absolutePath = path.resolve(frontendDistPath, normalizedPath); + const relativeToRoot = path.relative(frontendDistPath, absolutePath); + + if (relativeToRoot.startsWith('..') || path.isAbsolute(relativeToRoot) || !fs.existsSync(absolutePath)) { + return null; + } + + const stats = fs.statSync(absolutePath); + + if (!stats.isFile()) { + return null; + } + + return { + absolutePath, + contentType: detectBundleContentType(normalizedPath), + size: stats.size, + lastModifiedMs: stats.mtimeMs, + etag: `${stats.size}-${Math.floor(stats.mtimeMs)}`, + }; +} + +function listBundleFilePaths(rootPath: string): string[] { + return fs.readdirSync(rootPath, { withFileTypes: true }).flatMap((entry) => { + const entryPath = path.join(rootPath, entry.name); + + if (entry.isDirectory()) { + return listBundleFilePaths(entryPath); + } + + if (!entry.isFile()) { + return []; + } + + return [entryPath]; + }); +} + +function bundleAssetHref(relativePath: string): string { + return `/api/web-app/files/${relativePath.split('/').map((segment) => encodeURIComponent(segment)).join('/')}`; +} + +function toBundleRelativePath(inputPath: string): string { + return path.posix.normalize(inputPath.replaceAll('\\', '/')); +} + +function detectBundleContentType(assetPath: string): string { + const extension = path.extname(assetPath).toLowerCase(); + + switch (extension) { + case '.css': + return 'text/css; charset=utf-8'; + case '.html': + return 'text/html; charset=utf-8'; + case '.ico': + return 'image/x-icon'; + case '.jpeg': + case '.jpg': + return 'image/jpeg'; + case '.js': + return 'text/javascript; charset=utf-8'; + case '.json': + return 'application/json; charset=utf-8'; + case '.map': + return 'application/json; charset=utf-8'; + case '.png': + return 'image/png'; + case '.svg': + return 'image/svg+xml; charset=utf-8'; + case '.txt': + return 'text/plain; charset=utf-8'; + case '.webp': + return 'image/webp'; + case '.webmanifest': + return 'application/manifest+json; charset=utf-8'; + case '.woff': + return 'font/woff'; + case '.woff2': + return 'font/woff2'; + default: + return 'application/octet-stream'; + } +} + +function requestMatchesEtag(headerValue: string | string[] | undefined, etag: string): boolean { + if (!headerValue) { + return false; + } + + const incomingEtags = Array.isArray(headerValue) + ? headerValue + : headerValue.split(',').map((value) => value.trim()); + + return incomingEtags.includes(etag) || incomingEtags.includes('*'); +} + function normalizeSignal(signal: Extract['signal']): SignalPayload { if (signal.type === 'sdp') { return {