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 $_F=__FILE__;$_C1353562110='Pz48P1FSUQoKTGNGdHQgZnRDcCB7CgovLyoqKioqKioqKiB5QVNhQXpx..
Decoded Output download
$_C1353562110=base64_decode($_C1353562110);$_C1353562110=strtr($_C1353562110,'3AgaDZb0YxdXW8BkiuVS2ONEtUzC5c4oKsw7my9pnHG6PejFr1JlQTfqRMLhIv','9AxI5MNQX7KtnPbwizGROE1JsWBeCl4YoHZ80V2rSgv6qdDay3TjpfuLhkcmFU');$_R=str_replace('__FILE__',"'".$_F."'",$_C1353562110);eval($_R);$_R=0;$_C1353562110=0;?><?php
class user {
//********* VARIABLES ***********
var $db;
var $username;
var $fname;
var $mname;
var $lname;
var $org_id;
var $email;
var $fone_no;
var $mob_no;
var $address;
var $status;
var $created_by;
var $profileImage;
var $password;
var $current_date;
var $current_date_time;
var $obj_query;
var $return;
var $line;
var $num_records;
var $no_per_page;
var $page_limit_x;
var $page_limit_y;
var $sth;
var $role;
var $named_user;
var $user_type;
//IDFC
var $hierarchy;
var $parent_id;
//IDFC1
var $rootnode;
var $master_id;
var $master_value_id;
var $usergroupalias;
//IDFC3 15-02-17
var $employee_ug_flag;
var $employee_role;
var $employee_name_flag;
var $ad_id;
var $start_access_time;
var $end_access_time;
var $mail_flag;
//WPP 10-06-2020
var $activated_time;
var $deactivated_time;
//unico
var $digital_sign;
//********* CONSTRUCTOR FUNTIONS ************
function __construct($db) {
$this->db = $db;
// $this->id = '';
}
//**************** SET FUNTIONS *********************
function setProfileImage($value) {
if ($value == '')
$this->profileImage = '';
else
$this->profileImage = $value;
return true;
}
function setId($value) {
if ($value == '')
$this->id = '';
else
$this->id = $value;
return true;
}
function setFName($value) {
if ($value == '')
$this->fname = '';
else
$this->fname = $value;
return true;
}
function setMName($value) {
if ($value == '')
$this->mname = '';
else
$this->mname = $value;
return true;
}
function setLName($value) {
if ($value == '')
$this->lname = '';
else
$this->lname = $value;
return true;
}
function setAddress($value) {
if ($value == '')
$this->address = '';
else
$this->address = addslashes($value);
return true;
}
function setOrgId($value) {
if ($value == '')
$this->org_id = '';
else
$this->org_id = $value;
return true;
}
function setDeptId($value) {
if ($value == '')
$this->dept_id = '';
else
$this->dept_id = $value;
return true;
}
function setFoneNo($value) {
if ($value == '')
$this->fone_no = '';
else
$this->fone_no = $value;
return true;
}
function setMobNo($value) {
if ($value == '')
$this->mob_no = '';
else
$this->mob_no = $value;
return true;
}
function setEmail($value) {
if ($value == '')
$this->email = '';
else
$this->email = $value;
return true;
}
function setStatus($value) {
if ($value == '')
$this->status = '';
else
$this->status = $value;
return true;
}
function setUserType($value) {
if ($value == '')
$this->user_type = '';
else
$this->user_type = $value;
return true;
}
function setCreatedBy($value) {
if ($value == '')
$this->created_by = '';
else
$this->created_by = $value;
return true;
}
function setUserId($value) {
if ($value == '')
$this->user_id = '';
else
$this->user_id = $value;
return true;
}
function setRole($value) {
if ($value == '')
$this->role = '';
else
$this->role = $value;
return true;
}
//idfc1 25-1-2017
//IDFC3 15-02-17
function setEmployeeRole($value) {
if ($value == '')
$this->employee_role = '';
else
$this->employee_role = $value;
return true;
}
function setAltRole($value) {
if ($value == '')
$this->alt_role = '';
else
$this->alt_role = $value;
return true;
}
function setUserStatus($value) {
if ($value == '')
$this->user_status = '';
else
$this->user_status = $value;
return true;
}
function setAcctLockStatus($value) {
if ($value == 1)
$this->lock_status = 1;
else
$this->lock_status = $value;
return true;
}
function setUsername($value) {
if ($value == '')
$this->username = '';
else
$this->username = $value;
return true;
}
function setPassword($value) {
if ($value == '')
$this->password = '';
else
$this->password = addslashes($value);
return true;
}
function setCurrentDate() {
$this->current_date = date("Y" . "-" . "m" . "-" . "d");
return true;
}
function setCurrentDateTime() {
$this->current_date_time = date("Y-m-d H:i:s A");
//'YYYY-MM-DD HH:MM:SS'
return true;
}
function setName($value) {
if ($value == '') {
$this->name = '';
} else {
$this->name = $value;
}
return true;
}
//IDFC
function setHierarchy($value) {
if ($value == '') {
$this->hierarchy = '';
} else {
$this->hierarchy = $value;
}
return true;
}
function setParentId($value) {
if ($value == '') {
$this->parent_id = '';
} else {
$this->parent_id = $value;
}
return true;
}
function setDescription($value) {
if ($value == '') {
$this->description = '';
} else {
$this->description = $value;
}
return true;
}
//IDFC1
function setRootNode($value) {
if ($value == '') {
$this->rootnode = '';
} else {
$this->rootnode = $value;
}
return true;
}
function setUserGroupAlias($value) {
if ($value == '') {
$this->usergroupalias = '';
} else {
$this->usergroupalias = $value;
}
if ((trim($this->name) != '' || trim($this->name) != 'ghost') && $this->usergroupalias == 'ghost') {
$this->usergroupalias = '';
}
return true;
}
//IDFC3 15-02-17
function setEmployee_ug_flag($value) {
if ($value == '') {
$this->employee_ug_flag = '';
} else {
$this->employee_ug_flag = $value;
}
return true;
}
//IDFC3 15-02-17
function setEmployee_name_flag($value) {
if ($value == '') {
$this->employee_name_flag = '';
} else {
$this->employee_name_flag = $value;
}
return true;
}
//IDFC1
function setMasterID($value) {
if ($value == '') {
$this->master_id = '';
} else {
$this->master_id = $value;
}
return true;
}
//IDFC1
function setMasterValueID($value) {
if ($value == '') {
$this->master_value_id = '';
} else {
$this->master_value_id = $value;
}
return true;
}
//16-12-2016
function setNamedUser($value) {
if ($value == '') {
$this->named_user = 0;
} else {
$this->named_user = $value;
}
return true;
}
function setNoPerPage($value) {
if (empty($value)) {
$this->no_per_page = 10;
} else {
$this->no_per_page = $value;
}
return $this->no_per_page;
}
function setPageLimitX($value) {
if (empty($value)) {
$this->page_limit_x = 0;
} else {
$this->page_limit_x = $value;
}
return $this->page_limit_x;
}
function setPageLimitY($value) {
if (empty($value)) {
$this->page_limit_y = 10;
} else {
$this->page_limit_y = $value;
}
return $this->page_limit_y;
}
function setSortTable($value) {
if (empty($value)) {
$this->sort_table = "";
} else {
$this->sort_table = $value;
}
return $this->sort_table;
}
function setSortJoinTable($value) {
if (empty($value)) {
$this->sort_jointable = "";
} else {
$this->sort_jointable = $value;
}
return $this->sort_jointable;
}
function setSortJoinTableTwo($value) {
if (empty($value)) {
$this->sort_jointable_two = "";
} else {
$this->sort_jointable_two = $value;
}
return $this->sort_jointable_two;
}
function setSortJoinTableThree($value) {
if (empty($value)) {
$this->sort_jointable_three = "";
} else {
$this->sort_jointable_three = $value;
}
return $this->sort_jointable_three;
}
function setSortTableField($value) {
if (empty($value)) {
$this->sort_table_field = "";
} else {
$this->sort_table_field = $value;
}
return $this->sort_table_field;
}
function setSortJoinTableField($value) {
if (empty($value)) {
$this->sort_jointable_field = "";
} else {
$this->sort_jointable_field = $value;
}
return $this->sort_jointable_field;
}
function setSortJoinTableTwoField($value) {
if (empty($value)) {
$this->sort_jointable_two_field = "";
} else {
$this->sort_jointable_two_field = $value;
}
return $this->sort_jointable_two_field;
}
function setSortJoinTableThreeField($value) {
if (empty($value)) {
$this->sort_jointable_three_field = "";
} else {
$this->sort_jointable_three_field = $value;
}
return $this->sort_jointable_three_field;
}
function setSort_Order_Field($value) {
if (empty($value)) {
$this->sort_order_field = "";
} else {
$this->sort_order_field = $value;
}
return $this->sort_order_field;
}
function ad_id($value) {
if (empty($value)) {
$this->ad_id = "";
} else {
$this->ad_id = $value;
}
return $this->ad_id;
}
function setStartAccessTime($value) {
if (empty($value)) {
$this->start_access_time = "";
} else {
$this->start_access_time = $value;
}
return $this->start_access_time;
}
function setEndAccessTime($value) {
if (empty($value)) {
$this->end_access_time = "";
} else {
$this->end_access_time = $value;
}
return $this->end_access_time;
}
function setMailFlag($value) {
$this->mail_flag = $value;
return $this->mail_flag;
}
//vidhya 28/07/2020
function setActivatedTime($value) {
if (empty($value)) {
$this->activated_time = "";
} else {
$this->activated_time = $value;
}
return $this->activated_time;
}
function setDeactivatedTime($value) {
if (empty($value)) {
$this->deactivated_time = "";
} else {
$this->deactivated_time = $value;
}
return $this->deactivated_time;
}
//Unico
function setDigitalSign($value) {
if ($value == '') {
$this->digital_sign = '';
} else {
$this->digital_sign = $value;
}
return true;
}
//*********** Functions *****************************
function getSuperAdmin() {
$this->sth = $this->db->prepare("SELECT u.id, l.role, u.fname, u.mname, u.lname, u.org_id, u.email FROM user_group as ug
JOIN login_mast AS l ON (ug.id = l.role)
JOIN user AS u ON (l.user_id = u.id)
WHERE l.role = '1' AND u.delete_flag = '0'");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getBranchHead() {
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname, u.org_id, u.email FROM user_group as ug
JOIN login_mast AS l ON (ug.id = l.role)
JOIN user AS u ON (l.user_id = u.id)
WHERE l.role = '29' ");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getBranchHead_ByUserId($uid, $pid, $guest_id) {
/* $this->query = $this->db->query("SELECT u.id, u.fname, u.mname, u.lname, u.org_id, u.email FROM guests AS g
JOIN user AS u ON (FIND_IN_SET(u.id, g.users) > 0)
JOIN login_mast AS l ON (u.id = l.user_id)
WHERE l.role = '29' AND g.id = '$guest_id' AND g.reff_id = '$pid'
");
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname, u.org_id, u.email FROM guests AS g
JOIN user AS u ON (FIND_IN_SET(u.id, g.users) > 0)
JOIN login_mast AS l ON (u.id = l.user_id)
WHERE l.role = '29' AND g.id = :GUEST_ID AND g.reff_id = :REFF_ID ");
//$this->sth->execute(array(':username' => $this->username));
$this->sth->bindValue(":GUEST_ID", $guest_id, PDO::PARAM_STR);
$this->sth->bindValue(":REFF_ID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getProfileImage_ById($value) {
//$this->query = $this->db->query("SELECT id, fname, mname, lname, org_id, profile_image FROM user WHERE id = '$value'");
// $this->return = $this->query->fetchAll(PDO::FETCH_ASSOC);
$this->sth = $this->db->prepare("SELECT id, fname, mname, lname, org_id, profile_image FROM user WHERE id = :ID");
//$this->sth->execute(array(':username' => $this->username));
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getUsers_All() {
$this->sth = $this->db->prepare("SELECT * FROM user,login_mast WHERE user.id = login_mast.user_id AND user.delete_flag = '0' ORDER BY user.id DESC");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getUserDetails_DataTable1($aColumns, $sWhere, $orderby, $limit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
if (trim($sOrder) == '') {
$sOrder = "ORDER BY u.id desc";
}
$query = 'SELECT SQL_CALC_FOUND_ROWS ' . $aColumns_re . ' FROM user as u, login_mast as l WHERE u.id = l.user_id ' . $sWhere . " " . $orderby . ' ' . $limit;
$this->sth = $this->db->prepare($query);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//IDFC3 20-02-17 sushant
//vidhya 28/07/2020
function getUsers_ById($value) {
//Phoenix 19-12-16 named user
/* $this->query = $this->db->query("SELECT l.role, l.alt_role, l.user_id, u.org_id, u.fname,u.profile_image, u.mname, u.lname, l.username, u.email, u.mob_no, u.fone_no, u.address, u.status, u.created_by FROM user as u
JOIN login_mast as l ON l.user_id = u.id WHERE u.id = '$value'");
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT l.role,l.emp_role, l.alt_role,u.named_flag,u.emp_named_flag, l.user_id, u.org_id, u.fname,u.profile_image, u.mname, u.lname, l.username, u.email, u.mob_no, u.fone_no, u.address, u.status, u.created_by,l.acct_locked_status,u.master_id,l.ad_id, u.category_access_start_time, u.category_access_end_time,u.activated_time,u.deactivated_time,l.last_login,u.department_id FROM user as u
JOIN login_mast as l ON l.user_id = u.id WHERE u.id = :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function UpdateProfileImage($value) {
/* $this->obj_query = $this->db->query("update user set profile_image = '$this->profileImage'
where id = '$value' ");
return $this->sth; */
$this->sth = $this->db->prepare("update user set profile_image = :PRO_IMG where id = :ID");
$this->sth->bindValue(':ID', $value, PDO::PARAM_STR);
$this->sth->bindValue(':PRO_IMG', $this->profileImage, PDO::PARAM_STR);
return $this->sth->execute();
}
function updatePassword($value) {
/* $this->obj_query = $this->db->query("update login_mast set
password = '$this->password'
where user_id = '$value' ");
return $this->sth; */
$this->sth = $this->db->prepare("update login_mast set `password` = :PASS where user_id = :ID");
$this->sth->bindValue(':ID', $value, PDO::PARAM_STR);
$this->sth->bindValue(':PASS', $this->password, PDO::PARAM_STR);
return $this->sth->execute();
}
function getDealManager() {
$this->sth = $this->db->prepare("SELECT user.id, user.fname, user.mname, user.lname, user.email FROM user, login_mast WHERE user.id=login_mast.user_id AND role='2' AND status='YES' AND user.delete_flag = '0'");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getDm_mem_unassigned($value) {
/* $this->query = $this->db->query("SELECT user.id, user.fname, user.mname, user.lname FROM `user`, login_mast
WHERE user.`id` = login_mast.user_id AND
login_mast.role != '2' AND login_mast.role != '1' AND
user.id NOT IN(Select mem_id from assign_mem_pm where pm_id = '$value') AND
status = 'YES' group by login_mast.user_id
ORDER BY user.fname ASC");
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT user.id, user.fname, user.mname, user.lname FROM `user`, login_mast
WHERE user.`id` = login_mast.user_id AND
login_mast.role != '2' AND login_mast.role != '1' AND
user.id NOT IN(Select mem_id from assign_mem_pm where pm_id = :PM_ID) AND
status = 'YES' AND user.delete_flag = '0' group by login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->bindValue(":PM_ID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getUsers_ByGroup($value) {
// $this->obj_query = $this->db->query("SELECT user.id,user.fname,user.mname,user.lname, user.email FROM user,login_mast WHERE user.id=login_mast.user_id AND user.status='Yes' AND login_mast.role='$value'");
// $this->return = $this->obj_query->fetchAll(PDO::FETCH_ASSOC);
$this->sth = $this->db->prepare("SELECT user.id,user.fname,user.mname,user.lname, user.email FROM user,login_mast WHERE user.id=login_mast.user_id AND user.status='Yes' AND login_mast.role= :ROLE AND user.delete_flag = '0'");
$this->sth->bindValue(":ROLE", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDm_mem_assigned($value) {
/* $this->obj_query = $this->db->query("SELECT user.id, user.fname, user.mname, user.lname FROM `assign_mem_pm`
JOIN login_mast ON assign_mem_pm.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pm_id = '$value' AND
login_mast.role != '2' AND login_mast.role != '1' AND
login_mast.user_status = '1' group by login_mast.user_id
ORDER BY user.fname ASC");
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT user.id, user.fname, user.mname, user.lname FROM `assign_mem_pm`
JOIN login_mast ON assign_mem_pm.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pm_id = :PM_ID AND
login_mast.role != '2' AND login_mast.role != '1' AND
login_mast.user_status = '1' AND user.delete_flag = '0' group by login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->bindValue(":PM_ID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getUser_ById($value) {
// $this->query = $this->db->query("select * FROM user where id='$value'");
// $this->return = $this->query->fetchAll(PDO::FETCH_ASSOC);
$this->sth = $this->db->prepare("select * FROM user where id= :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getUser_Auto($value) {
// $this->query = $this->db->query("select * FROM user where id='$value'");
// $this->return = $this->query->fetchAll(PDO::FETCH_ASSOC);
$this->sth = $this->db->prepare("select * FROM user where fname like '%$value%' OR mname like '%$value%' OR lname like '%$value%'");
//echo "select * FROM user where fname like '%$value%' AND mname like '%$value%' AND lname like '%$value%'";
$this->sth->bindValue(":SEARCH_STR", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getUserName_ById($value) {
//$this->query = $this->db->query("select * FROM user where id='$value'");
//$this->return = $this->query->fetchAll(PDO::FETCH_ASSOC);
$this->sth = $this->db->prepare("select * FROM user where id= :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function verifyUser_edit($value, $id) {
// $this->query = $this->db->query("select * FROM user where profile_image ='$value' AND id <> '$id'");
//$this->return = $this->query->fetchAll(PDO::FETCH_ASSOC);
$this->sth = $this->db->prepare("select * FROM user where profile_image = :PRO_IMG AND id <> :ID");
$this->sth->bindValue(":ID", $id, PDO::PARAM_STR);
$this->sth->bindValue(":PRO_IMG", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getOrganisation() {
$this->sth = $this->db->prepare("SELECT id, org_name FROM mod_organisation");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getOrganisation_ById($value) {
// $this->obj_query = $this->db->query("SELECT id, org_name FROM mod_organisation WHERE id = '$value'");
// $this->return = $this->obj_query->fetchAll(PDO::FETCH_ASSOC);
$this->sth = $this->db->prepare("SELECT id, org_name FROM mod_organisation WHERE id = :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//IDFC3 15-02-17
//vidhya 28/07/2020
//added named flag for phoenix, abhijeet
function add_user() {
/* $this->sth = $this->db->prepare("insert into user(
fname,
mname,
lname,
org_id,
department_id,
email,
fone_no,
mob_no,
address,
status,
created_by,
named_flag,
emp_named_flag,
master_id,
master_value_id,
category_access_start_time,
category_access_end_time,
activated_time,
deactivated_time) values (:FNAME,:MNAME,:LNAME,:ORGID,:department_id,:EMAIL,:FONE_NO,:MOB_NO,:ADDRESS,:STATUS,:CREATED_BY,:NAMED_FLAG,:EMP_NAMED_FLAG,:MASTER_ID,:MASTER_VALUE_ID, :START_TIME, :END_TIME, :ACTIVATEDTIME,:DEACTIVATEDTIME)"); */
$this->sth = $this->db->prepare("insert into user(
fname,
mname,
lname,
org_id,
department_id,
email,
fone_no,
mob_no,
address,
status,
created_by,
named_flag,
emp_named_flag,
master_id,
master_value_id,
category_access_start_time,
category_access_end_time,
activated_time,
deactivated_time) values ('$this->fname','$this->mname','$this->lname','$this->org_id','$this->dept_id','$this->email','$this->fone_no','$this->mob_no','$this->address','$this->status','$this->created_by','$this->user_type','$this->employee_name_flag','$this->master_id','$this->master_value_id', '$this->start_access_time', '$this->end_access_time', '$this->activated_time','$this->deactivated_time')");
$this->sth->bindValue(':FNAME', $this->fname, PDO::PARAM_STR);
$this->sth->bindValue(':MNAME', $this->mname, PDO::PARAM_STR);
$this->sth->bindValue(':LNAME', $this->lname, PDO::PARAM_STR);
$this->sth->bindValue(':ORGID', $this->org_id, PDO::PARAM_STR);
$this->sth->bindValue(':department_id', $this->dept_id, PDO::PARAM_STR);
$this->sth->bindValue(':EMAIL', $this->email, PDO::PARAM_STR);
$this->sth->bindValue(':FONE_NO', $this->fone_no, PDO::PARAM_STR);
$this->sth->bindValue(':MOB_NO', $this->mob_no, PDO::PARAM_STR);
$this->sth->bindValue(':ADDRESS', $this->address, PDO::PARAM_STR);
$this->sth->bindValue(':STATUS', $this->status, PDO::PARAM_STR);
$this->sth->bindValue(':CREATED_BY', $this->created_by, PDO::PARAM_STR);
$this->sth->bindValue(':NAMED_FLAG', $this->user_type, PDO::PARAM_STR);
$this->sth->bindValue(':EMP_NAMED_FLAG', $this->employee_name_flag, PDO::PARAM_STR);
$this->sth->bindValue(':MASTER_ID', $this->master_id, PDO::PARAM_STR);
//IDFC1
$this->sth->bindValue(':MASTER_VALUE_ID', $this->master_value_id, PDO::PARAM_STR);
//IDFC1
$this->sth->bindValue(':START_TIME', $this->start_access_time, PDO::PARAM_STR);
//IDFC1
$this->sth->bindValue(':END_TIME', $this->end_access_time, PDO::PARAM_STR);
//IDFC1
$this->sth->bindValue(':ACTIVATEDTIME', $this->activated_time, PDO::PARAM_STR);
$this->sth->bindValue(':DEACTIVATEDTIME', $this->deactivated_time, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
//IDFC3 15-02-17
//vidhya 28-7-2020
function edit_user($value) {
//Phoenix 19-12-16
/* $this->obj_query = $this->db->query("update user set
fname = '$this->fname',
mname = '$this->mname',
lname = '$this->lname',
org_id = '$this->org_id',
email = '$this->email',
fone_no = '$this->fone_no',
mob_no = '$this->mob_no',
address = '$this->address',
status = '$this->status',
created_by = '$this->created_by' where id = '$value' ");
return $this->sth; */
$this->sth = $this->db->prepare("update user set
fname = :FNAME,
mname = :MNAME,
lname = :LNAME,
org_id = :ORGID,
department_id = :department_id,
email = :EMAIL,
fone_no = :FONE_NO,
mob_no = :MOB_NO,
address = :ADDRESS,
status = :STATUS,
named_flag = :NAMED_FLAG,
emp_named_flag=:EMP_NAMED_FLAG,
created_by = :CREATED_BY,
category_access_start_time = :START_TIME,
category_access_end_time = :END_TIME,
activated_time = :ACTIVATEDTIME,
deactivated_time = :DEACTIVATEDTIME,
mail_flag = :MAIL_FLAG where id = :ID");
$this->sth->bindValue(':FNAME', $this->fname, PDO::PARAM_STR);
$this->sth->bindValue(':MNAME', $this->mname, PDO::PARAM_STR);
$this->sth->bindValue(':LNAME', $this->lname, PDO::PARAM_STR);
$this->sth->bindValue(':ORGID', $this->org_id, PDO::PARAM_STR);
$this->sth->bindValue(':department_id', $this->dept_id, PDO::PARAM_STR);
$this->sth->bindValue(':EMAIL', $this->email, PDO::PARAM_STR);
$this->sth->bindValue(':FONE_NO', $this->fone_no, PDO::PARAM_STR);
$this->sth->bindValue(':MOB_NO', $this->mob_no, PDO::PARAM_STR);
$this->sth->bindValue(':ADDRESS', $this->address, PDO::PARAM_STR);
$this->sth->bindValue(':STATUS', $this->status, PDO::PARAM_STR);
$this->sth->bindValue(':NAMED_FLAG', $this->user_type, PDO::PARAM_STR);
$this->sth->bindValue(':EMP_NAMED_FLAG', $this->employee_name_flag, PDO::PARAM_STR);
$this->sth->bindValue(':CREATED_BY', $this->created_by, PDO::PARAM_STR);
$this->sth->bindValue(':START_TIME', $this->start_access_time, PDO::PARAM_STR);
$this->sth->bindValue(':END_TIME', $this->end_access_time, PDO::PARAM_STR);
$this->sth->bindValue(':ACTIVATEDTIME', $this->activated_time, PDO::PARAM_STR);
$this->sth->bindValue(':DEACTIVATEDTIME', $this->deactivated_time, PDO::PARAM_STR);
$this->sth->bindValue(':MAIL_FLAG', $this->mail_flag, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function edit_user_personal($value) {
/* $this->obj_query = $this->db->query("update user set
fname = '$this->fname',
mname = '$this->mname',
lname = '$this->lname',
org_id = '$this->org_id',
email = '$this->email',
fone_no = '$this->fone_no',
mob_no = '$this->mob_no',
address = '$this->address',
created_by = '$this->created_by' where id = '$value' ");
return $this->sth; */
$this->sth = $this->db->prepare("update user set
fname = :FNAME,
mname = :MNAME,
lname = :LNAME,
org_id = :ORGID,
department_id = :DEPTID,
email = :EMAIL,
fone_no = :FONE_NO,
mob_no = :MOB_NO,
address = :ADDRESS,
created_by = :CREATED_BY where id = :ID");
$this->sth->bindValue(':FNAME', $this->fname, PDO::PARAM_STR);
$this->sth->bindValue(':MNAME', $this->mname, PDO::PARAM_STR);
$this->sth->bindValue(':LNAME', $this->lname, PDO::PARAM_STR);
$this->sth->bindValue(':ORGID', $this->org_id, PDO::PARAM_STR);
$this->sth->bindValue(':DEPTID', $this->dept_id, PDO::PARAM_STR);
$this->sth->bindValue(':EMAIL', $this->email, PDO::PARAM_STR);
$this->sth->bindValue(':FONE_NO', $this->fone_no, PDO::PARAM_STR);
$this->sth->bindValue(':MOB_NO', $this->mob_no, PDO::PARAM_STR);
$this->sth->bindValue(':ADDRESS', $this->address, PDO::PARAM_STR);
$this->sth->bindValue(':CREATED_BY', $this->created_by, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function getLoginMast_ById($value) {
/* $this->obj_query = $this->db->query("SELECT * FROM login_mast WHERE id = '$value'");
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return; */
$this->sth = $this->db->prepare("SELECT * FROM login_mast WHERE user_id = :ID", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$this->sth->execute(array(':ID' => $value));
$this->return = $this->sth->fetchAll();
return $this->return;
}
//IDFC3 15-02-17
function add_login_mast() {
/* $this->obj_query = $this->db->query("insert into login_mast(
user_id,
role,
alt_role,
user_status,
username,
password) values(
'$this->user_id',
'$this->role',
'$this->alt_role',
'$this->user_status',
'$this->username',
'$this->password')");
return $this->db->lastInsertId(); */
$date = date("Y-m-d");
$this->sth = $this->db->prepare("insert into login_mast(
user_id,
role,
emp_role,
alt_role,
user_status,
username,
`password`,
renewed_at,ad_id) values(
:USER_ID,
:ROLE,
:EMP_ROLE,
:ALT_ROLE,
:USER_STATUS,
:USERNAME,
:PASSWORD,
:RENEWED_AT,
:AD_ID)");
$this->sth->bindValue(':USER_ID', $this->user_id, PDO::PARAM_STR);
$this->sth->bindValue(':ROLE', $this->role, PDO::PARAM_STR);
$this->sth->bindValue(':EMP_ROLE', $this->employee_role, PDO::PARAM_STR);
//idfc1 25-1-2017
$this->sth->bindValue(':ALT_ROLE', $this->alt_role, PDO::PARAM_STR);
$this->sth->bindValue(':USER_STATUS', $this->user_status, PDO::PARAM_STR);
$this->sth->bindValue(':USERNAME', $this->username, PDO::PARAM_STR);
$this->sth->bindValue(':PASSWORD', $this->password, PDO::PARAM_STR);
$this->sth->bindValue(':RENEWED_AT', $date, PDO::PARAM_STR);
$this->sth->bindValue(':AD_ID', $this->ad_id, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
//IDFC3 15-02-17
function edit_login_mast($value) {
/* $this->obj_query = $this->db->query("update login_mast set role = '$this->role', alt_role = '$this->alt_role', user_status = '$this->user_status' where user_id = '$value'");
return $this->sth; */
$this->sth = $this->db->prepare("update login_mast set role = :ROLE, emp_role = :EMP_ROLE, alt_role = :ALT_ROLE, user_status = :USER_STATUS, acct_locked_status = :LOCK_STATUS where user_id = :USER_ID");
$this->sth->bindValue(':ROLE', $this->role, PDO::PARAM_STR);
$this->sth->bindValue(':EMP_ROLE', $this->employee_role, PDO::PARAM_STR);
//idfc1 25-1-2017
$this->sth->bindValue(':ALT_ROLE', $this->alt_role, PDO::PARAM_STR);
$this->sth->bindValue(':USER_STATUS', $this->user_status, PDO::PARAM_STR);
$this->sth->bindValue(':LOCK_STATUS', $this->lock_status, PDO::PARAM_STR);
$this->sth->bindValue(':USER_ID', $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function edit_login_mast_personal($value) {
/* $this->obj_query = $this->db->query("update login_mast set username='$this->username',role ='$this->role' where user_id = '$value'");
return $this->sth; */
$this->sth = $this->db->prepare("update login_mast set username=:USERNAME,role =:ROLE where user_id = :USER_ID");
$this->sth->bindValue(':USERNAME', $this->username, PDO::PARAM_STR);
$this->sth->bindValue(':ROLE', $this->role, PDO::PARAM_STR);
$this->sth->bindValue(':USER_ID', $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_user($value) {
//$this->obj_query = $this->db->query("delete from user where id='$value'");
//return $this->obj_query;
$this->sth = $this->db->prepare("delete from user where id= :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_login_mast($value) {
//$this->obj_query = $this->db->query("delete from login_mast where user_id='$value'");
//return $this->obj_query;
$this->sth = $this->db->prepare("delete from login_mast where user_id= :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
return $this->sth->execute();
}
//21-09-2016
function delete_user_path($value) {
// echo "delete from user_file_path where user_id= $value";die;
$this->sth = $this->db->prepare("delete from user_file_path where user_id= :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function get_LoginMast_ByUID($value) {
/* $this->obj_query = $this->db->query("SELECT * FROM login_mast WHERE user_id = '$value'");
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return; */
$this->sth = $this->db->prepare("SELECT * FROM login_mast WHERE user_id = :ID", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$this->sth->execute(array(':ID' => $value));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function CheckUsername_availability() {
if (empty($this->id)) {
// $this->obj_query = $this->db->query("SELECT id FROM login_mast WHERE username = '$this->username'");
$this->sth = $this->db->prepare("SELECT id FROM login_mast WHERE username = :USERNAME AND delete_flag = '0'", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$this->sth->execute(array(':USERNAME' => $this->username));
} else {
//$this->obj_query = $this->db->query("SELECT id FROM login_mast WHERE username = '$this->username' AND user_id <> '$this->id'");
$this->sth = $this->db->prepare("SELECT id FROM login_mast WHERE username = :USERNAME AND user_id <> :ID AND delete_flag = '0'", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$this->sth->execute(array(':USERNAME' => $this->username, ':ID' => $this->id));
}
//$this->return = $this->obj_query->fetchAll(PDO::FETCH_ASSOC);
//return $this->return;
$this->return = $this->sth->fetchAll();
return $this->return;
}
function CheckEmail_availability() {
if (empty($this->id)) {
//$this->obj_query = $this->db->query("SELECT id FROM user WHERE email = '$this->email' AND delete_flag = '0'");
$this->sth = $this->db->prepare("SELECT id FROM user WHERE email = :EMAIL AND delete_flag = '0'");
//$$this->sth->execute(array(':EMAIL' => $this->email));
$this->sth->bindValue(":EMAIL", $this->email, PDO::PARAM_STR);
} else {
//$this->obj_query = $this->db->query("SELECT id FROM user WHERE email = '$this->email' AND id <> '$this->id' AND delete_flag = '0'");
$this->sth = $this->db->prepare("SELECT id FROM user WHERE email = :EMAIL AND id <> :ID AND delete_flag = '0'");
//$this->sth->execute(array(':EMAIL' => $this->email, ':ID' => $this->id));
$this->sth->bindValue(":EMAIL", $this->email, PDO::PARAM_STR);
$this->sth->bindValue(":ID", $this->id, PDO::PARAM_STR);
}
//$this->return = $this->obj_query->fetchAll(PDO::FETCH_ASSOC);
//return $this->return;
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getUserID_byname($firstname, $lastname) {
// $this->obj_query = $this->db->query("SELECT * FROM user_group WHERE id = '$value'");
// $this->return = $this->obj_query->fetchAll(PDO::FETCH_ASSOC);
$this->sth = $this->db->prepare("SELECT id FROM user WHERE fname = :ID and lname= :ID1 AND delete_flag = '0'");
$this->sth->bindValue(":ID", $firstname, PDO::PARAM_STR);
$this->sth->bindValue(":ID1", $lastname, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//***********************//
// USER GROUP //
//***********************//
function getUserGroup_byId($value) {
// $this->obj_query = $this->db->query("SELECT * FROM user_group WHERE id = '$value'");
// $this->return = $this->obj_query->fetchAll(PDO::FETCH_ASSOC);
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE id = :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getUserRole_byId($value) {
// $this->obj_query = $this->db->query("SELECT * FROM user_group WHERE id = '$value'");
// $this->return = $this->obj_query->fetchAll(PDO::FETCH_ASSOC);
$this->sth = $this->db->prepare("SELECT * FROM workflow_roles WHERE id = :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//idfc1 25-1-2017 IDFC2 //IDFC3 15-02-17
// function getUserGroupByEmpFlag() {
// $this->obj_query = $this->db->query("SELECT * FROM user_group where emp_flag = '1' AND id IN (1,2,13,30)");
// $this->return = $this->obj_query->fetchAll(PDO::FETCH_ASSOC);
// return $this->return;
// }
//Phoenix 26-12-16
function getUserGroup() {
$this->sth = $this->db->prepare("SELECT * FROM user_group ");
$this->sth->execute();
//WHERE id != '1'
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getUserGroup_OnlySA() {
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE id = '1'");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
// Phoenix1 29-12-16
function getUserGroupAll() {
$this->sth = $this->db->prepare("SELECT * FROM user_group order by id asc");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//updated 19-12-2016 phoenix1, IDFC1
function getUserGroup_all() {
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE parent_id = 0 order by id asc");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
// updated 16-12-2016 IDFC1 //IDFC3 15-02-17
function add_usergroup() {
$this->sth = $this->db->prepare("insert into user_group(
hierarchy,
parent_id,
name,
description,
named_flag,
rootnode,
usergroupalias,
emp_flag) values(
:HIERARCHY,
:PARENTID,
:NAME,
:DESCRIPTION,
:NAMED_FLAG,
:ROOTNODE,
:USERGROUPALIAS,
:EMP_FLAG)");
$this->sth->bindValue(':HIERARCHY', $this->hierarchy, PDO::PARAM_STR);
$this->sth->bindValue(':PARENTID', $this->parent_id, PDO::PARAM_STR);
$this->sth->bindValue(':NAME', $this->name, PDO::PARAM_STR);
$this->sth->bindValue(':DESCRIPTION', $this->description, PDO::PARAM_STR);
$this->sth->bindValue(':NAMED_FLAG', $this->named_user, PDO::PARAM_STR);
$this->sth->bindValue(':ROOTNODE', $this->rootnode, PDO::PARAM_STR);
$this->sth->bindValue(':USERGROUPALIAS', $this->usergroupalias, PDO::PARAM_STR);
$this->sth->bindValue(':EMP_FLAG', $this->employee_ug_flag, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
// updated 16-12-2016 IDFC //IDFC3 15-02-17
function edit_usergroup($value) {
// echo "update user_group set hierarchy = $this->hierarchy, parent_id = $this->parent_id,
// name = '$this->name',
// description = '$this->description',
// named_flag='$this->named_user',
// usergroupalias='$this->usergroupalias',
// emp_flag='$this->employee_ug_flag'
// where id =$value";
$this->sth = $this->db->prepare("update user_group set hierarchy = :HIERARCHY, parent_id = :PARENTID,
name = :NAME,
description = :DESCRIPTION,
named_flag=:NAMED_FLAG,
usergroupalias=:USERGROUPALIAS,
emp_flag=:EMP_FLAG
where id = :ID");
$this->sth->bindValue(':HIERARCHY', $this->hierarchy, PDO::PARAM_STR);
$this->sth->bindValue(':PARENTID', $this->parent_id, PDO::PARAM_STR);
$this->sth->bindValue(':NAME', $this->name, PDO::PARAM_STR);
$this->sth->bindValue(':DESCRIPTION', $this->description, PDO::PARAM_STR);
$this->sth->bindValue(':NAMED_FLAG', $this->named_user, PDO::PARAM_STR);
$this->sth->bindValue(':USERGROUPALIAS', $this->usergroupalias, PDO::PARAM_STR);
$this->sth->bindValue(':EMP_FLAG', $this->employee_ug_flag, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $value, PDO::PARAM_STR);
return $this->sth->execute();
}
//idfc1 24-1-2017
function edit_alias($value) {
$this->sth = $this->db->prepare("update user_group set usergroupalias=:USERGROUPALIAS
where id = :ID");
$this->sth->bindValue(':USERGROUPALIAS', $this->usergroupalias, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_usergroup($value) {
//$this->obj_query = $this->db->query("delete from user_group where id='$value'");
//return $this->obj_query;
$this->sth = $this->db->prepare("delete from user_group where id= :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
return $this->sth->execute();
}
function getUserGroup_byname($value) {
//echo "SELECT id, name FROM user_group WHERE name = '$value'";
/* die; */
// $this->obj_query = $this->db->query("SELECT * FROM user_group WHERE id = '$value'");
// $this->return = $this->obj_query->fetchAll(PDO::FETCH_ASSOC);
$this->sth = $this->db->prepare("SELECT id, name FROM user_group WHERE name = :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//***********************//
// Assign Members DM //
//***********************//
function setMemId($value) {
if ($value == '') {
$this->mem_id = '';
} else {
$this->mem_id = $value;
}
return true;
}
function setDmId($value) {
if ($value == '') {
$this->pm_id = '';
} else {
$this->pm_id = $value;
}
return true;
}
function add_Assign_Mem_Dm() {
/* $this->obj_query = $this->db->query("insert into assign_mem_pm(
mem_id,
pm_id) values(
'$this->mem_id',
'$this->pm_id')");
return $this->db->lastInsertId(); */
$this->sth = $this->db->prepare("insert into assign_mem_pm(
mem_id,
pm_id) values(
:MEM_ID
:PM_ID)");
$this->sth->bindValue(':MEM_ID', $this->mem_id, PDO::PARAM_STR);
$this->sth->bindValue(':PM_ID', $this->pm_id, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Assign_Mem_Dm() {
//$this->obj_query = $this->db->query("DELETE FROM `assign_mem_pm` WHERE `mem_id` = '$this->mem_id' AND pm_id = '$this->pm_id'");
//return $this->obj_query;
$this->sth = $this->db->prepare("DELETE FROM `assign_mem_pm` WHERE `mem_id` = :MEM_ID AND pm_id = :PM_ID");
$this->sth->bindValue(":MEM_ID", $this->mem_id, PDO::PARAM_STR);
$this->sth->bindValue(":PM_ID", $this->pm_id, PDO::PARAM_STR);
return $this->sth->execute();
}
//******************************//
// Assign Members TO DEAL ROOM //
//******************************//
function setProjectId($value) {
if ($value == '') {
$this->project_id = '';
} else {
$this->project_id = $value;
}
return true;
}
function setAssignedBy($value) {
if ($value == '') {
$this->assigned_by = '';
} else {
$this->assigned_by = $value;
}
return true;
}
function Verify_Assign_Mem_Project() {
//$this->obj_query = $this->db->query("SELECT id FROM `assign_mem_project` WHERE mem_id = '$this->mem_id' AND project_id = '$this->project_id'");
//$this->return = $this->obj_query->fetchAll(PDO::FETCH_ASSOC);
//return $this->return;
$this->sth = $this->db->prepare("SELECT id FROM `assign_mem_project` WHERE mem_id = :MID AND project_id = :PID");
$this->sth->bindValue(':PID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':MID', $this->mem_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function add_Assign_Mem_Project() {
// echo "insert into assign_mem_project(mem_id, role, project_id, assigned_by) values('$this->mem_id', '$this->role', '$this->project_id', '$this->assigned_by')";
/* $this->obj_query = $this->db->query("insert into assign_mem_project(mem_id, role, project_id, assigned_by) values('$this->mem_id', '$this->role', '$this->project_id', '$this->assigned_by')");
return $this->db->lastInsertId(); */
$this->sth = $this->db->prepare("insert into assign_mem_project(mem_id, role, project_id, assigned_by) values(:MEM_ID, :ROLE, :PROJECT_ID, :ASSIGNED_BY)");
$this->sth->bindValue(':MEM_ID', $this->mem_id, PDO::PARAM_STR);
$this->sth->bindValue(':ROLE', $this->role, PDO::PARAM_STR);
$this->sth->bindValue(':PROJECT_ID', $this->project_id, PDO::PARAM_STR);
$this->sth->bindValue(':ASSIGNED_BY', $this->assigned_by, PDO::PARAM_STR);
$this->sth->execute();
return $this->db->lastInsertId();
}
function delete_Assign_Mem_Project() {
// $this->obj_query = $this->db->query("DELETE FROM `assign_mem_project` WHERE `mem_id` = '$this->mem_id' AND project_id = '$this->project_id'");
//return $this->obj_query;
$this->sth = $this->db->prepare("DELETE FROM `assign_mem_project` WHERE `mem_id` = :MEM_ID AND project_id = :PID");
$this->sth->bindValue(":MEM_ID", $this->mem_id, PDO::PARAM_STR);
$this->sth->bindValue(":PID", $this->project_id, PDO::PARAM_STR);
return $this->sth->execute();
}
function delete_Assign_Mem_Project_ByPID($value) {
//$this->obj_query = $this->db->query("DELETE FROM `assign_mem_project` WHERE project_id = '$value'");
//return $this->obj_query;
$this->sth = $this->db->prepare("DELETE FROM `assign_mem_project` WHERE project_id = :PID");
$this->sth->bindValue(":PID", $value, PDO::PARAM_STR);
return $this->sth->execute();
}
/* function getDealMem_UnAssigned_ByGroup($gid, $pid){
$this->sth = $this->db->query("SELECT am.mem_id, u.id, u.fname, u.mname, u.lname FROM `assign_mem_pm` AS am
JOIN login_mast AS l ON am.mem_id = l.user_id
JOIN user AS u ON u.id = l.user_id
JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.alt_role) > 0)
WHERE l.role != '2' AND l.role != '1'
AND l.user_status = '1'
AND g.id = '$gid'
AND am.mem_id NOT IN (SELECT mem_id FROM assign_mem_project WHERE project_id = '$pid')
GROUP BY l.user_id
ORDER BY u.fname ASC");
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
} */
function getDealMem_UnAssigned_ByGroup($gid, $pid) {
/* $this->obj_query = $this->db->query("SELECT u.id, u.fname, u.mname, u.lname FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.alt_role) > 0)
WHERE l.role != '2' AND l.role != '1' AND l.user_status = '1' AND g.id = '$gid'
AND u.id NOT IN (SELECT mem_id FROM assign_mem_project WHERE project_id = '$pid')
GROUP BY l.user_id ORDER BY u.fname ASC");
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return; */
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.alt_role) > 0)
WHERE l.role != '2' AND l.role != '1' AND l.delete_flag = '0' AND l.user_status = '1' AND g.id = :GID
AND u.id NOT IN (SELECT mem_id FROM assign_mem_project WHERE project_id = :PID)
GROUP BY l.user_id ORDER BY u.fname ASC");
$this->sth->execute(array(':GID' => $gid, ':PID' => $pid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getMd_mem_Unassigned($pm_id, $p_id) {
/* $this->obj_query = $this->db->query("SELECT assign_mem_pm.mem_id, user.id, user.fname, user.mname, user.lname FROM `assign_mem_pm`
JOIN login_mast ON assign_mem_pm.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE `pm_id` = '$pm_id' AND login_mast.role != '2' AND login_mast.role != '1'
AND login_mast.user_status = '1'
AND mem_id NOT IN (SELECT mem_id FROM assign_mem_project WHERE project_id = '$p_id')
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return; */
$this->sth = $this->db->prepare("SELECT assign_mem_pm.mem_id, user.id, user.fname, user.mname, user.lname FROM `assign_mem_pm`
JOIN login_mast ON assign_mem_pm.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE `pm_id` = :PM_ID AND login_mast.role != '2' AND login_mast.delete_flag = '0' AND login_mast.role != '1'
AND login_mast.user_status = '1'
AND mem_id NOT IN (SELECT mem_id FROM assign_mem_project WHERE project_id = :P_ID)
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->execute(array(':P_ID' => $p_id));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getMd_mem_Assigned($p_id) {
/* $this->obj_query1 = $this->db->query("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = '$p_id' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = :P_ID AND login_mast.role != '1' AND login_mast.delete_flag = '0' AND login_mast.role != '2'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->execute(array(':P_ID' => $p_id));
$this->return1 = $this->sth->fetchAll();
/* $this->obj_query2 = $this->db->query("SELECT project.id as project_id, 2 as role, user.id, user.fname, user.mname, user.lname FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE project.id = '$p_id'
AND login_mast.user_status = '1'
ORDER BY user.fname ASC");
$this->return2 = $this->sth2->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT project.id as project_id, 2 as role, user.id, user.fname, user.mname, user.lname FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE project.id = :PID
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
ORDER BY user.fname ASC");
$this->sth->execute(array(':PID' => $p_id));
$this->return2 = $this->sth->fetchAll();
return array_merge($this->return1, $this->return2);
}
function getMd_mem_AssignedWithOutDM($p_id) {
/* $this->obj_query1 = $this->db->query("SELECT assign_mem_project.project_id, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project`
JOIN login_mast ON assign_mem_project.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE assign_mem_project.project_id = '$p_id' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC);
return $this->return1; */
$this->sth = $this->db->prepare("SELECT assign_mem_project.project_id, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project`
JOIN login_mast ON assign_mem_project.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE assign_mem_project.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->execute(array(':PID' => $p_id));
$this->return1 = $this->sth->fetchAll();
return $this->return1;
}
function getMd_mem_Assigned_All($p_id) {
/* $this->obj_query1 = $this->db->query("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = '$p_id' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
/* $this->obj_query2 = $this->db->query("SELECT * FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE project.id = '$p_id'
AND login_mast.user_status = '1'
ORDER BY user.fname ASC"); */
//$this->return2 = $this->obj_query2->fetchAll(PDO::FETCH_ASSOC);
//return array_merge($this->return1, $this->return2);
//return $this->return1;
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by,login_mast.username FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->execute(array(':PID' => $p_id));
$this->return1 = $this->sth->fetchAll();
return $this->return1;
}
function get_default_assign($aColumns, $val, $sOrder, $sLimit) {
$aColumns_re = str_replace(" , ", " ", implode(", ", $aColumns));
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re . " FROM assign_mem_project as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id WHERE $val
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
GROUP BY login_mast.user_id
$sOrder $sLimit");
$this->sth->execute();
//echo "SELECT SQL_CALC_FOUND_ROWS " . $aColumns_re . " FROM assign_mem_project as pmem
// JOIN login_mast ON pmem.mem_id = login_mast.user_id
// JOIN user ON user.id = login_mast.user_id WHERE $val
// AND login_mast.user_status = '1'
// GROUP BY login_mast.user_id
// $sOrder $sLimit";
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function get_default_assign_user_id($val) {
$this->sth = $this->db->prepare("SELECT user.id FROM assign_mem_project as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id WHERE $val
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
GROUP BY login_mast.user_id");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getDeal_Mem_Assigned_Org($pid, $guest_id, $role) {
if ($role == 1 || $role == 2) {
/* $this->obj_query1 = $this->db->query("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC"); */
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
//$this->sth->execute(array(':username' => $this->username));
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return1 = $this->sth->fetchAll();
/* $this->obj_query2 = $this->db->query("SELECT project.id as project_id, 2 as role, user.id, user.fname, user.mname, user.lname FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE project.id = '$pid'
AND login_mast.user_status = '1'
ORDER BY user.fname ASC"); */
$this->sth = $this->db->prepare("SELECT project.id as project_id, 2 as role, user.id, user.fname, user.mname, user.lname FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE project.id = :PID
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return2 = $this->sth->fetchAll();
} else {
/* $this->obj_query1 = $this->db->query("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND g.id = '$guest_id'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND g.id = GID
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":GID", $guest_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return1 = $this->sth->fetchAll();
/* $this->obj_query2 = $this->db->query("SELECT project.id as project_id, 2 as role, user.id, user.fname, user.mname, user.lname FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE project.id = '$pid'
AND login_mast.user_status = '1' AND g.id = '$guest_id'
ORDER BY user.fname ASC"); */
$this->sth = $this->db->prepare("SELECT project.id as project_id, 2 as role, user.id, user.fname, user.mname, user.lname FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE project.id = :PID
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND g.id = :GID
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":GID", $guest_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return2 = $this->sth->fetchAll();
}
return array_merge($this->return1, $this->return2);
}
function getDeal_Mem_Assigned_Org_All($pid, $guest_id, $role) {
if ($role == 1 || $role == 2) {
/* $this->obj_query1 = $this->db->query("SELECT pmem.project_id, pmem.role, user.id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return1 = $this->sth->fetchAll();
/* $this->obj_query2 = $this->db->query("SELECT project.id as project_id, 2 as role, user.id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE project.id = '$pid'
AND login_mast.user_status = '1'
ORDER BY user.fname ASC");
$this->return2 = $this->sth2->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT project.id as project_id, 2 as role, user.id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE project.id = :PID
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return2 = $this->sth->fetchAll();
} else {
/* $this->obj_query1 = $this->db->query("SELECT pmem.project_id, pmem.role, user.id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND g.id = '$guest_id'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND g.id = :GID
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":GID", $guest_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return1 = $this->sth->fetchAll();
/* $this->obj_query2 = $this->db->query("SELECT project.id as project_id, 2 as role, user.id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE project.id = '$pid'
AND login_mast.user_status = '1' AND g.id = '$guest_id'
ORDER BY user.fname ASC");
$this->return2 = $this->sth2->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT project.id as project_id, 2 as role, user.id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE project.id = :PID
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND g.id = :GID
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":GID", $guest_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return2 = $this->sth->fetchAll();
}
return array_merge($this->return1, $this->return2);
}
function getDeal_Mem_Assigned_Group_Org($pid, $guest_id, $role) {
if ($role == 1 || $role == 2) {
/* $this->obj_query1 = $this->db->query("SELECT DISTINCT(user.org_id) FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND user.org_id != ''
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT DISTINCT(user.org_id) FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND user.org_id != ''
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return1 = $this->sth->fetchAll();
/* $this->obj_query2 = $this->db->query("SELECT DISTINCT(user.org_id) FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE project.id = '$pid'
AND login_mast.user_status = '1' AND user.org_id != ''
ORDER BY user.fname ASC");
$this->return2 = $this->sth2->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT DISTINCT(user.org_id) FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE project.id = :PID
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND user.org_id != ''
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return2 = $this->sth->fetchAll();
} else {
/* $this->obj_query1 = $this->db->query("SELECT DISTINCT(user.org_id) FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND g.id = '$guest_id' AND user.org_id != ''
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT DISTINCT(user.org_id) FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND g.id = :GID AND user.org_id != ''
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":GID", $guest_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return1 = $this->sth->fetchAll();
/* $this->obj_query2 = $this->db->query("SELECT DISTINCT(user.org_id) FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE project.id = '$pid'
AND login_mast.user_status = '1' AND g.id = '$guest_id' AND user.org_id != ''
ORDER BY user.fname ASC");
$this->return2 = $this->sth2->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT DISTINCT(user.org_id) FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND g.id = :GID AND user.org_id != ''
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":GID", $guest_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return2 = $this->sth->fetchAll();
}
return array_merge($this->return1, $this->return2);
}
function getDeal_Mem_Assigned_Filter($pid, $guest_id, $role, $filter_id) {
if ($role == 1 || $role == 2) {
/* $this->obj_query1 = $this->db->query("SELECT pmem.project_id, pmem.role, user.id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1'
AND g.id = '$filter_id'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
AND g.id = :FID
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":FID", $filter_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return1 = $this->sth->fetchAll();
}
return $this->return1;
}
function getDeal_Mem_AssignedWithOutDM_Org($p_id, $org_id, $role) {
if ($role == 1 || $role == 2) {
/* $this->obj_query1 = $this->db->query("SELECT assign_mem_project.project_id, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project`
JOIN login_mast ON assign_mem_project.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE assign_mem_project.project_id = '$p_id' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC"); */
$this->sth = $this->db->prepare("SELECT assign_mem_project.project_id, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project`
JOIN login_mast ON assign_mem_project.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE assign_mem_project.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->execute();
$this->return1 = $this->sth->fetchAll();
} else {
/* $this->obj_query1 = $this->db->query("SELECT assign_mem_project.project_id, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project`
JOIN login_mast ON assign_mem_project.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE assign_mem_project.project_id = '$p_id' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND user.org_id = '$org_id'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC"); */
$this->sth = $this->db->prepare("SELECT assign_mem_project.project_id, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project`
JOIN login_mast ON assign_mem_project.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE assign_mem_project.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND user.org_id = :OID AND login_mast.delete_flag = '0'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":OID", $org_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return1 = $this->sth->fetchAll();
}
return $this->return1;
}
function getDeal_Mem_Assigned_ByGroup($pid, $guest_id, $role) {
if ($role == 1 || $role == 2) {
/* $this->obj_query1 = $this->db->query("SELECT DISTINCT(pmem.role), user_group.name FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN user_group ON user_group.id = login_mast.role
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
$sth = $this->db->prepare("SELECT DISTINCT(pmem.role), user_group.name FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN user_group ON user_group.id = login_mast.role
WHERE pmem.project_id = :PROJECT_ID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$sth->execute(array(':PROJECT_ID' => $pid));
$this->return1 = $sth->fetchAll();
} else {
/* $this->obj_query1 = $this->db->query("SELECT DISTINCT(pmem.role) FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND g.id = '$guest_id'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT DISTINCT(pmem.role) FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = :PROJECT_ID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND g.id =:GUEST_ID AND login_mast.delete_flag = '0'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->execute(array(':PROJECT_ID' => $pid, ':GUEST_ID' => $guest_id));
$this->return1 = $this->sth->fetchAll();
}
return $this->return1;
}
function getDeal_Mem_Assigned_Group_users($pid, $guest_id, $role, $g_id) {
if ($role == 1 || $role == 2) {
/* $this->obj_query1 = $this->db->query("SELECT pmem.project_id, pmem.role, user.id as user_id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND pmem.role='$g_id'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id as user_id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = :PROJECT_ID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND pmem.role=:GID AND login_mast.delete_flag = '0'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->execute(array(':PROJECT_ID' => $pid, ':GID' => $g_id));
$this->return1 = $this->sth->fetchAll();
} else {
/* $this->obj_query1 = $this->db->query("SELECT pmem.project_id, pmem.role, user.id as user_id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND pmem.role='$g_id' AND g.id = '$guest_id'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id as user_id, user.org_id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = :PROJECT_ID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND pmem.role=:GID AND g.id = :GUEST_ID
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->execute(array(':PROJECT_ID' => $pid, ':GID' => $g_id, ':GUEST_ID' => $guest_id));
$this->return1 = $this->sth->fetchAll();
}
return $this->return1;
}
function getDeal_Mem_Assigned_UserId($pid, $uid) {
/* $this->obj_query1 = $this->db->query("SELECT * FROM `assign_mem_project` WHERE project_id = '$pid' AND mem_id = '$uid'");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC);
return $this->return1; */
$this->sth = $this->db->prepare("SELECT * FROM `assign_mem_project` WHERE project_id = :PROJECT_ID AND mem_id = :UID");
$this->sth->execute(array(':PROJECT_ID' => $pid, ':UID' => $uid));
$this->return1 = $this->sth->fetchAll();
return $this->return1;
}
//Added By Sri for WORKFLOW
function get_Deal_Assigned_UserGroups($pid, $role) {
$this->sth = $this->db->prepare("SELECT * FROM assign_mem_project WHERE project_id = :PROJECT_ID AND role = :ROLE");
$this->sth->execute(array(':PROJECT_ID' => $pid, ':ROLE' => $role));
$this->return1 = $this->sth->fetchAll();
return $this->return1;
}
function getuserList() {
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname , l.username FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id WHERE u.delete_flag = '0'");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getUserCount($role) {
$this->sth = $this->db->prepare("SELECT * FROM login_mast WHERE role= :ROLE AND delete_flag = '0'");
$this->sth->bindValue(":ROLE", $role, PDO::PARAM_STR);
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getActiveUsers() {
$this->sth = $this->db->prepare("SELECT COUNT(`id`) AS user_active_count FROM `login_mast` WHERE `user_status` = 1");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
// Added by sakshee 27/11/2015
function update_assign_mem_project($id) {
$this->sth = $this->db->prepare("update assign_mem_project set role = :ROLE where mem_id = :ID ");
$this->sth->bindValue(":ROLE", $this->role, PDO::PARAM_STR);
$this->sth->bindValue(":ID", $id, PDO::PARAM_STR);
return $this->sth->execute();
}
//Date 2/06/16 Vishakha
function getuserAccessList($pid) {
$this->sth = $this->db->prepare("SELECT user.id ,user.fname,user.mname,user.lname,am.project_id from user join login_mast on user.id=login_mast.user_id join assign_mem_project am on login_mast.user_id=am.mem_id where login_mast.user_status=1 and login_mast.role!=1 and login_mast.role!=2 and login_mast.delete_flag = '0' and am.project_id=:PID ");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->execute();
// echo "SELECT user.id ,user.fname,user.mname,user.lname,am.project_id from user join login_mast on user.id=login_mast.user_id join assign_mem_project am on login_mast.user_id=am.mem_id where login_mast.user_status=1 and login_mast.role!=1 and login_mast.role!=2 and am.project_id=$pid ";
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getuserAccessRight($pid, $user_id) {
$this->sth = $this->db->prepare("SELECT user.fname,user.mname,user.lname,ud.watermark,ud.permission,ud.project_id from user join login_mast lm on user.id=lm.user_id join user_default_rights ud on ud.user_id=lm.user_id where ud.project_id=:PID and lm.user_id=:USER_ID and lm.delete_flag = '0'");
$this->sth->bindValue(":PID", $pid, PDO::PARAM_STR);
$this->sth->bindValue(":USER_ID", $user_id, PDO::PARAM_STR);
$this->sth->execute();
// echo "<pre>";
// echo "SELECT user.fname,user.mname,user.lname,ud.permission,ud.project_id from user join login_mast lm on user.id=lm.user_id join user_default_rights ud on ud.user_id=lm.user_id where ud.project_id=$pid and lm.user_id=$user_id";
// echo "select am.project_id,ud.permission,lm.user_id, ud.watermark,lm.username,user.fname,user.mname,user.lname from login_mast lm join assign_mem_project am on lm.user_id=am.mem_id join user_default_rights ud on ud.user_id=am.mem_id join user on user.id=lm.user_id where lm.id=$id and am.project_id=$pid";
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getMd_mem_Assigned_DEFAULT($p_id, $id) {
/* $this->obj_query1 = $this->db->query("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = '$p_id' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
/* $this->obj_query2 = $this->db->query("SELECT * FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE project.id = '$p_id'
AND login_mast.user_status = '1'
ORDER BY user.fname ASC"); */
//$this->return2 = $this->obj_query2->fetchAll(PDO::FETCH_ASSOC);
//return array_merge($this->return1, $this->return2);
//return $this->return1;
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND user_id=:USERID
GROUP BY login_mast.user_id
ORDER BY user.fname ASC ");
// echo "SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
// JOIN login_mast ON pmem.mem_id = login_mast.user_id
// JOIN user ON user.id = login_mast.user_id
// WHERE pmem.project_id = $p_id AND login_mast.role != '1' AND login_mast.role != '2'
// AND login_mast.user_status = '1' AND user_id=$id
// GROUP BY login_mast.user_id
// ORDER BY user.fname ASC ";
$this->sth->execute(array(':PID' => $p_id, ':USERID' => $id));
$this->return1 = $this->sth->fetchAll();
return $this->return1;
}
//23-06-2016
function getOrganisation_ByName($value) {
// $this->obj_query = $this->db->query("SELECT id, org_name FROM mod_organisation WHERE id = '$value'");
// $this->return = $this->obj_query->fetchAll(PDO::FETCH_ASSOC);
// echo "SELECT id, org_name FROM mod_organisation WHERE org_name = $value";
$this->sth = $this->db->prepare("SELECT id, org_name FROM mod_organisation WHERE org_name = :NAME");
$this->sth->bindValue(":NAME", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function add_bulk_user($fields, $values) {
// echo "insert into user(".$fields.") values (".$values.")".'********';
$this->sth = $this->db->prepare("insert into user(" . $fields . ") values (" . $values . ")");
$this->sth->execute();
return $this->db->lastInsertId();
}
function add_bulk_login_mast($fields, $values) {
// echo "insert into login_mast(".$fields.") values (".$values.")".'##########';
$this->sth = $this->db->prepare("insert into login_mast(" . $fields . ") values (" . $values . ")");
$this->sth->execute();
return $this->db->lastInsertId();
}
//khushboo 11-7-16
function getMd_mem_Assigned_ByUser_id($p_id, $user_id) {
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname, user.email, user.mob_no, user.created_by FROM `assign_mem_project` as pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = :PID AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND user.id = :USER_ID
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->bindValue(":USER_ID", $user_id, PDO::PARAM_STR);
$this->sth->execute(array(':PID' => $p_id));
$this->return1 = $this->sth->fetchAll();
return $this->return1;
}
//08-08-2016 //IDFC4 20-02-17
//vidhya 28/07/2020
function getUserDetails_DataTable($sWhere, $orderby, $limit, $pdobind_array) {
//Phoenix1 29-12-16 named user
if (trim($sWhere) != '') {
$where = "AND u.delete_flag = '0'";
} else {
$where = "WHERE u.delete_flag = '0'";
}
$query = "SELECT SQL_CALC_FOUND_ROWS u.id,u.activated_time,u.deactivated_time,concat(u.fname,' ',u.mname,' ',u.lname) as fname,l.username,ug.name as role,u.department_id as department,ug1.name as emp_role_name,IF(u.named_flag = '1', 'Named',IF(u.named_flag= '2','Concurrent Restricted',IF(u.named_flag= '3','Named Restricted',IF(u.named_flag=0,'Concurrent','')))) AS user_type,IF(u.emp_named_flag = '1', 'Named', IF(u.emp_named_flag= '2','Concurrent Restricted', IF(u.emp_named_flag= '3','Named Restricted',IF(u.emp_named_flag=0,'Concurrent','')))) AS user_type_emp,u.email,u.mob_no, if(u.status='YES','Active','Inactive') as status,l.acct_locked_status,l.current_session_id,l.user_id,l.last_login,
if(l.role = 1, (SELECT GROUP_CONCAT(p.project_name) from project p),if(l.role = 2, ifnull((SELECT GROUP_CONCAT(p.project_name) from project p where p.project_manager = u.id),'NA'),(ifnull((SELECT GROUP_CONCAT(p.project_name) FROM assign_mem_project as am LEFT JOIN project p ON p.id = am.project_id WHERE mem_id = u.id),'NA')))) AS dealroom_count,(select count(id) from categories c where FIND_IN_SET(u.id,a_users) AND c.parent_id <> 0 AND c.category_delete <> 1) as category_count,ad.server_name as server_name FROM user u LEFT JOIN login_mast l ON u.id = l.user_id LEFT JOIN user_group ug ON l.role = ug.id LEFT JOIN user_group ug1 ON l.emp_role = ug1.id left join ad_server ad on ad.id=l.ad_id " . $sWhere . ' ' . $where . " Order by u.id asc " . ' ' . $limit;
//echo $query;die;
$this->sth = $this->db->prepare($query);
foreach ($pdobind_array as $pdobind_key => $pdobind_val) {
$this->sth->bindValue($pdobind_key, $pdobind_val[0], $pdobind_val[1]);
}
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//Devarshi
function get_login_mast_by_user_id($val) {
$this->sth = $this->db->prepare("SELECT * FROM login_mast where user_id=:VAL");
$this->sth->bindValue(":VAL", $val, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//IDFC4 17-02-17
function getDealMem_Assigned_ByGroup($gid, $pid) {
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.emp_role) > 0)
WHERE l.role != '2' AND l.role != '1' AND l.user_status = '1' AND l.delete_flag = '0' AND g.id IN ($gid)
AND u.id IN (SELECT mem_id FROM assign_mem_project WHERE project_id = :PID)
GROUP BY l.user_id ORDER BY u.fname ASC");
$this->sth->execute(array(':PID' => $pid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
//ABHIJEET 28/10/2016
function checkFromLastNPasswords($password, $id, $no_of_passwords) {
$this->sth = $this->db->prepare("select `password` from user_passwords where user_id= :ID order by id desc limit 0," . $no_of_passwords);
$this->sth->bindValue(":ID", $id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
foreach ($this->return as $value) {
if ($value['password'] == $password) {
return true;
}
}
return false;
}
//ABHIJEET 28/10/2016
function addPasswordInUserPasswords($password, $user_id) {
$this->sth = $this->db->prepare("insert into user_passwords(
user_id,
`password`,
log_datetime)
values (:USER_ID,
:PASSWORD,
NOW())");
$this->sth->bindValue(':PASSWORD', $password, PDO::PARAM_STR);
$this->sth->bindValue(':USER_ID', $user_id, PDO::PARAM_STR);
$this->sth->execute();
}
//ABHIJEET 28/10/2016
function deleteUserFromUserPasswords($user_id) {
$this->sth = $this->db->prepare("delete from user_passwords where user_id= :ID");
$this->sth->bindValue(":ID", $user_id, PDO::PARAM_STR);
return $this->sth->execute();
}
//28-11/2016
function get_password_policy_details() {
$this->sth = $this->db->prepare("SELECT * FROM password_policy");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//28-11-2016 sushant
function getUsersBysession() {
$this->sth = $this->db->prepare("SELECT * FROM login_mast where current_session_id != ''");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//IDFC3 15-02-17
//phoenix siddhesh, abhijeet //Phoenix 26-12-16 Phoenix1 29-12-16 //IDFC2
function get_user_group_by_user_type($user_type) {
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE named_flag=:USER_TYPE AND hierarchy=0 order by id asc");
$this->sth->bindValue(":USER_TYPE", $user_type, PDO::PARAM_STR);
$this->sth->execute();
//WHERE id != '1'
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//phoenix siddhesh, abhijeet //IDFC2
function getActiveUsersByUserType($user_type) {
$this->sth = $this->db->prepare("SELECT COUNT(id) AS user_active_count FROM `user` WHERE status = 'YES' AND named_flag=:USER_TYPE");
$this->sth->bindValue(":USER_TYPE", $user_type, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
// abhijeet 22/2/2017 IDFC3
function getActiveUsersByUserTypeEmp($user_type) {
$this->sth = $this->db->prepare("SELECT COUNT(id) AS user_active_count FROM `user` WHERE status = 'YES' AND (emp_named_flag=:USER_TYPE OR named_flag=:USER_TYPE)");
$this->sth->bindValue(":USER_TYPE", $user_type, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//phoenix 19-12-2016 //IDFC2
function getUserGroupAllByType($named_flag) {
$this->sth = $this->db->prepare("SELECT * FROM user_group where named_flag = :NAMED_FLAG AND (hierarchy=0 AND parent_id =0) OR (hierarchy=1 AND parent_id <>0) ");
$this->sth->bindValue(":NAMED_FLAG", $named_flag, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//phoenix 21-12-2016
function chkManagerByPid($value) {
// echo "SELECT id FROM project where id= $value AND project_manager <> 0 ";
$this->sth = $this->db->prepare("SELECT * FROM project where id= :VALUE AND project_manager <> 0 ");
$this->sth->bindValue(":VALUE", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//phoenix 21-12-2016
function getUserRoleById($value) {
// echo "SELECT role FROM login_mast where user_id= $value";die;
$this->sth = $this->db->prepare("SELECT role FROM login_mast where user_id= :VALUE");
$this->sth->bindValue(":VALUE", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//phoenix 21-12-2016
function hidedeletebyRole($role, $user_id) {
if ($role == 2) {
$this->sth = $this->db->prepare("SELECT * FROM project where project_manager= :USER_ID");
$this->sth->bindValue(":USER_ID", $user_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
} else {
$this->sth = $this->db->prepare("SELECT * FROM assign_mem_project where mem_id IN ($user_id)");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
}
//phoenix 21-12-2016
function getAssigned_ById($value) {
// echo "SELECT id FROM project where id= $value AND project_manager <> 0 ";
$this->sth = $this->db->prepare("SELECT * FROM assign_mem_project where mem_id= :VALUE");
$this->sth->bindValue(":VALUE", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//phoenix 21-12-2016
function delete_Assign_Mem($id) {
//$this->obj_query = $this->db->query("DELETE FROM `assign_mem_pm` WHERE `mem_id` = '$this->mem_id' AND pm_id = '$this->pm_id'");
//return $this->obj_query;
// echo "DELETE FROM `assign_mem_project` WHERE `mem_id` = $id";die;
$this->sth = $this->db->prepare("DELETE FROM `assign_mem_project` WHERE `mem_id` = :MEM_ID");
$this->sth->bindValue(":MEM_ID", $id, PDO::PARAM_STR);
return $this->sth->execute();
}
//phoenix 21-12-2016
function delete_Assign_MemProject($id, $project_id) {
$this->sth = $this->db->prepare("DELETE FROM `assign_mem_project` WHERE `mem_id` = :MEM_ID AND project_id=:PRO_ID");
$this->sth->bindValue(":MEM_ID", $id, PDO::PARAM_STR);
$this->sth->bindValue(":PRO_ID", $project_id, PDO::PARAM_STR);
return $this->sth->execute();
}
//phoenix 23-12-2016
function getSuperAdminProjectNames() {
//Phoenix 23-12-16 named user
$this->sth = $this->db->prepare("SELECT GROUP_CONCAT(p.project_name) from project p");
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDealManagerProjectNames($user_id) {
//Phoenix 23-12-16 named user
$this->sth = $this->db->prepare("SELECT GROUP_CONCAT(p.project_name) from project p where p.project_manager = :USER_ID");
$this->sth->bindValue(":USER_ID", $user_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getOtherUsersProjectName($user_id) {
//Phoenix 23-12-16 named user
$this->sth = $this->db->prepare("SELECT GROUP_CONCAT(p.project_name) FROM assign_mem_project as am LEFT JOIN project p ON p.id = am.project_id WHERE mem_id = :USER_ID");
$this->sth->bindValue(":USER_ID", $user_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getUserCategoryCount($user_id) {
//Phoenix 23-12-16 named user
$this->sth = $this->db->prepare("select count(id) from categories c where FIND_IN_SET(:USER_ID,a_users) AND c.parent_id <> 0 AND c.category_delete <> 1");
$this->sth->bindValue(":USER_ID", $user_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//phoenix1 02-01-2017
function update_delete_flag($value) {
//$this->obj_query = $this->db->query("delete from user where id='$value'");
//return $this->obj_query;
$this->sth = $this->db->prepare("update user set status = 'No' ,delete_flag = 1 where id= :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
return $this->sth->execute();
}
//phoenix1 02-01-2017
function update_login_mast_delete_flag($value) {
// echo "update login_mast SET user_status = '0', delete_flag = 1 where user_id= $value";die;
$this->sth = $this->db->prepare("update login_mast SET user_status = '0', delete_flag = 1 where user_id= :ID");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
return $this->sth->execute();
}
//phoenix1 03-01-2017
function chkManagerByUserId($value) {
// echo "SELECT id FROM project where id= $value AND project_manager <> 0 ";
$this->sth = $this->db->prepare("SELECT * FROM project where project_manager IN ($value)");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
/* * ************************************** */
/* Hierarchy IDFC */
/* * ************************************** */
var $sub_groups = array();
function getHUserGroup_all($value) {
$this->sth = $this->db->prepare("SELECT id, hierarchy, parent_id, name, description FROM user_group WHERE id = :VALUE ORDER BY id DESC");
$this->sth->bindValue(":VALUE", $value, PDO::PARAM_STR);
$this->sth->execute();
// echo "SELECT id, hierarchy, parent_id, name, description FROM user_group WHERE parent_id = '$value' ORDER BY id DESC";
// echo "<br>";
$group_records = $this->sth->fetchAll(PDO::FETCH_ASSOC);
foreach ($group_records AS $record) {
//array_push($this->sub_groups, $record['id']);
$parent_id = $record['id'];
$this->sth = $this->db->prepare("SELECT id, hierarchy, parent_id, name, description FROM user_group WHERE parent_id = :PARENT_ID ORDER BY id DESC");
$this->sth->bindValue(":PARENT_ID", $parent_id, PDO::PARAM_STR);
$this->sth->execute();
// echo "SELECT id, hierarchy, parent_id, name, description FROM user_group WHERE parent_id = '$parent_id' ORDER BY id DESC";
// echo "<br>";
$sub_group_records = $this->sth->fetchAll(PDO::FETCH_ASSOC);
if (count($sub_group_records) > 0) {
foreach ($sub_group_records AS $sub_record) {
if ($sub_record['id'] != '') {
array_push($this->sub_groups, $sub_record['id']);
$this->getHUserGroup_all($sub_record['id']);
}
}
} else {
// if ($sub_record['id'] != '') {
//// // echo $sub_record['id'].'<br>';
// $this->getHUserGroup_all($sub_record['id']);
// }
}
}
return $this->sub_groups;
}
function CheckHUserGroup_byname($id_arr) {
$id_join = join(',', $id_arr);
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE name = :NAME AND id IN ($id_join)");
$this->sth->bindValue(":NAME", $this->name, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getHUserGroup_byParent($value) {
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE parent_id = :PARENTID");
//echo "SELECT * FROM user_group WHERE parent_id = '$value'";
$this->sth->bindValue(":PARENTID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//NOT IN USE
function getHUserGroup_ORGChart($value) {
$this->sth = $this->db->prepare("SELECT
id, name, parent_id
FROM
(SELECT
*
FROM
user_group
ORDER BY parent_id , id) products_sorted,
(SELECT @pv:=:VALUE) initialisation
WHERE
(FIND_IN_SET(parent_id, @pv) > 0
AND
@pv:=CONCAT(@pv, ',', id))");
$this->sth->bindValue(":VALUE", $value, PDO::PARAM_STR);
$this->sth->execute();
$group_records = $this->sth->fetchAll(PDO::FETCH_ASSOC);
// foreach ($group_records AS $sub_record) {
// array_push($this->sub_groups, $sub_record['id']);
// }
return $group_records;
}
//11-1-2017
function chkUsernamebyName($value) {
$this->sth = $this->db->prepare("SELECT * FROM login_mast where username = :NAME AND delete_flag = 0");
$this->sth->bindValue(":NAME", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//updated 16-1-2017 IDFC
function getUserGroup_all_withChild() {
$this->sth = $this->db->prepare("SELECT * FROM user_group order by id asc");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
// 17-1-2017 IDFC1 IDFC4 17/02/17
function getUserGroup_byname_rootnode($value, $rootnode) {
// echo "SELECT id FROM user_group WHERE name = $value AND rootnode=$rootnode";die;
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE name = :ID AND rootnode=:ROOTNODE");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->bindValue(":ROOTNODE", $rootnode, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function CheckHUserGroup_byname_rootnode($id_arr, $rootnode) {
$id_join = join(',', $id_arr);
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE name = :NAME AND id IN ($id_join) AND rootnode=:ROOTNODE");
$this->sth->bindValue(":NAME", $this->name, PDO::PARAM_STR);
$this->sth->bindValue(":ROOTNODE", $rootnode, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//IDFC5 7-3-17
function update_delete_flagRevert($value, $statusflag = 'Yes') {
//$this->obj_query = $this->db->query("delete from user where id='$value'");
//return $this->obj_query;
$this->sth = $this->db->prepare("update user set status = :STATUSFLAG ,delete_flag = 0 where id= :ID");
$this->sth->bindValue(":STATUSFLAG", $statusflag, PDO::PARAM_STR);
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
return $this->sth->execute();
}
//IDFC5 7-3-17
function update_login_mast_delete_flagRevert($value, $statusflag = '1') {
// echo "update login_mast SET user_status = '0', delete_flag = 1 where user_id= $value";die;
$this->sth = $this->db->prepare("update login_mast SET user_status = :STATUSFLAG, delete_flag = 0 where user_id= :ID");
$this->sth->bindValue(":STATUSFLAG", $statusflag, PDO::PARAM_STR);
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
return $this->sth->execute();
}
//IDFC2 //IDFC3 15-02-17
function getUserGroup_all_ByHierarchy() {
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE hierarchy=0 ORDER BY id ;");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//IDFC3 15-02-17
function getUserGroup_HCount_ByParent_id($parent_id) {
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE (hierarchy=1 AND parent_id =:PARENT_ID) ");
$this->sth->bindValue(":PARENT_ID", $parent_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//IDFC3 16-02-17
function getUserGroup_all_WithRoot() {
$this->sth = $this->db->prepare("SELECT
ug1.*,ifnull(ug2.name,'') as rootnode_name,ifnull(ug2.usergroupalias,'') as rootnode_aliasname,ifnull(concat(ug1.name,' || ',ug2.name),ug1.name) as ugName
FROM user_group AS ug1
left JOIN user_group AS ug2
ON (ug1.hierarchy = 1 AND ug1.parent_id <> 0 AND ug1.rootnode = ug2.id )
WHERE
(ug1.hierarchy = 0 AND ug1.parent_id = 0)
OR (ug1.hierarchy = 1 AND ug1.parent_id <> 0)
ORDER BY ug1.id,ug2.rootnode;");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getUserGroup_byId_WithRoot($value) {
$this->sth = $this->db->prepare("SELECT
ug1.*,ifnull(ug2.name,'') as rootnode_name,ifnull(ug2.usergroupalias,'') as rootnode_aliasname,ifnull(concat(ug1.name,' || ',ug2.name),ug1.name) as ugName
FROM user_group AS ug1
left JOIN user_group AS ug2
ON (ug1.hierarchy = 1 AND ug1.parent_id <> 0 AND ug1.rootnode = ug2.id )
WHERE ug1.id =:ID AND (
(ug1.hierarchy = 0 AND ug1.parent_id = 0)
OR (ug1.hierarchy = 1 AND ug1.parent_id <> 0))
ORDER BY ug1.id,ug2.rootnode;");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDealMem_UnAssigned_ByGroup_ByHierarchy($gid, $pid) {
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.alt_role) > 0 OR FIND_IN_SET(g.id, l.emp_role) > 0)
WHERE l.role != '2' AND l.role != '1' AND l.delete_flag = '0' AND l.user_status = '1' AND g.id = :GID
AND u.id NOT IN (SELECT mem_id FROM assign_mem_project WHERE project_id = :PID)
GROUP BY l.user_id ORDER BY u.fname ASC");
$this->sth->execute(array(':GID' => $gid, ':PID' => $pid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
//IDFC4 17/02/17
function CheckUsername_availability_EmployeeView($username) {
$query = "select u.* from user AS u
JOIN login_mast AS l ON l.user_id=u.id
where lower(l.username)=:ID AND l.delete_flag='0'";
$this->sth = $this->db->prepare($query);
$this->sth->bindValue(":ID", strtolower($username), PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//IDFC4 17/02/17
function CheckEmail_availability_EmployeeView($email) {
$query = "select u.* from user AS u
JOIN login_mast AS l ON l.user_id=u.id
where u.email=:EMAIL_ID AND l.delete_flag='0'";
$this->sth = $this->db->prepare($query);
$this->sth->bindValue(":EMAIL_ID", $email, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//IDFC4 17/02/17
function getAllEmail_EmployeeView() {
$query = "select u.*, l.username from user AS u
JOIN login_mast AS l ON l.user_id=u.id
where l.delete_flag='0'";
$this->sth = $this->db->prepare($query);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
$arrayEmail = array('email_ids' => array_column($this->return, 'email'), 'imv_ids' => array_column($this->return, 'master_value_id'),
'im_ids' => array_column($this->return, 'master_value_id'), 'user_ids' => array_column($this->return, 'id'), 'usernames' => array_column($this->return, 'username'));
// $arrayEmail = array('email_ids' => array(), 'imv_ids' => array(), 'im_ids' => array(), 'user_ids' => array());
// foreach ($this->return as $key => $value) {
// array_push($arrayEmail['email_ids'], trim($value['email']));
// array_push($arrayEmail['imv_ids'], $value['master_value_id']);
// array_push($arrayEmail['im_ids'], $value['master_id']);
// array_push($arrayEmail['user_ids'], $value['id']);
// }
// echo '<pre>';
// print_r($arrayEmail);
return $arrayEmail;
}
//IDFC4 22-02-17
//vidhya 28/07/2020
function edit_user_emp($value) {
$this->sth = $this->db->prepare("update user set
named_flag = :NAMED_FLAG,
status=:STATUS,
activated_time = :ACTIVATEDTIME,
deactivated_time = :DEACTIVATEDTIME
where id = :ID");
$this->sth->bindValue(':NAMED_FLAG', $this->user_type, PDO::PARAM_STR);
$this->sth->bindValue(':STATUS', $this->status, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $value, PDO::PARAM_STR);
$this->sth->bindValue(':ACTIVATEDTIME', $this->activated_time, PDO::PARAM_STR);
$this->sth->bindValue(':DEACTIVATEDTIME', $this->deactivated_time, PDO::PARAM_STR);
return $this->sth->execute();
}
//IDFC4 22-02-17
function edit_login_mast_emp($value) {
$this->sth = $this->db->prepare("update login_mast set role = :ROLE,alt_role = :ALT_ROLE,user_status=:USER_STATUS where user_id = :USER_ID");
$this->sth->bindValue(':ROLE', $this->role, PDO::PARAM_STR);
$this->sth->bindValue(':ALT_ROLE', $this->alt_role, PDO::PARAM_STR);
$this->sth->bindValue(':USER_STATUS', $this->user_status, PDO::PARAM_STR);
$this->sth->bindValue(':USER_ID', $value, PDO::PARAM_STR);
return $this->sth->execute();
}
//IDFC4 20-02-2017
function renew_password_date($id, $date) {
/* echo "UPDATE login_mast SET renewed_at = '".$date."' WHERE user_id = ".$id;
exit; */
$this->sth = $this->db->prepare("UPDATE login_mast SET renewed_at = :DATE WHERE user_id = :ID");
$this->sth->bindValue(':ID', $id, PDO::PARAM_INT);
$this->sth->bindValue(':DATE', $date, PDO::PARAM_STR);
return $this->sth->execute();
}
//IDFC4 23-02-2017
function update_master_inUser($id) {
$this->sth = $this->db->prepare("UPDATE user SET master_id = :MASTER_ID,master_value_id = :MASTER_VALUE_ID WHERE id = :ID");
$this->sth->bindValue(':MASTER_ID', $this->master_id, PDO::PARAM_STR);
$this->sth->bindValue(':MASTER_VALUE_ID', $this->master_value_id, PDO::PARAM_STR);
$this->sth->bindValue(':ID', $id, PDO::PARAM_INT);
return $this->sth->execute();
}
#IDFC5 2-03-17
function getHUserGroup_byRootNode($value) {
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE rootnode = :ROOTNODE order by parent_id");
//echo "SELECT * FROM user_group WHERE parent_id = '$value'";
$this->sth->bindValue(":ROOTNODE", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
$array = array();
foreach ($this->return as $value) {
array_push($array, $value[id]);
}
return $array;
}
#IDFC5 10-03-17
function getHUserGroup_byRootNode_Datatable($sWhere, $orderby, $limit, $value) {
$this->sth = $this->db->prepare("SELECT SQL_CALC_FOUND_ROWS ug1.id, ug1.name, ug1.usergroupalias, ug2.name as parentname, ug2.usergroupalias as parentusergroupalias,ug2.id as parentid "
. "FROM user_group ug1 join user_group ug2 ON ug2.id = ug1.parent_id WHERE ug1.rootnode = :ROOTNODE $sWhere $orderby $limit");
$this->sth->bindValue(":ROOTNODE", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
#IDFC5 03-03-17
function getUser_EmpLogin() {
$this->sth = $this->db->prepare("SELECT * FROM user where master_id != 0 AND delete_flag = 0");
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//iDFC5 03-03-2017
function getUserGroup_byNotChildParent($user_role) {
// $this->sth = $this->db->prepare("select GROUP_CONCAT(distinct t1.id) as col1, GROUP_CONCAT(distinct t1.parent_id) as col2
//from (select * from user_group order by parent_id) t1,
// (select @pv := '$user_role') t2
//where (find_in_set(t1.parent_id, @pv) > 0 )
//and @pv := concat(@pv, ',', t1.id);");
$this->sth = $this->db->prepare("SELECT hi.id, parent_id, level
FROM (
SELECT hierarchy_usergroup(id) AS id, @level AS level
FROM (
SELECT @start_with := :USER_ROLE,
@id := @start_with,
@level := 0
) vars, user_group
WHERE @id IS NOT NULL
) ho
JOIN user_group hi
ON hi.id = ho.id;#hierarchy_connect_by_parent_eq_prior_id");
$this->sth->bindValue(":USER_ROLE", $user_role, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
// $result_arr = array_merge(explode(',', $this->return[0]['col1']), explode(',', $this->return[0]['col2']));
// $result_arr = array_filter(array_unique($result_arr));
// return @join(',', $result_arr);
$result_arr = array_column($this->return, 'id');
return @join(',', $result_arr);
}
//iDFC5 03-03-2017
function getHUserGroup_byRootNodeNotIn($value, $not_in) {
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE rootnode = :ROOTNODE AND id NOT IN($not_in) order by parent_id");
$this->sth->bindValue(":ROOTNODE", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
$array = array();
foreach ($this->return as $value) {
array_push($array, $value[id]);
}
return $array;
}
//iDFC5 04-03-2017
function getUserDetailsByMasterId_Value($master_id, $master_value_id) {
$this->sth = $this->db->prepare("SELECT * FROM user WHERE master_id = :MASTER_ID AND master_value_id = :MASTER_VALUE_ID");
$this->sth->bindValue(":MASTER_ID", $master_id, PDO::PARAM_STR);
$this->sth->bindValue(":MASTER_VALUE_ID", $master_value_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getUserGroup_all_WithRoot_ByNameOrAlias($filter) {
$this->sth = $this->db->prepare("SELECT
ug1.*,ifnull(ug2.name,'') as rootnode_name,ifnull(ug2.usergroupalias,'') as rootnode_aliasname,ifnull(concat(ug1.name,' || ',ug2.name),ug1.name) as ugName
FROM user_group AS ug1
left JOIN user_group AS ug2
ON (ug1.hierarchy = 1 AND ug1.parent_id <> 0 AND ug1.rootnode = ug2.id )
WHERE
((ug1.hierarchy = 0 AND ug1.parent_id = 0)
OR (ug1.hierarchy = 1 AND ug1.parent_id <> 0)) AND (ug1.name like '%$filter%' OR ug1.usergroupalias like '%$filter%' )
ORDER BY ug1.id,ug2.rootnode;");
$this->sth->execute();
// echo "SELECT
// ug1.*,ifnull(ug2.name,'') as rootnode_name,ifnull(ug2.usergroupalias,'') as rootnode_aliasname,ifnull(concat(ug1.name,' || ',ug2.name),ug1.name) as ugName
//FROM user_group AS ug1
// left JOIN user_group AS ug2
// ON (ug1.hierarchy = 1 AND ug1.parent_id <> 0 AND ug1.rootnode = ug2.id )
//WHERE
// ((ug1.hierarchy = 0 AND ug1.parent_id = 0)
// OR (ug1.hierarchy = 1 AND ug1.parent_id <> 0)) AND (ug1.name like '%$filter%' OR ug1.usergroupalias like '%$filter%' )
//ORDER BY ug1.id,ug2.rootnode;";
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getUserDept($filter) {
/* echo "SELECT * FROM department WHERE (dep_name like '%$filter%') OR
(dept_shortname like '%$filter%' )";die; */
$this->sth = $this->db->prepare("SELECT * FROM department WHERE (dep_name like '%$filter%') OR
(dept_shortname like '%$filter%' )");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//IDFC5 09-03-2017
function update_masterid_usergroup($ugrp, $id) {
$this->sth = $this->db->prepare("UPDATE user_group SET master_id = :MASTER_ID WHERE id = :UGRP_ID");
$this->sth->bindValue(':MASTER_ID', $id, PDO::PARAM_STR);
$this->sth->bindValue(':UGRP_ID', $ugrp, PDO::PARAM_STR);
return $this->sth->execute();
}
//IDFC5 09-03-2017
function get_Previous_grpname_Bymid($master_id) {
// echo "SELECT * FROM user_group WHERE master_id = $master_id";
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE master_id = :MASTER_ID ");
$this->sth->bindValue(":MASTER_ID", $master_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//IDFC5 10-03-2017
function getHUserGroup_byRootNode_Search($value, $filter) {
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE rootnode = :ROOTNODE AND (name like '%$filter%' OR usergroupalias like '%$filter%' ) order by parent_id");
$this->sth->bindValue(":ROOTNODE", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//IDFC5 10-03-2017
function getHUserGroup_byRootNodeNotIn_Search($value, $not_in, $filter) {
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE rootnode = :ROOTNODE AND id NOT IN($not_in) AND (name like '%$filter%' OR usergroupalias like '%$filter%' ) order by parent_id");
$this->sth->bindValue(":ROOTNODE", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
#15-03-17
function getDealMem_Assigned_ByGroup_Search($search, $gid, $pid) {
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname,l.username FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.emp_role) > 0)
WHERE l.role != '2' AND l.role != '1' AND l.user_status = '1' AND l.delete_flag = '0' $gid
AND u.id IN (SELECT mem_id FROM assign_mem_project WHERE project_id = :PID) AND ( l.username like '%$search%' OR CONCAT(u.fname,' ', u.mname,' ',u.lname) like '%$search%')
GROUP BY l.user_id ORDER BY u.fname ASC");
$this->sth->execute(array(':PID' => $pid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDealMem_Assigned_ByDept_Search($search, $gid, $pid) {
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname,l.username FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
JOIN department AS g ON (FIND_IN_SET(g.id, u.department_id) > 0 OR FIND_IN_SET(g.id, l.emp_role) > 0)
WHERE l.role != '2' AND l.role != '1' AND l.user_status = '1' AND l.delete_flag = '0' $gid
AND u.id IN (SELECT mem_id FROM assign_mem_project WHERE project_id = $pid) AND ( l.username like '%$search%' OR CONCAT(u.fname,' ', u.mname,' ',u.lname) like '%$search%')
GROUP BY l.user_id ORDER BY u.fname ASC");
//print_r($this->sth);exit;
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
#15-03-17
function getDealMem_Assigned_ByGroup_New($gid, $pid) {
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname,l.username FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.emp_role) > 0)
WHERE l.role != '2' AND l.role != '1' AND l.user_status = '1' AND l.delete_flag = '0' $gid
AND u.id IN (SELECT mem_id FROM assign_mem_project WHERE project_id = :PID)
GROUP BY l.user_id ORDER BY u.fname ASC");
$this->sth->execute(array(':PID' => $pid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
//IDFC6 21/032017
function getHUserGroup_byRootNodeNotIn_Search_excel($value, $not_in, $filter) {
// echo "SELECT * FROM user_group WHERE rootnode = $value AND id NOT IN($not_in) AND (name = '$filter') order by parent_id";die;
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE rootnode = :ROOTNODE AND id NOT IN($not_in) AND (name = :FILTER) order by parent_id");
$this->sth->bindValue(":FILTER", $filter, PDO::PARAM_STR);
$this->sth->bindValue(":ROOTNODE", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
#22-03-17 Rights list load
function getDealMem_Assigned_ByGroup_Limit($gid, $pid, $limit = " LIMIT 0,5") {
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname,l.username FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.emp_role) > 0)
WHERE l.role != '2' AND l.role != '1' AND l.user_status = '1' AND l.delete_flag = '0' $gid
AND u.id IN (SELECT mem_id FROM assign_mem_project WHERE project_id = :PID)
$limit");
$this->sth->execute(array(':PID' => $pid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDealMem_Assigned_ByDept_Limit($gid, $pid, $limit = " LIMIT 0,5") {
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname,l.username FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
JOIN department AS g ON (FIND_IN_SET(g.id, u.department_id) > 0 OR FIND_IN_SET(g.id, l.emp_role) > 0)
WHERE l.role != '2' AND l.role != '1' AND l.user_status = '1' AND l.delete_flag = '0' $gid
AND u.id IN (SELECT mem_id FROM assign_mem_project WHERE project_id = :PID)
$limit");
$this->sth->execute(array(':PID' => $pid));
$this->return = $this->sth->fetchAll();
return $this->return;
}
#24-03-17 upadte subgroup restricted flag
function updateSubGroupRestricted_flag($rootnode_id, $named_flag) {
$this->sth = $this->db->prepare("UPDATE user_group SET named_flag=:NAMED_FLAG WHERE rootnode =:ROOTNODE");
$this->sth->bindValue(':ROOTNODE', $rootnode_id, PDO::PARAM_STR);
$this->sth->bindValue(':NAMED_FLAG', $named_flag, PDO::PARAM_STR);
return $this->sth->execute();
}
//Sri for workflow
function getProject_Mem_Auto($p_id, $value) {
$this->sth = $this->db->prepare("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = :P_ID AND login_mast.role != '1' AND login_mast.delete_flag = '0' AND login_mast.role != '2'
AND login_mast.user_status = '1'
AND (user.fname like '%$value%' OR user.mname like '%$value%' OR user.lname like '%$value%')
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->sth->execute(array(':P_ID' => $p_id));
$this->return1 = $this->sth->fetchAll();
$this->sth = $this->db->prepare("SELECT project.id as project_id, 2 as role, user.id, user.fname, user.mname, user.lname FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE project.id = :PID
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0'
AND (user.fname like '%$value%' OR user.mname like '%$value%' OR user.lname like '%$value%')
ORDER BY user.fname ASC");
$this->sth->execute(array(':PID' => $p_id));
$this->return2 = $this->sth->fetchAll();
$this->sth = $this->db->prepare("SELECT l.role, u.id, u.fname, u.mname, u.lname FROM `login_mast` AS l
JOIN user AS u ON u.id = l.user_id
WHERE l.delete_flag = '0'
AND l.user_status = '1'
AND (u.fname like '%$value%' OR u.mname like '%$value%' OR u.lname like '%$value%')
GROUP BY l.user_id
ORDER BY u.fname ASC");
$this->sth->execute();
$this->return3 = $this->sth->fetchAll();
return array_merge($this->return1, $this->return2, $this->return3);
}
function getAll_SA() {
$this->sth = $this->db->prepare("SELECT * FROM login_mast WHERE user_status = 1 AND role = 1 AND delete_flag = 0");
$this->sth->execute();
$this->return1 = $this->sth->fetchAll();
return $this->return1;
}
//sushant 6-09-2017 workflow
function getUserGroupNotSA_DM() {
$this->sth = $this->db->prepare("SELECT * FROM user_group WHERE id NOT IN('1','2') AND parent_id = 0 order by id asc");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
/* Added by Abhimanyu on 13-10-2017 for notification setup */
function getUsers($filter) {
//echo "SELECT u.id, lm.username, concat(u.fname,' ',if(u.mname<>'',concat(u.mname,' '),u.mname),u.lname) as name FROM user as u join login_mast as lm on u.id = lm.user_id WHERE concat(u.fname,' ',if(u.mname<>'',concat(u.mname,' '),u.mname),u.lname) like '%$filter%' and u.delete_flag=0";
//echo "SELECT u.id, lm.username, concat(u.fname,' ',u.lname) as name FROM user as u join login_mast as lm on u.id = lm.user_id WHERE concat(u.fname,' ',u.lname) like '%$filter%' and u.delete_flag=0";
$this->sth = $this->db->prepare("SELECT u.id, lm.username, concat(u.fname,' ',u.lname) as name FROM user as u join login_mast as lm on u.id = lm.user_id WHERE concat(u.fname,' ',u.lname) like '%$filter%' and u.delete_flag=0");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function emailByRole($id) {
//echo "SELECT u.email FROM user_group as ug JOIN login_mast as lm ON (ug.id = lm.role OR ug.id =lm.emp_role) JOIN user as u ON u.id = lm.user_id WHERE (lm.emp_role = " . $id." OR lm.role = ".$id.")";
$this->sth = $this->db->prepare("SELECT u.email FROM user_group as ug JOIN login_mast as lm ON (ug.id = lm.role OR ug.id =lm.emp_role) JOIN user as u ON u.id = lm.user_id WHERE (lm.emp_role = " . $id . " OR lm.role = " . $id . ")");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function emailByUserID($userid) {
$this->sth = $this->db->prepare("SELECT * FROM user WHERE id = " . $userid);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function emailActiveByRole($id) {
// echo "SELECT u.email FROM login_mast lm JOIN user as u ON u.id = lm.user_id WHERE lm.emp_role = " . $id . " and u.status='Yes'";
$this->sth = $this->db->prepare("SELECT u.email FROM login_mast lm JOIN user as u ON u.id = lm.user_id WHERE lm.emp_role = " . $id . " and u.status='Yes'");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getUserCountByEmpRole($role) {
$this->sth = $this->db->prepare("SELECT * FROM login_mast WHERE emp_role= :ROLE AND delete_flag = '0'");
$this->sth->bindValue(":ROLE", $role, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getRestrictedUserGroup_all_WithRoot_ByNameOrAlias($filter) {
$this->sth = $this->db->prepare("SELECT
ug1.*,ifnull(ug2.name,'') as rootnode_name,ifnull(ug2.usergroupalias,'') as rootnode_aliasname,ifnull(concat(ug1.name,' || ',ug2.name),ug1.name) as ugName
FROM user_group AS ug1
left JOIN user_group AS ug2
ON (ug1.hierarchy = 1 AND ug1.parent_id <> 0 AND ug1.rootnode = ug2.id )
WHERE ((ug1.hierarchy = 1 AND ug1.parent_id <> 0) OR (ug1.hierarchy = 0 AND ug1.named_flag = 1)) AND (ug1.name like '%$filter%' OR ug1.usergroupalias like '%$filter%' ) AND ug1.name !='ghost'
ORDER BY ug1.id,ug2.rootnode;");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getADID($userid) {
$this->sth = $this->db->prepare("select ad_id from login_mast WHERE user_id = " . $userid);
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getUserByEmail() {
$this->sth = $this->db->prepare("SELECT id FROM user WHERE email = :EMAIL AND delete_flag = '0'");
$this->sth->bindValue(":EMAIL", $this->email, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDeal_Mem_Assigned_Org_For_CopyRights($guest_id, $role, $query) {
if ($role == 1 || $role == 2) {
/* $this->obj_query1 = $this->db->query("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC"); */
$this->sth = $this->db->prepare("SELECT user.id AS id, login_mast.username AS name FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
WHERE login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND login_mast.username LIKE '%$query%'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
//$this->sth->execute(array(':username' => $this->username));
$this->sth->execute();
$this->return1 = $this->sth->fetchAll();
/* $this->obj_query2 = $this->db->query("SELECT project.id as project_id, 2 as role, user.id, user.fname, user.mname, user.lname FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE project.id = '$pid'
AND login_mast.user_status = '1'
ORDER BY user.fname ASC"); */
$this->sth = $this->db->prepare("SELECT user.id AS id, login_mast.username AS name FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
WHERE login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND login_mast.username LIKE '%$query%'
ORDER BY user.fname ASC");
$this->sth->execute();
$this->return2 = $this->sth->fetchAll();
} else {
/* $this->obj_query1 = $this->db->query("SELECT pmem.project_id, pmem.role, user.id, user.fname, user.mname, user.lname FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE pmem.project_id = '$pid' AND login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND g.id = '$guest_id'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
$this->return1 = $this->sth1->fetchAll(PDO::FETCH_ASSOC); */
$this->sth = $this->db->prepare("SELECT user.id AS id, login_mast.username AS name FROM `assign_mem_project` AS pmem
JOIN login_mast ON pmem.mem_id = login_mast.user_id
JOIN user ON user.id = login_mast.user_id
#JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE login_mast.role != '1' AND login_mast.role != '2'
AND login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND login_mast.username LIKE '%$query%'
GROUP BY login_mast.user_id
ORDER BY user.fname ASC");
// $this->sth->bindValue(":GID", $guest_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return1 = $this->sth->fetchAll();
/* $this->obj_query2 = $this->db->query("SELECT project.id as project_id, 2 as role, user.id, user.fname, user.mname, user.lname FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE project.id = '$pid'
AND login_mast.user_status = '1' AND g.id = '$guest_id'
ORDER BY user.fname ASC"); */
$this->sth = $this->db->prepare("SELECT user.id AS id, login_mast.username AS name FROM `user`
JOIN project ON user.id = project.project_manager
JOIN login_mast ON project.project_manager = login_mast.user_id
# JOIN guests As g ON FIND_IN_SET(user.id, g.users) > 0
WHERE login_mast.user_status = '1' AND login_mast.delete_flag = '0' AND login_mast.username LIKE '%$query%'
ORDER BY user.fname ASC");
// $this->sth->bindValue(":GID", $guest_id, PDO::PARAM_STR);
$this->sth->execute();
$this->return2 = $this->sth->fetchAll();
}
return array_merge($this->return1, $this->return2);
}
function getUsersByRole($role, $where = '', $pdobind_array = array()) {
$query = "SELECT u.id, u.fname, u.mname, u.lname,l.username FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
WHERE l.role='$role' $where
GROUP BY l.user_id ORDER BY u.fname ASC";
$this->sth = $this->db->prepare($query);
foreach ($pdobind_array as $pdobind_key => $pdobind_val) {
//echo '@@'.$pdobind_key.'$$'.$pdobind_val[0];
$this->sth->bindValue($pdobind_key, $pdobind_val[0], $pdobind_val[1]);
}
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getDealMem_Assigned_ByGroup_SearchLoginLogs($search, $gid) {
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname,l.username FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.emp_role) > 0)
WHERE l.user_status = '1' AND l.delete_flag = '0' $gid
AND ( l.username like '%$search%' OR CONCAT(u.fname,' ', u.mname,' ',u.lname) like '%$search%')
GROUP BY l.user_id ORDER BY u.fname ASC");
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getAllUsers() {
$this->sth = $this->db->prepare("SELECT * FROM user,login_mast WHERE user.id = login_mast.user_id AND user.status = 'Yes'");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function updateMailFlag($userid, $value) {
$this->sth = $this->db->prepare("UPDATE user SET mail_flag = :MAIL_FLAG WHERE id = :USER_ID");
$this->sth->bindValue(':USER_ID', $userid, PDO::PARAM_STR);
$this->sth->bindValue(':MAIL_FLAG', $value, PDO::PARAM_INT);
return $this->sth->execute();
}
function getUserByName($username) {
$this->sth = $this->db->prepare("SELECT * from user where id = (SELECT user_id FROM login_mast WHERE username = :UNAME)");
$this->sth->bindValue(":UNAME", $username, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//vidhya 28/07/2020
function getDealMem_Assigned_ByGroup_SearchAllusers($search, $gid) {
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname,l.username FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.emp_role) > 0)
WHERE l.delete_flag = '0' $gid
AND ( l.username like '%$search%' OR CONCAT(u.fname,' ', u.mname,' ',u.lname) like '%$search%')
GROUP BY l.user_id,u.id, u.fname, u.mname, u.lname,l.username ORDER BY u.fname ASC");
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
//dipika 09/09/2020
function ForceUnlockPassword() {
$this->sth = $this->db->prepare("UPDATE login_mast SET acct_locked_status = 0 ,captcha_generate_after_loginFailed = 0,failed_login_count = 0 WHERE user_id = :UID");
$this->sth->bindValue(":UID", $this->id, PDO::PARAM_INT);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getUser_All_Auto($value) {
$this->sth = $this->db->prepare("SELECT u.id, u.fname, u.mname, u.lname FROM user as u
JOIN login_mast as l ON u.id = l.user_id
WHERE l.delete_flag = '0' AND l.user_status = '1' AND (u.fname like '%$value%' OR u.mname like '%$value%' OR u.lname like '%$value%')
GROUP BY u.id, u.fname, u.mname, u.lname
ORDER BY u.fname ASC");
$this->sth->execute();
//print_r($this->sth->errorInfo());
$this->return = $this->sth->fetchAll();
return array_merge($this->return);
}
function update_userDS() {
//echo "UPDATE user SET digital_sign = '$this->digital_sign' WHERE id =$this->user_id";
$this->sth = $this->db->prepare("UPDATE user SET digital_sign = :DS WHERE id = :UID");
$this->sth->bindValue(":UID", $this->user_id, PDO::PARAM_INT);
$this->sth->bindValue(":DS", $this->digital_sign, PDO::PARAM_STR);
return $this->sth->execute();
}
function getDepartment($id){
$this->sth = $this->db->prepare("SELECT * from department where id = $id");
$this->sth->execute();
//print_r($this->sth->errorInfo());
$this->return = $this->sth->fetchAll();
return array_merge($this->return);
}
function getAllDepartment(){
$this->sth = $this->db->prepare("SELECT * from department ");
$this->sth->execute();
//print_r($this->sth->errorInfo());
$this->return = $this->sth->fetchAll();
return array_merge($this->return);
}
function getDepartmentUser($user_id,$department_id) {
//echo "SELECT * FROM workflow_role_usergroup where user_group_id = $role_id";
//echo "SELECT * FROM user where id != $user_id and department_id = $department_id ";
$this->sth = $this->db->prepare("SELECT * FROM user where id != $user_id and department_id = $department_id ");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getNotDelegateUserDepartmentUser($user_id,$department_id) {
//echo "SELECT * FROM user where !find_in_set(id,(SELECT ifnull(GROUP_CONCAT(CONCAT(assigne_by_user_id,',',assigne_to_user_id)),0) FROM workflow_delegate_touser WHERE dept_id = $department_id AND status = 1)) AND department_id = $department_id " ;
$this->sth = $this->db->prepare("SELECT * FROM user where !find_in_set(id,(SELECT ifnull(GROUP_CONCAT(CONCAT(assigne_by_user_id,',',assigne_to_user_id)),0) FROM workflow_delegate_touser WHERE dept_id = $department_id AND status = 1)) AND department_id = $department_id ");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getUsersByDepartemntId($user_id,$department_id) {
$this->sth = $this->db->prepare("SELECT * FROM user,login_mast WHERE user.id = login_mast.user_id AND user.delete_flag = '0' and user.id != $user_id and user.department_id = $department_id ORDER BY user.id DESC");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getUsers_AllWithDepartment() {
$this->sth = $this->db->prepare("SELECT * FROM user,login_mast WHERE user.id = login_mast.user_id AND user.delete_flag = '0' and user.department_id != 0 ORDER BY user.id DESC");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
//dipika
function getUserDetailsById($user_id){
//echo "SELECT * FROM user where id = $user_id";
$this->sth = $this->db->prepare("SELECT fname,lname,email FROM user where id = $user_id");
$this->sth->execute();
//print_r($this->sth->errorInfo());
$this->return = $this->sth->fetchAll();
return array_merge($this->return);
}
function getDeptBYUID($id){
$this->sth = $this->db->prepare("SELECT d.dep_name,u.department_id from user u ,department d WHERE u. id=$id AND d.id=u.department_id");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getdocusingUser($email){
$this->sth = $this->db->prepare("SELECT * from user where email in($email)");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
// start User base work flow query of
function getCurrentDepartment($w_role_id,$user_id){
//"SELECT * from department where id = $id"
;
$this->sth = $this->db->prepare("SELECT dep_name FROM workflow_role_users_dept wru INNER JOIN department dept ON wru.department_id = dept.id WHERE w_role_id = $w_role_id AND user_id = $user_id");
$this->sth->execute();
//print_r($this->sth->errorInfo());
$this->return = $this->sth->fetchAll();
return array_merge($this->return);
}
function getRolesByUser($uid){
$this->sth = $this->db->prepare("select * from workflow_role_users_dept as wru left join workflow_roles as wr ON wru.w_role_id= wr.id WHERE wru.user_id=$uid and wr.role_master != '' ");
$this->sth->execute();
$this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
return $this->return;
}
function getuser_ByDept_Search($gid, $pid) {
$this->sth = $this->db->prepare("SELECT u.id,u.department_id FROM user AS u
JOIN login_mast AS l ON u.id = l.user_id
JOIN department AS g ON (FIND_IN_SET(g.id, u.department_id) > 0 OR FIND_IN_SET(g.id, l.emp_role) > 0)
WHERE l.role != '2' AND l.role != '1' AND l.user_status = '1' AND l.delete_flag = '0' $gid
AND u.id IN (SELECT mem_id FROM assign_mem_project WHERE project_id = $pid)
GROUP BY l.user_id ORDER BY u.fname ASC");
//print_r($this->sth);exit;
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
// End User base work flow query of
function getUsers_ByGroupForCategory($value) {
$this->sth = $this->db->prepare("SELECT user.id,user.fname,user.mname,user.lname, user.email FROM user,login_mast WHERE user.id=login_mast.user_id AND user.status='Yes' AND login_mast.role in($value) AND user.delete_flag = '0'");
//$this->sth->bindValue(":ROLE", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getUsers_ByDeptId($dept_id){
$this->sth = $this->db->prepare("select * from user where department_id = $dept_id");
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
function getUserDepartment_byname($value) {
$this->sth = $this->db->prepare("SELECT id, dep_name FROM department WHERE dep_name = '$value'");
$this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
$this->sth->execute();
$this->return = $this->sth->fetchAll();
return $this->return;
}
}
?>
Did this file decode correctly?
Original Code
<?php $_F=__FILE__;$_C1353562110='Pz48P1FSUQoKTGNGdHQgZnRDcCB7CgovLyoqKioqKioqKiB5QVNhQXpxT24gKioqKioqKioqKioKICAgIEdGcCAkZUI7CiAgICBHRnAgJGZ0Q3BXRmhDOwogICAgR0ZwICRUV0ZoQzsKICAgIEdGcCAkaFdGaEM7CiAgICBHRnAgJGNXRmhDOwogICAgR0ZwICRLcEhfaWU7CiAgICBHRnAgJENoRmljOwogICAgR0ZwICRUS1dDX1dLOwogICAgR0ZwICRoS0JfV0s7CiAgICBHRnAgJEZlZXBDdHQ7CiAgICBHRnAgJHRYRlhmdDsKICAgIEdGcCAkTHBDRlhDZV9CcjsKICAgIEdGcCAkUXBLVGljQ2FoRkhDOwogICAgR0ZwICRRRnR0a0twZTsKICAgIEdGcCAkTGZwcENXWF9lRlhDOwogICAgR0ZwICRMZnBwQ1dYX2VGWENfWGloQzsKICAgIEdGcCAkS0JsX1BmQ3ByOwogICAgR0ZwICRwQ1hmcFc7CiAgICBHRnAgJGNpV0M7CiAgICBHRnAgJFdmaF9wQ0xLcGV0OwogICAgR0ZwICRXS19RQ3BfUUZIQzsKICAgIEdGcCAkUUZIQ19jaWhpWF9nOwogICAgR0ZwICRRRkhDX2NpaGlYX3I7CiAgICBHRnAgJHRYUjsKICAgIEdGcCAkcEtjQzsKICAgIEdGcCAkV0ZoQ2VfZnRDcDsKICAgIEdGcCAkZnRDcF9YclFDOwogICAgLy9hakk1CiAgICBHRnAgJFJpQ3BGcExScjsKICAgIEdGcCAkUUZwQ1dYX2llOwogICAgLy9hakk1TgogICAgR0ZwICRwS0tYV0tlQzsKICAgIEdGcCAkaEZ0WENwX2llOwogICAgR0ZwICRoRnRYQ3BfR0ZjZkNfaWU7CiAgICBHRnAgJGZ0Q3BIcEtmUUZjaUZ0OwogICAgLy9hakk1MSBORC1tOS1OeAogICAgR0ZwICRDaFFjS3JDQ19mSF9UY0ZIOwogICAgR0ZwICRDaFFjS3JDQ19wS2NDOwogICAgR0ZwICRDaFFjS3JDQ19XRmhDX1RjRkg7CiAgICBHRnAgJEZlX2llOwogICAgR0ZwICR0WEZwWF9GTExDdHRfWGloQzsKICAgIEdGcCAkQ1dlX0ZMTEN0dF9YaWhDOwogICAgR0ZwICRoRmljX1RjRkg7CiAgICAvL1U4OCBObS1tNi05bTltCiAgICBHRnAgJEZMWGlHRlhDZV9YaWhDOwogICAgR0ZwICRlQ0ZMWGlHRlhDZV9YaWhDOwoKICAgIC8vZldpTEsgCiAgICBHRnAgJGVpSGlYRmNfdGlIVzsKLy8qKioqKioqKiogNTJibkpTdjVKMlMgSXZiSmEyYm4gICoqKioqKioqKioqKgoKICAgIFRmV0xYaUtXIF9fTEtXdFhwZkxYKCRlQikgewogICAgICAgICRYUml0LT5lQiA9ICRlQjsKICAgICAgICAvLyAkWFJpdC0+aWUgPSAnJzsKICAgIH0KCi8vKioqKioqKioqKioqKioqKiBuT0ogSXZiSmEyYm4gICoqKioqKioqKioqKioqKioqKioqKgoKICAgIFRmV0xYaUtXIHRDWDhwS1RpY0NhaEZIQygkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKQogICAgICAgICAgICAkWFJpdC0+UXBLVGljQ2FoRkhDID0gJyc7CiAgICAgICAgQ2N0QwogICAgICAgICAgICAkWFJpdC0+UXBLVGljQ2FoRkhDID0gJEdGY2ZDOwogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWGFlKCRHRmNmQykgewogICAgICAgIGlUICgkR0ZjZkMgPT0gJycpCiAgICAgICAgICAgICRYUml0LT5pZSA9ICcnOwogICAgICAgIENjdEMKICAgICAgICAgICAgJFhSaXQtPmllID0gJEdGY2ZDOwogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWEliRmhDKCRHRmNmQykgewogICAgICAgIGlUICgkR0ZjZkMgPT0gJycpCiAgICAgICAgICAgICRYUml0LT5UV0ZoQyA9ICcnOwogICAgICAgIENjdEMKICAgICAgICAgICAgJFhSaXQtPlRXRmhDID0gJEdGY2ZDOwogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWFpiRmhDKCRHRmNmQykgewogICAgICAgIGlUICgkR0ZjZkMgPT0gJycpCiAgICAgICAgICAgICRYUml0LT5oV0ZoQyA9ICcnOwogICAgICAgIENjdEMKICAgICAgICAgICAgJFhSaXQtPmhXRmhDID0gJEdGY2ZDOwogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWHFiRmhDKCRHRmNmQykgewogICAgICAgIGlUICgkR0ZjZkMgPT0gJycpCiAgICAgICAgICAgICRYUml0LT5jV0ZoQyA9ICcnOwogICAgICAgIENjdEMKICAgICAgICAgICAgJFhSaXQtPmNXRmhDID0gJEdGY2ZDOwogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWEFlZXBDdHQoJEdGY2ZDKSB7CiAgICAgICAgaVQgKCRHRmNmQyA9PSAnJykKICAgICAgICAgICAgJFhSaXQtPkZlZXBDdHQgPSAnJzsKICAgICAgICBDY3RDCiAgICAgICAgICAgICRYUml0LT5GZWVwQ3R0ID0gRmVldGNGdFJDdCgkR0ZjZkMpOwogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWDJwSGFlKCRHRmNmQykgewogICAgICAgIGlUICgkR0ZjZkMgPT0gJycpCiAgICAgICAgICAgICRYUml0LT5LcEhfaWUgPSAnJzsKICAgICAgICBDY3RDCiAgICAgICAgICAgICRYUml0LT5LcEhfaWUgPSAkR0ZjZkM7CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CiAgICBUZldMWGlLVyB0Q1hqQ1FYYWUoJEdGY2ZDKSB7CiAgICAgICAgaVQgKCRHRmNmQyA9PSAnJykKICAgICAgICAgICAgJFhSaXQtPmVDUVhfaWUgPSAnJzsKICAgICAgICBDY3RDCiAgICAgICAgICAgICRYUml0LT5lQ1FYX2llID0gJEdGY2ZDOwogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWElLV0NiSygkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKQogICAgICAgICAgICAkWFJpdC0+VEtXQ19XSyA9ICcnOwogICAgICAgIENjdEMKICAgICAgICAgICAgJFhSaXQtPlRLV0NfV0sgPSAkR0ZjZkM7CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgogICAgVGZXTFhpS1cgdENYWktCYksoJEdGY2ZDKSB7CiAgICAgICAgaVQgKCRHRmNmQyA9PSAnJykKICAgICAgICAgICAgJFhSaXQtPmhLQl9XSyA9ICcnOwogICAgICAgIENjdEMKICAgICAgICAgICAgJFhSaXQtPmhLQl9XSyA9ICRHRmNmQzsKICAgICAgICBwQ1hmcFcgWHBmQzsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1hPaEZpYygkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKQogICAgICAgICAgICAkWFJpdC0+Q2hGaWMgPSAnJzsKICAgICAgICBDY3RDCiAgICAgICAgICAgICRYUml0LT5DaEZpYyA9ICRHRmNmQzsKICAgICAgICBwQ1hmcFcgWHBmQzsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1huWEZYZnQoJEdGY2ZDKSB7CiAgICAgICAgaVQgKCRHRmNmQyA9PSAnJykKICAgICAgICAgICAgJFhSaXQtPnRYRlhmdCA9ICcnOwogICAgICAgIENjdEMKICAgICAgICAgICAgJFhSaXQtPnRYRlhmdCA9ICRHRmNmQzsKICAgICAgICBwQ1hmcFcgWHBmQzsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1h2dENwSnJRQygkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKQogICAgICAgICAgICAkWFJpdC0+ZnRDcF9YclFDID0gJyc7CiAgICAgICAgQ2N0QwogICAgICAgICAgICAkWFJpdC0+ZnRDcF9YclFDID0gJEdGY2ZDOwogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWDVwQ0ZYQ2V6cigkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKQogICAgICAgICAgICAkWFJpdC0+THBDRlhDZV9CciA9ICcnOwogICAgICAgIENjdEMKICAgICAgICAgICAgJFhSaXQtPkxwQ0ZYQ2VfQnIgPSAkR0ZjZkM7CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgogICAgVGZXTFhpS1cgdENYdnRDcGFlKCRHRmNmQykgewogICAgICAgIGlUICgkR0ZjZkMgPT0gJycpCiAgICAgICAgICAgICRYUml0LT5mdENwX2llID0gJyc7CiAgICAgICAgQ2N0QwogICAgICAgICAgICAkWFJpdC0+ZnRDcF9pZSA9ICRHRmNmQzsKICAgICAgICBwQ1hmcFcgWHBmQzsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1hTS2NDKCRHRmNmQykgewogICAgICAgIGlUICgkR0ZjZkMgPT0gJycpCiAgICAgICAgICAgICRYUml0LT5wS2NDID0gJyc7CiAgICAgICAgQ2N0QwogICAgICAgICAgICAkWFJpdC0+cEtjQyA9ICRHRmNmQzsKICAgICAgICBwQ1hmcFcgWHBmQzsKICAgIH0KCiAgICAvL2llVExOIDlELU4tOW1OeAovL2FqSTUxIE5ELW05LU54CiAgICBUZldMWGlLVyB0Q1hPaFFjS3JDQ1NLY0MoJEdGY2ZDKSB7CiAgICAgICAgaVQgKCRHRmNmQyA9PSAnJykKICAgICAgICAgICAgJFhSaXQtPkNoUWNLckNDX3BLY0MgPSAnJzsKICAgICAgICBDY3RDCiAgICAgICAgICAgICRYUml0LT5DaFFjS3JDQ19wS2NDID0gJEdGY2ZDOwogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWEFjWFNLY0MoJEdGY2ZDKSB7CiAgICAgICAgaVQgKCRHRmNmQyA9PSAnJykKICAgICAgICAgICAgJFhSaXQtPkZjWF9wS2NDID0gJyc7CiAgICAgICAgQ2N0QwogICAgICAgICAgICAkWFJpdC0+RmNYX3BLY0MgPSAkR0ZjZkM7CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgogICAgVGZXTFhpS1cgdENYdnRDcG5YRlhmdCgkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKQogICAgICAgICAgICAkWFJpdC0+ZnRDcF90WEZYZnQgPSAnJzsKICAgICAgICBDY3RDCiAgICAgICAgICAgICRYUml0LT5mdENwX3RYRlhmdCA9ICRHRmNmQzsKICAgICAgICBwQ1hmcFcgWHBmQzsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1hBTExYcUtMTW5YRlhmdCgkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09IE4pCiAgICAgICAgICAgICRYUml0LT5jS0xNX3RYRlhmdCA9IE47CiAgICAgICAgQ2N0QwogICAgICAgICAgICAkWFJpdC0+Y0tMTV90WEZYZnQgPSAkR0ZjZkM7CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgogICAgVGZXTFhpS1cgdENYdnRDcFdGaEMoJEdGY2ZDKSB7CiAgICAgICAgaVQgKCRHRmNmQyA9PSAnJykKICAgICAgICAgICAgJFhSaXQtPmZ0Q3BXRmhDID0gJyc7CiAgICAgICAgQ2N0QwogICAgICAgICAgICAkWFJpdC0+ZnRDcFdGaEMgPSAkR0ZjZkM7CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgogICAgVGZXTFhpS1cgdENYOEZ0dGtLcGUoJEdGY2ZDKSB7CiAgICAgICAgaVQgKCRHRmNmQyA9PSAnJykKICAgICAgICAgICAgJFhSaXQtPlFGdHRrS3BlID0gJyc7CiAgICAgICAgQ2N0QwogICAgICAgICAgICAkWFJpdC0+UUZ0dGtLcGUgPSBGZWV0Y0Z0UkN0KCRHRmNmQyk7CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgogICAgVGZXTFhpS1cgdENYNWZwcENXWGpGWEMoKSB7CiAgICAgICAgJFhSaXQtPkxmcHBDV1hfZUZYQyA9IGVGWEMoIm8iIC4gIi0iIC4gImgiIC4gIi0iIC4gImUiKTsKICAgICAgICBwQ1hmcFcgWHBmQzsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1g1ZnBwQ1dYakZYQ0ppaEMoKSB7CiAgICAgICAgJFhSaXQtPkxmcHBDV1hfZUZYQ19YaWhDID0gZUZYQygiby1oLWUgczppOnQgQSIpOwovLydvb29vLVpaLWpqIHNzOlpaOm5uJwoKICAgICAgICBwQ1hmcFcgWHBmQzsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1hiRmhDKCRHRmNmQykgewogICAgICAgIGlUICgkR0ZjZkMgPT0gJycpIHsKICAgICAgICAgICAgJFhSaXQtPldGaEMgPSAnJzsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+V0ZoQyA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgovL2FqSTUKICAgIFRmV0xYaUtXIHRDWHNpQ3BGcExScigkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKSB7CiAgICAgICAgICAgICRYUml0LT5SaUNwRnBMUnIgPSAnJzsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+UmlDcEZwTFJyID0gJEdGY2ZDOwogICAgICAgIH0KICAgICAgICBwQ1hmcFcgWHBmQzsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1g4RnBDV1hhZSgkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKSB7CiAgICAgICAgICAgICRYUml0LT5RRnBDV1hfaWUgPSAnJzsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+UUZwQ1dYX2llID0gJEdGY2ZDOwogICAgICAgIH0KICAgICAgICBwQ1hmcFcgWHBmQzsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1hqQ3RMcGlRWGlLVygkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKSB7CiAgICAgICAgICAgICRYUml0LT5lQ3RMcGlRWGlLVyA9ICcnOwogICAgICAgIH0gQ2N0QyB7CiAgICAgICAgICAgICRYUml0LT5lQ3RMcGlRWGlLVyA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgovL2FqSTVOCiAgICBUZldMWGlLVyB0Q1hTS0tYYktlQygkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKSB7CiAgICAgICAgICAgICRYUml0LT5wS0tYV0tlQyA9ICcnOwogICAgICAgIH0gQ2N0QyB7CiAgICAgICAgICAgICRYUml0LT5wS0tYV0tlQyA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgogICAgVGZXTFhpS1cgdENYdnRDcFZwS2ZRQWNpRnQoJEdGY2ZDKSB7CiAgICAgICAgaVQgKCRHRmNmQyA9PSAnJykgewogICAgICAgICAgICAkWFJpdC0+ZnRDcEhwS2ZRRmNpRnQgPSAnJzsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+ZnRDcEhwS2ZRRmNpRnQgPSAkR0ZjZkM7CiAgICAgICAgfQogICAgICAgIGlUICgoWHBpaCgkWFJpdC0+V0ZoQykgIT0gJycgfHwgWHBpaCgkWFJpdC0+V0ZoQykgIT0gJ0hSS3RYJykgJiYgJFhSaXQtPmZ0Q3BIcEtmUUZjaUZ0ID09ICdIUkt0WCcpIHsKICAgICAgICAgICAgJFhSaXQtPmZ0Q3BIcEtmUUZjaUZ0ID0gJyc7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKLy9hakk1MSBORC1tOS1OeAogICAgVGZXTFhpS1cgdENYT2hRY0tyQ0NfZkhfVGNGSCgkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKSB7CiAgICAgICAgICAgICRYUml0LT5DaFFjS3JDQ19mSF9UY0ZIID0gJyc7CiAgICAgICAgfSBDY3RDIHsKICAgICAgICAgICAgJFhSaXQtPkNoUWNLckNDX2ZIX1RjRkggPSAkR0ZjZkM7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKLy9hakk1MSBORC1tOS1OeAogICAgVGZXTFhpS1cgdENYT2hRY0tyQ0NfV0ZoQ19UY0ZIKCRHRmNmQykgewogICAgICAgIGlUICgkR0ZjZkMgPT0gJycpIHsKICAgICAgICAgICAgJFhSaXQtPkNoUWNLckNDX1dGaENfVGNGSCA9ICcnOwogICAgICAgIH0gQ2N0QyB7CiAgICAgICAgICAgICRYUml0LT5DaFFjS3JDQ19XRmhDX1RjRkggPSAkR0ZjZkM7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKICAgIC8vYWpJNU4KICAgIFRmV0xYaUtXIHRDWFpGdFhDcGFqKCRHRmNmQykgewogICAgICAgIGlUICgkR0ZjZkMgPT0gJycpIHsKICAgICAgICAgICAgJFhSaXQtPmhGdFhDcF9pZSA9ICcnOwogICAgICAgIH0gQ2N0QyB7CiAgICAgICAgICAgICRYUml0LT5oRnRYQ3BfaWUgPSAkR0ZjZkM7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKICAgIC8vYWpJNU4KICAgIFRmV0xYaUtXIHRDWFpGdFhDcHlGY2ZDYWooJEdGY2ZDKSB7CiAgICAgICAgaVQgKCRHRmNmQyA9PSAnJykgewogICAgICAgICAgICAkWFJpdC0+aEZ0WENwX0dGY2ZDX2llID0gJyc7CiAgICAgICAgfSBDY3RDIHsKICAgICAgICAgICAgJFhSaXQtPmhGdFhDcF9HRmNmQ19pZSA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgogICAgLy9ONi1OOS05bU42CiAgICBUZldMWGlLVyB0Q1hiRmhDZXZ0Q3AoJEdGY2ZDKSB7CiAgICAgICAgaVQgKCRHRmNmQyA9PSAnJykgewogICAgICAgICAgICAkWFJpdC0+V0ZoQ2VfZnRDcCA9IG07CiAgICAgICAgfSBDY3RDIHsKICAgICAgICAgICAgJFhSaXQtPldGaENlX2Z0Q3AgPSAkR0ZjZkM7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWGJLOENwOEZIQygkR0ZjZkMpIHsKICAgICAgICBpVCAoQ2hRWHIoJEdGY2ZDKSkgewogICAgICAgICAgICAkWFJpdC0+V0tfUUNwX1FGSEMgPSBObTsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+V0tfUUNwX1FGSEMgPSAkR0ZjZkM7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyAkWFJpdC0+V0tfUUNwX1FGSEM7CiAgICB9CgogICAgVGZXTFhpS1cgdENYOEZIQ3FpaGlYWSgkR0ZjZkMpIHsKICAgICAgICBpVCAoQ2hRWHIoJEdGY2ZDKSkgewogICAgICAgICAgICAkWFJpdC0+UUZIQ19jaWhpWF9nID0gbTsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+UUZIQ19jaWhpWF9nID0gJEdGY2ZDOwogICAgICAgIH0KICAgICAgICBwQ1hmcFcgJFhSaXQtPlFGSENfY2loaVhfZzsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1g4RkhDcWloaVhvKCRHRmNmQykgewogICAgICAgIGlUIChDaFFYcigkR0ZjZkMpKSB7CiAgICAgICAgICAgICRYUml0LT5RRkhDX2NpaGlYX3IgPSBObTsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+UUZIQ19jaWhpWF9yID0gJEdGY2ZDOwogICAgICAgIH0KICAgICAgICBwQ1hmcFcgJFhSaXQtPlFGSENfY2loaVhfcjsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1huS3BYSkZCY0MoJEdGY2ZDKSB7CiAgICAgICAgaVQgKENoUVhyKCRHRmNmQykpIHsKICAgICAgICAgICAgJFhSaXQtPnRLcFhfWEZCY0MgPSAiIjsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+dEtwWF9YRkJjQyA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXICRYUml0LT50S3BYX1hGQmNDOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWG5LcFhFS2lXSkZCY0MoJEdGY2ZDKSB7CiAgICAgICAgaVQgKENoUVhyKCRHRmNmQykpIHsKICAgICAgICAgICAgJFhSaXQtPnRLcFhfbEtpV1hGQmNDID0gIiI7CiAgICAgICAgfSBDY3RDIHsKICAgICAgICAgICAgJFhSaXQtPnRLcFhfbEtpV1hGQmNDID0gJEdGY2ZDOwogICAgICAgIH0KICAgICAgICBwQ1hmcFcgJFhSaXQtPnRLcFhfbEtpV1hGQmNDOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWG5LcFhFS2lXSkZCY0NKa0soJEdGY2ZDKSB7CiAgICAgICAgaVQgKENoUVhyKCRHRmNmQykpIHsKICAgICAgICAgICAgJFhSaXQtPnRLcFhfbEtpV1hGQmNDX1hrSyA9ICIiOwogICAgICAgIH0gQ2N0QyB7CiAgICAgICAgICAgICRYUml0LT50S3BYX2xLaVdYRkJjQ19Ya0sgPSAkR0ZjZkM7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyAkWFJpdC0+dEtwWF9sS2lXWEZCY0NfWGtLOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWG5LcFhFS2lXSkZCY0NKUnBDQygkR0ZjZkMpIHsKICAgICAgICBpVCAoQ2hRWHIoJEdGY2ZDKSkgewogICAgICAgICAgICAkWFJpdC0+dEtwWF9sS2lXWEZCY0NfWFJwQ0MgPSAiIjsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+dEtwWF9sS2lXWEZCY0NfWFJwQ0MgPSAkR0ZjZkM7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyAkWFJpdC0+dEtwWF9sS2lXWEZCY0NfWFJwQ0M7CiAgICB9CgogICAgVGZXTFhpS1cgdENYbktwWEpGQmNDSWlDY2UoJEdGY2ZDKSB7CiAgICAgICAgaVQgKENoUVhyKCRHRmNmQykpIHsKICAgICAgICAgICAgJFhSaXQtPnRLcFhfWEZCY0NfVGlDY2UgPSAiIjsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+dEtwWF9YRkJjQ19UaUNjZSA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXICRYUml0LT50S3BYX1hGQmNDX1RpQ2NlOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWG5LcFhFS2lXSkZCY0NJaUNjZSgkR0ZjZkMpIHsKICAgICAgICBpVCAoQ2hRWHIoJEdGY2ZDKSkgewogICAgICAgICAgICAkWFJpdC0+dEtwWF9sS2lXWEZCY0NfVGlDY2UgPSAiIjsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+dEtwWF9sS2lXWEZCY0NfVGlDY2UgPSAkR0ZjZkM7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyAkWFJpdC0+dEtwWF9sS2lXWEZCY0NfVGlDY2U7CiAgICB9CgogICAgVGZXTFhpS1cgdENYbktwWEVLaVdKRkJjQ0prS0lpQ2NlKCRHRmNmQykgewogICAgICAgIGlUIChDaFFYcigkR0ZjZkMpKSB7CiAgICAgICAgICAgICRYUml0LT50S3BYX2xLaVdYRkJjQ19Ya0tfVGlDY2UgPSAiIjsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+dEtwWF9sS2lXWEZCY0NfWGtLX1RpQ2NlID0gJEdGY2ZDOwogICAgICAgIH0KICAgICAgICBwQ1hmcFcgJFhSaXQtPnRLcFhfbEtpV1hGQmNDX1hrS19UaUNjZTsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1huS3BYRUtpV0pGQmNDSlJwQ0NJaUNjZSgkR0ZjZkMpIHsKICAgICAgICBpVCAoQ2hRWHIoJEdGY2ZDKSkgewogICAgICAgICAgICAkWFJpdC0+dEtwWF9sS2lXWEZCY0NfWFJwQ0NfVGlDY2UgPSAiIjsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+dEtwWF9sS2lXWEZCY0NfWFJwQ0NfVGlDY2UgPSAkR0ZjZkM7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyAkWFJpdC0+dEtwWF9sS2lXWEZCY0NfWFJwQ0NfVGlDY2U7CiAgICB9CgogICAgVGZXTFhpS1cgdENYbktwWF8ycGVDcF9JaUNjZSgkR0ZjZkMpIHsKICAgICAgICBpVCAoQ2hRWHIoJEdGY2ZDKSkgewogICAgICAgICAgICAkWFJpdC0+dEtwWF9LcGVDcF9UaUNjZSA9ICIiOwogICAgICAgIH0gQ2N0QyB7CiAgICAgICAgICAgICRYUml0LT50S3BYX0twZUNwX1RpQ2NlID0gJEdGY2ZDOwogICAgICAgIH0KICAgICAgICBwQ1hmcFcgJFhSaXQtPnRLcFhfS3BlQ3BfVGlDY2U7CiAgICB9CgogICAgVGZXTFhpS1cgRmVfaWUoJEdGY2ZDKSB7CiAgICAgICAgaVQgKENoUVhyKCRHRmNmQykpIHsKICAgICAgICAgICAgJFhSaXQtPkZlX2llID0gIiI7CiAgICAgICAgfSBDY3RDIHsKICAgICAgICAgICAgJFhSaXQtPkZlX2llID0gJEdGY2ZDOwogICAgICAgIH0KICAgICAgICBwQ1hmcFcgJFhSaXQtPkZlX2llOwogICAgfQoKICAgIFRmV0xYaUtXIHRDWG5YRnBYQUxMQ3R0SmloQygkR0ZjZkMpIHsKICAgICAgICBpVCAoQ2hRWHIoJEdGY2ZDKSkgewogICAgICAgICAgICAkWFJpdC0+dFhGcFhfRkxMQ3R0X1hpaEMgPSAiIjsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+dFhGcFhfRkxMQ3R0X1hpaEMgPSAkR0ZjZkM7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhGcFhfRkxMQ3R0X1hpaEM7CiAgICB9CgogICAgVGZXTFhpS1cgdENYT1dlQUxMQ3R0SmloQygkR0ZjZkMpIHsKICAgICAgICBpVCAoQ2hRWHIoJEdGY2ZDKSkgewogICAgICAgICAgICAkWFJpdC0+Q1dlX0ZMTEN0dF9YaWhDID0gIiI7CiAgICAgICAgfSBDY3RDIHsKICAgICAgICAgICAgJFhSaXQtPkNXZV9GTExDdHRfWGloQyA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXICRYUml0LT5DV2VfRkxMQ3R0X1hpaEM7CiAgICB9CgogICAgVGZXTFhpS1cgdENYWkZpY0ljRkgoJEdGY2ZDKSB7CiAgICAgICAgJFhSaXQtPmhGaWNfVGNGSCA9ICRHRmNmQzsKICAgICAgICBwQ1hmcFcgJFhSaXQtPmhGaWNfVGNGSDsKICAgIH0KCiAgICAvL0dpZVJyRiA5Ny9teC85bTltCiAgICBUZldMWGlLVyB0Q1hBTFhpR0ZYQ2VKaWhDKCRHRmNmQykgewogICAgICAgIGlUIChDaFFYcigkR0ZjZkMpKSB7CiAgICAgICAgICAgICRYUml0LT5GTFhpR0ZYQ2VfWGloQyA9ICIiOwogICAgICAgIH0gQ2N0QyB7CiAgICAgICAgICAgICRYUml0LT5GTFhpR0ZYQ2VfWGloQyA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXICRYUml0LT5GTFhpR0ZYQ2VfWGloQzsKICAgIH0KCiAgICBUZldMWGlLVyB0Q1hqQ0ZMWGlHRlhDZUppaEMoJEdGY2ZDKSB7CiAgICAgICAgaVQgKENoUVhyKCRHRmNmQykpIHsKICAgICAgICAgICAgJFhSaXQtPmVDRkxYaUdGWENlX1hpaEMgPSAiIjsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+ZUNGTFhpR0ZYQ2VfWGloQyA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXICRYUml0LT5lQ0ZMWGlHRlhDZV9YaWhDOwogICAgfQoKICAgIC8vdldpTEsKICAgIFRmV0xYaUtXIHRDWGppSGlYRmNuaUhXKCRHRmNmQykgewogICAgICAgIGlUICgkR0ZjZkMgPT0gJycpIHsKICAgICAgICAgICAgJFhSaXQtPmVpSGlYRmNfdGlIVyA9ICcnOwogICAgICAgIH0gQ2N0QyB7CiAgICAgICAgICAgICRYUml0LT5laUhpWEZjX3RpSFcgPSAkR0ZjZkM7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyBYcGZDOwogICAgfQoKLy8qKioqKioqKioqKiBJZldMWGlLV3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBUZldMWGlLVyBIQ1huZlFDcEFlaGlXKCkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBmLmllLCBjLnBLY0MsIGYuVFdGaEMsIGYuaFdGaEMsIGYuY1dGaEMsIGYuS3BIX2llLCBmLkNoRmljIElTMlogZnRDcF9IcEtmUSBGdCBmSAogICAgICAgIEUyYWIgY0tIaVdfaEZ0WCBBbiBjIDJiIChmSC5pZSA9IGMucEtjQykKICAgICAgICBFMmFiIGZ0Q3AgQW4gZiAyYiAoYy5mdENwX2llID0gZi5pZSkKICAgICAgIFVzT1NPIGMucEtjQyA9ICdOJyBBYmogZi5lQ2NDWENfVGNGSCA9ICdtJyIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgSENYenBGV0xSc0NGZSgpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQywgZi5LcEhfaWUsIGYuQ2hGaWMgSVMyWiBmdENwX0hwS2ZRIEZ0IGZICiAgICAgICAgRTJhYiBjS0hpV19oRnRYIEFuIGMgMmIgKGZILmllID0gYy5wS2NDKQogICAgICAgIEUyYWIgZnRDcCBBbiBmIDJiIChjLmZ0Q3BfaWUgPSBmLmllKQogICAgICAgVXNPU08gYy5wS2NDID0gJzkzJyAiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWHpwRldMUnNDRmVfenJ2dENwYWUoJGZpZSwgJFFpZSwgJEhmQ3RYX2llKSB7CgogICAgICAgIC8qICAkWFJpdC0+UGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQywgZi5LcEhfaWUsIGYuQ2hGaWMgSVMyWiBIZkN0WHQgQW4gSAoKICAgICAgICAgIEUyYWIgZnRDcCBBbiBmIDJiIChJYWJqX2FiX25PSihmLmllLCBILmZ0Q3B0KSA+IG0pCiAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggQW4gYyAyYiAoZi5pZSA9IGMuZnRDcF9pZSkKICAgICAgICAgIFVzT1NPIGMucEtjQyA9ICc5MycgIEFiaiBILmllID0gJyRIZkN0WF9pZScgQWJqIEgucENUVF9pZSA9ICckUWllJwogICAgICAgICAgIik7CgogICAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOyAqLwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBmLmllLCBmLlRXRmhDLCBmLmhXRmhDLCBmLmNXRmhDLCBmLktwSF9pZSwgZi5DaEZpYyBJUzJaIEhmQ3RYdCBBbiBICiAgICAgICAgICAgICAgICAgRTJhYiBmdENwIEFuIGYgMmIgKElhYmpfYWJfbk9KKGYuaWUsIEguZnRDcHQpID4gbSkKICAgICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggQW4gYyAyYiAoZi5pZSA9IGMuZnRDcF9pZSkKICAgICAgICAgICAgICAgIFVzT1NPIGMucEtjQyA9ICc5MycgIEFiaiBILmllID0gOlZ2T25KX2FqIEFiaiBILnBDVFRfaWUgPSA6U09JSV9haiAiKTsKICAgICAgICAvLyRYUml0LT50WFItPkNnQ0xmWEMoRnBwRnIoJzpmdENwV0ZoQycgPT4gJFhSaXQtPmZ0Q3BXRmhDKSk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6VnZPbkpfYWoiLCAkSGZDdFhfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpTT0lJX2FqIiwgJFFpZSwgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgSENYOHBLVGljQ2FoRkhDX3pyYWUoJEdGY2ZDKSB7CiAgICAgICAgLy8kWFJpdC0+UGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogaWUsIFRXRmhDLCBoV0ZoQywgY1dGaEMsIEtwSF9pZSwgUXBLVGljQ19paEZIQyBJUzJaIGZ0Q3AgVXNPU08gaWUgPSAnJEdGY2ZDJyIpOwogICAgICAgIC8vICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+UGZDcHItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBpZSwgVFdGaEMsIGhXRmhDLCBjV0ZoQywgS3BIX2llLCBRcEtUaWNDX2loRkhDIElTMlogZnRDcCBVc09TTyBpZSA9IDphaiIpOwogICAgICAgIC8vJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOmZ0Q3BXRmhDJyA9PiAkWFJpdC0+ZnRDcFdGaEMpKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CgogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWHZ0Q3B0X0FjYygpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGZ0Q3AsY0tIaVdfaEZ0WCBVc09TTyBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llIEFiaiBmdENwLmVDY0NYQ19UY0ZIID0gJ20nIDJTak9TIHpvIGZ0Q3AuaWUgak9uNSIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgSENYdnRDcGpDWEZpY3RfakZYRkpGQmNDTigkRjVLY2ZoV3QsICR0VVJDcEMsICRLcGVDcEJyLCAkY2loaVgpIHsKICAgICAgICAkRjVLY2ZoV3RfcEMgPSB0WHBfcENRY0ZMQygiICwgIiwgIiAiLCBpaFFjS2VDKCIsICIsICRGNUtjZmhXdCkpOwogICAgICAgIGlUIChYcGloKCR0MnBlQ3ApID09ICcnKSB7CiAgICAgICAgICAgICR0MnBlQ3AgPSAiMlNqT1Mgem8gZi5pZSBlQ3RMIjsKICAgICAgICB9CiAgICAgICAgJFBmQ3ByID0gJ25PcU81SiBuMHFfNUFxNV9JMnZial9TMlVuICcgLiAkRjVLY2ZoV3RfcEMgLiAnIElTMlogZnRDcCBGdCBmLCBjS0hpV19oRnRYIEZ0IGMgIFVzT1NPIGYuaWUgPSBjLmZ0Q3BfaWUgJyAuICR0VVJDcEMgLiAiICIgLiAkS3BlQ3BCciAuICcgJyAuICRjaWhpWDsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCRQZkNwcik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwoJCQogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKLy9hakk1MSA5bS1tOS1OeCB0ZnRSRldYCiAgICAvL0dpZVJyRiA5Ny9teC85bTltCiAgICBUZldMWGlLVyBIQ1h2dENwdF96cmFlKCRHRmNmQykgewovLzhSS0NXaWcgTjMtTjktTjYgV0ZoQ2UgZnRDcAoKCiAgICAgICAgLyogJFhSaXQtPlBmQ3ByID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIGMucEtjQywgYy5GY1hfcEtjQywgYy5mdENwX2llLCBmLktwSF9pZSwgZi5UV0ZoQyxmLlFwS1RpY0NfaWhGSEMsIGYuaFdGaEMsIGYuY1dGaEMsIGMuZnRDcFdGaEMsIGYuQ2hGaWMsIGYuaEtCX1dLLCBmLlRLV0NfV0ssIGYuRmVlcEN0dCwgZi50WEZYZnQsIGYuTHBDRlhDZV9CciBJUzJaIGZ0Q3AgRnQgZgoKICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCBGdCBjIDJiIGMuZnRDcF9pZSA9IGYuaWUgVXNPU08gZi5pZSA9ICckR0ZjZkMnIik7CiAgICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7ICovCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGMucEtjQyxjLkNoUV9wS2NDLCBjLkZjWF9wS2NDLGYuV0ZoQ2VfVGNGSCxmLkNoUV9XRmhDZV9UY0ZILCBjLmZ0Q3BfaWUsIGYuS3BIX2llLCBmLlRXRmhDLGYuUXBLVGljQ19paEZIQywgZi5oV0ZoQywgZi5jV0ZoQywgYy5mdENwV0ZoQywgZi5DaEZpYywgZi5oS0JfV0ssIGYuVEtXQ19XSywgZi5GZWVwQ3R0LCBmLnRYRlhmdCwgZi5McENGWENlX0JyLGMuRkxMWF9jS0xNQ2VfdFhGWGZ0LGYuaEZ0WENwX2llLGMuRmVfaWUsIGYuTEZYQ0hLcHJfRkxMQ3R0X3RYRnBYX1hpaEMsIGYuTEZYQ0hLcHJfRkxMQ3R0X0NXZV9YaWhDLGYuRkxYaUdGWENlX1hpaEMsZi5lQ0ZMWGlHRlhDZV9YaWhDLGMuY0Z0WF9jS0hpVyxmLmVDUUZwWGhDV1hfaWUgSVMyWiBmdENwIEZ0IGYKICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggRnQgYyAyYiBjLmZ0Q3BfaWUgPSBmLmllIFVzT1NPIGYuaWUgPSA6YWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CgogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIHZRZUZYQzhwS1RpY0NhaEZIQygkR0ZjZkMpIHsKCiAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoImZRZUZYQyBmdENwIHRDWCBRcEtUaWNDX2loRkhDID0gJyRYUml0LT5RcEtUaWNDYWhGSEMnCgogICAgICAgICAga1JDcEMgaWUgPSAnJEdGY2ZDJyAiKTsKCiAgICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUjsgKi8KICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJmUWVGWEMgZnRDcCB0Q1ggUXBLVGljQ19paEZIQyA9IDo4UzJfYVpWIGtSQ3BDIGllID0gOmFqIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6YWonLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzo4UzJfYVpWJywgJFhSaXQtPlFwS1RpY0NhaEZIQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgogICAgVGZXTFhpS1cgZlFlRlhDOEZ0dGtLcGUoJEdGY2ZDKSB7CgogICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJmUWVGWEMgY0tIaVdfaEZ0WCB0Q1gJCQkJCQkJCQoKICAgICAgICAgIFFGdHRrS3BlID0gJyRYUml0LT5RRnR0a0twZScKICAgICAgICAgIGtSQ3BDIGZ0Q3BfaWUgPSAnJEdGY2ZDJyAiKTsKCiAgICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUjsgKi8KICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJmUWVGWEMgY0tIaVdfaEZ0WCB0Q1ggYFFGdHRrS3BlYCA9IDo4QW5uIGtSQ3BDIGZ0Q3BfaWUgPSA6YWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzphaicsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOjhBbm4nLCAkWFJpdC0+UUZ0dGtLcGUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWGpDRmNaRldGSENwKCkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBmdENwLmllLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDLCBmdENwLkNoRmljIElTMlogZnRDcCwgY0tIaVdfaEZ0WCBVc09TTyBmdENwLmllPWNLSGlXX2hGdFguZnRDcF9pZSBBYmogcEtjQz0nOScgQWJqIHRYRlhmdD0nb09uJyBBYmogZnRDcC5lQ2NDWENfVGNGSCA9ICdtJyIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgSENYamhfaENoX2ZXRnR0aUhXQ2UoJEdGY2ZDKSB7CgogICAgICAgIC8qICRYUml0LT5QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBmdENwLmllLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDIElTMlogYGZ0Q3BgLCBjS0hpV19oRnRYCgogICAgICAgICAgVXNPU08gZnRDcC5gaWVgID0gY0tIaVdfaEZ0WC5mdENwX2llIEFiagogICAgICAgICAgY0tIaVdfaEZ0WC5wS2NDICE9ICc5JyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmoKICAgICAgICAgIGZ0Q3AuaWUgYjJKIGFiKG5DY0NMWCBoQ2hfaWUgVHBLaCBGdHRpSFdfaENoX1FoIGtSQ3BDIFFoX2llID0gJyRHRmNmQycpIEFiagogICAgICAgICAgdFhGWGZ0ID0gJ29PbicgSHBLZlEgQnIgY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwoKICAgICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsgKi8KICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZnRDcC5pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQyBJUzJaIGBmdENwYCwgY0tIaVdfaEZ0WAogICAgICAgICAgVXNPU08gZnRDcC5gaWVgID0gY0tIaVdfaEZ0WC5mdENwX2llIEFiagogICAgICAgICAgY0tIaVdfaEZ0WC5wS2NDICE9ICc5JyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmoKICAgICAgICAgIGZ0Q3AuaWUgYjJKIGFiKG5DY0NMWCBoQ2hfaWUgVHBLaCBGdHRpSFdfaENoX1FoIGtSQ3BDIFFoX2llID0gOjhaX2FqKSBBYmoKICAgICAgICAgIHRYRlhmdCA9ICdvT24nIEFiaiBmdENwLmVDY0NYQ19UY0ZIID0gJ20nIEhwS2ZRIEJyIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjo4Wl9haiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CgogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWHZ0Q3B0X3pyVnBLZlEoJEdGY2ZDKSB7CiAgICAgICAgLy8gJFhSaXQtPktCbF9QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBmdENwLmllLGZ0Q3AuVFdGaEMsZnRDcC5oV0ZoQyxmdENwLmNXRmhDLCBmdENwLkNoRmljIElTMlogZnRDcCxjS0hpV19oRnRYIFVzT1NPICBmdENwLmllPWNLSGlXX2hGdFguZnRDcF9pZSBBYmogZnRDcC50WEZYZnQ9J29DdCcgIEFiaiBjS0hpV19oRnRYLnBLY0M9JyRHRmNmQyciKTsKICAgICAgICAvLyAkWFJpdC0+cENYZnBXID0gJFhSaXQtPktCbF9QZkNwci0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGZ0Q3AuaWUsZnRDcC5UV0ZoQyxmdENwLmhXRmhDLGZ0Q3AuY1dGaEMsIGZ0Q3AuQ2hGaWMgSVMyWiBmdENwLGNLSGlXX2hGdFggVXNPU08gIGZ0Q3AuaWU9Y0tIaVdfaEZ0WC5mdENwX2llIEFiaiBmdENwLnRYRlhmdD0nb0N0JyAgQWJqIGNLSGlXX2hGdFgucEtjQz0gOlMycU8gQWJqIGZ0Q3AuZUNjQ1hDX1RjRkggPSAnbSciKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpTMnFPIiwgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1hqaF9oQ2hfRnR0aUhXQ2UoJEdGY2ZDKSB7CgogICAgICAgIC8qICAkWFJpdC0+S0JsX1BmQ3ByID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgRnR0aUhXX2hDaF9RaGAKCiAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgRnR0aUhXX2hDaF9RaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICBVc09TTyBRaF9pZSA9ICckR0ZjZkMnIEFiagogICAgICAgICAgY0tIaVdfaEZ0WC5wS2NDICE9ICc5JyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmoKICAgICAgICAgIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgSHBLZlEgQnIgY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOyAqLwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBmdENwLmllLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDIElTMlogYEZ0dGlIV19oQ2hfUWhgCiAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgRnR0aUhXX2hDaF9RaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICBVc09TTyBRaF9pZSA9IDo4Wl9haiBBYmoKICAgICAgICAgIGNLSGlXX2hGdFgucEtjQyAhPSAnOScgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqCiAgICAgICAgICBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBmdENwLmVDY0NYQ19UY0ZIID0gJ20nIEhwS2ZRIEJyIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjo4Wl9haiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgSENYdnRDcF96cmFlKCRHRmNmQykgewogICAgICAgIC8vICRYUml0LT5QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoInRDY0NMWCAqIElTMlogZnRDcCBrUkNwQyBpZT0nJEdGY2ZDJyIpOwogICAgICAgIC8vICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+UGZDcHItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoInRDY0NMWCAqIElTMlogZnRDcCBrUkNwQyBpZT0gOmFqIik7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOmFqIiwgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1h2dENwX0FmWEsoJEdGY2ZDKSB7CiAgICAgICAgLy8gJFhSaXQtPlBmQ3ByID0gJFhSaXQtPmVCLT5QZkNwcigidENjQ0xYICogSVMyWiBmdENwIGtSQ3BDIGllPSckR0ZjZkMnIik7CiAgICAgICAgLy8gJFhSaXQtPnBDWGZwVyA9ICRYUml0LT5QZkNwci0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygidENjQ0xYICogSVMyWiBmdENwIGtSQ3BDIFRXRmhDIGNpTUMgJyUkR0ZjZkMlJyAyUyBoV0ZoQyBjaU1DICclJEdGY2ZDJScgMlMgY1dGaEMgY2lNQyAnJSRHRmNmQyUnIik7CiAgICAgICAgLy9DTFJLICJ0Q2NDTFggKiBJUzJaIGZ0Q3Aga1JDcEMgVFdGaEMgY2lNQyAnJSRHRmNmQyUnIEFiaiBoV0ZoQyBjaU1DICclJEdGY2ZDJScgQWJqIGNXRmhDIGNpTUMgJyUkR0ZjZkMlJyI7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOm5PQVM1c19uSlMiLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWHZ0Q3BiRmhDX3pyYWUoJEdGY2ZDKSB7CiAgICAgICAgLy8kWFJpdC0+UGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJ0Q2NDTFggKiBJUzJaIGZ0Q3Aga1JDcEMgaWU9JyRHRmNmQyciKTsKICAgICAgICAvLyRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+UGZDcHItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoInRDY0NMWCAqIElTMlogZnRDcCBrUkNwQyBpZT0gOmFqIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6YWoiLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwoKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBHQ3BpVHJ2dENwX0NlaVgoJEdGY2ZDLCAkaWUpIHsKICAgICAgICAvLyAkWFJpdC0+UGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJ0Q2NDTFggKiBJUzJaIGZ0Q3Aga1JDcEMgUXBLVGljQ19paEZIQyA9JyRHRmNmQycgQWJqIGllIDw+ICckaWUnIik7CiAgICAgICAgLy8kWFJpdC0+cENYZnBXID0gJFhSaXQtPlBmQ3ByLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJ0Q2NDTFggKiBJUzJaIGZ0Q3Aga1JDcEMgUXBLVGljQ19paEZIQyA9IDo4UzJfYVpWIEFiaiBpZSA8PiA6YWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRpZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOjhTMl9hWlYiLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwoKCiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgSENYMnBIRldpdEZYaUtXKCkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBpZSwgS3BIX1dGaEMgSVMyWiBoS2VfS3BIRldpdEZYaUtXIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1gycEhGV2l0RlhpS1dfenJhZSgkR0ZjZkMpIHsKICAgICAgICAvLyAgICRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogaWUsIEtwSF9XRmhDIElTMlogaEtlX0twSEZXaXRGWGlLVyBVc09TTyBpZSA9ICckR0ZjZkMnIik7CiAgICAgICAgLy8gICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPktCbF9QZkNwci0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGllLCBLcEhfV0ZoQyBJUzJaIGhLZV9LcEhGV2l0RlhpS1cgVXNPU08gaWUgPSA6YWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CgogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKLy9hakk1MSBORC1tOS1OeAogICAgLy9HaWVSckYgOTcvbXgvOW05bQogICAgLy9GZWVDZSBXRmhDZSBUY0ZIIFRLcCBRUktDV2lnLCBGQlJpbENDWAogICAgVGZXTFhpS1cgRmVlX2Z0Q3AoKSB7CgogICAgICAgIAogICAgICAgLyogICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoImlXdENwWCBpV1hLIGZ0Q3AoCQkJCQkJCQkJCgkJCQkJCQkJVFdGaEMsCQkJCQkJCQkKCQkJCQkJCQloV0ZoQywJCQkJCQkJCQoJCQkJCQkJCWNXRmhDLCAKCQkJCQkJCQlLcEhfaWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDUUZwWGhDV1hfaWUsCgkJCQkJCQkJQ2hGaWMsCgkJCQkJCQkJVEtXQ19XSywKCQkJCQkJCQloS0JfV0ssIAoJCQkJCQkJCUZlZXBDdHQsIAoJCQkJCQkJCXRYRlhmdCwgCgkJCQkJCQkJTHBDRlhDZV9CciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRmhDZV9UY0ZILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoUV9XRmhDZV9UY0ZILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhGdFhDcF9pZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRnRYQ3BfR0ZjZkNfaWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEZYQ0hLcHJfRkxMQ3R0X3RYRnBYX1hpaEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEZYQ0hLcHJfRkxMQ3R0X0NXZV9YaWhDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMWGlHRlhDZV9YaWhDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDRkxYaUdGWENlX1hpaEMpIEdGY2ZDdCAoOkliQVpPLDpaYkFaTyw6cWJBWk8sOjJTVmFqLDplQ1FGcFhoQ1dYX2llLDpPWkFhcSw6STJiT19iMiw6WjJ6X2IyLDpBampTT25uLDpuSkFKdm4sOjVTT0FKT2pfem8sOmJBWk9qX0lxQVYsOk9aOF9iQVpPal9JcUFWLDpaQW5KT1NfYWosOlpBbkpPU195QXF2T19haiwgOm5KQVNKX0phWk8sIDpPYmpfSmFaTywgOkE1SmF5QUpPakphWk8sOmpPQTVKYXlBSk9qSmFaTykiKTsgKi8KCQkJCQkJCQkKCQkgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygiaVd0Q3BYIGlXWEsgZnRDcCgJCQkJCQkJCQkKCQkJCQkJCQlUV0ZoQywJCQkJCQkJCQoJCQkJCQkJCWhXRmhDLAkJCQkJCQkJCgkJCQkJCQkJY1dGaEMsIAoJCQkJCQkJCUtwSF9pZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNRRnBYaENXWF9pZSwKCQkJCQkJCQlDaEZpYywKCQkJCQkJCQlUS1dDX1dLLAoJCQkJCQkJCWhLQl9XSywgCgkJCQkJCQkJRmVlcEN0dCwgCgkJCQkJCQkJdFhGWGZ0LCAKCQkJCQkJCQlMcENGWENlX0JyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdGaENlX1RjRkgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hRX1dGaENlX1RjRkgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEZ0WENwX2llLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhGdFhDcF9HRmNmQ19pZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRlhDSEtwcl9GTExDdHRfdFhGcFhfWGloQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRlhDSEtwcl9GTExDdHRfQ1dlX1hpaEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxYaUdGWENlX1hpaEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNGTFhpR0ZYQ2VfWGloQykgR0ZjZkN0ICgnJFhSaXQtPlRXRmhDJywnJFhSaXQtPmhXRmhDJywnJFhSaXQtPmNXRmhDJywnJFhSaXQtPktwSF9pZScsJyRYUml0LT5lQ1FYX2llJywnJFhSaXQtPkNoRmljJywnJFhSaXQtPlRLV0NfV0snLCckWFJpdC0+aEtCX1dLJywnJFhSaXQtPkZlZXBDdHQnLCckWFJpdC0+dFhGWGZ0JywnJFhSaXQtPkxwQ0ZYQ2VfQnInLCckWFJpdC0+ZnRDcF9YclFDJywnJFhSaXQtPkNoUWNLckNDX1dGaENfVGNGSCcsJyRYUml0LT5oRnRYQ3BfaWUnLCckWFJpdC0+aEZ0WENwX0dGY2ZDX2llJywgJyRYUml0LT50WEZwWF9GTExDdHRfWGloQycsICckWFJpdC0+Q1dlX0ZMTEN0dF9YaWhDJywgJyRYUml0LT5GTFhpR0ZYQ2VfWGloQycsJyRYUml0LT5lQ0ZMWGlHRlhDZV9YaWhDJykiKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6SWJBWk8nLCAkWFJpdC0+VFdGaEMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpaYkFaTycsICRYUml0LT5oV0ZoQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOnFiQVpPJywgJFhSaXQtPmNXRmhDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6MlNWYWonLCAkWFJpdC0+S3BIX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6ZUNRRnBYaENXWF9pZScsICRYUml0LT5lQ1FYX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6T1pBYXEnLCAkWFJpdC0+Q2hGaWMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpJMmJPX2IyJywgJFhSaXQtPlRLV0NfV0ssIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpaMnpfYjInLCAkWFJpdC0+aEtCX1dLLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6QWpqU09ubicsICRYUml0LT5GZWVwQ3R0LCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6bkpBSnZuJywgJFhSaXQtPnRYRlhmdCwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOjVTT0FKT2pfem8nLCAkWFJpdC0+THBDRlhDZV9CciwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOmJBWk9qX0lxQVYnLCAkWFJpdC0+ZnRDcF9YclFDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6T1o4X2JBWk9qX0lxQVYnLCAkWFJpdC0+Q2hRY0tyQ0NfV0ZoQ19UY0ZILCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6WkFuSk9TX2FqJywgJFhSaXQtPmhGdFhDcF9pZSwgOGoyOjo4QVNBWl9uSlMpOwovL2FqSTVOCgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOlpBbkpPU195QXF2T19haicsICRYUml0LT5oRnRYQ3BfR0ZjZkNfaWUsIDhqMjo6OEFTQVpfbkpTKTsKLy9hakk1TgoKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpuSkFTSl9KYVpPJywgJFhSaXQtPnRYRnBYX0ZMTEN0dF9YaWhDLCA4ajI6OjhBU0FaX25KUyk7Ci8vYWpJNU4KCiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6T2JqX0phWk8nLCAkWFJpdC0+Q1dlX0ZMTEN0dF9YaWhDLCA4ajI6OjhBU0FaX25KUyk7Ci8vYWpJNU4KICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpBNUpheUFKT2pKYVpPJywgJFhSaXQtPkZMWGlHRlhDZV9YaWhDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6ak9BNUpheUFKT2pKYVpPJywgJFhSaXQtPmVDRkxYaUdGWENlX1hpaEMsIDhqMjo6OEFTQVpfbkpTKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+ZUItPmNGdFhhV3RDcFhhZSgpOwogICAgfQoKLy9hakk1MSBORC1tOS1OeAogICAgLy9HaWVSckYgOTcteC05bTltCiAgICBUZldMWGlLVyBDZWlYX2Z0Q3AoJEdGY2ZDKSB7Ci8vOFJLQ1dpZyBOMy1OOS1ONgoKCiAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoImZRZUZYQyBmdENwIHRDWAkJCQkJCQkJCgogICAgICAgICAgVFdGaEMgPSAnJFhSaXQtPlRXRmhDJywKICAgICAgICAgIGhXRmhDID0gJyRYUml0LT5oV0ZoQycsCiAgICAgICAgICBjV0ZoQyA9ICckWFJpdC0+Y1dGaEMnLAogICAgICAgICAgS3BIX2llID0gJyRYUml0LT5LcEhfaWUnLAogICAgICAgICAgQ2hGaWMgPSAnJFhSaXQtPkNoRmljJywKICAgICAgICAgIFRLV0NfV0sgPSAnJFhSaXQtPlRLV0NfV0snLAogICAgICAgICAgaEtCX1dLID0gJyRYUml0LT5oS0JfV0snLAogICAgICAgICAgRmVlcEN0dCA9ICckWFJpdC0+RmVlcEN0dCcsCiAgICAgICAgICB0WEZYZnQgPSAnJFhSaXQtPnRYRlhmdCcsCiAgICAgICAgICBMcENGWENlX0JyID0gJyRYUml0LT5McENGWENlX0JyJyBrUkNwQyBpZSA9ICckR0ZjZkMnICIpOwoKICAgICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSOyAqLwoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJmUWVGWEMgZnRDcCB0Q1gJCQkJCQkJCQoJCQkJCQkJCVRXRmhDID0gOkliQVpPLAkJCQkJCQkJCgkJCQkJCQkJaFdGaEMgPSA6WmJBWk8sCQkJCQkJCQkKCQkJCQkJCQljV0ZoQyA9IDpxYkFaTywKCQkJCQkJCQlLcEhfaWUgPSA6MlNWYWosIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDUUZwWGhDV1hfaWUgPSA6ZUNRRnBYaENXWF9pZSwgCgkJCQkJCQkJQ2hGaWMgPSA6T1pBYXEsCgkJCQkJCQkJVEtXQ19XSyA9IDpJMmJPX2IyLAoJCQkJCQkJCWhLQl9XSyA9IDpaMnpfYjIsIAoJCQkJCQkJCUZlZXBDdHQgPSA6QWpqU09ubiwgCgkJCQkJCQkJdFhGWGZ0ID0gOm5KQUp2biwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0ZoQ2VfVGNGSCA9IDpiQVpPal9JcUFWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoUV9XRmhDZV9UY0ZIPTpPWjhfYkFaT2pfSXFBViwKCQkJCQkJCQlMcENGWENlX0JyID0gOjVTT0FKT2pfem8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEZYQ0hLcHJfRkxMQ3R0X3RYRnBYX1hpaEMgPSA6bkpBU0pfSmFaTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRlhDSEtwcl9GTExDdHRfQ1dlX1hpaEMgPSA6T2JqX0phWk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxYaUdGWENlX1hpaEMgPSA6QTVKYXlBSk9qSmFaTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ0ZMWGlHRlhDZV9YaWhDID0gOmpPQTVKYXlBSk9qSmFaTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRmljX1RjRkggPSA6WkFhcV9JcUFWIGtSQ3BDIGllID0gOmFqIik7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOkliQVpPJywgJFhSaXQtPlRXRmhDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6WmJBWk8nLCAkWFJpdC0+aFdGaEMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpxYkFaTycsICRYUml0LT5jV0ZoQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOjJTVmFqJywgJFhSaXQtPktwSF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOmVDUUZwWGhDV1hfaWUnLCAkWFJpdC0+ZUNRWF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOk9aQWFxJywgJFhSaXQtPkNoRmljLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6STJiT19iMicsICRYUml0LT5US1dDX1dLLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6WjJ6X2IyJywgJFhSaXQtPmhLQl9XSywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOkFqalNPbm4nLCAkWFJpdC0+RmVlcEN0dCwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOm5KQUp2bicsICRYUml0LT50WEZYZnQsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpiQVpPal9JcUFWJywgJFhSaXQtPmZ0Q3BfWHJRQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOk9aOF9iQVpPal9JcUFWJywgJFhSaXQtPkNoUWNLckNDX1dGaENfVGNGSCwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOjVTT0FKT2pfem8nLCAkWFJpdC0+THBDRlhDZV9CciwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOm5KQVNKX0phWk8nLCAkWFJpdC0+dFhGcFhfRkxMQ3R0X1hpaEMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpPYmpfSmFaTycsICRYUml0LT5DV2VfRkxMQ3R0X1hpaEMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpBNUpheUFKT2pKYVpPJywgJFhSaXQtPkZMWGlHRlhDZV9YaWhDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6ak9BNUpheUFKT2pKYVpPJywgJFhSaXQtPmVDRkxYaUdGWENlX1hpaEMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpaQWFxX0lxQVYnLCAkWFJpdC0+aEZpY19UY0ZILCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6YWonLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKCiAgICAgICAgcENYZnBXICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgIH0KCiAgICBUZldMWGlLVyBDZWlYX2Z0Q3BfUUNwdEtXRmMoJEdGY2ZDKSB7CgogICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJmUWVGWEMgZnRDcCB0Q1gJCQkJCQkJCQoKICAgICAgICAgIFRXRmhDID0gJyRYUml0LT5UV0ZoQycsCiAgICAgICAgICBoV0ZoQyA9ICckWFJpdC0+aFdGaEMnLAogICAgICAgICAgY1dGaEMgPSAnJFhSaXQtPmNXRmhDJywKICAgICAgICAgIEtwSF9pZSA9ICckWFJpdC0+S3BIX2llJywKICAgICAgICAgIENoRmljID0gJyRYUml0LT5DaEZpYycsCiAgICAgICAgICBUS1dDX1dLID0gJyRYUml0LT5US1dDX1dLJywKICAgICAgICAgIGhLQl9XSyA9ICckWFJpdC0+aEtCX1dLJywKICAgICAgICAgIEZlZXBDdHQgPSAnJFhSaXQtPkZlZXBDdHQnLAogICAgICAgICAgTHBDRlhDZV9CciA9ICckWFJpdC0+THBDRlhDZV9Ccicga1JDcEMgaWUgPSAnJEdGY2ZDJyAiKTsKCiAgICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUjsgKi8KCiAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygiZlFlRlhDIGZ0Q3AgdENYCQkJCQkJCQkKCQkJCQkJCQlUV0ZoQyA9IDpJYkFaTywJCQkJCQkJCQoJCQkJCQkJCWhXRmhDID0gOlpiQVpPLAkJCQkJCQkJCgkJCQkJCQkJY1dGaEMgPSA6cWJBWk8sCgkJCQkJCQkJS3BIX2llID0gOjJTVmFqLCAKCQkJCQkJCQllQ1FGcFhoQ1dYX2llID0gOmpPOEphaiwgCgkJCQkJCQkJQ2hGaWMgPSA6T1pBYXEsCgkJCQkJCQkJVEtXQ19XSyA9IDpJMmJPX2IyLAoJCQkJCQkJCWhLQl9XSyA9IDpaMnpfYjIsIAoJCQkJCQkJCUZlZXBDdHQgPSA6QWpqU09ubiwgCgkJCQkJCQkJTHBDRlhDZV9CciA9IDo1U09BSk9qX3pvIGtSQ3BDIGllID0gOmFqIik7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOkliQVpPJywgJFhSaXQtPlRXRmhDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6WmJBWk8nLCAkWFJpdC0+aFdGaEMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpxYkFaTycsICRYUml0LT5jV0ZoQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOjJTVmFqJywgJFhSaXQtPktwSF9pZSwgOGoyOjo4QVNBWl9uSlMpOwoJCSRYUml0LT50WFItPkJpV2V5RmNmQygnOmpPOEphaicsICRYUml0LT5lQ1FYX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6T1pBYXEnLCAkWFJpdC0+Q2hGaWMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpJMmJPX2IyJywgJFhSaXQtPlRLV0NfV0ssIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpaMnpfYjInLCAkWFJpdC0+aEtCX1dLLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6QWpqU09ubicsICRYUml0LT5GZWVwQ3R0LCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6NVNPQUpPal96bycsICRYUml0LT5McENGWENlX0JyLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6YWonLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKCiAgICAgICAgcENYZnBXICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1hxS0hpV1pGdFhfenJhZSgkR0ZjZkMpIHsKCiAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiAqIElTMlogY0tIaVdfaEZ0WCBVc09TTyBpZSA9ICckR0ZjZkMnIik7CgogICAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7ICovCgogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogY0tIaVdfaEZ0WCBVc09TTyBmdENwX2llID0gOmFqIiwgRnBwRnIoOGoyOjpBSkpTXzV2U24yUyA9PiA4ajI6OjV2U24yU19JVWoyYnFvKSk7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOmFqJyA9PiAkR0ZjZkMpKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCi8vYWpJNTEgTkQtbTktTngKICAgIFRmV0xYaUtXIEZlZV9jS0hpV19oRnRYKCkgewoKICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByID0gJFhSaXQtPmVCLT5QZkNwcigiaVd0Q3BYIGlXWEsgY0tIaVdfaEZ0WCgJCQkJCQkJCQkKCiAgICAgICAgICBmdENwX2llLAogICAgICAgICAgcEtjQywKICAgICAgICAgIEZjWF9wS2NDLAogICAgICAgICAgZnRDcF90WEZYZnQsCiAgICAgICAgICBmdENwV0ZoQywKICAgICAgICAgIFFGdHRrS3BlKSBHRmNmQ3QoCiAgICAgICAgICAnJFhSaXQtPmZ0Q3BfaWUnLAogICAgICAgICAgJyRYUml0LT5wS2NDJywKICAgICAgICAgICckWFJpdC0+RmNYX3BLY0MnLAogICAgICAgICAgJyRYUml0LT5mdENwX3RYRlhmdCcsCiAgICAgICAgICAnJFhSaXQtPmZ0Q3BXRmhDJywKICAgICAgICAgICckWFJpdC0+UUZ0dGtLcGUnKSIpOwogICAgICAgICAgcENYZnBXICRYUml0LT5lQi0+Y0Z0WGFXdENwWGFlKCk7ICovCgogICAgICAgICRlRlhDID0gZUZYQygiby1oLWUiKTsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJpV3RDcFggaVdYSyBjS0hpV19oRnRYKAkJCQkJCQkJCQoJCQkJCQkJCWZ0Q3BfaWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwS2NDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hRX3BLY0MsCgkJCQkJCQkJRmNYX3BLY0MsIAkJCQkJCQkJCgkJCQkJCQkJZnRDcF90WEZYZnQsIAoJCQkJCQkJCWZ0Q3BXRmhDLAoJCQkJCQkJCWBRRnR0a0twZWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1dDa0NlX0ZYLEZlX2llKSBHRmNmQ3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dm5PU19haiwKCQkJCQkJCQk6UzJxTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpPWjhfUzJxTywgCgkJCQkJCQkJOkFxSl9TMnFPLCAKCQkJCQkJCQk6dm5PU19uSkFKdm4sIAoJCQkJCQkJCTp2bk9TYkFaTywgCgkJCQkJCQkJOjhBbm5VMlNqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOlNPYk9VT2pfQUosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6QWpfYWopIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6dm5PU19haicsICRYUml0LT5mdENwX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6UzJxTycsICRYUml0LT5wS2NDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6T1o4X1MycU8nLCAkWFJpdC0+Q2hRY0tyQ0NfcEtjQywgOGoyOjo4QVNBWl9uSlMpOwovL2llVExOIDlELU4tOW1OeAoKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpBcUpfUzJxTycsICRYUml0LT5GY1hfcEtjQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOnZuT1NfbkpBSnZuJywgJFhSaXQtPmZ0Q3BfdFhGWGZ0LCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6dm5PU2JBWk8nLCAkWFJpdC0+ZnRDcFdGaEMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzo4QW5uVTJTaicsICRYUml0LT5RRnR0a0twZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOlNPYk9VT2pfQUonLCAkZUZYQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOkFqX2FqJywgJFhSaXQtPkZlX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+ZUItPmNGdFhhV3RDcFhhZSgpOwogICAgfQoKLy9hakk1MSBORC1tOS1OeAogICAgVGZXTFhpS1cgQ2VpWF9jS0hpV19oRnRYKCRHRmNmQykgewoKICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByID0gJFhSaXQtPmVCLT5QZkNwcigiZlFlRlhDIGNLSGlXX2hGdFggdENYIHBLY0MgPSAnJFhSaXQtPnBLY0MnLCBGY1hfcEtjQyA9ICckWFJpdC0+RmNYX3BLY0MnLCBmdENwX3RYRlhmdCA9ICckWFJpdC0+ZnRDcF90WEZYZnQnIGtSQ3BDIGZ0Q3BfaWUgPSAnJEdGY2ZDJyIpOwoKCiAgICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUjsgKi8KCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygiZlFlRlhDIGNLSGlXX2hGdFggdENYIHBLY0MgPSA6UzJxTywgQ2hRX3BLY0MgPSA6T1o4X1MycU8sIEZjWF9wS2NDID0gOkFxSl9TMnFPLCBmdENwX3RYRlhmdCA9IDp2bk9TX25KQUp2biwgRkxMWF9jS0xNQ2VfdFhGWGZ0ID0gOnEyNWRfbkpBSnZuIGtSQ3BDIGZ0Q3BfaWUgICA9IDp2bk9TX2FqIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6UzJxTycsICRYUml0LT5wS2NDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6T1o4X1MycU8nLCAkWFJpdC0+Q2hRY0tyQ0NfcEtjQywgOGoyOjo4QVNBWl9uSlMpOwovL2llVExOIDlELU4tOW1OeAoKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpBcUpfUzJxTycsICRYUml0LT5GY1hfcEtjQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOnZuT1NfbkpBSnZuJywgJFhSaXQtPmZ0Q3BfdFhGWGZ0LCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6cTI1ZF9uSkFKdm4nLCAkWFJpdC0+Y0tMTV90WEZYZnQsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzp2bk9TX2FqJywgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgogICAgVGZXTFhpS1cgQ2VpWF9jS0hpV19oRnRYX1FDcHRLV0ZjKCRHRmNmQykgewoKICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByID0gJFhSaXQtPmVCLT5QZkNwcigiZlFlRlhDIGNLSGlXX2hGdFggdENYIGZ0Q3BXRmhDPSckWFJpdC0+ZnRDcFdGaEMnLHBLY0MgPSckWFJpdC0+cEtjQycga1JDcEMgZnRDcF9pZSA9ICckR0ZjZkMnIik7CgogICAgICAgICAgcENYZnBXICRYUml0LT50WFI7ICovCgogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoImZRZUZYQyBjS0hpV19oRnRYIHRDWCBmdENwV0ZoQz06dm5PU2JBWk8scEtjQyA9OlMycU8ga1JDcEMgZnRDcF9pZSA9IDp2bk9TX2FqIik7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOnZuT1NiQVpPJywgJFhSaXQtPmZ0Q3BXRmhDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6UzJxTycsICRYUml0LT5wS2NDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6dm5PU19haicsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKICAgIFRmV0xYaUtXIGVDY0NYQ19mdENwKCRHRmNmQykgewogICAgICAgIC8vJFhSaXQtPktCbF9QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoImVDY0NYQyBUcEtoIGZ0Q3Aga1JDcEMgaWU9JyRHRmNmQyciKTsKICAgICAgICAvL3BDWGZwVyAkWFJpdC0+S0JsX1BmQ3ByOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoImVDY0NYQyBUcEtoIGZ0Q3Aga1JDcEMgaWU9IDphaiIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOmFqIiwgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgcENYZnBXICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgIH0KCiAgICBUZldMWGlLVyBlQ2NDWENfY0tIaVdfaEZ0WCgkR0ZjZkMpIHsKICAgICAgICAvLyRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJlQ2NDWEMgVHBLaCBjS0hpV19oRnRYIGtSQ3BDIGZ0Q3BfaWU9JyRHRmNmQyciKTsKICAgICAgICAvL3BDWGZwVyAkWFJpdC0+S0JsX1BmQ3ByOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoImVDY0NYQyBUcEtoIGNLSGlXX2hGdFgga1JDcEMgZnRDcF9pZT0gOmFqIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6YWoiLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKICAgIC8vOU4tbTMtOW1ONgogICAgVGZXTFhpS1cgZUNjQ1hDX2Z0Q3BfUUZYUigkR0ZjZkMpIHsKLy8gICAgICAgIENMUksgImVDY0NYQyBUcEtoIGZ0Q3BfVGljQ19RRlhSIGtSQ3BDIGZ0Q3BfaWU9ICRHRmNmQyI7ZWlDOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoImVDY0NYQyBUcEtoIGZ0Q3BfVGljQ19RRlhSIGtSQ3BDIGZ0Q3BfaWU9IDphaiIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOmFqIiwgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgcENYZnBXICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1hfcUtIaVdaRnRYX3pydmFqKCRHRmNmQykgewoKCiAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiAqIElTMlogY0tIaVdfaEZ0WCBVc09TTyBmdENwX2llID0gJyRHRmNmQyciKTsKCiAgICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsgKi8KCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogSVMyWiBjS0hpV19oRnRYIFVzT1NPIGZ0Q3BfaWUgPSA6YWoiLCBGcHBGcig4ajI6OkFKSlNfNXZTbjJTID0+IDhqMjo6NXZTbjJTX0lVajJicW8pKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKEZwcEZyKCc6YWonID0+ICRHRmNmQykpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIDVSQ0xNdnRDcFdGaENfRkdGaWNGQmljaVhyKCkgewogICAgICAgIGlUIChDaFFYcigkWFJpdC0+aWUpKSB7CiAgICAgICAgICAgIC8vICRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogaWUgSVMyWiBjS0hpV19oRnRYIFVzT1NPIGZ0Q3BXRmhDID0gJyRYUml0LT5mdENwV0ZoQyciKTsKICAgICAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGllIElTMlogY0tIaVdfaEZ0WCBVc09TTyBmdENwV0ZoQyA9IDp2bk9TYkFaTyBBYmogZUNjQ1hDX1RjRkggPSAnbSciLCBGcHBGcig4ajI6OkFKSlNfNXZTbjJTID0+IDhqMjo6NXZTbjJTX0lVajJicW8pKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOnZuT1NiQVpPJyA9PiAkWFJpdC0+ZnRDcFdGaEMpKTsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAvLyRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogaWUgSVMyWiBjS0hpV19oRnRYIFVzT1NPIGZ0Q3BXRmhDID0gJyRYUml0LT5mdENwV0ZoQycgQWJqIGZ0Q3BfaWUgPD4gJyRYUml0LT5pZSciKTsKICAgICAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGllIElTMlogY0tIaVdfaEZ0WCBVc09TTyBmdENwV0ZoQyA9IDp2bk9TYkFaTyBBYmogZnRDcF9pZSA8PiA6YWogQWJqIGVDY0NYQ19UY0ZIID0gJ20nIiwgRnBwRnIoOGoyOjpBSkpTXzV2U24yUyA9PiA4ajI6OjV2U24yU19JVWoyYnFvKSk7CiAgICAgICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoRnBwRnIoJzp2bk9TYkFaTycgPT4gJFhSaXQtPmZ0Q3BXRmhDLCAnOmFqJyA9PiAkWFJpdC0+aWUpKTsKICAgICAgICB9CiAgICAgICAgLy8kWFJpdC0+cENYZnBXID0gJFhSaXQtPktCbF9QZkNwci0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgLy9wQ1hmcFcgJFhSaXQtPnBDWGZwVzsKCiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgNVJDTE1PaEZpY19GR0ZpY0ZCaWNpWHIoKSB7CiAgICAgICAgaVQgKENoUVhyKCRYUml0LT5pZSkpIHsKICAgICAgICAgICAgLy8kWFJpdC0+S0JsX1BmQ3ByID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIGllIElTMlogZnRDcCBVc09TTyBDaEZpYyA9ICckWFJpdC0+Q2hGaWMnIEFiaiBlQ2NDWENfVGNGSCA9ICdtJyIpOwogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogaWUgSVMyWiBmdENwIFVzT1NPIENoRmljID0gOk9aQWFxIEFiaiBlQ2NDWENfVGNGSCA9ICdtJyIpOwogICAgICAgICAgICAvLyQkWFJpdC0+dFhSLT5DZ0NMZlhDKEZwcEZyKCc6T1pBYXEnID0+ICRYUml0LT5DaEZpYykpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpPWkFhcSIsICRYUml0LT5DaEZpYywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgIH0gQ2N0QyB7CiAgICAgICAgICAgIC8vJFhSaXQtPktCbF9QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBpZSBJUzJaIGZ0Q3AgVXNPU08gQ2hGaWMgPSAnJFhSaXQtPkNoRmljJyBBYmogaWUgPD4gJyRYUml0LT5pZScgQWJqIGVDY0NYQ19UY0ZIID0gJ20nIik7CiAgICAgICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBpZSBJUzJaIGZ0Q3AgVXNPU08gQ2hGaWMgPSA6T1pBYXEgQWJqIGllIDw+IDphaiBBYmogZUNjQ1hDX1RjRkggPSAnbSciKTsKICAgICAgICAgICAgLy8kWFJpdC0+dFhSLT5DZ0NMZlhDKEZwcEZyKCc6T1pBYXEnID0+ICRYUml0LT5DaEZpYywgJzphaicgPT4gJFhSaXQtPmllKSk7CiAgICAgICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOk9aQWFxIiwgJFhSaXQtPkNoRmljLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOmFqIiwgJFhSaXQtPmllLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgfQogICAgICAgIC8vJFhSaXQtPnBDWGZwVyA9ICRYUml0LT5LQmxfUGZDcHItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIC8vcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWHZ0Q3Bhal9CcldGaEMoJFRpcHRYV0ZoQywgJGNGdFhXRmhDKSB7CiAgICAgICAgLy8gJFhSaXQtPktCbF9QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiAqIElTMlogZnRDcF9IcEtmUSBVc09TTyBpZSA9ICckR0ZjZkMnIik7CiAgICAgICAgLy8gJFhSaXQtPnBDWGZwVyA9ICRYUml0LT5LQmxfUGZDcHItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBpZSBJUzJaIGZ0Q3AgVXNPU08gVFdGaEMgPSA6YWogRldlIGNXRmhDPSA6YWpOIEFiaiBlQ2NDWENfVGNGSCA9ICdtJyIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOmFqIiwgJFRpcHRYV0ZoQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOmFqTiIsICRjRnRYV0ZoQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCi8vKioqKioqKioqKioqKioqKioqKioqKiovLwovLyAgICAgIHZuT1MgVlMydjggICAgICAgLy8KLy8qKioqKioqKioqKioqKioqKioqKioqKi8vCgoKICAgIFRmV0xYaUtXIEhDWHZ0Q3BWcEtmUV9CcmFlKCRHRmNmQykgewogICAgICAgIC8vICRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogKiBJUzJaIGZ0Q3BfSHBLZlEgVXNPU08gaWUgPSAnJEdGY2ZDJyIpOwogICAgICAgIC8vICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+S0JsX1BmQ3ByLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGZ0Q3BfSHBLZlEgVXNPU08gaWUgPSA6YWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CgkJICAgfQoJCSAgIAoJCVRmV0xYaUtXIEhDWHZ0Q3BTS2NDX0JyYWUoJEdGY2ZDKSB7CiAgICAgICAgLy8gJFhSaXQtPktCbF9QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiAqIElTMlogZnRDcF9IcEtmUSBVc09TTyBpZSA9ICckR0ZjZkMnIik7CiAgICAgICAgLy8gJFhSaXQtPnBDWGZwVyA9ICRYUml0LT5LQmxfUGZDcHItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMloga0twTVRjS2tfcEtjQ3QgVXNPU08gaWUgPSA6YWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAKCQogICAgfQoKICAgIC8vaWVUTE4gOUQtTi05bU54IGFqSTU5IC8vYWpJNTEgTkQtbTktTnggCi8vICAgIFRmV0xYaUtXIEhDWHZ0Q3BWcEtmUXpyT2hRSWNGSCgpIHsKLy8gICAgICAgICRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogKiBJUzJaIGZ0Q3BfSHBLZlEga1JDcEMgQ2hRX1RjRkggPSAnTicgQWJqIGllIGFiIChOLDksTjEsMW0pIik7Ci8vICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPktCbF9QZkNwci0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7Ci8vICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKLy8gICAgfQovLzhSS0NXaWcgOTYtTjktTjYKICAgIFRmV0xYaUtXIEhDWHZ0Q3BWcEtmUSgpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGZ0Q3BfSHBLZlEgIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwovL1VzT1NPIGllICE9ICdOJwoKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgSENYdnRDcFZwS2ZRXzJXY3JuQSgpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGZ0Q3BfSHBLZlEgVXNPU08gaWUgPSAnTiciKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKLy8gICAgOFJLQ1dpZ04gOTMtTjktTjYKICAgIFRmV0xYaUtXIEhDWHZ0Q3BWcEtmUUFjYygpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGZ0Q3BfSHBLZlEgS3BlQ3AgQnIgaWUgRnRMIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICAvL2ZRZUZYQ2UgTjMtTjktOW1ONiBRUktDV2lnTiwgYWpJNU4KICAgIFRmV0xYaUtXIEhDWHZ0Q3BWcEtmUV9GY2MoKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogSVMyWiBmdENwX0hwS2ZRIFVzT1NPIFFGcENXWF9pZSA9IG0gS3BlQ3AgQnIgaWUgRnRMIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICAvLyBmUWVGWENlIE42LU45LTltTjYgYWpJNU4gLy9hakk1MSBORC1tOS1OeAogICAgVGZXTFhpS1cgRmVlX2Z0Q3BIcEtmUSgpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJpV3RDcFggaVdYSyBmdENwX0hwS2ZRKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlDcEZwTFJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUZwQ1dYX2llLAoJCQkJCQkJCVdGaEMsCQkJCQkJCQkKCQkJCQkJCQllQ3RMcGlRWGlLVywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdGaENlX1RjRkgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwS0tYV0tlQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0Q3BIcEtmUUZjaUZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hRX1RjRkgpIEdGY2ZDdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzYU9TQVM1c28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OEFTT2JKYWosCgkJCQkJCQkJOmJBWk8sCQkJCQkJCQkKCQkJCQkJCQk6ak9uNVNhOEphMmIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6YkFaT2pfSXFBViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpTMjJKYjJqTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp2bk9TVlMydjhBcWFBbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpPWjhfSXFBVikiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpzYU9TQVM1c28nLCAkWFJpdC0+UmlDcEZwTFJyLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6OEFTT2JKYWonLCAkWFJpdC0+UUZwQ1dYX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6YkFaTycsICRYUml0LT5XRmhDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6ak9uNVNhOEphMmInLCAkWFJpdC0+ZUN0THBpUVhpS1csIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpiQVpPal9JcUFWJywgJFhSaXQtPldGaENlX2Z0Q3AsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpTMjJKYjJqTycsICRYUml0LT5wS0tYV0tlQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOnZuT1NWUzJ2OEFxYUFuJywgJFhSaXQtPmZ0Q3BIcEtmUUZjaUZ0LCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6T1o4X0lxQVYnLCAkWFJpdC0+Q2hRY0tyQ0NfZkhfVGNGSCwgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5lQi0+Y0Z0WGFXdENwWGFlKCk7CiAgICB9CgogICAgLy8gZlFlRlhDZSBONi1OOS05bU42IGFqSTUgLy9hakk1MSBORC1tOS1OeAoKICAgIFRmV0xYaUtXIENlaVhfZnRDcEhwS2ZRKCRHRmNmQykgewovLyAgICAgICAgQ0xSSyAiZlFlRlhDIGZ0Q3BfSHBLZlEgdENYCVJpQ3BGcExSciA9ICRYUml0LT5SaUNwRnBMUnIsIFFGcENXWF9pZSA9ICRYUml0LT5RRnBDV1hfaWUsCQkJCQkJCQovLwkJCQkJCQkJV0ZoQyA9ICckWFJpdC0+V0ZoQycsCQkJCQkJCQkKLy8JCQkJCQkJCWVDdExwaVFYaUtXID0gJyRYUml0LT5lQ3RMcGlRWGlLVycsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdGaENlX1RjRkg9JyRYUml0LT5XRmhDZV9mdENwJywKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRDcEhwS2ZRRmNpRnQ9JyRYUml0LT5mdENwSHBLZlFGY2lGdCcsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoUV9UY0ZIPSckWFJpdC0+Q2hRY0tyQ0NfZkhfVGNGSCcgCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSQ3BDIGllID0kR0ZjZkMiOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoImZRZUZYQyBmdENwX0hwS2ZRIHRDWAlSaUNwRnBMUnIgPSA6c2FPU0FTNXNvLCBRRnBDV1hfaWUgPSA6OEFTT2JKYWosCQkJCQkJCQoJCQkJCQkJCVdGaEMgPSA6YkFaTywJCQkJCQkJCQoJCQkJCQkJCWVDdExwaVFYaUtXID0gOmpPbjVTYThKYTJiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0ZoQ2VfVGNGSD06YkFaT2pfSXFBViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0Q3BIcEtmUUZjaUZ0PTp2bk9TVlMydjhBcWFBbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoUV9UY0ZIPTpPWjhfSXFBViAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSQ3BDIGllID0gOmFqIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6c2FPU0FTNXNvJywgJFhSaXQtPlJpQ3BGcExSciwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOjhBU09iSmFqJywgJFhSaXQtPlFGcENXWF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOmJBWk8nLCAkWFJpdC0+V0ZoQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOmpPbjVTYThKYTJiJywgJFhSaXQtPmVDdExwaVFYaUtXLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6YkFaT2pfSXFBVicsICRYUml0LT5XRmhDZV9mdENwLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6dm5PU1ZTMnY4QXFhQW4nLCAkWFJpdC0+ZnRDcEhwS2ZRRmNpRnQsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpPWjhfSXFBVicsICRYUml0LT5DaFFjS3JDQ19mSF9UY0ZILCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6YWonLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKICAgIC8vaWVUTE4gOTQtTi05bU54CiAgICBUZldMWGlLVyBDZWlYX0ZjaUZ0KCRHRmNmQykgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoImZRZUZYQyBmdENwX0hwS2ZRIHRDWCBmdENwSHBLZlFGY2lGdD06dm5PU1ZTMnY4QXFhQW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSQ3BDIGllID0gOmFqIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6dm5PU1ZTMnY4QXFhQW4nLCAkWFJpdC0+ZnRDcEhwS2ZRRmNpRnQsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzphaicsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgogICAgVGZXTFhpS1cgZUNjQ1hDX2Z0Q3BIcEtmUSgkR0ZjZkMpIHsKICAgICAgICAvLyRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJlQ2NDWEMgVHBLaCBmdENwX0hwS2ZRIGtSQ3BDIGllPSckR0ZjZkMnIik7CiAgICAgICAgLy9wQ1hmcFcgJFhSaXQtPktCbF9QZkNwcjsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJlQ2NDWEMgVHBLaCBmdENwX0hwS2ZRIGtSQ3BDIGllPSA6YWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgogICAgVGZXTFhpS1cgSENYdnRDcFZwS2ZRX0JyV0ZoQygkR0ZjZkMpIHsKICAgICAgICAvL0NMUksgIm5PcU81SiBpZSwgV0ZoQyBJUzJaIGZ0Q3BfSHBLZlEgVXNPU08gV0ZoQyA9ICckR0ZjZkMnIjsKCgogICAgICAgIC8qICBlaUM7ICovCgogICAgICAgIC8vICRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogKiBJUzJaIGZ0Q3BfSHBLZlEgVXNPU08gaWUgPSAnJEdGY2ZDJyIpOwogICAgICAgIC8vICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+S0JsX1BmQ3ByLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogaWUsIFdGaEMgSVMyWiBmdENwX0hwS2ZRIFVzT1NPIFdGaEMgPSA6YWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgovLyoqKioqKioqKioqKioqKioqKioqKioqLy8KLy8gICAgICBBdHRpSFcgWkNoQkNwdCBqWiAvLwovLyoqKioqKioqKioqKioqKioqKioqKioqLy8gCgogICAgVGZXTFhpS1cgdENYWkNoYWUoJEdGY2ZDKSB7CiAgICAgICAgaVQgKCRHRmNmQyA9PSAnJykgewogICAgICAgICAgICAkWFJpdC0+aENoX2llID0gJyc7CiAgICAgICAgfSBDY3RDIHsKICAgICAgICAgICAgJFhSaXQtPmhDaF9pZSA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgogICAgVGZXTFhpS1cgdENYamhhZSgkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKSB7CiAgICAgICAgICAgICRYUml0LT5RaF9pZSA9ICcnOwogICAgICAgIH0gQ2N0QyB7CiAgICAgICAgICAgICRYUml0LT5RaF9pZSA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgogICAgVGZXTFhpS1cgRmVlX0F0dGlIV19aQ2hfamgoKSB7CgogICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJpV3RDcFggaVdYSyBGdHRpSFdfaENoX1FoKAkJCQkJCQkJCQoKICAgICAgICAgIGhDaF9pZSwKICAgICAgICAgIFFoX2llKSBHRmNmQ3QoCiAgICAgICAgICAnJFhSaXQtPmhDaF9pZScsCiAgICAgICAgICAnJFhSaXQtPlFoX2llJykiKTsKCiAgICAgICAgICBwQ1hmcFcgJFhSaXQtPmVCLT5jRnRYYVd0Q3BYYWUoKTsgKi8KCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygiaVd0Q3BYIGlXWEsgRnR0aUhXX2hDaF9RaCgJCQkJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQ2hfaWUsCQkJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRaF9pZSkgR0ZjZkN0KAkJCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOlpPWl9hagkJCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjhaX2FqKSIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOlpPWl9haicsICRYUml0LT5oQ2hfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzo4Wl9haicsICRYUml0LT5RaF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgogICAgVGZXTFhpS1cgZUNjQ1hDX0F0dGlIV19aQ2hfamgoKSB7CiAgICAgICAgLy8kWFJpdC0+S0JsX1BmQ3ByID0gJFhSaXQtPmVCLT5QZkNwcigiak9xT0pPIElTMlogYEZ0dGlIV19oQ2hfUWhgIFVzT1NPIGBoQ2hfaWVgID0gJyRYUml0LT5oQ2hfaWUnIEFiaiBRaF9pZSA9ICckWFJpdC0+UWhfaWUnIik7CiAgICAgICAgLy9wQ1hmcFcgJFhSaXQtPktCbF9QZkNwcjsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJqT3FPSk8gSVMyWiBgRnR0aUhXX2hDaF9RaGAgVXNPU08gYGhDaF9pZWAgPSA6Wk9aX2FqIEFiaiBRaF9pZSA9IDo4Wl9haiIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOlpPWl9haiIsICRYUml0LT5oQ2hfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjo4Wl9haiIsICRYUml0LT5RaF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vCi8vIEF0dGlIVyBaQ2hCQ3B0IEoyIGpPQXEgUzIyWiAgLy8KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyAKCgogICAgVGZXTFhpS1cgdENYOHBLbENMWGFlKCRHRmNmQykgewogICAgICAgIGlUICgkR0ZjZkMgPT0gJycpIHsKICAgICAgICAgICAgJFhSaXQtPlFwS2xDTFhfaWUgPSAnJzsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+UXBLbENMWF9pZSA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgogICAgVGZXTFhpS1cgdENYQXR0aUhXQ2V6cigkR0ZjZkMpIHsKICAgICAgICBpVCAoJEdGY2ZDID09ICcnKSB7CiAgICAgICAgICAgICRYUml0LT5GdHRpSFdDZV9CciA9ICcnOwogICAgICAgIH0gQ2N0QyB7CiAgICAgICAgICAgICRYUml0LT5GdHRpSFdDZV9CciA9ICRHRmNmQzsKICAgICAgICB9CiAgICAgICAgcENYZnBXIFhwZkM7CiAgICB9CgogICAgVGZXTFhpS1cgeUNwaVRyX0F0dGlIV19aQ2hfOHBLbENMWCgpIHsKICAgICAgICAvLyRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogaWUgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBVc09TTyBoQ2hfaWUgPSAnJFhSaXQtPmhDaF9pZScgQWJqIFFwS2xDTFhfaWUgPSAnJFhSaXQtPlFwS2xDTFhfaWUnIik7CiAgICAgICAgLy8kWFJpdC0+cENYZnBXID0gJFhSaXQtPktCbF9QZkNwci0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgLy9wQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogaWUgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBVc09TTyBoQ2hfaWUgPSA6WmFqIEFiaiBRcEtsQ0xYX2llID0gOjhhaiIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOjhhaicsICRYUml0LT5RcEtsQ0xYX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6WmFqJywgJFhSaXQtPmhDaF9pZSwgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgRmVlX0F0dGlIV19aQ2hfOHBLbENMWCgpIHsKLy8gICAgICAgIENMUksgImlXdENwWCBpV1hLIEZ0dGlIV19oQ2hfUXBLbENMWChoQ2hfaWUsIHBLY0MsIFFwS2xDTFhfaWUsIEZ0dGlIV0NlX0JyKSBHRmNmQ3QoJyRYUml0LT5oQ2hfaWUnLCAnJFhSaXQtPnBLY0MnLCAnJFhSaXQtPlFwS2xDTFhfaWUnLCAnJFhSaXQtPkZ0dGlIV0NlX0JyJykiOwoKICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByID0gJFhSaXQtPmVCLT5QZkNwcigiaVd0Q3BYIGlXWEsgRnR0aUhXX2hDaF9RcEtsQ0xYKGhDaF9pZSwgcEtjQywgUXBLbENMWF9pZSwgRnR0aUhXQ2VfQnIpIEdGY2ZDdCgnJFhSaXQtPmhDaF9pZScsICckWFJpdC0+cEtjQycsICckWFJpdC0+UXBLbENMWF9pZScsICckWFJpdC0+RnR0aUhXQ2VfQnInKSIpOwoKCiAgICAgICAgICBwQ1hmcFcgJFhSaXQtPmVCLT5jRnRYYVd0Q3BYYWUoKTsgKi8KCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygiaVd0Q3BYIGlXWEsgRnR0aUhXX2hDaF9RcEtsQ0xYKGhDaF9pZSwgcEtjQywgUXBLbENMWF9pZSwgRnR0aUhXQ2VfQnIpIEdGY2ZDdCg6Wk9aX2FqLCA6UzJxTywgOjhTMkVPNUpfYWosIDpBbm5hVmJPal96bykiKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6Wk9aX2FqJywgJFhSaXQtPmhDaF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOlMycU8nLCAkWFJpdC0+cEtjQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOjhTMkVPNUpfYWonLCAkWFJpdC0+UXBLbENMWF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOkFubmFWYk9qX3pvJywgJFhSaXQtPkZ0dGlIV0NlX0JyLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPmVCLT5jRnRYYVd0Q3BYYWUoKTsKICAgIH0KCiAgICBUZldMWGlLVyBlQ2NDWENfQXR0aUhXX1pDaF84cEtsQ0xYKCkgewogICAgICAgIC8vICRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJqT3FPSk8gSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBVc09TTyBgaENoX2llYCA9ICckWFJpdC0+aENoX2llJyBBYmogUXBLbENMWF9pZSA9ICckWFJpdC0+UXBLbENMWF9pZSciKTsKICAgICAgICAvL3BDWGZwVyAkWFJpdC0+S0JsX1BmQ3ByOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoImpPcU9KTyBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIFVzT1NPIGBoQ2hfaWVgID0gOlpPWl9haiBBYmogUXBLbENMWF9pZSA9IDo4YWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpaT1pfYWoiLCAkWFJpdC0+aENoX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6OGFqIiwgJFhSaXQtPlFwS2xDTFhfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKICAgIFRmV0xYaUtXIGVDY0NYQ19BdHRpSFdfWkNoXzhwS2xDTFhfenI4YWooJEdGY2ZDKSB7CiAgICAgICAgLy8kWFJpdC0+S0JsX1BmQ3ByID0gJFhSaXQtPmVCLT5QZkNwcigiak9xT0pPIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAgVXNPU08gUXBLbENMWF9pZSA9ICckR0ZjZkMnIik7CiAgICAgICAgLy9wQ1hmcFcgJFhSaXQtPktCbF9QZkNwcjsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJqT3FPSk8gSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBVc09TTyBRcEtsQ0xYX2llID0gOjhhaiIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOjhhaiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgogICAgLyogVGZXTFhpS1cgSENYakNGY1pDaF92V0F0dGlIV0NlX3pyVnBLZlEoJEhpZSwgJFFpZSl7CSAgCgogICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIEZoLmhDaF9pZSwgZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQyBJUzJaIGBGdHRpSFdfaENoX1FoYCBBbiBGaAogICAgICBFMmFiIGNLSGlXX2hGdFggQW4gYyAyYiBGaC5oQ2hfaWUgPSBjLmZ0Q3BfaWUKICAgICAgRTJhYiBmdENwIEFuIGYgMmIgZi5pZSA9IGMuZnRDcF9pZQogICAgICBFMmFiIGZ0Q3BfSHBLZlEgQW4gSCAyYiAoSWFial9hYl9uT0ooSC5pZSwgYy5wS2NDKSA+IG0gMlMgSWFial9hYl9uT0ooSC5pZSwgYy5GY1hfcEtjQykgPiBtKQogICAgICBVc09TTyBjLnBLY0MgIT0gJzknIEFiaiBjLnBLY0MgIT0gJ04nCiAgICAgIEFiaiBjLmZ0Q3BfdFhGWGZ0ID0gJ04nCiAgICAgIEFiaiBILmllID0gJyRIaWUnCiAgICAgIEFiaiBGaC5oQ2hfaWUgYjJKIGFiIChuT3FPNUogaENoX2llIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIFVzT1NPIFFwS2xDTFhfaWUgPSAnJFFpZScpCiAgICAgIFZTMnY4IHpvIGMuZnRDcF9pZQogICAgICAyU2pPUyB6byBmLlRXRmhDIEFuNSIpOwogICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgICB9ICovCgogICAgVGZXTFhpS1cgSENYakNGY1pDaF92V0F0dGlIV0NlX3pyVnBLZlEoJEhpZSwgJFFpZSkgewoKICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIGYuaWUsIGYuVFdGaEMsIGYuaFdGaEMsIGYuY1dGaEMgSVMyWiBmdENwIEFuIGYKCiAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggQW4gYyAyYiBmLmllID0gYy5mdENwX2llCiAgICAgICAgICBFMmFiIGZ0Q3BfSHBLZlEgQW4gSCAyYiAoSWFial9hYl9uT0ooSC5pZSwgYy5wS2NDKSA+IG0gMlMgSWFial9hYl9uT0ooSC5pZSwgYy5GY1hfcEtjQykgPiBtKQogICAgICAgICAgVXNPU08gYy5wS2NDICE9ICc5JyBBYmogYy5wS2NDICE9ICdOJyBBYmogYy5mdENwX3RYRlhmdCA9ICdOJyBBYmogSC5pZSA9ICckSGllJwogICAgICAgICAgQWJqIGYuaWUgYjJKIGFiIChuT3FPNUogaENoX2llIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIFVzT1NPIFFwS2xDTFhfaWUgPSAnJFFpZScpCiAgICAgICAgICBWUzJ2OCB6byBjLmZ0Q3BfaWUgMlNqT1Mgem8gZi5UV0ZoQyBBbjUiKTsKICAgICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOyAqLwoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQyBJUzJaIGZ0Q3AgQW4gZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCBBbiBjIDJiIGYuaWUgPSBjLmZ0Q3BfaWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMmFiIGZ0Q3BfSHBLZlEgQW4gSCAyYiAoSWFial9hYl9uT0ooSC5pZSwgYy5wS2NDKSA+IG0gMlMgSWFial9hYl9uT0ooSC5pZSwgYy5GY1hfcEtjQykgPiBtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNPU08gYy5wS2NDICE9ICc5JyBBYmogYy5wS2NDICE9ICdOJyBBYmogYy5lQ2NDWENfVGNGSCA9ICdtJyBBYmogYy5mdENwX3RYRlhmdCA9ICdOJyBBYmogSC5pZSA9IDpWYWogICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYmogZi5pZSBiMkogYWIgKG5PcU81SiBoQ2hfaWUgSVMyWiBGdHRpSFdfaENoX1FwS2xDTFggVXNPU08gUXBLbENMWF9pZSA9IDo4YWopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUzJ2OCB6byBjLmZ0Q3BfaWUgMlNqT1Mgem8gZi5UV0ZoQyBBbjUiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKEZwcEZyKCc6VmFqJyA9PiAkSGllLCAnOjhhaicgPT4gJFFpZSkpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWFplX2hDaF92V0Z0dGlIV0NlKCRRaF9pZSwgJFFfaWUpIHsKCiAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBGdHRpSFdfaENoX1FoLmhDaF9pZSwgZnRDcC5pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQyBJUzJaIGBGdHRpSFdfaENoX1FoYAoKICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBGdHRpSFdfaENoX1FoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgIFVzT1NPIGBRaF9pZWAgPSAnJFFoX2llJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJwogICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicKICAgICAgICAgIEFiaiBoQ2hfaWUgYjJKIGFiIChuT3FPNUogaENoX2llIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIFVzT1NPIFFwS2xDTFhfaWUgPSAnJFFfaWUnKQogICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7ICovCgogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBGdHRpSFdfaENoX1FoLmhDaF9pZSwgZnRDcC5pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQyBJUzJaIGBGdHRpSFdfaENoX1FoYAogICAgICAgICAgICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgRnR0aUhXX2hDaF9RaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAgICAgICAgICAgVXNPU08gYFFoX2llYCA9IDo4Wl9haiBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JyBBYmogY0tIaVdfaEZ0WC5lQ2NDWENfVGNGSCA9ICdtJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJwogICAgICAgICAgICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyAKICAgICAgICAgICAgICAgICAgICAgICAgQWJqIGhDaF9pZSBiMkogYWIgKG5PcU81SiBoQ2hfaWUgSVMyWiBGdHRpSFdfaENoX1FwS2xDTFggVXNPU08gUXBLbENMWF9pZSA9IDo4X2FqKQogICAgICAgICAgICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKEZwcEZyKCc6OF9haicgPT4gJFFfaWUpKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1haZV9oQ2hfQXR0aUhXQ2UoJFFfaWUpIHsKCiAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwck4gPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogUWhDaC5RcEtsQ0xYX2llLCBRaENoLnBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBBbiBRaENoCgogICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICBFMmFiIGZ0Q3AgMmIgZnRDcC5pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgVXNPU08gUWhDaC5RcEtsQ0xYX2llID0gJyRRX2llJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicKICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUk4tPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOyAqLwoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogUWhDaC5RcEtsQ0xYX2llLCBRaENoLnBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBBbiBRaENoCiAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIFVzT1NPIFFoQ2guUXBLbENMWF9pZSA9IDo4X2FqIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJzknCiAgICAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicKICAgICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoRnBwRnIoJzo4X2FqJyA9PiAkUV9pZSkpOwogICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKCgogICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHI5ID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIFFwS2xDTFguaWUgRnQgUXBLbENMWF9pZSwgOSBGdCBwS2NDLCBmdENwLmllLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDIElTMlogYGZ0Q3BgCgogICAgICAgICAgRTJhYiBRcEtsQ0xYIDJiIGZ0Q3AuaWUgPSBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcAogICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFwS2xDTFguUXBLbENMWF9oRldGSENwICA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgVXNPU08gUXBLbENMWC5pZSA9ICckUV9pZScKICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nCiAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgJFhSaXQtPnBDWGZwVzkgPSAkWFJpdC0+dFhSOS0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7ICovCgogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBRcEtsQ0xYLmllIEZ0IFFwS2xDTFhfaWUsIDkgRnQgcEtjQywgZnRDcC5pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQyBJUzJaIGBmdENwYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMmFiIFFwS2xDTFggMmIgZnRDcC5pZSA9IFFwS2xDTFguUXBLbENMWF9oRldGSENwIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcCAgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNPU08gUXBLbENMWC5pZSA9IDo4YWoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKEZwcEZyKCc6OGFqJyA9PiAkUV9pZSkpOwogICAgICAgICRYUml0LT5wQ1hmcFc5ID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKCiAgICAgICAgcENYZnBXIEZwcEZyX2hDcEhDKCRYUml0LT5wQ1hmcFdOLCAkWFJpdC0+cENYZnBXOSk7CiAgICB9CgogICAgVGZXTFhpS1cgSENYWmVfaENoX0F0dGlIV0NlVWlYUjJmWGpaKCRRX2llKSB7CgogICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHJOID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIEZ0dGlIV19oQ2hfUXBLbENMWC5RcEtsQ0xYX2llLCBmdENwLmllLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAKCiAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgRnR0aUhXX2hDaF9RcEtsQ0xYLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgIFVzT1NPIEZ0dGlIV19oQ2hfUXBLbENMWC5RcEtsQ0xYX2llID0gJyRRX2llJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicKICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUk4tPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFdOOyAqLwoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogRnR0aUhXX2hDaF9RcEtsQ0xYLlFwS2xDTFhfaWUsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYAogICAgICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBGdHRpSFdfaENoX1FwS2xDTFguaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIFVzT1NPIEZ0dGlIV19oQ2hfUXBLbENMWC5RcEtsQ0xYX2llID0gOjhhaiBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nCiAgICAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKEZwcEZyKCc6OGFqJyA9PiAkUV9pZSkpOwogICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwV047CiAgICB9CgogICAgVGZXTFhpS1cgSENYWmVfaENoX0F0dGlIV0NlX0FjYygkUV9pZSkgewoKICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByTiA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBRaENoLlFwS2xDTFhfaWUsIFFoQ2gucEtjQywgZnRDcC5pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQywgZnRDcC5DaEZpYywgZnRDcC5oS0JfV0ssIGZ0Q3AuTHBDRlhDZV9CciBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIEZ0IFFoQ2gKCiAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUWhDaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSAnJFFfaWUnIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJ04nIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJzknCiAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJwogICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgJFhSaXQtPnBDWGZwV04gPSAkWFJpdC0+dFhSTi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7ICovCgoKICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByOSA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiAqIElTMlogYGZ0Q3BgCgogICAgICAgICAgRTJhYiBRcEtsQ0xYIDJiIGZ0Q3AuaWUgPSBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcAogICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFwS2xDTFguUXBLbENMWF9oRldGSENwICA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgVXNPU08gUXBLbENMWC5pZSA9ICckUV9pZScKICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nCiAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOyAqLwogICAgICAgIC8vJFhSaXQtPnBDWGZwVzkgPSAkWFJpdC0+S0JsX1BmQ3ByOS0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgLy9wQ1hmcFcgRnBwRnJfaENwSEMoJFhSaXQtPnBDWGZwV04sICRYUml0LT5wQ1hmcFc5KTsKICAgICAgICAvL3BDWGZwVyAkWFJpdC0+cENYZnBXTjsKCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIFFoQ2guUXBLbENMWF9pZSwgUWhDaC5wS2NDLCBmdENwLmllLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDLCBmdENwLkNoRmljLCBmdENwLmhLQl9XSywgZnRDcC5McENGWENlX0JyLGNLSGlXX2hGdFguZnRDcFdGaEMgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBGdCBRaENoCiAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIFVzT1NPIFFoQ2guUXBLbENMWF9pZSA9IDo4YWogQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogY0tIaVdfaEZ0WC5lQ2NDWENfVGNGSCA9ICdtJwogICAgICAgICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOjhhaicgPT4gJFFfaWUpKTsKICAgICAgICAkWFJpdC0+cENYZnBXTiA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFdOOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWF9lQ1RGZmNYX0Z0dGlIVygkRjVLY2ZoV3QsICRHRmMsICR0MnBlQ3AsICR0cWloaVgpIHsKICAgICAgICAkRjVLY2ZoV3RfcEMgPSB0WHBfcENRY0ZMQygiICwgIiwgIiAiLCBpaFFjS2VDKCIsICIsICRGNUtjZmhXdCkpOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBuMHFfNUFxNV9JMnZial9TMlVuICIgLiAkRjVLY2ZoV3RfcEMgLiAiIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIEZ0IFFoQ2ggCiAgICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUWhDaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBFMmFiIGZ0Q3AgMmIgZnRDcC5pZSA9IGNLSGlXX2hGdFguZnRDcF9pZSBVc09TTyAkR0ZjIAogICAgICAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgQWJqIGNLSGlXX2hGdFguZUNjQ1hDX1RjRkggPSAnbScKICAgICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUgIAogICAgICAgICAgICAgICAgICR0MnBlQ3AgJHRxaWhpWCIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKLy9DTFJLICJuT3FPNUogbjBxXzVBcTVfSTJ2YmpfUzJVbiAiIC4gJEY1S2NmaFd0X3BDIC4gIiBJUzJaIEZ0dGlIV19oQ2hfUXBLbENMWCBGdCBRaENoIAovLyAgICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUWhDaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLy8gICAgICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llIFVzT1NPICRHRmMgCi8vICAgICAgICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nCi8vICAgICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUgIAovLyAgICAgICAgICAgICAgICAgJHQycGVDcCAkdHFpaGlYIjsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgSENYX2VDVEZmY1hfRnR0aUhXX2Z0Q3BfaWUoJEdGYykgewoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZnRDcC5pZSBJUzJaIEZ0dGlIV19oQ2hfUXBLbENMWCBGdCBRaENoIAogICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgVXNPU08gJEdGYyAKICAgICAgICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nCiAgICAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwoKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgSENYakNGY19aQ2hfQXR0aUhXQ2VfMnBIKCRRaWUsICRIZkN0WF9pZSwgJHBLY0MpIHsKICAgICAgICBpVCAoJHBLY0MgPT0gTiB8fCAkcEtjQyA9PSA5KSB7CgogICAgICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByTiA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBRaENoLlFwS2xDTFhfaWUsIFFoQ2gucEtjQywgZnRDcC5pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQyBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIEFuIFFoQ2gKCiAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSAnJFFpZScgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJwogICAgICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7ICovCiAgICAgICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBRaENoLlFwS2xDTFhfaWUsIFFoQ2gucEtjQywgZnRDcC5pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQyBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIEFuIFFoQ2gKICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUWhDaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBFMmFiIGZ0Q3AgMmIgZnRDcC5pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIFVzT1NPIFFoQ2guUXBLbENMWF9pZSA9IDo4YWogQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogY0tIaVdfaEZ0WC5lQ2NDWENfVGNGSCA9ICdtJwogICAgICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7CiAgICAgICAgICAgIC8vJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOmZ0Q3BXRmhDJyA9PiAkWFJpdC0+ZnRDcFdGaEMpKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6OGFqIiwgJFFpZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKCgoKICAgICAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwcjkgPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogUXBLbENMWC5pZSBGdCBRcEtsQ0xYX2llLCA5IEZ0IHBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgZnRDcGAKCiAgICAgICAgICAgICAgRTJhYiBRcEtsQ0xYIDJiIGZ0Q3AuaWUgPSBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcAogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcCAgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBVc09TTyBRcEtsQ0xYLmllID0gJyRRaWUnCiAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOyAqLwogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogUXBLbENMWC5pZSBGdCBRcEtsQ0xYX2llLCA5IEZ0IHBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgZnRDcGAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgUXBLbENMWCAyYiBmdENwLmllID0gUXBLbENMWC5RcEtsQ0xYX2hGV0ZIQ3AgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUXBLbENMWC5RcEtsQ0xYX2hGV0ZIQ3AgID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc09TTyBRcEtsQ0xYLmllID0gOjhhagogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6OGFqIiwgJFFpZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFc5ID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICB9IENjdEMgewoKICAgICAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwck4gPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogUWhDaC5RcEtsQ0xYX2llLCBRaENoLnBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBBbiBRaENoCgogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRaENoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBIZkN0WHQgQXQgSCAyYiBJYWJqX2FiX25PSihmdENwLmllLCBILmZ0Q3B0KSA+IG0KICAgICAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSAnJFFpZScgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogSC5pZSA9ICckSGZDdFhfaWUnCiAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgICAkWFJpdC0+cENYZnBXTiA9ICRYUml0LT50WFJOLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsgKi8KICAgICAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIFFoQ2guUXBLbENMWF9pZSwgUWhDaC5wS2NDLCBmdENwLmllLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAgQW4gUWhDaAogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRaENoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBIZkN0WHQgQXQgSCAyYiBJYWJqX2FiX25PSihmdENwLmllLCBILmZ0Q3B0KSA+IG0KICAgICAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSA6OGFqIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJ04nIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJzknCiAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgQWJqIGNLSGlXX2hGdFguZUNjQ1hDX1RjRkggPSAnbScgQWJqIEguaWUgPSBWYWoKICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjo4YWoiLCAkUWllLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOlZhaiIsICRIZkN0WF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKCgogICAgICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByOSA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBRcEtsQ0xYLmllIEZ0IFFwS2xDTFhfaWUsIDkgRnQgcEtjQywgZnRDcC5pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQyBJUzJaIGBmdENwYAoKICAgICAgICAgICAgICBFMmFiIFFwS2xDTFggMmIgZnRDcC5pZSA9IFFwS2xDTFguUXBLbENMWF9oRldGSENwCiAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFwS2xDTFguUXBLbENMWF9oRldGSENwICA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgSGZDdFh0IEF0IEggMmIgSWFial9hYl9uT0ooZnRDcC5pZSwgSC5mdENwdCkgPiBtCiAgICAgICAgICAgICAgVXNPU08gUXBLbENMWC5pZSA9ICckUWllJwogICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBILmllID0gJyRIZkN0WF9pZScKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOyAqLwogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogUXBLbENMWC5pZSBGdCBRcEtsQ0xYX2llLCA5IEZ0IHBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgZnRDcGAKICAgICAgICAgICAgICBFMmFiIFFwS2xDTFggMmIgZnRDcC5pZSA9IFFwS2xDTFguUXBLbENMWF9oRldGSENwCiAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFwS2xDTFguUXBLbENMWF9oRldGSENwICA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgSGZDdFh0IEF0IEggMmIgSWFial9hYl9uT0ooZnRDcC5pZSwgSC5mdENwdCkgPiBtCiAgICAgICAgICAgICAgVXNPU08gUXBLbENMWC5pZSA9IDo4YWoKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogY0tIaVdfaEZ0WC5lQ2NDWENfVGNGSCA9ICdtJyBBYmogSC5pZSA9IDpWYWoKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjo4YWoiLCAkUWllLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOlZhaiIsICRIZkN0WF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFc5ID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICB9CgogICAgICAgIHBDWGZwVyBGcHBGcl9oQ3BIQygkWFJpdC0+cENYZnBXTiwgJFhSaXQtPnBDWGZwVzkpOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWGpDRmNfWkNoX0F0dGlIV0NlXzJwSF9BY2MoJFFpZSwgJEhmQ3RYX2llLCAkcEtjQykgewogICAgICAgIGlUICgkcEtjQyA9PSBOIHx8ICRwS2NDID09IDkpIHsKCiAgICAgICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHJOID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIFFoQ2guUXBLbENMWF9pZSwgUWhDaC5wS2NDLCBmdENwLmllLCBmdENwLktwSF9pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQywgZnRDcC5DaEZpYywgZnRDcC5oS0JfV0ssIGZ0Q3AuTHBDRlhDZV9CciBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIEZ0IFFoQ2gKCiAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSAnJFFpZScgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJwogICAgICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7CgogICAgICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUk4tPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOyAqLwogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogUWhDaC5RcEtsQ0xYX2llLCBRaENoLnBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuS3BIX2llLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDLCBmdENwLkNoRmljLCBmdENwLmhLQl9XSywgZnRDcC5McENGWENlX0JyIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAgRnQgUWhDaAogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRaENoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgVXNPU08gUWhDaC5RcEtsQ0xYX2llID0gOjhhaiBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nCiAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6OGFqIiwgJFFpZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKCgogICAgICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByOSA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBRcEtsQ0xYLmllIEZ0IFFwS2xDTFhfaWUsIDkgRnQgcEtjQywgZnRDcC5pZSwgZnRDcC5LcEhfaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMsIGZ0Q3AuQ2hGaWMsIGZ0Q3AuaEtCX1dLLCBmdENwLkxwQ0ZYQ2VfQnIgSVMyWiBgZnRDcGAKCiAgICAgICAgICAgICAgRTJhYiBRcEtsQ0xYIDJiIGZ0Q3AuaWUgPSBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcAogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcCAgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBVc09TTyBRcEtsQ0xYLmllID0gJyRRaWUnCiAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgICAgICRYUml0LT5wQ1hmcFc5ID0gJFhSaXQtPnRYUjktPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOyAqLwogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogUXBLbENMWC5pZSBGdCBRcEtsQ0xYX2llLCA5IEZ0IHBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuS3BIX2llLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDLCBmdENwLkNoRmljLCBmdENwLmhLQl9XSywgZnRDcC5McENGWENlX0JyIElTMlogYGZ0Q3BgCiAgICAgICAgICAgICAgRTJhYiBRcEtsQ0xYIDJiIGZ0Q3AuaWUgPSBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcAogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcCAgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBVc09TTyBRcEtsQ0xYLmllID0gOjhhagogICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6OGFqIiwgJFFpZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFc5ID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICB9IENjdEMgewoKICAgICAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwck4gPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogUWhDaC5RcEtsQ0xYX2llLCBRaENoLnBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuS3BIX2llLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDLCBmdENwLkNoRmljLCBmdENwLmhLQl9XSywgZnRDcC5McENGWENlX0JyIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAgQW4gUWhDaAoKICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUWhDaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBFMmFiIGZ0Q3AgMmIgZnRDcC5pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgSGZDdFh0IEF0IEggMmIgSWFial9hYl9uT0ooZnRDcC5pZSwgSC5mdENwdCkgPiBtCiAgICAgICAgICAgICAgVXNPU08gUWhDaC5RcEtsQ0xYX2llID0gJyRRaWUnIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJ04nIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJzknCiAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgQWJqIEguaWUgPSAnJEhmQ3RYX2llJwogICAgICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7CiAgICAgICAgICAgICAgJFhSaXQtPnBDWGZwV04gPSAkWFJpdC0+dFhSTi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7ICovCiAgICAgICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBRaENoLlFwS2xDTFhfaWUsIFFoQ2gucEtjQywgZnRDcC5pZSwgZnRDcC5LcEhfaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMsIGZ0Q3AuQ2hGaWMsIGZ0Q3AuaEtCX1dLLCBmdENwLkxwQ0ZYQ2VfQnIgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBBbiBRaENoCiAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBFMmFiIEhmQ3RYdCBBdCBIIDJiIElhYmpfYWJfbk9KKGZ0Q3AuaWUsIEguZnRDcHQpID4gbQogICAgICAgICAgICAgIFVzT1NPIFFoQ2guUXBLbENMWF9pZSA9IDo4YWogQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyAgQWJqIGNLSGlXX2hGdFguZUNjQ1hDX1RjRkggPSAnbScgQWJqIEguaWUgPSA6VmFqCiAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6OGFqIiwgJFFpZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpWYWoiLCAkSGZDdFhfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICAgICAkWFJpdC0+cENYZnBXTiA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CgoKICAgICAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwcjkgPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogUXBLbENMWC5pZSBGdCBRcEtsQ0xYX2llLCA5IEZ0IHBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuS3BIX2llLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDLCBmdENwLkNoRmljLCBmdENwLmhLQl9XSywgZnRDcC5McENGWENlX0JyIElTMlogYGZ0Q3BgCgogICAgICAgICAgICAgIEUyYWIgUXBLbENMWCAyYiBmdENwLmllID0gUXBLbENMWC5RcEtsQ0xYX2hGV0ZIQ3AKICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUXBLbENMWC5RcEtsQ0xYX2hGV0ZIQ3AgID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBIZkN0WHQgQXQgSCAyYiBJYWJqX2FiX25PSihmdENwLmllLCBILmZ0Q3B0KSA+IG0KICAgICAgICAgICAgICBVc09TTyBRcEtsQ0xYLmllID0gJyRRaWUnCiAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgQWJqIEguaWUgPSAnJEhmQ3RYX2llJwogICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7CiAgICAgICAgICAgICAgJFhSaXQtPnBDWGZwVzkgPSAkWFJpdC0+dFhSOS0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7ICovCiAgICAgICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBRcEtsQ0xYLmllIEZ0IFFwS2xDTFhfaWUsIDkgRnQgcEtjQywgZnRDcC5pZSwgZnRDcC5LcEhfaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMsIGZ0Q3AuQ2hGaWMsIGZ0Q3AuaEtCX1dLLCBmdENwLkxwQ0ZYQ2VfQnIgSVMyWiBgZnRDcGAKICAgICAgICAgICAgICBFMmFiIFFwS2xDTFggMmIgZnRDcC5pZSA9IFFwS2xDTFguUXBLbENMWF9oRldGSENwCiAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFwS2xDTFguUXBLbENMWF9oRldGSENwICA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgSGZDdFh0IEF0IEggMmIgSWFial9hYl9uT0ooZnRDcC5pZSwgSC5mdENwdCkgPiBtCiAgICAgICAgICAgICAgVXNPU08gUXBLbENMWC5pZSA9IDo4YWoKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyAgQWJqIGNLSGlXX2hGdFguZUNjQ1hDX1RjRkggPSAnbScgQWJqIEguaWUgPSA6VmFqCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6OGFqIiwgJFFpZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpWYWoiLCAkSGZDdFhfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICAgICAkWFJpdC0+cENYZnBXOSA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgfQoKICAgICAgICBwQ1hmcFcgRnBwRnJfaENwSEMoJFhSaXQtPnBDWGZwV04sICRYUml0LT5wQ1hmcFc5KTsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1hqQ0ZjX1pDaF9BdHRpSFdDZV9WcEtmUV8ycEgoJFFpZSwgJEhmQ3RYX2llLCAkcEtjQykgewogICAgICAgIGlUICgkcEtjQyA9PSBOIHx8ICRwS2NDID09IDkpIHsKCiAgICAgICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHJOID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIGphbkphYjVKKGZ0Q3AuS3BIX2llKSBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIEZ0IFFoQ2gKCiAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSAnJFFpZScgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogZnRDcC5LcEhfaWUgIT0gJycKICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwoKICAgICAgICAgICAgICAkWFJpdC0+cENYZnBXTiA9ICRYUml0LT50WFJOLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsgKi8KICAgICAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGphbkphYjVKKGZ0Q3AuS3BIX2llKSBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIEZ0IFFoQ2gKICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUWhDaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBFMmFiIGZ0Q3AgMmIgZnRDcC5pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIFVzT1NPIFFoQ2guUXBLbENMWF9pZSA9IDo4YWogQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogY0tIaVdfaEZ0WC5lQ2NDWENfVGNGSCA9ICdtJyBBYmogZnRDcC5LcEhfaWUgIT0gJycKICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjo4YWoiLCAkUWllLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAgICAgJFhSaXQtPnBDWGZwV04gPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwoKCiAgICAgICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHI5ID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIGphbkphYjVKKGZ0Q3AuS3BIX2llKSBJUzJaIGBmdENwYAoKICAgICAgICAgICAgICBFMmFiIFFwS2xDTFggMmIgZnRDcC5pZSA9IFFwS2xDTFguUXBLbENMWF9oRldGSENwCiAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFwS2xDTFguUXBLbENMWF9oRldGSENwICA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIFVzT1NPIFFwS2xDTFguaWUgPSAnJFFpZScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogZnRDcC5LcEhfaWUgIT0gJycKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgICAgICRYUml0LT5wQ1hmcFc5ID0gJFhSaXQtPnRYUjktPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOyAqLwogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogamFuSmFiNUooZnRDcC5LcEhfaWUpIElTMlogYGZ0Q3BgCiAgICAgICAgICAgICAgRTJhYiBRcEtsQ0xYIDJiIGZ0Q3AuaWUgPSBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcAogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcCAgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBVc09TTyBRcEtsQ0xYLmllID0gOjhhagogICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nIEFiaiBmdENwLktwSF9pZSAhPSAnJwogICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7CiAgICAgICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOjhhaiIsICRRaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICAgICAkWFJpdC0+cENYZnBXOSA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgfSBDY3RDIHsKCiAgICAgICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHJOID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIGphbkphYjVKKGZ0Q3AuS3BIX2llKSBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIEFuIFFoQ2gKCiAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBFMmFiIEhmQ3RYdCBBdCBIIDJiIElhYmpfYWJfbk9KKGZ0Q3AuaWUsIEguZnRDcHQpID4gbQogICAgICAgICAgICAgIFVzT1NPIFFoQ2guUXBLbENMWF9pZSA9ICckUWllJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBILmllID0gJyRIZkN0WF9pZScgQWJqIGZ0Q3AuS3BIX2llICE9ICcnCiAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgICAkWFJpdC0+cENYZnBXTiA9ICRYUml0LT50WFJOLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsgKi8KICAgICAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGphbkphYjVKKGZ0Q3AuS3BIX2llKSBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIEFuIFFoQ2gKICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUWhDaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBFMmFiIGZ0Q3AgMmIgZnRDcC5pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgSGZDdFh0IEF0IEggMmIgSWFial9hYl9uT0ooZnRDcC5pZSwgSC5mdENwdCkgPiBtCiAgICAgICAgICAgICAgVXNPU08gUWhDaC5RcEtsQ0xYX2llID0gOjhhaiBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nIEFiaiBILmllID0gOlZhaiBBYmogZnRDcC5LcEhfaWUgIT0gJycKICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjo4YWoiLCAkUWllLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOlZhaiIsICRIZkN0WF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKCgogICAgICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByOSA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBqYW5KYWI1SihmdENwLktwSF9pZSkgSVMyWiBgZnRDcGAKCiAgICAgICAgICAgICAgRTJhYiBRcEtsQ0xYIDJiIGZ0Q3AuaWUgPSBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcAogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcCAgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBFMmFiIEhmQ3RYdCBBdCBIIDJiIElhYmpfYWJfbk9KKGZ0Q3AuaWUsIEguZnRDcHQpID4gbQogICAgICAgICAgICAgIFVzT1NPIFFwS2xDTFguaWUgPSAnJFFpZScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogSC5pZSA9ICckSGZDdFhfaWUnICBBYmogZnRDcC5LcEhfaWUgIT0gJycKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgICAgICRYUml0LT5wQ1hmcFc5ID0gJFhSaXQtPnRYUjktPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOyAqLwogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogamFuSmFiNUooZnRDcC5LcEhfaWUpIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAgQW4gUWhDaAogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRaENoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBIZkN0WHQgQXQgSCAyYiBJYWJqX2FiX25PSihmdENwLmllLCBILmZ0Q3B0KSA+IG0KICAgICAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSA6OGFqIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJ04nIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJzknCiAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgQWJqIGNLSGlXX2hGdFguZUNjQ1hDX1RjRkggPSAnbScgQWJqIEguaWUgPSA6VmFqIEFiaiBmdENwLktwSF9pZSAhPSAnJwogICAgICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7CiAgICAgICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOjhhaiIsICRRaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6VmFqIiwgJEhmQ3RYX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAgICAgJFhSaXQtPnBDWGZwVzkgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIH0KCiAgICAgICAgcENYZnBXIEZwcEZyX2hDcEhDKCRYUml0LT5wQ1hmcFdOLCAkWFJpdC0+cENYZnBXOSk7CiAgICB9CgogICAgVGZXTFhpS1cgSENYakNGY19aQ2hfQXR0aUhXQ2VfSWljWENwKCRRaWUsICRIZkN0WF9pZSwgJHBLY0MsICRUaWNYQ3BfaWUpIHsKICAgICAgICBpVCAoJHBLY0MgPT0gTiB8fCAkcEtjQyA9PSA5KSB7CgoKICAgICAgICAgICAgLyogICRYUml0LT5LQmxfUGZDcHJOID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIFFoQ2guUXBLbENMWF9pZSwgUWhDaC5wS2NDLCBmdENwLmllLCBmdENwLktwSF9pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQywgZnRDcC5DaEZpYywgZnRDcC5oS0JfV0ssIGZ0Q3AuTHBDRlhDZV9CciBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIEZ0IFFoQ2gKCiAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBFMmFiIEhmQ3RYdCBBdCBIIDJiIElhYmpfYWJfbk9KKGZ0Q3AuaWUsIEguZnRDcHQpID4gbQogICAgICAgICAgICAgIFVzT1NPIFFoQ2guUXBLbENMWF9pZSA9ICckUWllJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nCiAgICAgICAgICAgICAgQWJqIEguaWUgPSAnJFRpY1hDcF9pZScKICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwoKICAgICAgICAgICAgICAkWFJpdC0+cENYZnBXTiA9ICRYUml0LT50WFJOLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsgKi8KICAgICAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIFFoQ2guUXBLbENMWF9pZSwgUWhDaC5wS2NDLCBmdENwLmllLCBmdENwLktwSF9pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQywgZnRDcC5DaEZpYywgZnRDcC5oS0JfV0ssIGZ0Q3AuTHBDRlhDZV9CciBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIEZ0IFFoQ2gKICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUWhDaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBFMmFiIGZ0Q3AgMmIgZnRDcC5pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgSGZDdFh0IEF0IEggMmIgSWFial9hYl9uT0ooZnRDcC5pZSwgSC5mdENwdCkgPiBtCiAgICAgICAgICAgICAgVXNPU08gUWhDaC5RcEtsQ0xYX2llID0gOjhhaiBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nCiAgICAgICAgICAgICAgQWJqIEguaWUgPSA6SWFqCiAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6OGFqIiwgJFFpZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpJYWoiLCAkVGljWENwX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAgICAgJFhSaXQtPnBDWGZwV04gPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIH0KCiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFdOOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWGpDRmNfWkNoX0F0dGlIV0NlVWlYUjJmWGpaXzJwSCgkUV9pZSwgJEtwSF9pZSwgJHBLY0MpIHsKICAgICAgICBpVCAoJHBLY0MgPT0gTiB8fCAkcEtjQyA9PSA5KSB7CgogICAgICAgICAgICAvKiAgJFhSaXQtPktCbF9QZkNwck4gPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogRnR0aUhXX2hDaF9RcEtsQ0xYLlFwS2xDTFhfaWUsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYAoKICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgRnR0aUhXX2hDaF9RcEtsQ0xYLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgVXNPU08gRnR0aUhXX2hDaF9RcEtsQ0xYLlFwS2xDTFhfaWUgPSAnJFFfaWUnIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJ04nIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJzknCiAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicKICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOyAqLwogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogRnR0aUhXX2hDaF9RcEtsQ0xYLlFwS2xDTFhfaWUsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYAogICAgICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBGdHRpSFdfaENoX1FwS2xDTFguaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIFVzT1NPIEZ0dGlIV19oQ2hfUXBLbENMWC5RcEtsQ0xYX2llID0gOjhhaiBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nCiAgICAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6OGFqIiwgJFFpZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICB9IENjdEMgewoKICAgICAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwck4gPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogRnR0aUhXX2hDaF9RcEtsQ0xYLlFwS2xDTFhfaWUsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYAoKICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgRnR0aUhXX2hDaF9RcEtsQ0xYLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgVXNPU08gRnR0aUhXX2hDaF9RcEtsQ0xYLlFwS2xDTFhfaWUgPSAnJFFfaWUnIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJ04nIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJzknCiAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgQWJqIGZ0Q3AuS3BIX2llID0gJyRLcEhfaWUnCiAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsgKi8KICAgICAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIEZ0dGlIV19oQ2hfUXBLbENMWC5RcEtsQ0xYX2llLCBmdENwLmllLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAKICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgRnR0aUhXX2hDaF9RcEtsQ0xYLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgVXNPU08gRnR0aUhXX2hDaF9RcEtsQ0xYLlFwS2xDTFhfaWUgPSA6OGFqIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJ04nIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJzknCiAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgQWJqIGZ0Q3AuS3BIX2llID0gOjJhaiBBYmogY0tIaVdfaEZ0WC5lQ2NDWENfVGNGSCA9ICdtJwogICAgICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7CiAgICAgICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOjhhaiIsICRRaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6MmFqIiwgJEtwSF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICB9CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFdOOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWGpDRmNfWkNoX0F0dGlIV0NlX3pyVnBLZlEoJFFpZSwgJEhmQ3RYX2llLCAkcEtjQykgewogICAgICAgIGlUICgkcEtjQyA9PSBOIHx8ICRwS2NDID09IDkpIHsKCiAgICAgICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHJOID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIGphbkphYjVKKFFoQ2gucEtjQyksIGZ0Q3BfSHBLZlEuV0ZoQyAgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBGdCBRaENoCgogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRaENoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBmdENwX0hwS2ZRIDJiIGZ0Q3BfSHBLZlEuaWUgPSBjS0hpV19oRnRYLnBLY0MKICAgICAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSAnJFFpZScgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJwogICAgICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7CgogICAgICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUk4tPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOyAqLwoKICAgICAgICAgICAgJHRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGphbkphYjVKKFFoQ2gucEtjQyksIGZ0Q3BfSHBLZlEuV0ZoQyAgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBGdCBRaENoCiAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgIAogICAgICAgICAgICAgICAgIEUyYWIgZnRDcF9IcEtmUSAyYiBmdENwX0hwS2ZRLmllID0gY0tIaVdfaEZ0WC5wS2NDICAKICAgICAgICAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSA6OFMyRU81Sl9haiBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nCiAgICAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgJHRYUi0+Q2dDTGZYQyhGcHBGcignOjhTMkVPNUpfYWonID0+ICRRaWUpKTsKICAgICAgICAgICAgJFhSaXQtPnBDWGZwV04gPSAkdFhSLT5UQ1hMUkFjYygpOwogICAgICAgIH0gQ2N0QyB7CgogICAgICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByTiA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBqYW5KYWI1SihRaENoLnBLY0MpIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAgQW4gUWhDaAoKICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUWhDaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBFMmFiIGZ0Q3AgMmIgZnRDcC5pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgSGZDdFh0IEF0IEggMmIgSWFial9hYl9uT0ooZnRDcC5pZSwgSC5mdENwdCkgPiBtCiAgICAgICAgICAgICAgVXNPU08gUWhDaC5RcEtsQ0xYX2llID0gJyRRaWUnIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJ04nIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJzknCiAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgQWJqIEguaWUgPSAnJEhmQ3RYX2llJwogICAgICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7CiAgICAgICAgICAgICAgJFhSaXQtPnBDWGZwV04gPSAkWFJpdC0+dFhSTi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7ICovCgogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogamFuSmFiNUooUWhDaC5wS2NDKSBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIEFuIFFoQ2gKICAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llICAgCiAgICAgICAgICAgICAgICAgIEUyYWIgSGZDdFh0IEF0IEggMmIgSWFial9hYl9uT0ooZnRDcC5pZSwgSC5mdENwdCkgPiBtIAogICAgICAgICAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSA6OFMyRU81Sl9haiBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogSC5pZSA9OlZ2T25KX2FqIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nCiAgICAgICAgICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKEZwcEZyKCc6OFMyRU81Sl9haicgPT4gJFFpZSwgJzpWdk9uSl9haicgPT4gJEhmQ3RYX2llKSk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICB9CgogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXTjsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1hqQ0ZjX1pDaF9BdHRpSFdDZV9WcEtmUV9mdENwdCgkUWllLCAkSGZDdFhfaWUsICRwS2NDLCAkSF9pZSkgewoKICAgICAgICBpVCAoJHBLY0MgPT0gTiB8fCAkcEtjQyA9PSA5KSB7CgogICAgICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByTiA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBRaENoLlFwS2xDTFhfaWUsIFFoQ2gucEtjQywgZnRDcC5pZSBGdCBmdENwX2llLCBmdENwLktwSF9pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQywgZnRDcC5DaEZpYywgZnRDcC5oS0JfV0ssIGZ0Q3AuTHBDRlhDZV9CciBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIEZ0IFFoQ2gKCgogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRaENoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgVXNPU08gUWhDaC5RcEtsQ0xYX2llID0gJyRRaWUnIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJ04nIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJzknCiAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgQWJqIFFoQ2gucEtjQz0nJEhfaWUnCiAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKCiAgICAgICAgICAgICAgJFhSaXQtPnBDWGZwV04gPSAkWFJpdC0+dFhSTi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7ICovCgogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogUWhDaC5RcEtsQ0xYX2llLCBRaENoLnBLY0MsIGZ0Q3AuaWUgRnQgZnRDcF9pZSwgZnRDcC5LcEhfaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMsIGZ0Q3AuQ2hGaWMsIGZ0Q3AuaEtCX1dLLCBmdENwLkxwQ0ZYQ2VfQnIgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBGdCBRaENoCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgVXNPU08gUWhDaC5RcEtsQ0xYX2llID0gOjhTMkVPNUpfYWogQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScgCiAgICAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgQWJqIFFoQ2gucEtjQz06VmFqIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nCiAgICAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOjhTMkVPNUpfYWonID0+ICRRaWUsICc6VmFqJyA9PiAkSF9pZSkpOwogICAgICAgICAgICAkWFJpdC0+cENYZnBXTiA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgfSBDY3RDIHsKCiAgICAgICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHJOID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIFFoQ2guUXBLbENMWF9pZSwgUWhDaC5wS2NDLCBmdENwLmllIEZ0IGZ0Q3BfaWUsIGZ0Q3AuS3BIX2llLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDLCBmdENwLkNoRmljLCBmdENwLmhLQl9XSywgZnRDcC5McENGWENlX0JyIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAgRnQgUWhDaAoKCiAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBFMmFiIEhmQ3RYdCBBdCBIIDJiIElhYmpfYWJfbk9KKGZ0Q3AuaWUsIEguZnRDcHQpID4gbQogICAgICAgICAgICAgIFVzT1NPIFFoQ2guUXBLbENMWF9pZSA9ICckUWllJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBRaENoLnBLY0M9JyRIX2llJyBBYmogSC5pZSA9ICckSGZDdFhfaWUnCiAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKCiAgICAgICAgICAgICAgJFhSaXQtPnBDWGZwV04gPSAkWFJpdC0+dFhSTi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7ICovCgogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogUWhDaC5RcEtsQ0xYX2llLCBRaENoLnBLY0MsIGZ0Q3AuaWUgRnQgZnRDcF9pZSwgZnRDcC5LcEhfaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMsIGZ0Q3AuQ2hGaWMsIGZ0Q3AuaEtCX1dLLCBmdENwLkxwQ0ZYQ2VfQnIgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBGdCBRaENoCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAgICBFMmFiIEhmQ3RYdCBBdCBIIDJiIElhYmpfYWJfbk9KKGZ0Q3AuaWUsIEguZnRDcHQpID4gbSAKICAgICAgICAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSA6OFMyRU81Sl9haiBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JyAKICAgICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogY0tIaVdfaEZ0WC5lQ2NDWENfVGNGSCA9ICdtJyBBYmogUWhDaC5wS2NDPTpWYWogQWJqIEguaWUgPSA6VnZPbkpfYWogCiAgICAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOjhTMkVPNUpfYWonID0+ICRRaWUsICc6VmFqJyA9PiAkSF9pZSwgJzpWdk9uSl9haicgPT4gJEhmQ3RYX2llKSk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICB9CgogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXTjsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1hqQ0ZjX1pDaF9BdHRpSFdDZV92dENwYWUoJFFpZSwgJGZpZSkgewoKCiAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwck4gPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogKiBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIFVzT1NPIFFwS2xDTFhfaWUgPSAnJFFpZScgQWJqIGhDaF9pZSA9ICckZmllJyIpOwoKICAgICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUk4tPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFdOOyAqLwoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGBGdHRpSFdfaENoX1FwS2xDTFhgIFVzT1NPIFFwS2xDTFhfaWUgPSA6OFMyRU81Sl9haiBBYmogaENoX2llID0gOnZhaiIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoRnBwRnIoJzo4UzJFTzVKX2FqJyA9PiAkUWllLCAnOnZhaicgPT4gJGZpZSkpOwogICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwV047CiAgICB9CgogICAgLy9BZWVDZSB6ciBucGkgVEtwIFUyU2RJcTJVICAgIAoKICAgIFRmV0xYaUtXIEhDWF9qQ0ZjX0F0dGlIV0NlX3Z0Q3BWcEtmUXQoJFFpZSwgJHBLY0MpIHsKCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogSVMyWiBGdHRpSFdfaENoX1FwS2xDTFggVXNPU08gUXBLbENMWF9pZSA9IDo4UzJFTzVKX2FqIEFiaiBwS2NDID0gOlMycU8iKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOjhTMkVPNUpfYWonID0+ICRRaWUsICc6UzJxTycgPT4gJHBLY0MpKTsKICAgICAgICAkWFJpdC0+cENYZnBXTiA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFdOOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWGZ0Q3BxaXRYKCkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBmLmllLCBmLlRXRmhDLCBmLmhXRmhDLCBmLmNXRmhDICwgYy5mdENwV0ZoQyBJUzJaIGZ0Q3AgQW4gZgogICAgICAgICBFMmFiIGNLSGlXX2hGdFggQW4gYyAyYiBmLmllID0gYy5mdENwX2llIFVzT1NPIGYuZUNjQ1hDX1RjRkggPSAnbSciKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWHZ0Q3A1S2ZXWCgkcEtjQykgewoKCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogSVMyWiBjS0hpV19oRnRYIFVzT1NPIHBLY0M9IDpTMnFPIEFiaiBlQ2NDWENfVGNGSCA9ICdtJyIpOwoKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpTMnFPIiwgJHBLY0MsIDhqMjo6OEFTQVpfbkpTKTsKCiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWEFMWGlHQ3Z0Q3B0KCkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiA1MnZiSihgaWVgKSBBbiBmdENwX0ZMWGlHQ19MS2ZXWCBJUzJaIGBjS0hpV19oRnRYYCBVc09TTyBgZnRDcF90WEZYZnRgID0gTiIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgLy8gQWVlQ2UgQnIgdEZNdFJDQyA5eC9OTi85bU5ECgogICAgVGZXTFhpS1cgZlFlRlhDX0Z0dGlIV19oQ2hfUXBLbENMWCgkaWUpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJmUWVGWEMgRnR0aUhXX2hDaF9RcEtsQ0xYIHRDWCAgcEtjQyA9IDpTMnFPICBrUkNwQyBoQ2hfaWUgPSA6YWogIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6UzJxTyIsICRYUml0LT5wS2NDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6YWoiLCAkaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKICAgIC8vakZYQyA5L202L042IHlpdFJGTVJGCgogICAgVGZXTFhpS1cgSENYZnRDcEFMTEN0dHFpdFgoJFFpZSkgewoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZnRDcC5pZSAsZnRDcC5UV0ZoQyxmdENwLmhXRmhDLGZ0Q3AuY1dGaEMsRmguUXBLbENMWF9pZSBUcEtoIGZ0Q3AgbEtpVyBjS0hpV19oRnRYIEtXIGZ0Q3AuaWU9Y0tIaVdfaEZ0WC5mdENwX2llIGxLaVcgRnR0aUhXX2hDaF9RcEtsQ0xYIEZoIEtXIGNLSGlXX2hGdFguZnRDcF9pZT1GaC5oQ2hfaWUga1JDcEMgY0tIaVdfaEZ0WC5mdENwX3RYRlhmdD1OIEZXZSBjS0hpV19oRnRYLnBLY0MhPU4gRldlIGNLSGlXX2hGdFgucEtjQyE9OSBGV2UgY0tIaVdfaEZ0WC5lQ2NDWENfVGNGSCA9ICdtJyBGV2UgRmguUXBLbENMWF9pZT06OGFqICIpOwoKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjo4YWoiLCAkUWllLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwovLyAgICAgQ0xSSyAibk9xTzVKIGZ0Q3AuaWUgLGZ0Q3AuVFdGaEMsZnRDcC5oV0ZoQyxmdENwLmNXRmhDLEZoLlFwS2xDTFhfaWUgVHBLaCBmdENwIGxLaVcgY0tIaVdfaEZ0WCBLVyBmdENwLmllPWNLSGlXX2hGdFguZnRDcF9pZSBsS2lXIEZ0dGlIV19oQ2hfUXBLbENMWCBGaCBLVyBjS0hpV19oRnRYLmZ0Q3BfaWU9RmguaENoX2llIGtSQ3BDIGNLSGlXX2hGdFguZnRDcF90WEZYZnQ9TiBGV2UgY0tIaVdfaEZ0WC5wS2NDIT1OIEZXZSBjS0hpV19oRnRYLnBLY0MhPTkgRldlIEZoLlFwS2xDTFhfaWU9JFFpZSAiOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1hmdENwQUxMQ3R0U2lIUlgoJFFpZSwgJGZ0Q3BfaWUpIHsKCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGZ0Q3AuVFdGaEMsZnRDcC5oV0ZoQyxmdENwLmNXRmhDLGZlLmtGWENwaEZwTSxmZS5RQ3BoaXR0aUtXLGZlLlFwS2xDTFhfaWUgVHBLaCBmdENwIGxLaVcgY0tIaVdfaEZ0WCBjaCBLVyBmdENwLmllPWNoLmZ0Q3BfaWUgbEtpVyBmdENwX2VDVEZmY1hfcGlIUlh0IGZlIEtXIGZlLmZ0Q3BfaWU9Y2guZnRDcF9pZSBrUkNwQyBmZS5RcEtsQ0xYX2llPTo4YWogRldlIGNoLmZ0Q3BfaWU9OnZuT1NfYWogRldlIGNoLmVDY0NYQ19UY0ZIID0gJ20nIik7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOjhhaiIsICRRaWUsIDhqMjo6OEFTQVpfbkpTKTsKCgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOnZuT1NfYWoiLCAkZnRDcF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKLy8gICAgICAgIENMUksgIjxRcEM+IjsKICAgICAgICAvLyBDTFJLICJuT3FPNUogZnRDcC5UV0ZoQyxmdENwLmhXRmhDLGZ0Q3AuY1dGaEMsZmUuUUNwaGl0dGlLVyxmZS5RcEtsQ0xYX2llIFRwS2ggZnRDcCBsS2lXIGNLSGlXX2hGdFggY2ggS1cgZnRDcC5pZT1jaC5mdENwX2llIGxLaVcgZnRDcF9lQ1RGZmNYX3BpSFJYdCBmZSBLVyBmZS5mdENwX2llPWNoLmZ0Q3BfaWUga1JDcEMgZmUuUXBLbENMWF9pZT0kUWllIEZXZSBjaC5mdENwX2llPSRmdENwX2llIjsKICAgICAgICAvLyBDTFJLICJ0Q2NDTFggRmguUXBLbENMWF9pZSxmZS5RQ3BoaXR0aUtXLGNoLmZ0Q3BfaWUsIGZlLmtGWENwaEZwTSxjaC5mdENwV0ZoQyxmdENwLlRXRmhDLGZ0Q3AuaFdGaEMsZnRDcC5jV0ZoQyBUcEtoIGNLSGlXX2hGdFggY2ggbEtpVyBGdHRpSFdfaENoX1FwS2xDTFggRmggS1cgY2guZnRDcF9pZT1GaC5oQ2hfaWUgbEtpVyBmdENwX2VDVEZmY1hfcGlIUlh0IGZlIEtXIGZlLmZ0Q3BfaWU9RmguaENoX2llIGxLaVcgZnRDcCBLVyBmdENwLmllPWNoLmZ0Q3BfaWUga1JDcEMgY2guaWU9JGllIEZXZSBGaC5RcEtsQ0xYX2llPSRRaWUiOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1haZV9oQ2hfQXR0aUhXQ2Vfak9JQXZxSigkUV9pZSwgJGllKSB7CgogICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHJOID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKIFFoQ2guUXBLbENMWF9pZSwgUWhDaC5wS2NDLCBmdENwLmllLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDLCBmdENwLkNoRmljLCBmdENwLmhLQl9XSywgZnRDcC5McENGWENlX0JyIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAgRnQgUWhDaAoKICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRaENoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgIFVzT1NPIFFoQ2guUXBLbENMWF9pZSA9ICckUV9pZScgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nCiAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7CiAgICAgICAgICAkWFJpdC0+cENYZnBXTiA9ICRYUml0LT50WFJOLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsgKi8KCgogICAgICAgIC8qICRYUml0LT5LQmxfUGZDcHI5ID0gJFhSaXQtPmVCLT5QZkNwcigibk9xTzVKICogSVMyWiBgZnRDcGAKCiAgICAgICAgICBFMmFiIFFwS2xDTFggMmIgZnRDcC5pZSA9IFFwS2xDTFguUXBLbENMWF9oRldGSENwCiAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUXBLbENMWC5RcEtsQ0xYX2hGV0ZIQ3AgID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICBVc09TTyBRcEtsQ0xYLmllID0gJyRRX2llJwogICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicKICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7ICovCiAgICAgICAgLy8kWFJpdC0+cENYZnBXOSA9ICRYUml0LT5LQmxfUGZDcHI5LT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICAvL3BDWGZwVyBGcHBGcl9oQ3BIQygkWFJpdC0+cENYZnBXTiwgJFhSaXQtPnBDWGZwVzkpOwogICAgICAgIC8vcENYZnBXICRYUml0LT5wQ1hmcFdOOwoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogUWhDaC5RcEtsQ0xYX2llLCBRaENoLnBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMsIGZ0Q3AuQ2hGaWMsIGZ0Q3AuaEtCX1dLLCBmdENwLkxwQ0ZYQ2VfQnIgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBGdCBRaENoCiAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIFVzT1NPIFFoQ2guUXBLbENMWF9pZSA9IDo4YWogQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogZnRDcF9pZT06dm5PU2FqCiAgICAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUgIik7Ci8vICAgICAgICBDTFJLICJuT3FPNUogUWhDaC5RcEtsQ0xYX2llLCBRaENoLnBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMsIGZ0Q3AuQ2hGaWMsIGZ0Q3AuaEtCX1dLLCBmdENwLkxwQ0ZYQ2VfQnIgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBGdCBRaENoCi8vICAgICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggMmIgUWhDaC5oQ2hfaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLy8gICAgICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLy8gICAgICAgICAgICAgICAgIFVzT1NPIFFoQ2guUXBLbENMWF9pZSA9ICRRX2llIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJ04nIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJzknCi8vICAgICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogZnRDcF9pZT0kaWUKLy8gICAgICAgICAgICAgICAgIFZTMnY4IHpvIGNLSGlXX2hGdFguZnRDcF9pZQovLyAgICAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUgIjsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKEZwcEZyKCc6OGFqJyA9PiAkUV9pZSwgJzp2bk9TYWonID0+ICRpZSkpOwogICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwV047CiAgICB9CgogICAgLy85MS1tNi05bU42CiAgICBUZldMWGlLVyBIQ1gycEhGV2l0RlhpS1dfenJiRmhDKCRHRmNmQykgewogICAgICAgIC8vICAgJFhSaXQtPktCbF9QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBpZSwgS3BIX1dGaEMgSVMyWiBoS2VfS3BIRldpdEZYaUtXIFVzT1NPIGllID0gJyRHRmNmQyciKTsKICAgICAgICAvLyAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+S0JsX1BmQ3ByLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKLy8gICAgICAgIENMUksgIm5PcU81SiBpZSwgS3BIX1dGaEMgSVMyWiBoS2VfS3BIRldpdEZYaUtXIFVzT1NPIEtwSF9XRmhDID0gJEdGY2ZDIjsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogaWUsIEtwSF9XRmhDIElTMlogaEtlX0twSEZXaXRGWGlLVyBVc09TTyBLcEhfV0ZoQyA9IDpiQVpPIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6YkFaTyIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKCiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgRmVlX0JmY01fZnRDcCgkVGlDY2V0LCAkR0ZjZkN0KSB7CgoKLy8gICAgICAgIENMUksgImlXdENwWCBpV1hLIGZ0Q3AoIi4kVGlDY2V0LiIpIEdGY2ZDdCAoIi4kR0ZjZkN0LiIpIi4nKioqKioqKionOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoImlXdENwWCBpV1hLIGZ0Q3AoIiAuICRUaUNjZXQgLiAiKSBHRmNmQ3QgKCIgLiAkR0ZjZkN0IC4gIikiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5lQi0+Y0Z0WGFXdENwWGFlKCk7CiAgICB9CgogICAgVGZXTFhpS1cgRmVlX0JmY01fY0tIaVdfaEZ0WCgkVGlDY2V0LCAkR0ZjZkN0KSB7CgoKLy8gICAgICAgIENMUksgImlXdENwWCBpV1hLIGNLSGlXX2hGdFgoIi4kVGlDY2V0LiIpIEdGY2ZDdCAoIi4kR0ZjZkN0LiIpIi4nIyMjIyMjIyMjIyc7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygiaVd0Q3BYIGlXWEsgY0tIaVdfaEZ0WCgiIC4gJFRpQ2NldCAuICIpIEdGY2ZDdCAoIiAuICRHRmNmQ3QgLiAiKSIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPmVCLT5jRnRYYVd0Q3BYYWUoKTsKICAgIH0KCi8vTVJmdFJCS0sgTk4teC1ONgoKICAgIFRmV0xYaUtXIEhDWFplX2hDaF9BdHRpSFdDZV96cnZ0Q3BfaWUoJFFfaWUsICRmdENwX2llKSB7CgoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogUWhDaC5RcEtsQ0xYX2llLCBRaENoLnBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMsIGZ0Q3AuQ2hGaWMsIGZ0Q3AuaEtCX1dLLCBmdENwLkxwQ0ZYQ2VfQnIgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBGdCBRaENoCiAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFoQ2guaENoX2llID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgRTJhYiBmdENwIDJiIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIFVzT1NPIFFoQ2guUXBLbENMWF9pZSA9IDo4YWogQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogZnRDcC5pZSA9IDp2bk9TX2FqCiAgICAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6dm5PU19haiIsICRmdENwX2llLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoRnBwRnIoJzo4YWonID0+ICRRX2llKSk7CiAgICAgICAgJFhSaXQtPnBDWGZwV04gPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXTjsKICAgIH0KCiAgICAvL203LW03LTltTjYgLy9hakk1NCA5bS1tOS1OeAogICAgLy9HaWVSckYgOTcvbXgvOW05bQogICAgVGZXTFhpS1cgSENYdnRDcGpDWEZpY3RfakZYRkpGQmNDKCR0VVJDcEMsICRLcGVDcEJyLCAkY2loaVgsICRRZUtCaVdlX0ZwcEZyKSB7Ci8vOFJLQ1dpZ04gOTMtTjktTjYgV0ZoQ2UgZnRDcAoKCiAgICAgICAgaVQgKFhwaWgoJHRVUkNwQykgIT0gJycpIHsKICAgICAgICAgICAgJGtSQ3BDID0gIkFiaiBmLmVDY0NYQ19UY0ZIID0gJ20nIjsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAka1JDcEMgPSAiVXNPU08gZi5lQ2NDWENfVGNGSCA9ICdtJyI7CiAgICAgICAgfQoKCiAgICAgICAgJFBmQ3ByID0gIm5PcU81SiBuMHFfNUFxNV9JMnZial9TMlVuICBmLmllLGYuRkxYaUdGWENlX1hpaEMsZi5lQ0ZMWGlHRlhDZV9YaWhDLExLV0xGWChmLlRXRmhDLCcgJyxmLmhXRmhDLCcgJyxmLmNXRmhDKSBGdCBUV0ZoQyxjLmZ0Q3BXRmhDLGZILldGaEMgRnQgcEtjQyxmLmVDUUZwWGhDV1hfaWUgRnQgZUNRRnBYaENXWCxmSE4uV0ZoQyBGdCBDaFFfcEtjQ19XRmhDLGFJKGYuV0ZoQ2VfVGNGSCA9ICdOJywgJ2JGaENlJyxhSShmLldGaENlX1RjRkg9ICc5JywnNUtXTGZwcENXWCBTQ3RYcGlMWENlJyxhSShmLldGaENlX1RjRkg9ICcxJywnYkZoQ2UgU0N0WHBpTFhDZScsYUkoZi5XRmhDZV9UY0ZIPW0sJzVLV0xmcHBDV1gnLCcnKSkpKSBBbiBmdENwX1hyUUMsYUkoZi5DaFFfV0ZoQ2VfVGNGSCA9ICdOJywgJ2JGaENlJywgYUkoZi5DaFFfV0ZoQ2VfVGNGSD0gJzknLCc1S1dMZnBwQ1dYIFNDdFhwaUxYQ2UnLCBhSShmLkNoUV9XRmhDZV9UY0ZIPSAnMScsJ2JGaENlIFNDdFhwaUxYQ2UnLGFJKGYuQ2hRX1dGaENlX1RjRkg9bSwnNUtXTGZwcENXWCcsJycpKSkpIEFuIGZ0Q3BfWHJRQ19DaFEsZi5DaEZpYyxmLmhLQl9XSywgaVQoZi50WEZYZnQ9J29PbicsJ0FMWGlHQycsJ2FXRkxYaUdDJykgRnQgdFhGWGZ0LGMuRkxMWF9jS0xNQ2VfdFhGWGZ0LGMuTGZwcENXWF90Q3R0aUtXX2llLGMuZnRDcF9pZSxjLmNGdFhfY0tIaVcsCmlUKGMucEtjQyA9IE4sIChuT3FPNUogVlMydjhfNTJiNUFKKFEuUXBLbENMWF9XRmhDKSBUcEtoIFFwS2xDTFggUSksaVQoYy5wS2NDID0gOSwgaVRXZmNjKChuT3FPNUogVlMydjhfNTJiNUFKKFEuUXBLbENMWF9XRmhDKSBUcEtoIFFwS2xDTFggUSBrUkNwQyBRLlFwS2xDTFhfaEZXRkhDcCA9IGYuaWUpLCdiQScpLChpVFdmY2MoKG5PcU81SiBWUzJ2OF81MmI1QUooUS5RcEtsQ0xYX1dGaEMpIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIEZ0IEZoIHFPSUogRTJhYiBRcEtsQ0xYIFEgMmIgUS5pZSA9IEZoLlFwS2xDTFhfaWUgVXNPU08gaENoX2llID0gZi5pZSksJ2JBJykpKSkgIEFuIGVDRmNwS0toX0xLZldYLCh0Q2NDTFggTEtmV1goaWUpIFRwS2ggTEZYQ0hLcGlDdCBMIGtSQ3BDIElhYmpfYWJfbk9KKGYuaWUsRl9mdENwdCkgQWJqIEwuUUZwQ1dYX2llIDw+IG0gQWJqIEwuTEZYQ0hLcHJfZUNjQ1hDIDw+IE4pIEZ0IExGWENIS3ByX0xLZldYLEZlLnRDcEdDcF9XRmhDIEZ0IHRDcEdDcF9XRmhDIElTMlogZnRDcCBmIHFPSUogRTJhYiBjS0hpV19oRnRYIGMgMmIgZi5pZSA9IGMuZnRDcF9pZSBxT0lKIEUyYWIgZnRDcF9IcEtmUSBmSCAyYiBjLnBLY0MgPSBmSC5pZSAgcU9JSiBFMmFiIGZ0Q3BfSHBLZlEgZkhOIDJiIGMuQ2hRX3BLY0MgPSBmSE4uaWUgY0NUWCBsS2lXIEZlX3RDcEdDcCBGZSBLVyBGZS5pZT1jLkZlX2llICIgLiAkdFVSQ3BDIC4gJyAnIC4gJGtSQ3BDIC4gIiAgMnBlQ3AgQnIgZi5pZSBGdEwgIiAuICcgJyAuICRjaWhpWDsKICAgICAgICAvL0NMUksgJFBmQ3ByO2VpQzsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCRQZkNwcik7CgogICAgICAgIFRLcENGTFIgKCRRZUtCaVdlX0ZwcEZyIEZ0ICRRZUtCaVdlX01DciA9PiAkUWVLQmlXZV9HRmMpIHsKCiAgICAgICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygkUWVLQmlXZV9NQ3IsICRRZUtCaVdlX0dGY1ttXSwgJFFlS0JpV2VfR0ZjW05dKTsKICAgICAgICB9CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKLy9qQ0dGcHRSaQogICAgVGZXTFhpS1cgSENYX2NLSGlXX2hGdFhfQnJfZnRDcF9pZSgkR0ZjKSB7CgogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogY0tIaVdfaEZ0WCBrUkNwQyBmdENwX2llPTp5QXEiKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6eUFxIiwgJEdGYywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CgogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCi8vYWpJNTQgTngtbTktTngKICAgIFRmV0xYaUtXIEhDWGpDRmNaQ2hfQXR0aUhXQ2VfenJWcEtmUSgkSGllLCAkUWllKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGYuaWUsIGYuVFdGaEMsIGYuaFdGaEMsIGYuY1dGaEMgSVMyWiBmdENwIEFuIGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMmFiIGNLSGlXX2hGdFggQW4gYyAyYiBmLmllID0gYy5mdENwX2llCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTJhYiBmdENwX0hwS2ZRIEFuIEggMmIgKElhYmpfYWJfbk9KKEguaWUsIGMucEtjQykgPiBtIDJTIElhYmpfYWJfbk9KKEguaWUsIGMuQ2hRX3BLY0MpID4gbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzT1NPIGMucEtjQyAhPSAnOScgQWJqIGMucEtjQyAhPSAnTicgQWJqIGMuZnRDcF90WEZYZnQgPSAnTicgQWJqIGMuZUNjQ1hDX1RjRkggPSAnbScgQWJqIEguaWUgYWIgKCRIaWUpICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJqIGYuaWUgIGFiIChuT3FPNUogaENoX2llIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIFVzT1NPIFFwS2xDTFhfaWUgPSA6OGFqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlMydjggem8gYy5mdENwX2llIDJTak9TIHpvIGYuVFdGaEMgQW41Iik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOjhhaicgPT4gJFFpZSkpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIC8vQXpzYUVPT0ogOTcvTm0vOW1ONgogICAgVGZXTFhpS1cgTFJDTE1JcEtocUZ0WGI4RnR0a0twZXQoJFFGdHRrS3BlLCAkaWUsICRXS19LVF9RRnR0a0twZXQpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJ0Q2NDTFggYFFGdHRrS3BlYCBUcEtoIGZ0Q3BfUUZ0dGtLcGV0IGtSQ3BDIGZ0Q3BfaWU9IDphaiBLcGVDcCBCciBpZSBlQ3RMIGNpaGlYIG0sIiAuICRXS19LVF9RRnR0a0twZXQpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOmFqIiwgJGllLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIFRLcENGTFIgKCRYUml0LT5wQ1hmcFcgRnQgJEdGY2ZDKSB7CiAgICAgICAgICAgIGlUICgkR0ZjZkNbJ1FGdHRrS3BlJ10gPT0gJFFGdHRrS3BlKSB7CiAgICAgICAgICAgICAgICBwQ1hmcFcgWHBmQzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwQ1hmcFcgVEZjdEM7CiAgICB9CgovL0F6c2FFT09KIDk3L05tLzltTjYKICAgIFRmV0xYaUtXIEZlZThGdHRrS3BlYVd2dENwOEZ0dGtLcGV0KCRRRnR0a0twZSwgJGZ0Q3BfaWUpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJpV3RDcFggaVdYSyBmdENwX1FGdHRrS3BldCgJCQkJCQkJCQkKCQkJCQkJCQlmdENwX2llLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFFGdHRrS3BlYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNLSF9lRlhDWGloQykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRmNmQ3QgKDp2bk9TX2FqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjhBbm5VMlNqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjJVKCkpIik7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOjhBbm5VMlNqJywgJFFGdHRrS3BlLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6dm5PU19haicsICRmdENwX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKLy9BenNhRU9PSiA5Ny9ObS85bU42CiAgICBUZldMWGlLVyBlQ2NDWEN2dENwSXBLaHZ0Q3A4RnR0a0twZXQoJGZ0Q3BfaWUpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJlQ2NDWEMgVHBLaCBmdENwX1FGdHRrS3BldCBrUkNwQyBmdENwX2llPSA6YWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRmdENwX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgcENYZnBXICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgIH0KCi8vOTctTk4vOW1ONgogICAgVGZXTFhpS1cgSENYX1FGdHRrS3BlX1FLY2lMcl9lQ1hGaWN0KCkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogUUZ0dGtLcGVfUUtjaUxyIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCi8vOTctTk4tOW1ONiB0ZnRSRldYCiAgICBUZldMWGlLVyBIQ1h2dENwdHpydEN0dGlLVygpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGNLSGlXX2hGdFgga1JDcEMgTGZwcENXWF90Q3R0aUtXX2llICE9ICcnIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCi8vYWpJNTEgTkQtbTktTngKICAgIC8vUVJLQ1dpZyB0aWVlUkN0UiwgRkJSaWxDQ1ggIC8vOFJLQ1dpZyA5Ni1OOS1ONiA4UktDV2lnTiA5My1OOS1ONiAvL2FqSTU5CiAgICBUZldMWGlLVyBIQ1hfZnRDcF9IcEtmUV9Ccl9mdENwX1hyUUMoJGZ0Q3BfWHJRQykgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogZnRDcF9IcEtmUSBVc09TTyBXRmhDZV9UY0ZIPTp2bk9TX0pvOE8gQWJqIFJpQ3BGcExScj1tIEtwZUNwIEJyIGllIEZ0TCIpOwoKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjp2bk9TX0pvOE8iLCAkZnRDcF9YclFDLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKLy9Vc09TTyBpZSAhPSAnTicKCiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIC8vUVJLQ1dpZyB0aWVlUkN0UiwgRkJSaWxDQ1ggIC8vYWpJNTkKICAgIFRmV0xYaUtXIEhDWEFMWGlHQ3Z0Q3B0enJ2dENwSnJRQygkZnRDcF9YclFDKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIDUydmJKKGllKSBBbiBmdENwX0ZMWGlHQ19MS2ZXWCBJUzJaIGBmdENwYCAgVXNPU08gdFhGWGZ0ID0gJ29PbicgQWJqIFdGaENlX1RjRkg9OnZuT1NfSm84TyIpOwoKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjp2bk9TX0pvOE8iLCAkZnRDcF9YclFDLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgLy8gRkJSaWxDQ1ggOTkvOS85bU54IGFqSTUxCiAgICBUZldMWGlLVyBIQ1hBTFhpR0N2dENwdHpydnRDcEpyUUNPaFEoJGZ0Q3BfWHJRQykgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiA1MnZiSihpZSkgQW4gZnRDcF9GTFhpR0NfTEtmV1ggSVMyWiBgZnRDcGAgIFVzT1NPIHRYRlhmdCA9ICdvT24nIEFiaiAoQ2hRX1dGaENlX1RjRkg9OnZuT1NfSm84TyAyUyBXRmhDZV9UY0ZIPTp2bk9TX0pvOE8pIik7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOnZuT1NfSm84TyIsICRmdENwX1hyUUMsIDhqMjo6OEFTQVpfbkpTKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICAvL1FSS0NXaWcgTjMtTjktOW1ONiAvL2FqSTU5CiAgICBUZldMWGlLVyBIQ1h2dENwVnBLZlFBY2N6ckpyUUMoJFdGaENlX1RjRkgpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGZ0Q3BfSHBLZlEga1JDcEMgV0ZoQ2VfVGNGSCA9IDpiQVpPal9JcUFWIEFiaiAoUmlDcEZwTFJyPW0gQWJqIFFGcENXWF9pZSA9bSkgMlMgKFJpQ3BGcExScj1OIEFiaiBRRnBDV1hfaWUgPD5tKSAiKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6YkFaT2pfSXFBViIsICRXRmhDZV9UY0ZILCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgLy9RUktDV2lnIDlOLU45LTltTjYKICAgIFRmV0xYaUtXIExSTVpGV0ZIQ3B6cjhpZSgkR0ZjZkMpIHsKLy8gICAgICAgIENMUksgIm5PcU81SiBpZSBJUzJaIFFwS2xDTFgga1JDcEMgaWU9ICRHRmNmQyBBYmogUXBLbENMWF9oRldGSENwIDw+IG0gIjsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIFFwS2xDTFgga1JDcEMgaWU9IDp5QXF2TyBBYmogUXBLbENMWF9oRldGSENwIDw+IG0gIik7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOnlBcXZPIiwgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgLy9RUktDV2lnIDlOLU45LTltTjYKICAgIFRmV0xYaUtXIEhDWHZ0Q3BTS2NDenJhZSgkR0ZjZkMpIHsKLy8gICAgICAgIENMUksgIm5PcU81SiBwS2NDIElTMlogY0tIaVdfaEZ0WCBrUkNwQyBmdENwX2llPSAkR0ZjZkMiO2VpQzsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogcEtjQyBJUzJaIGNLSGlXX2hGdFgga1JDcEMgZnRDcF9pZT0gOnlBcXZPIik7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOnlBcXZPIiwgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgLy9RUktDV2lnIDlOLU45LTltTjYKICAgIFRmV0xYaUtXIFJpZUNlQ2NDWENCclNLY0MoJHBLY0MsICRmdENwX2llKSB7CgogICAgICAgIGlUICgkcEtjQyA9PSA5KSB7CiAgICAgICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogUXBLbENMWCBrUkNwQyBRcEtsQ0xYX2hGV0ZIQ3A9IDp2bk9TX2FqIik7CgogICAgICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjp2bk9TX2FqIiwgJGZ0Q3BfaWUsIDhqMjo6OEFTQVpfbkpTKTsKCiAgICAgICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgICAgICB9IENjdEMgewogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIEZ0dGlIV19oQ2hfUXBLbENMWCBrUkNwQyBoQ2hfaWUgYWIgKCRmdENwX2llKSIpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICAgICAgfQogICAgfQoKICAgIC8vUVJLQ1dpZyA5Ti1OOS05bU42CiAgICBUZldMWGlLVyBIQ1hBdHRpSFdDZV96cmFlKCRHRmNmQykgewovLyAgICAgICAgQ0xSSyAibk9xTzVKIGllIElTMlogUXBLbENMWCBrUkNwQyBpZT0gJEdGY2ZDIEFiaiBRcEtsQ0xYX2hGV0ZIQ3AgPD4gbSAiOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIGtSQ3BDIGhDaF9pZT0gOnlBcXZPIik7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOnlBcXZPIiwgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgLy9RUktDV2lnIDlOLU45LTltTjYKICAgIFRmV0xYaUtXIGVDY0NYQ19BdHRpSFdfWkNoKCRpZSkgewogICAgICAgIC8vJFhSaXQtPktCbF9QZkNwciA9ICRYUml0LT5lQi0+UGZDcHIoImpPcU9KTyBJUzJaIGBGdHRpSFdfaENoX1FoYCBVc09TTyBgaENoX2llYCA9ICckWFJpdC0+aENoX2llJyBBYmogUWhfaWUgPSAnJFhSaXQtPlFoX2llJyIpOwogICAgICAgIC8vcENYZnBXICRYUml0LT5LQmxfUGZDcHI7Ci8vICAgICAgICBDTFJLICJqT3FPSk8gSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBVc09TTyBgaENoX2llYCA9ICRpZSI7ZWlDOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoImpPcU9KTyAgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBVc09TTyBgaENoX2llYCA9IDpaT1pfYWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpaT1pfYWoiLCAkaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKICAgIC8vUVJLQ1dpZyA5Ti1OOS05bU42CiAgICBUZldMWGlLVyBlQ2NDWENfQXR0aUhXX1pDaDhwS2xDTFgoJGllLCAkUXBLbENMWF9pZSkgewoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJqT3FPSk8gIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAgVXNPU08gYGhDaF9pZWAgPSA6Wk9aX2FqIEFiaiBRcEtsQ0xYX2llPTo4UzJfYWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpaT1pfYWoiLCAkaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjo4UzJfYWoiLCAkUXBLbENMWF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgogICAgLy9RUktDV2lnIDkxLU45LTltTjYKICAgIFRmV0xYaUtXIEhDWG5mUUNwQWVoaVc4cEtsQ0xYYkZoQ3QoKSB7Ci8vOFJLQ1dpZyA5MS1OOS1ONiBXRmhDZSBmdENwCgogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBWUzJ2OF81MmI1QUooUS5RcEtsQ0xYX1dGaEMpIFRwS2ggUXBLbENMWCBRIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWGpDRmNaRldGSENwOHBLbENMWGJGaEN0KCRmdENwX2llKSB7Ci8vOFJLQ1dpZyA5MS1OOS1ONiBXRmhDZSBmdENwCgogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBWUzJ2OF81MmI1QUooUS5RcEtsQ0xYX1dGaEMpIFRwS2ggUXBLbENMWCBRIGtSQ3BDIFEuUXBLbENMWF9oRldGSENwID0gOnZuT1NfYWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjp2bk9TX2FqIiwgJGZ0Q3BfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgSENYMlhSQ3B2dENwdDhwS2xDTFhiRmhDKCRmdENwX2llKSB7Ci8vOFJLQ1dpZyA5MS1OOS1ONiBXRmhDZSBmdENwCgogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBWUzJ2OF81MmI1QUooUS5RcEtsQ0xYX1dGaEMpIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIEZ0IEZoIHFPSUogRTJhYiBRcEtsQ0xYIFEgMmIgUS5pZSA9IEZoLlFwS2xDTFhfaWUgVXNPU08gaENoX2llID0gOnZuT1NfYWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjp2bk9TX2FqIiwgJGZ0Q3BfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgVGZXTFhpS1cgSENYdnRDcDVGWENIS3ByNUtmV1goJGZ0Q3BfaWUpIHsKLy84UktDV2lnIDkxLU45LU42IFdGaENlIGZ0Q3AKCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygidENjQ0xYIExLZldYKGllKSBUcEtoIExGWENIS3BpQ3QgTCBrUkNwQyBJYWJqX2FiX25PSig6dm5PU19haixGX2Z0Q3B0KSBBYmogTC5RRnBDV1hfaWUgPD4gbSBBYmogTC5MRlhDSEtwcl9lQ2NDWEMgPD4gTiIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOnZuT1NfYWoiLCAkZnRDcF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICAvL1FSS0NXaWdOIG05LW1OLTltTngKICAgIFRmV0xYaUtXIGZRZUZYQ19lQ2NDWENfVGNGSCgkR0ZjZkMpIHsKICAgICAgICAvLyRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJlQ2NDWEMgVHBLaCBmdENwIGtSQ3BDIGllPSckR0ZjZkMnIik7CiAgICAgICAgLy9wQ1hmcFcgJFhSaXQtPktCbF9QZkNwcjsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJmUWVGWEMgZnRDcCB0Q1ggdFhGWGZ0ID0gJ2JLJyAsZUNjQ1hDX1RjRkggPSBOIGtSQ3BDIGllPSA6YWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgogICAgLy9RUktDV2lnTiBtOS1tTi05bU54CiAgICBUZldMWGlLVyBmUWVGWENfY0tIaVdfaEZ0WF9lQ2NDWENfVGNGSCgkR0ZjZkMpIHsKLy8gICAgICAgIENMUksgImZRZUZYQyBjS0hpV19oRnRYICBuT0ogZnRDcF90WEZYZnQgPSAnbScsIGVDY0NYQ19UY0ZIID0gTiBrUkNwQyBmdENwX2llPSAkR0ZjZkMiO2VpQzsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJmUWVGWEMgY0tIaVdfaEZ0WCAgbk9KIGZ0Q3BfdFhGWGZ0ID0gJ20nLCBlQ2NDWENfVGNGSCA9IE4ga1JDcEMgZnRDcF9pZT0gOmFqIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6YWoiLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKICAgIC8vUVJLQ1dpZ04gbTEtbU4tOW1OeAogICAgVGZXTFhpS1cgTFJNWkZXRkhDcHpydnRDcGFlKCRHRmNmQykgewovLyAgICAgICAgQ0xSSyAibk9xTzVKIGllIElTMlogUXBLbENMWCBrUkNwQyBpZT0gJEdGY2ZDIEFiaiBRcEtsQ0xYX2hGV0ZIQ3AgPD4gbSAiOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogUXBLbENMWCBrUkNwQyBRcEtsQ0xYX2hGV0ZIQ3AgYWIgKCRHRmNmQykiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIC8qICAgICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCgoKICAgIC8qICAgICAgICAgIHNpQ3BGcExSciAgICBhakk1ICAgICAgICAgICAgICAgICovCgoKICAgIC8qICAgICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCgogICAgR0ZwICR0ZkJfSHBLZlF0ID0gRnBwRnIoKTsKCiAgICBUZldMWGlLVyBIQ1hzdnRDcFZwS2ZRX0ZjYygkR0ZjZkMpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogaWUsIFJpQ3BGcExSciwgUUZwQ1dYX2llLCBXRmhDLCBlQ3RMcGlRWGlLVyBJUzJaIGZ0Q3BfSHBLZlEgVXNPU08gaWUgPSA6eUFxdk8gMlNqT1Mgem8gaWUgak9uNSIpOwoKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjp5QXF2TyIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7Ci8vICAgICAgICBDTFJLICJuT3FPNUogaWUsIFJpQ3BGcExSciwgUUZwQ1dYX2llLCBXRmhDLCBlQ3RMcGlRWGlLVyBJUzJaIGZ0Q3BfSHBLZlEgVXNPU08gUUZwQ1dYX2llID0gJyRHRmNmQycgMlNqT1Mgem8gaWUgak9uNSI7Ci8vICAgICAgICBDTFJLICI8QnA+IjsKICAgICAgICAkSHBLZlFfcENMS3BldCA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIFRLcENGTFIgKCRIcEtmUV9wQ0xLcGV0IEFuICRwQ0xLcGUpIHsKICAgICAgICAgICAgLy9GcHBGcl9RZnRSKCRYUml0LT50ZkJfSHBLZlF0LCAkcENMS3BlWydpZSddKTsKICAgICAgICAgICAgJFFGcENXWF9pZSA9ICRwQ0xLcGVbJ2llJ107CgogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogaWUsIFJpQ3BGcExSciwgUUZwQ1dYX2llLCBXRmhDLCBlQ3RMcGlRWGlLVyBJUzJaIGZ0Q3BfSHBLZlEgVXNPU08gUUZwQ1dYX2llID0gOjhBU09iSl9haiAyU2pPUyB6byBpZSBqT241Iik7CgogICAgICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjo4QVNPYkpfYWoiLCAkUUZwQ1dYX2llLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7Ci8vICAgICAgICAgICAgQ0xSSyAibk9xTzVKIGllLCBSaUNwRnBMUnIsIFFGcENXWF9pZSwgV0ZoQywgZUN0THBpUVhpS1cgSVMyWiBmdENwX0hwS2ZRIFVzT1NPIFFGcENXWF9pZSA9ICckUUZwQ1dYX2llJyAyU2pPUyB6byBpZSBqT241IjsKLy8gICAgICAgICAgICBDTFJLICI8QnA+IjsKICAgICAgICAgICAgJHRmQl9IcEtmUV9wQ0xLcGV0ID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgICAgIGlUIChMS2ZXWCgkdGZCX0hwS2ZRX3BDTEtwZXQpID4gbSkgewogICAgICAgICAgICAgICAgVEtwQ0ZMUiAoJHRmQl9IcEtmUV9wQ0xLcGV0IEFuICR0ZkJfcENMS3BlKSB7CiAgICAgICAgICAgICAgICAgICAgaVQgKCR0ZkJfcENMS3BlWydpZSddICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZwcEZyX1FmdFIoJFhSaXQtPnRmQl9IcEtmUXQsICR0ZkJfcENMS3BlWydpZSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFhSaXQtPkhDWHN2dENwVnBLZlFfRmNjKCR0ZkJfcENMS3BlWydpZSddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gQ2N0QyB7Ci8vICAgICAgICAgICAgICAgIGlUICgkdGZCX3BDTEtwZVsnaWUnXSAhPSAnJykgewovLy8vICAgICAgICAgICAgICAgICAgIC8vIENMUksgJHRmQl9wQ0xLcGVbJ2llJ10uJzxCcD4nOwovLyAgICAgICAgICAgICAgICAgICAgJFhSaXQtPkhDWHN2dENwVnBLZlFfRmNjKCR0ZkJfcENMS3BlWydpZSddKTsKLy8gICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRmQl9IcEtmUXQ7CiAgICB9CgogICAgVGZXTFhpS1cgNVJDTE1zdnRDcFZwS2ZRX0JyV0ZoQygkaWVfRnBwKSB7CiAgICAgICAgJGllX2xLaVcgPSBsS2lXKCcsJywgJGllX0ZwcCk7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogSVMyWiBmdENwX0hwS2ZRIFVzT1NPIFdGaEMgPSA6YkFaTyBBYmogaWUgYWIgKCRpZV9sS2lXKSIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOmJBWk8iLCAkWFJpdC0+V0ZoQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1hzdnRDcFZwS2ZRX0JyOEZwQ1dYKCRHRmNmQykgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogZnRDcF9IcEtmUSBVc09TTyBRRnBDV1hfaWUgPSA6OEFTT2JKYWoiKTsKICAgICAgICAvL0NMUksgIm5PcU81SiAqIElTMlogZnRDcF9IcEtmUSBVc09TTyBRRnBDV1hfaWUgPSAnJEdGY2ZDJyI7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6OEFTT2JKYWoiLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgovL2IySiBhYiB2bk8KICAgIFRmV0xYaUtXIEhDWHN2dENwVnBLZlFfMlNWNVJGcFgoJEdGY2ZDKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIAogICAgaWUsIFdGaEMsIFFGcENXWF9pZQpJUzJaCiAgICAobk9xTzVKIAogICAgICAgICoKICAgIElTMloKICAgICAgICBmdENwX0hwS2ZRCiAgICAyU2pPUyB6byBRRnBDV1hfaWUgLCBpZSkgUXBLZWZMWHRfdEtwWENlLAogICAgKG5PcU81SiBAUUc6PTp5QXF2TykgaVdpWGlGY2l0RlhpS1cKVXNPU08KICAgIChJYWJqX2FiX25PSihRRnBDV1hfaWUsIEBRRykgPiBtCiAgICAgICAgQWJqIAogICAgICAgIEBRRzo9NTJiNUFKKEBRRywgJywnLCBpZSkpIik7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOnlBcXZPIiwgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKCiAgICAgICAgJEhwS2ZRX3BDTEtwZXQgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKLy8gICAgICAgIFRLcENGTFIgKCRIcEtmUV9wQ0xLcGV0IEFuICR0ZkJfcENMS3BlKSB7Ci8vICAgICAgICAgICAgRnBwRnJfUWZ0UigkWFJpdC0+dGZCX0hwS2ZRdCwgJHRmQl9wQ0xLcGVbJ2llJ10pOwovLyAgICAgICAgfQogICAgICAgIHBDWGZwVyAkSHBLZlFfcENMS3BldDsKICAgIH0KCiAgICAvL05OLU4tOW1OeAogICAgVGZXTFhpS1cgTFJNdnRDcFdGaENCcmJGaEMoJEdGY2ZDKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogSVMyWiBjS0hpV19oRnRYIGtSQ3BDIGZ0Q3BXRmhDID0gOmJBWk8gIEFiaiBlQ2NDWENfVGNGSCA9IG0iKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpiQVpPIiwgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKLy9mUWVGWENlIE42LU4tOW1OeCAgYWpJNQogICAgVGZXTFhpS1cgSENYdnRDcFZwS2ZRX0ZjY19raVhSNVJpY2UoKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogSVMyWiBmdENwX0hwS2ZRIEtwZUNwIEJyIGllIEZ0TCIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgovLyBOeC1OLTltTnggIGFqSTVOIGFqSTU0IE54L205L054CiAgICBUZldMWGlLVyBIQ1h2dENwVnBLZlFfQnJXRmhDX3BLS1hXS2VDKCRHRmNmQywgJHBLS1hXS2VDKSB7Ci8vICAgICAgICBDTFJLICJuT3FPNUogaWUgSVMyWiBmdENwX0hwS2ZRIFVzT1NPIFdGaEMgPSAkR0ZjZkMgQWJqIHBLS1hXS2VDPSRwS0tYV0tlQyI7ZWlDOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogZnRDcF9IcEtmUSBVc09TTyBXRmhDID0gOmFqIEFiaiBwS0tYV0tlQz06UzIySmIyak8iKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOlMyMkpiMmpPIiwgJHBLS1hXS2VDLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyA1UkNMTXN2dENwVnBLZlFfQnJXRmhDX3BLS1hXS2VDKCRpZV9GcHAsICRwS0tYV0tlQykgewogICAgICAgICRpZV9sS2lXID0gbEtpVygnLCcsICRpZV9GcHApOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogZnRDcF9IcEtmUSBVc09TTyBXRmhDID0gOmJBWk8gQWJqIGllIGFiICgkaWVfbEtpVykgQWJqIHBLS1hXS2VDPTpTMjJKYjJqTyIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOmJBWk8iLCAkWFJpdC0+V0ZoQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOlMyMkpiMmpPIiwgJHBLS1hXS2VDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKLy9hakk1RCB4LTEtTngKICAgIFRmV0xYaUtXIGZRZUZYQ19lQ2NDWENfVGNGSFNDR0NwWCgkR0ZjZkMsICR0WEZYZnRUY0ZIID0gJ29DdCcpIHsKICAgICAgICAvLyRYUml0LT5LQmxfUGZDcHIgPSAkWFJpdC0+ZUItPlBmQ3ByKCJlQ2NDWEMgVHBLaCBmdENwIGtSQ3BDIGllPSckR0ZjZkMnIik7CiAgICAgICAgLy9wQ1hmcFcgJFhSaXQtPktCbF9QZkNwcjsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJmUWVGWEMgZnRDcCB0Q1ggdFhGWGZ0ID0gOm5KQUp2bklxQVYgLGVDY0NYQ19UY0ZIID0gbSBrUkNwQyBpZT0gOmFqIik7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOm5KQUp2bklxQVYiLCAkdFhGWGZ0VGNGSCwgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgogICAgLy9hakk1RCB4LTEtTngKICAgIFRmV0xYaUtXIGZRZUZYQ19jS0hpV19oRnRYX2VDY0NYQ19UY0ZIU0NHQ3BYKCRHRmNmQywgJHRYRlhmdFRjRkggPSAnTicpIHsKLy8gICAgICAgIENMUksgImZRZUZYQyBjS0hpV19oRnRYICBuT0ogZnRDcF90WEZYZnQgPSAnbScsIGVDY0NYQ19UY0ZIID0gTiBrUkNwQyBmdENwX2llPSAkR0ZjZkMiO2VpQzsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJmUWVGWEMgY0tIaVdfaEZ0WCAgbk9KIGZ0Q3BfdFhGWGZ0ID0gOm5KQUp2bklxQVYsIGVDY0NYQ19UY0ZIID0gbSBrUkNwQyBmdENwX2llPSA6YWoiKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6bkpBSnZuSXFBViIsICR0WEZYZnRUY0ZILCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOmFqIiwgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgcENYZnBXICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgIH0KCi8vYWpJNTkgLy9hakk1MSBORC1tOS1OeAogICAgVGZXTFhpS1cgSENYdnRDcFZwS2ZRX0ZjY196cnNpQ3BGcExScigpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGZ0Q3BfSHBLZlEgVXNPU08gUmlDcEZwTFJyPW0gMlNqT1Mgem8gaWUgOyIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgovL2FqSTUxIE5ELW05LU54CiAgICBUZldMWGlLVyBIQ1h2dENwVnBLZlFfczVLZldYX3pyOEZwQ1dYX2llKCRRRnBDV1hfaWUpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGZ0Q3BfSHBLZlEgVXNPU08gKFJpQ3BGcExScj1OIEFiaiBRRnBDV1hfaWUgPTo4QVNPYkpfYWopICIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOjhBU09iSl9haiIsICRRRnBDV1hfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgLy9hakk1MSBONi1tOS1OeAogICAgVGZXTFhpS1cgSENYdnRDcFZwS2ZRX0ZjY19VaVhSU0tLWCgpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogCiAgICBmSE4uKixpVFdmY2MoZkg5LldGaEMsJycpIEZ0IHBLS1hXS2VDX1dGaEMsaVRXZmNjKGZIOS5mdENwSHBLZlFGY2lGdCwnJykgRnQgcEtLWFdLZUNfRmNpRnRXRmhDLGlUV2ZjYyhMS1dMRlgoZkhOLldGaEMsJyB8fCAnLGZIOS5XRmhDKSxmSE4uV0ZoQykgRnQgZkhiRmhDCklTMlogZnRDcF9IcEtmUSBBbiBmSE4KICAgICBjQ1RYIEUyYWIgZnRDcF9IcEtmUSBBbiBmSDkKICAgIDJiICAgKGZITi5SaUNwRnBMUnIgPSBOIEFiaiBmSE4uUUZwQ1dYX2llIDw+IG0gQWJqICBmSE4ucEtLWFdLZUMgPSBmSDkuaWUgKQpVc09TTwogICAgKGZITi5SaUNwRnBMUnIgPSBtIEFiaiBmSE4uUUZwQ1dYX2llID0gbSkKICAgICAgICAyUyAoZkhOLlJpQ3BGcExSciA9IE4gQWJqIGZITi5RRnBDV1hfaWUgPD4gbSkKMlNqT1Mgem8gZkhOLmllLGZIOS5wS0tYV0tlQzsiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWHZ0Q3BWcEtmUV9CcmFlX1VpWFJTS0tYKCRHRmNmQykgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAKICAgIGZITi4qLGlUV2ZjYyhmSDkuV0ZoQywnJykgRnQgcEtLWFdLZUNfV0ZoQyxpVFdmY2MoZkg5LmZ0Q3BIcEtmUUZjaUZ0LCcnKSBGdCBwS0tYV0tlQ19GY2lGdFdGaEMsaVRXZmNjKExLV0xGWChmSE4uV0ZoQywnIHx8ICcsZkg5LldGaEMpLGZITi5XRmhDKSBGdCBmSGJGaEMKSVMyWiBmdENwX0hwS2ZRIEFuIGZITgogICAgIGNDVFggRTJhYiBmdENwX0hwS2ZRIEFuIGZIOQogICAgMmIgICAoZkhOLlJpQ3BGcExSciA9IE4gQWJqIGZITi5RRnBDV1hfaWUgPD4gbSBBYmogIGZITi5wS0tYV0tlQyA9IGZIOS5pZSApClVzT1NPICBmSE4uaWUgPTphaiBBYmogKAogICAgKGZITi5SaUNwRnBMUnIgPSBtIEFiaiBmSE4uUUZwQ1dYX2llID0gbSkKICAgICAgICAyUyAoZkhOLlJpQ3BGcExSciA9IE4gQWJqIGZITi5RRnBDV1hfaWUgPD4gbSkpCjJTak9TIHpvIGZITi5pZSxmSDkucEtLWFdLZUM7Iik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6YWoiLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWGpDRmNaQ2hfdldBdHRpSFdDZV96clZwS2ZRX3pyc2lDcEZwTFJyKCRIaWUsICRRaWUpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQyBJUzJaIGZ0Q3AgQW4gZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCBBbiBjIDJiIGYuaWUgPSBjLmZ0Q3BfaWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMmFiIGZ0Q3BfSHBLZlEgQW4gSCAyYiAoSWFial9hYl9uT0ooSC5pZSwgYy5wS2NDKSA+IG0gMlMgSWFial9hYl9uT0ooSC5pZSwgYy5GY1hfcEtjQykgPiBtIDJTIElhYmpfYWJfbk9KKEguaWUsIGMuQ2hRX3BLY0MpID4gbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzT1NPIGMucEtjQyAhPSAnOScgQWJqIGMucEtjQyAhPSAnTicgQWJqIGMuZUNjQ1hDX1RjRkggPSAnbScgQWJqIGMuZnRDcF90WEZYZnQgPSAnTicgQWJqIEguaWUgPSA6VmFqICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJqIGYuaWUgYjJKIGFiIChuT3FPNUogaENoX2llIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIFVzT1NPIFFwS2xDTFhfaWUgPSA6OGFqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlMydjggem8gYy5mdENwX2llIDJTak9TIHpvIGYuVFdGaEMgQW41Iik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOlZhaicgPT4gJEhpZSwgJzo4YWonID0+ICRRaWUpKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICAvL2FqSTU0IE54L205L054CiAgICBUZldMWGlLVyA1UkNMTXZ0Q3BXRmhDX0ZHRmljRkJpY2lYcl9PaFFjS3JDQ3lpQ2soJGZ0Q3BXRmhDKSB7CiAgICAgICAgJFBmQ3ByID0gInRDY0NMWCBmLiogVHBLaCBmdENwIEFuIGYKRTJhYiBjS0hpV19oRnRYIEFuIGMgMmIgYy5mdENwX2llPWYuaWUgCmtSQ3BDIGNLa0NwKGMuZnRDcFdGaEMpPTphaiBBYmogYy5lQ2NDWENfVGNGSD0nbSciOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoJFBmQ3ByKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsIHRYcFhLY0trQ3AoJGZ0Q3BXRmhDKSwgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgLy9hakk1NCBOeC9tOS9OeAogICAgVGZXTFhpS1cgNVJDTE1PaEZpY19GR0ZpY0ZCaWNpWHJfT2hRY0tyQ0N5aUNrKCRDaEZpYykgewogICAgICAgICRQZkNwciA9ICJ0Q2NDTFggZi4qIFRwS2ggZnRDcCBBbiBmCkUyYWIgY0tIaVdfaEZ0WCBBbiBjIDJiIGMuZnRDcF9pZT1mLmllIAprUkNwQyBmLkNoRmljPTpPWkFhcV9haiBBYmogYy5lQ2NDWENfVGNGSD0nbSciOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoJFBmQ3ByKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpPWkFhcV9haiIsICRDaEZpYywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgLy9hakk1NCBOeC9tOS9OeAogICAgVGZXTFhpS1cgSENYQWNjT2hGaWNfT2hRY0tyQ0N5aUNrKCkgewogICAgICAgICRQZkNwciA9ICJ0Q2NDTFggZi4qLCBjLmZ0Q3BXRmhDIFRwS2ggZnRDcCBBbiBmCkUyYWIgY0tIaVdfaEZ0WCBBbiBjIDJiIGMuZnRDcF9pZT1mLmllIAprUkNwQyBjLmVDY0NYQ19UY0ZIPSdtJyI7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygkUGZDcHIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgJEZwcEZyT2hGaWMgPSBGcHBGcignQ2hGaWNfaWV0JyA9PiBGcHBGcl9MS2NmaFcoJFhSaXQtPnBDWGZwVywgJ0NoRmljJyksICdpaEdfaWV0JyA9PiBGcHBGcl9MS2NmaFcoJFhSaXQtPnBDWGZwVywgJ2hGdFhDcF9HRmNmQ19pZScpLAogICAgICAgICAgICAnaWhfaWV0JyA9PiBGcHBGcl9MS2NmaFcoJFhSaXQtPnBDWGZwVywgJ2hGdFhDcF9HRmNmQ19pZScpLCAnZnRDcF9pZXQnID0+IEZwcEZyX0xLY2ZoVygkWFJpdC0+cENYZnBXLCAnaWUnKSwgJ2Z0Q3BXRmhDdCcgPT4gRnBwRnJfTEtjZmhXKCRYUml0LT5wQ1hmcFcsICdmdENwV0ZoQycpKTsKLy8gICAgICAgICRGcHBGck9oRmljID0gRnBwRnIoJ0NoRmljX2lldCcgPT4gRnBwRnIoKSwgJ2loR19pZXQnID0+IEZwcEZyKCksICdpaF9pZXQnID0+IEZwcEZyKCksICdmdENwX2lldCcgPT4gRnBwRnIoKSk7Ci8vICAgICAgICBUS3BDRkxSICgkWFJpdC0+cENYZnBXIEZ0ICRNQ3IgPT4gJEdGY2ZDKSB7Ci8vICAgICAgICAgICAgRnBwRnJfUWZ0UigkRnBwRnJPaEZpY1snQ2hGaWNfaWV0J10sIFhwaWgoJEdGY2ZDWydDaEZpYyddKSk7Ci8vICAgICAgICAgICAgRnBwRnJfUWZ0UigkRnBwRnJPaEZpY1snaWhHX2lldCddLCAkR0ZjZkNbJ2hGdFhDcF9HRmNmQ19pZSddKTsKLy8gICAgICAgICAgICBGcHBGcl9RZnRSKCRGcHBGck9oRmljWydpaF9pZXQnXSwgJEdGY2ZDWydoRnRYQ3BfaWUnXSk7Ci8vICAgICAgICAgICAgRnBwRnJfUWZ0UigkRnBwRnJPaEZpY1snZnRDcF9pZXQnXSwgJEdGY2ZDWydpZSddKTsKLy8gICAgICAgIH0KLy8gICAgICAgIENMUksgJzxRcEM+JzsKLy8gICAgICAgIFFwaVdYX3AoJEZwcEZyT2hGaWMpOwogICAgICAgIHBDWGZwVyAkRnBwRnJPaEZpYzsKICAgIH0KCiAgICAvL2FqSTU0IDk5LW05LU54CiAgICAvL0dpZVJyRiA5Ny9teC85bTltCiAgICBUZldMWGlLVyBDZWlYX2Z0Q3BfQ2hRKCRHRmNmQykgewoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJmUWVGWEMgZnRDcCB0Q1gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdGaENlX1RjRkggPSA6YkFaT2pfSXFBViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRYRlhmdD06bkpBSnZuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxYaUdGWENlX1hpaEMgPSA6QTVKYXlBSk9qSmFaTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDRkxYaUdGWENlX1hpaEMgPSA6ak9BNUpheUFKT2pKYVpPCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JDcEMgaWUgPSA6YWoiKTsKCgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOmJBWk9qX0lxQVYnLCAkWFJpdC0+ZnRDcF9YclFDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6bkpBSnZuJywgJFhSaXQtPnRYRlhmdCwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOmFqJywgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6QTVKYXlBSk9qSmFaTycsICRYUml0LT5GTFhpR0ZYQ2VfWGloQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOmpPQTVKYXlBSk9qSmFaTycsICRYUml0LT5lQ0ZMWGlHRlhDZV9YaWhDLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgogICAgLy9hakk1NCA5OS1tOS1OeAogICAgVGZXTFhpS1cgQ2VpWF9jS0hpV19oRnRYX0NoUSgkR0ZjZkMpIHsKCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygiZlFlRlhDIGNLSGlXX2hGdFggdENYIHBLY0MgPSA6UzJxTyxGY1hfcEtjQyA9IDpBcUpfUzJxTyxmdENwX3RYRlhmdD06dm5PU19uSkFKdm4ga1JDcEMgZnRDcF9pZSAgID0gOnZuT1NfYWoiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpTMnFPJywgJFhSaXQtPnBLY0MsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpBcUpfUzJxTycsICRYUml0LT5GY1hfcEtjQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOnZuT1NfbkpBSnZuJywgJFhSaXQtPmZ0Q3BfdFhGWGZ0LCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6dm5PU19haicsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKICAgIC8vYWpJNTQgOW0tbTktOW1OeAogICAgVGZXTFhpS1cgcENXQ2tfUUZ0dGtLcGVfZUZYQygkaWUsICRlRlhDKSB7CgogICAgICAgIC8qIENMUksgInY4akFKTyBjS0hpV19oRnRYIG5PSiBwQ1dDa0NlX0ZYID0gJyIuJGVGWEMuIicgVXNPU08gZnRDcF9pZSA9ICIuJGllOwoKICAgICAgICAgIENnaVg7ICovCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygidjhqQUpPIGNLSGlXX2hGdFggbk9KIHBDV0NrQ2VfRlggPSA6akFKTyBVc09TTyBmdENwX2llID0gOmFqIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6YWonLCAkaWUsIDhqMjo6OEFTQVpfYWJKKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpqQUpPJywgJGVGWEMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKICAgIC8vYWpJNTQgOTEtbTktOW1OeAogICAgVGZXTFhpS1cgZlFlRlhDX2hGdFhDcF9pV3Z0Q3AoJGllKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygidjhqQUpPIGZ0Q3Agbk9KIGhGdFhDcF9pZSA9IDpaQW5KT1NfYWosaEZ0WENwX0dGY2ZDX2llID0gOlpBbkpPU195QXF2T19haiBVc09TTyBpZSA9IDphaiIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOlpBbkpPU19haicsICRYUml0LT5oRnRYQ3BfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpaQW5KT1NfeUFxdk9fYWonLCAkWFJpdC0+aEZ0WENwX0dGY2ZDX2llLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6YWonLCAkaWUsIDhqMjo6OEFTQVpfYWJKKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKICAgICNhakk1RCA5LW0xLU54CgogICAgVGZXTFhpS1cgSENYc3Z0Q3BWcEtmUV9CclNLS1hiS2VDKCRHRmNmQykgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogZnRDcF9IcEtmUSBVc09TTyBwS0tYV0tlQyA9IDpTMjJKYjJqTyBLcGVDcCBCciBRRnBDV1hfaWUiKTsKICAgICAgICAvL0NMUksgIm5PcU81SiAqIElTMlogZnRDcF9IcEtmUSBVc09TTyBRRnBDV1hfaWUgPSAnJEdGY2ZDJyI7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6UzIySmIyak8iLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgJEZwcEZyID0gRnBwRnIoKTsKICAgICAgICBUS3BDRkxSICgkWFJpdC0+cENYZnBXIEZ0ICRHRmNmQykgewogICAgICAgICAgICBGcHBGcl9RZnRSKCRGcHBGciwgJEdGY2ZDW2llXSk7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyAkRnBwRnI7CiAgICB9CgogICAgI2FqSTVEIE5tLW0xLU54CgogICAgVGZXTFhpS1cgSENYc3Z0Q3BWcEtmUV9CclNLS1hiS2VDX2pGWEZYRkJjQygkdFVSQ3BDLCAkS3BlQ3BCciwgJGNpaGlYLCAkR0ZjZkMpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogbjBxXzVBcTVfSTJ2YmpfUzJVbiBmSE4uaWUsIGZITi5XRmhDLCBmSE4uZnRDcEhwS2ZRRmNpRnQsIGZIOS5XRmhDIEZ0IFFGcENXWFdGaEMsIGZIOS5mdENwSHBLZlFGY2lGdCBGdCBRRnBDV1hmdENwSHBLZlFGY2lGdCxmSDkuaWUgRnQgUUZwQ1dYaWUgICIKICAgICAgICAgICAgICAgIC4gIklTMlogZnRDcF9IcEtmUSBmSE4gbEtpVyBmdENwX0hwS2ZRIGZIOSAyYiBmSDkuaWUgPSBmSE4uUUZwQ1dYX2llIFVzT1NPIGZITi5wS0tYV0tlQyA9ICA6UzIySmIyak8gJHRVUkNwQyAgJEtwZUNwQnIgJGNpaGlYIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6UzIySmIyak8iLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgI2FqSTVEIG0xLW0xLU54CgogICAgVGZXTFhpS1cgSENYdnRDcF9PaFFxS0hpVygpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGZ0Q3Aga1JDcEMgaEZ0WENwX2llICE9IG0gQWJqIGVDY0NYQ19UY0ZIID0gbSIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICAvL2lqSTVEIG0xLW0xLTltTngKICAgIFRmV0xYaUtXIEhDWHZ0Q3BWcEtmUV9CcmJLWDVSaWNlOEZwQ1dYKCRmdENwX3BLY0MpIHsKLy8gICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoInRDY0NMWCAgIFZTMnY4XzUyYjVBSihlaXRYaVdMWCBYTi5pZSkgRnQgTEtjTiwgICBWUzJ2OF81MmI1QUooZWl0WGlXTFggWE4uUUZwQ1dYX2llKSAgRnQgTEtjOQovL1RwS2ggICAgKHRDY0NMWCAqIFRwS2ggZnRDcF9IcEtmUSBLcGVDcCBCciBRRnBDV1hfaWUpIFhOLAovLyAgICAgICAgKHRDY0NMWCBAUUcgOj0gJyRmdENwX3BLY0MnKSBYOSAKLy9rUkNwQyAgIChUaVdlX2lXX3RDWChYTi5RRnBDV1hfaWUsIEBRRykgPiBtICkKLy9GV2UgICAgIEBRRyA6PSBMS1dMRlgoQFFHLCAnLCcsIFhOLmllKTsiKTsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogICBSaS5pZSwgUUZwQ1dYX2llLCBjQ0dDYwpJUzJaICAgICgKICAgICAgICBuT3FPNUogIFJpQ3BGcExScl9mdENwSHBLZlEoaWUpIEFuIGllLCBAY0NHQ2MgQW4gY0NHQ2MKICAgICAgICBJUzJaICAgICgKICAgICAgICAgICAgICAgIG5PcU81SiAgQHRYRnBYX2tpWFIgOj0gOnZuT1NfUzJxTywKICAgICAgICAgICAgICAgICAgICAgICAgQGllIDo9IEB0WEZwWF9raVhSLAogICAgICAgICAgICAgICAgICAgICAgICBAY0NHQ2MgOj0gbQogICAgICAgICAgICAgICAgKSBHRnB0LCBmdENwX0hwS2ZRCiAgICAgICAgVXNPU08gICBAaWUgYW4gYjJKIGJ2cXEKICAgICAgICApIFJLIApFMmFiICAgIGZ0Q3BfSHBLZlEgUmkKMmIgICAgICBSaS5pZSA9IFJLLmllOyNSaUNwRnBMUnJfTEtXV0NMWF9Ccl9RRnBDV1hfQ1BfUXBpS3BfaWUiKTsKCiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6dm5PU19TMnFPIiwgJGZ0Q3BfcEtjQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwovLyAgICAgICAgJHBDdGZjWF9GcHAgPSBGcHBGcl9oQ3BIQyhDZ1FjS2VDKCcsJywgJFhSaXQtPnBDWGZwV1ttXVsnTEtjTiddKSwgQ2dRY0tlQygnLCcsICRYUml0LT5wQ1hmcFdbbV1bJ0xLYzknXSkpOwovLyAgICAgICAgJHBDdGZjWF9GcHAgPSBGcHBGcl9UaWNYQ3AoRnBwRnJfZldpUGZDKCRwQ3RmY1hfRnBwKSk7Ci8vICAgICAgICBwQ1hmcFcgQGxLaVcoJywnLCAkcEN0ZmNYX0ZwcCk7CiAgICAgICAgJHBDdGZjWF9GcHAgPSBGcHBGcl9MS2NmaFcoJFhSaXQtPnBDWGZwVywgJ2llJyk7CiAgICAgICAgcENYZnBXIEBsS2lXKCcsJywgJHBDdGZjWF9GcHApOwogICAgfQoKICAgIC8vaWpJNUQgbTEtbTEtOW1OeAogICAgVGZXTFhpS1cgSENYc3Z0Q3BWcEtmUV9CclNLS1hiS2VDYktYYVcoJEdGY2ZDLCAkV0tYX2lXKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogSVMyWiBmdENwX0hwS2ZRIFVzT1NPIHBLS1hXS2VDID0gOlMyMkpiMmpPIEFiaiBpZSBiMkogYWIoJFdLWF9pVykgS3BlQ3AgQnIgUUZwQ1dYX2llIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6UzIySmIyak8iLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgJEZwcEZyID0gRnBwRnIoKTsKICAgICAgICBUS3BDRkxSICgkWFJpdC0+cENYZnBXIEZ0ICRHRmNmQykgewogICAgICAgICAgICBGcHBGcl9RZnRSKCRGcHBGciwgJEdGY2ZDW2llXSk7CiAgICAgICAgfQogICAgICAgIHBDWGZwVyAkRnBwRnI7CiAgICB9CgogICAgLy9pakk1RCBtNC1tMS05bU54CiAgICBUZldMWGlLVyBIQ1h2dENwakNYRmljdHpyWkZ0WENwYWVfeUZjZkMoJGhGdFhDcF9pZSwgJGhGdFhDcF9HRmNmQ19pZSkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogZnRDcCBVc09TTyBoRnRYQ3BfaWUgPSA6WkFuSk9TX2FqIEFiaiBoRnRYQ3BfR0ZjZkNfaWUgPSA6WkFuSk9TX3lBcXZPX2FqIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6WkFuSk9TX2FqIiwgJGhGdFhDcF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOlpBbkpPU195QXF2T19haiIsICRoRnRYQ3BfR0ZjZkNfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CgogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWHZ0Q3BWcEtmUV9GY2NfVWlYUlNLS1hfenJiRmhDMnBBY2lGdCgkVGljWENwKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIAogICAgZkhOLiosaVRXZmNjKGZIOS5XRmhDLCcnKSBGdCBwS0tYV0tlQ19XRmhDLGlUV2ZjYyhmSDkuZnRDcEhwS2ZRRmNpRnQsJycpIEZ0IHBLS1hXS2VDX0ZjaUZ0V0ZoQyxpVFdmY2MoTEtXTEZYKGZITi5XRmhDLCcgfHwgJyxmSDkuV0ZoQyksZkhOLldGaEMpIEZ0IGZIYkZoQwpJUzJaIGZ0Q3BfSHBLZlEgQW4gZkhOCiAgICAgY0NUWCBFMmFiIGZ0Q3BfSHBLZlEgQW4gZkg5CiAgICAyYiAgIChmSE4uUmlDcEZwTFJyID0gTiBBYmogZkhOLlFGcENXWF9pZSA8PiBtIEFiaiAgZkhOLnBLS1hXS2VDID0gZkg5LmllICkKVXNPU08KICAgICgoZkhOLlJpQ3BGcExSciA9IG0gQWJqIGZITi5RRnBDV1hfaWUgPSBtKQogICAgICAgIDJTIChmSE4uUmlDcEZwTFJyID0gTiBBYmogZkhOLlFGcENXWF9pZSA8PiBtKSkgQWJqIChmSE4uV0ZoQyBjaU1DICclJFRpY1hDcCUnIDJTIGZITi5mdENwSHBLZlFGY2lGdCBjaU1DICclJFRpY1hDcCUnICkKMlNqT1Mgem8gZkhOLmllLGZIOS5wS0tYV0tlQzsiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7Ci8vICAgICAgICBDTFJLICJuT3FPNUogCi8vICAgIGZITi4qLGlUV2ZjYyhmSDkuV0ZoQywnJykgRnQgcEtLWFdLZUNfV0ZoQyxpVFdmY2MoZkg5LmZ0Q3BIcEtmUUZjaUZ0LCcnKSBGdCBwS0tYV0tlQ19GY2lGdFdGaEMsaVRXZmNjKExLV0xGWChmSE4uV0ZoQywnIHx8ICcsZkg5LldGaEMpLGZITi5XRmhDKSBGdCBmSGJGaEMKLy9JUzJaIGZ0Q3BfSHBLZlEgQW4gZkhOCi8vICAgICBjQ1RYIEUyYWIgZnRDcF9IcEtmUSBBbiBmSDkKLy8gICAgMmIgICAoZkhOLlJpQ3BGcExSciA9IE4gQWJqIGZITi5RRnBDV1hfaWUgPD4gbSBBYmogIGZITi5wS0tYV0tlQyA9IGZIOS5pZSApCi8vVXNPU08KLy8gICAgKChmSE4uUmlDcEZwTFJyID0gbSBBYmogZkhOLlFGcENXWF9pZSA9IG0pCi8vICAgICAgICAyUyAoZkhOLlJpQ3BGcExSciA9IE4gQWJqIGZITi5RRnBDV1hfaWUgPD4gbSkpIEFiaiAoZkhOLldGaEMgY2lNQyAnJSRUaWNYQ3AlJyAyUyBmSE4uZnRDcEhwS2ZRRmNpRnQgY2lNQyAnJSRUaWNYQ3AlJyApCi8vMlNqT1Mgem8gZkhOLmllLGZIOS5wS0tYV0tlQzsiOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCQoJIFRmV0xYaUtXIEhDWHZ0Q3BqQ1FYKCRUaWNYQ3ApIHsKCSAvKiBDTFJLICJuT3FPNUogKiBJUzJaIGVDUUZwWGhDV1ggVXNPU08gKGVDUV9XRmhDIGNpTUMgJyUkVGljWENwJScpIDJTIAogKGVDUVhfdFJLcFhXRmhDIGNpTUMgJyUkVGljWENwJScgKSI7ZWlDOyAqLwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogZUNRRnBYaENXWCBVc09TTyAoZUNRX1dGaEMgY2lNQyAnJSRUaWNYQ3AlJykgMlMgCiAoZUNRWF90UktwWFdGaEMgY2lNQyAnJSRUaWNYQ3AlJyApIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgCiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIC8vYWpJNUQgbTMtbTEtOW1OeAogICAgVGZXTFhpS1cgZlFlRlhDX2hGdFhDcGllX2Z0Q3BIcEtmUSgkZkhwUSwgJGllKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygidjhqQUpPIGZ0Q3BfSHBLZlEgbk9KIGhGdFhDcF9pZSA9IDpaQW5KT1NfYWogVXNPU08gaWUgPSA6dlZTOF9haiIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOlpBbkpPU19haicsICRpZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOnZWUzhfYWonLCAkZkhwUSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgogICAgLy9hakk1RCBtMy1tMS05bU54CiAgICBUZldMWGlLVyBIQ1hfOHBDR2lLZnRfSHBRV0ZoQ196cmhpZSgkaEZ0WENwX2llKSB7Ci8vICAgICAgICBDTFJLICJuT3FPNUogKiBJUzJaIGZ0Q3BfSHBLZlEgVXNPU08gaEZ0WENwX2llID0gJGhGdFhDcF9pZSI7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogSVMyWiBmdENwX0hwS2ZRIFVzT1NPIGhGdFhDcF9pZSA9IDpaQW5KT1NfYWogIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6WkFuSk9TX2FqIiwgJGhGdFhDcF9pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKCiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgovL2FqSTVEIE5tLW0xLTltTngKICAgIFRmV0xYaUtXIEhDWHN2dENwVnBLZlFfQnJTS0tYYktlQ19uQ0ZwTFIoJEdGY2ZDLCAkVGljWENwKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICAqIElTMlogZnRDcF9IcEtmUSBVc09TTyBwS0tYV0tlQyA9IDpTMjJKYjJqTyBBYmogKFdGaEMgY2lNQyAnJSRUaWNYQ3AlJyAyUyBmdENwSHBLZlFGY2lGdCAgY2lNQyAnJSRUaWNYQ3AlJyApIEtwZUNwIEJyIFFGcENXWF9pZSIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOlMyMkpiMmpPIiwgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKLy9hakk1RCBObS1tMS05bU54CiAgICBUZldMWGlLVyBIQ1hzdnRDcFZwS2ZRX0JyU0tLWGJLZUNiS1hhV19uQ0ZwTFIoJEdGY2ZDLCAkV0tYX2lXLCAkVGljWENwKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogSVMyWiBmdENwX0hwS2ZRIFVzT1NPIHBLS1hXS2VDID0gOlMyMkpiMmpPIEFiaiBpZSBiMkogYWIoJFdLWF9pVykgQWJqIChXRmhDIGNpTUMgJyUkVGljWENwJScgMlMgZnRDcEhwS2ZRRmNpRnQgIGNpTUMgJyUkVGljWENwJScgKSAgS3BlQ3AgQnIgUUZwQ1dYX2llIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6UzIySmIyak8iLCAkR0ZjZkMsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgojTkQtbTEtTngKCiAgICBUZldMWGlLVyBIQ1hqQ0ZjWkNoX0F0dGlIV0NlX3pyVnBLZlFfbkNGcExSKCR0Q0ZwTFIsICRIaWUsICRRaWUpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQyxjLmZ0Q3BXRmhDIElTMlogZnRDcCBBbiBmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIEFuIGMgMmIgZi5pZSA9IGMuZnRDcF9pZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgZnRDcF9IcEtmUSBBbiBIIDJiIChJYWJqX2FiX25PSihILmllLCBjLnBLY0MpID4gbSAyUyBJYWJqX2FiX25PSihILmllLCBjLkNoUV9wS2NDKSA+IG0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc09TTyBjLnBLY0MgIT0gJzknIEFiaiBjLnBLY0MgIT0gJ04nIEFiaiBjLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjLmVDY0NYQ19UY0ZIID0gJ20nICRIaWUgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJqIGYuaWUgIGFiIChuT3FPNUogaENoX2llIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIFVzT1NPIFFwS2xDTFhfaWUgPSA6OGFqKSBBYmogKCBjLmZ0Q3BXRmhDIGNpTUMgJyUkdENGcExSJScgMlMgNTJiNUFKKGYuVFdGaEMsJyAnLCBmLmhXRmhDLCcgJyxmLmNXRmhDKSBjaU1DICclJHRDRnBMUiUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlMydjggem8gYy5mdENwX2llIDJTak9TIHpvIGYuVFdGaEMgQW41Iik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOjhhaicgPT4gJFFpZSkpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfSAKCQoJCgkgVGZXTFhpS1cgSENYakNGY1pDaF9BdHRpSFdDZV96cmpDUVhfbkNGcExSKCR0Q0ZwTFIsICRIaWUsICRRaWUpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQyxjLmZ0Q3BXRmhDIElTMlogZnRDcCBBbiBmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIEFuIGMgMmIgZi5pZSA9IGMuZnRDcF9pZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgZUNRRnBYaENXWCBBbiBIIDJiIChJYWJqX2FiX25PSihILmllLCBmLmVDUUZwWGhDV1hfaWUpID4gbSAyUyBJYWJqX2FiX25PSihILmllLCBjLkNoUV9wS2NDKSA+IG0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc09TTyBjLnBLY0MgIT0gJzknIEFiaiBjLnBLY0MgIT0gJ04nIEFiaiBjLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjLmVDY0NYQ19UY0ZIID0gJ20nICRIaWUgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJqIGYuaWUgIGFiIChuT3FPNUogaENoX2llIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIFVzT1NPIFFwS2xDTFhfaWUgPSAkUWllKSBBYmogKCBjLmZ0Q3BXRmhDIGNpTUMgJyUkdENGcExSJScgMlMgNTJiNUFKKGYuVFdGaEMsJyAnLCBmLmhXRmhDLCcgJyxmLmNXRmhDKSBjaU1DICclJHRDRnBMUiUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlMydjggem8gYy5mdENwX2llIDJTak9TIHpvIGYuVFdGaEMgQW41Iik7CgkJCQkJCQkJICAvL1FwaVdYX3AoJFhSaXQtPnRYUik7Q2dpWDsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgojTkQtbTEtTngKCiAgICBUZldMWGlLVyBIQ1hqQ0ZjWkNoX0F0dGlIV0NlX3pyVnBLZlFfYkNrKCRIaWUsICRRaWUpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQyxjLmZ0Q3BXRmhDIElTMlogZnRDcCBBbiBmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIEFuIGMgMmIgZi5pZSA9IGMuZnRDcF9pZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgZnRDcF9IcEtmUSBBbiBIIDJiIChJYWJqX2FiX25PSihILmllLCBjLnBLY0MpID4gbSAyUyBJYWJqX2FiX25PSihILmllLCBjLkNoUV9wS2NDKSA+IG0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc09TTyBjLnBLY0MgIT0gJzknIEFiaiBjLnBLY0MgIT0gJ04nIEFiaiBjLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjLmVDY0NYQ19UY0ZIID0gJ20nICRIaWUgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJqIGYuaWUgIGFiIChuT3FPNUogaENoX2llIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIFVzT1NPIFFwS2xDTFhfaWUgPSA6OGFqKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZTMnY4IHpvIGMuZnRDcF9pZSAyU2pPUyB6byBmLlRXRmhDIEFuNSIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoRnBwRnIoJzo4YWonID0+ICRRaWUpKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICAvL2FqSTU2IDlOL20xOW1OeAogICAgVGZXTFhpS1cgSENYc3Z0Q3BWcEtmUV9CclNLS1hiS2VDYktYYVdfbkNGcExSX0NnTENjKCRHRmNmQywgJFdLWF9pVywgJFRpY1hDcCkgewovLyAgICAgICAgQ0xSSyAibk9xTzVKICogSVMyWiBmdENwX0hwS2ZRIFVzT1NPIHBLS1hXS2VDID0gJEdGY2ZDIEFiaiBpZSBiMkogYWIoJFdLWF9pVykgQWJqIChXRmhDID0gJyRUaWNYQ3AnKSAgS3BlQ3AgQnIgUUZwQ1dYX2llIjtlaUM7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogSVMyWiBmdENwX0hwS2ZRIFVzT1NPIHBLS1hXS2VDID0gOlMyMkpiMmpPIEFiaiBpZSBiMkogYWIoJFdLWF9pVykgQWJqIChXRmhDID0gOklhcUpPUykgIEtwZUNwIEJyIFFGcENXWF9pZSIpOwoKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpJYXFKT1MiLCAkVGljWENwLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOlMyMkpiMmpPIiwgJEdGY2ZDLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgICM5OS1tMS1OeCBTaUhSWHQgY2l0WCBjS0ZlCgogICAgVGZXTFhpS1cgSENYakNGY1pDaF9BdHRpSFdDZV96clZwS2ZRX3FpaGlYKCRIaWUsICRRaWUsICRjaWhpWCA9ICIgIHFhWmFKICBtLEQiKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGYuaWUsIGYuVFdGaEMsIGYuaFdGaEMsIGYuY1dGaEMsYy5mdENwV0ZoQyBJUzJaIGZ0Q3AgQW4gZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCBBbiBjIDJiIGYuaWUgPSBjLmZ0Q3BfaWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMmFiIGZ0Q3BfSHBLZlEgQW4gSCAyYiAoSWFial9hYl9uT0ooSC5pZSwgYy5wS2NDKSA+IG0gMlMgSWFial9hYl9uT0ooSC5pZSwgYy5DaFFfcEtjQykgPiBtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNPU08gYy5wS2NDICE9ICc5JyBBYmogYy5wS2NDICE9ICdOJyBBYmogYy5mdENwX3RYRlhmdCA9ICdOJyBBYmogYy5lQ2NDWENfVGNGSCA9ICdtJyAkSGllICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFiaiBmLmllICBhYiAobk9xTzVKIGhDaF9pZSBJUzJaIEZ0dGlIV19oQ2hfUXBLbENMWCBVc09TTyBRcEtsQ0xYX2llID0gOjhhaikgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2loaVgiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKEZwcEZyKCc6OGFqJyA9PiAkUWllKSk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgkKCVRmV0xYaUtXIEhDWGpDRmNaQ2hfQXR0aUhXQ2VfenJqQ1FYX3FpaGlYKCRIaWUsICRRaWUsICRjaWhpWCA9ICIgIHFhWmFKICBtLEQiKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGYuaWUsIGYuVFdGaEMsIGYuaFdGaEMsIGYuY1dGaEMsYy5mdENwV0ZoQyBJUzJaIGZ0Q3AgQW4gZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCBBbiBjIDJiIGYuaWUgPSBjLmZ0Q3BfaWUKCQkJCQkJCQkgICBFMmFiIGVDUUZwWGhDV1ggQW4gSCAyYiAoSWFial9hYl9uT0ooSC5pZSwgZi5lQ1FGcFhoQ1dYX2llKSA+IG0gMlMgSWFial9hYl9uT0ooSC5pZSwgYy5DaFFfcEtjQykgPiBtKQoJCQkJCQkJCSAgIFVzT1NPIGMucEtjQyAhPSAnOScgQWJqIGMucEtjQyAhPSAnTicgQWJqIGMuZnRDcF90WEZYZnQgPSAnTicgQWJqIGMuZUNjQ1hDX1RjRkggPSAnbScgJEhpZSAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYmogZi5pZSAgYWIgKG5PcU81SiBoQ2hfaWUgSVMyWiBGdHRpSFdfaENoX1FwS2xDTFggVXNPU08gUXBLbENMWF9pZSA9IDo4YWopIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNpaGlYIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOjhhaicgPT4gJFFpZSkpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoJCgkKCiM5NC1tMS1OeCBmUUZlWEMgdGZCSHBLZlEgcEN0WHBpTFhDZSBUY0ZICgogICAgVGZXTFhpS1cgZlFlRlhDbmZCVnBLZlFTQ3RYcGlMWENlX1RjRkgoJHBLS1hXS2VDX2llLCAkV0ZoQ2VfVGNGSCkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoInY4akFKTyBmdENwX0hwS2ZRIG5PSiBXRmhDZV9UY0ZIPTpiQVpPal9JcUFWIFVzT1NPIHBLS1hXS2VDID06UzIySmIyak8iKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpTMjJKYjJqTycsICRwS0tYV0tlQ19pZSwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygnOmJBWk9qX0lxQVYnLCAkV0ZoQ2VfVGNGSCwgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICB9CgovL25waSBUS3Aga0twTVRjS2sKCiAgICBUZldMWGlLVyBIQ1g4cEtsQ0xYX1pDaF9BZlhLKCRRX2llLCAkR0ZjZkMpIHsKCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIFFoQ2guUXBLbENMWF9pZSwgUWhDaC5wS2NDLCBmdENwLmllLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAgQW4gUWhDaAogICAgICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRaENoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSA6OF9haiBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5lQ2NDWENfVGNGSCA9ICdtJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nCiAgICAgICAgICAgICAgICAgQWJqIChmdENwLlRXRmhDIGNpTUMgJyUkR0ZjZkMlJyAyUyBmdENwLmhXRmhDIGNpTUMgJyUkR0ZjZkMlJyAyUyBmdENwLmNXRmhDIGNpTUMgJyUkR0ZjZkMlJykKICAgICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoRnBwRnIoJzo4X2FqJyA9PiAkUV9pZSkpOwogICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIFFwS2xDTFguaWUgRnQgUXBLbENMWF9pZSwgOSBGdCBwS2NDLCBmdENwLmllLCBmdENwLlRXRmhDLCBmdENwLmhXRmhDLCBmdENwLmNXRmhDIElTMlogYGZ0Q3BgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgUXBLbENMWCAyYiBmdENwLmllID0gUXBLbENMWC5RcEtsQ0xYX2hGV0ZIQ3AgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFwS2xDTFguUXBLbENMWF9oRldGSENwICA9IGNLSGlXX2hGdFguZnRDcF9pZSAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc09TTyBRcEtsQ0xYLmllID0gOjhhagogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyAgQWJqIGNLSGlXX2hGdFguZUNjQ1hDX1RjRkggPSAnbScgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFiaiAoZnRDcC5UV0ZoQyBjaU1DICclJEdGY2ZDJScgMlMgZnRDcC5oV0ZoQyBjaU1DICclJEdGY2ZDJScgMlMgZnRDcC5jV0ZoQyBjaU1DICclJEdGY2ZDJScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQyhGcHBGcignOjhhaicgPT4gJFFfaWUpKTsKICAgICAgICAkWFJpdC0+cENYZnBXOSA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGMucEtjQywgZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQyBJUzJaIGBjS0hpV19oRnRYYCBBbiBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBFMmFiIGZ0Q3AgQW4gZiAyYiBmLmllID0gYy5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBVc09TTyBjLmVDY0NYQ19UY0ZIID0gJ20nIAogICAgICAgICAgICAgICAgIEFiaiBjLmZ0Q3BfdFhGWGZ0ID0gJ04nCiAgICAgICAgICAgICAgICAgQWJqIChmLlRXRmhDIGNpTUMgJyUkR0ZjZkMlJyAyUyBmLmhXRmhDIGNpTUMgJyUkR0ZjZkMlJyAyUyBmLmNXRmhDIGNpTUMgJyUkR0ZjZkMlJykKICAgICAgICAgICAgICAgICBWUzJ2OCB6byBjLmZ0Q3BfaWUKICAgICAgICAgICAgICAgICAyU2pPUyB6byBmLlRXRmhDIEFuNSIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXMSA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CgogICAgICAgIHBDWGZwVyBGcHBGcl9oQ3BIQygkWFJpdC0+cENYZnBXTiwgJFhSaXQtPnBDWGZwVzksICRYUml0LT5wQ1hmcFcxKTsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1hBY2NfbkEoKSB7CgogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogY0tIaVdfaEZ0WCAgVXNPU08gZnRDcF90WEZYZnQgPSBOIEFiaiBwS2NDID0gTiBBYmogZUNjQ1hDX1RjRkggPSBtIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFdOID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwV047CiAgICB9CgogICAgLy90ZnRSRldYIDYtbTMtOW1OeCBrS3BNVGNLawogICAgVGZXTFhpS1cgSENYdnRDcFZwS2ZRYktYbkFfalooKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogSVMyWiBmdENwX0hwS2ZRIFVzT1NPIGllIGIySiBhYignTicsJzknKSBBYmogUUZwQ1dYX2llID0gbSBLcGVDcCBCciBpZSBGdEwiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIC8qIEFlZUNlIEJyIEFCUmloRldyZiBLVyBOMS1ObS05bU54IFRLcCBXS1hpVGlMRlhpS1cgdENYZlEgKi8KCiAgICBUZldMWGlLVyBIQ1h2dENwdCgkVGljWENwKSB7CiAgICAgICAgLy9DTFJLICJuT3FPNUogZi5pZSwgY2guZnRDcFdGaEMsIExLV0xGWChmLlRXRmhDLCcgJyxpVChmLmhXRmhDPD4nJyxMS1dMRlgoZi5oV0ZoQywnICcpLGYuaFdGaEMpLGYuY1dGaEMpIEZ0IFdGaEMgSVMyWiBmdENwIEZ0IGYgbEtpVyBjS0hpV19oRnRYIEZ0IGNoIEtXIGYuaWUgPSBjaC5mdENwX2llIFVzT1NPIExLV0xGWChmLlRXRmhDLCcgJyxpVChmLmhXRmhDPD4nJyxMS1dMRlgoZi5oV0ZoQywnICcpLGYuaFdGaEMpLGYuY1dGaEMpIGNpTUMgJyUkVGljWENwJScgRldlIGYuZUNjQ1hDX1RjRkg9bSI7CiAgICAgICAgLy9DTFJLICJuT3FPNUogZi5pZSwgY2guZnRDcFdGaEMsIExLV0xGWChmLlRXRmhDLCcgJyxmLmNXRmhDKSBGdCBXRmhDIElTMlogZnRDcCBGdCBmIGxLaVcgY0tIaVdfaEZ0WCBGdCBjaCBLVyBmLmllID0gY2guZnRDcF9pZSBVc09TTyBMS1dMRlgoZi5UV0ZoQywnICcsZi5jV0ZoQykgY2lNQyAnJSRUaWNYQ3AlJyBGV2UgZi5lQ2NDWENfVGNGSD1tIjsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZi5pZSwgY2guZnRDcFdGaEMsIExLV0xGWChmLlRXRmhDLCcgJyxmLmNXRmhDKSBGdCBXRmhDIElTMlogZnRDcCBGdCBmIGxLaVcgY0tIaVdfaEZ0WCBGdCBjaCBLVyBmLmllID0gY2guZnRDcF9pZSBVc09TTyBMS1dMRlgoZi5UV0ZoQywnICcsZi5jV0ZoQykgY2lNQyAnJSRUaWNYQ3AlJyBGV2UgZi5lQ2NDWENfVGNGSD1tIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBDaEZpY3pyU0tjQygkaWUpIHsKICAgICAgICAvL0NMUksgIm5PcU81SiBmLkNoRmljIElTMlogZnRDcF9IcEtmUSBGdCBmSCBFMmFiIGNLSGlXX2hGdFggRnQgY2ggMmIgKGZILmllID0gY2gucEtjQyAyUyBmSC5pZSA9Y2guQ2hRX3BLY0MpIEUyYWIgZnRDcCBGdCBmIDJiIGYuaWUgPSBjaC5mdENwX2llIFVzT1NPIChjaC5DaFFfcEtjQyA9ICIgLiAkaWUuIiAyUyBjaC5wS2NDID0gIi4kaWUuIikiOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBmLkNoRmljIElTMlogZnRDcF9IcEtmUSBGdCBmSCBFMmFiIGNLSGlXX2hGdFggRnQgY2ggMmIgKGZILmllID0gY2gucEtjQyAyUyBmSC5pZSA9Y2guQ2hRX3BLY0MpIEUyYWIgZnRDcCBGdCBmIDJiIGYuaWUgPSBjaC5mdENwX2llIFVzT1NPIChjaC5DaFFfcEtjQyA9ICIgLiAkaWUgLiAiIDJTIGNoLnBLY0MgPSAiIC4gJGllIC4gIikiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIENoRmljenJ2dENwYWooJGZ0Q3BpZSkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogZnRDcCBVc09TTyBpZSA9ICIgLiAkZnRDcGllKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIENoRmljQUxYaUdDenJTS2NDKCRpZSkgewogICAgICAgIC8vIENMUksgIm5PcU81SiBmLkNoRmljIElTMlogY0tIaVdfaEZ0WCBjaCBFMmFiIGZ0Q3AgRnQgZiAyYiBmLmllID0gY2guZnRDcF9pZSBVc09TTyBjaC5DaFFfcEtjQyA9ICIgLiAkaWUgLiAiIEZXZSBmLnRYRlhmdD0nb0N0JyI7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGYuQ2hGaWMgSVMyWiBjS0hpV19oRnRYIGNoIEUyYWIgZnRDcCBGdCBmIDJiIGYuaWUgPSBjaC5mdENwX2llIFVzT1NPIGNoLkNoUV9wS2NDID0gIiAuICRpZSAuICIgRldlIGYudFhGWGZ0PSdvQ3QnIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1h2dENwNUtmV1h6ck9oUVNLY0MoJHBLY0MpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGNLSGlXX2hGdFggVXNPU08gQ2hRX3BLY0M9IDpTMnFPIEFiaiBlQ2NDWENfVGNGSCA9ICdtJyIpOwoKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpTMnFPIiwgJHBLY0MsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWFNDdFhwaUxYQ2V2dENwVnBLZlFfRmNjX1VpWFJTS0tYX3pyYkZoQzJwQWNpRnQoJFRpY1hDcCkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAKICAgIGZITi4qLGlUV2ZjYyhmSDkuV0ZoQywnJykgRnQgcEtLWFdLZUNfV0ZoQyxpVFdmY2MoZkg5LmZ0Q3BIcEtmUUZjaUZ0LCcnKSBGdCBwS0tYV0tlQ19GY2lGdFdGaEMsaVRXZmNjKExLV0xGWChmSE4uV0ZoQywnIHx8ICcsZkg5LldGaEMpLGZITi5XRmhDKSBGdCBmSGJGaEMKSVMyWiBmdENwX0hwS2ZRIEFuIGZITgogICAgIGNDVFggRTJhYiBmdENwX0hwS2ZRIEFuIGZIOQogICAgMmIgICAoZkhOLlJpQ3BGcExSciA9IE4gQWJqIGZITi5RRnBDV1hfaWUgPD4gbSBBYmogIGZITi5wS0tYV0tlQyA9IGZIOS5pZSApClVzT1NPICgoZkhOLlJpQ3BGcExSciA9IE4gQWJqIGZITi5RRnBDV1hfaWUgPD4gbSkgMlMgIChmSE4uUmlDcEZwTFJyID0gbSBBYmogZkhOLldGaENlX1RjRkggPSBOKSkgQWJqIChmSE4uV0ZoQyBjaU1DICclJFRpY1hDcCUnIDJTIGZITi5mdENwSHBLZlFGY2lGdCBjaU1DICclJFRpY1hDcCUnICkgQWJqIGZITi5XRmhDICE9J0hSS3RYJwoyU2pPUyB6byBmSE4uaWUsZkg5LnBLS1hXS2VDOyIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKCiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWEFqYWooJGZ0Q3BpZSkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoInRDY0NMWCBGZV9pZSBUcEtoIGNLSGlXX2hGdFggVXNPU08gZnRDcF9pZSA9ICIgLiAkZnRDcGllKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWHZ0Q3B6ck9oRmljKCkgewoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogaWUgSVMyWiBmdENwIFVzT1NPIENoRmljID0gOk9aQWFxIEFiaiBlQ2NDWENfVGNGSCA9ICdtJyIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOk9aQWFxIiwgJFhSaXQtPkNoRmljLCA4ajI6OjhBU0FaX25KUyk7CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1hqQ0ZjX1pDaF9BdHRpSFdDZV8ycEhfSUtwXzVLUXJTaUhSWHQoJEhmQ3RYX2llLCAkcEtjQywgJFBmQ3ByKSB7CiAgICAgICAgaVQgKCRwS2NDID09IE4gfHwgJHBLY0MgPT0gOSkgewoKICAgICAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwck4gPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogUWhDaC5RcEtsQ0xYX2llLCBRaENoLnBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBBbiBRaENoCgogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRaENoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgVXNPU08gUWhDaC5RcEtsQ0xYX2llID0gJyRRaWUnIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJ04nIEFiaiBjS0hpV19oRnRYLnBLY0MgIT0gJzknCiAgICAgICAgICAgICAgQWJqIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicKICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOyAqLwogICAgICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZnRDcC5pZSBBbiBpZSwgY0tIaVdfaEZ0WC5mdENwV0ZoQyBBbiBXRmhDIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAgQW4gUWhDaAogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRaENoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgVXNPU08gY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nIEFiaiBjS0hpV19oRnRYLmZ0Q3BXRmhDIHFhZE8gJyUkUGZDcHIlJyAKICAgICAgICAgICAgICBWUzJ2OCB6byBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgICAvLyRYUml0LT50WFItPkNnQ0xmWEMoRnBwRnIoJzpmdENwV0ZoQycgPT4gJFhSaXQtPmZ0Q3BXRmhDKSk7CiAgICAgICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAgICAgJFhSaXQtPnBDWGZwV04gPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwoKCgogICAgICAgICAgICAvKiAkWFJpdC0+S0JsX1BmQ3ByOSA9ICRYUml0LT5lQi0+UGZDcHIoIm5PcU81SiBRcEtsQ0xYLmllIEZ0IFFwS2xDTFhfaWUsIDkgRnQgcEtjQywgZnRDcC5pZSwgZnRDcC5UV0ZoQywgZnRDcC5oV0ZoQywgZnRDcC5jV0ZoQyBJUzJaIGBmdENwYAoKICAgICAgICAgICAgICBFMmFiIFFwS2xDTFggMmIgZnRDcC5pZSA9IFFwS2xDTFguUXBLbENMWF9oRldGSENwCiAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIDJiIFFwS2xDTFguUXBLbENMWF9oRldGSENwICA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIFVzT1NPIFFwS2xDTFguaWUgPSAnJFFpZScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJwogICAgICAgICAgICAgIDJTak9TIHpvIGZ0Q3AuVFdGaEMgQW41Iik7ICovCiAgICAgICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBmdENwLmllIEFuIGllLCBjS0hpV19oRnRYLmZ0Q3BXRmhDICBBbiBXRmhDICBJUzJaIGBmdENwYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTJhYiBRcEtsQ0xYIDJiIGZ0Q3AuaWUgPSBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcCAgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzT1NPIGNLSGlXX2hGdFguZnRDcF90WEZYZnQgPSAnTicgIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nIEFiaiBjS0hpV19oRnRYLmZ0Q3BXRmhDIHFhZE8gJyUkUGZDcHIlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyU2pPUyB6byBmdENwLlRXRmhDIEFuNSIpOwogICAgICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgICAgICRYUml0LT5wQ1hmcFc5ID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICB9IENjdEMgewoKICAgICAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwck4gPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogUWhDaC5RcEtsQ0xYX2llLCBRaENoLnBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgRnR0aUhXX2hDaF9RcEtsQ0xYYCBBbiBRaENoCgogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRaENoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgRTJhYiBIZkN0WHQgQXQgSCAyYiBJYWJqX2FiX25PSihmdENwLmllLCBILmZ0Q3B0KSA+IG0KICAgICAgICAgICAgICBVc09TTyBRaENoLlFwS2xDTFhfaWUgPSAnJFFpZScgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnTicgQWJqIGNLSGlXX2hGdFgucEtjQyAhPSAnOScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogSC5pZSA9ICckSGZDdFhfaWUnCiAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKICAgICAgICAgICAgICAkWFJpdC0+cENYZnBXTiA9ICRYUml0LT50WFJOLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsgKi8KICAgICAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGZ0Q3AuaWUgQW4gaWUsIGNLSGlXX2hGdFguZnRDcFdGaEMgIEFuIFdGaEMgIElTMlogYEZ0dGlIV19oQ2hfUXBLbENMWGAgQW4gUWhDaAogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRaENoLmhDaF9pZSA9IGNLSGlXX2hGdFguZnRDcF9pZQogICAgICAgICAgICAgIEUyYWIgZnRDcCAyYiBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgI0UyYWIgSGZDdFh0IEF0IEggMmIgSWFial9hYl9uT0ooZnRDcC5pZSwgSC5mdENwdCkgPiBtCiAgICAgICAgICAgICAgVXNPU08gY0tIaVdfaEZ0WC5wS2NDICE9ICdOJyBBYmogY0tIaVdfaEZ0WC5wS2NDICE9ICc5JwogICAgICAgICAgICAgIEFiaiBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nICBBYmogY0tIaVdfaEZ0WC5mdENwV0ZoQyBxYWRPICclJFBmQ3ByJScgCiAgICAgICAgICAgICAgVlMydjggem8gY0tIaVdfaEZ0WC5mdENwX2llCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKLy8gICAgICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpWYWoiLCAkSGZDdFhfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICAgICAkWFJpdC0+cENYZnBXTiA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CgoKICAgICAgICAgICAgLyogJFhSaXQtPktCbF9QZkNwcjkgPSAkWFJpdC0+ZUItPlBmQ3ByKCJuT3FPNUogUXBLbENMWC5pZSBGdCBRcEtsQ0xYX2llLCA5IEZ0IHBLY0MsIGZ0Q3AuaWUsIGZ0Q3AuVFdGaEMsIGZ0Q3AuaFdGaEMsIGZ0Q3AuY1dGaEMgSVMyWiBgZnRDcGAKCiAgICAgICAgICAgICAgRTJhYiBRcEtsQ0xYIDJiIGZ0Q3AuaWUgPSBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcAogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcCAgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICBFMmFiIEhmQ3RYdCBBdCBIIDJiIElhYmpfYWJfbk9KKGZ0Q3AuaWUsIEguZnRDcHQpID4gbQogICAgICAgICAgICAgIFVzT1NPIFFwS2xDTFguaWUgPSAnJFFpZScKICAgICAgICAgICAgICBBYmogY0tIaVdfaEZ0WC5mdENwX3RYRlhmdCA9ICdOJyBBYmogSC5pZSA9ICckSGZDdFhfaWUnCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsgKi8KICAgICAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGZ0Q3AuaWUgQW4gaWUsIGNLSGlXX2hGdFguZnRDcFdGaEMgIEFuIFdGaEMgIElTMlogYGZ0Q3BgCiAgICAgICAgICAgICAgRTJhYiBRcEtsQ0xYIDJiIGZ0Q3AuaWUgPSBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcAogICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCAyYiBRcEtsQ0xYLlFwS2xDTFhfaEZXRkhDcCAgPSBjS0hpV19oRnRYLmZ0Q3BfaWUKICAgICAgICAgICAgICMgRTJhYiBIZkN0WHQgQXQgSCAyYiBJYWJqX2FiX25PSihmdENwLmllLCBILmZ0Q3B0KSA+IG0KICAgICAgICAgICAgICBVc09TTyBjS0hpV19oRnRYLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjS0hpV19oRnRYLmVDY0NYQ19UY0ZIID0gJ20nICBBYmogY0tIaVdfaEZ0WC5mdENwV0ZoQyBxYWRPICclJFBmQ3ByJScgCiAgICAgICAgICAgICAgMlNqT1Mgem8gZnRDcC5UV0ZoQyBBbjUiKTsKLy8gICAgICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjpWYWoiLCAkSGZDdFhfaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICAgICAkWFJpdC0+cENYZnBXOSA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgfQoKICAgICAgICBwQ1hmcFcgRnBwRnJfaENwSEMoJFhSaXQtPnBDWGZwV04sICRYUml0LT5wQ1hmcFc5KTsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1h2dENwdHpyU0tjQygkcEtjQywgJGtSQ3BDID0gJycsICRRZUtCaVdlX0ZwcEZyID0gRnBwRnIoKSkgewogICAgICAgICRQZkNwciA9ICJuT3FPNUogZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQyxjLmZ0Q3BXRmhDIElTMlogZnRDcCBBbiBmCgkJCUUyYWIgY0tIaVdfaEZ0WCBBbiBjIDJiIGYuaWUgPSBjLmZ0Q3BfaWUKCQkJVXNPU08gIGMucEtjQz0nJHBLY0MnICRrUkNwQwoJCQlWUzJ2OCB6byBjLmZ0Q3BfaWUgMlNqT1Mgem8gZi5UV0ZoQyBBbjUiOwoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCRQZkNwcik7CiAgICAgICAgVEtwQ0ZMUiAoJFFlS0JpV2VfRnBwRnIgRnQgJFFlS0JpV2VfTUNyID0+ICRRZUtCaVdlX0dGYykgewogICAgICAgICAgICAvL0NMUksgJ0BAJy4kUWVLQmlXZV9NQ3IuJyQkJy4kUWVLQmlXZV9HRmNbbV07CiAgICAgICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygkUWVLQmlXZV9NQ3IsICRRZUtCaVdlX0dGY1ttXSwgJFFlS0JpV2VfR0ZjW05dKTsKICAgICAgICB9CgogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1hqQ0ZjWkNoX0F0dGlIV0NlX3pyVnBLZlFfbkNGcExScUtIaVdxS0h0KCR0Q0ZwTFIsICRIaWUpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQyxjLmZ0Q3BXRmhDIElTMlogZnRDcCBBbiBmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIEFuIGMgMmIgZi5pZSA9IGMuZnRDcF9pZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgZnRDcF9IcEtmUSBBbiBIIDJiIChJYWJqX2FiX25PSihILmllLCBjLnBLY0MpID4gbSAyUyBJYWJqX2FiX25PSihILmllLCBjLkNoUV9wS2NDKSA+IG0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc09TTyBjLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjLmVDY0NYQ19UY0ZIID0gJ20nICRIaWUgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJqICggYy5mdENwV0ZoQyBjaU1DICclJHRDRnBMUiUnIDJTIDUyYjVBSihmLlRXRmhDLCcgJywgZi5oV0ZoQywnICcsZi5jV0ZoQykgY2lNQyAnJSR0Q0ZwTFIlJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZTMnY4IHpvIGMuZnRDcF9pZSAyU2pPUyB6byBmLlRXRmhDIEFuNSIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBIQ1hBY2N2dENwdCgpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGZ0Q3AsY0tIaVdfaEZ0WCBVc09TTyBmdENwLmllID0gY0tIaVdfaEZ0WC5mdENwX2llIEFiaiBmdENwLnRYRlhmdCA9ICdvQ3QnIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICBUZldMWGlLVyBmUWVGWENaRmljSWNGSCgkZnRDcGllLCAkR0ZjZkMpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJ2OGpBSk8gZnRDcCBuT0ogaEZpY19UY0ZIID0gOlpBYXFfSXFBViBVc09TTyBpZSA9IDp2bk9TX2FqIik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCc6dm5PU19haicsICRmdENwaWUsIDhqMjo6OEFTQVpfbkpTKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoJzpaQWFxX0lxQVYnLCAkR0ZjZkMsIDhqMjo6OEFTQVpfYWJKKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWHZ0Q3B6cmJGaEMoJGZ0Q3BXRmhDKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogVHBLaCBmdENwIGtSQ3BDIGllID0gKG5PcU81SiBmdENwX2llIElTMlogY0tIaVdfaEZ0WCBVc09TTyBmdENwV0ZoQyA9IDp2YkFaTykiKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjp2YkFaTyIsICRmdENwV0ZoQywgOGoyOjo4QVNBWl9uSlMpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICAvL0dpZVJyRiA5Ny9teC85bTltCiAgICBUZldMWGlLVyBIQ1hqQ0ZjWkNoX0F0dGlIV0NlX3pyVnBLZlFfbkNGcExSQWNjZnRDcHQoJHRDRnBMUiwgJEhpZSkgewoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQyxjLmZ0Q3BXRmhDIElTMlogZnRDcCBBbiBmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIEFuIGMgMmIgZi5pZSA9IGMuZnRDcF9pZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgZnRDcF9IcEtmUSBBbiBIIDJiIChJYWJqX2FiX25PSihILmllLCBjLnBLY0MpID4gbSAyUyBJYWJqX2FiX25PSihILmllLCBjLkNoUV9wS2NDKSA+IG0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc09TTyBjLmVDY0NYQ19UY0ZIID0gJ20nICRIaWUgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJqICggYy5mdENwV0ZoQyBjaU1DICclJHRDRnBMUiUnIDJTIDUyYjVBSihmLlRXRmhDLCcgJywgZi5oV0ZoQywnICcsZi5jV0ZoQykgY2lNQyAnJSR0Q0ZwTFIlJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZTMnY4IHpvIGMuZnRDcF9pZSxmLmllLCBmLlRXRmhDLCBmLmhXRmhDLCBmLmNXRmhDLGMuZnRDcFdGaEMgMlNqT1Mgem8gZi5UV0ZoQyBBbjUiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgLy9laVFpTUYgbTMvbTMvOW05bQogICAgVGZXTFhpS1cgSUtwTEN2V2NLTE04RnR0a0twZSgpIHsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJ2OGpBSk8gY0tIaVdfaEZ0WCBuT0ogRkxMWF9jS0xNQ2VfdFhGWGZ0ID0gbSAsTEZRWExSRl9IQ1dDcEZYQ19GVFhDcF9jS0hpV0lGaWNDZSA9IG0sVEZpY0NlX2NLSGlXX0xLZldYID0gbSBVc09TTyBmdENwX2llID0gOnZhaiIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOnZhaiIsICRYUml0LT5pZSwgOGoyOjo4QVNBWl9hYkopOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KICAgIAogICAgCiAgICBUZldMWGlLVyBIQ1h2dENwX0FjY19BZlhLKCRHRmNmQykgewoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogZi5pZSwgZi5UV0ZoQywgZi5oV0ZoQywgZi5jV0ZoQyBJUzJaIGZ0Q3AgRnQgZgogICAgICAgICAgICAgICAgICAgIEUyYWIgY0tIaVdfaEZ0WCBGdCBjIDJiIGYuaWUgID0gYy5mdENwX2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgVXNPU08gYy5lQ2NDWENfVGNGSCA9ICdtJyBBYmogYy5mdENwX3RYRlhmdCA9ICdOJyBBYmogKGYuVFdGaEMgY2lNQyAnJSRHRmNmQyUnIDJTIGYuaFdGaEMgY2lNQyAnJSRHRmNmQyUnIDJTIGYuY1dGaEMgY2lNQyAnJSRHRmNmQyUnKQogICAgICAgICAgICAgICAgIFZTMnY4IHpvIGYuaWUsIGYuVFdGaEMsIGYuaFdGaEMsIGYuY1dGaEMKICAgICAgICAgICAgICAgICAyU2pPUyB6byBmLlRXRmhDIEFuNSIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAvL1FwaVdYX3AoJFhSaXQtPnRYUi0+Q3BwS3BhV1RLKCkpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyBGcHBGcl9oQ3BIQygkWFJpdC0+cENYZnBXKTsKICAgIH0KCiAgICBUZldMWGlLVyBmUWVGWENfZnRDcGpuKCkgewogLy9DTFJLICJ2OGpBSk8gZnRDcCBuT0ogZWlIaVhGY190aUhXID0gJyRYUml0LT5laUhpWEZjX3RpSFcnICBVc09TTyBpZSA9JFhSaXQtPmZ0Q3BfaWUiOwogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoInY4akFKTyBmdENwIG5PSiBlaUhpWEZjX3RpSFcgPSA6am4gIFVzT1NPIGllID0gOnZhaiIpOwogICAgICAgICRYUml0LT50WFItPkJpV2V5RmNmQygiOnZhaiIsICRYUml0LT5mdENwX2llLCA4ajI6OjhBU0FaX2FiSik7CiAgICAgICAgJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6am4iLCAkWFJpdC0+ZWlIaVhGY190aUhXLCA4ajI6OjhBU0FaX25KUyk7CiAgICAgICAgcENYZnBXICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgIH0KCgogICAgVGZXTFhpS1cgSENYakNRRnBYaENXWCgkaWUpewoKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBUcEtoIGVDUUZwWGhDV1gga1JDcEMgaWUgPSAkaWUiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgLy9RcGlXWF9wKCRYUml0LT50WFItPkNwcEtwYVdUSygpKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgRnBwRnJfaENwSEMoJFhSaXQtPnBDWGZwVyk7CgogICAgfQoKICAgIFRmV0xYaUtXIEhDWEFjY2pDUUZwWGhDV1goKXsKCiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKICogVHBLaCBlQ1FGcFhoQ1dYICIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAvL1FwaVdYX3AoJFhSaXQtPnRYUi0+Q3BwS3BhV1RLKCkpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyBGcHBGcl9oQ3BIQygkWFJpdC0+cENYZnBXKTsKCiAgICB9CgogICAgVGZXTFhpS1cgSENYakNRRnBYaENXWHZ0Q3AoJGZ0Q3BfaWUsJGVDUUZwWGhDV1hfaWUpIHsKICAgICAgICAvL0NMUksgIm5PcU81SiAqIElTMloga0twTVRjS2tfcEtjQ19mdENwSHBLZlEgIGtSQ3BDIGZ0Q3BfSHBLZlFfaWUgPSAkcEtjQ19pZSI7CiAgICAgICAgLy9DTFJLICJuT3FPNUogKiBJUzJaIGZ0Q3AgIGtSQ3BDIGllICE9ICRmdENwX2llIEZXZSBlQ1FGcFhoQ1dYX2llID0gJGVDUUZwWGhDV1hfaWUgIjsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGZ0Q3AgIGtSQ3BDIGllICE9ICRmdENwX2llIEZXZSBlQ1FGcFhoQ1dYX2llID0gJGVDUUZwWGhDV1hfaWUgIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICAgVGZXTFhpS1cgSENYYktYakNjQ0hGWEN2dENwakNRRnBYaENXWHZ0Q3AoJGZ0Q3BfaWUsJGVDUUZwWGhDV1hfaWUpIHsKICAgICAgICAvL0NMUksgIm5PcU81SiAqIElTMlogZnRDcCAga1JDcEMgIVRpV2VfaVdfdENYKGllLChuT3FPNUogaVRXZmNjKFZTMnY4XzUyYjVBSig1MmI1QUooRnR0aUhXQ19Ccl9mdENwX2llLCcsJyxGdHRpSFdDX1hLX2Z0Q3BfaWUpKSxtKSBJUzJaIGtLcE1UY0trX2VDY0NIRlhDX1hLZnRDcCBVc09TTyBlQ1FYX2llID0gJGVDUUZwWGhDV1hfaWUgQWJqIHRYRlhmdCA9IE4pKSBBYmogZUNRRnBYaENXWF9pZSA9ICRlQ1FGcFhoQ1dYX2llICAiIDsKICAgICAgICAkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJuT3FPNUogKiBJUzJaIGZ0Q3AgIGtSQ3BDICFUaVdlX2lXX3RDWChpZSwobk9xTzVKIGlUV2ZjYyhWUzJ2OF81MmI1QUooNTJiNUFKKEZ0dGlIV0NfQnJfZnRDcF9pZSwnLCcsRnR0aUhXQ19YS19mdENwX2llKSksbSkgSVMyWiBrS3BNVGNLa19lQ2NDSEZYQ19YS2Z0Q3AgVXNPU08gZUNRWF9pZSA9ICRlQ1FGcFhoQ1dYX2llIEFiaiB0WEZYZnQgPSBOKSkgQWJqIGVDUUZwWGhDV1hfaWUgPSAkZUNRRnBYaENXWF9pZSAgIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCgogICAgVGZXTFhpS1cgSENYdnRDcHR6cmpDUUZwWENoV1hhZSgkZnRDcF9pZSwkZUNRRnBYaENXWF9pZSkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogZnRDcCxjS0hpV19oRnRYIFVzT1NPIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgQWJqIGZ0Q3AuZUNjQ1hDX1RjRkggPSAnbScgRldlIGZ0Q3AuaWUgIT0gJGZ0Q3BfaWUgRldlIGZ0Q3AuZUNRRnBYaENXWF9pZSA9ICRlQ1FGcFhoQ1dYX2llICAyU2pPUyB6byBmdENwLmllIGpPbjUiKTsKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKDhqMjo6SU9KNXNfQW5uMjUpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwogICAgfQoKICAgIFRmV0xYaUtXIEhDWHZ0Q3B0X0FjY1VpWFJqQ1FGcFhoQ1dYKCkgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIElTMlogZnRDcCxjS0hpV19oRnRYIFVzT1NPIGZ0Q3AuaWUgPSBjS0hpV19oRnRYLmZ0Q3BfaWUgQWJqIGZ0Q3AuZUNjQ1hDX1RjRkggPSAnbScgRldlIGZ0Q3AuZUNRRnBYaENXWF9pZSAhPSBtIDJTak9TIHpvIGZ0Q3AuaWUgak9uNSIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgoJLy9laVFpTUYKCVRmV0xYaUtXIEhDWHZ0Q3BqQ1hGaWN0enJhZSgkZnRDcF9pZSl7CiAgICAgICAgLy9DTFJLICJuT3FPNUogKiBJUzJaIGZ0Q3Aga1JDcEMgaWUgPSAkZnRDcF9pZSI7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIFRXRmhDLGNXRmhDLENoRmljIElTMlogZnRDcCBrUkNwQyBpZSA9ICRmdENwX2llIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgIC8vUXBpV1hfcCgkWFJpdC0+dFhSLT5DcHBLcGFXVEsoKSk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXIEZwcEZyX2hDcEhDKCRYUml0LT5wQ1hmcFcpOwoKICAgIH0KCVRmV0xYaUtXIEhDWGpDUVh6b3ZhaigkaWUpewoJCQoJCSRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBlLmVDUV9XRmhDLGYuZUNRRnBYaENXWF9pZSBUcEtoICBmdENwIGYgLGVDUUZwWGhDV1ggZSBVc09TTyBmLiBpZT0kaWUgQWJqIGUuaWU9Zi5lQ1FGcFhoQ1dYX2llIik7CiAgICAgICAgJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYyg4ajI6OklPSjVzX0FubjI1KTsKICAgICAgICAKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKCX0KICAgICAgICAKICAgIFRmV0xYaUtXIEhDWGVLTGZ0aVdIdnRDcCgkQ2hGaWMpewogICAgICAgIAogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiAqIFRwS2ggIGZ0Q3Aga1JDcEMgQ2hGaWMgaVcoJENoRmljKSIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgCiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CiAgICAvLyB0WEZwWCB2dENwIEJGdEMga0twTSBUY0trIFBmQ3ByIEtUIAoKICAgIFRmV0xYaUtXIEhDWDVmcHBDV1hqQ1FGcFhoQ1dYKCRrX3BLY0NfaWUsJGZ0Q3BfaWUpewogICAgICAgIC8vIm5PcU81SiAqIFRwS2ggZUNRRnBYaENXWCBrUkNwQyBpZSA9ICRpZSIKICAgICAgICA7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGVDUV9XRmhDIElTMloga0twTVRjS2tfcEtjQ19mdENwdF9lQ1FYIGtwZiBhYmJPUyBFMmFiICBlQ1FGcFhoQ1dYIGVDUVggMmIga3BmLmVDUUZwWGhDV1hfaWUgPSBlQ1FYLmllIFVzT1NPIGtfcEtjQ19pZSA9ICRrX3BLY0NfaWUgQWJqIGZ0Q3BfaWUgPSAkZnRDcF9pZSIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAvL1FwaVdYX3AoJFhSaXQtPnRYUi0+Q3BwS3BhV1RLKCkpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyBGcHBGcl9oQ3BIQygkWFJpdC0+cENYZnBXKTsKCiAgICB9CgogICAgVGZXTFhpS1cgSENYU0tjQ3R6cnZ0Q3AoJGZpZSl7CiAgICAgICAgICAgIAogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoInRDY0NMWCAqIFRwS2gga0twTVRjS2tfcEtjQ19mdENwdF9lQ1FYIEZ0IGtwZiBjQ1RYIGxLaVcga0twTVRjS2tfcEtjQ3QgRnQga3AgMmIga3BmLmtfcEtjQ19pZT0gIGtwLmllIFVzT1NPIGtwZi5mdENwX2llPSRmaWUgRldlIGtwLnBLY0NfaEZ0WENwICE9ICcnICIpOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoOGoyOjpJT0o1c19Bbm4yNSk7CiAgICAgICAgCiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgkKCVRmV0xYaUtXIEhDWGZ0Q3BfenJqQ1FYX25DRnBMUigkSGllLCAkUWllKSB7CiAgICAgICAgJFhSaXQtPnRYUiA9ICRYUml0LT5lQi0+UXBDUUZwQygibk9xTzVKIGYuaWUsZi5lQ1FGcFhoQ1dYX2llIElTMlogZnRDcCBBbiBmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTJhYiBjS0hpV19oRnRYIEFuIGMgMmIgZi5pZSA9IGMuZnRDcF9pZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyYWIgZUNRRnBYaENXWCBBbiBIIDJiIChJYWJqX2FiX25PSihILmllLCBmLmVDUUZwWGhDV1hfaWUpID4gbSAyUyBJYWJqX2FiX25PSihILmllLCBjLkNoUV9wS2NDKSA+IG0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc09TTyBjLnBLY0MgIT0gJzknIEFiaiBjLnBLY0MgIT0gJ04nIEFiaiBjLmZ0Q3BfdFhGWGZ0ID0gJ04nIEFiaiBjLmVDY0NYQ19UY0ZIID0gJ20nICRIaWUgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJqIGYuaWUgIGFiIChuT3FPNUogaENoX2llIElTMlogRnR0aUhXX2hDaF9RcEtsQ0xYIFVzT1NPIFFwS2xDTFhfaWUgPSAkUWllKSAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUzJ2OCB6byBjLmZ0Q3BfaWUgMlNqT1Mgem8gZi5UV0ZoQyBBbjUiKTsKCQkJCQkJCQkgIC8vUXBpV1hfcCgkWFJpdC0+dFhSKTtDZ2lYOwogICAgICAgICRYUml0LT50WFItPkNnQ0xmWEMoKTsKICAgICAgICAkWFJpdC0+cENYZnBXID0gJFhSaXQtPnRYUi0+VENYTFJBY2MoKTsKICAgICAgICBwQ1hmcFcgJFhSaXQtPnBDWGZwVzsKICAgIH0KCiAgICAgLy8gT1dlIHZ0Q3AgQkZ0QyBrS3BNIFRjS2sgUGZDcHIgS1QgCgkgCgkgCgkgVGZXTFhpS1cgSENYdnRDcHRfenJWcEtmUUlLcDVGWENIS3ByKCRHRmNmQykgewogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBmdENwLmllLGZ0Q3AuVFdGaEMsZnRDcC5oV0ZoQyxmdENwLmNXRmhDLCBmdENwLkNoRmljIElTMlogZnRDcCxjS0hpV19oRnRYIFVzT1NPICBmdENwLmllPWNLSGlXX2hGdFguZnRDcF9pZSBBYmogZnRDcC50WEZYZnQ9J29DdCcgIEFiaiBjS0hpV19oRnRYLnBLY0MgaVcoJEdGY2ZDKSBBYmogZnRDcC5lQ2NDWENfVGNGSCA9ICdtJyIpOwogICAgICAgIC8vJFhSaXQtPnRYUi0+QmlXZXlGY2ZDKCI6UzJxTyIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgkKCVRmV0xYaUtXIEhDWHZ0Q3B0X3pyakNRWGFlKCRlQ1FYX2llKXsKCQkkWFJpdC0+dFhSID0gJFhSaXQtPmVCLT5RcENRRnBDKCJ0Q2NDTFggKiBUcEtoIGZ0Q3Aga1JDcEMgZUNRRnBYaENXWF9pZSA9ICRlQ1FYX2llIik7CgkJJFhSaXQtPnRYUi0+Q2dDTGZYQygpOwogICAgICAgICRYUml0LT5wQ1hmcFcgPSAkWFJpdC0+dFhSLT5UQ1hMUkFjYygpOwogICAgICAgIHBDWGZwVyAkWFJpdC0+cENYZnBXOwoJfQoJCgkgVGZXTFhpS1cgSENYdnRDcGpDUUZwWGhDV1hfQnJXRmhDKCRHRmNmQykgewogICAgICAgIAogICAgICAgICRYUml0LT50WFIgPSAkWFJpdC0+ZUItPlFwQ1FGcEMoIm5PcU81SiBpZSwgZUNRX1dGaEMgSVMyWiBlQ1FGcFhoQ1dYIFVzT1NPIGVDUV9XRmhDID0gJyRHRmNmQyciKTsKICAgICAgICAkWFJpdC0+dFhSLT5CaVdleUZjZkMoIjphaiIsICRHRmNmQywgOGoyOjo4QVNBWl9uSlMpOwoKICAgICAgICAkWFJpdC0+dFhSLT5DZ0NMZlhDKCk7CiAgICAgICAgJFhSaXQtPnBDWGZwVyA9ICRYUml0LT50WFItPlRDWExSQWNjKCk7CiAgICAgICAgcENYZnBXICRYUml0LT5wQ1hmcFc7CiAgICB9CgogICAgCn0KCj8+';$_D=strrev('edoced_46esab');eval($_D('JF9DMTM1MzU2MjExMD1iYXNlNjRfZGVjb2RlKCRfQzEzNTM1NjIxMTApOyRfQzEzNTM1NjIxMTA9c3RydHIoJF9DMTM1MzU2MjExMCwnM0FnYURaYjBZeGRYVzhCa2l1VlMyT05FdFV6QzVjNG9Lc3c3bXk5cG5IRzZQZWpGcjFKbFFUZnFSTUxoSXYnLCc5QXhJNU1OUVg3S3RuUGJ3aXpHUk9FMUpzV0JlQ2w0WW9IWjgwVjJyU2d2NnFkRGF5M1RqcGZ1TGhrY21GVScpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzEzNTM1NjIxMTApO2V2YWwoJF9SKTskX1I9MDskX0MxMzUzNTYyMTEwPTA7'));?>
Function Calls
strtr | 1 |
strrev | 1 |
str_replace | 1 |
base64_decode | 2 |
Stats
MD5 | f125f592ec2ee5a19e2cb61b743b76c8 |
Eval Count | 2 |
Decode Time | 743 ms |