ELF(4|4 ('$p  44444444d   HHH Qtd/lib/ld-linux.so.3GNUiOE)-lv`2\"ft1BLYC:}!{kN sgn4~z.WwyP3_$h|m*%JTu+VDKqa0I7X6p; ]x?r &#=(>5F@Q,UR<^'9cZeG HA8MbS/o[jd x,L8RDP8\htvșԙO\  (D(|4@LX)dp|3%ĚК$ܚ> Ȥ~$J0\<gHTa`lx"̛u؛kw7< ,B8oDФ!P\hmtaL( }Ȝ6ԜhF] n(42@_L+Xd+pФ!|fdXԤVĝ`НܝФGؤܤm )$[0<H0T`lxs~O$( @A?̞؞elibdl.so.2__gmon_start___Jv_RegisterClasseslibutil.so.1login_ttyopenptylibgcc_s.so.1__aeabi_unwind_cpp_pr0__aeabi_unwind_cpp_pr1libc.so.6strcasestrsocketfflushsigwaitsetlocalesrandfopenstrncmpoptindstrrchrpipeclosedirerrorinet_ntopsignalforksigprocmaskreaddir_runlinklistenreallocabort_exitsocketpairmemchrgetpidstrdupstrftimesetutxentstrtolgetgrnam_rexeclecfsetispeedcallocstrlenprctlsigemptysetmemsetwarnstrstrstrcspn__errno_locationbindtcsetattrchdirmemcmpgetnameinfosetgroupsdup2shutdownvsnprintfpollsigaddsetgetpwuid_r__sigsetjmpstdoutfputcfputssetresgidmemcpyfclosestrtoulvprintfsetsockoptmallocsiglongjmpstrcatraisegetpeernameopendirgetenvsetresuidoptargstderrioctlalarmpututxlinegetuidsetrlimitgetopt_longexecvpgetpwnam_rstrncasecmpstrncatsendmsgupdwtmpxfreadgettimeofdaysigactiongetresgidgeteuidsigismemberatoiwaitpidlocaltimeendutxentstrchrgetsocknamefdopenacceptgetresuidtcgetattrsigpendingsetsidfcntlcfsetospeedgetgrgid_rgetrlimitunamememmovegetgroupliststrcmprecvmsg__libc_start_maindirfdwritevfprintfsysconffree__environ__xstat__fxstatGLIBC_2.4GCC_3.5/ ii N U&y ii Ȥ1ФqԤkؤsܤv $(,048 < @ D H LPTX\`dhlptx| !"#$%&'()*+,-ġ.ȡ/̡0С2ԡ3ء4ܡ56789:;<=>?@ ABCDE F$G(H,I0J4L8M<N@ODPHQLRPSTTXV\W`XdYhZl[p\t]x^|_`abcdeghijlmnoprtĢuȢw̢xТyԢzآ{ܢ|}~ @--ƏPʌƏPʌ ƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌ|ƏPʌtƏPʌlƏPʌdƏPʌ\ƏPʌTƏPʌLƏPʌDƏPʌ<ƏPʌ4ƏPʌ,ƏPʌ$ƏPʌƏPʌƏPʌ ƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌ|ƏPʌtƏPʌlƏPʌdƏPʌ\ƏPʌTƏPʌLƏPʌDƏPʌ<ƏPʌ4ƏPʌ,ƏPʌ$ƏPʌƏPʌƏPʌ ƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌ|ƏPʌtƏPʌlƏPʌdƏPʌ\ƏPʌTƏPʌLƏPʌDƏPʌ<ƏPʌ4ƏPʌ,ƏPʌ$ƏPʌƏPʌƏPʌ ƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌƏPʌ|ƏPʌtƏPʌlƏPʌdƏPʌ\ƏPʌTƏPʌLƏPʌDƏPʌ<ƏPʌ4ƏPʌ,ƏPʌ$ƏPʌ  --- 0<00 R/ 0 R  / @-0S0S3/@-@@ @-@P0S S ;$0S; W 0'!$7P !R /0Z@ 0S4  P&}6"61S g`&6,.-x. Q $ R Q0R TL WP PP $$$&$6D :0A/QS#fQ00GAP0S0:C/SPfSGC\P9Q 9S 0000p mPQ0 ST ;W@58%"0S/ $ % 5(0S S  ;P$4f"+@ .(0S0S  ;vpP P` --,0 S 0:.P  03.--``44\ $  ` 0cW  P#? W P#3F {Ptt#t3 W d nPL#L3 W < aPx,#(?WQ TPkPr2Ÿ `P R   ^ 0`kMo p*daP`  FpP@@"@2(  ,," $$" e > W P1a 0sW  P!1fW P0a`PV@V  0$0Je$!40N!B2`$Ѝ BNPou|HO$V'3W@ANB[etkDb5O-@SM 0@rOAP1s 0A1A1!R*RD0!}@T/lNpPh>hpAX=PPP@`84.4>B`@$R?  # 00.P0 RD1 0 R1D1 CSD!$D1s&+0BRD1T B|=P @m1Sv0S P( @$-<=. CSD!'W <0S+Ќ0S 謟P 0S o4P0: S Px t,<0BRD11Wp 0<0S l 0S\ 0<P 0/S9S4 !P aP0S a +; CSD!<P 0S 4P0: S sP  失  P L*H;q  0 0 0|P  :0  r0BRD1&V@\:!R1S 9h:P 0S -`P - 000:|*&I-0l*0 CSD!PaP,  %0BRD1/9: 6P   0kPT P)9  0 0 0P )9 P   CSD!X90SP 8P 0S0 90BRD18PD8  P  P 8 |SC7 !t Q A7 !n R0B7 !h  CSD!T P7P 0S0d1S }WPMP0BRD1 71SmTj,7P 0/S9S_T'\6- CSD!6`P d 0BRD1W0bL6  CSD!WV6  0BRD1PP! 5 CSD!0S5P 0S 0BRD1 5Q 0SHDCSD hPEP ;P j0HXD1/5p W Y մո$հ5  X  (TX4!Rl%!,P T%T5PrD T@ 501P@|50T?3P#4 V P#Ud31S* TSi/Y@P0S z(`$0AA P0S -P0S  "3h)P2Q (P#3V MsPT#3IHP4p#3A* 8P}0S  L^4Q Pn0S  O" 3"4P_0S G | 4PR0S  H"2 A-0!(0P0P"|2 01@(P`T"P2  @<!o02P8P0S  t!1(,Q0K6(01SzPw Ptꘚ$, 4 ܤ`y@`  (vU#*5B7r#[ȤfhADWη]0#IӷԤ0ȦĦ* @0&@<00\ 1@&`00Th@ O@P V00100 @T)'0@300@10T 1 ATRPP' @P A' KPP20S P*0S U R?P0D0EA}@T1O1%01aO-@\MPp$`P -p@-/X (X` #s`P8S4$44 00 50S   .0 P/S  %0.S,-/PPKPP0S .P,.P  P  0刑0Q$,UUX P  /P0: S,0S P:}0S 5 ,0`$`\Pp* ,Z =`P  "$2H lpPS0pS l,0W P0S e!1{WW PM20S H o P,(!L1 ,0P@4WPP0S /&pCWxPP 0   P0S  0S0P,PP\ЍPL7OYNO-0/S`@6 0$601ppp=PPA 01 10 S {0P/S `   ( 0$@(00TĦȦ/@-@@@-~tE-`,MF'PPZ@P   " 2 $00 0PP$PU!1@0S10 S100S100S100S10qnk!pfp`b` `P(!$1 0p0 0 0O lppPD a$0ppP8 U$0ppP, I$0ppP  =,ЍabOn E-M@PTUpP"2 HP`ʼ"2 [P"2#P0S P\X"h2BP84"H29P"(2P0S `%P!1Pv3!1  }Pd0SPZ0S Z aP # P ,` 9  ` QP 0P 0vPxt 0mP!0S P0S P0S ЍO%5E]u/2G-08MS`00~r@P&"2 @PPT"X2 p  s $2  "   "2"00%000PSpPP!1 00$00!   D1 @P0S T   v40,0000,000 000000  7Ps0S !P 00 S0S\\ 0 R@@ h0z R 004L H0p8Ѝ贤 %')@-`Pj/@p V$`0`` 0b P  P  P 0 P0Q *P0P0SU:DRP ->V:D"  xD20PP 0S d   ,,R  p-l=Q *P0P0SD20U1S ,=- S ,<0,C0G=0 AE0 EQ Ra ER.U -U-  CPU<!0Q 1Qp8 0P}Pp*LtXG-8 PpP:D`P0S LXP0S *pLtvP8#+ 0Q ,D40 0k*D:Lt8FP0S -P0S   +0yL,p +]*DP0S :WPt:!0弡A  `Pd +: P@ +: XZpQ`P X P H  p0 9P p7`P +9 0 0GZO < 3O hO 9O *9393|93030O-0    b 8(-V0S0S 9Q B , 8+$Q A $A $8pWI  *02Ih8H2 upPLL(L8t<"0S ,@pP pPp8(W8PypL'7UBP,'7M :P '7D .P000S 7 P(@;8'\7/ NM@PPGM͍ M- 0^P$&6 & pW 00S SpG $ 00 ,Gf N- WWUS0S0 AG0 GQ Ra G-WR.W_WpW=(@9 , P1@ H P Jp GA pPt<$85 j 9  T, D4,00S40S040S0q30S 00p B$bp 0S ,0SlL#H4]0@$PE,L30S  R 0R [Q* 0  :D PT#36' $P,#3,   0zP*D pp"l3Y0 1:D PD 0XH`Pl"2      P "2       Q0S Tp ((P  V%|q jPP"1 P("1 0S 0S"1(0SP\!1P(8!|1 (P`!\1SȦTĦ3Ze0-@7S^ؤN ?%f5jBkq4)K{'O,?Zrv  A_Lo <FO%UФkZZt~0/SP0 ("P(P\8!`1 00h(x|Pp |!1 P 6P!1PU0SG]P@!1PP  "2PP  P p?pKl!@2=PuPh!l2 pm P!2w efP!2m  0 0c S P,("2^ 0AAP CQ  PU<pP$"(3G  B  L,pPX"\37 $$ Pp"t3/  } pP#3$ G  P84#3  i pPd`#3   Y PPM#4  K ,P$4#84 pP $P  4@(p,x($|4[Z Z$ZA  Z "Z Z=Z \Z 'ZXa( PEX  5 $P,50H@s@XX F TPEX 5H%P`50 A@0 @Q Ra @-PR.P  P ,%b:`PC P P00000 $ 0P:`P% $P:`P P0 0( 0/S  VP(|x 0 :0P00S P00, 00=P, t0 AaCi-di*EK8@-P0@P 0v8mj@-@P $(,@@-@@}/L0@-0S@@@ @0<0 R , (0H$@6ĦxȦp@-pP`0SpVZ```f 0SP 00(0EC@Tp踦p@-` @P<P8 804P00-@p"8@-@PP <r8 800 00P0 0$0(0,08GA-p0`Pu@P($ $0 0l@-@P 0SDP0S @-@@ 0+긦 0%긦@-a0@긦0@-M|/@P0S Q  P0S P $ ! 1P0S  @P 0j 0P\00CQàP? S RB | S R0 d0 P 0P0, <0Ѝ0 0i6E-aPQ0@p0dTZ P P T`BP 0S 0`P 00Cp10X0Z0S 0S ``1 Z ~KP@pl l0` 0$0` (踦0 0긦0긦O-`dM@`P@ :pP|\ 0j6P XxT#T30 Z < n#P$0 <S &S 'S "S0 "2b  0+S -SUpPP` PP 4 B (PV"2 4PW!1 [  0PY!1 40400  P& P! xQl aK0Pe$!<1  K0G 0 b  J!  0 S0 }Pxt 0x 0; C0r0S0`* P%VPPU`# PP%V``V ddЍSx- 9!GSp8@-P@@P 08xH@-@@0Sp@-@PpP P0P0P `PUPp@-@@@-@pPp\0\UT`P PWH^ 04P@T  Ѝ@O!40P/,(0@-0P@ @ؤ-@-  @Ѝ/-@-  @Ѝ/-@-  @Ѝ/-@-  @Ѝ/-@-  @Ѝ/-@-  0P/0P/0P/0P/ 0/0/00@s/0P/@-0S0 0T7E-@PpP PP@P4 P 0p}OP`@P 0 0piP&  0PP``Vpl t0 X`@P@< H00 pEP00?TF-@-   @ Ѝ/0## R/0 00/p@-`P@P : 05 pY/A-@PP0q1S` 0S  3/`0 Q5P 0UA.@-@@(O- Pp$M@` W2U 0p0  UP[PPPt!1S01Sp  0 0QpP 0U000 000u J00p[P  0 P 0S   3/01 `!P Y  0PLL P001a! ! 000$ЍY:O- P@U$01SP`/ jPp 0 $p R0S   3/0GV   0pG 01000CS00, ,0=`P00ZYGHp@- @`TPp0AT "@Pp`Ppp@-PO-@p301S`+`QU$0兡0  9/P0S   3/0FU   /0`F PE010PUp 0W/\dh ѷ\ //@-@@0A-S@P Q 003/P p0pl Pdd0.?A#@-Pp`(0S< 103/P 1 !P1Οx.P>0$*3/0SP>03/@P[ 0P0V00x>03/L>03/P B8>8Ο4.P,,>j6P4 P(L83:$ 00 P PZ 40 0 0R40 40/S 0`yP} tPxDZp'7 hPD D'7:$ 00 P a0@S P PX D00 0RD0  D pPD010CS@S('8`($ 0W P P8`Q3 HP&6 0 0Y 0PH<&D6 0 0p:$ 00- P PJpG P0JW 0p W0  P$ 0 P z Z|0St%00 pXjOOOPP|0壏 600000P|QKP0S$4<|0SpW (%7/P\ p,00000  bpaSR@-`@pP! Q,!,1kpES՞!1 P  0 0 T0ppP 0S h0PUp 0R   mpP!10 Uհ!1V!1V!1`e2  -  4!#P 0p0Wں0S,P 10 0PP 0 0S 00#4!uPPP 0 0000 $l|| 0D$,ЍF\+-./?BChG4a@DT0p 0 S;S W=Rp@DTP ;RWG`WgQ 0aBQ  C RW  X0"S00S"SpH  UTA-0`Pp++TP @& %T$ 0B Q0@ @RFR@@d @0B Q @R FR9RB0 7 @b@PS$S0@@T@G-pP@'PU`%`3=VX & F0r0? XH`XhQ HX  A(  7V@U@-@Ppv`P  f(P PP`@ P @PEU@@p@-@P`TU0p p@A-MP`@>U T@ V   (@5T)V0  r R G eP @P 0S b@P\\\ \0`F``gP8 pPЍtvrTO-@MP`9ppp2 +'# p$p<(>0p,PP |w Pw(HXPP  z/pP   ]%PX >PQ 0S PGL UP!P 0 0`P P,i( 00 000 h<p@-` P@P 8 0 phJp@-@PpP)`0S   Q 3/ 00 0S 8P4 40` P0Vp@hR@-@@O-`MV@P 0p0J 0 QC @V`Px"2 0J0 g00 HP!1{  0 00 0C0g000000000 0000 000 0p`Q 0K 0g?  @p W0 b  P P P@0S  3/0`$0SEPpl t0 0 0CQ b 000K  0j Ѝh^=dE-@Rp0P`0Z P P0SVTp " \\TP 0X  0Sp `PZp`0 Q/t:Pkl ?o/o0B0s0 P @ P @ P @ P @ P @  P  @ P @  P  @ P @  P  @ P @  P  @ P @  P  @ P @ P @ P @ P @ P @ P @ P @ P @ P @ P @ P @ P @ P @ P @ P @ P @ P @ P @ ///o b0/PQ @-@A/Q  aB Qp 00`BSoq /oo @ r S?C S?C S>C S>C S=C  S=C S Shell In A Box RIFFDWAVEfmt @@data Ž­:E;E<úˆ5E>=UȹźIA;F3~ʻæ5H8H5}5E><\̷ȷT?=E4ʺ=YʷȷX==E4ʻã4I7H6ºy4E=?NĺźR>>D5˺9F:F;ù̆5D>=VǺŻJA<]̶ȷT>=E5˺=XʷȷY=>E4ʻâ4I7H6ºx4E=?NĺźR>=D5˺9F:F;ùˆ5D>=VǹŻJA<]˶ȷT>=E4˺ùˁ5D>=XʷȷX==E4˻â4I8H6ºy4E=?NĺźQ>>D5˺9F9E;ù̅5D>=VǹŻJA<]̷ȷT>=E4˺ùˁ5D>=XʷȷX=>E4ʻâ4H7H6ºy4E=D5˺9F:F;ùˆ5D>=VǹŻJA<]˷ȷT>=E4˺;E:F:ºt5E=?QƹźM@=YʷǷY=>D5˺ã3I7H6úx5D=?NûĻS<@@=GIF89a   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! , , Dh0*tA Tha@; ( @        ! " #!!$"&#%"$##%$$'%%(&&('')(()-(+)*-+,.--/..1//200311322433644755866977988:99;::=;@>:;><>@?C?A?A@@BAGEABECCFDDGEEHFKIDFIGGIHLHJHKIJLJJLPKNLRPLMPNROQORPPSQRUSTVUUXVVYWX[Y^[]Z\[[^\a_Z\_]^a__b``caadbbecceddfeehfgihgjhmkfjmkknllommpnnqoqsrrussvttwu{wyvywwzxy{zz}{~y{~|}~~.;ROOOOVRhkww|&?D?76=RYhs|161.-?Pamw|w.."&>R^cgijnmzƽ $!6JYTVOOOOV`^w0BODE;5113:?KXhw&6DD3,"(&5DTbs5;6*&1a|ƔoRFEEGVm&&11D_ʭk^TZet$155E[wǡ|}|/59?Vo²)D>DRhw&6DKVbqƿ 1CPVZ^wƼ"=OX_iww/DS^^ks|1O^hkzȽ&)!7M]mww|&0&&&4J\kz1D651DDV^mw %8FHFCFKU[elsy
EscF1F2F3F4F5F6F7F8F9F10F11F12
`~1!2@3#4$5%6^7&8*9(0)-_=+ ← 
TabQWERTYUIOP[{]}\|
Tab  ASDFGHJKL;:'"Enter
  ShiftZXCVBNM,<.>/?Shift
XXXCtrlAlt 
   
InsDelHomeEnd
 
 
Ins   
Ins 
PNG  IHDR()sRGBbKGDIDATH͖MkSAiI#RMŽr Q\DP[nhM-$M#m:0d;g{Ι .ɜw t.Lπ+S.a8Az-p5n*p>e)PNKhP&ecwu#I@TD w3]F~+HnD)PV&97EJ "tr 9[la,57 .EekjfW֍d+ߔIGpةͮ%JŜьX4UbFIq(p"{$y`HgTx |RS Gp895ި&sI$끟K %fr!RLr^M2(Cs]*`w:_a>\Re71 >+bhI,6w/[RݡĔd*p߰0Fh*ӕo >bӽkhlRI2Htz*5u]7aՆQ^ ]ctRZu)EjVJ uxSXxnsD}AaG,mdsM6DzA˚3J<qqnw@cbee0Węb7=^Wׅ34/P#N-IENDB`shellInABoxHttpHandler// VT100.js -- JavaScript based terminal emulator // Copyright (C) 2008-2010 Markus Gutschke // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // // In addition to these license terms, the author grants the following // additional rights: // // If you modify this program, or any covered work, by linking or // combining it with the OpenSSL project's OpenSSL library (or a // modified version of that library), containing parts covered by the // terms of the OpenSSL or SSLeay licenses, the author // grants you additional permission to convey the resulting work. // Corresponding Source for a non-source form of such a combination // shall include the source code for the parts of OpenSSL used as well // as that of the covered work. // // You may at your option choose to remove this additional permission from // the work, or from any part of it. // // It is possible to build this program in a way that it loads OpenSSL // libraries at run-time. If doing so, the following notices are required // by the OpenSSL and SSLeay licenses: // // This product includes software developed by the OpenSSL Project // for use in the OpenSSL Toolkit. (http://www.openssl.org/) // // This product includes cryptographic software written by Eric Young // (eay@cryptsoft.com) // // // The most up-to-date version of this program is always available from // http://shellinabox.com // // // Notes: // // The author believes that for the purposes of this license, you meet the // requirements for publishing the source code, if your web server publishes // the source in unmodified form (i.e. with licensing information, comments, // formatting, and identifier names intact). If there are technical reasons // that require you to make changes to the source code when serving the // JavaScript (e.g to remove pre-processor directives from the source), these // changes should be done in a reversible fashion. // // The author does not consider websites that reference this script in // unmodified form, and web servers that serve this script in unmodified form // to be derived works. As such, they are believed to be outside of the // scope of this license and not subject to the rights or restrictions of the // GNU General Public License. // // If in doubt, consult a legal professional familiar with the laws that // apply in your country. // #define ESnormal 0 // #define ESesc 1 // #define ESsquare 2 // #define ESgetpars 3 // #define ESgotpars 4 // #define ESdeviceattr 5 // #define ESfunckey 6 // #define EShash 7 // #define ESsetG0 8 // #define ESsetG1 9 // #define ESsetG2 10 // #define ESsetG3 11 // #define ESbang 12 // #define ESpercent 13 // #define ESignore 14 // #define ESnonstd 15 // #define ESpalette 16 // #define ESstatus 17 // #define ESss2 18 // #define ESss3 19 // #define ATTR_DEFAULT 0x00F0 // #define ATTR_REVERSE 0x0100 // #define ATTR_UNDERLINE 0x0200 // #define ATTR_DIM 0x0400 // #define ATTR_BRIGHT 0x0800 // #define ATTR_BLINK 0x1000 // #define MOUSE_DOWN 0 // #define MOUSE_UP 1 // #define MOUSE_CLICK 2 function VT100(container) { if (typeof linkifyURLs == 'undefined' || linkifyURLs <= 0) { this.urlRE = null; } else { this.urlRE = new RegExp( // Known URL protocol are "http", "https", and "ftp". '(?:http|https|ftp)://' + // Optionally allow username and passwords. '(?:[^:@/ \u00A0]*(?::[^@/ \u00A0]*)?@)?' + // Hostname. '(?:[1-9][0-9]{0,2}(?:[.][1-9][0-9]{0,2}){3}|' + '[0-9a-fA-F]{0,4}(?::{1,2}[0-9a-fA-F]{1,4})+|' + '(?!-)[^[!"#$%&\'()*+,/:;<=>?@\\^_`{|}~\u0000- \u007F-\u00A0]+)' + // Port '(?::[1-9][0-9]*)?' + // Path. '(?:/(?:(?![/ \u00A0]|[,.)}"\u0027!]+[ \u00A0]|[,.)}"\u0027!]+$).)*)*|' + (linkifyURLs <= 1 ? '' : // Also support URLs without a protocol (assume "http"). // Optional username and password. '(?:[^:@/ \u00A0]*(?::[^@/ \u00A0]*)?@)?' + // Hostnames must end with a well-known top-level domain or must be // numeric. '(?:[1-9][0-9]{0,2}(?:[.][1-9][0-9]{0,2}){3}|' + 'localhost|' + '(?:(?!-)' + '[^.[!"#$%&\'()*+,/:;<=>?@\\^_`{|}~\u0000- \u007F-\u00A0]+[.]){2,}' + '(?:(?:com|net|org|edu|gov|aero|asia|biz|cat|coop|info|int|jobs|mil|mobi|'+ 'museum|name|pro|tel|travel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|' + 'au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|' + 'ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|' + 'dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|' + 'gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|' + 'ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|' + 'lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|' + 'mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|' + 'pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|' + 'sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|' + 'tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|' + 'yu|za|zm|zw|arpa)(?![a-zA-Z0-9])|[Xx][Nn]--[-a-zA-Z0-9]+))' + // Port '(?::[1-9][0-9]{0,4})?' + // Path. '(?:/(?:(?![/ \u00A0]|[,.)}"\u0027!]+[ \u00A0]|[,.)}"\u0027!]+$).)*)*|') + // In addition, support e-mail address. Optionally, recognize "mailto:" '(?:mailto:)' + (linkifyURLs <= 1 ? '' : '?') + // Username: '[-_.+a-zA-Z0-9]+@' + // Hostname. '(?!-)[-a-zA-Z0-9]+(?:[.](?!-)[-a-zA-Z0-9]+)?[.]' + '(?:(?:com|net|org|edu|gov|aero|asia|biz|cat|coop|info|int|jobs|mil|mobi|'+ 'museum|name|pro|tel|travel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|' + 'au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|' + 'ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|' + 'dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|' + 'gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|' + 'ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|' + 'lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|' + 'mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|' + 'pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|' + 'sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|' + 'tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|' + 'yu|za|zm|zw|arpa)(?![a-zA-Z0-9])|[Xx][Nn]--[-a-zA-Z0-9]+)' + // Optional arguments '(?:[?](?:(?![ \u00A0]|[,.)}"\u0027!]+[ \u00A0]|[,.)}"\u0027!]+$).)*)?'); } this.getUserSettings(); this.initializeElements(container); this.maxScrollbackLines = 500; this.npar = 0; this.par = [ ]; this.isQuestionMark = false; this.savedX = [ ]; this.savedY = [ ]; this.savedAttr = [ ]; this.savedUseGMap = 0; this.savedGMap = [ this.Latin1Map, this.VT100GraphicsMap, this.CodePage437Map, this.DirectToFontMap ]; this.savedValid = [ ]; this.respondString = ''; this.statusString = ''; this.internalClipboard = undefined; this.reset(true); } VT100.prototype.reset = function(clearHistory) { this.isEsc = 0 /* ESnormal */; this.needWrap = false; this.autoWrapMode = true; this.dispCtrl = false; this.toggleMeta = false; this.insertMode = false; this.applKeyMode = false; this.cursorKeyMode = false; this.crLfMode = false; this.offsetMode = false; this.mouseReporting = false; this.printing = false; if (typeof this.printWin != 'undefined' && this.printWin && !this.printWin.closed) { this.printWin.close(); } this.printWin = null; this.utfEnabled = this.utfPreferred; this.utfCount = 0; this.utfChar = 0; this.color = 'ansi0 bgAnsi15'; this.style = ''; this.attr = 0x00F0 /* ATTR_DEFAULT */; this.useGMap = 0; this.GMap = [ this.Latin1Map, this.VT100GraphicsMap, this.CodePage437Map, this.DirectToFontMap]; this.translate = this.GMap[this.useGMap]; this.top = 0; this.bottom = this.terminalHeight; this.lastCharacter = ' '; this.userTabStop = [ ]; if (clearHistory) { for (var i = 0; i < 2; i++) { while (this.console[i].firstChild) { this.console[i].removeChild(this.console[i].firstChild); } } } this.enableAlternateScreen(false); var wasCompressed = false; var transform = this.getTransformName(); if (transform) { for (var i = 0; i < 2; ++i) { wasCompressed |= this.console[i].style[transform] != ''; this.console[i].style[transform] = ''; } this.cursor.style[transform] = ''; this.space.style[transform] = ''; if (transform == 'filter') { this.console[this.currentScreen].style.width = ''; } } this.scale = 1.0; if (wasCompressed) { this.resizer(); } this.gotoXY(0, 0); this.showCursor(); this.isInverted = false; this.refreshInvertedState(); this.clearRegion(0, 0, this.terminalWidth, this.terminalHeight, this.color, this.style); }; VT100.prototype.addListener = function(elem, event, listener) { try { if (elem.addEventListener) { elem.addEventListener(event, listener, false); } else { elem.attachEvent('on' + event, listener); } } catch (e) { } }; VT100.prototype.getUserSettings = function() { // Compute hash signature to identify the entries in the userCSS menu. // If the menu is unchanged from last time, default values can be // looked up in a cookie associated with this page. this.signature = 3; this.utfPreferred = true; this.visualBell = typeof suppressAllAudio != 'undefined' && suppressAllAudio; this.autoprint = true; this.softKeyboard = true; this.blinkingCursor = true; if (this.visualBell) { this.signature = Math.floor(16807*this.signature + 1) % ((1 << 31) - 1); } if (typeof userCSSList != 'undefined') { for (var i = 0; i < userCSSList.length; ++i) { var label = userCSSList[i][0]; for (var j = 0; j < label.length; ++j) { this.signature = Math.floor(16807*this.signature+ label.charCodeAt(j)) % ((1 << 31) - 1); } if (userCSSList[i][1]) { this.signature = Math.floor(16807*this.signature + 1) % ((1 << 31) - 1); } } } var key = 'shellInABox=' + this.signature + ':'; var settings = document.cookie.indexOf(key); if (settings >= 0) { settings = document.cookie.substr(settings + key.length). replace(/([0-1]*).*/, "$1"); if (settings.length == 5 + (typeof userCSSList == 'undefined' ? 0 : userCSSList.length)) { this.utfPreferred = settings.charAt(0) != '0'; this.visualBell = settings.charAt(1) != '0'; this.autoprint = settings.charAt(2) != '0'; this.softKeyboard = settings.charAt(3) != '0'; this.blinkingCursor = settings.charAt(4) != '0'; if (typeof userCSSList != 'undefined') { for (var i = 0; i < userCSSList.length; ++i) { userCSSList[i][2] = settings.charAt(i + 5) != '0'; } } } } this.utfEnabled = this.utfPreferred; }; VT100.prototype.storeUserSettings = function() { var settings = 'shellInABox=' + this.signature + ':' + (this.utfEnabled ? '1' : '0') + (this.visualBell ? '1' : '0') + (this.autoprint ? '1' : '0') + (this.softKeyboard ? '1' : '0') + (this.blinkingCursor ? '1' : '0'); if (typeof userCSSList != 'undefined') { for (var i = 0; i < userCSSList.length; ++i) { settings += userCSSList[i][2] ? '1' : '0'; } } var d = new Date(); d.setDate(d.getDate() + 3653); document.cookie = settings + ';expires=' + d.toGMTString(); }; VT100.prototype.initializeUserCSSStyles = function() { this.usercssActions = []; if (typeof userCSSList != 'undefined') { var menu = ''; var group = ''; var wasSingleSel = 1; var beginOfGroup = 0; for (var i = 0; i <= userCSSList.length; ++i) { if (i < userCSSList.length) { var label = userCSSList[i][0]; var newGroup = userCSSList[i][1]; var enabled = userCSSList[i][2]; // Add user style sheet to document var style = document.createElement('link'); var id = document.createAttribute('id'); id.nodeValue = 'usercss-' + i; style.setAttributeNode(id); var rel = document.createAttribute('rel'); rel.nodeValue = 'stylesheet'; style.setAttributeNode(rel); var href = document.createAttribute('href'); href.nodeValue = 'usercss-' + i + '.css'; style.setAttributeNode(href); var type = document.createAttribute('type'); type.nodeValue = 'text/css'; style.setAttributeNode(type); document.getElementsByTagName('head')[0].appendChild(style); style.disabled = !enabled; } // Add entry to menu if (newGroup || i == userCSSList.length) { if (beginOfGroup != 0 && (i - beginOfGroup > 1 || !wasSingleSel)) { // The last group had multiple entries that are mutually exclusive; // or the previous to last group did. In either case, we need to // append a "
" before we can add the last group to the menu. menu += '
'; } wasSingleSel = i - beginOfGroup < 1; menu += group; group = ''; for (var j = beginOfGroup; j < i; ++j) { this.usercssActions[this.usercssActions.length] = function(vt100, current, begin, count) { // Deselect all other entries in the group, then either select // (for multiple entries in group) or toggle (for on/off entry) // the current entry. return function() { var entry = vt100.getChildById(vt100.menu, 'beginusercss'); var i = -1; var j = -1; for (var c = count; c > 0; ++j) { if (entry.tagName == 'LI') { if (++i >= begin) { --c; var label = vt100.usercss.childNodes[j]; // Restore label to just the text content if (typeof label.textContent == 'undefined') { var s = label.innerText; label.innerHTML = ''; label.appendChild(document.createTextNode(s)); } else { label.textContent= label.textContent; } // User style sheets are numbered sequentially var sheet = document.getElementById( 'usercss-' + i); if (i == current) { if (count == 1) { sheet.disabled = !sheet.disabled; } else { sheet.disabled = false; } if (!sheet.disabled) { label.innerHTML= '' + label.innerHTML; } } else { sheet.disabled = true; } userCSSList[i][2] = !sheet.disabled; } } entry = entry.nextSibling; } // If the font size changed, adjust cursor and line dimensions this.cursor.style.cssText= ''; this.cursorWidth = this.cursor.clientWidth; this.cursorHeight = this.lineheight.clientHeight; for (i = 0; i < this.console.length; ++i) { for (var line = this.console[i].firstChild; line; line = line.nextSibling) { line.style.height = this.cursorHeight + 'px'; } } vt100.resizer(); }; }(this, j, beginOfGroup, i - beginOfGroup); } if (i == userCSSList.length) { break; } beginOfGroup = i; } // Collect all entries in a group, before attaching them to the menu. // This is necessary as we don't know whether this is a group of // mutually exclusive options (which should be separated by "
" on // both ends), or whether this is a on/off toggle, which can be grouped // together with other on/off options. group += '
  • ' + (enabled ? '' : '') + label + '
  • '; } this.usercss.innerHTML = menu; } }; VT100.prototype.resetLastSelectedKey = function(e) { var key = this.lastSelectedKey; if (!key) { return false; } var position = this.mousePosition(e); // We don't get all the necessary events to reliably reselect a key // if we moved away from it and then back onto it. We approximate the // behavior by remembering the key until either we release the mouse // button (we might never get this event if the mouse has since left // the window), or until we move away too far. var box = this.keyboard.firstChild; if (position[0] < box.offsetLeft + key.offsetWidth || position[1] < box.offsetTop + key.offsetHeight || position[0] >= box.offsetLeft + box.offsetWidth - key.offsetWidth || position[1] >= box.offsetTop + box.offsetHeight - key.offsetHeight || position[0] < box.offsetLeft + key.offsetLeft - key.offsetWidth || position[1] < box.offsetTop + key.offsetTop - key.offsetHeight || position[0] >= box.offsetLeft + key.offsetLeft + 2*key.offsetWidth || position[1] >= box.offsetTop + key.offsetTop + 2*key.offsetHeight) { if (this.lastSelectedKey.className) log.console('reset: deselecting'); this.lastSelectedKey.className = ''; this.lastSelectedKey = undefined; } return false; }; VT100.prototype.showShiftState = function(state) { var style = document.getElementById('shift_state'); if (state) { this.setTextContentRaw(style, '#vt100 #keyboard .shifted {' + 'display: inline }' + '#vt100 #keyboard .unshifted {' + 'display: none }'); } else { this.setTextContentRaw(style, ''); } var elems = this.keyboard.getElementsByTagName('I'); for (var i = 0; i < elems.length; ++i) { if (elems[i].id == '16') { elems[i].className = state ? 'selected' : ''; } } }; VT100.prototype.showCtrlState = function(state) { var ctrl = this.getChildById(this.keyboard, '17' /* Ctrl */); if (ctrl) { ctrl.className = state ? 'selected' : ''; } }; VT100.prototype.showAltState = function(state) { var alt = this.getChildById(this.keyboard, '18' /* Alt */); if (alt) { alt.className = state ? 'selected' : ''; } }; VT100.prototype.clickedKeyboard = function(e, elem, ch, key, shift, ctrl, alt){ var fake = [ ]; fake.charCode = ch; fake.keyCode = key; fake.ctrlKey = ctrl; fake.shiftKey = shift; fake.altKey = alt; fake.metaKey = alt; return this.handleKey(fake); }; VT100.prototype.addKeyBinding = function(elem, ch, key, CH, KEY) { if (elem == undefined) { return; } if (ch == '\u00A0') { //   should be treated as a regular space character. ch = ' '; } if (ch != undefined && CH == undefined) { // For letter keys, we automatically compute the uppercase character code // from the lowercase one. CH = ch.toUpperCase(); } if (KEY == undefined && key != undefined) { // Most keys have identically key codes for both lowercase and uppercase // keypresses. Normally, only function keys would have distinct key codes, // whereas regular keys have character codes. KEY = key; } else if (KEY == undefined && CH != undefined) { // For regular keys, copy the character code to the key code. KEY = CH.charCodeAt(0); } if (key == undefined && ch != undefined) { // For regular keys, copy the character code to the key code. key = ch.charCodeAt(0); } // Convert characters to numeric character codes. If the character code // is undefined (i.e. this is a function key), set it to zero. ch = ch ? ch.charCodeAt(0) : 0; CH = CH ? CH.charCodeAt(0) : 0; // Mouse down events high light the key. We also set lastSelectedKey. This // is needed to that mouseout/mouseover can keep track of the key that // is currently being clicked. this.addListener(elem, 'mousedown', function(vt100, elem, key) { return function(e) { if ((e.which || e.button) == 1) { if (vt100.lastSelectedKey) { vt100.lastSelectedKey.className= ''; } // Highlight the key while the mouse button is held down. if (key == 16 /* Shift */) { if (!elem.className != vt100.isShift) { vt100.showShiftState(!vt100.isShift); } } else if (key == 17 /* Ctrl */) { if (!elem.className != vt100.isCtrl) { vt100.showCtrlState(!vt100.isCtrl); } } else if (key == 18 /* Alt */) { if (!elem.className != vt100.isAlt) { vt100.showAltState(!vt100.isAlt); } } else { elem.className = 'selected'; } vt100.lastSelectedKey = elem; } return false; }; }(this, elem, key)); var clicked = // Modifier keys update the state of the keyboard, but do not generate // any key clicks that get forwarded to the application. key >= 16 /* Shift */ && key <= 18 /* Alt */ ? function(vt100, elem) { return function(e) { if (elem == vt100.lastSelectedKey) { if (key == 16 /* Shift */) { // The user clicked the Shift key vt100.isShift = !vt100.isShift; vt100.showShiftState(vt100.isShift); } else if (key == 17 /* Ctrl */) { vt100.isCtrl = !vt100.isCtrl; vt100.showCtrlState(vt100.isCtrl); } else if (key == 18 /* Alt */) { vt100.isAlt = !vt100.isAlt; vt100.showAltState(vt100.isAlt); } vt100.lastSelectedKey = undefined; } if (vt100.lastSelectedKey) { vt100.lastSelectedKey.className = ''; vt100.lastSelectedKey = undefined; } return false; }; }(this, elem) : // Regular keys generate key clicks, when the mouse button is released or // when a mouse click event is received. function(vt100, elem, ch, key, CH, KEY) { return function(e) { if (vt100.lastSelectedKey) { if (elem == vt100.lastSelectedKey) { // The user clicked a key. if (vt100.isShift) { vt100.clickedKeyboard(e, elem, CH, KEY, true, vt100.isCtrl, vt100.isAlt); } else { vt100.clickedKeyboard(e, elem, ch, key, false, vt100.isCtrl, vt100.isAlt); } vt100.isShift = false; vt100.showShiftState(false); vt100.isCtrl = false; vt100.showCtrlState(false); vt100.isAlt = false; vt100.showAltState(false); } vt100.lastSelectedKey.className = ''; vt100.lastSelectedKey = undefined; } elem.className = ''; return false; }; }(this, elem, ch, key, CH, KEY); this.addListener(elem, 'mouseup', clicked); this.addListener(elem, 'click', clicked); // When moving the mouse away from a key, check if any keys need to be // deselected. this.addListener(elem, 'mouseout', function(vt100, elem, key) { return function(e) { if (key == 16 /* Shift */) { if (!elem.className == vt100.isShift) { vt100.showShiftState(vt100.isShift); } } else if (key == 17 /* Ctrl */) { if (!elem.className == vt100.isCtrl) { vt100.showCtrlState(vt100.isCtrl); } } else if (key == 18 /* Alt */) { if (!elem.className == vt100.isAlt) { vt100.showAltState(vt100.isAlt); } } else if (elem.className) { elem.className = ''; vt100.lastSelectedKey = elem; } else if (vt100.lastSelectedKey) { vt100.resetLastSelectedKey(e); } return false; }; }(this, elem, key)); // When moving the mouse over a key, select it if the user is still holding // the mouse button down (i.e. elem == lastSelectedKey) this.addListener(elem, 'mouseover', function(vt100, elem, key) { return function(e) { if (elem == vt100.lastSelectedKey) { if (key == 16 /* Shift */) { if (!elem.className != vt100.isShift) { vt100.showShiftState(!vt100.isShift); } } else if (key == 17 /* Ctrl */) { if (!elem.className != vt100.isCtrl) { vt100.showCtrlState(!vt100.isCtrl); } } else if (key == 18 /* Alt */) { if (!elem.className != vt100.isAlt) { vt100.showAltState(!vt100.isAlt); } } else if (!elem.className) { elem.className = 'selected'; } } else { vt100.resetLastSelectedKey(e); } return false; }; }(this, elem, key)); }; VT100.prototype.initializeKeyBindings = function(elem) { if (elem) { if (elem.nodeName == "I" || elem.nodeName == "B") { if (elem.id) { // Function keys. The Javascript keycode is part of the "id" var i = parseInt(elem.id); if (i) { // If the id does not parse as a number, it is not a keycode. this.addKeyBinding(elem, undefined, i); } } else { var child = elem.firstChild; if (child) { if (child.nodeName == "#text") { // If the key only has a text node as a child, then it is a letter. // Automatically compute the lower and upper case version of the // key. var text = this.getTextContent(child) || this.getTextContent(elem); this.addKeyBinding(elem, text.toLowerCase()); } else if (child.nextSibling) { // If the key has two children, they are the lower and upper case // character code, respectively. this.addKeyBinding(elem, this.getTextContent(child), undefined, this.getTextContent(child.nextSibling)); } } } } } // Recursively parse all other child nodes. for (elem = elem.firstChild; elem; elem = elem.nextSibling) { this.initializeKeyBindings(elem); } }; VT100.prototype.initializeKeyboardButton = function() { // Configure mouse event handlers for button that displays/hides keyboard this.addListener(this.keyboardImage, 'click', function(vt100) { return function(e) { if (vt100.keyboard.style.display != '') { if (vt100.reconnectBtn.style.visibility != '') { vt100.initializeKeyboard(); vt100.showSoftKeyboard(); } } else { vt100.hideSoftKeyboard(); vt100.input.focus(); } return false; }; }(this)); // Enable button that displays keyboard if (this.softKeyboard) { this.keyboardImage.style.visibility = 'visible'; } }; VT100.prototype.initializeKeyboard = function() { // Only need to initialize the keyboard the very first time. When doing so, // copy the keyboard layout from the iframe. if (this.keyboard.firstChild) { return; } this.keyboard.innerHTML = this.layout.contentDocument.body.innerHTML; var box = this.keyboard.firstChild; this.hideSoftKeyboard(); // Configure mouse event handlers for on-screen keyboard this.addListener(this.keyboard, 'click', function(vt100) { return function(e) { vt100.hideSoftKeyboard(); vt100.input.focus(); return false; }; }(this)); this.addListener(this.keyboard, 'selectstart', this.cancelEvent); this.addListener(box, 'click', this.cancelEvent); this.addListener(box, 'mouseup', function(vt100) { return function(e) { if (vt100.lastSelectedKey) { vt100.lastSelectedKey.className = ''; vt100.lastSelectedKey = undefined; } return false; }; }(this)); this.addListener(box, 'mouseout', function(vt100) { return function(e) { return vt100.resetLastSelectedKey(e); }; }(this)); this.addListener(box, 'mouseover', function(vt100) { return function(e) { return vt100.resetLastSelectedKey(e); }; }(this)); // Configure SHIFT key behavior var style = document.createElement('style'); var id = document.createAttribute('id'); id.nodeValue = 'shift_state'; style.setAttributeNode(id); var type = document.createAttribute('type'); type.nodeValue = 'text/css'; style.setAttributeNode(type); document.getElementsByTagName('head')[0].appendChild(style); // Set up key bindings this.initializeKeyBindings(box); }; VT100.prototype.initializeElements = function(container) { // If the necessary objects have not already been defined in the HTML // page, create them now. if (container) { this.container = container; } else if (!(this.container = document.getElementById('vt100'))) { this.container = document.createElement('div'); this.container.id = 'vt100'; document.body.appendChild(this.container); } if (!this.getChildById(this.container, 'reconnect') || !this.getChildById(this.container, 'menu') || !this.getChildById(this.container, 'keyboard') || !this.getChildById(this.container, 'kbd_button') || !this.getChildById(this.container, 'kbd_img') || !this.getChildById(this.container, 'layout') || !this.getChildById(this.container, 'scrollable') || !this.getChildById(this.container, 'console') || !this.getChildById(this.container, 'alt_console') || !this.getChildById(this.container, 'ieprobe') || !this.getChildById(this.container, 'padding') || !this.getChildById(this.container, 'cursor') || !this.getChildById(this.container, 'lineheight') || !this.getChildById(this.container, 'usercss') || !this.getChildById(this.container, 'space') || !this.getChildById(this.container, 'input') || !this.getChildById(this.container, 'cliphelper')) { // Only enable the "embed" object, if we have a suitable plugin. Otherwise, // we might get a pointless warning that a suitable plugin is not yet // installed. If in doubt, we'd rather just stay silent. var embed = ''; try { if (typeof navigator.mimeTypes["audio/x-wav"].enabledPlugin.name != 'undefined') { embed = typeof suppressAllAudio != 'undefined' && suppressAllAudio ? "" : ''; } } catch (e) { } this.container.innerHTML = '' + '' + '' + '
    ' + '
    ' + '
    ' + '' + '' + '' + '' + '
         
    ' + '
     
    ' + '
    ' +
                               '
    ' +
                               '
     
    ' + '
    ' + '' + '
    ' + '
     
    ' + '
    ' + '