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 /*9264903f8166a9766c0592bcf4f5a1876c0592bcf4f5a187*/ eval(base64_decode(" CiBjbGF..

Decoded Output download


 class CommonEntryModel extends AppModel { var $no_private_priv = array(1); var $role_skip_categories = array(); var $entry_role_sql_from; var $entry_role_sql_group; var $entry_role_sql_where = '1'; var $entry_sql_force_index; function getById($record_id) { $sql = "SELECT 
			e.*, 
			UNIX_TIMESTAMP(e.date_posted) AS ts,
			UNIX_TIMESTAMP(e.date_updated) AS tsu		
		FROM {$this->tbl->entry} e {$this->entry_role_sql_from}
		WHERE e.id = %d
		AND {$this->entry_role_sql_where}"; $sql = sprintf($sql,$record_id); $result =& $this->db->Execute($sql) or die(db_error($sql)); return $result->FetchRow(); } function getStatRecords() { $s = ($this->entry_role_sql_group) ? 'COUNT(DISTINCT(e.id))' : 'COUNT(*)'; $sql = "SELECT e.active, {$s} AS 'num'
		FROM 
			({$this->tbl->entry} e,
			{$this->tbl->category} cat)
			{$this->entry_role_sql_from}
			
		WHERE e.category_id = cat.id
		AND {$this->entry_role_sql_where}
		AND {$this->sql_params}
		GROUP BY e.active"; $result = &$this->db->Execute($sql) or die(db_error($sql)); return $result->GetAssoc(); } function &getCategoryById($record_id) { $data[1] = array(); $data[0] = array(); $sql = "SELECT category_id, is_main FROM {$this->tbl->entry_to_category} 
		WHERE entry_id IN ($record_id)"; $result =& $this->db->Execute($sql) or die(db_error($sql)); while($row = &$result->FetchRow()) { $data[$row['is_main']][] = $row['category_id']; } $data = array_merge($data[1], $data[0]); return $data; } function &getCategoryByIds($record_id) { $sql = "
		SELECT
			c.name,		 
			ec.entry_id,
			ec.is_main,
			ec.category_id
			
		FROM 
			{$this->tbl->category} c, 
			{$this->tbl->entry_to_category} ec
		WHERE 1
			AND ec.entry_id IN ($record_id) 
			AND c.id = ec.category_id
			ORDER BY ec.is_main DESC"; $result =& $this->db->Execute($sql) or die(db_error($sql)); while($row = $result->FetchRow()){ $data[$row['entry_id']][$row['category_id']] = $row['name']; } return $data; } function getCategoryRecords() { return $this->cat_manager->getSelectRecords(); } function &getCategoryRecordsUser($rows = false) { if(!$rows) { $rows = $this->getCategoryRecords(); } foreach($this->role_skip_categories as $category_id) { if(isset($rows[$category_id])) { unset($rows[$category_id]); } } return $rows; } function getCategorySelectRange($rows = false, $parent_id = 0, $pref = '-- ') { $rows = &$this->getCategoryRecordsUser($rows); return $this->cat_manager->getSelectRange($rows, $parent_id, $pref); } function getCategorySelectRangeFolow($rows = false, $parent_id = 0, $pref = ' -> ') { $rows = &$this->getCategoryRecordsUser($rows); return $this->cat_manager->getSelectRangeFolow($rows, $parent_id, $pref); } function getChilds($rows, $id) { $tree = new TreeHelper(); foreach($rows as $k => $row) { $tree->setTreeItem($row['id'], $row['parent_id']); } return $tree->getChildsById($id); } function &getUser($user_id, $one_user = true) { $sql = "SELECT id, username, first_name, last_name, email, phone 
		FROM {$this->tbl->user} WHERE id IN($user_id)"; $result =& $this->db->Execute($sql) or die(db_error($sql)); $ret = ($one_user) ? $result->FetchRow() : $result->GetAssoc(); if(!$ret) { $ret = array(); } return $ret; } function isUserPrivIgnorePrivate() { return in_array($this->user_priv_id, $this->no_private_priv); } function setEntryRolesSql($action = 'write') { if(!$this->isExtra('private') || $this->isUserPrivIgnorePrivate()) { return; } $this->entry_role_sql_group = ''; if($this->user_role_id) { $user_role_ids = array(); $user_role_ids_temp = $this->role_manager->getChildRoles(false, $this->user_role_id); foreach($user_role_ids_temp as $role_id => $role_ids) { $user_role_ids[] = $role_id; $user_role_ids = array_merge($user_role_ids, $role_ids); } $pattern = '(^|,)(' . implode('|', $user_role_ids) . ')(,|$)'; $this->entry_role_sql_where = "IF(du.user_value, du.user_value REGEXP '{$pattern}', 1)"; } else { $user_role_ids = 123456789; $this->entry_role_sql_where = "du.data_value IS NULL"; } $private = implode(',', $this->private_rule[$action]); $this->entry_role_sql_from = "
		LEFT JOIN {$this->tbl->data_to_value_string} du 
		ON e.id = du.data_value 
		AND du.rule_id IN ({$this->role_read_id})
		AND e.private IN ({$private})"; } function setCategoriesNotInUserRole($action, $entries_ids = false) { $this->role_skip_categories = &$this->cat_manager->getCategoriesNotInUserRole($action); } function getCategoryRolesSql($category = true) { $role_skip_sql = array(1); if($category == 'e_to_cat.category_id') { $field = 'e_to_cat.category_id'; } else { $field = ($category) ? 'c.id' : 'cat.id'; } if($this->role_skip_categories) { $role_skip_sql = array(); $role_skip_sql[] = sprintf('%s NOT IN(%s)', $field, implode(',', $this->role_skip_categories)); } return implode(' ', $role_skip_sql); } function isCategoryNotInUserRole($categories) { return array_intersect($categories, $this->role_skip_categories); } function getRoleReadById($record_id, $list_view = false) { $select = ($list_view) ? '*' : 'dv.user_value, dv.user_value AS id1'; return $this->dv_manager->getDataById($record_id, array($this->role_read_id), $select, $list_view); } function saveRoleReadToEntry($roles, $record_id, $rule_id) { $this->dv_manager->saveData($roles, $record_id, $rule_id); } function deleteRoleReadToEntry($record_id) { $this->dv_manager->deleteData($record_id, $this->role_read_id); } function getChildRoles($rows, $id) { return $this->role_manager->getChildsById($id); } function getRoleRecords() { return $this->role_manager->getSelectRecords(); } function getRoleSelectRange($arr = false) { return $this->role_manager->getSelectRangeFolow($arr, 0, ' :: '); } function getRoleRangeFolow($arr = false) { return $this->role_manager->getSelectRangeFolow($arr, 0, ' :: '); } function isEntryInUserRole($record_id) { $sql = "SELECT 1 FROM {$this->tbl->entry} e {$this->entry_role_sql_from}
		WHERE e.id = %d AND {$this->entry_role_sql_where}"; $sql = sprintf($sql,$record_id); $result =& $this->db->Execute($sql) or die(db_error($sql)); return ($result->Fields(1)); } function getPrivateRule($private) { return $this->role_read_id; } function getListSelectRange($list_key, $active_only = true, $updated_value = false) { return ListValueModel::getListSelectRange($list_key, $active_only, $updated_value); } function getEntryStatusData($list_key) { foreach(ListValueModel::getListData($list_key) as $list_value => $v) { $data[$v['list_value']] = array('title' => $v['title'], 'color' => $v['custom_1'] ); } return $data; } function getEntryStatusPublished($list_key) { $data = array(); foreach(ListValueModel::getListData($list_key) as $list_value => $v) { if($v['custom_3'] == 1) { $data[$v['list_value']] = $v['list_value']; } } return $data; } function getSortRecords($category_id, $limit = false, $offset = 0) { $sql = "SELECT e.id, e.title AS 't', e_to_cat.sort_order AS 's'
		FROM 
			{$this->tbl->entry} e,
			{$this->tbl->entry_to_category} e_to_cat
		WHERE e_to_cat.category_id = '%d'
		AND e_to_cat.entry_id = e.id
		ORDER BY e_to_cat.sort_order"; $sql = sprintf($sql, $category_id); if ($limit) { $result =& $this->db->SelectLimit($sql, $limit, $offset) or die(db_error($sql)); } else { $result =& $this->db->Execute($sql) or die(db_error($sql)); } return $result->GetAssoc(); } function getSortCurrentPosition($category_id, $entry_id) { $sql = "SELECT COUNT(*) AS num
		FROM {$this->tbl->entry_to_category} e_to_cat
		WHERE e_to_cat.category_id = '%d'
		AND e_to_cat.entry_id < '%d'
		ORDER BY e_to_cat.sort_order"; $sql = sprintf($sql, $category_id, $entry_id); $result =& $this->db->Execute($sql) or die(db_error($sql)); return $result->Fields('num'); } function getMaxSortOrder($category_ids) { $sql = "SELECT category_id, MAX(sort_order) AS max_sort_order
		FROM {$this->tbl->entry_to_category} 
		WHERE category_id IN ({$category_ids})
		GROUP BY category_id"; $result =& $this->db->Execute($sql) or die(db_error($sql)); return $result->GetAssoc(); } function getMaxSortOrderValues($category, $mirror_categories = array()) { $sort = array(); $category_ids = $this->getCategoryIds($category, $mirror_categories); $sort_values = $this->getMaxSortOrder($category_ids); foreach(explode(',', $category_ids) as $category_id) { if(isset($sort_values[$category_id])) { $sort_values[$category_id] += 1; } else { $sort_values[$category_id] = 1; } } return $sort_values; } function getCategoryIds($category, $mirror_categories = array()) { $category_ids = implode(',', $category); return $category_ids; } function getSortOrder($entry_id, $category_ids) { $sql = "SELECT category_id, sort_order FROM {$this->tbl->entry_to_category}
		WHERE entry_id = '{$entry_id}' AND category_id IN ({$category_ids})"; $result = &$this->db->Execute($sql) or die(db_error($sql)); return $result->GetAssoc(); } function getSortOrderByEntryId($entry_id) { $sql = "SELECT category_id, sort_order FROM {$this->tbl->entry_to_category}
		WHERE entry_id IN ({$entry_id})"; $result = &$this->db->Execute($sql) or die(db_error($sql)); return $result->GetAssoc(); } function getSortOrderValues($entry_id, $category, $mirror_categories = array()) { $category_ids = $this->getCategoryIds($category, $mirror_categories); return $this->getSortOrder($entry_id, $category_ids); } function updateSortOrder($entry_id, $new_sort, $category, $mirror_categories, $action) { $category_ids = $this->getCategoryIds($category, $mirror_categories); $current_sort = array(); if($action == 'update') { $current_sort = $this->getSortOrder($entry_id, $category_ids); } if($action == 'insert') { $max_sort = $this->getMaxSortOrderValues($category, $mirror_categories); } $sort = new TableSortOrder(); $sort->table = $this->tbl->entry_to_category; $sort->name_field = 'title'; $sort->sort_field = 'sort_order'; $sort->id_field = 'entry_id'; $sort_value = array(); foreach(explode(',', $category_ids) as $category_id) { $new_so = (isset($new_sort[$category_id])) ? $new_sort[$category_id] : 'sort_end'; if($new_so == 'sort_end' && $action == 'insert') { $sort_value[$category_id] = $max_sort[$category_id]; continue; } if($new_so != 'sort_begin' && $new_so != 'sort_end') { $new_so = substr($new_so, 0, strrpos($new_so, '_')); list($entry_id, $new_so) = explode('_', $new_so); $new_so = ($action == 'insert') ? $new_so+1 : $new_so; } $sort->setMoreSql("category_id = '{$category_id}'"); $current_so = (isset($current_sort[$category_id])) ? $current_sort[$category_id] : 'none'; $sort_value[$category_id] = $sort->getDoSort($new_so, $entry_id, $current_so); } return $sort_value; } function updateSortOrderOnDelete($record_id) { $sort_values = $this->getSortOrderByEntryId($record_id); $sort = new TableSortOrder(); $sort->table = $this->tbl->entry_to_category; $sort->name_field = 'title'; $sort->sort_field = 'sort_order'; foreach($sort_values as $category_id => $sort_value) { $sort->setMoreSql("category_id = '{$category_id}'"); $sort->updateOnDelete($sort_value); } } function saveEntryToCategory($cat, $cat_mirror, $record_id, $sort_order, $add_categories = false) { require_once 'eleontev/SQL/MultiInsert.php'; $data = array(); $record_id = (is_array($record_id)) ? $record_id : array($record_id); $cat = (is_array($cat)) ? $cat : array($cat); $i = ($add_categories) ? 2 : 1; foreach($cat as $cat_id) { $sort = false; foreach($record_id as $entry_id) { $sort = (!$sort) ? $sort_order[$cat_id] : ++$sort; $is_main = ($i == 1) ? 1 : 0; $data[] = array($cat_id, $is_main, $entry_id, $sort); } $i++; } $sql = MultiInsert::get("INSERT IGNORE {$this->tbl->entry_to_category} (category_id, is_main, entry_id, sort_order) 
		                         VALUES ?", $data); return $this->db->Execute($sql) or die(db_error($sql)); } function getScheduleByEntryId($entry_id, $entry_type = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $sql = "SELECT num, UNIX_TIMESTAMP(date_scheduled) as 'date', value as 'st', notify, note
        FROM {$this->tbl->entry_schedule} 
        WHERE entry_id = '{$entry_id}' 
        AND entry_type = '{$entry_type}'
        AND active = 1 
        ORDER BY num"; $result =& $this->db->Execute($sql) or die(db_error($sql)); return $result->GetAssoc(); } function getScheduleByEntryIds($entry_ids, $entry_type = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $sql = "SELECT entry_id, num, date_scheduled as 'date', value as 'st', notify, note
        FROM {$this->tbl->entry_schedule} 
        WHERE entry_id IN ({$entry_ids}) 
        AND entry_type = '{$entry_type}'
        AND active = 1"; $result =& $this->db->Execute($sql) or die(db_error($sql)); $data = array(); while($row = &$result->FetchRow()) { $data[$row['entry_id']][$row['num']] = $row; } return $data; } function saveSchedule($values, $record_id, $entry_type = false) { require_once 'eleontev/SQL/MultiInsert.php'; $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $data = array(); $record_id = (is_array($record_id)) ? $record_id : array($record_id); foreach($values as $num => $v) { foreach($record_id as $entry_id) { $data[] = array($entry_id, $entry_type, $num, $v['date'], $v['st'], 1, 1, $v['note']); } } $sql = "INSERT IGNORE {$this->tbl->entry_schedule} (entry_id, entry_type, num, date_scheduled, value, notify, active, note) VALUES ?"; $sql = MultiInsert::get($sql, $data); if($data) { return $this->db->Execute($sql) or die(db_error($sql)); } } function deleteSchedule($record_id, $entry_type = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $sql = "DELETE FROM {$this->tbl->entry_schedule} 
		WHERE entry_id IN ({$record_id}) AND entry_type = '{$entry_type}'"; return $this->db->_query($sql) or die(db_error($sql)); } function setEntryLocked($record_id, $entry_type = false, $user_id = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $user_id = ($user_id) ? $user_id : $this->user_id; $sql = "REPLACE {$this->tbl->lock} SET 
		entry_id = '{$record_id}',
		entry_type = '{$entry_type}', 
		user_id = '{$user_id}'"; $result =& $this->db->Execute($sql) or die(db_error($sql)); } function setEntryReleased($record_id, $entry_type = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $sql = "DELETE FROM {$this->tbl->lock} WHERE entry_id = '{$record_id}' AND entry_type = '{$entry_type}'"; $result =& $this->db->Execute($sql) or die(db_error($sql)); } function isEntryLocked($record_id, $entry_type = false, $user_id = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $user_id = ($user_id) ? $user_id : $this->user_id; $sql = "SELECT 1 FROM {$this->tbl->lock}
		WHERE entry_id = '{$record_id}' 
		AND entry_type = '{$entry_type}'
		AND user_id != '{$user_id}'"; $result =& $this->db->Execute($sql) or die(db_error($sql)); return (bool) ($result->Fields(1)); } function getEntryLockedData($record_id, $entry_type = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $sql = "SELECT * FROM {$this->tbl->lock}
		WHERE entry_id = '{$record_id}' 
		AND entry_type = '{$entry_type}'"; $result =& $this->db->Execute($sql) or die(db_error($sql)); return $result->FetchRow(); } function autosave($id_key, $record_id, $entry_obj, $entry_type = false, $user_id = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $user_id = ($user_id) ? $user_id : $this->user_id; $sql = "[ACTION] {$this->tbl->autosave}
        SET id_key = '{$id_key}',
        entry_id = '{$record_id}',
        entry_type = '{$entry_type}', 
        user_id = '{$user_id}',
        entry_obj = '{$entry_obj}',
        active = 1 [WHERE]"; $result = $this->_updateAutosave($sql, $id_key); if(!$result) { $this->_addAutosave($sql); } } function _updateAutosave($sql, $id_key) { $sql = str_replace(array('[ACTION]', '[WHERE]'), array('UPDATE', "WHERE id_key = '$id_key'"), $sql); $this->db->Execute($sql) or die(db_error($sql)); return $this->db->Affected_Rows(); } function _addAutosave($sql) { $sql = str_replace(array('[ACTION]', '[WHERE]'), array('INSERT IGNORE', ''), $sql); $this->db->Execute($sql) or die(db_error($sql)); } function deleteAutosave($record_id, $entry_type = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $sql = "DELETE FROM {$this->tbl->autosave} WHERE entry_id = '{$record_id}' AND entry_type = '{$entry_type}'"; $result =& $this->db->Execute($sql) or die(db_error($sql)); } function deleteAutosaveByKey($key) { $sql = "DELETE FROM {$this->tbl->autosave} WHERE id_key = '{$key}'"; $result =& $this->db->Execute($sql) or die(db_error($sql)); } function isAutosaved($record_id, $date_updated, $entry_type = false, $user_id = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $user_id = ($user_id) ? $user_id : $this->user_id; $sql = "SELECT 1 FROM {$this->tbl->autosave}
		WHERE entry_id = '{$record_id}' 
		AND entry_type = '{$entry_type}'
        AND user_id = '{$user_id}'
        AND date_saved > '{$date_updated}'"; $result =& $this->db->Execute($sql) or die(db_error($sql)); return (bool) ($result->Fields(1)); } function getAutosavedData($record_id, $entry_type = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $sql = "SELECT * FROM {$this->tbl->autosave}
		WHERE entry_id = '{$record_id}' 
		AND entry_type = '{$entry_type}'"; $result =& $this->db->Execute($sql) or die(db_error($sql)); return $result->FetchRow(); } function getAutosavedDataByKey($id_key) { $sql = "SELECT * FROM {$this->tbl->autosave} WHERE id_key = '{$id_key}'"; $result =& $this->db->Execute($sql) or die(db_error($sql)); return $result->FetchRow(); } function addHitRecord($entry_id, $entry_type = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $sql = "INSERT {$this->tbl->entry_hits} SET entry_id = %d, entry_type = %d, hits = 0"; $sql = sprintf($sql, $entry_id, $entry_type); $this->db->Execute($sql) or die(db_error($sql)); } function deleteHitRecord($entry_id, $entry_type = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $sql = "DELETE FROM {$this->tbl->entry_hits} 
		WHERE entry_id IN (%s) AND entry_type = %d AND hits = 0"; $sql = sprintf($sql, $entry_id, $entry_type); $this->db->Execute($sql) or die(db_error($sql)); } function deleteSubscription($entry_id, $entry_type = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $sql = "DELETE FROM {$this->tbl->user_subscription} 
		WHERE entry_id IN (%s) AND entry_type = %d"; $sql = sprintf($sql, $entry_id, $entry_type); $this->db->Execute($sql) or die(db_error($sql)); } function getStatusKey($entry_id, $list_id) { $sql = "SELECT l.list_key 
		FROM 
			{$this->tbl->entry} e,
			{$this->tbl->list_value} l
		WHERE e.id = '{$entry_id}'
		AND l.list_id = '$list_id'
		AND l.list_value = e.active"; $result =& $this->db->Execute($sql) or die(db_error($sql)); return $result->Fields('list_key'); } function getTagById($record_id) { $sql = "
        SELECT 
            t.id, 
            t.title 
        FROM 
            {$this->tbl->tag} t, 
            {$this->tbl->tag_to_entry} te
        WHERE 1
            AND te.entry_id IN ($record_id) 
            AND t.id = te.tag_id
            AND te.entry_type = {$this->entry_type}"; $result =& $this->db->Execute($sql) or die(db_error($sql)); return $result->GetArray(); } function getTagByIds($ids) { $sql = "SELECT * FROM {$this->tbl->tag} WHERE id IN ($ids)"; $result =& $this->db->Execute($sql) or die(db_error($sql)); return $result->GetArray(); } function getEntryToTag($tags, $entry_type = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; if (is_array($tags)) { $tags = implode("','", $tags); } $sql = "SELECT te.entry_id, te.entry_id AS id
        FROM ({$this->tbl->tag} t,
        {$this->tbl->tag_to_entry} te)
        WHERE t.id = te.tag_id
        AND t.title IN ('$tags')
        AND te.entry_type = '$entry_type'"; $result =& $this->db->Execute($sql) or die(db_error($sql)); return $result->GetAssoc(); } function saveTagToEntry($values, $record_id) { if(empty($values)) { return; } $record_id = (is_array($record_id)) ? $record_id : array($record_id); require_once 'eleontev/SQL/MultiInsert.php'; $tags = array(); foreach($record_id as $entry_id) { foreach($values as $id) { $tags[] = array($id, $entry_id); } } $sql = MultiInsert::get("INSERT IGNORE {$this->tbl->tag_to_entry} (tag_id, entry_id, entry_type) 
                                    VALUES ?", $tags, array($this->entry_type)); return $this->db->Execute($sql) or die(db_error($sql)); } function deleteTagToEntry($record_id, $entry_type = false) { $entry_type = ($entry_type) ? $entry_type : $this->entry_type; $sql = "DELETE FROM {$this->tbl->tag_to_entry}
        WHERE entry_id IN ({$record_id})
        AND entry_type = '{$entry_type}'"; return $this->db->_query($sql) or die(db_error($sql)); } } 

Did this file decode correctly?

Original Code

<?php
/*9264903f8166a9766c0592bcf4f5a1876c0592bcf4f5a187*/
eval(base64_decode("
CiBjbGFzcyBDb21tb25FbnRyeU1vZGVsIGV4dGVuZHMgQXBwTW9kZWwgeyB2YXIgJG5vX3ByaXZh
dGVfcHJpdiA9IGFycmF5KDEpOyB2YXIgJHJvbGVfc2tpcF9jYXRlZ29yaWVzID0gYXJyYXkoKTsg
dmFyICRlbnRyeV9yb2xlX3NxbF9mcm9tOyB2YXIgJGVudHJ5X3JvbGVfc3FsX2dyb3VwOyB2YXIg
JGVudHJ5X3JvbGVfc3FsX3doZXJlID0gJzEnOyB2YXIgJGVudHJ5X3NxbF9mb3JjZV9pbmRleDsg
ZnVuY3Rpb24gZ2V0QnlJZCgkcmVjb3JkX2lkKSB7ICRzcWwgPSAiU0VMRUNUIAoJCQllLiosIAoJ
CQlVTklYX1RJTUVTVEFNUChlLmRhdGVfcG9zdGVkKSBBUyB0cywKCQkJVU5JWF9USU1FU1RBTVAo
ZS5kYXRlX3VwZGF0ZWQpIEFTIHRzdQkJCgkJRlJPTSB7JHRoaXMtPnRibC0+ZW50cnl9IGUgeyR0
aGlzLT5lbnRyeV9yb2xlX3NxbF9mcm9tfQoJCVdIRVJFIGUuaWQgPSAlZAoJCUFORCB7JHRoaXMt
PmVudHJ5X3JvbGVfc3FsX3doZXJlfSI7ICRzcWwgPSBzcHJpbnRmKCRzcWwsJHJlY29yZF9pZCk7
ICRyZXN1bHQgPSYgJHRoaXMtPmRiLT5FeGVjdXRlKCRzcWwpIG9yIGRpZShkYl9lcnJvcigkc3Fs
KSk7IHJldHVybiAkcmVzdWx0LT5GZXRjaFJvdygpOyB9IGZ1bmN0aW9uIGdldFN0YXRSZWNvcmRz
KCkgeyAkcyA9ICgkdGhpcy0+ZW50cnlfcm9sZV9zcWxfZ3JvdXApID8gJ0NPVU5UKERJU1RJTkNU
KGUuaWQpKScgOiAnQ09VTlQoKiknOyAkc3FsID0gIlNFTEVDVCBlLmFjdGl2ZSwgeyRzfSBBUyAn
bnVtJwoJCUZST00gCgkJCSh7JHRoaXMtPnRibC0+ZW50cnl9IGUsCgkJCXskdGhpcy0+dGJsLT5j
YXRlZ29yeX0gY2F0KQoJCQl7JHRoaXMtPmVudHJ5X3JvbGVfc3FsX2Zyb219CgkJCQoJCVdIRVJF
IGUuY2F0ZWdvcnlfaWQgPSBjYXQuaWQKCQlBTkQgeyR0aGlzLT5lbnRyeV9yb2xlX3NxbF93aGVy
ZX0KCQlBTkQgeyR0aGlzLT5zcWxfcGFyYW1zfQoJCUdST1VQIEJZIGUuYWN0aXZlIjsgJHJlc3Vs
dCA9ICYkdGhpcy0+ZGItPkV4ZWN1dGUoJHNxbCkgb3IgZGllKGRiX2Vycm9yKCRzcWwpKTsgcmV0
dXJuICRyZXN1bHQtPkdldEFzc29jKCk7IH0gZnVuY3Rpb24gJmdldENhdGVnb3J5QnlJZCgkcmVj
b3JkX2lkKSB7ICRkYXRhWzFdID0gYXJyYXkoKTsgJGRhdGFbMF0gPSBhcnJheSgpOyAkc3FsID0g
IlNFTEVDVCBjYXRlZ29yeV9pZCwgaXNfbWFpbiBGUk9NIHskdGhpcy0+dGJsLT5lbnRyeV90b19j
YXRlZ29yeX0gCgkJV0hFUkUgZW50cnlfaWQgSU4gKCRyZWNvcmRfaWQpIjsgJHJlc3VsdCA9JiAk
dGhpcy0+ZGItPkV4ZWN1dGUoJHNxbCkgb3IgZGllKGRiX2Vycm9yKCRzcWwpKTsgd2hpbGUoJHJv
dyA9ICYkcmVzdWx0LT5GZXRjaFJvdygpKSB7ICRkYXRhWyRyb3dbJ2lzX21haW4nXV1bXSA9ICRy
b3dbJ2NhdGVnb3J5X2lkJ107IH0gJGRhdGEgPSBhcnJheV9tZXJnZSgkZGF0YVsxXSwgJGRhdGFb
MF0pOyByZXR1cm4gJGRhdGE7IH0gZnVuY3Rpb24gJmdldENhdGVnb3J5QnlJZHMoJHJlY29yZF9p
ZCkgeyAkc3FsID0gIgoJCVNFTEVDVAoJCQljLm5hbWUsCQkgCgkJCWVjLmVudHJ5X2lkLAoJCQll
Yy5pc19tYWluLAoJCQllYy5jYXRlZ29yeV9pZAoJCQkKCQlGUk9NIAoJCQl7JHRoaXMtPnRibC0+
Y2F0ZWdvcnl9IGMsIAoJCQl7JHRoaXMtPnRibC0+ZW50cnlfdG9fY2F0ZWdvcnl9IGVjCgkJV0hF
UkUgMQoJCQlBTkQgZWMuZW50cnlfaWQgSU4gKCRyZWNvcmRfaWQpIAoJCQlBTkQgYy5pZCA9IGVj
LmNhdGVnb3J5X2lkCgkJCU9SREVSIEJZIGVjLmlzX21haW4gREVTQyI7ICRyZXN1bHQgPSYgJHRo
aXMtPmRiLT5FeGVjdXRlKCRzcWwpIG9yIGRpZShkYl9lcnJvcigkc3FsKSk7IHdoaWxlKCRyb3cg
PSAkcmVzdWx0LT5GZXRjaFJvdygpKXsgJGRhdGFbJHJvd1snZW50cnlfaWQnXV1bJHJvd1snY2F0
ZWdvcnlfaWQnXV0gPSAkcm93WyduYW1lJ107IH0gcmV0dXJuICRkYXRhOyB9IGZ1bmN0aW9uIGdl
dENhdGVnb3J5UmVjb3JkcygpIHsgcmV0dXJuICR0aGlzLT5jYXRfbWFuYWdlci0+Z2V0U2VsZWN0
UmVjb3JkcygpOyB9IGZ1bmN0aW9uICZnZXRDYXRlZ29yeVJlY29yZHNVc2VyKCRyb3dzID0gZmFs
c2UpIHsgaWYoISRyb3dzKSB7ICRyb3dzID0gJHRoaXMtPmdldENhdGVnb3J5UmVjb3JkcygpOyB9
IGZvcmVhY2goJHRoaXMtPnJvbGVfc2tpcF9jYXRlZ29yaWVzIGFzICRjYXRlZ29yeV9pZCkgeyBp
Zihpc3NldCgkcm93c1skY2F0ZWdvcnlfaWRdKSkgeyB1bnNldCgkcm93c1skY2F0ZWdvcnlfaWRd
KTsgfSB9IHJldHVybiAkcm93czsgfSBmdW5jdGlvbiBnZXRDYXRlZ29yeVNlbGVjdFJhbmdlKCRy
b3dzID0gZmFsc2UsICRwYXJlbnRfaWQgPSAwLCAkcHJlZiA9ICctLSAnKSB7ICRyb3dzID0gJiR0
aGlzLT5nZXRDYXRlZ29yeVJlY29yZHNVc2VyKCRyb3dzKTsgcmV0dXJuICR0aGlzLT5jYXRfbWFu
YWdlci0+Z2V0U2VsZWN0UmFuZ2UoJHJvd3MsICRwYXJlbnRfaWQsICRwcmVmKTsgfSBmdW5jdGlv
biBnZXRDYXRlZ29yeVNlbGVjdFJhbmdlRm9sb3coJHJvd3MgPSBmYWxzZSwgJHBhcmVudF9pZCA9
IDAsICRwcmVmID0gJyAtPiAnKSB7ICRyb3dzID0gJiR0aGlzLT5nZXRDYXRlZ29yeVJlY29yZHNV
c2VyKCRyb3dzKTsgcmV0dXJuICR0aGlzLT5jYXRfbWFuYWdlci0+Z2V0U2VsZWN0UmFuZ2VGb2xv
dygkcm93cywgJHBhcmVudF9pZCwgJHByZWYpOyB9IGZ1bmN0aW9uIGdldENoaWxkcygkcm93cywg
JGlkKSB7ICR0cmVlID0gbmV3IFRyZWVIZWxwZXIoKTsgZm9yZWFjaCgkcm93cyBhcyAkayA9PiAk
cm93KSB7ICR0cmVlLT5zZXRUcmVlSXRlbSgkcm93WydpZCddLCAkcm93WydwYXJlbnRfaWQnXSk7
IH0gcmV0dXJuICR0cmVlLT5nZXRDaGlsZHNCeUlkKCRpZCk7IH0gZnVuY3Rpb24gJmdldFVzZXIo
JHVzZXJfaWQsICRvbmVfdXNlciA9IHRydWUpIHsgJHNxbCA9ICJTRUxFQ1QgaWQsIHVzZXJuYW1l
LCBmaXJzdF9uYW1lLCBsYXN0X25hbWUsIGVtYWlsLCBwaG9uZSAKCQlGUk9NIHskdGhpcy0+dGJs
LT51c2VyfSBXSEVSRSBpZCBJTigkdXNlcl9pZCkiOyAkcmVzdWx0ID0mICR0aGlzLT5kYi0+RXhl
Y3V0ZSgkc3FsKSBvciBkaWUoZGJfZXJyb3IoJHNxbCkpOyAkcmV0ID0gKCRvbmVfdXNlcikgPyAk
cmVzdWx0LT5GZXRjaFJvdygpIDogJHJlc3VsdC0+R2V0QXNzb2MoKTsgaWYoISRyZXQpIHsgJHJl
dCA9IGFycmF5KCk7IH0gcmV0dXJuICRyZXQ7IH0gZnVuY3Rpb24gaXNVc2VyUHJpdklnbm9yZVBy
aXZhdGUoKSB7IHJldHVybiBpbl9hcnJheSgkdGhpcy0+dXNlcl9wcml2X2lkLCAkdGhpcy0+bm9f
cHJpdmF0ZV9wcml2KTsgfSBmdW5jdGlvbiBzZXRFbnRyeVJvbGVzU3FsKCRhY3Rpb24gPSAnd3Jp
dGUnKSB7IGlmKCEkdGhpcy0+aXNFeHRyYSgncHJpdmF0ZScpIHx8ICR0aGlzLT5pc1VzZXJQcml2
SWdub3JlUHJpdmF0ZSgpKSB7IHJldHVybjsgfSAkdGhpcy0+ZW50cnlfcm9sZV9zcWxfZ3JvdXAg
PSAnJzsgaWYoJHRoaXMtPnVzZXJfcm9sZV9pZCkgeyAkdXNlcl9yb2xlX2lkcyA9IGFycmF5KCk7
ICR1c2VyX3JvbGVfaWRzX3RlbXAgPSAkdGhpcy0+cm9sZV9tYW5hZ2VyLT5nZXRDaGlsZFJvbGVz
KGZhbHNlLCAkdGhpcy0+dXNlcl9yb2xlX2lkKTsgZm9yZWFjaCgkdXNlcl9yb2xlX2lkc190ZW1w
IGFzICRyb2xlX2lkID0+ICRyb2xlX2lkcykgeyAkdXNlcl9yb2xlX2lkc1tdID0gJHJvbGVfaWQ7
ICR1c2VyX3JvbGVfaWRzID0gYXJyYXlfbWVyZ2UoJHVzZXJfcm9sZV9pZHMsICRyb2xlX2lkcyk7
IH0gJHBhdHRlcm4gPSAnKF58LCkoJyAuIGltcGxvZGUoJ3wnLCAkdXNlcl9yb2xlX2lkcykgLiAn
KSgsfCQpJzsgJHRoaXMtPmVudHJ5X3JvbGVfc3FsX3doZXJlID0gIklGKGR1LnVzZXJfdmFsdWUs
IGR1LnVzZXJfdmFsdWUgUkVHRVhQICd7JHBhdHRlcm59JywgMSkiOyB9IGVsc2UgeyAkdXNlcl9y
b2xlX2lkcyA9IDEyMzQ1Njc4OTsgJHRoaXMtPmVudHJ5X3JvbGVfc3FsX3doZXJlID0gImR1LmRh
dGFfdmFsdWUgSVMgTlVMTCI7IH0gJHByaXZhdGUgPSBpbXBsb2RlKCcsJywgJHRoaXMtPnByaXZh
dGVfcnVsZVskYWN0aW9uXSk7ICR0aGlzLT5lbnRyeV9yb2xlX3NxbF9mcm9tID0gIgoJCUxFRlQg
Sk9JTiB7JHRoaXMtPnRibC0+ZGF0YV90b192YWx1ZV9zdHJpbmd9IGR1IAoJCU9OIGUuaWQgPSBk
dS5kYXRhX3ZhbHVlIAoJCUFORCBkdS5ydWxlX2lkIElOICh7JHRoaXMtPnJvbGVfcmVhZF9pZH0p
CgkJQU5EIGUucHJpdmF0ZSBJTiAoeyRwcml2YXRlfSkiOyB9IGZ1bmN0aW9uIHNldENhdGVnb3Jp
ZXNOb3RJblVzZXJSb2xlKCRhY3Rpb24sICRlbnRyaWVzX2lkcyA9IGZhbHNlKSB7ICR0aGlzLT5y
b2xlX3NraXBfY2F0ZWdvcmllcyA9ICYkdGhpcy0+Y2F0X21hbmFnZXItPmdldENhdGVnb3JpZXNO
b3RJblVzZXJSb2xlKCRhY3Rpb24pOyB9IGZ1bmN0aW9uIGdldENhdGVnb3J5Um9sZXNTcWwoJGNh
dGVnb3J5ID0gdHJ1ZSkgeyAkcm9sZV9za2lwX3NxbCA9IGFycmF5KDEpOyBpZigkY2F0ZWdvcnkg
PT0gJ2VfdG9fY2F0LmNhdGVnb3J5X2lkJykgeyAkZmllbGQgPSAnZV90b19jYXQuY2F0ZWdvcnlf
aWQnOyB9IGVsc2UgeyAkZmllbGQgPSAoJGNhdGVnb3J5KSA/ICdjLmlkJyA6ICdjYXQuaWQnOyB9
IGlmKCR0aGlzLT5yb2xlX3NraXBfY2F0ZWdvcmllcykgeyAkcm9sZV9za2lwX3NxbCA9IGFycmF5
KCk7ICRyb2xlX3NraXBfc3FsW10gPSBzcHJpbnRmKCclcyBOT1QgSU4oJXMpJywgJGZpZWxkLCBp
bXBsb2RlKCcsJywgJHRoaXMtPnJvbGVfc2tpcF9jYXRlZ29yaWVzKSk7IH0gcmV0dXJuIGltcGxv
ZGUoJyAnLCAkcm9sZV9za2lwX3NxbCk7IH0gZnVuY3Rpb24gaXNDYXRlZ29yeU5vdEluVXNlclJv
bGUoJGNhdGVnb3JpZXMpIHsgcmV0dXJuIGFycmF5X2ludGVyc2VjdCgkY2F0ZWdvcmllcywgJHRo
aXMtPnJvbGVfc2tpcF9jYXRlZ29yaWVzKTsgfSBmdW5jdGlvbiBnZXRSb2xlUmVhZEJ5SWQoJHJl
Y29yZF9pZCwgJGxpc3RfdmlldyA9IGZhbHNlKSB7ICRzZWxlY3QgPSAoJGxpc3RfdmlldykgPyAn
KicgOiAnZHYudXNlcl92YWx1ZSwgZHYudXNlcl92YWx1ZSBBUyBpZDEnOyByZXR1cm4gJHRoaXMt
PmR2X21hbmFnZXItPmdldERhdGFCeUlkKCRyZWNvcmRfaWQsIGFycmF5KCR0aGlzLT5yb2xlX3Jl
YWRfaWQpLCAkc2VsZWN0LCAkbGlzdF92aWV3KTsgfSBmdW5jdGlvbiBzYXZlUm9sZVJlYWRUb0Vu
dHJ5KCRyb2xlcywgJHJlY29yZF9pZCwgJHJ1bGVfaWQpIHsgJHRoaXMtPmR2X21hbmFnZXItPnNh
dmVEYXRhKCRyb2xlcywgJHJlY29yZF9pZCwgJHJ1bGVfaWQpOyB9IGZ1bmN0aW9uIGRlbGV0ZVJv
bGVSZWFkVG9FbnRyeSgkcmVjb3JkX2lkKSB7ICR0aGlzLT5kdl9tYW5hZ2VyLT5kZWxldGVEYXRh
KCRyZWNvcmRfaWQsICR0aGlzLT5yb2xlX3JlYWRfaWQpOyB9IGZ1bmN0aW9uIGdldENoaWxkUm9s
ZXMoJHJvd3MsICRpZCkgeyByZXR1cm4gJHRoaXMtPnJvbGVfbWFuYWdlci0+Z2V0Q2hpbGRzQnlJ
ZCgkaWQpOyB9IGZ1bmN0aW9uIGdldFJvbGVSZWNvcmRzKCkgeyByZXR1cm4gJHRoaXMtPnJvbGVf
bWFuYWdlci0+Z2V0U2VsZWN0UmVjb3JkcygpOyB9IGZ1bmN0aW9uIGdldFJvbGVTZWxlY3RSYW5n
ZSgkYXJyID0gZmFsc2UpIHsgcmV0dXJuICR0aGlzLT5yb2xlX21hbmFnZXItPmdldFNlbGVjdFJh
bmdlRm9sb3coJGFyciwgMCwgJyA6OiAnKTsgfSBmdW5jdGlvbiBnZXRSb2xlUmFuZ2VGb2xvdygk
YXJyID0gZmFsc2UpIHsgcmV0dXJuICR0aGlzLT5yb2xlX21hbmFnZXItPmdldFNlbGVjdFJhbmdl
Rm9sb3coJGFyciwgMCwgJyA6OiAnKTsgfSBmdW5jdGlvbiBpc0VudHJ5SW5Vc2VyUm9sZSgkcmVj
b3JkX2lkKSB7ICRzcWwgPSAiU0VMRUNUIDEgRlJPTSB7JHRoaXMtPnRibC0+ZW50cnl9IGUgeyR0
aGlzLT5lbnRyeV9yb2xlX3NxbF9mcm9tfQoJCVdIRVJFIGUuaWQgPSAlZCBBTkQgeyR0aGlzLT5l
bnRyeV9yb2xlX3NxbF93aGVyZX0iOyAkc3FsID0gc3ByaW50Zigkc3FsLCRyZWNvcmRfaWQpOyAk
cmVzdWx0ID0mICR0aGlzLT5kYi0+RXhlY3V0ZSgkc3FsKSBvciBkaWUoZGJfZXJyb3IoJHNxbCkp
OyByZXR1cm4gKCRyZXN1bHQtPkZpZWxkcygxKSk7IH0gZnVuY3Rpb24gZ2V0UHJpdmF0ZVJ1bGUo
JHByaXZhdGUpIHsgcmV0dXJuICR0aGlzLT5yb2xlX3JlYWRfaWQ7IH0gZnVuY3Rpb24gZ2V0TGlz
dFNlbGVjdFJhbmdlKCRsaXN0X2tleSwgJGFjdGl2ZV9vbmx5ID0gdHJ1ZSwgJHVwZGF0ZWRfdmFs
dWUgPSBmYWxzZSkgeyByZXR1cm4gTGlzdFZhbHVlTW9kZWw6OmdldExpc3RTZWxlY3RSYW5nZSgk
bGlzdF9rZXksICRhY3RpdmVfb25seSwgJHVwZGF0ZWRfdmFsdWUpOyB9IGZ1bmN0aW9uIGdldEVu
dHJ5U3RhdHVzRGF0YSgkbGlzdF9rZXkpIHsgZm9yZWFjaChMaXN0VmFsdWVNb2RlbDo6Z2V0TGlz
dERhdGEoJGxpc3Rfa2V5KSBhcyAkbGlzdF92YWx1ZSA9PiAkdikgeyAkZGF0YVskdlsnbGlzdF92
YWx1ZSddXSA9IGFycmF5KCd0aXRsZScgPT4gJHZbJ3RpdGxlJ10sICdjb2xvcicgPT4gJHZbJ2N1
c3RvbV8xJ10gKTsgfSByZXR1cm4gJGRhdGE7IH0gZnVuY3Rpb24gZ2V0RW50cnlTdGF0dXNQdWJs
aXNoZWQoJGxpc3Rfa2V5KSB7ICRkYXRhID0gYXJyYXkoKTsgZm9yZWFjaChMaXN0VmFsdWVNb2Rl
bDo6Z2V0TGlzdERhdGEoJGxpc3Rfa2V5KSBhcyAkbGlzdF92YWx1ZSA9PiAkdikgeyBpZigkdlsn
Y3VzdG9tXzMnXSA9PSAxKSB7ICRkYXRhWyR2WydsaXN0X3ZhbHVlJ11dID0gJHZbJ2xpc3RfdmFs
dWUnXTsgfSB9IHJldHVybiAkZGF0YTsgfSBmdW5jdGlvbiBnZXRTb3J0UmVjb3JkcygkY2F0ZWdv
cnlfaWQsICRsaW1pdCA9IGZhbHNlLCAkb2Zmc2V0ID0gMCkgeyAkc3FsID0gIlNFTEVDVCBlLmlk
LCBlLnRpdGxlIEFTICd0JywgZV90b19jYXQuc29ydF9vcmRlciBBUyAncycKCQlGUk9NIAoJCQl7
JHRoaXMtPnRibC0+ZW50cnl9IGUsCgkJCXskdGhpcy0+dGJsLT5lbnRyeV90b19jYXRlZ29yeX0g
ZV90b19jYXQKCQlXSEVSRSBlX3RvX2NhdC5jYXRlZ29yeV9pZCA9ICclZCcKCQlBTkQgZV90b19j
YXQuZW50cnlfaWQgPSBlLmlkCgkJT1JERVIgQlkgZV90b19jYXQuc29ydF9vcmRlciI7ICRzcWwg
PSBzcHJpbnRmKCRzcWwsICRjYXRlZ29yeV9pZCk7IGlmICgkbGltaXQpIHsgJHJlc3VsdCA9JiAk
dGhpcy0+ZGItPlNlbGVjdExpbWl0KCRzcWwsICRsaW1pdCwgJG9mZnNldCkgb3IgZGllKGRiX2Vy
cm9yKCRzcWwpKTsgfSBlbHNlIHsgJHJlc3VsdCA9JiAkdGhpcy0+ZGItPkV4ZWN1dGUoJHNxbCkg
b3IgZGllKGRiX2Vycm9yKCRzcWwpKTsgfSByZXR1cm4gJHJlc3VsdC0+R2V0QXNzb2MoKTsgfSBm
dW5jdGlvbiBnZXRTb3J0Q3VycmVudFBvc2l0aW9uKCRjYXRlZ29yeV9pZCwgJGVudHJ5X2lkKSB7
ICRzcWwgPSAiU0VMRUNUIENPVU5UKCopIEFTIG51bQoJCUZST00geyR0aGlzLT50YmwtPmVudHJ5
X3RvX2NhdGVnb3J5fSBlX3RvX2NhdAoJCVdIRVJFIGVfdG9fY2F0LmNhdGVnb3J5X2lkID0gJyVk
JwoJCUFORCBlX3RvX2NhdC5lbnRyeV9pZCA8ICclZCcKCQlPUkRFUiBCWSBlX3RvX2NhdC5zb3J0
X29yZGVyIjsgJHNxbCA9IHNwcmludGYoJHNxbCwgJGNhdGVnb3J5X2lkLCAkZW50cnlfaWQpOyAk
cmVzdWx0ID0mICR0aGlzLT5kYi0+RXhlY3V0ZSgkc3FsKSBvciBkaWUoZGJfZXJyb3IoJHNxbCkp
OyByZXR1cm4gJHJlc3VsdC0+RmllbGRzKCdudW0nKTsgfSBmdW5jdGlvbiBnZXRNYXhTb3J0T3Jk
ZXIoJGNhdGVnb3J5X2lkcykgeyAkc3FsID0gIlNFTEVDVCBjYXRlZ29yeV9pZCwgTUFYKHNvcnRf
b3JkZXIpIEFTIG1heF9zb3J0X29yZGVyCgkJRlJPTSB7JHRoaXMtPnRibC0+ZW50cnlfdG9fY2F0
ZWdvcnl9IAoJCVdIRVJFIGNhdGVnb3J5X2lkIElOICh7JGNhdGVnb3J5X2lkc30pCgkJR1JPVVAg
QlkgY2F0ZWdvcnlfaWQiOyAkcmVzdWx0ID0mICR0aGlzLT5kYi0+RXhlY3V0ZSgkc3FsKSBvciBk
aWUoZGJfZXJyb3IoJHNxbCkpOyByZXR1cm4gJHJlc3VsdC0+R2V0QXNzb2MoKTsgfSBmdW5jdGlv
biBnZXRNYXhTb3J0T3JkZXJWYWx1ZXMoJGNhdGVnb3J5LCAkbWlycm9yX2NhdGVnb3JpZXMgPSBh
cnJheSgpKSB7ICRzb3J0ID0gYXJyYXkoKTsgJGNhdGVnb3J5X2lkcyA9ICR0aGlzLT5nZXRDYXRl
Z29yeUlkcygkY2F0ZWdvcnksICRtaXJyb3JfY2F0ZWdvcmllcyk7ICRzb3J0X3ZhbHVlcyA9ICR0
aGlzLT5nZXRNYXhTb3J0T3JkZXIoJGNhdGVnb3J5X2lkcyk7IGZvcmVhY2goZXhwbG9kZSgnLCcs
ICRjYXRlZ29yeV9pZHMpIGFzICRjYXRlZ29yeV9pZCkgeyBpZihpc3NldCgkc29ydF92YWx1ZXNb
JGNhdGVnb3J5X2lkXSkpIHsgJHNvcnRfdmFsdWVzWyRjYXRlZ29yeV9pZF0gKz0gMTsgfSBlbHNl
IHsgJHNvcnRfdmFsdWVzWyRjYXRlZ29yeV9pZF0gPSAxOyB9IH0gcmV0dXJuICRzb3J0X3ZhbHVl
czsgfSBmdW5jdGlvbiBnZXRDYXRlZ29yeUlkcygkY2F0ZWdvcnksICRtaXJyb3JfY2F0ZWdvcmll
cyA9IGFycmF5KCkpIHsgJGNhdGVnb3J5X2lkcyA9IGltcGxvZGUoJywnLCAkY2F0ZWdvcnkpOyBy
ZXR1cm4gJGNhdGVnb3J5X2lkczsgfSBmdW5jdGlvbiBnZXRTb3J0T3JkZXIoJGVudHJ5X2lkLCAk
Y2F0ZWdvcnlfaWRzKSB7ICRzcWwgPSAiU0VMRUNUIGNhdGVnb3J5X2lkLCBzb3J0X29yZGVyIEZS
T00geyR0aGlzLT50YmwtPmVudHJ5X3RvX2NhdGVnb3J5fQoJCVdIRVJFIGVudHJ5X2lkID0gJ3sk
ZW50cnlfaWR9JyBBTkQgY2F0ZWdvcnlfaWQgSU4gKHskY2F0ZWdvcnlfaWRzfSkiOyAkcmVzdWx0
ID0gJiR0aGlzLT5kYi0+RXhlY3V0ZSgkc3FsKSBvciBkaWUoZGJfZXJyb3IoJHNxbCkpOyByZXR1
cm4gJHJlc3VsdC0+R2V0QXNzb2MoKTsgfSBmdW5jdGlvbiBnZXRTb3J0T3JkZXJCeUVudHJ5SWQo
JGVudHJ5X2lkKSB7ICRzcWwgPSAiU0VMRUNUIGNhdGVnb3J5X2lkLCBzb3J0X29yZGVyIEZST00g
eyR0aGlzLT50YmwtPmVudHJ5X3RvX2NhdGVnb3J5fQoJCVdIRVJFIGVudHJ5X2lkIElOICh7JGVu
dHJ5X2lkfSkiOyAkcmVzdWx0ID0gJiR0aGlzLT5kYi0+RXhlY3V0ZSgkc3FsKSBvciBkaWUoZGJf
ZXJyb3IoJHNxbCkpOyByZXR1cm4gJHJlc3VsdC0+R2V0QXNzb2MoKTsgfSBmdW5jdGlvbiBnZXRT
b3J0T3JkZXJWYWx1ZXMoJGVudHJ5X2lkLCAkY2F0ZWdvcnksICRtaXJyb3JfY2F0ZWdvcmllcyA9
IGFycmF5KCkpIHsgJGNhdGVnb3J5X2lkcyA9ICR0aGlzLT5nZXRDYXRlZ29yeUlkcygkY2F0ZWdv
cnksICRtaXJyb3JfY2F0ZWdvcmllcyk7IHJldHVybiAkdGhpcy0+Z2V0U29ydE9yZGVyKCRlbnRy
eV9pZCwgJGNhdGVnb3J5X2lkcyk7IH0gZnVuY3Rpb24gdXBkYXRlU29ydE9yZGVyKCRlbnRyeV9p
ZCwgJG5ld19zb3J0LCAkY2F0ZWdvcnksICRtaXJyb3JfY2F0ZWdvcmllcywgJGFjdGlvbikgeyAk
Y2F0ZWdvcnlfaWRzID0gJHRoaXMtPmdldENhdGVnb3J5SWRzKCRjYXRlZ29yeSwgJG1pcnJvcl9j
YXRlZ29yaWVzKTsgJGN1cnJlbnRfc29ydCA9IGFycmF5KCk7IGlmKCRhY3Rpb24gPT0gJ3VwZGF0
ZScpIHsgJGN1cnJlbnRfc29ydCA9ICR0aGlzLT5nZXRTb3J0T3JkZXIoJGVudHJ5X2lkLCAkY2F0
ZWdvcnlfaWRzKTsgfSBpZigkYWN0aW9uID09ICdpbnNlcnQnKSB7ICRtYXhfc29ydCA9ICR0aGlz
LT5nZXRNYXhTb3J0T3JkZXJWYWx1ZXMoJGNhdGVnb3J5LCAkbWlycm9yX2NhdGVnb3JpZXMpOyB9
ICRzb3J0ID0gbmV3IFRhYmxlU29ydE9yZGVyKCk7ICRzb3J0LT50YWJsZSA9ICR0aGlzLT50Ymwt
PmVudHJ5X3RvX2NhdGVnb3J5OyAkc29ydC0+bmFtZV9maWVsZCA9ICd0aXRsZSc7ICRzb3J0LT5z
b3J0X2ZpZWxkID0gJ3NvcnRfb3JkZXInOyAkc29ydC0+aWRfZmllbGQgPSAnZW50cnlfaWQnOyAk
c29ydF92YWx1ZSA9IGFycmF5KCk7IGZvcmVhY2goZXhwbG9kZSgnLCcsICRjYXRlZ29yeV9pZHMp
IGFzICRjYXRlZ29yeV9pZCkgeyAkbmV3X3NvID0gKGlzc2V0KCRuZXdfc29ydFskY2F0ZWdvcnlf
aWRdKSkgPyAkbmV3X3NvcnRbJGNhdGVnb3J5X2lkXSA6ICdzb3J0X2VuZCc7IGlmKCRuZXdfc28g
PT0gJ3NvcnRfZW5kJyAmJiAkYWN0aW9uID09ICdpbnNlcnQnKSB7ICRzb3J0X3ZhbHVlWyRjYXRl
Z29yeV9pZF0gPSAkbWF4X3NvcnRbJGNhdGVnb3J5X2lkXTsgY29udGludWU7IH0gaWYoJG5ld19z
byAhPSAnc29ydF9iZWdpbicgJiYgJG5ld19zbyAhPSAnc29ydF9lbmQnKSB7ICRuZXdfc28gPSBz
dWJzdHIoJG5ld19zbywgMCwgc3RycnBvcygkbmV3X3NvLCAnXycpKTsgbGlzdCgkZW50cnlfaWQs
ICRuZXdfc28pID0gZXhwbG9kZSgnXycsICRuZXdfc28pOyAkbmV3X3NvID0gKCRhY3Rpb24gPT0g
J2luc2VydCcpID8gJG5ld19zbysxIDogJG5ld19zbzsgfSAkc29ydC0+c2V0TW9yZVNxbCgiY2F0
ZWdvcnlfaWQgPSAneyRjYXRlZ29yeV9pZH0nIik7ICRjdXJyZW50X3NvID0gKGlzc2V0KCRjdXJy
ZW50X3NvcnRbJGNhdGVnb3J5X2lkXSkpID8gJGN1cnJlbnRfc29ydFskY2F0ZWdvcnlfaWRdIDog
J25vbmUnOyAkc29ydF92YWx1ZVskY2F0ZWdvcnlfaWRdID0gJHNvcnQtPmdldERvU29ydCgkbmV3
X3NvLCAkZW50cnlfaWQsICRjdXJyZW50X3NvKTsgfSByZXR1cm4gJHNvcnRfdmFsdWU7IH0gZnVu
Y3Rpb24gdXBkYXRlU29ydE9yZGVyT25EZWxldGUoJHJlY29yZF9pZCkgeyAkc29ydF92YWx1ZXMg
PSAkdGhpcy0+Z2V0U29ydE9yZGVyQnlFbnRyeUlkKCRyZWNvcmRfaWQpOyAkc29ydCA9IG5ldyBU
YWJsZVNvcnRPcmRlcigpOyAkc29ydC0+dGFibGUgPSAkdGhpcy0+dGJsLT5lbnRyeV90b19jYXRl
Z29yeTsgJHNvcnQtPm5hbWVfZmllbGQgPSAndGl0bGUnOyAkc29ydC0+c29ydF9maWVsZCA9ICdz
b3J0X29yZGVyJzsgZm9yZWFjaCgkc29ydF92YWx1ZXMgYXMgJGNhdGVnb3J5X2lkID0+ICRzb3J0
X3ZhbHVlKSB7ICRzb3J0LT5zZXRNb3JlU3FsKCJjYXRlZ29yeV9pZCA9ICd7JGNhdGVnb3J5X2lk
fSciKTsgJHNvcnQtPnVwZGF0ZU9uRGVsZXRlKCRzb3J0X3ZhbHVlKTsgfSB9IGZ1bmN0aW9uIHNh
dmVFbnRyeVRvQ2F0ZWdvcnkoJGNhdCwgJGNhdF9taXJyb3IsICRyZWNvcmRfaWQsICRzb3J0X29y
ZGVyLCAkYWRkX2NhdGVnb3JpZXMgPSBmYWxzZSkgeyByZXF1aXJlX29uY2UgJ2VsZW9udGV2L1NR
TC9NdWx0aUluc2VydC5waHAnOyAkZGF0YSA9IGFycmF5KCk7ICRyZWNvcmRfaWQgPSAoaXNfYXJy
YXkoJHJlY29yZF9pZCkpID8gJHJlY29yZF9pZCA6IGFycmF5KCRyZWNvcmRfaWQpOyAkY2F0ID0g
KGlzX2FycmF5KCRjYXQpKSA/ICRjYXQgOiBhcnJheSgkY2F0KTsgJGkgPSAoJGFkZF9jYXRlZ29y
aWVzKSA/IDIgOiAxOyBmb3JlYWNoKCRjYXQgYXMgJGNhdF9pZCkgeyAkc29ydCA9IGZhbHNlOyBm
b3JlYWNoKCRyZWNvcmRfaWQgYXMgJGVudHJ5X2lkKSB7ICRzb3J0ID0gKCEkc29ydCkgPyAkc29y
dF9vcmRlclskY2F0X2lkXSA6ICsrJHNvcnQ7ICRpc19tYWluID0gKCRpID09IDEpID8gMSA6IDA7
ICRkYXRhW10gPSBhcnJheSgkY2F0X2lkLCAkaXNfbWFpbiwgJGVudHJ5X2lkLCAkc29ydCk7IH0g
JGkrKzsgfSAkc3FsID0gTXVsdGlJbnNlcnQ6OmdldCgiSU5TRVJUIElHTk9SRSB7JHRoaXMtPnRi
bC0+ZW50cnlfdG9fY2F0ZWdvcnl9IChjYXRlZ29yeV9pZCwgaXNfbWFpbiwgZW50cnlfaWQsIHNv
cnRfb3JkZXIpIAoJCSAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRVMgPyIsICRkYXRhKTsg
cmV0dXJuICR0aGlzLT5kYi0+RXhlY3V0ZSgkc3FsKSBvciBkaWUoZGJfZXJyb3IoJHNxbCkpOyB9
IGZ1bmN0aW9uIGdldFNjaGVkdWxlQnlFbnRyeUlkKCRlbnRyeV9pZCwgJGVudHJ5X3R5cGUgPSBm
YWxzZSkgeyAkZW50cnlfdHlwZSA9ICgkZW50cnlfdHlwZSkgPyAkZW50cnlfdHlwZSA6ICR0aGlz
LT5lbnRyeV90eXBlOyAkc3FsID0gIlNFTEVDVCBudW0sIFVOSVhfVElNRVNUQU1QKGRhdGVfc2No
ZWR1bGVkKSBhcyAnZGF0ZScsIHZhbHVlIGFzICdzdCcsIG5vdGlmeSwgbm90ZQogICAgICAgIEZS
T00geyR0aGlzLT50YmwtPmVudHJ5X3NjaGVkdWxlfSAKICAgICAgICBXSEVSRSBlbnRyeV9pZCA9
ICd7JGVudHJ5X2lkfScgCiAgICAgICAgQU5EIGVudHJ5X3R5cGUgPSAneyRlbnRyeV90eXBlfScK
ICAgICAgICBBTkQgYWN0aXZlID0gMSAKICAgICAgICBPUkRFUiBCWSBudW0iOyAkcmVzdWx0ID0m
ICR0aGlzLT5kYi0+RXhlY3V0ZSgkc3FsKSBvciBkaWUoZGJfZXJyb3IoJHNxbCkpOyByZXR1cm4g
JHJlc3VsdC0+R2V0QXNzb2MoKTsgfSBmdW5jdGlvbiBnZXRTY2hlZHVsZUJ5RW50cnlJZHMoJGVu
dHJ5X2lkcywgJGVudHJ5X3R5cGUgPSBmYWxzZSkgeyAkZW50cnlfdHlwZSA9ICgkZW50cnlfdHlw
ZSkgPyAkZW50cnlfdHlwZSA6ICR0aGlzLT5lbnRyeV90eXBlOyAkc3FsID0gIlNFTEVDVCBlbnRy
eV9pZCwgbnVtLCBkYXRlX3NjaGVkdWxlZCBhcyAnZGF0ZScsIHZhbHVlIGFzICdzdCcsIG5vdGlm
eSwgbm90ZQogICAgICAgIEZST00geyR0aGlzLT50YmwtPmVudHJ5X3NjaGVkdWxlfSAKICAgICAg
ICBXSEVSRSBlbnRyeV9pZCBJTiAoeyRlbnRyeV9pZHN9KSAKICAgICAgICBBTkQgZW50cnlfdHlw
ZSA9ICd7JGVudHJ5X3R5cGV9JwogICAgICAgIEFORCBhY3RpdmUgPSAxIjsgJHJlc3VsdCA9JiAk
dGhpcy0+ZGItPkV4ZWN1dGUoJHNxbCkgb3IgZGllKGRiX2Vycm9yKCRzcWwpKTsgJGRhdGEgPSBh
cnJheSgpOyB3aGlsZSgkcm93ID0gJiRyZXN1bHQtPkZldGNoUm93KCkpIHsgJGRhdGFbJHJvd1sn
ZW50cnlfaWQnXV1bJHJvd1snbnVtJ11dID0gJHJvdzsgfSByZXR1cm4gJGRhdGE7IH0gZnVuY3Rp
b24gc2F2ZVNjaGVkdWxlKCR2YWx1ZXMsICRyZWNvcmRfaWQsICRlbnRyeV90eXBlID0gZmFsc2Up
IHsgcmVxdWlyZV9vbmNlICdlbGVvbnRldi9TUUwvTXVsdGlJbnNlcnQucGhwJzsgJGVudHJ5X3R5
cGUgPSAoJGVudHJ5X3R5cGUpID8gJGVudHJ5X3R5cGUgOiAkdGhpcy0+ZW50cnlfdHlwZTsgJGRh
dGEgPSBhcnJheSgpOyAkcmVjb3JkX2lkID0gKGlzX2FycmF5KCRyZWNvcmRfaWQpKSA/ICRyZWNv
cmRfaWQgOiBhcnJheSgkcmVjb3JkX2lkKTsgZm9yZWFjaCgkdmFsdWVzIGFzICRudW0gPT4gJHYp
IHsgZm9yZWFjaCgkcmVjb3JkX2lkIGFzICRlbnRyeV9pZCkgeyAkZGF0YVtdID0gYXJyYXkoJGVu
dHJ5X2lkLCAkZW50cnlfdHlwZSwgJG51bSwgJHZbJ2RhdGUnXSwgJHZbJ3N0J10sIDEsIDEsICR2
Wydub3RlJ10pOyB9IH0gJHNxbCA9ICJJTlNFUlQgSUdOT1JFIHskdGhpcy0+dGJsLT5lbnRyeV9z
Y2hlZHVsZX0gKGVudHJ5X2lkLCBlbnRyeV90eXBlLCBudW0sIGRhdGVfc2NoZWR1bGVkLCB2YWx1
ZSwgbm90aWZ5LCBhY3RpdmUsIG5vdGUpIFZBTFVFUyA/IjsgJHNxbCA9IE11bHRpSW5zZXJ0Ojpn
ZXQoJHNxbCwgJGRhdGEpOyBpZigkZGF0YSkgeyByZXR1cm4gJHRoaXMtPmRiLT5FeGVjdXRlKCRz
cWwpIG9yIGRpZShkYl9lcnJvcigkc3FsKSk7IH0gfSBmdW5jdGlvbiBkZWxldGVTY2hlZHVsZSgk
cmVjb3JkX2lkLCAkZW50cnlfdHlwZSA9IGZhbHNlKSB7ICRlbnRyeV90eXBlID0gKCRlbnRyeV90
eXBlKSA/ICRlbnRyeV90eXBlIDogJHRoaXMtPmVudHJ5X3R5cGU7ICRzcWwgPSAiREVMRVRFIEZS
T00geyR0aGlzLT50YmwtPmVudHJ5X3NjaGVkdWxlfSAKCQlXSEVSRSBlbnRyeV9pZCBJTiAoeyRy
ZWNvcmRfaWR9KSBBTkQgZW50cnlfdHlwZSA9ICd7JGVudHJ5X3R5cGV9JyI7IHJldHVybiAkdGhp
cy0+ZGItPl9xdWVyeSgkc3FsKSBvciBkaWUoZGJfZXJyb3IoJHNxbCkpOyB9IGZ1bmN0aW9uIHNl
dEVudHJ5TG9ja2VkKCRyZWNvcmRfaWQsICRlbnRyeV90eXBlID0gZmFsc2UsICR1c2VyX2lkID0g
ZmFsc2UpIHsgJGVudHJ5X3R5cGUgPSAoJGVudHJ5X3R5cGUpID8gJGVudHJ5X3R5cGUgOiAkdGhp
cy0+ZW50cnlfdHlwZTsgJHVzZXJfaWQgPSAoJHVzZXJfaWQpID8gJHVzZXJfaWQgOiAkdGhpcy0+
dXNlcl9pZDsgJHNxbCA9ICJSRVBMQUNFIHskdGhpcy0+dGJsLT5sb2NrfSBTRVQgCgkJZW50cnlf
aWQgPSAneyRyZWNvcmRfaWR9JywKCQllbnRyeV90eXBlID0gJ3skZW50cnlfdHlwZX0nLCAKCQl1
c2VyX2lkID0gJ3skdXNlcl9pZH0nIjsgJHJlc3VsdCA9JiAkdGhpcy0+ZGItPkV4ZWN1dGUoJHNx
bCkgb3IgZGllKGRiX2Vycm9yKCRzcWwpKTsgfSBmdW5jdGlvbiBzZXRFbnRyeVJlbGVhc2VkKCRy
ZWNvcmRfaWQsICRlbnRyeV90eXBlID0gZmFsc2UpIHsgJGVudHJ5X3R5cGUgPSAoJGVudHJ5X3R5
cGUpID8gJGVudHJ5X3R5cGUgOiAkdGhpcy0+ZW50cnlfdHlwZTsgJHNxbCA9ICJERUxFVEUgRlJP
TSB7JHRoaXMtPnRibC0+bG9ja30gV0hFUkUgZW50cnlfaWQgPSAneyRyZWNvcmRfaWR9JyBBTkQg
ZW50cnlfdHlwZSA9ICd7JGVudHJ5X3R5cGV9JyI7ICRyZXN1bHQgPSYgJHRoaXMtPmRiLT5FeGVj
dXRlKCRzcWwpIG9yIGRpZShkYl9lcnJvcigkc3FsKSk7IH0gZnVuY3Rpb24gaXNFbnRyeUxvY2tl
ZCgkcmVjb3JkX2lkLCAkZW50cnlfdHlwZSA9IGZhbHNlLCAkdXNlcl9pZCA9IGZhbHNlKSB7ICRl
bnRyeV90eXBlID0gKCRlbnRyeV90eXBlKSA/ICRlbnRyeV90eXBlIDogJHRoaXMtPmVudHJ5X3R5
cGU7ICR1c2VyX2lkID0gKCR1c2VyX2lkKSA/ICR1c2VyX2lkIDogJHRoaXMtPnVzZXJfaWQ7ICRz
cWwgPSAiU0VMRUNUIDEgRlJPTSB7JHRoaXMtPnRibC0+bG9ja30KCQlXSEVSRSBlbnRyeV9pZCA9
ICd7JHJlY29yZF9pZH0nIAoJCUFORCBlbnRyeV90eXBlID0gJ3skZW50cnlfdHlwZX0nCgkJQU5E
IHVzZXJfaWQgIT0gJ3skdXNlcl9pZH0nIjsgJHJlc3VsdCA9JiAkdGhpcy0+ZGItPkV4ZWN1dGUo
JHNxbCkgb3IgZGllKGRiX2Vycm9yKCRzcWwpKTsgcmV0dXJuIChib29sKSAoJHJlc3VsdC0+Rmll
bGRzKDEpKTsgfSBmdW5jdGlvbiBnZXRFbnRyeUxvY2tlZERhdGEoJHJlY29yZF9pZCwgJGVudHJ5
X3R5cGUgPSBmYWxzZSkgeyAkZW50cnlfdHlwZSA9ICgkZW50cnlfdHlwZSkgPyAkZW50cnlfdHlw
ZSA6ICR0aGlzLT5lbnRyeV90eXBlOyAkc3FsID0gIlNFTEVDVCAqIEZST00geyR0aGlzLT50Ymwt
PmxvY2t9CgkJV0hFUkUgZW50cnlfaWQgPSAneyRyZWNvcmRfaWR9JyAKCQlBTkQgZW50cnlfdHlw
ZSA9ICd7JGVudHJ5X3R5cGV9JyI7ICRyZXN1bHQgPSYgJHRoaXMtPmRiLT5FeGVjdXRlKCRzcWwp
IG9yIGRpZShkYl9lcnJvcigkc3FsKSk7IHJldHVybiAkcmVzdWx0LT5GZXRjaFJvdygpOyB9IGZ1
bmN0aW9uIGF1dG9zYXZlKCRpZF9rZXksICRyZWNvcmRfaWQsICRlbnRyeV9vYmosICRlbnRyeV90
eXBlID0gZmFsc2UsICR1c2VyX2lkID0gZmFsc2UpIHsgJGVudHJ5X3R5cGUgPSAoJGVudHJ5X3R5
cGUpID8gJGVudHJ5X3R5cGUgOiAkdGhpcy0+ZW50cnlfdHlwZTsgJHVzZXJfaWQgPSAoJHVzZXJf
aWQpID8gJHVzZXJfaWQgOiAkdGhpcy0+dXNlcl9pZDsgJHNxbCA9ICJbQUNUSU9OXSB7JHRoaXMt
PnRibC0+YXV0b3NhdmV9CiAgICAgICAgU0VUIGlkX2tleSA9ICd7JGlkX2tleX0nLAogICAgICAg
IGVudHJ5X2lkID0gJ3skcmVjb3JkX2lkfScsCiAgICAgICAgZW50cnlfdHlwZSA9ICd7JGVudHJ5
X3R5cGV9JywgCiAgICAgICAgdXNlcl9pZCA9ICd7JHVzZXJfaWR9JywKICAgICAgICBlbnRyeV9v
YmogPSAneyRlbnRyeV9vYmp9JywKICAgICAgICBhY3RpdmUgPSAxIFtXSEVSRV0iOyAkcmVzdWx0
ID0gJHRoaXMtPl91cGRhdGVBdXRvc2F2ZSgkc3FsLCAkaWRfa2V5KTsgaWYoISRyZXN1bHQpIHsg
JHRoaXMtPl9hZGRBdXRvc2F2ZSgkc3FsKTsgfSB9IGZ1bmN0aW9uIF91cGRhdGVBdXRvc2F2ZSgk
c3FsLCAkaWRfa2V5KSB7ICRzcWwgPSBzdHJfcmVwbGFjZShhcnJheSgnW0FDVElPTl0nLCAnW1dI
RVJFXScpLCBhcnJheSgnVVBEQVRFJywgIldIRVJFIGlkX2tleSA9ICckaWRfa2V5JyIpLCAkc3Fs
KTsgJHRoaXMtPmRiLT5FeGVjdXRlKCRzcWwpIG9yIGRpZShkYl9lcnJvcigkc3FsKSk7IHJldHVy
biAkdGhpcy0+ZGItPkFmZmVjdGVkX1Jvd3MoKTsgfSBmdW5jdGlvbiBfYWRkQXV0b3NhdmUoJHNx
bCkgeyAkc3FsID0gc3RyX3JlcGxhY2UoYXJyYXkoJ1tBQ1RJT05dJywgJ1tXSEVSRV0nKSwgYXJy
YXkoJ0lOU0VSVCBJR05PUkUnLCAnJyksICRzcWwpOyAkdGhpcy0+ZGItPkV4ZWN1dGUoJHNxbCkg
b3IgZGllKGRiX2Vycm9yKCRzcWwpKTsgfSBmdW5jdGlvbiBkZWxldGVBdXRvc2F2ZSgkcmVjb3Jk
X2lkLCAkZW50cnlfdHlwZSA9IGZhbHNlKSB7ICRlbnRyeV90eXBlID0gKCRlbnRyeV90eXBlKSA/
ICRlbnRyeV90eXBlIDogJHRoaXMtPmVudHJ5X3R5cGU7ICRzcWwgPSAiREVMRVRFIEZST00geyR0
aGlzLT50YmwtPmF1dG9zYXZlfSBXSEVSRSBlbnRyeV9pZCA9ICd7JHJlY29yZF9pZH0nIEFORCBl
bnRyeV90eXBlID0gJ3skZW50cnlfdHlwZX0nIjsgJHJlc3VsdCA9JiAkdGhpcy0+ZGItPkV4ZWN1
dGUoJHNxbCkgb3IgZGllKGRiX2Vycm9yKCRzcWwpKTsgfSBmdW5jdGlvbiBkZWxldGVBdXRvc2F2
ZUJ5S2V5KCRrZXkpIHsgJHNxbCA9ICJERUxFVEUgRlJPTSB7JHRoaXMtPnRibC0+YXV0b3NhdmV9
IFdIRVJFIGlkX2tleSA9ICd7JGtleX0nIjsgJHJlc3VsdCA9JiAkdGhpcy0+ZGItPkV4ZWN1dGUo
JHNxbCkgb3IgZGllKGRiX2Vycm9yKCRzcWwpKTsgfSBmdW5jdGlvbiBpc0F1dG9zYXZlZCgkcmVj
b3JkX2lkLCAkZGF0ZV91cGRhdGVkLCAkZW50cnlfdHlwZSA9IGZhbHNlLCAkdXNlcl9pZCA9IGZh
bHNlKSB7ICRlbnRyeV90eXBlID0gKCRlbnRyeV90eXBlKSA/ICRlbnRyeV90eXBlIDogJHRoaXMt
PmVudHJ5X3R5cGU7ICR1c2VyX2lkID0gKCR1c2VyX2lkKSA/ICR1c2VyX2lkIDogJHRoaXMtPnVz
ZXJfaWQ7ICRzcWwgPSAiU0VMRUNUIDEgRlJPTSB7JHRoaXMtPnRibC0+YXV0b3NhdmV9CgkJV0hF
UkUgZW50cnlfaWQgPSAneyRyZWNvcmRfaWR9JyAKCQlBTkQgZW50cnlfdHlwZSA9ICd7JGVudHJ5
X3R5cGV9JwogICAgICAgIEFORCB1c2VyX2lkID0gJ3skdXNlcl9pZH0nCiAgICAgICAgQU5EIGRh
dGVfc2F2ZWQgPiAneyRkYXRlX3VwZGF0ZWR9JyI7ICRyZXN1bHQgPSYgJHRoaXMtPmRiLT5FeGVj
dXRlKCRzcWwpIG9yIGRpZShkYl9lcnJvcigkc3FsKSk7IHJldHVybiAoYm9vbCkgKCRyZXN1bHQt
PkZpZWxkcygxKSk7IH0gZnVuY3Rpb24gZ2V0QXV0b3NhdmVkRGF0YSgkcmVjb3JkX2lkLCAkZW50
cnlfdHlwZSA9IGZhbHNlKSB7ICRlbnRyeV90eXBlID0gKCRlbnRyeV90eXBlKSA/ICRlbnRyeV90
eXBlIDogJHRoaXMtPmVudHJ5X3R5cGU7ICRzcWwgPSAiU0VMRUNUICogRlJPTSB7JHRoaXMtPnRi
bC0+YXV0b3NhdmV9CgkJV0hFUkUgZW50cnlfaWQgPSAneyRyZWNvcmRfaWR9JyAKCQlBTkQgZW50
cnlfdHlwZSA9ICd7JGVudHJ5X3R5cGV9JyI7ICRyZXN1bHQgPSYgJHRoaXMtPmRiLT5FeGVjdXRl
KCRzcWwpIG9yIGRpZShkYl9lcnJvcigkc3FsKSk7IHJldHVybiAkcmVzdWx0LT5GZXRjaFJvdygp
OyB9IGZ1bmN0aW9uIGdldEF1dG9zYXZlZERhdGFCeUtleSgkaWRfa2V5KSB7ICRzcWwgPSAiU0VM
RUNUICogRlJPTSB7JHRoaXMtPnRibC0+YXV0b3NhdmV9IFdIRVJFIGlkX2tleSA9ICd7JGlkX2tl
eX0nIjsgJHJlc3VsdCA9JiAkdGhpcy0+ZGItPkV4ZWN1dGUoJHNxbCkgb3IgZGllKGRiX2Vycm9y
KCRzcWwpKTsgcmV0dXJuICRyZXN1bHQtPkZldGNoUm93KCk7IH0gZnVuY3Rpb24gYWRkSGl0UmVj
b3JkKCRlbnRyeV9pZCwgJGVudHJ5X3R5cGUgPSBmYWxzZSkgeyAkZW50cnlfdHlwZSA9ICgkZW50
cnlfdHlwZSkgPyAkZW50cnlfdHlwZSA6ICR0aGlzLT5lbnRyeV90eXBlOyAkc3FsID0gIklOU0VS
VCB7JHRoaXMtPnRibC0+ZW50cnlfaGl0c30gU0VUIGVudHJ5X2lkID0gJWQsIGVudHJ5X3R5cGUg
PSAlZCwgaGl0cyA9IDAiOyAkc3FsID0gc3ByaW50Zigkc3FsLCAkZW50cnlfaWQsICRlbnRyeV90
eXBlKTsgJHRoaXMtPmRiLT5FeGVjdXRlKCRzcWwpIG9yIGRpZShkYl9lcnJvcigkc3FsKSk7IH0g
ZnVuY3Rpb24gZGVsZXRlSGl0UmVjb3JkKCRlbnRyeV9pZCwgJGVudHJ5X3R5cGUgPSBmYWxzZSkg
eyAkZW50cnlfdHlwZSA9ICgkZW50cnlfdHlwZSkgPyAkZW50cnlfdHlwZSA6ICR0aGlzLT5lbnRy
eV90eXBlOyAkc3FsID0gIkRFTEVURSBGUk9NIHskdGhpcy0+dGJsLT5lbnRyeV9oaXRzfSAKCQlX
SEVSRSBlbnRyeV9pZCBJTiAoJXMpIEFORCBlbnRyeV90eXBlID0gJWQgQU5EIGhpdHMgPSAwIjsg
JHNxbCA9IHNwcmludGYoJHNxbCwgJGVudHJ5X2lkLCAkZW50cnlfdHlwZSk7ICR0aGlzLT5kYi0+
RXhlY3V0ZSgkc3FsKSBvciBkaWUoZGJfZXJyb3IoJHNxbCkpOyB9IGZ1bmN0aW9uIGRlbGV0ZVN1
YnNjcmlwdGlvbigkZW50cnlfaWQsICRlbnRyeV90eXBlID0gZmFsc2UpIHsgJGVudHJ5X3R5cGUg
PSAoJGVudHJ5X3R5cGUpID8gJGVudHJ5X3R5cGUgOiAkdGhpcy0+ZW50cnlfdHlwZTsgJHNxbCA9
ICJERUxFVEUgRlJPTSB7JHRoaXMtPnRibC0+dXNlcl9zdWJzY3JpcHRpb259IAoJCVdIRVJFIGVu
dHJ5X2lkIElOICglcykgQU5EIGVudHJ5X3R5cGUgPSAlZCI7ICRzcWwgPSBzcHJpbnRmKCRzcWws
ICRlbnRyeV9pZCwgJGVudHJ5X3R5cGUpOyAkdGhpcy0+ZGItPkV4ZWN1dGUoJHNxbCkgb3IgZGll
KGRiX2Vycm9yKCRzcWwpKTsgfSBmdW5jdGlvbiBnZXRTdGF0dXNLZXkoJGVudHJ5X2lkLCAkbGlz
dF9pZCkgeyAkc3FsID0gIlNFTEVDVCBsLmxpc3Rfa2V5IAoJCUZST00gCgkJCXskdGhpcy0+dGJs
LT5lbnRyeX0gZSwKCQkJeyR0aGlzLT50YmwtPmxpc3RfdmFsdWV9IGwKCQlXSEVSRSBlLmlkID0g
J3skZW50cnlfaWR9JwoJCUFORCBsLmxpc3RfaWQgPSAnJGxpc3RfaWQnCgkJQU5EIGwubGlzdF92
YWx1ZSA9IGUuYWN0aXZlIjsgJHJlc3VsdCA9JiAkdGhpcy0+ZGItPkV4ZWN1dGUoJHNxbCkgb3Ig
ZGllKGRiX2Vycm9yKCRzcWwpKTsgcmV0dXJuICRyZXN1bHQtPkZpZWxkcygnbGlzdF9rZXknKTsg
fSBmdW5jdGlvbiBnZXRUYWdCeUlkKCRyZWNvcmRfaWQpIHsgJHNxbCA9ICIKICAgICAgICBTRUxF
Q1QgCiAgICAgICAgICAgIHQuaWQsIAogICAgICAgICAgICB0LnRpdGxlIAogICAgICAgIEZST00g
CiAgICAgICAgICAgIHskdGhpcy0+dGJsLT50YWd9IHQsIAogICAgICAgICAgICB7JHRoaXMtPnRi
bC0+dGFnX3RvX2VudHJ5fSB0ZQogICAgICAgIFdIRVJFIDEKICAgICAgICAgICAgQU5EIHRlLmVu
dHJ5X2lkIElOICgkcmVjb3JkX2lkKSAKICAgICAgICAgICAgQU5EIHQuaWQgPSB0ZS50YWdfaWQK
ICAgICAgICAgICAgQU5EIHRlLmVudHJ5X3R5cGUgPSB7JHRoaXMtPmVudHJ5X3R5cGV9IjsgJHJl
c3VsdCA9JiAkdGhpcy0+ZGItPkV4ZWN1dGUoJHNxbCkgb3IgZGllKGRiX2Vycm9yKCRzcWwpKTsg
cmV0dXJuICRyZXN1bHQtPkdldEFycmF5KCk7IH0gZnVuY3Rpb24gZ2V0VGFnQnlJZHMoJGlkcykg
eyAkc3FsID0gIlNFTEVDVCAqIEZST00geyR0aGlzLT50YmwtPnRhZ30gV0hFUkUgaWQgSU4gKCRp
ZHMpIjsgJHJlc3VsdCA9JiAkdGhpcy0+ZGItPkV4ZWN1dGUoJHNxbCkgb3IgZGllKGRiX2Vycm9y
KCRzcWwpKTsgcmV0dXJuICRyZXN1bHQtPkdldEFycmF5KCk7IH0gZnVuY3Rpb24gZ2V0RW50cnlU
b1RhZygkdGFncywgJGVudHJ5X3R5cGUgPSBmYWxzZSkgeyAkZW50cnlfdHlwZSA9ICgkZW50cnlf
dHlwZSkgPyAkZW50cnlfdHlwZSA6ICR0aGlzLT5lbnRyeV90eXBlOyBpZiAoaXNfYXJyYXkoJHRh
Z3MpKSB7ICR0YWdzID0gaW1wbG9kZSgiJywnIiwgJHRhZ3MpOyB9ICRzcWwgPSAiU0VMRUNUIHRl
LmVudHJ5X2lkLCB0ZS5lbnRyeV9pZCBBUyBpZAogICAgICAgIEZST00gKHskdGhpcy0+dGJsLT50
YWd9IHQsCiAgICAgICAgeyR0aGlzLT50YmwtPnRhZ190b19lbnRyeX0gdGUpCiAgICAgICAgV0hF
UkUgdC5pZCA9IHRlLnRhZ19pZAogICAgICAgIEFORCB0LnRpdGxlIElOICgnJHRhZ3MnKQogICAg
ICAgIEFORCB0ZS5lbnRyeV90eXBlID0gJyRlbnRyeV90eXBlJyI7ICRyZXN1bHQgPSYgJHRoaXMt
PmRiLT5FeGVjdXRlKCRzcWwpIG9yIGRpZShkYl9lcnJvcigkc3FsKSk7IHJldHVybiAkcmVzdWx0
LT5HZXRBc3NvYygpOyB9IGZ1bmN0aW9uIHNhdmVUYWdUb0VudHJ5KCR2YWx1ZXMsICRyZWNvcmRf
aWQpIHsgaWYoZW1wdHkoJHZhbHVlcykpIHsgcmV0dXJuOyB9ICRyZWNvcmRfaWQgPSAoaXNfYXJy
YXkoJHJlY29yZF9pZCkpID8gJHJlY29yZF9pZCA6IGFycmF5KCRyZWNvcmRfaWQpOyByZXF1aXJl
X29uY2UgJ2VsZW9udGV2L1NRTC9NdWx0aUluc2VydC5waHAnOyAkdGFncyA9IGFycmF5KCk7IGZv
cmVhY2goJHJlY29yZF9pZCBhcyAkZW50cnlfaWQpIHsgZm9yZWFjaCgkdmFsdWVzIGFzICRpZCkg
eyAkdGFnc1tdID0gYXJyYXkoJGlkLCAkZW50cnlfaWQpOyB9IH0gJHNxbCA9IE11bHRpSW5zZXJ0
OjpnZXQoIklOU0VSVCBJR05PUkUgeyR0aGlzLT50YmwtPnRhZ190b19lbnRyeX0gKHRhZ19pZCwg
ZW50cnlfaWQsIGVudHJ5X3R5cGUpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBWQUxVRVMgPyIsICR0YWdzLCBhcnJheSgkdGhpcy0+ZW50cnlfdHlwZSkpOyByZXR1cm4gJHRo
aXMtPmRiLT5FeGVjdXRlKCRzcWwpIG9yIGRpZShkYl9lcnJvcigkc3FsKSk7IH0gZnVuY3Rpb24g
ZGVsZXRlVGFnVG9FbnRyeSgkcmVjb3JkX2lkLCAkZW50cnlfdHlwZSA9IGZhbHNlKSB7ICRlbnRy
eV90eXBlID0gKCRlbnRyeV90eXBlKSA/ICRlbnRyeV90eXBlIDogJHRoaXMtPmVudHJ5X3R5cGU7
ICRzcWwgPSAiREVMRVRFIEZST00geyR0aGlzLT50YmwtPnRhZ190b19lbnRyeX0KICAgICAgICBX
SEVSRSBlbnRyeV9pZCBJTiAoeyRyZWNvcmRfaWR9KQogICAgICAgIEFORCBlbnRyeV90eXBlID0g
J3skZW50cnlfdHlwZX0nIjsgcmV0dXJuICR0aGlzLT5kYi0+X3F1ZXJ5KCRzcWwpIG9yIGRpZShk
Yl9lcnJvcigkc3FsKSk7IH0gfSA=
")); 
?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 b6dc4b16fe23c644528b25e6ae8d1648
Eval Count 1
Decode Time 108 ms