Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php eval(base64_decode("IAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqK..
Decoded Output download
/************************************************
* *
* *
* *
* *
* *
* *
* --------------------------------------------- *
* This is commercial software, only users *
* who have purchased a valid license and *
* accept to the terms of the License *
* Agreement can install and use this program. *
* --------------------------------------------- *
* website: https://maurisweb.ru *
* email: [email protected] *
************************************************/
namespace Tygh\Addons\MauriswebAddonManager;
use Tygh\Registry;
use Tygh\Settings;
use Tygh\Enum\SiteArea;
use Tygh\Database\Connection;
use Tygh\Exceptions\DeveloperException;
use Tygh\Addons\MauriswebAddonManager\Registry as MWRegistry;
use Tygh\Addons\MauriswebAddonManager\Maurisweb\General\AddonsData;
use Tygh\Addons\MauriswebAddonManager\Maurisweb\General\ClassManager;
use Tygh\Enum\ObjectStatuses;
use Tygh\Enum\YesNo;
class Manager {
protected $db;
protected $container;
protected $run_controllers_schema;
protected $keyboard_layout_schema;
protected $class_name = 'maurisweb_addon_manager_manager';
public function __construct(
Connection $db
) {
$this->db = $db;
$this->run_controllers_schema = fn_get_schema('maurisweb_addon_manager', 'run_controllers');
$this->keyboard_layout_schema = fn_get_schema('maurisweb_addon_manager', 'keyboard_layout');
}
public function langSwitcher($string,$lang_from,$lang_to) {
return isset($this->keyboard_layout_schema[$lang_from][$lang_to])?strtr($string, $this->keyboard_layout_schema[$lang_from][$lang_to]):$string;
}
public function decamelize($string) {
return $this->getClassDebug()::decamelize($string);
}
public function clearCache($tags) {
fn_set_hook('maurisweb_addon_manager_manager_clear_cache', $tags);
MWRegistry::ClearCacheTags($tags);
}
public function ifSet(&$array, $key, $deafult) {
$array[$key] = isset($array[$key]) ? $array[$key] : $deafult;
}
public function getArguments($arguments, &$params, $save_keys = false) {
$class_name = $this->class_name;
$function_name = $this->decamelize(__FUNCTION__);
fn_set_hook("{$class_name}_{$function_name}_pre", $products, $setting, $params, $extra_params);
$values = [];
foreach ($arguments as $arg => $_params) {
$key = $arg;
if (isset($_params['key'])) {
$key = $_params['key'];
}
$values[$key] = null;
if (isset($_params['default'])) {
$values[$key] = $_params['default'];
}
if (is_string($arg)) {
if (strpos($arg, '#') === 0) {
$val = substr($arg, 1);
if (isset($params[$val])) {
$values[$key] = &$params[$val];
} else {
$value = $params;
foreach (explode('.', $val) as $path) {
if (isset($value[$path])) {
$value = $value[$path];
} else {
$value = $values[$key];
break;
}
}
$values[$key] = &$value;
unset($value);
}
} elseif (strpos($arg, '@') === 0) {
$val = substr($arg, 1);
if (isset($this->container[$val])) {
$values[$key] = $this->container[$val];
}
} elseif (strpos($arg, '&') === 0) {
$val = substr($arg, 1);
if (property_exists($this, $val)) {
$values[$key] = $this->{$val};
}
} elseif (strpos($arg, '$') === 0) {
$val = substr($arg, 1);
$values[$key] = $$val;
} elseif (!isset($values[$key]) || empty($values[$key])) {
$values[$key] = $arg;
}
fn_set_hook("{$class_name}_{$function_name}", $values, $arg, $params, $_params);
}
}
fn_set_hook("{$class_name}_{$function_name}_post", $values);
return $save_keys ? $values : array_values($values);
}
public function getArgument($arg, $params) {
$result = $arg;
if (is_string($arg)) {
if (strpos($arg, '#') === 0) {
$val = substr($arg, 1);
if (isset($params[$val])) {
$result = &$params[$val];
} else {
unset($value);
$value = $params;
foreach (explode('.', $val) as $path) {
if (isset($value[$path])) {
$value = &$value[$path];
} else {
unset($value);
$value = null;
}
}
$result = $value;
}
} elseif (strpos($arg, '@') === 0) {
$val = substr($arg, 1);
if (isset($params['container'][$val])) {
$result = $params['container'][$val];
}
} elseif (strpos($arg, '&') === 0) {
$val = substr($arg, 1);
if (property_exists($params['this'], $val)) {
$result = $params['this']->{$val};
}
} elseif (strpos($arg, '$') === 0) {
$val = substr($arg, 1);
$result = $$val;
}
}
fn_set_hook('maurisweb_addon_manager_manager_get_argument', $result, $arg, $params);
$arg = $result;
return $arg;
}
public function getValue($object, $key, $default = null) {
foreach (explode('.', $key) as $path) {
if (isset($object[$path])) {
$object = $object[$path];
} else {
$object = $default;
break;
}
}
fn_set_hook('maurisweb_addon_manager_manager_get_value', $object, $key, $default);
return $object;
}
public function setValue(&$array, $keys, $value, $params = [], $is_array_merge = true) {
fn_set_hook('maurisweb_addon_manager_manager_set_value_pre', $array, $keys, $value, $params);
$keys = is_array($keys) ? $keys : explode('.', $keys);
$key_result = array_shift($keys);
if (empty($keys)) {
if (!empty($params)) {
$object = isset($params['object']) ? $params['object'] : [];
$object['value'] = $value;
if (isset($params['func']) && isset($params['args'])) {
if (is_array($params['func'])) {
$params['func'] = $this->getArguments($params['func'], $object);
}
$params['args'] = $this->getArguments($params['args'], $object);
if (is_callable($params['func'])) {
$value = call_user_func_array($params['func'], $params['args']);
}
}
}
if (isset($array[$key_result]) && is_array($array[$key_result]) && $is_array_merge) {
$array[$key_result] = fn_array_merge($array[$key_result], $value);
} else {
$array[$key_result] = $value;
}
fn_set_hook('maurisweb_addon_manager_manager_set_value', $array, $keys, $value, $params);
return true;
} elseif (is_array($array)) {
$array[$key_result] = isset($array[$key_result]) ? $array[$key_result] : [];
$this->setValue($array[$key_result], $keys, $value, $params);
};
}
public function getClassManager($addon_id): ClassManager {
return $this->ifGetClassManager($addon_id);
}
protected function _getClassManager($addon_id): ClassManager {
return new ClassManager($addon_id);
}
protected function ifGetClassManager($addon_id): ClassManager {
static $class_manager_list = [];
if (!isset($class_manager_list[$addon_id])) {
$class_manager_list[$addon_id] = $this->_getClassManager($addon_id);
}
return $class_manager_list[$addon_id];
}
public function updateAddonSettings($addon_id, $setting_ids, $settings_data) {
$this->clearAddonCache('maurisweb_addon_manager');
$this->clearAddonCache($addon_id);
$this->getLicense($addon_id, true);
$this->getClassAddonSettings($addon_id)->update_addon_settings($setting_ids, $settings_data);
$this->clearAddonCache('maurisweb_addon_manager');
$this->clearAddonCache($addon_id);
$this->getLicense($addon_id, true);
}
public function extractAddonSettings($addon_id, $options) {
return $this->getClassAddonSettings($addon_id)->extract_settings($options);
}
public function cleaning($addon_id, $limit = true) {
return $this->getClassValidator($addon_id)->cleaning($limit);
}
public function saveState($addon_id = 'maurisweb_addon_manager', $state = []) {
return $this->getClassDataManager($addon_id)->saveState($state);
}
public function isMauriswebAddon($addon) {
return $this->getClassManager('maurisweb_addon_manager')->isMauriswebAddon($addon);
}
public function getAddonSettings($addon_id = 'maurisweb_addon_manager', $get_storefont_settings = true) {
return $this->getClassAddonSettings($addon_id)->getSettings($get_storefont_settings);
}
public function unsetBox(
$key,
$company_id = null,
$addon_id = 'maurisweb_addon_manager'
) {
return $this->getClassAddonSettings($addon_id)
->unsetBox($key, $company_id);
}
public function getBox(
$key,
$company_id = null,
$box_dir = null,
$addon_id = 'maurisweb_addon_manager'
) {
return $this->getClassAddonSettings($addon_id)
->getBox($key, $company_id, $box_dir);
}
public function setBox(
$keys,
$value,
$company_id = null,
$box_dir = null,
$addon_id = 'maurisweb_addon_manager'
) {
return $this->getClassAddonSettings($addon_id)
->setBox($keys, $value, $company_id, $box_dir);
}
public function getSettings($addon_id = 'maurisweb_addon_manager', $type = "") {
return $this->getClassValidator($addon_id)->getSettings($type);
}
public function getLicense($addon_id = 'maurisweb_addon_manager', $skip_limit = false, $extra = []) {
return $this->getClassValidator($addon_id)->getLicense($skip_limit, $extra);
}
public function getScheme($addon_id = 'maurisweb_addon_manager', $name_scheme = null) {
return $this->getClassDataManager($addon_id)->getScheme($name_scheme);
}
public function getDirsStruct($addon_id = 'maurisweb_addon_manager', $nameStruct = '') {
return $this->getClassDataManager($addon_id)->getDirsStruct($nameStruct);
}
public function getClassDataManager($addon_id = 'maurisweb_addon_manager') {
return $this->getClassManager($addon_id)->getDataManager();
}
public function getClassValidator($addon_id = 'maurisweb_addon_manager') {
return $this->getClassManager($addon_id)->getValidator();
}
public function getClassDebug($addon_id = 'maurisweb_addon_manager') {
return $this->getClassManager($addon_id)->getDebug();
}
public function getClassDataBase($addon_id = 'maurisweb_addon_manager') {
return $this->getClassManager($addon_id)->getDataBase();
}
public function getClassAddonSettings($addon_id = 'maurisweb_addon_manager') {
return $this->getClassManager($addon_id)->getAddonSettings();
}
public function getClassConnector($addon_id = 'maurisweb_addon_manager') {
return $this->getClassManager($addon_id)->getConnector();
}
public function createObject($class_name) {
return new $class_name();
}
public function getLinks($name_links = '', $addon_id = 'maurisweb_addon_manager') {
return $this->getClassDataManager($addon_id)->getLinks($name_links);
}
public function clearAddonCache($addon_id, $types = []) {
$this->getClassManager($addon_id)->clearCache($types);
}
public function install($addon_id) {
$this->clearAddonCache('maurisweb_addon_manager');
$this->getClassManager($addon_id)->install();
}
public function uninstall($addon_id) {
$this->clearAddonCache('maurisweb_addon_manager');
$this->getClassManager($addon_id)->uninstall();
}
public function getAddonsLicense($addons, $skip_limit = false, $extra = []) {
$addon = $this->getScheme('maurisweb_addon_manager', 'name_addon');
list($allowed_request, $time) = $this->getClassValidator('maurisweb_addon_manager')
->checkTickRequest($skip_limit, 'addons_tick_request');
if ($allowed_request) {
$connect = $this->getClassConnector('maurisweb_addon_manager');
$get_files = [];
$data = $connect->ascServer(array(
"dispatch" => "service.get_addons_main_files",
'addons' => $addons
));
$file_list = isset($data["data"]['file_names'])
? $data["data"]['file_names'] : false;
if (is_array($file_list)) {
foreach ($file_list as $_addon => $list) {
if (is_array($list)) {
foreach ($list as $value) {
$get_files[$_addon] = !is_file($value);
if ($get_files[$_addon]) {
break;
}
}
}
}
}
foreach ($addons as $_addon => $v) {
$addonsData = new AddonsData($_addon);
$extra[$_addon] = isset($extra[$_addon])
? array_merge($extra[$_addon], $addonsData->getExtra())
: $addonsData->getExtra();
}
$data = $connect->ascServer(array(
"dispatch" => "service.check_addons_license",
'addons' => $addons,
'skip_limit' => $skip_limit,
"get_files" => $get_files,
"extra" => $extra
));
$all_valid = true;
$debug = $this->getClassDebug('maurisweb_addon_manager');
if (is_array($data)) {
if ($data["info"]["http_code"] == 200) {
foreach ($data['data'] as $addon => $result) {
$this->clearAddonCache($addon);
if (isset($result["file_name"])) {
if (!defined('CART_LANGUAGE')) {
fn_init_language($_REQUEST);
}
$tmpfile = $debug::saveFile(
$addon, $result["file_name"], $result["files"]
);
fn_decompress_files($tmpfile, DIR_ROOT);
}
$settings = array();
$data_set = $this->getClassDataManager($addon)->getScheme('data_set');
if (is_array($data_set)) {
foreach ($data_set as $name) {
if (isset($result[$name])) {
$settings[$name] = $result[$name];
}
}
}
$settings["schemas"]["root_data"]["main_files"] =
isset($file_list[$addon]) ? $file_list[$addon] : [];
$signal = $this->getClassValidator($addon)->get_signal($result);
$this->getClassValidator($addon)->checkTickRequest($signal);
if ($signal) {
$this->getClassValidator($addon)->saveSettings($settings);
} else {
$all_valid = false;
}
}
$this->getClassValidator('maurisweb_addon_manager')->checkTickRequest($all_valid, 'addons_tick_request');
return true;
} else {
return false;
}
} else {
return false;
}
}
}
public function clearAddonsCache($types = []) {
$addons_list = $this->getClassDataManager('maurisweb_addon_manager')
->getAddonsList();
foreach ($addons_list as $key => $addon_name) {
$this->clearAddonCache($addon_name, $types);
}
}
public function getFailAddonLicense($skip_limit = false, $extra = []) {
$_limit = 30;
$need_get_license = [];
$addons_list = $this->getClassDataManager('maurisweb_addon_manager')
->getAddonsList();
$addons = $this->getClassDataManager('maurisweb_addon_manager')->getAddons();
foreach ($addons_list as $key => $addon_name) {
list($validate, $need_request) =
$this->getClassValidator($addon_name)->checkValid($addon_name);
if (!$validate && $need_request) {
$settings_local =
is_string(Registry::get('addons.' . $addon_name . '.lockal_settings'))
? json_decode(
Registry::get('addons.' . $addon_name . '.lockal_settings'), true
)
: Registry::get('addons.' . $addon_name . '.lockal_settings');
$need_get_license[$addon_name] = $addons[$addon_name];
$need_get_license[$addon_name]['license_addon'] =
isset($settings_local['license_key'])
? $settings_local['license_key'] : false;
}
}
if (!empty($need_get_license)) {
$_need_get_license = array_chunk(
$need_get_license,
$_limit,
true
);
unset($need_get_license);
foreach ($_need_get_license as $key => $need_get_license) {
$this->getAddonsLicense($need_get_license, $skip_limit, $extra);
}
}
}
public function updateAllAddonsLicense($skip_limit = false, $extra = []) {
$_limit = 30;
$need_update_license = [];
$addons_list = $this->getClassDataManager('maurisweb_addon_manager')
->getAddonsList();
$addons = $this->getClassDataManager('maurisweb_addon_manager')->getAddons();
foreach ($addons_list as $key => $addon_name) {
$settings_local =
is_string(Registry::get('addons.' . $addon_name . '.lockal_settings'))
? json_decode(
Registry::get('addons.' . $addon_name . '.lockal_settings'), true
)
: Registry::get('addons.' . $addon_name . '.lockal_settings');
$need_update_license[$addon_name] = $addons[$addon_name];
$need_update_license[$addon_name]['license_addon'] =
isset($settings_local['license_key'])
? $settings_local['license_key'] : false;
}
if (!empty($need_update_license)) {
$_need_get_license = array_chunk(
$need_update_license,
$_limit,
true
);
foreach ($_need_get_license as $key => $_need_update_license) {
$this->getAddonsLicense($_need_update_license, $skip_limit, $extra);
}
}
}
function getCompanySettingsData(&$company_data, $settings_data){
if (isset($settings_data['main'])){
foreach ($settings_data['main'] as $field_id => &$field_data){
unset($field_data['update_for_all']);
if (!empty($settings_values) && !empty($settings_values[$field_id])){
$field_data['value'] = $settings_values[$field_id];
}
}
foreach ($settings_data['main'] as $setting_id => $setting){
$company_data[str_replace('company_', '', $setting['name'])] = $setting['value'];
}
}
}
function addCompanySettingsData(&$company_data, $company_id) {
if (fn_allowed_for('ULTIMATE') || (!$company_id) && fn_allowed_for('MULTIVENDOR')) {
$section = Settings::instance()->getSectionByName('Company', Settings::CORE_SECTION, false);
$settings_data = Settings::instance()->getList($section['section_id'], 0, false, $company_id);
$this->getCompanySettingsData($company_data, $settings_data);
}
}
function explodeAddress($address) {
$_result = explode(',', $address);
fn_set_hook('maurisweb_addon_manager_manager_explode_address_pre', $address, $_result);
$result[] = isset($_result[0]) ? $_result[0] : '';
$house = '';
if (isset($_result[1])) {
foreach (str_split($_result[1]) as $key => $value) {
if (is_numeric($value)) {
$house .= $value;
}
}
$house = $house;
}
$result[] = $house;
fn_set_hook('maurisweb_addon_manager_manager_explode_address', $address, $_result, $result);
return $result;
}
public function getAddresses($company_id) {
$addresses = [];
$company_data = fn_get_company_data($company_id);
$company_data = is_array($company_data) ? $company_data : [];
$this->addCompanySettingsData($company_data, $company_id);
$country_code = isset($company_data['country']) ? $company_data['country'] : '';
$company_address = [
'name' => __('maurisweb_addon_manager.company_address', ['[company]' => isset($company_data['company']) ? $company_data['company'] : $company_data['name']]),
'zipcode' => isset($company_data['zipcode']) ? $company_data['zipcode'] : '',
'country' => $country_code,
'state' => $company_data['state'],
'city' => isset($company_data['city']) ? $company_data['city'] : '',
];
list($company_address['street'], $company_address['house']) = $this->explodeAddress(isset($company_data['address']) ? $company_data['address'] : '');
$addresses["company_{$company_id}"] = $company_address;
fn_set_hook('maurisweb_addon_manager_manager_get_addresses', $company_id, $addresses);
return $addresses;
}
public function checkValid($addon = "maurisweb_addon_manager", $skip = false) {
static $result = [];
if(!empty($addon)){
if(ObjectStatuses::ACTIVE != Registry::get("addons.{$addon}.status")){
$result[$addon] = false;
}
if (!isset($result[$addon]) || $skip) {
list($result[$addon]) =
$this->getClassValidator($addon)->checkValid($addon);
$result[$addon] =
ObjectStatuses::ACTIVE == Registry::get("addons.{$addon}.status")
&& $result[$addon];
list($allowed_request) =
$this->getClassValidator($addon)->checkTickRequest($skip);
if (!$result[$addon] && ($allowed_request || $skip)) {
$this->getFailAddonLicense();
list($result[$addon]) =
$this->getClassValidator($addon)->checkValid($addon);
}
}
return $result[$addon];
}
return false;
}
public function arrayToString($array, $level = "") {
return $this->getClassDebug()::arrayToString($array, $level);
}
public function toObject($value) {
return (object)$value;
}
public function toString($value) {
return strval($value);
}
public function toInt($value) {
return intval($value);
}
public function toDecimal($value) {
return round(floatval($value), 2);
}
public function calculationPariceDiscount(&$products, $subtotal_discount, $fields = ['price']) {
$fields = (array)$fields;
if ($subtotal_discount) {
foreach ($products as $key => $item) {
foreach ($fields as $field) {
if (isset($item[$field])) {
$products[$key]['discount'] = $products[$key][$field] * $subtotal_discount;
}
}
}
}
}
public function calculateTaxes(&$cart, &$group_products, $auth) {
$calculated_data = array();
foreach ($group_products as $k => $product) {
$taxes = fn_get_product_taxes($k, $cart, $group_products);
if (empty($taxes)) {
continue;
}
if (isset($product['subtotal'])) {
if ($product['price'] == $product['subtotal'] && $product['amount'] != 1) {
$price = fn_format_price($product['price']);
} else {
$price = fn_format_price($product['subtotal'] / $product['amount']);
}
$calculated_data['P_' . $k] = fn_calculate_tax_rates($taxes, $price, $product['amount'], $auth, $cart);
$group_products[$k]['tax_summary'] = array('included' => 0, 'added' => 0, 'total' => 0);
if (!empty($calculated_data['P_' . $k])) {
foreach ($calculated_data['P_' . $k] as $_k => $v) {
$group_products[$k]['taxes'][$_k] = $v;
if ($taxes[$_k]['price_includes_tax'] != 'Y') {
$group_products[$k]['tax_summary']['added'] += $v['tax_subtotal'];
} else {
$group_products[$k]['tax_summary']['included'] += $v['tax_subtotal'];
}
}
$group_products[$k]['tax_summary']['total'] = $group_products[$k]['tax_summary']['added'] + $group_products[$k]['tax_summary']['included'];
}
}
}
return $calculated_data;
}
public function addData($request, $input_name, $data) {
$input_name = str_replace(['[', ']'], ['.', ''], $input_name);
$data = array_replace_recursive($data, $this->getValue($request, $input_name, []));
fn_set_hook('maurisweb_addon_manager_manager_add_data', $request, $input_name, $data);
return $data;
}
public function getControllersPermissions($controller, $mode, $area) {
$run_controllers = true;
if (SiteArea::isAdmin($area)) {
if (Registry::get('config.demo_mode') == true) {
$run_controllers = fn_check_permissions($controller, $mode, 'demo');
} else {
$run_controllers = fn_check_permissions($controller, $mode, 'admin', '', $_REQUEST);
}
}
return $run_controllers;
}
private function deleteControllerForControllers(&$list, $value) {
$index = array_search($value, $list);
if ($index === false) {
} else {
unset($list[$index]);
}
}
public function getControllersCascade(
$controller, $mode, $area, &$controllers_cascade
) {
if (SiteArea::isAdmin($area)) {
$controllers = [];
$add_controllers = isset($this->run_controllers_schema[$controller][$mode]['add_controllers']) ? $this->run_controllers_schema[$controller][$mode]['add_controllers'] : [];
$init_controller = 'init';
$controllers_cascade = [];
$controllers_list = [$init_controller];
$controller_groups = [];
foreach ($add_controllers as $key => $_controller_params) {
$run_controllers = $this->getControllersPermissions($_controller_params['controller'], $mode, $area) || $_controller_params['run_controllers'];
if ($run_controllers) {
$controllers_list[] = $_controller_params['controller'];
}
}
$run_controllers = $this->getControllersPermissions($controller, $mode, $area);
if ($run_controllers) {
$controllers_list[] = $controller;
}
$controllers_list = array_unique($controllers_list);
$delete_controllers = isset($this->run_controllers_schema[$controller][$mode]['delete_controllers']) ? $this->run_controllers_schema[$controller][$mode]['delete_controllers'] : [];
if (!empty($delete_controllers['controllers_list'])) {
foreach ($delete_controllers['controllers_list'] as $_controller_params) {
$this->deleteControllerForControllers($controllers_list, $_controller_params['controller']);
}
unset($delete_controllers['controllers_list']);
}
foreach ($controllers_list as $ctrl) {
$core_controllers = fn_init_core_controllers($ctrl);
list($addon_controllers) = fn_init_addon_controllers($ctrl);
if ((count($core_controllers) + count($addon_controllers)) > 1) {
throw new DeveloperException('Duplicate controller ' . $controller . var_export(array_merge($core_controllers, $addon_controllers), true));
}
$core_pre_controllers = fn_init_core_controllers($ctrl, GET_PRE_CONTROLLERS);
$core_post_controllers = fn_init_core_controllers($ctrl, GET_POST_CONTROLLERS);
list($addon_pre_controllers) = fn_init_addon_controllers($ctrl, GET_PRE_CONTROLLERS);
list($addon_post_controllers, $addons) = fn_init_addon_controllers($ctrl, GET_POST_CONTROLLERS);
if (!empty($addon_controllers)) {
$addon_post_controllers = fn_reorder_post_controllers($addon_post_controllers, $addon_controllers[0]);
}
$area_name = fn_get_area_name($area);
$core_path = Registry::get('config.dir.root') . '/app/';
$addon_dir = Registry::get('config.dir.addons');
$controllers_keys = [];
foreach (['addon_pre_controllers' => $addon_dir, 'addon_controllers' => $addon_dir, 'addon_post_controllers' => $addon_dir, 'core_pre_controllers' => $core_path, 'core_controllers' => $core_path, 'core_post_controllers' => $core_path] as $var => $path) {
foreach ($$var as $key => $controller_path) {
$controllers_keys[$var][str_replace($path, '', $controller_path)] = $controller_path;
}
}
foreach ($delete_controllers as $var => $_controllers) {
foreach ($_controllers as $key => $_controller_params) {
if (isset($controllers_keys[$var][$_controller_params['controller']])) {
$this->deleteControllerForControllers($$var, $controllers_keys[$var][$_controller_params['controller']]);
}
}
}
$dispatch_controllers = array_merge(
$addon_pre_controllers,
$core_pre_controllers,
$core_controllers,
$addon_controllers,
$core_post_controllers,
$addon_post_controllers
);
foreach ($dispatch_controllers as $controller_path) {
$controller_groups[$controller_path] = $ctrl;
}
$controllers_cascade = array_merge($controllers_cascade, $dispatch_controllers);
if (empty($controllers_cascade)) {
throw new DeveloperException("No controllers for: $ctrl");
}
}
}
}
public function runControllersCascade($controller, $mode, $area, $controllers_cascade, $run_controllers) {
$action = empty($action) ? Registry::get('runtime.action') : $action;
$dispatch_extra = empty($dispatch_extra) ? Registry::get('runtime.dispatch_extra') : $dispatch_extra;
$status = CONTROLLER_STATUS_NO_PAGE;
foreach ($controllers_cascade as $item) {
$_res = fn_run_controller($item, $controller, $mode, $action, $dispatch_extra);
$cntr_status = !empty($_res[0]) ? $_res[0] : CONTROLLER_STATUS_OK;
$url = !empty($_res[1]) ? $_res[1] : '';
$external = !empty($_res[2]) ? $_res[2] : false;
$permanent = !empty($_res[3]) ? $_res[3] : false;
if (
$run_controllers
&& (
$status !== CONTROLLER_STATUS_NO_CONTENT && $status !== CONTROLLER_STATUS_DENIED
|| $cntr_status !== CONTROLLER_STATUS_OK
)
) {
$status = $cntr_status;
}
if ($status === CONTROLLER_STATUS_OK && !empty($url)) {
$redirect_url = $url;
} elseif ($status === CONTROLLER_STATUS_REDIRECT && !empty($url)) {
$redirect_url = $url;
break;
} elseif ($status === CONTROLLER_STATUS_DENIED || $status === CONTROLLER_STATUS_NO_PAGE) {
break;
}
}
}
public function checkRunControllers($controller, $mode, $area, &$controllers_cascade) {
if (isset($this->run_controllers_schema[$controller][$mode]) && SiteArea::isAdmin($area)) {
$this->getControllersCascade($controller, $mode, $area, $controllers_cascade);
if (isset($this->run_controllers_schema[$controller][$mode]['run_controllers'])) {
foreach ($this->run_controllers_schema[$controller][$mode]['run_controllers'] as $_controller_params) {
$run_controllers_cascade = [];
$run_controllers = $this->getControllersPermissions($_controller_params['controller'], $_controller_params['mode'], $area) || $_controller_params['run_controllers'];
if ($run_controllers) {
$this->getControllersCascade($_controller_params['controller'], $_controller_params['mode'], $area, $run_controllers_cascade);
$this->runControllersCascade($_controller_params['controller'], $_controller_params['mode'], $area, $run_controllers_cascade, $run_controllers);
}
}
}
}
}
public function addAddonsMenu(&$schema, $addons = []) {
$settings = fn_maurisweb_addon_manager_get_addon_settings();
$addons_list = $this->getClassDataManager('maurisweb_addon_manager')->getAddonsList();
$addons = $this->getClassDataManager('maurisweb_addon_manager')->getAddons();
if (isset($settings['add_menu']) && YesNo::toBool($settings['add_menu']) && !defined('MAURISWEB_ADDON_MANAGER_MENU')) {
fn_define('MAURISWEB_ADDON_MANAGER_MENU',true);
$schema['central']['maurisweb_addon_manager'] = [
'attrs' => array(
'class' => 'is-addon'
),
'position' =>'10000',
'title'=>__('maurisweb_addon_manager.main_menu_name'),
'href' => 'addons.update?supplier[]=MAURISWEB',
'icon' => 'addons/maurisweb_addon_manager/icons/icon.svg',
];
$allowed_update = fn_check_view_permissions('addons.update');
foreach ($addons_list as $key => $addon) {
if ($addons[$addon]['status'] === ObjectStatuses::ACTIVE && fn_maurisweb_addon_manager_check_valid($addon)) {
if ($menu_items = fn_get_menu_schema_for_addon($addon)) {
$items = fn_attach_addon_menu_item_parents($menu_items);
if($allowed_update)
{
$schema['central']['maurisweb_addon_manager']['items'][$addon] = [
'attrs' => array(
'class' => 'is-addon'
),
'position' =>'100',
'href' => 'addons.update?addon=' . $addon,
'subitems' => array(
'settings' => array(
'href' => 'addons.update?addon=' . $addon,
),
),
];
}
elseif(!empty($items))
{
$schema['central']['maurisweb_addon_manager']['items'][$addon] = reset($items);
}
foreach ($items as $key => $item) {
$schema['central']['maurisweb_addon_manager']['items'][$addon]['subitems'][$item['id']] = array(
'href' => $key,
);
}
}
}
}
}
}
public function dateFormat($timestamp, $format = '%b %e, %Y') {
return fn_maurisweb_addon_manager_date_format($timestamp, $format);
}
}
Did this file decode correctly?
Original Code
<?php
eval(base64_decode("IAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgKiAg4pWU4pWX4pSA4pSA4pWU4pWX4pWU4pWQ4pWQ4pWX4pWU4pWX4pWU4pWX4pWU4pWQ4pWQ4pWQ4pWX4pWU4pWQ4pWQ4pWX4pWU4pWQ4pWQ4pWX4pWU4pWX4pWU4pWX4pWU4pWX4pWU4pWQ4pWQ4pWQ4pWX4pWU4pWQ4pWQ4pWXICAgKg0KICAgICogIOKVkeKVkeKUgOKUgOKVkeKVkeKVkeKVlOKVl+KVkeKVkeKVkeKVkeKVkeKVkeKVlOKVkOKVl+KVkeKVmuKVl+KVlOKVneKVkeKVlOKVkOKVneKVkeKVkeKVkeKVkeKVkeKVkeKVkeKVlOKVkOKVkOKVneKVkeKVlOKVl+KVkSAgICoNCiAgICAqICDilZHilZrilZfilZTilZ3ilZHilZHilZrilZ3ilZHilZHilZHilZHilZHilZHilZrilZDilZ3ilZHilIDilZHilZHilIDilZHilZrilZDilZfilZHilZHilZHilZHilZHilZHilZHilZrilZDilZDilZfilZHilZrilZ3ilZrilZcgICoNCiAgICAqICDilZHilZTilZfilZTilZfilZHilZHilZTilZfilZHilZHilZHilZHilZHilZHilZTilZfilZTilZ3ilIDilZHilZHilIDilZrilZDilZfilZHilZHilZHilZHilZHilZHilZHilZHilZTilZDilZDilZ3ilZHilZTilZDilZfilZEgICoNCiAgICAqICDilZHilZHilZrilZ3ilZHilZHilZHilZHilZHilZHilZHilZrilZ3ilZHilZHilZHilZHilZHilIDilZTilZ3ilZrilZfilZTilZDilZ3ilZHilZHilZrilZ3ilZrilZ3ilZHilZHilZrilZDilZDilZfilZHilZrilZDilZ3ilZEgICoNCiAgICAqICDilZrilZ3ilIDilIDilZrilZ3ilZrilZ3ilZrilZ3ilZrilZDilZDilZ3ilZrilZ3ilZrilZ3ilIDilZrilZDilZDilZ3ilZrilZDilZDilZ3ilZrilZDilZ3ilZrilZDilZ3ilZrilZDilZDilZDilZ3ilZrilZDilZDilZDilZ0gICoNCiAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqDQogICAgKiBUaGlzIGlzIGNvbW1lcmNpYWwgc29mdHdhcmUsIG9ubHkgdXNlcnMgICAgICAgKg0KICAgICogd2hvIGhhdmUgcHVyY2hhc2VkIGEgdmFsaWQgbGljZW5zZSBhbmQgICAgICAgICoNCiAgICAqIGFjY2VwdCB0byB0aGUgdGVybXMgb2YgdGhlIExpY2Vuc2UgICAgICAgICAgICAqDQogICAgKiBBZ3JlZW1lbnQgY2FuIGluc3RhbGwgYW5kIHVzZSB0aGlzIHByb2dyYW0uICAgKg0KICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoNCiAgICAqIHdlYnNpdGU6IGh0dHBzOi8vbWF1cmlzd2ViLnJ1ICAgICAgICAgICAgICAgICAqDQogICAgKiAgIGVtYWlsOiBpbmZvQG1hdXJpc3dlYi5ydSAgICAgICAgICAgICAgICAgICAgKg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKCgoKCm5hbWVzcGFjZSBUeWdoXEFkZG9uc1xNYXVyaXN3ZWJBZGRvbk1hbmFnZXI7Cgp1c2UgVHlnaFxSZWdpc3RyeTsKdXNlIFR5Z2hcU2V0dGluZ3M7CnVzZSBUeWdoXEVudW1cU2l0ZUFyZWE7CnVzZSBUeWdoXERhdGFiYXNlXENvbm5lY3Rpb247CnVzZSBUeWdoXEV4Y2VwdGlvbnNcRGV2ZWxvcGVyRXhjZXB0aW9uOwp1c2UgVHlnaFxBZGRvbnNcTWF1cmlzd2ViQWRkb25NYW5hZ2VyXFJlZ2lzdHJ5IGFzIE1XUmVnaXN0cnk7CnVzZSBUeWdoXEFkZG9uc1xNYXVyaXN3ZWJBZGRvbk1hbmFnZXJcTWF1cmlzd2ViXEdlbmVyYWxcQWRkb25zRGF0YTsKdXNlIFR5Z2hcQWRkb25zXE1hdXJpc3dlYkFkZG9uTWFuYWdlclxNYXVyaXN3ZWJcR2VuZXJhbFxDbGFzc01hbmFnZXI7CnVzZSBUeWdoXEVudW1cT2JqZWN0U3RhdHVzZXM7CnVzZSBUeWdoXEVudW1cWWVzTm87CgpjbGFzcyBNYW5hZ2VyIHsKCglwcm90ZWN0ZWQgJGRiOwoJcHJvdGVjdGVkICRjb250YWluZXI7Cglwcm90ZWN0ZWQgJHJ1bl9jb250cm9sbGVyc19zY2hlbWE7Cglwcm90ZWN0ZWQgJGtleWJvYXJkX2xheW91dF9zY2hlbWE7CgoJcHJvdGVjdGVkICRjbGFzc19uYW1lID0gJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyX21hbmFnZXInOwoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKCQlDb25uZWN0aW9uICRkYgoKCSkgewoKCQkkdGhpcy0+ZGIgPSAkZGI7CgkJJHRoaXMtPnJ1bl9jb250cm9sbGVyc19zY2hlbWEgPSBmbl9nZXRfc2NoZW1hKCdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlcicsICdydW5fY29udHJvbGxlcnMnKTsKCQkkdGhpcy0+a2V5Ym9hcmRfbGF5b3V0X3NjaGVtYSA9IGZuX2dldF9zY2hlbWEoJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyJywgJ2tleWJvYXJkX2xheW91dCcpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBsYW5nU3dpdGNoZXIoJHN0cmluZywkbGFuZ19mcm9tLCRsYW5nX3RvKSB7CgkJCgkJcmV0dXJuICBpc3NldCgkdGhpcy0+a2V5Ym9hcmRfbGF5b3V0X3NjaGVtYVskbGFuZ19mcm9tXVskbGFuZ190b10pP3N0cnRyKCRzdHJpbmcsICR0aGlzLT5rZXlib2FyZF9sYXlvdXRfc2NoZW1hWyRsYW5nX2Zyb21dWyRsYW5nX3RvXSk6JHN0cmluZzsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZGVjYW1lbGl6ZSgkc3RyaW5nKSB7CgkJcmV0dXJuICAkdGhpcy0+Z2V0Q2xhc3NEZWJ1ZygpOjpkZWNhbWVsaXplKCRzdHJpbmcpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBjbGVhckNhY2hlKCR0YWdzKSB7CgkJZm5fc2V0X2hvb2soJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyX21hbmFnZXJfY2xlYXJfY2FjaGUnLCAkdGFncyk7CgkJTVdSZWdpc3RyeTo6Q2xlYXJDYWNoZVRhZ3MoJHRhZ3MpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBpZlNldCgmJGFycmF5LCAka2V5LCAkZGVhZnVsdCkgewoJCSRhcnJheVska2V5XSA9IGlzc2V0KCRhcnJheVska2V5XSkgPyAkYXJyYXlbJGtleV0gOiAkZGVhZnVsdDsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRzKCRhcmd1bWVudHMsICYkcGFyYW1zLCAkc2F2ZV9rZXlzID0gZmFsc2UpIHsKCQkkY2xhc3NfbmFtZSA9ICR0aGlzLT5jbGFzc19uYW1lOwoKCQkkZnVuY3Rpb25fbmFtZSA9ICR0aGlzLT5kZWNhbWVsaXplKF9fRlVOQ1RJT05fXyk7CgoJCWZuX3NldF9ob29rKCJ7JGNsYXNzX25hbWV9X3skZnVuY3Rpb25fbmFtZX1fcHJlIiwgJHByb2R1Y3RzLCAkc2V0dGluZywgJHBhcmFtcywgJGV4dHJhX3BhcmFtcyk7CgoJCSR2YWx1ZXMgPSBbXTsKCQlmb3JlYWNoICgkYXJndW1lbnRzIGFzICRhcmcgPT4gJF9wYXJhbXMpIHsKCgkJCSRrZXkgPSAkYXJnOwoKCQkJaWYgKGlzc2V0KCRfcGFyYW1zWydrZXknXSkpIHsKCQkJCSRrZXkgPSAkX3BhcmFtc1sna2V5J107CgkJCX0KCgkJCSR2YWx1ZXNbJGtleV0gPSBudWxsOwoKCQkJaWYgKGlzc2V0KCRfcGFyYW1zWydkZWZhdWx0J10pKSB7CgkJCQkkdmFsdWVzWyRrZXldID0gJF9wYXJhbXNbJ2RlZmF1bHQnXTsKCQkJfQoKCQkJaWYgKGlzX3N0cmluZygkYXJnKSkgewoJCQkJaWYgKHN0cnBvcygkYXJnLCAnIycpID09PSAwKSB7CgoJCQkJCSR2YWwgPSBzdWJzdHIoJGFyZywgMSk7CgoJCQkJCWlmIChpc3NldCgkcGFyYW1zWyR2YWxdKSkgewoJCQkJCQkkdmFsdWVzWyRrZXldID0gJiRwYXJhbXNbJHZhbF07CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHZhbHVlID0gJHBhcmFtczsKCQkJCQkJZm9yZWFjaCAoZXhwbG9kZSgnLicsICR2YWwpIGFzICRwYXRoKSB7CgoJCQkJCQkJaWYgKGlzc2V0KCR2YWx1ZVskcGF0aF0pKSB7CgkJCQkJCQkJJHZhbHVlID0gJHZhbHVlWyRwYXRoXTsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJJHZhbHVlID0gJHZhbHVlc1ska2V5XTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQkkdmFsdWVzWyRrZXldID0gJiR2YWx1ZTsKCQkJCQkJdW5zZXQoJHZhbHVlKTsKCQkJCQl9CgkJCQl9IGVsc2VpZiAoc3RycG9zKCRhcmcsICdAJykgPT09IDApIHsKCgkJCQkJJHZhbCA9IHN1YnN0cigkYXJnLCAxKTsKCgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5jb250YWluZXJbJHZhbF0pKSB7CgkJCQkJCSR2YWx1ZXNbJGtleV0gPSAkdGhpcy0+Y29udGFpbmVyWyR2YWxdOwoJCQkJCX0KCQkJCX0gZWxzZWlmIChzdHJwb3MoJGFyZywgJyYnKSA9PT0gMCkgewoKCQkJCQkkdmFsID0gc3Vic3RyKCRhcmcsIDEpOwoKCQkJCQlpZiAocHJvcGVydHlfZXhpc3RzKCR0aGlzLCAkdmFsKSkgewoJCQkJCQkkdmFsdWVzWyRrZXldID0gJHRoaXMtPnskdmFsfTsKCQkJCQl9CgkJCQl9IGVsc2VpZiAoc3RycG9zKCRhcmcsICckJykgPT09IDApIHsKCgkJCQkJJHZhbCA9IHN1YnN0cigkYXJnLCAxKTsKCgkJCQkJJHZhbHVlc1ska2V5XSA9ICQkdmFsOwoJCQkJfSBlbHNlaWYgKCFpc3NldCgkdmFsdWVzWyRrZXldKSB8fCBlbXB0eSgkdmFsdWVzWyRrZXldKSkgewoKCQkJCQkkdmFsdWVzWyRrZXldID0gJGFyZzsKCQkJCX0KCgkJCQlmbl9zZXRfaG9vaygieyRjbGFzc19uYW1lfV97JGZ1bmN0aW9uX25hbWV9IiwgJHZhbHVlcywgJGFyZywgJHBhcmFtcywgJF9wYXJhbXMpOwoJCQl9CgkJfQoKCQlmbl9zZXRfaG9vaygieyRjbGFzc19uYW1lfV97JGZ1bmN0aW9uX25hbWV9X3Bvc3QiLCAkdmFsdWVzKTsKCQlyZXR1cm4gJHNhdmVfa2V5cyA/ICR2YWx1ZXMgOiBhcnJheV92YWx1ZXMoJHZhbHVlcyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50KCRhcmcsICRwYXJhbXMpIHsKCQkkcmVzdWx0ID0gJGFyZzsKCgkJaWYgKGlzX3N0cmluZygkYXJnKSkgewoJCQlpZiAoc3RycG9zKCRhcmcsICcjJykgPT09IDApIHsKCQkJCSR2YWwgPSBzdWJzdHIoJGFyZywgMSk7CgoJCQkJaWYgKGlzc2V0KCRwYXJhbXNbJHZhbF0pKSB7CgkJCQkJJHJlc3VsdCA9ICYkcGFyYW1zWyR2YWxdOwoJCQkJfSBlbHNlIHsKCQkJCQl1bnNldCgkdmFsdWUpOwoJCQkJCSR2YWx1ZSA9ICRwYXJhbXM7CgkJCQkJZm9yZWFjaCAoZXhwbG9kZSgnLicsICR2YWwpIGFzICRwYXRoKSB7CgoJCQkJCQlpZiAoaXNzZXQoJHZhbHVlWyRwYXRoXSkpIHsKCQkJCQkJCSR2YWx1ZSA9ICYkdmFsdWVbJHBhdGhdOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJdW5zZXQoJHZhbHVlKTsKCQkJCQkJCSR2YWx1ZSA9IG51bGw7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCSRyZXN1bHQgPSAkdmFsdWU7CgkJCQl9CgkJCX0gZWxzZWlmIChzdHJwb3MoJGFyZywgJ0AnKSA9PT0gMCkgewoJCQkJJHZhbCA9IHN1YnN0cigkYXJnLCAxKTsKCgkJCQlpZiAoaXNzZXQoJHBhcmFtc1snY29udGFpbmVyJ11bJHZhbF0pKSB7CgkJCQkJJHJlc3VsdCA9ICRwYXJhbXNbJ2NvbnRhaW5lciddWyR2YWxdOwoJCQkJfQoJCQl9IGVsc2VpZiAoc3RycG9zKCRhcmcsICcmJykgPT09IDApIHsKCQkJCSR2YWwgPSBzdWJzdHIoJGFyZywgMSk7CgoJCQkJaWYgKHByb3BlcnR5X2V4aXN0cygkcGFyYW1zWyd0aGlzJ10sICR2YWwpKSB7CgkJCQkJJHJlc3VsdCA9ICRwYXJhbXNbJ3RoaXMnXS0+eyR2YWx9OwoJCQkJfQoJCQl9IGVsc2VpZiAoc3RycG9zKCRhcmcsICckJykgPT09IDApIHsKCQkJCSR2YWwgPSBzdWJzdHIoJGFyZywgMSk7CgoJCQkJJHJlc3VsdCA9ICQkdmFsOwoJCQl9CgkJfQoKCQlmbl9zZXRfaG9vaygnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXJfbWFuYWdlcl9nZXRfYXJndW1lbnQnLCAkcmVzdWx0LCAkYXJnLCAkcGFyYW1zKTsKCQkkYXJnID0gJHJlc3VsdDsKCQlyZXR1cm4gJGFyZzsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWUoJG9iamVjdCwgJGtleSwgJGRlZmF1bHQgPSBudWxsKSB7CgkJZm9yZWFjaCAoZXhwbG9kZSgnLicsICRrZXkpIGFzICRwYXRoKSB7CgoJCQlpZiAoaXNzZXQoJG9iamVjdFskcGF0aF0pKSB7CgkJCQkkb2JqZWN0ID0gJG9iamVjdFskcGF0aF07CgkJCX0gZWxzZSB7CgkJCQkkb2JqZWN0ID0gJGRlZmF1bHQ7CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJZm5fc2V0X2hvb2soJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyX21hbmFnZXJfZ2V0X3ZhbHVlJywgJG9iamVjdCwgJGtleSwgJGRlZmF1bHQpOwoJCXJldHVybiAkb2JqZWN0OwoJfQoJcHVibGljIGZ1bmN0aW9uIHNldFZhbHVlKCYkYXJyYXksICRrZXlzLCAkdmFsdWUsICRwYXJhbXMgPSBbXSwgJGlzX2FycmF5X21lcmdlID0gdHJ1ZSkgewoJCWZuX3NldF9ob29rKCdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlcl9tYW5hZ2VyX3NldF92YWx1ZV9wcmUnLCAkYXJyYXksICRrZXlzLCAkdmFsdWUsICRwYXJhbXMpOwoJCSRrZXlzID0gaXNfYXJyYXkoJGtleXMpID8gJGtleXMgOiBleHBsb2RlKCcuJywgJGtleXMpOwoJCSRrZXlfcmVzdWx0ID0gYXJyYXlfc2hpZnQoJGtleXMpOwoJCWlmIChlbXB0eSgka2V5cykpIHsKCgkJCWlmICghZW1wdHkoJHBhcmFtcykpIHsKCQkJCSRvYmplY3QgPSBpc3NldCgkcGFyYW1zWydvYmplY3QnXSkgPyAkcGFyYW1zWydvYmplY3QnXSA6IFtdOwoJCQkJJG9iamVjdFsndmFsdWUnXSA9ICR2YWx1ZTsKCQkJCWlmIChpc3NldCgkcGFyYW1zWydmdW5jJ10pICYmIGlzc2V0KCRwYXJhbXNbJ2FyZ3MnXSkpIHsKCgkJCQkJaWYgKGlzX2FycmF5KCRwYXJhbXNbJ2Z1bmMnXSkpIHsKCQkJCQkJJHBhcmFtc1snZnVuYyddID0gJHRoaXMtPmdldEFyZ3VtZW50cygkcGFyYW1zWydmdW5jJ10sICRvYmplY3QpOwoJCQkJCX0KCgkJCQkJJHBhcmFtc1snYXJncyddID0gJHRoaXMtPmdldEFyZ3VtZW50cygkcGFyYW1zWydhcmdzJ10sICRvYmplY3QpOwoKCQkJCQlpZiAoaXNfY2FsbGFibGUoJHBhcmFtc1snZnVuYyddKSkgewoKCQkJCQkJJHZhbHVlID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJHBhcmFtc1snZnVuYyddLCAkcGFyYW1zWydhcmdzJ10pOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJaWYgKGlzc2V0KCRhcnJheVska2V5X3Jlc3VsdF0pICYmIGlzX2FycmF5KCRhcnJheVska2V5X3Jlc3VsdF0pICYmICRpc19hcnJheV9tZXJnZSkgewoJCQkJJGFycmF5WyRrZXlfcmVzdWx0XSA9IGZuX2FycmF5X21lcmdlKCRhcnJheVska2V5X3Jlc3VsdF0sICR2YWx1ZSk7CgkJCX0gZWxzZSB7CgoJCQkJJGFycmF5WyRrZXlfcmVzdWx0XSA9ICR2YWx1ZTsKCQkJfQoKCQkJZm5fc2V0X2hvb2soJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyX21hbmFnZXJfc2V0X3ZhbHVlJywgJGFycmF5LCAka2V5cywgJHZhbHVlLCAkcGFyYW1zKTsKCgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZWlmIChpc19hcnJheSgkYXJyYXkpKSB7CgkJCSRhcnJheVska2V5X3Jlc3VsdF0gPSBpc3NldCgkYXJyYXlbJGtleV9yZXN1bHRdKSA/ICRhcnJheVska2V5X3Jlc3VsdF0gOiBbXTsKCQkJJHRoaXMtPnNldFZhbHVlKCRhcnJheVska2V5X3Jlc3VsdF0sICRrZXlzLCAkdmFsdWUsICRwYXJhbXMpOwoJCX07Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldENsYXNzTWFuYWdlcigkYWRkb25faWQpOiBDbGFzc01hbmFnZXIgewoJCXJldHVybiAkdGhpcy0+aWZHZXRDbGFzc01hbmFnZXIoJGFkZG9uX2lkKTsKCX0KCglwcm90ZWN0ZWQgZnVuY3Rpb24gX2dldENsYXNzTWFuYWdlcigkYWRkb25faWQpOiBDbGFzc01hbmFnZXIgewoJCXJldHVybiAgbmV3IENsYXNzTWFuYWdlcigkYWRkb25faWQpOwoJfQoKCXByb3RlY3RlZCBmdW5jdGlvbiBpZkdldENsYXNzTWFuYWdlcigkYWRkb25faWQpOiBDbGFzc01hbmFnZXIgewoJCXN0YXRpYyAkY2xhc3NfbWFuYWdlcl9saXN0ID0gW107CgoJCWlmICghaXNzZXQoJGNsYXNzX21hbmFnZXJfbGlzdFskYWRkb25faWRdKSkgewoJCQkkY2xhc3NfbWFuYWdlcl9saXN0WyRhZGRvbl9pZF0gPSAkdGhpcy0+X2dldENsYXNzTWFuYWdlcigkYWRkb25faWQpOwoJCX0KCQlyZXR1cm4gJGNsYXNzX21hbmFnZXJfbGlzdFskYWRkb25faWRdOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiB1cGRhdGVBZGRvblNldHRpbmdzKCRhZGRvbl9pZCwgJHNldHRpbmdfaWRzLCAkc2V0dGluZ3NfZGF0YSkgewoJCSR0aGlzLT5jbGVhckFkZG9uQ2FjaGUoJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyJyk7CgkJJHRoaXMtPmNsZWFyQWRkb25DYWNoZSgkYWRkb25faWQpOwoJCSR0aGlzLT5nZXRMaWNlbnNlKCRhZGRvbl9pZCwgdHJ1ZSk7CgoJCSR0aGlzLT5nZXRDbGFzc0FkZG9uU2V0dGluZ3MoJGFkZG9uX2lkKS0+dXBkYXRlX2FkZG9uX3NldHRpbmdzKCRzZXR0aW5nX2lkcywgJHNldHRpbmdzX2RhdGEpOwoKCQkkdGhpcy0+Y2xlYXJBZGRvbkNhY2hlKCdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlcicpOwoJCSR0aGlzLT5jbGVhckFkZG9uQ2FjaGUoJGFkZG9uX2lkKTsKCQkkdGhpcy0+Z2V0TGljZW5zZSgkYWRkb25faWQsIHRydWUpOwoJfQoJcHVibGljIGZ1bmN0aW9uIGV4dHJhY3RBZGRvblNldHRpbmdzKCRhZGRvbl9pZCwgJG9wdGlvbnMpIHsKCQlyZXR1cm4gJHRoaXMtPmdldENsYXNzQWRkb25TZXR0aW5ncygkYWRkb25faWQpLT5leHRyYWN0X3NldHRpbmdzKCRvcHRpb25zKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gY2xlYW5pbmcoJGFkZG9uX2lkLCAkbGltaXQgPSB0cnVlKSB7CgkJcmV0dXJuICR0aGlzLT5nZXRDbGFzc1ZhbGlkYXRvcigkYWRkb25faWQpLT5jbGVhbmluZygkbGltaXQpOwoJfQoJcHVibGljIGZ1bmN0aW9uIHNhdmVTdGF0ZSgkYWRkb25faWQgPSAnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInLCAkc3RhdGUgPSBbXSkgewoJCXJldHVybiAkdGhpcy0+Z2V0Q2xhc3NEYXRhTWFuYWdlcigkYWRkb25faWQpLT5zYXZlU3RhdGUoJHN0YXRlKTsKCX0KCglwdWJsaWMgIGZ1bmN0aW9uIGlzTWF1cmlzd2ViQWRkb24oJGFkZG9uKSB7CgkJcmV0dXJuICR0aGlzLT5nZXRDbGFzc01hbmFnZXIoJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyJyktPmlzTWF1cmlzd2ViQWRkb24oJGFkZG9uKTsKCX0KCXB1YmxpYyAgZnVuY3Rpb24gZ2V0QWRkb25TZXR0aW5ncygkYWRkb25faWQgPSAnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInLCAkZ2V0X3N0b3JlZm9udF9zZXR0aW5ncyA9IHRydWUpIHsKCQlyZXR1cm4gJHRoaXMtPmdldENsYXNzQWRkb25TZXR0aW5ncygkYWRkb25faWQpLT5nZXRTZXR0aW5ncygkZ2V0X3N0b3JlZm9udF9zZXR0aW5ncyk7Cgl9CglwdWJsaWMgZnVuY3Rpb24gdW5zZXRCb3goCgkJJGtleSwKCQkkY29tcGFueV9pZCA9IG51bGwsCgkJJGFkZG9uX2lkID0gJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyJwoJKSB7CgkJcmV0dXJuICR0aGlzLT5nZXRDbGFzc0FkZG9uU2V0dGluZ3MoJGFkZG9uX2lkKQoJCQktPnVuc2V0Qm94KCRrZXksICRjb21wYW55X2lkKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0Qm94KAoJCSRrZXksCgkJJGNvbXBhbnlfaWQgPSBudWxsLAoJCSRib3hfZGlyID0gbnVsbCwKCQkkYWRkb25faWQgPSAnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInCgkpIHsKCQlyZXR1cm4gJHRoaXMtPmdldENsYXNzQWRkb25TZXR0aW5ncygkYWRkb25faWQpCgkJCS0+Z2V0Qm94KCRrZXksICRjb21wYW55X2lkLCAkYm94X2Rpcik7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHNldEJveCgKCQkka2V5cywKCQkkdmFsdWUsCgkJJGNvbXBhbnlfaWQgPSBudWxsLAoJCSRib3hfZGlyID0gbnVsbCwKCQkkYWRkb25faWQgPSAnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInCgkpIHsKCQlyZXR1cm4gJHRoaXMtPmdldENsYXNzQWRkb25TZXR0aW5ncygkYWRkb25faWQpCgkJCS0+c2V0Qm94KCRrZXlzLCAkdmFsdWUsICRjb21wYW55X2lkLCAkYm94X2Rpcik7Cgl9CgoJcHVibGljICBmdW5jdGlvbiBnZXRTZXR0aW5ncygkYWRkb25faWQgPSAnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInLCAkdHlwZSA9ICIiKSB7CgkJcmV0dXJuICR0aGlzLT5nZXRDbGFzc1ZhbGlkYXRvcigkYWRkb25faWQpLT5nZXRTZXR0aW5ncygkdHlwZSk7Cgl9CgoJcHVibGljICBmdW5jdGlvbiBnZXRMaWNlbnNlKCRhZGRvbl9pZCA9ICdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlcicsICRza2lwX2xpbWl0ID0gZmFsc2UsICRleHRyYSA9IFtdKSB7CgkJcmV0dXJuICR0aGlzLT5nZXRDbGFzc1ZhbGlkYXRvcigkYWRkb25faWQpLT5nZXRMaWNlbnNlKCRza2lwX2xpbWl0LCAkZXh0cmEpOwoJfQoKCXB1YmxpYyAgZnVuY3Rpb24gZ2V0U2NoZW1lKCRhZGRvbl9pZCA9ICdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlcicsICRuYW1lX3NjaGVtZSA9IG51bGwpIHsKCQlyZXR1cm4gJHRoaXMtPmdldENsYXNzRGF0YU1hbmFnZXIoJGFkZG9uX2lkKS0+Z2V0U2NoZW1lKCRuYW1lX3NjaGVtZSk7Cgl9CgoJcHVibGljICBmdW5jdGlvbiBnZXREaXJzU3RydWN0KCRhZGRvbl9pZCA9ICdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlcicsICRuYW1lU3RydWN0ID0gJycpIHsKCQlyZXR1cm4gJHRoaXMtPmdldENsYXNzRGF0YU1hbmFnZXIoJGFkZG9uX2lkKS0+Z2V0RGlyc1N0cnVjdCgkbmFtZVN0cnVjdCk7Cgl9CgoJcHVibGljICBmdW5jdGlvbiBnZXRDbGFzc0RhdGFNYW5hZ2VyKCRhZGRvbl9pZCA9ICdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlcicpIHsKCQlyZXR1cm4gJHRoaXMtPmdldENsYXNzTWFuYWdlcigkYWRkb25faWQpLT5nZXREYXRhTWFuYWdlcigpOwoJfQoJcHVibGljICBmdW5jdGlvbiBnZXRDbGFzc1ZhbGlkYXRvcigkYWRkb25faWQgPSAnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInKSB7CgkJcmV0dXJuICR0aGlzLT5nZXRDbGFzc01hbmFnZXIoJGFkZG9uX2lkKS0+Z2V0VmFsaWRhdG9yKCk7Cgl9CglwdWJsaWMgIGZ1bmN0aW9uIGdldENsYXNzRGVidWcoJGFkZG9uX2lkID0gJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyJykgewoJCXJldHVybiAkdGhpcy0+Z2V0Q2xhc3NNYW5hZ2VyKCRhZGRvbl9pZCktPmdldERlYnVnKCk7Cgl9CglwdWJsaWMgIGZ1bmN0aW9uIGdldENsYXNzRGF0YUJhc2UoJGFkZG9uX2lkID0gJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyJykgewoJCXJldHVybiAkdGhpcy0+Z2V0Q2xhc3NNYW5hZ2VyKCRhZGRvbl9pZCktPmdldERhdGFCYXNlKCk7Cgl9CglwdWJsaWMgIGZ1bmN0aW9uIGdldENsYXNzQWRkb25TZXR0aW5ncygkYWRkb25faWQgPSAnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInKSB7CgkJcmV0dXJuICR0aGlzLT5nZXRDbGFzc01hbmFnZXIoJGFkZG9uX2lkKS0+Z2V0QWRkb25TZXR0aW5ncygpOwoJfQoKCXB1YmxpYyAgZnVuY3Rpb24gZ2V0Q2xhc3NDb25uZWN0b3IoJGFkZG9uX2lkID0gJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyJykgewoJCXJldHVybiAkdGhpcy0+Z2V0Q2xhc3NNYW5hZ2VyKCRhZGRvbl9pZCktPmdldENvbm5lY3RvcigpOwoJfQoJcHVibGljICBmdW5jdGlvbiBjcmVhdGVPYmplY3QoJGNsYXNzX25hbWUpIHsKCQlyZXR1cm4gbmV3ICRjbGFzc19uYW1lKCk7Cgl9CglwdWJsaWMgIGZ1bmN0aW9uIGdldExpbmtzKCRuYW1lX2xpbmtzID0gJycsICRhZGRvbl9pZCA9ICdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlcicpIHsKCQlyZXR1cm4gJHRoaXMtPmdldENsYXNzRGF0YU1hbmFnZXIoJGFkZG9uX2lkKS0+Z2V0TGlua3MoJG5hbWVfbGlua3MpOwoJfQoJcHVibGljICBmdW5jdGlvbiBjbGVhckFkZG9uQ2FjaGUoJGFkZG9uX2lkLCAkdHlwZXMgPSBbXSkgewoJCSR0aGlzLT5nZXRDbGFzc01hbmFnZXIoJGFkZG9uX2lkKS0+Y2xlYXJDYWNoZSgkdHlwZXMpOwoJfQoJcHVibGljICBmdW5jdGlvbiBpbnN0YWxsKCRhZGRvbl9pZCkgewoJCSR0aGlzLT5jbGVhckFkZG9uQ2FjaGUoJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyJyk7CgkJJHRoaXMtPmdldENsYXNzTWFuYWdlcigkYWRkb25faWQpLT5pbnN0YWxsKCk7Cgl9CgoJcHVibGljICBmdW5jdGlvbiB1bmluc3RhbGwoJGFkZG9uX2lkKSB7CgkJJHRoaXMtPmNsZWFyQWRkb25DYWNoZSgnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInKTsKCQkkdGhpcy0+Z2V0Q2xhc3NNYW5hZ2VyKCRhZGRvbl9pZCktPnVuaW5zdGFsbCgpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRBZGRvbnNMaWNlbnNlKCRhZGRvbnMsICRza2lwX2xpbWl0ID0gZmFsc2UsICRleHRyYSA9IFtdKSB7CgkJJGFkZG9uID0gJHRoaXMtPmdldFNjaGVtZSgnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInLCAnbmFtZV9hZGRvbicpOwoJCQoJCWxpc3QoJGFsbG93ZWRfcmVxdWVzdCwgJHRpbWUpID0gJHRoaXMtPmdldENsYXNzVmFsaWRhdG9yKCdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlcicpCgkJCS0+Y2hlY2tUaWNrUmVxdWVzdCgkc2tpcF9saW1pdCwgJ2FkZG9uc190aWNrX3JlcXVlc3QnKTsKCQkKCQlpZiAoJGFsbG93ZWRfcmVxdWVzdCkgewoJCQkkY29ubmVjdCA9ICR0aGlzLT5nZXRDbGFzc0Nvbm5lY3RvcignbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInKTsKCQkJJGdldF9maWxlcyA9IFtdOwoKCQkJJGRhdGEgPSAkY29ubmVjdC0+YXNjU2VydmVyKGFycmF5KAoJCQkJImRpc3BhdGNoIiA9PiAic2VydmljZS5nZXRfYWRkb25zX21haW5fZmlsZXMiLAoJCQkJJ2FkZG9ucycgPT4gJGFkZG9ucwoJCQkpKTsKCQkJCgkJCSRmaWxlX2xpc3QgPSBpc3NldCgkZGF0YVsiZGF0YSJdWydmaWxlX25hbWVzJ10pCgkJCQk/ICRkYXRhWyJkYXRhIl1bJ2ZpbGVfbmFtZXMnXSA6IGZhbHNlOwoJCQkKCQkJaWYgKGlzX2FycmF5KCRmaWxlX2xpc3QpKSB7CgkJCQlmb3JlYWNoICgkZmlsZV9saXN0IGFzICRfYWRkb24gPT4gJGxpc3QpIHsKCQkJCQlpZiAoaXNfYXJyYXkoJGxpc3QpKSB7CgkJCQkJCWZvcmVhY2ggKCRsaXN0IGFzICR2YWx1ZSkgewoJCQkJCQkJJGdldF9maWxlc1skX2FkZG9uXSAgPSAhaXNfZmlsZSgkdmFsdWUpOwoJCQkJCQkJaWYgKCRnZXRfZmlsZXNbJF9hZGRvbl0pIHsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQkKCQkJZm9yZWFjaCAoJGFkZG9ucyBhcyAkX2FkZG9uID0+ICR2KSB7CgkJCQkkYWRkb25zRGF0YSA9IG5ldyBBZGRvbnNEYXRhKCRfYWRkb24pOwoJCQkJJGV4dHJhWyRfYWRkb25dID0gaXNzZXQoJGV4dHJhWyRfYWRkb25dKQoJCQkJCT8gYXJyYXlfbWVyZ2UoJGV4dHJhWyRfYWRkb25dLCAkYWRkb25zRGF0YS0+Z2V0RXh0cmEoKSkKCQkJCQk6ICRhZGRvbnNEYXRhLT5nZXRFeHRyYSgpOwoJCQl9CgkJCSRkYXRhID0gJGNvbm5lY3QtPmFzY1NlcnZlcihhcnJheSgKCQkJCSJkaXNwYXRjaCIgPT4gInNlcnZpY2UuY2hlY2tfYWRkb25zX2xpY2Vuc2UiLAoJCQkJJ2FkZG9ucycgPT4gJGFkZG9ucywKCQkJCSdza2lwX2xpbWl0JyA9PiAkc2tpcF9saW1pdCwKCQkJCSJnZXRfZmlsZXMiID0+ICRnZXRfZmlsZXMsCgkJCQkiZXh0cmEiID0+ICRleHRyYQoJCQkpKTsKCQkJCgkJCSRhbGxfdmFsaWQgPSB0cnVlOwoJCQkkZGVidWcgPSAkdGhpcy0+Z2V0Q2xhc3NEZWJ1ZygnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInKTsKCQkJCgkJCWlmIChpc19hcnJheSgkZGF0YSkpIHsKCQkJCWlmICgkZGF0YVsiaW5mbyJdWyJodHRwX2NvZGUiXSA9PSAyMDApIHsKCQkJCQlmb3JlYWNoICgkZGF0YVsnZGF0YSddIGFzICRhZGRvbiA9PiAkcmVzdWx0KSB7CgkJCQkJCSR0aGlzLT5jbGVhckFkZG9uQ2FjaGUoJGFkZG9uKTsKCgkJCQkJCWlmIChpc3NldCgkcmVzdWx0WyJmaWxlX25hbWUiXSkpIHsKCQkJCQkJCWlmICghZGVmaW5lZCgnQ0FSVF9MQU5HVUFHRScpKSB7CgkJCQkJCQkJZm5faW5pdF9sYW5ndWFnZSgkX1JFUVVFU1QpOwoJCQkJCQkJfQoKCQkJCQkJCSR0bXBmaWxlICA9ICRkZWJ1Zzo6c2F2ZUZpbGUoCgkJCQkJCQkJJGFkZG9uLCAkcmVzdWx0WyJmaWxlX25hbWUiXSwgJHJlc3VsdFsiZmlsZXMiXQoJCQkJCQkJKTsKCgkJCQkJCQlmbl9kZWNvbXByZXNzX2ZpbGVzKCR0bXBmaWxlLCBESVJfUk9PVCk7CgkJCQkJCX0KCgkJCQkJCSRzZXR0aW5ncyA9IGFycmF5KCk7CgkJCQkJCSRkYXRhX3NldCA9ICAkdGhpcy0+Z2V0Q2xhc3NEYXRhTWFuYWdlcigkYWRkb24pLT5nZXRTY2hlbWUoJ2RhdGFfc2V0Jyk7CgoJCQkJCQlpZiAoaXNfYXJyYXkoJGRhdGFfc2V0KSkgewoJCQkJCQkJZm9yZWFjaCAoJGRhdGFfc2V0IGFzICRuYW1lKSB7CgkJCQkJCQkJaWYgKGlzc2V0KCRyZXN1bHRbJG5hbWVdKSkgewoJCQkJCQkJCQkkc2V0dGluZ3NbJG5hbWVdID0gJHJlc3VsdFskbmFtZV07CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCSRzZXR0aW5nc1sic2NoZW1hcyJdWyJyb290X2RhdGEiXVsibWFpbl9maWxlcyJdID0gCgkJCQkJCQlpc3NldCgkZmlsZV9saXN0WyRhZGRvbl0pID8gJGZpbGVfbGlzdFskYWRkb25dIDogW107CgoJCQkJCQkkc2lnbmFsID0gJHRoaXMtPmdldENsYXNzVmFsaWRhdG9yKCRhZGRvbiktPmdldF9zaWduYWwoJHJlc3VsdCk7CgoJCQkJCQkkdGhpcy0+Z2V0Q2xhc3NWYWxpZGF0b3IoJGFkZG9uKS0+Y2hlY2tUaWNrUmVxdWVzdCgkc2lnbmFsKTsKCQkJCQkJaWYgKCRzaWduYWwpIHsKCgkJCQkJCQkkdGhpcy0+Z2V0Q2xhc3NWYWxpZGF0b3IoJGFkZG9uKS0+c2F2ZVNldHRpbmdzKCRzZXR0aW5ncyk7CgkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJJGFsbF92YWxpZCA9IGZhbHNlOwoJCQkJCQl9CgkJCQkJfQoJCQkJCSR0aGlzLT5nZXRDbGFzc1ZhbGlkYXRvcignbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInKS0+Y2hlY2tUaWNrUmVxdWVzdCgkYWxsX3ZhbGlkLCAnYWRkb25zX3RpY2tfcmVxdWVzdCcpOwoKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBjbGVhckFkZG9uc0NhY2hlKCR0eXBlcyA9IFtdKSB7CgkJJGFkZG9uc19saXN0ID0gJHRoaXMtPmdldENsYXNzRGF0YU1hbmFnZXIoJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyJykKCQkJLT5nZXRBZGRvbnNMaXN0KCk7CgkJZm9yZWFjaCAoJGFkZG9uc19saXN0IGFzICRrZXkgPT4gJGFkZG9uX25hbWUpIHsKCQkJJHRoaXMtPmNsZWFyQWRkb25DYWNoZSgkYWRkb25fbmFtZSwgJHR5cGVzKTsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldEZhaWxBZGRvbkxpY2Vuc2UoJHNraXBfbGltaXQgPSBmYWxzZSwgJGV4dHJhID0gW10pIHsKCQkkX2xpbWl0ID0gMzA7CgkJJG5lZWRfZ2V0X2xpY2Vuc2UgPSBbXTsKCQkKCQkkYWRkb25zX2xpc3QgPSAkdGhpcy0+Z2V0Q2xhc3NEYXRhTWFuYWdlcignbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInKQoJCQktPmdldEFkZG9uc0xpc3QoKTsKCQkkYWRkb25zID0gJHRoaXMtPmdldENsYXNzRGF0YU1hbmFnZXIoJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyJyktPmdldEFkZG9ucygpOwoJCQoJCWZvcmVhY2ggKCRhZGRvbnNfbGlzdCBhcyAka2V5ID0+ICRhZGRvbl9uYW1lKSB7CgkJCWxpc3QoJHZhbGlkYXRlLCAkbmVlZF9yZXF1ZXN0KSA9IAoJCQkJJHRoaXMtPmdldENsYXNzVmFsaWRhdG9yKCRhZGRvbl9uYW1lKS0+Y2hlY2tWYWxpZCgkYWRkb25fbmFtZSk7CgkJCQoJCQlpZiAoISR2YWxpZGF0ZSAmJiAkbmVlZF9yZXF1ZXN0KSB7CgkJCQkkc2V0dGluZ3NfbG9jYWwgPSAKCQkJCQlpc19zdHJpbmcoUmVnaXN0cnk6OmdldCgnYWRkb25zLicgLiAkYWRkb25fbmFtZSAuICcubG9ja2FsX3NldHRpbmdzJykpIAoJCQkJCT8ganNvbl9kZWNvZGUoCgkJCQkJCVJlZ2lzdHJ5OjpnZXQoJ2FkZG9ucy4nIC4gJGFkZG9uX25hbWUgLiAnLmxvY2thbF9zZXR0aW5ncycpLCB0cnVlCgkJCQkJKSAKCQkJCQk6IFJlZ2lzdHJ5OjpnZXQoJ2FkZG9ucy4nIC4gJGFkZG9uX25hbWUgLiAnLmxvY2thbF9zZXR0aW5ncycpOwoJCQkJJG5lZWRfZ2V0X2xpY2Vuc2VbJGFkZG9uX25hbWVdID0gJGFkZG9uc1skYWRkb25fbmFtZV07CgkJCQkkbmVlZF9nZXRfbGljZW5zZVskYWRkb25fbmFtZV1bJ2xpY2Vuc2VfYWRkb24nXSA9IAoJCQkJCWlzc2V0KCRzZXR0aW5nc19sb2NhbFsnbGljZW5zZV9rZXknXSkgCgkJCQkJCT8gJHNldHRpbmdzX2xvY2FsWydsaWNlbnNlX2tleSddIDogZmFsc2U7CgkJCX0KCQl9CgkJaWYgKCFlbXB0eSgkbmVlZF9nZXRfbGljZW5zZSkpIHsKCQkJJF9uZWVkX2dldF9saWNlbnNlID0gYXJyYXlfY2h1bmsoCgkJCQkkbmVlZF9nZXRfbGljZW5zZSwKCQkJCSRfbGltaXQsCgkJCQl0cnVlCgkJCSk7CgkJCXVuc2V0KCRuZWVkX2dldF9saWNlbnNlKTsKCQkJZm9yZWFjaCAoJF9uZWVkX2dldF9saWNlbnNlIGFzICRrZXkgPT4gJG5lZWRfZ2V0X2xpY2Vuc2UpIHsKCQkJCSR0aGlzLT5nZXRBZGRvbnNMaWNlbnNlKCRuZWVkX2dldF9saWNlbnNlLCAkc2tpcF9saW1pdCwgJGV4dHJhKTsKCQkJfQoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlQWxsQWRkb25zTGljZW5zZSgkc2tpcF9saW1pdCA9IGZhbHNlLCAkZXh0cmEgPSBbXSkgewoJCSRfbGltaXQgPSAzMDsKCQkkbmVlZF91cGRhdGVfbGljZW5zZSA9IFtdOwoJCSRhZGRvbnNfbGlzdCA9ICR0aGlzLT5nZXRDbGFzc0RhdGFNYW5hZ2VyKCdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlcicpCgkJCS0+Z2V0QWRkb25zTGlzdCgpOwoJCQoJCSRhZGRvbnMgPSAkdGhpcy0+Z2V0Q2xhc3NEYXRhTWFuYWdlcignbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInKS0+Z2V0QWRkb25zKCk7CgkJZm9yZWFjaCAoJGFkZG9uc19saXN0IGFzICRrZXkgPT4gJGFkZG9uX25hbWUpIHsKCQkJJHNldHRpbmdzX2xvY2FsID0gCgkJCQlpc19zdHJpbmcoUmVnaXN0cnk6OmdldCgnYWRkb25zLicgLiAkYWRkb25fbmFtZSAuICcubG9ja2FsX3NldHRpbmdzJykpIAoJCQkJCT8ganNvbl9kZWNvZGUoCgkJCQkJCVJlZ2lzdHJ5OjpnZXQoJ2FkZG9ucy4nIC4gJGFkZG9uX25hbWUgLiAnLmxvY2thbF9zZXR0aW5ncycpLCB0cnVlCgkJCQkJKSAKCQkJCQk6IFJlZ2lzdHJ5OjpnZXQoJ2FkZG9ucy4nIC4gJGFkZG9uX25hbWUgLiAnLmxvY2thbF9zZXR0aW5ncycpOwoJCQkkbmVlZF91cGRhdGVfbGljZW5zZVskYWRkb25fbmFtZV0gPSAkYWRkb25zWyRhZGRvbl9uYW1lXTsKCQkJJG5lZWRfdXBkYXRlX2xpY2Vuc2VbJGFkZG9uX25hbWVdWydsaWNlbnNlX2FkZG9uJ10gPSAKCQkJCWlzc2V0KCRzZXR0aW5nc19sb2NhbFsnbGljZW5zZV9rZXknXSkgCgkJCQkJPyAkc2V0dGluZ3NfbG9jYWxbJ2xpY2Vuc2Vfa2V5J10gOiBmYWxzZTsKCQl9CgkJaWYgKCFlbXB0eSgkbmVlZF91cGRhdGVfbGljZW5zZSkpIHsKCQkJJF9uZWVkX2dldF9saWNlbnNlID0gYXJyYXlfY2h1bmsoCgkJCQkkbmVlZF91cGRhdGVfbGljZW5zZSwKCQkJCSRfbGltaXQsCgkJCQl0cnVlCgkJCSk7CgkJCWZvcmVhY2ggKCRfbmVlZF9nZXRfbGljZW5zZSBhcyAka2V5ID0+ICRfbmVlZF91cGRhdGVfbGljZW5zZSkgewoJCQkJJHRoaXMtPmdldEFkZG9uc0xpY2Vuc2UoJF9uZWVkX3VwZGF0ZV9saWNlbnNlLCAkc2tpcF9saW1pdCwgJGV4dHJhKTsKCQkJfQoJCX0KCX0KCglmdW5jdGlvbiBnZXRDb21wYW55U2V0dGluZ3NEYXRhKCYkY29tcGFueV9kYXRhLCAkc2V0dGluZ3NfZGF0YSl7CgkJaWYgKGlzc2V0KCRzZXR0aW5nc19kYXRhWydtYWluJ10pKXsKCQkJZm9yZWFjaCAoJHNldHRpbmdzX2RhdGFbJ21haW4nXSBhcyAkZmllbGRfaWQgPT4gJiRmaWVsZF9kYXRhKXsKCQkJCXVuc2V0KCRmaWVsZF9kYXRhWyd1cGRhdGVfZm9yX2FsbCddKTsKCQkJCWlmICghZW1wdHkoJHNldHRpbmdzX3ZhbHVlcykgJiYgIWVtcHR5KCRzZXR0aW5nc192YWx1ZXNbJGZpZWxkX2lkXSkpewoJCQkJCSRmaWVsZF9kYXRhWyd2YWx1ZSddID0gJHNldHRpbmdzX3ZhbHVlc1skZmllbGRfaWRdOwoJCQkJfQoJCQl9CgkJCWZvcmVhY2ggKCRzZXR0aW5nc19kYXRhWydtYWluJ10gYXMgJHNldHRpbmdfaWQgPT4gJHNldHRpbmcpewoJCQkJJGNvbXBhbnlfZGF0YVtzdHJfcmVwbGFjZSgnY29tcGFueV8nLCAnJywgJHNldHRpbmdbJ25hbWUnXSldID0gJHNldHRpbmdbJ3ZhbHVlJ107CgkJCX0KCQl9Cgl9CgoJZnVuY3Rpb24gYWRkQ29tcGFueVNldHRpbmdzRGF0YSgmJGNvbXBhbnlfZGF0YSwgJGNvbXBhbnlfaWQpIHsKCQlpZiAoZm5fYWxsb3dlZF9mb3IoJ1VMVElNQVRFJykgfHwgKCEkY29tcGFueV9pZCkgJiYgZm5fYWxsb3dlZF9mb3IoJ01VTFRJVkVORE9SJykpIHsKCQkJJHNlY3Rpb24gPSBTZXR0aW5nczo6aW5zdGFuY2UoKS0+Z2V0U2VjdGlvbkJ5TmFtZSgnQ29tcGFueScsIFNldHRpbmdzOjpDT1JFX1NFQ1RJT04sIGZhbHNlKTsKCgkJCSRzZXR0aW5nc19kYXRhID0gU2V0dGluZ3M6Omluc3RhbmNlKCktPmdldExpc3QoJHNlY3Rpb25bJ3NlY3Rpb25faWQnXSwgMCwgZmFsc2UsICRjb21wYW55X2lkKTsKCQkJJHRoaXMtPmdldENvbXBhbnlTZXR0aW5nc0RhdGEoJGNvbXBhbnlfZGF0YSwgJHNldHRpbmdzX2RhdGEpOwoJCX0KCX0KCWZ1bmN0aW9uIGV4cGxvZGVBZGRyZXNzKCRhZGRyZXNzKSB7CgoKCQkkX3Jlc3VsdCA9IGV4cGxvZGUoJywnLCAkYWRkcmVzcyk7CgkJZm5fc2V0X2hvb2soJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyX21hbmFnZXJfZXhwbG9kZV9hZGRyZXNzX3ByZScsICRhZGRyZXNzLCAkX3Jlc3VsdCk7CgoJCSRyZXN1bHRbXSA9IGlzc2V0KCRfcmVzdWx0WzBdKSA/ICRfcmVzdWx0WzBdIDogJyc7CgkJJGhvdXNlID0gJyc7CgkJaWYgKGlzc2V0KCRfcmVzdWx0WzFdKSkgewoKCQkJZm9yZWFjaCAoc3RyX3NwbGl0KCRfcmVzdWx0WzFdKSBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQkJaWYgKGlzX251bWVyaWMoJHZhbHVlKSkgewoJCQkJCSRob3VzZSAuPSAkdmFsdWU7CgkJCQl9CgkJCX0KCgkJCSRob3VzZSA9ICRob3VzZTsKCQl9CgkJJHJlc3VsdFtdID0gICRob3VzZTsKCgkJZm5fc2V0X2hvb2soJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyX21hbmFnZXJfZXhwbG9kZV9hZGRyZXNzJywgJGFkZHJlc3MsICRfcmVzdWx0LCAkcmVzdWx0KTsKCgkJcmV0dXJuICRyZXN1bHQ7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldEFkZHJlc3NlcygkY29tcGFueV9pZCkgewoJCSRhZGRyZXNzZXMgPSBbXTsKCgkJJGNvbXBhbnlfZGF0YSA9IGZuX2dldF9jb21wYW55X2RhdGEoJGNvbXBhbnlfaWQpOwoJCSRjb21wYW55X2RhdGEgPSBpc19hcnJheSgkY29tcGFueV9kYXRhKSA/ICRjb21wYW55X2RhdGEgOiBbXTsKCQkkdGhpcy0+YWRkQ29tcGFueVNldHRpbmdzRGF0YSgkY29tcGFueV9kYXRhLCAkY29tcGFueV9pZCk7CgoJCSRjb3VudHJ5X2NvZGUgPSBpc3NldCgkY29tcGFueV9kYXRhWydjb3VudHJ5J10pID8gJGNvbXBhbnlfZGF0YVsnY291bnRyeSddIDogJyc7CgkJJGNvbXBhbnlfYWRkcmVzcyA9IFsKCQkJJ25hbWUnID0+IF9fKCdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlci5jb21wYW55X2FkZHJlc3MnLCBbJ1tjb21wYW55XScgPT4gaXNzZXQoJGNvbXBhbnlfZGF0YVsnY29tcGFueSddKSA/ICRjb21wYW55X2RhdGFbJ2NvbXBhbnknXSA6ICRjb21wYW55X2RhdGFbJ25hbWUnXV0pLAoJCQknemlwY29kZScgPT4gIGlzc2V0KCRjb21wYW55X2RhdGFbJ3ppcGNvZGUnXSkgPyAkY29tcGFueV9kYXRhWyd6aXBjb2RlJ10gOiAnJywKCQkJJ2NvdW50cnknID0+ICRjb3VudHJ5X2NvZGUsCgkJCSdzdGF0ZScgPT4gJGNvbXBhbnlfZGF0YVsnc3RhdGUnXSwKCQkJJ2NpdHknID0+IGlzc2V0KCRjb21wYW55X2RhdGFbJ2NpdHknXSkgPyAkY29tcGFueV9kYXRhWydjaXR5J10gOiAnJywKCQldOwoJCWxpc3QoJGNvbXBhbnlfYWRkcmVzc1snc3RyZWV0J10sICRjb21wYW55X2FkZHJlc3NbJ2hvdXNlJ10pID0gJHRoaXMtPmV4cGxvZGVBZGRyZXNzKGlzc2V0KCRjb21wYW55X2RhdGFbJ2FkZHJlc3MnXSkgPyAkY29tcGFueV9kYXRhWydhZGRyZXNzJ10gOiAnJyk7CgoJCSRhZGRyZXNzZXNbImNvbXBhbnlfeyRjb21wYW55X2lkfSJdID0gJGNvbXBhbnlfYWRkcmVzczsKCgkJZm5fc2V0X2hvb2soJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyX21hbmFnZXJfZ2V0X2FkZHJlc3NlcycsICRjb21wYW55X2lkLCAkYWRkcmVzc2VzKTsKCgkJcmV0dXJuICRhZGRyZXNzZXM7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGNoZWNrVmFsaWQoJGFkZG9uID0gIm1hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyIiwgJHNraXAgPSBmYWxzZSkgewoJCXN0YXRpYyAkcmVzdWx0ID0gW107CgkJaWYoIWVtcHR5KCRhZGRvbikpewoJCQlpZihPYmplY3RTdGF0dXNlczo6QUNUSVZFICE9IFJlZ2lzdHJ5OjpnZXQoImFkZG9ucy57JGFkZG9ufS5zdGF0dXMiKSl7CgkJCQkkcmVzdWx0WyRhZGRvbl0gPSBmYWxzZTsKCQkJfQoJCQlpZiAoIWlzc2V0KCRyZXN1bHRbJGFkZG9uXSkgfHwgJHNraXApIHsKCQkJCWxpc3QoJHJlc3VsdFskYWRkb25dKSA9IAoJCQkJCSR0aGlzLT5nZXRDbGFzc1ZhbGlkYXRvcigkYWRkb24pLT5jaGVja1ZhbGlkKCRhZGRvbik7CgkJCQkkcmVzdWx0WyRhZGRvbl0gPSAKCQkJCQlPYmplY3RTdGF0dXNlczo6QUNUSVZFID09IFJlZ2lzdHJ5OjpnZXQoImFkZG9ucy57JGFkZG9ufS5zdGF0dXMiKSAKCQkJCQkmJiAkcmVzdWx0WyRhZGRvbl07CgoJCQkJbGlzdCgkYWxsb3dlZF9yZXF1ZXN0KSA9IAoJCQkJCSR0aGlzLT5nZXRDbGFzc1ZhbGlkYXRvcigkYWRkb24pLT5jaGVja1RpY2tSZXF1ZXN0KCRza2lwKTsKCQkJCWlmICghJHJlc3VsdFskYWRkb25dICYmICgkYWxsb3dlZF9yZXF1ZXN0IHx8ICRza2lwKSkgewoJCQkJCSR0aGlzLT5nZXRGYWlsQWRkb25MaWNlbnNlKCk7CgkJCQkJbGlzdCgkcmVzdWx0WyRhZGRvbl0pID0gCgkJCQkJCSR0aGlzLT5nZXRDbGFzc1ZhbGlkYXRvcigkYWRkb24pLT5jaGVja1ZhbGlkKCRhZGRvbik7CgkJCQl9CgkJCX0KCQkJcmV0dXJuICRyZXN1bHRbJGFkZG9uXTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBhcnJheVRvU3RyaW5nKCRhcnJheSwgJGxldmVsID0gIiIpIHsKCQlyZXR1cm4gJHRoaXMtPmdldENsYXNzRGVidWcoKTo6YXJyYXlUb1N0cmluZygkYXJyYXksICRsZXZlbCk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHRvT2JqZWN0KCR2YWx1ZSkgewoJCXJldHVybiAJKG9iamVjdCkkdmFsdWU7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCR2YWx1ZSkgewoJCXJldHVybiBzdHJ2YWwoJHZhbHVlKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdG9JbnQoJHZhbHVlKSB7CgkJcmV0dXJuIGludHZhbCgkdmFsdWUpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiB0b0RlY2ltYWwoJHZhbHVlKSB7CgkJcmV0dXJuIHJvdW5kKGZsb2F0dmFsKCR2YWx1ZSksIDIpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBjYWxjdWxhdGlvblBhcmljZURpc2NvdW50KCYkcHJvZHVjdHMsICRzdWJ0b3RhbF9kaXNjb3VudCwgJGZpZWxkcyA9IFsncHJpY2UnXSkgewoJCSRmaWVsZHMgPSAoYXJyYXkpJGZpZWxkczsKCQlpZiAoJHN1YnRvdGFsX2Rpc2NvdW50KSB7CgkJCWZvcmVhY2ggKCRwcm9kdWN0cyBhcyAka2V5ID0+ICRpdGVtKSB7CgkJCQlmb3JlYWNoICgkZmllbGRzIGFzICRmaWVsZCkgewoJCQkJCWlmIChpc3NldCgkaXRlbVskZmllbGRdKSkgewoJCQkJCQkkcHJvZHVjdHNbJGtleV1bJ2Rpc2NvdW50J10gPSAgJHByb2R1Y3RzWyRrZXldWyRmaWVsZF0gKiAkc3VidG90YWxfZGlzY291bnQ7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBjYWxjdWxhdGVUYXhlcygmJGNhcnQsICYkZ3JvdXBfcHJvZHVjdHMsICRhdXRoKSB7CgkJJGNhbGN1bGF0ZWRfZGF0YSA9IGFycmF5KCk7CgoKCQlmb3JlYWNoICgkZ3JvdXBfcHJvZHVjdHMgYXMgJGsgPT4gJHByb2R1Y3QpIHsKCQkJJHRheGVzID0gZm5fZ2V0X3Byb2R1Y3RfdGF4ZXMoJGssICRjYXJ0LCAkZ3JvdXBfcHJvZHVjdHMpOwoKCQkJaWYgKGVtcHR5KCR0YXhlcykpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoaXNzZXQoJHByb2R1Y3RbJ3N1YnRvdGFsJ10pKSB7CgkJCQlpZiAoJHByb2R1Y3RbJ3ByaWNlJ10gPT0gJHByb2R1Y3RbJ3N1YnRvdGFsJ10gJiYgJHByb2R1Y3RbJ2Ftb3VudCddICE9IDEpIHsKCQkJCQkkcHJpY2UgPSBmbl9mb3JtYXRfcHJpY2UoJHByb2R1Y3RbJ3ByaWNlJ10pOwoJCQkJfSBlbHNlIHsKCQkJCQkkcHJpY2UgPSBmbl9mb3JtYXRfcHJpY2UoJHByb2R1Y3RbJ3N1YnRvdGFsJ10gLyAkcHJvZHVjdFsnYW1vdW50J10pOwoJCQkJfQoKCQkJCSRjYWxjdWxhdGVkX2RhdGFbJ1BfJyAuICRrXSA9IGZuX2NhbGN1bGF0ZV90YXhfcmF0ZXMoJHRheGVzLCAkcHJpY2UsICRwcm9kdWN0WydhbW91bnQnXSwgJGF1dGgsICRjYXJ0KTsKCgkJCQkkZ3JvdXBfcHJvZHVjdHNbJGtdWyd0YXhfc3VtbWFyeSddID0gYXJyYXkoJ2luY2x1ZGVkJyA9PiAwLCAnYWRkZWQnID0+IDAsICd0b3RhbCcgPT4gMCk7CgoKCgkJCQlpZiAoIWVtcHR5KCRjYWxjdWxhdGVkX2RhdGFbJ1BfJyAuICRrXSkpIHsKCQkJCQlmb3JlYWNoICgkY2FsY3VsYXRlZF9kYXRhWydQXycgLiAka10gYXMgJF9rID0+ICR2KSB7CgkJCQkJCSRncm91cF9wcm9kdWN0c1ska11bJ3RheGVzJ11bJF9rXSA9ICR2OwoKCQkJCQkJaWYgKCR0YXhlc1skX2tdWydwcmljZV9pbmNsdWRlc190YXgnXSAhPSAnWScpIHsKCQkJCQkJCSRncm91cF9wcm9kdWN0c1ska11bJ3RheF9zdW1tYXJ5J11bJ2FkZGVkJ10gKz0gJHZbJ3RheF9zdWJ0b3RhbCddOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJGdyb3VwX3Byb2R1Y3RzWyRrXVsndGF4X3N1bW1hcnknXVsnaW5jbHVkZWQnXSArPSAkdlsndGF4X3N1YnRvdGFsJ107CgkJCQkJCX0KCQkJCQl9CgkJCQkJJGdyb3VwX3Byb2R1Y3RzWyRrXVsndGF4X3N1bW1hcnknXVsndG90YWwnXSA9ICRncm91cF9wcm9kdWN0c1ska11bJ3RheF9zdW1tYXJ5J11bJ2FkZGVkJ10gKyAkZ3JvdXBfcHJvZHVjdHNbJGtdWyd0YXhfc3VtbWFyeSddWydpbmNsdWRlZCddOwoJCQkJfQoJCQl9CgkJfQoKCgoJCXJldHVybiAkY2FsY3VsYXRlZF9kYXRhOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBhZGREYXRhKCRyZXF1ZXN0LCAkaW5wdXRfbmFtZSwgJGRhdGEpIHsKCQkkaW5wdXRfbmFtZSA9IHN0cl9yZXBsYWNlKFsnWycsICddJ10sIFsnLicsICcnXSwgJGlucHV0X25hbWUpOwoJCSRkYXRhID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJGRhdGEsICR0aGlzLT5nZXRWYWx1ZSgkcmVxdWVzdCwgJGlucHV0X25hbWUsIFtdKSk7CgkJZm5fc2V0X2hvb2soJ21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyX21hbmFnZXJfYWRkX2RhdGEnLCAkcmVxdWVzdCwgJGlucHV0X25hbWUsICRkYXRhKTsKCQlyZXR1cm4gJGRhdGE7Cgl9CglwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udHJvbGxlcnNQZXJtaXNzaW9ucygkY29udHJvbGxlciwgJG1vZGUsICRhcmVhKSB7CgkJJHJ1bl9jb250cm9sbGVycyA9IHRydWU7CgkJaWYgKFNpdGVBcmVhOjppc0FkbWluKCRhcmVhKSkgewoJCQlpZiAoUmVnaXN0cnk6OmdldCgnY29uZmlnLmRlbW9fbW9kZScpID09IHRydWUpIHsKCQkJCSRydW5fY29udHJvbGxlcnMgPSBmbl9jaGVja19wZXJtaXNzaW9ucygkY29udHJvbGxlciwgJG1vZGUsICdkZW1vJyk7CgkJCX0gZWxzZSB7CgkJCQkkcnVuX2NvbnRyb2xsZXJzID0gZm5fY2hlY2tfcGVybWlzc2lvbnMoJGNvbnRyb2xsZXIsICRtb2RlLCAnYWRtaW4nLCAnJywgJF9SRVFVRVNUKTsKCQkJfQoJCX0KCgkJcmV0dXJuICRydW5fY29udHJvbGxlcnM7Cgl9Cglwcml2YXRlIGZ1bmN0aW9uIGRlbGV0ZUNvbnRyb2xsZXJGb3JDb250cm9sbGVycygmJGxpc3QsICR2YWx1ZSkgewoKCQkkaW5kZXggPSBhcnJheV9zZWFyY2goJHZhbHVlLCAkbGlzdCk7CgkJaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKCQl9IGVsc2UgewoJCQl1bnNldCgkbGlzdFskaW5kZXhdKTsKCQl9Cgl9CglwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udHJvbGxlcnNDYXNjYWRlKAoJCSRjb250cm9sbGVyLCAkbW9kZSwgJGFyZWEsICYkY29udHJvbGxlcnNfY2FzY2FkZQoJKSB7CgkJaWYgKFNpdGVBcmVhOjppc0FkbWluKCRhcmVhKSkgewoKCQkJJGNvbnRyb2xsZXJzID0gW107CgoJCQkKCQkJJGFkZF9jb250cm9sbGVycyA9IGlzc2V0KCR0aGlzLT5ydW5fY29udHJvbGxlcnNfc2NoZW1hWyRjb250cm9sbGVyXVskbW9kZV1bJ2FkZF9jb250cm9sbGVycyddKSA/ICR0aGlzLT5ydW5fY29udHJvbGxlcnNfc2NoZW1hWyRjb250cm9sbGVyXVskbW9kZV1bJ2FkZF9jb250cm9sbGVycyddIDogW107CgkJCQoJCQkkaW5pdF9jb250cm9sbGVyID0gJ2luaXQnOwoJCQkkY29udHJvbGxlcnNfY2FzY2FkZSA9IFtdOwoJCQkkY29udHJvbGxlcnNfbGlzdCA9IFskaW5pdF9jb250cm9sbGVyXTsKCQkJJGNvbnRyb2xsZXJfZ3JvdXBzID0gW107CgoJCQlmb3JlYWNoICgkYWRkX2NvbnRyb2xsZXJzIGFzICRrZXkgPT4gJF9jb250cm9sbGVyX3BhcmFtcykgewoJCQkJJHJ1bl9jb250cm9sbGVycyA9ICR0aGlzLT5nZXRDb250cm9sbGVyc1Blcm1pc3Npb25zKCRfY29udHJvbGxlcl9wYXJhbXNbJ2NvbnRyb2xsZXInXSwgJG1vZGUsICRhcmVhKSB8fCAkX2NvbnRyb2xsZXJfcGFyYW1zWydydW5fY29udHJvbGxlcnMnXTsKCQkJCWlmICgkcnVuX2NvbnRyb2xsZXJzKSB7CgkJCQkJJGNvbnRyb2xsZXJzX2xpc3RbXSA9ICRfY29udHJvbGxlcl9wYXJhbXNbJ2NvbnRyb2xsZXInXTsKCQkJCX0KCQkJfQoKCQkJJHJ1bl9jb250cm9sbGVycyA9ICR0aGlzLT5nZXRDb250cm9sbGVyc1Blcm1pc3Npb25zKCRjb250cm9sbGVyLCAkbW9kZSwgJGFyZWEpOwoJCQkKCQkJaWYgKCRydW5fY29udHJvbGxlcnMpIHsKCQkJCSRjb250cm9sbGVyc19saXN0W10gPSAkY29udHJvbGxlcjsKCQkJfQoJCQkkY29udHJvbGxlcnNfbGlzdCA9IGFycmF5X3VuaXF1ZSgkY29udHJvbGxlcnNfbGlzdCk7CgoJCQkkZGVsZXRlX2NvbnRyb2xsZXJzID0gaXNzZXQoJHRoaXMtPnJ1bl9jb250cm9sbGVyc19zY2hlbWFbJGNvbnRyb2xsZXJdWyRtb2RlXVsnZGVsZXRlX2NvbnRyb2xsZXJzJ10pID8gJHRoaXMtPnJ1bl9jb250cm9sbGVyc19zY2hlbWFbJGNvbnRyb2xsZXJdWyRtb2RlXVsnZGVsZXRlX2NvbnRyb2xsZXJzJ10gOiBbXTsKCQkJaWYgKCFlbXB0eSgkZGVsZXRlX2NvbnRyb2xsZXJzWydjb250cm9sbGVyc19saXN0J10pKSB7CgoJCQkJZm9yZWFjaCAoJGRlbGV0ZV9jb250cm9sbGVyc1snY29udHJvbGxlcnNfbGlzdCddIGFzICRfY29udHJvbGxlcl9wYXJhbXMpIHsKCQkJCQkkdGhpcy0+ZGVsZXRlQ29udHJvbGxlckZvckNvbnRyb2xsZXJzKCRjb250cm9sbGVyc19saXN0LCAkX2NvbnRyb2xsZXJfcGFyYW1zWydjb250cm9sbGVyJ10pOwoJCQkJfQoJCQkJdW5zZXQoJGRlbGV0ZV9jb250cm9sbGVyc1snY29udHJvbGxlcnNfbGlzdCddKTsKCQkJfQoKCQkJZm9yZWFjaCAoJGNvbnRyb2xsZXJzX2xpc3QgYXMgJGN0cmwpIHsKCQkJCSRjb3JlX2NvbnRyb2xsZXJzID0gZm5faW5pdF9jb3JlX2NvbnRyb2xsZXJzKCRjdHJsKTsKCQkJCWxpc3QoJGFkZG9uX2NvbnRyb2xsZXJzKSA9IGZuX2luaXRfYWRkb25fY29udHJvbGxlcnMoJGN0cmwpOwoKCQkJCWlmICgoY291bnQoJGNvcmVfY29udHJvbGxlcnMpICsgY291bnQoJGFkZG9uX2NvbnRyb2xsZXJzKSkgPiAxKSB7CgkJCQkJdGhyb3cgbmV3IERldmVsb3BlckV4Y2VwdGlvbignRHVwbGljYXRlIGNvbnRyb2xsZXIgJyAuICRjb250cm9sbGVyIC4gdmFyX2V4cG9ydChhcnJheV9tZXJnZSgkY29yZV9jb250cm9sbGVycywgJGFkZG9uX2NvbnRyb2xsZXJzKSwgdHJ1ZSkpOwoJCQkJfQoKCQkJCSRjb3JlX3ByZV9jb250cm9sbGVycyA9IGZuX2luaXRfY29yZV9jb250cm9sbGVycygkY3RybCwgR0VUX1BSRV9DT05UUk9MTEVSUyk7CgkJCQkkY29yZV9wb3N0X2NvbnRyb2xsZXJzID0gZm5faW5pdF9jb3JlX2NvbnRyb2xsZXJzKCRjdHJsLCBHRVRfUE9TVF9DT05UUk9MTEVSUyk7CgoJCQkJbGlzdCgkYWRkb25fcHJlX2NvbnRyb2xsZXJzKSA9IGZuX2luaXRfYWRkb25fY29udHJvbGxlcnMoJGN0cmwsIEdFVF9QUkVfQ09OVFJPTExFUlMpOwoJCQkJbGlzdCgkYWRkb25fcG9zdF9jb250cm9sbGVycywgJGFkZG9ucykgPSBmbl9pbml0X2FkZG9uX2NvbnRyb2xsZXJzKCRjdHJsLCBHRVRfUE9TVF9DT05UUk9MTEVSUyk7CgoJCQkJCgkJCQlpZiAoIWVtcHR5KCRhZGRvbl9jb250cm9sbGVycykpIHsKCQkJCQkkYWRkb25fcG9zdF9jb250cm9sbGVycyA9IGZuX3Jlb3JkZXJfcG9zdF9jb250cm9sbGVycygkYWRkb25fcG9zdF9jb250cm9sbGVycywgJGFkZG9uX2NvbnRyb2xsZXJzWzBdKTsKCQkJCX0KCgkJCQkkYXJlYV9uYW1lID0gZm5fZ2V0X2FyZWFfbmFtZSgkYXJlYSk7CgoJCQkJJGNvcmVfcGF0aCA9IFJlZ2lzdHJ5OjpnZXQoJ2NvbmZpZy5kaXIucm9vdCcpIC4gJy9hcHAvJzsKCQkJCSRhZGRvbl9kaXIgPSBSZWdpc3RyeTo6Z2V0KCdjb25maWcuZGlyLmFkZG9ucycpOwoJCQkJJGNvbnRyb2xsZXJzX2tleXMgPSBbXTsKCQkJCWZvcmVhY2ggKFsnYWRkb25fcHJlX2NvbnRyb2xsZXJzJyA9PiAkYWRkb25fZGlyLCAnYWRkb25fY29udHJvbGxlcnMnID0+ICRhZGRvbl9kaXIsICdhZGRvbl9wb3N0X2NvbnRyb2xsZXJzJyA9PiAkYWRkb25fZGlyLCAnY29yZV9wcmVfY29udHJvbGxlcnMnID0+ICRjb3JlX3BhdGgsICdjb3JlX2NvbnRyb2xsZXJzJyA9PiAkY29yZV9wYXRoLCAnY29yZV9wb3N0X2NvbnRyb2xsZXJzJyA9PiAkY29yZV9wYXRoXSBhcyAkdmFyID0+ICRwYXRoKSB7CgkJCQkJZm9yZWFjaCAoJCR2YXIgYXMgJGtleSA9PiAkY29udHJvbGxlcl9wYXRoKSB7CgoKCQkJCQkJJGNvbnRyb2xsZXJzX2tleXNbJHZhcl1bc3RyX3JlcGxhY2UoJHBhdGgsICcnLCAkY29udHJvbGxlcl9wYXRoKV0gPSAkY29udHJvbGxlcl9wYXRoOwoJCQkJCX0KCQkJCX0KCgkJCQlmb3JlYWNoICgkZGVsZXRlX2NvbnRyb2xsZXJzIGFzICR2YXIgPT4gJF9jb250cm9sbGVycykgewoJCQkJCWZvcmVhY2ggKCRfY29udHJvbGxlcnMgYXMgJGtleSA9PiAkX2NvbnRyb2xsZXJfcGFyYW1zKSB7CgkJCQkJCWlmIChpc3NldCgkY29udHJvbGxlcnNfa2V5c1skdmFyXVskX2NvbnRyb2xsZXJfcGFyYW1zWydjb250cm9sbGVyJ11dKSkgewoJCQkJCQkJJHRoaXMtPmRlbGV0ZUNvbnRyb2xsZXJGb3JDb250cm9sbGVycygkJHZhciwgJGNvbnRyb2xsZXJzX2tleXNbJHZhcl1bJF9jb250cm9sbGVyX3BhcmFtc1snY29udHJvbGxlciddXSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgoJCQkJJGRpc3BhdGNoX2NvbnRyb2xsZXJzID0gYXJyYXlfbWVyZ2UoCgkJCQkJJGFkZG9uX3ByZV9jb250cm9sbGVycywKCQkJCQkkY29yZV9wcmVfY29udHJvbGxlcnMsCgkJCQkJJGNvcmVfY29udHJvbGxlcnMsCgkJCQkJJGFkZG9uX2NvbnRyb2xsZXJzLAoJCQkJCSRjb3JlX3Bvc3RfY29udHJvbGxlcnMsCgkJCQkJJGFkZG9uX3Bvc3RfY29udHJvbGxlcnMKCQkJCSk7CgoJCQkJZm9yZWFjaCAoJGRpc3BhdGNoX2NvbnRyb2xsZXJzIGFzICRjb250cm9sbGVyX3BhdGgpIHsKCQkJCQkkY29udHJvbGxlcl9ncm91cHNbJGNvbnRyb2xsZXJfcGF0aF0gPSAkY3RybDsKCQkJCX0KCgkJCQkkY29udHJvbGxlcnNfY2FzY2FkZSA9IGFycmF5X21lcmdlKCRjb250cm9sbGVyc19jYXNjYWRlLCAkZGlzcGF0Y2hfY29udHJvbGxlcnMpOwoJCQkJaWYgKGVtcHR5KCRjb250cm9sbGVyc19jYXNjYWRlKSkgewoJCQkJCXRocm93IG5ldyBEZXZlbG9wZXJFeGNlcHRpb24oIk5vIGNvbnRyb2xsZXJzIGZvcjogJGN0cmwiKTsKCQkJCX0KCQkJfQoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gcnVuQ29udHJvbGxlcnNDYXNjYWRlKCRjb250cm9sbGVyLCAkbW9kZSwgJGFyZWEsICRjb250cm9sbGVyc19jYXNjYWRlLCAkcnVuX2NvbnRyb2xsZXJzKSB7CgkJJGFjdGlvbiA9IGVtcHR5KCRhY3Rpb24pID8gUmVnaXN0cnk6OmdldCgncnVudGltZS5hY3Rpb24nKSA6ICRhY3Rpb247CgkJJGRpc3BhdGNoX2V4dHJhID0gZW1wdHkoJGRpc3BhdGNoX2V4dHJhKSA/IFJlZ2lzdHJ5OjpnZXQoJ3J1bnRpbWUuZGlzcGF0Y2hfZXh0cmEnKSA6ICRkaXNwYXRjaF9leHRyYTsKCQkkc3RhdHVzID0gQ09OVFJPTExFUl9TVEFUVVNfTk9fUEFHRTsKCgkJZm9yZWFjaCAoJGNvbnRyb2xsZXJzX2Nhc2NhZGUgYXMgJGl0ZW0pIHsKCQkJJF9yZXMgPSBmbl9ydW5fY29udHJvbGxlcigkaXRlbSwgJGNvbnRyb2xsZXIsICRtb2RlLCAkYWN0aW9uLCAkZGlzcGF0Y2hfZXh0cmEpOyAKCgkJCSRjbnRyX3N0YXR1cyA9ICFlbXB0eSgkX3Jlc1swXSkgPyAkX3Jlc1swXSA6IENPTlRST0xMRVJfU1RBVFVTX09LOwoJCQkkdXJsID0gIWVtcHR5KCRfcmVzWzFdKSA/ICRfcmVzWzFdIDogJyc7CgkJCSRleHRlcm5hbCA9ICFlbXB0eSgkX3Jlc1syXSkgPyAkX3Jlc1syXSA6IGZhbHNlOwoJCQkkcGVybWFuZW50ID0gIWVtcHR5KCRfcmVzWzNdKSA/ICRfcmVzWzNdIDogZmFsc2U7CgoJCQkKCQkJaWYgKAoJCQkJJHJ1bl9jb250cm9sbGVycwoJCQkJJiYgKAoJCQkJCSRzdGF0dXMgIT09IENPTlRST0xMRVJfU1RBVFVTX05PX0NPTlRFTlQgJiYgJHN0YXR1cyAhPT0gQ09OVFJPTExFUl9TVEFUVVNfREVOSUVECgkJCQkJfHwgJGNudHJfc3RhdHVzICE9PSBDT05UUk9MTEVSX1NUQVRVU19PSwoJCQkJKQoJCQkpIHsKCQkJCSRzdGF0dXMgPSAkY250cl9zdGF0dXM7CgkJCX0KCgkJCWlmICgkc3RhdHVzID09PSBDT05UUk9MTEVSX1NUQVRVU19PSyAmJiAhZW1wdHkoJHVybCkpIHsKCQkJCSRyZWRpcmVjdF91cmwgPSAkdXJsOwoJCQl9IGVsc2VpZiAoJHN0YXR1cyA9PT0gQ09OVFJPTExFUl9TVEFUVVNfUkVESVJFQ1QgJiYgIWVtcHR5KCR1cmwpKSB7CgkJCQkkcmVkaXJlY3RfdXJsID0gJHVybDsKCQkJCWJyZWFrOwoJCQl9IGVsc2VpZiAoJHN0YXR1cyA9PT0gQ09OVFJPTExFUl9TVEFUVVNfREVOSUVEIHx8ICRzdGF0dXMgPT09IENPTlRST0xMRVJfU1RBVFVTX05PX1BBR0UpIHsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoJcHVibGljIGZ1bmN0aW9uIGNoZWNrUnVuQ29udHJvbGxlcnMoJGNvbnRyb2xsZXIsICRtb2RlLCAkYXJlYSwgJiRjb250cm9sbGVyc19jYXNjYWRlKSB7CgkJCgkJaWYgKGlzc2V0KCR0aGlzLT5ydW5fY29udHJvbGxlcnNfc2NoZW1hWyRjb250cm9sbGVyXVskbW9kZV0pICYmIFNpdGVBcmVhOjppc0FkbWluKCRhcmVhKSkgewoKCQkJJHRoaXMtPmdldENvbnRyb2xsZXJzQ2FzY2FkZSgkY29udHJvbGxlciwgJG1vZGUsICRhcmVhLCAkY29udHJvbGxlcnNfY2FzY2FkZSk7CgkJCQoJCQlpZiAoaXNzZXQoJHRoaXMtPnJ1bl9jb250cm9sbGVyc19zY2hlbWFbJGNvbnRyb2xsZXJdWyRtb2RlXVsncnVuX2NvbnRyb2xsZXJzJ10pKSB7CgoKCQkJCWZvcmVhY2ggKCR0aGlzLT5ydW5fY29udHJvbGxlcnNfc2NoZW1hWyRjb250cm9sbGVyXVskbW9kZV1bJ3J1bl9jb250cm9sbGVycyddIGFzICRfY29udHJvbGxlcl9wYXJhbXMpIHsKCQkJCQkkcnVuX2NvbnRyb2xsZXJzX2Nhc2NhZGUgPSBbXTsKCgoKCQkJCQkkcnVuX2NvbnRyb2xsZXJzID0gJHRoaXMtPmdldENvbnRyb2xsZXJzUGVybWlzc2lvbnMoJF9jb250cm9sbGVyX3BhcmFtc1snY29udHJvbGxlciddLCAkX2NvbnRyb2xsZXJfcGFyYW1zWydtb2RlJ10sICRhcmVhKSB8fCAkX2NvbnRyb2xsZXJfcGFyYW1zWydydW5fY29udHJvbGxlcnMnXTsKCQkJCQlpZiAoJHJ1bl9jb250cm9sbGVycykgewoJCQkJCQkkdGhpcy0+Z2V0Q29udHJvbGxlcnNDYXNjYWRlKCRfY29udHJvbGxlcl9wYXJhbXNbJ2NvbnRyb2xsZXInXSwgJF9jb250cm9sbGVyX3BhcmFtc1snbW9kZSddLCAkYXJlYSwgJHJ1bl9jb250cm9sbGVyc19jYXNjYWRlKTsKCQkJCQkJJHRoaXMtPnJ1bkNvbnRyb2xsZXJzQ2FzY2FkZSgkX2NvbnRyb2xsZXJfcGFyYW1zWydjb250cm9sbGVyJ10sICRfY29udHJvbGxlcl9wYXJhbXNbJ21vZGUnXSwgJGFyZWEsICRydW5fY29udHJvbGxlcnNfY2FzY2FkZSwgJHJ1bl9jb250cm9sbGVycyk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBhZGRBZGRvbnNNZW51KCYkc2NoZW1hLCAkYWRkb25zID0gW10pIHsKCQkkc2V0dGluZ3MgPSBmbl9tYXVyaXN3ZWJfYWRkb25fbWFuYWdlcl9nZXRfYWRkb25fc2V0dGluZ3MoKTsKCQkkYWRkb25zX2xpc3QgPSAkdGhpcy0+Z2V0Q2xhc3NEYXRhTWFuYWdlcignbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInKS0+Z2V0QWRkb25zTGlzdCgpOwoJCSRhZGRvbnMgPSAkdGhpcy0+Z2V0Q2xhc3NEYXRhTWFuYWdlcignbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInKS0+Z2V0QWRkb25zKCk7CgkJCgkJaWYgKGlzc2V0KCRzZXR0aW5nc1snYWRkX21lbnUnXSkgJiYgWWVzTm86OnRvQm9vbCgkc2V0dGluZ3NbJ2FkZF9tZW51J10pICYmICFkZWZpbmVkKCdNQVVSSVNXRUJfQURET05fTUFOQUdFUl9NRU5VJykpIHsKCQkJZm5fZGVmaW5lKCdNQVVSSVNXRUJfQURET05fTUFOQUdFUl9NRU5VJyx0cnVlKTsKCQkJJHNjaGVtYVsnY2VudHJhbCddWydtYXVyaXN3ZWJfYWRkb25fbWFuYWdlciddID0gWwoJCQkJJ2F0dHJzJyA9PiBhcnJheSgKCQkJCQknY2xhc3MnID0+ICdpcy1hZGRvbicKCQkJCSksCgkJCQkncG9zaXRpb24nID0+JzEwMDAwJywKCQkJCSd0aXRsZSc9Pl9fKCdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlci5tYWluX21lbnVfbmFtZScpLAoJCQkJJ2hyZWYnID0+ICAnYWRkb25zLnVwZGF0ZT9zdXBwbGllcltdPU1BVVJJU1dFQicsCgkJCQknaWNvbicgPT4gJ2FkZG9ucy9tYXVyaXN3ZWJfYWRkb25fbWFuYWdlci9pY29ucy9pY29uLnN2ZycsCgkJCQkKCQkJXTsKCQkJJGFsbG93ZWRfdXBkYXRlID0gZm5fY2hlY2tfdmlld19wZXJtaXNzaW9ucygnYWRkb25zLnVwZGF0ZScpOwoJCQlmb3JlYWNoICgkYWRkb25zX2xpc3QgYXMgJGtleSA9PiAkYWRkb24pIHsKCQkJCWlmICgkYWRkb25zWyRhZGRvbl1bJ3N0YXR1cyddID09PSBPYmplY3RTdGF0dXNlczo6QUNUSVZFICYmIGZuX21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyX2NoZWNrX3ZhbGlkKCRhZGRvbikpIHsKCQkJCQlpZiAoJG1lbnVfaXRlbXMgPSBmbl9nZXRfbWVudV9zY2hlbWFfZm9yX2FkZG9uKCRhZGRvbikpIHsKCQkJCQkJJGl0ZW1zID0gZm5fYXR0YWNoX2FkZG9uX21lbnVfaXRlbV9wYXJlbnRzKCRtZW51X2l0ZW1zKTsKCQkJCQkJCgkJCQkJCWlmKCRhbGxvd2VkX3VwZGF0ZSkKCQkJCQkJewoJCQkJCQkJJHNjaGVtYVsnY2VudHJhbCddWydtYXVyaXN3ZWJfYWRkb25fbWFuYWdlciddWydpdGVtcyddWyRhZGRvbl0gPSBbCgkJCQkJCQkJJ2F0dHJzJyA9PiBhcnJheSgKCQkJCQkJCQkJJ2NsYXNzJyA9PiAnaXMtYWRkb24nCgkJCQkJCQkJKSwKCQkJCQkJCQkncG9zaXRpb24nID0+JzEwMCcsCgkJCQkJCQkJJ2hyZWYnID0+ICdhZGRvbnMudXBkYXRlP2FkZG9uPScgLiAkYWRkb24sCgkJCQkJCQkJJ3N1Yml0ZW1zJyA9PiBhcnJheSgKCQkJCQkJCQkJJ3NldHRpbmdzJyA9PiBhcnJheSgKCQkJCQkJCQkJCSdocmVmJyA9PiAgJ2FkZG9ucy51cGRhdGU/YWRkb249JyAuICRhZGRvbiwKCQkJCQkJCQkJKSwKCQkJCQkJCQkpLAoJCQkJCQkJXTsKCQkJCQkKCQkJCQkJfQoJCQkJCQllbHNlaWYoIWVtcHR5KCRpdGVtcykpCgkJCQkJCXsKCQkJCQkJCSRzY2hlbWFbJ2NlbnRyYWwnXVsnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInXVsnaXRlbXMnXVskYWRkb25dID0gcmVzZXQoJGl0ZW1zKTsKCQkJCQkJfQoJCQkJCQkKCQkJCQkJZm9yZWFjaCAoJGl0ZW1zIGFzICRrZXkgPT4gJGl0ZW0pIHsKCQkJCQkJCSRzY2hlbWFbJ2NlbnRyYWwnXVsnbWF1cmlzd2ViX2FkZG9uX21hbmFnZXInXVsnaXRlbXMnXVskYWRkb25dWydzdWJpdGVtcyddWyRpdGVtWydpZCddXSA9IGFycmF5KAoJCQkJCQkJCSdocmVmJyA9PiAgJGtleSwKCQkJCQkJCSk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJCgkJCQl9CgkJCX0KCgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBkYXRlRm9ybWF0KCR0aW1lc3RhbXAsICRmb3JtYXQgPSAnJWIgJWUsICVZJykgewoJCXJldHVybiAgIGZuX21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyX2RhdGVfZm9ybWF0KCR0aW1lc3RhbXAsICRmb3JtYXQpOwoJfQoKfQo="));
?>
Function Calls
base64_decode | 1 |
Stats
MD5 | c033b36a7d1d154cc02c5d702af51ed3 |
Eval Count | 1 |
Decode Time | 75 ms |