From 8cb783f5f86f681dd1af2d339bccc64d24ac8296 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Thu, 12 May 2016 23:37:52 +0200 Subject: [PATCH] Setup keyboard alignments for all Corsair keyboards. Converted Dota2 to use profiles --- Artemis/Artemis/Artemis base layout.png | Bin 0 -> 54263 bytes Artemis/Artemis/Artemis.csproj | 2 + .../KeyboardProviders/Corsair/CorsairRGB.cs | 56 +-- .../KeyboardProviders/KeyboardProvider.cs | 2 - .../KeyboardProviders/Logitech/Orion.cs | 6 - .../KeyboardProviders/Razer/BlackWidow.cs | 4 - Artemis/Artemis/Managers/EffectManager.cs | 21 +- Artemis/Artemis/Managers/LoopManager.cs | 10 +- Artemis/Artemis/Managers/MainManager.cs | 19 +- Artemis/Artemis/Models/GameModel.cs | 4 +- .../Profiles/LayerDynamicPropertiesModel.cs | 2 +- .../Models/Profiles/LayerPropertiesModel.cs | 8 +- .../Games/CounterStrike/CounterStrikeModel.cs | 3 +- .../CounterStrike/CounterStrikeView.xaml | 4 +- .../CounterStrike/CounterStrikeViewModel.cs | 1 - .../Modules/Games/Dota2/Dota2DataModel.cs | 395 +++++++++--------- .../Artemis/Modules/Games/Dota2/Dota2Model.cs | 282 +------------ .../Modules/Games/Dota2/Dota2View.xaml | 127 +----- .../Modules/Games/Dota2/Dota2ViewModel.cs | 20 +- .../Games/RocketLeague/RocketLeagueModel.cs | 4 +- .../Games/TheDivision/TheDivisionModel.cs | 38 +- .../Games/Witcher3/TheWitcherDataModel.cs | 18 + .../Games/Witcher3/Witcher3DataModel.cs | 8 + .../Modules/Games/Witcher3/Witcher3Model.cs | 32 +- .../Games/Witcher3/Witcher3ViewModel.cs | 5 - Artemis/Artemis/Utilities/Memory/Memory.cs | 18 +- .../LayerEditor/LayerEditorViewModel.cs | 8 +- .../ViewModels/ProfileEditorViewModel.cs | 2 +- .../Artemis/ViewModels/SystemTrayViewModel.cs | 3 - 29 files changed, 372 insertions(+), 730 deletions(-) create mode 100644 Artemis/Artemis/Artemis base layout.png create mode 100644 Artemis/Artemis/Modules/Games/Witcher3/TheWitcherDataModel.cs create mode 100644 Artemis/Artemis/Modules/Games/Witcher3/Witcher3DataModel.cs diff --git a/Artemis/Artemis/Artemis base layout.png b/Artemis/Artemis/Artemis base layout.png new file mode 100644 index 0000000000000000000000000000000000000000..62a7a4972297a2a32676a84d4a63dafd787493e0 GIT binary patch literal 54263 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

