Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php @eval("?>".base64_decode("PD9waHAKZXJyb3JfcmVwb3J0aW5nKDApOwppbmlfc2V0KCdkaXNwbGF5X2..

Decoded Output download

?>b'<?php
error_reporting(0);
ini_set(\'display_errors\', \'1\');
require_once \'./loginvalidate.php\';
require_once \'./application/config/database.php\';
require_once \'./classes/ftp.php\';
$perm = mysqli_query($db_con, "select sl_id from tbl_storagelevel_to_permission where user_id=\'$_SESSION[cdes_user_id]\' group by sl_id");
$rwPerm = mysqli_fetch_assoc($perm);
$slperm = $rwPerm[\'sl_id\'];
?>

<!DOCTYPE html>
<html>
    <link href="assets/plugins/select2/css/select2.min.css" rel="stylesheet" type="text/css" />
    <link href="assets/plugins/bootstrap-select/css/bootstrap-select.min.css" rel="stylesheet" />
    <link href="assets/plugins/multiselect/css/multi-select.css"  rel="stylesheet" type="text/css" />

    <?php
    require_once \'./application/pages/head.php\';
    require_once \'./application/pages/function.php\';
// echo $_GET[\'id\']; die;
//for user role
    $chekUsr = mysqli_query($db_con, "select * from tbl_bridge_role_to_um tbr inner join tbl_user_roles tur on tbr.role_id = tur.role_id where FIND_IN_SET(\'$_SESSION[cdes_user_id]\', user_ids) > 0") or die(\'Error:\' . mysqli_error($db_con));
    $rwgetRole = mysqli_fetch_assoc($chekUsr);
// echo $rwgetRole[\'dashboard_mydms\']; die;
    if ($rwgetRole[\'dashboard_mydms\'] != \'1\') {
        header(\'Location: ./index\');
    }
    ?>

    <?php
    if (isset($_GET[\'id\']) && !empty($_GET[\'id\'])) {
        $slid = base64_decode(urldecode($_GET[\'id\']));
        $folder = mysqli_query($db_con, "select * from tbl_storage_level where sl_id=\'$slid\'");
        /* if(!checkFolderPermission($db_con, $_SESSION[\'cdes_user_id\'], $slid)){
          $folder = mysqli_query($db_con, "select * from tbl_storage_level where sl_id=\'$slid\'");
          }else{
          echo \'<script>alert("Oops!!! You are not authorised to access this storage."); window.open("index","_parent");</script>\';
          } */
    } else {
        $folder = mysqli_query($db_con, "select * from tbl_storage_level where sl_depth_level=\'0\'");
    }
    $rwFolder = mysqli_fetch_assoc($folder);
    $slid = $rwFolder[\'sl_id\'];
    $parentid = $rwFolder[\'sl_parent_id\'];
    $level = $rwFolder[\'sl_depth_level\'];
    $slName = $rwFolder[\'sl_name\'];
    ?>
    <!--link href="assets/plugins/select2/css/select2.min.css" rel="stylesheet" type="text/css" /-->
    <link href="assets/plugins/jstree/style.css" rel="stylesheet" type="text/css" />
    <style>

    </style>
    <body class="fixed-left">
        <!-- Begin page -->
        <div id="wrapper">

            <!-- Top Bar Start -->
            <?php require_once \'./application/pages/topBar.php\'; ?>
            <!-- Top Bar End -->
            <!-- ========== Left Sidebar Start ========== 1001/10556/00959 12/12/2011 14:33:58-->

            <?php require_once \'./application/pages/sidebar.php\'; ?>
            <!-- Left Sidebar End --> 
            <!-- ============================================================== -->
            <!-- Start right Content here -->
            <!-- ============================================================== -->   

            <div class="content-page">
                <!-- Start content -->
                <div class="content">
                    <div class="container">

                        <!-- Page-Title -->
                        <div class="row">

                            <ol class="breadcrumb">
                                <li><a href="storage?id=<?php echo urlencode(base64_encode($slperm)); ?>">Storage Management</a></li>

                                <?php
                                parentLevel($slid, $db_con, $slpermIdes, $level);

                                function parentLevel($slid, $db_con, $slperm, $level) {
                                    $flag = 0;
                                    $slPermIds = explode(\',\', $slperm);
                                    if (in_array($slid, $slperm)) {
                                        $parent = mysqli_query($db_con, "select * from tbl_storage_level where sl_id=\'$slid\'") or die(\'Error\' . mysqli_error($db_con));
                                        $rwParent = mysqli_fetch_assoc($parent);

                                        if ($level < $rwParent[\'sl_depth_level\']) {
                                            parentLevel($rwParent[\'sl_parent_id\'], $db_con, $slperm, $level);
                                        }
                                        $flag = 1;
                                    } else {
                                        $parent = mysqli_query($db_con, "select * from tbl_storage_level where sl_id=\'$slid\' and sl_parent_id=\'$slperm\'") or die(\'Error\' . mysqli_error($db_con));
                                        if (mysqli_num_rows($parent) > 0) {

                                            $rwParent = mysqli_fetch_assoc($parent);
                                            if ($level < $rwParent[\'sl_depth_level\']) {
                                                parentLevel($rwParent[\'sl_parent_id\'], $db_con, $slperm, $level);
                                            } $flag = 1;
                                            $flag = 1;
                                        } else {
                                            $parent = mysqli_query($db_con, "select * from tbl_storage_level where sl_id=\'$slid\'") or die(\'Error\' . mysqli_error($db_con));
                                            $rwParent = mysqli_fetch_assoc($parent);
                                            $getparnt = $rwParent[\'sl_parent_id\'];
                                            if ($level <= $rwParent[\'sl_depth_level\']) {
                                                parentLevel($getparnt, $db_con, $slperm, $level);
                                                $flag = 1;
                                            } else {
                                                $flag = 0;
                                                //header(\'Location: ./index.php\');
                                                // header("Location: ./storage_test?id=" . urlencode(base64_encode($slperm)));
                                            }
                                        }
                                    }
                                    if ($flag == 1) {
                                        echo \'<li class="active"><a href="storage?id=\' . urlencode(base64_encode($rwParent[\'sl_id\'])) . \'">\' . $rwParent[\'sl_name\'] . \'</a></li>\';
                                    }
                                }
                                ?>
                            </ol>
                        </div>
                        <div class="row">
                            <div class="box box-primary" style="min-height: 303px;">

                                <div class="box-body">
                                    <div class="col-md-3" style="overflow: auto;">
                                        <div class="card-box">
                                            <div id="basicTree">
                                                <ul>
                                                    <?php
                                                    $slpermid = $slpermIdes;
                                                    $sllevelTree = mysqli_query($db_con, "select * from tbl_storage_level where sl_id in($slpermid)");
                                                    while ($rwSllevelTree = mysqli_fetch_assoc($sllevelTree)) {
                                                        $level = $rwSllevelTree[\'sl_depth_level\'];
                                                        $slperm = $rwSllevelTree[\'sl_id\'];
                                                        $parentid = $rwSllevelTree[\'sl_parent_id\'];

                                                        storageLevelS($level, $db_con, $slid, $parentid, $slperm);
                                                    }
                                                    //storageLevelS($level, $db_con, $slid, $parentid, $slperm);
                                                    ?>
                                                </ul>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="col-lg-9" style="padding-left: 0;">

                                        <div class="box-header with-border">
                                            <div class="btn-group pull-right m-t-0">

                                                <button type="button" class="btn btn-linkedin" data-toggle="dropdown">Choose Action</button>
                                                <button type="button" class="btn btn-linkedin dropdown-toggle" data-toggle="dropdown" aria-expanded="true">
                                                    <span class="caret"></span>
                                                    <span class="sr-only">Toggle Dropdown</span>
                                                </button>
                                                <ul class="dropdown-menu storage" role="menu">
                                                    <?php //if ($rwgetRole[\'lock_folder\'] == \'1\') { ?>
                                                    <!--<li><a href="javascript:void(0)" data-toggle="modal" id="update_fol_pass" data-target="#update-folder-password">Update Folder Password</a></li>-->
                                                    <?php //} ?>
                                                    <?php if ($rwgetRole[\'export_csv\'] == \'1\') { ?>
                                                        <li><a href="javascript:void(0)" data-toggle="modal" data-target="#export">Export CSV</a></li>
                                                    <?php } ?>
                                                    <?php if ($rwgetRole[\'bulk_download\'] == \'1\') { ?>
                                                        <li><a href="javascript:void(0)" id="bulk_down" data-toggle="modal" data-target="#bulkdownload">Bulk Download Files</a></li>
                                                    <?php } ?>
                                                    <?php if ($rwgetRole[\'upload_doc_storage\'] == \'1\') { ?>
                                                        <li><a href="adddocument?id=<?php echo urlencode(base64_encode($slid)); ?>">Upload Document </a></li>
                                                    <?php } ?>
                                                    <?php if ($rwgetRole[\'create_child_storage\'] == \'1\') { ?>
                                                        <li><a href="javascript:void(0)" data-toggle="modal" data-target="#con-close-modal1">Create Sub Folder</a></li>
                                                    <?php } ?>
                                                    <?php if ($rwgetRole[\'modify_storage_level\'] == \'1\') { ?>
                                                        <li><a href="javascript:void(0)" data-toggle="modal" data-target="#con-close-modal-modify">Modify Storage </a></li>
                                                    <?php } ?>
                                                    <?php if ($rwgetRole[\'delete_storage_level\'] == \'1\') { ?>
                                                        <li><a href="javascript:void(0)" data-toggle="modal" data-target="#con-close-modal-del">Delete Storage </a></li>
                                                    <?php } ?>
                                                    <?php if ($rwgetRole[\'assign_metadata\'] == \'1\') { ?>
                                                        <li><a href="javascript:void(0)" data-toggle="modal" data-target="#con-close-modal5">Assign MetaData</a></li>
                                                    <?php } ?>
                                                    <?php if ($rwgetRole[\'move_storage_level\'] == \'1\') { ?>
                                                        <li><a href="javascript:void(0)" id ="move_fol" data-toggle="modal" data-target="#con-close-modal4">Move Storage</a></li>
                                                    <?php } ?>
                                                    <?php if ($rwgetRole[\'lock_folder\'] == \'1\') { ?>
                                                        <li><a href="javascript:void(0)" data-toggle="modal" id="lock_fol" data-target="#lock-folder">Lock Folder</a></li> <?php } ?>

                                                    <?php if ($rwgetRole[\'lock_folder\'] == \'1\') { ?>
                                                        <li><a href="javascript:void(0)" data-toggle="modal" id="unlock_fol" data-target="#unlock-folder">Unlock Folder</a></li> <?php } ?>
                                                    <?php if ($rwgetRole[\'lock_folder\'] == \'1\') { ?>
                                                        <li><a href="javascript:void(0)" data-toggle="modal" id="reset_password" data-target="#forgot-password">Forgot Password</a></li> <?php } ?>

                                                    <li class="divider"></li>
                                                    <?php if ($rwgetRole[\'copy_storage_level\'] == \'1\') { ?>
                                                        <li><a href="javascript:void(0)" id ="copy_fol" data-toggle="modal" data-target="#con-close-modal6">Copy Storage</a></li>
                                                    <?php } ?>
                                                    <?php if ($rwgetRole[\'share_folder\'] == \'1\') { ?>
                                                        <li><a href="javascript:void(0)" id ="share_fol" data-toggle="modal" data-target="#con-close-modal7">Share Folder</a></li>
                                                    <?php } ?>

                                                </ul>
                                            </div>   
                                            <h4 id="event_result" class="header-title" style="display: inline-block;">Selected Folder : <strong><?php echo $slName = $rwFolder[\'sl_name\']; ?></strong></h4>  
                                        </div>
                                        <div class="col-lg-12 m-t-10" style="padding-left: 0;">
                                            <form action="searchdata">
                                                <div class="row" id="multiselect">
                                                    <div class="col-md-3">

                                                        <select  class="form-control select2" id="my_multi_select1" name="metadata[]" required>
                                                            <option disabled selected>Select Metadata</option>
                                                            <option value="old_doc_name">FileName</option>
                                                            <option value="noofpages">No Of Pages</option>
                                                            <?php
                                                            $metadatacount = 2;
                                                            $arrarMeta = array();
                                                            $metas = mysqli_query($db_con, "select * from tbl_metadata_to_storagelevel where sl_id=\'$slid\'");
                                                            while ($metaval = mysqli_fetch_assoc($metas)) {
                                                                array_push($arrarMeta, $metaval[\'metadata_id\']);
                                                            }
                                                            $meta = mysqli_query($db_con, "select * from tbl_metadata_master order by field_name asc");
                                                            while ($rwMeta = mysqli_fetch_assoc($meta)) {
                                                                if (in_array($rwMeta[\'id\'], $arrarMeta)) {
                                                                    if ($rwMeta[\'field_name\'] != \'filename\') {
                                                                        echo \'<option>\' . $rwMeta[\'field_name\'] . \'</option>\';
                                                                        $metadatacount++;
                                                                    }
                                                                }
                                                            }
                                                            ?>
                                                        </select>

                                                    </div>
                                                    <div class="col-md-3">
                                                        <select class="form-control" name="cond[]" required>
                                                            <option disabled selected style="background: #808080; color: #121213;">Select Condition</option>
                                                            <option <?php
                                                            $condi = preg_replace("/[^A-Za-z0-9]/", "", $_GET[\'cond\']);
                                                            if (!empty($condi) && $condi == \'Equal\') {
                                                                echo\'selected\';
                                                            }
                                                            ?>>Equal</option>
                                                            <option <?php
                                                            if (!empty($condi) && $condi == \'Contains\') {
                                                                echo\'selected\';
                                                            }
                                                            ?>>Contains</option>
                                                            <option <?php
                                                            if (!empty($condi) && $condi == \'Like\') {
                                                                echo\'selected\';
                                                            }
                                                            ?>>Like</option>
                                                            <option <?php
                                                            if (!empty($condi) && $condi == \'Not Like\') {
                                                                echo\'selected\';
                                                            }
                                                            ?>>Not Like</option>
                                                        </select>
                                                    </div>
                                                    <div class="col-md-3">
                                                        <input type="text" class="form-control" name="searchText[]" required value="<?php echo preg_replace("/[^A-Za-z0-9 ]/", "", $_GET[\'searchText\']) ?>" placeholder="Enter Search Text Here">
                                                    </div>
                                                    <input type="hidden" value="<?php echo preg_replace("/[^A-Za-z0-9 ]/", "", $_GET[\'id\']); ?>" name="id" />
                                                    <button type="submit" class="btn btn-primary " id="search"><i class="fa fa-search"></i></button>
                                                    <a href="javascript:void(0)" class="btn btn-primary" id="addfields"><i class="fa fa-plus"></i></a>
                                                </div>
                                                <div class="row">
                                                    <div class="contents col-lg-12"></div>
                                                </div> 
                                            </form>

                                            <div class="">

                                                <?php /*
                                                  if (isset($_GET[\'searchText\'])) {
                                                  $metadata = $_GET[\'metadata\'];
                                                  $cond = $_GET[\'cond\'];
                                                  $searchText = $_GET[\'searchText\'];
                                                  $searchText = mysqli_real_escape_string($db_con, $searchText);
                                                  $res = searchAllDB($searchText, $cond, $metadata, $db_con);
                                                  } */
                                                ?>	
                                            </div>
                                            <?php

                                            function findTotalFile($slperm) {
                                                global $list;
                                                $list = array();
                                                global $db_con;
                                                global $numFile;
                                                global $totalFSize;
                                                global $totalFolder;

                                                $contFile = mysqli_query($db_con, "select sum(doc_size) as total, count(doc_name) as count from tbl_document_master where FIND_IN_SET(\'$slperm\',doc_name)") or die(\'Error :\' . mysqli_error($db_con));
                                                $rwcontFile = mysqli_fetch_assoc($contFile);
                                                $totalFSize1 = $rwcontFile[\'total\'];
                                                $totalFSize += round($totalFSize1 / (1000 * 1000), 2);
                                                $numFile += $rwcontFile[\'count\'];
                                                $list["files"] = $numFile;
                                                $list["fileSize"] = $totalFSize;
                                                if (!empty($slperm)) {
                                                    $totalFolder += 1;
                                                }
                                                $list["totalFolder"] = $totalFolder;

                                                $sql_child = "select * FROM tbl_storage_level WHERE sl_parent_id = \'$slperm\' ";
                                                $sql_child_run = mysqli_query($db_con, $sql_child) or die(\'Error: \' . mysqli_error($db_con));
                                                if (mysqli_num_rows($sql_child_run) > 0) {

                                                    while ($rwchild = mysqli_fetch_assoc($sql_child_run)) {

                                                        $child = $rwchild[\'sl_id\'];
                                                        $clagain = findTotalFile($child);
                                                    }
                                                }
                                                return $list;
                                            }

                                            $totalFiles = findTotalFile($namesl[\'sl_id\']);
                                            ?>
                                        </div>
                                        <div class="col-md-12" style="overflow: auto">
                                            <?php
                                            $where = \'\';
                                            if (isset($_GET[\'quicksearch\']) && !empty($_GET[\'quicksearch\'])) {
                                                $user_id1 = $_SESSION[cdes_user_id];
                                                $chekUsr1 = mysqli_query($db_con, "select * from tbl_bridge_role_to_um where FIND_IN_SET(\'$user_id1\', user_ids) > 0") or die(\'Error:\' . mysqli_error($db_con));
                                                $rwcheckUser1 = mysqli_fetch_assoc($chekUsr1);
                                                if ($rwcheckUser1[\'role_id\'] == 1) {
                                                    $ids = preg_replace("/[^A-Za-z0-9 ]/", "", $_GET[quicksearch]);
                                                    //document inside workflow
                                                    $where = "where old_doc_name LIKE \'%$ids%\' and doc_name = \'$rwFolder[sl_id]\'";
                                                } else {
                                                    $ids = preg_replace("/[^A-Za-z0-9 ]/", "", $_GET[quicksearch]);
                                                    //document inside workflow
                                                    $where = "where old_doc_name LIKE \'%$ids%\' and doc_name = \'$rwFolder[sl_id]\' and flag_multidelete=1";
                                                }
                                            } else {
                                                $user_id1 = $_SESSION[cdes_user_id];
                                                $chekUsr1 = mysqli_query($db_con, "select * from tbl_bridge_role_to_um where FIND_IN_SET(\'$user_id1\', user_ids) > 0") or die(\'Error:\' . mysqli_error($db_con));
                                                $rwcheckUser1 = mysqli_fetch_assoc($chekUsr1);
                                                if ($rwcheckUser1[\'role_id\'] == 1) {
                                                    $where = "where doc_name = \'$rwFolder[sl_id]\' and flag_multidelete=1";
                                                } else {
                                                    $where = "where doc_name = \'$rwFolder[sl_id]\' and flag_multidelete=1";
                                                }
                                            }


                                            $constructs = "SELECT doc_id,flag_multidelete FROM tbl_document_master $where";
                                            $run = mysqli_query($db_con, $constructs) or die(\'Error\' . mysqli_error($db_con));

                                            $foundnum = mysqli_num_rows($run);
                                            if ($foundnum > 0) {
                                                if (is_numeric(preg_replace("/[^A-Za-z0-9]/", "", preg_replace("/[^A-Za-z0-9]/", "", $_GET[\'limit\'])))) {
                                                    $per_page = preg_replace("/[^A-Za-z0-9]/", "", $_GET[\'limit\']);
                                                } else {
                                                    $per_page = 10;
                                                }
                                                $start = isset($_GET[\'start\']) ? preg_replace("/[^0-9]/", "", $_GET[\'start\']) : \'\';
                                                $max_pages = ceil($foundnum / $per_page);
                                                if (!$start) {
                                                    $start = 0;
                                                }

                                                $allot = "select * from tbl_document_master $where order by old_doc_name LIMIT $start, $per_page";
                                               // echo $allot;
                                                $allot_query = mysqli_query($db_con, $allot) or die("Error: " . mysqli_error($db_con));
                                                ?>
                                                <div class="container" >
                                                    <div class="pull-right record">
                                                        <?php echo $start + 1 ?> to <?php
                                                        if (($start + 10) > $foundnum) {
                                                            echo $foundnum;
                                                        } else {
                                                            echo ($start + 10);
                                                        };
                                                        ?> Out Of <span>Total Records: <?php echo $foundnum; ?></span>
                                                    </div>
                                                    <div class="box-body limit">
                                                        <?php
                                                        $limit = trim($_GET[\'limit\']);

                                                        if (isset($limit) and ! empty($limit) and $limit == \'\') {

                                                            $rec_limit = $limit;
                                                        } else {

                                                            $rec_limit = 10;
                                                        }
                                                        $user_id = $_SESSION[cdes_user_id];
                                                        $chekUsr = mysqli_query($db_con, "select * from tbl_bridge_role_to_um where FIND_IN_SET(\'$user_id\', user_ids) > 0") or die(\'Error:\' . mysqli_error($db_con));
                                                        $rwcheckUser = mysqli_fetch_assoc($chekUsr);
                                                        if ($rwcheckUser[\'role_id\'] == 1) {
                                                            $sql = "SELECT count(doc_id) FROM  tbl_document_master where doc_name = $slid and flag_multidelete=1";
                                                        } else {
                                                            $sql = "SELECT count(doc_id) FROM  tbl_document_master where doc_name = $slid and flag_multidelete=1";
                                                        }
                                                        $retval = mysqli_query($db_con, $sql) or die(\'Could not get data: \' . mysqli_error($db_con));
                                                        $row = mysqli_fetch_array($retval, MYSQLI_NUM);
                                                        $rec_count = $row[0];
                                                        $maxpage = $rec_count / $rec_limit;
                                                        $maxpage = ceil($maxpage);
                                                        if (isset($_GET{\'page\'})) {
                                                            $page = $_GET{\'page\'} + 1;
                                                            $offset = $rec_limit * $page;
                                                            $i = $_GET[\'index\'];
                                                        } else {
                                                            $page = 0;
                                                            $offset = 0;
                                                        }
                                                        $left_rec = $rec_count - ($page * $rec_limit);
                                                        $bg = \'#E3EDF0\'; //variable used to store alternate row colors
                                                        ?>
                                                        Show <select id="limit">
                                                            <option value="10" <?php
                                                            if (preg_replace("/[^A-Za-z0-9]/", "", $_GET[\'limit\']) == 10) {
                                                                echo \'selected\';
                                                            }
                                                            ?>>10</option>
                                                            <option value="25" <?php
                                                            if (preg_replace("/[^A-Za-z0-9]/", "", $_GET[\'limit\']) == 25) {
                                                                echo \'selected\';
                                                            }
                                                            ?>>25</option>
                                                            <option value="50" <?php
                                                            if (preg_replace("/[^A-Za-z0-9]/", "", $_GET[\'limit\']) == 50) {
                                                                echo \'selected\';
                                                            }
                                                            ?>>50</option>
                                                            <option value="250" <?php
                                                            if (preg_replace("/[^A-Za-z0-9]/", "", $_GET[\'limit\']) == 250) {
                                                                echo \'selected\';
                                                            }
                                                            ?>>250</option>
                                                            <option value="500" <?php
                                                            if (preg_replace("/[^A-Za-z0-9]/", "", $_GET[\'limit\']) == 500) {
                                                                echo \'selected\';
                                                            }
                                                            ?>>500</option>
                                                        </select> Documents
                                                    </div>
                                                    <table class="table table-striped table-bordered no-footer" >
                                                        <thead>
                                                            <tr>
                                                                <th width="51px"><input  type="checkbox" class="checkbox-primary" id="select_all"> All </th>
                                                                <th>File Name </th>
                                                                <th>File Size</th>
                                                                <th>No.of Pages</th>
                                                                <th>Uploaded By</th>
                                                                <th>Uploaded Date</th>
                                                                <th>Actions</th>
                                                            </tr>
                                                        </thead>
                                                        <tbody>
                                                            <?php
                                                            $n = $start + 1;
                                                            while ($file_row = mysqli_fetch_assoc($allot_query)) {
                                                                $shareDid = mysqli_query($db_con, "select doc_ids from tbl_document_share where doc_ids= \'$file_row[doc_id]\'") or die("Error: " . mysqli_error($db_con));
                                                                $shreCount = mysqli_num_rows($shareDid);

                                                                //$getMetaData = mysqli_query($db_con, "select metadata_id from tbl_metadata_to_storagelevel where sl_id = \'$file_row[doc_name]\'") or die(\'Error:gg\' . mysqli_error($db_con));
                                                                $metaHtml = "";
                                                                $metafilled = false;
                                                                $getMetaId = mysqli_query($db_con, "select * from tbl_metadata_to_storagelevel where sl_id = \'$file_row[doc_name]\'") or die(\'Error:gg\' . mysqli_error($db_con));

                                                                if (mysqli_num_rows($getMetaId) > 0) {


                                                                    while ($rwgetMetaId = mysqli_fetch_assoc($getMetaId)) {

                                                                        $getMetaName = mysqli_query($db_con, "select * from tbl_metadata_master where id = \'$rwgetMetaId[metadata_id]\'") or die(\'Error:\' . mysqli_error($db_con));

                                                                        while ($rwgetMetaName = mysqli_fetch_assoc($getMetaName)) {
                                                                            $meta = mysqli_query($db_con, "select `$rwgetMetaName[field_name]` from tbl_document_master where doc_id=\'$file_row[doc_id]\'");
                                                                            $rwMeta = mysqli_fetch_array($meta);
                                                                            if (!empty($rwMeta[$rwgetMetaName[\'field_name\']])) {
                                                                                if ($rwgetMetaName[\'field_name\'] == \'noofpages\' || $rwgetMetaName[\'field_name\'] == \'filename\') {
                                                                                    
                                                                                } else {
                                                                                    $metafilled = true;
                                                                                    $metaHtml .= "<label>" . $rwgetMetaName[\'field_name\'] . "</label> : ";
                                                                                    if ($rwgetMetaName[\'data_type\'] == \'datetime\') {
                                                                                        $metaHtml .= (($rwMeta[$rwgetMetaName[\'field_name\']] != \'0000-00-00 00:00:00\') ? date(\'d-m-Y\', strtotime($rwMeta[$rwgetMetaName[\'field_name\']])) : "-");
                                                                                    } else {
                                                                                        $metaHtml .= $rwMeta[$rwgetMetaName[\'field_name\']];
                                                                                    }

                                                                                    $metaHtml .= " | ";
                                                                                }
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                                ?>
                                                                <tr class="gradeX" id="metadata<?php echo $file_row[\'doc_id\']; ?>" <?php if ($file_row[\'checkin_checkout\'] == 0) { ?> style="background:#2680ad !important; color:#fff;" <?php } ?>>
                                                                    <td> 
                                                                        <input  type="checkbox" class="checkbox-primary emp_checkbox" data-doc-id="<?php echo $file_row[\'doc_id\']; ?>" id="shreId">
                                                                        <?php echo $n; ?> 
                                                                        <?php
                                                                        if ($shreCount > 0) {
                                                                            ?>
                                                                            <span class="fa fa-share-square-o" style="font-size: 15px; color: #3c8dbc;" title="Shared Document"></span>
                                                                        <?php } ?>

                                                                        <?php echo (($metafilled) ? "<i class=\'fa fa-check\'></i>" : ""); ?>
                                                                    </td>
                                                                    <td> <div style="overflow: hidden; max-width:200px;" title="<?php echo $file_row[\'old_doc_name\']; ?>"><?php echo $file_row[\'old_doc_name\']; ?></div></td>
                                                                    <td ><?php
                                                                        $size = round($file_row[\'doc_size\'] / 1000 / 1000, 2);
                                                                        if ($size <= 0) {
                                                                            echo $file_row[\'doc_size\'] / 1000;
                                                                        } else {
                                                                            echo $size;
                                                                        }
                                                                        ?> MB</td>
                                                                    <td><?php echo $file_row[\'noofpages\']; ?></td>
                                                                    <?php
                                                                    $userName = "SELECT first_name,last_name FROM tbl_user_master WHERE user_id = \'$file_row[uploaded_by]\'";
                                                                    $userName_run = mysqli_query($db_con, $userName) or die("Error: " . mysqli_error($db_con));

                                                                    $rwuserName = mysqli_fetch_assoc($userName_run)
                                                                    ?>
                                                                    <td><?php echo $rwuserName[\'first_name\'] . " " . $rwuserName[\'last_name\']; ?></td>
                                                                    <td><?php echo date(\'d-m-Y h:i:s\', strtotime($file_row[\'dateposted\'])); ?></td>
                                                                    <td>
                                                            <li class="dropdown top-menu-item-xs">
                                                                <a href="" class="dropdown-toggle profile waves-effect waves-light" data-toggle="dropdown" aria-expanded="true"><i class="fa fa-gear"></i></a>
                                                                <ul class="dropdown-menu pdf gearbody">
                                                                    <li> 
                                                                        <?php
                                                                        if ($file_row[\'checkin_checkout\'] == 1) {
                                                                            if (strtolower($file_row[\'doc_extn\']) == \'pdf\') {
                                                                                ?>
                                                                                <?php if ($rwgetRole[\'pdf_file\'] == \'1\') { ?>
                                                                                    <a href="flipflop-viewer?i=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])) ?>&i=<?php echo urlencode(base64_encode($file_row[\'doc_id\'])); ?>" id="fancybox-inner" class="pdfview" target="_blank">
                                                                                        <i class="ti-book" style="font-size: 18px;"></i></a>

                                                                                    <a href="viewer?id=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&i=<?php echo urlencode(base64_encode($file_row[\'doc_id\'])); ?>" id="fancybox-inner" class="pdfview" target="_blank">
                                                                                        <i class="fa fa-file-pdf-o"></i></a>
                                                                                <?php } ?>
                                                                                <!--for tool tip on pdf-->   
                                                                                <?php if ($rwgetRole[\'pdf_annotation\'] == \'1\') { 
                                                                                    
                                                                                      $chkanottId = mysqli_query($db_con, "SELECT * FROM `tbl_doc_assigned_wf` where doc_id=\'$file_row[doc_id]\'") or die(\'Error:gg\' . mysqli_error($db_con));
                                                                                      $chkid= mysqli_fetch_assoc($chkanottId);
                                                                                      if(!empty($chkid)){ ?>
                                                                                          <a href="anott/index?id=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&id1=<?php echo urlencode(base64_encode($file_row[\'doc_id\'])); ?>&pn=1" class="pdfview" target="blank">  <i class="fa fa fa-file-text-o"></i></a>
                                                                                   <?php
                                                                                      } else{ }?>
                                                                                        
                                                                                    
                                                                                    <?php
                                                                                }
                                                                            } else if (strtolower($file_row[\'doc_extn\']) == \'jpg\' || strtolower($file_row[\'doc_extn\']) == \'png\' || strtolower($file_row[\'doc_extn\']) == \'gif\') {
                                                                                ?>
                                                                                <a href="imageviewer?uid=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&i=<?php echo urlencode(base64_encode($file_row[\'doc_id\'])); ?>"  target="_blank">
                                                                                    <?php if ($rwgetRole[\'image_file\'] == \'1\') { ?>
                                                                                        <i class="fa fa-file-image-o"></i> Image</a>
                                                                                <?php } ?>
                                                                            <?php } else if (strtolower($file_row[\'doc_extn\']) == \'tif\' || strtolower($file_row[\'doc_extn\']) == \'tiff\') { ?>

                                                                                <a href="tiff-viewer?id=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&i=<?php echo urlencode(base64_encode($file_row[\'doc_id\'])); ?>" target="_blank" >
                                                                                    <?php if ($rwgetRole[\'tif_file\'] == \'1\') { ?>
                                                                                        <i class="fa fa-picture-o"></i> Tiff File
                                                                                    </a>
                                                                                <?php } ?>

                                                                            <?php } else if (strtolower($file_row[\'doc_extn\']) == \'xlsx\') {
                                                                                ?>
                                                                                <a href="xlsx?uid=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&file=<?php echo urlencode(base64_encode($file_row[\'doc_id\'])); ?>" target="_blank">
                                                                                    <?php if ($rwgetRole[\'excel_file\'] == \'1\') { ?>
                                                                                        <i class="fa fa-file-excel-o"></i> Execl file</a>
                                                                                <?php } ?>

                                                                            <?php } else if (strtolower($file_row[\'doc_extn\']) == \'xls\') {
                                                                                ?>
                                                                                <a href="xls?uid=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&file=<?php echo urlencode(base64_encode($file_row[\'doc_id\'])); ?>" target="_blank">
                                                                                    <?php if ($rwgetRole[\'excel_file\'] == \'1\') { ?>
                                                                                        <i class="fa fa-file-excel-o"></i> Execl file</a>
                                                                                <?php } ?>

                                                                            <?php } else if (strtolower($file_row[\'doc_extn\']) == \'doc\' || strtolower($file_row[\'doc_extn\']) == \'docx\') { ?>
                                                                                <a href="viewword?i=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&id=<?php echo urlencode(base64_encode($file_row[\'doc_id\'])); ?>" target="_blank">
                                                                                    <?php if ($rwgetRole[\'doc_file\'] == \'1\') { ?>
                                                                                        <i class="fa fa-file-word-o"></i>Word file</a>
                                                                                <?php } ?>

                                                                            <?php } else if (strtolower($file_row[\'doc_extn\']) == \'mp3\' || strtolower($file_row[\'doc_extn\']) == \'wav\') { ?>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              <!--a class="" href="#modal-audio" data-uk-modal=""><i class="fa fa-music"></i> </a-->
                                                                                <a href="audio-player?id=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&id=<?php echo urlencode(base64_encode($file_row[\'doc_id\'])); ?>" target="_blank">
                                                                                    <?php if ($rwgetRole[\'audio_file\'] == \'1\') { ?>
                                                                                        <i class="fa fa-music" title="<?php echo $lang[\'Audio_file\']; ?>"></i> <!--<?php echo $lang[\'Audio_file\']; ?>--></a>
                                                                                <?php } ?>

                                                                            <?php } else if (strtolower($file_row[\'doc_extn\']) == \'mp4\' || strtolower($file_row[\'doc_extn\']) == \'3gp\') { ?>
                                                                                <a href="video-player?id=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&id=<?php echo urlencode(base64_encode($file_row[\'doc_id\'])); ?>" target="_blank" >
                                                                                    <?php if ($rwgetRole[\'video_file\'] == \'1\') { ?>
                                                                                        <i class="fa fa-video-camera" title="<?php echo $lang[\'Video_file\']; ?>"></i><!--<?php echo $lang[\'Video_file\']; ?>--></a>

                                                                                <?php } ?>                                                                        
                                                                                <?php
                                                                            } else {
                                                                                $sql = mysqli_query($db_con, "select * from tbl_storage_level where sl_id=\'$slid\'") or die(\'Error\');
                                                                                $pass_check = mysqli_fetch_assoc($sql);

                                                                                if ($pass_check[\'is_protected\'] == 1 || $pass_check[\'is_protected\'] == 2) {
                                                                                    ?>

                                                                                    <a data-toggle="modal" data-target="#myModal"  download title="<?php echo $file_row[\'old_doc_name\']; ?>" onclick="setDownloadDocId(\'<?php echo urlencode(base64_encode($file_row[\'doc_id\'])) ?>\');"> <i class="fa fa-download" id ="download_btn" title="<?php echo $lang[\'Download\']; ?>"></i>
                                                                                    </a>
                                                                                <?php } else { ?>                         
                                                                                    <a href="downloaddoc?file=<?php echo urlencode(base64_encode($file_row[\'doc_id\'])) ?>" id="fancybox-inner" target="_blank" download title="<?php echo $file_row[\'old_doc_name\']; ?>"> <i class="fa fa-download" title="<?php echo $lang[\'Download\']; ?>"></i>
                                                                                    </a>
                                                                                <?php }
                                                                            }
                                                                            ?>
                                                                        </li>

                                                                        <?php if ($rwgetRole[\'file_edit\'] == \'1\') { ?>
                                                                            <li> <a href="javascript:void(0)" data="metaData<?php echo $n; ?>" id="viewMeta"><i class="fa fa-eye"></i> View MetaData</a></li>
                                                                        <?php } if ($rwgetRole[\'file_delete\'] == \'1\') { ?>
                                                                            <li><a href="javascript:void(0)" data-toggle="modal" data-target="#con-close-modal2" id="removeRow" data="<?php echo $file_row[\'doc_id\']; ?>"><i class="fa fa-trash-o"></i> Delete </a></li>
                                                                        <?php } ?>
                                                                        <?php if ($rwgetRole[\'workflow_initiate_file\'] == \'1\' || $rwgetRole[\'initiate_file\'] == \'1\') { ?>
                                                                            <li> <a href="javascript:void(0)" data-toggle="modal" data-target="#assign-workflow" id="moveToWf" data="<?php echo $file_row[\'doc_id\']; ?>"><i class="fa fa-plus"></i> Workflow</a></li>
                                                                        <?php } ?>
                                                                        <?php if ($rwgetRole[\'checkin_checkout\'] == \'1\') { ?>
                                                                            <li><a href="javascript:void(0)" id="checkout" data="<?php echo $file_row[\'doc_id\']; ?>"><i class="fa fa-sign-out"></i> Check Out</a></li>
                                                                            <?php
                                                                        }
                                                                    } else {
                                                                        ?>
                                                                        <?php if ($rwgetRole[\'checkin_checkout\'] == \'1\') { ?>
                                                                            <li> <a href="javascript:void(0)" data-toggle="modal" data-target="#editmetadata" id="editMdata" data="<?php echo $file_row[\'doc_id\']; ?>"><i class="fa fa-sign-in"></i> Check IN</a></li>
                                                                            <?php
                                                                        }
                                                                    }
                                                                    ?>
                                                                </ul>
                                                            </li>
                                                            </td>
                                                            </tr>
                                                            <tr>
                                                                <td colspan="20">
                                                                    <div id="metaData<?php echo $n; ?>"  class="metadata">
                                                                        <?php
                                                                        $versionView = mysqli_query($db_con, "SELECT * FROM tbl_document_master where substring_index(doc_name,\'_\',-1)=\'$file_row[doc_id]\' and substring_index(doc_name,\'_\',1)=\'$slid\' ") or die("Error: test" . mysqli_error($db_con));
                                                                        if (mysqli_num_rows($versionView) > 0) {

                                                                            $i = 1.0;
                                                                            while ($rwView = mysqli_fetch_assoc($versionView)) {
                                                                                if ($rwgetRole[\'file_version\'] == \'1\') {
                                                                                    if ($i > 0) {

                                                                                        echo \'Version \' . $i . \'-\';
                                                                                    }
                                                                                    ?>

                    <?php if (strtolower($rwView[\'doc_extn\']) == \'pdf\') { ?>

                                                                                        <a href="viewer?id=<?php echo base64_encode(urldecode($_SESSION[\'cdes_user_id\'])); ?>&i=<?php echo urlencode(base64_encode($rwView[\'doc_id\'])); ?>" id="fancybox-inner" target="_blank">
                        <?php echo $rwView[\'old_doc_name\']; ?>
                                                                                        </a>

                                                                                        <?php } else if (strtolower($rwView[\'doc_extn\']) == \'jpg\' || strtolower($rwView[\'doc_extn\']) == \'png\' || strtolower($rwView[\'doc_extn\']) == \'gif\') { ?>
                                                                                        <a href="imageviewer?uid=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&i=<?php echo urlencode(base64_encode($rwView[\'doc_id\'])); ?>"  target="_blank">
                                                                                        <?php echo $rwView[\'old_doc_name\']; ?>
                                                                                        </a>
                    <?php } else if (strtolower($rwView[\'doc_extn\']) == \'tif\' || strtolower($rwView[\'doc_extn\']) == \'tiff\') { ?>


                                                                                        <a href="tiff-viewer?id=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&i=<?php echo urlencode(base64_encode($rwView[\'doc_id\'])); ?>" target="_blank" >

                        <?php if ($rwgetRole[\'tif_file\'] == \'1\') { ?>
                                                                                                <i class="fa fa-picture-o"></i>
                                                                                            </a>
                                                                                        <?php } ?>

                                                                                    <?php } else if (strtolower($rwView[\'doc_extn\']) == \'xlsx\') {
                                                                                        ?>
                                                                                        <a href="xlsx?uid=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&file=<?php echo urlencode(base64_encode($rwView[\'doc_id\'])); ?>" target="_blank">
                                                                                        <?php if ($rwgetRole[\'excel_file\'] == \'1\') { ?>
                                                                                                <i class="fa fa-file-excel-o"></i></a>
                                                                                        <?php } ?>

                                                                                    <?php } else if (strtolower($rwView[\'doc_extn\']) == \'xls\') {
                                                                                        ?>
                                                                                        <a href="xls?uid=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&file=<?php echo urlencode(base64_encode($rwView[\'doc_id\'])); ?>" target="_blank">
                                                                                        <?php if ($rwgetRole[\'excel_file\'] == \'1\') { ?>
                                                                                                <i class="fa fa-file-excel-o"></i></a>
                                                                                        <?php } ?>

                                                                                        <?php } else if (strtolower($rwView[\'doc_extn\']) == \'doc\' || strtolower($rwView[\'doc_extn\']) == \'docx\') { ?>
                                                                                        <a href="viewword?i=<?php echo urlencode(base64_encode($_SESSION[cdes_user_id])); ?>&id=<?php echo urlencode(base64_encode($rwView[\'doc_id\'])); ?>" target="_blank">
                                                                                            <?php if ($rwgetRole[\'doc_file\'] == \'1\') { ?>
                                                                                                <?php echo $rwView[\'old_doc_name\']; ?>&nbsp;&nbsp;<i class="fa fa-file-word-o"></i></a>
                                                                                            <?php } ?>
                                                                                        <?php } else if (strtolower($rwView[\'doc_extn\']) == \'mp3\') { ?>
                                                                                        <a href="javascript:void(0)" data-toggle="modal" data-target="#modal-audio" data="<?php echo $rwView[\'doc_id\']; ?>" id="audio">
                                                                                        <?php echo $rwView[\'old_doc_name\']; ?>
                                                                                        </a>
                                                                                        <?php } else if (strtolower($rwView[\'doc_extn\']) == \'mp4\') { ?>
                                                                                        <a href="javascript:void(0)" data-toggle="modal" data-target="#modal-video" data="<?php echo $rwView[\'doc_id\']; ?>" id="video">
                        <?php echo $rwView[\'old_doc_name\']; ?>
                                                                                        </a>

                                                                                    <?php } else {
                                                                                        ?>
                                                                                        <a href="downloaddoc?file=<?php echo urlencode(base64_encode($rwView[\'doc_id\'])); ?>" id="fancybox-inner" target="_blank" >
                                                                                        <?php echo $rwView[\'old_doc_name\']; ?>
                                                                                        </a>
                                                                                        <?php
                                                                                    }
                                                                                }
                                                                                if ($rwgetRole[\'delete_version\'] == \'1\') {
                                                                                    ?>
                                                                                    <a href="javascript:void(0)" data="<?php echo $rwView[\'doc_id\']; ?>" data-toggle="modal" data-target="#deleteVersion" id="deleteVersionDoc"><i class="fa fa-trash"></i></a>
                                                                                    <?php
                                                                                }
                                                                                $i = $i + 0.1;
                                                                            }
                                                                        }
                                                                        ?>
                                                                        <?php
                                                                        echo $metaHtml;
                                                                        ?>
                                                                    </div>
                                                                </td>
                                                            </tr>

                                                            <?php
                                                            $n++;
                                                        }
                                                        ?>
                                                        </tbody>
                                                        <tr>
                                                            <td colspan="50">
                                                                <ul class="delete_export">
                                                                    <input type="hidden" name="slid" id="slid" value="<?php echo preg_replace("/[^A-Za-z0-9 ]/", "", $slid); ?>">
                                                                    <input type="hidden" name="sty" id="sty" value="<?php echo preg_replace("/[^A-Za-z0-9 ]/", "", $_GET[\'id\']); ?>">
                                                                    <?php if ($rwgetRole[\'file_delete\'] == \'1\') { ?>
                                                                        <li><button id="del_file" class="rows_selected btn btn-danger fa fa-trash-o" data-toggle="modal" data-target="#del_send_to_recycle" title="Delete Selected Files"></button></li>
                                                                    <?php } if ($rwgetRole[\'export_csv\'] == \'1\') { ?>
                                                                        <li><button class="btn btn-primary fa fa-download" id="export4"  data-toggle="modal"  data-target="#multi-csv-export-model" title="Export MetaData of Selected Files"></button></li>
                                                                    <?php } if ($rwgetRole[\'move_file\'] == \'1\') { ?>
                                                                        <li><button id="move_multi" class="rows_selected btn btn-primary fa fa-share-square" data-toggle="modal" data-target="#move-selected-files" title="Move Selected files to other Storage"></button></li>
                                                                    <?php } if ($rwgetRole[\'copy_file\'] == \'1\') { ?>
                                                                        <li><button class="rows_selected btn btn-primary fa fa-copy" id="copyFiles" data-toggle="modal" data-target="#copy-selected-files" title="Copy Selected files to other Storage"> </button></li>
                                                                    <?php } if ($rwgetRole[\'share_file\'] == \'1\') { ?>
                                                                        <li><button class="rows_selected btn btn-primary fa fa-share-alt" id="shareFiles" data-toggle="modal" data-target="#share-selected-files" title="Share Selected files"></button></li>
    <?php } ?>
                                                                </ul>
                                                            </td>
                                                        </tr>
                                                    </table>

                                                    <?php
                                                    echo "<center>";
                                                    $prev = $start - $per_page;
                                                    $next = $start + $per_page;

                                                    $adjacents = 3;
                                                    $last = $max_pages - 1;
                                                    if ($max_pages > 1) {
                                                        ?>

                                                        <ul class=\'pagination strgePage\'>
                                                            <?php
                                                            $pageid = preg_replace("/[^0-9A-Za-z ]/", "", $_GET[id]);
                                                            //previous button
                                                            if (!($start <= 0))
                                                                echo " <li><a href=\'?id=$pageid&start=$prev\'>Prev</a> </li>";
                                                            else
                                                                echo " <li class=\'disabled\'><a href=\'javascript:void(0)\'>Prev</a> </li>";
                                                            //pages 
                                                            if ($max_pages < 7 + ($adjacents * 2)) {   //not enough pages to bother breaking it up
                                                                $i = 0;
                                                                for ($counter = 1; $counter <= $max_pages; $counter++) {
                                                                    if ($i == $start) {
                                                                        echo " <li><a href=\'?id=$pageid&start=$i\'><b>$counter</b></a> </li>";
                                                                    } else {
                                                                        echo "<li><a href=\'?id=$pageid&start=$i\'>$counter</a></li> ";
                                                                    }
                                                                    $i = $i + $per_page;
                                                                }
                                                            } elseif ($max_pages > 5 + ($adjacents * 2)) {    //enough pages to hide some
                                                                //close to beginning; only hide later pages
                                                                if (($start / $per_page) < 1 + ($adjacents * 2)) {
                                                                    $i = 0;
                                                                    for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++) {
                                                                        if ($i == $start) {
                                                                            echo " <li><a href=\'?id=$pageid&start=$i\'><b>$counter</b></a></li> ";
                                                                        } else {
                                                                            echo "<li> <a href=\'?id=$pageid&start=$i\'>$counter</a> </li>";
                                                                        }
                                                                        $i = $i + $per_page;
                                                                    }
                                                                }
                                                                //in middle; hide some front and some back
                                                                elseif ($max_pages - ($adjacents * 2) > ($start / $per_page) && ($start / $per_page) > ($adjacents * 2)) {
                                                                    echo " <li><a href=\'?id=$pageid&start=0\'>1</a></li> ";
                                                                    echo "<li><a href=\'?id=$pageid&start=$per_page\'>2</a></li>";
                                                                    echo "<li><a href=\'javascript:void(0)\'>...</a></li>";

                                                                    $i = $start;
                                                                    for ($counter = ($start / $per_page) + 1; $counter < ($start / $per_page) + $adjacents + 2; $counter++) {
                                                                        if ($i == $start) {
                                                                            echo " <li><a href=\'?id=$pageid&start=$i\'><b>$counter</b></a></li> ";
                                                                        } else {
                                                                            echo " <li><a href=\'?id=$pageid&start=$i\'>$counter</a> </li>";
                                                                        }
                                                                        $i = $i + $per_page;
                                                                    }
                                                                }
                                                                //close to end; only hide early pages
                                                                else {
                                                                    echo "<li> <a href=\'?id=$pageid&start=0\'>1</a> </li>";
                                                                    echo "<li><a href=\'?id=$pageid&start=$per_page\'>2</a></li>";
                                                                    echo "<li><a href=\'javascript:void(0)\'>...</a></li>";

                                                                    $i = $start;
                                                                    for ($counter = ($start / $per_page) + 1; $counter <= $max_pages; $counter++) {
                                                                        if ($i == $start) {
                                                                            echo " <li><a href=\'?id=$pageid&start=$i\'><b>$counter</b></a></li> ";
                                                                        } else {
                                                                            echo "<li> <a href=\'?id=$pageid&start=$i\'>$counter</a></li> ";
                                                                        }
                                                                        $i = $i + $per_page;
                                                                    }
                                                                }
                                                            }
                                                            //next button
                                                            if (!($start >= $foundnum - $per_page))
                                                                echo "<li><a href=\'?id=$pageid&start=$next\'>Next</a></li>";
                                                            else
                                                                echo "<li class=\'disabled\'><a href=\'javascript:void(0)\'>Next</a></li>";
                                                            ?>
                                                        </ul>
                                                        <?php
                                                    }
                                                    echo "</center>";
                                                    ?>
                                                </div>
                                            </div>
                                            <?php
                                        } else {

                                            echo\'<div style="text-align:center;"><h4 style="color: red;border: 1px solid #c4c4cd; padding:10px; background: #ebeff2;">File Not found</h4></div>\';
                                        }
                                        ?>

                                    </div>
                                </div>
                            </div>				
                        </div>
                    </div> <!-- container -->
                </div> <!-- content -->
            </div>  
            <!-- /.modal -->
            <div id="del_send_to_recycle" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <form method="post" >
                            <div class="modal-header"> 
                                <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
                                <h4 class="modal-title" style="display:none;" id="hid"> <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Here\'s a message!</h4>
                                <h4 class="modal-title" id="confirm"> Are You Sure?</h4> 
                            </div>
                            <div class="modal-body">
                                <span id="errmessage" style="display:none;"> <h5 class="text-alert">Please select files for Delete.</h5></span>
                                <label class="text-danger" id="hide">Are you sure want to Delete this<?php if ($rwgetRole[\'role_id\'] == 1) { ?>  <strong>Document Permanently.</strong><?php } ?>?</label>
                            </div> 
                            <div class="modal-footer">
                                <input type="hidden" id="sl_id1" name="sl_id1">
                                <input type="hidden" id="reDel" name="DelFile">
                                <!--  <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> -->
                                <?php
                                if ($rwgetRole[\'role_id\'] == 1) {
                                    ?>
                                    <button type="submit" id="yes" name="Delmultiple" class="btn btn-danger" value="Yes"> <i class="fa fa-trash-o"></i> Yes</button>
                                    <?php
                                }
                                ?>
                                <button type="submit" id="no" name="Delmultiple" class="btn btn-danger"> <i class="fa fa-recycle"></i>
                                    <?php
                                    if ($rwgetRole[\'role_id\'] == 1) {
                                        echo \'Recycle\';
                                    } else {
                                        echo "Delete";
                                    }
                                    ?>

                                </button> 
                            </div>
                        </form>

                    </div> 
                </div>
            </div>
            <div id="csv_export_model" class="modal">
                <div class="modal-dialog">
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <h4 class="modal-title"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Here\'s a message!</h4> 
                        </div>
                        <div class="modal-body">
                            <h5 class="text-alert">Please select Files for Export CSV.</h5>
                        </div>
                        <div class="modal-footer"> 
                            <button onclick="document.getElementById(\'csv_export_model\').style.display = \'none\'" class="btn btn-default waves-effect">Close</button>
                        </div>
                    </div>
                </div>
            </div>

            <!-- /.modal --> 
            <!--share files with users-->
            <div id="share-selected-files" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
                            <h4 class="modal-title" id="shr"> <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Here\'s a message!</h4>
                            <h4 class="modal-title" style="display:none;" id="stitle"> Share Documents With</h4> 
                        </div>
                        <div id="unseshare">
                            <div class="modal-body">
                                <h5 class="text-alert">Please select Files for Share.</h5>
                            </div>
                            <div class="modal-footer"> 
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                            </div>
                        </div>
                        <div id="selected2">
                            <form method="post" >
                                <div class="modal-body">
                                    <div class="form-group">
                                        <label>Select User</label>
                                        <select class="select2 select2-multiple" multiple data-placeholder="Select Users" name="userid[]" required>
                                            <?php
                                            $sameGroupIDs = array();
                                            $group = mysqli_query($db_con, "select * from tbl_bridge_grp_to_um where find_in_set(\'$_SESSION[cdes_user_id]\',user_ids)") or die(\'Error\' . mysqli_error($db_con));
                                            while ($rwGroup = mysqli_fetch_assoc($group)) {
                                                $sameGroupIDs[] = $rwGroup[\'user_ids\'];
                                            }
                                            $sameGroupIDs = array_unique($sameGroupIDs);
                                            sort($sameGroupIDs);
                                            $sameGroupIDs = implode(\',\', $sameGroupIDs);
                                            $user = mysqli_query($db_con, "select * from tbl_user_master where user_id in($sameGroupIDs)");
                                            while ($rwUser = mysqli_fetch_assoc($user)) {
                                                if ($rwUser[\'user_id\'] != 1 && $rwUser[\'user_id\'] != $_SESSION[\'cdes_user_id\']) {
                                                    echo \'<option value="\' . $rwUser[\'user_id\'] . \'">\' . $rwUser[\'first_name\'] . \' \' . $rwUser[\'last_name\'] . \'</option>\';
                                                } else {
                                                    echo \'<option value="\' . $rwUser[\'user_id\'] . \'">\' . $rwUser[\'first_name\'] . \' \' . $rwUser[\'last_name\'] . \'</option>\';
                                                }
                                            }
                                            ?>
                                        </select>
                                    </div>
                                </div> 
                                <div class="modal-footer">
                                    <input type="hidden" id="share_docids" name="shareFile">
                                    <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button>

                                    <button type="submit" name="shareFiles" class="btn btn-primary"> <i class="fa fa-share-alt"></i> Share</button>

                                    </button> 
                                </div>
                            </form>
                        </div>
                    </div> 
                </div>
            </div><!-- /.modal --> 
            <!---assign meta-data model start ---->
            <div id="con-close-modal5" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title">Assign Meta-Data Fields to <strong><?php echo $rwFolder[\'sl_name\']; ?></strong></h4> 
                        </div> 
                        <form action="#" data-parsley-validate novalidate method="post" enctype="multipart/form-data">
                            <div class="modal-body row">

                                <div class="col-md-12 shiv metaa">
                                    <span><strong>Field Select:</strong></span>
                                    <strong style="margin-left: 113px;">Field Assigned:</strong>
                                    <select multiple="multiple" class="multi-select" id="my_multi_select1" name="my_multi_select1[]" data-plugin="multiselect">
                                        <?php
                                        $arrarMeta = array();
                                        $metas = mysqli_query($db_con, "select * from tbl_metadata_to_storagelevel where sl_id = \'$slid\'") or die(\'Error: metadata\' . mysqli_error($db_con));
                                        while ($metaval = mysqli_fetch_assoc($metas)) {
                                            array_push($arrarMeta, $metaval[\'metadata_id\']);
                                        }
                                        $meta = mysqli_query($db_con, "select * from tbl_metadata_master order by field_name asc");
                                        while ($rwMeta = mysqli_fetch_assoc($meta)) {
                                            if (in_array($rwMeta[\'id\'], $arrarMeta)) {
                                                echo \'<option value="\' . $rwMeta[\'id\'] . \'" selected>\' . $rwMeta[\'field_name\'] . \'</option>\';
                                            } else {
                                                echo \'<option value="\' . $rwMeta[\'id\'] . \'">\' . $rwMeta[\'field_name\'] . \'</option>\';
                                            }
                                        }
                                        ?>
                                    </select>

                                </div>
                            </div>
                            <div class="modal-footer">
                                <input type="hidden" value="<?php echo preg_replace("/[^A-Za-z0-9 ]/", "", base64_decode(urldecode($_GET[\'id\']))); ?>" name="id">
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                <button class="btn btn-primary waves-effect waves-light" type="submit" name="assignMeta">Submit</button>
                            </div>
                        </form>

                    </div> 
                </div>
            </div>
            <!--ends assign-meta-data modal --> 
            <?php require_once \'./application/pages/footer.php\'; ?>
            <!-- Right Sidebar -->
<?php require_once \'./application/pages/rightSidebar.php\'; ?>
            <!-- /Right-bar -->

            <!-- END wrapper -->
<?php require_once \'./application/pages/footerForjs.php\'; ?>
            <!--for multiselect-->
            <script type="text/javascript" src="assets/plugins/multiselect/js/jquery.multi-select.js"></script>
            <script src="assets/js/jquery.core.js"></script>

            <script src="assets/plugins/bootstrap-filestyle/js/bootstrap-filestyle.min.js" type="text/javascript"></script>
            <script src="assets/plugins/select2/js/select2.min.js" type="text/javascript"></script>

            <script type="text/javascript" src="assets/plugins/parsleyjs/parsley.min.js"></script>
            <script src="assets/plugins/jstree/jstree.min.js"></script>
            <script src="assets/pages/jquery.tree.js"></script>

            <script type="text/javascript" src="assets/multi_function_script.js"></script>

            <!-- for searchable select-->
            <script type="text/javascript">
                                $(document).ready(function () {

                                    $(".select2").select2();
                                });
            </script>

            <!--edit metadata-->
            <script>
                $("a#editMdata").click(function () {
                    var $id = $(this).attr(\'data\');
                    var $row = $(this).closest(\'tr\');
                    var name = \'\';
                    var values = [];
                    values = $row.find(\'td:nth-child(2)\').map(function () {
                        var $this = $(this);
                        if ($this.hasClass(\'actions\')) {

                        } else {
                            name = $.trim($this.text());
                        }

                        $("#editmetadata .modal-title").html("Update Meta Data of File: <strong>" + name + "</strong>");
                        $.post("application/ajax/editMdataValue.php", {ID: $id}, function (result, status) {
                            if (status == \'success\') {
                                $("#modalModifyMvalue").html(result);
                            }
                        });
                    });
                });
            </script>                                 
            <script type="text/javascript">

                $(document).ready(function () {
                    $(\'form\').parsley();
                });
                $(".select2").select2();
                $(\'#basicTree\')
                        // listen for event
                        .on(\'changed.jstree\', function (e, data) {
                            if (data.node) {
                                //debugger;
                                var nodeID = data.node.id + \'_anchor\';
                                var href = $("#" + nodeID).attr(\'href\');
                                //history.pushState(null, null, href);
                                window.location.href = href;
                            }
                            var i, j, r = [];
                            for (i = 0, j = data.selected.length; i < j; i++) {
                                r.push(data.instance.get_node(data.selected[i]).text);
                            }
                            //$(\'#event_result\').html(\'Selected : <strong>\' + r.join(\', \') + \'</strong>\');

                        })
                        // create the instance
                        .jstree({
                            \'core\': {
                                \'themes\': {
                                    \'responsive\': false
                                }
                            },
                            \'types\': {
                                \'default\': {
                                    \'icon\': \'md md-folder\'
                                },
                                \'file\': {
                                    \'icon\': \'md md-my-library-books\'
                                }
                            },
                            \'plugins\': [\'types\']
                        });
                $(document).ready(function () {

                    //Disable mouse right click
                    $("body").on("contextmenu", function (e) {
                        // return false;
                    });
                });
            </script>
            <script>

                $("a#viewMeta").click(function () {

                    if ($(this).find(\'i\').hasClass(\'fa-eye\')) {
                        $(".metadata").css(\'display\', \'none\');
                        $("a#viewMeta").find(\'i\').removeClass(\'fa-eye\');
                        $("a#viewMeta").find(\'i\').addClass(\'fa-eye\');
                        var mid = $(this).attr("data");
                        $("#" + mid).css(\'display\', \'block\');
                        $(this).find(\'i\').removeClass(\'fa-eye\');
                        $(this).find(\'i\').addClass(\'fa-eye\')
                    } else {
                        $(".metadata").css(\'display\', \'none\');
                        $("a#viewMeta").find(\'i\').removeClass(\'fa-eye\');
                        $("a#viewMeta").find(\'i\').addClass(\'fa-eye\');
                    }
                });
                $("input:checkbox").click(function () {
                    var column = "table ." + $(this).attr("name");
                    $(column).toggle();
                });
            </script>
            <div id="multi-csv-export-model" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true" id="close" style="display:none;"></button>
                            <h4 class="modal-title" id="unexport"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Here\'s a message!</h4>
                            <!--<h4 class="modal-title" style="display:none;" id="export_title"> Export Selected Rows </h4>--> 
                        </div>
                        <div id="export_unselected" style="display:none;">
                            <div class="modal-body">
                                <h5 class="text-alert"> Please select Files for Export.</h5>
                            </div>

                            <div class="modal-footer"> 
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                            </div>
                        </div>
                        <div id="export_selected">
                            <div class="modal-header"> 
                                <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                                <h4 class="modal-title">Export Selected Data</h4> 
                            </div> 

                            <form action="multi_data_export" data-parsley-validate novalidate method="post" enctype="multipart/form-data">
                                <div class="modal-body row">

                                    <div class="col-md-12 shiv metaa">
                                        <span><strong>Select Files for Export Format:</strong></span>

                                        <select  class="multi-select" id="my_multi_select1" name="select_Fm">
                                            <option value="csv">Csv</option>
                                            <option value="excel">Excel</option>
                                            <option value="pdf">Pdf</option> 
                                            <option value="word">Word</option>
                                        </select>

                                    </div>
                                    <input type="hidden" name="export_doc_ids" id="export_doc_ids" value="">
                                </div>
                                <div class="modal-footer">
                                    <input type="hidden" value="<?php echo preg_replace("/[^A-Za-z0-9 ]/", "", base64_decode(urldecode($_GET[\'id\']))); ?>" name="id">
                                    <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                    <button class="btn btn-primary waves-effect waves-light fa fa-download" type="submit" name="exportData"> Export</button>
                                </div>
                            </form>
                        </div>
                    </div> 
                </div>
            </div>
            <!--for audio model-->
            <div id="modal-audio" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                <div class="modal-dialog">
                    <div class="modal-content">
                        <div class="modal-header">
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
                            <h4 class="modal-title" id="myModalLabel">Play/Download Audio</h4>
                        </div>
                        <div id="foraudio">

                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button>

                        </div>
                    </div><!-- /.modal-content -->
                </div><!-- /.modal-dialog -->
            </div><!-- /.modal -->
            <!--for video model-->
            <div id="modal-video" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                <div class="modal-dialog">
                    <div class="modal-content">
                        <div class="modal-header">
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
                            <h4 class="modal-title" id="myModalLabel">Play/Download video</h4>
                        </div>
                        <div  id="videofor">


                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button>

                        </div>
                    </div><!-- /.modal-content -->
                </div><!-- /.modal-dialog -->
            </div><!-- /.modal -->
            <!--modify starts-->
            <div id="con-close-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog modal-lg"> 
                    <div class="modal-content"> 
                        <form method="post" >
                            <div class="modal-header"> 
                                <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                                <h4 class="modal-title">Update Your file</h4> 
                            </div>
                            <div class="modal-body" id="modalModify">

                            </div> 
                            <div class="modal-footer">
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                <button type="submit" name="editFileName" class="btn btn-primary waves-effect waves-light">Save changes</button> 
                            </div>
                        </form>

                    </div> 
                </div>
            </div><!-- /.modal -->
            <div id="con-close-modal-modify" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title">Modify Storage Level</h4> 
                        </div> 
                        <form method="post">
                            <div class="modal-body">
                                <input class="form-control" name="modify_slname" value="<?php echo $rwFolder[\'sl_name\']; ?>" required>
                            </div>
                            <div class="modal-footer"> 
                                <input value="<?php echo $rwFolder[\'sl_id\']; ?>" name="modi" type="hidden" >
                                <input value="<?php echo $rwFolder[\'sl_depth_level\']; ?>" name="dpth" type="hidden" >
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                <input type="submit" name="update" class="btn btn-primary" value="Save Changes">
                            </div>
                        </form>
                    </div> 
                </div>
            </div><!-- /.modal -->  
            <!--start delete model-->
            <div id="con-close-modal2" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title">Delete Document</h4> 
                        </div> 
                        <form method="post">
                            <div class="modal-body">
                                <p style="color: red;">Are you sure that you want to delete this <strong>Document</strong></p>
                            </div>
                            <div class="modal-footer"> 
                                <input type="hidden" id="uid" name="uid">
                                <?php
                                if ($rwgetRole[\'role_id\'] == 1) {
                                    ?>
                                    <button type="submit" id="yes" name="deleteDoc" class="btn btn-danger" value="Yes"> <i class="fa fa-trash-o"></i> Delete</button>
                                    <?php
                                }
                                ?>
                                <button type="submit" id="no" name="deleteDoc" class="btn btn-danger"> <i class="fa fa-recycle"></i>
                                    <?php
                                    if ($rwgetRole[\'role_id\'] == 1) {
                                        echo \'Recycle\';
                                    } else {
                                        echo "Delete";
                                    }
                                    ?>

                                </button> 
                            </div>
                        </form>
                    </div> 
                </div>
            </div><!--ends delete modal -->
            <!--start delete model-->
            <div id="con-close-modal21" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title">Delete Document</h4> 
                        </div> 
                        <form method="post">
                            <div class="modal-body">
                                <p style="color: red;">Are you sure that you want to delete this <strong>Document</strong></p>
                            </div>
                            <div class="modal-footer"> 
                                <input type="hidden" id="uid" name="uid">
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button>
                                <input type="submit" name="deleteDoc" class="btn btn-danger" value="Delete">
                            </div>
                        </form>
                    </div> 
                </div>
            </div><!--ends delete modal -->
            <!--start delete Version of Document model-->
            <div id="deleteVersion" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title">Delete Version of Document</h4> 
                        </div> 
                        <form method="post">
                            <div class="modal-body">
                                <p style="color: red;">Are you sure that you want to delete this version of <strong>Document</strong>. this document will be deleted permanently.</p>
                            </div>
                            <div class="modal-footer"> 
                                <input type="hidden" id="docid" name="docid">
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button>
                                <input type="submit" name="deleteVersionDoc" class="btn btn-danger" value="Delete">
                            </div>
                        </form>
                    </div> 
                </div>
            </div><!--ends delete modal -->
            <div id="full-width-modal" class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog">
                    <div class="modal-content">
                        <div class="modal-header">
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
                            <!--<button type="button" class="btn btn-default pull-right" style="margin-right:3%;"   aria-hidden="true" id="btnPrint"><i class="fa fa-print"></i></button>-->
                            <a href="#"  class="btn btn-default pull-right" id="download"><i class="fa fa-download"></i></a>
                            <h4 class="modal-title" id="myLargeModalLabel">Image Viewer</h4>
                        </div>
                        <div class="modal-body">
                            <div id="Display"></div>
                        </div>
                        <div class="modal-footer">

                            <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button>
                        </div>
                    </div>
                </div>

            </div>
            <script type="text/javascript">

                $("#btnPrint").on("click", function () {
                    //alert(\'hi\');
                    var divContents = $("#Display").html();
                    var printWindow = window.open(\'\', \'\', \'height=800,width=800\');
                    //printWindow.document.write(\'<html><head><title>Image</title>\');
                    //printWindow.document.write(\'</head><body >\');
                    printWindow.document.write(divContents);
                    //printWindow.document.write(\'</body></html>\');
                    printWindow.document.close();
                    printWindow.print();
                });
            </script>
            <!---assign workflow---->
            <div id="assign-workflow" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                <div class="modal-dialog">
                    <div class="modal-content">
                        <div class="modal-header">
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
                            <h4 class="modal-title">Assign in Work flow</h4> 
                        </div>
                        <form method="post" class="form-inline" id="wfasign">
                            <div class="modal-body">
                                <div class="form-group">
                                    <div class="col-md-12">
                                        <label>Assign To:</label>
                                        <select class="form-control" class="selectpicker" data-live-search="true" id="wfid" data-style="btn-white" style="" name="wfid">
                                            <option selected disabled style="background: #808080; color: #121213;">Select Workflow</option>
                                            <?php
                                            $WorkflwGet = mysqli_query($db_con, "select * from tbl_workflow_master") or die(\'Error in getWorkflw Assign:\' . mysqli_error($db_con));
                                            while ($rwWorkflwGet = mysqli_fetch_assoc($WorkflwGet)) {
                                                ?> 
                                                <option value="<?php echo $rwWorkflwGet[\'workflow_id\']; ?>" name="wrkname"><?php echo $rwWorkflwGet[\'workflow_name\']; ?></option>
<?php } ?>
                                        </select>
                                    </div>
                                </div>
                            </div>
                            <div class="modal-footer"> 
                                <input type="hidden" id="mTowf" name="mTowf">
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                <input type="submit" name="assignTo" class="btn btn-primary" value="Submit" >
                            </div>
                        </form>
                    </div>
                </div>
            </div>
            <!--display wait gif image after submit-->
            <div style="display: none; background: rgba(0,0,0,0.5); width: 100%; z-index: 2000; position: fixed; top:0;" id="wait">;

                <img src="assets/images/proceed.gif" alt="load"  style=" margin-left: 48%; margin-top: 250px; width: 100px; height:100px; position: fixed; "/>
            </div>  
            <script>
                //for wait gif display after submit
                var heiht = $(document).height();
                //alert(heiht);
                $(\'#wait\').css(\'height\', heiht);
                $(\'#wfasign\').submit(function () {
                    if ($.trim($("#wfid").val()) != "") {
                        $(\'#wait\').show();
                        //$(\'#wait\').css(\'height\',heiht);
                        $(\'#assign-workflow\').hide();
                        return true;
                    }
                });
            </script>
            <!--Edit metadata-->
            <div id="editmetadata" class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog modal-lg"> 
                    <div class="modal-content"> 
                        <form method="post" enctype="multipart/form-data">
                            <div class="modal-header"> 
                                <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                                <h4 class="modal-title">Edit MetaData</h4> 
                            </div>
                            <div class="modal-body" id="modalModifyMvalue">
                                <img src="assets/images/load.gif" alt="load" class="img-responsive center-block" width="50px"/>
                            </div> 
                            <div class="modal-footer">
                                <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button> 
                                <button type="submit" name="editMetaValue" class="btn btn-primary">Save & Update </button> 
                            </div>
                        </form>

                    </div> 
                </div>
            </div>

            <!---Create sub folder model start ---->
            <div id="con-close-modal1" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title">Add Sub Folder to <b><?php echo $rwFolder[\'sl_name\']; ?></b></h4> 
                        </div> 
                        <form method="post">
                            <div class="modal-body">
                                <input class="form-control" name="create_child" placeholder="Enter Sub Folder Name...">
                            </div>
                            <div class="modal-footer"> 
                                <input value="<?php echo $rwFolder[\'sl_id\']; ?>" name="add_child" type="hidden" >
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                <input type="submit" name="add_storage" class="btn btn-primary" value="CREATE SUB FOLDER">
                            </div>
                        </form>
                    </div> 
                </div>
            </div>
            <!--ends Create child modal --> 
            <!--start delete model-->
            <div id="con-close-modal-del" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title">Delete Storage</h4> 
                        </div> 
                        <form method="post">
                            <div class="modal-body">
                                <p style="color: red;">Are you sure that you want to delete <strong><?php echo $rwFolder[\'sl_name\']; ?></strong> Folder and their Sub-folder?</p>
                            </div>
                            <div class="modal-footer"> 
                                <input value="<?php echo $rwFolder[\'sl_id\']; ?>" name="delsl" type="hidden" >
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button>
                                <input type="submit" name="deleted" class="btn btn-danger" value="Delete">
                            </div>
                        </form>
                    </div> 
                </div>
            </div><!--ends delete modal --> 
            <script>
                $("a#checkout").click(function () {
                    var path = $(this).attr(\'data\');
                    // alert(id);

                    $.post("application/ajax/checkout.php", {CHECKOUT: path}, function (result, status) {
                        window.location.href = "<?php echo basename($_SERVER[\'PHP_SELF\']) . \'?\' . $_SERVER[\'QUERY_STRING\']; ?>";
                    });
                });
                $("a#editMdata").click(function () {
                    var id = $(this).attr(\'data\');
                    // alert(id);

                    $.post("application/ajax/checkin.php", {CHECKIN: id}, function (result, status) {

                    });
                });
                $("a#editRow").click(function () {
                    var id = $(this).attr(\'data\');
                    // alert(id);

                    $.post("application/ajax/updateDocument.php", {ID: id}, function (result, status) {
                        if (status == \'success\') {
                            $("#modalModify").html(result);
                            //alert(result);
                        }
                    });
                });
                $("a#showPic").click(function () {
                    var path = $(this).attr(\'data\');
                    // alert(id);

                    $.post("application/ajax/displayImage.php", {PATH: path}, function (result, status) {
                        if (status == \'success\') {
                            $("#Display").html(result);
                            //alert(result);
                        }
                    });
                });
                $("a#removeRow").click(function () {
                    var id = $(this).attr(\'data\');
                    // alert(id);
                    $("#uid").val(id);
                });
                $("a#deleteVersionDoc").click(function () {
                    var id = $(this).attr("data");
                    $("#docid").val(id);
                });
                $("a#video").click(function () {
                    var id = $(this).attr(\'data\');
                    $.post("application/ajax/videoformat.php", {vid: id}, function (result, status) {
                        if (status == \'success\') {
                            $("#videofor").html(result);
                            //alert(result);

                        }
                    });
                });
                $("a#audio").click(function () {
                    var id = $(this).attr(\'data\');
                    $.post("application/ajax/audioformat.php", {aid: id}, function (result, status) {
                        if (status == \'success\') {
                            $("#foraudio").html(result);
                            //alert(result);

                        }
                    });
                });
                $("a#moveToWf").click(function () {
                    var id = $(this).attr(\'data\');
                    // alert(id);
                    $("#mTowf").val(id);
                });

                //for document share get user ids
                $("input#shreId").click(function () {
                    var Ids = $(this).attr(\'data-doc-id\');
                    //alert(Ids);

                    $.post("application/ajax/shareDocument.php", {DOCIDS: Ids}, function (result, status) {
                        if (status == \'success\') {
                            $("#shre").html(result);
                            // alert(result);
                        }
                    });
                });
            </script>
            <!-- MODAL for addworkflow -->
            <script>

                $("#wfid").change(function () {
                    var wfId = $(this).val();
                    //alert(lbl);
                    $.post("application/ajax/workFlstp.php", {wid: wfId}, function (result, status) {
                        if (status == \'success\') {
                            $("#stp").html(result);
                        }
                    });
                });
                $("#ufw,#verify-comp").click(function (event) {
                    if ($("input#myCheck").is(":checked")) {
                        alert(\'ok\');
                    } else {
                        document.querySelector(\'#inufw\').click();
                    }
                });
            </script>
            <!-- for move level-->
            <div id="con-close-modal4" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title">Move Storage Level</h4> 
                        </div> 
                        <form method="post" class="form-inline">
                            <div class="modal-body">
                                <div class="form-group">
                                    <?php
                                    $moveFolderName = mysqli_query($db_con, "select * from tbl_storage_level where sl_id = $slid") or die(\'Error in move folder name: \' . mysqli_error($db_con));
                                    $rwmoveFolderName = mysqli_fetch_assoc($moveFolderName);
                                    ?>     
                                    <label>Move Folder/File: </label>  <label> <?php echo $rwmoveFolderName[\'sl_name\']; ?></label>
                                    <br><br>
                                    <div class="col-md-12">
                                        <label> Move To: &nbsp;</label>
                                        <select class="form-control" name="moveToParentId" id="parentMoveLevel">

                                            <option selected disabled style="background: #808080; color: #121213;">Select Storage Level</option>

                                            <?php
                                            $storeName = mysqli_query($db_con, "select * from tbl_storage_level where sl_depth_level= \'0\' AND sl_id != \'$slid\' and is_protected=\'0\'") or die(\'Error in move store: \' . mysqli_error($db_con));

                                            while ($rwstoreName = mysqli_fetch_assoc($storeName)) {
                                                ?>
                                                <option value="<?php echo $rwstoreName[\'sl_id\']; ?>"><?php echo $rwstoreName[\'sl_name\']; ?></option>
<?php } ?>
                                        </select>
                                        <br>            
                                        <div class="row">
                                            <div class="col-md-3"></div>

                                            <div class="col-md-9">
                                                <span class="" id="child">

                                                </span>

                                            </div>

                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div class="modal-footer"> 
                                <input value="<?php echo $rwFolder[\'sl_id\']; ?>" name="modi" type="hidden" >
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                <input type="submit" name="move" class="btn btn-primary" value="Move Storage">
                            </div>

                        </form>

                    </div> 
                </div>
            </div>

            <script>

                $("#parentMoveLevel").change(function () {
                    var lbl = $(this).val();
                    //alert(lbl);
                    $.post("application/ajax/parentMoveList.php", {parentId: lbl, levelDepth: 0, sl_id:<?php echo $slid; ?>}, function (result, status) {
                        if (status == \'success\') {
                            $("#child").html(result);
                            //alert(result);
                        }
                    });
                });
                //filter limit

                var url = window.location.href + "?";
                function removeParam(key, sourceURL) {
                    sourceURL = String(sourceURL).replace("#/", "");
                    var rtn = sourceURL.split("?")[0],
                            param,
                            params_arr = [],
                            queryString = (sourceURL.indexOf("?") !== -1) ? sourceURL.split("?")[1] : "";
                    if (queryString !== "") {
                        params_arr = queryString.split("&");
                        for (var i = params_arr.length - 1; i >= 0; i -= 1) {
                            param = params_arr[i].split("=")[0];
                            if (param === key) {
                                params_arr.splice(i, 1);
                            }
                        }
                        rtn = rtn + "?" + params_arr.join("&");
                    } else {
                        rtn = rtn + \'?\';
                    }
                    return rtn;
                }
                jQuery(document).ready(function ($) {
                    $("#limit").change(function () {
                        lval = $(this).val();
                        url = removeParam("limit", url);
                        url = url + "&limit=" + lval;
                        window.open(url, "_parent");
                    });
                });
            </script>
            <div id="con-close-modal7" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title">Share Folder</h4> 
                        </div> 
                        <form method="post">
                            <div class="modal-body">
                                <div class="form-group">
                                    <label> Folder Name</label>
                                    <input type="text" class="form-control" name="modify_slname" id="mstore1"  value="<?php echo $rwFolder[\'sl_name\']; ?>" readonly>
                                </div>

                                <div class="form-group">
                                    <label>Share With</label>
                                    <select name="sharewith[]" id="sharewith" class="form-control select2 multi-select" multiple data-placeholder="Select User">
                                        <option value="">Select User</option>
                                        <?php
                                        $sameGroupIDs = array();
                                        $group = mysqli_query($db_con, "select * from tbl_bridge_grp_to_um where find_in_set(\'$_SESSION[cdes_user_id]\',user_ids)") or die(\'Error\' . mysqli_error($db_con));
                                        while ($rwGroup = mysqli_fetch_assoc($group)) {
                                            $sameGroupIDs[] = $rwGroup[\'user_ids\'];
                                        }
                                        $sameGroupIDs = array_unique($sameGroupIDs);
                                        sort($sameGroupIDs);
                                        $sameGroupIDs = implode(\',\', $sameGroupIDs);
                                        $user = mysqli_query($db_con, "select * from tbl_user_master where user_id in($sameGroupIDs) order by first_name asc");
                                        while ($rwUser = mysqli_fetch_assoc($user)) {
                                            if ($rwUser[\'user_id\'] != 1 && $rwUser[\'user_id\'] != $_SESSION[\'cdes_user_id\']) {
                                                echo \'<option value="\' . $rwUser[\'user_id\'] . \'">\' . $rwUser[\'first_name\'] . \' \' . $rwUser[\'last_name\'] . \'</option>\';
                                            } else {
                                                // echo \'<option value="\' . $rwUser[\'user_id\'] . \'">\' . $rwUser[\'first_name\'] . \' \' . $rwUser[\'last_name\'] . \'</option>\';
                                            }
                                        }
                                        ?>
                                    </select>
                                </div>

                            </div>
                            <div class="modal-footer"> 
                                <input value="<?php echo $slid; ?>" name="slId" type="hidden" >
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                <input type="submit" name="shareFolder" class="btn btn-primary" value="Submit">
                            </div>

                        </form>

                    </div> 
                </div>
            </div><!-- /.modal --> 

            <!-- for copy level-->
            <div id="con-close-modal6" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog modal-lg"> 

                    <div class="modal-content"> 

                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title">Copy Storage</h4> 
                        </div> 
                        <script type="text/javascript" src="./assets/jsCustom/selectcheckbox.js"></script>
                        <form method="post" class="form-inline">
                            <div class="modal-body">

                                <div class="row">
                                    <div class="col-md-12">

                                        <div class="col-md-6 form-group">
                                            <label>Copy Folders:</label>
                                            /<input type="text" readonly id="tocopyfolder" name="toCopyFolder" class="form-control" value="<?php echo $tocpyFolder = $rwFolder[\'sl_name\']; ?>">
                                        </div>
                                        <div class="col-md-6 form-group">
                                            <p class="text-danger" id="error"></p>
                                        </div>
                                        <div class="clearfix"></div>

                                        <div class="col-md-6 form-group">
                                            <label> Copy To: &nbsp;</label>
                                            <select class="form-control" name="moveToParentId" id="parentCopyLevel" style="width: 100%">

                                                <option selected style="background: #808080; color: #121213;">Select Storage Level</option>

                                                <?php
                                                $storeName = mysqli_query($db_con, "select * from tbl_storage_level where sl_depth_level= \'0\' AND sl_id != \'$slid\' and is_protected=\'0\'") or die(\'Error in move store: \' . mysqli_error($db_con));

                                                $rwstoreName = mysqli_fetch_assoc($storeName)
                                                ?>
                                                <option value="<?php echo $rwstoreName[\'sl_id\']; ?>"><?php echo $rwstoreName[\'sl_name\']; ?></option>
                                            </select>
                                        </div>
                                        <div class="clearfix"></div>

                                        <div class="col-md-6 form-group">
                                            <span class="" id="FilesCopy">
                                            </span>
                                        </div>

                                    </div>
                                </div>      
                                <div class="clearfix"></div>
                            </div>
                            <div class="modal-footer"> 
                                <input value="<?php echo $rwFolder[\'sl_id\']; ?>" name="modi" type="hidden" >
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                <input type="submit" name="copyLevel" class="btn btn-primary" value="Copy Storage">
                            </div>

                        </form>
                    </div>
                </div> 
            </div>

            <div id="export" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog modal-lg"> 
<!--                    <span id="errmessage" style="color:red;display:none;">Please select Files for Delete.</span>-->
                    <div class="modal-content"> 

                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title">Export CSV</h4>
                        </div> 
                        <script type="text/javascript" src="./assets/jsCustom/selectcheckbox.js"></script>
                        <form method="post" class="form-inline" action="export.php">
                            <div class="modal-body">

                                <div class="row">
                                    <div class="col-md-12">

                                        <div class="col-md-6 form-group">
                                            <label>All Files in selected folder</label>

                                        </div>
                                        <div class="col-md-6 form-group">

                                            <input type="radio" name="radExp" class="form-control radio" value="all" required>
                                        </div>

                                        <div class="clearfix"></div>

                                        <div class="col-md-6 form-group">
                                            <label></label>                                       
                                        </div>
                                        <div class="clearfix"></div>
                                    </div>
                                </div>      
                                <div class="clearfix"></div>
                            </div>
                            <div class="modal-footer"> 
                                <input value="<?php echo $slid; ?>" name="slid" type="hidden" >
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                <input type="submit" name="startExport" class="btn btn-primary" value="Start Export">
                            </div>

                        </form>
                    </div>
                </div> 
            </div>
            <!-- for bulk downloads files-->
            <?php
            $validate = mysqli_query($db_con, "select doc_path,old_doc_name,doc_extn,doc_id from tbl_document_master where doc_name=\'$slid\' and flag_multidelete=1");
            if (mysqli_num_rows($validate) > 0) {
                ?>
                <div id="bulkdownload" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                    <div class="modal-dialog"> 
                        <div class="modal-content"> 
                            <div class="modal-header"> 
                                <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                                <h4 class="modal-title">Downloads All Files of selected folder only</h4>
                            </div> 
                            <script type="text/javascript" src="./assets/jsCustom/selectcheckbox.js"></script>
                            <form method="post" class="form-inline">
                                <div class="modal-body">
                                    <div class="row">
                                        <div class="col-md-12">
                                            <div class="form-group">
                                                <textarea class="form-control" name="reason" cols="65" rows="5" placeholder="Write Reason for Downloding files..." required></textarea>
                                            </div>
                                        </div>
                                    </div> 
                                </div>
                                <div class="modal-footer"> 
                                    <input value="<?php echo $slid; ?>" name="slid" type="hidden" >
                                    <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                    <input type="submit" name="bulkDownload" id="btnSave" class="btn btn-primary" value="Download">
                                </div>

                            </form>

                        </div>
                    </div>
                </div>
<?php } else { ?>
                <div id="bulkdownload" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                    <div class="modal-dialog"> 
                        <div class="modal-content"> 
                            <div class="modal-header"> 
                                <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                                <h4 class="modal-title"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Here\'s a message!</h4>
                            </div> 
                            <div class="modal-body">
                                <div class="row">
                                    <div class="col-md-12">
                                        <label style="color:red;">No Files Exist in Selected Storage</label>                       
                                    </div>
                                </div> 
                            </div>
                            <div class="modal-footer"> 
                                <input value="<?php echo $slid; ?>" name="slid" type="hidden" >
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                            </div>
                        </div>
                    </div>
                </div>
<?php } ?>  
            <script>
                $(\'#btnSave\').click(function () {
                    $(\'#bulkdownload\').modal(\'hide\');
                });

                $("#parentCopyLevel").change(function () {
                    var lbl = $(this).val();

                    var copyf = $("#tocopyfolder").val();
                    var sfolder = $(this).find(":selected").text();
                    //alert(lbl);
                    $.post("application/ajax/parentCopyList.php", {parentId: lbl, levelDepth: 0, sl_id:<?php echo $slid; ?>, folder: copyf, sfolder: sfolder}, function (result, status) {
                        if (status == \'success\') {
                            $("#FilesCopy").html(result);
                            //alert(result);
                            $.post("application/ajax/checkDuplicate.php", {parentId: lbl, levelDepth: 0, folder: copyf}, function (result, status) {
                                if (status == \'success\') {
                                    if (result == 0) {
                                        $("#tocopyfolder").attr("readonly", "readonly");
                                        $("#tocopyfolder").attr("readonly");
                                    } else {
                                        $("#error").html(copyf + " is already exist in " + sfolder + ". Please rename storage name.");
                                        $("#tocopyfolder").removeAttr("readonly");
                                    }
                                }
                            });
                        }
                    });
                });
            </script>
            <!-- move selected files---->
            <div id="move-selected-files" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog">
                    <div class="modal-content" > 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
                            <h4 class="modal-title" id="unseMove"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Here\'s a message!</h4>
                            <h4 class="modal-title" style="display:none;" id="mov"> Move Selected Files </h4> 
                        </div>
                        <div id="unselected" style="display:none;">
                            <div class="modal-body">
                                <h5 class="text-alert"> Please select Files for move.</h5>
                            </div>

                            <div class="modal-footer"> 
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                            </div>
                        </div>
                        <div id="selected">
                            <form method="post" class="form-inline">
                                <?php
                                $moveFolderName = mysqli_query($db_con, "select * from tbl_storage_level where sl_id = $slid") or die(\'Error in move folder name: \' . mysqli_error($db_con));
                                $rwmoveFolderName = mysqli_fetch_assoc($moveFolderName);
                                ?>   
                                <div class="modal-body">
                                    <input type="hidden" name="doc_id_smove_multi" id="doc_id_smove_multi" value="">
                                    <input type="hidden" name="sl_id_move_multi" id="sl_id_move_multi" value="<?php echo $slid; ?>">
                                    <div class="form-group">

                                        <label>Move Folder/File: </label>  <label> <?php echo $rwmoveFolderName[\'sl_name\']; ?></label>
                                        <br><br>
                                        <div class="col-md-12">
                                            <label> Move To: &nbsp;</label>
                                            <select class="form-control" name="moveToParentId" id="moveToParentId">

                                                <option selected disabled style="background: #808080; color: #121213;">Select Storage Level</option>

                                                <?php
                                                if ($slid == 113) {
                                                    $storeName = mysqli_query($db_con, "select * from tbl_storage_level where sl_parent_id=\'$slperm\'") or die(\'Error in move store: \' . mysqli_error($db_con));
                                                } else {
                                                    $storeName = mysqli_query($db_con, "select * from tbl_storage_level where sl_id=\'$slperm\'") or die(\'Error in move store: \' . mysqli_error($db_con));
                                                }
                                                while ($rwstoreName = mysqli_fetch_assoc($storeName)) {
                                                    ?>
                                                    <option value="<?php echo $rwstoreName[\'sl_id\']; ?>"><?php echo $rwstoreName[\'sl_name\']; ?></option>
                                                <?php }
                                                ?>
                                            </select>
                                            <br>            
                                            <div class="row">
                                                <div class="col-md-3"></div>

                                                <div class="col-md-9">
                                                    <span class="" id="child1">

                                                    </span>

                                                </div>

                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <div class="modal-footer"> 
                                    <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                    <input type="submit" name="movemulti" class="btn btn-primary" value="Move files">
                                </div>

                            </form>
                        </div>
                    </div> 
                </div>
            </div>
            <script>

                $("#moveToParentId").change(function () {
                    var lbl = $(this).val();
                    //alert(lbl);
                    $.post("application/ajax/parentMoveList_1.php", {parentId: lbl, levelDepth: 0, sl_id:<?php echo $slid; ?>}, function (result, status) {
                        if (status == \'success\') {
                            $("#child1").html(result);
                            //alert(result);
                        }
                    });
                });
                //filter limit

                var url = window.location.href + "?";
                function removeParam(key, sourceURL) {
                    sourceURL = String(sourceURL).replace("#/", "");
                    var rtn = sourceURL.split("?")[0],
                            param,
                            params_arr = [],
                            queryString = (sourceURL.indexOf("?") !== -1) ? sourceURL.split("?")[1] : "";
                    if (queryString !== "") {
                        params_arr = queryString.split("&");
                        for (var i = params_arr.length - 1; i >= 0; i -= 1) {
                            param = params_arr[i].split("=")[0];
                            if (param === key) {
                                params_arr.splice(i, 1);
                            }
                        }
                        rtn = rtn + "?" + params_arr.join("&");
                    } else {
                        rtn = rtn + \'?\';
                    }
                    return rtn;
                }
                jQuery(document).ready(function ($) {
                    $("#limit").change(function () {
                        lval = $(this).val();
                        url = removeParam("limit", url);
                        url = url + "&limit=" + lval;
                        window.open(url, "_parent");
                    });
                });
            </script>
            <!--copy selected files--->
            <div id="copy-selected-files" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title" id="cop"> <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Here\'s a message!</h4> 
                            <h4 class="modal-title" style="display:none;" id="ctitle">Copy Selected Files in Storage</h4> 
                        </div> 

                        <div id="unselected1" style="display:none;">
                            <div class="modal-body">
                                <h5 class="text-alert">Please select Files for Copy.</h5>
                            </div>
                            <div class="modal-footer"> 
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                            </div>
                        </div>
                        <div id="selected1">
                            <form method="post" class="form-inline">
                                <div class="modal-body" id="csf">
                                    <div class="row">
                                        <div class="col-md-12">
                                            <div class="col-md-6 form-group">
                                                <label>Copy Files:</label>
                                                <input type="text" readonly id="tocopyfolder" name="toCopyFolder" class="form-control" value="<?php echo $tocpyFolder = $rwFolder[\'sl_name\']; ?>">
                                            </div>
                                            <div class="col-md-6 form-group">
                                                <p class="text-danger" id="error"></p>
                                            </div>
                                            <div class="clearfix"></div>

                                            <div class="col-md-6 form-group">
                                                <input type="hidden" name="doc_ids" id="doc_ids" values="">
                                                <input type="hidden" name="sl_id4" id="sl_id4" values="">

                                                <label> Copy To: &nbsp;</label>
                                                <select class="form-control" name="copyToParentId" id="copyToParentId" style="width: 100%">

                                                    <option selected style="background: #808080; color: #121213;">Select Storage Level</option>

                                                    <?php
                                                    //$storeLevel = mysqli_query($db_con, "select * from tbl_storage_level where sl_id=\'$slperm\'") or die(\'Error in move store: \' . mysqli_error($db_con));
                                                    //$rwstoreLevel = mysqli_fetch_assoc($storeLevel);


                                                    if ($slid == 113) {
                                                        $storeName = mysqli_query($db_con, "select * from tbl_storage_level where sl_parent_id=\'$slperm\'") or die(\'Error in move store: \' . mysqli_error($db_con));
                                                    } else {
                                                        $storeName = mysqli_query($db_con, "select * from tbl_storage_level where sl_id=\'$slperm\'") or die(\'Error in move store: \' . mysqli_error($db_con));
                                                    }
                                                    while ($rwstoreName = mysqli_fetch_assoc($storeName)) {
                                                        ?>
                                                        <option value="<?php echo $rwstoreName[\'sl_id\']; ?>"><?php echo $rwstoreName[\'sl_name\']; ?></option>
                                                        <?php
                                                    }
                                                    ?>
                                                </select>
                                            </div>
                                            <div class="clearfix"></div>

                                            <div class="col-md-6 form-group">
                                                <span class="" id="child2">
                                                </span>
                                            </div>

                                        </div>
                                    </div>   


                                    <div class="clearfix"></div>
                                </div>
                                <div class="modal-footer"> 
                                    <input value="<?php echo $rwFolder[\'sl_id\']; ?>" name="modi" type="hidden" >
                                    <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                    <input type="submit" name="copyFiles" class="btn btn-primary" value="Copy Files">
                                </div>

                            </form>
                        </div>
                    </div>
                </div> 
            </div>
            <script>

                $("#copyToParentId").change(function () {
                    var lbl = $(this).val();
                    //alert(lbl);
                    $.post("application/ajax/parentMoveList_2.php", {parentId: lbl, levelDepth: 0, sl_id:<?php echo $slid; ?>}, function (result, status) {
                        if (status == \'success\') {
                            $("#child2").html(result);
                            //alert(result);
                        }
                    });
                });
                //filter limit

                var url = window.location.href + "?";
                function removeParam(key, sourceURL) {
                    sourceURL = String(sourceURL).replace("#/", "");
                    var rtn = sourceURL.split("?")[0],
                            param,
                            params_arr = [],
                            queryString = (sourceURL.indexOf("?") !== -1) ? sourceURL.split("?")[1] : "";
                    if (queryString !== "") {
                        params_arr = queryString.split("&");
                        for (var i = params_arr.length - 1; i >= 0; i -= 1) {
                            param = params_arr[i].split("=")[0];
                            if (param === key) {
                                params_arr.splice(i, 1);
                            }
                        }
                        rtn = rtn + "?" + params_arr.join("&");
                    } else {
                        rtn = rtn + \'?\';
                    }
                    return rtn;
                }
                jQuery(document).ready(function ($) {
                    $("#limit").change(function () {
                        lval = $(this).val();
                        url = removeParam("limit", url);
                        url = url + "&limit=" + lval;
                        window.open(url, "_parent");
                    });
                });
            </script>

            <?php
            if (isset($_POST[\'assignMeta\'])) {
                $childName = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'id\']);
                $childName = mysqli_real_escape_string($db_con, $childName);
                $fields = $_POST[\'my_multi_select1\'];
                $flag = 0;
                if (!empty($childName)) {
                    $reset = mysqli_query($db_con, "delete from tbl_metadata_to_storagelevel where sl_id=\'$childName\'");
                }
                $metaNames = array();
                foreach ($fields as $field) {
                    if (!empty($childName)) {
                        $field = preg_replace("/[^A-Za-z0-9 ]/", "", $field);
                        //check meta data assigned or not
                        $match = mysqli_query($db_con, "select * from tbl_metadata_to_storagelevel where sl_id=\'$childName\' and metadata_id=\'$field\'") or die(\'Error:\' . mysqli_error($db_con));
                        if (mysqli_num_rows($match) <= 0) {
                            //assign meta data
                            $create = mysqli_query($db_con, "insert into tbl_metadata_to_storagelevel (`metadata_id`, `sl_id`) values(\'$field\',\'$childName\')") or die(\'Error\' . mysqli_error($db_con));
                            // find meta data details
                            $metan = mysqli_query($db_con, "select * from tbl_metadata_master where id=\'$field\'");
                            $rwMetan = mysqli_fetch_assoc($metan);
                            $metaNames[] = $rwMetan[\'field_name\'];
                            //check meta data in table tbl_document_master
                            $checkDoc = mysqli_query($db_con, "SHOW COLUMNS FROM tbl_document_master LIKE \'$rwMetan[field_name]\'");
                            if (mysqli_num_rows($checkDoc) <= 0) { //if not
                                $metaCreateDoc = mysqli_query($db_con, "ALTER TABLE tbl_document_master ADD `$rwMetan[field_name]` $rwMetan[data_type]($rwMetan[length_data])  null");
                            }
                            $flag = 1;
                            $sl_id = $childName;
                        } else {
                            $sl_id = $childName;
                        }
                    }
                }
                if ($flag == 1) {

                    $metaNames = implode(",", $metaNames);
                    $strgeName = mysqli_query($db_con, "select sl_name from tbl_storage_level where sl_id = \'$sl_id\'");
                    $rwstrgeName = mysqli_fetch_assoc($strgeName);
                    $storageName = $rwstrgeName[\'sl_name\'];
                    $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null, \'$sl_id\',\'MetaData($metaNames)  Assigned on storage $storageName\',\'$date\',null,\'$host\',null)") or die(\'error log: \' . mysqli_error($db_con));
                    echo \'<script>metasuccess("storageFiles?id=\' . $_GET[\'id\'] . \'");</script>\';
                } else {
                    echo \'<script>metafailed("storageFiles?id=\' . $_GET[\'id\'] . \'");</script>\';
                }
                mysqli_close($db_con);
            }
            ?>
            <!--move Storage-->
            <?php
            if (isset($_POST[\'move\'])) {

                //echo $_POST[\'moveToId\']; die;

                if (!empty($_POST[\'lastMoveId\'])) {

                    $checkDublteStorage = mysqli_query($db_con, "Select * from tbl_storage_level where sl_id = \'$slid\'") or die(\'Error in checkDublteStorage:\' . mysqli_error($db_con));

                    $rwcheckDublteStorage = mysqli_fetch_assoc($checkDublteStorage);
                    $lmoveid = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[lastMoveId]);
                    $sql_child = "select * FROM tbl_storage_level WHERE sl_parent_id = \'$lmoveid\' AND sl_name = \'$rwcheckDublteStorage[sl_name]\'";

                    $sql_child_run = mysqli_query($db_con, $sql_child) or die(\'Error:\' . mysqli_error($db_con));

                    if (mysqli_num_rows($sql_child_run)) {
                        $moveToId = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'lastMoveId\']);
                        $moveToName = mysqli_query($db_con, "Select * from tbl_storage_level where sl_id = \'$moveToId\'") or die(\'Error in checkDublteStorage:\' . mysqli_error($db_con));
                        $rwmoveToName = mysqli_fetch_assoc($moveToName);
                        $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,\'$moveToId\',\'Storage $rwFolder[sl_name] already exist in $rwmoveToName[sl_name].\',\'$date\', null,\'$host\',\'\')") or die(\'error log1: \' . mysqli_error($db_con));
                        echo\'<script>taskFailed("storage","Storage Name Having Same Name Already Exist !");</script>\';
                    } else {
                        $moveToId = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'lastMoveId\']);
                        $lastMoveIdLevel = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'lastMoveIdLevel\']);
                        $lastMoveIdLevel = $lastMoveIdLevel + 1;

                        $moveStorage = "update tbl_storage_level set sl_parent_id = \'$moveToId\', sl_depth_level = \'$lastMoveIdLevel\' where sl_id = \'$slid\'";
                        $moveStorage_run = mysqli_query($db_con, $moveStorage) or die(\'Error in move Stroge : \' . mysqli_error($db_con));

                        $moveToName = mysqli_query($db_con, "Select * from tbl_storage_level where sl_id = \'$moveToId\'") or die(\'Error in checkDublteStorage:\' . mysqli_error($db_con));
                        $rwmoveToName = mysqli_fetch_assoc($moveToName);

                        $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,\'$moveToId\',\'Storage $rwFolder[sl_name] moved to $rwmoveToName[sl_name]\',\'$date\',null,\'$host\',\'\')") or die(\'error : \' . mysqli_error($db_con));
                        echo\'<script>taskSuccess("storage","Storage Moved Successfully !");</script>\';
                    }
                }
                mysqli_close($db_con);
            }
            ?>
            <!--copy storage-->
            <?php
            if (isset($_POST[\'copyLevel\'])) {
                if (isset($_POST[\'toCopyFolder\']) && !empty($_POST[\'toCopyFolder\'])) {
                    $toCopyFolder = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'toCopyFolder\']);
                    if (isset($_POST[\'lastCopyToId\']) && !empty($_POST[\'lastCopyToId\'])) {
                        $lastCopyToId = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'lastCopyToId\']);

                        ;
                        copyStorage($slid, $lastCopyToId, $toCopyFolder, $date, $host, $fileserver, $port, $ftpUser, $ftpPwd);
                    }
                }
                mysqli_close($db_con);
            }
            ?>
            <!--modify storage level starts-->
            <?php
            if (isset($_POST[\'update\']) && $_SERVER[\'PHP_SELF\']) {
                $sl_id = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'modi\']);
                $modify = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'modify_slname\']);
                $depth = $_POST[\'dpth\'];
                $modiStorage = mysqli_query($db_con, "Select * from tbl_storage_level where sl_name = \'$modify\' and sl_depth_level=\'$depth\'") or die(\'Error in checkDublteStorage:\' . mysqli_error($db_con));
                if (mysqli_num_rows($modiStorage) <= 0) {
                    $modiStorage = mysqli_query($db_con, "Select * from tbl_storage_level where sl_id = \'$sl_id\'") or die(\'Error in checkDublteStorage:\' . mysqli_error($db_con));
                    $rwmodiStorage = mysqli_fetch_assoc($modiStorage);
                    $updateToName = $rwmodiStorage[\'sl_name\'];

                    $sql = "update tbl_storage_level set sl_name = \'$modify\' WHERE sl_id = \'$sl_id\' ";
                    $sql_run = mysqli_query($db_con, $sql) or die("error:" . mysqli_errno($db_con));

                    $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,\'$sl_id\',\'Storage level $updateToName rename to $modify.\',\'$date\', null,\'$host\',\'\')") or die(\'error : \' . mysqli_error($db_con));
                    echo\'<script>taskSuccess("storageFiles?id=\' . urlencode(base64_encode($sl_id)) . \'","Storage Updaetd Successfully !");</script>\';
                } else {
                    echo\'<script>taskFailed("storageFiles?id=\' . urlencode(base64_encode($sl_id)) . \'","Storage Name Already Exists at Same Level!");</script>\';
                }
            }
            ?>
            <!---delete storage level start---->
            <?php
            if (isset($_POST[\'deleted\'])) {
                $sl_id = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'delsl\']);
                $sl_id = mysqli_real_escape_string($db_con, $sl_id);
                $deleteStorage = mysqli_query($db_con, "Select * from tbl_storage_level where sl_id = \'$sl_id\'") or die(\'Error :\' . mysqli_error($db_con));
                $rwdeleteStorage = mysqli_fetch_assoc($deleteStorage);
                $deletStorageName = $rwdeleteStorage[\'sl_name\'];
                $dirPath = "extract-here/" . $deletStorageName;
                delStrg($sl_id, $fileserver, $port, $ftpUser, $ftpPwd);
                rmdir($dirPath);
                mysqli_query($db_con, "DELETE FROM tbl_storage_level WHERE sl_id=\'$sl_id\'") or die(\'Error:\' . mysqli_error($db_con));
                $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,\'$sl_id\',\'Storage Name $deletStorageName deleted.\',\'$date\', null,\'$host\',\'\')") or die(\'error :\' . mysqli_error($db_con));
                $delParentId = $rwdeleteStorage[\'sl_parent_id\'];
                echo\'<script>taskSuccess("storageFiles?id=\' . urlencode(base64_encode($delParentId)) . \'","Storage Deleted Successfully !");</script>\';

                mysqli_close($db_con);
            }
            ?>
            <!--Add Storage Level -->
            <?php
            if (isset($_POST[\'add_storage\'])) {
                $sl_id = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'add_child\']);
                $sl_id = mysqli_real_escape_string($db_con, $sl_id);
                $create = mysqli_real_escape_string($db_con, $create);
                $create = preg_replace(\'/[^a-zA-Z0-9- ]/\', \'\', mysqli_real_escape_string($db_con, $_POST[\'create_child\']));
                $checkLvlName = mysqli_query($db_con, "select * from tbl_storage_level where sl_parent_id=\'$sl_id\' AND sl_name = \'$create\'") or die(\'Error in checkLvlName:\' . mysqli_error($db_con));
                if (mysqli_num_rows($checkLvlName) > 0) {

                    echo\'<script>taskFailed("storage?id=\' . urlencode(base64_encode($sl_id)) . \'","Storage of Same Name Already Exist !");</script>\';
                } else {

                    $parent = mysqli_query($db_con, "select * from tbl_storage_level where sl_id=\'$sl_id\'") or die(\'Error:\' . mysqli_error($db_con));

                    $rwParent = mysqli_fetch_assoc($parent);

                    $level = $rwParent[\'sl_depth_level\'] + 1;
                    if (!empty($create)) {
                        $sql = "insert into tbl_storage_level(sl_id, sl_name, sl_parent_id, sl_depth_level)VALUES (null, \'$create\', \'$sl_id\', \'$level\')";
                        $sql_run = mysqli_query($db_con, $sql) or die("error:" . mysqli_error($db_con));
                        $newChildId = mysqli_insert_id($db_con);
                        $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,\'$newChildId\',\'New Child $create Created.\',\'$date\', null,\'$host\',\'\')") or die(\'error :\' . mysqli_error($db_con));
                        echo\'<script>taskSuccess("storage?id=\' . urlencode(base64_encode($sl_id)) . \'","Child Created Successfully !");</script>\';
                    }
                }
                mysqli_close($db_con);
            }
            ?>
            <?php
            //asign doc to workflow
            if (isset($_POST[\'assignTo\'])) {
                echo \'workflow id: \' . $wfid = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'wfid\']);
                echo \'doc id: \' . $dcId = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'mTowf\']);

                $wfd = mysqli_query($db_con, "select * from tbl_workflow_master where workflow_id=\'$wfid\'");
                $rwWfd = mysqli_fetch_assoc($wfd);
                $workFlowName = $rwWfd[\'workflow_name\'];
                $workFlowArray = explode(" ", $workFlowName);
                $ticket = \'\';
                for ($w = 0; $w < count($workFlowArray); $w++) {
                    $name = $workFlowArray[$w];
                    $ticket = $ticket . substr($name, 0, 1);
                }
                $user_id = $_SESSION[\'cdes_user_id\'];
                $ticket = $ticket . \'_\' . $user_id . \'_\' . strtotime($date);
                $id = preg_replace("/[^A-Za-z0-9 ]/", "", base64_decode(urldecode(@$_GET[\'id\'])));  //get docId from url
                $id = $id . \'_\' . $wfid;
                if (!empty($wfid)) {

                    $chkrw = mysqli_query($db_con, "select * from tbl_task_master where workflow_id = \'$wfid\'") or die(\'Error:\' . mysqli_error($db_con));

                    if (mysqli_num_rows($chkrw) > 0) {

                        $uptDocName = mysqli_query($db_con, "UPDATE tbl_document_master SET doc_name = \'$id\', storage_flag=\'0\' where doc_id = \'$dcId\'") or die(\'error update:\' . mysqli_error($db_con));

                        $getStep = mysqli_query($db_con, "select * from tbl_step_master where workflow_id = \'$wfid\' ORDER BY step_order ASC LIMIT 1") or die(\'Error:\' . mysqli_error($db_con));
                        $getStpId = mysqli_fetch_assoc($getStep);
                        $stpId = $getStpId[\'step_id\'];

                        $getTask = mysqli_query($db_con, "select * from tbl_task_master where step_id = \'$stpId\' ORDER BY task_order ASC LIMIT 1") or die(\'Error:\' . mysqli_error($db_con));
                        $getTaskId = mysqli_fetch_assoc($getTask);
                        $tskId = $getTaskId[\'task_id\'];

                        $getTaskDl = mysqli_query($db_con, "select * from tbl_task_master where task_id=\'$tskId\'") or die(\'Error:\' . mysqli_error($db_con));
                        $rwgetTaskDl = mysqli_fetch_assoc($getTaskDl);

                        if ($rwgetTaskDl[\'deadline_type\'] == \'Date\' || $rwgetTaskDl[\'deadline_type\'] == \'Hrs\') {

                            $endDate = date(\'Y-m-d H:i:s\', (strtotime($date) + $rwgetTaskDl[\'deadline\'] * 60));
                        }
                        if ($rwgetTaskDl[\'deadline_type\'] == \'Days\') {

                            $endDate = date(\'Y-m-d H:i:s\', (strtotime($date) + $rwgetTaskDl[\'deadline\'] * 24 * 60 * 60));
                        }

                        $insertInTask = mysqli_query($db_con, "INSERT INTO tbl_doc_assigned_wf(task_id, doc_id, start_date, end_date, task_status, assign_by, task_remarks,ticket_id) VALUES (\'$tskId\', \'$dcId\', \'$date\', \'$endDate\', \'Pending\', \'$user_id\', \'$taskRemark\',\'$ticket\')") or die(\'Erorr: hh\' . mysqli_error($db_con));
                        $idins = mysqli_insert_id($db_con);

                        $getTask = mysqli_query($db_con, "select * from tbl_task_master where task_id = \'$tskId\'") or die(\'Errort:\' . mysqli_error($db_con));
                        $rwgetTask = mysqli_fetch_assoc($getTask);
                        $TskStpId = $rwgetTask[\'step_id\'];
                        $TskWfId = $rwgetTask[\'workflow_id\'];
                        $TskOrd = $rwgetTask[\'task_order\'];
                        $nextTaskOrd = $TskOrd + 1;
                        nextTaskAsin($nextTaskOrd, $TskWfId, $TskStpId, $dcId, $date, $user_id, $db_con, $taskRemark, $ticket);
                        if ($insertInTask) {

                            require_once \'./mail.php\';
                            $mail = assignTask($ticket, $idins, $db_con, $projectName);
                            if ($mail) {

                                echo \'<script>uploadSuccess("index", "Submitted Successfully!!");</script>\';
                            } else {

                                echo \'<script>taskFailed("index", "Opps!! Mail not sent !")</script>\';
                            }
                        } else {
                            echo \'<script>taskFailed("index", "Opps!! Submission failed !")</script>\';
                        }
                    } else {
                        echo \'<script>taskFailed("index", "There is no task in this workflow !")</script>\';
                    }
                } else {
                    echo\'<script>taskFailed(" ","Please Select WorkFlow !");</script>\';
                }
                mysqli_close($db_con);
            }
            ?>
            <!--delete doc-->  
            <?php
            if (isset($_POST[\'Delmultiple\'])) {
                $permission = trim($_POST[\'Delmultiple\']);
                $del_sl_id = explode($_POST[\'sl_id1\']);
                $docDelete = trim($_POST[\'DelFile\']);
                $user_id4 = $_SESSION[\'cdes_user_id\'];
                $chekUsr = mysqli_query($db_con, "select * from tbl_bridge_role_to_um where FIND_IN_SET(\'$user_id4\', user_ids) > 0") or die(\'Error:\' . mysqli_error($db_con));
                $rwcheckUser = mysqli_fetch_assoc($chekUsr);
                $getDocPath = mysqli_query($db_con, "select doc_path,old_doc_name,doc_name from tbl_document_master where doc_id in($docDelete) or substring_index(doc_name,\'_\',-1) IN($docDelete)") or die(\'Error:\' . mysqli_error($db_con));
                while ($rwgetDocPath = mysqli_fetch_assoc($getDocPath)) {
                    $filePath[] = $rwgetDocPath[\'doc_path\'];
                    $path = substr($rwgetDocPath[\'doc_path\'], 0, strrpos($rwgetDocPath[\'doc_path\'], \'/\') + 1);
                    $pathtxt[] = \'extract-here/\' . $path;
                    $filename[] = $rwgetDocPath[\'old_doc_name\'];
                    $storgId = $rwgetDocPath[\'doc_name\'];
                }
                if ($rwcheckUser[\'role_id\'] == 1 && $permission == "Yes") {
                    $del = mysqli_query($db_con, "DELETE FROM tbl_document_master WHERE doc_id in($docDelete) or substring_index(doc_name,\'_\',-1) IN($docDelete)") or die(\'Error:\' . mysqli_error($db_con));
                    $delshareDoc = mysqli_query($db_con, "DELETE FROM tbl_document_share WHERE doc_ids in($docDelete)") or die(\'Error:\' . mysqli_error($db_con));
                    foreach ($filePath as $filePaths) {
                        $path = \'extract-here/\' . $filePaths;
                        if (FTP_ENABLED) {

                            $ftp = new ftp();
                            $ftp->conn("$fileserver", "$port", "$ftpUser", "$ftpPwd");
                            $ftp->singleFileDelete(ROOT_FTP_FOLDER . \'/\' . $filePaths);
                            $arr = $ftp->getLogData();
                            if ($arr[\'error\'] != "") {

                                echo \'<h2>Error:</h2>\' . implode(\'<br />\', $arr[\'error\']);
                            }
                        } else {
                            unlink($path);
                        }
                    }
                    if ($del) {
                        foreach ($filename as $filenames) {
                            $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,null,\'Storage Document $filenames Deleted\',\'$date\',null,\'$host\',null)") or die(\'error : \' . mysqli_error($db_con));
                        }

                        echo\'<script>taskSuccess("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Document Deleted Successfully !");</script>\';
                    } else {
                        echo\'<script>taskFailed("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Document not Deleted  !");</script>\';
                    }
                } elseif ($rwcheckUser[\'role_id\'] == 1 && $permission == "No") {
                    $deletefilename1 = mysqli_query($db_con, "UPDATE tbl_document_master SET flag_multidelete=0 WHERE doc_id in($docDelete) or substring_index(doc_name,\'_\',-1) IN($docDelete)") or die(\'Error:\' . mysqli_error($db_con));
                    if ($deletefilename1) {
                        foreach ($filename as $filenames) {
                            $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,null,\'Storage Document $filenames Deleted\',\'$date\',null,\'$host\',null)") or die(\'error : \' . mysqli_error($db_con));
                        }

                        echo\'<script>taskSuccess("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Document Deleted Successfully !");</script>\';
                    } else {
                        echo\'<script>taskFailed("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Document not Deleted  !");</script>\';
                    }
                } else {
                    $deletefilename1 = mysqli_query($db_con, "UPDATE tbl_document_master SET flag_multidelete=0 WHERE doc_id in($docDelete) or substring_index(doc_name,\'_\',-1) IN($docDelete)") or die(\'Error:\' . mysqli_error($db_con));
                    if ($deletefilename1) {
                        foreach ($filename as $filenames) {
                            $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,null,\'Storage Document $filenames Deleted\',\'$date\',null,\'$host\',null)") or die(\'error : \' . mysqli_error($db_con));
                        }
                        echo\'<script>taskSuccess("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Document Deleted Successfully !");</script>\';
                    } else {
                        echo\'<script>taskFailed("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Document not Deleted  !");</script>\';
                    }
                }
                mysqli_close($db_con);
            }
            if (isset($_POST[\'deleteDoc\'])) {
                $id = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'uid\']);
                $id = mysqli_real_escape_string($db_con, $id);
                $permission = preg_replace("/[^A-Za-z0-9 ]/", "", trim($_POST[\'deleteDoc\']));
                $permission = mysqli_real_escape_string($db_con, $permission);
                $getDocPath = mysqli_query($db_con, "select * from tbl_document_master where doc_id=\'$id\' or substring_index(doc_name,\'_\',-1)=\'$id\'") or die(\'Error:\' . mysqli_error($db_con));
                $rwgetDocPath = mysqli_fetch_assoc($getDocPath);
                $filePath = $rwgetDocPath[\'doc_path\'];
                $delfilename = $rwgetDocPath[\'old_doc_name\'];
                $deldocId = $rwgetDocPath[\'doc_id\'];
                $storgId = $rwgetDocPath[\'doc_name\'];
                if ($rwcheckUser[\'role_id\'] == 1 && $permission == "Yes") {

                    $path = substr($rwgetDocPath[\'doc_path\'], 0, strrpos($rwgetDocPath[\'doc_path\'], \'/\') + 1);
                    $pathtxt = \'extract-here/\' . $path . \'TXT/\' . $id . \'.txt\';

                    $del = mysqli_query($db_con, "DELETE FROM tbl_document_master WHERE doc_id =\'$id\' or substring_index(doc_name,\'_\',-1)=\'$id\'") or die(\'Error:\' . mysqli_error($db_con));
                    $delDocShare = mysqli_query($db_con, "DELETE FROM tbl_document_share WHERE doc_ids =\'$id\'") or die(\'Error:\' . mysqli_error($db_con));
                    if ($del) {
                        if (FTP_ENABLED) {
                            $ftp = new ftp();
                            $ftp->conn("$fileserver", "$port", "$ftpUser", "$ftpPwd");
                            $ftp->singleFileDelete(ROOT_FTP_FOLDER . \'/\' . $filePath);
                            $arr = $ftp->getLogData();
                            if ($arr[\'error\'] != "") {

                                echo \'<h2>Error:</h2>\' . implode(\'<br />\', $arr[\'error\']);
                            }
                        } else {
                            unlink(\'extract-here/\' . $filePath);
                        }

                        unlink($pathtxt);
                        $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `doc_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,null, \'$deldocId\', \'Storage Document $delfilename Deleted\',\'$date\',null,\'$host\',null)") or die(\'error : \' . mysqli_error($db_con));
                        echo\'<script>taskSuccess("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Document Deleted Successfully !");</script>\';
                    } else {
                        echo\'<script>taskFailed("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Document not Deleted  !");</script>\';
                    }
                } elseif ($rwcheckUser[\'role_id\'] == 1 && $permission == "No") {


                    $deletefilename = mysqli_query($db_con, "UPDATE tbl_document_master SET flag_multidelete=0 WHERE doc_id=\'$id\' or substring_index(doc_name,\'_\',-1)=\'$id\'") or die(\'Error:\' . mysqli_error($db_con));
                    if ($deletefilename) {
                        $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `doc_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,null, \'$deldocId\', \'Storage Document $delfilename Deleted\',\'$date\',null,\'$host\',null)") or die(\'error : \' . mysqli_error($db_con));
                        echo\'<script>taskSuccess("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Document Deleted Successfully !");</script>\';
                    } else {
                        echo \'<script>taskSuccess("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Document Not Deleted")</script>\';
                    }
                } else {

                    $deletefilename = mysqli_query($db_con, "UPDATE tbl_document_master SET flag_multidelete=0 WHERE doc_id=\'$id\' or substring_index(doc_name,\'_\',-1)=\'$id\'") or die(\'Error:\' . mysqli_error($db_con));
                    if ($deletefilename) {
                        $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `doc_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,null, \'$deldocId\', \'Storage Document $delfilename Deleted\',\'$date\',null,\'$host\',null)") or die(\'error : \' . mysqli_error($db_con));
                        echo\'<script>taskSuccess("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Document Deleted Successfully !");</script>\';
                    } else {
                        echo \'<script>taskSuccess("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Document Not Deleted")</script>\';
                    }
                }
                mysqli_close($db_con);
            }
            if (isset($_POST[\'deleteVersionDoc\'])) {
                $id = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'docid\']);
                $id = mysqli_real_escape_string($db_con, $id);
                $getDocPath = mysqli_query($db_con, "select * from tbl_document_master where doc_id=\'$id\'") or die(\'Error:\' . mysqli_error($db_con));
                $rwgetDocPath = mysqli_fetch_assoc($getDocPath);
                $filePath = $rwgetDocPath[\'doc_path\'];
                $delvrsnfile = $rwgetDocPath[\'old_doc_name\'];
                $del = mysqli_query($db_con, "delete from tbl_document_master where doc_id=\'$id\'") or die(\'Error:\' . mysqli_error($db_con));
                unlink(\'extract-here/\' . $filePath);
                if ($del) {

                    if (FTP_ENABLED) {

                        $ftp = new ftp();
                        $ftp->conn("$fileserver", "$port", "$ftpUser", "$ftpPwd");
                        $ftp->singleFileDelete(ROOT_FTP_FOLDER . \'/\' . $filePath);
                        $arr = $ftp->getLogData();
                        if ($arr[\'error\'] != "") {

                            echo \'<h2>Error:</h2>\' . implode(\'<br />\', $arr[\'error\']);
                        }
                    }
                    $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,null,\'Storage Document $delvrsnfile Deleted\',\'$date\',null,\'$host\',null)") or die(\'error : \' . mysqli_error($db_con));

                    $docName = explode("_", $rwgetDocPath[\'doc_name\']);
                    $storgId = $docName[0];
                    echo\'<script>taskSuccess("storageFiles?id=\' . urlencode(base64_encode($storgId)) . \'","Storage Deleted Successfully !");</script>\';
                    //echo\'<script>taskSuccess("storageFiles","Document Deleted Successfully !");</script>\';
                } else {
                    echo \'<script>taskFailed("storageFiles","Document Not Deleted")</script>\';
                }
                mysqli_close($db_con);
            }
            ?>               
            <!--rename doc-->
            <?php
            if (isset($_POST[\'editFileName\'])) {

                $renameid = preg_replace("/[^A-Za-z0-9 ]/", "", filter_input(INPUT_POST, "docId"));
                $renameName = preg_replace("/[^A-Za-z0-9 ]/", "", filter_input(INPUT_POST, "renameName"));

                $updateDoc = mysqli_query($db_con, "update tbl_document_master set old_doc_name = \'$renameName\' where doc_id = \'$renameid\'") or die(\'Error: \' . mysqli_error($db_con));
            }
            ?>

            <!--update metadata value-->
            <?php
            if (isset($_POST[\'editMetaValue\'])) {
                if (!empty($_FILES[\'fileName\'][\'name\'])) {
                    $user_id = $_SESSION[\'cdes_user_id\'];
                    $doc_id = preg_replace("/[^A-Za-z0-9 ]/", "", $_POST[\'docid\']);
                    $doc_id = mysqli_real_escape_string($db_con, $doc_id);
                    $file_name = $_FILES[\'fileName\'][\'name\'];
                    $file_size = $_FILES[\'fileName\'][\'size\'];
                    $file_type = $_FILES[\'fileName\'][\'type\'];
                    $file_tmp = $_FILES[\'fileName\'][\'tmp_name\'];
                    $pageCount = $_POST[\'pageCount\'];
                    if ($pageCount <= 0) {
                        $pageCount = 1;
                    }
                    $extn = substr($file_name, strrpos($file_name, \'.\') + 1);
                    $fname = substr($file_name, 0, strrpos($file_name, \'.\'));

                    $fileExtn = substr($file_name, strrpos($file_name, ".") + 1);
                    $getDocName = mysqli_query($db_con, "select * from tbl_document_master where doc_id = \'$doc_id\'") or die(\'Error:\' . mysqli_error($db_con));
                    $rwgetDocName = mysqli_fetch_assoc($getDocName);
                    $docName = $rwgetDocName[\'doc_name\'];
                    //$docName = explode("_", $docName);
                    $old_file_name = $rwgetDocName[\'old_doc_name\'];
                    $oldextn = substr($old_file_name, strrpos($old_file_name, \'.\') + 1); // old file extn
                    $oldfname = substr($old_file_name, 0, strrpos($old_file_name, \'.\')); // old file name

                    $updateDocName = $docName . \'_\' . $doc_id; //storage id followed by doc id
                    $chekFileVersion = mysqli_query($db_con, "SELECT * FROM `tbl_document_master` WHERE find_in_set(\'$updateDocName\', doc_name)") or die(\'Error:\' . mysqli_error($db_con));
                    $flVersion = mysqli_num_rows($chekFileVersion);
                    $flVersion = $flVersion + 1;
                    $nfilename = $oldfname . \'_\' . $flVersion;

                    $strgName = mysqli_query($db_con, "select * from tbl_storage_level where sl_id = \'$docName\'") or die(\'Error:\' . mysqli_error($db_con));
                    $rwstrgName = mysqli_fetch_assoc($strgName);
                    $storageName = $rwstrgName[\'sl_name\'];
                    $storageName = str_replace(" ", "", $storageName);
                    $storageName = preg_replace(\'/[^A-Za-z0-9\-]/\', \'\', $storageName);
                    $uploaddir = "extract-here/" . $storageName . \'/\';
                    if (!is_dir($uploaddir)) {
                        mkdir($uploaddir, 777, TRUE) or die(print_r(error_get_last()));
                    }
                    $nfilename = preg_replace(\'/[^A-Za-z0-9_\-]/\', \'\', $nfilename);
                    // $filenameEnct=$fname.\'.\'.$extn;// urlencode(base64_encode($fname)).\'.\'.$extn;
                    $filenameEnct = urlencode(base64_encode($nfilename));
                    $filenameEnct = preg_replace(\'/[^A-Za-z0-9_\-]/\', \'\', $filenameEnct);
                    $filenameEnct = $filenameEnct . \'.\' . $extn;
                    $filenameEnct = time() . $filenameEnct;

                    //  $image_path = "images/" . $file_name;
                    $uploaddir = $uploaddir . $filenameEnct;
                    $upload = move_uploaded_file($file_tmp, $uploaddir) or die(print_r(error_get_last()));

                    $uploadInToFTP = false;
                    if ($upload) {

                        if (FTP_ENABLED) {

                            $ftp = new ftp();
                            $ftp->conn("$fileserver", "$port", "$ftpUser", "$ftpPwd");
                            //$ftp->get(ROOT_FTP_FOLDER.\'/\'.$doc_Path_copy_to,$doc_path); 

                            $filepath = $storageName . \'/\' . $filenameEnct;
                            $uploadfile = $ftp->put(ROOT_FTP_FOLDER . \'/\' . $filepath, $uploaddir);
                            $arr = $ftp->getLogData();
                            if ($uploadfile) {

                                $uploadInToFTP = true;
                                unlink($uploaddir);
                            } else {
                                echo \'<h2>Error:</h2>\' . implode(\'<br />\', $arr[\'error\']);
                                $uploadInToFTP = false;
                            }
                        } else {
                            $uploadInToFTP = true;
                        }
                    }

                    if ($uploadInToFTP) {

                        $cols = \'\';
                        $columns = mysqli_query($db_con, "SHOW COLUMNS FROM tbl_document_master");
                        while ($rwCols = mysqli_fetch_array($columns)) {
                            if ($rwCols[\'Field\'] != \'doc_id\') {
                                if (empty($cols)) {
                                    $cols = \'`\' . $rwCols[\'Field\'] . \'`\';
                                } else {
                                    $cols = $cols . \',`\' . $rwCols[\'Field\'] . \'`\';
                                }
                            }
                        }

                        $createVrsn = mysqli_query($db_con, "INSERT INTO tbl_document_master($cols) select $cols from tbl_document_master where doc_id=\'$doc_id\'") or die(\'Error:\' . mysqli_error($db_con));
                        $insertDocID = mysqli_insert_id($db_con);
                        $getMetaId = mysqli_query($db_con, "select * from tbl_document_master where doc_id = \'$_POST[docid]\'") or die(\'Error:\' . mysqli_error($db_con));
                        //echo "select * from tbl_document_master where doc_id = \'$_POST[docid]\'";
                        $meta_row = mysqli_fetch_assoc($getMetaId);
                        $getMetaId = mysqli_query($db_con, "select * from tbl_metadata_to_storagelevel where sl_id = \'$meta_row[doc_name]\'") or die(\'Error:\' . mysqli_error($db_con));
                        $i = 1;
                        while ($rwgetMetaId = mysqli_fetch_assoc($getMetaId)) {
                            $getMetaName = mysqli_query($db_con, "select * from tbl_metadata_master where id = \'$rwgetMetaId[metadata_id]\'") or die(\'Error:\' . mysqli_error($db_con));
                            $StorageNme = mysqli_query($db_con, "select sl_name from tbl_storage_level where sl_id=\'$rwgetMetaId[sl_id]\'");
                            $rwStrName = mysqli_fetch_assoc($StorageNme);
                            while ($rwgetMetaName = mysqli_fetch_assoc($getMetaName)) {
                                $meta = mysqli_query($db_con, "select `$rwgetMetaName[field_name]` from tbl_document_master where doc_id=\'$meta_row[doc_id]\'");
                                $rwMeta = mysqli_fetch_array($meta);
                                if ($rwgetMetaName[\'field_name\'] == \'noofpages\') {
                                    
                                } else {
                                    if ($rwgetMetaName[\'data_type\'] == \'datetime\') {

                                        $fieldValue = date(\'Y-m-d\', strtotime($_POST[\'fieldName\' . $i]));
                                    } else {

                                        $fieldValue = $_POST[\'fieldName\' . $i];
                                    }

                                    $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,null,\'Versioning Document $file_name Added\',\'$date\',null,\'$host\',null)") or die(\'error : \' . mysqli_error($db_con));
                                    if ($createVrsn) {
                                        //echo "update tbl_document_master set `$rwgetMetaName[field_name]` = \'$fieldValue\', doc_name=\'$updateDocName\' where doc_id=\'$insertDocID\'";
                                        //echo "update tbl_document_master set old_doc_name=\'$file_name\',filename=\'$fname\', doc_extn=\'$extn\', doc_path=\'$storageName/$filenameEnct\', uploaded_by=\'$user_id\', doc_size=\'$file_size\', noofpages=\'$pageCount\', dateposted=\'$date\' where doc_id=\'$_POST[docid]\'";
                                        //die;
                                        $updateNew = mysqli_query($db_con, "update tbl_document_master set `$rwgetMetaName[field_name]` = \'$fieldValue\', doc_name=\'$updateDocName\' where doc_id=\'$insertDocID\'");
                                        $updateOld = mysqli_query($db_con, "update tbl_document_master set `$rwgetMetaName[field_name]` = \'$fieldValue\', old_doc_name=\'$file_name\',filename=\'$fname\', doc_extn=\'$extn\', doc_path=\'$storageName/$filenameEnct\', uploaded_by=\'$user_id\', doc_size=\'$file_size\', noofpages=\'$pageCount\', dateposted=\'$date\' where doc_id=\'$_POST[docid]\'");
                                        if ($updateNew && $updateOld) {
                                            echo\'<script>taskSuccess("\' . basename($_SERVER[\'REQUEST_URI\']) . \'","Updated Successfully !");</script>\';
                                        }
                                    }
                                }
                            }
                        }
                    } else {
                        echo \'<script>taskFailed("\' . basename($_SERVER[\'REQUEST_URI\']) . \'", "Opps! File upload failed")</script>\';
                    }
                } else {

                    $getMetaId = mysqli_query($db_con, "select * from tbl_document_master where doc_id = \'$_POST[docid]\'") or die(\'Error:\' . mysqli_error($db_con));
                    //echo "select * from tbl_document_master where doc_id = \'$_POST[docid]\'";
                    $meta_row = mysqli_fetch_assoc($getMetaId);
                    $getMetaId = mysqli_query($db_con, "select * from tbl_metadata_to_storagelevel where sl_id = \'$meta_row[doc_name]\'") or die(\'Error:\' . mysqli_error($db_con));
                    //echo "select * from tbl_metadata_to_storagelevel where sl_id = \'$meta_row[doc_name]\'";
                    $i = 1;

                    while ($rwgetMetaId = mysqli_fetch_assoc($getMetaId)) {

                        $getMetaName = mysqli_query($db_con, "select * from tbl_metadata_master where id = \'$rwgetMetaId[metadata_id]\'") or die(\'Error:\' . mysqli_error($db_con));
                        $StorageNme = mysqli_query($db_con, "select sl_name from tbl_storage_level where sl_id=\'$rwgetMetaId[sl_id]\'");
                        $rwStrName = mysqli_fetch_assoc($StorageNme);
                        while ($rwgetMetaName = mysqli_fetch_assoc($getMetaName)) {
                            $meta = mysqli_query($db_con, "select `$rwgetMetaName[field_name]` from tbl_document_master where doc_id=\'$meta_row[doc_id]\'");
                            $rwMeta = mysqli_fetch_array($meta);
                            //$metadatValue = $rwMeta[\'\'];
                            //echo $i; echo \'-\';
                            if ($rwgetMetaName[\'field_name\'] == \'noofpages\') {
                                
                            } else {

                                if ($rwgetMetaName[\'data_type\'] == \'datetime\') {

                                    $fieldValue = date(\'Y-m-d\', strtotime($_POST[\'fieldName\' . $i]));
                                } else {

                                    $fieldValue = $_POST[\'fieldName\' . $i];
                                }

                                //echo "update tbl_document_master set `$rwgetMetaName[field_name]` = \'$fieldValue\' where doc_id = \'$_POST[metaId]\' or (substring_index(doc_name,\'_\',-1)=\'$_POST[metaId]\' and substring_index(doc_name,\'_\',1)=\'$_POST[metaId]\')";
                                $updateMeta = mysqli_query($db_con, "update tbl_document_master set `$rwgetMetaName[field_name]` = \'$fieldValue\' where doc_id = \'$_POST[docid]\' or (substring_index(doc_name,\'_\',-1)=\'$_POST[docid]\' and substring_index(doc_name,\'_\',1)=\'$_POST[docid]\')") or die(\'Error\' . mysqli_error($db_con));
                                if ($updateMeta) {
                                    //metadata update log
                                    $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,null,\'MetaData Value $fieldValue Assign in MetaData Field $rwgetMetaName[field_name] in $rwStrName[sl_name]\',\'$date\',null,\'$host\',null)") or die(\'error : \' . mysqli_error($db_con));
                                    echo\'<script>taskSuccess("storageFiles?id=\' . $pageid . ((isset($_GET[start])) ? (\'&start=\' . $_GET[start]) : \'\') . \'","MetaData Updated Successfully !");</script>\';
                                }
                            }
                        }

                        $i++;
                    }
                    mysqli_close($db_con);
                }
            }

//for move multi files
            if (isset($_POST[\'movemulti\'])) {
                $to = $_POST[\'lastMoveId\'];
                $level = $_POST[\'lastMoveIdLevel\'];
                $mutiId = $_POST[\'doc_id_smove_multi\'];
                $doc_id_smove_multi = explode(\',\', $mutiId);
                $moveToParentId = $_POST[\'moveToParentId\'];
                $sl_id_move = $_POST[\'sl_id_move_multi\'];
                $length = count($doc_id_smove_multi);
                if (isset($moveToParentId) && isset($doc_id_smove_multi)) {
                    foreach ($doc_id_smove_multi as $doc_id_smove_multis) {
                        $from_moveDocNm = mysqli_query($db_con, "select old_doc_name,doc_path from tbl_document_master where doc_id in($doc_id_smove_multis)") or die(\'Error\' . mysqli_error($db_con));
                        $from_rwMoveNm = mysqli_fetch_assoc($from_moveDocNm);
                        $fromDocPath = "extract-here/" . $from_rwMoveNm[\'doc_path\'];
                        $updateMoveDoc = "update tbl_document_master set doc_name = \'$to\' where doc_id =\'$doc_id_smove_multis\'";
                        mysqli_query($db_con, $updateMoveDoc) or die(\'Error\' . mysqli_error($db_con));
                        $moveDocNm = mysqli_query($db_con, "select old_doc_name from tbl_document_master where doc_id in($doc_id_smove_multis)") or die(\'Error\' . mysqli_error($db_con));
                        $rwMoveNm = mysqli_fetch_assoc($moveDocNm);
                        $movestrgeNm = mysqli_query($db_con, "select sl_name from tbl_storage_level where sl_id =\'$to\'") or die(\'Error\' . mysqli_error($db_con));
                        $rwmovestrgeNm = mysqli_fetch_assoc($movestrgeNm);
                        $doc_EncryptFile = explode(\'/\', $fromDocPath);
                        $doc_Encrypt_nm = end($doc_EncryptFile);
                        $dir_to = "extract-here/" . $rwmovestrgeNm[\'sl_name\'];
                        if (!is_dir($dir_to)) {
                            mkdir($dir_to);
                        }
                        $dir = "extract-here/" . $rwmovestrgeNm[\'sl_name\'];
                        $doc_Path_copy_to = $dir . "/" . $doc_Encrypt_nm;
                        $pathArray = explode(\'/\', $doc_Path_copy_to);
                        array_shift($pathArray);
                        $db_copy_Path_to = implode(\'/\', $pathArray);
                        copy($fromDocPath, $doc_Path_copy_to);

                        $destinationPath = $rwmovestrgeNm[\'sl_name\'] . \'/\' . $doc_Encrypt_nm;
                        $sourcePath = $fromDocPath;

                        $uploadInToFTP = false;
                        if (FTP_ENABLED) {

                            $ftp = new ftp();

                            $ftp->conn("$fileserver", "$port", "$ftpUser", "$ftpPwd");

                            if ($ftp->get($sourcePath, ROOT_FTP_FOLDER . \'/\' . $from_rwMoveNm[\'doc_path\'])) {

                                $uploadfile = $ftp->put(ROOT_FTP_FOLDER . \'/\' . $destinationPath, $sourcePath);
                                $arr = $ftp->getLogData();
                                if ($uploadfile) {
                                    $uploadInToFTP = true;
                                    $ftp->singleFileDelete(ROOT_FTP_FOLDER . \'/\' . $from_rwMoveNm[\'doc_path\']);
                                    unlink($fromDocPath);
                                } else {
                                    $uploadInToFTP = false;
                                    echo \'<h2>Error:</h2>\' . implode(\'<br />\', $arr[\'error\']);
                                }
                            }
                        } else {
                            $uploadInToFTP = true;
                        }

                        if ($uploadInToFTP) {

                            mysqli_query($db_con, "update tbl_document_master set doc_path = \'$db_copy_Path_to\' where doc_id =\'$doc_id_smove_multis\'") or die(\'Error\' . mysqli_error($db_con));
                            $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`,`doc_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,\'$to\', \'$mutiId\',\'$rwFolder[sl_name] Storage Document $rwMoveNm[old_doc_name] moved to Storage $rwmovestrgeNm[sl_name]\',\'$date\',null,\'$host\',\'\')") or die(\'error : \' . mysqli_error($db_con));
                            if ($log) {
                                $message = 1;
                            }
                        } else {
                            $message = 0;
                        }
                    }
                    if ($message == 1) {
                        echo\'<script>taskSuccess("storageFiles?id=\' . $pageid . ((isset($_GET[start])) ? (\'&start=\' . $_GET[start]) : \'\') . \'","Files moved Successfully !");</script>\';
                    } else {
                        echo\'<script>taskFailed("storageFiles?id=\' . $pageid . ((isset($_GET[start])) ? (\'&start=\' . $_GET[start]) : \'\') . \'","Failed to move Files !");</script>\';
                    }
                }
                mysqli_close($db_con);
            }
            ?>

            <script type="text/javascript">
                $(document).ready(function () {
                    $("#select_all").change(function () {
                        $(".emp_checkbox").prop("checked", $(this).prop("checked"));
                    });
                });
                //Extraxt CSV 

                $(document).ready(function () {

                    function exportTableToCSV($table, filename) {

                        var $rows = $table.find(\'tr:has(td),tr:has(th)\'),
                                //var $rows = $table.filter(\'tr:has(:checkbox:checked)\').find(\'tr:has(td),tr:has(th)\'),

                                tmpColDelim = String.fromCharCode(11),
                                tmpRowDelim = String.fromCharCode(0),
                                colDelim = \'","\',
                                rowDelim = \'"
"\',
                                csv = \'"\' + $rows.map(function (i, row) {
                                    var $row = $(row), $cols = $row.find(\'td,th\');
                                    return $cols.map(function (j, col) {
                                        var $col = $(col), text = $col.text();
                                        return text.replace(/"/g, \'""\');
                                    }).get().join(tmpColDelim);
                                }).get().join(tmpRowDelim)
                                .split(tmpRowDelim).join(rowDelim)
                                .split(tmpColDelim).join(colDelim) + \'"\',
                                csvData = \'data:application/csv;charset=utf-8,\' + encodeURIComponent(csv);
                        console.log(csv);
                        if (window.navigator.msSaveBlob) {
                            window.navigator.msSaveOrOpenBlob(new Blob([csv], {type: "text/plain;charset=utf-8;"}), "csvname.csv")
                        } else {
                            $(this).attr({\'download\': filename, \'href\': csvData, \'target\': \'_blank\'});
                        }
                    }

                    $("#down").on(\'click\', function (event) {

                        exportTableToCSV.apply(this, [$(\'#home-table\'), \'data.csv\']);
                    });
                });
            </script>
            <!-- SHARE SELECTED FILES--->
            <?php
            if (isset($_POST[\'shareFiles\'])) {
                $fromUser = $_SESSION[cdes_user_id];
                $ToUser = $_POST[\'userid\'];
                //$ToUser = mysqli_real_escape_string($db_con, $ToUser);
                $date = date(\'Y-m-d H:i:s\');
                $ToUser = implode(",", $ToUser);
                $ToUser = preg_replace("/[^A-Za-z0-9, ]/", "", $ToUser);
                $shareDocIds = $_POST[\'shareFile\'];
                $shareDocIds = explode(\',\', $shareDocIds);
                $myuser = explode(\',\', $ToUser);
                foreach ($shareDocIds as $shareId) {
                    foreach ($myuser as $myuserid) {
                        $myuserid = preg_replace("/[^A-Za-z0-9, ]/", "", $myuserid);
                        $chkDocId = mysqli_query($db_con, "select * from tbl_document_share where doc_ids=\'$shareId\' and to_ids =\'$myuserid\'") or die(\'Error in check\' . mysqli_error($db_con));

                        if (mysqli_num_rows($chkDocId) > 0) {
                            echo\'<script>taskFailed("storageFiles?id=\' . $pageid . \'","Document Already Shared !");</script>\';
                        } else {

                            $shareFiles = mysqli_query($db_con, "INSERT INTO `tbl_document_share`(`from_id`, `to_ids`, `doc_ids`, `dateShare`) VALUES (\'$fromUser\',\'$myuserid\',\'$shareId\', \'$date\')") or die(\'Error in insert share document\' . mysqli_error($db_con));



                            $shareDocNm = mysqli_query($db_con, "select old_doc_name from tbl_document_master where doc_id = \'$shareId\'") or die(\'Error :\' . mysqli_error($db_con));
                            while ($rwshareDocNm = mysqli_fetch_assoc($shareDocNm)) {

                                if ($shareFiles) {
                                    $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `doc_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,null, \'$shareId\', \'Storage Document $rwshareDocNm[old_doc_name] Shared\',\'$date\',null,\'$host\',null)") or die(\'error : \' . mysqli_error($db_con));
                                    if ($log) {
                                        $message = "Y";
                                    }
                                }
                            }
                            if ($message == "Y") {
                                echo\'<script>taskSuccess("storageFiles?id=\' . $pageid . \'","Document shared Successfully !");</script>\';
                            } else {
                                echo\'<script>taskFailed("storageFiles?id=\' . $pageid . \'","Document not shared !");</script>\';
                            }
                        }
                    }
                }
                mysqli_close($db_con);
            }

// copy multiple files
            if (isset($_POST[\'copyFiles\'])) {
                $to = preg_replace("/[^A-Za-z0-9, ]/", "", $_POST[\'lastMoveId\']);
                $to = mysqli_real_escape_string($db_con, $to);
                $level = preg_replace("/[^A-Za-z0-9, ]/", "", $_POST[\'lastMoveIdLevel\']);
                $level = mysqli_real_escape_string($db_con, $level);
                $doc_ids = preg_replace("/[^A-Za-z0-9, ]/", "", $_POST[\'doc_ids\']);
                $doc_ids = mysqli_real_escape_string($db_con, $doc_ids);
                $copyToParentId = preg_replace("/[^A-Za-z0-9, ]/", "", $_POST[\'copyToParentId\']);
                $copyToParentId = mysqli_real_escape_string($db_con, $copyToParentId);
                $sl_id4 = preg_replace("/[^A-Za-z0-9, ]/", "", $_POST[\'sl_id4\']);
                $sl_id4 = mysqli_real_escape_string($db_con, $sl_id4);
                $meta = mysqli_query($db_con, "select * from tbl_metadata_to_storagelevel where sl_id=\'$sl_id4\'"); //?
                //echo "select * from tbl_metadata_to_storagelevel where sl_id=\'$sl_id4\'";
                $fetchresult = mysqli_query($db_con, "select * from tbl_document_master where doc_id in($doc_ids) and doc_name=\'$sl_id4\'");
                $copyLaststrg = mysqli_query($db_con, "select sl_name from tbl_storage_level where sl_id = \'$to\'") or die(\'Error :\' . mysqli_error($db_con));
                $rwcopyLaststrg = mysqli_fetch_assoc($copyLaststrg);
                $rowcount = mysqli_num_rows($fetchresult);

                $rowmultifield = mysqli_fetch_field($fetchresult);

                while ($rowmulticopy = mysqli_fetch_array($fetchresult)) {
                    $doc_extn = $rowmulticopy[\'doc_extn\'];
                    $old_doc_name = $rowmulticopy[\'old_doc_name\'];
                    $doc_path = "extract-here/" . $rowmulticopy[\'doc_path\'];
                    $uploaded_by = $rowmulticopy[\'uploaded_by\'];
                    $doc_size = $rowmulticopy[\'doc_size\'];

                    $doc_EncryptFile = explode(\'/\', $doc_path);
                    $doc_Encrypt_nm = end($doc_EncryptFile);
                    $dir_to = "extract-here/" . $rwcopyLaststrg[\'sl_name\'];

                    if (!is_dir($dir_to)) {
                        mkdir($dir_to);
                    }
                    $dir = "extract-here/" . $rwcopyLaststrg[\'sl_name\'];

                    $doc_Path_copy_to = $dir . "/" . $doc_Encrypt_nm;
                    $pathArray = explode(\'/\', $doc_Path_copy_to);

                    array_shift($pathArray);

                    $db_copy_Path_to = implode(\'/\', $pathArray);

                    copy($doc_path, $doc_Path_copy_to);
                    $uploadInToFTP = false;
                    if (FTP_ENABLED) {

                        $ftp = new ftp();
                        $ftp->conn("$fileserver", "$port", "$ftpUser", "$ftpPwd");
                        if ($ftp->get($doc_path, ROOT_FTP_FOLDER . \'/\' . $rowmulticopy[\'doc_path\'])) {
                            $filepath = $rwcopyLaststrg[\'sl_name\'] . \'/\' . $doc_Encrypt_nm;
                            $uploadfile = $ftp->put(ROOT_FTP_FOLDER . \'/\' . $filepath, $doc_path);
                            $arr = $ftp->getLogData();
                            if ($uploadfile) {
                                $uploadInToFTP = true;
                                unlink($doc_path);
                            } else {
                                $uploadInToFTP = false;
                                if ($arr[\'error\'] != "") {
                                    echo \'<h2>Error:</h2>\' . implode(\'<br />\', $arr[\'error\']);
                                }
                            }
                        } else {
                            $uploadInToFTP = false;
                            if ($arr[\'error\'] != "") {
                                echo \'<h2>Error:</h2>\' . implode(\'<br />\', $arr[\'error\']);
                            }
                        }
                    } else {
                        $uploadInToFTP = true;
                    }

                    if ($uploadInToFTP) {

                        $sql2 = "INSERT INTO tbl_document_master SET";
                        $sql2 .= " doc_name=\'$to\',old_doc_name=\'$old_doc_name\',doc_extn=\'$doc_extn\',doc_path=\'$db_copy_Path_to\',uploaded_by=\'$uploaded_by\',doc_size=\'$doc_size\',dateposted=\'$rowmulticopy[dateposted]\',noofpages=\'$rowmulticopy[noofpages]\', storage_flag=\'1\'";
                        while ($rwMeta = mysqli_fetch_assoc($meta)) {
                            $metan = mysqli_query($db_con, "select field_name from tbl_metadata_master where id=\'$rwMeta[metadata_id]\'");
                            $rwMetan = mysqli_fetch_assoc($metan);

                            $field = $rwMetan[\'field_name\'];
                            $value = $rowmulticopy[$field];
                            $sql2 .= ",$field=\'$value\'";
                        }

                        $multicopyinsert = mysqli_query($db_con, $sql2);
                        if ($multicopyinsert) {
                            $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `doc_id`,`action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,\'$to\', \'$rowmulticopy[doc_id]\',\'Storage document $old_doc_name copy to Storage $rwcopyLaststrg[sl_name].\',\'$date\',null,\'$host\',\'\')") or die(\'Error DB: \' . mysqli_error($db_con));
                            if ($log) {
                                $message = "yes";
                            }
                        }
                    } else {
                        $message = "no";
                    }
                }

                if ($message == "yes") {

                    echo\'<script>taskSuccess("storageFiles?id=\' . $pageid . \'","Document Copy Successfully !");</script>\';
                } else {

                    echo\'<script>taskFail("storageFiles?id=\' . $pageid . \'","Document not copied.");</script>\';
                }
                mysqli_close($db_con);
            }
//Bulk Download
            if (isset($_POST[\'bulkDownload\'])) {
                $rad = preg_replace("/[^A-Za-z0-9, ]/", "", $_POST[\'raddwn\']);
                $rad = mysqli_real_escape_string($db_con, $rad);
                $slid = preg_replace("/[^A-Za-z0-9, ]/", "", $_POST[\'slid\']);
                $slid = mysqli_real_escape_string($db_con, $slid);
                $reason = preg_replace("/[^A-Za-z0-9, ]/", "", $_POST[\'reason\']);
                $reason = mysqli_real_escape_string($db_con, $reason);
                $archive_file_name = $slName . \'.zip\';
                $download = mysqli_query($db_con, "select doc_path,old_doc_name,doc_extn,doc_id from tbl_document_master where doc_name=\'$slid\' and flag_multidelete=1"); // or die(\'Error\'.mysqli_error($db_con));
                $zip = new ZipArchive();
                //create the file and throw the error if unsuccessful
                if ($zip->open($archive_file_name, ZIPARCHIVE::CREATE) !== TRUE) {
                    exit("cannot open <$archive_file_name>
");
                }
                $zippedFilePath = array();
                while ($row = mysqli_fetch_assoc($download)) {
                    $docPath = $row[\'doc_path\'];
                    $file_path = \'extract-here/\' . substr($docPath, 0, strrpos($docPath, "/") + 1);
                    $files = substr($docPath, strrpos($docPath, "/") + 1);
                    $comp_folder = mysqli_query($db_con, "select sl_name from tbl_storage_level where sl_id = \'$slid\'") or die(\'Error :\' . mysqli_error($db_con));
                    $rwfolder = mysqli_fetch_assoc($comp_folder);

                    $file1 = $row[\'old_doc_name\'] . \'.\' . $row[\'doc_extn\'];
                    if (FTP_ENABLED) {
                        $ftp = new ftp();
                        $ftp->conn("$fileserver", "$port", "$ftpUser", "$ftpPwd");

                        if ($ftp->get(\'extract-here/\' . $docPath, ROOT_FTP_FOLDER . \'/\' . $docPath)) {

                            if ($zip->addFile($file_path . $files, $file1)) {
                                //unlink(\'extract-here/\' .$docPath);
                                $zippedFilePath[] = \'extract-here/\' . $docPath;
                            }
                        } else {
                            $arr = $ftp->getLogData();
                        }
                    } else {
                        $zip->addFile($file_path . $files, $file1);
                    }
                }
                if ($zip->close()) {
                    if (FTP_ENABLED) {
                        foreach ($zippedFilePath as $key => $value) {

                            unlink($zippedFilePath[$key]);
                        }
                    }
                }
                //then send the headers to foce download the zip file
                header("Content-type: application/zip");
                header("Content-Disposition: attachment; filename=$archive_file_name");
                $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `doc_id`,`action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,\'$slid\', \'$row[doc_id]\',\'Storage document $old_doc_name compress to Storage $rwfolder[sl_name] with $row[old_doc_name].\',\'$date\',null,\'$host\',\'$reason\')") or die(\'error : \' . mysqli_error($db_con));
                header("Pragma: no-cache");
                header("Expires: 0");
                readfile("$archive_file_name");
                unlink($archive_file_name);
                exit;
                mysqli_close($db_con);
            }

            if (isset($_POST[\'updateDoc\'])) {

                $user_id = $_SESSION[\'cdes_user_id\'];
                if (!empty($_FILES[\'fileName\'][\'name\'])) {
                    $doc_id = $_POST[\'docid\'];
                    $file_name = $_FILES[\'fileName\'][\'name\'];
                    $file_size = $_FILES[\'fileName\'][\'size\'];
                    $file_type = $_FILES[\'fileName\'][\'type\'];
                    $file_tmp = $_FILES[\'fileName\'][\'tmp_name\'];
                    $pageCount = $_POST[\'pageCount\'];
                    if ($pageCount <= 0) {
                        $pageCount = 1;
                    }
                    $extn = substr($file_name, strrpos($file_name, \'.\') + 1);
                    $fname = substr($file_name, 0, strrpos($file_name, \'.\'));

                    $fileExtn = substr($file_name, strrpos($file_name, ".") + 1);
                    $getDocName = mysqli_query($db_con, "select * from tbl_document_master where doc_id = \'$doc_id\'") or die(\'Error:\' . mysqli_error($db_con));
                    $rwgetDocName = mysqli_fetch_assoc($getDocName);
                    $docName = $rwgetDocName[\'doc_name\'];
                    //$docName = explode("_", $docName);
                    $old_file_name = $rwgetDocName[\'old_doc_name\'];
                    $oldextn = substr($old_file_name, strrpos($old_file_name, \'.\') + 1); // old file extn
                    $oldfname = substr($old_file_name, 0, strrpos($old_file_name, \'.\')); // old file name

                    $updateDocName = $docName . \'_\' . $doc_id; //storage id followed by doc id
                    $chekFileVersion = mysqli_query($db_con, "SELECT * FROM `tbl_document_master` WHERE find_in_set(\'$updateDocName\', doc_name)") or die(\'Error:\' . mysqli_error($db_con));
                    $flVersion = mysqli_num_rows($chekFileVersion);
                    $flVersion = $flVersion + 1;
                    $nfilename = $oldfname . \'_\' . $flVersion;

                    $strgName = mysqli_query($db_con, "select * from tbl_storage_level where sl_id = \'$docName\'") or die(\'Error:\' . mysqli_error($db_con));
                    $rwstrgName = mysqli_fetch_assoc($strgName);
                    $storageName = $rwstrgName[\'sl_name\'];
                    $storageName = str_replace(" ", "", $storageName);
                    $storageName = preg_replace(\'/[^A-Za-z0-9\-]/\', \'\', $storageName);
                    $uploaddir = "extract-here/" . $storageName . \'/\';
                    if (!is_dir($uploaddir)) {
                        mkdir($uploaddir, 777, TRUE) or die(print_r(error_get_last()));
                    }
                    $nfilename = preg_replace(\'/[^A-Za-z0-9_\-]/\', \'\', $nfilename);
                    // $filenameEnct=$fname.\'.\'.$extn;// urlencode(base64_encode($fname)).\'.\'.$extn;
                    $filenameEnct = urlencode(base64_encode($nfilename));
                    $filenameEnct = preg_replace(\'/[^A-Za-z0-9_\-]/\', \'\', $filenameEnct);
                    $filenameEnct = $filenameEnct . \'.\' . $extn;
                    $filenameEnct = time() . $filenameEnct;

                    //  $image_path = "images/" . $file_name;
                    $uploaddir = $uploaddir . $filenameEnct;
                    $upload = move_uploaded_file($file_tmp, $uploaddir) or die(print_r(error_get_last()));

                    $uploadInToFTP = false;
                    if ($upload) {
                        if (FTP_ENABLED) {

                            $ftp = new ftp();
                            $ftp->conn("$fileserver", "$port", "$ftpUser", "$ftpPwd");

                            $filepath = $storageName . \'/\' . $filenameEnct;
                            $uploadfile = $ftp->put(ROOT_FTP_FOLDER . \'/\' . $filepath, $uploaddir);
                            $arr = $ftp->getLogData();
                            if ($uploadfile) {
                                $uploadInToFTP = true;
                                unlink($uploaddir);
                            } else {
                                $uploadInToFTP = false;
                                if ($arr[\'error\'] != "") {
                                    echo \'<h2>Error:</h2>\' . implode(\'<br />\', $arr[\'error\']);
                                }
                            }
                        } else {
                            $uploadInToFTP = true;
                        }
                    }

                    if ($uploadInToFTP) {

                        $cols = \'\';
                        $columns = mysqli_query($db_con, "SHOW COLUMNS FROM tbl_document_master");
                        while ($rwCols = mysqli_fetch_array($columns)) {
                            if ($rwCols[\'Field\'] != \'doc_id\') {
                                if (empty($cols)) {
                                    $cols = \'`\' . $rwCols[\'Field\'] . \'`\';
                                } else {
                                    $cols = $cols . \',`\' . $rwCols[\'Field\'] . \'`\';
                                }
                            }
                        }
                        $createVrsn = mysqli_query($db_con, "INSERT INTO tbl_document_master($cols) select $cols from tbl_document_master where doc_id=\'$doc_id\'") or die(\'Error:\' . mysqli_error($db_con));
                        $insertDocID = mysqli_insert_id($db_con);
                        $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,null,\'Versioning Document $file_name Added\',\'$date\',null,\'$host\',null)") or die(\'error log2: \' . mysqli_error($db_con));
                        if ($createVrsn) {
                            $updateNew = mysqli_query($db_con, "update tbl_document_master set doc_name=\'$updateDocName\' where doc_id=\'$insertDocID\'");
                            $updateOld = mysqli_query($db_con, "update tbl_document_master set old_doc_name=\'$file_name\',filename=\'$fname\', doc_extn=\'$extn\', doc_path=\'$storageName/$filenameEnct\', uploaded_by=\'$user_id\', doc_size=\'$file_size\', noofpages=\'$pageCount\', dateposted=\'$date\' where doc_id=\'$doc_id\'");
                            echo\'<script>taskSuccess("\' . basename($_SERVER[\'REQUEST_URI\']) . \'","Updated Successfully !");</script>\';
                        }
                    } else {
                        echo\'<script>taskFail("\' . basename($_SERVER[\'REQUEST_URI\']) . \'","Document not updated.");</script>\';
                    }
                }
            }

            if (isset($_POST[\'shareFolder\'])) {
                // print_r($_POST);
                $sharewithUsers = $_POST[\'sharewith\'];
                $sharewith = implode(\',\', $sharewithUsers);
                $slId = $_POST[\'slId\'];
                $shareby = $_SESSION[\'cdes_user_id\'];

                for ($k = 0; $k < count($sharewithUsers); $k++) {

                    $check = mysqli_query($db_con, "select * from tbl_folder_share where share_with=\'$sharewithUsers[$k]\' and slId=\'$slId\'")or die(\'Error :\' . mysqli_error($db_con));
                    if (mysqli_num_rows($check) > 0) {
                        echo\'<script>taskFailed("\' . basename($_SERVER[\'REQUEST_URI\']) . \'","Folder Share Failed !");</script>\';
                    } else {
                        $sql = mysqli_query($db_con, "INSERT INTO tbl_folder_share (slId, share_with, share_by) values(\'$slId\', \'$sharewithUsers[$k]\', \'$shareby\')")or die(\'Error :\' . mysqli_error($db_con));
                        if ($sql) {



                            $log = mysqli_query($db_con, "insert into tbl_ezeefile_logs(`id`, `user_id`, `user_name`, `group_id`, `sl_id`, `doc_id`,`action_name`, `start_date`, `end_date`, `system_ip`, `remarks`) values (null, \'$_SESSION[cdes_user_id]\', \'$_SESSION[admin_user_name] $_SESSION[admin_user_last]\',null,\'$slid\', NULL,\'Share $rwfolder[sl_name]. storage\',\'$date\',null,\'$host\',NULL)") or die(\'error : \' . mysqli_error($db_con));

//                            $checkParent = mysqli_query($db_con, "select sl_parent_id from tbl_storage_level where sl_id=\'$slId\'");
//                            $rowP = mysqli_fetch_assoc($checkParent);
//                            $parentId = $rowP[\'sl_parent_id\'];
//                            
//                            $checkPermission = mysqli_query($db_con, "select * from tbl_storagelevel_to_permission where user_id=\'$sharewithUsers[$k]\' and (sl_id=\'$slId\' or sl_id=\'$parentId\')");  

                            if (checkFolderPermission($db_con, $sharewithUsers[$k], $slId)) {

                                $slins = mysqli_query($db_con, "insert into tbl_storagelevel_to_permission(user_id,sl_id, shared) values(\'$sharewithUsers[$k]\',\'$slId\', \'1\')");

                                //$result =  mysqli_query($db_con, "select sl_parent_id from tbl_storage_level where sl_parent_id=\'$slId\'");
                            } else {
                                
                            }

                            echo\'<script>taskSuccess("\' . basename($_SERVER[\'REQUEST_URI\']) . \'","Folder shared successfully.");</script>\';
                        }
                    }
                }
            }

            function checkFolderPermission($db_con, $userId, $slId) {


                $result1 = mysqli_query($db_con, "select * from tbl_storagelevel_to_permission where user_id=\'$userId\' and sl_id=\'$slId\'");
                if (mysqli_num_rows($result1) > 0) {
                    return false;
                } else {
                    $result = mysqli_query($db_con, "select * from tbl_storagelevel_to_permission where user_id=\'$userId\'");
                    $slArray = array();

                    while ($rowP = mysqli_fetch_assoc($result)) {

                        $checkPermission = mysqli_query($db_con, "select sl_parent_id from tbl_storage_level where sl_parent_id =\'" . $rowP[\'sl_id\'] . "\' and sl_id=\'$slId\'");
                        if (mysqli_num_rows($checkPermission) > 0) {
                            $slArray[] = $rowP[\'sl_id\'];
                        } else {
                            
                        }
                    }

                    // print_r($slArray);
                    if (count($slArray) > 0) {
                        return false;
                    } else {
                        return true;
                    }
                }
            }
            ?>
            <!-- for add and search metaData---> 
            <script>

                $(document).ready(function () {
                    var max_fields = <?= $metadatacount; ?>; //maximum input boxes allowed
                    var wrapper = $(".contents"); //Fields wrapper
                    var add_button = $("#addfields"); //Add button ID
                    var id =<?= $slid ?>;
                    var x = 1; //initlal text box count
                    $(add_button).click(function (e) { //on add input button click
                        e.preventDefault();
                        if (x < max_fields) { //max input box allowed
                            x++;
                            //text box increment
                            $.ajax({url: "application/ajax/addMultipleMeataDtaSearch?id=" + id + "&status=file", success: function (result) {
                                    $(wrapper).append("<div class=\'col-lg-12\' style=\'margin-bottom:17px\'>" + result + "<button class=\'remove_field btn btn-primary\'><i class=\'fa fa-minus-circle\' aria-hidden=\'true\'></i></a>" + "</div>"); //add input box


                                }});
                        } else
                        {
                            alert("No. More meta data available");
                            $("#addfields").hide();
                        }
                    });
                    $(wrapper).on("click", ".remove_field", function (e) { //user click on remove text
                        e.preventDefault();
                        $(this).parent(\'div\').remove();
                        x--;
                        $("#addfields").show();
                    })
                });
            </script>
            <script>


                $(document).ready(function () {
                    $("#download").click(function () {
                        //alert(\'hi\');
                        exportCanvas();
                    });
                });

                function getCanvasContext() {
                    var mycanvas = document.getElementById("Display");
                    var canvas_context = null;
                    var x, y = 0;
                    if (mycanvas && mycanvas.getContext) {
                        canvas_context = mycanvas.getContext("2d");
                    } else {
                        return false;
                    }
                    return canvas_context;
                }

                function canvasImgExperiment() {
                    canvas_context = getCanvasContext();
                    if (canvas_context) {
                        canvas_context.fillStyle = "#FFFFFF";
                        canvas_context.fillRect(0, 0, 700, 700);
                        // draw something
                        canvas_context.fillStyle = "#C00000";
                        canvas_context.font = "40px arial";
                        canvas_context.fillText("This canvas will be exported", 100, 300);
                    }
                }

                function exportCanvas() {

                    var mycanvas = document.getElementById("Display");
//                if(mycanvas && mycanvas.getContext()) {
                    var img = mycanvas.toDataURL("image/png;base64;");
                    alert(img);
                    img = img.replace("image/png", "image/octet-stream"); // force download, user would have to give the file name.
                    // you can also use anchor tag with download attribute to force download the canvas with file name.
                    window.open(img, "", "width=700,height=700");
//                }else {
//                alert("Can not export");
//               }
                }
                canvasImgExperiment();


            </script>
            <!---end add and search metadata-->

            <!-- for lock folder-->
            <div id="lock-folder" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title"><?php echo $lang[\'lock_folder\']; ?></h4> 
                        </div> 
                        <form method="post">

                            <div class="modal-body">

                                <div class="row">
                                    <div class="form-group">
                                        <label>Selected Folder<span class="text-alert">*</label>
                                        <input type="text" class="form-control" id="selected_lock_folder" name="selected_folder" value="<?php echo $rwmoveFolderName[\'sl_name\']; ?>"/>
                                    </div>
                                    <div class="form-group">
                                        <label>Enter Password<span class="text-alert">*</label>

                                        <input type="password" class="form-control" name="lockfolder"  required autocomplete="off"/>
                                    </div>
                                </div>      

                            </div>
                            <div class="modal-footer"> 
                                <input value="<?php echo $rwFolder[\'sl_id\']; ?>" name="lockslId" type="hidden" >
                                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Close</button> 
                                <button type="submit" name="lock" class="btn btn-primary">Submit</button>
                            </div>
                        </form>
                    </div>
                </div> 
            </div>


            <?php
            $slid_lock = mysqli_query($db_con, "select * from `tbl_storage_level` where sl_id=\'$slid\'")or die(\'Error DB : \' . mysqli_error($db_con));
            $abs = mysqli_fetch_assoc($slid_lock);
            ?>
            <!-- for unlock folder-->

            <div id="unlock-folder" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title"><?php echo $lang[\'unlock_folder\']; ?></h4> 
                        </div> 
                        <form method="post">

                            <div class="modal-body">

                                <div class="row">
                                    <div class="form-group">
                                        <label>Selected Folder<span class="text-alert">*</label>
                                        <input type="text" class="form-control" id="selected_unlock_folder" name="selected_folder" value="<?php echo $rwmoveFolderName[\'sl_name\']; ?>"/>
                                    </div></div>


                                <div class="row">
                                    <div class="form-group">
                                        <label>Enter Old Password<span class="text-alert">*</label>
                                        <input type="password" class="form-control" id="unlockfolder" name="unlockfolder"  required autocomplete="off"/>
                                    </div></div>


                            </div>
                            <div class="modal-footer"> 

                                <input value="<?php echo $rwFolder[\'sl_id\']; ?>" name="lockslId" type="hidden" >
                                <button type="button" class="btn btn-default waves-effect"  data-dismiss="modal" >Close</button>
                                <button type="submit" id="unlock" name ="unlock" class="btn btn-primary">Unlock</button> 

                            </div>
                        </form>
                    </div>
                </div> 
            </div>

            <!-- for update password lock -->
            <div id="update-folder-password" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-header"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title"><?php echo $lang[\'update_folder_password\']; ?></h4> 
                        </div> 
                        <form method="post">

                            <div class="modal-body">

                                <div class="row">
                                    <div class="form-group">
                                        <label>Selected Folder<span class="text-alert">*</label>
                                        <input type="text" class="form-control" id="selected_update_fol_pass" name="selected_folder" value="<?php echo $rwmoveFolderName[\'sl_name\']; ?>"/>
                                    </div></div>


                                <div class="row">
                                    <div class="form-group">
                                        <label>Enter Old Password<span class="text-alert">*</label>
                                        <input type="password" class="form-control" id="old_pass"  required name="old_pass" autocomplete="off"/>
                                    </div></div>

                                <div class="row">
                                    <div class="form-group">
                                        <label>Enter New Password<span class="text-alert">*</label>
                                        <input type="password" class="form-control" id="new_pass"  required name="new_pass" autocomplete="off"/>
                                    </div></div>


                            </div>
                            <div class="modal-footer"> 

                                <input value="<?php echo $rwFolder[\'sl_id\']; ?>" name="lockslId" type="hidden" >
                                <button type="button" class="btn btn-default waves-effect"  data-dismiss="modal" >Close</button>

                                <button type="submit" name="update_folder_pass" class="btn btn-primary" >Update</button>
                            </div>
                        </form>
                    </div>
                </div> 
            </div>


            <!--modal for download doc-->
            <div id="myModal" class="modal fade" role="dialog">
                <div class="modal-dialog">

                    <!-- Modal content-->
                    <div class="modal-content">
                        <div class="modal-header">
                            <form>
                                <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                                <h4 class="modal-title">Please enter password</h4>
                        </div>

                        <input type="password" class="form-control" id="pass_value" autocomplete="off" autofocus >

                        <div class="modal-footer">
                            <input type="hidden" value="<?php echo $abs[\'password\']; ?>" id="doc_pass">			  
                            <input type="hidden" value="" id="docDId">			  

                            <input type="submit" class="btn btn-danger" id="enter_btn" value="Enter" onclick="return password_check(event)">

                        </div>
                        </form>
                    </div>

                </div>
            </div>
            <!-- for forget folder password-->
            <div id="forgot-password" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
                <div class="modal-dialog"> 
                    <div class="modal-content"> 
                        <div class="modal-heading"> 
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                            <h4 class="modal-title">Forgot Password</h4> 
                        </div> 
                        <form method="post">
                            <div class="modal-body">
                                <div class="row">
                                    <h4>Are you sure that you want to reset password for storage "<?php echo $rwmoveFolderName[\'sl_name\']; ?>" ?</h4>
                                </div>
                                <div class="modal-footer"> 

                                    <input value="<?php echo $rwFolder[\'sl_id\']; ?>" name="forgotPassId" type="hidden" >
                                    <button type="button" class="btn btn-default waves-effect"  data-dismiss="modal">Close</button>

                                    <button type="submit" name="forgotPassword" class="btn btn-primary">Confirm</button>
                                </div>
                        </form>
                    </div>
                </div> 
            </div>	
        </div>
        <!-- for forget folder password reset-->
        <div id="resetpassword" class="modal fade" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
            <div class="modal-dialog"> 
                <div class="modal-content"> 
                    <div class="modal-header"> 
                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
                        <h4 class="modal-title">Reset your Password</h4> 
                    </div> 
                    <form method="post" id="resetPassForm">

                        <div class="modal-body">

                            <div class="row">
                                <div class="form-group">
                                    <label for="pass1">OTP <span style="color:red;">*</span></label>
                                    <input  name="otp" type="text"  placeholder="Enter OTP" id="otps" required class="form-control" style="background:#fff; color: #565656;">

                                </div>
                                <div class="form-group">
                                    <label for="pass1">Password <span style="color:red;">*</span></label>
                                    <input id="pass1" name="paswd" type="password"  placeholder="Password" required class="form-control">

                                </div>
                                <div class="form-group">
                                    <label for="passWord2">Confirm Password <span style="color:red;">*</span></label>
                                    <input data-parsley-equalto="#pass1" type="password" required placeholder="Confirm Password" class="form-control" id="passConfirm" style="background:#fff; color: #565656;">

                                </div>


                            </div>
                            <div class="modal-footer"> 

                                <input value="<?php echo $rwFolder[\'sl_id\']; ?>" name="lockslId" type="hidden" >
                                <input value="<?php echo $rwFolder[\'sl_name\']; ?>" name="folder" type="hidden" >
                                <button type="button" class="btn btn-default waves-effect"  data-dismiss="modal" >Close</button>

                                <button type="submit" name="resetPass" class="btn btn-primary" >Submit</button>
                            </div>
                    </form>
                </div>
            </div> 
        </div>
    </div>

    <?php

    function findChildss_lock($lockslId) {
        global $db_con;
        global $slChild;
        $sql_child = "select * FROM tbl_storage_level WHERE sl_parent_id = \'$lockslId\' and is_protected=\'0\' order by sl_name asc";
        $sql_child_run = mysqli_query($db_con, $sql_child) or die(\'Error:\' . mysqli_error($db_con));
        if (mysqli_num_rows($sql_child_run) > 0) {
            while ($rwchild = mysqli_fetch_assoc($sql_child_run)) {
                $child = $rwchild[\'sl_id\'];

                findChildss_lock($child);
            }
        }
        $slChild[] = $lockslId;

        return $slChild;
    }
    ?>
    <?php

    function findChildss_unlock($lockslId) {
        global $db_con;
        global $slChild;
        $a = mysqli_query($db_con, "Select password from tbl_storage_level where sl_id=\'$lockslId\' ");
        $b = mysqli_fetch_assoc($a);
        $sql_child = "select * FROM tbl_storage_level WHERE sl_parent_id = \'$lockslId\' and is_protected!=\'0\' and user_id=\'$_SESSION[cdes_user_id]\' and password=\'$b[password]\' order by sl_name asc";
        $sql_child_run = mysqli_query($db_con, $sql_child) or die(\'Error:\' . mysqli_error($db_con));
        if (mysqli_num_rows($sql_child_run) > 0) {
            while ($rwchild = mysqli_fetch_assoc($sql_child_run)) {
                $child = $rwchild[\'sl_id\'];

                findChildss_unlock($child);
            }
        }
        $slChild[] = $lockslId;

        return $slChild;
    }
    ?>
    <!--for lock folder-->
    <?php
    if (isset($_POST[\'lock\'])) {
        $lockfolder = $_POST[\'lockfolder\'];
        $lockslId = $_POST[\'lockslId\'];
        $strgChlid = findChildss_lock($lockslId);
        $allChilds = implode(\',\', $strgChlid);


        $check = mysqli_query($db_con, "select * from tbl_storage_level where is_protected =\'1\' or is_protected=\'2\'");
        $checkStorage = mysqli_fetch_assoc($check);
        $protected_slid = $checkStorage[\'sl_id\'];


        $sql1 = mysqli_query($db_con, "UPDATE `tbl_storage_level` set is_protected = \'1\', password=sha1(\'$lockfolder\'),user_id = \'$_SESSION[cdes_user_id]\' where sl_id in($allChilds)")or die(\'Error DB child: \' . mysqli_error($db_con));

        $sql2 = mysqli_query($db_con, "UPDATE `tbl_storage_level` set is_protected = \'2\',user_id = \'$_SESSION[cdes_user_id]\' where sl_id =\'$lockslId\'")or die(\'Error DB child: \' . mysqli_error($db_con));

        if ($sql1 && $sql2) {

            echo\'<script>taskSuccess("\' . basename($_SERVER[\'REQUEST_URI\']) . \'","Folder locked  successfully.");</script>\';
        }
    }


    if (isset($_POST[\'unlock\'])) {
        $lockslId = $_POST[\'lockslId\'];
        $strgChlid = findChildss_unlock($lockslId);
        $allChilds = implode(\',\', $strgChlid);

        $pass = $_POST[\'unlockfolder\'];

        $password = $abs[\'password\'];

        $fpass = SHA1($pass);
        if ($password == $fpass) {

            $unlock = mysqli_query($db_con, "UPDATE `tbl_storage_level` set is_protected = \'0\', password=NULL,user_id=NULL where sl_id IN ($allChilds)")or die(mysqli_error($db_con));

            echo\'<script>taskSuccess("\' . basename($_SERVER[\'REQUEST_URI\']) . \'","Folder Unlocked  successfully.");</script>\';
        } else {
            echo\'<script>taskFailed("\' . basename($_SERVER[\'REQUEST_URI\']) . \'","Error in unlock folder.");</script>\';
        }
    }

    /*     * if(isset($_POST[\'update_folder_pass\'])){
      $lockslId = $_POST[\'lockslId\'];
      $strgChlid = findChildss_unlock($lockslId);
      $allChilds = implode(\',\',$strgChlid);

      $old_pass=$_POST[\'old_pass\'];
      $password = $abs[\'password\'];
      $new_pass=$_POST[\'new_pass\'];

      $fpass=SHA1($old_pass);

      if($password == $fpass)
      {

      $unlock = mysqli_query($db_con,"UPDATE `tbl_storage_level` set password=sha1(\'$new_pass\') where sl_id IN ($allChilds)")or die(mysqli_error($db_con));

      echo\'<script>taskSuccess("\' . basename($_SERVER[\'REQUEST_URI\']) . \'","Folder Password Updated successfully.");</script>\';

      }
      else
      {
      echo\'<script>taskFailed("\' . basename($_SERVER[\'REQUEST_URI\']) . \'","Error in update folder password.");</script>\';


      }

      }* */

//forgot password
    if (isset($_POST[\'forgotPassword\'])) {

        $user_id = $_SESSION[\'cdes_user_id\'];
        $chkUserMail = mysqli_query($db_con, "select * from tbl_user_master where user_id=\'$user_id\'") or die(\'Error:\' . mysqli_error($db_con));
        if (mysqli_num_rows($chkUserMail) > 0) {
            $rwCheck = mysqli_fetch_assoc($chkUserMail);
            $email = $rwCheck[\'user_email_id\'];
            $rndno = rand(100000, 999999); //OTP generate
            $to = $email;
            $name = $rwCheck[\'first_name\'] . \' \' . $rwCheck[\'last_name\'];
            $txt = $rndno;
            require_once \'./mail.php\';
            $mail = mailPasschange($txt, $to, $name);

            $_SESSION[\'otp\'] = $rndno;
            if ($mail) {
                echo\'<script>swal({
								title: "Task Success",
								text: "Verification Code sent Successfully",
								type: "success"
							}).then(function(){
								
								$("#resetpassword").modal("show");
							});
							</script>\';
            }
        } else {
            echo\'<script>swal({
								title: "Task Failed",
								text: "Please enter valid email id.",
								type: "warning",
								showCancelButton: true
							}).then(function(){
								$("#forgot-password").modal("show");
							});</script>\';
        }
    }

    //reset password	
    if (isset($_POST[\'resetPass\'])) {
        $pass = $_POST[\'paswd\'];
        $pass = mysqli_real_escape_string($db_con, $pass);
        $otp = $_POST[\'otp\'];
        $otp = mysqli_real_escape_string($db_con, $otp);
        $to = $_SESSION[\'adminMail\'];

        $lockslId = $_POST[\'lockslId\'];
        $storage = $_POST[\'folder\'];
        $strgChlid = findChildss_unlock($lockslId);
        $allChilds = implode(\',\', $strgChlid);

        if (!strcmp($otp, $_SESSION[\'otp\'])) {

            $Resetpass = mysqli_query($db_con, "UPDATE `tbl_storage_level` set password=sha1(\'$pass\') where sl_id IN($allChilds)")or die(mysqli_error($db_con));
            $chkUser = mysqli_query($db_con, "select * from tbl_user_master where user_email_id=\'$to \'") or die(\'Error:\' . mysqli_error($db_con));

            $rwUser = mysqli_fetch_assoc($chkUser);
            $username = $rwUser[\'first_name\'] . \' \' . $rwUser[\'last_name\'];
            if ($Resetpass) {
                require_once \'./mail.php\';
                $mail = mailResetPassFolder($to, $pass, $storage, $username);

                if ($mail) {
                    echo\'<script> taskSuccess("\' . basename($_SERVER[\'REQUEST_URI\']) . \'","Password Reset Sucessfully !!");</script>\';
                } else {
                    echo\'<script>swal({
								title: "Task Failed",
								text: "Failed to change!!",
								type: "warning",
								showCancelButton: true
							}).then(function() {
								$("#resetpassword").modal("show");
							});</script>\';
                }
            }

            unset($_SESSION[\'otp\']);
        } else {
            echo\'<script>swal({
								title: "Task Failed",
								text: "Enter Valid OTP Code !!",
								type: "warning",
								showCancelButton: true
							}).then(function() {
								$("#resetpassword").modal("show");
							});</script>\';
        }
    }
    ?>



    <script>

        $(\'document\').ready(function () {
            var slID =<?php echo $rwFolder[\'sl_id\']; ?>;
            var is_protected = <?php echo $abs[\'is_protected\']; ?>;
            var user_id = \'<?php echo $abs[\'user_id\']; ?>\';
            var session_id = <?php echo $_SESSION[\'cdes_user_id\']; ?>;
            $("#selected_lock_folder").prop(\'disabled\', true);
            $("#selected_unlock_folder").prop(\'disabled\', true);
            $("#selected_update_fol_pass").prop(\'disabled\', true);

            if (is_protected == 2 && user_id == session_id)
            {
                $("#lock_fol").hide();
                //$("#update_fol_pass").show();
                $("#unlock_fol").show();
                $("#reset_password").show();
                $("#bulk_down").hide();
                $("#copy_fol").hide();
                $("#move_fol").hide();
                $("#share_fol").hide();
                $("#move_multi").hide();
                $("#copyFiles").hide();
                $("#shareFiles").hide();
                $("#export4").hide();
                $("#mailFiles").hide();
            } else if (is_protected == 1 && user_id == session_id) {
                $("#lock_fol").hide();
                $("#unlock_fol").hide();
                //$("#update_fol_pass").hide();
                $("#reset_password").hide();
                $("#bulk_down").hide();
                $("#copy_fol").hide();
                $("#move_fol").hide();
                $("#share_fol").hide();
                $("#move_multi").hide();
                $("#copyFiles").hide();
                $("#shareFiles").hide();
                $("#export4").hide();
                $("#mailFiles").hide();

            } else if (is_protected == 0 && user_id == \'\') {
                $("#lock_fol").show();
                $("#unlock_fol").hide();
                //$("#update_fol_pass").hide();
                $("#reset_password").hide();
            } else if ((is_protected == 1 || is_protected == 2) && user_id != session_id) {
                $("#lock_fol").hide();
                $("#unlock_fol").hide();
                //$("#update_fol_pass").hide();
                $("#bulk_down").hide();
                $("#copy_fol").hide();
                $("#move_fol").hide();
                $("#share_fol").hide();
                $("#reset_password").hide();
                $("#move_multi").hide();
                $("#copyFiles").hide();
                $("#shareFiles").hide();
                $("#export4").hide();
                $("#mailFiles").hide();
            }




        });
        $("#unlock-folder").on("hidden.bs.modal", function () {

            $("#unlockfolder").html("");
            window.location.reload();
        });

        $("#lock-folder").on("hidden.bs.modal", function () {

            $("#lockfolder").html("");
            window.location.reload();
        });
        $("#update-folder-password").on("hidden.bs.modal", function () {

            $("#old_pass").html("");
            $("#new_pass").html("");
            window.location.reload();
        });
        $("#myModal").on("hidden.bs.modal", function () {

            $("#pass_value").html("");

            window.location.reload();
        });
        $("#resetpassword").on("hidden.bs.modal", function () {

            $("#otps").html("");
            $("#pass1").html("");
            $("#passConfirm").html("");


            window.location.reload();
        });

    </script>

    <script>

        function password_check(event)
        {
            event.preventDefault();

            var pass = $("#pass_value").val();
            var password = $("#doc_pass").val();
            var docDId = $("#docDId").val();
            var fpass = SHA1(pass);

            if (password == fpass)
            {
                window.open(\'downloaddoc?file=\' + docDId);
                $(\'#myModal\').modal(\'hide\');

            } else
            {
                taskFailed("<?php echo basename($_SERVER[\'REQUEST_URI\']); ?>", "Password is not valid");


            }

        }

        function setDownloadDocId(docId) {
            $(this).removeData(\'myModal\');
            $("#docDId").val(docId);
        }

    </script>
</body>
</html>
'

Did this file decode correctly?

Original Code

<?php @eval("?>".base64_decode("PD9waHAKZXJyb3JfcmVwb3J0aW5nKDApOwppbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsICcxJyk7CnJlcXVpcmVfb25jZSAnLi9sb2dpbnZhbGlkYXRlLnBocCc7CnJlcXVpcmVfb25jZSAnLi9hcHBsaWNhdGlvbi9jb25maWcvZGF0YWJhc2UucGhwJzsKcmVxdWlyZV9vbmNlICcuL2NsYXNzZXMvZnRwLnBocCc7CiRwZXJtID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3Qgc2xfaWQgZnJvbSB0Ymxfc3RvcmFnZWxldmVsX3RvX3Blcm1pc3Npb24gd2hlcmUgdXNlcl9pZD0nJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF0nIGdyb3VwIGJ5IHNsX2lkIik7CiRyd1Blcm0gPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHBlcm0pOwokc2xwZXJtID0gJHJ3UGVybVsnc2xfaWQnXTsKPz4KCjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KICAgIDxsaW5rIGhyZWY9ImFzc2V0cy9wbHVnaW5zL3NlbGVjdDIvY3NzL3NlbGVjdDIubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgLz4KICAgIDxsaW5rIGhyZWY9ImFzc2V0cy9wbHVnaW5zL2Jvb3RzdHJhcC1zZWxlY3QvY3NzL2Jvb3RzdHJhcC1zZWxlY3QubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgogICAgPGxpbmsgaHJlZj0iYXNzZXRzL3BsdWdpbnMvbXVsdGlzZWxlY3QvY3NzL211bHRpLXNlbGVjdC5jc3MiICByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiAvPgoKICAgIDw/cGhwCiAgICByZXF1aXJlX29uY2UgJy4vYXBwbGljYXRpb24vcGFnZXMvaGVhZC5waHAnOwogICAgcmVxdWlyZV9vbmNlICcuL2FwcGxpY2F0aW9uL3BhZ2VzL2Z1bmN0aW9uLnBocCc7Ci8vIGVjaG8gJF9HRVRbJ2lkJ107IGRpZTsKLy9mb3IgdXNlciByb2xlCiAgICAkY2hla1VzciA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0YmxfYnJpZGdlX3JvbGVfdG9fdW0gdGJyIGlubmVyIGpvaW4gdGJsX3VzZXJfcm9sZXMgdHVyIG9uIHRici5yb2xlX2lkID0gdHVyLnJvbGVfaWQgd2hlcmUgRklORF9JTl9TRVQoJyRfU0VTU0lPTltjZGVzX3VzZXJfaWRdJywgdXNlcl9pZHMpID4gMCIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAkcndnZXRSb2xlID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVrVXNyKTsKLy8gZWNobyAkcndnZXRSb2xlWydkYXNoYm9hcmRfbXlkbXMnXTsgZGllOwogICAgaWYgKCRyd2dldFJvbGVbJ2Rhc2hib2FyZF9teWRtcyddICE9ICcxJykgewogICAgICAgIGhlYWRlcignTG9jYXRpb246IC4vaW5kZXgnKTsKICAgIH0KICAgID8+CgogICAgPD9waHAKICAgIGlmIChpc3NldCgkX0dFVFsnaWQnXSkgJiYgIWVtcHR5KCRfR0VUWydpZCddKSkgewogICAgICAgICRzbGlkID0gYmFzZTY0X2RlY29kZSh1cmxkZWNvZGUoJF9HRVRbJ2lkJ10pKTsKICAgICAgICAkZm9sZGVyID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkPSckc2xpZCciKTsKICAgICAgICAvKiBpZighY2hlY2tGb2xkZXJQZXJtaXNzaW9uKCRkYl9jb24sICRfU0VTU0lPTlsnY2Rlc191c2VyX2lkJ10sICRzbGlkKSl7CiAgICAgICAgICAkZm9sZGVyID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkPSckc2xpZCciKTsKICAgICAgICAgIH1lbHNlewogICAgICAgICAgZWNobyAnPHNjcmlwdD5hbGVydCgiT29wcyEhISBZb3UgYXJlIG5vdCBhdXRob3Jpc2VkIHRvIGFjY2VzcyB0aGlzIHN0b3JhZ2UuIik7IHdpbmRvdy5vcGVuKCJpbmRleCIsIl9wYXJlbnQiKTs8L3NjcmlwdD4nOwogICAgICAgICAgfSAqLwogICAgfSBlbHNlIHsKICAgICAgICAkZm9sZGVyID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2RlcHRoX2xldmVsPScwJyIpOwogICAgfQogICAgJHJ3Rm9sZGVyID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRmb2xkZXIpOwogICAgJHNsaWQgPSAkcndGb2xkZXJbJ3NsX2lkJ107CiAgICAkcGFyZW50aWQgPSAkcndGb2xkZXJbJ3NsX3BhcmVudF9pZCddOwogICAgJGxldmVsID0gJHJ3Rm9sZGVyWydzbF9kZXB0aF9sZXZlbCddOwogICAgJHNsTmFtZSA9ICRyd0ZvbGRlclsnc2xfbmFtZSddOwogICAgPz4KICAgIDwhLS1saW5rIGhyZWY9ImFzc2V0cy9wbHVnaW5zL3NlbGVjdDIvY3NzL3NlbGVjdDIubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgLy0tPgogICAgPGxpbmsgaHJlZj0iYXNzZXRzL3BsdWdpbnMvanN0cmVlL3N0eWxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgLz4KICAgIDxzdHlsZT4KCiAgICA8L3N0eWxlPgogICAgPGJvZHkgY2xhc3M9ImZpeGVkLWxlZnQiPgogICAgICAgIDwhLS0gQmVnaW4gcGFnZSAtLT4KICAgICAgICA8ZGl2IGlkPSJ3cmFwcGVyIj4KCiAgICAgICAgICAgIDwhLS0gVG9wIEJhciBTdGFydCAtLT4KICAgICAgICAgICAgPD9waHAgcmVxdWlyZV9vbmNlICcuL2FwcGxpY2F0aW9uL3BhZ2VzL3RvcEJhci5waHAnOyA/PgogICAgICAgICAgICA8IS0tIFRvcCBCYXIgRW5kIC0tPgogICAgICAgICAgICA8IS0tID09PT09PT09PT0gTGVmdCBTaWRlYmFyIFN0YXJ0ID09PT09PT09PT0gMTAwMS8xMDU1Ni8wMDk1OSAxMi8xMi8yMDExIDE0OjMzOjU4LS0+CgogICAgICAgICAgICA8P3BocCByZXF1aXJlX29uY2UgJy4vYXBwbGljYXRpb24vcGFnZXMvc2lkZWJhci5waHAnOyA/PgogICAgICAgICAgICA8IS0tIExlZnQgU2lkZWJhciBFbmQgLS0+IAogICAgICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgICAgICAgICA8IS0tIFN0YXJ0IHJpZ2h0IENvbnRlbnQgaGVyZSAtLT4KICAgICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4gICAKCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQtcGFnZSI+CiAgICAgICAgICAgICAgICA8IS0tIFN0YXJ0IGNvbnRlbnQgLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQYWdlLVRpdGxlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvbCBjbGFzcz0iYnJlYWRjcnVtYiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9InN0b3JhZ2U/aWQ9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkc2xwZXJtKSk7ID8+Ij5TdG9yYWdlIE1hbmFnZW1lbnQ8L2E+PC9saT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMZXZlbCgkc2xpZCwgJGRiX2NvbiwgJHNscGVybUlkZXMsICRsZXZlbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBhcmVudExldmVsKCRzbGlkLCAkZGJfY29uLCAkc2xwZXJtLCAkbGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZsYWcgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2xQZXJtSWRzID0gZXhwbG9kZSgnLCcsICRzbHBlcm0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5fYXJyYXkoJHNsaWQsICRzbHBlcm0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyZW50ID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkPSckc2xpZCciKSBvciBkaWUoJ0Vycm9yJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcndQYXJlbnQgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHBhcmVudCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZXZlbCA8ICRyd1BhcmVudFsnc2xfZGVwdGhfbGV2ZWwnXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExldmVsKCRyd1BhcmVudFsnc2xfcGFyZW50X2lkJ10sICRkYl9jb24sICRzbHBlcm0sICRsZXZlbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmxhZyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyZW50ID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkPSckc2xpZCcgYW5kIHNsX3BhcmVudF9pZD0nJHNscGVybSciKSBvciBkaWUoJ0Vycm9yJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlzcWxpX251bV9yb3dzKCRwYXJlbnQpID4gMCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcndQYXJlbnQgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHBhcmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZXZlbCA8ICRyd1BhcmVudFsnc2xfZGVwdGhfbGV2ZWwnXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMZXZlbCgkcndQYXJlbnRbJ3NsX3BhcmVudF9pZCddLCAkZGJfY29uLCAkc2xwZXJtLCAkbGV2ZWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gJGZsYWcgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmbGFnID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmVudCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0Ymxfc3RvcmFnZV9sZXZlbCB3aGVyZSBzbF9pZD0nJHNsaWQnIikgb3IgZGllKCdFcnJvcicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyd1BhcmVudCA9IG15c3FsaV9mZXRjaF9hc3NvYygkcGFyZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ2V0cGFybnQgPSAkcndQYXJlbnRbJ3NsX3BhcmVudF9pZCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbGV2ZWwgPD0gJHJ3UGFyZW50WydzbF9kZXB0aF9sZXZlbCddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExldmVsKCRnZXRwYXJudCwgJGRiX2NvbiwgJHNscGVybSwgJGxldmVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZsYWcgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmbGFnID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9oZWFkZXIoJ0xvY2F0aW9uOiAuL2luZGV4LnBocCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXIoIkxvY2F0aW9uOiAuL3N0b3JhZ2VfdGVzdD9pZD0iIC4gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJHNscGVybSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmbGFnID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSJzdG9yYWdlP2lkPScgLiB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkcndQYXJlbnRbJ3NsX2lkJ10pKSAuICciPicgLiAkcndQYXJlbnRbJ3NsX25hbWUnXSAuICc8L2E+PC9saT4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29sPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJveCBib3gtcHJpbWFyeSIgc3R5bGU9Im1pbi1oZWlnaHQ6IDMwM3B4OyI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJveC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTMiIHN0eWxlPSJvdmVyZmxvdzogYXV0bzsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1ib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImJhc2ljVHJlZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2xwZXJtaWQgPSAkc2xwZXJtSWRlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzbGxldmVsVHJlZSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0Ymxfc3RvcmFnZV9sZXZlbCB3aGVyZSBzbF9pZCBpbigkc2xwZXJtaWQpIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJHJ3U2xsZXZlbFRyZWUgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNsbGV2ZWxUcmVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZXZlbCA9ICRyd1NsbGV2ZWxUcmVlWydzbF9kZXB0aF9sZXZlbCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzbHBlcm0gPSAkcndTbGxldmVsVHJlZVsnc2xfaWQnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyZW50aWQgPSAkcndTbGxldmVsVHJlZVsnc2xfcGFyZW50X2lkJ107CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VMZXZlbFMoJGxldmVsLCAkZGJfY29uLCAkc2xpZCwgJHBhcmVudGlkLCAkc2xwZXJtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3RvcmFnZUxldmVsUygkbGV2ZWwsICRkYl9jb24sICRzbGlkLCAkcGFyZW50aWQsICRzbHBlcm0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTkiIHN0eWxlPSJwYWRkaW5nLWxlZnQ6IDA7Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib3gtaGVhZGVyIHdpdGgtYm9yZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidG4tZ3JvdXAgcHVsbC1yaWdodCBtLXQtMCI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tbGlua2VkaW4iIGRhdGEtdG9nZ2xlPSJkcm9wZG93biI+Q2hvb3NlIEFjdGlvbjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tbGlua2VkaW4gZHJvcGRvd24tdG9nZ2xlIiBkYXRhLXRvZ2dsZT0iZHJvcGRvd24iIGFyaWEtZXhwYW5kZWQ9InRydWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhcmV0Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIERyb3Bkb3duPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJkcm9wZG93bi1tZW51IHN0b3JhZ2UiIHJvbGU9Im1lbnUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgLy9pZiAoJHJ3Z2V0Um9sZVsnbG9ja19mb2xkZXInXSA9PSAnMScpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08bGk+PGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGlkPSJ1cGRhdGVfZm9sX3Bhc3MiIGRhdGEtdGFyZ2V0PSIjdXBkYXRlLWZvbGRlci1wYXNzd29yZCI+VXBkYXRlIEZvbGRlciBQYXNzd29yZDwvYT48L2xpPi0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgLy99ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHJ3Z2V0Um9sZVsnZXhwb3J0X2NzdiddID09ICcxJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNleHBvcnQiPkV4cG9ydCBDU1Y8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkcndnZXRSb2xlWydidWxrX2Rvd25sb2FkJ10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgaWQ9ImJ1bGtfZG93biIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2J1bGtkb3dubG9hZCI+QnVsayBEb3dubG9hZCBGaWxlczwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRyd2dldFJvbGVbJ3VwbG9hZF9kb2Nfc3RvcmFnZSddID09ICcxJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJhZGRkb2N1bWVudD9pZD08P3BocCBlY2hvIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRzbGlkKSk7ID8+Ij5VcGxvYWQgRG9jdW1lbnQgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHJ3Z2V0Um9sZVsnY3JlYXRlX2NoaWxkX3N0b3JhZ2UnXSA9PSAnMScpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjY29uLWNsb3NlLW1vZGFsMSI+Q3JlYXRlIFN1YiBGb2xkZXI8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkcndnZXRSb2xlWydtb2RpZnlfc3RvcmFnZV9sZXZlbCddID09ICcxJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNjb24tY2xvc2UtbW9kYWwtbW9kaWZ5Ij5Nb2RpZnkgU3RvcmFnZSA8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkcndnZXRSb2xlWydkZWxldGVfc3RvcmFnZV9sZXZlbCddID09ICcxJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNjb24tY2xvc2UtbW9kYWwtZGVsIj5EZWxldGUgU3RvcmFnZSA8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkcndnZXRSb2xlWydhc3NpZ25fbWV0YWRhdGEnXSA9PSAnMScpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjY29uLWNsb3NlLW1vZGFsNSI+QXNzaWduIE1ldGFEYXRhPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHJ3Z2V0Um9sZVsnbW92ZV9zdG9yYWdlX2xldmVsJ10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgaWQgPSJtb3ZlX2ZvbCIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2Nvbi1jbG9zZS1tb2RhbDQiPk1vdmUgU3RvcmFnZTwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRyd2dldFJvbGVbJ2xvY2tfZm9sZGVyJ10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgZGF0YS10b2dnbGU9Im1vZGFsIiBpZD0ibG9ja19mb2wiIGRhdGEtdGFyZ2V0PSIjbG9jay1mb2xkZXIiPkxvY2sgRm9sZGVyPC9hPjwvbGk+IDw/cGhwIH0gPz4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHJ3Z2V0Um9sZVsnbG9ja19mb2xkZXInXSA9PSAnMScpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGlkPSJ1bmxvY2tfZm9sIiBkYXRhLXRhcmdldD0iI3VubG9jay1mb2xkZXIiPlVubG9jayBGb2xkZXI8L2E+PC9saT4gPD9waHAgfSA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRyd2dldFJvbGVbJ2xvY2tfZm9sZGVyJ10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgZGF0YS10b2dnbGU9Im1vZGFsIiBpZD0icmVzZXRfcGFzc3dvcmQiIGRhdGEtdGFyZ2V0PSIjZm9yZ290LXBhc3N3b3JkIj5Gb3Jnb3QgUGFzc3dvcmQ8L2E+PC9saT4gPD9waHAgfSA/PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGl2aWRlciI+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkcndnZXRSb2xlWydjb3B5X3N0b3JhZ2VfbGV2ZWwnXSA9PSAnMScpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBpZCA9ImNvcHlfZm9sIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjY29uLWNsb3NlLW1vZGFsNiI+Q29weSBTdG9yYWdlPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHJ3Z2V0Um9sZVsnc2hhcmVfZm9sZGVyJ10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgaWQgPSJzaGFyZV9mb2wiIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNjb24tY2xvc2UtbW9kYWw3Ij5TaGFyZSBGb2xkZXI8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGlkPSJldmVudF9yZXN1bHQiIGNsYXNzPSJoZWFkZXItdGl0bGUiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij5TZWxlY3RlZCBGb2xkZXIgOiA8c3Ryb25nPjw/cGhwIGVjaG8gJHNsTmFtZSA9ICRyd0ZvbGRlclsnc2xfbmFtZSddOyA/Pjwvc3Ryb25nPjwvaDQ+ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTEyIG0tdC0xMCIgc3R5bGU9InBhZGRpbmctbGVmdDogMDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0ic2VhcmNoZGF0YSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyIgaWQ9Im11bHRpc2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0zIj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCAgY2xhc3M9ImZvcm0tY29udHJvbCBzZWxlY3QyIiBpZD0ibXlfbXVsdGlfc2VsZWN0MSIgbmFtZT0ibWV0YWRhdGFbXSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgc2VsZWN0ZWQ+U2VsZWN0IE1ldGFkYXRhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Im9sZF9kb2NfbmFtZSI+RmlsZU5hbWU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibm9vZnBhZ2VzIj5ObyBPZiBQYWdlczwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGFjb3VudCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhcnJhck1ldGEgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWV0YXMgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX21ldGFkYXRhX3RvX3N0b3JhZ2VsZXZlbCB3aGVyZSBzbF9pZD0nJHNsaWQnIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkbWV0YXZhbCA9IG15c3FsaV9mZXRjaF9hc3NvYygkbWV0YXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCRhcnJhck1ldGEsICRtZXRhdmFsWydtZXRhZGF0YV9pZCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWV0YSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0YmxfbWV0YWRhdGFfbWFzdGVyIG9yZGVyIGJ5IGZpZWxkX25hbWUgYXNjIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcndNZXRhID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRtZXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KCRyd01ldGFbJ2lkJ10sICRhcnJhck1ldGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyd01ldGFbJ2ZpZWxkX25hbWUnXSAhPSAnZmlsZW5hbWUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxvcHRpb24+JyAuICRyd01ldGFbJ2ZpZWxkX25hbWUnXSAuICc8L29wdGlvbj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGFjb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCIgbmFtZT0iY29uZFtdIiByZXF1aXJlZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCBzZWxlY3RlZCBzdHlsZT0iYmFja2dyb3VuZDogIzgwODA4MDsgY29sb3I6ICMxMjEyMTM7Ij5TZWxlY3QgQ29uZGl0aW9uPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbmRpID0gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTldLyIsICIiLCAkX0dFVFsnY29uZCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkY29uZGkpICYmICRjb25kaSA9PSAnRXF1YWwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvJ3NlbGVjdGVkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Pj5FcXVhbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGNvbmRpKSAmJiAkY29uZGkgPT0gJ0NvbnRhaW5zJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobydzZWxlY3RlZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4+Q29udGFpbnM8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRjb25kaSkgJiYgJGNvbmRpID09ICdMaWtlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobydzZWxlY3RlZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4+TGlrZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGNvbmRpKSAmJiAkY29uZGkgPT0gJ05vdCBMaWtlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobydzZWxlY3RlZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4+Tm90IExpa2U8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBuYW1lPSJzZWFyY2hUZXh0W10iIHJlcXVpcmVkIHZhbHVlPSI8P3BocCBlY2hvIHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgIiIsICRfR0VUWydzZWFyY2hUZXh0J10pID8+IiBwbGFjZWhvbGRlcj0iRW50ZXIgU2VhcmNoIFRleHQgSGVyZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSI8P3BocCBlY2hvIHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgIiIsICRfR0VUWydpZCddKTsgPz4iIG5hbWU9ImlkIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgIiBpZD0ic2VhcmNoIj48aSBjbGFzcz0iZmEgZmEtc2VhcmNoIj48L2k+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGlkPSJhZGRmaWVsZHMiPjxpIGNsYXNzPSJmYSBmYS1wbHVzIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnRzIGNvbC1sZy0xMiI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IiI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkX0dFVFsnc2VhcmNoVGV4dCddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXRhZGF0YSA9ICRfR0VUWydtZXRhZGF0YSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb25kID0gJF9HRVRbJ2NvbmQnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VhcmNoVGV4dCA9ICRfR0VUWydzZWFyY2hUZXh0J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlYXJjaFRleHQgPSBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRkYl9jb24sICRzZWFyY2hUZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzID0gc2VhcmNoQWxsREIoJHNlYXJjaFRleHQsICRjb25kLCAkbWV0YWRhdGEsICRkYl9jb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4JCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZmluZFRvdGFsRmlsZSgkc2xwZXJtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCAkbGlzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpc3QgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgJGRiX2NvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsICRudW1GaWxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgJHRvdGFsRlNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCAkdG90YWxGb2xkZXI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29udEZpbGUgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCBzdW0oZG9jX3NpemUpIGFzIHRvdGFsLCBjb3VudChkb2NfbmFtZSkgYXMgY291bnQgZnJvbSB0YmxfZG9jdW1lbnRfbWFzdGVyIHdoZXJlIEZJTkRfSU5fU0VUKCckc2xwZXJtJyxkb2NfbmFtZSkiKSBvciBkaWUoJ0Vycm9yIDonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJ3Y29udEZpbGUgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGNvbnRGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRvdGFsRlNpemUxID0gJHJ3Y29udEZpbGVbJ3RvdGFsJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0b3RhbEZTaXplICs9IHJvdW5kKCR0b3RhbEZTaXplMSAvICgxMDAwICogMTAwMCksIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbnVtRmlsZSArPSAkcndjb250RmlsZVsnY291bnQnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpc3RbImZpbGVzIl0gPSAkbnVtRmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpc3RbImZpbGVTaXplIl0gPSAkdG90YWxGU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkc2xwZXJtKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRvdGFsRm9sZGVyICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpc3RbInRvdGFsRm9sZGVyIl0gPSAkdG90YWxGb2xkZXI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsX2NoaWxkID0gInNlbGVjdCAqIEZST00gdGJsX3N0b3JhZ2VfbGV2ZWwgV0hFUkUgc2xfcGFyZW50X2lkID0gJyRzbHBlcm0nICI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWxfY2hpbGRfcnVuID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICRzcWxfY2hpbGQpIG9yIGRpZSgnRXJyb3I6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlzcWxpX251bV9yb3dzKCRzcWxfY2hpbGRfcnVuKSA+IDApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJHJ3Y2hpbGQgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNxbF9jaGlsZF9ydW4pKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGlsZCA9ICRyd2NoaWxkWydzbF9pZCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbGFnYWluID0gZmluZFRvdGFsRmlsZSgkY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkbGlzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0b3RhbEZpbGVzID0gZmluZFRvdGFsRmlsZSgkbmFtZXNsWydzbF9pZCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiIHN0eWxlPSJvdmVyZmxvdzogYXV0byI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2hlcmUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJF9HRVRbJ3F1aWNrc2VhcmNoJ10pICYmICFlbXB0eSgkX0dFVFsncXVpY2tzZWFyY2gnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVzZXJfaWQxID0gJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGVrVXNyMSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0YmxfYnJpZGdlX3JvbGVfdG9fdW0gd2hlcmUgRklORF9JTl9TRVQoJyR1c2VyX2lkMScsIHVzZXJfaWRzKSA+IDAiKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcndjaGVja1VzZXIxID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVrVXNyMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcndjaGVja1VzZXIxWydyb2xlX2lkJ10gPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlkcyA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgIiIsICRfR0VUW3F1aWNrc2VhcmNoXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvY3VtZW50IGluc2lkZSB3b3JrZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdoZXJlID0gIndoZXJlIG9sZF9kb2NfbmFtZSBMSUtFICclJGlkcyUnIGFuZCBkb2NfbmFtZSA9ICckcndGb2xkZXJbc2xfaWRdJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaWRzID0gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTkgXS8iLCAiIiwgJF9HRVRbcXVpY2tzZWFyY2hdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQgaW5zaWRlIHdvcmtmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2hlcmUgPSAid2hlcmUgb2xkX2RvY19uYW1lIExJS0UgJyUkaWRzJScgYW5kIGRvY19uYW1lID0gJyRyd0ZvbGRlcltzbF9pZF0nIGFuZCBmbGFnX211bHRpZGVsZXRlPTEiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVzZXJfaWQxID0gJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGVrVXNyMSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0YmxfYnJpZGdlX3JvbGVfdG9fdW0gd2hlcmUgRklORF9JTl9TRVQoJyR1c2VyX2lkMScsIHVzZXJfaWRzKSA+IDAiKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcndjaGVja1VzZXIxID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVrVXNyMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcndjaGVja1VzZXIxWydyb2xlX2lkJ10gPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdoZXJlID0gIndoZXJlIGRvY19uYW1lID0gJyRyd0ZvbGRlcltzbF9pZF0nIGFuZCBmbGFnX211bHRpZGVsZXRlPTEiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdoZXJlID0gIndoZXJlIGRvY19uYW1lID0gJyRyd0ZvbGRlcltzbF9pZF0nIGFuZCBmbGFnX211bHRpZGVsZXRlPTEiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnN0cnVjdHMgPSAiU0VMRUNUIGRvY19pZCxmbGFnX211bHRpZGVsZXRlIEZST00gdGJsX2RvY3VtZW50X21hc3RlciAkd2hlcmUiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRydW4gPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgJGNvbnN0cnVjdHMpIG9yIGRpZSgnRXJyb3InIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvdW5kbnVtID0gbXlzcWxpX251bV9yb3dzKCRydW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZm91bmRudW0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19udW1lcmljKHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05XS8iLCAiIiwgcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTldLyIsICIiLCAkX0dFVFsnbGltaXQnXSkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBlcl9wYWdlID0gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTldLyIsICIiLCAkX0dFVFsnbGltaXQnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGVyX3BhZ2UgPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RhcnQgPSBpc3NldCgkX0dFVFsnc3RhcnQnXSkgPyBwcmVnX3JlcGxhY2UoIi9bXjAtOV0vIiwgIiIsICRfR0VUWydzdGFydCddKSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWF4X3BhZ2VzID0gY2VpbCgkZm91bmRudW0gLyAkcGVyX3BhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRzdGFydCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXJ0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFsbG90ID0gInNlbGVjdCAqIGZyb20gdGJsX2RvY3VtZW50X21hc3RlciAkd2hlcmUgb3JkZXIgYnkgb2xkX2RvY19uYW1lIExJTUlUICRzdGFydCwgJHBlcl9wYWdlIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlY2hvICRhbGxvdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFsbG90X3F1ZXJ5ID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICRhbGxvdCkgb3IgZGllKCJFcnJvcjogIiAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHVsbC1yaWdodCByZWNvcmQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJHN0YXJ0ICsgMSA/PiB0byA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoJHN0YXJ0ICsgMTApID4gJGZvdW5kbnVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJGZvdW5kbnVtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gKCRzdGFydCArIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+IE91dCBPZiA8c3Bhbj5Ub3RhbCBSZWNvcmRzOiA8P3BocCBlY2hvICRmb3VuZG51bTsgPz48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJveC1ib2R5IGxpbWl0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsaW1pdCA9IHRyaW0oJF9HRVRbJ2xpbWl0J10pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGxpbWl0KSBhbmQgISBlbXB0eSgkbGltaXQpIGFuZCAkbGltaXQgPT0gJycpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWNfbGltaXQgPSAkbGltaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWNfbGltaXQgPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVzZXJfaWQgPSAkX1NFU1NJT05bY2Rlc191c2VyX2lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hla1VzciA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0YmxfYnJpZGdlX3JvbGVfdG9fdW0gd2hlcmUgRklORF9JTl9TRVQoJyR1c2VyX2lkJywgdXNlcl9pZHMpID4gMCIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJ3Y2hlY2tVc2VyID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVrVXNyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJ3Y2hlY2tVc2VyWydyb2xlX2lkJ10gPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gIlNFTEVDVCBjb3VudChkb2NfaWQpIEZST00gIHRibF9kb2N1bWVudF9tYXN0ZXIgd2hlcmUgZG9jX25hbWUgPSAkc2xpZCBhbmQgZmxhZ19tdWx0aWRlbGV0ZT0xIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gIlNFTEVDVCBjb3VudChkb2NfaWQpIEZST00gIHRibF9kb2N1bWVudF9tYXN0ZXIgd2hlcmUgZG9jX25hbWUgPSAkc2xpZCBhbmQgZmxhZ19tdWx0aWRlbGV0ZT0xIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldHZhbCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAkc3FsKSBvciBkaWUoJ0NvdWxkIG5vdCBnZXQgZGF0YTogJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJvdyA9IG15c3FsaV9mZXRjaF9hcnJheSgkcmV0dmFsLCBNWVNRTElfTlVNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVjX2NvdW50ID0gJHJvd1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWF4cGFnZSA9ICRyZWNfY291bnQgLyAkcmVjX2xpbWl0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXhwYWdlID0gY2VpbCgkbWF4cGFnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRfR0VUeydwYWdlJ30pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYWdlID0gJF9HRVR7J3BhZ2UnfSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvZmZzZXQgPSAkcmVjX2xpbWl0ICogJHBhZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpID0gJF9HRVRbJ2luZGV4J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhZ2UgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb2Zmc2V0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlZnRfcmVjID0gJHJlY19jb3VudCAtICgkcGFnZSAqICRyZWNfbGltaXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiZyA9ICcjRTNFREYwJzsgLy92YXJpYWJsZSB1c2VkIHRvIHN0b3JlIGFsdGVybmF0ZSByb3cgY29sb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IDxzZWxlY3QgaWQ9ImxpbWl0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTAiIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOV0vIiwgIiIsICRfR0VUWydsaW1pdCddKSA9PSAxMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnc2VsZWN0ZWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+PjEwPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjI1IiA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTldLyIsICIiLCAkX0dFVFsnbGltaXQnXSkgPT0gMjUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJ3NlbGVjdGVkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Pj4yNTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI1MCIgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05XS8iLCAiIiwgJF9HRVRbJ2xpbWl0J10pID09IDUwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICdzZWxlY3RlZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4+NTA8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjUwIiA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTldLyIsICIiLCAkX0dFVFsnbGltaXQnXSkgPT0gMjUwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICdzZWxlY3RlZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4+MjUwPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjUwMCIgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05XS8iLCAiIiwgJF9HRVRbJ2xpbWl0J10pID09IDUwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnc2VsZWN0ZWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+PjUwMDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PiBEb2N1bWVudHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkIG5vLWZvb3RlciIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHdpZHRoPSI1MXB4Ij48aW5wdXQgIHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2tib3gtcHJpbWFyeSIgaWQ9InNlbGVjdF9hbGwiPiBBbGwgPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5GaWxlIE5hbWUgPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5GaWxlIFNpemU8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPk5vLm9mIFBhZ2VzPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5VcGxvYWRlZCBCeTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+VXBsb2FkZWQgRGF0ZTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+QWN0aW9uczwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuID0gJHN0YXJ0ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRmaWxlX3JvdyA9IG15c3FsaV9mZXRjaF9hc3NvYygkYWxsb3RfcXVlcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2hhcmVEaWQgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCBkb2NfaWRzIGZyb20gdGJsX2RvY3VtZW50X3NoYXJlIHdoZXJlIGRvY19pZHM9ICckZmlsZV9yb3dbZG9jX2lkXSciKSBvciBkaWUoIkVycm9yOiAiIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaHJlQ291bnQgPSBteXNxbGlfbnVtX3Jvd3MoJHNoYXJlRGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRnZXRNZXRhRGF0YSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0IG1ldGFkYXRhX2lkIGZyb20gdGJsX21ldGFkYXRhX3RvX3N0b3JhZ2VsZXZlbCB3aGVyZSBzbF9pZCA9ICckZmlsZV9yb3dbZG9jX25hbWVdJyIpIG9yIGRpZSgnRXJyb3I6Z2cnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXRhSHRtbCA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1ldGFmaWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnZXRNZXRhSWQgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX21ldGFkYXRhX3RvX3N0b3JhZ2VsZXZlbCB3aGVyZSBzbF9pZCA9ICckZmlsZV9yb3dbZG9jX25hbWVdJyIpIG9yIGRpZSgnRXJyb3I6Z2cnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlzcWxpX251bV9yb3dzKCRnZXRNZXRhSWQpID4gMCkgewoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRyd2dldE1ldGFJZCA9IG15c3FsaV9mZXRjaF9hc3NvYygkZ2V0TWV0YUlkKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdldE1ldGFOYW1lID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9tZXRhZGF0YV9tYXN0ZXIgd2hlcmUgaWQgPSAnJHJ3Z2V0TWV0YUlkW21ldGFkYXRhX2lkXSciKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRyd2dldE1ldGFOYW1lID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRnZXRNZXRhTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXRhID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgYCRyd2dldE1ldGFOYW1lW2ZpZWxkX25hbWVdYCBmcm9tIHRibF9kb2N1bWVudF9tYXN0ZXIgd2hlcmUgZG9jX2lkPSckZmlsZV9yb3dbZG9jX2lkXSciKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyd01ldGEgPSBteXNxbGlfZmV0Y2hfYXJyYXkoJG1ldGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkcndNZXRhWyRyd2dldE1ldGFOYW1lWydmaWVsZF9uYW1lJ11dKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcndnZXRNZXRhTmFtZVsnZmllbGRfbmFtZSddID09ICdub29mcGFnZXMnIHx8ICRyd2dldE1ldGFOYW1lWydmaWVsZF9uYW1lJ10gPT0gJ2ZpbGVuYW1lJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWV0YWZpbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXRhSHRtbCAuPSAiPGxhYmVsPiIgLiAkcndnZXRNZXRhTmFtZVsnZmllbGRfbmFtZSddIC4gIjwvbGFiZWw+IDogIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyd2dldE1ldGFOYW1lWydkYXRhX3R5cGUnXSA9PSAnZGF0ZXRpbWUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWV0YUh0bWwgLj0gKCgkcndNZXRhWyRyd2dldE1ldGFOYW1lWydmaWVsZF9uYW1lJ11dICE9ICcwMDAwLTAwLTAwIDAwOjAwOjAwJykgPyBkYXRlKCdkLW0tWScsIHN0cnRvdGltZSgkcndNZXRhWyRyd2dldE1ldGFOYW1lWydmaWVsZF9uYW1lJ11dKSkgOiAiLSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1ldGFIdG1sIC49ICRyd01ldGFbJHJ3Z2V0TWV0YU5hbWVbJ2ZpZWxkX25hbWUnXV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXRhSHRtbCAuPSAiIHwgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJncmFkZVgiIGlkPSJtZXRhZGF0YTw/cGhwIGVjaG8gJGZpbGVfcm93Wydkb2NfaWQnXTsgPz4iIDw/cGhwIGlmICgkZmlsZV9yb3dbJ2NoZWNraW5fY2hlY2tvdXQnXSA9PSAwKSB7ID8+IHN0eWxlPSJiYWNrZ3JvdW5kOiMyNjgwYWQgIWltcG9ydGFudDsgY29sb3I6I2ZmZjsiIDw/cGhwIH0gPz4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrYm94LXByaW1hcnkgZW1wX2NoZWNrYm94IiBkYXRhLWRvYy1pZD0iPD9waHAgZWNobyAkZmlsZV9yb3dbJ2RvY19pZCddOyA/PiIgaWQ9InNocmVJZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJG47ID8+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNocmVDb3VudCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmEgZmEtc2hhcmUtc3F1YXJlLW8iIHN0eWxlPSJmb250LXNpemU6IDE1cHg7IGNvbG9yOiAjM2M4ZGJjOyIgdGl0bGU9IlNoYXJlZCBEb2N1bWVudCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvICgoJG1ldGFmaWxsZWQpID8gIjxpIGNsYXNzPSdmYSBmYS1jaGVjayc+PC9pPiIgOiAiIik7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IDxkaXYgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW47IG1heC13aWR0aDoyMDBweDsiIHRpdGxlPSI8P3BocCBlY2hvICRmaWxlX3Jvd1snb2xkX2RvY19uYW1lJ107ID8+Ij48P3BocCBlY2hvICRmaWxlX3Jvd1snb2xkX2RvY19uYW1lJ107ID8+PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgPjw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaXplID0gcm91bmQoJGZpbGVfcm93Wydkb2Nfc2l6ZSddIC8gMTAwMCAvIDEwMDAsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNpemUgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkZmlsZV9yb3dbJ2RvY19zaXplJ10gLyAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PiBNQjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjw/cGhwIGVjaG8gJGZpbGVfcm93Wydub29mcGFnZXMnXTsgPz48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVzZXJOYW1lID0gIlNFTEVDVCBmaXJzdF9uYW1lLGxhc3RfbmFtZSBGUk9NIHRibF91c2VyX21hc3RlciBXSEVSRSB1c2VyX2lkID0gJyRmaWxlX3Jvd1t1cGxvYWRlZF9ieV0nIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXNlck5hbWVfcnVuID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICR1c2VyTmFtZSkgb3IgZGllKCJFcnJvcjogIiAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyd3VzZXJOYW1lID0gbXlzcWxpX2ZldGNoX2Fzc29jKCR1c2VyTmFtZV9ydW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PD9waHAgZWNobyAkcnd1c2VyTmFtZVsnZmlyc3RfbmFtZSddIC4gIiAiIC4gJHJ3dXNlck5hbWVbJ2xhc3RfbmFtZSddOyA/PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjw/cGhwIGVjaG8gZGF0ZSgnZC1tLVkgaDppOnMnLCBzdHJ0b3RpbWUoJGZpbGVfcm93WydkYXRlcG9zdGVkJ10pKTsgPz48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJkcm9wZG93biB0b3AtbWVudS1pdGVtLXhzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiIgY2xhc3M9ImRyb3Bkb3duLXRvZ2dsZSBwcm9maWxlIHdhdmVzLWVmZmVjdCB3YXZlcy1saWdodCIgZGF0YS10b2dnbGU9ImRyb3Bkb3duIiBhcmlhLWV4cGFuZGVkPSJ0cnVlIj48aSBjbGFzcz0iZmEgZmEtZ2VhciI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iZHJvcGRvd24tbWVudSBwZGYgZ2VhcmJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZmlsZV9yb3dbJ2NoZWNraW5fY2hlY2tvdXQnXSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RydG9sb3dlcigkZmlsZV9yb3dbJ2RvY19leHRuJ10pID09ICdwZGYnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHJ3Z2V0Um9sZVsncGRmX2ZpbGUnXSA9PSAnMScpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iZmxpcGZsb3Atdmlld2VyP2k9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkX1NFU1NJT05bY2Rlc191c2VyX2lkXSkpID8+Jmk9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkZmlsZV9yb3dbJ2RvY19pZCddKSk7ID8+IiBpZD0iZmFuY3lib3gtaW5uZXIiIGNsYXNzPSJwZGZ2aWV3IiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0idGktYm9vayIgc3R5bGU9ImZvbnQtc2l6ZTogMThweDsiPjwvaT48L2E+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ2aWV3ZXI/aWQ9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkX1NFU1NJT05bY2Rlc191c2VyX2lkXSkpOyA/PiZpPTw/cGhwIGVjaG8gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJGZpbGVfcm93Wydkb2NfaWQnXSkpOyA/PiIgaWQ9ImZhbmN5Ym94LWlubmVyIiBjbGFzcz0icGRmdmlldyIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWZpbGUtcGRmLW8iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1mb3IgdG9vbCB0aXAgb24gcGRmLS0+ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRyd2dldFJvbGVbJ3BkZl9hbm5vdGF0aW9uJ10gPT0gJzEnKSB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hrYW5vdHRJZCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiU0VMRUNUICogRlJPTSBgdGJsX2RvY19hc3NpZ25lZF93ZmAgd2hlcmUgZG9jX2lkPSckZmlsZV9yb3dbZG9jX2lkXSciKSBvciBkaWUoJ0Vycm9yOmdnJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoa2lkPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGNoa2Fub3R0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkY2hraWQpKXsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iYW5vdHQvaW5kZXg/aWQ9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkX1NFU1NJT05bY2Rlc191c2VyX2lkXSkpOyA/PiZpZDE9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkZmlsZV9yb3dbJ2RvY19pZCddKSk7ID8+JnBuPTEiIGNsYXNzPSJwZGZ2aWV3IiB0YXJnZXQ9ImJsYW5rIj4gIDxpIGNsYXNzPSJmYSBmYSBmYS1maWxlLXRleHQtbyI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsgfT8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJ0b2xvd2VyKCRmaWxlX3Jvd1snZG9jX2V4dG4nXSkgPT0gJ2pwZycgfHwgc3RydG9sb3dlcigkZmlsZV9yb3dbJ2RvY19leHRuJ10pID09ICdwbmcnIHx8IHN0cnRvbG93ZXIoJGZpbGVfcm93Wydkb2NfZXh0biddKSA9PSAnZ2lmJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaW1hZ2V2aWV3ZXI/dWlkPTw/cGhwIGVjaG8gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF0pKTsgPz4maT08P3BocCBlY2hvIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRmaWxlX3Jvd1snZG9jX2lkJ10pKTsgPz4iICB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkcndnZXRSb2xlWydpbWFnZV9maWxlJ10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtZmlsZS1pbWFnZS1vIj48L2k+IEltYWdlPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gZWxzZSBpZiAoc3RydG9sb3dlcigkZmlsZV9yb3dbJ2RvY19leHRuJ10pID09ICd0aWYnIHx8IHN0cnRvbG93ZXIoJGZpbGVfcm93Wydkb2NfZXh0biddKSA9PSAndGlmZicpIHsgPz4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0idGlmZi12aWV3ZXI/aWQ9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkX1NFU1NJT05bY2Rlc191c2VyX2lkXSkpOyA/PiZpPTw/cGhwIGVjaG8gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJGZpbGVfcm93Wydkb2NfaWQnXSkpOyA/PiIgdGFyZ2V0PSJfYmxhbmsiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRyd2dldFJvbGVbJ3RpZl9maWxlJ10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGljdHVyZS1vIj48L2k+IFRpZmYgRmlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gZWxzZSBpZiAoc3RydG9sb3dlcigkZmlsZV9yb3dbJ2RvY19leHRuJ10pID09ICd4bHN4JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieGxzeD91aWQ9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkX1NFU1NJT05bY2Rlc191c2VyX2lkXSkpOyA/PiZmaWxlPTw/cGhwIGVjaG8gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJGZpbGVfcm93Wydkb2NfaWQnXSkpOyA/PiIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHJ3Z2V0Um9sZVsnZXhjZWxfZmlsZSddID09ICcxJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWZpbGUtZXhjZWwtbyI+PC9pPiBFeGVjbCBmaWxlPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9IGVsc2UgaWYgKHN0cnRvbG93ZXIoJGZpbGVfcm93Wydkb2NfZXh0biddKSA9PSAneGxzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieGxzP3VpZD08P3BocCBlY2hvIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRfU0VTU0lPTltjZGVzX3VzZXJfaWRdKSk7ID8+JmZpbGU9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkZmlsZV9yb3dbJ2RvY19pZCddKSk7ID8+IiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkcndnZXRSb2xlWydleGNlbF9maWxlJ10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtZmlsZS1leGNlbC1vIj48L2k+IEV4ZWNsIGZpbGU8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gZWxzZSBpZiAoc3RydG9sb3dlcigkZmlsZV9yb3dbJ2RvY19leHRuJ10pID09ICdkb2MnIHx8IHN0cnRvbG93ZXIoJGZpbGVfcm93Wydkb2NfZXh0biddKSA9PSAnZG9jeCcpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ2aWV3d29yZD9pPTw/cGhwIGVjaG8gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF0pKTsgPz4maWQ9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkZmlsZV9yb3dbJ2RvY19pZCddKSk7ID8+IiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkcndnZXRSb2xlWydkb2NfZmlsZSddID09ICcxJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWZpbGUtd29yZC1vIj48L2k+V29yZCBmaWxlPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9IGVsc2UgaWYgKHN0cnRvbG93ZXIoJGZpbGVfcm93Wydkb2NfZXh0biddKSA9PSAnbXAzJyB8fCBzdHJ0b2xvd2VyKCRmaWxlX3Jvd1snZG9jX2V4dG4nXSkgPT0gJ3dhdicpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLWEgY2xhc3M9IiIgaHJlZj0iI21vZGFsLWF1ZGlvIiBkYXRhLXVrLW1vZGFsPSIiPjxpIGNsYXNzPSJmYSBmYS1tdXNpYyI+PC9pPiA8L2EtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJhdWRpby1wbGF5ZXI/aWQ9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkX1NFU1NJT05bY2Rlc191c2VyX2lkXSkpOyA/PiZpZD08P3BocCBlY2hvIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRmaWxlX3Jvd1snZG9jX2lkJ10pKTsgPz4iIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRyd2dldFJvbGVbJ2F1ZGlvX2ZpbGUnXSA9PSAnMScpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1tdXNpYyIgdGl0bGU9Ijw/cGhwIGVjaG8gJGxhbmdbJ0F1ZGlvX2ZpbGUnXTsgPz4iPjwvaT4gPCEtLTw/cGhwIGVjaG8gJGxhbmdbJ0F1ZGlvX2ZpbGUnXTsgPz4tLT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gZWxzZSBpZiAoc3RydG9sb3dlcigkZmlsZV9yb3dbJ2RvY19leHRuJ10pID09ICdtcDQnIHx8IHN0cnRvbG93ZXIoJGZpbGVfcm93Wydkb2NfZXh0biddKSA9PSAnM2dwJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InZpZGVvLXBsYXllcj9pZD08P3BocCBlY2hvIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRfU0VTU0lPTltjZGVzX3VzZXJfaWRdKSk7ID8+JmlkPTw/cGhwIGVjaG8gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJGZpbGVfcm93Wydkb2NfaWQnXSkpOyA/PiIgdGFyZ2V0PSJfYmxhbmsiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRyd2dldFJvbGVbJ3ZpZGVvX2ZpbGUnXSA9PSAnMScpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS12aWRlby1jYW1lcmEiIHRpdGxlPSI8P3BocCBlY2hvICRsYW5nWydWaWRlb19maWxlJ107ID8+Ij48L2k+PCEtLTw/cGhwIGVjaG8gJGxhbmdbJ1ZpZGVvX2ZpbGUnXTsgPz4tLT48L2E+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkPSckc2xpZCciKSBvciBkaWUoJ0Vycm9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhc3NfY2hlY2sgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNxbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcGFzc19jaGVja1snaXNfcHJvdGVjdGVkJ10gPT0gMSB8fCAkcGFzc19jaGVja1snaXNfcHJvdGVjdGVkJ10gPT0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI215TW9kYWwiICBkb3dubG9hZCB0aXRsZT0iPD9waHAgZWNobyAkZmlsZV9yb3dbJ29sZF9kb2NfbmFtZSddOyA/PiIgb25jbGljaz0ic2V0RG93bmxvYWREb2NJZCgnPD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkZmlsZV9yb3dbJ2RvY19pZCddKSkgPz4nKTsiPiA8aSBjbGFzcz0iZmEgZmEtZG93bmxvYWQiIGlkID0iZG93bmxvYWRfYnRuIiB0aXRsZT0iPD9waHAgZWNobyAkbGFuZ1snRG93bmxvYWQnXTsgPz4iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gZWxzZSB7ID8+ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJkb3dubG9hZGRvYz9maWxlPTw/cGhwIGVjaG8gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJGZpbGVfcm93Wydkb2NfaWQnXSkpID8+IiBpZD0iZmFuY3lib3gtaW5uZXIiIHRhcmdldD0iX2JsYW5rIiBkb3dubG9hZCB0aXRsZT0iPD9waHAgZWNobyAkZmlsZV9yb3dbJ29sZF9kb2NfbmFtZSddOyA/PiI+IDxpIGNsYXNzPSJmYSBmYS1kb3dubG9hZCIgdGl0bGU9Ijw/cGhwIGVjaG8gJGxhbmdbJ0Rvd25sb2FkJ107ID8+Ij48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRyd2dldFJvbGVbJ2ZpbGVfZWRpdCddID09ICcxJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPiA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGE9Im1ldGFEYXRhPD9waHAgZWNobyAkbjsgPz4iIGlkPSJ2aWV3TWV0YSI+PGkgY2xhc3M9ImZhIGZhLWV5ZSI+PC9pPiBWaWV3IE1ldGFEYXRhPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gaWYgKCRyd2dldFJvbGVbJ2ZpbGVfZGVsZXRlJ10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjY29uLWNsb3NlLW1vZGFsMiIgaWQ9InJlbW92ZVJvdyIgZGF0YT0iPD9waHAgZWNobyAkZmlsZV9yb3dbJ2RvY19pZCddOyA/PiI+PGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iPjwvaT4gRGVsZXRlIDwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkcndnZXRSb2xlWyd3b3JrZmxvd19pbml0aWF0ZV9maWxlJ10gPT0gJzEnIHx8ICRyd2dldFJvbGVbJ2luaXRpYXRlX2ZpbGUnXSA9PSAnMScpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4gPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjYXNzaWduLXdvcmtmbG93IiBpZD0ibW92ZVRvV2YiIGRhdGE9Ijw/cGhwIGVjaG8gJGZpbGVfcm93Wydkb2NfaWQnXTsgPz4iPjxpIGNsYXNzPSJmYSBmYS1wbHVzIj48L2k+IFdvcmtmbG93PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRyd2dldFJvbGVbJ2NoZWNraW5fY2hlY2tvdXQnXSA9PSAnMScpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGlkPSJjaGVja291dCIgZGF0YT0iPD9waHAgZWNobyAkZmlsZV9yb3dbJ2RvY19pZCddOyA/PiI+PGkgY2xhc3M9ImZhIGZhLXNpZ24tb3V0Ij48L2k+IENoZWNrIE91dDwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkcndnZXRSb2xlWydjaGVja2luX2NoZWNrb3V0J10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+IDxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2VkaXRtZXRhZGF0YSIgaWQ9ImVkaXRNZGF0YSIgZGF0YT0iPD9waHAgZWNobyAkZmlsZV9yb3dbJ2RvY19pZCddOyA/PiI+PGkgY2xhc3M9ImZhIGZhLXNpZ24taW4iPjwvaT4gQ2hlY2sgSU48L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibWV0YURhdGE8P3BocCBlY2hvICRuOyA/PiIgIGNsYXNzPSJtZXRhZGF0YSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2ZXJzaW9uVmlldyA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiU0VMRUNUICogRlJPTSB0YmxfZG9jdW1lbnRfbWFzdGVyIHdoZXJlIHN1YnN0cmluZ19pbmRleChkb2NfbmFtZSwnXycsLTEpPSckZmlsZV9yb3dbZG9jX2lkXScgYW5kIHN1YnN0cmluZ19pbmRleChkb2NfbmFtZSwnXycsMSk9JyRzbGlkJyAiKSBvciBkaWUoIkVycm9yOiB0ZXN0IiAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteXNxbGlfbnVtX3Jvd3MoJHZlcnNpb25WaWV3KSA+IDApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaSA9IDEuMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcndWaWV3ID0gbXlzcWxpX2ZldGNoX2Fzc29jKCR2ZXJzaW9uVmlldykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJ3Z2V0Um9sZVsnZmlsZV92ZXJzaW9uJ10gPT0gJzEnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaSA+IDApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICdWZXJzaW9uICcgLiAkaSAuICctJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgoKICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoc3RydG9sb3dlcigkcndWaWV3Wydkb2NfZXh0biddKSA9PSAncGRmJykgeyA/PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InZpZXdlcj9pZD08P3BocCBlY2hvIGJhc2U2NF9lbmNvZGUodXJsZGVjb2RlKCRfU0VTU0lPTlsnY2Rlc191c2VyX2lkJ10pKTsgPz4maT08P3BocCBlY2hvIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRyd1ZpZXdbJ2RvY19pZCddKSk7ID8+IiBpZD0iZmFuY3lib3gtaW5uZXIiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyAkcndWaWV3WydvbGRfZG9jX25hbWUnXTsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9IGVsc2UgaWYgKHN0cnRvbG93ZXIoJHJ3Vmlld1snZG9jX2V4dG4nXSkgPT0gJ2pwZycgfHwgc3RydG9sb3dlcigkcndWaWV3Wydkb2NfZXh0biddKSA9PSAncG5nJyB8fCBzdHJ0b2xvd2VyKCRyd1ZpZXdbJ2RvY19leHRuJ10pID09ICdnaWYnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJpbWFnZXZpZXdlcj91aWQ9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkX1NFU1NJT05bY2Rlc191c2VyX2lkXSkpOyA/PiZpPTw/cGhwIGVjaG8gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJHJ3Vmlld1snZG9jX2lkJ10pKTsgPz4iICB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvICRyd1ZpZXdbJ29sZF9kb2NfbmFtZSddOyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gZWxzZSBpZiAoc3RydG9sb3dlcigkcndWaWV3Wydkb2NfZXh0biddKSA9PSAndGlmJyB8fCBzdHJ0b2xvd2VyKCRyd1ZpZXdbJ2RvY19leHRuJ10pID09ICd0aWZmJykgeyA/PgoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ0aWZmLXZpZXdlcj9pZD08P3BocCBlY2hvIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRfU0VTU0lPTltjZGVzX3VzZXJfaWRdKSk7ID8+Jmk9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkcndWaWV3Wydkb2NfaWQnXSkpOyA/PiIgdGFyZ2V0PSJfYmxhbmsiID4KCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkcndnZXRSb2xlWyd0aWZfZmlsZSddID09ICcxJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGljdHVyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSBlbHNlIGlmIChzdHJ0b2xvd2VyKCRyd1ZpZXdbJ2RvY19leHRuJ10pID09ICd4bHN4JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Inhsc3g/dWlkPTw/cGhwIGVjaG8gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF0pKTsgPz4mZmlsZT08P3BocCBlY2hvIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRyd1ZpZXdbJ2RvY19pZCddKSk7ID8+IiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHJ3Z2V0Um9sZVsnZXhjZWxfZmlsZSddID09ICcxJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtZmlsZS1leGNlbC1vIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSBlbHNlIGlmIChzdHJ0b2xvd2VyKCRyd1ZpZXdbJ2RvY19leHRuJ10pID09ICd4bHMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieGxzP3VpZD08P3BocCBlY2hvIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRfU0VTU0lPTltjZGVzX3VzZXJfaWRdKSk7ID8+JmZpbGU9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkcndWaWV3Wydkb2NfaWQnXSkpOyA/PiIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRyd2dldFJvbGVbJ2V4Y2VsX2ZpbGUnXSA9PSAnMScpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWZpbGUtZXhjZWwtbyI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9IGVsc2UgaWYgKHN0cnRvbG93ZXIoJHJ3Vmlld1snZG9jX2V4dG4nXSkgPT0gJ2RvYycgfHwgc3RydG9sb3dlcigkcndWaWV3Wydkb2NfZXh0biddKSA9PSAnZG9jeCcpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InZpZXd3b3JkP2k9PD9waHAgZWNobyB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkX1NFU1NJT05bY2Rlc191c2VyX2lkXSkpOyA/PiZpZD08P3BocCBlY2hvIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRyd1ZpZXdbJ2RvY19pZCddKSk7ID8+IiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRyd2dldFJvbGVbJ2RvY19maWxlJ10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJHJ3Vmlld1snb2xkX2RvY19uYW1lJ107ID8+Jm5ic3A7Jm5ic3A7PGkgY2xhc3M9ImZhIGZhLWZpbGUtd29yZC1vIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gZWxzZSBpZiAoc3RydG9sb3dlcigkcndWaWV3Wydkb2NfZXh0biddKSA9PSAnbXAzJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjbW9kYWwtYXVkaW8iIGRhdGE9Ijw/cGhwIGVjaG8gJHJ3Vmlld1snZG9jX2lkJ107ID8+IiBpZD0iYXVkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyAkcndWaWV3WydvbGRfZG9jX25hbWUnXTsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gZWxzZSBpZiAoc3RydG9sb3dlcigkcndWaWV3Wydkb2NfZXh0biddKSA9PSAnbXA0JykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjbW9kYWwtdmlkZW8iIGRhdGE9Ijw/cGhwIGVjaG8gJHJ3Vmlld1snZG9jX2lkJ107ID8+IiBpZD0idmlkZW8iPgogICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvICRyd1ZpZXdbJ29sZF9kb2NfbmFtZSddOyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJkb3dubG9hZGRvYz9maWxlPTw/cGhwIGVjaG8gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJHJ3Vmlld1snZG9jX2lkJ10pKTsgPz4iIGlkPSJmYW5jeWJveC1pbm5lciIgdGFyZ2V0PSJfYmxhbmsiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJHJ3Vmlld1snb2xkX2RvY19uYW1lJ107ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcndnZXRSb2xlWydkZWxldGVfdmVyc2lvbiddID09ICcxJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGE9Ijw/cGhwIGVjaG8gJHJ3Vmlld1snZG9jX2lkJ107ID8+IiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlVmVyc2lvbiIgaWQ9ImRlbGV0ZVZlcnNpb25Eb2MiPjxpIGNsYXNzPSJmYSBmYS10cmFzaCI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGkgPSAkaSArIDAuMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICRtZXRhSHRtbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNTAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJkZWxldGVfZXhwb3J0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzbGlkIiBpZD0ic2xpZCIgdmFsdWU9Ijw/cGhwIGVjaG8gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTkgXS8iLCAiIiwgJHNsaWQpOyA/PiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3R5IiBpZD0ic3R5IiB2YWx1ZT0iPD9waHAgZWNobyBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSBdLyIsICIiLCAkX0dFVFsnaWQnXSk7ID8+Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHJ3Z2V0Um9sZVsnZmlsZV9kZWxldGUnXSA9PSAnMScpIHsgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxidXR0b24gaWQ9ImRlbF9maWxlIiBjbGFzcz0icm93c19zZWxlY3RlZCBidG4gYnRuLWRhbmdlciBmYSBmYS10cmFzaC1vIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsX3NlbmRfdG9fcmVjeWNsZSIgdGl0bGU9IkRlbGV0ZSBTZWxlY3RlZCBGaWxlcyI+PC9idXR0b24+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9IGlmICgkcndnZXRSb2xlWydleHBvcnRfY3N2J10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgZmEgZmEtZG93bmxvYWQiIGlkPSJleHBvcnQ0IiAgZGF0YS10b2dnbGU9Im1vZGFsIiAgZGF0YS10YXJnZXQ9IiNtdWx0aS1jc3YtZXhwb3J0LW1vZGVsIiB0aXRsZT0iRXhwb3J0IE1ldGFEYXRhIG9mIFNlbGVjdGVkIEZpbGVzIj48L2J1dHRvbj48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gaWYgKCRyd2dldFJvbGVbJ21vdmVfZmlsZSddID09ICcxJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGJ1dHRvbiBpZD0ibW92ZV9tdWx0aSIgY2xhc3M9InJvd3Nfc2VsZWN0ZWQgYnRuIGJ0bi1wcmltYXJ5IGZhIGZhLXNoYXJlLXNxdWFyZSIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI21vdmUtc2VsZWN0ZWQtZmlsZXMiIHRpdGxlPSJNb3ZlIFNlbGVjdGVkIGZpbGVzIHRvIG90aGVyIFN0b3JhZ2UiPjwvYnV0dG9uPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSBpZiAoJHJ3Z2V0Um9sZVsnY29weV9maWxlJ10gPT0gJzEnKSB7ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YnV0dG9uIGNsYXNzPSJyb3dzX3NlbGVjdGVkIGJ0biBidG4tcHJpbWFyeSBmYSBmYS1jb3B5IiBpZD0iY29weUZpbGVzIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjY29weS1zZWxlY3RlZC1maWxlcyIgdGl0bGU9IkNvcHkgU2VsZWN0ZWQgZmlsZXMgdG8gb3RoZXIgU3RvcmFnZSI+IDwvYnV0dG9uPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSBpZiAoJHJ3Z2V0Um9sZVsnc2hhcmVfZmlsZSddID09ICcxJykgeyA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGJ1dHRvbiBjbGFzcz0icm93c19zZWxlY3RlZCBidG4gYnRuLXByaW1hcnkgZmEgZmEtc2hhcmUtYWx0IiBpZD0ic2hhcmVGaWxlcyIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3NoYXJlLXNlbGVjdGVkLWZpbGVzIiB0aXRsZT0iU2hhcmUgU2VsZWN0ZWQgZmlsZXMiPjwvYnV0dG9uPjwvbGk+CiAgICA8P3BocCB9ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Y2VudGVyPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJldiA9ICRzdGFydCAtICRwZXJfcGFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZXh0ID0gJHN0YXJ0ICsgJHBlcl9wYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhZGphY2VudHMgPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxhc3QgPSAkbWF4X3BhZ2VzIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbWF4X3BhZ2VzID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ncGFnaW5hdGlvbiBzdHJnZVBhZ2UnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFnZWlkID0gcHJlZ19yZXBsYWNlKCIvW14wLTlBLVphLXogXS8iLCAiIiwgJF9HRVRbaWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmV2aW91cyBidXR0b24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoJHN0YXJ0IDw9IDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxsaT48YSBocmVmPSc/aWQ9JHBhZ2VpZCZzdGFydD0kcHJldic+UHJldjwvYT4gPC9saT4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICIgPGxpIGNsYXNzPSdkaXNhYmxlZCc+PGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApJz5QcmV2PC9hPiA8L2xpPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcGFnZXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbWF4X3BhZ2VzIDwgNyArICgkYWRqYWNlbnRzICogMikpIHsgICAvL25vdCBlbm91Z2ggcGFnZXMgdG8gYm90aGVyIGJyZWFraW5nIGl0IHVwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCRjb3VudGVyID0gMTsgJGNvdW50ZXIgPD0gJG1heF9wYWdlczsgJGNvdW50ZXIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaSA9PSAkc3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxsaT48YSBocmVmPSc/aWQ9JHBhZ2VpZCZzdGFydD0kaSc+PGI+JGNvdW50ZXI8L2I+PC9hPiA8L2xpPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGxpPjxhIGhyZWY9Jz9pZD0kcGFnZWlkJnN0YXJ0PSRpJz4kY291bnRlcjwvYT48L2xpPiAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaSA9ICRpICsgJHBlcl9wYWdlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJG1heF9wYWdlcyA+IDUgKyAoJGFkamFjZW50cyAqIDIpKSB7ICAgIC8vZW5vdWdoIHBhZ2VzIHRvIGhpZGUgc29tZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jbG9zZSB0byBiZWdpbm5pbmc7IG9ubHkgaGlkZSBsYXRlciBwYWdlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgkc3RhcnQgLyAkcGVyX3BhZ2UpIDwgMSArICgkYWRqYWNlbnRzICogMikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgkY291bnRlciA9IDE7ICRjb3VudGVyIDwgNCArICgkYWRqYWNlbnRzICogMik7ICRjb3VudGVyKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRpID09ICRzdGFydCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxsaT48YSBocmVmPSc/aWQ9JHBhZ2VpZCZzdGFydD0kaSc+PGI+JGNvdW50ZXI8L2I+PC9hPjwvbGk+ICI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8bGk+IDxhIGhyZWY9Jz9pZD0kcGFnZWlkJnN0YXJ0PSRpJz4kY291bnRlcjwvYT4gPC9saT4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpID0gJGkgKyAkcGVyX3BhZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pbiBtaWRkbGU7IGhpZGUgc29tZSBmcm9udCBhbmQgc29tZSBiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYgKCRtYXhfcGFnZXMgLSAoJGFkamFjZW50cyAqIDIpID4gKCRzdGFydCAvICRwZXJfcGFnZSkgJiYgKCRzdGFydCAvICRwZXJfcGFnZSkgPiAoJGFkamFjZW50cyAqIDIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxsaT48YSBocmVmPSc/aWQ9JHBhZ2VpZCZzdGFydD0wJz4xPC9hPjwvbGk+ICI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGxpPjxhIGhyZWY9Jz9pZD0kcGFnZWlkJnN0YXJ0PSRwZXJfcGFnZSc+MjwvYT48L2xpPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGxpPjxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKSc+Li4uPC9hPjwvbGk+IjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGkgPSAkc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgkY291bnRlciA9ICgkc3RhcnQgLyAkcGVyX3BhZ2UpICsgMTsgJGNvdW50ZXIgPCAoJHN0YXJ0IC8gJHBlcl9wYWdlKSArICRhZGphY2VudHMgKyAyOyAkY291bnRlcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaSA9PSAkc3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiA8bGk+PGEgaHJlZj0nP2lkPSRwYWdlaWQmc3RhcnQ9JGknPjxiPiRjb3VudGVyPC9iPjwvYT48L2xpPiAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxsaT48YSBocmVmPSc/aWQ9JHBhZ2VpZCZzdGFydD0kaSc+JGNvdW50ZXI8L2E+IDwvbGk+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaSA9ICRpICsgJHBlcl9wYWdlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY2xvc2UgdG8gZW5kOyBvbmx5IGhpZGUgZWFybHkgcGFnZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxsaT4gPGEgaHJlZj0nP2lkPSRwYWdlaWQmc3RhcnQ9MCc+MTwvYT4gPC9saT4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxsaT48YSBocmVmPSc/aWQ9JHBhZ2VpZCZzdGFydD0kcGVyX3BhZ2UnPjI8L2E+PC9saT4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxsaT48YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCknPi4uLjwvYT48L2xpPiI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpID0gJHN0YXJ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoJGNvdW50ZXIgPSAoJHN0YXJ0IC8gJHBlcl9wYWdlKSArIDE7ICRjb3VudGVyIDw9ICRtYXhfcGFnZXM7ICRjb3VudGVyKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRpID09ICRzdGFydCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxsaT48YSBocmVmPSc/aWQ9JHBhZ2VpZCZzdGFydD0kaSc+PGI+JGNvdW50ZXI8L2I+PC9hPjwvbGk+ICI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8bGk+IDxhIGhyZWY9Jz9pZD0kcGFnZWlkJnN0YXJ0PSRpJz4kY291bnRlcjwvYT48L2xpPiAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpID0gJGkgKyAkcGVyX3BhZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV4dCBidXR0b24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoJHN0YXJ0ID49ICRmb3VuZG51bSAtICRwZXJfcGFnZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8bGk+PGEgaHJlZj0nP2lkPSRwYWdlaWQmc3RhcnQ9JG5leHQnPk5leHQ8L2E+PC9saT4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8bGkgY2xhc3M9J2Rpc2FibGVkJz48YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCknPk5leHQ8L2E+PC9saT4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjwvY2VudGVyPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyc8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPjxoNCBzdHlsZT0iY29sb3I6IHJlZDtib3JkZXI6IDFweCBzb2xpZCAjYzRjNGNkOyBwYWRkaW5nOjEwcHg7IGJhY2tncm91bmQ6ICNlYmVmZjI7Ij5GaWxlIE5vdCBmb3VuZDwvaDQ+PC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IDwhLS0gY29udGFpbmVyIC0tPgogICAgICAgICAgICAgICAgPC9kaXY+IDwhLS0gY29udGVudCAtLT4KICAgICAgICAgICAgPC9kaXY+ICAKICAgICAgICAgICAgPCEtLSAvLm1vZGFsIC0tPgogICAgICAgICAgICA8ZGl2IGlkPSJkZWxfc2VuZF90b19yZWN5Y2xlIiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+IAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIiBzdHlsZT0iZGlzcGxheTpub25lOyIgaWQ9ImhpZCI+IDxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi10cmlhbmdsZSIgYXJpYS1oaWRkZW49InRydWUiPjwvaT4gSGVyZSdzIGEgbWVzc2FnZSE8L2g0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJjb25maXJtIj4gQXJlIFlvdSBTdXJlPzwvaDQ+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZXJybWVzc2FnZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPiA8aDUgY2xhc3M9InRleHQtYWxlcnQiPlBsZWFzZSBzZWxlY3QgZmlsZXMgZm9yIERlbGV0ZS48L2g1Pjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InRleHQtZGFuZ2VyIiBpZD0iaGlkZSI+QXJlIHlvdSBzdXJlIHdhbnQgdG8gRGVsZXRlIHRoaXM8P3BocCBpZiAoJHJ3Z2V0Um9sZVsncm9sZV9pZCddID09IDEpIHsgPz4gIDxzdHJvbmc+RG9jdW1lbnQgUGVybWFuZW50bHkuPC9zdHJvbmc+PD9waHAgfSA/Pj88L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0ic2xfaWQxIiBuYW1lPSJzbF9pZDEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJyZURlbCIgbmFtZT0iRGVsRmlsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgd2F2ZXMtZWZmZWN0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcndnZXRSb2xlWydyb2xlX2lkJ10gPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgaWQ9InllcyIgbmFtZT0iRGVsbXVsdGlwbGUiIGNsYXNzPSJidG4gYnRuLWRhbmdlciIgdmFsdWU9IlllcyI+IDxpIGNsYXNzPSJmYSBmYS10cmFzaC1vIj48L2k+IFllczwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBpZD0ibm8iIG5hbWU9IkRlbG11bHRpcGxlIiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIiPiA8aSBjbGFzcz0iZmEgZmEtcmVjeWNsZSI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJ3Z2V0Um9sZVsncm9sZV9pZCddID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJ1JlY3ljbGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiRGVsZXRlIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgoKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9ImNzdl9leHBvcnRfbW9kZWwiIGNsYXNzPSJtb2RhbCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIj48aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2k+IEhlcmUncyBhIG1lc3NhZ2UhPC9oND4gCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0idGV4dC1hbGVydCI+UGxlYXNlIHNlbGVjdCBGaWxlcyBmb3IgRXhwb3J0IENTVi48L2g1PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjc3ZfZXhwb3J0X21vZGVsJykuc3R5bGUuZGlzcGxheSA9ICdub25lJyIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCB3YXZlcy1lZmZlY3QiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSAvLm1vZGFsIC0tPiAKICAgICAgICAgICAgPCEtLXNoYXJlIGZpbGVzIHdpdGggdXNlcnMtLT4KICAgICAgICAgICAgPGRpdiBpZD0ic2hhcmUtc2VsZWN0ZWQtZmlsZXMiIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJteU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIj4gCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+IAogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj54PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0ic2hyIj4gPGkgY2xhc3M9ImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPiBIZXJlJ3MgYSBtZXNzYWdlITwvaDQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIiBzdHlsZT0iZGlzcGxheTpub25lOyIgaWQ9InN0aXRsZSI+IFNoYXJlIERvY3VtZW50cyBXaXRoPC9oND4gCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJ1bnNlc2hhcmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJ0ZXh0LWFsZXJ0Ij5QbGVhc2Ugc2VsZWN0IEZpbGVzIGZvciBTaGFyZS48L2g1PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCB3YXZlcy1lZmZlY3QiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJzZWxlY3RlZDIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBVc2VyPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9InNlbGVjdDIgc2VsZWN0Mi1tdWx0aXBsZSIgbXVsdGlwbGUgZGF0YS1wbGFjZWhvbGRlcj0iU2VsZWN0IFVzZXJzIiBuYW1lPSJ1c2VyaWRbXSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2FtZUdyb3VwSURzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ3JvdXAgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX2JyaWRnZV9ncnBfdG9fdW0gd2hlcmUgZmluZF9pbl9zZXQoJyRfU0VTU0lPTltjZGVzX3VzZXJfaWRdJyx1c2VyX2lkcykiKSBvciBkaWUoJ0Vycm9yJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRyd0dyb3VwID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRncm91cCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNhbWVHcm91cElEc1tdID0gJHJ3R3JvdXBbJ3VzZXJfaWRzJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzYW1lR3JvdXBJRHMgPSBhcnJheV91bmlxdWUoJHNhbWVHcm91cElEcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydCgkc2FtZUdyb3VwSURzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2FtZUdyb3VwSURzID0gaW1wbG9kZSgnLCcsICRzYW1lR3JvdXBJRHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1c2VyID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF91c2VyX21hc3RlciB3aGVyZSB1c2VyX2lkIGluKCRzYW1lR3JvdXBJRHMpIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRyd1VzZXIgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHVzZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcndVc2VyWyd1c2VyX2lkJ10gIT0gMSAmJiAkcndVc2VyWyd1c2VyX2lkJ10gIT0gJF9TRVNTSU9OWydjZGVzX3VzZXJfaWQnXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPG9wdGlvbiB2YWx1ZT0iJyAuICRyd1VzZXJbJ3VzZXJfaWQnXSAuICciPicgLiAkcndVc2VyWydmaXJzdF9uYW1lJ10gLiAnICcgLiAkcndVc2VyWydsYXN0X25hbWUnXSAuICc8L29wdGlvbj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPG9wdGlvbiB2YWx1ZT0iJyAuICRyd1VzZXJbJ3VzZXJfaWQnXSAuICciPicgLiAkcndVc2VyWydmaXJzdF9uYW1lJ10gLiAnICcgLiAkcndVc2VyWydsYXN0X25hbWUnXSAuICc8L29wdGlvbj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJzaGFyZV9kb2NpZHMiIG5hbWU9InNoYXJlRmlsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IHdhdmVzLWVmZmVjdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJzaGFyZUZpbGVzIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij4gPGkgY2xhc3M9ImZhIGZhLXNoYXJlLWFsdCI+PC9pPiBTaGFyZTwvYnV0dG9uPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+PCEtLSAvLm1vZGFsIC0tPiAKICAgICAgICAgICAgPCEtLS1hc3NpZ24gbWV0YS1kYXRhIG1vZGVsIHN0YXJ0IC0tLS0+CiAgICAgICAgICAgIDxkaXYgaWQ9ImNvbi1jbG9zZS1tb2RhbDUiIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJteU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIj4gCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+IAogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj7DlzwvYnV0dG9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiPkFzc2lnbiBNZXRhLURhdGEgRmllbGRzIHRvIDxzdHJvbmc+PD9waHAgZWNobyAkcndGb2xkZXJbJ3NsX25hbWUnXTsgPz48L3N0cm9uZz48L2g0PiAKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGRhdGEtcGFyc2xleS12YWxpZGF0ZSBub3ZhbGlkYXRlIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5IHJvdyI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0xMiBzaGl2IG1ldGFhIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PHN0cm9uZz5GaWVsZCBTZWxlY3Q6PC9zdHJvbmc+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIHN0eWxlPSJtYXJnaW4tbGVmdDogMTEzcHg7Ij5GaWVsZCBBc3NpZ25lZDo8L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBtdWx0aXBsZT0ibXVsdGlwbGUiIGNsYXNzPSJtdWx0aS1zZWxlY3QiIGlkPSJteV9tdWx0aV9zZWxlY3QxIiBuYW1lPSJteV9tdWx0aV9zZWxlY3QxW10iIGRhdGEtcGx1Z2luPSJtdWx0aXNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFycmFyTWV0YSA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWV0YXMgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX21ldGFkYXRhX3RvX3N0b3JhZ2VsZXZlbCB3aGVyZSBzbF9pZCA9ICckc2xpZCciKSBvciBkaWUoJ0Vycm9yOiBtZXRhZGF0YScgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRtZXRhdmFsID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRtZXRhcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCRhcnJhck1ldGEsICRtZXRhdmFsWydtZXRhZGF0YV9pZCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXRhID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9tZXRhZGF0YV9tYXN0ZXIgb3JkZXIgYnkgZmllbGRfbmFtZSBhc2MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcndNZXRhID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRtZXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkcndNZXRhWydpZCddLCAkYXJyYXJNZXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8b3B0aW9uIHZhbHVlPSInIC4gJHJ3TWV0YVsnaWQnXSAuICciIHNlbGVjdGVkPicgLiAkcndNZXRhWydmaWVsZF9uYW1lJ10gLiAnPC9vcHRpb24+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8b3B0aW9uIHZhbHVlPSInIC4gJHJ3TWV0YVsnaWQnXSAuICciPicgLiAkcndNZXRhWydmaWVsZF9uYW1lJ10gLiAnPC9vcHRpb24+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9Ijw/cGhwIGVjaG8gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTkgXS8iLCAiIiwgYmFzZTY0X2RlY29kZSh1cmxkZWNvZGUoJF9HRVRbJ2lkJ10pKSk7ID8+IiBuYW1lPSJpZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgd2F2ZXMtZWZmZWN0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgd2F2ZXMtZWZmZWN0IHdhdmVzLWxpZ2h0IiB0eXBlPSJzdWJtaXQiIG5hbWU9ImFzc2lnbk1ldGEiPlN1Ym1pdDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8IS0tZW5kcyBhc3NpZ24tbWV0YS1kYXRhIG1vZGFsIC0tPiAKICAgICAgICAgICAgPD9waHAgcmVxdWlyZV9vbmNlICcuL2FwcGxpY2F0aW9uL3BhZ2VzL2Zvb3Rlci5waHAnOyA/PgogICAgICAgICAgICA8IS0tIFJpZ2h0IFNpZGViYXIgLS0+Cjw/cGhwIHJlcXVpcmVfb25jZSAnLi9hcHBsaWNhdGlvbi9wYWdlcy9yaWdodFNpZGViYXIucGhwJzsgPz4KICAgICAgICAgICAgPCEtLSAvUmlnaHQtYmFyIC0tPgoKICAgICAgICAgICAgPCEtLSBFTkQgd3JhcHBlciAtLT4KPD9waHAgcmVxdWlyZV9vbmNlICcuL2FwcGxpY2F0aW9uL3BhZ2VzL2Zvb3RlckZvcmpzLnBocCc7ID8+CiAgICAgICAgICAgIDwhLS1mb3IgbXVsdGlzZWxlY3QtLT4KICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYXNzZXRzL3BsdWdpbnMvbXVsdGlzZWxlY3QvanMvanF1ZXJ5Lm11bHRpLXNlbGVjdC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJhc3NldHMvanMvanF1ZXJ5LmNvcmUuanMiPjwvc2NyaXB0PgoKICAgICAgICAgICAgPHNjcmlwdCBzcmM9ImFzc2V0cy9wbHVnaW5zL2Jvb3RzdHJhcC1maWxlc3R5bGUvanMvYm9vdHN0cmFwLWZpbGVzdHlsZS5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJhc3NldHMvcGx1Z2lucy9zZWxlY3QyL2pzL3NlbGVjdDIubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoKICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYXNzZXRzL3BsdWdpbnMvcGFyc2xleWpzL3BhcnNsZXkubWluLmpzIj48L3NjcmlwdD4KICAgICAgICAgICAgPHNjcmlwdCBzcmM9ImFzc2V0cy9wbHVnaW5zL2pzdHJlZS9qc3RyZWUubWluLmpzIj48L3NjcmlwdD4KICAgICAgICAgICAgPHNjcmlwdCBzcmM9ImFzc2V0cy9wYWdlcy9qcXVlcnkudHJlZS5qcyI+PC9zY3JpcHQ+CgogICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJhc3NldHMvbXVsdGlfZnVuY3Rpb25fc2NyaXB0LmpzIj48L3NjcmlwdD4KCiAgICAgICAgICAgIDwhLS0gZm9yIHNlYXJjaGFibGUgc2VsZWN0LS0+CiAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIuc2VsZWN0MiIpLnNlbGVjdDIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgPC9zY3JpcHQ+CgogICAgICAgICAgICA8IS0tZWRpdCBtZXRhZGF0YS0tPgogICAgICAgICAgICA8c2NyaXB0PgogICAgICAgICAgICAgICAgJCgiYSNlZGl0TWRhdGEiKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyICRpZCA9ICQodGhpcykuYXR0cignZGF0YScpOwogICAgICAgICAgICAgICAgICAgIHZhciAkcm93ID0gJCh0aGlzKS5jbG9zZXN0KCd0cicpOwogICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gJyc7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9ICRyb3cuZmluZCgndGQ6bnRoLWNoaWxkKDIpJykubWFwKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLmhhc0NsYXNzKCdhY3Rpb25zJykpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gJC50cmltKCR0aGlzLnRleHQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICQoIiNlZGl0bWV0YWRhdGEgLm1vZGFsLXRpdGxlIikuaHRtbCgiVXBkYXRlIE1ldGEgRGF0YSBvZiBGaWxlOiA8c3Ryb25nPiIgKyBuYW1lICsgIjwvc3Ryb25nPiIpOwogICAgICAgICAgICAgICAgICAgICAgICAkLnBvc3QoImFwcGxpY2F0aW9uL2FqYXgvZWRpdE1kYXRhVmFsdWUucGhwIiwge0lEOiAkaWR9LCBmdW5jdGlvbiAocmVzdWx0LCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI21vZGFsTW9kaWZ5TXZhbHVlIikuaHRtbChyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICA8L3NjcmlwdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoKICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAkKCdmb3JtJykucGFyc2xleSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAkKCIuc2VsZWN0MiIpLnNlbGVjdDIoKTsKICAgICAgICAgICAgICAgICQoJyNiYXNpY1RyZWUnKQogICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC5vbignY2hhbmdlZC5qc3RyZWUnLCBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubm9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVJRCA9IGRhdGEubm9kZS5pZCArICdfYW5jaG9yJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHJlZiA9ICQoIiMiICsgbm9kZUlEKS5hdHRyKCdocmVmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBudWxsLCBocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGhyZWY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgaiwgciA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaiA9IGRhdGEuc2VsZWN0ZWQubGVuZ3RoOyBpIDwgajsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoKGRhdGEuaW5zdGFuY2UuZ2V0X25vZGUoZGF0YS5zZWxlY3RlZFtpXSkudGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyQoJyNldmVudF9yZXN1bHQnKS5odG1sKCdTZWxlY3RlZCA6IDxzdHJvbmc+JyArIHIuam9pbignLCAnKSArICc8L3N0cm9uZz4nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAgICAgLmpzdHJlZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhlbWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzcG9uc2l2ZSc6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ljb24nOiAnbWQgbWQtZm9sZGVyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGUnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ21kIG1kLW15LWxpYnJhcnktYm9va3MnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbHVnaW5zJzogWyd0eXBlcyddCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgICAgICAvL0Rpc2FibGUgbW91c2UgcmlnaHQgY2xpY2sKICAgICAgICAgICAgICAgICAgICAkKCJib2R5Iikub24oImNvbnRleHRtZW51IiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIDwvc2NyaXB0PgogICAgICAgICAgICA8c2NyaXB0PgoKICAgICAgICAgICAgICAgICQoImEjdmlld01ldGEiKS5jbGljayhmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmZpbmQoJ2knKS5oYXNDbGFzcygnZmEtZXllJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgiLm1ldGFkYXRhIikuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgiYSN2aWV3TWV0YSIpLmZpbmQoJ2knKS5yZW1vdmVDbGFzcygnZmEtZXllJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoImEjdmlld01ldGEiKS5maW5kKCdpJykuYWRkQ2xhc3MoJ2ZhLWV5ZScpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWlkID0gJCh0aGlzKS5hdHRyKCJkYXRhIik7CiAgICAgICAgICAgICAgICAgICAgICAgICQoIiMiICsgbWlkKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCdpJykucmVtb3ZlQ2xhc3MoJ2ZhLWV5ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2knKS5hZGRDbGFzcygnZmEtZXllJykKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkKCIubWV0YWRhdGEiKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCJhI3ZpZXdNZXRhIikuZmluZCgnaScpLnJlbW92ZUNsYXNzKCdmYS1leWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgiYSN2aWV3TWV0YSIpLmZpbmQoJ2knKS5hZGRDbGFzcygnZmEtZXllJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAkKCJpbnB1dDpjaGVja2JveCIpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0gInRhYmxlIC4iICsgJCh0aGlzKS5hdHRyKCJuYW1lIik7CiAgICAgICAgICAgICAgICAgICAgJChjb2x1bW4pLnRvZ2dsZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIDwvc2NyaXB0PgogICAgICAgICAgICA8ZGl2IGlkPSJtdWx0aS1jc3YtZXhwb3J0LW1vZGVsIiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+IAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSIgaWQ9ImNsb3NlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+w5c8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJ1bmV4cG9ydCI+PGkgY2xhc3M9ImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPiBIZXJlJ3MgYSBtZXNzYWdlITwvaDQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGg0IGNsYXNzPSJtb2RhbC10aXRsZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIGlkPSJleHBvcnRfdGl0bGUiPiBFeHBvcnQgU2VsZWN0ZWQgUm93cyA8L2g0Pi0tPiAKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImV4cG9ydF91bnNlbGVjdGVkIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9InRleHQtYWxlcnQiPiBQbGVhc2Ugc2VsZWN0IEZpbGVzIGZvciBFeHBvcnQuPC9oNT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IHdhdmVzLWVmZmVjdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImV4cG9ydF9zZWxlY3RlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+RXhwb3J0IFNlbGVjdGVkIERhdGE8L2g0PiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249Im11bHRpX2RhdGFfZXhwb3J0IiBkYXRhLXBhcnNsZXktdmFsaWRhdGUgbm92YWxpZGF0ZSBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkgcm93Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0xMiBzaGl2IG1ldGFhIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxzdHJvbmc+U2VsZWN0IEZpbGVzIGZvciBFeHBvcnQgRm9ybWF0Ojwvc3Ryb25nPjwvc3Bhbj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0ICBjbGFzcz0ibXVsdGktc2VsZWN0IiBpZD0ibXlfbXVsdGlfc2VsZWN0MSIgbmFtZT0ic2VsZWN0X0ZtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJjc3YiPkNzdjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImV4Y2VsIj5FeGNlbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InBkZiI+UGRmPC9vcHRpb24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IndvcmQiPldvcmQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImV4cG9ydF9kb2NfaWRzIiBpZD0iZXhwb3J0X2RvY19pZHMiIHZhbHVlPSIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSI8P3BocCBlY2hvIHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgIiIsIGJhc2U2NF9kZWNvZGUodXJsZGVjb2RlKCRfR0VUWydpZCddKSkpOyA/PiIgbmFtZT0iaWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCB3YXZlcy1lZmZlY3QiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgd2F2ZXMtZWZmZWN0IHdhdmVzLWxpZ2h0IGZhIGZhLWRvd25sb2FkIiB0eXBlPSJzdWJtaXQiIG5hbWU9ImV4cG9ydERhdGEiPiBFeHBvcnQ8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8IS0tZm9yIGF1ZGlvIG1vZGVsLS0+CiAgICAgICAgICAgIDxkaXYgaWQ9Im1vZGFsLWF1ZGlvIiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1oaWRkZW49InRydWUiPsOXPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0ibXlNb2RhbExhYmVsIj5QbGF5L0Rvd25sb2FkIEF1ZGlvPC9oND4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImZvcmF1ZGlvIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgd2F2ZXMtZWZmZWN0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+PCEtLSAvLm1vZGFsLWNvbnRlbnQgLS0+CiAgICAgICAgICAgICAgICA8L2Rpdj48IS0tIC8ubW9kYWwtZGlhbG9nIC0tPgogICAgICAgICAgICA8L2Rpdj48IS0tIC8ubW9kYWwgLS0+CiAgICAgICAgICAgIDwhLS1mb3IgdmlkZW8gbW9kZWwtLT4KICAgICAgICAgICAgPGRpdiBpZD0ibW9kYWwtdmlkZW8iIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJteU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJteU1vZGFsTGFiZWwiPlBsYXkvRG93bmxvYWQgdmlkZW88L2g0PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAgaWQ9InZpZGVvZm9yIj4KCgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IHdhdmVzLWVmZmVjdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PjwhLS0gLy5tb2RhbC1jb250ZW50IC0tPgogICAgICAgICAgICAgICAgPC9kaXY+PCEtLSAvLm1vZGFsLWRpYWxvZyAtLT4KICAgICAgICAgICAgPC9kaXY+PCEtLSAvLm1vZGFsIC0tPgogICAgICAgICAgICA8IS0tbW9kaWZ5IHN0YXJ0cy0tPgogICAgICAgICAgICA8ZGl2IGlkPSJjb24tY2xvc2UtbW9kYWwiIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJteU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWxnIj4gCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+IAogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj7DlzwvYnV0dG9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIj5VcGRhdGUgWW91ciBmaWxlPC9oND4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiIGlkPSJtb2RhbE1vZGlmeSI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCB3YXZlcy1lZmZlY3QiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJlZGl0RmlsZU5hbWUiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgd2F2ZXMtZWZmZWN0IHdhdmVzLWxpZ2h0Ij5TYXZlIGNoYW5nZXM8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgoKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+PCEtLSAvLm1vZGFsIC0tPgogICAgICAgICAgICA8ZGl2IGlkPSJjb24tY2xvc2UtbW9kYWwtbW9kaWZ5IiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+IAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIj5Nb2RpZnkgU3RvcmFnZSBMZXZlbDwvaDQ+IAogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCIgbmFtZT0ibW9kaWZ5X3NsbmFtZSIgdmFsdWU9Ijw/cGhwIGVjaG8gJHJ3Rm9sZGVyWydzbF9uYW1lJ107ID8+IiByZXF1aXJlZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHZhbHVlPSI8P3BocCBlY2hvICRyd0ZvbGRlclsnc2xfaWQnXTsgPz4iIG5hbWU9Im1vZGkiIHR5cGU9ImhpZGRlbiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT0iPD9waHAgZWNobyAkcndGb2xkZXJbJ3NsX2RlcHRoX2xldmVsJ107ID8+IiBuYW1lPSJkcHRoIiB0eXBlPSJoaWRkZW4iID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCB3YXZlcy1lZmZlY3QiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InVwZGF0ZSIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgdmFsdWU9IlNhdmUgQ2hhbmdlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj48IS0tIC8ubW9kYWwgLS0+ICAKICAgICAgICAgICAgPCEtLXN0YXJ0IGRlbGV0ZSBtb2RlbC0tPgogICAgICAgICAgICA8ZGl2IGlkPSJjb24tY2xvc2UtbW9kYWwyIiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+IAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIj5EZWxldGUgRG9jdW1lbnQ8L2g0PiAKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9ImNvbG9yOiByZWQ7Ij5BcmUgeW91IHN1cmUgdGhhdCB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyA8c3Ryb25nPkRvY3VtZW50PC9zdHJvbmc+PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0idWlkIiBuYW1lPSJ1aWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyd2dldFJvbGVbJ3JvbGVfaWQnXSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBpZD0ieWVzIiBuYW1lPSJkZWxldGVEb2MiIGNsYXNzPSJidG4gYnRuLWRhbmdlciIgdmFsdWU9IlllcyI+IDxpIGNsYXNzPSJmYSBmYS10cmFzaC1vIj48L2k+IERlbGV0ZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBpZD0ibm8iIG5hbWU9ImRlbGV0ZURvYyIgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIj4gPGkgY2xhc3M9ImZhIGZhLXJlY3ljbGUiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyd2dldFJvbGVbJ3JvbGVfaWQnXSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICdSZWN5Y2xlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIkRlbGV0ZSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+PCEtLWVuZHMgZGVsZXRlIG1vZGFsIC0tPgogICAgICAgICAgICA8IS0tc3RhcnQgZGVsZXRlIG1vZGVsLS0+CiAgICAgICAgICAgIDxkaXYgaWQ9ImNvbi1jbG9zZS1tb2RhbDIxIiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+IAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIj5EZWxldGUgRG9jdW1lbnQ8L2g0PiAKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9ImNvbG9yOiByZWQ7Ij5BcmUgeW91IHN1cmUgdGhhdCB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyA8c3Ryb25nPkRvY3VtZW50PC9zdHJvbmc+PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0idWlkIiBuYW1lPSJ1aWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IHdhdmVzLWVmZmVjdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJkZWxldGVEb2MiIGNsYXNzPSJidG4gYnRuLWRhbmdlciIgdmFsdWU9IkRlbGV0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj48IS0tZW5kcyBkZWxldGUgbW9kYWwgLS0+CiAgICAgICAgICAgIDwhLS1zdGFydCBkZWxldGUgVmVyc2lvbiBvZiBEb2N1bWVudCBtb2RlbC0tPgogICAgICAgICAgICA8ZGl2IGlkPSJkZWxldGVWZXJzaW9uIiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+IAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIj5EZWxldGUgVmVyc2lvbiBvZiBEb2N1bWVudDwvaDQ+IAogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBzdHlsZT0iY29sb3I6IHJlZDsiPkFyZSB5b3Ugc3VyZSB0aGF0IHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHZlcnNpb24gb2YgPHN0cm9uZz5Eb2N1bWVudDwvc3Ryb25nPi4gdGhpcyBkb2N1bWVudCB3aWxsIGJlIGRlbGV0ZWQgcGVybWFuZW50bHkuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iZG9jaWQiIG5hbWU9ImRvY2lkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCB3YXZlcy1lZmZlY3QiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iZGVsZXRlVmVyc2lvbkRvYyIgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIiB2YWx1ZT0iRGVsZXRlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PjwhLS1lbmRzIGRlbGV0ZSBtb2RhbCAtLT4KICAgICAgICAgICAgPGRpdiBpZD0iZnVsbC13aWR0aC1tb2RhbCIgY2xhc3M9Im1vZGFsIGZhZGUgYnMtZXhhbXBsZS1tb2RhbC1sZyIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlMYXJnZU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj7DlzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6MyU7IiAgIGFyaWEtaGlkZGVuPSJ0cnVlIiBpZD0iYnRuUHJpbnQiPjxpIGNsYXNzPSJmYSBmYS1wcmludCI+PC9pPjwvYnV0dG9uPi0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgcHVsbC1yaWdodCIgaWQ9ImRvd25sb2FkIj48aSBjbGFzcz0iZmEgZmEtZG93bmxvYWQiPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0ibXlMYXJnZU1vZGFsTGFiZWwiPkltYWdlIFZpZXdlcjwvaDQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRpc3BsYXkiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCB3YXZlcy1lZmZlY3QiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoKICAgICAgICAgICAgICAgICQoIiNidG5QcmludCIpLm9uKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KCdoaScpOwogICAgICAgICAgICAgICAgICAgIHZhciBkaXZDb250ZW50cyA9ICQoIiNEaXNwbGF5IikuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmludFdpbmRvdyA9IHdpbmRvdy5vcGVuKCcnLCAnJywgJ2hlaWdodD04MDAsd2lkdGg9ODAwJyk7CiAgICAgICAgICAgICAgICAgICAgLy9wcmludFdpbmRvdy5kb2N1bWVudC53cml0ZSgnPGh0bWw+PGhlYWQ+PHRpdGxlPkltYWdlPC90aXRsZT4nKTsKICAgICAgICAgICAgICAgICAgICAvL3ByaW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8L2hlYWQ+PGJvZHkgPicpOwogICAgICAgICAgICAgICAgICAgIHByaW50V2luZG93LmRvY3VtZW50LndyaXRlKGRpdkNvbnRlbnRzKTsKICAgICAgICAgICAgICAgICAgICAvL3ByaW50V2luZG93LmRvY3VtZW50LndyaXRlKCc8L2JvZHk+PC9odG1sPicpOwogICAgICAgICAgICAgICAgICAgIHByaW50V2luZG93LmRvY3VtZW50LmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRXaW5kb3cucHJpbnQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgPCEtLS1hc3NpZ24gd29ya2Zsb3ctLS0tPgogICAgICAgICAgICA8ZGl2IGlkPSJhc3NpZ24td29ya2Zsb3ciIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJteU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiPkFzc2lnbiBpbiBXb3JrIGZsb3c8L2g0PiAKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgY2xhc3M9ImZvcm0taW5saW5lIiBpZD0id2Zhc2lnbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Bc3NpZ24gVG86PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCIgY2xhc3M9InNlbGVjdHBpY2tlciIgZGF0YS1saXZlLXNlYXJjaD0idHJ1ZSIgaWQ9IndmaWQiIGRhdGEtc3R5bGU9ImJ0bi13aGl0ZSIgc3R5bGU9IiIgbmFtZT0id2ZpZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZCBkaXNhYmxlZCBzdHlsZT0iYmFja2dyb3VuZDogIzgwODA4MDsgY29sb3I6ICMxMjEyMTM7Ij5TZWxlY3QgV29ya2Zsb3c8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRXb3JrZmx3R2V0ID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF93b3JrZmxvd19tYXN0ZXIiKSBvciBkaWUoJ0Vycm9yIGluIGdldFdvcmtmbHcgQXNzaWduOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcndXb3JrZmx3R2V0ID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRXb3JrZmx3R2V0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPD9waHAgZWNobyAkcndXb3JrZmx3R2V0Wyd3b3JrZmxvd19pZCddOyA/PiIgbmFtZT0id3JrbmFtZSI+PD9waHAgZWNobyAkcndXb3JrZmx3R2V0Wyd3b3JrZmxvd19uYW1lJ107ID8+PC9vcHRpb24+Cjw/cGhwIH0gPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9Im1Ub3dmIiBuYW1lPSJtVG93ZiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgd2F2ZXMtZWZmZWN0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJhc3NpZ25UbyIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgdmFsdWU9IlN1Ym1pdCIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPCEtLWRpc3BsYXkgd2FpdCBnaWYgaW1hZ2UgYWZ0ZXIgc3VibWl0LS0+CiAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTsgd2lkdGg6IDEwMCU7IHotaW5kZXg6IDIwMDA7IHBvc2l0aW9uOiBmaXhlZDsgdG9wOjA7IiBpZD0id2FpdCI+OwoKICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJhc3NldHMvaW1hZ2VzL3Byb2NlZWQuZ2lmIiBhbHQ9ImxvYWQiICBzdHlsZT0iIG1hcmdpbi1sZWZ0OiA0OCU7IG1hcmdpbi10b3A6IDI1MHB4OyB3aWR0aDogMTAwcHg7IGhlaWdodDoxMDBweDsgcG9zaXRpb246IGZpeGVkOyAiLz4KICAgICAgICAgICAgPC9kaXY+ICAKICAgICAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgICAgIC8vZm9yIHdhaXQgZ2lmIGRpc3BsYXkgYWZ0ZXIgc3VibWl0CiAgICAgICAgICAgICAgICB2YXIgaGVpaHQgPSAkKGRvY3VtZW50KS5oZWlnaHQoKTsKICAgICAgICAgICAgICAgIC8vYWxlcnQoaGVpaHQpOwogICAgICAgICAgICAgICAgJCgnI3dhaXQnKS5jc3MoJ2hlaWdodCcsIGhlaWh0KTsKICAgICAgICAgICAgICAgICQoJyN3ZmFzaWduJykuc3VibWl0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50cmltKCQoIiN3ZmlkIikudmFsKCkpICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyN3YWl0Jykuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyQoJyN3YWl0JykuY3NzKCdoZWlnaHQnLGhlaWh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Fzc2lnbi13b3JrZmxvdycpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIDwvc2NyaXB0PgogICAgICAgICAgICA8IS0tRWRpdCBtZXRhZGF0YS0tPgogICAgICAgICAgICA8ZGl2IGlkPSJlZGl0bWV0YWRhdGEiIGNsYXNzPSJtb2RhbCBmYWRlIGJzLWV4YW1wbGUtbW9kYWwtbGciIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9Im15TW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtbGciPiAKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+RWRpdCBNZXRhRGF0YTwvaDQ+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5IiBpZD0ibW9kYWxNb2RpZnlNdmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJhc3NldHMvaW1hZ2VzL2xvYWQuZ2lmIiBhbHQ9ImxvYWQiIGNsYXNzPSJpbWctcmVzcG9uc2l2ZSBjZW50ZXItYmxvY2siIHdpZHRoPSI1MHB4Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJlZGl0TWV0YVZhbHVlIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5TYXZlICYgVXBkYXRlIDwvYnV0dG9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CgogICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0tQ3JlYXRlIHN1YiBmb2xkZXIgbW9kZWwgc3RhcnQgLS0tLT4KICAgICAgICAgICAgPGRpdiBpZD0iY29uLWNsb3NlLW1vZGFsMSIgY2xhc3M9Im1vZGFsIGZhZGUiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9Im15TW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciPiAKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1oaWRkZW49InRydWUiPsOXPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+QWRkIFN1YiBGb2xkZXIgdG8gPGI+PD9waHAgZWNobyAkcndGb2xkZXJbJ3NsX25hbWUnXTsgPz48L2I+PC9oND4gCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jb250cm9sIiBuYW1lPSJjcmVhdGVfY2hpbGQiIHBsYWNlaG9sZGVyPSJFbnRlciBTdWIgRm9sZGVyIE5hbWUuLi4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gJHJ3Rm9sZGVyWydzbF9pZCddOyA/PiIgbmFtZT0iYWRkX2NoaWxkIiB0eXBlPSJoaWRkZW4iID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCB3YXZlcy1lZmZlY3QiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImFkZF9zdG9yYWdlIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiB2YWx1ZT0iQ1JFQVRFIFNVQiBGT0xERVIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwhLS1lbmRzIENyZWF0ZSBjaGlsZCBtb2RhbCAtLT4gCiAgICAgICAgICAgIDwhLS1zdGFydCBkZWxldGUgbW9kZWwtLT4KICAgICAgICAgICAgPGRpdiBpZD0iY29uLWNsb3NlLW1vZGFsLWRlbCIgY2xhc3M9Im1vZGFsIGZhZGUiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9Im15TW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciPiAKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1oaWRkZW49InRydWUiPsOXPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+RGVsZXRlIFN0b3JhZ2U8L2g0PiAKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9ImNvbG9yOiByZWQ7Ij5BcmUgeW91IHN1cmUgdGhhdCB5b3Ugd2FudCB0byBkZWxldGUgPHN0cm9uZz48P3BocCBlY2hvICRyd0ZvbGRlclsnc2xfbmFtZSddOyA/Pjwvc3Ryb25nPiBGb2xkZXIgYW5kIHRoZWlyIFN1Yi1mb2xkZXI/PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gJHJ3Rm9sZGVyWydzbF9pZCddOyA/PiIgbmFtZT0iZGVsc2wiIHR5cGU9ImhpZGRlbiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IHdhdmVzLWVmZmVjdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJkZWxldGVkIiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIiIHZhbHVlPSJEZWxldGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+PCEtLWVuZHMgZGVsZXRlIG1vZGFsIC0tPiAKICAgICAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgICAgICQoImEjY2hlY2tvdXQiKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGggPSAkKHRoaXMpLmF0dHIoJ2RhdGEnKTsKICAgICAgICAgICAgICAgICAgICAvLyBhbGVydChpZCk7CgogICAgICAgICAgICAgICAgICAgICQucG9zdCgiYXBwbGljYXRpb24vYWpheC9jaGVja291dC5waHAiLCB7Q0hFQ0tPVVQ6IHBhdGh9LCBmdW5jdGlvbiAocmVzdWx0LCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAiPD9waHAgZWNobyBiYXNlbmFtZSgkX1NFUlZFUlsnUEhQX1NFTEYnXSkgLiAnPycgLiAkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ107ID8+IjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgJCgiYSNlZGl0TWRhdGEiKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gJCh0aGlzKS5hdHRyKCdkYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxlcnQoaWQpOwoKICAgICAgICAgICAgICAgICAgICAkLnBvc3QoImFwcGxpY2F0aW9uL2FqYXgvY2hlY2tpbi5waHAiLCB7Q0hFQ0tJTjogaWR9LCBmdW5jdGlvbiAocmVzdWx0LCBzdGF0dXMpIHsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICQoImEjZWRpdFJvdyIpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSAkKHRoaXMpLmF0dHIoJ2RhdGEnKTsKICAgICAgICAgICAgICAgICAgICAvLyBhbGVydChpZCk7CgogICAgICAgICAgICAgICAgICAgICQucG9zdCgiYXBwbGljYXRpb24vYWpheC91cGRhdGVEb2N1bWVudC5waHAiLCB7SUQ6IGlkfSwgZnVuY3Rpb24gKHJlc3VsdCwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjbW9kYWxNb2RpZnkiKS5odG1sKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgJCgiYSNzaG93UGljIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXRoID0gJCh0aGlzKS5hdHRyKCdkYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxlcnQoaWQpOwoKICAgICAgICAgICAgICAgICAgICAkLnBvc3QoImFwcGxpY2F0aW9uL2FqYXgvZGlzcGxheUltYWdlLnBocCIsIHtQQVRIOiBwYXRofSwgZnVuY3Rpb24gKHJlc3VsdCwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjRGlzcGxheSIpLmh0bWwocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAkKCJhI3JlbW92ZVJvdyIpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSAkKHRoaXMpLmF0dHIoJ2RhdGEnKTsKICAgICAgICAgICAgICAgICAgICAvLyBhbGVydChpZCk7CiAgICAgICAgICAgICAgICAgICAgJCgiI3VpZCIpLnZhbChpZCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICQoImEjZGVsZXRlVmVyc2lvbkRvYyIpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSAkKHRoaXMpLmF0dHIoImRhdGEiKTsKICAgICAgICAgICAgICAgICAgICAkKCIjZG9jaWQiKS52YWwoaWQpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAkKCJhI3ZpZGVvIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpZCA9ICQodGhpcykuYXR0cignZGF0YScpOwogICAgICAgICAgICAgICAgICAgICQucG9zdCgiYXBwbGljYXRpb24vYWpheC92aWRlb2Zvcm1hdC5waHAiLCB7dmlkOiBpZH0sIGZ1bmN0aW9uIChyZXN1bHQsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09ICdzdWNjZXNzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI3ZpZGVvZm9yIikuaHRtbChyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydChyZXN1bHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAkKCJhI2F1ZGlvIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpZCA9ICQodGhpcykuYXR0cignZGF0YScpOwogICAgICAgICAgICAgICAgICAgICQucG9zdCgiYXBwbGljYXRpb24vYWpheC9hdWRpb2Zvcm1hdC5waHAiLCB7YWlkOiBpZH0sIGZ1bmN0aW9uIChyZXN1bHQsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09ICdzdWNjZXNzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI2ZvcmF1ZGlvIikuaHRtbChyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydChyZXN1bHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAkKCJhI21vdmVUb1dmIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpZCA9ICQodGhpcykuYXR0cignZGF0YScpOwogICAgICAgICAgICAgICAgICAgIC8vIGFsZXJ0KGlkKTsKICAgICAgICAgICAgICAgICAgICAkKCIjbVRvd2YiKS52YWwoaWQpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9mb3IgZG9jdW1lbnQgc2hhcmUgZ2V0IHVzZXIgaWRzCiAgICAgICAgICAgICAgICAkKCJpbnB1dCNzaHJlSWQiKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIElkcyA9ICQodGhpcykuYXR0cignZGF0YS1kb2MtaWQnKTsKICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KElkcyk7CgogICAgICAgICAgICAgICAgICAgICQucG9zdCgiYXBwbGljYXRpb24vYWpheC9zaGFyZURvY3VtZW50LnBocCIsIHtET0NJRFM6IElkc30sIGZ1bmN0aW9uIChyZXN1bHQsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09ICdzdWNjZXNzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI3NocmUiKS5odG1sKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGVydChyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAgICAgIDwhLS0gTU9EQUwgZm9yIGFkZHdvcmtmbG93IC0tPgogICAgICAgICAgICA8c2NyaXB0PgoKICAgICAgICAgICAgICAgICQoIiN3ZmlkIikuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd2ZJZCA9ICQodGhpcykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgLy9hbGVydChsYmwpOwogICAgICAgICAgICAgICAgICAgICQucG9zdCgiYXBwbGljYXRpb24vYWpheC93b3JrRmxzdHAucGhwIiwge3dpZDogd2ZJZH0sIGZ1bmN0aW9uIChyZXN1bHQsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09ICdzdWNjZXNzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI3N0cCIpLmh0bWwocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAkKCIjdWZ3LCN2ZXJpZnktY29tcCIpLmNsaWNrKGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgIGlmICgkKCJpbnB1dCNteUNoZWNrIikuaXMoIjpjaGVja2VkIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ29rJyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ludWZ3JykuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAgICAgIDwhLS0gZm9yIG1vdmUgbGV2ZWwtLT4KICAgICAgICAgICAgPGRpdiBpZD0iY29uLWNsb3NlLW1vZGFsNCIgY2xhc3M9Im1vZGFsIGZhZGUiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9Im15TW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciPiAKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1oaWRkZW49InRydWUiPsOXPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+TW92ZSBTdG9yYWdlIExldmVsPC9oND4gCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBjbGFzcz0iZm9ybS1pbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtb3ZlRm9sZGVyTmFtZSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0Ymxfc3RvcmFnZV9sZXZlbCB3aGVyZSBzbF9pZCA9ICRzbGlkIikgb3IgZGllKCdFcnJvciBpbiBtb3ZlIGZvbGRlciBuYW1lOiAnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJ3bW92ZUZvbGRlck5hbWUgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJG1vdmVGb2xkZXJOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+TW92ZSBGb2xkZXIvRmlsZTogPC9sYWJlbD4gIDxsYWJlbD4gPD9waHAgZWNobyAkcndtb3ZlRm9sZGVyTmFtZVsnc2xfbmFtZSddOyA/PjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj48YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+IE1vdmUgVG86ICZuYnNwOzwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9Im1vdmVUb1BhcmVudElkIiBpZD0icGFyZW50TW92ZUxldmVsIj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZCBkaXNhYmxlZCBzdHlsZT0iYmFja2dyb3VuZDogIzgwODA4MDsgY29sb3I6ICMxMjEyMTM7Ij5TZWxlY3QgU3RvcmFnZSBMZXZlbDwvb3B0aW9uPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdG9yZU5hbWUgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX3N0b3JhZ2VfbGV2ZWwgd2hlcmUgc2xfZGVwdGhfbGV2ZWw9ICcwJyBBTkQgc2xfaWQgIT0gJyRzbGlkJyBhbmQgaXNfcHJvdGVjdGVkPScwJyIpIG9yIGRpZSgnRXJyb3IgaW4gbW92ZSBzdG9yZTogJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcndzdG9yZU5hbWUgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHN0b3JlTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPD9waHAgZWNobyAkcndzdG9yZU5hbWVbJ3NsX2lkJ107ID8+Ij48P3BocCBlY2hvICRyd3N0b3JlTmFtZVsnc2xfbmFtZSddOyA/Pjwvb3B0aW9uPgo8P3BocCB9ID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj4gICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTMiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSIiIGlkPSJjaGlsZCI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHZhbHVlPSI8P3BocCBlY2hvICRyd0ZvbGRlclsnc2xfaWQnXTsgPz4iIG5hbWU9Im1vZGkiIHR5cGU9ImhpZGRlbiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IHdhdmVzLWVmZmVjdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ibW92ZSIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgdmFsdWU9Ik1vdmUgU3RvcmFnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPHNjcmlwdD4KCiAgICAgICAgICAgICAgICAkKCIjcGFyZW50TW92ZUxldmVsIikuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbGJsID0gJCh0aGlzKS52YWwoKTsKICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KGxibCk7CiAgICAgICAgICAgICAgICAgICAgJC5wb3N0KCJhcHBsaWNhdGlvbi9hamF4L3BhcmVudE1vdmVMaXN0LnBocCIsIHtwYXJlbnRJZDogbGJsLCBsZXZlbERlcHRoOiAwLCBzbF9pZDo8P3BocCBlY2hvICRzbGlkOyA/Pn0sIGZ1bmN0aW9uIChyZXN1bHQsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09ICdzdWNjZXNzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI2NoaWxkIikuaHRtbChyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydChyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vZmlsdGVyIGxpbWl0CgogICAgICAgICAgICAgICAgdmFyIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmICsgIj8iOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVtb3ZlUGFyYW0oa2V5LCBzb3VyY2VVUkwpIHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2VVUkwgPSBTdHJpbmcoc291cmNlVVJMKS5yZXBsYWNlKCIjLyIsICIiKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcnRuID0gc291cmNlVVJMLnNwbGl0KCI/IilbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc19hcnIgPSBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RyaW5nID0gKHNvdXJjZVVSTC5pbmRleE9mKCI/IikgIT09IC0xKSA/IHNvdXJjZVVSTC5zcGxpdCgiPyIpWzFdIDogIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9PSAiIikgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNfYXJyID0gcXVlcnlTdHJpbmcuc3BsaXQoIiYiKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHBhcmFtc19hcnIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtID0gcGFyYW1zX2FycltpXS5zcGxpdCgiPSIpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtID09PSBrZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNfYXJyLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBydG4gPSBydG4gKyAiPyIgKyBwYXJhbXNfYXJyLmpvaW4oIiYiKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBydG4gPSBydG4gKyAnPyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBydG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgkKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI2xpbWl0IikuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbHZhbCA9ICQodGhpcykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHJlbW92ZVBhcmFtKCJsaW1pdCIsIHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybCArICImbGltaXQ9IiArIGx2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCwgIl9wYXJlbnQiKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgPGRpdiBpZD0iY29uLWNsb3NlLW1vZGFsNyIgY2xhc3M9Im1vZGFsIGZhZGUiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9Im15TW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciPiAKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1oaWRkZW49InRydWUiPsOXPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+U2hhcmUgRm9sZGVyPC9oND4gCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+IEZvbGRlciBOYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9Im1vZGlmeV9zbG5hbWUiIGlkPSJtc3RvcmUxIiAgdmFsdWU9Ijw/cGhwIGVjaG8gJHJ3Rm9sZGVyWydzbF9uYW1lJ107ID8+IiByZWFkb25seT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TaGFyZSBXaXRoPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJzaGFyZXdpdGhbXSIgaWQ9InNoYXJld2l0aCIgY2xhc3M9ImZvcm0tY29udHJvbCBzZWxlY3QyIG11bHRpLXNlbGVjdCIgbXVsdGlwbGUgZGF0YS1wbGFjZWhvbGRlcj0iU2VsZWN0IFVzZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5TZWxlY3QgVXNlcjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzYW1lR3JvdXBJRHMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdyb3VwID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9icmlkZ2VfZ3JwX3RvX3VtIHdoZXJlIGZpbmRfaW5fc2V0KCckX1NFU1NJT05bY2Rlc191c2VyX2lkXScsdXNlcl9pZHMpIikgb3IgZGllKCdFcnJvcicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRyd0dyb3VwID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRncm91cCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2FtZUdyb3VwSURzW10gPSAkcndHcm91cFsndXNlcl9pZHMnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzYW1lR3JvdXBJRHMgPSBhcnJheV91bmlxdWUoJHNhbWVHcm91cElEcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0KCRzYW1lR3JvdXBJRHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNhbWVHcm91cElEcyA9IGltcGxvZGUoJywnLCAkc2FtZUdyb3VwSURzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1c2VyID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF91c2VyX21hc3RlciB3aGVyZSB1c2VyX2lkIGluKCRzYW1lR3JvdXBJRHMpIG9yZGVyIGJ5IGZpcnN0X25hbWUgYXNjIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJHJ3VXNlciA9IG15c3FsaV9mZXRjaF9hc3NvYygkdXNlcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJ3VXNlclsndXNlcl9pZCddICE9IDEgJiYgJHJ3VXNlclsndXNlcl9pZCddICE9ICRfU0VTU0lPTlsnY2Rlc191c2VyX2lkJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPG9wdGlvbiB2YWx1ZT0iJyAuICRyd1VzZXJbJ3VzZXJfaWQnXSAuICciPicgLiAkcndVc2VyWydmaXJzdF9uYW1lJ10gLiAnICcgLiAkcndVc2VyWydsYXN0X25hbWUnXSAuICc8L29wdGlvbj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVjaG8gJzxvcHRpb24gdmFsdWU9IicgLiAkcndVc2VyWyd1c2VyX2lkJ10gLiAnIj4nIC4gJHJ3VXNlclsnZmlyc3RfbmFtZSddIC4gJyAnIC4gJHJ3VXNlclsnbGFzdF9uYW1lJ10gLiAnPC9vcHRpb24+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT0iPD9waHAgZWNobyAkc2xpZDsgPz4iIG5hbWU9InNsSWQiIHR5cGU9ImhpZGRlbiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IHdhdmVzLWVmZmVjdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic2hhcmVGb2xkZXIiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIHZhbHVlPSJTdWJtaXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CgogICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj48IS0tIC8ubW9kYWwgLS0+IAoKICAgICAgICAgICAgPCEtLSBmb3IgY29weSBsZXZlbC0tPgogICAgICAgICAgICA8ZGl2IGlkPSJjb24tY2xvc2UtbW9kYWw2IiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1sZyI+IAoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4gCgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj7DlzwvYnV0dG9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiPkNvcHkgU3RvcmFnZTwvaDQ+IAogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4vYXNzZXRzL2pzQ3VzdG9tL3NlbGVjdGNoZWNrYm94LmpzIj48L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBjbGFzcz0iZm9ybS1pbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0xMiI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTYgZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkNvcHkgRm9sZGVyczo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC88aW5wdXQgdHlwZT0idGV4dCIgcmVhZG9ubHkgaWQ9InRvY29weWZvbGRlciIgbmFtZT0idG9Db3B5Rm9sZGVyIiBjbGFzcz0iZm9ybS1jb250cm9sIiB2YWx1ZT0iPD9waHAgZWNobyAkdG9jcHlGb2xkZXIgPSAkcndGb2xkZXJbJ3NsX25hbWUnXTsgPz4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtNiBmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0idGV4dC1kYW5nZXIiIGlkPSJlcnJvciI+PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTYgZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiBDb3B5IFRvOiAmbmJzcDs8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCIgbmFtZT0ibW92ZVRvUGFyZW50SWQiIGlkPSJwYXJlbnRDb3B5TGV2ZWwiIHN0eWxlPSJ3aWR0aDogMTAwJSI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHNlbGVjdGVkIHN0eWxlPSJiYWNrZ3JvdW5kOiAjODA4MDgwOyBjb2xvcjogIzEyMTIxMzsiPlNlbGVjdCBTdG9yYWdlIExldmVsPC9vcHRpb24+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RvcmVOYW1lID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2RlcHRoX2xldmVsPSAnMCcgQU5EIHNsX2lkICE9ICckc2xpZCcgYW5kIGlzX3Byb3RlY3RlZD0nMCciKSBvciBkaWUoJ0Vycm9yIGluIG1vdmUgc3RvcmU6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJ3c3RvcmVOYW1lID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRzdG9yZU5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijw/cGhwIGVjaG8gJHJ3c3RvcmVOYW1lWydzbF9pZCddOyA/PiI+PD9waHAgZWNobyAkcndzdG9yZU5hbWVbJ3NsX25hbWUnXTsgPz48L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2xlYXJmaXgiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC02IGZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSIiIGlkPSJGaWxlc0NvcHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2xlYXJmaXgiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gJHJ3Rm9sZGVyWydzbF9pZCddOyA/PiIgbmFtZT0ibW9kaSIgdHlwZT0iaGlkZGVuIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgd2F2ZXMtZWZmZWN0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJjb3B5TGV2ZWwiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIHZhbHVlPSJDb3B5IFN0b3JhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBpZD0iZXhwb3J0IiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1sZyI+IAo8IS0tICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZXJybWVzc2FnZSIgc3R5bGU9ImNvbG9yOnJlZDtkaXNwbGF5Om5vbmU7Ij5QbGVhc2Ugc2VsZWN0IEZpbGVzIGZvciBEZWxldGUuPC9zcGFuPi0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPiAKCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1oaWRkZW49InRydWUiPsOXPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+RXhwb3J0IENTVjwvaDQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi9hc3NldHMvanNDdXN0b20vc2VsZWN0Y2hlY2tib3guanMiPjwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGNsYXNzPSJmb3JtLWlubGluZSIgYWN0aW9uPSJleHBvcnQucGhwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC02IGZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5BbGwgRmlsZXMgaW4gc2VsZWN0ZWQgZm9sZGVyPC9sYWJlbD4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC02IGZvcm0tZ3JvdXAiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InJhZEV4cCIgY2xhc3M9ImZvcm0tY29udHJvbCByYWRpbyIgdmFsdWU9ImFsbCIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTYgZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjwvbGFiZWw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2xlYXJmaXgiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gJHNsaWQ7ID8+IiBuYW1lPSJzbGlkIiB0eXBlPSJoaWRkZW4iID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCB3YXZlcy1lZmZlY3QiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN0YXJ0RXhwb3J0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiB2YWx1ZT0iU3RhcnQgRXhwb3J0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPCEtLSBmb3IgYnVsayBkb3dubG9hZHMgZmlsZXMtLT4KICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgJHZhbGlkYXRlID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgZG9jX3BhdGgsb2xkX2RvY19uYW1lLGRvY19leHRuLGRvY19pZCBmcm9tIHRibF9kb2N1bWVudF9tYXN0ZXIgd2hlcmUgZG9jX25hbWU9JyRzbGlkJyBhbmQgZmxhZ19tdWx0aWRlbGV0ZT0xIik7CiAgICAgICAgICAgIGlmIChteXNxbGlfbnVtX3Jvd3MoJHZhbGlkYXRlKSA+IDApIHsKICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJidWxrZG93bmxvYWQiIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJteU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+IAogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+RG93bmxvYWRzIEFsbCBGaWxlcyBvZiBzZWxlY3RlZCBmb2xkZXIgb25seTwvaDQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuL2Fzc2V0cy9qc0N1c3RvbS9zZWxlY3RjaGVja2JveC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGNsYXNzPSJmb3JtLWlubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCIgbmFtZT0icmVhc29uIiBjb2xzPSI2NSIgcm93cz0iNSIgcGxhY2Vob2xkZXI9IldyaXRlIFJlYXNvbiBmb3IgRG93bmxvZGluZyBmaWxlcy4uLiIgcmVxdWlyZWQ+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT0iPD9waHAgZWNobyAkc2xpZDsgPz4iIG5hbWU9InNsaWQiIHR5cGU9ImhpZGRlbiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCB3YXZlcy1lZmZlY3QiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidWxrRG93bmxvYWQiIGlkPSJidG5TYXZlIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiB2YWx1ZT0iRG93bmxvYWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+Cjw/cGhwIH0gZWxzZSB7ID8+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJidWxrZG93bmxvYWQiIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJteU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+IAogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+PGkgY2xhc3M9ImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPiBIZXJlJ3MgYSBtZXNzYWdlITwvaDQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJjb2xvcjpyZWQ7Ij5ObyBGaWxlcyBFeGlzdCBpbiBTZWxlY3RlZCBTdG9yYWdlPC9sYWJlbD4gICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT0iPD9waHAgZWNobyAkc2xpZDsgPz4iIG5hbWU9InNsaWQiIHR5cGU9ImhpZGRlbiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IHdhdmVzLWVmZmVjdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KPD9waHAgfSA/PiAgCiAgICAgICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICAgICAgICAkKCcjYnRuU2F2ZScpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjYnVsa2Rvd25sb2FkJykubW9kYWwoJ2hpZGUnKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoIiNwYXJlbnRDb3B5TGV2ZWwiKS5jaGFuZ2UoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBsYmwgPSAkKHRoaXMpLnZhbCgpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgY29weWYgPSAkKCIjdG9jb3B5Zm9sZGVyIikudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNmb2xkZXIgPSAkKHRoaXMpLmZpbmQoIjpzZWxlY3RlZCIpLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KGxibCk7CiAgICAgICAgICAgICAgICAgICAgJC5wb3N0KCJhcHBsaWNhdGlvbi9hamF4L3BhcmVudENvcHlMaXN0LnBocCIsIHtwYXJlbnRJZDogbGJsLCBsZXZlbERlcHRoOiAwLCBzbF9pZDo8P3BocCBlY2hvICRzbGlkOyA/PiwgZm9sZGVyOiBjb3B5Ziwgc2ZvbGRlcjogc2ZvbGRlcn0sIGZ1bmN0aW9uIChyZXN1bHQsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09ICdzdWNjZXNzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI0ZpbGVzQ29weSIpLmh0bWwocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQucG9zdCgiYXBwbGljYXRpb24vYWpheC9jaGVja0R1cGxpY2F0ZS5waHAiLCB7cGFyZW50SWQ6IGxibCwgbGV2ZWxEZXB0aDogMCwgZm9sZGVyOiBjb3B5Zn0sIGZ1bmN0aW9uIChyZXN1bHQsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI3RvY29weWZvbGRlciIpLmF0dHIoInJlYWRvbmx5IiwgInJlYWRvbmx5Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjdG9jb3B5Zm9sZGVyIikuYXR0cigicmVhZG9ubHkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNlcnJvciIpLmh0bWwoY29weWYgKyAiIGlzIGFscmVhZHkgZXhpc3QgaW4gIiArIHNmb2xkZXIgKyAiLiBQbGVhc2UgcmVuYW1lIHN0b3JhZ2UgbmFtZS4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiN0b2NvcHlmb2xkZXIiKS5yZW1vdmVBdHRyKCJyZWFkb25seSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgPCEtLSBtb3ZlIHNlbGVjdGVkIGZpbGVzLS0tLT4KICAgICAgICAgICAgPGRpdiBpZD0ibW92ZS1zZWxlY3RlZC1maWxlcyIgY2xhc3M9Im1vZGFsIGZhZGUiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9Im15TW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiID4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1oaWRkZW49InRydWUiPsOXPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0idW5zZU1vdmUiPjxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi10cmlhbmdsZSIgYXJpYS1oaWRkZW49InRydWUiPjwvaT4gSGVyZSdzIGEgbWVzc2FnZSE8L2g0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIGlkPSJtb3YiPiBNb3ZlIFNlbGVjdGVkIEZpbGVzIDwvaDQ+IAogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0idW5zZWxlY3RlZCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJ0ZXh0LWFsZXJ0Ij4gUGxlYXNlIHNlbGVjdCBGaWxlcyBmb3IgbW92ZS48L2g1PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgd2F2ZXMtZWZmZWN0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ic2VsZWN0ZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBjbGFzcz0iZm9ybS1pbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1vdmVGb2xkZXJOYW1lID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkID0gJHNsaWQiKSBvciBkaWUoJ0Vycm9yIGluIG1vdmUgZm9sZGVyIG5hbWU6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyd21vdmVGb2xkZXJOYW1lID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRtb3ZlRm9sZGVyTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4gICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZG9jX2lkX3Ntb3ZlX211bHRpIiBpZD0iZG9jX2lkX3Ntb3ZlX211bHRpIiB2YWx1ZT0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic2xfaWRfbW92ZV9tdWx0aSIgaWQ9InNsX2lkX21vdmVfbXVsdGkiIHZhbHVlPSI8P3BocCBlY2hvICRzbGlkOyA/PiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Nb3ZlIEZvbGRlci9GaWxlOiA8L2xhYmVsPiAgPGxhYmVsPiA8P3BocCBlY2hvICRyd21vdmVGb2xkZXJOYW1lWydzbF9uYW1lJ107ID8+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj48YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4gTW92ZSBUbzogJm5ic3A7PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9Im1vdmVUb1BhcmVudElkIiBpZD0ibW92ZVRvUGFyZW50SWQiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZCBkaXNhYmxlZCBzdHlsZT0iYmFja2dyb3VuZDogIzgwODA4MDsgY29sb3I6ICMxMjEyMTM7Ij5TZWxlY3QgU3RvcmFnZSBMZXZlbDwvb3B0aW9uPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzbGlkID09IDExMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0b3JlTmFtZSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0Ymxfc3RvcmFnZV9sZXZlbCB3aGVyZSBzbF9wYXJlbnRfaWQ9JyRzbHBlcm0nIikgb3IgZGllKCdFcnJvciBpbiBtb3ZlIHN0b3JlOiAnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdG9yZU5hbWUgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX3N0b3JhZ2VfbGV2ZWwgd2hlcmUgc2xfaWQ9JyRzbHBlcm0nIikgb3IgZGllKCdFcnJvciBpbiBtb3ZlIHN0b3JlOiAnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJHJ3c3RvcmVOYW1lID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRzdG9yZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPD9waHAgZWNobyAkcndzdG9yZU5hbWVbJ3NsX2lkJ107ID8+Ij48P3BocCBlY2hvICRyd3N0b3JlTmFtZVsnc2xfbmFtZSddOyA/Pjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0zIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC05Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSIiIGlkPSJjaGlsZDEiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgd2F2ZXMtZWZmZWN0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ibW92ZW11bHRpIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiB2YWx1ZT0iTW92ZSBmaWxlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxzY3JpcHQ+CgogICAgICAgICAgICAgICAgJCgiI21vdmVUb1BhcmVudElkIikuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbGJsID0gJCh0aGlzKS52YWwoKTsKICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KGxibCk7CiAgICAgICAgICAgICAgICAgICAgJC5wb3N0KCJhcHBsaWNhdGlvbi9hamF4L3BhcmVudE1vdmVMaXN0XzEucGhwIiwge3BhcmVudElkOiBsYmwsIGxldmVsRGVwdGg6IDAsIHNsX2lkOjw/cGhwIGVjaG8gJHNsaWQ7ID8+fSwgZnVuY3Rpb24gKHJlc3VsdCwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjY2hpbGQxIikuaHRtbChyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydChyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vZmlsdGVyIGxpbWl0CgogICAgICAgICAgICAgICAgdmFyIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmICsgIj8iOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVtb3ZlUGFyYW0oa2V5LCBzb3VyY2VVUkwpIHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2VVUkwgPSBTdHJpbmcoc291cmNlVVJMKS5yZXBsYWNlKCIjLyIsICIiKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcnRuID0gc291cmNlVVJMLnNwbGl0KCI/IilbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc19hcnIgPSBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RyaW5nID0gKHNvdXJjZVVSTC5pbmRleE9mKCI/IikgIT09IC0xKSA/IHNvdXJjZVVSTC5zcGxpdCgiPyIpWzFdIDogIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9PSAiIikgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNfYXJyID0gcXVlcnlTdHJpbmcuc3BsaXQoIiYiKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHBhcmFtc19hcnIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtID0gcGFyYW1zX2FycltpXS5zcGxpdCgiPSIpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtID09PSBrZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNfYXJyLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBydG4gPSBydG4gKyAiPyIgKyBwYXJhbXNfYXJyLmpvaW4oIiYiKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBydG4gPSBydG4gKyAnPyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBydG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgkKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI2xpbWl0IikuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbHZhbCA9ICQodGhpcykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHJlbW92ZVBhcmFtKCJsaW1pdCIsIHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybCArICImbGltaXQ9IiArIGx2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCwgIl9wYXJlbnQiKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgPCEtLWNvcHkgc2VsZWN0ZWQgZmlsZXMtLS0+CiAgICAgICAgICAgIDxkaXYgaWQ9ImNvcHktc2VsZWN0ZWQtZmlsZXMiIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJteU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIj4gCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+IAogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj7DlzwvYnV0dG9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJjb3AiPiA8aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2k+IEhlcmUncyBhIG1lc3NhZ2UhPC9oND4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIiBzdHlsZT0iZGlzcGxheTpub25lOyIgaWQ9ImN0aXRsZSI+Q29weSBTZWxlY3RlZCBGaWxlcyBpbiBTdG9yYWdlPC9oND4gCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InVuc2VsZWN0ZWQxIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9InRleHQtYWxlcnQiPlBsZWFzZSBzZWxlY3QgRmlsZXMgZm9yIENvcHkuPC9oNT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgd2F2ZXMtZWZmZWN0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ic2VsZWN0ZWQxIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgY2xhc3M9ImZvcm0taW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5IiBpZD0iY3NmIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTYgZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Db3B5IEZpbGVzOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiByZWFkb25seSBpZD0idG9jb3B5Zm9sZGVyIiBuYW1lPSJ0b0NvcHlGb2xkZXIiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHZhbHVlPSI8P3BocCBlY2hvICR0b2NweUZvbGRlciA9ICRyd0ZvbGRlclsnc2xfbmFtZSddOyA/PiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTYgZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJ0ZXh0LWRhbmdlciIgaWQ9ImVycm9yIj48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2xlYXJmaXgiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtNiBmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZG9jX2lkcyIgaWQ9ImRvY19pZHMiIHZhbHVlcz0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic2xfaWQ0IiBpZD0ic2xfaWQ0IiB2YWx1ZXM9IiI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+IENvcHkgVG86ICZuYnNwOzwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCIgbmFtZT0iY29weVRvUGFyZW50SWQiIGlkPSJjb3B5VG9QYXJlbnRJZCIgc3R5bGU9IndpZHRoOiAxMDAlIj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHNlbGVjdGVkIHN0eWxlPSJiYWNrZ3JvdW5kOiAjODA4MDgwOyBjb2xvcjogIzEyMTIxMzsiPlNlbGVjdCBTdG9yYWdlIExldmVsPC9vcHRpb24+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJHN0b3JlTGV2ZWwgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX3N0b3JhZ2VfbGV2ZWwgd2hlcmUgc2xfaWQ9JyRzbHBlcm0nIikgb3IgZGllKCdFcnJvciBpbiBtb3ZlIHN0b3JlOiAnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJHJ3c3RvcmVMZXZlbCA9IG15c3FsaV9mZXRjaF9hc3NvYygkc3RvcmVMZXZlbCk7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkc2xpZCA9PSAxMTMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RvcmVOYW1lID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX3BhcmVudF9pZD0nJHNscGVybSciKSBvciBkaWUoJ0Vycm9yIGluIG1vdmUgc3RvcmU6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RvcmVOYW1lID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkPSckc2xwZXJtJyIpIG9yIGRpZSgnRXJyb3IgaW4gbW92ZSBzdG9yZTogJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJHJ3c3RvcmVOYW1lID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRzdG9yZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8P3BocCBlY2hvICRyd3N0b3JlTmFtZVsnc2xfaWQnXTsgPz4iPjw/cGhwIGVjaG8gJHJ3c3RvcmVOYW1lWydzbF9uYW1lJ107ID8+PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTYgZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSIiIGlkPSJjaGlsZDIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgIAoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHZhbHVlPSI8P3BocCBlY2hvICRyd0ZvbGRlclsnc2xfaWQnXTsgPz4iIG5hbWU9Im1vZGkiIHR5cGU9ImhpZGRlbiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCB3YXZlcy1lZmZlY3QiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJjb3B5RmlsZXMiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIHZhbHVlPSJDb3B5IEZpbGVzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHNjcmlwdD4KCiAgICAgICAgICAgICAgICAkKCIjY29weVRvUGFyZW50SWQiKS5jaGFuZ2UoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBsYmwgPSAkKHRoaXMpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgIC8vYWxlcnQobGJsKTsKICAgICAgICAgICAgICAgICAgICAkLnBvc3QoImFwcGxpY2F0aW9uL2FqYXgvcGFyZW50TW92ZUxpc3RfMi5waHAiLCB7cGFyZW50SWQ6IGxibCwgbGV2ZWxEZXB0aDogMCwgc2xfaWQ6PD9waHAgZWNobyAkc2xpZDsgPz59LCBmdW5jdGlvbiAocmVzdWx0LCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAnc3VjY2VzcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNjaGlsZDIiKS5odG1sKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy9maWx0ZXIgbGltaXQKCiAgICAgICAgICAgICAgICB2YXIgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWYgKyAiPyI7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVQYXJhbShrZXksIHNvdXJjZVVSTCkgewogICAgICAgICAgICAgICAgICAgIHNvdXJjZVVSTCA9IFN0cmluZyhzb3VyY2VVUkwpLnJlcGxhY2UoIiMvIiwgIiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBydG4gPSBzb3VyY2VVUkwuc3BsaXQoIj8iKVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zX2FyciA9IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlTdHJpbmcgPSAoc291cmNlVVJMLmluZGV4T2YoIj8iKSAhPT0gLTEpID8gc291cmNlVVJMLnNwbGl0KCI/IilbMV0gOiAiIjsKICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlTdHJpbmcgIT09ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc19hcnIgPSBxdWVyeVN0cmluZy5zcGxpdCgiJiIpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gcGFyYW1zX2Fyci5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBwYXJhbXNfYXJyW2ldLnNwbGl0KCI9IilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gPT09IGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc19hcnIuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJ0biA9IHJ0biArICI/IiArIHBhcmFtc19hcnIuam9pbigiJiIpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ0biA9IHJ0biArICc/JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ0bjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCQpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjbGltaXQiKS5jaGFuZ2UoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBsdmFsID0gJCh0aGlzKS52YWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gcmVtb3ZlUGFyYW0oImxpbWl0IiwgdXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgIiZsaW1pdD0iICsgbHZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4odXJsLCAiX3BhcmVudCIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIDwvc2NyaXB0PgoKICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsnYXNzaWduTWV0YSddKSkgewogICAgICAgICAgICAgICAgJGNoaWxkTmFtZSA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgIiIsICRfUE9TVFsnaWQnXSk7CiAgICAgICAgICAgICAgICAkY2hpbGROYW1lID0gbXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkZGJfY29uLCAkY2hpbGROYW1lKTsKICAgICAgICAgICAgICAgICRmaWVsZHMgPSAkX1BPU1RbJ215X211bHRpX3NlbGVjdDEnXTsKICAgICAgICAgICAgICAgICRmbGFnID0gMDsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGNoaWxkTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzZXQgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImRlbGV0ZSBmcm9tIHRibF9tZXRhZGF0YV90b19zdG9yYWdlbGV2ZWwgd2hlcmUgc2xfaWQ9JyRjaGlsZE5hbWUnIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbWV0YU5hbWVzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRmaWVsZHMgYXMgJGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkY2hpbGROYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZmllbGQgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSBdLyIsICIiLCAkZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIG1ldGEgZGF0YSBhc3NpZ25lZCBvciBub3QKICAgICAgICAgICAgICAgICAgICAgICAgJG1hdGNoID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9tZXRhZGF0YV90b19zdG9yYWdlbGV2ZWwgd2hlcmUgc2xfaWQ9JyRjaGlsZE5hbWUnIGFuZCBtZXRhZGF0YV9pZD0nJGZpZWxkJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteXNxbGlfbnVtX3Jvd3MoJG1hdGNoKSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Fzc2lnbiBtZXRhIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjcmVhdGUgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImluc2VydCBpbnRvIHRibF9tZXRhZGF0YV90b19zdG9yYWdlbGV2ZWwgKGBtZXRhZGF0YV9pZGAsIGBzbF9pZGApIHZhbHVlcygnJGZpZWxkJywnJGNoaWxkTmFtZScpIikgb3IgZGllKCdFcnJvcicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBtZXRhIGRhdGEgZGV0YWlscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1ldGFuID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9tZXRhZGF0YV9tYXN0ZXIgd2hlcmUgaWQ9JyRmaWVsZCciKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyd01ldGFuID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRtZXRhbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWV0YU5hbWVzW10gPSAkcndNZXRhblsnZmllbGRfbmFtZSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBtZXRhIGRhdGEgaW4gdGFibGUgdGJsX2RvY3VtZW50X21hc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoZWNrRG9jID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJTSE9XIENPTFVNTlMgRlJPTSB0YmxfZG9jdW1lbnRfbWFzdGVyIExJS0UgJyRyd01ldGFuW2ZpZWxkX25hbWVdJyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG15c3FsaV9udW1fcm93cygkY2hlY2tEb2MpIDw9IDApIHsgLy9pZiBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWV0YUNyZWF0ZURvYyA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiQUxURVIgVEFCTEUgdGJsX2RvY3VtZW50X21hc3RlciBBREQgYCRyd01ldGFuW2ZpZWxkX25hbWVdYCAkcndNZXRhbltkYXRhX3R5cGVdKCRyd01ldGFuW2xlbmd0aF9kYXRhXSkgIG51bGwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmbGFnID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzbF9pZCA9ICRjaGlsZE5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2xfaWQgPSAkY2hpbGROYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRmbGFnID09IDEpIHsKCiAgICAgICAgICAgICAgICAgICAgJG1ldGFOYW1lcyA9IGltcGxvZGUoIiwiLCAkbWV0YU5hbWVzKTsKICAgICAgICAgICAgICAgICAgICAkc3RyZ2VOYW1lID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3Qgc2xfbmFtZSBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkID0gJyRzbF9pZCciKTsKICAgICAgICAgICAgICAgICAgICAkcndzdHJnZU5hbWUgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHN0cmdlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgJHN0b3JhZ2VOYW1lID0gJHJ3c3RyZ2VOYW1lWydzbF9uYW1lJ107CiAgICAgICAgICAgICAgICAgICAgJGxvZyA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiaW5zZXJ0IGludG8gdGJsX2V6ZWVmaWxlX2xvZ3MoYGlkYCwgYHVzZXJfaWRgLCBgdXNlcl9uYW1lYCwgYGdyb3VwX2lkYCwgYHNsX2lkYCwgYGFjdGlvbl9uYW1lYCwgYHN0YXJ0X2RhdGVgLCBgZW5kX2RhdGVgLCBgc3lzdGVtX2lwYCwgYHJlbWFya3NgKSB2YWx1ZXMgKG51bGwsICckX1NFU1NJT05bY2Rlc191c2VyX2lkXScsICckX1NFU1NJT05bYWRtaW5fdXNlcl9uYW1lXSAkX1NFU1NJT05bYWRtaW5fdXNlcl9sYXN0XScsbnVsbCwgJyRzbF9pZCcsJ01ldGFEYXRhKCRtZXRhTmFtZXMpICBBc3NpZ25lZCBvbiBzdG9yYWdlICRzdG9yYWdlTmFtZScsJyRkYXRlJyxudWxsLCckaG9zdCcsbnVsbCkiKSBvciBkaWUoJ2Vycm9yIGxvZzogJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgZWNobyAnPHNjcmlwdD5tZXRhc3VjY2Vzcygic3RvcmFnZUZpbGVzP2lkPScgLiAkX0dFVFsnaWQnXSAuICciKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICc8c2NyaXB0Pm1ldGFmYWlsZWQoInN0b3JhZ2VGaWxlcz9pZD0nIC4gJF9HRVRbJ2lkJ10gLiAnIik7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15c3FsaV9jbG9zZSgkZGJfY29uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICA/PgogICAgICAgICAgICA8IS0tbW92ZSBTdG9yYWdlLS0+CiAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ21vdmUnXSkpIHsKCiAgICAgICAgICAgICAgICAvL2VjaG8gJF9QT1NUWydtb3ZlVG9JZCddOyBkaWU7CgogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkX1BPU1RbJ2xhc3RNb3ZlSWQnXSkpIHsKCiAgICAgICAgICAgICAgICAgICAgJGNoZWNrRHVibHRlU3RvcmFnZSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiU2VsZWN0ICogZnJvbSB0Ymxfc3RvcmFnZV9sZXZlbCB3aGVyZSBzbF9pZCA9ICckc2xpZCciKSBvciBkaWUoJ0Vycm9yIGluIGNoZWNrRHVibHRlU3RvcmFnZTonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKCiAgICAgICAgICAgICAgICAgICAgJHJ3Y2hlY2tEdWJsdGVTdG9yYWdlID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVja0R1Ymx0ZVN0b3JhZ2UpOwogICAgICAgICAgICAgICAgICAgICRsbW92ZWlkID0gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTkgXS8iLCAiIiwgJF9QT1NUW2xhc3RNb3ZlSWRdKTsKICAgICAgICAgICAgICAgICAgICAkc3FsX2NoaWxkID0gInNlbGVjdCAqIEZST00gdGJsX3N0b3JhZ2VfbGV2ZWwgV0hFUkUgc2xfcGFyZW50X2lkID0gJyRsbW92ZWlkJyBBTkQgc2xfbmFtZSA9ICckcndjaGVja0R1Ymx0ZVN0b3JhZ2Vbc2xfbmFtZV0nIjsKCiAgICAgICAgICAgICAgICAgICAgJHNxbF9jaGlsZF9ydW4gPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgJHNxbF9jaGlsZCkgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKG15c3FsaV9udW1fcm93cygkc3FsX2NoaWxkX3J1bikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1vdmVUb0lkID0gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTkgXS8iLCAiIiwgJF9QT1NUWydsYXN0TW92ZUlkJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAkbW92ZVRvTmFtZSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiU2VsZWN0ICogZnJvbSB0Ymxfc3RvcmFnZV9sZXZlbCB3aGVyZSBzbF9pZCA9ICckbW92ZVRvSWQnIikgb3IgZGllKCdFcnJvciBpbiBjaGVja0R1Ymx0ZVN0b3JhZ2U6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRyd21vdmVUb05hbWUgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJG1vdmVUb05hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAkbG9nID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJpbnNlcnQgaW50byB0YmxfZXplZWZpbGVfbG9ncyhgaWRgLCBgdXNlcl9pZGAsIGB1c2VyX25hbWVgLCBgZ3JvdXBfaWRgLCBgc2xfaWRgLCBgYWN0aW9uX25hbWVgLCBgc3RhcnRfZGF0ZWAsIGBlbmRfZGF0ZWAsIGBzeXN0ZW1faXBgLCBgcmVtYXJrc2ApIHZhbHVlcyAobnVsbCwgJyRfU0VTU0lPTltjZGVzX3VzZXJfaWRdJywgJyRfU0VTU0lPTlthZG1pbl91c2VyX25hbWVdICRfU0VTU0lPTlthZG1pbl91c2VyX2xhc3RdJyxudWxsLCckbW92ZVRvSWQnLCdTdG9yYWdlICRyd0ZvbGRlcltzbF9uYW1lXSBhbHJlYWR5IGV4aXN0IGluICRyd21vdmVUb05hbWVbc2xfbmFtZV0uJywnJGRhdGUnLCBudWxsLCckaG9zdCcsJycpIikgb3IgZGllKCdlcnJvciBsb2cxOiAnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tGYWlsZWQoInN0b3JhZ2UiLCJTdG9yYWdlIE5hbWUgSGF2aW5nIFNhbWUgTmFtZSBBbHJlYWR5IEV4aXN0ICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtb3ZlVG9JZCA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgIiIsICRfUE9TVFsnbGFzdE1vdmVJZCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGxhc3RNb3ZlSWRMZXZlbCA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgIiIsICRfUE9TVFsnbGFzdE1vdmVJZExldmVsJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAkbGFzdE1vdmVJZExldmVsID0gJGxhc3RNb3ZlSWRMZXZlbCArIDE7CgogICAgICAgICAgICAgICAgICAgICAgICAkbW92ZVN0b3JhZ2UgPSAidXBkYXRlIHRibF9zdG9yYWdlX2xldmVsIHNldCBzbF9wYXJlbnRfaWQgPSAnJG1vdmVUb0lkJywgc2xfZGVwdGhfbGV2ZWwgPSAnJGxhc3RNb3ZlSWRMZXZlbCcgd2hlcmUgc2xfaWQgPSAnJHNsaWQnIjsKICAgICAgICAgICAgICAgICAgICAgICAgJG1vdmVTdG9yYWdlX3J1biA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAkbW92ZVN0b3JhZ2UpIG9yIGRpZSgnRXJyb3IgaW4gbW92ZSBTdHJvZ2UgOiAnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRtb3ZlVG9OYW1lID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJTZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkID0gJyRtb3ZlVG9JZCciKSBvciBkaWUoJ0Vycm9yIGluIGNoZWNrRHVibHRlU3RvcmFnZTonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHJ3bW92ZVRvTmFtZSA9IG15c3FsaV9mZXRjaF9hc3NvYygkbW92ZVRvTmFtZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkbG9nID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJpbnNlcnQgaW50byB0YmxfZXplZWZpbGVfbG9ncyhgaWRgLCBgdXNlcl9pZGAsIGB1c2VyX25hbWVgLCBgZ3JvdXBfaWRgLCBgc2xfaWRgLCBgYWN0aW9uX25hbWVgLCBgc3RhcnRfZGF0ZWAsIGBlbmRfZGF0ZWAsIGBzeXN0ZW1faXBgLCBgcmVtYXJrc2ApIHZhbHVlcyAobnVsbCwgJyRfU0VTU0lPTltjZGVzX3VzZXJfaWRdJywgJyRfU0VTU0lPTlthZG1pbl91c2VyX25hbWVdICRfU0VTU0lPTlthZG1pbl91c2VyX2xhc3RdJyxudWxsLCckbW92ZVRvSWQnLCdTdG9yYWdlICRyd0ZvbGRlcltzbF9uYW1lXSBtb3ZlZCB0byAkcndtb3ZlVG9OYW1lW3NsX25hbWVdJywnJGRhdGUnLG51bGwsJyRob3N0JywnJykiKSBvciBkaWUoJ2Vycm9yIDogJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrU3VjY2Vzcygic3RvcmFnZSIsIlN0b3JhZ2UgTW92ZWQgU3VjY2Vzc2Z1bGx5ICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15c3FsaV9jbG9zZSgkZGJfY29uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICA/PgogICAgICAgICAgICA8IS0tY29weSBzdG9yYWdlLS0+CiAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ2NvcHlMZXZlbCddKSkgewogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsndG9Db3B5Rm9sZGVyJ10pICYmICFlbXB0eSgkX1BPU1RbJ3RvQ29weUZvbGRlciddKSkgewogICAgICAgICAgICAgICAgICAgICR0b0NvcHlGb2xkZXIgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSBdLyIsICIiLCAkX1BPU1RbJ3RvQ29weUZvbGRlciddKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJF9QT1NUWydsYXN0Q29weVRvSWQnXSkgJiYgIWVtcHR5KCRfUE9TVFsnbGFzdENvcHlUb0lkJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRsYXN0Q29weVRvSWQgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSBdLyIsICIiLCAkX1BPU1RbJ2xhc3RDb3B5VG9JZCddKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgY29weVN0b3JhZ2UoJHNsaWQsICRsYXN0Q29weVRvSWQsICR0b0NvcHlGb2xkZXIsICRkYXRlLCAkaG9zdCwgJGZpbGVzZXJ2ZXIsICRwb3J0LCAkZnRwVXNlciwgJGZ0cFB3ZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXlzcWxpX2Nsb3NlKCRkYl9jb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgID8+CiAgICAgICAgICAgIDwhLS1tb2RpZnkgc3RvcmFnZSBsZXZlbCBzdGFydHMtLT4KICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsndXBkYXRlJ10pICYmICRfU0VSVkVSWydQSFBfU0VMRiddKSB7CiAgICAgICAgICAgICAgICAkc2xfaWQgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSBdLyIsICIiLCAkX1BPU1RbJ21vZGknXSk7CiAgICAgICAgICAgICAgICAkbW9kaWZ5ID0gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTkgXS8iLCAiIiwgJF9QT1NUWydtb2RpZnlfc2xuYW1lJ10pOwogICAgICAgICAgICAgICAgJGRlcHRoID0gJF9QT1NUWydkcHRoJ107CiAgICAgICAgICAgICAgICAkbW9kaVN0b3JhZ2UgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgIlNlbGVjdCAqIGZyb20gdGJsX3N0b3JhZ2VfbGV2ZWwgd2hlcmUgc2xfbmFtZSA9ICckbW9kaWZ5JyBhbmQgc2xfZGVwdGhfbGV2ZWw9JyRkZXB0aCciKSBvciBkaWUoJ0Vycm9yIGluIGNoZWNrRHVibHRlU3RvcmFnZTonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgIGlmIChteXNxbGlfbnVtX3Jvd3MoJG1vZGlTdG9yYWdlKSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJG1vZGlTdG9yYWdlID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJTZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkID0gJyRzbF9pZCciKSBvciBkaWUoJ0Vycm9yIGluIGNoZWNrRHVibHRlU3RvcmFnZTonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAkcndtb2RpU3RvcmFnZSA9IG15c3FsaV9mZXRjaF9hc3NvYygkbW9kaVN0b3JhZ2UpOwogICAgICAgICAgICAgICAgICAgICR1cGRhdGVUb05hbWUgPSAkcndtb2RpU3RvcmFnZVsnc2xfbmFtZSddOwoKICAgICAgICAgICAgICAgICAgICAkc3FsID0gInVwZGF0ZSB0Ymxfc3RvcmFnZV9sZXZlbCBzZXQgc2xfbmFtZSA9ICckbW9kaWZ5JyBXSEVSRSBzbF9pZCA9ICckc2xfaWQnICI7CiAgICAgICAgICAgICAgICAgICAgJHNxbF9ydW4gPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgJHNxbCkgb3IgZGllKCJlcnJvcjoiIC4gbXlzcWxpX2Vycm5vKCRkYl9jb24pKTsKCiAgICAgICAgICAgICAgICAgICAgJGxvZyA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiaW5zZXJ0IGludG8gdGJsX2V6ZWVmaWxlX2xvZ3MoYGlkYCwgYHVzZXJfaWRgLCBgdXNlcl9uYW1lYCwgYGdyb3VwX2lkYCwgYHNsX2lkYCwgYGFjdGlvbl9uYW1lYCwgYHN0YXJ0X2RhdGVgLCBgZW5kX2RhdGVgLCBgc3lzdGVtX2lwYCwgYHJlbWFya3NgKSB2YWx1ZXMgKG51bGwsICckX1NFU1NJT05bY2Rlc191c2VyX2lkXScsICckX1NFU1NJT05bYWRtaW5fdXNlcl9uYW1lXSAkX1NFU1NJT05bYWRtaW5fdXNlcl9sYXN0XScsbnVsbCwnJHNsX2lkJywnU3RvcmFnZSBsZXZlbCAkdXBkYXRlVG9OYW1lIHJlbmFtZSB0byAkbW9kaWZ5LicsJyRkYXRlJywgbnVsbCwnJGhvc3QnLCcnKSIpIG9yIGRpZSgnZXJyb3IgOiAnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICBlY2hvJzxzY3JpcHQ+dGFza1N1Y2Nlc3MoInN0b3JhZ2VGaWxlcz9pZD0nIC4gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJHNsX2lkKSkgLiAnIiwiU3RvcmFnZSBVcGRhZXRkIFN1Y2Nlc3NmdWxseSAhIik7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tGYWlsZWQoInN0b3JhZ2VGaWxlcz9pZD0nIC4gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJHNsX2lkKSkgLiAnIiwiU3RvcmFnZSBOYW1lIEFscmVhZHkgRXhpc3RzIGF0IFNhbWUgTGV2ZWwhIik7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICA/PgogICAgICAgICAgICA8IS0tLWRlbGV0ZSBzdG9yYWdlIGxldmVsIHN0YXJ0LS0tLT4KICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsnZGVsZXRlZCddKSkgewogICAgICAgICAgICAgICAgJHNsX2lkID0gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTkgXS8iLCAiIiwgJF9QT1NUWydkZWxzbCddKTsKICAgICAgICAgICAgICAgICRzbF9pZCA9IG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGRiX2NvbiwgJHNsX2lkKTsKICAgICAgICAgICAgICAgICRkZWxldGVTdG9yYWdlID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJTZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkID0gJyRzbF9pZCciKSBvciBkaWUoJ0Vycm9yIDonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICRyd2RlbGV0ZVN0b3JhZ2UgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGRlbGV0ZVN0b3JhZ2UpOwogICAgICAgICAgICAgICAgJGRlbGV0U3RvcmFnZU5hbWUgPSAkcndkZWxldGVTdG9yYWdlWydzbF9uYW1lJ107CiAgICAgICAgICAgICAgICAkZGlyUGF0aCA9ICJleHRyYWN0LWhlcmUvIiAuICRkZWxldFN0b3JhZ2VOYW1lOwogICAgICAgICAgICAgICAgZGVsU3RyZygkc2xfaWQsICRmaWxlc2VydmVyLCAkcG9ydCwgJGZ0cFVzZXIsICRmdHBQd2QpOwogICAgICAgICAgICAgICAgcm1kaXIoJGRpclBhdGgpOwogICAgICAgICAgICAgICAgbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJERUxFVEUgRlJPTSB0Ymxfc3RvcmFnZV9sZXZlbCBXSEVSRSBzbF9pZD0nJHNsX2lkJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAkbG9nID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJpbnNlcnQgaW50byB0YmxfZXplZWZpbGVfbG9ncyhgaWRgLCBgdXNlcl9pZGAsIGB1c2VyX25hbWVgLCBgZ3JvdXBfaWRgLCBgc2xfaWRgLCBgYWN0aW9uX25hbWVgLCBgc3RhcnRfZGF0ZWAsIGBlbmRfZGF0ZWAsIGBzeXN0ZW1faXBgLCBgcmVtYXJrc2ApIHZhbHVlcyAobnVsbCwgJyRfU0VTU0lPTltjZGVzX3VzZXJfaWRdJywgJyRfU0VTU0lPTlthZG1pbl91c2VyX25hbWVdICRfU0VTU0lPTlthZG1pbl91c2VyX2xhc3RdJyxudWxsLCckc2xfaWQnLCdTdG9yYWdlIE5hbWUgJGRlbGV0U3RvcmFnZU5hbWUgZGVsZXRlZC4nLCckZGF0ZScsIG51bGwsJyRob3N0JywnJykiKSBvciBkaWUoJ2Vycm9yIDonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICRkZWxQYXJlbnRJZCA9ICRyd2RlbGV0ZVN0b3JhZ2VbJ3NsX3BhcmVudF9pZCddOwogICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tTdWNjZXNzKCJzdG9yYWdlRmlsZXM/aWQ9JyAuIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRkZWxQYXJlbnRJZCkpIC4gJyIsIlN0b3JhZ2UgRGVsZXRlZCBTdWNjZXNzZnVsbHkgISIpOzwvc2NyaXB0Pic7CgogICAgICAgICAgICAgICAgbXlzcWxpX2Nsb3NlKCRkYl9jb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgID8+CiAgICAgICAgICAgIDwhLS1BZGQgU3RvcmFnZSBMZXZlbCAtLT4KICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsnYWRkX3N0b3JhZ2UnXSkpIHsKICAgICAgICAgICAgICAgICRzbF9pZCA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgIiIsICRfUE9TVFsnYWRkX2NoaWxkJ10pOwogICAgICAgICAgICAgICAgJHNsX2lkID0gbXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkZGJfY29uLCAkc2xfaWQpOwogICAgICAgICAgICAgICAgJGNyZWF0ZSA9IG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGRiX2NvbiwgJGNyZWF0ZSk7CiAgICAgICAgICAgICAgICAkY3JlYXRlID0gcHJlZ19yZXBsYWNlKCcvW15hLXpBLVowLTktIF0vJywgJycsIG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGRiX2NvbiwgJF9QT1NUWydjcmVhdGVfY2hpbGQnXSkpOwogICAgICAgICAgICAgICAgJGNoZWNrTHZsTmFtZSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0Ymxfc3RvcmFnZV9sZXZlbCB3aGVyZSBzbF9wYXJlbnRfaWQ9JyRzbF9pZCcgQU5EIHNsX25hbWUgPSAnJGNyZWF0ZSciKSBvciBkaWUoJ0Vycm9yIGluIGNoZWNrTHZsTmFtZTonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgIGlmIChteXNxbGlfbnVtX3Jvd3MoJGNoZWNrTHZsTmFtZSkgPiAwKSB7CgogICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrRmFpbGVkKCJzdG9yYWdlP2lkPScgLiB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkc2xfaWQpKSAuICciLCJTdG9yYWdlIG9mIFNhbWUgTmFtZSBBbHJlYWR5IEV4aXN0ICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgJHBhcmVudCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0Ymxfc3RvcmFnZV9sZXZlbCB3aGVyZSBzbF9pZD0nJHNsX2lkJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CgogICAgICAgICAgICAgICAgICAgICRyd1BhcmVudCA9IG15c3FsaV9mZXRjaF9hc3NvYygkcGFyZW50KTsKCiAgICAgICAgICAgICAgICAgICAgJGxldmVsID0gJHJ3UGFyZW50WydzbF9kZXB0aF9sZXZlbCddICsgMTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRjcmVhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAiaW5zZXJ0IGludG8gdGJsX3N0b3JhZ2VfbGV2ZWwoc2xfaWQsIHNsX25hbWUsIHNsX3BhcmVudF9pZCwgc2xfZGVwdGhfbGV2ZWwpVkFMVUVTIChudWxsLCAnJGNyZWF0ZScsICckc2xfaWQnLCAnJGxldmVsJykiOwogICAgICAgICAgICAgICAgICAgICAgICAkc3FsX3J1biA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAkc3FsKSBvciBkaWUoImVycm9yOiIgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAkbmV3Q2hpbGRJZCA9IG15c3FsaV9pbnNlcnRfaWQoJGRiX2Nvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICRsb2cgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImluc2VydCBpbnRvIHRibF9lemVlZmlsZV9sb2dzKGBpZGAsIGB1c2VyX2lkYCwgYHVzZXJfbmFtZWAsIGBncm91cF9pZGAsIGBzbF9pZGAsIGBhY3Rpb25fbmFtZWAsIGBzdGFydF9kYXRlYCwgYGVuZF9kYXRlYCwgYHN5c3RlbV9pcGAsIGByZW1hcmtzYCkgdmFsdWVzIChudWxsLCAnJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF0nLCAnJF9TRVNTSU9OW2FkbWluX3VzZXJfbmFtZV0gJF9TRVNTSU9OW2FkbWluX3VzZXJfbGFzdF0nLG51bGwsJyRuZXdDaGlsZElkJywnTmV3IENoaWxkICRjcmVhdGUgQ3JlYXRlZC4nLCckZGF0ZScsIG51bGwsJyRob3N0JywnJykiKSBvciBkaWUoJ2Vycm9yIDonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tTdWNjZXNzKCJzdG9yYWdlP2lkPScgLiB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkc2xfaWQpKSAuICciLCJDaGlsZCBDcmVhdGVkIFN1Y2Nlc3NmdWxseSAhIik7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteXNxbGlfY2xvc2UoJGRiX2Nvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgPz4KICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgLy9hc2lnbiBkb2MgdG8gd29ya2Zsb3cKICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsnYXNzaWduVG8nXSkpIHsKICAgICAgICAgICAgICAgIGVjaG8gJ3dvcmtmbG93IGlkOiAnIC4gJHdmaWQgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSBdLyIsICIiLCAkX1BPU1RbJ3dmaWQnXSk7CiAgICAgICAgICAgICAgICBlY2hvICdkb2MgaWQ6ICcgLiAkZGNJZCA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgIiIsICRfUE9TVFsnbVRvd2YnXSk7CgogICAgICAgICAgICAgICAgJHdmZCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0Ymxfd29ya2Zsb3dfbWFzdGVyIHdoZXJlIHdvcmtmbG93X2lkPSckd2ZpZCciKTsKICAgICAgICAgICAgICAgICRyd1dmZCA9IG15c3FsaV9mZXRjaF9hc3NvYygkd2ZkKTsKICAgICAgICAgICAgICAgICR3b3JrRmxvd05hbWUgPSAkcndXZmRbJ3dvcmtmbG93X25hbWUnXTsKICAgICAgICAgICAgICAgICR3b3JrRmxvd0FycmF5ID0gZXhwbG9kZSgiICIsICR3b3JrRmxvd05hbWUpOwogICAgICAgICAgICAgICAgJHRpY2tldCA9ICcnOwogICAgICAgICAgICAgICAgZm9yICgkdyA9IDA7ICR3IDwgY291bnQoJHdvcmtGbG93QXJyYXkpOyAkdysrKSB7CiAgICAgICAgICAgICAgICAgICAgJG5hbWUgPSAkd29ya0Zsb3dBcnJheVskd107CiAgICAgICAgICAgICAgICAgICAgJHRpY2tldCA9ICR0aWNrZXQgLiBzdWJzdHIoJG5hbWUsIDAsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHVzZXJfaWQgPSAkX1NFU1NJT05bJ2NkZXNfdXNlcl9pZCddOwogICAgICAgICAgICAgICAgJHRpY2tldCA9ICR0aWNrZXQgLiAnXycgLiAkdXNlcl9pZCAuICdfJyAuIHN0cnRvdGltZSgkZGF0ZSk7CiAgICAgICAgICAgICAgICAkaWQgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSBdLyIsICIiLCBiYXNlNjRfZGVjb2RlKHVybGRlY29kZShAJF9HRVRbJ2lkJ10pKSk7ICAvL2dldCBkb2NJZCBmcm9tIHVybAogICAgICAgICAgICAgICAgJGlkID0gJGlkIC4gJ18nIC4gJHdmaWQ7CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCR3ZmlkKSkgewoKICAgICAgICAgICAgICAgICAgICAkY2hrcncgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX3Rhc2tfbWFzdGVyIHdoZXJlIHdvcmtmbG93X2lkID0gJyR3ZmlkJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChteXNxbGlfbnVtX3Jvd3MoJGNoa3J3KSA+IDApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICR1cHREb2NOYW1lID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJVUERBVEUgdGJsX2RvY3VtZW50X21hc3RlciBTRVQgZG9jX25hbWUgPSAnJGlkJywgc3RvcmFnZV9mbGFnPScwJyB3aGVyZSBkb2NfaWQgPSAnJGRjSWQnIikgb3IgZGllKCdlcnJvciB1cGRhdGU6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkZ2V0U3RlcCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0Ymxfc3RlcF9tYXN0ZXIgd2hlcmUgd29ya2Zsb3dfaWQgPSAnJHdmaWQnIE9SREVSIEJZIHN0ZXBfb3JkZXIgQVNDIExJTUlUIDEiKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAkZ2V0U3RwSWQgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGdldFN0ZXApOwogICAgICAgICAgICAgICAgICAgICAgICAkc3RwSWQgPSAkZ2V0U3RwSWRbJ3N0ZXBfaWQnXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRnZXRUYXNrID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF90YXNrX21hc3RlciB3aGVyZSBzdGVwX2lkID0gJyRzdHBJZCcgT1JERVIgQlkgdGFza19vcmRlciBBU0MgTElNSVQgMSIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRnZXRUYXNrSWQgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGdldFRhc2spOwogICAgICAgICAgICAgICAgICAgICAgICAkdHNrSWQgPSAkZ2V0VGFza0lkWyd0YXNrX2lkJ107CgogICAgICAgICAgICAgICAgICAgICAgICAkZ2V0VGFza0RsID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF90YXNrX21hc3RlciB3aGVyZSB0YXNrX2lkPSckdHNrSWQnIikgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHJ3Z2V0VGFza0RsID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRnZXRUYXNrRGwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyd2dldFRhc2tEbFsnZGVhZGxpbmVfdHlwZSddID09ICdEYXRlJyB8fCAkcndnZXRUYXNrRGxbJ2RlYWRsaW5lX3R5cGUnXSA9PSAnSHJzJykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbmREYXRlID0gZGF0ZSgnWS1tLWQgSDppOnMnLCAoc3RydG90aW1lKCRkYXRlKSArICRyd2dldFRhc2tEbFsnZGVhZGxpbmUnXSAqIDYwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyd2dldFRhc2tEbFsnZGVhZGxpbmVfdHlwZSddID09ICdEYXlzJykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbmREYXRlID0gZGF0ZSgnWS1tLWQgSDppOnMnLCAoc3RydG90aW1lKCRkYXRlKSArICRyd2dldFRhc2tEbFsnZGVhZGxpbmUnXSAqIDI0ICogNjAgKiA2MCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkaW5zZXJ0SW5UYXNrID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJJTlNFUlQgSU5UTyB0YmxfZG9jX2Fzc2lnbmVkX3dmKHRhc2tfaWQsIGRvY19pZCwgc3RhcnRfZGF0ZSwgZW5kX2RhdGUsIHRhc2tfc3RhdHVzLCBhc3NpZ25fYnksIHRhc2tfcmVtYXJrcyx0aWNrZXRfaWQpIFZBTFVFUyAoJyR0c2tJZCcsICckZGNJZCcsICckZGF0ZScsICckZW5kRGF0ZScsICdQZW5kaW5nJywgJyR1c2VyX2lkJywgJyR0YXNrUmVtYXJrJywnJHRpY2tldCcpIikgb3IgZGllKCdFcm9ycjogaGgnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGlkaW5zID0gbXlzcWxpX2luc2VydF9pZCgkZGJfY29uKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRnZXRUYXNrID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF90YXNrX21hc3RlciB3aGVyZSB0YXNrX2lkID0gJyR0c2tJZCciKSBvciBkaWUoJ0Vycm9ydDonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHJ3Z2V0VGFzayA9IG15c3FsaV9mZXRjaF9hc3NvYygkZ2V0VGFzayk7CiAgICAgICAgICAgICAgICAgICAgICAgICRUc2tTdHBJZCA9ICRyd2dldFRhc2tbJ3N0ZXBfaWQnXTsKICAgICAgICAgICAgICAgICAgICAgICAgJFRza1dmSWQgPSAkcndnZXRUYXNrWyd3b3JrZmxvd19pZCddOwogICAgICAgICAgICAgICAgICAgICAgICAkVHNrT3JkID0gJHJ3Z2V0VGFza1sndGFza19vcmRlciddOwogICAgICAgICAgICAgICAgICAgICAgICAkbmV4dFRhc2tPcmQgPSAkVHNrT3JkICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRhc2tBc2luKCRuZXh0VGFza09yZCwgJFRza1dmSWQsICRUc2tTdHBJZCwgJGRjSWQsICRkYXRlLCAkdXNlcl9pZCwgJGRiX2NvbiwgJHRhc2tSZW1hcmssICR0aWNrZXQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGluc2VydEluVGFzaykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfb25jZSAnLi9tYWlsLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWFpbCA9IGFzc2lnblRhc2soJHRpY2tldCwgJGlkaW5zLCAkZGJfY29uLCAkcHJvamVjdE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRtYWlsKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxzY3JpcHQ+dXBsb2FkU3VjY2VzcygiaW5kZXgiLCAiU3VibWl0dGVkIFN1Y2Nlc3NmdWxseSEhIik7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxzY3JpcHQ+dGFza0ZhaWxlZCgiaW5kZXgiLCAiT3BwcyEhIE1haWwgbm90IHNlbnQgISIpPC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxzY3JpcHQ+dGFza0ZhaWxlZCgiaW5kZXgiLCAiT3BwcyEhIFN1Ym1pc3Npb24gZmFpbGVkICEiKTwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8c2NyaXB0PnRhc2tGYWlsZWQoImluZGV4IiwgIlRoZXJlIGlzIG5vIHRhc2sgaW4gdGhpcyB3b3JrZmxvdyAhIik8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tGYWlsZWQoIiAiLCJQbGVhc2UgU2VsZWN0IFdvcmtGbG93ICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXlzcWxpX2Nsb3NlKCRkYl9jb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgID8+CiAgICAgICAgICAgIDwhLS1kZWxldGUgZG9jLS0+ICAKICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsnRGVsbXVsdGlwbGUnXSkpIHsKICAgICAgICAgICAgICAgICRwZXJtaXNzaW9uID0gdHJpbSgkX1BPU1RbJ0RlbG11bHRpcGxlJ10pOwogICAgICAgICAgICAgICAgJGRlbF9zbF9pZCA9IGV4cGxvZGUoJF9QT1NUWydzbF9pZDEnXSk7CiAgICAgICAgICAgICAgICAkZG9jRGVsZXRlID0gdHJpbSgkX1BPU1RbJ0RlbEZpbGUnXSk7CiAgICAgICAgICAgICAgICAkdXNlcl9pZDQgPSAkX1NFU1NJT05bJ2NkZXNfdXNlcl9pZCddOwogICAgICAgICAgICAgICAgJGNoZWtVc3IgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX2JyaWRnZV9yb2xlX3RvX3VtIHdoZXJlIEZJTkRfSU5fU0VUKCckdXNlcl9pZDQnLCB1c2VyX2lkcykgPiAwIikgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICRyd2NoZWNrVXNlciA9IG15c3FsaV9mZXRjaF9hc3NvYygkY2hla1Vzcik7CiAgICAgICAgICAgICAgICAkZ2V0RG9jUGF0aCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0IGRvY19wYXRoLG9sZF9kb2NfbmFtZSxkb2NfbmFtZSBmcm9tIHRibF9kb2N1bWVudF9tYXN0ZXIgd2hlcmUgZG9jX2lkIGluKCRkb2NEZWxldGUpIG9yIHN1YnN0cmluZ19pbmRleChkb2NfbmFtZSwnXycsLTEpIElOKCRkb2NEZWxldGUpIikgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgIHdoaWxlICgkcndnZXREb2NQYXRoID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRnZXREb2NQYXRoKSkgewogICAgICAgICAgICAgICAgICAgICRmaWxlUGF0aFtdID0gJHJ3Z2V0RG9jUGF0aFsnZG9jX3BhdGgnXTsKICAgICAgICAgICAgICAgICAgICAkcGF0aCA9IHN1YnN0cigkcndnZXREb2NQYXRoWydkb2NfcGF0aCddLCAwLCBzdHJycG9zKCRyd2dldERvY1BhdGhbJ2RvY19wYXRoJ10sICcvJykgKyAxKTsKICAgICAgICAgICAgICAgICAgICAkcGF0aHR4dFtdID0gJ2V4dHJhY3QtaGVyZS8nIC4gJHBhdGg7CiAgICAgICAgICAgICAgICAgICAgJGZpbGVuYW1lW10gPSAkcndnZXREb2NQYXRoWydvbGRfZG9jX25hbWUnXTsKICAgICAgICAgICAgICAgICAgICAkc3RvcmdJZCA9ICRyd2dldERvY1BhdGhbJ2RvY19uYW1lJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJHJ3Y2hlY2tVc2VyWydyb2xlX2lkJ10gPT0gMSAmJiAkcGVybWlzc2lvbiA9PSAiWWVzIikgewogICAgICAgICAgICAgICAgICAgICRkZWwgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgIkRFTEVURSBGUk9NIHRibF9kb2N1bWVudF9tYXN0ZXIgV0hFUkUgZG9jX2lkIGluKCRkb2NEZWxldGUpIG9yIHN1YnN0cmluZ19pbmRleChkb2NfbmFtZSwnXycsLTEpIElOKCRkb2NEZWxldGUpIikgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAkZGVsc2hhcmVEb2MgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgIkRFTEVURSBGUk9NIHRibF9kb2N1bWVudF9zaGFyZSBXSEVSRSBkb2NfaWRzIGluKCRkb2NEZWxldGUpIikgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkZmlsZVBhdGggYXMgJGZpbGVQYXRocykgewogICAgICAgICAgICAgICAgICAgICAgICAkcGF0aCA9ICdleHRyYWN0LWhlcmUvJyAuICRmaWxlUGF0aHM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGVFBfRU5BQkxFRCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmdHAgPSBuZXcgZnRwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnRwLT5jb25uKCIkZmlsZXNlcnZlciIsICIkcG9ydCIsICIkZnRwVXNlciIsICIkZnRwUHdkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnRwLT5zaW5nbGVGaWxlRGVsZXRlKFJPT1RfRlRQX0ZPTERFUiAuICcvJyAuICRmaWxlUGF0aHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFyciA9ICRmdHAtPmdldExvZ0RhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYXJyWydlcnJvciddICE9ICIiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxoMj5FcnJvcjo8L2gyPicgLiBpbXBsb2RlKCc8YnIgLz4nLCAkYXJyWydlcnJvciddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGluaygkcGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRkZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVuYW1lIGFzICRmaWxlbmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb2cgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImluc2VydCBpbnRvIHRibF9lemVlZmlsZV9sb2dzKGBpZGAsIGB1c2VyX2lkYCwgYHVzZXJfbmFtZWAsIGBncm91cF9pZGAsIGBzbF9pZGAsIGBhY3Rpb25fbmFtZWAsIGBzdGFydF9kYXRlYCwgYGVuZF9kYXRlYCwgYHN5c3RlbV9pcGAsIGByZW1hcmtzYCkgdmFsdWVzIChudWxsLCAnJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF0nLCAnJF9TRVNTSU9OW2FkbWluX3VzZXJfbmFtZV0gJF9TRVNTSU9OW2FkbWluX3VzZXJfbGFzdF0nLG51bGwsbnVsbCwnU3RvcmFnZSBEb2N1bWVudCAkZmlsZW5hbWVzIERlbGV0ZWQnLCckZGF0ZScsbnVsbCwnJGhvc3QnLG51bGwpIikgb3IgZGllKCdlcnJvciA6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBlY2hvJzxzY3JpcHQ+dGFza1N1Y2Nlc3MoInN0b3JhZ2VGaWxlcz9pZD0nIC4gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJHN0b3JnSWQpKSAuICciLCJEb2N1bWVudCBEZWxldGVkIFN1Y2Nlc3NmdWxseSAhIik7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvJzxzY3JpcHQ+dGFza0ZhaWxlZCgic3RvcmFnZUZpbGVzP2lkPScgLiB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkc3RvcmdJZCkpIC4gJyIsIkRvY3VtZW50IG5vdCBEZWxldGVkICAhIik7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHJ3Y2hlY2tVc2VyWydyb2xlX2lkJ10gPT0gMSAmJiAkcGVybWlzc2lvbiA9PSAiTm8iKSB7CiAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWZpbGVuYW1lMSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiVVBEQVRFIHRibF9kb2N1bWVudF9tYXN0ZXIgU0VUIGZsYWdfbXVsdGlkZWxldGU9MCBXSEVSRSBkb2NfaWQgaW4oJGRvY0RlbGV0ZSkgb3Igc3Vic3RyaW5nX2luZGV4KGRvY19uYW1lLCdfJywtMSkgSU4oJGRvY0RlbGV0ZSkiKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgIGlmICgkZGVsZXRlZmlsZW5hbWUxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlbmFtZSBhcyAkZmlsZW5hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9nID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJpbnNlcnQgaW50byB0YmxfZXplZWZpbGVfbG9ncyhgaWRgLCBgdXNlcl9pZGAsIGB1c2VyX25hbWVgLCBgZ3JvdXBfaWRgLCBgc2xfaWRgLCBgYWN0aW9uX25hbWVgLCBgc3RhcnRfZGF0ZWAsIGBlbmRfZGF0ZWAsIGBzeXN0ZW1faXBgLCBgcmVtYXJrc2ApIHZhbHVlcyAobnVsbCwgJyRfU0VTU0lPTltjZGVzX3VzZXJfaWRdJywgJyRfU0VTU0lPTlthZG1pbl91c2VyX25hbWVdICRfU0VTU0lPTlthZG1pbl91c2VyX2xhc3RdJyxudWxsLG51bGwsJ1N0b3JhZ2UgRG9jdW1lbnQgJGZpbGVuYW1lcyBEZWxldGVkJywnJGRhdGUnLG51bGwsJyRob3N0JyxudWxsKSIpIG9yIGRpZSgnZXJyb3IgOiAnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tTdWNjZXNzKCJzdG9yYWdlRmlsZXM/aWQ9JyAuIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRzdG9yZ0lkKSkgLiAnIiwiRG9jdW1lbnQgRGVsZXRlZCBTdWNjZXNzZnVsbHkgISIpOzwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tGYWlsZWQoInN0b3JhZ2VGaWxlcz9pZD0nIC4gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJHN0b3JnSWQpKSAuICciLCJEb2N1bWVudCBub3QgRGVsZXRlZCAgISIpOzwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkZGVsZXRlZmlsZW5hbWUxID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJVUERBVEUgdGJsX2RvY3VtZW50X21hc3RlciBTRVQgZmxhZ19tdWx0aWRlbGV0ZT0wIFdIRVJFIGRvY19pZCBpbigkZG9jRGVsZXRlKSBvciBzdWJzdHJpbmdfaW5kZXgoZG9jX25hbWUsJ18nLC0xKSBJTigkZG9jRGVsZXRlKSIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRkZWxldGVmaWxlbmFtZTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVuYW1lIGFzICRmaWxlbmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb2cgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImluc2VydCBpbnRvIHRibF9lemVlZmlsZV9sb2dzKGBpZGAsIGB1c2VyX2lkYCwgYHVzZXJfbmFtZWAsIGBncm91cF9pZGAsIGBzbF9pZGAsIGBhY3Rpb25fbmFtZWAsIGBzdGFydF9kYXRlYCwgYGVuZF9kYXRlYCwgYHN5c3RlbV9pcGAsIGByZW1hcmtzYCkgdmFsdWVzIChudWxsLCAnJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF0nLCAnJF9TRVNTSU9OW2FkbWluX3VzZXJfbmFtZV0gJF9TRVNTSU9OW2FkbWluX3VzZXJfbGFzdF0nLG51bGwsbnVsbCwnU3RvcmFnZSBEb2N1bWVudCAkZmlsZW5hbWVzIERlbGV0ZWQnLCckZGF0ZScsbnVsbCwnJGhvc3QnLG51bGwpIikgb3IgZGllKCdlcnJvciA6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrU3VjY2Vzcygic3RvcmFnZUZpbGVzP2lkPScgLiB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkc3RvcmdJZCkpIC4gJyIsIkRvY3VtZW50IERlbGV0ZWQgU3VjY2Vzc2Z1bGx5ICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrRmFpbGVkKCJzdG9yYWdlRmlsZXM/aWQ9JyAuIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRzdG9yZ0lkKSkgLiAnIiwiRG9jdW1lbnQgbm90IERlbGV0ZWQgICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15c3FsaV9jbG9zZSgkZGJfY29uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNzZXQoJF9QT1NUWydkZWxldGVEb2MnXSkpIHsKICAgICAgICAgICAgICAgICRpZCA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgIiIsICRfUE9TVFsndWlkJ10pOwogICAgICAgICAgICAgICAgJGlkID0gbXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkZGJfY29uLCAkaWQpOwogICAgICAgICAgICAgICAgJHBlcm1pc3Npb24gPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSBdLyIsICIiLCB0cmltKCRfUE9TVFsnZGVsZXRlRG9jJ10pKTsKICAgICAgICAgICAgICAgICRwZXJtaXNzaW9uID0gbXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkZGJfY29uLCAkcGVybWlzc2lvbik7CiAgICAgICAgICAgICAgICAkZ2V0RG9jUGF0aCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0YmxfZG9jdW1lbnRfbWFzdGVyIHdoZXJlIGRvY19pZD0nJGlkJyBvciBzdWJzdHJpbmdfaW5kZXgoZG9jX25hbWUsJ18nLC0xKT0nJGlkJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAkcndnZXREb2NQYXRoID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRnZXREb2NQYXRoKTsKICAgICAgICAgICAgICAgICRmaWxlUGF0aCA9ICRyd2dldERvY1BhdGhbJ2RvY19wYXRoJ107CiAgICAgICAgICAgICAgICAkZGVsZmlsZW5hbWUgPSAkcndnZXREb2NQYXRoWydvbGRfZG9jX25hbWUnXTsKICAgICAgICAgICAgICAgICRkZWxkb2NJZCA9ICRyd2dldERvY1BhdGhbJ2RvY19pZCddOwogICAgICAgICAgICAgICAgJHN0b3JnSWQgPSAkcndnZXREb2NQYXRoWydkb2NfbmFtZSddOwogICAgICAgICAgICAgICAgaWYgKCRyd2NoZWNrVXNlclsncm9sZV9pZCddID09IDEgJiYgJHBlcm1pc3Npb24gPT0gIlllcyIpIHsKCiAgICAgICAgICAgICAgICAgICAgJHBhdGggPSBzdWJzdHIoJHJ3Z2V0RG9jUGF0aFsnZG9jX3BhdGgnXSwgMCwgc3RycnBvcygkcndnZXREb2NQYXRoWydkb2NfcGF0aCddLCAnLycpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgJHBhdGh0eHQgPSAnZXh0cmFjdC1oZXJlLycgLiAkcGF0aCAuICdUWFQvJyAuICRpZCAuICcudHh0JzsKCiAgICAgICAgICAgICAgICAgICAgJGRlbCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiREVMRVRFIEZST00gdGJsX2RvY3VtZW50X21hc3RlciBXSEVSRSBkb2NfaWQgPSckaWQnIG9yIHN1YnN0cmluZ19pbmRleChkb2NfbmFtZSwnXycsLTEpPSckaWQnIikgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAkZGVsRG9jU2hhcmUgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgIkRFTEVURSBGUk9NIHRibF9kb2N1bWVudF9zaGFyZSBXSEVSRSBkb2NfaWRzID0nJGlkJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRkZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZUUF9FTkFCTEVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnRwID0gbmV3IGZ0cCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZ0cC0+Y29ubigiJGZpbGVzZXJ2ZXIiLCAiJHBvcnQiLCAiJGZ0cFVzZXIiLCAiJGZ0cFB3ZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZ0cC0+c2luZ2xlRmlsZURlbGV0ZShST09UX0ZUUF9GT0xERVIgLiAnLycgLiAkZmlsZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFyciA9ICRmdHAtPmdldExvZ0RhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYXJyWydlcnJvciddICE9ICIiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxoMj5FcnJvcjo8L2gyPicgLiBpbXBsb2RlKCc8YnIgLz4nLCAkYXJyWydlcnJvciddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGluaygnZXh0cmFjdC1oZXJlLycgLiAkZmlsZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmsoJHBhdGh0eHQpOwogICAgICAgICAgICAgICAgICAgICAgICAkbG9nID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJpbnNlcnQgaW50byB0YmxfZXplZWZpbGVfbG9ncyhgaWRgLCBgdXNlcl9pZGAsIGB1c2VyX25hbWVgLCBgZ3JvdXBfaWRgLCBgc2xfaWRgLCBgZG9jX2lkYCwgYGFjdGlvbl9uYW1lYCwgYHN0YXJ0X2RhdGVgLCBgZW5kX2RhdGVgLCBgc3lzdGVtX2lwYCwgYHJlbWFya3NgKSB2YWx1ZXMgKG51bGwsICckX1NFU1NJT05bY2Rlc191c2VyX2lkXScsICckX1NFU1NJT05bYWRtaW5fdXNlcl9uYW1lXSAkX1NFU1NJT05bYWRtaW5fdXNlcl9sYXN0XScsbnVsbCxudWxsLCAnJGRlbGRvY0lkJywgJ1N0b3JhZ2UgRG9jdW1lbnQgJGRlbGZpbGVuYW1lIERlbGV0ZWQnLCckZGF0ZScsbnVsbCwnJGhvc3QnLG51bGwpIikgb3IgZGllKCdlcnJvciA6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICBlY2hvJzxzY3JpcHQ+dGFza1N1Y2Nlc3MoInN0b3JhZ2VGaWxlcz9pZD0nIC4gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJHN0b3JnSWQpKSAuICciLCJEb2N1bWVudCBEZWxldGVkIFN1Y2Nlc3NmdWxseSAhIik7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvJzxzY3JpcHQ+dGFza0ZhaWxlZCgic3RvcmFnZUZpbGVzP2lkPScgLiB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkc3RvcmdJZCkpIC4gJyIsIkRvY3VtZW50IG5vdCBEZWxldGVkICAhIik7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHJ3Y2hlY2tVc2VyWydyb2xlX2lkJ10gPT0gMSAmJiAkcGVybWlzc2lvbiA9PSAiTm8iKSB7CgoKICAgICAgICAgICAgICAgICAgICAkZGVsZXRlZmlsZW5hbWUgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgIlVQREFURSB0YmxfZG9jdW1lbnRfbWFzdGVyIFNFVCBmbGFnX211bHRpZGVsZXRlPTAgV0hFUkUgZG9jX2lkPSckaWQnIG9yIHN1YnN0cmluZ19pbmRleChkb2NfbmFtZSwnXycsLTEpPSckaWQnIikgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJGRlbGV0ZWZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRsb2cgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImluc2VydCBpbnRvIHRibF9lemVlZmlsZV9sb2dzKGBpZGAsIGB1c2VyX2lkYCwgYHVzZXJfbmFtZWAsIGBncm91cF9pZGAsIGBzbF9pZGAsIGBkb2NfaWRgLCBgYWN0aW9uX25hbWVgLCBgc3RhcnRfZGF0ZWAsIGBlbmRfZGF0ZWAsIGBzeXN0ZW1faXBgLCBgcmVtYXJrc2ApIHZhbHVlcyAobnVsbCwgJyRfU0VTU0lPTltjZGVzX3VzZXJfaWRdJywgJyRfU0VTU0lPTlthZG1pbl91c2VyX25hbWVdICRfU0VTU0lPTlthZG1pbl91c2VyX2xhc3RdJyxudWxsLG51bGwsICckZGVsZG9jSWQnLCAnU3RvcmFnZSBEb2N1bWVudCAkZGVsZmlsZW5hbWUgRGVsZXRlZCcsJyRkYXRlJyxudWxsLCckaG9zdCcsbnVsbCkiKSBvciBkaWUoJ2Vycm9yIDogJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrU3VjY2Vzcygic3RvcmFnZUZpbGVzP2lkPScgLiB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkc3RvcmdJZCkpIC4gJyIsIkRvY3VtZW50IERlbGV0ZWQgU3VjY2Vzc2Z1bGx5ICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxzY3JpcHQ+dGFza1N1Y2Nlc3MoInN0b3JhZ2VGaWxlcz9pZD0nIC4gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJHN0b3JnSWQpKSAuICciLCJEb2N1bWVudCBOb3QgRGVsZXRlZCIpPC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAkZGVsZXRlZmlsZW5hbWUgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgIlVQREFURSB0YmxfZG9jdW1lbnRfbWFzdGVyIFNFVCBmbGFnX211bHRpZGVsZXRlPTAgV0hFUkUgZG9jX2lkPSckaWQnIG9yIHN1YnN0cmluZ19pbmRleChkb2NfbmFtZSwnXycsLTEpPSckaWQnIikgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJGRlbGV0ZWZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRsb2cgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImluc2VydCBpbnRvIHRibF9lemVlZmlsZV9sb2dzKGBpZGAsIGB1c2VyX2lkYCwgYHVzZXJfbmFtZWAsIGBncm91cF9pZGAsIGBzbF9pZGAsIGBkb2NfaWRgLCBgYWN0aW9uX25hbWVgLCBgc3RhcnRfZGF0ZWAsIGBlbmRfZGF0ZWAsIGBzeXN0ZW1faXBgLCBgcmVtYXJrc2ApIHZhbHVlcyAobnVsbCwgJyRfU0VTU0lPTltjZGVzX3VzZXJfaWRdJywgJyRfU0VTU0lPTlthZG1pbl91c2VyX25hbWVdICRfU0VTU0lPTlthZG1pbl91c2VyX2xhc3RdJyxudWxsLG51bGwsICckZGVsZG9jSWQnLCAnU3RvcmFnZSBEb2N1bWVudCAkZGVsZmlsZW5hbWUgRGVsZXRlZCcsJyRkYXRlJyxudWxsLCckaG9zdCcsbnVsbCkiKSBvciBkaWUoJ2Vycm9yIDogJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrU3VjY2Vzcygic3RvcmFnZUZpbGVzP2lkPScgLiB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkc3RvcmdJZCkpIC4gJyIsIkRvY3VtZW50IERlbGV0ZWQgU3VjY2Vzc2Z1bGx5ICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxzY3JpcHQ+dGFza1N1Y2Nlc3MoInN0b3JhZ2VGaWxlcz9pZD0nIC4gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJHN0b3JnSWQpKSAuICciLCJEb2N1bWVudCBOb3QgRGVsZXRlZCIpPC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteXNxbGlfY2xvc2UoJGRiX2Nvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsnZGVsZXRlVmVyc2lvbkRvYyddKSkgewogICAgICAgICAgICAgICAgJGlkID0gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTkgXS8iLCAiIiwgJF9QT1NUWydkb2NpZCddKTsKICAgICAgICAgICAgICAgICRpZCA9IG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGRiX2NvbiwgJGlkKTsKICAgICAgICAgICAgICAgICRnZXREb2NQYXRoID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9kb2N1bWVudF9tYXN0ZXIgd2hlcmUgZG9jX2lkPSckaWQnIikgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICRyd2dldERvY1BhdGggPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGdldERvY1BhdGgpOwogICAgICAgICAgICAgICAgJGZpbGVQYXRoID0gJHJ3Z2V0RG9jUGF0aFsnZG9jX3BhdGgnXTsKICAgICAgICAgICAgICAgICRkZWx2cnNuZmlsZSA9ICRyd2dldERvY1BhdGhbJ29sZF9kb2NfbmFtZSddOwogICAgICAgICAgICAgICAgJGRlbCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiZGVsZXRlIGZyb20gdGJsX2RvY3VtZW50X21hc3RlciB3aGVyZSBkb2NfaWQ9JyRpZCciKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgdW5saW5rKCdleHRyYWN0LWhlcmUvJyAuICRmaWxlUGF0aCk7CiAgICAgICAgICAgICAgICBpZiAoJGRlbCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoRlRQX0VOQUJMRUQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRmdHAgPSBuZXcgZnRwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRmdHAtPmNvbm4oIiRmaWxlc2VydmVyIiwgIiRwb3J0IiwgIiRmdHBVc2VyIiwgIiRmdHBQd2QiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGZ0cC0+c2luZ2xlRmlsZURlbGV0ZShST09UX0ZUUF9GT0xERVIgLiAnLycgLiAkZmlsZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAkYXJyID0gJGZ0cC0+Z2V0TG9nRGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGFyclsnZXJyb3InXSAhPSAiIikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxoMj5FcnJvcjo8L2gyPicgLiBpbXBsb2RlKCc8YnIgLz4nLCAkYXJyWydlcnJvciddKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbG9nID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJpbnNlcnQgaW50byB0YmxfZXplZWZpbGVfbG9ncyhgaWRgLCBgdXNlcl9pZGAsIGB1c2VyX25hbWVgLCBgZ3JvdXBfaWRgLCBgc2xfaWRgLCBgYWN0aW9uX25hbWVgLCBgc3RhcnRfZGF0ZWAsIGBlbmRfZGF0ZWAsIGBzeXN0ZW1faXBgLCBgcmVtYXJrc2ApIHZhbHVlcyAobnVsbCwgJyRfU0VTU0lPTltjZGVzX3VzZXJfaWRdJywgJyRfU0VTU0lPTlthZG1pbl91c2VyX25hbWVdICRfU0VTU0lPTlthZG1pbl91c2VyX2xhc3RdJyxudWxsLG51bGwsJ1N0b3JhZ2UgRG9jdW1lbnQgJGRlbHZyc25maWxlIERlbGV0ZWQnLCckZGF0ZScsbnVsbCwnJGhvc3QnLG51bGwpIikgb3IgZGllKCdlcnJvciA6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwoKICAgICAgICAgICAgICAgICAgICAkZG9jTmFtZSA9IGV4cGxvZGUoIl8iLCAkcndnZXREb2NQYXRoWydkb2NfbmFtZSddKTsKICAgICAgICAgICAgICAgICAgICAkc3RvcmdJZCA9ICRkb2NOYW1lWzBdOwogICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrU3VjY2Vzcygic3RvcmFnZUZpbGVzP2lkPScgLiB1cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkc3RvcmdJZCkpIC4gJyIsIlN0b3JhZ2UgRGVsZXRlZCBTdWNjZXNzZnVsbHkgISIpOzwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICAgICAgLy9lY2hvJzxzY3JpcHQ+dGFza1N1Y2Nlc3MoInN0b3JhZ2VGaWxlcyIsIkRvY3VtZW50IERlbGV0ZWQgU3VjY2Vzc2Z1bGx5ICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICc8c2NyaXB0PnRhc2tGYWlsZWQoInN0b3JhZ2VGaWxlcyIsIkRvY3VtZW50IE5vdCBEZWxldGVkIik8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXlzcWxpX2Nsb3NlKCRkYl9jb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgID8+ICAgICAgICAgICAgICAgCiAgICAgICAgICAgIDwhLS1yZW5hbWUgZG9jLS0+CiAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ2VkaXRGaWxlTmFtZSddKSkgewoKICAgICAgICAgICAgICAgICRyZW5hbWVpZCA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgIiIsIGZpbHRlcl9pbnB1dChJTlBVVF9QT1NULCAiZG9jSWQiKSk7CiAgICAgICAgICAgICAgICAkcmVuYW1lTmFtZSA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgIiIsIGZpbHRlcl9pbnB1dChJTlBVVF9QT1NULCAicmVuYW1lTmFtZSIpKTsKCiAgICAgICAgICAgICAgICAkdXBkYXRlRG9jID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJ1cGRhdGUgdGJsX2RvY3VtZW50X21hc3RlciBzZXQgb2xkX2RvY19uYW1lID0gJyRyZW5hbWVOYW1lJyB3aGVyZSBkb2NfaWQgPSAnJHJlbmFtZWlkJyIpIG9yIGRpZSgnRXJyb3I6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgID8+CgogICAgICAgICAgICA8IS0tdXBkYXRlIG1ldGFkYXRhIHZhbHVlLS0+CiAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ2VkaXRNZXRhVmFsdWUnXSkpIHsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJF9GSUxFU1snZmlsZU5hbWUnXVsnbmFtZSddKSkgewogICAgICAgICAgICAgICAgICAgICR1c2VyX2lkID0gJF9TRVNTSU9OWydjZGVzX3VzZXJfaWQnXTsKICAgICAgICAgICAgICAgICAgICAkZG9jX2lkID0gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTkgXS8iLCAiIiwgJF9QT1NUWydkb2NpZCddKTsKICAgICAgICAgICAgICAgICAgICAkZG9jX2lkID0gbXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkZGJfY29uLCAkZG9jX2lkKTsKICAgICAgICAgICAgICAgICAgICAkZmlsZV9uYW1lID0gJF9GSUxFU1snZmlsZU5hbWUnXVsnbmFtZSddOwogICAgICAgICAgICAgICAgICAgICRmaWxlX3NpemUgPSAkX0ZJTEVTWydmaWxlTmFtZSddWydzaXplJ107CiAgICAgICAgICAgICAgICAgICAgJGZpbGVfdHlwZSA9ICRfRklMRVNbJ2ZpbGVOYW1lJ11bJ3R5cGUnXTsKICAgICAgICAgICAgICAgICAgICAkZmlsZV90bXAgPSAkX0ZJTEVTWydmaWxlTmFtZSddWyd0bXBfbmFtZSddOwogICAgICAgICAgICAgICAgICAgICRwYWdlQ291bnQgPSAkX1BPU1RbJ3BhZ2VDb3VudCddOwogICAgICAgICAgICAgICAgICAgIGlmICgkcGFnZUNvdW50IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHBhZ2VDb3VudCA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRleHRuID0gc3Vic3RyKCRmaWxlX25hbWUsIHN0cnJwb3MoJGZpbGVfbmFtZSwgJy4nKSArIDEpOwogICAgICAgICAgICAgICAgICAgICRmbmFtZSA9IHN1YnN0cigkZmlsZV9uYW1lLCAwLCBzdHJycG9zKCRmaWxlX25hbWUsICcuJykpOwoKICAgICAgICAgICAgICAgICAgICAkZmlsZUV4dG4gPSBzdWJzdHIoJGZpbGVfbmFtZSwgc3RycnBvcygkZmlsZV9uYW1lLCAiLiIpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgJGdldERvY05hbWUgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX2RvY3VtZW50X21hc3RlciB3aGVyZSBkb2NfaWQgPSAnJGRvY19pZCciKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICRyd2dldERvY05hbWUgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGdldERvY05hbWUpOwogICAgICAgICAgICAgICAgICAgICRkb2NOYW1lID0gJHJ3Z2V0RG9jTmFtZVsnZG9jX25hbWUnXTsKICAgICAgICAgICAgICAgICAgICAvLyRkb2NOYW1lID0gZXhwbG9kZSgiXyIsICRkb2NOYW1lKTsKICAgICAgICAgICAgICAgICAgICAkb2xkX2ZpbGVfbmFtZSA9ICRyd2dldERvY05hbWVbJ29sZF9kb2NfbmFtZSddOwogICAgICAgICAgICAgICAgICAgICRvbGRleHRuID0gc3Vic3RyKCRvbGRfZmlsZV9uYW1lLCBzdHJycG9zKCRvbGRfZmlsZV9uYW1lLCAnLicpICsgMSk7IC8vIG9sZCBmaWxlIGV4dG4KICAgICAgICAgICAgICAgICAgICAkb2xkZm5hbWUgPSBzdWJzdHIoJG9sZF9maWxlX25hbWUsIDAsIHN0cnJwb3MoJG9sZF9maWxlX25hbWUsICcuJykpOyAvLyBvbGQgZmlsZSBuYW1lCgogICAgICAgICAgICAgICAgICAgICR1cGRhdGVEb2NOYW1lID0gJGRvY05hbWUgLiAnXycgLiAkZG9jX2lkOyAvL3N0b3JhZ2UgaWQgZm9sbG93ZWQgYnkgZG9jIGlkCiAgICAgICAgICAgICAgICAgICAgJGNoZWtGaWxlVmVyc2lvbiA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiU0VMRUNUICogRlJPTSBgdGJsX2RvY3VtZW50X21hc3RlcmAgV0hFUkUgZmluZF9pbl9zZXQoJyR1cGRhdGVEb2NOYW1lJywgZG9jX25hbWUpIikgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAkZmxWZXJzaW9uID0gbXlzcWxpX251bV9yb3dzKCRjaGVrRmlsZVZlcnNpb24pOwogICAgICAgICAgICAgICAgICAgICRmbFZlcnNpb24gPSAkZmxWZXJzaW9uICsgMTsKICAgICAgICAgICAgICAgICAgICAkbmZpbGVuYW1lID0gJG9sZGZuYW1lIC4gJ18nIC4gJGZsVmVyc2lvbjsKCiAgICAgICAgICAgICAgICAgICAgJHN0cmdOYW1lID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkID0gJyRkb2NOYW1lJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgJHJ3c3RyZ05hbWUgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHN0cmdOYW1lKTsKICAgICAgICAgICAgICAgICAgICAkc3RvcmFnZU5hbWUgPSAkcndzdHJnTmFtZVsnc2xfbmFtZSddOwogICAgICAgICAgICAgICAgICAgICRzdG9yYWdlTmFtZSA9IHN0cl9yZXBsYWNlKCIgIiwgIiIsICRzdG9yYWdlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgJHN0b3JhZ2VOYW1lID0gcHJlZ19yZXBsYWNlKCcvW15BLVphLXowLTlcLV0vJywgJycsICRzdG9yYWdlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgJHVwbG9hZGRpciA9ICJleHRyYWN0LWhlcmUvIiAuICRzdG9yYWdlTmFtZSAuICcvJzsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2RpcigkdXBsb2FkZGlyKSkgewogICAgICAgICAgICAgICAgICAgICAgICBta2RpcigkdXBsb2FkZGlyLCA3NzcsIFRSVUUpIG9yIGRpZShwcmludF9yKGVycm9yX2dldF9sYXN0KCkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJG5maWxlbmFtZSA9IHByZWdfcmVwbGFjZSgnL1teQS1aYS16MC05X1wtXS8nLCAnJywgJG5maWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgLy8gJGZpbGVuYW1lRW5jdD0kZm5hbWUuJy4nLiRleHRuOy8vIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRmbmFtZSkpLicuJy4kZXh0bjsKICAgICAgICAgICAgICAgICAgICAkZmlsZW5hbWVFbmN0ID0gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJG5maWxlbmFtZSkpOwogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZUVuY3QgPSBwcmVnX3JlcGxhY2UoJy9bXkEtWmEtejAtOV9cLV0vJywgJycsICRmaWxlbmFtZUVuY3QpOwogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZUVuY3QgPSAkZmlsZW5hbWVFbmN0IC4gJy4nIC4gJGV4dG47CiAgICAgICAgICAgICAgICAgICAgJGZpbGVuYW1lRW5jdCA9IHRpbWUoKSAuICRmaWxlbmFtZUVuY3Q7CgogICAgICAgICAgICAgICAgICAgIC8vICAkaW1hZ2VfcGF0aCA9ICJpbWFnZXMvIiAuICRmaWxlX25hbWU7CiAgICAgICAgICAgICAgICAgICAgJHVwbG9hZGRpciA9ICR1cGxvYWRkaXIgLiAkZmlsZW5hbWVFbmN0OwogICAgICAgICAgICAgICAgICAgICR1cGxvYWQgPSBtb3ZlX3VwbG9hZGVkX2ZpbGUoJGZpbGVfdG1wLCAkdXBsb2FkZGlyKSBvciBkaWUocHJpbnRfcihlcnJvcl9nZXRfbGFzdCgpKSk7CgogICAgICAgICAgICAgICAgICAgICR1cGxvYWRJblRvRlRQID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR1cGxvYWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGVFBfRU5BQkxFRCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmdHAgPSBuZXcgZnRwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnRwLT5jb25uKCIkZmlsZXNlcnZlciIsICIkcG9ydCIsICIkZnRwVXNlciIsICIkZnRwUHdkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRmdHAtPmdldChST09UX0ZUUF9GT0xERVIuJy8nLiRkb2NfUGF0aF9jb3B5X3RvLCRkb2NfcGF0aCk7IAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlcGF0aCA9ICRzdG9yYWdlTmFtZSAuICcvJyAuICRmaWxlbmFtZUVuY3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXBsb2FkZmlsZSA9ICRmdHAtPnB1dChST09UX0ZUUF9GT0xERVIgLiAnLycgLiAkZmlsZXBhdGgsICR1cGxvYWRkaXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFyciA9ICRmdHAtPmdldExvZ0RhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdXBsb2FkZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXBsb2FkSW5Ub0ZUUCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKCR1cGxvYWRkaXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8aDI+RXJyb3I6PC9oMj4nIC4gaW1wbG9kZSgnPGJyIC8+JywgJGFyclsnZXJyb3InXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVwbG9hZEluVG9GVFAgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cGxvYWRJblRvRlRQID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCR1cGxvYWRJblRvRlRQKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAkY29scyA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkY29sdW1ucyA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiU0hPVyBDT0xVTU5TIEZST00gdGJsX2RvY3VtZW50X21hc3RlciIpOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJHJ3Q29scyA9IG15c3FsaV9mZXRjaF9hcnJheSgkY29sdW1ucykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcndDb2xzWydGaWVsZCddICE9ICdkb2NfaWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRjb2xzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29scyA9ICdgJyAuICRyd0NvbHNbJ0ZpZWxkJ10gLiAnYCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbHMgPSAkY29scyAuICcsYCcgLiAkcndDb2xzWydGaWVsZCddIC4gJ2AnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJGNyZWF0ZVZyc24gPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgIklOU0VSVCBJTlRPIHRibF9kb2N1bWVudF9tYXN0ZXIoJGNvbHMpIHNlbGVjdCAkY29scyBmcm9tIHRibF9kb2N1bWVudF9tYXN0ZXIgd2hlcmUgZG9jX2lkPSckZG9jX2lkJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRpbnNlcnREb2NJRCA9IG15c3FsaV9pbnNlcnRfaWQoJGRiX2Nvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICRnZXRNZXRhSWQgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX2RvY3VtZW50X21hc3RlciB3aGVyZSBkb2NfaWQgPSAnJF9QT1NUW2RvY2lkXSciKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gInNlbGVjdCAqIGZyb20gdGJsX2RvY3VtZW50X21hc3RlciB3aGVyZSBkb2NfaWQgPSAnJF9QT1NUW2RvY2lkXSciOwogICAgICAgICAgICAgICAgICAgICAgICAkbWV0YV9yb3cgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGdldE1ldGFJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRnZXRNZXRhSWQgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX21ldGFkYXRhX3RvX3N0b3JhZ2VsZXZlbCB3aGVyZSBzbF9pZCA9ICckbWV0YV9yb3dbZG9jX25hbWVdJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRyd2dldE1ldGFJZCA9IG15c3FsaV9mZXRjaF9hc3NvYygkZ2V0TWV0YUlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdldE1ldGFOYW1lID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9tZXRhZGF0YV9tYXN0ZXIgd2hlcmUgaWQgPSAnJHJ3Z2V0TWV0YUlkW21ldGFkYXRhX2lkXSciKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFN0b3JhZ2VObWUgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCBzbF9uYW1lIGZyb20gdGJsX3N0b3JhZ2VfbGV2ZWwgd2hlcmUgc2xfaWQ9JyRyd2dldE1ldGFJZFtzbF9pZF0nIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcndTdHJOYW1lID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRTdG9yYWdlTm1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcndnZXRNZXRhTmFtZSA9IG15c3FsaV9mZXRjaF9hc3NvYygkZ2V0TWV0YU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1ldGEgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCBgJHJ3Z2V0TWV0YU5hbWVbZmllbGRfbmFtZV1gIGZyb20gdGJsX2RvY3VtZW50X21hc3RlciB3aGVyZSBkb2NfaWQ9JyRtZXRhX3Jvd1tkb2NfaWRdJyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyd01ldGEgPSBteXNxbGlfZmV0Y2hfYXJyYXkoJG1ldGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcndnZXRNZXRhTmFtZVsnZmllbGRfbmFtZSddID09ICdub29mcGFnZXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcndnZXRNZXRhTmFtZVsnZGF0YV90eXBlJ10gPT0gJ2RhdGV0aW1lJykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWVsZFZhbHVlID0gZGF0ZSgnWS1tLWQnLCBzdHJ0b3RpbWUoJF9QT1NUWydmaWVsZE5hbWUnIC4gJGldKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpZWxkVmFsdWUgPSAkX1BPU1RbJ2ZpZWxkTmFtZScgLiAkaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb2cgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImluc2VydCBpbnRvIHRibF9lemVlZmlsZV9sb2dzKGBpZGAsIGB1c2VyX2lkYCwgYHVzZXJfbmFtZWAsIGBncm91cF9pZGAsIGBzbF9pZGAsIGBhY3Rpb25fbmFtZWAsIGBzdGFydF9kYXRlYCwgYGVuZF9kYXRlYCwgYHN5c3RlbV9pcGAsIGByZW1hcmtzYCkgdmFsdWVzIChudWxsLCAnJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF0nLCAnJF9TRVNTSU9OW2FkbWluX3VzZXJfbmFtZV0gJF9TRVNTSU9OW2FkbWluX3VzZXJfbGFzdF0nLG51bGwsbnVsbCwnVmVyc2lvbmluZyBEb2N1bWVudCAkZmlsZV9uYW1lIEFkZGVkJywnJGRhdGUnLG51bGwsJyRob3N0JyxudWxsKSIpIG9yIGRpZSgnZXJyb3IgOiAnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjcmVhdGVWcnNuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VjaG8gInVwZGF0ZSB0YmxfZG9jdW1lbnRfbWFzdGVyIHNldCBgJHJ3Z2V0TWV0YU5hbWVbZmllbGRfbmFtZV1gID0gJyRmaWVsZFZhbHVlJywgZG9jX25hbWU9JyR1cGRhdGVEb2NOYW1lJyB3aGVyZSBkb2NfaWQ9JyRpbnNlcnREb2NJRCciOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJ1cGRhdGUgdGJsX2RvY3VtZW50X21hc3RlciBzZXQgb2xkX2RvY19uYW1lPSckZmlsZV9uYW1lJyxmaWxlbmFtZT0nJGZuYW1lJywgZG9jX2V4dG49JyRleHRuJywgZG9jX3BhdGg9JyRzdG9yYWdlTmFtZS8kZmlsZW5hbWVFbmN0JywgdXBsb2FkZWRfYnk9JyR1c2VyX2lkJywgZG9jX3NpemU9JyRmaWxlX3NpemUnLCBub29mcGFnZXM9JyRwYWdlQ291bnQnLCBkYXRlcG9zdGVkPSckZGF0ZScgd2hlcmUgZG9jX2lkPSckX1BPU1RbZG9jaWRdJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RpZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cGRhdGVOZXcgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInVwZGF0ZSB0YmxfZG9jdW1lbnRfbWFzdGVyIHNldCBgJHJ3Z2V0TWV0YU5hbWVbZmllbGRfbmFtZV1gID0gJyRmaWVsZFZhbHVlJywgZG9jX25hbWU9JyR1cGRhdGVEb2NOYW1lJyB3aGVyZSBkb2NfaWQ9JyRpbnNlcnREb2NJRCciKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cGRhdGVPbGQgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInVwZGF0ZSB0YmxfZG9jdW1lbnRfbWFzdGVyIHNldCBgJHJ3Z2V0TWV0YU5hbWVbZmllbGRfbmFtZV1gID0gJyRmaWVsZFZhbHVlJywgb2xkX2RvY19uYW1lPSckZmlsZV9uYW1lJyxmaWxlbmFtZT0nJGZuYW1lJywgZG9jX2V4dG49JyRleHRuJywgZG9jX3BhdGg9JyRzdG9yYWdlTmFtZS8kZmlsZW5hbWVFbmN0JywgdXBsb2FkZWRfYnk9JyR1c2VyX2lkJywgZG9jX3NpemU9JyRmaWxlX3NpemUnLCBub29mcGFnZXM9JyRwYWdlQ291bnQnLCBkYXRlcG9zdGVkPSckZGF0ZScgd2hlcmUgZG9jX2lkPSckX1BPU1RbZG9jaWRdJyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR1cGRhdGVOZXcgJiYgJHVwZGF0ZU9sZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrU3VjY2VzcygiJyAuIGJhc2VuYW1lKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuICciLCJVcGRhdGVkIFN1Y2Nlc3NmdWxseSAhIik7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxzY3JpcHQ+dGFza0ZhaWxlZCgiJyAuIGJhc2VuYW1lKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuICciLCAiT3BwcyEgRmlsZSB1cGxvYWQgZmFpbGVkIik8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICRnZXRNZXRhSWQgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX2RvY3VtZW50X21hc3RlciB3aGVyZSBkb2NfaWQgPSAnJF9QT1NUW2RvY2lkXSciKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgIC8vZWNobyAic2VsZWN0ICogZnJvbSB0YmxfZG9jdW1lbnRfbWFzdGVyIHdoZXJlIGRvY19pZCA9ICckX1BPU1RbZG9jaWRdJyI7CiAgICAgICAgICAgICAgICAgICAgJG1ldGFfcm93ID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRnZXRNZXRhSWQpOwogICAgICAgICAgICAgICAgICAgICRnZXRNZXRhSWQgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX21ldGFkYXRhX3RvX3N0b3JhZ2VsZXZlbCB3aGVyZSBzbF9pZCA9ICckbWV0YV9yb3dbZG9jX25hbWVdJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJzZWxlY3QgKiBmcm9tIHRibF9tZXRhZGF0YV90b19zdG9yYWdlbGV2ZWwgd2hlcmUgc2xfaWQgPSAnJG1ldGFfcm93W2RvY19uYW1lXSciOwogICAgICAgICAgICAgICAgICAgICRpID0gMTsKCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRyd2dldE1ldGFJZCA9IG15c3FsaV9mZXRjaF9hc3NvYygkZ2V0TWV0YUlkKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgJGdldE1ldGFOYW1lID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9tZXRhZGF0YV9tYXN0ZXIgd2hlcmUgaWQgPSAnJHJ3Z2V0TWV0YUlkW21ldGFkYXRhX2lkXSciKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAkU3RvcmFnZU5tZSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0IHNsX25hbWUgZnJvbSB0Ymxfc3RvcmFnZV9sZXZlbCB3aGVyZSBzbF9pZD0nJHJ3Z2V0TWV0YUlkW3NsX2lkXSciKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHJ3U3RyTmFtZSA9IG15c3FsaV9mZXRjaF9hc3NvYygkU3RvcmFnZU5tZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcndnZXRNZXRhTmFtZSA9IG15c3FsaV9mZXRjaF9hc3NvYygkZ2V0TWV0YU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWV0YSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0IGAkcndnZXRNZXRhTmFtZVtmaWVsZF9uYW1lXWAgZnJvbSB0YmxfZG9jdW1lbnRfbWFzdGVyIHdoZXJlIGRvY19pZD0nJG1ldGFfcm93W2RvY19pZF0nIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcndNZXRhID0gbXlzcWxpX2ZldGNoX2FycmF5KCRtZXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJG1ldGFkYXRWYWx1ZSA9ICRyd01ldGFbJyddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICRpOyBlY2hvICctJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcndnZXRNZXRhTmFtZVsnZmllbGRfbmFtZSddID09ICdub29mcGFnZXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJ3Z2V0TWV0YU5hbWVbJ2RhdGFfdHlwZSddID09ICdkYXRldGltZScpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWVsZFZhbHVlID0gZGF0ZSgnWS1tLWQnLCBzdHJ0b3RpbWUoJF9QT1NUWydmaWVsZE5hbWUnIC4gJGldKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWVsZFZhbHVlID0gJF9QT1NUWydmaWVsZE5hbWUnIC4gJGldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lY2hvICJ1cGRhdGUgdGJsX2RvY3VtZW50X21hc3RlciBzZXQgYCRyd2dldE1ldGFOYW1lW2ZpZWxkX25hbWVdYCA9ICckZmllbGRWYWx1ZScgd2hlcmUgZG9jX2lkID0gJyRfUE9TVFttZXRhSWRdJyBvciAoc3Vic3RyaW5nX2luZGV4KGRvY19uYW1lLCdfJywtMSk9JyRfUE9TVFttZXRhSWRdJyBhbmQgc3Vic3RyaW5nX2luZGV4KGRvY19uYW1lLCdfJywxKT0nJF9QT1NUW21ldGFJZF0nKSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVwZGF0ZU1ldGEgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInVwZGF0ZSB0YmxfZG9jdW1lbnRfbWFzdGVyIHNldCBgJHJ3Z2V0TWV0YU5hbWVbZmllbGRfbmFtZV1gID0gJyRmaWVsZFZhbHVlJyB3aGVyZSBkb2NfaWQgPSAnJF9QT1NUW2RvY2lkXScgb3IgKHN1YnN0cmluZ19pbmRleChkb2NfbmFtZSwnXycsLTEpPSckX1BPU1RbZG9jaWRdJyBhbmQgc3Vic3RyaW5nX2luZGV4KGRvY19uYW1lLCdfJywxKT0nJF9QT1NUW2RvY2lkXScpIikgb3IgZGllKCdFcnJvcicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdXBkYXRlTWV0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21ldGFkYXRhIHVwZGF0ZSBsb2cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxvZyA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiaW5zZXJ0IGludG8gdGJsX2V6ZWVmaWxlX2xvZ3MoYGlkYCwgYHVzZXJfaWRgLCBgdXNlcl9uYW1lYCwgYGdyb3VwX2lkYCwgYHNsX2lkYCwgYGFjdGlvbl9uYW1lYCwgYHN0YXJ0X2RhdGVgLCBgZW5kX2RhdGVgLCBgc3lzdGVtX2lwYCwgYHJlbWFya3NgKSB2YWx1ZXMgKG51bGwsICckX1NFU1NJT05bY2Rlc191c2VyX2lkXScsICckX1NFU1NJT05bYWRtaW5fdXNlcl9uYW1lXSAkX1NFU1NJT05bYWRtaW5fdXNlcl9sYXN0XScsbnVsbCxudWxsLCdNZXRhRGF0YSBWYWx1ZSAkZmllbGRWYWx1ZSBBc3NpZ24gaW4gTWV0YURhdGEgRmllbGQgJHJ3Z2V0TWV0YU5hbWVbZmllbGRfbmFtZV0gaW4gJHJ3U3RyTmFtZVtzbF9uYW1lXScsJyRkYXRlJyxudWxsLCckaG9zdCcsbnVsbCkiKSBvciBkaWUoJ2Vycm9yIDogJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrU3VjY2Vzcygic3RvcmFnZUZpbGVzP2lkPScgLiAkcGFnZWlkIC4gKChpc3NldCgkX0dFVFtzdGFydF0pKSA/ICgnJnN0YXJ0PScgLiAkX0dFVFtzdGFydF0pIDogJycpIC4gJyIsIk1ldGFEYXRhIFVwZGF0ZWQgU3VjY2Vzc2Z1bGx5ICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJGkrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXlzcWxpX2Nsb3NlKCRkYl9jb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgovL2ZvciBtb3ZlIG11bHRpIGZpbGVzCiAgICAgICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ21vdmVtdWx0aSddKSkgewogICAgICAgICAgICAgICAgJHRvID0gJF9QT1NUWydsYXN0TW92ZUlkJ107CiAgICAgICAgICAgICAgICAkbGV2ZWwgPSAkX1BPU1RbJ2xhc3RNb3ZlSWRMZXZlbCddOwogICAgICAgICAgICAgICAgJG11dGlJZCA9ICRfUE9TVFsnZG9jX2lkX3Ntb3ZlX211bHRpJ107CiAgICAgICAgICAgICAgICAkZG9jX2lkX3Ntb3ZlX211bHRpID0gZXhwbG9kZSgnLCcsICRtdXRpSWQpOwogICAgICAgICAgICAgICAgJG1vdmVUb1BhcmVudElkID0gJF9QT1NUWydtb3ZlVG9QYXJlbnRJZCddOwogICAgICAgICAgICAgICAgJHNsX2lkX21vdmUgPSAkX1BPU1RbJ3NsX2lkX21vdmVfbXVsdGknXTsKICAgICAgICAgICAgICAgICRsZW5ndGggPSBjb3VudCgkZG9jX2lkX3Ntb3ZlX211bHRpKTsKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkbW92ZVRvUGFyZW50SWQpICYmIGlzc2V0KCRkb2NfaWRfc21vdmVfbXVsdGkpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRvY19pZF9zbW92ZV9tdWx0aSBhcyAkZG9jX2lkX3Ntb3ZlX211bHRpcykgewogICAgICAgICAgICAgICAgICAgICAgICAkZnJvbV9tb3ZlRG9jTm0gPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCBvbGRfZG9jX25hbWUsZG9jX3BhdGggZnJvbSB0YmxfZG9jdW1lbnRfbWFzdGVyIHdoZXJlIGRvY19pZCBpbigkZG9jX2lkX3Ntb3ZlX211bHRpcykiKSBvciBkaWUoJ0Vycm9yJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRmcm9tX3J3TW92ZU5tID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRmcm9tX21vdmVEb2NObSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRmcm9tRG9jUGF0aCA9ICJleHRyYWN0LWhlcmUvIiAuICRmcm9tX3J3TW92ZU5tWydkb2NfcGF0aCddOwogICAgICAgICAgICAgICAgICAgICAgICAkdXBkYXRlTW92ZURvYyA9ICJ1cGRhdGUgdGJsX2RvY3VtZW50X21hc3RlciBzZXQgZG9jX25hbWUgPSAnJHRvJyB3aGVyZSBkb2NfaWQgPSckZG9jX2lkX3Ntb3ZlX211bHRpcyciOwogICAgICAgICAgICAgICAgICAgICAgICBteXNxbGlfcXVlcnkoJGRiX2NvbiwgJHVwZGF0ZU1vdmVEb2MpIG9yIGRpZSgnRXJyb3InIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgJG1vdmVEb2NObSA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0IG9sZF9kb2NfbmFtZSBmcm9tIHRibF9kb2N1bWVudF9tYXN0ZXIgd2hlcmUgZG9jX2lkIGluKCRkb2NfaWRfc21vdmVfbXVsdGlzKSIpIG9yIGRpZSgnRXJyb3InIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHJ3TW92ZU5tID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRtb3ZlRG9jTm0pOwogICAgICAgICAgICAgICAgICAgICAgICAkbW92ZXN0cmdlTm0gPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCBzbF9uYW1lIGZyb20gdGJsX3N0b3JhZ2VfbGV2ZWwgd2hlcmUgc2xfaWQgPSckdG8nIikgb3IgZGllKCdFcnJvcicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAkcndtb3Zlc3RyZ2VObSA9IG15c3FsaV9mZXRjaF9hc3NvYygkbW92ZXN0cmdlTm0pOwogICAgICAgICAgICAgICAgICAgICAgICAkZG9jX0VuY3J5cHRGaWxlID0gZXhwbG9kZSgnLycsICRmcm9tRG9jUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRkb2NfRW5jcnlwdF9ubSA9IGVuZCgkZG9jX0VuY3J5cHRGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGRpcl90byA9ICJleHRyYWN0LWhlcmUvIiAuICRyd21vdmVzdHJnZU5tWydzbF9uYW1lJ107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNfZGlyKCRkaXJfdG8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBta2RpcigkZGlyX3RvKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkZGlyID0gImV4dHJhY3QtaGVyZS8iIC4gJHJ3bW92ZXN0cmdlTm1bJ3NsX25hbWUnXTsKICAgICAgICAgICAgICAgICAgICAgICAgJGRvY19QYXRoX2NvcHlfdG8gPSAkZGlyIC4gIi8iIC4gJGRvY19FbmNyeXB0X25tOwogICAgICAgICAgICAgICAgICAgICAgICAkcGF0aEFycmF5ID0gZXhwbG9kZSgnLycsICRkb2NfUGF0aF9jb3B5X3RvKTsKICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfc2hpZnQoJHBhdGhBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRkYl9jb3B5X1BhdGhfdG8gPSBpbXBsb2RlKCcvJywgJHBhdGhBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkoJGZyb21Eb2NQYXRoLCAkZG9jX1BhdGhfY29weV90byk7CgogICAgICAgICAgICAgICAgICAgICAgICAkZGVzdGluYXRpb25QYXRoID0gJHJ3bW92ZXN0cmdlTm1bJ3NsX25hbWUnXSAuICcvJyAuICRkb2NfRW5jcnlwdF9ubTsKICAgICAgICAgICAgICAgICAgICAgICAgJHNvdXJjZVBhdGggPSAkZnJvbURvY1BhdGg7CgogICAgICAgICAgICAgICAgICAgICAgICAkdXBsb2FkSW5Ub0ZUUCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoRlRQX0VOQUJMRUQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnRwID0gbmV3IGZ0cCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmdHAtPmNvbm4oIiRmaWxlc2VydmVyIiwgIiRwb3J0IiwgIiRmdHBVc2VyIiwgIiRmdHBQd2QiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZ0cC0+Z2V0KCRzb3VyY2VQYXRoLCBST09UX0ZUUF9GT0xERVIgLiAnLycgLiAkZnJvbV9yd01vdmVObVsnZG9jX3BhdGgnXSkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVwbG9hZGZpbGUgPSAkZnRwLT5wdXQoUk9PVF9GVFBfRk9MREVSIC4gJy8nIC4gJGRlc3RpbmF0aW9uUGF0aCwgJHNvdXJjZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhcnIgPSAkZnRwLT5nZXRMb2dEYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR1cGxvYWRmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cGxvYWRJblRvRlRQID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZ0cC0+c2luZ2xlRmlsZURlbGV0ZShST09UX0ZUUF9GT0xERVIgLiAnLycgLiAkZnJvbV9yd01vdmVObVsnZG9jX3BhdGgnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGluaygkZnJvbURvY1BhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cGxvYWRJblRvRlRQID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxoMj5FcnJvcjo8L2gyPicgLiBpbXBsb2RlKCc8YnIgLz4nLCAkYXJyWydlcnJvciddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXBsb2FkSW5Ub0ZUUCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdXBsb2FkSW5Ub0ZUUCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15c3FsaV9xdWVyeSgkZGJfY29uLCAidXBkYXRlIHRibF9kb2N1bWVudF9tYXN0ZXIgc2V0IGRvY19wYXRoID0gJyRkYl9jb3B5X1BhdGhfdG8nIHdoZXJlIGRvY19pZCA9JyRkb2NfaWRfc21vdmVfbXVsdGlzJyIpIG9yIGRpZSgnRXJyb3InIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb2cgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImluc2VydCBpbnRvIHRibF9lemVlZmlsZV9sb2dzKGBpZGAsIGB1c2VyX2lkYCwgYHVzZXJfbmFtZWAsIGBncm91cF9pZGAsIGBzbF9pZGAsYGRvY19pZGAsIGBhY3Rpb25fbmFtZWAsIGBzdGFydF9kYXRlYCwgYGVuZF9kYXRlYCwgYHN5c3RlbV9pcGAsIGByZW1hcmtzYCkgdmFsdWVzIChudWxsLCAnJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF0nLCAnJF9TRVNTSU9OW2FkbWluX3VzZXJfbmFtZV0gJF9TRVNTSU9OW2FkbWluX3VzZXJfbGFzdF0nLG51bGwsJyR0bycsICckbXV0aUlkJywnJHJ3Rm9sZGVyW3NsX25hbWVdIFN0b3JhZ2UgRG9jdW1lbnQgJHJ3TW92ZU5tW29sZF9kb2NfbmFtZV0gbW92ZWQgdG8gU3RvcmFnZSAkcndtb3Zlc3RyZ2VObVtzbF9uYW1lXScsJyRkYXRlJyxudWxsLCckaG9zdCcsJycpIikgb3IgZGllKCdlcnJvciA6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsb2cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRtZXNzYWdlID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tTdWNjZXNzKCJzdG9yYWdlRmlsZXM/aWQ9JyAuICRwYWdlaWQgLiAoKGlzc2V0KCRfR0VUW3N0YXJ0XSkpID8gKCcmc3RhcnQ9JyAuICRfR0VUW3N0YXJ0XSkgOiAnJykgLiAnIiwiRmlsZXMgbW92ZWQgU3VjY2Vzc2Z1bGx5ICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrRmFpbGVkKCJzdG9yYWdlRmlsZXM/aWQ9JyAuICRwYWdlaWQgLiAoKGlzc2V0KCRfR0VUW3N0YXJ0XSkpID8gKCcmc3RhcnQ9JyAuICRfR0VUW3N0YXJ0XSkgOiAnJykgLiAnIiwiRmFpbGVkIHRvIG1vdmUgRmlsZXMgISIpOzwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXlzcWxpX2Nsb3NlKCRkYl9jb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgID8+CgogICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI3NlbGVjdF9hbGwiKS5jaGFuZ2UoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCIuZW1wX2NoZWNrYm94IikucHJvcCgiY2hlY2tlZCIsICQodGhpcykucHJvcCgiY2hlY2tlZCIpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy9FeHRyYXh0IENTViAKCiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGV4cG9ydFRhYmxlVG9DU1YoJHRhYmxlLCBmaWxlbmFtZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRyb3dzID0gJHRhYmxlLmZpbmQoJ3RyOmhhcyh0ZCksdHI6aGFzKHRoKScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyICRyb3dzID0gJHRhYmxlLmZpbHRlcigndHI6aGFzKDpjaGVja2JveDpjaGVja2VkKScpLmZpbmQoJ3RyOmhhcyh0ZCksdHI6aGFzKHRoKScpLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBDb2xEZWxpbSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJvd0RlbGltID0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xEZWxpbSA9ICciLCInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RlbGltID0gJyJcclxuIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N2ID0gJyInICsgJHJvd3MubWFwKGZ1bmN0aW9uIChpLCByb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRyb3cgPSAkKHJvdyksICRjb2xzID0gJHJvdy5maW5kKCd0ZCx0aCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGNvbHMubWFwKGZ1bmN0aW9uIChqLCBjb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkY29sID0gJChjb2wpLCB0ZXh0ID0gJGNvbC50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC8iL2csICciIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5nZXQoKS5qb2luKHRtcENvbERlbGltKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5nZXQoKS5qb2luKHRtcFJvd0RlbGltKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCh0bXBSb3dEZWxpbSkuam9pbihyb3dEZWxpbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQodG1wQ29sRGVsaW0pLmpvaW4oY29sRGVsaW0pICsgJyInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdkRhdGEgPSAnZGF0YTphcHBsaWNhdGlvbi9jc3Y7Y2hhcnNldD11dGYtOCwnICsgZW5jb2RlVVJJQ29tcG9uZW50KGNzdik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNzdik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihuZXcgQmxvYihbY3N2XSwge3R5cGU6ICJ0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTg7In0pLCAiY3N2bmFtZS5jc3YiKQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKHsnZG93bmxvYWQnOiBmaWxlbmFtZSwgJ2hyZWYnOiBjc3ZEYXRhLCAndGFyZ2V0JzogJ19ibGFuayd9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJCgiI2Rvd24iKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydFRhYmxlVG9DU1YuYXBwbHkodGhpcywgWyQoJyNob21lLXRhYmxlJyksICdkYXRhLmNzdiddKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgPCEtLSBTSEFSRSBTRUxFQ1RFRCBGSUxFUy0tLT4KICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsnc2hhcmVGaWxlcyddKSkgewogICAgICAgICAgICAgICAgJGZyb21Vc2VyID0gJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF07CiAgICAgICAgICAgICAgICAkVG9Vc2VyID0gJF9QT1NUWyd1c2VyaWQnXTsKICAgICAgICAgICAgICAgIC8vJFRvVXNlciA9IG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGRiX2NvbiwgJFRvVXNlcik7CiAgICAgICAgICAgICAgICAkZGF0ZSA9IGRhdGUoJ1ktbS1kIEg6aTpzJyk7CiAgICAgICAgICAgICAgICAkVG9Vc2VyID0gaW1wbG9kZSgiLCIsICRUb1VzZXIpOwogICAgICAgICAgICAgICAgJFRvVXNlciA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05LCBdLyIsICIiLCAkVG9Vc2VyKTsKICAgICAgICAgICAgICAgICRzaGFyZURvY0lkcyA9ICRfUE9TVFsnc2hhcmVGaWxlJ107CiAgICAgICAgICAgICAgICAkc2hhcmVEb2NJZHMgPSBleHBsb2RlKCcsJywgJHNoYXJlRG9jSWRzKTsKICAgICAgICAgICAgICAgICRteXVzZXIgPSBleHBsb2RlKCcsJywgJFRvVXNlcik7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkc2hhcmVEb2NJZHMgYXMgJHNoYXJlSWQpIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkbXl1c2VyIGFzICRteXVzZXJpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbXl1c2VyaWQgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSwgXS8iLCAiIiwgJG15dXNlcmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoa0RvY0lkID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9kb2N1bWVudF9zaGFyZSB3aGVyZSBkb2NfaWRzPSckc2hhcmVJZCcgYW5kIHRvX2lkcyA9JyRteXVzZXJpZCciKSBvciBkaWUoJ0Vycm9yIGluIGNoZWNrJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlzcWxpX251bV9yb3dzKCRjaGtEb2NJZCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvJzxzY3JpcHQ+dGFza0ZhaWxlZCgic3RvcmFnZUZpbGVzP2lkPScgLiAkcGFnZWlkIC4gJyIsIkRvY3VtZW50IEFscmVhZHkgU2hhcmVkICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaGFyZUZpbGVzID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJJTlNFUlQgSU5UTyBgdGJsX2RvY3VtZW50X3NoYXJlYChgZnJvbV9pZGAsIGB0b19pZHNgLCBgZG9jX2lkc2AsIGBkYXRlU2hhcmVgKSBWQUxVRVMgKCckZnJvbVVzZXInLCckbXl1c2VyaWQnLCckc2hhcmVJZCcsICckZGF0ZScpIikgb3IgZGllKCdFcnJvciBpbiBpbnNlcnQgc2hhcmUgZG9jdW1lbnQnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaGFyZURvY05tID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3Qgb2xkX2RvY19uYW1lIGZyb20gdGJsX2RvY3VtZW50X21hc3RlciB3aGVyZSBkb2NfaWQgPSAnJHNoYXJlSWQnIikgb3IgZGllKCdFcnJvciA6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJHJ3c2hhcmVEb2NObSA9IG15c3FsaV9mZXRjaF9hc3NvYygkc2hhcmVEb2NObSkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzaGFyZUZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb2cgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImluc2VydCBpbnRvIHRibF9lemVlZmlsZV9sb2dzKGBpZGAsIGB1c2VyX2lkYCwgYHVzZXJfbmFtZWAsIGBncm91cF9pZGAsIGBzbF9pZGAsIGBkb2NfaWRgLCBgYWN0aW9uX25hbWVgLCBgc3RhcnRfZGF0ZWAsIGBlbmRfZGF0ZWAsIGBzeXN0ZW1faXBgLCBgcmVtYXJrc2ApIHZhbHVlcyAobnVsbCwgJyRfU0VTU0lPTltjZGVzX3VzZXJfaWRdJywgJyRfU0VTU0lPTlthZG1pbl91c2VyX25hbWVdICRfU0VTU0lPTlthZG1pbl91c2VyX2xhc3RdJyxudWxsLG51bGwsICckc2hhcmVJZCcsICdTdG9yYWdlIERvY3VtZW50ICRyd3NoYXJlRG9jTm1bb2xkX2RvY19uYW1lXSBTaGFyZWQnLCckZGF0ZScsbnVsbCwnJGhvc3QnLG51bGwpIikgb3IgZGllKCdlcnJvciA6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGxvZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSAiWSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG1lc3NhZ2UgPT0gIlkiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tTdWNjZXNzKCJzdG9yYWdlRmlsZXM/aWQ9JyAuICRwYWdlaWQgLiAnIiwiRG9jdW1lbnQgc2hhcmVkIFN1Y2Nlc3NmdWxseSAhIik7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tGYWlsZWQoInN0b3JhZ2VGaWxlcz9pZD0nIC4gJHBhZ2VpZCAuICciLCJEb2N1bWVudCBub3Qgc2hhcmVkICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXlzcWxpX2Nsb3NlKCRkYl9jb24pOwogICAgICAgICAgICB9CgovLyBjb3B5IG11bHRpcGxlIGZpbGVzCiAgICAgICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ2NvcHlGaWxlcyddKSkgewogICAgICAgICAgICAgICAgJHRvID0gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTksIF0vIiwgIiIsICRfUE9TVFsnbGFzdE1vdmVJZCddKTsKICAgICAgICAgICAgICAgICR0byA9IG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGRiX2NvbiwgJHRvKTsKICAgICAgICAgICAgICAgICRsZXZlbCA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05LCBdLyIsICIiLCAkX1BPU1RbJ2xhc3RNb3ZlSWRMZXZlbCddKTsKICAgICAgICAgICAgICAgICRsZXZlbCA9IG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGRiX2NvbiwgJGxldmVsKTsKICAgICAgICAgICAgICAgICRkb2NfaWRzID0gcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTksIF0vIiwgIiIsICRfUE9TVFsnZG9jX2lkcyddKTsKICAgICAgICAgICAgICAgICRkb2NfaWRzID0gbXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkZGJfY29uLCAkZG9jX2lkcyk7CiAgICAgICAgICAgICAgICAkY29weVRvUGFyZW50SWQgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSwgXS8iLCAiIiwgJF9QT1NUWydjb3B5VG9QYXJlbnRJZCddKTsKICAgICAgICAgICAgICAgICRjb3B5VG9QYXJlbnRJZCA9IG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGRiX2NvbiwgJGNvcHlUb1BhcmVudElkKTsKICAgICAgICAgICAgICAgICRzbF9pZDQgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSwgXS8iLCAiIiwgJF9QT1NUWydzbF9pZDQnXSk7CiAgICAgICAgICAgICAgICAkc2xfaWQ0ID0gbXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkZGJfY29uLCAkc2xfaWQ0KTsKICAgICAgICAgICAgICAgICRtZXRhID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9tZXRhZGF0YV90b19zdG9yYWdlbGV2ZWwgd2hlcmUgc2xfaWQ9JyRzbF9pZDQnIik7IC8vPwogICAgICAgICAgICAgICAgLy9lY2hvICJzZWxlY3QgKiBmcm9tIHRibF9tZXRhZGF0YV90b19zdG9yYWdlbGV2ZWwgd2hlcmUgc2xfaWQ9JyRzbF9pZDQnIjsKICAgICAgICAgICAgICAgICRmZXRjaHJlc3VsdCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0YmxfZG9jdW1lbnRfbWFzdGVyIHdoZXJlIGRvY19pZCBpbigkZG9jX2lkcykgYW5kIGRvY19uYW1lPSckc2xfaWQ0JyIpOwogICAgICAgICAgICAgICAgJGNvcHlMYXN0c3RyZyA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0IHNsX25hbWUgZnJvbSB0Ymxfc3RvcmFnZV9sZXZlbCB3aGVyZSBzbF9pZCA9ICckdG8nIikgb3IgZGllKCdFcnJvciA6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAkcndjb3B5TGFzdHN0cmcgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGNvcHlMYXN0c3RyZyk7CiAgICAgICAgICAgICAgICAkcm93Y291bnQgPSBteXNxbGlfbnVtX3Jvd3MoJGZldGNocmVzdWx0KTsKCiAgICAgICAgICAgICAgICAkcm93bXVsdGlmaWVsZCA9IG15c3FsaV9mZXRjaF9maWVsZCgkZmV0Y2hyZXN1bHQpOwoKICAgICAgICAgICAgICAgIHdoaWxlICgkcm93bXVsdGljb3B5ID0gbXlzcWxpX2ZldGNoX2FycmF5KCRmZXRjaHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICAkZG9jX2V4dG4gPSAkcm93bXVsdGljb3B5Wydkb2NfZXh0biddOwogICAgICAgICAgICAgICAgICAgICRvbGRfZG9jX25hbWUgPSAkcm93bXVsdGljb3B5WydvbGRfZG9jX25hbWUnXTsKICAgICAgICAgICAgICAgICAgICAkZG9jX3BhdGggPSAiZXh0cmFjdC1oZXJlLyIgLiAkcm93bXVsdGljb3B5Wydkb2NfcGF0aCddOwogICAgICAgICAgICAgICAgICAgICR1cGxvYWRlZF9ieSA9ICRyb3dtdWx0aWNvcHlbJ3VwbG9hZGVkX2J5J107CiAgICAgICAgICAgICAgICAgICAgJGRvY19zaXplID0gJHJvd211bHRpY29weVsnZG9jX3NpemUnXTsKCiAgICAgICAgICAgICAgICAgICAgJGRvY19FbmNyeXB0RmlsZSA9IGV4cGxvZGUoJy8nLCAkZG9jX3BhdGgpOwogICAgICAgICAgICAgICAgICAgICRkb2NfRW5jcnlwdF9ubSA9IGVuZCgkZG9jX0VuY3J5cHRGaWxlKTsKICAgICAgICAgICAgICAgICAgICAkZGlyX3RvID0gImV4dHJhY3QtaGVyZS8iIC4gJHJ3Y29weUxhc3RzdHJnWydzbF9uYW1lJ107CgogICAgICAgICAgICAgICAgICAgIGlmICghaXNfZGlyKCRkaXJfdG8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1rZGlyKCRkaXJfdG8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkZGlyID0gImV4dHJhY3QtaGVyZS8iIC4gJHJ3Y29weUxhc3RzdHJnWydzbF9uYW1lJ107CgogICAgICAgICAgICAgICAgICAgICRkb2NfUGF0aF9jb3B5X3RvID0gJGRpciAuICIvIiAuICRkb2NfRW5jcnlwdF9ubTsKICAgICAgICAgICAgICAgICAgICAkcGF0aEFycmF5ID0gZXhwbG9kZSgnLycsICRkb2NfUGF0aF9jb3B5X3RvKTsKCiAgICAgICAgICAgICAgICAgICAgYXJyYXlfc2hpZnQoJHBhdGhBcnJheSk7CgogICAgICAgICAgICAgICAgICAgICRkYl9jb3B5X1BhdGhfdG8gPSBpbXBsb2RlKCcvJywgJHBhdGhBcnJheSk7CgogICAgICAgICAgICAgICAgICAgIGNvcHkoJGRvY19wYXRoLCAkZG9jX1BhdGhfY29weV90byk7CiAgICAgICAgICAgICAgICAgICAgJHVwbG9hZEluVG9GVFAgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoRlRQX0VOQUJMRUQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRmdHAgPSBuZXcgZnRwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRmdHAtPmNvbm4oIiRmaWxlc2VydmVyIiwgIiRwb3J0IiwgIiRmdHBVc2VyIiwgIiRmdHBQd2QiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmdHAtPmdldCgkZG9jX3BhdGgsIFJPT1RfRlRQX0ZPTERFUiAuICcvJyAuICRyb3dtdWx0aWNvcHlbJ2RvY19wYXRoJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsZXBhdGggPSAkcndjb3B5TGFzdHN0cmdbJ3NsX25hbWUnXSAuICcvJyAuICRkb2NfRW5jcnlwdF9ubTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cGxvYWRmaWxlID0gJGZ0cC0+cHV0KFJPT1RfRlRQX0ZPTERFUiAuICcvJyAuICRmaWxlcGF0aCwgJGRvY19wYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhcnIgPSAkZnRwLT5nZXRMb2dEYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHVwbG9hZGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXBsb2FkSW5Ub0ZUUCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKCRkb2NfcGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cGxvYWRJblRvRlRQID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRhcnJbJ2Vycm9yJ10gIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPGgyPkVycm9yOjwvaDI+JyAuIGltcGxvZGUoJzxiciAvPicsICRhcnJbJ2Vycm9yJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cGxvYWRJblRvRlRQID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGFyclsnZXJyb3InXSAhPSAiIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxoMj5FcnJvcjo8L2gyPicgLiBpbXBsb2RlKCc8YnIgLz4nLCAkYXJyWydlcnJvciddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR1cGxvYWRJblRvRlRQID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICgkdXBsb2FkSW5Ub0ZUUCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgJHNxbDIgPSAiSU5TRVJUIElOVE8gdGJsX2RvY3VtZW50X21hc3RlciBTRVQiOwogICAgICAgICAgICAgICAgICAgICAgICAkc3FsMiAuPSAiIGRvY19uYW1lPSckdG8nLG9sZF9kb2NfbmFtZT0nJG9sZF9kb2NfbmFtZScsZG9jX2V4dG49JyRkb2NfZXh0bicsZG9jX3BhdGg9JyRkYl9jb3B5X1BhdGhfdG8nLHVwbG9hZGVkX2J5PSckdXBsb2FkZWRfYnknLGRvY19zaXplPSckZG9jX3NpemUnLGRhdGVwb3N0ZWQ9JyRyb3dtdWx0aWNvcHlbZGF0ZXBvc3RlZF0nLG5vb2ZwYWdlcz0nJHJvd211bHRpY29weVtub29mcGFnZXNdJywgc3RvcmFnZV9mbGFnPScxJyI7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcndNZXRhID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRtZXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1ldGFuID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgZmllbGRfbmFtZSBmcm9tIHRibF9tZXRhZGF0YV9tYXN0ZXIgd2hlcmUgaWQ9JyRyd01ldGFbbWV0YWRhdGFfaWRdJyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJ3TWV0YW4gPSBteXNxbGlfZmV0Y2hfYXNzb2MoJG1ldGFuKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmllbGQgPSAkcndNZXRhblsnZmllbGRfbmFtZSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJHJvd211bHRpY29weVskZmllbGRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbDIgLj0gIiwkZmllbGQ9JyR2YWx1ZSciOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkbXVsdGljb3B5aW5zZXJ0ID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICRzcWwyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRtdWx0aWNvcHlpbnNlcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb2cgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImluc2VydCBpbnRvIHRibF9lemVlZmlsZV9sb2dzKGBpZGAsIGB1c2VyX2lkYCwgYHVzZXJfbmFtZWAsIGBncm91cF9pZGAsIGBzbF9pZGAsIGBkb2NfaWRgLGBhY3Rpb25fbmFtZWAsIGBzdGFydF9kYXRlYCwgYGVuZF9kYXRlYCwgYHN5c3RlbV9pcGAsIGByZW1hcmtzYCkgdmFsdWVzIChudWxsLCAnJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF0nLCAnJF9TRVNTSU9OW2FkbWluX3VzZXJfbmFtZV0gJF9TRVNTSU9OW2FkbWluX3VzZXJfbGFzdF0nLG51bGwsJyR0bycsICckcm93bXVsdGljb3B5W2RvY19pZF0nLCdTdG9yYWdlIGRvY3VtZW50ICRvbGRfZG9jX25hbWUgY29weSB0byBTdG9yYWdlICRyd2NvcHlMYXN0c3RyZ1tzbF9uYW1lXS4nLCckZGF0ZScsbnVsbCwnJGhvc3QnLCcnKSIpIG9yIGRpZSgnRXJyb3IgREI6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsb2cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSA9ICJ5ZXMiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSAibm8iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJG1lc3NhZ2UgPT0gInllcyIpIHsKCiAgICAgICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tTdWNjZXNzKCJzdG9yYWdlRmlsZXM/aWQ9JyAuICRwYWdlaWQgLiAnIiwiRG9jdW1lbnQgQ29weSBTdWNjZXNzZnVsbHkgISIpOzwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgICAgICBlY2hvJzxzY3JpcHQ+dGFza0ZhaWwoInN0b3JhZ2VGaWxlcz9pZD0nIC4gJHBhZ2VpZCAuICciLCJEb2N1bWVudCBub3QgY29waWVkLiIpOzwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteXNxbGlfY2xvc2UoJGRiX2Nvbik7CiAgICAgICAgICAgIH0KLy9CdWxrIERvd25sb2FkCiAgICAgICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ2J1bGtEb3dubG9hZCddKSkgewogICAgICAgICAgICAgICAgJHJhZCA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05LCBdLyIsICIiLCAkX1BPU1RbJ3JhZGR3biddKTsKICAgICAgICAgICAgICAgICRyYWQgPSBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRkYl9jb24sICRyYWQpOwogICAgICAgICAgICAgICAgJHNsaWQgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSwgXS8iLCAiIiwgJF9QT1NUWydzbGlkJ10pOwogICAgICAgICAgICAgICAgJHNsaWQgPSBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRkYl9jb24sICRzbGlkKTsKICAgICAgICAgICAgICAgICRyZWFzb24gPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSwgXS8iLCAiIiwgJF9QT1NUWydyZWFzb24nXSk7CiAgICAgICAgICAgICAgICAkcmVhc29uID0gbXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkZGJfY29uLCAkcmVhc29uKTsKICAgICAgICAgICAgICAgICRhcmNoaXZlX2ZpbGVfbmFtZSA9ICRzbE5hbWUgLiAnLnppcCc7CiAgICAgICAgICAgICAgICAkZG93bmxvYWQgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCBkb2NfcGF0aCxvbGRfZG9jX25hbWUsZG9jX2V4dG4sZG9jX2lkIGZyb20gdGJsX2RvY3VtZW50X21hc3RlciB3aGVyZSBkb2NfbmFtZT0nJHNsaWQnIGFuZCBmbGFnX211bHRpZGVsZXRlPTEiKTsgLy8gb3IgZGllKCdFcnJvcicubXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICR6aXAgPSBuZXcgWmlwQXJjaGl2ZSgpOwogICAgICAgICAgICAgICAgLy9jcmVhdGUgdGhlIGZpbGUgYW5kIHRocm93IHRoZSBlcnJvciBpZiB1bnN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgIGlmICgkemlwLT5vcGVuKCRhcmNoaXZlX2ZpbGVfbmFtZSwgWklQQVJDSElWRTo6Q1JFQVRFKSAhPT0gVFJVRSkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoImNhbm5vdCBvcGVuIDwkYXJjaGl2ZV9maWxlX25hbWU+XG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR6aXBwZWRGaWxlUGF0aCA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICB3aGlsZSAoJHJvdyA9IG15c3FsaV9mZXRjaF9hc3NvYygkZG93bmxvYWQpKSB7CiAgICAgICAgICAgICAgICAgICAgJGRvY1BhdGggPSAkcm93Wydkb2NfcGF0aCddOwogICAgICAgICAgICAgICAgICAgICRmaWxlX3BhdGggPSAnZXh0cmFjdC1oZXJlLycgLiBzdWJzdHIoJGRvY1BhdGgsIDAsIHN0cnJwb3MoJGRvY1BhdGgsICIvIikgKyAxKTsKICAgICAgICAgICAgICAgICAgICAkZmlsZXMgPSBzdWJzdHIoJGRvY1BhdGgsIHN0cnJwb3MoJGRvY1BhdGgsICIvIikgKyAxKTsKICAgICAgICAgICAgICAgICAgICAkY29tcF9mb2xkZXIgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCBzbF9uYW1lIGZyb20gdGJsX3N0b3JhZ2VfbGV2ZWwgd2hlcmUgc2xfaWQgPSAnJHNsaWQnIikgb3IgZGllKCdFcnJvciA6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgJHJ3Zm9sZGVyID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRjb21wX2ZvbGRlcik7CgogICAgICAgICAgICAgICAgICAgICRmaWxlMSA9ICRyb3dbJ29sZF9kb2NfbmFtZSddIC4gJy4nIC4gJHJvd1snZG9jX2V4dG4nXTsKICAgICAgICAgICAgICAgICAgICBpZiAoRlRQX0VOQUJMRUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGZ0cCA9IG5ldyBmdHAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGZ0cC0+Y29ubigiJGZpbGVzZXJ2ZXIiLCAiJHBvcnQiLCAiJGZ0cFVzZXIiLCAiJGZ0cFB3ZCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmdHAtPmdldCgnZXh0cmFjdC1oZXJlLycgLiAkZG9jUGF0aCwgUk9PVF9GVFBfRk9MREVSIC4gJy8nIC4gJGRvY1BhdGgpKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR6aXAtPmFkZEZpbGUoJGZpbGVfcGF0aCAuICRmaWxlcywgJGZpbGUxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdW5saW5rKCdleHRyYWN0LWhlcmUvJyAuJGRvY1BhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXBwZWRGaWxlUGF0aFtdID0gJ2V4dHJhY3QtaGVyZS8nIC4gJGRvY1BhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXJyID0gJGZ0cC0+Z2V0TG9nRGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+YWRkRmlsZSgkZmlsZV9wYXRoIC4gJGZpbGVzLCAkZmlsZTEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkemlwLT5jbG9zZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEZUUF9FTkFCTEVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR6aXBwZWRGaWxlUGF0aCBhcyAka2V5ID0+ICR2YWx1ZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGluaygkemlwcGVkRmlsZVBhdGhbJGtleV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy90aGVuIHNlbmQgdGhlIGhlYWRlcnMgdG8gZm9jZSBkb3dubG9hZCB0aGUgemlwIGZpbGUKICAgICAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi96aXAiKTsKICAgICAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9JGFyY2hpdmVfZmlsZV9uYW1lIik7CiAgICAgICAgICAgICAgICAkbG9nID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJpbnNlcnQgaW50byB0YmxfZXplZWZpbGVfbG9ncyhgaWRgLCBgdXNlcl9pZGAsIGB1c2VyX25hbWVgLCBgZ3JvdXBfaWRgLCBgc2xfaWRgLCBgZG9jX2lkYCxgYWN0aW9uX25hbWVgLCBgc3RhcnRfZGF0ZWAsIGBlbmRfZGF0ZWAsIGBzeXN0ZW1faXBgLCBgcmVtYXJrc2ApIHZhbHVlcyAobnVsbCwgJyRfU0VTU0lPTltjZGVzX3VzZXJfaWRdJywgJyRfU0VTU0lPTlthZG1pbl91c2VyX25hbWVdICRfU0VTU0lPTlthZG1pbl91c2VyX2xhc3RdJyxudWxsLCckc2xpZCcsICckcm93W2RvY19pZF0nLCdTdG9yYWdlIGRvY3VtZW50ICRvbGRfZG9jX25hbWUgY29tcHJlc3MgdG8gU3RvcmFnZSAkcndmb2xkZXJbc2xfbmFtZV0gd2l0aCAkcm93W29sZF9kb2NfbmFtZV0uJywnJGRhdGUnLG51bGwsJyRob3N0JywnJHJlYXNvbicpIikgb3IgZGllKCdlcnJvciA6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgaGVhZGVyKCJQcmFnbWE6IG5vLWNhY2hlIik7CiAgICAgICAgICAgICAgICBoZWFkZXIoIkV4cGlyZXM6IDAiKTsKICAgICAgICAgICAgICAgIHJlYWRmaWxlKCIkYXJjaGl2ZV9maWxlX25hbWUiKTsKICAgICAgICAgICAgICAgIHVubGluaygkYXJjaGl2ZV9maWxlX25hbWUpOwogICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgIG15c3FsaV9jbG9zZSgkZGJfY29uKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsndXBkYXRlRG9jJ10pKSB7CgogICAgICAgICAgICAgICAgJHVzZXJfaWQgPSAkX1NFU1NJT05bJ2NkZXNfdXNlcl9pZCddOwogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkX0ZJTEVTWydmaWxlTmFtZSddWyduYW1lJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJGRvY19pZCA9ICRfUE9TVFsnZG9jaWQnXTsKICAgICAgICAgICAgICAgICAgICAkZmlsZV9uYW1lID0gJF9GSUxFU1snZmlsZU5hbWUnXVsnbmFtZSddOwogICAgICAgICAgICAgICAgICAgICRmaWxlX3NpemUgPSAkX0ZJTEVTWydmaWxlTmFtZSddWydzaXplJ107CiAgICAgICAgICAgICAgICAgICAgJGZpbGVfdHlwZSA9ICRfRklMRVNbJ2ZpbGVOYW1lJ11bJ3R5cGUnXTsKICAgICAgICAgICAgICAgICAgICAkZmlsZV90bXAgPSAkX0ZJTEVTWydmaWxlTmFtZSddWyd0bXBfbmFtZSddOwogICAgICAgICAgICAgICAgICAgICRwYWdlQ291bnQgPSAkX1BPU1RbJ3BhZ2VDb3VudCddOwogICAgICAgICAgICAgICAgICAgIGlmICgkcGFnZUNvdW50IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHBhZ2VDb3VudCA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRleHRuID0gc3Vic3RyKCRmaWxlX25hbWUsIHN0cnJwb3MoJGZpbGVfbmFtZSwgJy4nKSArIDEpOwogICAgICAgICAgICAgICAgICAgICRmbmFtZSA9IHN1YnN0cigkZmlsZV9uYW1lLCAwLCBzdHJycG9zKCRmaWxlX25hbWUsICcuJykpOwoKICAgICAgICAgICAgICAgICAgICAkZmlsZUV4dG4gPSBzdWJzdHIoJGZpbGVfbmFtZSwgc3RycnBvcygkZmlsZV9uYW1lLCAiLiIpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgJGdldERvY05hbWUgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX2RvY3VtZW50X21hc3RlciB3aGVyZSBkb2NfaWQgPSAnJGRvY19pZCciKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgICAgICAgICAgICAgICRyd2dldERvY05hbWUgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGdldERvY05hbWUpOwogICAgICAgICAgICAgICAgICAgICRkb2NOYW1lID0gJHJ3Z2V0RG9jTmFtZVsnZG9jX25hbWUnXTsKICAgICAgICAgICAgICAgICAgICAvLyRkb2NOYW1lID0gZXhwbG9kZSgiXyIsICRkb2NOYW1lKTsKICAgICAgICAgICAgICAgICAgICAkb2xkX2ZpbGVfbmFtZSA9ICRyd2dldERvY05hbWVbJ29sZF9kb2NfbmFtZSddOwogICAgICAgICAgICAgICAgICAgICRvbGRleHRuID0gc3Vic3RyKCRvbGRfZmlsZV9uYW1lLCBzdHJycG9zKCRvbGRfZmlsZV9uYW1lLCAnLicpICsgMSk7IC8vIG9sZCBmaWxlIGV4dG4KICAgICAgICAgICAgICAgICAgICAkb2xkZm5hbWUgPSBzdWJzdHIoJG9sZF9maWxlX25hbWUsIDAsIHN0cnJwb3MoJG9sZF9maWxlX25hbWUsICcuJykpOyAvLyBvbGQgZmlsZSBuYW1lCgogICAgICAgICAgICAgICAgICAgICR1cGRhdGVEb2NOYW1lID0gJGRvY05hbWUgLiAnXycgLiAkZG9jX2lkOyAvL3N0b3JhZ2UgaWQgZm9sbG93ZWQgYnkgZG9jIGlkCiAgICAgICAgICAgICAgICAgICAgJGNoZWtGaWxlVmVyc2lvbiA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiU0VMRUNUICogRlJPTSBgdGJsX2RvY3VtZW50X21hc3RlcmAgV0hFUkUgZmluZF9pbl9zZXQoJyR1cGRhdGVEb2NOYW1lJywgZG9jX25hbWUpIikgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAkZmxWZXJzaW9uID0gbXlzcWxpX251bV9yb3dzKCRjaGVrRmlsZVZlcnNpb24pOwogICAgICAgICAgICAgICAgICAgICRmbFZlcnNpb24gPSAkZmxWZXJzaW9uICsgMTsKICAgICAgICAgICAgICAgICAgICAkbmZpbGVuYW1lID0gJG9sZGZuYW1lIC4gJ18nIC4gJGZsVmVyc2lvbjsKCiAgICAgICAgICAgICAgICAgICAgJHN0cmdOYW1lID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkID0gJyRkb2NOYW1lJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgJHJ3c3RyZ05hbWUgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHN0cmdOYW1lKTsKICAgICAgICAgICAgICAgICAgICAkc3RvcmFnZU5hbWUgPSAkcndzdHJnTmFtZVsnc2xfbmFtZSddOwogICAgICAgICAgICAgICAgICAgICRzdG9yYWdlTmFtZSA9IHN0cl9yZXBsYWNlKCIgIiwgIiIsICRzdG9yYWdlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgJHN0b3JhZ2VOYW1lID0gcHJlZ19yZXBsYWNlKCcvW15BLVphLXowLTlcLV0vJywgJycsICRzdG9yYWdlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgJHVwbG9hZGRpciA9ICJleHRyYWN0LWhlcmUvIiAuICRzdG9yYWdlTmFtZSAuICcvJzsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2RpcigkdXBsb2FkZGlyKSkgewogICAgICAgICAgICAgICAgICAgICAgICBta2RpcigkdXBsb2FkZGlyLCA3NzcsIFRSVUUpIG9yIGRpZShwcmludF9yKGVycm9yX2dldF9sYXN0KCkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJG5maWxlbmFtZSA9IHByZWdfcmVwbGFjZSgnL1teQS1aYS16MC05X1wtXS8nLCAnJywgJG5maWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgLy8gJGZpbGVuYW1lRW5jdD0kZm5hbWUuJy4nLiRleHRuOy8vIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRmbmFtZSkpLicuJy4kZXh0bjsKICAgICAgICAgICAgICAgICAgICAkZmlsZW5hbWVFbmN0ID0gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJG5maWxlbmFtZSkpOwogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZUVuY3QgPSBwcmVnX3JlcGxhY2UoJy9bXkEtWmEtejAtOV9cLV0vJywgJycsICRmaWxlbmFtZUVuY3QpOwogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZUVuY3QgPSAkZmlsZW5hbWVFbmN0IC4gJy4nIC4gJGV4dG47CiAgICAgICAgICAgICAgICAgICAgJGZpbGVuYW1lRW5jdCA9IHRpbWUoKSAuICRmaWxlbmFtZUVuY3Q7CgogICAgICAgICAgICAgICAgICAgIC8vICAkaW1hZ2VfcGF0aCA9ICJpbWFnZXMvIiAuICRmaWxlX25hbWU7CiAgICAgICAgICAgICAgICAgICAgJHVwbG9hZGRpciA9ICR1cGxvYWRkaXIgLiAkZmlsZW5hbWVFbmN0OwogICAgICAgICAgICAgICAgICAgICR1cGxvYWQgPSBtb3ZlX3VwbG9hZGVkX2ZpbGUoJGZpbGVfdG1wLCAkdXBsb2FkZGlyKSBvciBkaWUocHJpbnRfcihlcnJvcl9nZXRfbGFzdCgpKSk7CgogICAgICAgICAgICAgICAgICAgICR1cGxvYWRJblRvRlRQID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR1cGxvYWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZUUF9FTkFCTEVEKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZ0cCA9IG5ldyBmdHAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmdHAtPmNvbm4oIiRmaWxlc2VydmVyIiwgIiRwb3J0IiwgIiRmdHBVc2VyIiwgIiRmdHBQd2QiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsZXBhdGggPSAkc3RvcmFnZU5hbWUgLiAnLycgLiAkZmlsZW5hbWVFbmN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVwbG9hZGZpbGUgPSAkZnRwLT5wdXQoUk9PVF9GVFBfRk9MREVSIC4gJy8nIC4gJGZpbGVwYXRoLCAkdXBsb2FkZGlyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhcnIgPSAkZnRwLT5nZXRMb2dEYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHVwbG9hZGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXBsb2FkSW5Ub0ZUUCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKCR1cGxvYWRkaXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXBsb2FkSW5Ub0ZUUCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYXJyWydlcnJvciddICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxoMj5FcnJvcjo8L2gyPicgLiBpbXBsb2RlKCc8YnIgLz4nLCAkYXJyWydlcnJvciddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXBsb2FkSW5Ub0ZUUCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICgkdXBsb2FkSW5Ub0ZUUCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbHMgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbHVtbnMgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgIlNIT1cgQ09MVU1OUyBGUk9NIHRibF9kb2N1bWVudF9tYXN0ZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRyd0NvbHMgPSBteXNxbGlfZmV0Y2hfYXJyYXkoJGNvbHVtbnMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJ3Q29sc1snRmllbGQnXSAhPSAnZG9jX2lkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkY29scykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbHMgPSAnYCcgLiAkcndDb2xzWydGaWVsZCddIC4gJ2AnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2xzID0gJGNvbHMgLiAnLGAnIC4gJHJ3Q29sc1snRmllbGQnXSAuICdgJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGNyZWF0ZVZyc24gPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgIklOU0VSVCBJTlRPIHRibF9kb2N1bWVudF9tYXN0ZXIoJGNvbHMpIHNlbGVjdCAkY29scyBmcm9tIHRibF9kb2N1bWVudF9tYXN0ZXIgd2hlcmUgZG9jX2lkPSckZG9jX2lkJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRpbnNlcnREb2NJRCA9IG15c3FsaV9pbnNlcnRfaWQoJGRiX2Nvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICRsb2cgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImluc2VydCBpbnRvIHRibF9lemVlZmlsZV9sb2dzKGBpZGAsIGB1c2VyX2lkYCwgYHVzZXJfbmFtZWAsIGBncm91cF9pZGAsIGBzbF9pZGAsIGBhY3Rpb25fbmFtZWAsIGBzdGFydF9kYXRlYCwgYGVuZF9kYXRlYCwgYHN5c3RlbV9pcGAsIGByZW1hcmtzYCkgdmFsdWVzIChudWxsLCAnJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF0nLCAnJF9TRVNTSU9OW2FkbWluX3VzZXJfbmFtZV0gJF9TRVNTSU9OW2FkbWluX3VzZXJfbGFzdF0nLG51bGwsbnVsbCwnVmVyc2lvbmluZyBEb2N1bWVudCAkZmlsZV9uYW1lIEFkZGVkJywnJGRhdGUnLG51bGwsJyRob3N0JyxudWxsKSIpIG9yIGRpZSgnZXJyb3IgbG9nMjogJyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY3JlYXRlVnJzbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVwZGF0ZU5ldyA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAidXBkYXRlIHRibF9kb2N1bWVudF9tYXN0ZXIgc2V0IGRvY19uYW1lPSckdXBkYXRlRG9jTmFtZScgd2hlcmUgZG9jX2lkPSckaW5zZXJ0RG9jSUQnIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXBkYXRlT2xkID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJ1cGRhdGUgdGJsX2RvY3VtZW50X21hc3RlciBzZXQgb2xkX2RvY19uYW1lPSckZmlsZV9uYW1lJyxmaWxlbmFtZT0nJGZuYW1lJywgZG9jX2V4dG49JyRleHRuJywgZG9jX3BhdGg9JyRzdG9yYWdlTmFtZS8kZmlsZW5hbWVFbmN0JywgdXBsb2FkZWRfYnk9JyR1c2VyX2lkJywgZG9jX3NpemU9JyRmaWxlX3NpemUnLCBub29mcGFnZXM9JyRwYWdlQ291bnQnLCBkYXRlcG9zdGVkPSckZGF0ZScgd2hlcmUgZG9jX2lkPSckZG9jX2lkJyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tTdWNjZXNzKCInIC4gYmFzZW5hbWUoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIC4gJyIsIlVwZGF0ZWQgU3VjY2Vzc2Z1bGx5ICEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnRhc2tGYWlsKCInIC4gYmFzZW5hbWUoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIC4gJyIsIkRvY3VtZW50IG5vdCB1cGRhdGVkLiIpOzwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNzZXQoJF9QT1NUWydzaGFyZUZvbGRlciddKSkgewogICAgICAgICAgICAgICAgLy8gcHJpbnRfcigkX1BPU1QpOwogICAgICAgICAgICAgICAgJHNoYXJld2l0aFVzZXJzID0gJF9QT1NUWydzaGFyZXdpdGgnXTsKICAgICAgICAgICAgICAgICRzaGFyZXdpdGggPSBpbXBsb2RlKCcsJywgJHNoYXJld2l0aFVzZXJzKTsKICAgICAgICAgICAgICAgICRzbElkID0gJF9QT1NUWydzbElkJ107CiAgICAgICAgICAgICAgICAkc2hhcmVieSA9ICRfU0VTU0lPTlsnY2Rlc191c2VyX2lkJ107CgogICAgICAgICAgICAgICAgZm9yICgkayA9IDA7ICRrIDwgY291bnQoJHNoYXJld2l0aFVzZXJzKTsgJGsrKykgewoKICAgICAgICAgICAgICAgICAgICAkY2hlY2sgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX2ZvbGRlcl9zaGFyZSB3aGVyZSBzaGFyZV93aXRoPSckc2hhcmV3aXRoVXNlcnNbJGtdJyBhbmQgc2xJZD0nJHNsSWQnIilvciBkaWUoJ0Vycm9yIDonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICBpZiAobXlzcWxpX251bV9yb3dzKCRjaGVjaykgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrRmFpbGVkKCInIC4gYmFzZW5hbWUoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIC4gJyIsIkZvbGRlciBTaGFyZSBGYWlsZWQgISIpOzwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiSU5TRVJUIElOVE8gdGJsX2ZvbGRlcl9zaGFyZSAoc2xJZCwgc2hhcmVfd2l0aCwgc2hhcmVfYnkpIHZhbHVlcygnJHNsSWQnLCAnJHNoYXJld2l0aFVzZXJzWyRrXScsICckc2hhcmVieScpIilvciBkaWUoJ0Vycm9yIDonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzcWwpIHsKCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb2cgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgImluc2VydCBpbnRvIHRibF9lemVlZmlsZV9sb2dzKGBpZGAsIGB1c2VyX2lkYCwgYHVzZXJfbmFtZWAsIGBncm91cF9pZGAsIGBzbF9pZGAsIGBkb2NfaWRgLGBhY3Rpb25fbmFtZWAsIGBzdGFydF9kYXRlYCwgYGVuZF9kYXRlYCwgYHN5c3RlbV9pcGAsIGByZW1hcmtzYCkgdmFsdWVzIChudWxsLCAnJF9TRVNTSU9OW2NkZXNfdXNlcl9pZF0nLCAnJF9TRVNTSU9OW2FkbWluX3VzZXJfbmFtZV0gJF9TRVNTSU9OW2FkbWluX3VzZXJfbGFzdF0nLG51bGwsJyRzbGlkJywgTlVMTCwnU2hhcmUgJHJ3Zm9sZGVyW3NsX25hbWVdLiBzdG9yYWdlJywnJGRhdGUnLG51bGwsJyRob3N0JyxOVUxMKSIpIG9yIGRpZSgnZXJyb3IgOiAnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGVja1BhcmVudCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0IHNsX3BhcmVudF9pZCBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkPSckc2xJZCciKTsKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJvd1AgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrUGFyZW50KTsKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmVudElkID0gJHJvd1BbJ3NsX3BhcmVudF9pZCddOwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoZWNrUGVybWlzc2lvbiA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0Ymxfc3RvcmFnZWxldmVsX3RvX3Blcm1pc3Npb24gd2hlcmUgdXNlcl9pZD0nJHNoYXJld2l0aFVzZXJzWyRrXScgYW5kIChzbF9pZD0nJHNsSWQnIG9yIHNsX2lkPSckcGFyZW50SWQnKSIpOyAgCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9sZGVyUGVybWlzc2lvbigkZGJfY29uLCAkc2hhcmV3aXRoVXNlcnNbJGtdLCAkc2xJZCkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNsaW5zID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJpbnNlcnQgaW50byB0Ymxfc3RvcmFnZWxldmVsX3RvX3Blcm1pc3Npb24odXNlcl9pZCxzbF9pZCwgc2hhcmVkKSB2YWx1ZXMoJyRzaGFyZXdpdGhVc2Vyc1ska10nLCckc2xJZCcsICcxJykiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kcmVzdWx0ID0gIG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0IHNsX3BhcmVudF9pZCBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX3BhcmVudF9pZD0nJHNsSWQnIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrU3VjY2VzcygiJyAuIGJhc2VuYW1lKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuICciLCJGb2xkZXIgc2hhcmVkIHN1Y2Nlc3NmdWxseS4iKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBjaGVja0ZvbGRlclBlcm1pc3Npb24oJGRiX2NvbiwgJHVzZXJJZCwgJHNsSWQpIHsKCgogICAgICAgICAgICAgICAgJHJlc3VsdDEgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX3N0b3JhZ2VsZXZlbF90b19wZXJtaXNzaW9uIHdoZXJlIHVzZXJfaWQ9JyR1c2VySWQnIGFuZCBzbF9pZD0nJHNsSWQnIik7CiAgICAgICAgICAgICAgICBpZiAobXlzcWxpX251bV9yb3dzKCRyZXN1bHQxKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX3N0b3JhZ2VsZXZlbF90b19wZXJtaXNzaW9uIHdoZXJlIHVzZXJfaWQ9JyR1c2VySWQnIik7CiAgICAgICAgICAgICAgICAgICAgJHNsQXJyYXkgPSBhcnJheSgpOwoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJHJvd1AgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHJlc3VsdCkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRjaGVja1Blcm1pc3Npb24gPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCBzbF9wYXJlbnRfaWQgZnJvbSB0Ymxfc3RvcmFnZV9sZXZlbCB3aGVyZSBzbF9wYXJlbnRfaWQgPSciIC4gJHJvd1BbJ3NsX2lkJ10gLiAiJyBhbmQgc2xfaWQ9JyRzbElkJyIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlzcWxpX251bV9yb3dzKCRjaGVja1Blcm1pc3Npb24pID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNsQXJyYXlbXSA9ICRyb3dQWydzbF9pZCddOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHByaW50X3IoJHNsQXJyYXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCgkc2xBcnJheSkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgPz4KICAgICAgICAgICAgPCEtLSBmb3IgYWRkIGFuZCBzZWFyY2ggbWV0YURhdGEtLS0+IAogICAgICAgICAgICA8c2NyaXB0PgoKICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWF4X2ZpZWxkcyA9IDw/PSAkbWV0YWRhdGFjb3VudDsgPz47IC8vbWF4aW11bSBpbnB1dCBib3hlcyBhbGxvd2VkCiAgICAgICAgICAgICAgICAgICAgdmFyIHdyYXBwZXIgPSAkKCIuY29udGVudHMiKTsgLy9GaWVsZHMgd3JhcHBlcgogICAgICAgICAgICAgICAgICAgIHZhciBhZGRfYnV0dG9uID0gJCgiI2FkZGZpZWxkcyIpOyAvL0FkZCBidXR0b24gSUQKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPTw/PSAkc2xpZCA/PjsKICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IDE7IC8vaW5pdGxhbCB0ZXh0IGJveCBjb3VudAogICAgICAgICAgICAgICAgICAgICQoYWRkX2J1dHRvbikuY2xpY2soZnVuY3Rpb24gKGUpIHsgLy9vbiBhZGQgaW5wdXQgYnV0dG9uIGNsaWNrCiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPCBtYXhfZmllbGRzKSB7IC8vbWF4IGlucHV0IGJveCBhbGxvd2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RleHQgYm94IGluY3JlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5hamF4KHt1cmw6ICJhcHBsaWNhdGlvbi9hamF4L2FkZE11bHRpcGxlTWVhdGFEdGFTZWFyY2g/aWQ9IiArIGlkICsgIiZzdGF0dXM9ZmlsZSIsIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3cmFwcGVyKS5hcHBlbmQoIjxkaXYgY2xhc3M9J2NvbC1sZy0xMicgc3R5bGU9J21hcmdpbi1ib3R0b206MTdweCc+IiArIHJlc3VsdCArICI8YnV0dG9uIGNsYXNzPSdyZW1vdmVfZmllbGQgYnRuIGJ0bi1wcmltYXJ5Jz48aSBjbGFzcz0nZmEgZmEtbWludXMtY2lyY2xlJyBhcmlhLWhpZGRlbj0ndHJ1ZSc+PC9pPjwvYT4iICsgIjwvZGl2PiIpOyAvL2FkZCBpbnB1dCBib3gKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KCJOby4gTW9yZSBtZXRhIGRhdGEgYXZhaWxhYmxlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjYWRkZmllbGRzIikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgJCh3cmFwcGVyKS5vbigiY2xpY2siLCAiLnJlbW92ZV9maWVsZCIsIGZ1bmN0aW9uIChlKSB7IC8vdXNlciBjbGljayBvbiByZW1vdmUgdGV4dAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucGFyZW50KCdkaXYnKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgeC0tOwogICAgICAgICAgICAgICAgICAgICAgICAkKCIjYWRkZmllbGRzIikuc2hvdygpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAgICAgIDxzY3JpcHQ+CgoKICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjZG93bmxvYWQiKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJ2hpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydENhbnZhcygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0Q2FudmFzQ29udGV4dCgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbXljYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiRGlzcGxheSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBjYW52YXNfY29udGV4dCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgdmFyIHgsIHkgPSAwOwogICAgICAgICAgICAgICAgICAgIGlmIChteWNhbnZhcyAmJiBteWNhbnZhcy5nZXRDb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc19jb250ZXh0ID0gbXljYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW52YXNfY29udGV4dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYW52YXNJbWdFeHBlcmltZW50KCkgewogICAgICAgICAgICAgICAgICAgIGNhbnZhc19jb250ZXh0ID0gZ2V0Q2FudmFzQ29udGV4dCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjYW52YXNfY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNfY29udGV4dC5maWxsU3R5bGUgPSAiI0ZGRkZGRiI7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc19jb250ZXh0LmZpbGxSZWN0KDAsIDAsIDcwMCwgNzAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyBzb21ldGhpbmcKICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzX2NvbnRleHQuZmlsbFN0eWxlID0gIiNDMDAwMDAiOwogICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNfY29udGV4dC5mb250ID0gIjQwcHggYXJpYWwiOwogICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNfY29udGV4dC5maWxsVGV4dCgiVGhpcyBjYW52YXMgd2lsbCBiZSBleHBvcnRlZCIsIDEwMCwgMzAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gZXhwb3J0Q2FudmFzKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgbXljYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiRGlzcGxheSIpOwovLyAgICAgICAgICAgICAgICBpZihteWNhbnZhcyAmJiBteWNhbnZhcy5nZXRDb250ZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW1nID0gbXljYW52YXMudG9EYXRhVVJMKCJpbWFnZS9wbmc7YmFzZTY0OyIpOwogICAgICAgICAgICAgICAgICAgIGFsZXJ0KGltZyk7CiAgICAgICAgICAgICAgICAgICAgaW1nID0gaW1nLnJlcGxhY2UoImltYWdlL3BuZyIsICJpbWFnZS9vY3RldC1zdHJlYW0iKTsgLy8gZm9yY2UgZG93bmxvYWQsIHVzZXIgd291bGQgaGF2ZSB0byBnaXZlIHRoZSBmaWxlIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgLy8geW91IGNhbiBhbHNvIHVzZSBhbmNob3IgdGFnIHdpdGggZG93bmxvYWQgYXR0cmlidXRlIHRvIGZvcmNlIGRvd25sb2FkIHRoZSBjYW52YXMgd2l0aCBmaWxlIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oaW1nLCAiIiwgIndpZHRoPTcwMCxoZWlnaHQ9NzAwIik7Ci8vICAgICAgICAgICAgICAgIH1lbHNlIHsKLy8gICAgICAgICAgICAgICAgYWxlcnQoIkNhbiBub3QgZXhwb3J0Iik7Ci8vICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FudmFzSW1nRXhwZXJpbWVudCgpOwoKCiAgICAgICAgICAgIDwvc2NyaXB0PgogICAgICAgICAgICA8IS0tLWVuZCBhZGQgYW5kIHNlYXJjaCBtZXRhZGF0YS0tPgoKICAgICAgICAgICAgPCEtLSBmb3IgbG9jayBmb2xkZXItLT4KICAgICAgICAgICAgPGRpdiBpZD0ibG9jay1mb2xkZXIiIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJteU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIj4gCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+IAogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj7DlzwvYnV0dG9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiPjw/cGhwIGVjaG8gJGxhbmdbJ2xvY2tfZm9sZGVyJ107ID8+PC9oND4gCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+U2VsZWN0ZWQgRm9sZGVyPHNwYW4gY2xhc3M9InRleHQtYWxlcnQiPio8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJzZWxlY3RlZF9sb2NrX2ZvbGRlciIgbmFtZT0ic2VsZWN0ZWRfZm9sZGVyIiB2YWx1ZT0iPD9waHAgZWNobyAkcndtb3ZlRm9sZGVyTmFtZVsnc2xfbmFtZSddOyA/PiIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+RW50ZXIgUGFzc3dvcmQ8c3BhbiBjbGFzcz0idGV4dC1hbGVydCI+KjwvbGFiZWw+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InBhc3N3b3JkIiBjbGFzcz0iZm9ybS1jb250cm9sIiBuYW1lPSJsb2NrZm9sZGVyIiAgcmVxdWlyZWQgYXV0b2NvbXBsZXRlPSJvZmYiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gJHJ3Rm9sZGVyWydzbF9pZCddOyA/PiIgbmFtZT0ibG9ja3NsSWQiIHR5cGU9ImhpZGRlbiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IHdhdmVzLWVmZmVjdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5hbWU9ImxvY2siIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPlN1Ym1pdDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgPC9kaXY+CgoKICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgJHNsaWRfbG9jayA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSBgdGJsX3N0b3JhZ2VfbGV2ZWxgIHdoZXJlIHNsX2lkPSckc2xpZCciKW9yIGRpZSgnRXJyb3IgREIgOiAnIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICAgICAgJGFicyA9IG15c3FsaV9mZXRjaF9hc3NvYygkc2xpZF9sb2NrKTsKICAgICAgICAgICAgPz4KICAgICAgICAgICAgPCEtLSBmb3IgdW5sb2NrIGZvbGRlci0tPgoKICAgICAgICAgICAgPGRpdiBpZD0idW5sb2NrLWZvbGRlciIgY2xhc3M9Im1vZGFsIGZhZGUiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9Im15TW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciPiAKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1oaWRkZW49InRydWUiPsOXPC9idXR0b24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+PD9waHAgZWNobyAkbGFuZ1sndW5sb2NrX2ZvbGRlciddOyA/PjwvaDQ+IAogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlbGVjdGVkIEZvbGRlcjxzcGFuIGNsYXNzPSJ0ZXh0LWFsZXJ0Ij4qPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBpZD0ic2VsZWN0ZWRfdW5sb2NrX2ZvbGRlciIgbmFtZT0ic2VsZWN0ZWRfZm9sZGVyIiB2YWx1ZT0iPD9waHAgZWNobyAkcndtb3ZlRm9sZGVyTmFtZVsnc2xfbmFtZSddOyA/PiIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj48L2Rpdj4KCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkVudGVyIE9sZCBQYXNzd29yZDxzcGFuIGNsYXNzPSJ0ZXh0LWFsZXJ0Ij4qPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJwYXNzd29yZCIgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9InVubG9ja2ZvbGRlciIgbmFtZT0idW5sb2NrZm9sZGVyIiAgcmVxdWlyZWQgYXV0b2NvbXBsZXRlPSJvZmYiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+PC9kaXY+CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4gCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT0iPD9waHAgZWNobyAkcndGb2xkZXJbJ3NsX2lkJ107ID8+IiBuYW1lPSJsb2Nrc2xJZCIgdHlwZT0iaGlkZGVuIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgd2F2ZXMtZWZmZWN0IiAgZGF0YS1kaXNtaXNzPSJtb2RhbCIgPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGlkPSJ1bmxvY2siIG5hbWUgPSJ1bmxvY2siIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPlVubG9jazwvYnV0dG9uPiAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gZm9yIHVwZGF0ZSBwYXNzd29yZCBsb2NrIC0tPgogICAgICAgICAgICA8ZGl2IGlkPSJ1cGRhdGUtZm9sZGVyLXBhc3N3b3JkIiBjbGFzcz0ibW9kYWwgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+IAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIj48P3BocCBlY2hvICRsYW5nWyd1cGRhdGVfZm9sZGVyX3Bhc3N3b3JkJ107ID8+PC9oND4gCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+U2VsZWN0ZWQgRm9sZGVyPHNwYW4gY2xhc3M9InRleHQtYWxlcnQiPio8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJzZWxlY3RlZF91cGRhdGVfZm9sX3Bhc3MiIG5hbWU9InNlbGVjdGVkX2ZvbGRlciIgdmFsdWU9Ijw/cGhwIGVjaG8gJHJ3bW92ZUZvbGRlck5hbWVbJ3NsX25hbWUnXTsgPz4iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+PC9kaXY+CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5FbnRlciBPbGQgUGFzc3dvcmQ8c3BhbiBjbGFzcz0idGV4dC1hbGVydCI+KjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJvbGRfcGFzcyIgIHJlcXVpcmVkIG5hbWU9Im9sZF9wYXNzIiBhdXRvY29tcGxldGU9Im9mZiIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+RW50ZXIgTmV3IFBhc3N3b3JkPHNwYW4gY2xhc3M9InRleHQtYWxlcnQiPio8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InBhc3N3b3JkIiBjbGFzcz0iZm9ybS1jb250cm9sIiBpZD0ibmV3X3Bhc3MiICByZXF1aXJlZCBuYW1lPSJuZXdfcGFzcyIgYXV0b2NvbXBsZXRlPSJvZmYiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+PC9kaXY+CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIj4gCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT0iPD9waHAgZWNobyAkcndGb2xkZXJbJ3NsX2lkJ107ID8+IiBuYW1lPSJsb2Nrc2xJZCIgdHlwZT0iaGlkZGVuIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgd2F2ZXMtZWZmZWN0IiAgZGF0YS1kaXNtaXNzPSJtb2RhbCIgPkNsb3NlPC9idXR0b24+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJ1cGRhdGVfZm9sZGVyX3Bhc3MiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiID5VcGRhdGU8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgIDwvZGl2PgoKCiAgICAgICAgICAgIDwhLS1tb2RhbCBmb3IgZG93bmxvYWQgZG9jLS0+CiAgICAgICAgICAgIDxkaXYgaWQ9Im15TW9kYWwiIGNsYXNzPSJtb2RhbCBmYWRlIiByb2xlPSJkaWFsb2ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIj4KCiAgICAgICAgICAgICAgICAgICAgPCEtLSBNb2RhbCBjb250ZW50LS0+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+UGxlYXNlIGVudGVyIHBhc3N3b3JkPC9oND4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJwYXNzX3ZhbHVlIiBhdXRvY29tcGxldGU9Im9mZiIgYXV0b2ZvY3VzID4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iPD9waHAgZWNobyAkYWJzWydwYXNzd29yZCddOyA/PiIgaWQ9ImRvY19wYXNzIj4JCQkgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9IiIgaWQ9ImRvY0RJZCI+CQkJICAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIiIGlkPSJlbnRlcl9idG4iIHZhbHVlPSJFbnRlciIgb25jbGljaz0icmV0dXJuIHBhc3N3b3JkX2NoZWNrKGV2ZW50KSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPCEtLSBmb3IgZm9yZ2V0IGZvbGRlciBwYXNzd29yZC0tPgogICAgICAgICAgICA8ZGl2IGlkPSJmb3Jnb3QtcGFzc3dvcmQiIGNsYXNzPSJtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJteU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIj4gCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+IAogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkaW5nIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im1vZGFsLXRpdGxlIj5Gb3Jnb3QgUGFzc3dvcmQ8L2g0PiAKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkFyZSB5b3Ugc3VyZSB0aGF0IHlvdSB3YW50IHRvIHJlc2V0IHBhc3N3b3JkIGZvciBzdG9yYWdlICI8P3BocCBlY2hvICRyd21vdmVGb2xkZXJOYW1lWydzbF9uYW1lJ107ID8+IiA/PC9oND4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPiAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT0iPD9waHAgZWNobyAkcndGb2xkZXJbJ3NsX2lkJ107ID8+IiBuYW1lPSJmb3Jnb3RQYXNzSWQiIHR5cGU9ImhpZGRlbiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCB3YXZlcy1lZmZlY3QiICBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5hbWU9ImZvcmdvdFBhc3N3b3JkIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5Db25maXJtPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgPC9kaXY+CQogICAgICAgIDwvZGl2PgogICAgICAgIDwhLS0gZm9yIGZvcmdldCBmb2xkZXIgcGFzc3dvcmQgcmVzZXQtLT4KICAgICAgICA8ZGl2IGlkPSJyZXNldHBhc3N3b3JkIiBjbGFzcz0ibW9kYWwgZmFkZSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9Im15TW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyI+IAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+IAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+IAogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+w5c8L2J1dHRvbj4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiPlJlc2V0IHlvdXIgUGFzc3dvcmQ8L2g0PiAKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBpZD0icmVzZXRQYXNzRm9ybSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJwYXNzMSI+T1RQIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Ij4qPC9zcGFuPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAgbmFtZT0ib3RwIiB0eXBlPSJ0ZXh0IiAgcGxhY2Vob2xkZXI9IkVudGVyIE9UUCIgaWQ9Im90cHMiIHJlcXVpcmVkIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHN0eWxlPSJiYWNrZ3JvdW5kOiNmZmY7IGNvbG9yOiAjNTY1NjU2OyI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJwYXNzMSI+UGFzc3dvcmQgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsiPio8L3NwYW4+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJwYXNzMSIgbmFtZT0icGFzd2QiIHR5cGU9InBhc3N3b3JkIiAgcGxhY2Vob2xkZXI9IlBhc3N3b3JkIiByZXF1aXJlZCBjbGFzcz0iZm9ybS1jb250cm9sIj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InBhc3NXb3JkMiI+Q29uZmlybSBQYXNzd29yZCA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+Kjwvc3Bhbj48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS1wYXJzbGV5LWVxdWFsdG89IiNwYXNzMSIgdHlwZT0icGFzc3dvcmQiIHJlcXVpcmVkIHBsYWNlaG9sZGVyPSJDb25maXJtIFBhc3N3b3JkIiBjbGFzcz0iZm9ybS1jb250cm9sIiBpZD0icGFzc0NvbmZpcm0iIHN0eWxlPSJiYWNrZ3JvdW5kOiNmZmY7IGNvbG9yOiAjNTY1NjU2OyI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+IAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gJHJ3Rm9sZGVyWydzbF9pZCddOyA/PiIgbmFtZT0ibG9ja3NsSWQiIHR5cGU9ImhpZGRlbiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB2YWx1ZT0iPD9waHAgZWNobyAkcndGb2xkZXJbJ3NsX25hbWUnXTsgPz4iIG5hbWU9ImZvbGRlciIgdHlwZT0iaGlkZGVuIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgd2F2ZXMtZWZmZWN0IiAgZGF0YS1kaXNtaXNzPSJtb2RhbCIgPkNsb3NlPC9idXR0b24+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJyZXNldFBhc3MiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiID5TdWJtaXQ8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4gCiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8P3BocAoKICAgIGZ1bmN0aW9uIGZpbmRDaGlsZHNzX2xvY2soJGxvY2tzbElkKSB7CiAgICAgICAgZ2xvYmFsICRkYl9jb247CiAgICAgICAgZ2xvYmFsICRzbENoaWxkOwogICAgICAgICRzcWxfY2hpbGQgPSAic2VsZWN0ICogRlJPTSB0Ymxfc3RvcmFnZV9sZXZlbCBXSEVSRSBzbF9wYXJlbnRfaWQgPSAnJGxvY2tzbElkJyBhbmQgaXNfcHJvdGVjdGVkPScwJyBvcmRlciBieSBzbF9uYW1lIGFzYyI7CiAgICAgICAgJHNxbF9jaGlsZF9ydW4gPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgJHNxbF9jaGlsZCkgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICBpZiAobXlzcWxpX251bV9yb3dzKCRzcWxfY2hpbGRfcnVuKSA+IDApIHsKICAgICAgICAgICAgd2hpbGUgKCRyd2NoaWxkID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRzcWxfY2hpbGRfcnVuKSkgewogICAgICAgICAgICAgICAgJGNoaWxkID0gJHJ3Y2hpbGRbJ3NsX2lkJ107CgogICAgICAgICAgICAgICAgZmluZENoaWxkc3NfbG9jaygkY2hpbGQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRzbENoaWxkW10gPSAkbG9ja3NsSWQ7CgogICAgICAgIHJldHVybiAkc2xDaGlsZDsKICAgIH0KICAgID8+CiAgICA8P3BocAoKICAgIGZ1bmN0aW9uIGZpbmRDaGlsZHNzX3VubG9jaygkbG9ja3NsSWQpIHsKICAgICAgICBnbG9iYWwgJGRiX2NvbjsKICAgICAgICBnbG9iYWwgJHNsQ2hpbGQ7CiAgICAgICAgJGEgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgIlNlbGVjdCBwYXNzd29yZCBmcm9tIHRibF9zdG9yYWdlX2xldmVsIHdoZXJlIHNsX2lkPSckbG9ja3NsSWQnICIpOwogICAgICAgICRiID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRhKTsKICAgICAgICAkc3FsX2NoaWxkID0gInNlbGVjdCAqIEZST00gdGJsX3N0b3JhZ2VfbGV2ZWwgV0hFUkUgc2xfcGFyZW50X2lkID0gJyRsb2Nrc2xJZCcgYW5kIGlzX3Byb3RlY3RlZCE9JzAnIGFuZCB1c2VyX2lkPSckX1NFU1NJT05bY2Rlc191c2VyX2lkXScgYW5kIHBhc3N3b3JkPSckYltwYXNzd29yZF0nIG9yZGVyIGJ5IHNsX25hbWUgYXNjIjsKICAgICAgICAkc3FsX2NoaWxkX3J1biA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAkc3FsX2NoaWxkKSBvciBkaWUoJ0Vycm9yOicgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwogICAgICAgIGlmIChteXNxbGlfbnVtX3Jvd3MoJHNxbF9jaGlsZF9ydW4pID4gMCkgewogICAgICAgICAgICB3aGlsZSAoJHJ3Y2hpbGQgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNxbF9jaGlsZF9ydW4pKSB7CiAgICAgICAgICAgICAgICAkY2hpbGQgPSAkcndjaGlsZFsnc2xfaWQnXTsKCiAgICAgICAgICAgICAgICBmaW5kQ2hpbGRzc191bmxvY2soJGNoaWxkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkc2xDaGlsZFtdID0gJGxvY2tzbElkOwoKICAgICAgICByZXR1cm4gJHNsQ2hpbGQ7CiAgICB9CiAgICA/PgogICAgPCEtLWZvciBsb2NrIGZvbGRlci0tPgogICAgPD9waHAKICAgIGlmIChpc3NldCgkX1BPU1RbJ2xvY2snXSkpIHsKICAgICAgICAkbG9ja2ZvbGRlciA9ICRfUE9TVFsnbG9ja2ZvbGRlciddOwogICAgICAgICRsb2Nrc2xJZCA9ICRfUE9TVFsnbG9ja3NsSWQnXTsKICAgICAgICAkc3RyZ0NobGlkID0gZmluZENoaWxkc3NfbG9jaygkbG9ja3NsSWQpOwogICAgICAgICRhbGxDaGlsZHMgPSBpbXBsb2RlKCcsJywgJHN0cmdDaGxpZCk7CgoKICAgICAgICAkY2hlY2sgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgInNlbGVjdCAqIGZyb20gdGJsX3N0b3JhZ2VfbGV2ZWwgd2hlcmUgaXNfcHJvdGVjdGVkID0nMScgb3IgaXNfcHJvdGVjdGVkPScyJyIpOwogICAgICAgICRjaGVja1N0b3JhZ2UgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrKTsKICAgICAgICAkcHJvdGVjdGVkX3NsaWQgPSAkY2hlY2tTdG9yYWdlWydzbF9pZCddOwoKCiAgICAgICAgJHNxbDEgPSBteXNxbGlfcXVlcnkoJGRiX2NvbiwgIlVQREFURSBgdGJsX3N0b3JhZ2VfbGV2ZWxgIHNldCBpc19wcm90ZWN0ZWQgPSAnMScsIHBhc3N3b3JkPXNoYTEoJyRsb2NrZm9sZGVyJyksdXNlcl9pZCA9ICckX1NFU1NJT05bY2Rlc191c2VyX2lkXScgd2hlcmUgc2xfaWQgaW4oJGFsbENoaWxkcykiKW9yIGRpZSgnRXJyb3IgREIgY2hpbGQ6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwoKICAgICAgICAkc3FsMiA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiVVBEQVRFIGB0Ymxfc3RvcmFnZV9sZXZlbGAgc2V0IGlzX3Byb3RlY3RlZCA9ICcyJyx1c2VyX2lkID0gJyRfU0VTU0lPTltjZGVzX3VzZXJfaWRdJyB3aGVyZSBzbF9pZCA9JyRsb2Nrc2xJZCciKW9yIGRpZSgnRXJyb3IgREIgY2hpbGQ6ICcgLiBteXNxbGlfZXJyb3IoJGRiX2NvbikpOwoKICAgICAgICBpZiAoJHNxbDEgJiYgJHNxbDIpIHsKCiAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrU3VjY2VzcygiJyAuIGJhc2VuYW1lKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuICciLCJGb2xkZXIgbG9ja2VkICBzdWNjZXNzZnVsbHkuIik7PC9zY3JpcHQ+JzsKICAgICAgICB9CiAgICB9CgoKICAgIGlmIChpc3NldCgkX1BPU1RbJ3VubG9jayddKSkgewogICAgICAgICRsb2Nrc2xJZCA9ICRfUE9TVFsnbG9ja3NsSWQnXTsKICAgICAgICAkc3RyZ0NobGlkID0gZmluZENoaWxkc3NfdW5sb2NrKCRsb2Nrc2xJZCk7CiAgICAgICAgJGFsbENoaWxkcyA9IGltcGxvZGUoJywnLCAkc3RyZ0NobGlkKTsKCiAgICAgICAgJHBhc3MgPSAkX1BPU1RbJ3VubG9ja2ZvbGRlciddOwoKICAgICAgICAkcGFzc3dvcmQgPSAkYWJzWydwYXNzd29yZCddOwoKICAgICAgICAkZnBhc3MgPSBTSEExKCRwYXNzKTsKICAgICAgICBpZiAoJHBhc3N3b3JkID09ICRmcGFzcykgewoKICAgICAgICAgICAgJHVubG9jayA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAiVVBEQVRFIGB0Ymxfc3RvcmFnZV9sZXZlbGAgc2V0IGlzX3Byb3RlY3RlZCA9ICcwJywgcGFzc3dvcmQ9TlVMTCx1c2VyX2lkPU5VTEwgd2hlcmUgc2xfaWQgSU4gKCRhbGxDaGlsZHMpIilvciBkaWUobXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKCiAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrU3VjY2VzcygiJyAuIGJhc2VuYW1lKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuICciLCJGb2xkZXIgVW5sb2NrZWQgIHN1Y2Nlc3NmdWxseS4iKTs8L3NjcmlwdD4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8nPHNjcmlwdD50YXNrRmFpbGVkKCInIC4gYmFzZW5hbWUoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIC4gJyIsIkVycm9yIGluIHVubG9jayBmb2xkZXIuIik7PC9zY3JpcHQ+JzsKICAgICAgICB9CiAgICB9CgogICAgLyogICAgICogaWYoaXNzZXQoJF9QT1NUWyd1cGRhdGVfZm9sZGVyX3Bhc3MnXSkpewogICAgICAkbG9ja3NsSWQgPSAkX1BPU1RbJ2xvY2tzbElkJ107CiAgICAgICRzdHJnQ2hsaWQgPSBmaW5kQ2hpbGRzc191bmxvY2soJGxvY2tzbElkKTsKICAgICAgJGFsbENoaWxkcyA9IGltcGxvZGUoJywnLCRzdHJnQ2hsaWQpOwoKICAgICAgJG9sZF9wYXNzPSRfUE9TVFsnb2xkX3Bhc3MnXTsKICAgICAgJHBhc3N3b3JkID0gJGFic1sncGFzc3dvcmQnXTsKICAgICAgJG5ld19wYXNzPSRfUE9TVFsnbmV3X3Bhc3MnXTsKCiAgICAgICRmcGFzcz1TSEExKCRvbGRfcGFzcyk7CgogICAgICBpZigkcGFzc3dvcmQgPT0gJGZwYXNzKQogICAgICB7CgogICAgICAkdW5sb2NrID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sIlVQREFURSBgdGJsX3N0b3JhZ2VfbGV2ZWxgIHNldCBwYXNzd29yZD1zaGExKCckbmV3X3Bhc3MnKSB3aGVyZSBzbF9pZCBJTiAoJGFsbENoaWxkcykiKW9yIGRpZShteXNxbGlfZXJyb3IoJGRiX2NvbikpOwoKICAgICAgZWNobyc8c2NyaXB0PnRhc2tTdWNjZXNzKCInIC4gYmFzZW5hbWUoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIC4gJyIsIkZvbGRlciBQYXNzd29yZCBVcGRhdGVkIHN1Y2Nlc3NmdWxseS4iKTs8L3NjcmlwdD4nOwoKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgZWNobyc8c2NyaXB0PnRhc2tGYWlsZWQoIicgLiBiYXNlbmFtZSgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkgLiAnIiwiRXJyb3IgaW4gdXBkYXRlIGZvbGRlciBwYXNzd29yZC4iKTs8L3NjcmlwdD4nOwoKCiAgICAgIH0KCiAgICAgIH0qICovCgovL2ZvcmdvdCBwYXNzd29yZAogICAgaWYgKGlzc2V0KCRfUE9TVFsnZm9yZ290UGFzc3dvcmQnXSkpIHsKCiAgICAgICAgJHVzZXJfaWQgPSAkX1NFU1NJT05bJ2NkZXNfdXNlcl9pZCddOwogICAgICAgICRjaGtVc2VyTWFpbCA9IG15c3FsaV9xdWVyeSgkZGJfY29uLCAic2VsZWN0ICogZnJvbSB0YmxfdXNlcl9tYXN0ZXIgd2hlcmUgdXNlcl9pZD0nJHVzZXJfaWQnIikgb3IgZGllKCdFcnJvcjonIC4gbXlzcWxpX2Vycm9yKCRkYl9jb24pKTsKICAgICAgICBpZiAobXlzcWxpX251bV9yb3dzKCRjaGtVc2VyTWFpbCkgPiAwKSB7CiAgICAgICAgICAgICRyd0NoZWNrID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRjaGtVc2VyTWFpbCk7CiAgICAgICAgICAgICRlbWFpbCA9ICRyd0NoZWNrWyd1c2VyX2VtYWlsX2lkJ107CiAgICAgICAgICAgICRybmRubyA9IHJhbmQoMTAwMDAwLCA5OTk5OTkpOyAvL09UUCBnZW5lcmF0ZQogICAgICAgICAgICAkdG8gPSAkZW1haWw7CiAgICAgICAgICAgICRuYW1lID0gJHJ3Q2hlY2tbJ2ZpcnN0X25hbWUnXSAuICcgJyAuICRyd0NoZWNrWydsYXN0X25hbWUnXTsKICAgICAgICAgICAgJHR4dCA9ICRybmRubzsKICAgICAgICAgICAgcmVxdWlyZV9vbmNlICcuL21haWwucGhwJzsKICAgICAgICAgICAgJG1haWwgPSBtYWlsUGFzc2NoYW5nZSgkdHh0LCAkdG8sICRuYW1lKTsKCiAgICAgICAgICAgICRfU0VTU0lPTlsnb3RwJ10gPSAkcm5kbm87CiAgICAgICAgICAgIGlmICgkbWFpbCkgewogICAgICAgICAgICAgICAgZWNobyc8c2NyaXB0PnN3YWwoewoJCQkJCQkJCXRpdGxlOiAiVGFzayBTdWNjZXNzIiwKCQkJCQkJCQl0ZXh0OiAiVmVyaWZpY2F0aW9uIENvZGUgc2VudCBTdWNjZXNzZnVsbHkiLAoJCQkJCQkJCXR5cGU6ICJzdWNjZXNzIgoJCQkJCQkJfSkudGhlbihmdW5jdGlvbigpewoJCQkJCQkJCQoJCQkJCQkJCSQoIiNyZXNldHBhc3N3b3JkIikubW9kYWwoInNob3ciKTsKCQkJCQkJCX0pOwoJCQkJCQkJPC9zY3JpcHQ+JzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8nPHNjcmlwdD5zd2FsKHsKCQkJCQkJCQl0aXRsZTogIlRhc2sgRmFpbGVkIiwKCQkJCQkJCQl0ZXh0OiAiUGxlYXNlIGVudGVyIHZhbGlkIGVtYWlsIGlkLiIsCgkJCQkJCQkJdHlwZTogIndhcm5pbmciLAoJCQkJCQkJCXNob3dDYW5jZWxCdXR0b246IHRydWUKCQkJCQkJCX0pLnRoZW4oZnVuY3Rpb24oKXsKCQkJCQkJCQkkKCIjZm9yZ290LXBhc3N3b3JkIikubW9kYWwoInNob3ciKTsKCQkJCQkJCX0pOzwvc2NyaXB0Pic7CiAgICAgICAgfQogICAgfQoKICAgIC8vcmVzZXQgcGFzc3dvcmQJCiAgICBpZiAoaXNzZXQoJF9QT1NUWydyZXNldFBhc3MnXSkpIHsKICAgICAgICAkcGFzcyA9ICRfUE9TVFsncGFzd2QnXTsKICAgICAgICAkcGFzcyA9IG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGRiX2NvbiwgJHBhc3MpOwogICAgICAgICRvdHAgPSAkX1BPU1RbJ290cCddOwogICAgICAgICRvdHAgPSBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRkYl9jb24sICRvdHApOwogICAgICAgICR0byA9ICRfU0VTU0lPTlsnYWRtaW5NYWlsJ107CgogICAgICAgICRsb2Nrc2xJZCA9ICRfUE9TVFsnbG9ja3NsSWQnXTsKICAgICAgICAkc3RvcmFnZSA9ICRfUE9TVFsnZm9sZGVyJ107CiAgICAgICAgJHN0cmdDaGxpZCA9IGZpbmRDaGlsZHNzX3VubG9jaygkbG9ja3NsSWQpOwogICAgICAgICRhbGxDaGlsZHMgPSBpbXBsb2RlKCcsJywgJHN0cmdDaGxpZCk7CgogICAgICAgIGlmICghc3RyY21wKCRvdHAsICRfU0VTU0lPTlsnb3RwJ10pKSB7CgogICAgICAgICAgICAkUmVzZXRwYXNzID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJVUERBVEUgYHRibF9zdG9yYWdlX2xldmVsYCBzZXQgcGFzc3dvcmQ9c2hhMSgnJHBhc3MnKSB3aGVyZSBzbF9pZCBJTigkYWxsQ2hpbGRzKSIpb3IgZGllKG15c3FsaV9lcnJvcigkZGJfY29uKSk7CiAgICAgICAgICAgICRjaGtVc2VyID0gbXlzcWxpX3F1ZXJ5KCRkYl9jb24sICJzZWxlY3QgKiBmcm9tIHRibF91c2VyX21hc3RlciB3aGVyZSB1c2VyX2VtYWlsX2lkPSckdG8gJyIpIG9yIGRpZSgnRXJyb3I6JyAuIG15c3FsaV9lcnJvcigkZGJfY29uKSk7CgogICAgICAgICAgICAkcndVc2VyID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRjaGtVc2VyKTsKICAgICAgICAgICAgJHVzZXJuYW1lID0gJHJ3VXNlclsnZmlyc3RfbmFtZSddIC4gJyAnIC4gJHJ3VXNlclsnbGFzdF9uYW1lJ107CiAgICAgICAgICAgIGlmICgkUmVzZXRwYXNzKSB7CiAgICAgICAgICAgICAgICByZXF1aXJlX29uY2UgJy4vbWFpbC5waHAnOwogICAgICAgICAgICAgICAgJG1haWwgPSBtYWlsUmVzZXRQYXNzRm9sZGVyKCR0bywgJHBhc3MsICRzdG9yYWdlLCAkdXNlcm5hbWUpOwoKICAgICAgICAgICAgICAgIGlmICgkbWFpbCkgewogICAgICAgICAgICAgICAgICAgIGVjaG8nPHNjcmlwdD4gdGFza1N1Y2Nlc3MoIicgLiBiYXNlbmFtZSgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkgLiAnIiwiUGFzc3dvcmQgUmVzZXQgU3VjZXNzZnVsbHkgISEiKTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlY2hvJzxzY3JpcHQ+c3dhbCh7CgkJCQkJCQkJdGl0bGU6ICJUYXNrIEZhaWxlZCIsCgkJCQkJCQkJdGV4dDogIkZhaWxlZCB0byBjaGFuZ2UhISIsCgkJCQkJCQkJdHlwZTogIndhcm5pbmciLAoJCQkJCQkJCXNob3dDYW5jZWxCdXR0b246IHRydWUKCQkJCQkJCX0pLnRoZW4oZnVuY3Rpb24oKSB7CgkJCQkJCQkJJCgiI3Jlc2V0cGFzc3dvcmQiKS5tb2RhbCgic2hvdyIpOwoJCQkJCQkJfSk7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdW5zZXQoJF9TRVNTSU9OWydvdHAnXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWNobyc8c2NyaXB0PnN3YWwoewoJCQkJCQkJCXRpdGxlOiAiVGFzayBGYWlsZWQiLAoJCQkJCQkJCXRleHQ6ICJFbnRlciBWYWxpZCBPVFAgQ29kZSAhISIsCgkJCQkJCQkJdHlwZTogIndhcm5pbmciLAoJCQkJCQkJCXNob3dDYW5jZWxCdXR0b246IHRydWUKCQkJCQkJCX0pLnRoZW4oZnVuY3Rpb24oKSB7CgkJCQkJCQkJJCgiI3Jlc2V0cGFzc3dvcmQiKS5tb2RhbCgic2hvdyIpOwoJCQkJCQkJfSk7PC9zY3JpcHQ+JzsKICAgICAgICB9CiAgICB9CiAgICA/PgoKCgogICAgPHNjcmlwdD4KCiAgICAgICAgJCgnZG9jdW1lbnQnKS5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbElEID08P3BocCBlY2hvICRyd0ZvbGRlclsnc2xfaWQnXTsgPz47CiAgICAgICAgICAgIHZhciBpc19wcm90ZWN0ZWQgPSA8P3BocCBlY2hvICRhYnNbJ2lzX3Byb3RlY3RlZCddOyA/PjsKICAgICAgICAgICAgdmFyIHVzZXJfaWQgPSAnPD9waHAgZWNobyAkYWJzWyd1c2VyX2lkJ107ID8+JzsKICAgICAgICAgICAgdmFyIHNlc3Npb25faWQgPSA8P3BocCBlY2hvICRfU0VTU0lPTlsnY2Rlc191c2VyX2lkJ107ID8+OwogICAgICAgICAgICAkKCIjc2VsZWN0ZWRfbG9ja19mb2xkZXIiKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICAkKCIjc2VsZWN0ZWRfdW5sb2NrX2ZvbGRlciIpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgICQoIiNzZWxlY3RlZF91cGRhdGVfZm9sX3Bhc3MiKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwoKICAgICAgICAgICAgaWYgKGlzX3Byb3RlY3RlZCA9PSAyICYmIHVzZXJfaWQgPT0gc2Vzc2lvbl9pZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCgiI2xvY2tfZm9sIikuaGlkZSgpOwogICAgICAgICAgICAgICAgLy8kKCIjdXBkYXRlX2ZvbF9wYXNzIikuc2hvdygpOwogICAgICAgICAgICAgICAgJCgiI3VubG9ja19mb2wiKS5zaG93KCk7CiAgICAgICAgICAgICAgICAkKCIjcmVzZXRfcGFzc3dvcmQiKS5zaG93KCk7CiAgICAgICAgICAgICAgICAkKCIjYnVsa19kb3duIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI2NvcHlfZm9sIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI21vdmVfZm9sIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI3NoYXJlX2ZvbCIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICQoIiNtb3ZlX211bHRpIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI2NvcHlGaWxlcyIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICQoIiNzaGFyZUZpbGVzIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI2V4cG9ydDQiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAkKCIjbWFpbEZpbGVzIikuaGlkZSgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGlzX3Byb3RlY3RlZCA9PSAxICYmIHVzZXJfaWQgPT0gc2Vzc2lvbl9pZCkgewogICAgICAgICAgICAgICAgJCgiI2xvY2tfZm9sIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI3VubG9ja19mb2wiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAvLyQoIiN1cGRhdGVfZm9sX3Bhc3MiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAkKCIjcmVzZXRfcGFzc3dvcmQiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAkKCIjYnVsa19kb3duIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI2NvcHlfZm9sIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI21vdmVfZm9sIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI3NoYXJlX2ZvbCIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICQoIiNtb3ZlX211bHRpIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI2NvcHlGaWxlcyIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICQoIiNzaGFyZUZpbGVzIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI2V4cG9ydDQiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAkKCIjbWFpbEZpbGVzIikuaGlkZSgpOwoKICAgICAgICAgICAgfSBlbHNlIGlmIChpc19wcm90ZWN0ZWQgPT0gMCAmJiB1c2VyX2lkID09ICcnKSB7CiAgICAgICAgICAgICAgICAkKCIjbG9ja19mb2wiKS5zaG93KCk7CiAgICAgICAgICAgICAgICAkKCIjdW5sb2NrX2ZvbCIpLmhpZGUoKTsKICAgICAgICAgICAgICAgIC8vJCgiI3VwZGF0ZV9mb2xfcGFzcyIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICQoIiNyZXNldF9wYXNzd29yZCIpLmhpZGUoKTsKICAgICAgICAgICAgfSBlbHNlIGlmICgoaXNfcHJvdGVjdGVkID09IDEgfHwgaXNfcHJvdGVjdGVkID09IDIpICYmIHVzZXJfaWQgIT0gc2Vzc2lvbl9pZCkgewogICAgICAgICAgICAgICAgJCgiI2xvY2tfZm9sIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI3VubG9ja19mb2wiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAvLyQoIiN1cGRhdGVfZm9sX3Bhc3MiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAkKCIjYnVsa19kb3duIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI2NvcHlfZm9sIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI21vdmVfZm9sIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI3NoYXJlX2ZvbCIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICQoIiNyZXNldF9wYXNzd29yZCIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICQoIiNtb3ZlX211bHRpIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI2NvcHlGaWxlcyIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICQoIiNzaGFyZUZpbGVzIikuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgiI2V4cG9ydDQiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAkKCIjbWFpbEZpbGVzIikuaGlkZSgpOwogICAgICAgICAgICB9CgoKCgogICAgICAgIH0pOwogICAgICAgICQoIiN1bmxvY2stZm9sZGVyIikub24oImhpZGRlbi5icy5tb2RhbCIsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICQoIiN1bmxvY2tmb2xkZXIiKS5odG1sKCIiKTsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgIH0pOwoKICAgICAgICAkKCIjbG9jay1mb2xkZXIiKS5vbigiaGlkZGVuLmJzLm1vZGFsIiwgZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgJCgiI2xvY2tmb2xkZXIiKS5odG1sKCIiKTsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgIH0pOwogICAgICAgICQoIiN1cGRhdGUtZm9sZGVyLXBhc3N3b3JkIikub24oImhpZGRlbi5icy5tb2RhbCIsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICQoIiNvbGRfcGFzcyIpLmh0bWwoIiIpOwogICAgICAgICAgICAkKCIjbmV3X3Bhc3MiKS5odG1sKCIiKTsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgIH0pOwogICAgICAgICQoIiNteU1vZGFsIikub24oImhpZGRlbi5icy5tb2RhbCIsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICQoIiNwYXNzX3ZhbHVlIikuaHRtbCgiIik7CgogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgfSk7CiAgICAgICAgJCgiI3Jlc2V0cGFzc3dvcmQiKS5vbigiaGlkZGVuLmJzLm1vZGFsIiwgZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgJCgiI290cHMiKS5odG1sKCIiKTsKICAgICAgICAgICAgJCgiI3Bhc3MxIikuaHRtbCgiIik7CiAgICAgICAgICAgICQoIiNwYXNzQ29uZmlybSIpLmh0bWwoIiIpOwoKCiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICB9KTsKCiAgICA8L3NjcmlwdD4KCiAgICA8c2NyaXB0PgoKICAgICAgICBmdW5jdGlvbiBwYXNzd29yZF9jaGVjayhldmVudCkKICAgICAgICB7CiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgICB2YXIgcGFzcyA9ICQoIiNwYXNzX3ZhbHVlIikudmFsKCk7CiAgICAgICAgICAgIHZhciBwYXNzd29yZCA9ICQoIiNkb2NfcGFzcyIpLnZhbCgpOwogICAgICAgICAgICB2YXIgZG9jRElkID0gJCgiI2RvY0RJZCIpLnZhbCgpOwogICAgICAgICAgICB2YXIgZnBhc3MgPSBTSEExKHBhc3MpOwoKICAgICAgICAgICAgaWYgKHBhc3N3b3JkID09IGZwYXNzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB3aW5kb3cub3BlbignZG93bmxvYWRkb2M/ZmlsZT0nICsgZG9jRElkKTsKICAgICAgICAgICAgICAgICQoJyNteU1vZGFsJykubW9kYWwoJ2hpZGUnKTsKCiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXNrRmFpbGVkKCI8P3BocCBlY2hvIGJhc2VuYW1lKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsgPz4iLCAiUGFzc3dvcmQgaXMgbm90IHZhbGlkIik7CgoKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNldERvd25sb2FkRG9jSWQoZG9jSWQpIHsKICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVEYXRhKCdteU1vZGFsJyk7CiAgICAgICAgICAgICQoIiNkb2NESWQiKS52YWwoZG9jSWQpOwogICAgICAgIH0KCiAgICA8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg=="));//Generated by Ampare PHP Encoder. For more security please use php protect before encode the php program

Function Calls

base64_decode 1

Variables

None

Stats

MD5 c36258ebd96207cf36e562f6442e167b
Eval Count 1
Decode Time 428 ms