From 3afdd25cefc78ba02691b282a246768d45b55d9b Mon Sep 17 00:00:00 2001 From: Nik Silver Date: Wed, 17 Aug 2022 15:49:40 +0100 Subject: [PATCH] Add orientation button to TouchOSC grid. --- README.md | 7 +++++ design.md | 29 +++++++++++++++++ lib/togagrid.lua | 80 ++++++++++++++++++++++++++++++++++++++++++++--- toga.tosc | Bin 28915 -> 29757 bytes 4 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 design.md diff --git a/README.md b/README.md index 6c238b9..137d4fa 100644 --- a/README.md +++ b/README.md @@ -33,5 +33,12 @@ https://www.instagram.com/p/CS4JRtonRD7/ 4. Open **code/toga/lib/togaarc.lua** file and repeat the step 2 and 3. 5. Reload the script on norns. Now **toga** will automatically connect to the TouchOSC controller when the script is loaded. +## Orientation + +The orientation button says which round the grid should be oriented. +Any change here only updates after clicking the connection button, +so if you set or change the orientation on the grid, touch the connection +button to register that. + ## Forum https://llllllll.co/t/toga-touchosc-grid-and-arc-controller-for-monome-norns/47902 diff --git a/design.md b/design.md new file mode 100644 index 0000000..4641e4d --- /dev/null +++ b/design.md @@ -0,0 +1,29 @@ +# Design notes + +## Notes for `toga.tosc` + +The orientation of the grid is the orientation of the connect button. +The script attached to the orientation button will change the orientation +of the connect button, as well as changing the orientation lights. + +The OSC message `/toga_connection` has a send variant and a receive variant. +When sent from the norns and received by TouchOSC the argument is the +connect button's `x` value. +When sent from TouchOSC and received by the norns the argument is the +connect button's orientation. + +## Notes for `lib/togagrid.lua` + +`old_buffer` is what's been sent to the grid; `new_buffer` is the old buffer +with any changes. This allows only changes to be sent on a refresh. + +`dest` is a list of tables, mapping IP address to port number, one for each +connected grid. + +`orientation` is what the grid says its orientation is. 0 = north, 1 = east, +2 = south, 3 = west. This is the orientation enumeration in TouchOSC. +Regardless of how many grids are connected, there is only one orientation +for all of them. Beware that the semantics is different from that used by +`grid:rotation(val)` which is used to tell a (real) +grid what orientation it should assume. There, the argument is +0 = 0 degrees (east), 1 = 90 degrees (north), etc. diff --git a/lib/togagrid.lua b/lib/togagrid.lua index d18f3f7..470ffb9 100644 --- a/lib/togagrid.lua +++ b/lib/togagrid.lua @@ -12,7 +12,8 @@ local togagrid = { old_grid = nil, old_osc_in = nil, old_cleanup = nil, - key = nil -- key event callback + key = nil, -- key event callback + orientation = 0, -- As TouchOSC, clockwise from 0 = north } function togagrid:connect() @@ -83,13 +84,13 @@ function togagrid.osc_in(path, args, from) table.insert(togagrid.dest, from) togagrid:refresh(true, from) end + local orientation_changed = togagrid:set_orientation(args[1]) -- echo back anyway to update connection button value togagrid:send_connected(from, true) -- do not consume the event so togaarc can also add the new touchosc client. elseif string.starts(path, "/togagrid/") then i = tonumber(string.sub(path,11)) - x = ((i-1) % 16) + 1 - y = (i-1) // 16 + 1 + x, y = togagrid:i_to_xy(i) z = args[1] // 1 --print("togagrid_osc_in togagrid", i, x, y, z) if togagrid.key then @@ -109,6 +110,55 @@ function togagrid.osc_in(path, args, from) end end +function togagrid:set_orientation(orientation) + local changed = false + if orientation then + if self.orientation ~= orientation then + self.orientation = orientation + changed = true + end + end + if changed then + if orientation % 2 == 0 then + -- North or south + self.cols = 16 + self.rows = 8 + else + -- East or west + self.cols = 8 + self.rows = 16 + end + self.old_buffer = create_buffer(self.cols, self.rows) + self.new_buffer = create_buffer(self.cols, self.rows) + self:refresh(true) + end + return changed +end + +function togagrid:i_to_xy(i) + local x, y + if togagrid.orientation == 0 then + -- North + x = ((i-1) % 16) + 1 + y = (i-1) // 16 + 1 + elseif togagrid.orientation == 1 then + -- East + x = (i-1) // 16 + 1 + y = 16 - ((i-1) % 16) + elseif togagrid.orientation == 2 then + -- South + i = 129 - i + x = ((i-1) % 16) + 1 + y = (i-1) // 16 + 1 + else + -- West + i = 129 - i + x = (i-1) // 16 + 1 + y = 16 - ((i-1) % 16) + end + return x, y +end + function togagrid:hook_osc_in() if self.old_osc_in ~= nil then return end --print("togagrid: hook old osc_in") @@ -190,7 +240,7 @@ end function togagrid:update_led(c, r, target_dest) local z = self.new_buffer[c][r] - local i = c + (r-1) * self.cols + local i = self:cr_to_i(c, r) local addr = string.format("/togagrid/%d", i) --print("togagrid osc.send", addr, z) for d, dest in pairs(self.dest) do @@ -202,6 +252,26 @@ function togagrid:update_led(c, r, target_dest) end end +function togagrid:cr_to_i(c, r) + local i + if togagrid.orientation == 0 then + -- North + i = c + (r-1) * self.cols + elseif togagrid.orientation == 1 then + -- East + i = c*16 - (r-1) + elseif togagrid.orientation == 2 then + -- Sound + i = c + (r-1) * self.cols + i = 129 - i + else + -- West + i = c*16 - (r-1) + i = 129 - i + end + return i +end + function togagrid:send_connected(target_dest, connected) for d, dest in pairs(self.dest) do if target_dest and (target_dest[1] ~= dest[1] or target_dest[2] ~= dest[2]) then @@ -212,4 +282,4 @@ function togagrid:send_connected(target_dest, connected) end end -return togagrid \ No newline at end of file +return togagrid diff --git a/toga.tosc b/toga.tosc index ee96bd51d60b1a1f23ae14526c3997e3cff802f4..28a5ed7519bc38682c2a947ce4da6c902bce92bb 100644 GIT binary patch literal 29757 zcmd6Pc~q0f8*Zz07Z4Fq5fH6KML<-HvPfOAD&mHzg#?iTWsQhrVXX@wyS4%f0@_wl zmIP5i$OlxGfQCiI5FjKJ!lHx_LJY`$XAo%b$p`+<;nFCFLpk{tT;nKRDVUVh-P2MZh869uVbcmW7Wnse#?t}}$3zxQz9vayq|tW4hv6R{5_bQi zl+f+}2evvEYkI6K*|e~rT0216t(1s2AIoc`v;`OyzAf~VNSmt1e5B0*V-Gi{v4oALxL-+`7v+NWTw1+Ab96A*Bt!*?Y1LtB19qft{{fY0FI z2j6~eKarAp$eqLxX z$0neIZ=*pN^^u7Dy!!^**W37i=zF06iV*$(5C#;CoUCR0eqz=*mZf&^tW(3NDX}T> z{+7B@--0t50S4wHy{X0bT?H4Z?M~0FQ^z<-V;_@6g+q^21V#&P2lz|cOC_cwBkqfL ze|ucRUpSVsf?42}CpGye)&Ke6m>rQY$IgaZu=3VE&mrRLULo#y*vf4IJA)A{g^Epm2R;rovwCUR zLi=6*PX_XBM)^|0!T=o`Uyo7eKASgsBi$T}{tgKtcWa#ryXkK>JE^^$UJx)Mq6}b~ z?s5r3Qk7B;p~TC&AkSZW*g4NTR9k`z7`_|A45sbI`&xqhAi-ZU#EwcD^A?Scwsktj z(31)l2MkI-@J2ognBLbdY(~mV{obeA*qr%PV_KfPz%Lq;G`iztzpsk--x{ga0WHBQ zw4~j)J$5H+yld(|IksGEzkF=L5#wD-=VynUV#k*Kao68#Rb*+Uc~WkCSk#4@j>`c( zv<7DNa7Qr4RAggX(P}nI5{;g&9F&Yo*I@!iJxzNoXz~`LgTtlPc?(*PMr=H62()f9&^z{NED9lr*SQ)1ioqSkxyElY{vRwzI9QVQ=N5DM`mY}&w{b= zZhmZR|JC~%ad{Qpqkd=Qa|jDqKULt4Dz?+PGNN!_s%sL3%R8pZM zTO)7KvrMqXUlK1GZ5woQACm~QVoiryg%Ym6CDy_>nnCa%8X*M?iiZM5g=4T-kB~($ z3h3(WxbdO$fptJ|ZLp0-GUgOz#DwmDVWf#Q*u-KvJ~tK_J+?Nj)EN5+{+DO|LENS> z4%lsjKh*b*?e_Ec=P~)5sAE_{oN%x?b&QNT$+j4_Xadt|Oq?|Q?HIjU+!P?G4jApr zPvR3aMt?{d^-F3O;_Bi{^2vUmPM`0;=q-trjOFKDGOwQX__=o^r>dAR`YBms>;v7@ z+Eh4rpVZWmG`)ZC_vI3vnaZywd zFZrDGC|xk8w;!>yapP30YLU(>VJ47^ zy_eFqx~^X+_Ac3HJduv58^PS7rK0Dm$@P|ICCo&!py-+;%nS+E;{7^VT`>8j-FV%a zEeV4{j*j^;_oH4`h zb3$65z#MW<93wnbN!dbZQ`*97cwA2mS1Bd0=j*Far1ep1Fc%n(J;tda*IZ0lp-19J zOVh=Mj4(SSRJVT9@>%rK z1)e5V;jwgaN^dQBHY`^xQ*IAmhshxG?`N&n3*e{c$NhOn+asL4b+UK*U@E|_;>*dE z&l6I2$yb(;>s4vF2Kcje2}|Zt)LQqbPbBamFc)}(y@NiR!n}8*e}N|L8nUxopsCQi z=5qq$3v+tc5Ne(79*x+y@1loq<`7+CSo0|-ZeYHjtZNTw7FLX3LXq?x;$7I_QqEMT z2msZL+$nVAx>Y$eLcF>aw8o+sW&FT9soD;}s|#H?ULRI@Q1V6uy68 zQKRASv8KH#i+UI1L#`sLCcjpp_qQ^6_+xK*JW+dDd$z_JJJ#yfle_-*PP)85cUz0X`2d%)+Qlp=vXrcl=a1A4WEB9g6hVB25Iw0))A z$Sv8Ws>~w@w9PI!ka!rsx;0{|z8he1!XGMod0W+p%-4&cp(`KYo^I0Ao7>wtOQycP zgT09v2L$0 zjC8H|(ON@F7cqGD*=y?cVCl;40_<=W@%`ab+2OId;)XEsLN8<|Lv?BoSOFFg{GskNFjo?|{`>vG?~KHV)!&kpQ9cOs zjw2zT@_07e1Z-=u_{xIgWuT{VGCc+M5qcZAcp6ARKUdN0z<0aIcJgP$gV*O=<>x|m z=w{GwiGL~y+lMTlJU$e}V8Ov3drRVjgg;geT-c2_EnWr7jsK_5C(Xa*1nxeo zXd9R4ky>!83{n-ve=MPyO&%Znz-|D~5@e0|SY-?u=eHNB2*IY8Xba7+??b*uY1Zgy zvHL@Z6YF@%dy!eg1q@cs0Cwt%zUN9F2PRavtsqznVqPT|~g$d98$B-E1jaY$?wPpIu}% z7}&E_g=a6O1d~0kW7ny-Xnsy$$AvlkuVk+`gxHpd11B``-6dA3WSy2$P5f1qqcWQ1 zzLEFh2c#G%)cjwM8viUA$Eb zU%1plQ7^LRaM3#Bi3GL|m|L`fX5>oxZn2+@6284i^-OctHI)NocY-w{mAu>VnC+FdwXVI5G6TMeeI-8zAoL3-mmjqf7I)-rozc z)92|7|2=`7L^@(BHO(SPjkeZP#m}q8ysfeOA75Ik>N)77=e|OIb&IxUIXCz#YbGh!0zSmc*rNGIJ{couyi0S*Y~1)E3-OX z(u=qF^wlpzThzH>14&8_x~A0p{1}m5OR&FBf%m2;Gg5bEp(ln{pk=+h`LrN`-ub3b z^XCg4RRhkL?#AanmqcFfjSmX0wlES@N$!og9vuuW|9$22WALR(ra27PJ zDl@165T{sYm!$g4HjrrX4Ba2>II(S^_~7J+7?(@|T|!*8m6%a`2CPaHdy- z*SSpGi{W{%rs=KF3l%%dw!4bp)JGT3WiT7btbrD9J7c=IWd+R^<(O$Gs9Qz2>&;;D z$N&w`g=jbit$%LS{7UYH^GH`jPGXtrO1(&coF_2&e-Cm&jzAoA3bU1`Wrt+`Ivp(a zFP!bSb5m1Itm`QEv*$YCv^aL&liJ9)pE_SQbuwx0u_A!e@(be&Hrc9$D` zZ8M@#&Qzrk*jl%wUs3dLV3lQY&3>M{!l1Rha;tq5!n}h#3`RDTYonp&C-rjpm1bA5 znPxl+p-8T`L4G>?6G_*h)TI3eV5x32LcI(sOhv2kv570kAS!uXYg;5Tdht7&o+g0T zXt0wSFWvBzKy(IzV|0t%V-k1<8k!%CxH+d;u;L*3FAC&u+d<1Fn8-m z@w@FeVvTyM_-EX2I$8h_DMdBS%E3m1c@PkHlrF%Ot6BoUPWV*@@-69&tn|-wz(L5D zs&^H8&=HnH1NQO|Y&O-wG`#%7? zpuSez&XfN*96@@_H!$HJK)XI`^5xoW!AQ^}0lwz78ROmB53feOBk=0n`uTFnd5)lE z(#q7cXQNbt$!e46OT7i)0r(^EI!4NolJ~s{huEeen!FyuuP7AwRY?!gmRx$aOA{bh zdA{;>P~B{l>PYWXxwgoutK_8l;)6wD>yVo$K+}lG@zCZ!*|`K@6|14`^NPaOBH3#u zAtXi^^TMkSE zN`-wJc+cOZ0JKN@DV1z~m3-nld#w!0y+JO+{n>t+2#wq+-Hhk11MQ*_On8=ie`1t$ z=NbrxwVV^vgUO13j*_YHI@v3~i;=zUoW<@8`a+;eKL?r^e@oWSBeA-%+Q6BVQ1GcQT1+at7nFDuw{+Lhu4y9O-b3?Y1 zeBdg8!c?)%yRNI4k>z9nZoV>)6)pYnlyCWScbsTT#3@W9tJXKUco;A78{!fQ$GADB z{--~V1V?B0rX8((YSeVSxSED<^83&~xIohW*uVdyl<8QLko1>nt5&6t>*>PPV%1Q~ zs1CEJ%TcEJ-rjm$+<}6`r1w#Tm{=124BPiu8ZJ?TN>!k(-aWiCEnjjMo8m{2u6tXI z{4IUyAD~=9k4?%vWNy92@8}x8rX#~ceD9Eo$$vENZ}Qe@9jFtg{E>Xj^5ad)P%-nq zwo_U3Gw!B_?&du{dhgp7mc@5@@XI{-!O{Cf%D2DY^$~CL_~Hh?KhzrTkEiv?T)kWS zIQP4QA8hdVGK`iAHOriIo5J!Tk((4i-XbvBP!&o`>3f^y?N6?G;ytoO>49bCt7n!@ zY>ixp2I-$=$H~KUk|7F@srfGoAGoP-FIQ!k{|_$xEjHnsntX7V^wRx~h2{?5?dw}R zTE!ZAmhWB7vb`W3eUBxuyQ4gX{ud+p%xYm!{E<(|ehW;!irbg&mYSu`x@da!OiZ!R zYHwDb;tm&8Tgm&TCChN?T%W)Bx_LXVw&x#v({`e9xDou^x{x42?Av*9I== zP>CWdSfJkjU6^jlgq_P$$n{DDS8U75oTY)}buzp1oDkA`u(U63fb4|j0k0zn1LA&k zoGu_Ttm4+e^EB(!Qz3-ahtbYcT6Su6S>Iol+k9qXj{(c#8i9FcR|;5MLONd>u2M!e zKx1t#(GBtW+rLO2Cp=6ShrS$@3`gYjIY&BBOZ4$f8ID<#A5lY%WE)iR+XzT|E!p0d zw0Cu@mn_)Z%R4PvNU@WnBrWMZTpo56QI{bLuasNG$n~~o>aEf9X-((G*&FP|FKd-U ztIHVBycOwBvuj5ul>cQM#?w%lKEs zYe?5kk`udY4Y(Z~M!~?MI=7n`dCz&2+;z0)r+dBOhb)x&kiF$ruW)n+KXA$LX|+^o zU5PB62LR?2Rt9(g{+M%N5?qP`22k$R&$Fs`g zLo+#NdXLQ;zewc%AX!CWN5tPy`5J}JpK}u)xJE5_q^ejmzR#~$N$0~7o7 zFt{HGUMW*L>=(lNX3Km}ATX^}tDK+dK7i9*n$}vZ2UbMk^VbsGvweCa&AvNp#ohr={rLLg+oK=Js+7JZ`OUZ$T z_|<$l**nHo-j8Rj_z8epZj4}CJ5ZM?18~bLmsz)a_~sBSQ|%yFrqPvNJ+VhtFkBX* zY(IpQ>_xqd;(L*RO?bs3U&UAMWN6ExYQQlQ+h09D4fmC*_-aBpJ1SND6T{~aDy6_{ zTn#?jk2DU}@!keQd)1~R73!<3SJL0ef9wJsWe8S)O9vX8FUsIt-u*G(5O5hYamPl> zD}%_MHFqInIX!oLr9?I7ltD-F%aZ8E5R%iow1Xwna6DG8xPM1y?*mVnGjPXON;pE( zq^RJz;@!$E<7i&?+z7l*N+CIlU)5Y8-%%pCy<6>56sCy=)bI5~S~Z*Fwkbk9pPar} zt@(f={)c~0=$CfmFSuVfS02E+vRf>ZFGEroaEcJnr%n;kQ{>|Y#NNooJ~8FW%-k^q z!Q9(h?#crcoIrL_rX4_bqEM82hY)+8r3CBFaSD~yxRj>vx?Ub|`BR+mB%P&5`;cQM zZg@w?Vzh~!qZOH1@B13nt3zee0{pR-)_elxfw2y{zQ74_y$1JpUf z{gwB1EX5aR;*J-J-gU8C%poHjWJ%V6gLgn?@HCs{irvK&gW4|=$4}}aYwkYefw%NP z>~g`YYYX8c#~zu7iJTI8UgmB;A`*IZzF#o+yN|ghh>BmpC-IQ!SkJk3pW}Zi+gJ)q zoq+V@Al?7ATum)yW2sI}O3HIDfLP7svw+g8>`Fttim7=`YVq%dy94yG7FCyh2Xeje zJi!8uuiP{kfBNW;c@|Z)m1X6ydq)oVrev>s_ORGG*E4n`fiCVdY0jLV{FA8BGHO&# z^QsZ43QLFl@Si?3Prj~HZ5d>cJ^57;Mwo8(69mSkI)xw97eOsS+o$fYU5b1THT$`f z2Bzk(y4@sqp35({QkV<8*aBF#QT|+SMq9Yd6E79}_Ay}g@l|Yoq zJ0~Oul#Avr5NFOv7%PglpWz&=EQp7nBIoj_!=I2@esx8L1DeG!TGmFC4EXNU`4VLu zpF^)MJFkBVK+y;nHJbKHuxoEZIW%al54j%59yO>uC=(A}5&yA*<{)#b0Re>*NnNy4 z9~`5pRVr*%etiT$t#T-+6)WXtW1ns|nwc{OY*tt?(Fkv_1wYELs^&*P5R7)_V!C(S z(}*H!`5H2`7oo$^z2z=(!Yhc=V^s(kT%J0d-3xe36gaw{mwAA9Ve46m()T<=uLo%m zJfgrJOz+j_z;r+Y7&@i@{2_9oxs7q?o@LBUaM7Nb%sE5 zr0po)210NHl=^sEfKVXP&Z+0{=*+CKE9olsApo`jo6(=S$Tt}9*U+XU9#c2^`_e_%NU&=qoqUJNA4J@6m67lSPB07);G_O7Tu; zotbIlW0md}cu%Oez^423rbz6U_o}N?yuL=khidJB-Od9eLu!pC+{Eq!=7~l#&y%Js zmp;HQUo^vums6@*OZVXCpj4;B%EoybX2sm^hy+jk=T%V_$qn%_y4=EjmLH*RU~Xj` zAcSSP+1KP?z*QQ3Tn|}X-n-~JhKnpjJBQf4!EzpJyWPiv^{ZT~wSNbGQd>!}&}tAMn9bLbxgA+MX7* z>{O+oZ08BkdKd~G&>kFB^MrFh=F(h`l_!v6i^+2Uy^Jb^iztmD^Pg-xEjgvhJ4E)l zhFLoKys9`U4?Irxd}v$+5GKgwiyG)J}v25;=H90&P<)r|B(~O4?Q54y-kY- zPocb}v~xxA@Rum`-~ld zT7`zDR(W+E0OnsDBH{q0#SL@3=YXm%S;l*&gg-$XhpfzYPxyckhw{*n8pnNgt$0to z!~aMb&uUK%6TU$P-W4?YHu?8+L;?N6C=F%5G1~{}#@eSOT~(Nt9!V;jWHXrWUxZLn znoRsgdh0KBXnjx^_(7ts%F;6%4m!``54^Gahi^ek_{dLmm9g`u z2Y7-%e4K=yCo9@Ip5>^BM_4}8oXX9`m(pRK4o=h-JSfNxE8ME z*Vp=Q6aiXqvLLvm_HQf??3pj(6&Y1>R`Fg(T#L=`Y3Myep50u!B+>lqDVfuU$s29- z0jyhfv(ABiKn+E+3d9;-2l!YAje=c8d@3K-Z^7J)gkPUYV~pSBYSAJmIbRE)Iel>% z4G5jkwH&D_+>B^D+KFueE$NGts`S*w>WQe(9HT;~#8oZ;mq1<}wPc$+5G|uJl6*x;f=u5u0MIJCTs7>}8~|kr z!rINLia;oVsu~Eg4MQI922b}IGwX{9n`4A`5IcRyThhBMHdsM$oFc13Skuek&I%m; zMbUe-9AH`E4S+k>qri8JC6pnY-UVd{p-0x!f`KF@RaSy<9id=wp3Z>ORj07#Q0CG~ z_MlRdm0nK|;Ike<9mhpiY^&Uv4WQs`88Er0RV~}Gmr&rOco%{;D_SeBD~Y3c3u5nJdX!h* z81e&w{EgUMy$pPg!_RyJSt@or&%*_|zj|D^FoV9>;57Y-wq+R<`%b4X2De&)JKeOo zu5TQYSFN26lG`_|Ap8^>1C%(zDQLn4Mh*smqebQ6qgRZ4V$i z1!%Ip$M|g3*BuNeh{&erh_93wbq6`umaQBIp-XAcFq-n>xw2SQkBsbhCdyUoR9@$ttRI4aD5?vjAd_8T7@=c$p^G zG20`qf`eC-`3czvOp+=~!0tyLGzm>i->q+H1M26{aRVEm8Tj!|SI6{sN5UXFc6JY8 zugG2+jCzn`2&rVrNwqIh#9xU!|KONgJzidO25@2xk0|~^Nc@_}V1vNx*yTW+v3wkF zk5;&}BpB_0N@SD)SxU%JCK#$2{tL|woEe(D>nM-XmX(R*w(ms(w_#@;K=-UU%}vM_r7 zaSyS?wEL@u-Qi~a=SMrP-C;(#5NK^8>yi%P{PbMC#$4uD z6_-4ec;W1|Q|YAc6tl6Q8!r-!I#RiS5AJ@G&(8IT9h489R1^bganvKspDv^#qhsIw z0#N8h-~L|>noa)d*_}i8odS(f`jg&kPMAF|iQhpcnY9T?>^VOl$b_eK#~&xvPlL9Y zJ*n}RpdR0woa3n>R=)*w$5Ub;AZUPd2}rn3TeZlsevv!YSK?B;@#TZxrxPIs1KG}o zx$v<>nAiEy_ge*s7*R!G*(~CB7ddP3Gqc0r^0vCF8gx*`-R5F*N>US`?ikHcAwEb= z9QWZ@s8dkOIT`huh}18U!x`zVm6rM60{~@} zOueNHm_SsiLbPR;$#10h;kcJ-Us4nsyWYSMYrcY1F3|OUfVy5Zu>#FGMyHoyJMKot zi@$Ic$-WA;!e~I0|IFlfY{mG?IB zXabbkY&5k3?ui@w?yFOa01_1;JDcZH{)9eksI>hvP?BEyPjuH!tj%0nI3#INhelf2 zeU$g%`S*}Vt~H^s2DUDuC`2K7Xg7oyhn&UvyT+Z34MyV1iov< zR7(jN`mV95CEAKWZHnR|tw>uHCnsjqyqNnDK-FF0*fjw8qWV+e+(Iz1S(mkw0BeCR zD85n@pPb&4au&QPHmCc=&4v%yR#UpaDgO8n+1$!Cke#sjT?LLT$cRqtX_-&^Rz_$F z#02Wtb=kyi>x#{GFQYq1{XggL7N(#J9!m$02 za*{p8f$FbL{@v>2(&vDY&N=qZ*h)dX7R}pmi8#msbHZ~|mq~TPOj=@aYj7`1U(9*} zhnAF>dC?qsiwCG1#b13t@`RIE8b8E4`$cMasc5@f2wP{Bfu|Oa!XJbhs>hO$@E`n%vdOh*I9tIe_8sl+)x&K8@JgePk zJLl{8nkU*#E(L_bAz^>vP+wV8Xu(*<+cSyLk150sRgX^tECF3_1aE4~GiHer3;YLM z^CZ823?BZA5*5)IyUu^#lTPvQd;K19GS)&Am~Yg?mMD#gD|>sZn4NLeAz4gGF-zJU zT^y_toJC5M9M00C`S16>t@3<#y@+;&+~0d@`Qwm9e?=|$OXL$05MZr$^UlOS19p}N z6qv`#?e1?HtV2ec+g?XM;~#EtS9a^~xtFi<@nRs~yzjY~|6E-B>VE&iqxV*O(`cu6 z-P-*|Uif-E{Z`W*`|3XPNrF6+_+XeESJr=Cq+sel)}f(Z;jIw*v?Vnq|5AFQ2JccD z-n3%BlV8?WH_M+`X-Db)A6G1lD*Wdelw@4|za$x^z3nWYoBY^kM7`0{N4@#%1O0Cs zI{v!Ntac*kwG5^9i!DT@?|a|#W~-Cll&;(^@(R_BYU$4TBW&UibKQqz zqeZ~Sz2nfak)Kyu_Z6kq>aR1Hj?1k)@WkzpctKUjjl9A^ zIq}xD_yFjG0j_Kl&a%)^cEVp4>=Kb=yA#kqKox8{(YD%PGnu*)OcevtDEfMyv6`j0 zSBsaorFpnTQPdoQk==E!lg*!4xirX&Yz{||S1Qh^BE}G~--VaeT!UBSO(|9_232s2 zIxG9~TTXWKsngj_hx3Ec&K-Pb^H30b6i4SCYAmSCtm*TsJ?aH9i43vXGS=UUNDH*E^@ zFRN_}|wq;Vm^%=|E*Hs#!~djQs-i617t zj}iV8T>w1oz7T+-?0gtvd-~AInxLmU};T2FhJOLhqq%RZ1!RM`Bs-~`lesmst5{Z?lQ9*u1 z_Pr6E*>H4Z{+AhI{Mqgsq@U7`m#b5RR;`cGQ8{G0YYfVq)#2U20Nfo?t|2SRQy0lj z2TfXMPK`mZ_iO4M;1xJS2#URUoP|}ZRQNR%ZS1lJLhR|ZG@jNV_(iHZEcZ3#2~dHc zsHSoG;C8`bj5`GOl<6 z7Jy4>!pMS~fZ{~)&f{m8+`uT0l)wwKVDsK--2LL^jreNL#TYD@c!@n-?^n=9`0BJJIk9j;PLHkaiQH2FHLTC&9UP3oO5 zaKyPl=xhwU0{O@*-4c|G2Vuoo4ef6KFW>qvj6<)gHF<@7>gESnibuDL%h7fA<{GL%HJmrpTc z*ZvLcWNYMR-=*po2ZBo^WN*C$!x*feR8IakjKL+kt+u7fxCbHjyN}m^Gnj0&gE@gY zt_m%c!3Sf30D!)Ew`d8tj7<6C|LexCNaKo3Orv*v_cI6tF+E3&$97+5%Zy6WQ}oOP~?!Cw==(VJc_Nw4fcSg*}GhTylFA-o{ zHnxG+h27zCu)pTDxKFT=#f#N2yZ=Km0S zA~wAzrs11(5KqRSQTi6c38;ykep@WGIg70Hfs&cfV+fJ<9@lwcf&Z|>;JBC4NW+m4;8@~JoL9e2!xJuk6XRupfXw3kLoiz z>&O#SP-%;Q0B#bP46)vSm0mCTx{YqGgHj7 zt)m{l9b|tEheP9&0V3{gGP>D7W-|a8lHlNl66|KfKgwv3PMT?0R52B|X zizZfni6_=E&rw6(%FTw-0cY;-*aW?&H~M=}LFrlo5U=P$>^h^0_%V&>*bCyAY0MCN zV$KcHrcmL+z{fV5_f@M+&l9T=xp7j~ItG(NzUoj31j1;Szf2QX0a=={1qkv5=C}~I zY2vadw8|x4olU8qKK8^)+N$ghaeMRY@v08{Oy}0t=?-EsFpA3|XiY!EPq1j$$A5$B z*@oY?d`OO>0|m}A%81oSUdZ_kD?x}2)`&C0qk#7%RKGTwYEFlk@pv<&Y?W2Om3f-r zjqE5ocR{7cxC&uL8F4XCV8^G_Rzx>`DgMOc#_lpzx?Sa$gv9Z5cOy^x4^n3bu$fYj zhKgtqISoyxv9AyWa8z@lg8+0q`!ol8lWFiM?+Gu``VO<<$4U@;b9%yfDFNeQZ=5X$ z!3xv%vl`)h6xnQyc8yyKxf1Zt7T3t@noAXdoOlXnPB^0NY1S$2+khv5P-vbrGsemO zM#nu+~qGJH>2M%uU z(zZh-f^3Y_JuNyQ*vF~*one5stvYpv8iH*I1HnVk+zr`XJCdTzSrBI$i4H&4OoU!Z zUUN_s6YOp*C>abfE+QTdB3Hq%B_T30h&?S4(50?o+(B@r5EOaN;M!rVv;Iq*aXXM) zra;~gLoM=L0+i*e{^k58Lb3U1BdOW~7`eOrn+nWwdO@Y#t^)S|uX5r@36Wg66BCy5 zex0N*ICdZQZKSpn-SQc?_-Y^iHB&hfQ_p8a@fix*!949PmoL80FF4tDd~m~ z$T7OjhT!Frcb5CIhEpDe6|eLOwuxYV9QC^j5O|V*|8tl7QR#Nls(!lxPIG-Vt?AFZ z3In#?S6}3K(>l-eM5u@j6rFGP4{jW=_8xX0WG7b#cxN1L@25pFi{Hf)I{(0qG1R;2 zd8B|AUQ^DPN5`GKq1~)PWaxBpM{7S6cj%UWG+Xq^r>#|g)@bn~Us{Rpv5W@?o&N%f z@i()6WF5!1C19}IqG`05qY)r3Mf$UDiTrd}$?c^%$B?hY+Z8-b&Tv;=PgY$cZ~h^? zb)9lYaDOhqK0vhI@|h(`zt(uxgXI>K$H zxaHY#T+K;4k;3<7mj-TAujUJ`I*DsfNnMl@_E+9ip~y}U{Sp2j-6_<& z58cwKdWNt~HP(TXI18`SW)lhQn=nVR#8wvfS#vLL)mcws87PBN-0#s!MR7{!@{PBj zj-_`VJreRD@8)Eu{@Y%C<=?Br&Zg^#!7aX3jIyAhx5&Yq!Adu&9=X%oX+-{f%4Aa6&^A-v+_+Rui0f$?1tLBdd+k9%}epCtblB=~}7LQO@hD#qVv zhyCupDz?2SFA{W%+K$#OFDtg3oxw$1JJn?qHLN`^XtGa{0x(74kM8GGoj76REf3>I zpejSpQ!TmFHk7JT8TLjBlGiD)SJ@kLbz=lmg{JyW7vy=b{%Gs}6IHMfww5T{S|0U7 zC>P&*MUY9tm3h6f##~Tidwfo~-a44$;@DYI_v$^KuDQCNY^gH)fG4-y%erhL0p1ek zNI14~Wi~#iVjh*r^_tBty@6JS-Z^^$4e7D*G&|xk{M}W zty~D~6XIv*Y zRna-HH^3hx72=UX6Fba~t7j^@Y}uDVp$N1>$quH=o{C=Rde#|?_vzHH)N3__aCi=<(aNbRpRC!Ps~vz-V$~nJE{EJrr$P^ecQkD%cXLZ#=x>C?bISvg zJ`lc5(CGSGzALUw9{#nku2PdBIaASdLHVgq-Py#Gip1Ifn#SO>X-qD2P43!a9;wFup%8rSkWw*inKC(tbMwEOTW!6*1d`|sjEb( zMpyXZ8@gY-#yR$`u8RxLVdaR6P`Vu-BT=P~#B8hclBXN|3aYZ7?6gsai~4xO+P0Wv zNeC{nZ$Xz~F!xiU*Gd5|&P)5>=?Dx3e?+HQ6+K8aHq#;IKXq@espbO8jjk-2l zJf2UVGv3qjo=;4;!*$%4A$#q1cgkT=M*Q2ah^%w5XrDHcr|hZb04JR1S74S{p_N(p zm&CGSxE!|TkdZoN1!i+-Kt}ARXP38n4KL}zT)LyzIqU-BN|bS_EVf_YzB;X>OO4p%Dc`l}h5H;CQ)y+; zJGOPXUnTZ}nKBpJe7%g#!57*$=?Yt$Rf&fg?q|*52yeUs=G+04 zp649v$iAwRJg-hFZ^S&csR(sL;jGZL(r2k%QlM{?gKK=jWLs04+~GQ5v#;{D>a*NE zV9w2kOYR$)C1-JtWPPlw_vQ;K32Y`<1>!c8y~3zg62eWySn2x!N!)byCdKP&5%n}I z;o@BhR~*_x@!3fztthjFtKjo=N|#x4{ofGFJa#{!cgVqAXMEeeC_8(X5~FmIEV@qC zjjwQ8nrc%7HqGbMe-Rd#E)Z^EGr9xaCAo>dxLax;tMcv$I&*a|{tF5uC}OxJk{RRHl`zKi{L&_F?z4|d51!s z%xzCkZ<4cKV#{G3|Zl{m)jJg>8 zY4K0G)6eFdn?nC!YlT+|u2LXp2=Be%j!Y8{(91;oKJhftb&i7VXMR9vwu z(wdzs2!fxNgZ6noys8YkGs{SwL)ZK!bDhyd0!J{+Y1{YT*2C&c4ifX3y5D7{ zZlGW8Dvz8dVQB%0b6rt=%DA?y+m>oWroS1F)X`DD||&RORRwQ+x0E)YsoTd5Wl1e^YHD zfx{l=qBB)H_}|h;Jf7}(K&m%)T0{5FjF)MRdJDHo)Uk~&etr|zkr_X`-trcAFG_n4 zFSwi3iR#@ey6rK);||o@%UH<=^f_00PAw|B%P^L^^d?o8J5HK>CJCX7r2MOK7H!UTQ-}WpCvf>FH8qRJboc-$>ZcE8=E@B>-&(ni;2p% zXuAqGJAs|-+He02y~-A|9}Z0jN{d3tgNMet&addPxX7Qe7Q}5RLt}JuC$n2o1%99Y zO<+zP6eD!+SnXIJ5tRVDzM>qMb1OzcBdPlssm^Pyjkq4 z>UsDw?DlHd?Sm+VR8ASbbk~qKZ{vPm21jK24JJW&EQ#39nj6it&zZ*9iRIlMAD%AK z{0%3{WWpJMX6qwmU|J@`%&Yg(rQe-Z&-xvGg8MpcvH=~MoJ)6PMwa)o+y0^d086-j z^8@MIYy#!BOpIfb#3G79RCr2y$S$$}+x~idNIw^oL}-S zbfmeua7Ex14VN739I%1BLz)NiQI zh~Myh^g+0QQcqy=pC>WA68i>X^{GD330vY=Sq@UuZilS1+>tb0QPN0XDu`&-#}bXs Jc~wpK{6D^+#Hs)Q literal 28915 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