t~=XjeQwOY@uxz`rPRZI6-c6MX;o7UMB=g zg0?VdJHhet2L}sux zkkZ%`CIJDdpf(H0$ zWxBOmDU{>x&K`?^zb|n8UpJ?cYTXQu;~$W#mfix48pxvxXy)oBUB9MwbzI?Dh2R>k4fx8XZqWR?5Pf~hp_L&SfU zYBR?C1l>C=IO!AL1xj13%&=Z1ELx zSlDN3DvUqtvZH+deyafy^Ev1s~Mk#91=F!%< zH*eQ6gy!7)LKO{HYZ1Z-z7Q+|N_)}Rik(fQqFH=-Wv0EB;54Jv@hjG6#|_<{5`s1Z z)9EVna9L|cU~UXtnBHE3Yrqz?9QLx)W7IZXs|08uiaSj+)m?iL%?XPPS5f!cRXyB^I! z#k&7OL9Yi)bsiAy+ysRn1GvP;PZz0Ygb8QNH~3XP?9XVuGTVuK?x7d1am^c7K*3Y@ z{b>mltyxQY$qw>if#X*mJd^tUog3$4SH6+L`S|N0ghtQ@R|?S_#QJc)ffqRSYnI8V z0`@}xpYW>%Ov`xUh22zB%zPlLvA!7!=;hA43sCbeMCb-EzX$FM#vbz%y{+|dEei^D z;z0;F@4d5OQMg$SH2q%Wvmw?_{@nV0JL7LPP(^wtJ3`g{|BM{;u|Frr`QfV7=r^%@ zl@x2@o%w{FG#g#q+r_4oF!DYvhqK8mjd~l=HQetwhvJ+5AMCw%R8!l#HmYn3f+7}d z2x3J+1f@w3#I95o0U;C>0VReW5Rj&#TcxN7QlyC#fdm0V2_=dOf;1@!5UNNG0i=W) zxbF<^bN27Fd&V92-0!>J`0X+FAGngNwdR^@&i8%Z=Xu_Jlbq4$`S-x@h&VooWE}L) zhoWv@eRc7=tstu+x(v12$Rq0sHh3uH5x@1katz@73iNVfB%u6u<07O$lK{@c)4bl- zPn!AO&0!Z`x{8GDFBw}}s9s(h`GgeC_;2aD8=vJKjnt1IvC1`j?pdy-ymR`^jb_Jva zt&H|y8(QSF!i;V?3I#>qc7z?TTZ8;$09UC2-BcIPdu^Fl?t{6`rMq9|h!Lf_byTO` zFmd3tl8QJR%-pEBr}?$o%DF<0kvDj=hH&nbbz6W`2 z9wMvb%Z+yH-?+55?RKYsi-OJ4hJj$_)lUy{gMXAi)DIJq6FM#=c#l=Z*Bo~y(An#o zqOn!$bxp}1eA$!`V{AV8ajM=8UmVAUWdAnM$WVZ1{IoFsI`nAMjML0Pwguexb>j1+@9RbkuQKvqv%w;9SK1V-h!F@DH~kwtX;-o~>o z@)fU5enR0O%s-ni%7^Wrxt@@Xy!^F`L|;opF4 zhYK^Qh&&x9gd-<1zo6;Tab;*fN>igGJ$Jf9o*wT>cesNd zna?hGVnLUrrV(jy{r2;kIr@uO-{T%K0z82Alozw{{&C{-W!ndk`9Q1=wrD(5)+!+H zU?bR+v>%VvCr7*W@5|;xbe=q^DkBz+Z4E9KkF&C*nc++zB~&}%N5OEW*}w9~UO&uoW@2ur96IsVW`6>HwBBFC$5>pziAW}$ zqCZ-SU;46s$a5l30{g>)By_{%6KUQ0iDt(@hS9d10Vp=HUs7kkxOO{MkZtTjQoJYv zuY#F7TAlK_%v~`(2m~($M|=c!aQM>4E9gc<lA&j8^M5^HT0zKZA`FsR#+D8v@s&=;V=4B1 zrIe{K{bBja@`%_zo9?E?!!;VxdLT}GQ{Y>)DeUE%emU4;>*mrx#(BGc_Py`RiQuDO29KD;lENmja-({O^OH`ZB5o03j{id z80@oN*E1{m<@RB)rbD53BPav95wr2>TA!RE|13Xdb|`ryMT*uGweW?v*6ZlAlJ&O_ zA6WPTd>m%Ue-_4lDEo_Ci!2F#rHI~St{Rob3t8pE+0>>XKj=$Q+6hXG7kq*?7maS~ zJgAr*eIw|ENc8`}&HbPL`rhVYL`)VE5{f@^qy!b$;ruAUP0g1>`Pt;o4`s1O$!E=V zLcMOLV$9JeYT%Z%4GK0(@$kNZtR(2i4|f@-?&#%z(Vo*G#WC-Sw}+oXTxtLR|9%~& zLdCzO8Mu82O9N`My@fEadSX;Y%ViZjXK&*g-d(kDU#&9sR0UK=h_crNuSeL#uViNE zbTt$$aV-?GiDQL)76|$C6444q%X6`HM^P|HZL%U=T9w9fQ0$5*i4ao~PX``vIqvc~ zQ@mJy{)q6N7A}eUY&s+mU%puN!pu7WSEm)b{h&e4+>a;H1ISnaIV2pan*)_2vJb<- zx-9|$>oXy3kHZkLqyiZL)XXpSM0MspQ7i*NCki~Zast$jkft^squ*G_+JLhIwKka= zMDK5>g43TRuniO-ni5vMbDJzlIyyUi&tF8DwnzKbja6IZ-XWSP#hGP|gxMx;eetve zE#ZwPT^g<~7nZg3LpoW3E}%DNKannM0535M5oKp5mZEKIvx6@aNKSN!VJseQ^UOg; z7Ub9-31dV?0}6PVgk)Dexh==u90j-{F3t8_lHx#PCjRrEYY=1NG9(Me+n{8k%z((p z1PeAuDaZjW_@hZmC91J2IduxYprnAcGOWS;yzQ<}@ zgx5Kdja+I8%zniFM*fk&39H*+W6e+J^K)r+O~ih$SI^+dJU)!n%g2YgBL7II=aBZ6 z0cW&7Dv?!h+O>kh=Wt1L!(# zAxdHw6Y-ccIpEq*RmfpunXLtREnumk;MlE6?~%%CC<4aikZIz>qERS|TkEKdzhG1r zSl3H%>4{Kj%Zjj}lyV9nm!?6Qq1>MoH*kNQ_B$vBW;tx-R-PFLOSX2-B^Q4W#GgtUGq+qNVyuqZ0Hd)i*qp=adTEx0g2{SB z>!d9`qjJa~IJ?nOSl1o&q6E4O6^N)d@>qyH!jFL2(#Bf^mGQ?yk`51;h^;DeW;>Q{ z!kq3w6?Wh_drL^R@+IXq&4a%LD&pIhR9olqWHecWDII?aB0W^8&XjXZ=2M;PvLV3D zqv9+~=doV&(j`l0xb#s9ZY!dX3YTP9d`q6y@}O^URLM@5vj~W`t56m~3mBqZ|Emb) z{@T6HUDJ@kDYRVDT#RKzlPT^HO+$q;Oi>QVhD`?|MVf_d2thI`cj*>s#*()s&PO|x z?K>cdlfS&!gnrt}M%>_QMSUR;6AW@#h)dm9o5)ymX6seB)KmtEv~DS1)iEqkmkapY zQ7!o9OkVLD^OV*7anmndgANf3d#14s+zS-3<{RCGu5j^^e89HcO++zB>~m5a93v|S zxMffI3ce&^{QC=F2{6q}V?ZF>EWutTeCxc0OfJY|z)!>%9X);Yo5CF-TB; zJgr*z<0-|R{aNu%-DWN92XPBnvS0zMGH$v?2usUfzgMBTcgqjg(e7Mfm%eaoJcE`D zmp1MQgvUFYbPL4mZ0W<&Z&igJ{DcqFZ?7ObNU0GIFdy9HqcwRJK((K^hD4TEF_k4uCi0V=&#^ z%G6QBayHf2eJUhYm%Cr{{)A1a^2rl%1kjcW?Nu;lc3+2xSOFhP)B5NXIf5uOLr{RM zv?I3p)6_{>Pnn9zjBMMX!Tp6mWa`St-WHT2NM#<+opb57J#UpZ*==nWT;oXoLCo{R zDd%Lx!Te{~ShzysOR8D!YaMyGn%prx19_J&SdrvmbBd{mbg*Jg^BUunHcZDb6tO9J zK`BF5i*<6e2WK8fEnvrjkRF90J&>CElEtLKJ-9+<{@QQUd$BF7wXHAi2B0Ve zpmLiZ4;3|iFY?LEtG}&E=Ykde04tkpEZfSJ z->G@qbsk%Dv3Y5?*>7wa7BK+8FW%t3?1DC-f5fl9G8cR?+MIiFb-n;}9C)F`)!q4c zukP40V5`h@MP`{aBGw>RH)rrNDZ0cBcBz&~Duhp>rGmp(=XRfXyZ|lk(t}{@uR@uQ z&n{nKNIjh2d!|f-@o&n?@6!_?dw8E#I9R znu;o(@7B2W!Fw^n4<=^H8&?A@|1<%7h?=cOz?Gsm$_u$*-dnBOJ7?%~nYxWrr>m3O zR_Ff!@o1@@aDyS>9Fx;kGTG|O*jMRDQ{2{oO}@E z;MiSm&l&>b19?$NgBb{kl*|%4%cE2n{-*)~OsQ0bjkQc@tX+|4^?MUD1@^m(2hG-4 z@n+5E!ntXj;vSB>=)6!8ey#&q=fXp;0nqSVnivPgqsRGRLn*qC!`G|A@`n%?&=7P0 za$uW&ry0sj&U@H0drf zqd2|AhRwk?&^)TGGJa{}-G{4$EmQP~85#$2KL>!sf}Swf3UaJ1fx#&p;4&TQVXpV9 zIx?!MSP7)^##0+jerj*(yjMW}^Wxe#Utg%&AqNipghFmuKKtQDbxa<5J$HW`y#34nW z7jR59X2DNR2X~eYc7mtNHQ4$yz|s{9C>Z`XlReK987h*FVjfjP&=3LYdFGR-ylY<` zOQ>q*Ci9RZn?G`k9E*J3pbf(G*feM%dGD`Jl4`zh2y1J4mOt)ER?#>NSaUyKkOYaY zd&Ch}5Tm6PvB49^0H0HND-9ea#Eya@3}`zX&Fu)ce6Opmw0p?>Ej5gVBd8c`OVo)T z)c+}zAXFr4me?NYvEw+SiQp)&a;Rio#{RdiM)*-_c|oqNwOY(Am>?Edqh+Yz@-y3E zlU~joP&4u17@}~sXvxN8Sp&~ZV9@Z>n^Z|^GhcTG<^;Q#bfylAE}42)QYJt*@~NyZ z3D+l?d2t94hb$iRw+i2ScTA}Loy&0@X8tbYMDmCql4hO_ghgG2Z21O4M+cv4pR}BB zmy^MgG2{%W8nX16MqPl_BF|SmSeA0l;TkuH0yd_`Y-0K=G<|K^rP;|_L})O#c!=}; zY3yN~b;~dqm@QI$ALZ!1Db?P;*r(3(~st zyC|q4cM>@z11m1O*+Iia_mJ<+mIkJuY~?$6Kfe*#{Y?YqI1+gF_*yS@f?H%iSPp6McmzpOoxFhvJw3irH>9-a}s6Fv1U+5oTA{m$WB=>Htr?p?6*GBKjd9&j= z2bu#6xK)W=VCxX+hxx7ni*pP(8fqOrjyIuB{&>OyIh6BJNm|^Q)f2Mj5UAMaEW52w z<|#kAhg<7Z%S9Eqf+9aufxFW6R0&GQ9ZmOkR4>#iFT*TIAE^OvQL%P-P{q+kZ_>rf zsdD;}2hmE|hsu5_t$u(=U)-;jbI$&k$|lTc)jz)uvEKiOLlpAI~rOaIS8LKdSkp_xo)|?;WZgn~Yn&hxZPOzFLo;41KH)^FsU!Zhi0{i$=Uq zGWs9*`rh{M2may${I9)|{}aycEBs&A{+5)T@(!juyxrBwEhnjoi2|TG^wvq>7#Yd!n|m_z=F|mxILt zCe||e;Fjd_O~30`#t;+ch@^3A;b)doB7)tqE4Eo6(E?w!!>{H!vLjTnJYo#)0J> zoIKVq{32ScwC#Uw#&Ey(_iC)S+7|R9zab^TuUNPe#m&;c2kc*QO1Qm$_4DW6DR zF_8Nc8iQXf<{tZudLo<%R`@-b0AUfP>YhJacw2!55U}QD!tY}s_a|&#|7`ohF>ufb zXbauR{X^{ObvX7s<;+4=xgV0z0a*svBF;%^Lg};wMQM!p5UcHlhY&AR;(G9)_7Bazhm^@8! z*Qyuf>`1ROM|%+U``A4=_E4gFIrn=*aIE#^p90)n^6y^RFkLRf`Odvv&*9ETwHTxx zsL64>gudr?kpSY*kr3)ibPWg`Go?%J9I*g$~%~oXAuO{{# ze&yuLz{-W27lfO~IA0Usz7FRF;Fv?w4)fo$Nfn;Novil@UI(Y)*dd8MCw{+v=*?NM ziG^3p6ON6f?Bh10fK#Z$u@~X*7rYL#;8=!~)E~dOC~M)^E(1~M+S!=_w%&C>($K}vtcjfIE%cj#L1EYPhm!4_7( zHRbmKEqIvl;}Q3{--JIBbEo|l=q*0zZ6pi-Ld*o1=zew;yB6*nUQ8JH@&&fo|HO-V zU#Pc!sT(62tu45XEHz?L?}og(Z6hvJpwW;)Ki}_Fhu!2)ENs z5>1oT_ntCH6-(n*ONLFru*coE7oiJ+@UHLKaW;J4S@?jU@PZ}p-)~F}43;9Ujorql z^ORE;y1f9sa|kLYZIUPF(aZcNa8}kFtI<3LAGq6adkuHhzYCLag~SFEM6-hqFU{+r z!^;z)D|14UUzywyzJr{MOt(*SkuWG8KH`0D$+s3h@VWR2cX-#rKWd*(@0EbxI}Zjz z37b?*v8jtj(=Hz~MF||Zfx%Mrd+9?igj(QBrTY{=*h(C6Bc z=YlqW(L{v1KR;SWbe|X;j0XL!4YMIVZl(umx)4_RYCZfLiO^g95&0#XP@GDq^7jVl zX{yw)n|75`-`C&&#ho%IVXq9J1<}ye+Af7(KlI0tp;e>>*yECknUxsyLIAPjWRjgo z)*^yy>N^jKo}S%T=Ylhjnse8TKfyRjgnIA{n&kO{XOHKs;2DB6+!}S;K<^jL#KlB; z>SquU@@QoLob6BmePbA)av6X^85uyS+JM79cmbc!VFBGHB-fz;uAHJbfXeHtlkI=F zPj)=S1F+&;snpW|IDD^uY20Cb0t<4ZCZ(Cn7cN|w%0^-@K%RT1h5QgL;~g@qfE*Vu z4lwsB5lo%`(M=362)LGkJlsGtWHGqp{!rkq@}q65`p^XO_HKi@KxLj7LUZ9O8s)oo zM5z`;GeG5n^{N2mSR-k3B(M+;cmsp%^D=?0y>o>f4}^`t;o;V3g`$gO3;%}wNzEHX z?=w+f36%+;Mr0sX2$V@wu~2;Hr(f8bLSYM$9LIk_h-Lk@x}tZF&LKWOCgcR zz|U(7dWv`LRG_pI0p|Tk%y>Yp62zR)yFw0u>=J3Yrtfb&<8MbbAM7)PY4TTYgK7&D zHGSTL6|oK3z{hC2{%Vfn`jTXlhsnmMlt5&#Dyrhv08MHXarMc;eO`!fKr%yx6aUS! z#U@tBVidX!v{-@(hJDH;W_ye|7*}VGxQ)Fj?}91!=5mb=cdht4Gx!<*uIH%hj79)i_(~08UqFFTiJu8esfsG zOnA=mDjxfq511(tN)a~l2CGfX3QG4xTq0qrz&e3=87H3&GzJ0EEnSP}4+_>%0%es~j8>gd|lLL2fe_r(bR%I zB4Fy<eN8A)YhdR++;&y9rR zIL)CpmI?I}?QRYxfkff(zJ&_?+~|B$-s&Xf)fl&9w`_v6~oL#=};<`K3@mqzi)Kb@~ zS7DCqC>2NcY?aaej}zqsVQmL8qimc}8!1fj;g+oPF z>)qA19d1ZYZ14uEI3A8bY>5Eon3Ie#G(#CtxPyE<*zs4~;&N* zlSOPdNse7T%5u#UT17%#e5NO(_ez=d+S3#piK?J{)b4|oM_wp{!!-=fuIrX~5Hf}2nc1HF=cy7V#n zfE!#^zsb>bTM?Et8$?s^Z^($?J&H79w!=pE;F6P;OAyJT@(b z+pHE`OxmjO<~5EI@tzv4zcPXwVzz6+X6*l52*tkR8^oIH@;tA#VVcYan18Ez<}mXojw zUBW8Z{^kB3+_uVlA7leWvVbbPD6LomJwS&g+L*pwvNAH~E6WTed6dBH4&d=mTzaMCovzyQ z#ZB8PPz8q<0to>ou?DWTd<9)p&=6+J3(yqoiwx!YYjP^UE;X!oEQftXJBRK46$T^5 z2^Pn`&+GphW-`3C57YR-iOv!JKdBGo(Rj$KG{h4Y{hp&q{_uj{(S!brq3cL0Vi|le z5D*HQU=A+*Ym(t%Ms%dywPSsJWyf0lOb>3b56)ckXdk?x!suN{kofn1+n@om@DI;#|u6A7rW)}q#Ag615f4!(pFrc3dmI4&2^tVx= z!>If<rx8|Sg zi1$BN*8eT{8le@UM{NlIi;Oo~?F%2iL0MOD64b_&uIkTAD z36@3~CGm#kdhL+E${-y;1tKRvUl8md`j#P9J(%4HYg?t zWm(Lf-D@E-l2w{O;Z@RE?>X$6BVTrK`$K2&S-1%P2}B!_!nG&}2z$kiYcB0ln)_$wvk*I0{%l4uXv~hq)3&FE z*FRCa4#C}5i5D%$xRRqu^j#(oZS}VU*VPEL#3CC@ zI0_JUg+xl~#R-#MCTpkh#CeY(aUBI@&f5t5v+@gPL@a1#ULLYQNE-$3+OR(a4u9DH zzWR7KbQ>PLTCpE0lotHeUf(uYa(LxVw1ebU_K8$hXd{RX%l9R|x<&%uyG&4dh9f5a zR^Z!OLW{|6z`JEZEbAhx)&NweB;OBP9m}s44*N=nLOJ6bQpg zt#?MX7`KHo2+l@UsY9Tc5~Y`2gX-6D?>XV)VTT0&G*dH31F5FPr!iy43X5gSmJQrd zTW7@aPoe$FUd$Hs!SL-bocz%Zzb;RCtTHo@83EeA>bW6kGx$Z1`CQV^jG@L-y zchqcFu58`zt%hIfG(HVl4n?3nQd&+&4l|%{ShJFrDw6Q|*-tK`>oLJFw`PB4 z`5`^Lwt3lZV`cqu5V~4Lxpr>`Om{RC><=C4o4yBqS;MAA#s4~L}FvX2L6gOh}*}&x9WU^^tdEy-a1mn_4o~Z1jit_+cyfVrE z3p9Fp12_Lh!D72$nm5TbaH~>HVY^&zgj8#RMHO6}*^;p*%eDlKK|4L-r@Ae$_GU(< zQGOK*S0K^F0%CWZuiEQ`weAKWOW%SPsO-eU&}lOKw##!Bm`8KHAd}xZmu0 z=ZVqcCOaY{bW-emyxPdc9Et2$vu_FWY+S{c%$BjXR_60LMxKbqj`InNI*r08(Ww!? z((ah6^Ge3po68u>{(1jP;`@2&n2*71y8Dw4X)ekkP8(x5xto9VbeGidzSyot-G746 zi?J8z)ZBM<$#b@5jzFi@K9MDxj9bE&d)j#JXYEm&`BbIl9ls_i8cq?4`KaV48-E`G zboL1^cz9NlmOeeK)bZeRO+3VXEjNB~L8LOl7_*RAj8o)c^eGvL%w#HGTvYS^NM5wI zqiNNnc#U;2^OWy@zY1`!IURg48F+#QyLEC;EIIsVt~?(Ct(vsF*$<;57HRA}e{^v% zS%z@eag&w$3WVLkMK6U*KETE5u)2=?=#oaBRAn7=~o*v+c`|%77U>r4hn1qSDDo)%WN=Vss?KLWot1JYf|sL#@=RR1~e- z^P@-SWkXM)MOPN65~N0`5R?O-{l*+LSq(?R&Id|5^!xEr)f+o7VSd1pe%K9`cIjbY zub&HxW;wLJmTaRykAU~S@DSq@I)D4H)M^3H&+*h0j`i3xM>sqeV^Gad= ztJ^;w-Di@luhXO_M%(+}F8$sa)v_6#w zseO{67iYWzttwUbnVIm$Glu%h9GSsP&|jA}yAKsuHs{!P>v&BEO%*E^UQG*;&T6=J z&+36f(~X^IZ*T;O0wblpfA4hOU25g!`4X?$hq=HOW(EH`BkKB@yHf102W_lH(AF{V zt;ddz)#^kbG3!>($qq}E zzcM%nfVZiozR}IySRu?HSvhN;H**sQCTSR) zfsSGT(Y7?$AVxEzIpwf7FF#TI03-}_(V>T{w?!!>B!MTN%k*UoRCFD|RH4b7bC>_X zjgr?tb5aQhm+95V&AwoK_Ut=D$|H|uIws~;pytK`M}|Lq9EhFzYIStR(D93q!Ai?# zDI`i+rCF1OfX6w5gy3T~z~0V;=@t&e_AjPFI%x*xi5ZWJ_jDg=Ar~AfY{~AJhMhC> zqv1N7dQsZm52E% z3eFPjAzLUz@iZdtba1gcl(QdXVxLNWmsyZ5?x5rO7_ioA`$WT*huFdn2K+wxQ> zMx>DqCQcXfDxDd#AaoG0PsYB}?;Py;NcO92WMPuh4u#1OrJGhS$QHRRT7vqO7&56Jm;z}r_f3v1WAl9r!A zueRE_+^XGa&PS$Om9%$7d|7LlniSGSrZ;g#Uge86 z&{ryamaIdTs0w)l8BZF)mtuKzt|t`RZ!Mx+crn{;=EKzde5xI z#Ew_kde*iEk3i(){*KC&2pP2d-m-s8Zyrx<*}`m{E806|s=kg>QzemHRSCb#_K?76 z_rH0sikY(%36vMFUeN=~ez|B0;Z?1WsBh1%7umwXPG`!Y`z!npjmS*>vWBe6P-|h*#p;Rd6?v~@MJ+!nP!a;(}Ch_d+H?j%EMnPlw zb{r(lk6NYU^?c*H-u=&^|KdDNr~_CT&8Wi2j+dl}+$tESWnMLykKQxExRvQ2ImYyx zy#*axem>5v#KcE`?|Z&-7qi%ju}CZ)&fX`sh}j zMX@xyEM3*@H164{4e1}T9d3|+upg5J@-aKpWOXP-EpEzgxSYZF#;w83R6MEw%Yhb! zAx}}`ycYVQLNga?GRe5s;M)!S3A*6~d*kWYiHqUAFa1{Fh~yBDw!5OMzYAG#=KHhx zswfVTgj+#b+8AWO!j2T@tEY^lGIqNcI1o#+6Ewpv_BIel2(PLrahhKASKj|P6*6%- zG&ui3l6>v@6?8vEz4z^3Kap+T(monmrMr7{8&x?l^<@i;)v7#2P!d(_x0%g~cS~1u zcvshG%bBGCcjNk)wFlwdE@P(VEZEoFO3Nw$x(vHNoOG+lm#O`&@04^Y%(s@4(pukz ze*N4$l!~X-FCrNmv^AEs-lc4Ng%R<_jAIK99!}8_uQJB1B}tmO9gCR`w@I&Q*)>+5 zfo++GXo_KW_))96^=q@dgB|eJ1s6cS`)#!vXM~<-2H+{zBJbZ&(Io~oQ+69i|D3l~ zRJdXMb&D=V$vI`KibTlxffr6WmW9<=YLeSqSbZeQXBr!!gSSm%>Ot+mq+XjX1@{f5 zW%3{tyOnibjQ&WCqvd+WrMv%2pj$^6_hA!n_ulE%{R933M|9U!3e3l;HguY!K`EnX zTtTPh^c+}vuXl?Li}H^GKd0{we6^TrrWh57C@Wiwh{Y-Qa!6;H`gKSw-aDZbWJi1{ zv+q^PAH7SjV}eMm8pGSZET;yow$rqmN}RzSaO%1qT}#s&9mAd*cOFT_cb5^!k^3+8 z5tvlsOyq=d4OlKUXSG>VGp3zJZu}WlTlePjkZLvmV#4lyuGqsK@|ygq?lb&x)$aSW z#&9lvI-;y2=YHzwefiULCzsR zxyq}rzDfB0dSGXw&yesam^NV{X<(}n>3l3h)#-tW0ZUG1eCFZDdg8K(UIV(Fh`ZTt zpW=O{TXyv_ zTakMy*se~L7uoQFMb!0dq`;ZiG64{TJ*?{^}isMlG$ba za9_wp!5h-RHdv$;$kShbM=UD^4)KIb0Y^wN$puSq?GF$%D zIPIJGC5IjRX#2V30Y#vJc-rtln#5VMiC$E<0-oKz-F}O*eg8FC#N1hm(k|z9F`SN` zJs)a#>vX*Br8Fbkw-$$8EJB3>80*E0m(h97-p48K3OS(VJ;yx#BsyXnB!CYVaWYoc z$1*?v`y})~%j+QZOnz|@`YTW*T+2jud^lE4yzt+B8gD-t{FnFDfq`6jz2Fr)Desdx z&L^(*)j(Op=KW;uRJt6G1#h+VxAP(t?ccL!ZxPv3Lvy|y7=l;p_QtP=DWpgf^ekYL zOIZ$od)ssnGmCEQC`6jrF`9nekFP+b=@Bcttu>WQGwKF~rwrJp1h%9h|Gmlr zQLw>ae%G>;JhUgpPaR?K0hI;JjADHUoUr8Bq+j|pU^WnFe z@kzAf>{d~}%S)8k55aFMK*yzrjn{*;%7LPLePRHTn=qB!_#n$IlkR=EK2@VrIiBF$ zR}KIu&U5n9wx$?+)N3NoIIGDzWlO#3yzOJ$4AX0Iw#smqBDB#{zEJy9V_h~Nn7N$~ zrj9(wT2={k?)s=(^m7!`y9B+U_#NwVH%-W|p!Wqu!}jo82^{<@z#Dt87;P5Qx2rsNxISUKEJW4Dz8Fj{tHvHXZCq5D?W^2%9=!j)1f0_ znC}LouTi~P8DS$)0a};?ufU_r#3Jjp`3bWJIK4U$nc6_lxcl1;p6i{%wX=X5gaV{m+zeyx?2x9z{H$uy z-TOVR0`%tQtA9|eNmZzU%(wGjP?rq$P;xcc;C<@`Z@nyo^s&;WEKlKA(;n^~t4N%| zY9_m9iqKD$7zKvL8iwipgSW)2zK%l7<&A|vM*(>uMTHZ=KZ#j`MolP>rdCBe5B)vcq zTW4>27H+tw^Nd&;XKLT>R`SoOuJN{$-91O=bHArwFyNQ_UT3c~)myoKoC;;=h9C{T z3z!Y!93#$gk8$y%Q;%4ReBG4iZvzYCBv%_n7e96`86CTB0|*4UZK~#F;q|ogT?Q(Q z@lGJWH)t2>n|TmyOKitE0EKo3T$l%dW}x&$!rqum$<$Fl7Rk>}&RGRXr zk?iy0Ht0ans6P%paqt_=?)=I!Po9fXw87n?-EMJvmady~z|sAA=bxl<=JAw_SE^+W zWzNtfRk)d^?O149vg~DE+MV$N63Mtne(+63;W*KDvq`MF^Lc|u&}GNWz1uC$U*QnI zMS(1zbIZq(2V2NcAN!zhCo*&K90GEE|84B;>46G>=WXG+DU8N#<9zL@66hx0Mhd(DmU5i+I-vURDG;FqHQ)|s%T^3Q`hpkdWUh3rFN0V^UXb~R-Z1f zO|37<49E_@!giRg+_KT>3%Pewymt;vV1mlTpLjF9d1A-3t=CLM!HnAc{&ydEGW}SO zuz3e(T&Oc940bI>u{?aVt3tT8WYc)0%{Ilon5RF-zrAL5xOY{W^~=p!sIWsS&r-f7 z+Fx{iTN{c2KZ<61WhSX*hXE-FKb)&lYJXB(k8oGFM64oDKzTqW^UDTo!_?~lSxoFx z#U9+t<)g(93c*WdYg$Snahu4ipv)N2@jG^$;pe~FrZhXRNo_;uXMP%^`lVerW45$u0ZKRTQwj7nqsRDfB z-Url2DGWMIS#72^j~Rx~F=@;0jI|vF9F`p*6`4ab--`J->or$3e-Qa!sYE5roX;Tl z&4mfjF$&4^$iVTmhi1tS1XGC~%?t>`Y$q!D1W+mCI@^zmkcPlbwcLVSa4MjUVt#tD ziMW8Asf9m31j#?I`2O_2KvX!@Bbv^FY^%2F1_??H&PV7_%Q`YzzTezE@gSCIP4}#8 zeO_vtsASfff6&9vp6O~6n^v9?@qREAUUI8fg!JQ%J3X3w4NX!Z(;`fmwdO=_B%QF; zaoGC(*O{4kdlT^+gpVg@(&lNKs&CHPM2^On{LD{}wJjn{i@hRXZztLj&pF@@>xd5P zY%3ox7~?O0+^ifOwW-%)armX)D>2yB&;K~ZbgTK6)M1GiuCjY5(iHY8&$VYtD0d{d zl_&CGJxlq_R{Q&_$|wcOD@xr=&j#HVk&*kQZ)ON?UCTca-0UQ`kg(BjZ?Y2m(zi%QG{0vn#Fs!sRbDV~)x-*g2CXe8}DS(k|wk@qq zY$&s5QxOW+043$o9-fi1l$xn~X7B3})D?%CIC^<~CL@@Hz z3_F{uayal-OExT=V-315(_?j01RStAgKwz=8Q%szD|?Ke6%JX3Q+cvaEi%1ttoRr0 z;k3{)CtR4#v1%V3e{G9ib#f(zNhNffEcb|fX3%Ac$IjV(P`tzUa}`PTTYm|mPvU9i zY@c(LbMz5v{=HgoEIW9cKakYlAIC_qHyC?`?a4lNov z&bbbe^;CI*_t33K@bxgL6zJ-w|$W;s4gq<@Vh|Ct{PbFz@ErTiMHviqm0|!PxD~mHk=htmQ$1POU{3jcJm?%@0;e$ z{zxaC@6A;&;5}DmpY?!wJ-5n}of&rYOV@NcL4Tg65&T}|h@**3gbUuQ%f@6JC!IGh z5!(L~J2Dx}z8rhl)jY>kB98Hv@LIFvvI;H!QQ#b@G$0_BLR4;XAw=W`1oFxBGbx9N zp5cV@I-*zKhqu4fOJ<-CR;$fR8_u9pKC5doa=bjsb1=SlQ}B_%R#x-QEDx4~vCEds z`Ve>uPC0{eJ++R(r@H<1kPV87R^2b{&ZxoGADw&J-DZGXT|R$VJqC;i!k2%C&p!|Vslf&A7bQO3a+VgF8A zEU~v&L9yV^n~!#fykk~0DP+gqjn5OZ6EV({N^2`jb0#@QXod^jCq!7T&G49v_v$gq zzQnZ3t+TB+sP$lhV_}v-vV3l}#y2Paq*gJKB;8FxS>>3HbYf4U{3BbBWoM;jYxL4- zif8)6L|Ot!I7a!{%wGqiC~{oKgw zlUg~KqFUuzZ4Sg3UG&1c%+e;t@1CkyD%aZk*>yydK+B2wkSfVORh%?7dC_Tb4YM%I z9ecaxUQ^3~wwvWPbkE0?QESgOibIP0?*PY6{s_t2{F5x6oTX zXYlUvMpaMycRe%BdJ{OEshu%wzp;I?!{+Oj{+-qJvh?xB0XFuv)jHTu#b;gx+x($Z znbD(F$SgF|YAhV94@nqsl%9Euz2-DyF>=ndF23XtFa62N?ZJ<1H0r@dHttmRo<8g5 z;f_!49adpbG`3AoI5y83oHWrSQwxLT4f@gwZWPn3jWxEJ2Nl?`N-C=Nx=2SH_S$Fg zf^4u`P%nqX_soIAYuA0K?Lzja-YlF)jzi?o7sVndoR1Rws8gr!{NaOH;Y4vDPK@j- z>BQh2kJ|8;1bU{*XDNZFf))c*FZXag$<>a}+*&oPT*hC&J`|Np(lWntVp`jKE~3rr zo2S+BHu)_In|#9ghsz0}d_N}F{2N%M@~j0FpQ9$!cqPrtNn`7_B{jgZoSrZ<+Rwx5 zBwlS}+==gK*}P#&p(JpJ`kh2GU}bVH>aJ?gUPiAB9++0nJr#a_8sFi@KZQ^MGr^p? ziyE6bZ|;)v5m#c)^p13New)dFMWpMu-s>MAnX*D1>!WjNjHlyS>QT9sLCnFSv9|sh zTNnA_Y+zLA#MI^#4;lCL3C$~)1pd&!lQ{=`fob{$^Q@-;>Lr_S#!lC%up2(j&4!q+ zOsax4PIhLUi`$A&Pq#NMRUL%PdRSXHb@x2?_+|UL=<2q3(a9Ww*)?O0_KgM}8H)A* z#C)pT`5TM+8)j42A?fPLmo-f^QpqN6lq7qO&1CXbO&5Fyipuvn!=p+Wkne?q(Rsxj zX&jZ#0TVYza(&xXI-asFV1E6MX>u$5%YaT>U*a$-+&h9HHKWb>2q>LddY$=pEz=PX zOEF|ALoenf(-CDlE;aoDM+EON8Hvkw4k0_4&PXQK-KIS@J3=Up`n*$(x>EP$e}Er8 z>M){)5r;XDT!urM)pDmx((E9j2rT!i(f)WC#L|#mF5o1Pb6A4@mh5BfWw41hq|Qtn z9;;fseCw4xI#IUIMAB(qu|K$~(LPXaCaYKF?S54$|Xi4u&izERP@&90KPvjJW3VlHDC#?!v z?pfTknU3@3HdEJpb@;m`w0}&^A1Sjey1&AbGfvMws`UIm&SMB}P+_C#?bre%4gf?E zs1A(`-xbuD?%dd&M-_mLOawEay6%2T@9Qua8csM_+vM0#{1H|})-NdQ%5u2`BvaR} zU`tdz&6u~5uO5i+quPuI{tZWjMo^pd)ZZdgj^HC*0&CjEx@mhM{j%Y=mGS^XHZG6s z&z%A9j=6%_?7fa@KwdI^^s3C68%D?U@WeAd#s<}NiF#$C!5=0`V@vm4a) zgjq#>G^ulD*19=-BrXdtfJcqX(w=MWd};exQIJ;(9`(+Ee@{3eOsYc~no|gNedVBa z#eb;RGx2az&hpf82P7%oAohuAE-knpr2>U|#s(yE0QlWkAi7+}Yo9cBO`@UFGRNP^|{OYl68o3pA=ovghv&OM_ zvsJ@8Qz$mF%4((h-TJ~wZ$`@rw!j*=NMfbkP)hgI@w@~4C{Lbpjk2_L#nci1ecMyL zi~V(0tz5ZMMv0GK=Vm5f^<1;j{nga5A!BBUHD^B^nSkn>5cJ}DQo%O%k|VNC{Ll<_ zca++TeiK;X$b1WFsqy`ezqVlCsW8i2DD`bW+b2pQwcvqZR_cC*i_BJ0j z-=+{SJFgCbQcg>gA+1KW$xI1L+lKp+cC`Ny@m2^L9FNY0!Lh^M{ufvtfZ+ZgiSHsj zyPNQ7BQGl@b!?^S{7sXQ%sUz{ZR_GWxdSJHzx^P>3^5V_5WreA;}^~bkio8X)EZ% z%KuuBlJBgn_Ylu}SL^V8|FCo1TzJ7)ZkKYAi^FDl z>lX;Ple^r?Cz)F9xS6%#4)BT)Me-_IxMc54!Y-aT(Kw-SyCwFyL2-NkGC#C}<*lfm zOP;7rXRY>{yr%@a4R8%cg)?C*4nv#)E?N!{xQxz`U-w^{Co`fvGsYlnw}DTB-o;wta`~793*G1)Zb`z_zPOk zip=%I)SIWce9w4XSz<&l$mz;ai8HDeFJ`py*rU<08UE?2rAME>1qdZW%cQ$d-;)H zpVw7v!KGg1RwjVH#t8Zfc8)2oBc{pszH*ypg7j^+-XbPas0zFEztnYjl%XF5i3g3vSIg-~0iquN5NBe? zvM~Oda-UR0mN>h-AAC|`S;5z1w*vT$NNVq_c7$MUlx8@ng)!Z0DomzO((?fxPlm*jhHYg2}o(!dxo=U}t%fu_ZuqvYcnb zn%^+|4@f+_Y#jWgZ&iXJtNWtKk(bmXm!oKJ9h|PT0U4Kt0Sszw-1xp>YwB}WwFBi) z4Cfmo0NTob|G(Nh_h=~Bw~tHbbkMK!Ptr+}P)f=~A{{8{;5dU2$}ki|jzgi{)*fv( za#j)=W*TxDhbirv?M%#!ZJH1{jUh3kF#283sGVB-UF-elUF&_{wf)i3dbmAvJ@@_G z_kG>p>+>DFx$PjL#0i_@gHOGfQr#L>dek_UKCu?V%T+aTnICA9dCqaO4m=nspFkf* zTi5N+tI;mD5k8eYkh0$gr$Gsy2EFN6px}J6AUgEfKO#E3>gvhoM5Gi;fkV1r2 z*NJ?Z^Zm|T@n9wxs;ZHo9FXyrv<9>J~f-w1f@G}gXSQNd1`El*o8T@NsM(`Ba z&==LHRk!$F7WhII>1NH?`G`f!fb^Pcm7*O#ktOQ}a=QXzRLSbRZjbo2PWh_&f3o;@ zf$-k$e==%(b4qET#YI_v1)Gia2fBwZJb8wlqdfubSzDkX9t zjoODSmVmNCt-DN9F@3IW;m>JmI56+FXVy8!QZ-!28-HCPf1w0X8O z+nxj_HJYXOZPWw`4a%L+y(fiQz157YK5U#e(HIeU5rD+@9$=0nUSs=%GF~X0D@t>X z1H^nWtl{`iDRc*Z^=prMS9V%%^B-m~iVFm1g!{VGuhS;A+}v}jy;ykEdlI&GuYJiS z0#1#*!C79G@7oPzv5X9Wj*@9Qx}ob=8I z#0kxpef=Y#sKY%MKpb77yS1sS zHu&owz5?i>9S7+@xyo_C68q$tGG5Bu)#gtNqD?7Y9{FveLGNxDfm9Dv?eb-sy&Fdm zIT*5Hz2R-%TSw3SlsFZ`Jemw?VT%Gik)cCZEyL39iZ$JnC)k;^pz8obb1HpE;zVKC z)(Zq4y6xYk(wPLd>uU>FYlVot#4L*9XAGWcB0SQL)C9zyNj*R1T&u%3ipifB(8jqZ z!1{TrnJD1#SB-p5MC|UHLnR&>FEQFW8Y%ejGR(6`C9;Xe&k6+z*Yidb4l81Z%7M;I zdf(HW8!+#rxKh+?VDa1yCureX;rERbL(J!1l6}1DiMlk7h`S3(%kzPD@$9YBGNb|y*IVL1VR=svN7p`tq01m z$Vh{RREor;hfxk&avq2*;lP-GL~n`t{1Bsw`|rsS>-YY79G$M*)IrO3?Jcl9KP)PJ zmjAPBe}>vHFQfHmH}qu!4j=!HT|2BXw0nnaS{^a0a*tc9)Tsf_^dkzt;!91g8OU*( z7%hxgg*qq_@}AsRZEFe^V1aq5KC6KxzPKG?GDUg|qtmz(27Dt3>SVGpt^ zRg>1U0(o@7m{F%!Ms}>mz9$=$N@Ul3X!W`0o|DN@W#zfs3z3LkrG)0iz?upjDDt$SCNa`)$ zYPPKFPBzIZG^8c0G|c!Wea``J(%i4wd^57mo9Kkm6K$g)jLS(^`Zuz}yyFzv#5gaq ziqMreOUx&NeVgwtOhyF1?_D5h4>+ji$kt5{pkeU!M z=`uRD2dmM9YG<3)IxmHU58d`5*upE>?DP?$9F<7mS{KK-nI@PO7>q@Gby%vthw)N| zDfZ$L9}xQQzXNIZxrCCv^Lo2p7t%%iXX{&Nr}gu!3+?p^J9Vv56i~f+scISK+@O*- zWE@JezQp21V>j_!>OgeC9Auqdy@#QO1eT{!uVZDz396H%0Rh-FYWfTPq8s1B{wwf$wLFQ|3MIN7s92*kcPB z&RQxl_`(EYr~X(OH@d}WB)mmP<+yYEs`3ZdHasx(-rT<&G3~0+o*%!oH^+?JG;%;W zmU%SS8W;Pmd%|jksmv>I=gv)Fb~kzVJtWv>{SnQ>>6J(Dj}sL&!;n&HA$ybORTBkN zRCqQQqPk9oChm!59hz204`;AZlGB)0J=bVQ2Bu z-&!f+Z2DpXtGxHw$IW9O6za1tr&L2%^(9rejm%@yT%4>5XVYn{lY0unA;R_Ala_6( zlV4ktN^(7~7YSTD`c|+ORrppHZCe+=zwhV!u&Ag!9cY)rsn%T0Th}!T$!C5*<*N5a zjB(HR&8xg>=OX0~6Mx)Aa^NofcjigzP7U?tE4kiDzu$3a{G{(P(c)TUs^w6OC5~kr z5>>MDDuP;*2dz)m%j0ES6o#_*-7i^&reM~@ML>ngOR9A&Zv1N|d>;khyL)Y!Ev7SS z1J}fzS!oh#;&59&#@z1sy#9Ap`8=-&BS{-5%se)2LDrh1kCeBH)8jrCl-`zx>Y_XB zIwd$k)g_I%eQBJO-Vlc^v%;vFHgdWmHI6=1kX%%j<94U1YyvSk zm`I#FwZyRg3gUw(Y>z8d#%w|WS&8WfLmf})j=qjSQsCahVD4YdtpU0LA%A69A}}<E7m3b#@cgz5vkJktp$U@ zN_lHQ45cZXa~^d*wtmIJC8rKK+i+w_0ucprV!~?_QNxK3U2*-{2X07uG>Tsvo!VY9 z4%(C&rSX6C%z2Y6Ge2SMD+0RGmaYSI>KDE8}m*wh2`=|1? zJ#t!EQZi9Cdz?Z4=R0cP0h;%p;kRfYQnpXW1QI#@2?p4EZ@Lj z@=zIS+^3N=^Tf>D`U#d9pP7zxL*8ZWCf@O?i{ zDM*&pFrHxO!s8Ejnbx2Vv4IzOBrFIF+w;a8T*l`W*OLphqtGfFG;Q~Q_N%w9EUS(?j>>wy3 zyJgxwh80hKsGhh~J%K%kYzX6X3g5KWBpzsb4YPZ98x;0TIL`-w*Q4+s&=k-T+`0Dh zA}HUf6<6mXwZ2gL5C>4l*53Xda-St3(ecm+(kC@Y2{Hmg9U<9>stB9p$pE{U75iVb zXb$R5*HjkiQP?s$90GzPTgMuEBmR~(@IUNnyWTB45OxWfOl(E|&9G;GAEyOS0<7)` zJ4bayP}$D9Dxf9)jCM-G*FctJzMo-{Htb^y|8#%8q!x^tsuUlGCj$d$=>K=q99*@jWZw*E)?$@ziE)-Pvl+zB$_j!=XaAQ({Z zXw~zx{{dHmJOQ25Zb`(&G;Wve^|I?U~+NWEWn z|80nm!O@p{w0_Z2C#&knyNT>v%a-kP7Qq3b)b3$FLV)IYG`DZZvAAeC~LosJJctY-iN+|z(LnB{a zgwmIipF)wk8tfOA9VO0YwW#Y?0L0-26pta&?a zJOPv0_FzOBTnd%i-AF-GbD$YDFNC+F8GC+P2kmI|vxf-xON^F9794HhcQH}WKk2f+ zqcvg+cG`PEJc~&LJ4$WGs1~(f?}mz4KI$j&k>)7Zls1pDp4MA48K|zSS)k0M0vxZ5uo=temhw!FyPzCG73!N|j^aFc=eA?=KE?hKdQ4~8ffBk%4pkLg< zr5!Z%?(*;2T(B7YJ~T>!+A8x#q9tH@Iup-n((eJ5EUajuD{aDzxpArQz6Kr%jWJ?i z63~A?Qh5``titHt%xhneW_&O21#Irm!{4>3b0HI|emZilyK~>qdpbBXVnJ(w@3H3P zlobHo2t1;)*h^qK&=SGpP=v%gwFuGJ zZAwV$fse%!w^a~Q4GFJlYnd;8+0tR=DgoJd~+wLeGr@d}rj0*S86!0@ z&Z`6!!o$7z_+6VDcb$j9_ulmIKSS@YNB2KF^eXR%t2plisz%-)o5M$kj2?eC=!0}# zNW%6m1%aa=%tXuK7*CtY44@g!quJb+eY`L}V7eD@8h__e!E|FsZ6MBmiN_+pIm!~gIEr}!rEUo(dp+|V~R;&&fGN9-{5H#gq?SyKDFj$S~z98UtiPUssQA?sea{vWwZ B?Q#GB literal 0 HcmV?d00001 diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index a12a530c9..349c3cfcd 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -368,6 +368,8 @@ TheDivisionView.xaml + + True diff --git a/Artemis/Artemis/KeyboardProviders/Corsair/CorsairRGB.cs b/Artemis/Artemis/KeyboardProviders/Corsair/CorsairRGB.cs index 5e0bf0fb8..0a95d6ff5 100644 --- a/Artemis/Artemis/KeyboardProviders/Corsair/CorsairRGB.cs +++ b/Artemis/Artemis/KeyboardProviders/Corsair/CorsairRGB.cs @@ -24,7 +24,6 @@ namespace Artemis.KeyboardProviders.Corsair "Please check your cables and/or drivers (could be outdated) and that Corsair Utility Engine is running.\n" + "In CUE, make sure \"Enable SDK\" is checked under Settings > Program.\n\n" + "If needed, you can select a different keyboard in Artemis under settings."; - KeyboardRegions = new List(); } public override bool CanEnable() @@ -74,40 +73,29 @@ namespace Artemis.KeyboardProviders.Corsair /*CUE is already initialized*/ } _keyboard = CueSDK.KeyboardSDK; - switch (_keyboard.DeviceInfo.Model) + if (_keyboard.DeviceInfo.Model == "K95 RGB") { - case "K95 RGB": - Height = 7; - Width = 25; - PreviewSettings = new PreviewSettings(626, 175, new Thickness(0, -15, 0, 0), Resources.k95); - KeyboardRegions.Add(new KeyboardRegion("TopRow", new Point(0, 1), new Point(20, 1))); - KeyboardRegions.Add(new KeyboardRegion("NumPad", new Point(21, 2), new Point(25, 7))); - KeyboardRegions.Add(new KeyboardRegion("QWER", new Point(5, 3), new Point(8, 3))); - break; - case "K70 RGB": - Height = 7; - Width = 21; - PreviewSettings = new PreviewSettings(626, 175, new Thickness(0, -15, 0, 0), Resources.k70); - KeyboardRegions.Add(new KeyboardRegion("TopRow", new Point(0, 1), new Point(18, 1))); - KeyboardRegions.Add(new KeyboardRegion("NumPad", new Point(17, 2), new Point(21, 7))); - KeyboardRegions.Add(new KeyboardRegion("QWER", new Point(2, 3), new Point(5, 3))); - break; - case "K65 RGB": - Height = 7; - Width = 18; - PreviewSettings = new PreviewSettings(626, 175, new Thickness(0, -15, 0, 0), Resources.k65); - KeyboardRegions.Add(new KeyboardRegion("TopRow", new Point(0, 1), new Point(18, 1))); - KeyboardRegions.Add(new KeyboardRegion("NumPad", new Point(17, 2), new Point(20, 7))); - KeyboardRegions.Add(new KeyboardRegion("QWER", new Point(2, 3), new Point(5, 3))); - break; - case "STRAFE RGB": - Height = 6; - Width = 22; - PreviewSettings = new PreviewSettings(626, 175, new Thickness(0, -15, 0, 0), Resources.strafe); - KeyboardRegions.Add(new KeyboardRegion("TopRow", new Point(0, 1), new Point(18, 1))); - KeyboardRegions.Add(new KeyboardRegion("NumPad", new Point(18, 2), new Point(22, 7))); - KeyboardRegions.Add(new KeyboardRegion("QWER", new Point(1, 3), new Point(4, 3))); - break; + Height = 7; + Width = 25; + PreviewSettings = new PreviewSettings(626, 175, new Thickness(0, -15, 0, 0), Resources.k95); + } + else if (_keyboard.DeviceInfo.Model == "K70 RGB") + { + Height = 7; + Width = 21; + PreviewSettings = new PreviewSettings(626, 195, new Thickness(0, -25, 0, 0), Resources.k70); + } + else if (_keyboard.DeviceInfo.Model == "K65 RGB") + { + Height = 7; + Width = 18; + PreviewSettings = new PreviewSettings(610, 240, new Thickness(0, -30, 0, 0), Resources.k65); + } + else if (_keyboard.DeviceInfo.Model == "STRAFE RGB") + { + Height = 6; + Width = 22; + PreviewSettings = new PreviewSettings(620, 215, new Thickness(0, -15, 0, 0), Resources.strafe); } } diff --git a/Artemis/Artemis/KeyboardProviders/KeyboardProvider.cs b/Artemis/Artemis/KeyboardProviders/KeyboardProvider.cs index 7917fa75c..71c0d028e 100644 --- a/Artemis/Artemis/KeyboardProviders/KeyboardProvider.cs +++ b/Artemis/Artemis/KeyboardProviders/KeyboardProvider.cs @@ -12,8 +12,6 @@ namespace Artemis.KeyboardProviders public int Width { get; set; } public string CantEnableText { get; set; } - public List KeyboardRegions { get; set; } - public PreviewSettings PreviewSettings { get; set; } public abstract bool CanEnable(); diff --git a/Artemis/Artemis/KeyboardProviders/Logitech/Orion.cs b/Artemis/Artemis/KeyboardProviders/Logitech/Orion.cs index c46fd652d..e66c9d8e1 100644 --- a/Artemis/Artemis/KeyboardProviders/Logitech/Orion.cs +++ b/Artemis/Artemis/KeyboardProviders/Logitech/Orion.cs @@ -21,12 +21,6 @@ namespace Artemis.KeyboardProviders.Logitech Height = 6; Width = 21; PreviewSettings = new PreviewSettings(540, 154, new Thickness(25, -80, 0, 0), Resources.g910); - KeyboardRegions = new List - { - new KeyboardRegion("TopRow", new Point(0, 0), new Point(18, 0)), - new KeyboardRegion("NumPad", new Point(17, 1), new Point(21, 6)), - new KeyboardRegion("QWER", new Point(2, 2), new Point(5, 2)) - }; } public override bool CanEnable() diff --git a/Artemis/Artemis/KeyboardProviders/Razer/BlackWidow.cs b/Artemis/Artemis/KeyboardProviders/Razer/BlackWidow.cs index 908f83fdb..52a930dfd 100644 --- a/Artemis/Artemis/KeyboardProviders/Razer/BlackWidow.cs +++ b/Artemis/Artemis/KeyboardProviders/Razer/BlackWidow.cs @@ -32,10 +32,6 @@ namespace Artemis.KeyboardProviders.Razer Chroma.Instance.Initialize(); Height = Constants.MaxRows; Width = Constants.MaxColumns; - - KeyboardRegions.Add(new KeyboardRegion("TopRow", new Point(0, 0), new Point(19, 0))); - KeyboardRegions.Add(new KeyboardRegion("NumPad", new Point(20, 1), new Point(23, 6))); - KeyboardRegions.Add(new KeyboardRegion("QWER", new Point(2, 2), new Point(5, 2))); } public override void Disable() diff --git a/Artemis/Artemis/Managers/EffectManager.cs b/Artemis/Artemis/Managers/EffectManager.cs index 88aa9c52e..d564cdf6c 100644 --- a/Artemis/Artemis/Managers/EffectManager.cs +++ b/Artemis/Artemis/Managers/EffectManager.cs @@ -94,13 +94,20 @@ namespace Artemis.Managers _keyboardManager.EnableLastKeyboard(); // If still null, no last keyboard, so stop. if (_keyboardManager.ActiveKeyboard == null) + { + _logger.Debug("Cancelling effect change, no LastKeyboard"); return; + } // Game models are only used if they are enabled var gameModel = effectModel as GameModel; if (gameModel != null) if (!gameModel.Enabled) + { + _logger.Debug("Cancelling effect change, provided game not enabled"); return; + } + var wasNull = false; if (ActiveEffect == null) @@ -116,13 +123,6 @@ namespace Artemis.Managers ActiveEffect = effectModel; ActiveEffect.Enable(); - - if (ActiveEffect is GameModel || ActiveEffect is ProfilePreviewModel) - return; - - // Non-game effects are stored as the new LastEffect. - General.Default.LastEffect = ActiveEffect?.Name; - General.Default.Save(); } if (loopManager != null && !loopManager.Running) @@ -132,6 +132,13 @@ namespace Artemis.Managers } _logger.Debug("Changed active effect to: {0}", effectModel.Name); + + if (ActiveEffect is GameModel || ActiveEffect is ProfilePreviewModel) + return; + + // Non-game effects are stored as the new LastEffect. + General.Default.LastEffect = ActiveEffect?.Name; + General.Default.Save(); } diff --git a/Artemis/Artemis/Managers/LoopManager.cs b/Artemis/Artemis/Managers/LoopManager.cs index 1e8d21312..a2ed94f53 100644 --- a/Artemis/Artemis/Managers/LoopManager.cs +++ b/Artemis/Artemis/Managers/LoopManager.cs @@ -135,14 +135,16 @@ namespace Artemis.Managers if (bitmap == null) return; - // Fill the bitmap's background with blackness to avoid trailing colors on some keyboards - using (var g = Graphics.FromImage(bitmap)) + // Fill the bitmap's background with black to avoid trailing colors on some keyboards + var fixedBmp = new Bitmap(bitmap.Width, bitmap.Height); + using (var g = Graphics.FromImage(fixedBmp)) { - var preFix = (Bitmap)bitmap.Clone(); g.Clear(Color.Black); - g.DrawImage(preFix, 0, 0); + g.DrawImage(bitmap, 0, 0); } + bitmap = fixedBmp; + // If it exists, send bitmap to the device _keyboardManager.ActiveKeyboard?.DrawBitmap(bitmap); diff --git a/Artemis/Artemis/Managers/MainManager.cs b/Artemis/Artemis/Managers/MainManager.cs index 256c347bd..9afa9e00e 100644 --- a/Artemis/Artemis/Managers/MainManager.cs +++ b/Artemis/Artemis/Managers/MainManager.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Threading; using Artemis.Events; using Artemis.Models; -using Artemis.Services; +using Artemis.Modules.Effects.ProfilePreview; using Artemis.Utilities.GameState; using Artemis.Utilities.Keyboard; using Artemis.Utilities.LogitechDll; @@ -126,20 +126,31 @@ namespace Artemis.Managers if (EffectManager.ActiveEffect != null) EffectManager.DisableInactiveGame(); + if (EffectManager.ActiveEffect is ProfilePreviewModel) + return; + // If the currently active effect is a no longer running game, get rid of it. var activeGame = EffectManager.ActiveEffect as GameModel; if (activeGame != null) + { if (!runningProcesses.Any(p => p.ProcessName == activeGame.ProcessName && p.HasExited == false)) + { + _logger.Info("Disabling game: {0}", activeGame.Name); EffectManager.DisableGame(activeGame); + } + } // Look for running games, stopping on the first one that's found. var newGame = EffectManager.EnabledGames - .FirstOrDefault( - g => runningProcesses.Any(p => p.ProcessName == g.ProcessName && p.HasExited == false)); + .FirstOrDefault(g => runningProcesses + .Any(p => p.ProcessName == g.ProcessName && p.HasExited == false)); // If it's not already enabled, do so. if (newGame != null && EffectManager.ActiveEffect != newGame) - EffectManager.ChangeEffect(newGame); + { + _logger.Info("Detected and enabling game: {0}", newGame.Name); + EffectManager.ChangeEffect(newGame, LoopManager); + } Thread.Sleep(1000); } diff --git a/Artemis/Artemis/Models/GameModel.cs b/Artemis/Artemis/Models/GameModel.cs index ab209277e..e0569a0a5 100644 --- a/Artemis/Artemis/Models/GameModel.cs +++ b/Artemis/Artemis/Models/GameModel.cs @@ -1,14 +1,16 @@ using Artemis.Managers; using Artemis.Models.Interfaces; using Artemis.Models.Profiles; +using Artemis.Modules.Games.RocketLeague; namespace Artemis.Models { public abstract class GameModel : EffectModel { - protected GameModel(MainManager mainManager, GameSettings settings) : base(mainManager) + protected GameModel(MainManager mainManager, GameSettings settings, IGameDataModel gameDataModel) : base(mainManager) { Settings = settings; + GameDataModel = gameDataModel; } public GameSettings Settings { get; set; } diff --git a/Artemis/Artemis/Models/Profiles/LayerDynamicPropertiesModel.cs b/Artemis/Artemis/Models/Profiles/LayerDynamicPropertiesModel.cs index c6bd07882..0ffd2bd86 100644 --- a/Artemis/Artemis/Models/Profiles/LayerDynamicPropertiesModel.cs +++ b/Artemis/Artemis/Models/Profiles/LayerDynamicPropertiesModel.cs @@ -60,7 +60,7 @@ namespace Artemis.Models.Profiles layerProp.SetValue(props, opacity); } else - layerProp.SetValue(props, (int) (percentage*(int) userProp.GetValue(userProps, null))); + layerProp.SetValue(props, percentage*(double) userProp.GetValue(userProps, null)); } private void ApplyProp(LayerPropertiesModel props, LayerPropertiesModel userProps, IGameDataModel data) diff --git a/Artemis/Artemis/Models/Profiles/LayerPropertiesModel.cs b/Artemis/Artemis/Models/Profiles/LayerPropertiesModel.cs index 4427cb7e5..745997fa1 100644 --- a/Artemis/Artemis/Models/Profiles/LayerPropertiesModel.cs +++ b/Artemis/Artemis/Models/Profiles/LayerPropertiesModel.cs @@ -11,10 +11,10 @@ namespace Artemis.Models.Profiles [XmlInclude(typeof(MatrixTransform))] public class LayerPropertiesModel { - public int X { get; set; } - public int Y { get; set; } - public int Width { get; set; } - public int Height { get; set; } + public double X { get; set; } + public double Y { get; set; } + public double Width { get; set; } + public double Height { get; set; } public double Opacity { get; set; } public bool ContainedBrush { get; set; } public LayerAnimation Animation { get; set; } diff --git a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs index bae1671bc..128ffb205 100644 --- a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs +++ b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs @@ -8,7 +8,7 @@ namespace Artemis.Modules.Games.CounterStrike { public class CounterStrikeModel : GameModel { - public CounterStrikeModel(MainManager mainManager, CounterStrikeSettings settings) : base(mainManager, settings) + public CounterStrikeModel(MainManager mainManager, CounterStrikeSettings settings) : base(mainManager, settings, new CounterStrikeDataModel()) { Name = "CounterStrike"; ProcessName = "csgo"; @@ -29,7 +29,6 @@ namespace Artemis.Modules.Games.CounterStrike { Initialized = false; - GameDataModel = new CounterStrikeDataModel(); MainManager.GameStateWebServer.GameDataReceived += HandleGameData; Initialized = true; diff --git a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeView.xaml b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeView.xaml index 4e521d966..ac9c61744 100644 --- a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeView.xaml +++ b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeView.xaml @@ -3,8 +3,6 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" - xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls" xmlns:cal="http://www.caliburnproject.org" mc:Ignorable="d" d:DesignHeight="476.986" d:DesignWidth="538.772"> @@ -20,8 +18,8 @@ - +