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

Variables

$_D base64_decode
$_F index.php
$_R ?><?php class user { //********* VARIABLES *********** ..
$_C1353562110 ?><?php class user { //********* VARIABLES *********** ..

Stats

MD5 f125f592ec2ee5a19e2cb61b743b76c8
Eval Count 2
Decode Time 743 ms