From 89ee5f4c99325833b44c2fe3fefdac0f3c2524fd Mon Sep 17 00:00:00 2001 From: Martin Ger Date: Sat, 3 Mar 2018 09:52:40 +0100 Subject: [PATCH] More RAM with string consts in flash --- firmware/0x00000.bin | Bin 45360 -> 43552 bytes firmware/0x10000.bin | Bin 304316 -> 308012 bytes firmware/sha1sums | 4 +- user/cli.c | 135 +++++++++++++++++++++++-------------------- 4 files changed, 74 insertions(+), 65 deletions(-) diff --git a/firmware/0x00000.bin b/firmware/0x00000.bin index 307d6ec819f00e40b13ccac09a7d5480daf8c1cf..c88f1b8340dac9e074e4fd10bedaa3e0907375fd 100644 GIT binary patch delta 1622 zcmYk4e@s(X6vywq{lRYpq9|I}8|`Cg7A;KY=8W%d8i(1UI7vh?(ApL#)V8)Af>x@4 zFwr>Snk_nXMN!e{KrS|BGwRSNTO8{jY%|jsriOHrxVku9H0j$Z;Ifx|@;&F=bMHC# zyxV(^_=m~`PS9G=5X4psvXsao5;`A| zrh;mK4Y0NtIMb}9O-3y>JGHbhtfO~+)6oL(_u93zdk&)B!&+J-iL_~nNUt5zQUm08 zr)&A1OhSB6BLsC3e0M;@Q0r#YAHc}dEYi22-iM&!Xbc7#>W@g3v$Rxz*tNqE=|Ps3 z*1#DS$pon+AW^(UCvcdLdhVAf%&BA>JUAC{%DT3b1?HJ*q%NDh_a$t{UTS*j=$aN8bh` zN64T7;4TK?VnoW_5s?zXj)k=h@Sp7GRXHv~LT&tR?rBVD8*81DAAbRsJAmRgetphE z)ilV=ljVE`N=yqh;zW`ZM*fTJx;~3kcC%6aK2n^)Yx3-AWTktdXeW^AM+LYxNvVM?1 zExjBAFE&uVgv1`^Ps=YWAtg}#fr>!Ug-mT*l?fJ1MMm++AR}4UgD=YvnS#(T;Vv5| zNeWqN1+E-{KV)Y4j^%3a2_2o^&g&g57%RAX^QSl!63l=FkbjhAb00t9@?o67b3B*S zN;9<1Hg9wC;%x^NFpt0LzaVg{eLK^$USFZ3s01j02kIB;m;uos5USJBVLuz#`I*{w zHX?b?veJfZa^N-I&`?EuBk)v1z?YMH9`py`Heh+Iqs~cYgG&GNKbo`+pu_V-8n2%q zZ_>VBEYd0KMS2r>2vnC$*u9|BH;5D_6aCoW){J}|w6z$R2qBbvCL$F8PGB$44GaQf zKrG~G&al9)OT_;buW62`NJkH^*}FA~-|ASVVDtULl$Aw=g1gRcvX~bMqFZ2%{&(3e zzlJG0^(wc?Xh&>a=NoFX#b)tX*w>xeY^-x3TXQs1yTV>$v{}u9(NzH(lj5TdO{A5% zEFPoPZZWeLN8e`VV=1p1on>yf)r>%$Mz?#5!!>R@oECdD=CHE`UB_5&*Npb#F)>E7 z*=2FNSx;9wn}6KP{yAR6Do<$M-{^8wTU=!(o7H0XxDlH4oer1hrTwwn;(BTSS7tWwtG$9{b?30+?oSdnZT5J|#t%g-;neKu6aLGt a5gPZcX3kFSj!6miM5J1A{541K@BJ5G&Vu;> delta 3393 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 delta 34454 zcmZs@c|a3K8$Z4?n+?};BphC-*>D9U%Ekj!kR%dB1qD>9RxMDAM?H{QUuzHW2x?0$ zlGf1{716e~^+t_aZGjq!mRhBrty;9LSJ5H{RF3TLnLyvZ-|zSL$0xHh`#keJ^UO2P z%+Ahc&mHB-Gs*+=ST0D4_Y1NtVh3nBo6%KNR{3}~G0LhYH&M$5OkzwYjfD(jYnT4H z#kc~8_aRFSYYgSQN87ZcU6&}URKUbAK5$ErBsFF{o1}b(Nm}QKpHXTVD4XLSDaFqQ zEC4hda>UPtG&9ojrEH{&xz?oR&9g0yvN&w^wG7}UVbgn-0xnQtTVT?aaRIlP8jh)q zRB;O|d%4~b+;S6-UBz0VOI3!s&Ix)@7-zBO32|bFq~3YYSjN~KCd*^af0j8s#_5i?j0bpT`BYv~D6koL85zicu zF`MB&dVQ^1imlA)-;zlp1&5)2mmFP;*xX%4;Ov zr!bvXQn%I-U!<@M^cGQ|CDVIo_UJ)b3MpGYKQt8A^kYmh0|U}sRyIhya=9z-+vh)T zxN^6L2sfmd(%}N~c2qLV%4^a(S63k{#*@e9NyA)AcU+Qqw=M3X7wu7%ii$itu*QQ? zmmzhshKsX2^&aZQSVHu3q0O@aYdkAP_~c^WVUc_~&+2A8Q7=^RqlJf(ZJ6bhav^s; z%Jf^5Wsq+_%#E>3^gWK(?6&jyUEpI4!W((^d&fD(CYk2N{yrnoa!mTE< zPHC%;w7q5dF7!BSz8P=H4~y`zMh2)E+lffwM@g+@%quO&!vf{MNAOCMyXDug5kB8V z@R;}IWwx_}c%`|1kR?Quil$U7(-4HbD!d{FBjizG9PpD2@fFIb9E4LX6)VKi2%jBj z`BpdCCt53agWh3vz8=OhY#VC{8XS*w6)z8-iEysPQaxla2fcKFuV@?crX1>6HZm0B zHCrs(;|_CMRB;UB!GFU^)gSh>^3~Zby`cgaVh5JSbB~Q zK>-z`Mi0dJ$$*MQrpZXLUaMZ{!iCEMRyCd1s%+N>RQ#N1K*MrKcRL>^fQ(g$6g5mrvUK3vAV0cyXmPHfx z;Ro7^eiI)f{AXl^BJCOWgl4E<&=t5cOivhGlfPhnRz#{7xNyDLfcl48p8GMP;-?oD zBA;wpYC>$l?MGVPbR?o8dD?x1H$_xLzi5`Zt3aJ7fb1hn%}W&!K~`jDyK_0QTAuec zor|>G$$SM3wIpZtA7q*t3lR`XZINBwSvpVpf(tSfwc_URQY~W~hd@O?Pr~ z-$hzJ&ias#kLV6XOv6W(5!sh9v&o`-c>w1F&GNArU;f2iwJAhD8G=cjM@8uDmyjFy zsm~%oe@tQ7@XA_G$fW{7CSdL+i#lfrdcpESP81qzS(mc}Z`NAcbH*X1C2>xi@@>uI zd?_H0wY{lnyv-}QO&ZHbb0R(7)Noc!hMF-w*HqNaF(VGD%;hZ^^Gfhn;g$#U@^J1Z z%dGj!25uivgTZqcT^U2;>b3zW?w;_2Bb|9QTi{$?@yi*e$iqx%4-e>CvzG|?LM2W=72o6^LA}-u6jYtf#-1=|8HL`uvN2ag) zRAUrUv48b+3fQ@@CC2?;fXCYkZuM^$CMRk3wt1F$L+PBBMwSR z{Vf~TkH9rymb2?$Kmiu@yJkgs`2QNsv?JVd?A>*EbGXI$-cICSap%1`2>Dwkyswip zBt(DFzoPK{KFG~qif@7j`H+e)H>^NdPb{Iu+c_wm8c=bz_(jSRS`zH@QaGPyf}d3! z{FInyRZK65mO-s0oAy(^jGNUs^2;Etr)_`CD$n83bG@{l+-V*BG|-=SbL8dUL;NEX5zE<82ztA0J=DnZ$D9lTo;USlT{mM=L8@OE(}~s<9Mq`$k>~sxq4` zIM6U;AZno?zyNY5e*6zq*!2*wVjdS)yF2sRP&)~2#A+;N??znf* zb)~W@impb=fayG7X#hm(Eg^appdg@P;O<$_>Ma!;zW4^g1W+;Is~n7rc3F<@wV+;> zar;{Fu3Z(z{Shq7?bTTpAJVeim%57Whh9f=pKT%fp1mx+58uX7+bSG~A^O-BSq55P z)|lrG4v6H`k^Zjy4P07qgHhF6APW2?J;X)jJZl~rqxFJhnB};&)W4S$uZNm^Dje~F zfK<57-BvOGSP(}2EE`U|sNnkRV6fY&CHYgSGFHX)v$UP~$lrWncn)?wf58Cywrc;Z z(?LM#ZQ1qp;-R*`qv2W;qn;3YRZ!`d7JaDY#or~zN-Ho=KIGN{u9#lC1Xxe5OcB=mX?#F1?K%TwsqxG_F9hN9(uD@dY zLrRo^mon}`1^z}qJgskdAeRFaNqihi3Qqf7GWszl#*$i{%-UL`E!(T# z8e+-^Q8sJz|79QB+yAwX`R#7|nBH+-aBo{Cekb7E?Uuan9?6SA>jT>@Ij8%FanqxD zM$^~rhSn6z{ zeaw@hwVrW2FB^M`tCJF&rKlhk1U=}abc<)rU-Bs| znOKXxHpHFlAFV;+4auak1f5A{O`Ana-Wj!vZMsgQFr`{PIWr7KLH(Hs_a=0y;!jW9k5fi_;vDSWC$=)SBC1LV#o-XLGg29~R&JVJ@#)=okAX!;9Py=qsIn0K zF%VP-XaLv&u23Ef&;zCda*tS)PqvMV0a8666>uJKU4%H0R@0!K+}$jnwCQxZYr-> z(VopInVmof$OKdZ3U(fOgx*0Bhe74Cqp&yzEC-|lVgVX}4}bwQ0L{fC)=d~?562BV zt!*RGBNyDX)B0dEQX+TNE~pxiw96_tp?EGf@C` zuZ8N)1Fj#nHot@tU2s7u88HWahdiy0IcOWk#iiD5^U(x^%Sy?kS5XQwlh_5Q03RqN z-z-2c;nD!oe<8}m8v@A6h3F}6D7CIwgzmbtwm&1Rv)@2#pvk4y2k)R2F4$+QHK!1b zlHsVW*3aHW-^j5ZN;aa!o*V?-f*#giwxP8M^&r`0=ry+W%Gl39B}tKB_Fho1H>2JR2{tMyYrxU#?ze*p58@W^$3tM%M|Gy-AnP2zqKg}B%T zhrwDoo(ww(Jv4?KIfy>OrWdTqhmZzZx7E7LioSQn^?gWuB?|RNJ%ol5wfc&=>Arc9 z0wRenz!pwcRHFVNRZ3HwZ&k%ct|I`-H#F8N%pU~&v+81)!?4sEq9ET?qMe8**;VKb z{Mg@mqY6zyc(*SZ@*T>|$;=DUk2#-~(uS z4ekRD0Ez**fK)&fKm}j`4NzAlpe)bY_8pQCI!4-T$ZCRRSmkaRs+<#|zYg{(UIJp_ zVJFoc7DXWX0N^}T0l+K+aR3z{3Xlqq^qG*pb%M0kpgh)W>qlPw9?jxR(}TJG)^p#Z zJT&-tpE@1Sz`g-4Ls_$=>`(@0xrJtUz*9w3pR8$;>&CfqCUqkGJiAY@l5@BP3Zc89^^!-YP`PazHBVk2zl*oTX zlhAQ8{YUgOBm>W(9~8$ObT>k?3RVMjL9jfMxc`Jc2!`SX=hgb$y+jdN>iJHocaj~xK%+KenMf$i@2UgQ#^t305Cj*^u6O`{&}Q!|4UJq=c7>B z8Wm*Id9=w}rK~g3e6|wW+O8lYFQ8zQPBJf`05pXB=K}f!y+C~H(E_}suXSZT@__kn zIoa?t+JwuNlhBK3JUB|;MRY=03F;@QedwKnV-QRj?~(N1P&5Yy zsa!!e{DykCZ=kmn8o_KP`+q}UO?W8)3ygC^#JLh@OtHPY3JU0i*;U5H{r{Am>h=H7 znNrE_24tq)dkYoH8$c_cH?1dbL5%FJdb7(nn;`b-;W`t*R6-DXliazDPN50bUB9E> z5jN+L^?#yK*tUY4`4i<}n}&#Y&@gNg$hgN0jdUu*dtGz%$h7lLXP-M$tG zeP1+yDDR;Wxa>_b;T{^pnrnl|=6gu%X|@H)pGZtCn8JR{T7M4(A!W28N9oC{IkS&# zn~%UeHED>;1N4e}E$CJWIQ^z|*#p#vb%TeHrGVw$){h^eoh})@R;TY;bbmvJ^BREX9IH14&LHz?cIW+S#*M=KSLGxuqSbOj@IGJo@C>59c#6}^4$izIDw&VgR>aa zDZ!YvUFZMXr`_J5CcE768B|0TdEgj2-gbN7IL|eT9i92STgkZjre77L*#l4Gt}0BI z6eN|$cd_X;>u^sz6ywi*NUk@2Ohc;=-pN5*XPhAJ3JfdNw_wn`MKTolS1_hdiDTui zx4h`0x=}@z^~6!GH)zguUq$xy#OjFRw?p(-W#BOeL0@o3tuN>qq_5>*Edr?mW|A_v zUkPY>o3!=BhgsWKDsr$F9_7P*rCRchl;^?(^x(8!Tz?|@fi_rvphXTB4n4+b;_1?iImgY?Jx1nFl(B^QIq&3-sWW113}*pp#k z#SK&1&_Gyo!+;nWDBg$E923a<>2^fI<3=(W)gMQ(wvIm5CH=ua{7mXVSgrz3|3EDd zG`yc}FsW5xE$x`b0@9|!74-6YFgYaP*I3hqK18F&Z!4hXO@Q+s!%Phu$fw^SN7ZjZv z)8IL7z*`Dgzf)v`2Ct=eo}DDU!|~C6k+3RFh3X~)rUGUFY7fJ_2q_(|}rVeGjhf02y5KAHgaY(m+Vp0AB%M2wbm&R1fK9NT))&2hzEe z2Jj&u0aQEy>24@L4C!fF4%ZEk_G^NlBFONY9PvE?!GI{h5J2onYyCj{6NgTc@*#M% z0?1|%m=ys_0d@^(9fAkAodU}R`RI3rStEvGWq?=Dl_C1lEsprZ06Tc%csxb~6(U~> z())Y@53_(I$VWjM1DFh004M+y19kyA3ar)R@f-yTvPR6r5XMegjkEB75DK%NcnSZ7 z(JAX^*?1!2K=#yA*0z^1k6F{59#*#;JPrkzkM$6rNgBSsF2;7Ghu8|2=7T-Ryg4`t zo0pS{IrvpMd8+W7XXu*E9sHM zhxeNrs|gnGO4IO}*;*MF+e7?Qg28#a>_c-Lu`dF?2`FJLRCBgFo zd;#gn4=Zs*c${h~3dIdNj)|1%2S;i7sHml;Sk-_VIoMa;41ok`3gw>C(> z6z)T0aud%8*A(}W*dp;>_p^V*w%`55Cv>#m_ZOS#Xusnh_&e_h7j6F58Edc>gMfDn zVF1}Y$q$9tgr}N`axKnf&FB1yc`Z)C=4IsKTD&Iz-Wqtb0oVm705q0@%K$RrIsu>p z*jK}<22cqo11txm0%8Gy09QccDhSMg!+_0zHGo`De>SAafEd6tSd#idY6thc2&h~c z(nCLERgiu&WR?SF0}=pHE3J>#;ja;E{>b0D=Uv>(71~o%f(u>DEznAn+&amEvFso7 zt*NrkBKSX;=4Y>k>AH&C+=9bd?iWAe{xKdz4ZpdHjQSX__Jm6jUVKf0h32{{>$#6H ztf!W)C0?a?EXy77BhyPEL{^b)rFaU<9q=Qqr8vWn>+L6A0v9%A_-SDGB35SW>qoL~ zu)Zv_yNWE^idB(C{fesNJfTZA_A@m}iLlEcJdx6#NO63Mr}=X~`Wo!2!nwR!vzAnE z#ToLY>maoNXgEom;pkMORwUZI9QMI+?Q(TU4@p>}sb36gRwVo7yj!#bH+I_?O$Mn@i@(IJSCNj?J+JYa{C}b+k z?c!N*7}G9a@r(q{%6;xD)>04p)K~2pSkx?D{+n0YK5Ky4;e&=kEp6JK)tOFYRdbA5<@H~9Bq zK+<|^@2~J`%$m!5N!ebUDzAjQd)AZIz4%Sm3@l6c;Y_&?6f*0rzwE;kkXI9!=sKVd zaB>|Pb^t$OZ6A4A!w%xJ$n!f#yb2Hq==q)1aR?9QP#Do2!^85AZHKZlxDQwW_z-Xr zpxFV>_JGZRIsj7+bb!f#GQei={N0dN0vZ9bolplL6;K8^2Dl3F*#+?#Fct6zOo_RW zo`X4l4Wy4lrTlmiB6S)-_9=u}KmuR}AQ!M4uoL5K2 zXaF!@!Q>9m03rd&fT@67z*~URfa`!p0J8^L3>X4P1>^z>0HuK4dmQ=kC*h(N&;V!x zxb6i8KqNp9m8e!KKVxH+O1E$4 znGVt#d|E{gGUfxc2Jcppg^X=K&3Ltnh-UUdhJ%dcfRtuTo~>esgFbfbr8&M;Y=c{- zJ&-Ybv?fmHAd0p+U_TuVrs@|d3(uj@{sEzbu-u61wGm=|lLO2Y>1>;EU{%^xr}^-$ zYDYSMM)>5H$5oEhftHy#o6ixxb%=KyhL3*99AsID;f>5^Ef86`RyE&P!q;Z=XY%;( z!;zYQm=^L&xI)c8%A94%s&Ir0xrU@xca`3U%*l|;rF zd3!qFlFhf~@lR2lM;zz1 z`KnBl#k_^`KWi}tt}04M_mXFD2)sqy=TKk7Hqt_;NG2N!zH+E9W80>dE*sJJhAl05 zUVg$Gj;sQQF>tN8(~%yyE;oBM+%kRGLJ6KgrG@IxUkvl(#jRj!TM3BbnxS-ksb6}P zD!={`7B|BU(?+UdQ_F?&E8=UkPxL#W!%CY$Zu4cF$DhgCb|r0=L)_rddZ&2iW~?@C zXwiC`AGUzYs(;43Oy@PlXk>DHUByC&xu^xQIYA0>jRRT&&43Lg(|feA?q`rH<~!7v zXc?FPZVO1LzYIpQ-D?rvbQmT&(lH}UaENa>QjM#jcrDfVZp-6k4lxCUqux}plWL>a za&e497~?4C&*+0J;u6P3qhrZXu)x<@3mwCe_$u^YinrFY?2Xmt)zrYZTQ1CVh_PUG z6>_DO1eD->@p!8`G9QJdLtd4xQeVf}B@7t2xgLwNoNcw`LqoaWXhZ8^7zeHtr_n0R z?>G&7qs16$6f>v=-=-G4-eUA}IU0;>N@ZzkN0#6aQyuzOELzVLx#>+x@Jow)lZ+9^ zQyVXC$p^6+B?_CN%|KeyNGn=W4kb6RSh$_4iKtrQ>g}CiALNk+nb_}82TdR1*zcfB zPOrt`j)i!p7c`dVUZ>;mVv9*^7Kb`gFqAB%B|oU_+U z9)b%|>o8&_9d_$6&ciH>Xmf5$A!eX*4ISUM#nkJn>oL7^u0@!8MU86%l-T5NzkzLj z_N@DzX;(Wv^2B~H{;7Xh%nQ2tdpr4GrS^j`NcqpUn7{4}Xl88NJM%?9r3xfFT&V6$9~7B&pc7hQ9HdNLXo0pgj8f%iW~gZMvM57UOY@+} zjK!UxiQ&^uIjrdz!;#J|y~Ut(|ioz#hUcZz2^sT1?I7is-pw+IKWrETfV#*AT8r`Q0@F`1^-+;m#O@s>n|jJY!i z7p`MyWW3f1-FweY8=cNoJ-h;kW0W`1e@DZS`u%v`HW6z<8h_lj^3rhvW2$s zmyZtYtCP$4z!aXxCkN}kYn_RsCa<1e*XPFF*#5AA&hUZRRVp~Uq4Q*T@9eDSyz$s`dSoav-e|p)5 z)5x}kY^{Nwv_;blX=(mRpHuW_O(82z?SxrBlj_rvUS+2Fi+KX&n=tWa&s8(`l1Gp)E>uwkWDaKA&a8 z(VZ|q=c7a?RW;%kcK(RXvpZ>JqdI5e6rNT%uqE*&THy#<;YcT`(xobsYE@)Z3(qoi zwwyr*s@LF7G??Chh&v$GpgmMENWY-zh5j#Sz2ZEPj`jer)Pd;+(Mzp&K9p+drTJNl z5Y&kdP+v6NZlc->R9h|-203Wkk7|qhI5o&aU}D2dSH#}bCDY4LdIDn(YLO3RMH$so z;iOXg3B#POuKYT5kQZ&1x6?*KOHBl;cCOZ{wfPaE2MkBVIazcvbymA=NUM15vf<=a zwa^~JsuLJEIto*k`BaPeFoVYkIo+rX(N;Jvfx1-J_72e1)TbrU54KczIQ-+Lu09`D z5t3%Vlr20H*LN76bU?hB$C=6cFlr+}`I%hLmO>XAchQvzP#26qmCBw0@fe8i zchD{fXi1bHAe#oX3WqO?=|I}3raFJ?)Y-j7{u3N> zf}pld%D-^DLp;%86q;ccbcK+o1KTB^K`QDQRQzEo{(OqcCU2>!!s0vL6w~HljJUmn zy3cxNt=Lo8cZtTp=FRG#I$(pg=5?vQjLCT^s9IuMktmUT7o-O&Cxzi^afu56)3n(Z`Flf7mx7PFlUrY;6n zm`@psl!^Tvz#`X4+_!W#R%I?td)N+Q3|HF47dl|lGB?^2r%@l7OuK0)WiL|Jq~WS* z)Juw#a&O0-cw8e$Ag}%s+pLYq7sq$N@@)Vmz20op4iIBHgio$;_w2NrOdY%*w9A;B z!`-#ZM?*^t9ZiE&sJ~OOYDDQHJA~pZ+@E&Z7b9t-O@G)EW2h1_v}QkN%_VB>03@Sh zh_-ZahdMb2Ji>O%o?oNIVwAH|_wGu?o-q6d2+AwA-<(QBIGy%4dtwl+G>ld%HA77g zamFE**83SVzMcHN=@)yAHx_$zX!E^M zBdzSZQ^V^ia7i1k1P#B3mfNn_Yd9==I~BZ52{W)OotEnp4bA57FsLg^!j?c{4qSs)COc@by+^*+8?X0Bk;5wH8%g{ zY{XOAsk{uhZ9m!NcaYO)Pui))&e`R+VM*514p#Vv>eEGtF zD-=S2aSHyLw#c|3)^^ICxD5e?d6%E6#My)+v2@)Ba!R6sG(iVLRJVL$@#`ZRM^mVR4+*p12ypd7=Tft$tgb z!+hKSD=f}@*k1UCQvh*VVv1A1DryGP$5cybmRLf&vsj;YpIUD?WouMYzX|->C=(1n;Bh3wWjfGhw5w;V zr6SAhHDO4cL@Ss5OJ}Ea)D{zfZXKv%+iI`ri^TDiuI=%E>w7@ysN6)LTMwd5pV(`B zkvN*tH96_>oq`+w5j+YA3+Xu9Y_D-c;z&w(hZ5evjXIt1MELq=W0?w7&h1uUNVosj zCk-)wWS4hBtD>A1z1GE)p_ZwuRJZF{^}qq*J8ft@b*s7(r%{F`!bVI!BYg3*Zs34O z8TyJ=3U}(0CR3eN)K;cqyZjzh+LtPFn%3FXuZRCpxM#ac@3iqHY)qPBdf%RSodJ4Z zN`LGh#i?y~Qx4vbTFtXvbug z&qa-A*L*9r(LOA+CsqRwos9$Afl9rQ>GqXpZPb2i?1?A3`lzK1Itb?H)%Kbrz`+O~ zUyQ*;qmegdGv^@5eu317F@ zyv>MJlx}*r=?~o+*am_kWiTBN>F!^xSAEhmTYU$pAzJfk+f%%_JiB}`!-$95Xy_d8 z>;oeUtp`P5qDI51Ffq3|O1BE4k8VLe8v2j;FWTVgnu=d&Pn^X7)u+xnMmX!Jrem@C zI=oM#4sW-O%^<>uRKCNSb=s{Md&?VTRq_MCb=_m9VK zZ0q)%q}OdZcDWG*zE64jQJ$`0>_uhK)~#z(&-j{p@oaldG$WcRogbxZbXrgbbotbT zs??vL#B){*Dp+f+bmq9r|Pxh>N!j{pI0P)50v(W%mv=P+Du&FPl%no}d^gqgJ2 zJky@omk}2`ZScGaNaz%#!*uL!rEEV_HrnzzPPY6@xIXEaX}VqR1A<Qhr_xU3GUyTmED4Vzw!?O#@Qi;A9!Rq4ffcr=KUTOd zsm;2YcF*ukRCa&H2D=0O#c^%MGB=b#$!bP+z~gXY8$Sf4JM+;U;pw0dMh8 z<9HCjV|pIgZa*3bckl>i2+hd1%la z-czWM(3h0z)}|El*>xP0_5BiF#`|}zUalH)0(+y)^!{9gy^8kS>BB5pn}Wyi=tEjq zE8a_U6`XeG`^x{6gv}BvrZ-GqG4dvQf+j%U>A}DuX+{sNPXfe%_BU`;=*v`l_yEFm zRTBP|P$tc~cD)Mau1G?o6ob(8@uUED+@OOJZ^D_H@5qXq_)V<*i#)vv?*UJf#NY6X z$c>c$hDRbBx%nH`skleH?dd-Um_UBl2_E#lgjKvtCTu!HHQ4#8Cq)goUzlmRr{PmcSB7;7wKaZB zj;aTI(S{_hAN*!t(3k8Wi7~wC87=Oq9J^r8tp@EY^ zBU7tWevo@I^x5<2c(Uks9PnZ@^&$9Dlp6-)u{!0fa798FDT8nc2IW=Zo`}xVYQWhWgBA;W$CBTE$Nda8r)$(_u{aA|IOnL& z!u48Z)#>r)>np*c)sY3Usw)Tn1GZ0h+J2QOjJm=^nt}V`iScCAAGl}iNm{9H=e;9Ilnj@Ziv(V3$lmXm!AgC1ZIk+Ix(Y{DBAJ^Y4*r zNb@&QVh!SV^0Fn$NppYX{d03v^L|7dX*vCv@5j_|1uCLBwbmCzqIdpBm;$Y(cU*s@ zk_HD04N?k^<~c3&BeOm@G)5tuc8I4z@)ES-7_Cu~1Uc+B`drEMN0%jrEdCS6;o3W7 z-=BD}2CTEP`;6~3;f&(Gc)PZ-y0-Mf`0>#AdToK>rbAOFZhD!x-NAkE=mG5lvIj&={$lnyilWJwK&#x*EI_h5oBCkPV__g)WTN6%FX-4DU*HW%HbYE0kut zy8E9o&M-~yk+XO30RPS;xcP4}!^20bo=6$#HG)zGyDebzS5FJ67S)JVdv>x-u>W|OU1DwiaiIy4Ta2Cp*iu&e8ly1D=@dL2lL z@`T?d^b)0B()W0FF zb%1}W)xKR8>mIQRl;@;h+)=F`tf@4#cc|!SQV0h-#6um%T^(rdQDBA^>5V>DvVDZp zovL6Ju|CA1vya1(1KLH&^qg%2oaPeYC3~8i0;SU`FQj)oZk1ertO^>>ga_xSUB1th z={$#(4!)A95K1~=htBwEZ#1^M_Pd$5Fo=1YiREgDfymr}LY4WqY8#2+5q<~vA4{qp z;dOG3WRUYZmQ;@;CC8+xm`uYf&)`T_vpbPE+ z_79^Q1rXAyrb3(KrWlLRS4m`h6IQwYof4`Xh?-N#_f2?}A5eEw3O{twy_rO2KE^uy zZ3@}=7!Sc^K=~L>hQ^E`qnhy!-0KLr)r|e{M-$1@W;`5oM~LnT4#Vw-$%{{LuutpB0clPhh4mi#QYpx_`4oTwAG?(Daxpa!> zY0luxos$Ab8_r4mP~`s~Qf|ku`xH6V%j#C|-7zGr1rNx-bU~fvdL0W@ZDMts@$>m; z`Qa`btJO$X)>ESlPec3CpeWFsv~t~&Rg*o^C%cO~CZ}zmoa6^lQzJ`N`$Vbf(jZ)R zaO-6B$z-_PEn~j)Iq)Sd{X({JGc8&!EB=oU3?#UGLzZ?*%KDI&k_#=kUtn0`+pZep zdSn}WY3fR0+?be;;1>VtTTIr@RN~Q!*Y~OfC+zw>16H<3VFHDOur_hm1hTgkhk4ij z_cpAGu!;QMipOF3VKV3`^y9M%^2$@3i@g%bm8V#he~ykz81p`f5Xj&$Vd+27wgI}S zYhiWv`56UfhW?08GRT%lg*}%dA~9x)icvMq!#aaw`b6oB4El!VK{Ck8Tf4LgxuhX&%D$ZR-mtz!p92d3r(1`F~dDAUO&J0eCUIP00|%m--`xC=}T ze1#4&IuD~4oTcrDb!EL^9Rlxo(BwoSJ;(l@Luu8*MOellT>=r>aH<=uv{FIe^F?Gu z8`cUM%BwCbFo!ZR$wHG9H9Q!3P%i#;m}(3kr;yq<7*5d%uDk9AMiMWA*db{5A+oCjj~K!o@j!$&5x4}(Wn07Ocx{ev5g(8y zR={8|hL|%G=-4s7;#_|pJVBJ5cufBZV={(tsY6x9AOtsI=&03WVpv#|m{lGdUp0~C zop>;;@yXs!c#M1L5c#1K$A(YrZmqdV5}GSevU4;wRfvJ3yZdykv!v%}66Jt+7;}is zcHl`k*hG#ya0r}?|IL8~gH7e(n#@cK4)s?E(UKSqExLsG?y5JEXXU$?;$ok&EvoW; z@nu_lN*2hnt|Wqzt3t=DT7Z^3Pap;fhhSR_nJeLb;f)Co8mpE%;&3>x_2OFH(eDXB zT(9bWj7S{Z^%!A3MD|NKJYS*@0o)|IyYn)gU*Iv~RS$D}XBWTiZ+GV-gm5N7tuBb+ z&x1i8xx3cgz|iY04zUGRjIQYHL166e^&W==u`Nla!AV2@?Q-j4AVA+xA64(Wn0`Z+ zeN)P=xtMOd_t6V%^58P3hS~yQXF{whA~Gxr7pka2TBky*xLMQ-B4`G@9U5c!FyW)i ztT6IJS|ObOJ|9^*LQR*vX6n)ZU0=UXZyS6Zt_e=-3c>*g{GE%jd^9p2Bs#?E29$M2 z0RblBrIfnrdFRyRE3a^=;lZIwg|Ni|-|HI7XQD+1$p?t_SIzBiDFZtok+QpgWDyR2L_w!o}fpIpKZL>-+uy~f&f@Gx@-MJ15;FxyMnZZIb>Lfs+p zxxpD$LKDbQ%uesyV6eq8!ofp`r$UAOhs0kE-QMS#K(s8Ij!&D&N|p^A{j&imc>lta z5|h*xM8h8}=U|Cx+xN)4?@=ih+#R9^G`AJ~b^s`$L%9J`sZQV=Z~(65t5CpAiZ^ zF_3&2+gl02ZSpL71Q8y@)5~7VT45qz$=E4otkuQdN7kgM`v@;bV6{sh?TOS^da(trEx3sDyeiH9m;xZ!Jg-LfASv+@j_86w_Q!wPg zqJ;9Y*UDeD3B1I^Bgb%bn9@TxK9Htj{z>$a7sFB3Jt@^xJU^jKMmD&zgK(LVeCx{k z<4=s_vMZ~>9~d{evHr&QC?`Bw!*Agu2^G?83^JUOV%Twm)hy$oR*z=TN+;DM16I8q zpntCM321&+iJ8RP5?Wy-FSxPM8Tx-zs&sUzG?%gz{wSeW=mkvrrT^!opXt1Blh90h zku5MwKBS+t=H?Wn%NdU;>4^+_!ASmaV}pC8P>S8?;2LSS`-v}0+!>E8CF2;BWF&$+ zyW2l!dTQ$A+@-3r|0r^&sHVwlo=Q=*J4*eG?G2BYiLFsRu;-t=Hac>zqRstx3j z2RkO_=Y4Po#vN?*-KGaqeUV3AK$tiB!8xMdiYY~RoV>L(563$Gpt+T&3`FGF-uR?} zr0{GcJ_I%M>@@wy-Bhb6Rn@~zL})=dALsF9d2$@Dl>aT|=&ZtCFnB!NKpVR0mpNs; zXCQu_tOJjO)QjDK!wh7X7aOkVOR0FAXqTAWGqA;}AUD0(9Q;U661~}IYzrXy-fSp* ztNxic8`Nvs{;9IeDL$z)4C%Ix)YQZJDb!e5-V?}eZ+3aaN$SPuz4(~iyD!T$KHQ|s z@RfuJJG^Q1=~e|}ziXVhzChOauw!wNp8Vv)2H7iu0zi>!ulBk^c(Ylxy~r2?~f|i^h^S6|5c~Hjz^bRuedh`a|O? zBabwqx?WPNW5$&9(VzjbDA`Dm63l8al0ix~xM%aI3&kDqVr8o;Ae&Qb{ai}mU(Pu1 z%j8uhbb{w)vR27PdtDg?x1vj6!;seD z$(zb#2`19$%TDx>o0?7IjUm3(8BBVJpShfj_hUl?o+qTab!6|4>AIKw0=;M3M%MbV zeQ{#~`OJ^i;o?!`7eBUNVk&4_3Q?-gGgv>v1Nz{a=%zR$p!egdZnf8!@K)l!Ql0^; zvAW$gJd<;mE8)k5_KMi}T6~FHS?F+_)5~Ya!=sFN}IG?4n!fQ=64~6dc0YdC&RuD8!Sq0c`(1J>sl=`{)8A z)sa2=435yM7xajVvg>9`6h$&V+-7 z#}HK@I|h4ANs=Rne-)j)|Z`v&X5WH*!f&}!og&{^;ADLkV9w5FG1`Jkm!QhVe$fS zq}&Z;Q7}6Ne-cM*!R*NCb=2i=r~IcnWtnCPOp&vfEAnRgpi?8DIF1+UCA4HXT)GPM zorBi%S=Lp9GZw&~p`lml9r*LFXE2n7UGV>fGS8;Mv+!{V$SK}HriZX`UXv*eyb6Ks zWt29Yd>X=zKp&EZ5Ox6`9!DmGvM-^vWM3#djC(0d^d3p>hq5Jj`5y9i7(39fXA(3% zJ;jDH$K8Z_)1+5=FOMgSBUk}1j3*@#>>y8&zzp`G7ug@c7u-2YcP%SEjUoP# zY$SJfl;PNLk{HQG;Jw31UL+gtQ88+XH72cI$|@U9K8s|};RVCVGA+9ij~hwc2C_xi z5lzTI_7ol%Lox=jFX5xn#5#z57dJ+e(NPdGZbg#?QS3CX-jsGLj+})e&nt1fEB$-N z4rvMal_QD`@LUsUYM3q*6_wYqFa%Muw)x*TgY7FXu+Cq8h$64T@-gcR%+2@z^ikM@MNsX)97B zk|je}{~>#6Ui?J5%EEs#y&ulHy^p^9w+YwM&|)f1lV;@kGq_F`o{aj(lM_SO^!x)u z>5bAjPvef`Xs`Amn^cIzpHeZ?>GOy@N z2zrBNNW zN1Sxb{di!}8F!RS^Kw{lF{yGXz6|`aiG^>}T}kLL_B-TeeK3r@jPRCWq&fxy`CqZ* zZVZgRgqy^7IHX5MTjPhb@ONFBp=9|8DCj$s>>9y7MDC(8-#9`d2&d8#X2TabB~SF(28Byn+UvRm~? zP}4_Haik=U-41%`MzM1Ev%U>vgaOtV=SGle2DU$*p|h?quxjMqIWk!PVr;O!Zyfo| z$d+S^&N^;1n}%?l&bl>$9fa_rcyi7JONdcAA|$e+@M{^!HvB5(g>8ZhV{lRK+rfH$ zaNYNHyH;M7Hh!~jmGu^2Ia!)Ojj6e!<&q|#mYSNPmdY}} zbJ6;|egFCK`8?dY&vu{nob#M>o^y7=p%j+d9a&ut$I@0o5TYFpM;$)>@OcWKQo+^K zoS@P+kgLc%Z|TpB>H&#^kd*K+!E1w%;5n8I>jojXnP7nOK}bsMj05pymPxC2+NQtE z@(9Yae;LfW5fiiyX8z70iBfKL>Q0b{AcAm-gE>POYK=hg5S-J>XxKLdk#@x;a13Gn zF}nXyX22oN9mjke5XHnG93-%0WH6HnI<8^Ng zb1J4K1w}Hl zp$C}8vd#3&k8ouyOTi%z8HXcgg}LJxYL3FgaV(nJS3vN1Hk8KnguL-AgqB7?$#`S~ zY>0qUtAKdl=N0t=rWOwqqo9g z!9=9mFNed26S1n(;qdcBL^5{d2xYLTbZ0ocm4OGDZQ-yxgH52;a1br5yZ@qa>~mOq z=~}*;sI~g4m?~tsMazW=9wav$%oe7_F1&7G<0SC{4ZDX_4*r>J^%gdg;6my-iKWrq zgJA6>7S_(Rm&yUeQ0-~|&{i{vg%ej?&Kt3jd9JoUCnJr98)R4(tMncihl5tAJ5str zfdGZmk5uz;@Sci@_)Zwin~IYY9S?s^Woh{BVR*Z{ul*1`qE{qwiUn%Vb-{`ML0M5< zJkhkE1V|AXoe;0^MMkn(i@k9%Vx?O5@7MnoDUb)zaB3P-FVl4}Z#piui8?5m&PLIf zb#EUV$)b9Pe7sd1SSXDo{%sKl9Lrtd)7My_p`$|3Bn6fDPS&Z_ zc?rn+b69(D%>yI}zqe-!nusedl&XE?_1&-{zXmcn8rTe$8+}lZ@4v3^qTEy=H`tYf zky3sYsXC%3-b#$Lll&TOJ3EW*B>}ra|H;y>D*t#}rtL}`X3B|%U31twI34|R*a8Ws zH0iVaV(Sz0&_ht2gY))!Pmptwq4m*bSdq)dP?gqpEtiRe4&My7=dy6$Q;N{2GO|Sd zwWsj4LSa_UEGZNEK|~%46US~M`|Y-Ic}U>Xy%A734=3iok#Kb$8&1DF4$<>jGTpxg z7S2aN^-ya&JRhOC;e3eFHq?rd-jqagR(U&o&ykkjgchk8vMfb%vMmRdmbK;hAq2WC zWYLCi{uTSR@|OIQBQ4{xq*yps%I#~*@psLYA+Tg28-#s7ypS!VPd7s1BBsaJ+(m4* z0?37hiY^cWbAHsUd9(o@E@GxGc0%lFnKYefwddpt;NjG+ifd$3Ax#^5z2GLlK7k%0N*TTT{=f8 zF}Q_Mk%fe}r6%G`RJ;oCU@`L!4pgEr!kE1wPGy*Eb)Mv+s0`hE7o%TnzEiFcwgh2< z2qTxUAYbd(>>sTF;R3es5{ApJwzrnBozzzu8^Qhg*w9)W9{rNW>e>)US;~U2hM7z8 zyk_@dW!sbBqowReia;PgpQZYXGQ(EXW+y5qvKMEuHgzjkVi)0$e8e1Xn<1$HF-A%V zzZ)Nv z=s6)MaTicBS+1U~EHX=^g_R+blara0%Xb(kYHbd%*&asDd`Oic>ioH5W-7^oUCP(4UhcB~lV3PYi| z>ss(AVvFgD0kFCVG0puou&;<^P*Xf~TF$7k6|lOTDPe`{J5Gep`Kb8xdyp9Obg4`Fq5}FCs4^eX*fdd zBJ7ytS}_W)uVI12A6(Y5VE6aVA-r_IzY5dLTcP(_Hix_cAFpNQWD|^ki|y`v{P#q8 z9UAE}3=w26>VhcBC=VeA5^=8vDgqDnIpnsv2*`}1>TpzV$En2ak4c1dvGsc!agLv; zB2rAMidCv;p^EHKIp?aJ)~m!!6(0Et;)|L8PoLkSX z;ntG^yp@U=(zcPU=38pbKSS~+Hp27pO*!x$O5PLOB=2aRa`z_IO+n;y*1@q&NGVJL z-_0zPjDh}}Su&}GqRrUCYB;i)O(1Fr0c06?*SZKUf;I;`yE|3VZ*ds&LSPy&RBMDX zKq{db_5sq}`RkxTiEV(cTUaU@$eOi<^(CICZsdPTDt6qcDOGw_b6Pq-3fNm7MXz#do0iU3Q121i{j+ENbBU zSB=YCGX=6Qf%mOBU+HR&35w$*V$|{cz&^igRgo&W<|4^g6v$5}+*hB@s~r|m7pTH3 z3(^Mip0WciJq_?+E7NqJqhvx>u^rX}BI zEMYxJKg?E&biu>+NI4fPT+h;4i&vw?n_4_|XU06pwD{CmR1KC6cX{>Wx0FR$7FQE- z!C>*NI${!|VDC2eMi+L|pz+!5-(L2Z;1``QEA&t(>g>6bGcfo)JRZCai{E1g=VL9{ zKw^W>-(!j75pOC-7)H>**Tw>xb1e{KA8D zFqE=LG66D5nWocO`;uSvecCz^cs@~9w!1v(e8mZPr<9HAfCG_@VI3~1=SYc+*j&cE zeZRP!=_H^vy0k2pv{)D7?MN*ZEFIp0@G=(aY+BJ8N%V7JOc@J~>;4;AeM+Wls9L~5 z!2b$eh)b=|9XY1P=qHMHf@J!r#pOAdOu)tPU~R#Om9Vdjy+(gr3-S(xjhkh7X$Q+0 ze>_S^j81&yRek!X@s{Oj&X|hn8mYrY^O@LFu6h@DoeDQDUVRn>ZAJC2wLVEIzf(gz zhPX>ElB?uaS<}3~;3M)*@yaq1eoFFk5u`xOU)Q$LNeFoEWZoU>9ER+(I0%}n4mtZQ zBGNhs#O_1}dK7}`oopAm32wVsY`3inDA%guG)dWK8wLoC14v0@@n%Qe8)VMg#4-*t zcCisoRk(QSiecX_rs?|mNz{EtWVt|D^bDIgR7!A{M9GPK3XQv1Isq8`KI=k?A?tk> z;Jxys1xZuL zYnyj7f86&0yAjZigMPb_=WjkKIk^Z6&tO$JXISj;UEC1DdU$;|3m~`Po!xArZ^X&l zUkhKW%FFe(JcpRHzPt_8%Z*zuF4DKVb973Ml`8SxF)E`jGV^b7AI(ETo_P zgo{AcT_rE9`AETq;+thpDimKW83?F_#Pw(+^Q4eiSksEz=xEuk>ZfO1i>KG8S~^^; zSgAVm6wZ9erhETB2@6kfA1cM`bw-6PLVlYB!#-jrzaN#922ICCjd!X>m89{C&(RgM ztU2r?pFFYrV|;L{XMbacgY zp$fSGv-co(HPN2o+p>%;l7N!PYuspj)(jfIy z+^Htm@F|-+`p0MZ=^`hAJhg_Fwwt5gA&~wR+{;;LxAC`(bq>9MTQ33||3MV;q(-FZwlu@Y zau($l@~hD!68oulh1KP3Cid`YIg%kI4(L+BOtfZ{Fj?i4Q`Ky&+tz?B%?Eu%k zEIdHKRb9~P&`+qhcq#j-Fl!*<17y%-naxifFl;XijWDf2E~%yeBaGgW^`!WjqhLsc zk|ku@KbmB@S=-FpuNw2iplmOaaqWZQ%wE=kx(36qd+}?xg5b5!Syz91jNo+LAuPv% z^GiZ-_MGwY)QB>UWlgZ-b7a*nYJwj=$4+l+1+Opg#51oI_I|`s+S z73h27`ZN8dZ#1iZ!NyQIDOym@Av80|{ssD~2^rGW_|QQIq6pO)C82v9MR?&lf@ZDZ zC>;INVcc+03bbTA#1e9d6`}5P)j2uKN{m4mSs7v#zE(hSWtO$9Z&1}pBtt{2FUZg= zYe9QQjwKwEQ$w~Pg@z(t<#*OL)SkE2IK*>~tTk!oFE6Bu*_ow|shfIMkE~NNMBI>k zo(l$~OwtY(+n6ktH6L#3}d>siVZAkcstcE8x)^ijtvB?--#(-;AQ8ZAnxw64X zZA*wuv%FMkcLiDCX@!D8a7qgl#FfoUdP{>W>2DSoSKtS8wWmuLc&=+x_RF1i+B~BN z6nx3F?p?1NA2(up=47k69QJ+5LY(I-JEelcwJ%w0*NctobtS&j`ylY0ti)HAK3M;W za+Juq2R-+*pwXk1STV4rqSB#jhwckZAE9BvI|*l2wA8wbmk*LpQ7-}c`W^JkS`19c z>fn}iyw%6sz1?^pdz*O6GQe>`(~vCO)VJ{fj90FarAPJEP`;n(;_{A49S}2oPSqi) zrTNN-HsN@_B$rN+2A~Wp`=~Spld}{k?u)5^$7g}+E9Sd22y=3H+W7}^ zDHp$WXl5c`KoH%V@fDY$^^&8g3IVv}WKL*N#&Jp;6+OjVrG^i_VqRUW(;Xo)8v2l! zac_&g*@1w(?PWa`y78%W-H8*r0k@!v{m?HNA`f?dA8KASs2=QUJ7ptm~po0 z-!m1V-s51&5f({Z$HB)(kOS8|7JfOx=K0xUoX*_rkJm2I){527DH3T2G4jO&W*^1l z(hp-{=TVkK#T5AMC_79y^oP%mv3TtEtz*cZHbI{s*aDh77C!$05xe*jT>XK)LH))m zLq36u@$k)YHkWGuP)5g>qgW>#hMhnTy%mB_A|*DxXWL)~{(Mha{NvrR`we1sSwCbr zN%mu+@-Y3}_OQZ=lgLSh&tUgS){`9k;POdE=;?#-%PE#i!}>w$Y4#H74DX(1U*jX~ z4EvDTJ6*StTEOouRCf{K<_Q1V(0CtUVH@MXOY_30fWwB zU((Vc?<~rQd#1y)v#dW2PKQ3{SZ}IHfCcB6toTDg!VwkTTq};2T`ay;@HEH%GkkiE z8JRWW8Z@3`J>pGU>i?8EDv0O>pCu0QKlLGA5712@7{u0Y2c&qH?%P1MP!=B4*w2LVK^)T?-E|@Rl=~;h;shv$KoD@+7=~tLh@vHF& z1MdPmuHYP4ZMUzmj)cyA1;|yl2y0n6<^n=6c+Lr{m$PdX(0G8xMcf zBj-N=hPL@1xK^RiySJoye)zO2%b&~BdA58&GyER$aEWefck zRR{vi>u~mbyd3Hpb?8BQ`h?n`K`Pu3*ctEZ3|3Xp0+=3D`J8$NB?tSwqAFbg?4;!8|y`dRrh3P+!L}^QRch@pWI{9 zyI|L*JwFQ{)l@e-E~==7)$VkN11~`LKiKX}Qx5yv;h{ny>P@--ei!Hc``!M3(--|a z-L&}M@AhTjd!GfU?63Yi-ek+dX!H*82#Ow{gki;F2xw$QZWnF^B`*0ZC~?hQ__PsK z4tB?Y-$QoUEgj>I;eLd2ppV!#G6YH=v5g+%OVGYQ`b8LzAw9yD^q4K9^gtzi{}+Oa zT!Zb-U+glazkUYCo-qyD)4%hK4JNxGu8GZ~)fMnr6ML(jNfBN|x(`x`GNd%)K^0cw zaH4g$04Qo^8{MqKUZk5KsD<@($#|Y@vRPViQk_O%i!a}SpITWuEsKU|2Z}(Z86e$( zm|(^4@QnkZ=l}!Ub+8%KvwYK7oF@zgEtWMatr+$&{Nfs_1hYtzY zp^5xj!pGn)il98h!`@PV7h#sQrCw(itKnVB%>z&Zks!5D@diz+{Ug%DzL8EV*5)L% zA4)PtJhBsKwBh#!)tXHkXs*T;6QrSJ&WJ}Q!5J-C`Z<4+i$o-99B{3hSV5Q6B%_8v zV;g9Ixs0zyNbO*Jnun>bUZ+Axb+ulnvF?OL(Q#Y!`?`fLXA6k`tK1G(l zyXlq_4)_+T)!64zyex&8#G6idb^68UOh84h#V&=5yjMWS?g;B|DVCXfJ;15@ALGEn z<)_HP5qVE{p*z-LZD`R-`jgR6E%M2@>qDGyc&xS&PW%DsY|5lsDQ!o~b2NFg;0YcX zkqfvk0LHrThR|^IU8(r5M38;4_-RgUO-u_NEXU*4j@T&~Bz~(v0pli^^aUL@f^dl)^8mvC^*l8RgeLkEsd(~u8t z(o-Ckw3Q2*}6zP4KcMX$DPNJ2$9n(bd3SgoQ@`Scf$Mnh>EK? z)@*%7@Zg6LhH7p-+N4aXYof(O;WkYF$#gke( z)L6Vs;MJZlqGAtN+nyV68mrp#&ZHY$YR_jgQU4PR@#GrP%{I%Ek0id(Z^4=fgO0EB4hjBn~(OepQ{V?>vlv+ z>)WbXHXkB7qQ-k{Iiz*uhThrpQ>2n0na4Y4x}(Cnq4Y3uufyR>mt6Fb;*l3(GrVUV zj-FL92m=LSGCs4zp{676NyX*xv?K4;&VJM-t+7ctsGDrPeRy{TN4@6D7hoG2eE9(E zS4bz^i*}gZiI1hC+4e&x?oNYo@bmKxM4d7(dZ1drC^0Pd={K5)E%$g41ZHHMqAB6=VZid)STT#=(N z2pU1i!1!13cMFC$aRelM&%ocE@ac)+mN)8bmqS(nk4Fuz(f}Sx$Hu_X0Ny|7-f!3- zxlEAF1TP{MG*`qG=+NU&p;;gUVlWA})(wd0#{G~}Jg6Jr-(IDVTl&=w<7#yECf)*- zntPKEAVkeW$u=0K=7D&k%T@Ea(r5)4#Ua0#oJJm~nopuO1EgtqfO@3z(Qp~rq%&l7 zTpprHb)Z@{bA)lb!n>0i*r>s3_QRJNo=#U7z)R+DkY!LT^A2He{ElU{{!Pc#eXCIS z5Fy4zybNo9cC`gzo9WqAB*MSBoMjkqJq#yhJ`5+>Kah9DH5?zvqeUFVIpHuXkoQ5Z z^PWJS>;X7Vu4?pkiq9{~p*4`tBpS#L;xl8{lA2YCnfY zI7}-9tx?PpH2!FGw$<$4szpF7LSry?+y*`&IGQr_3*p_U{Sr(J;T?NFyoq1cBJ=%r zL%c`VD_PsFXeBK=+aq_MCrGGaf-zngbMv1VFEsRc1C{i6aQJA2+xa(&cg0n4*{|*H zmLhD{CsE<}M$Ls5bn~ml`)aKrJV+8x@)y~6$q*IFBRgNbfmQTLauNmdlk#&&htNPz zoZqvM7s`X&uHX>*Va1QiVMizrWY(Ei;YcXgjKw%sfi{>iAnA-|AZjflwK&&UoD3Az zz_L1+t2ef2)}et+(bkHWW*lv?M{&>3`7JKW{DB;lwaG z>oN?`@?fU{STQ2;Sz3fjR#>Oy>VRn&m4{&!hOHPr#&8hB6$~T%;G~v^F8xtiO4TDA zI?2aN>iZ_z7`$-{W3=u!C6cZ5ud7UsD|vJtTIr^H9A3l6*`K1M#F>#&KpjbPv8{wZ zmYDdW#G$ql0a(I64qfJ9i822waa<`Od1!}r^pV9BsrCdPWF#Y$EOHGY<*-u6)$Nm& z_jF_1XGCQu==h{jrX9TAqeY%2_|SG@3J#42BFKdH$mK3cQpQ8DCSOJ+LNs`RhsN!W zWb}Az`ey*`>y-g)uMD8c+FBwj*u^^FGAciEU$?EHXaU6dxY<4v*5Ny~Z-S4)_#hNl zJq+VfdZeikCMmuXT=loe6?%dlco@gDUZEZOYw{blRB@1)BnyT}(jc?gjZ}oxa6TIs za7{Q*_8DbzhnSw0EBj^464mZRPRtShdFmzxJycEGh+KVSzo~Qnlgdj(RB@sLv zr}9Hg^R)J9#Wd$kQB#yWO#}bzTnj6OGiRs zp<+lxe+M}%$g2@Fw;bpVM=`LP!O)L*jfP%O-6YTTRXSl+eu3Z?+cs0ZVtHh!eGL2C zw#@Te2gVg>c^~sBZqgI+_alS^L%PGNSRUU_oXP6<;;klxg>W*K&!&N>p&!RP)2;8q z*f<`+wZljrtcv3^051T2Ng^=FS4x6dB;e`D!KoQW}QFMlhMlW5A|xir15Q}+f#RPNHG<)#i+hlrQeuz z%RkZ;N&oA;`2|&{=ij*Ogx!hpIt=L%(628yhL2Qg3A-YH zbO>{YMUmlc?=6PX$=L6@N0_K1n1U}?U{7EEHo~Re2}l_%htUa$sD3xX!UUe^_6LI4 zu{a4~l~9wwV^t=%UtDq`r6ZQ-YvMpSxb@@n!}Frs&`&KI26431Sm+UVSN-Kr^eru# z*jBvEK9=d+*Hogzo1sX(e%z0T1=yPqzlkFmvg;&`wv_}v#TFUsS~Tx%(Z9C^9`@rs zUdgS;xWADcDm49RaMwRH|(Ybic)Rle@df9 zlTzMIe+}~cbN`oGT67Ex>i=qy2cWG8&EpnCUYZ9jYht88Jorc*@bWdLPkRn5u|s&c z$Ie}0aYJ17iD<1gMm+9iwZZlNd~a7O4&p~JW6{g}eWa2i2J>Kl+@>WM zKE$vY!zUOVRSw5Gd~OW1%^J){lhFfC;UI-YA@LUa4VA}-OWja_r1g-qyJ-UyQ0*7z zQ!AtoOBLOnr-*WmLmnTO>epMwi{BQ(8sC~u)WKEq_}-Bo)M!NiuYh*4F}Ix zxDO6f=qr2%JsE4;_zGW22nX-c2>zbh5=ZkJgx*H}&KUkW!+bl&^BvxzS4&w@)6p*W z!rN#+wkQBuR8~lzz>oQxcuR7mkeTFR$Rv%389VSQxk{ek6p8ms?a=>Koa(oGLh-9y z;eoZA$W!U~p0*J2=ODqlrkih=T}d<)gYz{}J4Lj3r*(|9EP%K(kjxDCzQ!N=2i z0J9HjhPqer$XGX>zfHkl%Xy7=BGhbv)iZcBHI0UYGZ5<7;nEC#!^I%3}>>rUq`EN^Zz-|3+TC!&cwsHvYNAC)l8lhFls7#RdUiK24O&j_QcDg@>|IG z4)bU-!DAL469+=kES|64xBX0&BKj42_E8OM+@~yYCYUrQTxFg6s8}V@U}#yyX?o;q_#1*At{%?%aCsaS99@5YqhnX z%hA)J6?W$FY_s(WO>02A!V!VunkJw1EY6ImeRWgX4tIkemt?GPYZLNiD?UeI-anlKp!&I@WX!z_GJ7mn`i@n5CR37RUXI2)-&~`|UErq-D z5Mv|MahcDD3GTLttI^6Mx# zKA-!Wk+)ki8}AagF}^Uqn?gS06<+-_q(R8sJIdQ%4t+vx+jZ?Z%KP7v=-8FUHaM;# zCq`kkj_B8{!mCuh7w`yrXcSCafZP%j99qETIQ!>#wTtx#JRH-C~){o4t&n3X*w zHG60k>cK?}m%I~W6xpRAd$={?JpPcghnW^N+oAJ9-i=wq_d}nBJd}x1`(esL-p5PS z?*ChFS9tzs+q00r+PP!ul(~79+`Q?trmCZ&qSWqgN~&$j+jBg4(S-OBW#!U I@Kl%o2PS$000000 diff --git a/firmware/sha1sums b/firmware/sha1sums index a2bb9e1..cc2b8fe 100644 --- a/firmware/sha1sums +++ b/firmware/sha1sums @@ -1,2 +1,2 @@ -98ff2105dd36027e691991d4871d4ee0bb8bfdf8 0x00000.bin -bdedac73a8ac9b70a476213c10993d7b0f2de653 0x10000.bin +50ff56396a7bdcab8899a4412446d3016a0cdc2c 0x00000.bin +49774bfdcd7aefcde4fd64ac377e1588ad4b8219 0x10000.bin diff --git a/user/cli.c b/user/cli.c index 0f6a0d6..f603a34 100644 --- a/user/cli.c +++ b/user/cli.c @@ -7,6 +7,15 @@ #include "global.h" #include "sys_time.h" +#define os_sprintf_flash(str, fmt, ...) do { \ + static const char flash_str[] ICACHE_RODATA_ATTR STORE_ATTR = fmt; \ + int flen = (sizeof(flash_str) + 4) & ~3; \ + char *f = (char *)os_malloc(flen); \ + os_memcpy(f, flash_str, flen); \ + ets_vsprintf(str, f, ##__VA_ARGS__); \ + os_free(f); \ + } while(0) + static char INVALID_LOCKED[] = "Invalid command. Config locked\r\n"; static char INVALID_NUMARGS[] = "Invalid number of arguments\r\n"; static char INVALID_ARG[] = "Invalid argument\r\n"; @@ -133,42 +142,42 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { } if (strcmp(tokens[0], "help") == 0) { - os_sprintf(response, "show [config|stats|mqtt]\r\nsave\r\nreset [factory]\r\nlock []\r\nunlock \r\nquit\r\n"); + os_sprintf_flash(response, "show [config|stats|mqtt]\r\nsave\r\nreset [factory]\r\nlock []\r\nunlock \r\nquit\r\n"); to_console(response); #ifdef ALLOW_SCANNING - os_sprintf(response, "scan\r\n"); + os_sprintf_flash(response, "scan\r\n"); to_console(response); #endif - os_sprintf(response, "set [ssid|password|auto_connect|ap_ssid|ap_password|ap_on|ap_open] \r\n"); + os_sprintf_flash(response, "set [ssid|password|auto_connect|ap_ssid|ap_password|ap_on|ap_open] \r\n"); to_console(response); - os_sprintf(response, "set [network|dns|ip|netmask|gw] \r\n"); + os_sprintf_flash(response, "set [network|dns|ip|netmask|gw] \r\n"); to_console(response); - os_sprintf(response, "set [config_port|config_access|bitrate|system_output] \r\n"); + os_sprintf_flash(response, "set [config_port|config_access|bitrate|system_output] \r\n"); to_console(response); - os_sprintf(response, "set [broker_port|broker_user|broker_password|broker_access|broker_clients] \r\n"); + os_sprintf_flash(response, "set [broker_port|broker_user|broker_password|broker_access|broker_clients] \r\n"); to_console(response); - os_sprintf(response, "set [broker_subscriptions|broker_retained_messages|broker_autoretain] \r\n"); + os_sprintf_flash(response, "set [broker_subscriptions|broker_retained_messages|broker_autoretain] \r\n"); to_console(response); - os_sprintf(response, "delete_retained|save_retained\r\n"); + os_sprintf_flash(response, "delete_retained|save_retained\r\n"); to_console(response); - os_sprintf(response, "publish [local|remote] [retained]\r\n"); + os_sprintf_flash(response, "publish [local|remote] [retained]\r\n"); to_console(response); #ifdef SCRIPTED - os_sprintf(response, "script ||delete\r\nshow [script|vars]\r\n"); + os_sprintf_flash(response, "script ||delete\r\nshow [script|vars]\r\n"); to_console(response); #ifdef GPIO #ifdef GPIO_PWM - os_sprintf(response, "set pwm_period \r\n"); + os_sprintf_flash(response, "set pwm_period \r\n"); to_console(response); #endif #endif #endif #ifdef NTP - os_sprintf(response, "time\r\nset [ntp_server|ntp_interval|ntp_timezone] \r\n"); + os_sprintf_flash(response, "time\r\nset [ntp_server|ntp_interval|ntp_timezone] \r\n"); to_console(response); #endif #ifdef MQTT_CLIENT - os_sprintf(response, "set [mqtt_host|mqtt_port|mqtt_ssl|mqtt_user|mqtt_password|mqtt_id] \r\n"); + os_sprintf_flash(response, "set [mqtt_host|mqtt_port|mqtt_ssl|mqtt_user|mqtt_password|mqtt_id] \r\n"); to_console(response); #endif @@ -293,20 +302,20 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { if (connected) { os_sprintf(response, "External IP-address: " IPSTR "\r\n", IP2STR(&my_ip)); } else { - os_sprintf(response, "Not connected to AP\r\n"); + os_sprintf_flash(response, "Not connected to AP\r\n"); } to_console(response); if (config.ap_on) os_sprintf(response, "%d Station%s connected to AP\r\n", wifi_softap_get_station_num(), wifi_softap_get_station_num() == 1 ? "" : "s"); else - os_sprintf(response, "AP disabled\r\n"); + os_sprintf_flash(response, "AP disabled\r\n"); to_console(response); #ifdef NTP if (ntp_sync_done()) { os_sprintf(response, "NTP synced: %s \r\n", get_timestr()); } else { - os_sprintf(response, "NTP no sync\r\n"); + os_sprintf_flash(response, "NTP no sync\r\n"); } to_console(response); #endif @@ -331,7 +340,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { os_sprintf(response, "%sCurrent subsriptions:\r\n", ccnt ? "\r\n" : ""); to_console(response); iterate_topics(printf_topic, response); - os_sprintf(response, "Retained topics:\r\n"); + os_sprintf_flash(response, "Retained topics:\r\n"); to_console(response); iterate_retainedtopics(printf_retainedtopic, response); #ifdef MQTT_CLIENT @@ -379,7 +388,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { bool nl; if (script == 0) { - os_sprintf(response, "Out of memory"); + os_sprintf_flash(response, "Out of memory"); goto command_handled; } @@ -450,14 +459,14 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { if (nTokens == 1 || (nTokens == 2 && strcmp(tokens[1], "config") == 0)) { config_save(&config); - os_sprintf(response, "Config saved\r\n"); + os_sprintf_flash(response, "Config saved\r\n"); goto command_handled; } } #ifdef ALLOW_SCANNING if (strcmp(tokens[0], "scan") == 0) { wifi_station_scan(NULL, scan_done); - os_sprintf(response, "Scanning...\r\n"); + os_sprintf_flash(response, "Scanning...\r\n"); goto command_handled; } #endif @@ -494,7 +503,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { if (strcmp(tokens[0], "quit") == 0) { remote_console_disconnect = 1; - os_sprintf(response, "Quitting console\r\n"); + os_sprintf_flash(response, "Quitting console\r\n"); goto command_handled; } #ifdef SCRIPTED @@ -520,7 +529,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { free_script(); blob_zero(0, MAX_SCRIPT_SIZE); blob_zero(1, MAX_FLASH_SLOTS * FLASH_SLOT_LEN); - os_sprintf(response, "Script deleted\r\n"); + os_sprintf_flash(response, "Script deleted\r\n"); goto command_handled; } @@ -533,7 +542,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { port = atoi(tokens[1]); if (port == 0) { - os_sprintf(response, "Invalid port\r\n"); + os_sprintf_flash(response, "Invalid port\r\n"); goto command_handled; } // delete and disable existing script @@ -565,12 +574,12 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { #endif if (strcmp(tokens[0], "lock") == 0) { if (config.locked) { - os_sprintf(response, "Config already locked\r\n"); + os_sprintf_flash(response, "Config already locked\r\n"); goto command_handled; } if (nTokens == 1) { if (os_strlen(config.lock_password) == 0) { - os_sprintf(response, "No password defined\r\n"); + os_sprintf_flash(response, "No password defined\r\n"); goto command_handled; } } @@ -593,9 +602,9 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { } else if (os_strcmp(tokens[1], config.lock_password) == 0) { config.locked = 0; config_save(&config); - os_sprintf(response, "Config unlocked\r\n"); + os_sprintf_flash(response, "Config unlocked\r\n"); } else { - os_sprintf(response, "Unlock failed. Invalid password\r\n"); + os_sprintf_flash(response, "Unlock failed. Invalid password\r\n"); } goto command_handled; } @@ -633,7 +642,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { os_sprintf(response, "Invalid arg %s\r\n", tokens[1]); goto command_handled; } - os_sprintf(response, "Published topic\r\n"); + os_sprintf_flash(response, "Published topic\r\n"); goto command_handled; } @@ -651,7 +660,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { delete_retainedtopics(); - os_sprintf(response, "Deleted retained topics\r\n"); + os_sprintf_flash(response, "Deleted retained topics\r\n"); goto command_handled; } @@ -704,42 +713,42 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { if (strcmp(tokens[1], "ssid") == 0) { os_sprintf(config.ssid, "%s", tokens[2]); config.auto_connect = 1; - os_sprintf(response, "SSID set (auto_connect = 1)\r\n"); + os_sprintf_flash(response, "SSID set (auto_connect = 1)\r\n"); goto command_handled; } if (strcmp(tokens[1], "password") == 0) { os_sprintf(config.password, "%s", tokens[2]); - os_sprintf(response, "Password set\r\n"); + os_sprintf_flash(response, "Password set\r\n"); goto command_handled; } if (strcmp(tokens[1], "auto_connect") == 0) { config.auto_connect = atoi(tokens[2]); - os_sprintf(response, "Auto Connect set\r\n"); + os_sprintf_flash(response, "Auto Connect set\r\n"); goto command_handled; } if (strcmp(tokens[1], "ap_ssid") == 0) { os_sprintf(config.ap_ssid, "%s", tokens[2]); - os_sprintf(response, "AP SSID set\r\n"); + os_sprintf_flash(response, "AP SSID set\r\n"); goto command_handled; } if (strcmp(tokens[1], "ap_password") == 0) { if (os_strlen(tokens[2]) < 8) { - os_sprintf(response, "Password to short (min. 8)\r\n"); + os_sprintf_flash(response, "Password to short (min. 8)\r\n"); } else { os_sprintf(config.ap_password, "%s", tokens[2]); config.ap_open = 0; - os_sprintf(response, "AP Password set\r\n"); + os_sprintf_flash(response, "AP Password set\r\n"); } goto command_handled; } if (strcmp(tokens[1], "ap_open") == 0) { config.ap_open = atoi(tokens[2]); - os_sprintf(response, "Open Auth set\r\n"); + os_sprintf_flash(response, "Open Auth set\r\n"); goto command_handled; } @@ -750,9 +759,9 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { user_set_softap_wifi_config(); do_ip_config = true; config.ap_on = true; - os_sprintf(response, "AP on\r\n"); + os_sprintf_flash(response, "AP on\r\n"); } else { - os_sprintf(response, "AP already on\r\n"); + os_sprintf_flash(response, "AP already on\r\n"); } } else { @@ -764,9 +773,9 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { } #endif config.ap_on = false; - os_sprintf(response, "AP off\r\n"); + os_sprintf_flash(response, "AP off\r\n"); } else { - os_sprintf(response, "AP already off\r\n"); + os_sprintf_flash(response, "AP already off\r\n"); } } goto command_handled; @@ -805,7 +814,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { if (strcmp(tokens[1], "dns") == 0) { if (os_strcmp(tokens[2], "dhcp") == 0) { config.dns_addr.addr = 0; - os_sprintf(response, "DNS from DHCP\r\n"); + os_sprintf_flash(response, "DNS from DHCP\r\n"); } else { config.dns_addr.addr = ipaddr_addr(tokens[2]); os_sprintf(response, "DNS set to %d.%d.%d.%d\r\n", IP2STR(&config.dns_addr)); @@ -819,7 +828,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { if (strcmp(tokens[1], "ip") == 0) { if (os_strcmp(tokens[2], "dhcp") == 0) { config.my_addr.addr = 0; - os_sprintf(response, "IP from DHCP\r\n"); + os_sprintf_flash(response, "IP from DHCP\r\n"); } else { config.my_addr.addr = ipaddr_addr(tokens[2]); os_sprintf(response, "IP address set to %d.%d.%d.%d\r\n", IP2STR(&config.my_addr)); @@ -849,7 +858,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { if (strcmp(tokens[1], "config_port") == 0) { config.config_port = atoi(tokens[2]); if (config.config_port == 0) - os_sprintf(response, "WARNING: if you save this, remote console access will be disabled!\r\n"); + os_sprintf_flash(response, "WARNING: if you save this, remote console access will be disabled!\r\n"); else os_sprintf(response, "Config port set to %d\r\n", config.config_port); goto command_handled; @@ -858,7 +867,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { if (strcmp(tokens[1], "config_access") == 0) { config.config_access = atoi(tokens[2]) & (LOCAL_ACCESS | REMOTE_ACCESS); if (config.config_access == 0) - os_sprintf(response, "WARNING: if you save this, remote console access will be disabled!\r\n"); + os_sprintf_flash(response, "WARNING: if you save this, remote console access will be disabled!\r\n"); else os_sprintf(response, "Config access set\r\n"); goto command_handled; @@ -866,32 +875,32 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { #endif if (strcmp(tokens[1], "broker_subscriptions") == 0) { config.max_subscriptions = atoi(tokens[2]); - os_sprintf(response, "Broker subscriptions set\r\n"); + os_sprintf_flash(response, "Broker subscriptions set\r\n"); goto command_handled; } if (strcmp(tokens[1], "broker_retained_messages") == 0) { config.max_retained_messages = atoi(tokens[2]); - os_sprintf(response, "Broker retained messages set\r\n"); + os_sprintf_flash(response, "Broker retained messages set\r\n"); goto command_handled; } if (strcmp(tokens[1], "broker_clients") == 0) { config.max_clients = atoi(tokens[2]); - os_sprintf(response, "Broker max clients set\r\n"); + os_sprintf_flash(response, "Broker max clients set\r\n"); goto command_handled; } if (strcmp(tokens[1], "broker_port") == 0) { config.mqtt_broker_port = atoi(tokens[2]); - os_sprintf(response, "Broker port set\r\n"); + os_sprintf_flash(response, "Broker port set\r\n"); goto command_handled; } if (strcmp(tokens[1], "broker_user") == 0) { os_strncpy(config.mqtt_broker_user, tokens[2], 32); config.mqtt_broker_user[31] = '\0'; - os_sprintf(response, "Broker username set\r\n"); + os_sprintf_flash(response, "Broker username set\r\n"); goto command_handled; } @@ -902,19 +911,19 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { os_strncpy(config.mqtt_broker_password, tokens[2], 32); config.mqtt_broker_password[31] = '\0'; } - os_sprintf(response, "Broker password set\r\n"); + os_sprintf_flash(response, "Broker password set\r\n"); goto command_handled; } if (strcmp(tokens[1], "broker_access") == 0) { config.mqtt_broker_access = atoi(tokens[2]) & (LOCAL_ACCESS | REMOTE_ACCESS); - os_sprintf(response, "Broker access set\r\n"); + os_sprintf_flash(response, "Broker access set\r\n"); goto command_handled; } if (strcmp(tokens[1], "broker_autoretain") == 0) { config.auto_retained = atoi(tokens[2]) != 0; - os_sprintf(response, "Broker autoretain set\r\n"); + os_sprintf_flash(response, "Broker autoretain set\r\n"); goto command_handled; } #ifdef BACKLOG @@ -922,7 +931,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { int backlog_size = atoi(tokens[2]); if (backlog_size != 0) { if (backlog_buffer != NULL) { - os_sprintf(response, "Backlog already set\r\n"); + os_sprintf_flash(response, "Backlog already set\r\n"); goto command_handled; } backlog_buffer = ringbuf_new(backlog_size); @@ -935,7 +944,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { if (backlog_buffer != NULL) { ringbuf_free(&backlog_buffer); } - os_sprintf(response, "Backlog off\r\n"); + os_sprintf_flash(response, "Backlog off\r\n"); } goto command_handled; } @@ -943,14 +952,14 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { #ifdef SCRIPTED if (strcmp(tokens[1], "script_logging") == 0) { lang_logging = atoi(tokens[2]); - os_sprintf(response, "Script logging set\r\n"); + os_sprintf_flash(response, "Script logging set\r\n"); goto command_handled; } if (tokens[1][0] == '@') { uint32_t slot_no = atoi(&tokens[1][1]); if (slot_no == 0 || slot_no > MAX_FLASH_SLOTS) { - os_sprintf(response, "Invalid flash slot number"); + os_sprintf_flash(response, "Invalid flash slot number"); } else { slot_no--; uint8_t slots[MAX_FLASH_SLOTS*FLASH_SLOT_LEN]; @@ -965,7 +974,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { #ifdef GPIO_PWM if (strcmp(tokens[1], "pwm_period") == 0) { config.pwm_period = atoi(tokens[2]); - os_sprintf(response, "PWM period set\r\n"); + os_sprintf_flash(response, "PWM period set\r\n"); goto command_handled; } #endif @@ -997,13 +1006,13 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { if (strcmp(tokens[1], "mqtt_host") == 0) { os_strncpy(config.mqtt_host, tokens[2], 32); config.mqtt_host[31] = 0; - os_sprintf(response, "MQTT host set\r\n"); + os_sprintf_flash(response, "MQTT host set\r\n"); goto command_handled; } if (strcmp(tokens[1], "mqtt_port") == 0) { config.mqtt_port = atoi(tokens[2]); - os_sprintf(response, "MQTT port set\r\n"); + os_sprintf_flash(response, "MQTT port set\r\n"); goto command_handled; } @@ -1016,21 +1025,21 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { if (strcmp(tokens[1], "mqtt_user") == 0) { os_strncpy(config.mqtt_user, tokens[2], 32); config.mqtt_user[31] = 0; - os_sprintf(response, "MQTT user set\r\n"); + os_sprintf_flash(response, "MQTT user set\r\n"); goto command_handled; } if (strcmp(tokens[1], "mqtt_password") == 0) { os_strncpy(config.mqtt_password, tokens[2], 32); config.mqtt_password[31] = 0; - os_sprintf(response, "MQTT password set\r\n"); + os_sprintf_flash(response, "MQTT password set\r\n"); goto command_handled; } if (strcmp(tokens[1], "mqtt_id") == 0) { os_strncpy(config.mqtt_id, tokens[2], 32); config.mqtt_id[31] = 0; - os_sprintf(response, "MQTT id set\r\n"); + os_sprintf_flash(response, "MQTT id set\r\n"); goto command_handled; } #endif /* MQTT_CLIENT */ @@ -1039,7 +1048,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { } /* Control comes here only if the tokens[0] command is not handled */ - os_sprintf(response, "\r\nInvalid Command\r\n"); + os_sprintf_flash(response, "\r\nInvalid Command\r\n"); command_handled: to_console(response);