ԉ* Db UVS=Db u Db ߿5Db Vi tj/St@أb b (i v6va)PDže[^@(#) $Header: inet.c,v 1.10 96/03/16 13:13:54 van Exp $ (LBL)UUu1t R]Rt@]Ð1]US=PuhS`SvPP]UWVS]SùddI 10tI10tI0I.NˍAe[^_]UWSEP0P.SW艫e[_]UWSEP%=tCjjUR&à t-0;PˎNjPW$EPWe[_]@(#) $Header: tkStripchart.c,v 1.7 96/03/16 13:13:59 van Exp $ (LBL)Widthwidth-widthUserbitsuserbits-userbitsUpup-upTitletitle-titleTickcolor-tickcolorTextcolor-textcolor1Stripwidthstripwidth-stripwidthStripreliefstriprelief-stripreliefStripcolor-stripcolorStripborderwidthstripborderwidth-stripborderwidthHtickshticks-hticksAutoscaleautoscale-autoscaletrueShowticksshowticks-showticksflatReliefrelief-relief11Numticksnumticks-numticks40Numstripsnumstrips-numstrips0Minmin-min1000Maxmax-max500Intervalinterval-interval80Heightheight-heightfalseGuaranteedrawingguaranteedrawing-guaranteedrawing*-Helvetica-Bold-R-Normal-*-120-*Fontfont-fontstripcolor-fgDatadata-dataCursorcursor-cursorRescaleCommandrescale_command-rescale_commandCommandcommand-command3BorderWidth-borderwidth-bgborderWidth-bd#ffe4c4background-background#b0b0b0tickcolor-alttickcolortextcolor-alttextcolorWhiteForegroundaltstripcolor-altstripcolorBlack#b03060Backgroundaltbackground-altbackground pathName ?options?"wrong # args: should be "StripchartUWVSU} }jhMPhW8jMAPRW ƃth V hjBÉ3{Sh8!hP辢 jSh@,PW?jEPEPSW(u@,1Pt e[^_] option ?arg arg ...?"configureget get"%gset set value"startstopresetswapcoloursreplacecolours": must be configure, get, set, reset, start or stopbad option "U WVS]uE}$jhPhM Q\7VS0ЍxWhRpua}u jj}u*jCPVhPM QƕE:jCPEPVM QEWhCP uJ}tjhPhV4F<\S\ShM P`WhCP uj}tjh!PhpEPCPM Q tE_EUPRV2 =Wh-CP u*džVWh3CP udžWh8CP u*F4F`j>V Wh>CPi uV bWhJCP9 uCPEPV 'jhYCPhM Q4EVwEe[^_]US]ǃtSCP҃$St78t2PCPu!tShP4]]US]t PC t Pot PnCt Pnt Pnt Pt Pt P҅CV1e[^_]UVS]1ɋt8tAClpHpLS҃C,PC0C(RPICPPe[^]U(WVSuM~}1ۋt8tCNlMIH}OLMǃ>MtAPP跡EPEPPP0ӉHPRMQ}}}]ڋEMI@M)ȃ9}E))؉Љ]jEPE}@)ljPMQQ}GPPa0U؉HPRMA>EPSFtP}GPP8t5$dž9^4|OSV!C9^4}SuI@,PCP6tShh(SWZuHCR )‰Й{(9C0t0C0SU VSuE E#E$j h"۽۽ۭ}U Um$XmP $ۭ$jh"۽nۭFH D@uF@E@twV@VHtSF8HP$u$$$Rh#S$SFPظ 1[^]UWVS}w4E9w0tG؋]SWe[^_]UUt?t6u-M zdtRZ]ÐRhu]UEP H PHPpHpPxHxjjjP@PR]UWVS]} uC PTdPPCP_CP8dPPCP_ CpPPyCxPPyjVWSCPe[^_]UWVS}OlqHqLE HG(OL1ҋt;tB։|GDO(GHݝG@ݝ} E 9G0jO,QVPQvVP݅݅D@uDžA݅E OtBЉ|f|ffXu w,XG8H||XfXfKxfL0xE M 9O86w8VPO|QvVPcO$Qw VPQVP|WIQVfL[^_]UWVSu>FlPHPLF(FE1ɋt8tAыFTN(])ˋF0HN,RSQPR]SjjW起 PGPPPe[^_]UE@@#Eg@@ܺ@ vT2]UWVSu}Fу?ЉF9sFF@)9r>SU RDPFPVE PV@C?9r11ۉ)PE PDPe[^_]UVSu] jCPEPC? 7w8x)‰PhSjEPSjSV$jXjSye[^]UXWVSE Urz}R Uj@P}}WM!#E Mxj!#E MċUV ډ!ى! Mȋ}9p $׉!! M̍1ν!! MЍ|!! Mԍ*ƇG ډ!ى! M؍9F0׉!! M܍1F!! Mؘi!! M䍔D ډ!ى! M荼9[׉!! M썴1\!! M"k!! Mq ډU!҉U! E8CyU׉}!׉! E0!Iu!M#M Ečb%E!؉! E؍@@ ډ!! M}9QZ^&׉!ى! M1Ƕ!! Mԍ]/!ى! M荔SD ډ!! M9׉!ى! MЍ1!! M䍜!!ى! M7 ډ!! M̍9 ׉!ى! M1ZE!! M!ى! Mȍ ډ!! M܍9og׉!ى! M1L*11EԍB911Eq ډ11E썼8"am׉11E0 811EčD꾤11EЍK ډ11E܍8`K׉11E荴0p11E~(11E' ډ11E̍80׉11E؍011E䍜911E ډ11E8|׉11Eȍ0eV 1ED") 1E܍*C ډ 1E8#׉ 1Eԍ09 1EY[e 1E̍ ډ 1E荼8}׉ 1Eč0] 1EO~o 1E, ډ 1E؍8C׉ 1E0N 1EЍ~S 1E썔5: ډU 1Eȍ8*׉} 1E䍴0ӆUrz}z j@jURe[^_]UVS]u19s+M DADAD9r؍e[^]UWVSu 119Mv21D D ŠD ‹}C9MwЍe[^_]UVSu] M19s 2B9re[^]US]M U19s @9r]]UE]UVSÉэ J ʍ J JS))ȅe[^]Usage: vic [-HPs] [-A nv|ivs|rtp] [-B maxbps] [-C conf] [-c ed|gray|od|quantize] [-D device] [-d display] [-f bvc|cellb|h261|jpeg|nv] [-F maxfps] [-I channel] [-K key ] [-M colormap] [-m mtu] [-N session] [-n atm|ip|rtip] [-o clipfile] [-t ttl] [-U interval] [-u script] [-V visual] [-X resource=value] dest/port[/fmt/ttl] UhX4h$j`usageU@]adioshavefont01gethostnameversionUWVS} u1ېVWUR) t#dt?u^ܐi 4؍e[^_]trueUEj=Pjut6]Ð@]UVSjVׅPi)LSh\VSS(<(<(<(<(<(<(<(<(<(<<;(<<(<(<(<(<(<(<H=h=x=(<=(<==={i Phx8Vh8i P蒃uh8,h8i Phh8h8V5 ui Ph8Ki Ph8;i Ph8+i Ph8i Ph8 i Ph8ht6h8i Ph8i Ph8i Ph8i Ph8i Ph9i Ph 9i Ph9~ht6h9oi Ph+9^Yi Ph79>i PhB9.i PhQ9i Ph_9i Phm9VO i PePi PV(49}6~1M )Ѓ~RDPht9h2jWh9VÃuh9hjWSh9Vh9Vyh9VnP( ~ PGfX8h9VB詃x71e[^_]U8@jh`@jh@jh@jhxt@jhh]Uh5hht@h5hx@h5h@h5h`@h6h8@](AAxAHAAA(BBXBHBU塐'01]UUE B 8@PR]U''hReb1]UUE B `@PR]USE} t'57'@P-PS'P耋5t5'1]]UUE B @PR]UX41]UUE B @PR]UX1]UUE B @PR]US]jS5C HCCfCfCCC C$C(C,؋]]UUE B HPR=]addrinterfaceportttlismulticast0cryptUWVSU E']EpBtPpB t]CGYu'][XRh@Y]CJYu]STRh@Y]CMYu']S$R϶PuV}b]CRYu]SRPh@Y[]CXYu]S RÖPh@Y+]C]Yu']RhdYuVW'2]CgY uW]S0U='':URZPWaj WDžuFpY uW]S8U='':UR7ZPWaj WDžOGuFyYu'Y]~YuFYu]S uFY u]ǃuFY uG]S0K4~ȍ ȍ  ) U4]CY]RhY'R0 '' uFYuN]SRuR]SG_'uFYu']SRSwuF]CYS:u]CRuFuK]CYu2SRS RP]S uVR]S芵e[^_]grayout %sembolden %sUEU 9tAt%Ph_h'7]ÐPh_h']UE@P@T@X@\@`@d@h@l@0@4@8@<@@@D]srctabUS]hl`S&C jCCCCC C$C(hjC,P؋]]localgen-initgen-nextkeep-sitessite-drop-timedeletecreate-localUWVSE Uu|r`u]Jr` u ]C3r` (]K(tJ'AC(8r` u#BPt]C1r auBPs]C ǐrau|BP˳tP]SR댃u[ra uGjjBPU"VKwƋUB PU=PV]SC$'1RP]S=e[^_]US] C 11,U9t P9Xu@]]US]M URQQh8PC$PS@S$RSv jUR0YUMUMC$P8H<]]UVS]u CFsV 11%T,Vt,Ce[^]USE]  11ځD,t9Xt@򐐐1]]UWVS}u VWÃu>9uuURVWà u%URURVh8輓PSW؍e[^_]U WVSu f}VMQ&ÃMQVMQ à u%MQVVh8FPiSMQ׉SHsL)M=vOSLfw~ CH=HCHCPCTCXC`C\ }~SL?f9C/M9K$tS{@u9s0jEPVUt )s8t )MK$SjS0{Pu{Xu׉+CL?SHsL)M=vNSLfw~ CH<HCHCPCTCXC`C\ }~SL?f9CtfCCh1 ؍e[^_]UWVS}u _M9K$u9{@uFjEPUUC0t )ȃ~C8t)‰Ѓ[벐tPVUVS0щMt FCƐFe[^_]UUE B jPR聨]Ujjh_]Uh]j0aSY@RUWVSMfu yL։)=vLQLfw~ AH8HAHAPATAXA`A\ ~QL?f9AtfA1Ahe[^_]UMfE ƒ?f9QuAh]ÐfQ1]UE@$]UE@]UE@]UE@]U]UEU ]UEU P|]UEU Px]UEU Pt]UEU Pp]UEU Pl]UUE BH]UUE Bd]UUE B`]UEU P\]UEU PP]UEU PT]UEU PX]UE]UE@|]UE@x]UE@t]UE@p]UE@h]UE@l]UE@d]UE@`]UE@L]UUBH% BL]UEPL+PHЉ]UE@\]UE@P]UE@T]UE@X]UE]UUE ]UE]UUE ]UE]UUE ]UUE B ]UE@ ]UUE B]UE@]UUE B$]UE@$]UUE ]UE@(]UE@,]UE@]UE0]UE8]UUE B,]UUE B(]USMU ZA8Y<]]UEuP]USMU ZA0Y4]]USMU ZA@YD]]UE@]UUE B]UE@]UE@]UVSu] jV襡F 4k^Fe[^]UE@r]UVS]u Cr;| SStSe[^]UEM UPhqRjQצPo]US]|jP详P9p]]UUE JPARAЉ]PqUE@s]UVS]u Cs;t SctS e[^]US]E ShrPp]]UEHQPAЉ]US]t PEq]].AUjEPIrME]HrUUE PR4]@@UUXs} }M Mm$XmPR]UE@tt]UVS]u Ctt;t SstS蒄e[^]US];uSh0t1s]]UEHQPAЉ]US];tSh0t-s]]sUS]Chu&[؋]]UE@hu&E tP衃]U WVS]jEPGM ɋUu4V+uEEȾd1NjM ȍe[^_]UEHQPAЉ]ttLuUE]U&]sessionaudio/rtpvideo/rtpUE }t)|~u]Ð1]UE wE$8vXvXvhvXvhvXvhvXv]Ð1]U= tH Q@PADЃjUE@H QHPALЉ]UUBH RQ8PA<Љ]UUBH RQ0PA4Љ]@?UVS]SCCC C`PCd[hClCpPCt[xC|CtpVǃXǃǃǃǃǃǃǃǃǃǃǃ`@ǃh݃܋UwEu ] Eݛ蘻P$uu$,TwE}U Um$XmPV؍e[^]UVS]u CC PǃXjP@CpCtjP3C`CdjPC%C %jCPVSәe[^]UVS] jEP*Cuu裥'މe[^]Bad-RTP-versionBad-RTPv1-optionsBad-Payload-FormatBad-RTP-ExtensionRuntsCrypt-Bad-LengthCrypt-Bad-P-BitCrypt-Ctrl-Bad-LengthCrypt-Ctrl-Bad-P-BitUVSuU PhyR‹PhyR‹PhyRƒ$PhyR‹PhyRxƒFlX,t(CPhyRZƒ CPhyRFƒ F|t,X,t%CPh zR$ƒ CPh#zRJЍe[^]activelocal-addr-heuristicstatsnb%unfnpnsnameemailrandom-srciddata-netctrl-netmax-bandwidthconfiddata-bandwidthmtuloopback @?UWVSE'U} Qp!{uRhJp({uPMPURkAup={u,UR]S'U1,pC{u,][<PhF{URpn']pI{u UB8EpL{tpO{uE}vUB@} VpR{u @Pj$pW{u @PjR1p]{ u<@P?"PURPhF{]SZm'1pj{ u<@PƋU`URjF P]ShUrl1qps{ u<@P×Ƌ]pSZjF PSUr|1'p|{u<@PO}{{]ݛ1p{u@PWU1p{u@PV1}p{u@PV]C1Gp{ u@PsVUB\1P] SURbe[^_]USE] X$PlJ PA0RA4Ћ]]UWVSu EMt&0KEF؈FSRV މe[^_]UWVS}]hʁYU fCBu SjVWxƃ4t)8t"EEP@t,w tDt t&4Sj-SURSj SQVWƃ+} )߉fH%PXU fBKx FKye[^_]UEjPb]UEjPB]Mb??@UUUUUU?@?UPWVS ]uuSVEjUR:UMUMS8KP 1e[^]decodernvNv-Bad-GeomNv-Bad-CoordNv-Bad-BlkrunNv-Bad-RunlenNv-Bad-EncUS]jSC `ǃCC 'C(4C0BC8Pǃǃǃ؋]][dct][haar]UEM кtʺRQ]U@WVSMɉM]؉EM ME E(˃]ȐM u]]}]]?M9][])ىM]{K])]}})MM yu*]ĉZM]ZZzzM Ja][]MqM)ً] ]]ZM)Jur][]M1)ىJ߉z])Zu2E EE E E}E EEM9ǀ]̋@])ىM]̋`K])]}})MM̋IM]̋sU)ʉ!ЋMUU!Ћ] ]ًU)!ЈU!Ћ] ]ىMM̋IM]̋3)ʉ!ЋMU!Ћ] ]ًU)!ЈU!Ћ] ])AMEEE}p}LEMMAME E(]]АM u]]]ċMIM}2]]MqyYM)M}})]] {u(MĉJ] MJJzz]Z_MIM]s])ˋMMMJ])ZurMIM]3)ˉZωzM)Ju2E EE E E}E EEEEE];Mԋ@M)ˉ]Mԋ`YM)M}})]]ԋ[]MԋqE)؍!Ћ]܈Mˉ]܋]ċM!Ћ]܈MˋE)!Јˉ]܋]!ЋM܈]ىM܋MԋIM]ԋ3)ȍ!ЋM܈]ىM܋M9!Ћ]܈Mˉ]܋E)!Ј]!Ћ]܈}tEMM܉C]EMMAMEEE} e[^_]UWVS] ]E EDžL(߃H]  CuNLGGGGGG]}EHCEK}[D]UB EU+UB EDߍ{C)‰ ] K K ˉ} @]ˉ]}}])]})ω}H[D]HO]}H@D]D}F>}FF}}}]]E}9ȅ}A9|2}G$E}G,Et}G4EdUE}E}Ћ}<}MЉEMEM 9uvE@}tE1ɐ9M~gFÃ? 9E[ FAJuƁ AKu}뛐}t$}W}W}W}Wh }W"}W}W}W}Wh }WBE}tEE}}G}e[^_]UWVS}uM AP؋M A PЉM uLJ(uLJG<9u9t1wv @GG SRPHR@LЃ ]9sMQSVWƃ9rM P}PWLJe[^_]UhhfEP]t4DĬUE hPuhR%Ph]Ð1]UUE B `PR]]decoderh.261h261H261-Bad-PSCH261-Bad-GOBH261-Bad-SyntaxH261-Bad-fmtH261-Fmt-changeH261-Bad-HeaderUS]jSYC ǃǃC?C LC(YC0iC8vC@ǃǃǃ`ǃ h PS؋]]UVS]u C tLjPR@ ЃVSNe[^][q=%d]UEU u ]Ð@tPhRm]UEM PP$P,P4QP]UWVS]} p RQ0PRVWSe[^_]UWVSuuF} G thL"P^hL"P} G P‰}E EE׃}u<σ}à ~pdžE8Eà ~6džEà ~FDL}W}W}WS}W}W}W}W}WARAЋ(H\9t,V @`PQBHPBLЋ F<} P}GLQPAЋ@p@ PV`@pe[^_]UUt @ PR>]Uh,h?]L<tlԫDUVSu 0h4Vth:VmuthP 1e[^]decoderh261v1Bad-PSCBad-GOBBad-SyntaxBad-fmtBad-sizeBad-bitoffSize-changeFmt-changeUS]jSC 8CC C(C0C8C@CHCPǃǃǃǃfǃǃ1DŽfDŽfDŽDŽ=~ǃhLdPb‰B`PB\PS؋]]UVS]u C 8P:tLjPR@ ЃVSSe[^]UEM PP$P,P4QP]U$WVS]M A P%Ept}}tu}GDoM APЉU]u%=uU}E9 }CPMM1ҋ}:E~9&&PCP@&&t9~tMALPZ}LJLJ1MDŽfDŽfDŽDŽ=~1}?}UMf}ffRMQP[ uUBE@?}f98u]MM}8|0C?M؋}f9:K:}ҋEMu5E@ǃ?}ȉM}f9::t΋M9Ms^&NFƃ?}88SPRUc U9uuʋ &M)ʉU4E}8EU:+E:EEMfpEf Ɖu}}EÅ9UƃUEuCCC}Ljjjjj}WVEPSARAЋM(9B\t8ATy B`PB\PGHPGLЋM } P}PMLWPGЋM@p@ PQY}@pe[^_]UWVS]} p RQ0PRVWSBe[^_]UUt @ PR]Uhh7(](tԫDUWVSM%=}?}M}9M}7FP$M1Ґ}:M~95&&P+FP&5&t9~w}GLPLJLJ1MDŽfDŽfDŽDŽ=~1}?}M}8fMf8f88}PM QR uUBE@?}f98u]MM}8|0C?M؋}f9:?:}ҋEMu5E@ǃ?}ȉM}f9::t΋M9MsZ&NFƃ?}88SPRU U9uuʋ &M )ʋ}0EME U +E  }EMfpEf Ë}}M9E e[^_]UE hPuhZP]Ð1]decodercellbCellb-Bad-GeomCellb-Bad-CoordUS]jSC PCC ǃǃǃǃ؋]]vic: bad cellb packet U@WVSMMu u<}ljEM؋uuȐ}2} }8ML Mu9|})}MME9}}E Mu F ÁFE$E}9}|hh4uMM4u}uU u ‰ u ‰ u ‹}Mωu ‰u ‰u ‰u ‰Mω}u ‰u ‰u ‰u ‰؃u ‰؃u u ‰؃u ‹M9Uu}MщM܋u FE$E lj}fMf uuf}f:fMf f}f<M Mf}ċuf>Mf}f>ΉufMffMċ}f 7uEUEЋ}MЈEu9u| )u}}EE EMe[^_]UWVS}M MM APzƁM APe؃9u9t1wv @GG SVPHR@LЃ SVMAP%PMP%PMQMQWM P }PWLJe[^_]Uhhv.@]t04DĬUE hPuhbPH]Ð1]UUE B PPRm]UVSu] jVy(F ^Fe[^]lappend inputDeviceList %sUEPh[h'p0]nicknameattributesUWVSU] EuLp uRp uR'1PSR)e[^_]UVSu] jVy'F d^Fe[^]lappend outputDeviceList %sUEPh[h'p/]assistorrendererUWVSU} uQr u ]Sr u\]S'1Y} u:0r tr ut 1R] S]S(e[^_]||UUE B dPRU&]UUE B PR5&]US]jS%CPCPsCTC4C lC C$C(C,C4C8C<C@CDCHCLCPC\C`ClǃǃǃǃhSjSCpCtǃǃǃǃ?Hy؋]]UVS]u CTC4C lC4P/ Cpu,][ @PPC0EPC4p u@PS]Ctpu@PC%]C\Up u@P%]C`%0ҋp t(ptpuP] S]S#e[^_]`k@0@`m@UWVS}E E1RP,$E1RP,$x19s(}E Em<$ZYm;C9r9]vt}E Em<$ZYm;EuC9]w1}E Em<$ZYm;C ف~ݟe[^_].AUUE P4$Zx]UUE ]^A?jU S]M ڳCxEu;Eu݃ݛCxݓ݃ݛCP}N݃mEu ݛEu]]UVS]sV~ݛSBVBЍe[^]UEP~]@@UVS]s؋S BHPBLPS E@t<}U Um$XmPV}e[^]UUS]M KTMKXCdKTKXKhCW JMVSE EPEEPM QMQ'PMQGPMARAЍe[^_]UE@(x$u@$Ph{ ]UEx$u@$Ph8R ]UEx$u@$Phx" ]UMA$AtPAPAPjj'PRAP\]UVS]C$Cp=1UDUUUU~j j EPVCPUhYPCP'P覕ƒ$u輌0,DžDT$Ph CP2 CPCPjjPVCPV[^]UWVSuM }]UEN PRSWVe[^_]US]E URPS C C$C(C, jjCPC ؋]]UVS]u C C PCPK,tAjPR@ ЃVSLe[^]US]U EPRS K,tAjPR@ ЃCPCPCPlC,]]UMA,PjjRjjBPPjjQBPP ]UVS]u Ct:@PCPbSS0 VCPCPC,@@PARA Ѝe[^]UUE B PR]U jh]videoUh h ]HH ( X  (x8(8 (US]E PSC ؋]]UUE B0]UE@(]UE@$]UEP]UUE B0]UUE B,]UE@(]UUE B(]UEj@P]UUE B ]UEj@P]U]UUB@PBP^]UE@P]UE@P]UE@]UE@]UE@]UE@]UE@@]UE@]UE@]UE@@ PP]UEP P]UEU '']UWVS]u 0ҋ{)9s$SVW<WSq{+BPVWWSGWe[^_]tkerror "%s: %s"%s: tcl error on eval of: %s UWVS]u VP. tz0{ ҉ЍDNPVC PhWWPT. t)VC Phh9JjWe[^_]bailing in Tcl::eval UWVSu^0؉F9rhhISV^e[^_]%s: "%s": %s UUM PQB PhhbIj#%s.%sUWVS]u }C ©tP4CVC @PhHC@Pzj=WCPCPe[^_]UWVS]u }C ©tPX4CVC @PhHC@P j)WCPCP.e[^_]UVS]u C ©tP4CC @PC@P$CPVCPt8u1e[^]_o%dU VSuE F dFu7P7h]S0؃ PV7F57e[^]UVS]u C d't PRw 797t P9Xu@CPtSe[^]UVS'7t<jShPP) S B PB$Ѓ[ϐe[^]U]UWVS]u t'tRP PK0PVPU 't#jShPRs S B PB$Ѝe[^_]USUMEZ PQCRCЋ]]%s: "%s" (%s): no such method (%s)requires additional argsUWVS''PhS0Ѝ\u 8_u"xouuVtPRhSPhS 0Ѝ\} ~uFPhShSu''e[^_]U]US7tC PR@Ѓ[u]]UVSu7tVPt[u؍e[^]UWVS]u CP0PCVPe[^_]deletedelete: bad argsdelete: no such objectUE} t']Ë@P'u']ÐA jPR@ 1]newcreate: bad argsUE Uu11t'3]ÐBPBPCt '1]UUE BTB77Љ]%s/%sUPWVS57}txFPMQuTFM QPR@ ЉÃt8} t"M QMQhWWMQS6됐1e[^_]UME UA7A 7ȉ]UWVS}7t3C9~1!9uPh'O[u͉4e[^_]US1ېStC𐐐]]UUE B PR]UUE B ,PR]U7jh77,jh7~]Uh'hh77,h/h77]8HX(US]h/SC ؋]]US]hSC ,؋]]UE]US]E PUEPE PCPL Sw]US]E HMEPE PCP  S]411422cifjpegdctUEtEtt)gtK=t4R]Ð]Ð]Ð]Ð]Ð]US]hS螣uhSuulhSUuLhS5u,hSt]]UVSu] jVF FFFF^ e[^]frame-formattargetUWVS]U Eu,p4 uHC P¡'1:u+pAu@PfC1PRS@e[^_]US]E PSC d؋]]transmitterUWVS]U Eu,p u@PC$1PRSe[^_]PPUUE B PRA]US]M 1ҋC9Au C9A uBЋ]]UEM UHPʉH]UE@ ]UUE B PR]US]jS=CPRC%C %CC8C<C@CDCHCLCPCTCXC\ jjCPC(؋]]UWVS} 5l8t l8j0`8^È%PzfFX8PqfFfX8WhF @F^F,e[^_]USMU EPRQ[Ëh8 t h8hn‰S,S ؋]]UWVS} }} ww}wMbP?UVS]u {PulVS]jEPt#MEE[HVSh|#M}U Um$XmPCPNCP {Tt CX0sTsXe[^]ư>MbP?UVSujEPF4$ME]^TtaFTSVFH^HSVEnH<$}E Em$Zm~RFPMFPe[^]UVSu~PtFPFPMFTtPV؃쐐FTe[^]UVS]u \8|C(PFPRS\C VP(R@,VSrVS e[^]UE l8l8P,t h8h8]|&|&L$ư>UjEP苖&ME]UE@]U]UfEfX8]UVS]u C%C %jCPKVSe[^]modulenvUS]jSC =C(C,C0C4C8C<CC؋]]UUE B PR]UWVSU} Er8+w uuWB$P$1JGw_thUFf UB(fC fJ4f J,fKWB$Pe[^_]UVSuE ]F^ӉV̀%P%F(Sֱ%F,e[^]quse-dctUWVS]U Eu|p(u@P觭C01`p(u<@P{thF% 1C41PRSXe[^_]UWVSM]} U$u%uF8F8F8F8F8F8F8u~4t%hFPuVuVu VuV &huFPuVuVu VuVoF9| 9S9|9CS9| C9CS9|9CS9|9CS9|9CE ٺ9|9B9|9BB9|9BB9|9BB9|9B9|9E}?~}49|?9S9| ?9CS9|S?9CS9| ?9CS9| ?9CS9| ?9CE ؉E?#9U9Q9U9AQ9U9AQ9U9AQ9U9A9U9E}?~E}tETEPEtuV8B;uF8GKt1u#u9ut%uPu(uE؃>Bu.E1ۋu9ut1uPuȐu EK봋uF8UF8F89F)ʋuԉVE+EFE+E}tE]{}E]EEEE}ETEuuԻp}S4 u)ȃ}ԈGKS4 u)ȃGKS< })ȃuԈFK< }؉)ȃFu}D7u}u؍D>}ԈGE+EGE+E E }ԃEE}5e[^_]UWVS]]ETE}<}Džl4] }]{} ])‰U]߉} <})‰U] ] };4)‰U}] d)‰U})} }߉hM])]u+d9B}h)ʍBlC} vh^Fl`h؉hƉh] K K ˉ)l{U+UBhUUBЉee}h}]+h]u)Md <}d<hE l@v})) S) CM] ًh) l;E lEE}ETE}tDžpd]pG ])‰UWG<})‰UpSC4)‰US<d)‰U]hM})}u+dʍB]h)ʍBtG][U vNFƍW}<_]}<_])فtOU+UB hUUBЉ ]h]}+h}u)Md ]dh؍}8tCv}))S)CM] ًh)ρhhtp E tEE}}]]EuMUENj]À}]ÀXZÀXYÀXZÀXYÀXÀXÀ}uuE}~}}ETEDžx4]C8<})‰U]C(])‰UE}G4)‰U}Gd)‰U}߉hM])]u+dʍB}h)ʍBxC} vh^Fx`h؉hƉh] K K ˉ)x{U+UBhUUBЉee}h}]+h]u)Md <}d<hE x@v})) S) CM] ًh) x;ExEE}ETE}}Dž|h]]|d|[]|w]dhM})}u+dʍB@]h)ʍB@}G][U vNFƍ@W}<_]}<_])ف@}O|[]|d|[]|7]dhM})}u+dʍB@]Ch)ʍB@C<U vNFƍ@S]{}<]{}<)@] | E ]EE}X[^_]Uh&hT6\=]= ' (,UE h&Puj@eP]Ð1]modulecellbUVSu] ECC}th褛f CF(fC$F,fC&EP腛fC EPwfC"SF$P!e[^]U}VUR}WjUR}WM1jUPG$PLEX G$$@؃E}}UȉUM}̋UĀ<:}f~ F C1ɋ}GPUR}WURMEECECUSMA~FC1E}uEăEEEȋUu EE}}ԉEuVUR}WjUR}WEe[^_]Uh=h`hE]EBBUE h=PyuhtJP8]Ð1]moduleh261/pixelh261/dcth261US]E PSC p`C0C4CD 1DhDŽ@~؋]]US]jSC _C@j Sx؋]]US]jSQC 0`C@j S8؋]]US]E UM~C<~S=~K>{@DžC<B?~퍃hPP~DžC=B?~퍃hPPFDžC>B?~퍃hPP]UMU jPRQ]H261PixelEncoder: H.261 bad geometry: %dx%d UWVSuU EVFȉN`u8= u1FLFD FP FTPFX(>uH=uAFLFDFPFTP FXhF\F`Fd'PRhPHh[jMEE119VDvo󐐐MMhMMXlO !NLE@E!ǃ9VDwe[^_]H261DCTEncoder: H.261 bad geometry: %dx%d UWVSuU EVF~`u;= u4FLFD FP FTFXAuH=uAFLFDFPFTFXF\F`Fd'PRhIhjK19VD󐐐tLNL1NL1`hNL!#dždžhdžǀhǀl 9VDMe[^_]qUWVS]U Eu,pKu@PPSH1 PRSe[^_]UWVS} h ƍƆEx@t 1PMtșEE1ځUE؈2U9UwEEUڋEA뫐e[^_]UWVSMq(y,Y4]M ,~u vKЉ Ɖ]CCK] )։ ) 1EX]]EMluE] fC%MEw*E 4Z]t0ZE@ E} vEЉ Ɖ]MAAME )։ ) 1B  vHW Ɖ]CCK] )о ) Ƌ]s({,MK4e[^_]UWVS}EuOhO=hOuuQVQVvQPVPR QPVP+VPQ\S_EEѽ QPVQVEPQS 1DžDžxH?Jx鋍9}㐐9}̉ĉ9}~u|C9}ӥDžx0Dž?xf鐐E +GHu wHG,$YG, v\p Y G(G(W4W4G*BW4G(BW4G(BG4 ) Y_(w, ) Y G(G?9W,BG, v`Z G(G(W4W4G*BW4G(BW4G(BG4 )ؾw(_, ) G(W,BG, vaZ勅 G(G(W4W4G*BW4G(BW4G(BG4 )؋w(_, ) G(O?W,BG, vbZ G(G(W4W4G*BW4G(BW4G(BG4 )ؾw(_, ) G(\hu4jQW8Ë\hjQWSPWSPWSPW$SPWSPWgSEPW\[^_]UWVS}]EUUMUUEu O<Au G>E O=M}11ۋEEEMx7E?JxM ME9}u琐9]~ߋ]ڐ9}ӋEE1uÃ~#|B9}eE +GHM OHW,$YW, vYr Y G(G(W4W4G*BW4G(BW4G(BG4 ) Y_(w, )ы Y G(G?9E!W,Z_, vsZEmE G(G(W4EM W4G*EMJW4G(EMJW4G(BG4 )ڸG(_, )ٸ G(W,Z_, vaZE G(G(W4EM W4G*EMJW4G(EMJW4G(BG4 )ًEG(_, )ًE G(MO?W,Z_, vrZEmE G(G(W4EM W4G*EMJW4G(EMJW4G(BG4 )ڸG(_, )ٸ G(M\hu*jQW;ËE\hjPW)‹MSEPWSMQWSEPW$SMQWESMQWuSEPWje[^_]UWVSuV4F+V4F*BV4F(BV4F(BEE+EE}u}t =M A}yY}uhf E C V8 P܀C }MI M~0}V4)F,ЍCMM)ʅ~RP}WG MN0}~8E$)É$)É^,F0F4V,t )ӋPǘF(F(} WF$PEe[^_]UVSu] 1ҋF9Cu F9C uBuV C PCPB0PB4Ѓ CPSVYe[^]UVSu] 1ҋF9Cu F9C uBuV C PCPB0PB4Ѓ CPSV e[^]Uh+FS^uhP^1]]UUE B PR]UUE B PR衱]UUE B PR聱]transcoderjpeg/dctUS]hSC eCHC,CCCCDC@C<؋]]UUE B PR]UMU EPRQ]UWVS] 1ҋuF9Cu F9C uBt%uF$9Cu1{u u~(t@t SuVuVH hF,PCPCPARAjPNjFH Ev,uuVEjSF P肵 }$h6iiF P>F FF PhnEhnEjEPj jF P9 }F PA>F FF -jPV(jjjQF}hDi轾j*fEh0nEj]SFP莴}h6iuj*f}hmEjSFPP}hTi:jS*EjEPj jFP9}heij*hmEjEPj jFP}hiǽj)4Fe[^_]UVS]u ChnC | P<C| P<VSke[^]GroupIPC sendUEU HfPPfP@ U@|jRQPl} hl]UWVS]u }WC PGP0PVSe[^_]UMU AQ]GroupIPC: recvUWVS]jhsVC P(ǃ}hmUkx[C9CtRCU[t8MKt!SWFPFPFPBPB Ѓϐe[^_]lmUE ]confbusUWVS}u jWj_S!GqG ,qGG Vh?PGSPte[^_]UVS]u CqC ,qKtAjPR@ ЃC PVS赣e[^]focus %s%s %s {%s}UWVS}]~jMy tauP2Ph|oWZ{s<>u<19};€t D6t!C䐐WMPA Phoh'e[^_]handlersendUWVS]U Eu|p pu8pC P0P讇C VPM1@p(pu@PjCP1PRS4e[^_]Uhnh誦 q]\qo,o!t É É މ!…t ‰ ‰ ‰!#u}؉7}_ É Í41ȉ1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#u}؉w}G}W Ћ} }_ É Í41ȉ1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#u}؉w}_ É Í41ȉ1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#u}؉w }G}W Ћ} }_ É Í41ȉ1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#u}؉w}_ É Í41ȉ1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#u}؉w}G}W Ћ} }_ É Í41ȉ1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#u}؉w}_ É Í41ȉ1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#u}؉w }؃EEEE}!}}E)EUU}؍<}؃Ee[^_]U$WVS] Eu}}<}}WӉډU)$Gd4u}}}Gh4}苸,}䋀0E܋EEE}n} Ћ}}  4 1Љ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!#u܋}7C}W Ћ}}O  4 1Љ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!#u܋}wC}W Ћ}}O  4 1Љ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!#u܋}wC}W Ћ}}O  4 1Љ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!#u܋}w }EEE})}}E)EUE)}<}Ee[^_]U$WVS}Mu_]] ˉ]G] ÉډUЉE)Gd M܋MGh4]싘,]苀0EEE}^]] Ћ]]3 Ɖ ƍ<21Љ1!ЋU!t>!t Ɖ Ɖ !…t ‰ ‰ ‰!#}]܉;]C]S Ћ]]s Ɖ ƍ<21Љ1!ЋU!t>!t Ɖ Ɖ !…t ‰ ‰ ‰!#}]܉{]܃EEE%M])ȉEUU)$E܃Ee[^_]U0WVS] uMIM}߉}MAËUӉ]؉EyP}M}M)MԋE}ԉMAdEԋM4uЋ]}Gh4M䋸,}0E܉EMEؐ}}M Ћ}M   Mԉ։1Љ1!ЋU!tD!щMt   M Ή!…t ‰ ‰ ‰!#u܋}Љ7}ЋMMEE)˅']EM)؉EUUE)<}Ћ})}e[^_]U4WVSu] E~}<}VӉˉ]ډU+EFd}}}}?}Fh4}䋸,}0E܋}}}ؐ}Z}<}Ћ}} Ћ}E̋}?}ԋE  u΋E1ȉ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!Ƌ}!;}Љ7EM  u΋E1ȉ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!Ƌ}!{}Љw}}Eԉ  u΋E1ȉ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!Ƌ}!{}ЉwEM  u΋E1ȉ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!Ƌ}!{ }Љw EEEE}'}}E)E}?}UUEÃEe[^_]U4WVSu]MIM} }MQ} ׉)EÉ]ډUAd4uЋMM}Gh4M苸,}䋀0EMMM܃}6}MЍ<}؋MMMԋ}M Ћ}E̋M É ËuދE1؉1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#u}Љ7MY É ËuދE1؉1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#u}ЉwM É ËuދE1؉1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#u}؉7MY É ËuދE1؉1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#u}؉wMA}W ЋME̋}_ É ËuދE1؉1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#uMЉq}_ É ËuދE1؉1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#uMЉq }_ É ËuދE1؉1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#uM؉q}_ É ËuދE1؉1!ЋU!t>!t É É މ!…t ‰ ‰ ‰!#uM؉q EEEEE}&}}U)E)UEEMЍ MЃEe[^_]U$WVS]M uU{}<})4CMȉECd4}}Ch4}싸,}苀0EEEE}^}} Ћ}} É Í 1Љ1!ЋU!t>!t É É ى!…t ‰ ‰ ‰!#M}G}W Ћ}}_ É Í 1Љ1!ЋU!t>!t É É ى!…t ‰ ‰ ‰!#MN}G}W Ћ}}_ É Í 1Љ1!ЋU!t>!t É É ى!…t ‰ ‰ ‰!#MN}G}W Ћ}}_ É Í 1Љ1!ЋU!t>!t É É ى!…t ‰ ‰ ‰!#MN EEEE} }}U)E)UEE4Ee[^_]U$WVS] Uu}}<}}O)ÉÉ]ىMGdU]Gh4}싸,}苀0EEE}b}} Ћ}}  4 1Љ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!#u}7}G}W Ћ}}O  4 1Љ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!#u}w}EEE*]})ډ)ljUEEE)$EEe[^_]U8WVS] UuMIM<}MI)ÉÉ]ىM}P}M}}GdM4u]Gh4}䋈,M0E܉EME؉H}}Ԑ}M} ЋM}? lj lj}Љ։1Љ1!ЋU!tD!׉}t lj lj lj} !…t ‰ ‰ ‰!#u܋M1}}EE)1]UM)ډ})ljUEEE)M M})}e[^_]UHWVSUu][]} ׉}]K} )EEEMSd4u]]}?}]}]}Gh4]܋,}؋0Eԋ]]]Ѓ}}}}̋]}lj}lj}E]} Ћ]܋E}?}E  u΋E1ȉ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!Ƌ}!];]ȉ3EM  u΋E1ȉ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!Ƌ]!}_}ȉw][]E  u΋E1ȉ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!Ƌ]!}_}ȉwEM  u΋E1ȉ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!Ƌ}!]{ ]ȉs }?}E  u΋E1ȉ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!Ƌ}!]ĉ;]3EM  u΋E1ȉ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!Ƌ]!}ĉ_}w][]E  u΋E1ȉ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!Ƌ]!}ĉ_}wEM  u΋E1ȉ1!ЋU!t>!t   Ή!…t ‰ ‰ ‰!Ƌ}!]ĉ{ ]s EEEEE}J}}E)U)E]]}]<;}UUU)Ћ]]EVe[^_]UWVSEUx}} ׉}@d4}}}}}}}ˉ ȉȉ ȉFȉ ȉF ȉF _ˉ ȉFȉ ȉFȉ ȉF ȉF }E}}}E)E4E e[^_]UWVSM]Uy}} ߉})Ad4}}EE}}ˉ ȉȉ ȉF_ˉ ȉFȉ ȉF }E}}}E)EE)4E_e[^_]UWVSEMURU} )URd4]EEUU}~N ȉO ȉF]E)NjE)$ƃE묍e[^_]U WVSUEJM} NjrPuMu+EۉRduME]EEuu䐐}~V ‹uu}+]]E)NjE)؋M4uu)u벐e[^_]U WVSEUHMu ։u+UPdMʉUuuM9uuu𐐐}>Mu ΉMM Mu ؋MuEU EAFEE ؉AF A F E%E ؉AFEU EAF}E ؉AF AFMIMu ؋MA uF EU EA$F$EE ؉A(F( A,F,E%E ؉A0F0EU EA4F4}E ؉A8F8 AEM MEe[^_]UhPh9g9]rspszy`z0yP{@@USUf1Ɂ{JlZp]]U WVS}fGnf~+Wpȋ:\]\]]_p]]S]S]S]S] SOlf~ UR]Ӎe[^_]UVSuM U]RQVGF(0F H^hf1ҁ1ɉVlNpe[^]UEU @(0@ H@({@ {RP]UVSu 0h[V thhVy uu 1&h4EÃSkC Ȱ؍e[^]UE4]UE0]UE,]US]SC ǃ,ǃ0؋]]UVS]u C 0PBEVS(e[^]create-histlutUWVS]U Eu}ЋE %Mu%%D ‰Uč%T%D ËE %M%D Eĉ%T%D É%D Uċ}} Ëủ^EEEE}A}}U)E)UEEUEEuFl}0}Eye[^_]U,WVS]M uU{}<})4CMȉEsdu}}ECl0EEEܐ}:}?}؋}?}ԋ]]u؁E% ЉE Ήu؋}7% %CE% % ‹wCE % % ‹E %L% ‹}}EEEE}2}}E)U)EUUUEEEe[^_]U WVS] Uu}}<}}O)ÉÉ]ىM]EGl0EEEu utE}Wd}f]E)BEӐ}WdU䐐}J}%} ֋}%} :}W %}D EE}%} ֋}W%}D }W %}D }}EEEO]})ډ)ljUEEE)}<}EE}Gl}0}Ee[^_]U:]rspszy`zyP{н@``r`spszy`zyP{USUf1Ɂ{JpZt]]U WVS}fGrf~+Wtȋ:\]\]]_t]]S]S]S]S] SOpf~ UR]Ӎe[^_]UWVS}U Eu,PRWG(G _hG( G 8wle[^_]UEU @( @ 8@(@ @({@ {RPF]UVSu 0h+Vth@Vuu 1&h4*ÃSC ؍e[^]UUE B PR]UEU @(@ @({@ {RP脛]colormodelpseudocolor/8/edUS]S#C Iǃ4؋]]U(WVSh&YhW\nP}W}?}0}}4PEh4EEE}EE E}܉}E}1E EE}}oE }8[}T,BM)B })lj%  U U؋}4 ˉF뗐EE`EEE1e[^_]rendererUWVSE ]s\ utCPs7EC PDjxƃ],WURVJF(PIF hI^hF(HF HUVl6u'01SPURUe[^_]US]CP@~1{`u {\u T< X<SpKt]]UHWVSM ][]uΉu}GUщMȉE]_d]Gl4E TƁ|%@ ʍ ց !Ɖu}}䐐}V ]]uu}} ] ‰U܋u>  E} EE]  ]tRE!t   ME5 M!t   !EME%< %u eȰ E EE}]; Eu  utRE!t   ME5 M!t   !EME%< %} eȰ E Eԋ]uD EM  tQE!t ‰ ‰ UE5 !t ‰ ‰ ‰!EUE%< %}eа E Eԋ]C EEM  tQE!t ‰ ‰ UE5 !t ‰ ‰ ‰!EUE%< %ueа E E؋}W ]C ‰U܋uT7 D3 ‹}G EE]  ]tRE!t   ME5 M!t   !EME%< %u eȰ E E؋}]D; Eu  utRE!t   ME5 M!t   !EME%< %} eȰ E Eԋ]uD EM  tQE!t ‰ ‰ UE5 !t ‰ ‰ ‰!EUE%< %}eа E Eԋ] EEM  tQE!t ‰ ‰ UE5 !t ‰ ‰ ‰!EUE%< %ueа E E؋}uԋ]4;}EEEEE }EE}}]]uFuă}EEEEE}W ]C ‰UЋuT7 D3 E}G EE]  ]tRE!t   ME5 M!t   !EME%< %u eȰ E EE}]D; Eu  utRE!t   ME5 M!t   !EME%< %} eȰ E Eȋ]uD EM  tQE!t ‰ ‰ UE5 !t ‰ ‰ ‰!EUE%< %}eа E Eȋ]C EEM  tQE!t ‰ ‰ UE5 !t ‰ ‰ ‰!EUE%< %ueа E E̋} ] ‰UЋu>  ‹} EE]  ]tRE!t   ME5 M!t   !EME%< %u eȰ E E̋}]D; Eu  utRE!t   ME5 M!t   !EME%< %} eȰ E Eȋ]u EM  tQE!t ‰ ‰ UE5 !t ‰ ‰ ‰!EUE%< %}eа E Eȋ] EEM  tQE!t ‰ ‰ UE5 !t ‰ ‰ ‰!EUE%< %ueа E E̋}uȋ]4;E }EE}}Ee[^_]UDWVSMu][]} ω}]C} ljUЉE)KdMCl4EGƁ|%@ ʍ ց !Ƌ]ۉ]䐐} }}]]ȋ}}ċ]]}} ] E} Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %]а  E܋}]; }; E]} Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %]а  E}W ]C ‹}G Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %]а  E܋}]T; ]D; ‹}]D; Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %}а  E]S }G ‹]C Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %}а  E܋]}T }D ‹]}D Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %]а  E} ] ‹} Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %]а Ɖ E܋}]T; ]D; ‹}]D; Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %}а }܋];E U]EEEEEEE}]<_}]]]]}}]C]ԋ}G}Ћ]]̐}EEEEEEE}G ]S E}G Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %]а Ɖ E؋}]T; ]D; E}]D; Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %}а Ɖ E]S }G ‹]C Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %}а  E؋]}T }D ‹]}D Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %]а  E} ] ‹} Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %]а  E؋}]T; ]D; ‹}]D; Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %}а  E] } ‹] Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %}а  E؋]} ] ‹}]; Ɖ  tM!t ‰ ‰ ։5 !t ‰ ‰ ‰!Ɖ%< %}а Ɓ}؋];E UE}]<_}]]]]Ege[^_]U }> ‹u}7 Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %uа  E؋}W uF ‹}G Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %uа  E܋}uT> uD> ‹}uD> Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %}а  E؋uV }G ‹uF Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %}а  E܋u}T7 }D7 ‹u}D7 Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %uа  E؋} u ‹} Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %uа É E܋}uT> uD> ‹}uD> Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %}а É}܋u> E؋}7uEEEEEEE}u uD> ‹}uD> Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %}а É EЋuV }G ‹uF Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %}а  Eԋu}T7 }D7 ‹u}D7 Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %uа  EЋ} u ‹} Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %uа  Eԋ}uT> uD> ‹}uD> Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %}а  EЋu } ‹u Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %}а  Eԋu}7 u7 ‹}u> Éف  tM!t ‰ ‰ Ӊ5 !t ‰ ‰ ‰!Éځ%< %}а ‹}ԋu> EЋ}7E}u}?}܋}7]܁E% ˉ]܋}%M? ? ‹E%M? ‰ ‹}}_ M? ? ‹EM? ‰ ‹}W}EEEE}}}E)EUU$EEe[^_]U$WVS}] Ewu4uWӉˉ]ډU+EGduEuuGl0EEE}u>u6u܉% ЉE܉ ϋu%M?%M? ‹^E M? ‰M? ‹uuEEEE}+uuE)EUUE)u4uEe[^_]UWVS] Mu}}<}}GÉӉ]؉E]Gl0E)EEu utC}Wd}bf]E)BEӐ}WdU萐}}%} ֋}Ѝ%Ћ} 8}GЉ Ћ}8 }G%}W ֋}GЍ%Ћ}8 }G Љ Ћ}8 }}EEE,]})؉EUU)}<}Ee[^_]UWVS}u ]MUEPRQSVWe[^_]U8WVS] Muvu<}uFÉӉ]؉E+MFd } yMuu}%EȋuFl0E}}}}>u6u܋}?}؋u}<}ԋ]܁M؁E%U؁ ЉE ˉ]܋u6u%]É?E ‰ ?E ‹}Ȋ ‹uu}ԉ}ԋE%]ËE?E ‹uuȉ Š ‹}}uԉuԃE}?}̋E ]É?E ‰ ?E ‹uȊ ‹}}uԉE]ËE?E ‹}}ȉ Š ‹uu}ԉWEEEE}7uuE)E}UMMEu4uEe[^_]U ‹]uȉEE8]; ‹uu܉ȃ?8 Š> ‹]uuȉEuȋE%}NjE?E]]؃?8u> ‹]]ȃ?8 Š; ‹u]ȉE?8u> ‹]]܉ȃ?8 Š; ‹u]]ȉE]ȃEu6űE }lj?E]]؃?8u> ‹E ?Eȃ?8 ‹]; ‹u]ȉE?8u> ‹]]܉ȃ?8 Š; ‹u]]ȉE]ȋE}NjE?Euu?8]; ‹uuȃ?8 Š> ‹]uȉE?8]; ‹uu܉ȃ?8 Š> ‹]uuȉEEEEE}Q]]E)؋U)Eu%E]3%EUUU)$EE_e[^_]UhKh<=fD=`]brbspszy`zayP{Macpc@LLcrcspszy`zyP{USUf1Ɂ{JpZt]]U WVS}fGrf~+Wtȋ:\]\]]_t]]S]S]S]S] SOpf~ UR]Ӎe[^_]UWVS}U Eu,PRWG( aG 8a_hG(P`G h`wle[^_]UEU @(P`@ h`@( a@ 8a@({@ {RP]UVSu 0hKV\thKV\uu 1&h4ÃSOC `؍e[^]UUE B `PRO]UEU @( a@ 8a@({@ {RPT]colormodeltruecolor/16hicolor/16UUE B x~PRi]UU1tu @t]U1]U4WVSMAX p@E̋Ax0uSruVjuƋ}W_uẼ SE؋MPu)lj}VeEMPS)lj}MQ@EE̋MP-)lj}E}}fMffMf}f}}̀~fE1E E؁ffM fu~fE E؉Eԁdf]EP}WC EԉEUMMEMMf EMMf ‹MfO,뙐f}UUU)Ћuč4FuăE_e[^_]UWVSMUy}] ӋAdPIh,u}}}%fAfC%fAfBC%fAfBC%fAfBC%fAfBC%fAfB C%fAfB C%fAfB uE)ÍBE=e[^_]UWVSM]Uy}u މ)AdXYh,MEE}~r%fCfF%fCfBF%fCfBF%fCfBME)ƋE)$ƒE눍e[^_]U WVS]EM{}u )SdB H[h,]UE}~\%}fGfF%fGfAUE)ƋE) A뮐e[^_]UWVS]EKMu Ƌ{P}M}+E҉SdB}MxE[h,]UE}}𐐐~L%MfA}f}u+UUE)ƋE)ЋMuuu쐃}Vu4uuf6fuufFfuffEf%ufFfCufFuf~ufVfCufFf%ufFfCufFufvfuufNfCufFfEf%ufFfC ufF uf~ufVfC ufF f%ufFfCufFufvfuufNfCufFfEf%ufFfCufFuf~ufVfCufFf%ufFfCufFufvfuufNfCufFfEf%ufFfCufFuf~ufFfCufFf%ufFfCufF EE}uuE)Euf>EEe[^_]Uhch=֙=h~]rspszy`z~yP{f~c@f@d0dUSUf1Ɂ{JlZp]]U WVS}fGnf~+Wpȋ:\]\]]_p]]S]S]S]S] SOlf~ UR]Ӎe[^_]UVSuM U]RQVF(}F }^hf1ҁ1ɉVlNpe[^]UEU @(}@ }@({@ {RP$]UVSu 0hcV?thcV?uu 1&h, xÃSC x~؍e[^]UE,]colormodelpseudocolor/8/grayUUE B PR]rendererUWVSE ]s utCP#EC PTjt7wƃ],WURVF(ЂF ^hF(F 6u'01SPURee[^_]US]SP~f1ҁ0}f1ҁиf1ҁSlKp]]Uhph>趕>]prpspszy`zyP{`rspszy`zyP{USUf1Ɂ{JlZp]]U WVS}fGnf~+Wpȋ:\]\]]_p]]S]S]S]S] SOlf~ UR]Ӎe[^_]UVSuE U]RPVF(ЂF ^hF(F e[^]UEU @(@ @(Ђ@ @({@ {RPf]USE h{P;t1!h,jsÃSC ؋]]UEU @(Ђ@ @({@ {RP]colormodelstaticgray/1US]SC '@D44 Ѝ Љ Љ,؋]]UUE B PR]U1]rendererUWVSE ]ulsم uXCPǃC POjt rÃVWSC(PC hUSh]'1SPURUe[^_]US]SP~f1ҁ0}f1ҁf1ҁSlKp]]UDWVSEE EM+MU҉Uȍ4EpduPUĉ1uĉɉMuȉuEEEUUuuΉuEUBEURh,uE9E|UU܋uu؋EEАU9U$u܃E Eȉǁ5? %E5?E0EUu85?s8_s@E85?sÈU8ZsM@uЊ^8_s 8_sE8XsM U8ZsMuЊ^8_s8_sE8XsMU8ZsMuЊ8_s8_sE8XsMU8ZsM2MuE2EU2EEFuEuv+uuEUBEEEe[^_]U8WVSURPUЃJỦЋM!MȋU!‰UMM!ȉE̋uu MURUU]+]ډЋUMUMAdEEAh,E1uЋMEUȉUE$EEUUUܐM9Mu؋]EEԐ9]E؃ Eԍ5?UȊ5?8vÈMȊA8vM@UȊB8vM MȊA8vMUȊB8vMMȊA8vMUȊB8vMMȊA8vMU2UMAMKMAMuƋEEEEEe[^_]U$WVSMM EUBdEzh,E]+]؋}1wEEE9EEEEE쐐U9U0ۋEE܃ E썰5?A85?sA8Fs@A8Fs A8FsA8FsA8FsA8FsA8Fs2]}G}EqE@+EEE+e[^_]Uh0h8Cf@C،] r spszy`zPyP{ PЅUSUf1Ɂ{JlZp]]U WVS}fGnf~+Wpȋ:\]\]]_p]]S]S]S]S] SOlf~ UR]Ӎe[^_]UVSuE U]RPV'F(PF h^he[^]UEU @(P@ h@({@ {RP]UE h;P1uh0iP]Ð1]UE,]US]jS C hjCP؋]]dump-10UWVS]U EuLpҎu8@PSN}'׎'ڎ1 PRSe[^_]USE hhPà | hEPSS1 ]]UEP,]UE]UUE B PR]A`"?j+ſ?bX9?J4տsڿv/?U0*дUWVSM1W $}E Em$^m$W $}U Um$Xm,W $}E Em$Ym ‰ ‰K4W $}E Em$^m<W $}U Um$XmDW $}U Um$Xmȉ ‰ ‰GLW $}E Em$^m}E Em$[mTW $}U Um$Xmȉ ‰ ‰CG]Ee[^_]U WVSu ]EE<}؉EMEN}9}}AKGCЈC 4}G}4}G}AKGCЈCE{e[^_]UWVSM uEE<0}E}}}MEY}9}CKGC 4}G}4}G}}D9KGD9CЋ}7FCKGCЈ}D9KGD9CЋ}7FEuMe[^_]US]SД؋]]US]S؋]]UhCCДhCC] ,UC]UC]UVSu] MUEPRQSVdž Fl‹Fh…}?Sb SjPTV e[^]UVS]u ǃ  Pb PbVSe[^]UVSu] MUEPRQSVdž V e[^]UVS]u ǃ  PGbVS5e[^]UVSuM UEPRhQVdž ^pSa ShP.FPe[^]U WVS}EPURhM QWLJ GpWpwp֍6S!aE SjMQ谆GP E1OEffffffECE9|e[^_]UWVSuM UEPRhQV`dž ~pSR` ShPFPe[^_]U WVS}EPURhM QWLJ |Gpƍ6S_E SjUR{GP M1JEffffffECE9|e[^_]USU] Mz umzugz,uaz0u[zDuUzHuOBu'QSRh &_P11uQSRh ^PU1]]USU] Mz umzugz,uaz0u[zDuUzHuOBu'QSRh ^P1uQSRh j^P%1]]UMQ1Й2cɉM+Mȉ]UWVS]} S{1ɐ??؋U2d =~Aʐe[^_]UUE hPR{]UUE hPR[]UUBBB BBBBB(B,B0B4B@BDBHBLǂǂǂ%ǂ6ǂpBǂSǂtǂDŽpDŽDŽDŽ@~B$B B<B8BTBP]UVS]u CpPV{pPVhjpP[hjpSHe[^]UWVS} ƃ}0vFe[^_]UVS]u EUMǃ <CLCTCXC\ShKlǃǃǃDŽDŽHyjHjCtPzVSs؍e[^]UVSu] dž <VutVZe[^]JpegDecoder::init: couldn't compute margins U(WVSEǀExhxlxpUu pEPEPS~؋E }GXE @G\}GXG`}  }ExdutGB9~CɐDŽDž19}9#ffUB9tѥC9|hh,hjVQDž9}p)M≕u1 ЉJx ff FJy눋[^_]8HxHHxUWVS]}uM} tE$PU RQVWUR0e[^_]UUE ǂ |PRV]UUE ǂ PR6]UUE ǂ PR]UUE ǂ PRv]UE ]UE ]UE@L]UE@L]UUE ]UUE ]UE@T]UUE ]UE@\]UE@X] (3= :<7 (9E83WP>%8DmgM#7@Qhq\1@NWgyxeH\_bpdgc/ccccBcccc8ccccc/Bcccccccccccccccccccccccccccccccccccccc  }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzw!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzU]UEǀL@@@ @h@l@p@t@x@|ǀǀǀǀǀǀǀǀǀ@dPEEP[E]UVSu] džLFP$tV$e[^]UWVS}duGh G\`G` GhG\G`_\_`hjPI1 EED ]]1ɉ@E]] SȻ ҉UduEtEEfEff Ћ]fKA뭐EEFsG\G`LJLJLB PB$Ѝe[^_]UE@4dn`nP0@hvdvP@pzlzP@$lvhvP @,tpP(]UU E#UЃЉ]ÐBЃ)‰Љ]U WVS1[UʉU114WPURMqUfZ CMϐG말e[^_]illegal symbol in blockbad run length %d (r %d, v %d)UWVSEEMq%d)UWVS]} ǃǃǃC} tJtu!VSPEP 5PVS|PxPEP VSPWW`[^_]U$WVSuEPVVXBE9v9s}9v}9s~x}~\}jF PFPW}WSE#EPV jF PFP}W}W{}WE#EPVj jF PFP}W}}WSE#EPV> jF PFP}W}W}WE#EPVm jF PFP}W}}W}WE#EPVMM jF PFP}W}W}W}#}WVVP}܅tDEV\9TF\T1e[^_]expected GOB startcodeUWVS]M Uu KHЃEECLJʉSDt9y{@ K8KLhP(R@,K@ C@S8  ʉS8+}{<}E$ CT}(},t N{duS@CD9r u`}9{<~XSPCDCXCpStÃ6}WS\ƃ}1e[^_]US]ScǃLS`؋]]UWVSuFP <W FWhP02FF؉F e[^_]UEHP PH ]UWVS]U CXPE%EmeK\MU‹s ֋{QWVSMQGPFPSMǃ QWVSMQGPFPSummmEEUs ֋{׃ MQWVSUBU‹s ֋{׋MQWVS"e[^_]UE++P\P`ǀǀ@l]UWVS}EEDU9WhvXUWX19 3uVWMBMuCF̐@EE롐WWe[^_]US]SǃLhS؋]]UVSuFPG S FShP/FF Fe[^]x(XxUS]C?    (!  ")081*#$+29:3,%&-4;<5.'/6=>7?@?US]M 1??ЃŔ  Ŕ}E EmmBŐ؋]]UVSu] 1Ƀ?+ȃՔ Ŕ4Aڐe[^]UWVSuEMs} Í 0!Љ % 0! % ‰% 0! % ‰ 0!  ‹}} _Í 0!Љ % 0! % ‰% 0! % ‰ 0!  ‹}W}} }e[^_]UWVSuE] MK}  0!Љ C 0! % C 0! % C 0!  ‹}C 0!Љ C 0! % C 0! %  0!  ‰W]}} }e[^_]USMU ]!   Jډ Jډ Jډ Jډ Jډ Jډ Jډ J]]U WVSuM U4EfQff| %4E Ɖ EMW}}}8%8 ‰%8 Ê8 21Љ1!Љကt>!t ‰ ‰ Ӊ!t   !Ë}}}}8%8 ‰%8 Ê8 21Љ1!Љကt>!t ‰ ‰ Ӊ!t   !Ë}_}}e[^_]UWVS}E MfHff| %4E4E lj E]]Mc]3]]% ‰% ‰Ë] 491ȉ1!Љ t>!t   Ή!t ‰ ‰ ‰!Ƌ]]C C ŠC ‰U11!Љ t?u!t Ɖ Ɖ !t ‰ ‰ ‰!] ]3]]% ‰% ‰Ë] 491ȉ1!Љ t>!t   Ή!t ‰ ‰ ‰!Ƌ]SC C Š ‰U11!Љ t?u!t Ɖ Ɖ !t ‰ ‰ ‰!]K]]]]e[^_]UWVSM }ufyf=f=| Љ4Efqff|%4E4E4EE}M]]E]3]E]]‹]U! ȋE%]%]GU! % E%]%]GU! % E]Ë]GU!  ] ]]E]3]E]]GU!Љ E%]%]GU! % E%]%]GU! % E]Ë]U!  ]K] ]]|e[^_]UlWVSDž]M E uFM t]M1AAAAAA E u:DžDžDžDž] tA{1M t&Cq1] Àt&ACDžM tCA Dž+񉍔++R؉)BBBƉى)] tM]; 1M t&CADž+M t$Cy1] @t&Dž+B񉍔)ދ+ +{ K􋍔+KK+sK+ E E m E E mDžI`I [)ى++R)BBBى+ [߉)ދI)ىˋBÉ)Ɖ+ @@@@  Ƌ @@  Ƌ@@  Ɖ)ˁ@@ +@@  Ƌ+@@  Ƌ+@@  G! ! % Ƌ! % Ƌ!  Ɖ! ! % Ƌ! % ƋЉ!  ƋMq]ىMU[^_]UWVSDžDž} hdDž`E uN1M t}dAAAAAADžDžDžDžE kM thG`A쉅M thG`AM thG`AM thG`A+++B IЍAÍCC+ωDžX1Dž\1E UM t}XM thG`Y؋M thG`A\M @th`1)PދX+\\X։\X+\\X)׉\ӋX9ߋdy苽\y싽y+q\+y+YX+9` d hEm E E m^Džp}l0p`ppIp +++B IЍAÍCC+ω ppIp?X t)PωX+X׉)X)׉}5@M ˋ9@l \ Ë9@l \ ËX@lI \ ÉX)@lX \+@lI \ Ë+@l \ Ë+@l4 \ \@! ؋! % Ë! % Ë!  ÉX! ؋! % Ë! % ÉЉ!  Ë}_}l}@\9@\ ډ \@ ډ \X9@ ډ \X)@X ډ\+@| ډ \+@x ډ \+@t ډ \g! %\! % \! % \!  \XX! %\||! % \xx! % \tЉ!  \M9\ypMML[^_]5?>ԋ ?u=?UDWVSDžu]X}KP$)R$ٝSKP$ٝ)R$ٝSKP$)R$K P$)م^م ٞ`^Q$مم؅ م ٕ^؅^؅ٕ$ٞ@ح] } }DžuMC ٝCCٝCCkٝCٕٝمٕ}ٽ ٭$X٭}fمNٽ ٭$X٭fAمم Nٽ ٭$X٭fANٽ ٭$X٭fAم؅م؅ٕ ٕمٕ ٝإNٽ ٭$X٭fAم؅Nٽ ٭$X٭fAم؅ٕ$؍Nٽ ٭$X٭fAٕٽ ٭$X٭f} E 4[^_]U@WVSEM MЋ]]̋MMȐ}]]MqY] M] ]MIM][]M MEE]]܍Ë}ωM]fM+MMԍUEEB]fC+UMMMIfS]+]]č [EȉEċ]؋M)]fCM MfMfK]ԉڋM܍I)‰Ћ]E+EMfAE)؉}fA+uuuu[4p]M]f]ȃEEEEE Eoe[^_];f?S|>P?8{zQ?>7>?;f?X?D?(sـ? ? ]9 Q Q)? _ j ? c, j Q$Q1 ? ]9]Q]%IQ$%6(k9)c,Q19I(k1overlaymodulecompositor/422compositor/411US]jSC +CCCC؋]]transparentload-10UWVSE Uus{SEP.[u͍e[^_]U WVSU uvu}}Bu A)9E}])BA)9E}M)ыEE}W,Ix%19} @9|U搐e[^_]UVSu] E؋F,PSF,SjP2e[^]US]jSC p+؋]]UWVSu} ~UV]߉^ۋF(PS/F(F$URWV\e[^_]UWVS}Mq] M MMM CMACAMu uJyMGAMJy)щMMAE)ǺMGAMJye[^_]U^9Et"}9CDC}:}:9MƋ}GEEE} G+E4F뗐e[^_]US]jS!C @+؋]]UWVS]u sMKEƉCЍ}DC}:}:9M}G}-q=UWVS]u߅u@-d 4VMQMQM Q0 uM $PtjxR۽h覎 Sۭh~x)ы|+S\-R $Q$È@t+SR$u*Kd-Eu xW|WtO$WR]SdVSMQMQM Q0 ƀt S1\[^_]%gusage: rate_variable varname filter_constrate_variable: invalid filter constantUWVSE }u w ,t'//GPF]]t]Eu!'0/kj,ME[CCCVCP舍Shp-jaGP'PI3 ƃ tS6e[^_]UUE B 0PR]UP0jhP]rate_variableUh0hPP0]`0`/US]E PSC 0؋]]US]jSC \2CC؋]]UUE B \2PR]key01UWVS]U EuLpo1u8@PSNt's1'u11 PRSe[^_]UlWVSu ]S0HPVSS]SMQ SB8ȉEPB<Ѝe[^_]T11UE@]UE@]cryptDULL/dataDULL/ctrlUS]S3C 44h /C؋]]UVS]u C 44CPQVSe[^]UEU P1]UWVSEu ]UH19}<1ω<@9|e[^_]US]U EPCPRSC]]UVS]M uUFPRQSpe[^]Uh2h$4]t43133D3UWVU 0ֿ2 tֿ2 utj P- 1e^_]format { jpeg }US]E PS;C 8CCC4؋]]rcannot stat frameU`VSuU h5RÃuh5kURSRfk}h5BUЋMԉVVt RVBRFSjVRPSe[^]openjpegfileLoading %s UWVS]} s5uF1s5uUB P(UR@,Ѕt '1Ls5uCPh5CPURSU RUR e[^_]UhP ]US]SC9C8C 9؋]]UEU @9@8@ 9RP]qUWVS]U Eup)7u1 PRS耷e[^_]UVS]sVg;ݛSBVBЍe[^]UEP ;]US]=t\SBDPBЉMEE@EUEPES\J EPA(RA,Ћ]]UUE B PR]Ujh]stillUh8h.]P85|67tLu7H707777modulebvcUS]jSQC TC<C8C(CCjjSjjSjjS$jjSjjSjjS$jjSjjS~jjSt$jj Sg؋]]UUE B PR]U WVS}W8G/W8G.BW8G,BW8G,Bw8M +q W0ƉЃtF)É؃Eu}uZM AqY]}thf M]KM QG$P}Fe[^_]qUWVSE ]u?s;u+CP誚ƋC P蟚PVUR,1SPURe[^_]UWVS] u [Ћ}#G( ЉG(VS@We[^_]UWVSEp@M IDž@CA|A+|Džx| ||9ى|4@[+)t 1|‹))Bt}‹/]فDžFFDžxF>F@I|+)t 1|ˆЋA+|)Bt}ˆЋCKDžxlFFOx|FF@I+)A|볐MDž8@9CЍ 8)C yA8|)A@{C 8)C`y8)|Ѝ 8 )C|+ɉK+҉MDž(3y7)As{ 7|)Cqy7)As;7)A|׍D7)C|+||K+ p[^_]U<WVSUDžUR]]]S`;U8)B ]C=C<{WuVEPsuVuVE P(suVC$PE$PCPWEPCPuVEP$C PuVEPK K K uVFQ QЊV  Q e[^_]UWVS]u UMЅuuZM1t@rC0C0 vWEM C,C,S8S8C.BS8C,BS8C,BC8 )ȉ{,MK0 ) C,t}S0BC0 v`rE C,C,S8S8C.BS8C,BS8C,BC8 )}{,s0 )E C,e[^_]UWVS]} u 0LEEׅtE!9EtugMK0MK0 vFC,C,S8S8C.BS8C,BS8C,BC8C,K0C,C,C0@EC0 vaEM C,C,S8S8C.BS8C,BS8C,BC8 )Ⱦs,MK0 ) C,e[^_]UVSuU F F F B?;Q@~!1 D D D BCŐe[^]UDWVS@E@PM QNSM QPSQMA0PQ0 v]XM M A,A,Q8Q8A.BQ8A,BQ8A,BA8M  )؉MQ,Y0M  )щM A,8RPjMQoà PSMQPˆF F FFFFFFF NN>PM  PMQ N>}5IY+PWMQǃ 9Q?Fـ FFـFFFF؈F+PWMQ]ǃ Q?d+PWMQ+ӈˆF Fـ FFFـFFFFFF؈FeӁ~dWM  PMQ~WM DPMQkWM DPMQX$WM D PMQB @9I[^_]UVS]E @VPSVS8[^]UWVSu} hj@EPPFPSWSV4[^_]UWVS]E jPC$PNjwF F CFCFC(PFC4P׊fFG C8S$BCU(P ] ]S讠M(ShP=u E^؋UPà<[WnMWjPUX ($PdE UPM$URM QURSe[^_]UVSu] M1PR9u 2B?~e[^]UWVS} u1ۋMM +9tRSMQ C֐MQ7e[^_]UWVSu|E|U Љxt+|0x+|pDžl |\l 0hpvd0?40pFpDž``4 [hd)tfthd0?40pFpʉ)tftp\0px} +|Džl lsXp0 CDž44xPIX0tfXDž0 Cʉft믐|\;etE}E (TDžPP`tyt@4T0FT9L 46H4 9D 4 4Dž@@lD<<4[8LH)t 1҅|Ћ0u0DLH1D 4 4<8)t 1҅|Ћ0}0'$[^_]U(WVSDžDžMM1#Džz)7rz)Ή)RY)ы B苍)ىJZR)ыJr)ىJ߉: EDžM:@)ω`J))ϋщqQ)!Í؋M Uы!Í؈ы+!Í؈ы!Í؈щM q)!Í؋M Uэ>!Í؈ы+!Í؈ы!Í؈э)AM .[^_]UWVSuE}1ۨtCr)؉y=@ щ щ@MH!EHy=@ щ щ@ƒ)) ÅtۋM e[^_]UVS]u tpHy=@ щ щ@u뚐e[^]UWVSUyC@, ى ى@UU Ux1ҋxA|xCOوB~эT[^_]UWVS]E EǃE9gHy=@ щ щ@t E$A}=@ щ щ@tdA}=@ щ щ@ƒbA}=@ щ щ@UE}ƋEƋ})9r9sCVWSE$ D D  e[^_]UWVS]} w GEGM9u9t7}wvE@C$C RMQPHR@LЃ 9Ft&P^PFPTPSzFF PmPMQMQSPm}S.(PS}>ǃe[^_]UWVSE$UE1E9M~G19u~1UU1ۀ?tEPSURM MGF9u׃EA뼐e[^_]UVS]u RQ(PRQVS<e[^]UU(PRy;]UhThm]nUtxkm8WDXmUE hTPQuh P]Ð1] ''''''''eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ++++++++++++++++++++++++++++++++                                kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK++++++++++++++++++++++++++++++++                                jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ****************************************************************                                                                hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! iiHH((HH((hhhhHHHH((((hhhhhhGGGGGGGGGGGG''''''''''''ffffffffEEEEEEEEEEEEEEEE%%%%%%%%%%%%%%%% +KkkJJ**   ((((((((HHHHHHHHhhhhhhhheeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD################################################################################################################################################################################################################################################################N Ny. .y tnnpNNl..d..h<D8H4L0PNN..~~ , , T T y y tt ( ( X XMMMpMpxx~~~~ $ $ \ \mmm~m~MMM~M~---l-lm m mtmt ` `xx---~-~         ~ ~ ~ ~ ~ ~ ~ ~xxxxxxxx         d d d d d d d dK K K K K K K K KtKtKtKtKtKtKtKt+++++++++p+p+p+p+p+p+p+p}}}}}}}}}}}}}}}}xxxxxxxxHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHxHx(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}(}pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x'x||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}                                 h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiixixixixixixixixixixixixixixixixixixixixixixixixixixixixixixixix) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t)t                                 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l lIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}I}                                                                                                                                                                                                                                                                tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|f|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|E|$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||Uh jh ] proc fork_histtolut { } { global V if { $V(dither) == "gray" } { open_dialog "cannot optimize grayscale rendering" return } set ch [$V(colorModel) create-hist] set active 0 foreach src [session active] { set d [$src handler] if { ![$src mute] && $d != "" } { $d histogram $ch set active 1 } } if !$active { open_dialog "no active, unmuted sources" delete $ch return } set pid [pid] set outfile /tmp/vicLUT.$pid set infile /tmp/vicHIST.$pid if { [$ch dump $infile] < 0 } { open_dialog "couldn't create $infile" delete $ch return } delete $ch set eflag "" if { $V(dither) == "ed" } { set eflag "-e" } if [catch \ "open \"|histtolut $eflag -n 170 -o $outfile $infile\"" pipe] { open_dialog "histtolut not installed in your path" return } fileevent $pipe readable "finish_histtolut $pipe $infile $outfile" $V(optionsMenu) entryconfigure "Optimize Colormap" \ -state disabled .menu configure -cursor watch } proc finish_histtolut { pipe infile outfile } { .menu configure -cursor "" global V $V(optionsMenu) entryconfigure "Optimize Colormap" \ -state normal set cm $V(colorModel) $cm free-colors $cm lut $outfile if ![$cm alloc-colors] { revert_to_gray } foreach src [session active] { set d [$src handler] if { $d != "" } { $d redraw } } fileevent $pipe readable "" close $pipe } proc have_transmit_permission {} { global inputDeviceList return [expr [info exists inputDeviceList] && ![yesno recvOnly]] } proc build.menu { } { set w .menu create_toplevel $w "vic menu" wm withdraw $w catch "wm resizable $w false false" frame $w.session frame $w.cb build.xmit $w.cb frame $w.encoder build.encoder $w.encoder frame $w.decoder build.decoder $w.decoder global V set net $V(data-net) build.session $w.session [$net addr] [$net port] \ [[srctab local] srcid] [$net ttl] [[srctab local] sdes name] button $w.dismiss -text Dismiss -borderwidth 2 -width 8 \ -relief raised -anchor c \ -command "toggle_window $w" -font [mediumfont] pack $w.cb $w.encoder $w.decoder $w.session -padx 6 -fill x pack $w.dismiss -anchor c -pady 4 if [have_transmit_permission] { selectInitialDevice } } proc defaultDevice {} { set d [resource defaultDevice] if { $d == "" } { set d [resource device] } return $d } proc selectInitialDevice {} { global videoDevice inputDeviceList set d [defaultDevice] foreach v $inputDeviceList { if { [$v nickname] == "$d" && \ [$v attributes] != "disabled" } { set videoDevice $v select_device $v return } } foreach v $inputDeviceList { if { "[$v attributes]" != "disabled" && "[$v nickname]" != "still" } { set videoDevice $v select_device $v return } } } proc build.session { w dst port srcid ttl name } { set f [smallfont] label $w.title -text Session pack $w.title -fill x frame $w.nb -relief sunken -borderwidth 2 pack $w.nb -fill x frame $w.nb.frame pack append $w.nb \ $w.nb.frame { top fillx } label $w.nb.frame.info -font $f -anchor w \ -text "Dest: $dst Port: $port ID: $srcid TTL: $ttl" frame $w.nb.frame.name label $w.nb.frame.name.label -text "Name: " -font $f -anchor e -width 6 mk.entry $w.nb.frame.name updateName $name pack $w.nb.frame.name.label -side left pack $w.nb.frame.name.entry -side left -expand 1 -fill x -pady 2 frame $w.nb.frame.msg label $w.nb.frame.msg.label -text "Note: " -font $f -anchor e -width 6 mk.entry $w.nb.frame.msg update_note "" pack $w.nb.frame.msg.label -side left pack $w.nb.frame.msg.entry -side left -expand 1 -fill x -pady 2 mk.key $w.nb.frame frame $w.nb.frame.b button $w.nb.frame.b.stats -text "Global Stats" -borderwidth 2 \ -anchor c -font $f -command create_global_window button $w.nb.frame.b.members -text Members -borderwidth 2 \ -anchor c -font $f -command "toggle_window .srclist" pack $w.nb.frame.b.stats $w.nb.frame.b.members \ -side left -padx 4 -pady 2 -anchor c pack $w.nb.frame.info $w.nb.frame.name $w.nb.frame.msg \ $w.nb.frame.key \ -fill x -padx 2 -expand 1 pack $w.nb.frame.b -pady 2 -anchor c } proc setFillRate { } { global sendingSlides transmitButtonState V if { $transmitButtonState } { if { $sendingSlides } { $V(grabber) fillrate 16 } else { $V(grabber) fillrate 2 } } } proc updateName { w name } { set name [string trim $name] if { $name != ""} { [srctab local] sdes name $name return 0 } return -1 } proc update_note { w s } { set s [string trim $s] [srctab local] sdes note $s return 0 } proc encoder args { global V if ![info exists V(encoder)] { puts "vic: encoder: no encoder" return } eval $V(encoder) $args } proc grabber args { global V if ![info exists V(grabber)] { return } eval $V(grabber) $args } proc create_encoder fmt { if { $fmt == "nvdct" } { set encoder [new module nv] $encoder use-dct 1 } else { set encoder [new module $fmt] } return $encoder } set transmitButtonState 0 proc transmit { } { global transmitButtonState videoFormat videoDevice V useJPEGforH261 if ![have grabber] { set DA [$videoDevice attributes] set DF [attribute_class $DA format] set DS [attribute_class $DA size] if { [inList $videoFormat $DF] } { set encoder [create_encoder $videoFormat] set grabtarget $encoder set grabq "" } elseif { $videoFormat == "h261" && [inList jpeg $DF] && \ $useJPEGforH261 } { set transcoder [new transcoder jpeg/dct] set encoder [new module h261/dct] $transcoder target $encoder set grabtarget $transcoder set grabq "70" } elseif { [inList $videoFormat [device_formats $videoDevice] ] } { set encoder [create_encoder $videoFormat] set grabtarget $encoder set grabq "" } $encoder transmitter $V(session) set V(encoder) $encoder set ff [$grabtarget frame-format] set V(grabber) [$videoDevice open $ff] if { $V(grabber) == "" && $ff == "411" } { set V(grabber) [$videoDevice open cif] } if { $V(grabber) == "" } { puts XXX couldn't set up grabber/encoder for $ff->$videoFormat exit 1 } set error [$V(grabber) status] if { $error < 0 } { close_device if { $error == -2 } { set transmitButtonState 0 open_dialog \ "Can't use jvideo with $videoFormat format" select_device $videoDevice return } set transmitButtonState 0 open_dialog \ "can't open [$videoDevice nickname] capture device" return } if ![tm_init $V(grabber) $grabtarget] { $V(grabber) target $grabtarget } init_grabber $V(grabber) if { $grabq != "" } { $V(grabber) q $grabq } } if [have capwin] { set w [winfo toplevel $V(capwin)] if $transmitButtonState { wm deiconify $w } else { wm withdraw $w } update idletasks } $V(grabber) send $transmitButtonState } proc close_device {} { global V delete $V(encoder) delete $V(grabber) unset V(grabber) V(encoder) if [info exists V(capwin)] { delete $V(capwin) destroy [winfo toplevel $V(capwin)] unset V(capwin) } } proc release_device { } { global transmitButtonState transmitButton if [have grabber] { if $transmitButtonState { $transmitButton invoke } close_device } } proc build.buttons w { set f [smallfont] global transmitButton set transmitButton $w.send checkbutton $w.send -text "Transmit" \ -relief raised -command transmit \ -anchor w -variable transmitButtonState -font $f \ -state disabled -highlightthickness 0 button $w.release -text "Release" \ -relief raised -command release_device \ -font $f -highlightthickness 0 pack $w.send $w.release -fill both } proc doNothing { args } { } proc set_bps { w value } { if [have grabber] { grabber bps $value session data-bandwidth $value } $w configure -text "$value kbps" } proc set_fps { w value } { grabber fps $value $w configure -text "$value fps" } proc build.sliders w { set f [smallfont] global V set key $V(session) global ftext btext set ftext($key) "0.0 f/s" set btext($key) "0.0 kb/s" frame $w.info label $w.info.label -text "Rate Control" -font $f label $w.info.fps -textvariable ftext($key) -width 6 \ -font $f -pady 0 -borderwidth 0 label $w.info.bps -textvariable btext($key) -width 8 \ -font $f -pady 0 -borderwidth 0 pack $w.info.label -side left pack $w.info.bps $w.info.fps -side right frame $w.bps scale $w.bps.scale -orient horizontal -font $f \ -showvalue 0 -from 10 -to [option get . maxbw Vic] \ -command "set_bps $w.bps.value" -width 12 \ -relief groove label $w.bps.value -font $f -width 8 -anchor w frame $w.fps scale $w.fps.scale -font $f -orient horizontal \ -showvalue 0 -from 1 -to 30 \ -command "set_fps $w.fps.value" -width 12 \ -relief groove label $w.fps.value -font $f -width 8 -anchor w pack $w.info -fill x pack $w.bps $w.fps -fill x pack $w.bps.scale -side left -fill x -expand 1 pack $w.bps.value -side left -anchor w pack $w.fps.scale -fill x -side left -expand 1 pack $w.fps.value -side left -anchor w $w.bps.scale set [option get . bandwidth Vic] $w.fps.scale set [option get . framerate Vic] global fps_slider bps_slider set fps_slider $w.fps.scale set bps_slider $w.bps.scale } proc attribute_class { attr class } { while { [llength $attr] >= 2 } { if { [lindex $attr 0] == $class } { return [lindex $attr 1] } set attr [lrange $attr 2 end] } return "" } proc inList { item L } { foreach v $L { if { $v == $item } { return 1 } } return 0 } proc device_supports { device class attr } { set L [$device attributes] set L [attribute_class $L $class] if { $attr == "*" } { if { $L == "" } { return 0 } else { return 1 } } else { return [inList $attr $L] } } proc device_formats device { set L [$device attributes] set sizes [attribute_class $L size] set formats [attribute_class $L format] set fmtList "" if [inList 422 $formats] { set fmtList "$fmtList nv nvdct cellb" } if [inList 411 $formats] { set fmtList "$fmtList bvc" } if [inList cif $sizes] { set fmtList "$fmtList h261" } if [inList jpeg $formats] { set fmtList "$fmtList jpeg" global useJPEGforH261 if $useJPEGforH261 { set fmtList "$fmtList h261" } } return $fmtList } proc insert_grabber_panel devname { set k [string first - $devname] if { $k >= 0 } { incr k -1 set devname [string range $devname 0 $k] } set w .menu.$devname global grabberPanel if [info exists grabberPanel] { if { "$grabberPanel" == "$w" } { return } pack forget $grabberPanel unset grabberPanel } if { [info procs build.$devname] != "" } { if ![winfo exists $w] { frame $w build.$devname $w } pack $w -before .menu.encoder -padx 6 -fill x set grabberPanel $w } } proc select_device device { global transmitButton sizeButtons portButton formatButtons \ videoFormat defaultFormat lastDevice defaultPort inputPort \ transmitButtonState set wasTransmitting $transmitButtonState if [info exists lastDevice] { set defaultFormat($lastDevice) $videoFormat set defaultPort($lastDevice) $inputPort release_device } set lastDevice $device set fmtList [device_formats $device] foreach b $formatButtons { set fmt [lindex [$b configure -value] 4] if { $fmt == "bvc" && ![yesno enableBVC] } { $b configure -state disabled } elseif { [inList $fmt $fmtList] } { $b configure -state normal } else { $b configure -state disabled } } $transmitButton configure -state normal if [device_supports $device size small] { $sizeButtons.b0 configure -state normal } else { $sizeButtons.b0 configure -state disabled } if [device_supports $device size large] { $sizeButtons.b2 configure -state normal } else { $sizeButtons.b2 configure -state disabled } if [device_supports $device port *] { $portButton configure -state normal attach_ports $device } else { $portButton configure -state disabled } insert_grabber_panel [$device nickname] set videoFormat $defaultFormat($device) select_format $videoFormat if $wasTransmitting { $transmitButton invoke } } proc build.device w { set f [smallfont] set m $w.menu menubutton $w -menu $m -text Device... \ -relief raised -width 10 -font $f menu $m global defaultFormat inputDeviceList videoFormat set videoFormat [option get . defaultFormat Vic] if { $videoFormat == "h.261" } { set videoFormat h261 } if { ![info exists inputDeviceList] || ![have_transmit_permission] } { $w configure -state disabled return } foreach d $inputDeviceList { if { [$d nickname] == "still" && ![yesno stillGrabber] } { set defaultFormat($d) $videoFormat continue } $m add radiobutton -label [$d nickname] \ -command "select_device $d" \ -value $d -variable videoDevice -font $f if { "[$d attributes]" == "disabled" } { $m entryconfigure [$d nickname] -state disabled } set fmtList [device_formats $d] if [inList $videoFormat $fmtList] { set defaultFormat($d) $videoFormat } else { set defaultFormat($d) [lindex $fmtList 0] } } } proc format_col { w n0 n1 n2 } { set f [smallfont] frame $w radiobutton $w.b0 -text $n0 -relief flat -font $f -anchor w \ -variable videoFormat -value $n0 -padx 0 -pady 0 \ -command "select_format $n0" -state disabled radiobutton $w.b1 -text $n1 -relief flat -font $f -anchor w \ -variable videoFormat -value $n1 -padx 0 -pady 0 \ -command "select_format $n1" -state disabled radiobutton $w.b2 -text $n2 -relief flat -font $f -anchor w \ -variable videoFormat -value $n2 -padx 0 -pady 0 \ -command "select_format $n2" -state disabled pack $w.b0 $w.b1 $w.b2 -fill x global formatButtons lappend formatButtons $w.b0 $w.b1 $w.b2 } proc build.format w { format_col $w.p0 nv nvdct cellb format_col $w.p1 jpeg h261 bvc frame $w.glue0 frame $w.glue1 pack $w.glue0 -side left -fill x -expand 1 pack $w.p0 $w.p1 -side left pack $w.glue1 -side left -fill x -expand 1 } proc build.size w { set f [smallfont] set b $w.b frame $b radiobutton $b.b0 -text "small" -command "grabber decimate 4" \ -padx 0 -pady 0 \ -anchor w -variable inputSize -font $f -relief flat -value 4 radiobutton $b.b1 -text "normal" -command "grabber decimate 2" \ -padx 0 -pady 0 \ -anchor w -variable inputSize -font $f -relief flat -value 2 radiobutton $b.b2 -text "large" -command "grabber decimate 1" \ -padx 0 -pady 0 \ -anchor w -variable inputSize -font $f -relief flat -value 1 pack $b.b0 $b.b1 $b.b2 -fill x pack $b -anchor c -side left global inputSize sizeButtons set inputSize 2 set sizeButtons $b } proc build.port w { set f [smallfont] menubutton $w -menu $w.menu -text Port... \ -relief raised -width 10 -font $f -state disabled global portButton inputPort set portButton $w set inputPort undefined } proc attach_ports device { global portButton inputPort defaultPort catch "destroy $portButton.menu" set portnames [attribute_class [$device attributes] port] set f [smallfont] set m $portButton.menu menu $m foreach port $portnames { $m add radiobutton -label $port \ -command "grabber port $port" \ -value $port -variable inputPort -font $f } if ![info exists defaultPort($device)] { set nn [$device nickname] if [info exists defaultPort($nn)] { set defaultPort($device) $defaultPort($nn) } else { set s [resource defaultPort($nn)] if { $s != "" } { set defaultPort($device) $s } else { set defaultPort($device) [lindex $portnames 0] } } } set inputPort $defaultPort($device) } proc build.type w { set f [smallfont] set m $w.menu menubutton $w -text Signal... -menu $m -relief raised \ -width 10 -font $f -state disabled menu $m $m add radiobutton -label "auto" -command restart \ -value auto -variable inputType -font $f $m add radiobutton -label "NTSC" -command restart \ -value ntsc -variable inputType -font $f $m add radiobutton -label "PAL" -command restart \ -value pal -variable inputType -font $f $m add radiobutton -label "SECAM" -command restart \ -value secam -variable inputType -font $f global inputType typeButton set inputType auto set typeButton $w } proc build.encoder_buttons w { set f [smallfont] build.encoder_options $w.options build.device $w.device build.port $w.port pack $w.device $w.port $w.options -fill x } proc build.encoder_options w { global useJPEGforH261 set useJPEGforH261 [yesno useJPEGforH261] set f [smallfont] set m $w.menu menubutton $w -text Options... -menu $m -relief raised -width 10 \ -font $f menu $m $m add checkbutton -label "Sending Slides" \ -variable sendingSlides -font $f -command setFillRate $m add checkbutton -label "Use JPEG for H261" \ -variable useJPEGforH261 -font $f -command restart } proc build.tile w { set f [smallfont] set m $w.menu menubutton $w -text Tile... -menu $m -relief raised -width 10 \ -font $f menu $m $m add radiobutton -label Single -command "redecorate 1" \ -value 1 -variable V(ncol) -font $f $m add radiobutton -label Double -command "redecorate 2" \ -value 2 -variable V(ncol) -font $f $m add radiobutton -label Triple -command "redecorate 3" \ -value 3 -variable V(ncol) -font $f $m add radiobutton -label Quad -command "redecorate 4" \ -value 4 -variable V(ncol) -font $f } proc build.decoder_options w { set f [smallfont] set m $w.menu menubutton $w -text Options... -menu $m -relief raised -width 10 \ -font $f menu $m $m add checkbutton -label "Mute New Sources" \ -variable V(muteNewSources) -font $f $m add checkbutton -label "Use Hardware Decode" \ -variable V(useHardwareDecode) -font $f $m add separator $m add command -label "Optimize Colormap" \ -command fork_histtolut -font $f global V set V(optionsMenu) $m if ![have dither] { $m entryconfigure "Optimize Colormap" -state disabled } } proc build.external w { set f [smallfont] set m $w.menu global outputDeviceList if ![info exists outputDeviceList] { set outputDeviceList "" } if { [llength $outputDeviceList] <= 1 } { button $w -text External -relief raised \ -width 10 -font $f -highlightthickness 0 \ -command "extout_select $outputDeviceList" } else { menubutton $w -text External... -menu $m -relief raised \ -width 10 -font $f menu $m foreach d $outputDeviceList { $m add command -font $f -label [$d nickname] \ -command "extout_select $d" } } if { $outputDeviceList == "" } { $w configure -state disabled } } proc build.dither w { set f [smallfont] if [have dither] { set var V(dither) set state normal } else { set var dummyDither set state disabled } set v $w.h0 frame $v radiobutton $v.b0 -text "Ordered" -command set_dither \ -padx 0 -pady 0 \ -anchor w -variable $var -state $state \ -font $f -relief flat -value od radiobutton $v.b1 -text "Error Diff" -command set_dither \ -padx 0 -pady 0 \ -anchor w -variable $var -state $state \ -font $f -relief flat -value ed set v $w.h1 frame $v radiobutton $v.b2 -text Quantize -command set_dither \ -padx 0 -pady 0 \ -anchor w -variable $var -state $state \ -font $f -relief flat \ -value quantize radiobutton $v.b3 -text Gray -command set_dither \ -padx 0 -pady 0 \ -anchor w -variable $var -state $state \ -font $f -relief flat -value gray pack $w.h0.b0 $w.h0.b1 -anchor w -fill x pack $w.h1.b2 $w.h1.b3 -anchor w -fill x pack $w.h0 $w.h1 -side left } proc update_gamma { w s } { global V win_src set cm $V(colorModel) if ![$cm gamma $s] { return -1 } set V(gamma) $s $cm free-colors if ![$cm alloc-colors] { revert_to_gray } foreach src [session active] { set d [$src handler] if { $d != "" } { $d redraw } } return 0 } proc build.gamma w { global V frame $w label $w.label -text "Gamma: " -font [smallfont] -anchor e mk.entry $w update_gamma $V(gamma) $w.entry configure -width 6 if ![have dither] { $w.entry configure -state disabled -foreground gray60 $w.label configure -foreground gray60 } pack $w.label -side left pack $w.entry -side left -expand 1 -fill x -pady 2 } proc build.decoder w { set f [smallfont] label $w.title -text Display frame $w.f -relief sunken -borderwidth 2 set v $w.f.h0 frame $v build.external $v.ext build.tile $v.tile build.decoder_options $v.options pack $v.options $v.tile $v.ext -fill x -expand 1 set v $w.f.h2 frame $v frame $v.dither -relief groove -borderwidth 2 build.dither $v.dither frame $v.bot build.gamma $v.bot.gamma label $v.bot.mode -text "\[[winfo depth .top]-bit\]" -font $f pack $v.bot.gamma $v.bot.mode -side left -padx 4 pack $v.dither $v.bot -anchor c -pady 2 pack $w.f.h0 -side left -padx 6 -pady 6 pack $w.f.h2 -side left -padx 6 -pady 6 -fill x -expand 1 pack $w.title $w.f -fill x } proc build.encoder w { label $w.title -text Encoder frame $w.f -relief sunken -borderwidth 2 frame $w.f.h0 -relief flat frame $w.f.h1 -relief flat frame $w.f.h0.eb -relief flat frame $w.f.h0.format -relief groove -borderwidth 2 frame $w.f.h0.size -relief groove -borderwidth 2 frame $w.f.h0.gap -relief flat -width 4 build.encoder_buttons $w.f.h0.eb build.format $w.f.h0.format build.size $w.f.h0.size build.q $w.f.h1 pack $w.f.h0.eb -side left -anchor n -fill y -padx 6 -pady 4 pack $w.f.h0.format -side left -anchor n -fill both -expand 1 pack $w.f.h0.size -side left -anchor c -fill both pack $w.f.h0.gap -side left -anchor c pack $w.f.h0 -fill x -pady 4 pack $w.f.h1 -fill x -pady 6 pack $w.title $w.f -fill x } proc jpeg_setq value { incr value if { $value > 95 } { set value 95 } elseif { $value < 5 } { set value 5 } grabber q $value global qvalue $qvalue configure -text $value } proc h261_setq value { set value [expr int((1 - $value / 100.) * 29) + 1] if [have grabber] { encoder q $value } global qvalue $qvalue configure -text $value } proc nv_setq value { set value [expr (100 - $value) / 10] if [have grabber] { encoder q $value } global qvalue $qvalue configure -text $value } proc nvdct_setq value { nv_setq $value } set bvc_quantizer(0) { 0 0 0 0 1 1 1 1 2 2 } set bvc_quantizer(1) { 0 0 0 1 1 1 1 1 2 3 } set bvc_quantizer(2) { 0 0 0 1 1 1 1 2 3 3 } set bvc_quantizer(3) { 0 0 0 1 1 1 2 2 4 4 } set bvc_quantizer(4) { 0 0 0 2 2 2 3 3 4 4 } set bvc_quantizer(5) { 0 0 0 2 2 2 3 4 4 4 } set bvc_quantizer(6) { 0 0 0 2 2 2 4 4 5 5 } set bvc_quantizer(7) { 0 0 0 2 3 3 4 5 5 5 } set bvc_quantizer(8) { 0 0 0 2 3 4 6 6 6 6 } set bvc_quantizer(9) { 2 2 2 3 6 5 7 7 7 7 } proc bvc_setq value { set value [expr 9 - $value / 10] if [have grabber] { global bvc_quantizer set n 0 foreach q $bvc_quantizer($value) { encoder q $n [expr 7 - $q] incr n } } global qvalue $qvalue configure -text $value } proc restart { } { if [have grabber] { global transmitButtonState videoDevice V if $transmitButtonState { $V(grabber) send 0 close_device transmit } else { close_device } } } proc disable_large_button { } { global sizeButtons inputSize if { $inputSize == 1 } { set inputSize 2 } $sizeButtons.b2 configure -state disabled } proc enable_large_button { } { global sizeButtons videoDevice if { [info exists videoDevice] && \ [device_supports $videoDevice size large] } { $sizeButtons.b2 configure -state normal } } set qscale_val(h261) 68 set qscale_val(nv) 80 set qscale_val(nvdct) 80 set qscale_val(bvc) 60 set qscale_val(jpeg) 29 set lastFmt "" proc select_format fmt { global qscale qlabel videoFormat qscale_val lastFmt if { $fmt == "h261" } { disable_large_button } else { enable_large_button } set qscale_val($lastFmt) [$qscale get] set lastFmt $videoFormat set proc $fmt\_setq if [inList $proc [info commands *_setq]] { $qscale configure -state normal -command $proc $qlabel configure -foreground black } else { $qscale configure -state disabled $qlabel configure -foreground gray40 } if [info exists qscale_val($fmt)] { $qscale set $qscale_val($fmt) } if [have grabber] { global V set encoder [create_encoder $videoFormat] set ff [$encoder frame-format] if { "$ff" == "[$V(encoder) frame-format]" } { delete $V(encoder) set V(encoder) $encoder $encoder transmitter $V(session) $V(grabber) target $encoder } else { delete $encoder restart } } } proc init_grabber { grabber } { global V if { [$grabber need-capwin] && ![have capwin] } { toplevel .capture -class Vic wm title .capture "Video Capture Window" $grabber create-capwin .capture.video set V(capwin) .capture.video pack .capture.video bind .capture "raise .capture" } $grabber transmitter $V(session) global qscale inputSize fps_slider bps_slider videoDevice $grabber fps [$fps_slider get] $grabber bps [$bps_slider get] $grabber decimate $inputSize if { [lindex [$qscale configure -state] 4] == "normal" } { set cmd [lindex [$qscale configure -command] 4] $cmd [$qscale get] } global inputPort inputType portButton typeButton if { [$portButton cget -state] == "normal" } { $grabber port $inputPort } setFillRate update } proc build.q w { set f [smallfont] frame $w.tb label $w.title -text "Quality" -font $f -anchor w label $w.tb.value -text 0 -font $f -width 3 scale $w.tb.scale -font $f -orient horizontal \ -showvalue 0 -from 0 -to 99 \ -width 12 -relief groove global qscale qvalue qlabel set qscale $w.tb.scale set qvalue $w.tb.value set qlabel $w.title pack $w.tb.scale -side left -fill x -expand 1 pack $w.tb.value -side left pack $w.title -padx 2 -side left pack $w.tb -fill x -padx 6 -side left -expand 1 } proc build.xmit w { set f [smallfont] label $w.label -text Transmission frame $w.frame -relief sunken -borderwidth 2 pack $w.label -fill x pack $w.frame -fill both -expand 1 frame $w.frame.buttons build.buttons $w.frame.buttons frame $w.frame.right build.sliders $w.frame.right pack $w.frame.buttons -side left -padx 6 pack $w.frame.right -side right -expand 1 -fill x -padx 10 -anchor c } proc set_dither {} { global win_src set wlist [array names win_src] foreach w $wlist { set ws($w) $win_src($w) detach_window $win_src($w) $w } if ![init_color] { revert_to_gray } foreach w $wlist { attach_window $ws($w) $w } } proc revert_to_gray {} { global V if { $V(dither) == "gray" } { puts stderr "vic: out of colors" exit 1 } open_dialog "ran out of colors; reverting to gray" set V(dither) gray set_dither } Uhlljh] proc session args { global V eval $V(session) $args } proc build.bar w { global title frame $w.bar -relief ridge -borderwidth 2 label $w.bar.title -text "VIC v[version]" -font [smallfont] \ -relief flat -justify left button $w.bar.quit -text Quit -relief raised \ -font [smallfont] -command adios \ -highlightthickness 1 button $w.bar.menu -text Menu -relief raised \ -font [smallfont] -highlightthickness 1 \ -command "toggle_window .menu" button $w.bar.help -text Help -relief raised \ -font [smallfont] -highlightthickness 1 \ -command "toggle_window .help" pack $w.bar.title -side left -fill both -expand 1 pack $w.bar.menu $w.bar.help $w.bar.quit -side left -padx 1 -pady 1 } proc lookup_visual {} { set vlist [winfo visualsavailable .] if { [lsearch -exact $vlist "truecolor 24"] >= 0 || \ [lsearch -exact $vlist "truecolor 32"] >= 0 } { set visual "truecolor 24" } elseif { [lsearch -exact $vlist "truecolor 16"] >= 0 } { set visual "truecolor 16" } elseif { [lsearch -exact $vlist "pseudocolor 8"] >= 0 } { set visual "pseudocolor 8" } elseif { [lsearch -exact $vlist "staticgray 1"] >= 0 } { set visual "staticgray 1" } else { puts stderr "vic: no support for your display type" exit 1 } } proc init_visual w { global V set V(colormap) $w set dither [option get . dither Vic] if { $dither == "best" } { set dither ed } set V(gamma) [option get . gamma Vic] if { $dither == "dither" } { set dither od } if { [lsearch -exact "od ed gray quantize" $dither] < 0 } { puts stderr "vic: unknown dither: $dither" exit 1 } set visual [option get . visual Vic] if { $visual == "" } { set visual [lookup_visual] } elseif { $visual == "pseudocolor" } { set visual "pseudocolor 8" } set cmap "" if [yesno privateColormap] { set cmap "-colormap new" } if [catch "frame $w -visual {$visual} $cmap"] { puts stderr "$V(app): bad visual: $visual" exit 1 } if { [winfo depth $w] == 8 } { set V(dither) $dither } set V(visual) $visual } proc init_color {} { global V if [info exists V(colorModel)] { delete $V(colorModel) unset V(colorModel) } set v [winfo visual $V(colormap)] set d [winfo depth $V(colormap)] if { $d == 8 } { set id $v/$d/$V(dither) } else { set id $v/$d } set cm [new colormodel $id] if { $cm == "" } { puts stderr "vic: unsupported visual type: $v" exit 1 } $cm visual $V(colormap) $cm gamma $V(gamma) if ![$cm alloc-colors] { delete $cm return 0 } set V(colorModel) $cm return 1 } proc init_gui {} { global V init_visual .top if ![init_color] { if { [winfo depth .top] != 8 } { puts stderr "vic: internal error: no colors" exit 2 } puts stderr \ "vic: warning: ran out of colors; using private colormap" destroy .top frame .top -visual $V(visual) -colormap new if ![init_color] { puts stderr "vic: internal error: no colors" exit 2 } } build.srclist set_rate_vars $V(session) bind . { focus %W } bind . { adios } bind . { adios } bind . { adios } foreach i { 1 2 3 4 } { bind . "redecorate $i" } build.bar .top pack .top.bar -fill x -side bottom pack .top -expand 1 -fill both label .top.label -text "Waiting for video..." pack .top.label -before .top.bar -anchor c -expand 1 set geom [option get . geometry Vic] wm withdraw . wm geometry . $geom update idletasks set minwidth [winfo reqwidth .] set minheight [winfo reqheight .] if { $minwidth < 200 } { set minwidth 200 } if { $minheight < 100 } { set minheight 100 } wm minsize . $minwidth $minheight wm deiconify . set V(curcol) 0 set V(currow) 0 set V(ncol) [option get . tile Vic] set V(muteNewSources) [yesno muteNewSources] after 1000 periodic_update } proc add_active src { global active set active($src) 1 if { [array size active] == 1 } { pack forget .top.label set w .top.grid global V set V(grid) $w frame $w pack $w -fill both -anchor n } } proc rm_active src { global active V unset active($src) if { [array size active] == 0 } { pack forget $V(grid) destroy $V(grid) pack .top.label -before .top.bar -anchor c -expand 1 } } proc periodic_update { } { if [have grabber] { global V update_rate $V(session) } update idletasks after 1000 periodic_update } proc set_rate_vars src { global fpshat bpshat lhat shat if [info exists fpshat($src)] { unset fpshat($src) unset bpshat($src) unset lhat($src) unset shat($src) } set gain [option get . filterGain Vic] set fpshat($src) 0 rate_variable fpshat($src) $gain set bpshat($src) 0 rate_variable bpshat($src) $gain set lhat($src) 0 rate_variable lhat($src) $gain set shat($src) 0 rate_variable shat($src) $gain } proc select_thumbnail { w src } { global win_src set srcid [$src srcid] foreach w [winfo children .] { set vw $w.frame.video if { [winfo exists $vw] && $srcid == [$win_src($vw) srcid] && \ ![is_switched $vw] } { destroy_userwin $vw return } } open_window $src } proc update_source_info src { global src_info src_nickname src_name set name [$src sdes name] set cname [$src sdes cname] set addr [$src addr] if { $name == "" } { if { $cname == "" } { set src_nickname($src) $addr set info $addr/[rtp_format $src] } else { set src_nickname($src) $cname set info "$addr/[rtp_format $src]" } } elseif [cname_redundant $name $cname] { set src_nickname($src) $name set info $addr/[rtp_format $src] } else { set src_nickname($src) $name set info $cname/[rtp_format $src] } set src_info($src) $cname/[rtp_format $src] set msg [$src sdes note] if { $msg != "" } { set info $msg } set src_info($src) $info if { ![info exists src_name($src)] || "$src_name($src)" != "$name" } { set src_name($src) $name change_name $src } } proc adjust_voff { win d } { set ow [$win width] set oh [$win height] set iw [$d width] set ih [$d height] $win voff 0 if { $ow == 320 && $oh == 240 } { if { $iw == 352 && $ih == 288 } { $win voff 8 } elseif { $iw == 176 && $ih == 144 } { } } elseif { $ow == 640 && $oh == 480 } { if { $iw == 352 && $ih == 288 } { $win voff 16 } } } proc attach_renderer { src w } { global win_target win_is_slow win_use_hw V set d [$src handler] set target "" if { $win_use_hw($w) } { set fmt [rtp_format $src] if { $fmt == "jpeg" } { set fmt $fmt/[$d decimation] } set target [new assistor $fmt] if { $target != "" } { $target window $w } } if { $target == "" } { set target [$V(colorModel) renderer $w [$d decimation]] } if $win_is_slow($w) { $target update-interval [option get . stampInterval Vic] } adjust_voff $w $d $d attach $target set win_target($w) $target } proc detach_renderer { src w } { global win_target set d [$src handler] $d detach $win_target($w) delete $win_target($w) unset win_target($w) } proc attach_window { src w } { attach_renderer $src $w global win_src win_list set win_src($w) $src lappend win_list($src) $w if [viewing_window $w] { windowname [winfo toplevel $w] [getid $src] } } proc detach_window { src w } { global win_src win_list detach_renderer $src $w unset win_src($w) set k [lsearch -exact $win_list($src) $w] if { $k < 0 } { puts "vic: detach_window: XXX" exit 1 } set win_list($src) [lreplace $win_list($src) $k $k] } proc window_highlight { w color } { if { $w != "" } { $w configure -background $color foreach child [winfo children $w] { window_highlight $child $color } } } proc set_background { w color } { $w configure -background $color } proc build.src { w src color } { set f [smallfont] set stamp $w.stamp frame $stamp -relief ridge -borderwidth 2 bind $stamp "%W configure -background gray90" bind $stamp "%W configure -background [resource background]" create_video_widget $stamp.video 80 60 global win_is_slow set win_is_slow($stamp.video) 1 attach_window $src $stamp.video pack $stamp.video -side left -anchor c -padx 2 pack $stamp -side left -fill y frame $w.r frame $w.r.cw -relief groove -borderwidth 2 pack $w.r.cw -side left -expand 1 -fill both -anchor w -padx 0 label $w.r.cw.name -textvariable src_nickname($src) -font $f \ -pady 1 -borderwidth 0 -anchor w label $w.r.cw.addr -textvariable src_info($src) -font $f \ -pady 1 -borderwidth 0 -anchor w global ftext btext ltext set ftext($src) "0.0 f/s" set btext($src) "0.0 kb/s" set ltext($src) "(0%)" frame $w.r.cw.rateinfo label $w.r.cw.rateinfo.fps -textvariable ftext($src) -width 6 \ -font $f -pady 0 -borderwidth 0 label $w.r.cw.rateinfo.bps -textvariable btext($src) -width 8 \ -font $f -pady 0 -borderwidth 0 label $w.r.cw.rateinfo.loss -textvariable ltext($src) -width 6 \ -font $f -pady 0 -borderwidth 0 frame $w.r.ctrl -borderwidth 0 global mutebutton V set mutebutton($src) $V(muteNewSources) $src mute $mutebutton($src) checkbutton $w.r.ctrl.mute -text mute -borderwidth 2 \ -highlightthickness 1 \ -relief groove -font $f -width 4 \ -command "$src mute \$mutebutton($src)" \ -variable mutebutton($src) checkbutton $w.r.ctrl.color -text color -borderwidth 2 \ -highlightthickness 1 \ -relief groove -font $f -width 4 \ -command "\[$src handler\] color \$colorbutton($src)" \ -variable colorbutton($src) set m $w.r.ctrl.info.menu$src menubutton $w.r.ctrl.info -text info... -borderwidth 2 \ -highlightthickness 1 \ -relief groove -font $f -width 5 \ -menu $m build_info_menu $src $m pack $w.r.ctrl.mute -side left -fill x -expand 1 pack $w.r.ctrl.color -side left -fill x -expand 1 pack $w.r.ctrl.info -side left -fill x -expand 1 global colorbutton set colorbutton($src) 1 pack $w.r.cw.rateinfo.fps $w.r.cw.rateinfo.bps $w.r.cw.rateinfo.loss \ -side left -anchor w pack $w.r.cw.name $w.r.cw.addr $w.r.cw.rateinfo -anchor w -fill x pack $w.r.cw -fill x -side top pack $w.r.ctrl -fill x -side top pack $w.r -side left -expand 1 -fill x bind $stamp.video <1> "select_thumbnail $w $src" bind $stamp.video { focus %W } bind $stamp.video "$src deactivate" return $stamp.video } proc bump { } { global V incr V(curcol) if { $V(curcol) == $V(ncol) } { set V(curcol) 0 incr V(currow) } } proc redecorate n { global V set V(curcol) 0 set V(currow) 0 set V(ncol) $n if ![info exists V(grid)] { return } set w $V(grid) set list [session active] foreach src $list { grid $w.$src -row $V(currow) -column $V(curcol) -sticky we grid columnconfigure $w $V(curcol) -weight 1 bump } } proc create_decoder src { set decoder [new decoder [rtp_format $src]] if { $decoder == "" } { set decoder [new decoder null] } $src handler $decoder return $decoder } proc set_busy src {} proc activate src { create_decoder $src after idle "really_activate $src" } proc really_activate src { add_active $src global V set w $V(grid).$src frame $w -relief groove -borderwidth 0 \ -visual $V(visual) -colormap $V(colormap) build.src $w $src 1 grid $w -row $V(currow) -column $V(curcol) -sticky we grid columnconfigure $V(grid) $V(curcol) -weight 1 update_decoder $src after 1000 "update_src $src" bump } proc update_decoder src { set_rate_vars $src update_source_info $src } proc change_format src { global win_list if ![info exists win_list($src)] { return } set L $win_list($src) detach_renderers $src set extoutList [extout_detach_src $src] set d [$src handler] delete $d set d [create_decoder $src] update_decoder $src global colorbutton $d color $colorbutton($src) foreach w $L { attach_renderer $src $w $w redraw } extout_attach_src $src $extoutList } proc decoder_changed d { foreach src [session active] { if { [$src handler] == "$d" } { global active if ![info exists active($src)] { return } global win_list set L $win_list($src) detach_renderers $src set extoutList [extout_detach_src $src] foreach w $L { attach_renderer $src $w $w redraw } extout_attach_src $src $extoutList return } } } proc detach_renderers src { global win_list foreach w $win_list($src) { detach_renderer $src $w } } proc change_name src { global win_list nametag srclist set name [$src sdes name] if [info exists win_list($src)] { foreach w $win_list($src) { if [viewing_window $w] { windowname [winfo toplevel $w] $name } } } if [info exists srclist] { $srclist itemconfigure $nametag($src) -text $name } } proc deactivate src { global ftext btext ltext fpshat bpshat lhat shat win_list V if [info exists win_list($src)] { foreach w $win_list($src) { if [viewing_window $w] { destroy_userwin $w } else { detach_window $src $w } } } set w $V(grid).$src if [winfo exists $w] { grid forget $w destroy $w rm_active $src } destroy_decoder_stats $src delete [$src handler] unset ftext($src) unset btext($src) unset ltext($src) unset fpshat($src) unset bpshat($src) unset lhat($src) unset shat($src) } proc update_rate src { global ftext btext ltext fpshat bpshat lhat shat V set key $src if { "$src" != "$V(session)" } { set p [$src np] set s [$src ns] set shat($key) $s set lhat($key) [expr $s-$p] if {$shat($key) <= 0.} { set loss 0 } else { set loss [expr 100*$lhat($key)/$shat($key)] } if {$loss < .1} { set ltext($key) (0%) } elseif {$loss < 9.9} { set ltext($key) [format "(%.1f%%)" $loss] } else { set ltext($key) [format "(%.0f%%)" $loss] } } set bpshat($key) [$src nb] set fpshat($key) [$src nf] set fps $fpshat($key) set bps $bpshat($key) if { $fps < .1 } { set fps "0 f/s" } elseif { $fps < 10 } { set fps [format "%.1f f/s" $fps] } else { set fps [format "%2.0f f/s" $fps] } if { $bps < 1 } { set bps "0 bps" } elseif { $bps < 1000 } { set bps [format "%3.0f bps" $bps] } elseif { $bps < 1000000 } { set bps [format "%3.0f kb/s" [expr $bps / 1000]] } else { set bps [format "%.1f Mb/s" [expr $bps / 1000000]] } set ftext($key) $fps set btext($key) $bps } proc update_src src { global ftext if ![info exists ftext($src)] { return } update_rate $src update_source_info $src after 1000 "update_src $src" } proc build.help { } { create_help_window .help { "Transmit video by clicking on the ``Transmit'' button \ in the ``Menu'' window. You need video capture hardware to do this." "Incoming video streams appear in the main vic window. \ If you see the message ``Waiting for video...'', then no one is transmitting \ video to the conference address you're running on. Otherwise, you'll \ see a thumbnail sized image and accompanying information for each source. \ Click on the thumbnail to open a larger viewing window. You can tile the \ thumbnails in multiple columns using the ``Tile'' menu in the ``Menu'' window." "Clicking on the ``mute'' button for a given source will \ turn off decoding. It is usually a good idea to do \ this for your own, looped-back transmission." "The transmission rate is controlled with the bit-rate \ and frame-rate sliders in the ``Transmission'' panel of the ``Menu'' window. \ The more restrictive setting limits the transmission rate." "The video windows need not be fixed to a given source. \ The ``Mode...'' menu attached to a viewing window allows you to specify \ voice-switched and/or timer-switched modes. In timer-switched mode, the \ window automatically cycles through (unmuted) sources, while in \ oice-switched mode, the window switches to whomever is talking \ (using cues from vat). You can have more than one voice-switched window, \ which results in a simple LRU allocation of the windows to most recent \ speakers. See the man page for more details." "If the user interface looks peculiar, you might \ have X resources that conflict with tk. A common problem is \ defining ``*background'' and/or ``*foreground''." "Bugs and suggestions to vic@ee.lbl.gov. Thanks." } } proc info_text src { set d [$src handler] set fmt [rtp_format $src] if { "$d" != "" } { set fmt "$fmt [$d info] ([$d width]x[$d height])" } return "$fmt" } Uhjho] global font set font(helvetica10) { r-normal--*-100-75-75-*-*-*-* r-normal--10-*-*-*-*-*-*-* r-normal--11-*-*-*-*-*-*-* r-normal--*-100-*-*-*-*-*-* r-normal--*-*-*-*-*-*-*-* } set font(helvetica12) { r-normal--*-120-75-75-*-*-*-* r-normal--12-*-*-*-*-*-*-* r-normal--14-*-*-*-*-*-*-* r-normal--*-120-*-*-*-*-*-* r-normal--*-*-*-*-*-*-*-* } set font(helvetica14) { r-normal--*-140-75-75-*-*-*-* r-normal--14-*-*-*-*-*-*-* r-normal--*-140-*-*-*-*-*-* r-normal--*-*-*-*-*-*-*-* } set font(times14) { r-normal--*-140-75-75-*-*-*-* r-normal--14-*-*-*-*-*-*-* r-normal--*-140-*-*-*-*-*-* r-normal--*-*-*-*-*-*-*-* } proc search_font { foundry style weight points } { global font foreach f $font($style$points) { set fname -$foundry-$style-$weight-$f if [havefont $fname] { return $fname } } puts stderr "vic: can't find $weight $fname font (using fixed)" if ![havefont fixed] { puts stderr "vic: can't find fixed font" exit 1 } return fixed } proc init_fonts {} { set foundry [option get . foundry Vic] set helv10 [search_font $foundry helvetica medium 10] set helv10b [search_font $foundry helvetica bold 10] set helv12b [search_font $foundry helvetica bold 12] set times14 [search_font $foundry times medium 14] option add *Font $helv12b startupFile option add Vic.medfont $helv12b startupFile option add Vic.smallfont $helv10b startupFile option add Vic.helpFont $times14 startupFile option add Vic.entryFont $helv10 startupFile } proc init_resources {} { option add *padX 2 option add *padY 2 option add *tearOff 0 tk_setPalette gray80 foreach option [array names tkPalette] { option add *$option $tkPalette($option) 61 } option add *Radiobutton.relief flat startupFile option add Vic.geometry 250x225 startupFile option add Vic.mtu 1024 startupFile option add Vic.network ip startupFile option add Vic.framerate 8 startupFile option add Vic.defaultTTL 16 startupFile option add Vic.maxbw -1 startupFile option add Vic.bandwidth 128 startupFile option add Vic.iconPrefix vic: startupFile option add Vic.priority 10 startupFile option add Vic.confBusChannel 0 startupFile option add Vic.defaultFormat h.261 startupFile option add Vic.sessionType rtpv2 startupFile option add Vic.grabber none startupFile option add Vic.stampInterval 1000 startupFile option add Vic.switchInterval 5 startupFile option add Vic.dither od startupFile option add Vic.tile 1 startupFile option add Vic.filterGain 0.25 startupFile option add Vic.statsFilter 0.0625 startupFile option add Vic.useHardwareDecode false startupFile option add Vic.infoHighlightColor LightYellow2 startupFile option add Vic.useJPEGforH261 false startupFile option add Vic.stillGrabber false startupFile option add Vic.siteDropTime "300" startupFile option add Vic.medianCutColors 150 startupFile option add Vic.gamma 0.7 startupFile option add Vic.jvColors 32 startupFile option add Vic.rtipXmin 655 startupFile option add Vic.rtipXave 655 startupFile option add Vic.rtipI 6553 startupFile option add Vic.rtipSmax 1200 startupFile option add Vic.rtipD 1200 startupFile option add Vic.rtipJ 3279 startupFile option add Vic.rtipZ 10000 startupFile option add Vic.rtipW 1000 startupFile option add Vic.rtipU 1000 startupFile option add Vic.rtipType 1 startupFile option add Vic.foundry adobe startupFile init_fonts option add Vic.suppressUserName true startupFile option add Vic.softJPEGthresh -1 startupFile option add Vic.softJPEGcthresh 6 startupFile option add Vic.sunvideoDevice 0 startupFile option add Vic.enableBVC false startupFile option add Vic.vain false startupFile option add Vic.sdesList "cname tool email note" catch "option readfile ~/.RTPdefaults startupFile" } Uhjha] proc build.srclist { } { set w .srclist toplevel $w wm withdraw $w wm geometry $w 300x320 bind $w "focus $w" wm title $w "VIC Members" wm minsize $w 0 0 global srclist frame $w.b -borderwidth 2 -relief sunken scrollbar $w.b.scroll -relief groove -borderwidth 2 \ -command "$w.b.list yview" canvas $w.b.list -relief groove -borderwidth 0 \ -height 10 -width 10 -yscrollcommand "$w.b.scroll set" set srclist $w.b.list button $w.ok -text " Dismiss " -borderwidth 0 -relief raised \ -command "wm withdraw $w" -font [mediumfont] pack $w.b -fill both -expand 1 pack $w.b.scroll -side left -fill y pack $w.b.list -side left -expand 1 -fill both pack $w.ok -fill x } set srclist_bottom 2 proc register src { global srcstate srclist srclist_bottom nametag set srcstate($src) 1 if [info exists srclist] { set f [mediumfont] set nametag($src) [ $srclist create text \ 5 $srclist_bottom -font $f -text [$src addr] \ -anchor nw ] set srclist_bottom \ [ lindex [ $srclist bbox $nametag($src) ] 3 ] incr srclist_bottom 2 $srclist config -scrollregion "0 0 2.5i $srclist_bottom" } } proc adjustNames { thresh h } { global nametag srclist srclist_bottom foreach s [array names nametag] { set y [lindex [$srclist coords $nametag($s)] 1] if { $y > $thresh } { $srclist move $nametag($s) 0 -$h } } incr srclist_bottom -$h $srclist config -scrollregion "0 0 2.5i $srclist_bottom" } proc unregister src { global name_line info_line nametag srclist destroy_rtp_stats $src if [info exists name_line($src)] { unset name_line($src) unset info_line($src) } set thresh [lindex [$srclist coords $nametag($src)] 1] set bb [$srclist bbox $nametag($src)] set height [expr [lindex $bb 3] - [lindex $bb 1]] incr height 2 if [info exists srclist] { $srclist delete $nametag($src) unset nametag($src) adjustNames $thresh $height } } proc grayout src { global nametag srclist srcstate if [info exists srclist] { $srclist itemconfigure $nametag($src) -stipple gray50 } set srcstate($src) 2 } proc embolden src { global nametag srclist if [info exists srclist] { $srclist itemconfigure $nametag($src) -stipple {} } set srcstate($src) 1 } UhLjh(0Y] proc get-playout src { set d [$src handler] if { "$d" != "" } { return [expr [$d playout] >> 3] } return 0 } proc create_stat_row { r name width cmd relief } { set f [smallfont] button $r.name -text $name -font $f -anchor w -width $width \ -command $cmd -pady 2 -padx 2 -borderwidth 2 \ -highlightthickness 0 -relief raised label $r.smooth -font $f -anchor e -width 8 \ -relief $relief -borderwidth 1 -pady 1 label $r.diff -font $f -anchor e -width 8 \ -relief $relief -borderwidth 1 -pady 1 label $r.total -font $f -anchor e -width 8 \ -relief ridge -borderwidth 1 -pady 1 pack $r.name -anchor w -fill x -side left -pady 1 -padx 4 pack $r.smooth $r.diff $r.total \ -expand 1 -fill both -anchor e -side left } proc create_stats_panel { w stats } { set f [smallfont] set p $w.f frame $p set top [winfo toplevel $w] set gain [resource statsFilter] global rv_diff rv_smooth rv_list win_src set r $p.legend frame $r label $r.smooth -font $f -anchor c -width 8 -text EWA \ -relief ridge -borderwidth 1 label $r.diff -font $f -anchor c -width 8 -text Delta \ -relief ridge -borderwidth 1 label $r.total -font $f -anchor c -width 8 -text Total \ -relief ridge -borderwidth 1 pack $r.total $r.diff $r.smooth -side right pack $r -anchor e set rv_list($top) $stats set n [llength $stats] set width 10 set i 0 while { $i < $n } { set v [string len [lindex $stats $i]] if { $v > $width } { set width $v } incr i 2 } set src $win_src($top) set i 0 while { $i < $n } { set name [lindex $stats $i] incr i set value [lindex $stats $i] incr i set id [string tolower $name] set r $p.$id frame $r set gen "stat_generator \{$src stats\} $name" set cmd "create_plot_window $src $name \{$gen\}" create_stat_row $r $name $width $cmd ridge pack $r -pady 0 set rv_diff($top:$id) $value set rv_smooth($top:$id) $value rate_variable rv_diff($top:$id) 1.0 "%.1f" rate_variable rv_smooth($top:$id) $gain "%.1f" } if { $src != "session" } { set r $p.playout frame $r set cmd "create_plot_window $src Playout \{get-playout $src\}" create_stat_row $r Playout $width $cmd flat pack $r -pady 0 } global stat_window maxStat set stat_window($top) $p catch "unset maxStat($top)" pack $w.f -anchor c } proc stats_changed { s1 s2 } { set n [llength $s1] if { $n != [llength $s2] } { return 1 } set i 0 while { $i < $n } { if { [lindex $s1 $i] != [lindex $s2 $i] } { return 1 } incr i 2 } return 0 } proc stat_update w { global stat_window rv_diff rv_smooth rv_list \ stat_method win_src set stats [eval $stat_method($w)] if [stats_changed $stats $rv_list($w)] { unset_rvs $w pack forget $w.frame destroy $w.frame frame $w.frame -borderwidth 2 -relief groove create_stats_panel $w.frame $stats pack $w.frame -after $w.title -expand 1 -fill x -anchor center } set p $stat_window($w) set i 0 set n [llength $stats] while { $i < $n } { set id [string tolower [lindex $stats $i]] incr i set cntr [lindex $stats $i] incr i set rv_diff($w:$id) $cntr set rv_smooth($w:$id) $cntr $p.$id.total configure -text $cntr $p.$id.diff configure -text $rv_diff($w:$id) $p.$id.smooth configure -text $rv_smooth($w:$id) } if [winfo exists $p.playout.total] { $p.playout.total configure -text [get-playout $win_src($w)]ms } } proc info_update { w src } { set decoder [$src handler] set fmt [rtp_format $src] if { $fmt == "" } { set fmt "?" } $w.title.info configure -text [info_text $src] set t [$src lastdata] if { $t == "" } { set t "never" } $w.title.timeData configure -text "last data $t" set t [$src lastctrl] if { $t == "" } { set t "never" } $w.title.timeCtrl configure -text "last control $t" foreach sdes [resource sdesList] { $w.title.$sdes configure -text "$sdes: [$src sdes $sdes]" } $w.title.srcid configure -text "srcid: [$src srcid]/[$src addr]" if { [$src srcid] != [$src ssrc] } { if ![winfo exists $w.title.mixer] { label $w.title.mixer -borderwidth 0 \ -font [smallfont] -anchor w pack $w.title.mixer -after $w.title.srcid -fill x } $w.title.mixer configure -text "mixer: [$src ssrc]/[$src addr]" } elseif [winfo exists $w.title.mixer] { pack forget $w.title.mixer destroy $w.title.mixer } set note [$src sdes note] if { $note != "" } { set bg [resource infoHighlightColor] } else { set bg [resource background] } $w.title.note configure -background $bg } proc unset_rvs w { global rv_list rv_diff rv_smooth if [info exists rv_list($w)] { set n [llength $rv_list($w)] for { set i 0 } { $i < $n } { incr i 2 } { set id [string tolower [lindex $rv_list($w) $i]] unset rv_diff($w:$id) rv_smooth($w:$id) } unset rv_list($w) } } proc stat_destroy w { unset_rvs $w destroy $w global stat_method win_src unset stat_method($w) win_src($w) } proc info_destroy { w src } { global info_x info_y set info_x($src) [winfo rootx $w] set info_y($src) [winfo rooty $w] destroy $w } proc create_stats_window { w src titleText method } { if [winfo exists $w] { stat_destroy $w return } create_toplevel $w [getid $src] set f [smallfont] frame $w.title -borderwidth 2 -relief groove label $w.title.main -borderwidth 0 -anchor w -text $titleText label $w.title.name -borderwidth 0 -anchor w \ -textvariable src_nickname($src) frame $w.frame -borderwidth 2 -relief groove global win_src stat_method set stat_method($w) $method set win_src($w) $src create_stats_panel $w.frame [eval $method] pack $w.title.name -anchor w pack $w.title.main -anchor w pack $w.title -fill x pack $w.frame -expand 1 -fill x -anchor center wm geometry $w +[winfo pointerx .]+[winfo pointery .] wm deiconify $w window_timer $w stat_update button $w.dismiss -relief raised -font $f \ -command "stat_destroy $w" -text Dismiss pack $w.dismiss -anchor c -pady 4 } proc create_rtp_window src { create_stats_window .rtp$src $src "RTP Statistics" "$src stats" } proc create_decoder_window src { if { "[$src handler]" != "" } { create_stats_window .decoder$src $src \ "Decoder Statistics" "\[$src handler\] stats" } else { open_dialog "no decoder stats yet" } } proc destroy_decoder_stats src { if [winfo exists .decoder$src] { stat_destroy .decoder$src } } proc destroy_rtp_stats src { if [winfo exists .rtp$src] { stat_destroy .rtp$src } if [winfo exists .info$src] { info_destroy .info$src $src } global rv_plot win_src foreach w [array names rv_plot] { if { "$win_src($w)" == "$src" } { plot_destroy $w } } } proc create_global_window {} { set w .global if [winfo exists $w] { stat_destroy $w return } create_toplevel $w "Session Stats" set f [smallfont] frame $w.title -borderwidth 2 -relief groove label $w.title.main -borderwidth 0 -anchor w \ -text "Global Session Statistics" frame $w.frame -borderwidth 2 -relief groove global stat_method win_src set stat_method($w) "session stats" set win_src($w) session create_stats_panel $w.frame [session stats] pack $w.title.main -anchor w pack $w.title -fill x pack $w.frame -expand 1 -fill x -anchor center wm geometry $w +[winfo pointerx .]+[winfo pointery .] wm deiconify $w window_timer $w stat_update button $w.dismiss -relief raised -font $f \ -command "stat_destroy $w" -text Dismiss pack $w.dismiss -anchor c -pady 4 } proc window_timer { w action } { if ![winfo exists $w] { return } $action $w after 1000 "window_timer $w $action" } proc has_src w { global win_src if [string compare $win_src($w) GLOBAL] { return 1 } else { return 0 } } proc stat_generator { method id } { set stats [eval $method] set k [lsearch -exact $stats $id] return [lindex $stats [expr $k + 1]] } proc plot_get w { global plot_generator set v [eval $plot_generator($w)] return $v } proc plot_update w { global rv_plot set rv_plot($w) [plot_get $w] $w.frame.sc set $rv_plot($w) } proc plot_destroy w { global win_src rv_plot plot_generator unset win_src($w) plot_generator($w) rv_plot($w) destroy $w } proc relabel_stripchart {w min max perDiv} { $w configure -text " range $min to $max, $perDiv/div" } proc create_plot_window { src name generator } { global win_src plot_generator set id [string tolower $name] set w .plot$src$id if [winfo exists $w] { plot_destroy $w return } set win_src($w) $src set plot_generator($w) $generator create_toplevel $w "plot window" catch "wm resizable $w true false" set f [smallfont] frame $w.title -borderwidth 2 -relief groove label $w.title.main -borderwidth 0 -anchor w -text $name frame $w.frame -borderwidth 2 -relief groove stripchart $w.frame.sc -max 200 -min 1 -stripwidth 1 -width 1 \ -autoscale 2 -rescale_command "relabel_stripchart $w.bf.lab" \ -relief groove -striprelief flat -tickcolor gray95 -hticks 30 pack $w.frame.sc -expand 1 -fill both frame $w.brace -width 250 pack $w.brace if [has_src $w] { label $w.title.name -borderwidth 0 -anchor w \ -textvariable src_nickname($src) pack $w.title.name -anchor w } pack $w.title.main -anchor w pack $w.title -fill x pack $w.frame -expand 1 -fill both -anchor center if { "$id" != "playout" } { rate_variable rv_plot($w) 1.0 "%.1f" } wm geometry $w +[winfo pointerx .]+[winfo pointery .] wm deiconify $w window_timer $w plot_update frame $w.bf label $w.bf.lab -borderwidth 0 -font $f -anchor w -text "No data" pack $w.bf.lab -side left -expand 1 -fill x button $w.bf.dismiss -relief raised -font $f -anchor e \ -command "plot_destroy $w" -text Dismiss pack $w.bf.dismiss -side right -pady 4 -padx 4 pack $w.bf -expand 1 -fill x } proc create_info_window src { set w .info$src if [winfo exists $w] { info_destroy $w $src return } create_toplevel $w [getid $src] set f [smallfont] frame $w.title -borderwidth 2 -relief groove label $w.title.name -borderwidth 0 -font $f -anchor w \ -textvariable src_nickname($src) label $w.title.info -borderwidth 0 -font $f -anchor w \ -text [$src addr] label $w.title.timeData -borderwidth 0 -font $f -anchor w label $w.title.timeCtrl -borderwidth 0 -font $f -anchor w frame $w.frame -borderwidth 2 -relief groove pack $w.title.name $w.title.info -fill x foreach sdes [resource sdesList] { label $w.title.$sdes -borderwidth 0 -font $f -anchor w pack $w.title.$sdes -fill x } label $w.title.srcid -borderwidth 0 -font $f -anchor w pack $w.title.srcid -fill x pack $w.title.timeData $w.title.timeCtrl -fill x pack $w.title -fill x set p $w.bot frame $p set m $p.mb.menu menubutton $p.mb -text Stats... -menu $m -relief raised -width 8 \ -font $f menu $m $m add command -label RTP -command "create_rtp_window $src" -font $f $m add command -label Decoder \ -command "create_decoder_window $src" -font $f button $p.dismiss -relief raised -font $f \ -command "info_destroy $w $src" -text Dismiss pack $p.mb -side left -padx 8 pack $p.dismiss -side right -padx 8 pack $p -anchor c -pady 4 -fill x info_update $w $src global info_x info_y if [info exists info_x($src) ] { set x $info_x($src) set y $info_y($src) } else { set x [winfo pointerx .] set y [winfo pointery .] } update idletasks if ![winfo exists $w] { return } set right [expr [winfo screenwidth .] - [winfo reqwidth $w] - 5] if { $x > $right } { set x $right } set bot [expr [winfo screenheight .] - [winfo reqheight $w] - 5] if { $y > $bot } { set y $bot } wm geometry $w +$x+$y wm deiconify $w after 3000 "info_timer $w $src" } proc info_timer { w src } { if ![winfo exists $w] { return } info_update $w $src after 3000 "info_timer $w $src" } proc create_mtrace_window {src dir} { set w .mtrace$src if ![winfo exists $w] { create_toplevel $w "[getid $src] mtrace" set f [smallfont] frame $w.t scrollbar $w.t.yscroll -command "$w.t.text yview" -relief sunken scrollbar $w.t.xscroll -command "$w.t.text xview" -relief sunken \ -orient horiz text $w.t.text -height 24 -width 80 -setgrid true -wrap none \ -font fixed -relief sunken -borderwidth 2 \ -xscrollcommand "$w.t.xscroll set" \ -yscrollcommand "$w.t.yscroll set" pack $w.t.yscroll -side right -fill y pack $w.t.xscroll -side bottom -fill x pack $w.t.text -side left -padx 0 -pady 0 -fill both -expand yes set p $w.b frame $p button $p.dismiss -relief raised -font $f \ -command "destroy $w" -text Dismiss pack $p.dismiss -side right -padx 8 pack $w.t -side top -fill both -expand yes pack $p -side bottom -pady 2 -fill x wm geometry $w +[winfo pointerx .]+[winfo pointery .] wm deiconify $w update idletasks if ![winfo exists $w] { return } } else { $w.t.text yview end } global V if {$dir=="to"} { set cmd "|mtrace [$V(data-net) interface] [$V(data-net) addr] [$src addr]" } else { set cmd "|mtrace [$src addr] [$V(data-net) addr]" } if [catch "open {$cmd} r" fd] { $w.t.text insert end "mtrace error: $fd" return } fconfigure $fd -blocking 0 fileevent $fd readable "read_mtrace $fd $w" } proc read_mtrace {fd w} { if [winfo exists $w] { $w.t.text insert end [read $fd] $w.t.text yview end if [eof $fd] { fileevent $fd readable {} catch "close $fd" } } else { fileevent $fd readable {} catch "close $fd" } } proc build_info_menu {src m} { menu $m set f [smallfont] $m add command -label "Site Info" \ -command "create_info_window $src" -font $f $m add command -label "RTP Stats"\ -command "create_rtp_window $src" -font $f $m add command -label "Decoder Stats" \ -command "create_decoder_window $src" -font $f global V if [$V(data-net) ismulticast] { $m add command -label "Mtrace from" \ -command "create_mtrace_window $src from" -font $f $m add command -label "Mtrace to" \ -command "create_mtrace_window $src to" -font $f } } proc create_info_menu {src x y} { set m .menu$src if ![winfo exists $m] { build_info_menu $src $m } tk_popup $m $x $y } Uhtjh4%] proc smallfont { } { return [resource smallfont] } proc mediumfont { } { return [resource medfont] } proc disfont { } { return [resource disablefont] } set nids 0 proc uniqueID { } { global nids incr nids return $nids } proc isCIF fmt { if { $fmt == "h261" } { return 1 } return 0 } proc toggle_window w { if { ![winfo exists $w] } { build$w } global created$w if { ! [info exists created$w] } { set created$w 1 wm transient $w . update idletasks set x [winfo rootx .] set y [winfo rooty .] incr y [winfo height .] incr y -[winfo reqheight $w] incr y -20 incr x [winfo vrootx .] incr y [winfo vrooty .] if { $y < 0 } { set y 0 } if { $x < 0 } { set x 0 } else { set right [expr [winfo screenwidth .] - \ [winfo reqwidth $w]] if { $x > $right } { set x $right } } wm geometry $w +$x+$y wm deiconify $w } elseif { [winfo ismapped $w] } { wm withdraw $w } else { wm deiconify $w } } proc create_toplevel { w title } { global V if [info exists V(visual)] { toplevel $w -class $V(class) \ -visual $V(visual) -colormap $V(colormap) } else { toplevel $w -class $V(class) } set title [resource iconPrefix]$title wm withdraw $w wm transient $w . wm title $w $title wm iconname $w $title bind $w "focus $w" } proc cname_redundant { name cname } { set ni [string first @ $name] if { $ni < 0 } { return 0 } set ci [string first @ $cname] if { $ci < 0 } { return 0 } if { [string compare \ [string range $name 0 $ni] \ [string range $cname 0 $ci]] == 0 } { return 1 } return 0 } proc open_dialog text { set w .dialog catch "destroy $w" global V create_toplevel $w "$V(app) error" label $w.label -text "$V(app): $text" -font [mediumfont] \ -borderwidth 2 -relief groove button $w.button -text Dismiss -command "destroy $w" -font [mediumfont] pack $w.label -expand 1 -fill x -ipadx 4 -ipady 4 pack $w.button -pady 4 wm withdraw $w update idletasks set x [expr [winfo screenwidth $w]/2 - [winfo reqwidth $w]/2 \ - [winfo vrootx [winfo parent $w]]] set y [expr [winfo screenheight $w]/2 - [winfo reqheight $w]/2 \ - [winfo vrooty [winfo parent $w]]] wm geom $w +$x+$y wm deiconify $w bind $w "focus $w" } proc helpitem { w text } { global helpno set f [resource helpFont] canvas $w.bullet -width 12 -height 12 $w.bullet create oval 6 3 12 9 -fill black message $w.msg -justify left -anchor w -font $f -width 450 -text $text pack $w.bullet -side left -anchor ne -pady 5 pack $w.msg -side left -expand 1 -fill x -anchor nw } proc create_help_window { w items } { global V create_toplevel $w "$V(class) Help" frame $w.frame -borderwidth 0 -relief flat set p $w.frame set n 0 foreach m $items { set h $w.h$n incr n frame $h helpitem $h $m pack $h -expand 1 -fill both } button $w.frame.ok -text " Dismiss " -borderwidth 2 -relief raised \ -command "wm withdraw $w" -font [mediumfont] pack $w.frame.ok -pady 6 -padx 6 -anchor e pack $w.frame -expand 1 -fill both } set current_icon_mark "XXX" proc mark_icon mark { global current_icon_mark if {$mark != $current_icon_mark} { set current_icon_mark $mark global V append mark [resource iconPrefix]$V(confname) wm iconname . $mark } } proc mk.entry { w action text } { entry $w.entry -relief raised -borderwidth 1 -exportselection 1 \ -font [resource entryFont] global entryTab set entryTab($w.entry:action) $action set entryTab($w.entry:value) $text $w.entry insert 0 $text } proc toggleKey w { global V entryTab if $V(encrypt) { crypt_set $entryTab($w.entry:value) } else { crypt_clear } } proc disableKeyEditor w { $w.button configure -state disabled set entryTab($w.entry:value) "" } proc enableKeyEditor w { $w.button configure -state normal } proc updateKey { w key } { set w [winfo parent $w] set key [string trim $key] if { $key == "" } { crypt_clear disableKeyEditor $w } elseif { [crypt_set $key] < 0 } { disableKeyEditor $w } else { enableKeyEditor $w } } proc mk.key w { global V frame $w.key checkbutton $w.key.button -text Key: -relief flat -font [smallfont] \ -command "toggleKey $w.key" -variable V(encrypt) \ -disabledforeground gray40 mk.entry $w.key updateKey [resource sessionKey] if !$V(encrypt) { $w.key.button configure -state disabled } pack $w.key.button -side left pack $w.key.entry -side left -fill x -expand 1 } proc updateName { w name } { set name [string trim $name] if { $name != ""} { [srctab local] sdes name $name return 0 } return -1 } Uhjh@] proc destroy_userwin w { global win_src set src $win_src($w) switcher_unregister $w detach_window $src $w set x [winfo rootx $w] set y [winfo rooty $w] incr x [winfo vrootx $w] incr y [winfo vrooty $w] set top [winfo toplevel $w] global userwin_x userwin_y userwin_size size$top set userwin_x($src) $x set userwin_y($src) $y set userwin_size($src) [set size$top] destroy $top } proc resize { vw w h } { $vw resize $w $h global win_src set src $win_src($vw) detach_renderer $src $vw update idletasks attach_renderer $src $vw } proc viewing_window w { if { [string range $w 0 2] == ".vw"} { return 1 } else { return 0 } } proc window_set_slow w { global win_target win_is_slow if $win_is_slow($w) { set interval [option get . stampInterval Vic] } else { set interval 0 } $win_target($w) update-interval $interval } proc reallocate_renderer w { global win_src set src $win_src($w) detach_window $src $w attach_window $src $w } proc create_video_widget { w width height } { video $w $width $height global win_is_switched win_is_timed win_is_slow win_use_hw V set win_is_switched($w) 0 set win_is_timed($w) 0 set win_is_slow($w) 0 set win_use_hw($w) $V(useHardwareDecode) } proc open_window src { set f [smallfont] set uid [uniqueID] set w .vw$uid toplevel $w -class Vic \ -visual "[winfo visual .top] [winfo depth .top]" \ -colormap .top catch "wm resizable $w false false" frame $w.frame global size$w userwin_x userwin_y userwin_size if [info exists userwin_x($src)] { wm geometry $w +$userwin_x($src)+$userwin_y($src) wm positionfrom $w user set size$w $userwin_size($src) set d [split $userwin_size($src) x] create_video_widget $w.frame.video [lindex $d 0] [lindex $d 1] } elseif [isCIF [rtp_format $src]] { create_video_widget $w.frame.video 352 288 set size$w 352x288 } else { create_video_widget $w.frame.video 320 240 set size$w 320x240 } set v $w.frame.video frame $w.bar button $w.bar.dismiss -text Dismiss -font $f -width 8 \ -highlightthickness 0 set m $w.bar.mode.menu menubutton $w.bar.mode -text Modes... -menu $m -relief raised \ -width 8 -font $f menu $m $m add checkbutton -label Voice-switched \ -command "window_set_switched $v" \ -font $f -variable win_is_switched($v) $m add checkbutton -label Timer-switched \ -command "window_set_timed $v" \ -font $f -variable win_is_timed($v) $m add checkbutton -label Save-CPU \ -command "window_set_slow $v" \ -font $f -variable win_is_slow($v) $m add checkbutton -label Use-Hardware \ -command "reallocate_renderer $v" \ -font $f -variable win_use_hw($v) if ![have cb] { $m entryconfigure Voice-switched -state disabled } set m $w.bar.size.menu menubutton $w.bar.size -text Size... -menu $m -relief raised -width 8 \ -font $f menu $m $m add radiobutton -label QCIF -command "resize $v 176 144" \ -font $f -value 176x144 -variable size$w $m add radiobutton -label CIF -command "resize $v 352 288" \ -font $f -value 352x288 -variable size$w $m add radiobutton -label SCIF -command "resize $v 704 576" \ -font $f -value 704x576 -variable size$w $m add separator $m add radiobutton -label "1/16 NTSC" \ -command "resize $v 160 120" \ -font $f -value 160x120 -variable size$w $m add radiobutton -label "1/4 NTSC" \ -command "resize $v 320 240" \ -font $f -value 320x240 -variable size$w $m add radiobutton -label NTSC \ -command "resize $v 640 480" \ -font $f -value 640x480 -variable size$w $m add separator $m add radiobutton -label "1/16 PAL" \ -command "resize $v 192 144" \ -font $f -value 192x144 -variable size$w $m add radiobutton -label "1/4 PAL" \ -command "resize $v 384 288" \ -font $f -value 384x288 -variable size$w $m add radiobutton -label PAL \ -command "resize $v 768 576" \ -font $f -value 768x576 -variable size$w label $w.bar.label -text "" -anchor w -relief raised pack $w.bar.label -expand 1 -side left -fill both pack $w.bar.size $w.bar.mode $w.bar.dismiss -side left -fill y pack $w.frame.video -anchor c pack $w.frame -expand 1 -fill both pack $w.bar -fill x bind $w { focus %W } bind $w "destroy_userwin $v" bind $w "destroy_userwin $v" $w.bar.dismiss configure -command "destroy_userwin $v" bind $w "switcher_next $v" bind $w "switcher_next $v" bind $w "switcher_next $v" bind $w "switcher_prev $v" bind $w "switcher_prev $v" switcher_register $v $src window_switch attach_window $src $v windowname $w [getid $src] } proc windowname { w name } { if ![yesno suppressUserName] { $w.bar.label configure -text $name } wm iconname $w vic:$name wm title $w $name } proc window_switch { w src } { global win_src set oldsrc $win_src($w) if { $oldsrc != $src } { detach_window $oldsrc $w attach_window $src $w } } proc window_set_switched w { global win_is_switched if { $win_is_switched($w) != 0 } { switcher_enable $w } else { switcher_disable $w } } proc window_set_timed w { global win_is_timed if { $win_is_timed($w) != 0 } { switcher_set_timer $w } else { switcher_cancel_timer $w } } UhjhL|] proc next_active_src src { set list [session active] set k [lsearch -exact $list $src] incr k if { $k >= [llength $list] } { set k 0 } return [lindex $list $k] } proc prev_active_src src { set list [session active] set k [lsearch -exact $list $src] if { $k < 0 } { set k 0 } else { if { $k == 0 } { set k [llength $list] } incr k -1 } return [lindex $list $k] } proc switcher_register { o src method } { global switcher_src switcher_method set switcher_src($o) $src set switcher_method($o) $method } proc switcher_unregister o { switcher_cancel_timer $o } proc switcher_enable o { switcher_touch $o } proc switcher_disable o { global switcher_ts unset switcher_ts($o) } proc switcher_set_timer o { switcher_sched $o } proc switcher_cancel_timer o { global switcher_timer_id if [info exists switcher_timer_id($o)] { after cancel $switcher_timer_id($o) unset switcher_timer_id($o) } } proc switcher_set { o src } { global switcher_method switcher_src if { $src != $switcher_src($o) } { $switcher_method($o) $o $src set switcher_src($o) $src } } proc switcher_next o { global switcher_src switcher_set $o [next_active_src $switcher_src($o)] } proc switcher_prev o { global switcher_src switcher_set $o [prev_active_src $switcher_src($o)] } set switcher_clock 1 proc switcher_touch o { global switcher_clock switcher_ts set switcher_ts($o) $switcher_clock incr switcher_clock } set cb_dispatch(focus) cb_switcher proc cb_switcher msg { foreach s [session active] { if { [$s addr] == $msg || [$s sdes cname] == $msg } { switcher_focus $s return } } } proc switcher_focus src { global switcher_ts switcher_method if ![info exists switcher_ts] { return } set target "" foreach o [array names switcher_ts] { if { $target == "" || \ $switcher_ts($o) < $switcher_ts($target) } { set target $o } } if { $target != "" && \ ( "[srctab local]" != $target || [yesno vain] ) } { switcher_set $target $src switcher_touch $target } } proc switcher_sched o { global switcher_timer_id set ms [expr 1000 * [option get . switchInterval Vic]] set switcher_timer_id($o) [after $ms "switcher_timer $o"] } proc switcher_timer o { global switcher_timer_id if [info exists switcher_timer_id($o)] { switcher_next $o switcher_sched $o } } proc is_switched o { global switcher_ts switcher_is_timed return [expr [info exists switcher_ts($o)] || \ [info exists switcher_timer_id($o)]] } Uh`!jhX]proc extout_build_thumbnail { w d } { set stamp $w.stamp frame $stamp -relief groove -borderwidth 2 create_video_widget $stamp.video 80 60 global win_is_slow win_use_hw extout_tn set win_is_slow($stamp.video) 1 set extout_is_slow($d) 0 set extout_tn($d) $stamp.video pack $stamp.video -anchor c -padx 2 pack $stamp -fill y frame $w.b -background purple button $w.b.rev -bitmap rev -command "switcher_prev $d" button $w.b.fwd -bitmap fwd -command "switcher_next $d" pack $w.b.rev $w.b.fwd -side left -fill x -expand 1 -padx 0 pack $w.b -fill x } proc extout_build_modes { w d } { set f [smallfont] checkbutton $w.ts -text "Timer-Switched" -font $f -anchor w \ -variable extout_is_timed($d) \ -command "extout_set_timed $d" checkbutton $w.vs -text "Voice-Switched" -font $f -anchor w \ -variable extout_is_switched($d) \ -command "extout_set_switched $d" if ![have cb] { $w.vs configure -state disabled } checkbutton $w.sc -text "Save-CPU" -font $f -anchor w \ -variable extout_is_slow($d) \ -command "extout_set_slow $d" pack $w.vs $w.ts $w.sc -anchor w -fill x } proc extout_set_scale d { global extout_target extout_scale if [info exists extout_target($d)] { $extout_target($d) scale $extout_scale($d) } } proc extout_build_buttons { w d } { set f [smallfont] set m $w.mb.menu menubutton $w.mb -text Port... -menu $m \ -relief raised -font $f $w.mb configure -state disabled checkbutton $w.ext -text "Scale-Up" -font $f \ -relief raised -anchor w -highlightthickness 0 \ -variable extout_scale($d) \ -command "extout_set_scale $d" button $w.sd -text "Shutdown" -font $f \ -command "extout_shutdown $d [winfo toplevel $w]" \ -highlightthickness 0 pack $w.mb $w.ext $w.sd -anchor w -fill x } proc extout_mb_post { d flag x y } { if { $flag != "" } { global extout_mb src_nickname set menu $extout_mb($d).menu if [winfo exists $menu] { destroy $menu } menu $menu foreach src [session active] { $menu add command -label $src_nickname($src) \ -command "switcher_set $d $src" } tkMbPost $flag $x $y } } proc extout_select d { set w .$d if [winfo exists $w] { if [winfo ismapped $w] { wm withdraw $w } else { wm deiconify $w } return } create_toplevel $w "[$d nickname]" catch "wm resizable $w false false" set f [smallfont] frame $w.title -borderwidth 2 -relief ridge label $w.title.main -borderwidth 0 -anchor w \ -text "External Output Controls ([$d nickname])" frame $w.frame -borderwidth 2 -relief ridge frame $w.frame.v frame $w.frame.v.tn extout_build_thumbnail $w.frame.v.tn $d frame $w.frame.v.modes -relief groove -borderwidth 2 extout_build_modes $w.frame.v.modes $d frame $w.frame.v.buttons extout_build_buttons $w.frame.v.buttons $d pack $w.frame.v.tn $w.frame.v.modes $w.frame.v.buttons \ -side left -padx 2 set mb $w.frame.src menubutton $mb -text "" -menu $mb.menu \ -relief raised -width 20 global extout_mb set extout_mb($d) $mb bind $mb <1> "extout_mb_post $d \$tkPriv(inMenubutton) %X %Y" pack $w.frame.v $w.frame.src -fill x -pady 2 -padx 2 pack $w.title.main -anchor w pack $w.title -fill x pack $w.frame -expand 1 -fill both -anchor center wm geometry $w +[winfo pointerx .]+[winfo pointery .] wm deiconify $w button $w.dismiss -relief raised \ -command "wm withdraw $w" -text Dismiss -font $f pack $w.dismiss -anchor c -pady 2 switcher_register $d "" extout_switch } proc extout_switch { d src } { extout_release $d extout_bind $d $src } proc extout_shutdown { d w } { extout_release $d destroy $w } proc extout_release d { global extout_target extout_src extout_tn if [info exists extout_src($d)] { detach_window $extout_src($d) $extout_tn($d) extout_detach $d unset extout_src($d) } } proc extout_detach d { global extout_target extout_src set src $extout_src($d) [$src handler] detach $extout_target($d) delete $extout_target($d) unset extout_target($d) } proc extout_bind { d src } { extout_release $d extout_attach $d $src global extout_tn attach_window $src $extout_tn($d) } proc extout_attach { d src } { global extout_target extout_src extout_mb extout_scale src_nickname set fmt [rtp_format $src] if { $fmt == "jpeg" } { set fmt $fmt/[[$src handler] decimation] } set target [$d assistor $fmt] if { $target == "" } { set target [$d renderer [[$src handler] decimation]] } if { $target != "" } { set extout_src($d) $src set extout_target($d) $target $target scale $extout_scale($d) [$src handler] attach $target $extout_mb($d) configure -text $src_nickname($src) extout_set_slow $d return $target } return "" } proc extout_detach_src src { global extout_src if ![info exists extout_src] { return } set list "" foreach d [array names extout_src] { if { $extout_src($d) == $src } { extout_detach $d set list "$list $d" } } return $list } proc extout_attach_src { src list } { foreach d $list { extout_attach $d $src } } proc extout_set_switched d { global extout_is_switched if { $extout_is_switched($d) != 0 } { switcher_enable $d } else { switcher_disable $d } } proc extout_set_timed d { global extout_is_timed if { $extout_is_timed($d) != 0 } { switcher_set_timer $d } else { switcher_cancel_timer $d } } proc extout_set_slow d { global extout_target extout_is_slow if [info exists extout_target($d)] { if $extout_is_slow($d) { set interval [option get . stampInterval Vic] } else { set interval 0 } $extout_target($d) update-interval $interval } } UhH6jhd4] proc build.slicvideo w { set f [smallfont] label $w.title -text "Grabber" frame $w.f -relief sunken -borderwidth 2 frame $w.f.h -relief flat label $w.f.h.label -font $f -anchor e -text "Hue" scale $w.f.h.scale -orient horizontal -width 12 -length 20 \ -relief groove -showvalue 0 -from -128 -to 127 \ -command "grabber set HUE" pack $w.f.h.label $w.f.h.scale -side left -fill x -expand 1 frame $w.f.ll -relief flat label $w.f.ll.label -font $f -text "Luma" -anchor s label $w.f.ll.clabel -font $f -text "Contrast" -anchor s label $w.f.ll.blabel -font $f -text "Brightness" -anchor s pack $w.f.ll.clabel $w.f.ll.label $w.f.ll.blabel \ -side left -fill x -expand 1 frame $w.f.l -relief flat scale $w.f.l.cscale -orient horizontal -width 12 -relief groove \ -showvalue 0 -from 0 -to 127 \ -command "grabber set LUMA_CONTRAST" scale $w.f.l.bscale -orient horizontal -width 12 -relief groove \ -showvalue 0 -from 0 -to 255 \ -command "grabber set LUMA_BRIGHTNESS" pack $w.f.l.cscale $w.f.l.bscale -side left -fill x -expand 1 frame $w.f.cl -relief flat label $w.f.cl.label -font $f -text "Chroma" -anchor n label $w.f.cl.glabel -font $f -text "Gain" -anchor n label $w.f.cl.slabel -font $f -text "Saturation" -anchor n pack $w.f.cl.glabel $w.f.cl.label $w.f.cl.slabel \ -side left -fill x -expand 1 frame $w.f.c -relief flat scale $w.f.c.gscale -orient horizontal -width 12 -relief groove \ -showvalue 0 -from 0 -to 255 \ -command "grabber set CHROMA_GAIN" scale $w.f.c.sscale -orient horizontal -width 12 -relief groove \ -showvalue 0 -from 0 -to 127 \ -command "grabber set CHROMA_SATURATION" pack $w.f.c.gscale $w.f.c.sscale -side left -fill x -expand 1 pack $w.f.h $w.f.ll $w.f.l $w.f.c $w.f.cl \ -fill x -expand 1 -padx 1m pack $w.title $w.f -fill x -expand 1 $w.f.h.scale set 0 $w.f.l.cscale set 64 $w.f.l.bscale set 128 $w.f.c.gscale set 44 $w.f.c.sscale set 64 } proc build.still w { set f [smallfont] label $w.title -text "Grabber" frame $w.f -relief sunken -borderwidth 2 label $w.f.label -font $f -anchor e -text "File" mk.entry $w.f set.still.frame "frame" pack $w.title $w.f -fill x -expand 1 pack $w.f.label -side left pack $w.f.entry -side left -fill x -expand 1 } proc set.still.frame {w s } { global lastDevice $lastDevice file $s } proc build.qcam {w} { global qcamwindow set f [smallfont] label $w.title -text "Grabber" frame $w.f -relief sunken -borderwidth 2 frame $w.f.s -relief flat frame $w.f.s.l -relief flat label $w.f.s.l.bright -font $f -anchor w -text "Brightness" label $w.f.s.l.cont -font $f -anchor w -text "Contrast" label $w.f.s.l.wbal -font $f -anchor w -text "White balance" pack $w.f.s.l.bright $w.f.s.l.cont $w.f.s.l.wbal \ -side top -fill x -expand 1 frame $w.f.s.s -relief flat scale $w.f.s.s.bright -orient horizontal -width 12 \ -relief groove -showvalue 0 -from 1 -to 254 \ -command "grabber set BRIGHT" scale $w.f.s.s.cont -orient horizontal -width 12 \ -relief groove -showvalue 0 \ -from 0 -to 1.0 -resolution 0.002 \ -command "grabber contrast" frame $w.f.s.s.wbal -relief flat scale $w.f.s.s.wbal.scale -orient horizontal -width 12 \ -relief groove -showvalue 0 -from 1 -to 254 \ -command "grabber set WBAL" button $w.f.s.s.wbal.button -font $f -text Auto \ -command "grabber set WBAL auto" pack $w.f.s.s.wbal.scale $w.f.s.s.wbal.button \ -side left -fill x -expand 1 pack $w.f.s.s.bright $w.f.s.s.cont $w.f.s.s.wbal \ -side top -fill x -expand 1 pack $w.f.s.l $w.f.s.s -side left -fill x -expand 1 frame $w.f.bpp -relief flat label $w.f.bpp.label -font $f -anchor w -text "Pixel depth" radiobutton $w.f.bpp.bpp4 -font $f -text "4-bit" \ -variable qcambpp -value 4 -command "grabber set BPP 4" radiobutton $w.f.bpp.bpp6 -font $f -text "6-bit" \ -variable qcambpp -value 6 -command "grabber set BPP 6" pack $w.f.bpp.label $w.f.bpp.bpp4 $w.f.bpp.bpp6 \ -side left -fill x -expand 1 pack $w.f.s $w.f.bpp \ -fill x -expand 1 -padx 1m pack $w.title $w.f -fill x -expand 1 set qcamwindow(setbright) "$w.f.s.s.bright set" set qcamwindow(setcont) "$w.f.s.s.cont set" set qcamwindow(setwbal) "$w.f.s.s.wbal.scale set" set qcamwindow(setbpp) "set qcambpp" } UhFjhp] proc run_resource_dialog { name email } { set w .form global V frame $w frame $w.msg -relief ridge label $w.msg.label -font [mediumfont] -wraplength 4i \ -justify left -text \ "Please specify values for the following X resources. \ These strings will identify you by name and by email address \ in any RTP-based conference. Please use your real name and \ affiliation instead of a ``handle'', e.g., ``Jane Doe (ACME Research)''. \ The values you enter will be saved in ~/.RTPdefaults so you will \ not have to re-enter them. You can either leave this file in place \ or merge the contents with your normal X resources." -relief ridge pack $w.msg.label -padx 6 -pady 6 pack $w.msg -side top foreach i {name email} { frame $w.$i -bd 2 entry $w.$i.entry -relief sunken label $w.$i.label -width 10 -anchor e pack $w.$i.label -side left pack $w.$i.entry -side left -fill x -expand 1 -padx 8 } $w.name.label config -text *rtpName: $w.email.label config -text *rtpEmail: pack $w.msg -pady 10 pack $w.name $w.email -side top -fill x $w.$i.entry insert 0 [email_heursitic] frame $w.buttons button $w.buttons.accept -text Accept -command "set dialogDone 1" button $w.buttons.dismiss -text Quit -command "set dialogDone -1" pack $w.buttons.accept $w.buttons.dismiss \ -side left -expand 1 -padx 20 -pady 10 pack $w.buttons pack $w -padx 10 global dialogDone while { 1 } { set dialogDone 0 focus $w.name.entry tkwait variable dialogDone if { $dialogDone < 0 } { exit 0 } set name [string trim [$w.name.entry get]] if { [string length $name] <= 3 } { open_dialog "please enter a reasonable name" continue } set email [string trim [$w.email.entry get]] if { [string first . $email] < 0 || \ [string first @ $email] < 0 } { open_dialog "email address should have form user@host.domain" continue } break } option add *rtpName "$name" interactive option add *rtpEmail "$email" interactive set f [open ~/.RTPdefaults w+ 0644] puts $f "*rtpName: $name" puts $f "*rtpEmail: $email" close $f pack forget $w destroy $w } UhNjh|] set rtp_type(22) bvc set rtp_type(25) cellb set rtp_type(26) jpeg set rtp_type(27) cuseeme set rtp_type(28) nv set rtp_type(29) picw set rtp_type(30) cpv set rtp_type(31) h261 set rtp_type(32) mpeg set rtp_type(127) h261v1 proc vic_main {} { global V set V(class) Vic set V(app) vic set V(media) video init_local init_confbus init_network init_gui init_late if [yesno transmitOnStartup] { build.menu global transmitButton $transmitButton invoke } } Uh|Pjh] proc tm_bootstrap {} { global tm411 tm422 if ![info exists tm411] { set tm411 [new module compositor/411] set tm422 [new module compositor/422] } } proc tm_init { grabber encoder } { global tmEnable if ![info exists tmEnable] { return 0 } set ff [$encoder frame-format] if { $ff == "cif" } { set ff 411 } if { $ff == "411" || $ff == "422" } { global tm411 tm422 tm_bootstrap set tm [set tm$ff] $tm target $encoder $grabber target $tm return 1 } else { return 0 } } proc tm_enable {} { global tmEnable V if [info exists tmEnable] { return } set tmEnable 1 if [have grabber] { tm_init $V(grabber) $V(encoder) } } proc tm_disable {} { global tmEnable V catch "unset tmEnable" if [have grabber] { $V(grabber) target $V(encoder) } } proc tm_check id { global tm_obj return [info exists tm_obj($id)] } proc tm_create { id file width height } { puts create/$id/$file/$width/$height global tm_obj if [tm_check $id] { tm_destroy $id } set tm_obj($id) [new overlay] $tm_obj($id) load $file $width $height tm_bootstrap } proc tm_transparent { id lum } { puts transparent:$id/$lum global tm_obj if [tm_check $id] { set o $tm_obj($id) $o transparent $lum } } proc tm_destroy id { global tm411 tm422 tm_obj if [tm_check $id] { set o $tm_obj($id) unset tm_obj($id) $tm411 detach $o $tm422 detach $o delete $o } } proc tm_place { id x y depth } { global tm411 tm422 tm_obj tm_depth if [tm_check $id] { set o $tm_obj($id) if { ![info exists tm_depth($o)] } { set tm_depth($o) $depth $tm411 attach $o $x $y $depth $tm422 attach $o $x $y $depth } elseif { $tm_depth($o) != $depth } { set tm_depth($o) $depth $tm411 detach $o $tm422 detach $o $tm411 attach $o $x $y $depth $tm422 attach $o $x $y $depth } else { $tm411 move $o $x $y $tm422 move $o $x $y } } } proc tm_remove id { global tm411 tm422 tm_obj if [tm_check $id] { set o $tm_obj($id) unset tm_obj($id) $tm411 detach $o $tm422 detach $o delete $o } } foreach proc { tm_enable tm_disable tm_create tm_destroy \ tm_place tm_remove tm_transparent } { set cb_dispatch($proc) $proc } UhXjh] proc confbusHandler { cb msg } { global cb_dispatch if { [llength $msg] < 1 } { debug "bad confbus message: $msg" return } set class [lindex $msg 0] if ![info exists cb_dispatch($class)] { debug "no such confbus method: $class" return } set proc $cb_dispatch($class) set formals [info args $proc] set actuals [lrange $msg 1 end] if { [llength $actuals] != [llength $formals] } { debug "confbus arg mismatch: $class ($formals)/($actuals)" return } eval "$proc $actuals" } proc init_confbus {} { set channel [resource confBusChannel] if { $channel != 0 } { global V set V(cb) [new confbus $channel] $V(cb) handler confbusHandler } } Uh[jh`] proc net_open_ip { sessionType session dst } { global V set c $V(class) set dst [split $dst /] set n [llength $dst] if { $n < 2 } { warn "must specify both address and port in the form addr/port" exit 1 } else { set addr [lindex $dst 0] set port [lindex $dst 1] if { ![string match \[0-9\]* $port] || $port >= 65536 } { warn "illegal port '$port'" exit 1 } if { $n >= 3 } { if { $sessionType == "vat" } { set confid [lindex $dst 2] if { $n >= 4 } { set fmt [lindex $dst 3] if { $n >= 5 } { set ttl [lindex $dst 4] if { $n > 5 } { usage } } } } else { set fmt [lindex $dst 2] if { $n >= 4 } { set ttl [lindex $dst 3] if { $n > 4 } { usage } } } } if { [info exists fmt] && $fmt != "" } { option add $c.defaultFormat $fmt interactive option add $c.audioFormat $fmt interactive } if [info exists confid] { option add $c.confid $confid interactive } if [info exists ttl] { option add $c.defaultTTL $ttl interactive } } set ttl [resource defaultTTL] if { $ttl < 0 || $ttl > 255 } { warn "invalid ttl ($ttl)" exit 1 } if { $sessionType == "rtp" } { set port [expr $port &~ 1] } set dn [new network ip] $dn open $addr $port $ttl $session data-net $dn if { $sessionType != "nv" } { if { $sessionType == "ivs" } { incr port 2 } else { incr port } set cn [new network ip] $cn open $addr $port $ttl $session ctrl-net $cn set V(ctrl-net) $cn } set V(data-net) $dn set maxbw [resource maxbw] if { $maxbw < 0 } { if { $V(app) == "vat" } { switch [resource audioFormat] { pcm { set maxbw 78 } pcm2 { set maxbw 71 } pcm4 { set maxbw 68 } dvi { set maxbw 46 } dvi2 { set maxbw 39 } dvi4 { set maxbw 36 } gsm { set maxbw 17 } lpc4 { set maxbw 9 } default { set maxbw 71 } } } else { if { $ttl <= 16 || ![in_multicast [$dn addr]] } { set maxbw 3072 } elseif { $ttl <= 64 } { set maxbw 1024 } elseif { $ttl <= 128 } { set maxbw 128 } elseif { $ttl <= 192 } { set maxbw 53 } else { set maxbw 32 } } option add $c.maxbw $maxbw interactive } } proc net_open_atm { sessionType session dst } { global V set dataSAP 4092 set ctrlSAP 4090 set dn [new network atm] if { $dn == "" } { warn "not compiled with ATM support" exit 1 } if { [$dn open $dst $dataSAP 256 64 128 128 2 1] < 0 } { warn "cannot open atm connection to $dst" exit 1 } $session data-net $dn set cn [new network atm] if { [$cn open $dst $ctrlSAP 128 64 24 24 2 1] < 0 } { warn "cannot open atm control connection to $dst" exit 1 } $session ctrl-net $cn set V(ctrl-net) $cn set V(data-net) $dn } proc net_open_rtip { sessionType session dst } { global V set dst [split $dst /] set n [llength $dst] if { $n != 2 } { warn "must specify both address and port (i.e., addr/port) for RTIP" exit 1 } set addr [lindex $dst 0] set port [lindex $dst 1] set dn [new network rtip] if { [$dn open $addr $port [resource rtipXmin] [resource rtipXave] \ [resource rtipI] [resource rtipSmax] [resource rtipD] \ [resource rtipJ] [resource rtipZ] [resource rtipW] \ [resource rtipU] [resource rtipType]] < 0 } { warn "cannot open RTIP connection to $addr/$port" exit 1 } $session data-net $dn $session ctrl-net $dn set V(ctrl-net) $cn set V(data-net) $dn } proc init_network {} { set netType [resource network] if { [info procs net_open_$netType] == "" } { warn "$netType not a recognized network type" exit 1 } set sessionType [resource sessionType] if { $sessionType == "rtpv2" || $sessionType == "vic" } { set sessionType rtp } global V set V(sessionType) $sessionType set V(session) [new session $V(media)/$sessionType] if { $V(session) == "" } { warn "'$sessionType' not a recognized session type" exit 1 } net_open_$netType $sessionType $V(session) [resource defaultHostSpec] $V(session) max-bandwidth [resource maxbw] set key [resource sessionKey] if { $key != "" } { crypt_set $key } } proc in_multicast addr { return [expr ([lindex [split $addr .] 0] & 0xf0) == 0xe0] } proc crypt_format {key sessionType} { if {$sessionType == "vat"} { set fmt VAT } else { set k [string first / $key] if { $k < 0 } { set fmt DES1 } else { set fmt [string range $key 0 [expr $k - 1]] set key [string range $key [expr $k + 1] end] } } return "$fmt $key" } proc crypt_set key { global doEncryption entryTab V set L [crypt_format $key $V(sessionType)] set fmt [lindex $L 0] set key [lindex $L 1] set dc data-crypt:$fmt set cc ctrl-crypt:$fmt if ![info exists V($dc)] { set crypt [new crypt $fmt/data] if { $crypt == "" } { open_dialog "no $fmt enryption support" return -1 } set V($dc) $crypt set V($cc) [new crypt $fmt/ctrl] } if [$V($dc) key $key] { $V($cc) key $key $V(data-net) crypt $V($dc) $V(ctrl-net) crypt $V($cc) set V(encrypt) 1 return 0 } else { open_dialog "your key is cryptographically weak" crypt_clear return -1 } } proc crypt_clear {} { global V $V(data-net) crypt "" $V(ctrl-net) crypt "" set V(encrypt) 0 } Uhmjh謪] proc rtp_format src { global rtp_type set fmt [$src format] if [info exists rtp_type($fmt)] { return $rtp_type($fmt) } elseif { $fmt < 0 } { return "" } else { return fmt-$fmt } } proc local_fqdn {} { set host [gethostname] if { [string first . $host] < 0 } { return "" } return $host } proc init_local {} { global V set f ~/.$V(app).tcl if [file exists $f] { uplevel #0 "source $f" } set script [resource startupScript] if { $script != "" } { uplevel #0 "source $script" } set name [resource rtpName] if { $name == "" } { set name [resource sessionName] option add *rtpName $name startupFile } set email [resource rtpEmail] if { $name == "" || $email == "" } { run_resource_dialog $name $email } } proc email_heursitic {} { set user [user_heuristic] set addr [local_fqdn] if { $addr == "" } { return "" } return $user@$addr } proc user_heuristic {} { global env if [info exists env(USER)] { set user $env(USER) } elseif [info exists env(LOGNAME)] { set user $env(LOGNAME) } else { catch "set env(USER) [getusername]" if [info exists env(USER)] { return $env(USER) } return "UNKNOWN" } } proc user_hook {} { } proc init_late {} { global V env set net $V(data-net) set srcid [session random-srcid [$net addr]] set src [srctab create-local $srcid [$net interface]] set cname [resource cname] if { $cname == "" } { set interface [$net interface] if { $interface == "0.0.0.0" } { set interface [session local-addr-heuristic] } set cname [user_heuristic]@$interface } $src sdes name [resource rtpName] $src sdes email [resource rtpEmail] $src sdes cname $cname set tool $V(app)-[version] global tcl_platform if {[info exists tcl_platform(os)] && $tcl_platform(os) != "" && \ $tcl_platform(os) != "unix"} { set p $tcl_platform(os) if {$tcl_platform(osVersion) != ""} { set p $p-$tcl_platform(osVersion) } if {$tcl_platform(machine) != ""} { set p $p-$tcl_platform(machine) } set tool "$tool/$p" } $src sdes tool $tool global prefix set prefix [resource iconPrefix] set conf [resource conferenceName] if { $conf == "" } { global V set net $V(data-net) set conf [$net addr]/[$net port] } wm iconname . "$prefix$conf" wm title . $conf set V(confname) [wm title .] set V(useHardwareDecode) [yesno useHardwareDecode] srctab site-drop-time [resource siteDropTime] user_hook } proc warn s { global V puts stderr "$V(app): $s" } proc debug s { if [yesno debug] { warn $s } } proc have what { global V return [info exists V($what)] } proc resource r { global V return [option get . $r $V(class)] } proc yesno attr { set v [resource $attr] if { [string match \[0-9\]* $v] } { return $v } if { $v == "true" || $v == "True" || $v == "t" } { return 1 } return 0 } proc getid src { set name [$src sdes name] if { $name == "" } { set name [$src sdes cname] if { $name == "" } { set name [$src addr] } } return $name } Uhxjh萟] proc tkerror { msg } { global errorInfo V set info $errorInfo if { [string match "no more colors*" $msg] } { puts "$V(app): $msg" return } puts "$V(app)-[version]: tcl runtime error: $msg" puts "stack trace:" puts $info puts \ "Please mail this error message and, if possible, an explanation\ \nof what user-action caused it to $V(app)@ee.lbl.gov." } proc "" args { global errorInfo V set info $errorInfo puts "$V(app)-[version]: null proc called:" puts "stack trace:" puts $info puts \ "Please mail this error message and, if possible, an explanation\ \nof what user-action caused it to $V(app)@ee.lbl.gov." } Uhl{jh] bind Entry { catch { global entryTab if { $entryTab(%W:focus) } { focus %W } } } bind Entry { focus . %W select clear catch { global entryTab set entryTab(%W:focus) 0 set v [%W get] if { [$entryTab(%W:action) %W $v] } { %W delete 0 end %W insert 0 $entryTab(%W:value) } else { set entryTab(%W:value) $v } } } bind Entry { focus . %W select clear %W delete 0 end catch { global entryTab set entryTab(%W:focus) 0 %W insert 0 $entryTab(%W:value) } } bind Entry [bind Entry ] bind Entry { tkEntrySetCursor %W 0 %W delete insert end } Uh}jh褚] if {[info commands package] == ""} { error "version mismatch: library\nscripts expect Tcl version 7.5b1 or later but the loaded version is\nonly [info patchlevel]" } package require -exact Tcl 7.5 if [catch {set auto_path $env(TCLLIBPATH)}] { set auto_path "" } if {[lsearch -exact $auto_path [info library]] < 0} { lappend auto_path [info library] } package unknown tclPkgUnknown if {[info commands exec] == ""} { set auto_noexec 1 } set errorCode "" set errorInfo "" proc unknown args { global auto_noexec auto_noload env unknown_pending tcl_interactive global errorCode errorInfo set savedErrorCode $errorCode set savedErrorInfo $errorInfo set name [lindex $args 0] if ![info exists auto_noload] { if [info exists unknown_pending($name)] { unset unknown_pending($name) if {[array size unknown_pending] == 0} { unset unknown_pending } return -code error "self-referential recursion in \"unknown\" for command \"$name\""; } set unknown_pending($name) pending; set ret [catch {auto_load $name} msg] unset unknown_pending($name); if {$ret != 0} { return -code $ret -errorcode $errorCode \ "error while autoloading \"$name\": $msg" } if ![array size unknown_pending] { unset unknown_pending } if $msg { set errorCode $savedErrorCode set errorInfo $savedErrorInfo set code [catch {uplevel $args} msg] if {$code == 1} { set new [split $errorInfo \n] set new [join [lrange $new 0 [expr [llength $new] - 6]] \n] return -code error -errorcode $errorCode \ -errorinfo $new $msg } else { return -code $code $msg } } } if {([info level] == 1) && ([info script] == "") \ && [info exists tcl_interactive] && $tcl_interactive} { if ![info exists auto_noexec] { if [auto_execok $name] { set errorCode $savedErrorCode set errorInfo $savedErrorInfo return [uplevel exec >&@stdout <@stdin $args] } } set errorCode $savedErrorCode set errorInfo $savedErrorInfo if {$name == "!!"} { return [uplevel {history redo}] } if [regexp {^!(.+)$} $name dummy event] { return [uplevel [list history redo $event]] } if [regexp {^\^([^^]*)\^([^^]*)\^?$} $name dummy old new] { return [uplevel [list history substitute $old $new]] } set cmds [info commands $name*] if {[llength $cmds] == 1} { return [uplevel [lreplace $args 0 0 $cmds]] } if {[llength $cmds] != 0} { if {$name == ""} { return -code error "empty command name \"\"" } else { return -code error \ "ambiguous command name \"$name\": [lsort $cmds]" } } } return -code error "invalid command name \"$name\"" } proc auto_load cmd { global auto_index auto_oldpath auto_path env errorInfo errorCode if [info exists auto_index($cmd)] { uplevel #0 $auto_index($cmd) return [expr {[info commands $cmd] != ""}] } if ![info exists auto_path] { return 0 } if [info exists auto_oldpath] { if {$auto_oldpath == $auto_path} { return 0 } } set auto_oldpath $auto_path for {set i [expr [llength $auto_path] - 1]} {$i >= 0} {incr i -1} { set dir [lindex $auto_path $i] set f "" if [catch {set f [open [file join $dir tclIndex]]}] { continue } set error [catch { set id [gets $f] if {$id == "# Tcl autoload index file, version 2.0"} { eval [read $f] } elseif {$id == "# Tcl autoload index file: each line identifies a Tcl"} { while {[gets $f line] >= 0} { if {([string index $line 0] == "#") || ([llength $line] != 2)} { continue } set name [lindex $line 0] set auto_index($name) \ "source [file join $dir [lindex $line 1]]" } } else { error "[file join $dir tclIndex] isn't a proper Tcl index file" } } msg] if {$f != ""} { close $f } if $error { error $msg $errorInfo $errorCode } } if [info exists auto_index($cmd)] { uplevel #0 $auto_index($cmd) if {[info commands $cmd] != ""} { return 1 } } return 0 } if {[string compare $tcl_platform(platform) windows] == 0} { proc auto_execok name { global auto_execs env if [info exists auto_execs($name)] { return $auto_execs($name) } set auto_execs($name) 0 if {[file pathtype $name] != "relative"} { foreach ext {.exe .bat .cmd} { if {[file exists ${name}${ext}] && ![file isdirectory ${name}${ext}]} { set auto_execs($name) 1 } } return $auto_execs($name) } if {! [info exists env(PATH)]} { if [info exists env(Path)] { set path $env(Path) } else { return 0 } } else { set path $env(PATH) } foreach dir [split $path {;}] { if {$dir == ""} { set dir . } foreach ext {.exe .bat .cmd} { set file [file join $dir ${name}${ext}] if {[file exists $file] && ![file isdirectory $file]} { set auto_execs($name) 1 return 1 } } } return 0 } } else { proc auto_execok name { global auto_execs env if [info exists auto_execs($name)] { return $auto_execs($name) } set auto_execs($name) 0 if {[file pathtype $name] != "relative"} { if {[file executable $name] && ![file isdirectory $name]} { set auto_execs($name) 1 } return $auto_execs($name) } foreach dir [split $env(PATH) :] { if {$dir == ""} { set dir . } set file [file join $dir $name] if {[file executable $file] && ![file isdirectory $file]} { set auto_execs($name) 1 return 1 } } return 0 } } proc auto_reset {} { global auto_execs auto_index auto_oldpath foreach p [info procs] { if {[info exists auto_index($p)] && ($p != "unknown") && ![string match auto_* $p]} { rename $p {} } } catch {unset auto_execs} catch {unset auto_index} catch {unset auto_oldpath} } proc auto_mkindex {dir args} { global errorCode errorInfo set oldDir [pwd] cd $dir set dir [pwd] append index "# Tcl autoload index file, version 2.0\n" append index "# This file is generated by the \"auto_mkindex\" command\n" append index "# and sourced to set up indexing information for one or\n" append index "# more commands. Typically each line is a command that\n" append index "# sets an element in the auto_index array, where the\n" append index "# element name is the name of a command and the value is\n" append index "# a script that loads the command.\n\n" if {$args == ""} { set args *.tcl } foreach file [eval glob $args] { set f "" set error [catch { set f [open $file] while {[gets $f line] >= 0} { if [regexp {^proc[ ]+([^ ]*)} $line match procName] { append index "set [list auto_index($procName)]" append index " \[list source \[file join \$dir [list $file]\]\]\n" } } close $f } msg] if $error { set code $errorCode set info $errorInfo catch {close $f} cd $oldDir error $msg $info $code } } set f "" set error [catch { set f [open tclIndex w] puts $f $index nonewline close $f cd $oldDir } msg] if $error { set code $errorCode set info $errorInfo catch {close $f} cd $oldDir error $msg $info $code } } proc pkg_mkIndex {dir args} { global errorCode errorInfo append index "# Tcl package index file, version 1.0\n" append index "# This file is generated by the \"pkg_mkIndex\" command\n" append index "# and sourced either when an application starts up or\n" append index "# by a \"package unknown\" script. It invokes the\n" append index "# \"package ifneeded\" command to set up package-related\n" append index "# information so that packages will be loaded automatically\n" append index "# in response to \"package require\" commands. When this\n" append index "# script is sourced, the variable \$dir must contain the\n" append index "# full path name of this file's directory.\n" set oldDir [pwd] cd $dir foreach file [eval glob $args] { set c [interp create] $c eval [list set file $file] if [catch { $c eval { proc dummy args {} package unknown dummy set origCmds [info commands] set dir "" ;# in case file is pkgIndex.tcl set pkgs "" if [catch {load [file join . $file]}] { if [catch {source $file}] { puts $errorInfo error "can't either load or source $file" } else { set type source } } else { set type load } foreach i [info commands] { set cmds($i) 1 } foreach i $origCmds { catch {unset cmds($i)} } foreach i [package names] { if {([string compare [package provide $i] ""] != 0) && ([string compare $i Tcl] != 0)} { lappend pkgs [list $i [package provide $i]] } } } } msg] { interp delete $c error $msg $errorInfo $errorCode } foreach pkg [$c eval set pkgs] { lappend files($pkg) [list $file [$c eval set type] \ [lsort [$c eval array names cmds]]] } interp delete $c } foreach pkg [lsort [array names files]] { append index "\npackage ifneeded $pkg\ \"tclPkgSetup \$dir [lrange $pkg 0 0] [lrange $pkg 1 1]\ [list $files($pkg)]\"" } set f [open pkgIndex.tcl w] puts $f $index close $f cd $oldDir } proc tclPkgSetup {dir pkg version files} { global auto_index package provide $pkg $version foreach fileInfo $files { set f [lindex $fileInfo 0] set type [lindex $fileInfo 1] foreach cmd [lindex $fileInfo 2] { if {$type == "load"} { set auto_index($cmd) [list load [file join $dir $f] $pkg] } else { set auto_index($cmd) [list source [file join $dir $f]] } } } } proc tclPkgUnknown {name version {exact {}}} { global auto_path if ![info exists auto_path] { return } for {set i [expr [llength $auto_path] - 1]} {$i >= 0} {incr i -1} { set dir [lindex $auto_path $i] set file [file join $dir pkgIndex.tcl] if [file readable $file] { } } } package require -exact Tk 4.1 package require -exact Tcl 7.5 if {[lsearch -exact $auto_path $tk_library] < 0} { lappend auto_path $tk_library } set tk_strictMotif 0 proc tkScreenChanged screen { set disp [file rootname $screen] uplevel #0 upvar #0 tkPriv.$disp tkPriv global tkPriv if [info exists tkPriv] { set tkPriv(screen) $screen return } set tkPriv(afterId) {} set tkPriv(buttons) 0 set tkPriv(buttonWindow) {} set tkPriv(dragging) 0 set tkPriv(focus) {} set tkPriv(grab) {} set tkPriv(initPos) {} set tkPriv(inMenubutton) {} set tkPriv(listboxPrev) {} set tkPriv(mouseMoved) 0 set tkPriv(oldGrab) {} set tkPriv(popup) {} set tkPriv(postedMb) {} set tkPriv(pressX) 0 set tkPriv(pressY) 0 set tkPriv(screen) $screen set tkPriv(selectMode) char set tkPriv(window) {} } tkScreenChanged [winfo screen .] if {$tcl_platform(platform) != "macintosh"} { } bind all {focus [tk_focusNext %W]} bind all {focus [tk_focusPrev %W]} proc tkCancelRepeat {} { global tkPriv after cancel $tkPriv(afterId) set tkPriv(afterId) {} } bind Button {} bind Button { tkButtonEnter %W } bind Button { tkButtonLeave %W } bind Button <1> { tkButtonDown %W } bind Button { tkButtonUp %W } bind Button { tkButtonInvoke %W } bind Checkbutton {} bind Checkbutton { tkButtonEnter %W } bind Checkbutton { tkButtonLeave %W } bind Checkbutton <1> { tkCheckRadioInvoke %W } bind Checkbutton { tkCheckRadioInvoke %W } bind Checkbutton { if !$tk_strictMotif { tkCheckRadioInvoke %W } } bind Radiobutton {} bind Radiobutton { tkButtonEnter %W } bind Radiobutton { tkButtonLeave %W } bind Radiobutton <1> { tkCheckRadioInvoke %W } bind Radiobutton { tkCheckRadioInvoke %W } bind Radiobutton { if !$tk_strictMotif { tkCheckRadioInvoke %W } } proc tkButtonEnter {w} { global tkPriv if {[$w cget -state] != "disabled"} { $w config -state active if {$tkPriv(buttonWindow) == $w} { $w configure -state active -relief sunken } } set tkPriv(window) $w } proc tkButtonLeave w { global tkPriv if {[$w cget -state] != "disabled"} { $w config -state normal } if {$w == $tkPriv(buttonWindow)} { $w configure -relief $tkPriv(relief) } set tkPriv(window) "" } proc tkButtonDown w { global tkPriv set tkPriv(relief) [lindex [$w config -relief] 4] if {[$w cget -state] != "disabled"} { set tkPriv(buttonWindow) $w $w config -relief sunken } } proc tkButtonUp w { global tkPriv if {$w == $tkPriv(buttonWindow)} { set tkPriv(buttonWindow) "" $w config -relief $tkPriv(relief) if {($w == $tkPriv(window)) && ([$w cget -state] != "disabled")} { uplevel #0 [list $w invoke] } } } proc tkButtonInvoke w { if {[$w cget -state] != "disabled"} { set oldRelief [$w cget -relief] set oldState [$w cget -state] $w configure -state active -relief sunken update idletasks after 100 $w configure -state $oldState -relief $oldRelief uplevel #0 [list $w invoke] } } proc tkCheckRadioInvoke w { if {[$w cget -state] != "disabled"} { uplevel #0 [list $w invoke] } } proc tk_dialog {w title text bitmap default args} { global tkPriv catch {destroy $w} toplevel $w -class Dialog wm title $w $title wm iconname $w Dialog wm protocol $w WM_DELETE_WINDOW { } frame $w.bot -relief raised -bd 1 pack $w.bot -side bottom -fill both frame $w.top -relief raised -bd 1 pack $w.top -side top -fill both -expand 1 option add *Dialog.msg.wrapLength 3i widgetDefault label $w.msg -justify left -text $text catch {$w.msg configure -font \ -Adobe-Times-Medium-R-Normal--*-180-*-*-*-*-*-* } pack $w.msg -in $w.top -side right -expand 1 -fill both -padx 3m -pady 3m if {$bitmap != ""} { label $w.bitmap -bitmap $bitmap pack $w.bitmap -in $w.top -side left -padx 3m -pady 3m } set i 0 foreach but $args { button $w.button$i -text $but -command "set tkPriv(button) $i" if {$i == $default} { frame $w.default -relief sunken -bd 1 raise $w.button$i $w.default pack $w.default -in $w.bot -side left -expand 1 -padx 3m -pady 2m pack $w.button$i -in $w.default -padx 2m -pady 2m } else { pack $w.button$i -in $w.bot -side left -expand 1 \ -padx 3m -pady 2m } incr i } if {$default >= 0} { bind $w " $w.button$default configure -state active -relief sunken update idletasks after 100 set tkPriv(button) $default " } wm withdraw $w update idletasks set x [expr [winfo screenwidth $w]/2 - [winfo reqwidth $w]/2 \ - [winfo vrootx [winfo parent $w]]] set y [expr [winfo screenheight $w]/2 - [winfo reqheight $w]/2 \ - [winfo vrooty [winfo parent $w]]] wm geom $w +$x+$y wm deiconify $w set oldFocus [focus] set oldGrab [grab current $w] if {$oldGrab != ""} { set grabStatus [grab status $oldGrab] } grab $w if {$default >= 0} { focus $w.button$default } else { focus $w } tkwait variable tkPriv(button) catch {focus $oldFocus} destroy $w if {$oldGrab != ""} { if {$grabStatus == "global"} { grab -global $oldGrab } else { grab $oldGrab } } return $tkPriv(button) } proc tkEntryClipboardKeysyms {copy cut paste} { bind Entry <$copy> { if {[selection own -displayof %W] == "%W"} { clipboard clear -displayof %W catch { clipboard append -displayof %W [selection get -displayof %W] } } } bind Entry <$cut> { if {[selection own -displayof %W] == "%W"} { clipboard clear -displayof %W catch { clipboard append -displayof %W [selection get -displayof %W] %W delete sel.first sel.last } } } bind Entry <$paste> { catch { %W insert insert [selection get -displayof %W \ -selection CLIPBOARD] } } } bind Entry <1> { tkEntryButton1 %W %x %W selection clear } bind Entry { set tkPriv(x) %x tkEntryMouseSelect %W %x } bind Entry { set tkPriv(selectMode) word tkEntryMouseSelect %W %x catch {%W icursor sel.first} } bind Entry { set tkPriv(selectMode) line tkEntryMouseSelect %W %x %W icursor 0 } bind Entry { set tkPriv(selectMode) char %W selection adjust @%x } bind Entry { set tkPriv(selectMode) word tkEntryMouseSelect %W %x } bind Entry { set tkPriv(selectMode) line tkEntryMouseSelect %W %x } bind Entry { set tkPriv(x) %x tkEntryAutoScan %W } bind Entry { tkCancelRepeat } bind Entry { tkCancelRepeat } bind Entry { %W icursor @%x } bind Entry { if {!$tkPriv(mouseMoved) || $tk_strictMotif} { tkEntryPaste %W %x } } bind Entry { tkEntrySetCursor %W [expr [%W index insert] - 1] } bind Entry { tkEntrySetCursor %W [expr [%W index insert] + 1] } bind Entry { tkEntryKeySelect %W [expr [%W index insert] - 1] tkEntrySeeInsert %W } bind Entry { tkEntryKeySelect %W [expr [%W index insert] + 1] tkEntrySeeInsert %W } bind Entry { tkEntrySetCursor %W \ [string wordstart [%W get] [expr [%W index insert] - 1]] } bind Entry { tkEntrySetCursor %W [string wordend [%W get] [%W index insert]] } bind Entry { tkEntryKeySelect %W \ [string wordstart [%W get] [expr [%W index insert] - 1]] tkEntrySeeInsert %W } bind Entry { tkEntryKeySelect %W [string wordend [%W get] [%W index insert]] tkEntrySeeInsert %W } bind Entry { tkEntrySetCursor %W 0 } bind Entry { tkEntryKeySelect %W 0 tkEntrySeeInsert %W } bind Entry { tkEntrySetCursor %W end } bind Entry { tkEntryKeySelect %W end tkEntrySeeInsert %W } bind Entry { if [%W selection present] { %W delete sel.first sel.last } else { %W delete insert } } bind Entry { tkEntryBackspace %W } bind Entry { %W selection from insert } bind Entry { tkListboxBeginSelect %W [%W index active] } bind Listbox { tkListboxBeginExtend %W [%W index active] } bind Listbox { tkListboxBeginExtend %W [%W index active] } bind Listbox { tkListboxCancel %W } bind Listbox { tkListboxSelectAll %W } bind Listbox { if {[%W cget -selectmode] != "browse"} { %W selection clear 0 end } } bind Listbox <2> { %W scan mark %x %y } bind Listbox { %W scan dragto %x %y } proc tkListboxBeginSelect {w el} { global tkPriv if {[$w cget -selectmode] == "multiple"} { if [$w selection includes $el] { $w selection clear $el } else { $w selection set $el } } else { $w selection clear 0 end $w selection set $el $w selection anchor $el set tkPriv(listboxSelection) {} set tkPriv(listboxPrev) $el } } proc tkListboxMotion {w el} { global tkPriv if {$el == $tkPriv(listboxPrev)} { return } set anchor [$w index anchor] switch [$w cget -selectmode] { browse { $w selection clear 0 end $w selection set $el set tkPriv(listboxPrev) $el } extended { set i $tkPriv(listboxPrev) if [$w selection includes anchor] { $w selection clear $i $el $w selection set anchor $el } else { $w selection clear $i $el $w selection clear anchor $el } while {($i < $el) && ($i < $anchor)} { if {[lsearch $tkPriv(listboxSelection) $i] >= 0} { $w selection set $i } incr i } while {($i > $el) && ($i > $anchor)} { if {[lsearch $tkPriv(listboxSelection) $i] >= 0} { $w selection set $i } incr i -1 } set tkPriv(listboxPrev) $el } } } proc tkListboxBeginExtend {w el} { if {([$w cget -selectmode] == "extended") && [$w selection includes anchor]} { tkListboxMotion $w $el } } proc tkListboxBeginToggle {w el} { global tkPriv if {[$w cget -selectmode] == "extended"} { set tkPriv(listboxSelection) [$w curselection] set tkPriv(listboxPrev) $el $w selection anchor $el if [$w selection includes $el] { $w selection clear $el } else { $w selection set $el } } } proc tkListboxAutoScan {w} { global tkPriv if {![winfo exists $w]} return set x $tkPriv(x) set y $tkPriv(y) if {$y >= [winfo height $w]} { $w yview scroll 1 units } elseif {$y < 0} { $w yview scroll -1 units } elseif {$x >= [winfo width $w]} { $w xview scroll 2 units } elseif {$x < 0} { $w xview scroll -2 units } else { return } tkListboxMotion $w [$w index @$x,$y] set tkPriv(afterId) [after 50 tkListboxAutoScan $w] } proc tkListboxUpDown {w amount} { global tkPriv $w activate [expr [$w index active] + $amount] $w see active switch [$w cget -selectmode] { browse { $w selection clear 0 end $w selection set active } extended { $w selection clear 0 end $w selection set active $w selection anchor active set tkPriv(listboxPrev) [$w index active] set tkPriv(listboxSelection) {} } } } proc tkListboxExtendUpDown {w amount} { if {[$w cget -selectmode] != "extended"} { return } $w activate [expr [$w index active] + $amount] $w see active tkListboxMotion $w [$w index active] } proc tkListboxDataExtend {w el} { set mode [$w cget -selectmode] if {$mode == "extended"} { $w activate $el $w see $el if [$w selection includes anchor] { tkListboxMotion $w $el } } elseif {$mode == "multiple"} { $w activate $el $w see $el } } proc tkListboxCancel w { global tkPriv if {[$w cget -selectmode] != "extended"} { return } set first [$w index anchor] set last $tkPriv(listboxPrev) if {$first > $last} { set tmp $first set first $last set last $tmp } $w selection clear $first $last while {$first <= $last} { if {[lsearch $tkPriv(listboxSelection) $first] >= 0} { $w selection set $first } incr first } } proc tkListboxSelectAll w { set mode [$w cget -selectmode] if {($mode == "single") || ($mode == "browse")} { $w selection clear 0 end $w selection set active } else { $w selection set 0 end } } bind Menubutton {} bind Menubutton { tkMbEnter %W } bind Menubutton { tkMbLeave %W } bind Menubutton <1> { if {$tkPriv(inMenubutton) != ""} { tkMbPost $tkPriv(inMenubutton) %X %Y } } bind Menubutton { tkMbMotion %W up %X %Y } bind Menubutton { tkMbMotion %W down %X %Y } bind Menubutton { tkMbButtonUp %W } bind Menubutton { tkMbPost %W tkMenuFirstEntry [%W cget -menu] } bind Menu {} bind Menu { set tkPriv(window) %W if {"%m" != "NotifyUngrab"} { focus %W } } bind Menu { tkMenuLeave %W %X %Y %s } bind Menu { tkMenuMotion %W %y %s } bind Menu { tkMenuButtonDown %W } bind Menu { tkMenuInvoke %W 1 } bind Menu { tkMenuInvoke %W 0 } bind Menu { tkMenuInvoke %W 0 } bind Menu { tkMenuEscape %W } bind Menu { tkMenuLeftRight %W left } bind Menu { tkMenuLeftRight %W right } bind Menu { tkMenuNextEntry %W -1 } bind Menu { tkMenuNextEntry %W +1 } bind Menu { tkTraverseWithinMenu %W %A } bind all { tkTraverseToMenu %W %A } bind all { tkFirstMenu %W } proc tkMbEnter w { global tkPriv if {$tkPriv(inMenubutton) != ""} { tkMbLeave $tkPriv(inMenubutton) } set tkPriv(inMenubutton) $w if {[$w cget -state] != "disabled"} { $w configure -state active } } proc tkMbLeave w { global tkPriv set tkPriv(inMenubutton) {} if ![winfo exists $w] { return } if {[$w cget -state] == "active"} { $w configure -state normal } } proc tkMbPost {w {x {}} {y {}}} { global tkPriv if {([$w cget -state] == "disabled") || ($w == $tkPriv(postedMb))} { return } set menu [$w cget -menu] if {$menu == ""} { return } if ![string match $w.* $menu] { error "can't post $menu: it isn't a descendant of $w (this is a new requirement in Tk versions 3.0 and later)" } set cur $tkPriv(postedMb) if {$cur != ""} { tkMenuUnpost {} } set tkPriv(cursor) [$w cget -cursor] set tkPriv(relief) [$w cget -relief] $w configure -cursor arrow $w configure -relief raised set tkPriv(postedMb) $w set tkPriv(focus) [focus] $menu activate none if [$w cget -indicatoron] { if {$y == ""} { set x [expr [winfo rootx $w] + [winfo width $w]/2] set y [expr [winfo rooty $w] + [winfo height $w]/2] } tkPostOverPoint $menu $x $y [tkMenuFindName $menu [$w cget -text]] } else { $menu post [winfo rootx $w] [expr [winfo rooty $w]+[winfo height $w]] } focus $menu tkSaveGrabInfo $w grab -global $w } proc tkMenuUnpost menu { global tkPriv set mb $tkPriv(postedMb) catch {focus $tkPriv(focus)} set tkPriv(focus) "" catch { if {$mb != ""} { set menu [$mb cget -menu] $menu unpost set tkPriv(postedMb) {} $mb configure -cursor $tkPriv(cursor) $mb configure -relief $tkPriv(relief) } elseif {$tkPriv(popup) != ""} { $tkPriv(popup) unpost set tkPriv(popup) {} } elseif {[wm overrideredirect $menu]} { while 1 { set parent [winfo parent $menu] if {([winfo class $parent] != "Menu") || ![winfo ismapped $parent]} { break } $parent activate none $parent postcascade none if {![wm overrideredirect $parent]} { break } set menu $parent } $menu unpost } } if {$menu != ""} { catch { set grab [grab current $menu] if {$grab != ""} { grab release $grab } } } if {$tkPriv(oldGrab) != ""} { catch { if {$tkPriv(grabStatus) == "global"} { grab set -global $tkPriv(oldGrab) } else { grab set $tkPriv(oldGrab) } } set tkPriv(oldGrab) "" } } proc tkMbMotion {w upDown rootx rooty} { global tkPriv if {$tkPriv(inMenubutton) == $w} { return } set new [winfo containing $rootx $rooty] if {($new != $tkPriv(inMenubutton)) && (($new == "") || ([winfo toplevel $new] == [winfo toplevel $w]))} { if {$tkPriv(inMenubutton) != ""} { tkMbLeave $tkPriv(inMenubutton) } if {($new != "") && ([winfo class $new] == "Menubutton") && ([$new cget -indicatoron] == 0) && ([$w cget -indicatoron] == 0)} { if {$upDown == "down"} { tkMbPost $new $rootx $rooty } else { tkMbEnter $new } } } } proc tkMbButtonUp w { global tkPriv if {($tkPriv(postedMb) == $w) && ($tkPriv(inMenubutton) == $w)} { tkMenuFirstEntry [$tkPriv(postedMb) cget -menu] } else { tkMenuUnpost {} } } proc tkMenuMotion {menu y state} { global tkPriv if {$menu == $tkPriv(window)} { $menu activate @$y } if {($state & 0x1f00) != 0} { $menu postcascade active } } proc tkMenuButtonDown menu { global tkPriv $menu postcascade active if {$tkPriv(postedMb) != ""} { grab -global $tkPriv(postedMb) } else { while {[wm overrideredirect $menu] && ([winfo class [winfo parent $menu]] == "Menu") && [winfo ismapped [winfo parent $menu]]} { set menu [winfo parent $menu] } if {$menu != [grab current $menu]} { tkSaveGrabInfo $menu } grab -global $menu } } proc tkMenuLeave {menu rootx rooty state} { global tkPriv set tkPriv(window) {} if {[$menu index active] == "none"} { return } if {([$menu type active] == "cascade") && ([winfo containing $rootx $rooty] == [$menu entrycget active -menu])} { return } $menu activate none } proc tkMenuInvoke {w buttonRelease} { global tkPriv if {$buttonRelease && ($tkPriv(window) == "")} { $w postcascade none $w activate none tkMenuUnpost $w return } if {[$w type active] == "cascade"} { $w postcascade active set menu [$w entrycget active -menu] tkMenuFirstEntry $menu } elseif {[$w type active] == "tearoff"} { tkMenuUnpost $w tkTearOffMenu $w } else { tkMenuUnpost $w uplevel #0 [list $w invoke active] } } proc tkMenuEscape menu { if {[winfo class [winfo parent $menu]] != "Menu"} { tkMenuUnpost $menu } else { tkMenuLeftRight $menu -1 } } proc tkMenuLeftRight {menu direction} { global tkPriv if {$direction == "right"} { set count 1 if {[$menu type active] == "cascade"} { $menu postcascade active set m2 [$menu entrycget active -menu] if {$m2 != ""} { tkMenuFirstEntry $m2 } return } } else { set count -1 set m2 [winfo parent $menu] if {[winfo class $m2] == "Menu"} { $menu activate none focus $m2 set tmp [$m2 index active] $m2 activate none $m2 activate $tmp return } } set w $tkPriv(postedMb) if {$w == ""} { return } set buttons [winfo children [winfo parent $w]] set length [llength $buttons] set i [expr [lsearch -exact $buttons $w] + $count] while 1 { while {$i < 0} { incr i $length } while {$i >= $length} { incr i -$length } set mb [lindex $buttons $i] if {([winfo class $mb] == "Menubutton") && ([$mb cget -state] != "disabled") && ([$mb cget -menu] != "") && ([[$mb cget -menu] index last] != "none")} { break } if {$mb == $w} { return } incr i $count } tkMbPost $mb tkMenuFirstEntry [$mb cget -menu] } proc tkMenuNextEntry {menu count} { global tkPriv if {[$menu index last] == "none"} { return } set length [expr [$menu index last]+1] set quitAfter $length set active [$menu index active] if {$active == "none"} { set i 0 } else { set i [expr $active + $count] } while 1 { if {$quitAfter <= 0} { return } while {$i < 0} { incr i $length } while {$i >= $length} { incr i -$length } if {[catch {$menu entrycget $i -state} state] == 0} { if {$state != "disabled"} { break } } if {$i == $active} { return } incr i $count incr quitAfter -1 } $menu activate $i $menu postcascade $i } proc tkMenuFind {w char} { global tkPriv set char [string tolower $char] foreach child [winfo child $w] { switch [winfo class $child] { Menubutton { set char2 [string index [$child cget -text] \ [$child cget -underline]] if {([string compare $char [string tolower $char2]] == 0) || ($char == "")} { if {[$child cget -state] != "disabled"} { return $child } } } Frame { set match [tkMenuFind $child $char] if {$match != ""} { return $match } } } } return {} } proc tkTraverseToMenu {w char} { global tkPriv if {$char == ""} { return } while {[winfo class $w] == "Menu"} { if {$tkPriv(postedMb) == ""} { return } set w [winfo parent $w] } set w [tkMenuFind [winfo toplevel $w] $char] if {$w != ""} { tkMbPost $w tkMenuFirstEntry [$w cget -menu] } } proc tkFirstMenu w { set w [tkMenuFind [winfo toplevel $w] ""] if {$w != ""} { tkMbPost $w tkMenuFirstEntry [$w cget -menu] } } proc tkTraverseWithinMenu {w char} { if {$char == ""} { return } set char [string tolower $char] set last [$w index last] if {