From fc3c1edfe32b2e8a58c9f7fd4d7a4d5a28009e10 Mon Sep 17 00:00:00 2001 From: StarArawn <toasterthegamer@gmail.com> Date: Tue, 7 Dec 2021 12:24:59 -0500 Subject: [PATCH] Simple main menu UI example. --- assets/kenny/arrowBeige_left.png | Bin 0 -> 556 bytes assets/kenny/arrowBeige_right.png | Bin 0 -> 542 bytes assets/kenny/arrowBlue_left.png | Bin 0 -> 539 bytes assets/kenny/arrowBlue_right.png | Bin 0 -> 525 bytes assets/kenny/arrowBrown_left.png | Bin 0 -> 562 bytes assets/kenny/arrowBrown_right.png | Bin 0 -> 542 bytes assets/kenny/arrowSilver_left.png | Bin 0 -> 521 bytes assets/kenny/arrowSilver_right.png | Bin 0 -> 510 bytes assets/kenny/barBack_horizontalLeft.png | Bin 0 -> 238 bytes assets/kenny/barBack_horizontalMid.png | Bin 0 -> 145 bytes assets/kenny/barBack_horizontalRight.png | Bin 0 -> 234 bytes assets/kenny/barBack_verticalBottom.png | Bin 0 -> 194 bytes assets/kenny/barBack_verticalMid.png | Bin 0 -> 141 bytes assets/kenny/barBack_verticalTop.png | Bin 0 -> 232 bytes assets/kenny/barBlue_horizontalBlue.png | Bin 0 -> 162 bytes assets/kenny/barBlue_horizontalLeft.png | Bin 0 -> 341 bytes assets/kenny/barBlue_horizontalRight.png | Bin 0 -> 335 bytes assets/kenny/barBlue_verticalBottom.png | Bin 0 -> 323 bytes assets/kenny/barBlue_verticalMid.png | Bin 0 -> 157 bytes assets/kenny/barBlue_verticalTop.png | Bin 0 -> 339 bytes assets/kenny/barGreen_horizontalLeft.png | Bin 0 -> 341 bytes assets/kenny/barGreen_horizontalMid.png | Bin 0 -> 161 bytes assets/kenny/barGreen_horizontalRight.png | Bin 0 -> 334 bytes assets/kenny/barGreen_verticalBottom.png | Bin 0 -> 327 bytes assets/kenny/barGreen_verticalMid.png | Bin 0 -> 156 bytes assets/kenny/barGreen_verticalTop.png | Bin 0 -> 339 bytes assets/kenny/barRed_horizontalLeft.png | Bin 0 -> 342 bytes assets/kenny/barRed_horizontalMid.png | Bin 0 -> 161 bytes assets/kenny/barRed_horizontalRight.png | Bin 0 -> 337 bytes assets/kenny/barRed_verticalBottom.png | Bin 0 -> 326 bytes assets/kenny/barRed_verticalMid.png | Bin 0 -> 156 bytes assets/kenny/barRed_verticalTop.png | Bin 0 -> 341 bytes assets/kenny/barYellow_horizontalLeft.png | Bin 0 -> 336 bytes assets/kenny/barYellow_horizontalMid.png | Bin 0 -> 161 bytes assets/kenny/barYellow_horizontalRight.png | Bin 0 -> 328 bytes assets/kenny/barYellow_verticalBottom.png | Bin 0 -> 322 bytes assets/kenny/barYellow_verticalMid.png | Bin 0 -> 156 bytes assets/kenny/barYellow_verticalTop.png | Bin 0 -> 334 bytes assets/kenny/buttonLong_beige.png | Bin 0 -> 646 bytes assets/kenny/buttonLong_beige_pressed.png | Bin 0 -> 588 bytes assets/kenny/buttonLong_blue.png | Bin 0 -> 645 bytes assets/kenny/buttonLong_blue_pressed.png | Bin 0 -> 576 bytes assets/kenny/buttonLong_brown.png | Bin 0 -> 657 bytes assets/kenny/buttonLong_brown_pressed.png | Bin 0 -> 595 bytes assets/kenny/buttonLong_grey.png | Bin 0 -> 599 bytes assets/kenny/buttonLong_grey_pressed.png | Bin 0 -> 548 bytes assets/kenny/buttonRound_beige.png | Bin 0 -> 983 bytes assets/kenny/buttonRound_blue.png | Bin 0 -> 975 bytes assets/kenny/buttonRound_brown.png | Bin 0 -> 990 bytes assets/kenny/buttonRound_grey.png | Bin 0 -> 914 bytes assets/kenny/buttonSquare_beige.png | Bin 0 -> 503 bytes assets/kenny/buttonSquare_beige_pressed.png | Bin 0 -> 449 bytes assets/kenny/buttonSquare_blue.png | Bin 0 -> 499 bytes assets/kenny/buttonSquare_blue_pressed.png | Bin 0 -> 439 bytes assets/kenny/buttonSquare_brown.png | Bin 0 -> 512 bytes assets/kenny/buttonSquare_brown_pressed.png | Bin 0 -> 454 bytes assets/kenny/buttonSquare_grey.png | Bin 0 -> 451 bytes assets/kenny/buttonSquare_grey_pressed.png | Bin 0 -> 406 bytes assets/kenny/cursorGauntlet_blue.png | Bin 0 -> 752 bytes assets/kenny/cursorGauntlet_bronze.png | Bin 0 -> 804 bytes assets/kenny/cursorGauntlet_grey.png | Bin 0 -> 758 bytes assets/kenny/cursorHand_beige.png | Bin 0 -> 751 bytes assets/kenny/cursorHand_blue.png | Bin 0 -> 743 bytes assets/kenny/cursorHand_grey.png | Bin 0 -> 705 bytes assets/kenny/cursorSword_bronze.png | Bin 0 -> 1090 bytes assets/kenny/cursorSword_gold.png | Bin 0 -> 1095 bytes assets/kenny/cursorSword_silver.png | Bin 0 -> 1005 bytes assets/kenny/iconCheck_beige.png | Bin 0 -> 310 bytes assets/kenny/iconCheck_blue.png | Bin 0 -> 296 bytes assets/kenny/iconCheck_bronze.png | Bin 0 -> 313 bytes assets/kenny/iconCheck_grey.png | Bin 0 -> 319 bytes assets/kenny/iconCircle_beige.png | Bin 0 -> 284 bytes assets/kenny/iconCircle_blue.png | Bin 0 -> 274 bytes assets/kenny/iconCircle_brown.png | Bin 0 -> 285 bytes assets/kenny/iconCircle_grey.png | Bin 0 -> 283 bytes assets/kenny/iconCross_beige.png | Bin 0 -> 273 bytes assets/kenny/iconCross_blue.png | Bin 0 -> 267 bytes assets/kenny/iconCross_brown.png | Bin 0 -> 271 bytes assets/kenny/iconCross_grey.png | Bin 0 -> 279 bytes assets/kenny/panelInset_beige.png | Bin 0 -> 631 bytes assets/kenny/panelInset_beigeLight.png | Bin 0 -> 629 bytes assets/kenny/panelInset_blue.png | Bin 0 -> 626 bytes assets/kenny/panelInset_brown.png | Bin 0 -> 626 bytes assets/kenny/panel_beige.png | Bin 0 -> 786 bytes assets/kenny/panel_beigeLight.png | Bin 0 -> 785 bytes assets/kenny/panel_blue.png | Bin 0 -> 785 bytes assets/kenny/panel_brown.png | Bin 0 -> 799 bytes .../src/render/unified/nine_patch/extract.rs | 4 +- examples/full_ui.rs | 197 ++++++++++++++++++ kayak_core/src/context.rs | 3 + kayak_core/src/styles.rs | 24 +++ kayak_core/src/widget_manager.rs | 1 + kayak_render_macros/src/children.rs | 117 +++++++---- 93 files changed, 307 insertions(+), 39 deletions(-) create mode 100644 assets/kenny/arrowBeige_left.png create mode 100644 assets/kenny/arrowBeige_right.png create mode 100644 assets/kenny/arrowBlue_left.png create mode 100644 assets/kenny/arrowBlue_right.png create mode 100644 assets/kenny/arrowBrown_left.png create mode 100644 assets/kenny/arrowBrown_right.png create mode 100644 assets/kenny/arrowSilver_left.png create mode 100644 assets/kenny/arrowSilver_right.png create mode 100644 assets/kenny/barBack_horizontalLeft.png create mode 100644 assets/kenny/barBack_horizontalMid.png create mode 100644 assets/kenny/barBack_horizontalRight.png create mode 100644 assets/kenny/barBack_verticalBottom.png create mode 100644 assets/kenny/barBack_verticalMid.png create mode 100644 assets/kenny/barBack_verticalTop.png create mode 100644 assets/kenny/barBlue_horizontalBlue.png create mode 100644 assets/kenny/barBlue_horizontalLeft.png create mode 100644 assets/kenny/barBlue_horizontalRight.png create mode 100644 assets/kenny/barBlue_verticalBottom.png create mode 100644 assets/kenny/barBlue_verticalMid.png create mode 100644 assets/kenny/barBlue_verticalTop.png create mode 100644 assets/kenny/barGreen_horizontalLeft.png create mode 100644 assets/kenny/barGreen_horizontalMid.png create mode 100644 assets/kenny/barGreen_horizontalRight.png create mode 100644 assets/kenny/barGreen_verticalBottom.png create mode 100644 assets/kenny/barGreen_verticalMid.png create mode 100644 assets/kenny/barGreen_verticalTop.png create mode 100644 assets/kenny/barRed_horizontalLeft.png create mode 100644 assets/kenny/barRed_horizontalMid.png create mode 100644 assets/kenny/barRed_horizontalRight.png create mode 100644 assets/kenny/barRed_verticalBottom.png create mode 100644 assets/kenny/barRed_verticalMid.png create mode 100644 assets/kenny/barRed_verticalTop.png create mode 100644 assets/kenny/barYellow_horizontalLeft.png create mode 100644 assets/kenny/barYellow_horizontalMid.png create mode 100644 assets/kenny/barYellow_horizontalRight.png create mode 100644 assets/kenny/barYellow_verticalBottom.png create mode 100644 assets/kenny/barYellow_verticalMid.png create mode 100644 assets/kenny/barYellow_verticalTop.png create mode 100644 assets/kenny/buttonLong_beige.png create mode 100644 assets/kenny/buttonLong_beige_pressed.png create mode 100644 assets/kenny/buttonLong_blue.png create mode 100644 assets/kenny/buttonLong_blue_pressed.png create mode 100644 assets/kenny/buttonLong_brown.png create mode 100644 assets/kenny/buttonLong_brown_pressed.png create mode 100644 assets/kenny/buttonLong_grey.png create mode 100644 assets/kenny/buttonLong_grey_pressed.png create mode 100644 assets/kenny/buttonRound_beige.png create mode 100644 assets/kenny/buttonRound_blue.png create mode 100644 assets/kenny/buttonRound_brown.png create mode 100644 assets/kenny/buttonRound_grey.png create mode 100644 assets/kenny/buttonSquare_beige.png create mode 100644 assets/kenny/buttonSquare_beige_pressed.png create mode 100644 assets/kenny/buttonSquare_blue.png create mode 100644 assets/kenny/buttonSquare_blue_pressed.png create mode 100644 assets/kenny/buttonSquare_brown.png create mode 100644 assets/kenny/buttonSquare_brown_pressed.png create mode 100644 assets/kenny/buttonSquare_grey.png create mode 100644 assets/kenny/buttonSquare_grey_pressed.png create mode 100644 assets/kenny/cursorGauntlet_blue.png create mode 100644 assets/kenny/cursorGauntlet_bronze.png create mode 100644 assets/kenny/cursorGauntlet_grey.png create mode 100644 assets/kenny/cursorHand_beige.png create mode 100644 assets/kenny/cursorHand_blue.png create mode 100644 assets/kenny/cursorHand_grey.png create mode 100644 assets/kenny/cursorSword_bronze.png create mode 100644 assets/kenny/cursorSword_gold.png create mode 100644 assets/kenny/cursorSword_silver.png create mode 100644 assets/kenny/iconCheck_beige.png create mode 100644 assets/kenny/iconCheck_blue.png create mode 100644 assets/kenny/iconCheck_bronze.png create mode 100644 assets/kenny/iconCheck_grey.png create mode 100644 assets/kenny/iconCircle_beige.png create mode 100644 assets/kenny/iconCircle_blue.png create mode 100644 assets/kenny/iconCircle_brown.png create mode 100644 assets/kenny/iconCircle_grey.png create mode 100644 assets/kenny/iconCross_beige.png create mode 100644 assets/kenny/iconCross_blue.png create mode 100644 assets/kenny/iconCross_brown.png create mode 100644 assets/kenny/iconCross_grey.png create mode 100644 assets/kenny/panelInset_beige.png create mode 100644 assets/kenny/panelInset_beigeLight.png create mode 100644 assets/kenny/panelInset_blue.png create mode 100644 assets/kenny/panelInset_brown.png create mode 100644 assets/kenny/panel_beige.png create mode 100644 assets/kenny/panel_beigeLight.png create mode 100644 assets/kenny/panel_blue.png create mode 100644 assets/kenny/panel_brown.png create mode 100644 examples/full_ui.rs diff --git a/assets/kenny/arrowBeige_left.png b/assets/kenny/arrowBeige_left.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2fdaae0a322aa0b01767f6838018fbe99f031b GIT binary patch literal 556 zcmV+{0@MA8P)<h;3K|Lk000e1NJLTq000&M000#T1^@s6LLeTM0005HNkl<Zc-p0v z%SyvQ6o&H#K7x<nBlr|<+=$xf!iDa{g$UxJnAA{gv1nqb(t=7U1ziYAte2|whNL%F zK7x-h<{v#_G9+o*7XD2-^Uaz6Tt-nw_@!5;#!OvZwlb*=Qf_N{d}tsxTbgPgX4D^h zXOW4*Hyk(+aDRJt($dwc2&!0XtZ`XjcNaN!lwIQAaA+c+sn5@NSN;%z=cP^dUN5q* zx2mu9^Qj+otbg##)E2%8hKK<Cd?*Kiq9Vaz{sDMZ(Rf5rKnOSBR(N*B`d7}cFsEkp z1(L89`%ozyiU?&Ol92=^s#aX*`w^r9AH@teudRWBB&v$PjQ=MGB{M8g^4H;Dik231 z9*<e4VJBAa<t*SY9N=Kez8G=$sl-~hd(3r=z5*P3U}2yl$m6h*>NZbU`~Dyn+^Xlp zYnV5J=Sy4@;JS#+b+V!G-fM-gL-N5Wq~|8&I(FjP769bHz1a<bVIBU*jRSQY)_L-v zk;_ob1MCX*IeIjv46(IwfZRC910^taRzwXW@qnn#q*_h{4!#!N_>`s{e1!!NwRGZn zoMb+eaPUaalV3@~dk4|8^b4q(y0oQr1pEL104;PySaefwW^{L9a%BKwc`jmXZ*OE| uc`jped2n=ZE@^FHXJsx>PDe5{MQ&qnWMy)w27m4V0000<MNUMnLSTYgocmS) literal 0 HcmV?d00001 diff --git a/assets/kenny/arrowBeige_right.png b/assets/kenny/arrowBeige_right.png new file mode 100644 index 0000000000000000000000000000000000000000..166bbfe83c11f9f8918309bd790fa0b8b1923ecd GIT binary patch literal 542 zcmV+(0^$9MP)<h;3K|Lk000e1NJLTq000&M000#T1^@s6LLeTM00053Nkl<Zc-o~^ z%SyvQ6wM#_34Vf~;8(bDBWj}y7rGM{B8ZD(QbV!DqK%<S3o4-$bRj6QKC0FiVr%Ql zPw*4QoGB9~(`1s-fwRbC&YgSixpy?pUxkgyQ9GAeV<?;YVs?3AMElPI!G2Evakl0O z54^Jt-9gYl5o0rm4)P1+=Bz+k=OyCWE1@8^sn>Tmr^l6u*=gICHu-v~2Y78($Z2&w z6u_70t!&OtDG~FeJl^kWGypOR0vL1OsD-o+NHglhBD#;q<ia&V0i<<+1Mm|z$%y#? zUc(}_;*z`$c)$k~EDbRa6niLupFu#*UaAr^Kt|q4(4Xn-rO`PFuqrF=fY^_~>)d}j zA)hTLJ?;+!a(3!SXW-`#&q_q+dWZBLszWD+TOz&OX%?k~-P=9VYahj0k!oDZ&W!P{ z=s&wLgn60?WRf)x>O~tz^f6Kk5ngRm4G~b*?jQ{LSkxD3M(G!2E9TqC&J*=Ty1ag@ z5qQEuD`za}NM*!GFR8OAVbbss=W(O5N>c^IVFSZsTq@lvNCz9m8$@~j#$8YRod+o2 z7{dAmfp5A@n{PF>0000jbVXQnQ*UN;cVTj60AhJAVr*}3WMp|RV{&<LbZ;(cZDD6+ gE>KQKGBibQV{c?-a;OG>?f?J)07*qoM6N<$f_!}HNdN!< literal 0 HcmV?d00001 diff --git a/assets/kenny/arrowBlue_left.png b/assets/kenny/arrowBlue_left.png new file mode 100644 index 0000000000000000000000000000000000000000..05d3b3b7bd788db6abf3351e1eba315c0f6f152b GIT binary patch literal 539 zcmV+$0_6RPP)<h;3K|Lk000e1NJLTq000&M000#T1^@s6LLeTM00050Nkl<Zc-p0v zTTa426o%P>OK=G;!KL`d3yPIiG2RFaQY(Zams)5<jglCRaS1HJCAb8ZF!mof<g}TV z0wn(n?R@9-KbOhnw)o}q<(;A_jtxsxNQJ`X?#4hIHcasxf@Y<&Tgiq05O6Kv(MfgR zI2At}bX9R>yYnKO?Xk4Z?KwOQnh97ms|SWv|K-4Hy)S!%i42~;m-0uS%dAuVQ@)wv zk6_3Mz=8h}0dggRb^Za^aE2<QBp`$@P~gz6RR78s_tI$wD}f}ui*x7{1x1E&Ac~O% z#&uJBQ0I|k4nFb<cY1GY14+~sl&vZbT4qyV#9vEH6_~Q67rOm->2_Z;i~J{l;lMoO zMfG{cJ#QkNRv?A#trXxm0}CS^K_2T`$_x9o<&IOqc5|ff;l&_K(}n=SkXiliQ41di zU+O&+AB@A&^<K1(SpePG0)QGc96thvb$E_1j`Xo^^5Tmo-iEvmuuJQ6;%c;NE+1_K zhz}0xKm|<Q6^YA;1xT7q*2}XsZ;Nn!#<m@Ng#{3ebmo1WWj`-(kTCF8*Awfc3Kv~V z|EGRZlbVDm2LJ#7Ep$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1jX>DO=WiC)o dM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1gZK>1Y4| literal 0 HcmV?d00001 diff --git a/assets/kenny/arrowBlue_right.png b/assets/kenny/arrowBlue_right.png new file mode 100644 index 0000000000000000000000000000000000000000..51fb299c4537f2a8b5a16ae0089ab0e41e0eecec GIT binary patch literal 525 zcmV+o0`mQdP)<h;3K|Lk000e1NJLTq000&M000#T1^@s6LLeTM0004-Nkl<Zc-o~^ zTT;R>6lDi4!6mo^m*O8kC?c)m`07BAT45;isD+NGqs%xmj!R$(F2N<RgqRaeCk-(r znwj&_N6yVX_uQL8fvr;MbhF|TPoV6O{bI4UQTWdS0V7*hk1nYUysJ3m9zp*^jLjf& zkA2$iPHDIIK+n7|8|09@?;X^)?TCL)+Z#O5<nArSU^Juk=1|F^`B8T2J66Opsf<zl z!UG_qG=M`sQ43=okf!d$D&om2Z3W|O08<^{0Q`haCSo~2&`xOW<l0;ZJm3Qgwhplj z6niBA%OE8eFKvkhAfxOg=r0PmSV!kPz^bCSg4mOFhK^zXac%U6&ndY$wbmK<nfOsI zf=)sQ(QNg^%q?0k`|XL5uoF&c#Qgo66}iT{)$=Xc72{;CC2L;Y@=QQtY#vrG-Z-j{ zk(x}{3SzDy0-D>MEHXY;^+lRG{dBexzSVY~sxQ)&^%ISt_;guu8=-Ne3Sy*}*ID0$ zIm1Vt#}|zoo+_|1Y?$FOF0F1Ael4+$>J4H&e+}1@C&T*2P}UbuPEu6Lc&!lt001p? zMObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P)<iOG(~P>Z)9b1s0M%T P00000NkvXXu0mjfaGL1t literal 0 HcmV?d00001 diff --git a/assets/kenny/arrowBrown_left.png b/assets/kenny/arrowBrown_left.png new file mode 100644 index 0000000000000000000000000000000000000000..de9961bc391b207b163a09827fd288127b163d14 GIT binary patch literal 562 zcmV-20?qx2P)<h;3K|Lk000e1NJLTq000&M000#T1^@s6LLeTM0005NNkl<Zc-p0v zTS~(~6o$J4m*5h7@J$3Y5fSl5LB$HSHfb&Tpi;Dmc(+Nh)FOgXL;{K^6qTalW0&9( zT!Kp&^G}`hBuvt@E&MNO@|`pPxlAO|#V<G4-;>wW4O3SRh0bCFy&VJbv8gGRp)0?I z^eCgkGX!i4XsnD387bwBg042F*z;+eJsvHw^UN53hM?hq+VHZS$u|X7cB1UHkYrz% zYmPoHR-LQ^{o}rA%8!5{BLHi~lnY4Z3zqo@ptZNaGx7sMH~|OSb_M!ZS|4Zk2a7F% zLU<S7p;I^%8G3;zMi>~?b#|tav7KZDKGF(TjYQi(A<-2gTV5QrOs7EVuc@nb4i?#p z7pnO<dpeGV)_W=K@)r&?iuPZ9n(>R7VAgJw-E2*?6yQ7|+d@}I2#;kgRV(W3VShdl ze3zS*_i$qn)Oyem;JC=FlAV;oKg${Z9*PgfNpi5y)yFh|Y-|BQ4Q{umU0_&;|8Zhh zAIm1syJ);^Nb3N*q(1wtM%%A49c={g4i4%d3K+O6{FV_7;5V7ht_TCB0kA&3+YY|M z0!WN>=zSb!KMNsnSJzXslbZJ(B(9}D_NWG&)cb8Z0000jbVXQnQ*UN;cVTj60AhJA zVr*}3WMp|RV{&<LbZ;(cZDD6+E>KQKGBibQV{c?-a;OG>?f?J)07*qoM6N<$f^li_ A*Z=?k literal 0 HcmV?d00001 diff --git a/assets/kenny/arrowBrown_right.png b/assets/kenny/arrowBrown_right.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6b571d6f308991f5822300c6f8ec770bbdba1e GIT binary patch literal 542 zcmV+(0^$9MP)<h;3K|Lk000e1NJLTq000&M000#T1^@s6LLeTM00053Nkl<Zc-muN z0D_h%EBW>mr+OG}O?J*N4>jgzpag&nXiIT=-;w6>9~pzh+LN8;gDfS>V31~zL0uVc z|CcsI|6kD@_kVJMFRCS}PV3te9qman80Om5Z3+LkPt1bjbsb6nXO;z_`{I0CvO_#c z1|u7aj5l_tf-L~~2xbA$m-j(&fj1sN-o)l&biAc6{r~*xa1;yh#seq?fE0l=;WHT7 zf<<+a|9i7N@W%s)1Cjtm7%>JTV^CzHTLAI_+;Es6sRqL^C>W7b5-9v3NiM~CKQZA< z2!oO;EOMa+JJlnH^XA^P|H~Vrh{mg1<KTwFT#YqlfD}(J^dgAoR|frG+n#{oVo++q znwIC52jDeuacvkdeW&0|ir_GAO0v;MP8D1GGq4&qv)Bjh6HqYW%{;*P0%sibbPVzu zvVpTp{lH-evJhW(2N{T(j?uyw<V|ehhb>vb(k<4UhaSEl?;?jEEF&Nr2+{+@{dkL1 zn86_L5z1NMvVl<HgI*p_EA|I_6@<|X8&HA=6_+H{D&T4fs1dyeA-Vj;RXrisc_2)3 zje!OLOt1!62WmFl0000jbVXQnQ*UN;cVTj60AhJAVr*}3WMp|RV{&<LbZ;(cZDD6+ gE>KQKGBibQV{c?-a;OG>?f?J)07*qoM6N<$f|~B*YXATM literal 0 HcmV?d00001 diff --git a/assets/kenny/arrowSilver_left.png b/assets/kenny/arrowSilver_left.png new file mode 100644 index 0000000000000000000000000000000000000000..8ed60b705238c5782b255868c5198233edbda554 GIT binary patch literal 521 zcmV+k0`~ohP)<h;3K|Lk000e1NJLTq000&M000#T1^@s6LLeTM0004(Nkl<Zc-p0v zJ8r^25Qe!yj*uhd2suiQz!7qU)Kn=zHnwCTN*4%Gx<HW&3WV+W#luyOu<^h0pz+GP zEP(Vk#{OpZpT~|yPy8m6$;*5`AA6qnNt(@OuMY$9aSQx*UH8xTeZhri2zVFJah&%S zxZt2L48?A@6LB1iAPD3$1hoZzw8#A6z|CeO(lixK(_D2t9<Ny&{ex$1^k0G@BLIt{ z=mEL3;35A2jG{<pqys`YL1)Fn=-+a=6x;3gCXj@8JMdUSk)aAiF>GL5tJO+=k0eL% zkym)X-`@=+QCCp5vN&j&M}dmJYYC=o>4mDQL|K;BI-k!yf8l@xQ}ubqbzO@r%f#Vu zxGBK#4J_<+1bIBvQm4~N<aurc^C9W=aJNX-rXj#_k(myDxm@IXC_Wg|>GVzQ<F#pQ z0YD9sB<X=+9sb9Odwo1KdFrB3+mP1*b`AQhTaB$>UwpI?Kph;^feL8c6}n}_1L!7` zdf5uh17Lls+YY|M0*FT1dLP^DXA%NGbv;oh@%s*<Yv~^x7)4E`a1K!b001p?MObuG zZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P)<iOG(~P>Z)9b1s0M%T00000 LNkvXXu0mjfy87mv literal 0 HcmV?d00001 diff --git a/assets/kenny/arrowSilver_right.png b/assets/kenny/arrowSilver_right.png new file mode 100644 index 0000000000000000000000000000000000000000..be71d37da86af30a30c960197227656aca4aee1b GIT binary patch literal 510 zcmV<a0RjGrP)<h;3K|Lk000e1NJLTq000&M000#T1^@s6LLeTM0004uNkl<Zc-o~^ zJ8pwO5ak9rLXMCl<S02pj*ugyrg8xSgM=cNE|5h@fg%bD#3wc%W2zis!$Vp$Y}N}T zE4{*a_s!0mH?x{HEYma}9mjd&*zfnRx~@NH|5+fgZTs7GT}FX#Lx3HE{)rfeLF9QJ zi{qFjNy3iD<1EOq=fkqB=S{@?wrQHOzV9a#MZtm~m<1SQ`WynhY$B$l6qn0o41kPC z24AR!vJOa7c4HB3+p;hWX91LTfCI1zhg8HgKomvna5$*zfFJk+1zST*fnrMn>?U&l zaVs$gWTZ}l{#=gJ8l9H_tMcNG#E3w3?z)auRka#*T~Flv)>3C+bCzX`D9e&HP4nx< zaEsK-Xbu(O`Fv*A>-DY`M~w}`c%rVj-EMaYkqKm4Xr9y9IHHe{8YRo~eAEyDRqYPK znU6(%k)}*PnXR~QrJX10i*%`eyb&lN&J1{0j#N&J^p-jcdl!d~IFEhbA5#UyVFSZs zTyA<*kPZ%tFUaQkd+&LoZyvDu#SqpHr3ysk{hNar0000jbVXQnQ*UN;cVTj60AhJA zVr*}3WMp|RV{&<LbZ;(cZDD6+E>KQKGBibQV{c?-a;OG>?f?J)07*qoM6N<$g3?ji AP5=M^ literal 0 HcmV?d00001 diff --git a/assets/kenny/barBack_horizontalLeft.png b/assets/kenny/barBack_horizontalLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..801e6b5b29ba00f5009a9fcd462cfb4dabd77931 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^oIotZ!3HEd8@_k|sTxlg$B>F!$q5JeS{ftdI<7WE z2**y6@A%qyLxT4(BmX1?kL^YR+6)_Id>GZQu;eOCV@uLB;bF51&}n6EmR;F?m}Q63 z1pbtd8VuT(R2DF-@o1EA4GIZX@##^@OA;|;+Q_2ls&K%uM@b-oIVsSoD<P~~D5zzQ z){%rRhNeuulQFfsrvlxfTjCl~5}cn_Ql40p%8*p4mz0yApOR9kmt0g?P?E2gnVXoN gst5Ftk%?<wa(+r`(F(TucR-B{p00i_>zopr09=qt#sB~S literal 0 HcmV?d00001 diff --git a/assets/kenny/barBack_horizontalMid.png b/assets/kenny/barBack_horizontalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..319bdbc38ebf193cee5310fdbb35ab589a5a3475 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|c~2L|kcwN$2?+@X%Y>HAa|{YO zw3w||$|UQ;3dbo43_;sfa;IJ|n+H^?TjCl~5}cn_Ql40p%8*p4mz0yApOR9kmt0g? oP?E2gnVXoNst2^w$iy`-IX@+}Xa!sSJD^4ePgg&ebxsLQ0B8Ix@&Et; literal 0 HcmV?d00001 diff --git a/assets/kenny/barBack_horizontalRight.png b/assets/kenny/barBack_horizontalRight.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a850f506334abd9d52f64f744c7387cab7a279 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^oIotZ!3HEd8@_k|sR~aQ$B>F!YcC$;YETexy_hNN z>d0+)Xhn-c$0D)6|M!1w5_BobnOIOZePW=}B2lp!4uMZ%8ii*WNF6+MCO9_c_e9Pw z8$KQ}60@`xUY!2u;WWdhMssoH!>3i0f2$hpcYWm@vUCyOrjQU1{dJ1d?ILz--&=I; zf9d}_M=JSF@`@CG0J=f9#5JNMI6tkVJh3R1A*oU?DJMTaC8bg?xu~+BBwsHxH!(d` g59k>q6W6@t{FKz96>RnIfEpP*UHx3vIVCg!0A|owNB{r; literal 0 HcmV?d00001 diff --git a/assets/kenny/barBack_verticalBottom.png b/assets/kenny/barBack_verticalBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..f0e7064bd2886df713fc7e548b237c3021e6e259 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&P!3HGl@7M4HsQ^zG$B>F!$q5Mw6BY@jO;|9^ zu_?sBMIuE&U6kihS_4xc7mpxwlG_YN9g!AMc4nyr<%<TK85<H<bpn<PJ(d+?V`6v` zA1A}s<@i+MqA4ST;&WaV+wxB!D|Aa-BT9nv(@M${i&7bqD)o|b^7B(tD)o|!Dho>T m^)ho4(^K_;jx;iH%}dTtNiABzR{svDk-^i|&t;ucLK6Vunm3jJ literal 0 HcmV?d00001 diff --git a/assets/kenny/barBack_verticalMid.png b/assets/kenny/barBack_verticalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..2d3e8fd2b5e605adb97a592da9c0d528c352c1f9 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|X-^l&kcwN$2?+@k7759jW?Wei z*zCqD701TN;3K8*va7~T7^qCQ#5JNMI6tkVJh3R1A*oU?DJMTaC8bg?xu~+BBwsHx jH!(d`4``o}iECbReoAW53by)pK#dHZu6{1-oD!M<yw)g7 literal 0 HcmV?d00001 diff --git a/assets/kenny/barBack_verticalTop.png b/assets/kenny/barBack_verticalTop.png new file mode 100644 index 0000000000000000000000000000000000000000..543cd193f4438d0971841dc245e78dda4b4de964 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&P!3HGl@7M4HsWML&$B>F!$q5JeS{frHJFYg| zkm$O)An6c~3xl7+HJ3|0+}Tc7ADOU3E>sfGX4ohqqU~^Wg6<<n^A^cf4*VTYCzw1w zR1~oF*9*PiW-pJ49i<ES8rat;PSkTeekp*xLD@l4SI6UMQGk5oTs2q4Yi&C_f|{o= ziYW<{tmA#U73c!p64!{5;QX|b^2DN4hNMcpq@4Wxl$1)n<f6)gl6<|)+{E-$J)l>N cOkDGl^HWlbR<PB-18QXOboFyt=akR{09Fl8{r~^~ literal 0 HcmV?d00001 diff --git a/assets/kenny/barBlue_horizontalBlue.png b/assets/kenny/barBlue_horizontalBlue.png new file mode 100644 index 0000000000000000000000000000000000000000..5367dba38591073c177329b2d08825f0decf9eaf GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|15X#nkcwN$6W-kUIA3Z;V;0-Y zcfbD3m#Vm;P$i|Z{m;YttOtS3FETGY@OE!rXT!ws^<`?3(9&JEfqHdITq8<?^V3So z6N^$Ak}CC*a`N+2QY!V5iz*9B^7S%v6Vp@mfQ~RSam`E4Pf0CW!B+ncsFA_b)z4*} HQ$iB}dnh_$ literal 0 HcmV?d00001 diff --git a/assets/kenny/barBlue_horizontalLeft.png b/assets/kenny/barBlue_horizontalLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..0245eb3b533adb39089d3b5d5544f3040ce18938 GIT binary patch literal 341 zcmV-b0jmCqP)<h;3K|Lk000e1NJLTq000R9000sQ1^@s6iGcJ-0002vNkl<Zc-muN zzyd_uw#AFJZ=WyTzIDH3`?m8alHx5}{egn-B|CTgN5*gkB5m93VS)-%kNwwLe&@g5 z+9&_@H#~<Z5^LJ54>Lhy$<6<!yFQ~}h&An7?}HR5&pwBt0IUe)NRR@#Nr$m204oCf z0H{c3)dSp$V2(B3_MWgJn1I~!hZvYhMNqFBZhj3`q_pY@7DXM~)`Jv*0uQ7}cgtH$ zMc9HsWBm(MMGWPu__2ky&Zam2<ySm{Dng4l^@UflM+;mbFj;^UD$Y0sj$8~yU;wfD zJkF$op6Fna4#EI_0bcbE70d7d001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(Qrc nZ!T$VVP|D7P)<iOG(~P>Z)9b1s0M%T00000NkvXXu0mjfLs5<J literal 0 HcmV?d00001 diff --git a/assets/kenny/barBlue_horizontalRight.png b/assets/kenny/barBlue_horizontalRight.png new file mode 100644 index 0000000000000000000000000000000000000000..e94c0c61e76ad123581c93972a91659a6ce7cec8 GIT binary patch literal 335 zcmV-V0kHmwP)<h;3K|Lk000e1NJLTq000R9000sQ1^@s6iGcJ-0002pNkl<Zc-mu- zY~OZXynX9_vG(orMccN;GhhRfojd-c;P!3r#ap)eqbSnf@ch5t+9&_Dmf!iWF!dN* zu}IrCd$=OgU7!CWV~r&@;U<bTZPv%C2!xeqp93ody7fLzMIbCU=`dI!*fY2k>8yGH zGi^UkMaJ9S!#%+uxBTIMbPQ8SnIffCPrwQcH@}7l1%@KsEpNe!K!FQZ)Uj<niXx5m zFR%vzNK$^qqyIXa-e3)NhVoVX7(t-E@G55f!6ZSEtT^Ko%!KnO5sW3NoCjNhEj@uE z6IY@G08Xl2^?|_-ga7~lEp$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1jX>DO= hWiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1hLDjt>9; literal 0 HcmV?d00001 diff --git a/assets/kenny/barBlue_verticalBottom.png b/assets/kenny/barBlue_verticalBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..2834db913084b0aa6402b3e2b8db40d1b54771e8 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&P!3HGl@7M4Hsf(U2jv*Ddk|(^m^HILVx4f1u zdFNC9jY%_XtlD0tPsq9dP40-ny>D_l3pac+yvWx0MS<tljcsyAE=1L_>#W@QP!uHA z@TF^e{@wEmx3=lZ9SNLK#k0;K`7ie(9;TO!FGX|j&N|P)<nVs3dzmQ5>zu0QN4_@e zcAgK|*Cn4bA>wjcZA8RM{XJdA35gM<_gpJ(bZpQ0n(n}+lzaP4Vw>hUi?8wdZ-sf7 zdCd2-oo?i1T*b=D&1}~2#;8W(iR^?ZHYbNQwbiyBhGEPNMIQ_tnHVlCPhxkJw>}B< zoNkG0L`iUdT1k0gQ7S`HrCw4_ett?yrCxGTWkE^4US@7$da52Ul#EPV^OEyZQj1ow S)xQI3WbkzLb6Mw<&;$Tvl7DFc literal 0 HcmV?d00001 diff --git a/assets/kenny/barBlue_verticalMid.png b/assets/kenny/barBlue_verticalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..7629e5527e7a9d9e2d430011c4ab7b143122e5d3 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|ZBG}+kcwN$6W-kUDBt2+Udxue z^C|zvq!~6=Z7<U$Of#-52yAxamC9pdWZ3m0HOWgOKOd+~x5PD~Bsf2<q&%@Gl_9B8 zFDWNKKP9D7FS)3)pd?=}GdD3kRS#&tk%?<wa(+r`(F(TucR-B{p00i_>zopr05UW( ACIA2c literal 0 HcmV?d00001 diff --git a/assets/kenny/barBlue_verticalTop.png b/assets/kenny/barBlue_verticalTop.png new file mode 100644 index 0000000000000000000000000000000000000000..18dda588ea2c163cac750aae5d5b832ed7e33cc5 GIT binary patch literal 339 zcmV-Z0j&OsP)<h;3K|Lk000e1NJLTq000sI000RH1^@s6Ki_;00002tNkl<Zc-muN zzyd_uw#AFJZ=WyTzI8tcOLp$~52ib|tp~|55CY;YTm2>5x4j2x#EaXvofm7`tdG?Y zkOWMj+@!<*wU*!cuebII7@O|;45l@f-2AUF^%&ehk+yC2sHT*!;s@CRk_0IRX~c(B z=Us%k>^+LhVBw%V`y5=c&Zam2l~+FnW4YxIF$@E#g?SSmupj}M{{3)8nj2n$H6vqe zE(7TS=><msC?-H0P?&%ub+^35Fa(!DAU&`cWq`$!@wWG1Nrjb<i8ctN2Nv)QFa}H# zn<2Oi0%4eb0Pa>?WEB*zGynhqEp$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1j lX>DO=WiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1k{NiCh2x literal 0 HcmV?d00001 diff --git a/assets/kenny/barGreen_horizontalLeft.png b/assets/kenny/barGreen_horizontalLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..5b08f21c6657ad089f2371a30c866dd0f7d2ca87 GIT binary patch literal 341 zcmV-b0jmCqP)<h;3K|Lk000e1NJLTq000R9000sQ1^@s6iGcJ-0002vNkl<Zc-muN zzyhMznZ?Jgx0)Zj)?$C$ddu@Dl5y+I{ehD2<2PFUN5*gkk?Sn&VS<@^oc~vx3;bVu zCG3C0^$3Wf@U@2eFcZp7`~UBFkbr_A)~vU<4^ohK$OA(GSP{sPAO&eV9kD6^D+2id zq^SC02yR6%$F|;$C9DW0P<+-K0~4nR=Jlpq(O^Yo7yK|4#jZDB4^jjQJdmQsTalQG zumwTQ)euxgE~}LIv4wWSjfnpx=X@ZF(BrN6gfI4Jfhhzf3y{L>{jT81#ZUwS5UU{y zu_hJFL<fm<5C#CQ<x>tdDFvzk001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(Qrc nZ!T$VVP|D7P)<iOG(~P>Z)9b1s0M%T00000NkvXXu0mjf>V1x& literal 0 HcmV?d00001 diff --git a/assets/kenny/barGreen_horizontalMid.png b/assets/kenny/barGreen_horizontalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b5d775bebc60dc63879a9f100fa2dc4056366b GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|eNPw1kcwN$9rrW7&X=0en8j9V z<MG3v*CtEAmRHN}_22nY6;~9hq)dKXy0}2QpW)RUw|nbzdhP+W>Xx`hlmzFem6RtI zr7|Q{>Lumm=clAp>LnLd7L?@cW#%TPr|JRSU}WN&mz<xHTC{?#{vA*wgQu&X%Q~lo FCIFf^HVgm& literal 0 HcmV?d00001 diff --git a/assets/kenny/barGreen_horizontalRight.png b/assets/kenny/barGreen_horizontalRight.png new file mode 100644 index 0000000000000000000000000000000000000000..407b61b535d91dcbbd524f03d9f52bfd556bf039 GIT binary patch literal 334 zcmV-U0kQsxP)<h;3K|Lk000e1NJLTq000R9000sQ1^@s6iGcJ-0002oNkl<Zc-mu# zTW@(jcCE$!xb;@^qt}_mGhhSp8?F8$W1!;qaqG<eQ4}>?kN97ECG3C2xxoLKdz|5l zBiC8l!xeQrNcfM8%TD{lO$=XasE<_<2<IL0fGV`Ok5dr{r|onED+GH6m!j&6Az(!y zpW{^2dN&sC35Mdc-v7}tOd(~8$}aeU6*S$7h6e?PqQ+a1U`3$71v`Ab`Fa#ZHCIEh z2LVX3<ebm{h8q!BL)~SS5<f-|6rb?Lj6awpD3Y`HyFyK{JdYB=m`TO*JlG0s=?N5> zxDp)zI{s4*mC@1&0000jbVXQnQ*UN;cVTj60AhJAVr*}3WMp|RV{&<LbZ;(cZDD6+ gE>KQKGBibQV{c?-a;OG>?f?J)07*qoM6N<$f|wDEM*si- literal 0 HcmV?d00001 diff --git a/assets/kenny/barGreen_verticalBottom.png b/assets/kenny/barGreen_verticalBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..1f733d4c07fa0bfad2d060ece7260ac0c573874c GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&P!3HGl@7M4HsjHqYjv*Ddk~{8ae3fspmQ!gc z{1}<PMnbK>FY%Y;qifN7*$t!KA8S(eI{#ZJSHOe+&Vn0XpS^bM=_+naIC(33p^G%j zCFV=gyRRkLJAbj-Tp^%d+;1G?c=oEmA|9rfj4yj5^XHvsU@CmAdtP}rSBrF>%Yq8w z>DfS&@03R_J;HCMQL}cToz9vr{~wQdA|&)IUa|7e-ckDOAI}MeqPa_L&un<}cisQ& z^(~1K7fQ6Hbl3|!uT}?aFi2oNp?A35@gC#KR0Wo#YtdJlMUssfRM`22RTvne?}srs z8WwT_J*Zpa8c`CQpH@<ySd_|;RH>Jglb@fGQmL0*R9R4xua}vdn4YQ!3@IZM*SzHX Xl+>aXZ1wMe8W}uY{an^LB{Ts52ljsJ literal 0 HcmV?d00001 diff --git a/assets/kenny/barGreen_verticalMid.png b/assets/kenny/barGreen_verticalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..03ff210f290097aadfdadb8d958f16de269f4feb GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|El(H6kcwN$9rrW7%C}g{sWcRR zjLcsnq1NA*_)F4_SIRWw%7Vb=w%Lvhd5hidrNoGs0(I$@xJHx&=ckpFCl;kLBvtAq z<>cq5q*Ur97gZLN<m+YTCZ?zA0j)POam`E4Pf0CW!B+ncsFA_b)z4*}Q$iB}xuY>o literal 0 HcmV?d00001 diff --git a/assets/kenny/barGreen_verticalTop.png b/assets/kenny/barGreen_verticalTop.png new file mode 100644 index 0000000000000000000000000000000000000000..235afa0b4f1be3e64c4a4b26ed7471eb58e6d8cb GIT binary patch literal 339 zcmV-Z0j&OsP)<h;3K|Lk000e1NJLTq000sI000RH1^@s6Ki_;00002tNkl<Zc-muN zzyhMznZ?Jgx0)Zj)?z;h$8WUy4`#17Uk{RFAOzypnfn6`cn{Ku567*yJRiQ+P#>!y zAPJblw4ILsE6xS}ue}lm#vKn5z;xMZ|NohLoZ$vWuCug9F~nt+5<kcmkR(VkNFzR6 zaMTOxGOPC}E`x<b-XRaT;)WX$|0^yAfN}9zZw$jgYGK}l2P{Y+Wt$ybQSG%*ux4b8 z&1E1xAidxS0L27|0}2z6WaF(!3`1}k1kwYGQ3hBnwcd>dOO~GZCE6g69$3ILz!)$| zY=+=62!vt!0iYF7e|vasga7~lEp$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1j lX>DO=WiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1g=rf~o)j literal 0 HcmV?d00001 diff --git a/assets/kenny/barRed_horizontalLeft.png b/assets/kenny/barRed_horizontalLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8e7a6f84084924da9526600d46c5c8107a3313 GIT binary patch literal 342 zcmV-c0jd6pP)<h;3K|Lk000e1NJLTq000R9000sQ1^@s6iGcJ-0002wNkl<Zc-muN zzyeN2^2VQz7Mg!DT44XFXo2%6lBeT%{m;Y*ygwT&^dA|+6`YFXv4;uXNR#^ivRLi^ zy9%xUAFFgAicW@e>%&ZVR;cp-SECUMhFB9Va37@LZk8N|0<a>GBS8wTCQD#d08s?= z0Z7s7QVraSV2=G>XFymHOyEV9I0hz85zOmfYV^R0UgybRDmon{upXoc6nG#-Un(^* z6=4g4_a#cGigvp&@M8<@&lT$bUuH`{6rso4<9sFT(E?KlN){l6w=-nGk&B@S1VC29 z6k<&(n28P&=^zXMPlZOPy-rCf0000jbVXQnQ*UN;cVTj60AhJAVr*}3WMp|RV{&<L obZ;(cZDD6+E>KQKGBibQV{c?-a;OG>?f?J)07*qoM6N<$f>l3;3jhEB literal 0 HcmV?d00001 diff --git a/assets/kenny/barRed_horizontalMid.png b/assets/kenny/barRed_horizontalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..99da8810a636da75e56777141a476a3349270a2c GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|eNPw1kcwN$7Sh^Z=1a|J%wqeS zW%A3P*CtEAmbYr6>c9C?6;~9hq)dKXy0}2QpCN0#YTBxa_g#TnbxT|$N`mv#O3D+9 zQW=se^^$V(^HWkP^^%J!3rh0!GIJBtQ}uvuFfwt?OU_S8En2}={|=~;!PC{xWt~$( F69D4bG!Os) literal 0 HcmV?d00001 diff --git a/assets/kenny/barRed_horizontalRight.png b/assets/kenny/barRed_horizontalRight.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec2bd4fd1b9336a1ad147e72e0b90cd8a506335 GIT binary patch literal 337 zcmV-X0j~auP)<h;3K|Lk000e1NJLTq000R9000sQ1^@s6iGcJ-0002rNkl<Zc-mt) z6)kZ7WVFEk)6qinPe$^_GhhQ}V}<@B<1;Y=?@!0^`lBfNSf%s-U4_>Fm&I!TZ=^}V z6`zXav4<=A)oAn|89ysjftz?ToLe8OA`rftB?ne`I$Gd9PDLPmHCY0z5bPOTie8s$ zKokLej#JV1Is>>T7+z$F|3}9#g_J3JohJiU@TEo%9uydgzEo<06@da591Kwc>roWF zFHyoC1R%+m*%JRhSEyqR_1!KE{1`#-I9~}f{$P@zNWPsR1CazKACw42Pbwe<U@Net zCs1VKN^}5)H%6#dS(VlR001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$V jVP|D7P)<iOG(~P>Z)9b1s0M%T00000NkvXXu0mjfWV3-s literal 0 HcmV?d00001 diff --git a/assets/kenny/barRed_verticalBottom.png b/assets/kenny/barRed_verticalBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..767d6a4c607e94fc625ef175be65ec02caefa3cf GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&P!3HGl@7M4HsVkl?jv*Ddk}agQzsR@Ln@Tl) z?A9q<Bcaycm-tKa+!2mF?1uZUOE##+J@pXG74YD{v*2<d(`(0`=|{5?PWCU=a*<}a z#C)mRC@R7J@JWw*6#~!QW{Jcc{4J!qh==JV<4ar7qtnkbFfCuidQN#aSBri4ip3Se z)3g2Dx$oS6d*}ea*^3m5?RGkA<eqCk<cW}|o3NOHfA;0VJ^y%4JP1+gw>`7rwxrSj z`=J?$5+9bj@$0Y$F$ZyTiLvD{+)VvpaKc()D^Cl9f!b@wu8oomlbYK(fnJ<%>N(Bh z!sZh||LK;vMwA5Sr<If^7Ns&IRq7?><macPRO%%cRTh-w>t*I9rl;xw1Ioz6H7_|o WCADY;Tm3trMg~t;KbLh*2~7ZtSb2s3 literal 0 HcmV?d00001 diff --git a/assets/kenny/barRed_verticalMid.png b/assets/kenny/barRed_verticalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..934e6f80d48c32fd19067d255ded269a8d157e8c GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|El(H6kcwN$7Sh^Z<Xh@Zr5ZnW z>lCh$Q0wnY{3YqeD`lE-WkFzb+iXV$^$V(LdLpi7KwY{et`Q}{`DrEPiAAXlNtJp@ zIr;f1DV2K3MU@35`FfeTiRr0&K<kZ6T=SCiQ&Njou+_f<YGm+q^>bP0l+XkK__QxR literal 0 HcmV?d00001 diff --git a/assets/kenny/barRed_verticalTop.png b/assets/kenny/barRed_verticalTop.png new file mode 100644 index 0000000000000000000000000000000000000000..35101937914a1de0c7b84c3fe246811b47fa7391 GIT binary patch literal 341 zcmV-b0jmCqP)<h;3K|Lk000e1NJLTq000sI000RH1^@s6Ki_;00002vNkl<Zc-muN zzyeN2^2VQz7Mg!DT3|m2pN$pz528;;39JXnF%SZ$<9Pkg#0b0xX~c(5MGKri8P2Vb z)ew*bOySjJiT^K))&9S$&;sLMjYeSlS)t1R8);Gq10#9tQ4HDb!oUx*1tbYl4AO`X zKgdx48w7GaipyZ(a5qa1uK06>`u{iivS9ooOB};6kXo2G;Q<R0xRfXcSM;$|1*{nv zV{;iu4>%$~5dew_5C;?{AjvP4niz)QG6<vx7NZQXSo&UP0G51}BSo}9AU&{vXMiza zlGqHvWe^C%^aB8M%tT9>O^by9001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(Qrc nZ!T$VVP|D7P)<iOG(~P>Z)9b1s0M%T00000NkvXXu0mjf6@-6! literal 0 HcmV?d00001 diff --git a/assets/kenny/barYellow_horizontalLeft.png b/assets/kenny/barYellow_horizontalLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..79c4b63fdde994900ebceb2c3eed8f52b9869908 GIT binary patch literal 336 zcmV-W0k8gvP)<h;3K|Lk000e1NJLTq000R9000sQ1^@s6iGcJ-0002qNkl<Zc-muN zzyeM#WQae#h++Q8#SHsTEn+y2B6)ftga4UD4DZh_Vfc@X;R=8{>|ug8HwyiKb5!^L zr_*Ntzn-^(C^|WpK_6zq%Yz#K|KIdL!4PW}G290!xW8Q*LjhP3$dMog*Vgi4RRB>0 z^Z`iG`xAz^6~P?)`>HcxMR3703>cU=MKG`bxMUAebdDEO5zzbVL5e_u2Uc{&5K|G> zAh;-xs%ZC227aueeFbRp85W2l^mu!=PX&9lz!ZX#1xVqYEn?uv#ZUwSAgf^tu_hHP ziS9m35dfW7b#d{|y=(vg04;PySaefwW^{L9a%BKwc`jmXZ*OE|c`jped2n=ZE@^FH iXJsx>PDe5{MQ&qnWMy)w27m4V0000<MNUMnLSTYYGKLTU literal 0 HcmV?d00001 diff --git a/assets/kenny/barYellow_horizontalMid.png b/assets/kenny/barYellow_horizontalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..38f37b6c06e4a31b51fdea38752be70e9a77f953 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|eNPw1kcwN$7Q0&>+M60MU*-8# zfBCV!>4z1LC8jTU4%cTr2yA|lbzy<Gd-FOQCI<VSd0{7Zo-+k%)h%(2C<)F_D=AMb zN@Yl@)Jw|A&reCI)Jra^EGWs>%gjwoPt^mu!N|llFF8LYwP*!f{X3vW22WQ%mvv4F FO#t_sHn#u( literal 0 HcmV?d00001 diff --git a/assets/kenny/barYellow_horizontalRight.png b/assets/kenny/barYellow_horizontalRight.png new file mode 100644 index 0000000000000000000000000000000000000000..3d00f789fbbb163d20c5184a9970a02e6b218928 GIT binary patch literal 328 zcmV-O0k{5%P)<h;3K|Lk000e1NJLTq000R9000sQ1^@s6iGcJ-0002iNkl<Zc-mt) zwTR*T$;Ax&PcLGae{vy1JOegxb_v6OWPD~3!~4?<8T?TceLZjW|I=x+|8I`!{=d0V z2(B1tgFRf)|C=8Fk@3re8gLU&&SlWYstAPdZ<huu1iJG+PDLPmZ7nZYA=opx6um!T z2vG#|IZj2tuR6m$0dyh5e+&#&NTH&0ykG@CF4@C_0#nfyL$D%H;6j68J*uLM@;HJ3 ztbhe*f-crj-#wFoA0r5!?Nh;wKbRyalJ9I0gGru8iD2}k0#X3B0$X|lMJBF92LSd# zb#Zm9ZtDO504;PySaefwW^{L9a%BKwc`jmXZ*OE|c`jped2n=ZE@^FHXJsx>PDe5{ aMQ&qnWMy)w27m4V0000<MNUMnLSTXi`ha2p literal 0 HcmV?d00001 diff --git a/assets/kenny/barYellow_verticalBottom.png b/assets/kenny/barYellow_verticalBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..d0cc9d72dcdbe6c404639f66db905b3203fa29c0 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&P!3HGl@7M4HsSBPijv*Ddk}Y<(JhbQdzyBrU z!E}iY$un%E+FqtxZ0>ky+wt-DDr1*VI_ekM8owOiwc6W}2o!s^LeJ%(s^}tKrk9K_ zZFkN{v_E{ZmFJ_vxwE}a9IoO|JB>J&urK+3#i^}^O~7Jn$3vU0)eb+p^j4V{?qGYd z`1kH~qYurzR+iHp<;B9ze_Q#0CqklbOSGJv*>Z8CAI1vI3s%2LY`c3?>D&LynZ`WK zbupXRPd8p^xYE?r$|&tnCTYj>iO)lqS+StX(An0*(2Uuk=!1bH6T@QTiVLn2svUrS z(=Bn0C<)F_D=AMbN@Yl@)Jw|A&reCI)Jra^EGWs>%gjwoPt^kkl97pPUUGg)YS9X| R`gcH$44$rjF6*2UngDpEe4+pV literal 0 HcmV?d00001 diff --git a/assets/kenny/barYellow_verticalMid.png b/assets/kenny/barYellow_verticalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..e2491258bddf717d2026d2f804bd89a935b4e4a4 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|El(H6kcwN$7Q0&>+H?Hh|B~@w zy2OU$88%XFFViJVGp;NMY<A<7%41_>Sp8~V*vEVN{y<&2C9V-A!TD(=<%vb93`v!G zNjdrXDJhkD$wid~CHZ=pxrynidO+)qOkDGl^HWlbR<PB-18QXOboFyt=akR{02#Y7 AW&i*H literal 0 HcmV?d00001 diff --git a/assets/kenny/barYellow_verticalTop.png b/assets/kenny/barYellow_verticalTop.png new file mode 100644 index 0000000000000000000000000000000000000000..18b96ab2111d5f88218092ca0d6e816552326977 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&P!3HGl@7M4HsXLx7jv*Ddk`oRv`RS!}*zfH~ z{CDyw&u_;cZ-m<ZD@bW<lT$hFz%eK8#Dn@Y!Nb)P+-iPYQEL0F{@mzAvMGxSV{k>T z?)(4d?xp|ht#a9p{m-vzcsZTj^xyqE8Z9{sY`YY9ryG4}&SCUy5@|Mhbhy9lbTcp0 zPPwD08wz&pkCj^Zu<PCb|Ib?$e(*52B`Rz+$Unp^rczKTs_yhqRkR~5rRQj>g6)G2 z23H0RH3yl184fW?9hn?_%??!whNl?1m);MbtH^b(NGMmpgJ0)?WCG6)rku711{^Jk zzZf~66-`XCdA|tgPu&vNh?3y^w370~qEv>YO1-3<{QQ)ZO1<Qw%7T)7z0BOi^i(}y efEk&%<|XH+q!z7UtA7X7$l&Sf=d#Wzp$P!?gn=Od literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonLong_beige.png b/assets/kenny/buttonLong_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b35372b38e503f3e22f3a05c529cd04d82991c GIT binary patch literal 646 zcmeAS@N?(olHy`uVBq!ia0vp^`+(SxgAGWgOcI{Jz`!Kp>EaktaqI2fXfLKfhW3w} zH&44D6yw$!yO8^ChsG8;BV8`9rA}T;oH~r=t`kwU-P$tE;Ol&=N8XNRVds9b)ftGp zJ^f&KLZi6nXN26|x9fhn)_q+#P5<=et9|?>R<}3b3VXb)@}eIbr(VG8_ZP1h8SehP zXUYfu&B={>OZYE*%sHR6TkwDM=VkAn=4~kqnvuLfAT!H`<Nw;q#Z%q&Z(BrY_WX`3 zytH5c{NEdeWjj9ZYV}!PA35vSx61pr;u*`PUEPv<GVW_{?8e5{zsI_EOfAU$<I-=i zVzK|>>1BIfetqcU{e0?YWtaYdn#!a3;XfE2GPm#x*g5=gh$v}p`S392%eOGKhlfwT z;FR~<VLR_@w{+p5_Sv)kGdcfwu#WFx^9M;4kZQO#WX67>ee<l2Ivm{jp;P``oBy8z zqndf)oX-!bS6N8fU2MKR6QsD`Y~?$Dmh;VtIvn>U%T7tzvaA$-oL|Z`!JhN~x=o^M zWO8`e*!{k{b$;MqyxmH-?)T6CkKfy8Ma}o^U0rILzsmh(!s9myjWa(2gC%C|>dMW# zE${C5WBgQok=@nhD=Ihdvw1RqTG))QQhouiv+ku#YSxd^eD<vNcddMf)Yi4fuI`#; zp6$(SeTyMx;WOVX!+U2F4ydkliJyLPk{{n1BZY#-DD$)4YJ&Z#lm4FP;alX9ySni9 zZ|$NtM=p9#pST^EOms_JBT9nv(@M${i&7bqD)o|b^7B(tD)o|!Dho>T^)ho4(^K_; e3C+mFH7_|oCADY;Tm3trMg~t;KbLh*2~7Z!?k+|E literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonLong_beige_pressed.png b/assets/kenny/buttonLong_beige_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..25378784c18ce313bfe6ec505cef5d962f8d3778 GIT binary patch literal 588 zcmeAS@N?(olHy`uVBq!ia0vp^`+!)NgAGUuv|TJ<U|_uE>EaktaqI2fyIzM9Bo2JM z8#(=wYDt8Mi=(_qE4$<J+6MJp@02AS9RjsGZ?d~YxyLq5-%t}*+osOCZf5TL`VY-3 zb)G&wKS8ouCVkJ>L*1=)Pv-9_{j=>y#hN1y_cG64+Gg_3C-0L=H;c5#>%}ju?=7;c zyl>Gr``xxc+gP?D|LSSmCjV$ZYyI~^^)&YDj-9Pe3q2pJ{Ym`X_vVX}dF4mF8=Z%L z#r?UZ_c!YFU5|fx1>1zmrGE#@o4?(7KqWJB*0pJ0*1Uhw$2RS&wD*zBLsx%v%0*7- z+s7M!=8^CGS?nwOvVYHZ>G%0lacq9*4~B=#E&Kv@4nG{io-lDfJiP10*C4frhflrW zln<-Ols)$Klhnh*ev|(*IsbUDitl0bhe#EWYPdFJM!nF!JEdK%O{EWo?bq<m|B;yb z<IZ}aYpwoYHW<|`VxMlzc!-@t-uP3&*6erehoc1cnU<vV-eJ+~|F~S1!D#x2-*-<p zzPWPh^|RL5ufzn;8CFf*{^RTC|Htpwf7$H$IPF{RlUg<7y!>o;pJUFzAi4Cb`bqd1 zmtxz$#-D^;MdqwmTWseZY<FDv+{_%l*J`t0U*q1Z`t#l4M+-WZ<QiYB*;C7SLw4P> zQ;$uafug*`HKHUqKdq!Zu_%=xsZuW~CqF+WrBW}ssIs6WUoSH^F+Eiem|ToZT=SCi XQ&Njou+_f<YGm+q^>bP0l+XkKwAvcB literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonLong_blue.png b/assets/kenny/buttonLong_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..cbaf8d7817a9bb52324e9bdf9df811638a6a5bd8 GIT binary patch literal 645 zcmV;00($+4P)<h;3K|Lk000e1NJLTq006!K001!v1^@s6WReq*0006LNkl<Zc-rmV zTTa4207l{2nM-g5fan4Ys9e0EAjrjtinrPrpL`HvT!Kqr2`<4URQ~E<Uo-)WO6N5B zk^)x9<k&XFbd32}E^qn^*Z$zn^B<nYzkLjVd1rf8+iKiI7d^=!!3AnPjNbDeGWN+< z#}BqE-B7+z2j-sbS#6Jx0;A@Q=MRQ@P&>S2ppa;4{QdN2Ff`%r|EB->7qZt4cB`l1 z5B*eWyEFd1YsE%Tshv%{-K5(BQEFLD+m`HJ-`Eu!Sln-{h^GnH#!vK!gF5;$e0w;E z+ulKMs_n`<M?{ZUe7nb=Rrmnm1B4F{K0x?DTy%ki@Znta_EIL{!^!9gA5Pe>p9dS| zCgH<P(SLy<d~j8V@Im+t5(pn4e1Px)!UqT+Abf!E0m26eA0T{y@PS_mUw55ipx|8i z#1Ch~Cw@2?KKHAHbKw&`oD84n!R1VV@BzZdjO^^6g!hACEC}BjcFG#v1Zf`QpLPO} zKMB8gaUZS}H{0P0Ta{xX{KM$2d5hnE{{Q&>kDAtJQ{!q~&6{TXeHz3@%VTCdB$^sm z>uTPt=Bne}fAo+5Byp-wQS&CdvL4hAubA~3PEhM=-ej`*SFIFEt-zk|14*N{)wo($ z^Cq*Lf6@cM6>8q3)44?k11?FWatlUFdMSU$fWQT6-9(pkHkTQl`@AqXNaX3wsBJZF zdw&D}JT?C?QH9+A001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7 fP)<iOG(~P>Z)9b1s0M%T00000NkvXXu0mjfzVR-K literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonLong_blue_pressed.png b/assets/kenny/buttonLong_blue_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad0b5c2c60076b7a300246003fb4a8fbd35500c GIT binary patch literal 576 zcmeAS@N?(olHy`uVBq!ia0vp^`+!)NgAGUuv|TJ<U|>Aw>EaktaqI2fXum@aA`K63 z&h#$iRJ+H(%B`f3bR?Q1*VOKER!oz30;k?V)sXWiR@Po@i8@mDPc6PFW2#SGbdYbq zVRx>Oi}YoKx(|nMc5}R+FSOvzmh{YMDf64Y^HL^0V9LDf_Wt)~-`XMzuF1>Hw{81g z?eH@5{H3xgu^$=tek9sV=ik-L$=&KT`I!Cve@BXw`Tsk9`6_)$PTl=@__yx5)%RqU z-Y;K%&416kua|!7?$)26s_T9E)+D*Fy>=H4bp1OhR5-7|v~H2R;F87php%6Dym(99 zeCN09E$2GrT7P`(*uUxn;~{nqd4-yW4~>gXunHY&FTVJCsn4PI$rpv~=3IDrSFO4? z_)z=oP5+ske>_;l_ptdxq>6x@!w-gs%q{%rjC!GccS^fjn~EO_+t1;h|KnlGk2~vy z&b9h~DKM&8#6H~^Y?=0@S24GKAKW0;@}5UFQrX;5EBQ|)d&3&lKM&r0^p(59ckYck z-(GH|nB*_3az4I({lCBd|HbQSz4~qY_bxNe`|UjcWW@@T%sXxJF6YY@?Uehsc{$4h zt+Ln5x3`te^Rr0bWI1Pc&br$s9owGl<?n9RnzZe$%jcut_$JI;nq%s=dkrX>OI#yL zg7ec#$`gxH8ImgXl5+C%Q&KARl8Y(}O7itGa}(23^?*sl$iy`-IX@+}Xa!sSJD^4e MPgg&ebxsLQ01Ful%>V!Z literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonLong_brown.png b/assets/kenny/buttonLong_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..299dc59d80e91af63053fdc0fe26d6224e43fcfe GIT binary patch literal 657 zcmV;C0&e|@P)<h;3K|Lk000e1NJLTq006!K001!v1^@s6WReq*0006XNkl<Zc-rmV zUn@g#9LMqBqw;5w8M%<K)ABFbv=JK@S{ex#7;zz25?aWGT*!r7dI%oE9)gE(_#A#~ zH<a11^Lw9q)j3<o^zH4WL+5AA$5x!~?%GYqO1qh!C)u0r^?_z*dsf?O+*EIRks-l} zAB4Bo->>xPXwtrTwvzB~i>bilQ5I-=wr90%J6H3jn29~>;BsS}K_S%Cco6<u^F}-S zbA6RJuhvKW(yHelFZKV}?aox?>pmRL`R9e<Z=d(wbAf7VSxwuP>{Z{`9UEA^KUfjh z60VJ(=ur>q=+p3}5g&TGJXq6tH(QfLkGlBsir=X40m26eA0T{y@PT^K4HCkKbJ5#d znS>7~qbGbg;Uquc-ydWMA8xAt7Z}0^cXbFKgwK#b_yFMpgbxrtK==UR1B4F{K0x>Y z;RA#Z{7U$G>J)>5bKw&|oDHA&;bizcuM*CMPxNpye4+=pGXcT}2p<h{v6cv)2g57~ z-x+qv8a)K58RM^Y0gyile>)uucJ2>mf;X-=$B6I`qqmwZe*69Z$G`um>Gzq=1g)!i zvzdwp2c@-9R>ni9sd2Tg=1qRAqjLFY$xnoRsZUY!W-$@**OO6Jy@nIix|%l&UgSkP zg^5nz{=N@{joMb@YF*8ntk-&{1Hct(-elvgLkt5hnUA-38ErW)Qeq%*fm%1!+kCtw zne*Dp3<u#1zOAgrZSSw~82;<TdE~tS001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Q ra(QrcZ!T$VVP|D7P)<iOG(~P>Z)9b1s0M%T00000NkvXXu0mjfX;L>U literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonLong_brown_pressed.png b/assets/kenny/buttonLong_brown_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..ec0a49445c98f2f9dbc6285973a913eca9ed7be2 GIT binary patch literal 595 zcmV-Z0<8UsP)<h;3K|Lk000e1NJLTq006!K001or1^@s65Qfok0005uNkl<Zc-rmV z-Ack>7{Kw}Sv8}Bh=`CrAo{>r(n&-_g;WROjD(`2h>B6sL3kiS(P5X+C3p#4!t#0Z zS)LTQX12Zm!4Iagl$U=aX6$jC&gQR-3{?wmQ1x=J;&^p51kz4>mbRsFr+bqpStMBT zi_mWU^GshDUeYJ8ck^N0Up8LO*MZd2o~3Q=T$*=$&wY~zcL(z<6f#X3H{rLNcVy?J zG#0&hzdsWOd(+{?=J>DGD~r+3eLgFNH#<{3AJ^-#KsRYwn%0)|tncWK2A1?2OT=-) z)%b}XNsx}d4PW%*O|P~mV;%Q+v_SMo#E)nEeuWPZK0x>Y;RA#ZBt<Te5I(GnUN2=5 zKCFzM@L`3^t%<N%^9Uby>i!oP!UtD%2p@#cB7yJ$!UqT+Abf!E0m26eA0T{y@BzXH z2p{;9@a3*kEEKE@pZH;I_{0w@!{>gLur7R}hn3+IJ-D0+5I#Wo=#$%W-rNs{wIF<J z=*Swm2~ry4k2?TlAmRI-`z|}pTG71la5zVV1B_m!Eq?v{|MB~uuM<j9M}D@V8Mi@s zmdSX?G-=#SJuJEnGtpd6|BU=Z7CoJ=MWa4V_&VX7$>y+bvbk=RLT*F;_F-|5(coKV zqIqZg0HY@%Q!m~=jsO4vEp$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1jX>DO= hWiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1l^Q5>5aB literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonLong_grey.png b/assets/kenny/buttonLong_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..b8c3fe09dc4da9950b0d82d926402377ecee47d8 GIT binary patch literal 599 zcmV-d0;v6oP)<h;3K|Lk000e1NJLTq006!K001!v1^@s6WReq*0005yNkl<Zc-rmV zU5bKW7>40*XDwlt;L=*c>>#7lA|oXFk$$L%j#`4_Bfa9u4Aj^(`rg6?YB<Hmt%(yF z!hO12F1<qkd_Ko=y<T&m?W||Dt;R!r(n<yi9;kJTKC+dY%_g7E=cVy@478s0thQ_M zM+!gD!g9G}pwMY*{2qQ1?laYk+B3G>t<H^pEltzv?@lI@e81m6yxpVQ0(ELxO<PNL z)DJdefi?ZciujpuEq<a$6V%bS;ma%D^l&&lwcTQ|AbK?7$0Po$!UqT+Abf!E0m28G zq6;L14|mbqrA)$y%jgLoE*y`?JV_G5hfnpNzz{yTszdl7d<F@G4-h^;_yFMpgbxrt zK==UR1B4F{K0x@upM<ZwPBBn$7e4XBZTQ3wm*I22O1KN3=;1Paq6e2V0m26eA1{(+ zS$RJg#)9zOut(PDCP;0J|JetCye0h8=~T{4r_=I<)oMkAZ;alwEq?p_|MCAnYFeL7 zjjMGvAN19#h4p&Plkw1LYFw?W`A|Rn^T<zh{ZXHGS|3KEQMD%kU8mO7d>9UgH_gmu zv)s=2fv!>8YFw?Wd4>O}1;7h69|nWL2ZI4mispMkQ?Up184x%*+V?|!isLvcR_+)a zbTsn@oR09M_4;#(WY;s5{uEp$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1j lX>DO=WiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1f~D82kVL literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonLong_grey_pressed.png b/assets/kenny/buttonLong_grey_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..ef427446823017796b305b808a73e77fc5b9c149 GIT binary patch literal 548 zcmV+<0^9wGP)<h;3K|Lk000e1NJLTq006!K001or1^@s65Qfok00059Nkl<Zc-rmV zZEE6B6oBFEtV`(<W=XSzE@2j+7!VP^u!?B(*DS%#2|41Q7HV}`y-(nQR7sV~+aR&z zR8_Y%P4o26@9lQ`CmarkBiy^}IogiKtMe@$v`Ca7TF>a8^TGLiejE;mtzNGOcQ1R6 zw$I{!j_~XFVKSLmC>~lg-i2RR-OlOB_{&%>m+{%?%SNNo>G$^g{o`u2`t)(1Jr>SI z%h7bUlxO`acQUYRzi>o+Nw^um=(&dI=-u$cEnalJUSD+Fcsv$8SMlK)|5o9H@Im+> zd=NfdOI#okKE*|!mokM<k<kmEB5XFBV_nz6r%dPn0wa7})e%0zw@3&dgb%_8;e+r& z_#k``J_sL#55kB45`Nru%0f|G_~NJ7@WoG&;k#cY#f2|=iVR=$xSR>X2jO!gi^Zb7 zAB?pSelc=nP22?O9^=1s0LZt5-!#qN*cl84?Gw}KRD|CceY&^!^ZozC?|<^WMdRJ< z+t<^K+u3YpG9C{t8jsfZ`~6Eh(L7K8Mt<^$;=8FF_1R7Nd@|XbGAEnow%hG~#b+Oj z!y}5e+ll7g_6A?*$BP@XHc<co04;PySaefwW^{L9a%BKwc`jmXZ*OE|c`jped2n=Z mE@^FHXJsx>PDe5{MQ&qnWMy)w27m4V0000<MNUMnLSTY+N(~bL literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonRound_beige.png b/assets/kenny/buttonRound_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..69cbb7ba27900d43ff74555b266d232c88f5c35c GIT binary patch literal 983 zcmV;|11S87P)<h;3K|Lk000e1NJLTq001KZ001Tk1^@s6P81^Q000AJNkl<Zc-rk) zO=}ZT6rExTltQcvA!H-&+_`hB3vpF&AuhG}3yL5pijBc<s|GBH2E^7Rn3$v?hBggJ z3@uG<K5VPCt^Nx055_s;oZ)4fAv4KLvT@)pGVi^6&)jqFeeXq*Y&^~4+oOAp<i&$V zI<QwuSIkTuSLR{9<n*&&|8!Of@c#F=jBMAi4(s~|QH`GX)ktSV=i93ba&>u5E+!wE z8pbhCT&MU6!C#NrNKGF!7yr;10xZX7<m~)S%ZB+_r)Np=XFE$GCCxAI+CVHtZp)Q) zP~Kd6EZ6f-4;kKLJhyPG4HW$7plYcpYe1BVT(p)8=?=@udvdezOx~@8EE|9oKHk-R zz#lWTTZ^CWDpZjcILOEDs9$UcgwZx~kMvBDHkC3n4WSIFk$NetQ?gTj(H9UJvdRp> zzY3_H+U{8X)XDetsJZ}OVwV;x86qIW(MmsXsDw!m#k!t-;3yE<TIRkk>W*|VD_;w* z)rk<D8$f8FA8`<mjZxQ%F)RHF)=HHbv(r|}=$Nb?H-Q+l!%mI8Os9xF1)L573>srw z?*UcVW$^=h${;ABAr9gpu9_JIheW;PKKx6YQ+=hIA&%NYl(@v8gJJy-0tk&U|AXlY zMp1D~)XY}#`9Odmj;I;nkanu^>M*K_jgQp?9MWcKJ}mYb)c-L03~)&4*z7f)=!VgO zc>>HPUQS6@E?+ol>@{vv#iN9%7vRA5G*Pca65{F3&0QPKj#=TU5AhWoUVs^UHGAVc zUhdbEuAgUcmgbI)c!(Rge)SA+0L+MD{;kz$Ueu1;Cp~IK6|N-tG#u(PF*$ke6nhRU z3xH69PM+|@3i`2;_=!XyzIgKV;AJEnywvHMf-iD{8pDyHrO^X0M~r9kV;ERT%}o;! zZwV~<UhYleWlp~pC_tc74T!hXZDmB`&X0+t4BW27gStah8Zu>e)IgiZIKXoa)>9*( z29nT#92d1>d_3BuHb784(#t+%)i59HSTzP9zE1QQpD_Z$LT(oXg;bXppO^x}dyHcq zK?qgj7l4dfz59=nG76iG(XL^gppUN9SOUaMl|H|jVNWvobEt)J%o8Z-3y3Icufbuj z=5^|yG>_JpdI2$EM;~@GHO`)7Vm@tr+%6@50X}aaXFR0zE&u=kEp$a#bW?9;ba!EL zWdLG%E@EtNZ)9Y7E@N_eaCC1jX>DO=WiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLk FV1h|MzU2S_ literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonRound_blue.png b/assets/kenny/buttonRound_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..f6fb596e506aaf4d41c5eeec08c5ac60cbad38e0 GIT binary patch literal 975 zcmV;=12FuFP)<h;3K|Lk000e1NJLTq001KZ001Tk1^@s6P81^Q000ABNkl<Zc-rk) zOHUJF6dfXILP%;|m^9rOcW#P1cEpW47ABIA7!3^?iCX)j^+BXGWhz)H7J-)12H(b4 zj7yiST)Xjq(0?$_DRZXZ3{yMP&a@jRxe3hoxM%J;_kQ=QBsq8%79O3Br}9^l89Arg z;Xf>gd6+M`{lrrFOUbnSdhy{?#i?N(*7pq}8hvsu`9S_5ZoZr=D{IAlWozesN5eSg z89-%L%h<0cAn~-EP{V!1&ETL?`>Zq$zS}m;$GSEk`N(mUL`qgxUm8Hv>R;8bf2Ta( zJWz_I#tFlFjPEzT89-ql?io+#BQ_(Fk8n|OqoHrOz578~->56{deyc8SY_{%z6bVW zgzhh9FLo8GNDDTos$YdKb^^j|rSdC1Qlt%lI%)`MNR8wRyE-L>XM24Cp&_b_5cWR? zRQPR~{?y4*w$xgHFL6qXod^*S{Adx%ok(HQL$Pjdy>S%?t-SqK7qul_j0z^VCaR+I z0tgNC!w>#uVbrx^j!M6RwUcG$=onHN6_eTHB@lCTSgCQA=@hZ1fYU*ML18r19#Dl- z7XRQ(83aW%_<=w8)u=j@s27IKt-8|9;D@!07<4eq|3Ltu(dU0KUBRfrX^NUzE7k@A z1b#%#0EZMy=6($$n^^dmO~4`Di7wT}I)nTlMx6l;>DrCE^X%w`QGwY3UZ0Cbq=|{i z^X6LPHC1dSM7;n9j;FxA*zy;#yYuqYMzL!r%W>BS|0)hYz>G~_oxO~gnaAs%_cQ3F zd1AvK{7y|xPXY(PjHnihCbB<8?ReekQ7bLsN>Wh6(Ru>maQFgi4l@gYkb-V@cwz>{ zQn^0}1pJGgrw=b@W^c||T~qKyZct;ot~51z0OpjrCqILMxm)oB0r8f=l<(!<Bwps) zw*t8dooYb*R=1TAjk^#gk}`0+Q~B7w9jcjzNOfv8Q06gS6>gzePmO>YNJ0a0R@935 z@oAF`fS`JWmnmu2FdyrfH6|cID|*b&7y)4+j|+lAs9&gQ-w7DrV;u7cLdcqs0A$qe z-G7vnQP?buP7Uh>eRQS979d7y{&sqWHOcbFA(dK;W1c`sUqD1r`%N46YJRtVN%Lui zsTU9dC;D(2sd3h%4i?nL$DLC07j4}#Hg&x|fB*mhEp$a#bW?9;ba!ELWdLG%E@EtN xZ)9Y7E@N_eaCC1jX>DO=WiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1nyUy$ApR literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonRound_brown.png b/assets/kenny/buttonRound_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..cb824ea08112cade237ce70b0e480784d11b9f04 GIT binary patch literal 990 zcmV<410np0P)<h;3K|Lk000e1NJLTq001KZ001Tk1^@s6P81^Q000AQNkl<Zc-rk) zOKTHh6rExTltPRPF=nG~d@MvniTJEZii=i_*4ApVt!a{4L|P@(D%D0!n^Z-s2ughr zR76X`A}U>W<=Tz^qxlEpoXMQ=%QQn~l9^=Vz+Gg%$31h;x%azYB+14z(X(&;bSxCj zCBo@kBC=v`;WXx9zU1_ijfL8B@o;{2xLvkuScmmBgP86+v?ZGiFNvGKxPD5`Pxi`- z*~_Meam*9fWfS2!>{k_#nRsMO*<h8M!NIr3NqPDCRm+C?SSJ8lwH+mql9#Dy35f4c zhUJCKCHehix17J-wZ`xs<3Hy{N<d*B9aQ}Ipf!Cc6S?Ta)J1*6#hC&5-NYIB)r}6z z24G7Mhx9$LA0zZ&=*XUmLKSH#epN#KVmly=_VMm{JyN6%fJ`-nG^9r6Z+7XF%%@J) z1cZjDGD6s21N6IW`co&*MmyC7_!7IcScwn;!H=5yN=;gm!lZ{{{gl4oC=lA``+d5o z%hJWDyuH<}PK4;(073)(@B@D=jJj5gQK?n1R<g_(osv{W#boxl3B(v3R%)DOIz_B0 z;ItlKP#DG9qf&)a7C&&N)Po`#{HVoL@mtKQ$cjY0{CIk$SOXlYE0qj>;17O@K?lS9 zuLlqsef|ei5sZ@K1yM6^#!uG;2>ghe0S+k>3;k+DHnH$An}9>Q(|`1}SZ9#`ji@ug zAzh2^kFld`L<MFCIC?fXC<S+H+GeaZZd1ipLevXz;CS+-`;RS%-JP4KHi{ji!mbbg z6&zlGY3YmXYRAh*BPU$%XV6RY#D+ik?L4?W2pj;@q*&lytZiA;j@z9cwW11FlKdJD z_3`cAx_KvS4l@gYkb+Kjcwz=A>HG(QfPb;`^x$Q(WAC|g*A#q_6Vw>4D+P@nfLUkk z$v0pi)pKBsfOtz_%2#u55-)SYt)Kv%YCyc@ZYxb1cL7W!W#IPf?7xc`G7XV3Yc){j zF%IxtgZ0!1sDUIjAR9%k7$1)|sRR&IkMOb%SvAbZI%bUlh`$^?#;1jVu#m?EK_S#% zG6SZ-@E+rsM-W2R1Oy<>R`34Jq>RF5VYF*lC+MRhHI@J|Qscdcr&yE98K}iL<_VP4 z1Vj|I*RWx==5^|yG>=x8ssZ7%qYt~0YGq9_F~2t6YL}9~q{$?JVWUCO0000jbVXQn zQ*UN;cVTj60AhJAVr*}3WMp|RV{&<LbZ;(cZDD6+E>KQKGBibQV{c?-a;OG>?f?J) M07*qoM6N<$g8WO;d;kCd literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonRound_grey.png b/assets/kenny/buttonRound_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe89f8acde8482d72d2a95572dbf13759eea766 GIT binary patch literal 914 zcmV;D18w|?P)<h;3K|Lk000e1NJLTq001KZ001Tk1^@s6P81^Q0009ZNkl<Zc-rk) zxsDn^5S^7*NUN1F4lE%O%b7E0PMtX4fDb^H$oCJt3AuAiXk$l&mPm+90EkP7`xJMy z{K2>%>NhHS88HJ4Bp#^*Om|nku6k8njb-_G27|%d`F#GcTrQu~XU<LZ_ygu!=YEv( zuS%ZR>$UAyuny}_2C-NyKCD)&j8s0EOzdvAYuD>_SHU>u$#qK4Pv|=q$fMfP3zfk@ zxm>o3#iD1ye5?~*dhzWg8IsXxv;zX)o6V-(@AvKDaQI5_9^<7_X=e@e2v7;HKoVTk zZnqtUjYh*BkH@wmre^`LTCL{jfIfO?Hk*AuNK_dXD5z8_+a3D>VM?#pb3Dbc0gx+) zkcQ-l`tG=QI-Q;bgaWV9L(s1QRraPoc>?2DfSvdaix&?O5bS6`Pp?v#;UQT&oz7W- zP{>2r*&8l;g~&m=Ab?P~Vc26~bhu)A<y69Y$uiSBJE@F{$?ORdi0K_xYMf<Gh!{(J zUIGjXqfvXFEu6CWfivY2A)>$z?7^<~OwJ--Sd`9HR}P6RA;jQ-Vg6qN2!%HPgE<IB zv3MgngH*c&5S9{h1~@Er{`|d0HnH$An}EY=wOYSqok9Lzqs{<_mCa_qv!lC41!f1B z%jFVQGMW5n)|#M0#RFOL1vqd#MO3@+TXuIrp4upO^a{H^*jG5h0CSg4r@v{0f%h}$ zrFmk*9_*%4sV~3*FgHqKs+IU7xf67!N3Lv%Ygti^WBWwn@%Sg!9A*{(AqCIb;mHhA zfEsWF?90wGgqN92Ccf{Qf*qYBG)Bv?(cuA@H)c=%4g>jo{*i!qOJK?$b8nKDIdLo4 zfTtQrc;9X1M#nCOi3}NHTdh_dg~&8`%B|Hvna4Q5a}Cy$BM1#Bp@F=YTrr=Jp0oo9 ztcQE$F1-lmV;!@`021979`m^)AS~o@K~QitIN$~h?=g;f1R=5}CV<>}z5CxXWF$5V zqhG-~!H<KX@dSvTDijJoSd(1-9NJ(U^F&Ba0wPHrHWVH!;dA|y7Se_37!VOZ{P63k zd)6cuiR$rtzajYt!7MS`_Y-DA0000jbVXQnQ*UN;cVTj60AhJAVr*}3WMp|RV{&<L obZ;(cZDD6+E>KQKGBibQV{c?-a;OG>?f?J)07*qoM6N<$g3=3`s{jB1 literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonSquare_beige.png b/assets/kenny/buttonSquare_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..15ecc1cab174e47effe6b26d35594886c7b499e8 GIT binary patch literal 503 zcmV<T0SNwyP)<h;3K|Lk000e1NJLTq001oj001!v1^@s6P7WY?0004nNkl<Zc-rmS z(MkeA6b9h)W<5fW;A2#n)<p#sAyH^uq`QSd?TX2Q%TgkQS#C*Dq;%CI^azvx+AJkl zdlP#G&%h67W^O))WngxO=&KFF^SR-Dt@7HdwUM`eU8NmufeSwR-Z01k`B&f^gL`g9 z58ehvb?K}}X;=%XM_b^E;Ug~%L-!G#Yp=ipIxX-;=#iID3_>TK?0Oq2^f%Q@yO4U| zfJfW(YLhN7=-G=bu#<snDjMO4{&l4VEoedie;$G@v(NzR?am1FB-jY_Q)@^0)vQ@) zotCpIyN93!EoeatTF`<P^lYN>N5?ocM|dJMH+Uj6&Sp5H8H45qPK4$LmVH{#Gl72Y zo<&8onvW(rjWt$ac;JE$PI&3=%8EKS%{|t)TkydNFI}8&$IH(3T25cbA@I`4;fm@6 zN6Lg7TR7n*yOjSx;k&y^f8X2!7kqHSOUDPfIy$BVUMlZr=S@PFi%a9z2v#XqF#!zc zkLMG1F`KbV%kLbqaKWdopD~9=p(DeQ^Z)<=Ep$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7 tE@N_eaCC1jX>DO=WiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1jO~+`Rw* literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonSquare_beige_pressed.png b/assets/kenny/buttonSquare_beige_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..2465c870a33cdc902374d3a2136f40c18ce2dcbd GIT binary patch literal 449 zcmV;y0Y3hTP)<h;3K|Lk000e1NJLTq001oj001or1^@s6IvV1d0003`Nkl<Zc-rmR z&1%9x6b0aUvp$NC(4}IbbYTk>#6_XoR>4h^R3xB?h*0{2iA6zb>dHs(5k}7>Hx@yg zjpPpAfdiAt=3@v0lcQ8J7QxF!6nalTV{e2kzuP+RkOeOI)Zc+c4#@ukXAB;@1zP;- zKk9*VYtnfx<{q-ZmBP1P6$S1T4{v^*1@uthGw7{XVX_FE^yR02r-R<To{#Fe2M&11 zM!T(Of<?bkVu9TcTnEtzNA%I17PO!RefmuLRlCpt({X17dLL{BdN!=-UhB#(G-c@A z$mt<yK?_>Yf)=!(1$~}q{L!%v%@Ljn%?+Ljjk_7{Xx5;)fit1Gf#sYQ^jV;z$?F=E zZtL2-c<)qLfvIzW&vc8SyGlF6kM0BOb_+f@e?zZrnp)a+j<uZMET?r`+{7i#t#ys< zt{ZnR@x5@w!eyG;WNZMupI>;b>Dd(k001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Q ra(QrcZ!T$VVP|D7P)<iOG(~P>Z)9b1s0M%T00000NkvXXu0mjfB-P3a literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonSquare_blue.png b/assets/kenny/buttonSquare_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..c165e51f7feb1169ed3cea51e4f87617a1e6b93c GIT binary patch literal 499 zcmV<P0Sx|$P)<h;3K|Lk000e1NJLTq001oj001!v1^@s6P7WY?0004jNkl<Zc-rmS zUrxe65C-tQnMd#hv{nybS`|=<RY-wCBJm$u8pD$h&=`;45jcWJ@Ca+at%FK}_QiBI zOp`C!Zh821y4j>mmHIr!llj&|noW~*_KKvB&${Z61upp1_XCq0kbebE15T2eOOx?1 z)va)364ay0Ll(G})z7^uNwWn`I=wLq=(@mHESYSfOxY*%ue&=R>9h8g`BBw@10J$b zwG|C8dC=&xz^(?awP<<_-12Ls1ubYn|9`^HwOwd{X}hxmy$ZGheG%R2qvO6^XiBp+ zl-)znf)=!(1ubYn3wkrr_(#V&G)H(TG&guDG~Uhdj%E#-8@Lpj8(8*fL2m^5=I+T1 z8YcsD;WWHt1%?MM_~3+B^#?_}s~ab*yIb(V39s7s+sm?ZZOc(R4uMyBdxtve-D?{< zws69$TrYUXpx%r%t#59D3qCmERqk%^f)iT;uW}rJ+a`3a<`-WhI6J}A1~8mIKA&(r z-_6&{8_Ok;yWk`12iKxHZH|W>t^fc4Ep$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_e paCC1jX>DO=WiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1k0b+gShr literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonSquare_blue_pressed.png b/assets/kenny/buttonSquare_blue_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..8ab31c5c340034da8b1d95e05f9563cb20774ba3 GIT binary patch literal 439 zcmV;o0Z9IdP)<h;3K|Lk000e1NJLTq001oj001or1^@s6IvV1d0003+Nkl<Zc-rmR zQBJ}@6a~=PnM+{_CJKT|EJ&c%CN>h&I5QBwX*DjvC3Fcc!6j7h*f$yyv_GbA!kgqK zW#HrRXeKFFsb=M-IC`|@M%(QxV%N`g*C7jB@Ts2*n;ejT1x^RndfTJTB(?Q8%3My) z=ADNuaQW$fdX=_ig%`6pX93+8_`YtLvQlpBruhDLldQhFzIPw$I&i>4Hk!7g3v8Ya z7c8*5fom_Ceg<y&b<%<sw4nb#(QFwO8elr^f<W(rgFsK`5B1>uCM+~%G*0F85VW8L zEoeatTF`<%Of>${2@cH>-U`hP-U^LpGd!aOgXRWqh2{p9b6U^`fi|nBcU%lFZrvM~ z(H$!=buREVMbVq@5EqGN-EP6>(585CO)ZU`V=dPo#lDV1d~+LIW9zGCQyk-d;fRIH zHMPz900*J2!I>cxe*gdgEp$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1jX>DO= hWiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1gM;x`qG% literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonSquare_brown.png b/assets/kenny/buttonSquare_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..1707aab0be8282fa1d7e1ed9e5f69f0170c21215 GIT binary patch literal 512 zcmV+b0{{JqP)<h;3K|Lk000e1NJLTq001oj001!v1^@s6P7WY?0004wNkl<Zc-rmS zPfEi;6bA4)m90TBR&gPMCKRnMOeIm;R2R}k6{+25D|R8SL{I{Xt1hGqap@5}LXY4P z#(t@<XrY>o<PCj+59ZJ2mq!?w%qaEsG<W9bT7E8S1q*M;#onS$J7j?iKK1><AP3~1 zFVS}nD(u@H4c;B)b*EX3^Libo9<sniMtD^-$i1WUaJtC?Ixg_V=)PB>aamd#PCnMx zb#(0No5SVQ0|z{0qiQQ^VDROt!~#1SxW=Lpj_6-2Eoeat`u}rZTQds{FfDgRphv+* zpl_=yy4w!SLQ^{D+p>BHTF`<Pw4enoXhBaV8h><*Lvw^DLUV&BLSt`+J(@9SZs0^{ zZeUrb1w9eyGd~wMy6xR~;;B(!1%?MM_~3+BHHvoJiB2|HpKieiC%md!m>HIx>#-ai z$06{lgS@5do~=zdv4s;}weMOVXw<f5HGSXQ0vCL6!mC0z^Nfxufmel2X4NEg*_j^P zMyR+}WC9q@AJ-?!&XiYivpt^JY!5!Negc&|+`3`~Y)}9I04;PySaefwW^{L9a%BKw zc`jmXZ*OE|c`jped2n=ZE@^FHXJsx>PDe5{MQ&qnWMy)w27m4V0000<MNUMnLSTX? CY}hIQ literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonSquare_brown_pressed.png b/assets/kenny/buttonSquare_brown_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea2427e98d65f0db66cd11011356c813c226945 GIT binary patch literal 454 zcmV;%0XhDOP)<h;3K|Lk000e1NJLTq001oj001or1^@s6IvV1d00040Nkl<Zc-rmR z!Ab%_7zglqGiwbG(Lo}tE~V_6(nX?!Mp!3TQAj*VP%J2&JcOWh>=Al|eS{ui^gr&m zgrMz3_8a^L{xCax`R%X_?EaOChF?0&v|T4?d)aTKb91EA4q4!WPyHQO<beG5A(qb7 z4!Z}}wD{II(-XgF@-?_kJ!FB4jPNSobAE6!db(r*-4yr?dg)b|bgQ}e=D1nV!NaK@ z-W{hNIN%{0?Y5!`7U%sc3+#H}+K5ItqPOm}pam`H-RHfYw+jt09d}ls*TGhxU++)! zwCCA{rc7E_a(W0_(1I4Upam^xLGLFTe{`%vbA%^CbAu;B<J%11Xx5;)ffJ#*f#sYQ z^j@HS&-uk<+AEtIAI}%8z|^_G7u9lM+#v>!=d9Z;_)NQ1c0Ns0OWV$|mYcm);yTWt zskybTv8B;+vo*XgOtGP9YNN3L+yHsTy?)Qv0000jbVXQnQ*UN;cVTj60AhJAVr*}3 wWMp|RV{&<LbZ;(cZDD6+E>KQKGBibQV{c?-a;OG>?f?J)07*qoM6N<$f>mJ9zyJUM literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonSquare_grey.png b/assets/kenny/buttonSquare_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..f21b17e1b4b38c0bff17c3db279ec4b6a433ea8f GIT binary patch literal 451 zcmV;!0X+VRP)<h;3K|Lk000e1NJLTq001oj001!v1^@s6P7WY?0003|Nkl<Zc-rmS zOKOEM6b9h4vo4`aaA_`~J5X_|7!e1)@Cqv8s7tW^)^o8JZtJ9Y!ac$dc}%{95QquU z{!P>Lw#FUD(MRTaUak&X;DV2i9~vbf{|cN8cDS*w>m|#wEm0I*9=5=BfIC1NREnYy z0eu$ucC?|raPP#Z+P1}dx;${e!#196;sP4uI2M6@3|vpqh(z?SGp%SvEBgP_b)8*k zfO)&K0{sZK0^RrhVvMm1&B^mzcMnA?TG5JDw4xQQ=+{K!kB)U{iSScsY4B5MoXv1X zvj!~<d<rcMtoyX0UjjW0!&XR=Wa}u)QWO{-xZr~mUTT_Vt5j7b`gRLGIN_z^v`f8~ z<LfwH#uSF(eH79IC%hB{!6yo7nl8M)r3Ehd;Di_G4^(UkyySV_yG`iT`~4bW)w`C= zvisxtgzx*#+ISO+y}`%UFO|{XK!e6m#{d8TEp$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7 tE@N_eaCC1jX>DO=WiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1jBS$&~;A literal 0 HcmV?d00001 diff --git a/assets/kenny/buttonSquare_grey_pressed.png b/assets/kenny/buttonSquare_grey_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7b41072881803606334a14dae6e24b14145ae7 GIT binary patch literal 406 zcmV;H0crk;P)<h;3K|Lk000e1NJLTq001oj001or1^@s6IvV1d0003bNkl<Zc-rmR z-3fy*6b0aH<|vNPkvc+0=m3fV@xdRkf@t)qBiNphD<WupDc;}>97yBK*B}u+O1WW- z3BI{^UH3%Bah%Q$S>S?CEe94kAb$l;0*AC%Rn?THsZA6`r-v+XE#M*08b9(pX93*` zd=9OZo6HySuj;zS{d9WZfQM|f+lnSwjN_OEb{)7j(FjNM?oJC@(1QMdnx^p!4KN*d zUZB@tFVJn<PFicf(3C98<n$1<pam^xK?_>Yg1#miUv#`fbA%s4bAum3<J}DJXx^Z? zfe)d%f#sYQ^d->7m^UU#lGqDHQLqA2=K`PW7GHCRSe7O0b_+f@hhccwrk1vyV=ag0 z2Gwz{i3|K}Y-#j;f5ZL45et`XYTft%Q%sb#xAtPi0000jbVXQnQ*UN;cVTj60AhJA zVr*}3WMp|RV{&<LbZ;(cZDD6+E>KQKGBibQV{c?-a;OG>?f?J)07*qoM6N<$g88<r AssI20 literal 0 HcmV?d00001 diff --git a/assets/kenny/cursorGauntlet_blue.png b/assets/kenny/cursorGauntlet_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9eaafe0d11b360e536799037004edab6b4dfbc GIT binary patch literal 752 zcmV<M0uTL(P)<h;3K|Lk000e1NJLTq0015U0015c1^@s6J20-I0007hNkl<Zc-pmB zJ!>LS6g6ZC8v@CK7(@bTw~_6(lUQtLxka!sxPrQVMMMw;vw|Q9!hj%11cPO&lv`S* zPLn>ce<1r0X75?vk(bG2GH*s7+#+UX&OP^@b4DW(?KB#V%Vx8=lDezaYF{GTKJ|M2 zOu(L7t(L8qeD-Urpakmo`}TA?wTHu@4t|4c+$z*mFjfEz1_OJ!T&~NqEW6!q+s-Mt zOy#*)EFJ{`Uf}^?sRN_H9#a^NM(aX@y<YEsbvhk_KNtg-N~Lps)QiR9RRdnt?RE)n znPNwCx!k1=ZUQ`;&DJZy-c5k_q!O~HF~Qx&?p5RQn5>^nS?^25E0xME!6%c65jb{^ z`;Y}j$kl4~hm7ixzz~iJFoa0fzEuukxLF03G69D^d<PFMA`t9?5mTucp9%1MKKH+C zMx}G7_#2Iw06SP)o+D>~n6mTQwVrrrK=gC^3OJL=eB(vV*bG_-Axw+OrW#m@;xF_m z#Io6JKB$NNG(gQT+Zi+;5FlaF%dhY-Q3ZZS)*k^5=JMfR{1aUw4mSy|d41(fuLO3k z2T2fRn*x)0Jef>>E|<&KdWs>B!vcc@o+m0Fx;YFxk7?}h*#K+;@daH0Jzgjje!gYz z9jQZrvjP1D!YP=pf&NaX(<ko*8`wwLKq{5`n$PF2^eI5Cen64?>YaTr&pPn?@<Icj z*Z_(G^b<PpGueKZqn>AUc2&18zO{Jm91~%Hh^T(cy~km{8OO*PY@Dx9073&~3XQ-m z%C@1-K6b8q{;h&F)rz8<`aKY%=b3mcY3L7Fs+}g3Ms_v@yi3o&Q-|C56-3X+9bm_b z<(}J3{{ZewU(1*!$6^2g04;PySaefwW^{L9a%BKwc`jmXZ*OE|c`jped2n=ZE@^FH iXJsx>PDe5{MQ&qnWMy)w27m4V0000<MNUMnLSTYkDNz3a literal 0 HcmV?d00001 diff --git a/assets/kenny/cursorGauntlet_bronze.png b/assets/kenny/cursorGauntlet_bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..379b6f5c889eb8de8b7ad6738b7fd92144d26b33 GIT binary patch literal 804 zcmV+<1Ka$GP)<h;3K|Lk000e1NJLTq0015U0015c1^@s6J20-I0008ANkl<Zc-pmB z-%C?*9Gw`FL{^N&Sb-7<L4*&Iy1CsEi6RY4bcxg5=AuXthC*qD&0j;PL?ofe2OoM- z5bPn)hhRO}Lr=Z*9`p~`e{j8L-7~)2-CghZZoBY#*mmzdpL0H+bMBqTBOEz3oXMr4 zdA;_R#=~u%S|5waNHmvHj#txBO{`ohoUJJ+fwpF1+Tj~j`}|^109Uqgj#X8p3S<Sq z_VWSl=f}xneOVsW-afvqnN=uNMLC|0U%TK2IFB2Er3j1yd#JE8KU^#{_#x9@sP(5k z1pg%sJQwd85v4xbd{WYYUA>>`EnK^jimc0Gd#CTWXGCxr;BRXa#gSm{GQbUb1?EON z-x1tOcDveJcwn$r{>ZX!)XP7g2<{U6>*|;kIA&g$x1I%3$l0-AdPxocCNLI91{jM- z){eIvi(zFISV{&Q`{6iva1w!F7f8%ag?uu=-!~pPpEaY>JX3r|BQn4uYp7@|IRiwN zo!zX(#6ttG5~1c2;KZHQ9-d^5O}B**f?7<r|8tM#msRDVsDf`Q);8hR!%iCD&M@0o z)X+TupFx0Bl3q?14~iP>_sRM!z`<Pq@*jRgmx#k^g464e-JD(l%v=l-H=8XBOy>TZ zE$6Sl9PRofrWo?LQecq4{j$mKO)H0C=037tOm_cZ1F#8}&+Q24@!9yT$#V9t)2j*K zY(RW~PzBjB(BHA3_sVI(2KHVya5s3h<JnN>Yf%Mks}oS<enIB((1Ec}jt(?%kqw}@ zfKEaOekR*=-;E*t`g+;tHZC}4ervItITT@l7;G<9`ey7SYp^jtLIH>!AXDrJ+#(}$ z*|!$VT=aaof;Ej1d8_q*z(>zB@rqBSWaKYc8Z!+TJ5pCI;Cg!glxnKQzaV<vZvwk) zuxzlp=md$l8HnAg=m7u#04;PySaefwW^{L9a%BKwc`jmXZ*OE|c`jped2n=ZE@^FH iXJsx>PDe5{MQ&qnWMy)w27m4V0000<MNUMnLSTaA!*uKb literal 0 HcmV?d00001 diff --git a/assets/kenny/cursorGauntlet_grey.png b/assets/kenny/cursorGauntlet_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f84c34ad917931ce414044910c0f6693f9ae1a GIT binary patch literal 758 zcmV<S0tx+zP)<h;3K|Lk000e1NJLTq0015U0015c1^@s6J20-I0007nNkl<Zc-pm> zJ!>LS7=;Z9lCY3n5QE6Vw&}J@yB7Nk+#+BTk}j2&R=d~)3t<FN{1yuf3kg^lu+Tyl z3kw?y3t?r!I{62)_k?@o?l_suoza1}P-o_O&--y^3<Q*;*=#0Tt=3q?W24dd8aVVJ zfZqh{x!rD?YKZTC9TZB?U@$Nji-kEFjZ}CG=h%g>s-Ua@42MH=v)OE8Hk+B9PRF!X z!KNzDl}hEK7w{N2fJzmNfO=G6GMQ`x3HJN_*XVY;gwM6X`F#FbE%kc6-buhIdc7Xu zhAuml&1RD-TnD^dF1IZ~-*v!25mBK$N4Q<tonktjQuQBQ)n_6i#bU8b_<TOsf}`hB zbyABgCiAXVt1Sq|;OKxch*a%*$}t#rtAdr%fnz>g8xKw*2<w6pb5c=09q?+ka^GuO zrM0K{j6`(67S)Dh$!Q?E>YRG5Ivx_J*Xv()z^PQ~J5RFOrq_T8p;~k{nZQ^~{Eb?L za3+(v^}54u65!0x+i5f>Fc3fP<#zB;Q3-#f>Qlg>Tx9ctACV>OaG!8x*T+`(ilXPL zk$9PGT`-kLVzJm|p-`x*E(SmL3x){XuT&~M*liek9;W(gwfdV0U`;T5UR%H&Hw@$c zt@S<<aSk{WP#++yf^HkQ-|=|-^Lxey^&uvZNF=Uux!g~+3Yb<mQ20L1$F<^KAKX5? zkiaJ<fZzbSF&*qP)uz+wAM$=$$Fa=zzqb~ro}(f(kaD^FB(A;i`(_-bYN)Y3LIK1K zP$^~v+alN2*KvlPt2_TzU^QinLi_qZ5a!O)@faeZzfdWA8kIA0v@h^6cmAC?Kg7Qv z?tH`oyO1h_b{G8v<lNEy79tIz0000jbVXQnQ*UN;cVTj60AhJAVr*}3WMp|RV{&<L obZ;(cZDD6+E>KQKGBibQV{c?-a;OG>?f?J)07*qoM6N<$g28}YF#rGn literal 0 HcmV?d00001 diff --git a/assets/kenny/cursorHand_beige.png b/assets/kenny/cursorHand_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2bba7414d26868c7e3b9a1cf8e399ae0b653fb GIT binary patch literal 751 zcmV<L0ucR)P)<h;3K|Lk000e1NJLTq000{R000~a1^@s6kkQ2L0007gNkl<Zc-pmA z&r2IY6pkoTk@(}Fh!?NDc_{R14?Pwt_y-gZLNAiD7rhj;5-hG+M5$Oy5u;KiaX0?N zG@DcjsBN*ODpIk62txZGZ1)@XEtAR4y4rEzyCgI3oA15vz1c{_U3oL{qL9%Ccx)N* zwutIgF!iO+tK+sGaz^60G9oBK(B1V(`}EtIef~4caFF}J$SfoAi{B5mIAdk>>AazD z6L4Y6&|@3(L-lepXCs21ec!aNfA5!|xHZKH5j<yV9ke$Hc~d`-rk^&6L;#dBb*BCY zpuJFi^2PA70N}EF*%`Xrn?N!g@FOI3z|mgHzB()V?gK7Qcf8B_rZbz?-cul%IuOb( zBf_h-Q`0iCXHOnIbZ+t&2Eonz0tBg%sbfxd>MZg#r)CG^`15dgA#~6nAWLKxkt|B; zf@*ggAQQZkd9n%zEu;>PQlXA_vS^lCUL7{7ASAPtwL)foc!CNGv)slMGF%*6o>{E4 z*3O9F8vKAf|0pi80%M~Jb%=-97-uCTOBDeR7>;Up<H%A)29%K9hcfgoVt-0&DMqH+ zh5R&u*${hdIMxNO%EfoD`pJcUPt9E$n_hv<k0TlMGRUeOw5~43ll;5%wJ^t?k-Map zC)!>fJwy*X9F5dwt-#b+UpGi8tpsX`u)Rg23UPX0c0P9FS9|l32zg>N`Fb+DqMZ|I zP)+e4O$<`R5jBbfxj`f(%)RZ8@##g=6QG!XU;$i`JKyBa-?H_<C2bK2X;906l)-4i zImD?9^Wg>JI=pvu7==ba5c3!u=y~dsk*2Uj;;NCQSc1C${ltvkK!B9hs{DAaa05mK zRE0VG4`*Shh-a8JQUCw|Ep$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1jX>DO= hWiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1kufSGoWI literal 0 HcmV?d00001 diff --git a/assets/kenny/cursorHand_blue.png b/assets/kenny/cursorHand_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee5baaf38d45a98f51b209a968502e46681c942 GIT binary patch literal 743 zcmV<D0vP>?P)<h;3K|Lk000e1NJLTq000{R000~a1^@s6kkQ2L0007YNkl<Zc-pmA zO-mb56pbiSkyu?Q;>N9;;I2Dy(_I!_2tuKliV`ImGs#q|)@Cvj2?T2}1cDlofFPxU z2yVLUPw1xmLjOSf55{*UbEhva^Ttu117|aH-#z!-uQ#!n_v8w8DrZ<F9@*^PbWHW5 z8|9n)=DrhzT)}*!j0lS0)c9C&4r=F4y>a2<lUZ}gbi@A5+e0nR=!VtSKiEHfuz=Zn zJ)PcuDObe|;j~t7J7?$DUD(>Kdg|=dMxi)Qwqanw{gkGkj6@;;N<9aE0kVba>X(+E z1pvYB>>YH1GpwUfG8_mZBy~Wgdg7e4t^)0V=J8iQxWII3x_Lp4Wa>aD3r58MT3hWN zvP2>=lQ-;tXb?me<RDCqOdWtai+mHS>zjx8Xze#5I}HP}M9m_S#YtUQ?H&STg70LW ztdC)m)S;tPsN*|XY?fhO9Sl_vQnU1o!dhnMlnRSxc}P>p&}d%z&7x_=S(gZ1gBQqi zxzcnC3_}&_;IEU;@=e#uQboW64M(-RcV(#}1G>nbLm6h*9q@eVwnL`43;At=W`pmA z#nb}0`j=M<CUs%ZRrA=vrduGReg2MF2H7CP)OvRJ8-Fhqt-5=SJSMd~k(M`qVTKvU z7>(H!@b+DL*(LSTN}!R5I$Qp=#Qe<7C0}{|2mSp>ggkLNv)$UzOMi$otfu%z8-o;a zL}TJY9u)}*OYd_!pI!_-0gCwx7C?~P`EhUm_B<~<(n*n!7PS;CWoR_v9Q^c0`SAkr z2<|&Nj6%a9h<PNFi?0JRG9Hyke1>ExmSE(mznJlR2#~U2l|RpYp2N6+fhdRX0FOaK z3_gXT4*&oFEp$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1jX>DO=WiC)oM=~@; ZZewp`Wpbznf9?PP002ovPDHLkV1gYORtEq8 literal 0 HcmV?d00001 diff --git a/assets/kenny/cursorHand_grey.png b/assets/kenny/cursorHand_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..fa83d37ef5c20e9bda94ed989ff8383a4139c8b8 GIT binary patch literal 705 zcmV;y0zUnTP)<h;3K|Lk000e1NJLTq000{R000~a1^@s6kkQ2L0006{Nkl<Zc-pmA zze_?<6jq8TM9ZNNm)5qnRvp?K+FYW)AV;Ud%|S>|!QT%9hc}4eVBlbbgM)*MgM*L+ z&iNm_?kD%i@%rBDRksV@^4_`UyWjbBug@n}qtUoC4C9HTR;!)+bT8q!(`+^^JBUNv zXd{9mIBm6B)_6R&rqk&f-EMbHCJyq>?V(mi0qc#SBfdYB%jIJ?Rc~-QnM|zZa=8W5 zG)di^K#XkNAZ#X%;U^=N2!K-Q;1eKQs2+_*n<xM{Y`fhi`)5}&Y_KCFb--{qv=)nn ztsO9*&o_s&4QHiNc_Bwm>Okmp7!@qn#tvCL9={OzSfN00GCK!uYMj)`T*p+tvs^Bh z#m|1f@7bvv5G5)Wl`Kf=+;aC5AQHTiIhkJ|Lh4XaI@Iw>R*NOT)xl5)AuE>cRwxt- zWlAiH<tIhqgxPGiDVBP@en}%Mh7XAIU@%xG7=}93!Jkyu*&1282slu1l)G<7mM$`2 zi|jv?p?Be14CgN8OluYLX@X*d?^G&v3$DFvHv33bXm{28wz26JD3waD=w*-{2t<p; zqRH>2Uaz;lMt&1oPE@T{r|4n95vDea0_k-69;6gj0=0zK-eRL_l}IG6r2m7>d?Z3n zoX_Vg;$$C0>XuXdqlrO^7*SXq$R{cxA(P2G@bIGP2~f;0SOAA)`%mTk-C2i{G@=sH zpmuqMtx#ynKKR-5^6&z22=^UrMxx;m#2m?F^4caMr(TKFb>tLc2Za9m#0-8zfRF`r zKA!#3VNk)om(5?4-kAjg$$Aw4001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(Qrc nZ!T$VVP|D7P)<iOG(~P>Z)9b1s0M%T00000NkvXXu0mjfs}Moj literal 0 HcmV?d00001 diff --git a/assets/kenny/cursorSword_bronze.png b/assets/kenny/cursorSword_bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..2b43075a33e0f6bd05e39e834bc6ff5894bf76b8 GIT binary patch literal 1090 zcmV-I1ikx-P)<h;3K|Lk000e1NJLTq001HY001Qj1^@s6Cqg@V000BfNkl<Zc-qC6 z?MqW}6vrn?B*RKX84@&lB}Dk5$ns%USi|yhbDC4<baPLR4GXU}-IGpirpQv*NNG|A z3yeiYRuuL^U-Zg1z7PBd^gsA@&)B)#&3pI2z1oGth0EPJpZ(7Fe9tBc=xW+#^$l@4 zwrBN<=!{M=Fs`|BL2}v`0L%?Fko2IT_5%9)B>+7Y5G?$`ry((SCt0>XAlzVZVs+l> zzPhRtIuS(_3dJVd$j(ax`4h2{ofQ-LGS^GqKI<S$mPW4AI)u{_6=Y0(qX&|&jy92B z^I8Um9lt{c@^PkzM5$KtV)!lt<nOO<5Dny-ytopQE}HKpK=@$T0WE~j1oVo(VjfEA zw61O+5`UWR%ozq-2D%XoL^{!3y#PtyO|&u~*<ilS>zEczYHKcw0a7@mysCzTVTUpW zBpVEf87E4tQz@sD9nBl>90SP&1Ji}#1tSy#<f6B)W(yL=ed@emV9ar(#c<?vqwUw7 zknj!F%n6bSX7x!kwkR(6NFLq3bQ6-T*zfa#Wbzqokr>`m66mi#fMlEQj=W(ueO-*V z2yKzn)pP3=jwDRb*V(STV8YHOQM~009Tj8hY7a~hB!nqS_m)gBKNklXZ(%P-tJOMS zu~@ut&v}di2K0hc1QD_}rnqh<7_@)%7P|P-$jAu6pn;;ffSd;q4106cAf67y>!%ON z_qoSeVbK1mVNDzX{C<DlFj6{X2m?!ztsPj7Tw-R!fc=k~yP3kFP>950vBVvp+3ohK zT=i1IJ{?#CxE%S!%!XO<*is-cTrOAQx!G)X<|E*<s2dDekeS5Hh6yjHLSTDn-5ePV zhP)SL0UgC`7!b3+zjl{T%mDKv8sLP0XlZFt!?G1J-lc3HSPOVMQ^Rc}NEyl2^Iq~f zJe30B^Z6JEx+S~G&r5|ma8bILsloRBbYWt6JRV{)nE-%+F&d5UlV42mRe+<e*XtLu zL0|xk&1OTLY=g<=Iz1ULT5u{p2(Q<h0>KW1NdoO@G#X()ALt|r!wLq2$Ak&R_&^}s zZZ~l_9C;ZW?*(1}i6G(H+S;+{;Ddpd!Ml-21m8OpEL;#C!axCppbH*w!63xO#s;A% z3fm+22UWs-=>q%g#irG2opQOn5}zXs55$p5rK%PDR|G(yC=`bYQYw{=INC{=16+Ds z5XtvtVvKPa+vHf0SPgXRwxB2!UteG6f~ZKItmGtMitsrUgQD!#r9sGq*gY3aQF130 zrado*qNo?RpA<w+g64=*g^(nR$^JJ48wPb$#s%>YAA1c9SbW++0000jbVXQnQ*UN; zcVTj60AhJAVr*}3WMp|RV{&<LbZ;(cZDD6+E>KQKGBibQV{c?-a;OG>?f?J)07*qo IM6N<$f?c`kj{pDw literal 0 HcmV?d00001 diff --git a/assets/kenny/cursorSword_gold.png b/assets/kenny/cursorSword_gold.png new file mode 100644 index 0000000000000000000000000000000000000000..ccca5fd30a5ee35e6c5d59212e787285510d5033 GIT binary patch literal 1095 zcmV-N1i1T&P)<h;3K|Lk000e1NJLTq001HY001Qj1^@s6Cqg@V000BkNkl<Zc-qC6 zUr1AN6vro-G`HRDy0qa-KKc>{fiFD>B1jJs%=VB38p_o953@9<cbf_6XyqSFw>fgj zN+m<HXcCD1!SW$Aa4!ZGj9z*Oed+nvJ!@zFHt*dZ?$s_FE?n-;`RsST=X*AVyH9i3 z%c+;9IrX}i)697KRJFrqg;sIg7XbL|3`q>HjoJ2asu2J^77#4FHOG?8S(Yriv_uFD zfT#P_c6X1e<VZlE9Z=}gtd9JCt0#Xxo+f+m^kjD_kGy}RBXdInP&Q@{PD@shp*H1J zNd9_4OTxjt7z`c1*7RiO8B5kYI`VjsYG3cEGTA^boKqA-(!gCN0wM-O2edE(($D;m z^HB7Yz3LDo4lS~2!(humH*$ffT%8&hB>li^0zp#2e1DY}YtclP;;bAX*|)CcR71iS zquMx-R4^cBoG7_YrNGNE`~Ex3A&_J+FkL8KFhV&%bmO-*K}h&zfz1d8#vDgl4o5yU zXi;`R!u4sLAV@Np;KP3=2&+Q!k(kO)mO`@U_qC!R$$SP|B!{=K?tV=el6`)n%NS<s z>4CRMZISB1O|=(C5+-POnav1hWmGGRx18XkaJVhk1``AcVTuyHB^k`m)dO##mt%8t zb8S;olO679k1@c2UT}&a7M$^}n+yi+AH9VyKGM?CLNIusnRGxH0Kw=p=U&Itfp{~e zCEs4MDPhq5?KjGn5MW?nAY&L69|nYhrATWBmZOlEX&A77M^|~Q@YvWGnV+AJ-0@j! zYimimdSU6)fi-~3QB2G<%-ncI90Z2dYK=T^Y;5evM8G+y8w^;G$;3><cqZ?~L124$ z-R#%b*Jr#av-r@^Fd*hht7bz?%mA~qdPNWdqN=K@8kVh;@z&Eouom!ioIU5s)X*jJ zb>$4%T&|9Ta5x+>2)-p7(a)=-I<PWP%=XUGP@*s~Y&IJ)o6P_agK21JScrZx$yXMR zdR<+eD-{F=z*sC6)X6%ST)NYf^x_3)6oata?QsxvAWRf!+hj6H`}x2pi5QmC={zJ% zC?*C1!EqdEZ*R}Y;6yL*0!Rc2eLmlz=@5f~mchGjw;SKvlPp{i9>PEYgy0K?g<udO z5D1X&?rv<4<R4TK_vH(O=*3o3Q`1pYR8)-55k>@J-)J;ml>Ao&K%giThY6~ztgOJ% zj>3d-=?OtZ-#5rH#`(0#Q4v`UeCvWx6pH)(ej$j$=*cRM0!E3?p%@gUTbBS~kYe{j zFv{po%1(G*07X$Ra6c-Dv;-{>#|oi{7Bl>B2pR@;lrIGF7aesIUibKWr2qf`Ep$a# zbW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1jX>DO=WiC)oM=~@;Zewp`Wpbznf9?PP N002ovPDHLkV1knR?(YBq literal 0 HcmV?d00001 diff --git a/assets/kenny/cursorSword_silver.png b/assets/kenny/cursorSword_silver.png new file mode 100644 index 0000000000000000000000000000000000000000..1b37fe8e588fd429e789e50b9fd8b5675f48bbad GIT binary patch literal 1005 zcmV<J0}}j+P)<h;3K|Lk000e1NJLTq001HY001Qj1^@s6Cqg@V000AfNkl<Zc-qC6 zO=ucX5XTJ-r6T<ZAwhC!j=l9(2tD*t$SD-89%{fUnlBXtK>`Ux<0Tj<s25R@R6>Ll zg<KMP2t){!fR`rFgLtXrEHn^uetm!0S)S{zal32!U=Y^bdB2^R|IAxUFc|!>va)i- zt+u?p{FVQHcDY>7Ef2i_5DJBu()jhC+)@C25D?n9R;#g-lM}YHv%@sN5V3eT9DY3% z5TpYe9UmXF+uK`)b$55iE-x=xrBY#ATU$L)JW78MEmJ`}9?vH@&t|i%)oRHw;%c|s z?Be2r?eFiiXf!GVEi5d&GYw>VdioWdZftCHK(t`Qg%nEZ`fX-V#upbCf5CCRULP2S zY6*2?7KqL3^?rfVYPBkZ+y~QaHsuug{r;C`fQ-(~&3%N!R4Ua4avuzenG|JKR3^Ez zo3*vI9*}-8P#38RjnE8`7lA<FI~<;$pX-956hYEvbmS*)w|f;1%jL2vNI#f-K2K3O zG8~ebnVC0mmP{r!L9}3yBI++@^p-I$<7+rOJw4S8gHBAn#b}CbKA*2Zl7xb;uC8>! zP>PK9mPg#C=I7^QP!JqKMS5xmqkvK*4o4^oaC($A2^iE1sR*{cy*;p+&d$!ddJBf5 zI506}2LX8o5HhFJ>7(et_V)HzqtUn*CY?^pDxzl-iG*$#8#g<_U?_^UgLL7@&<_SF z5~GmGWZ2>1Vds~w4SKFYy^M*`!5E<7NHSLzvj{^InjpwFH#a-imzI`R^%U@9sv9y4 zNHJZ?VisWvg+dnur3cUd%b*<L_EdyHG4nV2K`=PWh{X&T)RGzm4AI4~H6rhE5eQ>J zj1GDa0C1WUA)q?C2QMH!Z!_9~t;%8+Ye!iVu~>}p{{bMw@Ye86dNIRmgrrV~s(uh; zfZ<cx{I3FDa1Jeqcs$+(AsWHZ_mkn{12wGO-QAwT#AaF`FdV2Nk%+Dar@7Dz;0O+j z#bS>-v|x}j+?&hg<U^I=!bRZ`3^pJLI#MWM2;$)2fUU2un|7e;bYD?5Fvwa|6TxUe z+&CPLw}wAONW$103YwjreXo%AH4QyA2<d*i88V&_o19>s(Ll!uY+fpr)F7s$$XbR0 zW2NiZOzgfY5OyQ&UJb@7&7@Jq^+{|>^@87FK@3#TD)yid7HKp4|Ar7@sE#JoApQbI zb@KVgjj37y001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P)<iO bG(~P>Z)9b1s0M%T00000NkvXXu0mjf_2jzU literal 0 HcmV?d00001 diff --git a/assets/kenny/iconCheck_beige.png b/assets/kenny/iconCheck_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..bc4790e7f1e91579f31fc16ca705dacd2719ec21 GIT binary patch literal 310 zcmV-60m=S}P)<h;3K|Lk000e1NJLTq000mG000jN1^@s6?Q>5r0002QNkl<Zc-muN zAQC*gw^#o8{iElf-#=u}Kn?(De)-_|e-M6g|49GcySw>`)(p}B(+tB;?;g32)ivlQ zKfiw@9$hmGKf8Y{A4%aM`=@u0?gwF**pqvQ^??Sw$ENwk{iExV17|+E$sm^?`y1W) zaF^n<0h>5TJ;-H5`4NW!@mN9`yKR`7kIu&$O%VTL_X?8c^LXPP6bpEq{T>w9WF;7I zsNX;8PgatJI=!BxG!Kd*M0_I>6-fY;kU;(>Cc^*#HAJasbZFK10000jbVXQnQ*UN; zcVTj60AhJAVr*}3WMp|RV{&<LbZ;(cZDD6+E>KQKGBibQV{c?-a;OG>?f?J)07*qo IM6N<$f_O84`Tzg` literal 0 HcmV?d00001 diff --git a/assets/kenny/iconCheck_blue.png b/assets/kenny/iconCheck_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef72cde22fb2f178e6c6d14853473bd40039dcc GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1scoJvjv*Ddk`ok!d}bQC*4^5Y z`MmMQyha&@OE$^Jdj2c$q<k+gDfuvY(N6hgl5NZV=hw-v&c5Kwrq$(so#$}ya=)|g zVHx};rS=?$kEr?1TEZ_<-|uT2P-AOT&@k)S;@Lb!oSXJvoXcOXX(wIKv7dcskB0pt z0|mKgjrHno#wS)sEarT5|2s>LUBCG|$Bhl{pQ{5BCQnUpkXUhZ{u&kTujRI$nQ|ho z9<#nro?7U@$@wHd$%uzxK9}nP*Oy82fIiSIag8Vm&QB{TPb^AhNUGFJ%E`}9NvYIJ rE~+dj$=A!wO-xVK0|teWiECbReoAW53by)pK#dHZu6{1-oD!M<iG*(g literal 0 HcmV?d00001 diff --git a/assets/kenny/iconCheck_bronze.png b/assets/kenny/iconCheck_bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..cdaa2f239d8d53bcfdb88e300cde5de81ade3f9f GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1spFn5jv*Ddk`ok!Wab9z)Yl|_ z{h9n(>#gJoMuoHL;@AJNKYYx+>Ua5hpU3KP#sSPe#ys+|5w-HGvoHAC?b~1^7Yh`K zj+n|H&SAux@v2Usty6Yh^g5t9XRC8&`RlBT>gSlldiC=~U$&hrH}AhV*S=e1KJSeq zj;|c`luz~F;9b#koWmk!TVe)Vm1wq!<Dc%k+8nc2pMTt29ia2zTFhrTksB$h5(O*H zul}a4ebOms{VH|Mv(1Y*H1~a<Jhjk)lk-V_k`WKX+>fD~EQ7DJ0KKGJ;u=vBoS#-w zo>-L1kW{Icl#`#Il2WOcTvS<5lCPJUo0y)e2Mik{6W6@t{FKz96>RnIfEpP*UHx3v IIVCg!0Q$>#wg3PC literal 0 HcmV?d00001 diff --git a/assets/kenny/iconCheck_grey.png b/assets/kenny/iconCheck_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..e4016cf7d97d78ab3443a8b0df0f749b4311580e GIT binary patch literal 319 zcmV-F0l@x=P)<h;3K|Lk000e1NJLTq000mG000jN1^@s6?Q>5r0002ZNkl<Zc-muN zAQGIrc2EBNwI}D#U3+ZLKn?(DzI5aHe-OTK?MeTcGk5uk)(p}B(+oG{>XZ9eU4w4& z`Rh;O(KW;H`D@Sek^K1B{=(I#`#~5kcKL}u(DwJ(G+(&(bUi$9E?j>)AKhe-OOXAI z?tHjQ@!5b~{K<Qe%ZTzLR(}K4V+m#Kwqe)~^eWb90{I7*R}kUy<UHQE2gL$Tn?e2t z1~yp<287RDed<qEk_F+5*Pqstl;%NEgotlMq9QTlJj)09o0tp(0Ixo&w~1#FA^-pY zEp$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1jX>DO=WiC)oM=~@;Zewp`Wpbzn Rf9?PP002ovPDHLkV1hcNjg9~S literal 0 HcmV?d00001 diff --git a/assets/kenny/iconCircle_beige.png b/assets/kenny/iconCircle_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e3ca1ed5671c2cfe54b60cc75e16902b6d5cd4 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2e8Rh}-6Ar-fh6Am!VyJNlP|C@gs z|2+TRf9<eA$Nx9?;wssk7?!+vd3W*ecsq-K^5SeKADi%~eEjoo;`bjs4T%%1c$(kc zyL*<u<Wpr5kAp<X7aI@xI|5E|2cDZ&C`?Lb;A#G1yk|%KlKDc;4!=%*<La8u)~~qW zibtoS!rv>Mva6N|2TiuQw}ih)Y@?_A625o5B@Cyy_20?I`WqAqGCQ1e(f4mS*YAF^ zz=MIo@3Z;Q-O;mu16{3K;u=vBoS#-wo>-L1kW{Icl#`#Il2WOcTvS<5lCPJUo0y)e f2lT#?iECbReoAW53by)pK#dHZu6{1-oD!M<ggkQ> literal 0 HcmV?d00001 diff --git a/assets/kenny/iconCircle_blue.png b/assets/kenny/iconCircle_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..7062e5c7d1efbb13987f28a76400c89fa8676546 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2e81)eUBAr-fh6Amz``OaEmU;66G zpO=@HUq5WnVV`<Rq>{~vVF|~I#Q!~##{V84QmCBM)~K?~clI~A`HTiULG6hF?(XdN z0gr49*%Ty8<d*Q~aVY9P_$*~3aMF;W&GDCH!?{<>j|fbt+qAdo(Nf1$58KwZE5Yhz zD<=7Q_<pLGY<D8^h+6Fgs~zSS7)|)ss?XTb!KjeFXu7(?*^e5Me4Gpnb!9a?=i}XH z0o|%w;u=vBoS#-wo>-L1kW{Icl#`#Il2WOcTvS<5lCPJUo0y)e2lTX&iECbReoAW5 T3by)pK#dHZu6{1-oD!M<fsbUC literal 0 HcmV?d00001 diff --git a/assets/kenny/iconCircle_brown.png b/assets/kenny/iconCircle_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..7abf40fe3ce29d58c2492c095da6c454a7b37e12 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2e8)t)YnAr-fh6Am!(o!7l?zioro z{~w1|RY|aY>_4YDEnR`dp{q}C&As}f!ngG?5-R<d4JI7<*lPOzqa?#&g;EK&xASHm ztFKA?TA9S-AQ4h4w}k&87gOAU=cW}3lad*Dn!gy!#0T8<?^IOyn^Mhs)Vuk(KtR?K z4WEWzD}}8?Jk^(|RqpYWf1;B#+0H}uj`RzLDdK)QtD^i33I&-R&bjFO_vx?caX(q$ z!N8ETc~*Sa?0b)Z&ekn)jVKAuPb(=;EJ|fas?<x$$<I$osnkm@sw^nU*UQXJOi$GV e`rpXJH7_|oCADY;Tm3trMg~t;KbLh*2~7a7L21DN literal 0 HcmV?d00001 diff --git a/assets/kenny/iconCircle_grey.png b/assets/kenny/iconCircle_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..d35d80be281cb016b4f8eeeeb381969fb7b0d67a GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2e8m7Xq+Ar-fh6Amz)i>+H!|L@l3 zKi${oUps8jQUC6iZ6%u%!;%+=t}g$rf4AbFyg1v*$0j^E2ezue|0u~|&ar~;@B-uX zcc13(|MtYjknMnhhpmVF9Ra7f1J6w>6ecAz@HBrhX83#Ezf)1+Z%Q@mQSavC0s&b| zjtESsdv$~_^b+SvPr3X{?N4GJO|tWly(9gCVT!n3O!cmL36GT68s>Bc&WouR>Ywy* z0t17yyv4eZ>&xc?9j#m98c`CQpH@<ySd_|;RH>Jglb@fGQmL0*R9R4xua}vdn4YQ! e^u3XZYhH4GN@~#xw)%HKjSQZyelF{r5}E)Fd~n<V literal 0 HcmV?d00001 diff --git a/assets/kenny/iconCross_beige.png b/assets/kenny/iconCross_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..32278dccd955874b321a7410a35a84342a32065a GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1srjBRjv*Ddk`o%5o`3H@(rmyi z*AUF>@!@In<NuBl(-keQDtI6G(EZ!}SD>l<TK8~fbCx9%u|kU;yr^06?B|Xr@9*6` zd%nT{;^p1$?;ab=obA8Cd(h;|i#nTyJ@*9`{HffrxsY)J?+sJ=O8)@kZ4!zv%9BhV zcO^|S5uQ6Cf$`g$dvTQlz1IbD6#HdvDM&>hc;w@;gQ;tQRKSA-UInHs2DdD}R{l`m z-$1A8mbgZg1m~xflqVLYG9*>%CFSJjr=(QsB^Ol|l;rDW<|d}6>H+<1Wa65aoS%|f Uw1Tbv9Z(~Kr>mdKI;Vst0Kz$JwEzGB literal 0 HcmV?d00001 diff --git a/assets/kenny/iconCross_blue.png b/assets/kenny/iconCross_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab70a18ce0590995d90340d15327f287575b306 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1shOTGjv*DdrUo74ZBXEO!`Am8 zqwmr5`SMJEBw7V!4hqURW-2XHv|Z&ZB~(?Oxn8wOsbxdKB?W~x`(Q6|b)iOyNP!05 zNy$B{n<8f&xF&9?t!e+H=heBLojex|g_f`L4Ruizf3Zn5==k0H+t`&@C-_fZlY3;& zUv0^?Kg552Rx~}l=ezNKXTh_TFU|JP+W29@gg~{nvw^%u2IezYOmX+Sa^x@2k-8<W z5hcO-X(i=}MX3x)m3m1z`S~d+m3qlVl?5gFdYQS2>8W}^-x`^?<|XH+q!z7UtA7X7 O$l&Sf=d#Wzp$P!?NMw2d literal 0 HcmV?d00001 diff --git a/assets/kenny/iconCross_brown.png b/assets/kenny/iconCross_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..7cce69ada1e4cb5a85cfbf0b4acd6ab9b6f1a5cd GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1skxpmjv*Ddk`o%59&>9ycAUY; ze_$n>N<~rO+j@axsT_W$Cxi-ExmW!TG!4I+yrNN(DX2$}(=^2{q|Q$7=UwB=KO{eB zTJ75K%g*j_;NOnJ0y=H)j?126;j!Ge;g`*wn>!dzu)Ud;eNXsGkFFcXuelLtcPyHr za@Iv%C89xgZm<sjqK{Hdx=$uLOS>d<N6g{m40jL=Vdj!q!|39`%W%hK`75FKjvycC zmbgZg1m~xflqVLYG9*>%CFSJjr=(QsB^Ol|l;rDW<|d}6>H&RhWa65aoS%|fw1Tbv Q9Z(~Kr>mdKI;Vst06-^U(*OVf literal 0 HcmV?d00001 diff --git a/assets/kenny/iconCross_grey.png b/assets/kenny/iconCross_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..f57ccd8c322d5474a09f734c61f72fc63f65f442 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1simGSjv*Ddk`o%5K3|`Iq}hO3 zt|6G$<HM!i=l>lgrYl-pRq#IWp*7q8*F@9!J^!}I#q!<}n2=QBxk2&z{B!K5nKNTP zrJuX=H2uKp7q2G&{=wtUxP#}Q$(NUPa~ArXnDF`fygBXG(#sVcq&M8Ed3&<DY1YQ0 z9FF^iS4)PAOkOhcMGFh}hT`k*PBv%kX-nX)d~$*9;teLTbf-h20W4P=nAo!!1Ou2E zxa0YLiYY6&0UfMc;u=vBoS#-wo>-L1kW{Icl#`#Il2WOcTvS<5lCPJUo0y)e2lTm- biECbReoAW53by)pK#dHZu6{1-oD!M<vmI|h literal 0 HcmV?d00001 diff --git a/assets/kenny/panelInset_beige.png b/assets/kenny/panelInset_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..f92416fa221ee96a706413b02140b7ecf08e46e1 GIT binary patch literal 631 zcmeAS@N?(olHy`uVBq!ia0vp^u|OQh!3HE9pGxF1Ffg%tx;TbZ+<JR=qc>Ba%z=-S z?-=U{wm+Mek)4^Dv3l)F#U;xWR_MAf-|*zzv$l?7SsY!b4qaZV5D>K5_J#b4{|nxg z&t2Bse9-p(>h&L<UMrXH`&{GyF7n!U^;f2kM8A7UUYHSn<ki0umMW%l#Wn_g+t}t9 zu<RDEaVh?APUv3)_syw0+fUyq-MXXtf6UF_SN7iW{g;|pR;1J*KWXtC=ewnLC9<1u zbZzXpyx&JI|8u@t!uJOMlY!|U&K<e6YHmuKFZ27B`%$y!Ph0Hy_}luD;ETSzB^Mmk z5$Ni59r1gP;kFM$@62S1eHt3K>GE4uafd_iA8BlU8F<_w{Knm%-wHPri7?k1d|1HG zAXhT)GO~V0_PGuSBwNCSgf4KFAP`(rseAr3u2KV$#rZntduD&L%6WY8sjSK;FCGVx zMa<{KHD9n;y<pjuY2Ww8MB>%_%WGeS=7|byeeo}?`d#KVHq|>)>xyqU`M=ut{dW9| zlcncwZ5KOm*k4UF_4F<?s|OF&CU^e6x%A??yTOf|+nLjA4R7e1a_w65#82pr^Dk!p zo}!8i><s+7vMMgj{J;cu`hWHRA11Z(i`my1etc>rDj#dMF?-6J>vadBgE<a-H=O=X zviqy}8}YXan`A0OfayZF#5JNMI6tkVJh3R1A*oU?DJMTaC8bg?xu~+BBwsHxH!(d` g516uyOkDGl^HWlbR<PB-18QXOboFyt=akR{0G7TWg8%>k literal 0 HcmV?d00001 diff --git a/assets/kenny/panelInset_beigeLight.png b/assets/kenny/panelInset_beigeLight.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed1a7bc90f65bce6867a26062079b362c4a3b6d GIT binary patch literal 629 zcmeAS@N?(olHy`uVBq!ia0vp^u|OQh!3HE9pGxF1FfcKDx;TbZ+<JR=qu(J1nTC%- zH;*o8F|gRZ@h3}P-kD=Z*bn?*(aZb9qIaydrSr&97xttc7N@C>zC9dMP9+&$G{5kB zdXs^H!Iu{=uRrm={#xHR^PR`}O>OQmTNin)GGg1ZtSj<zdyKQyp=3X{V;?Uz1h*xe zZ|ZlIso6Be{=w$Sk9D8_e75NRs(W>N?$*2S{pbDFaQf|g91o^H(YgMh^zHf+eUUf2 zHuhZJ@B3@*tZb%lJU@EoEatK6jW1qX_B-pQ$p_CLiw`&ZTFy4f`|oEidiRP0yKD&) z9L3f%KYu4&a&~X|tH=wbP2b<#{WytR;bHi0z4zL$SYAj~*RGh-G<7k{i|$7DTE-6x zKF{N`YD7XWSga6ef$$3iYW7=zKyV#$r6udr%@1DanRovEn%Unha~@xODy{O#lgGhi z5%W2IO|W6RB42z;^)dLee|dD?>Rs#|aV7Pe_p1Ni#Nf4~((iFe%e=l{_wwr(HfB#h z-Y<5*^v*-u-I~$YdM`5ao6q#o5#wGRyn8v5aNhH!lVdi-XUUYr_KSU0;ryofx0T(^ z+U5m!1ADBw%?qE3Mz9nAPp+>xd5FDR{`2xPT8F1D_OpF$+567s!D3C82hV4Dzwi3W zFZ1@1`^MMhlE74<TjCl~5}cn_Ql40p%8*p4mz0yApOR9kmt0g?P?E2gnVXoNss~J0 dMkcO#$@wX%MJw3q-vKo;c)I$ztaD0e0su?9A|e0) literal 0 HcmV?d00001 diff --git a/assets/kenny/panelInset_blue.png b/assets/kenny/panelInset_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..0c2b5851e38c010d067501f099cbf88ebc97a492 GIT binary patch literal 626 zcmeAS@N?(olHy`uVBq!ia0vp^u|OQh!3HE9pGxF1FfcKAx;TbZ+<JR=qc>Ba%z=-S z?-=U{wm%cg<cNy7ox{;|K+JK4Atw{}rPo&uFVHx>dh5=W8#k`pxzzTB{E7by-j&at z&gaDXy=MKsL(`-0*IJzWY`Zf(a{l}!_j}@R>8Cps*KuZlQGPz*YQ>qC7c49#3XTc9 zDg3~B_F(&I7Up|5?nGH`Isfjp-}jAIch+6s>$ds#ob&p+Egyo5rW6;%tY80n#?i2z z)Hw%JleX)}`5usCo<Di<xd(?kw}!5k^`FgV#}lu!PWSZ1C57zayH>tf#%A?mfiMES zDvo*2TXJ=C@7dF?7eeEn>aLg3-N_(SZ@s&BmH%9(*hKcPlW!M1)nNUV^1yLEgUt(@ z<;{Kz5QxvJ5edCuu|gnZYY;kK_r2S3PgtVsB6sW6%FA)>xi-7@G`qxgGIltX9Qdik zI@f`Hu7mlT<AJBOn-~7Gyu0b`XD)@Ti_K@hefws;e8G|16L0U9T##OR|My${D<$jS zEsExT@KJqo*QV6i7QTu-CsUGEZn3rARIO$3F>GDP^}~OICNEgMd+V3OwI2H)GzRkV z|6+OI7|zRYB^(EF;QuG`ahpCId~|%hoTNNc$;~6@GQY>wG0FK(WBgxRa6e*=J;UOk z!Pjp*I;0Cs61pX>5hcO-X(i=}MX3x)m3m1z`S~d+m3qlVl?5gFdYQS2>8X0aL}g^+ anwOlPl3KKat^OTQBZH@_pUXO@geCx~XD819 literal 0 HcmV?d00001 diff --git a/assets/kenny/panelInset_brown.png b/assets/kenny/panelInset_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..fc293f144b4acc58ac8c44ea2f7cb4ff532fc252 GIT binary patch literal 626 zcmeAS@N?(olHy`uVBq!ia0vp^u|OQh!3HE9pGxF1FfcKAx;TbZ+<JT0*88x7Ov6W! z-O($jZEIfKp`auxUOI8oz8j7&)+t0C30oY0Ahdl^h?LCSxiYeI=j`6WUB~#Bt?K`b zYh^D26t7#?GVw?1+dE0=Jv~>ruYX6D*VK?y-3&L;VmAJrZCef|`?VeW_^u&%S^|G_ zza-zicrA$!2d@?Vdv&5V=jz?(w>N)U{&K5S>-0NGX?891Cv1*su8;a-P<G~2SWoJl zgSkb;F%_E`t2t`I&Z#wjSHE^HRo6UIy2Ad?w_}G^&B>K2FIaxND=&LNGoMu>9Idmz zuf4x{UG<^W5A_<?ZT!}``}XfAOden6zF$+_WyQGb*sS)SzdxJ~Wcu>)K(ifN#f3_L z_PGuSBwNCSgf4KFAdsW_1q6cYFqggi-AmTMWO4X4qs`lN+jDJqt#MTHPGVRjC|gkH z0nzc+Y5G*dgBSkKdlz&4b9KWDSAMhGyKmgjX%foa7ry89qUFB#f4|Ld5SOd!7duee zFx_fXYAnC(hm6T5k3^;BRV926Nmz7t^}3M5e}f(`cwMz+g}Ubs{+IkV2DctM$}`)% z*!9pc{SY_U>3`?{IqYp$^Wo#;@ZjD4jJtA@u7B%Vzqp}%xj=*bL$}alNq<=@`n>Xe zxnuSLlZ0-GYeY$Kep*R+Vo@qXQl(x}PJVt$N~K<MQDs3%zFuZ-VtT3`Fi{zqxaKA2 Xr=%9GV5@%z)X3oJ>gTe~DWM4fm@^j{ literal 0 HcmV?d00001 diff --git a/assets/kenny/panel_beige.png b/assets/kenny/panel_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a1d99d5249af3b6cb7e68681bb806e3b95d24b GIT binary patch literal 786 zcmeAS@N?(olHy`uVBq!ia0vp^DIm<j1|$m}O$}jSU|Qhm;uunK>+Rk9ewPzu+CSc7 zoc=(yz%!1ieU{|KBMXw!ES`C|b{J=y`!;iDPLo`e^q*tK#?by9EP4w+t*xBSH_;&Z z_Vy>4pIUMXF8s4wn5vs8yL`ivh1I{^-+WbHXdYz0|Euw@|1*DPUAufD*0bsC(nZb2 zeAcHY->^-M_&P;x@8*}!-$q-um3(R2S6Fo6<hQ@QIxp5e-CJMT?sei!_~vV8il>~g z{k3;?*IstE!}qfcH*{S-ldkc+o#*(QRc(8h|K#T>dzTttK0oDRf~|DF*&6+u)zf~i ze|Ii-$+m|TKknQry_RE|ymtAu@Xga3`!xG*_Rs9K<hj+`@I$(5->sfNpUq~)=6uBp zw`MF$6bUSg-~MU6Z`6Bj$B<yhSyBoO0x-nD#G%k|W74^uj7frRmbbY(SXuMKpX*67 z1SKDSci3JpgfS>N{?GA-8+}Y2sTvI*EL#{D;fO`RfddI4$pDq$k<4Pvymgs1&!$5z zlCjHG!D~BjQpB`|hJ%i>0uBs{4h##897-m~v!&jAE)bx@9QgaMJI|UY>q_t6Q?v2@ zwk$D*lgaJp%b15--~Z)v`zawlKkw}Py{6l~Kl``zd?@>pWqNjz>;m3_3>$e^1-t_o z9zIcGWa0p#P_9pj>0jsnFAlu!zoTta1u$gi?@ZHgHhDSMa`FY~mq(A6zrA_$-r)s% z1=z&5iTN9w$@7?2OP)A1)9qbX+#Hz_qx#jQFFW<M^v}isLtST%%8i&=N8YWx_v2rt zHTSM;o>hxXvd`Xmvo7UfhGhHP)V+y)>LIzAPvlM>(A2x+nf#vB;Hp!Gx#{n-7V&kA zSsJNj^B!eN1Cy+7iEBhjaDG}zd16s2LsF$)Qciw;N=l_(a#3YLNxoiYZen_>9x%}x cnYiX9=cl9=tzfHv2h_;m>FVdQ&MBb@0Kpqjm;e9( literal 0 HcmV?d00001 diff --git a/assets/kenny/panel_beigeLight.png b/assets/kenny/panel_beigeLight.png new file mode 100644 index 0000000000000000000000000000000000000000..8ccf82cf70d500ed7d5e627f70b54e56cb02ed2a GIT binary patch literal 785 zcmeAS@N?(olHy`uVBq!ia0vp^DIm<j1|$m}O$}jSV4Cmg;uunK>+M}f|H}z7$3H%o z{UB7sxkn|A$-OVmq9Eh>Ozt~73ydCK*mR`jMdHhAg0Us178$5)TI<X@#ry91)6KJ$ z3Xg5`Ke_#+`DwQHZ~sqPU7K`m#!OYdJyXkGyg#-uKD_;_y5`^iZ)!G2vfs-}PS4G} zcF?6-`t;fZuMO8sYWSAz`K9D<V4I@s-Uad{d}fz7=gsK*-MeP?`S+UbZ)!}l&)PV1 zW}SVRr}afXy61J^^hVJ+Y5#<eMjMueoBsJw^NaiB?vg(r4SfA>zkFa(v@g)!Z-4xk zXXZtlc$*(D+x&XX&8%Zl{%hB#=`+_Zlh`f4S=!hpGnDC(zeZJwWU|@WTj%atooVzj zS6h|h^wZ4ll-%kq_r5o+Sk)9_>cF4~LyRl}4h)6M)fDs+Z!F&1U~%DT!M{7g3aZ~q zKm6J*9NIAD#?hPJ4l(YGM+`+Ae#kjBFu)NLhXM-{LXrV0!6Uh}Ddg=tCVn}W?Q0m0 zDhez;&1R_M?r`9Nvn<dlK!+`~aVVJ>&-V1jcYy#I=D>KnQi+Ijf3KESuP)HP+1^&D z&mr-1d2%av%x~GAJ%)9AcbnFKn|9;si??&Xhq5o(^6dQ@=8nZ04Hj)o9m*OF1qBls z7+Zjdi*=_>{nzvVcdq!XKF2w7&yy{4&&F(??zku3+ehYCsja1bRay0x@`_7Q9L>Vf z-OD9!>$lCSWi#4nQ21c&E6?W%#(U*T-`jj}{ke2z_BY8BM-G{kU7Hrwc>OYWeq7Gd z$92t)qEph=&b)nhs!q?ejQr$C{Tt_nwYFKTFilNJoBn35(68GEM7S5;z4F#NdD9<; z`=Qq_*epD_37BGaOI#yLg7ec#$`gxH8ImgXl5+C%Q&KARl8Y(}O7itGa}(23^?+&K c$iy`-IX@+}Xa!sSJD^4ePgg&ebxsLQ0Km9amjD0& literal 0 HcmV?d00001 diff --git a/assets/kenny/panel_blue.png b/assets/kenny/panel_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..cf58c662e703e08e83f31c56834224e6810ee1ac GIT binary patch literal 785 zcmeAS@N?(olHy`uVBq!ia0vp^DIm<j1|$m}O$}jSV4Cmg;uunK>+RiouiFVS$3H%2 zlS_2}VDi`9>vD<0BEHOB|66(=rmamA`*U#%n>E|yv%L=mt62IU2--M(5w2DFDqf~@ zQn-@+-juNa9{coX&2o`SHu654Umd4y@%hg=m!J9f)xZ4T{Q2q{>9gOW)^4+yUTX05 z*Q-6x*~NKQ>nwOsl$iL`w@XoW?*e%p-Sz78&G;r2l+O{9|G!jb6Ht@sXOX3%bMC)c zHtV2!w_vZIWW>SDXJW4MlE>by+P3ZS7jd@3@h87sf4oHe*h#nY2Q_!+E>02oKl7GH z?&0TaPuwiMmSdW{cKNmN&HHPo&yn0Mzgc?oP3bVEN17tGyLu-2Zr)bBoiAA7){Iq& zDS>V7`!65YTKj#o!m3pYp}YbP95BSd$Rgkn<N5p!Lm|iEd2d;dG=5`O51!7$pt*5x zvpm0E2xCxEVm(jCYmEkrHYSeaiYy!oaMZxygoK!oWPnPLWPqxWB}244uD;Xz@XE2| zG*^HOljr-1SLBU#!W|AgaF!KtU{G{mSZL$$MRh;Vsf~{X0%Vv2|L%Ryqw_rO%ig`A zJEp(MK3pNj((~u?&O_q$->oHnCg0h=+qC}Mv>S<EK41L3ia99g`};M_9gD#(?oiff zC@7l9z}NyrT&y?kZGJxgA9Lla@VbR(;`Dni&&>X2^x@BgOBHqLi`3(HUA%kq-r0Kv zYCL*5XXmBm@bj4dmY#6#h{>$CrnZq$asG=gzFe%nPh-DH@!2@GO$J+UJ-YKX`l*xt znmxZKwCql13k{gHH7&0^e3L=ctFKop_a@l;ueh-%tU!->a_o}J8Ep3(G{u~DuiRaJ z>}wILPxo=pPqG^$fGJkD#5JNMI6tkVJh3R1A*oU?DJMTaC8bg?xu~+BBwsHxH!(d` g518hSOkDGl^HWlbR<PB-18QXOboFyt=akR{05G^wA^-pY literal 0 HcmV?d00001 diff --git a/assets/kenny/panel_brown.png b/assets/kenny/panel_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..97c381ba6000d74d29284c3e8bef0f9929c8ffdb GIT binary patch literal 799 zcmeAS@N?(olHy`uVBq!ia0vp^DIm<j1|$m}O$}jSU|Q?x;uunK>+Rk9S(g)J+CP5h zE8~ni#8;+fJ>g38LZcLmgPg@CFV*;Dlos=RyuYQ>$m(mxi3y98xLl7FJbI{?IDLcn z4b?s0q<>8-Ik&OP^Ip&L4*|E{D*UX?*rcXxsP?(zuy^?*w+)kBw$^^l`nYN7|M|1m zr`_es);@c)bK{!k$o2kx>WKv>Hk{JzYg#<LSX_UJ#HEYUzZ|P8Pt{cwoi2Oax+VVo zyFk93KeMjQs+51K!0Nf^!OFuoZpS1gur8m;A5gWM=doGn{kSvB_ixxOc(cDh@5Z@X zJ$I`Lj{deYS$}(e{yV<4ORhcqdpP@^-sZH`lG&D9_spv0x^#QF#CF+Y?ah0wVmUkZ zFMM$`y(eeZ*4ev@C73Rr3gK1m{<L`S47>2mo&KzWp{y&j8W@~lh>1g?f#H$2)ibsZ zcZqiy`U-MiY$fd&IXpT`qd(WrS;4gAh@JgD&W`sQ4Ha!n9QU0$1RUUqfw2V%u^`C+ zl_1FgRUu2R2$`_zZtR0Q%`c{jE~sExRB}_H?I|aR#G5OOKy^$k0;iZ=#DAs+%&X;R zJZdcP_3KX==F>ZkW4CYT`aa1vUt)Pv!^C>4u!?8d`<o})AN#mF`g3}I=i5E&=2yg* zI(WVMF}IZAqX?_O`2dEGEUW^2dO`{f0tyWQ3l(-t_tyVA?>g81q0FflrPtDav6o1% zbd+IrSL@9BUG?$l&9?_H-g|rX<wOIEjiyzzHvUdpar3l;*fP;;VP6*QwMqSMHr>zW zgX_<wGqb-LO=!(L=hvf}Sg^wU-o5=<yFW5DYiXQ~GA^I39VuaZ?e*lxRfpgDueedQ z*?vOfNxNV3r|=mZb;>X{{gLuTZa-t;1d$aJmQV5lreEC>*NBqf{Irtt#G+J&q)NS{ zoc#QhluEtiqRN7je7(%v#Pn1>U=A=cam`E4Pf0CW!B+ncsFA_b)z4*}Q$iB}Caqhj literal 0 HcmV?d00001 diff --git a/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs b/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs index c2d75f9..fdd4797 100644 --- a/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs +++ b/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs @@ -130,7 +130,7 @@ pub fn extract_nine_patch( extracted_quads.push(top_middle_quad); // Bottom - let bottom_y_pos = layout.posy + (layout.width - border.bottom); + let bottom_y_pos = layout.posy + (layout.height - border.bottom); let bottom_left_quad = ExtractQuadBundle { extracted_quad: ExtractedQuad { rect: Rect { @@ -245,7 +245,7 @@ pub fn extract_nine_patch( }, uv_min: Some(Vec2::new( border.left / image_size.x, - border.bottom / image_size.y, + border.top / image_size.y, )), uv_max: Some(Vec2::new( (image_size.x - border.right) / image_size.x, diff --git a/examples/full_ui.rs b/examples/full_ui.rs new file mode 100644 index 0000000..ed9b075 --- /dev/null +++ b/examples/full_ui.rs @@ -0,0 +1,197 @@ +use bevy::{ + math::Vec2, + prelude::{App as BevyApp, AssetServer, Commands, Handle, Res, ResMut, World}, + window::{WindowDescriptor, Windows}, + PipelinedDefaultPlugins, +}; +use bevy_kayak_ui::{BevyContext, BevyKayakUIPlugin, ImageManager, UICameraBundle}; +use kayak_components::{NinePatch, Text}; +use kayak_core::{ + context::KayakContext, + layout_cache::Space, + styles::{LayoutType, Style, StyleProp, Units}, + widget, Children, EventType, Index, OnEvent, +}; +use kayak_ui::components::App; +use kayak_ui::core::rsx; + +#[widget] +fn BlueButton(context: KayakContext, children: Children, styles: Option<Style>) { + let (blue_button_handle, blue_button_hover_handle) = { + let world = context.get_global_state::<World>(); + if world.is_err() { + return; + } + + let mut world = world.unwrap(); + + let (handle1, handle2) = { + let asset_server = world.get_resource::<AssetServer>().unwrap(); + let handle1: Handle<bevy::render2::texture::Image> = + asset_server.load("../assets/kenny/buttonSquare_blue.png"); + let handle2: Handle<bevy::render2::texture::Image> = + asset_server.load("../assets/kenny/buttonSquare_blue_pressed.png"); + + (handle1, handle2) + }; + + let mut image_manager = world.get_resource_mut::<ImageManager>().unwrap(); + let blue_button_handle = image_manager.get(&handle1); + let blue_button_hover_handle = image_manager.get(&handle2); + + (blue_button_handle, blue_button_hover_handle) + }; + + let current_button_handle = *context.create_state::<u16>(blue_button_handle).unwrap(); + dbg!(current_button_handle); + + let button_styles = Style { + width: StyleProp::Value(Units::Pixels(200.0)), + height: StyleProp::Value(Units::Pixels(50.0)), + padding_left: StyleProp::Value(Units::Stretch(1.0)), + padding_right: StyleProp::Value(Units::Stretch(1.0)), + padding_top: StyleProp::Value(Units::Stretch(1.0)), + padding_bottom: StyleProp::Value(Units::Stretch(1.0)), + ..styles.clone().unwrap_or_default() + }; + + let button_id = self.get_id(); + let on_event = OnEvent::new(move |context, event| match event.event_type { + EventType::Click => { + dbg!("Clicked!"); + context.set_current_id(button_id); + context.set_state::<u16>(blue_button_hover_handle); + } + _ => { + context.set_state::<u16>(blue_button_handle); + } + }); + + rsx! { + <NinePatch + border={Space { + left: 10.0, + right: 10.0, + top: 10.0, + bottom: 10.0, + }} + handle={current_button_handle} + styles={Some(button_styles)} + on_event={Some(on_event)} + > + {children} + </NinePatch> + } +} + +fn startup( + mut commands: Commands, + windows: Res<Windows>, + asset_server: Res<AssetServer>, + mut image_manager: ResMut<ImageManager>, +) { + commands.spawn_bundle(UICameraBundle::new()); + + let window_size = if let Some(window) = windows.get_primary() { + Vec2::new(window.width(), window.height()) + } else { + panic!("Couldn't find primary window!"); + }; + + let handle: Handle<bevy::render2::texture::Image> = asset_server.load("kenny/panel_brown.png"); + let panel_brown_handle = image_manager.get(&handle); + + let context = BevyContext::new(window_size.x, window_size.y, |styles, context| { + // Hack to trick the proc macro for right now.. + let parent_id: Option<Index> = None; + + let nine_patch_styles = Style { + layout_type: StyleProp::Value(LayoutType::Column), + width: StyleProp::Value(Units::Pixels(512.0)), + height: StyleProp::Value(Units::Pixels(512.0)), + padding_left: StyleProp::Value(Units::Stretch(1.0)), + padding_right: StyleProp::Value(Units::Stretch(1.0)), + padding_top: StyleProp::Value(Units::Stretch(1.0)), + padding_bottom: StyleProp::Value(Units::Stretch(1.0)), + ..Style::default() + }; + + let app_styles = Style { + padding_left: StyleProp::Value(Units::Stretch(1.0)), + padding_right: StyleProp::Value(Units::Stretch(1.0)), + padding_top: StyleProp::Value(Units::Stretch(1.0)), + padding_bottom: StyleProp::Value(Units::Stretch(1.0)), + ..styles.clone() + }; + + let header_styles = Style { + width: StyleProp::Value(Units::Pixels(432.0)), + height: StyleProp::Value(Units::Pixels(64.0)), + bottom: StyleProp::Value(Units::Stretch(1.0)), + ..Style::default() + }; + + let play_button_styles = Style { + width: StyleProp::Value(Units::Pixels(54.0)), + height: StyleProp::Value(Units::Pixels(45.0)), + ..Style::default() + }; + + let options_button_text_styles = Style { + width: StyleProp::Value(Units::Pixels(102.0)), + height: StyleProp::Value(Units::Pixels(45.0)), + ..Style::default() + }; + + let options_button_styles = Style { + top: StyleProp::Value(Units::Pixels(15.0)), + ..Style::default() + }; + + rsx! { + <App styles={Some(app_styles)}> + <NinePatch + styles={Some(nine_patch_styles)} + border={Space { + left: 30.0, + right: 30.0, + top: 30.0, + bottom: 30.0, + }} + handle={panel_brown_handle} + > + <Text + styles={Some(header_styles)} + size={50.0} + content={"Name My Game Plz".to_string()} + /> + <BlueButton> + <Text styles={Some(play_button_styles)} size={30.0} content={"Play".to_string()} /> + </BlueButton> + <BlueButton styles={Some(options_button_styles)}> + <Text styles={Some(options_button_text_styles)} size={30.0} content={"Options".to_string()} /> + </BlueButton> + <BlueButton styles={Some(options_button_styles)}> + <Text styles={Some(play_button_styles)} size={30.0} content={"Quit".to_string()} /> + </BlueButton> + </NinePatch> + </App> + } + }); + + commands.insert_resource(context); +} + +fn main() { + BevyApp::new() + .insert_resource(WindowDescriptor { + width: 1270.0, + height: 720.0, + title: String::from("UI Example"), + ..Default::default() + }) + .add_plugins(PipelinedDefaultPlugins) + .add_plugin(BevyKayakUIPlugin) + .add_startup_system(startup) + .run(); +} diff --git a/kayak_core/src/context.rs b/kayak_core/src/context.rs index 7e39265..59d1d52 100644 --- a/kayak_core/src/context.rs +++ b/kayak_core/src/context.rs @@ -38,6 +38,7 @@ impl KayakContext { &mut self, initial_state: T, ) -> Option<Ref<T>> { + dbg!(self.current_id); if self.component_states.contains_key(&self.current_id) { let states = self.component_states.get_mut(&self.current_id).unwrap(); if !states.contains::<T>() { @@ -62,10 +63,12 @@ impl KayakContext { } pub fn set_state<T: resources::Resource + Clone>(&mut self, state: T) { + dbg!(self.current_id); if self.component_states.contains_key(&self.current_id) { let states = self.component_states.get(&self.current_id).unwrap(); if states.contains::<T>() { let mut mutate_t = states.get_mut::<T>().unwrap(); + dbg!("Mutating state!"); self.widget_manager.dirty_nodes.push(self.current_id); *mutate_t = state; } else { diff --git a/kayak_core/src/styles.rs b/kayak_core/src/styles.rs index 17266dc..a1671dc 100644 --- a/kayak_core/src/styles.rs +++ b/kayak_core/src/styles.rs @@ -49,6 +49,10 @@ pub struct Style { pub padding_right: StyleProp<Units>, pub padding_top: StyleProp<Units>, pub padding_bottom: StyleProp<Units>, + pub margin_left: StyleProp<Units>, + pub margin_right: StyleProp<Units>, + pub margin_top: StyleProp<Units>, + pub margin_bottom: StyleProp<Units>, } impl Default for Style { @@ -70,6 +74,10 @@ impl Default for Style { padding_right: StyleProp::Default, padding_top: StyleProp::Default, padding_bottom: StyleProp::Default, + margin_left: StyleProp::Default, + margin_right: StyleProp::Default, + margin_top: StyleProp::Default, + margin_bottom: StyleProp::Default, } } } @@ -164,5 +172,21 @@ impl Style { StyleProp::Inherit => self.padding_bottom = other.padding_bottom.clone(), _ => (), } + match self.margin_left { + StyleProp::Inherit => self.margin_left = other.margin_left.clone(), + _ => (), + } + match self.margin_right { + StyleProp::Inherit => self.margin_right = other.margin_right.clone(), + _ => (), + } + match self.margin_top { + StyleProp::Inherit => self.margin_top = other.margin_top.clone(), + _ => (), + } + match self.margin_bottom { + StyleProp::Inherit => self.margin_bottom = other.margin_bottom.clone(), + _ => (), + } } } diff --git a/kayak_core/src/widget_manager.rs b/kayak_core/src/widget_manager.rs index 97ed85e..dd141b2 100644 --- a/kayak_core/src/widget_manager.rs +++ b/kayak_core/src/widget_manager.rs @@ -139,6 +139,7 @@ impl WidgetManager { right: crate::styles::StyleProp::Default, top: crate::styles::StyleProp::Default, width: crate::styles::StyleProp::Default, + ..Style::default() }; for dirty_node_index in self.dirty_render_nodes.drain(..) { let dirty_widget = self.current_widgets[dirty_node_index].as_ref().unwrap(); diff --git a/kayak_render_macros/src/children.rs b/kayak_render_macros/src/children.rs index f948e67..88dd8dc 100644 --- a/kayak_render_macros/src/children.rs +++ b/kayak_render_macros/src/children.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use crate::{ arc_function::build_arc_function, attribute::Attribute, @@ -95,60 +97,101 @@ impl Children { _ => { let mut iter = children_quotes.iter(); - let first = iter.next().unwrap(); - let second = iter.next().unwrap(); - - let first = build_arc_function(quote! { child1 }, first.clone(), true, 0); - let second = build_arc_function(quote! { child2 }, second.clone(), true, 1); + // First get shared and non-shared attributes.. + let mut child_attributes_list = Vec::new(); + for i in 0..children_quotes.len() { + child_attributes_list.push(self.get_clonable_attributes(i)); + } - let children_attributes0: Vec<_> = self.get_clonable_attributes(0); - let children_attributes1: Vec<_> = self.get_clonable_attributes(1); - let (children_attributes0, children_attributes1, matching) = - handle_tuple_attributes(&children_attributes0, &children_attributes1); + let mut all_attributes = HashSet::new(); + for child_attributes in child_attributes_list.iter() { + for child_attribute in child_attributes { + all_attributes.insert(child_attribute.to_string()); + } + } - let base_matching: Vec<proc_macro2::TokenStream> = matching + let base_matching: Vec<proc_macro2::TokenStream> = all_attributes .iter() - .map(|a| { - format!("base_{}", a.to_string()) - .to_string() - .parse() - .unwrap() - }) + .map(|a| format!("base_{}", a).to_string().parse().unwrap()) .collect(); + let all_attributes: Vec<proc_macro2::TokenStream> = + all_attributes.iter().map(|a| a.parse().unwrap()).collect(); + let base_clone = quote! { - #(let #base_matching = #matching.clone();)* + #(let #base_matching = #all_attributes.clone();)* }; let base_clones_inner = quote! { - #(let #matching = #base_matching.clone();)* + #(let #all_attributes = #base_matching.clone();)* }; - let cloned_attrs0 = quote! { - #(let #children_attributes0 = #children_attributes0.clone();)* - }; - let cloned_attrs1 = quote! { - #(let #children_attributes1 = #children_attributes1.clone();)* - }; + let mut output = Vec::new(); + output.push(quote! { #base_clone }); + for i in 0..children_quotes.len() { + output.push(quote! { #base_clones_inner }); + let name: proc_macro2::TokenStream = format!("child{}", i).parse().unwrap(); + let child = + build_arc_function(quote! { #name }, children_quotes[i].clone(), true, i); + output.push(quote! { #child }); + } - let tuple_of_tuples = iter.fold( - quote! { - #base_clone - #cloned_attrs0 - #base_clones_inner - #first - #base_clones_inner - #cloned_attrs1 - #second - }, - |renderable, current| quote!((#renderable, #current)), - ); + // let first = iter.next().unwrap(); + // let second = iter.next().unwrap(); + + // let first = build_arc_function(quote! { child1 }, first.clone(), true, 0); + // let second = build_arc_function(quote! { child2 }, second.clone(), true, 1); + + // let children_attributes0: Vec<_> = self.get_clonable_attributes(0); + // let children_attributes1: Vec<_> = self.get_clonable_attributes(1); + // let (children_attributes0, children_attributes1, matching) = + // handle_tuple_attributes(&children_attributes0, &children_attributes1); + + // let base_matching: Vec<proc_macro2::TokenStream> = matching + // .iter() + // .map(|a| { + // format!("base_{}", a.to_string()) + // .to_string() + // .parse() + // .unwrap() + // }) + // .collect(); + + // let base_clone = quote! { + // #(let #base_matching = #matching.clone();)* + // }; + + // let base_clones_inner = quote! { + // #(let #matching = #base_matching.clone();)* + // }; + + // let cloned_attrs0 = quote! { + // #(let #children_attributes0 = #children_attributes0.clone();)* + // }; + // let cloned_attrs1 = quote! { + // #(let #children_attributes1 = #children_attributes1.clone();)* + // }; + + // let tuple_of_tuples = iter.fold( + // quote! { + // #base_clone + // #cloned_attrs0 + // #base_clones_inner + // #first + // #base_clones_inner + // #cloned_attrs1 + // #second + // }, + // |renderable, current| quote!((#renderable, #current)), + // ); quote! { Some(std::sync::Arc::new(move |parent_id: Option<kayak_core::Index>, context: &mut kayak_core::context::KayakContext| { - #tuple_of_tuples + #(#output)* })) } + + // quote! {} } } } -- GitLab