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("LyoqICogR29NYWdlIFByb2R1Y3QgRGVzaWduZXIgRXh0ZW5zaW9uICogKiBAY2F0..

Decoded Output download

/** * GoMage Product Designer Extension * * @category Extension * @copyright Copyright (c) 2013-2016 GoMage (https://www.gomage.com) * @author GoMage * @license https://www.gomage.com/license-agreement/ Single domain license * @terms of use https://www.gomage.com/terms-of-use/ * @version Release: 2.4.0 * @since Available since Release 1.0.0 */ class GoMage_ProductDesigner_Helper_Data extends Mage_Core_Helper_Abstract { const ADVANCED_NAVIGATION_MODULE_NAME = 'GoMage_Navigation'; protected $_allowedProductTypes = array( Mage_Catalog_Model_Product_Type::TYPE_SIMPLE, Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE ); protected $_productSettings; protected $_productDesign = null; protected $_editorConfig = null; public function isEnabled() { return Mage::getStoreConfig('gomage_designer/general/enabled', Mage::app()->getStore()); } public function isNavigationEnabled() { return Mage::getStoreConfig('gomage_designer/navigation/enabled', Mage::app()->getStore()); } public function advancedNavigationEnabled() { $modules = (array)Mage::getConfig()->getNode('modules')->children(); if (isset($modules[self::ADVANCED_NAVIGATION_MODULE_NAME])) { $module = $modules[self::ADVANCED_NAVIGATION_MODULE_NAME]; return $module->is('active') && Mage::getStoreConfig('gomage_navigation/general/mode'); } return false; } public function isEnterpriseEdition() { $modules = (array)Mage::getConfig()->getNode('modules')->children(); return isset($modules['Enterprise_TargetRule']); } public function isModuleExists($moduleName) { $modules = (array)Mage::getConfig()->getNode('modules')->children(); return isset($modules[$moduleName]); } public function getIsAnymoreVersion($major, $minor, $revision = 0) { $version_info = Mage::getVersionInfo(); if ($version_info['major'] > $major) { return true; } elseif ($version_info['major'] == $major) { if ($version_info['minor'] > $minor) { return true; } elseif ($version_info['minor'] == $minor) { if ($version_info['revision'] >= $revision) { return true; } } } return false; } /** * Return allowed product types * * @return array */ public function getAllowedProductTypes() { return $this->_allowedProductTypes; } public function hasColorAttribute() { $attributeCode = Mage::getStoreConfig('gomage_designer/navigation/color_attribute'); $attribute = Mage::getSingleton('eav/config') ->getAttribute(Mage_Catalog_Model_Product::ENTITY, $attributeCode); return $attribute->getId(); } /** * Return Image Settings * * @param Mage_Catalog_Model_Product $product Product * @param int $imageId Image Id * @return boolean|array */ public function getImageSettings(Mage_Catalog_Model_Product $product, $imageId) { $settings = $this->getSettings($product); if (isset($settings[$imageId])) { return $settings[$imageId]; } return false; } /** * Return Product images settings * * @param Mage_Catalog_Model_Product $product Product * @return array */ public function getSettings(Mage_Catalog_Model_Product $product) { if (!$this->_productSettings) { $settings = array(); $images = $product->getMediaGalleryImages(); foreach ($images as $image) { $designArea = Mage::helper('core')->jsonDecode($image['design_area']); $imageId = $image['value_id']; if ($designArea && !empty($designArea)) { $imageUrl = $this->getDesignImageUrl($product, $image); $dimensions = $this->getImageDimensions($imageUrl); $baseUrl = Mage::getBaseUrl('media'); $baseDir = Mage::getBaseDir('media') . DS; $designArea['path'] = str_replace($baseUrl, $baseDir, $imageUrl); $designArea['dimensions'] = array( 'width' => $dimensions[0], 'height' => $dimensions[1] ); $designArea['original_image'] = $this->getOriginalImage($product, $image); if (isset($designArea['original_image']['url'])) { $designArea['original_image']['path'] = str_replace( $baseUrl, $baseDir, $designArea['original_image']['url'] ); } $settings[$imageId] = $designArea; } } $this->_productSettings = $settings; } return $this->_productSettings; } public function jsonDecode($string) { $settings = Mage::helper('core')->jsonDecode($string); $result = array(); foreach ($settings as $i => $v) { $result[$i] = (array)$v; if (!isset($result[$i]['s'])) { $result[$i]['s'] = 1; } } return $result; } public function getImageDimensions($imagePath) { $dirImg = Mage::getBaseDir() . str_replace("/", DS, strstr($imagePath, '/media')); if (file_exists($dirImg)) { $imageObj = new Varien_Image($dirImg); $width = $imageObj->getOriginalWidth(); $height = $imageObj->getOriginalHeight(); return array($width, $height); } return array(0, 0); } public function prepareDesignerSessionId() { $customerSession = $this->_getCustomerSession(); if (!$customerSession->getDesignerSessionId()) { $customerSession->setDesignerSessionId(sha1(rand(0, 1000) . microtime(true))); } } public function getDesignerSessionId() { $sessionId = $this->_getCustomerSession()->getEncryptedSessionId(); return $sessionId; } protected function _getCustomerSession() { return Mage::getSingleton('customer/session'); } public function getDesignWidth() { return GoMage_ProductDesigner_Model_Design::DESIGN_SIZE_WIDTH; } public function getDesignHeight() { return GoMage_ProductDesigner_Model_Design::DESIGN_SIZE_HEIGHT; } /** * Return Image Url * * @param Mage_Catalog_Model_Product $product Product * @param Varien_Object $image Image * @param array $size Size * @return string */ public function getDesignImageUrl(Mage_Catalog_Model_Product $product, $image, $size = array()) { if (empty($size)) { $imageWidth = $this->getDesignWidth(); $imageHeight = $this->getDesignHeight(); } else { list($imageWidth, $imageHeight) = $size; } $imageFile = is_object($image) ? $image->getFile() : $image['file']; return Mage::helper('catalog/image') ->init($product, 'base_image', $imageFile) ->keepFrame(false) ->resize($imageWidth, $imageHeight) ->__toString(); } public function getOriginalImage(Mage_Catalog_Model_Product $product, $image) { $imageFile = is_object($image) ? $image->getFile() : $image['file']; $imagePath = $product->getMediaConfig()->getMediaPath($imageFile); $minWidth = Mage::getStoreConfig('gomage_designer/general/zoom_size_width'); $minHeight = Mage::getStoreConfig('gomage_designer/general/zoom_size_height'); if (file_exists($imagePath)) { $imageObj = new Varien_Image($imagePath); $width = $imageObj->getOriginalWidth(); $height = $imageObj->getOriginalHeight(); $dimensions = array(); if ($width < $minWidth && $height < $minHeight) { $dimensions[0] = $minWidth; $dimensions[1] = $minHeight; } else { $dimensions[0] = $width; $dimensions[1] = $height; } return array( 'url' => $this->getDesignImageUrl($product, $image, $dimensions), 'dimensions' => $dimensions ); } return array(); } public function getProductSettingForEditor(Mage_Catalog_Model_Product $product = null) { if (!$this->_editorConfig) { if (is_null($product)) { $product = Mage::registry('product'); } $editorConfig = array( 'images' => array() ); if (!$product->getId()) { return $editorConfig; } $images = $product->getMediaGalleryImages(); $colorAttributeCode = Mage::getStoreConfig('gomage_designer/navigation/color_attribute'); $defaultColor = null; foreach ($images as $image) { $id = $image['value_id']; $settings = Mage::helper('core')->jsonDecode($image['design_area']); if (!$settings || empty($settings)) { continue; } $imageUrl = $this->getDesignImageUrl($product, $image); $conf = $settings; $conf['id'] = $id; $conf['u'] = $imageUrl; $conf['d'] = $this->getImageDimensions($imageUrl); $conf['orig_image'] = $this->getOriginalImage($product, $image); $conf['ico'] = $this->getDesignImageUrl($product, $image, array(60, 60)); if ($product->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE) { if ($image['color']) { if (is_null($defaultColor)) { $defaultColor = $image['color']; } if (!isset($editorConfig['images'][$image['color']])) { $editorConfig['images'][$image['color']] = array(); } $editorConfig['images'][$image['color']][$id] = $conf; } else { $defaultColor = $product->getData($colorAttributeCode) ?: 'none_color'; $editorConfig['images'][$defaultColor][$id] = $conf; } } else { $defaultColor = 'none_color'; $editorConfig['images'][$defaultColor][$id] = $conf; } $editorConfig['default_color'] = $defaultColor; $editorConfig['url'] = $product->getProductUrl(); $editorConfig['name'] = $product->getName(); } $this->_editorConfig = $editorConfig; } return $this->_editorConfig; } /** * Save product design images * * @return GoMage_ProductDesigner_Model_Design * @throws Exception */ public function saveProductDesignedImages() { $product = $this->initializeProduct(); $images = Mage::app()->getRequest()->getParam('images'); if ($product->getId() && $images && !empty($images)) { $design = Mage::getModel('gomage_designer/design')->saveDesign($product, $this->_getRequest()->getParams()); return $design; } elseif (!$product->getId()) { throw new Exception(Mage::helper('gomage_designer')->__('Product is not defined')); } elseif (!$images || empty($images)) { throw new Exception(Mage::helper('gomage_designer')->__('Designed images are empty')); } } /** * Initialize current product from request * * @return Mage_Catalog_Model_Product */ public function initializeProduct() { $product = Mage::registry('product'); if ($product) { return $product; } $request = Mage::app()->getRequest(); $productId = $request->getParam("id", false); $product = Mage::getModel('catalog/product'); if ($productId) { $product->load($productId); } Mage::register('product', $product); return $product; } /** * Price calculation depending on product options * * @return array */ public function getProductPriceConfig() { $config = array(); $_request = Mage::getSingleton('tax/calculation')->getRateRequest(false, false, false); /* @var $product Mage_Catalog_Model_Product */ $product = $this->initializeProduct(); $_request->setProductClassId($product->getTaxClassId()); $defaultTax = Mage::getSingleton('tax/calculation')->getRate($_request); $_request = Mage::getSingleton('tax/calculation')->getRateRequest(); $_request->setProductClassId($product->getTaxClassId()); $currentTax = Mage::getSingleton('tax/calculation')->getRate($_request); $_regularPrice = $product->getPrice(); $_finalPrice = $product->getFinalPrice(); $_priceInclTax = Mage::helper('tax')->getPrice($product, $_finalPrice, true); $_priceExclTax = Mage::helper('tax')->getPrice($product, $_finalPrice); $_tierPrices = array(); $_tierPricesInclTax = array(); foreach ($product->getTierPrice() as $tierPrice) { $_tierPrices[] = Mage::helper('core')->currency($tierPrice['website_price'], false, false); $_tierPricesInclTax[] = Mage::helper('core')->currency( Mage::helper('tax')->getPrice($product, (int)$tierPrice['website_price'], true), false, false ); } $config = array( 'productId' => $product->getId(), 'priceFormat' => Mage::app()->getLocale()->getJsPriceFormat(), 'includeTax' => Mage::helper('tax')->priceIncludesTax() ? 'true' : 'false', 'showIncludeTax' => Mage::helper('tax')->displayPriceIncludingTax(), 'showBothPrices' => Mage::helper('tax')->displayBothPrices(), 'productPrice' => Mage::helper('core')->currency($_finalPrice, false, false), 'productOldPrice' => Mage::helper('core')->currency($_regularPrice, false, false), 'priceInclTax' => Mage::helper('core')->currency($_priceInclTax, false, false), 'priceExclTax' => Mage::helper('core')->currency($_priceExclTax, false, false), /** * @var skipCalculate * @deprecated after 1.5.1.0 */ 'skipCalculate' => ($_priceExclTax != $_priceInclTax ? 0 : 1), 'defaultTax' => $defaultTax, 'currentTax' => $currentTax, 'idSuffix' => '_clone', 'oldPlusDisposition' => 0, 'plusDisposition' => 0, 'plusDispositionTax' => 0, 'oldMinusDisposition' => 0, 'minusDisposition' => 0, 'tierPrices' => $_tierPrices, 'tierPricesInclTax' => $_tierPricesInclTax, ); $responseObject = new Varien_Object(); Mage::dispatchEvent('catalog_product_view_config', array('response_object' => $responseObject)); if (is_array($responseObject->getAdditionalOptions())) { foreach ($responseObject->getAdditionalOptions() as $option => $value) { $config[$option] = $value; } } return $config; } public function formatFileName($file) { $formatResult = Mage::helper('catalog/product_url')->format($file); return preg_replace('#[\s]+#i', '-', $formatResult); } public function canApplyMsrp($product, $visibility = null, $checkAssociatedItems = true) { $version = Mage::getVersionInfo(); if (($version['major'] === '1') && ((int)$version['minor'] <= 5)) { return false; } elseif (method_exists(Mage::helper('catalog'), 'canApplyMsrp')) { return Mage::helper('catalog')->canApplyMsrp($product, $visibility, $checkAssociatedItems); } return false; } /** * Retrieve url for adding product to wishlist * * @param int $itemId * * @return string */ public function getMoveFromCartUrl($itemId) { $version = Mage::getVersionInfo(); if (($version['major'] === '1') && ((int)$version['minor'] <= 5)) { return false; } else { if (method_exists(Mage::helper('wishlist'), 'getMoveFromCartUrl')) { return Mage::helper('wishlist')->getMoveFromCartUrl($itemId); } } return false; } /** * Get JSON encoded configuration array which can be used for JS dynamic * * @return string */ public function getProductPriceConfigJson() { return Mage::helper('core')->jsonEncode($this->getProductPriceConfig()); } /** * Return product design from request * * @param Mage_Catalog_Model_Product $product Product * @return bool|Mage_Core_Model_Abstract */ public function getProductDesign($product) { if (is_null($this->_productDesign)) { $designId = (int)Mage::app()->getRequest()->getParam('design_id', false); if ($designId) { $design = Mage::getModel('gomage_designer/design')->load($designId); if ($design->getId() && $design->getProductId() == $product->getId()) { $this->_productDesign = $design; } else { $this->_productDesign = false; } } } return $this->_productDesign; } 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 getWindowCssPath() { if (!$this->getIsAnymoreVersion(1, 7)) { return 'prototype/windows/themes/magento.css'; } else { return 'lib/prototype/windows/themes/magento.css'; } } public function getCssType() { if (!$this->getIsAnymoreVersion(1, 7)) { return 'js_css'; } else { return 'skin_css'; } } public function getAvailableWebsites() { return $this->_w(); } protected function _w() { if (!Mage::getStoreConfig('gomage_activation/designer/installed') || (intval(Mage::getStoreConfig('gomage_activation/designer/count')) > 10) ) { return array(); } $time_to_update = 60 * 60 * 24 * 15; $r = Mage::getStoreConfig('gomage_activation/designer/ar'); $t = Mage::getStoreConfig('gomage_activation/designer/time'); $s = Mage::getStoreConfig('gomage_activation/designer/websites'); $last_check = str_replace($r, '', Mage::helper('core')->decrypt($t)); $allsites = explode(',', str_replace($r, '', Mage::helper('core')->decrypt($s))); $allsites = array_diff($allsites, array("")); if (($last_check + $time_to_update) < time()) { $this->a(Mage::getStoreConfig('gomage_activation/designer/key'), intval(Mage::getStoreConfig('gomage_activation/designer/count')), implode(',', $allsites) ); } return $allsites; } public function a($k, $c = 0, $s = '') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, sprintf('https://www.gomage.com/index.php/gomage_downloadable/key/check')); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, 'key=' . urlencode($k) . '&sku=product-designer&domains=' . urlencode(implode(',', $this->getAllStoreDomains())) . '&ver=' . urlencode('2.4.0')); 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); try { $r = Zend_Json::decode($content); } catch (\Exception $e) { $r = array(); } $e = Mage::helper('core'); if (empty($r)) { $value1 = Mage::getStoreConfig('gomage_activation/designer/ar'); $groups = array( 'designer' => array( 'fields' => array( 'ar' => array( 'value' => $value1 ), 'websites' => array( 'value' => (string)Mage::getStoreConfig('gomage_activation/designer/websites') ), 'time' => array( 'value' => (string)$e->encrypt($value1 . (time() - (60 * 60 * 24 * 15 - 1800)) . $value1) ), 'count' => array( 'value' => $c + 1) ) ) ); Mage::getModel('adminhtml/config_data') ->setSection('gomage_activation') ->setGroups($groups) ->save(); Mage::getConfig()->reinit(); Mage::app()->reinitStores(); return; } $value1 = ''; $value2 = ''; if (isset($r['d']) && isset($r['c'])) { $value1 = $e->encrypt(base64_encode(Zend_Json::encode($r))); if (!$s) { $s = Mage::getStoreConfig('gomage_activation/designer/websites'); } $s = array_slice(explode(',', $s), 0, $r['c']); $value2 = $e->encrypt($value1 . implode(',', $s) . $value1); } $groups = array( 'designer' => array( 'fields' => array( 'ar' => array( 'value' => $value1 ), 'websites' => array( 'value' => (string)$value2 ), 'time' => array( 'value' => (string)$e->encrypt($value1 . time() . $value1) ), 'installed' => array( 'value' => 1 ), 'count' => array( 'value' => 0) ) ) ); Mage::getModel('adminhtml/config_data') ->setSection('gomage_activation') ->setGroups($groups) ->save(); Mage::getConfig()->reinit(); Mage::app()->reinitStores(); } public function ga() { $ar = base64_decode(Mage::helper('core')->decrypt(Mage::getStoreConfig('gomage_activation/designer/ar'))); return $ar ? Zend_Json::decode($ar) : array(); } public function notify() { $frequency = intval(Mage::app()->loadCache('gomage_notifications_frequency')); if (!$frequency) { $frequency = 24; } $last_update = intval(Mage::app()->loadCache('gomage_notifications_last_update')); if (($frequency * 60 * 60 + $last_update) > time()) { return false; } $timestamp = $last_update; if (!$timestamp) { $timestamp = time(); } try { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, sprintf('https://www.gomage.com/index.php/gomage_notification/index/data')); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, 'sku=product-designer&timestamp=' . $timestamp . '&ver=' . urlencode('2.4.0')); 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); try { $result = Zend_Json::decode($content); } catch (\Exception $e) { $result = array(); } if ($result && isset($result['frequency']) && ($result['frequency'] != $frequency)) { Mage::app()->saveCache($result['frequency'], 'gomage_notifications_frequency'); } if ($result && isset($result['data'])) { if (!empty($result['data'])) { Mage::getModel('adminnotification/inbox')->parse($result['data']); } } } catch (Exception $e) { } Mage::app()->saveCache(time(), 'gomage_notifications_last_update'); } }

