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("Y2xhc3MgQml6dGVjaF9Nb2JpbGVhc3Npc3RhbnRfSGVscGVyX0RhdGEgZXh0ZW5k..
Decoded Output download
class Biztech_Mobileassistant_Helper_Data extends Mage_Core_Helper_Abstract {
public function create($data) {
$collections = Mage::getModel("mobileassistant/mobileassistant")->getCollection()
->addFieldToFilter('username', Array('eq' => $data['username']))
->addFieldToFilter('password', Array('eq' => $data['password']))
->addFieldToFilter('device_token', Array('eq' => $data['devicetoken']));
$count = count($collections);
if ($count == 0) {
Mage::getModel("mobileassistant/mobileassistant")
->setUsername($data['username'])
->setPassword($data['password'])
->setDeviceToken($data['devicetoken'])
->setDeviceType($data['device_type'])
->setNotificationFlag($data['notification_flag'])
->save();
}
if ($count == 1) {
foreach ($collections as $user) {
$user_id = $user->getUserId();
$flag = $user->getNotificationFlag();
}
if ($flag != $data['notification_flag'] || $data['is_logout'] != 1) {
try {
$connection = Mage::getSingleton('core/resource')->getConnection('core_write');
$connection->beginTransaction();
$fields = array();
$fields['notification_flag'] = $data['notification_flag'];
$fields['is_logout'] = $data['is_logout'];
$where = $connection->quoteInto('user_id =?', $user_id);
$prefix = Mage::getConfig()->getTablePrefix();
$connection->update($prefix . 'mobileassistant', $fields, $where);
$connection->commit();
} catch (Exception $e) {
return $e->getMessage();
}
}
}
$successArr[] = array('success_msg' => 'Login sucessfully', 'session_id' => $data['session_id']);
foreach (Mage::app()->getWebsites() as $website) {
foreach ($website->getGroups() as $group) {
$stores = $group->getStores();
foreach ($stores as $store) {
$storeArr[] = array('id' => $store->getId(),
'name' => $store->getName()
);
}
}
}
$isPos = 0;
$result = array('success' => $successArr, 'stores' => $storeArr, 'is_pos' => $isPos, 'is_Mobileassistantpro' => 1);
return $result;
}
public function getPrice($price, $storeId, $order_currency) {
$currencyCode = $order_currency;
if ($order_currency == null) {
$store = Mage::getModel('core/store')->load($storeId);
$price = $store->roundPrice($store->convertPrice($price));
$currencyCode = Mage::app()->getStore($storeId)->getCurrentCurrencyCode();
}
$price = strip_tags(Mage::app()->getLocale()->currency($currencyCode)->toCurrency($this->getPriceFormat($price)));
return $price;
}
public function getPriceFormat($price) {
$price = sprintf("%01.2f", $price);
return $price;
}
public function getActualDate($updated_date) {
$date = Mage::app()->getLocale()->date(strtotime($updated_date));
$timestamp = $date->get(Zend_Date::TIMESTAMP) - $date->get(Zend_Date::TIMEZONE_SECS);
$updated_date = date("Y-m-d H:i:s", $timestamp);
return $updated_date;
}
public function getActualOrderDate($updated_date) {
$date = Mage::app()->getLocale()->date(strtotime($updated_date));
$timestamp = $date->get(Zend_Date::TIMESTAMP) + $date->get(Zend_Date::TIMEZONE_SECS);
$updated_date = date("Y-m-d H:i:s", $timestamp);
return $updated_date;
}
public function isEnable() {
$websiteId = Mage::app()->getWebsite()->getId();
$isenabled = Mage::getStoreConfig('mobileassistant/mobileassistant_general/enabled');
if ($isenabled) {
if ($websiteId) {
$websites = $this->getAllWebsites();
$key = Mage::getStoreConfig('mobileassistant/activation/key');
if ($key == null || $key == '') {
return false;
} else {
$en = Mage::getStoreConfig('mobileassistant/activation/en');
if ($isenabled && $en && in_array($websiteId, $websites)) {
return true;
} else {
return false;
}
}
} else {
$en = Mage::getStoreConfig('mobileassistant/activation/en');
if ($isenabled && $en) {
return true;
}
}
}
//return Mage::getStoreConfig('mobileassistant/mobileassistant_general/enabled');
}
public function pushNotification($notification_type, $entity_id, $params = NULL) {
$google_api_key = 'AIzaSyAZPkT165oPcjfhUmgJnt5Lcs2OInBFJmE';
$passphrase = 'push2magento';
$collections = Mage::getModel("mobileassistant/mobileassistant")->getCollection()->addFieldToFilter('notification_flag', Array('eq' => 1))->addFieldToFilter('is_logout', Array('eq' => 0));
if ($notification_type == 'customer') {
$message = Mage::getStoreConfig('mobileassistant/mobileassistant_general/customer_register_notification_msg');
if ($message == null) {
$message = Mage::helper('mobileassistant')->__('A New customer has been registered on the Store.');
}
} else if ($notification_type == 'order') {
$order = Mage::getModel('sales/order')->load($entity_id);
$msgString = Mage::getStoreConfig('mobileassistant/mobileassistant_general/notification_msg');
if ($msgString == null) {
$msgString = Mage::helper('mobileassistant')->__('A New order has been received on the Store.');
}
$message = $msgString . "
Order Id: " . $order->getIncrementId() . "
Grand Total: " . $this->getPrice($order->getGrandTotal(), $order->getStoreId(), $order->getOrderCurrencyCode());
} else if ($notification_type == 'product') {
$msgString = Mage::getStoreConfig('mobileassistant/mobileassistant_general/product_inventory_notification_msg');
if ($msgString == null) {
$msgString = Mage::helper('mobileassistant')->__('Product Stock Alert');
}
$message = $msgString . "
Name: " . $params['name'] . "
Current Qty: " . $params['qty'];
} else if ($notification_type == 'review') {
$message = Mage::getStoreConfig('mobileassistant/mobileassistant_general/product_review_notification_msg');
if ($message == null) {
$message = Mage::helper('mobileassistant')->__('A New Review has been added on the store');
}
}
$apnsCert = Mage::getBaseDir('lib') . DS . "mobileassistant" . DS . "pushcert.pem";
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
$flags = STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT;
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, $flags, $ctx);
foreach ($collections as $collection) {
$deviceType = $collection->getDeviceType();
if ($deviceType == 'ios') {
if ($fp) {
$deviceToken = $collection->getDeviceToken();
$body['aps'] = array(
'alert' => $message,
'sound' => 'default',
'entity_id' => $entity_id,
'type' => $notification_type
);
$payload = json_encode($body);
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
$result = fwrite($fp, $msg, strlen($msg));
}
} elseif ($deviceType == 'android') {
$deviceToken = $collection->getDeviceToken();
$registrationIds = array($deviceToken);
$msg_a = array(
'message' => $message,
'entity_id' => $entity_id,
'type' => $notification_type
);
$fields = array(
'registration_ids' => $registrationIds,
'data' => $msg_a
);
$headers = array(
'Authorization: key=' . $google_api_key,
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://android.googleapis.com/gcm/send');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
curl_close($ch);
}
}
fclose($fp);
return true;
}
public function checkKey($k, $s = '') {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, sprintf('http://store.biztechconsultancy.com/extension/licence.php'));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'key=' . urlencode($k) . '&domains=' . urlencode(implode(',', $this->getAllStoreDomains())) . '&sec=mobileassistant');
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$content = curl_exec($ch);
$res = Zend_Json::decode($content);
$modulestatus = new Mage_Core_Model_Config();
$enc = Mage::helper('core');
if (empty($res)) {
$modulestatus->saveConfig('mobileassistant/activation/key', "");
$modulestatus->saveConfig('mobileassistant/mobileassistant_general/enabled', 0);
$data = Mage::getStoreConfig('mobileassistant/activation/data');
$groups = array(
'activation' => array(
'fields' => array(
'data' => array(
'value' => $data
),
'websites' => array(
'value' => ''
)
)
)
);
Mage::getModel('adminhtml/config_data')
->setSection('mobileassistant')
->setGroups($groups)
->save();
Mage::getConfig()->reinit();
Mage::app()->reinitStores();
return;
}
$data = '';
$web = '';
$en = '';
if (isset($res['dom']) && intval($res['c']) > 0 && intval($res['suc']) == 1) {
$data = $enc->encrypt(base64_encode(Zend_Json::encode($res)));
if (!$s) {
$params = Mage::app()->getRequest()->getParam('groups');
if (isset($params['activation']['fields']['websites']['value'])) {
$s = $params['activation']['fields']['websites']['value'];
} else if (Mage::app()->getRequest()->getParam('website')) {
$s = explode(',', str_replace($data, '', Mage::helper('core')->decrypt(Mage::getStoreConfig('mobileassistant/activation/websites'))));
}
}
$en = $res['suc'];
if (isset($s) && $s != null) {
$web = $enc->encrypt($data . implode(',', $s) . $data);
} else {
$web = $enc->encrypt($data . $data);
}
} else {
$modulestatus->saveConfig('mobileassistant/activation/key', "");
$modulestatus->saveConfig('mobileassistant/mobileassistant_general/enabled', 0);
}
$groups = array(
'activation' => array(
'fields' => array(
'data' => array(
'value' => $data
),
'websites' => array(
'value' => (string) $web
),
'en' => array(
'value' => $en
),
'installed' => array(
'value' => 1
)
)
)
);
Mage::getModel('adminhtml/config_data')
->setSection('mobileassistant')
->setGroups($groups)
->save();
Mage::getConfig()->reinit();
Mage::app()->reinitStores();
}
public function getDataInfo() {
$data = Mage::getStoreConfig('mobileassistant/activation/data');
return Zend_Json::decode(base64_decode(Mage::helper('core')->decrypt($data)));
}
public function getFormatUrl($url) {
$input = trim($url, '/');
if (!preg_match('#^http(s)?://#', $input)) {
$input = 'http://' . $input;
}
$urlParts = parse_url($input);
$domain = preg_replace('/^www\./', '', $urlParts['host'] . $urlParts['path']);
return $domain;
}
public function getAllStoreDomains() {
$domains = array();
foreach (Mage::app()->getWebsites() as $website) {
$url = $website->getConfig('web/unsecure/base_url');
if ($domain = trim(preg_replace('/^.*?\/\/(.*)?\//', '$1', $url))) {
$domains[] = $domain;
}
$url = $website->getConfig('web/secure/base_url');
if ($domain = trim(preg_replace('/^.*?\/\/(.*)?\//', '$1', $url))) {
$domains[] = $domain;
}
}
return array_unique($domains);
}
public function getAllWebsites() {
if (!Mage::getStoreConfig('mobileassistant/activation/installed')) {
return array();
}
$data = Mage::getStoreConfig('mobileassistant/activation/data');
$web = Mage::getStoreConfig('mobileassistant/activation/websites');
$websites = explode(',', str_replace($data, '', Mage::helper('core')->decrypt($web)));
$websites = array_diff($websites, array(""));
return $websites;
}
}
Did this file decode correctly?
Original Code
<?php eval(base64_decode("Y2xhc3MgQml6dGVjaF9Nb2JpbGVhc3Npc3RhbnRfSGVscGVyX0RhdGEgZXh0ZW5kcyBNYWdlX0NvcmVfSGVscGVyX0Fic3RyYWN0IHsNCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBjcmVhdGUoJGRhdGEpIHsNCiAgICAgICAgJGNvbGxlY3Rpb25zID0gTWFnZTo6Z2V0TW9kZWwoIm1vYmlsZWFzc2lzdGFudC9tb2JpbGVhc3Npc3RhbnQiKS0+Z2V0Q29sbGVjdGlvbigpDQogICAgICAgICAgICAgICAgLT5hZGRGaWVsZFRvRmlsdGVyKCd1c2VybmFtZScsIEFycmF5KCdlcScgPT4gJGRhdGFbJ3VzZXJuYW1lJ10pKQ0KICAgICAgICAgICAgICAgIC0+YWRkRmllbGRUb0ZpbHRlcigncGFzc3dvcmQnLCBBcnJheSgnZXEnID0+ICRkYXRhWydwYXNzd29yZCddKSkNCiAgICAgICAgICAgICAgICAtPmFkZEZpZWxkVG9GaWx0ZXIoJ2RldmljZV90b2tlbicsIEFycmF5KCdlcScgPT4gJGRhdGFbJ2RldmljZXRva2VuJ10pKTsNCiAgICAgICAgJGNvdW50ID0gY291bnQoJGNvbGxlY3Rpb25zKTsNCg0KDQogICAgICAgIGlmICgkY291bnQgPT0gMCkgew0KICAgICAgICAgICAgTWFnZTo6Z2V0TW9kZWwoIm1vYmlsZWFzc2lzdGFudC9tb2JpbGVhc3Npc3RhbnQiKQ0KICAgICAgICAgICAgICAgICAgICAtPnNldFVzZXJuYW1lKCRkYXRhWyd1c2VybmFtZSddKQ0KICAgICAgICAgICAgICAgICAgICAtPnNldFBhc3N3b3JkKCRkYXRhWydwYXNzd29yZCddKQ0KICAgICAgICAgICAgICAgICAgICAtPnNldERldmljZVRva2VuKCRkYXRhWydkZXZpY2V0b2tlbiddKQ0KICAgICAgICAgICAgICAgICAgICAtPnNldERldmljZVR5cGUoJGRhdGFbJ2RldmljZV90eXBlJ10pDQogICAgICAgICAgICAgICAgICAgIC0+c2V0Tm90aWZpY2F0aW9uRmxhZygkZGF0YVsnbm90aWZpY2F0aW9uX2ZsYWcnXSkNCiAgICAgICAgICAgICAgICAgICAgLT5zYXZlKCk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRjb3VudCA9PSAxKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkY29sbGVjdGlvbnMgYXMgJHVzZXIpIHsNCiAgICAgICAgICAgICAgICAkdXNlcl9pZCA9ICR1c2VyLT5nZXRVc2VySWQoKTsNCiAgICAgICAgICAgICAgICAkZmxhZyA9ICR1c2VyLT5nZXROb3RpZmljYXRpb25GbGFnKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoJGZsYWcgIT0gJGRhdGFbJ25vdGlmaWNhdGlvbl9mbGFnJ10gfHwgJGRhdGFbJ2lzX2xvZ291dCddICE9IDEpIHsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAkY29ubmVjdGlvbiA9IE1hZ2U6OmdldFNpbmdsZXRvbignY29yZS9yZXNvdXJjZScpLT5nZXRDb25uZWN0aW9uKCdjb3JlX3dyaXRlJyk7DQogICAgICAgICAgICAgICAgICAgICRjb25uZWN0aW9uLT5iZWdpblRyYW5zYWN0aW9uKCk7DQogICAgICAgICAgICAgICAgICAgICRmaWVsZHMgPSBhcnJheSgpOw0KICAgICAgICAgICAgICAgICAgICAkZmllbGRzWydub3RpZmljYXRpb25fZmxhZyddID0gJGRhdGFbJ25vdGlmaWNhdGlvbl9mbGFnJ107DQogICAgICAgICAgICAgICAgICAgICRmaWVsZHNbJ2lzX2xvZ291dCddID0gJGRhdGFbJ2lzX2xvZ291dCddOw0KICAgICAgICAgICAgICAgICAgICAkd2hlcmUgPSAkY29ubmVjdGlvbi0+cXVvdGVJbnRvKCd1c2VyX2lkID0/JywgJHVzZXJfaWQpOw0KICAgICAgICAgICAgICAgICAgICAkcHJlZml4ID0gTWFnZTo6Z2V0Q29uZmlnKCktPmdldFRhYmxlUHJlZml4KCk7DQogICAgICAgICAgICAgICAgICAgICRjb25uZWN0aW9uLT51cGRhdGUoJHByZWZpeCAuICdtb2JpbGVhc3Npc3RhbnQnLCAkZmllbGRzLCAkd2hlcmUpOw0KICAgICAgICAgICAgICAgICAgICAkY29ubmVjdGlvbi0+Y29tbWl0KCk7DQogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkZS0+Z2V0TWVzc2FnZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgICRzdWNjZXNzQXJyW10gPSBhcnJheSgnc3VjY2Vzc19tc2cnID0+ICdMb2dpbiBzdWNlc3NmdWxseScsICdzZXNzaW9uX2lkJyA9PiAkZGF0YVsnc2Vzc2lvbl9pZCddKTsNCg0KICAgICAgICBmb3JlYWNoIChNYWdlOjphcHAoKS0+Z2V0V2Vic2l0ZXMoKSBhcyAkd2Vic2l0ZSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJHdlYnNpdGUtPmdldEdyb3VwcygpIGFzICRncm91cCkgew0KICAgICAgICAgICAgICAgICRzdG9yZXMgPSAkZ3JvdXAtPmdldFN0b3JlcygpOw0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRzdG9yZXMgYXMgJHN0b3JlKSB7DQogICAgICAgICAgICAgICAgICAgICRzdG9yZUFycltdID0gYXJyYXkoJ2lkJyA9PiAkc3RvcmUtPmdldElkKCksDQogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJHN0b3JlLT5nZXROYW1lKCkNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJGlzUG9zID0gMDsNCiAgICAgICAgJHJlc3VsdCA9IGFycmF5KCdzdWNjZXNzJyA9PiAkc3VjY2Vzc0FyciwgJ3N0b3JlcycgPT4gJHN0b3JlQXJyLCAnaXNfcG9zJyA9PiAkaXNQb3MsICdpc19Nb2JpbGVhc3Npc3RhbnRwcm8nID0+IDEpOw0KICAgICAgICByZXR1cm4gJHJlc3VsdDsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJpY2UoJHByaWNlLCAkc3RvcmVJZCwgJG9yZGVyX2N1cnJlbmN5KSB7DQogICAgICAgICRjdXJyZW5jeUNvZGUgPSAkb3JkZXJfY3VycmVuY3k7DQogICAgICAgIGlmICgkb3JkZXJfY3VycmVuY3kgPT0gbnVsbCkgew0KICAgICAgICAgICAgJHN0b3JlID0gTWFnZTo6Z2V0TW9kZWwoJ2NvcmUvc3RvcmUnKS0+bG9hZCgkc3RvcmVJZCk7DQogICAgICAgICAgICAkcHJpY2UgPSAkc3RvcmUtPnJvdW5kUHJpY2UoJHN0b3JlLT5jb252ZXJ0UHJpY2UoJHByaWNlKSk7DQogICAgICAgICAgICAkY3VycmVuY3lDb2RlID0gTWFnZTo6YXBwKCktPmdldFN0b3JlKCRzdG9yZUlkKS0+Z2V0Q3VycmVudEN1cnJlbmN5Q29kZSgpOw0KICAgICAgICB9DQogICAgICAgICRwcmljZSA9IHN0cmlwX3RhZ3MoTWFnZTo6YXBwKCktPmdldExvY2FsZSgpLT5jdXJyZW5jeSgkY3VycmVuY3lDb2RlKS0+dG9DdXJyZW5jeSgkdGhpcy0+Z2V0UHJpY2VGb3JtYXQoJHByaWNlKSkpOw0KICAgICAgICByZXR1cm4gJHByaWNlOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcmljZUZvcm1hdCgkcHJpY2UpIHsNCiAgICAgICAgJHByaWNlID0gc3ByaW50ZigiJTAxLjJmIiwgJHByaWNlKTsNCiAgICAgICAgcmV0dXJuICRwcmljZTsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWN0dWFsRGF0ZSgkdXBkYXRlZF9kYXRlKSB7DQogICAgICAgICRkYXRlID0gTWFnZTo6YXBwKCktPmdldExvY2FsZSgpLT5kYXRlKHN0cnRvdGltZSgkdXBkYXRlZF9kYXRlKSk7DQogICAgICAgICR0aW1lc3RhbXAgPSAkZGF0ZS0+Z2V0KFplbmRfRGF0ZTo6VElNRVNUQU1QKSAtICRkYXRlLT5nZXQoWmVuZF9EYXRlOjpUSU1FWk9ORV9TRUNTKTsNCiAgICAgICAgJHVwZGF0ZWRfZGF0ZSA9IGRhdGUoIlktbS1kIEg6aTpzIiwgJHRpbWVzdGFtcCk7DQogICAgICAgIHJldHVybiAkdXBkYXRlZF9kYXRlOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBY3R1YWxPcmRlckRhdGUoJHVwZGF0ZWRfZGF0ZSkgew0KICAgICAgICAkZGF0ZSA9IE1hZ2U6OmFwcCgpLT5nZXRMb2NhbGUoKS0+ZGF0ZShzdHJ0b3RpbWUoJHVwZGF0ZWRfZGF0ZSkpOw0KICAgICAgICAkdGltZXN0YW1wID0gJGRhdGUtPmdldChaZW5kX0RhdGU6OlRJTUVTVEFNUCkgKyAkZGF0ZS0+Z2V0KFplbmRfRGF0ZTo6VElNRVpPTkVfU0VDUyk7DQogICAgICAgICR1cGRhdGVkX2RhdGUgPSBkYXRlKCJZLW0tZCBIOmk6cyIsICR0aW1lc3RhbXApOw0KICAgICAgICByZXR1cm4gJHVwZGF0ZWRfZGF0ZTsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbmFibGUoKSB7DQogICAgICAgICR3ZWJzaXRlSWQgPSBNYWdlOjphcHAoKS0+Z2V0V2Vic2l0ZSgpLT5nZXRJZCgpOw0KICAgICAgICAkaXNlbmFibGVkID0gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ21vYmlsZWFzc2lzdGFudC9tb2JpbGVhc3Npc3RhbnRfZ2VuZXJhbC9lbmFibGVkJyk7DQogICAgICAgIGlmICgkaXNlbmFibGVkKSB7DQogICAgICAgICAgICBpZiAoJHdlYnNpdGVJZCkgew0KICAgICAgICAgICAgICAgICR3ZWJzaXRlcyA9ICR0aGlzLT5nZXRBbGxXZWJzaXRlcygpOw0KICAgICAgICAgICAgICAgICRrZXkgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnbW9iaWxlYXNzaXN0YW50L2FjdGl2YXRpb24va2V5Jyk7DQogICAgICAgICAgICAgICAgaWYgKCRrZXkgPT0gbnVsbCB8fCAka2V5ID09ICcnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkZW4gPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnbW9iaWxlYXNzaXN0YW50L2FjdGl2YXRpb24vZW4nKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRpc2VuYWJsZWQgJiYgJGVuICYmIGluX2FycmF5KCR3ZWJzaXRlSWQsICR3ZWJzaXRlcykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZW4gPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnbW9iaWxlYXNzaXN0YW50L2FjdGl2YXRpb24vZW4nKTsNCiAgICAgICAgICAgICAgICBpZiAoJGlzZW5hYmxlZCAmJiAkZW4pIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIC8vcmV0dXJuIE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdtb2JpbGVhc3Npc3RhbnQvbW9iaWxlYXNzaXN0YW50X2dlbmVyYWwvZW5hYmxlZCcpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBwdXNoTm90aWZpY2F0aW9uKCRub3RpZmljYXRpb25fdHlwZSwgJGVudGl0eV9pZCwgJHBhcmFtcyA9IE5VTEwpIHsNCiAgICAgICAgJGdvb2dsZV9hcGlfa2V5ID0gJ0FJemFTeUFaUGtUMTY1b1BjamZoVW1nSm50NUxjczJPSW5CRkptRSc7DQogICAgICAgICRwYXNzcGhyYXNlID0gJ3B1c2gybWFnZW50byc7DQogICAgICAgICRjb2xsZWN0aW9ucyA9IE1hZ2U6OmdldE1vZGVsKCJtb2JpbGVhc3Npc3RhbnQvbW9iaWxlYXNzaXN0YW50IiktPmdldENvbGxlY3Rpb24oKS0+YWRkRmllbGRUb0ZpbHRlcignbm90aWZpY2F0aW9uX2ZsYWcnLCBBcnJheSgnZXEnID0+IDEpKS0+YWRkRmllbGRUb0ZpbHRlcignaXNfbG9nb3V0JywgQXJyYXkoJ2VxJyA9PiAwKSk7DQoNCiAgICAgICAgaWYgKCRub3RpZmljYXRpb25fdHlwZSA9PSAnY3VzdG9tZXInKSB7DQogICAgICAgICAgICAkbWVzc2FnZSA9IE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdtb2JpbGVhc3Npc3RhbnQvbW9iaWxlYXNzaXN0YW50X2dlbmVyYWwvY3VzdG9tZXJfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX21zZycpOw0KICAgICAgICAgICAgaWYgKCRtZXNzYWdlID09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAkbWVzc2FnZSA9IE1hZ2U6OmhlbHBlcignbW9iaWxlYXNzaXN0YW50JyktPl9fKCdBIE5ldyBjdXN0b21lciBoYXMgYmVlbiByZWdpc3RlcmVkIG9uIHRoZSBTdG9yZS4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICgkbm90aWZpY2F0aW9uX3R5cGUgPT0gJ29yZGVyJykgew0KDQogICAgICAgICAgICAkb3JkZXIgPSBNYWdlOjpnZXRNb2RlbCgnc2FsZXMvb3JkZXInKS0+bG9hZCgkZW50aXR5X2lkKTsNCiAgICAgICAgICAgICRtc2dTdHJpbmcgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnbW9iaWxlYXNzaXN0YW50L21vYmlsZWFzc2lzdGFudF9nZW5lcmFsL25vdGlmaWNhdGlvbl9tc2cnKTsNCiAgICAgICAgICAgIGlmICgkbXNnU3RyaW5nID09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAkbXNnU3RyaW5nID0gTWFnZTo6aGVscGVyKCdtb2JpbGVhc3Npc3RhbnQnKS0+X18oJ0EgTmV3IG9yZGVyIGhhcyBiZWVuIHJlY2VpdmVkIG9uIHRoZSBTdG9yZS4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRtZXNzYWdlID0gJG1zZ1N0cmluZyAuICJcbk9yZGVyIElkOiAiIC4gJG9yZGVyLT5nZXRJbmNyZW1lbnRJZCgpIC4gIlxuR3JhbmQgVG90YWw6ICIgLiAkdGhpcy0+Z2V0UHJpY2UoJG9yZGVyLT5nZXRHcmFuZFRvdGFsKCksICRvcmRlci0+Z2V0U3RvcmVJZCgpLCAkb3JkZXItPmdldE9yZGVyQ3VycmVuY3lDb2RlKCkpOw0KICAgICAgICB9IGVsc2UgaWYgKCRub3RpZmljYXRpb25fdHlwZSA9PSAncHJvZHVjdCcpIHsNCiAgICAgICAgICAgICRtc2dTdHJpbmcgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnbW9iaWxlYXNzaXN0YW50L21vYmlsZWFzc2lzdGFudF9nZW5lcmFsL3Byb2R1Y3RfaW52ZW50b3J5X25vdGlmaWNhdGlvbl9tc2cnKTsNCiAgICAgICAgICAgIGlmICgkbXNnU3RyaW5nID09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAkbXNnU3RyaW5nID0gTWFnZTo6aGVscGVyKCdtb2JpbGVhc3Npc3RhbnQnKS0+X18oJ1Byb2R1Y3QgU3RvY2sgQWxlcnQnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRtZXNzYWdlID0gJG1zZ1N0cmluZyAuICJcbk5hbWU6ICIgLiAkcGFyYW1zWyduYW1lJ10gLiAiXG5DdXJyZW50IFF0eTogIiAuICRwYXJhbXNbJ3F0eSddOw0KICAgICAgICB9IGVsc2UgaWYgKCRub3RpZmljYXRpb25fdHlwZSA9PSAncmV2aWV3Jykgew0KICAgICAgICAgICAgJG1lc3NhZ2UgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnbW9iaWxlYXNzaXN0YW50L21vYmlsZWFzc2lzdGFudF9nZW5lcmFsL3Byb2R1Y3RfcmV2aWV3X25vdGlmaWNhdGlvbl9tc2cnKTsNCiAgICAgICAgICAgIGlmICgkbWVzc2FnZSA9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSBNYWdlOjpoZWxwZXIoJ21vYmlsZWFzc2lzdGFudCcpLT5fXygnQSBOZXcgUmV2aWV3IGhhcyBiZWVuIGFkZGVkIG9uIHRoZSBzdG9yZScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgJGFwbnNDZXJ0ID0gTWFnZTo6Z2V0QmFzZURpcignbGliJykgLiBEUyAuICJtb2JpbGVhc3Npc3RhbnQiIC4gRFMgLiAicHVzaGNlcnQucGVtIjsNCiAgICAgICAgJGN0eCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZSgpOw0KICAgICAgICBzdHJlYW1fY29udGV4dF9zZXRfb3B0aW9uKCRjdHgsICdzc2wnLCAnbG9jYWxfY2VydCcsICRhcG5zQ2VydCk7DQogICAgICAgIHN0cmVhbV9jb250ZXh0X3NldF9vcHRpb24oJGN0eCwgJ3NzbCcsICdwYXNzcGhyYXNlJywgJHBhc3NwaHJhc2UpOw0KICAgICAgICAkZmxhZ3MgPSBTVFJFQU1fQ0xJRU5UX0NPTk5FQ1QgfCBTVFJFQU1fQ0xJRU5UX1BFUlNJU1RFTlQ7DQogICAgICAgICRmcCA9IHN0cmVhbV9zb2NrZXRfY2xpZW50KCdzc2w6Ly9nYXRld2F5LnB1c2guYXBwbGUuY29tOjIxOTUnLCAkZXJyLCAkZXJyc3RyLCA2MCwgJGZsYWdzLCAkY3R4KTsNCg0KICAgICAgICBmb3JlYWNoICgkY29sbGVjdGlvbnMgYXMgJGNvbGxlY3Rpb24pIHsNCiAgICAgICAgICAgICRkZXZpY2VUeXBlID0gJGNvbGxlY3Rpb24tPmdldERldmljZVR5cGUoKTsNCg0KICAgICAgICAgICAgaWYgKCRkZXZpY2VUeXBlID09ICdpb3MnKSB7DQogICAgICAgICAgICAgICAgaWYgKCRmcCkgew0KDQogICAgICAgICAgICAgICAgICAgICRkZXZpY2VUb2tlbiA9ICRjb2xsZWN0aW9uLT5nZXREZXZpY2VUb2tlbigpOw0KICAgICAgICAgICAgICAgICAgICAkYm9keVsnYXBzJ10gPSBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICdhbGVydCcgPT4gJG1lc3NhZ2UsDQogICAgICAgICAgICAgICAgICAgICAgICAnc291bmQnID0+ICdkZWZhdWx0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICdlbnRpdHlfaWQnID0+ICRlbnRpdHlfaWQsDQogICAgICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gJG5vdGlmaWNhdGlvbl90eXBlDQogICAgICAgICAgICAgICAgICAgICk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHBheWxvYWQgPSBqc29uX2VuY29kZSgkYm9keSk7DQogICAgICAgICAgICAgICAgICAgICRtc2cgPSBjaHIoMCkgLiBwYWNrKCduJywgMzIpIC4gcGFjaygnSConLCAkZGV2aWNlVG9rZW4pIC4gcGFjaygnbicsIHN0cmxlbigkcGF5bG9hZCkpIC4gJHBheWxvYWQ7DQogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBmd3JpdGUoJGZwLCAkbXNnLCBzdHJsZW4oJG1zZykpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZWlmICgkZGV2aWNlVHlwZSA9PSAnYW5kcm9pZCcpIHsNCg0KICAgICAgICAgICAgICAgICRkZXZpY2VUb2tlbiA9ICRjb2xsZWN0aW9uLT5nZXREZXZpY2VUb2tlbigpOw0KICAgICAgICAgICAgICAgICRyZWdpc3RyYXRpb25JZHMgPSBhcnJheSgkZGV2aWNlVG9rZW4pOw0KICAgICAgICAgICAgICAgICRtc2dfYSA9IGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScgPT4gJG1lc3NhZ2UsDQogICAgICAgICAgICAgICAgICAgICdlbnRpdHlfaWQnID0+ICRlbnRpdHlfaWQsDQogICAgICAgICAgICAgICAgICAgICd0eXBlJyA9PiAkbm90aWZpY2F0aW9uX3R5cGUNCiAgICAgICAgICAgICAgICApOw0KDQogICAgICAgICAgICAgICAgJGZpZWxkcyA9IGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAncmVnaXN0cmF0aW9uX2lkcycgPT4gJHJlZ2lzdHJhdGlvbklkcywNCiAgICAgICAgICAgICAgICAgICAgJ2RhdGEnID0+ICRtc2dfYQ0KICAgICAgICAgICAgICAgICk7DQoNCiAgICAgICAgICAgICAgICAkaGVhZGVycyA9IGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbjoga2V5PScgLiAkZ29vZ2xlX2FwaV9rZXksDQogICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KICAgICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICdodHRwczovL2FuZHJvaWQuZ29vZ2xlYXBpcy5jb20vZ2NtL3NlbmQnKTsNCiAgICAgICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgdHJ1ZSk7DQogICAgICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzKTsNCiAgICAgICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOw0KICAgICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgZmFsc2UpOw0KICAgICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCBqc29uX2VuY29kZSgkZmllbGRzKSk7DQogICAgICAgICAgICAgICAgJHJlc3VsdCA9IGN1cmxfZXhlYygkY2gpOw0KICAgICAgICAgICAgICAgIGN1cmxfY2xvc2UoJGNoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmY2xvc2UoJGZwKTsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIGNoZWNrS2V5KCRrLCAkcyA9ICcnKSB7DQogICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCBzcHJpbnRmKCdodHRwOi8vc3RvcmUuYml6dGVjaGNvbnN1bHRhbmN5LmNvbS9leHRlbnNpb24vbGljZW5jZS5waHAnKSk7DQogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NULCB0cnVlKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICdrZXk9JyAuIHVybGVuY29kZSgkaykgLiAnJmRvbWFpbnM9JyAuIHVybGVuY29kZShpbXBsb2RlKCcsJywgJHRoaXMtPmdldEFsbFN0b3JlRG9tYWlucygpKSkgLiAnJnNlYz1tb2JpbGVhc3Npc3RhbnQnKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1RJTUVPVVQsIDMwKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCAwKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCAwKTsNCiAgICAgICAgJGNvbnRlbnQgPSBjdXJsX2V4ZWMoJGNoKTsNCiAgICAgICAgJHJlcyA9IFplbmRfSnNvbjo6ZGVjb2RlKCRjb250ZW50KTsNCiAgICAgICAgJG1vZHVsZXN0YXR1cyA9IG5ldyBNYWdlX0NvcmVfTW9kZWxfQ29uZmlnKCk7DQogICAgICAgICRlbmMgPSBNYWdlOjpoZWxwZXIoJ2NvcmUnKTsNCiAgICAgICAgaWYgKGVtcHR5KCRyZXMpKSB7DQogICAgICAgICAgICAkbW9kdWxlc3RhdHVzLT5zYXZlQ29uZmlnKCdtb2JpbGVhc3Npc3RhbnQvYWN0aXZhdGlvbi9rZXknLCAiIik7DQogICAgICAgICAgICAkbW9kdWxlc3RhdHVzLT5zYXZlQ29uZmlnKCdtb2JpbGVhc3Npc3RhbnQvbW9iaWxlYXNzaXN0YW50X2dlbmVyYWwvZW5hYmxlZCcsIDApOw0KICAgICAgICAgICAgJGRhdGEgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnbW9iaWxlYXNzaXN0YW50L2FjdGl2YXRpb24vZGF0YScpOw0KICAgICAgICAgICAgJGdyb3VwcyA9IGFycmF5KA0KICAgICAgICAgICAgICAgICdhY3RpdmF0aW9uJyA9PiBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgJ2ZpZWxkcycgPT4gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAnZGF0YScgPT4gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyA9PiAkZGF0YQ0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJzaXRlcycgPT4gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyA9PiAnJw0KICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIE1hZ2U6OmdldE1vZGVsKCdhZG1pbmh0bWwvY29uZmlnX2RhdGEnKQ0KICAgICAgICAgICAgICAgICAgICAtPnNldFNlY3Rpb24oJ21vYmlsZWFzc2lzdGFudCcpDQogICAgICAgICAgICAgICAgICAgIC0+c2V0R3JvdXBzKCRncm91cHMpDQogICAgICAgICAgICAgICAgICAgIC0+c2F2ZSgpOw0KICAgICAgICAgICAgTWFnZTo6Z2V0Q29uZmlnKCktPnJlaW5pdCgpOw0KICAgICAgICAgICAgTWFnZTo6YXBwKCktPnJlaW5pdFN0b3JlcygpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgICRkYXRhID0gJyc7DQogICAgICAgICR3ZWIgPSAnJzsNCiAgICAgICAgJGVuID0gJyc7DQoNCiAgICAgICAgaWYgKGlzc2V0KCRyZXNbJ2RvbSddKSAmJiBpbnR2YWwoJHJlc1snYyddKSA+IDAgJiYgaW50dmFsKCRyZXNbJ3N1YyddKSA9PSAxKSB7DQogICAgICAgICAgICAkZGF0YSA9ICRlbmMtPmVuY3J5cHQoYmFzZTY0X2VuY29kZShaZW5kX0pzb246OmVuY29kZSgkcmVzKSkpOw0KICAgICAgICAgICAgaWYgKCEkcykgew0KICAgICAgICAgICAgICAgICRwYXJhbXMgPSBNYWdlOjphcHAoKS0+Z2V0UmVxdWVzdCgpLT5nZXRQYXJhbSgnZ3JvdXBzJyk7DQogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJ2FjdGl2YXRpb24nXVsnZmllbGRzJ11bJ3dlYnNpdGVzJ11bJ3ZhbHVlJ10pKSB7DQogICAgICAgICAgICAgICAgICAgICRzID0gJHBhcmFtc1snYWN0aXZhdGlvbiddWydmaWVsZHMnXVsnd2Vic2l0ZXMnXVsndmFsdWUnXTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1hZ2U6OmFwcCgpLT5nZXRSZXF1ZXN0KCktPmdldFBhcmFtKCd3ZWJzaXRlJykpIHsNCiAgICAgICAgICAgICAgICAgICAgJHMgPSBleHBsb2RlKCcsJywgc3RyX3JlcGxhY2UoJGRhdGEsICcnLCBNYWdlOjpoZWxwZXIoJ2NvcmUnKS0+ZGVjcnlwdChNYWdlOjpnZXRTdG9yZUNvbmZpZygnbW9iaWxlYXNzaXN0YW50L2FjdGl2YXRpb24vd2Vic2l0ZXMnKSkpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkZW4gPSAkcmVzWydzdWMnXTsNCiAgICAgICAgICAgIGlmIChpc3NldCgkcykgJiYgJHMgIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICR3ZWIgPSAkZW5jLT5lbmNyeXB0KCRkYXRhIC4gaW1wbG9kZSgnLCcsICRzKSAuICRkYXRhKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJHdlYiA9ICRlbmMtPmVuY3J5cHQoJGRhdGEgLiAkZGF0YSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkbW9kdWxlc3RhdHVzLT5zYXZlQ29uZmlnKCdtb2JpbGVhc3Npc3RhbnQvYWN0aXZhdGlvbi9rZXknLCAiIik7DQogICAgICAgICAgICAkbW9kdWxlc3RhdHVzLT5zYXZlQ29uZmlnKCdtb2JpbGVhc3Npc3RhbnQvbW9iaWxlYXNzaXN0YW50X2dlbmVyYWwvZW5hYmxlZCcsIDApOw0KICAgICAgICB9DQogICAgICAgICRncm91cHMgPSBhcnJheSgNCiAgICAgICAgICAgICdhY3RpdmF0aW9uJyA9PiBhcnJheSgNCiAgICAgICAgICAgICAgICAnZmllbGRzJyA9PiBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgJ2RhdGEnID0+IGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyA9PiAkZGF0YQ0KICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAnd2Vic2l0ZXMnID0+IGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyA9PiAoc3RyaW5nKSAkd2ViDQogICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICdlbicgPT4gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnID0+ICRlbg0KICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAnaW5zdGFsbGVkJyA9PiBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZScgPT4gMQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgKQ0KICAgICAgICApOw0KICAgICAgICBNYWdlOjpnZXRNb2RlbCgnYWRtaW5odG1sL2NvbmZpZ19kYXRhJykNCiAgICAgICAgICAgICAgICAtPnNldFNlY3Rpb24oJ21vYmlsZWFzc2lzdGFudCcpDQogICAgICAgICAgICAgICAgLT5zZXRHcm91cHMoJGdyb3VwcykNCiAgICAgICAgICAgICAgICAtPnNhdmUoKTsNCiAgICAgICAgTWFnZTo6Z2V0Q29uZmlnKCktPnJlaW5pdCgpOw0KICAgICAgICBNYWdlOjphcHAoKS0+cmVpbml0U3RvcmVzKCk7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIGdldERhdGFJbmZvKCkgew0KICAgICAgICAkZGF0YSA9IE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdtb2JpbGVhc3Npc3RhbnQvYWN0aXZhdGlvbi9kYXRhJyk7DQogICAgICAgIHJldHVybiBaZW5kX0pzb246OmRlY29kZShiYXNlNjRfZGVjb2RlKE1hZ2U6OmhlbHBlcignY29yZScpLT5kZWNyeXB0KCRkYXRhKSkpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXRVcmwoJHVybCkgew0KICAgICAgICAkaW5wdXQgPSB0cmltKCR1cmwsICcvJyk7DQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnI15odHRwKHMpPzovLyMnLCAkaW5wdXQpKSB7DQogICAgICAgICAgICAkaW5wdXQgPSAnaHR0cDovLycgLiAkaW5wdXQ7DQogICAgICAgIH0NCiAgICAgICAgJHVybFBhcnRzID0gcGFyc2VfdXJsKCRpbnB1dCk7DQogICAgICAgICRkb21haW4gPSBwcmVnX3JlcGxhY2UoJy9ed3d3XC4vJywgJycsICR1cmxQYXJ0c1snaG9zdCddIC4gJHVybFBhcnRzWydwYXRoJ10pOw0KICAgICAgICByZXR1cm4gJGRvbWFpbjsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWxsU3RvcmVEb21haW5zKCkgew0KICAgICAgICAkZG9tYWlucyA9IGFycmF5KCk7DQogICAgICAgIGZvcmVhY2ggKE1hZ2U6OmFwcCgpLT5nZXRXZWJzaXRlcygpIGFzICR3ZWJzaXRlKSB7DQogICAgICAgICAgICAkdXJsID0gJHdlYnNpdGUtPmdldENvbmZpZygnd2ViL3Vuc2VjdXJlL2Jhc2VfdXJsJyk7DQogICAgICAgICAgICBpZiAoJGRvbWFpbiA9IHRyaW0ocHJlZ19yZXBsYWNlKCcvXi4qP1wvXC8oLiopP1wvLycsICckMScsICR1cmwpKSkgew0KICAgICAgICAgICAgICAgICRkb21haW5zW10gPSAkZG9tYWluOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHVybCA9ICR3ZWJzaXRlLT5nZXRDb25maWcoJ3dlYi9zZWN1cmUvYmFzZV91cmwnKTsNCiAgICAgICAgICAgIGlmICgkZG9tYWluID0gdHJpbShwcmVnX3JlcGxhY2UoJy9eLio/XC9cLyguKik/XC8vJywgJyQxJywgJHVybCkpKSB7DQogICAgICAgICAgICAgICAgJGRvbWFpbnNbXSA9ICRkb21haW47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGFycmF5X3VuaXF1ZSgkZG9tYWlucyk7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIGdldEFsbFdlYnNpdGVzKCkgew0KICAgICAgICBpZiAoIU1hZ2U6OmdldFN0b3JlQ29uZmlnKCdtb2JpbGVhc3Npc3RhbnQvYWN0aXZhdGlvbi9pbnN0YWxsZWQnKSkgew0KICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7DQogICAgICAgIH0NCiAgICAgICAgJGRhdGEgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnbW9iaWxlYXNzaXN0YW50L2FjdGl2YXRpb24vZGF0YScpOw0KICAgICAgICAkd2ViID0gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ21vYmlsZWFzc2lzdGFudC9hY3RpdmF0aW9uL3dlYnNpdGVzJyk7DQogICAgICAgICR3ZWJzaXRlcyA9IGV4cGxvZGUoJywnLCBzdHJfcmVwbGFjZSgkZGF0YSwgJycsIE1hZ2U6OmhlbHBlcignY29yZScpLT5kZWNyeXB0KCR3ZWIpKSk7DQogICAgICAgICR3ZWJzaXRlcyA9IGFycmF5X2RpZmYoJHdlYnNpdGVzLCBhcnJheSgiIikpOw0KICAgICAgICByZXR1cm4gJHdlYnNpdGVzOw0KICAgIH0NCg0KfQ=="));
Function Calls
| base64_decode | 1 |
Stats
| MD5 | 836e0ab75497896d0f33141d25116187 |
| Eval Count | 1 |
| Decode Time | 95 ms |