Jz$x!v8 X<qWL O!!V""G###$$%%&&<'''A((C))\*-.1/`001[1 2 x2 =33 445%L6&6, 7-^.d/`0' '''k''E'''''R'''''O'''i'5''F'S'\'(O(. ( ( (, ((l(( (X  (g !(A"(Ei#(&%(A'(?((,(/(0(1('2(3(?(1B(C(D(H(I(J(&K(^6L(FM(UN(veO(tP(EQ(NR(S(T(U(V(W( X(|%Y(BZ(X[(r\(](^(_(s`(a(b(s c(od(Je(nf(ng(Soh(oi(@pj(pk(pl(>qm(qn(qo(Nrp(rq(sr(ss(st(Dtu(tv(tw(Pux(uy(vz(}v{(v|(Kw}(w~(w(Sx(x( y(qy(y(z(iz(z({(e{({( |(a|(|(}((( (}( ((b(((5(((((($(%( '(c((7)(0*((+(+(,(-(o.(u/(v0(c<( I(U(`(m(y(*|(~((((a(L(O((ڕ(((((r)ީ))])k)L)$)) ) )" ) )J )))))l) )))/)))) )))K)|)߇) )!)")#)$),%)&)')()))K*)+){,)-).)u/)0) 1)2) 3)[+4)65)76)&97):9)$<:)=;)}><)a?=)3@>)A?)1C@)h*"?hz#@h$Ah&Bh)Fh+GhS,Hh.Ih/Jh3Kh)5Lht6Mh7Nh=8Oh9Ph9Qh:Rh;Sh<Th=Uh>Vh?Wh@XhBYh%CZhFD[h:E\hG]hH_hpJbhEWjJgjgjhjghjhjijjjLljljmj4njvojojpj^qj%rjrj t jj?j@jAjBjCjEj`FjGjHj2IjJjӟKj#LjjNjOjJPjQjzRjѢSj(Tj|UjVjWj XjaYjZj[j\j]jf^jħ`j!ajbjcj_djejfjWgjʫlj:mjnjrjGsjtjݮujvjwjuxjذyjzj9{j|jC}j~jjj-jjjjj=j]jSjjijjsjjpjjjjjjj:jj<jjjBjj jjLjjjjj{!j;%j)j)j"*j*j@/j3j`4j4j55j9jf=jAjEj~IjLjFMjNjNj/OjOjOjdPjPjRj*TjUV>((((((((((((((((((((v((((((((((((((((((()8))gggggghhhh h hhhhhhhh!h`hahDjAMjI_jZhjbijGjjHkjIojMpjNqjIjvPNG  IHDR szzIDATxbbc`` b b ._P1`]@@<P1` T$6f0d؀6If01 0uF0(LpI2 Z) 6YWWwj@IdM6+/Tl3h"5&&[ O~Uφdf6HF$uF$ vKbIENDB`PNG  IHDR?csCl0`MIDATxc``eIENDB`PNG  IHDRԭ csCl0`MIDATxc```e`[IENDB`PNG  IHDR?csCl0`MIDATxc`d IENDB`PNG  IHDR j=pIDATcπ X@Lq00сܾ H.&vGļ-?J(mr1NUH7413,+hbpIENDB`PNG  IHDRy$IDATxcȠ $}[Aq X!IENDB`PNG  IHDR j=nIDATxc20股62pTwӅeL[7}Ec? H }/uw& B亮G5pQgz`ZeIENDB`PNG  IHDR &WU{IDATx^11 džJ'x!  {)E3lS5I5I5Ibi4t5rdt#zRr,3=\M4In,j7tz듌}F14~1\u~n"]^IENDB`PNG  IHDR&DIDATxcD0tp(ϫIENDB`PNG  IHDR &WU{IDATx^11gHSڔqiy4Y)_sF6E m,mm?n4/P$Jv۝e•qQ"ˀ祽zQGQR"Id"niI(ۙg;m<շO]~b4~HWEQIENDB`PNG  IHDR j=yIDATc-9 P_ d#>ܜ99H='F~I;) V0g]]&7v df&Jo2~2 ">?(cIENDB`PNG  IHDRy$&IDATco DX㓁C. $$E%IENDB`PNG  IHDR j=~IDATxcoO׶YwaoJόO=n_N#UU`o??7 kAekg``A4YC[g ~@11xt(@ sXV[(IENDB`PNG  IHDR j=^IDATxcL/!RL U \̙Π @Ϥb!\ e@feBaA!%gIENDB`PNG  IHDRy$IDATxc/P"C&~doIENDB`PNG  IHDR j=^IDATxc/Eg U TʙlT?DP t9+"=W3LAχ._ ]P94LCJ!`"A߱s<< ?r?0!VA#49}>IENDB`PNG  IHDRy$IDATxcda``dE%<%3-˥ IENDB`PNG  IHDR j=YIDATc`AJndQMeTACua VCg``A.39c+g s@X VA[4 YkIENDB`PNG  IHDR  csCl0`MNIDATcΟ<0`b/>?q?̿"8ιy7\Lp 3,blsIENDB`PNG  IHDR  csCl0`M6IDATcXB00 7_$4$G#d-}t Ƿ:IENDB`PNG  IHDR  csCl0`MWIDATx^0Г P$IX< A_j @4tCR vA U=}w%'9'7IENDB`PNG  IHDRW{csCl0`MIDATxca_O (e$-jIENDB`PNG  IHDRW{csCl0`M IDATxcA@w*IENDB`PNG  IHDRW{csCl0`MIDATxc9^0V$t#IENDB`PNG  IHDRJ'csCl0`MVIDATcOpGGnc VA)͚R?eП0f? 60, F0 vIENDB`PNG  IHDRJ'csCl0`M"IDATcsbA$/'//e&Q IENDB`PNG  IHDRJ'csCl0`MWIDATcss*8>|"% 'ueZry S1\ppļS2N^? f``YL$#5IENDB`PNG  IHDR  csCl0`MLIDATxcΟ<0`bogp?9śH8`VEadbs٘&N0R-IENDB`PNG  IHDR  csCl0`M1IDATxcXnE1.9pq#+ĄacFp"q#!IENDB`PNG  IHDR  csCl0`MRIDATxeɱ @ CQOp г R].ȱ,Qt÷_dt'tE7HO8AntZ c!S̅9PmIENDB`PNG  IHDRW{csCl0`MIDATxc6'EIENDB`PNG  IHDRW{csCl0`M IDATxc$qt}[IENDB`PNG  IHDRW{csCl0`MIDATxch_5"IENDB`PNG  IHDRJ'csCl0`MVIDATcg|pG{&a.VN&M\e$x2?6]0Co׹ A9/*jIENDB`PNG  IHDRJ'csCl0`M!IDATc,,H6d)G _rʄIENDB`PNG  IHDRJ'csCl0`MXIDATxc5;jIaX4@iz{6f.;d↩:9hb^)YXud 300_, @3&Y)IENDB`PNG  IHDR  csCl0`MPIDATmǫ@@sgZ*;Məb]bCg 1O*aά۴3I:iICf ^t3IENDB`PNG  IHDR  csCl0`M7IDATc!sf7$ΑH8{#qb8H$L>rIENDB`PNG  IHDR  csCl0`MVIDATx]ɱ 0 DQ"$hX j,%m ~thޓw3EFȷ?{qk3%"wb٢"!SbfR; 8IENDB`PNG  IHDRW{csCl0`MIDATcazii(@#IENDB`PNG  IHDRW{csCl0`M IDATxcNC@sgSDIENDB`PNG  IHDRW{csCl0`MIDATxcNNK_2aA@eAb>IENDB`PNG  IHDRJ'csCl0`MVIDATci>f``b寡?+/ sfݯL~cП0{'3;#a L߮s9@. 7#, nIENDB`PNG  IHDRJ'csCl0`M"IDATcb^$7+'Q_|ʒ6IENDB`PNG  IHDRJ'csCl0`MWIDATcʲ<}5 yUgue/olݷp↩,9pR^)YXud 300_,@&`#Q$IENDB`PNG  IHDR ';6csCl0`M8IDATx^u0ߐR9)o d:K7QrOQ xD.]ffIENDB`PNG  IHDRw=IDATxQHSaSKKBꦀ*L*U(ZIDdN(f*J[YL5PM32Uf67Os-ZR^^?.e%BBQB6 "jzx0^.7#ИP{f}Kj!jzx0JNJj1|m$n$@}qmee<* 8j*+ji{&٧} ``,ا-vir@MVI@~]bSYvI 3f,)+&R_[>tXSzr1à ObK=Ʀf&E``(`>(R.++prt\PÃeYv+P:%%u͉ ڳy kfigN5=<Xe yŘ=}ѱC.ys2oa `2/}304yF?Y _loSӧϬ wO񭖶qq[|Kˑ~ژa *,jSLFܐGM}#c)qΊ?W`[)6V,;( SE'i'j4<0<";L`CUhC#(%^_P_\͏.kQÃeyɜTT]omt!jzx0J>A+wTVnߩ"jzx0J|'\6'Hx1QgxP],jIENDB`PNG  IHDR 0(vIDATx^1 @ЙMbVLVR&śA,R +&]p <3Ò@؁ wd0ʹ_]9&%"ŐQۮ =jEB!U]cM_3df=!X˨ UR `BML  P(9$Y5 Y:T5p癅=΃$L!'G;1qBIENDB`PNG  IHDR 0(v0IDATxc?QDH.cN&3|`I  G*U8pTB2!IENDB`PNG  IHDR 0(vIDATx^͓=J173.heacQ<3xDAҟFa2he /#8`;-` L\~]H ͬ5O I D\ߩG]}x\:ik㣫ɏ@p,HYW὿Ifq\>M^ elcG@D@C, q:j{2'c"\xzdˤ(G.;,sIENDB`PNG  IHDR aaMIDATxc?~^e %. ShBB*hfIENDB`PNG  IHDR aaMIDATxcLB"R%<9IENDB`PNG  IHDR aaM IDATc+@Ā0"Q_IENDB`PNG  IHDR nIDATxc?Ye 5[b0_+D~DH3a_6pRՠUl`©r_nOC=l&3+z/򔯻ul+ 98sA$Aڥ% p<IENDB`PNG  IHDR n"IDATxc<4&3? RH+?54IENDB`PNG  IHDR nIDATxc7F@̀[F/" +LbP nؽlWJP;L!MX@&}ݡ9"u\`Q(nݸWS} T)a @@ DWH}4IENDB`PNG  IHDR B*+IDATxڅ1ns R>Yhf=FYlzbh5IENDB`PNG  IHDR sFIDATx^ 4\EE/V Ah@ T0`4 sYIENDB`PNG  IHDR szzIDATx^ԡ P 3b3 { WHy}I*T\PXs *DpBk C>uynxq#ϫG8/<]=|!BvCÎst<ُsJps^ _v߿s;~}}:ͽV<9N̹1Mn޼955%IgggAD"fƧnܸ޺u+JY5==v:I64dkmn!GnW5ӬQR MQߥ; fyy8hilnni۶(A)Z^^y~qq!4??F Ø3W^]ZZm}ڵI&#"&nFV+3ϯ{Xdq_w\L_1ӟlԙIÿ H1`k,Tԁ_Xq",c9|ZGgiR9*'{`P,%,||F=Z2G$trV.xLY9ąNw!w DyU/RFLwZef͵nLo0| PEizZJ{v._z ImT Z?uddV*4.-lg8#'I9c7$I|y|Xq{};p0#q'_(DAK?WO8|81c*9.s퇏'@@q N N 88'c>P > N뫖~gZ0ޙ=5U>ˌS65a;ud:t"DE" Ȃr]D@qA%,IwiiqVSsI硃en͉Xx>5Rd(L{CeNxhԹ Pί圧5;woN@Q_nTЯĄREFn{dogr6Xxӝ[\W,UEwY>2Lv~L9]&azv Ƕh[X"(->l4w&:8^h~yļʶ oܧ̓/ny8E#'g =?k{ݾﶛ ckh4WZb%ykd2ZW70I3.{IbU^xi*QH]8E7n=8(Si%´'#rRDWc\ߪy=Ddž7dZJ..`a:8Y\\]ko$%h[ʒv}ǥBGу/ڦ߸\(ͥ5!CLUo֧rꯥ(k<:i" cw -EO)Gup.%;{_y@Pb￙Xq2ʪVFi7-SыlAiG,T3ѕgN ̕w~N Q -@9`}^Z|`^Gf6!gl^PN[hby {\f>Aq=[gRB Oؙ>]T{B89'7WhplIi2:%QwĔ399 Sс*#ynx׌iʈ?u3AڔRҽj7XZ. q ٞ7t DsZWiJ+,uV~q몹$1~ gM˳ Ar xSߞ1:p/,KNN,) X\/xa eDҞwˇrfqrB.1 q !y )͞g"%}~O'yi:G-Ǣ;n}b*f27G|~q^;4\h!W$sQ^/k9hE.-  RL7MhB+F՚owϺҒ2¬,T*?8a(aRNy };7W xXϳ]KHfoO*+3!HlQ&rBڍ$N9!G$)d^ s"y]_ $Xu͌rn1\>p&pPwF rB PN@ @oPNv:BH  BABxfő"ހJD6欬e8..I0/pPu|_[(:J*TKHDJn NM9uCbwBrsS?tmSYt߱2KsBk_VUp ^I?< Au/Sq_LFtHMt,~y\ F/OG<Σ1̬n[MXm'w î҄I"30\3zAXߐum$DÏ%7)fD~+v6s|U)u"I7h rx4]Kfa&oYVnl?# #iNļYV ϧa68>3ӈ?ycm:Q^ 3/K7<ˬD_nC#ՍfO=X^d!;yfp͹Dí,iܚw>aCny 䝴p..^ ^Zr<3\uvǣskj|5fMprvYAiLdDI H3._#NS @^QZ/>v?zԯp2lNڜ,yRLnj0O@u1+n.[AaX .^eR_yd{$by띹y͗^\.^}~HGafcao WT+B އC\4s+rjwң8L+ ! Rb9qWwDQv"Y,EwUR\0PZH Qܳw_t0Dz|2N0jҦ9;XQFZ=+~iA?Sг NS|oINFExjuD(EQ״#JWqFPQ-!!ۮ|@w(n!pMml)RzyGQ<Im$:)呞_̐,,q-k^(ǰ9!Jq`%BbHU)Zu7QMPUf7Hvmϸ(fU/QZkYBYWF@[(:ʓ|8EwH^iꢨ5mk\D(ɢ0lOizZ)NK`s {guM؝iԙmL̴qgXCSQҌG,ɔ(QH$} <]p>cDID} vE,y`INC[$L=$$  HN HN HN 9 9 $$ s T$&f4"fG\ѫ|gz)Voau˹£G0SGzC~g(ⶢRN- ^8P7z]Vzljy8P4.+P@r*44op<ۭaׯYI\mt%DSPXфAN3Z26U3>fֹN9؞OX )V*jw@ʮrJ?#f2-D=}'/ ݟ -VQNt>U&'XɆ&tqqQn9Y+*(D@z,g!Xﹷһ.$?p%BeA \_<>O>[tW909*D˙J#JRNhxl x 4F jsU"K{O_HvV W\I$?;.|{N&ߺ9mW)Ϡ,,,@ε6 џltn%A+U!wmH{ٯ#g?:_H8Bk@u(}f 1\}7g~e=p_ǜچM, f*wm8&9k|,eoث0,[SHCzKoч4:2I 91\(a$m7pɘ۷,HO'-Ϗٰ[+ߏX;DS9A$@pk$ cq_ow=an``L¡C6C_"yBjE@u!7[iCl~cL<ׅtЊPyNf錜ܣoP6SA,ٳgѩe$rnEjֿt=G{tOaޟ6 =8,ƇM >_x W'ു@ >npMP1=L$vR7M_NN/rLKE;w'ˉb291Ĥ ;d?/ݺ3:]"@(γm@B,Jw1>7;9:xa`LXNH=(F%0Nh*[^uen)dRrׇO9J9sõC5E*[J#fU,'^ɉN9Kp\,cO (zBB>߬nDGV1ENr..LLL fb[Bѡs!Hf;!oϜ9/(c_C-//gdO::Sȣ-' E .;9t0L}}}SSSWWIKg xy3,ΘLcǫx^\)48 y?D[[8,[~6,rҋq 4-(rхhl6[$Q;엄'C!BV4\.7'իW$'qEWX^^'Q1!![@c]rۍꇅ J9Y 3{8 ?d"4˗GNXIӶ_nݷrC2&' j08~Ԏڰ?S>r” DR-&cVc%_ to/ˡdն=wx ]\8<_+|Vs9T;ShK;A`q7-'ξBS$H HN 90 $DBr& 4 ѥrUʙdɤH%+J9wArtR) 4JNjK(Dк(*->:E(*09/Vo;V9cV$ T)'* ؊QV$$'`rRa&M*jJN 4ʚT''*t;E6HN7"Ahu ʉnHeCLNT*vQ  "At$'H(98oDE?\QMv;awKRe(I$d-!'ҩ`(%\ okŕ2(1Uwz}(쾤w81w{\b+H$K֭%R`!tiZ1T֢(KRN79QhU[IΠ;[!VQy%FcR>46MFbЙYkϹdUVKC4 9w$ O?;9kQEW2r(׆CG\]|qԉg޾ONL]?q'N9;ūdB>`(Ҟ5F9L\!ON!P/> Y]!3zA./M}NYrs cSb6[DfMnm/4͑bza?8sn?<ހ׍ 5O=T"rؼp< ړ. T''աL*CZ6X3K{ {m_ DSaO$s$ѥd&qyJm''zNΠߘ^r޼aAol[˹c@N 5$$'fsE<YKjKорAuq媈@:w[J H#E^Kc!˥gc s- %&LY!䣭%Mv+ flj?WX.(-)EX& ?X,qwCԁiւ}?m^ L V&S|$THrM)%ܥ ƚS'ɽX{7c36>@l_ 21񺢰.bHم3ţ$IZtKˑf={ 4^Z[X#jXXfZSB0v.4$e4fT6W`U؝ iޱM lsg̋kG Мԝ7IT@WIjDA >l9r+0oYY:Μffkj PNn, !4NfdbЇ{d,hcV-g NS2odR2 F@uof {;^ "R0, o|o100ƙG<$HccS,GQ ;`Bj¯md6A Sl hWaGN '`.Fo#þ $F1y_s[.En": KwV88xxk =\D7ĘcX9t33Y6f(3'd:ۄCp MF=it\wGJ'jv}_.tRI " (o[qx*y 9 Tj%Mf,1s[H]m|  eiulj&#w\.T*4)dų-~ ?4#CnlFIJpt3v^kCTi~ ?(g-B bBJ#j׹N^\> C =&vDJ4`#bBfCxss/Ct obr>La`$uX=]X\P~d(\ T}g'lߎ HCW-OvSC v1iS֐Kne lGPC vp73"`'t/<6ydYQ>l+u^DQfת^gI n'Q49|JWw8ݦ:߻8Y?D\8%^= /wb>Up7zyS#n+ 1+FLqzV6/nx_xvH_5뵼DIENDB`PNG  IHDR4scsCl0`M{IDATx^YlyǿKCJ"Em$E ny 0~_AC@`%ȓ_Hxwu/ QDpsqΞ>R¶fKZh$.UtUS]j_W5MFݎFpLHLT>@,cH$nq`0*7Ft(4Mݮ ˲`H$BȩB ĈBxynS:yT.i5v'ۭaZul0ؖCŭٶ,SJiZmSs:ccvۢaăRR1<ɏktlTVaw37ޞ5RnvXi<~)/>P"`H&SqӮɑjn3욦EcA<4U'T=7(`38"H85Mڂ#c TL=Tʀp2IR* HIJ% " j yPtj^1ܾl6 D,sD"9R0"K7?GѦpAJD< /-CO@B,&>\ \ĊBGOA^}BhhmE{?sx!O=)Rộ_!60mwޱ,+i{)!'\{ހ. NZwnp|D@}jhxP&~q?)$({G^B?sb%p_rRģuݡͤb4towUtG=bЏ Źw@닶*@a<ɓ?ˈe#OElx𡆵a`pD&IYSF\*gz>>0Y:XLLL?&ΗD|u\(3@5[BOOf!1Qz zF߼̀e}\~w uzRz'X ^%ZomT`tOZ HaQaEb0F {썵B8}1.=XHTzNr3h4^lw^n˕*dG Z0Ӵ~Z :AxF%{RVBYRp&CԭB~O=1_iZx/-t o4H_)ؖܰ,48끟Ir/x % NYlTd&v%G|ŐDa~Oor;6͇. `|UU߿o>@0Pa߷gOM᪪ 766ܷoߚko۶vZHwM͟|qMUV}z՛6ml۾}S;**co9Xwխ%&5 :PhdA!v)"dL=@kwәj6x)I H"Ō))ZG)^\TXnCN 0^FNa| ju0W`,:~TV57Ȝ^*/ZiF4 =7PPeL6dw 6XS"=t ;L=J.(op3iGRi AB( *Iw96} |OTgC$ dN.Y rC]@y,H?Hhɸ(%Ph5SOL>y˩*+hd=:.]c]>AYܲ/J~bۅ=T`}q|&?szv[{<9dޭD"4:::aw&Y &^ӰMMM:}GA&"_j EqE~mwv*F"lXsG k/5(,;Ge\@Cx 2K>l'؋z*4~ iTImJji!>lɒ%7nܽ{ev zׯYv:X֞,gR8jժU囖.]ɪU+ڴyÖ[**v}t݇"4L)S]s="z+]NGk{gJ(fHtEt-///E@yor৅)F-W{ | ʄ*;.% F +ICR(dl|I5`pab”.QV>ӂf!oP6+VW6H!NXok'z// K_2lG)#Ge00&.AAiRݾ}8/uuu[l6Y#=FneCJi9ŷ~W[-;;GLMFud0LjL#rDpǎ qgDR AT{?d/Tn WyuԻ36)NC@HĂEZ$,D?#5M_"ޔ!GO sSڝ.>xYj[rB[e3L09F:v#jS Bj^#x]9rPUᔂJqz嗱=Ǐ/~qwϜ9s֭[`pQd/O<1b+N}Q2?d+ر+/S#FUOw95X#*qr"^8[cJ(žkm:nIOK8ٱP_NTƋ˰U;mIIbJw9ɲd2 4 Ol<~j_M|ұc]Y%RY2j*>TSńD&{>35p_n+ܲmɉҒ1F74/6ehNfƠ]:(DGkdc|3uZC߮&-*TxYw5Uc{yd{s& E&dEl> m>4 r-1Ӄ=rdĿJ ?2e zEĀar@ ۸{;V[[Rud~[) H+"F hPb$*c1P-q|sO>ж;EIe^2DSNfPsޗ䔅P\t)gN&UFa3Έiʠg0fL>g-ONM4r2B'a;;YFCs}zGg$k|@)VV6y}g~1nq"?.& 7äB ިQ:qE2d9Sy=.ϋ f$k[x#gv[O>?߾m;ïsя$c 6$ WɂnnɞfP l709k׭#o|XDz1WTa 1(ۨdߋR8=vyW[EXMa=fnIK]0:_~f= .z>.I#T(H5,T{Ɓ p`0$2:98JVq)'RasŅA6荋kM;65We)p˖OϢJ;#;o޼ޚR$E̎P+Wd=99+ⲙifRĹy8A=z|aޝa_o/^nw\W~٥#lN,۲J-sk+cu–g_=^[%&sѓ)bHQfc/^Qz_w~q+ޓ!GHjZ*"% i3f 'u*_?V42[4R"e1ƈvCI,,z>dlo|g,G cJuƛ.{|+Y# v|r['Kq.'gee!Z_h-/w}ԇ hԈ¡jj7R (o/YGuw*kjqN(>g.t6=R揚KUp kWbAg9WB%x j0 Byx̄GjO=` EJ9eVtO芰3fݻ %?5$b-+&TGsbJ=t9t.׿+ĩ pxP kzb_}yR|[UIr̦ܡc4Iq/>y:9 M{ -2h6(b*`vhes3 )ؒrBqhM0#| 0D .}@pN&WJJ*riu:m9Ž/> RpNorHA~}e)<$3lii1p h>ge!HǍ)W .$OCD:J &M PD '(h# j=+8FZ뮻D$H)|H nIۗr\0InDvg:;13bZ m34}W\9s;܍'OV9ڵƭmn"R5636fq{_#IIfEQ a22*Ђa04Y`k$f$s d?sth~M\6+=֔B*'C]}aZg$:saaڂ[?牱TGŃws*VyyLEBJ jo$m8wfirŅ CzsNAgvAv(ԩS1\N{B_ aڴig]srHDcNeJb/qǪĘ>d>kXozqؖ~!9I8?#‰9LxFY2T}`X֤MLwƐ.>hNi;P~f<!Լ!?Ċ=9 IfhO=O,o|Rе@%5 ~@JۑrI̗Ԛkff .:6]V> 5dF\rJ'Y~KҔ>a Z3Y 8b8y@:gR_=DõGaqr7,zq{mࡃ#5r1ߊTLV7i+0 UEf`W__P[QX3?W_}?)H`SQ'Njjv$VnZ99 4ڔg2{Zyóx]rez\y/O^lܧݧ ZkxiM< $nԼ诳2m&caMrљr0" {mYCqz>N2$δF0tw꫿be^,Xp[C '򡽳 yso%8 ;^_P, RM;H搙m۶A$8`T O]"W!M!uΉk}T"q!'_|GY$/[ŴwiHQDM) i>)T^vD٬% Ǭf0=AoPf[-wp ŷ;簤Y6Тn͒) J碑$ HJM>PSDUGdoup=-R5ZMw=NlT4:lNHKM#^Ze&WT6B{WM  !v#09V؋ދE I Z&NI3lFElBXVxDxWONv۬l g1sZ(e2Ƅmtdt0[;SBJ[|)ќVvyn&AlDN6'OAU}U/X ĉ R}9i˷z 2Jڀd~)F)O`q 5?NXa~?#-_9vB/gHx^8>V:AR{D vw̖n'un] 7OX[*y)Yyzr-qlT hR#RATJv-1Jh=ޛu]gܷ^( n")(,J$ʒlrv:=gƉ3K'N7=IsOD,ks$[{}9&P}z{z NƂ0]@ΥlfB%W**!IIy+ւgSdf/pNTS*~qn\OBK7ݧbH #-*ym;Mwn90t3HJ VcLELٹP]TMy539!lպk$d.!l77?EO*E/)\LV;39sQp'gw>^^r: 'X$L"}oa~%TYmx*#h@wee7sA0 0 |\UeMP)1g["ĴEBRlDiS&(%Bۿ'3g|U0(jw.ZvR'P(o[R\IӔKȺfmu^CT.iwk'X3"* 8[+%!E PlIr,(y9tU$o,i=q&i4c45-fy45_--lZVFFoٸAe<T\ ,ed}zL)(KaK⥉RT(18w-wk erp9s '^qӲ,̏l bK/ylW|VF6L4M zU8'z|6Dtf BF t^b蚲zUPtda<7ex 6L@ lk.W$"9 z {#"RH.+HϜ9bg`'l"+T"9sԐ銸LwЕ)a97\|` o(H 75kj+رTSv2:J=sPmp'0hkm_ۗP9 '$Nb" B^88㒤1˄t~݊SOr|@% IFiO>.ٍE?O\ee%ܸ(~^$|ms7((öm&x=F(W1#9U`2U`Au' 2`K9@xi0:s/fJU ;u,'-`RVQ86( 11.² p'] .95${vԓ?~wl}[QFe3G-gQW5KvwlwЯ ;Vg(O^ pPFeY_P]][UU5ټ# ׭^Cy=p=pmg劮5+/[ȣ{`nJĆ OD,Xvi/2fD`K!#QFιN̍|&M[5 L.H4msmLSH‰JgS=:]x"z0Kt#H4r]0 HL\&[[7n@e8x͊+;(3Y;J5Xaezf&4#,KupjEo!dxh |^;\#`KH,54*=9(9"| . *ix-тn`VgʩmuQ0NiJQ eә4F"rTL=G5g<s eayoa˖ .W r.?  A&l6W *L2cMp{@4 Av޲sDe%'_G{]@㱷z~PLVԷ5{ E3jBx!E7CƢ,9neP2'`e&ϕJg+CX,T!co*RTc1~ (՗;ƪ}ZoEOq⶞k6ݱk{qQFY!4䬨e2bpy5s4YXѬy*aQF5'"xE#XW,n_\w<@:$T2NU!)r+Sks<BտLVBV _Z^UL)ռ:<(e)ؒfҩmE?J38꺐gL*u#YHBÚbҫJ)g+LιϾ)'BD@rK3.꧋H0޽6|50ء*(MsaUA[@*PYI+V))T (l:G"q8Uh69ÇGD :#@ĉ'pi](n*bHNrB.;y`!@>چ0 x3m< ɖ޶2#B ?Zh~:,crƩ"?Ki%KF 7Ex<^ ,n vp@F8 !\(pH`ciw|%:ԕ %8 e#Q{hXX<ⱇ>U#EBl#yS;3*]ؔ4LD+k+`AoٴP6=u~$ږio;pjuP弚=8gdeֺc2XzU,ܯB^# T7z̫y Qi[lD;{T~RR}M7YRu.\ Na{Iv>@Vϝ;s|lU iw7FB8TD} HqH?9EWEnLrJ)m.RBr`$vВF!/2{ĈW>1X[(`Rhs_8(>K}oJ5h.mnu=m+mްu 6hb /zQ7Q'y{Xt`Z((s@nUW$* 'EA{fxQJNijP7̉ҲrQ凫@$ !DRV7l<6``q*:ih r'YtƤe4,Մ|!o [Թ坭lN](:J7o*=bPC- L/M!(E%՘D! 9-J&B0C $ԅIssaD,(P BTL:-.QbTW?8镈 Q4|rtvfIC\ Cn;}ÒsJA;wE}W8i8+hZuaTxC͍uNϚ `JhF \%.Ҷ2@kTs1 h/|ã%AJ5j4mnkA@˂u|76D*$I" N?ȑ||0rWzLpWDZ;o@GC$i7|ՠݰOh~@$CAz6gU;N&(fsl[fȘLCgEk6Tȁc%e^Q-K[_bd06"Kg{NBw?/-DD!=I hv+ rvxryEu k75t~O,Z{g~ǟ>ֹ+ݡ,g#]GFz3J~`ןj|`R-A'=r:>:w|.PBz |"e!$v[r8Y`K+  lȶA"TY $SSڡ,XcOp>_mT{(?T/©~nqͣQw@77- mZ2?. {{s~绾h|w*;ɜ{=n0|j'?T! lZv0{ %=B$$$(5$d*9m͑8I(rim N~Wx ;_b #DpPoM #ܹl%x4>Y P!P"Jc5~=. QZGSS*T@xUu}VD(lMXF{d$BAk[j$\U`&r"^w@*Ѥ߇Y6[]ټGp/yYڎ>Z`tVjz)Eq+R'{h3?O?`TUMz"CfB2OH4BxNݛfOiBl͐?u爪nVU8\#p^ͳ*_o@pnD?o'z)#+g ZdyU߈ƭAƋM֙=p o Ϡ-wȩdQ!S{V ŋ#zavA6 }Ӟ}vkApd{w @xwAS{) 徆ttkI.߶iKgRMюDRX"sa+2#dHK^?MUl T۞ ;K ß"^YWn# TMfj#-Ȅ<Ɍk 8DH)Y('u 귾o-hIQ[ҫ7e Ad ]4գ~ugҿ1?(<)Bi\R]6~?xϔf@PE'{>NA%ku5MDrAhB񭩬~x~B&n@E͍Bw @BDJ|ztq+z=}(ROɬw$L %?"6Ο;?LJzGhohd:D|׈L*M tgZmsOިf:~pU@M p-}0<P?I_zn3D;oNs}U˶-m6/|wN/_ٰ+TU:":s?}򹟉OW^;fYn"lh{̶ LEs@Ke"Jne(ᴕ uө*Bj@YHӑjw O>yn<}$8Uu"*y#"iaҖ온i]~""}GO,]lu]Q%U>{=z}kq{U5_l__$}`;JP>x+d % p F"YsZo μq^b֟e=PJx@3BT}~`(#|U"BMT5NzQmdI5n3X8Uy2JEL/_BI/~6yaUKFNg\o~iiiyod2944zaWAQi4n7KDN,VavL 0oi# 1]PDEёӈ (M7G?@__Sr;hѢNDڵk9 `͚5?ϝ=|fG? _|m\ALsCN0.d4}Uf`jc:K&շ]@o' /%^yz&A G?1kgqN򚞖[nlXCz\$@@"{ RSG1T'-F6lDlSS][Ág'NL7}C]6mrMXx4MEQ.²,|#T⥁?9+S/o2=H8:a !|3$Fغu+LO},/['{ŊO:}m ̈%BMş,EHs?}, UB65S31&s==% #A`k^ s8q wmjjVee"yKr׿k>USXp3yJ?"a(Ԡ;tdĽ|9`EH0~7Yʒ[֚|# ܻw3.0ēʝ?/'jj D5p&`xWjP^3 YGE9c&K_~_/AvqmMEc^uUU(zߢ>tF]n޼-iJ&-a28xB{]wjjYL" P R1lC!앁z`Js)$ lr8oVTSE<M#8M鞜x>p^vP* ' /y]+8UQDB8*@n "wK29~&ްa̗-["Żxs3;װģ9C7(P"cA ;*z_hX+O?ݧk޳^uSwwe |.&맻o\c6/^===> [=*_y"ڶm+PxJ4.Y9{nM>O8Y򡖖=SZ6=u$Ty: RP79MqKlT5ad ,jo{yZF^=kyo~)]]];w*+Pn]v1eLt:] L7ݶY++C֢:wَëٱs"ĕѣG]x(J)i,:d }A@P.%P:ig: rUA  /ЩHtx뤴v^ↃıG$P UI%Z93JIdI@ZUxwﱍm~ }vZqy VBJ"ES2V>f9U\@woWږ}8 vܵ}o͛o+;w<̳wﭷn2M^o}3-g/ݖV>ȰlqؾV^0KJJ*\Y|wQOr=ܗT1զ*ݳ#{2͒Ua*LgݯN ApyX_ۖ6H0tUW.3vkLCY^_lVٶʍMՋKLuʚN|ѧ~B/{fWO(Jo:wv&RGGGN͂}I; dfв{I `XR@!)JDB6N̔b.^5 CQt&tY;ޞ޾ZDc!=v˗\?ydU xz=~?BlY-om6a!Yzr,%*"?vsG}H!zī, ^8&> %1pa.bEoA]{,i?A>q1'9ROMM<0s"tA9i;-} ^wV\SSsMb9BnSS{{{#="dZ@zt>}4qLz`d؃(`A,d{ӛ.p4 =!r9.B9K9ػr ;PqHHDцWvl;h.GF/hHA׉݃`xéS'"D;`@էcNۡ^'1=ByHLAnn.?`>sϞֽ0=5YqZXhCq ^-)ũLYE2J"q@T$beA4HJ^8X& nٲH Xi"bE8&KrN(Ϸ  tD2m_sg0$ZVR4!;P;JKbW` riɈrHQRR-Ayyy9؎9BtDG0LK$Ge6=ÄϟMCW 3g@H,n8v `:DgAniW]x;.Qb+D ?|rksCHQa+dT;FY ecvx,+4*ʘgXš%ٗw-֙ hR9S# mmGclc-$G"X K&<{,s&#%# X1u; _|QOK{kspu.[opumt|V  5 V4P,iɂim7iih)=bw;m[vۋֲTu:e*nu-lQcS_hx03C'8ŞUG]8F`.Fո~z*&L xӎ <و*SC]Ƃ><.z ^E$hЩ Vo8^vK٦tuv`,'+m tD%|x-u9 &3X.O([q$)4%|~Җ!: ©5. . 9K蒓$)e< f(JԹfmeΒYAclE>g]ݍ#YGƦrZ Xo4}Myz5yҍj3s=s=*Fĉ1Y=1v9lђեQp0QEBAT"NtYIav v{e69ŝdb=ls׮] * (\V#^,EBߚ"m@U1 xqyd>*WoЫb IBJ8 Ǐg tEPERNls$9f&[IRvc ?Xתmʂ+1p&R؂~7ia utaU,u  SFX6FϓDT#geJ2TW1aqJ`EfffQ<3gΝ7O>9>[n!lPL$eWZAHE!e!e!RCP!RpY4X; )N0Q"Ӣ876󕝝u6Y)EN5dHr␚80cKi,p0&fPJ+4"brY7B !^r]eՄ&htp>}iw-G^]$ 48hhдB̆Є8B?t@ܝ`2P3PPq׻ Ϳ~m<$P$  EQ*΀H$8EIXL&*ldCtW@Xih&hyP.]] *M}s3%J΄`WLIMW}{R EX0MA.'zʈh(ktZq1ߜcKӤ&,/ ǓY\-q)Ɠ ʷv5[yqRva4hF9@N0R}LE A ! _{Z a0t!NWFz3_} o]v$ Vp=Q" Arh!ݳ""s*)c,dY<m0Z B[_MMY0)V !UY\(q0(AzqsBCc4 "_f7ܨޑB8y*NEPr@ "b J)04[VquRH !-#i1Ƚ-XזQsB/? d.h"!@Ԡi >sӵAZDpWSN%°\ە9n{0$ :`5@# Hu 9+?ԩM7~{tYY}ߟ;y|l=tZFqO/[1.}sn~;/}C *4wFF44J-}(T*% E(CU`&AT9*qu-loY)dF^6۹Y듽~6sG`RЖCY 05hA4X03Vf #?"{fdW.\.Ok,7>v℘- NRD6@X?qd?e7yz8 .x_8+\K-1ȴוA0$Kv{].jsx !ZK, tV !Fm7k[N%rdZ!r7O)d @)R\Y|ߛO'6L} ʋ;SMw2mbݱ6f,M0M8Ev7..4Kۓǟx\P9)6.o)zA wsqys.޽ҩXe%˅+/W&[mǶ;F47r "!7Fiv'HOB1';??TqMn n<}?b߻{IæKзr{_,^%LRJ](lfkB4ol0^mc!>9gwЖ<->'o0K!\ݺҥz_瞯6/šA{ÑB|ᅱ4pDhb_suiIK'޽p Wg}  Di*/~|+xjĭz} _/}Q>{җ|H|L{)&6)b4u38z{ku]_8^,{ً`)(};>z3ha?nBW!/fa .I,6Vktum}0Go!0kw[ i_ V6&ӝtma oZ^{U13I rN0'{~.m>{)_)!Zf]j [NtӉP\4땍swuuPMя؅=E_g>ڭ}2jBr~쪢v©>+xdu QN:U\__˩FkG}nHzI ^8w݇Q alh4[w}moXybW uCR- ͇~nKչ{z"Gq؟=q#@̪Y<x MR"HSB Gנ飫&`IG" ͺhS׌4aV곔ޜ ׆3:d! g)⪮kkЖWz" pB8}/@ S卜}P;}zUXc?B/ĚYu]O|djZlϩm]}jkƲ٫,ͬfv5U'lu}y007w[8uu{89S'槓hVsѣu3g={ViB/Qvegn;3Ni;k9- c̛vn*`ֵ%N&f8:. @A` }sAif:׬ώ Xm|ki<=W\ $L.RwDv=ڱfո4ͰunVS5w_=TQR=ցhxK)SG?k;#\s8X;znkkBZgJmfs!S'O8yf+k),.,glq~~:ys|dh@؝v@ed0G?_<kRMv) ꌴ73DZ(A }I#P n^bzask+ f0t8(T@Ool\BHeھwwI{ 69# 9#\]8iF3 f ݝ&c4ʬ:yjqƻo:~7f2_Q-U6]UZDŽmے4M y H;pnSͬ^R ZQhKfcwq/x= 䏟|iýͷ@B )41 ƗUUAD)\$AzjyqjW\~]v&}U N^Mp=* \h23w7P.3(U iʕ?$)bۏply9CsZXRD9ضܽMGiRP"LF 57̷KIENDB`PNG  IHDR szzIDATxWoGfMC\$H9PUEETĭJz@=WQCK[V mj*@T)Pۊͮ;Ǝx{gv~.Rb=:u\.ZRW?AM;|#6 cڪy>p-| ͹q硏cGm1uq`O@fFۋeL*-]؇eL= c`MDMႃoR.8)$T oV^_҈hA'O1qţA0YS\ly8uf2>'_a~SVJjc2e2WiPR/EHA *O p=Y2DpEE(::cUxr|=iԱݱ˘,03 29|G oؚ4\MzRMZHLWK3:k4ZG ueo @V-<Û0gçYGǎ@:k\otB#E2ʮnk ^mg?1oŒ0L<KBGk`e zFrKYF06Al00WbYPPfTEՃ3Pu*{bo!MW`,d@׵-`ː&YKP.88< 5 ^!Վј%o Q@O_&go ۰dؖ` +-$#* ϲ%!*y5N/&/ ^w>FeIENDB`PNG  IHDR'ՆLIDATx^1 @ϵp 0@OU4䁤65+jFڌi3S0P2C30^.H+|懝B:0IENDB`PNG  IHDR-#&csCl0`MPLTEPPZ*qIDATxc H$)`L13@yP9JWhIENDB`PNG  IHDR-#&csCl0`MPLTECC%oQIDATxc H$)`L13@yP9JWhIENDB`PNG  IHDR-#&csCl0`MPLTE==@IDATxc H$)`L13@yP9JWhIENDB`PNG  IHDR-#&csCl0`MPLTEJBXIDATxc H$)`L13@yP9JWhIENDB`PNG  IHDR{ncsCl0`MIDATxc@?*$mdpBy4S8x3"4IENDB`PNG  IHDR_4FcsCl0`MPLTE6e)b$IDATxc @$`' YIENDB`PNG  IHDR{ncsCl0`MIDATxc? mdpBy4a|{0IENDB`PNG  IHDR_4FcsCl0`MPLTE=`DGRIDATxc @$`' YIENDB`PNG  IHDR~^6csCl0`MIDATxcZEFLHY5.N IENDB`PNG  IHDR~^6csCl0`MIDATxcZEFLHY8;b)IENDB`PNG  IHDRcsCl0`M'IDATxc0KL-45?^0fᒢYf8Ϗ?IENDB`PNG  IHDR~^6csCl0`MIDATxcX-0-hnOՅIENDB`PNG  IHDRcsCl0`M'IDATxcMI-45?^0fᒢYf8JIENDB`PNG  IHDR9I5csCl0`MIDATxc<`bMQBqIENDB`PNG  IHDR"csCl0`M"IDATxc0KLE4ƍ7jܨqq*7b8\-zbIENDB`PNG  IHDR9I5csCl0`MIDATxc<`hbMQ8v3IENDB`PNG  IHDR"csCl0`M"IDATxcMIE4ƍ7jܨqq*7b8a?=mIENDB`PNG  IHDR IDATxAwc,ζVJmD"m۶1ض;[u5V7k@XRS)4f<@d]  @i[ Vf#BQ16BUC/bbWI%iK,O쉦)GCV!b16^&rfaϞm)M#sc44 ك`Sza[zMsDh.Ʋqqߕ;g\OL璒14brErj*?r׊ڼ1H9ɏ#8[8"+f'srެ; l,StP;eG9e+\is\tb3lh#,66/.T-ғ) 4h눃7ee|CI r6!h[SYɶTUqXW}rm"0OKUy`(ۗ~fe,rk ǥlKUmF>״jF*i[#;c: IENDB`PNG  IHDR szzIDATx^=H@AEE]ju32dr8H8:8H[:,(監78 GߖkriHhL۶}t,b?# @UJdKvTvp\׭#0)@W `'"yޚtqY0B >T,׿?&*;}H3GVtF;͖NIENDB`PNG  IHDR soIDATx^ү`)?,(=fh fa5 A 6 )w c'?6Ǒsr%C _q:ұ @% ^?.'*dx0L<,M' K#V\b{t1dXL~C50 ` CMb(o,&ض |Kػp%Kۧ~GJa {QLS )1Glyy^R;#@}@}GsypOw' sp7_ AF(. P`->0XfIhW`HZrky I-.eoR'IENDB`PNG  IHDR,csCl0`MtRNSIDATxczQQFIENDB`PNG  IHDR sIDATx^퓱 0CgF`q*` ` `&S \Kr-qW$;y߯4] [E 0cp{tE.#p[BCIě(cͱ b'!P//D(`x&0Gː.C_ ~̲:\hX/rl^& eax8*IENDB`PNG  IHDR sIDATxݕAk۶aF5| 8mQڊkvm/lgcxj*$me<螣8Riw$Bʖo.%4g-6EWG9 2%2r\L)\wzg6Tv>[ZOd &Ha O:QCZN=/Xd(>E*\nX\@ dxc5@.8]H8}7ɪ%r:t0R-$>Gx|KRl/3V|/ɺLucO{v-˻LsRIdb׉D68gsÞ_`KԂ9L>!ԅ_h4TXbU-QIENDB`PNG  IHDR szz=IDATx^MW;G'L&$1R( rt!\ TBp'; kcbi$G'<;/ wysƝz{_ֹАR E]Jљm3Qu )/T}+u:cc v<9h$5LJC1uzsMTg?w{]ڝ6!DdDj=4Ygnf&붉1Rv>׷y]XYsW)'uLJYpO}=亢_ ~4?>G۱($Rˀ4;\+/kWRuo5oC㊐}/<߽`FAXr%#YjEf "?y<Ek^H&zYRJ#&9 Y ioIIǡdr-'?smSjj{W/t]|xQ,4.bvXF )66 Zc8Q"EU[׋vHfgO2cvo#GC1EET$<7*fTw UքWx!-o;׹r-"A`Z6]NXO ?~z&c2b8rx?'y3ufu}kCYg~_1jBv;291S:+n,JQ5Plmqffq*jQYQ1T99нJH]B¹0![^FO\~W<Ș9)}\BAQ(+\0VE/"ӑ%]wbpD멩BNp5،*5 73c{A@1h0!A!oeKr-E[,B0c\>s,Xx!Fly⛼U7UR2*fu+ܾq߼*:-ā|U.<) EBE#jz}hsp~3?_X~2=4>ͧI,.sn`u;lnﰽ][l6iy:LƘo_X<2ұypp_wDpE>8gϜٳO{Q v{NTu&)4l>Ŋ};`;`ckG<匆9 APT!&_DTssI&){Ji‡"s,Hm^*w5N\2RXCZ)$Ded|48)?WdQz>|"Kƍ[E9捦b֨W_1vyOWxwX::!f0=SS=TPb{T7X[[޽Un^eݺkЙ< bsJ˩N 8OZÍ I޻E%r\QJ6 )\1C]"5>ʲ܉]8Wt>+5Iw !@ɣ)#A;PHICTߖ\?L*IENDB`PNG  IHDR sDIDATx^̱ 14lj dB(WP@HpN &`n &6Z BsrIENDB`PNG  IHDRPX PLTESSSSSSgtRNSv8IDATx^1 D_s?/9!SHѸWl  {< ai1@r p ,y g0ixVm_N'ЪpIENDB`PNG  IHDRĴl;D_6&X p?3D'a~ŀguau.;n{nz][I.ũrJ]vdr+R>M;b>=j4xfa. 0ݮT,hz/\99/eY~jZcEq3oea"X|R7,|6AX^R^#?G@ʀN;`sa>j:Eq+( w:RcIxF10=pݖqf4q҆F"=V:LK.f9o<ܢ%`Z0?`04nhy[0 cXxAi|Mޏ LFZaex v UP(l6){3?9J_>]إT*[P>!=cX(ϣP(<1F{pmtIENDB`PNG  IHDRĴl;7IDATx^]aGZ](=:d *WDc4DLw$CSQCm?ffKVvj:~D`A3l3 p3# .V!<׹|s ;ȓLJ'8&2$幄f:+Y8u.|fSR>:Fz$pl;LK6l%ݾr{<[pNPu:aCrOvbn:f\.Gwljl6EPB~@_y۵Z"3&>?e@D_W*ѲUN{ {@{/˻v[T Uha=nZLxAs@BLXT8i(JL ﷱ 7UH$b6 ^$ IWd2R8l? :&8HWt=6,Fc=hG-ˢ ɀ+aϷs"hAN#o$8 $q]j=Bjpt Q3Ll/MOӝ>䆾>|sIENDB`PNG  IHDRnIDATx^oP/,Nb7w^4-+2!4@c@?Hhv.YiS0kCsȁD+g H˜8{ όFvx98.SYȯ|սUlʶIMZNYPlXD3 u(0ҝ|XDP/OXx03bnEQ\clcV׋rvqjÃQ\1E"mzсu.׾aN&ue?$Tncc K'w>'k{dpg/sOґJYs!%[)#3QHA7hN9V[NNz,\83>Ix?ia&_= #GLڰ=KvbA@!H$9pi~?B1] `[-?nvXb~ހU)At9$+^ ~o&kHVhP  IENDB`PNG  IHDRĴl;TIDATxڭA+DQw4k&Y|51JHB!#5 e% bH)[.4۽ss\鈪7y,v .KP _K7ؤQHC"B 3+|.6e qϤ =b- H-ޱdpt7w$(BE*V ZFx_□ -ݼ=&4GxGV -ޖ 4- 5jޔ0P@(B LA sxrNQ.:!8$T$iT7b+RIENDB`PNG  IHDR"zIDATx^1 P<; 8'g#26f\b z# "vxGS8#( '@q@ɱH"`H" V(wD9띑D8BL^t 4ΈjF9s gjg;DDG "/ &rߙi< &M]) 5 97@"++3ڂ0")5Ѐw )W@Q?MkdYo ڀ0W GŚ`ygIG^D["Tt@tCP!T"ȳ6ؖ5 "m AȰ,˲/;<0 A/RFH7}kAx W- ESOpb\CF1Ÿ)cqƷ5>+1"g82? @)r3:>Ǡ(5LjFktw"B "<7JGpGV\s%QB"jMa Sa84\8CsJ&xs'3N`X֓pp+[o" `mݘK1׈o"B vHu赘*hl/B !/BGFPk`8! w $dZGFP{l:a? id^ 0L&Io>2Q?:{=bf0x0;C _@unq.ak1Åe'8:riݴiBƨ>m zn-Z:$4?vԝ]MbnAĺrGyF a RdwV~Lh @QJp 1e{k=+-p^˩qXx0Gz&qX`4fp`M1YE %Ldq"&mb%7CX CJY KRl9IENDB`PNG  IHDRl\G4%IDATx^ T񯺫zoQqè&h>c+D%Q32gF ͘1dLI$OFp"5*bcT .~DAEnzn~9S}Nԭꦪ.1tu+s{1  @ @ @ @ZH  @!`?W=^?[_ P,+}G?E_ݻ _g ! N |/g3&ߦˍkз0X&~ok"t?}[T__qX5}Mꏂ @iWV_פ o׮]LI=$AMI=$AE;wsk{> @Q8s@4K?$Ab3%߳a Hӿ[os& oVfS@ p HLK5$A߇~cL|.P `8>{diϊOÂק ={dy|ޚmSӿ5k֜n6_1$ @„O- ;  C/SpY S¸(/SRQ0 T-(F%7o^ݻmooǎIܯC;w1c0W2C @Hّ7}37AC^[o<X=Xq6 m^ @ ?S&M*)g{uWWmQT;W}O}^={(L>^ @8__o;w*seJ6MbhkFsBω=GzE @_,"A3:N,siE7enmm1ɰ2դҚz/A@پ}Y2cXEϝC=^@0,D_3$dvր9sP (+V|OOOa+=gzD& `(uuu_ݮ[ +%=Gz2Q 폁KE={#sJTR_O @d&FYHğ+. @d (M6Jn|BI?G}@O@L"pMߚ ϓ@#o{y{Oa;< B @d 8[r-#V/}^nbşG X!_qHA?})/'YYL [YYLu:}Oğ \@ϵE`GGӥǞA.A@; Eȑ#zчCXG}7>Yzş+dhY"\*Zql8!z,=V=tFP%U_/'Zuq"BB??'/DTEa al IglF#zbHqkO(N>@ U$RPBZ%VYcZiDם$ZʌjnnJ%B'KUY @&*ɐc;!D8O\&$r+^[$Zy'l bQ~gO(n@ E""lgxh`#H?@5qĪ}{'QwN馛:DKcXBEy,[m|X0W^+V|綾^?I _[\{',X`֎B㼆%yge|1B\+j6rZ3.]ziߕcs.h$Oҥ2uԡ>舙3g wجYJkv=R4>Yzz̃ A~NNT!U"aQPQ" 0O(H3ddJq8Z Y L$^',?n| #A@;D|}~%Kd,1N|s9y@' :a .6o-=f=v IX?'#yD!RtHrQbMW; ;]?5&ńZ G Rڻw-=fk00 N秺fNTT+z5dR밾(ӚdRyuMy8$_2>H DETbQണ8@DD `x_zHYOOgKYz x@|]lժU;(g 7+\C:FL>'Y6{Ȅ oos$A2ﱠlH9XEA kמm| @(NJZqu͘m[z_Ov~Y#Ed7: FlqRs/@?رt<_ON` 'r8_7T ]e܈tOv]2<"h.ݿӥǮ!N` j|]c&صcB8"dwIXD~c5;ܬ^Uw @ K59gXCR=ZVjСǗߧ(dyutt,KIjug?N; @ j;vutπC1 ?яdq"zk|C-G5l@}F| @ Bz\Y0'?ɨaÆӎg^wu'%G N|jk_& СCkdGïFT!׎,,} @0_s5$ ~z̙3H'U8rpmdU 0pMMMM{+++JT Qf0,}#@`ğ*H vxQ<drGm.wk~G[W.JE(EqŢ$ԟ?Ka_n @5SPaY9*Wڭ;D&l.ˎI~E""–(r Aw p'2k'p p\ TjOsxmZ8qБp_(K~R$DE5Cw(iHrgyI&ytN,@|F\ޠӧGuLçV9qX^ Zx5\ٳnjO&DL0t֬YrZuqH{82];Ι3Wx;[{v _a=֟ч] g40vnVgg_K CPQ$,}/ @0/{AWs1\(5 K{%K1űXM\ze}7pwf~cZ1Y^ @0N"+d.6X"l[n |ಝ;w^!RTXW丹#yHǬAK5  @+< ӌZ|Uɍ͇d_J Ï]8__N!hs( .``(0"&eyTdL R$" ?B0b @0,Xp7/yv[yᒻk>+Co>~cǎwᄋNZPݻny״.Gv|لs^@ qL\}(LԈ7>@n1&>t)B| @UDq--)Zn_z{$}_ڻEw6ڟ7{D'vi U(% jX?|Or j%.3Q6~xr֟l@nEYMTp{? @gg}Hv?w6hvAxIX%?ـ(?!$A_I-& `Ν{'Gyx @0<A(D ~;vL @qTP6x` A ._L`eGɟ A<7#@ A^e`g @ 0 kg>  @-ZT+yj @ 9 @ eUD%?  @",1/& `2 +HHXhS`  @&[b,&X&>+*Ƌ3Q) ,ƈ+_(|BEɟey˫Hx X X-. )2gŝ'%/A<$;92B&O. A7gΜ.\x?~B˯?{?_K/վ&On< S/V&y}q^cnOU% ".Lj PV(g`g„')N8 /K/\@8Ë@ @} e60B}^tbq˿-[v\{|mU`z (ŢP" 0HGU kׯ PH?k yFz}aܹs2WU5B`>"A~$}hO cƌzWd`qKB`!A^&5ph`ĉ}agNXz2W?Aa\ ;N'@0s@zg= Տ bq( lnݺ#Ȳc?Ǐ/4iRvAAM '|'xt~B+x&} x#@ A*YQ"„VPL|f.}u͔]5}6&mc@H{rм4^+{{gḩhcP$IM  fi5^zg۞̧(+$uY#qQ)J@"Aт{ @_M}kWO@oR-8B>!eb$x+'=+%|5.-z z,4H&)ؼ @Ra"G.>u}rLrlnN@e/0E>Ba x#;G[?#L5 P ٻwcLX^`鄭ccue~b…c-[v}y x@ZWx@8A(Pc @/"/gYטccO; XBV:r/ƍWK"7Z47$544cjX",#䩧# 0m|=8MHXQ*0 52lmm}]'豀 Q) @!ly/_~ 0WU`(SA@0"l߾@7$>i^鐙0oG+&:aթR8P"nd%"~zݨ-5& @ Nb1e>ܶ\(pIF-KvgϞdC5+|7t`cLw g@e )5kpQm}L CDy5}7o!N(~-[XJ~U~14Ɯo>auvgn7J*8/ O;W>}[x $Ə"I;)`f ,don8~rSLQo}}YZ t"9γ )0<0,{1Lp0Ơɟ(PfW;~_c}GwW>! Ə0j !)~y3fE )MU&v!/"eQ>ڷn#̍~}k/SxBN_ 2?.ʻɟ{@I4~V:N?N5X>$NT XDs\tE%B@]_~'&m HK.|[_z饫t*M ~c Lq4`+hNAQ$"(A$R7ݽ+o'D)1Z6ǟ7z}Ef./Xc|c{?7%K"@;nrx`h+WHfy$X#=fCL,-k& ND4Z8c9t2]3]9dq$3tQi2w[[[ @/-a 1TvM0ԍ_9+X&zQc270Ǿ1s0'i 8p͝ kw4?qky{$ YD1=Sv1p70Y!ٱzn&Ivqiu@KǏ @0"JDX""ԭ1s0oU oGEL’b_4 D[evz/ @7m0snk8 8s83OGj 41>ԍ`w}kp! @1&NZz60nVX,"7ԍ9Һȅ$O/z JfB@؁oFZkk]&\@ ?dg6Bj21B~eW2M Ϗ @ y]LٳM`pI4~+SiZ39_0 wI4&Hf gd߼yٺ-[ۏ] |1u0Sa&a= !Kͺ @2K`p1IƏ[pl߾i6 @pq/,ҩSzX{wga/Pߜ4S@H]L l?~Ҝ9s$|G;?bۧ @v1KOf oS=d2]S@Ht'4~}+4cƌ)S===[ l&ۮoG0h!A&i|s*O 0d׭O>r#LSp_@H{9hnk.ijs+:Sp̞< q! @ {9X-gF6l8JOcǿ` 10H$wɟV6Y]eڵǿ,{7G;| L @ υ XWWWpA@ss @ xo:L/?iW%s,[ouxkk`uvv>0x($ @=??,2|ɳ߉_XB}rɟE{\! DX29tOϯu ؇HNxC_^s r9h by$#̍ŋp H$՟t3{}m렄Hnܸ"0w6mtq @'uٍ`6!QM0wc  +66O}@ ;` H5+'ڽ@T0w\ϳ H߬ɟzA`Q<cꟙC~;[$ @< Q?; @M賙O/Ou! @Ej^x%I\ eÇCޥ }7/&jk}(8@y όWw˛{W5. uӝ73ܹ H666b7Ew˩#p/<{م$fv0Г?5}{|# ]v]k|RFࡍw{.Ʌ$ƊW9S n1.H~GGqi4S~K\@ )[c\rFrٳgd|D$@"*d\&H7}!'H` _ڻͥl4+ִ>=\ H:t-ݰ0un H`p;54#SƟ/-aQ,5,ώ_Q =>d5 @ dOНz/7X4xF;-! %۶H⋧XüA1z~EQBnɟ*j_"ɩFB`De,[='Mf"Pz^[" @ ٿ?hVojJ1y6@"`_H[5xp! @ ϙ|_\Yݵ߭ `# @{#Ț5k.1Y?TZv A9O5k[M`lw1@HTl N>&Cϧu H` 'M/j\yCiޮaY3g|DQr Њz&un8Eϧ@ @xwG=h~YfVGWx?Ń$K(WNvϟ @ 忌y0jDM槿3u~M^# @c`1/'Ory>$ɟk9~w. ^>2up6?i L@ZNĐΥ&+IM&U7v @:c7TZo1Y#x%Ϯ L@Z) (߿w&+cF,9_9o@&4=j~BJYnyV6I7 П?_hӧm6]%ku {c.sKSc=6JŚ @f4-o6o3-mqClc tp׮]5<ݜ?O^Vk=o1ɱA;jdC2Jz읿. ]soccc%݄tt_iӦGE +#g̘1Zϓ}\@ 9f-M#X1_(e}_r1d͚5WO^n6~s! @ Oh~UǮ굉 H* !ӷ`~%L,lcԦ@IGRT4{a=z>{Y?\@ 2mMAM#Qp®QF ox_k}BŲ{eǽQ߫g]=Lv=رc/<\_o_gu! @D͛Z5g}GNmA @hv |]"zԏAex\7K߯ @y߿o2ͭBM4A:G? -bbhg>SşHo'c"z.. z,ZO_ׯe. >M]D"RT8y|O.a@ }7՜G9"]B:G` LT#m}t׺sΛ}Ix[$?/ ד-m^dz @WvZ ,} OV~p7y;9@is>g466Nn\X{w6553cƌ9ϫH=E##0l]X.*CP6Y [je---Im/XZW)ʭk$ɟiFsiQ}`, Ak"X%j1vN6mmmm-XVJ.sfl޼IUį/RO@'{e'S!X"ʬ`N B1VX1nÆ o߾h.y/#\;vHqݺuYW-i_(q?+| @?SGsJ(#I¸jT' QdI~>@ ݟ*jvEzNwsZ1XbL0$Aer+Js?r; @O=97=`rAk2JJ$8Ț9D@'DMSKznuL b pH"' ]>@'w1$X X+pH?QݓkX5|BsX@ ݟ i/\)$ɟ-u?F$ @to&>G @@w&OL p&-{Է@ɟA>< @ @>S,ri/Y ЕɟխY ɟQڼ @ @:Sߜy@' 迃 @ @Z?L_迃| @ @'y־=@=hG^@ w ߎaݨĄ2Y[E6%*D:uC!A}l8gGM8AْЍ., lrpl) @@6}XM^×;knfsSi!ͬsC]n9ǟ3WinUZ"j @@^G`ЦPY:"* @@?Yf @1  `5   A @@ A @@@   D@@@r{ NLes ~p Agp8ʶ[  w@ @ @ @ @  @ @ @  @  @ @ @ @ @ @ @  QeIENDB`PNG  IHDRl\G'GIDATx_hwnX}1af(Ba:.SC:A3SB -0 QA (.i99o䑐''iNr'>ВsVv.|9y "J @ @ @ @ @ @  @ @ @  @ "X6 @@7ә *'U@@p@8T+? 'j LRmF @fG H7Rn@G} T7% ed.KZ PPy@87Z^@NDM. @.ّd%zo%9RN@>[ @={(9\w%ym{ی'&I->ƫy:}-P| ns:@@f{JKN'[w\LN'%-X">LI^H'&GJ@@^܇@pNя5GJ0 x{~?`clzn@@}{h ֺ`^}qkQX4[.&Vp(zoH 4y1yYZZ^ӹv[̏b~^Lfo.i Tpk1~vO4ѯ܍:n܋^~9s~mX~%o#̦2Or}|vl$꩷ "~N_Mg**_x>hwT.-ƅ~Ϫ߳_on#fj3;K=`ė-}^koq6T @f?׍ ǒjcpH~Guc.}pRmXn Z1>pYuXn ;wZ1> _ @@.Gcϝmof&7@\GY.; ArJ'kox, @sn֐_=w Arv6_@P\ A'?@U؏u @\v΀_rniӅ A=Nr @\Ap@U~fc AWĚM_nL@e_8~l A`# AWy @@2rl qK߈;b% qNolB qp;6h!@U.NcM@@{w%UyqAs&3Lr33ȂDA{t"1*ЀE8Ȃ" ,@@/TUUuy3 <9c[V޺Ր<} 2L]1L=!@; ߗgZvQͪ^[ϻ{$ӒP+Yz~Mb}}¾feH+m`60 v @ u $`ɱ1__<h4*(G㍠9|p)1xWK!~$f/HP($@@C5< xպ$`QEzY-&KvmCI9ӊCG%{66;K.E`eMam-j1K]mv~c r5  6?KvtOΰ3H$ s#mw33 {& `0d4:v'Y8擮6*LPl  ˣmnL4kE$bx㨐4$/u~p֚f g6 H @%Ѷ43e-rՋ, @" 1{O&ϴ>[`1N9ͺh|15J#'iziH)밉c2L vfk/M -pծ:SEiR[@u,m1m'in c< ? .b:@; D @ py+·8QAl8,*AO Kj9o :h  "0A1P\ g`P Ow9`[V VyX7'A?cjz>d15QHr#`,ɚ`t- 9 eɁd1 kiHbqN2nFG?Pb> 9z$b&9 _ j . yB;V $_0D {vN,>4r1V893 A0D (_/oJ``{< ^2 @ ~/ @O6~P @"`MY/K @sx <I]*p $O  @"lk֬uM&YI>{f_\T'dku\i=":$Ru" UWdޠ(+*,*(6eA:(? `E]1h @jxĄqpt4uڗx DA HlcWu0Rij.1Y yc1'Hk#8G@?2Ƣ @H +g4 okx HDE4. ?r,1 8'y$o 9 &CH[bbZ+||Nmm1/! bc\!`1 '0 6ri? j_`1t &̀NpQ ,Q :2D @ͨ+uXCD zC曟mXc#<bRp*X[E @ P3>{O4ICWmcL <5,?C &~kFlbp$\d15'-! s C;CZ(%p9z͈0'> E @ PSCF-;uCra~-x?r!X,1s] p @ Pc]KCr6iw~7(7~ٸo[U+L$A,pd~vX䡌d1،FD5hsPtZtuSZ_`1?  :@I~pv?  @tPbVP=KZ'J;. Da \>cDkÒ_S]9[7E R @x bb{n9}kRHTw/J[qT΅A,ȶ~01v|AY2`lx?DA,4R @0O^ @e$'\y}YPnenOXz5dX߂`3eSlo Ԭ/=Lf8$:4=L_QPn۾~-$kvrwawVpX!LRH$=WZ)>R @>b vMM2xfwP&}'gE"S)w5 ?e\xc*0ȊӐ# za@,Pd @QZ|u0>u{rP  W(S[1 "!1ׂW01e2aQP˶C6{H.`n x#&_ X1@Z0AHh2/z|kSmfL9)`ˆdkZ2Pdh!NQN.`þ}ڗX aj./W{tfz= @ @__Jg8^7?q0\ !M; 4[2 x @L>dzwZyGǟǁ3lv?r>F7{| iGTl!Hh_F9d޺S?G{P) h<LXq_Kğ@Q6 @ xz7eܙ2m; rCi@_vLuʎC>mqT:¿P1` W6c2 {l^d>P_vzyeK+\>`_lu b%/~PN`8> sx  @SkiPf͛&[nfl3+L_S5NK=4<bbFT$b5_i5ew8LZ->>lKmSm[= hw:  @`\kd1ϫRrPo£g.ggBy^5lյͿ?~GuG| rh4| @"]Jf\nVwgBwC?v <9é.Pa1xJFxMZ cp׆$b>:yԬ7ܤ4,Z1~m @'O!J!?Uwmv;#`ˇ`G1ׅ$d2)\*x縣ce`xeg0C4d~]x͹wokdNhO #)ɘW %#XEqe2L~kY !'Pa~߹O"}e\բH UkD+JdGAtCthkޓ Is3d$Ix ,Rjm'7 pȈ.#7^w''~ufXY;w6Զ6c0 L* )>Q;*:1TNb&.Te}$cD,Ad2I$`E%-__%O ݖNWn{V_y3IE~ojվ2 @ T455Y8$RUնOC=dSx}*ARs 0XED @*h*555 L.0qIHDa{歍M0ESPQeOwu XmL=dD'?sUߍEFu5jp,pl @ H|h$X)]"2j&jǷOEScSd2TL_?iVHd@^}8-yB_!Rcӽ&N Xq @ H=f7X+_E8U=ҭԯUqtV1cg2D @*pfg!K"Փ%v_-N>7uV{)*J0 @" ,3HD%zbD*oْפϫZ}_sǫB즞 @ H =S_#IЛX_ 5ˇ)[n1 {0 @"{}=׋ouG]i:T*ъ 5Jʝ㎥"N%Ld*h$<_Jtj d* #Nߨ],dH̰$V %^;__ѝqttU$dpٗrgzi9{s,'$ 02b\ o$ܫ%TK$^Jµ?S.Pߟ~+}'Dxsd2Hd~P-cR]^eUh0Zkmr H@hB1B&;9ѻpw62ln(`?||:Y?8$p_:<> P( dtmZnxQ!@\kRen @ 'rS@J8/2(pR_zbGRn @ '+w[{+)z Po,ۭoݎ8@@_:x=֗ʭP(`7tX }[P(` , @J878Fg %K[ @ M׿g @@л)',iog+rP(`Z)o0' %Zns Po@7_Y/?/uwY(Ԍ}R ~?=Q*~Wc%b@7`' Xhkii sIꘐ3^o3p^@0+@ >@4@P@ P(  %4@@P(@3@  J @4@P@ P(  v fΔ_  -klX.1b0Detʃ}`ykCy̲ -.>Y@`0@3 hP  P@  J( J %4@w?5 JxET %\.QEU(J|f +pZ*;Fm8gPz!O& Bvl7P|<`pϋDy^>s a;rb:c.` @u},|JE=|  70#`bDfЙ3:3ZtazǏ0ü;3_ta;~fwgFhe8=a*aYwfз}㕿Tq  e|Mlmi\^ָ槸wUb|tu}}Lu?tapT y3`" `y:3 @>af@gD0)O @f@gtȧ3`" 0: 33: 0fat @YatFg0A|: ,̀΀0 33`R0:3 @>af@gD0)O @f@gtȧ3`" Ly ̀  33: 0fat @Y) atFg0A @9tϣ<@gD000 @ @ @ @ @ @ @ @ @ @ @ @ @ 3G.@TIENDB`PNG  IHDRl\G9IDATx^֡1PCJfRI4Cd OY9@ @ @  @ @ @  @ @ @@ @ @ @ @ @ @ @ @ @ @ @Қ @@n!5p}GYJyZoKava%@ޝ>Uyyd̃fy0_M%-vPAqKP₂JP;61!jٌ1M:k"hPlY@>sl?wջ tRv8XZ .kiEFF"""Bk՜?-Z? c`@bi-jS5G K.נN# @@N@Z @UFFƣÇ_ӰO+K_$#?0VVڵk'}9_PX,(--rJխ[>kiiyH ,_zSzTǿj-Ѻdl"@߿kYY{Яx&)E?D]S|qxsl['x6vwʁκsY[dɚ&\cL֖1YkZH''7cd 7UOp` ,p!'JO߆^ۈX߄ Z-n}3V_C`QI$!D[ȤlDN^sN)LKOô!b}j*nC*D&;7;95`ђ&kN֞X.fhY ʚ#ahN- ~1&kK֘5Ys:O.xFZtS& @)2*`O1 އ5m.dx|шl6}iI/`\X/h@.  vcC$kN֞npp+5'ko|$K >1YcdsrN$MQJqg1ᥟa.!> Gt ug*bi*֪IY*jB1P֜=R1Ysgpd՞+\{N>b'n ~]FD)OxXV)T#im:a %\,l{@v9Y{:1Ys~ʯ`L[s:qͱS0!Mن~ ~^,2ʂE -Mv ݣ#9xv=M+[i*dQ A[tCI OM[j"% I4Fc+7YJZ<[s6'Hg2uQX.5┰Ϧ-&c U>$e,5.`Tiuc.Q$#ߦ-;o8FJx>u5"P])@5 $u# @@َ#H%҄0p+X:rKXH F(26@).IX}= 8ZM @1d y}~(h0)` ?-SF c @вI7Д~K$ b @@:'g @?d͖@5 l7*# @F5?!9-Ïp#1):u8 # @j$^,Sd42F$-%=K^B& c @Љ [H2dOq˾ pk_pVT\t@ cllCrZ&ࢢ87#L506x  c @0aۂ'0HFZlza+ 7$# @F6$N%t"e _TPFd 8_<,p"h+L9`Z # Nmo#b/@1dKwM>9"$ @Fc/n1PwqUS@1dm v:,Җׇ @@1p%f$u לS5w5'# @ї CG ~exH<3%G}g~@<l-[yC}А𛆾GP84t;lCApllW1P!p7%E@de gkN8|ۼm&z@ 5 6L@4pru^"W0вIӗx \C*gc t@@]Ws08"}vux҇Ju HN "hӼ!~4Yiag7Vh쪚2^jc{C]sɩ!=~ nŠ!)8S@3*z.oo @h:=>zz7#a-B#egyw0빷 |<|ЧTJ;a& @'w;gt4u~(!@[V\f0iԣg<%Ha#H^b#?SVB:KH/y x.o; -`F A9˿s=NCo\u#Z.e h**|w { xhTEA^|J40Hv>MK[Qӓ7Z>uama0Fsf O@gY8HX:x#kh+d*H1*8 \xC{k@0Z|h2z| @Ճ6|AP <к]z@sJyj7z#HN;Ε Zl;]#i1)))I!ɷuTy0{F{^FMPO :wk  QLz)))سgΞ=xXVhX`z 0b= %rA=7vثUFAދ[յ.A @um̞ﷄ@KI+fN(//ǁrCb 3-- ӦM… QTT۷رcy&eڇaF#..NPXa^quc>0s<]@0Ȓ{1vȽ:@h+aN<LDI&garQNJ6mڄ> IHڽ{6{g/faJ2ؐM#%kr28Ov2a+bV\)TB`.F6N9$ @Aԥɘ:Ɇj˖-PPqylܸQ~ [c*q i 4 &`Gz (Y6")ci///Oi$'7l  WBd)I 2# $ @_7sKr6Xl~oł r^iLߜ: ۜAI&aΝ ޷o`BeM^-SJ)`7S$ fPPP hI) ~+s [Pp͛7W^z/.nx(8vWLL&&Diߠ =:kkIHʼSNɶ@ͧ%ڐ@L @U¢3gȑ#2}Pm ݻw!3A=sXX9r$`ػ&m :gH ͊HQdd,ˈ#ta^P2Q+FH{XL>$_'{, dR@&m":tH5ٳU>!9#"dƌ~&L?C ʔwls  .z~޾CbYvfgScT> MBې!C;F=1S@pp\7 WK!;Bz0J S ӬY^42$dc:V;m&Xkb{9tgaA>\ SzG @!/'{*LR I<{J4Sxk05j? 0e- p>i0.0 'ğ>}:TQ4a4҄ ! @q&ϗwE G<3/ϟӉ'E-3gΤ JLL v$}7W_??I_,{Oh4݊gszUdwn6zv 7nѧlƇ9T-|  m_#߻w/S>p__.*Xb2{L|1744(a^v1 # *(N\0A@i@H"yz:Vԫ+=zlB֭+VҥKl &R'۷! 邿]vI f# ]14 M~#ǤVeM].W꾸 ܾ}[,ĉ L͑@ ;ה?[ )R힁޽;w{DŶF`/ɓt2ǏAGu1wRo d&b*>PoY @6"1 ۢGQ/4jN?I<1 l690:rұOUVa*Q' ( 6ADZFTChO @}2j[ ?פQrUO"۽ 4Q4bÙ?gQNE Ϟ=cv z8EՏz}cq2s&EIy UXYY9 (Hll,zcxXV8g:Bc2Mܹsu={V*XUrC/#GVy  9z2ʇh)1ܕP#Dϝ"zrssLp벞 @>_SB\@!333 sÁ[#4af ~`0$|wʥn@ouNj:%D`N/i`@((ڵk >}FlЩ^C)roEzOvG([nZ EP7nn @/}u 0sUŐ/v%X_ @'~ V?]&M@,˗ Eu?g(΢O @qeѓzNx,fϞLa1[n2lyA3c #i&,C vcV1@~b1 `BQǖ2G=0gH_p΅}prNЅO1Fn(NtfDV;ѳ9D [*@Jyv?^tV6=NyŠ]5ƍNQ@?>riв-&ޜ:{ݽ{t.|`E_XT sx%3(N&F+E@\Gy̙l72zyӍtޑ?5 ;n! "0w͚5@d @IZֹjzC~hK-M@ :G^@N4>/'Rb~޿>s/ʪeCЂ{*l}^E4Nۏ+ @Z3s_-b.ڼlV2~@q pԩQ(b$&F =/z|]fZo+͂B*VRxD׾ ڨ՗4 $t" .0-j @̿SzW7(MyyO5mX&LNNpyJ*mVN<ۀLB!Ф9ĂB u V_A00uKg;0EbU =dggKDRF}0J`өFݼy) X @ o*n0G`Kqd ˡ$hb=z|)K@=]bF&a$$[{0a_ HJR3zAO2t.<&o-PHbU0ν*FÇc/'NH94zMzϯŇ>040EjFGԟ391(ǏN (8,N1Qp,JG1Z 86Pkbbg(xG.c=E N$2~4ꙶzM@sz߰;r/brU ˶!]}֡NHBBcŃ"/ ( 06Fҿ(11`Lt> }‹@:f`IIIdX ?E"x  ᯲!KZۿ0u0>Egi~`atPv-ixqR9*"~` @21w"pLƫ @IΕĎ@څ:322dP"X% UJMMh,nNQcR̈d:P1ຸ_TsNxJ^6**o> 0j2\, P[ \ׇ>? p.=l5}fr^bX0ѣ0D&***s ۬p0l2}=Pm4eg9PBU!(F PϜÆ @iٝhLFQ|%11ݫ8T={FxjCemۀŐWWWG+/& H/ Ph÷ T-N\SF/>uJg(@!(Ch|/b 0I*e2Mi X.n J+//'TDgp#Gbq 00jjj҄?tA$e4 @g6=V Hdm5Q"+483)/a2M*X!CвeҐO=; u*H[, d[hnݒ,o>5k%$$_`ئo~ P >)j'-/y>dSPb`P#4({ kbwڞD9!$^!z|'~( {n0> R|ARڽIs5{ًi !PC(^Pths[:_ @%uͷ=INNWJ%"Jmil єDa_ gz;qR;7=A_hSy+%mBB*T#4D1Dd~a @ K- .Q%&L˗/P⒣h(19CQ+ML evl0t@TCT:<48G%c#o @k$F~i/nRPP^e(ؿ///Ϣqbbi@V /Qf9P3L fa@ M @ke/WhجX<&Ф3.\(q PA@.ϟM6ٳ)33S/+eࠁ7 ih,2Y} @q@Q0rT @owa@/**.ٿ @3pjג 8oj^Ҕ)FmKѮ049L2ʻAbcF,`2-QŲiyGZy @NQ}Fabd9Xq`c/ @ f)^-@ெ1ٔhcr ZhoH좳z]Fg-M{ltvchCT]407D_HXH10ONg].KV0 K[h.o& cNsWq1~ADh DbCz썍 9Gfm.1돿хpn;0b1(` @3|{n @% /ؽ3,iZިLʒ N;.Zxn+\x "4wP+Pht3b%7}dA~cۿi=61 0cS+NnJ9㹫(%H #\o ۑ޿5Z+  ?k8\f/8lNzU Eb  dU;ݭ޿3g52]K#Zs.0x1-Po[;ukk.FAP7h`&YC‰Q6muttNkkf2/?ۼ\LOjk{ozi ;Mݴ"YxhX@޹ރo'"7usZf*{ @ G}>6U ?>w3/' ZjXYCP07gnESk$W@S||ea_~zd mo293WVuCާQ4`:Ch ^m/;( ]SMCÁ!hPD7$+WZYYYd}CrA[ML=J󏏧grhZ~jGS2̤oP^;@#  @|/}*-PXh3h|~>?< VML. 7OQnCk+@ P4:OIi_LL UTTHSvhC 7t=qr @8~K+(⠭ffE PN L @/:::$-PІ @qv1: SMKmm#bUw6%(*..,P @z?5.Tw^9rwKg(VOL)}C˧?9.n蠐C'b#Aj ӰЖhS PYFJ38(N = Eg8hC`KG2:߷Y%%%P<[ZZ*Q- f2<( xoZ EΝ6Td*jRL@g={Vӳ~f2CB, :8|MmP0" f*Oӝi#ckѢE>Ç{I}u.-ژ -Av ogq2מpA]:"U\H4өFŸA6f2zL(VZ)`IDnR5> Dgh֭wF[3 @d"MչaWҢ9!8q"=yLThk G N\m;gd*%I?dƌзˠAW:|F3 @dN 0U0iQo߾Ŋ[XZz5 92 @`J;:=iqhkUqn:@My߭X^x!mbB7ݎ2mmm @pImm``i{[DZTmm- 0@Sb3礤$ڼybg2Z|Q&.}m<@`AA7N3 ;j @p؇`' @ @Z܉pAh AB3; A.@  @hf' @Dvb A4\ @ N  @  4 ؉pAfv"A;1\ A.@N @`'  @Dv@v7 (@ q{7 ?G^qsq{t:YUBޑ yUǮ * ngd7'7޷`d7W6&x4r[}eğg7u L_tv N@R\6mNR%)mZ0c0B(↋Bp.`;ɒ,YeK:ϞΈHlYG:|f:Ė9f:r Xhvuwׄk_ܩQ|QH'yvtS\7q\@7]4"mGFJ?k"<c-]iC6U2gTGMXJ7Z(0)wm}ñԑ<3Nʁ+{djmިcccc`Rzlz`"&;$\7fmO[B`X @\3 *3CmR5JjӇӠN ݭ7GreI 1W1=o`a?bL*3$N'L+ ;sLzl9&B FxGLtɼ=Oit%=6=ӫD .Gs3y> Ǩǚc$@#2e JǪǜox@ y#ШHu#v /Em9k_ej<ѐ~z1fw4do_@7/ʽ*=ڎAɞ/.,{qǯs^xhϹc3ϯ{FU~adφ㯗]=txϻJ1fo_ Ӓ=[mW[|zϭ1f_ t2=/}DYGgߓBs*tD2ϭ˜@ " [*[հybkaL_D?>Xg Wcka>eſ~sԙN̻{=qW۽œ ]J,C57=O7[x1D,~hӿL<@ =Hd4N?-m;=[Fsl  h{ٻl ^Bsj0ssFABc-k,֯Wf}on2A0^ @睏z_v/|@ ڎAɞK;FN۴To2瓩%c3_=W{/קQ`\KaVS__@b>oprQjWeZ=bLuO]ɞE )Hfwry  ]_:W-l wɭ ڼKLy3a@7%{yzOjBGfJtӚTfHg^V̖1o]y @ }3iZN穲?=6kP'CUZڃ(oI;-C))Op}gzDz3bH-&n=  _KdQ>>>_smgz!9w5%+~Qp=XL[v#@ @r9)Pm,,i>/T,|zOT`V &-쓺݃Gd9YW_.UHw<#BqVnw̢O[Css# #8ᕄkPb=z z,zL2i%}HId=`L6yѧ}I9^u|Ï@#r=&=RnrylEjP -t;xN^k)svO;#Ӛ7 Mf{{&f;| @ '.\\|v1걖fS²tR2\cG{ @ -2zz%!i+R9C@`I1zz7'fw]tQSl.8j˶JƖJ=v=W67s i#hkL6I٤\o0=0dN*-Hg$-)g9n=(^IsW{XTd2244$Kzr@l⍱m{8%+ y%g Iu/K$ @ PlIg6f){k,ҞvEemNz~gz|pIloL]_c@ @\lL" Ѻ~mlLX\Yf@ |3}t(B #^'6WK- o7 G@O$/ivgc2% 8s͟ݐww6/ǧx25 IB=׃@><[^ obGΰ9^ k>dNJm @ pڛlx>@ 'T'$!9;@ ծ)6_F4<@͟7 @ p+ &l6\8?9 bw͚]a +o %}L{"ѸlEG |SF4@@/?7;ɵTk?OmkP$jO @»}@@j:O5hH x~wG~)@ 7+%= bbK#@ zI>?Ԁ"@ӬNPΘ"yq?7*3ߋJ4_O\v#y7nvYe%csh"|e9%;czzz Xhg=ՖjVL1@`_NKvK8ZǦ8<~,ᥖ;Q~@=&=M 7>$'/~z 32K 6~v@fJUs1@`7LYa۟w cssO c+sܚYXN^(/v9@ @+d|KMݲ~OXv'r\#{XT Mn^@?@dl@ @ @zmùyt%6dai/OEo|ŊIW-bkk{{11Atkwלu{$ң799:@^ - 6}cc#@l&ZR#,;+zlzzK߯Z5"ʠǺ9_jmtiTU&=v=o @ @zhwQC(osss#G=YS=M^H oWn{u'99n@k,{"q'zz tbD~׀@ ]B/o@ wKLJ^FVo|G!@a`mCkD  imPz z3H 2MYaI(L,Vz@ +bwo%]z\#M@,Oo vz @ }5urא4  7,pQk,2-!D^SeSo5%Xv?5ڒNw^S  klcC-k, E7\$Od%VwHZ@two板%ך@ ?vW*{@ @SSVXYMYi@tg}›?Jm0mL흼ڻb  KSYfdkO @?t+u^{g ]vE1w'} ͟bĘKڏ#} ͟zhEK @|gza]s @@,ϴC2>X͟q_s @@,鱨.so)aI*9 K\\)8|/E: |?r7g@@ @@ h4@@ M @3@fp h4@@ M&@ @@ @@ C&A &@ ^$nQ )~M!zu-@a1l]dÊ3E6Ȋ,a= ^q%$OOOoooj䤳qoL! !X< e2?i2K"YV~}}U$'U7=<4$n#PH8Lf!V:$W>??]@;Uqot- pUC~yyCï֪7(A'8D߫V_?6n p8"[ll\5=|lU <&{@\ml+Xc0 z͎~XX6X`Z]=QVfì10;R<fX `T3n%4l0m1h~D=͏hѴeI/ mQ5= @`:7(Z qQ3lQn1bfEA w~GŁTq~Gy 'Aǜ@3@ @ @ @ @ @7fcIENDB`PNG  IHDR>>`IDATx^AOA"L'㡑VU.MԀ"$kKeKD_h4oz!Wbp"В 3O0䡳]co}y;Cx?o?ݥ< _VeՊ E(cEJL4b}ē5|KqU9Hn/6xn'wQlTMyU,Mqë5'-UUR2jF*9zh[24Ad gjH+aLq4^%8'Hxk ?ۥ/˽.GyH3?|L%W\}eG\Ѐ_w/8g|"w#pWmGsxP<S.HDo_ѽױ-NIENDB`PNG  IHDR&&=IDATx^1 0 @Ekz٤u\jqـG":yVG5K"*f H(Ga-!ld , 0`Evq 9,*& @8$2|ϟ}'P `4;E wqz߫oT[^Jݎuڇiڭv˯PB~`jo ?|&@@Z5t0y偖?Pm 8.DlPE75BZ|:toZ u>?wBcX}'fOZ7 b}郺>- ly&/~ ȷ8ZD^8}׫\$?\?|-#weՇARm dⲼ(/> ȉ B^<}y}8a\*tX~It"^.$@ si-xh}evG,X%F>=d}/O=VWWjRQ_Z_/@K}B>e|@0H6L|NӣϨoSoD.;Tt L ( D*X[tϨ #@Go-r|{its0a^X>u,}`x>؛a`O{{W3wJS%? r.-?gr?ji6\e G ;M&!i;X|XA~_,o?@J0+F@pZz:'2COkIENDB`PNG  IHDRL'PLTEūIDATxUAE@?1I?XXXX[XXKXXX+X3aabaΰFXX/Xs`bb>u51!# 8Xրuuuu=OXXbac}`}b}aMc>anZ_IENDB`PNG  IHDRL'PLTEۍIDATx^ő@>dff迹+c? 4 [_?l}3 .X:Zb XN0:ĺc>kSmcM.1`|u;{] o `uMOFXb-dIENDB`PNG  IHDRj!T/!IDATx^ 0E/wknZFW5b|jL.T+SgL}~G}&ʏO&/}ѧ!~CS}rF}59}L^fG}ʑS3ElXgÊ>uf+?D}&/}2:aEL^q3yO9mW}Ɇ}6f' +Y'sL|E> ONsKU|OkGޘVGIENDB`PNG  IHDR:csCl0`M IDATcUQ|IENDB`PNG  IHDR(csCl0`MIDATxc$BF5jD6S:y +IENDB`PNG  IHDRacsCl0`MAIDATx^HaȤ  "$dQUP!DPDH)!%Z5,BqI@j;޶v;ﶻvnwf& p||YY# 9T!knA,ێiz2많>!7,^ ZiȫXAd̏}.G,_mjZ),+*tcYR$RY1 7'8wsV]DzphL fe0|멝:NT *ߧ@*=Ͼ Ée(3GPqٗʽ7LRMa7w 0v?ˤsk5z3TB['ڈ0 ŁE(ᘪWil3*oP2d8C#0ˋ'¦c(葦"q`xٰ%wzFaN Sa E'ETREs{| q+Kk$xܻ{ftE6xs]:'cl-h}nz#Tr"b¯%jFw1GJ?Pgk.gyt>,c~L٨ ׫>@MR=VVH<-%*~ǁǀ: iZ4>_Y-zDh\yUc0Z:TIxFձ3&I"B]HJdd&`jlo,   ēwÜnaY[BPZ!,F } EE,::bK{ba0`2M){-﮼ "p6݂I#4];sNhTa24r0x^fs1#ﵪrd ]4`cڧh3ýOb+h1*nI1/\$ _C R{,"96 k `PU$T\Dw(v , ŵslJ^NVb$rdUX@WhiQicdM´ ~,/:? ϞQŌEHCfftϜ>aׇ=Y`@xh4 o =b M'ʿMwІ0pΚSP!.f @u" 0-~[?Z§]iHJZ(thSw[ IcbmJq;P(+t#yɅ632 /؀6u2]!4% K9 Mc5R~v2YLD5cӡWfZ @T?*m<9,5GiYǮ+Sc_lFrd2^8B_OL`K 6.8o}K巓;_E1ƴl 'Hs v+{Yf^ꎾ?w H"Sc5<%t#` _mJNeht #7'q#éX2XDbxKK;-θ*XL hZxfaVG5;/M'5cMTўXAJd ocŞLsTJyx2(t%CYYUeXu30)zK@;0JHƃ/A͕^x+F8`8+ULjjAܛ%z$ 8l80}[J_mJaM,-X}ڛ$.%Jwq !0qk<{ E*u`|+G U}(/?ڏ~O[!Ȇ4Gr o:M)bic$7Zij(d *Q\ 鴂]>/oTB՜ xpwouJpRLFbLXؚf:*-~ #(V;mnt:+I O=47M!AңWyL%u8[Lv|:= ]eD*qpyVXvIzϾйГPv5Sr]ъE-w~locݐ>UVxʨ9 !`su`_fZ_]+҉J}Y!t/Blr3K{˳_b=h7!ذXEdõG+ʤdZQM]*mqg1bgxշף֌8f$RHXmVV`Wny d}k5_{ f8]7":)u5:$;}'c!B*6(EhĆew47;9P&縕G{T>mޣ| ?#k}"iĄ g+7CKhx Sd9M<R.N/tz#@KD`(/|Z3fc^ !뺁Wu/܍ ߴή0V>,{S}1¾Q/ &Fe-es\&ezj q>כm5+W,vaVH/_ qo7][=)qa lF(B^z~e[%$M TlN qok&7Ï-V6;M_, r0;jo%+И ^ s3`v,usNϨ߮='"&T~ߝi.W_=>JO/n Dl *u"_Eb\h =2W5m?# p1>-ipFL:LT2Wj`zx2n QV)9a ~I{ɿ(.zjxyi 3̻g-ȆA2au&S}Y=3 [Że,Hxpjn ^\JQzdGEgd$m.-}~?N,* vt=>ϴ,x0=V>IENDB`PNG  IHDRV@AW_IDATx{t}w[ .&HbD6E⤧>='&!NR(9&N=v .-9vy+&Hd$ڝXfgvgv%vs BFOB( 5%WBF"uDRh,)āB)Ll~j: ~_{`B4 SWhJ$u0BITQ$ )DJ׾?(V 5]'K"_~5I4}{U(jR/ ;2c% VOX{T]}Ʋ'XXN IjuӮNdQ m)5]Gzm>;* /~o-j#C;ljD Xs꣟{3AePLLמIma<&ش(^8{n!XZ+$IثYSgWj*x{QN2Y9=HI\Y2l ZGÀ|dJ>qb8Ct`~LYj~ѿɒ?|xtkY]耪Q }ӶK6I6P7`_YYZ0{\ҩ%~S=R:ZPgjPa|5ϯ*B\JcϦu 2-"7!2vԨve4Rf\74D~ 5"+JZ^S\JRtJshL2Ƃ`f25kj"PY"mzX _]yo7 `őBLhZ7@SXXB# {znwTk}i8VuR8/D@ W`+y/# qf:"yc`?^vYS1F5l%#wKN\붊ޠi[<0-0~.LKFwo"vmyS N3qwpZc HIM2r7ҹN]ǫaVe P^72aWx%8ۤ Ky$(,=NDY?Td}zZ^SV5ye Wm[rg>[ߴ uYk#vzs\úzvzr\Lv^tH3<p4Sٲ@]%XX`[*CЛ}&<7*qI H O0 lETS^'9}]gϣm ?K- tTUVgOcE Gh=WJpޏTBCY},[7@=Ýֺ>20^{cE|9/Ā`mUk ~* $n:ޑlxZi_᜼BBկϼb|%+fX ڀewm X0Dv{xd.2= H3x x!t[6 $^Vh|]hT53ԃ(iL@gp4J85 /T}PxQvnjz<ةNwkKxE/ s5Rsމd({m(QI4^kXkU<|]J]vސ mb:j6Bo5JN/o╮Y1|Dw+Fx]P:=^"~^o|UJ^ flԴ  Ê2iuU`\zUM)ExGUh*X(` jAO9>P>'RZd#֠ުYljGfTv,NhV]XhS#|$,ue'=C̲9jyvMDTen4-4XU 9yҜJ*ȉSռjh/ի֝7zN=ZhB:*Eg}~ر%VD[H.5TժW&B5Ǫ!j52P{4yw:qG]k>ٸϯ)']X{@u;~-pG OOow}[Ogmk@#X1 $`4\ݟ#R_҄u/ z@Kw]a.ޝ$sTU `Nz:{A= mkP:I\sҾAnVG| 7|O|hz?Rqnm|9\Z&ry^id1 WO GlMR~yxj1'~"w~I2myHl^M`nu6b[|no"Pk:||ȠQ.`ls-W[p}ñp SJwXv9=[#7̍I|ʄW$0'ssBa~ +a>L_Q>(5_%X>T5}rDz;uZ0 ԭn{),NvLFi&稭^äᱤP dEOp]üuK(̩4z 3O):>/T!DpPN鷷6GFx]m(C @fr0u: |w~-߼nD,{Rw)}f̩P5AW4y :;FPfAJ! waTnw,M]r16ZSYj kǠ*Ո,dY&BPO*35\\{U:N:n$RC7CPIVM-+*!潖o/sP`-RgRXQ>-}BiDPIV>dϽDTل0@5UetXPF] oZdd??a@M.+ `&xw5;냠ӛ[@+T2]KD پEI:"G#`EP( *NB( `EP(+ B 0먻DIENDB`PNG  IHDR,7gIDATx] u~wϹ3{_v%Յ$)1S1`118+@($W08U1q$, +LLwyn\ bWJͫz;3w#N}-j&}P@OKP_`@RJՀXLK.lhǏ'a [n&6Xe_Irm㳰{'t |*?aAH(B e:TBɲV~aqFڴL(-$Ȧ-, @K'XQ : ?x MиQY@ Ak8+iS)Sjvv.P'@Jq4="MU ? h}/*|5K˸n>NlE  $t Y &;&KB:jhh]MU- 6Z=߃h$?nMO5Nve`*t@aKb}jm|(Bŝb0 ~ B>"6yi>kkÇ!pRkU?:򕉆veF31>Yad2|-A:yHtېi~?U,:&d 1!QfJ٤a*XtdVJH2LA2!!fU kUр$s/ {~2SFEG:2E1s9r.T l|;[Ri~-yb<Ŀ$4W@Z\ 4Mq+{Eߖ0,Jܐ *4MVZ-aߍN~Y̕HZ|*y1"3\;c;LQ\=,+ɯ%݇ - jTh+4L3 0!9Lv9ZACȶ!!U u("XE4+:ƴ-qO#;@@!4 ;!1pu! B})l*X< FYC`g Qw41W]L)N|8s`lB7VEC?B9T,0iiߪjc4.!);S Bx @| *)`{wΞ G]ae`Р g˒K=k@PWChX5LJF W텔}0\P $xO.O")mp`>ط 47WL-A C鯽n@@6 h `,E)5% = PuG+p޻~Ok|B& ^_JV w!s#5wRԁ<osp(ecy+֔szsmUWgc#=yc Ll:g~4n[}Emf/6L+E6'',&6q py]y;*ۋ:hθB3;X (E5 /~9A0թkp?*}|TX;;|4̜V]V@CCK'cKIh)NlaĶRBL w ῑȀ!\Âo>>Ifa琿|6 u4#%A~}\|={țo@>$9Kz|}ē$XC(Y\oR,/# K9+DWr@LsxAO+2"څN߸M0>vpawOݿgpۓ9`E*vAwB¡:ڪQҹ'YՉ \QISFۤ|\[ x',xaL-C=b,(W!_0X+0neMeA+X(JC.OB.}yʐmІYH(k䋹zl!_9|ܶ$m"@ V/^A^:[o _ùIq=i\!ų-l!n~9 ur@OZA]nũgPQB>p,In,QsG ? 'Ç{-8WхSA31[pJ ׫т.a:68"Wk\L" e?vgNAšo _% ķg?cmx.t.y`"7ϳT=.6.,v~#sYӶ wT:/e&wAK1Clr;-da)<3Nq̕9 B~ϟP ւnpvic [f_;yF3pX>7mXv s&cR7x g'XvJٽc}w^]X?`\L ?t8G֞,@;LεvsYhl7 uyu# c7kۋ:u } ʚi.$xNee [A'SeYFLC  -@w)0a==եA H:.O;[`Th>RS3h!ήugha[k^3ooskXkuӸՅ2>UqS&B@{!}O Cu p`2ɝ*S{~ mfxbV/ٖwhp53!~wJ MBw9,F@}TZA1PrFE=a#Ú$6u׶aUc%:y?56-r}7w`'[xР@<\Z:D/rD/p kjEDc!kEb~nY^3+Xd܀ <CS)ًвwR *~Du\﹇3OQ'0 R,2 UW"d|͟p e̚KbWvY@6sZb3Cr2J& 5f,^{ڡI]S qBH2R *'u23Y6 qeXrd1XTN>ŸCnS_Q(Ӗr7' !Z`A?͜LՉj&,RϪpf׿,!kFJtԷSF|0K z1.˨iEQ45aKk*>:z}.\Mm>drUfaD=6G@BK5IÜ;)sO<92JS5QXP\eo#lSPS8gp&z==Kqˑ!y; ) gYr?eX:`g3sIƔ.Ωm&9U(0?:ʀABT)q-\$B߂~ظC7ן%z2WgDLQ.v;`I‰(tWY[޶4\>mN1nH+I N[13> }"h'ҟ>̴9ƜG^w紖.%#lt7?wKӯB_Wگ+$#N*L}s{v>ڈsJ[ax 0^<; ɽ24AMpDBWo#c[sswZAs 0Ni2H[ݮQ*8zyW%KQQo޷[[8Q7%\0,_KD lWh5YFD`9e i݅&~ړ؝>iD~ 7ۖI9 H8zkLPxpb c3Μ)o%edh%&n3({CjAfɸ45&j0֘ Aأ8o^C5xd$TK c{S^0\yaꬃ}s|)PbyAU|iR# ~qu~M~xG+ lGNoTUkʏWPGyD'PL o@, ɤKN;k@,H>]z.tFum1 8tq7(g#UW[P6{Z71bکFKUT[pŒz!Z6w gaNb*Tvi u)S Fe-@j!!v60gZ"y&L.ZʨVX7Xv6Ӟa i=@SAχ Pv-LV 13A9 pݜgӎw"ʨVh@:_)F-@Vڂ1Cd KidZy3(IdNvLƓ+@V~BcB_e7-3u 'Y{'eѽqɓX?i eyиd<>CO$l#RU"yO&1pURpBW30Ӛ]4'MFXϻ0BGvEQ{oT/35!|2q8~j07~cĽ%wݙxgyMQeT*4Tg2V+|~Eh!Ή ` Zk̝^ qCt80D,ټ`Jy_ߠA[]h/gۜI}IDATx^͜ p\y{jWJ$mY;mBlPI'LL^c<pB┐!@ڔ @4mCJICNyū6dju{NWgΜs+3fhG}sc9Gꗉs78tƭD;ίü9I"7]}-V~mג*ϕBqu {]u|A^aGbVnX !e-;z?ҔɬO$m5̈=8/LO9y؁xxkya(kN[7lkYxQ#RIc6l+Q-q}g}.dKs#{O<|^&ҍ%p|@3bƦz+z.iG1x4Ӥ1xq<$Gr<+>y{J VvwI= 5X5ir Op@O+RPC7 <Gd@/p8^}(^9(jKa-[ko|b z;[ DEP.ϩ)C0f65aq,"L' χ/TxV*$c:'_ݮ M-[ylÚ˺[F! \hg208` 1)Ll&\1xO7V9hwB{ܚUk$,J8I E./!JR1d갤؊3-%`_ #ٷxB,Cw!$u;W.D}"" ^p Ղ 3R@IiڨMlòW]tlaBt֕}]-4 RJR!uA5pj_ $AVRq u5j_"@ǃ8NP t4!? 4cs8 eY6):ڛW/]W3!=;HU8ۮSfa`uljoYݘ ¡sN` &,pe,d3iKDt؆M}Qk6#9^s Qb0@K$FA  )]a-yϾpX9twuͤkaRAr䖈H$PX4uXwF?p\}VU;>+<`V:}z|Up|6oGu|@)@@>bLn '=zpY2[x`C)g|ZLZ\t\'G'p~UT頻2 3L>\jSG{7{ÀUmݏ/XH8S86É(U*KBݥkP+t\$Bx{"+z0DN4}<GssI},V.$'L:L?;59=6}tT :Ĺ1Ob~)3;k8ijr͑q݋AƍᰘJ\erq1</j;8K/ȡI ˤ PfAPAXY)EX:&GO3@O?/$9?[CNg##NI% |VP(N%ſtj I~уsS QwTxjNmY(>f.O: ajŁ5;>rwaBo>w;ga&(ЂN iMt}\: H\0‚yK !^ᯬZ$ݶ(|&[DR$#\!BiXUvQ9ׁ2^;|ٽ>Vp:04KqGs8@$bC1mU*WGew"8a{/XmgRm1זtRC3D u%R,S$D.lb0eFԜk+ vlh~qտq󗿲~yJOƅ X))^YXB:$)k{umMbY2Ymö#0L4 $} JIŊ%/HD,둖o?[n2)-&w}_ 1z=[{sogfd꓈ٶsb0rUƘ>|Q{=o? 0= uXu%7les[[3O w8&R4 <g@&뒿hG];tS8p:W` IENDB`PNG  IHDRL>}IDATx^՜ \yǼvfvfm܀qظ$$M\)hDq&B@C0REiPBҴ%bD)8@cjcc8_gϽGg}5g}{9W}u͈co&.>|߃##K{|A[oףx(]΋ μȰX5Wz{ ˗oޙG:FʓUʕ̹s7%X@1 <0\Xb1,XV?8xShf1] {_lߺe0]4LX 8$`&3$0FI538hg=V~Hw9j `Z]"*u-leˊȷasS* $R s?hM N:gɐ +2pM ^)L]ħo^ўC2 A`s0۸)c T˶VX$$488$ ^ x7Q8uaE+v aQ>|ȍTtp`!4b A 21,0 \}n^~btW 4j6w{rg3dou/h-t2`U,U:hKUiʡq ݎ56ÙӇ]SX2Uas6ك$mvh$8xDi_'E|tkmݽ  ^w_8`d|jur4LÌK RDF$%6eZa0LӠfŢ!Z!l>*й BPDG>" Ӳjbvdc+̶Bf[z@4DzQk25rX?%a 4fPHMPygnԴ5(Q0iV<̵Ih ^%9=0a>L`]5X(=!5jy{CRC3-S>1"h*郅*&pU u=_+P K>zXڕ(D.FB*},(nP?jh6nٺ 3 -,qAt~u\TƆ ůӽ|0"Nh%̯iNՉ|!0YN- ꁷIYԉ^y3m|L]'h,:Y= 2N] r݊(4fp- b HB>FGqԫJZaB\knƙS E?ELN8;;|ԡWGT%UzOy.'pCKoQI!x K:uZz,/<0P:D0+ ){u} řcGp4UHR/DZvs6<Rц$FFwz]f{[nBUI :#I#ƆK8w8P5UgTreGKm\qpvpovpỎl 6:<6.!!'wA¹0 E2N?_=T .ipe۾OoETa乃'0 D<'uk:3!,' ;NcU&*- 5WXA=*zҐ211o.{Z~Ќ!I*Nt'raO "0BUy mPRZ'ˍ/ 6>6>ӳ u>U<fBӓ4"`A()s7~)+Ɇ5<:| LT'g=X<Ԩ/rkd_ާa { ̲?CGύ^?7 0"0!@33ʂ-eԎSȑ33ogN|ۼMB UP00±"x ]`.a"9$X(1 K`u7nP?7er|kTϔ 67M/M$¢>Xv耂D/AES%C8護0m(==]`I X㉸dk 8)B/yC⦁T:\GJFZ h\+5+5XʥΕ#ur_,o(J+`ȶn1r2uUc~JCR}FO{ݪE0|@!15s G6Eu}umS{g uTPu|L.MgP9K:za)]E!S /-[~ӕ|R[ ;5 su7,]9p}L.1mdsY: !PpCB""LBG00LXƇo9Ssf,RnO ݾqAJ6`WIO$>ƧÓP}|k7\M=}_~~m \fV#ݾck+mmɵhOq "}Mc1NθG2qb{jЮ9_y`ϓ KiEPzׇ>lنMY0P(v-dfnek??%+S ސ̴lʫ{gd7 y-IENDB`PNG  IHDRL>}wIDATx^͜k\U1wޏ}jZ[Fe)VHmT> .lS&\$媄P1"$r ]El鵉3l\xϝDl?q'QkABs0j1W:~ˏbP7f(nK ξİX ӲUrϕF&>/oΕzerp][c!2 s5ԫ]ٹ3OM뱽~iΘV<8v)ٗWP2<\Cµ9I!a38cI@3hչ\nfjS'h5ϟ9ƃ?_hնJ/i2[W'W^շlt p<ñb,˂ppn!H SBpsd#/$_ vI-koVQx&Rn `11,6mYT>포!)_F=;v/۬z]MՑիI{$8RNzr$ P@m0*"lk=!/oJ[^r!2 Wq*lCy#G#4p\\+umH ACU/~fgc\ 겔iuePet,zMZ3rPFp1Mh"_H'8x-?!SFVߤ^)L]WomCRi iHIJ2\Ȁ7W$o*gYP* 8 t ǎQa ?Dl +VnCҋb^3$T@P!d  48` jMn(MxٽϼaR 7'l/=@WK Na@yCu0!%s`YVU@+6|h~-@B+M.ZEs3V[h_,LQV*Kf N 70/y(<)ρ[Gh4BT֚W@R*sD Zճ/KZ 4/t[$Ȩ E 0lhq؉t>u fq@XK25ш(m~DPşuu:!0IPcd9L H 8Ž1!%]T/`L:P8% F*҈MrDU3:1 ^Ї_zԐ滿L$EG,?2%T 8RMd(E )A$O,FĘZ`K|%lȔHRJ4UNq|zqpnYَ 8$åH!&  U*>fW(LJٍF X7V≮#郯oulR7KA#X-nH0f\29WEB%Dxy 7!aY%-: DzZoVgP|{7 =]䒦tR:_aL]B#ufjw?t;`]֮rݶO@H$DD20Xy~;`:l`PfҎ`i,&,l6Q9{g) ̏rS=YZeGSI!s*' Qd%93M/nC\a$I!ev$@3PrԼ~= ˏ#hv rI٘L0XX+S5̩^?\4UNN 4$Dɇa"UN~Aj jocj{˹ٳ' RnzW 21̓fR ze3{ )xkerf|NlH $ecZZUzPTp_6ںc瀝=~E' 2̀2XD^dik2u~TuuG_?K|cS.!A&xi7d@Ԧ ~5,m/h]@SZet&*5CQgt؃T&!EtBaa1=M-#W䂉`La©cw?tR?\cLbJ2CYB 1Aj1`L6P'] d 8cOry|Eo6#EQ{(U+*EZi $ Nmzٕ]) 0 ~{}fو\1RB 3 AR_Ph8jr\@ߖ ʘzO7(l>8 )`{v=//GydX Иkb^G2 oIt\9B)-EwWqp'ط{LzHrh)F]p3dԉPhTx[;yX\a 7ڱG~+OdKx^0\*J%fs,X}OnZI"ӯcA+t3m:R)Ϋs-؞K8?N ,]Ёh ٣[m4TT9R< !QS&c֮$[U][a AEC6Isͭ|{aplOlO4KRjUb8g 77]_+_ϲ[C![5k3r"cN-Fmbap {G88<\TAv\uqA#[*alHf]C/}?~<9}Stq5SOytu<\o/TZCÀa矆i6VD}IDATx^͜kdu۷繳;3Y5kcA1AAEB,ΗD NdI,(%KN$G?;(2haʻ<ξfQ'='SvV}}[[Tsux?03*}y?]]p?|-Vc(",-|qA{GQ., S):Z;+̆i3pXv4r0 o9v'Vnx.T0C3A37擷/L{_H$2J8x/|â (9nɏN?aSxࠏRC*Ґ+I41F=27/-& Ǘx^H[jl#]7&ۜG\N!s.§ʁ`"Jh4czO~J/}k{; Vm.lۼoG=(Ch0x*_U ǔ^C+|.@aÆ6n /?p@$,8-Vo&Xb_ANHAP +LC^# ȫA*x:1 Mi!G"BЌ* .}>Ѩ_4e6`Yui JoT RH,#Jk0 }#YD`ˢ@z \|1h䡩Gsu%u sv>89YA>(J%Kb' @8eE G4"1|σքg&Kv9d58(,L{XdtȦ&\Nhi d2R9h"(]l4<> Zx0Ƀ^uϾ[ {WIn\'K#zPJ."1uQ$ ! 4#IkHCO}¼P;ZQvjW^a¦><<|VuĦ}-jB2Wr @hBCxoY`|[`j6I%6JSܤ@3$AR@S u|Lf#OӕJb>R$s` %ȼ)7dU;_p r=^AVaI벢 ([[xd/sg#8e1 ;L,iM`j`tI&.#&xS-`u=x KƷs8rV杔AbIJgN~ja5$|hM|LkF J~dlfX޸75h-;kc.jXk9-B)X{^!s/ ,v$D&Sg_vڱsN"ޘIJlD3ˀr!*XߨϴQWwt ɵ-ingξΩLT\0 9IRu%rX5BVY6w>nqx[ f[K傴()0dQ)h)!0  K ! /4l 0rvzXFas?9vzMyAթ.@$$|ikJ&1 Z*c4kl޲qK .f@7߶{s[GGJ V oE8Xd/)02hFҒ6k+5j`M7\ûrEv_RSMiJ @V%$)'†(}^Ll&~~汍_Woh 0AIu'RKuTrʩB7&B"(@eCuVy{3'~j׏apB^Q[EQI ٸ)i145J?)@kv`mV'Vpx{cśG&z PQ,*i#0|x"8:a7ujTkF[ S] Ll:M["UjTot~ ?ذfٍ|\!5$cC^6Ԉ,Anltw+,#L 69x|3u{?*nHbO(9˰@#2G7 Ԧv?df`NeRY܈Wyu.n7gSdxŚʵ"_-(堁XE"}lg{L56(bp|NYY>TMhްEnNGo%ęsv4EJUB(-O`VbHsY]{#{w>&ReZj r* C%0ʕ}uHSUl3&)MzrWhC-g&фY FiOWehě)@ܕ**lrqUX3QLG.y$ cc=ȇINAlג/G_/F^ؓ__n1rC7Rv^~a;$kQK9uY(z =k(V~[:R\Rw(\o*ucdS( dɜB-RVQzi@Sugg?xe5v73, 7>r7  %##,C$RZ5 ܄?T{`8oEmzV7F&On,h86 @ep6tv9u; o?{khҕz²J S7|_W2).?\'H$IENDB`PNG  IHDRL>}zIDATx͜kgy;9wחu;NpBL.&)(UPJPD/"ZVzAE-THZD@ДAhh i$ql=gfާg̫kecwޱ  O\F/儵T?rܷO7N-x"\XN8NxןR|J 24ucYA-|߽79l2krًHW<[x?r0\޿mj5*Zh$08Qvn']J^<~}'O)cZo*n`%XRݛf"uf4dS="O{JS'Q{ۅv™ń_xņ >/?#98ԹNV@ݰcb-|-7왮2 3P~a TP?@!MIe:K_lN[zo~kgŗ@+pnsІE Vt+moncz}0^~Uԏ/y>O-; nܺy4|`HG~x~I 9hÞknۗ5gtzs1 V5@Q9v!.FvD0)̄{޴띷lk߽I @Yl܆ j6a"X_4l!TtfR4-#Rs(u5#o(c&@ $hw x)sqNv5xA4RJΩwq̿?zCpaW]inkUO@4X981ä,σ4 $0Q=U'[Zz"NlaU.{fZnjRd/C$]a WEpA)*Hhe)D 2zCt;}ӅV~guw'}mKkbT #5.%W+ MmV 6Fy\5wzYkUK:2^RE{)a@fhA Fw^~`0 LaWMO6"|Q\(9 iH~+FhhTWA$O(0^|GlǑ~=|+U @Xh!,$l1;Gz=غ{Lr_U a!AQq^N;?떶h'uqX'ZwzF^vS;)S)/^w?~fok?uì$i6bUܢ>}%Y!?6o氺%`Ju6^*%bl`uhAmR.V-/*DQ7 EÝ(ǃ?::mS;C}׌cET A<>M1Ks;VÆFUS` %?r?;1'*"^y6hU={ qNB'}Y q}),oψU +;lXZ=kŭSvlj،lٶfh0XDc '욮a3P¤'B%|#f0J`.Mwh/-l O~ė~oW0~7_~ rgL2^u e=Z"=hA skG|2p+;UC6Ba29Z1vQVY`Ѫaz4 x%h\B<X^|hւy3IYΐE[cwɆT3Ubvx֫_RS~ ^ 6SڱjE1iQ h 廞mFpSq_~c{_C_F?sD#}=vJ :Q4AܼAMH{6xϛvOAq&>n~;MA-3v4<=ݾ:[6Dbc@|¨ eĬ΢kٳ]OOw|0w]34 T}˞wn o:eq[5oU%D}oIDATx^͜{]uƿ566 6&MSmRrZj*iZP\5$ TPAZby;wy{>:<ܻG9ca{3"B֗~\ ᡐngP5z[ڲ0Qg3U\/:>ŋϳ.8 (d->()>;LJ4cwWd/5a)?3ݹB3H'Li܄?<Ŭ[Euɞzqjf^~kGx\9{Qx?+8}b _}k{qײ|;rC3+g<:juhغWƦ?ynoٿ<S XhVwUw,Dz\I3 0Ltu1[v*ӕjntrrvmz_y#ttZSe u` ȥSuf A29͡q )+|*BzۺwKsݏ=K' NAkQXulCGr9 V 0 L F, @@ .СiXFdnmOa,Tx6 h4~J0$yWnڰ +`$|'!tg"L" x:4HpbKhg M88Nw:D+;EVBk׮\}霉TA7drIx^0@Lv5L`Xn(yC!GۋS03ZX9 j`qwiV-|XK2yr 85(xg`% ,e!_~c<_Za2Vd/ruϊR+ C N c`Uc y.yPdڹK7 q8qkaœ}Ϻ{;:LFv6xnz(885&Dh0 3p.43tuo[qݚCϼ)5 v^w߂q,8hE07tl[σ1g浨r\8)!l ‘.Bs iZ,t`p`.t=v tKYyq (Lڈqӄ<"IZ.]@[C4H%KI+9[:;Y范 q1 `"_ʈ D҈4H\%fbśBm}:C.0<26%L]3fde,=0ݘ/$B&ם,QX  xXJ !"q>~ɛǾ֤B9%S.T8..n5W 0t>&%_%9Q>1-W)s%H6U>Y f.O\ jΌ).$6B7^?i Ks/bc8 K_@v=pY8 ilSjؕW~n,hch c; w"6fc -m0U+}Y' GtUrurX5JU!Re:[$_IO:2FNl"1,T$", '/j;o3NÄhz>CE$GځԐy̏OŏᚶJzBܤODp<Z1AۮE"Jucg,H.=VOvVӕ+h1Xm ,F9ΏWL0ZjǕQ$Tώ 8f*Ƨ*G_y`#`-{Kr wɦxQ"ޞ#"8U/^5sKiV :hAO@ 5&W]`p$ ^!yALgGqhU5O[wΰK^X$`4@bOuF@mau; K@BR”عCxX<6/{ö[Y (E\% }eã'_j >tƛ& s*'E%" `1deo>+vi G_c\$! !,!?Bi)>aa86ة0]TęׇƧ&  AEa1@{+cC'rWw\zӇ=3zvEK@<7$*/dhmΒ[?MCR(h^ԻC˓W2htse=#w䅥s8~-lCmö_s{c ]  }0Ohf!#%x0-)fw 9rhk?GV*4MlA#kpBM@Z J*wGcE@-y:M@% ̑ o>}'7%$|R= f3d Ɏօp5u(%SIA|znoaX흷߻K+՘^;H$Ly(Kl 33ULG}Rײ'k9k0kD ::r{'eLDywzB;RruJ*<ׅ.ern B$]&YŜ1+:fT^xowHfg_umbt"|@$+Oω=7tkеƁbhFSaz/1JZe:W\{EWiW]fUJ+,W 0 7eBcajzp]3w6l[aq9S  CO=~yGs<WGTLDB;eA3=tn ha`eqYp0){'I. G1S7[XGEC XGL[ȋ&ht0 pABb T3TZSb##XAg>C(sEPRɻgD ޥjز VGwkTmߢ<|'$x}&Tsͥr hLC_i9,CEDHit0aY Lq<߆2,-f2fіA B8 G $3(bЂS ɸ|X>|g!j*f4еd C,Ρ-_1eh:@uo!"=8,HXIu!%œ/G>[@6lK^~SF-#sZd[}z[>Ӿ*iۼy[r: /f^@c2gi t.Ǯ'JC +pͿ [~jEoϥ7Wt6WH֍2 X(0Ra4 vb%t =?>-ayPC$epWn) ֞Q4K'RH HDx( `-pChA\[RFc7ۊkjQ_6}0?z=k}y_w{w-݂i \Yc1H /#-y@pnlfdS?Cȱȑ#!/uYv4pQ,K>gKhJ1HrHH 51ƃsuJ==iv߷go69^,tIENDB`PNG  IHDRL>}JIDATx^՜mTyܷyٝ]]ޱwŘ!mRJNHnM%J_6JTj+DڴdVUڔڲ0!!6\56eȾ}9O=s q#\\Fs{ϬKDp7wޏ,޶:m}4 pa sQ4E!~x+lof.,Ȍ}0e~{[yPZ0-I'~ti|fN>20-7Ձ7U_.y˙ $ACjDKW[ѻN[o@"1{W,p ̆,P^mD_6 P <pyq(HAkqQ$a_vRyܿ>u! (1nlXԶUym&+% r(z. ` D i57h-.'KϞ[]/N< J`ܦ00 . -[{p`rKj!m0yy@ u]֗ Xo4r0_xs|B)pZ$:z-w=pmrb_X`Fx PJAT:фN $4gq㌡~w%>=%,Lzv XqPv&t|c[qϪ֡J% U("%`I0#(Ǒ8 J{ &[ﵒ3W>7c0xtUwM Tժr וc*,AmRv[ӵX*}s98a3)\[3 lw9J]vJX.@B%`~Rw 2ĉ2 8+` GK>G8X0 }d30za&MmSlW*pJEA JT"Pd8Rs00TT˒(뺪|"ީ|4Zd.7U+[ܜJl;,80-ҕD&T qJѱ3W.i5Og;c/1Tm+%py X6<8b64A㨴Hfֆs8~UgF ёgJ[W5SVrH3H"t p%Aseq)3vS2p8gHV*n)r#In%1zߘp"$m9Gs}J5E=Ѹ)#9ݘZn>U+1/r l5VòЊjөҏ7K9+2O0 YXW9=Ù9qgIc !`B#;O={5 xTbeZb(XJY8h ± glWua/\w fRriX& D!1 O ԥĶ)VJ.?-̘ ||U2O<@]fẅ@JFIE 4cjQ$(6K2d3@d'$RX坋9c,:p8 \}G-2J'oQT\˅&t$R1`1oׯumԢB(r#^%(ťWͣ7eϹ? $Јc$DY-ߴV%e {RJR*H0b_HA_ED$Ȱ|RxhNz1=ïsH$wW~1(g~$IT R&g[!_\x @ d`ﯠCPVQaAK"F$T?&Ro^=R`jMdi -U? D"3Ex{aο} @+0n&Oc0!ĥXeK`:4'" Ah-!hVh#(&6 /DˇeLDm`$DuUϜ;]otإ$t'[5 CVG}؇64ݭe|xu/%&8l~pM['ABod0Ӓ殽1k>4Sͷg/70]:ݸ!ΰWn%Zpfq 찀%f g . N?~)5VBzcw,T]|B# JA 3KLF,lgiWwYj֯&{}9@(gJ:2BR'?p]&4EIbKHta8 ',)gmoc 955ql`QDZ0R$•PѮ[ZMIKX*:뇦FގZ_~s@ֱRJ )bE ,w`ʽ=.qX p.~ JHyWFWDaj IӕCTVr?z?4 v;~-A0}O9P.$p<"N_$m`ed\fQTuLD/﨔 Z4lͮS.*Zh,HJNTJ,=h],Ⱥޣ DG/Qp]S`t!U\ 5,bSv?tfٗKa,tx0Samv%^ܔ*"Uʮ0O`F>Q0|:WGwq#;qX_|Szf$!dqY{V-E*G;6,J=?=myIJn*1?A o  Jng[fB²g.m%~9:(BtZdRT:* 8V"za~1ܢ6XA>Ǡ$SFPLCA ؑ]|3{P{'3RS\Zl߷zx@a]/ RXz^0pS⬍0LS_^bu5t{dr0iS xXBc`I4H.Nd َN{\A0_ߨ7N[&H~eCsW I~E^8nm!ߺB^-ƭ DTY WA4,2*'F?wf~-˅eH;?XvtP; J%{>"\bў$ r8Hw> GRpmf -։J륫Op`厐,&EuVxW^;[zY|?kbwY,IENDB`PNG  IHDRL>}IDATx^՛YUko:CսzۘnC&1IP} "⋂A%*!-TlɤVzNUݺZaw8T8־ÏZ{3cu+<^u._!c-3CL`^ ߼ywċ" ( Țv4?aMPQZ(]/'va0|Tr. sO=LP5ʠi/s}`@c8 _ٻ; K#=DWn\iyԓ$@PUFyϦ$pfWMO8x jn<'wZraՠ6gΰxasȊ4G"2AQЀQNƌ'Gnޜ}?_ߛ~3@ۖ4w`рoɶ|g/^[7nn7H:H{B{;r&Pp;׸!=˧?36Gxv74lGuB[]֑lރ8Lb"" i@ ]Z>Y)Z)=foߎ 23Cbg@qΟlt>7$ b>``F-3=&q)J6>PC91gkzy|#'+yt&JHS t=#g `(0EHv,C10_ .r4OZ`%%tye>n!_o#z,] (:kc:PMJa:CVaG\UAT[Y[lypW[Ţ/#֮'tc}nŷzH@؅ٷ5D8q9{<>iAJv'e0iu_r nwJIiv?q}MVtyfX:_T;P)Ĕ1N ."R,OACH;٥3ߝ}n5ھWw$@:Aq?h;KmX[sN; LPAU1wā ֳV*%)>d8:t /B3 a١tp!j$Ec@UN;f:{ȄDf8y"p+(q`\&bf0#TlTWVCށrU51+o4\z)՛ilV&E՘U`hZ{UFCK"bKƹ,D[JfO-R9D ,wHmI,b1$(L6 hJ)i`I*8q n9Fwft0Xjdk(ƣx9i\A ,1#dR1ٛ}) +谦 !Ad)4FIVs@k2TnlílWJ S\ mIv_bQJ-à,`"`XL E̘ FQy2PV`q ` 0JU0E00kWF/4xmE AKc{"8bBaZxT2/E}nR)i5+j~&j "^hwl޸>`AW͚F<"b)ePbKAWky`V; bRj4FC0n]Z3#6*(fͫ{sn1š7@UMIMey5#TT-GywD`ʥd}`\]5CLjVjXj 0bxT1ڟkE`͂aհbϪYU!1Y8׺Y AK&gcej)VW*B*ܪ x4Š41j& Xt\Ak2\SjP@P"8 'k67+[7v73[ڂCoQ#9!UQ#4eVX+m ´j8(q$QXP  K<ʠGͶfv8 \z3[=NH,T% \P bS6VW^_pSHL2`P F xw"` E s '؂ ְV<}^P  \ ֜S`&),#HX wª}Ml+_s9緇AVߗ`>7&xL 1HѸD^  [x&A"0&{뛓\|`RƕAd쏕c SDS.P V=RA#-,Wn5oCIZݵ֣vJczA"`A1#!d[a`hXrW6+_!3I's; ssTLq.*0pAY i]6aMczf;&{WǗ_~ZR" 3CjF5[-`A(_G ;_R}l)b] 48A#gZ\|boz>._ETPRPr틃aH~0ɒ"͜ҥ P,L-"8Ksφyw8t}s`Kx ߀O}ogtΞSjUY=.qx'  i^8∭ "8kM֫_z_E&VXR_\X[tSSaz$` ~= Lq̳^IE%}/U5Gd)ia]~hk+^/}b3活 xbOqFG=@'nldޞ|N'9>[@IENDB`PNG  IHDRL>}IDATx^kdU}OsfeΙ녙2p\AM4&xFFz))G1$X`Ѡ"0\ƹsӷ{]3È%_tOu=Bkk$5M,'p!LiHDXlRIě/" a"s,U{MI[^G{ d* <Ð 4D"{OFӒ-:@-`Š_[u;Y_ߣO2a+'f̟㿕xȭ>-"Vf)'bo N,FA2Fo.t%S k~Hm#c ?#뾟A1]y' ܴ$utNVP~[N_S/Xӛە%K$keu$,XhϧC{w=r ^7|.85+OO+)f;IBfg&LV2.aӷ-i0wh)p! iBM>N~yH?NoG&Z,i'_Bk}ߒQbI2#8֗ 9|>Di9ΐtlDiXf'!%BTwt%u@eSB7_.c_?]̦iivB ?̍0#}DM%]UEYA:6F:ՕͮnG{;o{괄DbY[&`w|ɖM2rh@P[0Y6nYۓCiB$AvG+@1t ̄_{ߝ;=w#%+,^`;Խ!+ K <_<[0L\oD6q&j5rFBM\t s`7YcƷ jo+h?|N7wN (^ LBHخJ?@7,Cz0z#&l]GFnw~l~{$כ=HH^c$Zk,NXM!Mq`{#@d!ic׶@XכB9G!,ЂchHu%pN-Qc~/-"![<#@$3}-(t;"h@zŀŷB(2Ґ1XPxL) \, S 6 E?pJH4Ґܳ"`fPb:bJ2JY( hLXU=F-Lt)ΓfjcVG6f* !02KUv„dYb;}]zKe %%ؑ2ݽyIw1M啑͂vh;#U  .ڥ S D\{نM`#"*K*/bHgTQa1aܚMH'M$jИ?L pxaw16tlǠ%ڂ[{XiE╃hA* 03Q%ͳf]CP^ oh 5 }}LS9P))!E<0@W5 HSНw{ ^y&Gf84s M{)p(.U_41l]ׄvÇH0BʈU wih]IkuUWuP7ebڒɱ|v*SqXK*Xб RkXYaʓ "4fZcjtloOJO(4w2xӣ&Ez֮aQWʹHKHt?xOi/1{z|[h%!mz,Nr"gvx]Ȕ[λ R,lS:7+Ibv hiL~NVqh .uPU1v5]0 @VeZEdd]Zz=I[:+$z|̌&IȀBKWhi%Yu%M@k}0 4\{7\zsO:F'8kFȦ5=J=0?f^"`f [.IZ\ 1h 4ʞ%V:xGgi׹ۮPMpg5e륃S򹇨<袋x|+u8%CNLt=k. ӕ ])4MCI o=L/So(q=sq|汧}C f[=|aEbΝ\{رnIqPmύoBM̤Z4„<}gmVxǷ̷ޢWXp6Nб$&z]턱$aAJX"K#/Z /CHjg:P䯶$S(4Z Ae}ģ^t͕jk$oQh&i4@ D^P(-44Ѝ*ViЁat~~x!ܓU=BdzwIri`Rqh]VIH´˟ZA\V6ǎ 3~SW9G}Wo*u#94NЖ2x4T&PbB4JE(eZ]\dzl#,4{ZsvI$LimnKW\Ju=_ T ڵvP0?_c.n2X:p;2<@!jn"R[r( J^znO` lq1j"Cp G\CJZ.ZV( :J%WSZ(d|/N"ld6nx=gpm7u~@oT&&Ԓe{+1hB;Kƛnf> h9 YJ o=|ÃG;G~4]1R:L$`Ӧq Q  o|KNTsS }u6LOU(trN-s?}}e!v)_5A_ZE!)‰E 3ʔ&:fU4&]%. d酰f<ɲ&"(M+,WI9Ԝ2|/~li5KPrcXIVOהg)+B5ʘ!ZrPn$3cc8#JaIS:nf5@X6ah^&Zil:IT&rH 'HY/3q~ );S!TDdWE6qvFZP V2aJw*Kd/+JLMP 4'MLe*9FǙ8r$,9I+t,!Dd4Sca*Yc󅻺kk+7@zӱnAI\RB_c( Xnh K)Lo !'Oի/{wǒ2:-\YhyE cʤL85ai%Eah4Y%MYNҐoi-?$5g01+hXzsi:Ph%l. )-%*tk2:/PU>d&2 ؔʐirM:pmEk\G?ׅ᱿\V,at?ھE5/jtC#m2\A%V! ۦi @:Պ@Z"x2MDҡ:/dԠjP FO7~z^|j]fS@𱯿\+7 $oHm8LJT] RP K{E] K&&L:t?}X||@1P;o)| HΖTgh{Sf80S !ZӴJ#wlw7 )9;'#OϾԀ*P^h +3 eD@#Zʫ;8Ht6#q] ;opANK>-z9LR5[T,S\(3SSƶ[nzYDoj&n?)_;&͑ 6\8CD']m/M."M ۱1 RߴRl2&Xg^d߿7R\;'\8ݫIENDB`PNG  IHDRL>}gIDATx^ ]yno_z]nԒb $`3c{`IǓJUVdȌg0lN q1X,vj[.gN-ku@򌿪{,)%o4_T%_%v>Ȅ?" `dd$>PL;dWWTUK}Z%cv|N}^?7  v 0_"(N C *V~(:J 3. ;::dET1,&B/9/3TTPEu8tfTq L2K}]- ?|9Re LJ>VP-UưRrXClfct(ΰ8ϡQEU+˜KV\6ڀP5dڶ5-;@{LN鐚i0ɷGcqLa}BC>FBsR[7=e*ҀD@~6c K&F.z] q'#ŞzDNC nr>Mh׌S(`G6}URB9jQ:uJ4LWZzyTag+#`fc 0gA@70C j8V Rѽ3rI\b:ǯ_D]("yMF ;ZD^E5RO p!VB-FNJiBaEBTv.0 Mĥ.jV#cu yH`YαBY-qv4=y./ƞ~f3 d~,} '0 @U}4lKL1D8 JkW=N.4 >Ih!kU1e]- v}ǦniOaRUPV* n_k}v,Z5-vCwb"LJ&T2dj.#f8W: ;U5\p݋{0Go]5r3!maQ.ykQJyIr)F by\8\ah@T<Q`@JB e6HbCJ|?ddk{vtC&k!G)G85ԬM/]ɓ㋀;[쑿[U/jkg"Pɏ7ݼNgʣom[0>̻+%Za(s2O {J eNNqVڋ lyҿ[P&}tod{iK;1MAJ)HJ*ǀ@8 [tݣwdJo~rذa˫&E ).7rdIWǥj]L$)wJ)L94l [w:k[Γ3ӎ<ŝ&ziVު=a[e=K#?*?!fܿIz`uuqˇzq$Gj|t\ԹG^8nhRZ͹U )cIL_km/(`7_gi*Lxd*Cid0cW@`gUa3"u2T/ؙY=tm7UǙ>Ai1ѡjB 4|3Y Hu[ʢFw>0Ax2Un0\r'_&#$(:{ќk8savZJįhx5JGiUi`Dk/ vw`:nyyb:P&{@hmO};gJaHDs<L:|8M{H{ ܺtEh9 I5]{02VB.KlH|兖VDۻ40 8ҰA9B J\M?N?&c?QH>ځM] C+E& $A1U&P˪[zL;yqb1-@gO6MMMM /l*9wF\ŵˮ>+p.ksNur-LnI$`۶I!AtuvB!E2Vkl֎.&_ls ^z ȷ޷)5,zyw^2\>ҾhU|y@8-p3Lqbٴ} @ of6 |IJ 0u%M:eǙRE/MӠZy|s|k׎}}ۿ{Ӧ} i#N?R!`!''7 S464Aŭ#)uJJ2jirAl*tf6cGwT rŕ {s0{_czz۵UsxG& $J;ȵ.\:00+DͰj5_7[qLf2S>޵\.xdz uK_M7RM`&DV.CͭLNp=A؁NR,M)DP,\= ӏ&-k{_U޴0?32c1HO&k1OU[1kt`P`>^u\.LiMlˠHp j?S߷nyhv֡͛h_GGČ+2vx,4.*]r9LƉS8Y̶HC  T;2|. \R+M ^Ƥ#}Zf@/nZ| )١M,MAwM߿ L%2J랾YV-ŌJ!aV-3thQbYVDx^@T` (;[E$lcU<YO!P}}讫/ ˺@kڥѐD2D*H i :ې-ᑃJ22N?;tly;kuᗠ&9.bEο{Bᩡtɳ=^L ׺0{IJ8klƾ&<,S"CGJpvK4PUߟXIqAM\ENYеUyK02)*D0h2:PT@g,01Q&hXXZ\ѭZ4WAH2QrA4l呵vX@ W#υ`V_g?s5sWG7"_Ò2dpڬ8>2}tԽi @ +{Y \9|݄V7Rir›.7b7\ϓ?}AZFh7W\Y[y̏0LaJnbueRمwK ifFkh;4Z.6s`hGIm +a[:Wy^HD< >~$.UЕw?Ź+me<5oA;Ç{^wTbGv;H;3 Nj} La ڇ:5}R,I*U_TP&5,|F03}㵍40>!Lk+dpfI췷 i aaCaܳ >jgʝM࿈輔/{#꘦ Oے.hI+)-V̶7xՋbBcהDU'YVD;ʛ7?×}HjdZ|lQˆaA"D]}IDATx^śwTTvjC/#  "* bMU#)*X{\51Dg=3pYf0>ɋt|#"_ N@zеv1\5o~T{Th׺Taڒx1}c1C zmF7a'xaLGG uaQ$C ɔX"x?8_ܴQ|!6HSBy*$IT~QƈIJ fsdW(P}pǙCߩX34&j9-+QZ1_=/=ܞ{kY[=Ԍa2(M pJRaN Aw&,!MNFEi 2jwhy 0Y$v+<E}drn5&TxWX`P1$Zg 9=SD 05I12hF)b|05-3}(qk7rv<;rA%,E d1 -VEzJ &a 0i@(HXIr ]!L]|_֞xd~y'魄e|T董pw D1> ֓](%&Gq1P0Wh4CzqQ%WhF0wbdSdk lh%`,MfEAH?Ba:š3f םCᏛ;I;# MXZ@/b}PQb-e";_7Y\3|&]:,u%L #QoFEAވFoaZ@t5H|&aEJ@[.T6L+֝ bceej ˩v C 3U$0PJbCxRa\]Q+HD$bt űv##)OaLSb5I¾,>0?o0Tdb֏Ib2dϠ< 8&ޅ6gi2Q+ rԤ(307D!eEWh; ; twsa:; sv!LZEpւh%$cT7 \ ε2 LN,xaanl e!lPFind rl{v`NX.m] W[1$pAR&ʞHnaM emJSJ5Ni3I|ȜկYꆺ:0π?_؊ naHaĴΤPZUL'68(r i]f^'QкTɞX V}J8a)lLPgnQ`i,8a Z \)UCS Kni;884I2no߬cڶUAp?i &֙:=z)$􆱰kQ6cA^m%P{{1ۛ,2jaX`)8 V}"_=]'q=Lypt)4U`G&іVNa-FI ;2=I;n ˇ$_ҟ- ~( 1M4Eq&IHU an\$ IV= ~%Ʊo08_)ڑrq GS5f8al*bivCߣ(]# CoIh L󛟒 tH؝*8i4B.( |E,(貄 ;vIe('"*iHas0 e̛WvTatWLإmS=KvT?VD$uDEz[XqĐ}t'frFõO*X=秶IzEK6>dN&υҰ}`%ݖcw,o@)`ēk) OV7Vq}7-xl%T/ +°~ɸ2ӣ_ZTp)˃#D#K4֐„Tp}.+ pc<Nʇosbdw%YvR}:~MM4t  vƫcp  QH_wĖGzZMPߜHi E,rS)JhF*QнnGv #0lIʊxF Hc0vX(,fnA*z!bIEg %6޹ ẃggk?ڀʂ^v6\2V"v1Y$mX\spUnFAH"EJ<lKSXLĄqH̦9T4䈚1I_TOV 6յV= rP^a?))$v!nc-I GB(Zf%۴BHo71mRx.?(!I~n}6oWlL-5((AXGL7pN+QA_8TaD2ӅIXȟNֈ4O'=xñ%pi4B' 7vW$ EFx#=>J˦:"I]@^] ӵF"?ݩx<y(t\t6\^ ?_ v,ȃ]5#Jxxh`]˵lٺTs7i ]v=;Q0%ұ3Kj1KiXqm‘y14jy ]ODң3lRzfS9bX-K˝ +Tjkcc\j4g"^R ;x~ #i|&ߎy#TH`-R' ȝ'7LvVC0(֔@3j5bIp"-hdK-!KrO x(b߃Qu0SLPIR憸7 Xzynat i.PBȸs-fKҼ?%O($DROJaX&ɳ`K׬)FyL0)"'֍L΋]Grli6TW%$· )-5"a9ޚg 3G”OeZ\dW5ppHP YQsHPw"IVc6ݻ;eۃڒw?/R[-0#7KcE k\ti}e' ӖnDwǵJ}E'ӊ· #TXR&lMHú\[,2'{1Ʈj6տQQIJfV~rrrڲN֑E|s|VqMZ< N}8~> wuuQ̺Ȑ)O1mǝ şCzaڲr)>RJ.0Q"CE\;d~`Dĩa)'4ӜuSRɢ#t*'@ZG L Iխ͸ɟ):F¹WӍKiGm # _qTM}815ۇ;GNBJ?Z4+闅}R_UGWL!Ä8Lƕ3A%K ~ y|T k@H3Vx,kX1!1 #t0[|vr擣JYa?vӅ==^#Y8UAQ|h#0JG>g*3ɇ㸙{ K,5/ĚSj=Ҡ7 32RkY1,-J9Fzla's珈_ev/N6čƄɐs*xh&\UŤc6{t;,,; ZFLM_k&ebSmEFzxFQIENDB`PNG  IHDRL>}IDATx^it\gyY%Kd[8’M ;I %H99J^ BeiBpNHJP1mŊeYHfϹcmF9Ogy;88qlk6CSՅj;Gl};4GllBTiA`[1{>?9J?}T;8UqN7($_(!R @^91_8sVs=7lKw TCMJ>m)_^ `(E&$::8@QD acõ,ض {Ͽkbv?<wdz'E @5:rؾuC{]9T& 4ƀcm0ld̢^r2^lK^<' ~VIkB(]_07bH$ؽsff= q|_UUW!21:ײ,*eGe~r|*:ZNKQh0M 8TM C-yf2"ŹT 3(g|r5(0*" zB{%c p|tX'84TS@tl#P$? ܃z4MZqPT(d jǩū3qv$+gGWn/F!e/SdQ,!I9*u8d JT-W1Re6 +hRړP>Up\?FD1 I+>TC4kGVOҙ "~.(VP ,"Zr#A0t1誄*#)` Z`pm +8WPu5E@S 1]&v7 8E* 4UL8qgǂ^X>h&4 A0ԝFP)T \%`K]:(-)1TM 5EPa{ݲFm407pa~:g[zǡi`v| (P B@j6Hl pqT }@a5Ε1=Wt6NפMkk->bޜ {o6ź v+G#=&Zck45_#2H@&~*͔gô_<* H8oDNhwFۘTUj<5ؚ'$tlTرZCtg=G>C c&"^UEX U`PŦ\Q<(g<񢝛iVBICCEMUkXoe][.m4ϼmWX_XQ|/UHEUஓUI@OJ$X3,G`Ẃ'hlc:Sqi7ɚUUJ7K|M#k!DjM$Ql,9 'CSd:o\Ó斚Zϧ!!I\G!  £c<%Ai4USё{ -q#P t&i)HM#p@\%d-鄎a=˦5CYcH]Г7ӥ"@\GlS55EKudSz>X`PT,l;Wt@D:bj|n{S,^sXoqzЛ' |s Ep,5r㘯eOi;Л(Psn66Tɵcj,iRPy~mՐ+lZ[Mد w=r> zt8yJE ]I݇|- ;q*41] j]}]h;0]Vb(dimpU8Q "喓0LX4+Sn( ?o G?ƕ1aɯ}nބ& K*:|SV=Td{ |ә &jKN8YSaࡒTBt;LQdZ*Ls Ձ隌D\C(@!)PoNv[cBC.*75቙ҩ883uOO8Q9oyA'߰[%ٞ?Y.ҶתQZD_*VwVos5Kj͢r->9Kezȫׯ!|{tTejsH҂M&[LŌIcHOLq]H[tikl]rXVX}d:_eaW@OMW)WMYїʑ #@w0 \m٪w-%h`-gX85n2na6Ƌ*Qyl=hJuv`VNfbpF5hbZWJl `Տ--*Zk#ۊ֐Sӥos\CU8E!\2'( !y< K󑉹naqnąE -'eugܲCs|LJWX]-,u\s0Id˦k! vzڱ}Hf,k`V[LCeurڮbsJw13RZÙ(-<7Zj)׬ kT킦HK}@Xpl~ b=[Q[<dmvF~/'S7 t촤 CIu'pp0îzkƍ/+'}~<03JKs߁g>{3'JM wڞĻ5w{/r]O}_ǯ^~  \KCFybj$~w9msκ3Oi7> R93W.R_M]T"׽0gTu֜{J)lwӟw-Q\@Ow}C4=D^C=01 [em40F~$ c 2耞^v6clMHt3^"M.mӪu;=};o~K/~MW^*^w:x]ױpor1OQ$f2݃x6ąoA%V6[س{k~wfH3;䁻xxk/;.\C0qn;x2HU[ \s;;<䛰̺Gfgu6>k?ڀvuobHF]{icT%  5kU4=8{^"vCSËxfHCM) OII'B~\ĝr4sw~]a_r|+p-o͢Q5~iwwhG>lG T1CG<#N X:;;5H`·?/x٫_~JlœS84Q,Fw؈TlaȖ}7^ C][^p;vl03[ X}VYX4kg,Vqtb<>3lFߖё5e!hLi dR (l9躑/{ g@e?}[@?]}}+^m[48zrIL+TZ=!Hj40D ݌3#[@)Tc`/hZ 0 }##Ws4 ^ ٌA(udƎ>XLr|;^ 1)9:m.)< ;15@^VIFBmH:49b}ĦIENDB`PNG  IHDRL>}AIDATx^͜k\ygΙh++˒Jlnm6@.m1$J!kB!'闐%&q 8%ֱ؎^/ٹ^Μsh;=hg}yߑ:ɲ,iض jຮw-tN :t(P}Qjuu.jyy2X~ZHT=%P8b~6u >A{&9Jr ŁǹǢxC ,,|?`]BjђcamD"8kc*N0CCkMM~9k kazmp0YLH{qvppL|avV^$ZzfEbjZ~XF\_& K )S(m+)I@G`fנtԓt\.7;33!If1AMi?z|[ҩ}kn;-~0e*Hr6 YLNMCfh 2F,pۿ .֋z֭[ViyF̚ekW1&~LW-;v s?d2 >^^`],+( A ,'Mm h[V@ Soa;tQPaXn\RsSj ta1 i0 ; 8/kXr/Ae~-N= L$g'Sԟ{l3‹mByKҥ KuC0f_w<#8~#gPCRnŽ|1mʉJ#y s70ucxi]a8RNNFOJmsxFVE\R˥Tu ׋f|=2/<@ ,'e;c;A)l=* }yR3CO`!_ͺK>腑7:,u}a,<|Ս71~`;u49LGX9瑿+ebaqiPZ@2 :~xv '>gHI o 4JE]$Q;_]GˈZu{Q/7R6_sLXzSI!}o__֗pyd]CqoϿ,5$/F'Yv0 EXBs<‰8q/)iYSg{%ؖ)֙X5n3i@zxF; e8~13riZ Mضp }> EІ ̄%Q7=ObvlP e%XjȂfZ,YlO֗r.\y.ƈɑ'\wgW7\tƓp~Tꘒ~ vLgGzDnaaA u/̻c`hu^ɂ7Ueэj.Iѣa݊.;tM˂\t2Wr\ڼtR)IHjN͇臬d\,R}ֺvp UtrWxUԐK`,_Ǎ0ڝz b'٪I, %^`tUaXU>YweyorrJzcwHF ,С/i ;|+ fpIR]%k~hd`\c b-'8!)mTzjN, ]%Z>wY X-Kƾ ,VvH&*!hYBJ5W g)%šm[zI+WH &,(Ɔ ҢO+h1TzQuwy]{N)+,wϱ8BK =)=; \9y?e4bz{l16MhSߋ aܪaYOPh!EZèT!7+wWKX3 m.[8=[8DDwr-~ /蜪WXԟa?oѣRܸqCgy|V,.GX1L{r닗$K',Nw⣄sڞ! " SY^r2{e n3. :^.&@;="[֛°X|5L>Dn#3tELKqJ+ ѽY[߯0_f` 20r*0!8Inआd 7+0eIqSIk17Q_( Zt{Avx P^[Ԫxc|q{}+JPbTu=[; .ZiQ5^CNeYKS#t⹃jzo wo)2EPHܴ~>?\dZ34g:ZtݯۡW5D T:nx*nrKV ϭ>*L wKՍŭիh`l|X_zo]5[ʌb2С02JMcۑ"*c8=4x(A*v-[jU"7X^`iy}IDATx^͜ xTUOTUR !A# "Qձi[zX\qn?ϡmdpťe:Y-YX*.TyݗW|y=~=PF2Bk?!59>?8]nH4ŕKHAί16>ǗCɖ)Nz},tv@0*9D# t_LrY5ˇC>ܵ %ס7^X S e.cͯE{ )E׷,No3h5S`p>Oێt#0H$# -Xav8p # ]q[_{eر,1SM%3ǁ`XF 愛o 6c󩆭_}0xRXF Mv!JU I}յNďqwef$RSx0NZJ%AT 0'.u@{Wv9۶ȡwmI΂tHOKxsc5$0H~< U'ZgU޾I''z)@C5F %Vv/,{(23Rl2biZ&@d`P)N8 jX+*shAxqhtsQ&E4ݔ_vIQqA~$VG-C(Imppuؠx3}ƦȔ?>tH!"u kTJ0Ǜ࢒(14O.E5/<ƈETUn%cNi%ܬTi5 ¢k`IQp2ٷWX2)%*4I(+0lHxo~|cVf *4YaItZI/+)(U MuTJ $ys=p2 C@ @3[i4꡸ .-oϸyL6`Rui3sJR  !{9JraSi ].`v ǧ-&am Y /'k䩳Qb^nBҳ WZ/*-*ƟGuNn]9[`(N, TIk4 yA,VS=1l˩0^geeMMN@ٓ@HdL&)d̹Q&_J z?g{iR,OyЫT@u6.g{AP!VUӦBUU,Xz:`Ν }6;ĀW.k$Ou-y [\Mz:Ls //,^JJJ>KGpkߞ@ 1/*ucp` Xz逎VP]:XH4T,ҭv;yE?A|C@5Kyg,2 s]Vhljr2e~XHno*++1Da-9s`ĉDI q%F!Ċ#k !z 8{BPʕ+b&ckG YmQUXHpNL.KXC*fΜ ]wx ZQa)lƏP"T+ y3 ,aPYb%tCS]=GĚMaq X\JQa˷;fw-^HIIr1P6K\.j速lX,Brɟ^F^2*jvPanRa!A\ KE p\Zc+RHbD9v8,BfQj;ow$T aFpC.,SX%|?sm!qb# :Mow{x#Bl 2h'NOo-O" !?h \ahK#lcW_u8=VMAeE,ΰyK|͕i-:P}~GjIW,`ػmqSXCZJ[RElAaq^Gy ,}]78u?$Z #`3MGl'm1Fc>?1oT"2BLCt&-7A\=ij֞ضemgO6a9 KJ$xm=) ]QT XNPkR Ӧ'D64jJkZg1vtF{}s_!9D<"u%%(3eo5ct^T ě(B^HNpU!g\2 pXdzz+K ꀆv9PWc'o6IC+ Eh&}`D s᫷~n})> k Yn"h]]]th4 ')l잏ыaug[>(⠆/Ryȕ~91;NL-VR+n֎He`iB\ՉC'Zv~qXh 8%H*Ds^{dzXF?.%7>X7cܨ^ζr=}KTU"Wֿ!,K) x'`^4%B;6L.яM6*XفGns]}6:#Ʀ6OñܾMyfFhA?Z]gwqq8 gԼG@!p= ]}mCU  @^8rBA'aX_`q(wlFg0uP[?* anVRI _ B~/޷aò(gBlۯ3ԿIv^~ރcgPjӯF$AqAKLa;:]Ɛ![I@Tq⸚&Ux zkrS&@]n^!(#:}uoYM L|"~Q]k|NrOih6BfZ2222K1>Ja9>aHv;? L@ԥ6 1~,(+#5ӁvFNf*LyLuK'Oɻd]u0yYƺ x8;t %~>"Wydh_QR3gH? #kҋn+).:uR)1 LKkJ[}*a Dh@) l_ #lTDpXiI\acL*Os$YMOL ЅNQ&&N@E-O`QF Y47Gh~_~CŮ/y&:]ѱx{IENDB`PNG  IHDRL>}IDATxݜt1I42ܦx̽|\fPfnÜBѧv6.{vգ7"xcIP]7ܧU_sa*V&IZ˴Q]p'X$|/ E퇎kH g=ovuuIwN"fCZ)@*R֚b[V.z/f󥥋/,{O P$i9m)xҙ-ı Drn yt9vT)*^_Ǘo۾p˳@9Ώ0r<Ƚ:j'1NRRmx#²!! a4ˣ lFd,^.P.mbt GNz;Tg[y2bgڰ@eR4Un@i/oPف#s-ޮnw )U @l{sDe (i >S =d?֧tے_WpA?p̶uou4Np& !X 9 LJATpX.p,uɍ5_;V]#,"b;iz۷?T}jL'qGVƫ0QF8KJz WGOꑉ _ɫT-mj zڿפt!c1̼ 5=VO4Bi}4Iif(ܫ~}Ʒ|jV30ƀ7>6G0,;"bׁ+Im RP\9FB# P]Ztet'Ώ-4{`@߽岦v*Lð%AzP\ > Pzݯ $qt 9~_<{n UKXcY+"C5~J(@ D">?`۽6U`ioSZok:܄;e_!K"] XqD:O_4샣 rrdwv~Ja%#<E?{^^|(!bnu#G(߀p Xs/~&;6L3ye%eA.ͩngvGfhAN):@H=3.>v}{gѸpd2 [|m3+#VKP7yI!?\P+`jG.ʸ}"6{.*_<'c`'w߰ %t `q+yyѻ9ؙ֘$3c5M ~5q-p֯?7; dՃ 8Ay+G{Ľx[zyδQG}FںѾB!gsk]- BQzlJ24vq'# m=X v"F_g>I>#H6??ܳ fsˢqKHM@8CȒMwg}ϟ~qciLF9Zp2gʘڨ];''aviV+*VUY4 :,g凌FH@2Nɜ9 5 ݜgi)nHW"ڶ#Nֲul?h5:ۏ7{x… jv oF@r~ f p=sbY¶t24||I=\lܹsb|Q;3nV-Z 7w N?M)5ک@KA]'_zwhN8>H:"]&sǪӧscD_Ǡvb5Eh@Ch6Bm~F؄ljrȖF:1[ㄅ) m!!K}T#+"h왴iTɗm &'~T +3+sDk1do04sЀt|cR21ړEvCʙ)0Am~}[-nadT9%̖ۗ3I9 !@о}|=^3ֵNXUDx7QCXH:#־D֏HȜ_4"H# RB}i %ۃ[1W6!UȩzBUҶ7UW_ ?D<Te7gwBjV !+ *IDDQ sȐ8p?v_"zq4a JiMb@KPWGUZZ!^5V 0(IF&1¢Ȩ`Jk.=CZ3|et*FKJgcH 8_:ޞ@i ?F_ h'$'4a\jx* 3ң;/O)6OsS0\(?ǚܚpj&`ܻ\g&/ʣogeOwi\O 4wI&ϯX{ Ǒ;uo0kMݽ#hI',v,+ivp\@cZBe)$MXh4xYx/䟋n«aXw}_'f'8 8%<_i!(c"Ӵة+͓ oW<6<`@y3#f'S&%YvqlۘC3:IDP@pX@XR/i(hE0%el~ @)AyZf{Fx7j`T7\O8+*p$ku-8P%YbB2q,OhJZ2}S!h<;J{? 4SAVx^(aF3ҵnyѮz=W9\8) ^XFI!U ך4iJT}/UJQ:?uݵ]c]%x#=ן}j\],"ߑڭGIaڶ:$m`d[u8;YB >=+II :Q!{u;w]ЖRhOK~G/m3G5JL]K%leuOu IINu.ˉ(Db[GV~pߩRaY(NH<~e޺6ΞMcSiѻv>%=qLˌH)_\{It6KV+iJc02F5hë a`c5*\@z?CcoE)XI&ߑc(ǮV&}Aȡׯg]}uq*/FYF"u>S$jstdTpV^u7J!`c)ZnӿhRz6 9q[[`f$ jrYJL;iԦM')A~9M#-ZU`a|o뿹x@oXǢ$eYep_YLI]4v^z=^AndLKZ}єd i CC[ 7 a CwDvXa`c0kzQmΞ9ŝH^C'/Iz+7(p#;VE㼱d@Ek6z;pQ`OHԝvHsw&% ~r&%ebJTic\-l !ƢwrK!84@!Uel3.W5X ࢉ"6 C 󣐌ucB&{IENDB`PNG  IHDRL>}sIDATx^՛ 0]iO' dEb|$>Z">E"DEhKm軬V2(ehcX2QJVd2ƲVR>'Nw+79U"^ wHPI[HIz F,^;@Uʎ!`mQWξ?PtNEAVLʊ i{ukJQü<ss2so%YK`V!h3]*ٙz30Zj9Zk4 /F@_u̾HS@U(u.Ի4<&Cog |? P:"ͬӣ܇ᐓ o+ T &Ex۸_:}Ȃ@M 6THav| s~{yP~.}te2  "MP|l)`5GA^JdzcۏwKio%` L="w桢y8t0ME0\#;./req"S\C,J/7"4rjJR!7}NqhP.:0:_ޏCP?:n[x?| GZalsgBpwx< +dqh?U`d]$^XfI៳N1?7ե`gyPO+ e5tT@-?!s'?$7e_=fAQfjuVm/+/](YG#ԖI !RէFwFI2xׯ?OjoHL P#Inض sH2urG#^{J`nfV;NBE~:ȊaNVGc 3+˰K PV_X^Y7*mP[t7 ̍V;L BcE.kq稟Q[J&˘d%̲>Ekvu@4] 3 Lt,qU2ii:{:zćl7J[nBiQ231?MA؈r')ff=Z가Me}y~ Fk`3 ZB`9b,eKu]q|f@]Y4Te Ҡ aspr^!'x 7̀f4Jau,e:*0Sc m'a^ /,u|LW;x")j0f"|UÎ`Eސ.`*%@|C"+K qzRL|/e#{G5w4V37LB=Bǁ!OHA2~<`[$+XCdU1p-y I WX\ZYYRQy#aÆa7|>ݿ3R4AkŶc2`uk/`0,X5.ʎJ)ZPڰby}(l'O٬ `B*],tCYn44U6+$T,@ =\L3'w|r=pw 5XdL, K\y[늡Rr}+kn_u=D_k+_ _J|1 k#rN XQ!{Xh26Tb\e`acV6)ʼnG!E6p/ (jLٱA5=MmRN=)͉("a&| fgXR xsV%)LU;dyi2HXFweY/W\^_W;i`[XPnGQ%MBa^%n[@Vk+.gUe !Ue2S`7~]p1*<]R PP".8X/!?]l*cMsce1t52-E. ~^tl&_,Yg4[Z}-e_d6SRE%jW5Vlf$sytGt#vaMVz4aw=i˭*0Wg`jj >} 334覓 خTQ-<`1 upܤK~ZYRo:^>BuҦյ j9n gX0g $~Bq%D񊧲HmR0BfM).v7:_q\z0-0[r $p멓f9h-MG080qNcxd-/pXpn.JCz)6޻_ޏގ6v&ZWUfP: &1y`Myy*ZZzPo3Yɽ{7 @c#S2 @c3#΅9<`4!VR;TJ9,E0?c3|ފ2@Vى yq IHq🣂ϻ| ݭ0PPdoؾw5*4 }`0 ]E]- -*U jGB>ݎ֖FEj_ _/6QQi Әc2LwLfx LcP_]i1P^Z`#3>aZJ5a: <\Y31[6H!+vP ߎ\qeUQVYZ$ԕ!B sT:,1aU&3SXބ.)&&&X ; EIP}ܧ"YMqO'L%o)[Lx&wL(^#.~t@Y?UIL߬nhl_uP5hm  ^wg;FCvJ4t Q|jCͷ-Ƞ[7g+`>7lx=: vؘ@[H CPEA`,aODX$)"0)*pȺTœPg4`# TPLaH$>5k&e:ZX4TWBv22x<>^Sl}䶽nu0[,ERQOa4_ɧϻWkY#>վj{5PZ uR(Ȋ ёaLd lAkDHC}LINȩzrImV,N$e&&9x8x Š{"pS 7*nY /d@+;*U*IAki_sU Mqv -b0b٥Z=Q9lmh&cmCe&rdLz:da4E%[g.^ dWi c- 'K`L`mDtݰH~%|Ɇ(ϏfqWS[rp225o|7\RSX!剣"rŠnJ Y"(M?qn#3u Pܣz*D'%:dypɭxȦ#([FY.P6ޢ)|\l/1s.(ۗM eH,vz-ƎMn%EFwn?Ae*?P⭜(-w|eMq,/HuAO.;T:>2L  W6п`6h}["0atl/tuF-;\aU:f=M~nY.[9æ'7.n}]] %IkLcg&&#ץ̀R &(Oo^NHaʌIjٌ{"*X?>au։nI`gwwq1wP_al݈n;<|- =7ՂwnWҰug};A"ق꾟9+Q2Ux6FR'xPfDžNoj<^‡ao,Ɏߓ Ȓ 1Y)*#c7lT/ң5?FY)m8;42I`tQID{T)k/05ޛB3u!A:E3bt & jm89,(k줠q`s3+wOqgEOUA徦fJw˅Oj, $؝YsL)8{m\]PaPV?;̅-F՛BR $B1Av҆RAl#B Qe8'1Wʟ#+¦OB%jYΐ4Nd 2 <޷fWǭ l}Q)Նi]Lq݇%X J쵂nK3458%Qɰ-F2\P=\vܽ\Hh; i>1Nf ~wԞQ+$ %xmD q=h}A`.7ADvSAQf ªW:enG: n7ٳBd gl,!> M2qH)e8E:܍p_p}A@5CHЦš u5C\0UN%@`1WK`@D ! 0u0^ptXphEg̭#%Tr) }!hM$s)UJMւ5ڂ. Ӆ5:U q :l|F/T9jvXt7B`.'pߖˠ6.Me=)uH Lru6WNIp^}MIDATx| 0 "Л ؎tjD'IM~ʸGqp4TXPA:zZ jΔĬP%X5 gcrO:Y9)X<=,3 OدbPiAQD#wR;Mk<S}\+bqr10nZmz~g"=+ʄ6>Wj?S(W-uv,YLل 8Opj e!?z:ڋS~g* RʏKsSV*.K2(e` H /R1`1w\(zҨś{QxyrկBhng0sR7҇"L)l qbcY\~0\Mr? KNOtꧪۙJnr?\݆W_,<8 5hʜ}Iؓ셝i^/u>'!}Bz5-7M.`)WPMBY,YR EuI^YxW+xv|-GNώ7QkhL@qj&`w#oE$/qL3#}J ~wy&$=c{`)5yρɋxzs2pm~j!Qhycw,cqalC݋HK=6] )S%$;28|Otse;<\!zs0o`XE:ETK<[#KELÞ8gwEx|c\)#'kEz.RQ6פ:{lTXR|YaSkߞ } xyF˅\D0\*#\e%B'b#경д=-Kpj%xyV⛖"]({OD6Ch4_hwOΗDỦ:P||sW02<3)sFcG=nĩ@\Ճ+p~5aX5n:;"tZԲ{1o@)`ͺ-QOOe{p2GV\7Bh0k5\+qn5n^-bP?xo^]wjN\>yn5rV`jjRЧlx2LR]c'D^*u^lHp8Y~V1E*7RA(\ٿV18zch߷7UOizvJȤSJͿd\@?0c)Hn~/|j7NেzM[ԈP:P1L%AâbP~|qmJ㻣2+g#NM2RM÷ v r;#/i}/YQD%"(5$kr*gGu;փӘ/ zHJО܁'SPjdabl/qHmNdXr?:jGL. ŽS.l!i>`ݬQX5c(npùQjnYK65(k[[ `qW z*|{u+^M3Ĝa=a];}|̮YPEZp`6uW(T&y`BKTqƙdjR[9k\ƅu&9$׮WO~*<w5OfcuMg qMe`Fau; m 85c] q #ƙ(AX4xEyw:Cԧ}h:} EQfለ2ź}5OGq;+? FMm1ih$+jɽMԬγ'Wym. úUdnjϑI=3x<ɡ_!"<\ʠZu&q`h‡!“ dh_?=ԓmu (Ç~(<njsY{ ن)aj'B`['rpL勓xCf|9D*ֺBe,; .$5Hl6wN2-aH"oor(ΩdVT\U۠ƫcGKa7ޗA*'|VS'6ǫ5([j UUߘTJCSm CRƅ!+hQfڙ!nxF!xr 3=* igC]FO,ۆKEqd ѨZfXU_GOApK_Kj2,{M @2 L۷'!w*_bg UG2w&Ksu>v~8TWVF',w1_07c>8OA IRN$Q3$C`]j0fgڛU HKQƵ*kIUPK>V"0vFatϘ.z`{'P*&#Ai[G7r(0r8'׷bWę}Pȥ(_;N2UH0&Y( ;(@æ845+Xb9Nm uFKƺD \^?=7)A׀mJ [zN mYG$ݰocQ3;4y7I5w'L,썝"h$a y Bvl6ݪ+4(45e}fQ! *;_FT38=j耳hǺhe:@Giwq*,EJ5jmԡuGuW: e*2qputO6bM1iz`HWe`nWX vVkQg pOm=T`^!qܦdFm=4pSQ`8ވC^sFJWȣ]_CqK92#ТtDA>(#qj `4\\N! ky$./3VǾk=(yg4]ɠY g=VgYS?n`(HHc\=u$ĩ!ʶ§FM/62+вo)Vsb[H۠!eub*RufZYusnr:^@цfs&귆(S2Ib+8-(AHrQ{eZ|'!־ ZH2)~cj/hcKR< ߶L Xa W:"*!k ~$i"GWK*ëIr6OY&B)X|,-Ƶb$+=#c-mg zb89GmvѕR<2}ee r7|flU7x樨n庱IL |pDDze#vndR `զon~i$פyEQH=/+{"ˊ5.Y"E蘷y&X8J4[aDWPC!xzRU 2E)zT{xQڙTxDPy>Qf>11Lt6"-G{ҟF&\ź :qR4" f*NoZ3F'.E)Jjt)ERvXſ.1ڢ "2%`#)_iR/aGIN-'7_I3yH,qLB‰b_\\̛;'6sAn.C-D w1jdh$R]T4IHv~aYԬrX؟B8Y8^ {byMs|PPh;QD @uӔڗ*9l>*I2f`ZQ QRj]ſAmHnN_U.@n50k4]y7S Ԕ|5։M`0(ǝ`uZ(7tl"4H202`Ki*^ $ yދ7?E[c^{!{ċh4Li[OCHQEaZpRR'e1+"0s0gJ4fe s:7Ў-JW ; T$o/G`7:56Ν,OV8Y(]TT&:'VUZ-Yj +Z4%`]tV;`G;1fe `24˓ioT"E\8grˎ3ѐ@Yj$lx)ڢ)'̎pNc*_M2^)٢an:go*kܩ,EF .GXXn}$ߣV`GC`-J&drMIH_9Ԟ4}k_WS8[ѓ@7h B?;n*wcrÒU;f$Uvq3%`[>J:Q0,ȅa#MD4~ՉS1)$'gʲ8 :v(7'P}-ʁ :X?҃K=k ^K!hS"ˮ;f9BN;0mz;(80{%gc&ci(jɖسsXҼiw.DJBєGNhxWGj3f3kWJM<֌@HԿ rDi/y^թQLO1q;l\:@Gm#t%+F*.݅":h .Usp27p&g!JC'b TQ:Y``; t<ԆOE/WRYhuϝF8ʶkX`b#oͬȖZʄv`6K5:R}$jD/ƆIMCM MAqh2eNS}%( *"iHg,7'Wzxxdr6^H7P [$L9΄ ,+XL~,?0LN2tLRHYjw~*5"MFO7JDV$Rgj YA\=H]:#IwGsZ*TћW1*˵ h,EJCb}%'cW*=`[EtRCP%iɁi5$/Dԧ18JC4D K'a팡:EL5h.fp% xLu|cޭf-ʨ&;H51`24GJ=:G"XMr5 0tH!0LNќ0u[Ҵ0I_)s/iUr&Y>8E5t~ O INعcɌ"&3l%aKnECji]'}]kɛoeP73"uۏijCra;ݨ޽Q AcLreJb̑=u9B/~LGu8nDMs~(G>p~3L&`z`i w;3_Mti0v$5[:)/UkȊPJv|\\UǓ@չH~@W=Wi3b9Mu;0T8DXyc.7\PfZ bOr)}vIDATx\wp]ՙ^+ْ\ `c0&l`%3K @ 0T/eX)c+a ["[}}wa{:464>;phkghZv8_`zu%hêśj*.+_Yƞ[Xl12nŒDf2hi0FX;!?uO@_}k_멶כzb+`E2⫝ 5˷T޿֚]PdLMK'd21HfM QXCn7C|MHB y\46i?OevԑLۮC>GF9EeT^pseI~~gp?BhD8w0CJ6 %_}16ʱc=槞z*!bcՍq-6::l׻y˿a|̙v)6΢ hڞR"qF~G4Wz衇_~KJ/[[-PIY e7K)]|u†D*"H[{9xP8tVy=FoN%rjF&嗔הڃHx&i䒬(ͅ^z%Z`2OsOV Ś<i'luP^AiECEجWQq]m[i]wE/FKᄤAfaD"xLYY܋`QICZz [J\Tq۶m9#8!'9-Av{\i245WyR*z{*HU vjNgh6Fs3%,oZ9.K63VԦe.FyI$KTu(ixJ&&&v ,壘17#n1=bb8ȡM6.9ϵ&Y$Ʉ-d9lo %p566dG*7۹s'rCR V%3gНw ;R)䳶;Bz ^|XFr {w94Hex^\6T⪢֎2#}MH]0aF1X8!PQsG!QQ` ̰&/t? )6Uܜ<ҚJ,$CÖWʌ0#+8`(@zaZ9}4$ (mGEN@lmgtUWRiiYET*H<)Z)X hJK 8ʊ@0z8kH:,GN8M~t饗… I_gՑCEM2h sϣ: RC.cBQ CZ9 ~OT0بJqJNp@ڶ5ׅqGNt0ô3{EjmY#Gx`ōdbPj7  t#(ktZ py=J0 -!0 ivV] u@Q@iU.4h?dt￯ .r& k?F?'N@9[ d7q'TqՃhC.;[Ȍy2c4v s}`A沯΂WMuSJJ$+V!''-K)͵Ӄ6zvzM*%R& MMMtI+=.[޸K ^vb?ڈC=~7Ӂ6G%htϗ߾~睞P* JKK2Vv 2ABI1ٵk=z: hupwqY>S :(=d 7Lo6qػ!E׆(=qy\]`N4[T[xQc0He2HoбcpB{q҇"hgq%TtB֨d8HcxΆ%v?P *FGFn^cO\`0Hlc `zo#}Owre\[Bm̰TZa?`T0ʣcEd#_!Лouo=;WK?Kw|l 8]YTYGMR.֭[QCS &J h_R,H \praɴ)?^QGQEmК(`z)C~44>{̳ot`AZ oGlP58p*ڂ!& av!ZRU{# L;jo1I mB^~5}||0Yg K"CׯĀŨKx7^ |kx1W-u>}`NjfzV^[{Wv]RTYO " '?Q+9s!۷oAmϬ#VVLVށݴopuBgTGa甮_Ć1[u%g_uk]ʆ܂R2lG*Vwss3dn㏵L3H\Ьs0 x=4쥮>izPK_ 42#U.K2=X6WM?ۗZSY -#xN'R/I@`a *OdYdži|{y=Dfr*:H?`AC4 xap۶leZtky ̺v=Q[WXPgB2R>/MOѸNw7^pTI!-X0MIiKa2SrSW/_tuoIM d2- Pic*9W*ٔA>|^Ms-Ϝw"јKI XZ^a6QQrn4y(vڕVfQjF832F2X"Aޮn~MsɻwG[E"Kk΃`%yn:l.?^xy}ՒYdg>bsh :y9: \nPo_`OWpGsGaf>1(x_OopԱ>~vO/б)#`iӁ&ۍ=`r~ c??%cSY=P8!a~A79@4>PSk@FkIENDB`PNG  IHDRL>}IDATxy$u￱/YUYKwUMӠH *pXt zDDQtv|(Ιyp` 4m7M/U]KRgd'Nvgռ9";3>qߍ_rabO%R !Emyl*e *@E\Nߋ O|U8 m{Cc>lˇ+9c{l,&YՊMd>48C$b'.s?Uo}4$ -KANuV6f=7e@ aEBuVXsPI!`h 3P$ "6>5 1 jQFM5[.L3tTwBƥA)ǟ)b.+g10 ZY{xb}cW:Niu€CJ FM$;F. 61/; 6M5q8o23Q <$f |B܍,G> yyIe&0@c#}6 v ֳn!X KCڶaye[ϸO@> *2&A$ ($Ldٹ^-M ~t@Dp%t jhFNrznsǃ/D:BP!`$yVd|@/? dBO@U%(uiKw?8``I~x֯)y؟C65NB#P]!I; Rfnjy)y"/g!pHUD}~1T*-EwbvIxip_wIHG\C`\q~d^r-YIˣ92&u\z3;P\0F0 ʇ^a7k(Mpꉩy]l(L=%#Xo]doqKF(,6x6B߂5;̎GTAkW. j:"J&4]ł B ^1:cf; ؍yم{^xm?/}FF ݷA ^wַ,i(~+=:"$}<J B j(@eruQc;86UwfpO3xӢkd5 [N2_}S05^ű?gMpRF{N/$οz8e7^-˲ L7"x'G''*hZ% -_F^0\Vv6=qzsC4C&WsLFDZIpZ\o^fO*EsSO~ֻ@ @+Nhi}$a?:=9fV0<]AFzE-0""Д/JTJ`<^|7ȇT4"m`Bp ޽59 5r." :dUT,3xdEx9ɉ2atv5J2,;gڧ7}ḬPeu}ҳe(y, I9Dx.Ic!ନTzl_=@ uJ`ukŅcy= nݰ^`2dǃDS+"$PhWЦ6i!)|6F|VisLY>j.-"h_?Yfd$hI3@ɫy08P[4QA93VH{""J(PzţO TZRm{Y!O^U#"Є $Os&gwOG'XAyڲ,=LD-_|zXVpLz$>m\;%慙e 8GuQ|F(m^?ԏ`I@Yp a_q;<Tlz|ƪah+isɑcr8e;HJ& <uKVKwj۰qOv+ˢ,Ʒm^6-8MS ,y9NRQ<ۅ8 P8* $Cћ}G!aeo&AeAlvqz^)Df-޻5_<mHF\J F3c __ "LvZ-ZٕȯC SGx~ DRN=#DM9b0)WEsY.I]oPm>kDx۱_ow٩",nMk:rE+̣, ,zO1pRVL2uB99踉H07>b& o=\spHVe ,a e卄ws['}?|S`!{^r>Acв 9MBEp\Y X,^Mh}Y6 ^݅pam85 $]@!$znEkWOR+_ ?9,Xc`&?:[-\A.UW |!XSMěK*AAGw,TBqD.w BVWa_#+{pK.cLn.n=G'אjsŖedjF30cTSG(ƃyvh0u ",dZ>5@9~@Ai_wrO/%r+=3Y8 *P6( 0^s[>g~t\k!y{~x놥7g^>z݂ta~HH \j/gFfB{ U',k{]a@T" `$X#VeޫH\  1pPb]g<;AX.JuV[Ӌ% _lGe0_*{$ .&yglTF*b&`쀼 `#A* byAG hV@7PE@7>6ׄe8|ձ `BN_W(v G[ >Nh+ؽg{^iuDw; h 1$ %sUhljT3pJE^ceDw t [w|hHCF֬_s'9jTx8&'KZ ٺE05@ˢXq{',rxZɄI!Y&ED>"*M7$t-WܷyͭJ:i2ȢCTjh(͔5kl>!rCMpb ə`#ٰ(s9OFMp>0{RJ?,]w|qNj~YDjݡl!}YȊN-g砊45#A0 iǓК7 ffZ8yW_Z\T,*ڠ"+As&w\O`YgFP`TN|-Wo۸O2LSCxHu|ς8FJU+r$x^ > *L7AȮ_څ.3(<*%ǎwZNNkAEh% &O S5Nkf'K  ob"fm=0OR%\i,Y~5w:ӣtM³[.|ߧ./̛e4$"~+Ҫ g :֯nf).jy5 -Bu&OdMya+M̏~o/b/GvU[?mHϦ\V·T2=&vc5mDҳ*efXQmxZ I"-IPt5}039&"?>S>yOK3I=aZ@۰˪kQG-.^S2Eab'rn/!ЖQZ0N)Sbhm[7zڡ#溁VZ̳ R"^$sR1 1Ӌk*{}csN:+/9R m{޼rÊeu"0ai6 4=C 4YOexށxļe`*mnX_9 C9 hՕSe_,P ֈl`9"1`4 +Qlu4҂]Ⱥ&WHrIENDB`PNG  IHDRL>}#IDATx^ ]y眻wu[4Z[lBBBl6 Y0OPN P3c#pSc `){bfQ ^bhi{.[ҭFݜWZ (G =rMt [9hεt_՞bpXXQNdI[|$DfSjχ7?E K7`wǗ-]Ӏ.rR%g$4)ڜA2Xl29{MZe{ xM*&N*dmfl~4π$zq[~G6%qq() kOz`ɖUd x=kr@ XB=q@pJ-ĵ)ܶnЎf󩝛_B,;5J6=2=)iG(7ݎM Ă=|)![.hr'2iqXjYtp4Ne_?pp[IX6YKfs֯l[r4 ^ ~י*HD UfpU@>Jquh^ ׻@$b%P.SXL@R{{Ilv i}MJV_2ܖ$$x56ksiyVA.(GSlQPk"3N7x(ۨ{ "f Kqq\uQ;"`k Y g)z^cSI%ؗՉG<,<63p* T0vsR$S\O7n斶c %Dlf4G{8[n9[}ꘞ.Z#㙝RXnAg06Ҽ]F}hh28F?y7TJǚ΋PN&l?hC56XӤ-n[—ZQZ@,->σPٱhjt@[lm JگLf5 Gc*^NH86JŒ)>c'vaIN/ <% d!.N9M"rhS(`}g4|ɄSZ@&й<((A+(tK3i}b SYuzѸ9ܮ̰ mivRycG; 0.s)0~^ P4%fQ̋, ~w#x]m J<>ƦC ţYl.J S"(zN4C{5(WRxK -[‰Dʀ,!4 0NHfLtvlMs9˜6Z7XhS=Uwn$&bkͦ8\pO/|ei8*2?"C ,/5W vB6ATfh{[ ./?{Ԍr]" ݑ%ھͪ,)/Ta)aGFkG$z[aooタO|l30h,op} E. G4[2! h5leoT^җ EHlY$qFF18{ !AGQglmeyIUrSb `Ø`F>ze(CV_x.Sw굸b)Xo=F:0F7gB l* .#MA$&& _Ą@! `.i8QXɣ'^9;?pKEjb<>V VЎ P@a OgMio%A\אPup]hځ#=c]hF1Z+`r^hL~@A`=!L)aq Ğ`F\ Ac(}LwKe$U$P8ӔTeGTEqɸ}S?_ZUcQZa<3R$2mʷ[fX*+肇jnkYllQF}"H'D8Lgmrh]TaD3{{):h$(#z{$nWBiHd94f%Uki<#\mi @p v&6cƤ&m#U$qxqN h0(.7+17?ɝT;( 8mE k"ASqAsXrv%$ذ(ja n#VоIԤsN.+Ԇq7oaaJZJj]v||7UbV+O3ӞKjH?mˢwݹ}|㡷XR=} U]YL~q{+CR% SS;<|Oq9w27\ن>[[VBFGm QDs?ǯE|J$9m,clRMj(~gr=3pJ](wwmy>40 eSMo:}d=姗`d D5D6!nV*(izwP.uS`ci_|;웯<%eQ~Sg\oyhwPa# Q5$ 'l=3iWٮs+n>{.B9}z4Mͨ"~d]Eo(# Sw٥#R;^G'$"I ((&oT:Q Lz*JPN;ZA\"d)T4[pDKќ|7v=t]ii2T{)D+p}/xN~ Y &pK(o !- - vxc+NJYw۶/ÛM>T?پ>[ޅbQ([@0FH,q=BbDҔ8D514 4%[?;Fo>c#/V}gSr Ƨ3 ;u=v|g !X+Lfzo|g4Z y@BX{\=TBҤAzhiJXFă?´VrΧNw.O$7VT`iX< v4RDC"˥}IDATx U{C IXCGEePݣQ@gqp\DO!a B @Btt}yW˽SzpOq39ܪzUU[Ց88vS_x~AIXP88jع:TMmYHwt ގG160. COG~;2R\AVTH,vȪ2q޵a.F4#AI5&=V&@?j2$_2@eh "H y7C{H!93`fe 2;l;-{3g1_\hE;vn Lx$tt6H228ǑI [{?-suW;!5La͏[Z$*Ϭ[ҹ%1%lvd3{G j7GUjP`#Eܴ !lr/ >QC=v7P:c~]7}GUB~Q+ZWBR$0?kwl$s=)o]]$[;X * 'F<;pla(IwCC q-[meV5<*NUXxɅ(LcdKwZxp Naw=n-[`B7 [𵏬gIg.o\ V(F΅Ye8,*y+??ShW{@HF֪`z| /=Ua/E=-.f<vBC9x~'k6AI\ x ~{N\lj-X^4 +o5PГ͈7#ZG8GcC#8̂gGG1knE4&eDiz.Wh;\8V]w-_vmw"԰}$0OAqbO\ȍzxl1Jx Ǒ+D '.ʐԘLbʪ 3|  IFֱargu%L`3 ɝk.@ˊw Z5_UFc^rߵ@o?ɞ f ?vwBEڛAQ*%hUC5V )J!38zW*RM.dԵ#zPt,@$^z:vtg-] @ݻl̠Ȥ ,af[îPB$ 2f0RKa$PC,DۻBԓmkF~zQ+/aKg(M:F03jBf:5K>ߏKSH{ Xd|2,Qjp:߃Wm8 PtEJ*nENtv98募Eφ>m%<+eAJqqM׃%N"x,Y/oOine_hkm8jh󒹪G1!v$V Q8 3WDko9c"`6dYCG/])&dU"J\x?*,ޘBQpcuhyҙ݉0buTx]mVÈ%AቌN:-H$Y% vh(D+.Q[@)3C2sRN @.\%R!'xb;.n\Z$?Ye"fx M (j)@hͿ0VvE013|2JBAKϾp _~OtaCc- hZX#4E 8Xf P ȑfA셲;?߈;s"M0)Bo}Oݽr݇w-{Bjc6ꭌ>02?$]d!f"?z;Ϯ׽߸i2dz.&KX2Pk`? +o.x^|$#X[ .[#oW럸 3V>M@0gLh[{CVs$"BUgT:PBLÄo湍N\E9 l2d(,1|(`s@ MRaZT(ZVP*Go~#^Yŭe0AG bDip攦`v%Z41Ȫ!.rO}6#nPk(亅. {y]xtV%%>g Q+Uѝ`6d+% 7 Vvs$OͽHD3QXq*-~^~9Ca|K?{7LݬƒӛCm9Zи@W,JUS4y*~Ȋ+[ fUh~*`W6OCԳf*0͔]O΁qa"‚$!Hp7nVhnٍ%?5xv)҂tJz=Eï% 遝[VF탡TPNn}޲C7L z)p3-=l|=4U5 a1ݴ'ޅ5*xWITa!czX(UF2쇓&r <WNN%Gp*TFwaOu*6Ԃ{N/ JY&PɎ<V@dXc;]X4dF M0"avo_xZ%/queD,bh%O<vpp,J3<{vafv5$]X (5#+ @QdMjHV/Ú](H4ǁa8I,Zeg{3hvUYUx،Юʘ0p8( |Y*oj! $]&FC+zgI޾B˲aaf$37#!Հ6DP1CreRq&(WybR[^8p;H"X} z@,]P].^dH slmB!tM1"NHFM"XJHuk {,?U*iihm8P"dWQV꽃+x,D/۸m絵&Z$۶EB4Ĥ[ yĔ:VdsIJl>22$ETd0y\]%'6Ӑd5 ng]6ëpq꣎EfxSSG\|h=kKG$E$s=]mh\ЎxK@8c&d*ԨF"5 Xᴬۣ $b-6&"ڒB}g  C51 ]\\EijXodrfe&_g q[h^J0گ/UB\H l UI iH2'9鶠&Ă ew(Roo2V^V-[na ] ,ޘ$Y=x/Ǘ "* 0 qUT6$ h[ )Q0岗  izHܚ8 zR@orB<f8vؓG-i]+m&F}o'`sH3OQϩD4?>+%I i]naB !.Γд4q4+mgY3$0GFv獷z@>c!Y!Hϱm0UK;~;uYB!%$skP&A!'O; prp*Yw$- iئ [E8]`f0 rNӗn{8; '<(se>LU_K%$O|%kמ&uLC> Jb$U_!uCMXi4?*; XG=}]?c6NWay` 4AzUee!CC?5$Z}m=޿GP$T]q`4œGaE/^ky|HҎRE𞁜9߼}m#Ix L$o* !W$\ ~%EPŏ%3_\ghTA,/ɮ5^1hwѩNIENDB`PNG  IHDRL>}IDATx^͛TTW&j,&b-(JZV@ * Q" -XaD,&~&}os8ޜu }ϵ~ ܙ>Q0{`{X?yjeKj% vɢ#OȧNbuD>atص:LtBmcLdBbEZAZ1pm"ߟ{amD|$^ tG@zp߻w!"9xٶ"xZZ2PJ"/ h$u!HoDsx%>I!gyfEYX(ޛ<QGz1ݘD8T:ȞGg$6=W*W¡p"w- bB-qp*Κ {Sasdٯ?؃ ȋ[%崃v #HGXTCLdȪH ~xϤVD)ؙ^6xΌ{'2խ7+׸{˙ ŋmFם6^RB1!LzՅ1 cJ+ThGmy;^ ooo>.m^B%;s9_+N, $)Wa^Kfc4`̻K[“keUռ0PW lxv%Jp|l<Ɂ݉3=tSmR#)F@^DtuHJ* W %D*͍rC sq}R JxfiqgCm4-+Da 9n𸮀h7onn S*X+p$ZCGh( xamt+&i!s©ZoWI,rT)XAKhbIgukvgAlH Gam|&NQ >a̋"KT`J̚jQ^5A8_PX9c!l)>Ro!Fz(&݈ja(BMLݕ0MP6 $0rh#Q!q8(_5 R_a)!- E:0':M"2#dϿW%H/1$'F yquS`Ѹb<-a`X hf#uH"մ CA<3zpԁx/LpP̋H>σwvȈI#HsFKO~ HZ S3+cPvrfңܦ|sh#LlkP Q`؆Gzn_R IbWD1 oxOFO)Q =;,c^(W OH{ݴ#ie+EacV!v5E0f <=}a:DVjTeGClxЁSq:^[ xBz}1ί[9в \Iˁo>LCi3QZJ=1J/|Vu$.PFE>:Np$|B }z8\23E(Oe`?D+DWb,=-ʚ=ղhP"Gm=4A_O AG[ &PiOnS`d`M1[llC~`magr0kܗp0c]yס00(M{t0bJFFM{~5څTTXN=#*Ga{rx'?ÓWAGżυW60yRSRykkk<aDl ;⏵܆i,T ְwցt3,Q-Ro! )2" { AIE֜'''x  3c\Ţd.RIyw{+') [M!_}mm,!%kQPWGp!(M Pk^ :hT,OGDV  3-_xM)>@a fff?Sأe񼼶~R0>}֮]KT%аe&\AafE9 `0||,= ʄuun q?.l ㅑz$Hsy}}4 ަ۝ Ÿ |9#e('])ߟL1ell HSr jv-g5٢7xң°!CѲOY ps4&oSj#p8 ; # >j QLM #Qri[y9ҚJ%.c#CzNEpl<8 {%(, 0^8,AbfYHN`h!kolk1BhF9ɬP_r"Tzgwa:أ0W+Ml1a|Bq0iH@½iΙ:WJf` ןÿ_=zŧFB'LcZZZH6  Qu9Je=˅_~v4l {W?&3a.e LD.,g C-m# ¦ۚB*?\7+,!޳N)JM[ţ58::ABP\.ooossstKV&xJt@%Wv!t7*x@ȤDK(]Z0SD (ƏFl 4a&Ö^PJtAڋr4qBY۔$q_CZ{<QFё6k <8HR@\v(0R Fua9Mt}{4o+ Neʡ`3 ҡi0AB(i ѯWYK]F%&O8+msZ&0iqakji\*}| uLBQ2TSf|~Đwþ`}9bh IKadd'0\^k۲wџr(Q0%LhqPLJc\p+.1&$!f.c~76쏌r:-ҡ\hqS¡49\.pEV9$SCA N&XG(KpeTōAkT+R,{b[/Y2C]@ GJaN>EEtw"2"}s5 hᄩ qw8ŇJk+K[ًT'{a4N&FGHeCQCJXꬖ018~y>qϦMu2?].Wϵ*M!ؙMa9Q0alڵAtC<XoPA< *S㖣җ8{Y:J(BQ)1>>ܟ6VilSoF [?3.; ϛ*pcJ#lY_ּ+\X Ks`O&L}nv K!x_rC:nr,^d0i,EJ4^$LOata3BQv}ɰaUH sQ@axMm-}3Y6Ƌ$(42eGR2U\5fF|q VC]+~c, /i i;ea<eƠsL&NHqjH I7]AYL5|( y<ּ.QSrʬ2beWDTjZ.+PT^KǚL86B [O> bo;axѴ֧u9ZB]wc[͉S.b6- c%W/s؆=+pj%+;{a%P'9ԥ*^ctbI 慉I=:+ tw*wH5U `[ 5G5ѴT)bE0Gض%M~ 7'ud5/L e(%N6RCijΙat" D}q*k5:Vϗ!Z9#~%OtrېOKQjƋPIQ#9a4X&=M) a i&Š唢WZ*&g0&ÚLeLh2?.'v*R!rʈ8Un"LhgcNIENDB`PNG  IHDRL>}IDATx^wl}K.%R\uw%RWW'^W<nq\e )5l8SL*0 (:Ѱ OjjjF%ʓΚ=r@8(ϝ˙ZnJ4H$"XDڛK(2Ãq9?&É~%X{vSjHXEGvS Uu+X-`N9+Dmvt˹a%Q1jPw7@W^TǰF(?W{Ӳ_`;<a_l"YEPmnCX*`ԙA7zIGdu 9L\ZqA1t)۵NH`]u*P%EhpEX}-h%\]Kl8R$.0ҡcҠ_}2@`̼}Pvqv|5|KĹ@rO.]&:,?W2˓#BT^"Tc4^Sk?B6jYYYԕ4wm.S!yFPUZ9n+\Eٝ`+[ tA^LƼ)@֗RIÐ|r^8Y/hpJ75tHBBpgTQcZ ;_4n(>ION$=re.a1w<gX֭{Bt@̆0Jh̄LNiّFEÜ*hAs-И0u Zၘ[^dυN߀,00BgSCm<$-NVd Kc g᮹񵰨/UVi0f=zq:b4XG4)'CNfny<0B2a`B$rD|Mo?Lca`FUk~nKXC\(ZEl;˴LP B3f|u;Yv1!g![^=Dkl-0Nh]QQY|,ɽWlQUBRg߼*,7Yte eФ.{Hp8ϰI9zM00"OoAk{ʐ'oѐ<8,2 ¸EhKuCrAk2SB1GL{o+w' i+'&+Κ]v9Qe!мo603&%;eX;jAyZfaYBHl һo? _XtvCXG`T"J_XDbcؼ#tŃuve>Jph-F0Ӭrtrcsq|_+ ک[Z]^({V&P]JHY} ihqme,]_ukXfuDHZ#̆쭯~I^j$K3n.5ruyhL;qd0̡?]h04۹Ф0~5ITKB4D&w@., vIw]Ex`tMkME|nꪼ""/X-'6^]4z%̛CqcU֝6] `rxŽr  s$Aiq=TX:Vnl I!0w`TМ R&k@H`{R.0RZ.Xa\ Ur.'TܙL.}Hp*pk8(49>}&oXTBZ+\Da<=Znc>8D~v 0@U3_pY/]vf!,Y؄e怙WW|a$ZUI; (#6Su ,@cHm 8k#W:&,&rQ'֞,Svh"c hxy va}e6t:$=J.C비aVm:Q-R=8* f`r&Մw8fNhGTH+_Rp:b.Kx&JPs0RciXֽWlak",`EOeeW `B-P:`cݖ2F "Str Ο- ,-V J9eIGXHpFb'$+dX-!i% ݏ- E>.>![k@! 8[|{5 b0TDg~0: QE!i`KQ+&[p{t&P!#5MӥBUr]tR]ɟx`4ޱw']DžbgpH(=NFwa"UX|Ż 2L20] ta\[im^XTydPVP@G%xwZRH wɄ5e. %z~Oz`[,o0e-`{cq'/a ֫Y PXGda$*G-*9\k6Zgū9M,5`IuL-Žeoz:f&i0H!9>HQ2 8վTB0Aa`K`OpjW$,ng^>ppFx[smsX;*X X7̆V݃v)%Bo3HdFX Vl;341g gS>̐yGdFPqFg5u Dm'¥O4t:6Ṽ 0~m#EhT|%#־ZZf@`hi -iqa٥/ XzڪEjAep@m`&UPjmŅ_{iN!k`` 4 %}P~v&asͨV1",z!:0oM2e|wD)--!? + N$L<5|OeJGp +hv~+43,TfN t503\VE>C:LivܹO>]#{u]Cu;~*|5`-2z]\uNmY泐6Mܧ֬] k CLФ9iWuAQ%k;x lLfUպ]R7A S8X IENDB`PNG  IHDRL>}4IDATx^iuoz$!HDL61`Ekc $q})csc. [bCdIZZݭꪮ᫪o8Zߪnljzj}|?%RVݽ y}Vb|g\d/Aj4k%/?NҌs9SJYxMy}EqE)W, D']St=9mH2K@d*oxɝ~tk?] _< X)_7}%W>l|6T(2M:͵B hh ~pe`:6eI;8?4kog{^>%{V/-Zbڊ jTV Ae (.H%0u$-TNvy_u8QG>U\[P-BJ wll `^Xi9"@;w>nå˚Id '!ΒF2s^el9l@CJ @5`e9@ML%d< uO=v垎}韾zŊ_6'zrVwZy:NnWȏu 0KK6B%`p>Go|acOWQoY\sTJFQbI&E8C4Pq jUD#sEՈ /Y:򌼍@[Bҋ}#WU$Pr (ۈ8Nv"'[E *|߾tTQt4!} MZ5jH haYI1v61l+k;5DmTUKUEdJ.AJLX ( |M.(("d'*k@o@ Sي51lWyPMS@ X>O[oSB'9}6q~{9ַPC0I@*/8[iF#qb jJb(a20Z${# D1G %̢Dkjې l´pCXs?0& U_xk;#N>nbhGʹ3I"¤S;b[y9WA9BCe`-(^ikt=އnTU@ͽpaez$`2)=O,  i254#h*L.WR)h]5$ 2C}(6XWף4!ED-`gX<@Ϳ <` !HV(ˢ,=w<4UPx-[v3oj( YI2 @a,cz6قB%ogOA4Ҧ4 G[pHz a1y I$u9O\~y/?n~PHKPH9uS8i1#@Lusu:TIV( /l|I'prHa L__ŭϭ!C** Ե` }1|p0VUT"+aSp$BEE%b; 帣&Nl'5 XV1̡cCOiecr,O[ŗ Ǝ D iTF]Df"G0$sN2±rP at=PT\h"ɜK4-chFS%6Tv@ 6"K؇11B1)f3<3yw?+z~h.0 /}6܆5 qe~1=OjeML95ea`EMDRWS388J(cʋ8HmZt景!;BFAPBO"dP/1pLv.YLage.]]vn{Xͷ\:p9׹Ώ?c#%DYRV$Ѹv7c6ibtTĨ'7v!uMO1Oma'a$F0 XF4X´1iˍT~XlyQk@vҵWoXH(P;W2'+21ʑJ4^JOP2i5qު%!ԑXR;j"rC 8sVA{襁ol ߈G"/d(?\Uϫqs @ӜUk}PRfQ3Ȳ 8#l4 I-\;@sjpp '*?Ih> i.a T I  lAHm'tfb3n&қsG?a TU蛟O~ܶ֞G-Q|MB>2VhJ( ˰3&Qs`Ѣin=,Q0Q'qSmۜ{+9h*‘H[~ⵡw0\وR9s _.SK>z?webIS$IU$潉xY͖e"X$'uFмV9 {VU,hZ7|w; Zֶ oZJoH;8>0o:s>c:TTeЌ2}KL̗\(h=׮]9c)X zI@@*2Ҽ/wpWlѦ|`4B}|lQVUЗ3>qZ#ZJ8$$,[:r!0-[IS;ڟ;{)P'z]Pjf0d56ӥxL;gɷ<孪101 ӡ !$"S0XXמ/wW'A%o/Jri ~@G޽u %d;BuYq; '32ttrС{o;{ײ[Vwjnha&Z7ſZ^oxMg_8fpd??:yI5PU!0o9>urMf&;8^ϙmXY zCEK}YF:HޖdNx bY l;D˵+P#[Dg@t łu׶߀ԝXHCUd4;PN1ޝ@䌷v3$`=ω@H~!vL7ӝ:#usGTKN. Siex,}`fq,-IT`$5w`:.sF}]3tUxIƳjC tRR OFC:,Alۦo,K_JrPW~11n03~)-2I-R(B @{ũڔ5 o_|m iRlj2"] N~1@F߼^(J8_(@Yw`(e0rĮij*N["TV^Pʲ9k4` eȻ>`^O' 5FKp6O,#hJL (MN'#[p(YCR.nI#ճ..4n,o10fcR|7 eKlݱx#tËz{\LmDzEr?& ̯ᣫrGWke]+/%\nqӧC:yJ#uo}w=[/jE^U-]ߗ.%_CmT#)(%`(i3R$o 5sc~d0?1HǛoEǿ3 ;6$ɫgη%(G_yG_;^vuLɘJ=]pwɒ& a._D.pj hr6GKz#z٩Pyk[]uE͕TG)4IyT; Ehe-<<Ȗ߾kl2C}f-EÏԉ=.n\vKϟTsˍHU$ C6 dj*Z.eP$|s< 8~7:m^K/Z^;wҊښxUMke$@4-E H#=#l۞Y(^҃jX>Jz˺9XZtq$B$I1s#=Gwtz#jJ_ (ܩm4,?Q˒Ke?p|:Eds%M1 4(x{yˁ>hSܤΜjȳEIENDB`PNG  IHDRL>}IDATx^il\ys6;g8uI(r%Z%Ӡ  -PSCiE8m6ͯ@Zr:1䨉(U\[-h(ڸ8r{ES@/Ό<|,lǎPۭA3) 08U`/]2$ȱFOc0Ɩ'8OWX$UҷEH}X<@Ru['+&`ܥӧref;ppdX}gw${5C'<ҏ% r jKLSEKc`fes~z؏>` `Frܤkp𱕙/K2PS%ĚB% 6&ݔJu'|^`zpE0vSUEp¥mܟhM_WR+\яdOM-QH2-bY+p)s\Z {Tv: s\h#goȬֻFրbg2qd:㘛< 16 ~Av{1"7Hp7Ԫ݌Xsu?e13?%*Y*#֑F1j}_pg"0Boq%ܥ#)H@Дrq!8 y墍 `[:c 2ՍhG'h8=y{FpnHJӓG7BjJ9 lTmTeQs`'86&X&"(8U7n{z7Khxoۉ+Wޛ[99^I٪ E!Xf^B$(j 9$u% +*ö` Q$U|^ۓpPdV)L dzOe0? ˅$\PC)>k0d5ꊇ+̒"~$ҹﴴ ;5%m ɪ@&1&ș>N_S$xn IR@L(p3kxLЇ݄Xp9sһcO&` @Z39:w85 m~}>˕eJt`'SDSS`>Z׿ ofoj[)L ,.#wm`[zNB"pO}H!0 4sdӟr\DλUqv>-ޅY#3˾^+Z rW \xf=_5D `f1wPszq͸}V0i$/ 1UKR(̔$J@E

?拟R-P7|wD`\Dzًϭw8=;v׿W*M(| >e3_yMWkG>v%Z2 P_v|'.|`tǂ.3n\}o.^4",QЄxs ᯟ5.jJ'exIENDB`PNG  IHDRL>}HIDATx^y]yƟ;ݷ3 c16¢f! 1MR&iV@BJiP J $vnla=cgwr֯s}0Wz;y圫QO_`:% EWY.^2}5v7F 3?ݷkr <T/!{P!$xA' Xm)xy8Wk &Çl_/ 4]U` )`e\Cl"S8]+kW{c=ƟABk A1uOs X5(`$p׃cUyNpiP! p e<']\{B`;"bk;v!0 V%8rh X&4 c* t, lkSz:48r; /abI,, ա rC4׃AC1+tyy6@b0 ieC%̧ yJ8{Y]?*"#0m8C<D@ \rC CAk˴ P VdB{&p|h5NkTfTn#%Ê~tlx1C1$8 @B$:6'Sz$ڢ+3Q\8V(LtjNsBpKmh,M]B9gr 2#8LAJaHH/XTv5j$eH`Nuimi3?5m|beiC 4*~`#x[3<(Tw@ P )dKg_y=XJ$5% Вt ( xV^-8 ^"KOԩcg435rם@q= 8AKyNUвw C `2c PkEc@PxjF +^/izc1[|aO_:QQ7Ϭ@% * } 3A CuL,bip`C2_-"4ۅ0I,siba`-~.jٿ>L[{}|nYՁ޶8Q3E+>2~6})>,>v73Ϝ1*0ye4 oT?%E=Ó7:*ϙ{I^H飷]v5HHU3Wѓ5+Mض {׶廐U]0)Wv9.$2X@IV? a7~m[3tͺnte UW70,S98G:kXכ ;p׎!Op`5NzOj X@NUAE$E:LCR_ \z^'Rbj𰷉ZTIxW vxw_s/QpiHۏㆠk^{-$ ղfݭׅL LHJ(gyE\}- K*͢18 , &Hؠc t5Lj&5-][?wɎry|fxdo<ݻ޶44%j$$LC jpLᖭxlMrGmo.*!"<mMԜ XmZ, yP(bc֫e&)lymZ</LK_XywEЈ%07g$`%9&q$!/lPu׵kRW u=CCUUP(* ՞!!04:B`57-7w|ל܇ Mח4($P% y&gߴX:]%8`[`~g`R!~o?ruЕԡ)d \@Nٲ< /^tHh2=߿yu;O,{),Zqy`G&^'`ۑ_,CdbI{?? `[Wvk"g#<, hFɐ\PTc5p ߂go7uf.$- gOBx$K4,Z-Zl(,929SM ;H[_٭ۑJ>CF0[lwN*|/$Kj db:6>ftF3-3. &\Sȇ%f5_<8l\FdG< #5aɎEM:ekWv%ӓIh q9P-u?1dT @:G_k ?˜ 1Ӱl ˙WQ`GS,Owr=[- DC`Qn F -nʑx˽h/qF.`$E3 XD1ޅGq]ap9 9M)ކoSLFʔfє%d:6qXD5S&]FAQU*.1PBjh9M׭G&*L TpFT R$dKP ao\ አ9"$l 1i(Xۛ k'0M"`zȻsb:OIפbS5vV*ikw~e冡[Ww.tfT(Ju]H/+΄fr+$pYT%t.SR '5ɨV⩡+7}9D˳B `Nz>,`y=tWS`hurU_mhͶH&,4VŁ *ƾz- dHvPU !ٮܟQ MR⎐MB^*r36uec( dUh\sW޳qh7%7h<+# #ʃZ4 ̔He4kAs :5ST ]$\n(`KnK]́!m>rO](xζ'2@SZ:j\ x:)H3Y+ hJ8iu͑1|*U{?g9'fm]w԰fYޖ !PHs&9De::5C.qlY̝<1)!ZR/?02UD_ttvx \4_85Ji˕0  =}!&`:ӎI;819}?JBCLEz喓1-޹' ]QJ&3{ȪXJHpV@qV3I5Np\YhUMffG@ȬL͡bŁ7sGݿ SVtc Я7z3FT}q|! AAf9ʏ_'}>)FuÖ/צ#fLXE~-m6;_/rFS$2? ʐ?`ёQB^$0'V!IJ裻$sqO `;J-9ǯ.蘅 B=^WT6!ϋNT kKEpP'=u>0)Nrwlov60UͩG1f /-3v|Q@S9NT:1>mTlK*`Z6]qBB+G8Ku #0dkkI4NI,%E=g]o!Vtܼ:D ^DW+t5jIDATx^MO@Q`XE@T5.01AEJIa&M5UK[r/Jw'wf*:үeU􋦄yU)a~.%O6 LX 2%W ТÀ+"H0AMu.8aA!. L10A8i!H%CQ Y3LSLΰy,oI9t|aBD7R'BBjx)0!&߉N i44,:o8}bi )+]ڗkCS10Swʈ6^B6bˈA3K|Иˈ`13EӒ$׷ L&,K,‚9 $7շ}ϙ0ҤCsFL'A'y 2fܲJ@PsŬf;"l0˔fʤ&d&D.%rFשr&x<B$+acɮNQl  $2bˡc]_1~2`Yo, =6I,ImpBkwDNJIENDB`PNG  IHDRhhM;PLTEᣣݥļ׹٧̰ղȴͦпèƽϵ޶Ҹ{IDATx^WH џ7;x mw R;K BȒ_GqX6,Vkϑ!zvjߕzV8ce2ˑC`{jؽ jS;⫒mtkm>ZXzIh]+ZfaE+`X>夡`iY]h[Z|vZκz斻jrWH.́D8+1Gn| ̑~BQ8$csh?hSMY`N3AX_43f4皂9WJyZA8W =Ź.4/Bܮyb2/\'Z\2OJjTUdSf@ɏ[ٞyG-K<*sŏ;3T\#HuJ3 4X>̣3ѮpjցJdDkgT^l+/mm,P^Femi֚f3[Cplupp*x7su~s $j_^r^g8ƁOƤ++#ڗEh+/J͡\oBH8hWZ1_.7+"̂|GotYH!=ńV8OmLa^wf ؼ>CB (S0ژݵKXF?;v[9Ԙ+SV$/j};Tz^_>_^P#_×wCs湯c 0`Y0)? `Uޏ(HaQQ15٣@9%ΣP.qgA&Z5~fͭ#"*AT*}PgQ!o ]\Ju+lc*6Dj*{*@|z4ໃt4Ј6LiD:dS1`O4 b !Ւ,!Tє(L I i ќ!щ KiN O!ϖm!ϙ!τM O = :A`Cs6ќЄ=d W4eB[r @.wG  thB❚ӻb(Tϡ˂-^DA J^Țj3z2]ԅ:fy:uS>JHŶTc FUFPL@ZBGz (C\x(VC.= ջE:ÚY lLaLrkxkc10'}t`[6m@*2oZsB5Ana)ZH^e?(w+3]ոt&7\ p;/wd?$E?泏Sc6 V?ǟG[ کC#8˗%:"W zܹ*z?Q5+O~3wIENDB`PNG  IHDR@EUIDATx^[j0@Q/vcl+)݂ZEx~ uZ?n?\9E]8uZx}}p<gehw˘f0Ώez_j@yI-9Y lYD@D lwj-b. ~ٹw#a vY"J c`6:W=)ucNpObh^F)j]Y @P띵T%hT@gYhΨ\@Qhv`|s /9 cv X7,˾k7MqjF_>Mi\|/@^  ؾf W^L@P`?\y #@Nx^ #$4W~8 VLI^72],d\r.[{ϫՇ,V+-RNa,ccttnfZv>l6rɴn9l!Q^jq =}|?O~c\Q-1טv7=ʪ9hȞ.Ϗ]w߇'?O~光LfsY7ri|(/WuOa9}O~'5,?>"ǚBWjHZK/pULKP,p zdesvzט 10WGˮ֯!I~'?X~NO͗+1q?J勮<F^ E5ыC 7J> ^a}u|O'?ɯ#2oA$nyM$=ǻF~OZVή5/oZzG5zoz*4RO:r0k5\ĩ&tf͏cZnO~kql,夹`84/%+*auN8R$/~:iW.Ew? M5 ہooO~M$f~^y)~h)V~۾MN{6סwfbG/+K9'_읇r:?JVcEXNp9Ehdѐ5 J€襍iY_^6@/bRO&πa냕 % r v |<}h Bl{V+W`?|4-juē Ba05 #%~lCb0FRwaډ.r# Iz$bPo );ugf:_3*(9BM}%\OG֝ ?39UB~D{їssAv's]މB.#;&?G]}?Hy [?yc/Hc\_\ϭ??ןO=g,;X!tk_ !`C %rόXapj֟!l/ u܂>6b]6jQJg+Əsu<mPq}Qn6a$/lg@ kLb@ !04=-(js5 Dy)Ҽj[vZLWs<q+dJ*]_7ߟ#cLf"Jr_w61rCh"Fӣ &-J !//֟^sl$0q6v a´?&H㩗o#@ Z8M3* U^b;?¯_?X#V0+_msH׃ (>q/E% ~H$fxG>/1L\Oy_7OPjs$ k 3 "#/Jay[QF QH!G)?LY1,ߍI^aߴ@ 3}a"#9/&ȋ<ȋ2kS3yfy#;bK?X~ fJEgjW_]qQa띝1q o[!x&@-~)bt>DI ,{?׿^@|bm¢'m$0Vj(O0 @X V*L &8*p,goO? ƍ3e8^M;‰VXWoOc:S:}aR<_kh[+ߏ8э# (3\?oќ|\jPPqݎ?|y3? `I;6/lv'E68$12Q:Lġ %=5ӯyr_\f].߇'HrmSe0$~˓a WX5 cNH4 r}w$8abWdĘ֟08c' 3,(CᚉM ?ߤ( :@3 D0ny@alIX,͌ď64E@p1F^3{+ґxcXdKP&Hǂ N">gk!h, e%P,iW__O#:8 Y#8kCv.ĉ )?@w'#|eG9$n-bjX_?m$P}q.zq^iOsFi+&I@Nv|?:_gdGof8p_ i[ LoeyJ?̣5s3Y 3zqŏEh5X8(:~9d˚+c54YYcNߋsF =}j aˏ78CQyďMᅮKҚO(L8Q"(i^)ΎH&˅vNV_(Ӊ:\ߤUNOQk{r|"a,4FQb*'.Y `+Љ/b{Ȏ~@v;.K[% _,t #MTڎ| O`w~zΑ8/n^+o~Zo=Y^I3ŏELAG5Q !i:}G:",>QirT&:_0Myn;8Q]  UH>Gb?pj>NWa[oR1^jdE}xOdGO;c2.y@H#QE G#J̼Ҹ=v.;'ǣ|`|Z"V-Nwe)*@X4gwӗ8j.:56+##wBib@'~2ott^ z:+N*_G)p:,U]:A&JuVSX7bno y  +\Hۀ鰲C3b-0`QC@8]}RԏH#X>P:K"Cv6Ԫ7@}lݱR">D IP]cX^ټvҪ6 Ui&K(+paBsr:BIC x-.3#Z%U}A̋=pm<+oIO E^ىj>*Sa?L<Wo@XLP/-C#/\"LFmgy:^N$A2e2~4׿7%B?W@ak`>3q$F^XҢnPDؼ?.?~?Jt:3s PP 7&X0DfCn@+ + `y\ {4܏ϨP<xI&f5YYDc`AKPIY0~a= zb݋Y.}y1bߋf'aV9?ά#c#/PG^#  cWr!lެ֢gC u`3f>{ - 8+cIQނbʹ/Wwv6lw\+$ ўZc{IfS?Œ.$,hhl.Ԋy;)Xh.Y @ ~dVY-&B~56`LiJKiʄ08A7O6>=9yy%=D`uka /Ũ hv 2eCYAaH@2'ֲ%J$Sa?G1,0a(c8 b * }%mIJēSA 6ر7!H{dE !#-qJ1Lt?*ŝ 1?m@&HFA`UxS'~j§cbG$v tf #?O!p;uf~VsnC&++kޟiu@xahPac?{}`Hmqԋ5N~DsS3H$41#0qPx78XpX4ҫHD\%vH2eYz~PL6`zO_x/EeM_A a¬˧tl0:_햆m?Xev])sā0hD@ &;+LC*lPfL@ԝ ebLʚvϊ2  i\zgOTPbf'Xqլa)+%[gLje#~.'qz .B.DTƕa#'aBn`SX*{) kXfA|VϪD8+imJI:Xt T^<XnIIKGKEj,?AvbCX0܈\:vZG:ZoBq-fAtVf'_1hD_ 0b󨁬>[{~V/?+9^d]vbJj CRG ̫#m 2_@HTSm[|J Km۟C M0aV<]/~6[Xo휝sv4V_NaM @\f8{F <e^GueKڈu+*CiSc/ .a_VX`2+tȫXo<;`Y˕_'wHEbFc 7g>j'^Hj$ ׀XB* e xIQAv ~_myl*CbߟJSjĖP |AnQ>蜚 6,I@ P@~ /DUsad CQV5tžjȃ(C sP-h m`f)` ~j񃎭6%C%~) %p,Fb|zrO^ ) i! O0/+~7=:DR"5P `2ra*,??X Yy$-}* RK T\G GYDp7!/ \az1LRVw(|`5T Gl$\|.LD}䯒zL;q^?˕6 $#Q3uԇeȤYՊkVAbLcq|#_+ 0NqPQY[YށY!۽cmHpO=O׼bIZ:$ 9 yMmh,4@H@ڊ3Vc%U3kPks  eȪ?5V< I wkDabj_"~)T7gҤUuF;1n36UDpO@$lheO0?h K&j)wցaN+zcvD֠zXn:n(ۏ 2ӷ߂Z<,Ç?B9+`e!mA~%L| (kd?\H1_ޅq,Rþ?Qnq Kj1_j~_1r> 4''tЩ);HA:x@QOqd^9[u`LM.z{KWJHQ/l@ *!KX?j9<$fACdCTk!j.[i)>|!a#`~6ח'67[$EeʡH-t\;pAGgs>8S N&^Hy )W@;']0ٙMET`}9X|0Z?NSPYi Hmxïy|]ubC-ۏČ3_oBg)sec `ry0a(%3 K0: bc<>\#HgXy\ub$ &n ,?I;W@~h9n3zď%49LN@ ')DV<>FCA iv@ tXfӱv-AX70 !R|Isw^ximq* R3v KQ.@ʲ3 ( WY(^t֍a#rG`uo"uy&(?^cI\ݕgCǍ#h +OZE]KDA+^m4Rj2/I߬??!s?zaC&5{k\b7h~g-O}WfiDJGZt3i?##ԏ(2kV"?θo\r:~V"O0IQ _N 4@Ox7;:mj,Pf8nC~Jp#?+(#}~ZhC9= ]0s{w%Iߓf5H!(c@x kA7d١R-|"JuZ]7& S1u8ev40ȏd%\"#ܙB&N,/Ik5L& Cg.l _;@ (+ H4IY0a0 E{DDo` @H0ہa#} 4A0 dĒRaH6W T@a㷄N TAz'@6`vX\p>a61"Od6IӲd9a6LIXsbS0Ŀ!|r|ۀas. EАafaҝۚԈ 7-k\Ce hv 6`f'|Eˇ@\tRi/n\Q/JbR/n$ry)!WŹ&Cn)\zM0x> sڼ׽fiHj ^YB(=yz )/3#ɖidYM`?BHڢw-K4Q.\D]?xwl4(@[ *F!$I$r O+?3ًfv7g9JUM\;~^+ww[5F{ʎZ(QbNEwÄ`c\b]35`<8Q!wb*9I(;8wm:ym0CPB!`*eC~Ñ@]l@ȂitJڪHU|hP7.tDھK?"qY #b[,A;,=In>k ↑C!m#1HB?Ļ0`\iZ~!A *Ƌdv~H~*ǹ%}LYK~5sYka0e+r2GMK$hP+BBӭDƹňĖFOz\QeGc;GM<{xrOhY:庹r:y]lP*I2SLaJ;E0 P~^u ;D!ֶ| 'V.->O ~N=wVq?Vj[w #1Fe{ֿ~g̟3wCLa?=pQmqh_B!L\T ?FkZfr>/Zx- B!`sji@@vr^x1ne B!T~>!Dv`"B 'BߧШLJuO5iZV?gyQm L#в~?h !BZwCdo@fL0{ _B!v!>8O1ֽ^hۢ/1xhfB! #4|t_ nDs !'𾮪FQ?Qt޶ B!MӇ@ZdK pB!xϏ jLuQ%ͱA!whԘɃ[zEXE@ _߷u`0'BO]ZQ̌]ţ+SpC쩀z?~ ?\[F=.~>/G" χ==L AxWAFA,G~G?z!$R,1KJw3/[h]}z[?Č=/FW"&)B&^ (R מA\_dI%d(3&?gk֔kLuYm?AI"5"? MzFzh/28/]ţH$/š#HQ}Bgi'\Mq E(i P&&1C#IB}cf!( f#峉hܫO݃C6{}졿O$ *RDwƈhM-Ak ~= |0K1Rl̟J'1///2$#C*B{a !w.ʍ\9wwI|7j}^vuըFL#¾Y~n~?~rBEp~̪(iOY_?䁢7 $nB\.3hlOXն}~N kz>%I^B|P|zۃPG?[!en )#]q> $`<:y=s~z-OŪ_Or7+sA x X6 hB=@da]~WCjYO5__ezboۿ{{{|8xAtzz]OX4hd5ʍlG' [B/Pڔfzt=OUx< w5*yzwy)Ȳ)AY+ Ɩ H @ekZ0w:,[l:[R $gxQ *s~>)jzy5gz\ l!=@uwk "))C#e v\n'?wiC^y{<[=%$4߶9ѷo+Ν`w/ק<[^Ӳ2]o+@?*givz-гGWԑeD鼊BYo<(ɼMaA~x'Gg zadK}|}dJ\oOOt_]J2r2;-mQ 3gd.#H_yz9zW"s^6#OLԼjQ1%XVbAeچČ,=b}8w?7U ?(GC~T8֘ CXFe8/Q1״ιI$7蟧|> V>0Ok g|gΗgy]m4vACWU;\a[SUBJ-m3<9!=*ٙ({}@%'peYE ]H  .Tzz.ņS䠬2DTm.# b/5@ ?EyÌ\zn2켾 THE "3EOF \^!(?W9}44<ޟz~_*@V#`ը9Iň."-󁎱GAxu9`}%KIAÃƘt|=H$ gR !? sVTf0|?ٹQdq]cqK8aÜV; s,/d?CgzԾզi^Oe4/Niۤ;g Eyw<_Wc~㻯myk.5RerPqY + ņ=lܖ)(Kɫ~0x6!=8O,XMXT0nYGDއMy<s9!x&{yٸ=}zK@^梇,D^$[Wr=GcxdwM'B7.O乴I2mof5XWϡznzA=y Mفs Y'FCrvq q2%Pk7 ӇMԽ AwX2.w߿PP֌z$LuI"@M @P$=:!C񺜑xKֺ/^\ ۃ !ӹ&nQ.@CN(6Pb@:wEM;V)|=V-}YV e>m ^s"EJgJlBl5|LzuY/"4*5PۘP4R0^n#dc&z-ո=/*>T H$S 2QE uG0˜! ~l46qnb'{ݭE0d< p" n:5csP2FD,3 Ω}*GOy9nXz&)HcuO9Y $vlozb>&F>,7n7c\@ϊWg-X]cҲc],J="C;:KxC68jE9]|zEb_FdK_ :B޽Op'k:+(_8m,=w9{wQ|&/J-vU}".-u!NYn=)#~ˆ26,SX”рuYp{'־a4a 寑[ Xg }+$d Cp8 1 <= g1I-:UBo cq>}>\>[cL@#2c E рuwE_c>*A[x&0[FeCҶzFG_,@ g BÞF0f-V袵_E>~`{vuPlnyQ(=SH 6V%(fd٢~TaEp~'eE@Y#!i[s2Dn<-֘SA4܆ 91SCyi Ph1ڳzN5빼y.C =,;CtLE-<=e HcBq%NYބu{[DL T4h?@#: feIF\|xj/ a ,YcZn>sї^{z(@m#R$ \NaEN"ij=ݷ 73AɣE FޟɧraRT"_ Xm~pJfp:8֐o&^~5c#=A8~+<"x̗ ]5a<`0^(+W^7VpJ9F:wz(A! Y`=y!@ىYط0fފpOS!>¬b >"N( i=An۳-'^S cRhɹGI8/M?%(V0X1W=qoB:IRP ۰l?0TBGz~TPT<ą "uN a.R?T:P2rzX8Xnd,W @| @rS}n3\>=u? ZM3ڛد:SQ6Xz~y+EHCa(G!s>EgБ&AG:6PޑLFp_މeN)Ak,K= ^xqF@FZ/HIԱw /=X]  _͕C^>>y<ّ[Ѕs}I[զ ew y72F]w>." RAK(tG)Z}O{O ' SzB'a SU\!:&{!=#׻r3)?ρ8îͮYPƶv׏?@<:Y^ &?H_r\KCá0(;夂ьNt>GzCFϥg3{Č,pߞDb'q} B@Bb- 9PW|p(L.M{*FW}eDpqK9 ;qY}{<@>P=|{L^D3Fe8}Ο一EQˌ&i H^:@^.{R (d>3ms$#DG@.[Yvh#kO=|1#ˮ;'>?}.ʮ(I)*sշC`ZRmes}G'KAFɝǔ1 }9t<e+'y[$]bF{hO]_w jāHYX(Ht+4<}=C0G yZ2Ɏ Pry40#ȂāH]Ǥ -olレ3QLn(,?IE !>(@`{Nw`}q.POtцzbު&eKND"Aoo֓,+wLc˓HcEh'/Y6q]mw @:h~OMn!(UbNC$R#RRYJ͟ R-BLnP0.kf{}s=Axw$fdٵM!zI|74 dM<2&)zsq],,`GcR.$h ?з.H7HOLո=o[1jNc/PR| >搗EeQkCyvx(rmHCTbB䡳_HEHag2eo  nX$0N)?6g?x3E~: "@i1(;8ٜ,<\zvm{'^ 0^;?W$}.?"pA ʐF-w]̠E.AYg吏;̝(D~Ҕw"@LuUl-r5PSnޟQv > c4x\OzFP0籯?zM` L7 C 9#q"Ԏ9<%`!@]3 oszqـu4^]r><4T$B.2UȨeFzbgdc.'ߟ "NJ Nȼr[䃵btZWCaY? Dfszgt} BpxtbBmd(!.*&|^(IswCUT(o> "+t @tƫ_<>A?㭲7d{\ˋ$<|CM. A.[W:Ȥ^,ۘzҞO!`ΤYQˏv/- *%( {lFuZ屶χ{1w)l+x&rƫL܅p9/.74َk=vhȏt_\i͇ur|ưu[ʁzֹno˃qMX7mPj=w##Ģ= X纽!Ŝ2ZvrPa.o}N劎OBPC~uQ~x<>=Ҥ=i x<7~3.& *A >aڛ"@ y;F9u (-h9 Q10~ >o{z#ǻo;fɖ}=qU*\ %#2;P\sN2$ߥTz[?2.)|>4o|JBAe{A KNS֝?~9dcΊU1B~KόY`/ zĬy`y/fDĢ<sQ_1?/3607eDA|~m4XXAVO7fX._x_0+4ngy8»B<0?wӽlXuXky=؝!,l[ca o? w{3w>7^K?LtP?O5_ޗohxwOF(bYU mN$ rm~?n\b`+8=p? X+('g+013"ʈeGXU```~cn3_}X ѕk%][JXu`bd~HJ P XC vZBE>x>^ߞ4mo~$;2Gl!>9daJMlĭoX \w4TGa),ƶx>OfKܾt~ţ5m~Bq|5曲Y(0ёe)A- 0EnNXb,7֯4[dfBop.A:m$`lC}g!)"v 44 `X1?B$;xlG@f  ?5c&|5Oђ_g/ L3@usQF$4=`y% jNgQQF.XkaD袟uK}6@kM (kρZXX!cY ?y~~Ssvb w?D& (/059<+=sS#&i E 0g!b ab&%k@ nz2dN#&-c# !fu> (i?B.tO;&:1q#9AN03usÍ![6$'iFyHK8\rk }?&Œw# 3@hW2(_'B1#{pZ!k?ax'~(1C8! `+s \Ir h?\#h?O. ՏvP;_F.y/3o~*KLfbQnl__KEsώX{~e<#_>wO{6b݉:;5!b:bHP}AB!/TQn'1?ߞu////[ Zm`2Y@@  @@  @@  @@   @@  @@@  @@  @@  @@   @@  @@@  @@  `3FުAm,IENDB`PNG  IHDR ';6csCl0`M5IDATx^u BQtO= @F_AY%1D$Fd?cIENDB`PNG  IHDR csCl0`MIDATxcQ9 H1+IENDB`PNG  IHDR csCl0`M0IDATc`0s/x8 P`g(*To_4S IENDB`PNG  IHDR csCl0`M3IDATxc *Ǝ@ VEv|ٽL)Ped\&IENDB`PNG  IHDRW{csCl0`M IDATxc)wCuIENDB`PNG  IHDRW{csCl0`MIDATxc`?#*<IENDB`PNG  IHDRW{csCl0`MIDATxc ^ !!WIENDB`PNG  IHDR  csCl0`MIDATxc ^N4IENDB`PNG  IHDR  csCl0`MIDATxc`_ !daI^ŝ0IENDB`PNG  IHDR  csCl0`MIDATxc C GTIENDB`PNG  IHDR csCl0`MIDATxc_$bܖpIENDB`PNG  IHDR csCl0`M1IDATc`0ٓ?$20hr==}2"0I Z"[IENDB`PNG  IHDR csCl0`M8IDATxc }9Vy5mdJg`o q?#9IENDB`PNG  IHDRW{csCl0`M IDATxc6g"XhIENDB`PNG  IHDRW{csCl0`MIDATxc`5H+8;IENDB`PNG  IHDRW{csCl0`MIDATxc ˜17lIENDB`PNG  IHDR  csCl0`MIDATxc_ #pq1iIENDB`PNG  IHDR  csCl0`MIDATxc`?B888LV^ҊuIENDB`PNG  IHDR  csCl0`MIDATxc_ GB IY+RIENDB`PNG  IHDR csCl0`MIDATxc_$YIENDB`PNG  IHDR csCl0`M1IDATc`0ٖ?/20hNr==}2"09u:IENDB`PNG  IHDR csCl0`M8IDATxc ݍ9|y5mdJg`o aIR?IENDB`PNG  IHDRW{csCl0`M IDATxc4bzIENDB`PNG  IHDRW{csCl0`MIDATxc`/*O]!IENDB`PNG  IHDRW{csCl0`MIDATxc |0O[{IENDB`PNG  IHDR  csCl0`MIDATxc }pqe%IENDB`PNG  IHDR  csCl0`MIDATxc`?!_d3"[IENDB`PNG  IHDR  csCl0`MIDATxc B 8:WPkIENDB`PNG  IHDRnvcsCl0`M IDATxc@aAP]S H$0a> IENDB`PNG  IHDRJ'csCl0`MIDATxc`E@9? IENDB`PNG  IHDRW{csCl0`M IDATxc`E@ yIENDB`PNG  IHDR  csCl0`MIDATxc`Ew8CIENDB`PNG  IHDRoxcsCl0`MIDATxc0Nކh,S.IENDB`PNG  IHDRrHcsCl0`M IDATc0NކFm7IENDB`PNG  IHDR icsCl0`MIDATxc0NކFe)e_pIENDB`PNG  IHDRoxcsCl0`MIDATxch,M+u~ (IENDB`PNG  IHDRrHcsCl0`M IDATcB?wIENDB`PNG  IHDR icsCl0`MIDATxcFQ^'^xIENDB`PNG  IHDR ^1IDAT(c?apĈS=UIENDB`PNG  IHDRPP|?$PLTE=e tRNSMfIJE IDATxձ 0 DdxV`V` zfa@H^ي("EkTI2R L Ayqkk@,r `( ·Ҍ` _xe T1T\ۡ%@B߀'_LY@<}8*RL,Z4j`6(&&q)b; ~ ĿK [NhY$ @l 7 h_EMB` {@ /}!!!@S(}*M? 6N H0r?>Nֆ=2XPu( >/d*υ,`?;IENDB`PNG  IHDRacsCl0`MAIDATxb?.l<'>yfb30LLUR7XL" \sA,]H& be+k ԴDCX 6" fb.0CKx P[(+@$x*q2Td;Y h.@ ;r'K#M_ˣ"Й@jM_$:=JQ* PPPxc@V J߇Fo ~gS(}*h|?PCh"u0N+iz IENDB`PNG  IHDR s,IDATxc @|%Hv_@#lH4 \a@"@3 ȍ vtV4ndY#B"Ecs1XMQ_@l4#E͏l|f eCPaD ~ȓ@aRHq$Qq@!Rd`S,28T==# DH(E-\QdDV20CRs_.h>d;wlT6r/`bD @8)OH'e3Ed("-j1EZThH{2 Uz ݪ6;caIENDB`PNG  IHDR226@::IDATxKTQǟIޅ"D2"Fb," *D MIRAipڈ63PV̦gԢDx|yps}B\ q!x&&Ē؄zW`.^󑢣TJ~-E>*^"coJQ9HĚffsXyS_>ꨁ~qcOV0R>-}BdZH-4=~@ߣ-E}24K>VYZގ64&!fh\C۱𪤒" Jf<]^%5bPztxug5DdAV_&Q'(B5dBj<:ye@醡I5St:Eu!i׃;(tseٗ'6@KK3^?Woڅ2٪t2^$[1yHgNJ4H$CԷ77'.$39ew٣+Hvq77{읩HW -IutM z+t5jTIDATx^OHa_lm At XSN:u{ #( *FZ?$DvRQ:x\,-٘b><w+Gh41,Lr6OWQ\EZ:6TaH%pYJ0HaM-ܦFҧKUg3+S1V\UM[ c/֟f%=aO]0x[^WV:zu1Q( p1G~5۬M['OX4Dig&S Q9meC'D83 <4aͤiV" ˥&KY)EC=sYbiF$Ii"Oب.tfS|B$O<駱f7sIw4h/k'o {M[m?EЪAA)kP=~W%k7EYDA*nfwYM(eUM!4[3A*QCֹq(׽CH;P k[&tBh4?>p*ؘIENDB`PNG  IHDR$$K PGIDATxcO%8jV8ju C^1^&iq961a&mcq-lnarӲ be-[1b]$]6Jemco_vOA`ݺ\ 2 fLॐK]KAt#!lQ7l0QQ."CA' d Bc]e{#"Ê͋S}CcQxAjb :1LW_ODL!b熇@#q.R8vf "1t-!$YPnQc݃/1RV\Cjd*HԠQ ;)IENDB`PNG  IHDR$$IDATx^kLSwƅr<7PZZ.>&,61ld,.[iP6QMEPm_ReQV^66χfݱ_{y'sNMLLׄ3cYDH *8f0߻@s H}퉂rŊk0Qzms ,v+Q Ԣ n'O[Bb:lHnI=;8f0BZS `CNfv3æڑfjNfɫNeVQC3v-hFF:;wrewU*̔.eTQ\0 f]h@ Ў$Ķu1M|m]al +FC ІG$R:^/y̗٩'ԛcgЀ4;< < boӷeK[b<ͦs:"Zā> Ss@ZЄ6<N㧝6mCozBM fLJ.lvQ39hAY#  H7{ۜRGB?WU:6xif&PzR*M P w%OcŻl>]VFȷL6s +wxЄ6<O@~ ;Q¼ۯpTԭ4r80?[BMʎ\v/S@Z,*x`a0LxS(P35zצp)=Np8#? f&ۇצH^u d䶓639!C^}X/x ʠ-6mCOvxP gۦYK^[)x2;^=HKBjir#@0 xBiMz]VeP[laXÌFWrB}XMb1f(s eNxPaō 4nT<)׊_9Lp v0G4Fg~(usfTx4P~Ԓ'-)~2%r~.-~H8C<9ZekJ9}FY 36ml#@3#m1$6%9=hBnpH~6ØTs͜d'8p g:J ]¾aS⢀33i p͊ײ土ra,w֠E HEw+4ɫ[T8MnІGD^//4CdRDV,mQWxgJLr%>,8 i =*Qf2iB*=X -~MZRJ7ɥYz,v+;("!^"QC3o/EzBIENDB`PNG  IHDR$$SIDATx^]lSe|w&d#Bl^Kfфd0t0# SѠ֮Vl2tn8 \ G6?1MNi˼0_rf"a%D&Ed< 3hD`=)Ĭ۷D,) ؅ٵjՋH0ݻzu^@͜ݢGUЗYtZ@V* .Xq|%Ie 'oܸv%3#O#Y |sŊم҉'40*Y"y@2 -[VHs4"u\,G_i !10ӂ37GsxBQ̦AΫI'EK5{ojG@l>+-v>FFSV4*41#cG(QL&UGR 2Y4*h6{5m̠6$USV2 1vCgdSR8,>eC2 =CQEXd\Y*eeB 5dc`(GY}d + 6ZV52RFYɾC99'dfS *s){(J)7$mf@+($"%< 3hoy\oK#IENDB`PNG  IHDR szzIDATx^JQ43SH$Am ^ "L"[(jDo!پy&bFf ..;j9z!ğ |L 0 >?ۘ7.;1um O=8>p ئ Dr8@4 opfZ€\Hz\rcJ'eFE%w@ d3,K%\4 pQ T x\3 &-z@LO@@[3nU p@sCاW)X$>Hvds( @8CX1 5X>g4/ 2 ƞU,IENDB`PNG  IHDRw=IDATxUMOQ0F NAHdZҕq!q[1Fq#.*j !`TI?a8qVdN9ޗyo^94P!xDh $YThzijZ[GpYJQuO`DBDc==pY>v3Cйǻc8r_ '|C#}Ѩ6}=88r5N(3>>1<> 8H!˲# xbbXQNڽHQM i:jf(rpPZq13s ?|\dL; Bly7PZ@/c*6MNF(}1' D#Ԣz9nrTҙi~K\.J|^^ͮ%zM<# B>D jѣ&druqՋ Oy877tj Q99hԢz9ًWkW&'?{2^M+Vh_/N{`0Y+(bUWUh4xjpzEPCiGQSx[߯ 0t6Npmn"0 d ނ< x] p109h?d$ < 4xu3zS[yRdq2}OTX sY>]iZ7Ope_(:Y. Ŷ(,OV>*i0ˊU>◬q'fLSALRmI=|2ƵFaQuFG+eCTJ#Ɣ쏙0@rn@I:V'|ь@j0x*A GG#J  133<],7+~p)i SSSI!`Ъ(xd֮=~&ʉEy j - 3A)ra @ZQX;O*=5"EdZӔ]>` MWTZkDv]\MdVcD*$BmC7Z[,.P7Ғ: E9t}9/vx箪f'}^"상? pLtږ s2YlVEEy"rBWbilIJX+OQ@DrpTFgR1ZiRkwQ8 K7TJ'q:sGF&˃Ӛ wt8H>~*#U; (-OLLPk$?:%/')rY |q[lTju}{ygvrz&;/.aĕB%{8݁HH?Cz~D;R =Fi$veߏRv+Pɤ+ .OY׈xGp:[2a`­i0*X\eo{ pD:v\U$ )n淥6w%+L›n8+Kq>}`(*2B9j/|*w+HXijS&{dFŋl JtqUX$jEn_ pF#҉i8\3AHf"U|u6'~JtvdS`Wz.lw,2| `ba8a97껡5H")o9 ܳxuT-KƤƄ5E䢼dt^uCSal=m):*y撺EZ3ȪPU%)WW.ʮ__Fq=6`AǸXk [qžS-r,rE # ^/7ٱvCi9)Lk&9wy0]scP`6څ :$޾~&*^twXH\P._Bmsk=~z>W}%&V>F G^˜8hgUe0ƕIj;Q dwe5Q2DÉ[z<8Xtj<؊+1XyysōkJK-{mWڟ)\ҊgK(];%OffVr5/Bah_p%UIENDB`PNG  IHDR0*OzIDATxOdWJd&3t d~" *'&*1+FdJEȈ A (a1YȬݺr&eւq!LY cKji$wqO=ϩ{+w*85n60Do]C+T^չo@Br`vP? 6|F;E֘h H'PI€/o$#Xɔ*4_{ 5c+ zys'}'P)?^Yg+|||YGΛ='a |DyZ=ccQ{oHS)/㕏I+ 6v~T\P~ EBg唩 *0ۇqtOK\GRr;30R"+G}Sʧ{Cvc86ByPL-؜!qA{/~ב'5/5Ni{840[H CWBÆku-d lΙ_1QƟ>՚g*l[>큽x{-%zg^ٻoӼi6f:c>xe󽹔Fo+"s%{_{?{Wy (OkW$@pW~@Ft&T́R(#6"*2**+{dtWgeEF\sN- 0 `0 `0 `0 `0 `0 `0 `dvv4?Ѕ7mpеh֭[Oux+.Ra|LF<(Pd2/ŗ "zd4MX <c, onqB4 ' `t0 @0 ` 9`.H0@?D  0?G@A5ia^[{#&X4Mx<`؀T((EHSקi{)lVE o.S4H$P0@{ ϤT9}}O(x,=L&/ HԺL&3,N4j曄9[YY0C0 4Z4-yl챡/_G u?EvxO2쯉3-kP@}iT0M%62ŸJŸߴyvͯt˝KKKRԟ,-.~T~=A@Đ%#'D[cccOdzWo_B0:744( .SYB}}}4.:u%` $I4 pSR0~r@N!ZAsE@BN,RAH$.2Aa͢3~eYc($iN>;@u @Ad@u0J@AQ 6 @A1M&@b:XA) 1 u D E"XO-//%`iiQ$ a~4M%@7l6L&3 8+0t,kB?Fifud]0tW7nܘBiF'!nܚ&n'ŷCiMD?)0t HR[ZZ . YgDD.5h2Vueuu?ʺ&4ͩL&󭅅m(PYGݖeM!0tGP8(Tnt]?$? &@6q9=,wT@El607 0D~_*oiiwQ*@":]"F)[\$hdyyfffӛ{6Qu9#F"j$\m>(z&{kz8 b2 A"#y\vT2|2'H588hĺL&aܑ-"Nz✫  0Wkfy5 Aqot0`6@y3 0ķPR3 =nJi ( t/֡@ `A?0 r  `H"  ?0tH `0 T  `0  ` 0`@ ?0D `@0 `0?0D  ?0D-2  ָFЃQòr+~50t Eh1i5i%C(%D0CVm4Lq(_D$pAAFQ ExqDs+,q]hAJZ}Q.OT0Ea>L6y^դh]6 S0&D[7k49)Sg0^aEN}e cl\}{)\ -U+uVL(ɯg@<ֻ ʐerF~^9`I 1 06q1q>֍ہd.̚b/"Ul=4[08B Un-{!Ȧ^CfW.At^-xD$L=SNh t0_3k.[4(/22BQ0P}=&FY[~viXuMMB FIGЗ(/ibtaiy>6hVF) Tf 'so]Ց/>8?cҫ,Ӎ4+ tu(*eő/F_')Z OVj0Aóx-anctNma #04JE^6I 9q ? D,+crȴ4`_~&#U0?,RB :ItPxH6 i!:Faa6o //ZL{NI D%mxNCDgх旉6 i|8Wq͠S>r[a@xZ~QKυnp%rD 2ER9`PvG5G┌:?Wm #`+v//ط UpO3,@\D3)9ex Frm>{#=N*?25&RojtuYH\Xd^/5i 4G:7 TxoD k@6'#EN^0ewQw8vҠ'^oLZX}Vb Fٝ%F !~iN/ߠ;`D0 jw9_N_?LY^ZQ3r4rHr:¢gNcv,1 `@DXJsA&[6KBe[@R$t#Y)G4&bї1iE'B?N_rIUCME' qy#0dg&7ix@s~F|3]f,B8X2[h: Ne؋s- ührSLxmg7Zt!d@H @500!WL#Y_g ,Dq3DntumE[B{Kh|F=C} -aS ޝo/6m5 EML&oJإyx@]aV-CB@ ̢3BkaZ%3m+YlF<^+Я|x۰hoQ%ڞײ&-X*YƊ/0鏾Bu _dpZ4@v=EԿSa I34eFL,6]Oe:҇h/x#=+t\o`n٠Ksu 7 g ;0[pA߯gK:|4?0QQ C|Bt֤鉤|?Co??yP ra@rcŢ/=J7RjWb꼳k` r텙 a4[8mgNtq~~Ԏ5^-П߽Bs|-o?96m:<X+2ItMU yDtZ $8]^Ps[^BP(ǖc/%tRq4==4_}8M?SKL-te>_c>dʃr˳2o=/?q|<äEVhvR\o5kS!X  %ܙ.Y[=q/w-+7 K32G +SܰOB3K& D {WT_ \ݯ:ҧ:Y 82F9d8])6Q|9G_y8-~F+iߟ#ft]@r2վ_~Ez!t=+[Հ? pXi]I59.@qS9_:Qx*dBYˣ(B2t?r]=bA- GtD] ;7Trv ejmȁroS4_3sU`@+p˻mآ3yy< rL?Nt ,޽L\<])nPd,ݍl+.6CLӻRjB)"EZNqM<߸ f\mG:gэ)ZN[(Vf o/S*Kʙtu,<1# @meцqC)aN P\'#ZtF.@njFv-i~&L)_ ZN _Ћ.e D\mRʤt^oP0.rsݛc@ uZX1``@Xk/2o@@3lNjW?ż ,Q3!Lf6"=K_K'+& #Lj⿬ò@/;]{X,2_߽DF/M^Mkvp,MXoa`}"-g-4&ܿ_j43r0sշSu0'20i^<`xЄKy<,0t< ڤU\̃AŃeP&g&%dP[4T]mS&oљ&}4 4˷\ӗ\](dx3OxM ( uʜht;gн?ȢP`@AM F+[ _-)LOerAHJiA-nV^/30ʇr '2p4iYY’0E2 iպȋf>y-jq죋 .tWwP_9};iP`@Fs,R@1jԿV{jINi&g]`z ݿDK&-&ePKصl,Xg9eҢ8.YG0=TtNAszm * lL7C?1$6~t֠N`f X=| En4{ѻ4,@`bנ9?^A>Wo{ӹ W_!˔sdY ޣ,#z=.&P*M`zH7e4eTޅM p |uf;} 6]-8/1qwXƽCUa^ZDs]aҝOdpazg_Ы7,zZ ZL hbj֤cuz\7w]4V`rxJ[8=J zLoloqu}NۣYZXE_ @ * ~~50-ܨ:u@͈B[xYH_xi5ivQ|۞( fFNse2 CfD[8dן"A03zb |hZ x:rT3 >b@V[4XRHxۚ50-0! @3*#gA)p -[H in+ %"_&UP3|  :| -4$\nD hq ,o=ZA0An}>dйk= ׅ}Zgq},@(~w'7  ,Y15wn/ϻs)hgcɽ %r`AvMGr+ bHM3-/ت7O@;\h^/Og1LLy?Í>釧 j\s2wK%"+^.14lt_oAm{)t^`Cv}tdz@a @q#sJ4'9v ?kS ;B[ fLzDVVJ5Uܹ=ܓ '& +?r`B7afDƦ# |q3Y#Pv'K S6cG&dW@6++ <2$ Oϩ2[ނ5y]DRFv Dz^u:{ͤpaG^'zy3>D 7v~!myȭ!!kjƤT֢;̩i T k)gpu,^ S;-;.4:> aIل fANwˢ0`ÙkL,'"*2 ddVS:;-p]l/Xk&[X4еʥ[{7@ANVX $|~djv}\40 ƕ 0s[Ny a Ѵ@^_ g:n/ 8x`RֆJDӡ{ԿBV b]3-PI>f AI@3ugfA-za:n:ۯ;,9m޾&'ԿlQkf ]s҆eiC h%k7Α`:WŨ/r`;zcJXl8cj=&jyO <,@rU-鴴1 X%JߨB: ڳgxY&0T+_~yo=-KeibxWW#X_X5:e0mk?L~%WjZ#3YA.Li4pò [@11t7'ZwcŠt΢o>0mN,T/ K [Jh njU'ߴ@ޢLCuV$BY].AܲAϚ2}RZJڎinᡸ z|c-HQ&H 6)7kO`, @x@_2H1:t˞5$5M@g͵ .OXwa]'7xJRit6z+0E)o,/f%^ W; % G%1⼊B2hǖ>&$mOvDGJ5Ϩ@ޤT4ŕ-,hN392M.P0?P.U:RXJ*7sr̹6\Y3*j׸!ZŵDgu۹uhUպOfe5:t @)N"Z辔#jr9?Ki x7}t)x -W)} p"~~:{H}=klj8 ձmrRg]Eҵ4ZQ][^tfݭ+ՔdE01*l1!sP+S3?9uW!4g&dMJgtq֠S8 ̰X41:tt/ u,k "4$fG tqb,@3^BѾJe zpx`#XюC(]J]\sxr Qg4%phz szQ[djGEŜ":UNbT[b-Vi*ʐͲ:ٚi(Wp1;t^hg_5j@ඝ45yfJD[*ЀFp E3,@Qz'`W^PL%-7[7P_DL{6CזճKt -iz#l,v(9,qYQ%+;E뵤2&ڂA9&x~ѿP`78;zyAL"M@,JltZ`#=e|eZa*G\G鏍靷nfpГ:-G!U: zԂh-+ 9DQdk+zM3p ODцLsnVCs]MK^sVڈQ,z8^ѿpn:]FFi-t[S~+P4?-^@΃}iO@P#K_+otǻ&6$?]#sV tJK6F|N)`f*[ϪDox-mLj U5^g2kYrx-k[ PAuY!ZXh|k4^g@Wn!zi uX"+wCxdoxϩ7 ei%~.Kux8%zْ]mRG&k3/3bi12Z3]N#pg?h:]d`DQ>皋˩Pg`#sTN(۵PʄxyOY{n@0>$ (OoNx8-$NK*: 7-UV`@Ya9 ~y7O~pny'}?Yx4tez5/3ӽ\u⅚_○F^g~:9 z`z8?u5_hnF"WmǦI:v70{ª4DII ֿ֭Ze>>?K=@g|b}ZMy7  @YkNMw+Qu~tӞ!P;}QrL a( y\#KGxxjV[Ysf*5x^LukeNmܘ`"rTJ@CVY+Hڿc.[00<~((je ʹw{m K^ n5M@p )jng62 Xȫ1򧣃qGg޳5w3/OP6S9LYh&U[  @ ԿD"F)^Cdc؃dy'54{Z3-~i?Y6^϶%_vMxh:>EoFr} {`7$5R.g &]Pcc;V?.J뻬1t:sYT-e\H ]v4~[_W pFSs/Skqۍi즩]i2E1Nws> !Оן>Do8Yy c} 84TF󔿾4yZ/ ֫<wƣgO$ JGu2DB虨0/ MQ.NŪv+;{*^__Ǩa][4=0e֧bQiF4-p͇hv済H@czSkP9-d~JşJ{y),j(5. Sԭ:rjyUF!n$2L4eKf=~||v }ɵ21fZ\xc[cP`uؑ5-'^jl-5/KLh @ WSqjZ(?E\ (3f8O@¦t^@\VN1o }[%x 9ߙ;u- 2&cP)Q ؽў U4!-R{޲vL ׾2O&D k1'[+ރ?!_ ZQ+횎׈|-ZLH70z"}1큯@V4-px4-P/ne^fd3O%;-7H@zXz=~Ӥm/MO/yWqөvȈ}< mDݼh FGwo~r?}if>'"D;!%Vob;pJgi9RQRgM#3>J[[HҡwK/A2,@Yz޲Z&MyBߪ,KrM2_ۧs8=h%Z=sNv3-'y7m{iWgV<^W䅔2D}ze}-0xP uAٜNp{fp` DDkRqzH@N سF_N++9YJ --4oeVUO}ͧv"-D?|R'xyYGO˃\-{qpk1{H<ǩ?Y?bg BUĿYDV_F*mڌ;"J=3 i3߻0'$Ok!prZ.*[ӏzŞ6 [YV3~^Xڿz@`eIk~mlx})4AyQrpZa=! Â4;W+My >ELzw3j^GNtQQ7Nlm{NLx"u$mmoxWo k6(^S7Ì_IJiU?Ioe_ij%iO ~ޡoÃu6 2Հ?'w]78燽h!n_=:3,G ;e;f4!}IAWN66̩HMx,5zrٸuLl}f !Rbn/%1~$yFjZݴUZ^ʩ,@i/Y0f@11 gPpY3'717]'ק1w&@ w1Ok >R.ow+084Hd\+m/Ld~@{}L]]hlv i5JD5a6r^K>x:+,gWMIK$<*iܷqh~@S?>mG?xoGKyND_ke_ߺtW2*ߧ.4*{vr֔QE323fo/aqw9 fdlLW," vg|@,P4~^À@9A{ѯE_xg:(-'S>N|f1$˰=;tldo?kZ_=T_+]7grz-s][{,byCmV@^iڮܦaRwܪ4< 05#W<4s))U}jn2C"g}46p|( Z#< ù} ~o+ >7*tb' b8L0 9-p}W\QEvQ}!W$j^ǧI;e%Z# NY<*bnU`)3sر6 "KWcZU/ :ꞧJ;ϼ6K{B//hei/-Jn3@o:Я ݙZ(.۔໋wk+Z*t~&0Ǣj\;̀Ґܺ= f|\;N7ߺ6 A|wp7l8#n.^ydL&%|ָ(ޯc삟tWbשּq=g^ĔHv"m0rZЦ ھsl= S;`/ {Ygrs̯xunf$R_S^܃?[Pj>Mj<@ Xkpڿw4(nV1~.g{' sĥ4bA N{T x h@+4*AߡBV!OӞݷOCiA-v3ic#qzhȕK&߼[`=߂5+I7da2K,ƕ@RH PОH-PE`~Zmս` و3i}S-?n"==jGɂ3~Ntff-դYHbQЛ1 r(wڼVGns qW[n@dMg|y;iP|^+O%£_xNW܇9`.QT{!ІAyB7 k15HW]N|ibσB}.;2@~v,/y GuSZ7E}m,tH0|\l㭽C[\05W RkG5Ŀ'vsQH-Iϧ>1ԂGkàU% rje--y|?}Y:&+ޘ 3@cZZU#u#  m&+k7Os؂U7܋ h4 >2ѓ"> :+l?L?i6Ԓe=k]^ 6˩ao$ВxԾ5~%Q/${pj91ը !kAv4^Gk#}Dgv$#.݀ 9s5~AKȶ"Rf; >w4&ottaz`6@W(a( 'hg4 _V]jm6-PBOlWg^-+A|c^B#r`޹t )7i eעq  :|m%#v 48m߷QͭWrve:gDu,Ǝ- ?xyFcV 8y߰w6i@\5+_ ̽F5ZoĨq9Ȑq޶;rC) vG Pur?ȴݭ \Q ”Kv\7YUնԡt~t~ g|T!3z,gcƧbhBeV1&4=Mz25m"2'8ͯB&J]έc_}4>WkReZD7 k:?8oQI4A @sBue98zpFY檬|C&}d ?9g=Z1-B{}DVi@=x{v:طzu=Ck^90ЄQ-˥/ o{ r{'m1mz@{0/Q̕ o!hE΋o`;n}+W#.WN l`@p׾wKHM@Y'>-R>l *yۡܧW=zǫ8'otc0 #yk+ׄU桩^O[5LrmK!G? ?j/{?9N'ihp,z =jr:Qx^R: @W#S[MWӶݻi`~c+dxuO;5ig.,/=[9tY{z匀[SmzF0xAz^^-hMAN\ѺbZGOf(M5-pj(-Sh6뼴1~n)sD嬸 DB.?n N{|W t Hn|!|tF\QX9h(!wF<&&7Eؾe}s_nxNz&NV+A“>ngt`^`DVژ'༑l Bƣ{DFXHhNPY-~Y>F3?wx-Wu`^!ZL: ?sڈ_7SBb1oe|bgd. е{d[FYڱW{Xs{`^C^FF8lٸk2N s>VO-?gGvnS Q1 ࢍE7"t>u`:wcd t-p6C{)nnmRth <4ȬDwh%p/S@{1kigG6 "K^]o-tt:2: @WxW@죽Gv#r9ЬޔM.4zdpД͎ a <߇w&)Uô;kuW߻b0 %#mhT01YK+pھg' ؋jż Z@%,N?E6'CIFC|}BYOw=} F {{Yhh zԠ)u#ـV)]:./1 mr޲ZTZwgg\fA{o Tp}}~8ĿKE\WOY>9jy|rA E F*ڋ8u&g|+YiN뿷( q}W]Zm4Ln|%7fO7t>Q=w@:MlEu `zb@ TW(24>bG GЦ?*M` W;__Bc1{0ntt *ʖĮz ;\iØ(E-<=KxGOw&bdo%$+ti`d``W! @#i9n-b)~[[8 s=}w,;CQy]O J7ht2ͺO^ z Zd %tzm{`1 Pp⮩ /xh(D.{zs]ZB܀kd; {U@ðYExļQdԲXR0N;:S[o ;]~HW]x;h@]mWKFq `d \J>lfPL=7e?8iЛY}3 ?3֙m-^0/%FDPVN ldY-Qd/ܔ@>G`-])]pK.`g PLHOw> u!K7Ѯۊnkm #6{ /].Վ^./4{ `ydHaK."(Ȇ '$ XrmƯ 7˼/\ P&G5;`ZmO#o=7 XbhdAzug2_?.md8WGۑ&K. <66I۶;a3=8P2:mihԞ(qnF WŽ[EDƸh Ccvm2E k[iC9NlUreCG?ǚӖ8N_}qF#[A)HwtbU=@sȱ&6]Fi,@W4Ng[_`|zkz;R(- (:CZq:W/6="+;0 fݼ=-cٹ?ko74(QIsq>s ,辋AA6ovOa Ў;rTZUM-75nt_oԡ~3&nj4:u`=jZݔ,N ,uԌ=,jnOS D8Bu}s}b1`}}VGnF iZLuY2@95[]Q?Ŀu\ h&ɐ0q3ŒWnX9E`*4@mԴ][ihӰ_K0ΛƝ[Ypoqـ2Ij|-A[Lpׅ @Њ~26o8-[e#hH(j4 MG*ae&W9\?,-HVoayQޢmYZJQD(72 fW针XûCKK ѿa*)Xxd/i#nqL˟ ϣCo)ngK 1 74Q4N)'oveF)yOFzXµSQ?Ŀ Ŀ\pJ ѿVprse/p}`% -<p 'Z %~tgp MN2m4No)M RUgI2iN ?Ŀ=ߪ۫c@q#kqNrN[wL)_)5d<8P0#`[Z1?H euxdLm;r.CG'n7hYok[҅ ;@MJo;|Akk @G I7F'ȩi#4c6p`P˷B/R2w[7t:UN.SC1M80z=h?g* ֻY4*5 L^3t shC@4ifgilߥe;Qm@=ԥͤQݮt2ڸh}}}Co&&&':c)M wd7Ŵ*`{Z{[NZv ^4):4L>KBS_z I$u z``œI}h}@9-\}J&iKKki-a `! ThAe Hܟ:RXXp@W^kvPaR2xVuwL!ԥJL^^wZ5`bb"L&f7rG63 7c͋(jz6:/heh~)ɑn6֥Zd |Z&NZStH ZzԮ1JF.ڽ9`_'+I3~n\ 1ӛ$皛8`.!_ ƴ= Y6vJ ZV H<N@\nE=km[w?{U3۱'l}I}lvU*@E*L_x^P@H xPBwK.v]]8flmlrf7V{w[ 3[f^ ZCWC9Cw~%@Rz@Skdwcg ;33Mq0nx{NM $a~u*ྕeN`VP?aQqwCG]bDvB+NS4SSk7DK jsigg')*MEW=Ll ek֮[=RGHC 3k,:70#79!6L 2Ppv0_z liPUjϫޞx܎'VtKF}1z ` `O( ﵲhhί.On*d#KGzն%`xFq7[)9㸪چ 'Z3[T~wj/XeUT'"ȄҼ_dޞ#"K/Je'GL* h|*@ %_hhh/}bx.<#l67$"eV, +7tY78]lk=n/1w{wN$x }6j|T* T*R_Ȼ@T"2Ӿ=LZ-+- ܥyQIySfMmqM硴\<,q20vo 0Qc,q≛ꥋ k#uz%0v$ 0Mχ,Bm 7nbi=L@Te2 O5;$jgpamO;f 3ż;3ǒ-c{BSL -Ԛ&(9@3cv,.\~{'$w1~6% po҃eng_GJ}uk3!4>zcf."iDDD^Mul*jTWfvR`Bnke@ۗ su#>dpR]/3;IݘWˑ8zJ'=_uWZ/WnE?L&$Z-cـe?@8Rvu]U(fw]s2a'OX5.1 Q80wl mѯp Z^ ߚ{4NohsF[W .X/mQךj;Sp_xd1e.nǯoa'GG&a9TP[[5M=Ӛl6BpmTMjRV}y>}B&NId6L3iUnkK][w) Bo3W'R¶}'PK4Llc2OkݧW,;6`HTU.[eYk_}d8f ^&TՑ?P즱:]:&*aOeq5ؑ6!?ӒEDD/;|t\u)r(#ڭVOݟJ~24NG'V&yei7pA dTc6 Ev[0S;Usѿ,صT{8½R hhhhhhh3%0e?֚vV=#Ge׻Sv}nq3?\liMͨ_jv-5MHR=xi5CfBGJmG9>0vGM)蒹c7?R2>5y˳K?7h=D"rj*;Rh#pZ>l3Acܘ.d!ib3!O:\R˲O5 -'Vs So$ EWc~hqz;$Z.k֪'t_*`/oieF?/^EZΉ뿟Bxz?833tu%}}} )7ѻ $pl{p[ d M\ĕŢ$ ^g@G;P'Ŷ~ mNiM꜉E~D:g*+^vȨ$5H1:ت Y@,L`!m_4- Jg^j m:^ `C K====8y!Ҙ2/sOj}-53y)|s*tB%G8^]Fy&L}{ ~%9?I&!768OM7qϤUVJ+V4yd<#dCĹ =i/re)-Gk5DD k#p=I1֒nBEάZ̚{SHdW 7Y-k\2a)X/\H4:i$ (KRr&jvm `?z;t +3L%o_O)QU*k优˥r6D&v%^FNB~A!RziC cؽ+M#Bvem[BS̖|5);S ۇ`B6>&BkrEˏh_b lŪ4vt~kDwK[nj%:;; 0Ƅ ,4$Sq"dt*+#U1ϥ_o#v\'ͥ\ٰfP TP8;uw4 4 'O %sIENDB`PNG  IHDR@@iqIDATx[oWvu|:4F!@ DV@ @R%_x⥈PRE(kI]f:Duk>;s33{wmqy<3̞}]׌s"E@4"ifs7*u}4kR6]>@ KcraǍh9Aa|ioz}UPl*.9{JKP(d0gM$x'>| xU oO9Ep$m:+QQC?kt9kC2̳h$Zʏ͌M%@N8&\Tx vK4`/pJoinls5 q8=r$)|^C7P] (n[.70ɛߩx 3x*) hhVFdW f`!Vnre`gU!l:g"u_0 tk8yLũ^7 0L`]SJfEQs"Nox^Uq0#yOcpԛW⼮f=G#^TxZ*< y.b#"zV!z/~*NN'= a,E1"26_iZJ[w\q?H{6#o|5M-aZO`&CuZt+*1\t5H<б) b~@{(&FVt r|pGq`foT픛!Ӈ'‰CDT&9*4J!^EV `khI HQDIg4pcas`-0& ꒀ 7QۉHn%$ G*<2ݝ~{@ϑ<=%#b~*<@o>֏&Hłi!]r GPk\`2EEBrC+VElT}%?'VtxːU|5;-JFB#Dk\Dž_X+ieCu0R x}^DH  ׊g.Z0V$HL3isMҵ8YBi &+ [iDC$.9>w9rs\!CÞ2MH؍hH\Xu9 "hRaOħ>j}|k#}{:Z2 BEZm+sC8(muH_6x}+@ BDa* Ӆw;Ȱ86BXa(b': WK筹D l +3Yf1镾 J.j\^m#mU|{&`W=<@4TT [__;s9[`,T# zZ޿9 8؁9D=M-A]UVz0. ?C<-ª|gY ?o%y)Z|8lc{ƺ1{)d2O\9jǝg+;e&s)_}?eG"1|6&L׾pupY7)G М=)j)MQ( IENDB`PNG  IHDR%%Ş csCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATx1J1_Tx^@@JnE+k( L1 v6ayy$[,(P@P!UqL:NctN#G1|Ơ젯J 0VkQSSoOX%gaJv_XTQ |%~pkYizj@J5-K5FF9^ vcdr=>X᭯9us瀪TrA-P@`P!Xv8IENDB`PNG  IHDR%%Ş csCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATx׿K#A7 a BVHvLa!vbm!ZYD\y)XyU-XE @\I63ccCl<.yaޗ]U0caK$J$J$\׭qLFѶy$IC_8&{oNeBzwsnm8LjR*Ba^DQ4ygߜzn;tʃ[Bm{_K0[Vk(q>1V4mc,8Bj2W*|>_4mRO9:dRJ5~5\46@$J9 \n)0 /I4oBalζEQ#iL|R!n>!=YuQTeYuW$%Q%QPIENDB`PNG  IHDR%%Ş csCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_F%IDATx-KDA]D6(em&ALvA1 -&E(E"|mb2ɺoX^׽W99癗UӀ*BE"T6^B bk\a7h}U!J8pKBk@ /h` ǘW*a [w!o9 T#,pT`'Tk%LcXdj:VqM<R)xCL]/|T#+SLb OS>jyUؗy<3Cg޾,/~]"TP*Bg&+,vIENDB`PNG  IHDR%%Ş csCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATxAJ1'V(=p%(=@O؝ нgqeqW C'$7Ib =TP*Ce B(cBĸX1FQS9F>J+Klx)bL.pʽs*횤fgPCal,>}tO pMcY2Mj;=pj6j|.+ҟU/ڋRtpqq}i?cuٷ`^I{*Ce 21]|IENDB`PNG  IHDR%%Ş csCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATx׽K@wBKɒ!2-]t''qqkW:ծG8Xc H疵\i#4ť1j ro?znC!P P PEg]tGW\n1֚+11'G'yE\Qq `" N8&sAI)545u=y;z8fRJm:x~P( w'JWQE>캬jh3{)!>30 a3,ز̠LBnLD>MJJuߚF^!PIENDB`PNG  IHDR%%Ş csCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATx=/DAߵX%ρ'P"[i$DQJ4T hH( JJPl,SF[̓LfrμsfdW2)TJP *A%(x;109\#e v0%죉5| Fp3` /E&`*p EыH XʰQ,ཛPF,m5+!&jXih+uJh`>ڏ?8+}pQbYLG].m#EԅW=TJP *A4X*IENDB`PNG  IHDR;0csCl0`McIDATxڼMHTQg#Jp#t&!(ĚMOmj٢nZ +"!* E)*kU.E`ADj2޻Λ ?{9qyw7eAt?S\ċZgE"c]EO-󥸅w^瓴&'ވEn8-GGhExѶ7q"6I4X&- rދuysvU1FVVu *LN>~iӬs&6<٦3ؕ^;A&z*Z/->$Zf$3TQ44Kږ:ye|Q#D#2 Q6wT̅=_6-Z#)|E,?8aO mf4Io'eA5ndưILc#W,jJjp,b.zqYr$a.w9a;'h{6S?Ta; /Ő8#/6DAl:X2e61sW.<3^'kMLQH'en,d?m OLpeIENDB`PNG  IHDR;0csCl0`M6IDATxė+Dq^Jy$sD^Ê"b%"Gbo#yĊ$ $#Rv#E6Ɍnc{;N}iU?,^> M)ԁ2 \# ٜ\<`PRH{ 36L k018mhF yPh81V9V0k_X5fy`4?8,3vX8 AZw÷BoDX3>u洹;@1nzaɯDPNҪSD h:-: \3w+l:MFi%ZU.-.2FcZ2=o3+n_-KSeZdtg'"-LI$$ "yXϴ y+L?; ^K۷G?UɭÔIENDB`PNG  IHDR;0csCl0`MIDATxM(EAxRlVQH[ JY(ʚ"("_ b+Y([H39;sgy>͹ι3+b(EW \Z Z&/0y,~VQ/dVYIENDB`PNG  IHDR22? pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATxڿkAϙXGV%Dm6ֳRVP? X䰱L (+!i\ܛ=}3l( C&D    cAj9ON'H= K^Hu!f8lB3mѝ( t5g#y؟YU¨VY.i52֚"h^;Wfhe>k@Z/׸: e/+5RֽIY6f 6n qi @ƙ~_y~@Ksx>8fxAboh =x4[Uq/p4Ώ5kx3XTmQvS&s$M%kЈ?$@$@d }B^<IENDB`PNG  IHDRKWcsCl0`M pHYs   cHRMz%u0`:o_FIDATxA E%3X5 @ 31Fήn) xbgMj%bm6MzE=dN'iɌP&tH.-=O _堡_~lϚIENDB`PNG  IHDR;0csCl0`MIDATxڬKlQg>Sikx&%Db#ll<6.V,Q"ģ4B,e DDGhDIL{;_z_2s=9/84H,+ *f2b ރ6cNɘ lx$ fXfew1_#QaQˢ^ՠCi/RogepLuQxFD'[Q.sPTq_Q zHڊzNN5CfK('ΕB:0<S/f12"\ʰxzU6ql䨇uD+xt$69C[I`'1 &fwmTGx}~Nɤu~{mPoXvfG_}u}I8w8O sJjp1:Y̸~@zp0։V_`jb#8J=Jh?%eçk-X W齫w})~?maljm?϶Nzljh;v[( "6.M7W7qהGyx0Y oW`heB:c02[Xs#J y64,/> _AObdEQHSuk\9QUOLQdGHH $=w04@Mq,>4Ϧ  ,\北,:eA$h{5XtIIENDB`PNG  IHDR ֛^?csCl0`MIDATx9HAM), i4iRh#D ET;+- NVQ<1" Q#(""RH ;CaT#dfۙLxpЧU)IENDB`PNG  IHDR;0csCl0`MsRGBgAMA a pHYsodTIDATHKc?@&(Mw0j1tf1S#Y% ߿zF(+>M\`4qQ &. 0F^n`b:W!!e?IENDB`PNG  IHDR;0csCl0`MIDATxb?@a8?Ķ8 x1)gb5 bF<6jCh)Y I@jG*B4r!db2Lb VnZ?Hh\pǠ^\6Z?r8->Ո ߆F\Ej\Dh'1Tn@](cPNŠ4qka*?]@C^@Hy@OFvJfadC҄4CjHEM b bMZV* ˀX*BhZg-K> ]pA-9P Z nqt Oto`mmˆ_IENDB`PNG  IHDR szzIDATxėYhQӘ ֊(.>XEԂHA\@A}>(>UZDE,A((PPDP.}[Q\".ߕ`$;ʹ=Lf̙sOJll(-a>tsfB,15opNuJbO' 6x97!@*l+":xw8]3L5Ec$(-F8z`!̀;;\Z9?蘈tl_*tOkLaL1Yͺ~$uDH́a\ԳjkWE0EjWEzޔV{5],x<"g/ä c5P)V5_$ z#.|9d`Y$ :X@dʪ4JOaބ '|E(pZ\AǴ wߎ ~mƶ"ͨn0畾Ȇ(>%a|ʿ.׊}9`Wl[u4`̅Ua jb*} GjLŪUKަ~&FT=w#sۭZ"v)jіk uNo&m[D1~YjʱFK-'WWdK*C=z$%kR[car θ[ oߩ  A2_"IENDB`PNG  IHDR szz pHYs+ cHRMz%u0`:o_FIDATxoSUw:ƶvs,EQ|7FHF"S E1IVbiCGP(mKz{z?PvK<9s7tz`,e䢤9 Dov΍H*>$0}3S;e":_F}QDo8BxGrkw폖la{bv5tuLI$ɤ@q*w5z,+̄r4.n;}9bj;1IEۧ]sIR87"qy4In\?ɼw$G#R084OgwaܿhY"9aQcCruM&OIA-g:p A)hv!Otgu_{6_1užouUּ|y]2F^`sGѨ}) 2o8%lg?,紾ވF.Jl+c~, ansʘ.Y2*ˑcFweEN)\=BN)[$)tu4 4xqO? "tI/[>@>gmtV۽OmO<\WN`?.\ݺx CaNXc 8&d~Krڞ࣏ {Id%ȄKe?XwIF%pIENDB`PNG  IHDR szz pHYs   cHRMz%u0`:o_FIDATxėKHTad(MTT cEZdeڪQT&\댠"Ǯ&e$)H,+`X44is.8as{uH$B*'xm@. dct-PƿmE4l=[ .3@o<^sKK`q=@#@ PEGwk=1~Tf QѯH.Ц{9̓Eǀ8ཛྷC2`L"}: O&xnHX y-1+PVnGB'J \K *[괟J&E%g" R0de(QzK.Y%&@һ](9Ow-_ҿIɋ{~.PJrHiqOQ[=+@ # }Kgނ'Jt eVq Xdk6C7$AeT4XbGד`Z=P {%۱[#cˌ|4n&$ud[&huZiǁ˶C@TZiu8 J6dA`s(hzn@ mRSNsɘ+b¥ƪCA뫤iD(hްՈ#N+uA vH #"%|V`,T .NS]{Iq?O?IENDB`PNG  IHDR szz4IDATxڴW]lTUݻJi,FܢB[i6BM(Ę1}1$&@三C0&j+祜]<&1ɔ?-DSAB!; Ec4OjBJYEMO@ZKdʡb:w2d`lOZ L|ݑPWPRRA^r3GD]e1gi^gGPñ;!` =R3t ؛GaFѢ2F= lUպ!e؄~+ 3IDBEL܍PF)n`Z[f r,->H,їpbd1psJ0;eHMB /Pt)r{#pZ͆7-9T̞xޯBîW6;vzK|^Hٯ':?lެYV|x9v ^*Sa9k ED{&vp;,jZـ2=ɀF$ DdE}1f*k\F@c5/G*J# дqw!{EoiYgD`T[ )zgbVyCrFV}frFrQEl#ݰ=Kfl[od 1+T'eCgw^Q.*JVI/9c1/y5 UR]3])sc ؘt'jLf <|[xMo}Vm4<[׵Rm`Wd\sIENDB`PNG  IHDR szz pHYs   cHRMz%u0`:o_FIDATx[HQٙu]o鮚"/хD>=DVP $aQDdPD BQDijro꺺VZE8?̜s]JN+,= ^Gqvvcxd߬L Xqt痮Z ]Gvى' ^oʱx~+@ >4^ W,c()fGH)k{y^P'&PTt @=~@ב BՆlff2rCGqvum U? uMt9y؂lu`ERO~076ᛘ ~T]ϸǧh23d~%U iisF1PA?>@LnNG"kaOL n&6 3E oɇNJ ~;2؂|YRRitlI%C*߻x4B$"i姂7a;濶>X#fzdo R%[r?%t?$ Fz=Xw,<07j÷'H) d!UV_Q1`*2*uR"RrR6zK\vjvCW^f/9C&mx{ O%nB[+4YJLaizb yp|/[p 7f+ sb{ SmIENDB`PNG  IHDR szz pHYs+ cHRMz%u0`:o_F IDATxڔYXUW1f2ѶR …"8〚NqBԀ#Q@PCq@d@PA@qd:{}{V?/uWWf M&0=BF05=!J{L_;~!y4$@7+Kٰ&UKxڛ_< ͯAܺj05C'+ycȁO{ž#r_4 %7[(%ni푸#if"rŅMOj_#rn?e%`nz^_㡬 /"F{\nIzh4RVd}s.5NHfjAHk9D^jbPRzO dWdoN zF2/w3i n඗mlM57;T&Sv}iZ LK̏%}`A~/Sc-ͯv, DA><Ўy$q67]"6rXH%>˗58c ƆOCx8(LvpLe ov`/𛿁z" 1\E2NrM@?+U'>ݶ? K]ή.0wtq5/H{_3 DfhGR}3(P/%n+kY&ƁtPV?yL ӏ?:̯8O. ʏQzYi `,p:iL;:%sV@=_ c+ k])Xڱڱءr%=-B.jbQͮ=9|yš*VxCX2ұF:,\B2m ҈QJJ|dzdsuF+ _@Qꡔp'3 k6'OrV.!j^^W A`uȋjx;pDEb#᧔5 *vwfPƃ ʮ&& : E_JnE/@l9O@ͺDP3RƤߣa^tHZ#aNHg F2 ^ʾ8_-3 rAٟJNP& t25_ʒ<0W^Z xM hL{+ TlvVmZMtm(ϵBy=07H#o4hSʹqzmuO XL4ĝaP:9ب霠^S x}=he}rv+؎3AR,Sv.hs6" 4 q,ji^_$(-Q\JxhAgO/Jތ?n[CЮ^Aʁ xeٻ N'A>4ߵitFF$nHƺKBl!`jjKg'Ց钹 ȸ2|E=w;G9Rm \#EuᗔĘUJ?~Z_w !{9lt`wS(ZY6 ^ȞNi'֨-ͽٚ;@d KtDe }HV}&JVHG A2a5+fe?,`ۖ&+Qەթә&d@2ɤa(9YԊb ;K?C2ȕ3"|ΟX:`Wv"hW2@q'K6,R{iwyk4(H%h%U?Dc7Vva&g`가j%G/%zreT7/v>̳^lF`Q8Լ`kr,2@( \KAki+/x"#wMt*$~H\,l^E{Zʩf^:خ $۳q-(2@+*KK@\О5c?,%8dB%aA@Gɚm"_"1w oXsm91`q G}pąmِ@?f; cZN|v"[~Ug&DR'('7n4]ѯװYUl [F,, |ډ8Z!lˆd@F AblՒ,t1ӿVS'Pﬤ$$I>!qEI}Qjz ˝I dA |~Հ /ܥgn0>| HwjՀl2] 8ow^nj`x.`")ttrA5~8`wKQ64ښ8<bkO!-;wm^O>%h08vWJ%r4(ynU{8Y YQ!" KK$'yշ–2'"uHA@{xS<_ ]$xk!YQ#!o@m+ME^~#_ >kZB'xHh01 ~Bܒ$A4" 1d-PY|Ehh+`J@4b@&E6>gV'~01"1Xo4]aa˒a+}oĘBOm6*PzR ,a-[= @r\hx b,ޭoP@6ŨuE & *2iSv$ d@ăڴ"E-o%?"V d0 $(n.x |=z2[ס-ȟ"zKSsH"R)Ͼ}b[1 ^= "QxVx(:?9رeÚp:, r*%Gm]! Q/U3_xCv=qTj ݷNiރ@>hgO.%N_ȕЁ0ɺ "ԍ\QPZ@ac5Ց1[z=6~0m*~ͮit;;5]I',]|?r!?? Zgb |C¡rթl`},@pGըA-  <8~ϴ sp.{p[sPlۢ>Z4H,IJG?\I7lD\+` xs ODnn`s̗S|k:=i6w215g \~3 rxぷE9V+^SX@.|ehk"~1($:=K+*BY͵ ;J4;e hK\`Xmp^CjFh!mp޷(eqye8[tn&.v!1܌ޒ hF^VUq^9i[ڰ)tC1}*ƨ1W$#)ޫm&8jU%냈@hScUncMmlLJ`q$~i>rl}R@\Oshc\uDb̿uJ@AnN)'5WOC{{A2XIENDB`PNG  IHDR szzIDATxėYhQӘ ֊(.>XEԂHA\@A}QD|+ .)*TEqA h_VKw.IN3m|79=sܓl6JKT*U蜙7s8:Oӱxߧxae Pmͬ%|v f^t09_  wa~끅0@pjc"* i~>?a?00inVI.&sPl{h| p`2ZU7E/qD5ƻjK5ș| 0)HX"`{W HވK;_k{ Ȩ#PnE">+*Ҹ9BSG7#H _1WPQm(]cE@F[0qffi3j7L/y/)|4c;aI/ |bar,*[V%Xs!|UoحaJ_낫ѡ"kjՒ))G߫qUg݈m܄vx]@ZZyB#8^EupL_pVZrqK"`5Yǒļ`Aq}xMju"LDawi;{OkYY%IENDB`PNG  IHDR"":G csCl0`MIDATx̘KHUQ'^Hޫ ,2%KB (B(H&l5YEV,F`%2IY4=R/,OyF>^Y{}:ӑeLd `3X r }p L>#G ] r )0X@?>$GDU`tcGh!G%.8b֊@8,.Y;FHuA>MI*!-xCwAi "t{˹3k b# 1C5">{l7-}%0׀`@gɒV2.Vq&X/PdQ^JյsőL'X ;Ȓ.epX>0;b"m Vgb:'$c)5st^ڞHw*4H8 VG=2rh{FV>0P-(֯m)a?g<%xGȐm<g:KgRsme?(bL).coIm;3~R"%R,g)Ѡv0"ڶ\+8- .ۺW+ֶ+RH"`L[mS[ҹ1!uڶ69cV<2MlTofcd_"F̘XH!mM۳޾'8!2f)f"_vybaIM{gNkϬb)z!&gamkuv_1ϭrx oMxI"x~h SNX))j{]X2ʪ8gSgRwT҅APB=}tiYrf%瘭䌳W% &H(,W#s5YY"Weg9,/o^GIENDB`PNG  IHDR"":G csCl0`MqIDATx̘KLQKEDAHbjbGb|D5 ,Xm1FэDkƐ@ %.>"Ao9֙;3mI<ɗigszۂh4%`@%Xg;<wA:ߎTJ-Ƭ" ~p$ xmS` %`N5 T^cJ)6"U`S \}`b4y΀ՠ'vUDQa Qf2wԻ)u;rD(z*Pmhf1c%y1J@L}{`+ 6V u7yҵZڊMJN&^ 3Q'Pʭp6:IGԯX2*NC3i;ӑ,VI3r#aHJ|1'#m6U0(7y}=I*9G:h ce4E+)3US hĸ)]/mX1JPFt,cNLȟLIIۅ%*jr-|, !QQ8ᓶ"Jj\:”EYIm82k DmÑc9wdHEfFk&Dآ!h [EAr6DZDT ,(2oiߓF4k&SE;w{}t{ͽ{-Yu6c2nv&jRnAZ1!+/|9"Jgb\pe/"vwLSk=pC+7b׉ kNx>{jDRsFUg]Jkɞ']doZ/s$+"wVw#w|qҋB’Q(/6ҹXJC:HH2D ;12fZH]LxmO< +RGD!7Md:MvE|p5iS!_PF5V0P%B֯ 5ePpijjYhsmq+ t'Ck3*>vp-C. +.8=rq mpN|)M OuQP}W[*"H1%׼DIt=H:սFShe.;%N@R;Ec.߯Ğg 'f=K.ƳD;^IENDB`PNG  IHDR szzcsCl0`MIDATxbcX0xċA6Htq@;W@6 HBml Ud f0?HmQ:`l"XCwHbd@0t"@A2l3@QVdHbd F!11ِ!یhduhdA`a^IENDB`PNG  IHDR szzcsCl0`MIDATx1 A E3lѽ[)6^@+;q,!! %d>eTJD`&.`^̹5&X`- v̹52$=WJЭՑ݌:}n,?0_|_*l -m`JЭњі&ad{sk$ 0qw[#H@1@` }_FiIENDB`PNG  IHDR szzcsCl0`MIDATxbcX0xċA6Htq@;W@6ot5:xP6f0Mf01 0uF0(LpI. yl3@Q3q, &E# Pe4A*?T=9d1 m:`m6H YPQa8IENDB`PNG  IHDR"":G csCl0`MIDATx̘MHTQg&>w΢PL"b2*(ڵtS*djWHk }P>-h]?z3o^q@?{9/fCKaT2yݕJn_[ө6'"hPS*IcjL~_Jf5-V>e8 (fD[n NyVqh &HQ(0s'*z 1xȇG6!Nmin)ڎF=VәLk߃\1>~D9MY%a &_!J>%AD+po>{C5,1' _$hee|>}PBDb1LjF*!):^]6{.av˾Pȸ P{۷#dھ#%2!_e\'`vL˶6۷#dRs*~r5lߎԈپ#bj#G9[D!6oa2| 9}|/@N PQ 6 0o۰L}2W6i15eaֺcT$*?1TcdzԱnM\*^[ f`'ALG91kFkcn܀㈹0su߬m9ϩЭZQӮ3j93:ŵ.Aם#gDLMkDDU؟%FY"Gx B~IENDB`PNG  IHDR"":G csCl0`MIDATx̘MHTQ}SJf YkE!EdTA_DLٔ6Y+[@D"p3R[}Z$4.\ޛy̅{sysL&SQci!'6AֿGx/1|5g4_c.Qxl UH,tC ~k9u`oSԶY8 "x"˜-=r"9! %;ߥa͘!XI8 cy \A yðD<- an+ԜZBo!r+!"|i5I̍ "wd(f`rY)1#"]}D|%#pȜ'gnWޱ?+0 Jk EU? a׫#"I{OUhjS"\a|t{D'jLL;SխiD{` v[Ĵcj4w*g;!1hW8X  =ogTV0ɠZɬ3Spuzns-Hc<ψ|O46)~Dۙu-Qk2`!N\`qw \~IENDB`PNG  IHDR"":G csCl0`MIDATx̘NA9"DDЙ= 1jg%i6bb##Z &vFQH-ݮfͮjyy$0 -@s44N_G7OmodImhJrC9*0f :vO;"wO~JڽH2JIP=@qGb' C>T2 sV6" `?Ic*òفB AB4/1Fj[;YcҢ4v$AL &AbAbŸjcdu1$6#U9,$1#yzL֠ i]wj*hRG AXg_uh˶C|B5!j4FC-BU ,uLni(fQe& \MMe3tl܀F$X-yrs-s-1A{%.=Pa )82IENDB`PNG  IHDR"":G csCl0`MIDATxWMHUA,$D%v+Z%"!"+hel#H(J˨U?Rg+SfEDF+E(7q{{|{gΜ̙3\u3Ay0\N%k" E3KH0@P\H'ҦU#Ⱝhg5)Ŧ.˰b3 l;$5tX Umۀ(GImV2AQ.')жcKk!}+HAX8bw6 ^[5A& ^$b: FkH  UE2~HV ٔ,ƛ?"XM;! wEm{|4c5[Ln)M]g+r8WΛ/\F=P'&}L˪ǹ[spbj!Na!9ľ-v[Ip{a;idZGKF˄AuS|>6O78O~>6;gRnc+t66f֖JՄD$N2x@5OE/Գ\px^Y ֔f$2Br+#)$4%NKB̄&hoY1Q2XM~GY0eY<󒋲{,_f'zX$W=RIRKT'"F9G]N-62NߎY՛Dn#Xo¤9G+{sy##ܻ ަ=|s0)feL,Hwk/=~'b,r *{Ri+1wOLPtEzVךz8*;$kHf3p)6N SiS#^IH'\2s{ -֔,Zto5xNIENDB`PNG  IHDR"":G csCl0`MIDATx̗KHAǿEYDYbVDm-_h 7=.LtQ &XIe%*Rk |Q5]$0]?8s̜3gUUU "Ww!C2Ygic[z YA`]ˇ`A۴!-._q'`J*V2f3 "T},t6PQgj"#iD+A 4mƱ9ԵŚ}׀`lo9w,  QaQX0*𨫈][fhK<ϛ/.C^bFCԙ9\wcU~f4.ֱ4M8L@%*N|0b+]ipz劔PFeJ63(H!Ru[?qs)`Y8-5$}Y`Rr-5xl@6D[qw5-lfl' ʲ畈 GfҐw,;t\s<'7`جѿ^Uƒi%"Ck jAiJ~JCCrlzE kϾ1R+ )  ^J!tKK-ϴM_t]Ŀ=L:«\1*??I }qehjω$g>+'c|83hz!Q&QtguZnMC)oWڶ0&M0X r!̲'xicV\%'٧JaDudjKmωޖFۤ3Bb%Q]?@w!'rO)"ND4bf̓&2F&9F8’'hϸ^M CxLYڦx(UaT& 31=B h=G@(3y/jMd ;֠$A %#X)_--ˈ5m>Q&˲)KZߑr>k *m3zp۾^Y§  c&B:W!>w񟴽@$|Sѧv<#$H @# wde d&a;0#pD^|Wt j+:ڌM6 50 1Oe_A u/R|wPv< 7GԹ-ED,@#F=3v V ߹lN!qxIM~ܼ)EϝQ|0րW!]M\F[#Dx6[vB.XʾX'B-:h!d(0Y˱ͳ8sW:AmK!]j+ˍ΄eG|q1w#`W}G\zUW]OT6iJ,t5F̖f:oJI;v!nscc7BP a|3!CLfVW'P>~6vyoS[aCDԫw7 ~E1u0c 9̪4TMjoS7Jk?A@!$辗u?k?|4ߠ vwȟΚJ> m?rF9_X-/i'IENDB`PNG  IHDR" wcsCl0`MQIDATx̘MHTQ}&I¢E1ZM-RU 04H]41JP4tY I.tFE~/\sǹwޝ{oKR`E;y(LV98k]f;W<8b0 '۹ -ED|8&tBp6)a1sO1=wBF-7njlW2#rd``Z] 9+XDY'B-BțгΊb&_o1гNoND\Eq3!l١vCL,"t!ׇ4q_t޸mdewBx1bZ/bܬP޾ AecQyUDq\3LF~O3 j4~q 聗~ ^F*0O6fDm:/[|x/Ɉ/K`=]|(IENDB`PNG  IHDR" wcsCl0`MIDATxbaL&2Y T̗YHTǀX;& Ķ@XHtC@Z@|9B$U:dD.T/ROAC)p65FCبXi uO IM &5DCt#5/BPJ_jbuaE V$A C@gCA  >C-tB5H2hˆxC[j=@,@C8Ҋ$3ZXoq).A BƵ11@eAuu ӡсFgjLzŒL*'ICduC {?h0IENDB`PNG  IHDR22?csCl0`M IDATxZ pT<6!" P%P0JA }0Xtp>Qc2A,N+MKH$D !'!;{oAr]`2rvM{w( 7HuWp ߔ&Achb(${7LjħDzu+bKeĭW15o篷s_%>bKć\5%2MJ2b?0FE[fx@CT}}qp$rk#%e,VzǏƟ`U&#& 1>ΰK$P|egzq!L` (qWӊ)HXe7^mbKMy٢ K1!IC.5skt\OnU1n?Kǿ ;bEk =i31`,X2 {Y3ѤX!.ژQs2Q8V7 PPWՁ(UJ7yGa?j.aўRHbY [)&9Dfkڂ5cRbW!1SZUv4t-Z#Di1 R7%:3z6Z-2)Q[05^&އzUάq8SiX vϗɎ^G':|/oiLBK W} Zyz~Tnk_{vsHDSIENDB`PNG  IHDR99csCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATxڽQ0W: "@]*ũ[GH CHbEQቆc;0MK ͔8^f8]lZNfspVbs- )B )B )B )B )B )B )B )B )B _ ml[7 4Xo+Y 40_nk5xf,B? GC_9v_kҥ!s̲{AfM8j0wa3LyIENDB`PNG  IHDR22?csCl0`M IDATxZ p~G '6 H-hVSVm::xxSǣ2⠎-#c&&}nȂʌ3{HX ?d>]:?Z,[l0,b.1%I zv&"~"zJ >#H#ˈ+K8%Y$QL@LL;įVqxxhcB\Cx4Iďo])""VxJJleӌT\W=R#=0 >r@K@V|e[z6&Ό8x86kY!uѦ՝}H5K{FăjXQ@P\N}O1{aX uIeI ? 70fwᥚQt&#[,M#)q'2K/{D;Ad2 ɨvdĵi\/b{6kT3"y+>nz}Md&nkEn22V?] ˙b~ I_8;O@7];) ށt/Tː^ ޠLlpuR?L iy{/服"',"%MV/G"XJ|$r9xUT:/C%Q]F# KeL ) HXW隚]Mĉv8r^/^<9cAUýÉ􏇌`Gk{({Eݗ+soQH(?,wF$؉RxjhlDiiiz& vϸ-Y4;T{wAJ͛pԔdIo1&+j[Y,~ F Ǻw$&Dd{{%Y.7%"*D-棪 |oԜnn.B"tr rHzC"";S |c:k~gp.l*]b4WiNI! ٟBd ӿYh4 DE"J)EZՊ93Z`XGA\*KB" @z.&D(zK,gؒf=F;+.T"Ū.i,CvR!d~K88ǫbӡqs&œ0h$7X#V~ۋ@ gP( [:}'ty~TĤ,4?tD}W=if]sp.t>#v}\mmV QXX"甠V뱂8xXzhČiFi'! ɪ9 aסZWKԆlգ{'^Bqθ(4o< DԓDũ׈b)0@@+iQ\ZTɥlФ?&vJ'F1J!@u %{Ө>xS>G:5 :VELv]|8x̍ue 0{L@qbqMI3d`qI;)6YUm\9?KrpԘ ͕Ax k,FUQνK6GkfS̟ D`[ڪ#qIENDB`PNG  IHDRTT{ĵcsCl0`M2IDATx \Uod'PaSjDYPdqL%@H v@ť{TGtȀnpdD3tøt(]8XЕ@–_sӷoZk}?TWz~w;krrRBlBBB(B(BA% *!PP !PP !J!TB!TBBH3f{msj;G{k&{j_ۘ&TB:='vkw>ۮw0l/ORP iw-w|]hi}'"f4!-nޫCemwkiso-mmvҶ/uoh;MFgxaGt*m(V6mG_kY/VsumwHy~Bt֯Zn0bJ]VȽ )/oUޭ64BRg⡯{R7Z^ˍA~bhEy0oRT )}KZu#jmg1(@>鰶0LU˹#SH*]~ *!ex?nlԍea@TuT]vc+]L)Q!m*Jrall R?P~_y'K6 9C“ҴkQP ~K񝋤I vyOobC%$}0K- +]0Pn3jmji>CwVL!ho叁JHmzAC 5mb Xj 8ohe ^+џPp@=JH{^BX`:wܱn% |4Fzq n~*3{m({Hܟ^iQܞZ_ӈ!e4w6Sq&gg[w~֎07_Z1Qz?gN*ި€VJ8dm#xkEKZmu3vaWi-M|B!ٮͪT=A}Y*uQ{5ꕯ|ejլTBP9f1s L/}EIgsʺf>9 *!a qaSJS'oUlT kO<ذ pxBM%cрuknS971/Nsh&SgOkIr4 )H Zx饗[oU瞕jJz!o&X﮻L"@Z6uV֌Zb:… 5\ziEYylٲ` Uj@Ν> ai=FB/"wOT]vYMSP!c9ƷBwJ.R)ɇE [űO:$uGo~o<_|'W֖]UUsJ!EA%5[*oV ZWt}Uw7o^*@$͢fXYψ[n=PՂ *'?IjժGjSv~?VxS*ޡPl7(Tw)k׮U>o<!Pt qV3.6)xmR}ߪuQ4 2')pSS6 FL}<XAIA0 J}U}c ^Oz{H0GA6E]*lj^wqOV"1+R|sQ?+߾"W_]e^/kS *!3 F?j2i*7[ng>n5mVkiS^)D^,UxHHu*E!0;k_^!*z8AA%@NvFhDR'-#ml}?(!=b6?Yj|Um "d5Ua`;|򒽯ӟ(oP"Q#ʛ.m[l迶BcF+\68Hݙ\/Jk mF=TҮn_C⹸KP]xl{/ U Zp/4˗W 뮕(V1Y"ASN9E}Qjl92 ̠UFڭ%v1Am]>?rmPF|ox~1 F2=~‰YK¿ D|$Xj׾nկ~u/SPIn 0!/uojPs).ۗ~W| sI"0>22-$-HYګeV.ԉV[\yttZ%>!"AM\+KA%k;^5HW*{b4u\ rs$ 3ޢAX^%ya5'8t"3uMyvd nR~ϟ?},k#x S4\Ql6õ*"޵2k&b2x94ޮkAL0"~ d_rc *j\.^T̍UW]Ίdn_]vt8 >M3y KF6WlR1S,@A%3\E"LJx}M+|ŮTy]Bp1Cy?yh5 TROxBD  n꣪E 殈iK❮k` ǑtiT',j0ub)H_k?7~Iy]]=TR+'{C*PӥüĊ*+WmFttωJY^pb0If0az2*F]!a K/ +n昊^S޴#W  .ʎ3p@ql-AIy/o_(8@yKэJAzXi!+HDӨ]yE!(hbyx'XTx) *1bjxٕl=%ZnTL7hO gΑ.mJ"_~1N>xRwK㾖rPPۂK{b"ff^1y9Rp[Q|wE( ,GX=rf,.q1uxb~U,B;(|^gJRW(6+`C8#"/YQ  kD( +d"dV މ>֢BҎ6"PtA+DJQzP?E0?I"a6#A fȘez/=SB($W>ʫe6)ӧ,M1%*I0GulB衒8mZbz Ŕz:k$~,C%ɽӳF1%*Sy%xQ,6 !PIr>jbJ=TRJ]`n4%C%U#b nBA%clB'Ձ(DIjUB衒.b BA%slB(z[ J ]lBZJ5H#t2}C%UJ5U1)!TR=^? J'cʑPPI ̵^ !TR[ yM@T= *sPPI(ϰy v+o⪿^Ȯ>!TfBwZbN'J|>KϵnW,6#! Pgj/me| m'W^SB(dsX!.j~O1w-;"PPIv-ӶG*BA% @OHA◯j>!PIqUtBŜSB衒 JRa?mBB(BA% *! *!PP !J!TB!TBBB(B(BA% *! *!PP !J!TB!TBBBB(BAMnm+k;:?+F7:nb>ނ#pRl 6)R^$mrFcx=Em) _9bi1c-r>ύΒ2NʹNMMGy{ bĬ/gXs9TX̮nٹp({l ڨ%bC+ѷ}St+k}>s#rTҊ̚lܜEKlJB׋4“w[UÞqﵺa^Ex 9YcW!peeֹI-vBC@7΀JPh񹂮/RfE堳lS}N;1Oe.rߌèO~vQ-I(Fxń^}ylQN<8 e aRm 9i\Wiߌ'^ t[[ x  j͘un /э xR*:Zh6/rjj}WK1@0m{%ޚZ\/ܴE5;-tIWtA 7mE^vYZJ!Yx~i)!EA%:c>8i cZgMW r>7^\l"#D1ϽQڣ6OqD^6r`L" 7߄ 2OwM5DԢ vRѡuMB JEc#j*SQRL"ԺR 5j9k[l3#:`p ޥ6[k~{UC0m&/w@SL& ݪ9Q}LO t[fJ❚0ŀ3o˕>cR݌w<+b~KHJզF-oRoy[! [œopٹbC!Sʘ֕kQG}fݙ]'KzuT3RM垆1QzS rWCT9jmfwكl5=oj3C$rz]ϻ⨃["gߠba>*3$!S#*/S5-[޵X)ѕ@J!XYYΕ]}BAAOu\HװlyIBdd5|y&5xK*WSq0Vs(H5)ӭ6&QSOoxS=Uc_(LkbPm>ȔʯBUIht(bU`y; X5I($/l\M*D.l{he+f3 iJ߯ӄڼ ר8ֹXbFMj qO@uU*FLMYE ~Nrf-(\` ĸ}CIq+[%Ů l|x+>ALj|!m S~ޑ 3Y+ zfD$x-~BH;0M@!TBBBB(BA% *! *!PP !J!J!TY˩~^ k$wfޔh%C1c"}wZ1V&]z2/Y*e@rLm&r =tzJY'`>[%BNM_z9z*mR;(V=6wZʬ%EK{#mK11EʎŽpAO{m/;jIM-m[-{jy-xY`Ibnd`e69nc1eL,/gaBm^\Vg|2:s1|hVM#-UPtAa}]mF gVuѧι`lxf@_l㉖~YxtyTs-)I*Ggє݇}Q559-tmKanߒzK$So,,Z;ꈩI p#"q l,:myk j}M g n"F8Fe,ΥԼ%B ɈSPCw!mv A li[Zl@jh;11dB^ 13p3s;5dc;ȀPMZmh1i\.d۠A2w>ۮ xFk9k%u9.P)1yQ 1T.\_TS(j*'ǝW馣33.ۇ Dy#|]0&JoB 8] iQXq3,Z(k >0@`Е6W*٬{zH@ 61: jޛ8fO@&lhfJ}7ĘfAy`G]KzPd"deʼn_%- +fX|?Iw`|?(5 J Yqg 2cO %B(rjwC*Y}7+aӸ"O͜Q E+0xX=r.˫fמ߂ޥ횦9Hf]jȲ:gQMXf j9C6A;԰ k,thL@կL#!B) yIH2@HOyI;1qg7=CN{dzNUq^}V5}~OkZ>5\_٧7b˛]3jge E5fxjzU6$QTĔ2) a],m:H$HJB'6VTS9ieMۮOK%TBt6E!TBBBB(BA% *! *!PP !J!J!TBBBB(BA% *! *!PP !J!$m7k{V$V=+O'&`d\+ u\m_b3NTx?i :Hv mmւn[}Jۥ56gڎcsvgmgzNʋesvTsYviSBA% *!PP !PP !J!TBBBB(mčF|Ӗ^m} ԟ'$=`Ln߈tzJ7+ƾd; Y97ĶX'#뜵IF/=K #΢,yvC!Gga͈u] e-r1ijO~r,xQ#jS9a췽'G~lr S5/N])/)&jF\xEKa}Џiv#P;;g Au "k{}B)(iFxn%"K6`m;ˮ?, >y]`yyx^ /rMϮ>Nރ {:` DKY]~زt NuGeKg9F:V!>N j*tlxpbP7,W lC\Ģ?w.ǥ;=/5r_ύh-9R`䣠vҦhuM{K cfL4a۳4]p"6yIL !nbČf΋:!44/qS\ǂ)! Sbܮ*3cAkV`y:|g=8̠Ѱfd;35 اb% #L$njn-HDtt3>:{WIre7E's 1.,/ݷ''"[Z8f,AeƹNs#"|_!+x]SBAa=T8#s'EH9}:"YuJ !5Hamx㱑9߁!*xF#xq5ȃ]Y9KldrmkCyHB*N3%[J\⽙VXAp9(um7K˪jXb&b3~gm,'c?/GJhT2Ay՛bj8m> OUD$S 6fdhƤAImtaAbR& ,pE<0/3, xʙ!jJq"R㭹7zGZqFzRE>1XUS 8:1m?A5qrW)U=o31a@ LwRx:/V]P+[PPK^]L,ZЗPX~2fGJ; C4Tp7P_G^ɡtLMMcR `{Rٱ~jlxPcI8ߥAi;[c^Ai}$RH?e>=?'I: j~J?YMTF/I{PaG-LnZ[2տü]ڿ߃_ cCi&f`Bdc$ T?K{3y|KբjiHCԞ5G5j^B]"eJe~_F/I;ڹ"}wU VQ g8f4:>MnΫ?@VB$8OL^FsbU$&ޙ z^+Cμ]PiaGXLZT՟Ѓ* Hr(3 Q5TFW{ޗA4l6`p9 ߔY{ۄ|H+[ׯ]MMB5Q`Q4bQs3-.J(jj  7)KOR-,-j/^MMBCL \Nɱ/! &~2om?? XcaIq}Z">x֊w{}J|#3 +Byg'tx^goW^y8's7v-?xq駋c9F<K_z饢P(#9,${Ra{(]'ŗ~| W*)X.QBahq7?:{XqE/ZCNXm۶kvqLJ&)X|/Eh~~^\p+2z\.$/T3PyV\8N#Q*{?(lqo~\WvGq!k[޼N<ox\g-yZIk5j(15sꩧWU(Y)* ַR*n^V?uӟ}3ϹK<}臃%1K† Ė-[}AâfUs`ewo2kvgu{KA^zOm[2a˚5k*F\5!{]mY?I);`6]Z]_|o[j px቏CYI'E ]PQGy.syXeuPI#(bO{/%, iS 8.l7xw-6og.@`㰔X)׮tQgz(+%e+I䛻ߺn,7*dWu=x;-ܲO8HxKC.@mVXܹs;->`uͽ{-4<*lbj AMqR?Ȏ XzGk{-:āmO =1n+^_cX5.2Q)NJh]uUsZ>}+a a&?ck׮%:묳|=&jDj.bVFJ2k Iɱ( p˛Cik֤5F>`*vW o'/oH=i/Ii*hٕu 1k B`$ܐ `]&z>;o/F`$lMJT++wĉE[dET X.sSǤ4c7 LEF2:&t׼MڗߦDJo%g/W?b^M"YL 0ZgZZdb|M|B 7艗ߗvLtSob1ai>%W`wCȅX}*['%Vd1Š1p[iYoR[ ] |gP_KܔfU%m,to/-WKNۊ(ljw|c_6_Z*pGEJ>\/Lr9\1$8W8}(>%}aZGPt{&k﷨٥fCy.&k|a;έZ9$ϥ?]W-%ḤLjK+SRA螾Υ q'ee۩LګQ`wMSFoz(8fk}Cx_9M(F:7G"*/P;՞ ٍ" )O6O[S|PilsE PkZx5&!kʠ琐xOy;뀄t5y j11E8_&/·C#2D0nI 6X8Dޓʹa X'mG|>m8I7&xg뼎 ?1-}z R!oi_׏#m;yۙM1 Q 6[ aLe9m'PS8{ }uT9*$O"SᏩ9b5 wuhVE598k**iDQq XU v@` X@2'SԜ`$1ZT1XMxX ~ X`Z4$``3C9ZPzC|]H $5,_5H0)>UXղz H ߈$,gRoBr4 AQ-T9IO,#j2|W;I X |~' h\FQ8\d@Q~n$ )~Db-:dxX *[,|Ia qYr ?IU\  m'6 Y $h*`d @-7zMnF+ߖ:z}$ׯ`\~_6d,WXZ^%mI1,5&m^h6Ja9W`|: 4Q߷x}y汻T.xEjL|ҦlzxTEpC#ڣ*[<">KtВV`VoE,x?  xYTST7 Շ:zT㥍ioCUc<85;G{vʎгxUs vNL v_ z1[gz48*zخqtaxX0^!XgQ~l)ȍ1\b[ųh 'V')L-AjiZT=0,l2*;9tay^ KH'L*oˣWi@,e0*9vhS+Y2WѣV;_Yt%fSHO.XŔ[T8`[Vuxau^ż2bjN`H\~5pC艉d43>՛Tg!ezjy C25zFdӣgL[;s4ilWk e6Ŝ܅Cg9ըp. lN [ 8L:puoz*ϐ QuL-5E AЃGCV :MiʢiQ! ?Gnr+L E9 $ݘi7O%!AzjNXE7 ,`٤l[u`V-9`6Ri ls0 ߑblezX+$Ѧl~k^LɸbʭCl0^#3*G;smJrؐxqrOzSkNL#ۊ8^5#õIҔ.qKߎ!di1!*p=)׉, V 9h\(A/IhCLΒ\bn{;I͜2Z`tok(PPLq6Fn;:J,nk򝯣 oӢ͚`.=iy3fr&~udKP:36zØ{;zCxV%3vGG:bh2ͩ YՈ@k=e-]:{,Vl6F]e)dMvۆՔZv,$j9 XlÊg, j,T[0j`(cIk4-0oľ#۔v i\Y-gް3pޕE6oƎdi!w Fnj+- 5oέQ)h#v-{l\- kx%#tStmq>,}9Rrx|W|Z NyôyEa%]X-3GLK,ﮫcHE6~cA:F&*}u  kg!.Ϩ[;}4-]N<"yz-og)>Ѵ xBt:%c#U~8Ygi+fѢ̈}G=`#4/-7zH,/Q[H`N-s"O턆*FxP\7aD:{9nbts|NV=E4\r {VЉBLlnMnXb0>Kz=#&Swǔ,b%:osm8Q da6 K,z(X~_.Y\cy%1[ZQ]>ٹQ@5CcwzeѸ82kː- gF*Qi&(3=c|evߘkuz15Q23ZQ@J)L L+7떣j:L.r dK<)U0&-2Т/}oJRDf=ĩB qҏ+s)Os.|`<`Ll&=y>e*LJxfy/?Q"_0~?,?kFCǤDaƧ GT w;}̈́Z`ZNnƮ(nK *g 5wDWQt* !ўG |[ʾI'?![-lgX414ĉ{a_:, o?eң) VB U5`(H+, XED=+-f/`B9Kkz.Na3tfkt/Myͫ`A,%Tsg@NTfmfbÚVm|܃Q[3{͵COkQmG*-N dV@۬鲅*Ԯ8RoF7gTdqi&!'`V0 bd[] kCt#Q+{=f@y!V,PAXVkST:m֔+01бb2-ս_MLÁ`l2YC2R"=Z eq15ޟk|׊g*yH B@yhX1JET,BuxRq10yOǒqqb|5J?@jA uAh@ Y8IGg*]6 uYxC򒢚Bc` |h5ҒOkCv`B Q():6m3ddk byiSK8=Bk,]ح$MO\Z\1ѓ&Z׭ViM4G{ͨ)+Y 7Wh| %Pq+Z0P LĤfPܨP _^U#zU;rBrF^@ M1jf`rĮB=mjFVR aTkQsmi**ԳƯuKwlZ$Y!u\Aj Lz=qT`OՔB9_N˂t,`@RM;,wƎbsz-ٱua{ؒI\/3C 5v{˺9z}Y[T4pYk6f(X.Q3 XlN_Z|뗳t-X W/s-h M;%@` X@`kIg`| IʂM$7 ) XYp1 , !i#VkHDž>d#"iC2@iҎ@r!-Y]`İ,` X,` X,` X` 0+',IENDB`PNG  IHDRdFcsCl0`M IDATx]m\U>"߳6GC"J-V)AEPDDwè/+Ƣ$fj[莤؂]'3s<ɓٹ;̽<{mtuK H  H  H j Y꫍Oe,O dVu.p, ]V!mTwqguyYԹH7 Y"%T!B-UT!B!ui, 5|y 4]hYO7.0Ψ͗/WQT"vcqs"q{ƕ_whi2xcBQg?d'W?[B5^v7 }x'/qAb^[6xx7.@kJ-jo .7(8h;k~F#2=oso4~q!o`)**n[-E,y視 @;=9q w abѲbM{M&@Xk]PuwӊK壋"+ҟj'{[zCp|:oqAi 'P]•. B >0B5 =# K1Z:I|_'!<_V}zk$+9&`6 nٸݳCƅ >a EОXYڞu-#K{ҕ`R=qO/ob_|B=̻ZB G,o782ڏ@?N7^fø'4.H?Rgk q/9?!_LG!z`[1AZSH]nl/b;3Nm(H!/k1)Ǣ,#UL'sllc~@_6̬'x=$Tyu_~*o +La˄23PFZe0d+L9WYY]׻(j'P3$SM)]J.v~E . u$"Gy#ְ c]cq32< , 4k_Z[ +vqjkBdt8h@nrwd{C+펄7MWE9meT8Ӽﮩ yv>19W_Flyqql߻焤ì4tW1vAl7hђB7~!/PZ .%P >m ]ں3t*GFaBw$Tq @`[R UT/_҇8wcV# p -"ao U xjGQd-oo!I8`XԨٌQUH.x D Y# q@Au Rcz3< U+Tӯ샒PK(N@( ezp`LMJֹ`CY9 YT! ,ћ%6¢`ZE$TAPAB$TAPAB$TAPAB!O~*VIENDB`PNG  IHDRc9 csCl0`M1cIDATx xlUE湮 lx(v]OJ;}C;"h#`OMDPD!$(> "S^9ku=ԩ1U֗SSY֞V-,,8fT 0 0 0t SBێHx]Ny^ojs۽ۤ# ]ēv}{sB?a魬{߄xo?VY)zxg:vBo;{VJ԰Nho.:ahkޮv+-,}6{S~0zK}wZ,q?%ގb@,\/!&EI)mT$?܈H6ࢎ@HYO@H4owQﻬ{{bvQLpNBR3zrQ'] "gy6-@b>ᢑFD^y݊g0rrO5{}A*y{՞mMp\h4؝~b?s<2?Y0h>˜kұ<V -PNXwPXx[#ۥ^x:o6 M.P뵎P9E}n|Y? MDqv뀔ˁPFJyk^/,̺h2ۿMB[yM7h6@Ĵj> =wEcrJ˵cmF~B$b^.Z9[Ґ n)tsɲ2浯h񾶧H%@'##>Ic.+Zj!iA6E}XiNi/s2ob_j}jO$ mBJVr/hs;~oU2$mnRIſ.KP㪏ӗy{ qgsD.W!I%@+&&(Pԓr¿z },]B" >m/=dRyzt#?l*RH8󟣑Z]0Ȭ[\4FE),dp WWCZRQ,VFpQGkǺ܌|J,dٌ>O{-uV2+x{ne8E 9dۈ˪,7=(<ƎZ_[g9LznUahO d۫;-^XZ/i,h4j2!Ķ3?2˒Ǒz,anFœ~SQG*# ЕH*|```xtt{f/;_f>h iTC.Ns ~܏GS8E<&4,=qd Yݣ7ߜ:ؕ}v=Nb'-ueN_R_7ÆelyCOr[|Ffޑq[H}խXs,3o pMC[p+3=jW" KO#ɚ>P] qcOr^Ǣ8dS:CFtlE{"|CVxa{A`9z|^0*9w} \Cl=o1v۵ds;ʞW_.袍FDpWJ=Xw!:Uw0QI*G+#[neD"eHZ̓39ލ:][uaIoqoaÆ ;b_e.mW# ЩCg}܅^!ܮ~IzwlM'_qBv=.@&+)Otxℴ?-nx޻umaB5jj,=Z-Y0qԧvK0ł⼃zysfm֭[:([,GW|n0@-,l [a8`qo~ynEa '|}ݗn׍Ђk! }bp뭷}6T*-F }t*^pXrRG8 ^ٹ\Vw|54N(l#DZ}@?EsGAV9~byJV}79CY{ekddj6s~FU5ggKavwSUM妌5ǿ@bCTWSxH3 ͍ތP+21@v 7#Xv(U0׻a?mfԊ |fs/o0ȼ4\DᵒH%@+*h YCPE 0@+kZi3ͪv =j/y{u{4e`?cPE U ol(1@#䶷z{K!2))TY̺hH2YߠˆN)ɺIK9]>B̻}7EnuKb}=弝JB>yOݶ<hoqnvj 477IO+mg~z9DA|ޞq\%^k}- 4.2;*řUD߽IXԒ} (IL%>.M.&>ޛuò Y.}xFenD I\J=~g+ή-d~V9j( ,>hOvً]墎UؔOj3"VT4o{{ˢosv5>d%:~ D ,>9oxz!2DAxVaf!'yUG%Hכ<]40'gm*$Xn=ov^sdHXF|I D Rث! 7 -n(1@;r޿y{s˧9OK,Ȩ`D JdoxNU'yF9DARM{ڢD "dETl~F[uFELht+k}~:j--W2>.JVowMz繸 0@?࢕A!e&.{kNF }_8uRH%@;R[/2"FTn`V- בEN' =QT29RU.E>̀J@"XHjHf=xomVz]., W/V0 0 Gf;R;Qoz.UKb@/!ho۹M"14O:?].s Ձ0/! s9ށ@T 0d s|/Ձ0lk:T`'QjsJG6az_w-0ORTGuc3ݤ 19Q@6S +> S}R-D л`( V/ՑRIo=sh"]N1_G.ڌG8T .e# 7! [(Q;`%qx]4Gy9<@ӽTzmT .CƧ](1@o_zE+CzU D v ޾ dΥjnQZ&j%gcZҊh0*Ix DRRH:>}} V!RxY#|iL}|wv:aJb-ݴV{9&c._sPW8Fɨu!}:3U4S^HJTḔ$O* >l|ͼ|AxTʞ90NRZלDI8g PSOdDOт\s&%=G_Lv%o/3⥎m9;1$C}DS,kR*gm 6!*͘{PhqhyV`LiĢ" {m*~Ha"IVa+]u~(H`D[)Z<Ӓ:qҨ(&1W=5((&#Bp뵼}=\7b _ɖʂuo:#t$H'>5aJ\!T n~* E%M ~0vq?"eֱ66,B[}g5{?])\0s.;!pW{O`?MTǵ5^pKc̹MGa}?tN:_!=kR|[/2%=-.u,oOYhk4^a%hkPY |3d)}9ge"4@!wKCbWP}.᳕@Lѯ$gBڊ4Rk;ogϨQi*plʼn0@A'Ȭ*0xҥOb*tڔZkcQʈ9o$& 9ǸK_(g"1dRk罽O69ގ~~_~Av7Jڔ]3oKniHHZcL)C2Χ9>u-#&zn]ʘM+ea(Vynh{;^ezM_ǖ h~EoWe/qQEFI" +0k8VOZiQq1zHV8hLrN=K~2}hV-T'kÄqb g6oZ:8jصHij)>"% AywkKO6yuJrSDz08t%1*zm鸭w1VNMb[@ WFzU2g.֗&C~#頫}^s;> (cH%mIH-\6չU!,3avrWR⾘5k)?C<:e>AXs9 #(b- rIniESmz;-TE;[>)uFTiMբ~]-)ZVrKB1Pz'Iv)H&CZʾC`MZ5D 4,iѸQWE}c]ݵ3MgZeV|9|޹Ȯt1ma@.vۨ.ZX"yY-bv`.s,]@ LnyM. |XȒypzzUD ɞ.&+G A@ 0 0@qxUa"Q Dz@ @<߱!˒CU У0:RDV;^#+p[X[tz*4E-7RIa~Yz]%Mmy&ݫ-m=1@p]{F˴<vU9!Ժ+Ѯ=?Ǩ~tgFSZC/b6elws:|.FBI{M7Rb) &5}b+x[o} *sR e t ){ ,Ϡ2j9e}mtBьƮlzvF̤\kۤy?zZsܣ 8kw*ϴJni7bBntɄ N[4 " X+Y;cd`#*dx`=+ }ymM'.&3ZWI)r0Y0y}9 LHgԃfbIJ+FXs)8gaq. M.IL_GQI51"+54j,khHe֑<ڀcb1)3#Tͨ=60>ݙ&牏l #&JU?sh0yN3K7V-'s̋(녿]۠1dݎ \i3hJ߯\_|ٌ Cz Pb ]BCg&D?x?DƐB°r*y9bYńzr3>kp)u i0鲗(^A1xǝy t%*CU͵S69aPo¸&TlYks&p2}2V^O4]Zf;c{(J -tx V1皗`<& 8-)d]J[b4k1rQG:-i4kbxF Yߠ?9j9g>̦DNıe8 3R6cn ^Ih9[C tK^ɦTyzTX?!()|VE1E gAhBGtBgޗcp،M1p037)5zWw Й?w‡SZg2rvDS`6QaV\%=5(- MχG5C]G* c5stD%D s϶?Icp|abrN~0ǡ pMv(ni0gMB%-O%0Gb[{[2c^HX^V.OXCG<@Ӭ=RL%ٔj0fվJV{9g@g C^2S+ Xw1?%-bh>*}"vݢyӧ2вFSΝ{%D*u6X% u7QChŇ=?Ue\4'5YN{E\2Kc%MC;+&McbNv9֥N#[c!K4ÞApjHBr.}{O"<;^ Y -Ć'Z\&,ɻBnvs):  wKf:PftekVpUVXC&knuR,aV5wsjamvZvw{\ms[ϓ]ǩQE-+P4 ZJfT 0 0 0 0 00+Lv{-`Xv~^;XM=۩٠ET # Ңۃos AV{;Gmh ]6oOMf۰˽AuO-rQÎT A(*lw u0\@a@a@Vs*r^2+ͩj?'Vw1mۚsG(r7qS erhT΂~EsJAΫG|} @y՟yhYyl"YAnnV{$rv?h>?*W%~ȶfs'b Me# wu2L%uD+5>Ww\{nE zYр xz[)1".Auۢ-ÚRgo[yqn9[W(-YuqasE4p*jA@֚H{ƾب""RI!1t^kNsꡣ5D S1_MJfHBbKz,GqZeBW04vbHعϸ ٨>˔^J{3ڢIi_qOŮ7w&%S1O~_c[۟4gifѼwJeE]TAؙ0sq*&^[<rBU(]bNPRVQX } xOh.Ҧa-l"J_)WsǮX&Ȯh5*In"<\#Y}0^H%U`sIv*6qU,aNl<.aм~!S"uKygsgDDkېtFJ8d"c!ME=SEb;z%=NYurJ,yJ͡lJ0 Dpl?_].CZD1Y1)Av%7Xl7#ْb (ENOG'|3Zauȡ'(|J46?bs7>0QHCwiǼѬeV`ÞM 2ZIQc~ĺjfD*"2kJ!H0S6!rI:[WgĹq'-V󏋆}/D.eZui0t saog.Lu%g(jDU ]{I++&eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_F`IDATxbHl0yTf4~~BGyD;?:?_vD?ww$+_h"<]'r.(GIENDB`PNG  IHDR!V\DcsCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_F^IDATxұ Pпj6`&8 jbu׿ Y#lf-f6ݭW=]UN ݜ"""a 1E,Cs`PIENDB`PNG  IHDR2#YcsCl0`MIDATxb<~8,@laa1t &A F5Qg: oqJ8 'N!y;Tvv@|~-)@]9΂fVv[Aig7=:=8}~΂nA UK|aHMIvF` RÕ ΂XIţ8)%"m:kY9' U9!IENDB`PNG  IHDR2#YcsCl0`MIDATxby&,@,''7#&A F5Qg: oqJ'~ Df6v@|~ԝbq@]9΂fVv[Aig76?0߸To [PB3&$Oia0 5\,d[<8ZR,R+騳F5ꬑS?zh9 9HIENDB`PNG  IHDR2#YcsCl0`MIDATxb<~8,@=tU&A F5Qg: oqJ)'^)+Q8f6v@|~ԃ"1@]9΂fVv[Aig7<߸T [PB3&$Oia0 5\,d[<8ZR,R+騳F5ꬑS_zu9 9z JIENDB`PNG  IHDR2#YcsCl0`MIDATxb<~8,@laa1t &A F5Qg: oqJxR8, 8Ie&HD;@dpR'iw ZQI LM'~f6r=e, n ˠu zXpq5eIfq1,\?l-@Eh@|Zt!@,KCNLPN&26F<ڄPFa飘P2JQ&1 t @V>xPIENDB`PNG  IHDR szzIDATx+a66RH\\֖)A.ā(9pQE(\$Qˁ虚f5Sμ>OmFQbD,$fQ?q<{&aWc ]3Xr%wKD"KK9WkXĄdpWLyWB܇ D$w(f#n0 /3HZ0/- ;O ՜L/ƾ֗]vlI}8IK{hii,h75Ep^m,)m.A%qlGYm.Ag4a Tvd&14 5@܋l PD ^&t ɀꁇ,l u@|* jP`G ܈@8}8-  77B:IENDB`PNG  IHDRacsCl0`M*IDATxڤ=HAq5=A "lMDͽ%Hzii5VAQ!|KŃ?adS?'(cV{9)bW("aXG v V0q:PQ+[kn%Hf\]:qc!R3W;<Sؑ'T]깅5qK= !s~Bؓs2,FԜyq@^+ ռw̡OPCBvm;R-:<`LrKXӯMz;D2IENDB`PNG  IHDR #=csCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FeVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATx[0ᯈ(/Ν(B}& 7^i?L;Gpr os~RΘ 4aN1a;t8IE}ڪ w F~-\lQ0K7LkUgNJʵzӚmszUʊ*..IENDB`PNG  IHDR csCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATx[ 0 EO$neW30f~RJeopmT̨V|–mxID[30,]]} Q`}t68^ du'/yy;S3 wjILbѴIENDB`PNG  IHDR kcsCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_F3IDATx˱ #$"*D  cEL ?7A7R8IENDB`PNG  IHDR kcsCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_F4IDATxb"+#o ?~31PF5 W$IENDB`PNG  IHDR 7csCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_F0IDATxbda``b 000OB7z ,/qIENDB`PNG  IHDR v4AcsCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FeIDATxڤ C?v'z%K4%"M6hv6L"A\[{\My5ɝ}l9u8NSSqVB9IENDB`PNG  IHDR v4AcsCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FoIDATxڜ[ 'i?nMH},!:UQeZ4Ux}/=l!6Ie)JSv3t ;BmcUFޅQ 2LlIENDB`PNG  IHDRacsCl0`M pHYs   cHRMz%u0`:o_FIDATxڤ1 @E_3XYDϠ#HS1VKf``bz 4~W1XP7}Lb Ik&y_&y$ Uh>> ہ Ȇ`3$C]Cf"2 d#)p30A (8sIENDB`PNG  IHDRacsCl0`MsRGBgAMA a pHYsod IDAT8OSQ@D+ Dq ߽DW%4n߾4۵M62f1DѣC8(rm|f|}-f 4]Nq\%`qM;LFkWpMK]6%Gqz3 aTMM=x|%;fRs$6B"kf6F[H@i#P:%5"E0&X6䣍 e0Z&} IE6lN1JG:IENDB`PNG  IHDRacsCl0`MsRGBgAMA a pHYsodIDAT8OSK echbLԺэn@W[/Ry4B̼VqZ5-[Wۣ{2}|$IFpļX#L,HȾN;0 Ő2~GA9]nw;pKLLLtW58:_/jLa/Dɡ"m3X/N@vn,uHˆ.|:(]mtլIm,t$teMc2_4QYڰѵ\8vbIENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsodIDATXG; 0Ds.|*;#x-RG6 @c9B F$EbϺM#)BńlF-[ b=tծ- ;̜ڒѕUpGȶKCR8ih@'r1IENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsodIDATXG= `/Tz5Hf" >W8@zf^'MEBQ.EZ7"r5#,>DE㩻;㩔Qx'h]\٤Py%OPB? f 1LRnD;{lr]1r<D\2 AA# c 4 @d67 d$&pc|2QL@A2_ESIENDB`PNG  IHDR##ٳYcsCl0`M pHYsod MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATxMj1xw8d!$:H7-tQ8y݄H@\rS0/132Xҋ~|WLUUxf !HR#isvn1 8ۏ8Yu 0y;gJHjU1!)zXmaz 0Z3[uyflṔV]IKI'3Nu]g#u]gI'`m=SJ0) DI!ih_ \011ƧRbσa` `u&eIENDB`PNG  IHDR##ٳYcsCl0`M pHYsod MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_F IDATxMjAqϡg̴ 7Bk .s g&wl&'GoMQ !%IIobfPқ1'IGE̞)R.ЗBqS̶_n4J`s؜_L?U0@-i+Ib}vjdy-g`lTY5m2˲lg 7E&ؘwѶ8a_cx16&C'L$Lœr#IENDB`PNG  IHDR##ٳYcsCl0`M pHYsod MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_F)IDATxOj1cHfLA7.Ac]:N0L [6#QJ)zDLDL|C`$xKW1&>˲gkItoR4CDCsn@DÛ`1#S53*Fk=ZZZk= &"R;疿w-E䝈&byvdqM Gfvac%Cyӂf1h{SgAhcB&zCb- `RQY=ó^!˲X(ng|{CXZ{@el˾ ]:CSn]JMu*L3|DW[5>zWs{Ƙ&Dځie%>([Ǩ *%MW#kIENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsod%IDATXG 0;G=Mi t:nޝ@wp*XAA EhG C!//_/!A$=WZ pxxeL+xtmDQF4iKn:Näi:;\Lbijj}bvD0 7)+Yحch2! tF#jH 2LjxgF< 1TTcreij*. c޿rTC ֟AcY<8kog:7nga;TVIENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsod=IDATXGM P9q"8Z@+}4. y+5Թ𒈌kqιiZAGQTT2$㫄aYͦ \ FNEkI!x@yo'I% Ýycn{<̆,EӶm{Lp =W,͌a!l=h+ s4Mgl h1G290!:o L+(`v$Z;tz{^n렏)="'뀠ʖXEQ;r2#G 8P&e''ŝzIENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsodIDATXGc`!0!0C@GGGJW ,e1=*ʁ Q{GC`4FCj!<hIENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsodIDATXG햽JQMTDSFlR JZX|V,- (>@DPQA Dw9gNf7H>I$a\.JO*D C籚}Ϲ\nL6q(t@8t0 ':a`g1rKT` fmE뗂Wb/\X{CM"~51$G3*Qy7NqT퐺w(β$IsvjNLD?}Jq@*r >2|@4IENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsodAIDATXG햽j0RRt ċ[1!}6C) y,%DV;\%{Y9{[=S9/6(iO뺾:u )MeY3dQO#+ O 4MNJa^aXyͲX4W`f*k-jr({=ttH02 4)1xb AwYaٶA}1汎7I:,qZV&f p\_kIENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsodIDATXG[@ Eߺ]q " MZ0LHbJ=$ 3`> y~MtR ʲl_E'd ER^j!^r`5@}C(tl`J@Нl`M@A fE cLޟI0&qׄ|4[X ] |Z9@$@걦C]aX7ZFhdz̀0m \ג#yIENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsodIDATXG[ E_%@qK[t&CX2@M41==0ԀP7c̡Ƌs4ϼ Tlq1P$rT:O4 Mq<,gG4g ډ6f#9R]aϼ.ARS`i"@]o6 gkO'6A݁8`I8Ǚ6u8HmC7Fj@ 1nG4QIENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsod4IDATXG 0 ;H˔1h}RR9Jy೿VVp$_73I&k)EBh)gLA TE#ZG`Wր( _r,˓D  #<5Ctbr ? r&@ Q0@`c0 7.MN:i@ViYgT P0c cN޳naL{90ì?\R6.4i U\p DgZ&c6rg hs19ў43>>_јIENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsodHIDATXG[0WBZҸnB{MTL!~#ᶴBdCqFL&&}S 3u]ߓ$م,yў?L'QA$*:&,;0!:@4I5 t  @4!+uF|!ހV 5/jILכdLnm۾Z0p o$1п >*I3at \B\Sz 2Ii`ft}j׿yb_ Cb[?;wĄ018L};f(èRIENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsodHIDATXG 0@3xM7ЏOOGĉAjOQIÕ8#fM!@8W6+4 .IENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsodGIDATXGӱ 0@wpT# df>]6 W㌀oqBqI 8 IENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsodwIDATXGc044,a8Qѐ Rsh^iFHH腰R1Hig4 4ClSnhDISwhJ}M2fh掆h{t6fD+SfIENDB`PNG  IHDR##ٳYcsCl0`MsRGBgAMA a pHYsodqIDATXG핱 0 54,[ĸs~ B ED0_m6 30s|Ug dT{&SL,&i-=t!3IENDB`PNG  IHDRacsCl0`MIDATxb?%Bc@\^@,/xwCIzOs vb^(*@8!& ` J ʗr';rrr ,Rp ďllq/XI1:ihc ہ8 f<ў;p ` .⽸ EM: Vb6( O&@l+)gR@?Ci)x7Z G% :!ɔIENDB`PNG  IHDRacsCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FVIDATxڄOQ37QY&0d˂[BʊRbF$edb04HCg{=i>v7flf'TAr8'ʴ'8/@V,3:,h(P&E J*-ޖѡضbU(<JDa]em=1 >[Ct.W:-G2sf-2vnHH\Pg (pʺΈ~uĖQ t<ŋs@%5N 35j8#WD$+<WT˩@kfUA 10My5YeV3X`Q˕8CPpzoB%y.pFZdapQ AFQLt`3W18tUg8ԗ`-({>*Qւ -D -!jIENDB`PNG  IHDRacsCl0`M pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIIDATxڌK[Q{w4KČ.`(E3fnuڥC ] A suѦ?h8sm J#fƘI~IUeffιWWUsc<﷢syZш]|# dYF$ sdYFZeyyE,cggU@TU$ann5* Ǵm `ccftAyY!j$Ij4 T-DQ-Ipss`0 c<{Fja!s888 Ǣ7z}T*0DD""ƢSynKۥ^BVljB@}P@U ÐxRh{Dx>/~k1v|>|'ZIENDB`

$i18n{message}

$i18n{message}

$i18n{message}

// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the app API. var appNatives = requireNative('app'); var process = requireNative('process'); var extensionId = process.GetExtensionId(); var logActivity = requireNative('activityLogger'); function wrapForLogging(fun) { if (!extensionId) return fun; // nothing interesting to log without an extension return function() { // TODO(ataly): We need to make sure we use the right prototype for // fun.apply. Array slice can either be rewritten or similarly defined. logActivity.LogAPICall(extensionId, "app." + fun.name, $Array.slice(arguments)); return $Function.apply(fun, this, arguments); }; } // This becomes chrome.app var app = { getIsInstalled: wrapForLogging(appNatives.GetIsInstalled), getDetails: wrapForLogging(appNatives.GetDetails), runningState: wrapForLogging(appNatives.GetRunningState) }; // Tricky; "getIsInstalled" is actually exposed as the getter "isInstalled", // but we don't have a way to express this in the schema JSON (nor is it // worth it for this one special case). // // So, define it manually, and let the getIsInstalled function act as its // documentation. var isInstalled = wrapForLogging(appNatives.GetIsInstalled); $Object.defineProperty( app, 'isInstalled', { __proto__: null, configurable: true, enumerable: true, get: function() { return isInstalled(); }, }); // Called by app_bindings.cc. function onInstallStateResponse(state, callbackId) { var callback = callbacks[callbackId]; delete callbacks[callbackId]; if (typeof callback == 'function') { try { callback(state); } catch (e) { console.error('Exception in chrome.app.installState response handler: ' + e.stack); } } } // TODO(kalman): move this stuff to its own custom bindings. var callbacks = { __proto__: null }; var nextCallbackId = 1; function getInstallState(callback) { var callbackId = nextCallbackId++; callbacks[callbackId] = callback; appNatives.GetInstallState(callbackId); } $Object.defineProperty( app, 'installState', { __proto__: null, configurable: true, enumerable: true, value: wrapForLogging(getInstallState), writable: true, }); exports.$set('binding', app); exports.$set('onInstallStateResponse', onInstallStateResponse); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the automation API. var AutomationNode = require('automationNode').AutomationNode; var AutomationRootNode = require('automationNode').AutomationRootNode; var automation = apiBridge || require('binding').Binding.create('automation'); var automationInternal = getInternalApi ? getInternalApi('automationInternal') : require('binding').Binding.create('automationInternal').generate(); var exceptionHandler = require('uncaught_exception_handler'); var logging = requireNative('logging'); var nativeAutomationInternal = requireNative('automationInternal'); var DestroyAccessibilityTree = nativeAutomationInternal.DestroyAccessibilityTree; var GetIntAttribute = nativeAutomationInternal.GetIntAttribute; var StartCachingAccessibilityTrees = nativeAutomationInternal.StartCachingAccessibilityTrees; var AddTreeChangeObserver = nativeAutomationInternal.AddTreeChangeObserver; var RemoveTreeChangeObserver = nativeAutomationInternal.RemoveTreeChangeObserver; var GetFocusNative = nativeAutomationInternal.GetFocus; var jsLastError = bindingUtil ? undefined : require('lastError'); function hasLastError() { return bindingUtil ? bindingUtil.hasLastError() : jsLastError.hasError(chrome); } /** * A namespace to export utility functions to other files in automation. */ window.automationUtil = function() {}; // TODO(aboxhall): Look into using WeakMap var idToCallback = {}; var DESKTOP_TREE_ID = 0; automationUtil.storeTreeCallback = function(id, callback) { if (!callback) return; var targetTree = AutomationRootNode.get(id); if (!targetTree) { // If we haven't cached the tree, hold the callback until the tree is // populated by the initial onAccessibilityEvent call. if (id in idToCallback) idToCallback[id].push(callback); else idToCallback[id] = [callback]; } else { callback(targetTree); } }; /** * Global list of tree change observers. * @type {Object} */ automationUtil.treeChangeObserverMap = {}; /** * The id of the next tree change observer. * @type {number} */ automationUtil.nextTreeChangeObserverId = 1; /** * @type {AutomationNode} The current focused node. This is only updated * when calling automationUtil.updateFocusedNode. */ automationUtil.focusedNode = null; /** * Gets the currently focused AutomationNode. * @return {AutomationNode} */ automationUtil.getFocus = function() { var focusedNodeInfo = GetFocusNative(DESKTOP_TREE_ID); if (!focusedNodeInfo) return null; var tree = AutomationRootNode.getOrCreate(focusedNodeInfo.treeId); if (tree) return privates(tree).impl.get(focusedNodeInfo.nodeId); }; /** * Update automationUtil.focusedNode to be the node that currently has focus. */ automationUtil.updateFocusedNode = function() { automationUtil.focusedNode = automationUtil.getFocus(); }; /** * Updates the focus on blur. */ automationUtil.updateFocusedNodeOnBlur = function() { var focus = automationUtil.getFocus(); automationUtil.focusedNode = focus ? focus.root : null; }; automation.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; // TODO(aboxhall, dtseng): Make this return the speced AutomationRootNode obj. apiFunctions.setHandleRequest('getTree', function getTree(tabID, callback) { StartCachingAccessibilityTrees(); // enableTab() ensures the renderer for the active or specified tab has // accessibility enabled, and fetches its ax tree id to use as // a key in the idToAutomationRootNode map. The callback to // enableTab is bound to the callback passed in to getTree(), so that once // the tree is available (either due to having been cached earlier, or after // an accessibility event occurs which causes the tree to be populated), the // callback can be called. var params = { tabID: tabID }; automationInternal.enableTab(params, function onEnable(id) { if (hasLastError()) { callback(); return; } automationUtil.storeTreeCallback(id, callback); }); }); var desktopTree = null; apiFunctions.setHandleRequest('getDesktop', function(callback) { StartCachingAccessibilityTrees(); desktopTree = AutomationRootNode.get(DESKTOP_TREE_ID); if (!desktopTree) { if (DESKTOP_TREE_ID in idToCallback) idToCallback[DESKTOP_TREE_ID].push(callback); else idToCallback[DESKTOP_TREE_ID] = [callback]; // TODO(dtseng): Disable desktop tree once desktop object goes out of // scope. automationInternal.enableDesktop(function() { if (hasLastError()) { AutomationRootNode.destroy(DESKTOP_TREE_ID); callback(); return; } }); } else { callback(desktopTree); } }); apiFunctions.setHandleRequest('getFocus', function(callback) { callback(automationUtil.getFocus()); }); function removeTreeChangeObserver(observer) { for (var id in automationUtil.treeChangeObserverMap) { if (automationUtil.treeChangeObserverMap[id] == observer) { RemoveTreeChangeObserver(id); delete automationUtil.treeChangeObserverMap[id]; return; } } } apiFunctions.setHandleRequest('removeTreeChangeObserver', function(observer) { removeTreeChangeObserver(observer); }); function addTreeChangeObserver(filter, observer) { removeTreeChangeObserver(observer); var id = automationUtil.nextTreeChangeObserverId++; AddTreeChangeObserver(id, filter); automationUtil.treeChangeObserverMap[id] = observer; } apiFunctions.setHandleRequest('addTreeChangeObserver', function(filter, observer) { addTreeChangeObserver(filter, observer); }); apiFunctions.setHandleRequest('setDocumentSelection', function(params) { var anchorNodeImpl = privates(params.anchorObject).impl; var focusNodeImpl = privates(params.focusObject).impl; if (anchorNodeImpl.treeID !== focusNodeImpl.treeID) throw new Error('Selection anchor and focus must be in the same tree.'); if (anchorNodeImpl.treeID === DESKTOP_TREE_ID) { throw new Error('Use AutomationNode.setSelection to set the selection ' + 'in the desktop tree.'); } automationInternal.performAction({ treeID: anchorNodeImpl.treeID, automationNodeID: anchorNodeImpl.id, actionType: 'setSelection'}, { focusNodeID: focusNodeImpl.id, anchorOffset: params.anchorOffset, focusOffset: params.focusOffset }); }); }); automationInternal.onChildTreeID.addListener(function(treeID, nodeID) { var tree = AutomationRootNode.getOrCreate(treeID); if (!tree) return; var node = privates(tree).impl.get(nodeID); if (!node) return; // A WebView in the desktop tree has a different AX tree as its child. // When we encounter a WebView with a child AX tree id that we don't // currently have cached, explicitly request that AX tree from the // browser process and set up a callback when it loads to attach that // tree as a child of this node and fire appropriate events. var childTreeID = GetIntAttribute(treeID, nodeID, 'childTreeId'); if (!childTreeID) return; var subroot = AutomationRootNode.get(childTreeID); if (!subroot || subroot.role == 'unknown') { automationUtil.storeTreeCallback(childTreeID, function(root) { // Return early if the root has already been attached. if (root.parent) return; privates(root).impl.setHostNode(node); if (root.docLoaded) { privates(root).impl.dispatchEvent('loadComplete', 'page'); } privates(node).impl.dispatchEvent('childrenChanged', 'none'); }); automationInternal.enableFrame(childTreeID); } else { privates(subroot).impl.setHostNode(node); } }); automationInternal.onTreeChange.addListener(function(observerID, treeID, nodeID, changeType) { var tree = AutomationRootNode.getOrCreate(treeID); if (!tree) return; var node = privates(tree).impl.get(nodeID); if (!node) return; var observer = automationUtil.treeChangeObserverMap[observerID]; if (!observer) return; try { observer({target: node, type: changeType}); } catch (e) { exceptionHandler.handle('Error in tree change observer for ' + treeChange.type, e); } }); automationInternal.onNodesRemoved.addListener(function(treeID, nodeIDs) { var tree = AutomationRootNode.getOrCreate(treeID); if (!tree) return; for (var i = 0; i < nodeIDs.length; i++) { privates(tree).impl.remove(nodeIDs[i]); } }); /** * Dispatch accessibility events fired on individual nodes to its * corresponding AutomationNode. Handle focus events specially * (see below). */ automationInternal.onAccessibilityEvent.addListener(function(eventParams) { var id = eventParams.treeID; var targetTree = AutomationRootNode.getOrCreate(id); if (eventParams.eventType == 'blur') { // Work around an issue where Chrome sends us 'blur' events on the // root node when nothing has focus, we need to treat those as focus // events but otherwise not handle blur events specially. var node = privates(targetTree).impl.get(eventParams.targetID); if (node == node.root) automationUtil.updateFocusedNodeOnBlur(); } else if (eventParams.eventType == 'mediaStartedPlaying' || eventParams.eventType == 'mediaStoppedPlaying') { // These events are global to the tree. eventParams.targetID = privates(targetTree).impl.id; } else { var previousFocusedNode = automationUtil.focusedNode; automationUtil.updateFocusedNode(); // Fire focus events if necessary. if (automationUtil.focusedNode && automationUtil.focusedNode != previousFocusedNode) { var eventParamsCopy = {}; for (var key in eventParams) eventParamsCopy[key] = eventParams[key]; eventParamsCopy['eventType'] = 'focus'; eventParamsCopy['treeID'] = privates(automationUtil.focusedNode.root).impl.treeID; eventParamsCopy['targetID'] = privates(automationUtil.focusedNode).impl.id; privates(automationUtil.focusedNode.root) .impl.onAccessibilityEvent(eventParamsCopy); } } // Note that focus type events have already been handled above if there was a // focused node. All other events, even non-focus events that triggered a // focus dispatch, still need to have their original event fired. if ((!automationUtil.focusedNode || eventParams.eventType != 'focus') && !privates(targetTree).impl.onAccessibilityEvent(eventParams)) return; // If we're not waiting on a callback to getTree(), we can early out here. if (!(id in idToCallback)) return; // We usually get a 'placeholder' tree first, which doesn't have any url // attribute or child nodes. If we've got that, wait for the full tree before // calling the callback. // TODO(dmazzoni): Don't send down placeholder (crbug.com/397553) if (id != DESKTOP_TREE_ID && !targetTree.url && targetTree.children.length == 0) return; // If the tree wasn't available when getTree() was called, the callback will // have been cached in idToCallback, so call and delete it now that we // have the complete tree. for (var i = 0; i < idToCallback[id].length; i++) { var callback = idToCallback[id][i]; callback(targetTree); } delete idToCallback[id]; }); automationInternal.onAccessibilityTreeDestroyed.addListener(function(id) { // Destroy the AutomationRootNode. var targetTree = AutomationRootNode.get(id); if (targetTree) { privates(targetTree).impl.destroy(); AutomationRootNode.destroy(id); } else { logging.WARNING('no targetTree to destroy'); } // Destroy the native cache of the accessibility tree. DestroyAccessibilityTree(id); }); automationInternal.onAccessibilityTreeSerializationError.addListener( function(id) { automationInternal.enableFrame(id); }); automationInternal.onActionResult.addListener( function(treeID, requestID, result) { var targetTree = AutomationRootNode.get(treeID); if (!targetTree) return; privates(targetTree).impl.onActionResult(requestID, result); }); if (!apiBridge) exports.$set('binding', automation.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var utils = require('utils'); function AutomationEventImpl(type, target, eventFrom) { this.propagationStopped = false; this.type = type; this.target = target; this.eventPhase = Event.NONE; this.eventFrom = eventFrom; } AutomationEventImpl.prototype = { __proto__: null, stopPropagation: function() { this.propagationStopped = true; }, }; function AutomationEvent() { privates(AutomationEvent).constructPrivate(this, arguments); } utils.expose(AutomationEvent, AutomationEventImpl, { functions: [ 'stopPropagation', ], readonly: [ 'type', 'target', 'eventPhase', 'eventFrom', ], }); exports.$set('AutomationEvent', AutomationEvent); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var AutomationEvent = require('automationEvent').AutomationEvent; var automationInternal = getInternalApi ? getInternalApi('automationInternal') : require('binding').Binding.create('automationInternal').generate(); var exceptionHandler = require('uncaught_exception_handler'); var natives = requireNative('automationInternal'); var IsInteractPermitted = natives.IsInteractPermitted; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?number} The id of the root node. */ var GetRootID = natives.GetRootID; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?string} The title of the document. */ var GetDocTitle = natives.GetDocTitle; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?string} The url of the document. */ var GetDocURL = natives.GetDocURL; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?boolean} True if the document has finished loading. */ var GetDocLoaded = natives.GetDocLoaded; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?number} The loading progress, from 0.0 to 1.0 (fully loaded). */ var GetDocLoadingProgress = natives.GetDocLoadingProgress; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?number} The ID of the selection anchor object. */ var GetAnchorObjectID = natives.GetAnchorObjectID; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?number} The selection anchor offset. */ var GetAnchorOffset = natives.GetAnchorOffset; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?string} The selection anchor affinity. */ var GetAnchorAffinity = natives.GetAnchorAffinity; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?number} The ID of the selection focus object. */ var GetFocusObjectID = natives.GetFocusObjectID; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?number} The selection focus offset. */ var GetFocusOffset = natives.GetFocusOffset; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?string} The selection focus affinity. */ var GetFocusAffinity = natives.GetFocusAffinity; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?number} The id of the node's parent, or undefined if it's the * root of its tree or if the tree or node wasn't found. */ var GetParentID = natives.GetParentID; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?number} The number of children of the node, or undefined if * the tree or node wasn't found. */ var GetChildCount = natives.GetChildCount; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {number} childIndex An index of a child of this node. * @return {?number} The id of the child at the given index, or undefined * if the tree or node or child at that index wasn't found. */ var GetChildIDAtIndex = natives.GetChildIDAtIndex; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?number} The ids of the children of the node, or undefined * if the tree or node wasn't found. */ var GetChildIds = natives.GetChildIDs; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?Object} An object mapping html attributes to values. */ var GetHtmlAttributes = natives.GetHtmlAttributes; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?number} The index of this node in its parent, or undefined if * the tree or node or node parent wasn't found. */ var GetIndexInParent = natives.GetIndexInParent; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?Object} An object with a string key for every state flag set, * or undefined if the tree or node or node parent wasn't found. */ var GetState = natives.GetState; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {string} The restriction, one of * "disabled", "readOnly" or undefined if enabled or other object not disabled */ var GetRestriction = natives.GetRestriction; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {string} The checked state, as undefined, "true", "false" or "mixed". */ var GetChecked = natives.GetChecked; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {string} The role of the node, or undefined if the tree or * node wasn't found. */ var GetRole = natives.GetRole; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?automation.Rect} The location of the node, or undefined if * the tree or node wasn't found. */ var GetLocation = natives.GetLocation; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {number} startIndex The start index of the range. * @param {number} endIndex The end index of the range. * @return {?automation.Rect} The bounding box of the subrange of this node, * or the location if there are no subranges, or undefined if * the tree or node wasn't found. */ var GetBoundsForRange = natives.GetBoundsForRange; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?automation.Rect} The unclipped location of the node, or * undefined if the tree or node wasn't found. */ var GetUnclippedLocation = natives.GetUnclippedLocation; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {!Array.} The text offset where each line starts, or an empty * array if this node has no text content, or undefined if the tree or node * was not found. */ var GetLineStartOffsets = requireNative( 'automationInternal').GetLineStartOffsets; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {string} attr The name of a string attribute. * @return {?string} The value of this attribute, or undefined if the tree, * node, or attribute wasn't found. */ var GetStringAttribute = natives.GetStringAttribute; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {string} attr The name of an attribute. * @return {?boolean} The value of this attribute, or undefined if the tree, * node, or attribute wasn't found. */ var GetBoolAttribute = natives.GetBoolAttribute; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {string} attr The name of an attribute. * @return {?number} The value of this attribute, or undefined if the tree, * node, or attribute wasn't found. */ var GetIntAttribute = natives.GetIntAttribute; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {string} attr The name of an attribute. * @return {?number} The value of this attribute, or undefined if the tree, * node, or attribute wasn't found. */ var GetFloatAttribute = natives.GetFloatAttribute; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {string} attr The name of an attribute. * @return {?Array.} The value of this attribute, or undefined * if the tree, node, or attribute wasn't found. */ var GetIntListAttribute = natives.GetIntListAttribute; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {string} attr The name of an HTML attribute. * @return {?string} The value of this attribute, or undefined if the tree, * node, or attribute wasn't found. */ var GetHtmlAttribute = natives.GetHtmlAttribute; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {automation.NameFromType} The source of the node's name. */ var GetNameFrom = natives.GetNameFrom; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {boolean} */ var GetBold = natives.GetBold; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {boolean} */ var GetItalic = natives.GetItalic; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {boolean} */ var GetUnderline = natives.GetUnderline; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {boolean} */ var GetLineThrough = natives.GetLineThrough; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?Array.} List of custom actions of the * node. */ var GetCustomActions = natives.GetCustomActions; var logging = requireNative('logging'); var utils = require('utils'); /** * A single node in the Automation tree. * @param {AutomationRootNodeImpl} root The root of the tree. * @constructor */ function AutomationNodeImpl(root) { this.rootImpl = root; this.hostNode_ = null; this.listeners = {__proto__: null}; } AutomationNodeImpl.prototype = { __proto__: null, treeID: -1, id: -1, isRootNode: false, detach: function() { this.rootImpl = null; this.hostNode_ = null; this.listeners = {__proto__: null}; }, get root() { return this.rootImpl && this.rootImpl.wrapper; }, get parent() { if (!this.rootImpl) return undefined; if (this.hostNode_) return this.hostNode_; var parentID = GetParentID(this.treeID, this.id); return this.rootImpl.get(parentID); }, get htmlAttributes() { return GetHtmlAttributes(this.treeID, this.id) || {}; }, get state() { return GetState(this.treeID, this.id) || {}; }, get role() { return GetRole(this.treeID, this.id); }, get restriction() { return GetRestriction(this.treeID, this.id); }, get checked() { return GetChecked(this.treeID, this.id); }, get location() { return GetLocation(this.treeID, this.id); }, boundsForRange: function(startIndex, endIndex) { return GetBoundsForRange(this.treeID, this.id, startIndex, endIndex); }, get unclippedLocation() { var result = GetUnclippedLocation(this.treeID, this.id); if (result === undefined) result = GetLocation(this.treeID, this.id); return result; }, get indexInParent() { return GetIndexInParent(this.treeID, this.id); }, get lineStartOffsets() { return GetLineStartOffsets(this.treeID, this.id); }, get childTree() { var childTreeID = GetIntAttribute(this.treeID, this.id, 'childTreeId'); if (childTreeID) return AutomationRootNodeImpl.get(childTreeID); }, get firstChild() { if (!this.rootImpl) return undefined; if (this.childTree) return this.childTree; if (!GetChildCount(this.treeID, this.id)) return undefined; var firstChildID = GetChildIDAtIndex(this.treeID, this.id, 0); return this.rootImpl.get(firstChildID); }, get lastChild() { if (!this.rootImpl) return undefined; if (this.childTree) return this.childTree; var count = GetChildCount(this.treeID, this.id); if (!count) return undefined; var lastChildID = GetChildIDAtIndex(this.treeID, this.id, count - 1); return this.rootImpl.get(lastChildID); }, get children() { if (!this.rootImpl) return []; if (this.childTree) return [this.childTree]; var children = []; var childIds = GetChildIds(this.treeID, this.id); for (var i = 0; i < childIds.length; ++i) { var childID = childIds[i]; var child = this.rootImpl.get(childID); $Array.push(children, child); } return children; }, get previousSibling() { var parent = this.parent; if (!parent) return undefined; parent = privates(parent).impl; var indexInParent = GetIndexInParent(this.treeID, this.id); return this.rootImpl.get( GetChildIDAtIndex(parent.treeID, parent.id, indexInParent - 1)); }, get nextSibling() { var parent = this.parent; if (!parent) return undefined; parent = privates(parent).impl; var indexInParent = GetIndexInParent(this.treeID, this.id); return this.rootImpl.get( GetChildIDAtIndex(parent.treeID, parent.id, indexInParent + 1)); }, get nameFrom() { return GetNameFrom(this.treeID, this.id); }, get bold() { return GetBold(this.treeID, this.id); }, get italic() { return GetItalic(this.treeID, this.id); }, get underline() { return GetUnderline(this.treeID, this.id); }, get lineThrough() { return GetLineThrough(this.treeID, this.id); }, get customActions() { return GetCustomActions(this.treeID, this.id); }, doDefault: function() { this.performAction_('doDefault'); }, focus: function() { this.performAction_('focus'); }, getImageData: function(maxWidth, maxHeight) { this.performAction_('getImageData', { maxWidth: maxWidth, maxHeight: maxHeight }); }, hitTest: function(x, y, eventToFire) { this.hitTestInternal(x, y, eventToFire); }, hitTestWithReply: function(x, y, opt_callback) { this.hitTestInternal(x, y, 'hitTestResult', opt_callback); }, hitTestInternal: function(x, y, eventToFire, opt_callback) { // Convert from global to tree-relative coordinates. var location = GetLocation(this.treeID, GetRootID(this.treeID)); this.performAction_('hitTest', { x: Math.floor(x - location.left), y: Math.floor(y - location.top), eventToFire: eventToFire }, opt_callback); }, makeVisible: function() { this.performAction_('makeVisible'); }, performCustomAction: function(customActionId) { this.performAction_('customAction', { customActionID: customActionId }); }, resumeMedia: function() { this.performAction_('resumeMedia'); }, scrollBackward: function(opt_callback) { this.performAction_('scrollBackward', {}, opt_callback); }, scrollForward: function(opt_callback) { this.performAction_('scrollForward', {}, opt_callback); }, scrollUp: function(opt_callback) { this.performAction_('scrollUp', {}, opt_callback); }, scrollDown: function(opt_callback) { this.performAction_('scrollDown', {}, opt_callback); }, scrollLeft: function(opt_callback) { this.performAction_('scrollLeft', {}, opt_callback); }, scrollRight: function(opt_callback) { this.performAction_('scrollRight', {}, opt_callback); }, setSelection: function(startIndex, endIndex) { if (this.state.editable) { this.performAction_('setSelection', { focusNodeID: this.id, anchorOffset: startIndex, focusOffset: endIndex }); } }, setSequentialFocusNavigationStartingPoint: function() { this.performAction_('setSequentialFocusNavigationStartingPoint'); }, showContextMenu: function() { this.performAction_('showContextMenu'); }, startDuckingMedia: function() { this.performAction_('startDuckingMedia'); }, stopDuckingMedia: function() { this.performAction_('stopDuckingMedia'); }, suspendMedia: function() { this.performAction_('suspendMedia'); }, domQuerySelector: function(selector, callback) { if (!this.rootImpl) callback(); automationInternal.querySelector( { treeID: this.rootImpl.treeID, automationNodeID: this.id, selector: selector }, $Function.bind(this.domQuerySelectorCallback_, this, callback)); }, find: function(params) { return this.findInternal_(params); }, findAll: function(params) { return this.findInternal_(params, []); }, matches: function(params) { return this.matchInternal_(params); }, addEventListener: function(eventType, callback, capture) { this.removeEventListener(eventType, callback); if (!this.listeners[eventType]) this.listeners[eventType] = []; $Array.push(this.listeners[eventType], { __proto__: null, callback: callback, capture: !!capture, }); }, // TODO(dtseng/aboxhall): Check this impl against spec. removeEventListener: function(eventType, callback) { if (this.listeners[eventType]) { var listeners = this.listeners[eventType]; for (var i = 0; i < listeners.length; i++) { if (callback === listeners[i].callback) $Array.splice(listeners, i, 1); } } }, toJSON: function() { return { treeID: this.treeID, id: this.id, role: this.role, attributes: this.attributes }; }, dispatchEvent: function(eventType, eventFrom, mouseX, mouseY) { var path = []; var parent = this.parent; while (parent) { $Array.push(path, parent); parent = parent.parent; } var event = new AutomationEvent(eventType, this.wrapper, eventFrom); event.mouseX = mouseX; event.mouseY = mouseY; // Dispatch the event through the propagation path in three phases: // - capturing: starting from the root and going down to the target's parent // - targeting: dispatching the event on the target itself // - bubbling: starting from the target's parent, going back up to the root. // At any stage, a listener may call stopPropagation() on the event, which // will immediately stop event propagation through this path. if (this.dispatchEventAtCapturing_(event, path)) { if (this.dispatchEventAtTargeting_(event, path)) this.dispatchEventAtBubbling_(event, path); } }, toString: function() { var parentID = GetParentID(this.treeID, this.id); var childTreeID = GetIntAttribute(this.treeID, this.id, 'childTreeId'); var count = GetChildCount(this.treeID, this.id); var childIDs = []; for (var i = 0; i < count; ++i) { var childID = GetChildIDAtIndex(this.treeID, this.id, i); $Array.push(childIDs, childID); } var result = 'node id=' + this.id + ' role=' + this.role + ' state=' + $JSON.stringify(this.state) + ' parentID=' + parentID + ' childIds=' + $JSON.stringify(childIDs); if (this.hostNode_) { var hostNodeImpl = privates(this.hostNode_).impl; result += ' host treeID=' + hostNodeImpl.treeID + ' host nodeID=' + hostNodeImpl.id; } if (childTreeID) result += ' childTreeID=' + childTreeID; return result; }, dispatchEventAtCapturing_: function(event, path) { privates(event).impl.eventPhase = Event.CAPTURING_PHASE; for (var i = path.length - 1; i >= 0; i--) { this.fireEventListeners_(path[i], event); if (privates(event).impl.propagationStopped) return false; } return true; }, dispatchEventAtTargeting_: function(event) { privates(event).impl.eventPhase = Event.AT_TARGET; this.fireEventListeners_(this.wrapper, event); return !privates(event).impl.propagationStopped; }, dispatchEventAtBubbling_: function(event, path) { privates(event).impl.eventPhase = Event.BUBBLING_PHASE; for (var i = 0; i < path.length; i++) { this.fireEventListeners_(path[i], event); if (privates(event).impl.propagationStopped) return false; } return true; }, fireEventListeners_: function(node, event) { var nodeImpl = privates(node).impl; if (!nodeImpl.rootImpl) return; var listeners = nodeImpl.listeners[event.type]; if (!listeners) return; var eventPhase = event.eventPhase; for (var i = 0; i < listeners.length; i++) { if (eventPhase == Event.CAPTURING_PHASE && !listeners[i].capture) continue; if (eventPhase == Event.BUBBLING_PHASE && listeners[i].capture) continue; try { listeners[i].callback(event); } catch (e) { exceptionHandler.handle('Error in event handler for ' + event.type + ' during phase ' + eventPhase, e); } } }, performAction_: function(actionType, opt_args, opt_callback) { if (!this.rootImpl) return; // Not yet initialized. if (this.rootImpl.treeID === undefined || this.id === undefined) { return; } // Check permissions. if (!IsInteractPermitted()) { throw new Error(actionType + ' requires {"desktop": true} or' + ' {"interact": true} in the "automation" manifest key.'); } var requestID = -1; if (opt_callback) { requestID = this.rootImpl.addActionResultCallback(opt_callback); } automationInternal.performAction({ treeID: this.rootImpl.treeID, automationNodeID: this.id, actionType: actionType, requestID: requestID}, opt_args || {}); }, domQuerySelectorCallback_: function(userCallback, resultAutomationNodeID) { // resultAutomationNodeID could be zero or undefined or (unlikely) null; // they all amount to the same thing here, which is that no node was // returned. if (!resultAutomationNodeID || !this.rootImpl) { userCallback(null); return; } var resultNode = this.rootImpl.get(resultAutomationNodeID); if (!resultNode) { logging.WARNING('Query selector result not in tree: ' + resultAutomationNodeID); userCallback(null); } userCallback(resultNode); }, findInternal_: function(params, opt_results) { var result = null; this.forAllDescendants_(function(node) { if (privates(node).impl.matchInternal_(params)) { if (opt_results) $Array.push(opt_results, node); else result = node; return !opt_results; } }); if (opt_results) return opt_results; return result; }, /** * Executes a closure for all of this node's descendants, in pre-order. * Early-outs if the closure returns true. * @param {Function(AutomationNode):boolean} closure Closure to be executed * for each node. Return true to early-out the traversal. */ forAllDescendants_: function(closure) { var stack = $Array.reverse(this.wrapper.children); while (stack.length > 0) { var node = $Array.pop(stack); if (closure(node)) return; var children = node.children; for (var i = children.length - 1; i >= 0; i--) $Array.push(stack, children[i]); } }, matchInternal_: function(params) { if ($Object.keys(params).length === 0) return false; if ('role' in params && this.role != params.role) return false; if ('state' in params) { for (var state in params.state) { if (params.state[state] != (state in this.state)) return false; } } if ('attributes' in params) { for (var attribute in params.attributes) { var attrValue = params.attributes[attribute]; if (typeof attrValue != 'object') { if (this[attribute] !== attrValue) return false; } else if (attrValue instanceof $RegExp.self) { if (typeof this[attribute] != 'string') return false; if (!attrValue.test(this[attribute])) return false; } else { // TODO(aboxhall): handle intlist case. return false; } } } return true; } }; var stringAttributes = [ 'accessKey', 'ariaInvalidValue', 'autoComplete', 'className', 'containerLiveRelevant', 'containerLiveStatus', 'description', 'display', 'htmlTag', 'imageDataUrl', 'language', 'liveRelevant', 'liveStatus', 'name', 'placeholder', 'roleDescription', 'textInputType', 'url', 'value']; var boolAttributes = [ 'busy', 'clickable', 'containerLiveAtomic', 'containerLiveBusy', 'liveAtomic', 'scrollable' ]; var intAttributes = [ 'backgroundColor', 'color', 'colorValue', 'hierarchicalLevel', 'posInSet', 'scrollX', 'scrollXMax', 'scrollXMin', 'scrollY', 'scrollYMax', 'scrollYMin', 'setSize', 'tableCellColumnIndex', 'ariaCellColumnIndex', 'tableCellColumnSpan', 'tableCellRowIndex', 'ariaCellRowIndex', 'tableCellRowSpan', 'tableColumnCount', 'ariaColumnCount', 'tableColumnIndex', 'tableRowCount', 'ariaRowCount', 'tableRowIndex', 'textSelEnd', 'textSelStart']; var nodeRefAttributes = [ ['activedescendantId', 'activeDescendant'], ['inPageLinkTargetId', 'inPageLinkTarget'], ['nextFocusId', 'nextFocus'], ['nextOnLineId', 'nextOnLine'], ['previousFocusId', 'previousFocus'], ['previousOnLineId', 'previousOnLine'], ['tableColumnHeaderId', 'tableColumnHeader'], ['tableHeaderId', 'tableHeader'], ['tableRowHeaderId', 'tableRowHeader']]; var intListAttributes = [ 'lineBreaks', 'markerEnds', 'markerStarts', 'markerTypes', 'wordEnds', 'wordStarts']; var nodeRefListAttributes = [ ['controlsIds', 'controls'], ['describedbyIds', 'describedBy'], ['flowtoIds', 'flowTo'], ['labelledbyIds', 'labelledBy']]; var floatAttributes = [ 'valueForRange', 'minValueForRange', 'maxValueForRange']; var htmlAttributes = [ ['type', 'inputType']]; var publicAttributes = []; $Array.forEach(stringAttributes, function(attributeName) { $Array.push(publicAttributes, attributeName); $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, { __proto__: null, get: function() { return GetStringAttribute(this.treeID, this.id, attributeName); } }); }); $Array.forEach(boolAttributes, function(attributeName) { $Array.push(publicAttributes, attributeName); $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, { __proto__: null, get: function() { return GetBoolAttribute(this.treeID, this.id, attributeName); } }); }); $Array.forEach(intAttributes, function(attributeName) { $Array.push(publicAttributes, attributeName); $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, { __proto__: null, get: function() { return GetIntAttribute(this.treeID, this.id, attributeName); } }); }); $Array.forEach(nodeRefAttributes, function(params) { var srcAttributeName = params[0]; var dstAttributeName = params[1]; $Array.push(publicAttributes, dstAttributeName); $Object.defineProperty(AutomationNodeImpl.prototype, dstAttributeName, { __proto__: null, get: function() { var id = GetIntAttribute(this.treeID, this.id, srcAttributeName); if (id && this.rootImpl) return this.rootImpl.get(id); else return undefined; } }); }); $Array.forEach(intListAttributes, function(attributeName) { $Array.push(publicAttributes, attributeName); $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, { __proto__: null, get: function() { return GetIntListAttribute(this.treeID, this.id, attributeName); } }); }); $Array.forEach(nodeRefListAttributes, function(params) { var srcAttributeName = params[0]; var dstAttributeName = params[1]; $Array.push(publicAttributes, dstAttributeName); $Object.defineProperty(AutomationNodeImpl.prototype, dstAttributeName, { __proto__: null, get: function() { var ids = GetIntListAttribute(this.treeID, this.id, srcAttributeName); if (!ids || !this.rootImpl) return undefined; var result = []; for (var i = 0; i < ids.length; ++i) { var node = this.rootImpl.get(ids[i]); if (node) $Array.push(result, node); } return result; } }); }); $Array.forEach(floatAttributes, function(attributeName) { $Array.push(publicAttributes, attributeName); $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, { __proto__: null, get: function() { return GetFloatAttribute(this.treeID, this.id, attributeName); } }); }); $Array.forEach(htmlAttributes, function(params) { var srcAttributeName = params[0]; var dstAttributeName = params[1]; $Array.push(publicAttributes, dstAttributeName); $Object.defineProperty(AutomationNodeImpl.prototype, dstAttributeName, { __proto__: null, get: function() { return GetHtmlAttribute(this.treeID, this.id, srcAttributeName); } }); }); /** * AutomationRootNode. * * An AutomationRootNode is the javascript end of an AXTree living in the * browser. AutomationRootNode handles unserializing incremental updates from * the source AXTree. Each update contains node data that form a complete tree * after applying the update. * * A brief note about ids used through this class. The source AXTree assigns * unique ids per node and we use these ids to build a hash to the actual * AutomationNode object. * Thus, tree traversals amount to a lookup in our hash. * * The tree itself is identified by the accessibility tree id of the * renderer widget host. * @constructor */ function AutomationRootNodeImpl(treeID) { $Function.call(AutomationNodeImpl, this, this); this.treeID = treeID; this.axNodeDataCache_ = {__proto__: null}; this.actionRequestIDToCallback_ = {__proto__: null}; } utils.defineProperty(AutomationRootNodeImpl, 'idToAutomationRootNode_', {__proto__: null}); utils.defineProperty(AutomationRootNodeImpl, 'get', function(treeID) { var result = AutomationRootNodeImpl.idToAutomationRootNode_[treeID]; return result || undefined; }); utils.defineProperty(AutomationRootNodeImpl, 'getOrCreate', function(treeID) { if (AutomationRootNodeImpl.idToAutomationRootNode_[treeID]) return AutomationRootNodeImpl.idToAutomationRootNode_[treeID]; var result = new AutomationRootNode(treeID); AutomationRootNodeImpl.idToAutomationRootNode_[treeID] = result; return result; }); utils.defineProperty(AutomationRootNodeImpl, 'destroy', function(treeID) { delete AutomationRootNodeImpl.idToAutomationRootNode_[treeID]; }); AutomationRootNodeImpl.prototype = { __proto__: AutomationNodeImpl.prototype, /** * @type {boolean} */ isRootNode: true, /** * @type {number} */ treeID: -1, /** * The parent of this node from a different tree. * @type {?AutomationNode} * @private */ hostNode_: null, /** * A map from id to AutomationNode. * @type {Object.} * @private */ axNodeDataCache_: null, actionRequestCounter_: 0, actionRequestIDToCallback_: null, get id() { var result = GetRootID(this.treeID); // Don't return undefined, because the id is often passed directly // as an argument to a native binding that expects only a valid number. if (result === undefined) return -1; return result; }, get chromeChannel() { return GetStringAttribute(this.treeID, this.id, 'chromeChannel'); }, get docUrl() { return GetDocURL(this.treeID); }, get docTitle() { return GetDocTitle(this.treeID); }, get docLoaded() { return GetDocLoaded(this.treeID); }, get docLoadingProgress() { return GetDocLoadingProgress(this.treeID); }, get anchorObject() { var id = GetAnchorObjectID(this.treeID); if (id && id != -1) return this.get(id); else return undefined; }, get anchorOffset() { var id = GetAnchorObjectID(this.treeID); if (id && id != -1) return GetAnchorOffset(this.treeID); }, get anchorAffinity() { var id = GetAnchorObjectID(this.treeID); if (id && id != -1) return GetAnchorAffinity(this.treeID); }, get focusObject() { var id = GetFocusObjectID(this.treeID); if (id && id != -1) return this.get(id); else return undefined; }, get focusOffset() { var id = GetFocusObjectID(this.treeID); if (id && id != -1) return GetFocusOffset(this.treeID); }, get focusAffinity() { var id = GetFocusObjectID(this.treeID); if (id && id != -1) return GetFocusAffinity(this.treeID); }, get: function(id) { if (id == undefined) return undefined; if (id == this.id) return this.wrapper; var obj = this.axNodeDataCache_[id]; if (obj) return obj; obj = new AutomationNode(this); privates(obj).impl.treeID = this.treeID; privates(obj).impl.id = id; this.axNodeDataCache_[id] = obj; return obj; }, remove: function(id) { if (this.axNodeDataCache_[id]) privates(this.axNodeDataCache_[id]).impl.detach(); delete this.axNodeDataCache_[id]; }, destroy: function() { this.dispatchEvent('destroyed', 'none'); for (var id in this.axNodeDataCache_) this.remove(id); this.detach(); }, setHostNode(hostNode) { this.hostNode_ = hostNode; }, onAccessibilityEvent: function(eventParams) { var targetNode = this.get(eventParams.targetID); if (targetNode) { var targetNodeImpl = privates(targetNode).impl; targetNodeImpl.dispatchEvent( eventParams.eventType, eventParams.eventFrom, eventParams.mouseX, eventParams.mouseY); if (eventParams.actionRequestID != -1) { this.onActionResult(eventParams.actionRequestID, targetNode); } } else { logging.WARNING('Got ' + eventParams.eventType + ' event on unknown node: ' + eventParams.targetID + '; this: ' + this.id); } return true; }, addActionResultCallback: function(callback) { this.actionRequestIDToCallback_[++this.actionRequestCounter_] = callback; return this.actionRequestCounter_; }, onActionResult: function(requestID, result) { if (requestID in this.actionRequestIDToCallback_) { this.actionRequestIDToCallback_[requestID](result); delete this.actionRequestIDToCallback_[requestID]; } }, toString: function() { function toStringInternal(nodeImpl, indent) { if (!nodeImpl) return ''; var output = ''; if (nodeImpl.isRootNode) output += indent + 'tree id=' + nodeImpl.treeID + '\n'; output += indent + $Function.call(AutomationNodeImpl.prototype.toString, nodeImpl) + '\n'; indent += ' '; var children = nodeImpl.children; for (var i = 0; i < children.length; ++i) output += toStringInternal(privates(children[i]).impl, indent); return output; } return toStringInternal(this, ''); }, }; function AutomationNode() { privates(AutomationNode).constructPrivate(this, arguments); } utils.expose(AutomationNode, AutomationNodeImpl, { functions: [ 'doDefault', 'find', 'findAll', 'focus', 'getImageData', 'hitTest', 'hitTestWithReply', 'makeVisible', 'matches', 'performCustomAction', 'resumeMedia', 'scrollBackward', 'scrollForward', 'scrollUp', 'scrollDown', 'scrollLeft', 'scrollRight', 'setSelection', 'setSequentialFocusNavigationStartingPoint', 'showContextMenu', 'startDuckingMedia', 'stopDuckingMedia', 'suspendMedia', 'addEventListener', 'removeEventListener', 'domQuerySelector', 'toString', 'boundsForRange', ], readonly: $Array.concat(publicAttributes, [ 'parent', 'firstChild', 'lastChild', 'children', 'previousSibling', 'nextSibling', 'isRootNode', 'role', 'checked', 'restriction', 'state', 'location', 'indexInParent', 'lineStartOffsets', 'root', 'htmlAttributes', 'nameFrom', 'bold', 'italic', 'underline', 'lineThrough', 'customActions', 'unclippedLocation', ]), }); function AutomationRootNode() { privates(AutomationRootNode).constructPrivate(this, arguments); } utils.expose(AutomationRootNode, AutomationRootNodeImpl, { superclass: AutomationNode, readonly: [ 'chromeChannel', 'docTitle', 'docUrl', 'docLoaded', 'docLoadingProgress', 'anchorObject', 'anchorOffset', 'anchorAffinity', 'focusObject', 'focusOffset', 'focusAffinity', ], }); utils.defineProperty(AutomationRootNode, 'get', function(treeID) { return AutomationRootNodeImpl.get(treeID); }); utils.defineProperty(AutomationRootNode, 'getOrCreate', function(treeID) { return AutomationRootNodeImpl.getOrCreate(treeID); }); utils.defineProperty(AutomationRootNode, 'destroy', function(treeID) { AutomationRootNodeImpl.destroy(treeID); }); exports.$set('AutomationNode', AutomationNode); exports.$set('AutomationRootNode', AutomationRootNode); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the browserAction API. var binding = apiBridge || require('binding').Binding.create('browserAction'); var setIcon = require('setIcon').setIcon; var getExtensionViews = requireNative('runtime').GetExtensionViews; var sendRequest = bindingUtil ? $Function.bind(bindingUtil.sendRequest, bindingUtil) : require('sendRequest').sendRequest; var jsLastError = bindingUtil ? undefined : require('lastError'); function hasLastError() { return bindingUtil ? bindingUtil.hasLastError() : jsLastError.hasError(chrome); } binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, function(args) { sendRequest('browserAction.setIcon', [args, callback], apiBridge ? undefined : this.definition.parameters, undefined); }.bind(this)); }); apiFunctions.setCustomCallback('openPopup', function(name, request, callback, response) { if (!callback) return; if (hasLastError()) { callback(); } else { var views = getExtensionViews(-1, -1, 'POPUP'); callback(views.length > 0 ? views[0] : null); } }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming RtpStream API. var binding = apiBridge || require('binding').Binding.create('cast.streaming.rtpStream'); var natives = requireNative('cast_streaming_natives'); binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('destroy', function(transportId) { natives.DestroyCastRtpStream(transportId); }); apiFunctions.setHandleRequest('getSupportedParams', function(transportId) { return natives.GetSupportedParamsCastRtpStream(transportId); }); apiFunctions.setHandleRequest('start', function(transportId, params) { natives.StartCastRtpStream(transportId, params); }); apiFunctions.setHandleRequest('stop', function(transportId) { natives.StopCastRtpStream(transportId); }); apiFunctions.setHandleRequest('toggleLogging', function(transportId, enable) { natives.ToggleLogging(transportId, enable); }); apiFunctions.setHandleRequest('getRawEvents', function(transportId, extraData, callback) { natives.GetRawEvents(transportId, extraData, callback); }); apiFunctions.setHandleRequest('getStats', function(transportId, callback) { natives.GetStats(transportId, callback); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming Session API. var binding = apiBridge || require('binding').Binding.create('cast.streaming.session'); var natives = requireNative('cast_streaming_natives'); binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('create', function(audioTrack, videoTrack, callback) { natives.CreateSession(audioTrack, videoTrack, callback); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming UdpTransport API. var binding = apiBridge || require('binding').Binding.create('cast.streaming.udpTransport'); var natives = requireNative('cast_streaming_natives'); binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('destroy', function(transportId) { natives.DestroyCastUdpTransport(transportId); }); apiFunctions.setHandleRequest('setDestination', function(transportId, destination) { natives.SetDestinationCastUdpTransport(transportId, destination); }); apiFunctions.setHandleRequest('setOptions', function(transportId, options) { natives.SetOptionsCastUdpTransport(transportId, options); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming Session API. var binding = apiBridge || require('binding').Binding.create('cast.streaming.receiverSession'); var natives = requireNative('cast_streaming_natives'); binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest( 'createAndBind', function(ap, vp, local, weidgth, height, fr, url, cb, op) { natives.StartCastRtpReceiver( ap, vp, local, weidgth, height, fr, url, cb, op); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var Event = require('event_bindings').Event; var sendRequest = require('sendRequest').sendRequest; var validate = require('schemaUtils').validate; function extendSchema(schema) { var extendedSchema = $Array.slice(schema); $Array.unshift(extendedSchema, {'type': 'string'}); return extendedSchema; } // TODO(devlin): Maybe find a way to combine this and ContentSetting. function ChromeSetting(prefKey, valueSchema, schema) { var getFunctionParameters = function(name) { var f = $Array.filter( schema.functions, function(f) { return f.name === name; })[0]; return f.parameters; }; this.get = function(details, callback) { var getSchema = getFunctionParameters('get'); validate([details, callback], getSchema); return sendRequest('types.ChromeSetting.get', [prefKey, details, callback], extendSchema(getSchema)); }; this.set = function(details, callback) { // The set schema included in the Schema object is generic, since it varies // per-setting. However, this is only ever for a single setting, so we can // enforce the types more thoroughly. var rawSetSchema = getFunctionParameters('set'); var rawSettingParam = rawSetSchema[0]; var props = $Object.assign({}, rawSettingParam.properties); props.value = valueSchema; var modSettingParam = { name: rawSettingParam.name, type: rawSettingParam.type, properties: props, }; var modSetSchema = $Array.slice(rawSetSchema); modSetSchema[0] = modSettingParam; validate([details, callback], modSetSchema); return sendRequest('types.ChromeSetting.set', [prefKey, details, callback], extendSchema(modSetSchema)); }; this.clear = function(details, callback) { var clearSchema = getFunctionParameters('clear'); validate([details, callback], clearSchema); return sendRequest('types.ChromeSetting.clear', [prefKey, details, callback], extendSchema(clearSchema)); }; this.onChange = new Event('types.ChromeSetting.' + prefKey + '.onChange'); }; exports.$set('ChromeSetting', ChromeSetting); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var binding = apiBridge || require('binding').Binding.create('chromeWebViewInternal'); var contextMenusHandlers = require('contextMenusHandlers'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var handlers = contextMenusHandlers.create(true /* isWebview */); apiFunctions.setHandleRequest( 'contextMenusCreate', handlers.requestHandlers.create); apiFunctions.setHandleRequest( 'contextMenusUpdate', handlers.requestHandlers.update); apiFunctions.setHandleRequest( 'contextMenusRemove', handlers.requestHandlers.remove); apiFunctions.setHandleRequest( 'contextMenusRemoveAll', handlers.requestHandlers.removeAll); }); if (!apiBridge) exports.$set('ChromeWebView', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements chrome-specific API. // See web_view_api_methods.js for details. var ChromeWebView = getInternalApi ? getInternalApi('chromeWebViewInternal') : require('chromeWebViewInternal').ChromeWebView; var ChromeWebViewSchema = requireNative('schema_registry').GetSchema('chromeWebViewInternal'); var CreateEvent = require('guestViewEvents').CreateEvent; var GuestViewInternalNatives = requireNative('guest_view_internal'); var idGeneratorNatives = requireNative('id_generator'); var utils = require('utils'); var WebViewImpl = require('webView').WebViewImpl; // This is the only "webViewInternal.onClicked" named event for this renderer. // // Since we need an event per , we define events with suffix // (subEventName) in each of the . Behind the scenes, this event is // registered as a ContextMenusEvent, with filter set to the webview's // |viewInstanceId|. Any time a ContextMenusEvent is dispatched, we re-dispatch // it to the subEvent's listeners. This way // .contextMenus.onClicked behave as a regular chrome Event type. var ContextMenusEvent = CreateEvent('chromeWebViewInternal.onClicked'); // See comment above. var ContextMenusHandlerEvent = CreateEvent('chromeWebViewInternal.onContextMenuShow'); var jsEvent; function createCustomEvent(name, schema, options, webviewId) { if (bindingUtil) return bindingUtil.createCustomEvent(name, undefined, false, false); if (!jsEvent) jsEvent = require('event_bindings').Event; return new jsEvent(name, schema, options, webviewId); } // This event is exposed as .contextMenus.onClicked. function createContextMenusOnClickedEvent(webViewInstanceId, opt_eventName, opt_argSchemas, opt_eventOptions) { var subEventName = GetUniqueSubEventName(opt_eventName); var newEvent = createCustomEvent(subEventName, opt_argSchemas, opt_eventOptions, webViewInstanceId); var view = GuestViewInternalNatives.GetViewFromID(webViewInstanceId); if (view) { view.events.addScopedListener( ContextMenusEvent, $Function.bind(function() { // Re-dispatch to subEvent's listeners. $Function.apply(newEvent.dispatch, newEvent, $Array.slice(arguments)); }, newEvent), {instanceId: webViewInstanceId}); } return newEvent; } // This event is exposed as .contextMenus.onShow. function createContextMenusOnContextMenuEvent(webViewInstanceId, opt_eventName, opt_argSchemas, opt_eventOptions) { var subEventName = GetUniqueSubEventName(opt_eventName); var newEvent = createCustomEvent(subEventName, opt_argSchemas, opt_eventOptions, webViewInstanceId); var view = GuestViewInternalNatives.GetViewFromID(webViewInstanceId); if (view) { view.events.addScopedListener( ContextMenusHandlerEvent, $Function.bind(function(e) { var defaultPrevented = false; var event = { preventDefault: function() { defaultPrevented = true; } }; // Re-dispatch to subEvent's listeners. $Function.apply(newEvent.dispatch, newEvent, [event]); if (!defaultPrevented) { // TODO(lazyboy): Remove |items| parameter completely from // ChromeWebView.showContextMenu as we don't do anything useful with // it currently. var items = []; var guestInstanceId = GuestViewInternalNatives. GetViewFromID(webViewInstanceId).guest.getId(); ChromeWebView.showContextMenu(guestInstanceId, e.requestId, items); } }, newEvent), {instanceId: webViewInstanceId}); } return newEvent; } // ----------------------------------------------------------------------------- // WebViewContextMenusImpl object. // An instance of this class is exposed as .contextMenus. function WebViewContextMenusImpl(viewInstanceId) { this.viewInstanceId_ = viewInstanceId; } $Object.setPrototypeOf(WebViewContextMenusImpl.prototype, null); WebViewContextMenusImpl.prototype.create = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusCreate, null, args); }; WebViewContextMenusImpl.prototype.remove = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusRemove, null, args); }; WebViewContextMenusImpl.prototype.removeAll = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusRemoveAll, null, args); }; WebViewContextMenusImpl.prototype.update = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusUpdate, null, args); }; function WebViewContextMenus() { privates(WebViewContextMenus).constructPrivate(this, arguments); } utils.expose(WebViewContextMenus, WebViewContextMenusImpl, { functions: [ 'create', 'remove', 'removeAll', 'update', ], }); // ----------------------------------------------------------------------------- WebViewImpl.prototype.maybeSetupContextMenus = function() { if (!this.contextMenusOnContextMenuEvent_) { var eventName = 'chromeWebViewInternal.onContextMenuShow'; var eventSchema = utils.lookup(ChromeWebViewSchema.events, 'name', 'onShow'); var eventOptions = {supportsListeners: true, supportsLazyListeners: false}; this.contextMenusOnContextMenuEvent_ = createContextMenusOnContextMenuEvent( this.viewInstanceId, eventName, eventSchema, eventOptions); } var createContextMenus = $Function.bind(function() { return this.weakWrapper(function() { if (this.contextMenus_) { return this.contextMenus_; } this.contextMenus_ = new WebViewContextMenus(this.viewInstanceId); // Define 'onClicked' event property on |this.contextMenus_|. var getOnClickedEvent = $Function.bind(function() { return this.weakWrapper(function() { if (!this.contextMenusOnClickedEvent_) { var eventName = 'chromeWebViewInternal.onClicked'; var eventSchema = utils.lookup(ChromeWebViewSchema.events, 'name', 'onClicked'); var eventOptions = {supportsListeners: true, supportsLazyListeners: false}; var onClickedEvent = createContextMenusOnClickedEvent( this.viewInstanceId, eventName, eventSchema, eventOptions); this.contextMenusOnClickedEvent_ = onClickedEvent; return onClickedEvent; } return this.contextMenusOnClickedEvent_; }); }, this); $Object.defineProperty( this.contextMenus_, 'onClicked', {get: getOnClickedEvent(), enumerable: true}); $Object.defineProperty( this.contextMenus_, 'onShow', { get: this.weakWrapper(function() { return this.contextMenusOnContextMenuEvent_; }), enumerable: true }); return this.contextMenus_; }); }, this); // Expose .contextMenus object. $Object.defineProperty( this.element, 'contextMenus', { get: createContextMenus(), enumerable: true }); }; function GetUniqueSubEventName(eventName) { return eventName + '/' + idGeneratorNatives.GetNextId(); } // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the contentSettings API. var sendRequest = require('sendRequest').sendRequest; var validate = require('schemaUtils').validate; // Some content types have been removed and no longer correspond to a real // content setting. Instead, these always return a fixed dummy value, and issue // a warning when accessed. This maps the content type name to the dummy value. var DEPRECATED_CONTENT_TYPES = { __proto__: null, fullscreen: 'allow', mouselock: 'allow', }; function extendSchema(schema) { var extendedSchema = $Array.slice(schema); $Array.unshift(extendedSchema, {'type': 'string'}); return extendedSchema; } function ContentSetting(contentType, settingSchema, schema) { var getFunctionParameters = function(name) { var f = $Array.filter( schema.functions, function(f) { return f.name === name; })[0]; return f.parameters; }; this.get = function(details, callback) { var getSchema = getFunctionParameters('get'); validate([details, callback], getSchema); var dummySetting = DEPRECATED_CONTENT_TYPES[contentType]; if (dummySetting !== undefined) { console.warn('contentSettings.' + contentType + ' is deprecated; it will ' + 'always return \'' + dummySetting + '\'.'); $Function.apply(callback, undefined, [{setting: dummySetting}]); return; } return sendRequest('contentSettings.get', [contentType, details, callback], extendSchema(getSchema)); }; this.set = function(details, callback) { // We check if the setting is deprecated first, since the validation will // fail for deprecated types. if ($Object.hasOwnProperty(DEPRECATED_CONTENT_TYPES, contentType)) { console.warn('contentSettings.' + contentType + ' is deprecated; setting ' + 'it has no effect.'); $Function.apply(callback, undefined, []); return; } // The set schema included in the Schema object is generic, since it varies // per-setting. However, this is only ever for a single setting, so we can // enforce the types more thoroughly. var rawSetSchema = getFunctionParameters('set'); var rawSettingParam = rawSetSchema[0]; var props = $Object.assign({}, rawSettingParam.properties); props.setting = settingSchema; var modSettingParam = { name: rawSettingParam.name, type: rawSettingParam.type, properties: props, }; var modSetSchema = $Array.slice(rawSetSchema); modSetSchema[0] = modSettingParam; validate([details, callback], modSetSchema); return sendRequest('contentSettings.set', [contentType, details, callback], extendSchema(modSetSchema)); }; this.clear = function(details, callback) { var clearSchema = getFunctionParameters('clear'); validate([details, callback], clearSchema); if ($Object.hasOwnProperty(DEPRECATED_CONTENT_TYPES, contentType)) { console.warn('contentSettings.' + contentType + ' is deprecated; ' + 'clearing it has no effect.'); $Function.apply(callback, undefined, []); return; } return sendRequest('contentSettings.clear', [contentType, details, callback], extendSchema(clearSchema)); }; this.getResourceIdentifiers = function(callback) { var schema = getFunctionParameters('getResourceIdentifiers'); validate([callback], schema); if ($Object.hasOwnProperty(DEPRECATED_CONTENT_TYPES, contentType)) { $Function.apply(callback, undefined, []); return; } return sendRequest( 'contentSettings.getResourceIdentifiers', [contentType, callback], extendSchema(schema)); }; } exports.$set('ContentSetting', ContentSetting); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the declarativeContent API. var binding = apiBridge || require('binding').Binding.create('declarativeContent'); if (!apiBridge) { var utils = require('utils'); var validate = require('schemaUtils').validate; var canonicalizeCompoundSelector = requireNative('css_natives').CanonicalizeCompoundSelector; } var setIcon = require('setIcon').setIcon; binding.registerCustomHook(function(api) { var declarativeContent = api.compiledApi; if (apiBridge) { // Validation for most types is done in the native C++ with native bindings, // but setIcon is funny (and sadly broken). Ideally, we can move this // validation entirely into the native code, and this whole file can go // away. var nativeSetIcon = declarativeContent.SetIcon; declarativeContent.SetIcon = function(parameters) { // TODO(devlin): This is very, very wrong. setIcon() is potentially // asynchronous (in the case of a path being specified), which means this // becomes an "asynchronous constructor". Errors can be thrown *after* the // `new declarativeContent.SetIcon(...)` call, and in the async cases, // this wouldn't work when we immediately add the action via an API call // (e.g., // chrome.declarativeContent.onPageChange.addRules( // [{conditions: ..., actions: [ new SetIcon(...) ]}]); // ). Some of this is tracked in http://crbug.com/415315. setIcon(parameters, $Function.bind(function(data) { // Fake calling the original function as a constructor. $Object.setPrototypeOf(this, nativeSetIcon.prototype); $Function.apply(nativeSetIcon, this, [data]); }, this)); }; return; } // Returns the schema definition of type |typeId| defined in |namespace|. function getSchema(typeId) { return utils.lookup(api.schema.types, 'id', 'declarativeContent.' + typeId); } // Helper function for the constructor of concrete datatypes of the // declarative content API. // Makes sure that |this| contains the union of parameters and // {'instanceType': 'declarativeContent.' + typeId} and validates the // generated union dictionary against the schema for |typeId|. function setupInstance(instance, parameters, typeId) { for (var key in parameters) { if ($Object.hasOwnProperty(parameters, key)) { instance[key] = parameters[key]; } } instance.instanceType = 'declarativeContent.' + typeId; var schema = getSchema(typeId); validate([instance], [schema]); } function canonicalizeCssSelectors(selectors) { for (var i = 0; i < selectors.length; i++) { var canonicalizedSelector = canonicalizeCompoundSelector(selectors[i]); if (canonicalizedSelector == '') { throw new Error( 'Element of \'css\' array must be a ' + 'list of valid compound selectors: ' + selectors[i]); } selectors[i] = canonicalizedSelector; } } // Setup all data types for the declarative content API. declarativeContent.PageStateMatcher = function(parameters) { setupInstance(this, parameters, 'PageStateMatcher'); if ($Object.hasOwnProperty(this, 'css')) { canonicalizeCssSelectors(this.css); } }; declarativeContent.ShowPageAction = function(parameters) { setupInstance(this, parameters, 'ShowPageAction'); }; declarativeContent.RequestContentScript = function(parameters) { setupInstance(this, parameters, 'RequestContentScript'); }; // TODO(rockot): Do not expose this in M39 stable. Making this restriction // possible will take some extra work. See http://crbug.com/415315 // Note: See also the SetIcon wrapper above for more issues. declarativeContent.SetIcon = function(parameters) { setIcon(parameters, $Function.bind(function(data) { setupInstance(this, data, 'SetIcon'); }, this)); }; }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the desktopCapture API. var binding = apiBridge || require('binding').Binding.create('desktopCapture'); var sendRequest = bindingUtil ? $Function.bind(bindingUtil.sendRequest, bindingUtil) : require('sendRequest').sendRequest; var idGenerator = requireNative('id_generator'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var pendingRequests = {}; function onRequestResult(id, result, options) { if (id in pendingRequests) { var callback = pendingRequests[id]; delete pendingRequests[id]; callback(result, options); } } apiFunctions.setHandleRequest('chooseDesktopMedia', function(sources, target_tab, callback) { // |target_tab| is an optional parameter. if (callback === undefined) { callback = target_tab; target_tab = undefined; } var id = idGenerator.GetNextId(); pendingRequests[id] = callback; sendRequest('desktopCapture.chooseDesktopMedia', [id, sources, target_tab, $Function.bind(onRequestResult, null, id)], apiBridge ? undefined : this.definition.parameters, undefined); return id; }); apiFunctions.setHandleRequest('cancelChooseDesktopMedia', function(id) { if (id in pendingRequests) { delete pendingRequests[id]; sendRequest('desktopCapture.cancelChooseDesktopMedia', [id], apiBridge ? undefined : this.definition.parameters, undefined); } }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the developerPrivate API. var binding = apiBridge || require('binding').Binding.create('developerPrivate'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; // Converts the argument of |functionName| from DirectoryEntry to URL. function bindFileSystemFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(directoryEntry, callback) { var fileSystemName = directoryEntry.filesystem.name; var relativePath = $String.slice(directoryEntry.fullPath, 1); var url = directoryEntry.toURL(); return [fileSystemName, relativePath, url, callback]; }); } bindFileSystemFunction('loadDirectory'); // developerPrivate.enable is the same as chrome.management.setEnabled. // TODO(devlin): Migrate callers off developerPrivate.enable. bindingsAPI.compiledApi.enable = chrome.management.setEnabled; apiFunctions.setHandleRequest('allowFileAccess', function(id, allow, callback) { chrome.developerPrivate.updateExtensionConfiguration( {extensionId: id, fileAccess: allow}, callback); }); apiFunctions.setHandleRequest('allowIncognito', function(id, allow, callback) { chrome.developerPrivate.updateExtensionConfiguration( {extensionId: id, incognitoAccess: allow}, callback); }); apiFunctions.setHandleRequest('inspect', function(options, callback) { var renderViewId = options.render_view_id; if (typeof renderViewId == 'string') { renderViewId = parseInt(renderViewId); if (isNaN(renderViewId)) throw new Error('Invalid value for render_view_id'); } var renderProcessId = options.render_process_id; if (typeof renderProcessId == 'string') { renderProcessId = parseInt(renderProcessId); if (isNaN(renderProcessId)) throw new Error('Invalid value for render_process_id'); } chrome.developerPrivate.openDevTools({ extensionId: options.extension_id, renderProcessId: renderProcessId, renderViewId: renderViewId, incognito: options.incognito }, callback); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the downloads API. var binding = apiBridge || require('binding').Binding.create('downloads'); var downloadsInternal = getInternalApi ? getInternalApi('downloadsInternal') : require('binding').Binding.create('downloadsInternal').generate(); var registerArgumentMassager = bindingUtil ? $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) : require('event_bindings').registerArgumentMassager; registerArgumentMassager('downloads.onDeterminingFilename', function(args, dispatch) { var downloadItem = args[0]; // Copy the id so that extensions can't change it. var downloadId = downloadItem.id; var suggestable = true; function isValidResult(result) { if (result === undefined) return false; if (typeof(result) != 'object') { console.error('Error: Invocation of form suggest(' + typeof(result) + ') doesn\'t match definition suggest({filename: string, ' + 'conflictAction: string})'); return false; } else if ((typeof(result.filename) != 'string') || (result.filename.length == 0)) { console.error('Error: "filename" parameter to suggest() must be a ' + 'non-empty string'); return false; } else if ([undefined, 'uniquify', 'overwrite', 'prompt'].indexOf( result.conflictAction) < 0) { console.error('Error: "conflictAction" parameter to suggest() must be ' + 'one of undefined, "uniquify", "overwrite", "prompt"'); return false; } return true; } function suggestCallback(result) { if (!suggestable) { console.error('suggestCallback may not be called more than once.'); return; } suggestable = false; if (isValidResult(result)) { downloadsInternal.determineFilename( downloadId, result.filename, result.conflictAction || ""); } else { downloadsInternal.determineFilename(downloadId, "", ""); } } try { var results = dispatch([downloadItem, suggestCallback]); var async = (results && results.results && (results.results.length != 0) && (results.results[0] === true)); if (suggestable && !async) suggestCallback(); } catch (e) { suggestCallback(); throw e; } }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var Event = require('event_bindings').Event; // The EasyUnlockProximityRequired object is just a stub that has an onChange // event, which is never triggered. // TODO(devlin): Remove this once the preferencesPrivate API is fully removed. // https://crbug.com/593166 function EasyUnlockProximityRequired(prefKey, valueSchema, schema) { // Note: technically, extensions could intercept this through a setter on // Object.prototype(). We don't really care, because a) this is only for a // private API, so we shouldn't have to worry about untrusted code, and b) // this is an anonymous event, which exposes no attack surface and will be // exposed to the extension anyway. this.onChange = new Event(); }; exports.$set('EasyUnlockProximityRequired', EasyUnlockProximityRequired); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the feedbackPrivate API. var binding = apiBridge || require('binding').Binding.create('feedbackPrivate'); var blobNatives = requireNative('blob_natives'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setUpdateArgumentsPostValidate( "sendFeedback", function(feedbackInfo, callback) { var attachedFileBlobUuid = ''; var screenshotBlobUuid = ''; if (feedbackInfo.attachedFile) attachedFileBlobUuid = blobNatives.GetBlobUuid(feedbackInfo.attachedFile.data); if (feedbackInfo.screenshot) screenshotBlobUuid = blobNatives.GetBlobUuid(feedbackInfo.screenshot); feedbackInfo.attachedFileBlobUuid = attachedFileBlobUuid; feedbackInfo.screenshotBlobUuid = screenshotBlobUuid; return [feedbackInfo, callback]; }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the GCM API. var binding = apiBridge || require('binding').Binding.create('gcm'); var forEach = require('utils').forEach; binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var gcm = bindingsAPI.compiledApi; apiFunctions.setUpdateArgumentsPostValidate( 'send', function(message, callback) { // Validate message.data. var payloadSize = 0; forEach(message.data, function(property, value) { if (property.length == 0) throw new Error("One of data keys is empty."); var lowerCasedProperty = property.toLowerCase(); // Issue an error for forbidden prefixes of property names. if (lowerCasedProperty.startsWith("goog.") || lowerCasedProperty.startsWith("google") || property.startsWith("collapse_key")) { throw new Error("Invalid data key: " + property); } payloadSize += property.length + value.length; }); if (payloadSize > gcm.MAX_MESSAGE_SIZE) throw new Error("Payload exceeded allowed size limit. Payload size is: " + payloadSize); if (payloadSize == 0) throw new Error("No data to send."); return arguments; }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Identity API. var binding = apiBridge || require('binding').Binding.create('identity'); binding.registerCustomHook(function(binding, id, contextType) { var apiFunctions = binding.apiFunctions; apiFunctions.setHandleRequest('getRedirectURL', function(path) { if (path === null || path === undefined) path = '/'; else path = String(path); if (path[0] != '/') path = '/' + path; return 'https://' + id + '.chromiumapp.org' + path; }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the image writer private API. var binding = apiBridge || require('binding').Binding.create('imageWriterPrivate'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setUpdateArgumentsPostValidate( 'writeFromFile', function(device, fileEntry, options, callback) { var fileSystemName = fileEntry.filesystem.name; var relativePath = $String.slice(fileEntry.fullPath, 1); return [device, fileSystemName, relativePath, callback]; }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the input ime API. Only injected into the // v8 contexts for extensions which have permission for the API. var binding = apiBridge || require('binding').Binding.create('input.ime'); var appWindowNatives = requireNative('app_window_natives'); var registerArgumentMassager = bindingUtil ? $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) : require('event_bindings').registerArgumentMassager; // TODO(crbug.com/733825): These bindings have some issues. var inputIme; registerArgumentMassager('input.ime.onKeyEvent', function(args, dispatch) { var keyData = args[1]; var result = false; try { // dispatch() is weird - it returns an object {results: array} iff // there is at least one result value that !== undefined. Since onKeyEvent // has a maximum of one listener, we know that any result we find is the one // we're interested in. var dispatchResult = dispatch(args); if (dispatchResult && dispatchResult.results) result = dispatchResult.results[0]; } catch (e) { console.error('Error in event handler for onKeyEvent: ' + e.stack); } if (!inputIme.onKeyEvent.async) inputIme.keyEventHandled(keyData.requestId, result); }); binding.registerCustomHook(function(api) { inputIme = api.compiledApi; var originalAddListener = inputIme.onKeyEvent.addListener; inputIme.onKeyEvent.addListener = function(cb, opt_extraInfo) { inputIme.onKeyEvent.async = false; if (opt_extraInfo instanceof Array) { for (var i = 0; i < opt_extraInfo.length; ++i) { if (opt_extraInfo[i] == 'async') { inputIme.onKeyEvent.async = true; } } } $Function.call(originalAddListener, this, cb); }; api.apiFunctions.setCustomCallback('createWindow', function(name, request, callback, windowParams) { if (!callback) { return; } var view; if (windowParams && windowParams.frameId) { view = appWindowNatives.GetFrame( windowParams.frameId, false /* notifyBrowser */); view.id = windowParams.frameId; } callback(view); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Media Gallery API. var binding = apiBridge || require('binding').Binding.create('mediaGalleries'); var blobNatives = requireNative('blob_natives'); var mediaGalleriesNatives = requireNative('mediaGalleries'); var sendRequest = bindingUtil ? $Function.bind(bindingUtil.sendRequest, bindingUtil) : require('sendRequest').sendRequest; var blobsAwaitingMetadata = {}; var mediaGalleriesMetadata = {}; function createFileSystemObjectsAndUpdateMetadata(response) { var result = []; mediaGalleriesMetadata = {}; // Clear any previous metadata. if (response) { for (var i = 0; i < response.length; i++) { var filesystem = mediaGalleriesNatives.GetMediaFileSystemObject( response[i].fsid); $Array.push(result, filesystem); var metadata = response[i]; delete metadata.fsid; mediaGalleriesMetadata[filesystem.name] = metadata; } } return result; } binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; // getMediaFileSystems and addUserSelectedFolder use a custom callback so that // they can instantiate and return an array of file system objects. apiFunctions.setCustomCallback('getMediaFileSystems', function(name, request, callback, response) { var result = createFileSystemObjectsAndUpdateMetadata(response); if (callback) callback(result); }); apiFunctions.setCustomCallback('addUserSelectedFolder', function(name, request, callback, response) { var fileSystems = []; var selectedFileSystemName = ""; if (response && 'mediaFileSystems' in response && 'selectedFileSystemIndex' in response) { fileSystems = createFileSystemObjectsAndUpdateMetadata( response['mediaFileSystems']); var selectedFileSystemIndex = response['selectedFileSystemIndex']; if (selectedFileSystemIndex >= 0) { selectedFileSystemName = fileSystems[selectedFileSystemIndex].name; } } if (callback) callback(fileSystems, selectedFileSystemName); }); apiFunctions.setHandleRequest('getMediaFileSystemMetadata', function(filesystem) { if (filesystem && filesystem.name && filesystem.name in mediaGalleriesMetadata) { return mediaGalleriesMetadata[filesystem.name]; } return { 'name': '', 'galleryId': '', 'isRemovable': false, 'isMediaDevice': false, 'isAvailable': false, }; }); function getMetadataCallback(uuid, name, request, callback, response) { if (response && response.attachedImagesBlobInfo) { for (var i = 0; i < response.attachedImagesBlobInfo.length; i++) { var blobInfo = response.attachedImagesBlobInfo[i]; var blob = blobNatives.TakeBrowserProcessBlob( blobInfo.blobUUID, blobInfo.type, blobInfo.size); response.metadata.attachedImages.push(blob); } } if (callback) callback(response ? response.metadata : null); delete blobsAwaitingMetadata[uuid]; } apiFunctions.setHandleRequest('getMetadata', function(mediaFile, options, callback) { var blobUuid = blobNatives.GetBlobUuid(mediaFile) // Store the blob in a global object to keep its refcount nonzero -- this // prevents the object from being garbage collected before any metadata // parsing gets to occur (see crbug.com/415792). blobsAwaitingMetadata[blobUuid] = mediaFile; var optArgs = { __proto__: null, customCallback: $Function.bind(getMetadataCallback, null, blobUuid), }; sendRequest('mediaGalleries.getMetadata', [blobUuid, options, callback], bindingUtil ? undefined : this.definition.parameters, optArgs); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the notifications API. // var binding = apiBridge || require('binding').Binding.create('notifications'); var sendRequest = bindingUtil ? $Function.bind(bindingUtil.sendRequest, bindingUtil) : require('sendRequest').sendRequest; var exceptionHandler = require('uncaught_exception_handler'); var imageUtil = require('imageUtil'); var notificationsPrivate = requireNative('notifications_private'); var jsLastError = bindingUtil ? undefined : require('lastError'); function runCallbackWithLastError(name, message, stack, callback, args) { if (bindingUtil) { bindingUtil.runCallbackWithLastError(message, function() { $Function.apply(callback, null, args); }); } else { jsLastError.run(name, message, stack, callback, args); } } function imageDataSetter(context, key) { var f = function(val) { this[key] = val; }; return $Function.bind(f, context); } // A URL Spec is an object with the following keys: // path: The resource to be downloaded. // width: (optional) The maximum width of the image to be downloaded in device // pixels. // height: (optional) The maximum height of the image to be downloaded in // device pixels. // callback: A function to be called when the URL is complete. It // should accept an ImageData object and set the appropriate // field in |notificationDetails|. function getUrlSpecs(imageSizes, notificationDetails) { var urlSpecs = []; // |iconUrl| might be optional for notification updates. if (notificationDetails.iconUrl) { $Array.push(urlSpecs, { path: notificationDetails.iconUrl, width: imageSizes.icon.width * imageSizes.scaleFactor, height: imageSizes.icon.height * imageSizes.scaleFactor, callback: imageDataSetter(notificationDetails, 'iconBitmap') }); } // |appIconMaskUrl| is optional. if (notificationDetails.appIconMaskUrl) { $Array.push(urlSpecs, { path: notificationDetails.appIconMaskUrl, width: imageSizes.appIconMask.width * imageSizes.scaleFactor, height: imageSizes.appIconMask.height * imageSizes.scaleFactor, callback: imageDataSetter(notificationDetails, 'appIconMaskBitmap') }); } // |imageUrl| is optional. if (notificationDetails.imageUrl) { $Array.push(urlSpecs, { path: notificationDetails.imageUrl, width: imageSizes.image.width * imageSizes.scaleFactor, height: imageSizes.image.height * imageSizes.scaleFactor, callback: imageDataSetter(notificationDetails, 'imageBitmap') }); } // Each button has an optional icon. var buttonList = notificationDetails.buttons; if (buttonList && typeof buttonList.length === 'number') { var numButtons = buttonList.length; for (var i = 0; i < numButtons; i++) { if (buttonList[i].iconUrl) { $Array.push(urlSpecs, { path: buttonList[i].iconUrl, width: imageSizes.buttonIcon.width * imageSizes.scaleFactor, height: imageSizes.buttonIcon.height * imageSizes.scaleFactor, callback: imageDataSetter(buttonList[i], 'iconBitmap') }); } } } return urlSpecs; } function replaceNotificationOptionURLs(notification_details, callback) { var imageSizes = notificationsPrivate.GetNotificationImageSizes(); var url_specs = getUrlSpecs(imageSizes, notification_details); if (!url_specs.length) { callback(true); return; } var errors = 0; imageUtil.loadAllImages(url_specs, { onerror: function(index) { errors++; }, oncomplete: function(imageData) { if (errors > 0) { callback(false); return; } for (var index = 0; index < url_specs.length; index++) { var url_spec = url_specs[index]; url_spec.callback(imageData[index]); } callback(true); } }); } function genHandle(name, failure_function) { return function(id, input_notification_details, callback) { // TODO(dewittj): Remove this hack. This is used as a way to deep // copy a complex JSON object. var notification_details = $JSON.parse( $JSON.stringify(input_notification_details)); var that = this; var stack = exceptionHandler.getExtensionStackTrace(); replaceNotificationOptionURLs(notification_details, function(success) { if (success) { sendRequest( name, [id, notification_details, callback], bindingUtil ? undefined : that.definition.parameters, bindingUtil ? undefined : {__proto__: null, stack: stack}); return; } runCallbackWithLastError( name, 'Unable to download all specified images.', stack, failure_function, [callback || function() {}, id]); }); }; } var handleCreate = genHandle('notifications.create', function(callback, id) { callback(id); }); var handleUpdate = genHandle('notifications.update', function(callback, id) { callback(false); }); var notificationsCustomHook = function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('create', handleCreate); apiFunctions.setHandleRequest('update', handleUpdate); }; binding.registerCustomHook(notificationsCustomHook); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the omnibox API. Only injected into the v8 contexts // for extensions which have permission for the omnibox API. var binding = apiBridge || require('binding').Binding.create('omnibox'); var registerArgumentMassager = bindingUtil ? $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) : require('event_bindings').registerArgumentMassager; var sendRequest = bindingUtil ? $Function.bind(bindingUtil.sendRequest, bindingUtil) : require('sendRequest').sendRequest; // Remove invalid characters from |text| so that it is suitable to use // for |AutocompleteMatch::contents|. function sanitizeString(text, shouldTrim) { // NOTE: This logic mirrors |AutocompleteMatch::SanitizeString()|. // 0x2028 = line separator; 0x2029 = paragraph separator. var kRemoveChars = /(\r|\n|\t|\u2028|\u2029)/gm; if (shouldTrim) text = text.trimLeft(); return text.replace(kRemoveChars, ''); } // Parses the xml syntax supported by omnibox suggestion results. Returns an // object with two properties: 'description', which is just the text content, // and 'descriptionStyles', which is an array of style objects in a format // understood by the C++ backend. function parseOmniboxDescription(input) { var domParser = new DOMParser(); // The XML parser requires a single top-level element, but we want to // support things like 'hello, world!'. So we wrap the // provided text in generated root level element. var root = domParser.parseFromString( '' + input + '', 'text/xml'); // DOMParser has a terrible error reporting facility. Errors come out nested // inside the returned document. var error = root.querySelector('parsererror div'); if (error) { throw new Error(error.textContent); } // Otherwise, it's valid, so build up the result. var result = { description: '', descriptionStyles: [] }; // Recursively walk the tree. function walk(node) { for (var i = 0, child; child = node.childNodes[i]; i++) { // Append text nodes to our description. if (child.nodeType == Node.TEXT_NODE) { var shouldTrim = result.description.length == 0; result.description += sanitizeString(child.nodeValue, shouldTrim); continue; } // Process and descend into a subset of recognized tags. if (child.nodeType == Node.ELEMENT_NODE && (child.nodeName == 'dim' || child.nodeName == 'match' || child.nodeName == 'url')) { var style = { 'type': child.nodeName, 'offset': result.description.length }; $Array.push(result.descriptionStyles, style); walk(child); style.length = result.description.length - style.offset; continue; } // Descend into all other nodes, even if they are unrecognized, for // forward compat. walk(child); } }; walk(root); return result; } binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setUpdateArgumentsPreValidate('setDefaultSuggestion', function(suggestResult) { if (suggestResult.content != undefined) { // null, etc. throw new Error( 'setDefaultSuggestion cannot contain the "content" field'); } return [suggestResult]; }); apiFunctions.setHandleRequest('setDefaultSuggestion', function(details) { var parseResult = parseOmniboxDescription(details.description); sendRequest('omnibox.setDefaultSuggestion', [parseResult], bindingUtil ? undefined : this.definition.parameters, undefined); }); apiFunctions.setUpdateArgumentsPostValidate( 'sendSuggestions', function(requestId, userSuggestions) { var suggestions = []; for (var i = 0; i < userSuggestions.length; i++) { var parseResult = parseOmniboxDescription( userSuggestions[i].description); parseResult.content = userSuggestions[i].content; parseResult.deletable = userSuggestions[i].deletable; $Array.push(suggestions, parseResult); } return [requestId, suggestions]; }); }); registerArgumentMassager('omnibox.onInputChanged', function(args, dispatch) { var text = args[0]; var requestId = args[1]; var suggestCallback = function(suggestions) { chrome.omnibox.sendSuggestions(requestId, suggestions); }; dispatch([text, suggestCallback]); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the pageAction API. var binding = apiBridge || require('binding').Binding.create('pageAction'); var setIcon = require('setIcon').setIcon; var sendRequest = bindingUtil ? $Function.bind(bindingUtil.sendRequest, bindingUtil) : require('sendRequest').sendRequest; binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, $Function.bind(function(args) { sendRequest('pageAction.setIcon', [args, callback], bindingUtil ? undefined : this.definition.parameters, undefined); }, this)); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the pageCapture API. var binding = apiBridge || require('binding').Binding.create('pageCapture'); var handleUncaughtException = require('uncaught_exception_handler').handle; var pageCaptureNatives = requireNative('page_capture'); var CreateBlob = pageCaptureNatives.CreateBlob; var SendResponseAck = pageCaptureNatives.SendResponseAck; binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setCustomCallback('saveAsMHTML', function(name, request, callback, response) { if (response) response = CreateBlob(response.mhtmlFilePath, response.mhtmlFileLength); try { callback(response); } catch (e) { handleUncaughtException( 'Error in chrome.pageCapture.saveAsMHTML callback', e, request.stack); } finally { // Notify the browser. Now that the blob is referenced from JavaScript, // the browser can drop its reference to it. SendResponseAck(request.id); } }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the syncFileSystem API. var binding = apiBridge || require('binding').Binding.create('syncFileSystem'); var registerArgumentMassager = bindingUtil ? $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) : require('event_bindings').registerArgumentMassager; var fileSystemNatives = requireNative('file_system_natives'); var syncFileSystemNatives = requireNative('sync_file_system'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; // Functions which take in an [instanceOf=FileEntry]. function bindFileEntryFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(entry, callback) { var fileSystemUrl = entry.toURL(); return [fileSystemUrl, callback]; }); } $Array.forEach(['getFileStatus'], bindFileEntryFunction); // Functions which take in a FileEntry array. function bindFileEntryArrayFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(entries, callback) { var fileSystemUrlArray = []; for (var i=0; i < entries.length; i++) { $Array.push(fileSystemUrlArray, entries[i].toURL()); } return [fileSystemUrlArray, callback]; }); } $Array.forEach(['getFileStatuses'], bindFileEntryArrayFunction); // Functions which take in an [instanceOf=DOMFileSystem]. function bindFileSystemFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(filesystem, callback) { var fileSystemUrl = filesystem.root.toURL(); return [fileSystemUrl, callback]; }); } $Array.forEach(['getUsageAndQuota'], bindFileSystemFunction); // Functions which return an [instanceOf=DOMFileSystem]. apiFunctions.setCustomCallback('requestFileSystem', function(name, request, callback, response) { var result = null; if (response) { result = syncFileSystemNatives.GetSyncFileSystemObject( response.name, response.root); } if (callback) callback(result); }); // Functions which return an array of FileStatusInfo object // which has [instanceOf=FileEntry]. apiFunctions.setCustomCallback('getFileStatuses', function(name, request, callback, response) { var results = []; if (response) { for (var i = 0; i < response.length; i++) { var result = {}; var entry = response[i].entry; result.fileEntry = fileSystemNatives.GetFileEntry( entry.fileSystemType, entry.fileSystemName, entry.rootUrl, entry.filePath, entry.isDirectory); result.status = response[i].status; result.error = response[i].error; $Array.push(results, result); } } if (callback) callback(results); }); }); registerArgumentMassager('syncFileSystem.onFileStatusChanged', function(args, dispatch) { // Make FileEntry object using all the base string fields. var fileEntry = fileSystemNatives.GetFileEntry( args[0].fileSystemType, args[0].fileSystemName, args[0].rootUrl, args[0].filePath, args[0].isDirectory); // Combine into a single dictionary. var fileInfo = new Object(); fileInfo.fileEntry = fileEntry; fileInfo.status = args[1]; if (fileInfo.status == "synced") { fileInfo.action = args[2]; fileInfo.direction = args[3]; } dispatch([fileInfo]); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the systemIndicator API. // TODO(dewittj) Refactor custom binding to reduce redundancy between the // extension action APIs. var binding = apiBridge || require('binding').Binding.create('systemIndicator'); var setIcon = require('setIcon').setIcon; var sendRequest = bindingUtil ? $Function.bind(bindingUtil.sendRequest, bindingUtil) : require('sendRequest').sendRequest; binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, $Function.bind(function(args) { sendRequest('systemIndicator.setIcon', [args, callback], bindingUtil ? undefined : this.definition.parameters, undefined); }, this)); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Tab Capture API. var binding = apiBridge || require('binding').Binding.create('tabCapture'); var jsLastError = bindingUtil ? undefined : require('lastError'); function runCallbackWithLastError(name, message, stack, callback, args) { if (bindingUtil) { bindingUtil.runCallbackWithLastError(message, function() { $Function.apply(callback, null, args); }); } else { jsLastError.run(name, message, stack, callback, args); } } binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; function proxyToGetUserMedia(name, request, callback, response) { if (!callback) return; if (!response) { // When the response is missing, runtime.lastError has already been set. // See chrome/browser/extensions/api/tab_capture/tab_capture_api.cc. callback(null); return; } // Convenience function for processing webkitGetUserMedia() error objects to // provide runtime.lastError messages for the tab capture API. function getErrorMessage(error, fallbackMessage) { if (!error || (typeof error.message != 'string')) return fallbackMessage; return error.message.replace(/(navigator\.)?(webkit)?GetUserMedia/gi, name); } var options = {}; if (response.audioConstraints) options.audio = response.audioConstraints; if (response.videoConstraints) options.video = response.videoConstraints; try { navigator.webkitGetUserMedia( options, function onSuccess(media_stream) { callback(media_stream); }, function onError(error) { runCallbackWithLastError( name, getErrorMessage(error, "Failed to start MediaStream."), request.stack, function() { callback(null); }); }); } catch (error) { runCallbackWithLastError( name, getErrorMessage(error, "Invalid argument(s)."), request.stack, function() { callback(null); }); } } apiFunctions.setCustomCallback('capture', proxyToGetUserMedia); apiFunctions.setCustomCallback('captureOffscreenTab', proxyToGetUserMedia); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the tabs API. var binding = apiBridge || require('binding').Binding.create('tabs'); var messaging = require('messaging'); var OpenChannelToTab = requireNative('messaging_natives').OpenChannelToTab; var sendRequestIsDisabled = requireNative('process').IsSendRequestDisabled(); var forEach = require('utils').forEach; binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; var tabs = bindingsAPI.compiledApi; apiFunctions.setHandleRequest('connect', function(tabId, connectInfo) { var name = ''; var frameId = -1; if (connectInfo) { name = connectInfo.name || name; frameId = connectInfo.frameId; if (typeof frameId == 'undefined' || frameId < 0) frameId = -1; } var portId = OpenChannelToTab(tabId, frameId, extensionId, name); return messaging.createPort(portId, name); }); apiFunctions.setHandleRequest('sendRequest', function(tabId, request, responseCallback) { if (sendRequestIsDisabled) throw new Error(sendRequestIsDisabled); var port = tabs.connect(tabId, {name: messaging.kRequestChannel}); messaging.sendMessageImpl(port, request, responseCallback); }); apiFunctions.setHandleRequest('sendMessage', function(tabId, message, options, responseCallback) { var connectInfo = { name: messaging.kMessageChannel }; if (options) { forEach(options, function(k, v) { connectInfo[k] = v; }); } var port = tabs.connect(tabId, connectInfo); messaging.sendMessageImpl(port, message, responseCallback); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the tts API. var binding = apiBridge || require('binding').Binding.create('tts'); var idGenerator = requireNative('id_generator'); var sendRequest = bindingUtil ? $Function.bind(bindingUtil.sendRequest, bindingUtil) : require('sendRequest').sendRequest; var lazyBG = requireNative('lazy_background_page'); binding.registerCustomHook(function(api) { var apiFunctions = api.apiFunctions; var tts = api.compiledApi; var handlers = {}; function ttsEventListener(event) { var eventHandler = handlers[event.srcId]; if (eventHandler) { eventHandler({ type: event.type, charIndex: event.charIndex, errorMessage: event.errorMessage }); if (event.isFinalEvent) { delete handlers[event.srcId]; // Balanced in 'speak' handler. lazyBG.DecrementKeepaliveCount(); } } } // This file will get run if an extension needs the ttsEngine permission, but // it doesn't necessarily have the tts permission. If it doesn't, trying to // add a listener to chrome.tts.onEvent will fail. // See http://crbug.com/122474. try { tts.onEvent.addListener(ttsEventListener); } catch (e) {} apiFunctions.setHandleRequest('speak', function() { var args = $Array.from(arguments); if (args.length > 1 && args[1] && args[1].onEvent) { var id = idGenerator.GetNextId(); args[1].srcId = id; handlers[id] = args[1].onEvent; // Keep the page alive until the event finishes. // Balanced in eventHandler. lazyBG.IncrementKeepaliveCount(); } sendRequest('tts.speak', args, bindingUtil ? undefined : this.definition.parameters, undefined); return id; }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the ttsEngine API. var binding = apiBridge || require('binding').Binding.create('ttsEngine'); var registerArgumentMassager = bindingUtil ? $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) : require('event_bindings').registerArgumentMassager; registerArgumentMassager('ttsEngine.onSpeak', function(args, dispatch) { var text = args[0]; var options = args[1]; var requestId = args[2]; var sendTtsEvent = function(event) { chrome.ttsEngine.sendTtsEvent(requestId, event); }; dispatch([text, options, sendTtsEvent]); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the webrtcDesktopCapturePrivate API. var binding = apiBridge || require('binding').Binding.create('webrtcDesktopCapturePrivate'); var sendRequest = bindingUtil ? $Function.bind(bindingUtil.sendRequest, bindingUtil) : require('sendRequest').sendRequest; var idGenerator = requireNative('id_generator'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var pendingRequests = {}; function onRequestResult(id, result) { if (id in pendingRequests) { var callback = pendingRequests[id]; delete pendingRequests[id]; callback(result); } } apiFunctions.setHandleRequest('chooseDesktopMedia', function(sources, request, callback) { var id = idGenerator.GetNextId(); pendingRequests[id] = callback; sendRequest('webrtcDesktopCapturePrivate.chooseDesktopMedia', [id, sources, request, $Function.bind(onRequestResult, null, id)], bindingUtil ? undefined : this.definition.parameters, undefined); return id; }); apiFunctions.setHandleRequest('cancelChooseDesktopMedia', function(id) { if (id in pendingRequests) { delete pendingRequests[id]; sendRequest('webrtcDesktopCapturePrivate.cancelChooseDesktopMedia', [id], bindingUtil ? undefined : this.definition.parameters, undefined); } }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the webrtcLoggingPrivate API. var binding = apiBridge || require('binding').Binding.create('webrtcLoggingPrivate'); var getBindDirectoryEntryCallback = require('fileEntryBindingUtil').getBindDirectoryEntryCallback; binding.registerCustomHook(function(binding, id, contextType) { var apiFunctions = binding.apiFunctions; apiFunctions.setCustomCallback('getLogsDirectory', getBindDirectoryEntryCallback()); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the webstore API. var webstoreNatives = requireNative('webstore'); var onInstallStageChanged; var onDownloadProgress; function Installer() { this._pendingInstall = null; } Installer.prototype.install = function(url, onSuccess, onFailure) { if (this._pendingInstall) throw new Error('A Chrome Web Store installation is already pending.'); // With native bindings, these calls go through argument validation, which // sets optional/missing arguments to null. The native webstore bindings // expect either present or undefined, so transform null to undefined. if (url === null) url = undefined; if (onSuccess === null) onSuccess = undefined; if (onFailure === null) onFailure = undefined; if (url !== undefined && typeof url !== 'string') { throw new Error( 'The Chrome Web Store item link URL parameter must be a string.'); } if (onSuccess !== undefined && typeof onSuccess !== 'function') { throw new Error('The success callback parameter must be a function.'); } if (onFailure !== undefined && typeof onFailure !== 'function') { throw new Error('The failure callback parameter must be a function.'); } // Since we call Install() with a bool for if we have listeners, listeners // must be set prior to the inline installation starting (this is also // noted in the Event documentation in // chrome/common/extensions/api/webstore.json). var installId = webstoreNatives.Install( onInstallStageChanged.hasListeners(), onDownloadProgress.hasListeners(), url, onSuccess, onFailure); if (installId !== undefined) { this._pendingInstall = { installId: installId, onSuccess: onSuccess, onFailure: onFailure }; } }; Installer.prototype.onInstallResponse = function(installId, success, error, resultCode) { var pendingInstall = this._pendingInstall; if (!pendingInstall || pendingInstall.installId != installId) { // TODO(kalman): should this be an error? return; } try { if (success && pendingInstall.onSuccess) pendingInstall.onSuccess(); else if (!success && pendingInstall.onFailure) pendingInstall.onFailure(error, resultCode); } catch (e) { console.error('Exception in chrome.webstore.install response handler: ' + e.stack); } finally { this._pendingInstall = null; } }; Installer.prototype.onInstallStageChanged = function(installStage) { onInstallStageChanged.dispatch(installStage); }; Installer.prototype.onDownloadProgress = function(progress) { onDownloadProgress.dispatch(progress); }; var installer = new Installer(); if (apiBridge) { apiBridge.registerCustomHook(function(api) { api.apiFunctions.setHandleRequest('install', function(url, onSuccess, onFailure) { installer.install(url, onSuccess, onFailure); }); onInstallStageChanged = api.compiledApi.onInstallStageChanged; onDownloadProgress = api.compiledApi.onDownloadProgress; }); } else { var Event = require('event_bindings').Event; onInstallStageChanged = new Event(null, [{name: 'stage', type: 'string'}], {unmanaged: true}); onDownloadProgress = new Event(null, [{name: 'progress', type: 'number'}], {unmanaged: true}); var chromeWebstore = { install: function (url, onSuccess, onFailure) { installer.install(url, onSuccess, onFailure); }, onInstallStageChanged: onInstallStageChanged, onDownloadProgress: onDownloadProgress, }; exports.$set('binding', chromeWebstore); } // Called by webstore_bindings.cc. exports.$set('onInstallResponse', $Function.bind(Installer.prototype.onInstallResponse, installer)); exports.$set('onInstallStageChanged', $Function.bind(Installer.prototype.onInstallStageChanged, installer)); exports.$set('onDownloadProgress', $Function.bind(Installer.prototype.onDownloadProgress, installer)); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'chrome/common/media_router/mojo/media_controller.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mediaRouter.mojom'); var media_status$ = mojo.internal.exposeNamespace('mediaRouter.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'chrome/common/media_router/mojo/media_status.mojom', 'media_status.mojom.js'); } var time$ = mojo.internal.exposeNamespace('mojo.common.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'mojo/common/time.mojom', '../../../../mojo/common/time.mojom.js'); } function MediaController_Play_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_Play_Params.prototype.initDefaults_ = function() { }; MediaController_Play_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_Play_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_Play_Params.encodedSize = codec.kStructHeaderSize + 0; MediaController_Play_Params.decode = function(decoder) { var packed; var val = new MediaController_Play_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaController_Play_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_Play_Params.encodedSize); encoder.writeUint32(0); }; function MediaController_Pause_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_Pause_Params.prototype.initDefaults_ = function() { }; MediaController_Pause_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_Pause_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_Pause_Params.encodedSize = codec.kStructHeaderSize + 0; MediaController_Pause_Params.decode = function(decoder) { var packed; var val = new MediaController_Pause_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaController_Pause_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_Pause_Params.encodedSize); encoder.writeUint32(0); }; function MediaController_SetMute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_SetMute_Params.prototype.initDefaults_ = function() { this.mute = false; }; MediaController_SetMute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_SetMute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_SetMute_Params.encodedSize = codec.kStructHeaderSize + 8; MediaController_SetMute_Params.decode = function(decoder) { var packed; var val = new MediaController_SetMute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.mute = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaController_SetMute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_SetMute_Params.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.mute & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaController_SetVolume_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_SetVolume_Params.prototype.initDefaults_ = function() { this.volume = 0; }; MediaController_SetVolume_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_SetVolume_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_SetVolume_Params.encodedSize = codec.kStructHeaderSize + 8; MediaController_SetVolume_Params.decode = function(decoder) { var packed; var val = new MediaController_SetVolume_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.volume = decoder.decodeStruct(codec.Float); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaController_SetVolume_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_SetVolume_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Float, val.volume); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaController_Seek_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_Seek_Params.prototype.initDefaults_ = function() { this.time = null; }; MediaController_Seek_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_Seek_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaController_Seek_Params.time err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_Seek_Params.encodedSize = codec.kStructHeaderSize + 8; MediaController_Seek_Params.decode = function(decoder) { var packed; var val = new MediaController_Seek_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.time = decoder.decodeStructPointer(time$.TimeDelta); return val; }; MediaController_Seek_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_Seek_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(time$.TimeDelta, val.time); }; function MediaController_ConnectHangoutsMediaRouteController_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_ConnectHangoutsMediaRouteController_Params.prototype.initDefaults_ = function() { this.controllerRequest = new bindings.InterfaceRequest(); }; MediaController_ConnectHangoutsMediaRouteController_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_ConnectHangoutsMediaRouteController_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaController_ConnectHangoutsMediaRouteController_Params.controllerRequest err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_ConnectHangoutsMediaRouteController_Params.encodedSize = codec.kStructHeaderSize + 8; MediaController_ConnectHangoutsMediaRouteController_Params.decode = function(decoder) { var packed; var val = new MediaController_ConnectHangoutsMediaRouteController_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.controllerRequest = decoder.decodeStruct(codec.InterfaceRequest); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaController_ConnectHangoutsMediaRouteController_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_ConnectHangoutsMediaRouteController_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.InterfaceRequest, val.controllerRequest); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function HangoutsMediaRouteController_SetLocalPresent_Params(values) { this.initDefaults_(); this.initFields_(values); } HangoutsMediaRouteController_SetLocalPresent_Params.prototype.initDefaults_ = function() { this.localPresent = false; }; HangoutsMediaRouteController_SetLocalPresent_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; HangoutsMediaRouteController_SetLocalPresent_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; HangoutsMediaRouteController_SetLocalPresent_Params.encodedSize = codec.kStructHeaderSize + 8; HangoutsMediaRouteController_SetLocalPresent_Params.decode = function(decoder) { var packed; var val = new HangoutsMediaRouteController_SetLocalPresent_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.localPresent = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; HangoutsMediaRouteController_SetLocalPresent_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(HangoutsMediaRouteController_SetLocalPresent_Params.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.localPresent & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; var kMediaController_Play_Name = 1707544988; var kMediaController_Pause_Name = 425314644; var kMediaController_SetMute_Name = 1576739997; var kMediaController_SetVolume_Name = 1452905642; var kMediaController_Seek_Name = 206977129; var kMediaController_ConnectHangoutsMediaRouteController_Name = 257503576; function MediaControllerPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MediaController, handleOrPtrInfo); } function MediaControllerAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MediaController, associatedInterfacePtrInfo); } MediaControllerAssociatedPtr.prototype = Object.create(MediaControllerPtr.prototype); MediaControllerAssociatedPtr.prototype.constructor = MediaControllerAssociatedPtr; function MediaControllerProxy(receiver) { this.receiver_ = receiver; } MediaControllerPtr.prototype.play = function() { return MediaControllerProxy.prototype.play .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.play = function() { var params = new MediaController_Play_Params(); var builder = new codec.MessageV0Builder( kMediaController_Play_Name, codec.align(MediaController_Play_Params.encodedSize)); builder.encodeStruct(MediaController_Play_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.pause = function() { return MediaControllerProxy.prototype.pause .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.pause = function() { var params = new MediaController_Pause_Params(); var builder = new codec.MessageV0Builder( kMediaController_Pause_Name, codec.align(MediaController_Pause_Params.encodedSize)); builder.encodeStruct(MediaController_Pause_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.setMute = function() { return MediaControllerProxy.prototype.setMute .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.setMute = function(mute) { var params = new MediaController_SetMute_Params(); params.mute = mute; var builder = new codec.MessageV0Builder( kMediaController_SetMute_Name, codec.align(MediaController_SetMute_Params.encodedSize)); builder.encodeStruct(MediaController_SetMute_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.setVolume = function() { return MediaControllerProxy.prototype.setVolume .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.setVolume = function(volume) { var params = new MediaController_SetVolume_Params(); params.volume = volume; var builder = new codec.MessageV0Builder( kMediaController_SetVolume_Name, codec.align(MediaController_SetVolume_Params.encodedSize)); builder.encodeStruct(MediaController_SetVolume_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.seek = function() { return MediaControllerProxy.prototype.seek .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.seek = function(time) { var params = new MediaController_Seek_Params(); params.time = time; var builder = new codec.MessageV0Builder( kMediaController_Seek_Name, codec.align(MediaController_Seek_Params.encodedSize)); builder.encodeStruct(MediaController_Seek_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.connectHangoutsMediaRouteController = function() { return MediaControllerProxy.prototype.connectHangoutsMediaRouteController .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.connectHangoutsMediaRouteController = function(controllerRequest) { var params = new MediaController_ConnectHangoutsMediaRouteController_Params(); params.controllerRequest = controllerRequest; var builder = new codec.MessageV0Builder( kMediaController_ConnectHangoutsMediaRouteController_Name, codec.align(MediaController_ConnectHangoutsMediaRouteController_Params.encodedSize)); builder.encodeStruct(MediaController_ConnectHangoutsMediaRouteController_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; function MediaControllerStub(delegate) { this.delegate_ = delegate; } MediaControllerStub.prototype.play = function() { return this.delegate_ && this.delegate_.play && this.delegate_.play(); } MediaControllerStub.prototype.pause = function() { return this.delegate_ && this.delegate_.pause && this.delegate_.pause(); } MediaControllerStub.prototype.setMute = function(mute) { return this.delegate_ && this.delegate_.setMute && this.delegate_.setMute(mute); } MediaControllerStub.prototype.setVolume = function(volume) { return this.delegate_ && this.delegate_.setVolume && this.delegate_.setVolume(volume); } MediaControllerStub.prototype.seek = function(time) { return this.delegate_ && this.delegate_.seek && this.delegate_.seek(time); } MediaControllerStub.prototype.connectHangoutsMediaRouteController = function(controllerRequest) { return this.delegate_ && this.delegate_.connectHangoutsMediaRouteController && this.delegate_.connectHangoutsMediaRouteController(controllerRequest); } MediaControllerStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaController_Play_Name: var params = reader.decodeStruct(MediaController_Play_Params); this.play(); return true; case kMediaController_Pause_Name: var params = reader.decodeStruct(MediaController_Pause_Params); this.pause(); return true; case kMediaController_SetMute_Name: var params = reader.decodeStruct(MediaController_SetMute_Params); this.setMute(params.mute); return true; case kMediaController_SetVolume_Name: var params = reader.decodeStruct(MediaController_SetVolume_Params); this.setVolume(params.volume); return true; case kMediaController_Seek_Name: var params = reader.decodeStruct(MediaController_Seek_Params); this.seek(params.time); return true; case kMediaController_ConnectHangoutsMediaRouteController_Name: var params = reader.decodeStruct(MediaController_ConnectHangoutsMediaRouteController_Params); this.connectHangoutsMediaRouteController(params.controllerRequest); return true; default: return false; } }; MediaControllerStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateMediaControllerRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaController_Play_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_Play_Params; break; case kMediaController_Pause_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_Pause_Params; break; case kMediaController_SetMute_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_SetMute_Params; break; case kMediaController_SetVolume_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_SetVolume_Params; break; case kMediaController_Seek_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_Seek_Params; break; case kMediaController_ConnectHangoutsMediaRouteController_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_ConnectHangoutsMediaRouteController_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMediaControllerResponse(messageValidator) { return validator.validationError.NONE; } var MediaController = { name: 'media_router::mojom::MediaController', kVersion: 0, ptrClass: MediaControllerPtr, proxyClass: MediaControllerProxy, stubClass: MediaControllerStub, validateRequest: validateMediaControllerRequest, validateResponse: null, }; MediaControllerStub.prototype.validator = validateMediaControllerRequest; MediaControllerProxy.prototype.validator = null; var kHangoutsMediaRouteController_SetLocalPresent_Name = 804107141; function HangoutsMediaRouteControllerPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(HangoutsMediaRouteController, handleOrPtrInfo); } function HangoutsMediaRouteControllerAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( HangoutsMediaRouteController, associatedInterfacePtrInfo); } HangoutsMediaRouteControllerAssociatedPtr.prototype = Object.create(HangoutsMediaRouteControllerPtr.prototype); HangoutsMediaRouteControllerAssociatedPtr.prototype.constructor = HangoutsMediaRouteControllerAssociatedPtr; function HangoutsMediaRouteControllerProxy(receiver) { this.receiver_ = receiver; } HangoutsMediaRouteControllerPtr.prototype.setLocalPresent = function() { return HangoutsMediaRouteControllerProxy.prototype.setLocalPresent .apply(this.ptr.getProxy(), arguments); }; HangoutsMediaRouteControllerProxy.prototype.setLocalPresent = function(localPresent) { var params = new HangoutsMediaRouteController_SetLocalPresent_Params(); params.localPresent = localPresent; var builder = new codec.MessageV0Builder( kHangoutsMediaRouteController_SetLocalPresent_Name, codec.align(HangoutsMediaRouteController_SetLocalPresent_Params.encodedSize)); builder.encodeStruct(HangoutsMediaRouteController_SetLocalPresent_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; function HangoutsMediaRouteControllerStub(delegate) { this.delegate_ = delegate; } HangoutsMediaRouteControllerStub.prototype.setLocalPresent = function(localPresent) { return this.delegate_ && this.delegate_.setLocalPresent && this.delegate_.setLocalPresent(localPresent); } HangoutsMediaRouteControllerStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kHangoutsMediaRouteController_SetLocalPresent_Name: var params = reader.decodeStruct(HangoutsMediaRouteController_SetLocalPresent_Params); this.setLocalPresent(params.localPresent); return true; default: return false; } }; HangoutsMediaRouteControllerStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateHangoutsMediaRouteControllerRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kHangoutsMediaRouteController_SetLocalPresent_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = HangoutsMediaRouteController_SetLocalPresent_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateHangoutsMediaRouteControllerResponse(messageValidator) { return validator.validationError.NONE; } var HangoutsMediaRouteController = { name: 'media_router::mojom::HangoutsMediaRouteController', kVersion: 0, ptrClass: HangoutsMediaRouteControllerPtr, proxyClass: HangoutsMediaRouteControllerProxy, stubClass: HangoutsMediaRouteControllerStub, validateRequest: validateHangoutsMediaRouteControllerRequest, validateResponse: null, }; HangoutsMediaRouteControllerStub.prototype.validator = validateHangoutsMediaRouteControllerRequest; HangoutsMediaRouteControllerProxy.prototype.validator = null; exports.MediaController = MediaController; exports.MediaControllerPtr = MediaControllerPtr; exports.MediaControllerAssociatedPtr = MediaControllerAssociatedPtr; exports.HangoutsMediaRouteController = HangoutsMediaRouteController; exports.HangoutsMediaRouteControllerPtr = HangoutsMediaRouteControllerPtr; exports.HangoutsMediaRouteControllerAssociatedPtr = HangoutsMediaRouteControllerAssociatedPtr; })();// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'chrome/common/media_router/mojo/media_router.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mediaRouter.mojom'); var media_controller$ = mojo.internal.exposeNamespace('mediaRouter.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'chrome/common/media_router/mojo/media_controller.mojom', 'media_controller.mojom.js'); } var media_status$ = mojo.internal.exposeNamespace('mediaRouter.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'chrome/common/media_router/mojo/media_status.mojom', 'media_status.mojom.js'); } var mirror_service_remoting$ = mojo.internal.exposeNamespace('media.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'media/mojo/interfaces/mirror_service_remoting.mojom', '../../../../media/mojo/interfaces/mirror_service_remoting.mojom.js'); } var time$ = mojo.internal.exposeNamespace('mojo.common.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'mojo/common/time.mojom', '../../../../mojo/common/time.mojom.js'); } var ip_address$ = mojo.internal.exposeNamespace('net.interfaces'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'net/interfaces/ip_address.mojom', '../../../../net/interfaces/ip_address.mojom.js'); } var ip_endpoint$ = mojo.internal.exposeNamespace('net.interfaces'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'net/interfaces/ip_endpoint.mojom', '../../../../net/interfaces/ip_endpoint.mojom.js'); } var origin$ = mojo.internal.exposeNamespace('url.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'url/mojo/origin.mojom', '../../../../url/mojo/origin.mojom.js'); } var url$ = mojo.internal.exposeNamespace('url.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'url/mojo/url.mojom', '../../../../url/mojo/url.mojom.js'); } var SinkIconType = {}; SinkIconType.CAST = 0; SinkIconType.CAST_AUDIO_GROUP = SinkIconType.CAST + 1; SinkIconType.CAST_AUDIO = SinkIconType.CAST_AUDIO_GROUP + 1; SinkIconType.MEETING = SinkIconType.CAST_AUDIO + 1; SinkIconType.HANGOUT = SinkIconType.MEETING + 1; SinkIconType.EDUCATION = SinkIconType.HANGOUT + 1; SinkIconType.WIRED_DISPLAY = SinkIconType.EDUCATION + 1; SinkIconType.GENERIC = SinkIconType.WIRED_DISPLAY + 1; SinkIconType.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: return true; } return false; }; SinkIconType.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RouteControllerType = {}; RouteControllerType.kNone = 0; RouteControllerType.kGeneric = RouteControllerType.kNone + 1; RouteControllerType.kHangouts = RouteControllerType.kGeneric + 1; RouteControllerType.kMirroring = RouteControllerType.kHangouts + 1; RouteControllerType.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: return true; } return false; }; RouteControllerType.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RouteRequestResultCode = {}; RouteRequestResultCode.UNKNOWN_ERROR = 0; RouteRequestResultCode.OK = RouteRequestResultCode.UNKNOWN_ERROR + 1; RouteRequestResultCode.TIMED_OUT = RouteRequestResultCode.OK + 1; RouteRequestResultCode.ROUTE_NOT_FOUND = RouteRequestResultCode.TIMED_OUT + 1; RouteRequestResultCode.SINK_NOT_FOUND = RouteRequestResultCode.ROUTE_NOT_FOUND + 1; RouteRequestResultCode.INVALID_ORIGIN = RouteRequestResultCode.SINK_NOT_FOUND + 1; RouteRequestResultCode.INCOGNITO_MISMATCH = RouteRequestResultCode.INVALID_ORIGIN + 1; RouteRequestResultCode.NO_SUPPORTED_PROVIDER = RouteRequestResultCode.INCOGNITO_MISMATCH + 1; RouteRequestResultCode.CANCELLED = RouteRequestResultCode.NO_SUPPORTED_PROVIDER + 1; RouteRequestResultCode.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: return true; } return false; }; RouteRequestResultCode.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; function MediaSink(values) { this.initDefaults_(); this.initFields_(values); } MediaSink.prototype.initDefaults_ = function() { this.sinkId = null; this.name = null; this.description = null; this.domain = null; this.iconType = 0; this.providerId = 0; this.extraData = null; }; MediaSink.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaSink.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 64} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaSink.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaSink.name err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaSink.description err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true) if (err !== validator.validationError.NONE) return err; // validate MediaSink.domain err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, true) if (err !== validator.validationError.NONE) return err; // validate MediaSink.iconType err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 32, SinkIconType); if (err !== validator.validationError.NONE) return err; // validate MediaSink.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 36, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaSink.extraData err = messageValidator.validateUnion(offset + codec.kStructHeaderSize + 40, MediaSinkExtraData, true); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaSink.encodedSize = codec.kStructHeaderSize + 56; MediaSink.decode = function(decoder) { var packed; var val = new MediaSink(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.sinkId = decoder.decodeStruct(codec.String); val.name = decoder.decodeStruct(codec.String); val.description = decoder.decodeStruct(codec.NullableString); val.domain = decoder.decodeStruct(codec.NullableString); val.iconType = decoder.decodeStruct(codec.Int32); val.providerId = decoder.decodeStruct(codec.Int32); val.extraData = decoder.decodeStruct(MediaSinkExtraData); return val; }; MediaSink.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaSink.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.sinkId); encoder.encodeStruct(codec.String, val.name); encoder.encodeStruct(codec.NullableString, val.description); encoder.encodeStruct(codec.NullableString, val.domain); encoder.encodeStruct(codec.Int32, val.iconType); encoder.encodeStruct(codec.Int32, val.providerId); encoder.encodeStruct(MediaSinkExtraData, val.extraData); }; function DialMediaSink(values) { this.initDefaults_(); this.initFields_(values); } DialMediaSink.prototype.initDefaults_ = function() { this.ipAddress = null; this.modelName = null; this.appUrl = null; }; DialMediaSink.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; DialMediaSink.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate DialMediaSink.ipAddress err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, ip_address$.IPAddress, false); if (err !== validator.validationError.NONE) return err; // validate DialMediaSink.modelName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate DialMediaSink.appUrl err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 16, url$.Url, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; DialMediaSink.encodedSize = codec.kStructHeaderSize + 24; DialMediaSink.decode = function(decoder) { var packed; var val = new DialMediaSink(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.ipAddress = decoder.decodeStructPointer(ip_address$.IPAddress); val.modelName = decoder.decodeStruct(codec.String); val.appUrl = decoder.decodeStructPointer(url$.Url); return val; }; DialMediaSink.encode = function(encoder, val) { var packed; encoder.writeUint32(DialMediaSink.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(ip_address$.IPAddress, val.ipAddress); encoder.encodeStruct(codec.String, val.modelName); encoder.encodeStructPointer(url$.Url, val.appUrl); }; function CastMediaSink(values) { this.initDefaults_(); this.initFields_(values); } CastMediaSink.prototype.initDefaults_ = function() { this.ipEndpoint = null; this.modelName = null; this.capabilities = 0; this.castChannelId = 0; }; CastMediaSink.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; CastMediaSink.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate CastMediaSink.ipEndpoint err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, ip_endpoint$.IPEndPoint, false); if (err !== validator.validationError.NONE) return err; // validate CastMediaSink.modelName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; CastMediaSink.encodedSize = codec.kStructHeaderSize + 24; CastMediaSink.decode = function(decoder) { var packed; var val = new CastMediaSink(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.ipEndpoint = decoder.decodeStructPointer(ip_endpoint$.IPEndPoint); val.modelName = decoder.decodeStruct(codec.String); val.capabilities = decoder.decodeStruct(codec.Uint8); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.castChannelId = decoder.decodeStruct(codec.Int32); return val; }; CastMediaSink.encode = function(encoder, val) { var packed; encoder.writeUint32(CastMediaSink.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(ip_endpoint$.IPEndPoint, val.ipEndpoint); encoder.encodeStruct(codec.String, val.modelName); encoder.encodeStruct(codec.Uint8, val.capabilities); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.Int32, val.castChannelId); }; function MediaRoute(values) { this.initDefaults_(); this.initFields_(values); } MediaRoute.prototype.initDefaults_ = function() { this.mediaRouteId = null; this.presentationId = null; this.mediaSource = null; this.mediaSinkId = null; this.description = null; this.isLocal = false; this.forDisplay = false; this.isIncognito = false; this.isLocalPresentation = false; this.controllerType = 0; }; MediaRoute.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRoute.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 56} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRoute.mediaRouteId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.presentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.mediaSinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, false) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.description err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 32, false) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.controllerType err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 44, RouteControllerType); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRoute.encodedSize = codec.kStructHeaderSize + 48; MediaRoute.decode = function(decoder) { var packed; var val = new MediaRoute(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaRouteId = decoder.decodeStruct(codec.String); val.presentationId = decoder.decodeStruct(codec.String); val.mediaSource = decoder.decodeStruct(codec.NullableString); val.mediaSinkId = decoder.decodeStruct(codec.String); val.description = decoder.decodeStruct(codec.String); packed = decoder.readUint8(); val.isLocal = (packed >> 0) & 1 ? true : false; val.forDisplay = (packed >> 1) & 1 ? true : false; val.isIncognito = (packed >> 2) & 1 ? true : false; val.isLocalPresentation = (packed >> 3) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.controllerType = decoder.decodeStruct(codec.Int32); return val; }; MediaRoute.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRoute.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaRouteId); encoder.encodeStruct(codec.String, val.presentationId); encoder.encodeStruct(codec.NullableString, val.mediaSource); encoder.encodeStruct(codec.String, val.mediaSinkId); encoder.encodeStruct(codec.String, val.description); packed = 0; packed |= (val.isLocal & 1) << 0 packed |= (val.forDisplay & 1) << 1 packed |= (val.isIncognito & 1) << 2 packed |= (val.isLocalPresentation & 1) << 3 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.Int32, val.controllerType); }; function Issue(values) { this.initDefaults_(); this.initFields_(values); } Issue.Severity = {}; Issue.Severity.FATAL = 0; Issue.Severity.WARNING = Issue.Severity.FATAL + 1; Issue.Severity.NOTIFICATION = Issue.Severity.WARNING + 1; Issue.Severity.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; Issue.Severity.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; Issue.ActionType = {}; Issue.ActionType.DISMISS = 0; Issue.ActionType.LEARN_MORE = Issue.ActionType.DISMISS + 1; Issue.ActionType.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: return true; } return false; }; Issue.ActionType.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; Issue.prototype.initDefaults_ = function() { this.routeId = null; this.severity = 0; this.isBlocking = false; this.title = null; this.message = null; this.defaultAction = 0; this.helpPageId = 0; this.secondaryActions = null; }; Issue.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; Issue.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 56} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate Issue.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, true) if (err !== validator.validationError.NONE) return err; // validate Issue.severity err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, Issue.Severity); if (err !== validator.validationError.NONE) return err; // validate Issue.title err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; // validate Issue.message err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, true) if (err !== validator.validationError.NONE) return err; // validate Issue.defaultAction err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 32, Issue.ActionType); if (err !== validator.validationError.NONE) return err; // validate Issue.secondaryActions err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 40, 4, new codec.Enum(Issue.ActionType), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; Issue.encodedSize = codec.kStructHeaderSize + 48; Issue.decode = function(decoder) { var packed; var val = new Issue(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.NullableString); val.severity = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.isBlocking = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.title = decoder.decodeStruct(codec.String); val.message = decoder.decodeStruct(codec.NullableString); val.defaultAction = decoder.decodeStruct(codec.Int32); val.helpPageId = decoder.decodeStruct(codec.Int32); val.secondaryActions = decoder.decodeArrayPointer(new codec.Enum(Issue.ActionType)); return val; }; Issue.encode = function(encoder, val) { var packed; encoder.writeUint32(Issue.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.NullableString, val.routeId); encoder.encodeStruct(codec.Int32, val.severity); packed = 0; packed |= (val.isBlocking & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.String, val.title); encoder.encodeStruct(codec.NullableString, val.message); encoder.encodeStruct(codec.Int32, val.defaultAction); encoder.encodeStruct(codec.Int32, val.helpPageId); encoder.encodeArrayPointer(new codec.Enum(Issue.ActionType), val.secondaryActions); }; function RouteMessage(values) { this.initDefaults_(); this.initFields_(values); } RouteMessage.Type = {}; RouteMessage.Type.TEXT = 0; RouteMessage.Type.BINARY = RouteMessage.Type.TEXT + 1; RouteMessage.Type.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: return true; } return false; }; RouteMessage.Type.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; RouteMessage.prototype.initDefaults_ = function() { this.type = 0; this.message = null; this.data = null; }; RouteMessage.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; RouteMessage.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate RouteMessage.type err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, RouteMessage.Type); if (err !== validator.validationError.NONE) return err; // validate RouteMessage.message err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, true) if (err !== validator.validationError.NONE) return err; // validate RouteMessage.data err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 1, codec.Uint8, true, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; RouteMessage.encodedSize = codec.kStructHeaderSize + 24; RouteMessage.decode = function(decoder) { var packed; var val = new RouteMessage(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.type = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.message = decoder.decodeStruct(codec.NullableString); val.data = decoder.decodeArrayPointer(codec.Uint8); return val; }; RouteMessage.encode = function(encoder, val) { var packed; encoder.writeUint32(RouteMessage.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.type); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.NullableString, val.message); encoder.encodeArrayPointer(codec.Uint8, val.data); }; function SinkSearchCriteria(values) { this.initDefaults_(); this.initFields_(values); } SinkSearchCriteria.prototype.initDefaults_ = function() { this.input = null; this.domain = null; }; SinkSearchCriteria.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; SinkSearchCriteria.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate SinkSearchCriteria.input err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate SinkSearchCriteria.domain err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; SinkSearchCriteria.encodedSize = codec.kStructHeaderSize + 16; SinkSearchCriteria.decode = function(decoder) { var packed; var val = new SinkSearchCriteria(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.input = decoder.decodeStruct(codec.String); val.domain = decoder.decodeStruct(codec.String); return val; }; SinkSearchCriteria.encode = function(encoder, val) { var packed; encoder.writeUint32(SinkSearchCriteria.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.input); encoder.encodeStruct(codec.String, val.domain); }; function MediaRouteProviderConfig(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProviderConfig.prototype.initDefaults_ = function() { this.enableDialDiscovery = false; this.enableCastDiscovery = false; }; MediaRouteProviderConfig.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProviderConfig.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProviderConfig.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProviderConfig.decode = function(decoder) { var packed; var val = new MediaRouteProviderConfig(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.enableDialDiscovery = (packed >> 0) & 1 ? true : false; val.enableCastDiscovery = (packed >> 1) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProviderConfig.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProviderConfig.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.enableDialDiscovery & 1) << 0 packed |= (val.enableCastDiscovery & 1) << 1 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_CreateRoute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_CreateRoute_Params.prototype.initDefaults_ = function() { this.mediaSource = null; this.sinkId = null; this.originalPresentationId = null; this.origin = null; this.tabId = 0; this.incognito = false; this.timeout = null; }; MediaRouteProvider_CreateRoute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_CreateRoute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 56} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.originalPresentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.origin err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, origin$.Origin, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.timeout err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 40, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_CreateRoute_Params.encodedSize = codec.kStructHeaderSize + 48; MediaRouteProvider_CreateRoute_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_CreateRoute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); val.sinkId = decoder.decodeStruct(codec.String); val.originalPresentationId = decoder.decodeStruct(codec.String); val.origin = decoder.decodeStructPointer(origin$.Origin); val.tabId = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.incognito = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.timeout = decoder.decodeStructPointer(time$.TimeDelta); return val; }; MediaRouteProvider_CreateRoute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_CreateRoute_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeStruct(codec.String, val.sinkId); encoder.encodeStruct(codec.String, val.originalPresentationId); encoder.encodeStructPointer(origin$.Origin, val.origin); encoder.encodeStruct(codec.Int32, val.tabId); packed = 0; packed |= (val.incognito & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(time$.TimeDelta, val.timeout); }; function MediaRouteProvider_CreateRoute_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_CreateRoute_ResponseParams.prototype.initDefaults_ = function() { this.route = null; this.errorText = null; this.resultCode = 0; }; MediaRouteProvider_CreateRoute_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_CreateRoute_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_ResponseParams.route err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaRoute, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_ResponseParams.errorText err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, true) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_ResponseParams.resultCode err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 16, RouteRequestResultCode); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_CreateRoute_ResponseParams.encodedSize = codec.kStructHeaderSize + 24; MediaRouteProvider_CreateRoute_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_CreateRoute_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.route = decoder.decodeStructPointer(MediaRoute); val.errorText = decoder.decodeStruct(codec.NullableString); val.resultCode = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_CreateRoute_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_CreateRoute_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(MediaRoute, val.route); encoder.encodeStruct(codec.NullableString, val.errorText); encoder.encodeStruct(codec.Int32, val.resultCode); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_JoinRoute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_JoinRoute_Params.prototype.initDefaults_ = function() { this.mediaSource = null; this.presentationId = null; this.origin = null; this.tabId = 0; this.incognito = false; this.timeout = null; }; MediaRouteProvider_JoinRoute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_JoinRoute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 48} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_Params.presentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_Params.origin err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 16, origin$.Origin, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_Params.timeout err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 32, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_JoinRoute_Params.encodedSize = codec.kStructHeaderSize + 40; MediaRouteProvider_JoinRoute_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_JoinRoute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); val.presentationId = decoder.decodeStruct(codec.String); val.origin = decoder.decodeStructPointer(origin$.Origin); val.tabId = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.incognito = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.timeout = decoder.decodeStructPointer(time$.TimeDelta); return val; }; MediaRouteProvider_JoinRoute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_JoinRoute_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeStruct(codec.String, val.presentationId); encoder.encodeStructPointer(origin$.Origin, val.origin); encoder.encodeStruct(codec.Int32, val.tabId); packed = 0; packed |= (val.incognito & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(time$.TimeDelta, val.timeout); }; function MediaRouteProvider_JoinRoute_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_JoinRoute_ResponseParams.prototype.initDefaults_ = function() { this.route = null; this.errorText = null; this.resultCode = 0; }; MediaRouteProvider_JoinRoute_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_JoinRoute_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_ResponseParams.route err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaRoute, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_ResponseParams.errorText err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, true) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_ResponseParams.resultCode err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 16, RouteRequestResultCode); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_JoinRoute_ResponseParams.encodedSize = codec.kStructHeaderSize + 24; MediaRouteProvider_JoinRoute_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_JoinRoute_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.route = decoder.decodeStructPointer(MediaRoute); val.errorText = decoder.decodeStruct(codec.NullableString); val.resultCode = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_JoinRoute_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_JoinRoute_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(MediaRoute, val.route); encoder.encodeStruct(codec.NullableString, val.errorText); encoder.encodeStruct(codec.Int32, val.resultCode); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_ConnectRouteByRouteId_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_ConnectRouteByRouteId_Params.prototype.initDefaults_ = function() { this.mediaSource = null; this.routeId = null; this.presentationId = null; this.origin = null; this.tabId = 0; this.incognito = false; this.timeout = null; }; MediaRouteProvider_ConnectRouteByRouteId_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_ConnectRouteByRouteId_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 56} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.presentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.origin err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, origin$.Origin, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.timeout err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 40, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_ConnectRouteByRouteId_Params.encodedSize = codec.kStructHeaderSize + 48; MediaRouteProvider_ConnectRouteByRouteId_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_ConnectRouteByRouteId_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); val.routeId = decoder.decodeStruct(codec.String); val.presentationId = decoder.decodeStruct(codec.String); val.origin = decoder.decodeStructPointer(origin$.Origin); val.tabId = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.incognito = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.timeout = decoder.decodeStructPointer(time$.TimeDelta); return val; }; MediaRouteProvider_ConnectRouteByRouteId_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_ConnectRouteByRouteId_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.String, val.presentationId); encoder.encodeStructPointer(origin$.Origin, val.origin); encoder.encodeStruct(codec.Int32, val.tabId); packed = 0; packed |= (val.incognito & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(time$.TimeDelta, val.timeout); }; function MediaRouteProvider_ConnectRouteByRouteId_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.prototype.initDefaults_ = function() { this.route = null; this.errorText = null; this.resultCode = 0; }; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.route err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaRoute, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.errorText err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, true) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.resultCode err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 16, RouteRequestResultCode); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encodedSize = codec.kStructHeaderSize + 24; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_ConnectRouteByRouteId_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.route = decoder.decodeStructPointer(MediaRoute); val.errorText = decoder.decodeStruct(codec.NullableString); val.resultCode = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(MediaRoute, val.route); encoder.encodeStruct(codec.NullableString, val.errorText); encoder.encodeStruct(codec.Int32, val.resultCode); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_TerminateRoute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_TerminateRoute_Params.prototype.initDefaults_ = function() { this.routeId = null; }; MediaRouteProvider_TerminateRoute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_TerminateRoute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_TerminateRoute_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_TerminateRoute_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_TerminateRoute_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_TerminateRoute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_TerminateRoute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_TerminateRoute_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); }; function MediaRouteProvider_TerminateRoute_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_TerminateRoute_ResponseParams.prototype.initDefaults_ = function() { this.errorText = null; this.resultCode = 0; }; MediaRouteProvider_TerminateRoute_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_TerminateRoute_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_TerminateRoute_ResponseParams.errorText err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, true) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_TerminateRoute_ResponseParams.resultCode err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, RouteRequestResultCode); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_TerminateRoute_ResponseParams.encodedSize = codec.kStructHeaderSize + 16; MediaRouteProvider_TerminateRoute_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_TerminateRoute_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.errorText = decoder.decodeStruct(codec.NullableString); val.resultCode = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_TerminateRoute_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_TerminateRoute_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.NullableString, val.errorText); encoder.encodeStruct(codec.Int32, val.resultCode); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_SendRouteMessage_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SendRouteMessage_Params.prototype.initDefaults_ = function() { this.mediaRouteId = null; this.message = null; }; MediaRouteProvider_SendRouteMessage_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SendRouteMessage_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SendRouteMessage_Params.mediaRouteId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SendRouteMessage_Params.message err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SendRouteMessage_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouteProvider_SendRouteMessage_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SendRouteMessage_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaRouteId = decoder.decodeStruct(codec.String); val.message = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_SendRouteMessage_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SendRouteMessage_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaRouteId); encoder.encodeStruct(codec.String, val.message); }; function MediaRouteProvider_SendRouteMessage_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SendRouteMessage_ResponseParams.prototype.initDefaults_ = function() { this.sent = false; }; MediaRouteProvider_SendRouteMessage_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SendRouteMessage_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SendRouteMessage_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_SendRouteMessage_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SendRouteMessage_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.sent = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_SendRouteMessage_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SendRouteMessage_ResponseParams.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.sent & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_SendRouteBinaryMessage_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SendRouteBinaryMessage_Params.prototype.initDefaults_ = function() { this.mediaRouteId = null; this.data = null; }; MediaRouteProvider_SendRouteBinaryMessage_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SendRouteBinaryMessage_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SendRouteBinaryMessage_Params.mediaRouteId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SendRouteBinaryMessage_Params.data err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 1, codec.Uint8, false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SendRouteBinaryMessage_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouteProvider_SendRouteBinaryMessage_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SendRouteBinaryMessage_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaRouteId = decoder.decodeStruct(codec.String); val.data = decoder.decodeArrayPointer(codec.Uint8); return val; }; MediaRouteProvider_SendRouteBinaryMessage_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SendRouteBinaryMessage_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaRouteId); encoder.encodeArrayPointer(codec.Uint8, val.data); }; function MediaRouteProvider_SendRouteBinaryMessage_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.prototype.initDefaults_ = function() { this.sent = false; }; MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SendRouteBinaryMessage_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.sent = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.sent & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_StartObservingMediaSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StartObservingMediaSinks_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_StartObservingMediaSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StartObservingMediaSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StartObservingMediaSinks_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StartObservingMediaSinks_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StartObservingMediaSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StartObservingMediaSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StartObservingMediaSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StartObservingMediaSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_StopObservingMediaSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StopObservingMediaSinks_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_StopObservingMediaSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StopObservingMediaSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StopObservingMediaSinks_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StopObservingMediaSinks_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StopObservingMediaSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StopObservingMediaSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StopObservingMediaSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StopObservingMediaSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_StartObservingMediaRoutes_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StartObservingMediaRoutes_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_StartObservingMediaRoutes_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StartObservingMediaRoutes_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StartObservingMediaRoutes_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StartObservingMediaRoutes_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StartObservingMediaRoutes_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StartObservingMediaRoutes_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StartObservingMediaRoutes_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StartObservingMediaRoutes_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_StopObservingMediaRoutes_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StopObservingMediaRoutes_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_StopObservingMediaRoutes_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StopObservingMediaRoutes_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StopObservingMediaRoutes_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StopObservingMediaRoutes_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StopObservingMediaRoutes_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StopObservingMediaRoutes_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StopObservingMediaRoutes_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StopObservingMediaRoutes_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_StartListeningForRouteMessages_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StartListeningForRouteMessages_Params.prototype.initDefaults_ = function() { this.routeId = null; }; MediaRouteProvider_StartListeningForRouteMessages_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StartListeningForRouteMessages_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StartListeningForRouteMessages_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StartListeningForRouteMessages_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StartListeningForRouteMessages_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StartListeningForRouteMessages_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StartListeningForRouteMessages_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StartListeningForRouteMessages_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); }; function MediaRouteProvider_StopListeningForRouteMessages_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StopListeningForRouteMessages_Params.prototype.initDefaults_ = function() { this.routeId = null; }; MediaRouteProvider_StopListeningForRouteMessages_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StopListeningForRouteMessages_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StopListeningForRouteMessages_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StopListeningForRouteMessages_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StopListeningForRouteMessages_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StopListeningForRouteMessages_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StopListeningForRouteMessages_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StopListeningForRouteMessages_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); }; function MediaRouteProvider_DetachRoute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_DetachRoute_Params.prototype.initDefaults_ = function() { this.routeId = null; }; MediaRouteProvider_DetachRoute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_DetachRoute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_DetachRoute_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_DetachRoute_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_DetachRoute_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_DetachRoute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_DetachRoute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_DetachRoute_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); }; function MediaRouteProvider_EnableMdnsDiscovery_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_EnableMdnsDiscovery_Params.prototype.initDefaults_ = function() { }; MediaRouteProvider_EnableMdnsDiscovery_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_EnableMdnsDiscovery_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_EnableMdnsDiscovery_Params.encodedSize = codec.kStructHeaderSize + 0; MediaRouteProvider_EnableMdnsDiscovery_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_EnableMdnsDiscovery_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaRouteProvider_EnableMdnsDiscovery_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_EnableMdnsDiscovery_Params.encodedSize); encoder.writeUint32(0); }; function MediaRouteProvider_UpdateMediaSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_UpdateMediaSinks_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_UpdateMediaSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_UpdateMediaSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_UpdateMediaSinks_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_UpdateMediaSinks_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_UpdateMediaSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_UpdateMediaSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_UpdateMediaSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_UpdateMediaSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_SearchSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SearchSinks_Params.prototype.initDefaults_ = function() { this.sinkId = null; this.mediaSource = null; this.searchCriteria = null; }; MediaRouteProvider_SearchSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SearchSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SearchSinks_Params.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SearchSinks_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SearchSinks_Params.searchCriteria err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 16, SinkSearchCriteria, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SearchSinks_Params.encodedSize = codec.kStructHeaderSize + 24; MediaRouteProvider_SearchSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SearchSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.sinkId = decoder.decodeStruct(codec.String); val.mediaSource = decoder.decodeStruct(codec.String); val.searchCriteria = decoder.decodeStructPointer(SinkSearchCriteria); return val; }; MediaRouteProvider_SearchSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SearchSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.sinkId); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeStructPointer(SinkSearchCriteria, val.searchCriteria); }; function MediaRouteProvider_SearchSinks_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SearchSinks_ResponseParams.prototype.initDefaults_ = function() { this.sinkId = null; }; MediaRouteProvider_SearchSinks_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SearchSinks_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SearchSinks_ResponseParams.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SearchSinks_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_SearchSinks_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SearchSinks_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.sinkId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_SearchSinks_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SearchSinks_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.sinkId); }; function MediaRouteProvider_ProvideSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_ProvideSinks_Params.prototype.initDefaults_ = function() { this.providerName = null; this.sinks = null; }; MediaRouteProvider_ProvideSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_ProvideSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ProvideSinks_Params.providerName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ProvideSinks_Params.sinks err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(MediaSink), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_ProvideSinks_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouteProvider_ProvideSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_ProvideSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerName = decoder.decodeStruct(codec.String); val.sinks = decoder.decodeArrayPointer(new codec.PointerTo(MediaSink)); return val; }; MediaRouteProvider_ProvideSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_ProvideSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.providerName); encoder.encodeArrayPointer(new codec.PointerTo(MediaSink), val.sinks); }; function MediaRouteProvider_CreateMediaRouteController_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_CreateMediaRouteController_Params.prototype.initDefaults_ = function() { this.routeId = null; this.mediaController = new bindings.InterfaceRequest(); this.observer = new media_status$.MediaStatusObserverPtr(); }; MediaRouteProvider_CreateMediaRouteController_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_CreateMediaRouteController_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateMediaRouteController_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateMediaRouteController_Params.mediaController err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateMediaRouteController_Params.observer err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 12, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_CreateMediaRouteController_Params.encodedSize = codec.kStructHeaderSize + 24; MediaRouteProvider_CreateMediaRouteController_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_CreateMediaRouteController_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.mediaController = decoder.decodeStruct(codec.InterfaceRequest); val.observer = decoder.decodeStruct(new codec.Interface(media_status$.MediaStatusObserverPtr)); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_CreateMediaRouteController_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_CreateMediaRouteController_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.InterfaceRequest, val.mediaController); encoder.encodeStruct(new codec.Interface(media_status$.MediaStatusObserverPtr), val.observer); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_CreateMediaRouteController_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_CreateMediaRouteController_ResponseParams.prototype.initDefaults_ = function() { this.success = false; }; MediaRouteProvider_CreateMediaRouteController_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_CreateMediaRouteController_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_CreateMediaRouteController_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_CreateMediaRouteController_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_CreateMediaRouteController_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.success = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_CreateMediaRouteController_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_CreateMediaRouteController_ResponseParams.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.success & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouter_RegisterMediaRouteProvider_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_RegisterMediaRouteProvider_Params.prototype.initDefaults_ = function() { this.providerId = 0; this.mediaRouterProvider = new MediaRouteProviderPtr(); }; MediaRouter_RegisterMediaRouteProvider_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_RegisterMediaRouteProvider_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_RegisterMediaRouteProvider_Params.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_RegisterMediaRouteProvider_Params.mediaRouterProvider err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 4, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_RegisterMediaRouteProvider_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_RegisterMediaRouteProvider_Params.decode = function(decoder) { var packed; var val = new MediaRouter_RegisterMediaRouteProvider_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerId = decoder.decodeStruct(codec.Int32); val.mediaRouterProvider = decoder.decodeStruct(new codec.Interface(MediaRouteProviderPtr)); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouter_RegisterMediaRouteProvider_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_RegisterMediaRouteProvider_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.providerId); encoder.encodeStruct(new codec.Interface(MediaRouteProviderPtr), val.mediaRouterProvider); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouter_RegisterMediaRouteProvider_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_RegisterMediaRouteProvider_ResponseParams.prototype.initDefaults_ = function() { this.instanceId = null; this.config = null; }; MediaRouter_RegisterMediaRouteProvider_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_RegisterMediaRouteProvider_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_RegisterMediaRouteProvider_ResponseParams.instanceId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_RegisterMediaRouteProvider_ResponseParams.config err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, MediaRouteProviderConfig, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_RegisterMediaRouteProvider_ResponseParams.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_RegisterMediaRouteProvider_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouter_RegisterMediaRouteProvider_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.instanceId = decoder.decodeStruct(codec.String); val.config = decoder.decodeStructPointer(MediaRouteProviderConfig); return val; }; MediaRouter_RegisterMediaRouteProvider_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_RegisterMediaRouteProvider_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.instanceId); encoder.encodeStructPointer(MediaRouteProviderConfig, val.config); }; function MediaRouter_OnSinksReceived_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnSinksReceived_Params.prototype.initDefaults_ = function() { this.providerId = 0; this.mediaSource = null; this.sinks = null; this.origins = null; }; MediaRouter_OnSinksReceived_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnSinksReceived_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinksReceived_Params.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinksReceived_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinksReceived_Params.sinks err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 8, new codec.PointerTo(MediaSink), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinksReceived_Params.origins err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 24, 8, new codec.PointerTo(origin$.Origin), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnSinksReceived_Params.encodedSize = codec.kStructHeaderSize + 32; MediaRouter_OnSinksReceived_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnSinksReceived_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerId = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.mediaSource = decoder.decodeStruct(codec.String); val.sinks = decoder.decodeArrayPointer(new codec.PointerTo(MediaSink)); val.origins = decoder.decodeArrayPointer(new codec.PointerTo(origin$.Origin)); return val; }; MediaRouter_OnSinksReceived_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnSinksReceived_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.providerId); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeArrayPointer(new codec.PointerTo(MediaSink), val.sinks); encoder.encodeArrayPointer(new codec.PointerTo(origin$.Origin), val.origins); }; function MediaRouter_OnIssue_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnIssue_Params.prototype.initDefaults_ = function() { this.issue = null; }; MediaRouter_OnIssue_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnIssue_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnIssue_Params.issue err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, Issue, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnIssue_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouter_OnIssue_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnIssue_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.issue = decoder.decodeStructPointer(Issue); return val; }; MediaRouter_OnIssue_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnIssue_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(Issue, val.issue); }; function MediaRouter_OnRoutesUpdated_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnRoutesUpdated_Params.prototype.initDefaults_ = function() { this.providerId = 0; this.routes = null; this.mediaSource = null; this.joinableRouteIds = null; }; MediaRouter_OnRoutesUpdated_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnRoutesUpdated_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRoutesUpdated_Params.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRoutesUpdated_Params.routes err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(MediaRoute), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRoutesUpdated_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRoutesUpdated_Params.joinableRouteIds err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 24, 8, codec.String, false, [0, 0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnRoutesUpdated_Params.encodedSize = codec.kStructHeaderSize + 32; MediaRouter_OnRoutesUpdated_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnRoutesUpdated_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerId = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.routes = decoder.decodeArrayPointer(new codec.PointerTo(MediaRoute)); val.mediaSource = decoder.decodeStruct(codec.String); val.joinableRouteIds = decoder.decodeArrayPointer(codec.String); return val; }; MediaRouter_OnRoutesUpdated_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnRoutesUpdated_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.providerId); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeArrayPointer(new codec.PointerTo(MediaRoute), val.routes); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeArrayPointer(codec.String, val.joinableRouteIds); }; function MediaRouter_OnSinkAvailabilityUpdated_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnSinkAvailabilityUpdated_Params.prototype.initDefaults_ = function() { this.providerId = 0; this.availability = 0; }; MediaRouter_OnSinkAvailabilityUpdated_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnSinkAvailabilityUpdated_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinkAvailabilityUpdated_Params.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinkAvailabilityUpdated_Params.availability err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 4, MediaRouter.SinkAvailability); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnSinkAvailabilityUpdated_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouter_OnSinkAvailabilityUpdated_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnSinkAvailabilityUpdated_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerId = decoder.decodeStruct(codec.Int32); val.availability = decoder.decodeStruct(codec.Int32); return val; }; MediaRouter_OnSinkAvailabilityUpdated_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnSinkAvailabilityUpdated_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.providerId); encoder.encodeStruct(codec.Int32, val.availability); }; function MediaRouter_OnPresentationConnectionStateChanged_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnPresentationConnectionStateChanged_Params.prototype.initDefaults_ = function() { this.routeId = null; this.state = 0; }; MediaRouter_OnPresentationConnectionStateChanged_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnPresentationConnectionStateChanged_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionStateChanged_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionStateChanged_Params.state err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, MediaRouter.PresentationConnectionState); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnPresentationConnectionStateChanged_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_OnPresentationConnectionStateChanged_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnPresentationConnectionStateChanged_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.state = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouter_OnPresentationConnectionStateChanged_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnPresentationConnectionStateChanged_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.Int32, val.state); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouter_OnPresentationConnectionClosed_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnPresentationConnectionClosed_Params.prototype.initDefaults_ = function() { this.routeId = null; this.reason = 0; this.message = null; }; MediaRouter_OnPresentationConnectionClosed_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnPresentationConnectionClosed_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionClosed_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionClosed_Params.reason err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, MediaRouter.PresentationConnectionCloseReason); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionClosed_Params.message err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnPresentationConnectionClosed_Params.encodedSize = codec.kStructHeaderSize + 24; MediaRouter_OnPresentationConnectionClosed_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnPresentationConnectionClosed_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.reason = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.message = decoder.decodeStruct(codec.String); return val; }; MediaRouter_OnPresentationConnectionClosed_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnPresentationConnectionClosed_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.Int32, val.reason); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.String, val.message); }; function MediaRouter_OnRouteMessagesReceived_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnRouteMessagesReceived_Params.prototype.initDefaults_ = function() { this.routeId = null; this.messages = null; }; MediaRouter_OnRouteMessagesReceived_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnRouteMessagesReceived_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRouteMessagesReceived_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRouteMessagesReceived_Params.messages err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(RouteMessage), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnRouteMessagesReceived_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_OnRouteMessagesReceived_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnRouteMessagesReceived_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.messages = decoder.decodeArrayPointer(new codec.PointerTo(RouteMessage)); return val; }; MediaRouter_OnRouteMessagesReceived_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnRouteMessagesReceived_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeArrayPointer(new codec.PointerTo(RouteMessage), val.messages); }; function MediaRouter_OnMediaRemoterCreated_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnMediaRemoterCreated_Params.prototype.initDefaults_ = function() { this.tabId = 0; this.remoter = new mirror_service_remoting$.MirrorServiceRemoterPtr(); this.remotingSource = new bindings.InterfaceRequest(); }; MediaRouter_OnMediaRemoterCreated_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnMediaRemoterCreated_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnMediaRemoterCreated_Params.remoter err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 4, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnMediaRemoterCreated_Params.remotingSource err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 12, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnMediaRemoterCreated_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_OnMediaRemoterCreated_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnMediaRemoterCreated_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.tabId = decoder.decodeStruct(codec.Int32); val.remoter = decoder.decodeStruct(new codec.Interface(mirror_service_remoting$.MirrorServiceRemoterPtr)); val.remotingSource = decoder.decodeStruct(codec.InterfaceRequest); return val; }; MediaRouter_OnMediaRemoterCreated_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnMediaRemoterCreated_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.tabId); encoder.encodeStruct(new codec.Interface(mirror_service_remoting$.MirrorServiceRemoterPtr), val.remoter); encoder.encodeStruct(codec.InterfaceRequest, val.remotingSource); }; function MediaSinkExtraData(value) { this.initDefault_(); this.initValue_(value); } MediaSinkExtraData.Tags = { dialMediaSink: 0, castMediaSink: 1, }; MediaSinkExtraData.prototype.initDefault_ = function() { this.$data = null; this.$tag = undefined; } MediaSinkExtraData.prototype.initValue_ = function(value) { if (value == undefined) { return; } var keys = Object.keys(value); if (keys.length == 0) { return; } if (keys.length > 1) { throw new TypeError("You may set only one member on a union."); } var fields = [ "dialMediaSink", "castMediaSink", ]; if (fields.indexOf(keys[0]) < 0) { throw new ReferenceError(keys[0] + " is not a MediaSinkExtraData member."); } this[keys[0]] = value[keys[0]]; } Object.defineProperty(MediaSinkExtraData.prototype, "dialMediaSink", { get: function() { if (this.$tag != MediaSinkExtraData.Tags.dialMediaSink) { throw new ReferenceError( "MediaSinkExtraData.dialMediaSink is not currently set."); } return this.$data; }, set: function(value) { this.$tag = MediaSinkExtraData.Tags.dialMediaSink; this.$data = value; } }); Object.defineProperty(MediaSinkExtraData.prototype, "castMediaSink", { get: function() { if (this.$tag != MediaSinkExtraData.Tags.castMediaSink) { throw new ReferenceError( "MediaSinkExtraData.castMediaSink is not currently set."); } return this.$data; }, set: function(value) { this.$tag = MediaSinkExtraData.Tags.castMediaSink; this.$data = value; } }); MediaSinkExtraData.encode = function(encoder, val) { if (val == null) { encoder.writeUint64(0); encoder.writeUint64(0); return; } if (val.$tag == undefined) { throw new TypeError("Cannot encode unions with an unknown member set."); } encoder.writeUint32(16); encoder.writeUint32(val.$tag); switch (val.$tag) { case MediaSinkExtraData.Tags.dialMediaSink: encoder.encodeStructPointer(DialMediaSink, val.dialMediaSink); break; case MediaSinkExtraData.Tags.castMediaSink: encoder.encodeStructPointer(CastMediaSink, val.castMediaSink); break; } encoder.align(); }; MediaSinkExtraData.decode = function(decoder) { var size = decoder.readUint32(); if (size == 0) { decoder.readUint32(); decoder.readUint64(); return null; } var result = new MediaSinkExtraData(); var tag = decoder.readUint32(); switch (tag) { case MediaSinkExtraData.Tags.dialMediaSink: result.dialMediaSink = decoder.decodeStructPointer(DialMediaSink); break; case MediaSinkExtraData.Tags.castMediaSink: result.castMediaSink = decoder.decodeStructPointer(CastMediaSink); break; } decoder.align(); return result; }; MediaSinkExtraData.validate = function(messageValidator, offset) { var size = messageValidator.decodeUnionSize(offset); if (size != 16) { return validator.validationError.INVALID_UNION_SIZE; } var tag = messageValidator.decodeUnionTag(offset); var data_offset = offset + 8; var err; switch (tag) { case MediaSinkExtraData.Tags.dialMediaSink: // validate MediaSinkExtraData.dialMediaSink err = messageValidator.validateStructPointer(data_offset, DialMediaSink, false); if (err !== validator.validationError.NONE) return err; break; case MediaSinkExtraData.Tags.castMediaSink: // validate MediaSinkExtraData.castMediaSink err = messageValidator.validateStructPointer(data_offset, CastMediaSink, false); if (err !== validator.validationError.NONE) return err; break; } return validator.validationError.NONE; }; MediaSinkExtraData.encodedSize = 16; var kMediaRouteProvider_CreateRoute_Name = 2021030730; var kMediaRouteProvider_JoinRoute_Name = 1454041253; var kMediaRouteProvider_ConnectRouteByRouteId_Name = 738462639; var kMediaRouteProvider_TerminateRoute_Name = 55651359; var kMediaRouteProvider_SendRouteMessage_Name = 137843099; var kMediaRouteProvider_SendRouteBinaryMessage_Name = 162571134; var kMediaRouteProvider_StartObservingMediaSinks_Name = 1300861070; var kMediaRouteProvider_StopObservingMediaSinks_Name = 995635284; var kMediaRouteProvider_StartObservingMediaRoutes_Name = 867741207; var kMediaRouteProvider_StopObservingMediaRoutes_Name = 141846925; var kMediaRouteProvider_StartListeningForRouteMessages_Name = 1278472312; var kMediaRouteProvider_StopListeningForRouteMessages_Name = 1473668240; var kMediaRouteProvider_DetachRoute_Name = 1051108802; var kMediaRouteProvider_EnableMdnsDiscovery_Name = 1822352056; var kMediaRouteProvider_UpdateMediaSinks_Name = 1961935818; var kMediaRouteProvider_SearchSinks_Name = 984423445; var kMediaRouteProvider_ProvideSinks_Name = 1314766317; var kMediaRouteProvider_CreateMediaRouteController_Name = 900573253; function MediaRouteProviderPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MediaRouteProvider, handleOrPtrInfo); } function MediaRouteProviderAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MediaRouteProvider, associatedInterfacePtrInfo); } MediaRouteProviderAssociatedPtr.prototype = Object.create(MediaRouteProviderPtr.prototype); MediaRouteProviderAssociatedPtr.prototype.constructor = MediaRouteProviderAssociatedPtr; function MediaRouteProviderProxy(receiver) { this.receiver_ = receiver; } MediaRouteProviderPtr.prototype.createRoute = function() { return MediaRouteProviderProxy.prototype.createRoute .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.createRoute = function(mediaSource, sinkId, originalPresentationId, origin, tabId, timeout, incognito) { var params = new MediaRouteProvider_CreateRoute_Params(); params.mediaSource = mediaSource; params.sinkId = sinkId; params.originalPresentationId = originalPresentationId; params.origin = origin; params.tabId = tabId; params.timeout = timeout; params.incognito = incognito; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_CreateRoute_Name, codec.align(MediaRouteProvider_CreateRoute_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_CreateRoute_Params, params); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_CreateRoute_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.joinRoute = function() { return MediaRouteProviderProxy.prototype.joinRoute .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.joinRoute = function(mediaSource, presentationId, origin, tabId, timeout, incognito) { var params = new MediaRouteProvider_JoinRoute_Params(); params.mediaSource = mediaSource; params.presentationId = presentationId; params.origin = origin; params.tabId = tabId; params.timeout = timeout; params.incognito = incognito; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_JoinRoute_Name, codec.align(MediaRouteProvider_JoinRoute_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_JoinRoute_Params, params); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_JoinRoute_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.connectRouteByRouteId = function() { return MediaRouteProviderProxy.prototype.connectRouteByRouteId .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.connectRouteByRouteId = function(mediaSource, routeId, presentationId, origin, tabId, timeout, incognito) { var params = new MediaRouteProvider_ConnectRouteByRouteId_Params(); params.mediaSource = mediaSource; params.routeId = routeId; params.presentationId = presentationId; params.origin = origin; params.tabId = tabId; params.timeout = timeout; params.incognito = incognito; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_ConnectRouteByRouteId_Name, codec.align(MediaRouteProvider_ConnectRouteByRouteId_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_ConnectRouteByRouteId_Params, params); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.terminateRoute = function() { return MediaRouteProviderProxy.prototype.terminateRoute .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.terminateRoute = function(routeId) { var params = new MediaRouteProvider_TerminateRoute_Params(); params.routeId = routeId; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_TerminateRoute_Name, codec.align(MediaRouteProvider_TerminateRoute_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_TerminateRoute_Params, params); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_TerminateRoute_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.sendRouteMessage = function() { return MediaRouteProviderProxy.prototype.sendRouteMessage .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.sendRouteMessage = function(mediaRouteId, message) { var params = new MediaRouteProvider_SendRouteMessage_Params(); params.mediaRouteId = mediaRouteId; params.message = message; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_SendRouteMessage_Name, codec.align(MediaRouteProvider_SendRouteMessage_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_SendRouteMessage_Params, params); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_SendRouteMessage_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.sendRouteBinaryMessage = function() { return MediaRouteProviderProxy.prototype.sendRouteBinaryMessage .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.sendRouteBinaryMessage = function(mediaRouteId, data) { var params = new MediaRouteProvider_SendRouteBinaryMessage_Params(); params.mediaRouteId = mediaRouteId; params.data = data; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_SendRouteBinaryMessage_Name, codec.align(MediaRouteProvider_SendRouteBinaryMessage_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_SendRouteBinaryMessage_Params, params); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_SendRouteBinaryMessage_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.startObservingMediaSinks = function() { return MediaRouteProviderProxy.prototype.startObservingMediaSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.startObservingMediaSinks = function(mediaSource) { var params = new MediaRouteProvider_StartObservingMediaSinks_Params(); params.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StartObservingMediaSinks_Name, codec.align(MediaRouteProvider_StartObservingMediaSinks_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StartObservingMediaSinks_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.stopObservingMediaSinks = function() { return MediaRouteProviderProxy.prototype.stopObservingMediaSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.stopObservingMediaSinks = function(mediaSource) { var params = new MediaRouteProvider_StopObservingMediaSinks_Params(); params.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StopObservingMediaSinks_Name, codec.align(MediaRouteProvider_StopObservingMediaSinks_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StopObservingMediaSinks_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.startObservingMediaRoutes = function() { return MediaRouteProviderProxy.prototype.startObservingMediaRoutes .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.startObservingMediaRoutes = function(mediaSource) { var params = new MediaRouteProvider_StartObservingMediaRoutes_Params(); params.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StartObservingMediaRoutes_Name, codec.align(MediaRouteProvider_StartObservingMediaRoutes_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StartObservingMediaRoutes_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.stopObservingMediaRoutes = function() { return MediaRouteProviderProxy.prototype.stopObservingMediaRoutes .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.stopObservingMediaRoutes = function(mediaSource) { var params = new MediaRouteProvider_StopObservingMediaRoutes_Params(); params.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StopObservingMediaRoutes_Name, codec.align(MediaRouteProvider_StopObservingMediaRoutes_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StopObservingMediaRoutes_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.startListeningForRouteMessages = function() { return MediaRouteProviderProxy.prototype.startListeningForRouteMessages .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.startListeningForRouteMessages = function(routeId) { var params = new MediaRouteProvider_StartListeningForRouteMessages_Params(); params.routeId = routeId; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StartListeningForRouteMessages_Name, codec.align(MediaRouteProvider_StartListeningForRouteMessages_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StartListeningForRouteMessages_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.stopListeningForRouteMessages = function() { return MediaRouteProviderProxy.prototype.stopListeningForRouteMessages .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.stopListeningForRouteMessages = function(routeId) { var params = new MediaRouteProvider_StopListeningForRouteMessages_Params(); params.routeId = routeId; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StopListeningForRouteMessages_Name, codec.align(MediaRouteProvider_StopListeningForRouteMessages_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StopListeningForRouteMessages_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.detachRoute = function() { return MediaRouteProviderProxy.prototype.detachRoute .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.detachRoute = function(routeId) { var params = new MediaRouteProvider_DetachRoute_Params(); params.routeId = routeId; var builder = new codec.MessageV0Builder( kMediaRouteProvider_DetachRoute_Name, codec.align(MediaRouteProvider_DetachRoute_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_DetachRoute_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.enableMdnsDiscovery = function() { return MediaRouteProviderProxy.prototype.enableMdnsDiscovery .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.enableMdnsDiscovery = function() { var params = new MediaRouteProvider_EnableMdnsDiscovery_Params(); var builder = new codec.MessageV0Builder( kMediaRouteProvider_EnableMdnsDiscovery_Name, codec.align(MediaRouteProvider_EnableMdnsDiscovery_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_EnableMdnsDiscovery_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.updateMediaSinks = function() { return MediaRouteProviderProxy.prototype.updateMediaSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.updateMediaSinks = function(mediaSource) { var params = new MediaRouteProvider_UpdateMediaSinks_Params(); params.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_UpdateMediaSinks_Name, codec.align(MediaRouteProvider_UpdateMediaSinks_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_UpdateMediaSinks_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.searchSinks = function() { return MediaRouteProviderProxy.prototype.searchSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.searchSinks = function(sinkId, mediaSource, searchCriteria) { var params = new MediaRouteProvider_SearchSinks_Params(); params.sinkId = sinkId; params.mediaSource = mediaSource; params.searchCriteria = searchCriteria; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_SearchSinks_Name, codec.align(MediaRouteProvider_SearchSinks_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_SearchSinks_Params, params); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_SearchSinks_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.provideSinks = function() { return MediaRouteProviderProxy.prototype.provideSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.provideSinks = function(providerName, sinks) { var params = new MediaRouteProvider_ProvideSinks_Params(); params.providerName = providerName; params.sinks = sinks; var builder = new codec.MessageV0Builder( kMediaRouteProvider_ProvideSinks_Name, codec.align(MediaRouteProvider_ProvideSinks_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_ProvideSinks_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.createMediaRouteController = function() { return MediaRouteProviderProxy.prototype.createMediaRouteController .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.createMediaRouteController = function(routeId, mediaController, observer) { var params = new MediaRouteProvider_CreateMediaRouteController_Params(); params.routeId = routeId; params.mediaController = mediaController; params.observer = observer; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_CreateMediaRouteController_Name, codec.align(MediaRouteProvider_CreateMediaRouteController_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_CreateMediaRouteController_Params, params); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_CreateMediaRouteController_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; function MediaRouteProviderStub(delegate) { this.delegate_ = delegate; } MediaRouteProviderStub.prototype.createRoute = function(mediaSource, sinkId, originalPresentationId, origin, tabId, timeout, incognito) { return this.delegate_ && this.delegate_.createRoute && this.delegate_.createRoute(mediaSource, sinkId, originalPresentationId, origin, tabId, timeout, incognito); } MediaRouteProviderStub.prototype.joinRoute = function(mediaSource, presentationId, origin, tabId, timeout, incognito) { return this.delegate_ && this.delegate_.joinRoute && this.delegate_.joinRoute(mediaSource, presentationId, origin, tabId, timeout, incognito); } MediaRouteProviderStub.prototype.connectRouteByRouteId = function(mediaSource, routeId, presentationId, origin, tabId, timeout, incognito) { return this.delegate_ && this.delegate_.connectRouteByRouteId && this.delegate_.connectRouteByRouteId(mediaSource, routeId, presentationId, origin, tabId, timeout, incognito); } MediaRouteProviderStub.prototype.terminateRoute = function(routeId) { return this.delegate_ && this.delegate_.terminateRoute && this.delegate_.terminateRoute(routeId); } MediaRouteProviderStub.prototype.sendRouteMessage = function(mediaRouteId, message) { return this.delegate_ && this.delegate_.sendRouteMessage && this.delegate_.sendRouteMessage(mediaRouteId, message); } MediaRouteProviderStub.prototype.sendRouteBinaryMessage = function(mediaRouteId, data) { return this.delegate_ && this.delegate_.sendRouteBinaryMessage && this.delegate_.sendRouteBinaryMessage(mediaRouteId, data); } MediaRouteProviderStub.prototype.startObservingMediaSinks = function(mediaSource) { return this.delegate_ && this.delegate_.startObservingMediaSinks && this.delegate_.startObservingMediaSinks(mediaSource); } MediaRouteProviderStub.prototype.stopObservingMediaSinks = function(mediaSource) { return this.delegate_ && this.delegate_.stopObservingMediaSinks && this.delegate_.stopObservingMediaSinks(mediaSource); } MediaRouteProviderStub.prototype.startObservingMediaRoutes = function(mediaSource) { return this.delegate_ && this.delegate_.startObservingMediaRoutes && this.delegate_.startObservingMediaRoutes(mediaSource); } MediaRouteProviderStub.prototype.stopObservingMediaRoutes = function(mediaSource) { return this.delegate_ && this.delegate_.stopObservingMediaRoutes && this.delegate_.stopObservingMediaRoutes(mediaSource); } MediaRouteProviderStub.prototype.startListeningForRouteMessages = function(routeId) { return this.delegate_ && this.delegate_.startListeningForRouteMessages && this.delegate_.startListeningForRouteMessages(routeId); } MediaRouteProviderStub.prototype.stopListeningForRouteMessages = function(routeId) { return this.delegate_ && this.delegate_.stopListeningForRouteMessages && this.delegate_.stopListeningForRouteMessages(routeId); } MediaRouteProviderStub.prototype.detachRoute = function(routeId) { return this.delegate_ && this.delegate_.detachRoute && this.delegate_.detachRoute(routeId); } MediaRouteProviderStub.prototype.enableMdnsDiscovery = function() { return this.delegate_ && this.delegate_.enableMdnsDiscovery && this.delegate_.enableMdnsDiscovery(); } MediaRouteProviderStub.prototype.updateMediaSinks = function(mediaSource) { return this.delegate_ && this.delegate_.updateMediaSinks && this.delegate_.updateMediaSinks(mediaSource); } MediaRouteProviderStub.prototype.searchSinks = function(sinkId, mediaSource, searchCriteria) { return this.delegate_ && this.delegate_.searchSinks && this.delegate_.searchSinks(sinkId, mediaSource, searchCriteria); } MediaRouteProviderStub.prototype.provideSinks = function(providerName, sinks) { return this.delegate_ && this.delegate_.provideSinks && this.delegate_.provideSinks(providerName, sinks); } MediaRouteProviderStub.prototype.createMediaRouteController = function(routeId, mediaController, observer) { return this.delegate_ && this.delegate_.createMediaRouteController && this.delegate_.createMediaRouteController(routeId, mediaController, observer); } MediaRouteProviderStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaRouteProvider_StartObservingMediaSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_StartObservingMediaSinks_Params); this.startObservingMediaSinks(params.mediaSource); return true; case kMediaRouteProvider_StopObservingMediaSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_StopObservingMediaSinks_Params); this.stopObservingMediaSinks(params.mediaSource); return true; case kMediaRouteProvider_StartObservingMediaRoutes_Name: var params = reader.decodeStruct(MediaRouteProvider_StartObservingMediaRoutes_Params); this.startObservingMediaRoutes(params.mediaSource); return true; case kMediaRouteProvider_StopObservingMediaRoutes_Name: var params = reader.decodeStruct(MediaRouteProvider_StopObservingMediaRoutes_Params); this.stopObservingMediaRoutes(params.mediaSource); return true; case kMediaRouteProvider_StartListeningForRouteMessages_Name: var params = reader.decodeStruct(MediaRouteProvider_StartListeningForRouteMessages_Params); this.startListeningForRouteMessages(params.routeId); return true; case kMediaRouteProvider_StopListeningForRouteMessages_Name: var params = reader.decodeStruct(MediaRouteProvider_StopListeningForRouteMessages_Params); this.stopListeningForRouteMessages(params.routeId); return true; case kMediaRouteProvider_DetachRoute_Name: var params = reader.decodeStruct(MediaRouteProvider_DetachRoute_Params); this.detachRoute(params.routeId); return true; case kMediaRouteProvider_EnableMdnsDiscovery_Name: var params = reader.decodeStruct(MediaRouteProvider_EnableMdnsDiscovery_Params); this.enableMdnsDiscovery(); return true; case kMediaRouteProvider_UpdateMediaSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_UpdateMediaSinks_Params); this.updateMediaSinks(params.mediaSource); return true; case kMediaRouteProvider_ProvideSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_ProvideSinks_Params); this.provideSinks(params.providerName, params.sinks); return true; default: return false; } }; MediaRouteProviderStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaRouteProvider_CreateRoute_Name: var params = reader.decodeStruct(MediaRouteProvider_CreateRoute_Params); this.createRoute(params.mediaSource, params.sinkId, params.originalPresentationId, params.origin, params.tabId, params.timeout, params.incognito).then(function(response) { var responseParams = new MediaRouteProvider_CreateRoute_ResponseParams(); responseParams.route = response.route; responseParams.errorText = response.errorText; responseParams.resultCode = response.resultCode; var builder = new codec.MessageV1Builder( kMediaRouteProvider_CreateRoute_Name, codec.align(MediaRouteProvider_CreateRoute_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_CreateRoute_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_JoinRoute_Name: var params = reader.decodeStruct(MediaRouteProvider_JoinRoute_Params); this.joinRoute(params.mediaSource, params.presentationId, params.origin, params.tabId, params.timeout, params.incognito).then(function(response) { var responseParams = new MediaRouteProvider_JoinRoute_ResponseParams(); responseParams.route = response.route; responseParams.errorText = response.errorText; responseParams.resultCode = response.resultCode; var builder = new codec.MessageV1Builder( kMediaRouteProvider_JoinRoute_Name, codec.align(MediaRouteProvider_JoinRoute_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_JoinRoute_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_ConnectRouteByRouteId_Name: var params = reader.decodeStruct(MediaRouteProvider_ConnectRouteByRouteId_Params); this.connectRouteByRouteId(params.mediaSource, params.routeId, params.presentationId, params.origin, params.tabId, params.timeout, params.incognito).then(function(response) { var responseParams = new MediaRouteProvider_ConnectRouteByRouteId_ResponseParams(); responseParams.route = response.route; responseParams.errorText = response.errorText; responseParams.resultCode = response.resultCode; var builder = new codec.MessageV1Builder( kMediaRouteProvider_ConnectRouteByRouteId_Name, codec.align(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_TerminateRoute_Name: var params = reader.decodeStruct(MediaRouteProvider_TerminateRoute_Params); this.terminateRoute(params.routeId).then(function(response) { var responseParams = new MediaRouteProvider_TerminateRoute_ResponseParams(); responseParams.errorText = response.errorText; responseParams.resultCode = response.resultCode; var builder = new codec.MessageV1Builder( kMediaRouteProvider_TerminateRoute_Name, codec.align(MediaRouteProvider_TerminateRoute_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_TerminateRoute_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_SendRouteMessage_Name: var params = reader.decodeStruct(MediaRouteProvider_SendRouteMessage_Params); this.sendRouteMessage(params.mediaRouteId, params.message).then(function(response) { var responseParams = new MediaRouteProvider_SendRouteMessage_ResponseParams(); responseParams.sent = response.sent; var builder = new codec.MessageV1Builder( kMediaRouteProvider_SendRouteMessage_Name, codec.align(MediaRouteProvider_SendRouteMessage_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_SendRouteMessage_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_SendRouteBinaryMessage_Name: var params = reader.decodeStruct(MediaRouteProvider_SendRouteBinaryMessage_Params); this.sendRouteBinaryMessage(params.mediaRouteId, params.data).then(function(response) { var responseParams = new MediaRouteProvider_SendRouteBinaryMessage_ResponseParams(); responseParams.sent = response.sent; var builder = new codec.MessageV1Builder( kMediaRouteProvider_SendRouteBinaryMessage_Name, codec.align(MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_SendRouteBinaryMessage_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_SearchSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_SearchSinks_Params); this.searchSinks(params.sinkId, params.mediaSource, params.searchCriteria).then(function(response) { var responseParams = new MediaRouteProvider_SearchSinks_ResponseParams(); responseParams.sinkId = response.sinkId; var builder = new codec.MessageV1Builder( kMediaRouteProvider_SearchSinks_Name, codec.align(MediaRouteProvider_SearchSinks_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_SearchSinks_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_CreateMediaRouteController_Name: var params = reader.decodeStruct(MediaRouteProvider_CreateMediaRouteController_Params); this.createMediaRouteController(params.routeId, params.mediaController, params.observer).then(function(response) { var responseParams = new MediaRouteProvider_CreateMediaRouteController_ResponseParams(); responseParams.success = response.success; var builder = new codec.MessageV1Builder( kMediaRouteProvider_CreateMediaRouteController_Name, codec.align(MediaRouteProvider_CreateMediaRouteController_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_CreateMediaRouteController_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; default: return false; } }; function validateMediaRouteProviderRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaRouteProvider_CreateRoute_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_CreateRoute_Params; break; case kMediaRouteProvider_JoinRoute_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_JoinRoute_Params; break; case kMediaRouteProvider_ConnectRouteByRouteId_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_ConnectRouteByRouteId_Params; break; case kMediaRouteProvider_TerminateRoute_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_TerminateRoute_Params; break; case kMediaRouteProvider_SendRouteMessage_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_SendRouteMessage_Params; break; case kMediaRouteProvider_SendRouteBinaryMessage_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_SendRouteBinaryMessage_Params; break; case kMediaRouteProvider_StartObservingMediaSinks_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StartObservingMediaSinks_Params; break; case kMediaRouteProvider_StopObservingMediaSinks_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StopObservingMediaSinks_Params; break; case kMediaRouteProvider_StartObservingMediaRoutes_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StartObservingMediaRoutes_Params; break; case kMediaRouteProvider_StopObservingMediaRoutes_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StopObservingMediaRoutes_Params; break; case kMediaRouteProvider_StartListeningForRouteMessages_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StartListeningForRouteMessages_Params; break; case kMediaRouteProvider_StopListeningForRouteMessages_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StopListeningForRouteMessages_Params; break; case kMediaRouteProvider_DetachRoute_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_DetachRoute_Params; break; case kMediaRouteProvider_EnableMdnsDiscovery_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_EnableMdnsDiscovery_Params; break; case kMediaRouteProvider_UpdateMediaSinks_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_UpdateMediaSinks_Params; break; case kMediaRouteProvider_SearchSinks_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_SearchSinks_Params; break; case kMediaRouteProvider_ProvideSinks_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_ProvideSinks_Params; break; case kMediaRouteProvider_CreateMediaRouteController_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_CreateMediaRouteController_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMediaRouteProviderResponse(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaRouteProvider_CreateRoute_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_CreateRoute_ResponseParams; break; case kMediaRouteProvider_JoinRoute_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_JoinRoute_ResponseParams; break; case kMediaRouteProvider_ConnectRouteByRouteId_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_ConnectRouteByRouteId_ResponseParams; break; case kMediaRouteProvider_TerminateRoute_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_TerminateRoute_ResponseParams; break; case kMediaRouteProvider_SendRouteMessage_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_SendRouteMessage_ResponseParams; break; case kMediaRouteProvider_SendRouteBinaryMessage_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_SendRouteBinaryMessage_ResponseParams; break; case kMediaRouteProvider_SearchSinks_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_SearchSinks_ResponseParams; break; case kMediaRouteProvider_CreateMediaRouteController_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_CreateMediaRouteController_ResponseParams; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } var MediaRouteProvider = { name: 'media_router::mojom::MediaRouteProvider', kVersion: 0, ptrClass: MediaRouteProviderPtr, proxyClass: MediaRouteProviderProxy, stubClass: MediaRouteProviderStub, validateRequest: validateMediaRouteProviderRequest, validateResponse: validateMediaRouteProviderResponse, }; MediaRouteProvider.Id = {}; MediaRouteProvider.Id.EXTENSION = 0; MediaRouteProvider.Id.WIRED_DISPLAY = MediaRouteProvider.Id.EXTENSION + 1; MediaRouteProvider.Id.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: return true; } return false; }; MediaRouteProvider.Id.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaRouteProviderStub.prototype.validator = validateMediaRouteProviderRequest; MediaRouteProviderProxy.prototype.validator = validateMediaRouteProviderResponse; var kMediaRouter_RegisterMediaRouteProvider_Name = 1505294836; var kMediaRouter_OnSinksReceived_Name = 845103116; var kMediaRouter_OnIssue_Name = 1122644428; var kMediaRouter_OnRoutesUpdated_Name = 1954600429; var kMediaRouter_OnSinkAvailabilityUpdated_Name = 2122540235; var kMediaRouter_OnPresentationConnectionStateChanged_Name = 1609360068; var kMediaRouter_OnPresentationConnectionClosed_Name = 1622741397; var kMediaRouter_OnRouteMessagesReceived_Name = 763780902; var kMediaRouter_OnMediaRemoterCreated_Name = 489187334; function MediaRouterPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MediaRouter, handleOrPtrInfo); } function MediaRouterAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MediaRouter, associatedInterfacePtrInfo); } MediaRouterAssociatedPtr.prototype = Object.create(MediaRouterPtr.prototype); MediaRouterAssociatedPtr.prototype.constructor = MediaRouterAssociatedPtr; function MediaRouterProxy(receiver) { this.receiver_ = receiver; } MediaRouterPtr.prototype.registerMediaRouteProvider = function() { return MediaRouterProxy.prototype.registerMediaRouteProvider .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.registerMediaRouteProvider = function(providerId, mediaRouterProvider) { var params = new MediaRouter_RegisterMediaRouteProvider_Params(); params.providerId = providerId; params.mediaRouterProvider = mediaRouterProvider; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouter_RegisterMediaRouteProvider_Name, codec.align(MediaRouter_RegisterMediaRouteProvider_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouter_RegisterMediaRouteProvider_Params, params); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouter_RegisterMediaRouteProvider_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouterPtr.prototype.onSinksReceived = function() { return MediaRouterProxy.prototype.onSinksReceived .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onSinksReceived = function(providerId, mediaSource, sinks, origins) { var params = new MediaRouter_OnSinksReceived_Params(); params.providerId = providerId; params.mediaSource = mediaSource; params.sinks = sinks; params.origins = origins; var builder = new codec.MessageV0Builder( kMediaRouter_OnSinksReceived_Name, codec.align(MediaRouter_OnSinksReceived_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnSinksReceived_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onIssue = function() { return MediaRouterProxy.prototype.onIssue .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onIssue = function(issue) { var params = new MediaRouter_OnIssue_Params(); params.issue = issue; var builder = new codec.MessageV0Builder( kMediaRouter_OnIssue_Name, codec.align(MediaRouter_OnIssue_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnIssue_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onRoutesUpdated = function() { return MediaRouterProxy.prototype.onRoutesUpdated .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onRoutesUpdated = function(providerId, routes, mediaSource, joinableRouteIds) { var params = new MediaRouter_OnRoutesUpdated_Params(); params.providerId = providerId; params.routes = routes; params.mediaSource = mediaSource; params.joinableRouteIds = joinableRouteIds; var builder = new codec.MessageV0Builder( kMediaRouter_OnRoutesUpdated_Name, codec.align(MediaRouter_OnRoutesUpdated_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnRoutesUpdated_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onSinkAvailabilityUpdated = function() { return MediaRouterProxy.prototype.onSinkAvailabilityUpdated .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onSinkAvailabilityUpdated = function(providerId, availability) { var params = new MediaRouter_OnSinkAvailabilityUpdated_Params(); params.providerId = providerId; params.availability = availability; var builder = new codec.MessageV0Builder( kMediaRouter_OnSinkAvailabilityUpdated_Name, codec.align(MediaRouter_OnSinkAvailabilityUpdated_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnSinkAvailabilityUpdated_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onPresentationConnectionStateChanged = function() { return MediaRouterProxy.prototype.onPresentationConnectionStateChanged .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onPresentationConnectionStateChanged = function(routeId, state) { var params = new MediaRouter_OnPresentationConnectionStateChanged_Params(); params.routeId = routeId; params.state = state; var builder = new codec.MessageV0Builder( kMediaRouter_OnPresentationConnectionStateChanged_Name, codec.align(MediaRouter_OnPresentationConnectionStateChanged_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnPresentationConnectionStateChanged_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onPresentationConnectionClosed = function() { return MediaRouterProxy.prototype.onPresentationConnectionClosed .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onPresentationConnectionClosed = function(routeId, reason, message) { var params = new MediaRouter_OnPresentationConnectionClosed_Params(); params.routeId = routeId; params.reason = reason; params.message = message; var builder = new codec.MessageV0Builder( kMediaRouter_OnPresentationConnectionClosed_Name, codec.align(MediaRouter_OnPresentationConnectionClosed_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnPresentationConnectionClosed_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onRouteMessagesReceived = function() { return MediaRouterProxy.prototype.onRouteMessagesReceived .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onRouteMessagesReceived = function(routeId, messages) { var params = new MediaRouter_OnRouteMessagesReceived_Params(); params.routeId = routeId; params.messages = messages; var builder = new codec.MessageV0Builder( kMediaRouter_OnRouteMessagesReceived_Name, codec.align(MediaRouter_OnRouteMessagesReceived_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnRouteMessagesReceived_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onMediaRemoterCreated = function() { return MediaRouterProxy.prototype.onMediaRemoterCreated .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onMediaRemoterCreated = function(tabId, remoter, remotingSource) { var params = new MediaRouter_OnMediaRemoterCreated_Params(); params.tabId = tabId; params.remoter = remoter; params.remotingSource = remotingSource; var builder = new codec.MessageV0Builder( kMediaRouter_OnMediaRemoterCreated_Name, codec.align(MediaRouter_OnMediaRemoterCreated_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnMediaRemoterCreated_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; function MediaRouterStub(delegate) { this.delegate_ = delegate; } MediaRouterStub.prototype.registerMediaRouteProvider = function(providerId, mediaRouterProvider) { return this.delegate_ && this.delegate_.registerMediaRouteProvider && this.delegate_.registerMediaRouteProvider(providerId, mediaRouterProvider); } MediaRouterStub.prototype.onSinksReceived = function(providerId, mediaSource, sinks, origins) { return this.delegate_ && this.delegate_.onSinksReceived && this.delegate_.onSinksReceived(providerId, mediaSource, sinks, origins); } MediaRouterStub.prototype.onIssue = function(issue) { return this.delegate_ && this.delegate_.onIssue && this.delegate_.onIssue(issue); } MediaRouterStub.prototype.onRoutesUpdated = function(providerId, routes, mediaSource, joinableRouteIds) { return this.delegate_ && this.delegate_.onRoutesUpdated && this.delegate_.onRoutesUpdated(providerId, routes, mediaSource, joinableRouteIds); } MediaRouterStub.prototype.onSinkAvailabilityUpdated = function(providerId, availability) { return this.delegate_ && this.delegate_.onSinkAvailabilityUpdated && this.delegate_.onSinkAvailabilityUpdated(providerId, availability); } MediaRouterStub.prototype.onPresentationConnectionStateChanged = function(routeId, state) { return this.delegate_ && this.delegate_.onPresentationConnectionStateChanged && this.delegate_.onPresentationConnectionStateChanged(routeId, state); } MediaRouterStub.prototype.onPresentationConnectionClosed = function(routeId, reason, message) { return this.delegate_ && this.delegate_.onPresentationConnectionClosed && this.delegate_.onPresentationConnectionClosed(routeId, reason, message); } MediaRouterStub.prototype.onRouteMessagesReceived = function(routeId, messages) { return this.delegate_ && this.delegate_.onRouteMessagesReceived && this.delegate_.onRouteMessagesReceived(routeId, messages); } MediaRouterStub.prototype.onMediaRemoterCreated = function(tabId, remoter, remotingSource) { return this.delegate_ && this.delegate_.onMediaRemoterCreated && this.delegate_.onMediaRemoterCreated(tabId, remoter, remotingSource); } MediaRouterStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaRouter_OnSinksReceived_Name: var params = reader.decodeStruct(MediaRouter_OnSinksReceived_Params); this.onSinksReceived(params.providerId, params.mediaSource, params.sinks, params.origins); return true; case kMediaRouter_OnIssue_Name: var params = reader.decodeStruct(MediaRouter_OnIssue_Params); this.onIssue(params.issue); return true; case kMediaRouter_OnRoutesUpdated_Name: var params = reader.decodeStruct(MediaRouter_OnRoutesUpdated_Params); this.onRoutesUpdated(params.providerId, params.routes, params.mediaSource, params.joinableRouteIds); return true; case kMediaRouter_OnSinkAvailabilityUpdated_Name: var params = reader.decodeStruct(MediaRouter_OnSinkAvailabilityUpdated_Params); this.onSinkAvailabilityUpdated(params.providerId, params.availability); return true; case kMediaRouter_OnPresentationConnectionStateChanged_Name: var params = reader.decodeStruct(MediaRouter_OnPresentationConnectionStateChanged_Params); this.onPresentationConnectionStateChanged(params.routeId, params.state); return true; case kMediaRouter_OnPresentationConnectionClosed_Name: var params = reader.decodeStruct(MediaRouter_OnPresentationConnectionClosed_Params); this.onPresentationConnectionClosed(params.routeId, params.reason, params.message); return true; case kMediaRouter_OnRouteMessagesReceived_Name: var params = reader.decodeStruct(MediaRouter_OnRouteMessagesReceived_Params); this.onRouteMessagesReceived(params.routeId, params.messages); return true; case kMediaRouter_OnMediaRemoterCreated_Name: var params = reader.decodeStruct(MediaRouter_OnMediaRemoterCreated_Params); this.onMediaRemoterCreated(params.tabId, params.remoter, params.remotingSource); return true; default: return false; } }; MediaRouterStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaRouter_RegisterMediaRouteProvider_Name: var params = reader.decodeStruct(MediaRouter_RegisterMediaRouteProvider_Params); this.registerMediaRouteProvider(params.providerId, params.mediaRouterProvider).then(function(response) { var responseParams = new MediaRouter_RegisterMediaRouteProvider_ResponseParams(); responseParams.instanceId = response.instanceId; responseParams.config = response.config; var builder = new codec.MessageV1Builder( kMediaRouter_RegisterMediaRouteProvider_Name, codec.align(MediaRouter_RegisterMediaRouteProvider_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouter_RegisterMediaRouteProvider_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; default: return false; } }; function validateMediaRouterRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaRouter_RegisterMediaRouteProvider_Name: if (message.expectsResponse()) paramsClass = MediaRouter_RegisterMediaRouteProvider_Params; break; case kMediaRouter_OnSinksReceived_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnSinksReceived_Params; break; case kMediaRouter_OnIssue_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnIssue_Params; break; case kMediaRouter_OnRoutesUpdated_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnRoutesUpdated_Params; break; case kMediaRouter_OnSinkAvailabilityUpdated_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnSinkAvailabilityUpdated_Params; break; case kMediaRouter_OnPresentationConnectionStateChanged_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnPresentationConnectionStateChanged_Params; break; case kMediaRouter_OnPresentationConnectionClosed_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnPresentationConnectionClosed_Params; break; case kMediaRouter_OnRouteMessagesReceived_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnRouteMessagesReceived_Params; break; case kMediaRouter_OnMediaRemoterCreated_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnMediaRemoterCreated_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMediaRouterResponse(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaRouter_RegisterMediaRouteProvider_Name: if (message.isResponse()) paramsClass = MediaRouter_RegisterMediaRouteProvider_ResponseParams; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } var MediaRouter = { name: 'media_router::mojom::MediaRouter', kVersion: 0, ptrClass: MediaRouterPtr, proxyClass: MediaRouterProxy, stubClass: MediaRouterStub, validateRequest: validateMediaRouterRequest, validateResponse: validateMediaRouterResponse, }; MediaRouter.SinkAvailability = {}; MediaRouter.SinkAvailability.UNAVAILABLE = 0; MediaRouter.SinkAvailability.PER_SOURCE = MediaRouter.SinkAvailability.UNAVAILABLE + 1; MediaRouter.SinkAvailability.AVAILABLE = MediaRouter.SinkAvailability.PER_SOURCE + 1; MediaRouter.SinkAvailability.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; MediaRouter.SinkAvailability.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaRouter.PresentationConnectionState = {}; MediaRouter.PresentationConnectionState.CONNECTING = 0; MediaRouter.PresentationConnectionState.CONNECTED = MediaRouter.PresentationConnectionState.CONNECTING + 1; MediaRouter.PresentationConnectionState.CLOSED = MediaRouter.PresentationConnectionState.CONNECTED + 1; MediaRouter.PresentationConnectionState.TERMINATED = MediaRouter.PresentationConnectionState.CLOSED + 1; MediaRouter.PresentationConnectionState.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: return true; } return false; }; MediaRouter.PresentationConnectionState.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaRouter.PresentationConnectionCloseReason = {}; MediaRouter.PresentationConnectionCloseReason.CONNECTION_ERROR = 0; MediaRouter.PresentationConnectionCloseReason.CLOSED = MediaRouter.PresentationConnectionCloseReason.CONNECTION_ERROR + 1; MediaRouter.PresentationConnectionCloseReason.WENT_AWAY = MediaRouter.PresentationConnectionCloseReason.CLOSED + 1; MediaRouter.PresentationConnectionCloseReason.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; MediaRouter.PresentationConnectionCloseReason.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaRouterStub.prototype.validator = validateMediaRouterRequest; MediaRouterProxy.prototype.validator = validateMediaRouterResponse; exports.SinkIconType = SinkIconType; exports.RouteControllerType = RouteControllerType; exports.RouteRequestResultCode = RouteRequestResultCode; exports.MediaSink = MediaSink; exports.DialMediaSink = DialMediaSink; exports.CastMediaSink = CastMediaSink; exports.MediaRoute = MediaRoute; exports.Issue = Issue; exports.RouteMessage = RouteMessage; exports.SinkSearchCriteria = SinkSearchCriteria; exports.MediaRouteProviderConfig = MediaRouteProviderConfig; exports.MediaSinkExtraData = MediaSinkExtraData; exports.MediaRouteProvider = MediaRouteProvider; exports.MediaRouteProviderPtr = MediaRouteProviderPtr; exports.MediaRouteProviderAssociatedPtr = MediaRouteProviderAssociatedPtr; exports.MediaRouter = MediaRouter; exports.MediaRouterPtr = MediaRouterPtr; exports.MediaRouterAssociatedPtr = MediaRouterAssociatedPtr; })();// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; if ((typeof mojo === 'undefined') || !mojo.bindingsLibraryInitialized) { loadScript('mojo_bindings'); } mojo.config.autoLoadMojomDeps = false; loadScript('chrome/common/media_router/mojo/media_controller.mojom'); loadScript('chrome/common/media_router/mojo/media_router.mojom'); loadScript('chrome/common/media_router/mojo/media_status.mojom'); loadScript('extensions/common/mojo/keep_alive.mojom'); loadScript('media/mojo/interfaces/mirror_service_remoting.mojom'); loadScript('media/mojo/interfaces/remoting_common.mojom'); loadScript('mojo/common/time.mojom'); loadScript('net/interfaces/ip_address.mojom'); loadScript('net/interfaces/ip_endpoint.mojom'); loadScript('url/mojo/origin.mojom'); loadScript('url/mojo/url.mojom'); // The following adapter classes preserve backward compatibility for the media // router component extension. // TODO(crbug.com/787128): Remove these adapters. function assignFields(object, fields) { for(var field in fields) { if (object.hasOwnProperty(field)) object[field] = fields[field]; } } /** * Adapter for mediaRouter.mojom.DialMediaSink. * @constructor */ function DialMediaSinkAdapter(fields) { this.ip_address = null; this.model_name = null; this.app_url = null; assignFields(this, fields); } DialMediaSinkAdapter.fromNewVersion = function(other) { return new DialMediaSinkAdapter({ 'ip_address': IPAddressAdapter.fromNewVersion(other.ipAddress), 'model_name': other.modelName, 'app_url': other.appUrl, }); }; DialMediaSinkAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.DialMediaSink({ 'ipAddress' : this.ip_address.toNewVersion(), 'modelName' : this.model_name, 'appUrl' : this.app_url, }); }; /** * Adapter for mediaRouter.mojom.CastMediaSink. * @constructor */ function CastMediaSinkAdapter(fields) { this.ip_endpoint = null; this.model_name = null; this.capabilities = 0; this.cast_channel_id = 0; assignFields(this, fields); } CastMediaSinkAdapter.fromNewVersion = function(other) { return new CastMediaSinkAdapter({ 'ip_endpoint': IPEndpointAdapter.fromNewVersion(other.ipEndpoint), 'model_name': other.modelName, 'capabilities': other.capabilities, 'cast_channel_id': other.castChannelId, }); }; CastMediaSinkAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.CastMediaSink({ 'ipEndpoint': this.ip_endpoint.toNewVersion(), 'modelName': this.model_name, 'capabilities': this.capabilities, 'castChannelId': this.cast_channel_id, }); }; /** * Adapter for mediaRouter.mojom.HangoutsMediaStatusExtraData. * @constructor */ function HangoutsMediaStatusExtraDataAdapter(fields) { this.local_present = false; assignFields(this, fields); } HangoutsMediaStatusExtraDataAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.HangoutsMediaStatusExtraData({ 'localPresent': this.local_present, }); }; /** * Adapter for net.interfaces.IPAddress. * @constructor */ function IPAddressAdapter(fields) { this.address_bytes = null; assignFields(this, fields); } IPAddressAdapter.fromNewVersion = function(other) { return new IPAddressAdapter({ 'address_bytes': other.addressBytes, }); }; IPAddressAdapter.prototype.toNewVersion = function() { return new net.interfaces.IPAddress({ 'addressBytes': this.address_bytes, }); }; /** * Adapter for net.interfaces.IPEndpoint. * @constructor */ function IPEndpointAdapter(fields) { this.address = null; this.port = 0; assignFields(this, fields); } IPEndpointAdapter.fromNewVersion = function(other) { return new IPEndpointAdapter({ 'address': IPAddressAdapter.fromNewVersion(other.address), 'port': other.port, }); }; IPEndpointAdapter.prototype.toNewVersion = function() { return new net.interfaces.IPEndpoint({ 'address': this.address.toNewVersion(), 'port': this.port, }); }; /** * Adapter for mediaRouter.mojom.MediaStatus. * @constructor */ function MediaStatusAdapter(fields) { this.title = null; this.description = null; this.can_play_pause = false; this.can_mute = false; this.can_set_volume = false; this.can_seek = false; this.is_muted = false; this.play_state = 0; this.volume = 0; this.duration = null; this.current_time = null; this.hangouts_extra_data = null; assignFields(this, fields); } MediaStatusAdapter.PlayState = mediaRouter.mojom.MediaStatus.PlayState; MediaStatusAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.MediaStatus({ 'title': this.title, 'description': this.description, 'canPlayPause': this.can_play_pause, 'canMute': this.can_mute, 'canSetVolume': this.can_set_volume, 'canSeek': this.can_seek, 'isMuted': this.is_muted, 'playState': this.play_state, 'volume': this.volume, 'duration': this.duration, 'currentTime': this.current_time, 'hangoutsExtraData': this.hangouts_extra_data && this.hangouts_extra_data.toNewVersion(), }); }; /** * Adapter for media.mojom.RemotingSinkMetadata. * @constructor */ function RemotingSinkMetadataAdapter(fields) { this.features = null; this.audio_capabilities = null; this.video_capabilities = null; this.friendly_name = null; assignFields(this, fields); } RemotingSinkMetadataAdapter.fromNewVersion = function(other) { return new RemotingSinkMetadataAdapter({ 'features': other.features, 'audio_capabilities': other.audioCapabilities, 'video_capabilities': other.videoCapabilities, 'friendly_name': other.friendlyName, }); }; RemotingSinkMetadataAdapter.prototype.toNewVersion = function() { return new media.mojom.RemotingSinkMetadata({ 'features': this.features, 'audioCapabilities': this.audio_capabilities, 'videoCapabilities': this.video_capabilities, 'friendlyName': this.friendly_name, }); }; /** * Adapter for mediaRouter.mojom.MediaSink. * @constructor */ function MediaSinkAdapter(fields) { this.sink_id = null; this.name = null; this.description = null; this.domain = null; this.icon_type = 0; this.extra_data = null; assignFields(this, fields); } MediaSinkAdapter.fromNewVersion = function(other) { return new MediaSinkAdapter({ 'sink_id': other.sinkId, 'name': other.name, 'description': other.description, 'domain': other.domain, 'icon_type': other.iconType, 'extra_data': other.extraData && MediaSinkExtraDataAdapter.fromNewVersion(other.extraData), }); }; MediaSinkAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.MediaSink({ 'sinkId': this.sink_id, 'name': this.name, 'description': this.description, 'domain': this.domain, 'iconType': this.icon_type, 'extraData': this.extra_data && this.extra_data.toNewVersion(), }); }; /** * Adapter for mediaRouter.mojom.MediaSinkExtraData. * @constructor */ function MediaSinkExtraDataAdapter(value) { this.$data = null; this.$tag = undefined; if (value == undefined) { return; } var keys = Object.keys(value); if (keys.length == 0) { return; } if (keys.length > 1) { throw new TypeError('You may set only one member on a union.'); } var fields = [ 'dial_media_sink', 'cast_media_sink', ]; if (fields.indexOf(keys[0]) < 0) { throw new ReferenceError(keys[0] + ' is not a MediaSinkExtraDataAdapter member.'); } this[keys[0]] = value[keys[0]]; } MediaSinkExtraDataAdapter.Tags = { dial_media_sink: 0, cast_media_sink: 1, }; Object.defineProperty(MediaSinkExtraDataAdapter.prototype, 'dial_media_sink', { get: function() { if (this.$tag != MediaSinkExtraDataAdapter.Tags.dial_media_sink) { throw new ReferenceError( 'MediaSinkExtraDataAdapter.dial_media_sink is not currently set.'); } return this.$data; }, set: function(value) { this.$tag = MediaSinkExtraDataAdapter.Tags.dial_media_sink; this.$data = value; } }); Object.defineProperty(MediaSinkExtraDataAdapter.prototype, 'cast_media_sink', { get: function() { if (this.$tag != MediaSinkExtraDataAdapter.Tags.cast_media_sink) { throw new ReferenceError( 'MediaSinkExtraDataAdapter.cast_media_sink is not currently set.'); } return this.$data; }, set: function(value) { this.$tag = MediaSinkExtraDataAdapter.Tags.cast_media_sink; this.$data = value; } }); MediaSinkExtraDataAdapter.fromNewVersion = function(other) { if (other.$tag == mediaRouter.mojom.MediaSinkExtraData.Tags.dialMediaSink) { return new MediaSinkExtraDataAdapter({ 'dial_media_sink': DialMediaSinkAdapter.fromNewVersion(other.dialMediaSink), }); } else { return new MediaSinkExtraDataAdapter({ 'cast_media_sink': CastMediaSinkAdapter.fromNewVersion(other.castMediaSink), }); } }; MediaSinkExtraDataAdapter.prototype.toNewVersion = function() { if (this.$tag == MediaSinkExtraDataAdapter.Tags.dial_media_sink) { return new mediaRouter.mojom.MediaSinkExtraData({ 'dialMediaSink': this.dial_media_sink.toNewVersion(), }); } else { return new mediaRouter.mojom.MediaSinkExtraData({ 'castMediaSink': this.cast_media_sink.toNewVersion(), }); } }; /** * Adapter for media.mojom.MirrorServiceRemoterPtr. * @constructor */ function MirrorServiceRemoterPtrAdapter(handleOrPtrInfo) { this.ptr = new mojo.InterfacePtrController(MirrorServiceRemoterAdapter, handleOrPtrInfo); } MirrorServiceRemoterPtrAdapter.prototype = Object.create(media.mojom.MirrorServiceRemoterPtr.prototype); MirrorServiceRemoterPtrAdapter.prototype.constructor = MirrorServiceRemoterPtrAdapter; MirrorServiceRemoterPtrAdapter.prototype.startDataStreams = function() { return MirrorServiceRemoterProxy.prototype.startDataStreams .apply(this.ptr.getProxy(), arguments).then(function(response) { return Promise.resolve({ 'audio_stream_id': response.audioStreamId, 'video_stream_id': response.videoStreamId, }); }); }; /** * Adapter for media.mojom.MirrorServiceRemoter.stubclass. * @constructor */ function MirrorServiceRemoterStubAdapter(delegate) { this.delegate_ = delegate; } MirrorServiceRemoterStubAdapter.prototype = Object.create( media.mojom.MirrorServiceRemoter.stubClass.prototype); MirrorServiceRemoterStubAdapter.prototype.constructor = MirrorServiceRemoterStubAdapter; MirrorServiceRemoterStubAdapter.prototype.startDataStreams = function(hasAudio, hasVideo) { return this.delegate_ && this.delegate_.startDataStreams && this.delegate_.startDataStreams(hasAudio, hasVideo).then( function(response) { return { 'audioStreamId': response.audio_stream_id, 'videoStreamId': response.video_stream_id, }; }); }; /** * Adapter for media.mojom.MirrorServiceRemoter. */ var MirrorServiceRemoterAdapter = { name: 'media::mojom::MirrorServiceRemoter', kVersion: 0, ptrClass: MirrorServiceRemoterPtrAdapter, proxyClass: media.mojom.MirrorServiceRemoter.proxyClass, stubClass: MirrorServiceRemoterStubAdapter, validateRequest: media.mojom.MirrorServiceRemoter.validateRequest, validateResponse: media.mojom.MirrorServiceRemoter.validateResponse, }; /** * Adapter for media.mojom.MirrorServiceRemotingSourcePtr. * @constructor */ function MirrorServiceRemotingSourcePtrAdapter(handleOrPtrInfo) { this.ptr = new mojo.InterfacePtrController(MirrorServiceRemotingSourceAdapter, handleOrPtrInfo); } MirrorServiceRemotingSourcePtrAdapter.prototype = Object.create(media.mojom.MirrorServiceRemotingSourcePtr.prototype); MirrorServiceRemotingSourcePtrAdapter.prototype.constructor = MirrorServiceRemotingSourcePtrAdapter; MirrorServiceRemotingSourcePtrAdapter.prototype.onSinkAvailable = function(metadata) { return this.ptr.getProxy().onSinkAvailable(metadata.toNewVersion()); }; /** * Adapter for media.mojom.MirrorServiceRemotingSource. */ var MirrorServiceRemotingSourceAdapter = { name: 'media::mojom::MirrorServiceRemotingSource', kVersion: 0, ptrClass: MirrorServiceRemotingSourcePtrAdapter, proxyClass: media.mojom.MirrorServiceRemotingSource.proxyClass, stubClass: null, validateRequest: media.mojom.MirrorServiceRemotingSource.validateRequest, validateResponse: null, }; /** * Adapter for mediaRouter.mojom.MediaStatusObserver. * @constructor */ function MediaStatusObserverPtrAdapter(handleOrPtrInfo) { this.ptr = new mojo.InterfacePtrController(MediaStatusObserverAdapter, handleOrPtrInfo); } MediaStatusObserverPtrAdapter.prototype = Object.create(mediaRouter.mojom.MediaStatusObserverPtr.prototype); MediaStatusObserverPtrAdapter.prototype.constructor = MediaStatusObserverPtrAdapter; MediaStatusObserverPtrAdapter.prototype.onMediaStatusUpdated = function(status) { return this.ptr.getProxy().onMediaStatusUpdated(status.toNewVersion()); }; /** * Adapter for mediaRouter.mojom.MediaStatusObserver. */ var MediaStatusObserverAdapter = { name: 'mediaRouter::mojom::MediaStatusObserver', kVersion: 0, ptrClass: MediaStatusObserverPtrAdapter, proxyClass: mediaRouter.mojom.MediaStatusObserver.proxyClass, stubClass: null, validateRequest: mediaRouter.mojom.MediaStatusObserver.validateRequest, validateResponse: null, }; /** * Converts a media sink to a MediaSink Mojo object. * @param {!MediaSink} sink A media sink. * @return {!mediaRouter.mojom.MediaSink} A Mojo MediaSink object. */ function sinkToMojo_(sink) { return new mediaRouter.mojom.MediaSink({ 'name': sink.friendlyName, 'description': sink.description, 'domain': sink.domain, 'sinkId': sink.id, 'iconType': sinkIconTypeToMojo(sink.iconType), 'providerId': mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, }); } /** * Converts a media sink's icon type to a MediaSink.IconType Mojo object. * @param {!MediaSink.IconType} type A media sink's icon type. * @return {!mediaRouter.mojom.MediaSink.IconType} A Mojo MediaSink.IconType * object. */ function sinkIconTypeToMojo(type) { switch (type) { case 'cast': return mediaRouter.mojom.SinkIconType.CAST; case 'cast_audio_group': return mediaRouter.mojom.SinkIconType.CAST_AUDIO_GROUP; case 'cast_audio': return mediaRouter.mojom.SinkIconType.CAST_AUDIO; case 'meeting': return mediaRouter.mojom.SinkIconType.MEETING; case 'hangout': return mediaRouter.mojom.SinkIconType.HANGOUT; case 'education': return mediaRouter.mojom.SinkIconType.EDUCATION; case 'generic': return mediaRouter.mojom.SinkIconType.GENERIC; default: console.error('Unknown sink icon type : ' + type); return mediaRouter.mojom.SinkIconType.GENERIC; } } /** * Returns a Mojo MediaRoute object given a MediaRoute and a * media sink name. * @param {!MediaRoute} route * @return {!mediaRouter.mojom.MediaRoute} */ function routeToMojo_(route) { return new mediaRouter.mojom.MediaRoute({ 'mediaRouteId': route.id, 'mediaSource': route.mediaSource, 'mediaSinkId': route.sinkId, 'description': route.description, 'iconUrl': route.iconUrl, 'isLocal': route.isLocal, 'forDisplay': route.forDisplay, 'isIncognito': route.offTheRecord, 'isLocalPresentation': route.isOffscreenPresentation, 'controllerType': route.controllerType, // Begin newly added properties, followed by the milestone they were // added. The guard should be safe to remove N+2 milestones later. 'presentationId': route.presentationId || '' // M64 }); } /** * Converts a route message to a RouteMessage Mojo object. * @param {!RouteMessage} message * @return {!mediaRouter.mojom.RouteMessage} A Mojo RouteMessage object. */ function messageToMojo_(message) { if ("string" == typeof message.message) { return new mediaRouter.mojom.RouteMessage({ 'type': mediaRouter.mojom.RouteMessage.Type.TEXT, 'message': message.message, }); } else { return new mediaRouter.mojom.RouteMessage({ 'type': mediaRouter.mojom.RouteMessage.Type.BINARY, 'data': message.message, }); } } /** * Converts presentation connection state to Mojo enum value. * @param {!string} state * @return {!mediaRouter.mojom.MediaRouter.PresentationConnectionState} */ function presentationConnectionStateToMojo_(state) { var PresentationConnectionState = mediaRouter.mojom.MediaRouter.PresentationConnectionState; switch (state) { case 'connecting': return PresentationConnectionState.CONNECTING; case 'connected': return PresentationConnectionState.CONNECTED; case 'closed': return PresentationConnectionState.CLOSED; case 'terminated': return PresentationConnectionState.TERMINATED; default: console.error('Unknown presentation connection state: ' + state); return PresentationConnectionState.TERMINATED; } } /** * Converts presentation connection close reason to Mojo enum value. * @param {!string} reason * @return {!mediaRouter.mojom.MediaRouter.PresentationConnectionCloseReason} */ function presentationConnectionCloseReasonToMojo_(reason) { var PresentationConnectionCloseReason = mediaRouter.mojom.MediaRouter.PresentationConnectionCloseReason; switch (reason) { case 'error': return PresentationConnectionCloseReason.CONNECTION_ERROR; case 'closed': return PresentationConnectionCloseReason.CLOSED; case 'went_away': return PresentationConnectionCloseReason.WENT_AWAY; default: console.error('Unknown presentation connection close reason : ' + reason); return PresentationConnectionCloseReason.CONNECTION_ERROR; } } /** * Converts string to Mojo origin. * @param {string|!url.mojom.Origin} origin * @return {!url.mojom.Origin} */ function stringToMojoOrigin_(origin) { if (origin instanceof url.mojom.Origin) { return origin; } var originUrl = new URL(origin); var mojoOrigin = {}; mojoOrigin.scheme = originUrl.protocol.replace(':', ''); mojoOrigin.host = originUrl.hostname; var port = originUrl.port ? Number.parseInt(originUrl.port) : 0; switch (mojoOrigin.scheme) { case 'http': mojoOrigin.port = port || 80; break; case 'https': mojoOrigin.port = port || 443; break; default: throw new Error('Scheme must be http or https'); } mojoOrigin.suborigin = ''; return new url.mojom.Origin(mojoOrigin); } /** * Parses the given route request Error object and converts it to the * corresponding result code. * @param {!Error} error * @return {!mediaRouter.mojom.RouteRequestResultCode} */ function getRouteRequestResultCode_(error) { return error.errorCode ? error.errorCode : mediaRouter.mojom.RouteRequestResultCode.UNKNOWN_ERROR; } /** * Creates and returns a successful route response from given route. * @param {!MediaRoute} route * @return {!Object} */ function toSuccessRouteResponse_(route) { return { route: routeToMojo_(route), resultCode: mediaRouter.mojom.RouteRequestResultCode.OK }; } /** * Creates and returns a error route response from given Error object. * @param {!Error} error * @return {!Object} */ function toErrorRouteResponse_(error) { return { errorText: error.message, resultCode: getRouteRequestResultCode_(error) }; } /** * Creates a new MediaRouter. * Converts a route struct to its Mojo form. * @param {!mediaRouter.mojom.MediaRouterPtr} service * @constructor */ function MediaRouter(service) { /** * The Mojo service proxy. Allows extension code to call methods that reside * in the browser. * @type {!mediaRouter.mojom.MediaRouterPtr} */ this.service_ = service; /** * The provider manager service delegate. Its methods are called by the * browser-resident Mojo service. * @type {!MediaRouter} */ this.mrpm_ = new MediaRouteProvider(this); /** * Handle to a KeepAlive service object, which prevents the extension from * being suspended as long as it remains in scope. * @type {boolean} */ this.keepAlive_ = null; /** * The bindings to bind the service delegate to the Mojo interface. * Object must remain in scope for the lifetime of the connection to * prevent the connection from closing automatically. * @type {!mojo.Binding} */ this.mediaRouteProviderBinding_ = new mojo.Binding( mediaRouter.mojom.MediaRouteProvider, this.mrpm_); } /** * Returns definitions of Mojo core and generated Mojom classes that can be * used directly by the component. * @return {!Object} * TODO(imcheng): We should export these along with MediaRouter. This requires * us to modify the component to handle multiple exports. When that logic is * baked in for a couple of milestones, we should be able to remove this * method. * TODO(imcheng): We should stop exporting mojo bindings classes that the * Media Router extension doesn't directly use, such as * mojo.AssociatedInterfacePtrInfo, mojo.InterfacePtrController and * mojo.interfaceControl. */ MediaRouter.prototype.getMojoExports = function() { return { AssociatedInterfacePtrInfo: mojo.AssociatedInterfacePtrInfo, Binding: mojo.Binding, DialMediaSink: DialMediaSinkAdapter, CastMediaSink: CastMediaSinkAdapter, HangoutsMediaRouteController: mediaRouter.mojom.HangoutsMediaRouteController, HangoutsMediaStatusExtraData: HangoutsMediaStatusExtraDataAdapter, IPAddress: IPAddressAdapter, IPEndpoint: IPEndpointAdapter, InterfacePtrController: mojo.InterfacePtrController, InterfacePtrInfo: mojo.InterfacePtrInfo, InterfaceRequest: mojo.InterfaceRequest, MediaController: mediaRouter.mojom.MediaController, MediaStatus: MediaStatusAdapter, MediaStatusObserverPtr: mediaRouter.mojom.MediaStatusObserverPtr, MirrorServiceRemoter: MirrorServiceRemoterAdapter, MirrorServiceRemoterPtr: MirrorServiceRemoterPtrAdapter, MirrorServiceRemotingSourcePtr: MirrorServiceRemotingSourcePtrAdapter, RemotingStopReason: media.mojom.RemotingStopReason, RemotingStartFailReason: media.mojom.RemotingStartFailReason, RemotingSinkFeature: media.mojom.RemotingSinkFeature, RemotingSinkAudioCapability: media.mojom.RemotingSinkAudioCapability, RemotingSinkVideoCapability: media.mojom.RemotingSinkVideoCapability, RemotingSinkMetadata: RemotingSinkMetadataAdapter, RouteControllerType: mediaRouter.mojom.RouteControllerType, Origin: url.mojom.Origin, Sink: MediaSinkAdapter, SinkExtraData: MediaSinkExtraDataAdapter, TimeDelta: mojo.common.mojom.TimeDelta, Url: url.mojom.Url, interfaceControl: mojo.interfaceControl, makeRequest: mojo.makeRequest, }; }; /** * Registers the Media Router Provider Manager with the Media Router. * @return {!Promise} Instance ID and config for the Media Router. */ MediaRouter.prototype.start = function() { return this.service_.registerMediaRouteProvider( mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, this.mediaRouteProviderBinding_.createInterfacePtrAndBind()).then( function(response) { return { 'instance_id': response.instanceId, 'config': { 'enable_dial_discovery': response.config.enableDialDiscovery, 'enable_cast_discovery': response.config.enableCastDiscovery, } }; }); } /** * Sets the service delegate methods. * @param {Object} handlers */ MediaRouter.prototype.setHandlers = function(handlers) { this.mrpm_.setHandlers(handlers); } /** * The keep alive status. * @return {boolean} */ MediaRouter.prototype.getKeepAlive = function() { return this.keepAlive_ != null; }; /** * Called by the provider manager when a sink list for a given source is * updated. * @param {!string} sourceUrn * @param {!Array} sinks * @param {!Array} origins */ MediaRouter.prototype.onSinksReceived = function(sourceUrn, sinks, origins) { // |origins| is a string array if the Media Router component extension version // is 59 or older. Without the stringToMojoOrigin_() conversion, clients using // those extension versions would see a crash shown in // https://crbug.com/787427. this.service_.onSinksReceived( mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, sourceUrn, sinks.map(sinkToMojo_), origins.map(stringToMojoOrigin_)); }; /** * Called by the provider manager when a sink is found to notify the MR of the * sink's ID. The actual sink will be returned through the normal sink list * update process, so this helps the MR identify the search result in the * list. * @param {string} pseudoSinkId ID of the pseudo sink that started the * search. * @param {string} sinkId ID of the newly-found sink. */ MediaRouter.prototype.onSearchSinkIdReceived = function( pseudoSinkId, sinkId) { this.service_.onSearchSinkIdReceived(pseudoSinkId, sinkId); }; /** * Called by the provider manager to keep the extension from suspending * if it enters a state where suspension is undesirable (e.g. there is an * active MediaRoute.) * If keepAlive is true, the extension is kept alive. * If keepAlive is false, the extension is allowed to suspend. * @param {boolean} keepAlive */ MediaRouter.prototype.setKeepAlive = function(keepAlive) { if (keepAlive === false && this.keepAlive_) { this.keepAlive_.ptr.reset(); this.keepAlive_ = null; } else if (keepAlive === true && !this.keepAlive_) { this.keepAlive_ = new extensions.KeepAlivePtr; Mojo.bindInterface(extensions.KeepAlive.name, mojo.makeRequest(this.keepAlive_).handle); } }; /** * Called by the provider manager to send an issue from a media route * provider to the Media Router, to show the user. * @param {!Object} issue The issue object. */ MediaRouter.prototype.onIssue = function(issue) { function issueSeverityToMojo_(severity) { switch (severity) { case 'fatal': return mediaRouter.mojom.Issue.Severity.FATAL; case 'warning': return mediaRouter.mojom.Issue.Severity.WARNING; case 'notification': return mediaRouter.mojom.Issue.Severity.NOTIFICATION; default: console.error('Unknown issue severity: ' + severity); return mediaRouter.mojom.Issue.Severity.NOTIFICATION; } } function issueActionToMojo_(action) { switch (action) { case 'dismiss': return mediaRouter.mojom.Issue.ActionType.DISMISS; case 'learn_more': return mediaRouter.mojom.Issue.ActionType.LEARN_MORE; default: console.error('Unknown issue action type : ' + action); return mediaRouter.mojom.Issue.ActionType.OK; } } var secondaryActions = (issue.secondaryActions || []).map(issueActionToMojo_); this.service_.onIssue(new mediaRouter.mojom.Issue({ 'routeId': issue.routeId || '', 'severity': issueSeverityToMojo_(issue.severity), 'title': issue.title, 'message': issue.message || '', 'defaultAction': issueActionToMojo_(issue.defaultAction), 'secondaryActions': secondaryActions, 'helpPageId': issue.helpPageId, 'isBlocking': issue.isBlocking })); }; /** * Called by the provider manager when the set of active routes * has been updated. * @param {!Array} routes The active set of media routes. * @param {string=} sourceUrn The sourceUrn associated with this route * query. * @param {Array=} joinableRouteIds The active set of joinable * media routes. */ MediaRouter.prototype.onRoutesUpdated = function( routes, sourceUrn = '', joinableRouteIds = []) { this.service_.onRoutesUpdated( mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, routes.map(routeToMojo_), sourceUrn, joinableRouteIds); }; /** * Called by the provider manager when sink availability has been updated. * @param {!mediaRouter.mojom.MediaRouter.SinkAvailability} availability * The new sink availability. */ MediaRouter.prototype.onSinkAvailabilityUpdated = function(availability) { this.service_.onSinkAvailabilityUpdated( mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, availability); }; /** * Called by the provider manager when the state of a presentation connected * to a route has changed. * @param {string} routeId * @param {string} state */ MediaRouter.prototype.onPresentationConnectionStateChanged = function(routeId, state) { this.service_.onPresentationConnectionStateChanged( routeId, presentationConnectionStateToMojo_(state)); }; /** * Called by the provider manager when the state of a presentation connected * to a route has closed. * @param {string} routeId * @param {string} reason * @param {string} message */ MediaRouter.prototype.onPresentationConnectionClosed = function(routeId, reason, message) { this.service_.onPresentationConnectionClosed( routeId, presentationConnectionCloseReasonToMojo_(reason), message); }; /** * @param {string} routeId * @param {!Array} mesages */ MediaRouter.prototype.onRouteMessagesReceived = function(routeId, messages) { this.service_.onRouteMessagesReceived( routeId, messages.map(messageToMojo_)); }; /** * @param {number} tabId * @param {!media.mojom.MirrorServiceRemoterPtr} remoter * @param {!mojo.InterfaceRequest} remotingSource */ MediaRouter.prototype.onMediaRemoterCreated = function(tabId, remoter, remotingSource) { this.service_.onMediaRemoterCreated( tabId, new media.mojom.MirrorServiceRemoterPtr(remoter.ptr.passInterface()), remotingSource); } /** * Object containing callbacks set by the provider manager. * * @constructor * @struct */ function MediaRouterHandlers() { /** * @type {function(!string, !string, !string, !string, !number)} */ this.createRoute = null; /** * @type {function(!string, !string, !string, !number)} */ this.joinRoute = null; /** * @type {function(string): Promise} */ this.terminateRoute = null; /** * @type {function(string)} */ this.startObservingMediaSinks = null; /** * @type {function(string)} */ this.stopObservingMediaSinks = null; /** * @type {function(string, string): Promise} */ this.sendRouteMessage = null; /** * @type {function(string, Uint8Array): Promise} */ this.sendRouteBinaryMessage = null; /** * @type {function(string)} */ this.startListeningForRouteMessages = null; /** * @type {function(string)} */ this.stopListeningForRouteMessages = null; /** * @type {function(string)} */ this.detachRoute = null; /** * @type {function()} */ this.startObservingMediaRoutes = null; /** * @type {function()} */ this.stopObservingMediaRoutes = null; /** * @type {function()} */ this.connectRouteByRouteId = null; /** * @type {function()} */ this.enableMdnsDiscovery = null; /** * @type {function()} */ this.updateMediaSinks = null; /** * @type {function(string, string, !SinkSearchCriteria): string} */ this.searchSinks = null; /** * @type {function()} */ this.provideSinks = null; /** * @type {function(string, !mojo.InterfaceRequest, * !mediaRouter.mojom.MediaStatusObserverPtr): !Promise} */ this.createMediaRouteController = null; }; /** * Routes calls from Media Router to the provider manager extension. * Registered with the MediaRouter stub. * @param {!MediaRouter} MediaRouter proxy to call into the * Media Router mojo interface. * @constructor */ function MediaRouteProvider(mediaRouter) { /** * Object containing JS callbacks into Provider Manager code. * @type {!MediaRouterHandlers} */ this.handlers_ = new MediaRouterHandlers(); /** * Proxy class to the browser's Media Router Mojo service. * @type {!MediaRouter} */ this.mediaRouter_ = mediaRouter; } /* * Sets the callback handler used to invoke methods in the provider manager. * * @param {!MediaRouterHandlers} handlers */ MediaRouteProvider.prototype.setHandlers = function(handlers) { this.handlers_ = handlers; var requiredHandlers = [ 'stopObservingMediaRoutes', 'startObservingMediaRoutes', 'sendRouteMessage', 'sendRouteBinaryMessage', 'startListeningForRouteMessages', 'stopListeningForRouteMessages', 'detachRoute', 'terminateRoute', 'joinRoute', 'createRoute', 'stopObservingMediaSinks', 'startObservingMediaRoutes', 'connectRouteByRouteId', 'enableMdnsDiscovery', 'updateMediaSinks', 'searchSinks', 'provideSinks', 'createMediaRouteController', 'onBeforeInvokeHandler' ]; requiredHandlers.forEach(function(nextHandler) { if (handlers[nextHandler] === undefined) { console.error(nextHandler + ' handler not registered.'); } }); } /** * Starts querying for sinks capable of displaying the media source * designated by |sourceUrn|. Results are returned by calling * OnSinksReceived. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.startObservingMediaSinks = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.startObservingMediaSinks(sourceUrn); }; /** * Stops querying for sinks capable of displaying |sourceUrn|. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.stopObservingMediaSinks = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.stopObservingMediaSinks(sourceUrn); }; /** * Requests that |sinkId| render the media referenced by |sourceUrn|. If the * request is from the Presentation API, then origin and tabId will * be populated. * @param {!string} sourceUrn Media source to render. * @param {!string} sinkId Media sink ID. * @param {!string} presentationId Presentation ID from the site * requesting presentation. TODO(mfoltz): Remove. * @param {!url.mojom.Origin} origin Origin of site requesting presentation. * @param {!number} tabId ID of tab requesting presentation. * @param {!mojo.common.mojom.TimeDelta} timeout If positive, the timeout * duration for the request. Otherwise, the default duration will be used. * @param {!boolean} incognito If true, the route is being requested by * an incognito profile. * @return {!Promise.} A Promise resolving to an object describing * the newly created media route, or rejecting with an error message on * failure. */ MediaRouteProvider.prototype.createRoute = function(sourceUrn, sinkId, presentationId, origin, tabId, timeout, incognito) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.createRoute( sourceUrn, sinkId, presentationId, origin, tabId, Math.floor(timeout.microseconds / 1000), incognito) .then(function(route) { return toSuccessRouteResponse_(route); }, function(err) { return toErrorRouteResponse_(err); }); }; /** * Handles a request via the Presentation API to join an existing route given * by |sourceUrn| and |presentationId|. |origin| and |tabId| are used for * validating same-origin/tab scope. * @param {!string} sourceUrn Media source to render. * @param {!string} presentationId Presentation ID to join. * @param {!url.mojom.Origin} origin Origin of site requesting join. * @param {!number} tabId ID of tab requesting join. * @param {!mojo.common.mojom.TimeDelta} timeout If positive, the timeout * duration for the request. Otherwise, the default duration will be used. * @param {!boolean} incognito If true, the route is being requested by * an incognito profile. * @return {!Promise.} A Promise resolving to an object describing * the newly created media route, or rejecting with an error message on * failure. */ MediaRouteProvider.prototype.joinRoute = function(sourceUrn, presentationId, origin, tabId, timeout, incognito) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.joinRoute( sourceUrn, presentationId, origin, tabId, Math.floor(timeout.microseconds / 1000), incognito) .then(function(route) { return toSuccessRouteResponse_(route); }, function(err) { return toErrorRouteResponse_(err); }); }; /** * Handles a request via the Presentation API to join an existing route given * by |sourceUrn| and |routeId|. |origin| and |tabId| are used for * validating same-origin/tab scope. * @param {!string} sourceUrn Media source to render. * @param {!string} routeId Route ID to join. * @param {!string} presentationId Presentation ID to join. * @param {!url.mojom.Origin} origin Origin of site requesting join. * @param {!number} tabId ID of tab requesting join. * @param {!mojo.common.mojom.TimeDelta} timeout If positive, the timeout * duration for the request. Otherwise, the default duration will be used. * @param {!boolean} incognito If true, the route is being requested by * an incognito profile. * @return {!Promise.} A Promise resolving to an object describing * the newly created media route, or rejecting with an error message on * failure. */ MediaRouteProvider.prototype.connectRouteByRouteId = function(sourceUrn, routeId, presentationId, origin, tabId, timeout, incognito) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.connectRouteByRouteId( sourceUrn, routeId, presentationId, origin, tabId, Math.floor(timeout.microseconds / 1000), incognito) .then(function(route) { return toSuccessRouteResponse_(route); }, function(err) { return toErrorRouteResponse_(err); }); }; /** * Terminates the route specified by |routeId|. * @param {!string} routeId * @return {!Promise} A Promise resolving to an object describing * the result of the terminate operation, or rejecting with an error * message and code if the operation failed. */ MediaRouteProvider.prototype.terminateRoute = function(routeId) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.terminateRoute(routeId).then( () => ({resultCode: mediaRouter.mojom.RouteRequestResultCode.OK}), (err) => toErrorRouteResponse_(err)); }; /** * Posts a message to the route designated by |routeId|. * @param {!string} routeId * @param {!string} message * @return {!Promise.} Resolved with true if the message was sent, * or false on failure. */ MediaRouteProvider.prototype.sendRouteMessage = function( routeId, message) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.sendRouteMessage(routeId, message) .then(function() { return {'sent': true}; }, function() { return {'sent': false}; }); }; /** * Sends a binary message to the route designated by |routeId|. * @param {!string} routeId * @param {!Array} data * @return {!Promise.} Resolved with true if the data was sent, * or false on failure. */ MediaRouteProvider.prototype.sendRouteBinaryMessage = function( routeId, data) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.sendRouteBinaryMessage(routeId, new Uint8Array(data)) .then(function() { return {'sent': true}; }, function() { return {'sent': false}; }); }; /** * Listen for messages from a route. * @param {!string} routeId */ MediaRouteProvider.prototype.startListeningForRouteMessages = function( routeId) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.startListeningForRouteMessages(routeId); }; /** * @param {!string} routeId */ MediaRouteProvider.prototype.stopListeningForRouteMessages = function( routeId) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.stopListeningForRouteMessages(routeId); }; /** * Indicates that the presentation connection that was connected to |routeId| * is no longer connected to it. * @param {!string} routeId */ MediaRouteProvider.prototype.detachRoute = function( routeId) { this.handlers_.detachRoute(routeId); }; /** * Requests that the provider manager start sending information about active * media routes to the Media Router. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.startObservingMediaRoutes = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.startObservingMediaRoutes(sourceUrn); }; /** * Requests that the provider manager stop sending information about active * media routes to the Media Router. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.stopObservingMediaRoutes = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.stopObservingMediaRoutes(sourceUrn); }; /** * Enables mDNS device discovery. */ MediaRouteProvider.prototype.enableMdnsDiscovery = function() { this.handlers_.onBeforeInvokeHandler(); this.handlers_.enableMdnsDiscovery(); }; /** * Requests that the provider manager update media sinks. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.updateMediaSinks = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.updateMediaSinks(sourceUrn); }; /** * Requests that the provider manager search its providers for a sink matching * |searchCriteria| that is compatible with |sourceUrn|. If a sink is found * that can be used immediately for route creation, its ID is returned. * Otherwise the empty string is returned. * * @param {string} sinkId Sink ID of the pseudo sink generating the request. * @param {string} sourceUrn Media source to be used with the sink. * @param {!SinkSearchCriteria} searchCriteria Search criteria for the route * providers. * @return {!Promise.} A Promise resolving to either the * sink ID of the sink found by the search that can be used for route * creation, or the empty string if no route can be immediately created. */ MediaRouteProvider.prototype.searchSinks = function( sinkId, sourceUrn, searchCriteria) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.searchSinks(sinkId, sourceUrn, searchCriteria).then( sinkId => { return { 'sinkId': sinkId }; }, () => { return { 'sinkId': '' }; }); }; /** * Notifies the provider manager that MediaRouter has discovered a list of * sinks. * @param {string} providerName * @param {!Array} sinks */ MediaRouteProvider.prototype.provideSinks = function(providerName, sinks) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.provideSinks(providerName, sinks.map(MediaSinkAdapter.fromNewVersion)); }; /** * Creates a controller for the given route and binds the given * InterfaceRequest to it, and registers an observer for media status updates * for the route. * @param {string} routeId * @param {!mojo.InterfaceRequest} controllerRequest * @param {!mediaRouter.mojom.MediaStatusObserverPtr} observer * @return {!Promise} Resolves to true if a controller * is created. Resolves to false if a controller cannot be created, or if * the controller is already bound. */ MediaRouteProvider.prototype.createMediaRouteController = function( routeId, controllerRequest, observer) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.createMediaRouteController( routeId, controllerRequest, new MediaStatusObserverPtrAdapter(observer.ptr.passInterface())).then( () => ({success: true}), e => ({success: false})); }; var ptr = new mediaRouter.mojom.MediaRouterPtr; Mojo.bindInterface(mediaRouter.mojom.MediaRouter.name, mojo.makeRequest(ptr).handle); exports.$set('returnValue', new MediaRouter(ptr)); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'chrome/common/media_router/mojo/media_status.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mediaRouter.mojom'); var time$ = mojo.internal.exposeNamespace('mojo.common.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'mojo/common/time.mojom', '../../../../mojo/common/time.mojom.js'); } function MediaStatus(values) { this.initDefaults_(); this.initFields_(values); } MediaStatus.PlayState = {}; MediaStatus.PlayState.PLAYING = 0; MediaStatus.PlayState.PAUSED = MediaStatus.PlayState.PLAYING + 1; MediaStatus.PlayState.BUFFERING = MediaStatus.PlayState.PAUSED + 1; MediaStatus.PlayState.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; MediaStatus.PlayState.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaStatus.prototype.initDefaults_ = function() { this.title = null; this.description = null; this.canPlayPause = false; this.canMute = false; this.canSetVolume = false; this.canSeek = false; this.isMuted = false; this.playState = 0; this.volume = 0; this.duration = null; this.currentTime = null; this.hangoutsExtraData = null; }; MediaStatus.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaStatus.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 64} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaStatus.title err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaStatus.description err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaStatus.playState err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 20, MediaStatus.PlayState); if (err !== validator.validationError.NONE) return err; // validate MediaStatus.duration err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 32, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; // validate MediaStatus.currentTime err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 40, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; // validate MediaStatus.hangoutsExtraData err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 48, HangoutsMediaStatusExtraData, true); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaStatus.encodedSize = codec.kStructHeaderSize + 56; MediaStatus.decode = function(decoder) { var packed; var val = new MediaStatus(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.title = decoder.decodeStruct(codec.String); val.description = decoder.decodeStruct(codec.String); packed = decoder.readUint8(); val.canPlayPause = (packed >> 0) & 1 ? true : false; val.canMute = (packed >> 1) & 1 ? true : false; val.canSetVolume = (packed >> 2) & 1 ? true : false; val.canSeek = (packed >> 3) & 1 ? true : false; val.isMuted = (packed >> 4) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.playState = decoder.decodeStruct(codec.Int32); val.volume = decoder.decodeStruct(codec.Float); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.duration = decoder.decodeStructPointer(time$.TimeDelta); val.currentTime = decoder.decodeStructPointer(time$.TimeDelta); val.hangoutsExtraData = decoder.decodeStructPointer(HangoutsMediaStatusExtraData); return val; }; MediaStatus.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaStatus.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.title); encoder.encodeStruct(codec.String, val.description); packed = 0; packed |= (val.canPlayPause & 1) << 0 packed |= (val.canMute & 1) << 1 packed |= (val.canSetVolume & 1) << 2 packed |= (val.canSeek & 1) << 3 packed |= (val.isMuted & 1) << 4 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.Int32, val.playState); encoder.encodeStruct(codec.Float, val.volume); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(time$.TimeDelta, val.duration); encoder.encodeStructPointer(time$.TimeDelta, val.currentTime); encoder.encodeStructPointer(HangoutsMediaStatusExtraData, val.hangoutsExtraData); }; function HangoutsMediaStatusExtraData(values) { this.initDefaults_(); this.initFields_(values); } HangoutsMediaStatusExtraData.prototype.initDefaults_ = function() { this.localPresent = false; }; HangoutsMediaStatusExtraData.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; HangoutsMediaStatusExtraData.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; HangoutsMediaStatusExtraData.encodedSize = codec.kStructHeaderSize + 8; HangoutsMediaStatusExtraData.decode = function(decoder) { var packed; var val = new HangoutsMediaStatusExtraData(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.localPresent = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; HangoutsMediaStatusExtraData.encode = function(encoder, val) { var packed; encoder.writeUint32(HangoutsMediaStatusExtraData.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.localPresent & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaStatusObserver_OnMediaStatusUpdated_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaStatusObserver_OnMediaStatusUpdated_Params.prototype.initDefaults_ = function() { this.status = null; }; MediaStatusObserver_OnMediaStatusUpdated_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaStatusObserver_OnMediaStatusUpdated_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaStatusObserver_OnMediaStatusUpdated_Params.status err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaStatus, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaStatusObserver_OnMediaStatusUpdated_Params.encodedSize = codec.kStructHeaderSize + 8; MediaStatusObserver_OnMediaStatusUpdated_Params.decode = function(decoder) { var packed; var val = new MediaStatusObserver_OnMediaStatusUpdated_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.status = decoder.decodeStructPointer(MediaStatus); return val; }; MediaStatusObserver_OnMediaStatusUpdated_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaStatusObserver_OnMediaStatusUpdated_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(MediaStatus, val.status); }; var kMediaStatusObserver_OnMediaStatusUpdated_Name = 160151083; function MediaStatusObserverPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MediaStatusObserver, handleOrPtrInfo); } function MediaStatusObserverAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MediaStatusObserver, associatedInterfacePtrInfo); } MediaStatusObserverAssociatedPtr.prototype = Object.create(MediaStatusObserverPtr.prototype); MediaStatusObserverAssociatedPtr.prototype.constructor = MediaStatusObserverAssociatedPtr; function MediaStatusObserverProxy(receiver) { this.receiver_ = receiver; } MediaStatusObserverPtr.prototype.onMediaStatusUpdated = function() { return MediaStatusObserverProxy.prototype.onMediaStatusUpdated .apply(this.ptr.getProxy(), arguments); }; MediaStatusObserverProxy.prototype.onMediaStatusUpdated = function(status) { var params = new MediaStatusObserver_OnMediaStatusUpdated_Params(); params.status = status; var builder = new codec.MessageV0Builder( kMediaStatusObserver_OnMediaStatusUpdated_Name, codec.align(MediaStatusObserver_OnMediaStatusUpdated_Params.encodedSize)); builder.encodeStruct(MediaStatusObserver_OnMediaStatusUpdated_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; function MediaStatusObserverStub(delegate) { this.delegate_ = delegate; } MediaStatusObserverStub.prototype.onMediaStatusUpdated = function(status) { return this.delegate_ && this.delegate_.onMediaStatusUpdated && this.delegate_.onMediaStatusUpdated(status); } MediaStatusObserverStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaStatusObserver_OnMediaStatusUpdated_Name: var params = reader.decodeStruct(MediaStatusObserver_OnMediaStatusUpdated_Params); this.onMediaStatusUpdated(params.status); return true; default: return false; } }; MediaStatusObserverStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateMediaStatusObserverRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaStatusObserver_OnMediaStatusUpdated_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaStatusObserver_OnMediaStatusUpdated_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMediaStatusObserverResponse(messageValidator) { return validator.validationError.NONE; } var MediaStatusObserver = { name: 'media_router::mojom::MediaStatusObserver', kVersion: 0, ptrClass: MediaStatusObserverPtr, proxyClass: MediaStatusObserverProxy, stubClass: MediaStatusObserverStub, validateRequest: validateMediaStatusObserverRequest, validateResponse: null, }; MediaStatusObserverStub.prototype.validator = validateMediaStatusObserverRequest; MediaStatusObserverProxy.prototype.validator = null; exports.MediaStatus = MediaStatus; exports.HangoutsMediaStatusExtraData = HangoutsMediaStatusExtraData; exports.MediaStatusObserver = MediaStatusObserver; exports.MediaStatusObserverPtr = MediaStatusObserverPtr; exports.MediaStatusObserverAssociatedPtr = MediaStatusObserverAssociatedPtr; })();// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'mojo/common/time.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mojo.common.mojom'); function Time(values) { this.initDefaults_(); this.initFields_(values); } Time.prototype.initDefaults_ = function() { this.internalValue = 0; }; Time.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; Time.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; Time.encodedSize = codec.kStructHeaderSize + 8; Time.decode = function(decoder) { var packed; var val = new Time(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.internalValue = decoder.decodeStruct(codec.Int64); return val; }; Time.encode = function(encoder, val) { var packed; encoder.writeUint32(Time.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int64, val.internalValue); }; function TimeDelta(values) { this.initDefaults_(); this.initFields_(values); } TimeDelta.prototype.initDefaults_ = function() { this.microseconds = 0; }; TimeDelta.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; TimeDelta.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; TimeDelta.encodedSize = codec.kStructHeaderSize + 8; TimeDelta.decode = function(decoder) { var packed; var val = new TimeDelta(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.microseconds = decoder.decodeStruct(codec.Int64); return val; }; TimeDelta.encode = function(encoder, val) { var packed; encoder.writeUint32(TimeDelta.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int64, val.microseconds); }; function TimeTicks(values) { this.initDefaults_(); this.initFields_(values); } TimeTicks.prototype.initDefaults_ = function() { this.internalValue = 0; }; TimeTicks.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; TimeTicks.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; TimeTicks.encodedSize = codec.kStructHeaderSize + 8; TimeTicks.decode = function(decoder) { var packed; var val = new TimeTicks(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.internalValue = decoder.decodeStruct(codec.Int64); return val; }; TimeTicks.encode = function(encoder, val) { var packed; encoder.writeUint32(TimeTicks.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int64, val.internalValue); }; exports.Time = Time; exports.TimeDelta = TimeDelta; exports.TimeTicks = TimeTicks; })();// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'net/interfaces/ip_address.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('net.interfaces'); function IPAddress(values) { this.initDefaults_(); this.initFields_(values); } IPAddress.prototype.initDefaults_ = function() { this.addressBytes = null; }; IPAddress.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; IPAddress.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate IPAddress.addressBytes err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; IPAddress.encodedSize = codec.kStructHeaderSize + 8; IPAddress.decode = function(decoder) { var packed; var val = new IPAddress(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.addressBytes = decoder.decodeArrayPointer(codec.Uint8); return val; }; IPAddress.encode = function(encoder, val) { var packed; encoder.writeUint32(IPAddress.encodedSize); encoder.writeUint32(0); encoder.encodeArrayPointer(codec.Uint8, val.addressBytes); }; exports.IPAddress = IPAddress; })();// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'net/interfaces/ip_endpoint.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('net.interfaces'); var ip_address$ = mojo.internal.exposeNamespace('net.interfaces'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'net/interfaces/ip_address.mojom', 'ip_address.mojom.js'); } function IPEndPoint(values) { this.initDefaults_(); this.initFields_(values); } IPEndPoint.prototype.initDefaults_ = function() { this.address = null; this.port = 0; }; IPEndPoint.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; IPEndPoint.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate IPEndPoint.address err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, ip_address$.IPAddress, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; IPEndPoint.encodedSize = codec.kStructHeaderSize + 16; IPEndPoint.decode = function(decoder) { var packed; var val = new IPEndPoint(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.address = decoder.decodeStructPointer(ip_address$.IPAddress); val.port = decoder.decodeStruct(codec.Uint16); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; IPEndPoint.encode = function(encoder, val) { var packed; encoder.writeUint32(IPEndPoint.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(ip_address$.IPAddress, val.address); encoder.encodeStruct(codec.Uint16, val.port); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; exports.IPEndPoint = IPEndPoint; })();// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'url/mojo/origin.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('url.mojom'); function Origin(values) { this.initDefaults_(); this.initFields_(values); } Origin.prototype.initDefaults_ = function() { this.scheme = null; this.host = null; this.port = 0; this.unique = false; this.suborigin = null; }; Origin.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; Origin.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate Origin.scheme err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate Origin.host err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate Origin.suborigin err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; Origin.encodedSize = codec.kStructHeaderSize + 32; Origin.decode = function(decoder) { var packed; var val = new Origin(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.scheme = decoder.decodeStruct(codec.String); val.host = decoder.decodeStruct(codec.String); val.port = decoder.decodeStruct(codec.Uint16); packed = decoder.readUint8(); val.unique = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.suborigin = decoder.decodeStruct(codec.String); return val; }; Origin.encode = function(encoder, val) { var packed; encoder.writeUint32(Origin.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.scheme); encoder.encodeStruct(codec.String, val.host); encoder.encodeStruct(codec.Uint16, val.port); packed = 0; packed |= (val.unique & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.String, val.suborigin); }; exports.Origin = Origin; })();// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'url/mojo/url.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('url.mojom'); function Url(values) { this.initDefaults_(); this.initFields_(values); } Url.prototype.initDefaults_ = function() { this.url = null; }; Url.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; Url.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate Url.url err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; Url.encodedSize = codec.kStructHeaderSize + 8; Url.decode = function(decoder) { var packed; var val = new Url(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.url = decoder.decodeStruct(codec.String); return val; }; Url.encode = function(encoder, val) { var packed; encoder.writeUint32(Url.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.url); }; exports.Url = Url; })();// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'media/mojo/interfaces/mirror_service_remoting.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('media.mojom'); var remoting_common$ = mojo.internal.exposeNamespace('media.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'media/mojo/interfaces/remoting_common.mojom', 'remoting_common.mojom.js'); } function MirrorServiceRemoter_Start_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_Start_Params.prototype.initDefaults_ = function() { }; MirrorServiceRemoter_Start_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_Start_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_Start_Params.encodedSize = codec.kStructHeaderSize + 0; MirrorServiceRemoter_Start_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_Start_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MirrorServiceRemoter_Start_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_Start_Params.encodedSize); encoder.writeUint32(0); }; function MirrorServiceRemoter_StartDataStreams_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_StartDataStreams_Params.prototype.initDefaults_ = function() { this.hasAudio = false; this.hasVideo = false; }; MirrorServiceRemoter_StartDataStreams_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_StartDataStreams_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_StartDataStreams_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_StartDataStreams_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_StartDataStreams_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.hasAudio = (packed >> 0) & 1 ? true : false; val.hasVideo = (packed >> 1) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MirrorServiceRemoter_StartDataStreams_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_StartDataStreams_Params.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.hasAudio & 1) << 0 packed |= (val.hasVideo & 1) << 1 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MirrorServiceRemoter_StartDataStreams_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_StartDataStreams_ResponseParams.prototype.initDefaults_ = function() { this.audioStreamId = 0; this.videoStreamId = 0; }; MirrorServiceRemoter_StartDataStreams_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_StartDataStreams_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_StartDataStreams_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_StartDataStreams_ResponseParams.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_StartDataStreams_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.audioStreamId = decoder.decodeStruct(codec.Int32); val.videoStreamId = decoder.decodeStruct(codec.Int32); return val; }; MirrorServiceRemoter_StartDataStreams_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_StartDataStreams_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.audioStreamId); encoder.encodeStruct(codec.Int32, val.videoStreamId); }; function MirrorServiceRemoter_Stop_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_Stop_Params.prototype.initDefaults_ = function() { this.reason = 0; }; MirrorServiceRemoter_Stop_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_Stop_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemoter_Stop_Params.reason err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, remoting_common$.RemotingStopReason); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_Stop_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_Stop_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_Stop_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.reason = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MirrorServiceRemoter_Stop_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_Stop_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.reason); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MirrorServiceRemoter_SendMessageToSink_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_SendMessageToSink_Params.prototype.initDefaults_ = function() { this.message = null; }; MirrorServiceRemoter_SendMessageToSink_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_SendMessageToSink_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemoter_SendMessageToSink_Params.message err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_SendMessageToSink_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_SendMessageToSink_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_SendMessageToSink_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.message = decoder.decodeArrayPointer(codec.Uint8); return val; }; MirrorServiceRemoter_SendMessageToSink_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_SendMessageToSink_Params.encodedSize); encoder.writeUint32(0); encoder.encodeArrayPointer(codec.Uint8, val.message); }; function MirrorServiceRemoter_EstimateTransmissionCapacity_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_EstimateTransmissionCapacity_Params.prototype.initDefaults_ = function() { }; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encodedSize = codec.kStructHeaderSize + 0; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_EstimateTransmissionCapacity_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encodedSize); encoder.writeUint32(0); }; function MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.prototype.initDefaults_ = function() { this.rate = 0; }; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.rate = decoder.decodeStruct(codec.Double); return val; }; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Double, val.rate); }; function MirrorServiceRemotingSource_OnSinkAvailable_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemotingSource_OnSinkAvailable_Params.prototype.initDefaults_ = function() { this.metadata = null; }; MirrorServiceRemotingSource_OnSinkAvailable_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemotingSource_OnSinkAvailable_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemotingSource_OnSinkAvailable_Params.metadata err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, remoting_common$.RemotingSinkMetadata, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemotingSource_OnSinkAvailable_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemotingSource_OnSinkAvailable_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemotingSource_OnSinkAvailable_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.metadata = decoder.decodeStructPointer(remoting_common$.RemotingSinkMetadata); return val; }; MirrorServiceRemotingSource_OnSinkAvailable_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemotingSource_OnSinkAvailable_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(remoting_common$.RemotingSinkMetadata, val.metadata); }; function MirrorServiceRemotingSource_OnMessageFromSink_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemotingSource_OnMessageFromSink_Params.prototype.initDefaults_ = function() { this.message = null; }; MirrorServiceRemotingSource_OnMessageFromSink_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemotingSource_OnMessageFromSink_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemotingSource_OnMessageFromSink_Params.message err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemotingSource_OnMessageFromSink_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemotingSource_OnMessageFromSink_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemotingSource_OnMessageFromSink_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.message = decoder.decodeArrayPointer(codec.Uint8); return val; }; MirrorServiceRemotingSource_OnMessageFromSink_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemotingSource_OnMessageFromSink_Params.encodedSize); encoder.writeUint32(0); encoder.encodeArrayPointer(codec.Uint8, val.message); }; function MirrorServiceRemotingSource_OnStopped_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemotingSource_OnStopped_Params.prototype.initDefaults_ = function() { this.reason = 0; }; MirrorServiceRemotingSource_OnStopped_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemotingSource_OnStopped_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemotingSource_OnStopped_Params.reason err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, remoting_common$.RemotingStopReason); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemotingSource_OnStopped_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemotingSource_OnStopped_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemotingSource_OnStopped_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.reason = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MirrorServiceRemotingSource_OnStopped_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemotingSource_OnStopped_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.reason); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MirrorServiceRemotingSource_OnError_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemotingSource_OnError_Params.prototype.initDefaults_ = function() { }; MirrorServiceRemotingSource_OnError_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemotingSource_OnError_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemotingSource_OnError_Params.encodedSize = codec.kStructHeaderSize + 0; MirrorServiceRemotingSource_OnError_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemotingSource_OnError_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MirrorServiceRemotingSource_OnError_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemotingSource_OnError_Params.encodedSize); encoder.writeUint32(0); }; var kMirrorServiceRemoter_Start_Name = 2076494608; var kMirrorServiceRemoter_StartDataStreams_Name = 216222009; var kMirrorServiceRemoter_Stop_Name = 1464532203; var kMirrorServiceRemoter_SendMessageToSink_Name = 194428780; var kMirrorServiceRemoter_EstimateTransmissionCapacity_Name = 1899412057; function MirrorServiceRemoterPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MirrorServiceRemoter, handleOrPtrInfo); } function MirrorServiceRemoterAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MirrorServiceRemoter, associatedInterfacePtrInfo); } MirrorServiceRemoterAssociatedPtr.prototype = Object.create(MirrorServiceRemoterPtr.prototype); MirrorServiceRemoterAssociatedPtr.prototype.constructor = MirrorServiceRemoterAssociatedPtr; function MirrorServiceRemoterProxy(receiver) { this.receiver_ = receiver; } MirrorServiceRemoterPtr.prototype.start = function() { return MirrorServiceRemoterProxy.prototype.start .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.start = function() { var params = new MirrorServiceRemoter_Start_Params(); var builder = new codec.MessageV0Builder( kMirrorServiceRemoter_Start_Name, codec.align(MirrorServiceRemoter_Start_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemoter_Start_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemoterPtr.prototype.startDataStreams = function() { return MirrorServiceRemoterProxy.prototype.startDataStreams .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.startDataStreams = function(hasAudio, hasVideo) { var params = new MirrorServiceRemoter_StartDataStreams_Params(); params.hasAudio = hasAudio; params.hasVideo = hasVideo; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMirrorServiceRemoter_StartDataStreams_Name, codec.align(MirrorServiceRemoter_StartDataStreams_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MirrorServiceRemoter_StartDataStreams_Params, params); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MirrorServiceRemoter_StartDataStreams_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MirrorServiceRemoterPtr.prototype.stop = function() { return MirrorServiceRemoterProxy.prototype.stop .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.stop = function(reason) { var params = new MirrorServiceRemoter_Stop_Params(); params.reason = reason; var builder = new codec.MessageV0Builder( kMirrorServiceRemoter_Stop_Name, codec.align(MirrorServiceRemoter_Stop_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemoter_Stop_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemoterPtr.prototype.sendMessageToSink = function() { return MirrorServiceRemoterProxy.prototype.sendMessageToSink .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.sendMessageToSink = function(message) { var params = new MirrorServiceRemoter_SendMessageToSink_Params(); params.message = message; var builder = new codec.MessageV0Builder( kMirrorServiceRemoter_SendMessageToSink_Name, codec.align(MirrorServiceRemoter_SendMessageToSink_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemoter_SendMessageToSink_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemoterPtr.prototype.estimateTransmissionCapacity = function() { return MirrorServiceRemoterProxy.prototype.estimateTransmissionCapacity .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.estimateTransmissionCapacity = function() { var params = new MirrorServiceRemoter_EstimateTransmissionCapacity_Params(); return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMirrorServiceRemoter_EstimateTransmissionCapacity_Name, codec.align(MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_Params, params); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; function MirrorServiceRemoterStub(delegate) { this.delegate_ = delegate; } MirrorServiceRemoterStub.prototype.start = function() { return this.delegate_ && this.delegate_.start && this.delegate_.start(); } MirrorServiceRemoterStub.prototype.startDataStreams = function(hasAudio, hasVideo) { return this.delegate_ && this.delegate_.startDataStreams && this.delegate_.startDataStreams(hasAudio, hasVideo); } MirrorServiceRemoterStub.prototype.stop = function(reason) { return this.delegate_ && this.delegate_.stop && this.delegate_.stop(reason); } MirrorServiceRemoterStub.prototype.sendMessageToSink = function(message) { return this.delegate_ && this.delegate_.sendMessageToSink && this.delegate_.sendMessageToSink(message); } MirrorServiceRemoterStub.prototype.estimateTransmissionCapacity = function() { return this.delegate_ && this.delegate_.estimateTransmissionCapacity && this.delegate_.estimateTransmissionCapacity(); } MirrorServiceRemoterStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMirrorServiceRemoter_Start_Name: var params = reader.decodeStruct(MirrorServiceRemoter_Start_Params); this.start(); return true; case kMirrorServiceRemoter_Stop_Name: var params = reader.decodeStruct(MirrorServiceRemoter_Stop_Params); this.stop(params.reason); return true; case kMirrorServiceRemoter_SendMessageToSink_Name: var params = reader.decodeStruct(MirrorServiceRemoter_SendMessageToSink_Params); this.sendMessageToSink(params.message); return true; default: return false; } }; MirrorServiceRemoterStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMirrorServiceRemoter_StartDataStreams_Name: var params = reader.decodeStruct(MirrorServiceRemoter_StartDataStreams_Params); this.startDataStreams(params.hasAudio, params.hasVideo).then(function(response) { var responseParams = new MirrorServiceRemoter_StartDataStreams_ResponseParams(); responseParams.audioStreamId = response.audioStreamId; responseParams.videoStreamId = response.videoStreamId; var builder = new codec.MessageV1Builder( kMirrorServiceRemoter_StartDataStreams_Name, codec.align(MirrorServiceRemoter_StartDataStreams_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MirrorServiceRemoter_StartDataStreams_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMirrorServiceRemoter_EstimateTransmissionCapacity_Name: var params = reader.decodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_Params); this.estimateTransmissionCapacity().then(function(response) { var responseParams = new MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams(); responseParams.rate = response.rate; var builder = new codec.MessageV1Builder( kMirrorServiceRemoter_EstimateTransmissionCapacity_Name, codec.align(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; default: return false; } }; function validateMirrorServiceRemoterRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMirrorServiceRemoter_Start_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemoter_Start_Params; break; case kMirrorServiceRemoter_StartDataStreams_Name: if (message.expectsResponse()) paramsClass = MirrorServiceRemoter_StartDataStreams_Params; break; case kMirrorServiceRemoter_Stop_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemoter_Stop_Params; break; case kMirrorServiceRemoter_SendMessageToSink_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemoter_SendMessageToSink_Params; break; case kMirrorServiceRemoter_EstimateTransmissionCapacity_Name: if (message.expectsResponse()) paramsClass = MirrorServiceRemoter_EstimateTransmissionCapacity_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMirrorServiceRemoterResponse(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMirrorServiceRemoter_StartDataStreams_Name: if (message.isResponse()) paramsClass = MirrorServiceRemoter_StartDataStreams_ResponseParams; break; case kMirrorServiceRemoter_EstimateTransmissionCapacity_Name: if (message.isResponse()) paramsClass = MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } var MirrorServiceRemoter = { name: 'media::mojom::MirrorServiceRemoter', kVersion: 0, ptrClass: MirrorServiceRemoterPtr, proxyClass: MirrorServiceRemoterProxy, stubClass: MirrorServiceRemoterStub, validateRequest: validateMirrorServiceRemoterRequest, validateResponse: validateMirrorServiceRemoterResponse, }; MirrorServiceRemoterStub.prototype.validator = validateMirrorServiceRemoterRequest; MirrorServiceRemoterProxy.prototype.validator = validateMirrorServiceRemoterResponse; var kMirrorServiceRemotingSource_OnSinkAvailable_Name = 1416126401; var kMirrorServiceRemotingSource_OnMessageFromSink_Name = 1251426154; var kMirrorServiceRemotingSource_OnStopped_Name = 1997335544; var kMirrorServiceRemotingSource_OnError_Name = 1191234650; function MirrorServiceRemotingSourcePtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MirrorServiceRemotingSource, handleOrPtrInfo); } function MirrorServiceRemotingSourceAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MirrorServiceRemotingSource, associatedInterfacePtrInfo); } MirrorServiceRemotingSourceAssociatedPtr.prototype = Object.create(MirrorServiceRemotingSourcePtr.prototype); MirrorServiceRemotingSourceAssociatedPtr.prototype.constructor = MirrorServiceRemotingSourceAssociatedPtr; function MirrorServiceRemotingSourceProxy(receiver) { this.receiver_ = receiver; } MirrorServiceRemotingSourcePtr.prototype.onSinkAvailable = function() { return MirrorServiceRemotingSourceProxy.prototype.onSinkAvailable .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemotingSourceProxy.prototype.onSinkAvailable = function(metadata) { var params = new MirrorServiceRemotingSource_OnSinkAvailable_Params(); params.metadata = metadata; var builder = new codec.MessageV0Builder( kMirrorServiceRemotingSource_OnSinkAvailable_Name, codec.align(MirrorServiceRemotingSource_OnSinkAvailable_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemotingSource_OnSinkAvailable_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemotingSourcePtr.prototype.onMessageFromSink = function() { return MirrorServiceRemotingSourceProxy.prototype.onMessageFromSink .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemotingSourceProxy.prototype.onMessageFromSink = function(message) { var params = new MirrorServiceRemotingSource_OnMessageFromSink_Params(); params.message = message; var builder = new codec.MessageV0Builder( kMirrorServiceRemotingSource_OnMessageFromSink_Name, codec.align(MirrorServiceRemotingSource_OnMessageFromSink_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemotingSource_OnMessageFromSink_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemotingSourcePtr.prototype.onStopped = function() { return MirrorServiceRemotingSourceProxy.prototype.onStopped .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemotingSourceProxy.prototype.onStopped = function(reason) { var params = new MirrorServiceRemotingSource_OnStopped_Params(); params.reason = reason; var builder = new codec.MessageV0Builder( kMirrorServiceRemotingSource_OnStopped_Name, codec.align(MirrorServiceRemotingSource_OnStopped_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemotingSource_OnStopped_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemotingSourcePtr.prototype.onError = function() { return MirrorServiceRemotingSourceProxy.prototype.onError .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemotingSourceProxy.prototype.onError = function() { var params = new MirrorServiceRemotingSource_OnError_Params(); var builder = new codec.MessageV0Builder( kMirrorServiceRemotingSource_OnError_Name, codec.align(MirrorServiceRemotingSource_OnError_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemotingSource_OnError_Params, params); var message = builder.finish(); this.receiver_.accept(message); }; function MirrorServiceRemotingSourceStub(delegate) { this.delegate_ = delegate; } MirrorServiceRemotingSourceStub.prototype.onSinkAvailable = function(metadata) { return this.delegate_ && this.delegate_.onSinkAvailable && this.delegate_.onSinkAvailable(metadata); } MirrorServiceRemotingSourceStub.prototype.onMessageFromSink = function(message) { return this.delegate_ && this.delegate_.onMessageFromSink && this.delegate_.onMessageFromSink(message); } MirrorServiceRemotingSourceStub.prototype.onStopped = function(reason) { return this.delegate_ && this.delegate_.onStopped && this.delegate_.onStopped(reason); } MirrorServiceRemotingSourceStub.prototype.onError = function() { return this.delegate_ && this.delegate_.onError && this.delegate_.onError(); } MirrorServiceRemotingSourceStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMirrorServiceRemotingSource_OnSinkAvailable_Name: var params = reader.decodeStruct(MirrorServiceRemotingSource_OnSinkAvailable_Params); this.onSinkAvailable(params.metadata); return true; case kMirrorServiceRemotingSource_OnMessageFromSink_Name: var params = reader.decodeStruct(MirrorServiceRemotingSource_OnMessageFromSink_Params); this.onMessageFromSink(params.message); return true; case kMirrorServiceRemotingSource_OnStopped_Name: var params = reader.decodeStruct(MirrorServiceRemotingSource_OnStopped_Params); this.onStopped(params.reason); return true; case kMirrorServiceRemotingSource_OnError_Name: var params = reader.decodeStruct(MirrorServiceRemotingSource_OnError_Params); this.onError(); return true; default: return false; } }; MirrorServiceRemotingSourceStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateMirrorServiceRemotingSourceRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMirrorServiceRemotingSource_OnSinkAvailable_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemotingSource_OnSinkAvailable_Params; break; case kMirrorServiceRemotingSource_OnMessageFromSink_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemotingSource_OnMessageFromSink_Params; break; case kMirrorServiceRemotingSource_OnStopped_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemotingSource_OnStopped_Params; break; case kMirrorServiceRemotingSource_OnError_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemotingSource_OnError_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMirrorServiceRemotingSourceResponse(messageValidator) { return validator.validationError.NONE; } var MirrorServiceRemotingSource = { name: 'media::mojom::MirrorServiceRemotingSource', kVersion: 0, ptrClass: MirrorServiceRemotingSourcePtr, proxyClass: MirrorServiceRemotingSourceProxy, stubClass: MirrorServiceRemotingSourceStub, validateRequest: validateMirrorServiceRemotingSourceRequest, validateResponse: null, }; MirrorServiceRemotingSourceStub.prototype.validator = validateMirrorServiceRemotingSourceRequest; MirrorServiceRemotingSourceProxy.prototype.validator = null; exports.MirrorServiceRemoter = MirrorServiceRemoter; exports.MirrorServiceRemoterPtr = MirrorServiceRemoterPtr; exports.MirrorServiceRemoterAssociatedPtr = MirrorServiceRemoterAssociatedPtr; exports.MirrorServiceRemotingSource = MirrorServiceRemotingSource; exports.MirrorServiceRemotingSourcePtr = MirrorServiceRemotingSourcePtr; exports.MirrorServiceRemotingSourceAssociatedPtr = MirrorServiceRemotingSourceAssociatedPtr; })();// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'media/mojo/interfaces/remoting_common.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('media.mojom'); var RemotingStopReason = {}; RemotingStopReason.ROUTE_TERMINATED = 0; RemotingStopReason.LOCAL_PLAYBACK = RemotingStopReason.ROUTE_TERMINATED + 1; RemotingStopReason.SOURCE_GONE = RemotingStopReason.LOCAL_PLAYBACK + 1; RemotingStopReason.MESSAGE_SEND_FAILED = RemotingStopReason.SOURCE_GONE + 1; RemotingStopReason.DATA_SEND_FAILED = RemotingStopReason.MESSAGE_SEND_FAILED + 1; RemotingStopReason.UNEXPECTED_FAILURE = RemotingStopReason.DATA_SEND_FAILED + 1; RemotingStopReason.SERVICE_GONE = RemotingStopReason.UNEXPECTED_FAILURE + 1; RemotingStopReason.USER_DISABLED = RemotingStopReason.SERVICE_GONE + 1; RemotingStopReason.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: return true; } return false; }; RemotingStopReason.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RemotingStartFailReason = {}; RemotingStartFailReason.CANNOT_START_MULTIPLE = 0; RemotingStartFailReason.ROUTE_TERMINATED = RemotingStartFailReason.CANNOT_START_MULTIPLE + 1; RemotingStartFailReason.SERVICE_NOT_CONNECTED = RemotingStartFailReason.ROUTE_TERMINATED + 1; RemotingStartFailReason.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; RemotingStartFailReason.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RemotingSinkFeature = {}; RemotingSinkFeature.RENDERING = 0; RemotingSinkFeature.CONTENT_DECRYPTION = RemotingSinkFeature.RENDERING + 1; RemotingSinkFeature.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: return true; } return false; }; RemotingSinkFeature.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RemotingSinkAudioCapability = {}; RemotingSinkAudioCapability.CODEC_BASELINE_SET = 0; RemotingSinkAudioCapability.CODEC_AAC = RemotingSinkAudioCapability.CODEC_BASELINE_SET + 1; RemotingSinkAudioCapability.CODEC_OPUS = RemotingSinkAudioCapability.CODEC_AAC + 1; RemotingSinkAudioCapability.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; RemotingSinkAudioCapability.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RemotingSinkVideoCapability = {}; RemotingSinkVideoCapability.SUPPORT_4K = 0; RemotingSinkVideoCapability.CODEC_BASELINE_SET = RemotingSinkVideoCapability.SUPPORT_4K + 1; RemotingSinkVideoCapability.CODEC_H264 = RemotingSinkVideoCapability.CODEC_BASELINE_SET + 1; RemotingSinkVideoCapability.CODEC_VP8 = RemotingSinkVideoCapability.CODEC_H264 + 1; RemotingSinkVideoCapability.CODEC_VP9 = RemotingSinkVideoCapability.CODEC_VP8 + 1; RemotingSinkVideoCapability.CODEC_HEVC = RemotingSinkVideoCapability.CODEC_VP9 + 1; RemotingSinkVideoCapability.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: return true; } return false; }; RemotingSinkVideoCapability.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; function RemotingSinkMetadata(values) { this.initDefaults_(); this.initFields_(values); } RemotingSinkMetadata.prototype.initDefaults_ = function() { this.features = null; this.audioCapabilities = null; this.videoCapabilities = null; this.friendlyName = null; }; RemotingSinkMetadata.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; RemotingSinkMetadata.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate RemotingSinkMetadata.features err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 4, new codec.Enum(RemotingSinkFeature), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate RemotingSinkMetadata.audioCapabilities err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 4, new codec.Enum(RemotingSinkAudioCapability), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate RemotingSinkMetadata.videoCapabilities err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 4, new codec.Enum(RemotingSinkVideoCapability), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate RemotingSinkMetadata.friendlyName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; RemotingSinkMetadata.encodedSize = codec.kStructHeaderSize + 32; RemotingSinkMetadata.decode = function(decoder) { var packed; var val = new RemotingSinkMetadata(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.features = decoder.decodeArrayPointer(new codec.Enum(RemotingSinkFeature)); val.audioCapabilities = decoder.decodeArrayPointer(new codec.Enum(RemotingSinkAudioCapability)); val.videoCapabilities = decoder.decodeArrayPointer(new codec.Enum(RemotingSinkVideoCapability)); val.friendlyName = decoder.decodeStruct(codec.String); return val; }; RemotingSinkMetadata.encode = function(encoder, val) { var packed; encoder.writeUint32(RemotingSinkMetadata.encodedSize); encoder.writeUint32(0); encoder.encodeArrayPointer(new codec.Enum(RemotingSinkFeature), val.features); encoder.encodeArrayPointer(new codec.Enum(RemotingSinkAudioCapability), val.audioCapabilities); encoder.encodeArrayPointer(new codec.Enum(RemotingSinkVideoCapability), val.videoCapabilities); encoder.encodeStruct(codec.String, val.friendlyName); }; exports.RemotingStopReason = RemotingStopReason; exports.RemotingStartFailReason = RemotingStartFailReason; exports.RemotingSinkFeature = RemotingSinkFeature; exports.RemotingSinkAudioCapability = RemotingSinkAudioCapability; exports.RemotingSinkVideoCapability = RemotingSinkVideoCapability; exports.RemotingSinkMetadata = RemotingSinkMetadata; })();PNG  IHDRTTaR PLTEtRNS@f`IDATx^1 0a%˒SdZD (ozm;Ǝ⮙zYE;CQ!bWàۚVU`]-j^қ&j5ʄ< j7)(rJe)IBK(AJnr.RC2$2GCRNUy 0׃C Z%h;o>8ܪ+VMIENDB`PNG  IHDR@(NsRGBIDAThZiL\UfcmXfaXʎe+XZcbT+MeӤ&&556F[kB/cSITSQ XE-o-0 0sYI y||3̓hZߖH$vnxI.l4;% f]`w.2ĀL&Ki@JFYfnGxa2`6,ѭXYƝz>w<T?*f;y]l719i88m27a9i88m27rA㍻#YLSzoonCPʤƈtWRkM!dn-Ct-xȱɨƉ4h}H8X T\2q=B&ArmC ])HA)bw^cG%»ȊT;[v46licgz] 5yxxwgX4>\= J|sfpVވ`o iT2ab o2]ՐOt'?wo]ho#x iuƎzŇUA3=,7G-(H f\^ę_{0fP*Lbr\6@cvbf#ʪ`#OfPAݝD"tJ! ڎ1桍!(/~s b;3=GQQQQQB gu=bBiTfɠyR$o@*F 9Y!y{JKOKAO)ǑMaVMr /E,^q^Ö.pU\6#`hbz6ӿ/lX uFx=ό",sVM0U fJZ`SD +KAtr4y033[oll KKKkQRR'O@P%g9yYV]|ރ˰\AȏjRja3cV=7k]6]QPZ%1ϡYv7k]^T(1^u7Ҧ"PNbSkW+ l b.dH :aR[lkܴAiTz4ҴQTW?c0?uy>oJoΤ!RR\=s5S`31f\Չ[Ss+[V}9XP4N xSXCo3MN*؏?%[֒ttT?WXȧ~'ޥ_.(P%mx6J@5i@F bθv Mg%%801xZSP%)D>6N&򩴊. }] e*QxFuΟ$,H)V&z%ϡ?a`hd(N+\q =>abnNfϙ:L[7ghyBl8y^*i>֯Ǿ1O)[> Gbk JKKգGAՊ D~kvNo)K7I=weee]ɛrptt$mƞݻ1 pvv+Wacg7n ldX쉳qqհVWU!''>ȑ#zI???X|R޽@D 'W*;}oLB2Y^A~?{III6}_η& !777 --׮^%!kefcw X\mV ## X6yeBog|}cP)U {{{aB/W t#(SD߀[no233T()L-;1* >>CѽGw\|#f q!ViiiХqaC,]L=Wc׾\uCmm-/9173 < dy,荴0'B#$9 y,p]2<g T*!2y#ֵC.׿,/:1!(۷m'SG?!?CbR"X_}55XfP,\E\X2!8Hh!+,Yw߁ ?vaIȤI¸O֬Sv*>DB|hu(ZY[SMǵ+ר/ooLD~pruFԩrpoM+FQZ34_mr:ӡgSM0G+(1VVVCt?a<ݽ+АP|@)JNq__{YÚxe,ĉtFڴQTWhT#)P>/,,\,R2233`Gi%MЭkFځ4FcϞSG[>:zK,ݻ?+.3Z S;n NxڝwLPԙ!kI)C$ʲy#7/OH /3q(.~,T{zr4R|0Ȱ2'UEEE("xŋQJU+U[7o[rr޹ Oo^д-n%OA +dlyE",8 WJJ 0i{v So6o܄=v3mZzƎץ׬Z-0d /?͞_~ r8xЯ4!W 3F1NI*|tL2~HLHiu?~8 8wDWwJѵϨ~q=7i捛K٬foYQ=J uTȚi2g f oW泆=sʕ ZUXW#qeJ^,f*0~*=zJtԮS;4kԘՎ/%XC1 (*dOi,}aZ䃸>xH:wAJYs^"Ъy 17x@ehM P0Lp\ }ӦS ɘZ0Q m`,E _~fHW._f+_ jר NDйCo )T:kA8F 1cXӚ_p*5˘JʳClٴjҋkx>HJQ#K4!YCEj3wl.s(1$5.m/;Q[? <(N,yI^Y1Axϧ)Jh~ o779^1TH(40ȋ  C'B#hԇZ)tC?;S{V+tZ-Sϯ[\8nZt4AF]KdB>\I!MkCYpFg.Dފ+췖!Cmɇ`.8c_"S3~?Heá I[Uags;+Xi)* ncORw}Ctx0u]76y{Ga<=> jy2OxeiIENDB`PNG  IHDR@(y hPLTEUUU~~~&&&888 AAA''' )))>>>GGGͅ~///㨨,,,555ZzvvvQQQ _sm1/".---^p 2uuu???r o rrr̵""" OOO'4ihhh QMƻ ~wjdSSSN¢1tRNSxIDATxPES{ٶU۶~_j nbv|a)H$,- XBY<"VMJdXRI$W8ZE$p}wC <{00tgGhNhK98~G#0~C& ^:qR.wxl$p<{Μ /_)\ro@ExUz @# lO/!#boX91 Tyɷ0/-4RV 4Cmlnm`W.^yp!*ؽgk)Ə3{(\mijPU UN,fGm=α FdYPRD}3mYIENDB`PNG  IHDR@(NgAMA asRGB cHRMz&u0`:pQ<IDATh1jagWI'XJB6Q<!)cb |~n`4믞vWSÈ ?7,(d~Otlf|as'"{ jT /y$  PP}t@H I@@-5Ƽc}s $.á#AS&g&w݃&~"IENDB`PNG  IHDR@(NIDATxt]k۶Im۶m۶۵&mH6ܗSod$=3 RD&- _CHJL37 DΞ ?ׯ_񯋜=g M.8< A|%rs2s'wtzUCQq|F\Fqf(8g:!dG&4j@:: ڴ6B(K!f0E)6 [A{Tq`QIN;gϢ,y{Qa>C:hzXK@NTы0@ vnRTKG\% 4i'N{rjrwhYqfQr@]KPпNHcsVz8BQ5$#P@ OT(s@`hۯF@t@'PrjXݘw 82 r{耶'.d#P"2"$H0!y[|TPN48Tp):F@2R,jN' `@(H!ȹr8Ѓ8`!TP;:S5( #p@l!BF@@['I Th4ԆYΰkΕ`3 Z@2@e1܃dKUVu | A#^`Y3^N{;`e'iGdt!b ߃qd~ Jtv=ރbhy'̬A]FNpZ D%J̲*`{Zu1P !H-B$A>6FB-PN-34 4aZgz sH5 .(Uy5/Bd$}HEDZ "?~QzF:H91|T~((ZIZlMan"-nO% ,RS*0-}-h}}T x7ɀU-Xo~ hc( s "Z8篸4'͟ 9[["k}L<*+NJ'qF'Yip!^3CN>hEhnÇ$PC -Ew\Zjv܁Fސ(?zN7ЂyNoLgBk %dw@2sR4vZ9w@By. $TCPm0MhB P! Xh:I R!HZ}0B> 3I s}F}qhlUPhGBA>`]UT}$ (;. _{ OnQ0= uGAix#mHƚ6\j1z1)j/ky欦7!mAػՀ ]BrMjrOôLL`%[0X@a9z\v]z=`g<;Ɋ7tX;ank;Z~]zJ} S;ߑq5I\7 J:GD5qU:?Na4a7! dY,OL.qVACTp MG]}ޚˋEx Zb|cp}H Κ&a'/unxʋNp#%c(s3E7fAEwDTyO}1X2(4j$A>.ila&ԖQM28qxDMk8e+Iј%(Q8?dLpJTM `5 + 6N<&hQXȚ4C0-4$ SR *m'C*}Q &Mt3pIdg( ȘO/y U >*Ī|d`/UPk7P} lf!$HNW "U_xtW*M=Kψ6v92/{8˲C0d͢3|FXO̼@G>6DXq.F ޝZA`IZw-Q@-Ɉ K|Vt? &=ä?Yg|H+ LtO9r&詈WL}UJheT6A+Az\`ar,ŃbgIFӾa,@P+-T?nL/G`5M>I$_;] M{2pO> |~&ۦ{WIENDB`PNG  IHDR@(NsRGBIDAThZoh[U$mMvI\SKdT?2aC2E!E E?-c]7u+t&6Y$}{[JH=s'I p!Bc2$[ 80X,v|<`F{N1a6Zy`Zp8`̤ËP(H$b'&Dv+I'\8Vnlmsdsܹ Ldkl]y;+@w?IZ`=C͊1RKԍȄbex1t={g˻ؾnl;i|rc}H$(ʷ!!٦Ł,0wY-\7^USByu_ |ie>測L\y\M&eՈ_'7x_&GQU=4|P|ǷXAx`a?r ^j$V;O?.^/y_6zZ `fnFJrrۃ!];#f5lD=-~s;4DTc" F݊qٵp-h/?AUЁg}1՗h'fW]7:VQ7zLE&A'5IH/[$"$jƧZMs`+^VaK|q2řϾq7V5A,Phs6.{$4%yuu7+z>6RX]^1tlu5~\NrJPLtIyH*zxJksZC`Q_ ]9+ l;^=̦geryɌ mVg[V`Lm0DӾdTU xrS\lY0M=%o>Q4 VaVʼI*ҕ"b,&. KsOUd>ځh_|v=.! X_s,%+1WV-5*`)\rdFi͉l 862HXI{ֿ$eWm)FH'=?NLx,IENDB`PNG  IHDR@(NsRGB UIDAThZ p,ɲlY2|s0PH 0Rh0E2MK!MHvMB!)rcll,[B-ݕL,vcOXgGSΛ1( XIf !(û.FqJO91"4Zh> ZſAt\ri0(.5x}fF#r=y)_]R/Z+Ȭ;~=~߈(7̂Fo%0x8Wɞ~,h#K`Z7tGKVc i。 o u PX1bC1 blw` %i"7 {j>qS˝D?6\Co s_)p#on|Z66-ޞ[V4l?]>#>mֻ:L<, k'OQ$`Sxެ $7L:!,??D {#Ipcr^DH# mrcxaf7):,V섽 AWy n\Sj,vƸ1/ /ǽ;x{8K%W/,.(0 A(/,K\WuC0g&HZ3 A$Hk?~k Ck=i3u-O6#[3 e@ D]hRG ~sB&dJ^wWB SCJ+í}R%OڣNg὚z v)oM|7g{2x S 9h>:ha/Ek pߑ+b L+janshP oV,qb+q.w ih?K') :y/鏷Ǩ_|0"潥Fһ00+2!Zy-R|?/ k -鯥LMp/@ `WPOz>a0wn~0pB3~`|zM!ѵlIj5-|:R=M#BŎPՆ;0PQwc+a`80 `U;@ZK[a?J~ߣ.oGutWdu2qyS:vfF''z ɾw;0؈ɁGޛICR^\\;&&c-j=4 Vu';2 d IENDB`PNG  IHDRL(#,sRGBIDAThZ}le6|"@YBdZ+n8!CMjBǂԀd?X7"AB"ȇ ^スu-+2ɓ{{} HN_םjqSt 2N$m5B4j!J%A$.Ilv[qKتF _聢0'dpP|jDQ\>G8z剙-izL>SŠV6ODc׸P].AQ hIrB9fɡf+H`-EYvrotz#S҈i\PfeX} AQZIge8k' @}zm,@l73Fi݋}ccْw&@uW v A aV_U4I-Ń~1%g N]6AY ûf/WL`8(j~pi#3HI^N3R3 _ |ޗ@ ! +ع> )^1LUf hL./i0;3k8򝽛7Vr>6(s@7h@TR ppL[swp) ͝jxOHůrR XL!ǀe@6 {M5 *  \ʶ_E5C ..V+AH(\΍ºq 0]7 36G"nfP/=G+0a@[p9CKh\gVĝb-4FOwo*Z:ABՙnNtu!q$MxRlɟeXDfc`ЛȘdjL|2^]81Ui?ÞEm;3{'[ MIDATx()4 OXh;;g:tCӄ %QP9%+a:섙b[q.ONT!ny7'Vdg!MkT٥71s"̙H-ʻ}t_E[뼻A#]y6d bWɺdKw{g<߭~LNfۆ!FwmԌ {g=d>feёN>urrqd!tF?ʥƾ1;og`Ỳ:~rgٳ4BEXcKG! %-c %!V<FBVeJ<Hzuyb@$m%"T4.,BexgH[ O]* 8b$,A4Aojj;)3tov}N4x`'W:EThq }:~ڻ5@o|:->Gg4MYF3sS>-XNUVD{tVr[ S$䆑 ɞ@@=:,-.zd. 9 T%-"1vZ^ۜOEL_ K}l2uTScR+VI~T[_2"׭U>*5Y)Մ}or -X /Ɛ3Rq|}2a՗% )K5u $}3ο2X%RM)@3k2{`3=[ǒ' z7/ˀj2 jE?a1R/`=kjVwyCj&QyX̤լB(,-B@u.aPEGlE"TeRW´lJA5+)h.SUBQFU)bU.I0*nj*tZo RWEe9 'Ub Car A.",Iۨh i0i FJ~oAf2!\F)y3V:R*()4$%KP,b#"_C03`Nݽn9^ǰe%SXs ͔r!" )Mb1a #Jgotm^/9WS) DǔTp6L@i ؿQJ9/n)l*O)O@Qԟl(tBn-Ѓ HÔC˺ " VQ'P GQؠ4= 3S gK< 3~NHQilO !Rxq7&_Fn>jyCJɑ(LPO|/ycSh<0THa3 wOoI!m27RFȡ Hcާp&)Tˆ4m p̣їaB& }Gӛ:LW4nЧʄR `hC%P8 #-) үպ1Y]lP>SN0+/ phaD^C1HQ>!ַ17QX6z@s~#j~1WC3 Yu^8rJX iUa1 WBDa-!omJR[q1B_U 8d~q?0Yq\#]3R/kҊጱ^׿fx䖺~Eu%P83TY>0_jKː k(o< RB5v@zǝg~as)iDUiSV% WV36ڬ~0=6tDB7l⻡G<na˚ jtJE9V˔ZɔAAwSx5D^kdohS^@Ň.*VfLIg'SE2*0=PN)~(n:H,#TDX.bT(lJQhӑMh"mPٝR(fSfyREei˨ðh7:@KIS-i2->~Z"J}a\JD/)~UUP5SZΡ'ʃMFr?SJ`77kuG`q-pJaHMI"y vJ )iw*߹/kEWJ5~T<^DD7%˵y3Pl6FX)ᒫhO׺bM^%ƯJY/pށ3o- QC)5!IFHfP.:JE7~s7yܢN{'TTo*R4҂ RfRu-\*Uc`+a(m {/R5nj`m[i^ģjȧWM{QZЊlZ6a5ޯh2,Z.D@ahE^Dw-V;!7"Jh OWh~ťz{ycBH(ښ,oJOvս&j 5v+$Q6-6oHG@=ow:;6g }alm8 +!FwDr?b3&o"#pG%>͈\Vgy0BOUbS ?^x"ѣ?n:ićqtHjB+2 [G@@\XC\81R8H3OyM%_@ bK3?C H^]&q^_ľ7y}q^_xĸwy}M{^KŲ7M{q^_WĀwľ7]޶WD0~dffA*"[k~9oh (ԵT>TFIENDB`PNG  IHDR szzsRGBVIDATX c`Ƭjjj@118߿+W$F1 fj-R  e|̛BCC`zA9!²Bbj#F0$$$&54 ;#gݺuAfQ-(qrP )QCfр8`7 `C˖-cadccwԦ<qJ9`iC`$WFCOd6iiU r``31,aКF `3i!-l3L툰0PR( 2 inݪ?*=D@%RP3IENDB`PNG  IHDR szzbKGD pHYs B(xIDATXݖ]Uvj%Ҹ6֏q`V\?߅ 6RD"_>,N"bQ>OV6q+.B$f_V|TM}JρS%PO'F}q$Xci J N?жK)U}GZC@l2 q ptm8kؕvv<7.g%dG,j[y1T* {9MMMe 0-TJYXXD\[[{S/ =g`1kZCƘ/ѕnY hF|+ mce}("7"-SʰV h"}<(0< t8zgqq-'TE5Gf9J {m+ Ɂ{j!V2Ƽ("AĖp]19Ațж"r1Ԗ˲c=>84֯b^Z]]V*Qez$Z |0ċl9T*~:bQRT[Ê1ƞOZfI ?F"D|>N)4d=M \>hybb\XО/iNIENDB`PNG  IHDR݈pPLTESSSi'tRNS@fRIDATx^ 0 Cpb Fhh PX  K9]r9Z*znK)RN`ZzIȔ(9ově.W4 vIENDB`PNG  IHDRV@AW_@IDATx{t}wÒ,ۖ.\^.vI)4 )1! BO9-90yjNJhBz*q]~+; XQ(Դu.)=+29>*=db?9Ҿ< BM;M3AHgLbsVu5rV XQ(Դ;&:6S~\~>…*7O?ϼW B4Xo`7+H!0X}aIC}[P+ חv2}QvobKw-}Hm} TR;֛fЭ#YSAG&0eO 5;x=se>B& `^jy/9acI\%/15 %}%?wIt~tƼ0M/9JK Mo&c ` ϼRQ4ݴK9`n!:>qIs^+#=XMRq:c$ O֧c@YHX{:cٵo1j!Av7[:\Q|-`鿩?UZV:\E t 2mF fVjk,F63OyS'3R:괊h$3LҨ|>16mFP)ƺYHZZ!bN]&q\׵>nEc` 2'ZֈԵ_ɾs"shk7oĺ baW $S=Olou o^}b)79u( oz; f!ckKwQzҵظ?sdۑ<;npUƙn9ӫ(:Ùz7NkM659(w#ݿ٩g$)&Xy3iM3g5xpik"KHdEYYz$k~{;"?nl]Z)G,~9[σ̸=z27mfC}bB6=RJLs+;m+pqM!_&W~zi-ET` k\1\uT5/;Ùʆ+"3>Q sf,G^9JqEuʅVX`[·_?/6hÓ{ )[$Y΁dSaE`Ks}CWT9vEGw}KnrgW̑*p5Lx&Th)Zz[T6@=yuJքۑM n1ĽG^wR8050= M޵me/Q8=*<1<{>@K+AQs8/ӼuLMZ}. ˝V\5"XTcc1VsoE]evYx|aCbQTUTmZK\}%fדw amM'ŎW}`Xh5NUc`8sUbum |}w^5(T7sa¤5ifyQxݎ `W#aE-ĊĎ>8m Tߵ ta*u;ۉh*b*FCC/k)!l>D+71am Ӕji'ܰϘ{g1oy7e[c\_ g7J ,I3XIouڰ_q0@[lؿom[B;N$XX =o908IZDyPu77:)`^KF㦲+h..}_@jW伕d({$(Q(>IkZ;t]=}[j;&O~6i& ,~LJb-j.[ʽMz~P`Q{M3Ȁl"*oR 6,gk#Tu@ V VN |"X |` kX(XrN:8 OC@7#TE G>4[x>&l\5?˶ 2\NLZu N BPv!(X<<8^ ><$6\N`^S>1+3>>TVt uVۈxGLtB.mmH2װ& Oَ O &Zoop8܃!Jg3GM[s\ZHˮ ꫶Pkk#Hdqaݨ O;Q"W꡸ICJ8u&>{.+ .7"N'd C|W" e" X% vKt/W0_a]V_܆( `;L|.RdE9N <#X⧱M Iw^޹\`]q@S)̂eC qdlR& :VKR}pI ag𭭭ϤTbo?Q;Fz  Jb< JDЯ(R2nQu_9Nz}%ϱyD%vm+?Rj+L@`<ݵk{,\@"8&r.Dѯq$)4p2 9*[`*IYS_ϘiVoKMhNdKX,vecI{<LNć@i6>(|Q2IoL}{Df7w-ĵPDLjCScG}0UUxYB LfmqtݕL&?p>whm2RorfggCT*/˲~`?]hc~~>V(WVVҊ3z ;;`uyޣh͌gl6D7~:~WW^L??zx? SO/]}w/^V}!@+\8`"L _'os˟F[VOGw)u&Y`j}MNu{ ܑÛNB"H?>< Z}_>vRqv?Ƙg!B܅K.h"}y4DpnY &'psg[_Z= Chps:~16fe.m$zgtS]FzE۴p5 fuN3~Oo #p3p:;qCμ^@3h yV>DOxk58 Y6lFiћH:{vvD7\B\I`3 obJ[:{! V>(vА@V=[v5ڇm._Aorb%ǿ-K@BA,X vfjnk5]=]A!Pggӆo&m R(g  _} &UNچơuhw(w?xvssxwuO~" 5SC} :`,Ɏ]O&9;ݣ;Yߕo{}`^⠸>5 B&]bLhZͷ @!^Ka^zF'qvk \6D e7yW'}Nw=e`\oہ{դ6ʏE-1ouh;|rf"'˓'?̈́2~ C!}}/ e 13Z1&YݢERCB\n(w `:߿{}}}-7b 62{ XR8&xX!?aaL6Xqи~)ԯI~U}=чjed-MFИ!)4w;?odn:- gPcgL@E0,!8\ƭ&L>CR!=`ML<aI}W@mXWAk@'4tյ&- \[n%kY*^Ě0V BF;YI'54{$9X|>oy=MQ;uE)>\U<8x]Bj06P[h_/}:!h%-NYkA]![Oz $nK*"h͠[ !l ~#! ɢ5e`lltk$3l>…䜄a}uӎ}}x݋>uV㤡YV}\fO  ,T?o; N&HSf=\}{ aB!_p7]%Y qE2 ژtZsA _'R[Y9IC>Wh[%[@&NF7Cg:¯B5Nn<:9ߵ/*4FqBšͰ}F}n(l65ɏGp w-dMI;d33Cw d)ghq\CPv91Y0s-W|S{G|[Zi;nhQ,N!Y{7' #ȵ`M?IHE] Pد(N+};?¶53HS[! dfPw$ ^ $Fr/shs1Ԟ,X*!S[Ì:Hl K%}+O&~& 6$Z$^琉o CdQȿ(k6!^[vq6s.H3Z% x8z͖-¨zW 2aWA[d<>Aߞ-PwHd3d9L88ZfgUkyKIgT_;`@ 1HC`2 ; (ມ%b$WY*v@>~eZbE^x5eZ,!߼>EA? }y.s?3YDl` Wgm_\B'^c@8v EAE6ċ+F"VJ.bX3DPg{ sǹ>@o?~ape9(?]ODPdYl ]$e0=RG]Xw2a hyXձE*pA.`M5WZog?qQ1YWE"ԾI*jC2j'eXw{)2(bD_"wm?*o'/_+To =)~Ui_@\ͧ?=-'>`0 DyW7S_eeY^L^D`$e{E]$>vB}#~ȃ9.g~xxصSc<'z- o=>Mc[½HI8<a-˒ e&uEz࿳ k"= j<=~5%\{0 ("*j?:ɀ'ID3"Lr1 $D8ᒽ?s:憅lz@# +0 6ɧ's|=,7A6:Nhk,v2C"-sω}'R=`BTL{Pc)R3)σ%`ꃝhתY,o&_w*}@Hf=p6x%`r$k y+7H,<TR7X"|2u>Ok{>p>!C>L_.# X"Y5K kf ]@OB.v}և} ~!2TթohM#@cp@Q".!# u|}hPŭ֔"A^L\v$SBYNz\\hP(`3 v{2Wm_mW'vn屸]Ayw|& )$SGuHwjbFާE `w~@na:cP]%냾b}l`ib,n<]wGkp]>x^ ݵkm6w`!#L,B48@ $`^ ~Mz|],`YV&t XJ-ϞV:KdiT)O̳an}65By Œ CfЛBvvDY1'ۏN$oi;,ՙߣox*J>M/9&f6ͬhC>/oifE$T#ZE1Y!,Ԭ OVM"k}bI#26q7/n?(S "(Z'C) @G7h"f*_jds/U ןa) ;]"}P3Boղ֕R# 4Za6tPCHI'QQC,¤ʃccHa#GW8Dz"d<.>_e*Q@{ /Ogk8Ww]mY1lCRHݦfB!`fOXعRSfٳH9c y$uw>4q۪1G'g?N/RV !8b҂ 2c܃ ߺk4cRR䛊W R+ OZ+c V,,+gz .{&z2!E._x*TzdT j,O 0?j2߬xAj<@λ+'ԑc&oN!;obsC$dY,ӗ|{x}t\x|?q.@ͣ~%nѽ柯??X\^TY(6MПJ1Vl۶uӠ6 .0-@ ϧ^М$86YJ5\q+B]|jyhY/%>e8? o/.garc:ƑE>DǪQqiT=%@T́'°xFMO"|n0]`wgT$`8MeA (Tƈ_xb8~R"@33cW;b)o\o+/DR Ow>.8ֲ\/ q2}/}NC\OQm`$T%k JTiFQƘUo_L~99y[)%~P4`@~m?}||T_K ߗ b(0}<.^^"qPUj;xhН&^mˠb 0^,zXlrрє@.dՔ yD+ʸ?,_O''?TJ*b Oe"U1R7''6@(c\qnO؄aTߣ8ڈw|_WD;Yƒ.O"$T*Nq,4B-*RR&ExOu8­+@wh,Xa=]Yyk4$aRpd%#G1X-EIpF8;;#~-wJ@p׃Ni rP,#oJHڪ %~&=~-5`߇Af)5{pS<JbKYՊ}5j|B%8ͭE8|@VZ[P&ArfxUEMC!8OvhH8 KЂntG֗CߋE80EN~(pXdk%_Ib 9Y5_-]5<?ՙ/(cXEp!}Y?&(M"~_B<{ aH{8xdOE TE dr(9rp}~q)iK59|u}yag|ΫKYJt@Ѳ$? |P'&ϠW?T Gǽ], >|0gYhF`q9g(` Ygqz~޾-lU9JPP(C*<c'i 2H:!<>ɦ[0fXv VGEiP5է1P#E(`0bZ&`: ™YfJVhXڈ+ˣbM\B.8Aɦ(*0ˋF*.>X AjWxiˬW0,, e**hhS\j5LJ`1 H7˼Li^z uj[YߍQ7y.xaaiFhxIB[[CeiΥ3kht}S -E`Bjб= sˑH.]?;d!OzC;F]%@_#}~~n%1/QaOyZ7Ga:$= P?g 7/>{_LJt3YGa;O8֩;d3:G9D0P%qzz}?mj t^.z&e{|j,Y- c1K.aF~hZAI/*n@8d0Ik,L=5 [F=:QS/!@=RA SQ0A9˽LT ߑLZlN#r@$Ԁ .eXx\A;_MPF;k!ܗd >['b"^]P>VY2\ڌ&RmN'׺.ZvH-iJi sia2ڂ5Azep ^^Tʿ:˂a%$̟_M'W"a kSSܨɢ/]scI¸TV\w[49Ǚgg'օ; <7" *=eZ*D u i}ZU-ؿdOI7%OϢg0pSXe5L v)vh?!tBz0WaÂd ~h1ޚc1b]b{[78Ń!@+#OΌ͇]_u}~Jݠ ]DsWyZS#8ւ"dL T~+Tދs@ IQ$+Q|ݗ?u5gP:[#,"hp7}ߥI ͂ td֟';AX}-ꇞ :YNSEM[1zAzu+(SD e=nZ]UڷҞG;4<#h4G[/c@>{l, bۿK!2vA1<x0ZHYlTq]L_uy)}l,:|:ԷA<@rT,7{նC=~tN-)hP(PJK 6#]h>i:YjV-rx`0Q@C@2 Ј \ڪڀ 1VAKz\wGq#G59#!:, ףC!Sei͝ackr=l%'-9z"xG8]bɧۏ7Mۣ4I3HjLѸEWZA0\5ۓ- VN-0$҈B9k=Z,nv7o4/z6ez޿݊ z0E_ m$4 / [/ 7'~B2 !R=@#:BgR,~w;״,{轨i.+\rFg>@_o* iiX#j{J'~k!>F#%=% jEV.`CG+$sa}W+YC`cƁ&*d'$#!L0ڥqIb׳bͥ\&ow λfA$Ϳo}(3̾4r/HUmN_z;f+ I|&1.}8ϐ 'C#{un- 4  emEoŒ~u=Y}ߛM&dRP,$@xi-+ڧ%C~$ߓ$ 5qgw֯*?Ԡq9ܔ륕yOyKQBw$`{M]DH3$Wm"B({{k"Lя:,dp$9*Pxp WUDW<{$FY^zD Lg= "\] ѫV @* I'G9B;H,VoWt2AH&H#'6<߫Z\I?>ryY^$%k F$b«E`#Cmxb|0$2 iS-2Gb. zMBX}9AD~ӇD`E'}y лCKOߟͦǃ꯵qb{oU$&^YRtX>!f`IkUBj0HH< }kfEuzv1{uj6!(B2Bi}>x[z:ܪ=8_56˾D$u?n/F_GXɀ #'9x~S@r桟$AlU(a˄IV'4:>922x3p]m<.?::>ft|z>^'T|a,m$ c gժtHz>!#WO_v+&BȢ4FU'է3ϟTۜEb$xyAףӱIR~5c>D|wa9Mt Eš~wH: 81VoJBh-&)"$ 5D#;tkg^vޞW٨~^[FTǏS0G G6W{Dž^S?:HI  z4jHFq6 w)*jNv|k$41 yo=Fٌ*:Ysn -cS>/_?ùr%I<@# T"!ϻODM'-}y#`%b|חOwTPO+B'` ? ,H" uNY:BMiAe9D&&؍izrYQBd$qeaޒMaI.w99ŧ#1HB@##GvIimaom(-ISڦ!M/=|KrIa( D aE'C8d " lq^NhxޖZ qk^_~.J v:65\ $X MYwmzAСI6T^rbV@a:x\?_=i9k[ދ7273U%`ktRAz/J / %ۀ>?n U!;B7T4K F!#Ay,B&[ 14{^nlj|6@߀B, MBwNή; p5>X|yD'$ AA/JYU\cQӣEH`|}Vh9+/?H|HP5D AWą11&nt3Z|!3a3>ϱ9;6\g\g_NTuW0|22jԾ¾NOE,"E1A#4F a}` !21XץcאƧm߉fApR%Բ8rt~7S/pO n@`FY9Kt!\H "a `%:M'n8iG$Eay 5_0=Ҭ>ɡj`UCqs,]&6!馹G[367Usӫhv` uxyz#A#`̘1/%D2R;FgS},ӭ|ɺk#ާ} coGͩ=@=7A+'?pcX 5ch^@0(c!:hh!` ۨm  3>~d;RksZ_k0Ԝ r@U{/?7 .FGIJ@d_ۆe]%F^6a4)7; ivn'߰[FpM[jL9{p\E& _z[[S$(v걬Qk@$u!6&L1K I{|"//ƄupF je5SF2% 5Լ Crl,r39~h}vCíu - w17x? %v!ݾX351cr,ԚGzޡf9֯\KYw_gO޽z{n MhIɐS05H #Ӟm)@N |q0hFh=E*J3Sӵ[s~ujw+ Cr /_sfFpo}>X)[A Il<r$=@H&#:0оkZiI!_}N;0 Z(r.n ͞|Kɫ{x$};> ҷp4O's.H ~\1M3zU X,s]2::&PM 6V 6Z2lxmH$Bj?`#Z e{Q^[[{y߅qF- F؊hf/n~ pZLs<v+?9=` lmXlGA{:Zi>O\ 8ԑN閎 6ዟ;?_AzuiirNNNrQxJ 0 K;R ݳ&@JlF&u]YXXxFW#,+u5XHpQ!])1\,..f ;==&߲d2 D333+7ࢠCScFhaH@wУ'86 4piӭp<(pWCvHh0,; 됚PE N?^h-q&*: Q#VMܑN /` ņpn->IaۧAփ\     @5ZaIENDB`PNG  IHDR>aIDATx^I[[k|!ui` !V2)BIV=/&̇}c`ZX:gmMv^m=KvZ}؞iBA'@&Yy^w>Y^?cUQ\kejpe✷vmB>+NuNTr׷N9J{FJ*ޝm Yx|bh/(mt*3qPV~Uۛu0F"ѻX(gaaƹ]flW#p\]^7W7.i]> E=r x"du07{\SU7W%,ΑSm#Ⱦ-}H@ =hic8ܬ×:gv-4Uuh`~a#Èc;us L]:|Uh[5/s<$/ ]~[Wdnm.k|uZiv!` FFn^l~]91:Ww5>ls_ Q* /zS=}fݚD}>zeE% 5yvdt>)PXb߫06@}h-9w q~߼dlsv o}IX^MQi$tē(zomE]cYH {GRȩOtHg}ǀE+ 힗. yP)%Kyݛ7rךmR م&ZXbY޳U`g u)ZG?>x'/7 to4z- CuDmfu3e3m t/W7<>͓(2pױH%JyO ʊMp;7k޶uL+ɇ3o>llF?5ԸROL' @YldKk,kB3ʝF/9mDՃ@DK=GjYk-~+EK}V[sl>,r:vJ۷_lmL~^m:jl?NL.Oapɟ󫨩 fn6ŀb_Xr_[WZ7+k:8G}1|㚼z盘\o{{'msuB4pmy,+;QJ0KHE>1T1HcnەoտO×oF~K:dS<րDP:&0b@[~W}c`c ^qﹶqB ۈ4Pƞ'$ZO/"$iX0>qe F ^ψXˆumf`bj9NvM~/'a%S`%1 %svV/(%@k/LB #+OL_~I4Q*ĽҦ5\S<2,s6M=wo}š3BFK(dHxXlU8'l-nV zD6.ÂT.C@ C6T,(uLK3 rWcr^2Q+0Rb_0:/h wOkFS"EShp̴H9u=.~xמ  Er F[hiy%tbBT!+hi"lIyda^Iv $CefRϙy%%2+ м)a`s B3_Rԙ];F|sd{3אdHP,gN')PWmns^5GElEM6k'bY{c䬷o5~n#sH8- dS|N D-k:'$ inb{۰/l8.㪆JʪHÉS䕉%:HzXD<$'=׊pU m ڷ3MVPܲ^ ?O-[br xjPIeR7I'c`\0۸5e6Į;mm'͘׹k 93ވYAFwMO A-rhXTQvsrJVPV`2*>]NbB5Mc(idq{na3U\hmseҡ<DF"(ƿa0%'O$`+_ U jZeY۸,SD|=a$-JA~IxU\y '] f=ؙT$~>a/5iJ "s҈O+3'xUФYxm(2(#IJg(jQVt\hHvWN6"jLKQ2ȴc'Fd#d ݳH ʀ)E|6a0FB"Èg/WMNF*z.:y>MU&D'7m9X <2S2EdE_._?{ݟa((:K77AqF=TVd*̗,h$U^Yx`%5px)~J.?ĺIZBawg'{`oWuoe&u+ @j5,Wx~]e,\F˨}c84h5~KvyI.}ϴ{2iL-r;5/.l.z;=-,D#KOvWB73fČ R_ X<\G_W+128n'gV#)'ͷ"oĔ0.0#g \L{Ҍ9OP/L)E3rVWVE'r6C/EBXEj;/Z6ǐ K]VbϔI|m0XILT0<$ $Y6r' 0,:L$9|UĈ$x 2&ʗZ=b%HQS8!*&A(*T`_rr LqhaJQ›b/nE=9@B^'"@%<jaTb܉Cĕ%vI1Ƀ 74d2C"ђTXI'ђ6Yp% U٦HTQlz^@*Vr ̖>V#Xl[bbu|Y{{'~x;U}zV OӾVcNFY&?- ze<^X(vq`++ߗ/=KᩪϏcJ ]nn&w wW7#;>CXb)<+Q6ҜhqݤMeRXHwRY օڥUkYnXbH8IG19LԤ0M<3pIgdSb9>ՄAL ~bܼƓK_ԓs$~{O:8[<)cd<IXbG2gEB-W[J&A֐r+|״%:Xe  &WHpr]4A@3{X^St 0dzrGJ6W De*W~}MbBP:?1%L]& Oe5TCGKďbq}es{]Sdžd1+ ]s4a\pvqoh؝|[mGw<'D_446Y!>@ _\\~4{ǞAdlj%7 >iaDˆ;2t! Hے0& zlgT* T9/ -W^ə!K~Q;ǂ ;)tMxm8`2wȸ˯sLy?,ۉ4j y~mjm$rv !+mp); \V/>(guh "ߺ )_&Hؑy xtCj@P㢽|mbIT'B.pr)(-0B)/Hlr2HRb+RM2 p!qc `FjnwC Y/}DxsRӾXzqit`(bI.]0rg: Ḙt&7{4B(k82yL5c j;"aK@תj/29YO S-E<. $eC'%.<9Xg u#3CcCLI5imX%c V-vIENDB`PNG  IHDR&&4!%UIDATxֱ 0 A-i9+(AFH #Bsf!_ k?#e̘1cƌ3v &]*ڪ  ޮSIENDB`PNG  IHDR``j PLTEjjjgggiiijjjfffjjjiiiiiikkk5! tRNS*WS sIDATxء58dTDp4$3W-'w;,yT LX2F@ @P/~L81'EOkIENDB`PNG  IHDR BIDATx^kQw2IZk- q'+uԊEq… MJpa)*iQ|mMҦ4LÝIp!ΜK"„fΞ Xxd3L*ΫǽH&T%"2L8aGMgZ%mu«CzS*D U- = %t%pؑHU ;ط;PXy"CD B+ICcnPP=fO BOOh^g wlVXR |$_ /ndnTj*5gLc+pï$r2g|* h sBXװ+ȲUT(_ J1ٺ*AB={?F 0;,'vKIB?Y~-RK2 4#uz(B]Uz,@&Ș)L#gEPޚ_w ZW0=|@\$>&Ж سS&{X?%xp2Ub!qBNX7&b-LAku Z,[bXaKB8+oKfm^GobI?U^cP/93󗠛"d6c99XpI-H<@TRƑ`9G3ya_)eb8~úh'|6s &%|M a\ =^i%ɐ TT V83IENDB`PNG  IHDRr ߔcsCl0`MIDATx^QgPw3Weo! /0|,"S~zW0a6ɾL^)3)r\B@Č_6Rz#Q8cnY{}D|zc}5 >t,5& QaLiөoHHQAT]#_T! )j2Ȱim5JW?JuO v۶BB(ETsX4Ě%D_@qoFIENDB`PNG  IHDRr ߔcsCl0`MIDATx^Ag\Q{7!RB(a(eha4UV颺(2dJB em>5^s2ͳsN@8@ b<#( )A/0u N 7Q }5_D F|N1%bgT0TP"9piJ& XPXHgHKEY`YPհX8kG22pғmiZzAbF+<0:{Aڱ"E=ʫ8A `'cFs;segiÁ-\5=٠bCL  e[` Pq {+ +c.hJIcGu K۾<~ :{}vg_viT? M|2N}i c9:wqΎnrqg;&wp @`Wbs"<^o2Ϋ^kk."Qm__^3d H8QE씝`*1w60nQ9\r$Bљ}DjZ}PDKJF^ޥ܈Bj -5ry(Ɲ]3}SeDsu{SG/]IENDB`PNG  IHDRJ~scsCl0`M^IDATx^ӽKBQEXQD&H[CK4ED2Dc9CP$DmHPaAz@S(3c&K;N ЇeLxEPd7R䨑$A )NƸ&'Kq9,!3L3#!2H\ VG+Pe@dxYB l I(]v5~%}&Bo`yiN Z h4 eXS,fy#J[%ud; ąIn&W< x@b *xS|BQ YV$dxǍ6 Ff?)ڀhds(>IENDB`PNG  IHDRJ~scsCl0`M_IDATx^ӻKQ7LZŭ!Ab-jPCcSej(- J.'8{ پ%BG782M1 AUxHJCNq25@/a$AAP l/ifp`B}@A80=6 4D8A*bQ: jEILErX9`1C)>J3OXLVC29n@I4xK~z&kW< x@b |s(3,C̲H)ۏ3߮ q)A̩;vIQ`?iOi#IENDB`PNG  IHDR``w8csCl0`MIDATxShHo3ƞֶm۶m۶=l}e1o kM)RJ)RJK2\\,!Uޗ>Ϧyϟو>A#8N7sRW}NS%F%u3Q*}Iog, 9$ց/Q4r(Y0WOu]z.uɸu+] 4@4@4@zf&h&h&hLf-GWn@yu-ô_ tp2w|/૽&@fw$c=.@ &9it>5.9]qvq0c9!#Ol.f AB6e ’ 9̤^_g&,۪,Mks(tpA3f;q $P;O(u& $b D1 )11 0BpH~Ŀ_&{+5/vEg\57|H~|{|нxnE>fUAz"6|+vu --;ejѬ,W?_]ا)f.3M:VܢYo,Bda0kHk:MZ 6ur;BFz;1$-xcfgRZŠ^|؎qlyqŅx0v ^-CN0x-V,uYeb>xuX ^\0}5J,^ V[K@Z10Y#eGPMQԙ:0?^o?|*d:hX;Α+|*Is؏/'&s4吞F7 j@CB6^[r6n ҋ*XiGҒծ؃%;:iZ*vNO`cʢ0ưWDؔT2Tp|iR9:P"L 6CȌ@ 0; px}ǜoj %q )-@j>nn>no gy R; ¼>aR{"sż=sXT=KC8 OdDKWʭײD.`Eʌ(юYO\31K-=NjTϥKj򂺎܅%39MŸkʱp&PfWmK~<o-6*>'P$q|=QR)ݎA=3L"6!M2hN}~?,U実@`m/+ŝΨ b.{#5ޛcͅLh"$^45ϤF~tA4¶ NwWϲzauṡ$s^IE;CGvEPN{ kG2?8)QyqwxZڔ;E\oНPYqmPN0|W"׊r\ 8ؑr"g4;g'XrS{L3p_ֵ5\v6֥T #2<8kLgAlj*Q}w8+t{QЩ2.!u n׷wר,bEO4${`.݁nOQ@/׋_d?ex˵mr8=Nl:"~L;,#fAB>ײ^cX0S@+H +NXzNR6YYO*lL9$)I0zjQ>/> ,o0b?u;rOgz"͒0 >E&g,,x7A찬H e^ibl"ݥ¿#7cc} RJYR -sFOMg"sT azơͧAAb?]ݹnmpw{)N⾗{`taxޙuSGz{KLvGzٞj2# H! R>D*jLJYR?|<`1Wi8 ^Sfykޤx1%!Z""cl(3/?-}fI/~b^(Y)\,(ݢE_ b]'`G%;:g]fjTEZtІѳUA;/-w1E>CR,"hEeyѴ-;Ë> z+p*YuuG2}\cnQo8 =Tu;X#> vAVF퓊?"p"e2WH:ʨ7!5|.ʠ,(2a +1wl~M-/XC3=-de?'p`9;°f2l@wey6T=Nw s.TY]X5A$/[. a6+[Ȫ ?``aەYO٦x8aU k<Ea ~‘~}| k-Cd Y0Z|b! 껅c /^(aA-փЀG9*ۀvxCmteCy!{88{ПBO<)nx~P9^ͺV]B21]輨"gHxyT_:߃€]: +"޻'cN~Zґ_Y^aOB Ҷ.\8s+V 9! zUO~-< j-UO`~db.C_׋ !ui=.o#;D7r@D[(t.|!'7܂@YE!?adp G0̪[aU/랂0OzpE/q|`şeЭt>|/D_/a<ͤt !/} uY?/_/h,XGQ8>WP剶@8տoSB/]J3^g1O2*#AkWo(~!dzR|:);%tC0ySVS 6&;qƠ ¬n^Wh4h7JqJTw -gks@4 %H`Q)2;g7`K)B,Y!MY@9H)FncѢegg{§˞h˨ېACcVM րY2l\c'xo b7=*̐!!xP\M {~# :Ih't_{7׾ܽS$`sleP{lb/d [aU"BsFű#zKIrUa-_@E+U7WcIqjGa!Rz(fr؍ZJ9쾹fs ˎYpF%wpFEL]VV^w$JɥdMb5;tsUJSf;䣈ŒR* 䶿؉4D~GXcq5ΟshɄ7}:NۍYMYӻK~Al= )oJҋUz og[=C^ܙcmSzEƋ7S S[a§1( /@^ۢ1 "N^cοfq}Ne7G?d>W{W>-d^{de`!"͜R˝ I%ys(wA Ct%et-+YXdK|79Vr7t$dDf%2  o' Ǯ&=!&GՕ:1}) nv7g@#7[t)tdGwƴ-=> cdݖ9y4ZCWRԶ5o+Q/zx+C5)6@<ݙ 5GYJV攈.%eh? 8;'*|oApM[=M!}Nd+ tU* i,ڐݧ}=F`H*}gnVLJ hאٮ{H&"`|{b) _UC ~c~W[ 33 w!\~vt8 Ǯ &.9V$aĖZ&.ȽȻљ|Ux',vA݁ˇssž?Gj4HNW`aaWG;R$7ni[/1r9g-뙻˭ypOf?b-hnG/6mOj%f&K<5@Cb?gayEe:80`@Q/Uh zO)Νx1ӡ9'a+vz]2r&e 1WkqJ"6L%rқI76mۘ@'=W7߰ U P#)lYE `zEZ&߄p<:hONWNZXetipGBۇEo (kȿ}&<}0_zb/N8Jѷd'qa>Z s7a^;8m* B. &zãxsBЪ ֵnR$&lώ\4g3<޻_|5 5ֺ d&Iܽ9zȐDFU2̼z|UVͻLb/fsdf7Ym0y ]ؓ/>8`ShaF< ܱO'nlLFuL9r -})zѣMCd}@=+@ݢ>m 61c/N0uϮjjJmx ,8R։V.qʕ'RiLY2'C³u5ʑ GQa->`};=O8xҡS$# AakLw]x;9%qM<ܶНosQ %^P\7Q!Ef$+)8&wJ@j%h19$Ce<{~ &K> 8QzrDϼT~]@Vh'7l 15#'c6\,4+.2,e2EZy4qtMqs͘Հs?ҴT=2' U# 2|w;NGada݋;WvSy`PO]:T8Gc勐WfDX-*a Tg hQ$n&{є[fB$I=jSLjqxaE oA,/*QW>di =|\qldzoXl)rE:&mk)_ܔTdu?SF!=oY#8Q&!S׫?a+{DJb8eT{*)=&&"ȻIqt5vl̉Ǹu㫳u·-WR'\xN= Mxp6wmvEq!ƵAbhzPƏzCn0}J;8K V;f'@Wې^? I@yu=pxXͪU jޕY|s{8IջJP4JG>`Ә]bpt!xVa8Vedʕ%nZ+ubEyhĘbMmZ*QOw4]VU`g0$JGzND;qK򒶺]|K^ ,_}yv]bfP뽐o'<^O=[QlHH؋M{җ0lHE`Ւ܁>@ P'Vf&",Qضa͋]He CdI%'Cvq+1A#v;^AS}&Qq~ȭ]ƕ59e8o5NR#@UzG]6v0㒭q<6-T;+i+4wl-.niI:Ls"8ikު$4i#8Jco*ϳ3:4 ֹCtz.EZ@G™TIVM)ThD] R`X˻ F2tkDy:`&>Qwˀϸa|3Y 8ږg. /GhuЂ=V2[¤I5P"ѡNrXA-N#0iYV{.-N KYї6˱[zT[Lp?h|\+lq 7./ LRۄ[&>3_-0v4 ðC6yJoBwd2KFR@Ҁcw4 mߕ #2m$;ᐕ@V㐪mPbM3S2Q&{t 킕=R]> fW bQ=ASJEpTVEGv3!^R︫ב-2=zNRo Bd^Ut V>4Xk%zӴ!I xe"8%܄Իjx~*K,݌L6m`s4h񁅚F35XdZ'pY-^/W-vry߻dy]rR$y܎Bo]#=HNylA䒧!$w* Ĭ.UdW}'U7J;ɀlt%˓a;ީFv9"iu?4Hdvr~1Zy,S䈐uD3ApsYYG(o|0R+5tmDoM &CITN.^I6$w a#MVe5ĕCB do)a7>vWw}|(Gm$IBc?dX}Hj|f5AU_~?cɧ9ctB{lxIjz,ч\"oV`wP]}M?|-?ASH2-G˰2<Kb\s04#g"z}m~yO.i{IrZ7??qMS O_^ame5c"W+!Et-쏬QuÚƟg6Qmf5Լ;i\?/ND=JʟHXC 1v꡼vWmu>͙7n[p%ZuW-Ljl⇂67tae"&Cn 65'LÖ-c)Sb{R(+E@\ό04U ȉ7Qho:dޯy{L=Ȫ?U}R#jWaN9L̓rtD}VAKq`,UI^)zsDVfn`J|v'!ć:uG9T&ASTjde; K<tfIxH Hj;j#vطKJv\.gg"n3qJc*'⃑0*o& WLb3G?1<#O~<pΪN>g&mr ~)_(oX'zc4t?ħ2nlv Eо[8{ە}{-}&5?~0oj̅mp^o5Ř9_>nhD-H݂_?8MI_ű/s?5Y7^jv"g/o]OĔlR gslų-9;a~9-dCy?'ovec𬭨!BȌ^4MѶ=*5/(MbS 6#6WhP'wY/;ƛxs%tZY Qlဣxɏ^숌pl̰3Љu #NX>WP8X~9CJ1/FfXm"XR1Ձ8u& nu`Μ[l=ifW ĩ6*d+KHdX@)[onӴx{k)gblC/GEtVkiCin_;& l_JwF%~!֑a+:2%߈u:Or_%r2Y^{pI\ ^=C dB{W&M6aUؕ^N⽃īM069Q^dwx:V(elX8gHk1 d2l6ݬTJG)̭b.+ԕˍmM[ ix#AD7ĵ 7ߠXNWGi4T+PKU)nQv:EwGew`)Z >ȥpM>9% Kj[H>;+;[t碫4d5J֥<ϖ3\*wcl@nVhӏyǨZoB`ϧu u (ugwXӟ~1,~x7h؆|gsIkO]DdwP1'5&F O9:Ol= ڕp0p2'i NDWD![|,МFNںަ~뱑o~:$wZ6&c~oR6~AiAvxaPFllbYM0SRꗂkaJ/%2%uylm,n~vȩI:`En"R#E`ni~&\#][c,ƕMdK0B@)2 D0daYw\aõ.kA6ox]c(1S7t˨h._w 4=O?67є.ͷl2:v {tvzYƺ-Av:g#б!F%Qt"7qDh̩_V,Aק]QaCg1uԜ*أl,pTE=a>#˵ej$i-otB KD!dH:=_kv-^gg{))"q֢ ;FEY'rI}&.2V)"fSVGZ|Qi6N N&_cYS 82ȴ@VQ#*"e70^z跹(gм~ۡzbPUPtam)a{} `߸ RYYz`iwñ]AxV-{,!}ޞ*eo0^"Z)4rgkANr$a ?H!a1+{MU[SNF(Dnk5 ط04n7]zfVU n+k6(<2\eJE,sg ȥqcàMA2,qjDhD!VAw2n`n``8͛Lmu|('|ݹnIkK ^L nmԁ *ܘciOSy;m`vdq*If%X{OgZ3qG,WܗigLZ{Z/=Hhc$wЉu-|\ I,FwiwsG 3K"=iCxEOGoY\4B><BWM:^2nS8FjA\/iDګ^`knEv~ݯHǒՍ=S\9 ;hvЊgTJt@8L\xF]텲o)ςŭ +?3Pŵ>K=ZVЄ N(YEԽFztPBk6;5(W ܲ<|Xʦל bl%֛QFtˊRvzZw.Msn遝ﳐ%cH7"M-&INև,hVP##.o,b퐚qwOWjO/>l^:J:L6bZ#٣&)OA]+ޑ~ȥaq_g<*);k!|lSlي@J7ؾ--JC}l/<5?Z=)cˊ7w!w1:wuMJیNI~"66LqGH'7H$Ce8`!ⶓ(`^"_\7rל[tD`UN~T|T޼s{!q|vGO ;mӂqAOnĎ^ɫé,Vts"f$ cVב ׸'>qnGd/OsX%sFM'x«vF8#i6ۆvP0r& Q49%RhSΦ0Go܎ܒ{M6 mv8͍ߖ7lOTsת.NwKܓ!:A\:X#Y XR+PBpzk:Bݜ35ʛxg*CۘF_/tA?Z;;yY!%^\k=fǾ(_o=p?]x͸hy(Ejrd) "ryH8{Z3%<]̌$J͘SkI߬s#RF'[gS(pPh\+D$1:[zL#*&+_[CгJ-#kj#F\Kf9.A8ƢtP:{F)NHܭn/==2wd]˓s+̗ps54PPҒZH3inx H2vBmNtJr&6Ԁm=p\ǐ8qkC"] '|妃BBv}S&:Z. ܫptyTT:XE ZJx~ϋ8ӿiDwwsJw}>qxb p8OH6'WА~)_S* z[N#iUr~[ytNǹ돲)?uM <>E1=ަ<*Bt!_zy|Y9YrUQXY.WG>#%wE(/GW?==Cy3/!? %zt㛑,4_9c3Qp"_WltΑt(O, _.y ئ]{O -=Xd=l^,{*^1(}ŸL 8FG ȿ*e-Ơ[De/ۄaZwQ2tQ J[Vs߅9u+n9>";>][n1D3xK՛I_#op'F쫧-ȿ?Ɖֻp[˗dU3\ǟc[~ gSDFߘ~Z&979}o=H-؟[©<>TI;}>2[>GpF,]nQk@]ɼY籴l<7oI lj?!$hiGe 2V;$Aʈ>Opn3O A<$7EOVvwrbE6pkO6MݎnXf͝'!D21VeU]Kֱ10."lo&;n;Q0 9>MWyV8R%̱cAxK&KeU%DG)-fV&yo+b2&&FbB7ll>mqn Axv;7#dpb䒉UH%^.wSm{}Ԝ}at.t~$egGymN&amH|؞/wYImM]18zIR`1܀l;2⇉ ꋭ~N`8Njw#9 ]FQ)_4?싀(;_S>U%m r{UzoNS gn,Ğ-.גȭ=ce;gǤLM&؜߀! JL| nW|G#^]*YKMI__/Ku{msG~(LV$ oy塠v(i%TP`3pV*ݷ9,՗L$kד %<R_dcʄ%LO|~,ߞE1aDS㴙ba\+t=˞vt[E(|˂G}ElW+F֫͝EYn|Yo㦠֕O}Q l|騔ujw"~VlL pjJTbepXf6Pƞ1+G;.IIj]duEw]RF#tQ$I}6}`&$l$6#VeeeVfVveWfGGbpV&7~q}.ޢEԒk&DBu"]dt R$!UpϹAEjRUjqփeޓB<ϛ"@65N$cûѽ;ŏQ4$W9TqjBNyja.{eƄ҉Xo,,r_"/ZgZ8ZFe!sTdF FSP^i6X 8:Q|xahg/ &:!Ap 7@]9J>=NBcj& ]Ugv4Wǫ.j?%Izܔ+~f`.w8%a&Bq_txTE `kH绂i>ǿ![Sf9%M,Nd=efuM;`]$c) M&eq=RR`8ǫÀᜃU;ZM$6 P˧\|ITUMR9<- )֢_✬;y$K-)T=!  Bf)C, Ί'X};8aZ%д&xLJv䕷\]]m!kFp6 ;i;?V^sT¨@4Wl0G*HBу:EFwtD˄m:1{J1 ;JL6#e"G1=ƘʬwΡK35+X_~S~s4)}cF(yM! +)Ǧ,Wԝ A"X:Zy*IecRNN0سFDdz嗮 `%ՓaXtqn,I'ۉp6]h c*hs8fߜswl`;|} ?fn=0|en7]S@`[k>p])p4'k!|8 :ǮpNIV\J WνwE-DZyD$ j(-#G 1ʝf]|O7Nȭk!4LF3QВq: :lLqe zIK}:d:Ƽ(K֡vgA9'认/ R}+ۮklJGj"`Wp]Ohy=nY_.aA~)95^1=}Ds[n?g@^RE =|1(#-9qCcFF"i ƜVdKٻ&n|(r7>ijp%9a Db{I*]Bn$$qdγ!'ęWk5*`lCLWPlR ~ڔξ?I .UD^8ৢ7pҹ*̝\xq@Q Eyว'IA^ #_??> ViʓoY!‹v_Q^T dr`>BFffYVN+'[O޼sn%Gxk9]:* i(VrYH.I=B {{-W@qۇUq7@B %Ձ'ikLSQ%w}"bmmux`\\VSG^sqg|8Ja8y(&(Zek*7(lHzZf̡㥳~QV@_|pf6ʧ& Ƨeh['ާS:HW:+lA#9 S(qͼ:NO}<$sP# ɊMP@7 A&C@/s[>c8g !e)#T4B)se-=}?WI8{f3+F4>BQҢ4y9oO:,ԕY2 A= a}縴,7ԿbH"hRŽN{ W P/=EL _@S#'%pA«~utBQ/+s}=ޯu'9 i.=*W5+TOVzHZoƠ$eNSfZ*4}R`/jFW ~֞>nRTa(s.ޚWgiɡBa'{BR@_ZgvB%DFjbBTmC}tE3D,0e?bf28q䡚kܓ;#sYUΔ&thF~ըPen62v -y[ /7nHΔo6]Ŕ~iۍ7Q+rs.#!Ooo?%oO;χ<+X L?uW_C`[_t>W?h!__$)J} -IZE?n__em?ܸ>׵&T ID`3Ccmի'L_Hb){|T +@|:T _S}RbN<}2qMJ! Fs*gWzNNSWCɖ`*vaNEx͞ifs) t?2z>s28,\ladޕAx{Zv5l= O\& "swm@ Kp0Om‰|ex #\攧S_'=d^״K=*d1O?Y ZuVA+Lx MސŽlS-ݳ}D*g7;17V_[B՛L Cs\YX=qJ- CܮmlOhx< un2C0z.^՛S9JSgᚃ*E*k l&<ͭs]0+ T8FgEGF9RIH~[pFx9@ /ΒK/Tǵ&ͭDO\R ~xPztX*Zy1 ptp;2*`1 ̳CB79i55^ wϖgXsZWݭMBǠT(၂' yR%6FW#]gAmP\`_NɆnMS{ٽy͂2o楊-i*W{O՞.EXީ^ Fbvt^/?oqFoI{Ǘ2o͵D9񵞕u13$fX94);` !l>}֞7l=Fk8}Ӆ9h3 6 2Nyz˙^ Ϳr=Sȳi:=<Ӕ6 MԦBr/2rđmK]>r$f ӧN cm /$D,G%xt NО!nz#/nCp`)-\@4j3|)^Lvb:m=Mov)`"?ADh.{"J rLt!8%>Dk}ۮw2-ˠ':{ӮGZnT'ډs(jrHs8]X2}AKR ~m/_t=hA>t |G_{ n'OU+3h sA4^ s\xoS^<5KԱ*gkg.,&d.-/8_ԁr{9tyfjZ0XT^#H1~sϫ͋&Ֆ ϺrބT>s}j?>S(a>^d/iyC?B;ה΃h%⅖sN:8y؟kKp"gϱ@Ԭo9 Vav4tƼǡ%'gn^evrag-ɃneWQUPݞ ͼgSe19GNUN:}ƀJ3àG:-¢R<HETNcަu4jyi&"pശXx@@|H{hBKC19b!Z#5+b[!.I!_xhnǞ:D\k<)㨣cRK Ҟ 1bE X״t۠vOaB'e(ۍDk-@AbXcD/"PBIWyRӫ(c@ 19!X83(A`?+`:n-$9H w#Px6L3ѹ^hgEϋ2űlcA]y6Si7zwY-VbcL s&ҩ!y-| 6D<K724֓̄L#%`41D0o4C. bKs-}zlB=`[VHSP v oc;}th r%χفm>p>13XF1r!vEíS)Ӭ-#"' ~0o/kw@&=2R.| #YyCE}S h|q㾒XbQL{ niI3.s4O 0F5^o`| EW&w3iR̞@l,53/82e4DZtr,ی6bz춎9)Cpշs2_Q kXjoSsFr ;O#"R:G>4}ify-;s!Mx|UFM N~FgG#6q(7̗jQnԶI:\aAKZ JVileh8J6Ssbeȼf![nؼzWgtX*Xi)8N!0 mdOBa*Fu$Q',ZGZiE3C=8yTy4q$D8Y@ZkxbYQMh^/ Oxo0qh҈c Ň"Bg>|ZP9d[=ա$;^QxP.pB)?k%nCBD$BžS˥3uc(^PYtkY|!:H\>Wعnp3W}bYUTt>v7θ2=,08y]A>b=a`),жrd\!y43xj$I9d++_1"h5M8C:*$I[C:2۸.D4{pWL\CUfCqM Ӂkm2é_ CbX2bKpmMZ=oWɖl!YtfUL,4zÁd3<(,>P4fXb#=X V?T*8\j>խԎs%hs-TOGĩc%fg87@B}T5`/$c-iFIߵci7\zSiٟ?ڰ狑 ~{,^)~aY _159~OsGG-[;ٷblOc{X.GW~݇V;#D^ojo~̟Ϧ?DC ~19ȿؼӣ钃>tV4ݿuCzƷ}旽i߾c33,ߎ˵?PM귣MDx3~ /C|~ƴٜ-|G> w$?Gɇw/r#޻I/w~3jMY/ >Z^n!eN8PC*\ۿBcxB~ O7~Tx>%|?R`}_#^s=7lM]0|YH{ ٌuWQe[?8"! ]ľ#V)ȈȬnk7s_'tQUo/)MM*&m¢?M@NnI^yL&&?i¨E[9)\o2EUNĞPsW7CMXıѻmN|L&KfW;+ɯ{hij,w}fnT||{$j2ύ;țHEmۄǶC)w다&*#R:F'MuR=|w&\i'c'|;1_X4_uu]y}7:bEy\on" ˛ܽ>(걽W=WGʱsGJoɭwnܽRڮ]fWA?󵇷ǢrnL_"7Ipg_!{$WԎͼSy{ \yvt1]]ٹ3hȷN_{Tzla6B-?q2ܸv~̕.~Z'a|ۦ+rcdy~W><&UfL_'xo&nyk/\Ϸ۴Ө*m' z2;>_ͨwAeHݡ$zoIMq? _iJ2MgdA//@6c;8)XFQU_/ 1nMF8jFmzb1?ZZvr::J_'}+]Lꑡ鵞:,q7Sthux[ÿZR A +@!ϪsQy~9?0p$|ʵ̄e?``xzˬ߮5k=8v=5mNy{Fuuڿ*m4Ezص*[s>O x^q%š[) *oY._=4>ڃx I/ȃjy;­|rt[?v;*o7V\?2~kom)U 0 3d`Ez#rM؛)mu l>Nxyf0(k}M9Ng))`uf~g֦ru6Vix82`FF름k_rh_>@_:j[vM-Flը OgsoUVw= >tY˔ pW7t?:%J`$Pz} 12NEss:/އq!aC%|29"RX jcSGZA-hro~1n0Cym[P,ƒ|# 4*2us۰ż:YCu"vqh#롟db#`pe89w6g-*32jC/WnIt#\yYьfٓu0E ~esWarJMʠ"@XMoad  h:VASM 3Ql[Zڭ@]R}4 L^ .pN_GӚ0d{勨@JYt%8)즘^SB_ZQٚ5QH" P6 3S>RiL.o8N ́}aArJxhQ>vrn7d FX{V4,&p=+\82a&AC&;f 6"Qήb1/~Y[cqP,ߣjԇ.gVV4+C:XܬP("vvv)X krqt4|2`C Nlv]{8ʘ SlC" 2c dNmntgD .GK|v`ec.9(:# =MJ~M m5e_ s틲.I엎 }OZaRVe # .ߧ2"N%zK7`tM2i#{k(los˹^YMS3]ژEVn۠DUVlY댹dHҗNmFK hxm3gp-*'(j-|g$I0yvW/HHݭFYWe!x'%#񼝅c61"X=Ny T-Nh.` 9jAU~|KɾɭҎl#ҝ)uw3anYuZs"˻KzٍS/;Y< tى;n=}_kr ,bG9c*-r-2Ut.Y4rHAx6wm}踔ci;Eb1Uĥʘ5h{a|sXdnlOm {/V@R5B68E{V5OQYKamU4'r"ePRxdak`

T vŀ+m+.ZZEBZz ޠ(JS8_`LAw.jxMoP>ϦF(TbN^UUu-QOYO?hH?\ivM7t5`p(c SK(Y6lQx}]'̶@ Kd$ѣ"\rˎ8G:ݫ+G bj a"3>X@ѢF[|' ExMJu"x .Q!ի:͚Q).5B%eLʍS1Z1 mH&q4.ti{$6>FF~x t\dr{Te&TyPJ-+"e1/8F ^@Af16dE6eUD-UoJAK /,T3;G-2/ <PMɤUHTfۛ@E܇=. VGP/ L!r7N ]s"ŖR6<%5I*BWfFSsBq޾CK$&*M©w1qcͤ63llڅ k[`o1COE7KLt00&X+vXt"+uXrJb14v RXoJX~СZ$n3v%aU: L(5ehL,5qDw4ĵcAvz 6uѾFx)b\E8F>VRIG .h qp7fGh1\fۀs.vcٛ4gdT@M&Xhcб*CG-`y´lO١hu/F{<0 TQzao+|,e~!Hu`a-@/ -_е!Sκb[(8p;Ǻ&9* T- qy4%tR)wK{'XbT2r@0\-UALu9J05:kUf` r5 _k|ˮÖG3ð`Kr,r4+zIeM 43X1쓢PGlèEb;}V˒9r`\;ma <RSGR0'CսxA3(:Npmzor)&P;*X,[\J `|>c#5Yҙ-lk;bc["$bj?l}G2KqOtyQGxj3eO7 I -₍;xb᥁ίuW8w?H QnR~>7%F^"7ڐ.'b4'a`gM>;ON*6Js壂[Ejnކ4j=#vlKa&E32,b(9>zcfOhiax{AWAhՙd1.5u8d mh8AjJXz] ׇQg=N@A4blA,TSIj4 @E&*=g/@XۉqK LTP@^gE hÅ&,"eal>-Fӣ XV?Z.R RCKucH.k0On|xbұGDe -3Nh)9nEU&F;ѫce$9ErM Ƴ؄#N5 TKB}a) AuMf 8ì7ܐ9>ׄql]Z"G:pJ0~Y#`OkzԆ.uzYS O5 #&ǧOƺe dy *;+Zek,{K -H톇ӞZJi#thOy tzirrԼbZTůrqHQ*/3^(n/zIFN<%t( GTV&wbuVe"ДA!N}iz^`֙l &0΅.$/xqMM@!=;_JT:RU77))o`4VÆ C}+ՕtሑΒDXSa;09qJ F ])`jh'v p. t4"T:f9Z&av3_1Ҏ߷i>zf%v{v]5ycS{{'ϓfJ]^w㶍7mOY{[?>ND* "si+ɍםQHmCʟ/-mogOٍA74>(m'j#]" m|BM_&s?HĻF0wQn{L>&~jGycSMQzqO~݊Ez?꿃 vF8O.}0_Юi[&W}Tѵ&l @H'"ݫ;_8;oGxog<j?`'^l~Z6FZn§߅??6?#;?;粯4CǕȋ=:xï5c$*lߦW f|{Q?>,'>=*9,gy:?lHc-{Z#rj =D R6[|PsjY~*Ac|?s .&t {3fB!uJ-e W#s! Α 櫥b!a?z&UPIugffviB@s~HJؼVv!5d 6YO8&YtN9t)Z)@żg2cpUgs^ݏGߝm1A,s{轗08[S7]8t騼#=RWc^8f5'NwP?n! 3;ʻ.bJS[{^bOӱw^fn}ߜ}ybUpIyr$5\VQ{=甥Po ~1|q6[+Di{n1k5d7Qv+~;0~gU@4=>}Iz~Ϩ߆[I]X[oH~_Qj4t.5҂MmB x06 _b=e gVծv9թTߐnȱ 2[4]$wRudF x*cD/ĺz W(Y;142 2C ( b!#G:NFAcԒ SAUr'HŞ6顕㑛߾~xH 0v' nġ&Ԯ EyvG˙c%C1 PмGVk# e{JZ:fwhX }W0Ht"DObfˏ # S ЫQ7m~ u\ 0CU'w*aEHW뫋p}i+|oP̈q؈IrEwe~W_;f1i_6o,,}cSEQj:U3jStԳ<bFE6z ;5v\5֊GW\2w5iW(ӱP'u379*hh2]XCP);߯~6*lEe Q&IxP#2n9i|TלsBbg8j[,ҷߎ 85ҠL*=Ҩ[X?>mM * ڏ  L\*6PlJxihzi0_TϰuY? 9ueW5_ oB1z/0LQ;Z=3[g^Xe8oX|8b L;3:FtQnD"=gԡ,h)K̥_7.#UiS{TK06 q eXqQ cz~K1,ckeZ2aFIʓE*aT ˇ$҃*p&}|c麴°7/g 1PBtVůR%[<>؂#[ռy{u{W9j]l1uާG_:_p{2ӆ|l   E0xgIZ:!Oa/H=jQ}bXݱwc~ssa\WmH8AyoTHY=4J3u';堾 bĀs[9*\%BPNG  IHDR226@:jIDATx^_heO4]׮跑]Wl*xU !0U"(ƉQo'nNJ?l/4R*N^tkeh.X=>yyM}@~9I>x\PXTP&]x)]E;q*Y*C9HQ2Tp 7ƭ9mrX@$(N)"'s{!҃_&h 9to5S,D _u[uh@4P13KLCU T%_$H܆C1']eE@?gCAո"Dtr6^R112*NElѼC~U->D9H?qVBƀ(E>qЀ)IdMu%" QJM!\Qֳ+XJطe@-vc#gIl饜C^ `q%[xg k<эbxVܨDZMHz1Lrfȱד3 A6]A4yP1PA6jC+OKysil!"BhFsّ^l1 AR@qǮO/B,%{1H/9/dԘA.R@T/}5a >XjQfK[<Ȇ(-09y(*e)"wίIVrJ+%A6g鋣ץ=Rlu?d)חЅ,{"|v-fΏ糔C:r+SCzKV)DKRw}4Ÿ vR cC2FC، :h'{ن3}+?)Bt0̻  h4x+ 𓾺44者o9Dy'1at x =ُGmhA9Dr5نF;:hF=jP!Nhz_AM.ԄFW!? ?A0z!* /䃗BuUK %y B LcIENDB`PNG  IHDR@@`UcsCl0`MIDATx^kpU@sr;B\$$@*XiXX"8tढ़*Qkۿ࠶b BwEp[H9'ifɚ='0g޽]u/?s}OL? or;p)^yI0z8źp/`۵6a >u?/CřDPYQno#ֹD2vyE6e#'$ZoW!fQ L=sCNa> \nE-:/WҌQX$033 J!8HI3{a72t`n( kP f;F/`vG)pki`/9|?n\ "Y+i <3O3D'`# tn7meMw U2ނV6 fycr3[J,e`zMoYLV&΀ rm. W|&d hbX ˕jKمRY |,K `L˫TTɑMWZ8p2 c E|XdƧ l)E6?؂,`b* #\,@@3hjTMՌ5}-e*~k%@lŪQUrUzu_/d[ʮl!Vm6W 7R%2A`pt}WBQHX,hۮ|ip !,F 2fj}pq=1pBNSh@9&9O6YyJQJG<,t-$ҰR^|y8GICNh|K H_vJt#,l! FxvJt!`&Dt8r @&[HnlywͬPi΅Dn8:/BLQ)*S*߼ L\l mM v7#Bޕ5BEIUG4yU{Y/'pⱑBr%` r6\:IО[iL_r=G^9x@![qRutQrƻL\T*USwf["Gw3JS8'e!ZUkJU~ƪ"Kצѥn40W1bH TdYHAAgѽw0Bxhg^TL_hȲٽsN|YVVR |Sr8{XJR9'4eV nB~S4%*A LpUGsN|xYV_-za]W=5I) s:;wt @g)Q 8ı[A=r|x4Te(8*yB[#܆vpr{|ق .p Xe{ҋT JA*l h4eA BoTJok)v4^>xBJ4Qտaݡ-m_v>~q_?GvB㔯,ȫX3yg%T MRj5p/NV&DSl %)MP*Q.\e*xk 4RJ<*|MLPҔɯ|_#k~0{#i..nrWJOJSҔ*_?JR¹O ;kDtͣ]+=D,âIENDB`PNG  IHDR@@`UcsCl0`MIDATx^Q@FeIȀPMEA O-x6}.Leύy|x@oĈqgA{ 1c! /-B"b1q Y`u B%+bI0fFB2frcP(b<<\D:J=<<r=5|u%_S!W;5ϩ  NM_NuMLyIENDB`PNG  IHDR@@`UcsCl0`MIDATx^=K#QNތ/F#ɺA [,)Y_-+a]A?ZY[m/"kgc{3NFb3ȝp<H) @gFl}7r~ !fd6] ! :" c Y\9 #$yn ;:[(AB@w H@1HE#<e" q'AtG,0V9 @5L (p $@绀9^(a4:ou_ 7 @4:o*!pHL4 y,`% bFPB""oD>1@o| "7?nw,vl ۶|doD:oEHNЄ2hB/4$?͘] KqO%7&4xy:>;XDS U̢[ n1@1 qh`:oeM(1ʉqI3^N5ӹ8t>AĸMHx;-O) m tIENDB`PNG  IHDR@@`UcsCl0`MIDATx^͘mUgޛ!$-X-`/ R PF LmWWK`-E`A,TDQ:st8 Nw{.Os>}sv<ŃH@a53gP^W[uVq!o(d7jxW!qxy]U]L*3uǿw:NL3exT|r?uߙTP֞ ;@=NL}e xB&gJ"e|tܯx7@ i}MAJ٫GZH d tr&C@ @ @ @ @ @ @ @ @P@P %P8O h}&蔀XAӀiXAF@VsjZ4.9jv"XbԨP"8.%*Ԩ[T!GLHc+a(S'r+14SnejĮrY^DԩRɤ@a% Iy} fu@f  ^ BzK*N gGY#Ft^0 A \lLR8dSݧUwcg6E 8en?NH-vh6Z <̮VPv{\%t_kM̭SߚM hh* Z(";PsG 4x~MHjz!$9pV 7;`C1iΚĄ&)/yv~ے>JQϰF;X7"H"x XKytq &S9E(> kGgP)4x;I]NDԨP8ɣʯe9S?v=chҠ,!Qyp$p':ذb -MwxvwktǡkH*F<CdOCЁWѱϫ9(R%$w'h=ޟ)FL@EځF+N*E.spΕ/Rh+8 aK2/ 4l\5M/֊H:oZ>WIENDB`PNG  IHDR@@iqcsCl0`M 4IDATx^[}lVW[BS*Z1AK"$$ؒjĎ!  I# ! FeP *J%Ӝ֛޼7'r99<<}y'(l?]$ ј= ALd2<~a_gsGj3Nã0nڵɛ7ov޽]?xxxx@{c^0>B!Bx}0{Lb7Ç q}< R 't\A;PF`#ZGqS@?|z3#s$͈c> q2, '$rKe X1?<1K`OI@;0}Oƣk'$d^To޼;wt8kEy0W;kJ]x衾)f=H8o.]i#GL=ʃcr]+BؓI$$IBwfyy}m@V=(xvCY!zݶt6[՝lZ'O}Wq|J隣8} )JeḸOAYt$ Hy4> GT_J: Oh{NW@@I>53Bh"e)L3Z׶P(.\l'Uz6mRju)HooP2*xIjW_f~?in93H`ذaҲw^>8 HBE,j9g_"H, ]رCV|Ne+^|ˊN,׏k׮f+++P[l[,sN'tC3 Yf#minnܾ}[qW< Y(|qcNB@]]6^IY^,F+: +Wt%@KON:FUUAN8ĊL5wh;sh!GUܹs`&WLpŊ#)f Y ,YY];w+ "{ |aƪkʕ+]gϞQC?VݻwR"H4hgo7ku(l***r%Iqü@' /xrv=gK2;++($ÒBW3N 0׵;$,@89?jH<|jnI"q]ٕf [2!耇n;ߧ`OjR]F00GaM}<1T; 7@`t-i2 B GU a71FUpD,-Wq~!>.і?%pD3k T`0w[-yfZ h5iOP:ɐu:Ȭ$d 2H$I^ڸ IENDB`PNG  IHDR@@`UcsCl0`MIDATx^k]U{n*RK(BZ41ED-)Xl hhE$RIU8 ,:#M[9JV89Μ~zyHSoz cTTD*ԅJIy'$t7GqIK3'-tc}|LL^Io_j/ZRJԼY4ɒ- N;W,vknaK`ghp ,բYLPE PwN7nK4ht<-SJ[*mtj.Hj?b~s܍oj2"̂snuGә Uܿ ^~|y\f)ʘ 9~|9.iLdY dxTJ4q'8ieZHek+R #0C&5>pٕطlIkA=m "MaLEGc+la%up$Tפy%a'T)PBIIDRD^ɂJFtGմ`+{ ~fNzv#jZOk;[]XL*ѫpj聙~`n;?wL@Qv}D5 t./&Y+>T@Q1aU[G2A{1:&"{X@T(4ff"OfvwA9OvS0dS Z)zVXrPP "8@e٦٦.yH+|a]2T>sxݘHV%ɏ/)V>o:K1&pJ-`k_)QRT\]e:)JÀH{}X&mJGu [߾GxWٹgF' : ڌFDl^&Cb֘uN߷ȯdtqLI5_d-]1(A !3J nOYkp/fl|) <'44 SD-Gkڜ|Èj+O@iGn<OT#H\4 +$ROsʐv1b]8>ծwSNvl RPRE˝`xpEڜf_X#  6=hM,ZyKq!xmt.Z} \!jpY >ˠ\cqaCq7Cފ]kpvccp8 : c,,C4h(V|9^/_)[0(41 GqǺ݀)hЅbo5p $ɨU٭X݀,1,Ur8jmaO._@P6-k-RۡO#0 QaW՗?Qa ((k{JǏO@^0h J7X*?PR)IENDB`PNG  IHDR@@`UcsCl0`M@IDATx^TWϹ3˲%PjڠZM)EDŨMcVcKBB"B@465ؔhզj",eؚA ڄ$twgg_$Lv/{{~3 %KU7%  E51F#ۂT>S5Ϸm3h GU[?cTeBH|E*T}7,S@Ck Ʈ[5Z1Ӱ#~'s+,kwb3fm8n QA4Po|0 n0պf/)DQS |643V{p=dN:唃!i6:H xcL[Mv[Nbg*)t>$sFU@nVF<NO &72;ѣ" %}6 {54EQlh)%Sz׀Zw9YkUT]>ڃWOrjGmsY̛ m{T0|嘤$[oPC6'{+NR7kJ; ST=7BzýJXda0<˕VW U fTLDoo)*^nrLTe޾gu8d V4v%*24&­@!@TLn1OsNS2@fq3Z -s@cYMNA!fjA*kxȑ-s1I>H(P}WᠳRdһMØ֎X?-3jvOU4P7fԨuNF٣Q`! U3M?<2JFmm]sڋIHUAݘ~#5u0& *@ Owa39fjQ/ ٭[Iw.(El~b Tא-Xn3𠽺AVFI/ƬVdYIrP&azf=V&ƨ8[2yC=ibls]%u6~m (GmU.8n$3PSnم}M~a,mb9ku<ԀeO,oU(W1ePq]υ6.cHs N_6K)u{lUSO׶@92RL}RF$^JZbh?D䈢LH ]u$4Td~7I!הbD4Bg!&w.( .R.w|I?ylNIENDB`PNG  IHDR@@`UcsCl0`M/IDATx^}gu98YE؆2F7Xp4 Lة | k^d:QQsjli#8* W0.9p{E8{~/u z"Q2AQb k!r Q=>_. YzNAɽcr:/ 7|٘ӆAk5dB3*6W-s5qW1/0 dJoxAfUhf>T*O0 d gbH'D "5-FE+]k]!lwyfif\:owRGuom6i+DĺA@ĩoR 6Vp%ih:fuPJ .HgeS P(K|| '>-DQ \cf뻆> xG[:Oi2J d=g.̿_bȰ[`[,s5dB%}0}V horj2 (k.i?t@r[;o+lAY sBw駇V |Š~NKJ}2j}L ytqT"*, а>!@$6VJݠ$x6U^ 2. sz)crUgvZr7E<  t3wڣ]78 m-ϺSdD7opވ2o Q2kk'|\79!E)PM`҄ []X~uJ2(^VUZsQ&2h0=M[]8F=Ɉ DIƼ`!G\(~~mmE5 *;jݘ Ga Eﰟ R;v=`jRaGQl_k ?恨GZvqﵧHZCڒM?gaIUՕG^r_? *PUhCgFM휶_;)΄S>N۸V*@bRh^4]]eJh:cKǨxZI@,ׁ85'x\3 t3E4(v;'qi[@~\Q}Z5C@[⦡yCΓ9(-@WL>euF5YYb x7>j GO.ԩ/ݩ-qi.I) PsoBG&j& IH7!}ubpu=cP,IENDB`PNG  IHDR@@`UcsCl0`MIDATx^kWﳷaŠ[VKTӆvA[nj( ZkS_5!ƘTIl$ o- A757ʂ\2?83q 'Dx~9y8|RtďbyOA9ʮBa"D"Dm~4y+  NDZ)|s#\"y!=\xSUmb0% D$iF @xp@.j6kRIIk#)Rd,yX]b,a4c9C JyIzp0ɟ U 訤SO$*@Z% Gic/JCB1s҃5I_);t!u V~1f,12$ai>Hoc{T;L#EԀN"A6Jxc/'m^3øfn`^;# !Ш7p'{H; _tݖ9]N3!Ec;J z*isщ'f2_="=jYUR/3; n]Κ'JGaɘBPi5MooKF3i1@3z e14ЮKLyNU; c+ڦ骤׿I+v`q?$*PZ/]pAd.^I׏'PM؂%T~N:lk%]>8|tKҰ^$<B(kckxZ@au{X&,e1, IIe.HڳXBX`3ya&djR vJ:s2L頝Vd`)_~OiGK7oMN&Kiq"5_5_ź_Kg.#Q撧DؤWYɚe%n@E&>O th% pkTL6+zSa[gO$-)#l4~d)S.覓t)Vb2^w $ !I)F,|'EPsaH:i /˔o"EF:O|\z2U,#N$it7 l$"$ VvH:]1+iک#d>\ly3,B]_>`_\xz"խ K*"SXIENDB`PNG  IHDR@@`UcsCl0`MUIDATx^_OiVX ?&-AaC GoֽMz<1bVwP3=PO;s2!'y~̼s&֧~/T׀> +< w0/ۗG?#߯K~1KŃAT@8xJpCx<%xOxKxbx <pw"ll?<>fCm;0ZX)uP:(5;6k>,{\ƲԒ2VzpX {?}>9,s 䑓}|}[Xrz:6J3HaN 򑀼U_,~uj5 +਄D_BqH@J>,:*),n0q^q$#I1go/`; @j6ޜTMm:h(@*]%7+}*. ]:<pBa) g!I;=i>>E|y.? 7z0$rm%e@OBbJTC0q?[Q Q= cF BX+ƏX}#ۦclHZx `,~{( / ,EKi_WB[¶%D$Y76xAq_:\@ bގHB[%skvtP>T_^ԟ7?l5:}0aѬE {Nj6'^ ΅ $aiBiLx`1!#_ܦ;c^c].<O''! Gwx||8apw8h||'N \YrDZ*)k~_\bhp~uFm/1(a=ъ7qØIENDB`PNG  IHDR@@`UcsCl0`MIDATx^ٻoUeY|Yvm+KDbPHHD(nґ*e7(E@J4q$ IlCj3Gc>r2srymGs9Y>N#8 QQ5TqxRL)FX~s@eÇƀA|µM(_!Sh4K[BF{e<1uζRM8OCa\/!ڄx9C !&,)@uFb@4h2O#@nƑϗ!*7wK}ޗ9wOs ouU_P8N?wa6&]%) 7lt(yL\?'` : FM~^kγ">}?&+Rc$r3!88IKt,^[]I1OJ%S&i2N3<-ܜP?Ma 2&)J_1w?SKx PG Wh-cv7'÷## 3.m+8 l Ą;^/_251K[P3 LyEL (`^/*~J 4X#T`Sr7!yc 5NZ =xizBI RŎ5@/ޢIE 2C8rѷK Ȓ#@dj {@[zR9n79V"Ujzߣ9.3F "]$ħ=2>!/3 =RcL2[@ӄQxnQZ3BH$dQ'̔54R0،RoC>_#:E{IENDB`PNG  IHDR@@`UcsCl0`MIDATx^OKbQn?WMYX)%6Zͬi5ML+׽@ i{8nj|Co{3 >`B`SL)L{=v:s߇xD]'#*@oOT^c` ] r^&Xy` 'yp @0%@LBޔ`0!rޜ WjG}Y'K8@D=c:Y"aQR(Q:lMv{ӤN)8&,E, `-ؠ-lF K,RH 1MCG$9*B$WO7C(Ǒƀ1` ƀ1`_#>HBdO(0{kxߜ = v7,7{\}yVӇ$0GQ|C9fHY)iTY: reIi9>Eh] 1yN&s`7QK߇f*"o E9o [9o ļ}0xy&F#B:@ȐD5X<!o i|%'D?@eլIENDB`PNG  IHDR@@`UcsCl0`MIDATx^MoU=db';-qj4IEP6HH "6l+D+|nUb^T$+M[5͛fp|S sѵ'Ds& `=9 y Q@(C1ft*n ! tRNK1= OAwncc8*q^ ԀG`2K{}2 ţHz505V3G G -\ST`R07Р*Gw_b SR@|ɼ|2aS Ą߾<53э!hB1rAyi=Z7!.(n7o'KBTG~kI ysu|;p~{ovv*i1@ _6%?tG&q^_9,++#{0OtH}3,H2M֌6SzwOdJ@<73Tc?v,Qn_,t,Sxx„p/.z?\*,LMVen`o«Cۇ>)=teW9_/&|\>1uR$ Wp>)qƖL o1+!=:dCBHs,Ӻr(nd <<*w_t1\#kR!@֎g) X8ݎIB-%@VKC,.:rTK\M*ei2g9GΈY "GKyYR?55Bk r6Ӕe27i2Y\?RCc L?Yrt>ĊIENDB`PNG  IHDR@@iqcsCl0`M IDATx^[}LT)32"b T]-KYݏVݦJMvuUiMMhHmq7Q0.d5Y?¢Dc4l"ongrdy#Iړ}wι_j b1BLz،0R>|؁o2WQP000' 3%fӵ3>}###mpttghh mѽ˗/ϖd!”6چ?~ \k xs&]DL >FW- 5"AST[wr'220 *X4/*>'g${ZJ=:$ %_9!eu "HcANml4= r2B6ȖB)`"V?uF$h Ҳ"ōsRo~-V{P_A$ 20j/X@Wd腕', WYBmtB!ACee-s$ \ ټB@ZOoVھ@Z=8W-N{Ɇԭ ۀC|$ 2D?~z<_sH0QbzWnߞ%HCmGVnjp M HI*?O:4& >|x3/$H@4( ,]ٷo懀D~S}Tb<τ%7|ދ8Ì 56= @s=zT;VGٞ =ͣj$ۚ`nZ`ӹjժw H2HuB $Ipo VGԁ7. kw"֓!V`= `= Oʒ!'! Xd>LhlAE m6y>K #@dfflڴI<|p8**jr7E+>~>IDeNo=۶mRarh]^Ccv% U0HIN2AG-[SBhRL2P{r!$xv>RZKƍ;v(Ne}M{5OMM;vڵm/rbxv7QNt" _S~L X$9sF]C, gfNeKSyq…Bev}'O[Xdggˍʑt&`~Lx,"`մ*HT&g\}AW^$޾}[\~C^Јuʕ+744rØtvIFF! 7o$I-7+˗{v|:o_ȹsNogYqXr IIcc<!960EBB! 0o21r|0nܸ/=Kc9Hf%$F1RLĆ`ijj"_Tw3luWycijgJe<Rgܞl5}5;yt99lRe˖mDJ"*,}n{w!VؘU34b།apH!n]{ N>JZǹ$ZM@(̢xiw2b:n䙓#oN$X:ބ>O\PD/FlCxABcҥK\`F-~嶚Wƃo&0Iq3\l/g(%8D?xt4-l1f?ESO|pH_fZl[0?r/ް`'f|'x*/,^cDJxYF Wy:+[f$ {d<0Q&[.U "@j$? !<R/IENDB`PNG  IHDR@@`UcsCl0`MIDATx^͘]h\E 4V1^ *ЪP(6*j+"*("*5B( MJJj"BբV"Es=0v؅p3sW~J_$x$  Xp biYEb\@",>D LFA6\Fp|($@@ >x*$' H\|" Ps*$y Z $ E SJ *H  *H  *H ?+Y$»%UWA_ ~$UWA_ ~$UWAs^@{%Fƒ>9Y8-Hg#xC0q[%ǬkEM*n"s4-dUӄ(RJ l =, DȲh!KHD25v>;b7 S熍.3BтjSIFЦO>!7!/߳ %,fe*jC Fp sM0tn[)QBBc 7$f{N G:N,nhg8@;&kB-˸bG4w*$ߍ#o(H2eYj# \ ( @DE4SC.#붓"@8}q|p#)S4Oc>Wrpn|FW*8 ;⊧'45s|Dq|Y)ᯙe<dߔvр7x)o3^Ə#4QY2E q:^郊* sq6A=]_xu<@pAnpq3/ntozFW5驗{n$@L: J̾掝}sa) (15^c@ag ɚxU'ЪP @&o/ޑ"DMX#P3- $b\(C[_[w/HIENDB`PNG  IHDR@@iqcsCl0`MoIDATx?AGAPR)z] moO`tjwǥ (jl,mBB}&TDɼx;RfwGgg^緻;3?x|@@ukM>ԤiPyc ~P(I"%{^1 AD"wZ`>f0$ߨdtd2Q+s)t)=F wtCd٤Q:͆ӸX(+u[{n7yS!_-K&lX8X=5:T*,s:ҙ%"~T<zOSZ^mh ™yq Ж&_?ț4O^/LkET*y|\6k[P Vy Yx|`dX.!gq8%&>\,z^_2TѬ^p{zOtup8T*WB;R,?*} ĥҽ;2?*zK,-14}߳X,!x3{x=KĘ_>IENDB`PNG  IHDR@@`UcsCl0`MIDATx^kp\u'ͽͥMLڦ@[ZjahT0QGp83T `gE={kdJQK n6K6o|=xvMO/$9˳"|| be$[%lQ|9'R {V׶ϵ0R y(YY:W OS`f2 ;4C1!3ϓ_/q T LQ0̔{J }*ngˢ1nf d"..1 ooU#))66 WJ߇mic#? {U|C-Η={5eEp:ou FD|yBTZ7ǤR$&@M@, /&9&+r)C6qx(`GI 6yR,ՉVa|HϔƜHS s㸖pGcП6nqH=ڀR 2 E`#KǚMNMѦ3nBğ-ݖI(O.39 1썻Mݣ{:A;k|T`C%)t;ΗvC{slyMxrwpZf Y:~߸'I1s:>skUZtifYdܥaÝtpթ[fowwjZ=X~e1[]@< I15N3i+7=іd/X@rj,۰@ʤ$&0'ƞ6w)⌻)^R%Ūl%xeP qOSsEN-BB!KB %. WRmf\  =vj]Zm,=-{wfI$NZCV4Ǝn$-#NёPGdHx2Dg?izbw sdbϭz*U %438Lqg@sp~ Re%yET( ^OzG2V<Ï%=с!͋,R"ղ|Ȝs"$^ڰrdX߶X^m}0gN|\"cIENDB`PNG  IHDR@@`UcsCl0`MIDATx^{pT޻]!<" "i vCSe:V T )#vZP_V( J #nv=_3sf!܌o=|sX`R#D^>( u`S+T.nI+,Mn]#2ᔻGuN!D] VO:BQ(hl]彯BҴ A# ^Kt.`LJ<1|U yש##ڃaR&o}0wP(\7:/޹{X#p~SM &Ws?}U:Eţ}ko>Ne(}~o|顅!̊q nhl"v;{3w pPXQͅÍZ=ƬTE|\ԠxTOhw݄g"GܲV,.72X,0'џ>pOj2 /(+K_k, @ێYaOWO~bNoS1jvʂLҏ CgkvXѐDϽXaVQK zzvd\ij=9#K n^F%_VT॑AXe6l* A'/hbXVH4 h٧R}e5)DBXe }:7Lh/pu47 rߴ 6luE釛8vahS:""M&}An?JBp.Izr>B^~aPB2 Q >yR!8! ڄAX \ HB _X2S2!ς-PEӆV*Y%"'XzAч -APSH_od*Zy>Crp!iE8nIkX Q+ 4}uKyoKHy(߉`ﰜMsw0"V@Wqݓ>c`.H TMكPA[ Xm81+:˭}FdWɣ$Վ`(IF=k$MHI(hu<Y2Uzt"Pne U!a3E,ಂblz)?]! xTQY@.,a:c[F1S]&VQ@޽?jQGW&c˳fT0 ʝP vռiD[\ (Dw| Io>齡lZPjc43&zLݼ"iN" ɒ!MWΪ]WL0Hr2 D(@m+׌=$^aIṳ?ppK<9?)͌#h@:(2j+/_N-G4h3GʙYЩIDh|̲_shV5 UJ6ڼTS-j6u11t e< *Knqکe"-{3NŃ&639OFhy&TtwD*J%<d.ŅտeR#^..* A"Ѐ(ﬖAV1Á q\lj0&qM8v9Y\vO0mցj6["j1HE׳imBmZDGMHMHMHMHzM]2xU5X˥OB΍EÓ/^_<)IЍ#́95g)DRpʹs"a}18Ĥd\Dr!#%nE 1˨YaMӰeGL&[LÆde@?e$6ʦDf7Un 4ըiZQ6$IK_LW$1'XbIENDB`PNG  IHDR226@:IDATx^NQ2Jf Sb|Tl ,o 4XhZݱ &@p)/15qazM'/y ?H>&ɍDD$E@@F8q tyzA 9"<p(9%-L2 oIY C $ At';ID4]2A v!.䥽:.+Ǝh < 5g$ )1J O!Av!Y MшpIKpT !F}km]I5Q__h( +!9O1qD=E3q-iwfkG(:,: ?ox8H,vzӎ1,HeEM'fԩ3D}3B#ҤA* Uj4h #T䱠oAT )H 0R1F@Y 9 Lg#,^3J$>uaA4l]·Vh/5aG434o{y4Ϥ&fB??NS%ԄL17UۑQԄ Ì0b;ܙa5 a'; Z `@]2I.c=4᝱_m JCIENDB`PNG  IHDR226@:IDATx^[hU3{ EXRS55 Z V0``B(^W/4KҒX>*"Zں;gݏ}7=g{<\-=C;SE2KhV ίE Dc@%f[H$u8ק3^x:;oҖPЦ'ox¡46TЦ2ҼcWj<thvїF$52ķFӺZ#"ʲw-ME+X5Zq8$q8&)('{w*P!qӸiUo ˑ+Dd'HԐQjLS`LP.M.)СK@DxPKshXOˆK.ĤIjʓD$dAP^!&%!.!1XH5.+%3hkmh5e-KK$y6i OI,rZX+I\$8Lgjז]jݔ`V$D > c}ۮ$oI\^Z81ۥLmH;$dQdXv=`թ-ĮFHDJm!gZ|XnϞ=|% ɓSWS#Ŕk=O|='q*!` 6G" ߠ5yQ:GExV%G<&` _d~G-XKzN8$/o2qxήw^̩R߿\PP 9bUD>ПL׮]#,@>ܹˀwjnnV26HuttDwRbyw\-7*nEDec΄1x, /$TRReddСCق{^@ 4^kgjo*,b=gE :N:{,ݺu^JO|tRO~ѣGwmmm !\$rA軓l0d&ba@ KۼR||^[)xe` oN#za bH^^FCCC OT[[K^WɼBdIq{KH"m۶h=Qyfңhbbjxs>QHaGf D"<3gΐ15$3f9;,’,yP"RiDEN[ڵTTT`XL,E(rκ2tz}B˒5!%6S`Rq:`<55z{{8;[.K}dHm8F$er|C$sBXIb{·}Td֭Jdzސ8ݴFRd4 o L!զ\⭈7I=IVjm߾l U ݪB)~owTUU)jo8?VECriÇm)..f Pʪ~0.p raŋU6ZA t!`;v6tJdoâHփBn+ԧ;IԲzۮe=+ZBs,y<y]`.-+% Y,ӗ]"Z _RKCP[VYIu\zV,p| B (jZVvYE$VU5Pn\R>R"c6x.vBY,( ĎYtI6lC둃2]Nl)֠r]ܗfpx{Ee\ Q)d \KBd-$΃ϥcXEaA?S_n/`IENDB`PNG  IHDR22?IDATx!0Em񜬯65sy>_B&B!<|A^`N m1VSzSD؀ErV',tQ{ك|؂9j B\TQm+~ LYpM0-:x$!f-谘^u A] ڱj'mf[ll$j֞aϊzD)@yiP;rAdidϋaxP!B$9 _IENDB`PNG  IHDR226@:IDATx^m\W߹sw1ټTֶAH FDQԨXXV), b*HTT|*Ii%VcJYJ[ll^nc۽G\p`~Xs[l%*-TRJI]oA?C*i_is'M[-x۫ZӀfR {lYk,cv9Ho5k)=l45Mھ;reja\#<9EiJJ2,wah+B!"-]ur[]Xʴ٣.1u*i >w>F!:D@ >;|Kyu Di`O;2>w3pzZ" ='\#0k<刳J%tu,8k?e/azR D-xNw<_=FG10H/rZ%k]7k=kv@Nf>?߆_WJM-vm g>NO?]T"F1D6|Ɨ O/TRB ޴"[7>Q'*V[ >Ȍydt\7==;^JcrYBh]5kneY XfJH]Cڧ *$9mma94{XP* |{iSaqE [>KDq.&3T(kR1}}um.LDI3zmo4fDuduMz4"qKZY}6x V휲aiw1DmcH+1gԘQ)M@ѾIe').;&ГC$T$4uDJ.: J]T(Cl$R*P$=R1 )) $ D 2j sqIENDB`PNG  IHDR226@:IDATx^]Te;KV^H)D E \EXX`E!QAa?E$Ja.Bi%*JA,l7;{~찡'{Gd@@#qB$(}(*6&R5/SqT"`\ɪ ׼ܣxڊ>H,ӆjTn-jRmr2 ENa"TSD7I"p8$'$Aza2K(BO82&SmrEh *H"Ihζ| P(ġI2Tڽg54l!xV8ljrhKf8 f0ɂ+orHH]ogg,8B"3e[ xjO`OҼaFdfh`0j~&qPOBT1[$8ظ'!HdÅo2Y@¼. aaZ~aIč>XxBY; BP$3P@TsǍkB_^C6,OD"fAfudKEQoQԷ_x}cFu峲n3Fh x1eCNG7^{vӲ/ c>Om6q-1wTQG꼒kpMoRD|1$tV"BDu$.D%fB"8ga%_>w)IENDB`PNG  IHDR22?IDATx1n@EQKu#d2e*:j[ R x2 YG`ywAڵ""κ@2 <=-~X_7k{a=X &2C>:@]޹$Sަm۵<ϳ|߷=^$>5sF|η|^k,eD,1Bm%IBA8YH;ƴA@*-dй14ׯ@#1bfF _nj-g"@ @ @?˲I4Mk_2i!0 (nۼ +HlKQJuLâAOsjKٌvݩo'fF]ahˎOւXjQCPO5`mcsIENDB`PNG  IHDR226@:IDATx^JbQ{EoD+"eX ZвlS~ z_w, zCZpwz39,;pa~pAGW̥Ckψd/3Adϗ..ΗE^!1g ;a&21㫄H&2Sx"LBa<D'tffMq#:0&8Wq DP$qϊ"|@znTg4GK~mB830a4ZǎMJ-|GTP83Q :xNS/Di /u ^4$*!k&K?.OW""̣y𻆂tΤ;2%FãmHyDXox5b!o?  (ZcID[b*(b~䰈`޵Qnfҩ%yf]\gbIwQgv]4 3UW=3"*aftCSyzO7{m&af 2UBGiLq넎7J6n7f܄q3UB܌p#nF%ݎ0f30Ska5"fJ`8ƚJiafED(KFrZPGA2/!A"ļd,^3  #$:h.MIENDB`PNG  IHDR226@:IDATx^AkAwd7MM" I7mlU[^z1z"" ؃'R`zJA ccXABaf   IΑ@/j B`a$!Il,4!.:5|;CKq&YVF!}@+L'$ #GtBC,Rd 0HOJƔdvjN=)"@·Jm!F-s2")̝s^^(Zjl'JiE;QɽUJ56/"!+^1,ظddOd=v'b퓇roD@0WHoԗ7sg80} &I?a>\ïW∯9a/7>.IQ_̻[kq)f8~jJ 4^1AZ#d*!cT&(2+ bTS8A@doH9BPN>x (/gX_ND$6Tgdp踙jX )݄[  %OAIENDB`PNG  IHDR226@:IDATx^NA" b-B(6/WO> <Z=`6쬉]&3 3 ","^ 6Bc\\#oG$1iOaL2$㹗>)}D f,&,""#}DI>&"&&<族A@Ԅ xz7g'= x#L0@hO! 2G93Yz/O~~rg5Z0>KP$ )*c׏`-Y,D!GT j2?B"_H , (beTHeYeuq  $"5Cr46 dCE,M" 4g-VYM"&B 1&( g ƭ0!/-2X"G-o# o^x[x-l2̫[8C40$;w|͇ORZ09B/sXQH핞/Vف"|WB S{$P!_)Q} ?77PbLS8 Lz1[XF!$rXHz}!!fԄ)`Ԅ٥bd\bmK>"-ZHfѼo߷M"",Pi6 TPd&1YY&=" "2XI""3a1wA 1.@"< ?=<IENDB`PNG  IHDR226@:IDATx^kpwIݲU Ҳƶ`ŋ(a^,0Ao!8^vy/S Tc,KI41+ˋI>BHIyI{$%l2ƒNqD#Bx=Ea! Nj rv 4Bl,1FRĠHE!A珵8#&T$Vo1(XdI'Cr8+wh2N92{AjA%^}buFzM~j:e /Ma[&ֺo/Zu,t~ i؈Z[b?;] EM|'$A~U.m%a"}wd%Ml'^4,_‹_6/OY0G|cZuW:]A%5 c;mh24Oy!*C CTj2I1̜8dd18I^k18B0F81F6pM<%3Z}zJV)c1Ĉ0*mbO VRxwUDaIG s_{N6bpd"r2 Ѥ8LpscWaC4iP(U8̰ݑnG%= FlPVutRIU6%C3H t"?8x_<05IENDB`PNG  IHDR22?dIDATx^ݙmHgǧxR1|stlsƂ ɾKi [ؚ1@1C'1hSږ542ͷ떛xd!%aE Dzhw V\ jAL8ᛚ֌6777@D+ccc{ ʡX. ݻwNLL7?۷/ މ4N> 9ʦMt.#gn|?aX;N @lٲ%_xw7]Z*` # J9 y<رDOMO? ~, ђ>@ 0pTZ:i}2mft~ݸ0Xl`?=X_[ϩS 0aؽ;w( a}# ┧:99ܘǏp`2L3.f}0}#"a%1홝ȹtDoo`'r 糲}faȁHX8?QĆ-a@\.Ro$AbYɬg7<`0H@{vaߠ6 #ǟFs`0%=GxVgHT8ʬZJ0T)T`̪}#5HcZDq,7+gϞ'zw ܿr$;FBcUC kuuU*bXW٩9gzgzXww)x>d,',r8M E. RG^ѣG֬ ?~|#??UU}*n@bb"uN< rt]* 544(x׋k;::ڱuwJuv+ +%G ph$''L)t.GDKfJJJdRRCZ@򦰼$2 t:(tM:{,q֎]~}4{C @Ú~53sV5k(ǃܢRtt[~gXX% p>"f&{N3$77hhh@EEEoTSSC }V% !^ܹΜ9CB5ZmFsyB4J|šg>eKb'wpkr Dkx"VWW' >zzzj:H0 W`aX-Ƿn; XfXlO: 1T7A=1(q\ _ ɴaA$[8Vv^?%sXtu7Xe$JAgY1e.+fPTPuAs3g珇y3}{/.7]mB{~ώu?ё1OzY{Ÿ?`nvg/g8;ѿ Z%gG_k![g3h#`(ёcUh⏢mVd3g^ܠdʧ/X֑OI-I| U4lK~{OA-S6Fvw_w3Lbh֠SI>?[; @#|x`dQys_KNwFmYe:sbp1:j}dd/֟e Z6;ȀKmBT)((((((#ڶ /[(&]g>.߸+E,UtI3n FG]?QX wk~S *_N[k]?QWK(a&'[??ke2_JZȧM݆zq$a>,JmE⏶ȑhG%* NbEOס#df wȕ$o=v[ySXc4OS⾜gEr7"\|TB=*npJuOf8OAc}GG䚎G?vV⟌0穬ϐ7| :?r~vtߥ}2{3- h7x] I%,&5{q$͈y@O‚e?r!FM10hB?$9tLYpni%X?`tWOiX'@,Z?y&]в9yZb%#~9Uqh :t8Qd 0A:8g52"U"j¹@Qy6t >i>"m;Nah'zl# 5D~/5:o ߴG ;KzptWUh eP%_>m]gP;4e1sP/ρba'OHm%,cNn?JDŽa_%+rKIǿ*~'^? 8 z:@}]sz1tM?)1-&A-ӶϵToƿm~d4/=C&7cK s]m!b?1G?i?݄1| ی>\}7M gЖFD -@UG[HL%c C5 FVgmlO oA+;k*+6_F/Ya_MdZAAAAAAҪ^mBm;/J-ƕ\qI\6y63ͧ%U3ݧA] _ P/Qsp&EZMi\w't3Ijo ]ؿ.U%)4.Hq @?oʿ^r_U|;ZA||8~w.hA릋/ZJ`|m(s%M0K>K,ރv+ib;Z&?M[yLKō(4_C9TzsFG@{vob1 RdACەX/GCGqa>+o5k6 ϱ6i2,3)OCu  |$vwߙ>{ag,S`a)&A·٦s8 5mt>bng}$3|?{G9:sjnxQ΃\~ß " tﲟO&hRLu}{5y!:%ypgsG|>gr;x5OMg:KB1tL房[/O6@6 ȗnF;g}!(& _8̨b}ӛ>;A螃OgMP[f'c14!]O~ސmƟc` \c[tD >c;Vl+ : Wheg BF:jg}(4kQ*g6'ocBدW̞ZV1?`_]'J ݁WWȲU==9Koo{ؗg>df`LHdm/[lgxɎEGϘ}/|ĸmTTw^I4GعeMoߟ~v*`]k6z~i[>}Me:|gWbĜ"C鍆g@ͿӲͲ]Ɵ]m??+>oZQ ,.Ǘ8K)szbf >X|3)4jBezk|c3j/E~fm?'2+1_ʘω@ؿ5_qb@6Y7mKfHl,yÏZϜȶD)K2Rkv3 SO+s#Jb-t1b+<6G n #;/VbO|/9f?.:#ţ ->_s4(ٟS(0UnסPu]?1ua! wڏVl/+?3..˰_k vEgS~t]t]6+9gSzV}<ĭ.Y|߲? |&_?t~&Yga%GA2kq3׈?'YwşFW`#s_̙hisq{aiX^N5[ȥRXh?}ʿ&n6V^1vo9_s>55_?9 ȼN8M׺;` |Nܓ,B7ƕ.>&wGn.-&\of$+mh?$((,TX`hKdȾ ]Yk@HȲ.>P >w>4;g>?w'M7?k\ f|?s&ӷ+,t-OyKllJI}syc9CO'\]ߤR%vqG-WWUE_\R__yA5_s{w=D)}د&$W+ti+h#J߆qD<_j :Q}^Ͽ+ 70x]WV=$d֡[P0+݁,\I[jVWUP|wawO~ ?ߧWU W~i8f!K_A]-vG>TJ tFaMZCU|,n^[pQ1O8U{Ցlj*PW2c jAuQIј|_kOIMu/g|Ќ?_|6'l+ô@u&&5oa+Ij (lb"c'd0x ֆ#TL@  5|>xsq-WeO_wG?t [x0YU?$x7oWPȯ7:y5vۢL+'זJeEUG oC_W}W<ű_ߧK 0{_YouH7Tچs<Wr<5c  -_v@Cd;0b55gs uj`Wv`q|ϙ(>= :i/;ϒ:t]`;TOh|u= {??]O>oaM,BG> J݂֠c*NAZY,CZQ!]ZT|#kEӛkۏU-so&OISt3-bɏh>~<% @oZ1|lVǍx6c]9Ǻ`Vh_^kq ;,5jǬ?S~F3kdk^88(((.^8氾_7bqڇ.B9OF_E~`jH0l~I?Ua?(N? Յ!/+7>X%%i÷yy%0Tm/<ߕc4h 1~(^QGv鳡u 5bZDgV+_{?\3߬S*|گ4.9oz?xυQ_^̜Kox8< USPPPv ,0`?nڄNf/Z|Jg[=ixH{3cw" ~DK H86kOwv8o߫Ϲ[̞~~g*9WH@O'ƿw֟F]mnG"Casr"O_AAAlY~rZ`e,tꂸNM3_˒& 3ԭ f?c_%39mOCl˺p۶/+G'_ n`g*Ǎ?*nYd] M]PtI dw-vc^@~}FцV`=֞ 7~a6Kـ-6>8c>"sj -OOGuh&;̞1w cIP= _^Ë2Tvo < _⯵϶_ Ōo8qmA뗮f>E6-|4c}qoEVoC~d#WK;U*ْ[d3O'1A?0h` ].ɘ|_$U,`sLcw;ض-D_NA i?gG>m9v.Vv&Z5Gcp5EB`vq-pO>c7nMF7`pLe їPYUk3a+%,+&jӅ`䏉Jןn5( jtYTe||V*1BHi^<4?wrպ`!?Z|'v3>:GXV|ߣ?J5(" [:\@Ÿ"AU|{B $?A2Eb_o|zA,D^nܤKVS6 G{P~ ;YECv"]_xt vn9c_&NJ *EϿ?&&]|@[j$Jf>7X$1Cu=rԺ~򹖋oWm^6>XՈۭ'3AQϓ/jPwdmi;1|vOѿR;#̶WB\>^/ePsU/iH-Q,fAAAAA_f3{@'VWH|ʛ53){+F ` =i Z2 rd=-r\#"kf_:ߟp ] u\ ˱mOw/c8ڎ1e7@c|?wUv,6`Kߧ2]|9ӗ<E;'Ó>mO{\gLrlX ⣓54Hl߁ H"~7??q,L8gDш$,Os69H"Ŝ\hW⥔;2_>TX ̥; AVY[jdQPPPPP(eb#8vďBGzVΗmWn9˽JubS^koy6 -ihvyڊխ_7\¤fɊ}of_a K^%lc?~%?|$."lc? Dow\n7b[n4h%7&T?er[okBdbq| c{ŧoy>c63!h?77pQF#W"ߌ?cc@~1Ⱥ3߉]m~#o=53ƿ=Ǔ֚glF|n[4ʡ&p?7qfE?q^OeE_DLQMo|2/yoZYH!҉9AAAAAA 񼋟氕D엥y(/gonZ[^ ._@LȳU3|+KCHxS#Qoˤin߬ &w!l$9ѤдE ~4_~}eP>A~'X8F䷁qE$)h%ܢssofSP]YnL̵Z\iY{U`;jZ]b?ڊBйv=hG-._,"@ZrnY-(((((HĎ;SU"~&6Y-o6/Ϫ I#_6 Y=貹N]%<W$bV p9a"~-A~%_ΌZL71|tE$c"M_l6ܪ%1pO7]ͮ?s̄_Jh*E/+̌!W&?OK>cVlX+Ub/cT;QNlMEh%P|ʪڎ4:v 1X4?v]AAAAAAl!)ZU+/I9L[fmy9{::Y9X&ʹoG'96`H~$Ķ-Jw/7oxvH0J-NBm_<ܶ; 67\ \Z>cv^X;]hC6 i?!+boU%Q. YùN- ג` 06tI|Tڏ-3M7;<4&kȖ-_ MoZfCwcʋﭢkK)]qM;T쏮?sakZL;vE,ס(z nQdq/b~pIENDB`PNG  IHDR22?qIDATx왱n0qL= =#3CsMH\+HdO:$b|:['c# @Lymm޲,S`4:LdYZb/mS: HuM]j5n~nqOx'o,SIE7Ji}mF_Q\:P~UZEQ\VYk(ÜzIA qkzER c7Mǯ [ rRn@Z: ǡ^vUӨ1yѦqqƻ-*N̊0 @ _I[)IENDB`PNG  IHDR226@:IDATx^[hUs&ِ65ِ4iLҤ`4E(XE-M)> $hLGeݤU,酴ݐIpgI23'v]8CO9˜s۬@!ېCdCm6?$'RU^.eGZ_ٱ6R@`[c0VrSʡ(t̎q 5F>h:&E*[H Q &\bqF1}Sb C\AT-mUnQ(ӆ4DYU eNr^ 0.HG2eUaQlXa&ޣb~N)Q90]´l.UnC}XPCF%Хz >vF qt](=fGy(aA}јogSGhx{'FF M0_ Q/]bKcϏ+|-JoN/iu,Sr:(󙽎g/f3V4_+kS|IZS;&Jṭ9)<..wR"UZ/5_n|2ؑwl.4˜|RA4H|Ra[pbhN GPXqfS\b SͿ#⧥Sx-R4Q gϻR,z "_ *4#*?3-(6YȟIENDB`PNG  IHDR226@:IDATx^]H[w'Fv1fj*MN]`;- v`W^aSevcCA֏dqRcγ?2' ܜ8{|y$r$${o{#٘ǐ|8Ph!GyPF @~QM/qG&g?kW&} ȃ#д3sPI cspΟշ8n6 $um,|lV ZgȉH2XCTQB,b?c+FJY8[t0b7{$teUH+j6U%(i$*Gv"]C 2LY`$)IG!$jBx`$OH>xPh)Cu"L6(epcљw6vح:0QfY ~QޟFOE1uD,s r;sKFno&O u_~^OgnAa4F6WV"7c2 ϡJ)vK0+ߓmg0mILzh7Inϝ찆7#j1M^Z xAqRjQ²/~D=]c|swj2KALû<O)^1ɾ*cK=m(OYģ|#bS0Zh{{']gΦ'<`L=~Q&L=+تL'bg^;vjmj7Jc7"VO:%'Q YE(Tf%8/jG#"iFJ ?TI|ȟƭVdC=-7JAăRGQfa'=d7R>_վKJXIaMOnQr/Pb3tbP ֵwS6KZ|(3(uK([){ V<T nˢKpabY U3b_lo>IENDB`PNG  IHDR sIDATx^ԱjP讆8ƈSF@,[ri򛿳?/JDzx:ǀ/]䉻Z.N浓8B]t[D?D+hyF3ȣ@HTABP򗀹\ngo*rUpzH*\&+TZ qOLƁ01`!a3|yHvpf%!ĿHtIENDB`PNG  IHDR sIDATx핱jA@_PD;=APHVT-NN@IaD D76s9n.aa=֝// XK.ABL3"|6Wy6$p< +^V}%K BgVJ8+\ "L{-|R:5:\Ax#`m|ZMy%x )L3%yj:T͞= H Lo|IOb*s;OWs^Ŭ0^e3pI!FG>#(#)6{n"cR1 |CP`W #q^ֻ?1P0bԼpv5< 1ȻF&)q7]l,nS\FwN5΂B\Fz#c+׻<2YR+.Sm,݉׬^7".L+u|eI2ŲAYXO ڞ4UW +8HA,yvmAIENDB`PNG  IHDR sIDATx^1 ѽh#D._eLCd- >9 8T`FS sT3|a#?Hx', & $F %h6BA]IENDB`PNG  IHDR sIDATx^ԱjPƔh [rv(w"(j`T A}s|r 0RYB8qppypU 2k[lejMIP6fDODXl7KP< @H{M3+2L3 d%Ďr+sSSs+{K+ y>m%!<ΤyHWaF[!΍R0ȡc+8> 4y%IENDB`PNG  IHDRqIDATx^A @@ߜmO(Rm-0 "Z~\=t${HCM lJP).!YȆGL7hHV5rǐ;n ̓e\:.q%,'yhWD*ET%/ ~l5Vg& 0;`<Y?*MAV &rCeQ {5GY" a(0J YC"KW"wj"HaB-H f`_58V@sǑWas3>2͐`Lx `SQp;^?7O3 yᨙcQ3 yN= g_!o7 v6^IENDB`PNG  IHDRMIDATx^ձ@%H&i$.H8!U4lj>֜+z w!IQ!Ӊ:AtkuЉh˸%+͈l"ݴEY~t߮LOfnAurlƣ%vO :P` UC*ׄ"'Z"HaB+H fh`h_59V@sQas:OuJ#nFnt 0~x `}uyr:6뿮͚VǃS9нllh`!/.}h/d:Q:NutUޣIENDB`PNG  IHDR s4IDATx^ݒ۪0EWNV⩈wTir|uq2+3d0"`1>²9;2E-'%B=GFqa7t$L84I-.`Vc~;C-sF_bj %=k ThRRFjBDaTkTl %SP;+$Br)X0Vƒˡ<9`"R2 3)*WqRH!Uk^ŵdJDjw΄\ذdIS; V}JF 9gOsAYQR`[:gIENDB`PNG  IHDR s_IDATx^ݓ?k@@`Z2EAP"EpQuQAmpGKn}w3B>r֍%xa=daĊ*qj?OHRg"߫|B7P$GSْǻݔhJGcb):^ [-4*r$avhph#1 P 4>pGh8B FN^:D$J2h_5ɈTxsC“K?_(b!K^+5B*eM%j%3`\|85N#ECGh v, `D$_IENDB`PNG  IHDR sIDATx^ݒKrQšE6UE7'q٥\Ї}`c`Xtpp=V=?쑣Fu'X:k>wl|Έ$f8b'#Rɒs V^@Bc8?W\m:k m7qLTݤȶ=ūQ1݋{mhd 4Ш Qq#rhFKO`P"@tȋpE,b& \K } u0(l!hdM qމAR󊊧–">KC2Pp̽, Q]pK6T`H)cS$44g@3* #UlIENDB`PNG  IHDR@@`UpIDATx^ @t6 !@ x@,C01$8 @$8 @N @ @T="xH!IENDB`PNG  IHDRPX PLTEZZZZZZR\tRNS+NIDATx^10t)11/.Nzϋzr}F3V@# f+L0ä́.&0 L(`B P&0 L(`B Pz6  k mIENDB`PNG  IHDR66Ej&IDATx^ԱjPvtfgߡkVw'w7ǂK@G:>@Q\Ԃ>4dx9G?DDDO5LE$y ay?$%gD* ףثoav{\9&lW.-Tg}].$/)s9\xa K#c؀yY2,cIeb;e1a æ pg(a?`YQ`1 cc:˰Űna%A[9> 8בSIENDB`PNG  IHDR66Ej$IDATx^/QuwtѦ`ڍb]lvA'SA?b4? Wx#x;xrCDDf~ T3/QuXy`Eu&l:ijBЂhRŅt={C&ja5mվrBbjp9l'Qg/awư;2 ș$0I,\S~0l yFe%F9sIQ+f2a c%$úúImDDDDD|*:}YIENDB`PNG  IHDR66Ej%IDATx^ԭQqFfjb^Ŵ{^F5,,FXw.awpÜxS|^Lm& aY.Q ؀aEF7DnЁg= G5/"Le>M!|a+V`4aB}Ʉ|%.0ߑ1@dg @ 8 xܟ01aT`'}W61I ;Wb1;D1a ۂ820eXaĠGo\F֗6IENDB`PNG  IHDR66Ej$IDATx^ԱNAaAВk4t&5Ґ^d{Fu苐G:EӎpfEQFOk=HFԣ"#s. +j@w:?0{Aܧ6%H.A)- ,S ;sXy9Dڳ3lDd3l0lڙ g0iE*Kaϸ,akžXgLqZW,e!Y̰AA̰ A YC_<6wIENDB`PNG  IHDR66Ej&IDATx^ԱNAFaQԒ +4t&`s0q|| 1(La{L}Za}X "VV1{?La S3 QlKY–-k}_^X0)LaX "úúEUpYA3߳]?j{lIENDB`PNG  IHDR66Ej%IDATx^ԽjAa--mD\B.R xZjk喋Ԁ)>+Tp9~eBRQm؁y`Т  BUlo[wQu8 0S#}O(>VK>mT{}G7>$ ;fnl0=#SHH"g\X2wvvN?301a4a 'y6v\pV#301,cI2, _3(?RIENDB`PNG  IHDR66&LVIDATx^ohU9`#]~#?2gzL3c!#l4AX,I'"lɹrHldJn"~m`5bVRvƝ$s!N胵?vs13Y0% B*%"zo-a-|sP=M )yyT/dYhd{iwP]B Es0wd-pX{vZ.KD|-gR}1fX"\FbIܻ߳ԏ$09um2y#Nlb1 j؈ 80B. cM#2yvzMc k#:1WEqDXIC$4lDUp5/H}Auu pSȣ4(5^kU)V# 衮X=A # XFfaqrs`G4zaidB4{azV|d:{Y9Ҭ^+4X_ RчwAX1,"aCq0F!ȃ#b/R `-eI!Ґ=D,h_bܖ|9Se#>̓م YF*E,rJ)a[#eGƒ E&bDC#1Ғ'r0q\G\ & !N,&$#Q`^M850%.VG[\8le j#M."(ԹG4ZG!bccl^N1ƬŎO8;VIENDB`PNG  IHDR66&LVIDATx^}hUs6os4X j6+`i6h b$Ӌnm"P'H4hmDopxg|pyrʱNVl?SOF#^`=hF^63HES8 ,bI6Wr4E>=kP}0F :8mANQkuT4@x;%PAȳ/´f؊LbۖzUfs|v̽W lB*k2Tt4`?RbGІ :MKTvtl?̏F3f[\ɴY?7IfRy|f<WJ,a/:{RߙQU,f ؍`~yPlbhp9U#l ݳ.U49k֖G.bbS,&B7j1dݎ؈;NVkNI#1tY}Buuq8p$h @뉰؋=QT,~X,l5˜0d"\SbWfA]k3V$lqDؠɱ!Dجc=3_٣N͹J?qu7 8ϙ ҀfYe'3"BE؞y9<}WuSgG 5 b f3 -F&("}ly'ěp [m |JTѾE o-"Q4>X3"e9^ GЀT-X/Ҽ=0mY6J;l@M{*7C,GHtPC:G l-Ksܥ ^-1\@[ʬzy`Ͳq#L!8F;C*j~7Av"L_؋0 !g`cL3a1#lA9&rg!IqgnNT%3O{@HG iV+VTN"tN-/VA]WѯL"Z)l„ԔK 4U`fA V)~`P1SqekDOB6g?փNge 0’P^#@.Z9t2no̶Kt&E\DLRify_rb#E1'O,Z:4Uka C?ǀ=IENDB`PNG  IHDR66Ej$IDATx^ԿjAaGl }4E>`eب^Oq[baf7gcA?d,!""g~J`s5*YB rC ݬE F7D 1+xzD% ={5!M'S56QaKֹc2䰝FtǾnv!a+l@dg}@ ;: ;xܟ01a4a}7b|%b~4G-+2a cđϰðϰ" aYC S,0lIAY¶`(k_R1a ۃd2lb1l2 op|`Qά """"jCIENDB`PNG  IHDR66Ej&IDATx^1jAq5kRZS{~K )zRD;Bfv} ?9G""';y C|d5+07I"NVBUZPmXBߣWQ_P{s@E%a sPawj9l'Q'(ݱawư; 0)șaK"aGaG301 L Z^~(Ӽ('b1s01l ƒ˰Ű˰"`bV,>@DDDD ?eIENDB`PNG  IHDR ~6ze IDATx]xǕ~ WR]zޛ-=.9\؎\KwI.N.Ŏljsb[Vzdu*(bA{pv .v$ fSCUUt+3 <V<Cv ?Eg+-qB<;ᙇg&ix\A<,ɭ(qPr(_,Mxt9.W:HR W* Fa m@y놨?M (Ӹjyt"jRMC36\:3~>À?f\\P Z`DC>^2WF}!y50! }gwLM=,m0ַ@2D+LA=:)+rR`[a#|!وmbԈ|!gZնBlYUĵ0~8C /|sۅm՟D,;#Riw^ |_|٭B3q"ԌF //<+A과TX|~f\5-p!yj b|e!i _upKr%kAq8nWgy@~xy[f@~#_ _T Ps#:|5֡n@c,~e{<61Cz"W;_ny8|1RC{ėren$/;u#_=%.ˮ\Ba\v}I/t ݈UAy?!6Jn?,0_ҍ&o3и?LVNOn[v* S_^T"/Xm4 Avn[5A'o,Vs4OແPxqQ7x,:OTE\l`;rRuq =1WarLx2 "| 7:[Y̯?$Joٌ0Jm}G0Z}pvP6 vQM"/,o=w p ɁGvHL,n .|fT<."e [N1ա8$|]UNgS۩w &k,)_Navэg6FGmjtOyP\3 gn؈ˈ8 /V_m5դni f:˹T`n+ZՅtO>qdftC3+|ҍ@8g[CT1ay?_mh\a tT3긺+˯d2RX?/yu7U0*`a5z[lRb74uQ]6"^un|F|TD7"Ð@7ri &À"0\?$\F/T1|~T'>V8m:u_R >?0z2gSh.<^j6~ AEiM:#~#i}ݵʦƒL}XDAkruZI=+X{ÆwA972l?ok"|q: kCR:/^{yB^FFaMa:F\&}G~*ld۪2+ h OؒQ7&쭅76WS*Jȟ~YKqEeΓנ`#T̯)AEFl^;:#5~a]uEt!rӽEu-8|M[||Bny]yʷABH'5 1uc Yp sB:8M0 0OYk*&@Ul@ JR22zN1 w4Vh 혯>hCNB"ߐ9s+TdIL|6ġ,KWHGڀ8$qx(A\fPO7Zhn%H'ʯ:q(~:1A:ΗYhi"qAhQ|W;WoU JiSM<g].\9]cD}[Sˈ zX@~Qve҄:OG#Lq?_#:_@AXHp4loC#lF0D*tW~HW gK_î.?F2hP?dF,?>ثξghx!?LD h sK{wÑ r|?D\F\ „ o?;>L Cucbuhb'>˂%fw)*r"cZ|F\ ̯dC?v@+Ldâxv:?(r.QY 4g|qq-v!Zs}2nz;\nÚh`ףkl|.޵mU wi]U '6#쭃4׿1^A7.:o!+)vEtC/b>? >cXk_\7Y VW!_<ix&Q^)Cp׭'aAHc]ʨ\o|_a\~>'ph[GdG{WcyJ݂zx:&K1H8D(rm=ɊpvZ7Eϯ%e5R-\{W \("=0ɖ7 YQ5 j.=5Y0&7[;~ q"\hHX%VGD|f{aҊC{6E-%~:+/񿎏 f q hrVp/p\QTЁj.`q Rlƥ_͌[+P JhC \z:bp/8 Jct#|YZ)1pV?|Et>Yb| S>Z>qFh 'r|M5^u9e?tϧ3:o?y;|:!̯ϣ?c1|%G{,5Tg_;7"|-ƕlhw?oeI"SpAWlNS6av W+(80^.o3NHp6^+8 ^! -yכp(G,k(x~8|G:-d-#Ep!_7h7*#^x- `1cZ a90]dM%v$aW1(A\3-Qj@m q.Z.NM \_[yF%Z[ǡV~و(f42b $48G‚pipqh_5,C'jnW&-Z6A\Z:]h/8B p}2 j;p~c>g,Z3W)R1q݂ȗ-ڃqkŐl6We?$Jc9(21$nڗݰ"u.; CĵqiV~ʀvS8}`(8sP?<֯Xo.#cܼQ;#_Rt@)T yå1v46=k,[õW$B\-S|݆~㢢x~DqH\o-Uqs~W3ZǁKL\>2k%ܰ \aA~i"ϳqur}ou`\b7 4pmt":pN5q^&CN!5 :~ m2$#t邁:?oaj W&:~&Dz?A7|Y-trHR\zuy\dRe:|M&-nzq_z>=tVJD7Nϛ?;7N"7롓>I褏mdSAx trg?$;o|Z^5 ;|i|OV8qz4x\d7Qypg(%G{`1?QCp υvW~dnP\KP u'.K_dp8D>濠O "_%oĥZqH/t//e:|x`ŗoמ:X/4Hi˯W~亜v kԈø&[gvV\Ku90:~ON:oz5( d×Mo5N n^~]4?La'tqW&}^̛度_ٴ1??fݵ`F+%$KXm'.Z.x_XB\z ߖ?]|s!OMZ<(7 nru ?BЍlVzSoGVQTmٚÓ`YB>׭o?vme)טE _&q%ީA#_[W+=|!/2c:jxC}ዕL"~zʗ\d+(.z< {w==WOⰖꆣyHn3'!MYֶpQjC p?k#o8 IgI\UGQD㐿|MeEZoV).dkO-૞Up~uqeAjUl5Fh]rI~ŃKG0VW.ݨ|U;_Qu9f2_ Q]>ϳ!ȩ8qR\96~~ͯdšV~H?J7DeV7Y~' GYfUqh?4룬e/Nʧ|eėY?o%ݰJC0|M:ﶺlW[rR[SP?GY}{8_bCNp9># }e0|r\cen R|n\cMsט\nᾍeP_b\>\" >?| NוjK__Ek|(.5jXsF\%2#׸>'Y {F6nGS>8\adMqQ\d@=\jnz¨nЭ \Od0in~`p).E:_|KxpY:|œ_Ⲋ/'0Q=475'AUCuh] 5Py+r,ɯD=t?kٕ$AYt%/3qh~=ao̵zoȄ+8>!)_nQ7F~.##?O;Q mF/QzWy)P:.ԒMW+0{_N \zΦqJ:%=_qr\)•;$Joh T}~ckI rfQȮ*aH^Lh bjX ͂ /Itbh ?o>2ܵ@yDq%kk9 T}K!DRP1_y\>:!'eY~Q#_G)7E8q4y#K "e,sx^gF<6Uvuz|sE BZYb2h[k).Bv53̉B/3Ah_DT&vE,5 ̌_$,^](_FpfS:]B岀UG+L\mdW\;XЉ]h1?ԟ4jA\ Z8XLzJh \tFrEVSz@/t^cJqUǡ+|eQ2KL]6_຀Cpt+|>M/eDN?x˵P.\ |vD.)x겖n,ϛͯL<_ ,fkQ|e~>*QpÏc풤Sݪzʗt~ bԳMLFx.l8 BK8&276MU5v?$]50:~q0-rٱgr'apC2ƕ1uCkR'q\PK琝&v 1s_/ʺaRʑYr?$ַ<_g0$곑]W6VA1'1 FLHtcF(Z7ȎXF|"#>jcGfn8˟Dm~ |K&]>*Ѿh+C ǖ*X^uҙ4 7q_Np=@d]P^,eWmR\huDud8L/|:fh`q3_8 5uDp="#gp _ġVB$<SWn˓szn϶~5h}ft#+οnvU/O6׍܉[r%f\DGZkY U"uA ;kE|/Q~ۙ_AٺB+|_M꼈/.U'*_+Leg~ +٨+]XP&W|8w xl;+]*?/!}:9m}0\k25uW-N¦^GIOz] @zc2#qm_;k W`L>\adr9I_[RHxed[ǕD7v,_dBptI\vL5v!~#+d=]Ep1Ǘ}6SEuͯF%WYzx U.ɯ@<~>\]`~}D];=!꼑E_:eҪSWv,~n$:g"xnQzxKဉ.űAyag5o w ޼C>Mx-dK͟쨁_Dݧs=o>%j.ͭ4\yM|Yx{ _-}M=.ƛw).R5n}#s] 5ޗ( w}\N?~7*ع@yD<'a[s}#r Lġ0<.SqGm5-Ћy)K #L7ӹ5^2̥Wx•jܢX#K-+Q\Ag-5\|~xCg:o_(_+ѺT~P(r*?t*DzVC[_aB7.\fJ.qH5iDǕUeVԯd(:F(zP_vxЊ, .0~[F>*8h8EՇwL3X8A)vY]6F-VY Q?z;!W}vGRmcG+q8_9\w!g\64DoP3EF;(?wYFT4![c>2UE5"_"_%P5SC_2m/??;07)%eoy=|}DJ;pY6o>:>y"Gt~m5(-υw-P2G!!_GiΥ%.KZ#>J_c^t=3Bm׬-r7CkW_3˞o%upUjC$muȀGG\?R"+F :6GyW' F :l%od~~FGv-UIf 1k9{߁z_iY|\8\İɄEQ|W]5pu4N\ p=;uhnɍ_YE_4ptX:;Qb+nݠ9ʍ?j( t^ׇ~FǍ(|%TK1J̯Xqn4R\N ^5Z70J|/-x؅uHkn$/ֈTA%ȗ-~~Fqi#.E>2AơQ\f}QioqGYX5Z/'}8FX&ˣL1F"?Lpmu+Ap Uu2(5|!o|!pq98_i_94_6WS+oGRb _4bu#n6 _A!__qX o廹 r__ Dyq} [/gИEt \-Vc+j_,OGVފ>jD~ eHi4DC78uzEPF8|.A\ 2!A]dnu1.p0wƃk he]; h.}PO5ppuYC2Y̗P6ƒW\~epvDSA~udF\yeJew\{cC{HO+@z.WƬ'lK:kvq0-2CC+P_CӍݠw51Aq&%ZS*tWQ*?l] Ȋw+?N6"6`J_ߖ7[Wnqn\gh/~6e| /_ WwK>Kಕ/R[GpFɢ8勌1ۿ^E]'^Om 7jBft"iE|%5=ծĵz _7ps3_׫}Gf +" 8:LsFm \כm?J[:1k/Wo;qLc{})_C qB^b;߾d*I@|۩$UY+V.k1T c7.:qW@ 醝|%_| 'zk 3Wp]b/+S|э!C~ͯ@|vC fAq3Ci\b@7Feu]F^~H࣌h\b\8u>Q?84{$Ug\ a_d\жX/Y \ ``6f$GCWi n"=ҳg@zĤq7D/j =}kd}a\7pqv 2kſp_οfF7gk0׋\̗oV^ԯ$- f'wD~KgJ%bmJЏko3$A?ko3,>@P?l_Dud1NgC>kld`=q׀Gp`~yx"q8%&;z u[dCD-}^7ɊCMt sᥝ᧲{_%?i8%Y>*ӏ+?Lt(|I7G4{a77σrH^Bj:|Yяr/~M7b|n3KۏR|ccD t'Wq]STc7pR&_k*p_}eC^9{ƨoɈkl$>`hj*WELN7Q i`7srD\/>1hX#߹. |uXW$b,iQeዏCэ!kG*ɯa@7{."Iq5Lj"/Cq$iC:l/YtQvq2%0U\A=?ύIODv\M3C;ϟnr,ޒY)Iu% I[|}5 H"\|nD]'ef7=~ _8u&=}IcFM^\2&_%|TXu>/?B߆uxDq &BF4'<<Ce$Sq$_UDMu)ܼ9%cYOl<oAus { ɇYN=t8_bq6٢ëzɂG:<4pn@yL'۴-^EuH\Ur/]ya\lHg'pD\;L,.k×WˑO6\&э4{unHWa:\pn/&ZlypPcqʹQ?fv:P7,`O ƫ:/ _&עEb'C7evѓ7l\Jj~:@ 2a2_C\> J%WJ93/z,rnT_C $݆_$Rݐˇ$2?<WWV_'`Dr0_C bal-W~u׶x~_f[|TX700JMJ*<ͯi\>X:ZH]|fqqD5#7ʥy1}` x\Ni80=z(ą|MzWX7qt2y렎?`]%+U{&Z?tC]&?L:GY1t?3ַ?Tھ`S%U:z<"~*3t۔ʒ_v޼ f >!Zt>F|w >nq'_y 't:G .8 6sd\w{Q\ʦVcp-D\[CI&4gqm "_&wK6̅..>tυͼn.>j7oJ*W'+՜ntL?f/ @!Y0$2]e O6_*KZ<)$;Ad[~BS4>ě 殥ж u+ zK=wC:(P,|I5pGC \8GqpaftEpCBCnY(_"~ieKշ1nfq]i PͯO&/}[g oM})"u9é+`҆vDZgE\j9t^"_wX5ɸ~~ ,|u0(ntC&ܳZ*ׯ%k"kz|vKxL4y7m}6_ qoʤN]2_؏rA~_Ft[Gt_z^/]_@=AP~i(r<ɀ0ֱ5(z_؄iSA~ԶuJ&@kl` xӕ{Iz$_QqX^ٍ{hKp3 -ȋNyW"Eԍ]50SėKp5 kSH_.I\Q$0yŌΓ+!o Lh])K쑺^5&I/SqHI|v_fq*9).=w {. @tCF?)B2qգ:O:. Mr~@P%A7.\]^y83nɯ~!3tXcpp~+qcM'죺rZz2A\]jgh"ߏI( =᫥Q<`ptUPk;_.çu0[u ᅼnȤZJ˳9V{@ |h)f|Х}Wv%?q~)}r+1&H͍DOYM~ڍ_tїK7==KQې~^_oS R3J7έZ'G" =Yu<:^_Yx䥄H]7ʰxSaͱsCC0-4񨐍Nx㹆 _#\ cqơݸH61|նtJs.ԍn`~@~&S`Q8׀!댄:O]!_ +tp8D\d{Nu>)o_ 0c\xSv\=ۚw@g\&?m:%q8ÍQ]@{ OGǕh-^KFY4t[QJ|GUG/j}J.wH?&?-/Q9mumʮaOZ02E F'ح/(rcTU}]J, $ V\>׷U#!_QPlaU.E6Yȗkpe×ʍS7\+kRખ_cQEUu 5 5ߓ=\ *5sn rjA* |UIKa0/7뼨.˨5tJB\U꼛qXeps*zo \dt5Բ2P(k07(󔯭"u|@p|m礸.'ٿ?_(20:+={7rW&pK`j~|I.{tN}2aGA '焽7}ў= +{\Hvda/{ר'Gl|уjeÕ=_=|I8)U'a~J-C 1J7m|eW׼@z t^FqQ 0ӍBA~ɨ{9 :/ hA@ȃ|e _IAx  U"JC7!zX//ր~ͯ tʡc0M/n'7)!.6e[/ɑvd G_ra?e+ pGtõMB\<+'e~qA{,ϼQ7v5OQ\<=^xKP=P|<"ÌqCm_ >SJAO^HhCHr) qѬFa1JWZǗ!1}ٛxDsd/?s[ _:ޱ+(|CRзi27|Nƕ>@ 6J_2a_^y/<ߐW8ʍI2S8š*(!fTĐ]J|Ҙ/.Ղ|J+RE3z{kGZ%嫑Ņ| ڹ8h ɆJPy[EڰP||Km_2<+M(z|خVT߿̫_)#l-4>>3R:>٬BnY\2/HjxFXz|d W]H+!W~CO.)b4O+Abhex97|o(u-m;m;h/#}!fq=96tRM~W9b>Zի<_)z KWEqIW9!n|%*ΐ|ŪMoDO7x#d!Ɩ/;l{z)T78mdQ#}X}Ur~W6|$+V~y(KVha5<_RC//?^^Պ//;gytxRێxδOIWk7#EV\)+]+L%ί/q)CTYqZWɻVpo'UͭY9ȯq$#nĸ/Cp =T$ƥ~ ytg/ġϋ.PsWP=~uQ=Լ8+ţʨnPPPWg1 yQ7<{HڏA6Kb _Jnt_|D`ZdQB]ҪR<ȵ/QDA5q N+S6\-ЍU M.aC?%d+U8Xn%f8r!9~F $;_s`_hh@ġ|E|@7/um 5p[`c{q)nstC $"^ ~^0jYl/t޽:mpC{yn{|zGd=~/N0<|5Q~ԶD%Ս U;Z2Cړj?[`tH5(hJE_Mm=U|n*VWTs.tS̓ ;Al&ҋ x`"cedA }&ntnx4{M+SMi#~^Oɪ.@yӘ0F³ hn 7'Wj<mr4ty0~}<:fH7jAINx#Xސq {#xw |p@kRaG:/**SDtq)>8*K8ZndW} LLWlB\ӍL@7$ԍ_GuYaCKtW|]k#|񸪽 Pk]ӬD~>2H;8tG{ +2ԼCda;:/#_"wr^/^DqdIɥpwPU_[Q-GxGOa}e5.JZtVS`1]!;3MM<1.mUA\Ql?i$5kpeuY~XI N_"w ׼jʚhM%cNZ, qEa^*,aOp2z('%Kjݠu9)>LQx۠O&쾬;|7cuYlf(CAm"P~i3\<Bup U)|%l50q$8#M =?jtׄ39m zHp|U1؝LN$)JHfNUQwa:-H_|Vc&"!_a?/5UB\tэ)2醆W``0\8$w0fHW?f8, ͇kz;7|Ϸz`\M}#z=%MзǕ:}V_2?QE^l{02 c4q8Ũ2ơ?yӑ;, @ l?Gtp7 |ZB"n\0: `!+M&tW0="k~M !) Cjxҡ ٮ*ms[V8h_)Cp9 jʵB_R%MU:@ ,_YqE:#n ty̱Q( )U]X\ΟGnaP?`eFJzf?$ 9*%1:#@\]*qHU8. ѕy2ոtn:1%:fddXڷ':pEb,bR#w6A%C^7t,>7&cPpuӣO 0:5$_$OzܺLB\y Fea:,eŒC^7*HOƤN~grW~ɥ"W ur:D9 $BwN/9ErΈ_2ycuJ΋ӷaI?4pEKy=napi醴zZ}ʈ+M_&Q +/CZ}lQJH0)BV?@"r 1(ø|}emJ3uBn?NQ4XK4qx*wOg(A_d<7GUtXġ+ 0&G,Z!M~hJ5^ 8X2ẍ/VOȪ7s|X;W P\~K8<tpI׏%g 8R@ NypEjIG_4Req{'w Zl^cW#%5H/ߓ]牧DZX_'jJE =׷%0.aPoIH'VG C?$ՍӍM=9 ["_+9T:?@P:eE/v>Eq+3.?W q8#q(rNK|Ȕ_E&P&=1a:9y{Bl?SU5= Xq.x$Zi>k$P%Fv?~O>=U ϒ.?(2%%Ai]5A6p=\{jW,C xB~J=-neͽKԍ!29F piSonN~]Iq=pN;v7䲁T/C!_OFt:@5!ݵ?&[a{ߏ] i#~ލz:.5BO|\?0%.Ѽ6 t#EG78O~DdG}|з_QדװKy=fXz2#:D7FH<(Ei=#]w>`Qg|Z+/}{I"u)k >qeP\&qP\$"Tk hYNˁ_]ɽOEVN9ꀵgags"OIc9\s7W5P5<~g}zj0G؅#r :%׼Ug`GKl\n4Sݨ#VWg!f\x||(_7U]W ۸zgtõ:| Av 08@]ޥk֯/.#_ ;]̗qeH=kw)_&)"ZEx7Re+C;}u0yZgSQ[wG~OQ 83 [3W)sRk+ިb=poTwQI.<,_~k*B4E|=|šq]+G.VU ?cj8~%6#OCWD|!vGƮ%ҍgP70nvs|ɝ`q.% Q]ipR~QwY28Py|ovy >t^k rs+ GvWjSJF0@=. |HG5j2]|tOu%|\Wµ_gcpYK|q-~a@7\%04FqF]V\viB / B\/q'Ðn:npC˯t'<9r |iB{D\_^&C7N5MDP̗qy쨁yMM<[ƒ?ָx| R.WcE<m>K6wqNW8ĚqAIJ%c6dLEpsw~7R{g3cu:!Q1 _/.a  cVO.Q~o8d p8IWWDS\ y! @瀍e$rݖջVY1씻ʛOj5sܻ!WxW1Qւv\Vc#Cȿut-zؕz}ޫz \!hpXUo¿x&+dzy6͸k{ޓxy#]{R~fkA _/x˛ﴞ.v\i#D\WW8 ?wL1aFpuW8q0} ?]9WEW}k ?n HwslU;+>[ڠDxjgЄn./y!+>^T ;NÈ%9is'\CrŇWZaM'ut^Ϳ75zY_пso/_jz_뗈 ;v ο׽|3Vu(3=O*^.¿;|_B[d8al`{]0,~u/k+CW:cԿ.쪄VmhMx9/k57Dqiyw=8z!lh*p=^nnuKͿ8`t}^ prɝR 2US(燗ob'ta"|=Cf6.jb*.ky짘+zzʐhcR-~aCk6 :zTH:\?|C-.Fu^-١fzQ0a+9 aʁ1@Yz%3:rNp%R>cT™(._:軨Wܡ; /:.3E2w9/,"")z'hz |/),|6w< e\ Q@:[r$_ 2E>َW;'XyU{Gi0$.ejbyMeL_"aoN'd/p'l(U]P|..׸|1q-!ƾ0(odB7…|A\|r8@tE:T}n|A;l!*.`A(h4sgLdQϟcQ _Gw5>hwI;6[( ׵bxyKLu¦P5[1@5(k~2\#S`ºP0v _kuۨifp}sv#_}v8".-, q#_d|5 _ӐUP7t+#\L7u~jpX] =d B5.3ߩЍP/5qm~Ga"\}0gxE[yi!5( nҚÙ_k\}v|MⅯmܿP7$u>\R[ ꆚFs Ho\ec e0s@._z:R>M!L+,hncOkz+Zc^hx||my{9|EƕH+))pbl_wqQ ıbpe~Z!暜 7r|E!_sk(IQ29e/̵nUz)|yʵ:c%KX <@:Oqj&vR_ChYA-%m%?~Zvh$v\w(4w/IM:/RKO}=@_O;ƿ[_ayfanpS? y/u05佯'_|cAⲯomFpʧS=xxH6#oe̾c .zfy+W\e*|%xd|)p ;ܢx9a|eDžCܦ)k< yZRF" ϒD*`UUMUzfU0,_˦%/O5|\PCq] +l2Tm8p|Qqr/M4cB)$rGub5R樛rS?P~G{S.ǕIDq*|'x_9j_"25c\||Yͣ{6)e)?L wCpA\:v|,~pKU˨r7^s!SUYs˵e&?&ע=:<^^-˖BV1~&W+=¥6*|r{Jkk9,VNfC\!mn/V\Wz|xxp :_U\q+`r S찆١я'"Ov|}|h_nmH+ė.OOW M~HzHJ('ڬ+=__V_V!.#_ok]!p/ XU=dvEm%`&_:C*mH qD\?v{{)|8q}~Ҫzg#_noƶuP `WR5pCjocI*L Ino3^6]@>@W +F$,,GnPBt{Q\V@H7ᚨB\ Ure+)0.__~W Wҿ#àC}뽨&zJP+~h%?U)jl :]}"Ol:}"+Bgx:}UdnU_/E_Y6؀!/}P/kVpqSuy-;j|y'r)?tgg@'?/P0Qs5rFi.JG™F +^kOw5E8x-2_9|mp"jvE\=_J?f*E׾ez2bx|^&|dᒛ4p^".W¾k_;G8f;tM7QT -*p1_j:?i+ϑ|%_kUzlQvJw א\כ`rQX|`&h˕vإ[lk-P Jȗ.ɿziUEڨkA Z^燈o5*R\HbZE:fYkn~+mLצ{u3~BU-w^dz]B\alkm-\wm4VyQ7[U7P+@\r9T%4B TW'%SZ*6-+.-XҘRߠGą9 u!(/#{P߈UX@B+]GMSeWBi4xlJHiL2.=0mggN\6נ$p6sËb~؃eZunVC02el ܮG1\N:|vhEq_kF~&CN<_vzE\Nc|ӊ^R/[jDgs\>΁j-V~8݃vGZ:KOnLQ'Jwmu ;/yD| .J㩶?A!@d#4Md{7[6ZZU}_kܛM XƗ.rA⚀g7_k5 4+bJn᲼IBCvnĞEML"Unnt |1H qZ4&3KjpNluPñ_ X<{h.UT!v8A6;+@_ o#_](ˎ׸|1p qeenh/G 6zS/Гq @\!Im/@5UM1q9.xxx_ K{½k#NFq5q_b ,O9kuto?EZxh-P1}kd5?D\ k5\l"<ف0~G;i⳨_㵳pVe <d_L?'Mdz_{!V? HFpJ|k_Wl˖@z@u'`=ju(;͗:QN}=WCzvEqꌿl_/CI򍃌ft~f\vnc0?ksї|NW |P`↽0iGڳ/#\>fƃXM YqQlՋd.|[bmՓN- :`3. u8\jf|t"u쐞`*vulKrYa~fnڡ8;4fp+7Œ0w49up} aJw"忧f[X+GX53sz<$W||g%,n1o$D|~_ S &Byd? wk\I|i>[aiZiGԍgq-\ |f|8?Pd7_%7Bˈ ]!' =$ xpl~(%ܪ۠p$>C~hnKOF7:`r=ԣh>,PҸrp~7jbuCV O׉_^c>f՞|+%\dgô|mrH >b/n8Q @WyK/}`_򾃛}=Qm_ O9$.)?|Ne#F0!nF Gȣt>辞n×py]|:g:D~h\iJ77OYңuГ*'@)YD"uMNO䧰kuai<5*?S2g;3,dzZL" MEDgt\:$_%i1+Վ]+s p :>KVf C"•jifV1|2;av _gvȿJQtYKҍtU̿_ $;$Ne|j]XTή{ ̿J4t>Nq@ʔUԔJ`,!\L7䫌|bPt>WK飵0D`7mײ~A= Y\.a:Ϯ&WTx`"Z-lpzxJf5<[12: 5Y+g꛵}ړ:+e?.6Ag0=la(r4&1q =nJ{#`]lQi'Wφf華%8+Ip'ǡ ߱pC%Gjpس*$ b /G4˯KUR q& iB+.">mtE#9rZ狗쪄'hZEx4Y=¸1 HkL\%݅N'N[C\ރS k-bڂ6uZޚ&fAuqEgɑpt);D\cۈQ>) áqU'nu0A7tuݩj.ˡ)I31̵q%W:|NԲZy+h67r\SS ͍d`pDR4ęٺqa(1_A{}M;`vcSI֍ WI;lݴC+}"+qվۺaV-n҇uL7so _ϻXmVr;.[ s\C Jyo +:o5?4@`|z2fgD5EwNp\;_2b%/'_U+&tC?8 g^; {&9gn;I 5@8xK4<'J: ~{ƿFqIu<˔Σ]߷nHw.':2t~ g[L5sm׋RKJ#>N!tnQn4_ML0hoxթzs["_/nƴUbp{͸bág, \W uj]qMwin:Q[N"#WZpzv|=>v{dZGdT ϓq%z =W, /r1$Nj63c_ t@πW4 ̬'{(rJ$- qmHߢn܁˱]OY*ntG 6լnSH6r]zT[J|;k{R 'utcxwh:d}-yo8<˞p_˾u\mk>@[罴Lt^-%AKK4<-{|pc&\! 0҉o)NpQ> E<\a ;hCMA: __݃ૉua3GzK=H{2,oaf􎇏^t5n^{GAmh ^dOB~GNQ657;_ZGu]bS4#q"샣p _Uh+S> |і^Mpݩzɍ֒{k &A+WN` 7|J#"z٤ AX9J^1. ן;۸ pu}$|׺AU둯AaM* Hp7OWUn>PZ7_ܲnxf l:?$"x-cjww56d|݈nc_"s3QǕėOYg0C˄s3/O|nycW$vT&fǕdJq+VLF7ƕ\ಱ !/îl%Ⱥqvz!NPWfA;WgY \X\>_=lyy2 >]_>ކt׾^ V ;el8/R|Cp$)N!İSZr>0-Fhf(OI{oZ"<'ie ƣ;iedzk =ÕebE|U1r+l1#yz_gW'U૑U*gNDfZ|U2\~[䜯vd+^&t^W|FǑCmwR,C\+xu:sh5>U[Rb¡46 #kcB8BZ+.j6ήlj G\=r'm|5DAU6 -|'h4I .9Ͼ̶ymېruq}O|t<'hf|e#pՙm1(0i Gԍi?r|-/0!+>)%;-XQ7NƆڔ y+q5b4jTÉWF:H[rֈ ߢ__%.E APk!\d<9?dgoMBlCn,%G_:Su%-p?D\1hwYhS?.q(<{gUu,/cB/N׆:@F,D)r"*ǕPgKacxq+Tg):_Ru(zoEmЩK|IڑStůjP +=Y!P}>at>T:PBOdT7_^HJ|%\CI7:D|^'*C>lMz}PQos΄Χ*: P㯸[_3WIENDB`PNG  IHDR66EjIDATx^/Pqq6F_`|{F7,6b p@a㳇'/ADDaFB[DY֨VXA`[T ][pЁhRA˖D͠ c-e[__-n[3.Z޵:a {TJrO?˰ (C&Y z>c QWbP+aGP 1 Nrdư (C6Y `vrO"""""w; B IENDB`PNG  IHDR66EjIDATx^ԡjP&[7H"~jBo0UNjb B!GJ½qO8ݘIڇ1,K,[֨b0'B%M*mzZ$0';WË-q3{Tq`K;<6F]z5*lR@z. 3 ce;+AaK0-YvVV::0!܇o(] [Q֮`=;9G| ciIeXbXeXf_1(;{gq{QKٴWIENDB`PNG  IHDR66EjIDATx^/A[X/"yv`|Vf.YlXq|Od[,N!Ԡ#ѓ{Q1,AeYZTΠgDU~DuW:5' =]kCs-Wia;ua {a*'36efXj0,|qo01 2 kٗfK.7K(7^1a [2dm3e0e3,ls ʞDDDDDTvdIENDB`PNG  IHDR&$HIDATx^1kAF> XT!6AA4>$D 66H%Xi'n|d=V7)yRvҤ-9PbcWHZ¥PYczcJI˂ 3(_Idz1HF E0#v4}B ږeI^dúnm~NON:6 n @RjEQHkK lޜ3!!/aqZeIENDB`PNG  IHDR&$Hw D~xxMbÑ`E@*VRQDy/cJh_?!i[$\D.r$6GXŒqFJZIcX.Eby蒱g,\dUS[Sѡq/G=_],U7cNrTP&9ul)QʬrK31c l1=6NDR_m%M  6nm|Tރw"PRV!̩Q1U 0j>{ J6PKON9@!IENDB`PNG  IHDR$$K PIDATxA av m¥' H've BA Sˆz,7XD1CHP!$)2) :Zf ao#h–#L6_ @UIENDB`PNG  IHDR$$K PIDATx^AN@q<팩+=MPHH8 yЙB5&nwK?IWS/C SS"[v⃦|jmۥ!Qc tp׸y5/P̫W󽝁{_Fb;Po1$[@4b-'ԏԞ pRyKP p;ۺ=L9 :vnh$׆vn(u33J({b7*`; 29@!%3yjC Sk<&v-&Lψ)&ZE(Q՝'r%qLޔxEdU.D4]%#UQTmWP25գJNvjuk._/ۏRIENDB`PNG  IHDR$$K PsIDATx^?NQqJ;؁'.5zcBɒ-,捓l&.0 O!7yU!p İ3DToAmHh;CPX,_4`94@^K=r(껡{};l\+Qq^8Bf_hJ )}Z:P#E*<Tl"0:Ht[Poգ&C Ee*ԏTL)'TX"᥌T(l$MDJr :Bg(ڡͩ[)P\bîIfh(2Bj&5PjeP 3w`~-RIu+E\&a~p> 'S|IENDB`PNG  IHDR szzIDATx^NqFn@; !ٸ{L/2--_D7&j P L`LC0_ʹ3ΐt%3|?1lX" j0Xְ!j'Z„ ΡŪWka/# .8Ԫ( KjiQ ߬ ,\9-=<ܡFCߥBеyr͊92j˜>ŐV"Dܱ;O|p 8D@mY#`xٜAj\~/1d^^PYcŨk?Eni(57!} _Rx̆2f4 j` N&{UHvNSXKg ju q&}}!5 Px<[mmxmj<;G`րZ o 4K\N>Kjg5(wOה\І.8d?jF;fϴL>nnX%|:~$;ɻ:P6@Ip}@Es%?Wtx qܤD&F@5M7I$uC7CuâZ &IENDB`PNG  IHDR sIDATx^͕1@E7C;zj-P h!GAZ+ff`jo=՘=o^^x((d k꼄I*I=fDi42ni4'2Rt.oà kW9>`GyckPP e(l5qdF%Enn:R0- $Qŋ$^ea,96P(X@E T.XW[k z乧IENDB`PNG  IHDR sIDATx^U1@nXhEoc+H-%ZxO>AY`X.\dfag9S=P/iU^a~ȪȺ G ĀU: Y8Xp$ i_X_1C>۾\D1(vp4atS==6JӒҵ&W.:hg ->̻`͕,pO&#(r#ɭ,_&^d9Pv@E T.XW[o\KebIENDB`PNG  IHDR sEIDATx 4\@ /6`BfHI `BhpׁFÈ IENDB`PNG  IHDRCEIDATx^픱 AX`ׂm؁t#0]#n5̎'xO#SdDO ГQa*j$mk_ҝ՛ qaR朽!N4p80{۱GI5҅/"aP0zFIENDB`PNG  IHDRCEIDATx^픱 AX`ׂm؁D&{05V#AAxh12AhH=I5*M}f%Y)Kn/eD H'h$Qsy,]:!Fq #PIENDB`PNG  IHDRCEIDATx^픱 AX`ׂmX؋XO Zo'iGKNQ\BHhBIENDB`PNG  IHDR`` PLTEuuuuuuuuu5FtRNSK&QFIDATx^1 0:Nd'|ī]1AKck'HD"D$"HD"D$"HD"D$"HD"D$"HD"D$"HD"D$"HD"D$"HD"D$"HD"D$"HDsM?lbIENDB`PNG  IHDR``j PLTEuuuuuuuuuuuuuuu1_tRNSK&$WIDATx^AmC/LES)hNd}~/{:::::::::H A A A A A A A A A A|og2.2UIENDB`PNG  IHDR``j PLTEuuuuuuuuuuuuuuu1_tRNSK&IDATx^AmC/L*(ǟJ Ds%{}|߃#::::::: A A A A A A A A A A A A<*IENDB`PNG  IHDR``j PLTEuuuuuuuuuuuuuuu1_tRNSK&IDATx^1C/< P00*0Ul?:׃Ntp:8Ntp:8 A2E!( Ad CP"A2E!( Ad CP"A2E!( Ad CP"A2E!( Adhw"'IENDB`PNG  IHDR`` PLTEuuuuuuuuu4ptRNSGIDATx^1 "5] Y3ܼ Z[``\ oK X攬 hpbn. O1x08ү kp jL0`wsY1pX@&YT8`j(PXp|OH"odsʏw`y58TOvrY \/-//G76;hXúY&{ (cg%bFL@om"0 sQGκd̿[@+ͧaIENDB`PNG  IHDR00W{IDATx^=NA) 1<j%5 `m*J WPY$j6;>oc ~d?ޙq'1L"zLqh#3,kFn[?IENDB`PNG  IHDR00WqIDATx^?N`.6TWL$$l`N^U; +(&] |:7ӯ5{ AS+ ؄=4;-G)(+fW9\DL[=`O94z |s<&PpqG} p(oL(I3#ezOUZ[Y.[Ї;/Y`ʈURWyx۟lhLD87yv l[k: [LW|5X&B$KC4 ET!c.TQ7főIENDB`PNG  IHDR22? IDATxZ TUU> Nkehi-\=F)SY-W& "LC lt-_XBqF " y?./Ξ;C( Tڬo~!v={HPPxKeeeMMMNwL&v#P^^2h0a6B}|L 7_y5y"쬈/Ljor{/~E(11hVe_Qv#N.GabuQ'u-FF?~lfd46Bq\V<}pR#q w Oõ*n)imMmo"E[mfr&{A\&+̙V4Lz(o*Fulc&}6\@[`S2l qH;$v67 3b 6ذg!Mi 4̏ ׺ֱ}צ.n@[UjWSEcUJ|!q'< %Tfm3s )3^XVS4$УG8dS0 κɳA6 ae36Yo쎧[GQ[ D3>!uC -w :TAOKJJv:t6[oRoP#./Ε' c;JIe'cPȯJal7.2e\62xh^wo~J^|o.LR4rpz3ά5 ܬǧ?]˴iӤk׾"3ja6K{Hߠbe v*h" 50̠7\jkJioܧkҭ[X/ IF#9sH˖-C]}W^=::`VVV,v\v".iqK."twt'8Lž'$$x#2bĈ;׭[`K? L>]*ҠAA:p>^^^ҢEs c-@ ]Œ %D̈~I#Gq [Skjjk@ $wqw\ܰ5XFN<{nǞZJ]͛8_\!~h?IENDB`PNG  IHDR22?IDATx^Y pUK ZP*Z(`VES- RhF* "%R!{B $ l/dݗwN5LjL=3ޝ=<)5keu@dʕ4C|l6Ns%@\vww655GG_CC%Kyon>&iBggVy= qV?VVV$**'::ZHHHMLL^RR2fy#LSqV ]`Aƻ!.].\0 ׿( 5b,c 2VZ`6i<]2ʘsf{;{BB+vK!a愹5=>scH9ܹs}̙#QYQ1c+X%ۥVv˦e]R4]dx{Y jd;Q^hkm D4q3l[FR%'˛6ɳKYdԩmx{Y=Bzq `GM'QTX8n^w"ncJsyl8rD}_\d?H F1KK=98V۝,EUUY9?#06RKmt_*Kl9<#iw۰aPE(Htlc2 :9JęED՞=-?_؛p>x{9Y%e#CcNJ!C|4adpA#z?7;mƍ:W!.dkBE"J6LɅw]#8{picmgʚxɂg ӬtV6:b'Q+KvqK-[6CӃVL*|[ׅ4H$֬"D *inthGEFK3ɵ'5'"_=W˟:84I:/PA.eCFԓ\`=hZkj "B{CF&EeU}A!q#Dw8q@C ~5553QXn)ֆ ݷa.D=(`d" @Gw˂UعYz:Q&H]#125 裏2ڪqm*@cPsf<`C (&C*g t?//<䓂EM|a&J֮L#:@&"ի[CHv4f? !sI0I ٌԌ'\>P LC @K ;V.ДPu-]*<7ӉP  *N>ЭW<0وY#Oj-"Σε<>? #|buT/86s&kA ٸd'kH#ÆFFGzTd s L6#5p ־fAA} ? 3f/P(Pl딊5]9F[K_{KІtZ, #A ɀKl9uJaO }MuS{ƃu y|Az>:-!+4D(y &N*wL%+lFvܪN h)'J4YM5, >=;ẂmXت&NkoE #; Ns4>maIId+7J RB6nv.CTi:OCPGK^CDגa@ O @ل-*!vn}u"M:.a1 aD~LCǠ6H-yV-2#l](vj{sN,T${ BeM02* @ Q!hs* [3; d (+uR򃲃Zj-Ŷ #4c:1M&eA4EvR^HNѬ/dR T܊|f"A 1 DDLT\dlt GCdoqԇq @ J a"/"$˂+%d.?(7tQ4}f,lӉ (MQP0j=?AC(C8{<ǟSxl+?D-`8muu׉F:((4@P`{kH.Yw)YkI]44hq:oTXkN>ydX[ggrP2h DMpO8 9Jt %t*ga&N  -E)l|o~ONyiMM{cKvn(W)=2n-inCE͚PAyרhc潱m߶mϺ&M41o޼i,f2_ !802H U,ٌ8DlanuǴ6i5H 7b߶zj_c-Jlܩ<"z Oe;XJ O{R Xc B8|Z\Q2 v_}UeV>N+n/((xu3N/cBnQ lѝ Q充QiRR;5MSGEyK#!=#ARb=G{?2ThGCfG/GmL/2Z471,2ZZ@-UUQY2 W9Rj`v4 x$ R, [ HtA_ZݬL~;v,MuFFƝuEYYYbL"㚰pO 9O?-B OLNYgD-)!?^3f!ᇚ8Z!PPhSPtȖـr ]xUC 9;[v^ #S /'$uuK uf?^8uԠGQ;k BJVt{"ÜF\7۹sm~uoׂjkƾ`!-.׆=f+3,Vk&X_M֎kV@?LKKc 7B9}RSSyz쐐~8h<iq2;#` NX@ H '%%^vDvkT0|ehlٲEٍF\\ܤӧO/,--}'/BZ{@^(ߢ& O@x뭷~=nw. $ f8T-0]>~.nn62F=^EINܹśnK箝S hTm?އ᧾b4I !"EŸҷ k:Z>@=}d +E P#a7D8҂ vIENDB`PNG  IHDR./ CIDATx^jPyGCݷu&Ku[S.CG.YZc3ߦ'&C|I bK7ia6,Sd qF s qzf.@!LċТCK~/gƻ]A'8 ےxB F4M;Ox.L'׼<\k^yy&˿8"S=IENDB`PNG  IHDR=IDATxc L , @ePjIENDB`PNG  IHDR.]IDATxI0DbL )tc jR*aQу hw`v:61w @~p^\!_8HKk@kkXde${A ;"4 d8>8 AM&H AFJ (1Ox"Y*l>lS5'T (<`~ɟѢA\;DZׅ1P%$5$qei\51}Μ 1'Hu3~nܝ}6w^rn[u܂x?s b 9OpxIENDB`PNG  IHDR@"IDATxcd0D  { IENDB`PNG  IHDRnIDATx^л A F]/b#V[l8#y9gG\x@L6t\x0'GF-K$lp0QnP9+ns^ ;sW ۈi Y/'\"IENDB`PNG  IHDRnIDATx^ν @E᳻nARؤIL):8 AE0rOg Olt45ՙmie`CM? Nzlf-Q\x;qBуW#Q\|%'Oqb61/$/^R>//_%IENDB`PNG  IHDR./ IDATx^ @ D16UuA scgAB?Y4uz%TqCk\WE)ރ4=DS4=@s4=@s4=@crB69iT=%5]/\K]IENDB`PNG  IHDR9f)iIDAT8 DѡJ(X*t;b8n삳1<ۙ20mEpϡ1idmjcl 3lKس``]$hs>:aIENDB`PNG  IHDR9f)IDATx^1@F0&@\ p*wDW EC͍{2K#2q q#nU8g.*-d܇xHC7%.ė,N#s9sqG+E-%H%`hGŀ!K ~1$2_ 4IIENDB`PNG  IHDR9f)IDAT81 @Ek-R؅,@bPqV٘ p *' iB@n}|9Qu~ήm Eh4n7o;ոƽC4|G.z :,!eqN+HMh`HwH1$|/jrIENDB`PNG  IHDR9f)IDATx!0@7@/Z85Y%z1\'Y --Y=;tKԓc1o ǝXH Nj# R/Kbw8x c-0 7l>_^%xlڵf%NoVrxUOf[!IENDB`PNG  IHDR;0IDATx^1 @Eb x O"*FQA KQ+h-ؙ{|> #W{SB}a OÌ!!q96(-)8bg&GII3Qʀ.8m¸ p5a{4a kx0mge1ٱW[[]3IpY6ɸ'5vn٭hIENDB`PNG  IHDR;0*IDATx?/Aݜ\ɉH".قƟܷP)Dr(0j%%j+zf3l37H[1dɇrʄwL~>%+p7xp"&ڕ]E$Q4Ew۝[S; Nufw8}c.8ֆ6,N gdx9sC '8ᅵǓ.XO>s+WH~Gl#_i &`fY$T4}̸:8ɴ#PNUq4!Ԅ_] q6IENDB`PNG  IHDR;0IDATx=J@F“'ik le~a2#i&ps;cz/m `ɧr L+GH_d/yh~9pQw As{`:S|j޹Aƣ0•W8[.tj֫ORhT]GWIsq蠋NmX@BaޒPOCa#C/?2P/IENDB`PNG  IHDR;0IDATxcxbEl@< ;YlX1t0H/ Y 3Ty 2lL-NɣZ.ٛ/&@˗,Hicd,4oeؘXPBY= nKU,CIENDB`PNG  IHDR;0#IDATx1J@Y"6ŠUw`!x -ьAu8#n40 LȬZ*W`:}:̴e+GVuS,K} BIENDB`PNG  IHDR;0IDATx^=@{!D"hcca7Ĉh䖖nFPu QAgpFl&>2{G7ą8\ZEdS3h&7 QIAb@DBJFe) baLIIENDB`PNG  IHDR $BiIDATx^KaGY݃Dj͸֭-w x:(vPOR (B^# ]f>,/ev "s~fa?Hܔ2H^nmg)Gm˰Q4*!wq0]ĀRg-y(q+&)34'/5 5X|y 񖈏F$jyV>ϷX&l9y5zާ+b>-z+B FxIENDB`PNG  IHDR $BiFIDATx^J@@ m+D&iVADD,E>^K5=0tfdQhm&QUTEyWUboX8tXSkiʧä|TApT)a^iA Rx &L݁w h>bn#'txp:7`1aGynBM :?<ٞp&MbvR1IN4qfrvyE I4kg{obADD:Oӹĕ&qYLłh1AWc/'"bH%$0)_[;P~[ƮqMyiӄ7mKx}IENDB`PNG  IHDR $BiIDATxݕ+aeٛ Gq Qe"JPa.aRJU24[j;0>n_TKtJ]B˛],#8y+ݿ2K5(1!3D$^IɩCI1hS#CC4U $+)3Ѓ$^&1a\LQ`Yx7}C .U6=t08=}qO_ƒ)yV{#YFDԧ>;?J8Sԧ[?TKd(:: ŁJ`5d W%l;v,^" x ~BHDWI|O ky3O  dZmNDj%& (Mif"* wFi4MDxYAzTi%rIENDB`PNG  IHDR $BiIDATx^?kSQC.jAw!(5S&7`Ҋ 5 AD|'.PD(B()ziդGBn{PD).oze&`:L7 #=6¬@8Ƕb£,|c.`e+Wyd ڗG|UQm| /Yޠ:'pgJDےWfy $!9 pq~/8s%zriɓgiPezܓj_;Wbo^HP!M4OU8oQD@~!tAO^=ţRϮ!j B4sԏBⱾ(P(u=ˤ=~RqP&/ H!( ް-@݌G tM_ $@ <_2 ix.tBYIENDB`PNG  IHDR $8IDATX혻QW"O %q齈 A$**OՋuutb&}`&9>b"t>3mrO&= q@ omeYZm:z 5H[@c^mHpppp;^ɥdjharmrˁÉ|*/t@ E"Hk"*OGH69< pL}IENDB`PNG  IHDR $8IDATx^MRQ 'A/P (N'E` #7BCPjd/Ѫ e \Lf?,Xks.<^ʿp{޻RHqL]w} ߡt(r@{D`0&po:< ~M\tI6'@<ge K <[@لG>T KV^łbHd6033Á9PN@ @9Ul6x^J%V ,"|>3@i4NC& )P"xV& lCP($9b^W7$Lh4ncee KrۍZ&4lLXDD"`$_[[Vȵ b1F9BAȵ ;;;#) v@.Ed'?Ok9]R^~I&9wOHW[|{s{ZK Pk 74bF1pIStuiJ8(r}IENDB`PNG  IHDR $8IDATx^KkZAbCWn6VJnλI*ua[i"P,K ]DAW.E*DƖyE X(=pHR,$ 3moockad2$rA\#BI[@"Ztpp@l?ggg)9ΙLH| '''R2@lV1"?pܘɷ@D)=pŀşFGk9p} }P)JCp<|KlYi"r\“1 N Cθ?ch̸1 αCT B!cT#, .ēIENDB`PNG  IHDR $8IDATx^Kkav/QRQd=(B+p!Ԃ !6 n **[q$ql)Yf!w~\暛7$a=}ѠZ&08+)`lRەdpo6$pHmt:) p;vtzzJ\rxXӑF!ZMBq qd2 n2T*V"nnn#p8r `ٌ8XR*Ib1DpHXd>D'Fplf',"#dz,å`XE*E, W?Z^ X]l=%ax(`7\ķwRf7 XWܼ>мwđ XO_BaP\IENDB`PNG  IHDR $8@IDATx^헽J@F.C\M >?(ZV>`+nAfrLd6n8pϙ+0}Vwͳ|Ȥ y6N7e(p_9rc ip'eZ?e@ icp w otHHHH~dn`-ןP/Mp=_U0$(<̈0ܵ<`te&fVj&֥ܟQE6"bS3YG~eC:XUnhy&p?J2 -jIENDB`PNG  IHDR $8IDATx^!@ajz &p 7$j0pj Y [0/)kTxvOv:"n8w!弚GB{48o'UU%2 @1@1"h@9Dh (@ P,Y^r`u mP)|?iƈbi@+vNxӞ6 ߾!0)bIENDB`PNG  IHDR $BiIDATx^?0M:,&L Lp' 'dU4]-no|gHr\<*ɑ;yEܵOSo>z)lTnazPo@8xNf|ؿ)NAl(R2e($ݏ%D(@ kbIENDB`PNG  IHDR $BiIDATxcO!.001SL^p?⇲^Ca?xhC€[@g$@W0€QF 5`ԀQX(? P}E܀GJ6 1Cp%Gˆʕ bAR4Us ’IENDB`PNG  IHDRo,csCl0`MIDATxb?=ZXUX\\Hu5,Z@\K5 bc4KAb#j5eg[vqli6Ȗ %2rS)(8Jk$"Yp2kPSR,Ē%-"Q G\(g#IENDB`PNG  IHDRjx{csCl0`MIDATxb@m@0j訡t6AN](RRBW3Lb.=iêUC~>\yy q܀4 hܹ ))M$:̛ǐ 2D tiRÌ 30 ~,Ѝ/L$ @s񺗐aa 4(Ni(CC M[<IENDB`PNG  IHDRjx{csCl0`MIDATxb`c@m@0j訡5IA]"WmXwBdsly~,^H7b88Ea 7-(()ߧM,,>uA5kάz$fabL@79{ al"4|w/C9b&"-)#6.ђБj(@GY gIENDB`PNG  IHDR |l%IDATxc+o\pI0ᒐ%C?cagj&IENDB`PNG  IHDR |l%IDATxc+_\pI0ᒐ%C?Vr.IENDB`PNG  IHDR |l"IDATxc|+C\pI0/Na7zIENDB`PNG  IHDR |lHIDATxcep P&fL .CY6L nL Ff db`K/ %a.WIENDB`PNG  IHDR |lIIDATcg|J΀EBU4+;!, 7 #3210I$rkPIENDB`PNG  IHDR |lLIDATxc ? i%KOwRPPɚPx$˜P p)a9HJ CbF/:IENDB`PNG  IHDR |l+IDATc `c`a)Kx\v%o$:6*IENDB`PNG  IHDR |l)IDATc `f`a)HS<.;xC7 3~IENDB`PNG  IHDR IbK IDATxcP8/YAHIENDB`PNG  IHDR IbK IDATxcP83I9IENDB`PNG  IHDR IbK IDATxcxP8y1IENDB`PNG  IHDR vIDATxc qJC$)<IENDB`PNG  IHDR vIDATxcg oÓIENDB`PNG  IHDR vIDATxc ? qJ2#IaRIENDB`PNG  IHDR IbKIDATxcQ8/e>IENDB`PNG  IHDR IbKIDATxcQ83v^emIENDB`PNG  IHDRB |`IDATxα @@F'D\Wz TFCg]W{ <6Ii15ODiB` HzL HMxy 57Qx4L2IENDB`PNG  IHDRB |_IDATxλ @ \#;۠\L*6=8Y7ጻ:|Ǵs&y-ڼ@a\NFJB6P\䍮|IENDB`PNG  IHDRB |_IDAT8cX32 QG鈇YQ1-:y8!9_#Au a` IENDB`PNG  IHDRBFIDATcXtɀ GׂdsdIENDB`PNG  IHDRBFIDATcX?tɀ GAJIENDB`PNG  IHDRBFIDATcX32 5)wՌ7IENDB`PNG  IHDRB |MIDATxcb`9bNtv jgڵt.ePĈt , ($21348V"IENDB`PNG  IHDRB |MIDATxc`8110aA }2 t¿`p p DqĎQG@lA*-IENDB`PNG  IHDRB |IIDATxc`812830a[t?egCsC:;@gC!04J#v:L%i皴IENDB`PNG  IHDR |lIDATxcπPS Ŀ8$~96<IENDB`PNG  IHDR |lIDATxcπPS Ŀ8$3+8IENDB`PNG  IHDR |lIDATxcπPSĭ8$x6ϷIENDB`PNG  IHDR |l;IDATcπ0P_AASRFL IDX`g "UL*+XLIENDB`PNG  IHDR |l:IDATcπ0P_AASLtfNL I &X`g c`*&JN;IENDB`PNG  IHDR |l7IDATcπ0P_AS}fLZ07/vZ0//+;8$@i$IENDB`PNG  IHDR |l%IDATxcπPS Ŀ3*]$=/=IENDB`PNG  IHDR |l$IDATxcπ01PM Ŀճ@ K ,XͫϪIENDB`PNG  IHDR Vu\3IDATxco44 ٗIj"Ih9$&PIENDB`PNG  IHDR Vu\2IDATxc i<*iNO$ӏHo4 VY .AIENDB`PNG  IHDR Vu\.IDATxc|C4ܺu4 vu?Hck`B(4+IENDB`PNG  IHDR Vu\pIDATxc?2zp ߿ǀ77 0318'TwAffFDԼD{YX832 w0C1HC!@ d&␢IENDB`PNG  IHDR Vu\lIDATxc?2zp PPAVF3,Ҳ}8٘kQwlea GP### bbVb4 L ! EQaYR.IENDB`PNG  IHDR Vu\qIDATxc? ֭[=zٳgx(ix!q~|<};w4cL ? P&t&@M|9##,40B5@&YS||IENDB`PNG  IHDR Vu\:IDATxcb1 O$h"1Di` 3p" Z;,hIENDB`PNG  IHDR Vu\7IDAT(c"333 `0j`ddܫi8=UWTO?"I4X v 7^{IENDB`PNG  IHDR l="IDATxc? |߿ϟd TAIENDB`PNG  IHDR l=IDATxc?2zp Pw錭YDIENDB`PNG  IHDR l="IDATxc? ֭[=zٳgd PA|IENDB`PNG  IHDRB kIDATHcX`ſ߿֕o31`1Xx+^(Ć+ i[7/7g@f_?ܱYFi z0#+( a9 `3ZIENDB`PNG  IHDRB kIDATxcX`ϰ߿֕o31h`1R<[W~3 ͛ P []_7/7g@f_?ܱYFi z0#+( a9 DQ0 bOIENDB`PNG  IHDRB kIDATHcX`gϞ kѣnoW?.0 ϟ?#% >|H\@g|Νg.#΀7o83> YGOg@f_'|& xG\# XF( H%IENDB`PNG  IHDRB +IDATxcZvſ߿֕o3L0Rr~=kIENDB`PNG  IHDRB +IDATxcZvϰ߿֕o3L0RKȅ{MIENDB`PNG  IHDRB *IDAT(cZvgϞ kѣnoW??N/ޥ;#IENDB`PNG  IHDRB kxIDATxұ EQ+RKֶv1P@=ÿ[5a &v6 9suٲƘbgdE1!T |Bx~:"B2 A)B >\ЩIENDB`PNG  IHDRB kwIDATx^ұ EQ+R 6b11F #=N^0/hWAʷ$…Yk kJ.bIy0g <B!4cB| 1oIENDB`PNG  IHDRB knIDATx! FaHlr &4me y5-tc{/D2[A*DY1,B8$AD !]CZ @|疨TIENDB`PNG  IHDR Vu\*IDATxc?)`0jAߤi+*/ޣIENDB`PNG  IHDR Vu\)IDAT(c?)$`_$Oh`#Ci8+& $IENDB`PNG  IHDR Vu\*IDATxc?)`0jA[nÇixوa(XIENDB`PNG  IHDR Vu\\IDATxc?)l@cXlXXq ̌S!&v/Oc M j< @f&IENDB`PNG  IHDR Vu\WIDATxc?)l@cXL2]8p  L q_ACSHcIENDB`PNG  IHDR Vu\NIDATxc?)l@cX d~ŚaGbAXYى 4Y4##PF= .IENDB`PNG  IHDR Vu\2IDAT(˱ @ ј(R Qt`lǰ-HwۂT6* IENDB`PNG  IHDR Vu\.IDATxc?)IphŌ P, *ĮIENDB`PNG  IHDR&$HIDATx^[UU}vtt33/E=hfv!Rz0!",,z*"4QgF訓6gf{]bpyr!(˺~k>o,) aՒ.`~`oF,"„K/GVXN(" ">=nڸ-/F%'S> 2m #g*WQbnISFh3'j 2DCzpX-%XNֹϻ͸~FZ`& DpI<1X_+NMs/>UljSSSu ;hm"݂0,[B(T)LxKڛ:Y|iT-޶%Xv|1gv~b/78pYJܳr5QL6+(NS.&17J:·ʐOF}\05&z\[Ajo :VOcesqz1ޒSv<11V4Vհ8}G*;"c*?'9p+ -Id۸h4lC>KO.:>鄲ѩ۠% -ɱ(UR ,ڽmm`5b5.{[l)L`ZT?ZH$!1={zw**W[h 2k1W.Fg |Pƒ0z7B[ˑ < Q7]-8!"8~:z[G)FlAgb1^zxbr@RP룴*CC9`:pYshn M³b TkA>JwcC/ϧ̓;'2g+)%O?v14Y+ٲN=I(1Y72e2*spSuK*f W[w&I)k_pQt .|Gf,y(wFT)G #FS-R ':G901r1$ ZJHmQ@G`o0ܸx[QYƉ𝏑&"w\wM3Θ0A`4V x8h`łpg \}Xys5.>p+b,  {ko\ qKIENDB`PNG  IHDR&$HbIDATxKlTUޡRQyȃZ dhqC ܸW>acD>D##1&ƨ b[ 4SΝs^`:1ړv~s˜e8"?VaQMP rbZq oUnl| x fAND#<^qA}kJ^+N[GĨ,>YC {0)o[})[Ǝ :ؾ3~U,C͑ q5ɮvѻ\=MZGك+đܮpH9Uv\1*(6#1 8?|9[{K+W4;+d?i^(rFaFJ;53 1yFϪ%7twQsyXxN1MEgqʤVԚ>Aک-}S|MKͶ湑96&Zlq9[ߜҠ>}w3:ؐơ%;TPeܽy/MReKɭ{+m-G'0aUsT ffu<2ʊ+e VACTƴ^2)vńf} .3$f:&MNNM*E9X>>=X֔N>Y^0>;u!v6} `deO\l`iδClx;/4 'ywhfK t5=pZgZj vgpBnwZ_+NĦ pЩΡY>itt4`8]c1w^Z8c ,+bKJE=ruL$V[ҁ#ڦ%[8*@8cyQ,~NC,q'`>fb8ԬU ,c xgE-؟=b#o IENDB`PNG  IHDR@4=csCl0`MIDATx^Ԙ銝E=#nŨWaPaРH ޔup\ɥ)36ֺt^m@Ȩ$5w4wFƨH5QlkK| p0 f4F"w>nԜU 8V V68S Rw>ZػD_MCQ#7x2e$;po abl ۙ: P%7<,xm!^ӘkcS\ZVKPD55 )߾oUw69Z/• ;"QCGԭŽ ]81;C%b"->GA*fз|uf) x.\ݫLyBWhZ5#o~T%1'd f(R lp7(o|O *]F{4oRAl웇XnfjDz5PbVbqxR/kS+pl **l{Jtج{ܺ}ltn,ƚSUl!TI˜xݭ ŎȯRdAnW6wV+v1GQ.EX'G}:> )*5lQBnp"O[Nf)gVW49#QppX;u@둼tb7#SG1ضmo" |<0Zȋ^Hlͩ28~I^BU~ny؋lXʚRzJ'gՑ=L~gff_G3KbS'˷zCp`v;='q a[r @IǢg7b!1e$ D==$ޠ>}ąsoJboƷ<||ܓ~d7RTƱ \?M GbQÅ`P?-[a*!`E^#;F'nbͅ$ # ԥmp0:k 8vd)Ec^W>!& M?>̤0cE$Qmɓ't8|YlMUM쫻$fF/Ղ 6{`&k:Kn~rl_Ä)!U[q՗Wp3c(vq؍xŚN8H}T\Uy[Y!<{\ǪWΠQi7Y QY[\A.:g 9 P{*f`+- `!}X)3VeɎ=;6c:Z 6i"/V(h @!? xZ0G׮]S$P/k |H_(KBnP 8lI҇iYJIENDB`PNG  IHDR@_XcsCl0`MPLTEݚݛޠ᜵ߝߞࡺ♳ݟ᜵ޝߜޡᠺᚲݛޞߚޝߛݟᚴݚޟޞࡹ᜶ޢ⢼⥿夽㤾䥿䦿奾䢻㦿䤽䢼㣼㣽㡻⤾)CIDATx^Ir1SR9N,a[j] 7lm>W.Z4ǽ%s RU4wFhH/_YӺQČ]l&†qa3Af3;c.D@ƘA!0B@ Jiu6W?vٯg0(*| ك/b@ Q"_vKekץ7jmsV滽lFZ8Ku@PP LU#QpEInzu= T&*^I{Z.۷X;ck><7~:>>GhD:j訡 E@IENDB`PNG  IHDR $8IDATx^kQŝL晷JE 7B.E.fNq Uwn+DHl\wۈPB$ Ƽ_~GpIH2wph4.H(iʹ6P 0)~xiTnp8A1C jYHeR,Ͽt:__ПEz1ONV}^BU^xM$x Npj,Wvwvu/s ̣Ox3M_0< ]0ϔ{:Œ0v:esT`pwtr_`5.F\>fW X\`VUũq@hst0gqg5` 0ͦ",.V,?;} X\]i3`qA^_ӺSbxy6^F\-`q %NZ=YcېI†a<7WcYx"`H,+'h\tK8 o0&I$j4{TTNݔ77 ْq!4QUUd2hu[L{^>BYLWpS_ Fa鰀1C jу^B$)"늢RUm )p5e=n>S~a03)k+Lk b5n3Wi$$1*z>`'IENDB`PNG  IHDR $8IDATx^MHT]ƛ1{GPBD-pQLMGaȅ?6.ZZmQdn u!sEm`PbkFO; ½zQ%ƒ9;sA2@i" *uqn:9iQDD͛7oG׿<<< 9bK g1Szii~ l'ȥZ8NcqCCc0d2 AZ8nJxhhKR6\p1+z ɩ@-p րM 7FhR=,72])L&ԔD"^) 7ԙO/T8nQ__/Bhkk#& w \XV>J! bբ0zzzD:Vhi \EoӢGT <# *gt{n43P5088(:;; G>F-FHeE䴶* ƀ_r@{{;93`t MȈ-@K@q`gg'jYO4@ @Kc\]]x )dxܔtc(51ɗNM166%tD-b}R -,,|S2^\\T 7hi Vͽ3s5c3 4juzc})h(OCy8@ D\z! NQtU])<+p 7*^p;UUOb})& .8ViMxl6[}F?N}-'7Z8 L]+xON|,b1s!j5+WPIIl[.y$E$"1s!7WcW 5fAP4'pU`1r՘jfbG."h'`1rL} ߕ1MLIENDB`PNG  IHDR $5PLTEggh\\] ``a񧧧ԷӲ)-7tRNS%#! 4k 0A B  b_ 3\-IDATx^͓z@Q -Ľ*ĵt!ȗ=Lc(ZN1Y0d M6b9@\WE ۓ@"81aed!RMcb_-(ph\x iM/bML5 ]7̮q"RI! ڈJĮ"+.u 10VG|Z> y0 ?75=bIENDB`PNG  IHDR $8IDATxV]HQ[;P /tI %iRSS^X7v 4nTؼJEPa^h`OG|sMv}眝)؉⿁7GD Yg yۄBx,q6`2!Mښggg/bA.jP{,gtDdr}}=Ҍ8rQZp$d-v{aף»J3Zp KxF{ڍḍ\ęrk(..Av' &`08)O8 \۞nhD5h: J8x<}bnh@+Ҁ:00Ti󬱱 V]] `g@ Ѐ4 (X=khh`_u[[a M.@Z2*uu5 Z0+++cMMM.+ x`###]iَMVWW!.7Nh@$#Z.2t:q TUU @Z2Kfrjkk @+;=!w[hЊb `yy(i9cccB-r}zz5 BnBqz{{֖5 LiY}}+4"s#!GAZ244fsceeeQcu>CbА$ hLxnD1?F^-4H봬*JOR?18 h pZm͖'YpSfC#@ AGre1 {% n!E VND/{.p@\B0թ spp`r G-89%%L----`g!A-V.i Bvj^/2H Cry2q A+8Oy6y"q !E-\@O0|㱔$ )A$$[ fzIENDB`PNG  IHDR $8UIDATx^KH\W[ HѦM|DڐDZiIXpNhtp]v[wRp1](ZGy5 FՅ.yE? O1kY KG V<5IdM; -N&&&SSSG333/kb䨡z/kzfgg,,,H$E9 C/)87]PuttԫHBjAjnK;[Rw~ennNVVVH \F2 @`-M.;qO\pF<wumޞ_̏g[fc sE}}}R__/@V+1r1 7 d?~i9bEl6Kuu5`ML~ 8ɡ݁1vvv [[[HEEW/6M`M'7h x^?dDt^1rR^^.n[ p|ZYY9\ZZ242dEq jZZZ1Zׯg[դM?d؈P\PSUU57hlFv{B֦n 77.-hmmMz n¡!`B k@ QZ zA.pbkoo^=p+1 l68*Z].W9jWOn428==M: .AndddD8 HOOx<FګpF4z(b6W~rz{#9>>Ŭ Ύ^4Ҿ޼yU'upe:ӟ?,*199,Bp)q8n4b3Φjy0ebC/p 7  M(3Ɔ@j顗+ N*B[L0ϟO.C ekbPK/pTk}&c~ٯaqr`M5CA/xl<X#GL8.ӌ|»& j.PBBUkbyTBT,%IENDB`PNG  IHDR $8!IDATxMNP 0 !Mt7S=($Pc6Z&'s{˲֊2i@e!}/GEt:51Ē#bӹ5MM, L&9 "OT*G5\A,\8ܦWz~*d'#p%I/j'؇@…@.p p<' 8v5exx Mh(٫D_1h8`Z훹@@0m{n4r2PJA hdLIen4r2pH]hZa6[6|@XU!Bk@$ j<4gTn_?Fys 'ht&TC,>d}"Z<^)ep !Ę7-7Ж,8rk჉eߦ>_ޮ7C&xF Ɉ(NIFyʶѬ3b%')6?D@<-=IENDB`PNG  IHDR $8IDATx^MHa]5!P䡢2 ̢C^8bȃZDE^>5$ =Xb废:֗: 8{ٙWWq+*o:HvR/)HRbC8`'Oo5is|nn^8PZ\JI=u=-M CM4 c sA-zHRt u"fR LD\I7)O sZY?18!IENDB`PNG  IHDR $8 IDATx^Kh\UmSlbk…Ņ)-v@h$$$1$.AjQ݊!D0>DX)ujMk6M&ܹG=sn.I@|p8~=!"?n𿻼EɯԯtFiN) PCfU]|wіXcXZzH{Ο8mB2<۶cSKx'^ 3sdY7QӋ1_j8& x<_3xܲ,x'nqަ5FC7 ^ַ]7-5OފϏ6Fp"!ijjߏ9֌AB|1=ill2Ę9dvvu`1ŤAx%OuOO/$,. n||\"sQ2097=v@B?v|9e:beW1K v~ɷWқ:Sy :V}gs9O6/p൯ʛEs8@̱&PK SkCܩto[y7O:~D 1f5jGi@0VQڭ^1sQz=iǎl[+ @Yƃ8i]:[IENDB`PNG  IHDR $8IDATx^mH]e j}alVhzmA^3L+5l -i,* ZEAP2 ~0a%+pLV.FnwZr=>=s]s?Rz\1D1LqLz}G#oHԬ(S'ێчg='%`E8*1UeD:>e c%-@_\UIUUe c+RK_N,p<J0t`9fLaֶ` x%=K |k `C/oPR*FnF"ڴ뙉^tψ639?#`HV6L&W![v?_x><5 VU@;+>޻k*e {G"Y fRJmCjLmaGNOڪ ƶ"D(mr`M~FCYȨ3h`V3/CTE7IENDB`PNG  IHDR $8lIDATx^KL\U[ݸи WiRKZ1$@BW!Ia#$0хJCML[2faf`&`58eh sB]|}y9pDDS <6p<: n()GP{_~BBjB>2.__P-zeqqQ~?`LaZzîbvޟGdNn B*x\ rPKp-v ƛWڛT3%lzKqt%wfj&F+ \pOo[7pϼ۝qd}}e8-=LN9і̨_*++%''HUU1rF tN;{V+VQQ!RXX(%%%11)//_kNrh3}EL+++HAAc5F-K؏!YXX~``@t"*@\^^ iW(&5u'@!khh`LPHn424R.W{!+**j2b@˶R=5eee ~ظu{r ^-@-+oa~ݴpxx+xjFFF(;&{O{]#Y86ᄻWi(!wH9\ Z[[[Ξ8he2`1&YؐQiooa@:::dllL677pFcG3S]M};SNӟc-0#D0&fYM}[Z@ރ7}dY#pQ;/~LqC/p 7҉Npj;/H$Zzep wg^f7waA^.t%&{?*nIM&N ?6~ a ƢQkePp˹FVHQ^.eg[Op`YC)5ƵcX 2%%<}I 'JE!Rt /6[{ٕ.0JŽ}A-f.B`ɒ227صr;X9s*} }a{/ Bh١IdfiTҩReB8jEp(ܣpb`dlS2́|X>'=P+"V43%^fIENDB`PNG  IHDR $8YIDATx^KTQƵ6-6C\ Z . WFƿ 0ӌLP7)EE&|8_9CEi1|{04{Ęk穥^xm;Q`0(ӊ9j^,K.0?uڰމᐹ9 r=€l`^Y۞X띸$K€vdݬCқ  &l<2hb8NӟژH=a[ i]%P`tz(X,V0aし)6c(`EMj&WבH`)| 2 &l<2(Wl}rF"I#kϦ^`#ӑ.a:Vp$2G ˝Â ;C){UGX֍r" I BV7ܢ ̜4H1ݹг,Oۨ| !\cNzaÄHQ`].ןTc1G O3Udmv*UU-b5#WYm SiA%JIENDB`PNG  IHDR $8IDATx^kAݵn/DQ#&,R"VR =x1zԳzRX+(zi͟P=WZjM<_Q>bfMBv}~0j?Mӥ`t!]$!Gx̋0M {_*J7 cAmOCG^=]V5c.jP 7:{{{-0ܟL޾Q*xgVO$Ʈ2TOx `&\P(, C`5N.Oz; mEQ:YN\~W/J0־;"xRŶy`+@r`\w`KU\-t0 tbl%,wN WV>'!id*zA'sK^) `B$aקRVivI׍k"dM0s2B&"pt ~,F:mRӶt(^ԤD77W?_brsIENDB`PNG  IHDR $8DIDATx^KQƋ ABtQI  KJe !IxVȌ[ Qq?-q檢.˜#s/0- 0{a' p}v^gfX0aqRZa\g X0fI:G ?|>F&l<:*@4EY6xUȉ`;N /]s~~g0Yx PRRj;Yl<:}+_-KZ閫].&^u[&&&~.C1.@wwO=j^{{{ןiY6۱|]ѥgw,41,u|b333ߥ7a FFF>hhx"9 X0aq\ĸ\͟ZZza D.`4 (5v%5C/&,@9; FP_bkHQk $^J!vwwqr|LWCcc_?ڽ#bkPKzގ ꚛ bk #ӟf牮MRePtQ/*a35g:3lIENDB`PNG  IHDRo,csCl0`M_IDATxb?=ZXQc-%b!eͰ$8"RlA*O8$'~)*55h?jᨅ#B9:AIENDB`PNG  IHDRjx{csCl0`MWIDATxb{. RTxbⱱU?. ׉f7RR8`!PJ#h%#PƈA[MIENDB`PNG  IHDRjx{csCl0`MWIDATxb>>U?. ׉f7RR8`!PJ#h%#P#_A)pIENDB`PNG  IHDR@shcsCl0`M pHYsod MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_F(IDATxb?H 00Ao$cPK;@IENDB`PNG  IHDRJ'csCl0`M pHYs  iCCPPhotoshop ICC profilexc``$PPTR~!11 !/?/|pYɕ4\PTp(%8 CzyIA c HRvA cHvH3c OIjE s~AeQfzFcJ~RBpeqIjng^r~QA~QbIj ^<CSU*(A!@riQ Pɰ4c<ƧLL L5ذceffĶ]}&G''+g33W77D)ƼW  t|$((|X$]WtX8VIaɣRҺOdȆ ʝQQU4E9JEIVFu? Y&jX ;?ߠ0X=f+-*,|-lTmEX?wx^V/XkBžV7X[¾D0E F)EǸFŷ$Nܜt6y*S\MFTfU֬=9 | f.y[&QRQX9lZI 7k!}Ͼn¾';Nizb:f=5d޾\ -^qò 4^պZuMon4ԱVmSkP?y=-dϷ_t)זz7<8꧊f|M۟K?|T׼o~ϷU*oQ[ cHRMz%u0`:o_FIDATxbpqL HH -IENDB`PNG  IHDRJ'csCl0`M pHYs  iCCPPhotoshop ICC profilexc``$PPTR~!11 !/?/|pYɕ4\PTp(%8 CzyIA c HRvA cHvH3c OIjE s~AeQfzFcJ~RBpeqIjng^r~QA~QbIj ^<CSU*(A!@riQ Pɰ4c<ƧLL L5ذceffĶ]}&G''+g33W77D)ƼW  t|$((|X$]WtX8VIaɣRҺOdȆ ʝQQU4E9JEIVFu? Y&jX ;?ߠ0X=f+-*,|-lTmEX?wx^V/XkBžV7X[¾D0E F)EǸFŷ$Nܜt6y*S\MFTfU֬=9 | f.y[&QRQX9lZI 7k!}Ͼn¾';Nizb:f=5d޾\ -^qò 4^պZuMon4ԱVmSkP?y=-dϷ_t)זz7<8꧊f|M۟K?|T׼o~ϷU*oQ[ cHRMz%u0`:o_FIDATxbfL HHtEZIENDB`PNG  IHDRcsCl0`M pHYsod MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATxb```0?:%%/IENDB`PNG  IHDRW{csCl0`M pHYs  iCCPPhotoshop ICC profilexc``$PPTR~!11 !/?/|pYɕ4\PTp(%8 CzyIA c HRvA cHvH3c OIjE s~AeQfzFcJ~RBpeqIjng^r~QA~QbIj ^<CSU*(A!@riQ Pɰ4c<ƧLL L5ذceffĶ]}&G''+g33W77D)ƼW  t|$((|X$]WtX8VIaɣRҺOdȆ ʝQQU4E9JEIVFu? Y&jX ;?ߠ0X=f+-*,|-lTmEX?wx^V/XkBžV7X[¾D0E F)EǸFŷ$Nܜt6y*S\MFTfU֬=9 | f.y[&QRQX9lZI 7k!}Ͼn¾';Nizb:f=5d޾\ -^qò 4^պZuMon4ԱVmSkP?y=-dϷ_t)זz7<8꧊f|M۟K?|T׼o~ϷU*oQ[ cHRMz%u0`:o_FIDATxb (//\IENDB`PNG  IHDR@aP$csCl0`M pHYs  iCCPPhotoshop ICC profilexc``$PPTR~!11 !/?/|pYɕ4\PTp(%8 CzyIA c HRvA cHvH3c OIjE s~AeQfzFcJ~RBpeqIjng^r~QA~QbIj ^<CSU*(A!@riQ Pɰ4c<ƧLL L5ذceffĶ]}&G''+g33W77D)ƼW  t|$((|X$]WtX8VIaɣRҺOdȆ ʝQQU4E9JEIVFu? Y&jX ;?ߠ0X=f+-*,|-lTmEX?wx^V/XkBžV7X[¾D0E F)EǸFŷ$Nܜt6y*S\MFTfU֬=9 | f.y[&QRQX9lZI 7k!}Ͼn¾';Nizb:f=5d޾\ -^qò 4^պZuMon4ԱVmSkP?y=-dϷ_t)זz7<8꧊f|M۟K?|T׼o~ϷU*oQ[ cHRMz%u0`:o_F!IDATxbd0fP`g`buHw.={~hIENDB`PNG  IHDRHcsCl0`MsRGBgAMA a pHYsodIDATWcpvvv %C doIENDB`PNG  IHDRHcsCl0`MsRGBgAMA a pHYsodIDATWcprr2ÆH80  IENDB`PNG  IHDRlA;IDATxca@{ `^@X. L1 \t1F?B ^3:IENDB`PNG  IHDRll%oFqIDATx^jQ HVA } 'ſo)KC%n "C(fΙ%nzLtyZ̫3_}s~"O0l[C pƣlƽ.iSd 拑0eF= FaE5SAR!T'_aTwk{>;;X>֬A0AE8>! |7>ZAZ ٥ f|^ Gvㆰ4 m(LQ'`yW~r_4>HO\?\2,c$o03;ly{}񬫈X*F&X`#a1$6Qj4={h> |<68bBrWq?(?Gr\sDLwDMaΔ"~5L6O[@PU@6"NUXsZ92X!ټkĸNxmA؂!#$0}di9CzpgĈFk5rސFY=b-0*ad*l}YnAO`()X +\ #","VIEӊXr zΣEd2.BZyѼ: wc^-Y6qF o֌\=ϊC^z6ON5o畀~y]a @VYoy~;8K^q~x~~4Ay)}/O?mk@S.\/|f^lvC?",9#/1p4w0úͿ4fsUBaxb'HfH1*2jywf%yw_lfwR=&B\(daH"DhHP!H`’% 3.A}6`A6V\ytt8!kLF#rdJ?QDr;f "UbL%C3"1BgGWV*'uAL/1l:Ȓ#1V7 6VH!Izƒ\[!Fpz`-^IR.)3m"K9HMX` ūeR:Y9^{?"5.,/)$PAHڟ"(Z)5aR0/d' , .&z]K{VdTJSRTQ8`XzV RXB"GU4' ک |+PR=DpY=W„P:Ĝ?L"@'9Y=B, $G9D!ȩI=O)}ZXuԂĪuu Og9LUazXɶ p[IENDB`PNG  IHDRll0IDATxcπ!H q@&,& h)t!IENDB`PNG  IHDRll-IDATxcd%Hc A$ D $2 H&a ?k,|IENDB`PNG  IHDRlA6IDATxc@ȈE!,耉R@0c+k$ox$εIENDB`PNG  IHDRll%oFIDATx^AjA.@{9t oϣM;+j^a?8;;;;;0NL Ul1 환2az*F=0-irRzRlWb H RbJI aK+$i%)/uXΪQU')0-AQڕk1+Gi /cAxTY!J\x3X1JR xObRXN1YJiM9,ƊRiK0JHcR>JXJRY1 n]1g iVlYeƩ)Jl PA-KXrTP`WUta?E;LPC!0 2QwT5b*ӲsrH$fY-ΞGTa2DPJCE  Av9!a}WRX XKw yf^Lf9QΨ zW9.%iXLLbj@X=K@2xqk%1nS&Rp_1`L6O } >c>djAx&L}ҸY^U,aqYʶ VgbMdu'&ɸθXxaD+ٟ&>6,/xS0Ni /0n>Ua렑f(a70%Ԃa"=F:Z=t \k#DcCb9.XE\IұoS~v H _K&4r M Q c폿ɋ8/ˋ^698ê51f0ؓ!Øi &bL\Ʋj'hL aa2T`^c8gYn͉14B%trEÈ*3l_ż&FqϧVG17IENDB`PNG  IHDRll%oFIDATx^Ɏ! d}Q2*AOH`5#}5a kXְ5a_lvlK,-&ۂS "YH=졨 @VrDΣ 8 40ਅe#=?^n1pd18' I7$W=1{S^G6B@\NsgI/9 _7\BsXR6(9[@㝄܄~ cG(*NK Kp-]~r0UzI2 8^tAŌ]p~G:u;|p.Vn79UT#9ǭa)[K3"_[C[;KNX]~ahSd& ,h؎)!f$h: &OV] :_ l2˦iW ݀|Ɛ3+Ϧ|hUҜ)h], e+v=-i4V`7 obf$U^$fh2s=i<Ӫe8ϯ㇡م?>b'n}-zfۃw;)MfCXnšRWR^q'D\I͇E]q@K& =qHh=a"0`Hy$J`A|҈+q"/,)cC2N=Zb,JsS}0XaČJf=)k)I|d2Ά=[`*p"r|2c~3"BLY;XjA2X|ʄpde0f^%D@Lmİe~ʀ[21V$$63]hcy`S{\%^}ʄiH  0=%dzX >.$EL~0q*SƼ $hy`bqv[ L90iKvaGGr 9̮AL~㷁eHʨEߌU?x+IENDB`PNG  IHDRr>]N7IDATx^[[Uge9IL)T8hx@J^ET"^ Zi;9N1]. ˽쫇|Y?['}x3Lih83 T.9of)䧿p!?) bgoO2Pl8YD~J(6M\7.B.2s?pf-fЮ*"壸uU99E\WD$ *_vr6t\㸚#oJ0ŁnXx84F!CF$a[w9cCWĹ1#߭LE$aKC⾾8B=)rr} ySO{t24rd3'1| ycOb&{`93WDL@,$ }}7xUwLe8ףOm]|g@eW6KS|q]_[`:w[A0a_!^-ֵyae v= cм^>eOɎ?X8lj 5o2M:'N)ֿ]_e@b1#S攡b+7IzLӚ#dmL <2 1B f'; ADiE݉Ї֜jlis&B~Ȁg2 ? r%a (\|ːbe+ t:ᢄ|1`:-,GyN~'ޏk~Oi!X.F>Yż&:Xns,GwH1^Ȼ[@$[ȭ@_870@5ld;Iww2g2;y`, 1f%#$pJ X뛪E.#)G9$d+@X0ݦB %OY4Cӗ' !sZEWM9a=f%vG?B߮ E(V߈C-@ٖ/(ђLRdt# p e)gY-{$ȴDYw_gb{8IENDB`PNG  IHDR>rRIDATxKT]>gtСL-){BLH!袺.2LM*Pk t;sV֞4o}) @ĘU}a9owVۓ}4d:5b\(<٧$`>6s .:]_cxu,ˑ;gdG@Lj@1gq x6<@"ENfW X&0y.=?rRIDATx^nAP%,SK#p `; 3qViJ*(uϡm# .LvN]` ` ,w5l\H 7H!55ΩpE8'+u'mRpqv)q>.bIw'SgU(mMS=K,ܢm33ĥbWGvK?u]ƤE8 K0 gaO2xٌsR9t48zT(zqz*v3N> ec+eWgmr{ sZ4#2?3#/>]\Ǽ#N~pƑ?.Z05N# @[3e䇘:8'n͸8N^ .q ''`T'?05Vf(`}w4eL ] KO8=Ă_MB>?M9cS>&\c=c WEU<5 'Zz 7O2P&wuAZ#IjgZz [:~62=_!քSx=u],`jk[:o-8 k^&.aM"ee{]2 >Q[W@Z5/3/&X5a)8l%B("q9pV~E&.tx7wa:zUmZ!t2t0E*rm/Kp o ~~bi|qAI};]N7IDATx^ij@ іNSr-Pn *Cw΁<2(Bd9 {H"s$`)r  9|/HWFyɐ i uu6&Ng @jv'?ԕ@9>Y^QOuȰx< 'vRn?YNcp 4~[8;E W)6Zu EDZhզ HRCi1xw?>3u'Vw#IENDB`PNG  IHDRDGIDATxc , | XQ^GIENDB`PNG  IHDRDGIDATxcd"2¿D)Fk IENDB`PNG  IHDRi4IDATxcH $k1IENDB`PNG  IHDRF]IDATx^̱0}1M;MBԂf %ȹx֗y?@|v7K}ۜ)O E4Nf1j jD9"2?Tc IENDB`PNG  IHDRF`IDATx^̱ 0ы8@ZhdA \8N;~(vf2O&$6&Z Uq8 Ab@n!(txQ__:6 .Lԓ<IENDB`PNG  IHDR*Qg IDATx^A@geee Q+ؤݺm:Igx08!e #m2vwT< ori/ G4@;n䭦:*nQղ#7$o4hI~;ּ|QSMqL5{g< S~Y`3I.[|*!Ȗ>NV K8jZ(Ƙ*NV|ԅN+'*ږr(Ez|^/GM Ө"KK%dKުW:u5rTXtJأH* 9e"{ب%˨ƲS^'#maWl. ʣevըDZdG#X (}2*2L_\T6IENDB`PNG  IHDR*[.IDATx^]KA߸/n^HQApث;M]5ssw !$/?laȲC?Ls nh,y .h0j hYP3bpACBp@aゆ!P:|0J^HcFl Dœx8%e#.JcP2YN*9@iBTzPႂ WfO`o #\+eIENDB`PNG  IHDR*[0IDATx^MKBQҺ/Pf,ًdnZD 5 QEgQ@E@cD΃P)Cq8 B;vni)5 Vj@$# 8Rj@Qj@p pVO`AGW"aL<*rD 1S,2\ѣjth_Txe"BX o<);.@L?