From a7db8e78b97dfb9817e36a13d98685d50acef065 Mon Sep 17 00:00:00 2001 From: Refringe Date: Wed, 6 Mar 2024 14:18:08 -0500 Subject: [PATCH] Refactored build.yaml and removed unnecessary files --- .gitea/workflows/build.yaml | 24 ++++++++---- project/build.ps1 | Bin 4594 -> 0 bytes project/build_launcher.ps1 | Bin 4716 -> 0 bytes project/build_modules.ps1 | Bin 9678 -> 0 bytes project/build_server.ps1 | Bin 7064 -> 0 bytes project/combine.ps1 | Bin 6692 -> 0 bytes project/header.ps1 | 10 ----- project/modify-launcher-executable.js | 53 ++++++++++++++++++++++++++ project/tag_validate.ps1 | Bin 4886 -> 0 bytes 9 files changed, 70 insertions(+), 17 deletions(-) delete mode 100644 project/build.ps1 delete mode 100644 project/build_launcher.ps1 delete mode 100644 project/build_modules.ps1 delete mode 100644 project/build_server.ps1 delete mode 100644 project/combine.ps1 delete mode 100644 project/header.ps1 create mode 100644 project/modify-launcher-executable.js delete mode 100644 project/tag_validate.ps1 diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index 1032b09..0548395 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -246,25 +246,25 @@ jobs: image: refringe/spt-build-server:0.0.4 steps: - name: Create Directory - run: mkdir -p /workspace/refringe/Build/assembled + run: mkdir -p /workspace/refringe/Build/release - name: Download Server Build Artifact uses: actions/download-artifact@v3 with: name: server-build - path: /workspace/refringe/Build/assembled/ + path: /workspace/refringe/Build/release/ - name: Download Modules Build Artifact uses: actions/download-artifact@v3 with: name: modules-build - path: /workspace/refringe/Build/assembled/ + path: /workspace/refringe/Build/release/ - name: Download Launcher Build Artifact uses: actions/download-artifact@v3 with: name: launcher-build - path: /workspace/refringe/Build/assembled/ + path: /workspace/refringe/Build/release/ - name: Clone Build Project uses: actions/checkout@v3 @@ -272,9 +272,19 @@ jobs: path: /workspace/refringe/Build/build - name: Merge Static and Dynamic Files - run: cp -rvf /workspace/refringe/Build/build/project/static/* /workspace/refringe/Build/assembled/ + run: cp -rvf /workspace/refringe/Build/build/project/static/* /workspace/refringe/Build/release/ shell: bash - - name: List Directory Contents - run: tree /workspace/refringe/Build/assembled + - name: List Release Contents + run: tree /workspace/refringe/Build/release shell: bash + + - name: Compress Release + run: | + cd /workspace/refringe/Build/release + 7z a -mx=9 -m0=lzma2 ../release.7z ./* + echo "Release compressed." + + - name: List Release File + run: | + ls -la /workspace/refringe/Build/release.7z diff --git a/project/build.ps1 b/project/build.ps1 deleted file mode 100644 index a28584ad0c43198171433e4db31b25d3fd7be284..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4594 zcmd6rZEqV@5QXOpA3)+itQ@ON1Zx6F2qGcWyp>3HQq^gLs6%jUr#7|SV7m=%l^@eT z3OwhIZ+F*m97~M|T6uTx-FxTd%$%8B|MT~Xtyp3QHnNs=tz%=GaNp$IVSWBc6T58o`l`QXZH?%dYV2Q@vg7yQR$+sqwC-xphpauf3ud}JpVi!$Vi0|61eBVf(?Mp1r(^rNpmP@whru7W&5@ODj;HXD z_w9gaM7l4q>JY7=W#Ci1YFKENGRKAzF?>r-m)cg(l-pVb5A&RQ}+H+dTj&kD_NpN`zzP zrM8O~BdlzJoe-+Q?rnPlKX%~GHlrF0+OvJ0Dd%2em8=}DH!`tHtQ5Vm{Y0c2a6-Q|Myo`!Nj|*A ztJHqAbvNS2I-9)rBapfkqlwq3e)4W%A;&2GrZDkvrN4zF#CvTfPCO|VNnN^ww5 z_ql5m)nb+C*k8f^gnUQ>!**FKuFmU#igQ*AR)WRi#X+#X#?BY;AVJR?w5pEwh^_j} zDI@h5u~K}?q_-HWhAAK1TIaP_KkpgN9I-=8en4FjpAWfv$R07JWZ&Z3_x!|xO`aF) z##8h=0$QwW^D})b$+e$H8`0>>e}PbIR4d&^mdj z?yg9v4yt!#{%7wOm1(VcieFVYv(5DoPu#;g61;DxRMmV9RUeK0I%UrY`L96KD_Rwe z@UYLBcX!9+B$q*sU+nafB5uu(jh>~jT^S_{WV!NS95Q``m73cJpM7k) zV5QJ$GrlO)l(NlYBK~>iZn0W#A6^%9U7y3iEYFvbbv4iP9W3Tc9jzmf(K)^w#`hx6 zSmo(sY}ffNqnPE`3D{>=|JPB> z17wrq?)B?hq%6}xVoiayKq<>FhV()gE$dg^rytx_+aP<^&|m;OJo zv_E70a#6m$IL_j7H44ku+nZ%wji{>nfIg~zpqd`@UtOdbdPMvJR9|f|d&V_#S-Xl~ zi|W;S>Te->Lz(}by%oL@Hp4f<&Yjk5e=mv%F)_YLQZd5w--qAdoBze= Vx#0g)_sjBs zW54jW%c_=rW}k+0pOpj7D_aTo6>D|8vh=2AN6o4gd(O&hG@bI~h9`Hd{D!m1{Q!-% zt=dl$a)#kukA0WC)7k@TV`1Aiti$h#9dh+7>{<=KvTcc#+hZR__;p(BgrwdCB`1;3}9eXcKq{);KSN38C#zP2?i*SgAnFZ@hs zl{h9mOB|YDS!4GQ-IrX+=eX8Uh!}U`5vpB;X7Eb8%Q~?+2VtK}_#z`;GTvm!sutSFlX@iD3~7F)Uq2e^!xE zX2a}Q|Fu-%ceFmnT9K{sM##TK-{R=!jH!rh8TGpfHYbhB-W~jr1@c61y67CBHP4=I zxQpH?{)xp)?A&KhpF>FB*zJ8~l8ip+K2&+XWR2%$tktSTm!{{pc%r8j5>>BWkE7z1 zc76^C*DW-wMn+VpJHV_A@>;wP7b6E>V}bI0NM%^(I0uV&WW$hWYrIk2{1r`l*5&_- zH60K+~G!!cI?n*f$J$tjZDPcE&!8?llP4RBOFY#?{e^7IjtGU1N!Qr6Mi68ii+z zrEK8)CH#{8!VH;-?p`==PK`d)*iv*>G9|BQ{1$-4F! zEVfj+k=Ikl&3pfVH*IVZu9_|6L7D&_hvy>sW#9Q24KG2rh9jDYl&x*5oaejuN|$*7 zvi-2~advOvam^mdc!B>%A>+Ib%tGQJslNXIHY$&m(bwVstAKG?F{9nHd#!un`59}A z_l74STXRIqnh@oxhA6{tSs&|MMGf*kBkR2WYt|H=74=#XRh86T>SjJ)X!6hw_pAy2 zixJQqRu#1-k819T`&)YAUE6pE2x z$F~~ygd8ik^kky?&WhZ8YjO@HL{;OLIJd{x&zcCevz%b^DyDhlI&@@lEp|Tjd3EU_ zId>NNN;zev**ey*9he&@tLYhWdge{D*ddzUuy@uhryTGKAR55m8VF&$f`w_bisT6y7)@J3$R|>Ivz9(LD{rk^Z zJP(sH_oD4(6`8N+!)nJo97-D=m;ZSd=9&F)-YWy+G!gTDo_Dje|G(sLZgcvUe!u)7 U-%jG}`(;NgmzP&qReoRbFE`ZRmH+?% diff --git a/project/build_modules.ps1 b/project/build_modules.ps1 deleted file mode 100644 index 3815db54c57a4be26dc40a62dc1af9f0e15aef56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9678 zcmc(l*=`%h5{COG7Y>kj7)XRA1tFc>8b|;wRH7VffkZ_?tU!mNXqmCKgp}>$EDw`s z%zcvo>td;AhBI6YAqN7Q7f1|7Y zFw*&L80yMTI_qgnD|`|@j-P|j)tzp*3ajxv(^&qVhjgc}C;A$-DyiLYExBD?xzUyP z8u_I@4V@1)TR*IYA4_sZ@!mksUFsfV4?{aV(`P*#>H92nbo6!j>|UpTLxSV170K;1@jY5il?H!xLQ@$iGAd zucZ-q2Ja*1CcMyhSD)89zKrv~n3(rOqX!z_4^3&#xGek{$GXo_)Qa)+`_H8#vGRB{ zWH%Wy(%hFiA}@TbdBM+!vDsmIUn!?7`d{n0J885PeS)1$`HcLyidV9*q)f5Drsmt# z{R{nN;T!!u)u=0dqr*~R{=BvO^2MEI_1bcZD_oCZ&kT({zIEy z^qA$@n(CBzl2Od!&)aiL_vbF}G@Q#nh6JN1oEH=FHc0FP^zo z_&e3svYtH9Gq3fBhi}5Wd%Q#j5vlJ=pJ{}ls$(elc&W~iNe)qYsiSMj$aG|}ur7oa z)pdj`?$EdP0q(xnbmAzm3TH9rV65>`FY--Z0}RuwwZwWjWXX-1q*ReDX@gZZBdAQC74f_=u0y;ILhi_h7tsUs-924>C;9uTeDCcb z(R+=wNVZ}I;6?n#)q%7dMPvcXT<+1>g1h?}@M*$+;}1UCwP*?F!JED`fkO~u^ja!d zHe1TNY`;|AAmLh?kmV+)H;x^WjX79MnzH&_Pk{ivm=|@tf?THG^yNv*pf4orztYij zm}85u_vAVn*}%bC&#KAH+wC&TuU6_LU>>MC!CHT(e3i zW6bXjz3zMV1Xkt=+zqq4^AIMUgNt0p zj!aa&^U>w$(j(Q}dF(4iewEn1NK860u#RTAjX6Ha;K+YN2ehik zn0YlQv+#%20x#Rz$kwd+6%G|=Ya&MRsfztlfW>Xg*1Op2J)h{6KPwIv0cs1TM+D#y zS@=#zuvc46Sq(H|tzh$ntIkJ0MH=-QgEh&8aT z+lWOlw-sgN$~_wd1Bf*qF0b4`$gZ-PocbdAJD(BD(LeC^o{+_ND?G0n^4&B`txDcX zJ{WmXh^8YYip*cOwt53wWaM^SCmEUD@s?xO=QR9Y`k_QrR=EFNnr! z)c1v|M<+ibb)-2qr0Mgi*cn%dtAfC*wQpPi|{4q07Y!<2r1$F z#kw#I_S}6K#`KUFc&ys)jyt9^CEFL8RrAF)?!SeCW&Ef{GSj9$-i9I5S2S(y?NE`wCk&NeCqW{*exedHq9#Ln+fp7RXx9X9rZk!#$Dw_o|0vhagA`hl)`&wcoOVa>v7 zrTm84Vq&#ae4k9Dr=#Ct%#vhno{^DF2l7RF*Is<9$;xXawqg}qol%Y4&KfJ_wiqe@ z@6nNL*c(0QPTs~ca@XISXW`TERd_sJe|aZ%UeS;Q{%@rtdEd+L9kF8mlcX&fAHFNS zk(=Fi^X)$!ERt!5uxN)_|0q0?1^G2py=A=BNx3v@C%Vp3o7X+FI9JGHqv!biyU2Cc hJ$%+zBmEzbXT3pAxk_gJ@!0&8mzLkH=PiPb_y;QW;*bCU diff --git a/project/build_server.ps1 b/project/build_server.ps1 deleted file mode 100644 index 0327fe371246137dbfd8121697c162b9134ec7ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7064 zcmeI1T~i!I6o$`@7qQC!Ftuz2Fz%A5H&UgkKsFI2gbJjhl_>JDkTtMSED2KTkI8TJ zUVWcF+jP(D?6Sm^-dI~R%t!b6c>6scJ^c0Oj1{(IudQc?wx{bedud($-O%~e-h^{u zC%QhipLMsZ5pDa(J`BgYZR^dp9obyCFEo?ib4zc!nt`l2d!&(lY1!73V?DXh$S-v? zb$==wx;Ae=ROAf8yPoD9=pAF9SjSd%+>?zR+pNNee+Kh(T4S#&>Of}bs6 z#=0DZCxtb%LjG$>-y^->)330v^;^`aBb~9KQPQ7#`&d|~)q@xw|fp5_es03)GlH4cu*uD|# zm&N+3#21w)tY!kK{3VAw@*;U=&GWyceQ`2q0Dt1Jc{V zoOfOOMepIJlKO>s(GhIhi<|U&XOZ80oW2O*#(fY^~xY3n2tlewro6Mb@ zYlUzubLOHF2T2=ozan4Iju*VymA+GH%;Ro1+(pk|PvZZKX0B__p?;uzZ0DCb4H-xp zm#;t3d(V3@yOY5VjOXX_f~SR~k>y?vSHtu3_{am#<&gFInn8A+j9p|S*?V0qjvRa` z?PQ37a>;^zd-CIrVrZaeExjSrz6y+M3$tS(xS$wW7e88x$Zv%!_sRFREWsn!M_qws zWrj3|kpkZ2uNB$9AH1g;t?B8xq(4?<#)^k;7aHkn*bZwCf?&qeo@^V0$S2oCxf?_K z&n`89XUfc8RpaPrMO#^ze9)C8R903OyBa0Wu9k97z8{D&Na)KF*zIz5hwFx9ucy8u zEqT48SybuWz=?6y78X+txBbaZ7K1PXJE(8JB3rd>BuH_?fgb3)=IsXqSwaeI=kwvdQDQe<_sx1RIUN}E%MSlDkme9c>`bfz`;UMXf3$F~^Pgd8ikbgPnm>sD^O zH93b8qU87)9S=e@(TBu-B6WbwEO#w=7NZa8hlz*Hr%DeLb337~lsl``jmP}8 zBF(Xz8tn=g8H$#;zY&Kwuhdy&w z?@n}0KZ$16z<08E2@dE(7FUO|>y@4&=Z>U*s^c?Vqn(UAt1dKuUZ;O2;Oo5$9q{|G zpe62hB#GX#W!bc(RZ3b)=^T%NX;HzV9@MgtR&_n>k0AUtLSOYuGi~k)~MRQswPvXWp^z zG@r^nYd*z{H~5@L8{mFU%ALq3ANb0=U>C>(HPw&H?thcH?;4yr|Jw*Yg8i3E1hR` z`dilL`j$?M?R9OfMq!<`qdUMHr>ggf@42kH3feIC!Apt_Vu0KgYm8UnIxQ{}E^i3O z$vMCJWrkTC<84_9F-@cqlQFK)l)etE>pFcA<4XqnII;nrv-k6g>z0n&L&MMw)!9|~ z?9tYj6uxkvm7dRSDC}eV%5Ex~VtMTN5`R|J?QBQ}QM;nQ%j)g#2QI#QN4h39KdP|= z6nrP?>y!K7-rleqvOMob$9ctWZu$;%oR_XOqB30 z3;lH8kE&5dC3`jOaj(x%{@Xx*kowj|<>0z#{V&-&Y9)Js{}~*!T4eAjPX88*-`<@3 X)ibe{e&_8?kM=ww@;xSdUmx)|Jg+yS diff --git a/project/combine.ps1 b/project/combine.ps1 deleted file mode 100644 index a9b1b93661b3c3e9fc40f5e3dcc20c184a52c0e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6692 zcmc(jT~Av_5Qg`r7pc_$aB5pAR5b}z`jJSfnh;2+AfS+_RYHV}ZHQY#5GHL%+aHtL z{=MF}ecl}pyXV6|E2PS@&+*wkv-9!JJG1-uU+vHiMR*!|;ioXyF=x`X<95LsRCz9EVI!LD>cSD{Jvh@o7X~r8~`d#|?c_skwKe;B%9EzT>#uW@d{+xl!qi9ObvD?Rt|7wC8r zr5v)#%g_nyNSpBK@qbu)XTJ2W!+U0j>3u*vig1_jL*6?wN{3cy#oXErd~w2x`Yo9E0?q6Cykx9uk;(i$N>)^JsqVv8 z_~4TwETOYwM_AcM+7oQcQL=&$^xt)r#5VJ`q7M}H5q29w<$+P0t63fVvx>Z(a4+0v zzWHwM%zM(MAN^%0n+Ju8rqEJ;e{_U5nvsbh*iQ@k%|hgP*?) zx5%L{kbR5q=X|u1@Txc(cj~T9jKv}cL`8T{{4btJ8CuV)Q|69hT@dH1I*jqHD%Jot zEx3EjxUevZYuem7xIz3RMt1%XBd7a>ubfHdkyx%J%}n`cJGaMqQhYJQK5^F@RM?TVKd&zR_^;U-c|LKzVz3lf7h)wt z-N7$ht6X*(J^46}mbJLZf6~jfeu{NRahXl;7okq) zDB_^Zo<+u0mi(ob0-I7qdjY6(bMMqN#}G(a$AmOvuggsfb$t zvy7km$m_E9Zq~V$^UO8qM1+ocN6ap+NUN&P>cBS(u^Sae9>*9Ad9np+c4Nk?-%#H& zSFv}2Zc!cTK9XNexye`ctNJNLRt$bpS@}C6Aj!EO^84l-ly8zZlP$CDblkg6esyN+ zqQh&nb6;#?`zn@OwUPePQWdDqW-iOGWqU18t()2+BgRNNk3pM#Wj+!5wA09u?yLH> zZqa3UJ73i_p1*{pzUD=&R+p{_UL~iwCe^Dkb@i$LcV9K*Upgx0!bEO?p9h5mnyIbMX z_(;s{IcvNrU7Pj>v%QzRHM??jORTFkY!8&%?E0&s$#>$*s`kyD$QpaLdw5)(&@mrb zsGW45kGcifJ78yNk-OYJFx4AXRofXGr`9`~^J~y^GG~*u#i_E%7=2;d^)yGR&3s`= zdji9>pA~!+p7TsQZgqWDZ-n+;uqf;wMc>&@(ec~~dTR$Q?$HxIVwS2%3%0yNpK4Lt zM?0(Ksp4<*UU#~l?%z>kY*q82%g>`YTk{DKQ8cVuYx0?&-MFoqpZ5ChN8cySveoA8 zkXfr#yX7-$9do|#*4}dye=J~^JZd)8ZBb{fI?#*R7~7BPL|(`CFdfX1-2Ks+r%KK6jtx z$k+~_@=g)H;oAYBX}{(9n!1fO@^cHOSPnmc$fxk;2D*q@yyLiePWR;=&(CUGK{YG) zpz(>$NiEy08P3=>#p$vD78FEWLe|+3&GSY~7=p zY0s_N+{~W2hT5lD_V2L6S!P#QJtxg`zZ!YvWjSO2eRfv4R6Rs7#h5&8(W&NVUF(#e z=Jo&5-K>B>RWotGG9L6EC+`6~qZ6vi9gj!4jv8h5h}aaIgy^ciOE@g|Q;M0Yo1&EP f(~R!-*UvjKFYn~dukWuL>*Vt6G$ft%+l+qz#TxQ! diff --git a/project/header.ps1 b/project/header.ps1 deleted file mode 100644 index 53af4fc..0000000 --- a/project/header.ps1 +++ /dev/null @@ -1,10 +0,0 @@ -Write-Output "" -Write-Output " █████╗ ██████╗ ████████╗" -Write-Output " ██╔════╝ ██╔══██╗╚══██╔══╝" -Write-Output " ╚█████╗ ██████╔╝ ██║" -Write-Output " ╚═══██╗ ██╔═══╝ ██║" -Write-Output " ██████╔╝ ██║ ██║" -Write-Output " ╚═════╝ ╚═╝ ╚═╝" -Write-Output " Once it hits your lips," -Write-Output " it's so good!" -Write-Output "" diff --git a/project/modify-launcher-executable.js b/project/modify-launcher-executable.js new file mode 100644 index 0000000..86dc633 --- /dev/null +++ b/project/modify-launcher-executable.js @@ -0,0 +1,53 @@ +/** + * The sole purpose of this script is to modify the version information and icon of the Launcher project's built + * executable. This is not a necessary step for the build process, but it is a nice-to-have for the final product. + * It is required during the CI build process because .NET 6 will not compile this information into the executable + * on a Linux environment. If the Launcher project is ever updated to .NET v8 this script will no longer be necessary. + */ +const fs = require('fs').promises; +const path = require('path'); +const ResEdit = require('resedit-js'); + +const manifest = { + icon: '/workspace/refringe/Build/build/project/icon.launcher.ico', + author: 'SPT-AKI Launcher', + description: 'The single-player modding framework for Escape From Tarkov.', + name: 'aki-launcher', + license: 'NCSA', + version: '1.0.0', // TODO: +}; + +const serverExe = '/workspace/refringe/Build/assembled/Aki.Launcher.exe'; + +const updateBuildProperties = async () => { + const exe = ResEdit.NtExecutable.from(await fs.readFile(serverExe)); + const res = ResEdit.NtExecutableResource.from(exe); + + const iconPath = path.resolve(manifest.icon); + const iconFile = ResEdit.Data.IconFile.from(await fs.readFile(iconPath)); + + ResEdit.Resource.IconGroupEntry.replaceIconsForResource( + res.entries, + 1, + 1033, + iconFile.icons.map((item) => item.data), + ); + + const vi = ResEdit.Resource.VersionInfo.fromEntries(res.entries)[0]; + + vi.setStringValues({ lang: 1033, codepage: 1200 }, { + ProductName: manifest.author, + FileDescription: manifest.description, + CompanyName: manifest.name, + LegalCopyright: manifest.license, + }); + vi.removeStringValue({ lang: 1033, codepage: 1200 }, "OriginalFilename"); + vi.removeStringValue({ lang: 1033, codepage: 1200 }, "InternalName"); + vi.setFileVersion(...manifest.version.split(".").map(Number)); + vi.setProductVersion(...manifest.version.split(".").map(Number)); + vi.outputToResourceEntries(res.entries); + res.outputResource(exe, true); + await fs.writeFile(serverExe, Buffer.from(exe.generate())); +}; + +updateBuildProperties().catch(console.error); diff --git a/project/tag_validate.ps1 b/project/tag_validate.ps1 deleted file mode 100644 index e9ae7f565d3183dfcca90c0a9e6fa6d6b09b93ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4886 zcmb_gU2hvz5S^Dk1gZbwvbLH;)GmFb5)vV#A;S4k9d+n7;D& zcn8jz@#OB>>)3&4WqWt;?46l2GiPS~&)*fPNRaQPEd%LG7r#?Uac3&O=((NQowoF_ zlFEBXP9QPCRbNJWuPq%s5#(IPlF6@->OdmkD#g7FvVB}=$Hq`g=+!PjlgFP&#YQT(f8S0%N339=X8uT4Pwu>Xk zw>X|aYKU*zkQDUiy*&mNQ)uKj_j{$Wp0~&1TJ*^FywaWNU4B=`Fp+zk^R>ZzC%#QZ z#&#)x_OD8iU5$E2-pn$L8E=^%tB5(@0ahMuM!yHom*=8srPY?LCvuEjHPpYFtCR#5 zOckRE_I!k+3tewfV-w(3!wPfl4Xon54t|G_IYoUnvAQGQ$$?(8!rtP^F{FC%W(u?) z7UFU@nhs$>7x5$)Ocr!)K_#}|8;A4LE5&uhEkqyY9#*eJ9_c(9soe{2>4_1BT zOUjcWtZs~FFLCDrmUE5y!kAcQGKM3K6}i;7X`+#$_JI7TVLihd&zJFCfK*;z84}w- zYMyDzYvDjG@*d+hdo`Gz)fw-cW3@y3ALB!G_p~SRj`?VqkZm(XGF*F{_lf(QE865I zGS4}%WVJ9SMv7Tvh$`aTz|jJW9m{h$0<+Ec7iN!Dc#54YQjRgJ)ca+=ZWl3RM`F~A z9PZv%VI_O4=LoT-PP63*w!cH{j^*cE7e2*)x_j>OO{1NZ`|*g z;rYy~qYIMPy6B1-GKW&G(QCT|Ba_DJSfwr2(@na{yz|~R&qwv^-mnXsX%E?f zJvN|YFLJNj@4w~!EZWJ*+}?(m>6{FmcdVb~Q7C60*Tk8CT*69mmgMe>>}FFMI~gMo z-=eICz0t+~_$g%jWD6qC!@w z;KMp9-d*&Ovx>ca*mPdRJ64)kR-D?)ER0OHp%yfC?|>=r0vs?