From 397c835129d74180ff649e68059986e569f9c39e Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sat, 9 Mar 2024 21:08:45 +0100 Subject: [PATCH] Add build instructions --- Build.md | 37 +++++++++++++++++++++++++++++++++++++ readme/cmd.jpg | Bin 0 -> 18041 bytes 2 files changed, 37 insertions(+) create mode 100644 Build.md create mode 100644 readme/cmd.jpg diff --git a/Build.md b/Build.md new file mode 100644 index 0000000..4d2b2ba --- /dev/null +++ b/Build.md @@ -0,0 +1,37 @@ +# Building + +## Running a developer build + +On every change made in this repository, [Github Actions](https://github.com/suchmememanyskill/CYD-Klipper/actions) automatically builds the firmware images for various screens. You can run one of these images as follows: + +#### Getting a firmware image +0. Make sure you are logged into github +1. Go to a [Github Actions](https://github.com/suchmememanyskill/CYD-Klipper/actions) build summary, then download the `firmware` Artifact. +2. Open the firmware.zip archive you just downloaded, open the corresponding folder for your screen, then extract `merged_firmware.bin` + +This merged_firmware.bin file is a ready to flash image. Note that flashing this image does wipe your current configuration. + +#### Flashing merged_firmware.bin +1. Download and extract [esptool](https://github.com/espressif/esptool/releases) to a new folder + - For windows, download `esptool-v4.7.0-win64.zip` +2. Open a terminal window and navigate to this new folder containing esptool + - In windows, you can type cmd and press enter in the address bar in explorer to jump to the folder in cmd ![cmd](readme/cmd.jpg) +3. Move `merged-firmware.bin` into this new folder +4. Connect the display to your computer +5. Execute the command `esptool write_flash 0x0 merged-firmware.bin` + - Don't forget to hold down the boot button on the display + +## Building via PlatformIO + +0. Install [Visual Studio Code](https://code.visualstudio.com/) and install the PlatformIO IDE plugin. +1. Download the source code of CYD-Klipper + - This can be done via the `git clone https://github.com/suchmememanyskill/CYD-Klipper` command or via the green `<> Code` button on Github +2. Open the CYD-Klipper folder inside the CYD-Klipper folder in Visual Studio Code +3. Click on the Alien/Bug tab (PlatformIO) on the left +4. Expand the folder/tab for your specific screen + - Entries with the suffix '-SD' are using the smartdisplay driver. Entries without this suffix are using a custom driver + - Usually, a custom driver is preferred over the smartdisplay driver +5. Connect the display to your computer +6. Click 'Upload and Monitor' + - This will start compiling the code, and after upload it to the display + - Don't forget to hold the boot button while flashing. The screen will flash when the firmware is attempted to be flashed \ No newline at end of file diff --git a/readme/cmd.jpg b/readme/cmd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..469deeda046a13011d7599fd12b3a7f58787f731 GIT binary patch literal 18041 zcmeHv2T&B-)9;W($r&XhAUTL+lob^gL?j1^q6jQV1_=U-AfQA6$q15j&N&AOl0k`* z1q4}8Skmqr^j_uO@2~fJuj;G!>eXF2RXuZ3cc0(s?$a|P`W^ZMKyp)7UKYT>zyR)o z{{Zv^a2>$H#6123f7sw3&S@MRY-}7nT-;Nq3GfIA@bU2R35m!^2#H9E@bO8gNJz;k zC@Cokh^fy~QJf{Cprkk+1Op4~gN<_r2j>h0AwD6+|Mm~v2#}rzLa|R{VVnmrNincU zG0?35BLHCFfZQH4{KpRi6Xfv}?&&jl_+W!F5&#ne3kwq)>zHe>wL4f3V3XpIF<+EE zMXq9md)}5p@JVRWX_jk6O_Ztwo2-}a*?FD8qoO{0j)v_5I|nD1kg$lTn7G9C8#1y` zIr*Dv>Kd9_+IMvB8$U2HHG`SkJ2*aaa&~d`e(K}v_w2cUSoq6`$f)R;*yNPdwDgS3 ztnA{F(z5c3%Bt$-me#iRj?On-gG0k3qhs&hkI&A{FDx!Ce_UBbY;Aw}y0eSi+dq~I z1Hk$&)(^@4CKo9v7bZ3~7B=p&To{;6V8J5A#$mpAicDGs*T|Oqyx^156xTwNiki-_ zTvFYnyk|FnN5v{M%Z4}>?VDu(J;A*Gk0kpc*iX5}0Rk)xaPhE60SIu|9xM{kd_MAi zKi;4rvA*C!^w|4oG$5^tv=SInVrCTd#GOyvEKo(NZD!~o+va@xOGV54S9r%)<*iwb zgIH9v<+*ZQtAlY}x7Nl|d{VfO&+VGI*6YHgVz(n?ZpYS`zC;7f;*Lj1_~#T91^fp| z`9-Uh_&xg^wWp<}l~fbsbC#Gc%FX>=I|QAvwGyv3Rv!~-2dlAZPp$Na1`?#=J$GyA z;V%zf&WQ~3EO?63U!6`7?)L5}6hmgsTFA=pz|&_n&-(L?oFD7_&@f9^jXH$v4xj-% z$O-!6#{#toI@Bms91Waa9NV2m1N9+Dm6I1*(3_m^uH**WqeyECKDVF&cgD?>6LfxL zB7vY@FP%X9U^ff4+q2&?!6=j;9BJz0us<%e6l5fc$2*rAW@&$Lri6s@ zH8c<(eStSuYo-qsvyFtl{i&amsu~y$!7l2c3!&w)!&HfpBlPz6o{4=#T^8B{>Q?lp zZvP}H2M2C9tsC1LZU#-kJs1x@q5&U9kS3n@L+wLm^?8Lei7i;-(7;o>wS!GGFatg0 zIC;UHk{n%^daQ%)6FT@o=Lh>gB8IWVpX~Bq`ahPZTRvooGMxD~CG;n$Pp=)@ygEHP zy`&3EuBeD=IARcv$Oa}DZhVF}El&&G2Cxq8Nw#S}=|bSkX0R{Cs+a_8CUCn2klG?O8T zV;s7Q0ebAT-rEb4cI&jNcQId3zv33IH@m%iVQZ` zk%JlRD9tQGp+*jNdg0~I@%jaLmjrA=0yY8uR~te%8#prEk6JvkF|tvLLn$3nq-p&fe* zOPnIBGrnxMj%>IWh>@HT{gp`iB%)O3VB#aT>Vgp3owvxhQ*Mq9@b%FNG!Qh#jKH7I z2u5+kc1ESR5tQu(rk4D#DER4Yv+GY!Jyi+!f?g4HxA-84I@e=UIj*sKn=aG|CW?HV z#SroE!I{CAs!s0fC{zAfOQ~*6gh=T9ECWKx+f}u`v~lh2OwZ$S!xJ~M*f$HZA!ds9 znn+0mx!&ez)F!lf-}=d+Fx+}aw|j;F>cl&htJZ!m)?!)HR5y_0VfpEo>6c>nh^o71 z0zAZrYq>68a+-&bOgUR>D4T7Ym()dTFlFzt?c601xY&;4k?PE=pJ?|{iU6sR=FxA6 zd&vA6siZXWrGQ}u60~8cH^dZ^_sNPk{eUlyVNvWkUT05TXGpmJmf~Y*z?|u)nF3@; zhr#L1nHECb+hY!Eyu__k63l}v_2eaa!>TO=#yz33^)Rz}Q(8G-i@5g@8X$2~v&e-> zluEIUGLJX}IFt@qr!+*E7W-hFq2Qx+FvAkSOU0<%A5IWJhR)4AQ`LPlS3t35aN)7d z4c=UHa{cJ-z;(fk?KTpw8l;^EiR!4%85|Ef=b9VHlvHGaPJgX*T8r)M*NU-EuM?O; z*oIR+Ar$Sg?V6SaJMb&73hceXtO@a>F)5onBQ(XWGGsVwl|OUtZm9(^;dR246={bm zbyhG+pQkKG@|*qD*qA>cbQG{y=cq5cIUTT*3aOjrq63F zW+4Q~dmYLnrHn)?Iym{y9aAS(i{liflT4-DUU+6j5~RQggS?ln1Yr(VZAb|mg`%jP z6g@K_{F{U3nxb^C{`kHz9i5EtaCj`aNgik z+~RP4&m!aARvqFxZ;ZV7!SXS5lOZn8d08v5`Hc0PY5%ANa{ZI{^_oRscGA=Wk25S*>L5qCboG_vZPBD>(-wM`rhf;s?`%p)%xtSk6 zN6+2?RYfocem>+0U5P3$zK}>^NgXa!jQ{8kt#RCYY2~hB0nWu2EpIi6Y`s~NF&8;j+&f^pM!i_NiXo8?jY zYt_6XX&V_XS?1-gJ)Qdn69m|~U6s70&66b}p9Q{rZvALTe)wSa(NJ*E+?2hXgo9m+ z@k2+>*9Say_WIa)g`OlA@2g3_A^3iWoBOy8;smYpdAy+DuX$m zNeMFAJeu;->$a(SqTNgG;;+CJNYTaF>tOez52@OMa3Pk6=H9L(za<$F^{UPCY9c2mxc7wP=({adz-KH;%BW zd$4(O$&NF3>F1SuauVdQ1LGfc?)&d!$qaZ<6MNQQynzS_i0wp1-4N`VCNCr7@fy>7 zmz_AS{eY=cfePnlCPoEW!<7-FWA}kO(P!D<#i&~~RlXaK-3SYWxVdgD2QF&5_#F}) zD2sFZRuRQm=je5$=uge8_|H^U)|cttiN9+%z!Sz5zwEjGbzPk!Ip)~kWBj_Pg07$Q zINUf6BLJ{m1zkJSvClu@&ZWUY)C2!$aNOuP*6?Zug96O&0mShLluUmF1qw9B-H&U3 zL=&uFAME2h$J|^!UaVgP5}07uCnsh;4k)Cd`WY)L8SP!U`q7Kg2+hpoYJv&NDIYN0 z@bc%B0k{SSWR$^nw?JlqB7h)#+>=)RwpjWI8AWnf`YJj`DzSF`@y33QkyL23xWK8knVqY;U817ieG~43fd< zTFG#a7!4HYR?T@1w~Q-Q`GCf+;phr{0fMSy+zdbiLu07xATUP1QnanJPc}(Wqk)XX zLq9Yy1_tr)eOENl2|se3GQSEV2D^jzPj~#M?z1UEdRI~pq763#6ZiJMcY@4hsF6u6~P_QWXC#CkL{8L+HJ(mBmhLVn-A~*=56`24FJHeS>T8`06=P|lJ?@E4#J(5N z0RJCr@M`6@+*`2~8E+6N-XKzbwb0tfNP%zuTzv4@`LnT=YCprE`|(l|A0GY*lz>Dq zzwjN3Iy#{T;3~prkD*%dU!Xdj{NgCJCK_@A+{eTJ33_W4kUfQO?EQJ`Z~NfRu@bS7 z_ZheT1X|(=R!7&_6#oe&5g-S@6HrA49AWo&IE>;VwvhTyX#Zn7zue$hlwLQTYzCob zh)QVqW(Go#GH76B?K}F{T>ZsW_&_#5Mf}*2N+-eSJY=?b?Vs>Wmuc{~ZM6agZOD&V z>|WYJx!8uI?D0>40&-$$@>V&%&GLI((PfG+PBxtsCj7*{oJm*ddb<4E-LKO1eEGN5 zV^O;A9|rJF_?`XWNQuC`T=N^$szAAjTz+d@g4OA^zF7|e`0^h%3RGs_pCGp!Tnbj_ zgPnzM2JBD%!2M4PJu8$t(B&N~3+`XW|7-&tRKR-up6jzeEZScd+|FNId2ivb=1a!v zJKvx?%N(vr`4}7WtYE%qFqf}P^1akzSv)UKP;jLNc5KlcBc6o^X^pPF6LeTeH(kG* zD9L~Yj;d7-q+Q#+1>$z#u0~1p?vKOY+@A*7Aee<*C z*|(zVCM(tDyP8qr2Iph5GpqPa;wp4m8euT*u|w$tiRl%?67Y0W&#AqNFt;&R;E9cV z$#k(hy_Nq$nXmptNE~e~4?a+HZeEq>g9TPvX~pGW{~f~nJGzK?4*`ThP?By_?zma? zBFYD6ayN2Ra8-4@hCAS~iwQCJI)=YYZBV1VURy^KBdsp1di3=;Mc5s)oqfltPyKxq z*`bC$A`ffy_7Y6Kw)ehc$Hk^8vgcbSlz}-%wN(3gAIfB#>6BuQX$87~HcCY>Yd< zb`qC}?L$GB&_I5`;VR8f`r|qMEKVhzo5|2r>+@ANOiqhlRC$%cWV}xhx;K>Mv&1SJ z_zB}4g((HwoZd)ehT3S##cgyxHF|kKsvFyu?R;-g;jv@XqvRYeMW&{M zix?4*X?9;UVDm`m^in1mZrxIY^(ulf)QE4_TY7AR$=t2p%f-@oZReAdWUk#Q&amkT zXzaM&duLR*_gc43ofrO_S+8@`Vzct6Wi;*q6GLYyb5+aU$EOad_zRfjjDLa=Rb@hH zp5CYo)qq~bqQgs(&k^wttV&Ls1miCmGTn)8C&BC3N*(~08tIkH-qS&Nwa_pVGbe%Ov z*HpvA(ki;gb>6i{A|nOtH11&BJxdqbgf*BY(|wOknEtJ-f5QGqu5~_djJJ@W&;!3~ z(kzfPY5A2DPN9)+*(TmQih^4TYIc#~Wrf%=ks_QO2DbhyLeYw~5;tsguQkt&E7W8e z3`#y1DDI3_UVS%vNN+SNQH2RmWT&OMLjC(he_^ zv4$?PPr72rf0SY}&|E`#D630FZMubmIvk2!@5a^26Wu<$rmShLNT^m_2?m?Kl=nU> zRTpldhAf3EqHDt62IkMM3W`&frJ1YVaW+}iW-h(dF*gr_C*35B5B;LEcxdvht|{GOxZ5TMm#qW3ze1M zK4pyK{?Pdq<&c|FQNAQ9>g0$pgXr4Vp%Iv zv7WIPIVQ^Xx?EJ0?6i@~E#<4{ZWY(}Wm)T${nPpT~zFQ=7BV;!jht3j`g*3H^a`7dRbh$ZS3MmIeln@gg)Mc z%!#DTO0LUxXhaU-Smp91MGJ;O-xhVE)D{@0s)$aV0R-43uOs#6_{m_A)d`6(x_#q% z>sRi}Oul{H=isFm#rzgq2$7SgCn^zge0lca;3-SbNQQFE?INlJ^vC{6>wQS5N5{^i zjziX&al;2Q5$#e<2kXeUm$v4`mnkqhhswwL&mtYsfI1wE1i9u=oZ!LZDBSeuI0A%> zgQ5O3yqWi?X4!Jw0}br>ZR{*F+AqD8GR^Y%Pe5zywUc&cT zXw9)gFmCPHd6-P0q;K=b5MS{<&$D|u`I~)>ANi!{JLVK`tkMK+Bqgs_*QH0Ly}{;% zS(+nSqbi6mxgmtw9kx>R7jE3FFvnbBkd$%F_UN7=TX?LUvUw;tr6(6kEA~}aq^crx z)@5Gd*^P{6uSwG z{5><4EI(dle)&Q?v_;h_&yWylsDg0(Qm&(};OO?EcEz0T3_E@|kGaReJS)?Jj~F&W ze$EhoRf@FUzgy$ErF8 zCsVTj3X1;l5<;mhkrZy^eEoX$*jH<|4Z^%+uWlNQsyD2FI9B)@CL%csj2^YM+yM_# zWOu6p1%mjw!)L-(YFBE%7&VPLx!c{E>}MZthmI5y4RqhNR~+@Aa;|8ZJ~iO>Aj^!p z+=F`5*!iKb{QcHT)yqr_Gmb^^rWW_bgnV=DN>yaedwoAbzs3yBQWOct0Il?&nf&7u zwkOpq#f)!V zOMN>0c%6$E$1s2fXgN?@#NCO zC-=RSCLXI)d+YmrI#fxKahl^*Gb}d5cdobO?mBo_Zy{}8OuiEVUDS55?6$*bQ$xZJ zV5dT(rOa-e&=4Xf3ge9yQ0ih zYKihBM|YP?lhgV)hZKeUcv*^gdX%zQV=oNnZ#-PjyHFjgt7|!ZgP56%y#DG%&wKy#KM`ZBiDmuH`UK2OhmVBnY@JuOP23U6m9aIVtEKIC-Xoscs^K zAM5PY=lJ=A=sd=Cqs#!$3+2(YD;FTv6R5nRuH|&wPP)yDda;8`SI4{RG-zi$#^E6Jf`snN5 zr=!pmKP5F^r;u$<^`a*XyKsarj+bYJZndU{F(!(2ckk-{7(~V_b+q*+o^F_)-j$Ko zlABKQEYv1nSr>*KR8$Sd!F|Djuw|WwSdkgJC^Ct{ z4SX^})ntFgsmaWa2#)+GG8C%k8mzP5>#aN*t z#3IFJgR~dRlesvhkSeh$GL)ylsg!YLQfHt?;nS@J z#NkSXro^k~ksN8SSe$EDsDyd)#U@)Zwjx&_Yfjo5bY!~Ms3hLjPOhw~M+4A0Us=J< z6wmC1&?;&=+g@7-0g2JoFCeGT0FCbp99M=igv6LS zf~;r%@sybsjZ{Rs!MnHDO3KonQnhQpGrjNk{5|bJp)}6Ry+uluxTi0ZO;zK~+uC*M z``Y-QQPm5MIkKd@7l}*Jo9WFwyVR86l4^3FHPs2jKik`fUQprEJtVtkf2qEW9?}n5 zJNgAdo>@^i?9n742kqukSnR~&T)=#4OyDJ!i^r8c`U+MZJ{8lSL~up;X6yi5H}M8C zU?+Rf?SVzMSuE(%gs&(x?^bKZWzbKbf17Vy9OiPqGVJSmjIsSrjK&i`+DAAOg<32K zmickyL9=Ux-|Xfm*DJ5y=42S?@Mr~bl$93^1wEx&wp)_jDko=VVN>efwp}Q7%nhni znL4yWhTccm&s|8Gn^2^&#B;yJQ&B!R9gr$|wx!nih7XBnrR=11UymIy&opecp1Wbm zTpi1;n^*5f+IdZ(bkT`J>>-1!tA?9e7G=4YWony*KOn8|)B>S{H#ZgCbu%s!0IIg=zfU|!5ChP8lf-;rtTFl zyzN^@iPdbeZ$Cn2v?Y#jhP(_+g_{K2x8E&x?(7g=dKs4$5W!;IB*ojX$rvc4LTKU-kr8CkgG5-W=@KTfq3;XcDO1os zv6LFvMRY;BqdGTrIHe>zLx$3}5v0x?OB}+gb}Q zZ&kUlg$7(I66cX$2zxxNuFAm$1}-7u@U>+4g-kBTj`zlTTl%-Z;Tm|#Yl&29uV>jL z${dgK6+TjHi4C}6WYK$JOW{tSv6ph~L!v>A+n0iI)9$ON+2uM&z+0`UU=n;eDesUe zcZvsvO-zS{4&1Mqt$#inNG@bl-YK_MNfV-i`24&qgy5aC9U5rWDckic-QDK-5*M&y zTv~1&w-kK7jpVSm6YDdhPIIznA-IbPKyM4?vg5+#aHbUh=6LZq(sTf2LS8U+E}a}& zB8_GCJvk284G!|()H!o(0KOFqwXD3W(J#S==Ev!1FbVzND2d}>eppHq4a6rN>NB3a zFyy8lJjreWQbnZAuWq464EGQfhYM(6?jvf{aBu57y|Puf-wGYLb>i0lM)k)< zqp#0Gl4Fi?8@3m%_uim^wt)%Rb_5Y9(q`^i1D`NR~vVX4m&8GD^icb#dXuyL1a8DOy2S+%-f0Ei)YN3`X zmZArD;LBYz+u>*+Ams#|4EC1tH$4d==*f$JM$|rM;&}JT?RMhg7*Sv1vKme{VBbmp z$^7x~k6^!q6%WJo`2qQ(%oE$?1buf0K?NT3z})cYjLfxUEQUE@b>)Jd^hb`Xp* zmrmR{sg$&?j^FRomNn8}_fCoM8$JI!okF>Zb8on_(3qZFM(9bkC>#$VX`A}1&A4I* znjx9w@B@_-i+X}S?*2E-{KX7@vvR-O>fg*%fXrVO>M!hl6F|oXG&KKNyZ;RhP**(L zw-)*va&msch%VP)n)&xE{Ki;;60FZ%aaA3Hlxdx?S5ZG`aqYU&Uz_pc?#chKf|jIT zhWc(QoiMK_O>M9yza=S*wK;x!}3fQc^O;I#Zl+wt!MHP;k0-p-zop69AgEqsTgK-9XYvRQ-vbw2wc)67=^ zGeaaT8hCg7P)_vd77aBDJVopX_Y_CmJKaP_0^`0%l!zj+-j5dIKO{s0pUl9Jofef& zh>r%a;0H8I9IyXJ>pKR%NUnRVecGYwvt`$uXjEBMk~Z+pIAkjs{6KBMJUs8q{3cig zui@HqK|kJHL12pCpxs#UNTOnd&9rHJh8n)Yu7ykYlouMPNVF=i5&x_9P6}qB&@P%l zjOr4p<}IOZbDWUy#lp&0po^W&(V^5gv#+e&->@->akHC*j?5cSI@Epm%&73*Joxv@ z$@lJ*fd6H|{xW5Bvgg0m-*Eh|T7XX$|H9!{)NL&FPBYI;76;lRlX|Wz8jN> z+)nJ72z1{Ndkep={ne@ii3W(*t`Zy&B;@Q3?3}xzwVgApjKf&?X0_p!6g|YvQ{I-c z+9^!24LW8XzOPa3yN0?lv59iPVBe9+I6CzS{y887B@8`zamTS@_A?eTq-~(@g3s)c znojV{kv(ij^)|~q7p#LeY+XM)g|lVsi%19Tncx!F&f0PYVi? zy{0=%)Aws`@K0buiqGT2Nu3|fvQ)~L@$p)b_mtOFc(7I^Txt!i{E)T7f{h7WVV@Ii zl+1$6o<}^GX$2qEi$)PHuad#WiE7Te&_-R3IpoBYp8>&$p884|N|R!QWl-m?{LZC4sE zx(cirupr2r<{PC%Mh>Nf@!i$66&LYq)LwdEG<`98m0LUOO%SiqfPE-ew@DP03r*E& zA}Yu{-x%8gF)Is5ym;?ZTCtSXYoaSqR_!9z`0(L=OwC=-^;&V4c|xw4wy~&jxbI># z+t=whnm3n8U&wxyoh`JHTfHi_OzABHxSyHtd+(%(l$<3rZI!x+2nrfWTeaNOF(XTB zSv&A5tYLvvRcMG=&WIdlu7qz-T}gAHqVZbbG|VJZ*uC(C|-Ep5GB0$l9KSn)%*Pmq@z{NTKqjW z+WsN*N@0YoWl9CcGuLm8kzOkkJ2KFUtYcga24B8UB&y1{aP^2m;5O}Uesp~po1T>g z<=xU5m!U&6uT?8(2o?(FV361}lK4btmo-qJy7y;%9fC|YAmm6>othyY-ZH--p_+gg zK9iw*23FsVEB#y)_b)?@Y`J`KQYfEi9$LaKATE7G5pK@-jJ4_*#~LJ2z2qmbDzK+) z3Z=4$!Ib)_4pd%E4SIE2Atc0rxiVZW{L{Fbb*8gPUvsgLZ6}`2gnMFlsD}p|g>b*!rZjiQ7@4V>Y>-HxHJK^{4G4wMW$0nYGxZ6xBZ4iyStvzN#&NOYH|J zaKjA;XZkELYpih&MJf>#7LQ$*`V`k{QaT~;`=mE40)0lsL*HZj=blmP5ByT_x|EUr zWA(!6@-f>9MNgbsq^#jx3C6~;keE5{{`9&)r>Pyttq*#MT)jnMsG;mA-m1G(Rnv72 z)%ub7M->ZS3uxXut9Bglw@^KP^C~_d;Dk4p`WuyO&eWE(YASY$5O> zv>kagrZ@c1VPZ;Ze1C4b`M`8M?|ww2_zqqAS6o8x&c2&KfNHsapK?`2MRoB0=``cu zRkjE6>SS1+jRM&AUKmT6Q}B)&55~9YnN|(+Qw_w+SI>Q2pP{RLknhYghg0$NOLtBH z{~09AvZ2_a^FbKx<7csAi`2JS9!&3IJPl$Jmu$r5%4A?Mc%FRtaQKshKIG=8kRoo| zPW3|%&G_-7I7Qxg7v9CxXCHeRIw@tYC+~oOouS+86low0}A!}QVM+6!Lw9fO|NS^}voHea8 z!f%3@gT?O2-L3FB^={Um6@w+{YNHH*mop3BJ69UAfBYWrbqb8AUw;Acg%9G% zewr`3g#`GREr;YXrF5U^ZME8$Y0rS8tAEJQ0*ZnkNo-f{MV%1{;3J@Zv&tR zRMo$F0MmN^>fw8O^ItvutB1dt(*GOwA$!IwC+X8v7HqfP3O@f9e#r__*Vt~qPXoRZ zAauBZ+DAFKygB-MxF+Zi3~h%WtnCdf9#!mKd_(eRW$9*St$p`Jz{4>{1~7*=OFE%} zD-YqDM%KsA$wBwHK6CiB2n{s(G=Pt~?>H!*0{{1b3i$RY_`2sQDl~AYZ_w`m%Ps4b nn6n6=@THAjcy!=~i+7gHhH