<?php
header("Content-type: text/html; charset=utf8"); if(!isset($_SESSION['youtube_pro_user']) OR
$_SESSION['super_admin'] == 0) { }
include('../include/config.php');
include('../include/connect.php');
include('include/functions.php');
include('include/general.class.php');
$general = new General;
$general->set_connection($mysqli);
$options = $general->get_all_options();
$case = make_safe(xss_clean($_GET['case']));
$action = make_safe(xss_clean($_POST['action']));
if ($action == "sort_category"){
$records = $_POST['records'];
$counter = 1;
foreach ($records as $record) {
$sql = "UPDATE categories SET category_order='$counter' WHERE id='$record'";
$query = $mysqli->query($sql);
$counter = $counter + 1;
}
}
if ($action == "sort_pages"){
$records = $_POST['records'];
$counter = 1;
foreach ($records as $record) {
$sql = "UPDATE pages SET page_order='$counter' WHERE id='$record'";
$query = $mysqli->query($sql);
$counter = $counter + 1;
}
}
if ($action == "sort_links"){
$records = $_POST['records'];
$counter = 1;
foreach ($records as $record) {
$sql = "UPDATE links SET link_order='$counter' WHERE id='$record'";
$query = $mysqli->query($sql);
$counter = $counter + 1;
}
}
if ($case == "ajax_remove_from_list"){
$id = make_safe(xss_clean($_GET['id']));
$delete = $mysqli->query("DELETE FROM lists_video WHERE id='$id'");
if ($delete) {
echo 1;
} else {
echo 0;
}
}
}
if ($case == "video_details"){
$id = make_safe(xss_clean($_GET['id']));
?>
<div class="modal-dialog" id="media-details">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title">Video Details</h4>
</div>
<div class="modal-body">
<div class="embed-responsive embed-responsive-16by9">
<iframe src="http://w...content-available-to-author-only...e.com/embed/<?php echo $id; ?>"></iframe>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
<?php
}
if ($action == "sort_videos_list"){
$records = $_POST['records'];
$counter = 1;
foreach ($records as $record) {
$sql = "UPDATE lists_video SET video_order='$counter' WHERE id='$record'";
$query = $mysqli->query($sql);
$counter = $counter + 1;
}
}
if ($action == "youtube_channel_import") {
}
$sql = "SELECT * FROM channels WHERE id='$id' LIMIT 1";
$query = $mysqli->query($sql);
$row = $query->fetch_assoc();
$category_id = $row['category_id'];
$channel_id = $row['id'];
$channel_link = $row['link'];
$videos_number = $row['videos_number'];
if (strpos($channel_link,'/user/') != false) { $youtube_username = str_replace('/user/','',$u['path']); $baseUrl = 'https://w...content-available-to-author-only...s.com/youtube/v3/';
$apiKey = $options['api_youtube_apikey'];
$link = json_decode(file_get_contents('https://w...content-available-to-author-only...s.com/youtube/v3/channels?key='.$apiKey.'&forUsername='.$youtube_username.'&part=id'), true); $channelId = $link['items'][0]['id'];
} else {
$baseUrl = 'https://w...content-available-to-author-only...s.com/youtube/v3/';
$apiKey = $options['api_youtube_apikey'];
$youtube_username = str_replace('/channel/','',$u['path']); $channelId = $youtube_username;
}
$url = $baseUrl .'channels?' .
'id=' . $channelId .
'&part=contentDetails' .
'&key=' . $apiKey;
$playlist = $json['items'][0]['contentDetails']['relatedPlaylists']['uploads'];
$url = $baseUrl .'playlistItems?' .
'part=snippet' .
'&maxResults=' .$videos_number.
'&playlistId=' . $playlist .
'&key=' . $apiKey;
$video_id = $video['snippet']['resourceId']['videoId'];
if (!empty($video['snippet']['thumbnails']['standard']['url'])) { $video_thumbnail = $video['snippet']['thumbnails']['standard']['url'];
} else {
$video_thumbnail = $video['snippet']['thumbnails']['high']['url'];
}
$video_youtube_url = 'http://w...content-available-to-author-only...e.com/watch?v='.$video_id;
if (check_youtube_id($video_id) == 0) {
$videt = json_decode(file_get_contents('https://w...content-available-to-author-only...s.com/youtube/v3/videos?id='.$video_id.'&part=contentDetails&key='.$apiKey), true); $video_duration = $videt['items'][0]['contentDetails']['duration'];
$duration = youtube_duration($video_duration);
if (!empty($video_thumbnail)) { $thumb = $video_id.'.jpg';
} else {
$thumb = '';
}
if (count($video['snippet']['tags']) > 0) { $tags = implode(',',$video['snippet']['tags']); } else {
$tags = title_to_keywords($video['snippet']['title']);
}
$publish_time = youtube_date_to_unix($video['snippet']['publishedAt']);
$insert = $mysqli->query("INSERT INTO videos (user_id,youtube_id,channel_id,category_id,title,details,permalink,datetime,thumbnail,duration,tags,day,month,year,published,publish_time,tag_id,hits,deleted,votes_up,votes_down) VALUES ('$_SESSION[youtube_pro_user]','$video_id','$channel_id','$category_id','$video_title','$video_details','$video_youtube_url','$datetime','$thumb','$duration','$tags','$day','$month','$year','1','$publish_time','0','0','0','0','0')");
}
}
$mysqli->query("UPDATE channels SET latest_activity='$now' WHERE id='$id'");
}
// import single video
if ($action == "import_single_youtube_video") {
$id = make_safe($_POST['id']);
$category = make_safe($_POST['category']);
}
$baseUrl = 'https://w...content-available-to-author-only...s.com/youtube/v3/';
$apiKey = $options['api_youtube_apikey'];
$url = $baseUrl .'videos?' .
'id=' .$id.
'&part=snippet' .
'&key=' . $apiKey;
if (count($json['items']) == 0) { echo 'failure';
} else {
$video_title = htmlspecialchars($json['items'][0]['snippet']['title'],ENT_QUOTES); $video_details = htmlspecialchars($json['items'][0]['snippet']['description'],ENT_QUOTES); if (!empty($json['items'][0]['snippet']['thumbnails']['standard']['url'])) { $video_thumbnail = $json['items'][0]['snippet']['thumbnails']['standard']['url'];
} else {
$video_thumbnail = $json['items'][0]['snippet']['thumbnails']['high']['url'];
}
$video_youtube_url = 'http://w...content-available-to-author-only...e.com/watch?v='.$id;
$videt = json_decode(file_get_contents('https://w...content-available-to-author-only...s.com/youtube/v3/videos?id='.$id.'&part=contentDetails&key='.$apiKey), true); $video_duration = $videt['items'][0]['contentDetails']['duration'];
$duration = youtube_duration($video_duration);
if (check_youtube_id($id) == 0) {
if (!empty($video_thumbnail)) { $thumb = 'youtube_'.$id.'.jpg';
} else {
$thumb = '';
}
if (count($json['items'][0]['snippet']['tags']) > 0) { $tags = implode(',',$json['items'][0]['snippet']['tags']); } else {
$tags = title_to_keywords($json['items'][0]['snippet']['title']);
}
$publish_time = youtube_date_to_unix($json['items'][0]['snippet']['publishedAt']);
$insert = $mysqli->query("INSERT INTO videos
(youtube_id,user_id,category_id,title,details,permalink,datetime,thumbnail,duration,day,month,year,published,tags,publish_time,tag_id,channel_id,hits,deleted,votes_up,votes_down) VALUES
('$id','$_SESSION[youtube_pro_user]','$category','$video_title','$video_details','$video_youtube_url','$datetime','$thumb','$duration','$day','$month','$year','1','$tags','$publish_time','0','0','0','0','0','0')");
if ($insert) {
echo 'success';
} else {
echo 'failure';
}
} else {
echo 'failure';
}
}
}
if ($action == "import_channel_single_video") {
$category = make_safe
(xss_clean
(intval($_POST['category']))); $channel = make_safe
(xss_clean
(intval($_POST['channel']))); $id = make_safe(xss_clean($_POST['id']));
echo 'failure';
} elseif (check_youtube_id($id) > 0) {
echo 'failure';
} else {
$baseUrl = 'https://w...content-available-to-author-only...s.com/youtube/v3/';
$apiKey = $options['api_youtube_apikey'];
$url = $baseUrl.'videos?'.
'id='.$id.
'&part=snippet'.
'&key='.$apiKey;
if (count($json['items']) == 0) { echo 'failure';
} else {
$video_title = htmlspecialchars($json['items'][0]['snippet']['title'],ENT_QUOTES); $video_details = htmlspecialchars($json['items'][0]['snippet']['description'],ENT_QUOTES); if (!empty($json['items'][0]['snippet']['thumbnails']['standard']['url'])) { $video_thumbnail = $json['items'][0]['snippet']['thumbnails']['standard']['url'];
} else {
$video_thumbnail = $json['items'][0]['snippet']['thumbnails']['high']['url'];
}
$video_youtube_url = 'http://w...content-available-to-author-only...e.com/watch?v='.$id;
$videt = json_decode(file_get_contents('https://w...content-available-to-author-only...s.com/youtube/v3/videos?id='.$id.'&part=contentDetails&key='.$apiKey), true); $video_duration = $videt['items'][0]['contentDetails']['duration'];
$m = $matches[0][0];
$s = $matches[0][1];
$duration = ($m*60)+$s;
if (!empty($video_thumbnail)) { $thumb = 'youtube_'.$id.'.jpg';
} else {
$thumb = '';
}
if (count($json['items'][0]['snippet']['tags']) > 0) { $tags = implode(',',$json['items'][0]['snippet']['tags']); } else {
$tags = title_to_keywords($json['items'][0]['snippet']['title']);
}
$publish_time = youtube_date_to_unix($json['items'][0]['snippet']['publishedAt']);
$insert = $mysqli->query("INSERT INTO videos (youtube_id,user_id,category_id,channel_id,title,details,permalink,datetime,thumbnail,duration,day,month,year,published,tags,publish_time,tag_id,hits,deleted,votes_up,votes_down) VALUES ('$id','$_SESSION[youtube_pro_user]','$category','$channel','$video_title','$video_details','$video_youtube_url','$datetime','$thumb','$duration','$day','$month','$year','1','$tags','$publish_time','0','0','0','0','0')");
if ($insert) {
echo 1;
} else {
echo 'failure';
}
}
}
}
}
if ($case == 'channel_details') {
$id = make_safe($_GET['id']);
$baseUrl = 'https://w...content-available-to-author-only...s.com/youtube/v3/';
$apiKey = $options['api_youtube_apikey'];
$url = $baseUrl .'channels?' .
'id=' . $_GET['id'] .
'&part=snippet' .
'&key=' . $apiKey;
$urla = $baseUrl .'channels?' .
'id=' . $_GET['id'] .
'&part=statistics' .
'&key=' . $apiKey;
?>
<div class="modal-dialog" id="channel-details">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title">Channel Details</h4>
</div>
<div class="modal-body">
<table class="table">
<thead>
<tr>
<th>Field</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>Channel Name</td>
<td><?php echo $json['items'][0]['snippet']['title']; ?></td>
</tr>
<tr>
<td>Channel Description</td>
<td><?php echo $json['items'][0]['snippet']['description']; ?></td>
</tr>
<tr>
<td>Videos Number</td>
<td><?php echo $jsona['items'][0]['statistics']['videoCount']; ?></td>
</tr>
<tr>
<td>Subscribers Number</td>
<td><?php echo $jsona['items'][0]['statistics']['subscriberCount']; ?></td>
</tr>
<tr>
<td>Views Number</td>
<td><?php echo $jsona['items'][0]['statistics']['viewCount']; ?></td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
<?php
}
}
if ($action == 'import_single_channel') {
$id = make_safe($_POST['id']);
$category = make_safe($_POST['category']);
$baseUrl = 'https://w...content-available-to-author-only...s.com/youtube/v3/';
$apiKey = $options['api_youtube_apikey'];
$url = $baseUrl .'channels?' .
'id=' . $id.
'&part=snippet' .
'&key=' . $apiKey;
if (count($json['items']) != 0) { if (check_youtube_channel_id($json['items'][0]['id']) == 0) {
$title = $json['items'][0]['snippet']['title'];
$link = 'http://y...content-available-to-author-only...e.com/channel/'.$json['items'][0]['id'];
$sql = "INSERT INTO channels (title,link,category_id,videos_number,add_time,latest_activity,auto_update,auto_update_period,youtube_channel_id) VALUES ('$title','$link','$category','30','$datetime','0','0','0','$id')";
$query = $mysqli->query($sql);
if ($query) {
echo 'success';
} else {
echo 'failure';
}
} else {
echo 'failure';
}
} else {
echo 'failure';
}
} else {
echo 'failure';
}
}
if ($action == "import_multiple_videos") {
$category = intval($_POST['category']); $ids = explode(',',$_POST['myCheckboxes']); for ( $i=0; $i < count($ids); $i++) {
$baseUrl = 'https://w...content-available-to-author-only...s.com/youtube/v3/';
$apiKey = $options['api_youtube_apikey'];
$url = $baseUrl.'videos?'.
'id='.$ids[$i].
'&part=snippet'.
'&key='.$apiKey;
if (count($json['items']) != 0) { $video_title = htmlspecialchars($json['items'][0]['snippet']['title'],ENT_QUOTES); $video_details = htmlspecialchars($json['items'][0]['snippet']['description'],ENT_QUOTES); if (!empty($json['items'][0]['snippet']['thumbnails']['standard']['url'])) { $video_thumbnail = $json['items'][0]['snippet']['thumbnails']['standard']['url'];
} else {
$video_thumbnail = $json['items'][0]['snippet']['thumbnails']['high']['url'];
}
$video_youtube_url = 'http://w...content-available-to-author-only...e.com/watch?v='.$ids[$i];
$videt = json_decode(file_get_contents('https://w...content-available-to-author-only...s.com/youtube/v3/videos?id='.$ids[$i].'&part=contentDetails&key='.$apiKey), true); $video_duration = $videt['items'][0]['contentDetails']['duration'];
$m = $matches[0][0];
$s = $matches[0][1];
$duration = ($m*60)+$s;
if (!empty($video_thumbnail)) { $thumb = 'youtube_'.$ids[$i].'.jpg';
} else {
$thumb = '';
}
if (count($json['items'][0]['snippet']['tags']) > 0) { $tags = implode(',',$json['items'][0]['snippet']['tags']); } else {
$tags = title_to_keywords($json['items'][0]['snippet']['title']);
}
$publish_time = youtube_date_to_unix($json['items'][0]['snippet']['publishedAt']);
$insert = $mysqli->query("INSERT INTO videos (youtube_id,user_id,category_id,title,details,permalink,datetime,thumbnail,duration,day,month,year,published,tags,publish_time,channel_id,tag_id,hits,deleted,votes_up,votes_down) VALUES ('$ids[$i]','$_SESSION[youtube_pro_user]','$category','$video_title','$video_details','$video_youtube_url','$datetime','$thumb','$duration','$day','$month','$year','1','$tags','$publish_time','0','0','0','0','0','0')");
}
}
}
if ($action == "import_multiple_videos_from_channel") {
$category = intval($_POST['category']); $channel_id = intval($_POST['channel_id']); $ids = explode(',',$_POST['myCheckboxes']); for ( $i=0; $i < count($ids); $i++) {
$baseUrl = 'https://w...content-available-to-author-only...s.com/youtube/v3/';
$apiKey = $options['api_youtube_apikey'];
$url = $baseUrl.'videos?'.
'id='.$ids[$i].
'&part=snippet'.
'&key='.$apiKey;
if (count($json['items']) != 0) { $video_title = htmlspecialchars($json['items'][0]['snippet']['title'],ENT_QUOTES); $video_details = htmlspecialchars($json['items'][0]['snippet']['description'],ENT_QUOTES); if (!empty($json['items'][0]['snippet']['thumbnails']['standard']['url'])) { $video_thumbnail = $json['items'][0]['snippet']['thumbnails']['standard']['url'];
} else {
$video_thumbnail = $json['items'][0]['snippet']['thumbnails']['high']['url'];
}
$video_youtube_url = 'http://w...content-available-to-author-only...e.com/watch?v='.$ids[$i];
$videt = json_decode(file_get_contents('https://w...content-available-to-author-only...s.com/youtube/v3/videos?id='.$ids[$i].'&part=contentDetails&key='.$apiKey), true); $video_duration = $videt['items'][0]['contentDetails']['duration'];
$m = $matches[0][0];
$s = $matches[0][1];
$duration = ($m*60)+$s;
if (!empty($video_thumbnail)) { $thumb = 'youtube_'.$ids[$i].'.jpg';
} else {
$thumb = '';
}
if (count($json['items'][0]['snippet']['tags']) > 0) { $tags = implode(',',$json['items'][0]['snippet']['tags']); } else {
$tags = title_to_keywords($json['items'][0]['snippet']['title']);
}
$publish_time = youtube_date_to_unix($json['items'][0]['snippet']['publishedAt']);
$insert = $mysqli->query("INSERT INTO videos (youtube_id,user_id,category_id,channel_id,title,details,permalink,datetime,thumbnail,duration,day,month,year,published,tags,publish_time,tag_id,hits,deleted,votes_up,votes_down) VALUES ('$ids[$i]','$_SESSION[youtube_pro_user]','$category','$channel_id','$video_title','$video_details','$video_youtube_url','$datetime','$thumb','$duration','$day','$month','$year','1','$tags','$publish_time','0','0','0','0','0')");
}
}
}
if ($action == "youtube_tag_import") {
$tag = $general->tag($id);
if ($tag != 0) {
$tag_id = $tag['id'];
$category_id = $tag['category_id'];
$max_results = $tag['videos_number'];
$youtube_category = $tag['youtube_category'];
$baseUrl = 'https://w...content-available-to-author-only...s.com/youtube/v3/';
$apiKey = $options['api_youtube_apikey'];
$url = $baseUrl ."search?q=$tag_title&maxResults=$max_results&order=date&part=snippet&type=video";
if ($youtube_category != 0) {
$url .= "&videoCategoryId=$youtube_category";
}
$url .= "&key=$apiKey";
$video_id = $video['id']['videoId'];
if (!empty($video['snippet']['thumbnails']['standard']['url'])) { $video_thumbnail = $video['snippet']['thumbnails']['standard']['url'];
} else {
$video_thumbnail = $video['snippet']['thumbnails']['high']['url'];
}
$video_youtube_url = 'http://w...content-available-to-author-only...e.com/watch?v='.$video_id;
if (check_youtube_id($video_id) == 0) {
$videt = json_decode(file_get_contents('https://w...content-available-to-author-only...s.com/youtube/v3/videos?id='.$video_id.'&part=contentDetails&key='.$apiKey), true); $video_duration = $videt['items'][0]['contentDetails']['duration'];
$duration = youtube_duration($video_duration);
if (!empty($video_thumbnail)) { $thumb = $video_id.'.jpg';
} else {
$thumb = '';
}
if (count($video['snippet']['tags']) > 0) { $tags = implode(',',$video['snippet']['tags']); } else {
$tags = title_to_keywords($video['snippet']['title']);
}
$publish_time = youtube_date_to_unix($video['snippet']['publishedAt']);
$insert = $mysqli->query("INSERT INTO videos (user_id,youtube_id,tag_id,category_id,title,details,permalink,datetime,thumbnail,duration,tags,day,month,year,published,publish_time,channel_id,hits,deleted,votes_up,votes_down) VALUES ('$_SESSION[youtube_pro_user]','$video_id','$tag_id','$category_id','$video_title','$video_details','$video_youtube_url','$datetime','$thumb','$duration','$tags','$day','$month','$year','1','$publish_time','0','0','0','0','0')");
}
}
$mysqli->query("UPDATE tags SET latest_activity='$now' WHERE id='$id'");
}
}
PD9waHAKc2Vzc2lvbl9zdGFydCgpOwpoZWFkZXIoIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0ZjgiKTsKc2V0X3RpbWVfbGltaXQoNjAwMDAqNjApOwplcnJvcl9yZXBvcnRpbmcoRV9FUlJPUik7CmlmKCFpc3NldCgkX1NFU1NJT05bJ3lvdXR1YmVfcHJvX3VzZXInXSkgT1IgJF9TRVNTSU9OWydzdXBlcl9hZG1pbiddID09IDApIHsKaGVhZGVyKCJsb2NhdGlvbjpsb2dpbi5waHAiKTsKZXhpdDsKfQppbmNsdWRlKCcuLi9pbmNsdWRlL2NvbmZpZy5waHAnKTsKaW5jbHVkZSgnLi4vaW5jbHVkZS9jb25uZWN0LnBocCcpOwppbmNsdWRlKCdpbmNsdWRlL2Z1bmN0aW9ucy5waHAnKTsKaW5jbHVkZSgnaW5jbHVkZS9nZW5lcmFsLmNsYXNzLnBocCcpOwokZ2VuZXJhbCA9IG5ldyBHZW5lcmFsOwokZ2VuZXJhbC0+c2V0X2Nvbm5lY3Rpb24oJG15c3FsaSk7CiRvcHRpb25zID0gJGdlbmVyYWwtPmdldF9hbGxfb3B0aW9ucygpOwokY2FzZSA9IG1ha2Vfc2FmZSh4c3NfY2xlYW4oJF9HRVRbJ2Nhc2UnXSkpOwokYWN0aW9uID0gbWFrZV9zYWZlKHhzc19jbGVhbigkX1BPU1RbJ2FjdGlvbiddKSk7IAppZiAoJGFjdGlvbiA9PSAic29ydF9jYXRlZ29yeSIpewoJJHJlY29yZHMgPSAkX1BPU1RbJ3JlY29yZHMnXTsKCSRjb3VudGVyID0gMTsKCWZvcmVhY2ggKCRyZWNvcmRzIGFzICRyZWNvcmQpIHsKCQkkc3FsID0gIlVQREFURSBjYXRlZ29yaWVzIFNFVCBjYXRlZ29yeV9vcmRlcj0nJGNvdW50ZXInIFdIRVJFIGlkPSckcmVjb3JkJyI7CgkJJHF1ZXJ5ID0gJG15c3FsaS0+cXVlcnkoJHNxbCk7CgkJJGNvdW50ZXIgPSAkY291bnRlciArIDE7CQoJfQp9CmlmICgkYWN0aW9uID09ICJzb3J0X3BhZ2VzIil7CgkkcmVjb3JkcyA9ICRfUE9TVFsncmVjb3JkcyddOwoJJGNvdW50ZXIgPSAxOwoJZm9yZWFjaCAoJHJlY29yZHMgYXMgJHJlY29yZCkgewoJCSRzcWwgPSAiVVBEQVRFIHBhZ2VzIFNFVCBwYWdlX29yZGVyPSckY291bnRlcicgV0hFUkUgaWQ9JyRyZWNvcmQnIjsKCQkkcXVlcnkgPSAkbXlzcWxpLT5xdWVyeSgkc3FsKTsKCQkkY291bnRlciA9ICRjb3VudGVyICsgMTsJCgl9Cn0KCmlmICgkYWN0aW9uID09ICJzb3J0X2xpbmtzIil7CgkkcmVjb3JkcyA9ICRfUE9TVFsncmVjb3JkcyddOwoJJGNvdW50ZXIgPSAxOwoJZm9yZWFjaCAoJHJlY29yZHMgYXMgJHJlY29yZCkgewoJCSRzcWwgPSAiVVBEQVRFIGxpbmtzIFNFVCBsaW5rX29yZGVyPSckY291bnRlcicgV0hFUkUgaWQ9JyRyZWNvcmQnIjsKCQkkcXVlcnkgPSAkbXlzcWxpLT5xdWVyeSgkc3FsKTsKCQkkY291bnRlciA9ICRjb3VudGVyICsgMTsJCgl9Cn0KaWYgKCRjYXNlID09ICJhamF4X3JlbW92ZV9mcm9tX2xpc3QiKXsKaWYgKGlzc2V0KCRfR0VUKSkgewokaWQgPSBtYWtlX3NhZmUoeHNzX2NsZWFuKCRfR0VUWydpZCddKSk7CiRkZWxldGUgPSAkbXlzcWxpLT5xdWVyeSgiREVMRVRFIEZST00gbGlzdHNfdmlkZW8gV0hFUkUgaWQ9JyRpZCciKTsKaWYgKCRkZWxldGUpIHsKZWNobyAxOwkKfSBlbHNlIHsKZWNobyAwOwkKfQp9Cn0KCmlmICgkY2FzZSA9PSAidmlkZW9fZGV0YWlscyIpewokaWQgPSBtYWtlX3NhZmUoeHNzX2NsZWFuKCRfR0VUWydpZCddKSk7Cj8+CjxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyIgaWQ9Im1lZGlhLWRldGFpbHMiPgoJCTxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgoJCTxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CgkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9idXR0b24+CgkJCTxoNCBjbGFzcz0ibW9kYWwtdGl0bGUiPlZpZGVvIERldGFpbHM8L2g0PgoJCTwvZGl2PgoJCTxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgoJCQk8ZGl2IGNsYXNzPSJlbWJlZC1yZXNwb25zaXZlIGVtYmVkLXJlc3BvbnNpdmUtMTZieTkiPgoJCQk8aWZyYW1lIHNyYz0iaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tL2VtYmVkLzw/cGhwIGVjaG8gJGlkOyA/PiI+PC9pZnJhbWU+CgkJCTwvZGl2PgoJCTwvZGl2PgoJCTxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CgkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgoJCTwvZGl2PgoJCTwvZGl2Pgo8L2Rpdj4KPD9waHAKfQoKaWYgKCRhY3Rpb24gPT0gInNvcnRfdmlkZW9zX2xpc3QiKXsKCSRyZWNvcmRzID0gJF9QT1NUWydyZWNvcmRzJ107CgkkY291bnRlciA9IDE7Cglmb3JlYWNoICgkcmVjb3JkcyBhcyAkcmVjb3JkKSB7CgkJJHNxbCA9ICJVUERBVEUgbGlzdHNfdmlkZW8gU0VUIHZpZGVvX29yZGVyPSckY291bnRlcicgV0hFUkUgaWQ9JyRyZWNvcmQnIjsKCQkkcXVlcnkgPSAkbXlzcWxpLT5xdWVyeSgkc3FsKTsKCQkkY291bnRlciA9ICRjb3VudGVyICsgMTsJCgl9Cn0KaWYgKCRhY3Rpb24gPT0gInlvdXR1YmVfY2hhbm5lbF9pbXBvcnQiKSB7CgkKCSRpZCA9IGludHZhbCgkX1BPU1RbJ2lkJ10pOwoJaWYgKGVtcHR5KCRpZCkpIHsKCWhlYWRlcigibG9jYXRpb246bG9naW4ucGhwIik7Cgl9Cgkkc3FsID0gIlNFTEVDVCAqIEZST00gY2hhbm5lbHMgV0hFUkUgaWQ9JyRpZCcgTElNSVQgMSI7CgkkcXVlcnkgPSAkbXlzcWxpLT5xdWVyeSgkc3FsKTsKCSRyb3cgPSAkcXVlcnktPmZldGNoX2Fzc29jKCk7CgkkY2F0ZWdvcnlfaWQgPSAkcm93WydjYXRlZ29yeV9pZCddOwoJJGNoYW5uZWxfaWQgPSAkcm93WydpZCddOwoJJGNoYW5uZWxfbGluayA9ICRyb3dbJ2xpbmsnXTsKCSR2aWRlb3NfbnVtYmVyID0gJHJvd1sndmlkZW9zX251bWJlciddOwoJJGRheSA9IGRhdGUoJ2onKTsKCSRtb250aCA9IGRhdGUoJ24nKTsKCSR5ZWFyID0gZGF0ZSgnWScpOwoJJHUgPSBwYXJzZV91cmwoJGNoYW5uZWxfbGluayk7CglpZiAoc3RycG9zKCRjaGFubmVsX2xpbmssJy91c2VyLycpICE9IGZhbHNlKSB7CgkkeW91dHViZV91c2VybmFtZSA9IHN0cl9yZXBsYWNlKCcvdXNlci8nLCcnLCR1WydwYXRoJ10pOwoJJGJhc2VVcmwgPSAnaHR0cHM6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS95b3V0dWJlL3YzLyc7CgkkYXBpS2V5ID0gJG9wdGlvbnNbJ2FwaV95b3V0dWJlX2FwaWtleSddOwoJJGxpbmsgPSBqc29uX2RlY29kZShmaWxlX2dldF9jb250ZW50cygnaHR0cHM6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS95b3V0dWJlL3YzL2NoYW5uZWxzP2tleT0nLiRhcGlLZXkuJyZmb3JVc2VybmFtZT0nLiR5b3V0dWJlX3VzZXJuYW1lLicmcGFydD1pZCcpLCB0cnVlKTsKCSRjaGFubmVsSWQgPSAkbGlua1snaXRlbXMnXVswXVsnaWQnXTsKCX0gZWxzZSB7CgkkYmFzZVVybCA9ICdodHRwczovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMuY29tL3lvdXR1YmUvdjMvJzsKCSRhcGlLZXkgPSAkb3B0aW9uc1snYXBpX3lvdXR1YmVfYXBpa2V5J107CgkkeW91dHViZV91c2VybmFtZSA9IHN0cl9yZXBsYWNlKCcvY2hhbm5lbC8nLCcnLCR1WydwYXRoJ10pOwkKCSRjaGFubmVsSWQgPSAkeW91dHViZV91c2VybmFtZTsKCX0KCSR1cmwgPSAkYmFzZVVybCAuJ2NoYW5uZWxzPycgLgogICAgJ2lkPScgLiAkY2hhbm5lbElkIC4KICAgICcmcGFydD1jb250ZW50RGV0YWlscycgLiAKICAgICcma2V5PScgLiAkYXBpS2V5OwoJJGpzb24gPSBqc29uX2RlY29kZShmaWxlX2dldF9jb250ZW50cygkdXJsKSwgdHJ1ZSk7CgkgCgkkcGxheWxpc3QgPSAkanNvblsnaXRlbXMnXVswXVsnY29udGVudERldGFpbHMnXVsncmVsYXRlZFBsYXlsaXN0cyddWyd1cGxvYWRzJ107CgkgCgkkdXJsID0gJGJhc2VVcmwgLidwbGF5bGlzdEl0ZW1zPycgLgoJICdwYXJ0PXNuaXBwZXQnIC4KCSAnJm1heFJlc3VsdHM9JyAuJHZpZGVvc19udW1iZXIuCgkgJyZwbGF5bGlzdElkPScgLiAkcGxheWxpc3QgLgoJICcma2V5PScgLiAkYXBpS2V5OwoJJGpzb24gPSBqc29uX2RlY29kZShmaWxlX2dldF9jb250ZW50cygkdXJsKSwgdHJ1ZSk7Cglmb3JlYWNoKGFycmF5X3JldmVyc2UoJGpzb25bJ2l0ZW1zJ10pIGFzICR2aWRlbykgewoJCSR2aWRlb19pZCA9ICR2aWRlb1snc25pcHBldCddWydyZXNvdXJjZUlkJ11bJ3ZpZGVvSWQnXTsKCQkkdmlkZW9fdGl0bGUgPSBodG1sc3BlY2lhbGNoYXJzKCR2aWRlb1snc25pcHBldCddWyd0aXRsZSddLEVOVF9RVU9URVMpOwoJCSR2aWRlb19kZXRhaWxzID0gaHRtbHNwZWNpYWxjaGFycygkdmlkZW9bJ3NuaXBwZXQnXVsnZGVzY3JpcHRpb24nXSxFTlRfUVVPVEVTKTsKCQlpZiAoIWVtcHR5KCR2aWRlb1snc25pcHBldCddWyd0aHVtYm5haWxzJ11bJ3N0YW5kYXJkJ11bJ3VybCddKSkgewoJCSR2aWRlb190aHVtYm5haWwgPSAkdmlkZW9bJ3NuaXBwZXQnXVsndGh1bWJuYWlscyddWydzdGFuZGFyZCddWyd1cmwnXTsKCQl9IGVsc2UgewoJCSR2aWRlb190aHVtYm5haWwgPSAkdmlkZW9bJ3NuaXBwZXQnXVsndGh1bWJuYWlscyddWydoaWdoJ11bJ3VybCddOwkKCQl9CgkJJHZpZGVvX3lvdXR1YmVfdXJsID0gJ2h0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS93YXRjaD92PScuJHZpZGVvX2lkOwoJCWlmIChjaGVja195b3V0dWJlX2lkKCR2aWRlb19pZCkgPT0gMCkgewoJCSR2aWRldCA9IGpzb25fZGVjb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCdodHRwczovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMuY29tL3lvdXR1YmUvdjMvdmlkZW9zP2lkPScuJHZpZGVvX2lkLicmcGFydD1jb250ZW50RGV0YWlscyZrZXk9Jy4kYXBpS2V5KSwgdHJ1ZSk7CgkJJHZpZGVvX2R1cmF0aW9uID0gJHZpZGV0WydpdGVtcyddWzBdWydjb250ZW50RGV0YWlscyddWydkdXJhdGlvbiddOwoJCSRkdXJhdGlvbiA9IHlvdXR1YmVfZHVyYXRpb24oJHZpZGVvX2R1cmF0aW9uKTsKCQkkZGF0ZXRpbWUgPSB0aW1lKCk7CgkJaWYgKCFlbXB0eSgkdmlkZW9fdGh1bWJuYWlsKSkgewoJCSR0aHVtYiA9ICR2aWRlb19pZC4nLmpwZyc7CgkJJHVwID0gZmlsZV9wdXRfY29udGVudHMoJy4uL3VwbG9hZC92aWRlb3MvJy4kdGh1bWIsZmlsZV9nZXRfY29udGVudHMoJHZpZGVvX3RodW1ibmFpbCkpOwkKCQl9IGVsc2UgewoJCSR0aHVtYiA9ICcnOwkKCQl9CgkJaWYgKGNvdW50KCR2aWRlb1snc25pcHBldCddWyd0YWdzJ10pID4gMCkgewoJCQkkdGFncyA9IGltcGxvZGUoJywnLCR2aWRlb1snc25pcHBldCddWyd0YWdzJ10pOwoJCX0gZWxzZSB7CgkJCSR0YWdzID0gdGl0bGVfdG9fa2V5d29yZHMoJHZpZGVvWydzbmlwcGV0J11bJ3RpdGxlJ10pOwoJCX0KCQkkcHVibGlzaF90aW1lID0geW91dHViZV9kYXRlX3RvX3VuaXgoJHZpZGVvWydzbmlwcGV0J11bJ3B1Ymxpc2hlZEF0J10pOwoJCSRkYXRldGltZSA9IHRpbWUoKTsKCQkkZGF5ID0gZGF0ZSgnaicpOwoJCSRtb250aCA9IGRhdGUoJ24nKTsKCQkkeWVhciA9IGRhdGUoJ1knKTsKCQkkaW5zZXJ0ID0gJG15c3FsaS0+cXVlcnkoIklOU0VSVCBJTlRPIHZpZGVvcyAodXNlcl9pZCx5b3V0dWJlX2lkLGNoYW5uZWxfaWQsY2F0ZWdvcnlfaWQsdGl0bGUsZGV0YWlscyxwZXJtYWxpbmssZGF0ZXRpbWUsdGh1bWJuYWlsLGR1cmF0aW9uLHRhZ3MsZGF5LG1vbnRoLHllYXIscHVibGlzaGVkLHB1Ymxpc2hfdGltZSx0YWdfaWQsaGl0cyxkZWxldGVkLHZvdGVzX3VwLHZvdGVzX2Rvd24pIFZBTFVFUyAoJyRfU0VTU0lPTlt5b3V0dWJlX3Byb191c2VyXScsJyR2aWRlb19pZCcsJyRjaGFubmVsX2lkJywnJGNhdGVnb3J5X2lkJywnJHZpZGVvX3RpdGxlJywnJHZpZGVvX2RldGFpbHMnLCckdmlkZW9feW91dHViZV91cmwnLCckZGF0ZXRpbWUnLCckdGh1bWInLCckZHVyYXRpb24nLCckdGFncycsJyRkYXknLCckbW9udGgnLCckeWVhcicsJzEnLCckcHVibGlzaF90aW1lJywnMCcsJzAnLCcwJywnMCcsJzAnKSIpOwoJCX0gCgl9CQoJCgkKCSRub3cgPSB0aW1lKCk7CgkkbXlzcWxpLT5xdWVyeSgiVVBEQVRFIGNoYW5uZWxzIFNFVCBsYXRlc3RfYWN0aXZpdHk9JyRub3cnIFdIRVJFIGlkPSckaWQnIik7Cn0KCgovLyBpbXBvcnQgc2luZ2xlIHZpZGVvCmlmICgkYWN0aW9uID09ICJpbXBvcnRfc2luZ2xlX3lvdXR1YmVfdmlkZW8iKSB7CgkkaWQgPSBtYWtlX3NhZmUoJF9QT1NUWydpZCddKTsKCSRjYXRlZ29yeSA9IG1ha2Vfc2FmZSgkX1BPU1RbJ2NhdGVnb3J5J10pOwoJaWYgKGVtcHR5KCRpZCkpIHsKCWhlYWRlcigibG9jYXRpb246bG9naW4ucGhwIik7Cgl9CgkJJGJhc2VVcmwgPSAnaHR0cHM6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS95b3V0dWJlL3YzLyc7CgkJJGFwaUtleSA9ICRvcHRpb25zWydhcGlfeW91dHViZV9hcGlrZXknXTsKCQkkdXJsID0gJGJhc2VVcmwgLid2aWRlb3M/JyAuCgkJCQknaWQ9JyAuJGlkLgoJCQkJJyZwYXJ0PXNuaXBwZXQnIC4gCgkJCQknJmtleT0nIC4gJGFwaUtleTsKCQkkanNvbiA9IGpzb25fZGVjb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmwpLCB0cnVlKTsKCQlpZiAoY291bnQoJGpzb25bJ2l0ZW1zJ10pID09IDApIHsKCQllY2hvICdmYWlsdXJlJzsJCgkJfSBlbHNlIHsJCQkKCQkkdmlkZW9fdGl0bGUgPSBodG1sc3BlY2lhbGNoYXJzKCRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3RpdGxlJ10sRU5UX1FVT1RFUyk7CgkJJHZpZGVvX2RldGFpbHMgPSBodG1sc3BlY2lhbGNoYXJzKCRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ2Rlc2NyaXB0aW9uJ10sRU5UX1FVT1RFUyk7CgkJaWYgKCFlbXB0eSgkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWyd0aHVtYm5haWxzJ11bJ3N0YW5kYXJkJ11bJ3VybCddKSkgewoJCSR2aWRlb190aHVtYm5haWwgPSAkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWyd0aHVtYm5haWxzJ11bJ3N0YW5kYXJkJ11bJ3VybCddOwoJCX0gZWxzZSB7CgkJJHZpZGVvX3RodW1ibmFpbCA9ICRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3RodW1ibmFpbHMnXVsnaGlnaCddWyd1cmwnXTsJCgkJfQoJCSR2aWRlb195b3V0dWJlX3VybCA9ICdodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vd2F0Y2g/dj0nLiRpZDsKCQkkdmlkZXQgPSBqc29uX2RlY29kZShmaWxlX2dldF9jb250ZW50cygnaHR0cHM6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS95b3V0dWJlL3YzL3ZpZGVvcz9pZD0nLiRpZC4nJnBhcnQ9Y29udGVudERldGFpbHMma2V5PScuJGFwaUtleSksIHRydWUpOwoJCSR2aWRlb19kdXJhdGlvbiA9ICR2aWRldFsnaXRlbXMnXVswXVsnY29udGVudERldGFpbHMnXVsnZHVyYXRpb24nXTsKCQkkZHVyYXRpb24gPSB5b3V0dWJlX2R1cmF0aW9uKCR2aWRlb19kdXJhdGlvbik7CgkJaWYgKGNoZWNrX3lvdXR1YmVfaWQoJGlkKSA9PSAwKSB7CgkJJGRhdGV0aW1lID0gdGltZSgpOwoJCSRkYXkgPSBkYXRlKCdqJyk7CgkJJG1vbnRoID0gZGF0ZSgnbicpOwoJCSR5ZWFyID0gZGF0ZSgnWScpOwoJCWlmICghZW1wdHkoJHZpZGVvX3RodW1ibmFpbCkpIHsKCQkkdGh1bWIgPSAneW91dHViZV8nLiRpZC4nLmpwZyc7CgkJJHVwID0gZmlsZV9wdXRfY29udGVudHMoJy4uL3VwbG9hZC92aWRlb3MvJy4kdGh1bWIsZmlsZV9nZXRfY29udGVudHMoJHZpZGVvX3RodW1ibmFpbCkpOwkKCQl9IGVsc2UgewoJCSR0aHVtYiA9ICcnOwkKCQl9CgkJaWYgKGNvdW50KCRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3RhZ3MnXSkgPiAwKSB7CgkJCSR0YWdzID0gaW1wbG9kZSgnLCcsJGpzb25bJ2l0ZW1zJ11bMF1bJ3NuaXBwZXQnXVsndGFncyddKTsKCQl9IGVsc2UgewoJCQkkdGFncyA9IHRpdGxlX3RvX2tleXdvcmRzKCRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3RpdGxlJ10pOwoJCX0KCQkkcHVibGlzaF90aW1lID0geW91dHViZV9kYXRlX3RvX3VuaXgoJGpzb25bJ2l0ZW1zJ11bMF1bJ3NuaXBwZXQnXVsncHVibGlzaGVkQXQnXSk7CgkJJGRhdGV0aW1lID0gdGltZSgpOwoJCSRkYXkgPSBkYXRlKCdqJyk7CgkJJG1vbnRoID0gZGF0ZSgnbicpOwoJCSR5ZWFyID0gZGF0ZSgnWScpOwoJCSRpbnNlcnQgPSAkbXlzcWxpLT5xdWVyeSgiSU5TRVJUIElOVE8gdmlkZW9zIAoJCSh5b3V0dWJlX2lkLHVzZXJfaWQsY2F0ZWdvcnlfaWQsdGl0bGUsZGV0YWlscyxwZXJtYWxpbmssZGF0ZXRpbWUsdGh1bWJuYWlsLGR1cmF0aW9uLGRheSxtb250aCx5ZWFyLHB1Ymxpc2hlZCx0YWdzLHB1Ymxpc2hfdGltZSx0YWdfaWQsY2hhbm5lbF9pZCxoaXRzLGRlbGV0ZWQsdm90ZXNfdXAsdm90ZXNfZG93bikgVkFMVUVTIAoJCSgnJGlkJywnJF9TRVNTSU9OW3lvdXR1YmVfcHJvX3VzZXJdJywnJGNhdGVnb3J5JywnJHZpZGVvX3RpdGxlJywnJHZpZGVvX2RldGFpbHMnLCckdmlkZW9feW91dHViZV91cmwnLCckZGF0ZXRpbWUnLCckdGh1bWInLCckZHVyYXRpb24nLCckZGF5JywnJG1vbnRoJywnJHllYXInLCcxJywnJHRhZ3MnLCckcHVibGlzaF90aW1lJywnMCcsJzAnLCcwJywnMCcsJzAnLCcwJykiKTsKCQlpZiAoJGluc2VydCkgewoJCWVjaG8gJ3N1Y2Nlc3MnOwkKCQl9IGVsc2UgewoJCWVjaG8gJ2ZhaWx1cmUnOwkKCQl9CgkJfSBlbHNlIHsKCQllY2hvICdmYWlsdXJlJzsJCgkJfQoJCX0KfQoKCgppZiAoJGFjdGlvbiA9PSAiaW1wb3J0X2NoYW5uZWxfc2luZ2xlX3ZpZGVvIikgewppZiAoaXNzZXQoJF9QT1NUKSkgewoJCSRjYXRlZ29yeSA9IG1ha2Vfc2FmZSh4c3NfY2xlYW4oaW50dmFsKCRfUE9TVFsnY2F0ZWdvcnknXSkpKTsKCQkkY2hhbm5lbCA9IG1ha2Vfc2FmZSh4c3NfY2xlYW4oaW50dmFsKCRfUE9TVFsnY2hhbm5lbCddKSkpOwkJCQoJCSRpZCA9IG1ha2Vfc2FmZSh4c3NfY2xlYW4oJF9QT1NUWydpZCddKSk7CgkJJGRhdGV0aW1lID0gdGltZSgpOwoJCSRkYXkgPSBkYXRlKCdqJyk7CgkJJG1vbnRoID0gZGF0ZSgnbicpOwoJCSR5ZWFyID0gZGF0ZSgnWScpOwoJCWlmIChlbXB0eSgkaWQpKSB7CgkJZWNobyAnZmFpbHVyZSc7CQoJCX0gZWxzZWlmIChjaGVja195b3V0dWJlX2lkKCRpZCkgPiAwKSB7CgkJZWNobyAnZmFpbHVyZSc7CQoJCX0gZWxzZSB7CQkJCQoJCQkJJGJhc2VVcmwgPSAnaHR0cHM6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS95b3V0dWJlL3YzLyc7CgkJCQkkYXBpS2V5ID0gJG9wdGlvbnNbJ2FwaV95b3V0dWJlX2FwaWtleSddOwoJCQkJJHVybCA9ICRiYXNlVXJsLid2aWRlb3M/Jy4KCQkJCQkJJ2lkPScuJGlkLgoJCQkJCQknJnBhcnQ9c25pcHBldCcuIAoJCQkJCQknJmtleT0nLiRhcGlLZXk7CgkJCQkkanNvbiA9IGpzb25fZGVjb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmwpLCB0cnVlKTsKCQkJCWlmIChjb3VudCgkanNvblsnaXRlbXMnXSkgPT0gMCkgewoJCQkJZWNobyAnZmFpbHVyZSc7CQoJCQkJfSBlbHNlIHsKCQkJCSR2aWRlb190aXRsZSA9IGh0bWxzcGVjaWFsY2hhcnMoJGpzb25bJ2l0ZW1zJ11bMF1bJ3NuaXBwZXQnXVsndGl0bGUnXSxFTlRfUVVPVEVTKTsKCQkJCSR2aWRlb19kZXRhaWxzID0gaHRtbHNwZWNpYWxjaGFycygkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWydkZXNjcmlwdGlvbiddLEVOVF9RVU9URVMpOwoJCQkJaWYgKCFlbXB0eSgkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWyd0aHVtYm5haWxzJ11bJ3N0YW5kYXJkJ11bJ3VybCddKSkgewoJCQkJJHZpZGVvX3RodW1ibmFpbCA9ICRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3RodW1ibmFpbHMnXVsnc3RhbmRhcmQnXVsndXJsJ107CgkJCQl9IGVsc2UgewoJCQkJJHZpZGVvX3RodW1ibmFpbCA9ICRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3RodW1ibmFpbHMnXVsnaGlnaCddWyd1cmwnXTsJCgkJCQl9CgkJCQkkdmlkZW9feW91dHViZV91cmwgPSAnaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tL3dhdGNoP3Y9Jy4kaWQ7CgkJCQkkdmlkZXQgPSBqc29uX2RlY29kZShmaWxlX2dldF9jb250ZW50cygnaHR0cHM6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS95b3V0dWJlL3YzL3ZpZGVvcz9pZD0nLiRpZC4nJnBhcnQ9Y29udGVudERldGFpbHMma2V5PScuJGFwaUtleSksIHRydWUpOwoJCQkJJHZpZGVvX2R1cmF0aW9uID0gJHZpZGV0WydpdGVtcyddWzBdWydjb250ZW50RGV0YWlscyddWydkdXJhdGlvbiddOwoJCQkJcHJlZ19tYXRjaF9hbGwoJyFcZCshJywgJHZpZGVvX2R1cmF0aW9uLCAkbWF0Y2hlcyk7CgkJCQkkbSA9ICRtYXRjaGVzWzBdWzBdOwoJCQkJJHMgPSAkbWF0Y2hlc1swXVsxXTsKCQkJCSRkdXJhdGlvbiA9ICgkbSo2MCkrJHM7CgkJCQlpZiAoIWVtcHR5KCR2aWRlb190aHVtYm5haWwpKSB7CgkJCQkkdGh1bWIgPSAneW91dHViZV8nLiRpZC4nLmpwZyc7CgkJCQkkdXAgPSBmaWxlX3B1dF9jb250ZW50cygnLi4vdXBsb2FkL3ZpZGVvcy8nLiR0aHVtYixmaWxlX2dldF9jb250ZW50cygkdmlkZW9fdGh1bWJuYWlsKSk7CQoJCQkJfSBlbHNlIHsKCQkJCSR0aHVtYiA9ICcnOwkKCQkJCX0KCQkJCWlmIChjb3VudCgkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWyd0YWdzJ10pID4gMCkgewoJCQkJCSR0YWdzID0gaW1wbG9kZSgnLCcsJGpzb25bJ2l0ZW1zJ11bMF1bJ3NuaXBwZXQnXVsndGFncyddKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHRhZ3MgPSB0aXRsZV90b19rZXl3b3JkcygkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWyd0aXRsZSddKTsKCQkJCX0KCQkJCSRwdWJsaXNoX3RpbWUgPSB5b3V0dWJlX2RhdGVfdG9fdW5peCgkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWydwdWJsaXNoZWRBdCddKTsKCQkJCSRkYXRldGltZSA9IHRpbWUoKTsKCQkJCSRkYXkgPSBkYXRlKCdqJyk7CgkJCQkkbW9udGggPSBkYXRlKCduJyk7CgkJCQkkeWVhciA9IGRhdGUoJ1knKTsKCQkJCSRpbnNlcnQgPSAkbXlzcWxpLT5xdWVyeSgiSU5TRVJUIElOVE8gdmlkZW9zICh5b3V0dWJlX2lkLHVzZXJfaWQsY2F0ZWdvcnlfaWQsY2hhbm5lbF9pZCx0aXRsZSxkZXRhaWxzLHBlcm1hbGluayxkYXRldGltZSx0aHVtYm5haWwsZHVyYXRpb24sZGF5LG1vbnRoLHllYXIscHVibGlzaGVkLHRhZ3MscHVibGlzaF90aW1lLHRhZ19pZCxoaXRzLGRlbGV0ZWQsdm90ZXNfdXAsdm90ZXNfZG93bikgVkFMVUVTICgnJGlkJywnJF9TRVNTSU9OW3lvdXR1YmVfcHJvX3VzZXJdJywnJGNhdGVnb3J5JywnJGNoYW5uZWwnLCckdmlkZW9fdGl0bGUnLCckdmlkZW9fZGV0YWlscycsJyR2aWRlb195b3V0dWJlX3VybCcsJyRkYXRldGltZScsJyR0aHVtYicsJyRkdXJhdGlvbicsJyRkYXknLCckbW9udGgnLCckeWVhcicsJzEnLCckdGFncycsJyRwdWJsaXNoX3RpbWUnLCcwJywnMCcsJzAnLCcwJywnMCcpIik7CgkJCQlpZiAoJGluc2VydCkgewoJCQkJCWVjaG8gMTsJCgkJCQl9IGVsc2UgewoJCQkJCWVjaG8gJ2ZhaWx1cmUnOwkKCQkJCX0KCQkJCX0gCgkJfQoJfQp9CgppZiAoJGNhc2UgPT0gJ2NoYW5uZWxfZGV0YWlscycpIHsKJGlkID0gbWFrZV9zYWZlKCRfR0VUWydpZCddKTsJCmlmICghZW1wdHkoJGlkKSkgewokYmFzZVVybCA9ICdodHRwczovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMuY29tL3lvdXR1YmUvdjMvJzsKJGFwaUtleSA9ICRvcHRpb25zWydhcGlfeW91dHViZV9hcGlrZXknXTsKJHVybCA9ICRiYXNlVXJsIC4nY2hhbm5lbHM/JyAuCiAgICAnaWQ9JyAuICRfR0VUWydpZCddIC4KICAgICcmcGFydD1zbmlwcGV0JyAuIAogICAgJyZrZXk9JyAuICRhcGlLZXk7CiRqc29uID0ganNvbl9kZWNvZGUoZmlsZV9nZXRfY29udGVudHMoJHVybCksIHRydWUpOwokdXJsYSA9ICRiYXNlVXJsIC4nY2hhbm5lbHM/JyAuCiAgICAnaWQ9JyAuICRfR0VUWydpZCddIC4KICAgICcmcGFydD1zdGF0aXN0aWNzJyAuIAogICAgJyZrZXk9JyAuICRhcGlLZXk7CiRqc29uYSA9IGpzb25fZGVjb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmxhKSwgdHJ1ZSk7Cj8+CjxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyIgaWQ9ImNoYW5uZWwtZGV0YWlscyI+CgkJPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CgkJPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L2J1dHRvbj4KCQkJPGg0IGNsYXNzPSJtb2RhbC10aXRsZSI+Q2hhbm5lbCBEZXRhaWxzPC9oND4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KCQkJPHRhYmxlIGNsYXNzPSJ0YWJsZSI+CgkJCQk8dGhlYWQ+CgkJCQkJPHRyPgoJCQkJCQk8dGg+RmllbGQ8L3RoPgoJCQkJCQk8dGg+VmFsdWU8L3RoPgoJCQkJCTwvdHI+CgkJCQk8L3RoZWFkPgoJCQkJPHRib2R5PgoJCQkJCTx0cj4KCQkJCQkJPHRkPkNoYW5uZWwgTmFtZTwvdGQ+CgkJCQkJCTx0ZD48P3BocCBlY2hvICRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3RpdGxlJ107ID8+PC90ZD4KCQkJCQk8L3RyPgoJCQkJCTx0cj4KCQkJCQkJPHRkPkNoYW5uZWwgRGVzY3JpcHRpb248L3RkPgoJCQkJCQk8dGQ+PD9waHAgZWNobyAkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWydkZXNjcmlwdGlvbiddOyA/PjwvdGQ+CgkJCQkJPC90cj4KCQkJCQk8dHI+CgkJCQkJCTx0ZD5WaWRlb3MgTnVtYmVyPC90ZD4KCQkJCQkJPHRkPjw/cGhwIGVjaG8gJGpzb25hWydpdGVtcyddWzBdWydzdGF0aXN0aWNzJ11bJ3ZpZGVvQ291bnQnXTsgPz48L3RkPgoJCQkJCTwvdHI+CgkJCQkJPHRyPgoJCQkJCQk8dGQ+U3Vic2NyaWJlcnMgTnVtYmVyPC90ZD4KCQkJCQkJPHRkPjw/cGhwIGVjaG8gJGpzb25hWydpdGVtcyddWzBdWydzdGF0aXN0aWNzJ11bJ3N1YnNjcmliZXJDb3VudCddOyA/PjwvdGQ+CgkJCQkJPC90cj4KCQkJCQk8dHI+CgkJCQkJCTx0ZD5WaWV3cyBOdW1iZXI8L3RkPgoJCQkJCQk8dGQ+PD9waHAgZWNobyAkanNvbmFbJ2l0ZW1zJ11bMF1bJ3N0YXRpc3RpY3MnXVsndmlld0NvdW50J107ID8+PC90ZD4KCQkJCQk8L3RyPgoJCQkJPC90Ym9keT4KCQkJPC90YWJsZT4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgoJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KCQk8L2Rpdj4KCQk8L2Rpdj4KPC9kaXY+Cjw/cGhwCn0KfQoKCmlmICgkYWN0aW9uID09ICdpbXBvcnRfc2luZ2xlX2NoYW5uZWwnKSB7CiRpZCA9IG1ha2Vfc2FmZSgkX1BPU1RbJ2lkJ10pOwkKJGNhdGVnb3J5ID0gbWFrZV9zYWZlKCRfUE9TVFsnY2F0ZWdvcnknXSk7CQppZiAoIWVtcHR5KCRpZCkpIHsKJGJhc2VVcmwgPSAnaHR0cHM6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS95b3V0dWJlL3YzLyc7CiRhcGlLZXkgPSAkb3B0aW9uc1snYXBpX3lvdXR1YmVfYXBpa2V5J107CiR1cmwgPSAkYmFzZVVybCAuJ2NoYW5uZWxzPycgLgogICAgJ2lkPScgLiAkaWQuCiAgICAnJnBhcnQ9c25pcHBldCcgLiAKICAgICcma2V5PScgLiAkYXBpS2V5OwokanNvbiA9IGpzb25fZGVjb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmwpLCB0cnVlKTsKaWYgKGNvdW50KCRqc29uWydpdGVtcyddKSAhPSAwKSB7CmlmIChjaGVja195b3V0dWJlX2NoYW5uZWxfaWQoJGpzb25bJ2l0ZW1zJ11bMF1bJ2lkJ10pID09IDApIHsKJGRhdGV0aW1lID0gdGltZSgpOwokdGl0bGUgPSAkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWyd0aXRsZSddOwokbGluayA9ICdodHRwOi8veS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vY2hhbm5lbC8nLiRqc29uWydpdGVtcyddWzBdWydpZCddOwokc3FsID0gIklOU0VSVCBJTlRPIGNoYW5uZWxzICh0aXRsZSxsaW5rLGNhdGVnb3J5X2lkLHZpZGVvc19udW1iZXIsYWRkX3RpbWUsbGF0ZXN0X2FjdGl2aXR5LGF1dG9fdXBkYXRlLGF1dG9fdXBkYXRlX3BlcmlvZCx5b3V0dWJlX2NoYW5uZWxfaWQpIFZBTFVFUyAoJyR0aXRsZScsJyRsaW5rJywnJGNhdGVnb3J5JywnMzAnLCckZGF0ZXRpbWUnLCcwJywnMCcsJzAnLCckaWQnKSI7CiRxdWVyeSA9ICRteXNxbGktPnF1ZXJ5KCRzcWwpOwppZiAoJHF1ZXJ5KSB7CgllY2hvICdzdWNjZXNzJzsKfSBlbHNlIHsKCWVjaG8gJ2ZhaWx1cmUnOwp9Cn0gZWxzZSB7CgllY2hvICdmYWlsdXJlJzsKfQp9IGVsc2UgewoJZWNobyAnZmFpbHVyZSc7Cn0KfSBlbHNlIHsKCWVjaG8gJ2ZhaWx1cmUnOwp9Cn0KCgppZiAoJGFjdGlvbiA9PSAiaW1wb3J0X211bHRpcGxlX3ZpZGVvcyIpIHsKCQoJJGNhdGVnb3J5ID0gaW50dmFsKCRfUE9TVFsnY2F0ZWdvcnknXSk7CgkkaWRzID0gZXhwbG9kZSgnLCcsJF9QT1NUWydteUNoZWNrYm94ZXMnXSk7Cglmb3IgKCAkaT0wOyAkaSA8IGNvdW50KCRpZHMpOyAkaSsrKQogICAgewoJCQkJJGJhc2VVcmwgPSAnaHR0cHM6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS95b3V0dWJlL3YzLyc7CgkJCQkkYXBpS2V5ID0gJG9wdGlvbnNbJ2FwaV95b3V0dWJlX2FwaWtleSddOwoJCQkJJHVybCA9ICRiYXNlVXJsLid2aWRlb3M/Jy4KCQkJCQkJJ2lkPScuJGlkc1skaV0uCgkJCQkJCScmcGFydD1zbmlwcGV0Jy4gCgkJCQkJCScma2V5PScuJGFwaUtleTsKCQkJCSRqc29uID0ganNvbl9kZWNvZGUoZmlsZV9nZXRfY29udGVudHMoJHVybCksIHRydWUpOwoJCQkJaWYgKGNvdW50KCRqc29uWydpdGVtcyddKSAhPSAwKSB7CgkJCQkkdmlkZW9fdGl0bGUgPSBodG1sc3BlY2lhbGNoYXJzKCRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3RpdGxlJ10sRU5UX1FVT1RFUyk7CgkJCQkkdmlkZW9fZGV0YWlscyA9IGh0bWxzcGVjaWFsY2hhcnMoJGpzb25bJ2l0ZW1zJ11bMF1bJ3NuaXBwZXQnXVsnZGVzY3JpcHRpb24nXSxFTlRfUVVPVEVTKTsKCQkJCWlmICghZW1wdHkoJGpzb25bJ2l0ZW1zJ11bMF1bJ3NuaXBwZXQnXVsndGh1bWJuYWlscyddWydzdGFuZGFyZCddWyd1cmwnXSkpIHsKCQkJCSR2aWRlb190aHVtYm5haWwgPSAkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWyd0aHVtYm5haWxzJ11bJ3N0YW5kYXJkJ11bJ3VybCddOwoJCQkJfSBlbHNlIHsKCQkJCSR2aWRlb190aHVtYm5haWwgPSAkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWyd0aHVtYm5haWxzJ11bJ2hpZ2gnXVsndXJsJ107CQoJCQkJfQoJCQkJJHZpZGVvX3lvdXR1YmVfdXJsID0gJ2h0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS93YXRjaD92PScuJGlkc1skaV07CgkJCQkkdmlkZXQgPSBqc29uX2RlY29kZShmaWxlX2dldF9jb250ZW50cygnaHR0cHM6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS95b3V0dWJlL3YzL3ZpZGVvcz9pZD0nLiRpZHNbJGldLicmcGFydD1jb250ZW50RGV0YWlscyZrZXk9Jy4kYXBpS2V5KSwgdHJ1ZSk7CgkJCQkkdmlkZW9fZHVyYXRpb24gPSAkdmlkZXRbJ2l0ZW1zJ11bMF1bJ2NvbnRlbnREZXRhaWxzJ11bJ2R1cmF0aW9uJ107CgkJCQlwcmVnX21hdGNoX2FsbCgnIVxkKyEnLCAkdmlkZW9fZHVyYXRpb24sICRtYXRjaGVzKTsKCQkJCSRtID0gJG1hdGNoZXNbMF1bMF07CgkJCQkkcyA9ICRtYXRjaGVzWzBdWzFdOwoJCQkJJGR1cmF0aW9uID0gKCRtKjYwKSskczsKCQkJCWlmICghZW1wdHkoJHZpZGVvX3RodW1ibmFpbCkpIHsKCQkJCSR0aHVtYiA9ICd5b3V0dWJlXycuJGlkc1skaV0uJy5qcGcnOwoJCQkJJHVwID0gZmlsZV9wdXRfY29udGVudHMoJy4uL3VwbG9hZC92aWRlb3MvJy4kdGh1bWIsZmlsZV9nZXRfY29udGVudHMoJHZpZGVvX3RodW1ibmFpbCkpOwkKCQkJCX0gZWxzZSB7CgkJCQkkdGh1bWIgPSAnJzsJCgkJCQl9CgkJCQlpZiAoY291bnQoJGpzb25bJ2l0ZW1zJ11bMF1bJ3NuaXBwZXQnXVsndGFncyddKSA+IDApIHsKCQkJCQkkdGFncyA9IGltcGxvZGUoJywnLCRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3RhZ3MnXSk7CgkJCQl9IGVsc2UgewoJCQkJCSR0YWdzID0gdGl0bGVfdG9fa2V5d29yZHMoJGpzb25bJ2l0ZW1zJ11bMF1bJ3NuaXBwZXQnXVsndGl0bGUnXSk7CgkJCQl9CgkJCQkkcHVibGlzaF90aW1lID0geW91dHViZV9kYXRlX3RvX3VuaXgoJGpzb25bJ2l0ZW1zJ11bMF1bJ3NuaXBwZXQnXVsncHVibGlzaGVkQXQnXSk7CgkJCQkkZGF0ZXRpbWUgPSB0aW1lKCk7CgkJCQkkZGF5ID0gZGF0ZSgnaicpOwoJCQkJJG1vbnRoID0gZGF0ZSgnbicpOwoJCQkJJHllYXIgPSBkYXRlKCdZJyk7CgkJCQkkaW5zZXJ0ID0gJG15c3FsaS0+cXVlcnkoIklOU0VSVCBJTlRPIHZpZGVvcyAoeW91dHViZV9pZCx1c2VyX2lkLGNhdGVnb3J5X2lkLHRpdGxlLGRldGFpbHMscGVybWFsaW5rLGRhdGV0aW1lLHRodW1ibmFpbCxkdXJhdGlvbixkYXksbW9udGgseWVhcixwdWJsaXNoZWQsdGFncyxwdWJsaXNoX3RpbWUsY2hhbm5lbF9pZCx0YWdfaWQsaGl0cyxkZWxldGVkLHZvdGVzX3VwLHZvdGVzX2Rvd24pIFZBTFVFUyAoJyRpZHNbJGldJywnJF9TRVNTSU9OW3lvdXR1YmVfcHJvX3VzZXJdJywnJGNhdGVnb3J5JywnJHZpZGVvX3RpdGxlJywnJHZpZGVvX2RldGFpbHMnLCckdmlkZW9feW91dHViZV91cmwnLCckZGF0ZXRpbWUnLCckdGh1bWInLCckZHVyYXRpb24nLCckZGF5JywnJG1vbnRoJywnJHllYXInLCcxJywnJHRhZ3MnLCckcHVibGlzaF90aW1lJywnMCcsJzAnLCcwJywnMCcsJzAnLCcwJykiKTsKCQkJCX0gICAKICAgIH0KCQoJCn0KCgppZiAoJGFjdGlvbiA9PSAiaW1wb3J0X211bHRpcGxlX3ZpZGVvc19mcm9tX2NoYW5uZWwiKSB7CgkKCSRjYXRlZ29yeSA9IGludHZhbCgkX1BPU1RbJ2NhdGVnb3J5J10pOwoJJGNoYW5uZWxfaWQgPSBpbnR2YWwoJF9QT1NUWydjaGFubmVsX2lkJ10pOwoJJGlkcyA9IGV4cGxvZGUoJywnLCRfUE9TVFsnbXlDaGVja2JveGVzJ10pOwoJZm9yICggJGk9MDsgJGkgPCBjb3VudCgkaWRzKTsgJGkrKykKICAgIHsKCQkJCSRiYXNlVXJsID0gJ2h0dHBzOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ucy5jb20veW91dHViZS92My8nOwoJCQkJJGFwaUtleSA9ICRvcHRpb25zWydhcGlfeW91dHViZV9hcGlrZXknXTsKCQkJCSR1cmwgPSAkYmFzZVVybC4ndmlkZW9zPycuCgkJCQkJCSdpZD0nLiRpZHNbJGldLgoJCQkJCQknJnBhcnQ9c25pcHBldCcuIAoJCQkJCQknJmtleT0nLiRhcGlLZXk7CgkJCQkkanNvbiA9IGpzb25fZGVjb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmwpLCB0cnVlKTsKCQkJCWlmIChjb3VudCgkanNvblsnaXRlbXMnXSkgIT0gMCkgewoJCQkJJHZpZGVvX3RpdGxlID0gaHRtbHNwZWNpYWxjaGFycygkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWyd0aXRsZSddLEVOVF9RVU9URVMpOwoJCQkJJHZpZGVvX2RldGFpbHMgPSBodG1sc3BlY2lhbGNoYXJzKCRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ2Rlc2NyaXB0aW9uJ10sRU5UX1FVT1RFUyk7CgkJCQlpZiAoIWVtcHR5KCRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3RodW1ibmFpbHMnXVsnc3RhbmRhcmQnXVsndXJsJ10pKSB7CgkJCQkkdmlkZW9fdGh1bWJuYWlsID0gJGpzb25bJ2l0ZW1zJ11bMF1bJ3NuaXBwZXQnXVsndGh1bWJuYWlscyddWydzdGFuZGFyZCddWyd1cmwnXTsKCQkJCX0gZWxzZSB7CgkJCQkkdmlkZW9fdGh1bWJuYWlsID0gJGpzb25bJ2l0ZW1zJ11bMF1bJ3NuaXBwZXQnXVsndGh1bWJuYWlscyddWydoaWdoJ11bJ3VybCddOwkKCQkJCX0KCQkJCSR2aWRlb195b3V0dWJlX3VybCA9ICdodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vd2F0Y2g/dj0nLiRpZHNbJGldOwoJCQkJJHZpZGV0ID0ganNvbl9kZWNvZGUoZmlsZV9nZXRfY29udGVudHMoJ2h0dHBzOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ucy5jb20veW91dHViZS92My92aWRlb3M/aWQ9Jy4kaWRzWyRpXS4nJnBhcnQ9Y29udGVudERldGFpbHMma2V5PScuJGFwaUtleSksIHRydWUpOwoJCQkJJHZpZGVvX2R1cmF0aW9uID0gJHZpZGV0WydpdGVtcyddWzBdWydjb250ZW50RGV0YWlscyddWydkdXJhdGlvbiddOwoJCQkJcHJlZ19tYXRjaF9hbGwoJyFcZCshJywgJHZpZGVvX2R1cmF0aW9uLCAkbWF0Y2hlcyk7CgkJCQkkbSA9ICRtYXRjaGVzWzBdWzBdOwoJCQkJJHMgPSAkbWF0Y2hlc1swXVsxXTsKCQkJCSRkdXJhdGlvbiA9ICgkbSo2MCkrJHM7CgkJCQlpZiAoIWVtcHR5KCR2aWRlb190aHVtYm5haWwpKSB7CgkJCQkkdGh1bWIgPSAneW91dHViZV8nLiRpZHNbJGldLicuanBnJzsKCQkJCSR1cCA9IGZpbGVfcHV0X2NvbnRlbnRzKCcuLi91cGxvYWQvdmlkZW9zLycuJHRodW1iLGZpbGVfZ2V0X2NvbnRlbnRzKCR2aWRlb190aHVtYm5haWwpKTsJCgkJCQl9IGVsc2UgewoJCQkJJHRodW1iID0gJyc7CQoJCQkJfQoJCQkJaWYgKGNvdW50KCRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3RhZ3MnXSkgPiAwKSB7CgkJCQkJJHRhZ3MgPSBpbXBsb2RlKCcsJywkanNvblsnaXRlbXMnXVswXVsnc25pcHBldCddWyd0YWdzJ10pOwoJCQkJfSBlbHNlIHsKCQkJCQkkdGFncyA9IHRpdGxlX3RvX2tleXdvcmRzKCRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3RpdGxlJ10pOwoJCQkJfQoJCQkJJHB1Ymxpc2hfdGltZSA9IHlvdXR1YmVfZGF0ZV90b191bml4KCRqc29uWydpdGVtcyddWzBdWydzbmlwcGV0J11bJ3B1Ymxpc2hlZEF0J10pOwoJCQkJJGRhdGV0aW1lID0gdGltZSgpOwoJCQkJJGRheSA9IGRhdGUoJ2onKTsKCQkJCSRtb250aCA9IGRhdGUoJ24nKTsKCQkJCSR5ZWFyID0gZGF0ZSgnWScpOwoJCQkJJGluc2VydCA9ICRteXNxbGktPnF1ZXJ5KCJJTlNFUlQgSU5UTyB2aWRlb3MgKHlvdXR1YmVfaWQsdXNlcl9pZCxjYXRlZ29yeV9pZCxjaGFubmVsX2lkLHRpdGxlLGRldGFpbHMscGVybWFsaW5rLGRhdGV0aW1lLHRodW1ibmFpbCxkdXJhdGlvbixkYXksbW9udGgseWVhcixwdWJsaXNoZWQsdGFncyxwdWJsaXNoX3RpbWUsdGFnX2lkLGhpdHMsZGVsZXRlZCx2b3Rlc191cCx2b3Rlc19kb3duKSBWQUxVRVMgKCckaWRzWyRpXScsJyRfU0VTU0lPTlt5b3V0dWJlX3Byb191c2VyXScsJyRjYXRlZ29yeScsJyRjaGFubmVsX2lkJywnJHZpZGVvX3RpdGxlJywnJHZpZGVvX2RldGFpbHMnLCckdmlkZW9feW91dHViZV91cmwnLCckZGF0ZXRpbWUnLCckdGh1bWInLCckZHVyYXRpb24nLCckZGF5JywnJG1vbnRoJywnJHllYXInLCcxJywnJHRhZ3MnLCckcHVibGlzaF90aW1lJywnMCcsJzAnLCcwJywnMCcsJzAnKSIpOwoJCQkJfSAgIAogICAgfQoJCgkKfQoKaWYgKCRhY3Rpb24gPT0gInlvdXR1YmVfdGFnX2ltcG9ydCIpIHsKCQoJJGlkID0gaW50dmFsKCRfUE9TVFsnaWQnXSk7CgkkdGFnID0gJGdlbmVyYWwtPnRhZygkaWQpOwoJaWYgKCR0YWcgIT0gMCkgewoJJHRhZ190aXRsZSA9IHN0cl9yZXBsYWNlKCcgJywnKycsJHRhZ1sndGl0bGUnXSk7CgkkdGFnX2lkID0gJHRhZ1snaWQnXTsKCSRjYXRlZ29yeV9pZCA9ICR0YWdbJ2NhdGVnb3J5X2lkJ107CgkkbWF4X3Jlc3VsdHMgPSAkdGFnWyd2aWRlb3NfbnVtYmVyJ107CgkkeW91dHViZV9jYXRlZ29yeSA9ICR0YWdbJ3lvdXR1YmVfY2F0ZWdvcnknXTsKCSRiYXNlVXJsID0gJ2h0dHBzOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ucy5jb20veW91dHViZS92My8nOwoJJGFwaUtleSA9ICRvcHRpb25zWydhcGlfeW91dHViZV9hcGlrZXknXTsKCSR1cmwgPSAkYmFzZVVybCAuInNlYXJjaD9xPSR0YWdfdGl0bGUmbWF4UmVzdWx0cz0kbWF4X3Jlc3VsdHMmb3JkZXI9ZGF0ZSZwYXJ0PXNuaXBwZXQmdHlwZT12aWRlbyI7CglpZiAoJHlvdXR1YmVfY2F0ZWdvcnkgIT0gMCkgewoJJHVybCAuPSAiJnZpZGVvQ2F0ZWdvcnlJZD0keW91dHViZV9jYXRlZ29yeSI7CQoJfQoJJHVybCAuPSAiJmtleT0kYXBpS2V5IjsKCSRqc29uID0ganNvbl9kZWNvZGUoZmlsZV9nZXRfY29udGVudHMoJHVybCksIHRydWUpOwkKCWZvcmVhY2goYXJyYXlfcmV2ZXJzZSgkanNvblsnaXRlbXMnXSkgYXMgJHZpZGVvKSB7CgkJJHZpZGVvX2lkID0gJHZpZGVvWydpZCddWyd2aWRlb0lkJ107CgkJJHZpZGVvX3RpdGxlID0gaHRtbHNwZWNpYWxjaGFycygkdmlkZW9bJ3NuaXBwZXQnXVsndGl0bGUnXSxFTlRfUVVPVEVTKTsKCQkkdmlkZW9fZGV0YWlscyA9IGh0bWxzcGVjaWFsY2hhcnMoJHZpZGVvWydzbmlwcGV0J11bJ2Rlc2NyaXB0aW9uJ10sRU5UX1FVT1RFUyk7CgkJaWYgKCFlbXB0eSgkdmlkZW9bJ3NuaXBwZXQnXVsndGh1bWJuYWlscyddWydzdGFuZGFyZCddWyd1cmwnXSkpIHsKCQkkdmlkZW9fdGh1bWJuYWlsID0gJHZpZGVvWydzbmlwcGV0J11bJ3RodW1ibmFpbHMnXVsnc3RhbmRhcmQnXVsndXJsJ107CgkJfSBlbHNlIHsKCQkkdmlkZW9fdGh1bWJuYWlsID0gJHZpZGVvWydzbmlwcGV0J11bJ3RodW1ibmFpbHMnXVsnaGlnaCddWyd1cmwnXTsJCgkJfQoJCSR2aWRlb195b3V0dWJlX3VybCA9ICdodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vd2F0Y2g/dj0nLiR2aWRlb19pZDsKCQlpZiAoY2hlY2tfeW91dHViZV9pZCgkdmlkZW9faWQpID09IDApIHsKCQkkdmlkZXQgPSBqc29uX2RlY29kZShmaWxlX2dldF9jb250ZW50cygnaHR0cHM6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS95b3V0dWJlL3YzL3ZpZGVvcz9pZD0nLiR2aWRlb19pZC4nJnBhcnQ9Y29udGVudERldGFpbHMma2V5PScuJGFwaUtleSksIHRydWUpOwoJCSR2aWRlb19kdXJhdGlvbiA9ICR2aWRldFsnaXRlbXMnXVswXVsnY29udGVudERldGFpbHMnXVsnZHVyYXRpb24nXTsKCQkkZHVyYXRpb24gPSB5b3V0dWJlX2R1cmF0aW9uKCR2aWRlb19kdXJhdGlvbik7CgkJJGRhdGV0aW1lID0gdGltZSgpOwoJCWlmICghZW1wdHkoJHZpZGVvX3RodW1ibmFpbCkpIHsKCQkkdGh1bWIgPSAkdmlkZW9faWQuJy5qcGcnOwoJCSR1cCA9IGZpbGVfcHV0X2NvbnRlbnRzKCcuLi91cGxvYWQvdmlkZW9zLycuJHRodW1iLGZpbGVfZ2V0X2NvbnRlbnRzKCR2aWRlb190aHVtYm5haWwpKTsJCgkJfSBlbHNlIHsKCQkkdGh1bWIgPSAnJzsJCgkJfQoJCWlmIChjb3VudCgkdmlkZW9bJ3NuaXBwZXQnXVsndGFncyddKSA+IDApIHsKCQkJJHRhZ3MgPSBpbXBsb2RlKCcsJywkdmlkZW9bJ3NuaXBwZXQnXVsndGFncyddKTsKCQl9IGVsc2UgewoJCQkkdGFncyA9IHRpdGxlX3RvX2tleXdvcmRzKCR2aWRlb1snc25pcHBldCddWyd0aXRsZSddKTsKCQl9CgkJJHB1Ymxpc2hfdGltZSA9IHlvdXR1YmVfZGF0ZV90b191bml4KCR2aWRlb1snc25pcHBldCddWydwdWJsaXNoZWRBdCddKTsKCQkkZGF0ZXRpbWUgPSB0aW1lKCk7CgkJJGRheSA9IGRhdGUoJ2onKTsKCQkkbW9udGggPSBkYXRlKCduJyk7CgkJJHllYXIgPSBkYXRlKCdZJyk7CgkJJGluc2VydCA9ICRteXNxbGktPnF1ZXJ5KCJJTlNFUlQgSU5UTyB2aWRlb3MgKHVzZXJfaWQseW91dHViZV9pZCx0YWdfaWQsY2F0ZWdvcnlfaWQsdGl0bGUsZGV0YWlscyxwZXJtYWxpbmssZGF0ZXRpbWUsdGh1bWJuYWlsLGR1cmF0aW9uLHRhZ3MsZGF5LG1vbnRoLHllYXIscHVibGlzaGVkLHB1Ymxpc2hfdGltZSxjaGFubmVsX2lkLGhpdHMsZGVsZXRlZCx2b3Rlc191cCx2b3Rlc19kb3duKSBWQUxVRVMgKCckX1NFU1NJT05beW91dHViZV9wcm9fdXNlcl0nLCckdmlkZW9faWQnLCckdGFnX2lkJywnJGNhdGVnb3J5X2lkJywnJHZpZGVvX3RpdGxlJywnJHZpZGVvX2RldGFpbHMnLCckdmlkZW9feW91dHViZV91cmwnLCckZGF0ZXRpbWUnLCckdGh1bWInLCckZHVyYXRpb24nLCckdGFncycsJyRkYXknLCckbW9udGgnLCckeWVhcicsJzEnLCckcHVibGlzaF90aW1lJywnMCcsJzAnLCcwJywnMCcsJzAnKSIpOwoJCX0gCgl9Cgkkbm93ID0gdGltZSgpOwoJJG15c3FsaS0+cXVlcnkoIlVQREFURSB0YWdzIFNFVCBsYXRlc3RfYWN0aXZpdHk9JyRub3cnIFdIRVJFIGlkPSckaWQnIik7Cgl9CgkKfQ==