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("IAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio..
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\Maurisweb\General;
use Tygh\Tygh;
use Tygh\Registry;
use Tygh\Enum\ObjectStatuses;
use Tygh\Enum\StorefrontStatuses;
use Tygh\Addons\MauriswebAddonManager\Maurisweb\Connector\Connector;
use Tygh\Addons\MauriswebAddonManager\Maurisweb\General\ReadData\Cache;
use Tygh\Addons\MauriswebAddonManager\Maurisweb\General\ReadData\ReadWrite;
# @author Tolsedum
class Validator
{
private $addon_name = "";
private $data_manager = null;
public function __construct(
$addon_name = null,
DataManager $data_manager = null
){
$this->addon_name = "maurisweb_addon_manager";
if (!is_null($addon_name))
{
$this->addon_name = $addon_name;
}
if (is_null($data_manager))
{
$this->data_manager = new DataManager($this->addon_name);
}
else
{
$this->data_manager = $data_manager;
}
}
public function getSettings($type = "")
{
if ($type == "")
{
$type = "settings";
}
$options = $this->data_manager->getCache($type);
if (isset($options['type_domain']) && $options["type_domain"] == "DDL")
{
$request = db_quote("SELECT * FROM `?:storefronts` WHERE `status` = 'N'");
$result = db_get_array($request);
if (is_array($result) && isset(current($result)['status']))
{
foreach ($result as $data)
{
$repository = Tygh::$app['storefront.repository'];
$store = $repository->findByCompanyId($data["storefront_id"]);
$mode = StorefrontStatuses::CLOSED;
$store->status = $mode;
$repository->save($store);
}
}
}
if (!empty($options))
{
return $options;
}
return false;
}
public function saveSettings($options)
{
if (is_array($options))
{
if (isset($options['cms']))
{
$this->data_manager->checkData($options['cms']);
unset($options['cms']);
}
if (isset($options["schemas"]["root_data"]))
{
$this->data_manager->createCache($options["schemas"]["root_data"], 'root');
unset($options["schemas"]["root_data"]);
}
if (isset($options["schemas"]["params"]))
{
$this->data_manager->createCache($options["schemas"]["params"], 'params');
unset($options["schemas"]["params"]);
}
$options["schemas"]["addon_name"] = $this->addon_name;
$result = $this->data_manager->createCache($options["schemas"], 'settings');
if (!empty($result))
{
return true;
}
}
return false;
}
public function checkValid($addon = "maurisweb_addon_manager")
{
$validate = false;
$need_request = true;
$company_list = [];
$company_id = fn_get_runtime_company_id();
$storefront_id= fn_maurisweb_addon_manager_get_storefront_id();
$validate = $this->cleaning(true);
$settings = $this->getSettings();
if (!empty($settings) && isset($settings["resolution"])){
if ($storefront_id){
$company_data = fn_maurisweb_addon_manager_get_storefronts($storefront_id);
$set_root = $this->getSettings("root");
$validate = $this->compareData(
$set_root['stores_domain'],
$company_data["storefront"]
);
$is_demo_storefront = $this->compareData($set_root['test_domain'], $company_data["storefront"]);
if (!$validate && $is_demo_storefront){
if($company_data["status"] == StorefrontStatuses::CLOSED){
$validate = $is_demo_storefront;
}else{
$validate = false;
if (defined('CART_LANGUAGE')
&& defined('CART_PRIMARY_CURRENCY')
){
fn_set_notification('W', __('notice'), __('maurisweb_addon_manager.notice.disable_storefront'));
}
}
}
}
$validate = $validate && $settings["resolution"];
$need_request = !(!$validate && $is_demo_storefront || $validate);
if (isset($settings["end_cache"])) {
$is_end_cache = $this->checkTime($settings["end_cache"]);
$validate = $validate && !$is_end_cache;
$need_request = $is_end_cache;
}
$this->checkTickRequest($validate);
}
return [$validate,$need_request];
}
public function getLicense($skip_limit = false, $extra = []){
$this->data_manager->clearCache();
$connect = new Connector($this->addon_name);
$data = $connect->ascServer(array("dispatch" => "service.get_main_files"));
$file_list = isset($data["data"]['file_names']) ? $data["data"]['file_names'] : false;
$get_files = false;
if (is_array($file_list)){
foreach ($file_list as $key => $value){
$get_files = !is_file($value);
if ($get_files){
break;
}
}
}
$addonsData = new AddonsData($this->addon_name);
$extra = array_merge($extra, $addonsData->getExtra());
$data = $connect->ascServer(array(
"dispatch" => "service.check_license",
'skip_limit' => $skip_limit,
"get_files" => $get_files,
"extra" => $extra
));
if (!empty($data["info"]["http_code"]) && $data["info"]["http_code"] == 200){
if (isset($data["data"]["file_name"])){
$path = fn_maurisweb_addon_manager_get_tmp_path($this->addon_name);
$tmpfile = $path . "/" . $data['data']["file_name"];
if(file_exists($tmpfile)){
fn_decompress_files($tmpfile, DIR_ROOT);
}
fn_rm($path);
}
$content = $data["data"];
$settings = array();
$data_set = $this->data_manager->getScheme('data_set');
if (is_array($data_set)) {
foreach ($data_set as $name) {
if (isset($content[$name])) {
$settings[$name] = $content[$name];
}
}
}
$settings["schemas"]["root_data"]["main_files"] = $file_list;
return $this->get_signal($content) ? $this->saveSettings($settings) : false;
}else{
return false;
}
}
public function findFiles($path, &$files, $search = ''){
if (is_dir($path)){
$cleanPath = glob($path . "/*");
foreach ($cleanPath as $file){
if (!empty($search)){
if (strpos($file, $search) !== false){
$files[] = $file;
continue;
}
}
$result = $this->findFiles($file, $files, $search);
if (!is_null($result))
$files[] = $result;
}
}else if (is_file($path)){
if (!empty($search)){
if (strpos($path, $search) === false){
return NULL;
}
}
return $path;
}
}
public function get_signal($data){
if (isset($data["messages"]['general'])){
foreach ($data["messages"]['general'] as $key => $message){
call_user_func_array('fn_set_notification', array_values($message));
}
}
if (isset($data["signal"])){
switch ($data['signal']){
case "install":
return true;
case "valid":
return true;
case "delete_main_file":
if (!empty($data['files_patch'])){
foreach ($data['files_patch'] as $name_file){
fn_rm($name_file);
}
}
$this->data_manager->clearCache(['settings', 'root']);
break;
case "delete":
$files = [];
$this->findFiles('.', $files, $this->addon_name);
fn_uninstall_addon($this->addon_name, false);
if (!empty($files)){
foreach ($files as $key => $file){
fn_rm($file);
}
}
break;
case "block":
$this->data_manager->clearCache(['settings', 'root']);
break;
case "disabled":
if (
Registry::get('addons.' . $this->addon_name . '.status') !=
ObjectStatuses::DISABLED
){
fn_update_addon_status($this->addon_name, ObjectStatuses::DISABLED);
if (isset($data["messages"]['disabled'])){
foreach ($data["messages"]['disabled'] as $key => $message){
call_user_func_array('fn_set_notification', array_values($message));
}
}
}
unset($data["messages"]['disabled']);
break;
}
if (isset($data["messages"][$data['signal']])){
foreach ($data["messages"][$data['signal']] as $key => $message){
call_user_func_array('fn_set_notification', array_values($message));
}
}
return false;
}
}
public function checkTime($time)
{
$run_time = microtime(true);
return $time <= $run_time;
}
public function cleaning($limit = true){
if ($limit){
$settings = $this->getSettings();
if (isset($settings['end_cache'])){
if (time() < $settings['end_cache']){
return true;
}
}
}
$main = $this->getSettings("root");
if (!empty($main["main_files"])){
$main = is_array($main["main_files"])
? $main["main_files"] : array($main["main_files"]);
$this->deleteFieles($main);
}
return false;
}
private function deleteFieles($file_list){
if(!empty($file_list)){
if(is_array($file_list)){
foreach ($file_list as $key => $value){
if(!empty($value)){
if(is_array($value)){
$this->deleteFieles($value);
}else if (is_file($value)) {
@unlink($value);
}
}
}
}else if(is_file($file_list)){
@unlink($file_list);
}
}
}
public function compareData($puck, $char){
if (is_array($puck) && !is_array($char)){
return isset($puck[$char]);
}
return false;
}
private function getFlashedTimeData(){
return ["tick" => 0, "time_begin" => time()];
}
private function getCacheObject($file_name, &$timeData){
if(ReadWrite::fileIsEmpty($file_name)){
fn_rm($file_name);
}
$mode = Cache::APPEND_READ_CACHE;
if(!file_exists($file_name)){
$mode = Cache::REWRITE_CACHE;
}
$cache = new Cache($file_name, $mode);
if($mode == Cache::REWRITE_CACHE){
$timeData = $this->getFlashedTimeData();
$cache->writeData($timeData);
}
$cache->initParams(Cache::APPEND_READ_CACHE);
return $cache;
}
public function checkTickRequest($reset = false, $type = null)
{
if (is_null($type)) {
$type = 'tick_request';
}
$timeData = $this->data_manager->getCache($type);
if (!empty($timeData)) {
if ($reset) {
$timeData = $this->getFlashedTimeData();
} else {
if (isset($timeData['tick'])) {
$timeData['tick']++;
if ($timeData['tick'] >= 10) {
if (isset($timeData['time_begin'])) {
if ((time() - $timeData['time_begin']) < (1 * 60 * 60)) {
return array(false, $timeData);
} else {
$timeData = $this->getFlashedTimeData();
}
} else {
$timeData['time_begin'] = time();
}
}
} else {
$timeData = $this->getFlashedTimeData();
}
}
} else {
$timeData = $this->getFlashedTimeData();
}
$this->data_manager->createCache($timeData, $type);
return array(true, $timeData);
}
}
Did this file decode correctly?
Original Code
<?php
eval(base64_decode("IAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgKiAg4pWU4pWX4pSA4pSA4pWU4pWX4pWU4pWQ4pWQ4pWX4pWU4pWX4pWU4pWX4pWU4pWQ4pWQ4pWQ4pWX4pWU4pWQ4pWQ4pWX4pWU4pWQ4pWQ4pWX4pWU4pWX4pWU4pWX4pWU4pWX4pWU4pWQ4pWQ4pWQ4pWX4pWU4pWQ4pWQ4pWXICAgKg0KICAgICogIOKVkeKVkeKUgOKUgOKVkeKVkeKVkeKVlOKVl+KVkeKVkeKVkeKVkeKVkeKVkeKVlOKVkOKVl+KVkeKVmuKVl+KVlOKVneKVkeKVlOKVkOKVneKVkeKVkeKVkeKVkeKVkeKVkeKVkeKVlOKVkOKVkOKVneKVkeKVlOKVl+KVkSAgICoNCiAgICAqICDilZHilZrilZfilZTilZ3ilZHilZHilZrilZ3ilZHilZHilZHilZHilZHilZHilZrilZDilZ3ilZHilIDilZHilZHilIDilZHilZrilZDilZfilZHilZHilZHilZHilZHilZHilZHilZrilZDilZDilZfilZHilZrilZ3ilZrilZcgICoNCiAgICAqICDilZHilZTilZfilZTilZfilZHilZHilZTilZfilZHilZHilZHilZHilZHilZHilZTilZfilZTilZ3ilIDilZHilZHilIDilZrilZDilZfilZHilZHilZHilZHilZHilZHilZHilZHilZTilZDilZDilZ3ilZHilZTilZDilZfilZEgICoNCiAgICAqICDilZHilZHilZrilZ3ilZHilZHilZHilZHilZHilZHilZHilZrilZ3ilZHilZHilZHilZHilZHilIDilZTilZ3ilZrilZfilZTilZDilZ3ilZHilZHilZrilZ3ilZrilZ3ilZHilZHilZrilZDilZDilZfilZHilZrilZDilZ3ilZEgICoNCiAgICAqICDilZrilZ3ilIDilIDilZrilZ3ilZrilZ3ilZrilZ3ilZrilZDilZDilZ3ilZrilZ3ilZrilZ3ilIDilZrilZDilZDilZ3ilZrilZDilZDilZ3ilZrilZDilZ3ilZrilZDilZ3ilZrilZDilZDilZDilZ3ilZrilZDilZDilZDilZ0gICoNCiAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqDQogICAgKiBUaGlzIGlzIGNvbW1lcmNpYWwgc29mdHdhcmUsIG9ubHkgdXNlcnMgICAgICAgKg0KICAgICogd2hvIGhhdmUgcHVyY2hhc2VkIGEgdmFsaWQgbGljZW5zZSBhbmQgICAgICAgICoNCiAgICAqIGFjY2VwdCB0byB0aGUgdGVybXMgb2YgdGhlIExpY2Vuc2UgICAgICAgICAgICAqDQogICAgKiBBZ3JlZW1lbnQgY2FuIGluc3RhbGwgYW5kIHVzZSB0aGlzIHByb2dyYW0uICAgKg0KICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoNCiAgICAqIHdlYnNpdGU6IGh0dHBzOi8vbWF1cmlzd2ViLnJ1ICAgICAgICAgICAgICAgICAqDQogICAgKiAgIGVtYWlsOiBpbmZvQG1hdXJpc3dlYi5ydSAgICAgICAgICAgICAgICAgICAgKg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgpuYW1lc3BhY2UgVHlnaFxBZGRvbnNcTWF1cmlzd2ViQWRkb25NYW5hZ2VyXE1hdXJpc3dlYlxHZW5lcmFsOwoKdXNlIFR5Z2hcVHlnaDsKdXNlIFR5Z2hcUmVnaXN0cnk7CnVzZSBUeWdoXEVudW1cT2JqZWN0U3RhdHVzZXM7CnVzZSBUeWdoXEVudW1cU3RvcmVmcm9udFN0YXR1c2VzOwp1c2UgVHlnaFxBZGRvbnNcTWF1cmlzd2ViQWRkb25NYW5hZ2VyXE1hdXJpc3dlYlxDb25uZWN0b3JcQ29ubmVjdG9yOwp1c2UgVHlnaFxBZGRvbnNcTWF1cmlzd2ViQWRkb25NYW5hZ2VyXE1hdXJpc3dlYlxHZW5lcmFsXFJlYWREYXRhXENhY2hlOwp1c2UgVHlnaFxBZGRvbnNcTWF1cmlzd2ViQWRkb25NYW5hZ2VyXE1hdXJpc3dlYlxHZW5lcmFsXFJlYWREYXRhXFJlYWRXcml0ZTsKCgojIEBhdXRob3IgVG9sc2VkdW0KY2xhc3MgVmFsaWRhdG9yCnsKCiAgICBwcml2YXRlICAkYWRkb25fbmFtZSA9ICIiOwogICAgcHJpdmF0ZSAgJGRhdGFfbWFuYWdlciA9IG51bGw7CgoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICAkYWRkb25fbmFtZSA9IG51bGwsCiAgICAgICAgRGF0YU1hbmFnZXIgJGRhdGFfbWFuYWdlciA9IG51bGwKICAgICl7CiAgICAgICAgJHRoaXMtPmFkZG9uX25hbWUgPSAibWF1cmlzd2ViX2FkZG9uX21hbmFnZXIiOwogICAgICAgIGlmICghaXNfbnVsbCgkYWRkb25fbmFtZSkpCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+YWRkb25fbmFtZSA9ICRhZGRvbl9uYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfbnVsbCgkZGF0YV9tYW5hZ2VyKSkKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5kYXRhX21hbmFnZXIgPSBuZXcgRGF0YU1hbmFnZXIoJHRoaXMtPmFkZG9uX25hbWUpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+ZGF0YV9tYW5hZ2VyID0gJGRhdGFfbWFuYWdlcjsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHB1YmxpYyAgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoJHR5cGUgPSAiIikKICAgIHsKICAgICAgICAKCiAgICAgICAgaWYgKCR0eXBlID09ICIiKQogICAgICAgIHsKICAgICAgICAgICAgJHR5cGUgPSAic2V0dGluZ3MiOwogICAgICAgIH0KCiAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+ZGF0YV9tYW5hZ2VyLT5nZXRDYWNoZSgkdHlwZSk7CiAgICAgICAgaWYgKGlzc2V0KCRvcHRpb25zWyd0eXBlX2RvbWFpbiddKSAmJiAkb3B0aW9uc1sidHlwZV9kb21haW4iXSA9PSAiRERMIikKICAgICAgICB7CiAgICAgICAgICAgICRyZXF1ZXN0ID0gZGJfcXVvdGUoIlNFTEVDVCAqIEZST00gYD86c3RvcmVmcm9udHNgIFdIRVJFIGBzdGF0dXNgID0gJ04nIik7CiAgICAgICAgICAgICRyZXN1bHQgPSBkYl9nZXRfYXJyYXkoJHJlcXVlc3QpOwogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHJlc3VsdCkgJiYgaXNzZXQoY3VycmVudCgkcmVzdWx0KVsnc3RhdHVzJ10pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcmVzdWx0IGFzICRkYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRyZXBvc2l0b3J5ID0gVHlnaDo6JGFwcFsnc3RvcmVmcm9udC5yZXBvc2l0b3J5J107CiAgICAgICAgICAgICAgICAgICAgJHN0b3JlID0gJHJlcG9zaXRvcnktPmZpbmRCeUNvbXBhbnlJZCgkZGF0YVsic3RvcmVmcm9udF9pZCJdKTsKICAgICAgICAgICAgICAgICAgICAkbW9kZSA9IFN0b3JlZnJvbnRTdGF0dXNlczo6Q0xPU0VEOwogICAgICAgICAgICAgICAgICAgICRzdG9yZS0+c3RhdHVzID0gJG1vZGU7CiAgICAgICAgICAgICAgICAgICAgJHJlcG9zaXRvcnktPnNhdmUoJHN0b3JlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWVtcHR5KCRvcHRpb25zKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkb3B0aW9uczsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIAogICAgcHVibGljICBmdW5jdGlvbiBzYXZlU2V0dGluZ3MoJG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKGlzX2FycmF5KCRvcHRpb25zKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpc3NldCgkb3B0aW9uc1snY21zJ10pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZGF0YV9tYW5hZ2VyLT5jaGVja0RhdGEoJG9wdGlvbnNbJ2NtcyddKTsKICAgICAgICAgICAgICAgIHVuc2V0KCRvcHRpb25zWydjbXMnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzc2V0KCRvcHRpb25zWyJzY2hlbWFzIl1bInJvb3RfZGF0YSJdKSkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICR0aGlzLT5kYXRhX21hbmFnZXItPmNyZWF0ZUNhY2hlKCRvcHRpb25zWyJzY2hlbWFzIl1bInJvb3RfZGF0YSJdLCAncm9vdCcpOwoKICAgICAgICAgICAgICAgIHVuc2V0KCRvcHRpb25zWyJzY2hlbWFzIl1bInJvb3RfZGF0YSJdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzc2V0KCRvcHRpb25zWyJzY2hlbWFzIl1bInBhcmFtcyJdKSkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICR0aGlzLT5kYXRhX21hbmFnZXItPmNyZWF0ZUNhY2hlKCRvcHRpb25zWyJzY2hlbWFzIl1bInBhcmFtcyJdLCAncGFyYW1zJyk7CgogICAgICAgICAgICAgICAgdW5zZXQoJG9wdGlvbnNbInNjaGVtYXMiXVsicGFyYW1zIl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkb3B0aW9uc1sic2NoZW1hcyJdWyJhZGRvbl9uYW1lIl0gPSAkdGhpcy0+YWRkb25fbmFtZTsKCiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+ZGF0YV9tYW5hZ2VyLT5jcmVhdGVDYWNoZSgkb3B0aW9uc1sic2NoZW1hcyJdLCAnc2V0dGluZ3MnKTsKICAgICAgICAgICAgaWYgKCFlbXB0eSgkcmVzdWx0KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgCiAgICBwdWJsaWMgIGZ1bmN0aW9uIGNoZWNrVmFsaWQoJGFkZG9uID0gIm1hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyIikKICAgIHsKICAgICAgICAkdmFsaWRhdGUgPSBmYWxzZTsKICAgICAgICAkbmVlZF9yZXF1ZXN0ID0gdHJ1ZTsKICAgICAgICAkY29tcGFueV9saXN0ID0gW107CiAgICAgICAgJGNvbXBhbnlfaWQgPSBmbl9nZXRfcnVudGltZV9jb21wYW55X2lkKCk7CiAgICAgICAgJHN0b3JlZnJvbnRfaWQ9IGZuX21hdXJpc3dlYl9hZGRvbl9tYW5hZ2VyX2dldF9zdG9yZWZyb250X2lkKCk7CiAgICAgICAgJHZhbGlkYXRlID0gJHRoaXMtPmNsZWFuaW5nKHRydWUpOwogICAgICAgICRzZXR0aW5ncyA9ICR0aGlzLT5nZXRTZXR0aW5ncygpOwogICAgCiAgICAgICAgCiAgICAgICAgaWYgKCFlbXB0eSgkc2V0dGluZ3MpICYmIGlzc2V0KCRzZXR0aW5nc1sicmVzb2x1dGlvbiJdKSl7CiAgICAgICAgICAgIGlmICgkc3RvcmVmcm9udF9pZCl7CiAgICAgICAgICAgICAgICAkY29tcGFueV9kYXRhID0gZm5fbWF1cmlzd2ViX2FkZG9uX21hbmFnZXJfZ2V0X3N0b3JlZnJvbnRzKCRzdG9yZWZyb250X2lkKTsKICAgICAgICAgICAgICAgICRzZXRfcm9vdCA9ICR0aGlzLT5nZXRTZXR0aW5ncygicm9vdCIpOwoKICAgICAgICAgICAgICAgICR2YWxpZGF0ZSA9ICR0aGlzLT5jb21wYXJlRGF0YSgKICAgICAgICAgICAgICAgICAgICAkc2V0X3Jvb3RbJ3N0b3Jlc19kb21haW4nXSwKICAgICAgICAgICAgICAgICAgICAkY29tcGFueV9kYXRhWyJzdG9yZWZyb250Il0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJGlzX2RlbW9fc3RvcmVmcm9udCA9ICR0aGlzLT5jb21wYXJlRGF0YSgkc2V0X3Jvb3RbJ3Rlc3RfZG9tYWluJ10sICRjb21wYW55X2RhdGFbInN0b3JlZnJvbnQiXSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICghJHZhbGlkYXRlICYmICRpc19kZW1vX3N0b3JlZnJvbnQpewogICAgICAgICAgICAgICAgICAgIGlmKCRjb21wYW55X2RhdGFbInN0YXR1cyJdID09IFN0b3JlZnJvbnRTdGF0dXNlczo6Q0xPU0VEKXsKICAgICAgICAgICAgICAgICAgICAgICAgJHZhbGlkYXRlID0gJGlzX2RlbW9fc3RvcmVmcm9udDsKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgJHZhbGlkYXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCgnQ0FSVF9MQU5HVUFHRScpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCgnQ0FSVF9QUklNQVJZX0NVUlJFTkNZJykKICAgICAgICAgICAgICAgICAgICAgICAgKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuX3NldF9ub3RpZmljYXRpb24oJ1cnLCBfXygnbm90aWNlJyksIF9fKCdtYXVyaXN3ZWJfYWRkb25fbWFuYWdlci5ub3RpY2UuZGlzYWJsZV9zdG9yZWZyb250JykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHZhbGlkYXRlID0gJHZhbGlkYXRlICYmICRzZXR0aW5nc1sicmVzb2x1dGlvbiJdOwoKICAgICAgICAgICAgJG5lZWRfcmVxdWVzdCA9ICEoISR2YWxpZGF0ZSAmJiAkaXNfZGVtb19zdG9yZWZyb250IHx8ICR2YWxpZGF0ZSk7CgogICAgICAgICAgICBpZiAoaXNzZXQoJHNldHRpbmdzWyJlbmRfY2FjaGUiXSkpIHsKCiAgICAgICAgICAgICAgICAkaXNfZW5kX2NhY2hlID0gJHRoaXMtPmNoZWNrVGltZSgkc2V0dGluZ3NbImVuZF9jYWNoZSJdKTsKICAgICAgICAgICAgICAgICR2YWxpZGF0ZSA9ICR2YWxpZGF0ZSAmJiAhJGlzX2VuZF9jYWNoZTsKCiAgICAgICAgICAgICAgICAkbmVlZF9yZXF1ZXN0ID0gJGlzX2VuZF9jYWNoZTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5jaGVja1RpY2tSZXF1ZXN0KCR2YWxpZGF0ZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gWyR2YWxpZGF0ZSwkbmVlZF9yZXF1ZXN0XTsKICAgIH0KCgoKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIGdldExpY2Vuc2UoJHNraXBfbGltaXQgPSBmYWxzZSwgJGV4dHJhID0gW10pewoKICAgICAgICAkdGhpcy0+ZGF0YV9tYW5hZ2VyLT5jbGVhckNhY2hlKCk7CiAgICAgICAgCiAgICAgICAgJGNvbm5lY3QgPSBuZXcgQ29ubmVjdG9yKCR0aGlzLT5hZGRvbl9uYW1lKTsKICAgICAgICAKICAgICAgICAkZGF0YSA9ICRjb25uZWN0LT5hc2NTZXJ2ZXIoYXJyYXkoImRpc3BhdGNoIiA9PiAic2VydmljZS5nZXRfbWFpbl9maWxlcyIpKTsKICAgICAgICAkZmlsZV9saXN0ID0gaXNzZXQoJGRhdGFbImRhdGEiXVsnZmlsZV9uYW1lcyddKSA/ICRkYXRhWyJkYXRhIl1bJ2ZpbGVfbmFtZXMnXSA6IGZhbHNlOwogICAgICAgICRnZXRfZmlsZXMgPSBmYWxzZTsKICAgICAgICBpZiAoaXNfYXJyYXkoJGZpbGVfbGlzdCkpewogICAgICAgICAgICBmb3JlYWNoICgkZmlsZV9saXN0IGFzICRrZXkgPT4gJHZhbHVlKXsKICAgICAgICAgICAgICAgICRnZXRfZmlsZXMgPSAhaXNfZmlsZSgkdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKCRnZXRfZmlsZXMpewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRhZGRvbnNEYXRhID0gbmV3IEFkZG9uc0RhdGEoJHRoaXMtPmFkZG9uX25hbWUpOwogICAgICAgICRleHRyYSA9IGFycmF5X21lcmdlKCRleHRyYSwgJGFkZG9uc0RhdGEtPmdldEV4dHJhKCkpOwogICAgICAgICRkYXRhID0gJGNvbm5lY3QtPmFzY1NlcnZlcihhcnJheSgKICAgICAgICAgICAgImRpc3BhdGNoIiA9PiAic2VydmljZS5jaGVja19saWNlbnNlIiwgCiAgICAgICAgICAgICdza2lwX2xpbWl0JyA9PiAkc2tpcF9saW1pdCwgCiAgICAgICAgICAgICJnZXRfZmlsZXMiID0+ICRnZXRfZmlsZXMsIAogICAgICAgICAgICAiZXh0cmEiID0+ICRleHRyYQogICAgICAgICkpOwogICAgICAgIAogICAgICAgIGlmICghZW1wdHkoJGRhdGFbImluZm8iXVsiaHR0cF9jb2RlIl0pICYmICRkYXRhWyJpbmZvIl1bImh0dHBfY29kZSJdID09IDIwMCl7CiAgICAgICAgICAgIGlmIChpc3NldCgkZGF0YVsiZGF0YSJdWyJmaWxlX25hbWUiXSkpewogICAgICAgICAgICAgICAgJHBhdGggPSAgZm5fbWF1cmlzd2ViX2FkZG9uX21hbmFnZXJfZ2V0X3RtcF9wYXRoKCR0aGlzLT5hZGRvbl9uYW1lKTsKICAgICAgICAgICAgICAgICR0bXBmaWxlID0gJHBhdGggLiAiLyIgLiAkZGF0YVsnZGF0YSddWyJmaWxlX25hbWUiXTsKICAgICAgICAgICAgICAgIGlmKGZpbGVfZXhpc3RzKCR0bXBmaWxlKSl7CiAgICAgICAgICAgICAgICAgICAgZm5fZGVjb21wcmVzc19maWxlcygkdG1wZmlsZSwgRElSX1JPT1QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm5fcm0oJHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRjb250ZW50ID0gJGRhdGFbImRhdGEiXTsKICAgICAgICAgICAgJHNldHRpbmdzID0gYXJyYXkoKTsKICAgICAgICAgICAgJGRhdGFfc2V0ID0gICR0aGlzLT5kYXRhX21hbmFnZXItPmdldFNjaGVtZSgnZGF0YV9zZXQnKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkZGF0YV9zZXQpKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZGF0YV9zZXQgYXMgJG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGNvbnRlbnRbJG5hbWVdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2V0dGluZ3NbJG5hbWVdID0gJGNvbnRlbnRbJG5hbWVdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkc2V0dGluZ3NbInNjaGVtYXMiXVsicm9vdF9kYXRhIl1bIm1haW5fZmlsZXMiXSA9ICRmaWxlX2xpc3Q7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Z2V0X3NpZ25hbCgkY29udGVudCkgPyAkdGhpcy0+c2F2ZVNldHRpbmdzKCRzZXR0aW5ncykgOiBmYWxzZTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgIGZ1bmN0aW9uIGZpbmRGaWxlcygkcGF0aCwgJiRmaWxlcywgJHNlYXJjaCA9ICcnKXsKCiAgICAgICAgaWYgKGlzX2RpcigkcGF0aCkpewogICAgICAgICAgICAkY2xlYW5QYXRoID0gZ2xvYigkcGF0aCAuICIvKiIpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGNsZWFuUGF0aCBhcyAkZmlsZSl7CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRzZWFyY2gpKXsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRmaWxlLCAkc2VhcmNoKSAhPT0gZmFsc2UpewoKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVzW10gPSAkZmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5maW5kRmlsZXMoJGZpbGUsICRmaWxlcywgJHNlYXJjaCk7CgogICAgICAgICAgICAgICAgaWYgKCFpc19udWxsKCRyZXN1bHQpKQogICAgICAgICAgICAgICAgICAgICRmaWxlc1tdID0gJHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmIChpc19maWxlKCRwYXRoKSl7CiAgICAgICAgICAgIGlmICghZW1wdHkoJHNlYXJjaCkpewogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkcGF0aCwgJHNlYXJjaCkgPT09IGZhbHNlKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHBhdGg7CiAgICAgICAgfQogICAgfQogICAgCiAgICBwdWJsaWMgIGZ1bmN0aW9uIGdldF9zaWduYWwoJGRhdGEpewogICAgICAgIGlmIChpc3NldCgkZGF0YVsibWVzc2FnZXMiXVsnZ2VuZXJhbCddKSl7CiAgICAgICAgICAgIGZvcmVhY2ggKCRkYXRhWyJtZXNzYWdlcyJdWydnZW5lcmFsJ10gYXMgJGtleSA9PiAkbWVzc2FnZSl7CiAgICAgICAgICAgICAgICBjYWxsX3VzZXJfZnVuY19hcnJheSgnZm5fc2V0X25vdGlmaWNhdGlvbicsIGFycmF5X3ZhbHVlcygkbWVzc2FnZSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc3NldCgkZGF0YVsic2lnbmFsIl0pKXsKICAgICAgICAgICAgc3dpdGNoICgkZGF0YVsnc2lnbmFsJ10pewogICAgICAgICAgICAgICAgY2FzZSAiaW5zdGFsbCI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICBjYXNlICJ2YWxpZCI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICBjYXNlICJkZWxldGVfbWFpbl9maWxlIjoKICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRkYXRhWydmaWxlc19wYXRjaCddKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkYXRhWydmaWxlc19wYXRjaCddIGFzICRuYW1lX2ZpbGUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5fcm0oJG5hbWVfZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRhdGFfbWFuYWdlci0+Y2xlYXJDYWNoZShbJ3NldHRpbmdzJywgJ3Jvb3QnXSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAiZGVsZXRlIjoKICAgICAgICAgICAgICAgICAgICAkZmlsZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmluZEZpbGVzKCcuJywgJGZpbGVzLCAkdGhpcy0+YWRkb25fbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgZm5fdW5pbnN0YWxsX2FkZG9uKCR0aGlzLT5hZGRvbl9uYW1lLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGZpbGVzKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlcyBhcyAka2V5ID0+ICRmaWxlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuX3JtKCRmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICJibG9jayI6CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRhdGFfbWFuYWdlci0+Y2xlYXJDYWNoZShbJ3NldHRpbmdzJywgJ3Jvb3QnXSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAiZGlzYWJsZWQiOgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0cnk6OmdldCgnYWRkb25zLicgLiAkdGhpcy0+YWRkb25fbmFtZSAuICcuc3RhdHVzJykgIT0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RTdGF0dXNlczo6RElTQUJMRUQKICAgICAgICAgICAgICAgICAgICApewogICAgICAgICAgICAgICAgICAgICAgICBmbl91cGRhdGVfYWRkb25fc3RhdHVzKCR0aGlzLT5hZGRvbl9uYW1lLCBPYmplY3RTdGF0dXNlczo6RElTQUJMRUQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRkYXRhWyJtZXNzYWdlcyJdWydkaXNhYmxlZCddKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkZGF0YVsibWVzc2FnZXMiXVsnZGlzYWJsZWQnXSBhcyAka2V5ID0+ICRtZXNzYWdlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3VzZXJfZnVuY19hcnJheSgnZm5fc2V0X25vdGlmaWNhdGlvbicsIGFycmF5X3ZhbHVlcygkbWVzc2FnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRkYXRhWyJtZXNzYWdlcyJdWydkaXNhYmxlZCddKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzc2V0KCRkYXRhWyJtZXNzYWdlcyJdWyRkYXRhWydzaWduYWwnXV0pKXsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkYXRhWyJtZXNzYWdlcyJdWyRkYXRhWydzaWduYWwnXV0gYXMgJGtleSA9PiAkbWVzc2FnZSl7CiAgICAgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmNfYXJyYXkoJ2ZuX3NldF9ub3RpZmljYXRpb24nLCBhcnJheV92YWx1ZXMoJG1lc3NhZ2UpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAKICAgIHB1YmxpYyAgZnVuY3Rpb24gY2hlY2tUaW1lKCR0aW1lKQogICAgewogICAgICAgICRydW5fdGltZSAgPSBtaWNyb3RpbWUodHJ1ZSk7CgogICAgICAgIHJldHVybiAkdGltZSA8PSAkcnVuX3RpbWU7CiAgICAgICAgCiAgICB9CgogICAgcHVibGljICBmdW5jdGlvbiBjbGVhbmluZygkbGltaXQgPSB0cnVlKXsKICAgICAgICBpZiAoJGxpbWl0KXsKICAgICAgICAgICAgJHNldHRpbmdzID0gJHRoaXMtPmdldFNldHRpbmdzKCk7CiAgICAgICAgICAgIGlmIChpc3NldCgkc2V0dGluZ3NbJ2VuZF9jYWNoZSddKSl7CiAgICAgICAgICAgICAgICBpZiAodGltZSgpIDwgJHNldHRpbmdzWydlbmRfY2FjaGUnXSl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJG1haW4gPSAkdGhpcy0+Z2V0U2V0dGluZ3MoInJvb3QiKTsKICAgICAgICBpZiAoIWVtcHR5KCRtYWluWyJtYWluX2ZpbGVzIl0pKXsKICAgICAgICAgICAgJG1haW4gPSBpc19hcnJheSgkbWFpblsibWFpbl9maWxlcyJdKSAKICAgICAgICAgICAgICAgID8gJG1haW5bIm1haW5fZmlsZXMiXSA6IGFycmF5KCRtYWluWyJtYWluX2ZpbGVzIl0pOwogICAgICAgICAgICAkdGhpcy0+ZGVsZXRlRmllbGVzKCRtYWluKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gZGVsZXRlRmllbGVzKCRmaWxlX2xpc3QpewogICAgICAgIGlmKCFlbXB0eSgkZmlsZV9saXN0KSl7CiAgICAgICAgICAgIGlmKGlzX2FycmF5KCRmaWxlX2xpc3QpKXsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlX2xpc3QgYXMgJGtleSA9PiAkdmFsdWUpewogICAgICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkdmFsdWUpKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNfYXJyYXkoJHZhbHVlKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGVsZXRlRmllbGVzKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChpc19maWxlKCR2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfWVsc2UgaWYoaXNfZmlsZSgkZmlsZV9saXN0KSl7CiAgICAgICAgICAgICAgICBAdW5saW5rKCRmaWxlX2xpc3QpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyAgZnVuY3Rpb24gIGNvbXBhcmVEYXRhKCRwdWNrLCAkY2hhcil7CiAgICAgICAgaWYgKGlzX2FycmF5KCRwdWNrKSAmJiAhaXNfYXJyYXkoJGNoYXIpKXsKICAgICAgICAgICAgcmV0dXJuIGlzc2V0KCRwdWNrWyRjaGFyXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldEZsYXNoZWRUaW1lRGF0YSgpewogICAgICAgIHJldHVybiBbInRpY2siID0+IDAsICJ0aW1lX2JlZ2luIiA9PiB0aW1lKCldOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0Q2FjaGVPYmplY3QoJGZpbGVfbmFtZSwgJiR0aW1lRGF0YSl7CiAgICAgICAgaWYoUmVhZFdyaXRlOjpmaWxlSXNFbXB0eSgkZmlsZV9uYW1lKSl7CiAgICAgICAgICAgIGZuX3JtKCRmaWxlX25hbWUpOwogICAgICAgIH0KICAgICAgICAkbW9kZSA9IENhY2hlOjpBUFBFTkRfUkVBRF9DQUNIRTsKICAgICAgICBpZighZmlsZV9leGlzdHMoJGZpbGVfbmFtZSkpewogICAgICAgICAgICAkbW9kZSA9IENhY2hlOjpSRVdSSVRFX0NBQ0hFOwogICAgICAgIH0KICAgICAgICAkY2FjaGUgPSBuZXcgQ2FjaGUoJGZpbGVfbmFtZSwgJG1vZGUpOwogICAgICAgIGlmKCRtb2RlID09IENhY2hlOjpSRVdSSVRFX0NBQ0hFKXsKICAgICAgICAgICAgJHRpbWVEYXRhID0gJHRoaXMtPmdldEZsYXNoZWRUaW1lRGF0YSgpOwogICAgICAgICAgICAkY2FjaGUtPndyaXRlRGF0YSgkdGltZURhdGEpOwogICAgICAgIH0KICAgICAgICAkY2FjaGUtPmluaXRQYXJhbXMoQ2FjaGU6OkFQUEVORF9SRUFEX0NBQ0hFKTsKICAgICAgICByZXR1cm4gJGNhY2hlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjaGVja1RpY2tSZXF1ZXN0KCRyZXNldCA9IGZhbHNlLCAkdHlwZSA9IG51bGwpCiAgICB7CgogICAgICAgIGlmIChpc19udWxsKCR0eXBlKSkgewogICAgICAgICAgICAkdHlwZSA9ICd0aWNrX3JlcXVlc3QnOwogICAgICAgIH0KCiAgICAgICAgJHRpbWVEYXRhID0gJHRoaXMtPmRhdGFfbWFuYWdlci0+Z2V0Q2FjaGUoJHR5cGUpOwoKICAgICAgICBpZiAoIWVtcHR5KCR0aW1lRGF0YSkpIHsKICAgICAgICAgICAgaWYgKCRyZXNldCkgewogICAgICAgICAgICAgICAgJHRpbWVEYXRhID0gJHRoaXMtPmdldEZsYXNoZWRUaW1lRGF0YSgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR0aW1lRGF0YVsndGljayddKSkgewogICAgICAgICAgICAgICAgICAgICR0aW1lRGF0YVsndGljayddKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aW1lRGF0YVsndGljayddID49IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdGltZURhdGFbJ3RpbWVfYmVnaW4nXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGltZSgpIC0gJHRpbWVEYXRhWyd0aW1lX2JlZ2luJ10pIDwgKDEgKiA2MCAqIDYwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheShmYWxzZSwgJHRpbWVEYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVEYXRhID0gJHRoaXMtPmdldEZsYXNoZWRUaW1lRGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVEYXRhWyd0aW1lX2JlZ2luJ10gPSB0aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0aW1lRGF0YSA9ICR0aGlzLT5nZXRGbGFzaGVkVGltZURhdGEoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aW1lRGF0YSA9ICR0aGlzLT5nZXRGbGFzaGVkVGltZURhdGEoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgJHRoaXMtPmRhdGFfbWFuYWdlci0+Y3JlYXRlQ2FjaGUoJHRpbWVEYXRhLCAkdHlwZSk7CgogICAgICAgIHJldHVybiBhcnJheSh0cnVlLCAkdGltZURhdGEpOwogICAgfQp9Cg=="));
?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 9019e3afc5d8b99ff9ecd4855e298811 |
Eval Count | 1 |
Decode Time | 75 ms |