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\']; ?> <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: </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: </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: </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: </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 |
Stats
MD5 | c36258ebd96207cf36e562f6442e167b |
Eval Count | 1 |
Decode Time | 428 ms |