Did this file decode correctly?

Original Code

<?php eval(base64_decode("LyoqICogR29NYWdlIFByb2R1Y3QgRGVzaWduZXIgRXh0ZW5zaW9uICogKiBAY2F0ZWdvcnkgRXh0ZW5zaW9uICogQGNvcHlyaWdodCBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiBHb01hZ2UgKGh0dHBzOi8vd3d3LmdvbWFnZS5jb20pICogQGF1dGhvciBHb01hZ2UgKiBAbGljZW5zZSBodHRwczovL3d3dy5nb21hZ2UuY29tL2xpY2Vuc2UtYWdyZWVtZW50LyBTaW5nbGUgZG9tYWluIGxpY2Vuc2UgKiBAdGVybXMgb2YgdXNlIGh0dHBzOi8vd3d3LmdvbWFnZS5jb20vdGVybXMtb2YtdXNlLyAqIEB2ZXJzaW9uIFJlbGVhc2U6IDIuNC4wICogQHNpbmNlIEF2YWlsYWJsZSBzaW5jZSBSZWxlYXNlIDEuMC4wICovIGNsYXNzIEdvTWFnZV9Qcm9kdWN0RGVzaWduZXJfSGVscGVyX0RhdGEgZXh0ZW5kcyBNYWdlX0NvcmVfSGVscGVyX0Fic3RyYWN0IHsgY29uc3QgQURWQU5DRURfTkFWSUdBVElPTl9NT0RVTEVfTkFNRSA9ICdHb01hZ2VfTmF2aWdhdGlvbic7IHByb3RlY3RlZCAkX2FsbG93ZWRQcm9kdWN0VHlwZXMgPSBhcnJheSggTWFnZV9DYXRhbG9nX01vZGVsX1Byb2R1Y3RfVHlwZTo6VFlQRV9TSU1QTEUsIE1hZ2VfQ2F0YWxvZ19Nb2RlbF9Qcm9kdWN0X1R5cGU6OlRZUEVfQ09ORklHVVJBQkxFICk7IHByb3RlY3RlZCAkX3Byb2R1Y3RTZXR0aW5nczsgcHJvdGVjdGVkICRfcHJvZHVjdERlc2lnbiA9IG51bGw7IHByb3RlY3RlZCAkX2VkaXRvckNvbmZpZyA9IG51bGw7IHB1YmxpYyBmdW5jdGlvbiBpc0VuYWJsZWQoKSB7IHJldHVybiBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZ29tYWdlX2Rlc2lnbmVyL2dlbmVyYWwvZW5hYmxlZCcsIE1hZ2U6OmFwcCgpLT5nZXRTdG9yZSgpKTsgfSBwdWJsaWMgZnVuY3Rpb24gaXNOYXZpZ2F0aW9uRW5hYmxlZCgpIHsgcmV0dXJuIE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdnb21hZ2VfZGVzaWduZXIvbmF2aWdhdGlvbi9lbmFibGVkJywgTWFnZTo6YXBwKCktPmdldFN0b3JlKCkpOyB9IHB1YmxpYyBmdW5jdGlvbiBhZHZhbmNlZE5hdmlnYXRpb25FbmFibGVkKCkgeyAkbW9kdWxlcyA9IChhcnJheSlNYWdlOjpnZXRDb25maWcoKS0+Z2V0Tm9kZSgnbW9kdWxlcycpLT5jaGlsZHJlbigpOyBpZiAoaXNzZXQoJG1vZHVsZXNbc2VsZjo6QURWQU5DRURfTkFWSUdBVElPTl9NT0RVTEVfTkFNRV0pKSB7ICRtb2R1bGUgPSAkbW9kdWxlc1tzZWxmOjpBRFZBTkNFRF9OQVZJR0FUSU9OX01PRFVMRV9OQU1FXTsgcmV0dXJuICRtb2R1bGUtPmlzKCdhY3RpdmUnKSAmJiBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZ29tYWdlX25hdmlnYXRpb24vZ2VuZXJhbC9tb2RlJyk7IH0gcmV0dXJuIGZhbHNlOyB9IHB1YmxpYyBmdW5jdGlvbiBpc0VudGVycHJpc2VFZGl0aW9uKCkgeyAkbW9kdWxlcyA9IChhcnJheSlNYWdlOjpnZXRDb25maWcoKS0+Z2V0Tm9kZSgnbW9kdWxlcycpLT5jaGlsZHJlbigpOyByZXR1cm4gaXNzZXQoJG1vZHVsZXNbJ0VudGVycHJpc2VfVGFyZ2V0UnVsZSddKTsgfSBwdWJsaWMgZnVuY3Rpb24gaXNNb2R1bGVFeGlzdHMoJG1vZHVsZU5hbWUpIHsgJG1vZHVsZXMgPSAoYXJyYXkpTWFnZTo6Z2V0Q29uZmlnKCktPmdldE5vZGUoJ21vZHVsZXMnKS0+Y2hpbGRyZW4oKTsgcmV0dXJuIGlzc2V0KCRtb2R1bGVzWyRtb2R1bGVOYW1lXSk7IH0gcHVibGljIGZ1bmN0aW9uIGdldElzQW55bW9yZVZlcnNpb24oJG1ham9yLCAkbWlub3IsICRyZXZpc2lvbiA9IDApIHsgJHZlcnNpb25faW5mbyA9IE1hZ2U6OmdldFZlcnNpb25JbmZvKCk7IGlmICgkdmVyc2lvbl9pbmZvWydtYWpvciddID4gJG1ham9yKSB7IHJldHVybiB0cnVlOyB9IGVsc2VpZiAoJHZlcnNpb25faW5mb1snbWFqb3InXSA9PSAkbWFqb3IpIHsgaWYgKCR2ZXJzaW9uX2luZm9bJ21pbm9yJ10gPiAkbWlub3IpIHsgcmV0dXJuIHRydWU7IH0gZWxzZWlmICgkdmVyc2lvbl9pbmZvWydtaW5vciddID09ICRtaW5vcikgeyBpZiAoJHZlcnNpb25faW5mb1sncmV2aXNpb24nXSA+PSAkcmV2aXNpb24pIHsgcmV0dXJuIHRydWU7IH0gfSB9IHJldHVybiBmYWxzZTsgfSAvKiogKiBSZXR1cm4gYWxsb3dlZCBwcm9kdWN0IHR5cGVzICogKiBAcmV0dXJuIGFycmF5ICovIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGxvd2VkUHJvZHVjdFR5cGVzKCkgeyByZXR1cm4gJHRoaXMtPl9hbGxvd2VkUHJvZHVjdFR5cGVzOyB9IHB1YmxpYyBmdW5jdGlvbiBoYXNDb2xvckF0dHJpYnV0ZSgpIHsgJGF0dHJpYnV0ZUNvZGUgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZ29tYWdlX2Rlc2lnbmVyL25hdmlnYXRpb24vY29sb3JfYXR0cmlidXRlJyk7ICRhdHRyaWJ1dGUgPSBNYWdlOjpnZXRTaW5nbGV0b24oJ2Vhdi9jb25maWcnKSAtPmdldEF0dHJpYnV0ZShNYWdlX0NhdGFsb2dfTW9kZWxfUHJvZHVjdDo6RU5USVRZLCAkYXR0cmlidXRlQ29kZSk7IHJldHVybiAkYXR0cmlidXRlLT5nZXRJZCgpOyB9IC8qKiAqIFJldHVybiBJbWFnZSBTZXR0aW5ncyAqICogQHBhcmFtIE1hZ2VfQ2F0YWxvZ19Nb2RlbF9Qcm9kdWN0ICRwcm9kdWN0IFByb2R1Y3QgKiBAcGFyYW0gaW50ICRpbWFnZUlkIEltYWdlIElkICogQHJldHVybiBib29sZWFufGFycmF5ICovIHB1YmxpYyBmdW5jdGlvbiBnZXRJbWFnZVNldHRpbmdzKE1hZ2VfQ2F0YWxvZ19Nb2RlbF9Qcm9kdWN0ICRwcm9kdWN0LCAkaW1hZ2VJZCkgeyAkc2V0dGluZ3MgPSAkdGhpcy0+Z2V0U2V0dGluZ3MoJHByb2R1Y3QpOyBpZiAoaXNzZXQoJHNldHRpbmdzWyRpbWFnZUlkXSkpIHsgcmV0dXJuICRzZXR0aW5nc1skaW1hZ2VJZF07IH0gcmV0dXJuIGZhbHNlOyB9IC8qKiAqIFJldHVybiBQcm9kdWN0IGltYWdlcyBzZXR0aW5ncyAqICogQHBhcmFtIE1hZ2VfQ2F0YWxvZ19Nb2RlbF9Qcm9kdWN0ICRwcm9kdWN0IFByb2R1Y3QgKiBAcmV0dXJuIGFycmF5ICovIHB1YmxpYyBmdW5jdGlvbiBnZXRTZXR0aW5ncyhNYWdlX0NhdGFsb2dfTW9kZWxfUHJvZHVjdCAkcHJvZHVjdCkgeyBpZiAoISR0aGlzLT5fcHJvZHVjdFNldHRpbmdzKSB7ICRzZXR0aW5ncyA9IGFycmF5KCk7ICRpbWFnZXMgPSAkcHJvZHVjdC0+Z2V0TWVkaWFHYWxsZXJ5SW1hZ2VzKCk7IGZvcmVhY2ggKCRpbWFnZXMgYXMgJGltYWdlKSB7ICRkZXNpZ25BcmVhID0gTWFnZTo6aGVscGVyKCdjb3JlJyktPmpzb25EZWNvZGUoJGltYWdlWydkZXNpZ25fYXJlYSddKTsgJGltYWdlSWQgPSAkaW1hZ2VbJ3ZhbHVlX2lkJ107IGlmICgkZGVzaWduQXJlYSAmJiAhZW1wdHkoJGRlc2lnbkFyZWEpKSB7ICRpbWFnZVVybCA9ICR0aGlzLT5nZXREZXNpZ25JbWFnZVVybCgkcHJvZHVjdCwgJGltYWdlKTsgJGRpbWVuc2lvbnMgPSAkdGhpcy0+Z2V0SW1hZ2VEaW1lbnNpb25zKCRpbWFnZVVybCk7ICRiYXNlVXJsID0gTWFnZTo6Z2V0QmFzZVVybCgnbWVkaWEnKTsgJGJhc2VEaXIgPSBNYWdlOjpnZXRCYXNlRGlyKCdtZWRpYScpIC4gRFM7ICRkZXNpZ25BcmVhWydwYXRoJ10gPSBzdHJfcmVwbGFjZSgkYmFzZVVybCwgJGJhc2VEaXIsICRpbWFnZVVybCk7ICRkZXNpZ25BcmVhWydkaW1lbnNpb25zJ10gPSBhcnJheSggJ3dpZHRoJyA9PiAkZGltZW5zaW9uc1swXSwgJ2hlaWdodCcgPT4gJGRpbWVuc2lvbnNbMV0gKTsgJGRlc2lnbkFyZWFbJ29yaWdpbmFsX2ltYWdlJ10gPSAkdGhpcy0+Z2V0T3JpZ2luYWxJbWFnZSgkcHJvZHVjdCwgJGltYWdlKTsgaWYgKGlzc2V0KCRkZXNpZ25BcmVhWydvcmlnaW5hbF9pbWFnZSddWyd1cmwnXSkpIHsgJGRlc2lnbkFyZWFbJ29yaWdpbmFsX2ltYWdlJ11bJ3BhdGgnXSA9IHN0cl9yZXBsYWNlKCAkYmFzZVVybCwgJGJhc2VEaXIsICRkZXNpZ25BcmVhWydvcmlnaW5hbF9pbWFnZSddWyd1cmwnXSApOyB9ICRzZXR0aW5nc1skaW1hZ2VJZF0gPSAkZGVzaWduQXJlYTsgfSB9ICR0aGlzLT5fcHJvZHVjdFNldHRpbmdzID0gJHNldHRpbmdzOyB9IHJldHVybiAkdGhpcy0+X3Byb2R1Y3RTZXR0aW5nczsgfSBwdWJsaWMgZnVuY3Rpb24ganNvbkRlY29kZSgkc3RyaW5nKSB7ICRzZXR0aW5ncyA9IE1hZ2U6OmhlbHBlcignY29yZScpLT5qc29uRGVjb2RlKCRzdHJpbmcpOyAkcmVzdWx0ID0gYXJyYXkoKTsgZm9yZWFjaCAoJHNldHRpbmdzIGFzICRpID0+ICR2KSB7ICRyZXN1bHRbJGldID0gKGFycmF5KSR2OyBpZiAoIWlzc2V0KCRyZXN1bHRbJGldWydzJ10pKSB7ICRyZXN1bHRbJGldWydzJ10gPSAxOyB9IH0gcmV0dXJuICRyZXN1bHQ7IH0gcHVibGljIGZ1bmN0aW9uIGdldEltYWdlRGltZW5zaW9ucygkaW1hZ2VQYXRoKSB7ICRkaXJJbWcgPSBNYWdlOjpnZXRCYXNlRGlyKCkgLiBzdHJfcmVwbGFjZSgiLyIsIERTLCBzdHJzdHIoJGltYWdlUGF0aCwgJy9tZWRpYScpKTsgaWYgKGZpbGVfZXhpc3RzKCRkaXJJbWcpKSB7ICRpbWFnZU9iaiA9IG5ldyBWYXJpZW5fSW1hZ2UoJGRpckltZyk7ICR3aWR0aCA9ICRpbWFnZU9iai0+Z2V0T3JpZ2luYWxXaWR0aCgpOyAkaGVpZ2h0ID0gJGltYWdlT2JqLT5nZXRPcmlnaW5hbEhlaWdodCgpOyByZXR1cm4gYXJyYXkoJHdpZHRoLCAkaGVpZ2h0KTsgfSByZXR1cm4gYXJyYXkoMCwgMCk7IH0gcHVibGljIGZ1bmN0aW9uIHByZXBhcmVEZXNpZ25lclNlc3Npb25JZCgpIHsgJGN1c3RvbWVyU2Vzc2lvbiA9ICR0aGlzLT5fZ2V0Q3VzdG9tZXJTZXNzaW9uKCk7IGlmICghJGN1c3RvbWVyU2Vzc2lvbi0+Z2V0RGVzaWduZXJTZXNzaW9uSWQoKSkgeyAkY3VzdG9tZXJTZXNzaW9uLT5zZXREZXNpZ25lclNlc3Npb25JZChzaGExKHJhbmQoMCwgMTAwMCkgLiBtaWNyb3RpbWUodHJ1ZSkpKTsgfSB9IHB1YmxpYyBmdW5jdGlvbiBnZXREZXNpZ25lclNlc3Npb25JZCgpIHsgJHNlc3Npb25JZCA9ICR0aGlzLT5fZ2V0Q3VzdG9tZXJTZXNzaW9uKCktPmdldEVuY3J5cHRlZFNlc3Npb25JZCgpOyByZXR1cm4gJHNlc3Npb25JZDsgfSBwcm90ZWN0ZWQgZnVuY3Rpb24gX2dldEN1c3RvbWVyU2Vzc2lvbigpIHsgcmV0dXJuIE1hZ2U6OmdldFNpbmdsZXRvbignY3VzdG9tZXIvc2Vzc2lvbicpOyB9IHB1YmxpYyBmdW5jdGlvbiBnZXREZXNpZ25XaWR0aCgpIHsgcmV0dXJuIEdvTWFnZV9Qcm9kdWN0RGVzaWduZXJfTW9kZWxfRGVzaWduOjpERVNJR05fU0laRV9XSURUSDsgfSBwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzaWduSGVpZ2h0KCkgeyByZXR1cm4gR29NYWdlX1Byb2R1Y3REZXNpZ25lcl9Nb2RlbF9EZXNpZ246OkRFU0lHTl9TSVpFX0hFSUdIVDsgfSAvKiogKiBSZXR1cm4gSW1hZ2UgVXJsICogKiBAcGFyYW0gTWFnZV9DYXRhbG9nX01vZGVsX1Byb2R1Y3QgJHByb2R1Y3QgUHJvZHVjdCAqIEBwYXJhbSBWYXJpZW5fT2JqZWN0ICRpbWFnZSBJbWFnZSAqIEBwYXJhbSBhcnJheSAkc2l6ZSBTaXplICogQHJldHVybiBzdHJpbmcgKi8gcHVibGljIGZ1bmN0aW9uIGdldERlc2lnbkltYWdlVXJsKE1hZ2VfQ2F0YWxvZ19Nb2RlbF9Qcm9kdWN0ICRwcm9kdWN0LCAkaW1hZ2UsICRzaXplID0gYXJyYXkoKSkgeyBpZiAoZW1wdHkoJHNpemUpKSB7ICRpbWFnZVdpZHRoID0gJHRoaXMtPmdldERlc2lnbldpZHRoKCk7ICRpbWFnZUhlaWdodCA9ICR0aGlzLT5nZXREZXNpZ25IZWlnaHQoKTsgfSBlbHNlIHsgbGlzdCgkaW1hZ2VXaWR0aCwgJGltYWdlSGVpZ2h0KSA9ICRzaXplOyB9ICRpbWFnZUZpbGUgPSBpc19vYmplY3QoJGltYWdlKSA/ICRpbWFnZS0+Z2V0RmlsZSgpIDogJGltYWdlWydmaWxlJ107IHJldHVybiBNYWdlOjpoZWxwZXIoJ2NhdGFsb2cvaW1hZ2UnKSAtPmluaXQoJHByb2R1Y3QsICdiYXNlX2ltYWdlJywgJGltYWdlRmlsZSkgLT5rZWVwRnJhbWUoZmFsc2UpIC0+cmVzaXplKCRpbWFnZVdpZHRoLCAkaW1hZ2VIZWlnaHQpIC0+X190b1N0cmluZygpOyB9IHB1YmxpYyBmdW5jdGlvbiBnZXRPcmlnaW5hbEltYWdlKE1hZ2VfQ2F0YWxvZ19Nb2RlbF9Qcm9kdWN0ICRwcm9kdWN0LCAkaW1hZ2UpIHsgJGltYWdlRmlsZSA9IGlzX29iamVjdCgkaW1hZ2UpID8gJGltYWdlLT5nZXRGaWxlKCkgOiAkaW1hZ2VbJ2ZpbGUnXTsgJGltYWdlUGF0aCA9ICRwcm9kdWN0LT5nZXRNZWRpYUNvbmZpZygpLT5nZXRNZWRpYVBhdGgoJGltYWdlRmlsZSk7ICRtaW5XaWR0aCA9IE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdnb21hZ2VfZGVzaWduZXIvZ2VuZXJhbC96b29tX3NpemVfd2lkdGgnKTsgJG1pbkhlaWdodCA9IE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdnb21hZ2VfZGVzaWduZXIvZ2VuZXJhbC96b29tX3NpemVfaGVpZ2h0Jyk7IGlmIChmaWxlX2V4aXN0cygkaW1hZ2VQYXRoKSkgeyAkaW1hZ2VPYmogPSBuZXcgVmFyaWVuX0ltYWdlKCRpbWFnZVBhdGgpOyAkd2lkdGggPSAkaW1hZ2VPYmotPmdldE9yaWdpbmFsV2lkdGgoKTsgJGhlaWdodCA9ICRpbWFnZU9iai0+Z2V0T3JpZ2luYWxIZWlnaHQoKTsgJGRpbWVuc2lvbnMgPSBhcnJheSgpOyBpZiAoJHdpZHRoIDwgJG1pbldpZHRoICYmICRoZWlnaHQgPCAkbWluSGVpZ2h0KSB7ICRkaW1lbnNpb25zWzBdID0gJG1pbldpZHRoOyAkZGltZW5zaW9uc1sxXSA9ICRtaW5IZWlnaHQ7IH0gZWxzZSB7ICRkaW1lbnNpb25zWzBdID0gJHdpZHRoOyAkZGltZW5zaW9uc1sxXSA9ICRoZWlnaHQ7IH0gcmV0dXJuIGFycmF5KCAndXJsJyA9PiAkdGhpcy0+Z2V0RGVzaWduSW1hZ2VVcmwoJHByb2R1Y3QsICRpbWFnZSwgJGRpbWVuc2lvbnMpLCAnZGltZW5zaW9ucycgPT4gJGRpbWVuc2lvbnMgKTsgfSByZXR1cm4gYXJyYXkoKTsgfSBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvZHVjdFNldHRpbmdGb3JFZGl0b3IoTWFnZV9DYXRhbG9nX01vZGVsX1Byb2R1Y3QgJHByb2R1Y3QgPSBudWxsKSB7IGlmICghJHRoaXMtPl9lZGl0b3JDb25maWcpIHsgaWYgKGlzX251bGwoJHByb2R1Y3QpKSB7ICRwcm9kdWN0ID0gTWFnZTo6cmVnaXN0cnkoJ3Byb2R1Y3QnKTsgfSAkZWRpdG9yQ29uZmlnID0gYXJyYXkoICdpbWFnZXMnID0+IGFycmF5KCkgKTsgaWYgKCEkcHJvZHVjdC0+Z2V0SWQoKSkgeyByZXR1cm4gJGVkaXRvckNvbmZpZzsgfSAkaW1hZ2VzID0gJHByb2R1Y3QtPmdldE1lZGlhR2FsbGVyeUltYWdlcygpOyAkY29sb3JBdHRyaWJ1dGVDb2RlID0gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2dvbWFnZV9kZXNpZ25lci9uYXZpZ2F0aW9uL2NvbG9yX2F0dHJpYnV0ZScpOyAkZGVmYXVsdENvbG9yID0gbnVsbDsgZm9yZWFjaCAoJGltYWdlcyBhcyAkaW1hZ2UpIHsgJGlkID0gJGltYWdlWyd2YWx1ZV9pZCddOyAkc2V0dGluZ3MgPSBNYWdlOjpoZWxwZXIoJ2NvcmUnKS0+anNvbkRlY29kZSgkaW1hZ2VbJ2Rlc2lnbl9hcmVhJ10pOyBpZiAoISRzZXR0aW5ncyB8fCBlbXB0eSgkc2V0dGluZ3MpKSB7IGNvbnRpbnVlOyB9ICRpbWFnZVVybCA9ICR0aGlzLT5nZXREZXNpZ25JbWFnZVVybCgkcHJvZHVjdCwgJGltYWdlKTsgJGNvbmYgPSAkc2V0dGluZ3M7ICRjb25mWydpZCddID0gJGlkOyAkY29uZlsndSddID0gJGltYWdlVXJsOyAkY29uZlsnZCddID0gJHRoaXMtPmdldEltYWdlRGltZW5zaW9ucygkaW1hZ2VVcmwpOyAkY29uZlsnb3JpZ19pbWFnZSddID0gJHRoaXMtPmdldE9yaWdpbmFsSW1hZ2UoJHByb2R1Y3QsICRpbWFnZSk7ICRjb25mWydpY28nXSA9ICR0aGlzLT5nZXREZXNpZ25JbWFnZVVybCgkcHJvZHVjdCwgJGltYWdlLCBhcnJheSg2MCwgNjApKTsgaWYgKCRwcm9kdWN0LT5nZXRUeXBlSWQoKSA9PSBNYWdlX0NhdGFsb2dfTW9kZWxfUHJvZHVjdF9UeXBlOjpUWVBFX0NPTkZJR1VSQUJMRSkgeyBpZiAoJGltYWdlWydjb2xvciddKSB7IGlmIChpc19udWxsKCRkZWZhdWx0Q29sb3IpKSB7ICRkZWZhdWx0Q29sb3IgPSAkaW1hZ2VbJ2NvbG9yJ107IH0gaWYgKCFpc3NldCgkZWRpdG9yQ29uZmlnWydpbWFnZXMnXVskaW1hZ2VbJ2NvbG9yJ11dKSkgeyAkZWRpdG9yQ29uZmlnWydpbWFnZXMnXVskaW1hZ2VbJ2NvbG9yJ11dID0gYXJyYXkoKTsgfSAkZWRpdG9yQ29uZmlnWydpbWFnZXMnXVskaW1hZ2VbJ2NvbG9yJ11dWyRpZF0gPSAkY29uZjsgfSBlbHNlIHsgJGRlZmF1bHRDb2xvciA9ICRwcm9kdWN0LT5nZXREYXRhKCRjb2xvckF0dHJpYnV0ZUNvZGUpID86ICdub25lX2NvbG9yJzsgJGVkaXRvckNvbmZpZ1snaW1hZ2VzJ11bJGRlZmF1bHRDb2xvcl1bJGlkXSA9ICRjb25mOyB9IH0gZWxzZSB7ICRkZWZhdWx0Q29sb3IgPSAnbm9uZV9jb2xvcic7ICRlZGl0b3JDb25maWdbJ2ltYWdlcyddWyRkZWZhdWx0Q29sb3JdWyRpZF0gPSAkY29uZjsgfSAkZWRpdG9yQ29uZmlnWydkZWZhdWx0X2NvbG9yJ10gPSAkZGVmYXVsdENvbG9yOyAkZWRpdG9yQ29uZmlnWyd1cmwnXSA9ICRwcm9kdWN0LT5nZXRQcm9kdWN0VXJsKCk7ICRlZGl0b3JDb25maWdbJ25hbWUnXSA9ICRwcm9kdWN0LT5nZXROYW1lKCk7IH0gJHRoaXMtPl9lZGl0b3JDb25maWcgPSAkZWRpdG9yQ29uZmlnOyB9IHJldHVybiAkdGhpcy0+X2VkaXRvckNvbmZpZzsgfSAvKiogKiBTYXZlIHByb2R1Y3QgZGVzaWduIGltYWdlcyAqICogQHJldHVybiBHb01hZ2VfUHJvZHVjdERlc2lnbmVyX01vZGVsX0Rlc2lnbiAqIEB0aHJvd3MgRXhjZXB0aW9uICovIHB1YmxpYyBmdW5jdGlvbiBzYXZlUHJvZHVjdERlc2lnbmVkSW1hZ2VzKCkgeyAkcHJvZHVjdCA9ICR0aGlzLT5pbml0aWFsaXplUHJvZHVjdCgpOyAkaW1hZ2VzID0gTWFnZTo6YXBwKCktPmdldFJlcXVlc3QoKS0+Z2V0UGFyYW0oJ2ltYWdlcycpOyBpZiAoJHByb2R1Y3QtPmdldElkKCkgJiYgJGltYWdlcyAmJiAhZW1wdHkoJGltYWdlcykpIHsgJGRlc2lnbiA9IE1hZ2U6OmdldE1vZGVsKCdnb21hZ2VfZGVzaWduZXIvZGVzaWduJyktPnNhdmVEZXNpZ24oJHByb2R1Y3QsICR0aGlzLT5fZ2V0UmVxdWVzdCgpLT5nZXRQYXJhbXMoKSk7IHJldHVybiAkZGVzaWduOyB9IGVsc2VpZiAoISRwcm9kdWN0LT5nZXRJZCgpKSB7IHRocm93IG5ldyBFeGNlcHRpb24oTWFnZTo6aGVscGVyKCdnb21hZ2VfZGVzaWduZXInKS0+X18oJ1Byb2R1Y3QgaXMgbm90IGRlZmluZWQnKSk7IH0gZWxzZWlmICghJGltYWdlcyB8fCBlbXB0eSgkaW1hZ2VzKSkgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKE1hZ2U6OmhlbHBlcignZ29tYWdlX2Rlc2lnbmVyJyktPl9fKCdEZXNpZ25lZCBpbWFnZXMgYXJlIGVtcHR5JykpOyB9IH0gLyoqICogSW5pdGlhbGl6ZSBjdXJyZW50IHByb2R1Y3QgZnJvbSByZXF1ZXN0ICogKiBAcmV0dXJuIE1hZ2VfQ2F0YWxvZ19Nb2RlbF9Qcm9kdWN0ICovIHB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplUHJvZHVjdCgpIHsgJHByb2R1Y3QgPSBNYWdlOjpyZWdpc3RyeSgncHJvZHVjdCcpOyBpZiAoJHByb2R1Y3QpIHsgcmV0dXJuICRwcm9kdWN0OyB9ICRyZXF1ZXN0ID0gTWFnZTo6YXBwKCktPmdldFJlcXVlc3QoKTsgJHByb2R1Y3RJZCA9ICRyZXF1ZXN0LT5nZXRQYXJhbSgiaWQiLCBmYWxzZSk7ICRwcm9kdWN0ID0gTWFnZTo6Z2V0TW9kZWwoJ2NhdGFsb2cvcHJvZHVjdCcpOyBpZiAoJHByb2R1Y3RJZCkgeyAkcHJvZHVjdC0+bG9hZCgkcHJvZHVjdElkKTsgfSBNYWdlOjpyZWdpc3RlcigncHJvZHVjdCcsICRwcm9kdWN0KTsgcmV0dXJuICRwcm9kdWN0OyB9IC8qKiAqIFByaWNlIGNhbGN1bGF0aW9uIGRlcGVuZGluZyBvbiBwcm9kdWN0IG9wdGlvbnMgKiAqIEByZXR1cm4gYXJyYXkgKi8gcHVibGljIGZ1bmN0aW9uIGdldFByb2R1Y3RQcmljZUNvbmZpZygpIHsgJGNvbmZpZyA9IGFycmF5KCk7ICRfcmVxdWVzdCA9IE1hZ2U6OmdldFNpbmdsZXRvbigndGF4L2NhbGN1bGF0aW9uJyktPmdldFJhdGVSZXF1ZXN0KGZhbHNlLCBmYWxzZSwgZmFsc2UpOyAvKiBAdmFyICRwcm9kdWN0IE1hZ2VfQ2F0YWxvZ19Nb2RlbF9Qcm9kdWN0ICovICRwcm9kdWN0ID0gJHRoaXMtPmluaXRpYWxpemVQcm9kdWN0KCk7ICRfcmVxdWVzdC0+c2V0UHJvZHVjdENsYXNzSWQoJHByb2R1Y3QtPmdldFRheENsYXNzSWQoKSk7ICRkZWZhdWx0VGF4ID0gTWFnZTo6Z2V0U2luZ2xldG9uKCd0YXgvY2FsY3VsYXRpb24nKS0+Z2V0UmF0ZSgkX3JlcXVlc3QpOyAkX3JlcXVlc3QgPSBNYWdlOjpnZXRTaW5nbGV0b24oJ3RheC9jYWxjdWxhdGlvbicpLT5nZXRSYXRlUmVxdWVzdCgpOyAkX3JlcXVlc3QtPnNldFByb2R1Y3RDbGFzc0lkKCRwcm9kdWN0LT5nZXRUYXhDbGFzc0lkKCkpOyAkY3VycmVudFRheCA9IE1hZ2U6OmdldFNpbmdsZXRvbigndGF4L2NhbGN1bGF0aW9uJyktPmdldFJhdGUoJF9yZXF1ZXN0KTsgJF9yZWd1bGFyUHJpY2UgPSAkcHJvZHVjdC0+Z2V0UHJpY2UoKTsgJF9maW5hbFByaWNlID0gJHByb2R1Y3QtPmdldEZpbmFsUHJpY2UoKTsgJF9wcmljZUluY2xUYXggPSBNYWdlOjpoZWxwZXIoJ3RheCcpLT5nZXRQcmljZSgkcHJvZHVjdCwgJF9maW5hbFByaWNlLCB0cnVlKTsgJF9wcmljZUV4Y2xUYXggPSBNYWdlOjpoZWxwZXIoJ3RheCcpLT5nZXRQcmljZSgkcHJvZHVjdCwgJF9maW5hbFByaWNlKTsgJF90aWVyUHJpY2VzID0gYXJyYXkoKTsgJF90aWVyUHJpY2VzSW5jbFRheCA9IGFycmF5KCk7IGZvcmVhY2ggKCRwcm9kdWN0LT5nZXRUaWVyUHJpY2UoKSBhcyAkdGllclByaWNlKSB7ICRfdGllclByaWNlc1tdID0gTWFnZTo6aGVscGVyKCdjb3JlJyktPmN1cnJlbmN5KCR0aWVyUHJpY2VbJ3dlYnNpdGVfcHJpY2UnXSwgZmFsc2UsIGZhbHNlKTsgJF90aWVyUHJpY2VzSW5jbFRheFtdID0gTWFnZTo6aGVscGVyKCdjb3JlJyktPmN1cnJlbmN5KCBNYWdlOjpoZWxwZXIoJ3RheCcpLT5nZXRQcmljZSgkcHJvZHVjdCwgKGludCkkdGllclByaWNlWyd3ZWJzaXRlX3ByaWNlJ10sIHRydWUpLCBmYWxzZSwgZmFsc2UgKTsgfSAkY29uZmlnID0gYXJyYXkoICdwcm9kdWN0SWQnID0+ICRwcm9kdWN0LT5nZXRJZCgpLCAncHJpY2VGb3JtYXQnID0+IE1hZ2U6OmFwcCgpLT5nZXRMb2NhbGUoKS0+Z2V0SnNQcmljZUZvcm1hdCgpLCAnaW5jbHVkZVRheCcgPT4gTWFnZTo6aGVscGVyKCd0YXgnKS0+cHJpY2VJbmNsdWRlc1RheCgpID8gJ3RydWUnIDogJ2ZhbHNlJywgJ3Nob3dJbmNsdWRlVGF4JyA9PiBNYWdlOjpoZWxwZXIoJ3RheCcpLT5kaXNwbGF5UHJpY2VJbmNsdWRpbmdUYXgoKSwgJ3Nob3dCb3RoUHJpY2VzJyA9PiBNYWdlOjpoZWxwZXIoJ3RheCcpLT5kaXNwbGF5Qm90aFByaWNlcygpLCAncHJvZHVjdFByaWNlJyA9PiBNYWdlOjpoZWxwZXIoJ2NvcmUnKS0+Y3VycmVuY3koJF9maW5hbFByaWNlLCBmYWxzZSwgZmFsc2UpLCAncHJvZHVjdE9sZFByaWNlJyA9PiBNYWdlOjpoZWxwZXIoJ2NvcmUnKS0+Y3VycmVuY3koJF9yZWd1bGFyUHJpY2UsIGZhbHNlLCBmYWxzZSksICdwcmljZUluY2xUYXgnID0+IE1hZ2U6OmhlbHBlcignY29yZScpLT5jdXJyZW5jeSgkX3ByaWNlSW5jbFRheCwgZmFsc2UsIGZhbHNlKSwgJ3ByaWNlRXhjbFRheCcgPT4gTWFnZTo6aGVscGVyKCdjb3JlJyktPmN1cnJlbmN5KCRfcHJpY2VFeGNsVGF4LCBmYWxzZSwgZmFsc2UpLCAvKiogKiBAdmFyIHNraXBDYWxjdWxhdGUgKiBAZGVwcmVjYXRlZCBhZnRlciAxLjUuMS4wICovICdza2lwQ2FsY3VsYXRlJyA9PiAoJF9wcmljZUV4Y2xUYXggIT0gJF9wcmljZUluY2xUYXggPyAwIDogMSksICdkZWZhdWx0VGF4JyA9PiAkZGVmYXVsdFRheCwgJ2N1cnJlbnRUYXgnID0+ICRjdXJyZW50VGF4LCAnaWRTdWZmaXgnID0+ICdfY2xvbmUnLCAnb2xkUGx1c0Rpc3Bvc2l0aW9uJyA9PiAwLCAncGx1c0Rpc3Bvc2l0aW9uJyA9PiAwLCAncGx1c0Rpc3Bvc2l0aW9uVGF4JyA9PiAwLCAnb2xkTWludXNEaXNwb3NpdGlvbicgPT4gMCwgJ21pbnVzRGlzcG9zaXRpb24nID0+IDAsICd0aWVyUHJpY2VzJyA9PiAkX3RpZXJQcmljZXMsICd0aWVyUHJpY2VzSW5jbFRheCcgPT4gJF90aWVyUHJpY2VzSW5jbFRheCwgKTsgJHJlc3BvbnNlT2JqZWN0ID0gbmV3IFZhcmllbl9PYmplY3QoKTsgTWFnZTo6ZGlzcGF0Y2hFdmVudCgnY2F0YWxvZ19wcm9kdWN0X3ZpZXdfY29uZmlnJywgYXJyYXkoJ3Jlc3BvbnNlX29iamVjdCcgPT4gJHJlc3BvbnNlT2JqZWN0KSk7IGlmIChpc19hcnJheSgkcmVzcG9uc2VPYmplY3QtPmdldEFkZGl0aW9uYWxPcHRpb25zKCkpKSB7IGZvcmVhY2ggKCRyZXNwb25zZU9iamVjdC0+Z2V0QWRkaXRpb25hbE9wdGlvbnMoKSBhcyAkb3B0aW9uID0+ICR2YWx1ZSkgeyAkY29uZmlnWyRvcHRpb25dID0gJHZhbHVlOyB9IH0gcmV0dXJuICRjb25maWc7IH0gcHVibGljIGZ1bmN0aW9uIGZvcm1hdEZpbGVOYW1lKCRmaWxlKSB7ICRmb3JtYXRSZXN1bHQgPSBNYWdlOjpoZWxwZXIoJ2NhdGFsb2cvcHJvZHVjdF91cmwnKS0+Zm9ybWF0KCRmaWxlKTsgcmV0dXJuIHByZWdfcmVwbGFjZSgnI1tcc10rI2knLCAnLScsICRmb3JtYXRSZXN1bHQpOyB9IHB1YmxpYyBmdW5jdGlvbiBjYW5BcHBseU1zcnAoJHByb2R1Y3QsICR2aXNpYmlsaXR5ID0gbnVsbCwgJGNoZWNrQXNzb2NpYXRlZEl0ZW1zID0gdHJ1ZSkgeyAkdmVyc2lvbiA9IE1hZ2U6OmdldFZlcnNpb25JbmZvKCk7IGlmICgoJHZlcnNpb25bJ21ham9yJ10gPT09ICcxJykgJiYgKChpbnQpJHZlcnNpb25bJ21pbm9yJ10gPD0gNSkpIHsgcmV0dXJuIGZhbHNlOyB9IGVsc2VpZiAobWV0aG9kX2V4aXN0cyhNYWdlOjpoZWxwZXIoJ2NhdGFsb2cnKSwgJ2NhbkFwcGx5TXNycCcpKSB7IHJldHVybiBNYWdlOjpoZWxwZXIoJ2NhdGFsb2cnKS0+Y2FuQXBwbHlNc3JwKCRwcm9kdWN0LCAkdmlzaWJpbGl0eSwgJGNoZWNrQXNzb2NpYXRlZEl0ZW1zKTsgfSByZXR1cm4gZmFsc2U7IH0gLyoqICogUmV0cmlldmUgdXJsIGZvciBhZGRpbmcgcHJvZHVjdCB0byB3aXNobGlzdCAqICogQHBhcmFtIGludCAkaXRlbUlkICogKiBAcmV0dXJuIHN0cmluZyAqLyBwdWJsaWMgZnVuY3Rpb24gZ2V0TW92ZUZyb21DYXJ0VXJsKCRpdGVtSWQpIHsgJHZlcnNpb24gPSBNYWdlOjpnZXRWZXJzaW9uSW5mbygpOyBpZiAoKCR2ZXJzaW9uWydtYWpvciddID09PSAnMScpICYmICgoaW50KSR2ZXJzaW9uWydtaW5vciddIDw9IDUpKSB7IHJldHVybiBmYWxzZTsgfSBlbHNlIHsgaWYgKG1ldGhvZF9leGlzdHMoTWFnZTo6aGVscGVyKCd3aXNobGlzdCcpLCAnZ2V0TW92ZUZyb21DYXJ0VXJsJykpIHsgcmV0dXJuIE1hZ2U6OmhlbHBlcignd2lzaGxpc3QnKS0+Z2V0TW92ZUZyb21DYXJ0VXJsKCRpdGVtSWQpOyB9IH0gcmV0dXJuIGZhbHNlOyB9IC8qKiAqIEdldCBKU09OIGVuY29kZWQgY29uZmlndXJhdGlvbiBhcnJheSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgSlMgZHluYW1pYyAqICogQHJldHVybiBzdHJpbmcgKi8gcHVibGljIGZ1bmN0aW9uIGdldFByb2R1Y3RQcmljZUNvbmZpZ0pzb24oKSB7IHJldHVybiBNYWdlOjpoZWxwZXIoJ2NvcmUnKS0+anNvbkVuY29kZSgkdGhpcy0+Z2V0UHJvZHVjdFByaWNlQ29uZmlnKCkpOyB9IC8qKiAqIFJldHVybiBwcm9kdWN0IGRlc2lnbiBmcm9tIHJlcXVlc3QgKiAqIEBwYXJhbSBNYWdlX0NhdGFsb2dfTW9kZWxfUHJvZHVjdCAkcHJvZHVjdCBQcm9kdWN0ICogQHJldHVybiBib29sfE1hZ2VfQ29yZV9Nb2RlbF9BYnN0cmFjdCAqLyBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvZHVjdERlc2lnbigkcHJvZHVjdCkgeyBpZiAoaXNfbnVsbCgkdGhpcy0+X3Byb2R1Y3REZXNpZ24pKSB7ICRkZXNpZ25JZCA9IChpbnQpTWFnZTo6YXBwKCktPmdldFJlcXVlc3QoKS0+Z2V0UGFyYW0oJ2Rlc2lnbl9pZCcsIGZhbHNlKTsgaWYgKCRkZXNpZ25JZCkgeyAkZGVzaWduID0gTWFnZTo6Z2V0TW9kZWwoJ2dvbWFnZV9kZXNpZ25lci9kZXNpZ24nKS0+bG9hZCgkZGVzaWduSWQpOyBpZiAoJGRlc2lnbi0+Z2V0SWQoKSAmJiAkZGVzaWduLT5nZXRQcm9kdWN0SWQoKSA9PSAkcHJvZHVjdC0+Z2V0SWQoKSkgeyAkdGhpcy0+X3Byb2R1Y3REZXNpZ24gPSAkZGVzaWduOyB9IGVsc2UgeyAkdGhpcy0+X3Byb2R1Y3REZXNpZ24gPSBmYWxzZTsgfSB9IH0gcmV0dXJuICR0aGlzLT5fcHJvZHVjdERlc2lnbjsgfSBwdWJsaWMgZnVuY3Rpb24gZ2V0QWxsU3RvcmVEb21haW5zKCkgeyAkZG9tYWlucyA9IGFycmF5KCk7IGZvcmVhY2ggKE1hZ2U6OmFwcCgpLT5nZXRXZWJzaXRlcygpIGFzICR3ZWJzaXRlKSB7ICR1cmwgPSAkd2Vic2l0ZS0+Z2V0Q29uZmlnKCd3ZWIvdW5zZWN1cmUvYmFzZV91cmwnKTsgaWYgKCRkb21haW4gPSB0cmltKHByZWdfcmVwbGFjZSgnL14uKj9cXC9cXC8oLiopP1xcLy8nLCAnJDEnLCAkdXJsKSkpIHsgJGRvbWFpbnNbXSA9ICRkb21haW47IH0gJHVybCA9ICR3ZWJzaXRlLT5nZXRDb25maWcoJ3dlYi9zZWN1cmUvYmFzZV91cmwnKTsgaWYgKCRkb21haW4gPSB0cmltKHByZWdfcmVwbGFjZSgnL14uKj9cXC9cXC8oLiopP1xcLy8nLCAnJDEnLCAkdXJsKSkpIHsgJGRvbWFpbnNbXSA9ICRkb21haW47IH0gfSByZXR1cm4gYXJyYXlfdW5pcXVlKCRkb21haW5zKTsgfSBwdWJsaWMgZnVuY3Rpb24gZ2V0V2luZG93Q3NzUGF0aCgpIHsgaWYgKCEkdGhpcy0+Z2V0SXNBbnltb3JlVmVyc2lvbigxLCA3KSkgeyByZXR1cm4gJ3Byb3RvdHlwZS93aW5kb3dzL3RoZW1lcy9tYWdlbnRvLmNzcyc7IH0gZWxzZSB7IHJldHVybiAnbGliL3Byb3RvdHlwZS93aW5kb3dzL3RoZW1lcy9tYWdlbnRvLmNzcyc7IH0gfSBwdWJsaWMgZnVuY3Rpb24gZ2V0Q3NzVHlwZSgpIHsgaWYgKCEkdGhpcy0+Z2V0SXNBbnltb3JlVmVyc2lvbigxLCA3KSkgeyByZXR1cm4gJ2pzX2Nzcyc7IH0gZWxzZSB7IHJldHVybiAnc2tpbl9jc3MnOyB9IH0gcHVibGljIGZ1bmN0aW9uIGdldEF2YWlsYWJsZVdlYnNpdGVzKCkgeyByZXR1cm4gJHRoaXMtPl93KCk7IH0gcHJvdGVjdGVkIGZ1bmN0aW9uIF93KCkgeyBpZiAoIU1hZ2U6OmdldFN0b3JlQ29uZmlnKCdnb21hZ2VfYWN0aXZhdGlvbi9kZXNpZ25lci9pbnN0YWxsZWQnKSB8fCAoaW50dmFsKE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdnb21hZ2VfYWN0aXZhdGlvbi9kZXNpZ25lci9jb3VudCcpKSA+IDEwKSApIHsgcmV0dXJuIGFycmF5KCk7IH0gJHRpbWVfdG9fdXBkYXRlID0gNjAgKiA2MCAqIDI0ICogMTU7ICRyID0gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2dvbWFnZV9hY3RpdmF0aW9uL2Rlc2lnbmVyL2FyJyk7ICR0ID0gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2dvbWFnZV9hY3RpdmF0aW9uL2Rlc2lnbmVyL3RpbWUnKTsgJHMgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZ29tYWdlX2FjdGl2YXRpb24vZGVzaWduZXIvd2Vic2l0ZXMnKTsgJGxhc3RfY2hlY2sgPSBzdHJfcmVwbGFjZSgkciwgJycsIE1hZ2U6OmhlbHBlcignY29yZScpLT5kZWNyeXB0KCR0KSk7ICRhbGxzaXRlcyA9IGV4cGxvZGUoJywnLCBzdHJfcmVwbGFjZSgkciwgJycsIE1hZ2U6OmhlbHBlcignY29yZScpLT5kZWNyeXB0KCRzKSkpOyAkYWxsc2l0ZXMgPSBhcnJheV9kaWZmKCRhbGxzaXRlcywgYXJyYXkoIiIpKTsgaWYgKCgkbGFzdF9jaGVjayArICR0aW1lX3RvX3VwZGF0ZSkgPCB0aW1lKCkpIHsgJHRoaXMtPmEoTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2dvbWFnZV9hY3RpdmF0aW9uL2Rlc2lnbmVyL2tleScpLCBpbnR2YWwoTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2dvbWFnZV9hY3RpdmF0aW9uL2Rlc2lnbmVyL2NvdW50JykpLCBpbXBsb2RlKCcsJywgJGFsbHNpdGVzKSApOyB9IHJldHVybiAkYWxsc2l0ZXM7IH0gcHVibGljIGZ1bmN0aW9uIGEoJGssICRjID0gMCwgJHMgPSAnJykgeyAkY2ggPSBjdXJsX2luaXQoKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgc3ByaW50ZignaHR0cHM6Ly93d3cuZ29tYWdlLmNvbS9pbmRleC5waHAvZ29tYWdlX2Rvd25sb2FkYWJsZS9rZXkvY2hlY2snKSk7IGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NULCB0cnVlKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICdrZXk9JyAuIHVybGVuY29kZSgkaykgLiAnJnNrdT1wcm9kdWN0LWRlc2lnbmVyJmRvbWFpbnM9JyAuIHVybGVuY29kZShpbXBsb2RlKCcsJywgJHRoaXMtPmdldEFsbFN0b3JlRG9tYWlucygpKSkgLiAnJnZlcj0nIC4gdXJsZW5jb2RlKCcyLjQuMCcpKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1RJTUVPVVQsIDMwKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCAwKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCAwKTsgJGNvbnRlbnQgPSBjdXJsX2V4ZWMoJGNoKTsgdHJ5IHsgJHIgPSBaZW5kX0pzb246OmRlY29kZSgkY29udGVudCk7IH0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsgJHIgPSBhcnJheSgpOyB9ICRlID0gTWFnZTo6aGVscGVyKCdjb3JlJyk7IGlmIChlbXB0eSgkcikpIHsgJHZhbHVlMSA9IE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdnb21hZ2VfYWN0aXZhdGlvbi9kZXNpZ25lci9hcicpOyAkZ3JvdXBzID0gYXJyYXkoICdkZXNpZ25lcicgPT4gYXJyYXkoICdmaWVsZHMnID0+IGFycmF5KCAnYXInID0+IGFycmF5KCAndmFsdWUnID0+ICR2YWx1ZTEgKSwgJ3dlYnNpdGVzJyA9PiBhcnJheSggJ3ZhbHVlJyA9PiAoc3RyaW5nKU1hZ2U6OmdldFN0b3JlQ29uZmlnKCdnb21hZ2VfYWN0aXZhdGlvbi9kZXNpZ25lci93ZWJzaXRlcycpICksICd0aW1lJyA9PiBhcnJheSggJ3ZhbHVlJyA9PiAoc3RyaW5nKSRlLT5lbmNyeXB0KCR2YWx1ZTEgLiAodGltZSgpIC0gKDYwICogNjAgKiAyNCAqIDE1IC0gMTgwMCkpIC4gJHZhbHVlMSkgKSwgJ2NvdW50JyA9PiBhcnJheSggJ3ZhbHVlJyA9PiAkYyArIDEpICkgKSApOyBNYWdlOjpnZXRNb2RlbCgnYWRtaW5odG1sL2NvbmZpZ19kYXRhJykgLT5zZXRTZWN0aW9uKCdnb21hZ2VfYWN0aXZhdGlvbicpIC0+c2V0R3JvdXBzKCRncm91cHMpIC0+c2F2ZSgpOyBNYWdlOjpnZXRDb25maWcoKS0+cmVpbml0KCk7IE1hZ2U6OmFwcCgpLT5yZWluaXRTdG9yZXMoKTsgcmV0dXJuOyB9ICR2YWx1ZTEgPSAnJzsgJHZhbHVlMiA9ICcnOyBpZiAoaXNzZXQoJHJbJ2QnXSkgJiYgaXNzZXQoJHJbJ2MnXSkpIHsgJHZhbHVlMSA9ICRlLT5lbmNyeXB0KGJhc2U2NF9lbmNvZGUoWmVuZF9Kc29uOjplbmNvZGUoJHIpKSk7IGlmICghJHMpIHsgJHMgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZ29tYWdlX2FjdGl2YXRpb24vZGVzaWduZXIvd2Vic2l0ZXMnKTsgfSAkcyA9IGFycmF5X3NsaWNlKGV4cGxvZGUoJywnLCAkcyksIDAsICRyWydjJ10pOyAkdmFsdWUyID0gJGUtPmVuY3J5cHQoJHZhbHVlMSAuIGltcGxvZGUoJywnLCAkcykgLiAkdmFsdWUxKTsgfSAkZ3JvdXBzID0gYXJyYXkoICdkZXNpZ25lcicgPT4gYXJyYXkoICdmaWVsZHMnID0+IGFycmF5KCAnYXInID0+IGFycmF5KCAndmFsdWUnID0+ICR2YWx1ZTEgKSwgJ3dlYnNpdGVzJyA9PiBhcnJheSggJ3ZhbHVlJyA9PiAoc3RyaW5nKSR2YWx1ZTIgKSwgJ3RpbWUnID0+IGFycmF5KCAndmFsdWUnID0+IChzdHJpbmcpJGUtPmVuY3J5cHQoJHZhbHVlMSAuIHRpbWUoKSAuICR2YWx1ZTEpICksICdpbnN0YWxsZWQnID0+IGFycmF5KCAndmFsdWUnID0+IDEgKSwgJ2NvdW50JyA9PiBhcnJheSggJ3ZhbHVlJyA9PiAwKSApICkgKTsgTWFnZTo6Z2V0TW9kZWwoJ2FkbWluaHRtbC9jb25maWdfZGF0YScpIC0+c2V0U2VjdGlvbignZ29tYWdlX2FjdGl2YXRpb24nKSAtPnNldEdyb3VwcygkZ3JvdXBzKSAtPnNhdmUoKTsgTWFnZTo6Z2V0Q29uZmlnKCktPnJlaW5pdCgpOyBNYWdlOjphcHAoKS0+cmVpbml0U3RvcmVzKCk7IH0gcHVibGljIGZ1bmN0aW9uIGdhKCkgeyAkYXIgPSBiYXNlNjRfZGVjb2RlKE1hZ2U6OmhlbHBlcignY29yZScpLT5kZWNyeXB0KE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdnb21hZ2VfYWN0aXZhdGlvbi9kZXNpZ25lci9hcicpKSk7IHJldHVybiAkYXIgPyBaZW5kX0pzb246OmRlY29kZSgkYXIpIDogYXJyYXkoKTsgfSBwdWJsaWMgZnVuY3Rpb24gbm90aWZ5KCkgeyAkZnJlcXVlbmN5ID0gaW50dmFsKE1hZ2U6OmFwcCgpLT5sb2FkQ2FjaGUoJ2dvbWFnZV9ub3RpZmljYXRpb25zX2ZyZXF1ZW5jeScpKTsgaWYgKCEkZnJlcXVlbmN5KSB7ICRmcmVxdWVuY3kgPSAyNDsgfSAkbGFzdF91cGRhdGUgPSBpbnR2YWwoTWFnZTo6YXBwKCktPmxvYWRDYWNoZSgnZ29tYWdlX25vdGlmaWNhdGlvbnNfbGFzdF91cGRhdGUnKSk7IGlmICgoJGZyZXF1ZW5jeSAqIDYwICogNjAgKyAkbGFzdF91cGRhdGUpID4gdGltZSgpKSB7IHJldHVybiBmYWxzZTsgfSAkdGltZXN0YW1wID0gJGxhc3RfdXBkYXRlOyBpZiAoISR0aW1lc3RhbXApIHsgJHRpbWVzdGFtcCA9IHRpbWUoKTsgfSB0cnkgeyAkY2ggPSBjdXJsX2luaXQoKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgc3ByaW50ZignaHR0cHM6Ly93d3cuZ29tYWdlLmNvbS9pbmRleC5waHAvZ29tYWdlX25vdGlmaWNhdGlvbi9pbmRleC9kYXRhJykpOyBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgdHJ1ZSk7IGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCAnc2t1PXByb2R1Y3QtZGVzaWduZXImdGltZXN0YW1wPScgLiAkdGltZXN0YW1wIC4gJyZ2ZXI9JyAuIHVybGVuY29kZSgnMi40LjAnKSk7IGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9USU1FT1VULCAzMCk7IGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7IGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMCk7IGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgMCk7ICRjb250ZW50ID0gY3VybF9leGVjKCRjaCk7IHRyeSB7ICRyZXN1bHQgPSBaZW5kX0pzb246OmRlY29kZSgkY29udGVudCk7IH0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsgJHJlc3VsdCA9IGFycmF5KCk7IH0gaWYgKCRyZXN1bHQgJiYgaXNzZXQoJHJlc3VsdFsnZnJlcXVlbmN5J10pICYmICgkcmVzdWx0WydmcmVxdWVuY3knXSAhPSAkZnJlcXVlbmN5KSkgeyBNYWdlOjphcHAoKS0+c2F2ZUNhY2hlKCRyZXN1bHRbJ2ZyZXF1ZW5jeSddLCAnZ29tYWdlX25vdGlmaWNhdGlvbnNfZnJlcXVlbmN5Jyk7IH0gaWYgKCRyZXN1bHQgJiYgaXNzZXQoJHJlc3VsdFsnZGF0YSddKSkgeyBpZiAoIWVtcHR5KCRyZXN1bHRbJ2RhdGEnXSkpIHsgTWFnZTo6Z2V0TW9kZWwoJ2FkbWlubm90aWZpY2F0aW9uL2luYm94JyktPnBhcnNlKCRyZXN1bHRbJ2RhdGEnXSk7IH0gfSB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsgfSBNYWdlOjphcHAoKS0+c2F2ZUNhY2hlKHRpbWUoKSwgJ2dvbWFnZV9ub3RpZmljYXRpb25zX2xhc3RfdXBkYXRlJyk7IH0gfQ=="));

Function Calls

base64_decode 1

Variables

None

Stats

MD5 382e1db19f9456bc7cd10a9883495d46
Eval Count 1
Decode Time 108 ms