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('IGRlY2xhcmUoc3RyaWN0X3R5cGVzID0gMSk7IG5hbWVzcGFjZSBQbHVnaW5cczM..

Decoded Output download

 declare(strict_types = 1); namespace Plugin\s360_easytemplate_shop5\src\Services; use JTL\Shop; use Plugin\s360_easytemplate_shop5\src\Utils\Logger; class LicenceService { protected const API_BASE_URL = 'https://licence.easytemplate360.de/api/v1/public/'; protected const API_LICENCE_PATH = 'license/'; protected const API_FONTS_PATH = 'webfonts/'; protected const API_NEWS_PATH = 'news'; protected const API_VERSIONS_PATH = 'versions'; protected const API_DIALOG_PATH = 'plugindialog/'; protected const MIN_MAJOR_VERSION = 2; protected const LICENCE_TYPE_DEV = 90; protected const LICENCE_TYPE_FREE = 95; protected const LICENCE_TYPE_TRIAL = 100; protected const LICENCE_TYPE_STARTER = 200; protected const LICENCE_TYPE_PRO = 300; protected const LICENCE_TYPE_BUSINESS = 400; protected const LICENCE_TYPE_PARTNER = 500; protected static $instance = null; protected function __construct() { } public function getFonts(): array { if (empty(AdminSessionService::get(AdminSessionService::KEY_FONTS))) { $this->remoteGetFonts(); } return AdminSessionService::get(AdminSessionService::KEY_FONTS) ?? []; } public function getSupportId(): ?string { if (empty(AdminSessionService::get(AdminSessionService::KEY_SUPPORT_ID))) { $this->remoteGetLicence(); } return AdminSessionService::get(AdminSessionService::KEY_SUPPORT_ID); } public function getLicenceId(): ?string { if (empty(AdminSessionService::get(AdminSessionService::KEY_LICENCE_ID))) { $this->remoteGetLicence(); } return AdminSessionService::get(AdminSessionService::KEY_LICENCE_ID); } public function getNews(): ?array { return $this->remoteGetNews(); } public static function getInstance(): LicenceService { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; } public function getLicence(): ?array { return $this->remoteGetLicence(); } public function getCurrentVersions(): ?array { return $this->remoteGetCurrentVersions(); } private function getHostnameNormalized() { return mb_strtolower(str_replace(['https://www.', 'http://www.', 'https://', 'http://'], '', Shop::getURL(true))); } protected function remoteGetLicence() { $requestUrl = self::API_BASE_URL . self::API_LICENCE_PATH . $this->getHostnameNormalized(); $ch = curl_init($requestUrl); $this->setCurlOptions($ch); $result = curl_exec($ch); try { $this->checkCurlErrors($ch, $result); $licences = json_decode($result, true, 512, JSON_THROW_ON_ERROR); } catch (\RuntimeException $ex) { Logger::error($ex->getMessage()); return []; } catch (\JsonException $ex) { Logger::error('ET360-LicenceService: Request to licence server did not return valid JSON for licence! JSON Error: ' . $ex->getMessage()); return []; } finally { curl_close($ch); } if (empty($licences)) { return null; } $now = time(); $validLicenses = array_filter($licences, static function($licence) use ($now) { $isActive = (int) $licence['active'] === 1; if(!$isActive) { return false; } $isUnlimited = (int) $licence['isUnlimited'] === 1; if($isUnlimited && (int)$licence['validVersion'] < self::MIN_MAJOR_VERSION) { return false; } if(!$isUnlimited && $now > (int) $licence['validUntil']) { return false; } return true; }); if (empty($validLicenses)) { return null; } $bestLicence = array_reduce($validLicenses, static function($bestLicence, $licence) { if((int)$licence['licensetype']['id'] > (int)$bestLicence['licensetype']['id']) { return $licence; } return $bestLicence; }, $validLicenses[0]); if($bestLicence !== null) { AdminSessionService::set(AdminSessionService::KEY_LICENCE, $bestLicence); AdminSessionService::set(AdminSessionService::KEY_LICENCE_ID, (string)$bestLicence['id']); AdminSessionService::set(AdminSessionService::KEY_SUPPORT_ID, (string)$bestLicence['supportId']); } return $bestLicence; } protected function remoteGetFonts(): array { $requestUrl = self::API_BASE_URL . self::API_FONTS_PATH . $this->getSupportId(); $ch = curl_init($requestUrl); $this->setCurlOptions($ch); $result = curl_exec($ch); $webfonts = []; try { $this->checkCurlErrors($ch, $result); $webfonts = json_decode($result, true, 512, JSON_THROW_ON_ERROR); } catch (\RuntimeException $ex) { Logger::error($ex->getMessage()); return []; } catch (\JsonException $ex) { Logger::error('ET360-LicenceService: Request to licence server did not return valid JSON for fonts! JSON Error: ' . $ex->getMessage()); return []; } finally { curl_close($ch); } if(!\is_array($webfonts)) { $webfonts = []; } if(!empty($webfonts)) { AdminSessionService::set(AdminSessionService::KEY_FONTS, $webfonts); } return $webfonts; } protected function remoteGetNews(): array { $requestUrl = self::API_BASE_URL . self::API_NEWS_PATH; $ch = curl_init($requestUrl); $this->setCurlOptions($ch); $result = curl_exec($ch); try { $this->checkCurlErrors($ch, $result); $news = json_decode($result, true, 512, JSON_THROW_ON_ERROR); } catch (\RuntimeException $ex) { Logger::error($ex->getMessage()); return []; } catch (\JsonException $ex) { Logger::error('ET360-LicenceService: Request to licence server did not return valid JSON for news! JSON Error: ' . $ex->getMessage()); return []; } finally { curl_close($ch); } return $news; } protected function remoteGetCurrentVersions(): ?array { $requestUrl = self::API_BASE_URL . self::API_VERSIONS_PATH; $ch = curl_init($requestUrl); $this->setCurlOptions($ch); $result = curl_exec($ch); $versions = null; try { $this->checkCurlErrors($ch, $result); $versions = json_decode($result, true, 512, JSON_THROW_ON_ERROR); } catch (\RuntimeException $ex) { Logger::error($ex->getMessage()); return null; } catch (\JsonException $ex) { Logger::error('ET360-LicenceService: Request to licence server did not return valid JSON for current versions! JSON Error: ' . $ex->getMessage()); return null; } finally { curl_close($ch); } return $versions; } public function getDialogMessages(): array { return $this->remoteGetDialogMessages(); } public function confirmDialogMessage($secret): bool { if(empty($secret)) { Logger::debug('ET360-LicenceService: Unable to confirm dialog with empty secret.'); return false; } $requestUrl = self::API_BASE_URL . self::API_DIALOG_PATH . 'agree/' . $secret; $ch = curl_init($requestUrl); $this->setCurlOptions($ch); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([])); curl_exec($ch); try { $this->checkCurlErrors($ch); } catch (\RuntimeException $ex) { Logger::error($ex->getMessage()); return false; } finally { curl_close($ch); } return true; } protected function remoteGetDialogMessages(): array { $dialogMessages = []; $licenceId = $this->getLicenceId(); if(null === $licenceId) { return []; } $requestUrl = self::API_BASE_URL . self::API_DIALOG_PATH . $this->getLicenceId(); $ch = curl_init($requestUrl); $this->setCurlOptions($ch); $result = curl_exec($ch); try { $this->checkCurlErrors($ch, $result); $dialogMessages = json_decode($result, true, 512, JSON_THROW_ON_ERROR); } catch (\RuntimeException $ex) { Logger::error($ex->getMessage()); return []; } catch (\JsonException $ex) { Logger::error('ET360-LicenceService: Request to licence server did not return valid JSON for dialog messages! JSON Error: ' . $ex->getMessage()); return []; } finally { curl_close($ch); } return $dialogMessages; } protected function checkCurlErrors($ch, $response = ''): void { $curlError = curl_error($ch); if ($curlError !== '') { throw new \RuntimeException('ET360-LicenceService: Request to licence server failed: ' . $curlError); } if ($response !== '' && !is_string($response)) { throw new \RuntimeException('ET360-LicenceService: Request to licence server failed without error, but response is not a string: "' . $response .'"'); } } protected function setCurlOptions($ch): void { curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); if(defined('ET360_SKIP_SSL_VALIDATION') && constant('ET360_SKIP_SSL_VALIDATION')) { Logger::warn('ET360-LicenceService: SSL VALIDATION DISABLED.'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); } } }

