From 0a101f08c9e9138ca448ce91ac349f8d3c4b6154 Mon Sep 17 00:00:00 2001 From: Rob <5183487+Rexeh@users.noreply.github.com> Date: Mon, 1 Jan 2024 16:37:43 +0000 Subject: [PATCH] Move DCS to plugin structure, fixed relative config sourcing --- joystick_diagrams/__main__.py | 5 +- .../dcs_world_plugin}/__init__.py | 0 .../plugins/dcs_world_plugin/config.py | 14 +++++ .../dcs_world_plugin}/dcs_world.py | 7 ++- .../dcs_world_plugin}/dcs_world_lex.py | 0 .../dcs_world_plugin}/dcs_world_yacc.py | 0 .../plugins/dcs_world_plugin/img/dcs.ico | Bin 0 -> 115394 bytes .../plugins/dcs_world_plugin/main.py | 50 ++++++++++++++++++ .../plugins/dcs_world_plugin/settings.json | 5 ++ .../plugins/examplePlugin/main.py | 3 +- joystick_diagrams/plugins/plugin_interface.py | 3 +- .../ui/main_window/main_window.py | 1 - 12 files changed, 78 insertions(+), 10 deletions(-) rename joystick_diagrams/{adaptors/dcs => plugins/dcs_world_plugin}/__init__.py (100%) create mode 100644 joystick_diagrams/plugins/dcs_world_plugin/config.py rename joystick_diagrams/{adaptors/dcs => plugins/dcs_world_plugin}/dcs_world.py (98%) rename joystick_diagrams/{adaptors/dcs => plugins/dcs_world_plugin}/dcs_world_lex.py (100%) rename joystick_diagrams/{adaptors/dcs => plugins/dcs_world_plugin}/dcs_world_yacc.py (100%) create mode 100644 joystick_diagrams/plugins/dcs_world_plugin/img/dcs.ico create mode 100644 joystick_diagrams/plugins/dcs_world_plugin/main.py create mode 100644 joystick_diagrams/plugins/dcs_world_plugin/settings.json diff --git a/joystick_diagrams/__main__.py b/joystick_diagrams/__main__.py index e7ede88..f1e3896 100644 --- a/joystick_diagrams/__main__.py +++ b/joystick_diagrams/__main__.py @@ -7,7 +7,6 @@ from PyQt5 import QtWidgets from qt_material import apply_stylesheet -from joystick_diagrams.adaptors.dcs.dcs_world import DCSWorldParser from joystick_diagrams.adaptors.joystick_gremlin.joystick_gremlin import JoystickGremlin from joystick_diagrams.adaptors.star_citizen.star_citizen import StarCitizen from joystick_diagrams.classes import export @@ -63,8 +62,8 @@ def get_log_level(): setup_logging() try: app = QtWidgets.QApplication(sys.argv) - window = MainWindow() - window.show() + # window = MainWindow() + # window.show() # Load Plugins plugins = initialise_plugins() diff --git a/joystick_diagrams/adaptors/dcs/__init__.py b/joystick_diagrams/plugins/dcs_world_plugin/__init__.py similarity index 100% rename from joystick_diagrams/adaptors/dcs/__init__.py rename to joystick_diagrams/plugins/dcs_world_plugin/__init__.py diff --git a/joystick_diagrams/plugins/dcs_world_plugin/config.py b/joystick_diagrams/plugins/dcs_world_plugin/config.py new file mode 100644 index 0000000..e4f7e82 --- /dev/null +++ b/joystick_diagrams/plugins/dcs_world_plugin/config.py @@ -0,0 +1,14 @@ +from pathlib import Path + +from dynaconf import Dynaconf, Validator + +print(f"{Path(__file__).parent}") +settings = Dynaconf( + settings_files=[f"{Path(__file__).parent.joinpath('settings.json')}"], +) + +settings.validators.register( + Validator("PLUGIN_NAME", required=True), + Validator("PLUGIN_ICON", required=True), + Validator("VERSION", required=True), +) diff --git a/joystick_diagrams/adaptors/dcs/dcs_world.py b/joystick_diagrams/plugins/dcs_world_plugin/dcs_world.py similarity index 98% rename from joystick_diagrams/adaptors/dcs/dcs_world.py rename to joystick_diagrams/plugins/dcs_world_plugin/dcs_world.py index c3f2302..cda3761 100644 --- a/joystick_diagrams/adaptors/dcs/dcs_world.py +++ b/joystick_diagrams/plugins/dcs_world_plugin/dcs_world.py @@ -6,15 +6,14 @@ from ply import lex, yacc # type: ignore -# Required by PLY -import joystick_diagrams.adaptors.dcs.dcs_world_lex # pylint: disable=unused-import -import joystick_diagrams.adaptors.dcs.dcs_world_yacc # pylint: disable=unused-import - ################# import joystick_diagrams.adaptors.joystick_diagram_interface as jdi from joystick_diagrams.input.device import Device_ from joystick_diagrams.input.profile_collection import ProfileCollection +# Required by PLY +from . import dcs_world_lex, dcs_world_yacc # pylint: disable=unused-import + _logger = logging.getLogger(__name__) EASY_MODES = "_easy" diff --git a/joystick_diagrams/adaptors/dcs/dcs_world_lex.py b/joystick_diagrams/plugins/dcs_world_plugin/dcs_world_lex.py similarity index 100% rename from joystick_diagrams/adaptors/dcs/dcs_world_lex.py rename to joystick_diagrams/plugins/dcs_world_plugin/dcs_world_lex.py diff --git a/joystick_diagrams/adaptors/dcs/dcs_world_yacc.py b/joystick_diagrams/plugins/dcs_world_plugin/dcs_world_yacc.py similarity index 100% rename from joystick_diagrams/adaptors/dcs/dcs_world_yacc.py rename to joystick_diagrams/plugins/dcs_world_plugin/dcs_world_yacc.py diff --git a/joystick_diagrams/plugins/dcs_world_plugin/img/dcs.ico b/joystick_diagrams/plugins/dcs_world_plugin/img/dcs.ico new file mode 100644 index 0000000000000000000000000000000000000000..531114fdbda0223ef33c5cfc5cb2f53b40b2bd7f GIT binary patch literal 115394 zcmXVX1yB^u`}Y;y-Q6J}9m3JwDIg(I3ewWYQIgW#NH;3dakRvjZcsWUjt~zx;Pp5E zcV~8XpRL)Q-P!p(&*ymn03ZMZ@V^8EFar`o0RYo~bvXS0WNvIAVEbR2kkJ3hRU7~S zZp^=t%>Q2|1^~X+0|CVU%Ky!Gh5!H-JwQOLzOEVpE-miAr3f_Cl@0&b`@f8h`LD3@ zs&WJXLX9+(6^#8?PeQPYIaN|Z{~Nd4IP32}BgFs$IT(KAJbI<3&|i}e`CwNT7jkD0 zCBz*tC;&6qX+{ko3dDVpn%Cs`>K=A0UH6wkb5Cc5M>)sGHHEi5R3C7__l`YB^swHV zV^NLssSJ>J^|l_2=ZWj@8s6v6Q!lUMB8|2fqKPhdx1Dbi3p2Dnj<%x&a@GoK?M0^sc|NT5I8GI+uL0mm~3FK6P3eP!;dQ)6660AFV2hQjESb78-~;FzT9i2Mg_3e zK;#LM`gw3Q8`sD9Qkk46cswBbTLSR1o?(^+?+lqVOk1A+n(dj()NOW;^M8-%vc-fK zftw+Yp9%b3yaOeZmaQI{@$G$ z^IR(@$1vyv&KcuOvQKw#x#C@$k&?CQHfP4dxZl`3LG=>rPhL{sFjGC-Z1me~+qP0p zg&g%xEJPJ@;ExzHtpdDSb~3WseyW#^Je`FnR8kPflj`b7hO67JoHwS)1?hxSUF@wN zN&&5iDlbqxhA3D$CntXcKj+AFlx`9K-H*E zIIJ}rId(2I;#zSVg^Y< z^q@ipIuT$Q9>GaHfxe8Y?Fc3{?Tn-vly>M>zp@e!<}EOVm(KDTKOia4=_l+D@L01Mf9_aC>S$#Mf5X_{T);2|Qw*U1R9~GE9rm*f)imo5 zUs~Rjc*{)V3^sumiAQ!;axHnZgq|s1sd19@*0XQB)&%%&D1I zMa2iai1<|;oz8wDGrxeY6F5_z+*~g;0khrj2$aKp^(AcftJAG^wii2#5Dh8M_QiY< zdcsaC1B~MXPab`z4rosPr5A?7w*VU&91y00PH&3pe6dgOeZgv|$U$+TBArkP!@F&O z$YTX==mb1+6SG3h)goeYXeFPlaur@Yf8?&_<(X2XZ=PD1h3aE9sBnLgd)dLoO~=nO z`^a)5$Z0*9^q0TA-RthxU@)pMT6YJhJ;s9TMF5R`7L zKK;cYP&|8c%8EzV=CF)DmclR>ERp5TvAcrSj(T2RwqBDzT$Y=tE}$)2C$9Kgbxa0E zmC2zwEUXj9VTVyte|oRyf%;5s)nT`BHGzMec8r$0ud20#?G;Me1 zPwx{JhYI1G*(X4usN@YWV)GALqr zUuxfhG^#&dBEk{{`LrOy8g%Ng27C%-vS;rGna*T{zg8bd92WYEKs=EN~BX+6DIKd!nP!tX60&G;E;@o*4m5>DOh&`Csn<-u7Kf=yRobH^Zb><+;FRT#> z-!_!|MZ1YV+i*2OimjVBZ*VFZR^9j+`8?%o4U7=K#pc3SfQ?{mHzv)E%PYkTHuXFF*{(4HQ|kk;c)nvpJywP(m$o>^{-#QvB-mAvU2{yFYQKk?jTMA0AU>RG{z6b_8`_iAu86e1OPb| zqS0!IQq_M%*iE0hh$sW6kN0&AC*)yaP8UsfGbzQPIC zufSlJqwIPlF8~eOqzh&Lb$w+T)^W`6W6M6k_Rh?Zzbdv&?ViE%92WGAR4lmy#uyQ% z=wtsqHu5Sy>xtAaUts8M3RX>sazj2O^_Prl29r7ljoJLqTFH{IcFi<)-wR7-EMm&t z>A0FhtGXkEGq&%%8w@Fo`54!I`}+1>MQN2r#P1m5__+2FbtrGq^~5znW5d9Q{c-L; zNnf8XRu$@)K0f5%*o8V30(d9cp%Ro5*8a4^$xzm4q6)wRic}zJeUA)aL=(1~MXfvP z*HYYe(Wbj8(en8dlPF`g73KsmU^9_c)Z;Nf)&ErpgjamjhyvxAYh~5e<=@IkRarLX z4NafF=RF0m?!}V=M~wiE4LZ)2UT(T;p9ZmpYc5$AXzI0A@!IQNZzQ45N|w8{?OP5mj7J zoM5IxmuKp=OtR8_2M1`mO{ND#o48sr3A<#IZeneY9EmuvBTOJoVb2OUek^g-@C^;K z02HSkgKdXq6G$-i-a9;O2VdFIw)~;#*U|Uv?-{=q*$=7OpWE2;W=*&QR=Q$Q-$JRfSvXc$HRHSb1BmCsgxnD*`zyUWD-0G6W|Uod?USyo zx$!&%EtjXfUiBe)*N+lG|EsAKBr5cS*o1YUixXHpIY7}L#6_OYm;5HryMTxr4qPTY z*k&ux)NqM?+lsp*92z0^bi+{{f5{mBDLj35<2RC<5ws0BoI$poLG-;M`*Sg^9=2qG zX@r^)S6HIDjz+{;YBNL_cyh9lnRCC>T`hX*pIsY39Od0yUdh$V+ur<9i-GS0_2r}{ z#56#;fRDy3w-Jh)A05`aa0ec9f~MQ{+$m5=DF6*K;k6Gh0G{tl*e?`zNevI1i1Q_s z%~LJ-QbBQ+o}S5F7`MuAUX>?)TP09}5RZ!p1#C;V>pvF1kNjJgj>YMY!;9DScknkK zaVE#soa54>)&un#I&M>tyE2PLjzRi~$@Q1#n*j#SZPxes|9h3$dH_ZK`9aETEV$Ym`G6~fGSeR~JnJu4K6+wsi^?unQo{>O>Gf5na3VwkF z>Htn^fc{NpD&C`Rx28e4@rhudIb~e6rxnS*_mu+7{O_B94U2Q`m`UUI39Ks-zzLX4lQx0J+I@POrc8?Pxg5oN$o~f!JsZnBgqO5ZSI8x z077j-p`gRpQHr;`%biIcv~RJwVKXg)8(3;l?H<=}HZ=bI$Ol|tO^CGFX!F-WRj%_e zcv0G>B1a~o{MP=G+ecbu!?QsC?|_!w*{kKFQnssvGIA{8+IhF3!Ht+BmM}|xrlmK;N9yDSROPh|7Oh+d%%XRYoX%2r?IX#TOW;ceb!W zSoa3NwLZ144kd&3{^lto$sXI|%^)D_;DcVMa6mMx0PZSkyW6EMY7cgw6)wz(F^Vt= z1tSEL`{|qFJ1Bpx1+_(*KU&c=>=;kJV_vDn{`AhTVme~6geD<0ge^`|sjF%*SC>2+RM#*GBMN@vKXj8a zkP-Sr(>A33IWrSjLU;PkdL<_~tjRYk9qN*RhtE-LqlifHbdg(CeeVGms9~Hg}|tcc@H!EDAV076k81}rxja2MTaq& zIFV8z?^JH6POh@Hd*88wT#yks-xTV@vyF?3|4!nT^{8#+%2Y0N6x zq3iOfTfai-XP@5`HXJo_g(dI2iVX(R{?G^=`ynv7mCh4gl+Ny{By zYn~us`CC8y%Lb_4aFXa}j~w1T!X<@B?jR+HPzE!s_gX?2Y-wtqS;bWWgX1){J8VrK|NNV~e;WkV4^HLj*Pmb?`EZ9oM%*KzPetxBHqnp>{gT54K}U7mPU z!t!tM)0RnKF5!RPH)`}qJW&w#ERm}po^uhuZ2u%l5&M{5Y1U^XTR>gvH9?1WVNEl< z?4V)~cB2w|{)j9Hm!D8_R-cDn!i#uQcYa2CVr~lpxc^%1YW*NH;`&^sGZ1_Ug)&KP5>ALXuh}j#D|R+SvLHtPR9HLMdA> zFe9QLhaZHjJdUxRW)k~_L6;hHkT;~g9!Gr+v0@04V zL}0Jtl!8=2sNWe=<@R%Sinna@3_}LxqfNO{NdAsInQz8aSw`tCniF|uHj>)8PdKZY zqwd7f$yn<)D?QuNa?j{g06Lb;AbNezvp3HG-)?$k|5JG2 znrNRJF1=WNvQH2MvIUv7zgYMc86g5GMuOc@Qh%wO#jA<^P}VBrKhm+tTrCV7^I`a9 zAYqjq`?VfaAtQWO)Vr>GGeCYoc9uX7#ca`Rs5#gn8mnBlr1nI>eWSy*nXy*hAV`VAN@m_Je ztLP4Wh3Zo_pyRsY=R4W=YDJT>ISuL7qp(Wq!v?{2=ElQFA8Y#L)bwHkcEwzT+rH=2 zN_BB;P4awg7(^7v@BM?7LSF~-msGfG`#Xfj# z9<*TbZNiCR6Xbg=LaoL}Vmbqto{^Md8IsAvF}ZEtZe-(H=@4G*!bPqnF3$jSKQ!T= z@#kJl%f|OHF5okYR_2(xr=5|RX!+WIA?)DTyUrI@1lI#X&QFwfvA?2BUsor-@v5B#k}{5ol%D z7+6($mn(caH|b&5LEzOogH3A+0OiI>>MTR}+?WA88*1{S1<_ZS>mZ)9OA_6mvG1Oa zJa;6|6{NL)tz2^;t|Et9@WjmEnRFoe;GnIqw{B#oHgLkTy4tAMejU9V<65_4jrW(F zg%8ne`pfjTG2zy6V6F!mwy>i)&~wnHw1$B>(>i*Sp@zP}9>_{yIz%PyN|Feq5L4j= zoVt)k%7TzuMgb~PM!ku$1YE)AVc)8L$uh()w<*ZmZW}3D8~lvkr(sTwpMS|f9Pb#G zWuBkhC71qyqh1n+&+VZR%z_&C51(=mxVYWw|8sxXn)WM(UADN9g?*C@@kfh(HXD~v zK_Il0aBvc_wo>+0MW>VyMdM{R5he}G@N;c@eW_`7S&of{_Fwptx)KO%H`1*)`YF7Da^KQ~2o>5F(~_Gt|#`ky*unVFt7>AWS}$(c5GNEgVj) z0oNwbRmS^)4F$+xw0}0ts}*9+c|MUm+*o2^TF6k94V2FpoHbDTzMGi)<8aqNeUH>;fDRzuWZFC-&}6Y*5BD{-o|xaceQ^UTt-Nb@L1?yi zjLb2A9LNSD?|-J5a?Qrhc0Q=&S(YyoH=fpPCxvUI9Cd{Cw^$n%q$Z|tJX}uV?29;% zPzP_{PO@FfBS&`$MyRx(E;jw9wq{-tCyH_FHhpg6jECfkVZ5bhem$!b*kD-~47egF zbymVaU+x>6ys#okAq@(GsH2dsXnNl@A#Kk`J&s(}=hl4CBroFBY4p0bEn z!lc>cMz-4)&{^+O)@a#^Z3vReO=Ba&=*{+z5amB6shwCbd2Jf3|B{MtN;l$g*ffIV zbq)0t?qVk1R{zrWZwM}5B)ihiUTVbA&)lcJDBN49j>SXV5++Rri|fPRdCfIex%UE ztLAqPZL(rHDXN$2FCYx;J;FaA!3n*IvHhZ(|B)Zv1bb|7WbM}tq{sitMt zD{Zpz7LZET(`^l*P?Y>|Dh7A ztNhn=2;acfYFxi{VhHdYlR>MGby9mTFFfz zJj*}2dLEuRgVJ1aMb!a#6icYF-yUtLw}~W0_FQ#I=;}CKi;!O-kAl7d(4()={_|O9 z*g!MI-5W^(aL5S$iKnOMEXCf4B{zGxagE<(flHd|Nx=HY|H9=Cwa8KWDNIyyI1iNZ z9%vtPH^4zWEWwC5?{%2K&D!pEA>v$FCyev^KR|Ho^w9W^_&7dRfb`mo@;a}l`%uFH zXjFkB&UUbRL3-UNl^)V_ceA~6=)OsW7j(Q%Bx9n!<8b_u0Z$+H(vzAZ=Xv_J)3JD! zUZallE8KvvY$nc-GsZa(ODf^pTqFZ0;YV!h>2Y> z`|(Q^K0S1H^fZbEMX@o>h>|J>cpdc5I;G2fVDtRAn;gD09a$I75X@uq!2~PDy2qo7 z1$*xb%?qexJwK9JrBrz2{f7!)c_tN38jajEJ}1FVnpl6KLp4ph1LsDl5tv+&*csQ{ z=@TJ@L+8pdoI(D>me|IcudF;2L5BrIu*6div>g!dSCLa8hx7U?FN+!15aCJt}2x^U2 z6hWykosp}iuGzJ#7VWD~Z2P=~G{tB6kXI(NE@xUw9`}?y#GyV8vfUKKa)cUhSQET+q2jE;aW*6>BLy8S(F;Rf%X%+r1QA zF1>Bz!-~{}+e?IhytXSNdvCBxxSmhG>x%kJkLF|)*VDZtfn#{`mcZVs!)&~Pq#yZO z^{D{XT?W(b9VET5!FeSBb1GFn7Rj!nd9I%}rnO}9fW|peqtKgd`bBgrR@w1&D2d2J(&2RlkYnq5QugT<3*@(^tKx|d;x~vUXYvlYsy(@^n1Vu z0-D|^qV=BvJ(iz`hG{<2`9tAyx7(jX-W4(lS4c(2Fn=47cDfVx?aO?L>ciY?ijRxcilQa{b`?Y)$vZtTVazH6<)y);>9MhPyg&LK!Ovjq@?vFD0v-bZqs0)s&hcM2~ z2FJvog;kVLv`z+PvX9N9UUXrTAxI|e<*6A@A8Ua;Kt7Q#UG%aYKH(fX{pHK5-mHOL z{$=HuemWm{^!?lb;xrZJc-S~_O%nWOUIZV7Xk^t_ zKF9U2FTFddOeESDi7UozpOic{sT4F2?x`B&bZVF|;1B+)+V%FpJ?v^;9WSailFGfT z_>A4pivVp#48Qa@FOVYan_;tzut`Ow z*0xDg4ld$H^=n5|7HTMFIny50(La@y9G980tG8#Nh|R3{QP@lW%L;z-PK9#ZRUF!s zF&m_qUnh^fgFVaPS8P`ngnyDxmso`Ab4W$+%XgLj2rE-~@HPs$6?3V8ezQQ7r9jv5 ze_+GEKVYLcZm8z}+D0+cEMzU+-WTYjn?45M4^y@c@oUTOr{tsGg;Jaw_TLF3rAdl(g<-zG+-ae zxAQ_1HmtJrlwbB*e22Tx;5S1&j?!@3CX;xdb<8CmT?6gP9Jt~Ok0XF8bBbGRtfKQ!n*ob8gYe>0>tHvMg&s-oo@50M-09?ZAJeByj|IA zux?%G{MaUgIttijjx4nc{|kEzUx>V3d6jQGqFbkQWr4U(!ua6`oedc!<2}@_Vtp4f zo}_7XqHA)R{fxd$YyCe#&ypma39z$mJl2sh{YD1!CFyaA7nY4}KQ_!@^<)CaV+)!X z4gLV&PPB@VH~o{i7cq_(Ic5DS{ge?Sw7@AfQKD7vVXM|a$2PnIk^36c8H9?C^Q|%@ z^=9BXk^ExhA7HXZWW$k>!EP6?n{-JssI(oYF}+>*(Jo$8ech^uncwD_%!XF{VmC1n zmMbg8PBE68y9zaFsEI#4<-N+w%Lij%0qSaY3+D8=LIXN`n+>V3<+uGD1fdlLr=G<# z`LRkI7MoQ5nLa=)azd%hz@ME=aEQ@``#HmDofvdMfMo?SgHx&)U0@_UDNE4D?^Z)& zg}PTkE|$r1Q9aOAs!tFLBZvVSRHl3fzz!(B)dO^wx+rBQ{#CzHFB(M@`_$_i*^1== zX@Kf*KHlf7V)UqZq@AoBibmY8Mle~F9q~nZ`?3Tbf=xcS@7qMD%Lskb$D~bh>D%uj zq0qe?LI#ooP%&!GMS@$@6|eokf2oV5JQgu}cd@>OQBf`d37LWf2F5QL*k0c?17>t` zNz=C*M5wv5ff|2RLj72O{1%N1I4}`7+TGUZV%D%EcYma}L8g7R1AQ(&dozKMD^bv3 zlyt^okrHlaL5{G?8wb;;&)a3J7`uHYX=T>gyrON>VuxSlAwB0jtbb8Uq+k;xj@*Ih z<{h=hYW6Ufe9}65O!l8tkFRDDjl+xHDfc7e@{Bm4nZ#F(xcrD(G zw==unJ67s(E9nh{k23u|!T!WGhjtJReunfu9oF=>qGI0Q+ds{ zEThcGeAHGXkt^TB6b!MJE+sr8iPdk+--jaZ z@7+^@?I=Zk?vL8rv$-j`pLe-@`58l1VP>DGn%>H1q^HhvoEp5n8%b_7*sWB?3Zdgn-PA^TnYFf+1iA`2d-7EQCk6~e9!EE;pu3moMrFL~4py9acW%VS?%z!m_ z!+Q=e*JS?w&oM65QCax?LPXuSgi;|+`HC6Kufy7xa<4_seGd&mQ~@ocBkZBtc-Vd< zcNQv<*zok9TJrO}V;?^a#nTm$GGE%LkdxX0bnwuZ)Bay*4pu{qTQ?4~GqLRhf+}88 z%`r?qihQb+v7Sz0&}a)3gm3;}<%uo-PElMc_M4~<2Y!W1ocFcXTc@1TcCU2&ufKIt z1)_lf* zS9*bUZ?rr1o!aInvbl$MO-<4HN@AP5#d0ly$UGT&DPaWaH7B z7Y<5IwtG!CWqh0r(VvZu;+!>_7H!)_($VH2(a7$qn;-t-qx?-e)I`SNO*JJv0CD7O61yf#=rdLjNgBy>t)kcevXj)2f>Nl z8H{foG9^mj*2d0PSbANeIz^UZlArH`bN|dLuD8S1KuV>h(`ze)S?d>oe7}_`pijPo zlY=NpiIIf2PA27MI%(buus`^EYv$xV;^!QJ_x^Ps=hf23PY3_~%Z(Vne{Xm@-W*Dw zEULVZZb%eAJaL|aXz&lQ2QSrJ%vP>#)!TGI9#PBkCEcxj^B^IhPrj-%r@mpfgxf`(SryU`^NdcdO%^oB zP_v`u#JpV7${PI5-sQ3pwv`Zh-(j~yu#b3W{YCDidFT#VlU0vL=Yp6jED38^>%V5( zakGjD2-bem`md>pmt1+3D#4a)xI$!3AN(eS;YmWUovg?IaslA&2$0$1dPT+@7E27D zQ*~SPk^g81z9Xp}^=XhHYguy*S-#Dn>rd<;l-RIkFxSiaq6Y3(%90Sv{azht8Tyie zmL)T8D1C%_Vqq~8aq^21)tUrjVtm{ooBp+AMDOq;gX2j0KyS=`k=(D)m<&EyoVjdv z+RJm&_MVHMK><%ylCxn!-$Ale!<=*WBEFq*V?6WI&;tI z97?m2s*!TxqTkFNA6G@T()nP7Tty$i2#b)!e>O*B8jbHvJkAlGRQH)qe8n=~LW>_j<-^q(`&i-7)6>0t?^_lPL?~@fF)eEFv+szh+P>-VD zZj0+Cw~O!*mosvDNTY}3(Dj4Hf)kD~BwcoDO5>VV8Q_b?KGOe$b+C}bj%?xKk7rh21`w2LKtO7R2zvE1U$5mCs81lH^Y8vC^GGp$&a1^1B6{EUq z#+j}KKJ9)5wxPl>JkH#U;0{v_6RJtiNOtXHW6!gaY>q~jz-kaQZZBqeS2ktMxHLFQ z#aH;vo3ZLxdQ$?6jKBj1YeJ@VcP{_A8^MT%8*%d)dHjfuS4Qi0_HHCD{i}~Ojj}*d zN)twd2%x^cKv08D!mHl5*cOWg80Ry^p;J9ixR&o_&9qPk<|R5+GhZ&c_^R5f=X}nx zsny^7M+Ps(pkAB82U!P9JLUp9>R$=$NP=KKwFec;BhR03C-|MrIt7|cTQlF9+-%Fs zVr;Y@oabVjE|a{QeqUk4vHrGK^wN%Wa$iut1UFCmap5O!ab7%IF)u|=L+<&dcp=!P z_Mvep^|4LK8n1EVEnEF!(!gaHOYIg9Z+R}z`&%kgfJDf15g4PKNe@;5-%*7RcP3JmCFkT(_;r^{kNdF zSNnLfKeCgeAeA?!8n6%SO#1W_oy_vkZIZF%eem}PM+;v_%dZdisEOWQ#t%!Wp>JIA zGvCF^XHJcde6c3`L8gCyVM2=dNdv6=89fZ3?c#(2#uoOnA6q}$tQDRjC&4y&Ot*hu z*{0pT>wEsQ5%Z(!<%%JPnsJKml^GZ!RI2rE;91F1DuB`8Yfa4w`A<}pFi?D48*Zly z))(RcG;Zy8?cx>tSh}!I7eC#92BMDLLc{6KgJiwuX~Tr^P9Tu`KTOy7fG~E4Q&?6+ zOmn00g?%pQ?$vHo8O^SQOsA>l^rG@2IH!Z2`s?m(u0#)R&-G)s-H4ehww4)zGhOJ!KN<}2ch-HiU3Y6ahL#I{ z{^B!=Fpt7Rxi+Sn1ODH4Oauu6f|%-9A{rq{c@e>0!^mt-z-u!x6 z_eJ$8f{KoLyF6gjriCFFLox~vAOlzmjbgA{oO5$3~StutCiTJG+ZR&XAK|TaPdBj^*K<#z8>9LZ#ME>;_cr)a_ht`w;|DD5INv&poWfCFUI|G`WHUF2ZPRcwjU}0v87o&On6p$l#_t4sKqcL47jxo;^lR z@`&qz9Y~~e?bK^$>eUl-{!^M7pu_Up3ruGXVT_``VUry#umV2-=A^?U3v#*^z zitv{2kU#k{Fzz$L0N*lL_gqp&j&D_D0TTA#U}~B5pWS!S_IRU9rq^Z&jBPe zw(mdk=VHsaL2P+7@Sc~xVEEJXVoOWy%tfpcR(e_KJ9eYU3O|=aI0HDqiK{Q+!flsL z&+JBggQB9KpEQuMkw!Bf+|aU}98Dp*q{X}if+cyBD1E@$&y`DE5iNimPLm8;7H53< z(x7-r7$e(%B4hu6oBt(-Ot&Lm8xjRBuIwhrY?x51+R1qJQt(f|HUY}5TMq;HhNP6g z%5^90Y|aL~%;Isv(%8z|OLNqizk0=1(9|jx2{;oJ1I%Bn7vA?nnrNYH5aP61LuyiH zKE(P|I-NbZlTVEgzH12sV~-@YU*j?`g)4a=p=5TI`GAw`(I$@BIbB(L!VR|| z^QN+~UsV6w3lAGyP6xoW1VK78fKZc6Ul~8@h8jdEk5htP5^N^d+m76(1CGH09`2w) z%>Jgn<8MwS&jBi+mKxw=Y$#FNl=j^xzxi1z25&H{ZS2Xz#h43?gUb z1gvCXf5b#zAdS>hJ|*f}!jmb7Y_j(@jGPB=F(6xhwnS7GS%x`k(kA-!|5~I6F<-6u zf6=M{I)fzVi4pk90E!R(1AwGXlSx@olF9%VD#9cAD<74gPxFS$PwAE{Vp`6ft0@x0 zJrY^1`E4I@ZJg5OL65Ke)-VNR&j99Pq9CwNM6W@$jmU)Z?06#&8^Alqn|*j>(}&=( z^}MF9*O_&*wf+BY1=iRl@&{qV<&J|$1iBK){FevR`tL`zgsr+DO;rs~v9w_-?`x2S zI_#SWAK61UWmQt;|7LDd5!`ra0p9%=Y1AN!6>e3;g#BCr)Wo*3k4Pgy6-_Y_p05U} zJ-f})BSynC^8RFsQt@AhP2#(~212C1id9W_!#vB2j-E1L+kk_H(UK2+vlwB0f^ zMuxs>B+C339DYxog}r0) z2PMiqw47vro^*}V&)khcw&};Mn8*kt|fnWd*m^_O$)B? zUW=GXZC+;Uo#Ql}$zeL_J569Mp2X@X8YjA`*# z^NHHOXW7F=>BMlpssfg6Z}24_Zqzo%9X}K|ipb=rgN5%e$jG0R=R>dDhnOd<{5aPy z{`mFh{}T8QLusz;Ci*e0E1Wb)wDkSJKmGXFd5N@gAyA_9aKEj#Z;M1mPS|zQ(^YZw z^ymcc?fxj1|7Tzg=y)Tl2dKbSUFEkRjP4EclRQ()-c*9u{Y)1d4yiD z4+vyFcLF6i_5O#`9S6fhXn4MVSs&muc|RBH`*wQj>}^CqcLDP2%Yvo_X%SmGH&fSk zUBQWhnQ9rM&tl&_50?sDWS{nnG~3T46_9G{r{s3EIjkpPL^fW6Rv)e&0N*;kkv-#} z*vNRf0O)K-I!#G>BhVthXaAgbG%^s%bO$ra)|O{$R)W!w@$B-0-@ik*y5l!cJQ`RdgZ~Pu-7EA-TpMPtv=8^t`!>aVq{GoEYom*DZ!8Z_RI1k&*vH2 zK8GdEx=6ELPrA07vcGSl3-Ob5Nl~x*#e(;?f5O-4$sCWT^X#yI33 z4aTA zSvgx8*=gAlTD-tGgWh-Fz)zAzzY+NKk9h1E5vKqO`JFVxy=}$PcRqUhvqK1H^V`sk zc<1l|+o=n%@W+rZVQeaSTuxwS>8At7g5po9^N?Mfwm%X{$M^D^Ih9mvbDplYrQ$R? z#bWYbU$&R#mkF@#g+%54o^Zeg`9yyA_vD!-K7+c ze?C}l-TcLf-TrqRy|>ioY9ip}{Vdf7 z72l%AVe#I8=}^kXaHX3KoJna%cmKtz`W-Pdlnyca#`*oLvk%Xt9RK>Ri9h{eDvHz! z4U|WtmO{h(Ftom*eSMaVa^i`?$oGE8xGDPVHdWO*-6IGC-NufB{qWR%r@l+gMYSYW( zDiX@czr;Q*FFO1V(m%C70uiMajd(BAiPg|^?kTySp7%X$)gg(7jOxrdys(FhHlkXo z9@Nl!(c!Tqkq9@g^?oQ^m5$of`zo?`aQ(+Z=9ZHH^{wHNLKZ!}LnGzq2l8n-u=%Y~ zj7rGbJ`Vlbw}^1ijv3qV2&JzZv+e4oxbdDGJeNQ^|0&b zar3D+>fo`5dCqlWUj%$-CDZhVMfoMc?kFq#>A}|y z^)gugA^72^gALQyJTXkwlbMa^?m&A|=dfrd} zE%N5F3jGZRd<(i7BZu0|D-gscomc4MU%0p(=BE7u%D9O$Q9fgWzWvReW%c1q9B!t%`Afvv&!4|kr^uo2tK z6IgJD{up764nI=O=l+$)xck=pcqrj`k-2j#wdJMj=$pXVaQkGvn;bb1s>sHP_@JU? zy$w3k7qkY>mi5LgY79>(vWm9fD;_QUn?@k;OStDq$xngzG(SK)a5Bs`&p0y zdjI_;F*kP)g4&8y3RN&9dWQesD%*}dvO~}sqqflU-XVa1(t9sKy0l0yA^Gy2{hjOI`z?F#v%howxwx;)tQFRpnfrd8nas?3lF_a3 z2FYs^$><==UgCZFE7bLebZy&h1(=lngX(j8f*(O;b}QT`=?_feNS z^6~sPo8q9seHum@LP*ks*)yhVlk+EDQfn}m0ScNI1f&fzAH7sZ^lySDzrR&V%IkHn zeR$bVSa!ytW*zP`mWY0sdC7S0<)-()_;qT#3I zN?^NV{Uvj$Qpyydc)?7PaaL*%!M zU_~aGnS**S)b^*rBS=G5QG5<7_S!9cGp~mfO-Ezw9k*Nkv>>?zZ>966yn%u6ysKF! zT-lx~muZ8ow8t|~^dHqZa@^1q+uJ7jcw^d&c4GLMkE#P>cZS<-^xAH?Siunob0*Yy zw9SR+B``7Tc>A=|OWsbwQDh3W+j5@B$~S&ZS|>I8M1KDY%SExkleTP~EqP(C3!b~w zku8aVzm`+(0Q^SPn;fjbP<)`sDX6_oLG?U0cQFV6qR*ppTQd_z89wy18W(EAFU?yS z(Ss(Q6^>1Ql*O?Q>idQHMn>Td&&RPZoWR>Je#9peSaT8B-|ne2k_Vxm*9>4I8Xd_J z*E$FyUwqIX)j@(X#kz~pqH8>WOOT$`2<4(2n z&xDAei2JN=P}E|pf&3{5W!egZN&pVniLTcJc%KsG$z(}>C;v~oPQ%ZZpZ7_ zw!I$7Sby@%gi>};YH=;yjnNdiUPOM$5jV`&p=NrmBJ(zs{q|YP_N=G>?PRrcqFe5o z4DI~qijc=?Jp$~fvu9+bAr7s_&Lo)fAC;yN=5t>@?WbQ-Moh%^UD>1`xV)a`-lkKj z)KcO|BHifi)z1s}jVExUs558}UsEi1oMfKUB&utppzmYK5=%c9>@WAVCY52W+}DUh zG?CeK7_v{{iv4BhlVQikK~IG}yBCQ?Qjd6dL@5(f=wtxKO}#%{e5dMuX#e2-3nkT8 z?~K~oF7}|d=yh|{VCOWs_%C~v9kqeA!{y@%iNcDE7nd%`!nNK;8@ATMO4Da_>hAZ> zcOQH&-1~eX;v=LP>EUbYehzE*OdSaC6d=e`Ig*6VWY0FZsPdvG3nn|NjTQ?HF)iEr zFY9|UQJ`Vb7b#D{`AkxzvE@)yv9AHpg&<$whJ73JjshxdJ2e92>Nfgs$2+gBn4v!TCHo@%p^1V7DYt23y1Vi#O(i=Zz(r}e{*Sb+LA z?=DCWH7Zo?9=66%UASIIF5od2joP+Oad|GN8U(EL7hG-?i$d1;FP$RdFMq-6r?j7IGa<#8YBHD;JI(d1WL_;~3j-e!_3tU83vuiqN{oY9A59MF%k zI7ux~)~{{oU~5{8M9pU(!(q1`GbUon{fNxx$VCs@`bnI90eSa*!_^?RNt&E`KYMVI zhJ9@wXFelZu(5jYgUnX5>$S08rULAAkl1 zO~9w2R(U_40D4lhqvmo zWstrEc!!aAsztyrrgxEkXt6-y;yo{bjE&mE&2sJ3&K3pp=n;F1U618O^ZN=_a#mh6 zAU8V&EK8#@DVB|8!IzC`4Jv_huA&~5JX%M?0{wk0l{&8^x67ApJjb6pKk6}pbh@Vc ztUdpP9Zsj{=x%jm#LbWOCFyW(j}LaGL}