Вход Регистрация
Файл: aibolit-for-windows/aibolit/ai-bolit.php
Строк: 5425
<?php
///////////////////////////////////////////////////////////////////////////
// Created and developed by Greg Zemskov, Revisium Company
// Email: ai@revisium.com, http://revisium.com/ai/, skype: greg_zemskov

// Commercial usage is not allowed without a license purchase or written permission of the author
// Source code and signatures usage is not allowed

// Certificated in Federal Institute of Industrial Property in 2012
// http://revisium.com/ai/i/mini_aibolit.jpg

////////////////////////////////////////////////////////////////////////////
// Запрещено использование скрипта в коммерческих целях без приобретения лицензии.
// Запрещено использование исходного кода скрипта и сигнатур.
//
// По вопросам приобретения лицензии обращайтесь в компанию "Ревизиум": http://www.revisium.com
// ai@revisium.com
// На скрипт получено авторское свидетельство в Роспатенте
// http://revisium.com/ai/i/mini_aibolit.jpg
///////////////////////////////////////////////////////////////////////////

// put 1 for expert mode, 0 for basic check and 2 for paranoic mode
// установите 1 для режима "Эксперта", 0 для быстрой проверки и 2 для параноидальной проверки (для лечения сайта) 
define('AI_EXPERT_MODE'1); 

// Put any strong password to open the script from web
// Впишите вместо put_any_strong_password_here сложный пароль     
define('PASS''????????????????????'); 

//define('LANG', 'EN');
define('LANG''RU');

define('REPORT_MASK_PHPSIGN'1);
define('REPORT_MASK_SPAMLINKS'2);
define('REPORT_MASK_DOORWAYS'4);
define('REPORT_MASK_SUSP'8);
define('REPORT_MASK_CANDI'16);
define('REPORT_MASK_WRIT'32);
define('REPORT_MASK_FULL'REPORT_MASK_PHPSIGN REPORT_MASK_DOORWAYS REPORT_MASK_SUSP
/* <-- remove this line to enable "recommendations"  

| REPORT_MASK_SPAMLINKS 

 remove this line to enable "recommendations" --> */
);

define('SMART_SCAN'1);

define('AI_EXTRA_WARN'0);

$defaults = array(
    
'path' => dirname(__FILE__),
    
'scan_all_files' => 0// full scan (rather than just a .js, .php, .html, .htaccess)
    
'scan_delay' => 0// delay in file scanning to reduce system load
    
'max_size_to_scan' => '600K',
    
'site_url' => ''// website url
    
'no_rw_dir' => 0,
    
'skip_ext' => '',
    
'report_mask' =>  REPORT_MASK_FULL // full-featured report
);


define('DEBUG_MODE'0);

define('DIR_SEPARATOR''/');

define('DOUBLECHECK_FILE''AI-BOLIT-DOUBLECHECK.php');

if ((isset(
$_SERVER['OS']) && stripos('Win'$_SERVER['OS']) !== false)/* && stripos('CygWin', $_SERVER['OS']) === false)*/) {
   
define('DIR_SEPARATOR''\');
}

$g_SuspiciousFiles = array('
cgi', 'pl', 'o', 'so', 'py', 'sh', 'phtml', 'php3', 'php4', 'php5', 'shtml', 'suspicious');
$g_SensitiveFiles = array_merge(array('
php', 'js', 'htaccess', 'html', 'htm', 'tpl', 'inc', 'css', 'txt', 'sql'), $g_SuspiciousFiles);
$g_CriticalFiles = array('
php', 'htaccess', 'cgi', 'pl', 'o', 'so', 'py', 'sh', 'phtml', 'php3', 'php4', 'php5', 'shtml', 'suspicious');
$g_CriticalEntries = '
<?php|<?=|#!/usr|#!/bin|eval|assert|base64_decode|system|create_function|exec|popen|fwrite|fputs|file_get_|call_user_func|file_put_|$_REQUEST|ob_start|$_GET|$_POST|$_SERVER|$_FILES|move|copy|array_|reg_replace|mysql_|fsockopen|$GLOBALS|sqliteCreateFunction';
$g_VirusFiles = array('js''html''htm''suspicious');
$g_VirusEntries '<s*script|<s*iframe|<s*object|<s*embed|setTimeout|setInterval|location.|document.|window.|navigator.|$(this).';
$g_PhishFiles = array('js''html''htm''suspicious''php');
$g_PhishEntries '<s*title|<s*html|<s*form|<s*body';
$g_ShortListExt = array('php''php3''php4''php5''html''htm''phtml''shtml''khtml');

if (
LANG == 'RU') {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// RUSSIAN INTERFACE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
define('AI_STR_001''Отчет сканера AI-Bolit v@@VERSION@@:');
define('AI_STR_002''<b>Компания <a href="https://revisium.com/">"Ревизиум"</a>. Лечение сайтов от вирусов и защита от взлома.</b><p>Предлагаем услуги превентивной защиты сайта от взлома с использованием процедуры cms hardening ("цементирование сайта"). Подробности на <a href="https://revisium.com/ru/clients_faq/#m4">странице услуги</a>. <p>Лучшее лечение &mdash; это профилактика.');
define('AI_STR_003''Не оставляйте файл отчета на сервере, и не давайте на него прямых ссылок с других сайтов. Информация из отчета может быть использована злоумышленника для взлома сайта, так как содержит информацию о файлах и настройках сервера.');
define('AI_STR_004''Путь');
define('AI_STR_005''Изменение свойств');
define('AI_STR_006''Изменение содержимого');
define('AI_STR_007''Размер');
define('AI_STR_008''Конфигурация PHP');
define('AI_STR_009'"Вы установили слабый пароль на скрипт AI-BOLIT. Укажите пароль не менее 8 символов, содержащий латинские буквы в верхнем и нижнем регистре, а также цифры. Например, такой <b>%s</b>");
define('AI_STR_010'"Сканер AI-Bolit запускается с паролем. Если это первый запуск сканера, вам нужно придумать сложный пароль и вписать его в файле ai-bolit.php в строке №28. <p>Например, <b>define('PASS', '%s');</b><p>
После этого откройте сканер в браузере, указав пароль в параметре "
p". <p>Например, так <b>http://mysite.ru/ai-bolit.php?p=%s</b>. ");
define('AI_STR_011''Текущая директория не доступна для чтения скрипту. Пожалуйста, укажите права на доступ <b>rwxr-xr-x</b> или с помощью командной строки <b>chmod +r имя_директории</b>');
define('AI_STR_012'"Затрачено времени: <b>%s</b>. Сканирование начато %s, сканирование завершено %s");
define('AI_STR_013''Всего проверено %s директорий и %s файлов.');
define('AI_STR_014''<div class="rep" style="color: #0000A0">Внимание, скрипт выполнил быструю проверку сайта. Проверяются только наиболее критические файлы, но часть вредоносных скриптов может быть не обнаружена. Пожалуйста, запустите скрипт из командной строки для выполнения полного тестирования. Подробнее смотрите в <a href="https://revisium.com/ai/faq.php">FAQ вопрос №10</a>.</div>');
define('AI_STR_015''<div class="title">Критические замечания</div>');
define('AI_STR_016''Эти файлы могут быть вредоносными или хакерскими скриптами');
define('AI_STR_017''Вредоносные скрипты не найдены. Попробуйте сканер в режиме "Параноидальный".');
define('AI_STR_018''Эти файлы могут быть javascript вирусами');
define('AI_STR_019''Обнаружены сигнатуры исполняемых файлов unix и нехарактерных скриптов. Они могут быть вредоносными файлами');
define('AI_STR_020''Двойное расширение, зашифрованный контент или подозрение на вредоносный скрипт. Требуется дополнительный анализ');
define('AI_STR_021''Подозрение на вредоносный скрипт');
define('AI_STR_022''Символические ссылки (symlinks)');
define('AI_STR_023''Скрытые файлы');
define('AI_STR_024''Возможно, каталог с дорвеем');
define('AI_STR_025''Не найдено директорий c дорвеями');
define('AI_STR_026''Предупреждения');
define('AI_STR_027''Подозрение на мобильный редирект, подмену расширений или автовнедрение кода');
define('AI_STR_028''В не .php файле содержится стартовая сигнатура PHP кода. Возможно, там вредоносный код');
define('AI_STR_029''Дорвеи, реклама, спам-ссылки, редиректы');
define('AI_STR_030''Непроверенные файлы - ошибка чтения');
define('AI_STR_031''Невидимые ссылки. Подозрение на ссылочный спам');
define('AI_STR_032''Невидимые ссылки');
define('AI_STR_033''Отображены только первые ');
define('AI_STR_034''Подозрение на дорвей');
define('AI_STR_035''Скрипт использует код, который часто встречается во вредоносных скриптах');
define('AI_STR_036''Директории из файла .adirignore были пропущены при сканировании');
define('AI_STR_037''Версии найденных CMS');
define('AI_STR_038''Большие файлы (больше чем %s). Пропущено');
define('AI_STR_039''Не найдено файлов больше чем %s');
define('AI_STR_040''Временные файлы или файлы(каталоги) - кандидаты на удаление по ряду причин');
define('AI_STR_041''Потенциально небезопасно! Директории, доступные скрипту на запись');
define('AI_STR_042''Не найдено директорий, доступных на запись скриптом');
define('AI_STR_043''Использовано памяти при сканировании: ');
define('AI_STR_044''Просканированы только файлы, перечисленные в ' DOUBLECHECK_FILE '. Для полного сканирования удалите файл ' DOUBLECHECK_FILE ' и запустите сканер повторно.');
define('AI_STR_045''<div class="rep">Внимание! Выполнена экспресс-проверка сайта. Просканированы только файлы с расширением .php, .js, .html, .htaccess. В этом режиме могут быть пропущены вирусы и хакерские скрипты в файлах с другими расширениями. Чтобы выполнить более тщательное сканирование, поменяйте значение настройки на <b>'scan_all_files' => 1</b> в строке 50 или откройте сканер в браузере с параметром full: <b><a href="ai-bolit.php?p=' PASS '&full">ai-bolit.php?p=' PASS '&full</a></b>. <p>Не забудьте перед повторным запуском удалить файл ' DOUBLECHECK_FILE '</div>');
define('AI_STR_050''Замечания и предложения по работе скрипта и не обнаруженные вредоносные скрипты присылайте на <a href="mailto:ai@revisium.com">ai@revisium.com</a>.<p>Также будем чрезвычайно благодарны за любые упоминания скрипта AI-Bolit на вашем сайте, в блоге, среди друзей, знакомых и клиентов. Ссылочку можно поставить на <a href="https://revisium.com/ai/">https://revisium.com/ai/</a>. <p>Если будут вопросы - пишите <a href="mailto:ai@revisium.com">ai@revisium.com</a>. ');
define('AI_STR_051''Отчет по ');
define('AI_STR_052''Эвристический анализ обнаружил подозрительные файлы. Проверьте их на наличие вредоносного кода.');
define('AI_STR_053''Много косвенных вызовов функции');
define('AI_STR_054''Подозрение на обфусцированные переменные');
define('AI_STR_055''Подозрительное использование массива глобальных переменных');
define('AI_STR_056''Дробление строки на символы');
define('AI_STR_057''Сканирование выполнено в экспресс-режиме. Многие вредоносные скрипты могут быть не обнаружены.<br> Рекомендуем проверить сайт в режиме "Эксперт" или "Параноидальный". Подробно описано в <a href="https://revisium.com/ai/faq.php">FAQ</a> и инструкции к скрипту.');
define('AI_STR_058''Обнаружены фишинговые страницы');

define('AI_STR_059''Мобильных редиректов');
define('AI_STR_060''Вредоносных скриптов');
define('AI_STR_061''JS Вирусов');
define('AI_STR_062''Фишинговых страниц');
define('AI_STR_063''Исполняемых файлов');
define('AI_STR_064''IFRAME вставок');
define('AI_STR_065''Пропущенных больших файлов');
define('AI_STR_066''Ошибок чтения файлов');
define('AI_STR_067''Зашифрованных файлов');
define('AI_STR_068''Подозрительных (эвристика)');
define('AI_STR_069''Символических ссылок');
define('AI_STR_070''Скрытых файлов');
define('AI_STR_072''Рекламных ссылок и кодов');
define('AI_STR_073''Пустых ссылок');
define('AI_STR_074''Сводный отчет');
define('AI_STR_075''Скрипт бесплатный только для личного некоммерческого использования. Есть <a href="https://revisium.com/ai/faq.php#faq11" target=_blank>коммерческая лицензия</a> (пункт №11).');

$tmp_str = <<<HTML_FOOTER
   <div class="disclaimer"><span class="vir">[!]</span> Отказ от гарантий: невозможно гарантировать обнаружение всех вредоносных скриптов. Поэтому разработчик сканера не несет ответственности за возможные последствия работы сканера AI-Bolit или неоправданные ожидания пользователей относительно функциональности и возможностей.
   </div>
   <div class="thanx">
      Замечания и предложения по работе скрипта, а также не обнаруженные вредоносные скрипты вы можете присылать на <a href="mailto:ai@revisium.com">ai@revisium.com</a>.<br/>
      Также будем чрезвычайно благодарны за любые упоминания сканера AI-Bolit на вашем сайте, в блоге, среди друзей, знакомых и клиентов. <br/>Ссылку можно поставить на страницу <a href="https://revisium.com/ai/">https://revisium.com/ai/</a>.<br/> 
     <p>Получить консультацию или задать вопросы можно по email <a href="mailto:ai@revisium.com">ai@revisium.com</a>.</p> 
    </div>
HTML_FOOTER;

define('AI_STR_076'$tmp_str);
define('AI_STR_077'"Подозрительные параметры времени изменения файла");
define('AI_STR_078'"Подозрительные атрибуты файла");
define('AI_STR_079'"Подозрительное местоположение файла");
define('AI_STR_080'"Обращаем внимание, что обнаруженные файлы не всегда являются вирусами и хакерскими скриптами. Сканер старается минимизировать число ложных обнаружений, но это не всегда возможно, так как найденный фрагмент может встречаться как во вредоносных скриптах, так и в обычных.");
define('AI_STR_081'"Уязвимости в скриптах");
define('AI_STR_082'"Добавленные файлы");
define('AI_STR_083'"Измененные файлы");
define('AI_STR_084'"Удаленные файлы");
define('AI_STR_085'"Добавленные каталоги");
define('AI_STR_086'"Удаленные каталоги");
define('AI_STR_087'"Изменения в файловой структуре");

$l_Offer =<<<OFFER
    <div>
     <div class="crit" style="font-size: 17px;"><b>Внимание! На вашем сайте обнаружен вредоносный код</b>.</div> 
     <br/>Скорее всего, ваш сайт был взломан и заражен. Вашему сайту требуется помощь специалистов по информационной безопасности.
    </div>
    <br/>
    <div>
       Обратитесь в <a href="https://revisium.com/" target=_blank>компанию "Ревизиум"</a> за консультацией или закажите лечение сайта и защиту от взлома.<br/>
    </div>
    <br/>
    <div>
       <a href="mailto:ai@revisium.com">ai@revisium.com</a>, <a href="https://revisium.com/ru/order/">https://revisium.com</a>
    </div>
    <div class="caution">@@CAUTION@@</div>
OFFER;

} else {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ENGLISH INTERFACE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
define('AI_STR_001''AI-Bolit v@@VERSION@@ Scan Report:');
define('AI_STR_002''');
define('AI_STR_003''Caution! Do not leave either ai-bolit.php or report file on server and do not provide direct links to the report file. Report file contains sensitive information about your website which could be used by hackers. So keep it in safe place and don't leave on website!');
define('
AI_STR_004', 'Path');
define('
AI_STR_005', 'iNode Changed');
define('
AI_STR_006', 'Modified');
define('
AI_STR_007', 'Size');
define('
AI_STR_008', 'PHP Info');
define('
AI_STR_009', "Your password for AI-BOLIT is too weak. Password must be more than 8 character length, contain both latin letters in upper and lower case, and digits. E.g. <b>%s</b>");
define('
AI_STR_010', "Open AI-BOLIT with password specified in the beggining of file in PASS variable. <br/>E.g. http://you_website.com/ai-bolit.php?p=<b>%s</b>");
define('
AI_STR_011', 'Current folder is not readablePlease change permission for <b>rwxr-xr-x</b> or using command line <b>chmod +r folder_name</b>');
define('
AI_STR_012', "<div class="rep">%s malicious signatures known, %s virus signatures and other malicious code. Elapsed: <b>%s</b
>.<br/>Started: %s. Stopped: %s</div> ");
define('
AI_STR_013', 'Scanned %s folders and %s files.');
define('
AI_STR_014', '<div class="rep" style="color: #0000A0">AttentionScript has performed quick scanIt scans only .html/.js/.php files  in quick scan mode so some of malicious scripts might not be detected. <br>Please launch script from a command line thru SSH to perform full scan.');
define('
AI_STR_015', '<div class="title">Critical</div>');
define('
AI_STR_016', 'Shell script signatures detectedMight be a malicious or hacker's scripts');
define('AI_STR_017''Shell scripts signatures not detected.');
define('AI_STR_018''Javascript virus signatures detected:');
define('AI_STR_019''Unix executables signatures and odd scripts detected. They might be a malicious binaries or rootkits:');
define('AI_STR_020''Suspicious encoded strings, extra .php extention or external includes detected in PHP files. Might be a malicious or hacker's script:');
define('
AI_STR_021', 'Might be a malicious or hacker's script:');
define('AI_STR_022''Symlinks:');
define('AI_STR_023''Hidden files:');
define('AI_STR_024''Files might be a part of doorway:');
define('AI_STR_025''Doorway folders not detected');
define('AI_STR_026''Warnings');
define('AI_STR_027''Malicious code in .htaccess (redirect to external server, extention handler replacement or malicious code auto-append):');
define('AI_STR_028''Non-PHP file has PHP signature. Check for malicious code:');
define('AI_STR_029''This script has black-SEO links or linkfarm. Check if it was installed by yourself:');
define('AI_STR_030''Reading error. Skipped.');
define('AI_STR_031''These files have invisible links, might be black-seo stuff:');
define('AI_STR_032''List of invisible links:');
define('AI_STR_033''Displayed first ');
define('AI_STR_034''Folders contained too many .php or .html files. Might be a doorway:');
define('AI_STR_035''Suspicious code detected. It's usually used in malicious scrips:');
define('
AI_STR_036', 'The following list of files specified in .adirignore has been skipped:');
define('
AI_STR_037', 'CMS found:');
define('
AI_STR_038', 'Large files (greater than %sSkipped:');
define('
AI_STR_039', 'Files greater than %s not found');
define('
AI_STR_040', 'Files recommended to be remove due to security reason:');
define('
AI_STR_041', 'Potentially unsafeFolders which are writable for scripts:');
define('
AI_STR_042', 'Writable folders not found');
define('
AI_STR_043', 'Memory used');
define('
AI_STR_044', 'Quick scan through the files from ' . DOUBLECHECK_FILE . '. For full scan remove ' . DOUBLECHECK_FILE . ' and launch scanner once again.');
define('
AI_STR_045', '<div class="notice"><span class="vir">[!]</spanAi-BOLIT is working in quick scan modeonly .php, .html, .htaccess files will be checkedChange the following setting 'scan_all_files' => 1 to perform full scanning.</b>. </div>');
define('
AI_STR_050', "I'm sincerely appreciate reports for any bugs you may found in the scriptPlease email me: <a href="mailto:audit@revisium.com">audit@revisium.com</a>.<pAlso I appriciate any reference to the script in your blog or forum postsThank you for the link to download page: <a href="https://revisium.com/aibo/">https://revisium.com/aibo/</a>");
define('AI_STR_051''Report for ');
define('AI_STR_052''Heuristic Analyzer has detected suspicious files. Check if they are malware.');
define('AI_STR_053''Function called by reference');
define('AI_STR_054''Suspected for obfuscated variables');
define('AI_STR_055''Suspected for $GLOBAL array usage');
define('AI_STR_056''Abnormal split of string');
define('AI_STR_057''Scanning has been done in simple mode. It is strongly recommended to perform scanning in "Expert" mode. See readme.txt for details.');
define('AI_STR_058''Phishing pages detected:');

define('AI_STR_059''Mobile redirects');
define('AI_STR_060''Malware');
define('AI_STR_061''JS viruses');
define('AI_STR_062''Phishing pages');
define('AI_STR_063''Unix executables');
define('AI_STR_064''IFRAME injections');
define('AI_STR_065''Skipped big files');
define('AI_STR_066''Reading errors');
define('AI_STR_067''Encrypted files');
define('AI_STR_068''Suspicious (heuristics)');
define('AI_STR_069''Symbolic links');
define('AI_STR_070''Hidden files');
define('AI_STR_072''Adware and spam links');
define('AI_STR_073''Empty links');
define('AI_STR_074''Summary');
define('AI_STR_075''For non-commercial use only. Please, purchase the license for commercial usage of the scanner. Email us: ai@revisium.com');

$tmp_str =<<<HTML_FOOTER
           <div class="disclaimer"><span class="vir">[!]</span> Disclaimer: We're not liable to you for any damages, including general, special, incidental or consequential damages arising out of the use or inability to use the script (including but not limited to loss of data or report being rendered inaccurate or failure of the script). There's no warranty for the program. Use at your own risk. 
           </div>
           <div class="thanx">
              We're greatly appreciate for any references in the social networks, forums or blogs to our scanner AI-BOLIT <a href="https://revisium.com/aibo/">https://revisium.com/aibo/</a>.<br/> 
             <p>Write us if you have any questions regarding scannner usage or report <a href="mailto:ai@revisium.com">ai@revisium.com</a>.</p> 
            </div>
HTML_FOOTER;
define('AI_STR_076'$tmp_str);
define('AI_STR_077'"Suspicious file mtime and ctime");
define('AI_STR_078'"Suspicious file permissions");
define('AI_STR_079'"Suspicious file location");
define('AI_STR_081'"Vulnerable Scripts");
define('AI_STR_082'"Added files");
define('AI_STR_083'"Modified files");
define('AI_STR_084'"Deleted files");
define('AI_STR_085'"Added directories");
define('AI_STR_086'"Deleted directories");
define('AI_STR_087'"Integrity Check Report");

$l_Offer =<<<HTML_OFFER_EN
<div>
 <div class="crit" style="font-size: 17px;"><b>Attention! Malicious software has been detected on the website.</b></div> 
 <br/>Most likely the website has been compromised. Please, <a href="https://revisium.com/en/home/" target=_blank>contact information security specialist</a> or experienced webmaster to clean the malware.
</div>
<br/>
<div>
   <a href="mailto:ai@revisium.com">ai@revisium.com</a>, <a href="https://revisium.com/ru/order/">https://revisium.com</a>
</div>
<div class="caution">@@CAUTION@@</div>
HTML_OFFER_EN;

define('AI_STR_080'"Notice! Some of detected files may not contain malicious code. Scanner tries to minimize a number of false positives, but sometimes it's impossible, because same piece of code may be used either in malware or in normal scripts.");
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

$l_Template =<<<MAIN_PAGE
<html>
<head>
<!-- revisium.com/ai/ -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<META NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW">
<title>@@HEAD_TITLE@@</title>
<style type="text/css" title="currentStyle">
    @import "https://revisium.com/extra/media/css/demo_page2.css";
    @import "https://revisium.com/extra/media/css/jquery.dataTables2.css";
</style>

<script type="text/javascript" language="javascript" src="https://yandex.st/jquery/2.1.0/jquery.min.js"></script>
<script type="text/javascript" language="javascript" src="https://datatables.net/download/build/jquery.dataTables.js"></script>

<style type="text/css">
 body 
 {
   font-family: Tahoma;
   color: #5a5a5a;
   background: #FFFFFF;
   font-size: 14px;
   margin: 20px;
   padding: 0;
 }

.header
 {
   font-size: 34px;
   margin: 0 0 10px 0;
 }

 .hidd
 {
    display: none;
 }
 
 .ok
 {
    color: green;
 }
 
 .line_no
 {
   -webkit-border-radius: 6px;
   -moz-border-radius: 6px;
   border-radius: 6px;

   background: #DAF2C1;
   padding: 2px 5px 2px 5px;
   margin: 0 5px 0 5px;
 }
 
 .credits_header 
 {
  -webkit-border-radius: 6px;
   -moz-border-radius: 6px;
   border-radius: 6px;

   background: #F2F2F2;
   padding: 10px;
   font-size: 11px;
    margin: 0 0 10px 0;
 }
 
 .marker
 {
    color: #FF0090;
    font-weight: 100;
    background: #FF0090;
    padding: 2px 0px 2px 0px;
    width: 2px;
 }
 
 .title
 {
   font-size: 24px;
   margin: 20px 0 10px 0;
   color: #9CA9D1;
}

.summary 
{
  float: left;
  width: 500px;
}

.summary TD
{
  font-size: 12px;
  border-bottom: 1px solid #F0F0F0;
  font-weight: 700;
  padding: 10px 0 10px 0;
}
 
.crit, .vir
{
  color: #D84B55;
}

.intitem
{
  color:#4a6975;
}

.spacer
{
   margin: 0 0 50px 0;
   clear:both;
}

.warn
{
  color: #F6B700;
}

.clear
{
   clear: both;
}

.offer
{
  -webkit-border-radius: 6px;
   -moz-border-radius: 6px;
   border-radius: 6px;

   width: 500px;
   background: #ECF7DE;
   color: #747474;
   font-size: 11px;
   font-family: Arial;
   padding: 20px;
   margin: 20px 0 0 500px;
   
   font-size: 16px;
}
 
.flist
{
   font-family: Arial;
}

.flist TD
{
   font-size: 11px;
   padding: 5px;
}

.flist TH
{
   font-size: 12px;
   height: 30px;
   padding: 5px;
   background: #CEE9EF;
}


.it
{
   font-size: 14px;
   font-weight: 100;
   margin-top: 10px;
}

.crit .it A {
   color: #E50931; 
   line-height: 25px;
   text-decoration: none;
}

.warn .it A {
   color: #F2C900; 
   line-height: 25px;
   text-decoration: none;
}



.details
{
   font-family: Calibri;
   font-size: 12px;
   margin: 10px 10px 10px 0px;
}

.crit .details
{
   color: #A08080;
}

.warn .details
{
   color: #808080;
}

.details A
{
  color: #FFF;
  font-weight: 700;
  text-decoration: none;
  padding: 2px;
  background: #E5CEDE;
  -webkit-border-radius: 7px;
   -moz-border-radius: 7px;
   border-radius: 7px;
}

.details A:hover
{
   background: #A0909B;
}

.ctd
{
   margin: 10px 0px 10px 0;
   align:center;
}

.ctd A 
{
   color: #0D9922;
}

.disclaimer
{
   color: darkgreen;
   margin: 10px 10px 10px 0;
}

.note_vir
{
   margin: 10px 0 10px 0;
   //padding: 10px;
   color: #FF4F4F;
   font-size: 15px;
   font-weight: 700;
   clear:both;
  
}

.note_warn
{
   margin: 10px 0 10px 0;
   color: #F6B700;
   font-size: 15px;
   font-weight: 700;
   clear:both;
}

.note_int
{
   margin: 10px 0 10px 0;
   color: #60b5d6;
   font-size: 15px;
   font-weight: 700;
   clear:both;
}

.updateinfo
{
  color: #FFF;
  text-decoration: none;
  background: #E5CEDE;
  -webkit-border-radius: 7px;
   -moz-border-radius: 7px;
   border-radius: 7px;

  margin: 10px 0 10px 0px;   
  padding: 10px;
}


.caution
{
  color: #EF7B75;
  text-decoration: none;
  margin: 20px 0 0px 0px;   
  font-size: 12px;
}

.footer
{
  color: #303030;
  text-decoration: none;
  background: #F4F4F4;
  -webkit-border-radius: 7px;
   -moz-border-radius: 7px;
   border-radius: 7px;

  margin: 80px 0 10px 0px;   
  padding: 10px;
}

.rep
{
  color: #303030;
  text-decoration: none;
  background: #94DDDB;
  -webkit-border-radius: 7px;
   -moz-border-radius: 7px;
   border-radius: 7px;

  margin: 10px 0 10px 0px;   
  padding: 10px;
  font-size: 12px;
}

</style>

</head>
<body>

<div class="header">@@MAIN_TITLE@@ @@PATH_URL@@ (@@MODE@@)</div>
<div class="credits_header">@@CREDITS@@</div>
<div class="details_header">
   @@STAT@@<br/>
   @@SCANNED@@ @@MEMORY@@.
 </div>

 @@WARN_QUICK@@
 
 <div class="summary">
@@SUMMARY@@
 </div>
 
 <div class="offer">
@@OFFER@@
 </div>
  
 <div class="clear"></div>
 
 @@MAIN_CONTENT@@
 
    <div class="footer">
    @@FOOTER@@
    </div>
    
<script language="javascript">

function hsig(id) {
  var divs = document.getElementsByTagName("tr");
  for(var i = 0; i < divs.length; i++){
     
     if (divs[i].getAttribute('o') == id) {
        divs[i].innerHTML = '';
     }
  }

  return false;
}


$(document).ready(function(){
    $('#table_crit').dataTable({
       "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
       "aoColumns": [
                                     {"iDataSort": 7, "width":"70%"},
                                     {"iDataSort": 5},
                                     {"iDataSort": 6},
                                     {"bSortable": true},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false}
                     ],
        "paging": true,
       "iDisplayLength": 500,
        "oLanguage": {
            "sLengthMenu": "Отображать по _MENU_ записей",
            "sZeroRecords": "Ничего не найдено",
            "sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
            "sInfoEmpty": "Нет файлов",
            "sInfoFiltered": "(всего записей _MAX_)",
            "sSearch":       "Поиск:",
            "sUrl":          "",
            "oPaginate": {
                "sFirst": "Первая",
                "sPrevious": "Предыдущая",
                "sNext": "Следующая",
                "sLast": "Последняя"
            },
            "oAria": {
                "sSortAscending":  ": активировать для сортировки столбца по возрастанию",
                "sSortDescending": ": активировать для сортировки столбцов по убыванию"            
            }
        }

     } );

});

$(document).ready(function(){
    $('#table_vir').dataTable({
       "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
        "paging": true,
       "aoColumns": [
                                     {"iDataSort": 7, "width":"70%"},
                                     {"iDataSort": 5},
                                     {"iDataSort": 6},
                                     {"bSortable": true},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false}
                     ],
       "iDisplayLength": 500,
        "oLanguage": {
            "sLengthMenu": "Отображать по _MENU_ записей",
            "sZeroRecords": "Ничего не найдено",
            "sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
            "sInfoEmpty": "Нет файлов",
            "sInfoFiltered": "(всего записей _MAX_)",
            "sSearch":       "Поиск:",
            "sUrl":          "",
            "oPaginate": {
                "sFirst": "Первая",
                "sPrevious": "Предыдущая",
                "sNext": "Следующая",
                "sLast": "Последняя"
            },
            "oAria": {
                "sSortAscending":  ": активировать для сортировки столбца по возрастанию",
                "sSortDescending": ": активировать для сортировки столбцов по убыванию"            
            }
        },

     } );

});

if ($('#table_warn0')) {
    $('#table_warn0').dataTable({
       "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
        "paging": true,
       "aoColumns": [
                                     {"iDataSort": 7, "width":"70%"},
                                     {"iDataSort": 5},
                                     {"iDataSort": 6},
                                     {"bSortable": true},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false}
                     ],
       "iDisplayLength": 500,
        "paging": true,
        "oLanguage": {
            "sLengthMenu": "Отображать по _MENU_ записей",
            "sZeroRecords": "Ничего не найдено",
            "sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
            "sInfoEmpty": "Нет файлов",
            "sInfoFiltered": "(всего записей _MAX_)",
            "sSearch":       "Поиск:",
            "sUrl":          "",
            "oPaginate": {
                "sFirst": "Первая",
                "sPrevious": "Предыдущая",
                "sNext": "Следующая",
                "sLast": "Последняя"
            },
            "oAria": {
                "sSortAscending":  ": активировать для сортировки столбца по возрастанию",
                "sSortDescending": ": активировать для сортировки столбцов по убыванию"            
            }
        }

     } );
}

if ($('#table_warn1')) {
    $('#table_warn1').dataTable({
       "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
        "paging": true,
       "aoColumns": [
                                     {"iDataSort": 7, "width":"70%"},
                                     {"iDataSort": 5},
                                     {"iDataSort": 6},
                                     {"bSortable": true},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false}
                     ],
       "iDisplayLength": 500,
        "oLanguage": {
            "sLengthMenu": "Отображать по _MENU_ записей",
            "sZeroRecords": "Ничего не найдено",
            "sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
            "sInfoEmpty": "Нет файлов",
            "sInfoFiltered": "(всего записей _MAX_)",
            "sSearch":       "Поиск:",
            "sUrl":          "",
            "oPaginate": {
                "sFirst": "Первая",
                "sPrevious": "Предыдущая",
                "sNext": "Следующая",
                "sLast": "Последняя"
            },
            "oAria": {
                "sSortAscending":  ": активировать для сортировки столбца по возрастанию",
                "sSortDescending": ": активировать для сортировки столбцов по убыванию"            
            }
        }

     } );
}


</script>
 </body>
</html>
MAIN_PAGE;

$g_AiBolitAbsolutePath dirname(__FILE__);

if (
file_exists($g_AiBolitAbsolutePath '/ai-design.html')) {
  
$l_Template file_get_contents($g_AiBolitAbsolutePath '/ai-design.html');
}

$l_Template str_replace('@@MAIN_TITLE@@'AI_STR_001$l_Template);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

$g_SusDB unserialize(base64_decode("YToxMzE6e2k6MDtzOjE0OiJAKmV4dHJhY3RccypcKCI7aToxO3M6MTQ6IkAqZXh0cmFjdFxzKlwkIjtpOjI7czoxMjoiWyciXWV2YWxbJyJdIjtpOjM7czoyMToiWyciXWJhc2U2NF9kZWNvZGVbJyJdIjtpOjQ7czoyMzoiWyciXWNyZWF0ZV9mdW5jdGlvblsnIl0iO2k6NTtzOjE0OiJbJyJdYXNzZXJ0WyciXSI7aTo2O3M6NDM6ImZvcmVhY2hccypcKFxzKlwkZW1haWxzXHMrYXNccytcJGVtYWlsXHMqXCkiO2k6NztzOjc6IlNwYW1tZXIiO2k6ODtzOjE1OiJldmFsXHMqWyciXChcJF0iO2k6OTtzOjE3OiJhc3NlcnRccypbJyJcKFwkXSI7aToxMDtzOjI4OiJzcnBhdGg6Ly9cLlwuL1wuXC4vXC5cLi9cLlwuIjtpOjExO3M6MTI6InBocGluZm9ccypcKCI7aToxMjtzOjE2OiJTSE9XXHMrREFUQUJBU0VTIjtpOjEzO3M6MTI6IlxicG9wZW5ccypcKCI7aToxNDtzOjk6ImV4ZWNccypcKCI7aToxNTtzOjEzOiJcYnN5c3RlbVxzKlwoIjtpOjE2O3M6MTU6IlxicGFzc3RocnVccypcKCI7aToxNztzOjE2OiJcYnByb2Nfb3BlblxzKlwoIjtpOjE4O3M6MTU6InNoZWxsX2V4ZWNccypcKCI7aToxOTtzOjE2OiJpbmlfcmVzdG9yZVxzKlwoIjtpOjIwO3M6OToiXGJkbFxzKlwoIjtpOjIxO3M6MTQ6Ilxic3ltbGlua1xzKlwoIjtpOjIyO3M6MTI6IlxiY2hncnBccypcKCI7aToyMztzOjE0OiJcYmluaV9zZXRccypcKCI7aToyNDtzOjEzOiJcYnB1dGVudlxzKlwoIjtpOjI1O3M6MTM6ImdldG15dWlkXHMqXCgiO2k6MjY7czoxNDoiZnNvY2tvcGVuXHMqXCgiO2k6Mjc7czoxNzoicG9zaXhfc2V0dWlkXHMqXCgiO2k6Mjg7czoxNzoicG9zaXhfc2V0c2lkXHMqXCgiO2k6Mjk7czoxODoicG9zaXhfc2V0cGdpZFxzKlwoIjtpOjMwO3M6MTU6InBvc2l4X2tpbGxccypcKCI7aTozMTtzOjI3OiJhcGFjaGVfY2hpbGRfdGVybWluYXRlXHMqXCgiO2k6MzI7czoxMjoiXGJjaG1vZFxzKlwoIjtpOjMzO3M6MTI6IlxiY2hkaXJccypcKCI7aTozNDtzOjE1OiJwY250bF9leGVjXHMqXCgiO2k6MzU7czoxNDoiXGJ2aXJ0dWFsXHMqXCgiO2k6MzY7czoxNToicHJvY19jbG9zZVxzKlwoIjtpOjM3O3M6MjA6InByb2NfZ2V0X3N0YXR1c1xzKlwoIjtpOjM4O3M6MTk6InByb2NfdGVybWluYXRlXHMqXCgiO2k6Mzk7czoxNDoicHJvY19uaWNlXHMqXCgiO2k6NDA7czoxMzoiZ2V0bXlnaWRccypcKCI7aTo0MTtzOjE5OiJwcm9jX2dldHN0YXR1c1xzKlwoIjtpOjQyO3M6MTU6InByb2NfY2xvc2VccypcKCI7aTo0MztzOjE5OiJlc2NhcGVzaGVsbGNtZFxzKlwoIjtpOjQ0O3M6MTk6ImVzY2FwZXNoZWxsYXJnXHMqXCgiO2k6NDU7czoxNjoic2hvd19zb3VyY2VccypcKCI7aTo0NjtzOjEzOiJcYnBjbG9zZVxzKlwoIjtpOjQ3O3M6MTM6InNhZmVfZGlyXHMqXCgiO2k6NDg7czoxNjoiaW5pX3Jlc3RvcmVccypcKCI7aTo0OTtzOjEwOiJjaG93blxzKlwoIjtpOjUwO3M6MTA6ImNoZ3JwXHMqXCgiO2k6NTE7czoxNzoic2hvd25fc291cmNlXHMqXCgiO2k6NTI7czoxOToibXlzcWxfbGlzdF9kYnNccypcKCI7aTo1MztzOjIxOiJnZXRfY3VycmVudF91c2VyXHMqXCgiO2k6NTQ7czoxMjoiZ2V0bXlpZFxzKlwoIjtpOjU1O3M6MTE6IlxibGVha1xzKlwoIjtpOjU2O3M6MTU6InBmc29ja29wZW5ccypcKCI7aTo1NztzOjIxOiJnZXRfY3VycmVudF91c2VyXHMqXCgiO2k6NTg7czoxMToic3lzbG9nXHMqXCgiO2k6NTk7czoxODoiXCRkZWZhdWx0X3VzZV9hamF4IjtpOjYwO3M6MjE6ImV2YWxccypcKCpccyp1bmVzY2FwZSI7aTo2MTtzOjc6IkZMb29kZVIiO2k6NjI7czozMToiZG9jdW1lbnRcLndyaXRlXHMqXChccyp1bmVzY2FwZSI7aTo2MztzOjExOiJcYmNvcHlccypcKCI7aTo2NDtzOjIzOiJtb3ZlX3VwbG9hZGVkX2ZpbGVccypcKCI7aTo2NTtzOjg6IlwuMzMzMzMzIjtpOjY2O3M6ODoiXC42NjY2NjYiO2k6Njc7czoyMToicm91bmRccypcKCpccyowXHMqXCkqIjtpOjY4O3M6MjQ6Im1vdmVfdXBsb2FkZWRfZmlsZXNccypcKCI7aTo2OTtzOjUwOiJpbmlfZ2V0XHMqXChccypbJyJdezAsMX1kaXNhYmxlX2Z1bmN0aW9uc1snIl17MCwxfSI7aTo3MDtzOjM2OiJVTklPTlxzK1NFTEVDVFxzK1snIl17MCwxfTBbJyJdezAsMX0iO2k6NzE7czoxMDoiMlxzKj5ccyomMSI7aTo3MjtzOjU3OiJlY2hvXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF0iO2k6NzM7czozNzoiPVxzKkFycmF5XHMqXCgqXHMqYmFzZTY0X2RlY29kZVxzKlwoKiI7aTo3NDtzOjE0OiJraWxsYWxsXHMrLVxkKyI7aTo3NTtzOjc6ImVyaXVxZXIiO2k6NzY7czoxMDoidG91Y2hccypcKCI7aTo3NztzOjc6InNzaGtleXMiO2k6Nzg7czo4OiJAaW5jbHVkZSI7aTo3OTtzOjg6IkByZXF1aXJlIjtpOjgwO3M6NjI6ImlmXHMqXChtYWlsXHMqXChccypcJHRvLFxzKlwkc3ViamVjdCxccypcJG1lc3NhZ2UsXHMqXCRoZWFkZXJzIjtpOjgxO3M6Mzg6IkBpbmlfc2V0XHMqXCgqWyciXXswLDF9YWxsb3dfdXJsX2ZvcGVuIjtpOjgyO3M6MTg6IkBmaWxlX2dldF9jb250ZW50cyI7aTo4MztzOjE3OiJmaWxlX3B1dF9jb250ZW50cyI7aTo4NDtzOjQ2OiJhbmRyb2lkXHMqXHxccyptaWRwXHMqXHxccypqMm1lXHMqXHxccypzeW1iaWFuIjtpOjg1O3M6Mjg6IkBzZXRjb29raWVccypcKCpbJyJdezAsMX1oaXQiO2k6ODY7czoxMDoiQGZpbGVvd25lciI7aTo4NztzOjY6IjxrdWt1PiI7aTo4ODtzOjU6InN5cGV4IjtpOjg5O3M6OToiXCRiZWVjb2RlIjtpOjkwO3M6MTQ6InJvb3RAbG9jYWxob3N0IjtpOjkxO3M6ODoiQmFja2Rvb3IiO2k6OTI7czoxNDoicGhwX3VuYW1lXHMqXCgiO2k6OTM7czo1NToibWFpbFxzKlwoKlxzKlwkdG9ccyosXHMqXCRzdWJqXHMqLFxzKlwkbXNnXHMqLFxzKlwkZnJvbSI7aTo5NDtzOjI5OiJlY2hvXHMqWyciXTxzY3JpcHQ+XHMqYWxlcnRcKCI7aTo5NTtzOjY3OiJtYWlsXHMqXCgqXHMqXCRzZW5kXHMqLFxzKlwkc3ViamVjdFxzKixccypcJGhlYWRlcnNccyosXHMqXCRtZXNzYWdlIjtpOjk2O3M6NjU6Im1haWxccypcKCpccypcJHRvXHMqLFxzKlwkc3ViamVjdFxzKixccypcJG1lc3NhZ2VccyosXHMqXCRoZWFkZXJzIjtpOjk3O3M6MTIwOiJzdHJwb3NccypcKCpccypcJG5hbWVccyosXHMqWyciXXswLDF9SFRUUF9bJyJdezAsMX1ccypcKSpccyohPT1ccyowXHMqJiZccypzdHJwb3NccypcKCpccypcJG5hbWVccyosXHMqWyciXXswLDF9UkVRVUVTVF8iO2k6OTg7czo1MzoiaXNfZnVuY3Rpb25fZW5hYmxlZFxzKlwoXHMqWyciXXswLDF9aWdub3JlX3VzZXJfYWJvcnQiO2k6OTk7czozMDoiZWNob1xzKlwoKlxzKmZpbGVfZ2V0X2NvbnRlbnRzIjtpOjEwMDtzOjI2OiJlY2hvXHMqXCgqWyciXXswLDF9PHNjcmlwdCI7aToxMDE7czozMToicHJpbnRccypcKCpccypmaWxlX2dldF9jb250ZW50cyI7aToxMDI7czoyNzoicHJpbnRccypcKCpbJyJdezAsMX08c2NyaXB0IjtpOjEwMztzOjg1OiI8bWFycXVlZVxzK3N0eWxlXHMqPVxzKlsnIl17MCwxfXBvc2l0aW9uXHMqOlxzKmFic29sdXRlXHMqO1xzKndpZHRoXHMqOlxzKlxkK1xzKnB4XHMqIjtpOjEwNDtzOjQyOiI9XHMqWyciXXswLDF9XC5cLi9cLlwuL1wuXC4vd3AtY29uZmlnXC5waHAiO2k6MTA1O3M6NzoiZWdnZHJvcCI7aToxMDY7czo5OiJyd3hyd3hyd3giO2k6MTA3O3M6MTU6ImVycm9yX3JlcG9ydGluZyI7aToxMDg7czoxNzoiXGJjcmVhdGVfZnVuY3Rpb24iO2k6MTA5O3M6NDM6Intccypwb3NpdGlvblxzKjpccyphYnNvbHV0ZTtccypsZWZ0XHMqOlxzKi0iO2k6MTEwO3M6MTU6IjxzY3JpcHRccythc3luYyI7aToxMTE7czo2NjoiX1snIl17MCwxfVxzKlxdXHMqPVxzKkFycmF5XHMqXChccypiYXNlNjRfZGVjb2RlXHMqXCgqXHMqWyciXXswLDF9IjtpOjExMjtzOjMzOiJBZGRUeXBlXHMrYXBwbGljYXRpb24veC1odHRwZC1jZ2kiO2k6MTEzO3M6NDQ6ImdldGVudlxzKlwoKlxzKlsnIl17MCwxfUhUVFBfQ09PS0lFWyciXXswLDF9IjtpOjExNDtzOjQ1OiJpZ25vcmVfdXNlcl9hYm9ydFxzKlwoKlxzKlsnIl17MCwxfTFbJyJdezAsMX0iO2k6MTE1O3M6MjE6IlwkX1JFUVVFU1RccypcW1xzKiUyMiI7aToxMTY7czo1MToidXJsXHMqXChbJyJdezAsMX1kYXRhXHMqOlxzKmltYWdlL3BuZztccypiYXNlNjRccyosIjtpOjExNztzOjUxOiJ1cmxccypcKFsnIl17MCwxfWRhdGFccyo6XHMqaW1hZ2UvZ2lmO1xzKmJhc2U2NFxzKiwiO2k6MTE4O3M6MzA6Ijpccyp1cmxccypcKFxzKlsnIl17MCwxfTxcP3BocCI7aToxMTk7czoxNzoiPC9odG1sPi4rPzxzY3JpcHQiO2k6MTIwO3M6MTc6IjwvaHRtbD4uKz88aWZyYW1lIjtpOjEyMTtzOjY0OiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVxzKlsnIlwoXCRdIjtpOjEyMjtzOjExOiJcYm1haWxccypcKCI7aToxMjM7czo0NjoiZmlsZV9nZXRfY29udGVudHNccypcKCpccypbJyJdezAsMX1waHA6Ly9pbnB1dCI7aToxMjQ7czoxMTg6IjxtZXRhXHMraHR0cC1lcXVpdj1bJyJdezAsMX1Db250ZW50LXR5cGVbJyJdezAsMX1ccytjb250ZW50PVsnIl17MCwxfXRleHQvaHRtbDtccypjaGFyc2V0PXdpbmRvd3MtMTI1MVsnIl17MCwxfT48Ym9keT4iO2k6MTI1O3M6NjI6Ij1ccypkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoXHMqWyciXXswLDF9c2NyaXB0WyciXXswLDF9XHMqXCk7IjtpOjEyNjtzOjY5OiJkb2N1bWVudFwuYm9keVwuaW5zZXJ0QmVmb3JlXChkaXYsXHMqZG9jdW1lbnRcLmJvZHlcLmNoaWxkcmVuXFswXF1cKTsiO2k6MTI3O3M6Nzc6IjxzY3JpcHRccyt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXHMrc3JjPSJodHRwOi8vW2EtekEtWjAtOV9dKz9cLnBocCI+PC9zY3JpcHQ+IjtpOjEyODtzOjI3OiJlY2hvXHMrWyciXXswLDF9b2tbJyJdezAsMX0iO2k6MTI5O3M6MTg6Ii91c3Ivc2Jpbi9zZW5kbWFpbCI7aToxMzA7czoyMzoiL3Zhci9xbWFpbC9iaW4vc2VuZG1haWwiO30="));
$g_SusDBPrio unserialize(base64_decode("YToxMjE6e2k6MDtpOjA7aToxO2k6MDtpOjI7aTowO2k6MztpOjA7aTo0O2k6MDtpOjU7aTowO2k6NjtpOjA7aTo3O2k6MDtpOjg7aToxO2k6OTtpOjE7aToxMDtpOjA7aToxMTtpOjA7aToxMjtpOjA7aToxMztpOjA7aToxNDtpOjA7aToxNTtpOjA7aToxNjtpOjA7aToxNztpOjA7aToxODtpOjA7aToxOTtpOjA7aToyMDtpOjA7aToyMTtpOjA7aToyMjtpOjA7aToyMztpOjA7aToyNDtpOjA7aToyNTtpOjA7aToyNjtpOjA7aToyNztpOjA7aToyODtpOjA7aToyOTtpOjE7aTozMDtpOjE7aTozMTtpOjA7aTozMjtpOjA7aTozMztpOjA7aTozNDtpOjA7aTozNTtpOjA7aTozNjtpOjA7aTozNztpOjA7aTozODtpOjA7aTozOTtpOjA7aTo0MDtpOjA7aTo0MTtpOjA7aTo0MjtpOjA7aTo0MztpOjA7aTo0NDtpOjA7aTo0NTtpOjA7aTo0NjtpOjA7aTo0NztpOjA7aTo0ODtpOjA7aTo0OTtpOjA7aTo1MDtpOjA7aTo1MTtpOjA7aTo1MjtpOjA7aTo1MztpOjA7aTo1NDtpOjA7aTo1NTtpOjA7aTo1NjtpOjE7aTo1NztpOjA7aTo1ODtpOjA7aTo1OTtpOjI7aTo2MDtpOjE7aTo2MTtpOjA7aTo2MjtpOjA7aTo2MztpOjA7aTo2NDtpOjI7aTo2NTtpOjA7aTo2NjtpOjA7aTo2NztpOjA7aTo2ODtpOjI7aTo2OTtpOjE7aTo3MDtpOjA7aTo3MTtpOjA7aTo3MjtpOjE7aTo3MztpOjA7aTo3NDtpOjE7aTo3NTtpOjE7aTo3NjtpOjI7aTo3NztpOjE7aTo3ODtpOjM7aTo3OTtpOjI7aTo4MDtpOjA7aTo4MTtpOjI7aTo4MjtpOjA7aTo4MztpOjA7aTo4NDtpOjI7aTo4NTtpOjA7aTo4NjtpOjA7aTo4NztpOjA7aTo4ODtpOjA7aTo4OTtpOjE7aTo5MDtpOjE7aTo5MTtpOjE7aTo5MjtpOjE7aTo5MztpOjA7aTo5NDtpOjI7aTo5NTtpOjI7aTo5NjtpOjI7aTo5NztpOjI7aTo5ODtpOjI7aTo5OTtpOjE7aToxMDA7aToxO2k6MTAxO2k6MztpOjEwMjtpOjM7aToxMDM7aToxO2k6MTA0O2k6MztpOjEwNTtpOjM7aToxMDY7aToyO2k6MTA3O2k6MDtpOjEwODtpOjM7aToxMDk7aToxO2k6MTEwO2k6MTtpOjExMTtpOjM7aToxMTI7aTozO2k6MTEzO2k6MztpOjExNDtpOjE7aToxMTU7aToxO2k6MTE2O2k6MTtpOjExNztpOjQ7aToxMTg7aToxO2k6MTE5O2k6MztpOjEyMDtpOjA7fQ=="));
$g_DBShe unserialize(base64_decode("YTo0MDY6e2k6MDtzOjg6IlIzRFRVWEVTIjtpOjE7czoyMDoidmlzaXRvclRyYWNrZXJfaXNNb2IiO2k6MjtzOjI1OiJjb21fY29udGVudC9hcnRpY2xlZFwucGhwIjtpOjM7czoxNzoiPHRpdGxlPkVtc1Byb3h5IHYiO2k6NDtzOjEzOiJhbmRyb2lkLWlncmEtIjtpOjU7czoxNToiPT09Ojo6bWFkOjo6PT09IjtpOjY7czo1OiJINHhPciI7aTo3O3M6ODoiUjRwSDR4MHIiO2k6ODtzOjg6Ik5HNjg5U2t3IjtpOjk7czoxNDoiMjE2XC4yMzlcLjMyXC4iO2k6MTA7czoxMzoiZm9wb1wuY29tXC5hciI7aToxMTtzOjEyOiI2NFwuNjhcLjgwXC4iO2k6MTI7czo4OiJIYXJjaGFMaSI7aToxMztzOjE0OiI2NFwuMjMzXC4xNjBcLiI7aToxNDtzOjEzOiIxXC4xNzlcLjI0OVwuIjtpOjE1O3M6MTY6IlBcLmhcLnBcLlNcLnBcLnkiO2k6MTY7czoxNDoiX3NoZWxsX2F0aWxkaV8iO2k6MTc7czo5OiJ+IFNoZWxsIEkiO2k6MTg7czo2OiIweGRkODIiO2k6MTk7czoxNDoiQW50aWNoYXQgc2hlbGwiO2k6MjA7czoxMjoiQUxFTWlOIEtSQUxpIjtpOjIxO3M6MTY6IkFTUFggU2hlbGwgYnkgTFQiO2k6MjI7czo5OiJhWlJhaUxQaFAiO2k6MjM7czoyMjoiQ29kZWQgQnkgQ2hhcmxpY2hhcGxpbiI7aToyNDtzOjc6IkJsMG9kM3IiO2k6MjU7czoxMjoiQlkgaVNLT1JQaVRYIjtpOjI2O3M6MTE6ImRldmlselNoZWxsIjtpOjI3O3M6MzA6IldyaXR0ZW4gYnkgQ2FwdGFpbiBDcnVuY2ggVGVhbSI7aToyODtzOjEwOiJjMjAwN1wucGhwIjtpOjI5O3M6MjI6IkM5OSBNb2RpZmllZCBCeSBQc3ljaDAiO2k6MzA7czoxODoiXCRjOTlzaF91cGRhdGVmdXJsIjtpOjMxO3M6OToiQzk5IFNoZWxsIjtpOjMyO3M6MjA6ImNvb2tpZW5hbWU9IndpZWVlZWUiIjtpOjMzO3M6Mzg6IkNvZGVkIGJ5IDogU3VwZXItQ3J5c3RhbCBhbmQgTW9oYWplcjIyIjtpOjM0O3M6MTI6IkNyeXN0YWxTaGVsbCI7aTozNTtzOjIzOiJURUFNIFNDUklQVElORyAtIFJPRE5PQyI7aTozNjtzOjExOiJDeWJlciBTaGVsbCI7aTozNztzOjc6ImQwbWFpbnMiO2k6Mzg7czoxNDoiRGFya0RldmlselwuaU4iO2k6Mzk7czoyNDoiU2hlbGwgd3JpdHRlbiBieSBCbDBvZDNyIjtpOjQwO3M6MzM6IkRpdmUgU2hlbGwgLSBFbXBlcm9yIEhhY2tpbmcgVGVhbSI7aTo0MTtzOjE1OiJEZXZyLWkgTWVmc2VkZXQiO2k6NDI7czozMjoiQ29tYW5kb3MgRXhjbHVzaXZvcyBkbyBEVG9vbCBQcm8iO2k6NDM7czoyMDoiRW1wZXJvciBIYWNraW5nIFRFQU0iO2k6NDQ7czoyMDoiRml4ZWQgYnkgQXJ0IE9mIEhhY2siO2k6NDU7czoyMToiRmFUYUxpc1RpQ3pfRnggRngyOVNoIjtpOjQ2O3M6Mjc6Ikx1dGZlbiBEb3N5YXlpIEFkbGFuZGlyaW5peiI7aTo0NztzOjIyOiJ0aGlzIGlzIGEgcHJpdjMgc2VydmVyIjtpOjQ4O3M6MTM6IkdGUyBXZWItU2hlbGwiO2k6NDk7czoxMToiR0hDIE1hbmFnZXIiO2k6NTA7czoxNDoiR29vZzFlX2FuYWxpc3QiO2k6NTE7czoxNDoiR3JpbmF5IEdvMG9cJEUiO2k6NTI7czozMToiaDRudHUgc2hlbGwgXFtwb3dlcmVkIGJ5IHRzb2lcXSI7aTo1MztzOjI1OiJIYWNrZWQgQnkgRGV2ci1pIE1lZnNlZGV0IjtpOjU0O3M6MTc6IkhBQ0tFRCBCWSBSRUFMV0FSIjtpOjU1O3M6MzI6IkhhY2tlcmxlciBWdXJ1ciBMYW1lcmxlciBTdXJ1bnVyIjtpOjU2O3M6MTE6ImlNSGFCaVJMaUdpIjtpOjU3O3M6OToiS0FfdVNoZWxsIjtpOjU4O3M6NzoiTGl6MHppTSI7aTo1OTtzOjExOiJMb2N1czdTaGVsbCI7aTo2MDtzOjM2OiJNb3JvY2NhbiBTcGFtZXJzIE1hLUVkaXRpb04gQnkgR2hPc1QiO2k6NjE7czoxMDoiTWF0YW11IE1hdCI7aTo2MjtzOjQ5OiJPcGVuIHRoZSBmaWxlIGF0dGFjaG1lbnQgaWYgYW55LGFuZCBiYXNlNjRfZW5jb2RlIjtpOjYzO3M6NjoibTBydGl4IjtpOjY0O3M6NToibTBoemUiO2k6NjU7czoxMDoiTWF0YW11IE1hdCI7aTo2NjtzOjE2OiJNb3JvY2NhbiBTcGFtZXJzIjtpOjY3O3M6MTY6IlwkTXlTaGVsbFZlcnNpb24iO2k6Njg7czo5OiJNeVNRTCBSU1QiO2k6Njk7czoxOToiTXlTUUwgV2ViIEludGVyZmFjZSI7aTo3MDtzOjI3OiJNeVNRTCBXZWIgSW50ZXJmYWNlIFZlcnNpb24iO2k6NzE7czoxNDoiTXlTUUwgV2Vic2hlbGwiO2k6NzI7czo4OiJOM3RzaGVsbCI7aTo3MztzOjE2OiJIYWNrZWQgYnkgU2lsdmVyIjtpOjc0O3M6NzoiTmVvSGFjayI7aTo3NTtzOjIxOiJOZXR3b3JrRmlsZU1hbmFnZXJQSFAiO2k6NzY7czoyMDoiTklYIFJFTU9URSBXRUItU0hFTEwiO2k6Nzc7czoyNjoiTyBCaVIgS1JBTCBUQUtMaVQgRURpbEVNRVoiO2k6Nzg7czoxODoiUEhBTlRBU01BLSBOZVcgQ21EIjtpOjc5O3M6MjE6IlBJUkFURVMgQ1JFVyBXQVMgSEVSRSI7aTo4MDtzOjIxOiJhIHNpbXBsZSBwaHAgYmFja2Rvb3IiO2k6ODE7czoyMDoiTE9URlJFRSBQSFAgQmFja2Rvb3IiO2k6ODI7czozMToiTmV3cyBSZW1vdGUgUEhQIFNoZWxsIEluamVjdGlvbiI7aTo4MztzOjk6IlBIUEphY2thbCI7aTo4NDtzOjIwOiJQSFAgSFZBIFNoZWxsIFNjcmlwdCI7aTo4NTtzOjEzOiJwaHBSZW1vdGVWaWV3IjtpOjg2O3M6MzU6IlBIUCBTaGVsbCBpcyBhbmludGVyYWN0aXZlIFBIUC1wYWdlIjtpOjg3O3M6NjoiUEhWYXl2IjtpOjg4O3M6Mjc6IlBQUyAxXC4wIHBlcmwtY2dpIHdlYiBzaGVsbCI7aTo4OTtzOjIyOiJQcmVzcyBPSyB0byBlbnRlciBzaXRlIjtpOjkwO3M6MjI6InByaXZhdGUgU2hlbGwgYnkgbTRyY28iO2k6OTE7czo1OiJyMG5pbiI7aTo5MjtzOjY6IlI1N1NxbCI7aTo5MztzOjE1OiJyNTdzaGVsbFxcXC5waHAiO2k6OTQ7czoxNToicmdvZGBzIHdlYnNoZWxsIjtpOjk1O3M6MjA6InJlYWxhdXRoPVN2QkQ4NWRJTnUzIjtpOjk2O3M6MTY6IlJ1MjRQb3N0V2ViU2hlbGwiO2k6OTc7czoyMToiS0Fkb3QgVW5pdmVyc2FsIFNoZWxsIjtpOjk4O3M6OToiQ3J6eV9LaW5nIjtpOjk5O3M6MjA6IlNhZmVfTW9kZSBCeXBhc3MgUEhQIjtpOjEwMDtzOjE3OiJTYXJhc2FPbiBTZXJ2aWNlcyI7aToxMDE7czoyNToiU2ltcGxlIFBIUCBiYWNrZG9vciBieSBESyI7aToxMDI7czoxOToiRy1TZWN1cml0eSBXZWJzaGVsbCI7aToxMDM7czoyNToiU2ltb3JnaCBTZWN1cml0eSBNYWdhemluZSI7aToxMDQ7czoyMDoiU2hlbGwgYnkgTWF3YXJfSGl0YW0iO2k6MTA1O3M6MTM6IlNTSSB3ZWItc2hlbGwiO2k6MTA2O3M6MTE6IlN0b3JtN1NoZWxsIjtpOjEwNztzOjk6IlRoZV9CZUtpUiI7aToxMDg7czo5OiJXM0QgU2hlbGwiO2k6MTA5O3M6MTM6Inc0Y2sxbmcgc2hlbGwiO2k6MTEwO3M6MTE6IldlYkNvbnRyb2xzIjtpOjExMTtzOjI4OiJkZXZlbG9wZWQgYnkgRGlnaXRhbCBPdXRjYXN0IjtpOjExMjtzOjMyOiJXYXRjaCBZb3VyIHN5c3RlbSBTaGFueSB3YXMgaGVyZSI7aToxMTM7czoxMjoiV2ViIFNoZWxsIGJ5IjtpOjExNDtzOjEzOiJXU08yIFdlYnNoZWxsIjtpOjExNTtzOjMzOiJOZXR3b3JrRmlsZU1hbmFnZXJQSFAgZm9yIGNoYW5uZWwiO2k6MTE2O3M6Mjc6IlNtYWxsIFBIUCBXZWIgU2hlbGwgYnkgWmFDbyI7aToxMTc7czoxMToiTXJsb29sXC5leGUiO2k6MTE4O3M6NjoiU0VvRE9SIjtpOjExOTtzOjEwOiJNclwuSGlUbWFuIjtpOjEyMDtzOjU6InJhaHVpIjtpOjEyMTtzOjU6ImQzYn5YIjtpOjEyMjtzOjE2OiJDb25uZWN0QmFja1NoZWxsIjtpOjEyMztzOjEwOiJCWSBNTU5CT0JaIjtpOjEyNDtzOjI2OiJPTEI6UFJPRFVDVDpPTkxJTkVfQkFOS0lORyI7aToxMjU7czoxMToiQzBkZXJ6XC5jb20iO2k6MTI2O3M6NzoiTXJIYXplbSI7aToxMjc7czo5OiJ2MGxkM20wcnQiO2k6MTI4O3M6NjoiSyFMTDNyIjtpOjEyOTtzOjExOiJEclwuYWJvbGFsaCI7aToxMzA7czozMToiXCRyYW5kX3dyaXRhYmxlX2ZvbGRlcl9mdWxscGF0aCI7aToxMzE7czo5NDoiPHRleHRhcmVhIG5hbWU9XFwicGhwZXZcXCIgcm93cz1cXCI1XFwiIGNvbHM9XFwiMTUwXFwiPiJcLlwkX1BPU1RcWydwaHBldidcXVwuIjwvdGV4dGFyZWE+PGJyPiI7aToxMzI7czoxNjoiYzk5ZnRwYnJ1dGVjaGVjayI7aToxMzM7czo5OiJCeSBQc3ljaDAiO2k6MTM0O3M6MTg6IlwkYzk5c2hfdXBkYXRlZnVybCI7aToxMzU7czoxNDoidGVtcF9yNTdfdGFibGUiO2k6MTM2O3M6MTc6ImFkbWluc3B5Z3J1cFwub3JnIjtpOjEzNztzOjc6ImNhc3VzMTUiO2k6MTM4O3M6MTQ6IldTQ1JJUFRcLlNIRUxMIjtpOjEzOTtzOjUxOiJFeGVjdXRlZCBjb21tYW5kOiA8Yj48Zm9udCBjb2xvcj1cI2RjZGNkYz5cW1wkY21kXF0iO2k6MTQwO3M6MTI6ImN0c2hlbGxcLnBocCI7aToxNDE7czoxNToiRFhfSGVhZGVyX2RyYXduIjtpOjE0MjtzOjEwMjoiY3JsZlwuJ3VubGlua1woXCRuYW1lXCk7J1wuXCRjcmxmXC4ncmVuYW1lXCgifiJcLlwkbmFtZSxcJG5hbWVcKTsnXC5cJGNybGZcLid1bmxpbmtcKCJncnBfcmVwYWlyXC5waHAiIjtpOjE0MztzOjEwNzoiLzB0VlNHL1N1djBVci9oYVVZQWRuM2pNUXdiYm9jR2ZmQWVDMjlCTjl0bUJpSmRWMWxrXCtqWURVOTJDOTRqZHREaWZcK3hPWWpHNkNMaHgzMVVvOXg5L2VBV2dzQks2MGtLMm1Md3F6cWQiO2k6MTQ0O3M6MTM0OiJtcHR5XChcJF9QT1NUXFsndXInXF1cKVwpIFwkbW9kZSBcfD0wNDAwO2lmXCghZW1wdHlcKFwkX1BPU1RcWyd1dydcXVwpXCkgXCRtb2RlIFx8PTAyMDA7aWZcKCFlbXB0eVwoXCRfUE9TVFxbJ3V4J1xdXClcKSBcJG1vZGUgXHw9MDEwMCI7aToxNDU7czozOToia2xhc3ZheXZcLmFzcFw/eWVuaWRvc3lhPTwlPWFrdGlma2xhcyU+IjtpOjE0NjtzOjEzNToibnRcKVwoZGlza190b3RhbF9zcGFjZVwoZ2V0Y3dkXChcKVwpL1woMTAyNFwqMTAyNFwpXClcLiJNYiBGcmVlIHNwYWNlICJcLlwoaW50XClcKGRpc2tfZnJlZV9zcGFjZVwoZ2V0Y3dkXChcKVwpL1woMTAyNFwqMTAyNFwpXClcLiJNYiA8IjtpOjE0NztzOjg0OiJhIGhyZWY9IjxcP2VjaG8gIlwkZmlzdGlrXC5waHBcP2RpemluPVwkZGl6aW4vXC5cLi8iXD8+IiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub24iO2k6MTQ4O3M6NDE6IlJvb3RTaGVsbCEnXCk7c2VsZlwubG9jYXRpb25cLmhyZWY9J2h0dHA6IjtpOjE0OTtzOjk3OiI8JT1SZXF1ZXN0XC5TZXJ2ZXJWYXJpYWJsZXNcKCJzY3JpcHRfbmFtZSJcKSU+XD9Gb2xkZXJQYXRoPTwlPVNlcnZlclwuVVJMUGF0aEVuY29kZVwoRm9sZGVyXC5Ecml2IjtpOjE1MDtzOjIwNjoicHJpbnRcKFwoaXNfcmVhZGFibGVcKFwkZlwpICYmIGlzX3dyaXRlYWJsZVwoXCRmXClcKVw/Ijx0cj48dGQ+Ilwud1woMVwpXC5iXCgiUiJcLndcKDFcKVwuZm9udFwoJ3JlZCcsJ1JXJywzXClcKVwud1woMVwpOlwoXChcKGlzX3JlYWRhYmxlXChcJGZcKVwpXD8iPHRyPjx0ZD4iXC53XCgxXClcLmJcKCJSIlwpXC53XCg0XCk6IiJcKVwuXChcKGlzX3dyaXRhYmwiO2k6MTUxO3M6MTg0OiJcKCciJywnJnF1b3Q7JyxcJGZuXClcKVwuJyI7ZG9jdW1lbnRcLmxpc3RcLnN1Ym1pdFwoXCk7XFwnPidcLmh0bWxzcGVjaWFsY2hhcnNcKHN0cmxlblwoXCRmblwpPmZvcm1hdFw/c3Vic3RyXChcJGZuLDAsZm9ybWF0LTNcKVwuOlwkZm5cKVwuJzwvYT4nXC5zdHJfcmVwZWF0XCgnICcsZm9ybWF0LXN0cmxlblwoXCRmblwpIjtpOjE1MjtzOjExOiJ6ZWhpcmhhY2tlciI7aToxNTM7czo0MzoiSiFWclwqJlJIUnd+Skx3XC5HXHx4bGhuTEp+XD8xXC5id09ieGJQXHwhViI7aToxNTQ7czo0NToiV1NPc2V0Y29va2llXChtZDVcKFwkX1NFUlZFUlxbJ0hUVFBfSE9TVCdcXVwpIjtpOjE1NTtzOjE1NjoiPC90ZD48dGQgaWQ9ZmE+XFsgPGEgdGl0bGU9XFwiSG9tZTogJyJcLmh0bWxzcGVjaWFsY2hhcnNcKHN0cl9yZXBsYWNlXCgiXFwiLFwkc2VwLGdldGN3ZFwoXClcKVwpXC4iJ1wuXFwiIGlkPWZhIGhyZWY9XFwiamF2YXNjcmlwdDpWaWV3RGlyXCgnIlwucmF3dXJsZW5jb2RlIjtpOjE1NjtzOjE3OiJDb250ZW50LVR5cGU6IFwkXyI7aToxNTc7czo5NDoiPG5vYnI+PGI+XCRjZGlyXCRjZmlsZTwvYj5cKCJcLlwkZmlsZVxbInNpemVfc3RyIlxdXC4iXCk8L25vYnI+PC90ZD48L3RyPjxmb3JtIG5hbWU9Y3Vycl9maWxlPiI7aToxNTg7czo1Mzoid3NvRXhcKCd0YXIgY2Z6diAnXC5lc2NhcGVzaGVsbGFyZ1woXCRfUE9TVFxbJ3AyJ1xdXCkiO2k6MTU5O3M6MTQyOiI1amIyMGlLVzl5SUhOMGNtbHpkSElvSkhKbFptVnlaWElzSW1Gd2IzSjBJaWtnYjNJZ2MzUnlhWE4wY2lna2NtVm1aWEpsY2l3aWJtbG5iV0VpS1NCdmNpQnpkSEpwYzNSeUtDUnlaV1psY21WeUxDSjNaV0poYkhSaElpa2diM0lnYzNSeWFYTjBjaWdrIjtpOjE2MDtzOjc2OiJMUzBnUkhWdGNETmtJR0o1SUZCcGNuVnNhVzR1VUVoUUlGZGxZbk5vTTJ4c0lIWXhMakFnWXpCa1pXUWdZbmtnY2pCa2NqRWdPa3c9IjtpOjE2MTtzOjg2OiJpZlwoZXJlZ1woJ1xeXFtcWzpibGFuazpcXVxdXCpjZFxbXFs6Ymxhbms6XF1cXVwrXChcW1xeO1xdXCtcKVwkJyxcJGNvbW1hbmQsXCRyZWdzXClcKSI7aToxNjI7czo1OToicm91bmRcKDBcKzk4MzBcLjRcKzk4MzBcLjRcKzk4MzBcLjRcKzk4MzBcLjRcKzk4MzBcLjRcKVwpPT0iO2k6MTYzO3M6MTM6IlBIUFNIRUxMXC5QSFAiO2k6MTY0O3M6MjA6IlNoZWxsIGJ5IE1hd2FyX0hpdGFtIjtpOjE2NTtzOjIyOiJwcml2YXRlIFNoZWxsIGJ5IG00cmNvIjtpOjE2NjtzOjEzOiJ3NGNrMW5nIHNoZWxsIjtpOjE2NztzOjIxOiJGYVRhTGlzVGlDel9GeCBGeDI5U2giO2k6MTY4O3M6NDc6Ildvcmtlcl9HZXRSZXBseUNvZGVcKFwkb3BEYXRhXFsncmVjdkJ1ZmZlcidcXVwpIjtpOjE2OTtzOjQ1OiJcJGZpbGVwYXRoPXJlYWxwYXRoXChcJF9QT1NUXFsnZmlsZXBhdGgnXF1cKTsiO2k6MTcwO3M6MTAxOiJcJHJlZGlyZWN0VVJMPSdodHRwOi8vJ1wuXCRyU2l0ZVwuXCRfU0VSVkVSXFsnUkVRVUVTVF9VUkknXF07aWZcKGlzc2V0XChcJF9TRVJWRVJcWydIVFRQX1JFRkVSRVInXF1cKSI7aToxNzE7czoxOToicmVuYW1lXCgid3NvXC5waHAiLCI7aToxNzI7czo1ODoiXCRNZXNzYWdlU3ViamVjdD1iYXNlNjRfZGVjb2RlXChcJF9QT1NUXFsibXNnc3ViamVjdCJcXVwpOyI7aToxNzM7czo1NzoiY29weVwoXCRfRklMRVNcW3hcXVxbdG1wX25hbWVcXSxcJF9GSUxFU1xbeFxdXFtuYW1lXF1cKVwpIjtpOjE3NDtzOjU4OiJTRUxFQ1QgMSBGUk9NIG15c3FsXC51c2VyIFdIRVJFIGNvbmNhdFwoYHVzZXJgLCcnLGBob3N0YFwpIjtpOjE3NTtzOjI0OiIhXCRfQ09PS0lFXFtcJHNlc3NkdF9rXF0iO2k6MTc2O3M6NjA6IlwkYT1cKHN1YnN0clwodXJsZW5jb2RlXChwcmludF9yXChhcnJheVwoXCksMVwpXCksNSwxXClcLmNcKSI7aToxNzc7czo1NzoieGggLXMgIi91c3IvbG9jYWwvYXBhY2hlL3NiaW4vaHR0cGQgLURTU0wiXC4vaHR0cGQgLW0gXCQxIjtpOjE3ODtzOjE5OiJwd2QgPiBHZW5lcmFzaVwuZGlyIjtpOjE3OTtzOjEyOiJCUlVURUZPUkNJTkciO2k6MTgwO3M6MzE6IkNhdXRhbSBmaXNpZXJlbGUgZGUgY29uZmlndXJhcmUiO2k6MTgxO3M6Mzg6Ilwka2E9JzxcPy8vQlJFJztcJGtha2E9XCRrYVwuJ0FDSy8vXD8+IjtpOjE4MjtzOjEwMzoiXCRzdWJqPXVybGRlY29kZVwoXCRfR0VUXFsnc3UnXF1cKTtcJGJvZHk9dXJsZGVjb2RlXChcJF9HRVRcWydibydcXVwpO1wkc2RzPXVybGRlY29kZVwoXCRfR0VUXFsnc2QnXF1cKSI7aToxODM7czo0NjoiXCRfX19fPWd6aW5mbGF0ZVwoXCRfX19fXClcKXtpZlwoaXNzZXRcKFwkX1BPUyI7aToxODQ7czozOToicGFzc3RocnVcKGdldGVudlwoIkhUVFBfQUNDRVBUX0xBTkdVQUdFIjtpOjE4NTtzOjg6IkFzbW9kZXVzIjtpOjE4NjtzOjUzOiJmb3JcKDtcJHBhZGRyPWFjY2VwdFwoQ0xJRU5ULFNFUlZFUlwpO2Nsb3NlIENMSUVOVFwpeyI7aToxODc7czo2NjoiXCRpemlubGVyMj1zdWJzdHJcKGJhc2VfY29udmVydFwoZmlsZXBlcm1zXChcJGZuYW1lXCksMTAsOFwpLC00XCk7IjtpOjE4ODtzOjQ3OiJcJGJhY2tkb29yLT5jY29weVwoXCRjZmljaGllcixcJGNkZXN0aW5hdGlvblwpOyI7aToxODk7czoyNzoie1wke3Bhc3N0aHJ1XChcJGNtZFwpfX08YnI+IjtpOjE5MDtzOjM3OiJcJGFcW2hpdHNcXSdcKTtcXHJcXG5cI2VuZHF1ZXJ5XFxyXFxuIjtpOjE5MTtzOjI3OiJuY2Z0cHB1dCAtdSBcJGZ0cF91c2VyX25hbWUiO2k6MTkyO3M6NDE6ImV4ZWNsXCgiL2Jpbi9zaCIsInNoIiwiLWkiLFwoY2hhclwqXCkwXCk7IjtpOjE5MztzOjMyOiI8SFRNTD48SEVBRD48VElUTEU+Y2dpLXNoZWxsXC5weSI7aToxOTQ7czozODoic3lzdGVtXCgidW5zZXQgSElTVEZJTEU7dW5zZXQgU0FWRUhJU1QiO2k6MTk1O3M6MjU6IlwkbG9naW49cG9zaXhfZ2V0dWlkXChcKTsiO2k6MTk2O3M6Nzg6IlwoZXJlZ1woJ1xeXFtcWzpibGFuazpcXVxdXCpjZFxbXFs6Ymxhbms6XF1cXVwqXCQnLFwkX1JFUVVFU1RcWydjb21tYW5kJ1xdXClcKSI7aToxOTc7czoyOToiIVwkX1JFUVVFU1RcWyJjOTlzaF9zdXJsIlxdXCkiO2k6MTk4O3M6NTI6IlBuVmxrV002MyFcIyZkS3h+bk1EV01+RH8vRXNufnh/NkRcIyZQfn4sXD9uWSxXUHtQb2oiO2k6MTk5O3M6NDA6InNoZWxsX2V4ZWNcKFwkX1BPU1RcWydjbWQnXF1cLiIgMj4mMSJcKTsiO2k6MjAwO3M6NDE6ImlmXCghXCR3aG9hbWlcKVwkd2hvYW1pPWV4ZWNcKCJ3aG9hbWkiXCk7IjtpOjIwMTtzOjY1OiJQeVN5c3RlbVN0YXRlXC5pbml0aWFsaXplXChTeXN0ZW1cLmdldFByb3BlcnRpZXNcKFwpLG51bGwsYXJndlwpOyI7aToyMDI7czo0MDoiPCU9ZW52XC5xdWVyeUhhc2h0YWJsZVwoInVzZXJcLm5hbWUiXCklPiI7aToyMDM7czo5MDoiaWZcKGVtcHR5XChcJF9QT1NUXFsnd3NlcidcXVwpXCl7XCR3c2VyPSJ3aG9pc1wucmlwZVwubmV0Ijt9ZWxzZSBcJHdzZXI9XCRfUE9TVFxbJ3dzZXInXF07IjtpOjIwNDtzOjEwNToiaWZcKG1vdmVfdXBsb2FkZWRfZmlsZVwoXCRfRklMRVNcWydmaWxhJ1xdXFsndG1wX25hbWUnXF0sXCRjdXJkaXJcLiIvIlwuXCRfRklMRVNcWydmaWxhJ1xdXFsnbmFtZSdcXVwpXCl7IjtpOjIwNTtzOjI1OiJzaGVsbF9leGVjXCgndW5hbWUgLWEnXCk7IjtpOjIwNjtzOjUwOiJpZlwoIWRlZmluZWRcJHBhcmFte2NtZH1cKXtcJHBhcmFte2NtZH09ImxzIC1sYSJ9OyI7aToyMDc7czo2ODoiaWZcKGdldF9tYWdpY19xdW90ZXNfZ3BjXChcKVwpXCRzaGVsbE91dD1zdHJpcHNsYXNoZXNcKFwkc2hlbGxPdXRcKTsiO2k6MjA4O3M6ODg6IjxhIGhyZWY9J1wkUEhQX1NFTEZcP2FjdGlvbj12aWV3U2NoZW1hJmRibmFtZT1cJGRibmFtZSZ0YWJsZW5hbWU9XCR0YWJsZW5hbWUnPlNjaGVtYTwvYT4iO2k6MjA5O3M6NzA6InBhc3N0aHJ1XChcJGJpbmRpclwuIm15c3FsZHVtcCAtLXVzZXI9XCRVU0VSTkFNRSAtLXBhc3N3b3JkPVwkUEFTU1dPUkQiO2k6MjEwO3M6Njk6Im15c3FsX3F1ZXJ5XCgiQ1JFQVRFIFRBQkxFIGB4cGxvaXRgXChgeHBsb2l0YCBMT05HQkxPQiBOT1QgTlVMTFwpIlwpOyI7aToyMTE7czo4OToiXCRyYTQ0PXJhbmRcKDEsOTk5OTlcKTtcJHNqOTg9InNoLVwkcmE0NCI7XCRtbD0iXCRzZDk4IjtcJGE1PVwkX1NFUlZFUlxbJ0hUVFBfUkVGRVJFUidcXTsiO2k6MjEyO3M6NjI6IlwkX0ZJTEVTXFsncHJvYmUnXF1cWydzaXplJ1xdLFwkX0ZJTEVTXFsncHJvYmUnXF1cWyd0eXBlJ1xdXCk7IjtpOjIxMztzOjcyOiJzeXN0ZW1cKCJcJGNtZCAxPiAvdG1wL2NtZHRlbXAgMj4mMTtjYXQgL3RtcC9jbWR0ZW1wO3JtIC90bXAvY21kdGVtcCJcKTsiO2k6MjE0O3M6OTU6In1lbHNpZlwoXCRzZXJ2YXJnPX4gL1xeXFw6XChcLlwrXD9cKVxcIVwoXC5cK1w/XClcXFwoXC5cK1w/XCkgUFJJVk1TR1woXC5cK1w/XCkgXFw6XChcLlwrXCkvXCl7IjtpOjIxNTtzOjc1OiJzZW5kXChTT0NLNSxcJG1zZywwLHNvY2thZGRyX2luXChcJHBvcnRhLFwkaWFkZHJcKVwpIGFuZCBcJHBhY290ZXN7b31cK1wrOzsiO2k6MjE2O3M6MjE6IlwkZmVcKCJcJGNtZCAyPiYxIlwpOyI7aToyMTc7czo3NDoid2hpbGVcKFwkcm93PW15c3FsX2ZldGNoX2FycmF5XChcJHJlc3VsdCxNWVNRTF9BU1NPQ1wpXCkgcHJpbnRfclwoXCRyb3dcKTsiO2k6MjE4O3M6NTk6ImVsc2VpZlwoaXNfd3JpdGFibGVcKFwkRk5cKSAmJiBpc19maWxlXChcJEZOXClcKSBcJHRtcE91dE1GIjtpOjIxOTtzOjgyOiJjb25uZWN0XChTT0NLRVQsc29ja2FkZHJfaW5cKFwkQVJHVlxbMVxdLGluZXRfYXRvblwoXCRBUkdWXFswXF1cKVwpXCkgb3IgZGllIHByaW50IjtpOjIyMDtzOjEwNzoiaWZcKG1vdmVfdXBsb2FkZWRfZmlsZVwoXCRfRklMRVNcWyJmaWMiXF1cWyJ0bXBfbmFtZSJcXSxnb29kX2xpbmtcKCJcLi8iXC5cJF9GSUxFU1xbImZpYyJcXVxbIm5hbWUiXF1cKVwpXCkiO2k6MjIxO3M6ODk6IlVOSU9OIFNFTEVDVCAnMCcsJzxcPyBzeXN0ZW1cKFxcXCRfR0VUXFtjcGNcXVwpO2V4aXQ7XD8+JywwLDAsMCwwIElOVE8gT1VURklMRSAnXCRvdXRmaWxlIjtpOjIyMjtzOjczOiJpZlwoIWlzX2xpbmtcKFwkZmlsZVwpICYmXChcJHI9cmVhbHBhdGhcKFwkZmlsZVwpXCkgIT1GQUxTRVwpIFwkZmlsZT1cJHI7IjtpOjIyMztzOjMwOiJlY2hvICJGSUxFIFVQTE9BREVEIFRPIFwkZGV6IjsiO2k6MjI0O3M6MzA6IlwkZnVuY3Rpb25cKFwkX1BPU1RcWydjbWQnXF1cKSI7aToyMjU7czo0MDoiXCRmaWxlbmFtZT1cJGJhY2t1cHN0cmluZ1wuIlwkZmlsZW5hbWUiOyI7aToyMjY7czo1NDoiaWZcKCcnPT1cKFwkZGY9aW5pX2dldFwoJ2Rpc2FibGVfZnVuY3Rpb25zJ1wpXClcKXtlY2hvIjtpOjIyNztzOjQ3OiI8JSBGb3IgRWFjaCBWYXJzIEluIFJlcXVlc3RcLlNlcnZlclZhcmlhYmxlcyAlPiI7aToyMjg7czozODoiaWZcKFwkZnVuY2FyZz1+IC9cXnBvcnRzY2FuXChcLlwqXCkvXCkiO2k6MjI5O3M6NjA6IlwkdXBsb2FkZmlsZT1cJHJwYXRoXC4iLyJcLlwkX0ZJTEVTXFsndXNlcmZpbGUnXF1cWyduYW1lJ1xdOyI7aToyMzA7czozMDoiXCRjbWQ9XChcJF9SRVFVRVNUXFsnY21kJ1xdXCk7IjtpOjIzMTtzOjQzOiJpZlwoXCRjbWQgIT0iIlwpIHByaW50IFNoZWxsX0V4ZWNcKFwkY21kXCk7IjtpOjIzMjtzOjMzOiJpZlwoaXNfZmlsZVwoIi90bXAvXCRla2luY2kiXClcKXsiO2k6MjMzO3M6Njk6Il9fYWxsX189XFsiU01UUFNlcnZlciIsIkRlYnVnZ2luZ1NlcnZlciIsIlB1cmVQcm94eSIsIk1haWxtYW5Qcm94eSJcXSI7aToyMzQ7czo2MDoiZ2xvYmFsIFwkbXlzcWxIYW5kbGUsXCRkYm5hbWUsXCR0YWJsZW5hbWUsXCRvbGRfbmFtZSxcJG5hbWUsIjtpOjIzNTtzOjI4OiIyPiYxIDE+JjIiIDogIiAxPiYxIDI+JjEiXCk7IjtpOjIzNjtzOjU3OiJtYXB7cmVhZF9zaGVsbFwoXCRfXCl9XChcJHNlbF9zaGVsbC0+Y2FuX3JlYWRcKDBcLjAxXClcKTsiO2k6MjM3O3M6MjQ6ImZ3cml0ZVwoXCRmcCwiXCR5YXppIlwpOyI7aToyMzg7czo1MToiU2VuZCB0aGlzIGZpbGU6IDxJTlBVVCBOQU1FPSJ1c2VyZmlsZSIgVFlQRT0iZmlsZSI+IjtpOjIzOTtzOjQ0OiJcJGRiX2Q9bXlzcWxfc2VsZWN0X2RiXChcJGRhdGFiYXNlLFwkY29uMVwpOyI7aToyNDA7czo2MzoiZm9yXChcJHZhbHVlXCl7cy8mLyZhbXA7L2c7cy88LyZsdDsvZztzLz4vJmd0Oy9nO3MvIi8mcXVvdDsvZzt9IjtpOjI0MTtzOjg5OiJjb3B5XChcJF9GSUxFU1xbJ3Vwa2snXF1cWyd0bXBfbmFtZSdcXSwia2svIlwuYmFzZW5hbWVcKFwkX0ZJTEVTXFsndXBraydcXVxbJ25hbWUnXF1cKVwpOyI7aToyNDI7czo5MzoiZnVuY3Rpb24gZ29vZ2xlX2JvdFwoXCl7XCRzVXNlckFnZW50PXN0cnRvbG93ZXJcKFwkX1NFUlZFUlxbJ0hUVFBfVVNFUl9BR0VOVCdcXVwpO2lmXCghXChzdHJwIjtpOjI0MztzOjczOiJjcmVhdGVfZnVuY3Rpb25cKCImXCRmdW5jdGlvbiIsIlwkZnVuY3Rpb249Y2hyXChvcmRcKFwkZnVuY3Rpb25cKS0zXCk7IlwpIjtpOjI0NDtzOjUwOiJsb25nIGludDp0XCgwLDNcKT1yXCgwLDNcKTstMjE0NzQ4MzY0ODsyMTQ3NDgzNjQ3OyI7aToyNDU7czo1NToiXD91cmw9J1wuXCRfU0VSVkVSXFsnSFRUUF9IT1NUJ1xdXClcLnVubGlua1woUk9PVF9ESVJcLiI7aToyNDY7czozOToiY2F0IFwke2Jsa2xvZ1xbMlxdfVx8IGdyZXAgInJvb3Q6eDowOjAiIjtpOjI0NztzOjk3OiJwYXRoMT1cKCdhZG1pbi8nLCdhZG1pbmlzdHJhdG9yLycsJ21vZGVyYXRvci8nLCd3ZWJhZG1pbi8nLCdhZG1pbmFyZWEvJywnYmItYWRtaW4vJywnYWRtaW5Mb2dpbi8nIjtpOjI0ODtzOjg4OiIiYWRtaW4xXC5waHAiLCJhZG1pbjFcLmh0bWwiLCJhZG1pbjJcLnBocCIsImFkbWluMlwuaHRtbCIsInlvbmV0aW1cLnBocCIsInlvbmV0aW1cLmh0bWwiIjtpOjI0OTtzOjcwOiJQT1NUe1wkcGF0aH17XCRjb25uZWN0b3J9XD9Db21tYW5kPUZpbGVVcGxvYWQmVHlwZT1GaWxlJkN1cnJlbnRGb2xkZXI9IjtpOjI1MDtzOjMzOiJhc3NlcnRcKFwkX1JFUVVFU1RcWydQSFBTRVNTSUQnXF0iO2k6MjUxO3M6NjQ6IlwkcHJvZD0ic3lzdGVtIjtcJGlkPVwkcHJvZFwoXCRfUkVRVUVTVFxbJ3Byb2R1Y3QnXF1cKTtcJHsnaWQnfTsiO2k6MjUyO3M6MTc6InBocCAiXC5cJHdzb19wYXRoIjtpOjI1MztzOjg3OiJcJEZjaG1vZCxcJEZkYXRhLFwkT3B0aW9ucyxcJEFjdGlvbixcJGhkZGFsbCxcJGhkZGZyZWUsXCRoZGRwcm9jLFwkdW5hbWUsXCRpZGRcKTpzaGFyZWQiO2k6MjU0O3M6NTY6InNlcnZlclwuPC9wPlxcclxcbjwvYm9keT48L2h0bWw+IjtleGl0O31pZlwocHJlZ19tYXRjaFwoIjtpOjI1NTtzOjEwMjoiXCRmaWxlPVwkX0ZJTEVTXFsiZmlsZW5hbWUiXF1cWyJuYW1lIlxdO2VjaG8gIjxhIGhyZWY9XFwiXCRmaWxlXFwiPlwkZmlsZTwvYT4iO31lbHNle2VjaG9cKCJlbXB0eSJcKTt9IjtpOjI1NjtzOjYzOiJGU19jaGtfZnVuY19saWJjPVwoXCRcKHJlYWRlbGYgLXMgXCRGU19saWJjIFx8IGdyZXAgX2NoayBcfCBhd2siO2k6MjU3O3M6NDE6ImZpbmQgLyAtbmFtZVwuc3NoID4gXCRkaXIvc3Noa2V5cy9zc2hrZXlzIjtpOjI1ODtzOjQzOiJyZVwuZmluZGFsbFwoZGlydFwrJ1woXC5cKlwpJyxwcm9nbm1cKVxbMFxdIjtpOjI1OTtzOjYzOiJvdXRzdHIgXCs9c3RyaW5nXC5Gb3JtYXRcKCI8YSBocmVmPSdcP2ZkaXI9ezB9Jz57MX0vPC9hPiZuYnNwOyIiO2k6MjYwO3M6ODk6IjwlPVJlcXVlc3RcLlNlcnZlcnZhcmlhYmxlc1woIlNDUklQVF9OQU1FIlwpJT5cP3R4dHBhdGg9PCU9UmVxdWVzdFwuUXVlcnlTdHJpbmdcKCJ0eHRwYXRoIjtpOjI2MTtzOjgxOiJSZXNwb25zZVwuV3JpdGVcKFNlcnZlclwuSHRtbEVuY29kZVwodGhpc1wuRXhlY3V0ZUNvbW1hbmRcKHR4dENvbW1hbmRcLlRleHRcKVwpXCkiO2k6MjYyO3M6MTE5OiJuZXcgRmlsZVN0cmVhbVwoUGF0aFwuQ29tYmluZVwoZmlsZUluZm9cLkRpcmVjdG9yeU5hbWUsUGF0aFwuR2V0RmlsZU5hbWVcKGh0dHBQb3N0ZWRGaWxlXC5GaWxlTmFtZVwpXCksRmlsZU1vZGVcLkNyZWF0ZSI7aToyNjM7czo5OToiUmVzcG9uc2VcLldyaXRlXCgiPGJyPlwoXCkgPGEgaHJlZj1cP3R5cGU9MSZmaWxlPSIgJiBzZXJ2ZXJcLlVSTGVuY29kZVwoaXRlbVwucGF0aFwpICYgIlxcPiIgJiBpdGVtIjtpOjI2NDtzOjExNToic3FsQ29tbWFuZFwuUGFyYW1ldGVyc1wuQWRkXChcKFwoVGFibGVDZWxsXClkYXRhR3JpZEl0ZW1cLkNvbnRyb2xzXFswXF1cKVwuVGV4dCxTcWxEYlR5cGVcLkRlY2ltYWxcKVwuVmFsdWU9ZGVjaW1hbCI7aToyNjU7czo2NzoiPCU9IlxcIiAmIG9TY3JpcHROZXRcLkNvbXB1dGVyTmFtZSAmICJcXCIgJiBvU2NyaXB0TmV0XC5Vc2VyTmFtZSAlPiI7aToyNjY7czo1MjoiY3VybF9zZXRvcHRcKFwkY2gsQ1VSTE9QVF9VUkwsImh0dHA6Ly9cJGhvc3Q6MjA4MiJcKSI7aToyNjc7czo1ODoiSEozSGp1dGNrb1JmcFhmOUExelFPMkF3RFJyUmV5OXVHdlRlZXo3OXFBYW8xYTByZ3Vka1prUjhSYSI7aToyNjg7czozMjoiXCRpbmlcWyd1c2VycydcXT1hcnJheVwoJ3Jvb3QnPT4iO2k6MjY5O3M6MTk6InByb2Nfb3BlblwoJ0lIU3RlYW0iO2k6MjcwO3M6Mjg6IlwkYmFzbGlrPVwkX1BPU1RcWydiYXNsaWsnXF0iO2k6MjcxO3M6MzU6ImZyZWFkXChcJGZwLGZpbGVzaXplXChcJGZpY2hlcm9cKVwpIjtpOjI3MjtzOjQyOiJJL2djWi92WDBBMTBERFJEZzdFemsvZFwrM1wrOHF2cXFTMUswXCtBWFkiO2k6MjczO3M6MTk6IntcJF9QT1NUXFsncm9vdCdcXX0iO2k6Mjc0O3M6MzM6In1lbHNlaWZcKFwkX0dFVFxbJ3BhZ2UnXF09PSdkZG9zJyI7aToyNzU7czoxNDoiVGhlIERhcmsgUmF2ZXIiO2k6Mjc2O3M6NDg6IlwkdmFsdWU9fiBzLyVcKFwuXC5cKS9wYWNrXCgnYycsaGV4XChcJDFcKVwpL2VnOyI7aToyNzc7czoxMzoid3d3XC50MHNcLm9yZyI7aToyNzg7czozNToidW5sZXNzXChvcGVuXChQRkQsXCRnX3VwbG9hZF9kYlwpXCkiO2k6Mjc5O3M6MTI6ImF6ODhwaXgwMHE5OCI7aToyODA7czoxNDoic2ggZ28gXCQxXC5cJHgiO2k6MjgxO3M6Mjk6InN5c3RlbVwoInBocCAtZiB4cGwgXCRob3N0IlwpIjtpOjI4MjtzOjEzOiJleHBsb2l0Y29va2llIjtpOjI4MztzOjIyOiI4MCAtYiBcJDEgLWkgZXRoMCAtcyA4IjtpOjI4NDtzOjI1OiJIVFRQIGZsb29kIGNvbXBsZXRlIGFmdGVyIjtpOjI4NTtzOjE2OiJOSUdHRVJTXC5OSUdHRVJTIjtpOjI4NjtzOjU5OiJpZlwoaXNzZXRcKFwkX0dFVFxbJ2hvc3QnXF1cKSYmaXNzZXRcKFwkX0dFVFxbJ3RpbWUnXF1cKVwpeyI7aToyODc7czo4Mjoic3VicHJvY2Vzc1wuUG9wZW5cKGNtZCxzaGVsbD1UcnVlLHN0ZG91dD1zdWJwcm9jZXNzXC5QSVBFLHN0ZGVycj1zdWJwcm9jZXNzXC5TVERPVSI7aToyODg7czo2OToiZGVmIGRhZW1vblwoc3RkaW49Jy9kZXYvbnVsbCcsc3Rkb3V0PScvZGV2L251bGwnLHN0ZGVycj0nL2Rldi9udWxsJ1wpIjtpOjI4OTtzOjc1OiJwcmludFwoIlxbIVxdIEhvc3Q6ICIgXCsgaG9zdG5hbWUgXCsgIiBtaWdodCBiZSBkb3duIVxcblxbIVxdIFJlc3BvbnNlIENvZGUiO2k6MjkwO3M6NTE6ImNvbm5lY3Rpb25cLnNlbmRcKCJzaGVsbCAiXCtzdHJcKG9zXC5nZXRjd2RcKFwpXClcKyI7aToyOTE7czo1Njoib3NcLnN5c3RlbVwoJ2VjaG8gYWxpYXMgbHM9IlwubHNcLmJhc2giID4+IH4vXC5iYXNocmMnXCkiO2k6MjkyO3M6MzE6InJ1bGVfcmVxPXJhd19pbnB1dFwoIlNvdXJjZUZpcmUiO2k6MjkzO3M6NTg6ImFyZ3BhcnNlXC5Bcmd1bWVudFBhcnNlclwoZGVzY3JpcHRpb249aGVscCxwcm9nPSJzY3R1bm5lbCIiO2k6Mjk0O3M6NTg6InN1YnByb2Nlc3NcLlBvcGVuXCgnJXNnZGIgLXAgJWQgLWJhdGNoICVzJyAlXChnZGJfcHJlZml4LHAiO2k6Mjk1O3M6NjY6IlwkZnJhbWV3b3JrXC5wbHVnaW5zXC5sb2FkXCgiXCN7cnBjdHlwZVwuZG93bmNhc2V9cnBjIixvcHRzXClcLnJ1biI7aToyOTY7czoyNzoiaWYgc2VsZlwuaGFzaF90eXBlPT0ncHdkdW1wIjtpOjI5NztzOjE3OiJpdHNva25vcHJvYmxlbWJybyI7aToyOTg7czo0NToiYWRkX2ZpbHRlclwoJ3RoZV9jb250ZW50JywnX2Jsb2dpbmZvJywxMDAwMVwpIjtpOjI5OTtzOjEwOiI8c3RkbGliXC5oIjtpOjMwMDtzOjUxOiJlY2hvIHk7c2xlZXAgMTt9XHx7d2hpbGUgcmVhZDtkbyBlY2hvIHpcJFJFUExZO2RvbmUiO2k6MzAxO3M6MTE6IlZPQlJBIEdBTkdPIjtpOjMwMjtzOjkwOiJpbnQzMlwoXChcKFwkeiA+PiA1ICYgMHgwN2ZmZmZmZlwpIFxeIFwkeSA8PCAyXCkgXCtcKFwoXCR5ID4+IDMgJiAweDFmZmZmZmZmXCkgXF4gXCR6IDw8IDQiO2k6MzAzO3M6ODI6ImNvcHlcKFwkX0ZJTEVTXFtmaWxlTWFzc1xdXFt0bXBfbmFtZVxdLFwkX1BPU1RcW3BhdGhcXVwuXCRfRklMRVNcW2ZpbGVNYXNzXF1cW25hbWUiO2k6MzA0O3M6NDg6ImZpbmRfZGlyc1woXCRncmFuZHBhcmVudF9kaXIsXCRsZXZlbCwxLFwkZGlyc1wpOyI7aTozMDU7czoyOToic2V0Y29va2llXCgiaGl0IiwxLHRpbWVcKFwpXCsiO2k6MzA2O3M6NzoiZS9cKlwuLyI7aTozMDc7czozNzoiSkhacGMybDBZMjkxYm5RZ1BTQWtTRlJVVUY5RFQwOUxTVVZmViI7aTozMDg7czozNToiMGQwYTBkMGE2NzZjNmY2MjYxNmMyMDI0NmQ3OTVmNzM2ZDciO2k6MzA5O3M6MjA6ImZvcGVuXCgnL2V0Yy9wYXNzd2QnIjtpOjMxMDtzOjk3OiJcJHRzdTJcW3JhbmRcKDAsY291bnRcKFwkdHN1MlwpIC0gMVwpXF1cLlwkdHN1MVxbcmFuZFwoMCxjb3VudFwoXCR0c3UxXCkgLSAxXClcXVwuXCR0c3UyXFtyYW5kXCgwIjtpOjMxMTtzOjMzOiIvdXNyL2xvY2FsL2FwYWNoZS9iaW4vaHR0cGQgLURTU0wiO2k6MzEyO3M6MjA6InNldCBwcm90ZWN0LXRlbG5ldCAwIjtpOjMxMztzOjI3OiJheXUgcHIxIHByMiBwcjMgcHI0IHByNSBwcjYiO2k6MzE0O3M6MjU6ImJpbmQgZmlsdCAtICIBQUNUSU9OIFwqASIiO2k6MzE1O3M6NTE6InJlZ3N1YiAtYWxsIC0tLFxbc3RyaW5nIHRvbG93ZXIgXCRvd25lclxdICIiIG93bmVycyI7aTozMTY7czozNzoia2lsbCAtQ0hMRCBcXFwkYm90cGlkID4vZGV2L251bGwgMj4mMSI7aTozMTc7czoxMDoiYmluZCBkY2MgLSI7aTozMTg7czoyNToicjRhVGNcLmRQbnRFL2Z6dFNGMWJIM1JIMCI7aTozMTk7czoxNDoicHJpdm1zZyBcJGNoYW4iO2k6MzIwO3M6MjM6ImJpbmQgam9pbiAtIFwqIGdvcF9qb2luIjtpOjMyMTtzOjUwOiJzZXQgZ29vZ2xlXChkYXRhXCkgXFtodHRwOjpkYXRhIFwkZ29vZ2xlXChwYWdlXClcXSI7aTozMjI7czoyNToicHJvYyBodHRwOjpDb25uZWN0e3Rva2VufSI7aTozMjM7czoxNDoicHJpdm1zZyBcJG5pY2siO2k6MzI0O3M6MTI6InB1dGJvdCBcJGJvdCI7aTozMjU7czoxMjoidW5iaW5kIFJBVyAtIjtpOjMyNjtzOjM1OiItLURDQ0RJUiBcW2xpbmRleCBcJFVzZXJcKFwkaVwpIDJcXSI7aTozMjc7czoxMDoiQ3liZXN0ZXI5MCI7aTozMjg7czo1MToiZmlsZV9nZXRfY29udGVudHNcKHRyaW1cKFwkZlxbXCRfR0VUXFsnaWQnXF1cXVwpXCk7IjtpOjMyOTtzOjIzOiJ1bmxpbmtcKFwkd3JpdGFibGVfZGlycyI7aTozMzA7czozMDoiYmFzZTY0X2RlY29kZVwoXCRjb2RlX3NjcmlwdFwpIjtpOjMzMTtzOjIxOiJsdWNpZmZlcmx1Y2lmZmVyXC5vcmciO2k6MzMyO3M6NTQ6IlwkdGhpcy0+Ri0+R2V0Q29udHJvbGxlclwoXCRfU0VSVkVSXFsnUkVRVUVTVF9VUkknXF1cKSI7aTozMzM7czo1MzoiXCR0aW1lX3N0YXJ0ZWRcLlwkc2VjdXJlX3Nlc3Npb25fdXNlclwuc2Vzc2lvbl9pZFwoXCkiO2k6MzM0O3M6ODc6IlwkcGFyYW0geCBcJG5cLnN1YnN0clwoXCRwYXJhbSxsZW5ndGhcKFwkcGFyYW1cKSAtIGxlbmd0aFwoXCRjb2RlXCklbGVuZ3RoXChcJHBhcmFtXClcKSI7aTozMzU7czo0MzoiZndyaXRlXChcJGYsZ2V0X2Rvd25sb2FkXChcJF9HRVRcWyd1cmwnXF1cKSI7aTozMzY7czo3NToiaHR0cDovLydcLlwkX1NFUlZFUlxbJ0hUVFBfSE9TVCdcXVwudXJsZGVjb2RlXChcJF9TRVJWRVJcWydSRVFVRVNUX1VSSSdcXVwpIjtpOjMzNztzOjc2OiJ3cF9wb3N0cyBXSEVSRSBwb3N0X3R5cGU9J3Bvc3QnIEFORCBwb3N0X3N0YXR1cz0ncHVibGlzaCcgT1JERVIgQlkgYElEYCBERVNDIjtpOjMzODtzOjQzOiJcJHVybD1cJHVybHNcW3JhbmRcKDAsY291bnRcKFwkdXJsc1wpLTFcKVxdIjtpOjMzOTtzOjYxOiJwcmVnX21hdGNoXCgnL1woXD88PVJld3JpdGVSdWxlXClcLlwqXChcPz1cXFxbTFxcLFJcXD0zMDJcXFxdIjtpOjM0MDtzOjUxOiJwcmVnX21hdGNoXCgnIU1JRFBcfFdBUFx8V2luZG93c1wuQ0VcfFBQQ1x8U2VyaWVzNjAiO2k6MzQxO3M6NjA6IlIwbEdPRGxoRXdBUUFMTUFBQUFBQVAvLy81eWNBTTdPWS8vL25QLy96di9PblBmMzkvLy8vd0FBQUFBQSI7aTozNDI7czo4MToic3RyX3JvdDEzXChcJGJhc2VhXFtcKFwkZGltZW5zaW9uXCpcJGRpbWVuc2lvbi0xXCkgLVwoXCRpXCpcJGRpbWVuc2lvblwrXCRqXClcXVwpIjtpOjM0MztzOjkyOiJpZlwoZW1wdHlcKFwkX0dFVFxbJ3ppcCdcXVwpIGFuZCBlbXB0eVwoXCRfR0VUXFsnZG93bmxvYWQnXF1cKSAmIGVtcHR5XChcJF9HRVRcWydpbWcnXF1cKVwpeyI7aTozNDQ7czoxNjoiTWFkZSBieSBEZWxvcmVhbiI7aTozNDU7czo1Mzoib3ZlcmZsb3cteTpzY3JvbGw7XFwiPiJcLlwkbGlua3NcLlwkaHRtbF9tZlxbJ2JvZHknXF0iO2k6MzQ2O3M6NDQ6ImZ1bmN0aW9uIHVybEdldENvbnRlbnRzXChcJHVybCxcJHRpbWVvdXQ9NVwpIjtpOjM0NztzOjY6ImQzbGV0ZSI7aTozNDg7czoxNzoibGV0YWtzZWthcmFuZ1woXCkiO2k6MzQ5O3M6ODoiWUVOSTNFUkkiO2k6MzUwO3M6MjM6IlwkT09PMDAwMDAwPXVybGRlY29kZVwoIjtpOjM1MTtzOjIwOiItSS91c3IvbG9jYWwvYmFuZG1pbiI7aTozNTI7czo0MDoiZndyaXRlXChcJGZwc2V0dixnZXRlbnZcKCJIVFRQX0NPT0tJRSJcKSI7aTozNTM7czozMDoiaXNzZXRcKFwkX1BPU1RcWydleGVjZ2F0ZSdcXVwpIjtpOjM1NDtzOjE1OiJXZWJjb21tYW5kZXIgYXQiO2k6MzU1O3M6MTM6Ij09ImJpbmRzaGVsbCIiO2k6MzU2O3M6ODoiUGFzaGtlbGEiO2k6MzU3O3M6MjU6ImNyZWF0ZUZpbGVzRm9ySW5wdXRPdXRwdXQiO2k6MzU4O3M6NjoiTTRsbDNyIjtpOjM1OTtzOjIwOiJfX1ZJRVdTVEFURUVOQ1JZUFRFRCI7aTozNjA7czo3OiJPb05fQm95IjtpOjM2MTtzOjEzOiJSZWFMX1B1TmlTaEVyIjtpOjM2MjtzOjg6ImRhcmttaW56IjtpOjM2MztzOjU6IlplZDB4IjtpOjM2NDtzOjQ0OiJhYmFjaG9cfGFiaXpkaXJlY3RvcnlcfGFib3V0XHxhY29vblx8YWxleGFuYSI7aTozNjU7czo0MToicHBjXHxtaWRwXHx3aW5kb3dzIGNlXHxtdGtcfGoybWVcfHN5bWJpYW4iO2k6MzY2O3M6NzI6ImNoclwoXChcJGhcW1wkZVxbXCRvXF1cXTw8NFwpXCtcKFwkaFxbXCRlXFtcK1wrXCRvXF1cXVwpXCk7fX1ldmFsXChcJGRcKSI7aTozNjc7czoxMjoiXCRzaDNsbENvbG9yIjtpOjM2ODtzOjEwOiJQdW5rZXIyQm90IjtpOjM2OTtzOjIxOiI8XD9waHAgZWNobyAiXCMhIVwjIjsiO2k6MzcwO3M6OTY6IlwkaW09c3Vic3RyXChcJGltLDAsXCRpXClcLnN1YnN0clwoXCRpbSxcJGkyXCsxLFwkaTQtXChcJGkyXCsxXClcKVwuc3Vic3RyXChcJGltLFwkaTRcKzEyLHN0cmxlbiI7aTozNzE7czo2NjoiXChcJGluZGF0YSxcJGI2ND0xXCl7aWZcKFwkYjY0PT0xXCl7XCRjZD1iYXNlNjRfZGVjb2RlXChcJGluZGF0YVwpIjtpOjM3MjtzOjIzOiJcKFwkX1BPU1RcWyJkaXIiXF1cKVwpOyI7aTozNzM7czoxNzoiSGFja2VkIEJ5IEVuRExlU3MiO2k6Mzc0O3M6MTE6ImFuZGV4XHxvb2dsIjtpOjM3NTtzOjExOiJuZHJvaVx8aHRjXyI7aTozNzY7czo2OiIuSXJJc1QiO2k6Mzc3O3M6MjI6IjdQMXRkXCtOV2xpYUkvaFdrWjRWWDkiO2k6Mzc4O3M6MTU6Ik5pbmphVmlydXMgSGVyZSI7aTozNzk7czo0MzoiXCRpbT1zdWJzdHJcKFwkdHgsXCRwXCsyLFwkcDItXChcJHBcKzJcKVwpOyI7aTozODA7czo2OiIzeHAxcjMiO2k6MzgxO3M6MjQ6IlwkbWQ1PW1kNVwoIlwkcmFuZG9tIlwpOyI7aTozODI7czoyOToib1RhdDhEM0RzRTgnJn5oVTA2Q0NINTtcJGdZU3EiO2k6MzgzO3M6MTM6IkdJRjg5QTs8XD9waHAiO2k6Mzg0O3M6MTU6IkNyZWF0ZWQgQnkgRU1NQSI7aTozODU7czo1MDoiUGFzc3dvcmQ6XHMqIlwuXCRfUE9TVFxbWyciXXswLDF9cGFzc3dkWyciXXswLDF9XF0iO2k6Mzg2O3M6MTQ6Ik5ldGRkcmVzcyBNYWlsIjtpOjM4NztzOjI1OiJcJGlzZXZhbGZ1bmN0aW9uYXZhaWxhYmxlIjtpOjM4ODtzOjExOiJCYWJ5X0RyYWtvbiI7aTozODk7czozNDoiZndyaXRlXChmb3BlblwoZGlybmFtZVwoX19GSUxFX19cKSI7aTozOTA7czoxOToiXF1cXVwpXCk7fX1ldmFsXChcJCI7aTozOTE7czo0MDoiZXJlZ19yZXBsYWNlXChbJyJdezAsMX0mZW1haWwmWyciXXswLDF9LCI7aTozOTI7czoyNzoiXCk7XCRpXCtcK1wpXCRyZXRcLj1jaHJcKFwkIjtpOjM5MztzOjgwOiJcJHBhcmFtMm1hc2tcLiJcKVxcPVxbXFxbJyJdXFwiXF1cKFwuXCpcP1wpXChcPz1cW1xcWyciXVxcIlxdXClcW1xcWyciXVxcIlxdL3NpZSI7aTozOTQ7czo5OiIvL3Jhc3RhLy8iO2k6Mzk1O3M6MjA6IjwhLS1DT09LSUUgVVBEQVRFLS0+IjtpOjM5NjtzOjE0OiJwcm9mZXhvclwuaGVsbCI7aTozOTc7czoxMzoiTWFnZWxhbmdDeWJlciI7aTozOTg7czo4OiJaT0JVR1RFTCI7aTozOTk7czoyMToiZGF0YTp0ZXh0L2h0bWw7YmFzZTY0IjtpOjQwMDtzOjEwOiJTX1xdX1xeVVxeIjtpOjQwMTtzOjE2OiJcJF9QT1NUXFtcKGNoclwoIjtpOjQwMjtzOjEyOiJaZXJvRGF5RXhpbGUiO2k6NDAzO3M6MTI6IlN1bHRhbkhhaWthbCI7aTo0MDQ7czoxMToiQ291cGRlZ3JhY2UiO2k6NDA1O3M6ODoiYXJ0aWNrbGUiO30="));
$gX_DBShe unserialize(base64_decode("YTo2Njp7aTowO3M6NzoiZGVmYWNlciI7aToxO3M6MjQ6IllvdSBjYW4gcHV0IGEgbWQ1IHN0cmluZyI7aToyO3M6ODoicGhwc2hlbGwiO2k6MztzOjk6IlJvb3RTaGVsbCI7aTo0O3M6NjI6IjxkaXYgY2xhc3M9ImJsb2NrIGJ0eXBlMSI+PGRpdiBjbGFzcz0iZHRvcCI+PGRpdiBjbGFzcz0iZGJ0bSI+IjtpOjU7czo4OiJjOTlzaGVsbCI7aTo2O3M6ODoicjU3c2hlbGwiO2k6NztzOjc6Ik5URGFkZHkiO2k6ODtzOjg6ImNpaHNoZWxsIjtpOjk7czo3OiJGeGM5OXNoIjtpOjEwO3M6MTI6IldlYiBTaGVsbCBieSI7aToxMTtzOjExOiJkZXZpbHpTaGVsbCI7aToxMjtzOjg6Ik4zdHNoZWxsIjtpOjEzO3M6MTE6IlN0b3JtN1NoZWxsIjtpOjE0O3M6MTE6IkxvY3VzN1NoZWxsIjtpOjE1O3M6MTM6InI1N3NoZWxsXC5waHAiO2k6MTY7czo5OiJhbnRpc2hlbGwiO2k6MTc7czo5OiJyb290c2hlbGwiO2k6MTg7czoxMToibXlzaGVsbGV4ZWMiO2k6MTk7czo4OiJTaGVsbCBPayI7aToyMDtzOjE1OiJleGVjXCgicm0gLXIgLWYiO2k6MjE7czoxODoiTmUgdWRhbG9zIHphZ3J1eml0IjtpOjIyO3M6NTE6IlwkbWVzc2FnZT1lcmVnX3JlcGxhY2VcKCIlNUMlMjIiLCIlMjIiLFwkbWVzc2FnZVwpOyI7aToyMztzOjE5OiJwcmludCAiU3BhbWVkJz48YnI+IjtpOjI0O3M6NDA6InNldGNvb2tpZVwoIm15c3FsX3dlYl9hZG1pbl91c2VybmFtZSJcKTsiO2k6MjU7czo0MToiZWxzZWlmXChmdW5jdGlvbl9leGlzdHNcKCJzaGVsbF9leGVjIlwpXCkiO2k6MjY7czo2NToiaWZcKGlzX2NhbGxhYmxlXCgiZXhlYyJcKSBhbmQgIWluX2FycmF5XCgiZXhlYyIsXCRkaXNhYmxlZnVuY1wpXCkiO2k6Mjc7czozNToiaWZcKFwoXCRwZXJtcyAmIDB4QzAwMFwpPT0weEMwMDBcKXsiO2k6Mjg7czoxMDoiZGlyIC9PRyAvWCI7aToyOTtzOjQxOiJpbmNsdWRlXChcJF9TRVJWRVJcWydIVFRQX1VTRVJfQUdFTlQnXF1cKSI7aTozMDtzOjc6Im1pbHcwcm0iO2k6MzE7czo3OiJicjB3czNyIjtpOjMyO3M6NTM6IidodHRwZFwuY29uZicsJ3Zob3N0c1wuY29uZicsJ2NmZ1wucGhwJywnY29uZmlnXC5waHAnIjtpOjMzO3M6MzQ6Ii9wcm9jL3N5cy9rZXJuZWwveWFtYS9wdHJhY2Vfc2NvcGUiO2k6MzQ7czoyNToiZXZhbFwoZmlsZV9nZXRfY29udGVudHNcKCI7aTozNTtzOjE5OiJpc193cml0YWJsZVwoIi92YXIvIjtpOjM2O3M6MTY6IlwkR0xPQkFMU1xbJ19fX18iO2k6Mzc7czo1ODoiaXNfY2FsbGFibGVcKCdleGVjJ1wpIGFuZCAhaW5fYXJyYXlcKCdleGVjJyxcJGRpc2FibGVmdW5jcyI7aTozODtzOjc6ImswZFwuY2MiO2k6Mzk7czoyOToiZ21haWwtc210cC1pblwubFwuZ29vZ2xlXC5jb20iO2k6NDA7czoxMjoibWlsdzBybVwuY29tIjtpOjQxO3M6Nzoid2VicjAwdCI7aTo0MjtzOjExOiJEZXZpbEhhY2tlciI7aTo0MztzOjc6IkRlZmFjZXIiO2k6NDQ7czoxMzoiXFsgUGhwcm94eSBcXSI7aTo0NTtzOjEwOiJcW2NvZGVyelxdIjtpOjQ2O3M6MzQ6IjwhLS1cI2V4ZWMgY21kPSJcJEhUVFBfQUNDRVBUIiAtLT4iO2k6NDc7czoxODoiXF1cW3JvdW5kXCgwXClcXVwoIjtpOjQ4O3M6MTE6IlNpbUF0dGFja2VyIjtpOjQ5O3M6MTU6IkRhcmtDcmV3RnJpZW5kcyI7aTo1MDtzOjc6ImsybGwzM2QiO2k6NTE7czo3OiJLa0sxMzM3IjtpOjUyO3M6MTU6IkhBQ0tFRCBCWSBTVE9STSI7aTo1MztzOjE0OiJNZXhpY2FuSGFja2VycyI7aTo1NDtzOjE2OiJNclwuU2hpbmNoYW5YMTk2IjtpOjU1O3M6OToiRGVpZGFyYX5YIjtpOjU2O3M6MTA6IkppbnBhbnRvbXoiO2k6NTc7czo5OiIxbjczY3QxMG4iO2k6NTg7czoxNDoiS2luZ1NrcnVwZWxsb3MiO2k6NTk7czoxMDoiSmlucGFudG9teiI7aTo2MDtzOjk6IkNlbmdpekhhbiI7aTo2MTtzOjIyOiJyb290Ong6MDowOnJvb3Q6L3Jvb3Q6IjtpOjYyO3M6OToicjN2M25nNG5zIjtpOjYzO3M6OToiQkxBQ0tVTklYIjtpOjY0O3M6ODoiRmlsZXNNYW4iO2k6NjU7czo4OiJhcnRpY2tsZSI7fQ=="));
$g_FlexDBShe unserialize(base64_decode("YToyNjM6e2k6MDtzOjEwMDoiSU86OlNvY2tldDo6SU5FVC0+bmV3XChQcm90b1xzKj0+XHMqInRjcCJccyosXHMqTG9jYWxQb3J0XHMqPT5ccyozNjAwMFxzKixccypMaXN0ZW5ccyo9PlxzKlNPTUFYQ09OTiI7aToxO3M6OTY6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtccypbJyJdezAsMX1wMlsnIl17MCwxfVxzKlxdXHMqPT1ccypbJyJdezAsMX1jaG1vZFsnIl17MCwxfSI7aToyO3M6MjM6IkNhcHRhaW5ccytDcnVuY2hccytUZWFtIjtpOjM7czoxMToiYnlccytHcmluYXkiO2k6NDtzOjE5OiJoYWNrZWRccytieVxzK0htZWk3IjtpOjU7czozMzoic3lzdGVtXHMrZmlsZVxzK2RvXHMrbm90XHMrZGVsZXRlIjtpOjY7czozNToiZGVmYXVsdF9hY3Rpb25ccyo9XHMqXFxbJyJdRmlsZXNNYW4iO2k6NztzOjE3MDoiXCRpbmZvIFwuPSBcKFwoXCRwZXJtc1xzKiZccyoweDAwNDBcKVxzKlw/XChcKFwkcGVybXNccyomXHMqMHgwODAwXClccypcP1xzKlxcWyciXXNcXFsnIl1ccyo6XHMqXFxbJyJdeFxcWyciXVxzKlwpXHMqOlwoXChcJHBlcm1zXHMqJlxzKjB4MDgwMFwpXHMqXD9ccyonUydccyo6XHMqJy0nXHMqXCkiO2k6ODtzOjc4OiJXU09zZXRjb29raWVccypcKFxzKm1kNVxzKlwoXHMqQCpcJF9TRVJWRVJcW1xzKlxcWyciXUhUVFBfSE9TVFxcWyciXVxzKlxdXHMqXCkiO2k6OTtzOjc0OiJXU09zZXRjb29raWVccypcKFxzKm1kNVxzKlwoXHMqQCpcJF9TRVJWRVJcW1xzKlsnIl1IVFRQX0hPU1RbJyJdXHMqXF1ccypcKSI7aToxMDtzOjEwNzoid3NvRXhccypcKFxzKlxcWyciXVxzKnRhclxzKmNmenZccypcXFsnIl1ccypcLlxzKmVzY2FwZXNoZWxsYXJnXHMqXChccypcJF9QT1NUXFtccypcXFsnIl1wMlxcWyciXVxzKlxdXHMqXCkiO2k6MTE7czo0MDoiZXZhbFxzKlwoKlxzKmJhc2U2NF9kZWNvZGVccypcKCpccypAKlwkXyI7aToxMjtzOjc4OiJmaWxlcGF0aFxzKj1ccypAKnJlYWxwYXRoXHMqXChccypcJF9QT1NUXHMqXFtccypcXFsnIl1maWxlcGF0aFxcWyciXVxzKlxdXHMqXCkiO2k6MTM7czo3NDoiZmlsZXBhdGhccyo9XHMqQCpyZWFscGF0aFxzKlwoXHMqXCRfUE9TVFxzKlxbXHMqWyciXWZpbGVwYXRoWyciXVxzKlxdXHMqXCkiO2k6MTQ7czo0NzoicmVuYW1lXHMqXChccypccypbJyJdezAsMX13c29cLnBocFsnIl17MCwxfVxzKiwiO2k6MTU7czo5NzoiXCRNZXNzYWdlU3ViamVjdFxzKj1ccypiYXNlNjRfZGVjb2RlXHMqXChccypcJF9QT1NUXHMqXFtccypbJyJdezAsMX1tc2dzdWJqZWN0WyciXXswLDF9XHMqXF1ccypcKSI7aToxNjtzOjg3OiJTRUxFQ1RccysxXHMrRlJPTVxzK215c3FsXC51c2VyXHMrV0hFUkVccytjb25jYXRcKFxzKmB1c2VyYFxzKixccyonQCdccyosXHMqYGhvc3RgXHMqXCkiO2k6MTc7czo1NjoicGFzc3RocnVccypcKCpccypnZXRlbnZccypcKCpccypbJyJdSFRUUF9BQ0NFUFRfTEFOR1VBR0UiO2k6MTg7czo1ODoicGFzc3RocnVccypcKCpccypnZXRlbnZccypcKCpccypcXFsnIl1IVFRQX0FDQ0VQVF9MQU5HVUFHRSI7aToxOTtzOjU1OiJ7XHMqXCRccyp7XHMqcGFzc3RocnVccypcKCpccypcJGNtZFxzKlwpXHMqfVxzKn1ccyo8YnI+IjtpOjIwO3M6ODI6InJ1bmNvbW1hbmRccypcKFxzKlsnIl1zaGVsbGhlbHBbJyJdXHMqLFxzKlsnIl0oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVsnIl0iO2k6MjE7czozMToibmNmdHBwdXRccyotdVxzKlwkZnRwX3VzZXJfbmFtZSI7aToyMjtzOjM3OiJcJGxvZ2luXHMqPVxzKkAqcG9zaXhfZ2V0dWlkXCgqXHMqXCkqIjtpOjIzO3M6NDk6IiFAKlwkX1JFUVVFU1RccypcW1xzKlsnIl1jOTlzaF9zdXJsWyciXVxzKlxdXHMqXCkiO2k6MjQ7czoxMjQ6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqQCpcJF9QT1NUXHMqXFtccypbJyJdLis/WyciXVxzKlxdXHMqXC5ccyoiXHMqMlxzKj5ccyomMVxzKlsnIl0iO2k6MjU7czo4NjoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilccypcKCpccypbJyJddW5hbWVccystYVsnIl1ccypcKSoiO2k6MjY7czo1Mzoic2V0Y29va2llXCgqXHMqWyciXW15c3FsX3dlYl9hZG1pbl91c2VybmFtZVsnIl1ccypcKSoiO2k6Mjc7czoxNDE6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChbJyJdXCRjbWRccysxPlxzKi90bXAvY21kdGVtcFxzKzI+JjE7XHMqY2F0XHMrL3RtcC9jbWR0ZW1wO1xzKnJtXHMrL3RtcC9jbWR0ZW1wWyciXVwpOyI7aToyODtzOjIzOiJcJGZlXCgiXCRjbWRccysyPiYxIlwpOyI7aToyOTtzOjk2OiJcJGZ1bmN0aW9uXHMqXCgqXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKlxbXHMqWyciXXswLDF9Y21kWyciXXswLDF9XHMqXF1ccypcKSoiO2k6MzA7czo5MzoiXCRjbWRccyo9XHMqXChccypAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbJyJdezAsMX0uKz9bJyJdezAsMX1ccypcXVxzKlwpIjtpOjMxO3M6MjE6ImV2YTFbYS16QS1aMC05X10rP1NpciI7aTozMjtzOjg5OiJAKmFzc2VydFxzKlwoKlxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbJyJdezAsMX0uKz9bJyJdezAsMX1ccypcXVxzKiI7aTozMztzOjI1OiJwaHBccysiXHMqXC5ccypcJHdzb19wYXRoIjtpOjM0O3M6NTA6ImV2YWxccypcKCpccypAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjM1O3M6NTI6ImFzc2VydFxzKlwoKlxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6MzY7czo1MjoiZmluZFxzKy9ccystbmFtZVxzK1wuc3NoXHMrPlxzK1wkZGlyL3NzaGtleXMvc3Noa2V5cyI7aTozNztzOjQ1OiJzeXN0ZW1ccypcKCpccypbJyJdezAsMX13aG9hbWlbJyJdezAsMX1ccypcKSoiO2k6Mzg7czo4ODoiY3VybF9zZXRvcHRccypcKFxzKlwkY2hccyosXHMqQ1VSTE9QVF9VUkxccyosXHMqWyciXXswLDF9aHR0cDovL1wkaG9zdDpcZCtbJyJdezAsMX1ccypcKSI7aTozOTtzOjg4OiJcJGluaVxzKlxbXHMqWyciXXswLDF9dXNlcnNbJyJdezAsMX1ccypcXVxzKj1ccyphcnJheVxzKlwoXHMqWyciXXswLDF9cm9vdFsnIl17MCwxfVxzKj0+IjtpOjQwO3M6MzM6InByb2Nfb3BlblxzKlwoXHMqWyciXXswLDF9SUhTdGVhbSI7aTo0MTtzOjEzNToiWyciXXswLDF9aHR0cGRcLmNvbmZbJyJdezAsMX1ccyosXHMqWyciXXswLDF9dmhvc3RzXC5jb25mWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfWNmZ1wucGhwWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfWNvbmZpZ1wucGhwWyciXXswLDF9IjtpOjQyO3M6ODE6IlxzKntccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKlxbXHMqWyciXXswLDF9cm9vdFsnIl17MCwxfVxzKlxdXHMqfSI7aTo0MztzOjQ2OiJwcmVnX3JlcGxhY2VccypcKCpccypbJyJdezAsMX0vXC5cKi9lWyciXXswLDF9IjtpOjQ0O3M6MzY6ImV2YWxccypcKCpccypmaWxlX2dldF9jb250ZW50c1xzKlwoKiI7aTo0NTtzOjc0OiJAKnNldGNvb2tpZVxzKlwoKlxzKlsnIl17MCwxfWhpdFsnIl17MCwxfSxccyoxXHMqLFxzKnRpbWVccypcKCpccypcKSpccypcKyI7aTo0NjtzOjQxOiJldmFsXHMqXCgqQCpccypzdHJpcHNsYXNoZXNccypcKCpccypAKlwkXyI7aTo0NztzOjU5OiJldmFsXHMqXCgqQCpccypzdHJpcHNsYXNoZXNccypcKCpccyphcnJheV9wb3BccypcKCpccypAKlwkXyI7aTo0ODtzOjQzOiJmb3BlblxzKlwoKlxzKlsnIl17MCwxfS9ldGMvcGFzc3dkWyciXXswLDF9IjtpOjQ5O3M6MjQ6IlwkR0xPQkFMU1xbWyciXXswLDF9X19fXyI7aTo1MDtzOjIxMzoiaXNfY2FsbGFibGVccypcKCpccypbJyJdezAsMX0oZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVsnIl17MCwxfVwpKlxzK2FuZFxzKyFpbl9hcnJheVxzKlwoKlxzKlsnIl17MCwxfShmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pWyciXXswLDF9XHMqLFxzKlwkZGlzYWJsZWZ1bmNzIjtpOjUxO3M6MTEyOiJmaWxlX2dldF9jb250ZW50c1xzKlwoKlxzKnRyaW1ccypcKFxzKlwkLis/XFtcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9Lis/WyciXXswLDF9XF1cXVwpXCk7IjtpOjUyO3M6MTM2OiJ3cF9wb3N0c1xzK1dIRVJFXHMrcG9zdF90eXBlXHMqPVxzKlsnIl17MCwxfXBvc3RbJyJdezAsMX1ccytBTkRccytwb3N0X3N0YXR1c1xzKj1ccypbJyJdezAsMX1wdWJsaXNoWyciXXswLDF9XHMrT1JERVJccytCWVxzK2BJRGBccytERVNDIjtpOjUzO3M6MjA6ImV4ZWNccypcKFxzKlsnIl1pcGZ3IjtpOjU0O3M6NDI6InN0cnJldlwoKlxzKlsnIl17MCwxfXRyZXNzYVsnIl17MCwxfVxzKlwpKiI7aTo1NTtzOjQ5OiJzdHJyZXZcKCpccypbJyJdezAsMX1lZG9jZWRfNDZlc2FiWyciXXswLDF9XHMqXCkqIjtpOjU2O3M6NzA6ImZ1bmN0aW9uXHMrdXJsR2V0Q29udGVudHNccypcKCpccypcJHVybFxzKixccypcJHRpbWVvdXRccyo9XHMqXGQrXHMqXCkiO2k6NTc7czoyNjoic3ltbGlua1xzKlwoKlxzKlsnIl0vaG9tZS8iO2k6NTg7czo3MToiZndyaXRlXHMqXCgqXHMqXCRmcHNldHZccyosXHMqZ2V0ZW52XHMqXChccypbJyJdSFRUUF9DT09LSUVbJyJdXHMqXClccyoiO2k6NTk7czo2NjoiaXNzZXRccypcKCpccypcJF9QT1NUXHMqXFtccypbJyJdezAsMX1leGVjZ2F0ZVsnIl17MCwxfVxzKlxdXHMqXCkqIjtpOjYwO3M6MjAwOiJVTklPTlxzK1NFTEVDVFxzK1snIl17MCwxfTBbJyJdezAsMX1ccyosXHMqWyciXXswLDF9PFw/IHN5c3RlbVwoXFxcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbY3BjXF1cKTtleGl0O1xzKlw/PlsnIl17MCwxfVxzKixccyowXHMqLDBccyosXHMqMFxzKixccyowXHMrSU5UT1xzK09VVEZJTEVccytbJyJdezAsMX1cJFsnIl17MCwxfSI7aTo2MTtzOjE0OToiXCRHTE9CQUxTXFtbJyJdezAsMX0uKz9bJyJdezAsMX1cXT1BcnJheVxzKlwoXHMqYmFzZTY0X2RlY29kZVxzKlwoXHMqWyciXXswLDF9Lis/WyciXXswLDF9XHMqXClccyosXHMqYmFzZTY0X2RlY29kZVxzKlwoXHMqWyciXXswLDF9Lis/WyciXXswLDF9XHMqXCkiO2k6NjI7czo3MzoicHJlZ19yZXBsYWNlXHMqXCgqXHMqWyciXXswLDF9L1wuXCpcWy4rP1xdXD8vZVsnIl17MCwxfVxzKixccypzdHJfcmVwbGFjZSI7aTo2MztzOjEwMToiXCRHTE9CQUxTXFtccypbJyJdezAsMX0uKz9bJyJdezAsMX1ccypcXVxbXHMqXGQrXHMqXF1cKFxzKlwkX1xkK1xzKixccypfXGQrXHMqXChccypcZCtccypcKVxzKlwpXHMqXCkiO2k6NjQ7czoxMTU6IlwkYmVlY29kZVxzKj1AKmZpbGVfZ2V0X2NvbnRlbnRzXHMqXCgqWyciXXswLDF9XHMqXCR1cmxwdXJzXHMqWyciXXswLDF9XCkqXHMqO1xzKmVjaG9ccytbJyJdezAsMX1cJGJlZWNvZGVbJyJdezAsMX0iO2k6NjU7czo3OToiXCR4XGQrXHMqPVxzKlsnIl0uKz9bJyJdXHMqO1xzKlwkeFxkK1xzKj1ccypbJyJdLis/WyciXVxzKjtccypcJHhcZCtccyo9XHMqWyciXSI7aTo2NjtzOjQzOiI8XD9waHBccytcJF9GXHMqPVxzKl9fRklMRV9fXHMqO1xzKlwkX1hccyo9IjtpOjY3O3M6Njg6ImlmXHMrXCgqXHMqbWFpbFxzKlwoXHMqXCRyZWNwXHMqLFxzKlwkc3VialxzKixccypcJHN0dW50XHMqLFxzKlwkZnJtIjtpOjY4O3M6MTM5OiJpZlxzK1woXHMqc3RycG9zXHMqXChccypcJHVybFxzKixccypbJyJdanMvbW9vdG9vbHNcLmpzWyciXVxzKlwpXHMqPT09XHMqZmFsc2VccysmJlxzK3N0cnBvc1xzKlwoXHMqXCR1cmxccyosXHMqWyciXWpzL2NhcHRpb25cLmpzWyciXXswLDF9IjtpOjY5O3M6ODE6ImV2YWxccypcKCpccypzdHJpcHNsYXNoZXNccypcKCpccyphcnJheV9wb3BcKCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aTo3MDtzOjI2MToiaWZccypcKCpccyppc3NldFxzKlwoKlxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbJyJdezAsMX1bYS16QS1aXzAtOV0rWyciXXswLDF9XHMqXF1ccypcKSpccypcKVxzKntccypcJFthLXpBLVpfMC05XStccyo9XHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClccypcW1xzKlsnIl17MCwxfVthLXpBLVpfMC05XStbJyJdezAsMX1ccypcXTtccypldmFsXHMqXCgqXHMqXCRbYS16QS1aXzAtOV0rXHMqXCkqIjtpOjcxO3M6MTIzOiJwcmVnX3JlcGxhY2VccypcKFxzKlsnIl0vXF5cKHd3d1x8ZnRwXClcXFwuL2lbJyJdXHMqLFxzKlsnIl1bJyJdLFxzKkBcJF9TRVJWRVJccypcW1xzKlsnIl17MCwxfUhUVFBfSE9TVFsnIl17MCwxfVxzKlxdXHMqXCkiO2k6NzI7czoxMDE6ImlmXHMqXCghZnVuY3Rpb25fZXhpc3RzXHMqXChccypbJyJdcG9zaXhfZ2V0cHd1aWRbJyJdXHMqXClccyomJlxzKiFpbl9hcnJheVxzKlwoXHMqWyciXXBvc2l4X2dldHB3dWlkIjtpOjczO3M6ODg6Ij1ccypwcmVnX3NwbGl0XHMqXChccypbJyJdL1xcLFwoXFwgXCtcKVw/L1snIl0sXHMqQCppbmlfZ2V0XHMqXChccypbJyJdZGlzYWJsZV9mdW5jdGlvbnMiO2k6NzQ7czo0NzoiXCRiXHMqXC5ccypcJHBccypcLlxzKlwkaFxzKlwuXHMqXCRrXHMqXC5ccypcJHYiO2k6NzU7czoyMzoiXChccypbJyJdSU5TSEVMTFsnIl1ccyoiO2k6NzY7czo1NDoiKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClccypcW1xzKlsnIl1fX19bJyJdXHMqIjtpOjc3O3M6OTQ6ImFycmF5X3BvcFxzKlwoKlxzKlwkd29ya1JlcGxhY2VccyosXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClccyosXHMqXCRjb3VudEtleXNOZXciO2k6Nzg7czozNToiaWZccypcKCpccypAKnByZWdfbWF0Y2hccypcKCpccypzdHIiO2k6Nzk7czo0MzoiQFwkX0NPT0tJRVxbWyciXXswLDF9c3RhdENvdW50ZXJbJyJdezAsMX1cXSI7aTo4MDtzOjEwNToiZm9wZW5ccypcKCpccypbJyJdaHR0cDovL1snIl1ccypcLlxzKlwkY2hlY2tfZG9tYWluXHMqXC5ccypbJyJdOjgwWyciXVxzKlwuXHMqXCRjaGVja19kb2NccyosXHMqWyciXXJbJyJdIjtpOjgxO3M6NTU6IkAqZ3ppbmZsYXRlXHMqXChccypAKmJhc2U2NF9kZWNvZGVccypcKFxzKkAqc3RyX3JlcGxhY2UiO2k6ODI7czoyODoiZmlsZV9wdXRfY29udGVudHpccypcKCpccypcJCI7aTo4MztzOjg3OiImJlxzKmZ1bmN0aW9uX2V4aXN0c1xzKlwoKlxzKlsnIl17MCwxfWdldG14cnJbJyJdezAsMX1cKVxzKlwpXHMqe1xzKkBnZXRteHJyXHMqXCgqXHMqXCQiO2k6ODQ7czo0MToiXCRwb3N0UmVzdWx0XHMqPVxzKmN1cmxfZXhlY1xzKlwoKlxzKlwkY2giO2k6ODU7czoyNToiZnVuY3Rpb25ccytzcWwyX3NhZmVccypcKCI7aTo4NjtzOjg1OiJleGl0XHMqXChccypbJyJdezAsMX08c2NyaXB0PlxzKnNldFRpbWVvdXRccypcKFxzKlxcWyciXXswLDF9ZG9jdW1lbnRcLmxvY2F0aW9uXC5ocmVmIjtpOjg3O3M6Nzg6ImRvY3VtZW50XC53cml0ZVxzKlwoXHMqWyciXXswLDF9PHNjcmlwdFxzK3NyYz1bJyJdezAsMX1odHRwOi8vPFw/PVwkZG9tYWluXD8+LyI7aTo4ODtzOjM4OiJldmFsXChccypzdHJpcHNsYXNoZXNcKFxzKlxcXCRfUkVRVUVTVCI7aTo4OTtzOjM2OiIhdG91Y2hcKFsnIl17MCwxfVwuXC4vXC5cLi9sYW5ndWFnZS8iO2k6OTA7czoxMDoiRGMwUkhhWyciXSI7aTo5MTtzOjYwOiJoZWFkZXJccypcKFsnIl1Mb2NhdGlvbjpccypbJyJdXHMqXC5ccypcJHRvXHMqXC5ccyp1cmxkZWNvZGUiO2k6OTI7czoxNTY6ImlmXHMqXChccypzdHJpcG9zXHMqXChccypcJF9TRVJWRVJcW1snIl17MCwxfUhUVFBfVVNFUl9BR0VOVFsnIl17MCwxfVxdXHMqLFxzKlsnIl17MCwxfUFuZHJvaWRbJyJdezAsMX1cKVxzKiE9PWZhbHNlXHMqJiZccyohXCRfQ09PS0lFXFtbJyJdezAsMX1kbGVfdXNlcl9pZCI7aTo5MztzOjM4OiJlY2hvXHMrQGZpbGVfZ2V0X2NvbnRlbnRzXHMqXChccypcJGdldCI7aTo5NDtzOjQ3OiJkZWZhdWx0X2FjdGlvblxzKj1ccypbJyJdezAsMX1GaWxlc01hblsnIl17MCwxfSI7aTo5NTtzOjMzOiJkZWZpbmVccypcKFxzKlsnIl1ERUZDQUxMQkFDS01BSUwiO2k6OTY7czoxNzoiTXlzdGVyaW91c1xzK1dpcmUiO2k6OTc7czozNDoicHJlZ19yZXBsYWNlXHMqXCgqXHMqWyciXS9cLlwrL2VzaSI7aTo5ODtzOjQ1OiJkZWZpbmVccypcKCpccypbJyJdU0JDSURfUkVRVUVTVF9GSUxFWyciXVxzKiwiO2k6OTk7czo2MDoiXCR0bGRccyo9XHMqYXJyYXlccypcKFxzKlsnIl1jb21bJyJdLFsnIl1vcmdbJyJdLFsnIl1uZXRbJyJdIjtpOjEwMDtzOjE3OiJCcmF6aWxccytIYWNrVGVhbSI7aToxMDE7czo0NzoiZ3ppbmZsYXRlXHMqXChccypzdHJfcm90MTNccypcKFxzKmJhc2U2NF9kZWNvZGUiO2k6MTAyO3M6NDc6Imd6aW5mbGF0ZVxzKlwoXHMqYmFzZTY0X2RlY29kZVxzKlwoXHMqc3RyX3JvdDEzIjtpOjEwMztzOjU0OiJiYXNlNjRfZGVjb2RlXHMqXChccypnenVuY29tcHJlc3NccypcKFxzKmJhc2U2NF9kZWNvZGUiO2k6MTA0O3M6Njg6Imd6aW5mbGF0ZVxzKlwoXHMqYmFzZTY0X2RlY29kZVxzKlwoXHMqYmFzZTY0X2RlY29kZVxzKlwoXHMqc3RyX3JvdDEzIjtpOjEwNTtzOjQ0OiJnemluZmxhdGVccypcKFxzKmJhc2U2NF9kZWNvZGVccypcKFxzKnN0cnJldiI7aToxMDY7czo2MToiZ3ppbmZsYXRlXHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypzdHJyZXZccypcKFxzKnN0cl9yb3QxMyI7aToxMDc7czo2MToiZ3ppbmZsYXRlXHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypzdHJfcm90MTNccypcKFxzKnN0cnJldiI7aToxMDg7czo1MDoiZ3p1bmNvbXByZXNzXHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypzdHJfcm90MTMiO2k6MTA5O3M6NTA6Imd6dW5jb21wcmVzc1xzKlwoXHMqc3RyX3JvdDEzXHMqXChccypiYXNlNjRfZGVjb2RlIjtpOjExMDtzOjQ3OiJzdHJfcm90MTNccypcKFxzKmd6aW5mbGF0ZVxzKlwoXHMqYmFzZTY0X2RlY29kZSI7aToxMTE7czoxNDU6ImlmXCghZW1wdHlcKFwkX0ZJTEVTXFtbJyJdezAsMX1tZXNzYWdlWyciXXswLDF9XF1cW1snIl17MCwxfW5hbWVbJyJdezAsMX1cXVwpXHMrQU5EXHMrXChtZDVcKFwkX1BPU1RcW1snIl17MCwxfW5pY2tbJyJdezAsMX1cXVwpXHMqPT1ccypbJyJdezAsMX0iO2k6MTEyO3M6NzU6InRpbWVcKFwpXHMqXCtccyoxMDAwMFxzKixccypbJyJdL1snIl1cKTtccyplY2hvXHMrXCRtX3p6O1xzKmV2YWxccypcKFwkbV96eiI7aToxMTM7czoxMDY6InJldHVyblxzKlwoXHMqc3Ryc3RyXHMqXChccypcJHNccyosXHMqJ2VjaG8nXHMqXClccyo9PVxzKmZhbHNlXHMqXD9ccypcKFxzKnN0cnN0clxzKlwoXHMqXCRzXHMqLFxzKidwcmludCciO2k6MTE0O3M6Njc6InNldF90aW1lX2xpbWl0XHMqXChccyowXHMqXCk7XHMqaWZccypcKCFTZWNyZXRQYWdlSGFuZGxlcjo6Y2hlY2tLZXkiO2k6MTE1O3M6NzM6IkBoZWFkZXJcKFsnIl1Mb2NhdGlvbjpccypbJyJdXC5bJyJdaFsnIl1cLlsnIl10WyciXVwuWyciXXRbJyJdXC5bJyJdcFsnIl0iO2k6MTE2O3M6OToiSXJTZWNUZWFtIjtpOjExNztzOjk3OiJcJHJCdWZmTGVuXHMqPVxzKm9yZFxzKlwoXHMqVkNfRGVjcnlwdFxzKlwoXHMqZnJlYWRccypcKFxzKlwkaW5wdXQsXHMqMVxzKlwpXHMqXClccypcKVxzKlwqXHMqMjU2IjtpOjExODtzOjc0OiJjbGVhcnN0YXRjYWNoZVwoXHMqXCk7XHMqaWZccypcKFxzKiFpc19kaXJccypcKFxzKlwkZmxkXHMqXClccypcKVxzKnJldHVybiI7aToxMTk7czo5NzoiY29udGVudD1bJyJdezAsMX1uby1jYWNoZVsnIl17MCwxfTtccypcJGNvbmZpZ1xbWyciXXswLDF9ZGVzY3JpcHRpb25bJyJdezAsMX1cXVxzKlwuPVxzKlsnIl17MCwxfSI7aToxMjA7czoxMjoidG1oYXBiemNlcmZmIjtpOjEyMTtzOjcwOiJmaWxlX2dldF9jb250ZW50c1xzKlwoKlxzKkFETUlOX1JFRElSX1VSTFxzKixccypmYWxzZVxzKixccypcJGN0eFxzKlwpIjtpOjEyMjtzOjg3OiJpZlxzKlwoXHMqXCRpXHMqPFxzKlwoXHMqY291bnRccypcKFxzKlwkX1BPU1RcW1xzKlsnIl17MCwxfXFbJyJdezAsMX1ccypcXVxzKlwpXHMqLVxzKjEiO2k6MTIzO3M6MjMyOiJpc3NldFxzKlwoXHMqXCRfRklMRVNcW1xzKlsnIl17MCwxfXhbJyJdezAsMX1ccypcXVxzKlwpXHMqXD9ccypcKFxzKmlzX3VwbG9hZGVkX2ZpbGVccypcKFxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX14WyciXXswLDF9XHMqXF1cW1xzKlsnIl17MCwxfXRtcF9uYW1lWyciXXswLDF9XHMqXF1ccypcKVxzKlw/XHMqXChccypjb3B5XHMqXChccypcJF9GSUxFU1xbXHMqWyciXXswLDF9eFsnIl17MCwxfVxzKlxdIjtpOjEyNDtzOjgyOiJcJFVSTFxzKj1ccypcJHVybHNcW1xzKnJhbmRcKFxzKjBccyosXHMqY291bnRccypcKFxzKlwkdXJsc1xzKlwpXHMqLVxzKjFccypcKVxzKlxdIjtpOjEyNTtzOjIxMzoiQCptb3ZlX3VwbG9hZGVkX2ZpbGVccypcKFxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX1tZXNzYWdlWyciXXswLDF9XHMqXF1cW1xzKlsnIl17MCwxfXRtcF9uYW1lWyciXXswLDF9XHMqXF1ccyosXHMqXCRzZWN1cml0eV9jb2RlXHMqXC5ccyoiLyJccypcLlxzKlwkX0ZJTEVTXFtbJyJdezAsMX1tZXNzYWdlWyciXXswLDF9XF1cW1snIl17MCwxfW5hbWVbJyJdezAsMX1cXVwpIjtpOjEyNjtzOjM5OiJldmFsXHMqXCgqXHMqc3RycmV2XHMqXCgqXHMqc3RyX3JlcGxhY2UiO2k6MTI3O3M6ODE6IlwkcmVzPW15c3FsX3F1ZXJ5XChbJyJdezAsMX1TRUxFQ1RccytcKlxzK0ZST01ccytgd2F0Y2hkb2dfb2xkXzA1YFxzK1dIRVJFXHMrcGFnZSI7aToxMjg7czo3MjoiXF5kb3dubG9hZHMvXChcWzAtOVxdXCpcKS9cKFxbMC05XF1cKlwpL1wkXHMrZG93bmxvYWRzXC5waHBcP2M9XCQxJnA9XCQyIjtpOjEyOTtzOjkyOiJwcmVnX3JlcGxhY2VccypcKFxzKlwkZXhpZlxbXHMqXFxbJyJdTWFrZVxcWyciXVxzKlxdXHMqLFxzKlwkZXhpZlxbXHMqXFxbJyJdTW9kZWxcXFsnIl1ccypcXSI7aToxMzA7czozODoiZmNsb3NlXChcJGZcKTtccyplY2hvXHMqWyciXW9cLmtcLlsnIl0iO2k6MTMxO3M6NDE6ImZ1bmN0aW9uXHMraW5qZWN0XChcJGZpbGUsXHMqXCRpbmplY3Rpb249IjtpOjEzMjtzOjcxOiJleGVjbFwoWyciXS9iaW4vc2hbJyJdXHMqLFxzKlsnIl0vYmluL3NoWyciXVxzKixccypbJyJdLWlbJyJdXHMqLFxzKjBcKSI7aToxMzM7czo0MzoiZmluZFxzKy9ccystdHlwZVxzK2ZccystcGVybVxzKy0wNDAwMFxzKy1scyI7aToxMzQ7czo0NDoiaWZccypcKFxzKmZ1bmN0aW9uX2V4aXN0c1xzKlwoXHMqJ3BjbnRsX2ZvcmsiO2k6MTM1O3M6NjU6InVybGVuY29kZVwocHJpbnRfclwoYXJyYXlcKFwpLDFcKVwpLDUsMVwpXC5jXCksXCRjXCk7fWV2YWxcKFwkZFwpIjtpOjEzNjtzOjg5OiJhcnJheV9rZXlfZXhpc3RzXHMqXChccypcJGZpbGVSYXNccyosXHMqXCRmaWxlVHlwZVwpXHMqXD9ccypcJGZpbGVUeXBlXFtccypcJGZpbGVSYXNccypcXSI7aToxMzc7czo5OToiaWZccypcKFxzKmZ3cml0ZVxzKlwoXHMqXCRoYW5kbGVccyosXHMqZmlsZV9nZXRfY29udGVudHNccypcKFxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjEzODtzOjE3ODoiaWZccypcKFxzKlwkX1BPU1RcW1xzKlsnIl17MCwxfXBhdGhbJyJdezAsMX1ccypcXVxzKj09XHMqWyciXXswLDF9WyciXXswLDF9XHMqXClccyp7XHMqXCR1cGxvYWRmaWxlXHMqPVxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX1maWxlWyciXXswLDF9XHMqXF1cW1xzKlsnIl17MCwxfW5hbWVbJyJdezAsMX1ccypcXSI7aToxMzk7czo4MzoiaWZccypcKFxzKlwkZGF0YVNpemVccyo8XHMqQk9UQ1JZUFRfTUFYX1NJWkVccypcKVxzKnJjNFxzKlwoXHMqXCRkYXRhLFxzKlwkY3J5cHRrZXkiO2k6MTQwO3M6OTA6IixccyphcnJheVxzKlwoJ1wuJywnXC5cLicsJ1RodW1ic1wuZGInXClccypcKVxzKlwpXHMqe1xzKmNvbnRpbnVlO1xzKn1ccyppZlxzKlwoXHMqaXNfZmlsZSI7aToxNDE7czo2NToiXCRmbFxzKj1ccyoiPG1ldGEgaHR0cC1lcXVpdj1cXCJSZWZyZXNoXFwiXHMrY29udGVudD1cXCIwO1xzKlVSTD0iO2k6MTQyO3M6NTE6IlwpXHMqXC5ccypzdWJzdHJccypcKFxzKm1kNVxzKlwoXHMqc3RycmV2XHMqXChccypcJCI7aToxNDM7czoyODoiYXNzZXJ0XHMqXChccypAKnN0cmlwc2xhc2hlcyI7aToxNDQ7czoxNToiWyciXWUvXCpcLi9bJyJdIjtpOjE0NTtzOjUyOiJlY2hvWyciXXswLDF9PGNlbnRlcj48Yj5Eb25lXHMqPT0+XHMqXCR1c2VyZmlsZV9uYW1lIjtpOjE0NjtzOjEzNDoiaWZccypcKFwka2V5XHMqIT1ccypbJyJdezAsMX1tYWlsX3RvWyciXXswLDF9XHMqJiZccypcJGtleVxzKiE9XHMqWyciXXswLDF9c210cF9zZXJ2ZXJbJyJdezAsMX1ccyomJlxzKlwka2V5XHMqIT1ccypbJyJdezAsMX1zbXRwX3BvcnQiO2k6MTQ3O3M6NTk6InN0cnBvc1woXCR1YSxccypbJyJdezAsMX15YW5kZXhib3RbJyJdezAsMX1cKVxzKiE9PVxzKmZhbHNlIjtpOjE0ODtzOjQ1OiJpZlwoQ2hlY2tJUE9wZXJhdG9yXChcKVxzKiYmXHMqIWlzTW9kZW1cKFwpXCkiO2k6MTQ5O3M6MzQ6InVybD08XD9waHBccyplY2hvXHMqXCRyYW5kX3VybDtcPz4iO2k6MTUwO3M6Mjc6ImVjaG9ccypbJyJdYW5zd2VyPWVycm9yWyciXSI7aToxNTE7czozMjoiXCRwb3N0XHMqPVxzKlsnIl1cXHg3N1xceDY3XFx4NjUiO2k6MTUyO3M6NDY6ImlmXHMqXChkZXRlY3RfbW9iaWxlX2RldmljZVwoXClcKVxzKntccypoZWFkZXIiO2k6MTUzO3M6OToiSXJJc1RcLklyIjtpOjE1NDtzOjg5OiJcJGxldHRlclxzKj1ccypzdHJfcmVwbGFjZVxzKlwoXHMqXCRBUlJBWVxbMFxdXFtcJGpcXVxzKixccypcJGFyclxbXCRpbmRcXVxzKixccypcJGxldHRlciI7aToxNTU7czo5MjoiY3JlYXRlX2Z1bmN0aW9uXHMqXChccypbJyJdXCRtWyciXVxzKixccypbJyJdaWZccypcKFxzKlwkbVxzKlxbXHMqMHgwMVxzKlxdXHMqPT1ccypbJyJdTFsnIl0iO2k6MTU2O3M6NzI6IlwkcFxzKj1ccypzdHJwb3NcKFwkdHhccyosXHMqWyciXXswLDF9e1wjWyciXXswLDF9XHMqLFxzKlwkcDJccypcK1xzKjJcKSI7aToxNTc7czoxMTI6IlwkdXNlcl9hZ2VudFxzKj1ccypwcmVnX3JlcGxhY2VccypcKFxzKlsnIl1cfFVzZXJcXFwuQWdlbnRcXDpcW1xccyBcXVw/XHxpWyciXVxzKixccypbJyJdWyciXVxzKixccypcJHVzZXJfYWdlbnQiO2k6MTU4O3M6MzE6InByaW50XCgiXCNccytpbmZvXHMrT0tcXG5cXG4iXCkiO2k6MTU5O3M6NTE6IlxdXHMqfVxzKj1ccyp0cmltXHMqXChccyphcnJheV9wb3BccypcKFxzKlwke1xzKlwkeyI7aToxNjA7czo2NDoiXF09WyciXXswLDF9aXBbJyJdezAsMX1ccyo7XHMqaWZccypcKFxzKmlzc2V0XHMqXChccypcJF9TRVJWRVJcWyI7aToxNjE7czozNDoicHJpbnRccypcJHNvY2sgIlBSSVZNU0cgIlwuXCRvd25lciI7aToxNjI7czo2MzoiaWZcKC9cXlxcOlwkb3duZXIhXC5cKlxcQFwuXCpQUklWTVNHXC5cKjpcLm1zZ2Zsb29kXChcLlwqXCkvXCl7IjtpOjE2MztzOjI2OiJcWy1cXVxzK0Nvbm5lY3Rpb25ccytmYWlsZCI7aToxNjQ7czo1NDoiPCEtLVwjZXhlY1xzK2NtZD1bJyJdezAsMX1cJEhUVFBfQUNDRVBUWyciXXswLDF9XHMqLS0+IjtpOjE2NTtzOjE2NzoiWyciXXswLDF9RnJvbTpccypbJyJdezAsMX1cLlwkX1BPU1RcW1snIl17MCwxfXJlYWxuYW1lWyciXXswLDF9XF1cLlsnIl17MCwxfSBbJyJdezAsMX1cLlsnIl17MCwxfSA8WyciXXswLDF9XC5cJF9QT1NUXFtbJyJdezAsMX1mcm9tWyciXXswLDF9XF1cLlsnIl17MCwxfT5cXG5bJyJdezAsMX0iO2k6MTY2O3M6OTk6ImlmXHMqXChccyppc19kaXJccypcKFxzKlwkRnVsbFBhdGhccypcKVxzKlwpXHMqQWxsRGlyXHMqXChccypcJEZ1bGxQYXRoXHMqLFxzKlwkRmlsZXNccypcKTtccyp9XHMqfSI7aToxNjc7czo3ODoiXCRwXHMqPVxzKnN0cnBvc1xzKlwoXHMqXCR0eFxzKixccypbJyJdezAsMX17XCNbJyJdezAsMX1ccyosXHMqXCRwMlxzKlwrXHMqMlwpIjtpOjE2ODtzOjEyMzoicHJlZ19tYXRjaF9hbGxcKFsnIl17MCwxfS88YSBocmVmPSJcXC91cmxcXFw/cT1cKFwuXCtcP1wpXFsmXHwiXF1cKy9pc1snIl17MCwxfSwgXCRwYWdlXFtbJyJdezAsMX1leGVbJyJdezAsMX1cXSwgXCRsaW5rc1wpIjtpOjE2OTtzOjgwOiJcJHVybFxzKj1ccypcJHVybFxzKlwuXHMqWyciXXswLDF9XD9bJyJdezAsMX1ccypcLlxzKmh0dHBfYnVpbGRfcXVlcnlcKFwkcXVlcnlcKSI7aToxNzA7czo4MzoicHJpbnRccytcJHNvY2tccytbJyJdezAsMX1OSUNLIFsnIl17MCwxfVxzK1wuXHMrXCRuaWNrXHMrXC5ccytbJyJdezAsMX1cXG5bJyJdezAsMX0iO2k6MTcxO3M6MzI6IlBSSVZNU0dcLlwqOlwub3duZXJcXHNcK1woXC5cKlwpIjtpOjE3MjtzOjE1OiIvdXNyL3NiaW4vaHR0cGQiO2k6MTczO3M6NzU6IlwkcmVzdWx0RlVMXHMqPVxzKnN0cmlwY3NsYXNoZXNccypcKFxzKlwkX1BPU1RcW1snIl17MCwxfXJlc3VsdEZVTFsnIl17MCwxfSI7aToxNzQ7czoxNTI6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtbJyJdezAsMX1bYS16QS1aMC05X10rP1snIl17MCwxfVxdXChccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9W2EtekEtWjAtOV9dKz9bJyJdezAsMX1cXVxzKlwpIjtpOjE3NTtzOjYwOiJpZlxzKlwoXHMqQCptZDVccypcKFxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6MTc2O3M6OTQ6ImVjaG9ccytmaWxlX2dldF9jb250ZW50c1xzKlwoXHMqYmFzZTY0X3VybF9kZWNvZGVccypcKFxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6MTc3O3M6ODQ6ImZ3cml0ZVxzKlwoXHMqXCRmaFxzKixccypzdHJpcHNsYXNoZXNccypcKFxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aToxNzg7czo4MzoiaWZccypcKFxzKm1haWxccypcKFxzKlwkbWFpbHNcW1wkaVxdXHMqLFxzKlwkdGVtYVxzKixccypiYXNlNjRfZW5jb2RlXHMqXChccypcJHRleHQiO2k6MTc5O3M6NjI6IlwkZ3ppcFxzKj1ccypAKmd6aW5mbGF0ZVxzKlwoXHMqQCpzdWJzdHJccypcKFxzKlwkZ3plbmNvZGVfYXJnIjtpOjE4MDtzOjczOiJtb3ZlX3VwbG9hZGVkX2ZpbGVcKFwkX0ZJTEVTXFtbJyJdezAsMX1lbGlmWyciXXswLDF9XF1cW1snIl17MCwxfXRtcF9uYW1lIjtpOjE4MTtzOjgwOiJoZWFkZXJcKFsnIl17MCwxfXM6XHMqWyciXXswLDF9XHMqXC5ccypwaHBfdW5hbWVccypcKFxzKlsnIl17MCwxfW5bJyJdezAsMX1ccypcKSI7aToxODI7czoxMjoiQnlccytXZWJSb29UIjtpOjE4MztzOjU3OiJcJE9PTzBPME8wMD1fX0ZJTEVfXztccypcJE9PMDBPMDAwMFxzKj1ccyoweDFiNTQwO1xzKmV2YWwiO2k6MTg0O3M6NTI6IlwkbWFpbGVyXHMqPVxzKlwkX1BPU1RcW1snIl17MCwxfXhfbWFpbGVyWyciXXswLDF9XF0iO2k6MTg1O3M6Nzc6InByZWdfbWF0Y2hcKFsnIl0vXCh5YW5kZXhcfGdvb2dsZVx8Ym90XCkvaVsnIl0sXHMqZ2V0ZW52XChbJyJdSFRUUF9VU0VSX0FHRU5UIjtpOjE4NjtzOjQ3OiJlY2hvXHMrXCRpZnVwbG9hZD1bJyJdezAsMX1ccypJdHNPa1xzKlsnIl17MCwxfSI7aToxODc7czo0MjoiZnNvY2tvcGVuXHMqXChccypcJENvbm5lY3RBZGRyZXNzXHMqLFxzKjI1IjtpOjE4ODtzOjY0OiJcJF9TRVNTSU9OXFtbJyJdezAsMX1zZXNzaW9uX3BpblsnIl17MCwxfVxdXHMqPVxzKlsnIl17MCwxfVwkUElOIjtpOjE4OTtzOjYzOiJcJHVybFsnIl17MCwxfVxzKlwuXHMqXCRzZXNzaW9uX2lkXHMqXC5ccypbJyJdezAsMX0vbG9naW5cLmh0bWwiO2k6MTkwO3M6NDE6ImNvbnRlbnQ9WyciXXswLDF9MTtVUkw9Y2dpLWJpblwuaHRtbFw/Y21kIjtpOjE5MTtzOjQ0OiJmXHMqPVxzKlwkcVxzKlwuXHMqXCRhXHMqXC5ccypcJGJccypcLlxzKlwkeCI7aToxOTI7czo1NToiaWZccypcKG1kNVwodHJpbVwoXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aToxOTM7czozMzoiZGllXHMqXChccypQSFBfT1NccypcLlxzKmNoclxzKlwoIjtpOjE5NDtzOjE3OToiY3JlYXRlX2Z1bmN0aW9uXHMqXChbJyJdWyciXVxzKixccyooZXZhbHxiYXNlNjRfZGVjb2RlfHN1YnN0cnxzdHJyZXZ8cHJlZ19yZXBsYWNlfHByZWdfcmVwbGFjZV9jYWxsYmFja3xzdHJzdHJ8Z3ppbmZsYXRlfGd6dW5jb21wcmVzc3xhc3NlcnR8c3RyX3JvdDEzfG1kNXxhcnJheV93YWxrfGFycmF5X2ZpbHRlcikiO2k6MTk1O3M6ODA6IlwkaGVhZGVyc1xzKj1ccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9aGVhZGVyc1snIl17MCwxfVxdIjtpOjE5NjtzOjg2OiJmaWxlX3B1dF9jb250ZW50c1xzKlwoWyciXXswLDF9MVwudHh0WyciXXswLDF9XHMqLFxzKnByaW50X3JccypcKFxzKlwkX1BPU1RccyosXHMqdHJ1ZSI7aToxOTc7czozNToiZndyaXRlXHMqXChccypcJGZsd1xzKixccypcJGZsXHMqXCkiO2k6MTk4O3M6Mzg6Ilwkc3lzX3BhcmFtc1xzKj1ccypAKmZpbGVfZ2V0X2NvbnRlbnRzIjtpOjE5OTtzOjUxOiJcJGFsbGVtYWlsc1xzKj1ccypAc3BsaXRcKCJcXG4iXHMqLFxzKlwkZW1haWxsaXN0XCkiO2k6MjAwO3M6NTA6ImZpbGVfcHV0X2NvbnRlbnRzXChTVkNfU0VMRlxzKlwuXHMqWyciXS9cLmh0YWNjZXNzIjtpOjIwMTtzOjU3OiJjcmVhdGVfZnVuY3Rpb25cKFsnIl1bJyJdLFxzKlwkb3B0XFsxXF1ccypcLlxzKlwkb3B0XFs0XF0iO2k6MjAyO3M6OTU6IjxzY3JpcHRccyt0eXBlPVsnIl17MCwxfXRleHQvamF2YXNjcmlwdFsnIl17MCwxfVxzK3NyYz1bJyJdezAsMX1qcXVlcnktdVwuanNbJyJdezAsMX0+PC9zY3JpcHQ+IjtpOjIwMztzOjI4OiJVUkw9PFw/ZWNob1xzK1wkaW5kZXg7XHMrXD8+IjtpOjIwNDtzOjIzOiJcI1xzKnNlY3VyaXR5c3BhY2VcLmNvbSI7aToyMDU7czoxODoiXCNccypzdGVhbHRoXHMqYm90IjtpOjIwNjtzOjIxOiJBcHBsZVxzK1NwQW1ccytSZVp1bFQiO2k6MjA3O3M6NTI6ImlzX3dyaXRhYmxlXChcJGRpclwuWyciXXdwLWluY2x1ZGVzL3ZlcnNpb25cLnBocFsnIl0iO2k6MjA4O3M6NDI6ImlmXChlbXB0eVwoXCRfQ09PS0lFXFtbJyJdeFsnIl1cXVwpXCl7ZWNobyI7aToyMDk7czoyOToiXClcXTt9aWZcKGlzc2V0XChcJF9TRVJWRVJcW18iO2k6MjEwO3M6NjY6ImlmXChAXCR2YXJzXChnZXRfbWFnaWNfcXVvdGVzX2dwY1woXClccypcP1xzKnN0cmlwc2xhc2hlc1woXCR1cmlcKSI7aToyMTE7czoyNDoiYmFzZVsnIl17MCwxfVwuXCgzMlwqMlwpIjtpOjIxMjtzOjc1OiJcJHBhcmFtXHMqPVxzKlwkcGFyYW1ccyp4XHMqXCRuXC5zdWJzdHJccypcKFwkcGFyYW1ccyosXHMqbGVuZ3RoXChcJHBhcmFtXCkiO2k6MjEzO3M6NTM6InJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uXChccypbJyJdezAsMX1yZWFkX2Fuc19jb2RlIjtpOjIxNDtzOjM1OiJiYXNlNjRfZGVjb2RlXChcJF9QT1NUXFtbJyJdezAsMX1fLSI7aToyMTU7czo1NDoiaWZcKGlzc2V0XChcJF9QT1NUXFtbJyJdezAsMX1tc2dzdWJqZWN0WyciXXswLDF9XF1cKVwpIjtpOjIxNjtzOjEzMzoibWFpbFwoXCRhcnJcW1snIl17MCwxfXRvWyciXXswLDF9XF0sXCRhcnJcW1snIl17MCwxfXN1YmpbJyJdezAsMX1cXSxcJGFyclxbWyciXXswLDF9bXNnWyciXXswLDF9XF0sXCRhcnJcW1snIl17MCwxfWhlYWRbJyJdezAsMX1cXVwpOyI7aToyMTc7czozODoiZmlsZV9nZXRfY29udGVudHNcKHRyaW1cKFwkZlxbXCRfR0VUXFsiO2k6MjE4O3M6NjA6ImluaV9nZXRcKFsnIl17MCwxfWZpbHRlclwuZGVmYXVsdF9mbGFnc1snIl17MCwxfVwpXCl7Zm9yZWFjaCI7aToyMTk7czo1MDoiY2h1bmtfc3BsaXRcKGJhc2U2NF9lbmNvZGVcKGZyZWFkXChcJHtcJHtbJyJdezAsMX0iO2k6MjIwO3M6NTI6Ilwkc3RyPVsnIl17MCwxfTxoMT40MDNccytGb3JiaWRkZW48L2gxPjwhLS1ccyp0b2tlbjoiO2k6MjIxO3M6MzM6IjxcP3BocFxzK3JlbmFtZVwoWyciXXdzb1wucGhwWyciXSI7aToyMjI7czo2NjoiXCRbYS16QS1aMC05X10rPy9cKi57MSwxMH1cKi9ccypcLlxzKlwkW2EtekEtWjAtOV9dKz8vXCouezEsMTB9XCovIjtpOjIyMztzOjUxOiJAKm1haWxcKFwkbW9zQ29uZmlnX21haWxmcm9tLCBcJG1vc0NvbmZpZ19saXZlX3NpdGUiO2k6MjI0O3M6ODA6IldCU19ESVJccypcLlxzKlsnIl17MCwxfXRlbXAvWyciXXswLDF9XHMqXC5ccypcJGFjdGl2ZUZpbGVccypcLlxzKlsnIl17MCwxfVwudG1wIjtpOjIyNTtzOjk1OiJcJHQ9XCRzO1xzKlwkb1xzKj1ccypbJyJdWyciXTtccypmb3JcKFwkaT0wO1wkaTxzdHJsZW5cKFwkdFwpO1wkaVwrXCtcKXtccypcJG9ccypcLj1ccypcJHR7XCRpfSI7aToyMjY7czo0NzoibW1jcnlwdFwoXCRkYXRhLCBcJGtleSwgXCRpdiwgXCRkZWNyeXB0ID0gRkFMU0UiO2k6MjI3O3M6MTU6InRuZWdhX3Jlc3VfcHR0aCI7aToyMjg7czo5OiJ0c29oX3B0dGgiO2k6MjI5O3M6MTI6IlJFUkVGRVJfUFRUSCI7aToyMzA7czo2NToiY2hyMj1cKFwoZW5jMiYxNVwpPDw0XClcfFwoZW5jMz4+MlwpO2NocjM9XChcKGVuYzMmM1wpPDw2XClcfGVuYzQiO2k6MjMxO3M6MzE6IndlYmlcLnJ1L3dlYmlfZmlsZXMvcGhwX2xpYm1haWwiO2k6MjMyO3M6NDA6InN1YnN0cl9jb3VudFwoZ2V0ZW52XChcXFsnIl1IVFRQX1JFRkVSRVIiO2k6MjMzO3M6Mzc6ImZ1bmN0aW9uIHJlbG9hZFwoXCl7aGVhZGVyXCgiTG9jYXRpb24iO2k6MjM0O3M6MjU6ImltZyBzcmM9WyciXW9wZXJhMDAwXC5wbmciO2k6MjM1O3M6NDY6ImVjaG9ccyptZDVcKFwkX1BPU1RcW1snIl17MCwxfWNoZWNrWyciXXswLDF9XF0iO2k6MjM2O3M6MzM6ImVWYUxcKFxzKnRyaW1cKFxzKmJhU2U2NF9kZUNvRGVcKCI7aToyMzc7czo0MjoiZnNvY2tvcGVuXChcJG1cWzBcXSxcJG1cWzEwXF0sXCRfLFwkX18sXCRtIjtpOjIzODtzOjEzOiIiPT5cJHtcJHsiXFx4IjtpOjIzOTtzOjM4OiJwcmVnX3JlcGxhY2VcKFsnIl0uVVRGXFwtODpcKC5cKlwpLlVzZSI7aToyNDA7czozMDoiOjpbJyJdXC5waHB2ZXJzaW9uXChcKVwuWyciXTo6IjtpOjI0MTtzOjQwOiJAc3RyZWFtX3NvY2tldF9jbGllbnRcKFsnIl17MCwxfXRjcDovL1wkIjtpOjI0MjtzOjE4OiI9PTBcKXtqc29uUXVpdFwoXCQiO2k6MjQzO3M6NDY6ImxvY1xzKj1ccypbJyJdezAsMX08XD9lY2hvXHMrXCRyZWRpcmVjdDtccypcPz4iO2k6MjQ0O3M6Mjg6ImFycmF5XChcJGVuLFwkZXMsXCRlZixcJGVsXCkiO2k6MjQ1O3M6Mzc6IlsnIl17MCwxfS5jLlsnIl17MCwxfVwuc3Vic3RyXChcJHZiZywiO2k6MjQ2O3M6MTg6ImZ1Y2tccyt5b3VyXHMrbWFtYSI7aToyNDc7czozNDoiXCRhZGRkYXRlPWRhdGVcKCJEIE0gZCwgWSBnOmkgYSJcKSI7aToyNDg7czozNjoiXCRkYXRhbWFzaWk9ZGF0ZVwoIkQgTSBkLCBZIGc6aSBhIlwpIjtpOjI0OTtzOjc4OiJjYWxsX3VzZXJfZnVuY1woXHMqWyciXWFjdGlvblsnIl1ccypcLlxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6MjUwO3M6NTk6InN0cl9yZXBsYWNlXChcJGZpbmRccyosXHMqXCRmaW5kXHMqXC5ccypcJGh0bWxccyosXHMqXCR0ZXh0IjtpOjI1MTtzOjMzOiJmaWxlX2V4aXN0c1xzKlwoKlxzKlsnIl0vdmFyL3RtcC8iO2k6MjUyO3M6NDE6IiYmXHMqIWVtcHR5XChccypcJF9DT09LSUVcW1snIl1maWxsWyciXVxdIjtpOjI1MztzOjIxOiJmdW5jdGlvblxzK2luRGlhcGFzb24iO2k6MjU0O3M6MzU6Im1ha2VfZGlyX2FuZF9maWxlXChccypcJHBhdGhfam9vbWxhIjtpOjI1NTtzOjQxOiJsaXN0aW5nX3BhZ2VcKFxzKm5vdGljZVwoXHMqWyciXXN5bWxpbmtlZCI7aToyNTY7czo2MjoibGlzdFxzKlwoXHMqXCRob3N0XHMqLFxzKlwkcG9ydFxzKixccypcJHNpemVccyosXHMqXCRleGVjX3RpbWUiO2k6MjU3O3M6NTI6ImZpbGVtdGltZVwoXCRiYXNlcGF0aFxzKlwuXHMqWyciXS9jb25maWd1cmF0aW9uXC5waHAiO2k6MjU4O3M6NTg6ImZ1bmN0aW9uXHMrcmVhZF9waWNcKFxzKlwkQVxzKlwpXHMqe1xzKlwkYVxzKj1ccypcJF9TRVJWRVIiO2k6MjU5O3M6NjQ6ImNoclwoXHMqXCR0YWJsZVxbXHMqXCRzdHJpbmdcW1xzKlwkaVxzKlxdXHMqXCpccypwb3dcKDY0XHMqLFxzKjEiO2k6MjYwO3M6NDA6IlxdXHMqXCl7ZXZhbFwoXHMqXCRbYS16QS1aMC05X10rP1xbXHMqXCQiO2k6MjYxO3M6NTQ6IkxvY2F0aW9uOjppc0ZpbGVXcml0YWJsZVwoXHMqRW5jb2RlRXhwbG9yZXI6OmdldENvbmZpZyI7aToyNjI7czo3OToiUmV3cml0ZVJ1bGVccytcXlwoXC5cKlwpLFwoXC5cKlwpXCRccytcJDJcLnBocFw/cmV3cml0ZV9wYXJhbXM9XCQxJnBhZ2VfdXJsPVwkMiI7fQ=="));
$gX_FlexDBShe unserialize(base64_decode("YToyNzM6e2k6MDtzOjk6IkJ5XHMrQW0hciI7aToxO3M6MTk6IkNvbnRlbnQtVHlwZTpccypcJF8iO2k6MjtzOjE5OiJyb3VuZFxzKlwoXHMqMFxzKlwrIjtpOjM7czo0MDoiZXZhbFxzKlwoKlxzKmd6aW5mbGF0ZVxzKlwoKlxzKnN0cl9yb3QxMyI7aTo0O3M6MTE0OiJpZlxzKlwoXHMqZnVuY3Rpb25fZXhpc3RzXHMqXChccypbJyJdezAsMX0oZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVsnIl17MCwxfVxzKlwpXHMqXCkiO2k6NTtzOjEwNzoiaWZccypcKFxzKmlzX2NhbGxhYmxlXHMqXCgqXHMqWyciXXswLDF9KGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilbJyJdezAsMX1ccypcKSoiO2k6NjtzOjEwNDoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilccypcKCpccypAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFsiO2k6NztzOjI5OiJldmFsXHMqXCgqXHMqZ2V0X29wdGlvblxzKlwoKiI7aTo4O3M6OTU6ImFkZF9maWx0ZXJccypcKCpccypbJyJdezAsMX10aGVfY29udGVudFsnIl17MCwxfVxzKixccypbJyJdezAsMX1fYmxvZ2luZm9bJyJdezAsMX1ccyosXHMqLis/XCkqIjtpOjk7czozMjoiaXNfd3JpdGFibGVccypcKCpccypbJyJdL3Zhci90bXAiO2k6MTA7czo1NzoiT3B0aW9uc1xzK0ZvbGxvd1N5bUxpbmtzXHMrTXVsdGlWaWV3c1xzK0luZGV4ZXNccytFeGVjQ0dJIjtpOjExO3M6OTU6Imlzc2V0XChccypAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtbJyJdW2EtekEtWjAtOV9dKz9bJyJdXF1cKVxzKm9yXHMqZGllXCgqLis/XCkqIjtpOjEyO3M6MTQ1OiJcJFthLXpBLVowLTlfXSs/XHMqXChccypcZCtccypcXlxzKlxkK1xzKlwpXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XHMqXChccypcZCtccypcXlxzKlxkK1xzKlwpXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XHMqXChccypcZCtccypcXlxzKlxkK1xzKlwpIjtpOjEzO3M6NDk6Imd6dW5jb21wcmVzc1xzKlwoKlxzKnN1YnN0clxzKlwoKlxzKmJhc2U2NF9kZWNvZGUiO2k6MTQ7czo5OiJcJF9fX1xzKj0iO2k6MTU7czozMToiPVxzKmFycmF5X21hcFxzKlwoKlxzKnN0cnJldlxzKiI7aToxNjtzOjQwOiJpZlxzKlwoXHMqcHJlZ19tYXRjaFxzKlwoXHMqWyciXVwjeWFuZGV4IjtpOjE3O3M6MzI6InN0cl9pcmVwbGFjZVxzKlwoKlxzKlsnIl08L2hlYWQ+IjtpOjE4O3M6MjU6ImV2YWxccypcKFxzKmJhc2U2NF9kZWNvZGUiO2k6MTk7czozMDoiZ3ppbmZsYXRlXHMqXChccypiYXNlNjRfZGVjb2RlIjtpOjIwO3M6MzM6Imd6dW5jb21wcmVzc1xzKlwoXHMqYmFzZTY0X2RlY29kZSI7aToyMTtzOjcwOiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVxzKlwoKlxzKlsnIl13Z2V0IjtpOjIyO3M6NzI6IkBzZXRjb29raWVcKFsnIl1tWyciXSxccypbJyJdW2EtekEtWjAtOV9dKz9bJyJdLFxzKnRpbWVcKFwpXHMqXCtccyo4NjQwMCI7aToyMztzOjI4OiJlY2hvXHMrWyciXW9cLmtcLlsnIl07XHMqXD8+IjtpOjI0O3M6MzM6InN5bWJpYW5cfG1pZHBcfHdhcFx8cGhvbmVcfHBvY2tldCI7aToyNTtzOjQ4OiJmdW5jdGlvblxzKmNobW9kX1JccypcKFxzKlwkcGF0aFxzKixccypcJHBlcm1ccyoiO2k6MjY7czozODoiZXZhbFxzKlwoXHMqZ3ppbmZsYXRlXHMqXChccypzdHJfcm90MTMiO2k6Mjc7czoyMToiZXZhbFxzKlwoXHMqc3RyX3JvdDEzIjtpOjI4O3M6Mjg6Imdvb2dsZVx8eWFuZGV4XHxib3RcfHJhbWJsZXIiO2k6Mjk7czozMDoicHJlZ19yZXBsYWNlXHMqXChccypbJyJdL1wuXCovIjtpOjMwO3M6NTg6IlwkbWFpbGVyXHMqPVxzKlwkX1BPU1RcW1xzKlsnIl17MCwxfXhfbWFpbGVyWyciXXswLDF9XHMqXF0iO2k6MzE7czo1NzoicHJlZ19yZXBsYWNlXHMqXChccypAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjMyO3M6OToia2lsbFxzKy05IjtpOjMzO3M6NjA6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtbJyJdezAsMX1jdnZbJyJdezAsMX1cXSI7aTozNDtzOjM1OiJlY2hvXHMrWyciXXswLDF9aW5zdGFsbF9va1snIl17MCwxfSI7aTozNTtzOjE2OiJTcGFtXHMrY29tcGxldGVkIjtpOjM2O3M6MjE6Ij09WyciXVwpXCk7cmV0dXJuO1w/PiI7aTozNztzOjEyOiJhbmRleFx8b29nbGUiO2k6Mzg7czo0NDoiYXJyYXlcKFxzKlsnIl1Hb29nbGVbJyJdXHMqLFxzKlsnIl1TbHVycFsnIl0iO2k6Mzk7czoyMzoiL3Zhci9xbWFpbC9iaW4vc2VuZG1haWwiO2k6NDA7czozMjoiPGgxPjQwMyBGb3JiaWRkZW48L2gxPjwhLS0gdG9rZW4iO2k6NDE7czoyMDoiL2VbJyJdXHMqLFxzKlsnIl1cXHgiO2k6NDI7czozNToicGhwX1snIl1cLlwkZXh0XC5bJyJdXC5kbGxbJyJdezAsMX0iO2k6NDM7czoxNzoibXgyXC5ob3RtYWlsXC5jb20iO2k6NDQ7czo0MDoiKFteXD9cc10pXCh7MCwxfVwuW1wrXCpdXCl7MCwxfVwyW2Etel0qZSI7aTo0NTtzOjM2OiJwcmVnX3JlcGxhY2VcKFxzKlsnIl1lWyciXSxbJyJdezAsMX0iO2k6NDY7czo1MzoiZm9wZW5cKFsnIl17MCwxfVwuXC4vXC5cLi9cLlwuL1snIl17MCwxfVwuXCRmaWxlcGF0aHMiO2k6NDc7czo1MToiXCRkYXRhXHMqPVxzKmFycmF5XChbJyJdezAsMX10ZXJtaW5hbFsnIl17MCwxfVxzKj0+IjtpOjQ4O3M6Mjk6IlwkYlxzKj1ccyptZDVfZmlsZVwoXCRmaWxlYlwpIjtpOjQ5O3M6MzM6InBvcnRsZXRzL2ZyYW1ld29yay9zZWN1cml0eS9sb2dpbiI7aTo1MDtzOjMxOiJcJGZpbGViXHMqPVxzKmZpbGVfZ2V0X2NvbnRlbnRzIjtpOjUxO3M6MTA0OiJzaXRlX2Zyb209WyciXXswLDF9XC5cJF9TRVJWRVJcW1snIl17MCwxfUhUVFBfSE9TVFsnIl17MCwxfVxdXC5bJyJdezAsMX0mc2l0ZV9mb2xkZXI9WyciXXswLDF9XC5cJGZcWzFcXSI7aTo1MjtzOjU2OiJ3aGlsZVwoY291bnRcKFwkbGluZXNcKT5cJGNvbF96YXBcKSBhcnJheV9wb3BcKFwkbGluZXNcKSI7aTo1MztzOjg1OiJcJHN0cmluZ1xzKj1ccypcJF9TRVNTSU9OXFtbJyJdezAsMX1kYXRhX2FbJyJdezAsMX1cXVxbWyciXXswLDF9bnV0emVybmFtZVsnIl17MCwxfVxdIjtpOjU0O3M6NDE6ImlmIFwoIXN0cnBvc1woXCRzdHJzXFswXF0sWyciXXswLDF9PFw/cGhwIjtpOjU1O3M6MjU6IlwkaXNldmFsZnVuY3Rpb25hdmFpbGFibGUiO2k6NTY7czoxNDoiRGF2aWRccytCbGFpbmUiO2k6NTc7czo0NzoiaWYgXChkYXRlXChbJyJdezAsMX1qWyciXXswLDF9XClccyotXHMqXCRuZXdzaWQiO2k6NTg7czo3OiJ1Z2djOi8vIjtpOjU5O3M6MTU6IjwhLS1ccytqcy10b29scyI7aTo2MDtzOjM0OiJpZlwoQHByZWdfbWF0Y2hcKHN0cnRyXChbJyJdezAsMX0vIjtpOjYxO3M6Mzc6Il9bJyJdezAsMX1cXVxbMlxdXChbJyJdezAsMX1Mb2NhdGlvbjoiO2k6NjI7czoyODoiXCRfUE9TVFxbWyciXXswLDF9c210cF9sb2dpbiI7aTo2MztzOjI4OiJpZlxzKlwoQGlzX3dyaXRhYmxlXChcJGluZGV4IjtpOjY0O3M6ODY6IkBpbmlfc2V0XHMqXChbJyJdezAsMX1pbmNsdWRlX3BhdGhbJyJdezAsMX0sWyciXXswLDF9aW5pX2dldFxzKlwoWyciXXswLDF9aW5jbHVkZV9wYXRoIjtpOjY1O3M6Mzg6IlplbmRccytPcHRpbWl6YXRpb25ccyt2ZXJccysxXC4wXC4wXC4xIjtpOjY2O3M6NjI6IlwkX1NFU1NJT05cW1snIl17MCwxfWRhdGFfYVsnIl17MCwxfVxdXFtcJG5hbWVcXVxzKj1ccypcJHZhbHVlIjtpOjY3O3M6NDI6ImlmXHMqXChmdW5jdGlvbl9leGlzdHNcKFsnIl1zY2FuX2RpcmVjdG9yeSI7aTo2ODtzOjY3OiJhcnJheVwoXHMqWyciXWhbJyJdXHMqLFxzKlsnIl10WyciXVxzKixccypbJyJddFsnIl1ccyosXHMqWyciXXBbJyJdIjtpOjY5O3M6MzU6IlwkY291bnRlclVybFxzKj1ccypbJyJdezAsMX1odHRwOi8vIjtpOjcwO3M6MTA4OiJmb3JcKFwkW2EtekEtWjAtOV9dKz89XGQrO1wkW2EtekEtWjAtOV9dKz88XGQrO1wkW2EtekEtWjAtOV9dKz8tPVxkK1wpe2lmXChcJFthLXpBLVowLTlfXSs/IT1cZCtcKVxzKmJyZWFrO30iO2k6NzE7czozNjoiaWZcKEBmdW5jdGlvbl9leGlzdHNcKFsnIl17MCwxfWZyZWFkIjtpOjcyO3M6MzM6Ilwkb3B0XHMqPVxzKlwkZmlsZVwoQCpcJF9DT09LSUVcWyI7aTo3MztzOjM4OiJwcmVnX3JlcGxhY2VcKFwpe3JldHVyblxzK19fRlVOQ1RJT05fXyI7aTo3NDtzOjM5OiJpZlxzKlwoY2hlY2tfYWNjXChcJGxvZ2luLFwkcGFzcyxcJHNlcnYiO2k6NzU7czozNjoicHJpbnRccytbJyJdezAsMX1kbGVfbnVsbGVkWyciXXswLDF9IjtpOjc2O3M6NjM6ImlmXChtYWlsXChcJGVtYWlsXFtcJGlcXSxccypcJHN1YmplY3QsXHMqXCRtZXNzYWdlLFxzKlwkaGVhZGVycyI7aTo3NztzOjEyOiJUZWFNXHMrTW9zVGEiO2k6Nzg7czoxNDoiWyciXXswLDF9RFplMXIiO2k6Nzk7czoxNToicGFja1xzKyJTbkE0eDgiIjtpOjgwO3M6MzI6IlwkX1Bvc3RcW1snIl17MCwxfVNTTlsnIl17MCwxfVxdIjtpOjgxO3M6Mjc6IkV0aG5pY1xzK0FsYmFuaWFuXHMrSGFja2VycyI7aTo4MjtzOjk6IkJ5XHMrRFoyNyI7aTo4MztzOjcyOiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoWyciXXswLDF9Y21kXC5leGUiO2k6ODQ7czoxMDI6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChbJyJdezAsMX1cJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbIiI7aTo4NTtzOjE1OiJBdXRvXHMqWHBsb2l0ZXIiO2k6ODY7czo5OiJieVxzK2cwMG4iO2k6ODc7czoyODoiaWZcKFwkbzwxNlwpe1wkaFxbXCRlXFtcJG9cXSI7aTo4ODtzOjk0OiJpZlwoaXNfZGlyXChcJHBhdGhcLlsnIl17MCwxfS93cC1jb250ZW50WyciXXswLDF9XClccytBTkRccytpc19kaXJcKFwkcGF0aFwuWyciXXswLDF9L3dwLWFkbWluIjtpOjg5O3M6NjA6ImlmXHMqXChccypmaWxlX3B1dF9jb250ZW50c1xzKlwoXHMqXCRpbmRleF9wYXRoXHMqLFxzKlwkY29kZSI7aTo5MDtzOjUxOiJAYXJyYXlcKFxzKlwoc3RyaW5nXClccypzdHJpcHNsYXNoZXNcKFxzKlwkX1JFUVVFU1QiO2k6OTE7czo0MDoic3RyX3JlcGxhY2VccypcKFxzKlsnIl17MCwxfS9wdWJsaWNfaHRtbCI7aTo5MjtzOjQxOiJpZlwoXHMqaXNzZXRcKFxzKlwkX1JFUVVFU1RcW1snIl17MCwxfWNpZCI7aTo5MztzOjE1OiJjYXRhdGFuXHMrc2l0dXMiO2k6OTQ7czo4NjoiL2luZGV4XC5waHBcP29wdGlvbj1jb21famNlJnRhc2s9cGx1Z2luJnBsdWdpbj1pbWdtYW5hZ2VyJmZpbGU9aW1nbWFuYWdlciZ2ZXJzaW9uPTE1NzYiO2k6OTU7czozNzoic2V0Y29va2llXChccypcJHpcWzBcXVxzKixccypcJHpcWzFcXSI7aTo5NjtzOjMyOiJcJFNcW1wkaVwrXCtcXVwoXCRTXFtcJGlcK1wrXF1cKCI7aTo5NztzOjMyOiJcW1wkb1xdXCk7XCRvXCtcK1wpe2lmXChcJG88MTZcKSI7aTo5ODtzOjgxOiJ0eXBlb2ZccypcKGRsZV9hZG1pblwpXHMqPT1ccypbJyJdezAsMX11bmRlZmluZWRbJyJdezAsMX1ccypcfFx8XHMqZGxlX2FkbWluXHMqPT0iO2k6OTk7czozNjoiY3JlYXRlX2Z1bmN0aW9uXChzdWJzdHJcKDIsMVwpLFwkc1wpIjtpOjEwMDtzOjYwOiJwbHVnaW5zL3NlYXJjaC9xdWVyeVwucGhwXD9fX19fcGdmYT1odHRwJTNBJTJGJTJGd3d3XC5nb29nbGUiO2k6MTAxO3M6MzY6InJldHVyblxzK2Jhc2U2NF9kZWNvZGVcKFwkYVxbXCRpXF1cKSI7aToxMDI7czo0NToiXCRmaWxlXChAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjEwMztzOjI3OiJjdXJsX2luaXRcKFxzKmJhc2U2NF9kZWNvZGUiO2k6MTA0O3M6MzI6ImV2YWxcKFsnIl1cPz5bJyJdXC5iYXNlNjRfZGVjb2RlIjtpOjEwNTtzOjI5OiJbJyJdWyciXVxzKlwuXHMqQkFzZTY0X2RlQ29EZSI7aToxMDY7czoyODoiWyciXVsnIl1ccypcLlxzKmd6VW5jb01wcmVTcyI7aToxMDc7czoxOToiZ3JlcFxzKy12XHMrY3JvbnRhYiI7aToxMDg7czozNDoiY3JjMzJcKFxzKlwkX1BPU1RcW1xzKlsnIl17MCwxfWNtZCI7aToxMDk7czoxOToiXCRia2V5d29yZF9iZXo9WyciXSI7aToxMTA7czoyNzoiaHR0cHM6Ly9hcHBsZWlkXC5hcHBsZVwuY29tIjtpOjExMTtzOjYwOiJmaWxlX2dldF9jb250ZW50c1woYmFzZW5hbWVcKFwkX1NFUlZFUlxbWyciXXswLDF9U0NSSVBUX05BTUUiO2k6MTEyO3M6NTQ6IlxzKlsnIl17MCwxfXJvb2tlZVsnIl17MCwxfVxzKixccypbJyJdezAsMX13ZWJlZmZlY3RvciI7aToxMTM7czo0ODoiXHMqWyciXXswLDF9c2x1cnBbJyJdezAsMX1ccyosXHMqWyciXXswLDF9bXNuYm90IjtpOjExNDtzOjM4OiJKUmVzcG9uc2U6OnNldEJvZHlccypcKFxzKnByZWdfcmVwbGFjZSI7aToxMTU7czoyMDoiZXZhbFxzKlwoXHMqVFBMX0ZJTEUiO2k6MTE2O3M6ODI6IkAqYXJyYXlfZGlmZl91a2V5XChccypAKmFycmF5XChccypcKHN0cmluZ1wpXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6MTE3O3M6MTA1OiJcJHBhdGhccyo9XHMqXCRfU0VSVkVSXFtccypbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XHMqXF1ccypcLlxzKlsnIl17MCwxfS9pbWFnZXMvc3Rvcmllcy9bJyJdezAsMX0iO2k6MTE4O3M6ODk6Ilwkc2FwZV9vcHRpb25cW1xzKlsnIl17MCwxfWZldGNoX3JlbW90ZV90eXBlWyciXXswLDF9XHMqXF1ccyo9XHMqWyciXXswLDF9c29ja2V0WyciXXswLDF9IjtpOjExOTtzOjg4OiJmaWxlX3B1dF9jb250ZW50c1woXHMqXCRuYW1lXHMqLFxzKmJhc2U2NF9kZWNvZGVcKFxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjEyMDtzOjgyOiJlcmVnX3JlcGxhY2VcKFsnIl17MCwxfSU1QyUyMlsnIl17MCwxfVxzKixccypbJyJdezAsMX0lMjJbJyJdezAsMX1ccyosXHMqXCRtZXNzYWdlIjtpOjEyMTtzOjg1OiJcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9dXJbJyJdezAsMX1cXVwpXClccypcJG1vZGVccypcfD1ccyowNDAwIjtpOjEyMjtzOjkxOiJtYWlsXChccypzdHJpcHNsYXNoZXNcKFwkdG9cKVxzKixccypzdHJpcHNsYXNoZXNcKFwkc3ViamVjdFwpXHMqLFxzKnN0cmlwc2xhc2hlc1woXCRtZXNzYWdlIjtpOjEyMztzOjQxOiIvcGx1Z2lucy9zZWFyY2gvcXVlcnlcLnBocFw/X19fX3BnZmE9aHR0cCI7aToxMjQ7czo0OToiQCpmaWxlX3B1dF9jb250ZW50c1woXHMqXCR0aGlzLT5maWxlXHMqLFxzKnN0cnJldiI7aToxMjU7czo0ODoicHJlZ19tYXRjaF9hbGxcKFxzKlsnIl1cfFwoXC5cKlwpPFxcIS0tIGpzLXRvb2xzIjtpOjEyNjtzOjMwOiJoZWFkZXJcKFsnIl17MCwxfXI6XHMqbm9ccytjb20iO2k6MTI3O3M6NzM6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChbJyJdbHNccysvdmFyL21haWwiO2k6MTI4O3M6MjY6IlwkZG9yX2NvbnRlbnQ9cHJlZ19yZXBsYWNlIjtpOjEyOTtzOjIzOiJfX3VybF9nZXRfY29udGVudHNcKFwkbCI7aToxMzA7czo1NDoiXCRHTE9CQUxTXFtbJyJdezAsMX1bYS16QS1aMC05X10rP1snIl17MCwxfVxdXChccypOVUxMIjtpOjEzMTtzOjYyOiJ1bmFtZVxdWyciXXswLDF9XHMqXC5ccypwaHBfdW5hbWVcKFwpXHMqXC5ccypbJyJdezAsMX1cWy91bmFtZSI7aToxMzI7czozMzoiQFwkZnVuY1woXCRjZmlsZSwgXCRjZGlyXC5cJGNuYW1lIjtpOjEzMztzOjM2OiJldmFsXChccypcJFthLXpBLVowLTlfXSs/XChccypcJDxhbWMiO2k6MTM0O3M6NzE6IlwkX1xbXHMqXGQrXHMqXF1cKFxzKlwkX1xbXHMqXGQrXHMqXF1cKFwkX1xbXHMqXGQrXHMqXF1cKFxzKlwkX1xbXHMqXGQrIjtpOjEzNTtzOjI5OiJlcmVnaVwoXHMqc3FsX3JlZ2Nhc2VcKFxzKlwkXyI7aToxMzY7czo0MDoiXCNVc2VbJyJdezAsMX1ccyosXHMqZmlsZV9nZXRfY29udGVudHNcKCI7aToxMzc7czoyMDoibWtkaXJcKFxzKlsnIl0vaG9tZS8iO2k6MTM4O3M6MjA6ImZvcGVuXChccypbJyJdL2hvbWUvIjtpOjEzOTtzOjM2OiJcJHVzZXJfYWdlbnRfdG9fZmlsdGVyXHMqPVxzKmFycmF5XCgiO2k6MTQwO3M6NDQ6ImZpbGVfcHV0X2NvbnRlbnRzXChbJyJdezAsMX1cLi9saWJ3b3JrZXJcLnNvIjtpOjE0MTtzOjY0OiJcIyEvYmluL3NobmNkXHMrWyciXXswLDF9WyciXXswLDF9XC5cJFNDUFwuWyciXXswLDF9WyciXXswLDF9bmlmIjtpOjE0MjtzOjgwOiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoXHMqWyciXXswLDF9YXRccytub3dccystZiI7aToxNDM7czozMzoiY3JvbnRhYlxzKy1sXHxncmVwXHMrLXZccytjcm9udGFiIjtpOjE0NDtzOjE0OiJEYXZpZFxzKkJsYWluZSI7aToxNDU7czoyMzoiZXhwbG9pdC1kYlwuY29tL3NlYXJjaC8iO2k6MTQ2O3M6MjM6ImlzX3dyaXRhYmxlPWlzX3dyaXRhYmxlIjtpOjE0NztzOjcwOiJtYWlsXChccypcJGFcW1xkK1xdXHMqLFxzKlwkYVxbXGQrXF1ccyosXHMqXCRhXFtcZCtcXVxzKixccypcJGFcW1xkK1xdIjtpOjE0ODtzOjM2OiJmaWxlX3B1dF9jb250ZW50c1woXHMqWyciXXswLDF9L2hvbWUiO2k6MTQ5O3M6NjA6Im1haWxcKFxzKlwkTWFpbFRvXHMqLFxzKlwkTWVzc2FnZVN1YmplY3RccyosXHMqXCRNZXNzYWdlQm9keSI7aToxNTA7czoxMTc6IlwkY29udGVudFxzKj1ccypodHRwX3JlcXVlc3RcKFsnIl17MCwxfWh0dHA6Ly9bJyJdezAsMX1ccypcLlxzKlwkX1NFUlZFUlxbWyciXXswLDF9U0VSVkVSX05BTUVbJyJdezAsMX1cXVwuWyciXXswLDF9LyI7aToxNTE7czo3ODoiIWZpbGVfcHV0X2NvbnRlbnRzXChccypcJGRibmFtZVxzKixccypcJHRoaXMtPmdldEltYWdlRW5jb2RlZFRleHRcKFxzKlwkZGJuYW1lIjtpOjE1MjtzOjQ0OiJzY3JpcHRzXFtccypnenVuY29tcHJlc3NcKFxzKmJhc2U2NF9kZWNvZGVcKCI7aToxNTM7czo3Mjoic2VuZF9zbXRwXChccypcJGVtYWlsXFtbJyJdezAsMX1hZHJbJyJdezAsMX1cXVxzKixccypcJHN1YmpccyosXHMqXCR0ZXh0IjtpOjE1NDtzOjQ2OiI9XCRmaWxlXChAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjE1NTtzOjUyOiJ0b3VjaFwoXHMqWyciXXswLDF9XCRiYXNlcGF0aC9jb21wb25lbnRzL2NvbV9jb250ZW50IjtpOjE1NjtzOjI3OiJcKFsnIl1cJHRtcGRpci9zZXNzX2ZjXC5sb2ciO2k6MTU3O3M6MzU6ImZpbGVfZXhpc3RzXChccypbJyJdL3RtcC90bXAtc2VydmVyIjtpOjE1ODtzOjQ5OiJtYWlsXChccypcJHJldG9ybm9ccyosXHMqXCRhc3VudG9ccyosXHMqXCRtZW5zYWplIjtpOjE1OTtzOjgyOiJcJFVSTFxzKj1ccypcJHVybHNcW1xzKnJhbmRcKFxzKjBccyosXHMqY291bnRcKFxzKlwkdXJsc1xzKlwpXHMqLVxzKjFcKVxzKlxdXC5yYW5kIjtpOjE2MDtzOjQwOiJfX2ZpbGVfZ2V0X3VybF9jb250ZW50c1woXHMqXCRyZW1vdGVfdXJsIjtpOjE2MTtzOjEzOiI9YnlccytEUkFHT049IjtpOjE2MjtzOjk4OiJzdWJzdHJcKFxzKlwkc3RyaW5nMlxzKixccypzdHJsZW5cKFxzKlwkc3RyaW5nMlxzKlwpXHMqLVxzKjlccyosXHMqOVwpXHMqPT1ccypbJyJdezAsMX1cW2wscj0zMDJcXSI7aToxNjM7czozMzoiXFtcXVxzKj1ccypbJyJdUmV3cml0ZUVuZ2luZVxzK29uIjtpOjE2NDtzOjc1OiJmd3JpdGVcKFxzKlwkZlxzKixccypnZXRfZG93bmxvYWRcKFxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6MTY1O3M6NDc6InRhclxzKy1jemZccysiXHMqXC5ccypcJEZPUk17dGFyfVxzKlwuXHMqIlwudGFyIjtpOjE2NjtzOjE0OiItQXBwbGVfUmVzdWx0LSI7aToxNjc7czoxMToic2NvcGJpblsnIl0iO2k6MTY4O3M6NjY6IjxkaXZccytpZD1bJyJdbGluazFbJyJdPjxidXR0b24gb25jbGljaz1bJyJdcHJvY2Vzc1RpbWVyXChcKTtbJyJdPiI7aToxNjk7czozNToiPGd1aWQ+PFw/cGhwXHMrZWNob1xzK1wkY3VycmVudF91cmwiO2k6MTcwO3M6NjI6ImludDMyXChcKFwoXCR6XHMqPj5ccyo1XHMqJlxzKjB4MDdmZmZmZmZcKVxzKlxeXHMqXCR5XHMqPDxccyoyIjtpOjE3MTtzOjQzOiJmb3BlblwoXHMqXCRyb290X2RpclxzKlwuXHMqWyciXS9cLmh0YWNjZXNzIjtpOjE3MjtzOjIzOiJcJGluX1Blcm1zXHMrJlxzKzB4NDAwMCI7aToxNzM7czozNDoiZmlsZV9nZXRfY29udGVudHNcKFxzKlsnIl0vdmFyL3RtcCI7aToxNzQ7czo5OiIvcG10L3Jhdi8iO2k6MTc1O3M6NDk6ImZ3cml0ZVwoXCRmcFxzKixccypzdHJyZXZcKFxzKlwkY29udGV4dFxzKlwpXHMqXCkiO2k6MTc2O3M6MjA6Ik1hc3JpXHMrQ3liZXJccytUZWFtIjtpOjE3NztzOjE4OiJVczNccytZMHVyXHMrYnI0MW4iO2k6MTc4O3M6MjA6Ik1hc3IxXHMrQ3liM3JccytUZTRtIjtpOjE3OTtzOjIwOiJ0SEFOS3Nccyt0T1xzK1Nub3BweSI7aToxODA7czoxMzoiQU9MXHMrRGV0YWlscyI7aToxODE7czo2NjoiLFxzKlsnIl0vaW5kZXhcXFwuXChwaHBcfGh0bWxcKS9pWyciXVxzKixccypSZWN1cnNpdmVSZWdleEl0ZXJhdG9yIjtpOjE4MjtzOjQ3OiJmaWxlX3B1dF9jb250ZW50c1woXHMqXCRpbmRleF9wYXRoXHMqLFxzKlwkY29kZSI7aToxODM7czo1NToiZ2V0cHJvdG9ieW5hbWVcKFxzKlsnIl10Y3BbJyJdXHMqXClccytcfFx8XHMrZGllXHMrc2hpdCI7aToxODQ7czo3NjoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFxzKlsnIl1jZFxzKy90bXA7d2dldCI7aToxODU7czoyMjoiPGFccytocmVmPVsnIl1vc2hpYmthLSI7aToxODY7czo4NToiaWZcKFxzKlwkX0dFVFxbXHMqWyciXWlkWyciXVxzKlxdIT1ccypbJyJdWyciXVxzKlwpXHMqXCRpZD1cJF9HRVRcW1xzKlsnIl1pZFsnIl1ccypcXSI7aToxODc7czo4MzoiaWZcKFsnIl1zdWJzdHJfY291bnRcKFsnIl1cJF9TRVJWRVJcW1snIl1SRVFVRVNUX1VSSVsnIl1cXVxzKixccypbJyJdcXVlcnlcLnBocFsnIl0iO2k6MTg4O3M6Mzg6IlwkZmlsbCA9IFwkX0NPT0tJRVxbXFxbJyJdZmlsbFxcWyciXVxdIjtpOjE4OTtzOjYyOiJcJHJlc3VsdD1zbWFydENvcHlcKFxzKlwkc291cmNlXHMqXC5ccypbJyJdL1snIl1ccypcLlxzKlwkZmlsZSI7aToxOTA7czo0MDoiXCRiYW5uZWRJUFxzKj1ccyphcnJheVwoXHMqWyciXVxeNjZcLjEwMiI7aToxOTE7czozNToiPGxvYz48XD9waHBccytlY2hvXHMrXCRjdXJyZW50X3VybDsiO2k6MTkyO3M6Mjg6Ilwkc2V0Y29va1wpO3NldGNvb2tpZVwoXCRzZXQiO2k6MTkzO3M6Mjg6IlwpO2Z1bmN0aW9uXHMrc3RyaW5nX2NwdFwoXCQiO2k6MTk0O3M6NTA6IlsnIl1cLlsnIl1bJyJdXC5bJyJdWyciXVwuWyciXVsnIl1cLlsnIl1bJyJdXC5bJyJdIjtpOjE5NTtzOjUzOiJpZlwocHJlZ19tYXRjaFwoWyciXVwjd29yZHByZXNzX2xvZ2dlZF9pblx8YWRtaW5cfHB3ZCI7aToxOTY7czo0MToiZ19kZWxldGVfb25fZXhpdFxzKj1ccypuZXdccytEZWxldGVPbkV4aXQiO2k6MTk3O3M6MzA6IlNFTEVDVFxzK1wqXHMrRlJPTVxzK2Rvcl9wYWdlcyI7aToxOTg7czoxODoiQWNhZGVtaWNvXHMrUmVzdWx0IjtpOjE5OTtzOjc1OiJ2YWx1ZT1bJyJdPFw/XHMrKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFsnIl0iO2k6MjAwO3M6Mjc6IlxkKyZAcHJlZ19tYXRjaFwoXHMqc3RydHJcKCI7aToyMDE7czozODoiY2hyXChccypoZXhkZWNcKFxzKnN1YnN0clwoXHMqXCRtYWtldXAiO2k6MjAyO3M6MzA6InJlYWRfZmlsZV9uZXdfMlwoXCRyZXN1bHRfcGF0aCI7aToyMDM7czoyMzoiXCRpbmRleF9wYXRoXHMqLFxzKjA0MDQiO2k6MjA0O3M6Njc6IlwkZmlsZV9mb3JfdG91Y2hccyo9XHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF0iO2k6MjA1O3M6NjE6IlwkX1NFUlZFUlxbWyciXXswLDF9UkVNT1RFX0FERFJbJyJdezAsMX1cXTtpZlwoXChwcmVnX21hdGNoXCgiO2k6MjA2O3M6MTk6Ij09XHMqWyciXWNzaGVsbFsnIl0iO2k6MjA3O3M6Mjk6ImZpbGVfZXhpc3RzXChccypcJEZpbGVCYXphVFhUIjtpOjIwODtzOjE4OiJyZXN1bHRzaWduX3dhcm5pbmciO2k6MjA5O3M6MjQ6ImZ1bmN0aW9uXHMrZ2V0Zmlyc3RzaHRhZyI7aToyMTA7czo5MDoiZmlsZV9nZXRfY29udGVudHNcKFJPT1RfRElSXC5bJyJdL3RlbXBsYXRlcy9bJyJdXC5cJGNvbmZpZ1xbWyciXXNraW5bJyJdXF1cLlsnIl0vbWFpblwudHBsIjtpOjIxMTtzOjI1OiJuZXdccytjb25lY3RCYXNlXChbJyJdYUhSIjtpOjIxMjtzOjgzOiJcJGlkXHMqXC5ccypbJyJdXD9kPVsnIl1ccypcLlxzKmJhc2U2NF9lbmNvZGVcKFxzKlwkX1NFUlZFUlxbXHMqWyciXUhUVFBfVVNFUl9BR0VOVCI7aToyMTM7czoyOToiZG9fd29ya1woXHMqXCRpbmRleF9maWxlXHMqXCkiO2k6MjE0O3M6NDE6ImlmXHMqXChmdW5jdGlvbl9leGlzdHNcKFxzKlsnIl1wY250bF9mb3JrIjtpOjIxNTtzOjIwOiJoZWFkZXJccypcKFxzKl9cZCtcKCI7aToyMTY7czoxMjoiQnlccytXZWJSb29UIjtpOjIxNztzOjE2OiJDb2RlZFxzK2J5XHMrRVhFIjtpOjIxODtzOjcxOiJ0cmltXChccypcJGhlYWRlcnNccypcKVxzKlwpXHMqYXNccypcJGhlYWRlclxzKlwpXHMqaGVhZGVyXChccypcJGhlYWRlciI7aToyMTk7czo1NjoiQFwkX1NFUlZFUlxbXHMqSFRUUF9IT1NUXHMqXF0+WyciXVxzKlwuXHMqWyciXVxcclxcblsnIl0iO2k6MjIwO3M6ODE6ImZpbGVfZ2V0X2NvbnRlbnRzXChccypcJF9TRVJWRVJcW1xzKlsnIl1ET0NVTUVOVF9ST09UWyciXVxzKlxdXHMqXC5ccypbJyJdL2VuZ2luZSI7aToyMjE7czo2OToidG91Y2hcKFxzKlwkX1NFUlZFUlxbXHMqWyciXURPQ1VNRU5UX1JPT1RbJyJdXHMqXF1ccypcLlxzKlsnIl0vZW5naW5lIjtpOjIyMjtzOjE2OiJQSFBTSEVMTF9WRVJTSU9OIjtpOjIyMztzOjI2OiI8XD9ccyo9QGBcJFthLXpBLVowLTlfXSs/YCI7aToyMjQ7czoyMToiJl9TRVNTSU9OXFtwYXlsb2FkXF09IjtpOjIyNTtzOjQ3OiJnenVuY29tcHJlc3NcKFxzKmZpbGVfZ2V0X2NvbnRlbnRzXChccypbJyJdaHR0cCI7aToyMjY7czo4NDoiaWZcKFxzKiFlbXB0eVwoXHMqXCRfUE9TVFxbXHMqWyciXXswLDF9dHAyWyciXXswLDF9XHMqXF1cKVxzKmFuZFxzKmlzc2V0XChccypcJF9QT1NUIjtpOjIyNztzOjQ5OiJpZlwoXHMqdHJ1ZVxzKiZccypAcHJlZ19tYXRjaFwoXHMqc3RydHJcKFxzKlsnIl0vIjtpOjIyODtzOjM4OiI9PVxzKjBcKVxzKntccyplY2hvXHMqUEhQX09TXHMqXC5ccypcJCI7aToyMjk7czoxMDc6Imlzc2V0XChccypcJF9TRVJWRVJcW1xzKl9cZCtcKFxzKlxkK1xzKlwpXHMqXF1ccypcKVxzKlw/XHMqXCRfU0VSVkVSXFtccypfXGQrXChcZCtcKVxzKlxdXHMqOlxzKl9cZCtcKFxkK1wpIjtpOjIzMDtzOjk5OiJcJGluZGV4XHMqPVxzKnN0cl9yZXBsYWNlXChccypbJyJdPFw/cGhwXHMqb2JfZW5kX2ZsdXNoXChcKTtccypcPz5bJyJdXHMqLFxzKlsnIl1bJyJdXHMqLFxzKlwkaW5kZXgiO2k6MjMxO3M6MzM6Ilwkc3RhdHVzX2xvY19zaFxzKj1ccypmaWxlX2V4aXN0cyI7aToyMzI7czo0ODoiXCRQT1NUX1NUUlxzKj1ccypmaWxlX2dldF9jb250ZW50c1woInBocDovL2lucHV0IjtpOjIzMztzOjQ4OiJnZVxzKj1ccypzdHJpcHNsYXNoZXNccypcKFxzKlwkX1BPU1RccypcW1snIl1tZXMiO2k6MjM0O3M6NjY6IlwkdGFibGVcW1wkc3RyaW5nXFtcJGlcXVxdXHMqXCpccypwb3dcKDY0XHMqLFxzKjJcKVxzKlwrXHMqXCR0YWJsZSI7aToyMzU7czozMzoiaWZcKFxzKnN0cmlwb3NcKFxzKlsnIl1cKlwqXCpcJHVhIjtpOjIzNjtzOjQ5OiJmbHVzaF9lbmRfZmlsZVwoXHMqXCRmaWxlbmFtZVxzKixccypcJGZpbGVjb250ZW50IjtpOjIzNztzOjU2OiJwcmVnX21hdGNoXChccypbJyJdezAsMX1+TG9jYXRpb246XChcLlwqXD9cKVwoXD86XFxuXHxcJCI7aToyMzg7czoyODoidG91Y2hcKFxzKlwkdGhpcy0+Y29uZi0+cm9vdCI7aToyMzk7czozNzoiZXZhbFwoXHMqXCR7XHMqXCRbYS16QS1aMC05X10rP1xzKn1cWyI7aToyNDA7czo0MzoiaWZccypcKFxzKkBmaWxldHlwZVwoXCRsZWFkb25ccypcLlxzKlwkZmlsZSI7aToyNDE7czo1OToiZmlsZV9wdXRfY29udGVudHNcKFxzKlwkZGlyXHMqXC5ccypcJGZpbGVccypcLlxzKlsnIl0vaW5kZXgiO2k6MjQyO3M6MjY6ImZpbGVzaXplXChccypcJHB1dF9rX2ZhaWx1IjtpOjI0MztzOjYwOiJhZ2Vccyo9XHMqc3RyaXBzbGFzaGVzXHMqXChccypcJF9QT1NUXHMqXFtbJyJdezAsMX1tZXNbJyJdXF0iO2k6MjQ0O3M6NDM6ImZ1bmN0aW9uXHMrZmluZEhlYWRlckxpbmVccypcKFxzKlwkdGVtcGxhdGUiO2k6MjQ1O3M6NDM6Ilwkc3RhdHVzX2NyZWF0ZV9nbG9iX2ZpbGVccyo9XHMqY3JlYXRlX2ZpbGUiO2k6MjQ2O3M6Mzg6ImVjaG9ccytzaG93X3F1ZXJ5X2Zvcm1cKFxzKlwkc3Fsc3RyaW5nIjtpOjI0NztzOjIyOiJmdW5jdGlvblxzK21haWxlcl9zcGFtIjtpOjI0ODtzOjM0OiJFZGl0SHRhY2Nlc3NcKFxzKlsnIl1SZXdyaXRlRW5naW5lIjtpOjI0OTtzOjExOiJcJHBhdGhUb0RvciI7aToyNTA7czo0MDoiXCRjdXJfY2F0X2lkXHMqPVxzKlwoXHMqaXNzZXRcKFxzKlwkX0dFVCI7aToyNTE7czo5OToiQFwkX0NPT0tJRVxbXHMqWyciXVthLXpBLVowLTlfXSs/WyciXVxzKlxdXChccypAXCRfQ09PS0lFXFtccypbJyJdW2EtekEtWjAtOV9dKz9bJyJdXHMqXF1ccypcKVxzKlwpIjtpOjI1MjtzOjQwOiJoZWFkZXJcKFsnIl1Mb2NhdGlvbjpccypodHRwOi8vXCRwcFwub3JnIjtpOjI1MztzOjU3OiJcJFthLXpBLVowLTlfXSs/PVsnIl0vaG9tZS9bYS16QS1aMC05X10rPy9bYS16QS1aMC05X10rPy8iO2k6MjU0O3M6NDk6InJldHVyblxzK1snIl0vaG9tZS9bYS16QS1aMC05X10rPy9bYS16QS1aMC05X10rPy8iO2k6MjU1O3M6Mzk6IlsnIl13cC1bJyJdXHMqXC5ccypnZW5lcmF0ZVJhbmRvbVN0cmluZyI7aToyNTY7czo2ODoiXCRbYS16QS1aMC05X10rPz09WyciXWZlYXR1cmVkWyciXVxzKlwpXHMqXCl7XHMqZWNob1xzK2Jhc2U2NF9kZWNvZGUiO2k6MjU3O3M6MTA4OiJcJFthLXpBLVowLTlfXSs/XHMqPVxzKlwkanFccypcKFxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1snIl17MCwxfVthLXpBLVowLTlfXSs/WyciXXswLDF9XF0iO2k6MjU4O3M6MjI6ImV4cGxvaXRccyo6OlwuPC90aXRsZT4iO2k6MjU5O3M6NDE6IlwkW2EtekEtWjAtOV9dKz89c3RyX3JlcGxhY2VcKFsnIl1cKmFcJFwqIjtpOjI2MDtzOjYyOiJjaHJcKFxzKlwkW2EtekEtWjAtOV9dKz9ccypcKTtccyp9XHMqZXZhbFwoXHMqXCRbYS16QS1aMC05X10rPyI7aToyNjE7czo0ODoiaWZcKFxzKmlzSW5TdHJpbmcxKlwoXCRbYS16QS1aMC05X10rPyxbJyJdZ29vZ2xlIjtpOjI2MjtzOjkzOiJcJHBwXHMqPVxzKlwkcFxbXGQrXF1ccypcLlxzKlwkcFxbXGQrXF1ccypcLlxzKlwkcFxbXGQrXF1ccypcLlxzKlwkcFxbXGQrXF1ccypcLlxzKlwkcFxbXGQrXF0iO2k6MjYzO3M6NDk6ImZpbGVfcHV0X2NvbnRlbnRzXChESVJcLlsnIl0vWyciXVwuWyciXWluZGV4XC5waHAiO2k6MjY0O3M6Mjk6IkBnZXRfaGVhZGVyc1woXHMqXCRmdWxscGF0aFwpIjtpOjI2NTtzOjIxOiJAXCRfR0VUXFtbJyJdcHdbJyJdXF0iO2k6MjY2O3M6MjU6Impzb25fZW5jb2RlXChhbGV4dXNNYWlsZXIiO2k6MjY3O3M6MTU1OiJldmFsXChccyooZXZhbHxiYXNlNjRfZGVjb2RlfHN1YnN0cnxzdHJyZXZ8cHJlZ19yZXBsYWNlfHByZWdfcmVwbGFjZV9jYWxsYmFja3xzdHJzdHJ8Z3ppbmZsYXRlfGd6dW5jb21wcmVzc3xhc3NlcnR8c3RyX3JvdDEzfG1kNXxhcnJheV93YWxrfGFycmF5X2ZpbHRlcilcKCI7aToyNjg7czoxOToiPVsnIl1cKVwpO1snIl1cKVwpOyI7aToyNjk7czoxNjg6Ij1ccypcJFthLXpBLVowLTlfXSs/XCgoZXZhbHxiYXNlNjRfZGVjb2RlfHN1YnN0cnxzdHJyZXZ8cHJlZ19yZXBsYWNlfHByZWdfcmVwbGFjZV9jYWxsYmFja3xzdHJzdHJ8Z3ppbmZsYXRlfGd6dW5jb21wcmVzc3xhc3NlcnR8c3RyX3JvdDEzfG1kNXxhcnJheV93YWxrfGFycmF5X2ZpbHRlcilcKCI7aToyNzA7czo1NToiXF1ccyp9XHMqXChccyp7XHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aToyNzE7czo3NzoicmVxdWVzdFwuc2VydmVydmFyaWFibGVzXChccypbJyJdSFRUUF9VU0VSX0FHRU5UWyciXVxzKlwpXHMqLFxzKlsnIl1Hb29nbGVib3QiO2k6MjcyO3M6MTk4OiJcYihwZXJjb2NldHxhZGRlcmFsbHx2aWFncmF8Y2lhbGlzfGxldml0cmF8a2F1ZmVufGFtYmllbnxibHVlXHMrcGlsbHxjb2NhaW5lfG1hcmlqdWFuYXxsaXBpdG9yfHBoZW50ZXJtaW58cHJvW3N6XWFjfHNhbmR5YXVlcnx0cmFtYWRvbHx0cm95aGFtYnl1bHRyYW18dW5pY2F1Y2F8dmFsaXVtfHZpY29kaW58eGFuYXh8eXB4YWllbylccytvbmxpbmUiO30="));
$gXX_FlexDBShe unserialize(base64_decode("YTo0NTc6e2k6MDtzOjE0OiJCT1RORVRccytQQU5FTCI7aToxO3M6MTU6IlsnIl0vZXRjL3Bhc3N3ZCI7aToyO3M6MTU6IlsnIl0vdmFyL2NwYW5lbCI7aTozO3M6MTQ6IlsnIl0vZXRjL2h0dHBkIjtpOjQ7czoyMDoiWyciXS9ldGMvbmFtZWRcLmNvbmYiO2k6NTtzOjYzOiJcJF9TRVJWRVJcW1xzKlsnIl1IVFRQX1JFRkVSRVJbJyJdXHMqXF1ccyosXHMqWyciXXRydXN0bGlua1wucnUiO2k6NjtzOjEzOiI4OVwuMjQ5XC4yMVwuIjtpOjc7czoxNToiMTA5XC4yMzhcLjI0MlwuIjtpOjg7czoxODoiPT1ccypbJyJdNDZcLjIyOVwuIjtpOjk7czoxODoiPT1ccypbJyJdOTFcLjI0M1wuIjtpOjEwO3M6NToiSlRlcm0iO2k6MTE7czo1OiJPbmV0NyI7aToxMjtzOjk6IlwkcGFzc191cCI7aToxMztzOjU6InhDZWR6IjtpOjE0O3M6NDE6IlsnIl1maW5kXHMrL1xzKy10eXBlXHMrZlxzKy1wZXJtXHMrLTA0MDAwIjtpOjE1O3M6NDE6IlsnIl1maW5kXHMrL1xzKy10eXBlXHMrZlxzKy1wZXJtXHMrLTAyMDAwIjtpOjE2O3M6NDU6IlsnIl1maW5kXHMrL1xzKy10eXBlXHMrZlxzKy1uYW1lXHMrXC5odHBhc3N3ZCI7aToxNztzOjI4OiJhbmRyb2lkXHxhdmFudGdvXHxibGFja2JlcnJ5IjtpOjE4O3M6Mzc6ImluaV9zZXRcKFxzKlsnIl17MCwxfW1hZ2ljX3F1b3Rlc19ncGMiO2k6MTk7czoxMjoiWyciXWxzXHMrLWxhIjtpOjIwO3M6NTE6ImRvY3VtZW50XC53cml0ZVxzKlwoXHMqdW5lc2NhcGVccypcKFxzKlsnIl17MCwxfSUzQyI7aToyMTtzOjU5OiJiYXNlNjRfZGVjb2RlXHMqXCgqXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aToyMjtzOjg5OiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aToyMztzOjYzOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqWyciXWltYWdlcy8iO2k6MjQ7czo2OToiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilccypcKEAqdXJsZW5jb2RlIjtpOjI1O3M6MTI6IlsnIl1ybVxzKy1yZiI7aToyNjtzOjEyOiJbJyJdcm1ccystZnIiO2k6Mjc7czoxNjoiWyciXXJtXHMrLXJccystZiI7aToyODtzOjE2OiJbJyJdcm1ccystZlxzKy1yIjtpOjI5O3M6Mjc6IlwkT09PLis/PVxzKnVybGRlY29kZVxzKlwoKiI7aTozMDtzOjY5OiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoKlsnIl1jZFxzKy90bXAiO2k6MzE7czozODoic3RyZWFtX3NvY2tldF9jbGllbnRccypcKFxzKlsnIl10Y3A6Ly8iO2k6MzI7czoxNToicGNudGxfZXhlY1xzKlwoIjtpOjMzO3M6MTA6IlsnIl1hSFIwY0QiO2k6MzQ7czo4MToiPG1ldGFccytodHRwLWVxdWl2PVsnIl17MCwxfXJlZnJlc2hbJyJdezAsMX1ccytjb250ZW50PVsnIl17MCwxfVxkKztccyp1cmw9PFw/cGhwIjtpOjM1O3M6ODI6IjxtZXRhXHMraHR0cC1lcXVpdj1bJyJdezAsMX1SZWZyZXNoWyciXXswLDF9XHMrY29udGVudD1bJyJdezAsMX1cZCs7XHMqVVJMPWh0dHA6Ly8iO2k6MzY7czoyMzoiY29weVxzKlwoXHMqWyciXWh0dHA6Ly8iO2k6Mzc7czoxOTA6Im1vdmVfdXBsb2FkZWRfZmlsZVxzKlwoKlxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX1maWxlbmFtZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX10bXBfbmFtZVsnIl17MCwxfVxzKlxdXHMqLFxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX1maWxlbmFtZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX1uYW1lWyciXXswLDF9XHMqXF0iO2k6Mzg7czoyODoiZWNob1xzKlwoKlxzKlsnIl1OTyBGSUxFWyciXSI7aTozOTtzOjE1OiJbJyJdL1wuXCovZVsnIl0iO2k6NDA7czo0NDg6IihldmFsfGJhc2U2NF9kZWNvZGV8c3Vic3RyfHN0cnJldnxwcmVnX3JlcGxhY2V8cHJlZ19yZXBsYWNlX2NhbGxiYWNrfHN0cnN0cnxnemluZmxhdGV8Z3p1bmNvbXByZXNzfGFzc2VydHxzdHJfcm90MTN8bWQ1fGFycmF5X3dhbGt8YXJyYXlfZmlsdGVyKVxzKlwoXHMqKGV2YWx8YmFzZTY0X2RlY29kZXxzdWJzdHJ8c3RycmV2fHByZWdfcmVwbGFjZXxwcmVnX3JlcGxhY2VfY2FsbGJhY2t8c3Ryc3RyfGd6aW5mbGF0ZXxnenVuY29tcHJlc3N8YXNzZXJ0fHN0cl9yb3QxM3xtZDV8YXJyYXlfd2Fsa3xhcnJheV9maWx0ZXIpXHMqXChccyooZXZhbHxiYXNlNjRfZGVjb2RlfHN1YnN0cnxzdHJyZXZ8cHJlZ19yZXBsYWNlfHByZWdfcmVwbGFjZV9jYWxsYmFja3xzdHJzdHJ8Z3ppbmZsYXRlfGd6dW5jb21wcmVzc3xhc3NlcnR8c3RyX3JvdDEzfG1kNXxhcnJheV93YWxrfGFycmF5X2ZpbHRlcikiO2k6NDE7czo2NDoiZWNob1xzK3N0cmlwc2xhc2hlc1xzKlwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aTo0MjtzOjY0OiI9XHMqXCRHTE9CQUxTXFtccypbJyJdXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpWyciXVxzKlxdIjtpOjQzO3M6MTU6IlwkYXV0aF9wYXNzXHMqPSI7aTo0NDtzOjUxOiJDVVJMT1BUX1JFRkVSRVIsXHMqWyciXXswLDF9aHR0cHM6Ly93d3dcLmdvb2dsZVwuY28iO2k6NDU7czoyOToiZWNob1xzK1snIl17MCwxfWdvb2RbJyJdezAsMX0iO2k6NDY7czoyMjoiZXZhbFxzKlwoXHMqZ2V0X29wdGlvbiI7aTo0NztzOjI4OiJDcmVkaXRccypDYXJkXHMqVmVyaWZpY2F0aW9uIjtpOjQ4O3M6MzU6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXWV2YWxbJyJdIjtpOjQ5O3M6NDQ6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXWJhc2U2NF9kZWNvZGVbJyJdIjtpOjUwO3M6NDY6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXWNyZWF0ZV9mdW5jdGlvblsnIl0iO2k6NTE7czozNzoiXCRbYS16QS1aMC05X10rP1xzKj1ccypbJyJdYXNzZXJ0WyciXSI7aTo1MjtzOjQzOiJcJFthLXpBLVowLTlfXSs/XHMqPVxzKlsnIl1wcmVnX3JlcGxhY2VbJyJdIjtpOjUzO3M6NDM6IihcXFswLTldWzAtOV1bMC05XXxcXHhbMC05YS1mXVswLTlhLWZdKXs3LH0iO2k6NTQ7czo0NToiTW96aWxsYS81XC4wXHMqXChjb21wYXRpYmxlO1xzKkdvb2dsZWJvdC8yXC4xIjtpOjU1O3M6ODQ6Im1vdmVfdXBsb2FkZWRfZmlsZVxzKlwoXHMqXCRfRklMRVNcW1snIl1bYS16QS1aMC05X10rP1snIl1cXVxbWyciXXRtcF9uYW1lWyciXVxdXHMqLCI7aTo1NjtzOjgxOiJtYWlsXChcJF9QT1NUXFtbJyJdezAsMX1lbWFpbFsnIl17MCwxfVxdLFxzKlwkX1BPU1RcW1snIl17MCwxfXN1YmplY3RbJyJdezAsMX1cXSwiO2k6NTc7czo3NzoibWFpbFxzKlwoXCRlbWFpbFxzKixccypbJyJdezAsMX09XD9VVEYtOFw/Qlw/WyciXXswLDF9XC5iYXNlNjRfZW5jb2RlXChcJGZyb20iO2k6NTg7czoxMzoiQGV4dHJhY3RccypcKCI7aTo1OTtzOjEzOiJAZXh0cmFjdFxzKlwkIjtpOjYwO3M6NjQ6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbYS16QS1aMC05X10rP1xzKlxdXCgiO2k6NjE7czoxOToiWyciXS9cZCsvXFthLXpcXVwqZSI7aTo2MjtzOjU2OiJAKmZpbGVfcHV0X2NvbnRlbnRzXChcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aTo2MztzOjM2OiJYLU1haWxlcjpccypNaWNyb3NvZnQgT2ZmaWNlIE91dGxvb2siO2k6NjQ7czozMToiXCRiXHMqPVxzKmNyZWF0ZV9mdW5jdGlvblwoWyciXSI7aTo2NTtzOjk6IlwkYlwoWyciXSI7aTo2NjtzOjQyOiI9XHMqY3JlYXRlX2Z1bmN0aW9uXChbJyJdezAsMX1cJGFbJyJdezAsMX0iO2k6Njc7czo2NjoiXCRbYS16QS1aMC05X10rP1xzKlwoXHMqXCRbYS16QS1aMC05X10rP1xzKlwoXHMqXCRbYS16QS1aMC05X10rP1woIjtpOjY4O3M6MjIyOiJcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwuXHMqXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwuXHMqXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXHMqXC5ccyoiO2k6Njk7czoxNTU6IlwkW2EtekEtWjAtOV9dKz9cW1xzKlwkW2EtekEtWjAtOV9dKz9ccypcXVxbXHMqXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwuIjtpOjcwO3M6MjE6ImRpc2FibGVfZnVuY3Rpb25zXHMqPSI7aTo3MTtzOjM4OiJAbW92ZV91cGxvYWRlZF9maWxlXChccypcJHVzZXJmaWxlX3RtcCI7aTo3MjtzOjI2OiJleGl0XChcKTpleGl0XChcKTpleGl0XChcKSI7aTo3MztzOjY1OiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqWyciXS92YXIvdG1wLyI7aTo3NDtzOjE3OiI9XHMqWyciXS92YXIvdG1wLyI7aTo3NTtzOjU5OiJcKFxzKlwkc2VuZFxzKixccypcJHN1YmplY3RccyosXHMqXCRtZXNzYWdlXHMqLFxzKlwkaGVhZGVycyI7aTo3NjtzOjQ1OiJcJFthLXpBLVowLTlfXSs/XHMqXChccypcJFthLXpBLVowLTlfXSs/XHMqXFsiO2k6Nzc7czo2NjoiXCRbYS16QS1aMC05X10rP1xzKlwoXHMqXCRbYS16QS1aMC05X10rP1xzKlwoXHMqXCRbYS16QS1aMC05X10rP1xbIjtpOjc4O3M6NTI6IlwkW2EtekEtWjAtOV9dKz9ccypcKFxzKlwkW2EtekEtWjAtOV9dKz9ccypcKFxzKlsnIl0iO2k6Nzk7czo3MzoiXCRbYS16QS1aMC05X10rP1xzKlwoXHMqXCRbYS16QS1aMC05X10rP1xzKlwoXHMqXCRbYS16QS1aMC05X10rP1xzKlwpXHMqLCI7aTo4MDtzOjcxOiJcJFthLXpBLVowLTlfXSs/XHMqXChccypbJyJdWyciXVxzKixccypldmFsXChcJFthLXpBLVowLTlfXSs/XHMqXClccypcKSI7aTo4MTtzOjgxOiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoWyciXWx3cC1kb3dubG9hZFxzK2h0dHA6Ly8iO2k6ODI7czoxMjoiZG1sbGQwUmhkR0U9IjtpOjgzO3M6MTAxOiJzdHJfcmVwbGFjZVwoWyciXS5bJyJdXHMqLFxzKlsnIl0uWyciXVxzKixccypzdHJfcmVwbGFjZVwoWyciXS5bJyJdXHMqLFxzKlsnIl0uWyciXVxzKixccypzdHJfcmVwbGFjZSI7aTo4NDtzOjM2OiIvYWRtaW4vY29uZmlndXJhdGlvblwucGhwL2xvZ2luXC5waHAiO2k6ODU7czo3MToic2VsZWN0XHMqY29uZmlndXJhdGlvbl9pZCxccytjb25maWd1cmF0aW9uX3RpdGxlLFxzK2NvbmZpZ3VyYXRpb25fdmFsdWUiO2k6ODY7czo1MDoidXBkYXRlXHMqY29uZmlndXJhdGlvblxzK3NldFxzK2NvbmZpZ3VyYXRpb25fdmFsdWUiO2k6ODc7czozNzoic2VsZWN0XHMqbGFuZ3VhZ2VzX2lkLFxzK25hbWUsXHMrY29kZSI7aTo4ODtzOjUyOiJjXC5sZW5ndGhcKTt9cmV0dXJuXHMqXFxbJyJdXFxbJyJdO31pZlwoIWdldENvb2tpZVwoIjtpOjg5O3M6NTM6IlwkW2EtekEtWjAtOV9dKz8gPSBcJFthLXpBLVowLTlfXSs/XChbJyJdezAsMX1odHRwOi8vIjtpOjkwO3M6NDU6ImlmXChmaWxlX3B1dF9jb250ZW50c1woXCRpbmRleF9wYXRoLFxzKlwkY29kZSI7aTo5MTtzOjM2OiJleGVjXHMre1snIl0vYmluL3NoWyciXX1ccytbJyJdLWJhc2giO2k6OTI7czo1MDoiPGlmcmFtZVxzK3NyYz1bJyJdaHR0cHM6Ly9kb2NzXC5nb29nbGVcLmNvbS9mb3Jtcy8iO2k6OTM7czoyMjoiLFsnIl08XD9waHBcXG5bJyJdXC5cJCI7aTo5NDtzOjcwOiI8XD9waHBccysoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXChccypbJyJdL2hvbWUvIjtpOjk1O3M6MjI6InhydW1lcl9zcGFtX2xpbmtzXC50eHQiO2k6OTY7czozMzoiQ29tZmlybVxzK1RyYW5zYWN0aW9uXHMrUGFzc3dvcmQ6IjtpOjk3O3M6Nzc6ImFycmF5X21lcmdlXChcJGV4dFxzKixccyphcnJheVwoWyciXXdlYnN0YXRbJyJdLFsnIl1hd3N0YXRzWyciXSxbJyJddGVtcG9yYXJ5IjtpOjk4O3M6OTA6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChbJyJdbXlzcWxkdW1wXHMrLWhccytsb2NhbGhvc3RccystdSI7aTo5OTtzOjI4OiJNb3RoZXJbJyJdc1xzK01haWRlblxzK05hbWU6IjtpOjEwMDtzOjM5OiJsb2NhdGlvblwucmVwbGFjZVwoXFxbJyJdXCR1cmxfcmVkaXJlY3QiO2k6MTAxO3M6MzY6ImNobW9kXChkaXJuYW1lXChfX0ZJTEVfX1wpLFxzKjA1MTFcKSI7aToxMDI7czo4MzoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFsnIl17MCwxfWN1cmxccystT1xzK2h0dHA6Ly8iO2k6MTAzO3M6Mjk6IlwpXCksUEhQX1ZFUlNJT04sbWQ1X2ZpbGVcKFwkIjtpOjEwNDtzOjc5OiJcJFthLXpBLVowLTlfXSs/XFtcJFthLXpBLVowLTlfXSs/XF1cW1wkW2EtekEtWjAtOV9dKz9cW1xkK1xdXC5cJFthLXpBLVowLTlfXSs/IjtpOjEwNTtzOjM0OiJcJHF1ZXJ5XHMrLFxzK1snIl1mcm9tJTIwam9zX3VzZXJzIjtpOjEwNjtzOjE1OiJldmFsXChbJyJdXHMqLy8iO2k6MTA3O3M6MTY6ImV2YWxcKFsnIl1ccyovXCoiO2k6MTA4O3M6MTA5OiJcJFthLXpBLVowLTlfXSs/XHMqPVwkW2EtekEtWjAtOV9dKz9ccypcKFwkW2EtekEtWjAtOV9dKz9ccyosXHMqXCRbYS16QS1aMC05X10rP1xzKlwoWyciXVxzKntcJFthLXpBLVowLTlfXSs/IjtpOjEwOTtzOjMxOiIhZXJlZ1woWyciXVxeXCh1bnNhZmVfcmF3XClcP1wkIjtpOjExMDtzOjM1OiJcJGJhc2VfZG9tYWluXHMqPVxzKmdldF9iYXNlX2RvbWFpbiI7aToxMTE7czo5OiJzZXhzZXhzZXgiO2k6MTEyO3M6MjM6IlwrdW5pb25cK3NlbGVjdFwrMCwwLDAsIjtpOjExMztzOjM3OiJjb25jYXRcKDB4MjE3ZSxwYXNzd29yZCwweDNhLHVzZXJuYW1lIjtpOjExNDtzOjM0OiJncm91cF9jb25jYXRcKDB4MjE3ZSxwYXNzd29yZCwweDNhIjtpOjExNTtzOjU1OiJcKi9ccyooaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqL1wqIjtpOjExNjtzOjg6ImFiYWtvL0FPIjtpOjExNztzOjQ4OiJpZlwoXHMqc3RycG9zXChccypcJHZhbHVlXHMqLFxzKlwkbWFza1xzKlwpXHMqXCkiO2k6MTE4O3M6MTA2OiJ1bmxpbmtcKFxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxdXHMqXC5ccypbJyJdezAsMX0vYXNzZXRzL2NhY2hlL3RlbXAvRmlsZVNldHRpbmdzIjtpOjExOTtzOjE0MjoiKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoKlxzKlwkX1NFUlZFUlxbWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxdXHMqXC5ccypbJyJdW1xzJVwuQFwtXCtcKFwpL2EtekEtWjAtOV9dKz9cLmpwZyI7aToxMjA7czoxNDI6IihpbmNsdWRlfGluY2x1ZGVfb25jZXxyZXF1aXJlfHJlcXVpcmVfb25jZSlccypcKCpccypcJF9TRVJWRVJcW1snIl17MCwxfURPQ1VNRU5UX1JPT1RbJyJdezAsMX1cXVxzKlwuXHMqWyciXVtccyVcLkBcLVwrXChcKS9hLXpBLVowLTlfXSs/XC5naWYiO2k6MTIxO3M6MTQyOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF1ccypcLlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wucG5nIjtpOjEyMjtzOjEyMDoiKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoKlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rPy9bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wucG5nIjtpOjEyMztzOjEyMDoiKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoKlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rPy9bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wuanBnIjtpOjEyNDtzOjEyMDoiKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoKlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rPy9bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wuZ2lmIjtpOjEyNTtzOjEyMDoiKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoKlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rPy9bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wuaWNvIjtpOjEyNjtzOjEwNjoiKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoXHMqZGlybmFtZVwoXHMqX19GSUxFX19ccypcKVxzKlwuXHMqWyciXS93cC1jb250ZW50L3VwbG9hZCI7aToxMjc7czozODoic2V0VGltZW91dFwoXHMqWyciXWxvY2F0aW9uXC5yZXBsYWNlXCgiO2k6MTI4O3M6NTA6Imh0dHA6Ly93d3dcLmJpbmdcLmNvbS9zZWFyY2hcP3E9XCRxdWVyeSZwcT1cJHF1ZXJ5IjtpOjEyOTtzOjQzOiJodHRwOi8vZ29cLm1haWxcLnJ1L3NlYXJjaFw/cT1bJyJdXC5cJHF1ZXJ5IjtpOjEzMDtzOjYzOiJodHRwOi8vd3d3XC5nb29nbGVcLmNvbS9zZWFyY2hcP3E9WyciXVwuXCRxdWVyeVwuWyciXSZobD1cJGxhbmciO2k6MTMxO3M6NDM6InN0cnBvc1woXCRpbVxzKixccypbJyJdPFw/WyciXVxzKixccypcJGlcKzEiO2k6MTMyO3M6MjA6IlwkX1JFUVVFU1RcW1snIl1sYWxhIjtpOjEzMztzOjIzOiIwXHMqXChccypnenVuY29tcHJlc3NcKCI7aToxMzQ7czoxNToiZ3ppbmZsYXRlXChcKFwoIjtpOjEzNTtzOjQyOiJcJGtleVxzKj1ccypcJF9HRVRcW1snIl17MCwxfXFbJyJdezAsMX1cXTsiO2k6MTM2O3M6NzY6IlxibWFpbFwoXHMqXCRbYS16QS1aMC05X10rP1xzKixccypcJFthLXpBLVowLTlfXSs/XHMqLFxzKlwkW2EtekEtWjAtOV9dKz9ccyoiO2k6MTM3O3M6NDM6IlwkX1BPU1RcW1xzKlsnIl17MCwxfWVNYWlsQWRkWyciXXswLDF9XHMqXF0iO2k6MTM4O3M6Mjk6ImZvcGVuXChccypbJyJdXC5cLi9cLmh0YWNjZXNzIjtpOjEzOTtzOjI3OiJzdHJsZW5cKFxzKlwkcGF0aFRvRG9yXHMqXCkiO2k6MTQwO3M6NjQ6Imlzc2V0XChccypcJF9DT09LSUVcW1xzKm1kNVwoXHMqXCRfU0VSVkVSXFtccypbJyJdezAsMX1IVFRQX0hPU1QiO2k6MTQxO3M6Mjc6IkBjaGRpclwoXHMqXCRfUE9TVFxbXHMqWyciXSI7aToxNDI7czo4NDoiL2luZGV4XC5waHBcP29wdGlvbj1jb21fY29udGVudCZ2aWV3PWFydGljbGUmaWQ9WyciXVwuXCRwb3N0XFtbJyJdezAsMX1pZFsnIl17MCwxfVxdIjtpOjE0MztzOjU1OiJcJG91dFxzKlwuPVxzKlwkdGV4dHtccypcJGlccyp9XHMqXF5ccypcJGtleXtccypcJGpccyp9IjtpOjE0NDtzOjk6IkwzWmhjaTkzZCI7aToxNDU7czo0Nzoic3RydG9sb3dlclwoXHMqc3Vic3RyXChccypcJHVzZXJfYWdlbnRccyosXHMqMCwiO2k6MTQ2O3M6NTI6ImNobW9kXChccypcJFtccyVcLkBcLVwrXChcKS9hLXpBLVowLTlfXSs/XHMqLFxzKjA0MDQiO2k6MTQ3O3M6NTI6ImNobW9kXChccypcJFtccyVcLkBcLVwrXChcKS9hLXpBLVowLTlfXSs/XHMqLFxzKjA3NTUiO2k6MTQ4O3M6NDI6IkB1bWFza1woXHMqMDc3N1xzKiZccyp+XHMqXCRmaWxlcGVybWlzc2lvbiI7aToxNDk7czoyMzoiWyciXVxzKlx8XHMqL2Jpbi9zaFsnIl0iO2k6MTUwO3M6MTY6IjtccyovYmluL3NoXHMqLWkiO2k6MTUxO3M6MjY6Ij1ccypbJyJdc2VuZG1haWxccyotdFxzKi1mIjtpOjE1MjtzOjE1OiIvdG1wL3RtcC1zZXJ2ZXIiO2k6MTUzO3M6MTU6Ii90bXAvXC5JQ0UtdW5peCI7aToxNTQ7czoyOToiZXhlY1woXHMqWyciXS9iaW4vc2hbJyJdXHMqXCkiO2k6MTU1O3M6Mjc6IlwuXC4vXC5cLi9cLlwuL1wuXC4vbW9kdWxlcyI7aToxNTY7czozMzoidG91Y2hccypcKFxzKmRpcm5hbWVcKFxzKl9fRklMRV9fIjtpOjE1NztzOjQ5OiJAdG91Y2hccypcKFxzKlwkY3VyZmlsZVxzKixccypcJHRpbWVccyosXHMqXCR0aW1lIjtpOjE1ODtzOjE4OiItXCotXHMqY29uZlxzKi1cKi0iO2k6MTU5O3M6NDQ6Im9wZW5ccypcKFxzKk1ZRklMRVxzKixccypbJyJdXHMqPlxzKnRhclwudG1wIjtpOjE2MDtzOjc0OiJcJHJldCA9IFwkdGhpcy0+X2RiLT51cGRhdGVPYmplY3RcKCBcJHRoaXMtPl90YmwsIFwkdGhpcywgXCR0aGlzLT5fdGJsX2tleSI7aToxNjE7czoxOToiZGllXChccypbJyJdbm8gY3VybCI7aToxNjI7czo1NDoic3Vic3RyXChccypcJHJlc3BvbnNlXHMqLFxzKlwkaW5mb1xbXHMqWyciXWhlYWRlcl9zaXplIjtpOjE2MztzOjEwODoiaWZcKFxzKiFzb2NrZXRfc2VuZHRvXChccypcJHNvY2tldFxzKixccypcJGRhdGFccyosXHMqc3RybGVuXChccypcJGRhdGFccypcKVxzKixccyowXHMqLFxzKlwkaXBccyosXHMqXCRwb3J0IjtpOjE2NDtzOjUwOiI8aW5wdXRccyt0eXBlPXN1Ym1pdFxzK3ZhbHVlPVVwbG9hZFxzKi8+XHMqPC9mb3JtPiI7aToxNjU7czo1ODoicm91bmRccypcKFxzKlwoXHMqXCRwYWNrZXRzXHMqXCpccyo2NVwpXHMqL1xzKjEwMjRccyosXHMqMiI7aToxNjY7czo1NzoiQGVycm9yX3JlcG9ydGluZ1woXHMqMFxzKlwpO1xzKmlmXHMqXChccyohaXNzZXRccypcKFxzKlwkIjtpOjE2NztzOjQ0OiJccyo9XHMqaW5pX2dldFwoXHMqWyciXWRpc2FibGVfZnVuY3Rpb25zWyciXSI7aToxNjg7czozMDoiZWxzZVxzKntccyplY2hvXHMqWyciXWZhaWxbJyJdIjtpOjE2OTtzOjUxOiJ0eXBlPVsnIl1zdWJtaXRbJyJdXHMqdmFsdWU9WyciXVVwbG9hZCBmaWxlWyciXVxzKj4iO2k6MTcwO3M6Mzc6ImhlYWRlclwoXHMqWyciXUxvY2F0aW9uOlxzKlwkbGlua1snIl0iO2k6MTcxO3M6MzE6ImVjaG9ccypbJyJdPGI+VXBsb2FkPHNzPlN1Y2Nlc3MiO2k6MTcyO3M6NDM6Im5hbWU9WyciXXVwbG9hZGVyWyciXVxzK2lkPVsnIl11cGxvYWRlclsnIl0iO2k6MTczO3M6MjE6Ii1JL3Vzci9sb2NhbC9iYW5kbWFpbiI7aToxNzQ7czoyNDoidW5saW5rXChccypfX0ZJTEVfX1xzKlwpIjtpOjE3NTtzOjU2OiJtYWlsXChccypcJGFyclxbWyciXXRvWyciXVxdXHMqLFxzKlwkYXJyXFtbJyJdc3VialsnIl1cXSI7aToxNzY7czoxMzA6ImlmXChpc3NldFwoXCRfUkVRVUVTVFxbWyciXVthLXpBLVowLTlfXSs/WyciXVxdXClcKVxzKntccypcJFthLXpBLVowLTlfXSs/XHMqPVxzKlwkX1JFUVVFU1RcW1snIl1bYS16QS1aMC05X10rP1snIl1cXTtccypleGl0XChcKTsiO2k6MTc3O3M6MTM6Im51bGxfZXhwbG9pdHMiO2k6MTc4O3M6NDg6IjxcP1xzKlwkW2EtekEtWjAtOV9dKz9cKFxzKlwkW2EtekEtWjAtOV9dKz9ccypcKSI7aToxNzk7czo5OiJ0bXZhc3luZ3IiO2k6MTgwO3M6MTI6InRtaGFwYnpjZXJmZiI7aToxODE7czoxMzoib25mcjY0X3FycGJxciI7aToxODI7czoxNDoiWyciXW5mZnJlZ1snIl0iO2k6MTgzO3M6OToiZmdlX2ViZzEzIjtpOjE4NDtzOjc6ImN1Y3Zhc2IiO2k6MTg1O3M6MTQ6IlsnIl1mbGZncnpbJyJdIjtpOjE4NjtzOjEyOiJbJyJdcmlueVsnIl0iO2k6MTg3O3M6OToiZXRhbGZuaXpnIjtpOjE4ODtzOjEyOiJzc2VycG1vY251emciO2k6MTg5O3M6MTM6ImVkb2NlZF80NmVzYWIiO2k6MTkwO3M6MTQ6IlsnIl10cmVzc2FbJyJdIjtpOjE5MTtzOjE3OiJbJyJdMzF0b3JfcnRzWyciXSI7aToxOTI7czoxNToiWyciXW9mbmlwaHBbJyJdIjtpOjE5MztzOjE0OiJbJyJdZmxmZ3J6WyciXSI7aToxOTQ7czoxMjoiWyciXXJpbnlbJyJdIjtpOjE5NTtzOjQ0OiJAXCRbYS16QS1aMC05X10rP1woXHMqXCRbYS16QS1aMC05X10rP1xzKlwpOyI7aToxOTY7czo0ODoicGFyc2VfcXVlcnlfc3RyaW5nXChccypcJEVOVntccypbJyJdUVVFUllfU1RSSU5HIjtpOjE5NztzOjMxOiJldmFsXHMqXChccyptYl9jb252ZXJ0X2VuY29kaW5nIjtpOjE5ODtzOjI0OiJcKVxzKntccypwYXNzdGhydVwoXHMqXCQiO2k6MTk5O3M6MTU6IkhUVFBfQUNDRVBUX0FTRSI7aToyMDA7czoyMToiZnVuY3Rpb25ccypDdXJsQXR0YWNrIjtpOjIwMTtzOjE1OiJAc3lzdGVtXChccyoiXCQiO2k6MjAyO3M6MjM6ImVjaG9cKFxzKmh0bWxcKFxzKmFycmF5IjtpOjIwMztzOjU2OiJcJGNvZGU9WyciXSUxc2NyaXB0XHMqdHlwZT1cXFsnIl10ZXh0L2phdmFzY3JpcHRcXFsnIl0lMyI7aToyMDQ7czoyMjoiYXJyYXlcKFxzKlsnIl0lMWh0bWwlMyI7aToyMDU7czoxOToiYnVkYWtccyotXHMqZXhwbG9pdCI7aToyMDY7czo5MDoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilccypcKFxzKlsnIl1cJFthLXpBLVowLTlfXSs/WyciXVxzKlwpIjtpOjIwNztzOjk6IkdBR0FMPC9iPiI7aToyMDg7czozODoiZXhpdFwoWyciXTxzY3JpcHQ+ZG9jdW1lbnRcLmxvY2F0aW9uXC4iO2k6MjA5O3M6Mzc6ImRpZVwoWyciXTxzY3JpcHQ+ZG9jdW1lbnRcLmxvY2F0aW9uXC4iO2k6MjEwO3M6MzY6InNldF90aW1lX2xpbWl0XChccyppbnR2YWxcKFxzKlwkYXJndiI7aToyMTE7czo0NDoiaGVhZGVyXChccypbJyJdUmVmcmVzaDpccypcZCs7XHMqVVJMPWh0dHA6Ly8iO2k6MjEyO3M6MzM6ImVjaG9ccypcJHByZXd1ZVwuXCRsb2dcLlwkcG9zdHd1ZSI7aToyMTM7czo0MjoiY29ublxzKj1ccypodHRwbGliXC5IVFRQQ29ubmVjdGlvblwoXHMqdXJpIjtpOjIxNDtzOjM2OiJpZlxzKlwoXHMqXCRfUE9TVFxbWyciXXswLDF9Y2htb2Q3NzciO2k6MjE1O3M6Mzg6IlJld3JpdGVDb25kXHMqJXtIVFRQX1JFRkVSRVJ9XHMqeWFuZGV4IjtpOjIxNjtzOjM4OiJSZXdyaXRlQ29uZFxzKiV7SFRUUF9SRUZFUkVSfVxzKmdvb2dsZSI7aToyMTc7czoyNjoiPFw/XHMqZWNob1xzKlwkY29udGVudDtcPz4iO2k6MjE4O3M6ODY6IlwkdXJsXHMqXC49XHMqWyciXVw/W2EtekEtWjAtOV9dKz89WyciXVxzKlwuXHMqXCRfR0VUXFtccypbJyJdW2EtekEtWjAtOV9dKz9bJyJdXHMqXF07IjtpOjIxOTtzOjEwOToiY29weVwoXHMqXCRfRklMRVNcW1xzKlsnIl17MCwxfVthLXpBLVowLTlfXSs/WyciXXswLDF9XHMqXF1cW1xzKlsnIl17MCwxfXRtcF9uYW1lWyciXXswLDF9XHMqXF1ccyosXHMqXCRfUE9TVCI7aToyMjA7czoxMTY6Im1vdmVfdXBsb2FkZWRfZmlsZVwoXHMqXCRfRklMRVNcW1xzKlsnIl17MCwxfVthLXpBLVowLTlfXSs/WyciXXswLDF9XHMqXF1cW1snIl17MCwxfXRtcF9uYW1lWyciXXswLDF9XF1cW1xzKlwkaVxzKlxdIjtpOjIyMTtzOjMyOiJkbnNfZ2V0X3JlY29yZFwoXHMqXCRkb21haW5ccypcLiI7aToyMjI7czozNDoiZnVuY3Rpb25fZXhpc3RzXHMqXChccypbJyJdZ2V0bXhyciI7aToyMjM7czoyNDoibnNsb29rdXBcLmV4ZVxzKi10eXBlPU1YIjtpOjIyNDtzOjEyOiJuZXdccypNQ3VybDsiO2k6MjI1O3M6NDQ6IlwkZmlsZV9kYXRhXHMqPVxzKlsnIl08c2NyaXB0XHMqc3JjPVsnIl1odHRwIjtpOjIyNjtzOjQwOiJmcHV0c1woXCRmcCxccypbJyJdSVA6XHMqXCRpcFxzKi1ccypEQVRFIjtpOjIyNztzOjI4OiJjaG1vZFwoXHMqX19ESVJfX1xzKixccyowNDAwIjtpOjIyODtzOjQwOiJDb2RlTWlycm9yXC5kZWZpbmVNSU1FXChccypbJyJddGV4dC9taXJjIjtpOjIyOTtzOjQzOiJcXVxzKlwpXHMqXC5ccypbJyJdXFxuXD8+WyciXVxzKlwpXHMqXClccyp7IjtpOjIzMDtzOjY3OiJcJGd6cFxzKj1ccypcJGJnekV4aXN0XHMqXD9ccypAZ3pvcGVuXChcJHRtcGZpbGUsXHMqWyciXXJiWyciXVxzKlwpIjtpOjIzMTtzOjc1OiJmdW5jdGlvbjxzcz5zbXRwX21haWxcKFwkdG9ccyosXHMqXCRzdWJqZWN0XHMqLFxzKlwkbWVzc2FnZVxzKixccypcJGhlYWRlcnMiO2k6MjMyO3M6NjQ6IlwkX1BPU1RcW1snIl17MCwxfWFjdGlvblsnIl17MCwxfVxdXHMqPT1ccypbJyJdZ2V0X2FsbF9saW5rc1snIl0iO2k6MjMzO3M6Mzg6Ij1ccypnemluZmxhdGVcKFxzKmJhc2U2NF9kZWNvZGVcKFxzKlwkIjtpOjIzNDtzOjQxOiJjaG1vZFwoXCRmaWxlLT5nZXRQYXRobmFtZVwoXClccyosXHMqMDc3NyI7aToyMzU7czo2MzoiXCRfUE9TVFxbWyciXXswLDF9dHAyWyciXXswLDF9XF1ccypcKVxzKmFuZFxzKmlzc2V0XChccypcJF9QT1NUIjtpOjIzNjtzOjI0NToiXCRbYS16QS1aMC05X10rP1xzKj1ccypcJFthLXpBLVowLTlfXSs/XChbJyJdWyciXVxzKixccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XChccypbJyJdW2EtekEtWjAtOV9dKz9bJyJdXHMqLFxzKlsnIl1bJyJdXHMqLFxzKlwkW2EtekEtWjAtOV9dKz9ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9ccypcKVxzKlwpXHMqXCkiO2k6MjM3O3M6MTEwOiJoZWFkZXJcKFxzKlsnIl1Db250ZW50LVR5cGU6XHMqaW1hZ2UvanBlZ1snIl1ccypcKTtccypyZWFkZmlsZVwoXHMqWyciXVthLXpBLVowLTlfXSs/WyciXVxzKlwpO1xzKmV4aXRcKFxzKlwpOyI7aToyMzg7czozMToiPT5ccypAXCRmMlwoX19GSUxFX19ccyosXHMqXCRmMSI7aToyMzk7czo4NDoiZXZhbFwoXHMqW2EtekEtWjAtOV9dKz9cKFxzKlwkW2EtekEtWjAtOV9dKz9ccyosXHMqXCRbYS16QS1aMC05X10rP1xzKlwpXHMqXCk7XHMqXD8+IjtpOjI0MDtzOjM3OiJpZlxzKlwoXHMqaXNfY3Jhd2xlcjFcKFxzKlwpXHMqXClccyp7IjtpOjI0MTtzOjQ4OiJcJGVjaG9fMVwuXCRlY2hvXzJcLlwkZWNob18zXC5cJGVjaG9fNFwuXCRlY2hvXzUiO2k6MjQyO3M6MzU6ImZpbGVfZ2V0X2NvbnRlbnRzXChccypfX0ZJTEVfX1xzKlwpIjtpOjI0MztzOjgxOiJAKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFxzKkB1cmxlbmNvZGVcKFxzKlwkX1BPU1QiO2k6MjQ0O3M6OTc6IlwkR0xPQkFMU1xbWyciXVthLXpBLVowLTlfXSs/WyciXVxdXFtcJEdMT0JBTFNcW1snIl1bYS16QS1aMC05X10rP1snIl1cXVxbXGQrXF1cKHJvdW5kXChcZCtcKVwpXF0iO2k6MjQ1O3M6MjU6ImZ1bmN0aW9uXHMrZXJyb3JfNDA0XChcKXsiO2k6MjQ2O3M6NjY6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChccypbJyJdcGVybCI7aToyNDc7czo2ODoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFxzKlsnIl1weXRob24iO2k6MjQ4O3M6NzQ6ImlmXHMqXChpc3NldFwoXCRfR0VUXFtbJyJdW2EtekEtWjAtOV9dKz9bJyJdXF1cKVwpXHMqe1xzKmVjaG9ccypbJyJdb2tbJyJdIjtpOjI0OTtzOjM5OiJyZWxwYXRodG9hYnNwYXRoXChccypcJF9HRVRcW1xzKlsnIl1jcHkiO2k6MjUwO3M6Mjc6IiE9XHMqWyciXWluZm9ybWF0aW9uX3NjaGVtYSI7aToyNTE7czo0NjoiaHR0cDovLy4rPy8uKz9cLnBocFw/YT1cZCsmYz1bYS16QS1aMC05X10rPyZzPSI7aToyNTI7czoxNTA6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXVwkW2EtekEtWjAtOV9dKz89QFthLXpBLVowLTlfXSs/XChbJyJdLis/WyciXVwpO1thLXpBLVowLTlfXSs/XCghXCRbYS16QS1aMC05X10rP1wpe1wkW2EtekEtWjAtOV9dKz89QFthLXpBLVowLTlfXSs/XChccypcKSI7aToyNTM7czoxNjoiZnVuY3Rpb25ccyt3c29FeCI7aToyNTQ7czo1MToiZm9yZWFjaFwoXHMqXCR0b3Nccyphc1xzKlwkdG9cKVxzKntccyptYWlsXChccypcJHRvIjtpOjI1NTtzOjEwMjoiaGVhZGVyXChccypbJyJdQ29udGVudC1UeXBlOlxzKmltYWdlL2pwZWdbJyJdXHMqXCk7XHMqcmVhZGZpbGVcKFsnIl1odHRwOi8vLis/XC5qcGdbJyJdXCk7XHMqZXhpdFwoXCk7IjtpOjI1NjtzOjEyOiI8XD89XCRjbGFzczsiO2k6MjU3O3M6NTA6IjxpbnB1dFxzKnR5cGU9ImZpbGUiXHMqc2l6ZT0iXGQrIlxzKm5hbWU9InVwbG9hZCI+IjtpOjI1ODtzOjExMDoiXCRtZXNzYWdlc1xbXF1ccyo9XHMqXCRfRklMRVNcW1xzKlsnIl17MCwxfXVzZXJmaWxlWyciXXswLDF9XHMqXF1cW1xzKlsnIl17MCwxfW5hbWVbJyJdezAsMX1ccypcXVxbXHMqXCRpXHMqXF0iO2k6MjU5O3M6NTU6IjxpbnB1dFxzKnR5cGU9WyciXWZpbGVbJyJdXHMqbmFtZT1bJyJddXNlcmZpbGVbJyJdXHMqLz4iO2k6MjYwO3M6MTM6IkRldmFydFxzK0hUVFAiO2k6MjYxO3M6OTA6IkBcJHtccypbYS16QS1aMC05X10rP1xzKn1cKFxzKlsnIl1bJyJdXHMqLFxzKlwke1xzKlthLXpBLVowLTlfXSs/XHMqfVwoXHMqXCRbYS16QS1aMC05X10rPyI7aToyNjI7czo5NToiXCRHTE9CQUxTXFtccypbJyJdezAsMX1bYS16QS1aMC05X10rP1snIl17MCwxfVxzKlxdXChccypcJFthLXpBLVowLTlfXSs/XFtccypcJFthLXpBLVowLTlfXSs/XF0iO2k6MjYzO3M6NTM6ImVycm9yX3JlcG9ydGluZ1woXHMqMFxzKlwpO1xzKlwkdXJsXHMqPVxzKlsnIl1odHRwOi8vIjtpOjI2NDtzOjYwOiJcJFthLXpBLVowLTlfXSs/XFtccypcZCtccyouXHMqXGQrXHMqXF1cKFxzKlthLXpBLVowLTlfXSs/XCgiO2k6MjY1O3M6MTI0OiJcJFthLXpBLVowLTlfXSs/PVsnIl1odHRwOi8vLis/WyciXTtccypcJFthLXpBLVowLTlfXSs/PWZvcGVuXChcJFthLXpBLVowLTlfXSs/LFsnIl1yWyciXVwpO1xzKnJlYWRmaWxlXChcJFthLXpBLVowLTlfXSs/XCk7IjtpOjI2NjtzOjc1OiJhcnJheVwoXHMqWyciXTwhLS1bJyJdXHMqXC5ccyptZDVcKFxzKlwkcmVxdWVzdF91cmxccypcLlxzKnJhbmRcKFxkKyxccypcZCsiO2k6MjY3O3M6MTQ6Indzb0hlYWRlclxzKlwoIjtpOjI2ODtzOjY5OiJlY2hvXChbJyJdPGZvcm0gbWV0aG9kPVsnIl1wb3N0WyciXVxzKmVuY3R5cGU9WyciXW11bHRpcGFydC9mb3JtLWRhdGEiO2k6MjY5O3M6NDM6ImZpbGVfZ2V0X2NvbnRlbnRzXChccypiYXNlNjRfZGVjb2RlXChccypcJF8iO2k6MjcwO3M6NTg6InJlbHBhdGh0b2Fic3BhdGhcKFxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6MjcxO3M6NDA6Im1haWxcKFwkdG9ccyosXHMqWyciXS4rP1snIl1ccyosXHMqXCR1cmwiO2k6MjcyO3M6NTE6ImlmXHMqXChccyohZnVuY3Rpb25fZXhpc3RzXChccypbJyJdc3lzX2dldF90ZW1wX2RpciI7aToyNzM7czoxNzoiPHRpdGxlPlxzKlZhUlZhUmEiO2k6Mjc0O3M6Mzg6ImVsc2VpZlwoXHMqXCRzcWx0eXBlXHMqPT1ccypbJyJdc3FsaXRlIjtpOjI3NTtzOjM1OiI9PVxzKkZBTFNFXHMqXD9ccypcZCtccyo6XHMqaXAybG9uZyI7aToyNzY7czoxOToiPVsnIl1cKVxzKlwpO1xzKlw/PiI7aToyNzc7czoyNDoiZWNob1xzK2Jhc2U2NF9kZWNvZGVcKFwkIjtpOjI3ODtzOjUyOiJcI1thLXpBLVowLTlfXSs/XCMuKz88L3NjcmlwdD4uKz9cIy9bYS16QS1aMC05X10rP1wjIjtpOjI3OTtzOjM0OiJmdW5jdGlvblxzK19fZmlsZV9nZXRfdXJsX2NvbnRlbnRzIjtpOjI4MDtzOjI1OiJldmFsXChccypcJFthLXpBLVowLTlfXSs/IjtpOjI4MTtzOjU1OiJcJGZccyo9XHMqXCRmXGQrXChbJyJdWyciXVxzKixccypldmFsXChcJFthLXpBLVowLTlfXSs/IjtpOjI4MjtzOjMyOiJldmFsXChcJGNvbnRlbnRcKTtccyplY2hvXHMqWyciXSI7aToyODM7czoyOToiQ1VSTE9QVF9VUkxccyosXHMqWyciXXNtdHA6Ly8iO2k6Mjg0O3M6Nzc6IjxoZWFkPlxzKjxzY3JpcHQ+XHMqd2luZG93XC50b3BcLmxvY2F0aW9uXC5ocmVmPVsnIl0uKz9ccyo8L3NjcmlwdD5ccyo8L2hlYWQ+IjtpOjI4NTtzOjcyOiJcJFthLXpBLVowLTlfXSs/XHMqPVxzKmZvcGVuXChccypbJyJdW2EtekEtWjAtOV9dKz9cLnBocFsnIl1ccyosXHMqWyciXXciO2k6Mjg2O3M6MTY6IkBhc3NlcnRcKFxzKlsnIl0iO2k6Mjg3O3M6ODM6IlwkW2EtekEtWjAtOV9dKz89XCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1xzKlsnIl1kb1snIl1ccypcXTtccyppbmNsdWRlIjtpOjI4ODtzOjc5OiJlY2hvXHMrXCRbYS16QS1aMC05X10rPztta2RpclwoXHMqWyciXVthLXpBLVowLTlfXSs/WyciXVxzKlwpO2ZpbGVfcHV0X2NvbnRlbnRzIjtpOjI4OTtzOjYxOiJcJGZyb21ccyo9XHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1xzKlsnIl1mcm9tIjtpOjI5MDtzOjE5OiI9XHMqeGRpclwoXHMqXCRwYXRoIjtpOjI5MTtzOjMxOiJcJF9bYS16QS1aMC05X10rP1woXHMqXCk7XHMqXD8+IjtpOjI5MjtzOjEwOiJ0YXJccystemNDIjtpOjI5MztzOjgzOiJlY2hvXHMrc3RyX3JlcGxhY2VcKFxzKlsnIl1cW1BIUF9TRUxGXF1bJyJdXHMqLFxzKmJhc2VuYW1lXChcJF9TRVJWRVJcW1snIl1QSFBfU0VMRiI7aToyOTQ7czo0MToiZnVuY3Rpb25fZXhpc3RzXChccypbJyJdZlwkW2EtekEtWjAtOV9dKz8iO2k6Mjk1O3M6NDA6IlwkY3VyX2NhdF9pZFxzKj1ccypcKFxzKmlzc2V0XChccypcJF9HRVQiO2k6Mjk2O3M6MzU6ImhyZWY9WyciXTxcP3BocFxzK2VjaG9ccytcJGN1cl9wYXRoIjtpOjI5NztzOjMzOiI9XHMqZXNjX3VybFwoXHMqc2l0ZV91cmxcKFxzKlsnIl0iO2k6Mjk4O3M6ODU6Il5ccyo8XD9waHBccypoZWFkZXJcKFxzKlsnIl1Mb2NhdGlvbjpccypbJyJdXHMqXC5ccypbJyJdXHMqaHR0cDovLy4rP1snIl1ccypcKTtccypcPz4iO2k6Mjk5O3M6MTQ6Ijx0aXRsZT5ccyppdm56IjtpOjMwMDtzOjYzOiJeXHMqPFw/cGhwXHMqaGVhZGVyXChbJyJdTG9jYXRpb246XHMqaHR0cDovLy4rP1snIl1ccypcKTtccypcPz4iO2k6MzAxO3M6NjE6ImdldF91c2Vyc1woXHMqYXJyYXlcKFxzKlsnIl1yb2xlWyciXVxzKj0+XHMqWyciXWFkbWluaXN0cmF0b3IiO2k6MzAyO3M6NjU6IlwkdG9ccyo9XHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1xzKlsnIl10b19hZGRyZXNzIjtpOjMwMztzOjE5OiJpbWFwX2hlYWRlcmluZm9cKFwkIjtpOjMwNDtzOjU4OiJcJFthLXpBLVowLTlfXSs/XFtccypfW2EtekEtWjAtOV9dKz9cKFxzKlxkK1xzKlwpXHMqXF1ccyo9IjtpOjMwNTtzOjM0OiJldmFsXChccypbJyJdXD8+WyciXVxzKlwuXHMqam9pblwoIjtpOjMwNjtzOjM1OiJiZWdpblxzK21vZDpccytUaGFua3Nccytmb3Jccytwb3N0cyI7aTozMDc7czo5MzoiXCRbYS16QS1aMC05X10rPz1bJyJdW2EtekEtWjAtOVwrXD1fXStbJyJdO1xzKmVjaG9ccytiYXNlNjRfZGVjb2RlXChcJFthLXpBLVowLTlfXSs/XCk7XHMqXD8+IjtpOjMwODtzOjYzOiJcJFthLXpBLVowLTlfXSs/LT5fc2NyaXB0c1xbXHMqZ3p1bmNvbXByZXNzXChccypiYXNlNjRfZGVjb2RlXCgiO2k6MzA5O3M6MzI6IlsnIl1ccypcXlxzKlwkW2EtekEtWjAtOV9dKz9ccyo7IjtpOjMxMDtzOjY4OiJcJFthLXpBLVowLTlfXSs/XHMqXC5ccypcJFthLXpBLVowLTlfXSs/XHMqXF5ccypcJFthLXpBLVowLTlfXSs/XHMqOyI7aTozMTE7czoxMjI6ImlmXChpc3NldFwoXCRfUkVRVUVTVFxbWyciXVthLXpBLVowLTlfXSs/WyciXVxdXClccyomJlxzKm1kNVwoXCRfUkVRVUVTVFxbWyciXXswLDF9W2EtekEtWjAtOV9dKz9bJyJdezAsMX1cXVwpXHMqPT1ccypbJyJdIjtpOjMxMjtzOjEyOiJcLnd3dy8vOnB0dGgiO2k6MzEzO3M6NjM6IiU2MyU3MiU2OSU3MCU3NCUyRSU3MyU3MiU2MyUzRCUyNyU2OCU3NCU3NCU3MCUzQSUyRiUyRiU3MyU2RiU2MSI7aTozMTQ7czoyNzoid3Atb3B0aW9uc1wucGhwXHMqPlxzKkVycm9yIjtpOjMxNTtzOjg5OiJzdHJfcmVwbGFjZVwoYXJyYXlcKFsnIl1maWx0ZXJTdGFydFsnIl0sWyciXWZpbHRlckVuZFsnIl1cKSxccyphcnJheVwoWyciXVwqL1snIl0sWyciXS9cKiI7aTozMTY7czozNzoiZmlsZV9nZXRfY29udGVudHNcKF9fRklMRV9fXCksXCRtYXRjaCI7aTozMTc7czozMDoidG91Y2hcKFxzKmRpcm5hbWVcKFxzKl9fRklMRV9fIjtpOjMxODtzOjE1OiJbJyJdXClcKVwpOyJcKTsiO2k6MzE5O3M6MjE6Ilx8Ym90XHxzcGlkZXJcfHdnZXQvaSI7aTozMjA7czoxNDoiIS91c3IvYmluL3BlcmwiO2k6MzIxO3M6NjM6InN0cl9yZXBsYWNlXChbJyJdPC9ib2R5PlsnIl0sW2EtekEtWjAtOV9dKz9cLlsnIl08L2JvZHk+WyciXSxcJCI7aTozMjI7czozNDoiZXhwbG9kZVwoWyciXTt0ZXh0O1snIl0sXCRyb3dcWzBcXSI7aTozMjM7czo5MjoibWFpbFwoXHMqc3RyaXBzbGFzaGVzXChccypcJFthLXpBLVowLTlfXSs/XHMqXClccyosXHMqc3RyaXBzbGFzaGVzXChccypcJFthLXpBLVowLTlfXSs/XHMqXCkiO2k6MzI0O3M6MjExOiI9XHMqbWFpbFwoXHMqc3RyaXBzbGFzaGVzXChccypcJF9QT1NUXFtbJyJdezAsMX1bYS16QS1aMC05X10rP1snIl17MCwxfVxdXClccyosXHMqc3RyaXBzbGFzaGVzXChccypcJF9QT1NUXFtbJyJdezAsMX1bYS16QS1aMC05X10rP1snIl17MCwxfVxdXClccyosXHMqc3RyaXBzbGFzaGVzXChccypcJF9QT1NUXFtbJyJdezAsMX1bYS16QS1aMC05X10rP1snIl17MCwxfVxdIjtpOjMyNTtzOjE1NjoiPVxzKm1haWxcKFxzKlwkX1BPU1RcW1snIl17MCwxfVthLXpBLVowLTlfXSs/WyciXXswLDF9XF1ccyosXHMqXCRfUE9TVFxbWyciXXswLDF9W2EtekEtWjAtOV9dKz9bJyJdezAsMX1cXVxzKixccypcJF9QT1NUXFtbJyJdezAsMX1bYS16QS1aMC05X10rP1snIl17MCwxfVxdIjtpOjMyNjtzOjE0OiJMaWJYbWwySXNCdWdneSI7aTozMjc7czo0NjoiQGVycm9yX3JlcG9ydGluZ1woMFwpO1xzKkBzZXRfdGltZV9saW1pdFwoMFwpOyI7aTozMjg7czo5OiJtYWFmXHMreWEiO2k6MzI5O3M6MzU6ImVjaG8gW2EtekEtWjAtOV9dKz9ccypcKFsnIl1odHRwOi8vIjtpOjMzMDtzOjQ4OiJcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXWFzc3VudG8iO2k6MzMxO3M6MTI6ImBjaGVja3N1ZXhlYyI7aTozMzI7czoxODoid2hpY2hccytzdXBlcmZldGNoIjtpOjMzMztzOjQ1OiJybWRpcnNcKFwkZGlyXHMqXC5ccypbJyJdL1snIl1ccypcLlxzKlwkY2hpbGQiO2k6MzM0O3M6NDI6ImV4cGxvZGVcKFxzKlxcWyciXTt0ZXh0O1xcWyciXVxzKixccypcJHJvdyI7aTozMzU7czozNzoiPVxzKlsnIl1waHBfdmFsdWVccythdXRvX3ByZXBlbmRfZmlsZSI7aTozMzY7czozNToiaWZccypcKFxzKmlzX3dyaXRhYmxlXChccypcJHd3d1BhdGgiO2k6MzM3O3M6NDc6ImZvcGVuXChccypcJFthLXpBLVowLTlfXSs/XHMqXC5ccypbJyJdL3dwLWFkbWluIjtpOjMzODtzOjIyOiJyZXR1cm5ccypbJyJdL3Zhci93d3cvIjtpOjMzOTtzOjY1OiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqWyciXS92YXIvd3d3LyI7aTozNDA7czo2MjoiKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoKlxzKlsnIl0vaG9tZS8iO2k6MzQxO3M6MjA5OiJcJFthLXpBLVowLTlfXSs/XHMqPVxzKlwkX1JFUVVFU1RcW1snIl17MCwxfVthLXpBLVowLTlfXSs/WyciXXswLDF9XF07XHMqXCRbYS16QS1aMC05X10rP1xzKj1ccyphcnJheVwoXHMqXCRfUkVRVUVTVFxbXHMqWyciXXswLDF9W2EtekEtWjAtOV9dKz9bJyJdezAsMX1ccypcXVxzKlwpO1xzKlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqYXJyYXlfZmlsdGVyXChccypcJCI7aTozNDI7czoxOTI6IlwkW2EtekEtWjAtOV9dKz9ccyp7XHMqXGQrXHMqfVwuXCRbYS16QS1aMC05X10rP1xzKntccypcZCtccyp9XC5cJFthLXpBLVowLTlfXSs/XHMqe1xzKlxkK1xzKn1cLlwkW2EtekEtWjAtOV9dKz9ccyp7XHMqXGQrXHMqfVwuXCRbYS16QS1aMC05X10rP1xzKntccypcZCtccyp9XC5cJFthLXpBLVowLTlfXSs/XHMqe1xzKlxkK1xzKn1cLiI7aTozNDM7czoxNjoidGFncy9cJDYvXCQ0L1wkNyI7aTozNDQ7czozMDoic3RyX3JlcGxhY2VcKFxzKlsnIl1cLmh0YWNjZXNzIjtpOjM0NTtzOjQ0OiJmdW5jdGlvblxzK19cZCtcKFxzKlwkW2EtekEtWjAtOV9dKz9ccypcKXtcJCI7aTozNDY7czoyMToiZXhwbG9kZVwoXFxbJyJdO3RleHQ7IjtpOjM0NztzOjEyNjoic3Vic3RyXChccypcJFthLXpBLVowLTlfXSs/XHMqLFxzKlxkK1xzKixccypcZCtccypcKTtccypcJFthLXpBLVowLTlfXSs/XHMqPVxzKnByZWdfcmVwbGFjZVwoXHMqXCRbYS16QS1aMC05X10rP1xzKixccypzdHJ0clwoIjtpOjM0ODtzOjY2OiJhcnJheV9mbGlwXChccyphcnJheV9tZXJnZVwoXHMqcmFuZ2VcKFxzKlsnIl1BWyciXVxzKixccypbJyJdWlsnIl0iO2k6MzQ5O3M6NjM6IlwkX1NFUlZFUlxbXHMqWyciXURPQ1VNRU5UX1JPT1RbJyJdXHMqXF1ccypcLlxzKlsnIl0vXC5odGFjY2VzcyI7aTozNTA7czozMToiXCRpbnNlcnRfY29kZVxzKj1ccypbJyJdPGlmcmFtZSI7aTozNTE7czo0MToiYXNzZXJ0X29wdGlvbnNcKFxzKkFTU0VSVF9XQVJOSU5HXHMqLFxzKjAiO2k6MzUyO3M6MTU6Ik11c3RAZkBccytTaGVsbCI7aTozNTM7czo2NzoiZXZhbFwoXHMqXCRbYS16QS1aMC05X10rP1woXHMqXCRbYS16QS1aMC05X10rP1woXHMqXCRbYS16QS1aMC05X10rPyI7aTozNTQ7czozNDoiZnVuY3Rpb25fZXhpc3RzXChccypbJyJdcGNudGxfZm9yayI7aTozNTU7czo0MDoic3RyX3JlcGxhY2VcKFsnIl1cLmh0YWNjZXNzWyciXVxzKixccypcJCI7aTozNTY7czozMzoiPVxzKkAqZ3ppbmZsYXRlXChccypzdHJyZXZcKFxzKlwkIjtpOjM1NztzOjIyOiJnXChccypbJyJdRmlsZXNNYW5bJyJdIjtpOjM1ODtzOjExNzoiXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1cKFxzKlsnIl1bJyJdXHMqLFxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXChccypcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwpIjtpOjM1OTtzOjMzOiJcJFthLXpBLVowLTlfXSs/XChccypAXCRfQ09PS0lFXFsiO2k6MzYwO3M6MTMzOiJcJFthLXpBLVowLTlfXSs/XHMqXC49XHMqXCRbYS16QS1aMC05X10rP3tcZCt9XHMqXC5ccypcJFthLXpBLVowLTlfXSs/e1xkK31ccypcLlxzKlwkW2EtekEtWjAtOV9dKz97XGQrfVxzKlwuXHMqXCRbYS16QS1aMC05X10rP3tcZCt9IjtpOjM2MTtzOjc0OiJzdHJwb3NcKFwkbCxbJyJdTG9jYXRpb25bJyJdXCkhPT1mYWxzZVx8XHxzdHJwb3NcKFwkbCxbJyJdU2V0LUNvb2tpZVsnIl1cKSI7aTozNjI7czo5NzoiYWRtaW4vWyciXSxbJyJdYWRtaW5pc3RyYXRvci9bJyJdLFsnIl1hZG1pbjEvWyciXSxbJyJdYWRtaW4yL1snIl0sWyciXWFkbWluMy9bJyJdLFsnIl1hZG1pbjQvWyciXSI7aTozNjM7czoyODoic3RyX3JlcGxhY2VcKFsnIl0vXD9hbmRyWyciXSI7aTozNjQ7czoxNToiWyciXWNoZWNrc3VleGVjIjtpOjM2NTtzOjU1OiJpZlxzKlwoXHMqXCR0aGlzLT5pdGVtLT5oaXRzXHMqPj1bJyJdXGQrWyciXVwpXHMqe1xzKlwkIjtpOjM2NjtzOjQ3OiJleHBsb2RlXChbJyJdXFxuWyciXSxccypcJF9QT1NUXFtbJyJddXJsc1snIl1cXSI7aTozNjc7czoxMTY6ImlmXChpbmlfZ2V0XChbJyJdYWxsb3dfdXJsX2ZvcGVuWyciXVwpXHMqPT1ccyoxXClccyp7XHMqXCRbYS16QS1aMC05X10rP1xzKj1ccypmaWxlX2dldF9jb250ZW50c1woXCRbYS16QS1aMC05X10rP1wpIjtpOjM2ODtzOjEyMjoiaWZcKFxzKlwkZnBccyo9XHMqZnNvY2tvcGVuXChcJHVcW1snIl1ob3N0WyciXVxdLCFlbXB0eVwoXCR1XFtbJyJdcG9ydFsnIl1cXVwpXHMqXD9ccypcJHVcW1snIl1wb3J0WyciXVxdXHMqOlxzKjgwXHMqXClcKXsiO2k6MzY5O3M6MjI6InJ1bmtpdF9mdW5jdGlvbl9yZW5hbWUiO2k6MzcwO3M6ODM6ImluY2x1ZGVcKFxzKlsnIl1kYXRhOnRleHQvcGxhaW47YmFzZTY0XHMqLFxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFs7IjtpOjM3MTtzOjIxOiJpbmNsdWRlXChccypbJyJdemxpYjoiO2k6MzcyO3M6NzA6IlwkZG9jXHMqPVxzKkpGYWN0b3J5OjpnZXREb2N1bWVudFwoXCk7XHMqXCRkb2MtPmFkZFNjcmlwdFwoWyciXWh0dHA6Ly8iO2k6MzczO3M6MzA6IlwkZGVmYXVsdF91c2VfYWpheFxzKj1ccyp0cnVlOyI7aTozNzQ7czoxMDoiZGVrY2FoWyciXSI7aTozNzU7czoyMzoic3Vic3RyXChtZDVcKHN0cnJldlwoXCQiO2k6Mzc2O3M6MTM6Ij09WyciXVwpXHMqXC4iO2k6Mzc3O3M6MTA1OiJpZlxzKlwoXHMqXChccypcJFthLXpBLVowLTlfXSs/XHMqPVxzKnN0cnJwb3NcKFwkW2EtekEtWjAtOV9dKz9ccyosXHMqWyciXVw/PlsnIl1ccypcKVxzKlwpXHMqPT09XHMqZmFsc2UiO2k6Mzc4O3M6MTU2OiJcJF9TRVJWRVJcW1snIl1ET0NVTUVOVF9ST09UWyciXVxzKlwuXHMqWyciXS9bJyJdXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XHMqXC5ccypbJyJdL1snIl1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9ccypcLlxzKlsnIl0vWyciXVxzKlwuXHMqXCRbYS16QS1aMC05X10rPywiO2k6Mzc5O3M6MzA6ImZvcGVuXHMqXChccypbJyJdYmFkX2xpc3RcLnR4dCI7aTozODA7czo0OToiQCpmaWxlX2dldF9jb250ZW50c1woQCpiYXNlNjRfZGVjb2RlXChAKnVybGRlY29kZSI7aTozODE7czoyNjoiXCR7W2EtekEtWjAtOV9dKz99XChccypcKTsiO2k6MzgyO3M6NjA6InN1YnN0clwoc3ByaW50ZlwoWyciXSVvWyciXSxccypmaWxlcGVybXNcKFwkZmlsZVwpXCksXHMqLTRcKSI7aTozODM7czo1NzoiXCRbYS16QS1aMC05X10rP1woWyciXVsnIl1ccyosXHMqZXZhbFwoXCRbYS16QS1aMC05X10rP1wpIjtpOjM4NDtzOjE2OiJ3c29TZWNQYXJhbVxzKlwoIjtpOjM4NTtzOjE4OiJ3aGljaFxzK3N1cGVyZmV0Y2giO2k6Mzg2O3M6Njg6ImNvcHlcKFxzKlsnIl1odHRwOi8vLis/XC50eHRbJyJdXHMqLFxzKlsnIl1bYS16QS1aMC05X10rP1wucGhwWyciXVwpIjtpOjM4NztzOjI4OiJcJHNldGNvb2tccypcKTtzZXRjb29raWVcKFwkIjtpOjM4ODtzOjQ1MzoiQCooZXZhbHxiYXNlNjRfZGVjb2RlfHN1YnN0cnxzdHJyZXZ8cHJlZ19yZXBsYWNlfHByZWdfcmVwbGFjZV9jYWxsYmFja3xzdHJzdHJ8Z3ppbmZsYXRlfGd6dW5jb21wcmVzc3xhc3NlcnR8c3RyX3JvdDEzfG1kNXxhcnJheV93YWxrfGFycmF5X2ZpbHRlcilccypcKEAqKGV2YWx8YmFzZTY0X2RlY29kZXxzdWJzdHJ8c3RycmV2fHByZWdfcmVwbGFjZXxwcmVnX3JlcGxhY2VfY2FsbGJhY2t8c3Ryc3RyfGd6aW5mbGF0ZXxnenVuY29tcHJlc3N8YXNzZXJ0fHN0cl9yb3QxM3xtZDV8YXJyYXlfd2Fsa3xhcnJheV9maWx0ZXIpXHMqXChAKihldmFsfGJhc2U2NF9kZWNvZGV8c3Vic3RyfHN0cnJldnxwcmVnX3JlcGxhY2V8cHJlZ19yZXBsYWNlX2NhbGxiYWNrfHN0cnN0cnxnemluZmxhdGV8Z3p1bmNvbXByZXNzfGFzc2VydHxzdHJfcm90MTN8bWQ1fGFycmF5X3dhbGt8YXJyYXlfZmlsdGVyKVxzKlwoIjtpOjM4OTtzOjQxOiJcLlxzKmJhc2U2NF9kZWNvZGVcKFxzKlwkaW5qZWN0XHMqXClccypcLiI7aTozOTA7czoyNjoiKFwuY2hyXChccypcZCtccypcKVwuKXs0LH0iO2k6MzkxO3M6NDI6Ij1ccypAKmZzb2Nrb3BlblwoXHMqXCRhcmd2XFtcZCtcXVxzKixccyo4MCI7aTozOTI7czozNToiXC5cLi9cLlwuL2VuZ2luZS9kYXRhL2RiY29uZmlnXC5waHAiO2k6MzkzO3M6ODU6InJlY3Vyc2VfY29weVwoXHMqXCRzcmNccyosXHMqXCRkc3RccypcKTtccypoZWFkZXJcKFxzKlsnIl1sb2NhdGlvbjpccypcJGRzdFsnIl1ccypcKTsiO2k6Mzk0O3M6MTc6IkdhbnRlbmdlcnNccytDcmV3IjtpOjM5NTtzOjE0NToiXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1snIl17MCwxfVxzKlthLXpBLVowLTlfXSs/XHMqWyciXXswLDF9XF1cKFxzKlsnIl17MCwxfVwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtccypbYS16QS1aMC05X10rPyI7aTozOTY7czo0MToiZndyaXRlXChcJFthLXpBLVowLTlfXSs/XHMqLFxzKlsnIl08XD9waHAiO2k6Mzk3O3M6NTY6IkAqY3JlYXRlX2Z1bmN0aW9uXChccypbJyJdWyciXVxzKixccypAKmZpbGVfZ2V0X2NvbnRlbnRzIjtpOjM5ODtzOjk5OiJcXVwoWyciXVwkX1snIl1ccyosXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1xzKlsnIl17MCwxfVthLXpBLVowLTlfXSs/WyciXXswLDF9XHMqXF0iO2k6Mzk5O3M6Mzk6ImlmXHMqXChccyppc3NldFwoXHMqXCRfR0VUXFtccypbJyJdcGluZyI7aTo0MDA7czozMDoicmVhZF9maWxlXChccypbJyJdZG9tYWluc1wudHh0IjtpOjQwMTtzOjE3MjoiKGV2YWx8YmFzZTY0X2RlY29kZXxzdWJzdHJ8c3RycmV2fHByZWdfcmVwbGFjZXxwcmVnX3JlcGxhY2VfY2FsbGJhY2t8c3Ryc3RyfGd6aW5mbGF0ZXxnenVuY29tcHJlc3N8YXNzZXJ0fHN0cl9yb3QxM3xtZDV8YXJyYXlfd2Fsa3xhcnJheV9maWx0ZXIpXChccypcJFthLXpBLVowLTlfXSs/XChccypcJCI7aTo0MDI7czozNzoiZXZhbFwoXHMqWyciXXtccypcJFthLXpBLVowLTlfXSs/XHMqfSI7aTo0MDM7czoxMTA6ImlmXHMqXChccypmaWxlX2V4aXN0c1woXHMqXCRbYS16QS1aMC05X10rP1xzKlwpXHMqXClccyp7XHMqY2htb2RcKFxzKlwkW2EtekEtWjAtOV9dKz9ccyosXHMqMFxkK1wpO1xzKn1ccyplY2hvIjtpOjQwNDtzOjExOiI9PVsnIl1cKVwpOyI7aTo0MDU7czo1NjoiXCRbYS16QS1aMC05X10rPz11cmxkZWNvZGVcKFsnIl0uKz9bJyJdXCk7aWZcKHByZWdfbWF0Y2giO2k6NDA2O3M6ODM6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqZGVjcnlwdF9TT1woXHMqXCRbYS16QS1aMC05X10rP1xzKixccypbJyJdW2EtekEtWjAtOV9dKz9bJyJdIjtpOjQwNztzOjEwNzoiPVxzKm1haWxcKFxzKmJhc2U2NF9kZWNvZGVcKFxzKlwkW2EtekEtWjAtOV9dKz9cW1xkK1xdXHMqXClccyosXHMqYmFzZTY0X2RlY29kZVwoXHMqXCRbYS16QS1aMC05X10rP1xbXGQrXF0iO2k6NDA4O3M6MjY6ImV2YWxcKFxzKlsnIl1yZXR1cm5ccytldmFsIjtpOjQwOTtzOjk1OiI9XHMqYmFzZTY0X2VuY29kZVwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1snIl1bYS16QS1aMC05X10rP1snIl1cXVwpO1xzKmhlYWRlciI7aTo0MTA7czoxMDc6IkBpbmlfc2V0XChbJyJdZXJyb3JfbG9nWyciXSxOVUxMXCk7XHMqQGluaV9zZXRcKFsnIl1sb2dfZXJyb3JzWyciXSwwXCk7XHMqZnVuY3Rpb25ccytyZWFkX2ZpbGVcKFwkZmlsZV9uYW1lIjtpOjQxMTtzOjM3OiJcJHRleHRccyo9XHMqaHR0cF9nZXRcKFxzKlsnIl1odHRwOi8vIjtpOjQxMjtzOjE0NjoiXCRbYS16QS1aMC05X10rP1xzKj1ccypzdHJfcmVwbGFjZVwoWyciXTwvYm9keT5bJyJdXHMqLFxzKlsnIl1bJyJdXHMqLFxzKlwkW2EtekEtWjAtOV9dKz9cKTtccypcJFthLXpBLVowLTlfXSs/XHMqPVxzKnN0cl9yZXBsYWNlXChbJyJdPC9odG1sPlsnIl0iO2k6NDEzO3M6MTYzOiJcI1thLXpBLVowLTlfXSs/XCNccyppZlwoZW1wdHlcKFwkW2EtekEtWjAtOV9dKz9cKVwpXHMqe1xzKlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXTxzY3JpcHQuKz88L3NjcmlwdD5bJyJdO1xzKmVjaG9ccytcJFthLXpBLVowLTlfXSs/O1xzKn1ccypcIy9bYS16QS1aMC05X10rP1wjIjtpOjQxNDtzOjY3OiJcLlwkX1JFUVVFU1RcW1xzKlsnIl1bYS16QS1aMC05X10rP1snIl1ccypcXVxzKixccyp0cnVlXHMqLFxzKjMwMlwpIjtpOjQxNTtzOjEwNzoiPVxzKmNyZWF0ZV9mdW5jdGlvblxzKlwoXHMqbnVsbFxzKixccypbYS16QS1aMC05X10rP1woXHMqXCRbYS16QS1aMC05X10rP1xzKlwpXHMqXCk7XHMqXCRbYS16QS1aMC05X10rP1woXCkiO2k6NDE2O3M6NTQ6Ij1ccypmaWxlX2dldF9jb250ZW50c1woWyciXWh0dHBzKjovL1xkK1wuXGQrXC5cZCtcLlxkKyI7aTo0MTc7czo1NzoiQ29udGVudC10eXBlOlxzKmFwcGxpY2F0aW9uL3ZuZFwuYW5kcm9pZFwucGFja2FnZS1hcmNoaXZlIjtpOjQxODtzOjIwOiJzbHVycFx8bXNuYm90XHx0ZW9tYSI7aTo0MTk7czoyNzoiXCRHTE9CQUxTXFtuZXh0XF1cW1snIl1uZXh0IjtpOjQyMDtzOjc1OiIkW2EtekEtWjAtOV9dXHtcZCtcfVxzKlwuJFthLXpBLVowLTlfXVx7XGQrXH1ccypcLiRbYS16QS1aMC05X11ce1xkK1x9XHMqXC4iO2k6NDIxO3M6MjI6ImV2YWxcKFthLXpBLVowLTlfXSs/XCgiO2k6NDIyO3M6MTY3OiI7QCpcJFthLXpBLVowLTlfXSs/XCgoZXZhbHxiYXNlNjRfZGVjb2RlfHN1YnN0cnxzdHJyZXZ8cHJlZ19yZXBsYWNlfHByZWdfcmVwbGFjZV9jYWxsYmFja3xzdHJzdHJ8Z3ppbmZsYXRlfGd6dW5jb21wcmVzc3xhc3NlcnR8c3RyX3JvdDEzfG1kNXxhcnJheV93YWxrfGFycmF5X2ZpbHRlcilcKCI7aTo0MjM7czozMDoiaGVhZGVyXChfW2EtekEtWjAtOV9dKz9cKFxkK1wpIjtpOjQyNDtzOjE4NjoiaWZccypcKGlzc2V0XChcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXVthLXpBLVowLTlfXSs/WyciXVxdXClccyomJlxzKm1kNVwoXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1snIl1bYS16QS1aMC05X10rP1snIl1cXVwpXHMqPT09XHMqWyciXVthLXpBLVowLTlfXSs/WyciXVwpIjtpOjQyNTtzOjkyOiJcLj1ccypjaHJcKFwkW2EtekEtWjAtOV9dKz9ccyo+PlxzKlwoXGQrXHMqXCpccypcKFxkK1xzKi1ccypcJFthLXpBLVowLTlfXSs/XClcKVxzKiZccypcZCtcKSI7aTo0MjY7czozMToiLT5wcmVwYXJlXChbJyJdU0hPV1xzK0RBVEFCQVNFUyI7aTo0Mjc7czoyMzoic29ja3Nfc3lzcmVhZFwoXCRjbGllbnQiO2k6NDI4O3M6MjQ6IjwlZXZhbFwoXHMqUmVxdWVzdFwuSXRlbSI7aTo0Mjk7czoxMDI6IlwkX1BPU1RcW1snIl1bYS16QS1aMC05X10rP1snIl1cXTtccypcJFthLXpBLVowLTlfXSs/XHMqPVxzKmZvcGVuXChccypcJF9HRVRcW1snIl1bYS16QS1aMC05X10rP1snIl1cXSI7aTo0MzA7czo0MDoidXJsPVsnIl1odHRwOi8vc2NhbjR5b3VcLm5ldC9yZW1vdGVcLnBocCI7aTo0MzE7czo2MjoiY2FsbF91c2VyX2Z1bmNcKFxzKlwkW2EtekEtWjAtOV9dKz9ccyosXHMqXCRbYS16QS1aMC05X10rP1wpO30iO2k6NDMyO3M6NzM6InByZWdfcmVwbGFjZVwoXHMqWyciXS8uKz8vZVsnIl1ccyosXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6NDMzO3M6MTA4OiI9XHMqZmlsZV9nZXRfY29udGVudHNcKFxzKlsnIl0uKz9bJyJdXCk7XHMqXCRbYS16QS1aMC05X10rP1xzKj1ccypmb3BlblwoXHMqXCRbYS16QS1aMC05X10rP1xzKixccypbJyJdd1snIl0iO2k6NDM0O3M6NjE6ImlmXChccypcJFthLXpBLVowLTlfXSs/XClccyp7XHMqZXZhbFwoXCRbYS16QS1aMC05X10rP1wpO1xzKn0iO2k6NDM1O3M6MTY2OiJhcnJheV9tYXBcKFxzKlsnIl0oZXZhbHxiYXNlNjRfZGVjb2RlfHN1YnN0cnxzdHJyZXZ8cHJlZ19yZXBsYWNlfHByZWdfcmVwbGFjZV9jYWxsYmFja3xzdHJzdHJ8Z3ppbmZsYXRlfGd6dW5jb21wcmVzc3xhc3NlcnR8c3RyX3JvdDEzfG1kNXxhcnJheV93YWxrfGFycmF5X2ZpbHRlcilbJyJdIjtpOjQzNjtzOjE4NToiPVxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtbJyJdW2EtekEtWjAtOV9dKz9bJyJdXF07XHMqXCRbYS16QS1aMC05X10rP1xzKj1ccypmaWxlX3B1dF9jb250ZW50c1woXHMqXCRbYS16QS1aMC05X10rP1xzKixccypmaWxlX2dldF9jb250ZW50c1woXHMqXCRbYS16QS1aMC05X10rP1xzKlwpXHMqXCkiO2k6NDM3O3M6Mzk6IlthLXpBLVowLTlfXSs/XChccypbYS16QS1aMC05X10rPz1ccypcKSI7aTo0Mzg7czo2MjoiPFw/XHMqXCRbYS16QS1aMC05X10rPz1bJyJdLis/WyciXTtccypoZWFkZXJccypcKFsnIl1Mb2NhdGlvbjoiO2k6NDM5O3M6MjU6IjwhLS1cI2V4ZWNccytjbWRccyo9XHMqXCQiO2k6NDQwO3M6Mjg6ImRpc2tfZnJlZV9zcGFjZVwoXHMqWyciXS90bXAiO2k6NDQxO3M6ODI6ImlmXChccypzdHJpcG9zXChccypcJFthLXpBLVowLTlfXSs/XHMqLFxzKlsnIl1hbmRyb2lkWyciXVxzKlwpXHMqIT09XHMqZmFsc2VcKVxzKnsiO2k6NDQyO3M6OTE6IlwuPVxzKlsnIl08ZGl2XHMrc3R5bGU9WyciXWRpc3BsYXk6bm9uZTtbJyJdPlsnIl1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9ccypcLlxzKlsnIl08L2Rpdj4iO2k6NDQzO3M6MTE4OiI9ZmlsZV9leGlzdHNcKFwkW2EtekEtWjAtOV9dKz9cKVw/QGZpbGVtdGltZVwoXCRbYS16QS1aMC05X10rP1wpOlwkW2EtekEtWjAtOV9dKz87QGZpbGVfcHV0X2NvbnRlbnRzXChcJFthLXpBLVowLTlfXSs/IjtpOjQ0NDtzOjkzOiJcJFthLXpBLVowLTlfXSs/XHMqXFtccypbYS16QS1aMC05X10rP1xzKlxdXChccypcJFthLXpBLVowLTlfXSs/XFtccypbYS16QS1aMC05X10rP1xzKlxdXHMqXCkiO2k6NDQ1O3M6OTg6IlwkW2EtekEtWjAtOV9dKz8sWyciXXNsdXJwWyciXVwpXHMqIT09XHMqZmFsc2VccypcfFx8XHMqc3RycG9zXChccypcJFthLXpBLVowLTlfXSs/LFsnIl1zZWFyY2hbJyJdIjtpOjQ0NjtzOjY2OiJcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XClccypcKTsiO2k6NDQ3O3M6MTc6ImNsYXNzXHMrTUN1cmxccyp7IjtpOjQ0ODtzOjU2OiJAaW5pX3NldFwoWyciXWRpc3BsYXlfZXJyb3JzWyciXSwwXCk7XHMqQGVycm9yX3JlcG9ydGluZyI7aTo0NDk7czo2OToiaWZcKFxzKmZpbGVfZXhpc3RzXChccypcJGZpbGVwYXRoXHMqXClccypcKVxzKntccyplY2hvXHMrWyciXXVwbG9hZGVkIjtpOjQ1MDtzOjMwOiJyZXR1cm5ccytSQzQ6OkVuY3J5cHRcKFwkYSxcJGIiO2k6NDUxO3M6MzI6ImZ1bmN0aW9uXHMrZ2V0SFRUUFBhZ2VcKFxzKlwkdXJsIjtpOjQ1MjtzOjIxOiI9XHMqcmVxdWVzdFwoXHMqY2hyXCgiO2k6NDUzO3M6NTY6IjtccyphcnJheV9maWx0ZXJcKFwkW2EtekEtWjAtOV9dKz9ccyosXHMqYmFzZTY0X2RlY29kZVwoIjtpOjQ1NDtzOjIxNToiY2FsbF91c2VyX2Z1bmNcKFxzKlsnIl0oZXZhbHxiYXNlNjRfZGVjb2RlfHN1YnN0cnxzdHJyZXZ8cHJlZ19yZXBsYWNlfHByZWdfcmVwbGFjZV9jYWxsYmFja3xzdHJzdHJ8Z3ppbmZsYXRlfGd6dW5jb21wcmVzc3xhc3NlcnR8c3RyX3JvdDEzfG1kNXxhcnJheV93YWxrfGFycmF5X2ZpbHRlcilbJyJdXHMqLFxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6NDU1O3M6MjI4OiJjYWxsX3VzZXJfZnVuY19hcnJheVwoXHMqWyciXShldmFsfGJhc2U2NF9kZWNvZGV8c3Vic3RyfHN0cnJldnxwcmVnX3JlcGxhY2V8cHJlZ19yZXBsYWNlX2NhbGxiYWNrfHN0cnN0cnxnemluZmxhdGV8Z3p1bmNvbXByZXNzfGFzc2VydHxzdHJfcm90MTN8bWQ1fGFycmF5X3dhbGt8YXJyYXlfZmlsdGVyKVsnIl1ccyosXHMqYXJyYXlcKFwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6NDU2O3M6ODc6ImlmIFwoISpcJF9TRVJWRVJcW1snIl1IVFRQX1VTRVJfQUdFTlRbJyJdXF1ccypPUlxzKlwoc3Vic3RyXChcJF9TRVJWRVJcW1snIl1SRU1PVEVfQUREUiI7fQ=="));
$g_ExceptFlex unserialize(base64_decode("YToxMjE6e2k6MDtzOjM3OiJlY2hvICI8c2NyaXB0PiBhbGVydFwoJyJcLlwkZGItPmdldEVyIjtpOjE7czo0MDoiZWNobyAiPHNjcmlwdD4gYWxlcnRcKCciXC5cJG1vZGVsLT5nZXRFciI7aToyO3M6ODoic29ydFwoXCkiO2k6MztzOjEwOiJtdXN0LXJldmFsIjtpOjQ7czo2OiJyaWV2YWwiO2k6NTtzOjk6ImRvdWJsZXZhbCI7aTo2O3M6NjY6InJlcXVpcmVccypcKCpccypcJF9TRVJWRVJcW1xzKlsnIl17MCwxfURPQ1VNRU5UX1JPT1RbJyJdezAsMX1ccypcXSI7aTo3O3M6NzE6InJlcXVpcmVfb25jZVxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxzKlxdIjtpOjg7czo2NjoiaW5jbHVkZVxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxzKlxdIjtpOjk7czo3MToiaW5jbHVkZV9vbmNlXHMqXCgqXHMqXCRfU0VSVkVSXFtccypbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XHMqXF0iO2k6MTA7czoxNzoiXCRzbWFydHktPl9ldmFsXCgiO2k6MTE7czozMDoicHJlcFxzK3JtXHMrLXJmXHMrJXtidWlsZHJvb3R9IjtpOjEyO3M6MjI6IlRPRE86XHMrcm1ccystcmZccyt0aGUiO2k6MTM7czoyNzoia3Jzb3J0XChcJHdwc21pbGllc3RyYW5zXCk7IjtpOjE0O3M6NjM6ImRvY3VtZW50XC53cml0ZVwodW5lc2NhcGVcKCIlM0NzY3JpcHQgc3JjPSciIFwrIGdhSnNIb3N0IFwrICJnbyI7aToxNTtzOjY6IlwuZXhlYyI7aToxNjtzOjg6ImV4ZWNcKFwpIjtpOjE3O3M6MjI6IlwkeDE9XCR0aGlzLT53IC0gXCR4MTsiO2k6MTg7czozMToiYXNvcnRcKFwkQ2FjaGVEaXJPbGRGaWxlc0FnZVwpOyI7aToxOTtzOjEzOiJcKCdyNTdzaGVsbCcsIjtpOjIwO3M6MjM6ImV2YWxcKCJsaXN0ZW5lcj0iXCtsaXN0IjtpOjIxO3M6ODoiZXZhbFwoXCkiO2k6MjI7czozMzoicHJlZ19yZXBsYWNlX2NhbGxiYWNrXCgnL1xce1woaW1hIjtpOjIzO3M6MjA6ImV2YWxcKF9jdE1lbnVJbml0U3RyIjtpOjI0O3M6Mjk6ImJhc2U2NF9kZWNvZGVcKFwkYWNjb3VudEtleVwpIjtpOjI1O3M6Mzg6ImJhc2U2NF9kZWNvZGVcKFwkZGF0YVwpXCk7XCRhcGktPnNldFJlIjtpOjI2O3M6NDg6InJlcXVpcmVcKFwkX1NFUlZFUlxbXFwiRE9DVU1FTlRfUk9PVFxcIlxdXC5cXCIvYiI7aToyNztzOjY0OiJiYXNlNjRfZGVjb2RlXChcJF9SRVFVRVNUXFsncGFyYW1ldGVycydcXVwpO2lmXChDaGVja1NlcmlhbGl6ZWREIjtpOjI4O3M6NjE6InBjbnRsX2V4ZWMnPT4gQXJyYXlcKEFycmF5XCgxXCksXCRhclJlc3VsdFxbJ1NFQ1VSSU5HX0ZVTkNUSU8iO2k6Mjk7czozOToiZWNobyAiPHNjcmlwdD5hbGVydFwoJyJcLkNVdGlsOjpKU0VzY2FwIjtpOjMwO3M6NjY6ImJhc2U2NF9kZWNvZGVcKFwkX1JFUVVFU1RcWyd0aXRsZV9jaGFuZ2VyX2xpbmsnXF1cKTtpZlwoc3RybGVuXChcJCI7aTozMTtzOjQ0OiJldmFsXCgnXCRoZXhkdGltZT0iJ1wuXCRoZXhkdGltZVwuJyI7J1wpO1wkZiI7aTozMjtzOjUyOiJlY2hvICI8c2NyaXB0PmFsZXJ0XCgnXCRyb3ctPnRpdGxlIC0gIlwuX01PRFVMRV9JU19FIjtpOjMzO3M6Mzc6ImVjaG8gIjxzY3JpcHQ+YWxlcnRcKCdcJGNpZHMgIlwuX0NBTk4iO2k6MzQ7czozNzoiaWZcKDFcKXtcJHZfaG91cj1cKFwkcF9oZWFkZXJcWydtdGltZSI7aTozNTtzOjY4OiJkb2N1bWVudFwud3JpdGVcKHVuZXNjYXBlXCgiJTNDc2NyaXB0JTIwc3JjPSUyMmh0dHAiIFwrXChcKCJodHRwczoiPSI7aTozNjtzOjU3OiJkb2N1bWVudFwud3JpdGVcKHVuZXNjYXBlXCgiJTNDc2NyaXB0IHNyYz0nIiBcKyBwa0Jhc2VVUkwiO2k6Mzc7czozMjoiZWNobyAiPHNjcmlwdD5hbGVydFwoJyJcLkpUZXh0OjoiO2k6Mzg7czoyNDoiJ2ZpbGVuYW1lJ1wpLFwoJ3I1N3NoZWxsIjtpOjM5O3M6Mzk6ImVjaG8gIjxzY3JpcHQ+YWxlcnRcKCciXC5cJGVyck1zZ1wuIidcKSI7aTo0MDtzOjQyOiJlY2hvICI8c2NyaXB0PmFsZXJ0XChcXCJFcnJvciB3aGVuIGxvYWRpbmciO2k6NDE7czo0MzoiZWNobyAiPHNjcmlwdD5hbGVydFwoJyJcLkpUZXh0OjpfXCgnVkFMSURfRSI7aTo0MjtzOjg6ImV2YWxcKFwpIjtpOjQzO3M6ODoiJ3N5c3RlbSciO2k6NDQ7czo2OiInZXZhbCciO2k6NDU7czo2OiIiZXZhbCIiO2k6NDY7czo3OiJfc3lzdGVtIjtpOjQ3O3M6OToic2F2ZTJjb3B5IjtpOjQ4O3M6MTA6ImZpbGVzeXN0ZW0iO2k6NDk7czo4OiJzZW5kbWFpbCI7aTo1MDtzOjg6ImNhbkNobW9kIjtpOjUxO3M6MTM6Ii9ldGMvcGFzc3dkXCkiO2k6NTI7czoyNDoidWRwOi8vJ1wuc2VsZjo6XCRfY19hZGRyIjtpOjUzO3M6MzM6ImVkb2NlZF80NmVzYWJcKCcnXHwiXClcXFwpJywncmVnZSI7aTo1NDtzOjk6ImRvdWJsZXZhbCI7aTo1NTtzOjE2OiJvcGVyYXRpbmcgc3lzdGVtIjtpOjU2O3M6MTA6Imdsb2JhbGV2YWwiO2k6NTc7czoyNzoiZXZhbFwoZnVuY3Rpb25cKHAsYSxjLGssZSxyIjtpOjU4O3M6MTk6IndpdGggMC8wLzAgaWZcKDFcKXsiO2k6NTk7czo0NjoiXCR4Mj1cJHBhcmFtXFtbJyJdezAsMX14WyciXXswLDF9XF0gXCsgXCR3aWR0aCI7aTo2MDtzOjk6InNwZWNpYWxpcyI7aTo2MTtzOjg6ImNvcHlcKFwpIjtpOjYyO3M6MTk6IndwX2dldF9jdXJyZW50X3VzZXIiO2k6NjM7czo3OiItPmNobW9kIjtpOjY0O3M6NzoiX21haWxcKCI7aTo2NTtzOjc6Il9jb3B5XCgiO2k6NjY7czo3OiImY29weVwoIjtpOjY3O3M6NDU6InN0cnBvc1woXCRfU0VSVkVSXFsnSFRUUF9VU0VSX0FHRU5UJ1xdLCdEcnVwYSI7aTo2ODtzOjE2OiJldmFsXChjbGFzc1N0clwpIjtpOjY5O3M6MzE6ImZ1bmN0aW9uX2V4aXN0c1woJ2Jhc2U2NF9kZWNvZGUiO2k6NzA7czo0NDoiZWNobyAiPHNjcmlwdD5hbGVydFwoJyJcLkpUZXh0OjpfXCgnVkFMSURfRU0iO2k6NzE7czo0MzoiXCR4MT1cJG1pbl94O1wkeDI9XCRtYXhfeDtcJHkxPVwkbWluX3k7XCR5MiI7aTo3MjtzOjQ4OiJcJGN0bVxbJ2EnXF1cKVwpe1wkeD1cJHggXCogXCR0aGlzLT5rO1wkeT1cKFwkdGgiO2k6NzM7czo1OToiWyciXXswLDF9Y3JlYXRlX2Z1bmN0aW9uWyciXXswLDF9LFsnIl17MCwxfWdldF9yZXNvdXJjZV90eXAiO2k6NzQ7czo0ODoiWyciXXswLDF9Y3JlYXRlX2Z1bmN0aW9uWyciXXswLDF9LFsnIl17MCwxfWNyeXB0IjtpOjc1O3M6Njg6InN0cnBvc1woXCRfU0VSVkVSXFtbJyJdezAsMX1IVFRQX1VTRVJfQUdFTlRbJyJdezAsMX1cXSxbJyJdezAsMX1MeW54IjtpOjc2O3M6Njc6InN0cnN0clwoXCRfU0VSVkVSXFtbJyJdezAsMX1IVFRQX1VTRVJfQUdFTlRbJyJdezAsMX1cXSxbJyJdezAsMX1NU0kiO2k6Nzc7czoyNToic29ydFwoXCREaXN0cmlidXRpb25cW1wkayI7aTo3ODtzOjI1OiJzb3J0XChmdW5jdGlvblwoYSxiXCl7cmV0IjtpOjc5O3M6MjU6Imh0dHA6Ly93d3dcLmZhY2Vib29rXC5jb20iO2k6ODA7czoyNToiaHR0cDovL21hcHNcLmdvb2dsZVwuY29tLyI7aTo4MTtzOjQ4OiJ1ZHA6Ly8nXC5zZWxmOjpcJGNfYWRkciw4MCxcJGVycm5vLFwkZXJyc3RyLDE1MDAiO2k6ODI7czoyMDoiXChcLlwqXCh2aWV3XClcP1wuXCoiO2k6ODM7czo0NDoiZWNobyBbJyJdezAsMX08c2NyaXB0PmFsZXJ0XChbJyJdezAsMX1cJHRleHQiO2k6ODQ7czoxNzoic29ydFwoXCR2X2xpc3RcKTsiO2k6ODU7czo3NToibW92ZV91cGxvYWRlZF9maWxlXChcJF9GSUxFU1xbJ3VwbG9hZGVkX3BhY2thZ2UnXF1cWyd0bXBfbmFtZSdcXSxcJG1vc0NvbmZpIjtpOjg2O3M6MTI6ImZhbHNlXClcKTtcIyI7aTo4NztzOjQ2OiJzdHJwb3NcKFwkX1NFUlZFUlxbJ0hUVFBfVVNFUl9BR0VOVCdcXSwnTWFjIE9TIjtpOjg4O3M6NTA6ImRvY3VtZW50XC53cml0ZVwodW5lc2NhcGVcKCIlM0NzY3JpcHQgc3JjPScvYml0cml4IjtpOjg5O3M6MjU6IlwkX1NFUlZFUiBcWyJSRU1PVEVfQUREUiIiO2k6OTA7czoxNzoiYUhSMGNEb3ZMMk55YkRNdVoiO2k6OTE7czo1NDoiSlJlc3BvbnNlOjpzZXRCb2R5XChwcmVnX3JlcGxhY2VcKFwkcGF0dGVybnMsXCRyZXBsYWNlIjtpOjkyO3M6ODoiH4sIAAAAAAAiO2k6OTM7czo4OiJQSwUGAAAAACI7aTo5NDtzOjE0OiIJCgsMDSAvPlxdXFtcXiI7aTo5NTtzOjg6IolQTkcNChoKIjtpOjk2O3M6MTA6IlwpO1wjaScsJyYiO2k6OTc7czoxNToiXCk7XCNtaXMnLCcnLFwkIjtpOjk4O3M6MTk6IlwpO1wjaScsXCRkYXRhLFwkbWEiO2k6OTk7czozNDoiXCRmdW5jXChcJHBhcmFtc1xbXCR0eXBlXF0tPnBhcmFtcyI7aToxMDA7czo4OiIfiwgAAAAAACI7aToxMDE7czo5OiIAAQIDBAUGBwgiO2k6MTAyO3M6MTI6IiFcI1wkJSYnXCpcKyI7aToxMDM7czo3OiKDi42bnp+hIjtpOjEwNDtzOjY6IgkKCwwNICI7aToxMDU7czozMzoiXC5cLi9cLlwuL1wuXC4vXC5cLi9tb2R1bGVzL21vZF9tIjtpOjEwNjtzOjMwOiJcJGRlY29yYXRvclwoXCRtYXRjaGVzXFsxXF1cWzAiO2k6MTA3O3M6MjE6IlwkZGVjb2RlZnVuY1woXCRkXFtcJCI7aToxMDg7czoxNzoiX1wuXCtfYWJicmV2aWF0aW8iO2k6MTA5O3M6NDU6InN0cmVhbV9zb2NrZXRfY2xpZW50XCgndGNwOi8vJ1wuXCRwcm94eS0+aG9zdCI7aToxMTA7czoyNzoiZXZhbFwoZnVuY3Rpb25cKHAsYSxjLGssZSxkIjtpOjExMTtzOjI1OiIncnVua2l0X2Z1bmN0aW9uX3JlbmFtZScsIjtpOjExMjtzOjY6IoCBgoOEhSI7aToxMTM7czo2OiIBAgMEBQYiO2k6MTE0O3M6NjoiAAAAAAAAIjtpOjExNTtzOjIxOiJcJG1ldGhvZFwoXCRhcmdzXFswXF0iO2k6MTE2O3M6MjE6IlwkbWV0aG9kXChcJGFyZ3NcWzBcXSI7aToxMTc7czoyNDoiXCRuYW1lXChcJGFyZ3VtZW50c1xbMFxdIjtpOjExODtzOjMxOiJzdWJzdHJcKG1kNVwoc3Vic3RyXChcJHRva2VuLDAsIjtpOjExOTtzOjI0OiJzdHJyZXZcKHN1YnN0clwoc3RycmV2XCgiO2k6MTIwO3M6Mzk6InN0cmVhbV9zb2NrZXRfY2xpZW50XCgndGNwOi8vJ1wuXCRwcm94eSI7fQ=="));
$g_AdwareSig unserialize(base64_decode("YToxMTI6e2k6MDtzOjI1OiJzbGlua3NcLnN1L2dldF9saW5rc1wucGhwIjtpOjE7czoxMzoiTUxfbGNvZGVcLnBocCI7aToyO3M6MTM6Ik1MXyVjb2RlXC5waHAiO2k6MztzOjE5OiJjb2Rlc1wubWFpbmxpbmtcLnJ1IjtpOjQ7czoxOToiX19saW5rZmVlZF9yb2JvdHNfXyI7aTo1O3M6MTM6IkxJTktGRUVEX1VTRVIiO2k6NjtzOjE0OiJMaW5rZmVlZENsaWVudCI7aTo3O3M6MTg6Il9fc2FwZV9kZWxpbWl0ZXJfXyI7aTo4O3M6Mjk6ImRpc3BlbnNlclwuYXJ0aWNsZXNcLnNhcGVcLnJ1IjtpOjk7czoxMToiTEVOS19jbGllbnQiO2k6MTA7czoxMToiU0FQRV9jbGllbnQiO2k6MTE7czoxNjoiX19saW5rZmVlZF9lbmRfXyI7aToxMjtzOjE2OiJTTEFydGljbGVzQ2xpZW50IjtpOjEzO3M6MjA6Im5ld1xzK0xMTV9jbGllbnRcKFwpIjtpOjE0O3M6MTc6ImRiXC50cnVzdGxpbmtcLnJ1IjtpOjE1O3M6Mzc6ImNsYXNzXHMrQ01fY2xpZW50XHMrZXh0ZW5kc1xzKkNNX2Jhc2UiO2k6MTY7czoxOToibmV3XHMrQ01fY2xpZW50XChcKSI7aToxNztzOjE2OiJ0bF9saW5rc19kYl9maWxlIjtpOjE4O3M6MjA6ImNsYXNzXHMrbG1wX2Jhc2Vccyt7IjtpOjE5O3M6MTU6IlRydXN0bGlua0NsaWVudCI7aToyMDtzOjEzOiItPlxzKlNMQ2xpZW50IjtpOjIxO3M6MTY2OiJpc3NldFxzKlwoKlxzKlwkX1NFUlZFUlxzKlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF1ccypcKVxzKiYmXHMqXCgqXHMqXCRfU0VSVkVSXHMqXFtccypbJyJdezAsMX1IVFRQX1VTRVJfQUdFTlRbJyJdezAsMX1cXVxzKj09XHMqWyciXXswLDF9TE1QX1JvYm90IjtpOjIyO3M6NDM6IlwkbGlua3MtPlxzKnJldHVybl9saW5rc1xzKlwoKlxzKlwkbGliX3BhdGgiO2k6MjM7czo0NDoiXCRsaW5rc19jbGFzc1xzKj1ccypuZXdccytHZXRfbGlua3NccypcKCpccyoiO2k6MjQ7czo1MjoiWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfVwuWyciXXswLDF9XHMqXCkqXHMqO1xzKlw/PiI7aToyNTtzOjc6Imxldml0cmEiO2k6MjY7czoxMDoiZGFwb3hldGluZSI7aToyNztzOjY6InZpYWdyYSI7aToyODtzOjY6ImNpYWxpcyI7aToyOTtzOjg6InByb3ZpZ2lsIjtpOjMwO3M6MTk6ImNsYXNzXHMrVFdlZmZDbGllbnQiO2k6MzE7czoxODoibmV3XHMrU0xDbGllbnRcKFwpIjtpOjMyO3M6MjQ6Il9fbGlua2ZlZWRfYmVmb3JlX3RleHRfXyI7aTozMztzOjE2OiJfX3Rlc3RfdGxfbGlua19fIjtpOjM0O3M6MTg6InM6MTE6ImxtcF9jaGFyc2V0IiI7aTozNTtzOjIwOiI9XHMrbmV3XHMrTUxDbGllbnRcKCI7aTozNjtzOjQ3OiJlbHNlXHMraWZccypcKFxzKlwoXHMqc3RycG9zXChccypcJGxpbmtzX2lwXHMqLCI7aTozNztzOjMzOiJmdW5jdGlvblxzK3Bvd2VyX2xpbmtzX2Jsb2NrX3ZpZXciO2k6Mzg7czoyMDoiY2xhc3NccytJTkdPVFNDbGllbnQiO2k6Mzk7czoxMDoiX19MSU5LX188YSI7aTo0MDtzOjIxOiJjbGFzc1xzK0xpbmtwYWRfc3RhcnQiO2k6NDE7czoxMzoiY2xhc3NccytUTlhfbCI7aTo0MjtzOjIyOiJjbGFzc1xzK01FR0FJTkRFWF9iYXNlIjtpOjQzO3M6MTU6Il9fTElOS19fX19FTkRfXyI7aTo0NDtzOjIyOiJuZXdccytUUlVTVExJTktfY2xpZW50IjtpOjQ1O3M6NzU6InJcLnBocFw/aWQ9W2EtekEtWjAtOV9dKz8mcmVmZXJlcj0le0hUVFBfSE9TVH0vJXtSRVFVRVNUX1VSSX1ccytcW1I9MzAyLExcXSI7aTo0NjtzOjM5OiJVc2VyLWFnZW50OlxzKkdvb2dsZWJvdFxzKkRpc2FsbG93OlxzKi8iO2k6NDc7czoxODoibmV3XHMrTExNX2NsaWVudFwoIjtpOjQ4O3M6MzY6IiZyZWZlcmVyPSV7SFRUUF9IT1NUfS8le1JFUVVFU1RfVVJJfSI7aTo0OTtzOjI5OiJcLnBocFw/aWQ9XCQxJiV7UVVFUllfU1RSSU5HfSI7aTo1MDtzOjMzOiJBZGRUeXBlXHMrYXBwbGljYXRpb24veC1odHRwZC1waHAiO2k6NTE7czoyMzoiQWRkSGFuZGxlclxzK3BocC1zY3JpcHQiO2k6NTI7czoyMzoiQWRkSGFuZGxlclxzK2NnaS1zY3JpcHQiO2k6NTM7czo1MjoiUmV3cml0ZVJ1bGVccytcLlwqXHMraW5kZXhcLnBocFw/dXJsPVwkMFxzK1xbTCxRU0FcXSI7aTo1NDtzOjEyOiJwaHBpbmZvXChcKTsiO2k6NTU7czoxNToiXChtc2llXHxvcGVyYVwpIjtpOjU2O3M6MjI6IjxoMT5Mb2FkaW5nXC5cLlwuPC9oMT4iO2k6NTc7czoyOToiRXJyb3JEb2N1bWVudFxzKzUwMFxzK2h0dHA6Ly8iO2k6NTg7czoyOToiRXJyb3JEb2N1bWVudFxzKzQwMFxzK2h0dHA6Ly8iO2k6NTk7czoyOToiRXJyb3JEb2N1bWVudFxzKzQwNFxzK2h0dHA6Ly8iO2k6NjA7czo0OToiUmV3cml0ZUNvbmRccyole0hUVFBfVVNFUl9BR0VOVH1ccypcLlwqbmRyb2lkXC5cKiI7aTo2MTtzOjEwMToiPHNjcmlwdFxzK2xhbmd1YWdlPVsnIl17MCwxfUphdmFTY3JpcHRbJyJdezAsMX0+XHMqcGFyZW50XC53aW5kb3dcLm9wZW5lclwubG9jYXRpb25ccyo9XHMqWyciXWh0dHA6Ly8iO2k6NjI7czo5OToiY2hyXHMqXChccyoxMDFccypcKVxzKlwuXHMqY2hyXHMqXChccyoxMThccypcKVxzKlwuXHMqY2hyXHMqXChccyo5N1xzKlwpXHMqXC5ccypjaHJccypcKFxzKjEwOFxzKlwpIjtpOjYzO3M6MzA6ImN1cmxcLmhheHhcLnNlL3JmYy9jb29raWVfc3BlYyI7aTo2NDtzOjE4OiJKb29tbGFfYnJ1dGVfRm9yY2UiO2k6NjU7czozNDoiUmV3cml0ZUNvbmRccyole0hUVFA6eC13YXAtcHJvZmlsZSI7aTo2NjtzOjQyOiJSZXdyaXRlQ29uZFxzKiV7SFRUUDp4LW9wZXJhbWluaS1waG9uZS11YX0iO2k6Njc7czo2NjoiUmV3cml0ZUNvbmRccyole0hUVFA6QWNjZXB0LUxhbmd1YWdlfVxzKlwocnVcfHJ1LXJ1XHx1a1wpXHMqXFtOQ1xdIjtpOjY4O3M6MjY6InNsZXNoXCtzbGVzaFwrZG9tZW5cK3BvaW50IjtpOjY5O3M6MTc6InRlbGVmb25uYXlhLWJhemEtIjtpOjcwO3M6MTg6ImljcS1kbHlhLXRlbGVmb25hLSI7aTo3MTtzOjI0OiJwYWdlX2ZpbGVzL3N0eWxlMDAwXC5jc3MiO2k6NzI7czoyMDoic3ByYXZvY2huaWstbm9tZXJvdi0iO2k6NzM7czoxNzoiS2F6YW4vaW5kZXhcLmh0bWwiO2k6NzQ7czo1MDoiR29vZ2xlYm90WyciXXswLDF9XHMqXClcKXtlY2hvXHMrZmlsZV9nZXRfY29udGVudHMiO2k6NzU7czoyNjoiaW5kZXhcLnBocFw/aWQ9XCQxJiV7UVVFUlkiO2k6NzY7czoyMDoiVm9sZ29ncmFkaW5kZXhcLmh0bWwiO2k6Nzc7czozODoiQWRkVHlwZVxzK2FwcGxpY2F0aW9uL3gtaHR0cGQtY2dpXHMrXC4iO2k6Nzg7czoxOToiLWtseWNoLWstaWdyZVwuaHRtbCI7aTo3OTtzOjE5OiJsbXBfY2xpZW50XChzdHJjb2RlIjtpOjgwO3M6MTc6Ii9cP2RvPWthay11ZGFsaXQtIjtpOjgxO3M6MTQ6Ii9cP2RvPW9zaGlia2EtIjtpOjgyO3M6MTk6Ii9pbnN0cnVrdHNpeWEtZGx5YS0iO2k6ODM7czo0MzoiY29udGVudD0iXGQrO1VSTD1odHRwczovL2RvY3NcLmdvb2dsZVwuY29tLyI7aTo4NDtzOjU5OiIlPCEtLVxcc1wqXCRtYXJrZXJcXHNcKi0tPlwuXCtcPzwhLS1cXHNcKi9cJG1hcmtlclxcc1wqLS0+JSI7aTo4NTtzOjQyOiJSZXdyaXRlUnVsZVxzKlwoXC5cK1wpXHMqaW5kZXhcLnBocFw/cz1cJDAiO2k6ODY7czoxODoiUmVkaXJlY3RccypodHRwOi8vIjtpOjg3O3M6NDU6IlJld3JpdGVSdWxlXHMqXF5cKFwuXCpcKVxzKmluZGV4XC5waHBcP2lkPVwkMSI7aTo4ODtzOjQ0OiJSZXdyaXRlUnVsZVxzKlxeXChcLlwqXClccyppbmRleFwucGhwXD9tPVwkMSI7aTo4OTtzOjUwOiJSZXdyaXRlUnVsZVxzKlwuXCovXC5cKlxzKlthLXpBLVowLTlfXSs/XC5waHBcP1wkMCI7aTo5MDtzOjM5OiJSZXdyaXRlQ29uZFxzKyV7UkVNT1RFX0FERFJ9XHMrXF44NVwuMjYiO2k6OTE7czo0MToiUmV3cml0ZUNvbmRccysle1JFTU9URV9BRERSfVxzK1xeMjE3XC4xMTgiO2k6OTI7czo1MzoiUmV3cml0ZUVuZ2luZVxzK09uXHMqUmV3cml0ZUJhc2VccysvXD9bYS16QS1aMC05X10rPz0iO2k6OTM7czozMjoiRXJyb3JEb2N1bWVudFxzKzQwNFxzK2h0dHA6Ly90ZHMiO2k6OTQ7czo1MToiUmV3cml0ZVJ1bGVccytcXlwoXC5cKlwpXCRccytodHRwOi8vXGQrXC5cZCtcLlxkK1wuIjtpOjk1O3M6Njc6IjwhLS1jaGVjazpbJyJdXHMqXC5ccyptZDVcKFxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6OTY7czoxODoiUmV3cml0ZUJhc2Vccysvd3AtIjtpOjk3O3M6MzY6IlNldEhhbmRsZXJccythcHBsaWNhdGlvbi94LWh0dHBkLXBocCI7aTo5ODtzOjQyOiIle0hUVFBfVVNFUl9BR0VOVH1ccyshd2luZG93cy1tZWRpYS1wbGF5ZXIiO2k6OTk7czo1ODoiXCgqXHMqXCRfU0VSVkVSXFtccypbJyJdezAsMX1IVFRQX1VTRVJfQUdFTlRbJyJdezAsMX1ccypcXSI7aToxMDA7czo1ODoiXCgqXHMqXCRfU0VSVkVSXFtccypbJyJdezAsMX1IVFRQX1VTRVJfQUdFTlRbJyJdezAsMX1ccypcXSI7aToxMDE7czo1ODoiXCgqXHMqXCRfU0VSVkVSXFtccypbJyJdezAsMX1IVFRQX1VTRVJfQUdFTlRbJyJdezAsMX1ccypcXSI7aToxMDI7czo4MjoiXChccypcJF9TRVJWRVJcW1xzKlsnIl17MCwxfUhUVFBfVVNFUl9BR0VOVFsnIl17MCwxfVxzKlxdXHMqLFxzKlsnIl17MCwxfVlhbmRleEJvdCI7aToxMDM7czo3NjoiXChccypcJF9TRVJWRVJcW1xzKlsnIl17MCwxfUhUVFBfUkVGRVJFUlsnIl17MCwxfVxzKlxdXHMqLFxzKlsnIl17MCwxfXlhbmRleCI7aToxMDQ7czo3NjoiXChccypcJF9TRVJWRVJcW1xzKlsnIl17MCwxfUhUVFBfUkVGRVJFUlsnIl17MCwxfVxzKlxdXHMqLFxzKlsnIl17MCwxfWdvb2dsZSI7aToxMDU7czo4OiIva3J5YWtpLyI7aToxMDY7czoxMDoiXC5waHBcP1wkMCI7aToxMDc7czo3MToicmVxdWVzdFwuc2VydmVydmFyaWFibGVzXChbJyJdSFRUUF9VU0VSX0FHRU5UWyciXVwpXHMqLFxzKlsnIl1Hb29nbGVib3QiO2k6MTA4O3M6ODA6ImluZGV4XC5waHBcP21haW5fcGFnZT1wcm9kdWN0X2luZm8mcHJvZHVjdHNfaWQ9WyciXVxzKlwuXHMqc3RyX3JlcGxhY2VcKFsnIl1saXN0IjtpOjEwOTtzOjMxOiJmc29ja29wZW5cKFxzKlsnIl1zaGFkeWtpdFwuY29tIjtpOjExMDtzOjEwOiJlb2ppZXVcLmNuIjtpOjExMTtzOjIyOiI+XHMqPC9pZnJhbWU+XHMqPFw/cGhwIjt9"));
$g_PhishingSig unserialize(base64_decode("YTo2OTp7aTowO3M6MTE6IkNWVjpccypcJGN2IjtpOjE7czoxMzoiSW52YWxpZFxzK1RWTiI7aToyO3M6MTE6IkludmFsaWQgUlZOIjtpOjM7czo0MDoiZGVmYXVsdFN0YXR1c1xzKj1ccypbJyJdSW50ZXJuZXQgQmFua2luZyI7aTo0O3M6Mjg6Ijx0aXRsZT5ccypDYXBpdGVjXHMrSW50ZXJuZXQiO2k6NTtzOjI3OiI8dGl0bGU+XHMqSW52ZXN0ZWNccytPbmxpbmUiO2k6NjtzOjM5OiJpbnRlcm5ldFxzK1BJTlxzK251bWJlclxzK2lzXHMrcmVxdWlyZWQiO2k6NztzOjExOiI8dGl0bGU+U2FycyI7aTo4O3M6MTM6Ijxicj5BVE1ccytQSU4iO2k6OTtzOjE4OiJDb25maXJtYXRpb25ccytPVFAiO2k6MTA7czoyNToiPHRpdGxlPlxzKkFic2FccytJbnRlcm5ldCI7aToxMTtzOjIxOiItXHMqUGF5UGFsXHMqPC90aXRsZT4iO2k6MTI7czoxOToiPHRpdGxlPlxzKlBheVxzKlBhbCI7aToxMztzOjIyOiItXHMqUHJpdmF0aVxzKjwvdGl0bGU+IjtpOjE0O3M6MTk6Ijx0aXRsZT5ccypVbmlDcmVkaXQiO2k6MTU7czoxOToiQmFua1xzK29mXHMrQW1lcmljYSI7aToxNjtzOjI1OiJBbGliYWJhJm5ic3A7TWFudWZhY3R1cmVyIjtpOjE3O3M6MjA6IlZlcmlmaWVkXHMrYnlccytWaXNhIjtpOjE4O3M6MjE6IkhvbmdccytMZW9uZ1xzK09ubGluZSI7aToxOTtzOjMwOiJZb3VyXHMrYWNjb3VudFxzK1x8XHMrTG9nXHMraW4iO2k6MjA7czoyNDoiPHRpdGxlPlxzKk9ubGluZSBCYW5raW5nIjtpOjIxO3M6MjQ6Ijx0aXRsZT5ccypPbmxpbmUtQmFua2luZyI7aToyMjtzOjIyOiJTaWduXHMraW5ccyt0b1xzK1lhaG9vIjtpOjIzO3M6MTY6IllhaG9vXHMqPC90aXRsZT4iO2k6MjQ7czoxMToiQkFOQ09MT01CSUEiO2k6MjU7czoxNjoiPHRpdGxlPlxzKkFtYXpvbiI7aToyNjtzOjE1OiI8dGl0bGU+XHMqQXBwbGUiO2k6Mjc7czoxNToiPHRpdGxlPlxzKkdtYWlsIjtpOjI4O3M6Mjg6Ikdvb2dsZVxzK0FjY291bnRzXHMqPC90aXRsZT4iO2k6Mjk7czoyNToiPHRpdGxlPlxzKkdvb2dsZVxzK1NlY3VyZSI7aTozMDtzOjMxOiI8dGl0bGU+XHMqTWVyYWtccytNYWlsXHMrU2VydmVyIjtpOjMxO3M6MjY6Ijx0aXRsZT5ccypTb2NrZXRccytXZWJtYWlsIjtpOjMyO3M6MjE6Ijx0aXRsZT5ccypcW0xfUVVFUllcXSI7aTozMztzOjM0OiI8dGl0bGU+XHMqQU5aXHMrSW50ZXJuZXRccytCYW5raW5nIjtpOjM0O3M6MzM6ImNvbVwud2Vic3RlcmJhbmtcLnNlcnZsZXRzXC5Mb2dpbiI7aTozNTtzOjE1OiI8dGl0bGU+XHMqR21haWwiO2k6MzY7czoxODoiPHRpdGxlPlxzKkZhY2Vib29rIjtpOjM3O3M6MzY6IlxkKztVUkw9aHR0cHM6Ly93d3dcLndlbGxzZmFyZ29cLmNvbSI7aTozODtzOjIzOiI8dGl0bGU+XHMqV2VsbHNccypGYXJnbyI7aTozOTtzOjQ5OiJwcm9wZXJ0eT0ib2c6c2l0ZV9uYW1lIlxzKmNvbnRlbnQ9IkZhY2Vib29rIlxzKi8+IjtpOjQwO3M6MjI6IkFlc1wuQ3RyXC5kZWNyeXB0XHMqXCgiO2k6NDE7czoxNzoiPHRpdGxlPlxzKkFsaWJhYmEiO2k6NDI7czoxOToiUmFib2Jhbmtccyo8L3RpdGxlPiI7aTo0MztzOjM1OiJcJG1lc3NhZ2VccypcLj1ccypbJyJdezAsMX1QYXNzd29yZCI7aTo0NDtzOjYzOiJcJENWVjJDXHMqPVxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtccypbJyJdQ1ZWMkMiO2k6NDU7czoxNDoiQ1ZWMjpccypcJENWVjIiO2k6NDY7czoxODoiXC5odG1sXD9jbWQ9bG9naW49IjtpOjQ3O3M6MTg6IldlYm1haWxccyo8L3RpdGxlPiI7aTo0ODtzOjIzOiI8dGl0bGU+XHMqVVBDXHMrV2VibWFpbCI7aTo0OTtzOjE3OiJcLnBocFw/Y21kPWxvZ2luPSI7aTo1MDtzOjE3OiJcLmh0bVw/Y21kPWxvZ2luPSI7aTo1MTtzOjIzOiJcLnN3ZWRiYW5rXC5zZS9tZHBheWFjcyI7aTo1MjtzOjI0OiJcLlxzKlwkX1BPU1RcW1xzKlsnIl1jdnYiO2k6NTM7czoyMDoiPHRpdGxlPlxzKkxBTkRFU0JBTksiO2k6NTQ7czoxMDoiQlktU1AxTjBaQSI7aTo1NTtzOjQ1OiJTZWN1cml0eVxzK3F1ZXN0aW9uXHMrOlxzK1snIl1ccypcLlxzKlwkX1BPU1QiO2k6NTY7czo0MDoiaWZcKFxzKmZpbGVfZXhpc3RzXChccypcJHNjYW1ccypcLlxzKlwkaSI7aTo1NztzOjIwOiI8dGl0bGU+XHMqQmVzdC50aWdlbiI7aTo1ODtzOjIwOiI8dGl0bGU+XHMqTEFOREVTQkFOSyI7aTo1OTtzOjUyOiJ3aW5kb3dcLmxvY2F0aW9uXHMqPVxzKlsnIl1pbmRleFxkKypcLnBocFw/Y21kPWxvZ2luIjtpOjYwO3M6NTQ6IndpbmRvd1wubG9jYXRpb25ccyo9XHMqWyciXWluZGV4XGQrKlwuaHRtbCpcP2NtZD1sb2dpbiI7aTo2MTtzOjI1OiI8dGl0bGU+XHMqTWFpbFxzKjwvdGl0bGU+IjtpOjYyO3M6Mjg6IlNpZVxzK0loclxzK0tvbnRvXHMqPC90aXRsZT4iO2k6NjM7czoyOToiUGF5cGFsXHMrS29udG9ccyt2ZXJpZml6aWVyZW4iO2k6NjQ7czozMDoiXCRfR0VUXFtccypbJyJdY2NfY291bnRyeV9jb2RlIjtpOjY1O3M6Mjk6Ijx0aXRsZT5PdXRsb29rXHMrV2ViXHMrQWNjZXNzIjtpOjY2O3M6OToiX0NBUlRBU0lfIjtpOjY3O3M6NzY6IjxtZXRhXHMraHR0cC1lcXVpdj1bJyJdcmVmcmVzaFsnIl1ccypjb250ZW50PSJcZCs7XHMqdXJsPWRhdGE6dGV4dC9odG1sO2h0dHAiO2k6Njg7czoyMjoiY2FuIHNpZ24gaW4gdG8gZHJvcGJveCI7fQ=="));
$g_JSVirSig unserialize(base64_decode("YToxMTk6e2k6MDtzOjE0OiJ2PTA7dng9WyciXUNvZCI7aToxO3M6MjM6IkF0WyciXVxdXCh2XCtcK1wpLTFcKVwpIjtpOjI7czozMjoiQ2xpY2tVbmRlcmNvb2tpZVxzKj1ccypHZXRDb29raWUiO2k6MztzOjcwOiJ1c2VyQWdlbnRcfHBwXHxodHRwXHxkYXphbHl6WyciXXswLDF9XC5zcGxpdFwoWyciXXswLDF9XHxbJyJdezAsMX1cKSwwIjtpOjQ7czo0MToiZj0nZidcKydyJ1wrJ28nXCsnbSdcKydDaCdcKydhckMnXCsnb2RlJzsiO2k6NTtzOjIyOiJcLnByb3RvdHlwZVwuYX1jYXRjaFwoIjtpOjY7czozNzoidHJ5e0Jvb2xlYW5cKFwpXC5wcm90b3R5cGVcLnF9Y2F0Y2hcKCI7aTo3O3M6MzQ6ImlmXChSZWZcLmluZGV4T2ZcKCdcLmdvb2dsZVwuJ1wpIT0iO2k6ODtzOjg2OiJpbmRleE9mXHxpZlx8cmNcfGxlbmd0aFx8bXNuXHx5YWhvb1x8cmVmZXJyZXJcfGFsdGF2aXN0YVx8b2dvXHxiaVx8aHBcfHZhclx8YW9sXHxxdWVyeSI7aTo5O3M6NTQ6IkFycmF5XC5wcm90b3R5cGVcLnNsaWNlXC5jYWxsXChhcmd1bWVudHNcKVwuam9pblwoIiJcKSI7aToxMDtzOjgyOiJxPWRvY3VtZW50XC5jcmVhdGVFbGVtZW50XCgiZCJcKyJpIlwrInYiXCk7cVwuYXBwZW5kQ2hpbGRcKHFcKyIiXCk7fWNhdGNoXChxd1wpe2g9IjtpOjExO3M6Nzk6Ilwreno7c3M9XFtcXTtmPSdmcidcKydvbSdcKydDaCc7ZlwrPSdhckMnO2ZcKz0nb2RlJzt3PXRoaXM7ZT13XFtmXFsic3Vic3RyIlxdXCgiO2k6MTI7czoxMTU6InM1XChxNVwpe3JldHVybiBcK1wrcTU7fWZ1bmN0aW9uIHlmXChzZix3ZVwpe3JldHVybiBzZlwuc3Vic3RyXCh3ZSwxXCk7fWZ1bmN0aW9uIHkxXCh3Ylwpe2lmXCh3Yj09MTY4XCl3Yj0xMDI1O2Vsc2UiO2k6MTM7czo2NDoiaWZcKG5hdmlnYXRvclwudXNlckFnZW50XC5tYXRjaFwoL1woYW5kcm9pZFx8bWlkcFx8ajJtZVx8c3ltYmlhbiI7aToxNDtzOjEwNjoiZG9jdW1lbnRcLndyaXRlXCgnPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IidcK2RvbWFpblwrJyI+PC9zY3InXCsnaXB0PidcKSI7aToxNTtzOjMxOiJodHRwOi8vcGhzcFwucnUvXy9nb1wucGhwXD9zaWQ9IjtpOjE2O3M6NjY6Ij1uYXZpZ2F0b3JcW2FwcFZlcnNpb25fdmFyXF1cLmluZGV4T2ZcKCJNU0lFIlwpIT0tMVw/JzxpZnJhbWUgbmFtZSI7aToxNztzOjc6IlxceDY1QXQiO2k6MTg7czo5OiJcXHg2MXJDb2QiO2k6MTk7czoyMjoiImZyIlwrIm9tQyJcKyJoYXJDb2RlIiI7aToyMDtzOjExOiI9ImV2IlwrImFsIiI7aToyMTtzOjc4OiJcW1woXChlXClcPyJzIjoiIlwpXCsicCJcKyJsaXQiXF1cKCJhXCQiXFtcKFwoZVwpXD8ic3UiOiIiXClcKyJic3RyIlxdXCgxXClcKTsiO2k6MjI7czozOToiZj0nZnInXCsnb20nXCsnQ2gnO2ZcKz0nYXJDJztmXCs9J29kZSc7IjtpOjIzO3M6MjA6ImZcKz1cKGhcKVw/J29kZSc6IiI7IjtpOjI0O3M6NDE6ImY9J2YnXCsncidcKydvJ1wrJ20nXCsnQ2gnXCsnYXJDJ1wrJ29kZSc7IjtpOjI1O3M6NTA6ImY9J2Zyb21DaCc7ZlwrPSdhckMnO2ZcKz0ncWdvZGUnXFsic3Vic3RyIlxdXCgyXCk7IjtpOjI2O3M6MTY6InZhclxzK2Rpdl9jb2xvcnMiO2k6Mjc7czo5OiJ2YXJccytfMHgiO2k6Mjg7czoyMDoiQ29yZUxpYnJhcmllc0hhbmRsZXIiO2k6Mjk7czo3OiJwaW5nbm93IjtpOjMwO3M6ODoic2VyY2hib3QiO2k6MzE7czoxMDoia20wYWU5Z3I2bSI7aTozMjtzOjY6ImMzMjg0ZCI7aTozMztzOjg6IlxceDY4YXJDIjtpOjM0O3M6ODoiXFx4NmRDaGEiO2k6MzU7czo3OiJcXHg2ZmRlIjtpOjM2O3M6NzoiXFx4NmZkZSI7aTozNztzOjg6IlxceDQzb2RlIjtpOjM4O3M6NzoiXFx4NzJvbSI7aTozOTtzOjc6IlxceDQzaGEiO2k6NDA7czo3OiJcXHg3MkNvIjtpOjQxO3M6ODoiXFx4NDNvZGUiO2k6NDI7czoxMDoiXC5keW5kbnNcLiI7aTo0MztzOjk6IlwuZHluZG5zLSI7aTo0NDtzOjc5OiJ9XHMqZWxzZVxzKntccypkb2N1bWVudFwud3JpdGVccypcKFxzKlsnIl17MCwxfVwuWyciXXswLDF9XClccyp9XHMqfVxzKlJcKFxzKlwpIjtpOjQ1O3M6NDU6ImRvY3VtZW50XC53cml0ZVwodW5lc2NhcGVcKCclM0NkaXYlMjBpZCUzRCUyMiI7aTo0NjtzOjE4OiJcLmJpdGNvaW5wbHVzXC5jb20iO2k6NDc7czo0MToiXC5zcGxpdFwoIiYmIlwpO2g9MjtzPSIiO2lmXChtXClmb3JcKGk9MDsiO2k6NDg7czo0MToiPGlmcmFtZVxzK3NyYz0iaHR0cDovL2RlbHV4ZXNjbGlja3NcLnByby8iO2k6NDk7czo0NToiM0Jmb3JcfGZyb21DaGFyQ29kZVx8MkMyN1x8M0RcfDJDODhcfHVuZXNjYXBlIjtpOjUwO3M6NTg6Ijtccypkb2N1bWVudFwud3JpdGVcKFsnIl17MCwxfTxpZnJhbWVccypzcmM9Imh0dHA6Ly95YVwucnUiO2k6NTE7czoxMTA6IndcLmRvY3VtZW50XC5ib2R5XC5hcHBlbmRDaGlsZFwoc2NyaXB0XCk7XHMqY2xlYXJJbnRlcnZhbFwoaVwpO1xzKn1ccyp9XHMqLFxzKlxkK1xzKlwpXHMqO1xzKn1ccypcKVwoXHMqd2luZG93IjtpOjUyO3M6MTEwOiJpZlwoIWdcKFwpJiZ3aW5kb3dcLm5hdmlnYXRvclwuY29va2llRW5hYmxlZFwpe2RvY3VtZW50XC5jb29raWU9IjE9MTtleHBpcmVzPSJcK2VcLnRvR01UU3RyaW5nXChcKVwrIjtwYXRoPS8iOyI7aTo1MztzOjcwOiJubl9wYXJhbV9wcmVsb2FkZXJfY29udGFpbmVyXHw1MDAxXHxoaWRkZW5cfGlubmVySFRNTFx8aW5qZWN0XHx2aXNpYmxlIjtpOjU0O3M6MzA6IjwhLS1bYS16QS1aMC05X10rP1x8XHxzdGF0IC0tPiI7aTo1NTtzOjg1OiImcGFyYW1ldGVyPVwka2V5d29yZCZzZT1cJHNlJnVyPTEmSFRUUF9SRUZFUkVSPSdcK2VuY29kZVVSSUNvbXBvbmVudFwoZG9jdW1lbnRcLlVSTFwpIjtpOjU2O3M6NDg6IndpbmRvd3NcfHNlcmllc1x8NjBcfHN5bWJvc1x8Y2VcfG1vYmlsZVx8c3ltYmlhbiI7aTo1NztzOjM1OiJcW1snIl1ldmFsWyciXVxdXChzXCk7fX19fTwvc2NyaXB0PiI7aTo1ODtzOjU5OiJrQzcwRk1ibHlKa0ZXWm9kQ0tsMVdZT2RXWVVsblF6Um5ibDFXWnNWRWRsZG1MMDVXWnRWM1l2UkdJOSI7aTo1OTtzOjU1OiJ7az1pO3M9c1wuY29uY2F0XChzc1woZXZhbFwoYXNxXChcKVwpLTFcKVwpO316PXM7ZXZhbFwoIjtpOjYwO3M6MTMwOiJkb2N1bWVudFwuY29va2llXC5tYXRjaFwobmV3XHMrUmVnRXhwXChccyoiXChcPzpcXlx8OyBcKSJccypcK1xzKm5hbWVcLnJlcGxhY2VcKC9cKFxbXFxcLlwkXD9cKlx8e31cXFwoXFxcKVxcXFtcXFxdXFwvXFxcK1xeXF1cKS9nIjtpOjYxO3M6ODY6InNldENvb2tpZVxzKlwoKlxzKiJhcnhfdHQiXHMqLFxzKjFccyosXHMqZHRcLnRvR01UU3RyaW5nXChcKVxzKixccypbJyJdezAsMX0vWyciXXswLDF9IjtpOjYyO3M6MTQ0OiJkb2N1bWVudFwuY29va2llXC5tYXRjaFxzKlwoXHMqbmV3XHMrUmVnRXhwXHMqXChccyoiXChcPzpcXlx8O1xzKlwpIlxzKlwrXHMqbmFtZVwucmVwbGFjZVxzKlwoL1woXFtcXFwuXCRcP1wqXHx7fVxcXChcXFwpXFxcW1xcXF1cXC9cXFwrXF5cXVwpL2ciO2k6NjM7czo5ODoidmFyXHMrZHRccys9XHMrbmV3XHMrRGF0ZVwoXCksXHMrZXhwaXJ5VGltZVxzKz1ccytkdFwuc2V0VGltZVwoXHMrZHRcLmdldFRpbWVcKFwpXHMrXCtccys5MDAwMDAwMDAiO2k6NjQ7czoxMDU6ImlmXHMqXChccypudW1ccyo9PT1ccyowXHMqXClccyp7XHMqcmV0dXJuXHMqMTtccyp9XHMqZWxzZVxzKntccypyZXR1cm5ccytudW1ccypcKlxzKnJGYWN0XChccypudW1ccyotXHMqMSI7aTo2NTtzOjQxOiJcKz1TdHJpbmdcLmZyb21DaGFyQ29kZVwocGFyc2VJbnRcKDBcKyd4JyI7aTo2NjtzOjgzOiI8c2NyaXB0XHMrbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPlxzKnBhcmVudFwud2luZG93XC5vcGVuZXJcLmxvY2F0aW9uPSJodHRwOi8vdmtcLmNvbSI7aTo2NztzOjQ0OiJsb2NhdGlvblwucmVwbGFjZVwoWyciXXswLDF9aHR0cDovL3Y1azQ1XC5ydSI7aTo2ODtzOjEyOToiO3RyeXtcK1wrZG9jdW1lbnRcLmJvZHl9Y2F0Y2hcKHFcKXthYT1mdW5jdGlvblwoZmZcKXtmb3JcKGk9MDtpPHpcLmxlbmd0aDtpXCtcK1wpe3phXCs9U3RyaW5nXFtmZlxdXChlXCh2XCtcKHpcW2lcXVwpXCktMTJcKTt9fTt9IjtpOjY5O3M6MTQyOiJkb2N1bWVudFwud3JpdGVccypcKFsnIl17MCwxfTxbJyJdezAsMX1ccypcK1xzKnhcWzBcXVxzKlwrXHMqWyciXXswLDF9IFsnIl17MCwxfVxzKlwrXHMqeFxbNFxdXHMqXCtccypbJyJdezAsMX0+XC5bJyJdezAsMX1ccypcK3hccypcWzJcXVxzKlwrIjtpOjcwO3M6NjA6ImlmXCh0XC5sZW5ndGg9PTJcKXt6XCs9U3RyaW5nXC5mcm9tQ2hhckNvZGVcKHBhcnNlSW50XCh0XClcKyI7aTo3MTtzOjc0OiJ3aW5kb3dcLm9ubG9hZFxzKj1ccypmdW5jdGlvblwoXClccyp7XHMqaWZccypcKGRvY3VtZW50XC5jb29raWVcLmluZGV4T2ZcKCI7aTo3MjtzOjk3OiJcLnN0eWxlXC5oZWlnaHRccyo9XHMqWyciXXswLDF9MHB4WyciXXswLDF9O3dpbmRvd1wub25sb2FkXHMqPVxzKmZ1bmN0aW9uXChcKVxzKntkb2N1bWVudFwuY29va2llIjtpOjczO3M6MTIyOiJcLnNyYz1cKFsnIl17MCwxfWh0cHM6WyciXXswLDF9PT1kb2N1bWVudFwubG9jYXRpb25cLnByb3RvY29sXD9bJyJdezAsMX1odHRwczovL3NzbFsnIl17MCwxfTpbJyJdezAsMX1odHRwOi8vWyciXXswLDF9XClcKyI7aTo3NDtzOjMwOiI0MDRcLnBocFsnIl17MCwxfT5ccyo8L3NjcmlwdD4iO2k6NzU7czo3NjoicHJlZ19tYXRjaFwoWyciXXswLDF9L3NhcGUvaVsnIl17MCwxfVxzKixccypcJF9TRVJWRVJcW1snIl17MCwxfUhUVFBfUkVGRVJFUiI7aTo3NjtzOjc0OiJkaXZcLmlubmVySFRNTFxzKlwrPVxzKlsnIl17MCwxfTxlbWJlZFxzK2lkPSJkdW1teTIiXHMrbmFtZT0iZHVtbXkyIlxzK3NyYyI7aTo3NztzOjczOiJzZXRUaW1lb3V0XChbJyJdezAsMX1hZGROZXdPYmplY3RcKFwpWyciXXswLDF9LFxkK1wpO319fTthZGROZXdPYmplY3RcKFwpIjtpOjc4O3M6NTE6IlwoYj1kb2N1bWVudFwpXC5oZWFkXC5hcHBlbmRDaGlsZFwoYlwuY3JlYXRlRWxlbWVudCI7aTo3OTtzOjMwOiJDaHJvbWVcfGlQYWRcfGlQaG9uZVx8SUVNb2JpbGUiO2k6ODA7czoxOToiXCQ6XCh7fVwrIiJcKVxbXCRcXSI7aTo4MTtzOjQ5OiI8L2lmcmFtZT5bJyJdXCk7XHMqdmFyXHMraj1uZXdccytEYXRlXChuZXdccytEYXRlIjtpOjgyO3M6NTM6Intwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTk5OTlweDt9PC9zdHlsZT48ZGl2XHMrY2xhc3M9IjtpOjgzO3M6MTI4OiJpZlxzKlwoXCh1YVwuaW5kZXhPZlwoWyciXXswLDF9Y2hyb21lWyciXXswLDF9XClccyo9PVxzKi0xXHMqJiZccyp1YVwuaW5kZXhPZlwoIndpbiJcKVxzKiE9XHMqLTFcKVxzKiYmXHMqbmF2aWdhdG9yXC5qYXZhRW5hYmxlZCI7aTo4NDtzOjU4OiJwYXJlbnRcLndpbmRvd1wub3BlbmVyXC5sb2NhdGlvbj1bJyJdezAsMX1odHRwOi8vdmtcLmNvbVwuIjtpOjg1O3M6NDE6IlxdXC5zdWJzdHJcKDAsMVwpXCk7fX1yZXR1cm4gdGhpczt9LFxcdTAwIjtpOjg2O3M6Njg6ImphdmFzY3JpcHRcfGhlYWRcfHRvTG93ZXJDYXNlXHxjaHJvbWVcfHdpblx8amF2YUVuYWJsZWRcfGFwcGVuZENoaWxkIjtpOjg3O3M6MjE6ImxvYWRQTkdEYXRhXChzdHJGaWxlLCI7aTo4ODtzOjIwOiJcKTtpZlwoIX5cKFsnIl17MCwxfSI7aTo4OTtzOjIzOiIvL1xzKlNvbWVcLmRldmljZXNcLmFyZSI7aTo5MDtzOjU1OiJzdHJpcG9zXHMqXChccypmX2hheXN0YWNrXHMqLFxzKmZfbmVlZGxlXHMqLFxzKmZfb2Zmc2V0IjtpOjkxO3M6MzI6IndpbmRvd1wub25lcnJvclxzKj1ccypraWxsZXJyb3JzIjtpOjkyO3M6MTA1OiJjaGVja191c2VyX2FnZW50PVxbXHMqWyciXXswLDF9THVuYXNjYXBlWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfWlQaG9uZVsnIl17MCwxfVxzKixccypbJyJdezAsMX1NYWNpbnRvc2giO2k6OTM7czoxNTM6ImRvY3VtZW50XC53cml0ZVwoWyciXXswLDF9PFsnIl17MCwxfVwrWyciXXswLDF9aVsnIl17MCwxfVwrWyciXXswLDF9ZlsnIl17MCwxfVwrWyciXXswLDF9clsnIl17MCwxfVwrWyciXXswLDF9YVsnIl17MCwxfVwrWyciXXswLDF9bVsnIl17MCwxfVwrWyciXXswLDF9ZSI7aTo5NDtzOjE3OiJzZXhmcm9taW5kaWFcLmNvbSI7aTo5NTtzOjExOiJmaWxla3hcLmNvbSI7aTo5NjtzOjEzOiJzdHVtbWFublwubmV0IjtpOjk3O3M6MTQ6InRvcGxheWdhbWVcLnJ1IjtpOjk4O3M6MTQ6Imh0dHA6Ly94enhcLnBtIjtpOjk5O3M6MTg6IlwuaG9wdG9cLm1lL2pxdWVyeSI7aToxMDA7czoxMToibW9iaS1nb1wuaW4iO2k6MTAxO3M6MTg6ImJhbmtvZmFtZXJpY2FcLmNvbSI7aToxMDI7czoxNjoibXlmaWxlc3RvcmVcLmNvbSI7aToxMDM7czoxNzoiZmlsZXN0b3JlNzJcLmluZm8iO2k6MTA0O3M6MTY6ImZpbGUyc3RvcmVcLmluZm8iO2k6MTA1O3M6MTU6InVybDJzaG9ydFwuaW5mbyI7aToxMDY7czoxODoiZmlsZXN0b3JlMTIzXC5pbmZvIjtpOjEwNztzOjEyOiJ1cmwxMjNcLmluZm8iO2k6MTA4O3M6MTQ6ImRvbGxhcmFkZVwuY29tIjtpOjEwOTtzOjExOiJzZWNjbGlrXC5ydSI7aToxMTA7czoxMToibW9ieS1hYVwucnUiO2k6MTExO3M6MTI6InNlcnZsb2FkXC5ydSI7aToxMTI7czo0ODoic3RyaXBvc1wobmF2aWdhdG9yXC51c2VyQWdlbnRccyosXHMqbGlzdF9kYXRhXFtpIjtpOjExMztzOjI2OiJpZlxzKlwoIXNlZV91c2VyX2FnZW50XChcKSI7aToxMTQ7czo0NjoiY1wubGVuZ3RoXCk7fXJldHVyblxzKlsnIl1bJyJdO31pZlwoIWdldENvb2tpZSI7aToxMTU7czo3MDoiPHNjcmlwdFxzKnR5cGU9WyciXXswLDF9dGV4dC9qYXZhc2NyaXB0WyciXXswLDF9XHMqc3JjPVsnIl17MCwxfWZ0cDovLyI7aToxMTY7czo0ODoiaWZccypcKGRvY3VtZW50XC5jb29raWVcLmluZGV4T2ZcKFsnIl17MCwxfXNhYnJpIjtpOjExNztzOjEyMjoid2luZG93XC5sb2NhdGlvbj1ifVxzKlwpXChccypuYXZpZ2F0b3JcLnVzZXJBZ2VudFxzKlx8XHxccypuYXZpZ2F0b3JcLnZlbmRvclxzKlx8XHxccyp3aW5kb3dcLm9wZXJhXHMqLFxzKlsnIl17MCwxfWh0dHA6Ly8iO2k6MTE4O3M6MTE2OiJcKTtccyppZlwoXHMqW2EtekEtWjAtOV9dKz9cLnRlc3RcKFxzKmRvY3VtZW50XC5yZWZlcnJlclxzKlwpXHMqJiZccypbYS16QS1aMC05X10rP1wpXHMqe1xzKmRvY3VtZW50XC5sb2NhdGlvblwuaHJlZiI7fQ=="));
$gX_JSVirSig unserialize(base64_decode("YTo1Njp7aTowO3M6NDg6ImRvY3VtZW50XC53cml0ZVxzKlwoXHMqdW5lc2NhcGVccypcKFsnIl17MCwxfSUzYyI7aToxO3M6Njk6ImRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoWyciXWhlYWRbJyJdXClcWzBcXVwuYXBwZW5kQ2hpbGRcKGFcKSI7aToyO3M6Mjg6ImlwXChob25lXHxvZFwpXHxpcmlzXHxraW5kbGUiO2k6MztzOjQ4OiJzbWFydHBob25lXHxibGFja2JlcnJ5XHxtdGtcfGJhZGFcfHdpbmRvd3MgcGhvbmUiO2k6NDtzOjMwOiJjb21wYWxcfGVsYWluZVx8ZmVubmVjXHxoaXB0b3AiO2k6NTtzOjIyOiJlbGFpbmVcfGZlbm5lY1x8aGlwdG9wIjtpOjY7czoyOToiXChmdW5jdGlvblwoYSxiXCl7aWZcKC9cKGFuZHIiO2k6NztzOjQ5OiJpZnJhbWVcLnN0eWxlXC53aWR0aFxzKj1ccypbJyJdezAsMX0wcHhbJyJdezAsMX07IjtpOjg7czoxMDE6ImRvY3VtZW50XC5jYXB0aW9uPW51bGw7d2luZG93XC5hZGRFdmVudFwoWyciXXswLDF9bG9hZFsnIl17MCwxfSxmdW5jdGlvblwoXCl7dmFyIGNhcHRpb249bmV3IEpDYXB0aW9uIjtpOjk7czoxMjoiaHR0cDovL2Z0cFwuIjtpOjEwO3M6Nzoibm5uXC5wbSI7aToxMTtzOjc6Im5ubVwucG0iO2k6MTI7czoxNjoibW9iLXJlZGlyZWN0XC5ydSI7aToxMztzOjE2OiJ3ZWItcmVkaXJlY3RcLnJ1IjtpOjE0O3M6MTY6InRvcC13ZWJwaWxsXC5jb20iO2k6MTU7czoxOToiZ29vZHBpbGxzZXJ2aWNlXC5ydSI7aToxNjtzOjc4OiI8c2NyaXB0XHMqdHlwZT1bJyJdezAsMX10ZXh0L2phdmFzY3JpcHRbJyJdezAsMX1ccypzcmM9WyciXXswLDF9aHR0cDovL2dvb1wuZ2wiO2k6MTc7czo2NzoiIlxzKlwrXHMqbmV3IERhdGVcKFwpXC5nZXRUaW1lXChcKTtccypkb2N1bWVudFwuYm9keVwuYXBwZW5kQ2hpbGRcKCI7aToxODtzOjM0OiJcLmluZGV4T2ZcKFxzKlsnIl1JQnJvd3NlWyciXVxzKlwpIjtpOjE5O3M6ODc6Ij1kb2N1bWVudFwucmVmZXJyZXI7XHMqW2EtekEtWjAtOV9dKz89dW5lc2NhcGVcKFxzKlthLXpBLVowLTlfXSs/XHMqXCk7XHMqdmFyXHMrRXhwRGF0ZSI7aToyMDtzOjc0OiI8IS0tXHMqW2EtekEtWjAtOV9dKz9ccyotLT48c2NyaXB0Lis/PC9zY3JpcHQ+PCEtLS9ccypbYS16QS1aMC05X10rP1xzKi0tPiI7aToyMTtzOjM1OiJldmFsXHMqXChccypkZWNvZGVVUklDb21wb25lbnRccypcKCI7aToyMjtzOjcyOiJ3aGlsZVwoXHMqZjxcZCtccypcKWRvY3VtZW50XFtccypbYS16QS1aMC05X10rP1wrWyciXXRlWyciXVxzKlxdXChTdHJpbmciO2k6MjM7czo4MToic2V0Q29va2llXChccypfMHhbYS16QS1aMC05X10rP1xzKixccypfMHhbYS16QS1aMC05X10rP1xzKixccypfMHhbYS16QS1aMC05X10rP1wpIjtpOjI0O3M6Mjk6IlxdXChccyp2XCtcK1xzKlwpLTFccypcKVxzKlwpIjtpOjI1O3M6NDQ6ImRvY3VtZW50XFtccypfMHhbYS16QS1aMC05X10rP1xbXGQrXF1ccypcXVwoIjtpOjI2O3M6Mjg6Ii9nLFsnIl1bJyJdXClcLnNwbGl0XChbJyJdXF0iO2k6Mjc7czo0Mzoid2luZG93XC5sb2NhdGlvbj1ifVwpXChuYXZpZ2F0b3JcLnVzZXJBZ2VudCI7aToyODtzOjIyOiJbJyJdcmVwbGFjZVsnIl1cXVwoL1xbIjtpOjI5O3M6MTI3OiJpXFtfMHhbYS16QS1aMC05X10rP1xbXGQrXF1cXVwoW2EtekEtWjAtOV9dKz9cW18weFthLXpBLVowLTlfXSs/XFtcZCtcXVxdXChcZCssXGQrXClcKVwpe3dpbmRvd1xbXzB4W2EtekEtWjAtOV9dKz9cW1xkK1xdXF09bG9jIjtpOjMwO3M6NDk6ImRvY3VtZW50XC53cml0ZVwoXHMqU3RyaW5nXC5mcm9tQ2hhckNvZGVcLmFwcGx5XCgiO2k6MzE7czo1MToiWyciXVxdXChbYS16QS1aMC05X10rP1wrXCtcKS1cZCtcKX1cKEZ1bmN0aW9uXChbJyJdIjtpOjMyO3M6NjU6Ijt3aGlsZVwoW2EtekEtWjAtOV9dKz88XGQrXClkb2N1bWVudFxbLis/XF1cKFN0cmluZ1xbWyciXWZyb21DaGFyIjtpOjMzO3M6MTA5OiJpZlxzKlwoW2EtekEtWjAtOV9dKz9cLmluZGV4T2ZcKGRvY3VtZW50XC5yZWZlcnJlclwuc3BsaXRcKFsnIl0vWyciXVwpXFtbJyJdMlsnIl1cXVwpXHMqIT1ccypbJyJdLTFbJyJdXClccyp7IjtpOjM0O3M6MTE0OiJkb2N1bWVudFwud3JpdGVcKFxzKlsnIl08c2NyaXB0XHMrdHlwZT1bJyJddGV4dC9qYXZhc2NyaXB0WyciXVxzKnNyYz1bJyJdLy9bJyJdXHMqXCtccypTdHJpbmdcLmZyb21DaGFyQ29kZVwuYXBwbHkiO2k6MzU7czozODoicHJlZ19tYXRjaFwoWyciXUBcKHlhbmRleFx8Z29vZ2xlXHxib3QiO2k6MzY7czoxMzc6ImZhbHNlfTtbYS16QS1aMC05X10rPz1bYS16QS1aMC05X10rP1woWyciXVthLXpBLVowLTlfXSs/WyciXVwpXHxbYS16QS1aMC05X10rP1woWyciXVthLXpBLVowLTlfXSs/WyciXVwpO1thLXpBLVowLTlfXSs/XHw9W2EtekEtWjAtOV9dKz87IjtpOjM3O3M6NjU6IlN0cmluZ1wuZnJvbUNoYXJDb2RlXChccypbYS16QS1aMC05X10rP1wuY2hhckNvZGVBdFwoaVwpXHMqXF5ccyoyIjtpOjM4O3M6MTY6Ii49WyciXS46Ly8uXC4uLy4iO2k6Mzk7czo1ODoiXFtbJyJdY2hhclsnIl1ccypcK1xzKlthLXpBLVowLTlfXSs/XHMqXCtccypbJyJdQXRbJyJdXF1cKCI7aTo0MDtzOjQ5OiJzcmM9WyciXS8vWyciXVxzKlwrXHMqU3RyaW5nXC5mcm9tQ2hhckNvZGVcLmFwcGx5IjtpOjQxO3M6NTY6IlN0cmluZ1xbXHMqWyciXWZyb21DaGFyWyciXVxzKlwrXHMqW2EtekEtWjAtOV9dKz9ccypcXVwoIjtpOjQyO3M6Mjg6Ii49WyciXS46Ly8uXC4uXC4uXC4uLy5cLi5cLi4iO2k6NDM7czo0MDoiPC9zY3JpcHQ+WyciXVwpO1xzKi9cKi9bYS16QS1aMC05X10rP1wqLyI7aTo0NDtzOjczOiJkb2N1bWVudFxbXzB4XGQrXFtcZCtcXVxdXChfMHhcZCtcW1xkK1xdXCtfMHhcZCtcW1xkK1xdXCtfMHhcZCtcW1xkK1xdXCk7IjtpOjQ1O3M6NTE6Ilwoc2VsZj09PXRvcFw/MDoxXClcK1snIl1cLmpzWyciXSxhXChmLGZ1bmN0aW9uXChcKSI7aTo0NjtzOjk6IiZhZHVsdD0xJiI7aTo0NztzOjk4OiJkb2N1bWVudFwucmVhZHlTdGF0ZVxzKz09XHMrWyciXWNvbXBsZXRlWyciXVwpXHMqe1xzKmNsZWFySW50ZXJ2YWxcKFthLXpBLVowLTlfXSs/XCk7XHMqc1wuc3JjXHMqPSI7aTo0ODtzOjE5OiIuOi8vLlwuLlwuLi8uXC4uXD8vIjtpOjQ5O3M6Mzk6IlxkK1xzKj5ccypcZCtccypcP1xzKlsnIl1cXHhcZCtbJyJdXHMqOiI7aTo1MDtzOjQ1OiJbJyJdXFtccypbJyJdY2hhckNvZGVBdFsnIl1ccypcXVwoXHMqXGQrXHMqXCkiO2k6NTE7czoxNzoiPC9ib2R5PlxzKjxzY3JpcHQiO2k6NTI7czoxNzoiPC9odG1sPlxzKjxzY3JpcHQiO2k6NTM7czoxNzoiPC9odG1sPlxzKjxpZnJhbWUiO2k6NTQ7czo0MjoiZG9jdW1lbnRcLndyaXRlXChccypTdHJpbmdcLmZyb21DaGFyQ29kZVwoIjtpOjU1O3M6MjI6InNyYz0iZmlsZXNfc2l0ZS9qc1wuanMiO30="));


////////////////////////////////////////////////////////////////////////////
if (!isCli() && !isset($_SERVER['HTTP_USER_AGENT'])) {
  echo 
"#####################################################n";
  echo 
"# Error: cannot run on php-cgi. Requires php as cli #n";
  echo 
"#                                                   #n";
  echo 
"# See FAQ: http://revisium.com/ai/faq.php           #n";
  echo 
"#####################################################n";
  exit;
}


if (
version_compare(phpversion(), '5.3.1''<')) {
  echo 
"#####################################################n";
  echo 
"# Warning: PHP Version < 5.3.1                      #n";
  echo 
"# Some function might not work properly             #n";
  echo 
"# See FAQ: http://revisium.com/ai/faq.php           #n";
  echo 
"#####################################################n";
  exit;
}

if (!(
function_exists("file_put_contents") && is_callable("file_put_contents"))) {
    echo 
"#####################################################n";
    echo 
"file_put_contents() is disabled. Cannot proceed.n";
    echo 
"#####################################################n";    
    exit;
}

define('AI_VERSION''20151008');

////////////////////////////////////////////////////////////////////////////

$l_Res '';

$g_Structure = array();
$g_Counter 0;

$g_NotRead = array();
$g_FileInfo = array();
$g_Iframer = array();
$g_PHPCodeInside = array();
$g_CriticalJS = array();
$g_Phishing = array();
$g_Base64 = array();
$g_HeuristicDetected = array();
$g_HeuristicType = array();
$g_UnixExec = array();
$g_SkippedFolders = array();
$g_UnsafeFilesFound = array();
$g_CMS = array();
$g_SymLinks = array();
$g_HiddenFiles = array();
$g_Vulnerable = array();

$g_TotalFolder 0;
$g_TotalFiles 0;

$g_FoundTotalDirs 0;
$g_FoundTotalFiles 0;

if (!
isCli()) {
   
$defaults['site_url'] = 'http://' $_SERVER['HTTP_HOST'] . '/'
}

define('CRC32_LIMIT'pow(231) - 1);
define('CRC32_DIFF'CRC32_LIMIT -2);

error_reporting(E_ALL E_NOTICE E_WARNING);
srand(time());

set_time_limit(0);
ini_set('max_execution_time''90000');
ini_set('realpath_cache_size','16M');
ini_set('realpath_cache_ttl','1200');

if (!
function_exists('stripos')) {
    function 
stripos($par_Str$par_Entry$Offset 0) {
        return 
strpos(strtolower($par_Str), strtolower($par_Entry), $Offset);
    }
}

define('CMS_BITRIX''Bitrix');
define('CMS_WORDPRESS''Wordpress');
define('CMS_JOOMLA''Joomla');
define('CMS_DLE''Data Life Engine');
define('CMS_IPB''Invision Power Board');
define('CMS_WEBASYST''WebAsyst');
define('CMS_OSCOMMERCE''OsCommerce');
define('CMS_DRUPAL''Drupal');
define('CMS_MODX''MODX');
define('CMS_INSTANTCMS''Instant CMS');
define('CMS_PHPBB''PhpBB');
define('CMS_VBULLETIN''vBulletin');
define('CMS_SHOPSCRIPT''PHP ShopScript Premium');

define('CMS_VERSION_UNDEFINED''0.0');

class 
CmsVersionDetector {
    private 
$root_path;
    private 
$versions;
    private 
$types;

    public function 
__construct($root_path '.') {

        
$this->root_path $root_path;
        
$this->versions = array();
        
$this->types = array();

        
$version '';

        if (
$this->checkBitrix($version)) {
           
$this->addCms(CMS_BITRIX$version);
        }

        if (
$this->checkWordpress($version)) {
           
$this->addCms(CMS_WORDPRESS$version);
        }

        if (
$this->checkJoomla($version)) {
           
$this->addCms(CMS_JOOMLA$version);
        }

        if (
$this->checkDle($version)) {
           
$this->addCms(CMS_DLE$version);
        }

        if (
$this->checkIpb($version)) {
           
$this->addCms(CMS_IPB$version);
        }

        if (
$this->checkWebAsyst($version)) {
           
$this->addCms(CMS_WEBASYST$version);
        }

        if (
$this->checkOsCommerce($version)) {
           
$this->addCms(CMS_OSCOMMERCE$version);
        }

        if (
$this->checkDrupal($version)) {
           
$this->addCms(CMS_DRUPAL$version);
        }

        if (
$this->checkMODX($version)) {
           
$this->addCms(CMS_MODX$version);
        }

        if (
$this->checkInstantCms($version)) {
           
$this->addCms(CMS_INSTANTCMS$version);
        }

        if (
$this->checkPhpBb($version)) {
           
$this->addCms(CMS_PHPBB$version);
        }

        if (
$this->checkVBulletin($version)) {
           
$this->addCms(CMS_VBULLETIN$version);
        }

        if (
$this->checkPhpShopScript($version)) {
           
$this->addCms(CMS_SHOPSCRIPT$version);
        }

    }

    function 
getCmsList() {
      return 
$this->types;
    }

    function 
getCmsVersions() {
      return 
$this->versions;
    }

    function 
getCmsNumber() {
      return 
count($this->types);
    }

    function 
getCmsName($index 0) {
      return 
$this->types[$index];
    }

    function 
getCmsVersion($index 0) {
      return 
$this->versions[$index];
    }

    private function 
addCms($type$version) {
       
$this->types[] = $type;
       
$this->versions[] = $version;
    }

    private function 
checkBitrix(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/bitrix')) {
          
$res true;

          
$tmp_content = @file_get_contents($this->root_path .'/bitrix/modules/main/classes/general/version.php');
          if (
preg_match('|define("SM_VERSION","(.+?)")|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkWordpress(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/wp-admin')) {
          
$res true;

          
$tmp_content = @file_get_contents($this->root_path .'/wp-includes/version.php');
          if (
preg_match('|$wp_versions*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }
       }

       return 
$res;
    }

    private function 
checkJoomla(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/libraries/joomla')) {
          
$res true;

          
// for 1.5.x
          
$tmp_content = @file_get_contents($this->root_path .'/libraries/joomla/version.php');
          if (
preg_match('|vars+$RELEASEs*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];

             if (
preg_match('|vars+$DEV_LEVELs*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
                
$version .= '.' $tmp_ver[1];
             }
          }

          
// for 1.7.x
          
$tmp_content = @file_get_contents($this->root_path .'/includes/version.php');
          if (
preg_match('|publics+$RELEASEs*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];

             if (
preg_match('|publics+$DEV_LEVELs*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
                
$version .= '.' $tmp_ver[1];
             }
          }

          
// for 2.5.x and 3.x
          
$tmp_content = @file_get_contents($this->root_path .'/libraries/cms/version/version.php');
          if (
preg_match('|publics+$RELEASEs*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];

             if (
preg_match('|publics+$DEV_LEVELs*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
                
$version .= '.' $tmp_ver[1];
             }
          }

       }

       return 
$res;
    }

    private function 
checkDle(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/engine/engine.php')) {
          
$res true;

          
$tmp_content = @file_get_contents($this->root_path .'/engine/data/config.php');
          if (
preg_match('|'version_id's*=>s*"(.+?)"|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

          
$tmp_content = @file_get_contents($this->root_path .'/install.php');
          if (
preg_match('|'version_id's*=>s*"(.+?)"|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkIpb(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/ips_kernel')) {
          
$res true;

          
$tmp_content = @file_get_contents($this->root_path .'/ips_kernel/class_xml.php');
          if (
preg_match('|IP.Boards+v([0-9.]+)|si'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkWebAsyst(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/wbs/installer')) {
          
$res true;

          
$tmp_content = @file_get_contents($this->root_path .'/license.txt');
          if (
preg_match('|v([0-9.]+)|si'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkOsCommerce(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/includes/version.php')) {
          
$res true;

          
$tmp_content = @file_get_contents($this->root_path .'/includes/version.php');
          if (
preg_match('|([0-9.]+)|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkDrupal(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/sites/all')) {
          
$res true;

          
$tmp_content = @file_get_contents($this->root_path .'/CHANGELOG.txt');
          if (
preg_match('|Drupals+([0-9.]+)|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkMODX(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/manager/assets')) {
          
$res true;

          
// no way to pick up version
       
}

       return 
$res;
    }

    private function 
checkInstantCms(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/plugins/p_usertab')) {
          
$res true;

          
$tmp_content = @file_get_contents($this->root_path .'/index.php');
          if (
preg_match('|InstantCMSs+v([0-9.]+)|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkPhpBb(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/includes/acp')) {
          
$res true;

          
$tmp_content = @file_get_contents($this->root_path .'/config.php');
          if (
preg_match('|phpBBs+([0-9.x]+)|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkVBulletin(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/core/admincp')) {
          
$res true;

          
$tmp_content = @file_get_contents($this->root_path .'/core/api.php');
          if (
preg_match('|vBulletins+([0-9.x]+)|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkPhpShopScript(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/install/consts.php')) {
          
$res true;

          
$tmp_content = @file_get_contents($this->root_path .'/install/consts.php');
          if (
preg_match('|STRING_VERSION',s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }

       }

       return $res;
    }
}

/**
 * Print file
*/
function printFile() {
    $l_FileName = $_GET['
fn'];
    $l_CRC = isset($_GET['
c']) ? (int)$_GET['c'] : 0;
    $l_Content = file_get_contents($l_FileName);
    $l_FileCRC = realCRC($l_Content);
    if ($l_FileCRC != $l_CRC) {
        echo '
Доступ запрещен.';
        exit;
    }
    
    echo '
<pre>' . htmlspecialchars($l_Content) . '</pre>';
}

/**
 *
 */
function realCRC($str_in, $full = false)
{
        $in = crc32( $full ? normal($str_in) : $str_in );
        return ($in > CRC32_LIMIT) ? ($in - CRC32_DIFF) : $in;
}


/**
 * Determine php script is called from the command line interface
 * @return bool
 */
function isCli()
{
    return php_sapi_name() == '
cli';
}

function myCheckSum($str) {
  return str_replace('
-', 'x', crc32($str));
}

/*
 *
 */
function shanonEntropy($par_Str)
{
    $dic = array();

    $len = strlen($par_Str);
    for ($i = 0; $i < $len; $i++) {
        $dic[$par_Str[$i]]++;
    } 

    $result = 0.0;
    $frequency = 0.0;
    foreach ($dic as $item)
    {
        $frequency = (float)$item / (float)$len;
        $result -= $frequency * (log($frequency) / log(2));
    }

    return $result;
}

 function generatePassword ($length = 9)
  {

    // start with a blank password
    $password = "";

    // define possible characters - any character in this string can be
    // picked for use in the password, so if you want to put vowels back in
    // or add special characters such as exclamation marks, this is where
    // you should do it
    $possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";

    // we refer to the length of $possible a few times, so let'
s grab it now
    $maxlength 
strlen($possible);
  
    
// check for length overflow and truncate if necessary
    
if ($length $maxlength) {
      
$length $maxlength;
    }
    
    
// set up a counter for how many characters are in the password so far
    
$i 0
    
    
// add random characters to $password until $length is reached
    
while ($i $length) { 

      
// pick a random character from the possible ones
      
$char substr($possiblemt_rand(0$maxlength-1), 1);
        
      
// have we already used this character in $password?
      
if (!strstr($password$char)) { 
        
// no, so it's OK to add it onto the end of whatever we've already got...
        
$password .= $char;
        
// ... and increase the counter by one
        
$i++;
      }

    }

    
// done!
    
return $password;

  }

/**
 * Print to console
 * @param mixed $text
 * @param bool $add_lb Add line break
 * @return void
 */
function stdOut($text$add_lb true)
{
    global 
$BOOL_RESULT;

    if (!
isCli())
        return;
        
    if (
is_bool($text))
    {
        
$text $text 'true' 'false';
    }
    else if (
is_null($text))
    {
        
$text 'null';
    }
    if (!
is_scalar($text))
    {
        
$text print_r($texttrue);
    }

     if (!
$BOOL_RESULT)
     {
         @
fwrite(STDOUT$text . ($add_lb "n" ''));
     }
}

/**
 * Print progress
 * @param int $num Current file
 */
function printProgress($num, &$par_File)
{
    global 
$g_CriticalPHP$g_Base64$g_Phishing$g_CriticalJS$g_Iframer;
    
$total_files $GLOBALS['g_FoundTotalFiles'];
    
$elapsed_time microtime(true) - START_TIME;
    
$percent number_format($total_files $num*100/$total_files 01);
    
$stat '';
    if (
$elapsed_time >= 1)
    {
        
$elapsed_seconds round($elapsed_time0);
        
$fs floor($num $elapsed_seconds);
        
$left_files $total_files $num;
        if (
$fs 0
        {
           
$left_time = ($left_files $fs); //ceil($left_files / $fs);
           
$stat ' [Avg: ' round($fs,2) . ' files/s' . ($left_time 0  ' Left: ' seconds2Human($left_time) : '') . '] [Mlw:' . (count($g_CriticalPHP) + count($g_Base64))  . '|' . (count($g_CriticalJS) + count($g_Iframer) + count($g_Phishing)) . ']';
        }
    }

    
$l_FN substr($par_File, -60);

    
$text "$percent% [$l_FN$num of {$total_files}. " $stat;
    
$text str_pad($text160' 'STR_PAD_RIGHT);
    
stdOut(str_repeat(chr(8), 160) . $textfalse);
}

/**
 * Seconds to human readable
 * @param int $seconds
 * @return string
 */
function seconds2Human($seconds)
{
    
$r '';
    
$_seconds floor($seconds);
    
$ms $seconds $_seconds;
    
$seconds $_seconds;
    if (
$hours floor($seconds 3600))
    {
        
$r .= $hours . (isCli() ? ' h ' ' час ');
        
$seconds $seconds 3600;
    }

    if (
$minutes floor($seconds 60))
    {
        
$r .= $minutes . (isCli() ? ' m ' ' мин ');
        
$seconds $seconds 60;
    }

    if (
$minutes 3$r .= ' ' $seconds + ($ms round($ms) : 0) . (isCli() ? ' s' ' сек'); 

    return 
$r;
}

if (
isCli())
{

    
$cli_options = array(
        
'm:' => 'memory:',
        
's:' => 'size:',
        
'a' => 'all',
        
'd:' => 'delay:',
        
'l:' => 'list:',
        
'r:' => 'report:',
        
'f' => 'fast',
        
'j:' => 'file:',
        
'p:' => 'path:',
        
'q' => 'quite',
        
'e:' => 'cms:',
        
'x:' => 'mode:',
        
'k:' => 'skip:',
        
'i:' => 'idb:',
        
'h' => 'help'
    
);

    
$cli_longopts = array(
        
'cmd:',
        
'noprefix:',
        
'addprefix:',
        
'one-pass',
        
'quarantine',
        
'with-2check',
        
'imake',
        
'icheck'
    
);
    
$cli_longopts array_merge($cli_longoptsarray_values($cli_options));

    
$options getopt(implode(''array_keys($cli_options)), $cli_longopts);

    if (isset(
$options['h']) OR isset($options['help']))
    {
        
$memory_limit ini_get('memory_limit');
        echo <<<HELP
AI-Bolit - Script to search for shells and other malicious software.

Usage: php 
{$_SERVER['PHP_SELF']} [OPTIONS] [PATH]
Current default path is: 
{$defaults['path']}

  -j, --file=FILE      Full path to single file to check
  -l, --list=FILE      Full path to create plain text file with a list of found malware
  -p, --path=PATH      Directory path to scan, by default the file directory is used
                       Current path: 
{$defaults['path']}
  -m, --memory=SIZE    Maximum amount of memory a script may consume. Current value: 
$memory_limit
                       Can take shorthand byte values (1M, 1G...)
  -s, --size=SIZE      Scan files are smaller than SIZE. 0 - All files. Current value: 
{$defaults['max_size_to_scan']}
  -a, --all            Scan all files (by default scan. js,. php,. html,. htaccess)
  -d, --delay=INT      delay in milliseconds when scanning files to reduce load on the file system (Default: 1)
  -e, --cms=FILE       cms filename to load .aknown files from. E.g. --cms=wordpress
  -x, --mode=INT       Set scan mode. 0 - for basic, 1 - for expert and 2 for paranoic.
  -k, --skip=jpg,...   Skip specific extensions. E.g. --skip=jpg,gif,png,xls,pdf
  -r, --report=PATH/EMAILS
                       Full path to create report or email address to send report to.
                       You can also specify multiple email separated by commas.
  -q,                Use only with -j. Quiet result check of file, 1=Infected 
      --cmd="command [args...]"
                       Run command after scanning
      --one-pass       Do not calculate remaining time
      --quarantine     Archive all malware from report
      --with-2check    Create or use AI-BOLIT-DOUBLECHECK.php file
      --imake
      --icheck
      --idb=file       Integrity Check database file

      --help           Display this help and exit

* Mandatory arguments listed below are required for both full and short way of usage.

HELP;
        exit;
    }

    
$l_FastCli false;
    
    if (
        (isset(
$options['memory']) AND !empty($options['memory']) AND ($memory $options['memory']))
        OR (isset(
$options['m']) AND !empty($options['m']) AND ($memory $options['m']))
    )
    {
        
$memory getBytes($memory);
        if (
$memory 0)
        {
            
$defaults['memory_limit'] = $memory;
            
ini_set('memory_limit'$memory);
        }
    }

    if (
        (isset(
$options['file']) AND !empty($options['file']) AND ($file $options['file']) !== false)
        OR (isset(
$options['j']) AND !empty($options['j']) AND ($file $options['j']) !== false)
    )
    {
        
define('SCAN_FILE'$file);
    }


    if (
        (isset(
$options['list']) AND !empty($options['list']) AND ($file $options['list']) !== false)
        OR (isset(
$options['l']) AND !empty($options['l']) AND ($file $options['l']) !== false)
    )
    {

        
define('PLAIN_FILE'$file);
    }
    if (
        (isset(
$options['size']) AND !empty($options['size']) AND ($size $options['size']) !== false)
        OR (isset(
$options['s']) AND !empty($options['s']) AND ($size $options['s']) !== false)
    )
    {
        
$size getBytes($size);
        
$defaults['max_size_to_scan'] = $size $size 0;
    }

     if (
         (isset(
$options['file']) AND !empty($options['file']) AND ($file $options['file']) !== false)
         OR (isset(
$options['j']) AND !empty($options['j']) AND ($file $options['j']) !== false)
         AND (isset(
$options['q'])) 
     
     )
     {
         
$BOOL_RESULT true;
     }
 
    if (isset(
$options['f'])) 
     {
       
$l_FastCli true;
     }
        
    if (
        (isset(
$options['delay']) AND !empty($options['delay']) AND ($delay $options['delay']) !== false)
        OR (isset(
$options['d']) AND !empty($options['d']) AND ($delay $options['d']) !== false)
    )
    {
        
$delay = (int) $delay;
        if (!(
$delay 0))
        {
            
$defaults['scan_delay'] = $delay;
        }
    }

    if (
        (isset(
$options['skip']) AND !empty($options['skip']) AND ($ext_list $options['skip']) !== false)
        OR (isset(
$options['k']) AND !empty($options['k']) AND ($ext_list $options['k']) !== false)
    )
    {
        
$defaults['skip_ext'] = $ext_list;
    }

    if (isset(
$options['all']) OR isset($options['a']))
    {
        
$defaults['scan_all_files'] = 1;
    }

    if (isset(
$options['cms'])) {
        
define('CMS'$options['cms']);
    } else if (isset(
$options['e'])) {
        
define('CMS'$options['e']);
    }

    if (isset(
$options['x'])) {
        
define('AI_EXPERT'$options['x']);
    } else if (isset(
$options['mode'])) {
        
define('AI_EXPERT'$options['mode']);
    } else {
        
define('AI_EXPERT'AI_EXPERT_MODE); 
    }

    
$l_SpecifiedPath false;
    if (
        (isset(
$options['path']) AND !empty($options['path']) AND ($path $options['path']) !== false)
        OR (isset(
$options['p']) AND !empty($options['p']) AND ($path $options['p']) !== false)
    )
    {
        
$defaults['path'] = $path;
        
$l_SpecifiedPath true;
    }

    if (
        isset(
$options['noprefix']) AND !empty($options['noprefix']) AND ($g_NoPrefix $options['noprefix']) !== false)
        
    {
    } else {
        
$g_NoPrefix '';
    }

    if (
        isset(
$options['addprefix']) AND !empty($options['addprefix']) AND ($g_AddPrefix $options['addprefix']) !== false)
        
    {
    } else {
        
$g_AddPrefix '';
    }



    
$l_SuffixReport str_replace('/var/www'''$defaults['path']);
    
$l_SuffixReport str_replace('/home'''$l_SuffixReport);
    
$l_SuffixReport preg_replace('#[/\.s]#''_'$l_SuffixReport);
    
$l_SuffixReport .=  "-" rand(1999999);
        
    if (
        (isset(
$options['report']) AND ($report $options['report']) !== false)
        OR (isset(
$options['r']) AND ($report $options['r']) !== false)
    )
    {
        
$report str_replace('@PATH@'$l_SuffixReport$report);
        
$report str_replace('@RND@'rand(1999999), $report);
        
$report str_replace('@DATE@'date('d-m-Y-h-i'), $report);
        
define('REPORT'$report);
    }

    if (
        (isset(
$options['idb']) AND ($ireport $options['idb']) !== false)
    )
    {
        
$ireport str_replace('@PATH@'$l_SuffixReport$ireport);
        
$ireport str_replace('@RND@'rand(1999999), $ireport);
        
$ireport str_replace('@DATE@'date('d-m-Y-h-i'), $ireport);
        
define('INTEGRITY_DB_FILE'$ireport);
    }

  
    
$l_ReportDirName dirname($report);
    
define('QUEUE_FILENAME', ($l_ReportDirName != '' $l_ReportDirName '/' '') . 'AI-BOLIT-QUEUE-' md5($defaults['path']) . '.txt');

    
defined('REPORT') OR define('REPORT''AI-BOLIT-REPORT-' $l_SuffixReport '-' date('d-m-Y_H-i') . '.html');
    
    
defined('INTEGRITY_DB_FILE') OR define('INTEGRITY_DB_FILE''AINTEGRITY-' $l_SuffixReport '-' date('d-m-Y_H-i'));

    
$last_arg max(1sizeof($_SERVER['argv']) - 1);
    if (isset(
$_SERVER['argv'][$last_arg]))
    {
        
$path $_SERVER['argv'][$last_arg];
        if (
            
substr($path01) != '-'
            
AND (substr($_SERVER['argv'][$last_arg 1], 01) != '-' OR array_key_exists(substr($_SERVER['argv'][$last_arg 1], -1), $cli_options)))
        {
            
$defaults['path'] = $path;
        }
    }    
    
    
    
define('ONE_PASS', isset($options['one-pass']));

    
define('IMAKE', isset($options['imake']));
    
define('ICHECK', isset($options['icheck']));

    if (
IMAKE && ICHECK) die('One of the following options must be used --imake or --icheck.');

} else {
   
define('AI_EXPERT'AI_EXPERT_MODE); 
   
define('ONE_PASS'true);
}

OptimizeSignatures();

$g_DBShe  array_map('strtolower'$g_DBShe);
$gX_DBShe array_map('strtolower'$gX_DBShe);

if (!
defined('PLAIN_FILE')) { define('PLAIN_FILE'''); }

// Init
define('MAX_ALLOWED_PHP_HTML_IN_DIR'600);
define('BASE64_LENGTH'69);
define('MAX_PREVIEW_LEN'80);
define('MAX_EXT_LINKS'1001);

// Perform full scan when running from command line
if (isCli() || isset($_GET['full'])) {
  
$defaults['scan_all_files'] = 1;
}

if (
$l_FastCli) {
  
$defaults['scan_all_files'] = 0
}

if (!
isCli()) {
      
define('ICHECK', isset($_GET['icheck']));
      
define('IMAKE', isset($_GET['imake']));
    
    
define('INTEGRITY_DB_FILE''ai-integrity-db');
}

define('SCAN_ALL_FILES', (bool) $defaults['scan_all_files']);
define('SCAN_DELAY', (int) $defaults['scan_delay']);
define('MAX_SIZE_TO_SCAN'getBytes($defaults['max_size_to_scan']));

if (
$defaults['memory_limit'] AND ($defaults['memory_limit'] = getBytes($defaults['memory_limit'])) > 0) {
    
ini_set('memory_limit'$defaults['memory_limit']);
    
stdOut("Changed memory limit to " $defaults['memory_limit']);
}

define('START_TIME'microtime(true));

define('ROOT_PATH'realpath($defaults['path']));

if (!
ROOT_PATH)
{
    if (
isCli())  {
        die(
stdOut("Directory '{$defaults['path']}' not found!"));
    }
}
elseif(!
is_readable(ROOT_PATH))
{
        if (
isCli())  {
        die(
stdOut("Cannot read directory '" ROOT_PATH "'!"));
    }
}

define('CURRENT_DIR'getcwd());
chdir(ROOT_PATH);

// Проверяем отчет
if (isCli() AND REPORT !== '' AND !getEmails(REPORT))
{
    
$report str_replace('\', '/', REPORT);
    $abs = strpos($report, '
/') === 0 ? DIR_SEPARATOR : '';
    $report = array_values(array_filter(explode('
/', $report)));
    $report_file = array_pop($report);
    $report_path = realpath($abs . implode(DIR_SEPARATOR, $report));

    define('
REPORT_FILE', $report_file);
    define('
REPORT_PATH', $report_path);

    if (REPORT_FILE AND REPORT_PATH AND is_file(REPORT_PATH . DIR_SEPARATOR . REPORT_FILE))
    {
        @unlink(REPORT_PATH . DIR_SEPARATOR . REPORT_FILE);
    }
}


if (function_exists('
phpinfo')) {
   ob_start();
   phpinfo();
   $l_PhpInfo = ob_get_contents();
   ob_end_clean();

   $l_PhpInfo = str_replace('
border1px', '', $l_PhpInfo);
   preg_match('
|<body>(.*)</body>|smi', $l_PhpInfo, $l_PhpInfoBody);
}

////////////////////////////////////////////////////////////////////////////
$l_Template = str_replace("@@MODE@@", AI_EXPERT . '
/' . SMART_SCAN, $l_Template);

if (AI_EXPERT == 0) {
   $l_Result .= '
<div class="rep">' . AI_STR_057 . '</div>'; 
} else {
}

$l_Template = str_replace('
@@HEAD_TITLE@@', AI_STR_051 .  $g_AddPrefix . str_replace($g_NoPrefix, '', realpath('.')), $l_Template);

define('
QCR_INDEX_FILENAME', 'fn');
define('
QCR_INDEX_TYPE', 'type');
define('
QCR_INDEX_WRITABLE', 'wr');
define('
QCR_SVALUE_FILE', '1');
define('
QCR_SVALUE_FOLDER', '0');

/**
 * Extract emails from the string
 * @param string $email
 * @return array of strings with emails or false on error
 */
function getEmails($email)
{
    $email = preg_split('
#[,s;]#', $email, -1, PREG_SPLIT_NO_EMPTY);
    
$r = array();
    for (
$i 0$size sizeof($email); $i $size$i++)
    {
            if (
function_exists('filter_var')) {
              if (
filter_var($email[$i], FILTER_VALIDATE_EMAIL))
              {
                  
$r[] = $email[$i];
               }
                } else {
                   
// for PHP4
                   
if (strpos($email[$i], '@') !== false) {
                  
$r[] = $email[$i];
                   }
                }
    }
    return empty(
$r) ? false $r;
}

/**
 * Get bytes from shorthand byte values (1M, 1G...)
 * @param int|string $val
 * @return int
 */
function getBytes($val)
{
    
$val trim($val);
    
$last strtolower($val{strlen($val) - 1});
    switch(
$last) {
        case 
't':
            
$val *= 1024;
        case 
'g':
            
$val *= 1024;
        case 
'm':
            
$val *= 1024;
        case 
'k':
            
$val *= 1024;
    }
    return 
intval($val);
}

/**
 * Format bytes to human readable
 * @param int $bites
 * @return string
 */
function bytes2Human($bites)
{
    if (
$bites 1024)
    {
        return 
$bites ' b';
    }
    elseif ((
$kb $bites 1024) < 1024)
    {
        return 
number_format($kb2) . ' Kb';
    }
    elseif ((
$mb $kb 1024) < 1024)
    {
        return 
number_format($mb2) . ' Mb';
    }
    elseif ((
$gb $mb 1024) < 1024)
    {
        return 
number_format($gb2) . ' Gb';
    }
    else
    {
        return 
number_format($gb 10242) . 'Tb';
    }
}

///////////////////////////////////////////////////////////////////////////
function needIgnore($par_FN$par_CRC) {
  global 
$g_IgnoreList;
  
  for (
$i 0$i count($g_IgnoreList); $i++) {
     if (
strpos($par_FN$g_IgnoreList[$i][0]) !== false) {
        if (
$par_CRC == $g_IgnoreList[$i][1]) {
            return 
true;
        }
     }
  }
  
  return 
false;
}

///////////////////////////////////////////////////////////////////////////
function printList($par_List$par_Details null$par_NeedIgnore false$par_SigId null$par_TableName null) {
  global 
$g_Structure$g_NoPrefix$g_AddPrefix;
  
  if (
$par_TableName == null) {
     
$par_TableName 'table_' rand(1000000,9000000);
  }

  
$l_Result '';
  
$l_Result .= "<div class="flist"><table cellspacing=1 cellpadding=4 border=0 id="" . $par_TableName . "">";

  
$l_Result .= "<thead><tr class="tbgh" . ( $i % 2 ). "">";
  
$l_Result .= "<th width=70%>" AI_STR_004 "</th>";
  
$l_Result .= "<th>" AI_STR_005 "</th>";
  
$l_Result .= "<th>" AI_STR_006 "</th>";
  
$l_Result .= "<th width=90>" AI_STR_007 "</th>";
  
$l_Result .= "<th width=0 class="hidd">CRC32</th>";
  
$l_Result .= "<th width=0 class="hidd"></th>";
  
$l_Result .= "<th width=0 class="hidd"></th>";
  
$l_Result .= "<th width=0 class="hidd"></th>";
  
  
$l_Result .= "</tr></thead><tbody>";

  for (
$i 0$i count($par_List); $i++) {
    if (
$par_SigId != null) {
       
$l_SigId 'id_' $par_SigId[$i];
    } else {
       
$l_SigId 'id_z' rand(1000000,9000000);
    }
    
    
$l_Pos $par_List[$i];
        if (
$par_NeedIgnore) {
             if (
needIgnore($g_Structure['n'][$par_List[$i]], $g_Structure['crc'][$l_Pos])) {
                 continue;
             }
        }
  
     
$l_Creat $g_Structure['c'][$l_Pos] > date("d/m/Y H:i:s"$g_Structure['c'][$l_Pos]) : '-';
     
$l_Modif $g_Structure['m'][$l_Pos] > date("d/m/Y H:i:s"$g_Structure['m'][$l_Pos]) : '-';
     
$l_Size $g_Structure['s'][$l_Pos] > bytes2Human($g_Structure['s'][$l_Pos]) : '-';

     if (
$par_Details != null) {
        
$l_WithMarker preg_replace('|__AI_MARKER__|smi''<span class="marker">&nbsp;</span>'$par_Details[$i]);
        
$l_WithMarker preg_replace('|__AI_LINE1__|smi''<span class="line_no">'$l_WithMarker);
        
$l_WithMarker preg_replace('|__AI_LINE2__|smi''</span>'$l_WithMarker);
        
        
$l_Body '<div class="details">';

        if (
$par_SigId != null) {
           
$l_Body .= '<a href="#" onclick="return hsig('' . $l_SigId . '')">[x]</a> ';
        }

        
$l_Body .= $l_WithMarker '</div>';
     } else {
        
$l_Body '';
     }

     
$l_Result .= '<tr class="tbg' . ( $i ). '" o="' $l_SigId .'">';
     
     if (
is_file($g_Structure['n'][$l_Pos])) {
//        $l_Result .= '<td><div class="it"><a class="it" target="_blank" href="'. $defaults['site_url'] . 'ai-bolit.php?fn=' .
//                  $g_Structure['n'][$l_Pos] . '&ph=' . realCRC(PASS) . '&c=' . $g_Structure['crc'][$l_Pos] . '">' . $g_Structure['n'][$l_Pos] . '</a></div>' . $l_Body . '</td>';
        
$l_Result .= '<td><div class="it"><a class="it">' $g_AddPrefix str_replace($g_NoPrefix''$g_Structure['n'][$l_Pos]) . '</a></div>' $l_Body '</td>';
     } else {
        
$l_Result .= '<td><div class="it"><a class="it">' $g_AddPrefix str_replace($g_NoPrefix''$g_Structure['n'][$par_List[$i]]) . '</a></div></td>';
     }
     
     
$l_Result .= '<td align=center><div class="ctd">' $l_Creat '</div></td>';
     
$l_Result .= '<td align=center><div class="ctd">' $l_Modif '</div></td>';
     
$l_Result .= '<td align=center><div class="ctd">' $l_Size '</div></td>';
     
$l_Result .= '<td class="hidd"><div class="hidd">-</div></td>';
     
$l_Result .= '<td class="hidd"><div class="hidd">' $g_Structure['c'][$l_Pos] . '</div></td>';
     
$l_Result .= '<td class="hidd"><div class="hidd">' $g_Structure['m'][$l_Pos] . '</div></td>';
     
$l_Result .= '<td class="hidd"><div class="hidd">' $l_SigId '</div></td>';
     
$l_Result .= '</tr>';

  }

  
$l_Result .= "</tbody></table></div><div class=clear style="margin20px 0 0 0"></div>";

  return 
$l_Result;
}

///////////////////////////////////////////////////////////////////////////
function printPlainList($par_List$par_Details null$par_NeedIgnore false$par_SigId null$par_TableName null) {
  global 
$g_Structure$g_NoPrefix$g_AddPrefix;
  
//  $l_Result = "n#n";

  
$l_Src = array('&quot;''&lt;''&gt;''&amp;');
  
$l_Dst = array('"',      '<',    '>',    '&');

  for (
$i 0$i count($par_List); $i++) {
    
$l_Pos $par_List[$i];
        if (
$par_NeedIgnore) {
             if (
needIgnore($g_Structure['n'][$par_List[$i]], $g_Structure['crc'][$l_Pos])) {
                 continue;
             }                      
        }
  

     if (
$par_Details != null) {
        
$l_Body preg_replace('|(Ld+).+__AI_MARKER__|smi''$1: ...'$par_Details[$i]);
        
$l_Body preg_replace('/[^x21-x7F]/''.'$l_Body);
        
$l_Body str_replace($l_Src$l_Dst$l_Body);

     } else {
        
$l_Body '';
     }

     if (
is_file($g_Structure['n'][$l_Pos])) {
         
        
$l_Result .= $g_AddPrefix str_replace($g_NoPrefix''$g_Structure['n'][$l_Pos]) . "ttt" $l_Body "n";
     } else {
        
$l_Result .= $g_AddPrefix str_replace($g_NoPrefix''$g_Structure['n'][$par_List[$i]]) . "n";
     }
     
  }

  return 
$l_Result;
}

///////////////////////////////////////////////////////////////////////////
function extractValue(&$par_Str$par_Name) {
  if (
preg_match('|<tr><td class="e">s*'.$par_Name.'s*</td><td class="v">(.+?)</td>|sm'$par_Str$l_Result)) {
     return 
str_replace('no value'''strip_tags($l_Result[1]));
  }
}

///////////////////////////////////////////////////////////////////////////
function QCR_ExtractInfo($par_Str) {
   
$l_PhpInfoSystem extractValue($par_Str'System');
   
$l_PhpPHPAPI extractValue($par_Str'Server API');
   
$l_AllowUrlFOpen extractValue($par_Str'allow_url_fopen');
   
$l_AllowUrlInclude extractValue($par_Str'allow_url_include');
   
$l_DisabledFunction extractValue($par_Str'disable_functions');
   
$l_DisplayErrors extractValue($par_Str'display_errors');
   
$l_ErrorReporting extractValue($par_Str'error_reporting');
   
$l_ExposePHP extractValue($par_Str'expose_php');
   
$l_LogErrors extractValue($par_Str'log_errors');
   
$l_MQGPC extractValue($par_Str'magic_quotes_gpc');
   
$l_MQRT extractValue($par_Str'magic_quotes_runtime');
   
$l_OpenBaseDir extractValue($par_Str'open_basedir');
   
$l_RegisterGlobals extractValue($par_Str'register_globals');
   
$l_SafeMode extractValue($par_Str'safe_mode');


   
$l_DisabledFunction = ($l_DisabledFunction == '' '-?-' $l_DisabledFunction);
   
$l_OpenBaseDir = ($l_OpenBaseDir == '' '-?-' $l_OpenBaseDir);

   
$l_Result '<div class="title">' AI_STR_008 ': ' phpversion() . '</div>';
   
$l_Result .= 'System Version: <span class="php_ok">' $l_PhpInfoSystem '</span><br/>';
   
$l_Result .= 'PHP API: <span class="php_ok">' $l_PhpPHPAPI'</span><br/>';
   
$l_Result .= 'allow_url_fopen: <span class="php_' . ($l_AllowUrlFOpen == 'On' 'bad' 'ok') . '">' $l_AllowUrlFOpen'</span><br/>';
   
$l_Result .= 'allow_url_include: <span class="php_' . ($l_AllowUrlInclude == 'On' 'bad' 'ok') . '">' $l_AllowUrlInclude'</span><br/>';
   
$l_Result .= 'disable_functions: <span class="php_' . ($l_DisabledFunction == '-?-' 'bad' 'ok') . '">' $l_DisabledFunction'</span><br/>';
   
$l_Result .= 'display_errors: <span class="php_' . ($l_DisplayErrors == 'On' 'ok' 'bad') . '">' $l_DisplayErrors'</span><br/>';
   
$l_Result .= 'error_reporting: <span class="php_ok">' $l_ErrorReporting'</span><br/>';
   
$l_Result .= 'expose_php: <span class="php_' . ($l_ExposePHP == 'On' 'bad' 'ok') . '">' $l_ExposePHP'</span><br/>';
   
$l_Result .= 'log_errors: <span class="php_' . ($l_LogErrors == 'On' 'ok' 'bad') . '">' $l_LogErrors '</span><br/>';
   
$l_Result .= 'magic_quotes_gpc: <span class="php_' . ($l_MQGPC == 'On' 'ok' 'bad') . '">' $l_MQGPC'</span><br/>';
   
$l_Result .= 'magic_quotes_runtime: <span class="php_' . ($l_MQRT == 'On' 'bad' 'ok') . '">' $l_MQRT'</span><br/>';
   
$l_Result .= 'register_globals: <span class="php_' . ($l_RegisterGlobals == 'On' 'bad' 'ok') . '">' $l_RegisterGlobals '</span><br/>';
   
$l_Result .= 'open_basedir: <span class="php_' . ($l_OpenBaseDir == '-?-' 'bad' 'ok') . '">' $l_OpenBaseDir '</span><br/>';
   
   if (
phpversion() < '5.3.0') {
      
$l_Result .= 'safe_mode (PHP < 5.3.0): <span class="php_' . ($l_SafeMode == 'On' 'ok' 'bad') . '">' $l_SafeMode'</span><br/>';
   }

   return 
$l_Result '<p>';
}

///////////////////////////////////////////////////////////////////////////
function QCR_Debug($par_Str "") {
  if (!
DEBUG_MODE) {
     return;
  }

  
$l_MemInfo ' ';  
  if (
function_exists('memory_get_usage')) {
     
$l_MemInfo .= ' curmem=' .  bytes2Human(memory_get_usage());
  }

  if (
function_exists('memory_get_peak_usage')) {
     
$l_MemInfo .= ' maxmem=' .  bytes2Human(memory_get_peak_usage());
  }

  
stdOut("n" date('H:i:s') . ': ' $par_Str $l_MemInfo "n");
}


///////////////////////////////////////////////////////////////////////////
function QCR_ScanDirectories($l_RootDir)
{
    global 
$g_Structure$g_Counter$g_Doorway$g_FoundTotalFiles$g_FoundTotalDirs
            
$defaults$g_SkippedFolders$g_UrlIgnoreList$g_DirIgnoreList$g_UnsafeDirArray
                        
$g_UnsafeFilesFound$g_SymLinks$g_HiddenFiles$g_UnixExec$g_IgnoredExt$g_SensitiveFiles
                        
$g_SuspiciousFiles$g_ShortListExt;

    static 
$l_Buffer '';

    
$l_DirCounter 0;
    
$l_DoorwayFilesCounter 0;
    
$l_SourceDirIndex $g_Counter 1;

    
QCR_Debug('Scan ' $l_RootDir);

        
$l_QuotedSeparator quotemeta(DIR_SEPARATOR); 
     if (
$l_DIRH = @opendir($l_RootDir))
    {
        while ((
$l_FileName readdir($l_DIRH)) !== false)
        {
            if (
$l_FileName == '.' || $l_FileName == '..') continue;

            
$l_FileName $l_RootDir DIR_SEPARATOR $l_FileName;

            
$l_Type filetype($l_FileName);
            if (
$l_Type == "link"
            {
                
$g_SymLinks[] = $l_FileName;
                continue;
            } else            
            if (
$l_Type != "file" && $l_Type != "dir" ) {
                
$g_UnixExec[] = $l_FileName;
                continue;
            }    
                        
            
$l_Ext substr($l_FileNamestrrpos($l_FileName'.') + 1);
            
$l_IsDir is_dir($l_FileName);

            if (
in_array($l_Ext$g_SuspiciousFiles)) 
            {
                
$g_UnixExec[] = $l_FileName;
            }

            
// which files should be scanned
            
$l_NeedToScan SCAN_ALL_FILES || (in_array($l_Ext$g_SensitiveFiles));
            
            if (
in_array(strtolower($l_Ext), $g_IgnoredExt)) {    
               
$l_NeedToScan false;
            }

            if (
$l_IsDir)
            {
                
// if folder in ignore list
                
$l_Skip false;
                for (
$dr 0$dr count($g_DirIgnoreList); $dr++) {
                    if ((
$g_DirIgnoreList[$dr] != '') &&
                        
preg_match('#' $g_DirIgnoreList[$dr] . '#'$l_FileName$l_Found)) {
                        
$l_Skip true;
                    }
                }
            
                
// skip on ignore
                
if ($l_Skip) {
                    
$g_SkippedFolders[] = $l_FileName;
                    continue;
                }
                
                
$l_BaseName basename($l_FileName);

                if ((
strpos($l_BaseName'.') === 0) && ($l_BaseName != '.htaccess')) {
                   
$g_HiddenFiles[] = $l_FileName;
                }

//                $g_Structure['d'][$g_Counter] = $l_IsDir;
//                $g_Structure['n'][$g_Counter] = $l_FileName;
                
if (ONE_PASS) {
                    
$g_Structure['n'][$g_Counter] = $l_FileName DIR_SEPARATOR;
                } else {
                    
$l_Buffer .= $l_FileName DIR_SEPARATOR "n";
                }

                
$l_DirCounter++;

                if (
$l_DirCounter MAX_ALLOWED_PHP_HTML_IN_DIR)
                {
                    
$g_Doorway[] = $l_SourceDirIndex;
                    
$l_DirCounter = -655360;
                }

                
$g_Counter++;
                
$g_FoundTotalDirs++;

                
QCR_ScanDirectories($l_FileName);
            } else
            {
                if (
$l_NeedToScan)
                {
                    
$g_FoundTotalFiles++;
                    if (
in_array($l_Ext$g_ShortListExt)) 
                    {
                        
$l_DoorwayFilesCounter++;
                        
                        if (
$l_DoorwayFilesCounter MAX_ALLOWED_PHP_HTML_IN_DIR)
                        {
                            
$g_Doorway[] = $l_SourceDirIndex;
                            
$l_DoorwayFilesCounter = -655360;
                        }
                    }

                    if (
ONE_PASS) {
                        
QCR_ScanFile($l_FileName$g_Counter++);
                    } else {
                        
$l_Buffer .= $l_FileName."n";
                    }

                    
$g_Counter++;
                }
            }

            if (
strlen($l_Buffer) > 32000)
            { 
                
file_put_contents(QUEUE_FILENAME$l_BufferFILE_APPEND) or die("Cannot write to file ".QUEUE_FILENAME);
                
$l_Buffer '';
            }

        }

        
closedir($l_DIRH);
    }
    
    if ((
$l_RootDir == ROOT_PATH) && !empty($l_Buffer)) {
        
file_put_contents(QUEUE_FILENAME$l_BufferFILE_APPEND) or die("Cannot write to file " QUEUE_FILENAME);
        
$l_Buffer '';                                                                            
    }

}


///////////////////////////////////////////////////////////////////////////
function getFragment($par_Content$par_Pos) {
  
$l_MaxChars MAX_PREVIEW_LEN;
  
$l_MaxLen strlen($par_Content);
  
$l_RightPos min($par_Pos $l_MaxChars$l_MaxLen); 
  
$l_MinPos max(0$par_Pos $l_MaxChars);

  
$l_FoundStart substr($par_Content0$par_Pos);
  
$l_FoundStart str_replace("r"''$l_FoundStart);
  
$l_LineNo strlen($l_FoundStart) - strlen(str_replace("n"''$l_FoundStart)) + 1;

  
$par_Content preg_replace('/[x00-x1Fx80-xFF]/''~'$par_Content);

  
$l_Res '__AI_LINE1__' $l_LineNo "__AI_LINE2__  " . ($l_MinPos '…' '') . substr($par_Content$l_MinPos$par_Pos $l_MinPos) . 
           
'__AI_MARKER__' 
           
substr($par_Content$par_Pos$l_RightPos $par_Pos 1);

  
$l_Res htmlspecialchars(UnwrapObfu($l_Res), ENT_COMPAT|ENT_IGNORE);
  
$l_Res str_replace('~''·'$l_Res);

  return 
$l_Res;
}

///////////////////////////////////////////////////////////////////////////
function escapedHexToHex($escaped)
$GLOBALS['g_EncObfu']++; return chr(hexdec($escaped[1])); }
function 
escapedOctDec($escaped)
$GLOBALS['g_EncObfu']++; return chr(octdec($escaped[1])); }
function 
escapedDec($escaped)
$GLOBALS['g_EncObfu']++; return chr($escaped[1]); }

///////////////////////////////////////////////////////////////////////////
if (!defined('T_ML_COMMENT')) {
   
define('T_ML_COMMENT'T_COMMENT);
} else {
   
define('T_DOC_COMMENT'T_ML_COMMENT);
}

function 
UnwrapObfu($par_Content) {
  
$GLOBALS['g_EncObfu'] = 0;
  
  
$search  = array( ' ;'' ='' ,'' .'' ('' )'' {'' }''; ''= '', ''. ''( ''( ''{ ''} ');
  
$replace = array(  ';',  '=',  ',',  '.',  '(',  ')',  '{',  '}'';',  '=',  ',',  '.',  '(',  ')',  '{',  '}');
  
$par_Content str_replace('@'''$par_Content);
  
$par_Content preg_replace('~s+~'' '$par_Content);
  
$par_Content str_replace($search$replace$par_Content);
  
$par_Content preg_replace_callback('~bchr(s*([0-9a-fA-FxX]+)s*)~', function ($m) { return "'".chr(intval($m[1], 0))."'"; }, $par_Content );

  
$par_Content preg_replace_callback('/\\x([a-fA-F0-9]{1,2})/i','escapedHexToHex'$par_Content);
  
$par_Content preg_replace_callback('/\\([0-9]{1,3})/i','escapedOctDec'$par_Content);

  
$par_Content preg_replace('/['"]s*?.+s*?['"]/smi', '', $par_Content);

  return $par_Content;
}


///////////////////////////////////////////////////////////////////////////
// Unicode BOM is U+FEFF, but after encoded, it will look like this.
define ('
UTF32_BIG_ENDIAN_BOM'   , chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
define ('
UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
define ('
UTF16_BIG_ENDIAN_BOM'   , chr(0xFE) . chr(0xFF));
define ('
UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
define ('
UTF8_BOM'               , chr(0xEF) . chr(0xBB) . chr(0xBF));

function detect_utf_encoding($text) {
    $first2 = substr($text, 0, 2);
    $first3 = substr($text, 0, 3);
    $first4 = substr($text, 0, 3);
    
    if ($first3 == UTF8_BOM) return '
UTF-8';
    elseif ($first4 == UTF32_BIG_ENDIAN_BOM) return '
UTF-32BE';
    elseif ($first4 == UTF32_LITTLE_ENDIAN_BOM) return '
UTF-32LE';
    elseif ($first2 == UTF16_BIG_ENDIAN_BOM) return '
UTF-16BE';
    elseif ($first2 == UTF16_LITTLE_ENDIAN_BOM) return '
UTF-16LE';

    return false;
}

///////////////////////////////////////////////////////////////////////////
function QCR_SearchPHP($src)
{
  if (preg_match("/(<?php[ws]{5,})/smi", $src, $l_Found, PREG_OFFSET_CAPTURE)) {
      return $l_Found[0][1];
  }

  if (preg_match("/(<script[^>]*languages*=s*)('
|"|)php('|"|)([^>]*>)/i", $src$l_Found, PREG_OFFSET_CAPTURE)) {
    return 
$l_Found[0][1];
  }

  return false;
}


///////////////////////////////////////////////////////////////////////////
function knowUrl(
$par_URL) {
  global 
$g_UrlIgnoreList;

  for (
$jk = 0; $jk < count($g_UrlIgnoreList); $jk++) {
     if  (stripos(
$par_URL$g_UrlIgnoreList[$jk]) !== false) {
         return true;
     }
  }

  return false;
}

///////////////////////////////////////////////////////////////////////////

function makeSummary(
$par_Str$par_Number$par_Style) {
   return '<tr><td class="' . $par_Style . '" width=400>' . 
$par_Str . '</td><td class="' . $par_Style . '">' . $par_Number . '</td></tr>';
}

///////////////////////////////////////////////////////////////////////////

function CheckVulnerability(
$par_Filename$par_Index$par_Content) {
    global 
$g_Vulnerable;
    
    
$l_Vuln = array();
    
    if ((stripos(
$par_Filename, 'editor/filemanager/upload/test.html') !== false) ||
        (stripos(
$par_Filename, 'editor/filemanager/browser/default/connectors/php/') !== false) ||
        (stripos(
$par_Filename, 'editor/filemanager/connectors/uploadtest.html') !== false) ||
       (stripos(
$par_Filename, 'editor/filemanager/browser/default/connectors/test.html') !== false)) {
        
$l_Vuln['id'] = 'AFU : FCKEDITOR : http://www.exploit-db.com/exploits/17644/ & /exploit/249';
        
$l_Vuln['ndx'] = $par_Index;
        
$g_Vulnerable[] = $l_Vuln;
        return true;
    }

    if ((stripos(
$par_Filename, 'inc_php/image_view.class.php') !== false) ||
        (stripos(
$par_Filename, '/inc_php/framework/image_view.class.php') !== false)) {
        if (strpos(
$par_Content, 'showImageByID') === false) {
            
$l_Vuln['id'] = 'AFU : REVSLIDER : http://www.exploit-db.com/exploits/35385/';
            
$l_Vuln['ndx'] = $par_Index;
            
$g_Vulnerable[] = $l_Vuln;
            return true;
        }
        
        return false;
    }

    if (stripos(
$par_Filename, 'includes/database/database.inc') !== false) {
        if (strpos(
$par_Content, 'foreach ($data as $i => $value)') !== false) {
            
$l_Vuln['id'] = 'SQLI : DRUPAL : CVE-2014-3704';
            
$l_Vuln['ndx'] = $par_Index;
            
$g_Vulnerable[] = $l_Vuln;
            return true;
        }
        
        return false;
    }

    if (stripos(
$par_Filename, 'engine/classes/min/index.php') !== false) {
        if (stripos(
$par_Content, 'tr_replace(chr(0)') === false) {
            
$l_Vuln['id'] = 'AFD : MINIFY : CVE-2013-6619';
            
$l_Vuln['ndx'] = $par_Index;
            
$g_Vulnerable[] = $l_Vuln;
            return true;
        }
        
        return false;
    }

    if (( stripos(
$par_Filename, 'timthumb.php') !== false ) || 
        ( stripos(
$par_Filename, 'thumb.php') !== false ) || 
        ( stripos(
$par_Filename, 'cache.php') !== false ) || 
        ( stripos(
$par_Filename, '_img.php') !== false )) {
        if (strpos(
$par_Content, 'code.google.com/p/timthumb') !== false && strpos($par_Content, '2.8.14') === false ) {
            
$l_Vuln['id'] = 'RCE : TIMTHUMB : CVE-2011-4106,CVE-2014-4663';
            
$l_Vuln['ndx'] = $par_Index;
            
$g_Vulnerable[] = $l_Vuln;
            return true;
        }
        
        return false;
    }

    if (stripos(
$par_Filename, 'fancybox-for-wordpress/fancybox.php') !== false) {
        if (strpos(
$par_Content, ''reset' == $_REQUEST['action']') !== false) {
            
$l_Vuln['id'] = 'CODE INJECTION : FANCYBOX';
            
$l_Vuln['ndx'] = $par_Index;
            
$g_Vulnerable[] = $l_Vuln;
            return true;
        }
        
        return false;
    }
    if (stripos(
$par_Filename, 'cherry-plugin/admin/import-export/upload.php') !== false) {
        if (strpos(
$par_Content, 'verify nonce') === false) {
            
$l_Vuln['id'] = 'AFU : Cherry Plugin';
            
$l_Vuln['ndx'] = $par_Index;
            
$g_Vulnerable[] = $l_Vuln;
            return true;
        }
        
        return false;
    }
    
    
    if (stripos(
$par_Filename, 'tiny_mce/plugins/tinybrowser/tinybrowser.php') !== false) {    
        
$l_Vuln['id'] = 'AFU : TINYMCE : http://www.exploit-db.com/exploits/9296/';
        
$l_Vuln['ndx'] = $par_Index;
        
$g_Vulnerable[] = $l_Vuln;
        
        return true;
    }

    if (stripos(
$par_Filename, 'scripts/setup.php') !== false) {        
        if (strpos(
$par_Content, 'PMA_Config') !== false) {
            
$l_Vuln['id'] = 'CODE INJECTION : PHPMYADMIN : http://1337day.com/exploit/5334';
            
$l_Vuln['ndx'] = $par_Index;
            
$g_Vulnerable[] = $l_Vuln;
            return true;
        }
        
        return false;
    }

    if (stripos(
$par_Filename, '/uploadify.php') !== false) {        
        if (strpos(
$par_Content, 'move_uploaded_file($tempFile,$targetFile') !== false) {
            
$l_Vuln['id'] = 'AFU : UPLOADIFY : CVE: 2012-1153';
            
$l_Vuln['ndx'] = $par_Index;
            
$g_Vulnerable[] = $l_Vuln;
            return true;
        }
        
        return false;
    }

}

///////////////////////////////////////////////////////////////////////////
function QCR_GoScan(
$par_Offset)
{
    global 
$g_IframerFragment$g_Iframer$g_Redirect$g_Doorway$g_EmptyLink$g_Structure$g_Counter
           
$g_HeuristicType$g_HeuristicDetected$g_TotalFolder$g_TotalFiles$g_WarningPHP$g_AdwareList,
           
$g_CriticalPHP$g_Phishing$g_CriticalJS$g_UrlIgnoreList$g_CriticalJSFragment$g_PHPCodeInside$g_PHPCodeInsideFragment
           
$g_NotRead$g_WarningPHPFragment$g_WarningPHPSig$g_BigFiles$g_RedirectPHPFragment$g_EmptyLinkSrc$g_CriticalPHPSig$g_CriticalPHPFragment
           
$g_Base64Fragment$g_UnixExec$g_PhishingSigFragment$g_PhishingFragment$g_PhishingSig$g_CriticalJSSig$g_IframerFragment$g_CMS$defaults$g_AdwareListFragment$g_KnownList,$g_Vulnerable;

    QCR_Debug('QCR_GoScan ' . 
$par_Offset);

    
$i = 0;
    
    try {
        
$s_file = new SplFileObject(QUEUE_FILENAME);
        
$s_file->setFlags(SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);

        foreach (
$s_file as $l_Filename) {
            QCR_ScanFile(
$l_Filename$i++);
        }
        
        unset(
$s_file);    
    }
    catch (Exception 
$e) { QCR_Debug( $e->getMessage() ); }
}

///////////////////////////////////////////////////////////////////////////
function QCR_ScanFile(
$l_Filename$i = 0)
{
    global 
$g_IframerFragment$g_Iframer$g_Redirect$g_Doorway$g_EmptyLink$g_Structure$g_Counter
           
$g_HeuristicType$g_HeuristicDetected$g_TotalFolder$g_TotalFiles$g_WarningPHP$g_AdwareList,
           
$g_CriticalPHP$g_Phishing$g_CriticalJS$g_UrlIgnoreList$g_CriticalJSFragment$g_PHPCodeInside$g_PHPCodeInsideFragment
           
$g_NotRead$g_WarningPHPFragment$g_WarningPHPSig$g_BigFiles$g_RedirectPHPFragment$g_EmptyLinkSrc$g_CriticalPHPSig$g_CriticalPHPFragment
           
$g_Base64Fragment$g_UnixExec$g_PhishingSigFragment$g_PhishingFragment$g_PhishingSig$g_CriticalJSSig$g_IframerFragment$g_CMS$defaults$g_AdwareListFragment$g_KnownList,$g_Vulnerable;

    global 
$g_CRC;
    static 
$_files_and_ignored = 0;

            
$l_CriticalDetected = false;
            
$l_Stat = stat($l_Filename);

            if (substr(
$l_Filename, -1) == DIR_SEPARATOR) {
                // FOLDER
                
$g_Structure['n'][$i] = $l_Filename;
                
$g_TotalFolder++;
                printProgress(
$_files_and_ignored$l_Filename);
                return;
            }

            QCR_Debug('Scan file ' . 
$l_Filename);
            printProgress(++
$_files_and_ignored$l_Filename);

            // FILE
            if ((MAX_SIZE_TO_SCAN > 0 AND 
$l_Stat['size'] > MAX_SIZE_TO_SCAN) || ($l_Stat['size'] < 0))
            {
                
$g_BigFiles[] = $i;
                AddResult(
$l_Filename$i);
            }
            else
            {
                
$g_TotalFiles++;

            
$l_TSStartScan = microtime(true);

        if (filetype(
$l_Filename) == 'file') {
                   
$l_Content = @file_get_contents($l_Filename);
                   
$l_Unwrapped = @php_strip_whitespace($l_Filename);
                }

                if ((
$l_Content == '') && ($l_Stat['size'] > 0)) {
                   
$g_NotRead[] = $i;
                   AddResult(
$l_Filename$i);
                }

                // ignore itself
                if (strpos(
$l_Content, 'H24LKHLKJHKLHJGJG4567869869GGHJ') !== false) {
                    return;
                }

                // unix executables
                if (strpos(
$l_Content, chr(127) . 'ELF') !== false) 
                {
                    
$g_UnixExec[] = $l_Filename;
                    return;
                }

                
$g_CRC = realCRC($l_Content);

                                
$l_KnownCRC = $g_CRC + realCRC(basename($l_Filename));
                                if ( isset(
$g_KnownList[$l_KnownCRC]) ) {
                       //printProgress(++
$_files_and_ignored$l_Filename);
                                   return;
                                }

                
$l_UnicodeContent = detect_utf_encoding($l_Content);
                //
$l_Unwrapped = $l_Content;
                if (
$l_UnicodeContent !== false) {
                          if (function_exists('mb_convert_encoding')) {
                                      
$l_Unwrapped = mb_convert_encoding($l_Unwrapped, "CP1251");
                                   } else {
                                      
$g_NotRead[] = $i;
                                      AddResult(
$l_Filename$i);
                   }
                                }

                
$l_Unwrapped = UnwrapObfu($l_Unwrapped);
                
                // check vulnerability in files
                
$l_CriticalDetected = CheckVulnerability($l_Filename$i$l_Content);
                
                // critical
                
$g_SkipNextCheck = false;
                if (CriticalPHP(
$l_Filename$i$l_Unwrapped$l_Pos$l_SigId))
                {
                    
$g_CriticalPHP[] = $i;
                    
$g_CriticalPHPFragment[] = getFragment($l_Unwrapped$l_Pos);
                    
$g_CriticalPHPSig[] = $l_SigId;
                    
$g_SkipNextCheck = true;
                } else {
                         if (CriticalPHP(
$l_Filename$i$l_Content$l_Pos$l_SigId))
                         {
                             
$g_CriticalPHP[] = $i;
                             
$g_CriticalPHPFragment[] = getFragment($l_Content$l_Pos);
                            
$g_CriticalPHPSig[] = $l_SigId;
                             
$g_SkipNextCheck = true;
                         }
                }

                
$l_TypeDe = 0;
                if ((!
$g_SkipNextCheck) && HeuristicChecker($l_Content$l_TypeDe$l_Filename)) {
                    
$g_HeuristicDetected[] = $i;
                    
$g_HeuristicType[] = $l_TypeDe;
                    
$l_CriticalDetected = true;
                }

                // critical JS
                if (!
$g_SkipNextCheck) {
                    
$l_Pos = CriticalJS($l_Filename$i$l_Unwrapped$l_SigId);
                    if (
$l_Pos !== false)
                    {
                        
$g_CriticalJS[] = $i;
                        
$g_CriticalJSFragment[] = getFragment($l_Unwrapped$l_Pos);
                        
$g_CriticalJSSig[] = $l_SigId;
                        
$g_SkipNextCheck = true;
                    }
                }

                // phishing
                if (!
$g_SkipNextCheck) {
                    
$l_Pos = Phishing($l_Filename$i$l_Unwrapped$l_SigId);
                    if (
$l_Pos !== false)
                    {
                        
$g_Phishing[] = $i;
                        
$g_PhishingFragment[] = getFragment($l_Unwrapped$l_Pos);
                        
$g_PhishingSigFragment[] = $l_SigId;
                        
$g_SkipNextCheck = true;
                    }
                }

            
            if (!
$g_SkipNextCheck) {
                if (SCAN_ALL_FILES || stripos(
$l_Filename, 'index.'))
                {
                    // check iframes
                    if (preg_match_all('|<iframe[^>]+src.+?>|smi', 
$l_Unwrapped$l_Found, PREG_SET_ORDER)) 
                    {
                        for (
$kk = 0; $kk < count($l_Found); $kk++) {
                            
$l_Pos = stripos($l_Found[$kk][0], 'http://');
                            
$l_Pos = $l_Pos || stripos($l_Found[$kk][0], 'https://');
                            
$l_Pos = $l_Pos || stripos($l_Found[$kk][0], 'ftp://');
                            if  ((
$l_Pos !== false ) && (!knowUrl($l_Found[$kk][0]))) {
                                 
$g_Iframer[] = $i;
                                 
$g_IframerFragment[] = getFragment($l_Found[$kk][0], $l_Pos);
                                 
$l_CriticalDetected = true;
                            }
                        }
                    }

                    // check empty links
                    if (((
$defaults['report_mask'] & REPORT_MASK_SPAMLINKS) == REPORT_MASK_SPAMLINKS) &&
                       (preg_match_all('|<a[^>]+href([^>]+?)>(.*?)</a>|smi', 
$l_Unwrapped$l_Found, PREG_SET_ORDER)))
                    {
                        for (
$kk = 0; $kk < count($l_Found); $kk++) {
                            if  ((stripos(
$l_Found[$kk][1], 'http://') !== false) &&
                                                            (trim(strip_tags(
$l_Found[$kk][2])) == '')) {

                                
$l_NeedToAdd = true;

                                if  ((stripos(
$l_Found[$kk][1], $default['site_url']) !== false)
                                                                 || knowUrl(
$l_Found[$kk][1])) {
                                        
$l_NeedToAdd = false;
                                }
                                
                                if (
$l_NeedToAdd && (count($g_EmptyLink) < MAX_EXT_LINKS)) {
                                    
$g_EmptyLink[] = $i;
                                    
$g_EmptyLinkSrc[$i][] = substr($l_Found[$kk][0], 0, MAX_PREVIEW_LEN);
                                    
$l_CriticalDetected = true;
                                }
                            }
                        }
                    }
                }

                // check for PHP code inside any type of file
                if (stripos(
$l_Filename, '.ph') === false)
                {
                    
$l_Pos = QCR_SearchPHP($l_Content);
                    if (
$l_Pos !== false)
                    {
                        
$g_PHPCodeInside[] = $i;
                        
$g_PHPCodeInsideFragment[] = getFragment($l_Unwrapped$l_Pos);
                        
$l_CriticalDetected = true;
                    }
                }

                // htaccess
                if (stripos(
$l_Filename, '.htaccess'))
                {
                
                    if (stripos(
$l_Content, 'index.php?name=$1') !== false ||
                        stripos(
$l_Content, 'index.php?m=1') !== false
                    )
                    {
                        
$g_SuspDir[] = $i;
                    }

                    
$l_HTAContent = preg_replace('|^s*#.+$|m', '', $l_Content);

                    
$l_Pos = stripos($l_Content, 'auto_prepend_file');
                    if (
$l_Pos !== false) {
                        
$g_Redirect[] = $i;
                        
$g_RedirectPHPFragment[] = getFragment($l_Content$l_Pos);
                        
$l_CriticalDetected = true;
                    }
                    
                    
$l_Pos = stripos($l_Content, 'auto_append_file');
                    if (
$l_Pos !== false) {
                        
$g_Redirect[] = $i;
                        
$g_RedirectPHPFragment[] = getFragment($l_Content$l_Pos);
                        
$l_CriticalDetected = true;
                    }

                    
$l_Pos = stripos($l_Content, '^(%2d|-)[^=]+$');
                    if (
$l_Pos !== false)
                    {
                        
$g_Redirect[] = $i;
                        
$g_RedirectPHPFragment[] = getFragment($l_Content$l_Pos);
                        
$l_CriticalDetected = true;
                    }

                    if (!
$l_CriticalDetected) {
                        
$l_Pos = stripos($l_Content, '%{HTTP_USER_AGENT}');
                        if (
$l_Pos !== false)
                        {
                            
$g_Redirect[] = $i;
                            
$g_RedirectPHPFragment[] = getFragment($l_Content$l_Pos);
                            
$l_CriticalDetected = true;
                        }
                    }

                    if (!
$l_CriticalDetected) {
                        if (
                            preg_match_all('|(RewriteConds+%{HTTP_HOST}/%1 !^[w.]*([^/]+)/\1
$s+[NC])|smi', $l_Content$l_Found, PREG_OFFSET_CAPTURE)
                           )
                        {
                            
$g_Redirect[] = $i;
                            
$g_RedirectPHPFragment[] = getFragment($l_Content$l_Found[0][1]);
                            
$l_CriticalDetected = true;
                        }
                    }
                    
                    if (!
$l_CriticalDetected) {
                        if (
                            preg_match_all("
|RewriteRules+.+?s+http://(.+?)/.+s+[.*R=d+.*]|smi", $l_HTAContent, $l_Found, PREG_SET_ORDER)
                        
)
                        {
                            
$l_Host str_replace('www.'''$_SERVER['HTTP_HOST']);
                            for (
$j 0$j sizeof($l_Found); $j++)
                            {
                                
$l_Found[$j][1] = str_replace('www.'''$l_Found[$j][1]);
                                if (
$l_Found[$j][1] != $l_Host)
                                {
                                    
$g_Redirect[] = $i;
                                    
$l_CriticalDetected true;
                                    break;
                                }
                            }
                        }
                    }

                    unset(
$l_HTAContent);
                }
            

                
// warnings
                
$l_Pos '';
                
                if (
WarningPHP($l_Filename$l_Unwrapped$l_Pos$l_SigId))
                {       
                    
$l_Prio 1;
                    if (
strpos($l_Filename'.ph') !== false) {
                       
$l_Prio 0;
                    }
                    
                    
$g_WarningPHP[$l_Prio][] = $i;
                    
$g_WarningPHPFragment[$l_Prio][] = getFragment($l_Content$l_Pos);
                    
$g_WarningPHPSig[] = $l_SigId;
                    
$l_CriticalDetected true;
                }
                

                
// adware
                
if (Adware($l_Filename$l_Unwrapped$l_Pos))
                {
                    
$g_AdwareList[] = $i;
                    
$g_AdwareListFragment[] = getFragment($l_Unwrapped$l_Pos);
                    
$l_CriticalDetected true;
                }

                
// articles
                
if (stripos($l_Filename'article_index'))
                {
                    
$g_AdwareSig[] = $i;
                    
$l_CriticalDetected true;
                }
            }
        } 
// end of if (!$g_SkipNextCheck) {
            
            
unset($l_Unwrapped);
            unset(
$l_Content);
            
            
//printProgress(++$_files_and_ignored, $l_Filename);

            
$l_TSEndScan microtime(true);
            
$l_Elapsed $l_TSEndScan $l_TSStartScan;
                        if (
$l_TSEndScan $l_TSStartScan >= 0.5) {
               
usleep(SCAN_DELAY 1000);
                        }

            if (
$g_SkipNextCheck || $l_CriticalDetected) {
                
AddResult($l_Filename$i);
            }


}

function 
AddResult($l_Filename$i)
{
    global 
$g_Structure$g_CRC;
    
    
$l_Stat stat($l_Filename);
    
$g_Structure['n'][$i] = $l_Filename;
    
$g_Structure['s'][$i] = $l_Stat['size'];
    
$g_Structure['c'][$i] = $l_Stat['ctime'];
    
$g_Structure['m'][$i] = $l_Stat['mtime'];
    
$g_Structure['crc'][$i] = $g_CRC;
}

///////////////////////////////////////////////////////////////////////////
function WarningPHP($l_FN$l_Content, &$l_Pos, &$l_SigId)
{
       global 
$g_SusDB,$g_ExceptFlex$gXX_FlexDBShe$gX_FlexDBShe$g_FlexDBShe$gX_DBShe$g_DBShe$g_Base64$g_Base64Fragment;

  
$l_Res false;

  if (
AI_EXTRA_WARN) {
      foreach (
$g_SusDB as $l_Item) {
        if (
preg_match('#(' $l_Item ')#smiS'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
                if (!
CheckException($l_Content$l_Found)) {
                    
$l_Pos $l_Found[0][1];
                    
$l_SigId myCheckSum($l_Item);
                    return 
true;
                }
        }
      }
  }

  if (
AI_EXPERT 2) {
        foreach (
$gXX_FlexDBShe as $l_Item) {
              if (
preg_match('#(' $l_Item ')#smiS'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
                 
$l_Pos $l_Found[0][1];
                 
$l_SigId myCheckSum($l_Item);
                return 
true;
              }
        }

    }

    if (
AI_EXPERT 1) {
        foreach (
$gX_FlexDBShe as $l_Item) {
              if (
preg_match('#(' $l_Item ')#smiS'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
                 
$l_Pos $l_Found[0][1];
                 
$l_SigId myCheckSum($l_Item);
                return 
true;
              }
        }

        
$l_Content_lo strtolower($l_Content);

        foreach (
$gX_DBShe as $l_Item) {
          
$l_Pos strpos($l_Content_lo$l_Item);
          if (
$l_Pos !== false) {
             
$l_SigId myCheckSum($l_Item);
             return 
true;
          }
        }
    }

}

///////////////////////////////////////////////////////////////////////////
function Adware($l_FN$l_Content, &$l_Pos)
{
  global 
$g_AdwareSig;

  
$l_Res false;

  foreach (
$g_AdwareSig as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           return 
true;
       }
    }
  }

  return 
$l_Res;
}

///////////////////////////////////////////////////////////////////////////
function CheckException(&$l_Content, &$l_Found) {
  global 
$g_ExceptFlex$gX_FlexDBShe$gXX_FlexDBShe$g_FlexDBShe$gX_DBShe$g_DBShe$g_Base64$g_Base64Fragment;
   
$l_FoundStrPlus substr($l_Contentmax($l_Found[0][1] - 100), 70);

   foreach (
$g_ExceptFlex as $l_ExceptItem) {
      if (@
preg_match('#(' $l_ExceptItem ')#smi'$l_FoundStrPlus$l_Detected)) {
         
$l_Exception true;
         return 
true;
      }
   }

   return 
false;
}

///////////////////////////////////////////////////////////////////////////
function Phishing($l_FN$l_Index$l_Content, &$l_SigId)
{
  global 
$g_PhishingSig$g_PhishFiles$g_PhishEntries;

  
$l_Res false;

  
// need check file (by extension) ?
  
$l_SkipCheck SMART_SCAN;

if (
$l_SkipCheck) {
      foreach(
$g_PhishFiles as $l_Ext) {
            if (
strpos($l_FN$l_Ext) !== false) {
                      
$l_SkipCheck false;
                        break;
              }
        }
  }

  
// need check file (by signatures) ?
  
if ($l_SkipCheck && preg_match('~' $g_PhishEntries '~smiS'$l_Content$l_Found)) {
      
$l_SkipCheck false;
  }

  if (
$l_SkipCheck && SMART_SCAN) {
      if (
DEBUG_MODE) {
         echo 
"Skipped phs file, not critical.n";
      }

      return 
false;
  }


  foreach (
$g_PhishingSig as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);

           if (
DEBUG_MODE) {
              echo 
"Phis: $l_FN matched [$l_Item] in $l_Posn";
           }

           return 
$l_Pos;
       }
    }
  }

  return 
$l_Res;
}

///////////////////////////////////////////////////////////////////////////
function CriticalJS($l_FN$l_Index$l_Content, &$l_SigId)
{
  global 
$g_JSVirSig$gX_JSVirSig$g_VirusFiles$g_VirusEntries;

  
$l_Res false;
  
    
// need check file (by extension) ?
    
$l_SkipCheck SMART_SCAN;
    
    if (
$l_SkipCheck) {
        foreach(
$g_VirusFiles as $l_Ext) {
              if (
strpos($l_FN$l_Ext) !== false) {
                        
$l_SkipCheck false;
                          break;
                }
          }
      }
  
    
// need check file (by signatures) ?
    
if ($l_SkipCheck && preg_match('~' $g_VirusEntries '~smiS'$l_Content$l_Found)) {
        
$l_SkipCheck false;
    }
  
    if (
$l_SkipCheck && SMART_SCAN) {
        if (
DEBUG_MODE) {
           echo 
"Skipped js file, not critical.n";
        }

        return 
false;
    }
  

  foreach (
$g_JSVirSig as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);

           if (
DEBUG_MODE) {
              echo 
"JS: $l_FN matched [$l_Item] in $l_Posn";
           }

           return 
$l_Pos;
       }
    }
  }

if (
AI_EXPERT 1) {
  foreach (
$gX_JSVirSig as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);

           if (
DEBUG_MODE) {
              echo 
"JS PARA: $l_FN matched [$l_Item] in $l_Posn";
           }

           return 
$l_Pos;
       }
    }
  }
}

  return 
$l_Res;
}


////////////////////////////////////////////////////////////////////////////
define('SUSP_MTIME'1); // suspicious mtime (greater than ctime)
define('SUSP_PERM'2); // suspicious permissions 
define('SUSP_PHP_IN_UPLOAD'3); // suspicious .php file in upload or image folder 

  
function get_descr_heur($type) {
     switch (
$type) {
         case 
SUSP_MTIME: return AI_STR_077
         case 
SUSP_PERM: return AI_STR_078;  
         case 
SUSP_PHP_IN_UPLOAD: return AI_STR_079
     }
     
     return 
"---";
  }

  
///////////////////////////////////////////////////////////////////////////
  
function HeuristicChecker($l_Content, &$l_Type$l_Filename) {
     
$res false;
     
     
$l_Stat stat($l_Filename);
     
// most likely changed by touch
     
if ($l_Stat['ctime'] < $l_Stat['mtime']) {
         
$l_Type SUSP_MTIME;
         return 
true;
     }

          
     
$l_Perm fileperms($l_Filename) & 0777;
     if ((
$l_Perm 0400 != 0400) || // not readable by owner
        
($l_Perm == 0000) ||
        (
$l_Perm == 0404) ||
        (
$l_Perm == 0505))
     {
         
$l_Type SUSP_PERM;
         return 
true;
     }

     
     if ((
strpos($l_Filename'.ph')) && (
         
strpos($l_Filename'/images/stories/') ||
         
//strpos($l_Filename, '/img/') ||
         //strpos($l_Filename, '/images/') ||
         //strpos($l_Filename, '/uploads/') ||
         
strpos($l_Filename'/wp-content/upload/'
        )        
     ) {
        
$l_Type SUSP_PHP_IN_UPLOAD;
         return 
true;
     }

          
     
/*
•    стартует с цифры
•    кол-во цифр в подстроке > 50%
•    паттерн <строчные символы или цифры><2+ заглавные>
•    паттерн <цифры><1-3 символов><цифра>
•    паттерн <символ><3+ цифры><символ>
•    паттерн <символ><4+ цифры>
•    нет гласных букв в строке
•    есть заглавные, строчные и цифры
•    три гласных подряд
•    две цифры не рядом
     */
     

     
return false;
  }

///////////////////////////////////////////////////////////////////////////
function CriticalPHP($l_FN$l_Index$l_Content, &$l_Pos, &$l_SigId)
{
  global 
$g_ExceptFlex$gXX_FlexDBShe$gX_FlexDBShe$g_FlexDBShe$gX_DBShe$g_DBShe$g_Base64$g_Base64Fragment,
  
$g_CriticalFiles$g_CriticalEntries;

  
// H24LKHLKJHKLHJGJG4567869869GGHJ

  // need check file (by extension) ?
  
$l_SkipCheck SMART_SCAN;

  if (
$l_SkipCheck) {
      foreach(
$g_CriticalFiles as $l_Ext) {
            if (
strpos($l_FN$l_Ext) !== false) {
              
$l_SkipCheck false;
              break;
                }
          }
    }
  
  
// need check file (by signatures) ?
  
if ($l_SkipCheck && preg_match('~' $g_CriticalEntries '~smiS'$l_Content$l_Found)) {
      
$l_SkipCheck false;
  }
  
  
  if (
strpos($l_FN'.php.') !== false ) {
     
$g_Base64[] = $l_Index;
     
$g_Base64Fragment[] = '".php."';
     
$l_Pos 0;

     if (
DEBUG_MODE) {
          echo 
"CRIT 7: $l_FN matched [$l_Item] in $l_Posn";
     }

     
AddResult($l_FN$l_Index);
  }

 
  
// if not critical - skip it 
  
if ($l_SkipCheck && SMART_SCAN) {
      if (
DEBUG_MODE) {
         echo 
"Skipped file, not critical.n";
      }

      return 
false;
  }

  foreach (
$g_FlexDBShe as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smiS'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);

           if (
DEBUG_MODE) {
              echo 
"CRIT 1: $l_FN matched [$l_Item] in $l_Posn";
           }

           return 
true;
       }
    }
  }

if (
AI_EXPERT 1) {
  foreach (
$gXX_FlexDBShe as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smiS'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);

           if (
DEBUG_MODE) {
              echo 
"CRIT 2: $l_FN matched [$l_Item] in $l_Posn";
           }

           return 
true;
       }
    }
  }
}

if (
AI_EXPERT 0) {
  foreach (
$gX_FlexDBShe as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smiS'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);

           if (
DEBUG_MODE) {
              echo 
"CRIT 3: $l_FN matched [$l_Item] in $l_Posn";
           }

           return 
true;
       }
    }
  }
}

  
$l_Content_lo strtolower($l_Content);

  foreach (
$g_DBShe as $l_Item) {
    
$l_Pos strpos($l_Content_lo$l_Item);
    if (
$l_Pos !== false) {
       
$l_SigId myCheckSum($l_Item);

       if (
DEBUG_MODE) {
          echo 
"CRIT 4: $l_FN matched [$l_Item] in $l_Posn";
       }

       return 
true;
    }
  }

if (
AI_EXPERT) {
  foreach (
$gX_DBShe as $l_Item) {
    
$l_Pos strpos($l_Content_lo$l_Item);
    if (
$l_Pos !== false) {
       
$l_SigId myCheckSum($l_Item);

       if (
DEBUG_MODE) {
          echo 
"CRIT 5: $l_FN matched [$l_Item] in $l_Posn";
       }

       return 
true;
    }
  }

  if ((
strpos($l_FN'.ph') !== false) && (AI_EXPERT 1)) {
     
// for php only
     
$g_Specials ');#';

       
$l_Pos stripos($l_Content$g_Specials);
       if ((
$l_Pos !== false) && ($l_Content[$l_Pos 3] != '#')) {
          
$l_SigId myCheckSum($g_Specials);
          return 
true;
     }
  }

}

  if ((
strpos($l_Content'GIF89') === 0) && (strpos($l_FN'.php') !== false )) {
     
$l_Pos 0;

     if (
DEBUG_MODE) {
          echo 
"CRIT 6: $l_FN matched [$l_Item] in $l_Posn";
     }

     return 
true;
  }

  
// detect uploaders / droppers
if (AI_EXPERT 1) {
  
$l_Found null;
  if (
     (
filesize($l_FN) < 1024) &&
     (
strpos($l_FN'.ph') !== false) &&
     (
       ((
$l_Pos strpos($l_Content'multipart/form-data')) > 0) || 
       ((
$l_Pos strpos($l_Content'$_FILE[') > 0)) ||
       ((
$l_Pos strpos($l_Content'move_uploaded_file')) > 0) ||
       (
preg_match('|bcopys*(|smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE))
     )
     ) {
       if (
$l_Found != null) {
          
$l_Pos $l_Found[0][1];
       } 
     if (
DEBUG_MODE) {
          echo 
"CRIT 7: $l_FN matched [$l_Item] in $l_Posn";
     }

     return 
true;
  }
}

  
// count number of base64_decode entries
  
$l_Count substr_count($l_Content'base64_decode');
  if (
$l_Count 10) {
     
$g_Base64[] = $l_Index;
     
$g_Base64Fragment[] = getFragment($l_Contentstripos($l_Content'base64_decode'));

     if (
DEBUG_MODE) {
        echo 
"CRIT 10: $l_FN matchedn";
     }

     
AddResult($l_FN$l_Index);
  }

  return 
false;
}

///////////////////////////////////////////////////////////////////////////
if (!isCli()) {
   
header('Content-type: text/html; charset=utf-8');
}

if (!
isCli()) {

  
$l_PassOK false;
  if (
strlen(PASS) > 8) {
     
$l_PassOK true;   
  } 

  if (
$l_PassOK && preg_match('|[0-9]|'PASS$l_Found) && preg_match('|[A-Z]|'PASS$l_Found) && preg_match('|[a-z]|'PASS$l_Found) ) {
     
$l_PassOK true;   
  }
  
  if (!
$l_PassOK) {  
    echo 
sprintf(AI_STR_009generatePassword());
    exit;
  }

  if (isset(
$_GET['fn']) && ($_GET['ph'] == crc32(PASS))) {
     
printFile();
     exit;
  }

  if (
$_GET['p'] != PASS) {
    
$generated_pass generatePassword(); 
    echo 
sprintf(AI_STR_010$generated_pass$generated_pass);
    exit;
  }
}

if (!
is_readable(ROOT_PATH)) {
  echo 
AI_STR_011;
  exit;
}

if (
isCli()) {
    if (
defined('REPORT_PATH') AND REPORT_PATH)
    {
        if (!
is_writable(REPORT_PATH))
        {
            die(
"nCannot write report. Report dir " REPORT_PATH " is not writable.");
        }

        else if (!
REPORT_FILE)
        {
            die(
"nCannot write report. Report filename is empty.");
        }

        else if ((
$file REPORT_PATH DIR_SEPARATOR REPORT_FILE) AND is_file($file) AND !is_writable($file))
        {
            die(
"nCannot write report. Report file '$file' exists but is not writable.");
        }
    }
}


$g_IgnoreList = array();
$g_DirIgnoreList = array();
$g_UrlIgnoreList = array();
$g_KnownList = array();

$l_IgnoreFilename $g_AiBolitAbsolutePath '/.aignore';
$l_DirIgnoreFilename $g_AiBolitAbsolutePath '/.adirignore';
$l_UrlIgnoreFilename $g_AiBolitAbsolutePath '/.aurlignore';
$l_KnownFilename '.aknown';

if (
file_exists($l_IgnoreFilename)) {
    
$l_IgnoreListRaw file($l_IgnoreFilename);
    for (
$i 0$i count($l_IgnoreListRaw); $i++) 
    {
        
$g_IgnoreList[] = explode("t"trim($l_IgnoreListRaw[$i]));
    }
    unset(
$l_IgnoreListRaw);
}

if (
file_exists($l_DirIgnoreFilename)) {
    
$g_DirIgnoreList file($l_DirIgnoreFilename);
    
    for (
$i 0$i count($g_DirIgnoreList); $i++) {
        
$g_DirIgnoreList[$i] = trim($g_DirIgnoreList[$i]);
    }
}

if (
file_exists($l_UrlIgnoreFilename)) {
    
$g_UrlIgnoreList file($l_UrlIgnoreFilename);
    
    for (
$i 0$i count($g_UrlIgnoreList); $i++) {
        
$g_UrlIgnoreList[$i] = trim($g_UrlIgnoreList[$i]);
    }
}


$g_AiBolitAbsolutePathKnownFiles dirname($g_AiBolitAbsolutePath) . '/known_files';
$g_AiBolitKnownFilesDirs = array('.');

if (
$l_DIRH = @opendir($g_AiBolitAbsolutePathKnownFiles))
{
    while ((
$l_FileName readdir($l_DIRH)) !== false)
    {
       if (
$l_FileName == '.' || $l_FileName == '..') continue;
          if (
defined('CMS') && $l_FileName != CMS) continue;
       
array_push($g_AiBolitKnownFilesDirs$l_FileName);
    }

    
closedir($l_DIRH);
}


foreach (
$g_AiBolitKnownFilesDirs as $l_PathKnownFiles)
{
    if (
$l_PathKnownFiles != '.') {
       
$l_AbsolutePathKnownFiles $g_AiBolitAbsolutePathKnownFiles '/' $l_PathKnownFiles;
    } else {
      
$l_AbsolutePathKnownFiles $l_PathKnownFiles;
    }

    if (
$l_DIRH opendir($l_AbsolutePathKnownFiles))
    {
        while ((
$l_FileName readdir($l_DIRH)) !== false)
        {
            if (
$l_FileName == '.' || $l_FileName == '..') continue;
               if (
strpos($l_FileName$l_KnownFilename) !== false) {
                           
stdOut("Loading " $l_FileName);
                           foreach (new 
SplFileObject($l_AbsolutePathKnownFiles '/' $l_FileName) as $line) {
                               
$g_KnownList[(int) $line] = 1;
                           }
                       }
        }
        
closedir($l_DIRH);
    }
}

stdOut("Loaded " count($g_KnownList) . ' known files');

try {
    
$s_file = new SplFileObject($g_AiBolitAbsolutePath."/ai-bolit.sig");
    
$s_file->setFlags(SplFileObject::READ_AHEAD SplFileObject::SKIP_EMPTY SplFileObject::DROP_NEW_LINE);
    foreach (
$s_file as $line) {
        
$g_FlexDBShe[] = preg_replace('~G(?:[^#\\]+|\\.)*+K#~''\#'$line); // escaping #
    
}
    
stdOut("Loaded " $s_file->key() . " signatures from ai-bolit.sig");
    
$s_file null// file handler is closed
} catch (Exception $e) { QCR_Debug"Import ai-bolit.sig " $e->getMessage() ); }

QCR_Debug();

    
$defaults['skip_ext'] = strtolower(trim($defaults['skip_ext']));
         if (
$defaults['skip_ext'] != '') {
        
$g_IgnoredExt explode(','$defaults['skip_ext']);
        for (
$i 0$i count($g_IgnoredExt); $i++) {
                
$g_IgnoredExt[$i] = trim($g_IgnoredExt[$i]);
             }

        
QCR_Debug('Skip files with extensions: ' implode(','$g_IgnoredExt));
        
stdOut('Skip extensions: ' implode(','$g_IgnoredExt));
         } 

// scan single file
if (defined('SCAN_FILE')) {
   if (
file_exists(SCAN_FILE) && is_file(SCAN_FILE) && is_readable(SCAN_FILE)) {
       
stdOut("Start scanning file '" SCAN_FILE "'.");
       
QCR_ScanFile(SCAN_FILE); 
   } else { 
       
stdOut("Error:" SCAN_FILE " either is not a file or readable");
   }
} else {
    if (isset(
$_GET['2check'])) {
        
$options['with-2check'] = 1;
    }
   
   
// scan list of files from file
   
if (!(ICHECK || IMAKE) && isset($options['with-2check']) && file_exists(DOUBLECHECK_FILE)) {
      
stdOut("Start scanning the list from '" DOUBLECHECK_FILE "'.n");
      
$lines file(DOUBLECHECK_FILE);
      for (
$i 0$size count($lines); $i $size$i++) {
         
$lines[$i] = trim($lines[$i]);
         if (empty(
$lines[$i])) unset($lines[$i]);
      }
      
/* skip first line with <?php die("Forbidden"); ?> */
      
unset($lines[0]);
      
$g_FoundTotalFiles count($lines);
      
$i 1;
      foreach (
$lines as $l_FN) {
         
is_dir($l_FN) && $g_TotalFolder++;
         
printProgress$i++, $l_FN);
         
$BOOL_RESULT true// display disable
         
is_file($l_FN) && QCR_ScanFile($l_FN$i);
         
$BOOL_RESULT false// display enable
      
}

      
$g_FoundTotalDirs $g_TotalFolder;
      
$g_FoundTotalFiles $g_TotalFiles;

   } else {
      
// scan whole file system
      
stdOut("Start scanning '" ROOT_PATH "'.n");
      
      
file_exists(QUEUE_FILENAME) && unlink(QUEUE_FILENAME);
      if (
ICHECK || IMAKE) {
      
// INTEGRITY CHECK
        
IMAKE and unlink(INTEGRITY_DB_FILE);
        
ICHECK and load_integrity_db();
        
QCR_IntegrityCheck(ROOT_PATH);
        
stdOut("Found $g_FoundTotalFiles files in $g_FoundTotalDirs directories.");
        if (
IMAKE) exit(0);
        if (
ICHECK) {
            
$i $g_Counter;
            
$g_CRC 0;
            
$changes = array();
            
$ref =& $g_IntegrityDB;
            foreach (
$g_IntegrityDB as $l_FileName => $type) {
                unset(
$g_IntegrityDB[$l_FileName]);
                
$l_Ext2 substr(strstr(basename($l_FileName), '.'), 1);
                if (
in_array(strtolower($l_Ext2), $g_IgnoredExt)) {
                    continue;
                }
                for (
$dr 0$dr count($g_DirIgnoreList); $dr++) {
                    if ((
$g_DirIgnoreList[$dr] != '') && preg_match('#' $g_DirIgnorceList[$dr] . '#'$l_FileName$l_Found)) {
                        continue 
2;
                    }
                }
                
$type in_array($type, array('added''modified')) ? $type 'deleted';
                
$type .= substr($l_FileName, -1) == '/' 'Dirs' 'Files';
                
$changes[$type][] = ++$i;
                
AddResult($l_FileName$i);
            }
            
$g_FoundTotalFiles count($changes['addedFiles']) + count($changes['modifiedFiles']);
            
stdOut("Found changes " count($changes['modifiedFiles']) . " files and added " count($changes['addedFiles']) . " files.");
        }
        
      } else {
      
QCR_ScanDirectories(ROOT_PATH);
      
stdOut("Found $g_FoundTotalFiles files in $g_FoundTotalDirs directories.");
      }

      
QCR_Debug();
      
stdOut(str_repeat(' '160),false);
      
QCR_GoScan(0);
      
unlink(QUEUE_FILENAME);
   }
}

QCR_Debug();

// detect version CMS
$l_CmsListDetector = new CmsVersionDetector('.');
$l_CmsDetectedNum $l_CmsListDetector->getCmsNumber();
for (
$tt 0$tt $l_CmsDetectedNum$tt++) {
    
$g_CMS[] = $l_CmsListDetector->getCmsName($tt) . ' v' $l_CmsListDetector->getCmsVersion($tt);
}


QCR_Debug();


////////////////////////////////////////////////////////////////////////////
 
if ($BOOL_RESULT) {
  if ((
count($g_CriticalPHP) > 0) OR (count($g_CriticalJS) > 0) OR (count($g_Base64) > 0) OR  (count($g_Iframer) > 0) OR  (count($g_UnixExec) > 0))
  {
  echo 
"1n";
  exit(
0);
  }
 }
////////////////////////////////////////////////////////////////////////////

$l_Template str_replace("@@PATH_URL@@", (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $g_AddPrefix str_replace($g_NoPrefix''realpath('.'))), $l_Template);

$time_taken seconds2Human(microtime(true) - START_TIME);

$l_Template str_replace("@@SCANNED@@"sprintf(AI_STR_013$g_TotalFolder$g_TotalFiles), $l_Template);

$l_ShowOffer false;

stdOut("nBuilding report [ mode = " AI_EXPERT " ]n");

////////////////////////////////////////////////////////////////////////////
// save 
if (!(ICHECK || IMAKE))
if (isset(
$options['with-2check']) || isset($options['quarantine']))
if ((
count($g_CriticalPHP) > 0) OR (count($g_CriticalJS) > 0) OR (count($g_Base64) > 0) OR 
   (
count($g_Iframer) > 0) OR  (count($g_UnixExec))) 
{
  if (!
file_exists(DOUBLECHECK_FILE)) {      
      if (
$l_FH fopen(DOUBLECHECK_FILE'w')) {
         
fputs($l_FH'<?php die("Forbidden"); ?>' "n");

         
$l_CurrPath dirname(__FILE__);
         
         if (!isset(
$g_CriticalPHP)) { $g_CriticalPHP = array(); }
         if (!isset(
$g_CriticalJS)) { $g_CriticalJS = array(); }
         if (!isset(
$g_Iframer)) { $g_Iframer = array(); }
         if (!isset(
$g_Base64)) { $g_Base64 = array(); }
         if (!isset(
$g_Phishing)) { $g_Phishing = array(); }
         if (!isset(
$g_AdwareList)) { $g_AdwareList = array(); }
         if (!isset(
$g_Redirect)) { $g_Redirect = array(); }
         
         
$tmpIndex array_merge($g_CriticalPHP$g_CriticalJS$g_Phishing$g_Base64$g_Iframer$g_AdwareList$g_Redirect);
         
$tmpIndex array_values(array_unique($tmpIndex));

         for (
$i 0$i count($tmpIndex); $i++) {
             
$tmpIndex[$i] = str_replace($l_CurrPath'.'$g_Structure['n'][$tmpIndex[$i]]);
         }

         for (
$i 0$i count($g_UnixExec); $i++) {
             
$tmpIndex[] = str_replace($l_CurrPath'.'$g_UnixExec[$i]);
         }

         
$tmpIndex array_values(array_unique($tmpIndex));

         for (
$i 0$i count($tmpIndex); $i++) {
             
fputs($l_FH$tmpIndex[$i] . "n");
         }

         
fclose($l_FH);
      } else {
         
stdOut("Error! Cannot create " DOUBLECHECK_FILE);
      }      
  } else {
      
stdOut(DOUBLECHECK_FILE ' already exists.');
      if (
AI_STR_044 != ''$l_Result .= '<div class="rep">' AI_STR_044 '</div>';
  }
 
}

////////////////////////////////////////////////////////////////////////////

$l_Summary '<div class="title">' AI_STR_074 '</div>';
$l_Summary .= '<table cellspacing=0 border=0>';

if (
count($g_Redirect) > 0) {
   
$l_Summary .= makeSummary(AI_STR_059count($g_Redirect), "crit");
}

if (
count($g_CriticalPHP) > 0) {
   
$l_Summary .= makeSummary(AI_STR_060count($g_CriticalPHP), "crit");
}

if (
count($g_CriticalJS) > 0) {
   
$l_Summary .= makeSummary(AI_STR_061count($g_CriticalJS), "crit");
}

if (
count($g_Phishing) > 0) {
   
$l_Summary .= makeSummary(AI_STR_062count($g_Phishing), "crit");
}

if (
count($g_UnixExec) > 0) {
   
$l_Summary .= makeSummary(AI_STR_063count($g_UnixExec), "crit");
}

if (
count($g_Iframer) > 0) {
   
$l_Summary .= makeSummary(AI_STR_064count($g_Iframer), "crit");
}

if (
count($g_NotRead) > 0) {
   
$l_Summary .= makeSummary(AI_STR_066count($g_NotRead), "crit");
}

if (
count($g_Base64) > 0) {
   
$l_Summary .= makeSummary(AI_STR_067count($g_Base64), "crit");
}

if (
count($g_BigFiles) > 0) {
   
$l_Summary .= makeSummary(AI_STR_065count($g_BigFiles), "warn");
}

if (
count($g_HeuristicDetected) > 0) {
   
$l_Summary .= makeSummary(AI_STR_068count($g_HeuristicDetected), "warn");
}

if (
count($g_SymLinks) > 0) {
   
$l_Summary .= makeSummary(AI_STR_069count($g_SymLinks), "warn");
}

if (
count($g_HiddenFiles) > 0) {
   
$l_Summary .= makeSummary(AI_STR_070count($g_HiddenFiles), "warn");
}

if (
count($g_AdwareList) > 0) {
   
$l_Summary .= makeSummary(AI_STR_072count($g_AdwareList), "warn");
}

if (
count($g_EmptyLink) > 0) {
   
$l_Summary .= makeSummary(AI_STR_073count($g_EmptyLink), "warn");
}

 
$l_Summary .= "</table><div class=details style="margin20px 20px 20px 0">" AI_STR_080 "</div>n";

 
$l_Template str_replace("@@SUMMARY@@"$l_Summary$l_Template);


 
$l_Result .= AI_STR_015;
 
 
$l_Template str_replace("@@VERSION@@"AI_VERSION$l_Template);
 
////////////////////////////////////////////////////////////////////////////



if (function_exists("gethostname") && is_callable("gethostname")) {
  
$l_HostName gethostname();
} else {
  
$l_HostName '???';
}

$l_PlainResult "# Malware list detected by AI-Bolit (http://revisium.com/ai/) on " date("d/m/Y H:i:s"time()) . " " $l_HostName .  "nn";

stdOut("Building list of vulnerable scripts " count($g_Vulnerable));

if (
count($g_Vulnerable) > 0) {
    
$l_Result .= '<div class="note_vir">' AI_STR_081 ' (' count($g_Vulnerable) . ')</div><div class="crit">';
     foreach (
$g_Vulnerable as $l_Item) {
        
$l_Result .= '<li>' $g_Structure['n'][$l_Item['ndx']] . ' - ' $l_Item['id'] . '</li>';
        
$l_PlainResult .= 'VULNERABILITY: ' $g_Structure['n'][$l_Item['ndx']] . ' - ' $l_Item['id'] . "n";
     }
    
  
$l_Result .= '</div><p>' PHP_EOL;
}

stdOut("Building list of shells " count($g_CriticalPHP));

if (
count($g_CriticalPHP) > 0) {
  
$l_Result .= '<div class="note_vir">' AI_STR_016 ' (' count($g_CriticalPHP) . ')</div><div class="crit">';
  
$l_Result .= printList($g_CriticalPHP$g_CriticalPHPFragmenttrue$g_CriticalPHPSig'table_crit');
  
$l_PlainResult .= printPlainList($g_CriticalPHP$g_CriticalPHPFragmenttrue$g_CriticalPHPSig'table_crit');
  
$l_Result .= '</div>' PHP_EOL;

  
$l_ShowOffer true;
} else {
  
$l_Result .= '<div class="ok"><b>' AI_STR_017'</b></div>';
}

stdOut("Building list of js " count($g_CriticalJS));

if (
count($g_CriticalJS) > 0) {
  
$l_Result .= '<div class="note_vir">' AI_STR_018 ' (' count($g_CriticalJS) . ')</div><div class="crit">';
  
$l_Result .= printList($g_CriticalJS$g_CriticalJSFragmenttrue$g_CriticalJSSig'table_vir');
  
$l_PlainResult .= printPlainList($g_CriticalJS$g_CriticalJSFragmenttrue$g_CriticalJSSig'table_vir');
  
$l_Result .= "</div>" PHP_EOL;

  
$l_ShowOffer true;
}

stdOut("Building phishing pages " count($g_Phishing));

if (
count($g_Phishing) > 0) {
  
$l_Result .= '<div class="note_vir">' AI_STR_058 ' (' count($g_Phishing) . ')</div><div class="crit">';
  
$l_Result .= printList($g_Phishing$g_PhishingFragmenttrue$g_PhishingSigFragment'table_vir');
  
$l_PlainResult .= printPlainList($g_Phishing$g_PhishingFragmenttrue$g_PhishingSigFragment'table_vir');
  
$l_Result .= "</div>"PHP_EOL;

  
$l_ShowOffer true;
}

stdOut("Building list of unix executables and odd scripts " count($g_UnixExec));

if (
count($g_UnixExec) > 0) {
  
$l_Result .= '<div class="note_vir">' AI_STR_019 ' (' count($g_UnixExec) . ')</div><div class="crit">';
  
$l_Result .= implode("<br>"$g_UnixExec);
  
$l_PlainResult .= implode("n"$g_UnixExec);
  
$l_Result .= "</div>" PHP_EOL;

  
$l_ShowOffer true;
}

stdOut("Building list of iframes " count($g_Iframer));

if (
count($g_Iframer) > 0) {
  
$l_ShowOffer true;
  
$l_Result .= '<div class="note_vir">' AI_STR_021 ' (' count($g_Iframer) . ')</div><div class="crit">';
  
$l_Result .= printList($g_Iframer$g_IframerFragmenttrue);
  
$l_Result .= "</div>" PHP_EOL;

}

stdOut("Building list of base64s " count($g_Base64));

if (
count($g_Base64) > 0) {
  
$l_ShowOffer true;
  
$l_Result .= '<div class="note_vir">' AI_STR_020 ' (' count($g_Base64) . ')</div><div class="crit">';
  
$l_Result .= printList($g_Base64$g_Base64Fragmenttrue);
  
$l_PlainResult .= printPlainList($g_Base64$g_Base64Fragmenttrue);
  
$l_Result .= "</div>" PHP_EOL;

}

stdOut("Building list of redirects " count($g_Redirect));
if (
count($g_Redirect) > 0) {
  
$l_ShowOffer true;
  
$l_Result .= '<div class="note_vir">' AI_STR_027 ' (' count($g_Redirect) . ')</div><div class="crit">';
  
$l_Result .= printList($g_Redirect$g_RedirectPHPFragmenttrue);
  
$l_Result .= "</div>" PHP_EOL;
}


stdOut("Building list of unread files " count($g_NotRead));

if (
count($g_NotRead) > 0) {
  
$l_ShowOffer true;
  
$l_Result .= '<div class="note_vir">' AI_STR_030 ' (' count($g_NotRead) . ')</div><div class="crit">';
  
$l_Result .= printList($g_NotRead);
  
$l_Result .= "</div><div class="spacer"></div>" PHP_EOL;
}

stdOut("Building list of symlinks " count($g_SymLinks));

if (
count($g_SymLinks) > 0) {
  
$l_Result .= '<div class="note_vir">' AI_STR_022 ' (' count($g_SymLinks) . ')</div><div class="crit">';
  
$l_Result .= implode("<br>"$g_SymLinks);
  
$l_Result .= "</div><div class="spacer"></div>";
}

////////////////////////////////////
$l_WarningsNum count($g_HeuristicDetected) + count($g_HiddenFiles) + count($g_BigFiles) + count($g_PHPCodeInside) + count($g_AdwareList) + count($g_EmptyLink) + count($g_Doorway) + (count($g_WarningPHP[0]) + count($g_WarningPHP[1]) + count($g_SkippedFolders) + count(g_CMS));

if (
$l_WarningsNum 0) {
    
$l_Result .= "<div style="margin-top20px" class="title">" AI_STR_026 "</div>";
}

stdOut("Building list of links/adware " count($g_AdwareList));

if (
count($g_AdwareList) > 0) {
  
$l_ShowOffer true;

  
$l_Result .= '<div class="note_warn">' AI_STR_029 '</div><div class="warn">';
  
$l_Result .= printList($g_AdwareList$g_AdwareListFragmenttrue);
  
$l_Result .= "</div>" PHP_EOL;

}

stdOut("Building list of heuristics " count($g_HeuristicDetected));

if (
count($g_HeuristicDetected) > 0) {
  
$l_Result .= '<div class="note_warn">' AI_STR_052 ' (' count($g_HeuristicDetected) . ')</div><div class="warn">';
  for (
$i 0$i count($g_HeuristicDetected); $i++) {
       
$l_Result .= '<li>' $g_Structure['n'][$g_HeuristicDetected[$i]] . ' (' get_descr_heur($g_HeuristicType[$i]) . ')</li>';
  }
  
  
$l_Result .= '</ul></div><div class="spacer"></div>' PHP_EOL;

  
$l_ShowOffer true;
}

stdOut("Building list of hidden files " count($g_HiddenFiles));
if (
count($g_HiddenFiles) > 0) {
  
$l_Result .= '<div class="note_warn">' AI_STR_023 ' (' count($g_HiddenFiles) . ')</div><div class="warn">';
  
$l_Result .= implode("<br>"$g_HiddenFiles);
  
$l_Result .= "</div><div class="spacer"></div>" PHP_EOL;

}

stdOut("Building list of bigfiles " count($g_BigFiles));
$max_size_to_scan getBytes(MAX_SIZE_TO_SCAN);
$max_size_to_scan $max_size_to_scan $max_size_to_scan getBytes('1m');

if (
count($g_BigFiles) > 0) {
  
$l_Result .= "<div class="note_warn">" sprintf(AI_STR_038bytes2Human($max_size_to_scan)) . '</div><div class="warn">';
  
$l_Result .= printList($g_BigFiles);
  
$l_Result .= "</div>";


stdOut("Building list of php inj " count($g_PHPCodeInside));

if ((
count($g_PHPCodeInside) > 0) && (($defaults['report_mask'] & REPORT_MASK_PHPSIGN) == REPORT_MASK_PHPSIGN)) {

  
$l_ShowOffer true;
  
$l_Result .= '<div class="note_warn">' AI_STR_028 '</div><div class="warn">';
  
$l_Result .= printList($g_PHPCodeInside$g_PHPCodeInsideFragmenttrue);
  
$l_Result .= "</div>" PHP_EOL;

}

stdOut("Building list of empty links " count($g_EmptyLink));
if (
count($g_EmptyLink) > 0) {
  
$l_ShowOffer true;
  
$l_Result .= '<div class="note_warn">' AI_STR_031 '</div><div class="warn">';
  
$l_Result .= printList($g_EmptyLink''true);

  
$l_Result .= AI_STR_032 '<br/>';
  
  if (
count($g_EmptyLink) == MAX_EXT_LINKS) {
      
$l_Result .= '(' AI_STR_033 MAX_EXT_LINKS ')<br/>';
    }
   
  for (
$i 0$i count($g_EmptyLink); $i++) {
    
$l_Idx $g_EmptyLink[$i];
    for (
$j 0$j count($g_EmptyLinkSrc[$l_Idx]); $j++) {
      
$l_Result .= '<span class="details">' $g_Structure['n'][$g_EmptyLink[$i]] . ' &rarr; ' htmlspecialchars($g_EmptyLinkSrc[$l_Idx][$j]) . '</span><br/>';
    }
  }

  
$l_Result .= "</div>";

}

stdOut("Building list of doorways " count($g_Doorway));

if ((
count($g_Doorway) > 0) && (($defaults['report_mask'] & REPORT_MASK_DOORWAYS) == REPORT_MASK_DOORWAYS)) {
  
$l_ShowOffer true;

  
$l_Result .= '<div class="note_warn">' AI_STR_034 '</div><div class="warn">';
  
$l_Result .= printList($g_Doorway);
  
$l_Result .= "</div>" PHP_EOL;

}

stdOut("Building list of php warnings " . (count($g_WarningPHP[0]) + count($g_WarningPHP[1])));

if ((
$defaults['report_mask'] & REPORT_MASK_SUSP) == REPORT_MASK_SUSP) {
   if ((
count($g_WarningPHP[0]) + count($g_WarningPHP[1])) > 0) {
     
$l_ShowOffer true;

     
$l_Result .= '<div class="note_warn">' AI_STR_035 '</div><div class="warn">';

     for (
$i 0$i count($g_WarningPHP); $i++) {
         if (
count($g_WarningPHP[$i]) > 0
            
$l_Result .= printList($g_WarningPHP[$i], $g_WarningPHPFragment[$i], true$g_WarningPHPSig'table_warn' $i);
     }                                                                                                                    
     
$l_Result .= "</div>" PHP_EOL;

   } 
}

stdOut("Building list of skipped dirs " count($g_SkippedFolders));
if (
count($g_SkippedFolders) > 0) {
  
$l_Result .= '<div class="note_warn">' AI_STR_036 '</div><div class="warn">';
     
$l_Result .= implode("<br>"$g_SkippedFolders);
     
$l_Result .= "</div>" PHP_EOL;
 }

 if (
count($g_CMS) > 0) {
      
$l_Result .= "<div class="note_warn">" AI_STR_037 "<br/>";
      
$l_Result .= implode("<br>"$g_CMS);
      
$l_Result .= "</div>";
 }


if (
ICHECK) {
    
$l_Result .= "<div style="margin-top20px" class="title">" AI_STR_087 "</div>";
    
    
stdOut("Building list of added files " count($changes['addedFiles']));
    if (
count($changes['addedFiles']) > 0) {
      
$l_Result .= '<div class="note_int">' AI_STR_082 ' (' count($changes['addedFiles']) . ')</div><div class="intitem">';
      
$l_Result .= printList($changes['addedFiles']);
      
$l_Result .= "</div>" PHP_EOL;
    }

    
stdOut("Building list of modified files " count($changes['modifiedFiles']));
    if (
count($changes['modifiedFiles']) > 0) {
      
$l_Result .= '<div class="note_int">' AI_STR_083 ' (' count($changes['modifiedFiles']) . ')</div><div class="intitem">';
      
$l_Result .= printList($changes['modifiedFiles']);
      
$l_Result .= "</div>" PHP_EOL;
    }

    
stdOut("Building list of deleted files " count($changes['deletedFiles']));
    if (
count($changes['deletedFiles']) > 0) {
      
$l_Result .= '<div class="note_int">' AI_STR_084 ' (' count($changes['deletedFiles']) . ')</div><div class="intitem">';
      
$l_Result .= printList($changes['deletedFiles']);
      
$l_Result .= "</div>" PHP_EOL;
    }

    
stdOut("Building list of added dirs " count($changes['addedDirs']));
    if (
count($changes['addedDirs']) > 0) {
      
$l_Result .= '<div class="note_int">' AI_STR_085 ' (' count($changes['addedDirs']) . ')</div><div class="intitem">';
      
$l_Result .= printList($changes['addedDirs']);
      
$l_Result .= "</div>" PHP_EOL;
    }

    
stdOut("Building list of deleted dirs " count($changes['deletedDirs']));
    if (
count($changes['deletedDirs']) > 0) {
      
$l_Result .= '<div class="note_int">' AI_STR_086 ' (' count($changes['deletedDirs']) . ')</div><div class="intitem">';
      
$l_Result .= printList($changes['deletedDirs']);
      
$l_Result .= "</div>" PHP_EOL;
    }
}

if (!
isCli()) {
   
$l_Result .= QCR_ExtractInfo($l_PhpInfoBody[1]);
}


if (
function_exists('memory_get_peak_usage')) {
  
$l_Template str_replace("@@MEMORY@@"AI_STR_043 bytes2Human(memory_get_peak_usage()), $l_Template);
}

$l_Template str_replace('@@WARN_QUICK@@', (SCAN_ALL_FILES '' AI_STR_045), $l_Template);

if (
$l_ShowOffer) {
    
$l_Template str_replace('@@OFFER@@'$l_Offer$l_Template);
} else {
    
$l_Template str_replace('@@OFFER@@'AI_STR_002$l_Template);
}

$l_Template str_replace('@@CAUTION@@'AI_STR_003$l_Template);

$l_Template str_replace('@@CREDITS@@'AI_STR_075$l_Template);

$l_Template str_replace('@@FOOTER@@'AI_STR_076$l_Template);

$l_Template str_replace('@@STAT@@'sprintf(AI_STR_012$time_takendate('d-m-Y в H:i:s'floor(START_TIME)) , date('d-m-Y в H:i:s')), $l_Template);

////////////////////////////////////////////////////////////////////////////
$l_Template str_replace("@@MAIN_CONTENT@@"$l_Result$l_Template);

if (!
isCli())
{
    echo 
$l_Template;
    exit;
}

if (!
defined('REPORT') OR REPORT === '')
{
    die(
'Report not written.');
}
 
// write plain text result
if (PLAIN_FILE != '') {
    
    
$l_PlainResult preg_replace('|__AI_LINE1__|smi''['$l_PlainResult);
    
$l_PlainResult preg_replace('|__AI_LINE2__|smi''] '$l_PlainResult);
    
$l_PlainResult preg_replace('|__AI_MARKER__|smi''%>'$l_PlainResult);

   if (
$l_FH fopen(PLAIN_FILE"w")) {
      
fputs($l_FH$l_PlainResult);
      
fclose($l_FH);
   }
}

$emails getEmails(REPORT);

if (!
$emails) {
    if (
$l_FH fopen($file"w")) {
       
fputs($l_FH$l_Template);
       
fclose($l_FH);
       
stdOut("nReport written to '$file'.");
    } else {
        
stdOut("nCannot create '$file'.");
    }
}    else    {
        
$headers = array(
            
'MIME-Version: 1.0',
            
'Content-type: text/html; charset=UTF-8',
            
'From: ' . ($defaults['email_from'] ? $defaults['email_from'] : 'AI-Bolit@myhost')
        );

        for (
$i 0$size sizeof($emails); $i $size$i++)
        {
            
mail($emails[$i], 'AI-Bolit Report ' date("d/m/Y H:i"time()), $l_Resultimplode("rn"$headers));
        }

        
stdOut("nReport sended to " implode(', '$emails));
}


$time_taken microtime(true) - START_TIME;
$time_taken number_format($time_taken5);

stdOut("Scanning complete! Time taken: " seconds2Human($time_taken));

stdOut("nn!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
stdOut("Attention! DO NOT LEAVE either ai-bolit.php or AI-BOLIT-REPORT-<xxxx>-<yy>.html nfile on server. COPY it locally then REMOVE from server. ");
stdOut("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");

if (isset(
$options['quarantine'])) {
    
Quarantine();
}

if (isset(
$options['cmd'])) {
    
stdOut("Run "{$options['cmd']}" ");
    
system($options['cmd']);
}

QCR_Debug();

# exit with code

$l_EC1 count($g_CriticalPHP);
$l_EC2 count($g_CriticalJS) + count($g_Phishing) + count($g_WarningPHP[0]) + count($g_WarningPHP[1]);

if (
$l_EC1 0) {
    
stdOut('Exit code 2');
    exit(
2);
} else {
    if (
$l_EC2 0) {
        
stdOut('Exit code 1');
        exit(
1);
    }
}

stdOut('Exit code 0');
exit(
0);

############################################# END ###############################################

function Quarantine()
{
    if (!
file_exists(DOUBLECHECK_FILE)) {
        return;
    }
    
    
$g_QuarantinePass 'aibolit';
    
    
$archive "AI-QUARANTINE-" .rand(100000999999) . ".zip";
    
$infoFile substr($archive0, -3) . "txt";
    
$report REPORT_PATH DIR_SEPARATOR REPORT_FILE;
    

    foreach (
file(DOUBLECHECK_FILE) as $file) {
        
$file trim($file);
        if (!
is_file($file)) continue;
    
        
$lStat stat($file);
        
        
// skip files over 300KB
        
if ($lStat['size'] > 300*1024) continue;

        
// http://www.askapache.com/security/chmod-stat.html
        
$p $lStat['mode'];
        
$perm ='-';
        
$perm.=(($p&0x0100)?'r':'-').(($p&0x0080)?'w':'-');
        
$perm.=(($p&0x0040)?(($p&0x0800)?'s':'x'):(($p&0x0800)?'S':'-'));
        
$perm.=(($p&0x0020)?'r':'-').(($p&0x0010)?'w':'-');
        
$perm.=(($p&0x0008)?(($p&0x0400)?'s':'x'):(($p&0x0400)?'S':'-'));
        
$perm.=(($p&0x0004)?'r':'-').(($p&0x0002)?'w':'-');
        
$perm.=(($p&0x0001)?(($p&0x0200)?'t':'x'):(($p&0x0200)?'T':'-'));
        
        
$owner = (function_exists('posix_getpwuid'))? @posix_getpwuid($lStat['uid']) : array('name' => $lStat['uid']);
        
$group = (function_exists('posix_getgrgid'))? @posix_getgrgid($lStat['gid']) : array('name' => $lStat['uid']);

        
$inf['permission'][] = $perm;
        
$inf['owner'][] = $owner['name'];
        
$inf['group'][] = $group['name'];
        
$inf['size'][] = $lStat['size'] > bytes2Human($lStat['size']) : '-';
        
$inf['ctime'][] = $lStat['ctime'] > date("d/m/Y H:i:s"$lStat['ctime']) : '-';
        
$inf['mtime'][] = $lStat['mtime'] > date("d/m/Y H:i:s"$lStat['mtime']) : '-';
        
$files[] = strpos($file'./') === substr($file2) : $file;
    }
    
    
// get config files for cleaning
    
$configFilesRegex 'config(uration|.in[ic])?.php$|dbconn.php$';
    
$configFiles preg_grep("~$configFilesRegex~"$files);

    
// get columns width
    
$width = array();
    foreach (
array_keys($inf) as $k) {
        
$width[$k] = strlen($k);
        for (
$i 0$i count($inf[$k]); ++$i) {
            
$len strlen($inf[$k][$i]);
            if (
$len $width[$k])
                
$width[$k] = $len;
        }
    }

    
// headings of columns
    
$info '';
    foreach (
array_keys($inf) as $k) {
        
$info .= str_pad($k$width[$k], ' 'STR_PAD_LEFT). ' ';
    }
    
$info .= "namen";
    
    for (
$i 0$i count($files); ++$i) {
        foreach (
array_keys($inf) as $k) {
            
$info .= str_pad($inf[$k][$i], $width[$k], ' 'STR_PAD_LEFT). ' ';
        }
        
$info .= $files[$i]."n";
    }
    unset(
$inf$width);

    
exec("zip -v 2>&1"$output,$code);

    if (
$code == 0) {
        
$filter '';
        if (
$configFiles && exec("grep -V 2>&1"$output$code) && $code == 0) {
            
$filter "|grep -v -E '$configFilesRegex'";
        }

        
exec("cat AI-BOLIT-DOUBLECHECK.php $filter |zip -@ --password $g_QuarantinePass $archive"$output$code);
        if (
$code == 0) {
            
file_put_contents($infoFile$info);
            
$m = array();
            if (!empty(
$filter)) {
                foreach (
$configFiles as $file) {
                    
$tmp file_get_contents($file);
                    
// remove  passwords
                    
$tmp preg_replace('~^.*?pass.*~im'''$tmp);
                    
// new file name
                    
$file preg_replace('~.*/~'''$file) . '-' rand(100000999999);
                    
file_put_contents($file$tmp);
                    
$m[] = $file;
                }
            }

            
exec("zip -j --password $g_QuarantinePass $archive $infoFile $report " DOUBLECHECK_FILE ' ' implode(' '$m));
            
stdOut("nCreate archive '" realpath($archive) . "'");
            
stdOut("This archive have password '$g_QuarantinePass'");
            foreach (
$m as $fileunlink($file);
            
unlink($infoFile);
            return;
        }
    }
    
    
$zip = new ZipArchive;
    
    if (
$zip->open($archiveZIPARCHIVE::CREATE ZIPARCHIVE::OVERWRITE) === false) {
        
stdOut("Cannot create '$archive'.");
        return;
    }

    foreach (
$files as $file) {
        if (
in_array($file$configFiles)) {
            
$tmp file_get_contents($file);
            
// remove  passwords
            
$tmp preg_replace('~^.*?pass.*~im'''$tmp);
            
$zip->addFromString($file$tmp);
        } else {
            
$zip->addFile($file);
        }
    }
    
$zip->addFile(DOUBLECHECK_FILEDOUBLECHECK_FILE);
    
$zip->addFile($reportREPORT_FILE);
    
$zip->addFromString($infoFile$info);
    
$zip->close();

    
stdOut("nCreate archive '" realpath($archive) . "'.");
    
stdOut("This archive has no password!");
}



///////////////////////////////////////////////////////////////////////////
function QCR_IntegrityCheck($l_RootDir)
{
    global 
$g_Structure$g_Counter$g_Doorway$g_FoundTotalFiles$g_FoundTotalDirs
            
$defaults$g_SkippedFolders$g_UrlIgnoreList$g_DirIgnoreList$g_UnsafeDirArray
                        
$g_UnsafeFilesFound$g_SymLinks$g_HiddenFiles$g_UnixExec$g_IgnoredExt$g_SuspiciousFiles;
    global 
$g_IntegrityDB$g_ICheck;
    static 
$l_Buffer '';
    
    
$l_DirCounter 0;
    
$l_DoorwayFilesCounter 0;
    
$l_SourceDirIndex $g_Counter 1;
    
    
QCR_Debug('Check ' $l_RootDir);

     if (
$l_DIRH = @opendir($l_RootDir))
    {
        while ((
$l_FileName readdir($l_DIRH)) !== false)
        {
            if (
$l_FileName == '.' || $l_FileName == '..') continue;

            
$l_FileName $l_RootDir DIR_SEPARATOR $l_FileName;

            
$l_Type filetype($l_FileName);
            
$l_IsDir = ($l_Type == "dir");
            if (
$l_Type == "link"
            {
                
$g_SymLinks[] = $l_FileName;
                continue;
            } else 
            if (
$l_Type != "file" && (!$l_IsDir)) {
                
$g_UnixExec[] = $l_FileName;
                continue;
            }    
                        
            
$l_Ext substr($l_FileNamestrrpos($l_FileName'.') + 1);

            
$l_NeedToScan true;
            
$l_Ext2 substr(strstr(basename($l_FileName), '.'), 1);
            if (
in_array(strtolower($l_Ext2), $g_IgnoredExt)) {
                           
$l_NeedToScan false;
            }
            
            if (
getRelativePath($l_FileName) == "./" INTEGRITY_DB_FILE$l_NeedToScan false;

            if (
$l_IsDir)
            {
                
// if folder in ignore list
                
$l_Skip false;
                for (
$dr 0$dr count($g_DirIgnoreList); $dr++) {
                    if ((
$g_DirIgnoreList[$dr] != '') &&
                        
preg_match('#' $g_DirIgnoreList[$dr] . '#'$l_FileName$l_Found)) {
                        
$l_Skip true;
                    }
                }
            
                
// skip on ignore
                
if ($l_Skip) {
                    
$g_SkippedFolders[] = $l_FileName;
                    continue;
                }
                
                
$l_BaseName basename($l_FileName);

                
$l_DirCounter++;

                
$g_Counter++;
                
$g_FoundTotalDirs++;

                
QCR_IntegrityCheck($l_FileName);

            } else
            {
                if (
$l_NeedToScan)
                {
                    
$g_FoundTotalFiles++;
                    
$g_Counter++;
                }
            }
            
            if (!
$l_NeedToScan) continue;

            if (
IMAKE) {
                
write_integrity_db_file($l_FileName);
                continue;
            }

            
// ICHECK
            // skip if known and not modified.
            
if (icheck($l_FileName)) continue;
            
            
$l_Buffer .= getRelativePath($l_FileName);
            
$l_Buffer .= $l_IsDir DIR_SEPARATOR "n" "n";

            if (
strlen($l_Buffer) > 32000)
            {
                
file_put_contents(QUEUE_FILENAME$l_BufferFILE_APPEND) or die("Cannot write to file " QUEUE_FILENAME);
                
$l_Buffer '';
            }

        }

        
closedir($l_DIRH);
    }
    
    if ((
$l_RootDir == ROOT_PATH) && !empty($l_Buffer)) {
        
file_put_contents(QUEUE_FILENAME$l_BufferFILE_APPEND) or die("Cannot write to file ".QUEUE_FILENAME);
        
$l_Buffer '';
    }

    if ((
$l_RootDir == ROOT_PATH)) {
        
write_integrity_db_file();
    }

}


function 
getRelativePath($l_FileName) {
    return 
"./" substr($l_FileNamestrlen(ROOT_PATH) + 1) . (is_dir($l_FileName) ? DIR_SEPARATOR '');
}
/**
 *
 * @return true if known and not modified
 */
function icheck($l_FileName) {
    global 
$g_IntegrityDB$g_ICheck;
    static 
$l_Buffer '';
    static 
$l_status = array( 'modified' => 'modified''added' => 'added' );
    
    
$l_RelativePath getRelativePath($l_FileName);
    
$l_known = isset($g_IntegrityDB[$l_RelativePath]);

    if (
is_dir($l_FileName)) {
        if ( 
$l_known ) {
            unset(
$g_IntegrityDB[$l_RelativePath]);
        } else {
            
$g_IntegrityDB[$l_RelativePath] =& $l_status['added'];
        }
        return 
$l_known;
    }

    if (
$l_known == false) {
        
$g_IntegrityDB[$l_RelativePath] =& $l_status['added'];
        return 
false;
    }

    
$hash is_file($l_FileName) ? hash_file('sha1'$l_FileName) : '';
    
    if (
$g_IntegrityDB[$l_RelativePath] != $hash) {
        
$g_IntegrityDB[$l_RelativePath] =& $l_status['modified'];
        return 
false;
    }

    unset(
$g_IntegrityDB[$l_RelativePath]);
    return 
true;
}

function 
write_integrity_db_file($l_FileName '') {
    static 
$l_Buffer '';

    if (empty(
$l_FileName)) {
        empty(
$l_Buffer) or file_put_contents('compress.zlib://' INTEGRITY_DB_FILE$l_BufferFILE_APPEND) or die("Cannot write to file " INTEGRITY_DB_FILE);
        
$l_Buffer '';
        return;
    }

    
$l_RelativePath getRelativePath($l_FileName);
        
    
$hash is_file($l_FileName) ? hash_file('sha1'$l_FileName) : '';

    
$l_Buffer .= "$l_RelativePath|$hashn";
    
    if (
strlen($l_Buffer) > 32000)
    {
        
file_put_contents('compress.zlib://' INTEGRITY_DB_FILE$l_BufferFILE_APPEND) or die("Cannot write to file " INTEGRITY_DB_FILE);
        
$l_Buffer '';
    }
}

function 
load_integrity_db() {
    global 
$g_IntegrityDB;
    
file_exists(INTEGRITY_DB_FILE) or die('Not found ' INTEGRITY_DB_FILE);

    
$s_file = new SplFileObject('compress.zlib://'.INTEGRITY_DB_FILE);
    
$s_file->setFlags(SplFileObject::READ_AHEAD SplFileObject::SKIP_EMPTY SplFileObject::DROP_NEW_LINE);

    foreach (
$s_file as $line) {
        
$i strrpos($line'|');
        if (!
$i) continue;
        
$g_IntegrityDB[substr($line0$i)] = substr($line$i+1);
    }

    
$s_file null;
}


function 
OptimizeSignatures()
{
    global 
$g_DBShe$g_FlexDBShe$gX_FlexDBShe$gXX_FlexDBShe;
    global 
$g_JSVirSig$gX_JSVirSig;
    global 
$g_AdwareSig;
    global 
$g_PhishingSig;

    (
AI_EXPERT == 2) && ($g_FlexDBShe array_merge($g_FlexDBShe$gX_FlexDBShe$gXX_FlexDBShe));
    (
AI_EXPERT == 1) && ($g_FlexDBShe array_merge($g_FlexDBShe$gX_FlexDBShe));
    
$gX_FlexDBShe $gXX_FlexDBShe = array();

    (
AI_EXPERT == 2) && ($g_JSVirSig array_merge($g_JSVirSig$gX_JSVirSig));
    
$gX_JSVirSig = array();

    
$count count($g_FlexDBShe);

    for (
$i 0$i $count$i++) {
        if (
$g_FlexDBShe[$i] == 'http://.+?/.+?.php?a=d+&c=[a-zA-Z0-9_]+?&s='$g_FlexDBShe[$i] = 'http://[^?s]++(?<=.php)?a=d+&c=[a-zA-Z0-9_]+?&s=';
        if (
$g_FlexDBShe[$i] == '[a-zA-Z0-9_]+?(s*[a-zA-Z0-9_]+?=s*)'$g_FlexDBShe[$i] = '((?<=[a-zA-Z0-9_].)s*[a-zA-Z0-9_]++=s*)';
        if (
$g_FlexDBShe[$i] == '([^?s])({0,1}.[+*]){0,1}2[a-z]*e'$g_FlexDBShe[$i] = '(?J).[+*](?<=(?<d>[^?s])(..|(?<d>[^?s])..))?g{d}[a-z]*e';
        if (
$g_FlexDBShe[$i] == '$[a-zA-Z0-9_]{d+}s*.$[a-zA-Z0-9_]{d+}s*.$[a-zA-Z0-9_]{d+}s*.'$g_FlexDBShe[$i] = '$[a-zA-Z0-9_]{d+}s*.$[a-zA-Z0-9_]{d+}s*.$[a-zA-Z0-9_]{d+}s*.';

        
$g_FlexDBShe[$i] = preg_replace('~[a-zA-Z0-9_]+K?~''+'$g_FlexDBShe[$i]);
        
$g_FlexDBShe[$i] = preg_replace('~^\\[d]+&@~''&@(?<=d..)'$g_FlexDBShe[$i]);
        
$g_FlexDBShe[$i] = str_replace('s*['"]{0,1}.+?['"]{0,1}s*', '.+?', $g_FlexDBShe[$i]);
        $g_FlexDBShe[$i] = str_replace('
['"]{0,1}.+?['"]{0,1}', '.+?', $g_FlexDBShe[$i]);

        
$g_FlexDBShe[$i] = preg_replace('~^['"]{0,1}.?|^@*|^\\s*~', '', $g_FlexDBShe[$i]);
        $g_FlexDBShe[$i] = preg_replace('
~^['"]{0,1}.?|^@*|^\\s*~'''$g_FlexDBShe[$i]);
    }

    
optSig($g_FlexDBShe);
    
optSig($g_JSVirSig);
    
optSig($g_AdwareSig);
    
optSig($g_PhishingSig);
}


function 
optSig(&$sigs)
{
    
optSigCheck($sigs);
    
    
usort($sigs'strcasecmp');
    
$txt implode("n"$sigs);

    for (
$i 24$i >= 1; ($i ) ? $i-=: --$i) {
        
$txt preg_replace_callback('#^((?>(?:\\.|\[.+?\]|[^(n]|((?:\\.|[^)(n])++))(?:[*?+]+?|)){' $i ',}).*(?:\n\1(?![{?*+]).+)+#im''optMergePrefixes'$txt);
    }

    
$sigs explode("n"$txt);
    
    
optSigCheck($sigs);
}

function 
optMergePrefixes($m)
{
    
$prefix $m[1];
    
$prefix_len strlen($prefix);

    
$suffixes = array();
    foreach (
explode("n"$m[0]) as $line) {
        
$suffixes[] = substr($line$prefix_len);
    }
    
    return 
$prefix '(?:' implode('|'$suffixes) . ')';
}

/*
 * Checking errors in pattern
 */
function optSigCheck(&$sigs)
{
    
$result true;

    foreach (
$sigs as $k => $sig) {
        if (@
preg_match('#(' $sig ')#smiS''') === false) {
            
$error error_get_last();
            
//echo($error['message'] . "n     pattern: " . $sig . "n");
            
unset($sigs[$k]);
            
$result false;
        }
    }
    
    return 
$result;
}
Онлайн: 0
Реклама