Did this file decode correctly?

Original Code

<?php
eval(base64_decode('IGRlY2xhcmUoc3RyaWN0X3R5cGVzID0gMSk7IG5hbWVzcGFjZSBQbHVnaW5cczM2MF9lYXN5dGVtcGxhdGVfc2hvcDVcc3JjXFNlcnZpY2VzOyB1c2UgSlRMXFNob3A7IHVzZSBQbHVnaW5cczM2MF9lYXN5dGVtcGxhdGVfc2hvcDVcc3JjXFV0aWxzXExvZ2dlcjsgY2xhc3MgTGljZW5jZVNlcnZpY2UgeyBwcm90ZWN0ZWQgY29uc3QgQVBJX0JBU0VfVVJMID0gJ2h0dHBzOi8vbGljZW5jZS5lYXN5dGVtcGxhdGUzNjAuZGUvYXBpL3YxL3B1YmxpYy8nOyBwcm90ZWN0ZWQgY29uc3QgQVBJX0xJQ0VOQ0VfUEFUSCA9ICdsaWNlbnNlLyc7IHByb3RlY3RlZCBjb25zdCBBUElfRk9OVFNfUEFUSCA9ICd3ZWJmb250cy8nOyBwcm90ZWN0ZWQgY29uc3QgQVBJX05FV1NfUEFUSCA9ICduZXdzJzsgcHJvdGVjdGVkIGNvbnN0IEFQSV9WRVJTSU9OU19QQVRIID0gJ3ZlcnNpb25zJzsgcHJvdGVjdGVkIGNvbnN0IEFQSV9ESUFMT0dfUEFUSCA9ICdwbHVnaW5kaWFsb2cvJzsgcHJvdGVjdGVkIGNvbnN0IE1JTl9NQUpPUl9WRVJTSU9OID0gMjsgcHJvdGVjdGVkIGNvbnN0IExJQ0VOQ0VfVFlQRV9ERVYgPSA5MDsgcHJvdGVjdGVkIGNvbnN0IExJQ0VOQ0VfVFlQRV9GUkVFID0gOTU7IHByb3RlY3RlZCBjb25zdCBMSUNFTkNFX1RZUEVfVFJJQUwgPSAxMDA7IHByb3RlY3RlZCBjb25zdCBMSUNFTkNFX1RZUEVfU1RBUlRFUiA9IDIwMDsgcHJvdGVjdGVkIGNvbnN0IExJQ0VOQ0VfVFlQRV9QUk8gPSAzMDA7IHByb3RlY3RlZCBjb25zdCBMSUNFTkNFX1RZUEVfQlVTSU5FU1MgPSA0MDA7IHByb3RlY3RlZCBjb25zdCBMSUNFTkNFX1RZUEVfUEFSVE5FUiA9IDUwMDsgcHJvdGVjdGVkIHN0YXRpYyAkaW5zdGFuY2UgPSBudWxsOyBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7IH0gcHVibGljIGZ1bmN0aW9uIGdldEZvbnRzKCk6IGFycmF5IHsgaWYgKGVtcHR5KEFkbWluU2Vzc2lvblNlcnZpY2U6OmdldChBZG1pblNlc3Npb25TZXJ2aWNlOjpLRVlfRk9OVFMpKSkgeyAkdGhpcy0+cmVtb3RlR2V0Rm9udHMoKTsgfSByZXR1cm4gQWRtaW5TZXNzaW9uU2VydmljZTo6Z2V0KEFkbWluU2Vzc2lvblNlcnZpY2U6OktFWV9GT05UUykgPz8gW107IH0gcHVibGljIGZ1bmN0aW9uIGdldFN1cHBvcnRJZCgpOiA/c3RyaW5nIHsgaWYgKGVtcHR5KEFkbWluU2Vzc2lvblNlcnZpY2U6OmdldChBZG1pblNlc3Npb25TZXJ2aWNlOjpLRVlfU1VQUE9SVF9JRCkpKSB7ICR0aGlzLT5yZW1vdGVHZXRMaWNlbmNlKCk7IH0gcmV0dXJuIEFkbWluU2Vzc2lvblNlcnZpY2U6OmdldChBZG1pblNlc3Npb25TZXJ2aWNlOjpLRVlfU1VQUE9SVF9JRCk7IH0gcHVibGljIGZ1bmN0aW9uIGdldExpY2VuY2VJZCgpOiA/c3RyaW5nIHsgaWYgKGVtcHR5KEFkbWluU2Vzc2lvblNlcnZpY2U6OmdldChBZG1pblNlc3Npb25TZXJ2aWNlOjpLRVlfTElDRU5DRV9JRCkpKSB7ICR0aGlzLT5yZW1vdGVHZXRMaWNlbmNlKCk7IH0gcmV0dXJuIEFkbWluU2Vzc2lvblNlcnZpY2U6OmdldChBZG1pblNlc3Npb25TZXJ2aWNlOjpLRVlfTElDRU5DRV9JRCk7IH0gcHVibGljIGZ1bmN0aW9uIGdldE5ld3MoKTogP2FycmF5IHsgcmV0dXJuICR0aGlzLT5yZW1vdGVHZXROZXdzKCk7IH0gcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YW5jZSgpOiBMaWNlbmNlU2VydmljZSB7IGlmIChzZWxmOjokaW5zdGFuY2UgPT09IG51bGwpIHsgc2VsZjo6JGluc3RhbmNlID0gbmV3IHNlbGYoKTsgfSByZXR1cm4gc2VsZjo6JGluc3RhbmNlOyB9IHB1YmxpYyBmdW5jdGlvbiBnZXRMaWNlbmNlKCk6ID9hcnJheSB7IHJldHVybiAkdGhpcy0+cmVtb3RlR2V0TGljZW5jZSgpOyB9IHB1YmxpYyBmdW5jdGlvbiBnZXRDdXJyZW50VmVyc2lvbnMoKTogP2FycmF5IHsgcmV0dXJuICR0aGlzLT5yZW1vdGVHZXRDdXJyZW50VmVyc2lvbnMoKTsgfSBwcml2YXRlIGZ1bmN0aW9uIGdldEhvc3RuYW1lTm9ybWFsaXplZCgpIHsgcmV0dXJuIG1iX3N0cnRvbG93ZXIoc3RyX3JlcGxhY2UoWydodHRwczovL3d3dy4nLCAnaHR0cDovL3d3dy4nLCAnaHR0cHM6Ly8nLCAnaHR0cDovLyddLCAnJywgU2hvcDo6Z2V0VVJMKHRydWUpKSk7IH0gcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbW90ZUdldExpY2VuY2UoKSB7ICRyZXF1ZXN0VXJsID0gc2VsZjo6QVBJX0JBU0VfVVJMIC4gc2VsZjo6QVBJX0xJQ0VOQ0VfUEFUSCAuICR0aGlzLT5nZXRIb3N0bmFtZU5vcm1hbGl6ZWQoKTsgJGNoID0gY3VybF9pbml0KCRyZXF1ZXN0VXJsKTsgJHRoaXMtPnNldEN1cmxPcHRpb25zKCRjaCk7ICRyZXN1bHQgPSBjdXJsX2V4ZWMoJGNoKTsgdHJ5IHsgJHRoaXMtPmNoZWNrQ3VybEVycm9ycygkY2gsICRyZXN1bHQpOyAkbGljZW5jZXMgPSBqc29uX2RlY29kZSgkcmVzdWx0LCB0cnVlLCA1MTIsIEpTT05fVEhST1dfT05fRVJST1IpOyB9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZXgpIHsgTG9nZ2VyOjplcnJvcigkZXgtPmdldE1lc3NhZ2UoKSk7IHJldHVybiBbXTsgfSBjYXRjaCAoXEpzb25FeGNlcHRpb24gJGV4KSB7IExvZ2dlcjo6ZXJyb3IoJ0VUMzYwLUxpY2VuY2VTZXJ2aWNlOiBSZXF1ZXN0IHRvIGxpY2VuY2Ugc2VydmVyIGRpZCBub3QgcmV0dXJuIHZhbGlkIEpTT04gZm9yIGxpY2VuY2UhIEpTT04gRXJyb3I6ICcgLiAkZXgtPmdldE1lc3NhZ2UoKSk7IHJldHVybiBbXTsgfSBmaW5hbGx5IHsgY3VybF9jbG9zZSgkY2gpOyB9IGlmIChlbXB0eSgkbGljZW5jZXMpKSB7IHJldHVybiBudWxsOyB9ICRub3cgPSB0aW1lKCk7ICR2YWxpZExpY2Vuc2VzID0gYXJyYXlfZmlsdGVyKCRsaWNlbmNlcywgc3RhdGljIGZ1bmN0aW9uKCRsaWNlbmNlKSB1c2UgKCRub3cpIHsgJGlzQWN0aXZlID0gKGludCkgJGxpY2VuY2VbJ2FjdGl2ZSddID09PSAxOyBpZighJGlzQWN0aXZlKSB7IHJldHVybiBmYWxzZTsgfSAkaXNVbmxpbWl0ZWQgPSAoaW50KSAkbGljZW5jZVsnaXNVbmxpbWl0ZWQnXSA9PT0gMTsgaWYoJGlzVW5saW1pdGVkICYmIChpbnQpJGxpY2VuY2VbJ3ZhbGlkVmVyc2lvbiddIDwgc2VsZjo6TUlOX01BSk9SX1ZFUlNJT04pIHsgcmV0dXJuIGZhbHNlOyB9IGlmKCEkaXNVbmxpbWl0ZWQgJiYgJG5vdyA+IChpbnQpICRsaWNlbmNlWyd2YWxpZFVudGlsJ10pIHsgcmV0dXJuIGZhbHNlOyB9IHJldHVybiB0cnVlOyB9KTsgaWYgKGVtcHR5KCR2YWxpZExpY2Vuc2VzKSkgeyByZXR1cm4gbnVsbDsgfSAkYmVzdExpY2VuY2UgPSBhcnJheV9yZWR1Y2UoJHZhbGlkTGljZW5zZXMsIHN0YXRpYyBmdW5jdGlvbigkYmVzdExpY2VuY2UsICRsaWNlbmNlKSB7IGlmKChpbnQpJGxpY2VuY2VbJ2xpY2Vuc2V0eXBlJ11bJ2lkJ10gPiAoaW50KSRiZXN0TGljZW5jZVsnbGljZW5zZXR5cGUnXVsnaWQnXSkgeyByZXR1cm4gJGxpY2VuY2U7IH0gcmV0dXJuICRiZXN0TGljZW5jZTsgfSwgJHZhbGlkTGljZW5zZXNbMF0pOyBpZigkYmVzdExpY2VuY2UgIT09IG51bGwpIHsgQWRtaW5TZXNzaW9uU2VydmljZTo6c2V0KEFkbWluU2Vzc2lvblNlcnZpY2U6OktFWV9MSUNFTkNFLCAkYmVzdExpY2VuY2UpOyBBZG1pblNlc3Npb25TZXJ2aWNlOjpzZXQoQWRtaW5TZXNzaW9uU2VydmljZTo6S0VZX0xJQ0VOQ0VfSUQsIChzdHJpbmcpJGJlc3RMaWNlbmNlWydpZCddKTsgQWRtaW5TZXNzaW9uU2VydmljZTo6c2V0KEFkbWluU2Vzc2lvblNlcnZpY2U6OktFWV9TVVBQT1JUX0lELCAoc3RyaW5nKSRiZXN0TGljZW5jZVsnc3VwcG9ydElkJ10pOyB9IHJldHVybiAkYmVzdExpY2VuY2U7IH0gcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbW90ZUdldEZvbnRzKCk6IGFycmF5IHsgJHJlcXVlc3RVcmwgPSBzZWxmOjpBUElfQkFTRV9VUkwgLiBzZWxmOjpBUElfRk9OVFNfUEFUSCAuICR0aGlzLT5nZXRTdXBwb3J0SWQoKTsgJGNoID0gY3VybF9pbml0KCRyZXF1ZXN0VXJsKTsgJHRoaXMtPnNldEN1cmxPcHRpb25zKCRjaCk7ICRyZXN1bHQgPSBjdXJsX2V4ZWMoJGNoKTsgJHdlYmZvbnRzID0gW107IHRyeSB7ICR0aGlzLT5jaGVja0N1cmxFcnJvcnMoJGNoLCAkcmVzdWx0KTsgJHdlYmZvbnRzID0ganNvbl9kZWNvZGUoJHJlc3VsdCwgdHJ1ZSwgNTEyLCBKU09OX1RIUk9XX09OX0VSUk9SKTsgfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGV4KSB7IExvZ2dlcjo6ZXJyb3IoJGV4LT5nZXRNZXNzYWdlKCkpOyByZXR1cm4gW107IH0gY2F0Y2ggKFxKc29uRXhjZXB0aW9uICRleCkgeyBMb2dnZXI6OmVycm9yKCdFVDM2MC1MaWNlbmNlU2VydmljZTogUmVxdWVzdCB0byBsaWNlbmNlIHNlcnZlciBkaWQgbm90IHJldHVybiB2YWxpZCBKU09OIGZvciBmb250cyEgSlNPTiBFcnJvcjogJyAuICRleC0+Z2V0TWVzc2FnZSgpKTsgcmV0dXJuIFtdOyB9IGZpbmFsbHkgeyBjdXJsX2Nsb3NlKCRjaCk7IH0gaWYoIVxpc19hcnJheSgkd2ViZm9udHMpKSB7ICR3ZWJmb250cyA9IFtdOyB9IGlmKCFlbXB0eSgkd2ViZm9udHMpKSB7IEFkbWluU2Vzc2lvblNlcnZpY2U6OnNldChBZG1pblNlc3Npb25TZXJ2aWNlOjpLRVlfRk9OVFMsICR3ZWJmb250cyk7IH0gcmV0dXJuICR3ZWJmb250czsgfSBwcm90ZWN0ZWQgZnVuY3Rpb24gcmVtb3RlR2V0TmV3cygpOiBhcnJheSB7ICRyZXF1ZXN0VXJsID0gc2VsZjo6QVBJX0JBU0VfVVJMIC4gc2VsZjo6QVBJX05FV1NfUEFUSDsgJGNoID0gY3VybF9pbml0KCRyZXF1ZXN0VXJsKTsgJHRoaXMtPnNldEN1cmxPcHRpb25zKCRjaCk7ICRyZXN1bHQgPSBjdXJsX2V4ZWMoJGNoKTsgdHJ5IHsgJHRoaXMtPmNoZWNrQ3VybEVycm9ycygkY2gsICRyZXN1bHQpOyAkbmV3cyA9IGpzb25fZGVjb2RlKCRyZXN1bHQsIHRydWUsIDUxMiwgSlNPTl9USFJPV19PTl9FUlJPUik7IH0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRleCkgeyBMb2dnZXI6OmVycm9yKCRleC0+Z2V0TWVzc2FnZSgpKTsgcmV0dXJuIFtdOyB9IGNhdGNoIChcSnNvbkV4Y2VwdGlvbiAkZXgpIHsgTG9nZ2VyOjplcnJvcignRVQzNjAtTGljZW5jZVNlcnZpY2U6IFJlcXVlc3QgdG8gbGljZW5jZSBzZXJ2ZXIgZGlkIG5vdCByZXR1cm4gdmFsaWQgSlNPTiBmb3IgbmV3cyEgSlNPTiBFcnJvcjogJyAuICRleC0+Z2V0TWVzc2FnZSgpKTsgcmV0dXJuIFtdOyB9IGZpbmFsbHkgeyBjdXJsX2Nsb3NlKCRjaCk7IH0gcmV0dXJuICRuZXdzOyB9IHByb3RlY3RlZCBmdW5jdGlvbiByZW1vdGVHZXRDdXJyZW50VmVyc2lvbnMoKTogP2FycmF5IHsgJHJlcXVlc3RVcmwgPSBzZWxmOjpBUElfQkFTRV9VUkwgLiBzZWxmOjpBUElfVkVSU0lPTlNfUEFUSDsgJGNoID0gY3VybF9pbml0KCRyZXF1ZXN0VXJsKTsgJHRoaXMtPnNldEN1cmxPcHRpb25zKCRjaCk7ICRyZXN1bHQgPSBjdXJsX2V4ZWMoJGNoKTsgJHZlcnNpb25zID0gbnVsbDsgdHJ5IHsgJHRoaXMtPmNoZWNrQ3VybEVycm9ycygkY2gsICRyZXN1bHQpOyAkdmVyc2lvbnMgPSBqc29uX2RlY29kZSgkcmVzdWx0LCB0cnVlLCA1MTIsIEpTT05fVEhST1dfT05fRVJST1IpOyB9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZXgpIHsgTG9nZ2VyOjplcnJvcigkZXgtPmdldE1lc3NhZ2UoKSk7IHJldHVybiBudWxsOyB9IGNhdGNoIChcSnNvbkV4Y2VwdGlvbiAkZXgpIHsgTG9nZ2VyOjplcnJvcignRVQzNjAtTGljZW5jZVNlcnZpY2U6IFJlcXVlc3QgdG8gbGljZW5jZSBzZXJ2ZXIgZGlkIG5vdCByZXR1cm4gdmFsaWQgSlNPTiBmb3IgY3VycmVudCB2ZXJzaW9ucyEgSlNPTiBFcnJvcjogJyAuICRleC0+Z2V0TWVzc2FnZSgpKTsgcmV0dXJuIG51bGw7IH0gZmluYWxseSB7IGN1cmxfY2xvc2UoJGNoKTsgfSByZXR1cm4gJHZlcnNpb25zOyB9IHB1YmxpYyBmdW5jdGlvbiBnZXREaWFsb2dNZXNzYWdlcygpOiBhcnJheSB7IHJldHVybiAkdGhpcy0+cmVtb3RlR2V0RGlhbG9nTWVzc2FnZXMoKTsgfSBwdWJsaWMgZnVuY3Rpb24gY29uZmlybURpYWxvZ01lc3NhZ2UoJHNlY3JldCk6IGJvb2wgeyBpZihlbXB0eSgkc2VjcmV0KSkgeyBMb2dnZXI6OmRlYnVnKCdFVDM2MC1MaWNlbmNlU2VydmljZTogVW5hYmxlIHRvIGNvbmZpcm0gZGlhbG9nIHdpdGggZW1wdHkgc2VjcmV0LicpOyByZXR1cm4gZmFsc2U7IH0gJHJlcXVlc3RVcmwgPSBzZWxmOjpBUElfQkFTRV9VUkwgLiBzZWxmOjpBUElfRElBTE9HX1BBVEggLiAnYWdyZWUvJyAuICRzZWNyZXQ7ICRjaCA9IGN1cmxfaW5pdCgkcmVxdWVzdFVybCk7ICR0aGlzLT5zZXRDdXJsT3B0aW9ucygkY2gpOyBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgMSk7IGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCBodHRwX2J1aWxkX3F1ZXJ5KFtdKSk7IGN1cmxfZXhlYygkY2gpOyB0cnkgeyAkdGhpcy0+Y2hlY2tDdXJsRXJyb3JzKCRjaCk7IH0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRleCkgeyBMb2dnZXI6OmVycm9yKCRleC0+Z2V0TWVzc2FnZSgpKTsgcmV0dXJuIGZhbHNlOyB9IGZpbmFsbHkgeyBjdXJsX2Nsb3NlKCRjaCk7IH0gcmV0dXJuIHRydWU7IH0gcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbW90ZUdldERpYWxvZ01lc3NhZ2VzKCk6IGFycmF5IHsgJGRpYWxvZ01lc3NhZ2VzID0gW107ICRsaWNlbmNlSWQgPSAkdGhpcy0+Z2V0TGljZW5jZUlkKCk7IGlmKG51bGwgPT09ICRsaWNlbmNlSWQpIHsgcmV0dXJuIFtdOyB9ICRyZXF1ZXN0VXJsID0gc2VsZjo6QVBJX0JBU0VfVVJMIC4gc2VsZjo6QVBJX0RJQUxPR19QQVRIIC4gJHRoaXMtPmdldExpY2VuY2VJZCgpOyAkY2ggPSBjdXJsX2luaXQoJHJlcXVlc3RVcmwpOyAkdGhpcy0+c2V0Q3VybE9wdGlvbnMoJGNoKTsgJHJlc3VsdCA9IGN1cmxfZXhlYygkY2gpOyB0cnkgeyAkdGhpcy0+Y2hlY2tDdXJsRXJyb3JzKCRjaCwgJHJlc3VsdCk7ICRkaWFsb2dNZXNzYWdlcyA9IGpzb25fZGVjb2RlKCRyZXN1bHQsIHRydWUsIDUxMiwgSlNPTl9USFJPV19PTl9FUlJPUik7IH0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRleCkgeyBMb2dnZXI6OmVycm9yKCRleC0+Z2V0TWVzc2FnZSgpKTsgcmV0dXJuIFtdOyB9IGNhdGNoIChcSnNvbkV4Y2VwdGlvbiAkZXgpIHsgTG9nZ2VyOjplcnJvcignRVQzNjAtTGljZW5jZVNlcnZpY2U6IFJlcXVlc3QgdG8gbGljZW5jZSBzZXJ2ZXIgZGlkIG5vdCByZXR1cm4gdmFsaWQgSlNPTiBmb3IgZGlhbG9nIG1lc3NhZ2VzISBKU09OIEVycm9yOiAnIC4gJGV4LT5nZXRNZXNzYWdlKCkpOyByZXR1cm4gW107IH0gZmluYWxseSB7IGN1cmxfY2xvc2UoJGNoKTsgfSByZXR1cm4gJGRpYWxvZ01lc3NhZ2VzOyB9IHByb3RlY3RlZCBmdW5jdGlvbiBjaGVja0N1cmxFcnJvcnMoJGNoLCAkcmVzcG9uc2UgPSAnJyk6IHZvaWQgeyAkY3VybEVycm9yID0gY3VybF9lcnJvcigkY2gpOyBpZiAoJGN1cmxFcnJvciAhPT0gJycpIHsgdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdFVDM2MC1MaWNlbmNlU2VydmljZTogUmVxdWVzdCB0byBsaWNlbmNlIHNlcnZlciBmYWlsZWQ6ICcgLiAkY3VybEVycm9yKTsgfSBpZiAoJHJlc3BvbnNlICE9PSAnJyAmJiAhaXNfc3RyaW5nKCRyZXNwb25zZSkpIHsgdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdFVDM2MC1MaWNlbmNlU2VydmljZTogUmVxdWVzdCB0byBsaWNlbmNlIHNlcnZlciBmYWlsZWQgd2l0aG91dCBlcnJvciwgYnV0IHJlc3BvbnNlIGlzIG5vdCBhIHN0cmluZzogIicgLiAkcmVzcG9uc2UgLiciJyk7IH0gfSBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0Q3VybE9wdGlvbnMoJGNoKTogdm9pZCB7IGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7IGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9USU1FT1VULCAzMCk7IGlmKGRlZmluZWQoJ0VUMzYwX1NLSVBfU1NMX1ZBTElEQVRJT04nKSAmJiBjb25zdGFudCgnRVQzNjBfU0tJUF9TU0xfVkFMSURBVElPTicpKSB7IExvZ2dlcjo6d2FybignRVQzNjAtTGljZW5jZVNlcnZpY2U6IFNTTCBWQUxJREFUSU9OIERJU0FCTEVELicpOyBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIDApOyBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIDApOyB9IH0gfQ=='));

Function Calls

base64_decode 1

Variables

None

Stats

MD5 4ad935b166fa908bc5f4a6a749a04b4e
Eval Count 1
Decode Time 90 ms