From 138c5ac771d84584d8d53b044f2c752484b23b07 Mon Sep 17 00:00:00 2001 From: LinuxHeki <75025611+LinuxHeki@users.noreply.github.com> Date: Tue, 26 Oct 2021 16:56:12 +0200 Subject: [PATCH] Added profiles --- preview.png | Bin 41405 -> 44168 bytes xmrigui.py | 845 +++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 643 insertions(+), 202 deletions(-) diff --git a/preview.png b/preview.png index 5733edc39a4855245589a2eb63f8b56c530f8541..6f23580716a849666bf0d6780edf56f5e880548e 100644 GIT binary patch literal 44168 zcmce;1yogSw>G>13F(ps0TB=+rMneTLb^dxy1Tmt6i_J%1wm4gmJUTqx_DlL2Ja$9|( zFVi-~`aYSo#rSAxh!LWo|EL~Y|2{Qz6EQTFCY+4UEj(0`my?qt8UiBcM>{8?cO^G zkif)^S8$cLv)kbK@ZrPJx|>KNJ)b~2ArX;UVUh(Ueq@{T{>tFd-rnA<+0gagBtFEcZ6!RbTvPMeK|i!8e}LHpl;Q+2cL1d zAHO5}VnUeIAE$7On3#Be*9+AUn<#Vn4->h=#;VQ!1@pekf?Z0~6|Lr%+o2p3a;Eda zm~>J;J|cg9yhcL|So7&rJVg&UUch8xVnQHhy%zEE3knw72qgDs9ru2Jd!V9n9}Ye} z+{B4jSiBGy7pFB2yx=$TKhVUbguci*{^VNqvo}d;@t_W z?1hRhy1!f1`qd6_nl63E#wEih`>8KgHXkOoi!_VRkLZcQD}?gmbp6w3iJh$^F@NEH z$GAz33;UU`j{3b!8(Q_WNPI_i$jAHFF1qTPtptUVL#pHnx>MXDZ5s2g$ zFBlYw5nhgHi29iXaw9L4bOC#r?b*iN{=iF;M&Bb0#LLvw)`jDXc)Rg(Q?HYyw4|3W z!>Vk@o^~bB)~pp3b3bj5N)_?T)pFFUB$@nMCqMjRHvBY|0L6cQTW~EeCu@&rm}Krl zRjD%iBSjB3JrXnwH44@{cUod@u$u^^J8xEvJzX3AP(HPJyd8M8ZpgyROU$B@6-JNs zKv5Azm6lsMTVm7DsBOV%zPRjbYvASIn|9MRM7gX_=bMA0;^O3BhEq8Wu@M6{RW(Mh z+?2#m?~NE9)_C=Z*==q3Iwk?#HC0iQ3?;&%ITto|b}pUNnMWHP`K2&JNr%v=m5Zz(N(HBjCMvFX_#jnEZSutdO9%I9xtoY>Yd%NQk=j<^F>Ba(*2qHcKIwGv7Mh)V;C1Wbc_G{^c^Og#&c^*Gh>;TfPz=1* zI`?(NutVl}wc|~P+9fgw9rTitH-&|T$v>KLQ|xr#dX6Y`h_6}B@=eUn4wPoU|CqHx zuLKc9C+=giHC>A+!VDYT$c_q8>@jF~iQHaKyAv5!MvBQt%Zv%qdcvn1n`m=&E{Myn zV{oS7oE>h4PS|yhSC~1^H=~T(2_UNUxgm%-_wtX;|Ni#Edgwh~Zf@?{w3U$&9fDq@ z&WCVfvdWgnXMaU+eHfQ<#5zC{UAcG!6`|sJ`-xO^V^$IgzZvIKUujNZqZvcunHy`= zX~T5K-U*E9E_vJ(+)=IVKVIL1?J?`SE$(-9arEHPqxM%kW{7h-ZaV>Ld>SDH?4%NX zK^h^a=BZPsfc3DuJ;(E*1oT)CV3xB)j=Xo~rM<-Ha4EPEJ{RGkoe1RoRNl=~O5^0F zz(oXo{>+Ei$y$(+dz_|!JGUmm*sz0k^Z>a~Rc`C-)p}Bm*uDiQi%G+D`aC>gszNOGMak(>| zIw>V3T#2)`U6j1D7P80Ah_*2UY_hV3J#5R~H{o4$z8^@lgnCyLW;Kb+f^>~`Un!ldDSHV%WjH3vQMjw6okX72 z=f7cQ$nkAf&*3AE=dLa>5kejt6o(rVp-Nnhq-I?S;or(9V`gf+YuXaPyY3WQR7)o;a zPlhL+@=@{EF+FJPaHZV*IsRt<>xT{F z%=G$1^e`N^& z$;Z?&U6zxXT2|d!H$5;b;q)TU^-3bNio;p=d|CM)H={;$Ee6jxL@F1AelriD#|mZ( zKbK0ic$t#IAR;0%@GkLY3gjf4DvUbZy*!W2$=!?BZdu76CLgHRGJC?Qe{Isdw*^-(7n(uTk@-%L@@&i&P) z!3wkc8REWV?AoPrmX_~5Pg=uqD!l(%LQ2h1oKjI#Z0SzARbkmnl_BC@q&Q`5FS9C4 zCmA575Ko2vyepJL|BK1e_Y|?JDa_|$dswA)Yi!$gm5~HDJ27wi1#N6>Fx!{;9&I55 z?Ld{Swz-AHLf&(U)+}+~h8|;|)!QG9o9JvuKdP+}Mzx}%b$SapOh-MJyreL!_vok^ zGm5QsU4GgUg6>pn5I;K_cAX><0tVz6I-f>5k9xx-s#~{i@mPE(h4|iV&TIPjPj8G} zbrn|l@^MjdX)AK%Ub|0U^;(MUG^2I*^>y}3UVZF7Y?~3B^9vm_4y0}LIcUvSe6iC` zqGAGj)=4B2E)z$2&*@kDb>zl}PzaGLW|)GADERd~tEVuRgx65?zu2|>e5WM*i6-ZPR*y1-h^D^Sx7|)N2-%vcH@iGPK|+9oQT@TDz(80D zb`zE8aNEImd%X6(u?&9o_kEBY#$MJyjCeb=x&!fv9Io-fwTbz~^?Q~-q-<>1Ae&UU zEIr(qZ9EG(5P^KDm|X6(AalNMe6_c3MpPPdA>0QyNbT6LVE|w!fZn0uqTqrnk;G%HxH|o7~m|^h~#Jn*v@OSaqv8+p2f&xS`z)Sf+maYa7fl zzHaL7q-_}k4-Zi?lWBVt5dr~_P20#Dea`>LF!L-vDyrH4XeRRV;w0)QRPK^@-5;Fbx@yPFQuOK3*Aj@Yh_bi>?mh7Vz zJMtY)!@7C68wC#!0c>n+o07EGuXT$lv)*v(WG{aF_))KkoRn0m$!X3Zks( z@>Kpv5Qe66m+VJ|Fp0SDVY|ADcsNWPL2Yeq)u^c7F*p8A30wp#7gtw~Y$PE$dBI8r z2|6*R_vkG~MpP2!M^e(#C@wB82!w@&#qpnXM_A41p)Elzp_pbPMVj!r`*0fq_LE_z zZ4vz5ffr{-U9eKo3WlQd?muT_VZnsIXz!J;(B$mV#O6l9F8T$SoZ^1CZ z$h{fEURro05kmjgxGCU)vU2D9$LViA8|Rv|m&q+tO85yy;L~Eqc7)uzpJ1~4t7F!& zntx6J@fNVZ>IaSPo}Rz6sZcins^@#w#6M^7r#F4M5s@)rrvS+PjSs8Fb5-Ajt~g3G z-P8*A^-<={YW}*zNn0L|4ISjXUtL~!o$q!v_V2=yYFzK=>XLo;WC3u_>=aB|Vq)Sz z{>2x^IXcA7?-wdQn7= zBTCtHhNfppwTf>b%B=?(NpIZX_ZA&4SM^DF@#2MZ8=l}i6g5kl9MlT{>pGHeE3FxL zY?;iSX7#_%Dlx0jK_CJz){VJV4vYFz#j&XM@E+`fl)cMa=a&e>fs0q9C* zf-N@atN--r(-$iGoOkbr!6*8&#Hrnza&s90qcaK%*D9X--V=su?GZDH2HOo9 zd`tnm@t|iz?{naRM@2`sWO~kCZ!`*Qxd0>=xn5e2uaHNC+!iZ?dAk7B*u1^uP&zo1 zEsuBF2%M+vs~0{LWQEK)bREqF8gH*gyHAvxqPT%Q4eU0y_Zsum!tKZ4i??2L6bT-evW*y6=r!hWsQea5WzyBrfRnQWD2|J zAS*;Kjo)^39w6DhqM{;X+-bNtoB|9dK*nW+3*a46pUk@_hE7c|SQEg20Gu%lILTpc zB_M~^a_biM-E5JUP#DiBDk?g%RjKQynpWsQNtiOpgifiOs-~$K4wyzNO(sA?S9g_G zUuNN(Iqz=c8yjJl-`#e_Bd1!j>$~eb|8HQ4ffSm8Iu|RTBe@n16BO72BXva#L`3K} ztKMk8eEa^oPBY{Z$V%mUC5cRTR4oXJ2IZ}*CZ*D(7}!h(HAv+t;uRo9!H-8;7z{RN zXjN5Jm2l-r_j6nfv`5V9Z+qw^Rf|X9EDiIF{JK)85%gGq5NxWb;K>KG21mV7Bn;EL zA|}dYH{qb*X9#svmdlAPGiEGOk-ERV(;E#4Q>?-j;y>^v|98Omzrd3J=Q#2I^sxeb zHxvy)X#^kYfDzZ*7t%7hbPoo+2efYGlxQjB>xJlYG}C_{h~m|##7w3~%_YNsj+>5I zxQDpmK-9sBBCm{6tIY3WC-vpARMz7VrBsHVV2LM;jM(>aDWqjcueGnE??)#lT6*MF zPlP)75V(ak<%~wfsCG7!%EyToA(uP8LNmIJP!LM8bYkp9Jc>bMiV|8Je(G6E zCHj5jxC*zt_IA@40Q!Y!l)Ug&ITSRrAhilk1ESS1MK@Wy!th-5sKfzX+xyEx^Y6a| z$v;^vz@`mg9W~MZfEyXfK`kfuTNERXj2=shJTGc}s+PO1gk&(6omEEOUk)WowU&o% zGM>mj=!s(NcI;;z^|zhRirbyxQ^WKaxRS)^CQ_e+?$A!x{Lr{wMd*|LBNx$Ll<|sc zyZyHZYQTr##aJ;8kCg9;GTTnTorQCo90xx{lqTHZ&dVcd+!wg!Y$l&qh)$_3H_6TY zGa^rbRzjq>>klL4hByOb?q41g)(3<^?78UYwJ%5%BX+KnEt4RaC~3TMBhl`Y9C)$l zM`m`o;NYs3Cc;Nvm`olb2bT@ARAs}f60V+@N=r7uzwi+c8ftBFN0(Y95wiSs>cLZT{5T#8<9ZiV(X zL;IDt?$_#GzI{u=^eDcpb-Rm9@B8^pVso{czV`5M3KyoBxgi(pc4Dq`C)snnV?N{N{}H2M4% zc z^TY?F2ATq`2o-w6D?4ec%zN;DiL#F%^8IhkiPCbU2^8FY zLoKYoPR!YfKbK0S5g$&ji+M@B=AeYt8ile*WABcdwP|l!V=cYuPIt~S5#vGg0zRij z!5v`s1m{@WQB-7|f>TeAr4h5ANtdYQpNnFkVH7Rb>b&|b=Xi@{0Q)7=3u+wSiJS#v zCZejK>m#@b_5*mb8* zblc=~e|2^WSr0W`Y&rt=a$J3)AFoBr?eiM_$EHCCrATPhLj>K5opkbRt5m|IZK%5t z2#0EF|I_{5S7Cr_TtyVN$UtM*t|wXMN&yjn30SL?tryG9*~eSF`OeXEzRb%2qDZ#jL9(P1ob|e8*`H;&{v{X<^Xcl( zcQs3?`bY}L+{$XP@n}}o)HKJlG2r6V^!#}D!Gj0Q6Q8Uqo_1ivS<9F31>`b9Q6X_0MRe1BW!4$H+Y&K zJC8!)ibpZm7u+&P^ITdEFE%PFXvX2bf&#|Ak2vsKC~rkfHm0fx$YMJRf*=*`0CF+~ zS_H`k!9jH%n`?#v7YAdD$GeLFm# ztOpGOil3tNq8b&XL>l^*>zP)VrUwUuwUwQVR2Ykl;o?AGBIsde(J=9Wuw+ry(u&B) zpmE!prp#q+HRsI%_@Q_PHRQnh0fn#&lR^TGuI)sv8DF7ZF*b$xqvm#Iw|MJ_M-hG# z6he|`qOuC=(R$VempCC3s0j+!a1k{hGSTM9Y@CLFu2D@#b>9c7gqj9PTEQMM0nQsq zZz86nxYj`V!UP^GE8F_lbs_*3F zTLC!abvc6k&z?}1U`-EAwA4O~Dl}Tgh=e;JB_qpK$(9(e_v8wiM9KSLuB)J>MFtzD z?RuTxfDLNrJjFb(>%I4=R^8TAYB-yp*PMba8|b;>ot&Flh(^}WQ={Xl1%E;PE#$UB zh_FD#Kz!7z!rq*!?)s?vX`on}%fRK^Z7+~45;HQUKW;|kX${Kf5(kNr*sJmjDqoNR zHB#SB&d))vEy!hn2zq#J>(OU3s}I-d68dlF{>`|_jVxl^*8{c_N_2s7POr*_0;b`7 zuZIGt2|B+WX&_`w=f3&_r))Fo(UzpLeG1Qh3upqt3&Xf3gCVU}67k|Ue(^XLA3fhv z3jI2wHm6MJHRdrl_#r&QxEz5qR(jJk@Tip8{t3p;Zyu5W)+cu~n23n@M`0sa>X(dG zQ|WPS)IX3z43Ut24I-;o;w;T_8Z4PT`G`7iFdEax z`Qi1lOt88d_2L@}mRX^aP+6M_LyULqr8THP)(g%CoY`+o*ADrfg%U_afph@c6(Phz zdzqHzJC=FR3LgWPA_x%u{Ni&-3gRu1!$_}Uc8AL#~LHDLd9xVIWGpMa!z9g+NC>3F$ z_u1_r|3`7k_S?G-0tQ{cv8fx>O)Yg>b?clzUh$x@C}%Xo9mP9-J;B)B-F?Mv8bTcT zSdM|-4z06W$I9e=ssqQ&ZH{RUmzFJb6S+r=oO0#24F_^b($WDnQZV^m5?%JE7I95N2QFl1?Sf*BMQ@Z zWB}h$Vl-=axFJpiD*_F5Lfqx66Xo$l$X^4#&LCEm*CcJq|Lz5F3j2nr-}}xE$tVc6 z)FRM$VT0BmtHgjd0-X<$2z41ORmR)5(SbSY{`O5;Q}c$LTG%)9BKIaF9SZag6C|U` z%F1%kU1CQe`+;O^!cEaoZ9h|YBbJP#$bI1sBX*!EIrro`y4wJ{S~EhXsh%mSPQEYg z?TZ1UvAXnM?jp3zkKcqLLpN;daC)qo-A-!T5;KAHM(r2VpR5RoNl19?#<`LCTQ<6w0X-uIxSCk~Y35`d_5pwWo>M1 zN-oBh;E4h9SpmtdWXcyXNo>axD{TUz@Pu+4if4c5Z5xHs=%qXl;s=y*l2UQEne2V(US0Y^S^elWZ%6%XEeaX}$yNgwHV+&Of(oAk0wTNC zN2%q$OdhwDf!NW{0T(``q@?p@ffwwM`=cSI;8O7wj;@v<%6*RuXWB!HKmImQf)3VEo5w?~TD7eGIW>~%Eb4Whq!OxdjXnX0(@8yX5$rw4me zI^Q#5V0*rvZHaE%<42;|j+J(Nem0btni}!r#}6FTPM9;B_~=4pj$EG^Q<1y~19Hyf zS9|pF$#S-7mEO8RKM=k^%d`Tw&JBmOVrpyz>>LoM85JUME*ibvW3 z2m+7MKw?Hpbx0fsQ{3xg5XHLVclw)~D&CXj_U*=roj1YnZUk$h6`7Exh>sabuG3m$ zB&fQjCt3)7@w<`1(DvMn)1W>e>|&;#bmo1>t@-yeL{2U-=!}d_qW^V#Qxml5iRQ6g=7%d!ZmReJ~FpUn(Nio zGs*p_-I2eGrclfWa&`W@cj$F-me(WA=!=we(BmGsQ}}g%9&T1~tihUbNOF}glBqd} zd1D9m0ML@P-}YFiItgLq)`e-3N8d5vEIQFw!a!WPrG@F%AP}FJ#S(74dh~|xI{ZTh z94h}gr1%M$05tcknr1HqT5)LQHYff>4gj>X~rc&=C}2+}4f2ecXaKa@0_;3Q}F(VFpBe3+k)0ma#!4 zwdl>3yxDZVhXea76sci=#{G|MU^{x(ZDX8heXOht>>wxz!5KFau#v<9kq)r&7vO_t zfWin3;|@0<<{l_1$$EHrlziwwK?*dWJv?~)SRQ0xtx|(%fa+uV+8P?9bUrH#ZtJ6X zK#sP8`hWv|k4QQnETGkOzSvPBq)N0FL3-`%;cD7w6nJQsa50@4jGPJxeF_gBVnZc{ z)P;Zp^eW&t2FXCcaW)R{hk?@-Qd1c!Q0cn$Tr8xhi0x697$sybueA>aenlN)T?O}_ z)4dXOq`N#Q3q&%_F<%Y|(O;C?v=A=Mzp=X`C`ev8{ljteAreWvRZq3}{pXK>E%ieZ zLW6#PrTW$P>E#YHB4TG7pD6fkNVn>@CH#QE_FB&LbXtrT^eN+USs7qBht1Og1+6D2 zXxK28BL}m|&(ES_W7|T|amxKpT##sDR08yFbl@hDw}qTTL(iFT&<{uS)qCZ8=zKSL zkUJA31Ox)2Z`tVEP9Xnfl9_14eKeA~p8m{N9Ita{r}N)elarU{_j3M1CF-#u^)Ia& z=hH+S(Jh5}i0KC>{2M)sd1LFl%aT`=J!xEBpv+MD+sWlHeMD6#_h-L4|Jz^jY=}8r zM&aI{Z>r_`a;X+}lb^2}`|Zkq`jXc$@3W;p395k8@s24{Hbe>;yInVt86RSo6sbI5 z8UzAlkT?JmkONJ?iUY+e0#T^JhD#?#F&A*g0TvYJz2Ayp5@@Tx0A#VhJ$G}??=K!i zvIIKu7{EC2m!{b_NVXZ2`J9FZ8qoinn}g9%5P)akbW)%vAQ0caee3@5Bdja$(SzyF z&qx42#m2;7BWD@->4VjP%DZNO?U02Rvr1MR7=}i%#m5X>@n*f3X}9}poEIB<{QUhK z>Nf>`|NiZzuNu{=tK**39fE-xvh1=6!JMmcpBRCxvk2e(U6>u-B1W&5w`uJF$3PhP zed=_lo@5kWcSA?9sGe%PN@MzVR?nn)L^*oC3E~DGC^iZP1~d>YHHy}Pl?Dd~!IXv6 zNF0`@O=!r;F%huvvOLp~H68Jqi-QTIE*Wr!4cqWzOQrpKX|!DnUblc}5PlD$4QUF%t{REn#8G zz_Y12sz6ma2G)w%Y&ws=Ba6=koj&k#F z$qJ4`H~FaWL_D`}V>?`=cXqwRoP=nq0?HP87G2Meosm}x2qM}3grP`<`kfxc?> z=yA8|m-_r*Z{G6(4&sjss0h0!>sySw@*sqOpJ?=>Zs^{gi(?@o2wWBql7C+?Uboes9m^M))NGL7BjN4sxqbjkiQsVp9^e+JW{}W&g+D8(6$f4!y&GD!;Q-eL z4NP){-2^XEs>KLxDX>4?JBD-l?X+N0i2LvXFEN=v87-rzgN_@^K5%1L(fa$ma(_0-#oIn_FDzsQ6tNUSu;Pjbc00g)_ubt1KvNHg|Mg9y755NoD!+OfQa7?1A@f98!36-Qm}b? zdJIQkO;tN~L3C@JQI}g_gN-hq7}$NxVxA$m^XWze4*hZVnTZoJQh`qMO4O6{a`$;4 zJvaiv;MWlZFb8on;FtjnUZ46UVk^wLjJOG%VPhfTHW{Zu6gm!>RNmmQ&63a@4AvQf z-!F&=U2x#e!I-gcnztC;zeFrbSeLfthYYe2^I#_2xdio@f0YO69|K&uyFa7?oQxUx z*=8+}b*WE%;s0wNvBq#1?Kbeq%-$DoyJT!N^hxIM6((-<8 zGOW+%kHA56yBDGCgtC#sge;`$JG6jp3VdY2Qfabs0mLHN-4a4(1SJ7p?_?ER!)j5cw z3lMC$tnh!oCSo4u0_dVXUm;68qtxZT9O-E*n~9J(ukxfUmkA;mhcbtb6EUA}h|XfQ z2Y`qz=j53mQ6xKh{)xbe(SVxUqX>dl1_MO%LQ(nmZ}DU!qIiZ5S@>o$j5Hnctd|xn zeIIpEzR|Yd>%WuV)2?s&U?oUaDT@I33Ae0rU#nT;8=sWse zn^)tEza3AAys1ag5I^aRqV_`1ipEYhk6P_lqiW3&KW2P>EjP`gsTIo}>2DX#zV8X2 z#+zeYp3+oJ|FN>$RZp1m6SH)W*WCX=I3{pH*J|d#J}<{dQ$*ZnT7ugC$ytlfA3g)k zl&UXNuc)HBn_4+dNXIRH3-Paf{JZP&NBX-l!>x=~bi{8VK31%x>!ar_Z+yv;d%_dO zROAlFjAdL#1Gwwv1aMAkyv)T;1g#mT=nsPL&zBa-8J&7cZ09W=kR&xN-8U~g$@WZ- z2$M4xyYP$>p~c<3jtDaHoW`jh3CX_l;rd}%$FP}mzhZfJsGR(_VR`TAmqFD=!-C7} zaN-T`4ThD;FS2{$e^uSrYCP-XKLkgevu~hAF!hWZ<|r)J4B%4)?J?Y%hJkLBYRKAj z+>@?j`|k8RGi}hUbH-ZI4|nfpQ`f|Sahs+tO3G|djkNY+vr>Pvt`UZnH|1XSdDO9K z9@P!*42yT&CmuHtUe(?^BUTHnAHLqLt&VB5w z$z~3wo&9|`BxPty!pT&7TI;a+@Nh$B;?kJNcY>ZN?hqEMTKW~(!|vzyim!*uiCRtSI`#q63Z=au%&QJs!UBfk1U5+K8msE$_UNS z9PzC%AUl<*`Ie$n-EAfoA14d0doB-Yju)hED~EqS;0_>3-R`5jfqJ(RgXpQ(kNAP< zL?X8Z8C6Tw_wvMvgE3vk8A>j-sx_`S*nyKVJy}L^hhuTlm+xBHu z%w^U8{jyM@i-I`2Y$Qzh)f(#nGe0a$y(xTv&7US%R&d@qEX8sEHuftgZ@yD^KF04K zWy7S=@{I5@74YI8hCL*uk17#07*0g#PR4!C)V8$Sys+17<9Ul&=6PR*kGZ-2&Ip&q z&V!uYEb>&8wm+#AXKPIh1ZE2CmEt_SJGb`Ifd}F+C>$ycayF&C>G!zY^un|JVn2p) z3Y)qTS7}tS5Kmz|78{`(!61RsSNQ}H1g~Gtr(H)ep8fkZ|uySUY+ViUqCq+MV=wTH?kZ z&@w(2dF5tf&Cgb7+Zv9*B79jh89Y}j#`}eivn{pFLMYi*)-;^NBdyZd{D6wcIZ1Ed z&artuE2-vl>~%Hf=Yp>~-i#cZ`(D3`|2+5XAhH~n03e7clY&<|4dFLvd7HcFCjJIf!rF`5M0+CxQ;!?zfHS+04e9Q%>9XZnx0^x)^?a|5S}mV{%XQ&&K*B z?lqB@Hzg42U7Xf}zo|6nBn=v;S9fYL_9UwwHt#c3JlLcNu3<%+d{xE0#y5~P#zD*` zKzp}ieJ&IB*p-L+xFK<6>}EIT7c*JQJH&bJHLh}~r=9{bWty^iTBddM^O^fH52R<4 z7u5Bu6!L1t1Oz-9nqt)eK+!qWtunvr?Y-i*Ekg2M;75#cP)}ysn5@Eqq8D5!N{w8q zfswI5g8ur>UZ&w!|CNoEwb`{_9P>HLv3i4~F!o>5wQ+RXPNV0_i;fXI75Dl+p4`O# z;&2V|l6E|@JL}tuh&}UDu6k4m__rL}M7A$B(Y>uDpWY?znnmabaMH+!JLz*23i)6m z1{}JbgkrE8n$V<9TKuCnQbJ0r&xtD12tpdUZ>DtN=lvQ8cqQT~J9Z~f=3MiZ3D=MN zCkv0d-5(um&IwQzRiE#mv>W-L*G-GjP73g_&eT&+77DOVR?#A;G|^7Reh2f^H29MK z%8QSRA8xZ7kSfrWEg@!z$+=gko*XO~C=}W;XP(zOy0ytw2DW(0Mf48eY1{E{dbh}x95xh?&aCGufA&(Yt6oOL05*_^#@V>x%T-emZ2DL z=0fBPy%*2!9eXJ`W&9Dde<1cAFF{r<9M3AY#OvbBAmgsx$!IMQUq8O+l{oT$HX8Rx zLNtF*VdwEbbt@cM@O*XPo_5WwI_l@NgW%WGwPL9>B2u6JEb0|vnbrkCa?H9gt)NS?U+~%#Bo3RaiW7dUyM(mQ-~I!f+5eUpQ`lh-S|B7-(DApRWtBFaI4m|6$v2 z;pm%h0!Wai041S=!1}GyZtP!KjG%G?aw+$*Auwg58Y-yHW3r&9w_9`g+}PBK zm{i`AaPt}`U-O1aPIh|jny;?}ze*N+ReY^a+} z0QDkq+}a@f?9P-JIa{F|50kQFiPCBC&$qUXg%t-*lo$tbL26|RWrrAkFVrS?GEwRM z`W8M$GAVi;&3J|$63E}7d(Hym1WPIWq3u#AT1M9{jI3_%Pc5O$G0C5S3AXM^nwOH1 zeOl5b#5qHSgl41HPIHR1u_Q0PDuG!Jq-Zol4E`Z_1qR?f=(=*`L>8)7646>%{r$Qc zlnn&};NRbg$9^B{Dnv6Y{ZWo|`XPsd7t={~aVSRJoA*jvCfHu=^8S+F zqM5r9Ou7mmZhQ4p;hueZ(C3b{@DM6T51N`$d49k}YUb>o6_G{7+ZA&e)Lz+VRWEn5) zP)fiK88l)OK4OFCMmda-P?5`7{kwTmK5pPt_wH>|{&5GcQgqAam>aGerBOA(c2se4 z?t+_AVP);^M8dqojC~3UTH&STk0Gtlw5~-{B@(qLkyOVv!6vfSr=BgVyJ2qKHCA@y z(-LAl^Bm;W1S;(tgP9BaUM3awJDX+bLP<9bW(1dQt5Dh&cRzPipxV5F3G#?13@<+t zTrwTo<<;4As1eJVN(S4G|CmPyPIW=9`p2A(qq#eyLCaS!V|+V3g7uS4s_HA&btq@& zNT*B4gPylJ@=^6JRa8_gUKl=7f+YvGHId9d-&$AfyWq+*GU_WO$|Yn0uD6SQ;9Uv+ zX098dJPPAAtPsLv5-0cQdnP~UukAnNmM$TiKkRm@v8WOMj=_?r9G*~tfvap2TCd>Q z*|zBW)>R+PfR5m`|J2K4OE2#`&c#q zsZ)2!N?d3vQVP1CY~rd|__=mxq~F^s(2P@z;V0Gb8rnbYZ8CX-QpF|Ym$wS|_^jSqHXp|`DI%#W;JSuw zB<^y2TiktHSQr&560H}UL5!KY{iACy^CXxv{QTocmi!a)>Zx9WIx=QOVjy4^JTSNY zPQi%g1%}-Z&x)+NcbeWfEx6Pon;nVn#G&Nj18;(kj-CxfFONTc5AVZ=55dj@x?;Li8c8zP?S*Ao;N8}sL9CRN6zB{9 z3+jRarG!iU3@Zmm_zc~&_669wEh=L3lfW9g_xG*hIv<+pAnN`YB0y5FLer5+q%K91PPptti2{f>N zAEI99SvIR8n!c$D5nV&6yo*^E_qGE*6eHD?O8K8o`idAxrsAMMQ3E)OlA%Jw81%*< zpo;@mABikTe};H4_y32TP`*<*LyOA6kMDBx4quGW5 zJO3@TSu*tSDrbpBBds7{0+0b|Iw>$$dtL>>A`sL8wwH?N&S8|x!gC<=z zhHUzl0j~wJITH|wUQe&(J!Chgg#YPVXn91cMxZ3SwRn)-)d_-hk`s7!36_7%FLo0l zpnRA@Bh||A2a?fJ!`KvdZPda5n#=tH$%V=u&QQ1@^a|{Pv&8#mBoN0YFd(EvsHaB- zz0^op-1fABPiF|JjDZS;bhE5Xd}0A3;w8qBr$pXh6egV)0vwnv@RW9bDsi3I&&7LB zBL@Qavk0opUe6+5z`0i(wIIG;30c?kn_Ym~A8i zhVM8y?5XespI|c6f@9zrwUO5XdecTIE9o_NoX%RCubXu<4v(@WXu(e8^(&fX2l}v( z9at0+el?ym5vkei&^1pWdCpzuxxF=ZdUf0-iOlP-V6aGE(LVScM)$xU+P37f0Cip$ z)X~mxOAOGJ(r5n|G*IZc?}Vx(9v0_9P9$9`_^Xg@=_c^a01(~~h-v38q-@tLdAUo_ zaQrJ4+0zQ@gr=>&`uj)H$R)X#)PKOk(RXc&0X zV@ya(yLse)c3Lwc|Do%H=k_eJ83nvcA;<>_0t3`lwI+d{)6ST%nk!6NQ19w}?w;ab z*c!Azk?AKC67IlTk@dzOH_-N+Sh~iDnX?WsWP#$u}Jdg?b%?PCt z_jN@9rg~Gs`m?iJ&wr$ahg};tC;96wK_?dUdP3OB($jLzx9|09mTbRd!1_6OL$7%) zV#bh4*gr0x;uL`Ja0g?nA|oRs$Q7>&%){zlUlp9|-3A~OPOkcUXC>laCsl%jgAstS z-n@B(w5USwsgVUGE(Uz-12pCQy$M^r7u+PmUOOh$c2?RSN=j}sFS{43ctO6{aWt+{c8O$6L!qEZ-iBALo3KRgd9!~;e9N<1Ny0JYKav;vIFoFZTI4#f59+&=8ly?(?j zBP(0KbWEOGwl;`j29jt47_*Fq;0so`bV~C`-Zx>A6pe7;$#2HXTZ<<_2p9s;c9Q?& z@JsEdMO6`XmV%+xPkTNOC(_oQtgpG$9&b7Z_LQ5py%O{0Z36GZ33QQuhq^z-V)Crv z*j2Pl0~~Su{QR4JO)t&(7#Tz0+W??e?}XT0p>y}H{+Ew4OZr{*$jG3ft?l{sr%V+4 zPxiV8eVT@b@l%_Jrz6mh`0ku)&HAe(EVf@B^(n?r=KW<#N=rLe-C!Thf8s4JDgv|x zO26@IkS}LeFPuKO*Zut0AYJC_&(Hmgyq9j^(~7hsmHI!Lnwkr{UeM*&j6QTxm8s3h z${Gb-lFr~mnE(EKu(-4iutx_no9UH2q!%5l?b3ey7*Dz2#qsem`!q2_`@0o)ls1QI zSNMVk%O9_TznLSyqyx--m9W8-dohK45AVXNEgV^Mp!~h+B!ukxtUdXY&O?EVOD*uj zRw})10j%Dk5LHR&=#;IkS#ikjHk)um<9Z8;ikNfD+kpf?si4WfhDI~XPp@CSq5v~p ze%!C^N10Q_LrX6`?@TSMSJwZ0H_Fe$lLQP45hf z8qheA_4B>{LuBo?390My}C+uBUtr9(X;BA4#q37gOe%%C^ z2{hpDzx|SB*N8!1Z81Uio2R*RT!8fq*}dCzb+KJBwTbk_KvpUkDswDTPE((K=Mc%& zvt^U^M7v<{Ov*2iiL6S`d%N+du(;R^Y$iY_$AZ{{^o4`j z7)j&(0P@Fsy`&nMF~PFe42v=|vxLT&w_81`bnrt$e{*xQJb=IpeQoXcf<+}I_D5qy zgpHc&>gx5Oac8{3v+|BZH@aM;rCZPh(l{4%IH>rsN|p#JfhPHK>I_-DP6JqkO9uXx}uKtXBTyMt<|3~#6Z+uIPn zIn!eQ{INW-xaGtDyi3;A^&a5Uyup?2wfzS!4Y9Lt3ut=w?k!c5 znxkBn^*dda*W%cJyNSFL*7Ylf{qiO~{lYMw?s0$km@Pjrhvwqwxgn84goV*2Y9>?UY94!(a)bZ znbbm{Af%#tsHR2)b|}^Nk^il?Hv#8zUE7C$C@FKSNXAlWk|c^U50xS*GB#)+LuL^Y zLdH_4WKNQhd7hGlOvx0IBqEe~%y-_cz4yD`cd!5Vz2EyD-?xsvkF|Fhe$VsV&wXF# zaGjT@C#l@A<-NvXT9Ev)f39MuYZ+eKgw8!_(a~=3@gCREC=0s2U<3;;@mWydB_hqz z`=>i?oF|*LDV@L!s8JBL)X_DCVtwqrrh1mnNFI4jVBko(8XoC9b|`fzYDwB41zVp@ z(@}{Y`-1kOYZ6yV7R7mkyu+^)Kfqs%*PQ+p{N%|d3M%La^x5qk_z80Q`kl+0;2~6n zeWzT3`G6umI${Fu)Ypu>K{Kx$EH5ZTN2W+#MBPz|u2(ppK_v}Njotha#=B0WIKWnt zM`mfZUZ=o*2O}dRWf?8)7~FI`2~COmsm@5SF$6%^wsqUSeGl^UCHt1hamy9ph5iKB z$)wYFfWB%kBAtnt@k9X%Qd@&KcM%)lM*Yl_(<7jsnGolrj=u9e^c@3-^ukKn2a67@ zxJPw_1q5#3ijcl_&yAIhtsExE_DmDaf{u@osI_5{Sx}fQ=@=df9+p~i$$wN|4!28v zfW*f)qps7WWx6JG2XYba)l1L&V_&sIe8Fz>4`L)z29^*XU*ExCbH{J-Vd%t#AqpO@ zAmRo5ZeK9=oXMlCAz_4vb@l3(075AG_inm-3%_%=;IO=Hk|B=>i8Qjv?V-i(K^K=< zXYL&U3p`_z;&2FU`bQ?!*;& z0h@lOZPQWk3-F1*#!{-n=6!qJ;b2RS*WB9D2>-PQr0XVgEbh@f9M^E{dZQBYy z-8UWW>`_H~9vU&o>i$X4uWgt71Z|N$gYvm^>k;d65z!T>&iv5~)ff5{AB7JE5NbC# zDN7fpyVXlv7w@&!VS_>?PfqfySN8@<&pmDB(A0)MzSFv9hgnyCR#R#_igr{Qq`?B= zDR?Viqwbd~+^vVzL@ZeFll5f_?f^u9W3_eYvZ<*fyv-|_nWqQs zzgyhhbd+RK?4NwE>FMPa{P5x6o~2GBHeuK8{e69D@br_Q5YWY^UYxm+9_cv#72OtO z(T*052e$s~`j}VV+V2h*E9%z}3-h0Bv75g^2Qe0--cb@<7kQutjY!pSxFIp@Z?Ft| zUzVMn9UenSZ)Fgo%6tL?Eyh)A!-~fvM$ykP1Do7h(eo(qRvM0T>@<8EwX|>v5R;&G z-AJElAVnLp+o1ymFP);Rt83W%o!hpl=H;J7U51AlpA=J+U!X6H58?-52U%w%906F3 znug{^XsA1OJiHJ6lYI{&BkRz3vk!?OSy@?T-Ng}T-U{U2=dPQqmCdL7T4-TBYUw$uDf=@uK$ z;8pV>2OIKB4#%$-7Y_yW?6k;H|Cp04&5Va-V=h)&#QK00UXpuKh+HRYsiAJ{g%PeBQyKp{loU1rdW`+`a;NGQH?X!=|$v zQr+DL4-)S+e$0z2s9P>S@kdd%pP+<97+5x(%38PY-YtibvZ|&Ad=%w{?YHCcw>r*? zvT|`fE1c@QyGRb)_;6BolN*DwE2ZR@Q{O9xsqZ?!P`=v0-V99un@W&QrZMZz!XMO> zn>TNQkR(<>upjR(OiH0MQf9VF-7R$FPG_fn{AgiOeoj8gzi2lj`Dt!=VeW>9*Pygk zN0SYTgkJPhR*&_IhyMvilezn+nsNef;ywfNdmv#c5P50-D2orPs;=E@$*-26nW%1M zwF_(I@bsHLNe2dH(;5ZrJaTe!SlFTn0K&_H^J3H1t-iUrdsC^L!{&?aCLG=9r>FBQ zif1n(#t-Od@}V^LaNNqguMbTLvmk78dgl0$tfsN!Xg%LutC6(!#sa7FuwlXEHlcYHEo;@J zc$w%g2Cn>Frl3?=!0qe@H=@C6HSHXpxGBmYhZD85vT~rDTDpAjkJ3V@k7l8ER_M1n!7Z z3s{8^0L5omzQw0^3|C*JgNn^`rF6@;V81U_Pm(fL&z3@JuJpEsOCDioR$Dv`MK^k8&|i~|8~N!3i!Q!^d5+nDVzg3?hd2)u4`^5o^ME9jV+ zOFn6vpbHAC3wldR-d8TX_MT1O1f``T2L}g7o?90L2L~h3_Ly*@*#RnL6_xR@l7$LW z9lr{B8=H)=K4RH`A)oB{G7CM-cw1gsI+BmHG{R9 zdU}2x!>`Y!2^m>__)ys&B_)l1jg&5afw}v<9quHs5wu1n-mR64j2A$FqJu$b!y9jg zwJ%X$;HqAoO9Sgbfyf0$4NhiJo3BS+zI=%-nCzbBu2eK#qHk>Q`#M2?R!5-*eRMQj z{3mYnP3)gGtp*OP+}uaNLm?#WE8gbH-k&VIymi=x+MxrWp#ivG6kRnG9HU3kb&nze zNlt8RY`rI+G+*9`2iefjK<}=54NvwJntSB!?6R!oOHOs6`l!LxR!EH&dgvxACu_wW zPlU_iJi1GkEnkkXg9@}vBtCy$80*4`|AUt(u+jJgtys3zQ-+L6NcYiq`GHEn<{?q$Dj&HH_At+p&jTpyyw`k zdOvPof~_Ax_=Yr**V6rXY9M(=sHy1dKeA>3%yReeu#${G->(g#mT-oV&xn4rYNrk< z2isP+D*|)Aco26UJh%l?=3}8F_9lW`&|MT#=8ggeZF8ha12PrzJFEK~2vHBx;t~qA z>Z&J2r*Hk@Z9945#4D^W$DW%UsAQ0daGR7@vNZ>1z`F^RXpzV=5=aIzvjX+Z)qxoA znO?r7H*l;M(WX(6T^whUCmM<(nWblM`(LXcWb>Hf$VNY_Zk@hZ%^P zUPE91Eh6^_q9Una3_OzeUcQu%59v8K8V*G!Klbaw^p*`9;=1Y;uFV&qsDTPe`Y+JY zyG&L|X*s%?Ivx8Xxc6Ghu9Ue1b>rl;k@4uMx|$jzXe--w(w8MQSK~TV3=DW+wYdPN zQQ@z-p#>;1eGVn_JhQX2sPMPZ*y3S$-n?1GuP)&HRMVjd3twLhU5p?zFF3{FP+_3; zC`l4Gx{G_}IiPIa zNpEHKPH8x0anVCC(+>eK!!f1F=MmF4VlvXD|MyABOL1xiV1z6bZURI9iy`m zaH4}w@7DBfLa+4pE>71k^%90YQ)vHH9UR1yMP1No;lR;yn9gboXdo&oD%aucdu~0K z-aXpx#1(Sbt}2KxtTKdNpl&mj0^!o6|GWS0Ze6W7@`jk1TW{VbIY)?k?H|-2H>46wr@&Kr!~DqrzMSKL?FH# z&B+JBh=w;Im*67Tx^;x_#NN2jxAS@rw7v8(8Mfrsd=RYCSxR{t2)hVnkF#Fc<+Mye~79Dc02or*o zjvJvJFF)d7gaAs5p9&Ji5pl&K`8!V+KO)o!iuc{lGnOb>b&&oN5D-AY!RU>Hb2rXh z6ec=37Qd6p|CVzAi~kwT&qk0&f%SeO)rV|L4prIo0>WLm-5~EtLzmc|JsO&tz0K*8 zXeAe~Pa{dCs22-C@5|QE{2-e;%&S%P^_x*9qW?7f%a`-Wl>yK28Me(|AC5G7%oZ*0 z)lYWFGPAJQv~y<=RIu@x-XKlXG+<~b_sUAKI7N3fQ zDZX!QWkVk1LU-@aV}vWgcYy->jHca-2){&I>H{zzPR&-Y{e2^xw*S)$uogHa<8t#> z3aA9{igRZ{$&f4~LT%`X@8ACj-1mFahdV*j<1EIS@Dv?JTlPk*ip`N%-DMWPse{Q1 zSZ9%2He_ehUv~k@5upbl1rTZC?fhU;>dbuiQXTZ+EnByq>v?%oR`ux|D(d!P7byZx z?zv2s(lCFrm2|{`c?ypLha*1{1*N;x1YY$awwoR2^V;1Ph3ez?YG3PbL(?b9&3k>& za&hE4!w~v^kU=8@Ru>%(T8Z%A2Z+vysIESY1&Ak*@cg+y*b>Mnw*mucVQ8X0cKUQZ z2*z0eUp%iXA0k{WN_~QY`q2#h7&jJNErFQZw!sKwB*wKCEpg!zSHOTBhwzEhJr9Rn z(V&jDb|n_$K6FijAB5`t6D?{sU*E0;07A)oB6JTY1K1-Z9k>*ifDQz{O{@{km*aDD+lC%nP7G*})FRYs(1#G-l&xoPX(@tYs)sc4 z_E-vyHba4RE{>4*sWE~ufvx0$$XV*^3%z`Kc$!6ZO2ZLG85tShx=UnwdU|A4IZQyb zfxXXYKZ5RN(uLP!38x<3=6xV=UE7r#GiHnY&ZCVV`qjI(wu6WjMeE<=yu1hK!bTP1 zTXC)owOcPE0*+?!kjX3n9KA#w0TE)K5Ec@`%E<|VpAIMmA^M^qX29^M0NOxzr9gO% zZ8Y9%H+b)O4iw2jWh#u>q@=}yb%g6*y2P{|xI2eIwdhz=}X{=ti z?pkAUc{Z=2{m6i6R(?Fy8$MpuZCL4GhUo`A`1$nG90xen-m1+} zW)8D0(PLPynkP@%-P*$;ZwvXg3cra2{?Rim5N_d5gTFTRB&yaN8 zgjC`S58x~CYgyEX?4<-^6a+E=fJpds&`6@74T=h=d;I=ogSr4tVv{|l5{H4c)FWXMN? zQc~gA;HW&xWWj*~RUi90?{quiaC|Io2}$-P`9O9V?PdhIp$LU_5pGPf%FuA)aJeXX zUJ3{cAB8xaARh?|Dn8)j<5P#gi)a`4D$&eKqC@dw0+*!2pn^hJJzJB`s;_vuX!Iv| z%iRD|^78V?{hEDp`TK0K z8&qC}QojJdZ?}uV3<7kl_HrBYoiU!h$<5CGirMuCO-j*}E*TjDQVF#gH22+(W9LV5 zdzrA0E8^`ZVhpWEOzpSY+FI<07A1@Jc=fC5>b^pBeH$ec1mKnN-w@g$+Jsusn*0|DLt+DM)^nryvDfAjCayGZQ$ z7Z|F@)#m9VdzfUZ0{@})9Nw)!LJczuev|xkjClC0A~Sa< zeFTJEb&^`_^koYREm}2)SKn;29YfrIq@pasn?M3=h_=HCIt+>00$?6u``b_)QRb#c z>j{ec1u2;v1Q&`>E1}t)gipg)Ba46?{DJj&3U76f<;=p&ewfaX`kqm4dbeYwP)7aC znNP8Jfqo5FCvB`dsi(KCWKJpQJ^o3QD?qvS`n58WRwdq}#!Unb&EHC|P`Uc-m}T&doE*;5#Hal%a7(J1CLWqMoM{ zPi%#)1=MfYM3PFf78?#1Bclzd=6=Hnga^Zmcelz@ceuoU89>Ant)xCVjo8-Xi6_7n z<2&!ExX=qYd8zWK_L&lyRr~Rt^E313H+kmXmI+c_$q9eSrXG1ZE9tdg022Q<*y(?Z zz5c)de#yQk;TGqR3-%lR`WVVndkx$puMR?8u4@AjDei0>qVYmG_@~RJ%e+5QMsxvSfilQq-O4Oq6v!x3K>k8H>Up&=tF%SinjJX^-IhQ;zmTx-MQ90# zsXJY^Sq{%b{oMxY*I?#eLdX)%e~V(hz0fhERjkNR9cL0knKpu8$Gvl0?*AWZ5egc@ zZ6{!G59TD8p|p(M9)AD6586Bs2TJ=1_3bN=DvgYuvWus z0mKfe!6F$2*QONemEX}GH zjCZW!px}9vLmnv5JriIWR?|f8X{qcSfvTVP@iJczU zMMWdbu$F_Kqd~NEH%bEFH-iV_$UA}NcPvSd>yq%)g-0PFO4in*us))c4h|1jg`W@$ zk5Kk-rJPGUC24naRYRg^$2&>ko`00PriPHGg-s*+2aPQgG3=-Jr>)7_eze;VjR<=m zR=Wlsr%bZQ?riB$nS_1zpTothcU^_#5NZN&(H8>87ULUhX{mq5_05UMp-_XPm zg5*%m;Ke!3A|jc=)8AS)Y>(+z@$Ut;Zmmwr>Tw1r#uk)n#lk_)5T>cDhe~S8_U*5X z#jG&{>L7?qpDTBGchUAb^JMAEs;X9?WdR*s1hPRr#Ck#=)CMsz_JpQG*r5oC1EVi4 z8l}jmtUy$6pyHaI9PI^JN{qE&^?=-<_&iaM3PjbqcW-XFQ-_&2kqBTVfG%_i?ndY7 zg6`oTc93TA9>Mue%&-Ci0(gfxiVV9GhxdkcS&&_vgjn9KdWHW5@9ZR(^GXtB_zqUp zm*wTZJ;1qv|MC@Tynd>$wsx3k&{%MrL_}E7RE3Zj0Exl(rsR<@9S}WZ`}(Oy99pw} zJk&aQQVG;E3S;U|Fvvjs_)*Zk7)a_!yhy2i2Y8wBG_W5luH?ib`-gvz3}iu)Auoz= zPAPk{guyJx?!e`lpZX&ewz;ifnR+x!*B=PKMHP!oV7HhQm zCs#e0n{-gIb-tYM*Qe2~`0AO^yKDZJ_PPI|{Z1c8KEI+m4lpRjcuk_uDyj}aK>V>twSbeW?z8z&FxjdK{i4v0e6fK z+}3sq3S$0a3p5MEGz;sayOOEjDp{N}K_*pLZGmr23Wg2*qYgC4E*#JWID~rxCJn%D zScD)Obta}Ufs01y9uD%Bjdq%eCk~h5NmQ3M0nP&F0mSUgBh zA!5y1N9IVmO3XZf@)TrDk1B$i;|JFi^)&oKS>9oxTJ9<@3n5187BJ zL>)1i5jqPC2y&LA`4Vg{N&-#7SfU(ayY)Q zy&pLEO&wPetFZJTUtpcX&+T{6tcuh4BVyaB`z~!_MVHiKr?zd_ES1W#*Q1}DUb!EIAi2-o3tuHb59f9{ z)jizfhaL#b#4*6jL9%+U&oxB}8@Ehf-49xsnAM1p9qTB5__lQP9wN)YK z|54(?5LKr{Ln8}_fw;(iEDKb-o@o2Z%+rVKm@uTUhhIs^Nt#@JIIsNkO)T$_BvJhC z)ZEF~Np-C5ocE{Wk8jZq!#iiM`Tz)UbO7w>rn`x? zR!C0!cZRpnxE-_xxFD=mb@&HRE}IK;V5*mH@{{!R)iWhe#-=RJnu~|$!3_n?9E~M~ zqa$RsMZlcjw5b96NxD?`5C(<JFC*eM^yl_0)3DY; zfS1*P;drlrcZThQGCxuhGiVmkSpa*95$r^;jk4nG2EzHEpAFgH*yI5zYGFtqqjzBQ zaoUlCBN(G&1MF+|mt-j+ zVN-+}DHr`=wFQHhwN3=j6O0~$b1!_Th}0)hYB9$XNh-Bg(qwE+q_oRJ++TRS>`m6$ z8IliJ_~fRyw?jwnjmR&ZdV2F?TN$qFHwxr@TLZJBi{u&LRH8@iLGM{vAu2awctdem z4%bA7bJ5>Wg2p-fF=9w90R|H$(E4QRow1m?VeMz@JR~db&grsW2VNb%B_NocbPOD% zN95l;A(lVRc!%x0J_NgTd=~sfZ!Q^$;NZ`|jwE z6PddH(%YcylX6aklgwhp;fK=^G7>ao?M$M6fN#yepzn$A&dXaHUaRctTC6_OYn6yf z6vR%LGhZO_e#3ln7o#gYpn%fsF!Cdz!Pw=9m9ro^Tb|B1Z|FtpXoTjmV?W$#FJ8-v z>zlLXxHTY!&M+)C|FJjY2rxIWnmz~uHHR^O;-89iZ8Bnsf!gXbkKU~H=Q(sl!=IHUQOhz?-MvESn{Fyhx6uhk>= zUf6d59xtF8uf7Uh=)Y*AJfWLCb45u3b2f);B@FC~q4E7u>d}<|+Ja zltu-K%Gw|!2Q;^C-HIv^UX$qKi6l=R#~k1uDq$CA==*tRUsAvt}*1;J09HvB>+7X8Zl5D zTE)A6bjPsP$Do#LjmUF6k*Drc zb$-mr_$*$Hu~Ae$Y9X5y9ZVQYhHv_RTqBIZS_2+15deS0fhk9S-8N=9dS>R)78a{w zn-#YsrM|}Em}&K*H#UheHZyyS(-cQQ7*14@gNp?Wh~#nCZutfE~HeC@_F@FJ0lig+&lJz&_u?ZK;ytr`)+TXL#`(4sIA-GWbpU|uvL z57YYFKnXgnfyWRsuAqE{kpqKGC#>M@h9U(x0L$mH6)O-f3?sp?bY4rC?oJuIz1(CY z1AGLHg7e%!*TMnTA{Y<0?O;c!@NyWy^BQ%AT=rlEL1Q4(DM75k)-4Y%4$yt@#J>N) zuP`}S$*JxdA z%Qg=eUFuxtPy{`g2qH-S@j{(r|GkYk9V87}&=X&=Fgvc3cJ8M2x+T8@qy2|#*kZR$ zem&E8cm%BTz`dHHy9q2WuYXaCB(QHr>(2j_3zl;9l~zw^g1ZQJierD!K4pCZwO@Q~qVD;V)PA3Y~63}QvU=j*DtWgLHQDHkg zSqu*0CD;uC0CXqt3z%aR?kKboO3;4MK@mt0ivsK%K7vm`z{c&{pQ{c+H$z>8(`e(V z%P)H7IGaBz-w3fFS3BHQtS>wmJ!wy)nhb zkszqy<~V>`wX*attzvU%h4JsQxCFUbx>KQ>7q4CQeLr$fBP8wGhj20Qqp@*u4VH5` znVOdo+>T5K>pav2+R`+?pzPz|0YENkQJ`zwh1sHD6ZK|Y=9Kk_qX^~}0R=A>PR@Zn z_2)$!8yaM-t5XtE3_X#`gx)$D2u*;~2r9X@nD`82qvp?4V&j4wmRnC+Udev^4 z*RQ7y*-Bz(!0C%UtTmrb;KNt@0zf?Y#Y-Z0&)L!wqKWjF1FgbJL@KunkyYn0E7cpe zQLH;?ai~J?z(^1OQc(*|VXXNlXd8#2IfU3fw`e|jfglI*nh2?T$&#^Umz|*{0 zMC3M}5Q_Q5kIS|})k0QuQu8^e+c!S{YPdw>Wth4dO~K&ySHr1`ODd#RhPHu^L$p)$ zv*BdRMOp~)PUXR}hTF3@qK>}BG^Yc6_(lu}t#xB%VJSt;MrH#f3^|R+%2<8-7oKvN zia({P+0;ixqx*5GB}o;3vA9M=*TY^`)=k?q9NOX7^r=MYbs~UrWJWA%3xK&F5VyB& zK4xrEhN2LG$DZ&-ftwC!H+vEtO)*}{4@$&5r64;y6i7aM-%d;`$#9o%3Lf>;*iJmuTbk~)q^w5o>9j?9i_xp@&B6kT z{WIgIhBK&)5VwraK=KY5WC5Ch!ewhXu9=qJ-)prVFYcGVzQ(pTy3A#_r>MQu5=^I6 zwP|odFi>9-RseU1Mu+e-2cH#DOm_vaJ&6XSCV+8C{P9@Wy?dpXvq*OW@JLy_YS<6h zvtD0(@VGeEMqJ33+Pj>U-nZOtLyYC#*c+Q9!#A@wo)USiY>?5uU~FjkarCnRXY5r} z<|J08-3;r#9E6xx*AZ+bkO|#czi}Y(=Vgxw^$iM2_!AE*J$wc(p48HkUPHIcaGhDn z%63J0HdPT$nB7#&s>T7Kmt8jb;^4~gohmp_R4Zy#oBn#s5E+IOhLgqoaAY@vD5ltOYO9*t+=;E zQ^aoYJ?j>m%4+-Uzv z8%%_P>j)Sw?HD4eYS;Hza!N-rqlN8}Vt~(UZd!(i$JXDW6E-aLIU|C>Y5r~NjhVcS z6ct`IJ4uvJjM$Kr31J`OBj<2cDjMt{h)es&kxM`in3z`45KCnwsN$oz6nbIporBBF z&COw)pj$@0;W+L3*sEvoJ=<95;AdKe0e}`cWc)&`kUWd0^w|xDvE}LtF)U6_P7NPF zGL>`(q2y^DTFn};3?JzS`Qx^>H)o?26}NsCISCTvIL=RyzKMTM%so;0d(iGPqf&nS zUGuIp$ep+|_-7cI9RnwT+GEK-!^n6pjXk#7xm&4JBHjOuJ>3f*$@|L~CnRfqjx6U5 z6dGXKGVuLYblK*Z&ZYoW^O#)2Fdy2@bkukd%j9w|?uflQR5W!=h+W>nK|(&}=X74F zn_O>;ZGum1`=R@vS*2(_k9YbUCKkP^V$LA>Zazv3%=g6+>B9)#Ps6=DtyQ z+x}u+XWL?$tl9%s`I4-Rh0i}lbZnzzaa6g_xpBi7(AxXc$`D&3=&z4M3S z`Q^t2-FdgT%Zf0l1hei-RKC~j&{Lw8Be33PpMC7rCSx%yTfk0?7IWu+MeU`PbW595r;Or_K69b`fzFM-+Y5X~IWC;D2wbZy$LwL~oy^5(C^LBT?L&t3 z%`gQa00->H%1w7y#tM;}fJ`jAl3LcXGc5QI-WtsFhB$}2XtgCgRtQB0gqXB5tjQWw zZU76r4DQCPt5&1+=xITn!}wE}q0w^xi#Ip)5;|^MNNm{CPM1_g(P&UeZIVw4P)|_P zp>mzppt0w9u5xYqQ;E2wJ1h5MIwR&>_+4y^ZZ$cxCi4Yd>1=Aj$(`M&Y(cc3W%lLJ z{~xjE9N z?g)$stx&_l%Bjta$rN|vx+209&#gy#ZLlQ~_}!=!v#SmE$}ljxk2{ z!$eIXPL3=;PBupNMn3t*uXj^YgqL|3joaMV!`Vt&U?6}q!iQFd8W=j_QKRwcmYZ}5KFcal+%X~AI=)Apukk)Sum1Mzgaz! z+x9fj0?Fy_=>8@CwLU5cXWqeJTg}#@IbP&F+`z@ZZ|+)Hs``mufY%R|aR@c0+Xelc zS0@@(ej@o>HuM7N$Hvf;mBN#+?p@&cRGrD+zJ4L@tNaS{N7vlFH>@)J6)h~@`TgS3 zLR5*EEc?U@9mOw4v-z8ZUuAX1m7$~HCq!75)WWeEhu(>3=Zo3ZoJHnu&gzb({ zYYQDEi|eRwxLxj#L}ddu^n_G*^D;R%NSSD#CU+^x~xb^nj_maOh zb$&al!R}dp7R68D)Q8`F^f$=!AtPGcwq-G&cAeeG#J!h7AqWhe4a?7Cri-T!fP-5Bs}0Uv?ss{_aUp<#F_a$&lHwxx4-(Zgs?oD(L7TxJ`2tx^%!9`Q zc7_%!ufa|Pd(sxowJy~>zu=>dmcG6}LIv3|gQXm-9pp`7mFl^%g4Ydmd->^LMnCcV z_4(-53z<9SDt84sdKOL4>G>W9>vDHl;ELWemnQ$I@ah*|V3H!Q-aYLEe z`|^;pzSnzH?u?9BfQ{N9BU92n40)WWYd>K@1-Hn9@sYQR>LHs$AYmjUz|fORMmx`Q z7oZcU5C~zWO5N2RA{B|?<9oqPx=sWS$)h2g+<1(rItx{EaijpI6R-m$YJ<$EMnCR^ zK!ho79DYF=R;e#};XYURd3-ECMn>7d@lb&=rUbLPmM<5Xv9U+cQ7la95Fx$FdrFOh z4tU|0Gn0{!@HsJPu#>1Z{b{?kh;6koJE3fvG=yEXSC*QcfvGTz6%=sa;X6YB5ryb<6t&0tOdZAW$ zF}tOuh3eWs_z`Vt?Fo(nSl!nQJ=WIHxB=QPGbbkw7B>XAxda}7b5~eD7q3GQ7Q`7S zri+FfaQ>h*r2@u1)>Su;ojeH}o(GC}!;DlEx43RA%(+2L8jULiS1e(d64UANfwsU< zPj4L=5ro_qphQ^>cC;g`My-e99xL3f(YSDANK_XuW!vrgID^h!;s!g-*23`_44AoC7adBx%KsqN;Z|Xc5l}W=%ey* zidbVm-nPKMmPw9<);TpKEUXuNAu&fGDZm>!8bU2pwy2~}6*=tzWBOccXwTwaCuRk- z3@O74HQ}_lXS8X6*%!_|&+iojI{ZllV@+7}~^cgqtAR8Ya&E}d z#fe{OPruIF2?o5UHv3uX))*8R$V4m|=tPoeHp%!4jO3PHvpHhr{fkmNs@x<)QihJq zU1I)O_o*$CYerdT`xm|Sp)Z(UQ^STYYbf!id;mi6>dx{C%D;7%gwQllOJU-5t-e zzI_b7aD!S_i#^l+sQ*QAQI8tD`aicL8w3`G}r>K)}fo-qu%^< zK+))pdx@SNl$w~a4aFYjO(+zY&0dM@njh_#qAIc{Cni7@qM>I!`zi<_%Mgi!zxRfa zsK9*S{U}F1lD*Mbg|CPA7OC7X;G%7tTDPzD%yh%Mckbu|fMn1K)D4@RbyV-QZW_yY z8AUZUCNpupk~nU!u}22AJ(ft#>wOsic7>CHGTWixb6JdQ{G3L$|AMzS++s6l{Dfr( zs-PTQ-z2K^?BM%ESWYVumy?DFI8S*2$OzfpM(en^02oNIgcdx+`Sr>yjmzxw+@p3p znU?+QrZS;{nAVC*hkqn(S@lE1(Qj-2+^CY~?LL;qKkoeq%h>VMjN3(%Cg}p!7jj%z zj^y?8zD2$-a6QH+OUygF2^-|IlOBp^&*b4rhNF?h(2{2f#;FaVHem3O_VNO@&`$df zb28l=;00YQuvn0k5IA$rHa|N_hUbx27SS`6t}B(hqhgNH0fGKWZy6Qt?a;brw3v}IpLfvhb#9O2G?n@ z&$}2XYs!epvE06QZyAs@R#)g6yN{{xQfv@?rl67X_RE$-$G>Os?eLOpY`HCctM=k} z9Ay2Hb*^bX?i(5+^IZX-*kyGP}a`z zJa&pV?Lz(Nqv6t$ltuQW4r7mm%e!bJ)VUQ7rZx!9&0=_607d{6a2Vx>V^xTQ8&&YE-*{=IBH5HJ0ov1CUPb(EDla zPVuhDl@V$*8f;4yb(BxHvhv(wKgmd&aE|TbstvLH**3`S3G!z7MsCR_&%qian+ip) zD4=SRkfz9CbSl4~0RA&i1lK6UHS%Mysc&rOkJw9qcd!*-c3$Ne^3i1{M32`;0yM6- zRo#6Zke)C6_N|CO`6it7h7YvY*EK)jVzlgd%l@`5{j;;e<_`s_-BmlJnmw2D_A!TB z)XSaw_g~RxUn!Te92F#mf8U2J-5ogOKrI9G?lVp}0W1Yc-C(!-X2aN? z_1sM5{o{&VDO;8>jN2c;=<~#Z;D6LA6#R zibitRu1P_B!pv;tI86OkMxxGhEmJccTb)o?pV4N9%y~jxflUi+ljLu_c*i&w1szY; z_-TecXI|X$d>xV!N%yN&YR}d47nsGjAMtK}>>b@Im)Z<$JNo=8Z3J!7s&_A*@h8{! z`cexWi+%$}q;W^pz(DAa(+ONZ`J(jY&wI}Kvm8AE+6ci-is0asm6gp{#i08EK6}=N zwinQtj7oFx23^vByYLoFgqot(kLxm1pWbjJ&x}OeO|$f3jE$b}ciPA$>oL=M`IY-k z>-Zx*KK|f9N(_w4`2r1I-mHncq%YNYH9=?ff;T9}Uav{_ zKPc#)oelmpQe#hdh2<^~3wAx$6shUcvY`sER%@^Ns&@3HU^v~Sbjsamzxj0IRc_!| zuBgx*9TvFPoE`W09kcpS8@IKx7_Z{yZEQ-c_60mJ8G(6o=hxqDWU^n;JIYI5U}9n- zx~Pc9wS=$i)6CG9T3k^iFinn3iGPj^pFzzbHjU5ZYtquJjxf{k4DV(BpAlaF;K_D7 z246m}qs-3&I{B6`h)K`0BAkfQjc#HzxiP_7?k4vPuiEhNFd;EE-nr!?R2*v>j?$7J zU|x54z~nyXfsHY{cCZkiD|XM_nBx$@5}?ec=jxi7{HmIKzo5zcll82uN7*GKm{3(T zRt$Jhd7LPJNWVVz6|9$lAAkN4;<)~vvD>6yN<#Wbf5X{P%v?~U3Ady&LM4n`gz}Hx z_&!?k$G7MiXv>p9ps)LEa9;?R8|E4#Z0#icE45%0`;sLbXFVXd6+XB^j>_#CX`4c7 z6~C0!I!H2Ul_?)LN80}j#2=8R{dX0d^RzX`QJ}@7|3S3m%I17?#)y zwi}~0>xeyu!BZfX9o`BR>D0YlG{vA7dFE}&UeiXUmv?}&mi?{7$YF)y4BUGJ(6-@>YjNmaZd9X1XeO$38S~=Ra91>jzOyTYAO2{ z!xG@yh{<=RDeBiUKsJCml#vV$A0016EdmC3A#gAj?>7n?I12sDlb${$?JplXIy8>BTqp6ILyFJD^x4^sV|U8$CBj!4Elb;J^$z)GTMm zE9~|zk0HJQ64MZ2mO{Y`;Du&YaHha_(t8+-`VINa=4%FvV7I68$MS`@TM5;%(uiiiyC9C6Q>mGSNq6n`if-^t444KqF&{|z{EFxWFa zT@(#}t3Zr`E`iGB$0O4=^$W<4Ojv-5&*a_va2Steuj7~?k!WEFgMpR=Tg<>0;bp6i z)54vfA76~p52j(b_Z0x1DbWcDD=uc_b@Pk0r7fbNfIt~|tl1usEN|#~s2agvkn!%w z3Xa&1&0SczSy7L~RghO1%ec+xhAah(cQc61A82lhiH)TuZExt-y8~?yAH2;hyX{y@ zS@zCS9`!Si-3kU;`9o8=<8k@Dfpo%#*@USYIR%&W+h+3Pv=5LF1wAFi}2qp7F zo<4v63e+JSiJou?066qw50O~>U=_OqXAhS-AXMURR5q?+J9mycll1X^C9J&lKbww;GyGDtio9M8*bQr=zRmi=4aQaD+g)!L-Pdg4zUK1p%jfu z8`j6J^rAB2{yD#R73pkj1`H6b#P1NzYVL0}tA9ydC)h@nzWVq)y^iv9wTmJcdT$~~Y|7bL+F7FXB#mE5LF1#lWzdB1)> zur(DAJm#2>fQOIqGB5#XRe_~bE@9ofx%drU__=W?{IYa^e>kq?01>#f|Bk-)uh06I zLtb^@NF)#n`zir$rp@U@j_dU`Oa%~cxXh*n%mJQs8XazNY4>-o;QKALH%E z*_UJ68yFe!YBWC5#1Nce)d&z>`HX*r5B2Cp@5rbS$E^%dP2aAN+PXQDUS3|x(fZI8Z1X>F#T~@QI{05C!N32=Cwdg`?IoE(#G-&L z_htV$vVPb}!f(RJ=Jh8<&afPng_cUDhZFi7tp6HRdP`$Fm#7Q6m{MEA2R^el?u9}q zMg@opA?-7cE(I*7`u=hlSh+fit$LMVxZvNtn+*UJQIbk_c6$ibjBc17PYVP*i*BVZ4qa<;30G-b5JOMOT2Ed(Nq+B_WKg?t5S=mNRYPI>BT{9 zGA|Ra8GDD}e`PQ!Da#-jGr%lNAqFsPEO@NI&z|5bNm3BqO?g5+Aq)%Y4s6yziuX>L ztrvJ0{p;6sNnBweH`#8GVo3Za3z(nci7(7FX?lSKChT3Ol3Us?`|sGX1KpaXIH|3W zDcc8lMG1DGa~8LKR{K(U7*pRBTuDNCe@*3-^dL5OA6N@= z)oMMBqfo-HTVw5 z^9Tu~npt!;&T^626uT%wiZUF)Fnmx`oTd4|YFk)Xthcz~qr8@uA$Fy4Rq)1{9_H&l z5b?_|W}L;ac+Bch1hD}?x=cq`8}NB<6s0!C8j2(i0YoFh(I3b-j6L2B;^BNS@y~bt@Uy!aD>N`Ti14tJL-+9Z z+lHXXYA!L|_OC6KFZ{pzV*Y1|e>Il~yV9XAeb@|MCo5jB+_e1+=#hiL_ny|UVGl43 z79=~GFTd5D7j6P{)PVWmg!pT$V}0dN(57I_wJg8e$jFFi%51#)`8QTC527L9uTau}{A{Eui(hibN$jCO@+B^bl}TkjUjB+Q zRAhfUxxU1RZHzUcq^GvY7%?*C8UmcTa{2m&yuB7+~- g_}}{{?!(dwk7-HnNrsX}3jR5yq^6i6f5!d)0>)j5Bme*a literal 41405 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 n+v#@fdhi$j0mNin%+}!l`<^HBiH{v-) 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 Z9`~xRI{l|!AKoWLU&m1Uk*0O<{{l`sXHozF diff --git a/xmrigui.py b/xmrigui.py index bc224a6..4c6a763 100644 --- a/xmrigui.py +++ b/xmrigui.py @@ -43,9 +43,13 @@ def args_manager(self, args): if arg == '--open': open_window = True if stop: - self.window.mine_switch.set_active(False) + self.window.mine_switch0.set_active(False) + self.window.mine_switch1.set_active(False) + self.window.mine_switch2.set_active(False) elif start: - self.window.mine_switch.set_active(True) + self.window.mine_switch0.set_active(True) + self.window.mine_switch1.set_active(True) + self.window.mine_switch2.set_active(True) if close_window: self.window.hide() elif open_window: self.window.draw(update=False) @@ -67,14 +71,16 @@ def call_instance(): exit(-1) -class XMRiGUI(Gtk.Window): +class Window(Gtk.Window): def __init__(self): super().__init__() self.load_data() self.config = self.get_config() self.draw() - self.stop_mining(save=False) - if self.config['mine']: self.start_mining(save=False) + self.stop_mining('profile-0', restart=False, save=False) + if self.config['profile-0']['mine']: self.start_mining('profile-0', save=False) + if self.config['profile-1']['mine']: self.start_mining('profile-1', save=False) + if self.config['profile-2']['mine']: self.start_mining('profile-2', save=False) def get_config(self): try: @@ -82,7 +88,7 @@ def get_config(self): try: with open(self.settings_path, 'r') as f: config = json.loads(f.read()) - test = config['default_args'] + test = config['profile-2'] return config except: with open(self.settings_path, 'w') as f: @@ -93,52 +99,91 @@ def get_config(self): with open(self.settings_path, 'w') as f: f.write(self.raw_config) return json.loads(self.raw_config) - def start_mining(self, save=True): + def start_mining(self, profile, save=True): if save: - self.config['mine'] = True + self.config[profile]['mine'] = True self.save('switch', restart=False) - + args = '' - if not self.config['default_args']: - args += f' --algo={self.algos[self.config["coin"]]}' - args += f' --url={self.config["pool"]}' - args += f' --user={self.config["user"]}' - args += f' --pass={self.config["password"]}' - args += f' --donate-level={self.config["donate"]}' - if self.config['threads'] != '0': args += f' --threads={self.config["threads"]}' - if self.config['cuda']: args += f' --cuda --cuda-loader={self.cuda_plugin_path}' - if self.config['opencl']: args += ' --opencl' - if not self.config['cpu']: args += ' --no-cpu' - if self.config['args']: args += f' {self.config["args"]}' + if not self.config[profile]['default_args']: + args += f' --algo={self.algos[self.config[profile]["coin"]]}' + args += f' --url={self.config[profile]["pool"]}' + args += f' --user={self.config[profile]["user"]}' + args += f' --pass={self.config[profile]["password"]}' + args += f' --donate-level={self.config[profile]["donate"]}' + if self.config[profile]['threads'] != '0': args += f' --threads={self.config[profile]["threads"]}' + if self.config[profile]['cuda']: args += f' --cuda --cuda-loader={self.cuda_plugin_path}' + if self.config[profile]['opencl']: args += ' --opencl' + if not self.config[profile]['cpu']: args += ' --no-cpu' + if self.config[profile]['args']: args += f' {self.config["args"]}' os.system(self.xmrig_path + ' --background' + args) - def stop_mining(self, save=True): + def stop_mining(self, profile, restart=True, save=True): + os.system('killall xmrig') + + if restart: + if profile == 'profile-0' and self.config['profile-1']['mine']: self.start_mining('profile-1', save=False) + if profile == 'profile-0' and self.config['profile-2']['mine']: self.start_mining('profile-2', save=False) + if profile == 'profile-1' and self.config['profile-0']['mine']: self.start_mining('profile-0', save=False) + if profile == 'profile-1' and self.config['profile-2']['mine']: self.start_mining('profile-2', save=False) + if profile == 'profile-2' and self.config['profile-0']['mine']: self.start_mining('profile-0', save=False) + if profile == 'profile-2' and self.config['profile-1']['mine']: self.start_mining('profile-1', save=False) + if save: - self.config['mine'] = False + self.config[profile]['mine'] = False self.save('switch', restart=False) - os.system('killall xmrig') - def save(self, widget=None, restart=True): - self.config['pool'] = self.pool_entry.get_text() - self.config['user'] = self.user_entry.get_text() - self.config['password'] = self.pass_entry.get_text() - self.config['donate'] = self.donate_entry.get_text() - self.config['threads'] = self.threads_entry.get_text() - self.config['cuda'] = self.cuda_switch.get_active() - self.config['opencl'] = self.opencl_switch.get_active() - self.config['cpu'] = self.cpu_switch.get_active() + def save(self, profile=None, widget=None, restart=True): + self.config['profile-0']['pool'] = self.pool_entry0.get_text() + self.config['profile-0']['user'] = self.user_entry0.get_text() + self.config['profile-0']['password'] = self.pass_entry0.get_text() + self.config['profile-0']['donate'] = self.donate_entry0.get_text() + self.config['profile-0']['threads'] = self.threads_entry0.get_text() + self.config['profile-0']['cuda'] = self.cuda_switch0.get_active() + self.config['profile-0']['opencl'] = self.opencl_switch0.get_active() + self.config['profile-0']['cpu'] = self.cpu_switch0.get_active() + try: + if profile == 'profile-0': self.config['profile-0']['coin'] = widget.get_active() + except: pass + self.config['profile-0']['args'] = self.args_entry0.get_text() + self.config['profile-0']['default_args'] = self.default_args_switch0.get_active() + + self.config['profile-1']['pool'] = self.pool_entry1.get_text() + self.config['profile-1']['user'] = self.user_entry1.get_text() + self.config['profile-1']['password'] = self.pass_entry1.get_text() + self.config['profile-1']['donate'] = self.donate_entry1.get_text() + self.config['profile-1']['threads'] = self.threads_entry1.get_text() + self.config['profile-1']['cuda'] = self.cuda_switch1.get_active() + self.config['profile-1']['opencl'] = self.opencl_switch1.get_active() + self.config['profile-1']['cpu'] = self.cpu_switch1.get_active() + try: + if profile == 'profile-1': self.config['profile-1']['coin'] = widget.get_active() + except: pass + self.config['profile-1']['args'] = self.args_entry1.get_text() + self.config['profile-1']['default_args'] = self.default_args_switch1.get_active() + + self.config['profile-2']['pool'] = self.pool_entry2.get_text() + self.config['profile-2']['user'] = self.user_entry2.get_text() + self.config['profile-2']['password'] = self.pass_entry2.get_text() + self.config['profile-2']['donate'] = self.donate_entry2.get_text() + self.config['profile-2']['threads'] = self.threads_entry2.get_text() + self.config['profile-2']['cuda'] = self.cuda_switch2.get_active() + self.config['profile-2']['opencl'] = self.opencl_switch2.get_active() + self.config['profile-2']['cpu'] = self.cpu_switch2.get_active() try: - self.config['coin'] = widget.get_active() + if profile == 'profile-2': self.config['profile-2']['coin'] = widget.get_active() except: pass - self.config['args'] = self.args_entry.get_text() - self.config['default_args'] = self.default_args_switch.get_active() + self.config['profile-2']['args'] = self.args_entry2.get_text() + self.config['profile-2']['default_args'] = self.default_args_switch2.get_active() with open(self.settings_path, 'w') as f: f.write(json.dumps(self.config)) - if restart and self.config['mine']: - self.stop_mining(save=False) - self.start_mining(save=False) + if restart: + for profile in ['profile-0', 'profile-1', 'profile-2']: + if self.config[profile]['mine']: + self.stop_mining(profile, save=False) + self.start_mining(profile, save=False) def close(self, widget): self.hide() @@ -150,170 +195,525 @@ def draw(self, update=True): self.set_icon(self.icon) self.set_border_width(20) - self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=30) + self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=20) self.add(self.box) + + + + self.box0 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=30) + self.main_box0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=20) + + self.pixbuf0 = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename=self.icon_path, width=128, height=128, preserve_aspect_ratio=True) + self.image0 = Gtk.Image.new_from_pixbuf(self.pixbuf0) + self.name0 = Gtk.Label() + self.name0.set_markup('XMRiGUI\nmade by LinuxHeki\nSource code') + self.mine_box0 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) + self.mine_label0 = Gtk.Label() + self.mine_label0.set_markup('Mine') + self.mine_switch0 = Gtk.Switch() + self.mine_switch0.set_active(self.config['profile-0']['mine']) + self.mine_switch0.connect('state-set', self.on_mine_switch0) + self.mine_switch0.props.valign = Gtk.Align.CENTER + + self.mine_box0.pack_start(self.mine_label0, True, True, 0) + self.mine_box0.pack_start(self.mine_switch0, True, True, 0) + self.main_box0.pack_start(self.image0, True, True, 0) + self.main_box0.pack_start(self.name0, True, True, 0) + self.main_box0.pack_start(self.mine_box0, True, True, 8) + + + self.settings0 = Gtk.Grid(column_homogeneous=True, column_spacing=10, row_spacing=10) + + self.pool_box0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.pool_label0 = Gtk.Label(label='Pool:') + self.pool_entry0 = Gtk.Entry() + self.pool_entry0.set_text(self.config['profile-0']['pool']) + self.pool_box0.pack_start(self.pool_label0, True, True, 0) + self.pool_box0.pack_start(self.pool_entry0, True, True, 0) + + self.user_box0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.user_label0 = Gtk.Label(label='User:') + self.user_entry0 = Gtk.Entry() + self.user_entry0.set_text(self.config['profile-0']['user']) + self.user_box0.pack_start(self.user_label0, True, True, 0) + self.user_box0.pack_start(self.user_entry0, True, True, 0) + + self.pass_box0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.pass_label0 = Gtk.Label(label='Password:') + self.pass_entry0 = Gtk.Entry() + self.pass_entry0.set_text(self.config['profile-0']['password']) + self.pass_box0.pack_start(self.pass_label0, True, True, 0) + self.pass_box0.pack_start(self.pass_entry0, True, True, 0) + + self.donate_box0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.donate_label0 = Gtk.Label(label='Donate:') + self.donate_entry0 = Gtk.Entry() + self.donate_entry0.set_text(self.config['profile-0']['donate']) + self.donate_box0.pack_start(self.donate_label0, True, True, 0) + self.donate_box0.pack_start(self.donate_entry0, True, True, 0) + + self.threads_box0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.threads_label0 = Gtk.Label(label='Threads:') + self.threads_entry0 = Gtk.Entry() + self.threads_entry0.set_text(self.config['profile-0']['threads']) + self.threads_box0.pack_start(self.threads_label0, True, True, 0) + self.threads_box0.pack_start(self.threads_entry0, True, True, 0) + + self.save_button0 = Gtk.Button(label='Save') + self.save_button0.connect('clicked', self.on_save0) + + self.settings0.attach(self.pool_box0, 0,0,1,1) + self.settings0.attach(self.user_box0, 0,1,1,1) + self.settings0.attach(self.pass_box0, 0,2,1,1) + self.settings0.attach(self.donate_box0, 1,0,1,1) + self.settings0.attach(self.threads_box0, 1,1,1,1) + self.settings0.attach(self.save_button0, 1,2,1,1) + + self.advanched_settings0 = Gtk.Expander(label='Advanched options') + self.advanched_box0 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) + self.advanched_grid0 = Gtk.Grid(column_homogeneous=True, row_spacing=10) + + self.cuda_box0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) + self.cuda_label0 = Gtk.Label(label='NVidia GPU') + self.cuda_switch0 = Gtk.Switch() + self.cuda_switch0.set_active(self.config['profile-0']['cuda']) + self.cuda_switch0.connect('state-set', self.on_cuda_switch0) + self.cuda_box0.pack_start(self.cuda_label0, True, True, 0) + self.cuda_box0.pack_start(self.cuda_switch0, True, False, 0) + + self.opencl_box0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.opencl_label0 = Gtk.Label(label='AMD GPU') + self.opencl_switch0 = Gtk.Switch() + self.opencl_switch0.set_active(self.config['profile-0']['opencl']) + self.opencl_switch0.connect('state-set', self.on_opencl_switch0) + self.opencl_box0.pack_start(self.opencl_label0, True, True, 0) + self.opencl_box0.pack_start(self.opencl_switch0, True, False, 0) + + self.cpu_box0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.cpu_label0 = Gtk.Label(label='CPU') + self.cpu_switch0 = Gtk.Switch() + self.cpu_switch0.set_active(self.config['profile-0']['cpu']) + self.cpu_switch0.connect('state-set', self.on_cpu_switch0) + self.cpu_box0.pack_start(self.cpu_label0, True, True, 0) + self.cpu_box0.pack_start(self.cpu_switch0, True, False, 0) + + self.crypto_chooser0 = Gtk.ComboBoxText() + self.crypto_chooser0.set_entry_text_column(0) + for crypto in self.cryptos: self.crypto_chooser0.append_text(crypto) + if update: self.crypto_chooser0.set_active(self.config['profile-0']['coin']) + else: self.crypto_chooser0.set_active(self.config['profile-0']['coin']) + self.crypto_chooser0.connect('changed', self.on_crypto0) + + self.default_args_box0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.default_args_label0 = Gtk.Label(label='Disable default args') + self.default_args_switch0 = Gtk.Switch() + self.default_args_switch0.set_active(self.config['profile-0']['default_args']) + self.default_args_switch0.connect('state-set', self.on_args_switch0) + self.default_args_box0.pack_start(self.default_args_label0, True, False, 0) + self.default_args_box0.pack_start(self.default_args_switch0, True, False, 0) + + self.args_box0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.args_label0 = Gtk.Label(label='Additional args:') + self.args_entry0 = Gtk.Entry() + self.args_entry0.set_text(self.config['profile-0']['args']) + self.args_box0.pack_start(self.args_label0, False, True, 5) + self.args_box0.pack_start(self.args_entry0, True, True, 5) + + self.advanched_save_button0 = Gtk.Button(label='Save') + self.advanched_save_button0.connect('clicked', self.on_advanched_save0) + + self.advanched_grid0.attach(self.cuda_box0, 0,0,1,2) + self.advanched_grid0.attach(self.opencl_box0, 0,2,1,2) + self.advanched_grid0.attach(self.cpu_box0, 0,4,1,2) + self.advanched_grid0.attach(self.crypto_chooser0, 1,0,1,3) + self.advanched_grid0.attach(self.default_args_box0, 1,4,1,2) + self.advanched_grid0.attach(self.args_box0, 0,6,2,1) + self.advanched_grid0.attach(self.advanched_save_button0, 0,7,2,1) + self.advanched_box0.pack_start(self.advanched_grid0, True, True, 15) + self.advanched_settings0.add(self.advanched_box0) + + self.box0.pack_start(self.main_box0, True, True, 0) + self.box0.pack_start(self.settings0, True, True, 0) + self.box0.pack_start(self.advanched_settings0, True, True, 0) - self.main_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=20) - self.pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename=self.icon_path, width=128, height=128, preserve_aspect_ratio=True) - self.image = Gtk.Image.new_from_pixbuf(self.pixbuf) - self.name = Gtk.Label() - self.name.set_markup('XMRiGUI\nmade by LinuxHeki\nSource code') + + self.box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=30) + self.main_box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=20) + + self.pixbuf1 = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename=self.icon_path, width=128, height=128, preserve_aspect_ratio=True) + self.image1 = Gtk.Image.new_from_pixbuf(self.pixbuf1) + self.name1 = Gtk.Label() + self.name1.set_markup('XMRiGUI\nmade by LinuxHeki\nSource code') - self.mine_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) - self.mine_label = Gtk.Label() - self.mine_label.set_markup('Mine') - self.mine_switch = Gtk.Switch() - self.mine_switch.set_active(self.config['mine']) - self.mine_switch.connect('state-set', self.on_mine_switch) - self.mine_switch.props.valign = Gtk.Align.CENTER + self.mine_box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) + self.mine_label1 = Gtk.Label() + self.mine_label1.set_markup('Mine') + self.mine_switch1 = Gtk.Switch() + self.mine_switch1.set_active(self.config['profile-1']['mine']) + self.mine_switch1.connect('state-set', self.on_mine_switch1) + self.mine_switch1.props.valign = Gtk.Align.CENTER - self.mine_box.pack_start(self.mine_label, True, True, 0) - self.mine_box.pack_start(self.mine_switch, True, True, 0) - self.main_box.pack_start(self.image, True, True, 0) - self.main_box.pack_start(self.name, True, True, 0) - self.main_box.pack_start(self.mine_box, True, True, 8) + self.mine_box1.pack_start(self.mine_label1, True, True, 0) + self.mine_box1.pack_start(self.mine_switch1, True, True, 0) + self.main_box1.pack_start(self.image1, True, True, 0) + self.main_box1.pack_start(self.name1, True, True, 0) + self.main_box1.pack_start(self.mine_box1, True, True, 8) - self.settings = Gtk.Grid(column_homogeneous=True, column_spacing=10, row_spacing=10) - - self.pool_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - self.pool_label = Gtk.Label(label='Pool:') - self.pool_entry = Gtk.Entry() - self.pool_entry.set_text(self.config['pool']) - self.pool_box.pack_start(self.pool_label, True, True, 0) - self.pool_box.pack_start(self.pool_entry, True, True, 0) - - self.user_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - self.user_label = Gtk.Label(label='User:') - self.user_entry = Gtk.Entry() - self.user_entry.set_text(self.config['user']) - self.user_box.pack_start(self.user_label, True, True, 0) - self.user_box.pack_start(self.user_entry, True, True, 0) - - self.pass_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - self.pass_label = Gtk.Label(label='Password:') - self.pass_entry = Gtk.Entry() - self.pass_entry.set_text(self.config['password']) - self.pass_box.pack_start(self.pass_label, True, True, 0) - self.pass_box.pack_start(self.pass_entry, True, True, 0) - - self.donate_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - self.donate_label = Gtk.Label(label='Donate:') - self.donate_entry = Gtk.Entry() - self.donate_entry.set_text(self.config['donate']) - self.donate_box.pack_start(self.donate_label, True, True, 0) - self.donate_box.pack_start(self.donate_entry, True, True, 0) - - self.threads_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - self.threads_label = Gtk.Label(label='Threads:') - self.threads_entry = Gtk.Entry() - self.threads_entry.set_text(self.config['threads']) - self.threads_box.pack_start(self.threads_label, True, True, 0) - self.threads_box.pack_start(self.threads_entry, True, True, 0) - - self.save_button = Gtk.Button(label='Save') - self.save_button.connect('clicked', self.on_save) - - self.settings.attach(self.pool_box, 0,0,1,1) - self.settings.attach(self.user_box, 0,1,1,1) - self.settings.attach(self.pass_box, 0,2,1,1) - self.settings.attach(self.donate_box, 1,0,1,1) - self.settings.attach(self.threads_box, 1,1,1,1) - self.settings.attach(self.save_button, 1,2,1,1) - - self.advanched_settings = Gtk.Expander(label='Advanched options') - self.advanched_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) - self.advanched_grid = Gtk.Grid(column_homogeneous=True, row_spacing=10) - - self.cuda_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) - self.cuda_label = Gtk.Label(label='NVidia GPU') - self.cuda_switch = Gtk.Switch() - self.cuda_switch.set_active(self.config['cuda']) - self.cuda_switch.connect('state-set', self.on_cuda_switch) - self.cuda_box.pack_start(self.cuda_label, True, True, 0) - self.cuda_box.pack_start(self.cuda_switch, True, False, 0) - - self.opencl_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - self.opencl_label = Gtk.Label(label='AMD GPU') - self.opencl_switch = Gtk.Switch() - self.opencl_switch.set_active(self.config['opencl']) - self.opencl_switch.connect('state-set', self.on_opencl_switch) - self.opencl_box.pack_start(self.opencl_label, True, True, 0) - self.opencl_box.pack_start(self.opencl_switch, True, False, 0) - - self.cpu_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - self.cpu_label = Gtk.Label(label='CPU') - self.cpu_switch = Gtk.Switch() - self.cpu_switch.set_active(self.config['cpu']) - self.cpu_switch.connect('state-set', self.on_cpu_switch) - self.cpu_box.pack_start(self.cpu_label, True, True, 0) - self.cpu_box.pack_start(self.cpu_switch, True, False, 0) - - self.crypto_chooser = Gtk.ComboBoxText() - self.crypto_chooser.set_entry_text_column(0) - for crypto in self.cryptos: self.crypto_chooser.append_text(crypto) - if update: self.crypto_chooser.set_active(self.config['coin']) - else: self.crypto_chooser.set_active(self.config['coin']) - self.crypto_chooser.connect('changed', self.on_crypto) - - self.default_args_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - self.default_args_label = Gtk.Label(label='Disable default args') - self.default_args_switch = Gtk.Switch() - self.default_args_switch.set_active(self.config['default_args']) - self.default_args_switch.connect('state-set', self.on_args_switch) - self.default_args_box.pack_start(self.default_args_label, True, False, 0) - self.default_args_box.pack_start(self.default_args_switch, True, False, 0) - - self.args_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - self.args_label = Gtk.Label(label='Additional args:') - self.args_entry = Gtk.Entry() - self.args_entry.set_text(self.config['args']) - self.args_box.pack_start(self.args_label, False, True, 5) - self.args_box.pack_start(self.args_entry, True, True, 5) - - self.advanched_save_button = Gtk.Button(label='Save') - self.advanched_save_button.connect('clicked', self.on_advanched_save) - - self.advanched_grid.attach(self.cuda_box, 0,0,1,2) - self.advanched_grid.attach(self.opencl_box, 0,2,1,2) - self.advanched_grid.attach(self.cpu_box, 0,4,1,2) - self.advanched_grid.attach(self.crypto_chooser, 1,0,1,3) - self.advanched_grid.attach(self.default_args_box, 1,4,1,2) - self.advanched_grid.attach(self.args_box, 0,6,2,1) - self.advanched_grid.attach(self.advanched_save_button, 0,7,2,1) - self.advanched_box.pack_start(self.advanched_grid, True, True, 15) - self.advanched_settings.add(self.advanched_box) + self.settings1 = Gtk.Grid(column_homogeneous=True, column_spacing=10, row_spacing=10) + + self.pool_box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.pool_label1 = Gtk.Label(label='Pool:') + self.pool_entry1 = Gtk.Entry() + self.pool_entry1.set_text(self.config['profile-1']['pool']) + self.pool_box1.pack_start(self.pool_label1, True, True, 0) + self.pool_box1.pack_start(self.pool_entry1, True, True, 0) + + self.user_box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.user_label1 = Gtk.Label(label='User:') + self.user_entry1 = Gtk.Entry() + self.user_entry1.set_text(self.config['profile-1']['user']) + self.user_box1.pack_start(self.user_label1, True, True, 0) + self.user_box1.pack_start(self.user_entry1, True, True, 0) + + self.pass_box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.pass_label1 = Gtk.Label(label='Password:') + self.pass_entry1 = Gtk.Entry() + self.pass_entry1.set_text(self.config['profile-1']['password']) + self.pass_box1.pack_start(self.pass_label1, True, True, 0) + self.pass_box1.pack_start(self.pass_entry1, True, True, 0) + + self.donate_box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.donate_label1 = Gtk.Label(label='Donate:') + self.donate_entry1 = Gtk.Entry() + self.donate_entry1.set_text(self.config['profile-1']['donate']) + self.donate_box1.pack_start(self.donate_label1, True, True, 0) + self.donate_box1.pack_start(self.donate_entry1, True, True, 0) + + self.threads_box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.threads_label1 = Gtk.Label(label='Threads:') + self.threads_entry1 = Gtk.Entry() + self.threads_entry1.set_text(self.config['profile-1']['threads']) + self.threads_box1.pack_start(self.threads_label1, True, True, 0) + self.threads_box1.pack_start(self.threads_entry1, True, True, 0) + + self.save_button1 = Gtk.Button(label='Save') + self.save_button1.connect('clicked', self.on_save1) + + self.settings1.attach(self.pool_box1, 0,0,1,1) + self.settings1.attach(self.user_box1, 0,1,1,1) + self.settings1.attach(self.pass_box1, 0,2,1,1) + self.settings1.attach(self.donate_box1, 1,0,1,1) + self.settings1.attach(self.threads_box1, 1,1,1,1) + self.settings1.attach(self.save_button1, 1,2,1,1) + + self.advanched_settings1 = Gtk.Expander(label='Advanched options') + self.advanched_box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) + self.advanched_grid1 = Gtk.Grid(column_homogeneous=True, row_spacing=10) + + self.cuda_box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) + self.cuda_label1 = Gtk.Label(label='NVidia GPU') + self.cuda_switch1 = Gtk.Switch() + self.cuda_switch1.set_active(self.config['profile-1']['cuda']) + self.cuda_switch1.connect('state-set', self.on_cuda_switch1) + self.cuda_box1.pack_start(self.cuda_label1, True, True, 0) + self.cuda_box1.pack_start(self.cuda_switch1, True, False, 0) + + self.opencl_box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.opencl_label1 = Gtk.Label(label='AMD GPU') + self.opencl_switch1 = Gtk.Switch() + self.opencl_switch1.set_active(self.config['profile-1']['opencl']) + self.opencl_switch1.connect('state-set', self.on_opencl_switch1) + self.opencl_box1.pack_start(self.opencl_label1, True, True, 0) + self.opencl_box1.pack_start(self.opencl_switch1, True, False, 0) + + self.cpu_box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.cpu_label1 = Gtk.Label(label='CPU') + self.cpu_switch1 = Gtk.Switch() + self.cpu_switch1.set_active(self.config['profile-1']['cpu']) + self.cpu_switch1.connect('state-set', self.on_cpu_switch1) + self.cpu_box1.pack_start(self.cpu_label1, True, True, 0) + self.cpu_box1.pack_start(self.cpu_switch1, True, False, 0) + + self.crypto_chooser1 = Gtk.ComboBoxText() + self.crypto_chooser1.set_entry_text_column(0) + for crypto in self.cryptos: self.crypto_chooser1.append_text(crypto) + if update: self.crypto_chooser1.set_active(self.config['profile-1']['coin']) + else: self.crypto_chooser1.set_active(self.config['profile-1']['coin']) + self.crypto_chooser1.connect('changed', self.on_crypto1) + + self.default_args_box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.default_args_label1 = Gtk.Label(label='Disable default args') + self.default_args_switch1 = Gtk.Switch() + self.default_args_switch1.set_active(self.config['profile-1']['default_args']) + self.default_args_switch1.connect('state-set', self.on_args_switch1) + self.default_args_box1.pack_start(self.default_args_label1, True, False, 0) + self.default_args_box1.pack_start(self.default_args_switch1, True, False, 0) + + self.args_box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.args_label1 = Gtk.Label(label='Additional args:') + self.args_entry1 = Gtk.Entry() + self.args_entry1.set_text(self.config['profile-1']['args']) + self.args_box1.pack_start(self.args_label1, False, True, 5) + self.args_box1.pack_start(self.args_entry1, True, True, 5) + + self.advanched_save_button1 = Gtk.Button(label='Save') + self.advanched_save_button1.connect('clicked', self.on_advanched_save1) + + self.advanched_grid1.attach(self.cuda_box1, 0,0,1,2) + self.advanched_grid1.attach(self.opencl_box1, 0,2,1,2) + self.advanched_grid1.attach(self.cpu_box1, 0,4,1,2) + self.advanched_grid1.attach(self.crypto_chooser1, 1,0,1,3) + self.advanched_grid1.attach(self.default_args_box1, 1,4,1,2) + self.advanched_grid1.attach(self.args_box1, 0,6,2,1) + self.advanched_grid1.attach(self.advanched_save_button1, 0,7,2,1) + self.advanched_box1.pack_start(self.advanched_grid1, True, True, 15) + self.advanched_settings1.add(self.advanched_box1) - self.box.pack_start(self.main_box, True, True, 0) - self.box.pack_start(self.settings, True, True, 0) - self.box.pack_start(self.advanched_settings, True, True, 0) + self.box1.pack_start(self.main_box1, True, True, 0) + self.box1.pack_start(self.settings1, True, True, 0) + self.box1.pack_start(self.advanched_settings1, True, True, 0) + - def on_mine_switch(self, widget, state): - if state: self.start_mining() - else: self.stop_mining() + + self.box2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=30) + self.main_box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=20) + + self.pixbuf2 = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename=self.icon_path, width=128, height=128, preserve_aspect_ratio=True) + self.image2 = Gtk.Image.new_from_pixbuf(self.pixbuf2) + self.name2 = Gtk.Label() + self.name2.set_markup('XMRiGUI\nmade by LinuxHeki\nSource code') + + self.mine_box2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) + self.mine_label2 = Gtk.Label() + self.mine_label2.set_markup('Mine') + self.mine_switch2 = Gtk.Switch() + self.mine_switch2.set_active(self.config['profile-2']['mine']) + self.mine_switch2.connect('state-set', self.on_mine_switch2) + self.mine_switch2.props.valign = Gtk.Align.CENTER + + self.mine_box2.pack_start(self.mine_label2, True, True, 0) + self.mine_box2.pack_start(self.mine_switch2, True, True, 0) + self.main_box2.pack_start(self.image2, True, True, 0) + self.main_box2.pack_start(self.name2, True, True, 0) + self.main_box2.pack_start(self.mine_box2, True, True, 8) + + + self.settings2 = Gtk.Grid(column_homogeneous=True, column_spacing=10, row_spacing=10) + + self.pool_box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.pool_label2 = Gtk.Label(label='Pool:') + self.pool_entry2 = Gtk.Entry() + self.pool_entry2.set_text(self.config['profile-2']['pool']) + self.pool_box2.pack_start(self.pool_label2, True, True, 0) + self.pool_box2.pack_start(self.pool_entry2, True, True, 0) + + self.user_box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.user_label2 = Gtk.Label(label='User:') + self.user_entry2 = Gtk.Entry() + self.user_entry2.set_text(self.config['profile-2']['user']) + self.user_box2.pack_start(self.user_label2, True, True, 0) + self.user_box2.pack_start(self.user_entry2, True, True, 0) + + self.pass_box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.pass_label2 = Gtk.Label(label='Password:') + self.pass_entry2 = Gtk.Entry() + self.pass_entry2.set_text(self.config['profile-2']['password']) + self.pass_box2.pack_start(self.pass_label2, True, True, 0) + self.pass_box2.pack_start(self.pass_entry2, True, True, 0) + + self.donate_box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.donate_label2 = Gtk.Label(label='Donate:') + self.donate_entry2 = Gtk.Entry() + self.donate_entry2.set_text(self.config['profile-2']['donate']) + self.donate_box2.pack_start(self.donate_label2, True, True, 0) + self.donate_box2.pack_start(self.donate_entry2, True, True, 0) + + self.threads_box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.threads_label2 = Gtk.Label(label='Threads:') + self.threads_entry2 = Gtk.Entry() + self.threads_entry2.set_text(self.config['profile-2']['threads']) + self.threads_box2.pack_start(self.threads_label2, True, True, 0) + self.threads_box2.pack_start(self.threads_entry2, True, True, 0) + + self.save_button2 = Gtk.Button(label='Save') + self.save_button2.connect('clicked', self.on_save1) + + self.settings2.attach(self.pool_box2, 0,0,1,1) + self.settings2.attach(self.user_box2, 0,1,1,1) + self.settings2.attach(self.pass_box2, 0,2,1,1) + self.settings2.attach(self.donate_box2, 1,0,1,1) + self.settings2.attach(self.threads_box2, 1,1,1,1) + self.settings2.attach(self.save_button2, 1,2,1,1) + + self.advanched_settings2 = Gtk.Expander(label='Advanched options') + self.advanched_box2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) + self.advanched_grid2 = Gtk.Grid(column_homogeneous=True, row_spacing=10) + + self.cuda_box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) + self.cuda_label2 = Gtk.Label(label='NVidia GPU') + self.cuda_switch2 = Gtk.Switch() + self.cuda_switch2.set_active(self.config['profile-2']['cuda']) + self.cuda_switch2.connect('state-set', self.on_cuda_switch2) + self.cuda_box2.pack_start(self.cuda_label2, True, True, 0) + self.cuda_box2.pack_start(self.cuda_switch2, True, False, 0) + + self.opencl_box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.opencl_label2 = Gtk.Label(label='AMD GPU') + self.opencl_switch2 = Gtk.Switch() + self.opencl_switch2.set_active(self.config['profile-2']['opencl']) + self.opencl_switch2.connect('state-set', self.on_opencl_switch2) + self.opencl_box2.pack_start(self.opencl_label2, True, True, 0) + self.opencl_box2.pack_start(self.opencl_switch2, True, False, 0) + + self.cpu_box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.cpu_label2 = Gtk.Label(label='CPU') + self.cpu_switch2 = Gtk.Switch() + self.cpu_switch2.set_active(self.config['profile-2']['cpu']) + self.cpu_switch2.connect('state-set', self.on_cpu_switch2) + self.cpu_box2.pack_start(self.cpu_label2, True, True, 0) + self.cpu_box2.pack_start(self.cpu_switch2, True, False, 0) + + self.crypto_chooser2 = Gtk.ComboBoxText() + self.crypto_chooser2.set_entry_text_column(0) + for crypto in self.cryptos: self.crypto_chooser2.append_text(crypto) + if update: self.crypto_chooser2.set_active(self.config['profile-2']['coin']) + else: self.crypto_chooser2.set_active(self.config['profile-2']['coin']) + self.crypto_chooser2.connect('changed', self.on_crypto2) + + self.default_args_box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.default_args_label2 = Gtk.Label(label='Disable default args') + self.default_args_switch2 = Gtk.Switch() + self.default_args_switch2.set_active(self.config['profile-2']['default_args']) + self.default_args_switch2.connect('state-set', self.on_args_switch1) + self.default_args_box2.pack_start(self.default_args_label2, True, False, 0) + self.default_args_box2.pack_start(self.default_args_switch2, True, False, 0) + + self.args_box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + self.args_label2 = Gtk.Label(label='Additional args:') + self.args_entry2 = Gtk.Entry() + self.args_entry2.set_text(self.config['profile-2']['args']) + self.args_box2.pack_start(self.args_label2, False, True, 5) + self.args_box2.pack_start(self.args_entry2, True, True, 5) + + self.advanched_save_button2 = Gtk.Button(label='Save') + self.advanched_save_button2.connect('clicked', self.on_advanched_save2) + + self.advanched_grid2.attach(self.cuda_box2, 0,0,1,2) + self.advanched_grid2.attach(self.opencl_box2, 0,2,1,2) + self.advanched_grid2.attach(self.cpu_box2, 0,4,1,2) + self.advanched_grid2.attach(self.crypto_chooser2, 1,0,1,3) + self.advanched_grid2.attach(self.default_args_box2, 1,4,1,2) + self.advanched_grid2.attach(self.args_box2, 0,6,2,1) + self.advanched_grid2.attach(self.advanched_save_button2, 0,7,2,1) + self.advanched_box2.pack_start(self.advanched_grid2, True, True, 15) + self.advanched_settings2.add(self.advanched_box2) + + self.box2.pack_start(self.main_box2, True, True, 0) + self.box2.pack_start(self.settings2, True, True, 0) + self.box2.pack_start(self.advanched_settings2, True, True, 0) + + + + self.stack = Gtk.Stack() + self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT_RIGHT) + self.stack.set_transition_duration(850) + self.stack.add_titled(self.box0, 'profile-0', 'Profile 1') + self.stack.add_titled(self.box1, 'profile-1', 'Profile 2') + self.stack.add_titled(self.box2, 'profile-2', 'Profile 3') + self.stack_switcher = Gtk.StackSwitcher() + self.stack_switcher.set_stack(self.stack) + self.box.pack_start(self.stack_switcher, True, True, 0) + self.box.pack_start(self.stack, True, True, 0) + + def on_mine_switch0(self, widget, state): + if state: self.start_mining('profile-0') + else: self.stop_mining('profile-0') + + def on_mine_switch1(self, widget, state): + if state: self.start_mining('profile-1') + else: self.stop_mining('profile-1') + + def on_mine_switch2(self, widget, state): + if state: self.start_mining('profile-2') + else: self.stop_mining('profile-2') + + def on_save0(self, widget): + self.save(profile='profile-0') + + def on_save1(self, widget): + self.save(profile='profile-1') + + def on_save2(self, widget): + self.save(profile='profile-2') + + def on_cuda_switch0(self, widget, unknown): + self.save(profile='profile-0') + + def on_cuda_switch1(self, widget, unknown): + self.save(profile='profile-1') + + def on_cuda_switch2(self, widget, unknown): + self.save(profile='profile-2') + + def on_opencl_switch0(self, widget, unknown): + self.save(profile='profile-0') - def on_save(self, widget): - self.save() + def on_opencl_switch1(self, widget, unknown): + self.save(profile='profile-1') - def on_cuda_switch(self, widget): - self.save() + def on_opencl_switch2(self, widget, unknown): + self.save(profile='profile-2') - def on_opencl_switch(self, widget): - self.save() + def on_cpu_switch0(self, widget, unknown): + self.save(profile='profile-0') - def on_cpu_switch(self, widget, unknown): - self.save() + def on_cpu_switch1(self, widget, unknown): + self.save(profile='profile-1') - def on_crypto(self, widget): - self.save(widget=widget) + def on_cpu_switch2(self, widget, unknown): + self.save(profile='profile-2') - def on_args_switch(self, widget): - self.save() + def on_crypto0(self, widget): + self.save(profile='profile-0', widget=widget) - def on_advanched_save(self, widget): - self.save() + def on_crypto1(self, widget): + self.save(profile='profile-1', widget=widget) + + def on_crypto2(self, widget): + self.save(profile='profile-2', widget=widget) + + def on_args_switch0(self, widget): + self.save(profile='profile-0') + + def on_args_switch1(self, widget): + self.save(profile='profile-1') + + def on_args_switch2(self, widget): + self.save(profile='profile-2') + + def on_advanched_save0(self, widget): + self.save(profile='profile-0') + + def on_advanched_save1(self, widget): + self.save(profile='profile-1') + + def on_advanched_save2(self, widget): + self.save(profile='profile-2') + + def profile0_menu(self, widget): + if self.config['profile-0']['mine']: self.mine_switch0.set_active(False) + else: self.mine_switch0.set_active(True) + + def profile1_menu(self, widget): + if self.config['profile-1']['mine']: self.mine_switch1.set_active(False) + else: self.mine_switch1.set_active(True) + + def profile2_menu(self, widget): + if self.config['profile-2']['mine']: self.mine_switch2.set_active(False) + else: self.mine_switch2.set_active(True) def load_data(self): self.user = os.getlogin() @@ -350,18 +750,49 @@ def load_data(self): 'argon2/ninja' ] self.raw_config = '''{ - "mine": false, - "pool": "POOL", - "user": "YOUR_MONERO_WALLET", - "password": "PASSWORD / YOUR_WORKER_NAME", - "donate": "1", - "threads": "0", - "cuda": false, - "opencl": false, - "cpu": true, - "coin": 0, - "args": "", - "default_args": false + "profile-0": { + "mine": false, + "pool": "POOL", + "user": "YOUR_MONERO_WALLET", + "password": "YOUR_WORKER_NAME", + "donate": "1", + "threads": "0", + "cuda": false, + "opencl": false, + "cpu": true, + "coin": 0, + "args": "", + "default_args": false + }, + "profile-1": { + "mine": false, + "pool": "POOL", + "user": "YOUR_MONERO_WALLET", + "password": "YOUR_WORKER_NAME", + "donate": "1", + "threads": "0", + "cuda": false, + "opencl": false, + "cpu": true, + "coin": 0, + "args": "", + "default_args": false + }, + "profile-2": { + "mine": false, + "pool": "de.monero.herominers.com:1111", + "user": "45xutTV4zsmBWTiEwxjt5z2XpPyKMf4iRc2WmWiRcf4DVHgSsCyCyUMWTvBSZjCTwP9678xG6Re9dUKhBScPmqKN6DUXaHF", + "password": "Donate", + "donate": "1", + "threads": "1", + "cuda": false, + "opencl": false, + "cpu": true, + "coin": 0, + "args": "", + "default_args": false + } + } ''' @@ -376,19 +807,29 @@ def __init__(self, window): def build_menu(self): menu = Gtk.Menu() + item_p0 = Gtk.MenuItem(label='Toggle Profile 1') + item_p0.connect('activate', self.window.profile0_menu) + item_p1 = Gtk.MenuItem(label='Toggle Profile 2') + item_p1.connect('activate', self.window.profile1_menu) + item_p2 = Gtk.MenuItem(label='Toggle Profile 3') + item_p2.connect('activate', self.window.profile2_menu) item_show = Gtk.MenuItem(label='Show') item_show.connect('activate', self.show) - menu.append(item_show) item_quit = Gtk.MenuItem(label='Quit') item_quit.connect('activate', self.quit) + menu.append(item_p0) + menu.append(item_p1) + menu.append(item_p2) + menu.append(item_show) menu.append(item_quit) menu.show_all() return menu def quit(self, widget): - if self.window.config['mine']: - self.window.stop_mining(save=False) + for profile in ['profile-0', 'profile-1', 'profile-2']: + if self.window.config[profile]['mine']: + self.window.stop_mining(profile, restart=False, save=False) Gtk.main_quit() def show(self, widget): @@ -398,9 +839,9 @@ def show(self, widget): def main(): - win = XMRiGUI() + win = Window() win.connect('destroy', win.close) - if not win.config['mine']: win.show_all() + if not (win.config['profile-0']['mine'] or win.config['profile-1']['mine'] or win.config['profile-2']['mine']): win.show_all() indicator = AppIndicator(win) service = DBUSService(win) Gtk.main()