From 5f7030226325765691f655212ca816800fef4fe3 Mon Sep 17 00:00:00 2001 From: "alexei.dolgolyov" Date: Sat, 28 Mar 2026 18:41:12 +0300 Subject: [PATCH] feat: use custom app icon for shortcuts and installer - Generate icon.ico from icon-512.png (16-256px sizes) - Set MUI_ICON/MUI_UNICON for installer wizard - Point all shortcuts to icon.ico instead of pythonw.exe - Add DisplayIcon registry entry for Add/Remove Programs --- installer.nsi | 10 +++++++--- .../src/wled_controller/static/icons/icon.ico | Bin 0 -> 21627 bytes 2 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 server/src/wled_controller/static/icons/icon.ico diff --git a/installer.nsi b/installer.nsi index 3fc3456..faeb8f5 100644 --- a/installer.nsi +++ b/installer.nsi @@ -30,6 +30,8 @@ SetCompressor /SOLID lzma ; ── Modern UI Configuration ───────────────────────────────── +!define MUI_ICON "server\src\wled_controller\static\icons\icon.ico" +!define MUI_UNICON "server\src\wled_controller\static\icons\icon.ico" !define MUI_ABORTWARNING ; ── Pages ─────────────────────────────────────────────────── @@ -102,7 +104,7 @@ Section "!${APPNAME} (required)" SecCore CreateDirectory "$SMPROGRAMS\${APPNAME}" CreateShortcut "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk" \ "wscript.exe" '"$INSTDIR\scripts\${VBSNAME}"' \ - "$INSTDIR\python\pythonw.exe" 0 + "$INSTDIR\app\src\wled_controller\static\icons\icon.ico" 0 CreateShortcut "$SMPROGRAMS\${APPNAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe" ; Registry: install location + Add/Remove Programs entry @@ -117,6 +119,8 @@ Section "!${APPNAME} (required)" SecCore "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" \ "InstallLocation" "$INSTDIR" + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" \ + "DisplayIcon" "$INSTDIR\app\src\wled_controller\static\icons\icon.ico" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" \ "Publisher" "Alexei Dolgolyov" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" \ @@ -136,13 +140,13 @@ SectionEnd Section "Desktop shortcut" SecDesktop CreateShortcut "$DESKTOP\${APPNAME}.lnk" \ "wscript.exe" '"$INSTDIR\scripts\${VBSNAME}"' \ - "$INSTDIR\python\pythonw.exe" 0 + "$INSTDIR\app\src\wled_controller\static\icons\icon.ico" 0 SectionEnd Section "Start with Windows" SecAutostart CreateShortcut "$SMSTARTUP\${APPNAME}.lnk" \ "wscript.exe" '"$INSTDIR\scripts\${VBSNAME}"' \ - "$INSTDIR\python\pythonw.exe" 0 + "$INSTDIR\app\src\wled_controller\static\icons\icon.ico" 0 SectionEnd ; ── Section Descriptions ──────────────────────────────────── diff --git a/server/src/wled_controller/static/icons/icon.ico b/server/src/wled_controller/static/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fd0e16b75841a6b2a1a0869793019ac4714e86e7 GIT binary patch literal 21627 zcmbTdbx<5p(>FScySpw<0>Od?0*gcNV8PuT0>N3_JrE?gy9IZ5cL)&N-TmWvpSSA% zbL)OpcdDlL^mcEb*)wOlf9H34000Ca09aVS+W`h>VF1ANKP~WoJ@m{@ae0013IiwUc^{< z&zXmdIW_$nx6K52JH-6#*)O%{+I^or4Ff4!r(&iLEct|vP*Z{+l2b0&&P6!_{9SE{ z|85Bs2+_B&^qC(utL_jQ~4KSeW7B%TlTu2wsf0cRplS2z60@vFs3k~r8D8^BU z$@-TJZJBG2prSOkh-W&H`%v~fFq(dm1VJRBoBq~kRi_6m=12s7ftj6LfBz{9tqlWH z=R1@eoZQQ0(-oox7k4J(Dxi>ff6T}3afXEESx;7@&`NQC;g*JKQVKNgj2741Gn+&c z1TBkl>pU&~{^i3~57ZkuPQaMo;&rLQ)Y_ZCSLB+Dt^V|l+Ua$ zI8WLIHy-ahufi|>%d~sbwq(&r3D{sZ!;23>-VQJw8)fk7PVe1`B%9UQ^b0CPR6~(~ z0@KGFMr_}7N=R!Q9Tr$o)x}zQ7~d$kR00&k#ZgCgNp#7m8-j!eko=St0$(fVrjSX8 z=fMCPj{ajR= z9BNdORpePx{Zm86I|s-}-en^hTfK%D9do6Fvbzoi4%@k|Zdb>@%a+o%7ZX5KwtdPO z?R)CO3Hv66Y6|mxtK=2w<;fsXSwIDgKkIYN;**2H=E)~Ww_St^eRVSHiBsUD*5eAE zFLNW68KU*V749!mTuRxlI6S4zC=cR|fGqP>O;=B&Rg9&DsBOz4;YY@e6>%45GmcFj z&&{F1!RYAlUkezDSkrU9)Gpb04jWTjp$ZE3&f~}oG=nGk2OveIc;fivO6;h%&!28q z+1pQq_c*4_df=$rcO+ROB6WTvrTQv!C+|;7VglI7pd4MD6*uWM{;rlCvx`e{&s@iFS*`t_}c+mKDC;+bItxB z=uen~RJX@n;5s|IGnipb=;A{K_R%--45i#+;XEwrIPIbBIJBz?z_?KRLmqA@;~$X) zw1-mRx^P)poIL(uo|D=p%TIWpi;c}MPtlQ4{KBf&%We+wQ`Fz}s*Eh1GHriZoVS0) zp)h8&4wzj_miahrAgSYUyMRv1eUDlh9?nvh!eBFZO13tW&S-LRYBM*JI2oVM zp9ng*&&6s`{WPr<%P~El4&;97AhkX3HB4yIQ%c6uUIT)gyT|_ewMLEkm^NQHN?jU0 zSTVPm=jHeFdYi$=?{(=>YNqWicExoS*3CScye@82Xi1F~J4~C&w=XqL8Ew-Il^TDN zU71=!j4imIcdlla)g#$ult=p#aQlVa3|>-$>1+7KmtZrqe_uRMT8$Qoi{XuG<47aK z$q!s|Fi;OCLUcXrxmKXl+LtaYx;y2c2S}2o<<^iE{Ijz)V(54wilunS4A<^yk%QJI z^cjPByviPV!O~Iu ze9xw)pUUZ~)%-tB81c}MfbYM|eg44exwxf=Baz;eIX*oZbNm!|vgIcJLW}ZI{e8mo z3MPX7D!V)yXrb|0+}P)~H9e|z4wu@+0pq(n1(d=geL`n>bMazr=@sJ)vr_;2pT*&Q z*#Ar9`%k`Q`=7|Spl>??0Ei?1jeN&R!_nH3_EaP^dVha$uMp8Kdsw&BEA1a`MT( z!;dw|Sw3dlaT=GkWLHz#Z}$1KBr9#I*Cookp3cQ*XWf|7Ahd|=U*kfx5HXo?mL`|n zY{dNuirn*opS&9v8UD-OzCTqGLIA~kNfqw|p@eZvQgbJ$hhhj40X+v9JO2(z4J>xA zB<^x$oXova#d6xwk(0V)Hb)RdlhJqKoRRrwNQhCL^Dw)=q-YUie^3Z5X2*@_U@vA% zZgnL5RAw%m@_y?V%%XW$Zi0&YFQx|)CH4zNo~ z(k{?8BH2*ox0CEp39CP$KwDv=&-C7 zP+?BuS^1emhJ#5JI7I2*+g1d4hzOYjCwXHXYPY`OWv89b*1%?bT+sW>Av)N9h~6)# z3}%9Y9{2sfXydV4z7iqKyOh=7mem|DiE=Ifv6qFr-gp$$p;+~*nfLJee7Z%?-jgbv z^ZkJ|+V;uA=$t{Fcc)mYIEsoIaN`lWzW!KF{^4`Id8%49BqG_VW_s6jb1~p&j|?$^ zm>8H%pIG)@v+X82A%XBDfHSG-ob;uKkdSjPkFs@Lv)r=hGgNAjyG$C53@L`QM>76? zJj438tu#R{){^XFn%oyY{o&t9>tA2{Dk`pjJ(fV*fs+ndSGEwotQu+IACf}jKON#XaILV%`&X*oZ48A3oc(9q^$o2P+ zk0)FzDJk=)F7aYWh0+AUVoS3Oo-fVBe>B+p5j+1m39SoE=H^*lHG!r9#?s=hB0kJz zhZGO7!vf$ySwVIaQnha1I!D#*kOIL^WxAl4sl<&_bT|ab(&G1)IJRjv(e8ZEgsC-w zX%`zN-Gray(da;10Wm;SX+n*|I{6)Eoc8O$i)Cn9zV3=K9%V@pA+;aqC@Oo~8;pPL zb^0inE9?l$6wWD1Vj_6-^;KDWkIWfd!2FC>y<9|j=Lm0ePl3Fc|M@04c!r7LcWXRG`K^otzW^C^ z_E(kKi9v?^)B-K=+k{lwiFyf%}=#d@&&YpOycW2ETai4ran zrQhe3GQX~?oolZvW9t8u$o^9US;iCfqjS*~eAjf}scb#0!g#uq^N=bG=GG>j5!;q1 zBT*4o#Yb4QBzbuJ)su!0luOkd-z75q_2b_2AisQCz|aF(Vz@1P!(=clIossV1&1bq z5w)q$ZnxsH*X@U^`pA z(gY>}vA*g+Pb2fbP5rBCE!VPFZOug&`Ml%ff+1I-P4ifINr{ghJ6BFN_^z$Oy&VP# zulnC(Tj{y==<35t(*k9lNT6;MhEhJ6=DGE&{ z@$q<^HxpjeTK`IE>JkNCAJG3@wDWGb9Y5JnsF>Ly?Q=}umW-x&T(9?@h#(c=z%V0a zQgnUrP|$01rz@hvF}62iyKTJB$@uhAajGY4S5Ue6%(*HG4xpadC0$Yf6fV?kc*w0c zm>nvmVdVf5uG@BgGFfX~`z*#K9VbzybTXmAW7I$IQ#%k9EgP**2TX{ zAG*FEV{k87BU8sv-Wj$ks>UA2)K&6q@5EF~-sP&dbI~cCe?C2ZXdq^iFzgI{$6ryc zV>iK#d7#x7B#IO%(QWfdTS_zk`eKQx{$ksyhVn2Fou0+Fw3h1ckDtpj-7a#ERWZf8 z;~5#LsZ3!oP!Sv3(~|6~U9j}-B-PT)775UF>SlHK(&t-J5GC=h5v0}jR8r&9&FoyO%GS5bB=M4Jo@GMY2}(Rz4&QrUdDwxW8v zJ<fBh&J5f4BY9ELCe8hS7QQ2T|vt-rOS+I^vK4QdykCbx(nXeF5XJ#FxWuww{k z5!${VEU+3;;DkX+KtskZ$t)oTX8|WLg#+ob(#)y^XWi5ey>~=H!eZBj+dizltpK1G zT$Z%rNy1oI1l-okb1tO|I_CPC!<{O+QURj*5lh^K0N7lQNiUWjw8%#XgNO!fP0k8Y zWfQU67^NUE12#Tv##28frp@m@!2DF|ZD!#8cM{SiLg8jI{*JFu$yml6jy6IF458?q zx@B=W_Jzmeh3{wb7*b!^78k?d)jC%)ND(Iz0g(CrymbCuX>Tw)HNsbpHiUJSDd*qL zmRPsR4#!{S&bP2$4#AHRQ(Lafw~!qU!KRfx(u90d%;Mi~if6GFk1l!~x_vrWzR!Ut zUCMId=s^ewM{66=EK0~{H*cQ6GQ-+7b-NF#$0i`KWZHMsHO8{EHkg7XPWNb5vRgdkJ zg!_2H@A3uT#r9j?D4_;rmiMwPxguDV4D3MhYAbjLb|l>Hi`%Tk!%#e+!2g)22V~!}kpNQc}DZ;bF7PN-98UHUf@JY!6}^J96b{CK&;=9`~un>&BW3<%Ky~G;bxbtebAN_D+v+fYR z3brD&AM53Yva8?!(DJ3(Z=-iaC>ktpr=s4caK=8r-F^6AtqnQD+;R^LMzSE$N8pcd ze9;=r(v=YZH)gCqGDSnJb)MhqT`RnD`ySqfH!lrNmIj9j8iKSHJGS3oNhK#Q+`oVB zY9PGL)krG=g+wgWMIOW^(Q+x^%&s7jdG8de-_RO@>`}&+_L;7oxVGOZW^#NX>ND>A z918HKMYmkF;&0rMnY^eCj#%;N(14<${ z-BD!YctmS|j=77APimYV#B z@by?iPHGVn^_Qj*;R?;L)M9^~wV1H@56fzLURy;w+M7fCzY;1W8@y=MzONRgYb@W* zHx1DT3g9f&k(UZ}BlmpHKVj_3_N=|Qx!75B*0Go95-#2QZL3?z+S-;WFe~$~EGeIu z#4U(Nw~ZGgfuZ`aS}$Wq=ewucp3dGcTY=WS48H=zV~cqXqlGT+ zP=!3QY8S&`d+m|zL&MiTw7FjN{?c_TieaVY3W|FR%UzbPTa89Q<3%Y zTI12S?q8P}uo>HSiVbxsg^JXgmVkb|mk+GxF)pob^u$0%&_hW6Y8w2ALy$JzI(mtX z1=SJ3hrz=7nlo8AfA|asM;qLD>)$@U9BB4z_GxNgoz}{xMZ4MNEH^rW$3rtPMr~eg zc-v7hL$b%V&!9K)d)0ThE<5$x)3r4Ph*%O|#<+UPY-&YhxlyV!Psl(hE<;!^wNpkq zSP@a{7Qu9m;AJbkS?3wcAI$5t6T#j+UE4|2=|&~ydD?ngCyfaWSeLMG@tildJ(wx+ znQKf_LdN!5Yrp62H^&g@eVF!v$EHE!GT$HQ=?S>_k&jSCz4A0eqnM>b^@el?kM5S@ zHU+MNu`*JL+@2Ss&(k#{JW7o|yCfSHywJ1npr@VV5`Ao=KU3Ybg3;r8IYoXV6q1`V zaZ6kx`@f)9=$jt;Kj>9f`{p+Q;0^yTdeyOtAnSK1FFr|6UTJMbbQ6gCK`S06$x&^X zDzD!Wg)eN61@gn@{R$Ay8tqd9nw?2*UrX&t&wNXeIH6(_4 zuyP#(GE~@T1Zd#`BlAe^P^9 z_L#FQw@>yg3jq4{q?JaB^`vL7!P5aJ_8I2m34r=5h{VT^&*>=>2Ry8#3}Z_ z#Gi1vA)eIYjM&J&04RP^ZXiV(3mylMdZUy@2;cx}tbaSc@FiuDWs%I1BZ>#=>*+6j>} zmoQ^uuR6S-PA?QOwv%zA*G1T@Vf9IMF>)r^IcW~CCzvcHxWX-?pIE@U3>xiqH z0k9wAsrkTxtcsbW#mC;{u}>a#^=bVeSge6KJa_||601+=dCiidt8fkJe`v5#8I{l( zm9V7tO1EK!%5#VUJh1M!?$goB$}MqI>d?4gsCP(z3`GNQ^)~=;!6?It1_cj){RxKx zhq{8C#|}Wx;N6T#B-FXA#?HcHCIW)chYi!K+JBR=!&U01?92oX(kMh9))I*yuJnSp zC@E^?j6^^BILM>FgCOLE$-;jAsBbvH${Ffy>ueBc4GvYRFbE$WucB9< z=Nmj;Aybp5i~U8(?o1}N_+`aNEQ4cc*Nz1&iL&!DCwDait1L_h0tS&{CdpU4iIr&FiZb95#uW&W55pEuN*&fP1& z3S?!(Lai9l@j4G<48b4-wD?nUD4{T$wRZ#4lH`b6;fHH29IqGF_PPINzayFQ6nEz${vLC*j0JZ{c#3! z5WjVU7xHaJ<`Bow(jQaB9>Oce{?jRvShJVKF5mqp!&JVry}ows=I3F2rMTsKA`rWV z#a&M4L~t-7CFy%IrZ7K!gs3uQjvvRghS>q9FR?B1Auu}s1|+z(&DB`S*1T`kjPfxE z7|p{GXgSe0DKX@Iwo8#*WF9I>)6YI*w0&O+O7u**k1m?cV9n`?aG}YHjF{CNVQ&3gw18lFqEoP?4? z?EuG&|OyU#USNU_6pz))X2H^k5L=o)bjbhcDpZ~zZW^HEJ;Y*Xs= z;?(+QL=;Xr8tr%r;)&W3dUi!fHmzd>)eax*mZF+|w*`e|O^HVcdiO>wNO}B^1c8c1 z*3g9o1=2lMN8&aVFMYt#=8w2^0n1h575T|-CYvtXs4NE7Oy-;GEk-^9A^^ktvx@%o;&h^H&r>BaWX^ zfu9bb`x;Y>jy=ganpJ>dH=Uf`l_uGCjF{Y2JjY zT>lTGr-`DLlJWY8aBMLOj9SC9i>n(|8)uS|vNah&?XWm01N6ssxpkD-MG*c_3}<=Z zV>rZEdhU#yrm)|)gPqdTP!>RsQc_lD9XGF^ zLPNN#dqWNHNAx9F6*uImano?##%x;q{rpuHW^`e7HT^E|pzG(G>~{A90}!#CBBORo zv&zCi);GO)XQSBgd-ozZh}*dDnhGnHh9!;U48yfl`43i&jO+dpHaQM7B=@U1LuD*_ z6kKm;cBHjW>GL#HKT_3%%ieUN@15qrJAe7+#dn~e#dlaST$r+nPUkZoAT(`3o}~4k zCQ?RP-^Bp`;TG#>`Wl(ckspWUS`e`)K3>fjy5zdwqGCVy1)b?=~BBih4dKg1-D=s5HES_hV_ST!B*pfJ+tc|;mh_j7Z^=lWce?S zhh$9PRcWk^s-osdGG1(MnVAe$EIN-FiD)#Y*{dUEr}%t#o~ibV<5YmJfQTMjrM1*e zU8$cdX?Q~#`ad;NY_!s3@dK**;6eChXyS@vGxrFY6C(L|yE!Fw5b9{I;zBnJEgIpE zJY{nD&7?BIRPlV9+FQBaHFImtoj*E8 z3M(5YLUgcm6LVO!7|gPj@s0UJhjTiX5-bl`T-rg%R==36zkaCHf^jyz{G=cwy_{h* zyrtyTG^cHzec&xuO5SBs(maLmE(3^aG+L{xcNA&ve)~5%GYSWpfJ1M9JuNmGY&Hz5Q#X>*UjXHl!NCk7nDr7Ev%?HuCxaV z*mq&J;%^yuW$;~4D;y~SUDX=_^6+RyY?2*2F*7PZQqdiS45`ejRXU*6AFgIpU)9uf z^U%O3q*yC69?k|IC|@`J%2&pOye+}F=4Kqv94{7QCh^mJOW@sKR85<|*BxD-Nhufd_xUi00AJ6PhnL9Z*P8c;#&yLJ^P8*h7vKOj zt+eEToDCA5#%i2Y9uULyhjw=m0K zfd52@-`*$0a_uI@kpG%W+e!zl0B})!y3tM}CIehdevpd&(b{}&I$4rLI*oRX<_Cpe zq&4UotESbb?-weO0wPDQ?eyM|%e&@{OwpFa)C-4!c3Vcb@270in(J!5`37Q26dosc zXZ;vSeY!IvD>L$@Z;mpG<$O*ho=sb8uh{S3iZO&+2vUm&e@vW+>>HwH)6T>=*6yil z)H34)2dHU9xm^ub<&4W__T=XG+tze+Bn~pf{kgcAI+FQVG!)ZG5)LiI!giKBmAK#2 zdAB;6_zWuu#)~FY&`r{Ib#vJ++a_>M)4tyedKW<$?QLp!c1{(wAl57a%fRHNgcX_m z@Hg7*E!xpwDp_m9Q33uIDVrJmi@)udTe%f{kqEm5->rI8Tr3T2>7~=?#RRLjdpA0| zwQg@L;nxZG_)}7TzALKgs-m{C%6Y1fQ_4gV`$JOx;%TxU+1r3Kn3y+B#a@T&<7jww zi?KK$@AcX@5}jX1p)v@6pMlxnaX7kP@taPX)?s@zZ)wzWX=$wyX~c7L_Rz_093zdA z_<81=K}&~A4d|3?M2e_Fg6Wib?cx55QIRegOHtfV)E4J1DNEzi-DUJ%itd6ts|v-y zD@r_i{i^GK@a+g@!QWa53nk||>j<}(=#19^JFncTRYen30o^988UaMM%#Iz;oW_MK z#HU`Z@U@4N`Z=b<^owedQ7)%{xH&|6Vf|OuV}l0d0=ALbi;>t5l*FFXB$h_8mM8gEBa4fOrRh7OR)aQ)Iz7^vt`9Ma^WR%2hC#LV4j6#^ ziVx5HaE&8dJ;?zdHq=}s{+mukZ<=Vn?LsBV*AMvE*j%Y{A{?fy#lsqPweBDCXaHbR z)7Y|aUxF)_fMtvd;wZHAOWwcZZL8;^cr6VR6w(po-|b7HBGqvAh2!S5c?Z?nJSSmq z)x@2&Ey{qXPs#eYe0P#6o4d)RJgDT9qN4Zq7q9cC>B|Ng@cU`Xf>z+>=v=E^dp3dh zQMZsg787JUZ}K8!CjIqX>|LXk?eq#Uk~Obpq?mLe2!2ENOMR`2zP`SzId9ZvYceP> zvr_mH3_!~d8c3Qw=yD1V4frHRg@0T*YiH0hmI8!RK6bZ~Nxa z+2$S?SRwCv*eF61zD`e13q6jGi=f2T-)9?Hd3(R~66&FKPh3uQPkIEdG%7UE%vf?! ziD^-a>yKJ0dL7vb>3&js__zG4!fV$*_v?P0p7@L=qA)n`sOc(;(6mG6=kT_R(1GoH zmVrmrnD>H^q*XUqa&AubD=ZKu7K*t3@SG;$rM{_ES?vcDfg8aKR`r@+Z!Fpmp?DLX z$#FQg2CtHcY2?;u3XU#JG&t;#txWSZ#|csHf4-fWRwP6*58qI)KY{@1KBL#d{!Z=%)9s zrX&!~6zI8t=`@V=3NdD=Bs>$n5f8%cNo+ywiDfPmo66>U;xc6p7cza={eIh8UpywL zqA+fMSMoS_+*V(32rGCte-*8@tF=2*q+D>;_ILu@k0%^dTtPrtqC!zo+y(=rZ${o8 zj>e;>Z|1(+$K=%u$rb8&^3C+p(bZ{ry<`%m0id#UIj}lD9`U(#z*ZqFdeT)vip*~S2L?n;Eeb$_#vbDR=$=7jQM3*)_9I;KZ{V*Fxr2S47sR_m z!T|JZZ^Hdcvic2>IYr_^jmrNYqgfa^9GL91iyh%}%&vd)wpcE&pNmMtvgHP2jBt2C zJ^gi!G(2i(%){S;I_ua!MprS5ip6ebgQe_Jn-P?-?)~|cE~Id=2GRp`aM*mr#HNff z(2k^FK!1^8P=5oZL`gLL%r}lV35ttxsDoMy$7zH?_1-!t1>-*k*_tvPrJ3V8m&MwhtXCi_zEQ?}< z6%3YR`9?y>097JRB7_-cOEjTo01ziJEI8uNh<4;5mRRF4*-G6>>)9}%x@-MxdUA7e z^Tl5~329nH*bLBS{UZwEH=c{Qk7MMw3GssMADR|8=I)kiGwT_xGZ$9;K6mmd<7|2w z1SK2@`0?wbCSuAT@MVk$3UZ`4XZ0tPh! zrv}*1*DjPl!ynBTa-9$wCDkO}rTZIkp;L@spj%w}j2SV&V2SH7mZD(m=V&XYnwkfznBGc>w6Uf_E2>CgkN1``uC6e*59}#6|9=H3aIbej_Hm z2O0iQza|(F2N+{VlvuVtD?EdKv0`ZmV1e(<7CJx^U%tFFuI3f(ph6YQRpBZ1L zK+2141lqT#Z4SOhIumujwjx;?4&Fk&u>Ea%kuZ2DkRk;F41)ZhooE4s#a`xdhlO@u zZ#*R6Z96cV(a$vV!9h$6DN`8UvQj-wZR)Mi7xa!=ykA#S$Nd4afTZ{h4GDx@MK=6l z_gfTpY|Tq5m0Sl{Yt*zvL*GUBmoEm__~k_o{vrnAc2yB=0tMhp>l-`JZMDIWWbf!SM+FAsVvGNPN0Y+FA$!@FJix8hd)eL}tGg9vdV->;NOajqFVoGdYnKMG1!|kz_9Sj)i=orz+!_qz0AZdy})Wi zQYl|6@ z9AxSntOVPzcET-ByBcoj5lpOIsVW>Bb4ylvV+>&1UY5nvwZcFhI3X#niQ({_HOf^l zIxZFNU-01EziGeQ7SbK?DOD8ErY>szf82l3zkeG&k!x}MK%(H-d z-q9v{_w{qH(_gJCf@t+G{X>C>VS8DO?w=Gt&4e`YUr~O0`gSkozgSJfCS$gc{@87r z3A-XNyH{Ge@x!au3YUE{X9DV8_}tw)`!;k}KVv)3W-bB*5l~dL zrqdTQo*x|xEUDk{a&W&>)WqnHOY8{uG3^i%?l-We*RXr zZizcZtN7LKA=6$gNCLU~1J7Dh+x=XSb?~Pd0oIXh>X-UHVTSMoR)KH##$49uVdSP` z4+d&*K>aL0Wd?0{S!&!F?8~gtw6^18^O{vp&a*ylgq2a4?ePnym~Q(ra$;v%2p2VC zRL#`h!e$p?d=H?Oy_9oX2ct?uQ{P47^s zgG@RorhRT8$BVG5U)3JNXp&n~RxJ-$`ic-Lziw*Be@1zeP z=p^K$wtKb9Q3;PF;JbTwZ2M9@Qb|>Ts;f(MJ5b?gB-$sd5B~<> z!uL?HzDouA#On#P6}mevJSzQc*%^GuQy<5?aX0IKFxU}zd)}GHDF%k*8}7_awtI7E zxyHkHiuxW(b^)x`5Ew|%ry1Jojm_C;FPB~>)Z;_qlxw^G2~x1(X6r+RPbEupm&dTB+wJH_XG*kil9qHlzeBh1K9bHxqQZ2Lvz;b=9= zr;W)u))d0m9Wo=NN$%y*#k{tQp$(%99SzTxFHUuQx9vp=4quhXgp=?eeT3!6U+D>9u$Jq52-3v>l_?VBzZadEm>6ca01k)RT)mhexK+GiMx4L9MiIX!+oAG2;IvyGmS@fe4`7TF(@i}DBcoMR+P8c2Za2yEpU;LWDc3p6w1{EkdnX9*A1BIKTC!n z{j~|Jhq;ebc!z;?9OsK8V=9N9vOgv>Il7HV?GWiS0 z8d2!Rps?n}A-M-vv}XoEqzDfp+ZkQ+Vt(Xi`{Q%3kNOlDQl32E053$p*?9M@SHlO+ z#R@<=V*0I2ij*e{zzKA_t#aS7H|yl(pfa&i(3PcKOLmxNUbtTSt_hXG!p~X2is9wW zqzOs?0z#yImX32$Cw&R_@VOP-GC%FyB`{`OUf(d9?cA4a2Cu@2I2>E_iKoCpIxc^k zmCd)o4LEG~(!9B5S+heGB`-wuKDFPDS0(SO%%J^>-SLvw za{Bt;*ZsZ-kcQXG;BSc~ii-`(%JWIZv-X;B`VXd>YCGWU3)SnvrHfF1115WC!E-(i+89gXpk5B?X&c@l968|xBcXhbG_b(=0LB_%!XJ}{t zoeLm%Y!bkK9Z-BMzB#I93?I~uSzmy6RMB$WPksyieFs(X$5&-i^0;N+^Ha(`HU&z7G35HA~h^`h-UKU8yTb6sZ z&^N<-AjpAsd}ROq8YRI2L)0UrL`lq%3z<)Mn)c};VyL`2@*VND-tq;@2~e&OF-uDT z0~7QwlV2`j^xQ9?>D~Et??h$NG=|hDDwcSC*L%IE8LF@t9iRL|@b;db#g(GUQmbe_ zA<-7y{ewY?py;PzV@)=Jz`(FA>ZMXj`rZoou!i-h$wyIz6nd$8=YI9h&Ca>$I#^pP$hia91~$vhou62FKo0|5qdPJO6ESCqFU z-)GbQaU5P#fucFXOU0|-gav=W z(`?wLjc`~xl}-_3c{u;&O7Vxr_K1OgiuMBecl>Xd# zZ>U$zOo2R}At-jKf-2^N`L-7Mv{Alq6U&hv*&#)3LV;1qmZAA?tHj zk};F=6KCur1H{$Vx$&<^cn2HnI5m4Ydr3HR{(;uTV!L=eKUh)o-w2X;EtJ&nTQ;wNrksu+=X#L!<9<4CnA}| zhEJVKn@m!;MX~h#oury0p-S-3H`YV2t--a0;~?)lQZ_gO2njK9H7lFto2Sr$jY>8c z>D=JM;2m%Ti<0BKBUvd`)r))t1&iSU95ZdY0=gP*>z$SC2MIH|!R=IbosVayto1&V zV&SM9WHnLy;jULQB?A5C1+Ipi;b2HqHIvX?1%rt?bw3ijpA8Zow_hc3RFfosgbydk z7em`56&8T*y8e{s!xMFYbP>+*k^zt~DJ3{iQbw(t73%-#Y}v+1PBmJDAH>{ zil7is5Tt~NRH-k$gixdif}&I@0R*Dbo1k<9F9I4sL3%(!7eSCFLO^;|N+_Y-_$fd=Kma>O`S~yJqK_(NZC7N}uD-NpQsk6`Q8r>?MUzm9MNs z{S7)EtmhuMvih(m_Lsjv?G5(3KihxYZ)hyjdlKlxGv@8qJoO_5c6TU^Tqgd z-+{dY&4ytpd>COX-zk>*+|3V6s5|J+W6T!xVR*sW8}axi?@Qi40J@(cm?P)Ne8wtZ zdr5+OOb*}MNhm|q zZhyTf*iGtKA#{-;T8ilte@Y-II7_z`$j954ADfym=o1WpA=_2Ce|&@Rs+0m~LMIv~ ztmb`Or%zxbZaSec?1k~uhJw?NX!Yc@p9-y`ewf>H(N2(Bv}%RPU_ew8pDTlW-oqx40>3Js?{FB_NAz2EDzpbtc)aBq zR{pJMtmyW!?+clQV)!(R0#BbW@%mX|&%!k8B(vjfQ|4-65&m859i(!n?(KLx#&7n3 z8xqW3!{K-B|0p=J*Ne&SsAe-symsET=%~dSiY6#dTP7Z?rE&w542ge12uJk>!3;7* zKY6#9R^-(oj`(yn;PY6|6{K(H9)Ike)6!sV!L^=)o-MVzk{Amu%uiomd4AzE{boHC#~Lnm3g>8{K}LupKeIWDJ;0 zf0p2mylKGYk)zKM>a)AKUS7cybkl{&b)UfZdpyRwb(G;Q@{^{dD*~ryTW`1^WnU8% z!lFKIbJZD|ifjoeN<8z6=`b(nEIQ_BIRI%^Mk(Dse0JUF2Cp20|SB46@C#wH#mo=6zM(Yb2QP# zb2!kyTFx7ed=IBV#~2vDs-C{)-wfQ%fd=1Z)&Xwi!wJP zQv~3~h#J>X($6&Q5iIaBwqA_kE0Z`gEm7e(rA8_#Ax4}Y-5|!$l!q~7G-4Yj?tYF~ zuEKiZ^U?@YBrlSJSuwHp?_rth1SK30-!Wx^9#s3&aGIyM-rlztP!r0^6aT z`f1Gos2P3TAT3Sm+-M|)Ro{OZC;{|hzl{&6nNb-}^2d`C#b2KaQ0>6`##H1w_VGUT zldCGrvlR?NXCEDn2Fb}c2~EeWYU)K$;xj<#6`&6cIZR|J4yc(?wOyv4qb&;7io>nE zi9AW+oD{xo(7OkbX2WO&;x;o7Z8c%1P2AKP( zqT02|Zy@@qCI1HUVD)5!2hz!7Z+RSK*h)P98c|2jz&#nVBx4wg)*AMy6{Y@dLe_+{ z2yAJ)>j~NEbo%zvh%SEk}KzuGVI zz&rAr75yXvkTa$_#UNrm2(rqKaM(1{PqqF^tv?J-^H{5A8#)o3Js*#{sdl*VyTT^0 zTMgGYXFdg8a-Gm;c*bB)wetUdbHHrD5b)hz(n&vn@Ar2s!YNw4%SVKRfca) zKiR;U06^t<3sPu$E}(NCs>+(s>AS9+{I#(!1?y&CT4e_hrKcBS4vi9k;(eUH*WyrRG z^;s_JI^tD|*dUhD^qN3vdVy#YBmI6N6CEml>TS|}X;TQTw}sxSJCB<`c;#Le-udX{ zY*4UV!;7f3vz)+=~n;o=hBV@5C(JCHc+}rIR}k= zWxBgbnQeko5cgtN2QT#%?|<3Z**(}1NVh-!b9QO?DYkf{)>!%d>EWBN4NA;$0&hS< zRJN(Th+DYwJnRt_VP}x;hpMYihgjT`5UqyMv7~xS-NR4kJ4)|JY;l&V#^BC|ihhNjJ7Pu12*q>~9S5jMhgl%Q# zyz#r5Wp~+T^_{L~%M;YijODAO*!GpT4x10Y2Pdq45MYenpWLr42>Y%&4ZRD24-@@{ zw6$fNZqytGTh<}7od0rhM_s+D(rI}X9;bfpT|f-D_B-OwP-F;h$L6{ZWCtwXTjBQV z_o!S;;ME$ym-Tds$;`ie-6UPDhleGD@~en-%4_Q>4|_n{?oWT+*bI%m&)+&ttU7cs zLeUK99$^0Qx)bVL)4Jte+=A?tVs`_;|7X=R|B~q)vix4`m+(gs|BnM=tMm|Y12Ibt z%^(>1b4n6YwSKTjK{3>fR)7)aO3C|h1%?4bF{cvT(k+LcWNMu95s{!m8Wq}@TED!> zFz=3vU`1TiBwO1M#fjQpXyj7*^v;Pj$p=pe6smI-<-ap(fG4rI0oXI}3Whl)_j!ps zmJ*2<0zBS@Zw|p*J&mN7@oV z=wz}ol9O)zpbxd{Ha|?ty%mSPe+teS?t`2x=Lc`inW$|rYRun>w>!Grl<`i((lC;G zJHjTYWkhuvfXJE$Jbh~37a6=OthB}-8`h4Z>oE=d+}T|oe>Mw}ZfuAAp?*acG<#u; zkUe?wa{VPrUCw}3gfiX1pq*jPJ~V!|J07u~Lt;llp|4&r@|fzC<9{7$aKr)B7i=~3 zM(IQgB^>>}pRYxpjG9F5j~Fzt$1vRJ3$zJ)FxMj-Nej|rugdw3SfhV%bN%IlW%Ix% zr7_eIfX5x;c4gfLYL>1;)I3htyt)1J*+AD)8ztzB@k^g-Hg^B3_BHtI3U?ABN$!=Xq(`aAcA&ij{gcXcYZa8@I8E*FgD(*6ZeUSC44H%P}1vS+sYVWvzN_`oIzL>b8+JZiJCtN>=n{>>w)$2 z(_dH%+cUoOv(j56lNK=)#h?;LhD0P4t;s}oBs+}jYuDr9B=~1605Jh(%wzTq`}pRb zNamvD>Mj|C>y-(KCj>uUeQP%%FiK(695AIfxL?*|NGn}pF&19_&$A5wjavLF)-(Dn zzcG*Pw@{v|+&fsIEhGg7RNEh3`=LDO)B0hq1TUj|nI39B$I-dQVd(FT#){dU&(cF_ z+VIC}-5*9}vzeFKHh9@G%{?MQBtXAbdeRi2-wsaaA;R1)35#;f7LIpcalNS@5$X}V z1^_}%SH(Qeem&lO9J82x_k2EBzW{LUj{u(V>8PJ@(pimvAI-4ojaMxvL$p4K54B1? zV`D*Mv5#6QLu(rQfZBUTeQd3QGz#LyRa7=s<;K;ZPrAW|tk6{JJtfl23Tg%^7chlg zgV&X_ALxzOf}Tn-UAvSL#2+e36j>zvMiAN3 zHQifeZkm%X?!W^z_dNli1TsE+7d$r$G%weC18CdWv1(2%a9k##D#GuDY}yM0I;ty4 z=#3jbv8qF2jkGX>``nU-TW2l4xrfhIzB&)Sb8;<<^2-ldF-i7oZK5Bj#>l=Qp0pYvvSQkJ(KI_8Kza*@yOpJb}sdH$$5V5i1Aumv;%lyJ8oo{CruOQL$ zCa4k7mcKd2)0w*dx@w!oUaE@or~5;-0-?5zd$IOK8``;t2dyt*)w8w6*KOk9a*2-! zqSLg1DN3C>k9DEa#X*0w<^b)CUbk$QV}I7dj9+2Duj_UR$GtP%$2Htl*&z}bsTr)= zqNCJ5a+u)BK>9vw)gc%sOfK$&Anm<(a;Qe0xVctN1W#PN^##TD1Q{NU=Xu$ZTO$cx z{S?xdTqg8uXKnE&^MzQc=dYD-99&v5eC6moQtNQUJbP8;Ec{C@a~lS%b!*~+rHM0F zfR$p`1!2`@rvsV{^TpU2D?7#?q`eqlz|^DmFgwjJ4FGTt6clYW`vwBk;z{^uc`Zh& zB*UskCMFSKIXqPp_UZ-=SY83M`3KG1)$UuV{XN|z1Kc{kKc2fcH2^dQ^dbP^Ya@Y) zG_;}F4<%H>a{>Db^pG|Tx$K;Tk7zQ{U@S!}%O7_$o=YV+JfqMkuagou+EBQRbQGOD zI?c`L;K|T(+eImnG;@Otj*Ey4|CQ4ujk(0$7MWK-N zscU>0w}gf90->aNU{yzUec;S4WEX;pPT%_wy(dejvyJVv`b-v4}j!b+$ zKh-Ojq%X!Az#mgCdZ4)?<<;wmj1PZ~`6My?^0DyrBq+#tn>tHKezGxV`Xcl~%xg%X z2uyn9Ny!IwZCvez4*69`8jN~L4}g_Q?{#Pj+$4`X;jJpn`*50OCsHLlM`10f^EpVQ zjVza=YR@dPkj8G^{Ow-L@9^I%-`)&ro}Vl&m3pNrJUf7i1dQ+@q)SYVJXsOiM`8I` zRK(F@VqzjvG>)s`m`)NyqfO*t>G;D>I_w%JoRK*sjqkkI6rjs0(eT~iM8jN4?5^DL z5lg@-DJwfsmlm8XNM;&<2Ob`PRMpJ|k8SC;5-q|1E}QvZX>0y(jh4>oX1?k6t