From 7038384d367d1dd0d532f3a9dd430a5552aca9ab Mon Sep 17 00:00:00 2001 From: Andrew Hennessy Date: Mon, 4 Nov 2013 17:13:13 -0500 Subject: [PATCH] mDNS no longer crashes on malformed packets --- .classpath | 1 + gen/com/limelight/R.java | 10 +- libs/{dnsjava-2.1.5.jar => dnsjava-2.1.6.jar} | Bin 301194 -> 302025 bytes res/layout/activity_connection.xml | 6 +- src/com/limelight/Connection.java | 29 +- src/com/limelight/nvstream/NvComputer.java | 70 +--- src/com/limelight/nvstream/NvmDNS.java | 328 +++++++++--------- 7 files changed, 193 insertions(+), 251 deletions(-) rename libs/{dnsjava-2.1.5.jar => dnsjava-2.1.6.jar} (81%) diff --git a/.classpath b/.classpath index 7bc01d9a..e5f25532 100644 --- a/.classpath +++ b/.classpath @@ -5,5 +5,6 @@ + diff --git a/gen/com/limelight/R.java b/gen/com/limelight/R.java index 47c9ea76..3395dcbb 100644 --- a/gen/com/limelight/R.java +++ b/gen/com/limelight/R.java @@ -35,15 +35,11 @@ or to a theme attribute in the form "?[package:][type:]na public static final int ic_launcher=0x7f020000; } public static final class id { -<<<<<<< HEAD - public static final int mDNSResultView=0x7f080000; - public static final int surfaceView=0x7f080001; -======= - public static final int hostTextView=0x7f080002; + public static final int hostTextView=0x7f080003; + public static final int mDNSResultView=0x7f080002; public static final int pairButton=0x7f080000; public static final int statusButton=0x7f080001; - public static final int surfaceView=0x7f080003; ->>>>>>> d7062ac2e0b306c42144c84690a3735c5878e11d + public static final int surfaceView=0x7f080004; } public static final class layout { public static final int activity_connection=0x7f030000; diff --git a/libs/dnsjava-2.1.5.jar b/libs/dnsjava-2.1.6.jar similarity index 81% rename from libs/dnsjava-2.1.5.jar rename to libs/dnsjava-2.1.6.jar index e928fad994384772d71ff1bc0ab5e1cabfd74786..6bd9b2eeefd21f0e5b37cae3d725bc8c561d8ecd 100644 GIT binary patch delta 40589 zcmeC$D0FhW5MO{dGYc030|x_xa-E;^L_T#6r8+<7Sm9ICC)&;wIa9H-VkZMk4F`il zouBi@SBtn=K#a{3cos53Sf+gYpserwFxF1N7-fj8r0FykHJLg;X9gs|!oa|gUzDy7 zGn|0|q+;?_OBJxD$$u?1z>LkBR(zFzrX{+cdO$(KlEzS{}bSJ2W?^3(4M2GX7)1+mZPdGg}3`_E)Z|&57{M2!h z8E^EroZY3-({;1Izqq!}Q~vd>FM{9xpW8bvRe8Iy{oUesl{N3*|F4~Hey{qUOhf9a z=f|Vwe0pqBZ>QLAzr{f3vHH`Gn)cToT&}ZeH?FH;oBx$TTyMq?WqY>|mN$RzvDv54 zuRrU@q}D+DCX4K(GyRrMC4B#G9QtguPoZDjch3`d(Q_vsr&jJsdKAhX|1Ei5%pC@8kG!taIaDcJ|LC~TobSqA_EV2bA9{KI$;aoPesBxdXFjZ7|K~?`jc-To-9zR+ ze|qIlf81VI6MWe7yno2&yW1!uK0ObYrWCO^J@2k3~uG!*zV=HRrAc937*g2 zMBKV3=gq6KLVL>Q`#PV6SnuCTvC3Q@{Nc*g{O8x&d~6m5T$|^kZpHSiOnuYbjdwNI zP1&BlD{1B1jX6R0?z$d+=liT)L@)DvO7*O7@BNkq`AS=FGhN$%d~;_^UT@P)`P0vY zZfp9a#{QmnV_!tD*0gt-x6;xlzno|K)jC=;RlHvMhxe!H!fxVogEf5lzvTLSQ^}R% zDB(@n+_`1%($ju7LK5a@9Q!J?&}`qzt54IkCcfKP{kh3x^6|Kxo3-2|e{Py@Kd(MI z;J}r@>R`3o;+xmszCZQF_Q^9%Qa`Bu`t_DsX0wgzspH9IJzL(Kx#u$L&+|7rYCE@E z&paFGqbxev@$EvLvb0(=Y2}sPT@p*z)~Ww}_PXz@YOqbvuHOxF3;Lr^Zh7nH{Uo4p zc2RQM+|0Q<%y`8&h8b-)OupUu<2QR!VQYY4RsHsW2QwZA#BDHc71w%Qw(Xku~d$L>ihJ8!xo=-V&Yu1ZXDUWB_{aICrn??eF}ua!#Ies{S>d_0^gFhw^M6+%OF~v-EPH>E>B1Q+Jj; zI??-b@5?i}nT4SX4Vh9l*-e#temTHIWO?!v(degJ{x7o>ykNCPzTbL%isL$q+1oO| z&U91~Ry51&TKT+-E#s)jV=hj;>R-80`?5|wWkO;PSdrvp75^grpWfpS+_5*e*M1t>9;=NIXA^`@89|0?xeF}ybGSaTcVr4XQQt1 zgtuNfUR*QSW4yduYZ#gUq{}8-uyMzYE-2c1} z(tlJkynl3?>vLVQ(1oPOpT4BA+}7@Ty4dM$ezVxYhbF5djN)D^_+)rlmTItm;Qmt| zl=yCn??2x+|Fs(0KV(FZt^hG;1ZN9ehPKaxzrbp4H zCE~X;YHTe8S)j-WsZX+FKQ=}3sGmu( zns-D0rd@hcIrGV5H|7dx?J0a2WpOR{0;k<>g>#q77P+5`*k%4O`(xL-_oA-~6w=jy zaeOw^d>=dWA9HZRy^Gbp(G!=Nz5LiUt#aM(q`!YVO_a@I!k1)O-`ujSV&y;Hh5omVCDN~V`{SB zg>ZgTeX-@N;Wi25U6Efu&sltV+RR0wsd=#*OV{qxxGtI8yofn@*6*j{>$O6z`>y8P zuYB#p1IxhMeho! zho>%0jtF=hciCJjo6Wo8xkvr-XBKNZe_Z*{`a7%UyvV#s%Du{!SN}0^|KK_NpnZ<~ z^q{>_Qwnp<#EMD<|LZO@)ps`5J07}X`B$Ya;mq&dHcIyD7Pd{P>wSK8mQBk9O-|4RKA!ByvPh;FI(du_h>rn+7_%bY{zQqFeIOCo=G?#;dw znVxF8qeR5+)?rT3o1a)~m&>l(CwffcjM(Z^R{GrYo?Qx9Y1tBBlEOD@)hVv2>)y!d zEZx1|zNgNAv*@N6JLeTsBTr1)@OWuL0nfEyD=Qtj|I^aWYz^8O{LY@0uj=+fnN3aC zWZkWf$Ja|Vu=khnb*to66sk+eIAun}FY@v|m~f)UJo;jRiOi<5)-we)JdGPt8usuf zhM7G1T=MGldl&Z?+qOppMjJM(7EF{AU!9#&!u-XWN6Fx{*9*7Fje*AkG|~;uEd4Eh z;iUG92dg(UE0$?HXNu>gY19eC&MDno``S^ex`6$g5kr0Oj`J9y_Gt?PNfFfaYa-k#eZwet5i_CJ^{b3a95|53fixiU$YO;*_KaIY-fKC7`h zRF!Xa>kfb2V}G+OdL;p$(x$sDvg?x`@ zSRMIjXS1~VKWElAsrs$EW+p~^X-*4R?x%KSH&3Z&M^MzFxc5;{BKxDi$h)=Y`0zo}GN{IHs} zVsn7=69dVbNjraNYJJa4`&xWtma)r>=N%gJFFuQKH4`mpF*Gr<);hVyef5*Yf>m3+ zHXF)&?z*|y_3rDgT|L%JSNCxQr$0L(VqhQ5@XT&{*~%}!-@U!NB0QY0y^#s~!xq&p-*&%!MgZUQ=-6}G zpX%pK_bZq?qe^|*zNJSkYqvLC<|?|iIQQVb`OBBQdAI27Qa718#!zdeW04{GeSJ!I zE>_3|`emJ&yy9B)L8*6z%a5)wifdngYJvRow;J>7#isAmxw^6N$)e=vsarqBOfAg2 z?!6*6v2n$xDyj2=7gq83eeK&*;ck{4#oaos@A}i0zIxUv<$L9#IfIPu`4~*RcyWF6 zUG@*mS)a`wKb770cS7X{<**y_#;58J-L_A?`bTp0)AODWW5f2v3w)^a)Y_l4>)))6 zzvK?SVzN85en#^um3U|6KX=_MCR@!=UQ!!zY2L;%>+3d4gi6bI2l!TgyIjX!S){Hy zxx?y=xw;?!6FMpR>8Y6!@|7>5aK2UJC#B?^^LNRL80c+tc!b&;PJlS7L|6 z#p0M5Jre|-mUL{>?VoTcMNP7=yFyaZ!Br!PIc=pz<8DF4ts;q6TU4_orxov+r0RY| z?7+8OY(Yn+7vAC7SX~^#S^U+ptUmsds_Q4OwR(%LI9E=-ciOb@*en~hscuq7<_f-l zQr=l>e*Uzy>hzz&n&-tG{w=@(NqU+tbjyBJ{eb!!4;*4;^la z{@BsB<>VvT!lTxQOh5iGO?)glrG4-Dgl8-UyT5w6^!%%LT_YwFcv~Y*UF%9&SDEm$ z`qi^H&Ny0aV{zh~sDBz?U-;%Pbur!=vGmp&G{+RVC2yi{wZzx>LINA*7~G8e?l zFO(_P=zRR&itX#-iXJJEQ$H+j^RchrzPln;xUyb!b>G44IS-$3`Rz$xwz@1w$|rSk z2=9fNzh|7=E~-$g5+tXN0L2?6&IMeI;VE#geuyfx9}- zh6^mQDv>T<+|8hN@z(mycSSbuu$y@EvQ^REGhgNYikeOqn)l$$VZNN{eQC{ek6P75 zbM9U1b850ws>uFpM?9VXv%`AOknZ{B%XuNpknXQ`ksGw+oTTdM89b3l;Q(*ouiMwsE%i0V94Z{uDFU(Wb@>Or7XN4i8Xuzg5m58 z3=bxYF4M1nSucED)HeC#wFNzn968KlosZHsK6PD~ouje#Y>-QjZ&orFU#{Dy2)PMq zb1rfeY*s&eX^F4LtfeX}lcr2s;v1E5aG7H3`*kC$E%ojjd4Fo8CAbyXGzkZ`1O^07xf+ys+G_P9&U(?lu1Rn1XgFzfpEzlH zrNHaxOO5N6H~&N(oxI6T^}0XzS09n{k1R#cbD!r9+|zO2<-??|>5Dx&rip*->Ix72 z6L#Wy$R4?)?>|%vRw*}`x4!J@+P!Q!=0^W0e-PdKm%0l`eyI{=o~7lYK8K5rpNfopGeBZb*&HK5m-t{NE<@o|$zx-Ak&g;2) ztaz@>)fSUk>sJJBSh+cS>yC9>ZI6GqDy#pv;iUvqY2=h2DQj+Sdc834MB({K>zuD~ zp0-PUyV?8Qyvvr!hHbpdTo8P#HR}Yxm=A^VL|T#hrs^?`aDPvx%rP4w*O4Oy-{ZUzRtfOZVIg z6APN}QJ?k0@SN+1iEW>E9QYJ{X_}@;&z?Aml21>SRJG+cGrpQF5~@?T)cNr7A1yzu zCOOr5HKuHgDViLqoEha=e$2yais>YtPfwg{Yeg)VJ@h}()zmHZug6=euBBa)bHD23 zY4L_qWy$?*bvv`Z?J9nm#=xKbgJ*vBjXqhynuQPbf2^)=V$U{JIU96o(_NL*_vU!{ z-S#tjk!85ozDeJ-rj?m%($>eZP|Q+We4i_fjKzOyQCX>Zi4mvbk)`(|Wrb#~jEnA8)gE|Y_|7415m z=C%INw8+wy+%@HX^Ly1#RW01Yb35bPj){-ASe&w2Wk3H%@e_$(R~F{lFRAD2pEOM% zDdU_eo2>i%$vetUe&`Cdv<)xnReHWvPv(r}&Y)7A^j9*KnpZ70wm;MQu)V~OZ|$q1 zRen2G`yES{`90;&mrBcw=u{b_H_K%%o7(s*+i5l*T)e8LSD=%>P*>3_p2eX+f4}v% zkI~Boqd&yf@N?}uAIn^Kpxyb{;@{2nr3w+2PCM=$Z5QqpvR737!*$(5Ynh(I&PRs- zro7h(S7=o$NuDs}+2%x!-Fu?Xt#LS7S!dh2^IiV_zP1@wn~gszUO95DTVhA!g^AJ} z@{tb7dot&l{Wuc3Pv~=maQ~@ydi%DW@>4eKf5y6I@6;cgnv~vU`Z+J%{rcqxyIqzq z9)7CVNz$)ltC(W3w&IFi5bqQTr?!xeBrYzzi{pJ;cb;UzZlLwim2I~5X%+8?%R}@skCBi%hUxwMdT9m z_zZ3-x0G(+s#4=v67ZMtOV9L`Z2gmBeqNC0T=0H*Ont}dSy}vFbrMd03h_0v?5`A? zWEX$5DQe?_sw&mThh3h&_AQ>e+wEhe<|p5K4?{xVNi(-{&0VR!CvoS8kGl>nE^UpT z#(n;ps9lHqYmV))acVW2`V2l4_e|_QbV}ML_sPk(A>VCoEoFF7{ex-p*{vU&R4fWr z_LVZ0-xunuUZSzCzRLg1`j6d=-kZ8yTcX1@-O<*0^1|XmaqyHQO8v*L99q=-zJjY} zVg8kg^8)f$JbzYtM}2CgefK-#HS!$4=gdCLT@g@m+l4o~NMVm#R4>Pa5GG22yJ(BnQ#@_kqZgB_nfBL7g=`XJD2tV;vYvuLA zw*OJ*9{Ikintkis1EG75_`h54Xf6LJzo-5Gqgwq-){@`7d%j!nRbH*#E%f>Jj01^} zG!GroFKDSax52(|5?7$N^y)HpRXOGK88Mvej&~gKFYL6Objq*XyW!bI)z@v6OHy(< z!>aDfMs>ZmshTFW_^P+ja=~+oZT0;xepP;X*u=i`YIrQ;tYhmx>_0zhJukId{PS!E28L4%3=E14leeus0jczx)-8cn z=2{y%4rLqWY-nbTDvE<$r!I zv|aJxat9kkZ_Ta4%z~hXgvFW_E&_}U4BHtQ7_=rEzLwaWaZjI-6C~Ba5INz?u=^=4iK>29(iX++p?wHu^OyV9?spT_qA-zWLmhel`ZrOr{zk|-Wc_wm@76PPwlH^ zs$mogRnhv$SR<13>{f#SpUuJ-^NiDl z#_H1O7Mrl($AyZN7t(Fp*PV~N+Vps4=;gBk7ZwDHy;zZFXyR$fwDHuk-zP*YUMx5D zxiszi73tE=i=OA)UR52Ydb)Up%apxL!V8NxZ|A*!!@%~k?!;v`KXy+`uAI*LYGu>> zL}|ZJ{mOMuL+XwHpEus>WPSG9wHG0GT~8Z|o133nR()OL_LG;o*Rb8c?4+aK{L@KmaLo!W)M^Oy=r#1Yv%TfZEs0YS;dmQ)USN;Clnp``}eFx2^KHd2HP~Ie|>;CmV4oz%()twHW zcl+dVU@_x+?h2g;e^wyzyxnF9R}hJvgzK71Or1romn@wuI`NuLWMHPOy0+R{;gq9G zODE~H7WtjDoqH@WY3i!4kJT;(>}Q7Mc{XU{{`{j#XqNJMauS;LB%l9h1ZO122unc? zMh1qrj0_C=po~=Smmi#&o|jlsT9oQqk(^pkl9`{Umzwm~Wpq9Dy(^8G5 zsv|AT8A*F94pnSOO1f0A^5MP%QP;1;Zp!7YKRvmVy}rTzlm)A=&yxpgpYNSHJ$vrS znwouknJo?{vRa#3+$i1ne37q4yvEu~-cB3sX9&pLKcl)(QbYH6{msiEx2z3&BQsgk z)E;$i&|1IWRlPQVbD^!-!mceI#@g0#-_HOm$mzB(_Z+2TK@cgrFxp4bM z>}CDv&;6HPvj5bI(?i!ztes-5poia1_+_}IA&3A>}ae);N zw={4i_ez$u8vR^RbT{I5#QmtsZQ(akWHSoGQr2v~ocM0RFIHF-Kx07WB?~m%RbGoj zS@v(+ps{lD-6uwH!8vn(T-gF828LEoaJOlCUM36M^z%6^Z1sCLhnU_ zi$X7EiBG?_cPj{-UVZKQweZ*f=lrgn>7zE;?fZBBw*CI*`JLZSpKJfG`enfo z@pH3U#dKMdjovqws!7zJ*IRt;>6KkgQQ<*_qNV$N*RJ+0P~7dt|7iXfPTpAWql#Ml zl9R4)e4SdxtZSdqRDPpZtxVWjXY=fp`&zrAeG7~k_x9a&JNowK8@@7i(ejx$1k22I zceZy`XU?_wt|9t8@MEm-la0Sueq|8l5BfNv)Ao#J^+2y;Y{p+O*n;-Z*w?L-Tc1d^PV$t1_zbCEt)uY z!cA{Ai@AH}u&&?m{`4DB;U71?_q++6`M061E~81|x1emHW#ex{(e5Bex5 zx_{Be_;hFE-!snr=M~*Q^`^Sf@41}YR_grUd&X|*FMgxn%2(@+HrY$xte3bM-}A;; z`S+a@|FTlzPrR}Bz2IjZw)*xzwaxoyD=aMg=Xi9w+PC;O^FwM}kM3XbW0r=E%h9zO zwtPGKjO%9>3(q;PI`g%MHQ%Hs9{xMxp0NqbJTU5w(Jo%hsdtp`{3A6fMZb?ZIfboJ z$sZW(rgasDJh^bALhFpte1*?3GoJ_ME4>Tf?l{#EWn{-|%`28Jtm~|tR`)&F`6e;0A-Uy(;Jo>*cO{ML=Vvyxcl0Q`91{%s(Ed|L z*yddN=|3T>o(BXv6i=7_86&L!o2 zyp#5%?9rF%BaZBOZr7CFeHWf#G}F5GPU@39%sGe$zV_1z#pih?ZU5Yqq^rcWjQmYau zp4V%(>`ZhJUrzrq<(0)dE5bszB)eN&yfDdVPPk}ZZr9Or7pe9~M!B)k_3r7_)jIP! zOsb-1Cx6UXlqGNdOp*YiFyBFilISO_Uhc|tmbTq4PI=?e>QIGbJ@|$@vg_?i52^`kg)Yj z?a~!4f17$R>(w(O1D&pIuEO1t9Zs^7mo`Yk6j5|uzEE|=bj#RMQiItzbC9Nipg;} z=67qxz9I&Zex*5grlz-+w~CjjEn3U1B|NdhLaF6R>va8 zn((&mu2CN)oV``6QK|3~KWz2-Kk`#d( z3=Ao`)i#^7rCz%nu{e0@qw8$#+d>ncdDJXDR^+|V%Q7nSbko6?t)I0#C5`;jFUaHNk$Vk4p-7Uvzc}`na_} z$#LdQN4726^>@0qs3)0jy?1r)?Wo1PFT9NoLYh(<0DZBC5xiF!XcSQ0WOkG8mEt%Vr-g0GUE7QXR0xgnG ziPj&l_t{^OZ%el9objPe^K_QmqSv!+UT2h?zO7unSgCBIEzhU=%VA|(+@-`={;p2G zXm+XLjf;-xTaKB#ZwU12u85f$!W9!agDoSI<#E!Etzoa1>rFkh)}z=j*k)Vu3YqT9 zjS4~&Ek0RX+Ne;v^wqH?Z?~ks^US-*$1~?kV`CzFUr|WHi@-E1t=L(vi)Gqmeh>zZfDF0!;MmA=KCJE?GTmxyISDVL&3*@8$3D<$irZhyD! z<@8$niN(Hsz72b0&0^aNlEQ6F7YYpCEZV{?X`U={Ecc6IY3bq0=`3ywR~XjM;h0>! zAf;PC?%724Lq9yuWidC09#*z;y*!!!^AG2WTQUph*xzDGDT~fApXKKDhPOpn(6q)} z`Fl9uV=tRs+~ESzZjY}QoV~bZF>~dSFy;BT1Sf2GP;z}{5mVRly~VR5S{qHaX=^d< zwwxT*=eo>1$N!{jyYwN2J6?~@sHz`*U9b4(ms%W;k-=X3{3|h9+P9|pZ1NTKdVDzR z`G^0ieUd3=TGwtaQ9AkM)wYrl_DKsSpWXG({KlNFb$gN-u6}9JyQ*+(#Xkklu+JVT zyq~RKSLv5 z_lsGX9^BM;b4GH@neW7Gp?QZQ_~uMKtIJm+xgeD zS>LZbVqp9|?U4Q>@#K1;NrpjbHT(;5*+1Cu%$j+gGsWWhf-s9p5eMy!gOEnfrqsTMr zetP|>2G)-cX8Nme?Qe?rd>*^>L;mO0qIJAtXAUjX$T71HeR%zov(f*)`a|m%?|i*- zM`M@t${n5ZVL#4Z+0`0<_Q93OUL}%K(vD;=5!YzdO}uxpVYydiBBPkgDStKd&>KN* z*D_XdS(Gb(&-Uovls&yN_X;=9%g&vKH#S?xI{)&UZF^JR+(KW-vh>J9O>fD<6qVX9 z;%2RD7u7tOa_~X;&0A8LZWGlnJY80=bNj@F!yy~9X5RNYRzCYs{_}E;KYk`5+h*Qh z`a$_m9;^OoUY=*EN0cuo%d9+RJ7X_TZ!*{Z>GG)t^(94@?*HbvR;w&|WX1XpqyOs; zy?@TH@xhe2)xLwTBR4I&<4n8AKZAOgL|v0@eOEPegsqEbOkJXxY?RQy&A_1K;R&e@ zullJm?HwCpx$ez17xU>-)LX%rr30X65Ew>t&yFSsQQFGnsaYt9;w$&L#4X$KLJe$HYex zn(7YEwjJf#(vrzA<5{4l)MCAu6PhRG{ysXI;OX%@J@o(0HOhaudq2GYFVAvpma5$zUaH8l=HG(D?>TPW zW!!x_s_o_#q3P%ApYh#r`nKTgJN?bmcRI_(Jm#{B<;#zpX_`{Ldo5r2f#l8XO?K^v zvw5dh=JtIuve|Oy@%HJ9=S-i{+SF%MeL;@v)}D6(JI@RA>}uX;wElKJ?^O0&J?puz z9G2AZ%@%I%xc|I(YGkZj`)%=}TTbU5?vZdaekk&(iaBok*;u(RQ(Eg~_7&~Fp3krN zw`}=kH@A!D6JC3~u{&9Ru*Bxl$DjA@nU3xfmCW7TzUSS7yN+vgoDtb^G#U$+B2^{w#*5eefY83QiqRIs{{1kIL63rsJ8XnuP(u1 z(NwqF+#{r7uiWx*V>(7rV%jjKMlQ47p zoz(K1f7eYg4v^FN{=@0%x1wr>Q1vIAQ*ScuYq%TyZtK*Ye-D0YxSqJ#vgX``tIt11 zudR=pE;`Z4<&H;s<$<@l#R<3L^LVS)IzF#=7pvQTIRUKn|ll8=6#l{NoQO=gYjca85XAu&hilVZz?S2<`1A{EB@KPD=cE^hng+ z+>gI3`*P*#*BtK`^*5%MUeaD7bNqm~^2_I`HLMPKD=#_D+2%S~zMlJ7$9m(H%U6dN zIVUb{W7}K96?<0to5}*M-He_hl@l8iCVo1#$T7>Va!Ee#3En$ln)_y(DNOj;I`dwM z+s~kl2`%}7%Jq{Ztv^^SRQtzs=jD68M`_FNzHs|%WSDy7yhX*iWA)sd>!))aKJeXN zHnH1$j-Xw4%i|1&6(5_#*#7m@Z{e%4vy_x5*?E5C)wnnX;wkmXQ z)Lh5@%`e%P)mA8l?Dh4%xb4KRD|}8fOb!X##MSsa-42d_bLS?0n&g~f{9vtFO2t3*GDqg*wtCO(hQwVKZG~T@r;6HU$8%$U>hXDBdDmu4{jyIg^TTnglQzryKCRN4@=SW?%zpye9NV|M-x4@KX`(s*Ze2Z< zgXupGOrMjhzs5!~@V|fWnbpmbANclgGgQrR%CEUG%Spdx(LdW7E}nl5^i;vbM%1y*e|#doFop42&jYcq4AmhzKbgFnC32eo9|;N+KXCuS`-s^u zY$I>iu((@ZTiw;QyRp34W$QZW#>CtUSv#eBLefi{HN`iTXWTV(-kn@%9`?9vmtwj= zujPc+RGFR&jFuA`PG0Ez@!n}o`QfA+%!)U-uWs;PU>WGj`mdh*pXNWg644sg|4uHO zU)*$ao#D^MdF;WR>9q#?_OYJ{RdwBKz|bWSw2zOV%$Bw4Z-)^Mvr~FR%M`cg4+E zCL202b)x?PiS8UnwMxH!H% zIomCK(spqrbw)mge10W=JyzqGwm*BBmK~mIAib_>=ZD-UpRWe+T|Z#7LoDk-y@1KV z@&xOc{z*F+E$fwQxcMHhn_c)!?9cnK9qf6{dOKw2HCZo^f7c@ZK(B)L>XX_X(soB~ z_CJifa&+;EsoNF#?u!=f=J0>duAOW#xmUYb^7u5S?~bCAH>4_68p;O$Kl9x?Ey2j^ za)*`Aq-P!9)z5UiRyp!ddD>B*1f{v@$IUT*XZHF!??wQl{fw4*; zNk8bbNl&}omE*|6%RP>t^TNDZ1VpFXpIiT$!@?iz`dGV26~=tbYs!%QLdfMMA$i7VcfQ zgx!m6qWQ#!8?+2IWHGLGh&{h-b1=&$%QX%b0?dczI-b}x(_+=(iB}&jiIm#pUD)F@ zA!kR)Qi~N9haI;rNY4(|DVtL^A&$9!CHvlg*$&Z#b1u}+>^o+-f0av-jGLENiR$sv zj0Wz$MV}QW@>KP7?vRVHowt$k=0-ua&AtY`xqgZ{RhOK7(u*g=N^~4pB-EyUKDAZq z@w_92lU`-kCaiUzlw+F^-x*=yciNuEEoaKyusQd+&%JsSR}lK*%)7V`Aun`)*=elb z{=%zz!6IofJ|TPIdRLwtX^l0E$2Pm2NEV!NXjTB@tVF(UCrxW_g`E+$Q_d#4I;}H1 zD0e1pVT~%rFX%iRPAjSb(fWVSt;9GX*f|g`boW=#a_ACS?jJW zdf%w(?4hqDon}4p3!jQ@qsLPPq8)W zW(S*gK1eP**kn{-)Sl2N&J`)S?TduqG9&eEJRA7-a&B}L%Q1XZm2_GurKfwR>9H@5 z`6OQ_a3!zu>YC4>zcFz^;KJAS%<;7=U9U6$MLi-%M< zuupi=9(b+)faV(RuA9jT>HXYF(^s}H@u&?2&Q#qqezh*4lYP(^Z{8fj3 zgCwTQrHj@z`!2f2BN%9&=xMt4cK7NG*{fUnvZCBg*Dj8F`n85f=D<9sx9^*$zOjrr z9M@n~#$>j6`ohk=Oorc_Gt%vw_P#N_aXhZxf7g?;lHc7oGC5M^Ph|>5>&RSU^i`|c z(J5S;i~H1f;R8z%caj7aA+N^ zoFXpUy78#QuCI&KMITT4dUR+5Ds8stfuD z4%<1Yf2`Nu(%jE#nX09A=J+2cSwHc(zJnGqp68ktr*Gj*S9G+~QrambJ4rafv3HJs z0q@EbXD-W%#Wh@JD@;1SxvAtVs8ws`k}We!TzkC2;(x`tNp3v>dd`J%s`Z*r0+m{p z)=8`^yHcL8-#y6QHTW;{u2y@c&U&ZC|BNSn6OTA%cevi)Ik)wtX8tsea3{lD&0_&mS=qN9h@W$) z=`7E#MDME(+1Xz`f`WPf&G$I9|G=4jZ8hf-*q$4-zYZ#DNOIX3w7|yO`DV|>J`kXPzM(AxcxtEXqZU8-5kZ2H&gW%w7F7Jlb4 z`5b2{>0jORS_|||${rS^yeL>AJ}YBK<%@!1{VhDVeg&+3%BAx-E#j#90ZAM2Z67=@ zv_zImZ$F?nkN^3H%mTyXJd?$jq%d4p_7CH_wN5^*Ao5FKum1Dh_zvt*YnkXeU>r(=Ni4w-}H*Jr&qd9-?{d*jPMj+NvD}RT0bN$ zStAlwpdC`ozUHA{#Ob>psg^kpxD$o#byWqkg-RSI^<{-@4$ay6Y?`&_A&cVliy!Ay zZWqqKJ#oABZ&!vz8*B=!7k=0yQUBObEl+gUoS5nN7EPAf-tbV#_OctVg;q4rs}*Ow ziq>RQs8;^6sa(Bh>a41*{i*Zp)W7E$T)OJmAI`qZWW{77-%~3mvwd}&xady$!YXF> z)sLqd^sR3=S)(fQA<5`+X+PeWKq!8O%8@{Xpp+$MlaJF^6YAsJh3q{X>QqSAlwTbEafMR?W(3Od?R=^lw>ygUAFS9XtoDho#GiA-aEZ~ z%V>U|d-=y&fhXyUC%tc%s^h!zxmfYc`DU>?yDgu&6ZrQFoO>$1@QR+>O4)|&pN=~w z#xrgI?ENsVzE0BSjDEZNPtk&&cuxIKs~?2cZJqFJrdIt;NvBy?Hg!t7itSnQ)atPz zZ}58ipC4GF^_wR1<{fvLw`3=io>-CTgQ@klw;KXd_S96h#PmAnDNEm+IV?Of1n|CM5 z?q|RDdGUss_t^vM?5*ywUpOb{(*9c@=7fBkcZImsUH69q^*p(63U^GlXLPSD?^OZVMNY#tqd-Q(!j61(Q7w%inY07=iW7Zw* zSpn(?xo4f6dO&&B$<_x}XP=yFTRZFIT^?_v8F$jQxeC8K%Hgg5NNSmoxue`O5812k z4}Er7t4@fY`*(`Z9Tx3nb_xZXIQ<$cCeB_}fApi}(nmoXxxf2riGJtG(mGl4SffXh z#eA!H+4n>9xaPXHo6p%RCVMJdKF)FX!#9VUuhog1*|K!myfXnYE^@9esXSL7PiSB| zBWs>~mnr<9=}GCMW<8b%>_YVZlZ+D1dA9|$p=!N?CmPHcN9;0-j?p? zSsLBJ_dbGo?c9pv>r1t*L_WXUiHQUPQ#$ETg12yii(mTqm|EjG!zj=GAZ5nQ?t{wYxq(t5h{x_o_92`Cegf;{zIJSvH$U zFY{P_XyqlD4c^5MO;!p_tM@*-AyUit7SHowwwj_U;1QYNuD|M>KrjWcuRzjj&#Ih-pW3#7sL^)1EKv(`P-~zcTjPxyyRlom;fMoOV~K zY^js2=ZU)}q-pwB>5FrJ<=w;$>g(grAN<;$80Pi8?eGNa3%*q+OHOwz(AaiZYo+M9 z3AZi^l{rnm!fCxER-N&?*e~TD3*Z^VBRA&Fo1_)_6|Z#* zl*lhikM1__ub#MPvFN7*+tn5y_4t?U^pP__=Sx_vyqdb0@}?)duS|GpeeCZE7UgH! zJ{ul1hKO~rN3Rr*{2;Pv0l(MMx&qJhi?nO`-u|k7;WxiM>ZNPO#5ga{db4et_vS20 zI9+De`IKv0jyv01;hdX#5-OcxPRXas4k{#hyCi#S>WImErW7;=FHt|H$YVA8t$*C2 zuTB!jyXG~pyKbrH@T}jlzoo|T*qn_b#X4VBDod8UD3#-^cWIgXQKW2z`}?cxzmNJ% z=dgLK`5~Y`P4Bh*1I=IQJ!!&To%KtfTGsaBh zxkgJ&pVNFTjh{Q@7nV)_JioE`cbm(GtQieD{{>H6>Q9{W#mZ;ey@tq3{tH~HxNR=o z7MOIeQR-#v4XxUSbzjm2CfD)FUTWVE|4TJSskY_h(e)49UM5>;)iRy;*zbSwTC(TH zdKuwLna-y(5{$%?RkS>}c!W%0j#FMVUvBR6C`BgbW&i!m=FOeFZ0+++pRYV=Y83nM zJv(o`Q*pJ4+x;@Gt%kFAE*Gy_-Pd&W&y-s;vg@L9ecm_k`(;o*kMI8G znA==uzJFN3bla??DL-4~DmLzC*;yBDKIcW-^c6qrjjrDP@K>)eN%l(ej-bjY$Gq@g z(jp%J8!RtPH}LVa4gD8RuAbm)<<-lgRA$ z&-G2s!G(Vh-E!QbC-CyR%!*|3P5BqUTbBiXnq4*3fPKj}{{cHT${!D&m zeNNq4_PBbPu#Wn|)jxSZ&we(4MtxS@=|9^f)>nmW$o&v}^Q*zkyL>Xj*}wi*$~1i6 zc#q-cj2-)#-#?tyzTqDO|LwM~=QrdX|Mff~zUymyg#3YD;t})vzv^#{Yx(LP5uW^4 zdrkI+f2P;ulmAMe_*IX(XlDETr+lW23=Ee+tNhA^8Pg!EWwt*QVJu?f1ugWe@;>yq zor!^=W_p4&qfULczi^;{?e_C;cX{mgVx7_+w9$28hmuBzQ?$?IAfKq&FT^+BU6*>Y z?E0I$jrOPb?Iumic*Os~z0;Um@W`XO8OFxt=jK`#e}BF{-=0C|QEQLLJJktC_Vj3o z-FWgiVoJgMyGsoUN{-xP=H!>0e$!^s0;6>v9>+gg^r~rgSu@4^>aW|kRQVU@M+VPT227J1h9vu914svnm9Q}*@?i)|~{ za~`?od;5zy%b}Yw&9_846b)hwa~I!wYr?yIovH4r6{7Cf*R(yGB{N?|`QJRx>)NTe z&F(ZUt&}UDZFPOEOWOCn`Br6Z_4&`2&3iwqEIL6Y`dsL@t<1XlnPt}T+?PTGE;bu3 zVqY`i^grEG7u8yhH}gL5e!Z)7k@q^w*l_c0zH${mN~W+2b! z9{l&FIdr|eeEd)5wMQRW{Y7&gNWRb89uf3GW;WNhfPerO&A!~m&j0V66)IOHY~NX* z|6-rRp4=a$i{0nB#67OyeaV=u@p<*hc@N)b*lxc3_JYJsh3O0Kcwetb|E70C{_2ty zZE-gXd}}Xnn#1qb{WAZD#+t2BcQ)G0u&kP>a%ahW+oS(gjxBh^#j-9)p3o_uDash6!`A3P~sB)R)uAJUkhi>S+az0^6@Iy3;9BYo026KWwb2f44SRD_w$mn z)-P=y+~>>0FDtefZJZRbR8nX^BWglsQY_SuWn*CYGJRtiqv&)8IYya!=>Qi2Ns(|i zHreeNO%6;NX=gNC3LGbA7@J(MI+Nhv-{jR3?Q>?|tQkkO;(ZpaGzt}55s;cBCjV)| zj6dCfT5XQhY~L*_aG`zY_irzY&;LAEK5gFp|GyuaHC)}XNTG+B(M3e2Wm>nuu9PF9 zKUy|KzuDC!^@Zia>JO>$3~d5(lj;j29PRix5}oG!64h}F($SP;W|RpGU-jFRr6Q#$|7Xe#32Vs>_VyrV}r$zD_C@S!KClPp!Ig}1!f(qo)tzxsj9xziP) z$5=V{Gscf9dRc z*{JZQsMd`kG2U;k`8eC`c3OWm{lbN&h*NKRdCDX^T~a>xeLEqhx0ZR@M6bL_0vm$f zPRmrORuySomDIjvag@qJ)oSIwDN>d%^*BE--i!ODi+Ab$8`&Iv4LQQvS>#}V3$xe|i>vJS~UVrP| z(sNzH+5g+4U+(cWGTfGKK}UXctoCtm^8Xf9%cHqgcB%A!=7>XwF8o_|JZhRpTwj7? z>AI37G7An$HteeD5coT7_4M}@dEQHTk1vk5pL9{k=k=ZoOXh4TlfCqK&#wNG?6mb7 z9hv&BYHTw)>mBA#dsl3vCMi@iD>KXa%xnSqt3o$RN>a3)GyPM~?6{ZIu}W)3NB-0g z3zK-`rWXbtm97YOWm&B%ay~}4q{8WFbVc-0>x$_|u7s_qVDt~NTa&cdVv0?ZsOZ{^ z;E!@rA$$6*MCBLwIUPNGt7((jS)bQ8nI;si?MPa?n1ayt7*y`8ykNuF&$&hBpc|AzlePNJQdHM&d>4`h81}Sf6KaBMjSVt z&vn4~!=_1}F1CEF(JEW_fHQ~T&18eKX+mqCNZEPIF5Fruv+rEskK~6=l`M_64`021 zDC@kgRxd>6B1f9#`Bi&+72cdHx zQ6wwZVRpcCrmh?38~hn|Of-GJy|p^mc-7(wz1?5m#@&197HrX1;}$HiTJ6NmKWBGZ zwyxCM)j#>kJI@1Ln-7TC`0ATZ_4TDP(Az_Ea=-%Qi`7f;C$zf!e+VTnwt4g1lV zVW+H5yKUTXE&A2cxvp2ADzDJ^>UZRl!>UHdMG{KS9``(8X|g!EU*d2?V{p$yli^ze)p_-V#V9?9-ln?+-q40 z^UfIwD${$8#JHISxIb}|J^sjV+N(*1I&&RfKlyNJiOi}S=jJ3Hl9GHbvwicamCw?? zGOhi@s`Yk}%t0fylFHf}hc7q((c>@sy-WJg(ntLUp8N0A{>A$f1>fBY(2}`)^TOdZ6YqZG&^ju2s;J`L?A$Y#Thv!X>D3&qxA{7+ z?bC<1t2H>;{x(1SR9al{|7kP(>+_XMvcLc5^kew7k{Ibk2P3iNEbptDg%xYaRzM zF)-|BVPKGlo}aY+f(m0PWF7K$Pj$u)DD$c&<9kjPP}6Gr31h~I91v!#4P!E7i^ujO z_KYHs9UI&4xG>g1Hi~YK^I_zMobI$eH=I!jsy~CSc0rlOxr~KScdRI5dAVGPi8G6hFkx;;R@Ji$j?E4l?RN6?{0%Xbxp+A7iwH zGBZvvN|wx`(&bj_R&i}qyP20AMHu{`~2`19`o~GK9t&hDroIVKY8!<=4g*)TD3LI z=cnE4{WRn8vz>DDo-dvl^YEFLeDAYNxpifqee>qMU#ujlJE3f0ySV4>8}6-YA64bz zwB8!=>whogz5nK+sNA}#%CA%Q-8-zEy1`2T9fF$$b<49KDf!77hmB%W?s3&RW13D*PX+&YxlHnud+~_eEZ49 zyNB0qy7BB`8NYh!s>5f?J!Vfbz9e_fUdEEZf+3I5IgT1}-6Wx8D$xXf2 z{`BLF+4f3nt^O6hd^`Of<4aq`z3Q$1+?Rfz^2P4iv*k}WWPYkRc9#8a&55(;jaV;z z3{kqZ%WR&P`lPqnSz^W?&-(oAp7i#m&lcOwX18uhmfJ;tes^8{&6=OGllPY$Jfyl+ z`gQoabU4JTd9% zrKP;yQdfJVjc1poKk}Zua+`*q_L{q5cLnFp>wJI8CtfDsbBk;ASyh>rxxVjumPakh zEO;y6HZ$h4(A!QQ)5&pR`@}YPUzyr=UG3K6uXA%}KU#V0#j>z7B3IO+87f5%B|opiIS_hQcZ+j94BuFv22+U@=osr!>+bwBp;ToJi^ z*lJPz%91NRheaJ2E`sUwaBxjt&ylix-c^?%QKmy^5Je0`4GC4sv= zjz1I3Wt@WcaQ;t7nIm@9Q+1mP!^HDPu81^lzG|XVZc~3(=xv8{#vZxq7OUuQQsinmWI2czI;fTcz10CGIxYCUkO{_-WMqj54p6$>+-o^5VSna!uIt zttz*pKcwxh+WqT&{q{o#7Z#K*c{E#i_XW@LyfE2#t$R{uRmxP}vHZQT;7j`gQ?`A{ zA4KcDx7gmC*YG|l#CeJe<{&Qn@ujt<;Jc#ly-B$ZX1UaUF$ncp9)QFPhI}YPhyT|xY|y=iA-wd zJV`#<*2YQN%wl4yw-+qW^fZ~Wu-?*mSx#w-Xl2=|3DzQp7AvN${;Dv2*%8~)&WCFG z-M_AENXbx}y8BLB`DLvhtE5#k|Nh@~wMw+~ae0ZGt9y*sp#X;CYOb5-|Bu<38NEk! z@fYXzRp0u}uPI4%N4}gm)7#>V&dJ+N#)~ys`V~8_dFX5_nKN1IOjOnDjd4@o?U@!< zubueORK+@2_v2E|lP-G}?YP{sVm{x+&2?2B?>=3&zrnzt=GF=%FSP&9a<;L**tcOy2kY7orVsz~t@M(gbZ}cn{qJ`PVr>upi>f}j$F|*`!Rn}g z`VWpLW~qJ`&ij2!@JT;7dyd?c%~6H>=Ep7c*71BAXg~eKj+`QCld1Eb|9)xsYs37w zMgEBTdQ7*8Tmm_)DdItp|gh%X(*_ z@aD(M>zC#?$Mx2K-DMy==h5?IrF)DkI(WajA3gtHL0tESpntB{vd6l$tKL6*T=(vo z|F55{b%JNMmn;hk=)QK>fn$|&$HRs{9vhT9&nV416xx(mck=xFMdpeMJG1#r?dzqw zj;p(>w?!`5w5I8j<{7_EmdhW1l$~((NObau(0Kc<~r5!8C`L}iDmbJ!n52mq9pH@+z*1)|@HMp?) zx8pAZGfn47w-Wpe)bFvIyC2g-DzPRkUU<3{U|LpoVYByzWG+WcsfYkl*k z?9HJa(y8YBvsy&>B)b~tSS56<;bFYA*?8)SBiGNYnZh8`?fEFqIKhD`#y5e(^dFk%&Nf*jP1b2RjX@9;};i}8wOk0%#Y2U@XuU<^>yk`|v75i%5 zrD{1_-h7sq5>-|b&bN{bzuERYJ==S<{Y3xmo%|Dn?F0YlJQY3tLgQ(?f`4%1_USd# z4^)fyZj4yZ#X0}GjZM?KJJt0{A_ZTA;zAFE#zx(7UF@~tnf}TG6Z7!5mv{a?wcg9` zhWJiC4MEdjIakg3W{wkdOLUK}nDfYFvRSZb?$V=E7DU}@d#(1O?AAIx3+^4~j_f{u zC3V`x46Ai|n`d;bj6VBN=-XHGsO$O@bk6L`Qr0-JE?eiq=iD9L@-O(m8BEGgFRy>F zMWlD(7OVO#KiAbBGClF*jPL}W2=y~eQ)1Nt(--mIQfb zTb&Kx(Rr%$f+qKAKC9k&37u<%e>b)~V`jZL<@*!Ac%|+4d=Fold-ZGbRK7cY>r1AF z?BWg26hF&TFa55|tN$VAof4mtvXtP1E8>jw-hSTj(9GuSjb~Gi?L6Nay+6@{C%t&- z=>o^v{=j>zQg^R-C+l^dN?yKuOQc8d0^7)_>m0g=OD`H9&$i&Zr18+jFzCfqUiJ-q z(?zOUHFhm@(sx-H{)@*wb>2hf;)4PeA55hy9qt~`cAIy@Ew%ohoqR>5bxOrAPX$-i z3OhF5-y9d}=PWz0)VEc8HfwkoulP0wy&TJ!>t1WtHh#Xva9ygp<>UJHV_$Am@D=Bb zZO)NP1iPkmt?YTP_FpD_N5Y}XUEeNgx}IT{aEpH8KKTz2W(NO1MnQJviamoPg8(t=?Xu_2(@4 zCL5Z6IAs*JAm^RvnY~>%Pj6UzJ!ijGnOeQi$-bJ|D{G=>{oH2qSvPajlw>uhU%G0n zcIpQWV+=O7tI4Xw??~9BAfh*8(XnKu_(gv%hlpAEKfU{;)1z7|Mj)uWa=GRjwJllh zOO*}e)6}-D4d3<=*)4^}-eA4La8ycU?chea6D8`{JD+HldPv z;o^5U)So|Fz`Sp5(xFXqn|mbN_|`4s49{A;diFeHn*~>V+aA{SF=bu5_ej9M>0(K7 zNGwPAuJZ@o;*=v^FB6+^ub`#PdQ(l=Wi20HYp176ZwXcww(W^{(NbSKFY5KdwBsjl#@p*Fr|e_={9kR;!u*RoRlkec=)E%UFUGY?w@;kEr@7#t-qy?f3+LNAb^I{AbJ737 zkvcB+uW~Zy&nLXIcMqul!5Z^VKk>uL0r&z<$ZbMF4br|KWp|M#t5 zaDQ>yUuNUK{M9e|=lIt@3jC6;=la!Z=D$;^C9TUBu33}Ns~!1VtL#Hk$c(RF_{=x8 zn{S$KzPW#UvE1?-=dA<9-aSqHBfwr^-~XW5X438ok@-(Ao-%mX614rXUVQzs^#>-I zKd8C<)$!tHwWfRav&*{gg&Quvn6!`iM`x$bYVWlsd=8NF%u6TOexh{c`rP)<^B1C5n`w@j(;Qcm8&R++_75~sE9@oc`~ByH(fc+V|&&s?jWy=8@y-aX{2l6bal zesD>j^-H1m3$9nH*VgxzUo@{Y-+QwBV)@U!s_E|&&3$TF-ao$hhe7lf3)m!ycM@|B-e56YG7|o}W$SRsHqV3%aEi z>{{|=M(CQW-FfYY(jE$EO-&gwOmk9rS-iU53A0;1J?v_$(g|LrqWK$K)@|sDd8}Mp z=OlW(hAF6u^Gscr+lS?uCi7VqFBd6xoNT}};bf5Ip$QvIm?B@gKHc`)$fvFG-x;Q# z-eM=VA5eVO+VDxYecdDOJL`^}dKFR15+vZcz^rq{BCSi|Q&vVPPSQP76k%Stk3;u| zjzL{LYfk*4qLb>X0Qd$c(c|oc=4g=jj=r2j+%=e7kN~=N+L@6sK5$d zcfEAw7oPz7RsWzn>*~uH%fnad^Q(jfzVyTW1FQYA z&OgGl&e$(4>RJBzd}007_zPeEXmh;19&-Nu;p)F^aj$E=KIi8$T1^O$4PUn5l#!&M z$MVuzUd_wvAB4|X^&rq^hD7Ft-(edpQ&ZopcfOgo_VD7Bb|QwQll@OUZ|GRrvS_B@ z#WP;ZcNHwnUR9%A@OY<`2A&ixbq>7%GtLsZWt z6RG7dMJ~yB%!@5)ezr{OtoLbC`L&n+Tv_roxZA8}(yfA9i&8-S@zZH8YRe`d)s^^sO}deVqHhpY`$#w>kg+ie}xz|MXe?qUDz@BF?>^V%oal z|Nan0Yhl;V^{bh_v57q2AO15&wCw-EGtUD~b^X}$_s;467vyz&y((5X79>`is<{2$*ODXFHd9WS^DJiw2K9~mc19U zGPaZ%PtDLSvfJyHquOPlIsJ{xsvnCs70J(e{C?`x>`%L=pOn0xqSpJRX{!I#cJBup zwX|eaKiyq-q~JiA9Iv$B)6OT+p$Z*Vf@f>pS5{;tIP>R5n1407o3}&m#X^1s*68cL z*&A#g8k}_sE}OAzk!HQU&*Y0f);%ZQbDgpExxV0LfyA*FTxaapyzsSga+@~qVU^RZ zyi=#kuBIOnnR9H1opq=@=ho0C7xNZ2Y?BHwxsbAUVp?W)#=33OvbIKN&M%X;U6s3_ zKU4apuA36{%d~8TUC0mTdj!M-JEwNXiGr7cX02tg=}jl=Upwkz?Q3?d+ptlx3^-aTza=` z?=9Oe9N*quf47-2w&S@aYeq{_m{6GGcI^)=x0dH*%um|hrR#SqKQrBOYt#j<1#+kJ zeq|Z$ZJ)({CFR!Pzgb47Uj-!mUb9_(i_!8zV{{>c?AkkY&;(=H`u6`~jNLLwkA z%fEhtcePN~*Fd8!%Nx!dFA|#H`OQ`>O0$XEENhiVgBxS>`Ui4sLBc05y1IV4k^gav zl(tYhvzUJuH^@PM3U};df7B!+D+?>A%((N7hAe3)#Raqr|%CxN4(q%F?jF zsomYz10^d~GOzqzwvub_Ld$b`QtMu2ofI=aTbMPqejSIF0OTJZO9gZ*Eg*m7E0ea z9=JeMqqS;|`=UFS7Vzz!+VzSn?Xb{euh-fqPH=DGZQHZgOyrqd7OPfn?IaWCGuIz1 zxVIqj*7ahh8y>G6_@73yZ~CL#;QB}Gjo{4Zjwx?T6PNg(WVGkb{9n)Z_^)2m!DvgZ zN$K~MyhHYB)kM~w6#XRjUS?y+lZQDbWv|6;)r*s!xcbkH%iX2=v(dTEcX#Z`tA;a@ zyCnQ7(u-w<)@NLKdYt?4RafCNs@m3O;cHv2@t*xL&nvs1*C%_c{G&YkrsQ9SPqXb8 zCcRyLq5J!bs<-JT{=Y4Cuhu!%zupob6!Kg2Zf6<)HTf&|!Y$Su+j~t}aG#s!->Rs@ zor{CKA~@f<+&a?g^(r{voOop4%S7w>JMRB-Tsz}d&XZ4pU9+2RCjIrZ-1KEZWLIg4 z_lLHIsNXCp%k=8i+P{fcge~cx;2Yl}m&u*EWNntRZs_FDlRHbbChQN}c*KxHK2&d!Wnx#Fys)(peu{Zg7mUVirt-rgu& zw0}+sdzr<_3$Z4S<(FOVIvbbhhrY0zwfOnPq`UrKtL*MB*`YxlvFq(w3c-^Hw?6 z3uxJ;$8C7ewkqY?^2XmUPy9~5U{I?z_0{!@r5Wk3MMIXJ-()Gv%50VQmuvHdN0ky? zuR7C&&P}e^v~=r%*uQPnaR+6)WWpu7*xaw=A6?q^SfY~0^LM?s_FTS?+HIdJt29Eg zb|h&na0%EsGqzteL~E}S^Woscu!_pI?cHJvKbBtHv&QQA!dt~Ax4C2upWA$kS#v4> z2mhqgALief&hDZowSt>}a`>zpoL_gp(fc6w`f$2wp6@TG5Bq1-{1Qso(&P5xbY@Q+ z^UHM$URLSeU2)y<;p>%t@%5hBUqiRJ?r)uULHb4J-idsPH7@bqcYj$`asEF4!k6oO z?Sbc<3HldhSXFd`pG|N#4|4l^>FKon4i7X}b*y&gRGlBZhhzThEAOY-X)ShNd*7{b z(^~uIJAGdEPd--=@bWx|#H386apambDFm9$&-}@4jI%o8g-P-O@HxC&_~=hJwrFBUWL{A%T8AZ=~LpGTsjtB_ZA)a zmHa9A_N_&Wn0xPv1nfP~6rpgdW?cZSA`LTM13xEZc7A0Y3*YvM#Y_e);CcA%N6VQKpqezRnBGE{ zEJ(F5r9efS+L(f&YHxNibxT0BWh`d;2%SxjUCLAgReN_iQx>BzXz|5uZU0NL;tUK& zbQlP-tgBbqLpxaRqZNqO?j zlC(pQ_Fb#J9<}24r7L35LaLmuj@jH-Z)L5%nsqfS`t_wCh)PR)bxrICzo!TQkkJRJ?*k=jGlLEz0OoQ zozP7ouWfD~4z5^r?sCbzcMG%TEiCRmXIyF*DUf#Z(e=u0HqT$!gwOk&GIPGOcV*)_ zZreQ_*_$1oi1dnAXUI%{wZ~=N@>83x96tTS<9HkGs;%YL#mY;m>8zgceIGw(cE__AhM{khjBaqB;`@t=LtyD4YV)7OW*9iFFE zZaZ;l)y9>Dv(L>gt%?lUbo8*Jo%izlr%#9VI$PacUAQ|&_}oK|@)MtUdl$=PJ(zK< zu-Dpl%cSj@d+s{-?s1+r*J{2l&wS_9uxGh{Sd0$ z8S?z}lb^nG>-EKt#xMLl^;6x{f}*YM>mO#9?mKt*`e)uvcUD|}{%Mcr^8c^C*w5W3 zaB|_f*{-SEPki0}>W^;V&D>2j(T`*0tY(*={v@kdv)iFOqh|TJ^2!%X_f~wqE4Q!x z{nej#mG|C1WdE^Ss=V?=QD5ht`;(LTPrd$L`meF(p7LpDtN#JdQwRUX%!axNFyDrrS(c7dliF zmnPdt@#N1t`=oPbW5(%e0S02}T2bNRoq6l-U6kQzUFDydu_ljW%WQ{JT-)6qDKP3U zx-;!u#uc99*~$;MJxE)&(YbF;y;1T+fxIpI9)I{TEkHqRHp3cDu56|aYDnb&wI8IQDU^3YGoaOMrA2w>~o-d`;!gH5gO_2%{=b6nr z_wCuVlF|j1EwcHsOH>7-gge-t-o00%lRrgY^2(!oX->~HIF4;+QLHRmuyt!-=A`n5do9kLx14mDyg2yXhL%WO9k%mkiyvIS+Gso>zR$d@%|AMr-?d%&)LNelU)P;} zlJoGyr)QhbO#5-cV`Ew4L}An9N9%aKUbg*RcFtMnx9Q!vlhR`an51N;e$vg_*7{-N zu6sTCom;qS>o=wuMRf-S1ouAVICk_=^C$i8*%uvbl$xI3h`J|||9-KAgvzN!=eC&{XKhp4|5~a3qU6H|d>vW|&64-! zIv%C@-n(|{YpSZ`d;hNiC%Kjh-H{Z1E;02};FYVAxrXA7jEbC^Y)*0>Tbv?$IlT?{ z6h#yTo9LC?QFOI@$-i=Yj=G)J(+MS+w?Zm+=UifZgp&EyfjN#z}#52e#))O zZ=Z{ao}a~-vLh_9OIa}{+D9~iNB*?;=cPw>wq4zJRIDv}@x%n}7&U>rIyPr|w*~qBQH$*(rVEZi^e|mR0F$X`YSv(xA$$>rK*-2_vN3fg{s)>Pd!#R9e&a6slTRdSefn7 zoXry!UG%uJ!1l|8gZ&>Jo8K*~=Gis7gL_ur)E%}<#4ZCPww{ztj&ca&cdetRp= zIYzF%`W614{68`tGILMb@jjhR{+Tk{|2gxWstrS4PrH4%IdH+psGQdDjR*Zd>+{sL zwP*kFu5Ye)&6oPK=7Q`IVSc82#Vn0=XZJU%?O(M-`j5^21t0Ty>jG2GbkF>_<3dpC z1_{ZZ+Fn}@>Tl%dvkYNtu0O7?+$i(*$cCD>2Ek_A)Th%{x$OKVyZM4rh;~6!yy1`U z2I~7y9p=5|zSom!5l3^K&tA5_Q|j7eERQU{WU)<4_1DDui1Zy?igBtYm-cQJPWAKr zEwz8$M|qxq%KH;P%>H8)GVNZG$`NnK5;c-8yMw{-{Ke=Nwz-tb2HPq-GteVsHw(cfbfo)osB(KY)SloE%FxMkTJe=KW;iFg29AcVoJS^E^ z;y&$R0XM(fD&q%1?P}k7CHP{6BK6K`i)sqBDc^o*C}Vl(nFIeuMr7r<*6*OEm`zS;tR9kj7eL(YW8Xw zio7gi@s(s*&ewFA?cmF{!wy1A-Um%j{h54Culcx!drr5@TRB%QuiOR3Y&(>;=B&LZ z)SEN?r`Fmc-gnE=wNxcH**%fW`Kn&$D(MrJ!&{g9E}}2Yx&7PYj#&#g_uXwe{UTtB z-u?PdE*_~1le2GD_4G+RpYvhrm9R3_eM`1DHS&G=w$^z{fzL8s_G#ZtWvLnQN##a2H=cVo!*>6OaF5o6LUrc7gfjH9YgCdH(V_ zl-~T7#nCo{zi@>_=e3d-1Htt|n^uNo^gzME*URZaA2?DDdI*UEMsS1B}=+4AYw ziR824)4YTV)VR}T+}@WHwc4u8A%7wfFE6GUP@OV4FwborLTG9_ifTrqpI zWh_>UDtr~La4xKwnQr`bb33=Q+@t_8u1%8u!H-s*E3mndmu>%ZQvJHx>gZ$n#qBpI zS#G;@W~$5;uD)9>JGZeny(m-2IH+(st1Wo{g)OrbjrE#W2YChwn3~8YKe`^}n=*@| z#w&aJtE^)$Savmw2~C_WW2C@PbfRa$JPF|sUpx{I1y8@m^7Qv_msfAuHS?7j6E7V2 zD4{2S5*3V=Hhw%6Ut`TRJ?G{SbhD)@;g@f za@T$pz26Xbs{D@Y)u;EE8s9Awd>Xf&_35-~?zQXX0<6|`t33|9;=1(dy@$=em3L*N zw3a`4(6*j?&zFlU@>K8lZ&biY?VKd8r`X#1ae6#jU&B_$lUAT8a6p!wiC26mg$z`PJ ztzF*EXz617rQ^~{=UJuR*(H`6T(ga}PJO?e!QNT6C;8XQAF(FO+KaM2hX%MZ8az_ipJh)4aC4d8$@`r9=OrxCAXt7hT&l z?!avBKrUCACH2k;_Z4Gz>7Hxe)|Wo@`R?kKYu4?Vf9iSPPd?u>3URKpDw4mIOk90$ zBYTU<4p-jLTTVVLw*|H)Tvutnr7_=3S!UaT#HNC|WeIH$SQ1qoByX5yOybgEFXLSF z$HnrWUwEo^IkTC~etSD-+jP$@G7FO=_IADWlL`!bSJShq{`=(=!6L4I9&1(x zXsz>j6vB|cs@IseUZAV_ol(q8bGB`dI~x36R7mSCeXF@{lg`OoMpis`H#PO$Sl7gP zJZ)3lUSZLO#y7W5O4O=5)tNZeeb{8<`a$N$)15m$*p!|ucpdO*5>u7bEy17lj^}T1 z9_8N4Ia^$Q!AswBcC!NKGf36%F`Z<1ivMy8v&rU_cdCoz&wkonvo7w_`$d0@7}LVP zT%5D6k$+F|eyOdS`kygwUBh&sM%(;prxX9=XHCo&-&ImSI!kfh%GuSlr^Ga;j<0h)xuFq&uSX#ff zdt!;0?dlrE*=1T+tqX$NgZA$DTFm*^qU*!FZsB~@D?!t*@aOD5Fu%2Q;r+LkJC}#RijHKeWp^6kMD}8n;bg&tFCw)`56(i?Bj~Sr3Ys4wVro=7u%Mzo9(A! z1BKg#UyeB|7*$l`If!G-w=llH#a zR&!_bv^wAY^^MtmOQ(LZ*~>7w&t2w^nA_!o&q7s#b6)JI=GyDBpSk{WplRH)@Co0i zDHi^b3*g&vl6h_@pdm*XF+F<jetoZ2e*HkR-S;}H;5GBo=a*@B-|x8m`pU~nvtxOmIJU%PIj9xwo=_X4x#zxV z0K1ZO%ZUSvlIKb;zo#O!N4oxMsb#92zkKehi@VtVT`+whcyK>o>d#V(r2+He!JxuJ(Y%u=vyWsCmVCHBe_ z_xN_dl%4XtJn;Ly#p^G}XKMfDjr(i&b^-qjprllL6c{U3z>cc|b0 z)ql!M|A)KhAN=&cN&cU--8cC=A1wX;ir@Ip{DpOQW&^L9UEfUi&CUKv>fuFV{%Pj^ z$+9)iKjeJ-5OeP7(K*MLf8Ma9oj>^MH~$ZFjVI1fbxduZ-)Z(m`p2@S3X?znr>3!Q zpL#Q1ym7mIvj6j)t1j$q^=SC7DrCE0e?)7ae|FL9~7q?b-wX_+(SKsBgMV~Kp_7)f&J4T<%vmlly0D&@ zc4Df5Tfq8B4BtF%d<#4?e=-Blx93*bpXQhzu8|Wxva@|>P^$$eIvyNhzKtZVGAW$od+@cwPR(%twQrUkS4&sHse zoyYlc_30W`JLjZHRSwRZGknguIOpBj=FPX(Q>Lg<-D-Enjl2wv>&yS|=lgw$@4W7* z&3x(6?b`dld=OuM>Y>aMgK*!t>*D*hoGn>a{+z^Ir1Hvs;t8iV`|0ryrcVm|ui0f+ zXxRHuID>1xhjB&IA8QpW(R$&FToon4(*upCUk+P$mSVAGfDiDmR+m#$5PV;#ye*2KbBr7eEg?Rz1{rl zA6@s%TmOW&#y0=SZi@r42VOiAvpcZ1W`eKXncP1j`47_zUa{sqpKftPfAiH_`}*AS z^pw6Qr>xLnX%8-a*?Qr!#MSm{#i>(uKPh%|OTBS)+u1XH^^0?ja?@74Fk8?YHPyUm z;bhhm#s6Kt?ctqN&y^vuKj*p7%GC8L#V57vwVF3H**WW#9AIOg$X|WnxJaEq4H}Qt9(^Cs^*XG|ZY*v@ctM^{{X{54q z_s53}u@~x}?7dK(C?CrrA~|tcGSiI7B`c*~zP51l>zjORZpew-88Z3HI}^4|D!)`> z*Pix~)ujFW;>sGkv(LE|?;Jg);(hRm&C~<;gNz@ZO6lKwDQx;=sRhQ8o~Bm4lA2dJ zC!bAbR}k-Ays|+3q_dq?$^IwPCBxsB(wh2mXb)@w&nTjY#pY1 z`|Vn^&?k!Ti&*%#i=mxo<91c)K3chNceG(pcb?|O^DB2wSl@Et`h|}*y1ma|ub8vm zopncJ)=#mhL*|;%dQYP#7eD+M&^ddl(v-^{AzO1U*o1QaUnONA6x<{Hy(a0ptbfpo zx!>LxNeNZ1Z)7M<6?hi4p}zZgX~Jf|jh-(qxvSlj(e^t~zUa?gSJoPH(T{(3{EC~h z@pp!Z{REkXn@$F-G4$GhbV7jCTn)KT+ZTVEQ!K7=XyeNX-+x)X=lxptEzcvRaQb(* z%zI1K?mTgdzyIXT!r4nt+({ChIXiUX&Ygi)rQ6#MZaDdJ@79ecpZ*O?4xaXX+p&7J z?cZE8`67H?s^xT}@_qFLP>y@%>A80-IOzC9Sn|6gY22ZOI4gHJU1Yfqim zE3>gT>xRRA-Mb!|&%K^E?#mQ?ez34q;+fbN1O7wWS(=A_zF2#AOXIl*OuN{*-UUlO z3B4L9?^Shl@e9o(+IP0duWf2^kt@BNxP`~>#3x%TrW392%NKKRtXU@IZed(i`yr4#yQP5rsO3mr?cz7uKd(7ydwQ#TgROH!CHtB^++p{;7fwqL)_xlJf>Ads z`HHwwIRD*!;df0=oOHLaSJQp5+8xJtCF+zs*cOPWh1>HDUd7LQ?vNNtlM`iO? zP6h^6QP38|?Tlxb&OoOLE?#Adg=_*8dET#ni;aPSk$-yNeJ0WAlFcl9+v9IAJ%MiL zbHC4|0a59t`e20$D+9wy@XcDH)7OJkE_leK2etRoGo~!4YaCv{xA@I}$>hKao*DVA z{QBzzW(I~eY!KJHXIjn-ar~N3Osk<25z$|n3ZOQh|IL&t2vK0c%bX8Yu$rIw5L8>C zFmnrZd*M$hW+$lE>{XbLLY={(#@q^JPE==Zhcaa}na@L={9cba6KXSi%7fLedChWQ%Iv-Qjuq5C5nx|t=R zj+#4#`95@Fr(q`Ze#ndz|Jv9o-#8c;WCcO-C^CKCOlHpQS+kkhIKhFh>@A(E!OXx= z#RieS)62rYec=*jBdAlZFK1SShQyzB%ob>k${r9EhW~H;JVMzv#f;L7N^RxfgOBB)pXg* ztVh@w7+AR(7!;-}O0tMg*P6=0v)xITe$LyEnX|M*T(LdSnx#(x zEIR#hG|NsF5U zam2BhL1djkERdbkYvNe+Aoi?_V=;lqK8u5yq7={K1`*4NXYqircEq!ILRhQ`Fji0k zi$6qcX#$Hog!LhT#TA@-E=J3Ig!O$0W?uqw)#{S4>JS9URDMMJq83= z(s(R?^20oX>E{wzcp&E7OJtE^k}ID4Fi&dw^>P+SI-jnU#3IF%Q8nEyiA5J|;@qb8 zN8cG47-E>gQ;%>XmozS@nY_DNMJK?Ukx7J^i-Caya<$dAn7Gw_%nS@IYzz!4aODgP zOB%1&P2OECJ^f!2i#XWmM_-fTLH7=_GlK3OL?~U-xV&k)X)=pGSe5q@)$AwC3=Deg z3=EnGMGQ+CH#AQ^-K0HzeKO2T`;%Fum~OXEzn#pY4%Qoe^ab?RVFm^%6ulXXrYohe zXnB14AD>WbZx9oF$Di8>c6vvgkrgn3&2U&A4^)ge{8G&!xh=cQ2Ji zdU`+_i}-YbG!{j$qnNyc7F}avV321;_u!cw(*x63G$6*+rm;vf?w&p~4QBo+kih=w z&(c`5!RD-7@@6h*?)xY+y0Z+APB%=4rUjeYS!IV=85o3k7#L(=E@uEmZQSw6f%k+b z_a5V(J|`XK-Zkkg(u`-p5(Vcur+0KR@=X5#lbx2qBF%UXE@_d$A`Ny4Z)E1uWEKX7 z?HmjY3Mh6sUVy6RpPpaD!UI-)r{mm=KsE-3SRMujSrpZeu1r6e!J-ZE{|As|wI_OotzXWTwk!v1mc8^vzp6J`bm6BJ#ouR*$|&&_7xob2^d3~Uj^30c`J zQcS&XVbb~#(F-8a74Ko9oRf3kBDwCE^2^`_j0_B4nHU%>Q0y`K2+}h7-8*Hl6=1(0 zF0DgPlp3EW2i_9{U0^2!R*8I~mokdE3}Vw6b6E_*s*JT7_Svv8Fog1=C%ZCnkSdAk zS-C7iilFkZ3U&Y(3j+hHfp26PryI&KN=~nrX5^mE(aXXE)&M_>iJO5z4#fpq6u=tf zr}O5)Vp=wjMT*&1opJhU6-I^WcgtboSs?LSnvByU)ESkg&#Ho&{d2SLgk_uz3_FDw z81zxhPSatWe%+W+e)`uu7Fn=6zT7f(2&K0hDkw)OceQcR&v(@*EKK%@E}NF>*Nx>NzQ#-8p~z#_%; z-f#NG0v6Hf)dehK;9&1i-6wyUiGiVum4QJO#hQPSAf?7&RWBw@JA93WfgzR)z2p#y zoz7ASEjbVeexN4_^`z;6h46B!kVT4le-7hx+bl+1UG$n|H~-IjZj1~JY)lLcS||=O z%L8kXn=VwuA_+;*`b8{K%t!LU;>^kYoCYb^u4kN{ zSjQ+feSZz3C^$WXnD`t^ma%-9Xs+dI+Y}0|4Y)7B7GBB`lqbJ`_-Hg)IHti{4kz$sg3Ko}`o>{~K$$uAoEgxAhF)+llpy#X`v!*MT z!pgG1QWhyDuesB6OJN1-9FWM0HPd&LLhI0VQ4+s@FfuTlU`98||H!m5m_d4FEKz=f!RhUKm%+Tpj0_Cr7;1l>ntl&% z6Hhsd6qDH5=^EuMx?nppvxSep1g-AE(ARX4aoTxgD-cJpp!;R%<>~v&VV-$g&LYKp z_8Q}K?<^^&okYy5|*?R zD_NwNZV7=zM5bp8FbRMI9^#6PAh|yx)8(sJM5p%&F$sd@z^0#G)c#nSk%3_`BYOI( zkpZcPw2Jm{2)vhpszNO!Zp(sH$xQFBVu75EGksMRixiWUJV;m?+~fpDOl^Jn9Z6OO zhNoQUzF4QlG+jr7NgnJbu-Z8IDKzM6nGKkxH|jFUPp_|rm3;lxEK*FJhSOJ9vuJ^J z%l_Oj^%XM%!wYtF-TRH1rrR1qZ36rL%rV&cHRuhCr{>cgYgn|wCc@9MF=t?qK#6Mx zd#34iHcXO;nr7|$C96Oob%hbVWYCRenm#{@NfTU(K;ng`mPLxWKaOcSV+@lV*#BTx zA=WXX7o(5UrWe=3iqZKX-TN|`rW>R)$xM$Zfu=3^0!Lo zUH@p>E=~r92x0UZ>{!iogL)QqNGL?tvq&*-Z)2LS*}?=VF2Hv1-7os8z{0@rkR4sO zeCPCoaNTd}S)`cCdZ%+VK+CB0s%eVr7#SF3n9+L@tjnecG_aUMZ0&Afkz)F_e7Zv; zi}>_?4J?o~n$vHAgsWD8ge9i)H9|{Jw3V4~A1`Tqu^Ob*0PJG*Ek%D$FfcIaGNRY+ zt%s*iXk;-0rzT!5q1Gl=28KwCoX~%SY5J*yO!64r31^Oj0wydB4EY@B3DEb{biF1P zHL&%FAt&@AY5Te9B~7p*X<-wK6!X#>Ow%7+g(d|^fV=^Tv)yKz?sx+#4t6fnL&KjR z85tPvV(-bE_s30|NsK1A`7cC4stEJOb1C+hD^IzHKa0O!Yz_5wYp@ZLlhS zZX1gfv#S{M^af#Ox#?JFGSH3M8DW1rgq*&dfJmzXMhl+jp=? zF@4Ym$svz6ba${wF&{Q$p8ijdS!4PIxbg=e& zn|V5?Co`my0Q=%%)u~%btPBh%I2ahjQG(Gwbb4PWiz?Ve#Lyvn)Gv!-p8hbLS!Vi& zPN?&zb+Je>O;4IG(*;YY-d!wG%==Q9r~gc3R!1tg=Yzy0)0n3-W-v=m&rN1#pMIwc zYRdFCAj$U-NxA9j-LNqi+in&q=3`l4O@>H@%?61x=7Pl~reElW_Hm{zd0RA{iGhI= zqg}qVo_YF%8fG+I-z(3hvYV#Nv7%nrQ zS2J@yOn)!|TFtDQSLGUYfsil> zkO@xU#E9e`1`#+%fZ?s<3+d^KQ&_~Nubd1`;_y*wjBx=e8Hm!?lcD|ONmUlle=##K zM6;ofSotb}lg{ejw#g^CdxIvVLGgUUE)iaWSIv&%gk3 n=X7v-*d90i^K=$Frsr|fjc2fU@*QP3%HU|jz)%G0!7=~<2KLcA delta 40174 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 A&Hw-a diff --git a/res/layout/activity_connection.xml b/res/layout/activity_connection.xml index 4ef82e8f..c7ad9d47 100644 --- a/res/layout/activity_connection.xml +++ b/res/layout/activity_connection.xml @@ -16,7 +16,7 @@ android:layout_centerHorizontal="true" android:text="Pair with PC"/> -<<<<<<< HEAD + -======= + ->>>>>>> d7062ac2e0b306c42144c84690a3735c5878e11d + diff --git a/src/com/limelight/Connection.java b/src/com/limelight/Connection.java index fd398ad3..5e80d252 100644 --- a/src/com/limelight/Connection.java +++ b/src/com/limelight/Connection.java @@ -1,13 +1,8 @@ package com.limelight; import java.io.IOException; -<<<<<<< HEAD -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -======= + import java.net.SocketException; ->>>>>>> d7062ac2e0b306c42144c84690a3735c5878e11d import org.xmlpull.v1.XmlPullParserException; @@ -34,15 +29,13 @@ public class Connection extends Activity { private static final String DEFAULT_HOST = "192.168.1.240"; public static final String HOST_KEY = "hostText"; -<<<<<<< HEAD + @Override public void onResume() { super.onResume(); } -======= ->>>>>>> d7062ac2e0b306c42144c84690a3735c5878e11d @Override public void onPause() { SharedPreferences.Editor editor = prefs.edit(); @@ -64,41 +57,29 @@ public class Connection extends Activity { Log.v("NvmDNS", "onCreate"); - try { NvmDNS dns = new NvmDNS(); dns.execute(); - } catch (IOException e2) { - // TODO Auto-generated catch block - e2.printStackTrace(); - } setContentView(R.layout.activity_connection); -<<<<<<< HEAD - // this.statusButton = (Button) findViewById(R.id.statusButton); - // this.hostText = (TextView) findViewById(R.id.hostTextView); -======= this.statusButton = (Button) findViewById(R.id.statusButton); this.pairButton = (Button) findViewById(R.id.pairButton); this.hostText = (TextView) findViewById(R.id.hostTextView); ->>>>>>> d7062ac2e0b306c42144c84690a3735c5878e11d + //prefs = getPreferences(0); //this.hostText.setText(prefs.getString(Connection.HOST_KEY, Connection.DEFAULT_HOST)); - /*this.statusButton.setOnClickListener(new OnClickListener() { + this.statusButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(Connection.this, Game.class); intent.putExtra("host", Connection.this.hostText.getText().toString()); Connection.this.startActivity(intent); } -<<<<<<< HEAD - });*/ -======= }); this.pairButton.setOnClickListener(new OnClickListener() { @@ -154,7 +135,7 @@ public class Connection extends Activity { }).start(); } }); ->>>>>>> d7062ac2e0b306c42144c84690a3735c5878e11d + } } diff --git a/src/com/limelight/nvstream/NvComputer.java b/src/com/limelight/nvstream/NvComputer.java index 99d77431..e60ff5bf 100644 --- a/src/com/limelight/nvstream/NvComputer.java +++ b/src/com/limelight/nvstream/NvComputer.java @@ -1,8 +1,8 @@ package com.limelight.nvstream; import java.net.InetAddress; -import java.util.HashSet; import java.util.Locale; +import java.util.UUID; public class NvComputer { private String mDNSResponse; @@ -12,15 +12,14 @@ public class NvComputer { private int numOfApps; private String gpuType; private String mac; - private String uniqueID; + private UUID uniqueID; - private HashSet games; private int sessionID; private boolean paired; private boolean isBusy; - public NvComputer(String mDNSResponse, InetAddress ipAddress, String ipAddressString, int state, int numOfApps, String gpuType, String mac, String uniqueID) { + public NvComputer(String mDNSResponse, InetAddress ipAddress, String ipAddressString, int state, int numOfApps, String gpuType, String mac, UUID uniqueID) { this.mDNSResponse = mDNSResponse; this.ipAddress = ipAddress; this.ipAddressString = ipAddressString; @@ -29,8 +28,6 @@ public class NvComputer { this.gpuType = gpuType; this.mac = mac; this.uniqueID = uniqueID; - - this.games = new HashSet(); } public String getmDNSResponse() { @@ -46,7 +43,7 @@ public class NvComputer { } public String getIPAddressString() { - return this.ipAddress.getCanonicalHostName().toLowerCase(); + return this.ipAddress.getCanonicalHostName().toLowerCase(Locale.getDefault()); } public int getState() { @@ -65,18 +62,10 @@ public class NvComputer { return this.mac; } - public String getUniqueID() { + public UUID getUniqueID() { return this.uniqueID; } - - public boolean addGame(NvComputerGame game) { - return this.games.add(game); - } - public HashSet getGames() { - return this.games; - } - public void updateAfterPairQuery(int sessionID, boolean paired, boolean isBusy) { this.sessionID = sessionID; @@ -127,53 +116,10 @@ public class NvComputer { } public boolean equals(Object obj) { - NvComputer otherComputer = (NvComputer)obj; - if (this.ipAddress == null && otherComputer.getIpAddress() == null) { - return true; - } else if (this.ipAddress == null || otherComputer.getIpAddress() == null) { - return false; + if (obj instanceof UUID) { + return this.uniqueID.equals(obj); } else { - return this.ipAddress.equals(otherComputer.getIpAddress()); - } - } - - public class NvComputerGame { - private Integer ID; - private String appTitle; - private Boolean isRunning; - private Integer gameSession; - private Integer winLogon; - - public NvComputerGame(int ID, String appTitle, boolean isRunning) { - this.ID = ID; - this.appTitle = appTitle; - this.isRunning = isRunning; - } - - public void launchedGame(int gameSession, int winLogon) { - this.isRunning = true; - this.gameSession = gameSession; - this.winLogon = winLogon; - } - - public Integer getID() { - return this.ID; - } - - public String getAppTitle() { - return this.appTitle; - } - - public Boolean getIsRunning() { - return this.isRunning; - } - - public Integer getGameSession() { - return this.gameSession; - } - - public Integer winLogon() { - return this.winLogon; + return false; } } } \ No newline at end of file diff --git a/src/com/limelight/nvstream/NvmDNS.java b/src/com/limelight/nvstream/NvmDNS.java index 62892f52..5efd2f55 100644 --- a/src/com/limelight/nvstream/NvmDNS.java +++ b/src/com/limelight/nvstream/NvmDNS.java @@ -7,7 +7,11 @@ import java.net.InetAddress; import java.net.MulticastSocket; import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; +import java.util.Set; +import java.util.UUID; import org.xbill.DNS.DClass; import org.xbill.DNS.Header; @@ -15,214 +19,228 @@ import org.xbill.DNS.Message; import org.xbill.DNS.Name; import org.xbill.DNS.Record; import org.xbill.DNS.Section; +import org.xbill.DNS.TXTRecord; +import org.xbill.DNS.TextParseException; import org.xbill.DNS.Type; -import android.content.Context; -import android.net.nsd.NsdManager; -import android.net.nsd.NsdManager.DiscoveryListener; -import android.net.nsd.NsdManager.ResolveListener; -import android.net.nsd.NsdServiceInfo; import android.os.AsyncTask; import android.util.Log; -/** - * NvmDNS implements a clone of the NVidia Shield mDNS service for use on Limelight - * @author yetanothername - * - */ public class NvmDNS extends AsyncTask { - public static String NVSTREAM_MDNS_QUERY = "_nvstream._tcp.local."; - public static String NVSTREAM_MDNS_MULTICAST_GROUP = "224.0.0.251"; - public static InetAddress NVSTREAM_MDNS_MULTICAST_ADDRESS; - public static final short NVSTREAM_MDNS_PORT = 5353; + public static String MDNS_QUERY = "_nvstream._tcp.local."; + public static String MDNS_MULTICAST_GROUP = "224.0.0.251"; + public static InetAddress MDNS_MULTICAST_ADDRESS; + public static final short MDNS_PORT = 5353; - private HashSet nvstream_mdns_responses; - - private MulticastSocket nvstream_socket; + public static final int WAIT_MS = 5000; + + private HashSet responses; + private MulticastSocket socket; static { try { - NVSTREAM_MDNS_MULTICAST_ADDRESS = InetAddress.getByName(NvmDNS.NVSTREAM_MDNS_MULTICAST_GROUP); + MDNS_MULTICAST_ADDRESS = InetAddress.getByName(NvmDNS.MDNS_MULTICAST_GROUP); } catch (UnknownHostException e) { - NVSTREAM_MDNS_MULTICAST_ADDRESS = null; + MDNS_MULTICAST_ADDRESS = null; } } - - - /** - * We need to convert the IP Address into an IP Object - */ - static { - try { - NVSTREAM_MDNS_MULTICAST_ADDRESS = InetAddress.getByName(NvmDNS.NVSTREAM_MDNS_MULTICAST_GROUP); - } catch (UnknownHostException e) { - NVSTREAM_MDNS_MULTICAST_ADDRESS = null; - } - } - - /** - * This sets up the query sockets and the list, as well as sends out the query and listens for responses - * @throws IOException When shit breaks - */ - public NvmDNS() throws IOException { - Log.v("NvmDNS", "Constructor entered"); - this.nvstream_mdns_responses = new HashSet(); - Log.v("NvmDNS", "Constructor exited"); - } - private void makeFakeData() { + public NvmDNS() { + this.responses = new HashSet(); + + // Create our Socket Connection try { - this.nvstream_mdns_responses.add(new NvComputer("127.0.0.1", - InetAddress.getByName("127.0.0.1"), - InetAddress.getByName("127.0.0.1").getCanonicalHostName(), - 0, - 4, - "Intel(R) Extreme Graphics 3", - "DE:AD:BE:EF:CA:FE", - "foo")); - this.nvstream_mdns_responses.add(new NvComputer("10.0.2.15", - InetAddress.getByName("10.0.2.15"), - InetAddress.getByName("10.0.2.15").getCanonicalHostName(), - 0, - 5, - "Intel(R) Extreme Graphics 2", - "DE:AD:BE:EF:CA:FE", - "bar")); - } catch (Exception e) { - + this.socket = new MulticastSocket(NvmDNS.MDNS_PORT); + this.socket.setLoopbackMode(false); + this.socket.joinGroup(NvmDNS.MDNS_MULTICAST_ADDRESS); + Log.v("NvmDNS Socket Constructor", "Created mDNS listening socket"); + } catch (IOException e) { + Log.e("NvmDNS Socket Constructor", "There was an error creating the DNS socket."); + Log.e("NvmDNS Socket Constructor", e.getMessage()); } } - public void sendQueryAndWait() { - this.makeFakeData(); + public Set getComputers() { + return Collections.unmodifiableSet(this.responses); + } + + private void sendQuery() { + Header queryHeader = new Header(); + + // If we set the RA (Recursion Available) flag and our message ID to 0 + // then the packet matches the real mDNS query packet as displayed in Wireshark + queryHeader.setFlag(org.xbill.DNS.Flags.RA); + queryHeader.setID(0); + + Record question = null; try { - Log.v("NvmDNS UDP Loop", "mDNS Loop Started"); + // We need to create our "Question" DNS query that is a pointer record to + // the mDNS Query "Name" + question = Record.newRecord(new Name(NvmDNS.MDNS_QUERY), Type.PTR, DClass.IN); + } catch (TextParseException e) { + Log.e("NvmDNS Query", e.getMessage()); + return; + } - this.nvstream_socket = new MulticastSocket(NvmDNS.NVSTREAM_MDNS_PORT); - this.nvstream_socket.setLoopbackMode(false); - this.nvstream_socket.joinGroup(NvmDNS.NVSTREAM_MDNS_MULTICAST_ADDRESS); + // We combine our header and our question into a single message + Message query = new Message(); + query.setHeader(queryHeader); + query.addRecord(question, Section.QUESTION); - Log.v("NvmDNS UDP Loop", "Multicast Socket Created @" + this.nvstream_socket.getLocalPort()); + // Convert the message into Network Byte Order + byte[] wireQuery = query.toWire(); + Log.v("NvmDNS Query", query.toString()); + + // Convert our byte array into a Packet + DatagramPacket transmitPacket = new DatagramPacket(wireQuery, wireQuery.length); + transmitPacket.setAddress(NvmDNS.MDNS_MULTICAST_ADDRESS); + transmitPacket.setPort(NvmDNS.MDNS_PORT); - Header queryHeader = new Header(); - queryHeader.setFlag(org.xbill.DNS.Flags.RA); - queryHeader.setID(0); + // And (attempt) to send the packet + try { + Log.v("NvmDNS Query", "Blocking on this.nvstream_socket.send(transmitPacket)"); + this.socket.send(transmitPacket); + Log.v("NvmDNS Query", "Passed this.nvstream_socket.send(transmitPacket)"); + } catch (IOException e) { + Log.e("NvmDNS Query", "There was an error sending the DNS query."); + Log.e("NvmDNS Query", e.getMessage()); + } + } - Record question = Record.newRecord(new Name(NvmDNS.NVSTREAM_MDNS_QUERY), Type.PTR, DClass.IN); + public void waitForResponses() { + Log.v("NvmDNS Response", "mDNS Loop Started"); + + // We support up to 1500 byte packets + byte[] data = new byte[1500]; + DatagramPacket packet = new DatagramPacket(data, data.length); + + Message message = null; - Message query = new Message(); - query.setHeader(queryHeader); - query.addRecord(question, Section.QUESTION); - - byte[] wireQuery = query.toWire(); - - Log.v("NvmDNS UDP Loop", "Query: " + query.toString()); - - DatagramPacket transmitPacket = new DatagramPacket(wireQuery, wireQuery.length); - transmitPacket.setAddress(NvmDNS.NVSTREAM_MDNS_MULTICAST_ADDRESS); - transmitPacket.setPort(NvmDNS.NVSTREAM_MDNS_PORT); - - - - this.nvstream_socket.send(transmitPacket); - Log.v("NvmDNS UDP Loop", "Query Sent"); - - byte[] data = new byte[1500]; - DatagramPacket packet = new DatagramPacket(data, data.length); - Message message = null; - - while (true) { - - Log.d("NvmDNS UDP Loop", "Blocking on this.nvstream_query_socket.recieve()"); - this.nvstream_socket.receive(packet); - Log.d("NvmDNS UDP Loop", "Blocking passed on this.nvstream_query_socket.recieve()"); - + while (!this.socket.isClosed()) { + // Attempt to receive a packet/response + try { + Log.d("NvmDNS Response", "Blocking on this.nvstream_query_socket.recieve()"); + this.socket.receive(packet); + Log.d("NvmDNS Response", "Blocking passed on this.nvstream_query_socket.recieve()"); message = new Message(packet.getData()); - Record[] responses = message.getSectionArray(Section.ADDITIONAL); - if (responses.length != 0 && message.getSectionArray(Section.ANSWER).length != 0 && - message.getSectionArray(Section.ANSWER)[0].getName().toString().equals(NvmDNS.NVSTREAM_MDNS_QUERY)) { - - Log.v("NvmDNS UDP Reply", "Got a packet from " + packet.getAddress().getCanonicalHostName()); - Log.v("NvmDNS UDP Reply", "Question: " + message.getSectionArray(Section.ANSWER)[0].getName().toString()); - Log.v("NvmDNS UDP Reply", "Response: " + responses[0].getName().toString()); + } catch (IOException e) { + if (this.socket.isClosed()) { + Log.e("NvmDNS Response", "The socket was closed on us. The timer must have been reached."); + return; + } else { + Log.e("NvmDNS Response", "There was an error receiving the response."); + Log.e("NvmDNS Response", e.getMessage()); + continue; + } + } + + // We really only care about the ADDITIONAL section (specifically the text records) + Record[] responses = message.getSectionArray(Section.ADDITIONAL); + + // We only want to process records that actually have a length, have an ANSWER + // section that has stuff in it and that the ANSWER to our query is what we sent + if (responses.length != 0 && + message.getSectionArray(Section.ANSWER).length != 0 && + message.getSectionArray(Section.ANSWER)[0].getName().toString().equals(NvmDNS.MDNS_QUERY)) { + + Log.v("NvmDNS Response", "Got a packet from " + packet.getAddress().getCanonicalHostName()); + Log.v("NvmDNS Response", "Question: " + message.getSectionArray(Section.ANSWER)[0].getName().toString()); + Log.v("NvmDNS Response", "Response: " + responses[0].getName().toString()); - String[] txtRecords = responses[0].rdataToString().split("\" \""); - - // No, but really, there has to be a better way of doing this... - txtRecords[0] = txtRecords[0].substring(1); - txtRecords[txtRecords.length - 1] = txtRecords[txtRecords.length - 1].split("\"")[0]; - - int state = -1; - int numOfApps = -1; - String gpuType = "Intel(R) Extreme Graphics 2"; - String mac = "DE:AD:BE:EF:CA:FE"; - String uniqueID = "4"; - - for (int i = 0; i < txtRecords.length; i++) { - if (i == 0) { - state = Integer.parseInt(txtRecords[i].split("=")[1]); - } else if (i == 1) { - numOfApps = Integer.parseInt(txtRecords[i].split("=")[1]); - } else if (i == 2) { - gpuType = txtRecords[i].split("=")[1]; - } else if (i == 3) { - mac = txtRecords[i].split("=")[1]; - } else if (i == 4) { - uniqueID = txtRecords[i].split("=")[1]; - } + // The DNS library we are using does not use inferred generics :( + + TXTRecord txtRecord = null; + + + for (Record record : responses) { + Log.v("NvmDNS Response", "We recieved a DNS repsonse with a " + record.getClass().getName() + " record."); + if (record instanceof TXTRecord) { + txtRecord = (TXTRecord)record; } - + } + + if (txtRecord == null) { + Log.e("NvmDNS Response", "We recieved a malformed DNS repsonse with no TXTRecord"); + continue; + } + + @SuppressWarnings("unchecked") + ArrayList txtRecordStringList = new ArrayList(txtRecord.getStrings()); + + if (txtRecordStringList.size() != 5) { + Log.e("NvmDNS Response", "We recieved a malformed DNS repsonse with the improper amount of TXTRecord Entries."); + continue; + } + + // The general format of the text records is: + // SERVICE_STATE=1 + // SERVICE_NUMOFAPPS=5 + // SERVICE_GPUTYPE=GeForce GTX 760 x2 + // SERVICE_MAC=DE:AD:BE:EF:CA:FE + // SERVICE_UNIQUEID={A Wild UUID Appeared!} + // Every single record I've seen so far has been in this format + try { + int serviceState = Integer.parseInt(txtRecordStringList.get(0).toString().split("=")[1]); + int numberOfApps = Integer.parseInt(txtRecordStringList.get(1).toString().split("=")[1]); + String gpuType = txtRecordStringList.get(2).toString().split("=")[1]; + String mac = txtRecordStringList.get(3).toString().split("=")[1]; + UUID uniqueID = UUID.fromString(txtRecordStringList.get(4).toString().split("=")[1]); + + // We need to resolve the hostname in this thread so that we can use it in the GUI packet.getAddress().getCanonicalHostName(); - NvComputer computer = new NvComputer(responses[0].getName().toString(), packet.getAddress(), packet.getAddress().getCanonicalHostName(), state, numOfApps, gpuType, mac, uniqueID); - this.nvstream_mdns_responses.add(computer); - Log.v("NvmDNS NvComputer", computer.toString()); + NvComputer computer = new NvComputer(responses[0].getName().toString(), packet.getAddress(), packet.getAddress().getCanonicalHostName(), serviceState, numberOfApps, gpuType, mac, uniqueID); + this.responses.add(computer); + } catch (ArrayIndexOutOfBoundsException e) { + Log.e("NvmDNS Response", "We recieved a malformed DNS repsonse."); } - } - } catch (Exception e) { - e.printStackTrace(); - } + } + } } - @Override - protected Void doInBackground(Void... thisParameterIsUseless) { - Log.v("NvmDNS", "doInBackground init"); + protected Void doInBackground(Void... thisParameterIsUseless) { + Log.v("NvmDNS ASync", "doInBackground entered"); + + this.sendQuery(); + + + // We want to run our wait thread for an amount of time then close the socket. new Thread(new Runnable() { @Override public void run() { - Log.v("NvmDNS 1000 mS Wait", "going to sleep"); + Log.v("NvmDNS Wait", "Going to sleep for " + NvmDNS.WAIT_MS + "ms"); try { - - Thread.sleep(5000); + Thread.sleep(NvmDNS.WAIT_MS); } catch (InterruptedException e) { - e.printStackTrace(); + Log.e("NvmDNS Wait", "Woke up from sleep before time."); + Log.e("NvmDNS Wait", e.getMessage()); } - Log.v("NvmDNS 1000 mS Wait", "waking from sleep"); - NvmDNS.this.nvstream_socket.close(); - NvmDNS.this.nvstream_socket = null; - Log.v("NvmDNS 1000 mS Wait", "socket closed"); + Log.v("NvmDNS Wait", "Woke up from sleep"); + NvmDNS.this.socket.close(); + Log.v("NvmDNS Wait", "Socket Closed"); } }).start(); + - this.sendQueryAndWait(); - Log.v("NvmDNS", "doInBackground return"); + this.waitForResponses(); + + Log.v("NvmDNS ASync", "doInBackground exit"); return null; } @Override protected void onProgressUpdate(Integer... progress) { - Log.v("NvmDNS", "onProgressUpdate "); + Log.v("NvmDNS ASync", "onProgressUpdate"); } @Override protected void onPostExecute(Void moreUselessParameters) { - Log.v("NvmDNS", "onPostExecute"); - for (NvComputer computer : this.nvstream_mdns_responses) { - Log.i("NvmDNS NvComputer Printout", computer.toString()); + Log.v("NvmDNS ASync", "onPostExecute"); + for (NvComputer computer : this.responses) { + Log.i("NvmDNS NvComputer", computer.toString()); } - } }