From bb0bb175fadd0d8dfb96aeb2587cc5c377855bee Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Fri, 25 Oct 2019 18:49:00 +0200 Subject: [PATCH] Version Bump to 3.1.0.BETA4 * Bugfixes * Made GUI fully offline compatible (included material icons, etc.) * After Timeout (#define WIFIMGR_PORTAL_TIMEOUT 180) in definitions.h Config Portal is closed and MCL is usable over own AP @192.168.4.1 * adressed issue: #48 * known problems: E1.31 is only working for one segment at the moment --- Arduino/McLighting/McLighting.ino | 22 +- Arduino/McLighting/data/favicon.ico.gz | Bin 0 -> 12171 bytes Arduino/McLighting/data/index.htm | 35 +- Arduino/McLighting/data/index.htm.gz | Bin 20708 -> 20783 bytes Arduino/McLighting/data/material.woff2 | Bin 0 -> 60832 bytes Arduino/McLighting/definitions.h | 2 +- Arduino/McLighting/htm_edit_gz.h | 1 - Arduino/McLighting/htm_index_gz.h | 3456 ++++----- Arduino/McLighting/html_material_icons.h | 6472 +++++++++++++++++ .../mode_custom_ws2812fx_animations.h | 28 +- Arduino/McLighting/rest_api.h | 29 + Arduino/McLighting/version.h | 2 +- Arduino/McLighting/version_info.ino | 10 +- clients/web/favicon.ico.gz | Bin 0 -> 12171 bytes clients/web/index.htm | 35 +- clients/web/index.htm.gz | Bin 20708 -> 20783 bytes clients/web/material.woff2 | Bin 0 -> 60832 bytes 17 files changed, 8333 insertions(+), 1759 deletions(-) create mode 100644 Arduino/McLighting/data/favicon.ico.gz create mode 100644 Arduino/McLighting/data/material.woff2 create mode 100644 Arduino/McLighting/html_material_icons.h create mode 100644 clients/web/favicon.ico.gz create mode 100644 clients/web/material.woff2 diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index 453d336..bfeb2c0 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -16,7 +16,6 @@ #include //https://github.com/tzapu/WiFiManager #include -#include #include #include //https://github.com/Links2004/arduinoWebSockets #include @@ -35,6 +34,7 @@ // *************************************************************************** // Load libraries for PubSubClient // *************************************************************************** + #include #include WiFiClient espClient; PubSubClient * mqtt_client; @@ -77,7 +77,8 @@ #if defined(USE_HTML_MIN_GZ) #include "htm_index_gz.h" -#include "htm_edit_gz.h" +#include "htm_edit_gz.h" +#include "html_material_icons.h" #endif @@ -433,8 +434,8 @@ void setup() { if (!wifiManager.autoConnect(HOSTNAME)) { DBG_OUTPUT_PORT.println("failed to connect and hit timeout"); //reset and try again, or maybe put it to deep sleep - ESP.reset(); //Will be removed when upgrading to standalone offline McLightingUI version - delay(1000); //Will be removed when upgrading to standalone offline McLightingUI version + //ESP.reset(); //Will be removed when upgrading to standalone offline McLightingUI version + //delay(1000); //Will be removed when upgrading to standalone offline McLightingUI version } //save the custom parameters to FS/EEPROM @@ -717,7 +718,12 @@ void loop() { if(!strip->isRunning()) strip->start(); strip->service(); for (uint8_t i = 0; i < Config.segments; i++) { - if (segState.mode[i] == FX_MODE_CUSTOM_0) { handleAutoPlay(i); }; + if (segState.mode[i] == FX_MODE_CUSTOM_0) { handleAutoPlay(i); } + if (segState.mode[i] == FX_MODE_CUSTOM_3) { + if (strip->getSpeed(i) > SPEED_MIN) { + strip->setSpeed(i, SPEED_MIN); + } + } } } @@ -786,7 +792,7 @@ void loop() { } } // Async speed transition - if ((segState.mode[prevsegment] != FX_MODE_CUSTOM_0) && (fx_speed != segState.speed[prevsegment])) { + if ((segState.mode[prevsegment] != FX_MODE_CUSTOM_0) && (segState.mode[prevsegment] != FX_MODE_CUSTOM_3) && (fx_speed != segState.speed[prevsegment])) { if (Config.transEffect) { //if (true == false) { // disabled for the moment if (speedFadeDelay <= millis()) { @@ -833,7 +839,9 @@ void loop() { // Segment change only if color and speed transitions are finished, because they are segment specific if (prevsegment != State.segment) { DBG_OUTPUT_PORT.println("Segment not equal"); - if ((segState.mode[State.segment] == FX_MODE_CUSTOM_0) || (segState.mode[State.segment] == FX_MODE_CUSTOM_2) || (segState.mode[prevsegment] == FX_MODE_CUSTOM_0)) { + //if ((segState.mode[State.segment] == FX_MODE_CUSTOM_0) || (segState.mode[State.segment] == FX_MODE_CUSTOM_2) || (segState.mode[prevsegment] == FX_MODE_CUSTOM_0)) { + if ((segState.mode[State.segment] == FX_MODE_CUSTOM_0) || (segState.mode[prevsegment] == FX_MODE_CUSTOM_0)) { + } fx_speed = segState.speed[State.segment]; DBG_OUTPUT_PORT.printf("Switched segment from: %i to %i", prevsegment, State.segment); prevsegment = State.segment; diff --git a/Arduino/McLighting/data/favicon.ico.gz b/Arduino/McLighting/data/favicon.ico.gz new file mode 100644 index 0000000000000000000000000000000000000000..9e0ba66b97836e527dd9bb05fd28bce58665573d GIT binary patch literal 12171 zcmV;6FLcl!iwFoM+51`q0A^u!X=870E@@+L0PURxT-C`I$1iCs)|$`GwbymkT|3v- z)wR1@QFradPV553qC-?b1tnDs1OyZnm9S8;5j*aAznTBJK?%mb_`Emo^L_K*>%H@z zGjpcT8B{6*m5IvCOvL3>V~tg+-YS){=@<9qG$t5kLC@_$!W zsh*Tksamv9{<~T$m1=7nm8u%jz*q5!@_A-~G6?sRACS|7W3>3bJ2*zp527jQ`7_EY z+)uejL+=eG<5v|)MXkUXUoP+I`OGWWDGmsZ7UyR>hvm*+^ ze|Q5I6?v`dMwXVAbmYhpZT`KyyyWkv_wbO8(RzF^Pemys z^V5;NJ7~?CHL1#QiTP?;U*I{-z}JR>-;7_^g|- z7Oy9}CD!EC-IcBsNFg8m^LDTp>==AkD__ckM0z&xJNa8G2@LY0fEs~`z!qGh*Q$4P z8UG~G*j@Z7J-(NcN(Y}rhtsnkkcO!tzF&qbX)3S*XGpDjLXTBy3c+vhMm))|4WuL{ z(!Kt}>6K9({H7b20jz;Py)urWI|J{~^SgL&7U5YU>c!5Nk`{P?07|mIOv!hjX82vz zSB7e!IH;RNKciNw<@-dO+4H-1?O@PYQn zc~RH+(Uk8_8&ZAjLn`%TuoQj54$6Pqp1Q{ekw;t%ef;<_({wTlVTtFcL0mngl^-p) zBKQUL1e3rrum|{n2z)1zevG|J;fZ(klgLyK=j+?4+H+GXgf?v;`ZIM&@FUXdhIj(v z6^QK-2Z9(pKSTehrW{w3Y4?R#kw&KFa}a5_ePcjBBJFY@H&CeyfEu797!OtfS8x{G zL0P>g)dMxDF008f@HOoYjm@xpF5NjpBcGd4AMQ)*ffB$-_Q~ZyYaSQY01t2x>7!qK zhP1De(#Luc<=B->Vb`@~rLD`=@pWi6@+(T9KjOBa7M{&Mq6W^_r7?$Q(GZJ?G}K}m zO+M;KW7zA2BH=srSGbtb- zfHrN~L{q0umF(KJiw++?Oj|EpC1Zb#FZ+C;QcPdT@CDjn5+Y5Q` zgt!e+{#LhT8%(%yk!~Tq1aKW(0_TCF&ls|?u@UKu^wPE)`Pt5$J8ARg%`{sK+ z?FOJOs0pflpsUwzQhdBGy+wMj!7K0rJO>sF2hy}@)3oWQ3EK20PDGuLu#n@L>N`*b z6b1!}0*_y(_*h>|6jY>s2$ED7G!SFlTQoma`f1xts`Q5sv5@0lZuH|h5$6D=cn%D_ zP6_cBNPP((Tma$VtV)iHM{P%I%14%YQc@B_MkavB*-W0SIQc{?^jaWB3&!Icnx9;FbTbj;~HAHa3QT-yEa1|9W-bV*_eCN zBGpGS$4^Hf-M)ysfj_&(Y3nNPtP80v@!>)+1B?XSRrIoF++`;v19 zuRs0ifGU~x;OpY&^TAXwN|gQnSZ!UsfB&8m7Sts5MC5xg=nNVu1*tYMqR6rh=FggT0X!YYywNc;(D>7&q>wC-H8gOl)lD99hJ1zqN4I5 zR^)^ul=l;DqOmCdm{Nawo&F<(l&rdfUi=s0zMZ7#NuF zq^%L?1O5ctz!7i>?|DWkNHY#!4FQJ?-q5M-*VB$KskpXh3#F7YM!DbzDl?=}6|}_j zK*Y1a7T^KGKq7sB3=i>+^Cr(J9BF4VMy4*S)2ArDRz3W_B&ZA8BmJR>=OEsMcpu_Z zAQsQhDW*;w-8y?G-T3~AAnQEN#e?F09Y=R_cR@O$W1I^%;@O!Jb046%j;APgUyS^2 zhC!F_Pst_QV8VqMiuVf#5tMN8I{Mu=;@`4F^*4uVyw+>+1?#=+1R=w#SFZ$F*2%XB zFJHc-0~e3bxacMH)1|RgIC>zN#EbyucwS5mFYTlW(MQPhVyLW_ZxtRsen_*U=27A6 z)s*=VH340CEjbk|2Ag>l_rZ70P|<6CG%qrQo;-a@Um8T2Iz;WIQa6eqT@xVU%Ag_W z00!y3e=BeWe&9Ta2T$m`xL9(Gy7<}kBXoF1$S^AZRz-!8lCfNa=L2QI4?L6W52k=6 zz#8la$3Zl>i*k4^=bx(EZ)mJvh#XV06U4ixhIXOGykh?c$P1J*D8`?*1bx6{uoTz; zPjD8*f~TZT= zj|7R3{Vl1I@!p%@0(WUXY8vZ$_LFsSC~_x_eWz$vPcG%3xYi2-16dQL0MGkrB3J<& zc;0^%?@m_AJrVDW=J~TXa051P$RX%rCVKvW=H4hov$#};vxIH=ZRJ32VED+4N;v#L z(|lJ@pTEY^@D(#@yvKGb?1=Dwn;_1ng^zC9_)E~5- zrTGg?1EYXu-B1^G(j}rfUA}dhx_9qR(b3UzuC!{^Dmr!Ql>F@KojcU}H1z+n zWzR#SC0GnF)XcMuOuf!dNg=EFg0dE^z&h5d*l9-=no{{&aL6dVqJ`S6VOK z0tw)ns1NV46c!dn=H}+&{h|)!+&OIs4h|N&DBnM7)F}CzDSx3P>*9SiKs8VqR0QRr z12v+>yXClcJ=T!kW8L>oElIWRS+cC3T#t3^*fHDhhhECx3?8;vS@#qI1%VkTpkPw) ziqJv%{};0bsP9)X7-3BB8*FMt1#!AtbkMR+GL21epD<16CbvJ9eqbCaB` zUI#HiZ{6hWFy^z%f8@xK@;9?59nr0uKnd_2C<4kCj@I_Y(T6cl55|MzB&!0b^VlUsK!G@2t z>#p{oC1?T~0*i6F_g_5iq`cD(>;zkYW?eQNquL*hWgBbPt{ojcdQ`kWQyd)~Y4+^d zw6=MKZe0cjfL@@B$ctE8?Z2RX|MTb1DPawiaufb>HCO~@feB!cvTh5R)}QX6e_yt2 zS!VsO=$qxbbZTWwh@zIsEdjH^WH1^G27L-&le(uLq8!bYjo>-DOv}RSpj4o`BFdpf zW4aL;mFf6%Gx{bSZyEtrQY-5^QH3nh0`Mp2!)8`Q`tdjE9^IO1rpP=D{4NSgzB|>r z@2Np)axK<~d?zlag+0g8>Or%}bEFNqm)b&43~r@b_xZ3Y*?{$68JJllfgU}4Oc{lU z{Z{mTpx8_Y?ZmrTVT;Sg%NMb4H6Zy&c zSI9gJP;L0#-*dywBi@|@lmhj@ugYMitQ&!Qs&(UQm0BKQM1xbDhkf|WcIcTb=fa{- z3?GH`YvM;`_;AC}kUP*yyyor-wChUX0s?u`lSChJHt-BTy8)s=Fy8Il^_-mBW+#X| zgpBJ??~8E9smcXPf|{T?_zjHV!F>ZCLLCF=dD59eZ}Cp09^TU7p=YxFZvDE5*ltC) z%nGyY<-rd;nDz$azWZ@G zy6*=j@cY++y*$|q#(SeFw%}Qc_#=!SJ$OXlDu_Pnf|Dmj4_iXfwZ_xM+`}l=a59)j z7xS#7i?#RC#SuPq!8H`~$*j+0zBYWT^|$KZ9IEkI(a>z{Q>57k`mA%HfA{mZ3P?-t z6`wqNiuMNXqt*UH+)|LI@>o>wE@2JDpm5cM$-OomTRP%S@a+Tnjp z>`i4`XTDT_M0wjEx1(|=%3(d82YD&VEBG3`qtFU;1q1l(Z8{M7x8xPD1E0nD^Pb8D zWl!mSB2@}HO0K~tKRZwAY}Aq9_MKbw+u;tB|Ahe=$#X~(U7+x&!Eg=TV&hh02OwZ3A5J>@9Q$L@Ik)>U$ssd?3{;HTJgDRQkvn z3XZ(+)%qj;ecwq3oL%RjT6}U{5|}BwZoKA=aX=VhO$8~ompTHP_FrYQ3tK@CtI6a#tGnmWh} zO0W(!0Bt}|FdR$+i@*l37aRluARJudvVQ?vfsdG4A^%Ar0bBy%IQu(zgASZH^F{h| zBHR!5205{#tejmpMO+_L$8%ZMqZ~ligt{;&kLS9GTPS@H4MS|M;Tv7ef9@48CC;TJwje{S4NpdsPKXfWQ;n|qYDLc4jF zxGL{f<_Cskfd9|SpQPPKH|KrqExeEJ&AJlJ;@m$ok|3aWrcpd*iAQ^6AM`(1$_ zI1duQQ|Jxa>~pav3$B6lAQ<=pFW?I7fQ_2Etv-}3{W%!8o94VSpqXmr6kr?}j^}=e zyRj~bk*cLyD z?_Vo=b01s>5v1h(m|9u(IV0W+ti@6cwjj%s$<60v+I*+mZ=DnT4_eN>##}Iice6+G z$wGHUmr|bt;5_1czgjeM(P--2xwA~GMT-{XGkNIS(C0GV5fT)Wp zU^EyAday1v1l8h9XwA`;@(jY=-CgXbiL}z@Uw$@x_;A{~b*nsUUVqe=avr~ma|G5I zAK=dVvK?#!tHBar0cL~g?`gY>e@6Nv(_9r;iT0|MQ*Q`1Ea`TIs!a11mhw52z;2BGTpm_U+qpAAiS=9T_3__pe`9YzhJc1F1-nBCrRF zm%3YLI_4GAkiYS2WeaAoCeL{8j<_@Efai80!Qm1zwb zKL>e!t88KPVzbVUY#!Pgv;a-P&)6gXF;cAKv}J$%#8HZUZ$Pmq+iM_(?XE6>2oMI& zfD^zvGzazR(?{5miM~ct{_>2bK!E~T>Q2?FRYjj9o@M@9wQ42OlCtG#gA!}6Mt(ta z@C#_fc3kz@ma7iNf?6->)aejy`TGTKr6grUr@P4G9mKZ~-%wT;Qmz=DF}egb*T}7} zKXM=1%*-sybyM2>`}yhmla8Z;L|&EctU7FW_C21fA+Dn4a~i}IuxIEPp#5Dy-~xJq zyrqEWAQ?OZPr+mG2x!ichK(yq_3PJ{)T&iWqd(gGXAv~{*XWNpQ_!YYyy7tAjTGDM zvfv+V4pfS_35$bb3YP2rwdE4vKNa&HRXRTCP|l%%o&6}WuPqRLd)o5$@d`#XnbuQ~kl* zLYrRM;v=-@V1+SHTr<8C(QW;5-NgXV9PS zZ6bb?W&6#p{&4%14E{BUs-tYHfQq0TC<97?lAt*F4ip7;d;N85tsrmu5Mh9W4&+f7 z-8`AhE8 zIEPcqbGZ75>wubg7BW=@mGE2vae2d66s)&4zIpQ|#kw0SXOuy}U*wm4Exf>fmG&I( z!w$?JCjL%)_wE&T2{Qj2q#Z-~^5v;)*|Hf@u3R}`Z>f2&%>S%evt(Lh2F{_Ls&~pc z9%v1ku@A>jLLTrMA8e&Qu2c@E)fUQG zw|W{7Wj-8nKhRB7BHI*yk9sI&MBWzjMSIBh`cceP4=wQ_U*mW>#rDkmknCQ>+rU~; z7l3RsCR!@=kY-%4fOmz>d{dG&xa}i&>{;3VkXYl=gf-U7z6Z zVnuHz8^|(Ok6?Z21v-INT<*0%c~BUb097t&yZiy?u;Hc+De#xkG_^z%+BJASxr|#& zqs@M$z-BusG=~$ulYs9k=dcezEQkOnxgPcd2Vlecv<8T}m}ihe9`-?5?*9nea;Jpd+3&c^4gUMa0E`7|2yd$WK8aCXPQKZUcJbc|79zU_GAg5qpCWJYPrr z2)w5hF(T+X)7T?) zsMtBWb?bJv_763L9P^@EtxZVXg3G-Qs0>Pjg1}VhjR`0O%7NOT8R!BAfl1&munz12 z2SE^s078cz%d_-XtVanT8k_^ixgHLJEji-ov|rd~?>~z;(7}f8H-zoKa5kxm{FVV? za+pix-2mhjWskTD_z};o5cdE>@jL~w1z3ycU5MR*AD%-IUj_GM9eh9@lL4l_vMpQy zAz~VX*va%Z9dkJORp%Fhb~bdYnki8^BwCCovPK%akwWZ)S%Y<_E$9h`v-6Y%5c%H; z+<1fV4C~M>@I=+>*mHs&c}jEbyWnAB#hH?qy<1I0ll z_L*o3I*7IlMuKTz0ayce02gosoCJ{|4kUpW^bvk7FIbOm2)!v5N+EvPJ6rvP{-lyG z0d4w7tETiu+RWs{dm)cppjMZRfj4W!WVe;g_0E5_u=MS)e4WzArJ#UWtg3}<1QVcJWf29L-Y`u@PgZa{s9sSARS=L9ek1zR; znTPp9ce-xei9Q$%L79#h`A57Etj6;;#CG)Fz>Q*zcT+%R8}ggrj(#y%%>AzHLapY!}B`tzR@RR0hE)=-Uo z$rfb8PV4{SUl({^MfA&JZ(sNmi}O|S`F~v-&rT3BdLHqDU&uP@?KYk2yA7cdE`kVg1E`?KD10`a8o17-er{`Mi5vX#eY~ZA^?zd!dx|TZ*H9zpu9P#VJ{i3b zcP4aXFR_7OB%gNv!QNBL*o$c!pT;?pQL+o=^0%a>&TDCnv#s=3F6yBGG#Yso&4zkvZP|3p3cm$UpLx z;>b8Lk{a9XB;Vu5|Lx@<&V0M=?o2su8w-me_BbrWHbWIa4faNC3fi)zOJDX@oWSy1 zuovM5zE#5>xU)@BAfNa~f~#zomLyN{jB($~@4I%%J@$Wf5aqsOzcrN$EJy{Ao1DNv zYj>9)6l34pYJ7vr&!7$H!XA>t(#XFOYy>uJPjwI+6}r!--WSa#J zmk-%_dHu_DL5y3YtOrtsBqLeNML<6GIo9bwVNhDH4K!jK)=q4BHWZ9cBmXA03~|zH z`=|Ki{|dMP?(-=w&f`Dgyzv$0nNP885P6$MZ`mPj>;KLm=J=g=Hl*4()33r7x+OqC zkSmoA6kspp^4ta*a39cty>y4L1=tKd`L}T2@4{_AfOS6#TnD$g?q8zrKN5}=6rbe> zijAGYl{eJV()w>3GsXDR(W!>ir-uv%tC~f09u>{SzMb~40`wDvPAO}!dLRvfahM;vC zJN6lRcI?(^?bx~Bi|4w3E^J~Iy?+MogB#$gzU&}C@!fA}VfEGhf#_4st^3j-wD&$d zd+DrK1`T2!d#qbj$W7MwyqFj~)!e+`d)PTcl`SodSVEw1}F@C{(S zf56+E*T99evI9@_2QF`D^vWGyH7?k=ZlDnljpS@?Fz33bUKupw*-dTk3;x0FAXh3K zD8{X%F82W)c?=xI@-GDIxbJu6wja!6ejL|*iqhx3;x>N=Tn86Hn4aw3?Aqw2*oqo$ zyiI%edD54JD_5@2uoL-cDvwm7c+~2jwhWZsJrg^86K)k{vtft78@TJ+;d9+TQS9*F zqVAvS?C@35db0bo><57>Z~(jI_AC|o)9172NJ3|(?P@D+OJ{N}CvuA&&aJl>=%QB! zKeB}7xyJKK4KU!R5=t9Lszl>49spVbb$eB5c?JtJx1{uh|d zJ=GK*wMK9c{=2RWbbbI_+l4iK;Rh4=OcbL+y-QQCzQ4;p$<@_W?2l>BJiq(yJ8?g# z^!c1LbqeL_*pl)cvc)*}i2VSF{Q$sa5YDpufy3-h>%?xAJJ`i{18)(pfDiv4v9RSk zPT2`!?{>OlEqRy4DpFRai-1NK%)tb14};SB5%8E$g;xM(Atq#QXHE|uJP_yi@|+kU zQ~43ZJp{sDQ`+s!vA3fffhRH6sg?fjicWT&AAz2}TXUVSWqaQxV1eRx+jxR)wshd& zAs5`CVI*fG8~IL;m0&6N)N@!DCUFlw1oY7>gI_?M4;bz3s#8Ri)^Gf?<=2GEm#(|f;tJd-?Lq9ZY*6fSq*W4x5Wz{y+d5YpT?ZJ1{ z?A5FDHDEbdq$l?bzDs42a&*#Ziv1_$kBW+-jnO7@2JXnSvEAv*LGgoNU6`)#2Z4GY zWYt32YURzFS08E5o+C#N`J5|PE;2SY*8H1%&Y3f(c$Tq=iHUqJRH%@!XVJFHE=#O1 zw!Ka72eASyP9yhJK58EeMk+_AIl7*fcG;PQT`u$KFyCvlpJ(FEydvMjGn8#y4wl>| zELaz&2>I=+2zx1MbJVqKS8*reS0U`EiWe^~&R?{8P;eC@zMc0up`ku0}3XR7%#`_BbR{DVa618 zUfMqi`Q^PAUmJw|T*ZnNsb0N$(zjKFOP4QGj;ZJqm&v|O=g%;ij|WGAVPG(uTl8VO z^&X1t`Y!{WGJ2KNi#_K|DVSGYfoxxYjLX7HxnoG{$6+hVf%ReiNA!`l6Gbwa$uIOm z*bE6f%q$V(1qWeEDD2;b{l2#Up0my#dj38`KMvJ^G%|Muo!R`PJxnBi_LJqBHn<;f zpzwEwa@Kv0XJDtmNuG`Sb6I$ES?m`&!EIxvvz4xjWz6)KSRGrW36|3*}BFqbA98=&*M>`R!b%(G{L` zUgTYe2;O-N)hmw^yffj;W#I{04ag_%+tDEUw^Z`CY12mZ|DtY%4rGb2yRBTgviA25 z4h}+o;p3xyhgr3*ip)KQUUMD)nnvEHpb6h2)etlQFo#)c>6%XdJ+AF3LF3oJv(Kv_ zCRLfF_d_}S4C{j71H>J)8ic;4lK-clexmW?$5VC#?x+!CVp{pdol4qwj2MX-SnEWX z2e7=&S=OKRWUbFvfYb%GK`rG%Z2oC(jS)of~OnO(SOwP@T=ss`6c4m6ZFu8nks0GNm$bPzeRrB)tl-)W$SNZKNwI&cVC&#*MupP z+UKNXbr&IXD*w(y-lk%QLGqe;#k>SsKNZv8|O|8o5oVcaCl zO!7gdyn5uxfZVAu%6(ACoN9kF=%@j~*bK^$hUaNWW}YdyIrjbc$v@6rn3_rq(xCbT zhK3sXb$gsXZl=l|dJmW+=Dv!3fYSH@-BSF3#tkwNb9R0HR{ht1PrjUkGW7$>rJ&sB z$CxsO%?=8gQ}utY);TmX>HM1#^n9FR!8JCdyux?>UBs^Kg2Ml{{;y`~&C*o8G@Bk5 zXH(Lm>?>7R&tJ+66ky7iOx6D>e!f-}bn?aM$rueTut9qSU_T@}qZqjRt}_(#v46S# zi@l=ixx5rVB*hGv{g4!s+OpsudSz2WuY8*Qs2Trs!F78ZMb1c;GaQ7ntY^V#Rfc{{ zDQ*}8hV=X7{O9MNf2P5M2UB)~xDT;p$&#O({|p;C5N} z8QR+=-8<5VZDKnb?YTr@0Ku_wd=hM}K?}}{9aw8`cEoCb~W5^!l&d!Qkdb78Vxt*I$2S$?n~|h2KzS z`Y+dqopbw8Kfa@~8|cJk(FU|+AGcr9l*bQ3M~qU))8kNvwhZU3Org_U$DZtLu#aVS z1h#xJqBYnI)+x>`>c!X>SU5tHl-R!#{yuWg=39ic@-Lsd7cM*>GW5ghnx-sTf##s8 z=I=J;3=lSF8Sa0$EXG86e;S$X+1bK|FUQ;j)~0dd`4elSfrfPU)Jc()_}fupzf1Vm zOS_=24f^s&oR6e&CTFE9({w$5wBcY7=*w4e_F%WBj$9UPxh#JB$syDCxLD6poJ;Jb ze(QYhwt|g%axVdY@tvpUV4RWxm+oaXdl%x~Suqa~YgzI4U%m?5Un}I7XS&m>+be!x zz=E?dO|KkA@SUmsL2uTH?%J|Y)4Ju3naUp)7D`uFo9OC#3(LJmBe#5Mrha5?|}s z-2Zl*(@1IC8}#H}$```U6}ry%&5q}n4CGFzlcHen8e+e=)6YT=zS;h_*gIR+#tPl= zYuP*KX;xsS8K-{PN6b;;0GKCwEu!&*4cQr5~NL9E(>e zQ}J`!GDv;(_73i@)@IOTCmP?RBVN9g-5|!SJ>#&MHkteOQLOL%HJ4(ik)8eUQV&8-_y`huP; zdpkYZ>&Z!FHvRb8@h0_fV4lX0Zy%-i<9jOoS>GVJw0?YNKp>Za2j5w3&)1<_=?zp-IoN1P0Q(7KSO08?ZJI~ThLrj_UfQKFR;us_dgqfe7qr5i8m&j@F7GWK9HNn z2RLi^0M`|GgJ2K|;=lu;1JVyLh1?K?|ETW3KY`ly#e2UU6?l=tMdkJ3qF|W$A@#%_2l2K7%;FOp>oK772IJR zcqja_<)1vb$9=&i5Ux^|Y5`mZo?Hfwq6`e)lSTh+pRM;9ox$04tEEh)n`!{SEKhPAV1fA1>THq%=d72R}QGy4^bz-HD7M$3H(6_hz2(l9Z-BhWncIR+ySxN zABKTbY06-qxF4Xw_OJ5&OM5oBzg;Dr>@|3tE5m=Fp@2s3McwDttNSW^|9cZ|`@f~} zV_f)2KSpssykhY5Oz4303xCe-;3l{RE`U(|GQf8h)pU@yy5BNf#oaLbn^#gc7pm|^ zLUA7Ja%p_tP5BRY6yy8XYq0J&=eFOA4=KlIAio`O2R`5=I1ggDAABhL0X1|0<`vp@ zkN{%1KRl;W?yX;5%R$aJ{*EB@z_vwg`dFUlIE7j7jWvB<9B!i`~6mYK-ZfO zEGL3LS^m{*$Y9H3z!B~PLU|mB2ls^zfVXlye8KG?5yYvKxluUU`|^f6t^xxp2Phsf*2PZSFNP81#`3B8|&45DIW7`vhFtn?fEdiKaYKr z)5yPt4Y*vm5A*}4Km@qL{a_ME*6P4ZmGb9rJn{vR(u~r9e8YPldI~!@I`tJ-v z7d-79$f-(QN;WLbV_pr`{a^T!#7^Az4dStXY8v@BgPlAE9^gLkI5@{`;2QUX59pE6 zO|q-GmyWm}`M1>hr`C-g_KxJx=vTU8qUraWa@+61ecuos`^~{@mVXr+u-UL7qdWJ3 zfjk$EkasFXn!?Yg`3~}O_4;P}ihoByoyfoC - - - + +