Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F1880338
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Size
30 KB
Subscribers
None
View Options
diff --git a/lt_presentation.ico b/lt_presentation.ico
deleted file mode 100644
index 50db7c791fcdb265381869f0f6c8b65f51530855..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
diff --git a/lt_presentation.png b/lt_presentation.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b0d7e02e5abc2ba142e6448a4d2bcf222c73536
GIT binary patch
literal 16577
zc$|%UWmH>T)MjwE;t(7P6qn-e?yjLgixhVc?ozzP-HI1?C{Wx=aSiTnK_>64_05|3
zH!Hb0$-QSE+4AgXC%MrYYVug<Wat0@083FpMhgId1N?WOBEuRJ*YeM>2Jwresw4nV
zpNR2nfdu<ZZK<H83IO=N2LQlf0KgOM6!-uD@Zbahjz9o_P$mFC?3~@MDFVBI{7G3}
z2JrUZBfqOG1$G9_S;5c^0Kgvj?|>V2Dz^dv#0L~*Bz3%(Pjh_yb><)6#P8R?kJG1w
zu_D5wDKGNN;u%`$B5qZAK7RP8SJiZscxMcK`E;x&s~n52H;tP5uiBuxy1Cn~IyFS8
ziPaj9U@1ca9`W6~WEF0x>(t{5S6hnV*@@TQy5c1C_J{s^FVXu+pIo;|x7>X};I`F#
zrLItpn!#_E=Tl%LGr;{acMQZin~<S(Qj+>CNiZ@d{y3uEd71rt&~3Ul@V2TTgt~Ls
zrB&**%!-p_rhov7M$;npd@)e=iGo}kPUL!=XE%h}A1&YH6vdL0#AQwawe9M1n93>6
zQ)Apwgl4-cEGlqoYKlX`(2&&C)%9<n1ajz1^vbE6n;Xwhz1UwBz}_l=V}hsIU&`KO
z26dCc>u0mWw}u98Ofp^)Ao0SV;69KQt`hTPc7?Q?o7-k{^jNxR7ssrirXPSZasR#I
zqKA;^(|xUk_MB|Ccn~Far1a^&H77~V&fZ>OVIlkrRDW}O@V$2zrR{<$AXyi%ZZUh`
z-!Em->P*?x<Y6by655B_cY2rK)rFv|8~QCHBUU-%WVWVnW-_(_u$pGd?_5+`iX4X9
zl$X{AlF5g?9~>OK@LruQ?VCwRtOTq&zR6C{&Z4)hl-yl&k;IWaSj|%`)Vr{Ny*d7X
zIR7%>8O9sKagxNHp=bjz<#66t!aKKR!h<;5dANK5HACJUzd@Y5idQwgjx8MtT1{h9
zAkO4)hz7Ak5UYAGR#?*T-#}F4&~HHCuv1jK_&=ogYMpkBU}igU)X+YKOjE!6vn;Yx
zuy?ZW>Y;1fJ;EP-s4WSm+^PXqM7FRc1%bZ7hIK}K*2%5!27(6Z)FmdewC<6I&{{PL
z4&^e%u>?(S)yIz?b2vE8J1D`#y|{pIJ8>GAPKt6Nt@AL`-cJ_{a5cigx!eJyNJV{h
z+SJN;_I7vsK%ASiCCX1(POr<$1=5j|5Fbk5@T0iM6x8vz$6CTJK8Ulw;FXyl{g8zQ
zF;(j=5;sJ<OfBG-#Xtng)6F5orNh)&0O%}~Gf5|(@Lt3rPv_HAk$fW3n$2u+)oq4(
z;G;y!2x9I&4Kv&!2e_^W6PXUEh=%x@mI|Oj48zS-DGfGmajb^k%&Ci3tYT;|HJ-Dz
ztV%uIpPQG=9X^L}1OVPYW6IHneSlNEV33`z(yy%y#~@D55%wze=a41nh3)I=#<xon
z7ttAra_D4(17-#w)A4C}nLn|kbu-1}r-ncTq;++5DFMoMURnxpm?WI}e?goN#xD{`
z0O|wb&^{Oxus4S(D1k$8E1(=9xbT|v)5o_Z(=qU{M$+`H_n-L10LThu^sz_Yvm}un
zC%IMQ2zr)6(|s)*u2weQE)rwHpm8Bh2&WA&lKif;#`8%!wW?}F52`UHK6R~iZ$7jB
z>l1qKeccsX(A@{H$}hz4Qs3|M(!?#(2d@2--T_j1%2}Gb^Zb37+CP}NzRU04<Rn>^
z8X3~zLXxm`ZW%1A5O7Bmvlk-4tnO2}hPht^Y?DPO0|bE3nNZDfWLyPLqi0f4@@mzT
zr)+ThiEUp{g%rP1EIjCj{?~hfHH17(QD=<(jT(9txN<44D-Mtqk6|ew6E=-fVH7;7
ziWPOdra;YD;*wX~a^fh6Q%cjFh}wDe-9rYNcxZv@A}=*;q7iO#*nDdRc&}xe35vNt
z^#Do};oKybc-7s^$Iw|q?a=(5?tuEycjAWC0Fm5OH(G9jud4kutD!fIsRWGLOt+4W
zMsQ*8Ddx$N_tR_rXGY5ta6M(e+PzTN_4qF-{UDG4Q3BcmMyXM|$ECG=>8oFe%xa0l
zlHyvhFQrg}7mi`tp8Gl}*Rq0@0LfoCo@b9?opt&-xWP|JaEEX}R_koCu#KFo4xZIO
zkD`U6{=99<@M0#T`PT}GChTFXY&TtHG^$GW*Yo-|je|5;gE8OzUr+_DeSGiVNu!@k
z1r=pYae8BAgBu_5el4BDfRLtGe#WW^FR4!fn<1R}t||GLJ}d%2N57WK&56{j03P@B
zDpAT~Cr{S0R@rDQyQc(b14wDFL-3v2=%I0XNGiURSj!q6NM!nedb^T_COuo4q;@Bx
zk4^4A87@BvIc>Qx*;25q<HAC0`$|T0+nhmC{=~aJr``Vld`r~$Ff#vHZ1uv-EeDZ?
z*}H6@5RNnsQPC-br%paAp`vZ`n0ALl_m}(x0e}uXj;8j!uW(1tm!N_YGYEh4l@2Su
zA%~W*Pw7k7ebakHqnwhY(ehhE^uv^R?tCd;(1A<Ey8Nq<-A9tbvGAd_4wu7TxJ7bu
zNjL&*VAOhsd4d=|W5|MS)!g7`W?#M-H3Z}YO>R6ag(&r7yAm(&D~_PP;3oSm?kwy3
z{oBJ(v_z4RV7L8BQypXk3I1qg9rEqlPy3KW$oSrbW@01%M+>Mlj>TV7FN=Qlpi0mB
zkAs(=F~o#sq97AQyaw49QHTLoSR_WD`ag#HTKejeB4R=PtXP(h5<fFXng@I=y+Cn2
znc&ytbf%8rFe&$((H-8xyUfb@_;BLxw%Gl?3PV+o*fZB*&>Sakc%V_Put7g}Syt{L
z)nuo@#_k@~vj*d}26MUT)e0@W@r%pBygt5|)0;9!pF@4Q=`$w2NyS=WR0$PTI^nB^
zow0+r|D5FCmX(1T{6l;ZR^2Ov@9M>;qyFF<fqCX)053PHelY%dC&CYzX0pV=kU1)U
z-2ItL-3J-*Syl<qak66H<IB1b(BUWwn)984QsiyP#e47}j1AxB<C1bGQz785@9P1F
zxTqBVlkI8~%i$IO$>KMu*rMNze`o03dUhGIFx~|IWnTC+Iq-e0>PY=Abq62-!vBfa
zlp2<|^O{S2`;{k@c0<my@Ym`YWdZ$7XdW@SxcTuxW;-U7CNX3VTmVUvFb8|Tz&Bv5
zgkv!0oZHxGLGg4T-fmZSiI5CdTr}%Oc=X;lFmsZ&PU`IAQwV$$mE^~x6$-_?V?1V~
z6ZR%58t_5a>W&!d6Qy05=IGf_DV(-MUIvP^rl!nro&f<SN&X#Oxm?5A8%V21u5$38
zL0VIz(j<}In}mfKZugY;D-pHqlS+1Zf16S>FMY+eR?`fLhm_K}>9AXjYHf+q`}i`Y
zA`Q+Yq1?dP5IlDM%C)|oz^>~&|74gJd)gKT99ulaVw2Aqx*^57X{(O<L)T~bQ&WA0
zjiME9*EjI4Q7C*_PxjJwKDs5XqqVCgHh;X>H=Pb%>1)(>n;-e!SNiwYrY$0gcnV|d
z=|ff{u$V<tcE=3~uqo32^2pGw+bho41Bb0U->Fx!_Sg8jY3(2RU}JLxGe^dQv}Lyp
z!M$Nf!Abyy1y(RMD(82V!$9>wqeO~<yGSZIc?XBl1))|~24uDG@Y+5;L!(qtFoc3}
zB1gxXpnyRY=bse_RJl>7FT~NF8N}y6+x}1<dF!9!-<&(vE_}P}i0Nz_%)&pruC+p(
zdg3|ss$&iwhtZ^@%!1h)Njm~x-NwyY*y(n0WRLFfrMR!KMQQt}x<z7fu=CWHP#;D{
zVp~6JFu&JJx7sn4?axrBnYOE4OvAHtL(8L4$bo_LEH3pLL|@;S+>^~PB;xIvahnU_
z%S69Nm0kfX(zCta0(dC|0LlTP0+JFI)(lT-ng4xY4_m}!KUoZh1U=J5Yy@_EI9Gov
zhEh;EHG^&w$g<BB0-rciH_k-DGrH3gO#+^gWlQ2c3Kb-x=<}5(;bjt$G>!xtjNq(7
zVmrJn_wm(xmu6`@^6(K&u7Bf`1f6#Qz<q9e`L6$14XX88*Bo)BK-}LoG&BJA(g^F{
z`Ekw?KyUZ8dbM&JBPp5&x`YJ;hg@7<s^){a`fAPnJ~AOK_j!Yn^5k^QPw>M9zpW%1
z=b1aiH}VIpUzF<_`4(L&NA~)S&9etzQfRyQ<yZ-{07f@A%BnU|`oDwct6Wa1TWBe@
z1#EEl-uCzpL_Oo)0@cd!Jv*${?vPem*VqMed^1PKxcmmu{cptI@ZBkD2ZD2y(?MtF
z8vsTtHAbjWAbPGo-%RoEnNsX$-~Ge#>et>+_>@_~l$KCJ$k-DR(DtjegBwa`A@QJ`
zXavFTr+=A!oTP3Sz2=_V3Ppkk&+)_LTpl2_p|tzaMZXlk#HE=2IdCu}RRaO^%)z{V
z&%E2H{e)7NEgYF64kcYq07iR{|1owNj5B|R_f0`deTtyr%fg~mU-+9^Yk%NJ*|CP5
zqZV24c56=Jc|B47crlQF+(aQ5GEm!<;1Wy3{KRUvc@gz6knyGd(%UL8AQ<9&oTl6A
zbcDL&{)A|vsTnfUr3!~m;M`_%A#{p+73cl+%zO2I*ugorZy?S5Tqr)nkuniTb3Ny>
z#QH4pg9sTdkyDvffbkoYS#@nF{^8(mg$_MP&4OmH#xV3)uO_V9?XC}U3FG3T3J(Kg
zN*0Yv63m0+Uvj@SJyZFde*6U#DSwu>PLhs4HF)0A*9;E=)uY)HsSUo3lbjL<)-GVg
z4!)y*en**z!k&Q<s&sXk6D>V($8VJV0C{b+6Zid5fY)6ncjwE=6u00wJUL7`aK@m#
z>G8+Q5NhVb;JDI?H{jS!3RW*a^%Q0$QZ`}xk2;L)h7{D{x>Z&U+-Yn6u7L?OG44|r
zy~j?B(!c+^J(8H1Kl1)OlffC-&F>>%_BM$bcdCC96p0;)KtVyFSvGg#DU3?fYCp?~
zd2CA3{5DV&uZTzjGgj^2Cin#s)aEI7)oQPBXBHR>1Q;a(`%1$xT<(ezt?u1Iz$`%z
z(*6*RAW2DU27m;Cth>8=@1gs9SC++7Pwy@>9hL7PV?A##bua(i_Almte6;IHCPCC+
zt|c4iGJdh>!nnL@Dcj0rrVBB8Nl5S%0M0Z#D~Kv=;3{wWi13}eqSCCZg=zg<@jy3|
z;wIxh3!+0eQ9kpXy`Oeant>4Z&fFefj;whN{F|ok*w8Uc$l3@b*QN~kn>V|%>skP_
zQ*@h~c}erq&-~O+S4D}1R==a_itN?{h>4pWkO=H_Ked=CNZ7O^4j)~8x`kQ#kWt>U
z`Ki|5k1QhN_G)9yv8AZ1i^8myq(uT2)2$}#m>kF9PNpB}Pt3kdV0U_5`2Vn1xu?Y-
zka%7zkrBI#CB9t32?Qh9|C4cFClzs`BywDhiec9FXDA@hs~Y6!trwdWEC_+z#)uW=
z_kjiH=QqPHd``NiL@>T&2~MD?CY%4Wa|$3QauNWmtIOUUV0^s|SJStwU5LHAgQ@58
z5g{yn;&Wp#ZiwG|oZ;SWXPoICph)7fp7CfCJ6^*QZn*(({%R}3kLeFHs@EH$eKA3S
z$9!L3?^;}3rYM)n@Gy~8-Ud19Hq-QzjJL0OuYJ2XvnHI|R?)__WW=Tq-TPtweV@sd
zc{43-0i{q?UA#YO9DQ9z2f6vx?}?XPoO~Ic`Q$Z5nL>B*5Hu$j(e%WZ#Ws?wO{{fJ
zBhR>5-v*(>L{gKc|Bg5Ml_*eRD;w-;rhJInqe3*Z+n>Rr{|UN1=qw+##X-si|Mv0<
zZ9O^bcv%5rqb#qi5Z<RZ8dXz=ZN@;)<=a$joL|z}%CWw)>);1fQ8C1xXI{~E-sO<C
zT5i|X>4|IlDbky;6R$e*58bg0EwEF;d{?Imi#*{Yz00oqw@Md0E*P0-C4py>mN%tn
z_CNO%cq|i_75O|);kB8LBQA5!WeIrLyAu`?vMMW01>?fQ0LQFs;C6m~dOv)>bEC)A
zdbDC#E6_^~CwIe__H)(Sz+q9n=avrUhY^%~nJOwn3I74k5ZQ$|DIW{R#qUASM<!Ct
zzf<b}dKn&Al2WE{A&*vL|Ma)~F^^8YetBGRzdpd|wT^Zjjo$!uL&xBHOVj5({{AJO
zhXn9|srI>1@Mtx#(>g8!7SUt7Qm}|B6}{D23{0Gl5mn9zp(k)jSFldV#kJc1PW1dR
zP+NEX)&6(KqtVM@>q}+jq(}e(Wg_|M>1Tl)>_2E~ode=hHc8THH+Zt}SrgbrX1$gR
z=9I7NG8-Dy6wN7{8~mc8D=N1zjl=!!cc|YKhtb@Cu?+d_6^=Xsyp82fQr+u4$;x6F
zBoisit88f;SvDF<Mn%oE1Yv~khu4xXb~;h1y&fi#=B(R!`Ce32GhRM7r_{CXq^Z}K
z^&;@dSx!`IbJhuLaMbBlVV#~*SP%u4d^=&%*Gb<Vs!y|kCVn)&oPrR~X*RWEp%1}_
zz1Dt}O8Rr3Muqb+sEw*4&;Q*W>YQITHE4T#u=OfZ9Kdlv9ZqOmP2}A*8a6a!{K#BV
zXYiAWmG$?@F3ZK_zTehYdkmqy&GwD_sreKQUe{t;YkV}>lnJET;aCwm4ZEWs(ThIK
zgdFD;@k|fkDTn*|wv3|AI{U@#OYdjTcomB#BTXHhFe){wc+oHH;Yb887H@_ox|(5P
zkH~{(KCg{a&UbllGRNQOUY~S1y*Xp#6Nfgl9Hn3>o#*bkqEG>GDp%AG*$t>ab}iza
z8%d42>4V+vu_pL-uS0FdG0v#gyFLw=*$t@(3fj@p>D4em4ei5qU!B=_!In1<65YNr
zgBiWXZwu+B<H_!gk2y+Sv8ra}G=eFHlPun)n!<_uJBXLe<?|TP^L010|L&fQ3*PNt
zZ6rvcoBLd3B_@c{>G#ZM40x<vSvk@7SWI%UYw-d56L?co^B5073vs{shjH$lQdqB*
zNFU){1b~}9Vh8-#gEqYVR@@d}9Pk70w$|%jGBSv__ub^mOo(6vd-3)GVk7F#bma0<
zsy;lgoY9{o_3z-qjN%Ye^gXo<V#zPN+2Rq83Nh_v0>H3~MV^&&^RLZCa;N+|ryz{u
zAy|$OOJTHJg`r|HmnEpj8?PhJ8$RRiJkh(027?InFNTnl;AvH{gqjjo{gx=|z&QgW
z&ANOgaS@-P^~26LFmz8Kb=l7$>G5{yx2|vNGH5%c$L1aCA<$>C`}K6m1OOb&R}s4l
zQRFUlQc+Ri@c$6w^gyklm=!*BUF6`i7&G;f#l*lV0bNj=v;>N}(iR6Mu1z9h?<<tC
z{my6&f9RyBdar)AhrT)c`m%UAEsa-p@{B`+O5!@kCeYzRC!$w%!u8ZCVsgEcLPC+`
zO}CcDuZaYBNLC>tBI>tqflOWR4``WF-TmZQsFu#Fs)^|V()J}MCT!{?V{<<uQ=H{+
z)0WTQPk<H)6#kG=z)(hV(}I%(PKF35iK_u~IP5YMudZ9CU&5jBEk3?*9P8esO4qK*
zABKB~*`%(C&FS4I!EJ6_f{Nw|5(r*py=Ag+Hvdo;HT5GM#9v)hwom{cVgzpY#pMZJ
zXJ?9B#x~y0hyyFemS<+ZA#dR{Dbs((z3~-w7649Xsk8>(9&vI=eu#PSKh$bvqi`|5
zo<ccFA$qL{g@RrvctXR>f6%xHncCjz$dp-dHM7YQ$O-_lZ$>Bj)N9Czn>WtzE}z!h
zi`OLwnjO$E!~xmR2S^l;x{;(bI(6%8V7I%i%vb=eiRYB)!yfd!$flelP6vHEni5Pa
zzMs{KWEP0d@=qR}<j8L~t#$hqI*>cEJ`H}UGK*UI(L)n0D*y+Y&0jZoZHi_ZyKm|a
z!!=+{=VhM!`)z&Yr^O3rfWk)Ii{H_NW*HBiW`@+=e&gG7*>Wwz2U}+(x#{}{q>8Fp
zzSA}0x#@QpmM&aGop)p~5KRqo+}L$}+`mitemz026?Hi;{=%#zA4y&}`E?Qe#Af`-
zZ2$U+&pX*YRy44F?akEgc5ZD~o$#>hW#gp&4}X}tYuA+zg^)?~qbL2`ld_B}zdAPA
z6~7087gG94dO7u=c72hipaYrXN+)UP-uNLaLioI0ys)D=vld!2o-7^=L_5_Y+wA}S
zF?#JW=my@!&g{3Tn<$BKmaZN4RqSEw8o$VF<S@lJ3*|74@oxu{TK3-=o0xTW->dxW
zcoH}35UsJWp+6yJr_Rm&{EN~iUlLc8hDxHc`fb(YI7wd*IiDqpkwRPNa0r&dPd$rl
z4m4B(cfQrVoZWf)w|$cRYtL(><#+Z}s*LvQ>CicqR>A#|J8J?RMl2pJKXBS=wC)BC
zf7d$^-5}C;;$8BfVi3`@A2o|~#j4V>(Sj>}nl1U+0b`7?BxQMwOs~E(`nAbO0<~{<
zqX#8zt~5MnsV+d+?)7<}X+b03iu6Vzl?Q-K1_yb0@b&8rZ5$pc#R{@kr}%odcsB3z
z@>Fv3>I%J4eB@VPT;pbgQLE6$Rl)D+ERCVQwno2-ibRiG>VLIQe3rMhWq$v5mC^bT
z@6>CFrWW8~b857cKpEdT3i4VE$~o<w37fM*g19V#_^QezJcM$3h%=m*L@94Zr-s+?
zt1eb@K1xE3C@4GIp}gH*hE{O5%U=bW?R1rPIe^^sCD(KD{WZO=+8`G*noSK$TU#08
zb#I$`;oj&Y;|dQU3W0>k;gscBO}#2YK|#SkEGz>%jCsHBlD5DLTfGJQxdVhO`XR)K
z0$qs5I3FPrZg!e+Lb=lBMfpdw`a(I_VM)cK)62^-+1bEVfl8|8T*v-zv3+V9!bdAy
z6;AAOsbTW?KX54e>(f}a?CfIhJsWOvgmjy{h;d>{kTPE7$U5ky4j(QRSKxfHC}Lth
zIIt4Ha@3Y<+jNVQIjWT1n1vfKG9(1v<h9zVz-6Vm?$>rYWO(K-F{sylCFfxt#?_Lx
z7pVX>l}tnVaD<iJ1L^5RB$&vl9?S0UWXt9X^78@W9TxCs0e<!dN|!B(Ef%*6$k0f%
z-^YXX{2RZ6&EJFytk-v@_xCNQRrzV#a=$oBlK}&Nj$dF;AK>PHngnM1Lr;q*DVzte
zeta*&R>3Hh`OZp&fsTQ}1!FeT7mxdOACafdgX*A6cl%Ued7V;M{{R(ntWM?SLv&@U
z`@#NGqAm9$uDZoAzp{kiPR&$U%Ntf6TN42utwFOO0b`>&`;nB^R=*Zn2CBD<f$4o>
z`gz<TZuk$@n174mnJD<N18Ta-RP%yzr+oywd<%}!jd>f5s)_-fW=`;9PV%qTU1m6l
z!SarQVxPs|L|!k~&Yzl(u@=2f9m*+$k)o)d1>vdwJ;_?0)p28TjD#<+h=0kgSkjSV
zlKEDgngOdJC<X@yTdkiZ{PpI*MKo0y4ni|gcoSta?N_#~E4!y3+dD;Wx~`P6H|ptX
z{IGi<*qGVk;yfJ8NW6j=004fjH+;nGY-{2^A{>6uD}gKe)wkTka;rUOMFX{99kxRl
zG?>*A!(wQw!S77c&sN;uA1W=jl|duFd3kV~u{HRX8<#BbviSv*z3-k8w&_qEZiPT<
z_$dfu<M8MX9%7*W99*RC`j<lY8=KXuK9ttO>K0DRCGMTO1fY&p<<H+cyJId(Z?Cn>
zi4?>!hzO_4O><P3I~YiNeJ=iANH~+RksJQbTR`8~5^QmI+*~;?E6Owky&SXkCoy3W
z@7O|)goK241NcOT3Lg_2TYp()q~jzAa7yqmHhDAic^C{~;rcmF{AknMQFqrEx@hF5
z_)oYlC>XCL?lh7#6r$gGSPIi3EF9jaFz?zEdPXGl)I;e5d&=H_eJk(E+l+BIM{yvB
zuAP4xg(O0|6lFET9%mVNPuAm`i{xhl_b{2jg_R#t<48l-@!vnp4VOuIbK)LiA}99;
zYku@N`rEE^UK9nt*ru%p=lrUarzB7ZE1pMMHssbe-mvAPWc4`7W}GI0ac%pQJ2)iy
zzl)e+)*K^;A(|#|t+FBFz*exTCeb#DNh1}9NFY@V^eOI3A=8uFwO|*mnps1^$hNjd
zsR;sd1`!BUyXqaA#FeT801g)v7b6n%-kZIV+)i%N;K|F3Lm_TVj$(<~{qW<j^Vj9*
zf2Ma_+xj~d=WfX(KLD74nYeg`3V`X#3hmko<y)~Izu*uFIXQ5O&U>i-J0{bK3??5|
z1>zYPa4|3n_(=#VfJ;(EgVDsE*-|-%Vj3}YwD0}zC?kTJ2=n|VE!NvTEC?6M@tqBQ
zXjU2IU`cvsZ;zIdv5j--2C9eX3tx&{Lg1iE>{9;35Vzcpvfp!yuhDJq8F2;gIn{yT
zm9rSqHqX(kvp#k1Y2RqL<t$)b6P;g>rFCON2cnNFDd9w3M1oaiJVz^eK;FL7Z;zep
zaUVPEwr)nruT?16GMl$PrkdQar5bkF;$wG1u}5n=*guhmI1spqX(F5Z<THXQ-Lr+l
zr(i^$qD;MrAN<YSKgJTj7Ds4kwd~y~KU-+U>OS0oaraNUO8$zyDi8s$Jz|_n-8WSS
zY4e{F*yaLt*>IeJEqWXU-jG-~??7lpRDaM!KKJU)t6k59vj6LNW1Xpu#$Qo>@``}B
z0Ds>p(F1{i<(|`qH~*;qe-{>i^X_tnmiUZ`+L9R)KW+6M5)~_4-W^^^>hIyV${4sh
zH4mN*B_}3YK+t>=d4nMrp`?}<+owD(FP2+y(v($%&~&zxw|T87y>Wty^eM}F&^;v4
z^3823IIK7TUxwqoqYvW=utnkGWRGKJ9Z%So_vM`9?--x6@evadcJ`$DPpGH<9se)L
z%!Is4yXtyLOUp<Uakn5^OFR{-5;HsW%<F|_I@siCJGPjjs^R-T>Bx)Pj<f#opciFN
zaYoeE-Su<OR#<@rRL!K}6C^q|s`i_bx%yxI9s~!>(FlYuX;{<*)h%XPr1-M*1m~2U
zV4Om$tM3|yF~j?&3CSWGH>s&2ZZL}daNX%+VLO=E`OG~EgG*VOD!gHHF^_e(Iu2Qp
zVd!hF|FJ62=P@nntn-nOFtg=sfkeQTd&pbntN1)P;tnJWJ?q2BG%*b0*4_y#7CY`d
zcS^=L#mg%ijzI9DdbjZKIg)&=B{z=g8Gd-{Oi}uBb)n|S{iMLT!?e}Cf>f^xX(;*A
zxCv!$RC4Ru!>6T&Ny3Q!QzpBxry*kO?8UAeHnzn}2o>a_eM5%ewSa#;%9!6#=5W!)
zxnu1QtaceWxey7Vl)B6ktxt|*S|F<mmLrt#bwEFCR4;xnfkG~P@kd_X<)Y9Z)u});
zahKmbyrYH^ITs?q3~E{i@wG@3p#9V%?=-^;t;vi1hCv*Wvk`bjk6mj_{N99Kn&t4l
zDfu=*U2KQv)?CM#)b)B-1JuLEC-d^8vGuGZBmX>GDE%LMwuWIGx!f&|@V-JLVU{{y
zQAeS-T5oT8$qo|Z`oCcMG<P0tqRU>7(@&S{TgW0EO~|Kej{*@cFEJOREj4|*2ui}W
zsvy3sP$Kq{)WV`7gj6jR(+0#x!mV%qW$OXN8St*Fwq3U|W&Sb*F5YWGC;k_btwy^k
zf$4FS@wGkolyYmHS#Ryh7s}@+L8XaOPT$X7J0jU-Ob9+cTG+6XqKRPt_l?J|Jw%mz
zo#dfoM-u}RGu92G(0gotYAtDhXxN9&i+IJ?lTOM+6bA=~1~_h5=JD*H@J&Hms4-&5
z(tD0A%ZuPwWuYv~1JTs+oAmyJo(+t&tjBl{9XJJ%n+KhXrn)bS`<s3Hym-n7ASgTt
zpZF}@EtyC)K|<)+y+*fv8}J3sSOeeo=F>=IC!U5a>Ffb6H8)WP@dO|L4+qCZ(ZbKh
zoUvoEM3E?L*c>O6kM#%jpIInh4w$-Q>WmVZ<s-j1W`m(+2?r(~Ei4m;zc@`tM4SA#
zWlY!`e`j_Tz@Z57thslI-$rU*-V$^mZa(*j4VHPWVO`f-Hk{Lx<pbRQ{p`E39t+`?
zZfS1rKgFKJWb11DE<MKOX5+1N$w4M`Vd$XzyJB6(FSbAi#v@eq#^D!NY55j-AsZfS
ztu|O{*Se0gkYyURRnAUKIa51D{+;Nz)0I`)SDyybw;BgYH;s%-_$Oi#=e4BuO#Yvk
zg7A^?j6W_TYmexfpXf%>FRvf<^E;>a^Eh^QygDGt)3){Q`K_&p`2YQw*6b*IJhLhA
z&`8c-=sionqn^20+q)EU;JP)f%u#UW6cp>NlE+fh>oGsibfA**UKUZP@aIR1dIJp;
zleodgA<)~So_p9&_M5%e>&)p|VsuPH8a|hTKfebPD1?#SfObA+VCoB+8Sv~ZXv7ry
zz(8)cY#6I2f8%}8&<Pabb7T5|9?vYU&fV|)oJ`1Z_A_1}0*CdBH3wby*QidpjRg+!
zC@NK|U8mcUZ13pz`+p`TWF;lxjMTGxH@Y8Hqi6)*d4z|PG}z#MC{>ZPh#BEX>oqb@
zOy}qZ7cG5ppWEL@2zbhOfA%IwO9cRg)bfVb%W^{)dW$$xFJp-;wnK5AimvFr*1fM}
zGF9Hgp8l@S@aaLWoL}FHM`=X_nphyIgP(%u4rLS-6-N#8;G@6T)*a53EtL3D4Z6Z>
zjnX*(?04yQ0LlwfF}Ywl4}BfJs{V+#W{zOn+;KTJrS|EtiB6+tQ)~LtxqUuicSWs_
z@QYv;9Z71OFC31kFwp|``8&DD0k~L(w%@rheuEqe7aodSFh!`JPeVT!-%^CYm>WdN
zhy?fYdAzrEFjjZu(~9o_E_SVH>^}q)t9x?a`=LzPSnBpQflg1h->B8zj_2#Gp7S4c
z5Utcb1%P!%)h;-M4t(U8$Otu5OH_IPct7czUSRg-`to=#v{<-WYwo8@7=x47%BPP@
zhf&KFa6r(z)0jwv*s$$yi3!^w4E1R?5otSHBTEC{=&Xi1Y2L-;If{|-@hYYkbYWcl
z=Us&vPP?Wfg?UFxB9x7!ew03l8QXvAGv}&^-&Y$1&t5_Z{iSDEj=uK<Mb+j8iS0i7
zrSW_L{d1doTnJUzeK~aZB_Jl=N}dS!d%MZ2yV>fB6Z+Y1!FzQB&zg=ckfWBGo*uH#
zvx1PxWhrM`c|UUk`n=!P92QOmuroSsh1QxszH$7)du|Ty1j3b0?j#~poKuY*`cTTs
zZFmJkG?L5i^QaDx^pdOYzoZ;m|Alec`fC&8(SC6!ouKFQ@tHsKULJ-4_0WnEKDxrF
zHFc5TbOHRI?JFynkNE1Kf9GcEZH(0ICJoxIG6Y*+ubL|FA|g`5^Y9T>V3-(Z{tFdc
zdw+Q8{YmaZb^vnO>*$r=!i;mTN|BK9O7T_P*2}m4b<Ed9yqJKf3ZX4KY7$TBUx6V~
z-HXb0tiY&+OKe@MFiXhL=Wdu!ya~GzIFc|-EX?Jz+gC=kJ*j5RT<vC{<v{El1{0`6
z0hUql7Y5ZAqnNUt*z&(cd=KCE6vD$$MsmqI<FRGw)YE|O=erzKScwR8CH_PT@RS<g
zHmppLgnDH=3?wv~u3X)<fR4bl{ti~=so#?)s*`+XTiF4`b)px3{@GvWGk=u^Uxk>A
zlN)a3sU>47DY;zX1SuSetUO-V<%rkb9Y>EQkvskVW&ZjuLdv|IM+#L)NNCfuL%Y+J
zn1X_WiJg6DU?F}W;QSRuO?`(le2wnY*dftZ@s$WF6(9+SP9aTW34JwP$kv!xf*T&b
zZv)cDmK^1_zZNYQJC(^$a;(LjRS$#Ke?0Xsi;ds1VfCcG>FL|XsplB0*^l-lZ;>-K
zb!BW=oumt=(AtS;@3|n!p<^M{(_ef>K7m(mpT%7~p_Q(Lh(A)Qct~*Jjh3y(Xk=_m
zsBXO;cvZZdn8CM7gpplc{n{4L*jCM>S$fr{3{zK?m?*&>J}#D2aE7=zMwPP4a+gRl
zUD9k}fg(9rlTl*IO|jPA{6|LU23sc?VEU_v)QP{n17C(Xe_+QPf_#}=OS?#*a_t;T
z|Mr!`JubZ4ey11>?;m2CSsgQ40&=9k|8f(q4}PzQw{bm|%%_6!5lQHN?xif$QY~Xs
zVJlC6LuHGPuWR|mw7i=E`8glUG1bE0pF7C*N!bCTo3CM*4V%mcA!^^i2bplU@V%n2
zgzh&yzN{%w+OP*<NxlStT6O*a(yqrE-(fYT`1c2eiz!Pgx2U9>o10PRg^-YzF~P5|
zv-Fr9*J^KXQjYAdzPISYYJWx)ZC;S0*)WLvXBIOreBKQwQbi`g%|R1}cKkm3O=iuN
z15zt^W0=7;HoX$$65h#S-Yn4K7&Ao{u)RE%#QFO7na+iH*Uekg5s#MrxXRykuOspJ
zmNR?q+uKjKih1UOKHPE}&eBGs$N+|cNQi$jI&9~0tyfAHieI=B@>-7U0rX!ID;?Z=
z+1~A-j<l}Gcp++4&S*FjficLdoK3DQ)0aY(FIy~C(Z~_TR0LbwMW{SGM48k(cCrx>
zh2P7%8lbOI#ygpak(>u=V%P)iCs4F<oqBI7#R9#|OJ)+uQN$P-4;?)RixsDjA;%01
z(vM+i0zD4KTKnm7<S5#;H%yZnUtPSt<cih~CC>%)t<YsADf8Xwsq;5k!O4e7fZkNP
zO{l&e=rp&{C2zp3S5#l87vkEV^214uBsg$Ac*7@mSQH-_G*Po0HtKU8rW9qSp4!YX
zXl}@uzj3l8@HQilmiJ?&4CiV%PR_4Guv3TkN~-Kzb8I1ro~`odNyHXU2Q4*;mzpjj
zc75OBSJSDi?MG5(>nodCR3<JD2`*MgJf{E;%KDRF5fl+lTil@xVrq(7(P<WrztT=h
zvT)1n=ZWH!ow$wJzPST9wUl5k>(b0!m8PrshgVUXhm*!IKR7yKwvhSUY*RWjOjt&A
z?Ss!=siP^lzWVTib8|0i&Zs#bdZ?Yn#PUZ`KI}t&MHqD-QXyA2<K1`uUj*tClo9m-
zSG!bTgqkD$s4x3*y*o;I-<0CVC9WfHhqN0%Wn6z39N?-bRJeR_5mX^eBWdw=k=oZ8
z&x#!NxlXMj(j<XGsEYC{Kb%3rS4~t5+6knPhhE<eC|xCswU~F)C`I}HY^U-D;(kz8
z!a^W8Y;{^|_uvE@nKRXKkVNeZI%li*C|LAWeDd_wn6ryqgB;rljkA%M+4UzW-AWto
zjxPQEhg~)o9=zMd)vjJ3j!iR{z0!&oSy@FVH>0S-W)d|c{)Fd^G+<=8#g}zCI9t;C
z%gOvN#C2@UWxm0hiR>e{r8NRrT2=4oBIVl!ds1!UNocqwR8I7L12xJM&!1|ns7k}e
z&+{cu{<i$^5rOLAv_+KoP%l;4`58|Vk3+6PX3a@uK}v&a#Iyj6d}ZZ^<Oh-q^S5xZ
z6vm>n+8|j-vqRlqPhFb;7p~Fw>O*xaj?!Bf7CFW|{H_zsN8!x#9EC0`eAye%ct7q>
zLtExD@}@?DU8bp1C$gitHXc1S#`2iW>+7u_%Rh{&dROwRPeGn&7!)&js(`_>7Km}@
z-QNv}sUMF~_J8Rw0IitV`u;%A2cp0P7O-+BgZ*QX*E#pjK5_XE!t(PQ(gWcDxy8G=
zGW7u)-jId;a=mW9+Mm4*)n!}nAbEJLkcL+#?ouZrS?1YIbRe@0jUc(ijlT=+Y>yb|
z%VA0#hQb;j8=E=Njk2Z$K~oO43WgvR3gPbdH``DMH|iD8dEwzTQ?T5if*<!nf08eW
z41E&*k05+WIvx{Ix2|QASuoFn>1hp96=HJ7zo=Oe);u0ykmz!l>FudS7hLW&7BNx6
zVQl60YVkR~$t0-A+&f9*i0Q{W)*o~lLJ_FT#DNYRrh6<@(T#COA}A%a?f=%buiB&Y
zw7>p^th2DdrVkXb^ei0NldEc@kei8Cq(dp<Tu8cU+8rexL7t`q25)!NHY1Ifkwm|B
z+@YF&5*?cPAQHl)HG!plBa&#r;6tL994Xg@PeH-HbJV~-AO=tsh9A_XX|e#tnsoOz
z-T!4*6$pC>V_Bb%{VTD8ZZ^Sf_ZJy=2{rRKp=I`27BRz*>ds`aZIeIv4oPLr%uFO+
z<3P(>X<fJhKj*Up;JeX`Ondjxu@ephg?Nl-;K3%B;H{H(JNw-MDF5NC%7I*Bdw1-l
z5%Kf%$nUO{#|n6!XPY$lzkMpAwGj@0`Vp&L)e`@TbS~308s6}9qQgKXGh?Q&2uZI`
zCZTg|naL@tzu#3ncPJDz8WGjWWRPnY`7h(wNuY3%X~>m~kuD+U6WE%QVJfh3DVTUI
z7`=dGsJ~OiP*Vf~Vnp#6a=Ot?n*rf9K$ll@H$HH$6mp=x5DC+B;PP1@vwruDND)ER
z^v9e^>>0CfQ#nR3IL;euxf*IyfRkV)VLIrpM^rgA!e11!nbO#)>XeylWKM>k{$S)3
z_URi9xrFZtTsJ7c=1l*2pV^GS5dH=5%Rt^AqVJ#&s>U$LXv_$TP1eVGtl0ulGi%U@
zkSHwI_!IZ-50<KKC9g-Pv((nc88MmjO4t1B5>+gt`RGfEA2bon7p}0O&1h*DJjW$7
zT^cTMK{3s1yrg~mi#~_t$Y$Y>TvR5~dajI%ux$AZhv}rp+A1>c<v3<qV%QGrpPi2A
zeUejkZKZm2BiUo=RD<FrJcR}%g$=@P-()`Up9Sq^|K%1qi8&%qbJ8YuPyrucgO8z>
zgUYf978>4?b2+#&1k5L%jFUN4`p?Tsp#T1hBWr1CIc)@Q)aTd|sulC^pPp<6gL>|T
zk}5N-ppXc75p2R>jGg$bI--Wh#%z<%A+g{x%EuJ50)WTJKqCjw+YS1}*I4J}<>7?(
zfs5o5rBpt_#XTrGl2~z)e9Lp{Uuyia>B>+Am|YRdNKfzo<g)$z2trCSF$s3vO|D^h
z89KZ`KqY*2zoBnjM&`8p%Y-X6%W5L2{$qM3gc`gr=-p-Zol5P+k!|=A7qP%?m(s`5
zx;@)?Tefx~RIBpg>QHG58vpo<y@)6#S-OyS2>`Ry>=y(kj`OT1+3f(@+ugJR3lsJ)
zWUj=cgYW>QQLP{ELKIx!Ov=Oo`O{?dk^(>@k``{QqJ7(c51(z?Uq^T0rn9lAIcZR7
zez{pw-$tOUQN0&f%VB4j{)k_AlUlva2T)=bNVq2cF_(RFUuP7S%P6oGED?;eR!UEL
zf$(SD41f=mbDt$FA!Wk>BVWTg1Ic#L7t?U413Uq8e6!cQ_O$VeHYV}eqF_j?9K&cy
zrcB_?jJ!h#HNm4E@?M_{P#^(e3VKzd{KlgdjHc$r`0JRX%?{<2P<F<D0E?fg;Vv^-
z8ce2i_`A1XxfyU+`-|=R=6@EVv6c7<rCjqUH-;IIFz^MCbKu6bB^<tf-{lsxk6^Px
z*^3y7m*cLNR8t>hBehh+uxeBGlQ}e56s(#$8wrnbg8y1mOx?W>-eJtQVCz*t5LIs+
z+Q^*Fcj<9=-2By^YFyZeQm0tK{ozA+7Qa)?u1{c{6$0unB*bL^d?egBJ1z!HU8HTc
z-J9;GeUKn2g|+9$>#EfDp4mC@eCn)STYaodxhS=0b1<b&D12V~7co!0cea7zIuFv~
zz(_lWv4V2=O@T9OrNd83BcKF`a3mbCJp$g;^i5*xT*P>Z|0h?b^PN>lkbheQm)0@W
zR|IMg;Be1Rs}X{X_K7V1jXy4n(;t!kc(fxy!#4N{P`_Swv~2Pu7x>wafgUqTp|mUj
z^CLcV0RKdu_#2f{Is@Bmi_i7mKAZ^s7X;KMgg;A2?Tl+3T4Q1^Q+_+GQM_jvucJ!<
zz|U;)pw|JV3<kEEUSMP%o)ikclw%q&xHvK;70maH@M-4SjuU_R244s<2|qBO#ag)J
zMl^RnFg>B6SoMg{Y5iwW>T~q|qcNQMRdjDnQ2Cd9K0*mj6#-xF(bosph@ReaxV(FT
zgtt4G!se3k7*4fXZ0Abz+<@tTY<BNws<z|vmEwT#BvH-@r1I+CfdTJ<NO)70kJ?II
zfOK|)y3OzI=^yB{nqfj!OeOY$30dzdP<o??-;aZr`+x4ZA+|i{Y<Rf<?|Va#Fz!mA
zucT?cs#$z%3d{j8PdpaHZl7MccMq60{qT`aXlo8kklL@z{1OIfZNea8)%ZJ0g{3Rw
zc)h3E#a!YBP$@{oMo6O4VG8Gk!)K!UeahKRuC7`@KpmJd+pFs!+>ryfe?!LmHDfX}
zgF$ei0TP-1{jJ3nsE+_59(FO_n=*H1p0hsMa&Vm5oPd7DY+g92zV&7nF+*<|zF&Ya
zTqtaa5(Hyhq{equ9#u?0kN&a?({)``n1>X2$V4)1xve(;p0co_Qh~bx$Ycp_xtUNz
z=MDT3%Y;9G^JZg1%Y)cC>2@r}VfGS8;DBSIp-J>^*mO`3I=Jtkj}xgEbOZYDo*iFK
z6*x{3QIb*sNgO5S|GuB+|GuHZ;{U6A1S_k)$rP9wOew+LzdFamdrtuC{HMS1#|#}v
z+zqGKW^<3;S4}sZYs-yf2}K*Qmc39r#WsufJQtn2P$l90)K+yPYnPGt%?!5uy`6(c
zdFGPc=v;YbwsY;mAf3}Io>>f-ROZGMKNdtlWXIS{j0+VhPVTipzjlnG^v;cQ_P<d{
zg7?kn5rw4QnG40@f^iSfRr+J?#8K!1IFY7RA7A|Euu^BU6!v|=(X`ci%BYS{FIYbO
z<u4*}H!vmf@5KA~2<1vQ)e@E|vL!1C5#ulrOdmfU@e^md+ldoP`@q%~aUs$Yr4dIP
zCZz=r8-!8?6^Vg_;liN!&W$TIk{Rqc^yK5y1t+2!<<w*@Wve9(FhAb#zykX{O+1#a
z+lf<28^T8Ud;v_y3!$yJJ>%VDz`TrqlkD)tlNE`y{+|wVKl3v9i8jx!TUK-W)l)d(
z74{WH0p^T=`!2x^UcJ+OE2jVUi<%3mL@N*qI#%y6x{@h?L#N*?g80-J{m=EV+v_Vw
znp86?rkht9iFcyl>3`-&x*AHgL2ki^L```a1(+&u?g(ZbVhewQjqyI*1ivvV)nU;*
zaG?A&5a*aGzjNc!`fpc&DVH~SCJH%J>WB})^c2DHUjSCVgah8WQ1Pa`tZzapa8`n~
zlOt>>b@U3G(nhCNabO*8>ST~*VKJrvXyklvj{#`)dz$FKe(+OljEIlPz1p;8i0^tF
z4UVZC3C0)DR$ZI&^1hM5dT`ZFjO3^=cP}vH|FTDw*xE?f;lwS;sSb+zgvN&+==8GM
zIbzp?B6r1!lr-oJ)L)yY9ZQ%`X@=8ivmbf3o(oyR(gqlg+Pk@)=M!jK4ZpyN!fz~!
zULHdUl^=LPHtL{Jn3257U&Kg8`UoV5uCAKe9sw=1<+ABquSg$)WeQTIhVYnnAU$_6
z3wt|zRWD{F(F3rK{chf=8b-{cX#U{oSbEM(MlPw);2q<jHx)^SDL2*t1EPKciS)~r
zrJ+7B#{_XauN)5UWHCkXb3erZ_B5fx!*tccF18-@h4Wn~GniF+^Kmz<mqb7g=j(0g
z{#!?aBEg17#j|^U=QbDmS0m125IS}2!|BPYVc6^n0}X-YI6y%fppl8+Ma;k%sfysq
zfEvxq+WIno?E0nRC70w9w#M{2$8;{H34NI<@$Zz9X6!w@Gtf3s_lh7Un)_%F$&OFW
zQ<}Y-;Zq%JFl+_E`>h>lgM<xh=LbB1ydAPfoOfM$!^&dRVS%(OPbpE_u#~LtEOMp`
z4dB}TZ^@erJn^!?I@(`pW%O5=68n6$G?B*H<3f1^VEy7)<`T1>Bzcl|NlB-`*0LaB
z;TDC{`=O}+tO1zXLX(;i*6AGtyY!IoB5Xn@-Mk%^G%uaC_)B`P@OSDI4(zvP!oQWF
z2*2I!`G^$U`C0ykK}&q2W2p;$FB|rcZMrQ;AXzaGAZ5X~<1CH<V2^I<F7ZLo{5^#l
z4l6#X<^>khctDq9jc)RlFRvss7U&WX=N#Ma{_SVQzb@he3G9!97Bkr=0VUrD2pOZl
z<F?axrX|{vSRD>D07?P8<IAK&<V+>kbS01Iyst>|aI@0B!G4DAYVRn()To1FVVfGi
z^7B!(L$8B`Su(0W6kBA%Pczw<lDl_`FLN05DqupWz=KmjMzces5hk$2MgbvXR0e!(
zk-;mSFZz{8<-!DSgRNwIKLJ?oQ04mL2fZZqItOqF?pFh!AC739dX=I8fcIT%YdG%L
zr~@M4l7K)=3C<k53Y<;S{2XQ%P08aC0sA*O+}3<b_-tS#igaxm_!(L=FoS{?KF7Ff
zY8gcKnHuvIU~qLzD%V_@gbdR_=moGPPJ=*J>5S$J25vz2+kBOst?I#T@^_>p$P%PD
zLd%Fk{g~>iC2D`EQpzX{rtx~;9~L5DXkpu(ob!|Ij-W`!*_8`0w<wiQ=|1s`Qqntg
zaL4%qPaI@EuqO_d6{bl<hIL~R+if6$T>hmxwf$`cL5x^|d=%_Ych73TEcOIIk^
z+Ka#P|67st&)m<g;Tq$mu99LiaX|!r<|5MOQ#ykB+4QyeAzd>@&!}^ujWAsWDxcnu
zAB4bGbg``y`VFClJC{0dT80{Uu&t7j0r8&;iI&5JUyb=Vhxt{PCcYP@)=k0ZR1G14
zn#;h8S@ZKwZ)9O^({)0|5p1aoHJyFxNAKW1;M9xG>HWk-9|0KI+d@f=p;z=h@ecm#
zJWdmw2ICaOqG@#E+B;K2U?4lxiWX7&ACdn_i9KeTU5^*CHsFWE@bws4$zy$rAEFb&
zU<~n8zFD<vt$^Z@WIgS_U-=~K_@F9uTf|a;&fXw%#7NkzaOlv3W_-}AO^*;e!dzhe
zrhte%(@{uvsMG>MDi!5w+Y=drv95x3CcFk|f^?IAc97MS_>uh!Rh1Y<+462sO@sh*
zNup+3t}^K90vCzKvlK_W<5`pfHp32Vh7RVz)B|n*22Jpa{sP3bX^f-(iZ>twx82lH
ziBoG;VqXI^dSn~XG0z^P4hyF=13_j+s$ko0TIOJ9V{itf&fxSavd@C6;4ir)X?>l}
zXJ9KKhZ<L%ZnzFi^Jy2=XQ5X%rZ1Z=Jwb2@{Car<VohUIqoZ@~R5adnc4Hh)^sHYF
z2mXdK0|;S5e<A4=C2&eg+{l!(*b@|~@O-4}yY^1j$Q&p{vdx#|^!LTxB<c~E=Ttep
zx|e}%87>!+j;|E&g8cZ<F%8h`bjOZI+u)3z4^FYzwOv-Q{Zl8`Jdg9DK{r)zEBO%y
zhyx-)9+Rw6ht)3c?@?_SGzVM^N<1Ge`&<lUne287Ns0zBG?bhIEMhDYmUqu>VJSi~
zH>-T%64=7W+Q1R9PqjJL(D4N9tVpAN`B_<FhHb#Qj}2t`l(etWWv7L$OqDK~3IB&$
zWOz-PiGtXEmCEM%_@pbSp`G$gqvQGVN{ZqIrC^a>yb7;Rb&-FZbod%*tjiP%n};U1
z<AeM#oHAX_Cb`e56VipmhkGJ42gG--WUlavi)8Sd62#i@_L=w^f4simSSTBEP`kmz
zm<5auv+h#N`}Au(5JAYCL8_t&Wv<64&4M{$(+lqecH=+ZR``&1dm|6SjWZ(dA(kRa
zGL6F3Nfcnhl2?Scdu>?)?vq@$Z8w=<{*Qf5U)3(|f^JHVfFxWaEHd4?96%-9vq7|9
zw|B(ZrcWHQhN{q9lxz$TlM}uBa!&ND-TjRclj@D?kKgnKD+1jf003Zcmo;#=vT(N+
zvUIhEH2`i-E<QF+E;epX9c~_>j~|6NIaxTlV6WbsUDN-MfP<5j?Ps6=M}S+1Tk!t~
U>_0Q_zytt_vT8ClQlOCk1-zQw;{X5v
diff --git a/lt_presentation.py b/lt_presentation.py
--- a/lt_presentation.py
+++ b/lt_presentation.py
@@ -1,240 +1,240 @@
#!/usr/bin/env python
# This is lt_presentation
# A simple system tray tool to send LogiTech Presenter events
# directly to the desired presentation tool.
#
# It wraps around Atril, xdotool and wmctrl and requires python-evdev
# to communicate with the Presenter.
#
# Xfce's Presentation Mode is automatically activated and reset whenever
# a presentation is active.
import dbus
import evdev
import subprocess
import sys
import time
from PyQt4.QtCore import QTimer
from PyQt4 import QtGui
DEV_C = "Logitech USB Receiver"
class Manager():
def __init__(self, parent = None):
self.parent = parent
self.timer = QTimer()
self.timer.timeout.connect(self.check_events)
self.process = None
self.device = None
self.wid = None
self.pm_cookie = None
self.presentation_mode = False
self.presentation_active = False
def check_events(self):
if self.process:
if self.process.poll() == None:
try:
for event in self.device.read():
if event.type == evdev.ecodes.EV_KEY:
if event.code == evdev.ecodes.KEY_PAGEUP and event.value == 1:
self.send_key(self.wid, 'Page_Up')
elif event.code == evdev.ecodes.KEY_PAGEDOWN and event.value == 1:
self.send_key(self.wid, 'Page_Down')
elif event.code == evdev.ecodes.KEY_F5 and event.value == 1:
self.send_key(self.wid, 'F5')
elif event.code == evdev.ecodes.KEY_ESC and event.value == 1:
self.send_key(self.wid, 'Escape')
elif event.code == evdev.ecodes.KEY_DOT and event.value == 1:
self.send_key(self.wid, 'b')
except BlockingIOError:
pass
else:
self.stop_presentation()
else:
self.stop_presentation()
def stop_presentation(self):
print('Stopping Presentation')
self.presentation_active = False
self.timer.stop()
try:
self.device.ungrab()
except IOError:
pass
self.device.close()
self.device = None
self.wid = None
pm = dbus.SessionBus().get_object("org.freedesktop.PowerManagement", "/org/freedesktop/PowerManagement/Inhibit")
pm.UnInhibit(self.pm_cookie)
xfc = dbus.SessionBus().get_object('org.xfce.Xfconf', '/org/xfce/Xfconf')
xfc.SetProperty('xfce4-power-manager', '/xfce4-power-manager/presentation-mode', self.presentation_mode)
def check_viewer(self):
ret = subprocess.run(["atril", "--version"], stdout = subprocess.PIPE,
universal_newlines = True)
if ret.returncode == 0:
version = ret.stdout.replace('MATE Document Viewer ', '').replace('\n', '')
return version
else:
return False
def check_xdotool(self):
ret = subprocess.run(["xdotool", "--version"], stdout = subprocess.PIPE,
universal_newlines = True)
if ret.returncode == 0:
version = ret.stdout.replace('xdotool version ', '').replace('\n', '')
return version
else:
return False
def check_wmctrl(self):
ret = subprocess.run(["wmctrl", "--version"], stdout = subprocess.PIPE,
universal_newlines = True)
if ret.returncode == 0:
version = ret.stdout.replace('\n', '')
return version
else:
return False
def find_window_for_pid(self, pid):
print('Looking for window for PID: ' + str(pid))
ret = subprocess.run(["wmctrl", "-l", "-p"], stdout = subprocess.PIPE,
universal_newlines = True)
if ret.returncode == 0:
wpid = 0
wmid = 0
for line in ret.stdout.split('\n'):
args = line.split(' ')
pos = 1
for arg in args:
if arg == '':
continue
if pos == 1:
wmid = arg
elif pos == 3:
wpid = arg
pos += 1
if wpid == str(pid):
return wmid
return False
else:
return False
def get_window(self, pattern):
ret = subprocess.run(["xdotool", "search", "--name", pattern],
stdout = subprocess.PIPE, universal_newlines = True)
if ret.returncode == 0:
return ret.stdout.replace('\n', '')
else:
return False
def get_device(self, devname):
devices = [evdev.InputDevice(fn) for fn in evdev.list_devices()]
for dev in devices:
if dev.name == devname:
print('Found device: ', dev.fn)
return dev.fn
return False
def send_key(self, wid, key):
ret = subprocess.run(["xdotool", "key", "--window", wid, key])
return ret.returncode
def startPresentation(self):
print('Start Presentation')
if self.presentation_active:
QtGui.QMessageBox.critical(self.parent, 'Presentation already running!',
'There is already a presentation running.')
return False
device = self.get_device(DEV_C)
if not device:
QtGui.QMessageBox.critical(self.parent, 'Device not found!',
'Could not find presentation remote control')
return False
self.device = evdev.InputDevice(device)
try:
self.device.grab()
except IOError:
QtGui.QMessageBox.critical(self.parent, 'Error grabbing device',
'Could not grab Input device.')
return False
fname = QtGui.QFileDialog.getOpenFileName(self.parent, 'Open file', '', 'PDF (*.pdf)')
self.process = subprocess.Popen(["atril", fname])
# Give Atril some time to show its window
wid = self.find_window_for_pid(self.process.pid)
count = 0
while not wid and count < 10:
time.sleep(0.5)
wid = self.find_window_for_pid(self.process.pid)
count += 1
if not wid:
QtGui.QMessageBox.critical(self.parent, 'Atril not found!',
'Could not fin Atril presentation window in time')
return False
self.wid = wid
print('Found Atril Window: ' + wid)
# Inhibit power management
pm = dbus.SessionBus().get_object("org.freedesktop.PowerManagement", "/org/freedesktop/PowerManagement/Inhibit")
self.pm_cookie = pm.Inhibit("lt_presentation", "Presentation Starting")
xfc = dbus.SessionBus().get_object('org.xfce.Xfconf', '/org/xfce/Xfconf')
self.presentation_mode = xfc.GetProperty('xfce4-power-manager', '/xfce4-power-manager/presentation-mode')
xfc.SetProperty('xfce4-power-manager', '/xfce4-power-manager/presentation-mode', dbus.Boolean(True, variant_level=1))
self.presentation_active = True
self.timer.start(10)
class SystemTrayIcon(QtGui.QSystemTrayIcon):
def __init__(self, icon, m, parent=None):
self.parent = parent
QtGui.QSystemTrayIcon.__init__(self, icon, parent)
menu = QtGui.QMenu(parent)
presentationAction = menu.addAction("Start Presentation...")
presentationAction.triggered.connect(m.startPresentation)
exitAction = menu.addAction("Exit")
exitAction.triggered.connect(QtGui.qApp.quit)
self.setContextMenu(menu)
def main():
app = QtGui.QApplication(sys.argv)
app.setQuitOnLastWindowClosed(False);
w = QtGui.QWidget()
m = Manager(w)
version = m.check_xdotool()
if version:
print('Running on xdotool version ' + version)
else:
QtGui.QMessageBox.critical(w, 'Tool not found', 'Could not find xdotool, will now quit')
sys.exit(1)
atrilVersion = m.check_viewer()
if atrilVersion:
print('Running on Atril version ' + atrilVersion)
else:
QtGui.QMessageBox.critical(w, 'Tool not found', 'Could not find Atril, will now quit')
sys.exit(1)
wmctrlVersion = m.check_wmctrl()
if wmctrlVersion:
print('Running on wmctrl version ' + wmctrlVersion)
else:
QtGui.QMssageBox.critical(w, 'Tool not found', 'Could not find wmctrl, will now quit')
sys.exit(1)
- trayIcon = SystemTrayIcon(QtGui.QIcon("lt_presentation.ico"), m, w)
+ trayIcon = SystemTrayIcon(QtGui.QIcon("lt_presentation.png"), m, w)
trayIcon.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Fri, Jan 24, 3:51 AM (1 d, 13 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
532803
Default Alt Text
(30 KB)
Attached To
rLTPRES Logitech Presentation Tool
Event Timeline
Log In to Comment