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

Decoded Output download

?>b'<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <[email protected]>
// +----------------------------------------------------------------------

//------------------------
// ThinkPHP 
//-------------------------

use thinkCache;
use thinkConfig;
use thinkCookie;
use thinkDb;
use thinkDebug;
use thinkexceptionHttpException;
use thinkexceptionHttpResponseException;
use thinkLang;
use thinkLoader;
use thinkLog;
use thinkModel;
use thinkRequest;
use thinkResponse;
use thinkSession;
use thinkUrl;
use thinkView;

if (!function_exists(\'load_trait\')) {
    /**
     * Traits PHP5.5
     * @param string    $class trait
     * @param string    $ext 
     * @return boolean
     */
    function load_trait($class, $ext = EXT)
    {
        return Loader::import($class, TRAIT_PATH, $ext);
    }
}

if (!function_exists(\'exception\')) {
    /**
     * 
     *
     * @param string    $msg  
     * @param integer   $code  0
     * @param string    $exception 
     *
     * @throws Exception
     */
    function exception($msg, $code = 0, $exception = \'\')
    {
        $e = $exception ?: \'thinkException\';
        throw new $e($msg, $code);
    }
}

if (!function_exists(\'debug\')) {
    /**
     * 
     * @param string            $start 
     * @param string            $end 
     * @param integer|string    $dec  m 
     * @return mixed
     */
    function debug($start, $end = \'\', $dec = 6)
    {
        if (\'\' == $end) {
            Debug::remark($start);
        } else {
            return \'m\' == $dec ? Debug::getRangeMem($start, $end) : Debug::getRangeTime($start, $end, $dec);
        }
    }
}

if (!function_exists(\'lang\')) {
    /**
     * 
     * @param string    $name 
     * @param array     $vars 
     * @param string    $lang 
     * @return mixed
     */
    function lang($name, $vars = [], $lang = \'\')
    {
        return Lang::get($name, $vars, $lang);
    }
}

if (!function_exists(\'config\')) {
    /**
     * 
     * @param string|array  $name 
     * @param mixed         $value 
     * @param string        $range 
     * @return mixed
     */
    function config($name = \'\', $value = null, $range = \'\')
    {
        if (is_null($value) && is_string($name)) {
            return 0 === strpos($name, \'?\') ? Config::has(substr($name, 1), $range) : Config::get($name, $range);
        } else {
            return Config::set($name, $value, $range);
        }
    }
}

if (!function_exists(\'input\')) {
    /**
     *  
     * @param string    $key 
     * @param mixed     $default 
     * @param string    $filter 
     * @return mixed
     */
    function input($key = \'\', $default = null, $filter = \'\')
    {
        if (0 === strpos($key, \'?\')) {
            $key = substr($key, 1);
            $has = true;
        }
        if ($pos = strpos($key, \'.\')) {
            // 
            list($method, $key) = explode(\'.\', $key, 2);
            if (!in_array($method, [\'get\', \'post\', \'put\', \'patch\', \'delete\', \'route\', \'param\', \'request\', \'session\', \'cookie\', \'server\', \'env\', \'path\', \'file\'])) {
                $key    = $method . \'.\' . $key;
                $method = \'param\';
            }
        } else {
            // 
            $method = \'param\';
        }
        if (isset($has)) {
            return request()->has($key, $method, $default);
        } else {
            return request()->$method($key, $default, $filter);
        }
    }
}

if (!function_exists(\'widget\')) {
    /**
     * Widget
     * @param string    $name Widget
     * @param array     $data 
     * @return mixed
     */
    function widget($name, $data = [])
    {
        return Loader::action($name, $data, \'widget\');
    }
}

if (!function_exists(\'model\')) {
    /**
     * Model
     * @param string    $name Model
     * @param string    $layer 
     * @param bool      $appendSuffix 
     * @return thinkModel
     */
    function model($name = \'\', $layer = \'model\', $appendSuffix = false)
    {
        return Loader::model($name, $layer, $appendSuffix);
    }
}

if (!function_exists(\'validate\')) {
    /**
     * 
     * @param string    $name 
     * @param string    $layer 
     * @param bool      $appendSuffix 
     * @return thinkValidate
     */
    function validate($name = \'\', $layer = \'validate\', $appendSuffix = false)
    {
        return Loader::validate($name, $layer, $appendSuffix);
    }
}

if (!function_exists(\'db\')) {
    /**
     * 
     * @param string        $name 
     * @param array|string  $config 
     * @param bool          $force 
     * @return thinkdbQuery
     */
    function db($name = \'\', $config = [], $force = false)
    {
        return Db::connect($config, $force)->name($name);
    }
}

if (!function_exists(\'controller\')) {
    /**
     *  [/]
     * @param string    $name 
     * @param string    $layer 
     * @param bool      $appendSuffix 
     * @return thinkController
     */
    function controller($name, $layer = \'controller\', $appendSuffix = false)
    {
        return Loader::controller($name, $layer, $appendSuffix);
    }
}

if (!function_exists(\'action\')) {
    /**
     *   [//]
     * @param string        $url 
     * @param string|array  $vars  
     * @param string        $layer 
     * @param bool          $appendSuffix 
     * @return mixed
     */
    function action($url, $vars = [], $layer = \'controller\', $appendSuffix = false)
    {
        return Loader::action($url, $vars, $layer, $appendSuffix);
    }
}

if (!function_exists(\'import\')) {
    /**
     *  javaImport 
     * @param string    $class 
     * @param string    $baseUrl 
     * @param string    $ext 
     * @return boolean
     */
    function import($class, $baseUrl = \'\', $ext = EXT)
    {
        return Loader::import($class, $baseUrl, $ext);
    }
}

if (!function_exists(\'vendor\')) {
    /**
     *   Vendor
     * @param string    $class 
     * @param string    $ext 
     * @return boolean
     */
    function vendor($class, $ext = EXT)
    {
        return Loader::import($class, VENDOR_PATH, $ext);
    }
}

if (!function_exists(\'dump\')) {
    /**
     * 
     * @param mixed     $var 
     * @param boolean   $echo  true false 
     * @param string    $label  
     * @return void|string
     */
    function dump($var, $echo = true, $label = null)
    {
        return Debug::dump($var, $echo, $label);
    }
}

if (!function_exists(\'url\')) {
    /**
     * Url
     * @param string        $url 
     * @param string|array  $vars 
     * @param bool|string   $suffix URL
     * @param bool|string   $domain 
     * @return string
     */
    function url($url = \'\', $vars = \'\', $suffix = true, $domain = false)
    {
        return Url::build($url, $vars, $suffix, $domain);
    }
}

if (!function_exists(\'session\')) {
    /**
     * Session
     * @param string|array  $name sessionsession
     * @param mixed         $value session
     * @param string        $prefix 
     * @return mixed
     */
    function session($name, $value = \'\', $prefix = null)
    {
        if (is_array($name)) {
            // 
            Session::init($name);
        } elseif (is_null($name)) {
            // 
            Session::clear(\'\' === $value ? null : $value);
        } elseif (\'\' === $value) {
            // 
            return 0 === strpos($name, \'?\') ? Session::has(substr($name, 1), $prefix) : Session::get($name, $prefix);
        } elseif (is_null($value)) {
            // 
            return Session::delete($name, $prefix);
        } else {
            // 
            return Session::set($name, $value, $prefix);
        }
    }
}

if (!function_exists(\'cookie\')) {
    /**
     * Cookie
     * @param string|array  $name cookiecookie
     * @param mixed         $value cookie
     * @param mixed         $option 
     * @return mixed
     */
    function cookie($name, $value = \'\', $option = null)
    {
        if (is_array($name)) {
            // 
            Cookie::init($name);
        } elseif (is_null($name)) {
            // 
            Cookie::clear($value);
        } elseif (\'\' === $value) {
            // 
            return 0 === strpos($name, \'?\') ? Cookie::has(substr($name, 1), $option) : Cookie::get($name, $option);
        } elseif (is_null($value)) {
            // 
            return Cookie::delete($name);
        } else {
            // 
            return Cookie::set($name, $value, $option);
        }
    }
}

if (!function_exists(\'cache\')) {
    /**
     * 
     * @param mixed     $name 
     * @param mixed     $value 
     * @param mixed     $options 
     * @param string    $tag 
     * @return mixed
     */
    function cache($name, $value = \'\', $options = null, $tag = null)
    {
        if (is_array($options)) {
            // 
            $cache = Cache::connect($options);
        } elseif (is_array($name)) {
            // 
            return Cache::connect($name);
        } else {
            $cache = Cache::init();
        }

        if (is_null($name)) {
            return $cache->clear($value);
        } elseif (\'\' === $value) {
            // 
            return 0 === strpos($name, \'?\') ? $cache->has(substr($name, 1)) : $cache->get($name);
        } elseif (is_null($value)) {
            // 
            return $cache->rm($name);
        } elseif (0 === strpos($name, \'?\') && \'\' !== $value) {
            $expire = is_numeric($options) ? $options : null;
            return $cache->remember(substr($name, 1), $value, $expire);
        } else {
            // 
            if (is_array($options)) {
                $expire = isset($options[\'expire\']) ? $options[\'expire\'] : null; //
            } else {
                $expire = is_numeric($options) ? $options : null; //
            }
            if (is_null($tag)) {
                return $cache->set($name, $value, $expire);
            } else {
                return $cache->tag($tag)->set($name, $value, $expire);
            }
        }
    }
}

if (!function_exists(\'trace\')) {
    /**
     * 
     * @param mixed     $log log 
     * @param string    $level 
     * @return void|array
     */
    function trace($log = \'[think]\', $level = \'log\')
    {
        if (\'[think]\' === $log) {
            return Log::getLog();
        } else {
            Log::record($log, $level);
        }
    }
}

if (!function_exists(\'request\')) {
    /**
     * Request
     * @return Request
     */
    function request()
    {
        return Request::instance();
    }
}

if (!function_exists(\'response\')) {
    /**
     *  Response 
     * @param mixed      $data   
     * @param int|string $code   
     * @param array      $header 
     * @param string     $type
     * @return Response
     */
    function response($data = [], $code = 200, $header = [], $type = \'html\')
    {
        return Response::create($data, $type, $code, $header);
    }
}

if (!function_exists(\'view\')) {
    /**
     * 
     * @param string    $template 
     * @param array     $vars 
     * @param array     $replace 
     * @param integer   $code 
     * @return thinkresponseView
     */
    function view($template = \'\', $vars = [], $replace = [], $code = 200)
    {
        return Response::create($template, \'view\', $code)->replace($replace)->assign($vars);
    }
}

if (!function_exists(\'json\')) {
    /**
     * thinkresponseJson
     * @param mixed   $data 
     * @param integer $code 
     * @param array   $header 
     * @param array   $options 
     * @return thinkresponseJson
     */
    function json($data = [], $code = 200, $header = [], $options = [])
    {
        return Response::create($data, \'json\', $code, $header, $options);
    }
}

if (!function_exists(\'jsonp\')) {
    /**
     * thinkresponseJsonp
     * @param mixed   $data    
     * @param integer $code    
     * @param array   $header 
     * @param array   $options 
     * @return thinkresponseJsonp
     */
    function jsonp($data = [], $code = 200, $header = [], $options = [])
    {
        return Response::create($data, \'jsonp\', $code, $header, $options);
    }
}

if (!function_exists(\'xml\')) {
    /**
     * thinkresponseXml
     * @param mixed   $data    
     * @param integer $code    
     * @param array   $header  
     * @param array   $options 
     * @return thinkresponseXml
     */
    function xml($data = [], $code = 200, $header = [], $options = [])
    {
        return Response::create($data, \'xml\', $code, $header, $options);
    }
}

if (!function_exists(\'redirect\')) {
    /**
     * thinkresponseRedirect
     * @param mixed         $url  Url::build
     * @param array|integer $params 
     * @param integer       $code 
     * @param array         $with 
     * @return thinkresponseRedirect
     */
    function redirect($url = [], $params = [], $code = 302, $with = [])
    {
        if (is_integer($params)) {
            $code   = $params;
            $params = [];
        }
        return Response::create($url, \'redirect\', $code)->params($params)->with($with);
    }
}

if (!function_exists(\'abort\')) {
    /**
     * HTTP
     * @param integer|Response      $code   Response
     * @param string                $message 
     * @param array                 $header 
     */
    function abort($code, $message = null, $header = [])
    {
        if ($code instanceof Response) {
            throw new HttpResponseException($code);
        } else {
            throw new HttpException($code, $message, null, $header);
        }
    }
}

if (!function_exists(\'halt\')) {
    /**
     * 
     * @param mixed      $var 
     */
    function halt($var)
    {
        dump($var);
        throw new HttpResponseException(new Response);
    }
}

if (!function_exists(\'token\')) {
    /**
     * 
     * @param string $name 
     * @param mixed  $type 
     * @return string
     */
    function token($name = \'__token__\', $type = \'md5\')
    {
        $token = Request::instance()->token($name, $type);
        return \'<input type="hidden" name="\' . $name . \'" value="\' . $token . \'" />\';
    }
}

if (!function_exists(\'load_relation\')) {
    /**
     * 
     * @param mixed $resultSet 
     * @param mixed $relation 
     * @return array
     */
    function load_relation($resultSet, $relation)
    {
        $item = current($resultSet);
        if ($item instanceof Model) {
            $item->eagerlyResultSet($resultSet, $relation);
        }
        return $resultSet;
    }
}

if (!function_exists(\'collection\')) {
    /**
     * 
     * @param array $resultSet 
     * @return thinkmodelCollection|thinkCollection
     */
    function collection($resultSet)
    {
        $item = current($resultSet);
        if ($item instanceof Model) {
            return thinkmodelCollection::make($resultSet);
        } else {
            return thinkCollection::make($resultSet);
        }
    }
}
'

Did this file decode correctly?

Original Code

<?php eval("?>".base64_decode("PD9waHANCi8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyB8IFRoaW5rUEhQIFsgV0UgQ0FOIERPIElUIEpVU1QgVEhJTksgXQ0KLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIHwgQ29weXJpZ2h0IChjKSAyMDA2fjIwMTggaHR0cDovL3RoaW5rcGhwLmNuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQovLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gfCBMaWNlbnNlZCAoIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCApDQovLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gfCBBdXRob3I6IGxpdTIxc3QgPGxpdTIxc3RAZ21haWwuY29tPg0KLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIFRoaW5rUEhQIOWKqeaJi+WHveaVsA0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnVzZSB0aGlua0NhY2hlOw0KdXNlIHRoaW5rQ29uZmlnOw0KdXNlIHRoaW5rQ29va2llOw0KdXNlIHRoaW5rRGI7DQp1c2UgdGhpbmtEZWJ1ZzsNCnVzZSB0aGlua2V4Y2VwdGlvbkh0dHBFeGNlcHRpb247DQp1c2UgdGhpbmtleGNlcHRpb25IdHRwUmVzcG9uc2VFeGNlcHRpb247DQp1c2UgdGhpbmtMYW5nOw0KdXNlIHRoaW5rTG9hZGVyOw0KdXNlIHRoaW5rTG9nOw0KdXNlIHRoaW5rTW9kZWw7DQp1c2UgdGhpbmtSZXF1ZXN0Ow0KdXNlIHRoaW5rUmVzcG9uc2U7DQp1c2UgdGhpbmtTZXNzaW9uOw0KdXNlIHRoaW5rVXJsOw0KdXNlIHRoaW5rVmlldzsNCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2xvYWRfdHJhaXQnKSkgew0KICAgIC8qKg0KICAgICAqIOW/q+mAn+WvvOWFpVRyYWl0cyBQSFA1LjXku6XkuIrml6DpnIDosIPnlKgNCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICRjbGFzcyB0cmFpdOW6kw0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJGV4dCDnsbvlupPlkI7nvIANCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBsb2FkX3RyYWl0KCRjbGFzcywgJGV4dCA9IEVYVCkNCiAgICB7DQogICAgICAgIHJldHVybiBMb2FkZXI6OmltcG9ydCgkY2xhc3MsIFRSQUlUX1BBVEgsICRleHQpOw0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2V4Y2VwdGlvbicpKSB7DQogICAgLyoqDQogICAgICog5oqb5Ye65byC5bi45aSE55CGDQogICAgICoNCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICRtc2cgIOW8guW4uOa2iOaBrw0KICAgICAqIEBwYXJhbSBpbnRlZ2VyICAgJGNvZGUg5byC5bi45Luj56CBIOm7mOiupOS4ujANCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICRleGNlcHRpb24g5byC5bi457G7DQogICAgICoNCiAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIGV4Y2VwdGlvbigkbXNnLCAkY29kZSA9IDAsICRleGNlcHRpb24gPSAnJykNCiAgICB7DQogICAgICAgICRlID0gJGV4Y2VwdGlvbiA/OiAndGhpbmtFeGNlcHRpb24nOw0KICAgICAgICB0aHJvdyBuZXcgJGUoJG1zZywgJGNvZGUpOw0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2RlYnVnJykpIHsNCiAgICAvKioNCiAgICAgKiDorrDlvZXml7bpl7TvvIjlvq7np5LvvInlkozlhoXlrZjkvb/nlKjmg4XlhrUNCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgJHN0YXJ0IOW8gOWni+agh+etvg0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAkZW5kIOe7k+adn+agh+etvg0KICAgICAqIEBwYXJhbSBpbnRlZ2VyfHN0cmluZyAgICAkZGVjIOWwj+aVsOS9jSDlpoLmnpzmmK9tIOihqOekuue7n+iuoeWGheWtmOWNoOeUqA0KICAgICAqIEByZXR1cm4gbWl4ZWQNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBkZWJ1Zygkc3RhcnQsICRlbmQgPSAnJywgJGRlYyA9IDYpDQogICAgew0KICAgICAgICBpZiAoJycgPT0gJGVuZCkgew0KICAgICAgICAgICAgRGVidWc6OnJlbWFyaygkc3RhcnQpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuICdtJyA9PSAkZGVjID8gRGVidWc6OmdldFJhbmdlTWVtKCRzdGFydCwgJGVuZCkgOiBEZWJ1Zzo6Z2V0UmFuZ2VUaW1lKCRzdGFydCwgJGVuZCwgJGRlYyk7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdsYW5nJykpIHsNCiAgICAvKioNCiAgICAgKiDojrflj5bor63oqIDlj5jph4/lgLwNCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICRuYW1lIOivreiogOWPmOmHj+WQjQ0KICAgICAqIEBwYXJhbSBhcnJheSAgICAgJHZhcnMg5Yqo5oCB5Y+Y6YeP5YC8DQogICAgICogQHBhcmFtIHN0cmluZyAgICAkbGFuZyDor63oqIANCiAgICAgKiBAcmV0dXJuIG1peGVkDQogICAgICovDQogICAgZnVuY3Rpb24gbGFuZygkbmFtZSwgJHZhcnMgPSBbXSwgJGxhbmcgPSAnJykNCiAgICB7DQogICAgICAgIHJldHVybiBMYW5nOjpnZXQoJG5hbWUsICR2YXJzLCAkbGFuZyk7DQogICAgfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY29uZmlnJykpIHsNCiAgICAvKioNCiAgICAgKiDojrflj5blkozorr7nva7phY3nva7lj4LmlbANCiAgICAgKiBAcGFyYW0gc3RyaW5nfGFycmF5ICAkbmFtZSDlj4LmlbDlkI0NCiAgICAgKiBAcGFyYW0gbWl4ZWQgICAgICAgICAkdmFsdWUg5Y+C5pWw5YC8DQogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgJHJhbmdlIOS9nOeUqOWfnw0KICAgICAqIEByZXR1cm4gbWl4ZWQNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBjb25maWcoJG5hbWUgPSAnJywgJHZhbHVlID0gbnVsbCwgJHJhbmdlID0gJycpDQogICAgew0KICAgICAgICBpZiAoaXNfbnVsbCgkdmFsdWUpICYmIGlzX3N0cmluZygkbmFtZSkpIHsNCiAgICAgICAgICAgIHJldHVybiAwID09PSBzdHJwb3MoJG5hbWUsICc/JykgPyBDb25maWc6OmhhcyhzdWJzdHIoJG5hbWUsIDEpLCAkcmFuZ2UpIDogQ29uZmlnOjpnZXQoJG5hbWUsICRyYW5nZSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gQ29uZmlnOjpzZXQoJG5hbWUsICR2YWx1ZSwgJHJhbmdlKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2lucHV0JykpIHsNCiAgICAvKioNCiAgICAgKiDojrflj5bovpPlhaXmlbDmja4g5pSv5oyB6buY6K6k5YC85ZKM6L+H5rukDQogICAgICogQHBhcmFtIHN0cmluZyAgICAka2V5IOiOt+WPlueahOWPmOmHj+WQjQ0KICAgICAqIEBwYXJhbSBtaXhlZCAgICAgJGRlZmF1bHQg6buY6K6k5YC8DQogICAgICogQHBhcmFtIHN0cmluZyAgICAkZmlsdGVyIOi/h+a7pOaWueazlQ0KICAgICAqIEByZXR1cm4gbWl4ZWQNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBpbnB1dCgka2V5ID0gJycsICRkZWZhdWx0ID0gbnVsbCwgJGZpbHRlciA9ICcnKQ0KICAgIHsNCiAgICAgICAgaWYgKDAgPT09IHN0cnBvcygka2V5LCAnPycpKSB7DQogICAgICAgICAgICAka2V5ID0gc3Vic3RyKCRrZXksIDEpOw0KICAgICAgICAgICAgJGhhcyA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRwb3MgPSBzdHJwb3MoJGtleSwgJy4nKSkgew0KICAgICAgICAgICAgLy8g5oyH5a6a5Y+C5pWw5p2l5rqQDQogICAgICAgICAgICBsaXN0KCRtZXRob2QsICRrZXkpID0gZXhwbG9kZSgnLicsICRrZXksIDIpOw0KICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkbWV0aG9kLCBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdkZWxldGUnLCAncm91dGUnLCAncGFyYW0nLCAncmVxdWVzdCcsICdzZXNzaW9uJywgJ2Nvb2tpZScsICdzZXJ2ZXInLCAnZW52JywgJ3BhdGgnLCAnZmlsZSddKSkgew0KICAgICAgICAgICAgICAgICRrZXkgICAgPSAkbWV0aG9kIC4gJy4nIC4gJGtleTsNCiAgICAgICAgICAgICAgICAkbWV0aG9kID0gJ3BhcmFtJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8vIOm7mOiupOS4uuiHquWKqOWIpOaWrQ0KICAgICAgICAgICAgJG1ldGhvZCA9ICdwYXJhbSc7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGlzc2V0KCRoYXMpKSB7DQogICAgICAgICAgICByZXR1cm4gcmVxdWVzdCgpLT5oYXMoJGtleSwgJG1ldGhvZCwgJGRlZmF1bHQpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QoKS0+JG1ldGhvZCgka2V5LCAkZGVmYXVsdCwgJGZpbHRlcik7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCd3aWRnZXQnKSkgew0KICAgIC8qKg0KICAgICAqIOa4suafk+i+k+WHuldpZGdldA0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJG5hbWUgV2lkZ2V05ZCN56ewDQogICAgICogQHBhcmFtIGFycmF5ICAgICAkZGF0YSDkvKDlhaXnmoTlj4LmlbANCiAgICAgKiBAcmV0dXJuIG1peGVkDQogICAgICovDQogICAgZnVuY3Rpb24gd2lkZ2V0KCRuYW1lLCAkZGF0YSA9IFtdKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIExvYWRlcjo6YWN0aW9uKCRuYW1lLCAkZGF0YSwgJ3dpZGdldCcpOw0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21vZGVsJykpIHsNCiAgICAvKioNCiAgICAgKiDlrp7kvovljJZNb2RlbA0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJG5hbWUgTW9kZWzlkI3np7ANCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICRsYXllciDkuJrliqHlsYLlkI3np7ANCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICRhcHBlbmRTdWZmaXgg5piv5ZCm5re75Yqg57G75ZCN5ZCO57yADQogICAgICogQHJldHVybiB0aGlua01vZGVsDQogICAgICovDQogICAgZnVuY3Rpb24gbW9kZWwoJG5hbWUgPSAnJywgJGxheWVyID0gJ21vZGVsJywgJGFwcGVuZFN1ZmZpeCA9IGZhbHNlKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIExvYWRlcjo6bW9kZWwoJG5hbWUsICRsYXllciwgJGFwcGVuZFN1ZmZpeCk7DQogICAgfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygndmFsaWRhdGUnKSkgew0KICAgIC8qKg0KICAgICAqIOWunuS+i+WMlumqjOivgeWZqA0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJG5hbWUg6aqM6K+B5Zmo5ZCN56ewDQogICAgICogQHBhcmFtIHN0cmluZyAgICAkbGF5ZXIg5Lia5Yqh5bGC5ZCN56ewDQogICAgICogQHBhcmFtIGJvb2wgICAgICAkYXBwZW5kU3VmZml4IOaYr+WQpua3u+WKoOexu+WQjeWQjue8gA0KICAgICAqIEByZXR1cm4gdGhpbmtWYWxpZGF0ZQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlKCRuYW1lID0gJycsICRsYXllciA9ICd2YWxpZGF0ZScsICRhcHBlbmRTdWZmaXggPSBmYWxzZSkNCiAgICB7DQogICAgICAgIHJldHVybiBMb2FkZXI6OnZhbGlkYXRlKCRuYW1lLCAkbGF5ZXIsICRhcHBlbmRTdWZmaXgpOw0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2RiJykpIHsNCiAgICAvKioNCiAgICAgKiDlrp7kvovljJbmlbDmja7lupPnsbsNCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAkbmFtZSDmk43kvZznmoTmlbDmja7ooajlkI3np7DvvIjkuI3lkKvliY3nvIDvvIkNCiAgICAgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICAkY29uZmlnIOaVsOaNruW6k+mFjee9ruWPguaVsA0KICAgICAqIEBwYXJhbSBib29sICAgICAgICAgICRmb3JjZSDmmK/lkKblvLrliLbph43mlrDov57mjqUNCiAgICAgKiBAcmV0dXJuIHRoaW5rZGJRdWVyeQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIGRiKCRuYW1lID0gJycsICRjb25maWcgPSBbXSwgJGZvcmNlID0gZmFsc2UpDQogICAgew0KICAgICAgICByZXR1cm4gRGI6OmNvbm5lY3QoJGNvbmZpZywgJGZvcmNlKS0+bmFtZSgkbmFtZSk7DQogICAgfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY29udHJvbGxlcicpKSB7DQogICAgLyoqDQogICAgICog5a6e5L6L5YyW5o6n5Yi25ZmoIOagvOW8j++8mlvmqKHlnZcvXeaOp+WItuWZqA0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJG5hbWUg6LWE5rqQ5Zyw5Z2ADQogICAgICogQHBhcmFtIHN0cmluZyAgICAkbGF5ZXIg5o6n5Yi25bGC5ZCN56ewDQogICAgICogQHBhcmFtIGJvb2wgICAgICAkYXBwZW5kU3VmZml4IOaYr+WQpua3u+WKoOexu+WQjeWQjue8gA0KICAgICAqIEByZXR1cm4gdGhpbmtDb250cm9sbGVyDQogICAgICovDQogICAgZnVuY3Rpb24gY29udHJvbGxlcigkbmFtZSwgJGxheWVyID0gJ2NvbnRyb2xsZXInLCAkYXBwZW5kU3VmZml4ID0gZmFsc2UpDQogICAgew0KICAgICAgICByZXR1cm4gTG9hZGVyOjpjb250cm9sbGVyKCRuYW1lLCAkbGF5ZXIsICRhcHBlbmRTdWZmaXgpOw0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FjdGlvbicpKSB7DQogICAgLyoqDQogICAgICog6LCD55So5qih5Z2X55qE5pON5L2c5pa55rOVIOWPguaVsOagvOW8jyBb5qih5Z2XL+aOp+WItuWZqC9d5pON5L2cDQogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgJHVybCDosIPnlKjlnLDlnYANCiAgICAgKiBAcGFyYW0gc3RyaW5nfGFycmF5ICAkdmFycyDosIPnlKjlj4LmlbAg5pSv5oyB5a2X56ym5Liy5ZKM5pWw57uEDQogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgJGxheWVyIOimgeiwg+eUqOeahOaOp+WItuWxguWQjeensA0KICAgICAqIEBwYXJhbSBib29sICAgICAgICAgICRhcHBlbmRTdWZmaXgg5piv5ZCm5re75Yqg57G75ZCN5ZCO57yADQogICAgICogQHJldHVybiBtaXhlZA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIGFjdGlvbigkdXJsLCAkdmFycyA9IFtdLCAkbGF5ZXIgPSAnY29udHJvbGxlcicsICRhcHBlbmRTdWZmaXggPSBmYWxzZSkNCiAgICB7DQogICAgICAgIHJldHVybiBMb2FkZXI6OmFjdGlvbigkdXJsLCAkdmFycywgJGxheWVyLCAkYXBwZW5kU3VmZml4KTsNCiAgICB9DQp9DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdpbXBvcnQnKSkgew0KICAgIC8qKg0KICAgICAqIOWvvOWFpeaJgOmcgOeahOexu+W6kyDlkIxqYXZh55qESW1wb3J0IOacrOWHveaVsOaciee8k+WtmOWKn+iDvQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJGNsYXNzIOexu+W6k+WRveWQjeepuumXtOWtl+espuS4sg0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJGJhc2VVcmwg6LW35aeL6Lev5b6EDQogICAgICogQHBhcmFtIHN0cmluZyAgICAkZXh0IOWvvOWFpeeahOaWh+S7tuaJqeWxleWQjQ0KICAgICAqIEByZXR1cm4gYm9vbGVhbg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIGltcG9ydCgkY2xhc3MsICRiYXNlVXJsID0gJycsICRleHQgPSBFWFQpDQogICAgew0KICAgICAgICByZXR1cm4gTG9hZGVyOjppbXBvcnQoJGNsYXNzLCAkYmFzZVVybCwgJGV4dCk7DQogICAgfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygndmVuZG9yJykpIHsNCiAgICAvKioNCiAgICAgKiDlv6vpgJ/lr7zlhaXnrKzkuInmlrnmoYbmnrbnsbvlupMg5omA5pyJ56ys5LiJ5pa55qGG5p6255qE57G75bqT5paH5Lu257uf5LiA5pS+5YiwIOezu+e7n+eahFZlbmRvcuebruW9leS4i+mdog0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJGNsYXNzIOexu+W6kw0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJGV4dCDnsbvlupPlkI7nvIANCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiB2ZW5kb3IoJGNsYXNzLCAkZXh0ID0gRVhUKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIExvYWRlcjo6aW1wb3J0KCRjbGFzcywgVkVORE9SX1BBVEgsICRleHQpOw0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2R1bXAnKSkgew0KICAgIC8qKg0KICAgICAqIOa1j+iniOWZqOWPi+WlveeahOWPmOmHj+i+k+WHug0KICAgICAqIEBwYXJhbSBtaXhlZCAgICAgJHZhciDlj5jph48NCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAgICRlY2hvIOaYr+WQpui+k+WHuiDpu5jorqTkuLp0cnVlIOWmguaenOS4umZhbHNlIOWImei/lOWbnui+k+WHuuWtl+espuS4sg0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJGxhYmVsIOagh+etviDpu5jorqTkuLrnqboNCiAgICAgKiBAcmV0dXJuIHZvaWR8c3RyaW5nDQogICAgICovDQogICAgZnVuY3Rpb24gZHVtcCgkdmFyLCAkZWNobyA9IHRydWUsICRsYWJlbCA9IG51bGwpDQogICAgew0KICAgICAgICByZXR1cm4gRGVidWc6OmR1bXAoJHZhciwgJGVjaG8sICRsYWJlbCk7DQogICAgfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygndXJsJykpIHsNCiAgICAvKioNCiAgICAgKiBVcmznlJ/miJANCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAkdXJsIOi3r+eUseWcsOWdgA0KICAgICAqIEBwYXJhbSBzdHJpbmd8YXJyYXkgICR2YXJzIOWPmOmHjw0KICAgICAqIEBwYXJhbSBib29sfHN0cmluZyAgICRzdWZmaXgg55Sf5oiQ55qEVVJM5ZCO57yADQogICAgICogQHBhcmFtIGJvb2x8c3RyaW5nICAgJGRvbWFpbiDln5/lkI0NCiAgICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHVybCgkdXJsID0gJycsICR2YXJzID0gJycsICRzdWZmaXggPSB0cnVlLCAkZG9tYWluID0gZmFsc2UpDQogICAgew0KICAgICAgICByZXR1cm4gVXJsOjpidWlsZCgkdXJsLCAkdmFycywgJHN1ZmZpeCwgJGRvbWFpbik7DQogICAgfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnc2Vzc2lvbicpKSB7DQogICAgLyoqDQogICAgICogU2Vzc2lvbueuoeeQhg0KICAgICAqIEBwYXJhbSBzdHJpbmd8YXJyYXkgICRuYW1lIHNlc3Npb27lkI3np7DvvIzlpoLmnpzkuLrmlbDnu4TooajnpLrov5vooYxzZXNzaW9u6K6+572uDQogICAgICogQHBhcmFtIG1peGVkICAgICAgICAgJHZhbHVlIHNlc3Npb27lgLwNCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAkcHJlZml4IOWJjee8gA0KICAgICAqIEByZXR1cm4gbWl4ZWQNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBzZXNzaW9uKCRuYW1lLCAkdmFsdWUgPSAnJywgJHByZWZpeCA9IG51bGwpDQogICAgew0KICAgICAgICBpZiAoaXNfYXJyYXkoJG5hbWUpKSB7DQogICAgICAgICAgICAvLyDliJ3lp4vljJYNCiAgICAgICAgICAgIFNlc3Npb246OmluaXQoJG5hbWUpOw0KICAgICAgICB9IGVsc2VpZiAoaXNfbnVsbCgkbmFtZSkpIHsNCiAgICAgICAgICAgIC8vIOa4hemZpA0KICAgICAgICAgICAgU2Vzc2lvbjo6Y2xlYXIoJycgPT09ICR2YWx1ZSA/IG51bGwgOiAkdmFsdWUpOw0KICAgICAgICB9IGVsc2VpZiAoJycgPT09ICR2YWx1ZSkgew0KICAgICAgICAgICAgLy8g5Yik5pat5oiW6I635Y+WDQogICAgICAgICAgICByZXR1cm4gMCA9PT0gc3RycG9zKCRuYW1lLCAnPycpID8gU2Vzc2lvbjo6aGFzKHN1YnN0cigkbmFtZSwgMSksICRwcmVmaXgpIDogU2Vzc2lvbjo6Z2V0KCRuYW1lLCAkcHJlZml4KTsNCiAgICAgICAgfSBlbHNlaWYgKGlzX251bGwoJHZhbHVlKSkgew0KICAgICAgICAgICAgLy8g5Yig6ZmkDQogICAgICAgICAgICByZXR1cm4gU2Vzc2lvbjo6ZGVsZXRlKCRuYW1lLCAkcHJlZml4KTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8vIOiuvue9rg0KICAgICAgICAgICAgcmV0dXJuIFNlc3Npb246OnNldCgkbmFtZSwgJHZhbHVlLCAkcHJlZml4KTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2Nvb2tpZScpKSB7DQogICAgLyoqDQogICAgICogQ29va2ll566h55CGDQogICAgICogQHBhcmFtIHN0cmluZ3xhcnJheSAgJG5hbWUgY29va2ll5ZCN56ew77yM5aaC5p6c5Li65pWw57uE6KGo56S66L+b6KGMY29va2ll6K6+572uDQogICAgICogQHBhcmFtIG1peGVkICAgICAgICAgJHZhbHVlIGNvb2tpZeWAvA0KICAgICAqIEBwYXJhbSBtaXhlZCAgICAgICAgICRvcHRpb24g5Y+C5pWwDQogICAgICogQHJldHVybiBtaXhlZA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIGNvb2tpZSgkbmFtZSwgJHZhbHVlID0gJycsICRvcHRpb24gPSBudWxsKQ0KICAgIHsNCiAgICAgICAgaWYgKGlzX2FycmF5KCRuYW1lKSkgew0KICAgICAgICAgICAgLy8g5Yid5aeL5YyWDQogICAgICAgICAgICBDb29raWU6OmluaXQoJG5hbWUpOw0KICAgICAgICB9IGVsc2VpZiAoaXNfbnVsbCgkbmFtZSkpIHsNCiAgICAgICAgICAgIC8vIOa4hemZpA0KICAgICAgICAgICAgQ29va2llOjpjbGVhcigkdmFsdWUpOw0KICAgICAgICB9IGVsc2VpZiAoJycgPT09ICR2YWx1ZSkgew0KICAgICAgICAgICAgLy8g6I635Y+WDQogICAgICAgICAgICByZXR1cm4gMCA9PT0gc3RycG9zKCRuYW1lLCAnPycpID8gQ29va2llOjpoYXMoc3Vic3RyKCRuYW1lLCAxKSwgJG9wdGlvbikgOiBDb29raWU6OmdldCgkbmFtZSwgJG9wdGlvbik7DQogICAgICAgIH0gZWxzZWlmIChpc19udWxsKCR2YWx1ZSkpIHsNCiAgICAgICAgICAgIC8vIOWIoOmZpA0KICAgICAgICAgICAgcmV0dXJuIENvb2tpZTo6ZGVsZXRlKCRuYW1lKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8vIOiuvue9rg0KICAgICAgICAgICAgcmV0dXJuIENvb2tpZTo6c2V0KCRuYW1lLCAkdmFsdWUsICRvcHRpb24pOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY2FjaGUnKSkgew0KICAgIC8qKg0KICAgICAqIOe8k+WtmOeuoeeQhg0KICAgICAqIEBwYXJhbSBtaXhlZCAgICAgJG5hbWUg57yT5a2Y5ZCN56ew77yM5aaC5p6c5Li65pWw57uE6KGo56S66L+b6KGM57yT5a2Y6K6+572uDQogICAgICogQHBhcmFtIG1peGVkICAgICAkdmFsdWUg57yT5a2Y5YC8DQogICAgICogQHBhcmFtIG1peGVkICAgICAkb3B0aW9ucyDnvJPlrZjlj4LmlbANCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICR0YWcg57yT5a2Y5qCH562+DQogICAgICogQHJldHVybiBtaXhlZA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIGNhY2hlKCRuYW1lLCAkdmFsdWUgPSAnJywgJG9wdGlvbnMgPSBudWxsLCAkdGFnID0gbnVsbCkNCiAgICB7DQogICAgICAgIGlmIChpc19hcnJheSgkb3B0aW9ucykpIHsNCiAgICAgICAgICAgIC8vIOe8k+WtmOaTjeS9nOeahOWQjOaXtuWIneWni+WMlg0KICAgICAgICAgICAgJGNhY2hlID0gQ2FjaGU6OmNvbm5lY3QoJG9wdGlvbnMpOw0KICAgICAgICB9IGVsc2VpZiAoaXNfYXJyYXkoJG5hbWUpKSB7DQogICAgICAgICAgICAvLyDnvJPlrZjliJ3lp4vljJYNCiAgICAgICAgICAgIHJldHVybiBDYWNoZTo6Y29ubmVjdCgkbmFtZSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkY2FjaGUgPSBDYWNoZTo6aW5pdCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGlzX251bGwoJG5hbWUpKSB7DQogICAgICAgICAgICByZXR1cm4gJGNhY2hlLT5jbGVhcigkdmFsdWUpOw0KICAgICAgICB9IGVsc2VpZiAoJycgPT09ICR2YWx1ZSkgew0KICAgICAgICAgICAgLy8g6I635Y+W57yT5a2YDQogICAgICAgICAgICByZXR1cm4gMCA9PT0gc3RycG9zKCRuYW1lLCAnPycpID8gJGNhY2hlLT5oYXMoc3Vic3RyKCRuYW1lLCAxKSkgOiAkY2FjaGUtPmdldCgkbmFtZSk7DQogICAgICAgIH0gZWxzZWlmIChpc19udWxsKCR2YWx1ZSkpIHsNCiAgICAgICAgICAgIC8vIOWIoOmZpOe8k+WtmA0KICAgICAgICAgICAgcmV0dXJuICRjYWNoZS0+cm0oJG5hbWUpOw0KICAgICAgICB9IGVsc2VpZiAoMCA9PT0gc3RycG9zKCRuYW1lLCAnPycpICYmICcnICE9PSAkdmFsdWUpIHsNCiAgICAgICAgICAgICRleHBpcmUgPSBpc19udW1lcmljKCRvcHRpb25zKSA/ICRvcHRpb25zIDogbnVsbDsNCiAgICAgICAgICAgIHJldHVybiAkY2FjaGUtPnJlbWVtYmVyKHN1YnN0cigkbmFtZSwgMSksICR2YWx1ZSwgJGV4cGlyZSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAvLyDnvJPlrZjmlbDmja4NCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkb3B0aW9ucykpIHsNCiAgICAgICAgICAgICAgICAkZXhwaXJlID0gaXNzZXQoJG9wdGlvbnNbJ2V4cGlyZSddKSA/ICRvcHRpb25zWydleHBpcmUnXSA6IG51bGw7IC8v5L+u5aSN5p+l6K+i57yT5a2Y5peg5rOV6K6+572u6L+H5pyf5pe26Ze0DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRleHBpcmUgPSBpc19udW1lcmljKCRvcHRpb25zKSA/ICRvcHRpb25zIDogbnVsbDsgLy/pu5jorqTlv6vmjbfnvJPlrZjorr7nva7ov4fmnJ/ml7bpl7QNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChpc19udWxsKCR0YWcpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICRjYWNoZS0+c2V0KCRuYW1lLCAkdmFsdWUsICRleHBpcmUpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gJGNhY2hlLT50YWcoJHRhZyktPnNldCgkbmFtZSwgJHZhbHVlLCAkZXhwaXJlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3RyYWNlJykpIHsNCiAgICAvKioNCiAgICAgKiDorrDlvZXml6Xlv5fkv6Hmga8NCiAgICAgKiBAcGFyYW0gbWl4ZWQgICAgICRsb2cgbG9n5L+h5oGvIOaUr+aMgeWtl+espuS4suWSjOaVsOe7hA0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJGxldmVsIOaXpeW/l+e6p+WIqw0KICAgICAqIEByZXR1cm4gdm9pZHxhcnJheQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHRyYWNlKCRsb2cgPSAnW3RoaW5rXScsICRsZXZlbCA9ICdsb2cnKQ0KICAgIHsNCiAgICAgICAgaWYgKCdbdGhpbmtdJyA9PT0gJGxvZykgew0KICAgICAgICAgICAgcmV0dXJuIExvZzo6Z2V0TG9nKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBMb2c6OnJlY29yZCgkbG9nLCAkbGV2ZWwpOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygncmVxdWVzdCcpKSB7DQogICAgLyoqDQogICAgICog6I635Y+W5b2T5YmNUmVxdWVzdOWvueixoeWunuS+iw0KICAgICAqIEByZXR1cm4gUmVxdWVzdA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHJlcXVlc3QoKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIFJlcXVlc3Q6Omluc3RhbmNlKCk7DQogICAgfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygncmVzcG9uc2UnKSkgew0KICAgIC8qKg0KICAgICAqIOWIm+W7uuaZrumAmiBSZXNwb25zZSDlr7nosaHlrp7kvosNCiAgICAgKiBAcGFyYW0gbWl4ZWQgICAgICAkZGF0YSAgIOi+k+WHuuaVsOaNrg0KICAgICAqIEBwYXJhbSBpbnR8c3RyaW5nICRjb2RlICAg54q25oCB56CBDQogICAgICogQHBhcmFtIGFycmF5ICAgICAgJGhlYWRlciDlpLTkv6Hmga8NCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAkdHlwZQ0KICAgICAqIEByZXR1cm4gUmVzcG9uc2UNCiAgICAgKi8NCiAgICBmdW5jdGlvbiByZXNwb25zZSgkZGF0YSA9IFtdLCAkY29kZSA9IDIwMCwgJGhlYWRlciA9IFtdLCAkdHlwZSA9ICdodG1sJykNCiAgICB7DQogICAgICAgIHJldHVybiBSZXNwb25zZTo6Y3JlYXRlKCRkYXRhLCAkdHlwZSwgJGNvZGUsICRoZWFkZXIpOw0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3ZpZXcnKSkgew0KICAgIC8qKg0KICAgICAqIOa4suafk+aooeadv+i+k+WHug0KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJHRlbXBsYXRlIOaooeadv+aWh+S7tg0KICAgICAqIEBwYXJhbSBhcnJheSAgICAgJHZhcnMg5qih5p2/5Y+Y6YePDQogICAgICogQHBhcmFtIGFycmF5ICAgICAkcmVwbGFjZSDmqKHmnb/mm7/mjaINCiAgICAgKiBAcGFyYW0gaW50ZWdlciAgICRjb2RlIOeKtuaAgeeggQ0KICAgICAqIEByZXR1cm4gdGhpbmtyZXNwb25zZVZpZXcNCiAgICAgKi8NCiAgICBmdW5jdGlvbiB2aWV3KCR0ZW1wbGF0ZSA9ICcnLCAkdmFycyA9IFtdLCAkcmVwbGFjZSA9IFtdLCAkY29kZSA9IDIwMCkNCiAgICB7DQogICAgICAgIHJldHVybiBSZXNwb25zZTo6Y3JlYXRlKCR0ZW1wbGF0ZSwgJ3ZpZXcnLCAkY29kZSktPnJlcGxhY2UoJHJlcGxhY2UpLT5hc3NpZ24oJHZhcnMpOw0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2pzb24nKSkgew0KICAgIC8qKg0KICAgICAqIOiOt+WPlnRoaW5rcmVzcG9uc2VKc29u5a+56LGh5a6e5L6LDQogICAgICogQHBhcmFtIG1peGVkICAgJGRhdGEg6L+U5Zue55qE5pWw5o2uDQogICAgICogQHBhcmFtIGludGVnZXIgJGNvZGUg54q25oCB56CBDQogICAgICogQHBhcmFtIGFycmF5ICAgJGhlYWRlciDlpLTpg6gNCiAgICAgKiBAcGFyYW0gYXJyYXkgICAkb3B0aW9ucyDlj4LmlbANCiAgICAgKiBAcmV0dXJuIHRoaW5rcmVzcG9uc2VKc29uDQogICAgICovDQogICAgZnVuY3Rpb24ganNvbigkZGF0YSA9IFtdLCAkY29kZSA9IDIwMCwgJGhlYWRlciA9IFtdLCAkb3B0aW9ucyA9IFtdKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIFJlc3BvbnNlOjpjcmVhdGUoJGRhdGEsICdqc29uJywgJGNvZGUsICRoZWFkZXIsICRvcHRpb25zKTsNCiAgICB9DQp9DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdqc29ucCcpKSB7DQogICAgLyoqDQogICAgICog6I635Y+WdGhpbmtyZXNwb25zZUpzb25w5a+56LGh5a6e5L6LDQogICAgICogQHBhcmFtIG1peGVkICAgJGRhdGEgICAg6L+U5Zue55qE5pWw5o2uDQogICAgICogQHBhcmFtIGludGVnZXIgJGNvZGUgICAg54q25oCB56CBDQogICAgICogQHBhcmFtIGFycmF5ICAgJGhlYWRlciDlpLTpg6gNCiAgICAgKiBAcGFyYW0gYXJyYXkgICAkb3B0aW9ucyDlj4LmlbANCiAgICAgKiBAcmV0dXJuIHRoaW5rcmVzcG9uc2VKc29ucA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIGpzb25wKCRkYXRhID0gW10sICRjb2RlID0gMjAwLCAkaGVhZGVyID0gW10sICRvcHRpb25zID0gW10pDQogICAgew0KICAgICAgICByZXR1cm4gUmVzcG9uc2U6OmNyZWF0ZSgkZGF0YSwgJ2pzb25wJywgJGNvZGUsICRoZWFkZXIsICRvcHRpb25zKTsNCiAgICB9DQp9DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCd4bWwnKSkgew0KICAgIC8qKg0KICAgICAqIOiOt+WPlnRoaW5rcmVzcG9uc2VYbWzlr7nosaHlrp7kvosNCiAgICAgKiBAcGFyYW0gbWl4ZWQgICAkZGF0YSAgICDov5Tlm57nmoTmlbDmja4NCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkY29kZSAgICDnirbmgIHnoIENCiAgICAgKiBAcGFyYW0gYXJyYXkgICAkaGVhZGVyICDlpLTpg6gNCiAgICAgKiBAcGFyYW0gYXJyYXkgICAkb3B0aW9ucyDlj4LmlbANCiAgICAgKiBAcmV0dXJuIHRoaW5rcmVzcG9uc2VYbWwNCiAgICAgKi8NCiAgICBmdW5jdGlvbiB4bWwoJGRhdGEgPSBbXSwgJGNvZGUgPSAyMDAsICRoZWFkZXIgPSBbXSwgJG9wdGlvbnMgPSBbXSkNCiAgICB7DQogICAgICAgIHJldHVybiBSZXNwb25zZTo6Y3JlYXRlKCRkYXRhLCAneG1sJywgJGNvZGUsICRoZWFkZXIsICRvcHRpb25zKTsNCiAgICB9DQp9DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdyZWRpcmVjdCcpKSB7DQogICAgLyoqDQogICAgICog6I635Y+WdGhpbmtyZXNwb25zZVJlZGlyZWN05a+56LGh5a6e5L6LDQogICAgICogQHBhcmFtIG1peGVkICAgICAgICAgJHVybCDph43lrprlkJHlnLDlnYAg5pSv5oyBVXJsOjpidWlsZOaWueazleeahOWcsOWdgA0KICAgICAqIEBwYXJhbSBhcnJheXxpbnRlZ2VyICRwYXJhbXMg6aKd5aSW5Y+C5pWwDQogICAgICogQHBhcmFtIGludGVnZXIgICAgICAgJGNvZGUg54q25oCB56CBDQogICAgICogQHBhcmFtIGFycmF5ICAgICAgICAgJHdpdGgg6ZqQ5byP5Lyg5Y+CDQogICAgICogQHJldHVybiB0aGlua3Jlc3BvbnNlUmVkaXJlY3QNCiAgICAgKi8NCiAgICBmdW5jdGlvbiByZWRpcmVjdCgkdXJsID0gW10sICRwYXJhbXMgPSBbXSwgJGNvZGUgPSAzMDIsICR3aXRoID0gW10pDQogICAgew0KICAgICAgICBpZiAoaXNfaW50ZWdlcigkcGFyYW1zKSkgew0KICAgICAgICAgICAgJGNvZGUgICA9ICRwYXJhbXM7DQogICAgICAgICAgICAkcGFyYW1zID0gW107DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFJlc3BvbnNlOjpjcmVhdGUoJHVybCwgJ3JlZGlyZWN0JywgJGNvZGUpLT5wYXJhbXMoJHBhcmFtcyktPndpdGgoJHdpdGgpOw0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2Fib3J0JykpIHsNCiAgICAvKioNCiAgICAgKiDmipvlh7pIVFRQ5byC5bi4DQogICAgICogQHBhcmFtIGludGVnZXJ8UmVzcG9uc2UgICAgICAkY29kZSDnirbmgIHnoIEg5oiW6ICFIFJlc3BvbnNl5a+56LGh5a6e5L6LDQogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgICAkbWVzc2FnZSDplJnor6/kv6Hmga8NCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAgICAgICAgICRoZWFkZXIg5Y+C5pWwDQogICAgICovDQogICAgZnVuY3Rpb24gYWJvcnQoJGNvZGUsICRtZXNzYWdlID0gbnVsbCwgJGhlYWRlciA9IFtdKQ0KICAgIHsNCiAgICAgICAgaWYgKCRjb2RlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBIdHRwUmVzcG9uc2VFeGNlcHRpb24oJGNvZGUpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oJGNvZGUsICRtZXNzYWdlLCBudWxsLCAkaGVhZGVyKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2hhbHQnKSkgew0KICAgIC8qKg0KICAgICAqIOiwg+ivleWPmOmHj+W5tuS4lOS4reaWrei+k+WHug0KICAgICAqIEBwYXJhbSBtaXhlZCAgICAgICR2YXIg6LCD6K+V5Y+Y6YeP5oiW6ICF5L+h5oGvDQogICAgICovDQogICAgZnVuY3Rpb24gaGFsdCgkdmFyKQ0KICAgIHsNCiAgICAgICAgZHVtcCgkdmFyKTsNCiAgICAgICAgdGhyb3cgbmV3IEh0dHBSZXNwb25zZUV4Y2VwdGlvbihuZXcgUmVzcG9uc2UpOw0KICAgIH0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3Rva2VuJykpIHsNCiAgICAvKioNCiAgICAgKiDnlJ/miJDooajljZXku6TniYwNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIOS7pOeJjOWQjeensA0KICAgICAqIEBwYXJhbSBtaXhlZCAgJHR5cGUg5Luk54mM55Sf5oiQ5pa55rOVDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBmdW5jdGlvbiB0b2tlbigkbmFtZSA9ICdfX3Rva2VuX18nLCAkdHlwZSA9ICdtZDUnKQ0KICAgIHsNCiAgICAgICAgJHRva2VuID0gUmVxdWVzdDo6aW5zdGFuY2UoKS0+dG9rZW4oJG5hbWUsICR0eXBlKTsNCiAgICAgICAgcmV0dXJuICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSInIC4gJG5hbWUgLiAnIiB2YWx1ZT0iJyAuICR0b2tlbiAuICciIC8+JzsNCiAgICB9DQp9DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCdsb2FkX3JlbGF0aW9uJykpIHsNCiAgICAvKioNCiAgICAgKiDlu7bov5/pooTovb3lhaXlhbPogZTmn6Xor6INCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHJlc3VsdFNldCDmlbDmja7pm4YNCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHJlbGF0aW9uIOWFs+iBlA0KICAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBsb2FkX3JlbGF0aW9uKCRyZXN1bHRTZXQsICRyZWxhdGlvbikNCiAgICB7DQogICAgICAgICRpdGVtID0gY3VycmVudCgkcmVzdWx0U2V0KTsNCiAgICAgICAgaWYgKCRpdGVtIGluc3RhbmNlb2YgTW9kZWwpIHsNCiAgICAgICAgICAgICRpdGVtLT5lYWdlcmx5UmVzdWx0U2V0KCRyZXN1bHRTZXQsICRyZWxhdGlvbik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICRyZXN1bHRTZXQ7DQogICAgfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY29sbGVjdGlvbicpKSB7DQogICAgLyoqDQogICAgICog5pWw57uE6L2s5o2i5Li65pWw5o2u6ZuG5a+56LGhDQogICAgICogQHBhcmFtIGFycmF5ICRyZXN1bHRTZXQg5pWw5o2u6ZuG5pWw57uEDQogICAgICogQHJldHVybiB0aGlua21vZGVsQ29sbGVjdGlvbnx0aGlua0NvbGxlY3Rpb24NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBjb2xsZWN0aW9uKCRyZXN1bHRTZXQpDQogICAgew0KICAgICAgICAkaXRlbSA9IGN1cnJlbnQoJHJlc3VsdFNldCk7DQogICAgICAgIGlmICgkaXRlbSBpbnN0YW5jZW9mIE1vZGVsKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpbmttb2RlbENvbGxlY3Rpb246Om1ha2UoJHJlc3VsdFNldCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gdGhpbmtDb2xsZWN0aW9uOjptYWtlKCRyZXN1bHRTZXQpOw0KICAgICAgICB9DQogICAgfQ0KfQ0K")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 4b92fc3768c1fb9b98139218f61db130
Eval Count 1
Decode Time 106 ms