Index: branches/RC/core/units/languages/import_xml.php =================================================================== diff -u -N -r9398 -r10832 --- branches/RC/core/units/languages/import_xml.php (.../import_xml.php) (revision 9398) +++ branches/RC/core/units/languages/import_xml.php (.../import_xml.php) (revision 10832) @@ -77,26 +77,22 @@ var $Encoding = 'base64'; + /** + * Language IDs, that were imported + * + * @var Array + */ + var $_languages = Array (); + function LangXML_Parser($temp_mode = true) { parent::kBase(); $this->Conn =& $this->Application->GetADODBConnection(); - if ($temp_mode) { - $this->Application->SetVar('lang_mode', 't'); - $this->tables['lang'] = $this->prepareTempTable('lang'); - $this->tables['phrases'] = $this->prepareTempTable('phrases'); - $this->tables['emailmessages'] = $this->prepareTempTable('emailmessages'); - } - else { - $this->tables['lang'] = $this->Application->getUnitOption('lang', 'TableName'); - $this->tables['phrases'] = $this->Application->getUnitOption('phrases', 'TableName'); - $this->tables['emailmessages'] = $this->Application->getUnitOption('emailmessages', 'TableName'); - } + $this->lang_object =& $this->Application->recallObject('lang.import', null, Array ('skip_autoload' => true)); - $this->lang_object =& $this->Application->recallObject('lang.imp', null, Array('skip_autoload' => true)); - - $sql = 'SELECT EventId, CONCAT(Event,"_",Type) AS EventMix FROM '.TABLE_PREFIX.'Events'; + $sql = 'SELECT EventId, CONCAT(Event,"_",Type) AS EventMix + FROM ' . TABLE_PREFIX . 'Events'; $this->events_hash = $this->Conn->GetCol($sql, 'EventMix'); $this->ip_address = getenv('HTTP_X_FORWARDED_FOR') ? getenv('HTTP_X_FORWARDED_FOR') : getenv('REMOTE_ADDR'); @@ -107,18 +103,18 @@ $this->Encoding = $enc; } - function renameTable($table_prefix, $new_name) + function _initImportTables($drop_only = false) { - $this->Conn->Query('ALTER TABLE '.$this->tables[$table_prefix].' RENAME '.$new_name); - $this->tables[$table_prefix] = $new_name; + $this->tables['phrases'] = $this->prepareTempTable('phrases', $drop_only); + $this->tables['emailmessages'] = $this->prepareTempTable('emailmessages', $drop_only); } /** * Create temp table for prefix, if table already exists, then delete it and create again * * @param string $prefix */ - function prepareTempTable($prefix) + function prepareTempTable($prefix, $drop_only = false) { $idfield = $this->Application->getUnitOption($prefix, 'IDField'); $table = $this->Application->getUnitOption($prefix,'TableName'); @@ -127,11 +123,13 @@ $sql = 'DROP TABLE IF EXISTS %s'; $this->Conn->Query( sprintf($sql, $temp_table) ); - $sql = 'CREATE TABLE %s SELECT * FROM %s WHERE 0'; - $this->Conn->Query( sprintf($sql, $temp_table, $table) ); + if (!$drop_only) { + $sql = 'CREATE TABLE %s SELECT * FROM %s WHERE 0'; + $this->Conn->Query( sprintf($sql, $temp_table, $table) ); - $sql = 'ALTER TABLE %1$s CHANGE %2$s %2$s INT(11) NOT NULL'; - $this->Conn->Query( sprintf($sql, $temp_table, $idfield) ); + $sql = 'ALTER TABLE %1$s CHANGE %2$s %2$s INT(11) NOT NULL'; + $this->Conn->Query( sprintf($sql, $temp_table, $idfield) ); + } return $temp_table; } @@ -141,14 +139,14 @@ // define the XML parsing routines/functions to call based on the handler path if( !file_exists($filename) || !$phrase_types /*|| !$module_ids*/ ) return false; + $this->_initImportTables(); + $phrase_types = explode('|', substr($phrase_types, 1, -1) ); // $module_ids = explode('|', substr($module_ids, 1, -1) ); $this->phrase_types_allowed = array_flip($phrase_types); $this->import_mode = $import_mode; - //if (in_array('In-Portal',) - $xml_parser = xml_parser_create(); xml_set_element_handler( $xml_parser, Array(&$this, 'startElement'), Array(&$this, 'endElement') ); xml_set_character_data_handler( $xml_parser, Array(&$this, 'characterData') ); @@ -158,10 +156,78 @@ $ret = xml_parse($xml_parser, $fdata); xml_parser_free($xml_parser); // clean up the parser object - $this->Application->SetVar('lang_mode', ''); + // copy data from temp tables to live + foreach ($this->_languages as $language_id) { + $this->_performUpgrade($language_id, 'phrases', 'Phrase'); + $this->_performUpgrade($language_id, 'emailmessages', 'EventId'); + } + + $this->_initImportTables(true); + return $ret; } + /** + * Performs upgrade of given language pack part + * + * @param int $language_id + * @param string $prefix + * @param string $unique_field + */ + function _performUpgrade($language_id, $prefix, $unique_field) + { + $live_records = $this->_getTableData($language_id, $prefix, $unique_field, false); + $temp_records = $this->_getTableData($language_id, $prefix, $unique_field, true); + + if ($this->import_mode == LANG_OVERWRITE_EXISTING) { + // remove existing records before copy + $common_records = array_intersect($temp_records, $live_records); + if ($common_records) { + $live_records = array_diff($live_records, $common_records); // remove overlaping records + $common_records = array_map(Array(&$this->Conn, 'qstr'), $common_records); + + $sql = 'DELETE FROM ' . $this->Application->getUnitOption($prefix, 'TableName') . ' + WHERE (LanguageId = ' . $language_id . ') AND (' . $unique_field . ' IN (' . implode(',', $common_records) . '))'; + $this->Conn->Query($sql); + } + } + + $temp_records = array_diff($temp_records, $live_records); + + if (!$temp_records) { + // no new records found in temp table while comparing it to live table + return ; + } + + $temp_records = array_map(Array(&$this->Conn, 'qstr'), $temp_records); + + $sql = 'INSERT INTO ' . $this->Application->getUnitOption($prefix, 'TableName') . ' + SELECT * + FROM ' . $this->tables[$prefix] . ' + WHERE (LanguageId = ' . $language_id . ')'; + + if ($live_records) { + // subsctract live records from temp table during coping + $sql .= ' AND (' . $unique_field . ' IN (' . implode(',', $temp_records) . '))'; + } + + $this->Conn->Query($sql); + } + + function _getTableData($language_id, $prefix, $unique_field, $temp_mode = false) + { + $table_name = $this->Application->getUnitOption($prefix, 'TableName'); + + if ($temp_mode) { + $table_name = $this->Application->GetTempName($table_name, 'prefix:' . $prefix); + } + + $sql = 'SELECT ' . $unique_field . ' + FROM ' . $table_name . ' + WHERE LanguageId = ' . $language_id; + return $this->Conn->GetCol($sql); + } + function startElement(&$parser, $element, $attributes) { array_push($this->path, $element); @@ -171,21 +237,21 @@ $this->LastLine = xml_get_current_line_number($parser); $this->SecondData = false; - switch($path) - { + switch ($path) { case 'LANGUAGES LANGUAGE': - $this->current_language = Array('PackName' => $attributes['PACKNAME'], 'LocalName' => $attributes['PACKNAME'], 'Encoding' => $attributes['ENCODING']); + $this->current_language = Array ( + 'PackName' => $attributes['PACKNAME'], + 'LocalName' => $attributes['PACKNAME'], + 'Encoding' => $attributes['ENCODING'], + ); - $sql = 'SELECT %s FROM %s WHERE PackName = %s'; - $sql = sprintf( $sql, - $this->lang_object->IDField, - $this->Application->GetLiveName($this->lang_object->TableName), - $this->Conn->qstr($this->current_language['PackName']) ); + $sql = 'SELECT ' . $this->lang_object->IDField . ' + FROM ' . $this->lang_object->TableName . ' + WHERE PackName = ' . $this->Conn->qstr( $this->current_language['PackName'] ); $language_id = $this->Conn->GetOne($sql); - if($language_id) - { + + if ($language_id) { $this->current_language['LanguageId'] = $language_id; - $this->lang_object->SwitchToLive(); $this->lang_object->Load($language_id); } break; @@ -195,8 +261,7 @@ if( !getArrayValue($this->current_language,'Charset') ) $this->current_language['Charset'] = 'iso-8859-1'; $this->lang_object->SetFieldsFromHash($this->current_language); - if( !getArrayValue($this->current_language,'LanguageId') ) - { + if ( !getArrayValue($this->current_language, 'LanguageId') ) { $this->lang_object->SetDBField('Enabled', STATUS_ACTIVE); if ($this->lang_object->Create()) { @@ -207,11 +272,15 @@ } } } - elseif($this->import_mode == LANG_OVERWRITE_EXISTING) - { - $this->lang_object->TableName = $this->Application->getUnitOption($this->lang_object->Prefix, 'TableName'); + elseif ($this->import_mode == LANG_OVERWRITE_EXISTING) { + // update live language record based on data from xml $this->lang_object->Update(); } + + $language_id = $this->lang_object->GetID(); + if (!in_array($language_id, $this->_languages)) { + $this->_languages[] = $language_id; + } break; case 'LANGUAGES LANGUAGE PHRASES PHRASE': Index: branches/RC/core/units/images/image_tag_processor.php =================================================================== diff -u -N -r10098 -r10832 --- branches/RC/core/units/images/image_tag_processor.php (.../image_tag_processor.php) (revision 10098) +++ branches/RC/core/units/images/image_tag_processor.php (.../image_tag_processor.php) (revision 10832) @@ -193,16 +193,14 @@ $max_width = $this->getImageDimension('Width', $params); $max_height = $this->getImageDimension('Height', $params); + $format = array_key_exists('format', $params) ? $params['format'] : false; - // user watermarks from format param - if (!$max_width) { - $max_width = $params['format']; - if ($max_width) { - $max_height = null; - } + if (!$max_width && $format) { + // user watermarks from format param + $max_width = $format; } - if ($max_width > 0 || $max_height > 0 || $params['format']) { + if ($max_width > 0 || $max_height > 0 || $format) { $image_helper =& $this->Application->recallObject('ImageHelper'); /* @var $image_helper ImageHelper */ @@ -235,7 +233,18 @@ } $default_image = $this->SelectParam($params, 'default_image,DefaultImage'); - return ($ret && $ret != $base_url) ? $ret : ($default_image ? $base_url.THEMES_PATH.'/'.$default_image : false); + + if ($ret && $ret != $base_url) { + // image name and it's not just folder name + return $ret; + } + elseif ($default_image) { + // show default image, use different base urls for admin and front-end + $sub_folder = $this->Application->IsAdmin() ? rtrim(IMAGES_PATH, '/') : THEMES_PATH; + return $base_url . $sub_folder . '/' . $default_image; + } + + return false; } function getFullPath($path) @@ -299,6 +308,7 @@ $params['alt'] = htmlspecialchars($object->GetField('AltName')); // really used ? $params['name'] = $this->SelectParam($params, 'block,render_as'); $params['align'] = array_key_exists('align', $params) ? $params['align'] : 'left'; + $params['no_editing'] = 1; if (!$object->isLoaded() && !$this->SelectParam($params, 'default_image,DefaultImage')) { return false; Index: branches/RC/admin/modules/addmodule.php =================================================================== diff -u -N -r8929 -r10832 --- branches/RC/admin/modules/addmodule.php (.../addmodule.php) (revision 8929) +++ branches/RC/admin/modules/addmodule.php (.../addmodule.php) (revision 10832) @@ -5,8 +5,8 @@ ## In-portal ## ## Intechnic Corporation ## ## All Rights Reserved, 1998-2002 ## -## ## -## No portion of this code may be copied, reproduced or ## +## ## +## No portion of this code may be copied, reproduced or ## ## otherwise redistributed without proper written ## ## consent of Intechnic Corporation. Violation will ## ## result in revocation of the license and support ## @@ -68,58 +68,66 @@ while (($file = readdir($dir)) !== false) { if ($file !="." && $file !=".." && substr($file,0,1)!="_") { if (is_dir($path.'/'.$file)) { - $inst_file = $path.'/'.$file.'/'.$admin."/install.php"; - if (file_exists($inst_file)) { + if (file_exists($path . '/' . $file . '/' . $admin . '/install.php')) { if (!$objModules->ModuleInstalled($file)) { - $new[$file] = $inst_file; + $new[$file] = false; // not new module } } + + if (file_exists($path . '/' . $file . '/install.php')) { + if ('/' . $file == ADMIN_DIRECTORY) { + // don't count in-portal folder as module + continue; + } + + if (!$objModules->ModuleInstalled($file)) { + $new[$file] = true; // new module + } + } } } } closedir($dir); } -foreach ($new as $mod => $file) +foreach ($new as $mod => $new_module) { $m = new clsModule(); + $script_location = $new_module ? '' : '/admin'; + unset($data); $data = array(); $status= admin_language("la_text_ready_to_install"); $pre_error = admin_language("la_text_prerequisit_not_passed"); - - $mod_tmp_name_arr = explode('-', $mod); - - $mod_tmp_name = ''; - foreach ($mod_tmp_name_arr as $names) { - $mod_tmp_name .= ucfirst($names)."-"; - } - - $mod_tmp_name = substr($mod_tmp_name, 0, strlen($mod_tmp_name) - 1); - + $mod_tmp_name = implode('-', array_map('ucfirst', explode('-', $mod))); + if (ed592fe427e1ce60e32ffcb0c82d8557($mod_tmp_name)) { - if (file_exists($pathtoroot.strtolower($mod_tmp_name)."/admin/install/prerequisit.php")) { - include_once($pathtoroot.strtolower($mod_tmp_name)."/admin/install/prerequisit.php"); + $result = true; + + if (file_exists($pathtoroot.strtolower($mod_tmp_name) . $script_location . '/install/prerequisit.php')) { + include_once($pathtoroot.strtolower($mod_tmp_name) . $script_location . '/install/prerequisit.php'); } - + if ($result) { // prerequisit check is ok - $data["Url"] = "$status"; + $url = $application->HREF('dummy', '_FRONT_END_', Array ('redirect' => 1, 'admin' => 1), $mod . $script_location . '/install.php'); + $data['Url'] = '' . $status . ''; } else { // prerequisit check failed $show_errors = true; - $data["Url"] = ''.$pre_error.''; + $url = $application->HREF('dummy', '', Array ('module' => strtolower($mod_tmp_name), 'is_new' => (int)$new_module), 'install/prerequisit_errors.php'); + $data['Url'] = ''.$pre_error.''; } } else { - $data["Url"] = ''.admin_language("la_module_not_licensed").''; + $data['Url'] = ''.admin_language("la_module_not_licensed").''; } - - $data["Name"] = $mod_tmp_name; - $objModList->AddItemFromArray($data); + + $data['Name'] = $mod_tmp_name; + $objModList->AddItemFromArray($data); } $itemcount = $objModList->NumItems(); Index: branches/RC/kernel/units/stylesheets/stylesheets_item.php =================================================================== diff -u -N -r10098 -r10832 --- branches/RC/kernel/units/stylesheets/stylesheets_item.php (.../stylesheets_item.php) (revision 10098) +++ branches/RC/kernel/units/stylesheets/stylesheets_item.php (.../stylesheets_item.php) (revision 10832) @@ -21,7 +21,7 @@ $ret .= $this->GetDBField('AdvancedCSS'); $compile_ts = adodb_mktime(); - $css_path = FULL_PATH.'/kernel/stylesheets/'; + $css_path = (defined('WRITEABLE') ? WRITEABLE : FULL_PATH . '/kernel') . '/stylesheets/'; $css_file = $css_path.mb_strtolower($this->GetDBField('Name')).'-'.$compile_ts.'.css'; Index: branches/RC/core/admin_templates/modules/modules_list.tpl =================================================================== diff -u -N -r8929 -r10832 --- branches/RC/core/admin_templates/modules/modules_list.tpl (.../modules_list.tpl) (revision 8929) +++ branches/RC/core/admin_templates/modules/modules_list.tpl (.../modules_list.tpl) (revision 10832) @@ -1,10 +1,8 @@ - + + + - - - - @@ -24,7 +22,6 @@ } ) ); - a_toolbar.AddButton( new ToolBarButton('deny', '', function() { submit_event('mod','OnMassDecline'); } @@ -40,16 +37,47 @@ a_toolbar.Render(); + +
- + +
+
+ + + "> + + + + + + + + + + + + + +
+ +
+
+ + +
+
+ + Index: branches/RC/core/admin_templates/incs/grid_blocks.tpl =================================================================== diff -u -N -r10636 -r10832 --- branches/RC/core/admin_templates/incs/grid_blocks.tpl (.../grid_blocks.tpl) (revision 10636) +++ branches/RC/core/admin_templates/incs/grid_blocks.tpl (.../grid_blocks.tpl) (revision 10832) @@ -99,9 +99,13 @@ - + - + + + + + Index: branches/RC/core/install/step_templates/post_config.tpl =================================================================== diff -u -N --- branches/RC/core/install/step_templates/post_config.tpl (revision 0) +++ branches/RC/core/install/step_templates/post_config.tpl (revision 10832) @@ -0,0 +1,86 @@ + + + + + + + /> + + + + + + + + " name="config[]" value=""> + " type="checkbox" id="_cb_" name="_cb_" class="" onclick="update_checkbox(this, document.getElementById(''))"> + + + + + + + + name="config[]" id="_" value="">  + + + + + + + + + + + + + " id="_" header_label=""> + + + +
[] +
+ + + + + + +   + +
+ + + + + + + + + + + + " id="_" header_label=""> + + + +
[] +
+ + + +    +
+ + + + +
+Application->InitParser(); + echo '' . $this->Application->Parser->Parse(ob_get_clean(), 'post_config') . ''; +?> \ No newline at end of file Index: branches/RC/core/install/step_templates/fix_paths.tpl =================================================================== diff -u -N --- branches/RC/core/install/step_templates/fix_paths.tpl (revision 0) +++ branches/RC/core/install/step_templates/fix_paths.tpl (revision 10832) @@ -0,0 +1,21 @@ +Conn->GetCol($sql, 'VariableName'); + + $odd_even = true; + foreach ($config_vars as $config_var) { + ?> + + Application->Phrase( $config_labels[$config_var] ); ?>: + + + + + \ No newline at end of file Index: branches/RC/core/kernel/startup.php =================================================================== diff -u -N -r10098 -r10832 --- branches/RC/core/kernel/startup.php (.../startup.php) (revision 10098) +++ branches/RC/core/kernel/startup.php (.../startup.php) (revision 10832) @@ -1,7 +1,7 @@ Don\'t forget to clean Cache table afterwards'); + define('KERNEL_PATH', FULL_PATH . '/core/kernel'); + if (file_exists(FULL_PATH . '/kernel/kernel4/application.php')) { + die('Please remove ' . FULL_PATH . '/kernel/kernel4 directiry - it has been moved to ' . KERNEL_PATH . '
Don\'t forget to clean Cache table afterwards'); } if (!function_exists('getmicrotime')) { @@ -12,29 +12,29 @@ } } $globals_start = getmicrotime(); - include_once(KERNEL_PATH.'/globals.php'); // non OOP functions used through kernel, e.g. print_pre - include_once(KERNEL_PATH.'/utility/multibyte.php'); // emulating multi-byte php extension + include_once(KERNEL_PATH . '/globals.php'); // non OOP functions used through kernel, e.g. print_pre + include_once(KERNEL_PATH . '/utility/multibyte.php'); // emulating multi-byte php extension $globals_end = getmicrotime(); define('INPORTAL_ENV', 1); - $vars = parse_portal_ini(FULL_PATH.'/config.php'); + $vars = parse_portal_ini(FULL_PATH . '/config.php'); $admin_directory = isset($vars['AdminDirectory']) ? $vars['AdminDirectory'] : '/admin'; safeDefine('ADMIN_DIRECTORY', $admin_directory); # New path detection method: begin if (defined('REL_PATH')) { // location of index.php relatively to site base folder - $relative_path = preg_replace('/^[\/]{0,1}admin(.*)/', $admin_directory.'\\1', REL_PATH); + $relative_path = preg_replace('/^[\/]{0,1}admin(.*)/', $admin_directory . '\\1', REL_PATH); } else { // default index.php relative location is administrative console folder define('REL_PATH', $admin_directory); $relative_path = REL_PATH; } - $ps = rtrim(preg_replace('/'.preg_quote(rtrim($relative_path, '/'), '/').'$/', '', str_replace('\\', '/', dirname($_SERVER['PHP_SELF']))), '/'); + $ps = rtrim(preg_replace('/' . preg_quote(rtrim($relative_path, '/'), '/') . '$/', '', str_replace('\\', '/', dirname($_SERVER['PHP_SELF']))), '/'); safeDefine('BASE_PATH', $ps); // in case in-portal has defined it before # New path detection method: end @@ -48,16 +48,16 @@ safeDefine('APPLICATION_PATH', isset($vars['ApplicationPath']) ? $vars['ApplicationPath'] : '/core/kernel/application.php'); if (isset($vars['WriteablePath'])) { - define('WRITEABLE', FULL_PATH.$vars['WriteablePath']); + define('WRITEABLE', FULL_PATH . $vars['WriteablePath']); define('WRITEBALE_BASE', $vars['WriteablePath']); } if ($vars === false || count($vars) == 0) { global $rootURL; echo 'In-Portal is probably not installed, or configuration file is missing.
'; echo 'Please use the installation script to fix the problem.

'; - $install_script = file_exists(FULL_PATH.'/proj-base/install.php') ? 'core' : 'admin'; - echo 'Go to installation script

'; + $install_script = file_exists(FULL_PATH . '/proj-base/install.php') ? 'core' : 'admin'; + echo 'Go to installation script

'; flush(); exit; } @@ -74,20 +74,22 @@ } define('TABLE_PREFIX', $vars['TablePrefix']); - define('DOMAIN', getArrayValue($vars, 'Domain')); ini_set('memory_limit', '50M'); define('MODULES_PATH', FULL_PATH); - define('EXPORT_PATH', defined('WRITEABLE') ? WRITEABLE.'/export' : FULL_PATH.ADMIN_DIRECTORY.'/export'); - define('GW_CLASS_PATH', MODULES_PATH.'/in-commerce/units/gateways/gw_classes'); // Payment Gateway Classes Path - define('SYNC_CLASS_PATH', FULL_PATH.'/sync'); // path for 3rd party user syncronization scripts + define('EXPORT_BASE_PATH', (defined('WRITEBALE_BASE') ? WRITEBALE_BASE : ADMIN_DIRECTORY) . '/export'); + define('EXPORT_PATH', FULL_PATH . EXPORT_BASE_PATH); + + define('GW_CLASS_PATH', MODULES_PATH . '/in-commerce/units/gateways/gw_classes'); // Payment Gateway Classes Path + define('SYNC_CLASS_PATH', FULL_PATH . '/sync'); // path for 3rd party user syncronization scripts + safeDefine('ENV_VAR_NAME','env'); - safeDefine('IMAGES_PATH', '/kernel/images/'); - safeDefine('IMAGES_PENDING_PATH', IMAGES_PATH.'pending/'); + safeDefine('IMAGES_PATH', (defined('WRITEBALE_BASE') ? WRITEBALE_BASE : '/kernel') . '/images/'); + safeDefine('IMAGES_PENDING_PATH', IMAGES_PATH . 'pending/'); safeDefine('CUSTOM_UPLOAD_PATH', '/templates/images/custom/'); safeDefine('MAX_UPLOAD_SIZE', min(ini_get('upload_max_filesize'), ini_get('post_max_size'))*1024*1024); @@ -96,37 +98,37 @@ safeDefine('EXPERIMENTAL_PRE_PARSE', 1); safeDefine('SILENT_LOG', 0); - if( file_exists(FULL_PATH.'/debug.php') ) + if( file_exists(FULL_PATH . '/debug.php') ) { - include_once(FULL_PATH.'/debug.php'); + include_once(FULL_PATH . '/debug.php'); if(isset($dbg_options['DEBUG_MODE']) && $dbg_options['DEBUG_MODE']) { $debugger_start = getmicrotime(); - include_once(KERNEL_PATH.'/utility/debugger.php'); + include_once(KERNEL_PATH . '/utility/debugger.php'); $debugger_end = getmicrotime(); if (isset($debugger) && constOn('DBG_PROFILE_INCLUDES')) { - $debugger->profileStart('inc_globals', KERNEL_PATH.'/globals.php', $globals_start); - $debugger->profileFinish('inc_globals', KERNEL_PATH.'/globals.php', $globals_end); + $debugger->profileStart('inc_globals', KERNEL_PATH . '/globals.php', $globals_start); + $debugger->profileFinish('inc_globals', KERNEL_PATH . '/globals.php', $globals_end); $debugger->profilerAddTotal('includes', 'inc_globals'); - $debugger->profileStart('inc_debugger', KERNEL_PATH.'/utility/debugger.php', $debugger_start); - $debugger->profileFinish('inc_debugger', KERNEL_PATH.'/utility/debugger.php', $debugger_end); + $debugger->profileStart('inc_debugger', KERNEL_PATH . '/utility/debugger.php', $debugger_start); + $debugger->profileFinish('inc_debugger', KERNEL_PATH . '/utility/debugger.php', $debugger_end); $debugger->profilerAddTotal('includes', 'inc_debugger'); } } } $includes = Array( - KERNEL_PATH.'/application.php', - FULL_PATH.APPLICATION_PATH, - KERNEL_PATH.'/db/db_connection.php', - KERNEL_PATH."/kbase.php", - KERNEL_PATH.'/utility/event.php', - KERNEL_PATH."/utility/factory.php", - KERNEL_PATH."/languages/phrases_cache.php", - KERNEL_PATH."/db/dblist.php", - KERNEL_PATH."/db/dbitem.php", - KERNEL_PATH."/event_handler.php", - KERNEL_PATH.'/db/db_event_handler.php', + KERNEL_PATH . '/application.php', + FULL_PATH . APPLICATION_PATH, + KERNEL_PATH . '/db/db_connection.php', + KERNEL_PATH . "/kbase.php", + KERNEL_PATH . '/utility/event.php', + KERNEL_PATH . "/utility/factory.php", + KERNEL_PATH . "/languages/phrases_cache.php", + KERNEL_PATH . "/db/dblist.php", + KERNEL_PATH . "/db/dbitem.php", + KERNEL_PATH . "/event_handler.php", + KERNEL_PATH . '/db/db_event_handler.php', ); foreach ($includes as $a_file) { @@ -137,9 +139,9 @@ $debugger->AttachToApplication(); } - if( !function_exists('adodb_mktime') ) include_once(KERNEL_PATH.'/utility/adodb-time.inc.php'); + if( !function_exists('adodb_mktime') ) include_once(KERNEL_PATH . '/utility/adodb-time.inc.php'); -// include_once(KERNEL_PATH."/utility/temp_handler.php"); // needed because of static calls from kBase +// include_once(KERNEL_PATH . '/utility/temp_handler.php'); // needed because of static calls from kBase // up to here // global constants Index: branches/RC/admin/install.php =================================================================== diff -u -N -r10304 -r10832 --- branches/RC/admin/install.php (.../install.php) (revision 10304) +++ branches/RC/admin/install.php (.../install.php) (revision 10832) @@ -1720,12 +1720,14 @@ $ado->Execute("DROP TABLE IF EXISTS $EventTable"); $ado->Execute('INSERT INTO '.$g_TablePrefix.'Cache (VarName, Data) VALUES (\'ForcePermCacheUpdate\', \'1\')'); - if ($application->ConfigValue('InstallFinished') === false) { - $fields_hash = Array ( - 'VariableName' => 'InstallFinished', - 'VariableValue' => 1, - ); - $application->Conn->doInsert($fields_hash, TABLE_PREFIX.'ConfigurationValues'); + $sql = 'SELECT VariableValue + FROM ' . $g_TablePrefix . 'ConfigurationValues + WHERE VariableName = "InstallFinished"'; + if (!$ado->GetOne($sql)) { + // not installed -> set installation mark + $sql = 'INSERT INTO ' . $g_TablePrefix . 'ConfigurationValues (VariableName, VariableValue) + VALUES ("InstallFinished", 1)'; + $ado->Execute($sql); } $include_file = $pathtoroot.$admin."/install/install_finish.php"; Index: branches/RC/core/install.php =================================================================== diff -u -N -r10509 -r10832 --- branches/RC/core/install.php (.../install.php) (revision 10509) +++ branches/RC/core/install.php (.../install.php) (revision 10832) @@ -7,20 +7,7 @@ define('FULL_PATH', realpath(dirname(__FILE__).'/..') ); define('REL_PATH', '/core'); - /** - * Upgrade sqls are located using this mask - * - */ - define('UPGRADES_FILE', FULL_PATH.'/%sinstall/upgrades.%s'); - - /** - * Format of version identificator in upgrade files - * - */ - define('VERSION_MARK', '# ===== v ([\d]+\.[\d]+\.[\d]+) ====='); - -// print_pre($_POST); - + // run installator $install_engine = new kInstallator(); $install_engine->Init(); $install_engine->Run(); @@ -43,26 +30,13 @@ var $Conn = null; /** - * Path to config.php - * - * @var string - */ - var $INIFile = ''; - - /** * XML file containing steps information * * @var string */ var $StepDBFile = ''; /** - * Parsed data from config.php - * - * @var Array - */ - var $systemConfig = Array (); - /** * Step name, that currently being processed * * @var string @@ -81,36 +55,51 @@ * * @var Array */ - var $steps = Array( - 'fresh_install' => Array ('check_paths', 'db_config', 'root_password', 'choose_modules', 'finish'), - 'already_installed' => Array ('install_setup'), + var $steps = Array ( + 'fresh_install' => Array ('check_paths', 'db_config', 'select_license', 'download_license', 'select_domain', 'root_password', 'choose_modules', 'post_config', 'select_theme', 'finish'), + 'already_installed' => Array ('check_paths', 'install_setup'), - 'upgrade' => Array ('install_setup', 'upgrade_modules', /* ..., */ 'finish'), - 'db_reconfig' => Array ('install_setup',/* ..., */ 'finish'), - 'fix_paths' => Array ('install_setup',/* ..., */ 'finish'), - ); + 'upgrade' => Array ('check_paths', 'install_setup', 'upgrade_modules', 'finish'), + 'update_license' => Array ('check_paths', 'install_setup', 'select_license', 'download_license', 'select_domain', 'finish'), + 'db_reconfig' => Array ('check_paths', 'install_setup', 'db_reconfig', 'finish'), + 'fix_paths' => Array ('check_paths', 'install_setup', 'fix_paths', 'finish'), + ); - /** * Steps, that doesn't required admin to be logged-in to proceed * * @var Array */ - var $skipLoginSteps = Array ('root_password', 'choose_modules', 'finish', -1); + var $skipLoginSteps = Array ('check_paths', 'select_license', 'download_license', 'select_domain', 'root_password', 'choose_modules', 'post_config', 'select_theme', 'finish', -1); /** * Steps, on which kApplication should not be initialized, because of missing correct db table structure * * @var Array */ - var $skipApplicationSteps = Array ('check_paths', 'db_config'/*, 'install_setup'*/); // remove install_setup when application will work separately from install + var $skipApplicationSteps = Array ('check_paths', 'db_config', 'db_reconfig' /*, 'install_setup'*/); // remove install_setup when application will work separately from install /** - * Folders that should be writeable to continue installation + * Folders that should be writeable to continue installation. $1 - main writeable folder from config.php ("/system" by default) * * @var Array */ - var $writeableFolders = Array ('/system'); + var $writeableFolders = Array ( + '$1', + '$1/images', + '$1/images/resized', + '$1/images/pending', + '$1/images/pending/resized', + '$1/images/emoticons', // for "In-Bulletin" + '$1/images/manufacturers', // for "In-Commerce" + '$1/images/manufacturers/resized', // for "In-Commerce" + '$1/backupdata', + '$1/export', + '$1/stylesheets', + '$1/user_files', + '$1/cache', + '/themes', + ); /** * Contains last error message text @@ -129,31 +118,44 @@ /** * Holds number of last executed query in the SQL * - * @var unknown_type + * @var int */ var $LastQueryNum = 0; + /** + * Common tools required for installation process + * + * @var kInstallToolkit + */ + var $toolkit = null; + function Init() { - $this->INIFile = FULL_PATH.'/config.php'; + // connect toolkit required for module installations to installator and via versa + require_once FULL_PATH . REL_PATH . '/install/install_toolkit.php'; + $this->toolkit = new kInstallToolkit(); + $this->toolkit->setInstallator(&$this); + $this->StepDBFile = FULL_PATH.'/'.REL_PATH.'/install/steps_db.xml'; $base_path = rtrim(preg_replace('/'.preg_quote(rtrim(REL_PATH, '/'), '/').'$/', '', str_replace('\\', '/', dirname($_SERVER['PHP_SELF']))), '/'); $this->baseURL = 'http://'.$_SERVER['HTTP_HOST'].$base_path.'/core/install/'; set_error_handler( Array(&$this, 'ErrorHandler') ); - if (file_exists($this->INIFile)) { + if (file_exists($this->toolkit->INIFile)) { // if config.php found, then check his write permission too $this->writeableFolders[] = '/config.php'; } else { $this->writeableFolders[] = '/'; } - $this->systemConfig = $this->ParseConfig(true); - $this->systemConfig['Misc']['WriteablePath'] = '/system'; // for development purposes - $this->systemConfig['Misc']['Domain'] = $_SERVER['HTTP_HOST']; // for redirects from SSL mode + if (!$this->toolkit->getSystemConfig('Misc', 'WriteablePath')) { + // set global writable folder when such setting is missing + $this->toolkit->setSystemConfig('Misc', 'WriteablePath', '/system'); + } + $this->currentStep = $this->GetVar('step'); // can't check login on steps where no application present anyways :) @@ -181,12 +183,12 @@ function SelectPreset() { $preset = $this->GetVar('preset'); - if (file_exists($this->INIFile) && $this->systemConfig) { + if ($this->toolkit->systemConfigFound()) { // only at installation first step $status = $this->CheckDatabase(false); if ($status && $this->AlreadyInstalled()) { // if already installed, then all future actions need login to work - $this->skipLoginSteps = Array (-1); + $this->skipLoginSteps = Array ('check_paths', -1); if (!$preset) { $preset = 'already_installed'; $this->currentStep = ''; @@ -202,9 +204,14 @@ function GetVar($name) { - return isset($_REQUEST[$name]) ? $_REQUEST[$name] : false; + return array_key_exists($name, $_REQUEST) ? $_REQUEST[$name] : false; } + function SetVar($name, $value) + { + $_REQUEST[$name] = $value; + } + /** * Performs needed intialization of data, that step requires * @@ -218,42 +225,51 @@ // step require login to proceed if (!$this->Application->LoggedIn()) { $this->stepsPreset = 'already_installed'; - $this->SetFirstStep(); + $this->currentStep = 'install_setup'; // manually set 2nd step, because 'check_paths' step doesn't contain login form +// $this->SetFirstStep(); } } switch ($this->currentStep) { case 'check_paths': + $writeable_base = $this->toolkit->getSystemConfig('Misc', 'WriteablePath'); foreach ($this->writeableFolders as $folder_path) { - $file_path = FULL_PATH.$folder_path; - if (!is_writable($file_path)) { + $file_path = FULL_PATH . str_replace('$1', $writeable_base, $folder_path); + if (file_exists($file_path) && !is_writable($file_path)) { $this->errorMessage = 'Install cannot write to specified folder in the root directory of your installation'; break; } } break; case 'db_config': - $section_name = 'Database'; - $fields = Array ('DBType', 'DBHost', 'DBName', 'DBUser', 'DBUserPassword', 'DBCollation', 'TablePrefix'); + case 'db_reconfig': + $fields = Array ( + 'DBType', 'DBHost', 'DBName', 'DBUser', + 'DBUserPassword', 'DBCollation', 'TablePrefix' + ); - if (!isset($this->systemConfig[$section_name])) { - $this->systemConfig[$section_name] = Array (); - } - // set fields foreach ($fields as $field_name) { $submit_value = $this->GetVar($field_name); if ($submit_value !== false) { - $this->systemConfig[$section_name][$field_name] = $submit_value; + $this->toolkit->setSystemConfig('Database', $field_name, $submit_value); } - elseif (!isset($this->systemConfig[$section_name][$field_name])) { - $this->systemConfig[$section_name][$field_name] = ''; - } + /*else { + $this->toolkit->setSystemConfig('Database', $field_name, ''); + }*/ } break; + case 'download_license': + $license_source = $this->GetVar('license_source'); + if ($license_source !== false && $license_source != 1) { + // previous step was "Select License" and not "Download from Intechnic" option was selected + $this->currentStep = $this->GetNextStep(); + } + break; + case 'choose_modules': // if no modules found, then proceed to next step $modules = $this->ScanModules(); @@ -262,6 +278,18 @@ } break; + case 'select_theme': + if (count($this->toolkit->getThemes(true)) == 1) { + // only one theme -> set it as primary + $sql = 'UPDATE ' . $this->Application->getUnitOption('theme', 'TableName') . 'Theme + SET Enabled = 1, PrimaryTheme = 1 + LIMIT 1'; + $this->Conn->Query($sql); + + $this->currentStep = $this->GetNextStep(); + } + break; + case 'upgrade_modules': // get installed modules from db and compare their versions to upgrade script $modules = $this->GetUpgradableModules(); @@ -272,28 +300,55 @@ case 'install_setup': $next_preset = $this->Application->GetVar('next_preset'); - if ($next_preset !== false && $this->Application->GetVar('login') == 'root') { - // option was choosen, then verify password & login user - $login_event = new kEvent('u.current:OnLogin'); - $this->Application->HandleEvent($login_event); + if ($next_preset !== false) { + if ($this->Application->GetVar('login') == 'root') { + // verify "root" user using configuration settings + $login_event = new kEvent('u.current:OnLogin'); + $this->Application->HandleEvent($login_event); - if ($login_event->status == erSUCCESS) { - // login succeeded + if ($login_event->status != erSUCCESS) { + $user =& $this->Application->recallObject('u.current'); + /* @var $user UsersItem */ + $this->errorMessage = $user->GetErrorMsg('ValidateLogin') . '. If you don\'t know your username or password, contact Intechnic Support'; + } + } + else { + // non "root" user -> verify using licensing server + $url_params = Array ( + 'login=' . md5( $this->GetVar('login') ), + 'password=' . md5( $this->GetVar('password') ), + 'action=check', + 'license_code=' . base64_encode( $this->toolkit->getSystemConfig('Intechnic', 'LicenseCode') ), + 'version=' . '4.3.0',//$this->toolkit->GetMaxModuleVersion('In-Portal'), + 'domain=' . base64_encode($_SERVER['HTTP_HOST']), + ); + + $license_url = GET_LICENSE_URL . '?' . implode('&', $url_params); + $file_data = curl_post($license_url, '', null, 'GET'); + + if (substr($file_data, 0, 5) == 'Error') { + $this->errorMessage = substr($file_data, 6) . ' If you don\'t know your username or password, contact Intechnic Support'; + } + + if ($this->errorMessage == '') { + $user_id = -1; + $session =& $this->Application->recallObject('Session'); + $session->SetField('PortalUserId', $user_id); + $this->Application->SetVar('u.current_id', $user_id); + $this->Application->StoreVar('user_id', $user_id); + } + } + + if ($this->errorMessage == '') { + // processed with redirect to selected step preset if (!isset($this->steps[$next_preset])) { $this->errorMessage = 'Preset "'.$next_preset.'" not yet implemented'; } else { $this->stepsPreset = $next_preset; } } - else { - // login failed - $user =& $this->Application->recallObject('u.current'); - /* @var $user UsersItem */ - - $this->errorMessage = $user->GetErrorMsg('ValidateLogin').'. If you don\'t know your username or password, contact Intechnic Support'; - } } else { // if preset was not choosen, then raise error @@ -321,11 +376,12 @@ switch ($this->currentStep) { case 'db_config': + case 'db_reconfig': // 1. check if required fields are filled $section_name = 'Database'; $required_fields = Array ('DBType', 'DBHost', 'DBName', 'DBUser', 'DBCollation'); foreach ($required_fields as $required_field) { - if (!$this->systemConfig[$section_name][$required_field]) { + if (!$this->toolkit->getSystemConfig($section_name, $required_field)) { $status = false; $this->errorMessage = 'Please fill all required fields'; break; @@ -334,9 +390,21 @@ if (!$status) break; // 2. check permissions, that use have in this database - $status = $this->CheckDatabase(); + $status = $this->CheckDatabase(($this->currentStep == 'db_config') && !$this->GetVar('UseExistingSetup')); break; + case 'select_license': + if ($this->GetVar('license_source') == 2) { + // license from file -> file must be uploaded + $upload_error = $_FILES['license_file']['error']; + if ($upload_error != UPLOAD_ERR_OK) { + $this->errorMessage = 'Missing License File'; + } + + $status = $this->errorMessage == ''; + } + break; + case 'root_password': // check, that password & verify password match $password = $this->Application->GetVar('root_password'); @@ -351,6 +419,23 @@ $status = $this->errorMessage == ''; break; + + case 'choose_modules': + case 'upgrade_modules': + $modules = $this->Application->GetVar('modules'); + if (!$modules) { + $this->errorMessage = 'Please select module(-s) to ' . ($this->currentStep == 'choose_modules' ? 'install' : 'upgrade'); + } + + $found['In-Portal'] = in_array('kernel', $modules); + $found['Proj-Base'] = in_array('proj-base', $modules); + + if (!$found['In-Portal'] && !$found['Proj-Base']) { + $this->errorMessage = 'Please ' . ($modules ? 'also ' : '') . 'select "' . implode('" or "', array_keys($found)) . '" as interface module'; + } + + $status = $this->errorMessage == ''; + break; } return $status; @@ -369,44 +454,216 @@ switch ($this->currentStep) { case 'db_config': + case 'db_reconfig': // store db configuration $sql = 'SHOW COLLATION - LIKE \''.$this->systemConfig['Database']['DBCollation'].'\''; + LIKE \''.$this->toolkit->getSystemConfig('Database', 'DBCollation').'\''; $collation_info = $this->Conn->Query($sql); if ($collation_info) { - $this->systemConfig['Database']['DBCharset'] = $collation_info[0]['Charset']; + $this->toolkit->setSystemConfig('Database', 'DBCharset', $collation_info[0]['Charset']); // database is already connected, that's why set collation on the fly - $this->Conn->Query('SET NAMES \''.$this->systemConfig['Database']['DBCharset'].'\' COLLATE \''.$this->systemConfig['Database']['DBCollation'].'\''); + $this->Conn->Query('SET NAMES \''.$this->toolkit->getSystemConfig('Database', 'DBCharset').'\' COLLATE \''.$this->toolkit->getSystemConfig('Database', 'DBCollation').'\''); } - $this->SaveConfig(); + $this->toolkit->SaveConfig(); - // import base data into database - $this->RunSQL('/core/install/install_schema.sql'); - $this->RunSQL('/core/install/install_data.sql'); + if ($this->currentStep == 'db_config') { + if ($this->GetVar('UseExistingSetup')) { + // abort clean install and redirect to already_installed + $this->stepsPreset = 'already_installed'; + break; + } - // set module "Core" version after install (based on upgrade scripts) - $this->SetModuleVersion('Core'); + // import base data into new database, not for db_reconfig + $this->toolkit->RunSQL('/core/install/install_schema.sql'); + $this->toolkit->RunSQL('/core/install/install_data.sql'); + + // set module "Core" version after install (based on upgrade scripts) + $this->toolkit->SetModuleVersion('Core'); + } break; + case 'select_license': + $license_source = $this->GetVar('license_source'); + switch ($license_source) { + case 1: // Download from Intechnic + + break; + + case 2: // Upload License File + $file_data = array_map('trim', file($_FILES['license_file']['tmp_name'])); + if ((count($file_data) == 3) && $file_data[1]) { + $modules_helper =& $this->Application->recallObject('ModulesHelper'); + /* @var $modules_helper kModulesHelper */ + + if ($modules_helper->verifyLicense($file_data[1])) { + $this->toolkit->setSystemConfig('Intechnic', 'License', $file_data[1]); + $this->toolkit->setSystemConfig('Intechnic', 'LicenseCode', $file_data[2]); + $this->toolkit->SaveConfig(); + } + else { + $this->errorMessage = 'Invalid License File'; + } + } + else { + $this->errorMessage = 'Invalid License File'; + } + break; + + case 3: // Use Existing License + $license_hash = $this->toolkit->getSystemConfig('Intechnic', 'License'); + if ($license_hash) { + $modules_helper =& $this->Application->recallObject('ModulesHelper'); + /* @var $modules_helper kModulesHelper */ + + if (!$modules_helper->verifyLicense($license_hash)) { + $this->errorMessage = 'Invalid or corrupt license detected'; + } + } + else { + // happens, when browser's "Back" button is used + $this->errorMessage = 'Missing License File'; + } + break; + + case 4: // Skip License (Local Domain Installation) + if ($this->toolkit->sectionFound('Intechnic')) { + // remove any previous license information + $this->toolkit->setSystemConfig('Intechnic', 'License'); + $this->toolkit->setSystemConfig('Intechnic', 'LicenseCode'); + $this->toolkit->SaveConfig(); + } + break; + } + break; + + case 'download_license': + $license_login = $this->GetVar('login'); + $license_password = $this->GetVar('password'); + $license_id = $this->GetVar('licenses'); + + if (strlen($license_login) && strlen($license_password) && !$license_id) { + // Here we determine weather login is ok & check available licenses + $url_params = Array ( + 'login=' . md5($license_login), + 'password=' . md5($license_password), + 'version=' . $this->toolkit->GetMaxModuleVersion('In-Portal'), + 'domain=' . base64_encode($_SERVER['HTTP_HOST']), + ); + + $license_url = GET_LICENSE_URL . '?' . implode('&', $url_params); + $file_data = curl_post($license_url, '', null, 'GET'); + if (!$file_data) { + // error connecting to licensing server + $this->errorMessage = 'Unable to connect to the Intechnic server! Please try again later!'; + } + else { + if (substr($file_data, 0, 5) == 'Error') { + // after processing data server returned error + $this->errorMessage = substr($file_data, 6); + } + else { + // license received + if (substr($file_data, 0, 3) == 'SEL') { + // we have more, then one license -> let user choose + $this->SetVar('license_selection', base64_encode( substr($file_data, 4) )); // we received html with radio buttons with names "licenses" + $this->errorMessage = 'Please select which license to use'; + } + else { + // we have one license + $this->toolkit->processLicense($file_data); + } + } + } + } + else if (!$license_id) { + // licenses were not queried AND user/password missing + $this->errorMessage = 'Incorrect Username or Password. If you don\'t know your username or password, contact Intechnic Support'; + } + else { + // Here we download license + $url_params = Array ( + 'license_id=' . md5($license_id), + 'dlog=' . md5($license_login), + 'dpass=' . md5($license_password), + 'version=' . $this->toolkit->GetMaxModuleVersion('In-Portal'), + 'domain=' . base64_encode($_SERVER['HTTP_HOST']), + ); + + $license_url = GET_LICENSE_URL . '?' . implode('&', $url_params); + $file_data = curl_post($license_url, '', null, 'GET'); + + if (!$file_data) { + // error connecting to licensing server + $this->errorMessage = 'Unable to connect to the Intechnic server! Please try again later!'; + } + else { + if (substr($file_data, 0, 5) == 'Error') { + // after processing data server returned error + $this->errorMessage = substr($file_data, 6); + } + else { + $this->toolkit->processLicense($file_data); + } + } + } + break; + + case 'select_domain': + $modules_helper =& $this->Application->recallObject('ModulesHelper'); + /* @var $modules_helper kModulesHelper */ + + $license_hash = $this->toolkit->getSystemConfig('Intechnic', 'License'); + if ($license_hash) { + // when license present, then extract domain from it + $license_hash = base64_decode($license_hash); + list ( , , $license_keys) = $modules_helper->_ParseLicense($license_hash); + $license_domain = $license_keys[0]['domain']; + } + else { + // when license missing, then use current domain + $license_domain = $_SERVER['HTTP_HOST']; + } + + $domain = $this->GetVar('domain') == 1 ? $_SERVER['HTTP_HOST'] : str_replace(' ', '', $this->GetVar('other')); + + if ($domain != '') { + if (strstr($domain, $license_domain) || $modules_helper->_IsLocalSite($domain)) { + $this->toolkit->setSystemConfig('Intechnic', 'Domain', $domain); + $this->toolkit->SaveConfig(); + } + else { + $this->errorMessage = 'Domain name entered does not match domain name in the license!'; + } + } + else { + $this->errorMessage = 'Please enter valid domain!'; + } + break; + case 'root_password': // update root password in database $password = md5( md5($this->Application->GetVar('root_password')) . 'b38'); - $this->SetConfigValue('RootPass', $password); - // set Site_Path (for SSL & old in-portal code) - $this->SetConfigValue('Site_Path', BASE_PATH.'/'); + $config_values = Array ( + 'RootPass' => $password, + 'Site_Path' => BASE_PATH.'/', // set Site_Path (for SSL & old in-portal code) + 'Backup_Path' => FULL_PATH . $this->toolkit->getSystemConfig('Misc', 'WriteablePath') . '/backupdata', + 'Smtp_AdminMailFrom' => 'portal@' . $this->toolkit->getSystemConfig('Intechnic', 'Domain') + ); + $this->toolkit->saveConfigValues($config_values); + // import base language for core (english) - $this->ImportLanguage('/core/install/english'); + $this->toolkit->ImportLanguage('/core/install/english'); // set imported language as primary $lang =& $this->Application->recallObject('lang.-item', null, Array('skip_autoload' => true)); /* @var $lang LanguagesItem */ $lang->Load(1); // fresh install => ID=1 - $lang->setPrimary(); + $lang->setPrimary(true); // for Front-End break; case 'choose_modules': @@ -419,22 +676,57 @@ include_once($install_file); // set module version after install (based on upgrade scripts) - $this->SetModuleVersion($module); + $this->toolkit->SetModuleVersion($module); } } } - // scan themes - $this->Application->HandleEvent($themes_event, 'adm:OnRebuildThemes'); - $this->Conn->Query('UPDATE '.TABLE_PREFIX.'Theme SET Enabled=1, PrimaryTheme =1 LIMIT 1'); - - // update categories cache + // update category cache $updater =& $this->Application->recallObject('kPermCacheUpdater'); /* @var $updater kPermCacheUpdater */ $updater->OneStepRun(); break; + case 'post_config': + $this->toolkit->saveConfigValues( $this->GetVar('config') ); + break; + + case 'select_theme': + // 1. mark theme, that user is selected + $theme_id = $this->GetVar('theme'); + $theme_table = $this->Application->getUnitOption('theme', 'TableName'); + $theme_idfield = $this->Application->getUnitOption('theme', 'IDField'); + + $sql = 'UPDATE ' . $theme_table . ' + SET Enabled = 1, PrimaryTheme = 1 + WHERE ' . $theme_idfield . ' = ' . $theme_id; + $this->Conn->Query($sql); + + if ($this->Application->isModuleEnabled('In-Portal')) { + // 2. compile theme stylesheets (only In-Portal uses them) + $css_table = $this->Application->getUnitOption('css', 'TableName'); + $css_idfield = $this->Application->getUnitOption('css', 'IDField'); + + $sql = 'SELECT LOWER(Name) AS Name, ' . $css_idfield . ' + FROM ' . $css_table; + $css_hash = $this->Conn->GetCol($sql, $css_idfield); + + $css_item =& $this->Application->recallObject('css', null, Array('skip_autoload' => true)); + /* @var $css_item StyleshetsItem */ + + foreach ($css_hash as $stylesheet_id => $theme_name) { + $css_item->Load($stylesheet_id); + $css_item->Compile(); + + $sql = 'UPDATE ' . $theme_table . ' + SET StylesheetId = ' . $stylesheet_id . ' + WHERE LOWER(Name) = ' . $this->Conn->qstr($theme_name); + $this->Conn->Query($sql); + } + } + break; + case 'upgrade_modules': // get installed modules from db and compare their versions to upgrade script $modules = $this->Application->GetVar('modules'); @@ -466,7 +758,7 @@ if (!$start_from_module) { $this->RunUpgrades($module_info['Path'], $regs[1], 'before'); } - if (!$this->RunSQLText($sqls, null, null, $start_from_query)) { + if (!$this->toolkit->RunSQLText($sqls, null, null, $start_from_query)) { $this->errorMessage .= ''; $this->errorMessage .= ''; $this->errorMessage .= '
Click Continue button below to skip this query and go further
'; @@ -475,20 +767,20 @@ $start_from_query = 0; // so that next module start from the beggining $this->RunUpgrades($module_info['Path'], $regs[1], 'after'); - // after upgrade sqls are executed update version - $this->SetModuleVersion($module_name, $module_info['ToVersion']); + // after upgrade sqls are executed update version and upgrade language pack + $this->toolkit->SetModuleVersion($module_name, $module_info['ToVersion']); + $this->toolkit->ImportLanguage('/' . $module_info['Path'] . 'install/english', true); } } - else { - $this->errorMessage = 'Please select module(-s) to upgrade'; - } break; + case 'fix_paths': + $this->toolkit->saveConfigValues( $this->Application->GetVar('config') ); + break; + case 'finish': // delete cache - $sql = 'DELETE FROM '.TABLE_PREFIX.'Cache - WHERE VarName IN ("config_files","configs_parsed","sections_parsed")'; - $this->Conn->Query($sql); + $this->toolkit->deleteCache(); // set installation finished mark if ($this->Application->ConfigValue('InstallFinished') === false) { @@ -541,8 +833,8 @@ } $upgrade_object = new $upgrade_classes[$module_path](); - if (method_exists($upgrade_object, 'setInstallator')) { - $upgrade_object->setInstallator($this); + if (method_exists($upgrade_object, 'setToolkit')) { + $upgrade_object->setToolkit(&$this->toolkit); } foreach ($versions as $version) { @@ -554,41 +846,6 @@ } /** - * Sets module version to passed - * - * @param string $module_name - * @param string $version - */ - function SetModuleVersion($module_name, $version = false) - { - if ($version === false) { - $version = $this->GetMaxModuleVersion($module_name); - } - - $table_prefix = $this->systemConfig['Database']['TablePrefix']; - - $sql = 'UPDATE '.$table_prefix.'Modules - SET Version = "'.$version.'" - WHERE Name = "'.$module_name.'"'; - $this->Conn->Query($sql); - } - - - /** - * Sets new configuration variable value - * - * @param string $name - * @param mixed $value - */ - function SetConfigValue($name, $value) - { - $sql = 'UPDATE '.TABLE_PREFIX.'ConfigurationValues - SET VariableValue = '.$this->Conn->qstr($value).' - WHERE VariableName = '.$this->Conn->qstr($name); - $this->Conn->Query($sql); - } - - /** * Initialize kApplication * * @param bool $force initialize in any case @@ -601,8 +858,12 @@ include_once(FULL_PATH.'/core/kernel/startup.php'); $this->Application =& kApplication::Instance(); + $this->toolkit->Application =& kApplication::Instance(); + $this->Application->Init(); + $this->Conn =& $this->Application->GetADODBConnection(); + $this->toolkit->Conn =& $this->Application->GetADODBConnection(); } } @@ -620,44 +881,34 @@ if (isset($this->Application)) { $this->Application->Done(); - -// echo 'SID: ['.$this->Application->GetSID().']
'; } exit; } - function GetMaxModuleVersion($module_name) + function ConnectToDatabase() { - $upgrades_file = sprintf(UPGRADES_FILE, mb_strtolower($module_name).'/', 'sql'); - if (!file_exists($upgrades_file)) { - // no upgrade file - return '4.0.1'; - } + include_once FULL_PATH . '/core/kernel/db/db_connection.php'; - $sqls = file_get_contents($upgrades_file); - $versions_found = preg_match_all('/'.VERSION_MARK.'/s', $sqls, $regs); - if (!$versions_found) { - // upgrades file doesn't contain version definitions - return '4.0.1'; + $required_keys = Array ('DBType', 'DBUser', 'DBName'); + foreach ($required_keys as $required_key) { + if (!$this->toolkit->getSystemConfig('Database', $required_key)) { + // one of required db connection settings missing -> abort connection + return false; + } } - return end($regs[1]); - } + $this->Conn = new kDBConnection($this->toolkit->getSystemConfig('Database', 'DBType'), Array(&$this, 'DBErrorHandler')); + $this->Conn->Connect( + $this->toolkit->getSystemConfig('Database', 'DBHost'), + $this->toolkit->getSystemConfig('Database', 'DBUser'), + $this->toolkit->getSystemConfig('Database', 'DBUserPassword'), + $this->toolkit->getSystemConfig('Database', 'DBName') + ); - function ConnectToDatabase() - { - include_once FULL_PATH.'/core/kernel/db/db_connection.php'; + // setup toolkit too + $this->toolkit->Conn =& $this->Conn; - if (!isset($this->systemConfig['Database']['DBType']) || - !isset($this->systemConfig['Database']['DBUser']) || - !isset($this->systemConfig['Database']['DBName']) - ) { - return false; - } - - $this->Conn = new kDBConnection($this->systemConfig['Database']['DBType'], Array(&$this, 'DBErrorHandler')); - $this->Conn->Connect($this->systemConfig['Database']['DBHost'], $this->systemConfig['Database']['DBUser'], $this->systemConfig['Database']['DBUserPassword'], $this->systemConfig['Database']['DBName']); return $this->Conn->errorCode == 0; } @@ -668,10 +919,10 @@ */ function AlreadyInstalled() { - $table_prefix = $this->systemConfig['Database']['TablePrefix']; + $table_prefix = $this->toolkit->getSystemConfig('Database', 'TablePrefix'); $sql = 'SELECT VariableValue - FROM '.$table_prefix.'ConfigurationValues + FROM ' . $table_prefix . 'ConfigurationValues WHERE VariableName = "InstallFinished"'; return $this->TableExists('ConfigurationValues') && $this->Conn->GetOne($sql); @@ -684,7 +935,7 @@ // 2. user has all types of permissions in database - if (mb_strlen($this->systemConfig['Database']['TablePrefix']) > 7) { + if (mb_strlen($this->toolkit->getSystemConfig('Database', 'TablePrefix')) > 7) { $this->errorMessage = 'Table prefix should not be longer than 7 characters'; return false; } @@ -721,7 +972,7 @@ } else { // user has insufficient permissions in database specified - $db_error = 'Permission Error: ('.$this->Conn->getErrorCode().') '.$this->Conn->getErrorMsg(); + $this->errorMessage = 'Permission Error: ('.$this->Conn->getErrorCode().') '.$this->Conn->getErrorMsg(); return false; } } @@ -743,7 +994,7 @@ */ function TableExists($tables) { - $prefix = $this->systemConfig['Database']['TablePrefix']; + $prefix = $this->toolkit->getSystemConfig('Database', 'TablePrefix'); $all_found = true; $tables = explode(',', $tables); @@ -759,86 +1010,6 @@ } /** - * Runs SQLs from file - * - * @param string $filename - * @param mixed $replace_from - * @param mixed $replace_to - */ - function RunSQL($filename, $replace_from = null, $replace_to = null) - { - if (!file_exists(FULL_PATH.$filename)) { - return ; - } - - $sqls = file_get_contents(FULL_PATH.$filename); - if (!$this->RunSQLText($sqls, $replace_from, $replace_to)) { - $this->Done(); - } - } - - /** - * Runs SQLs from string - * - * @param string $sqls - * @param mixed $replace_from - * @param mixed $replace_to - */ - function RunSQLText(&$sqls, $replace_from = null, $replace_to = null, $start_from=0) - { - $table_prefix = $this->systemConfig['Database']['TablePrefix']; - - // add prefix to all tables - if (strlen($table_prefix) > 0) { - $replacements = Array ('CREATE TABLE ', 'INSERT INTO ', 'UPDATE ', 'ALTER TABLE ', 'DELETE FROM ', 'REPLACE INTO '); - foreach ($replacements as $replacement) { - $sqls = str_replace($replacement, $replacement.$table_prefix, $sqls); - } - $sqls = str_replace('DROP TABLE ', 'DROP TABLE IF EXISTS '.$table_prefix, $sqls); - } - - if (isset($replace_from) && isset($replace_to)) { - // replace something additionally, e.g. module root category - $sqls = str_replace($replace_from, $replace_to, $sqls); - } - - $sqls = str_replace("\r\n", "\n", $sqls); // convert to linux line endings - $sqls = preg_replace("/#([^;]*?)\n/", '', $sqls); // remove all comments - $sqls = explode(";\n", $sqls . "\n"); // ensures that last sql won't have ";" in it - - for ($i=$start_from; $isystemConfig['Database']['DBCollation']) { - // it is CREATE TABLE statement -> add collation - $sql .= ' COLLATE \''.$this->systemConfig['Database']['DBCollation'].'\''; - } - - $this->Conn->Query($sql); - if ($this->Conn->getErrorCode() != 0) { - $this->errorMessage = 'Error: ('.$this->Conn->getErrorCode().') '.$this->Conn->getErrorMsg().'

Database Query:
'.htmlspecialchars($sql).'
'; - $this->LastQueryNum = $i+1; - return false; - } - } - return true; - } - - function ImportLanguage($lang_file) - { - $lang_file = FULL_PATH.$lang_file.'.lang'; - if (!file_exists($lang_file)) { - return ; - } - - $lang_xml =& $this->Application->recallObjectP('LangXML', null, Array(), false); // false - don't use temp tables - $lang_xml->Parse($lang_file, '|0|1|2|', ''); - } - - /** * Returns modules list found in modules folder * * @return Array @@ -859,34 +1030,19 @@ } // this is folder in MODULES_PATH directory if (file_exists($folder_path.'/install.php') && file_exists($folder_path.'/install/install_schema.sql')) { - $modules[] = $sub_folder; + $install_order = trim( file_get_contents($folder_path . '/install/install_order.txt') ); + $modules[$install_order] = $sub_folder; } } } } + // allows to control module install order + ksort($modules, SORT_NUMERIC); return $modules; } /** - * Converts module version in format X.Y.Z to signle integer - * - * @param string $version - * @return int - */ - function ConvertModuleVersion($version) - { - $parts = explode('.', $version); - - $bin = ''; - foreach ($parts as $part) { - $bin .= str_pad(decbin($part), 8, '0', STR_PAD_LEFT); - } - - return bindec($bin); - } - - /** * Returns list of modules, that can be upgraded * */ @@ -909,11 +1065,11 @@ } $to_version = end($regs[1]); - $this_version = $this->ConvertModuleVersion($module_info['Version']); - if ($this->ConvertModuleVersion($to_version) > $this_version) { + $this_version = $this->toolkit->ConvertModuleVersion($module_info['Version']); + if ($this->toolkit->ConvertModuleVersion($to_version) > $this_version) { // destination version is greather then current foreach ($regs[1] as $version) { - if ($this->ConvertModuleVersion($version) > $this_version) { + if ($this->toolkit->ConvertModuleVersion($version) > $this_version) { $from_version = $version; break; } @@ -924,7 +1080,7 @@ 'ToVersion' => $to_version, ); - $ret[$module_name] = array_merge_recursive2($module_info, $version_info); + $ret[ strtolower($module_name) ] = array_merge_recursive2($module_info, $version_info); } } @@ -1091,80 +1247,6 @@ return $ret; } - function ParseConfig($parse_section = false) - { - if (!file_exists($this->INIFile)) { - return Array(); - } - - if( file_exists($this->INIFile) && !is_readable($this->INIFile) ) { - die('Could Not Open Ini File'); - } - - $contents = file($this->INIFile); - - $retval = Array(); - $section = ''; - $ln = 1; - $resave = false; - foreach ($contents as $line) { - if ($ln == 1 && $line != '<'.'?'.'php die() ?'.">\n") { - $resave = true; - } - - $ln++; - $line = trim($line); - $line = eregi_replace(';[.]*','',$line); - if (strlen($line) > 0) { - //echo $line . " - "; - if(eregi('^[[a-z]+]$',str_replace(' ', '', $line))) { - //echo 'section'; - $section = mb_substr($line, 1, (mb_strlen($line) - 2)); - if ($parse_section) { - $retval[$section] = array(); - } - continue; - } elseif (eregi('=',$line)) { - //echo 'main element'; - list ($key, $val) = explode(' = ', $line); - if (!$parse_section) { - $retval[trim($key)] = str_replace('"', '', $val); - } - else { - $retval[$section][trim($key)] = str_replace('"', '', $val); - } - } - } - } - - if ($resave) { - $fp = fopen($this->INIFile, 'w'); - reset($contents); - fwrite($fp,'<'.'?'.'php die() ?'.">\n\n"); - foreach ($contents as $line) { - fwrite($fp,"$line"); - } - fclose($fp); - } - - return $retval; - } - - function SaveConfig() - { - $fp = fopen($this->INIFile, 'w'); - fwrite($fp,'<'.'?'.'php die() ?'.">\n\n"); - - foreach ($this->systemConfig as $section_name => $section_data) { - fwrite($fp, '['.$section_name."]\n"); - foreach ($section_data as $key => $value) { - fwrite($fp, $key.' = "'.$value.'"'."\n"); - } - fwrite($fp, "\n"); - } - fclose($fp); - } - /** * Installation error handler for sql errors * @@ -1197,11 +1279,4 @@ } } } - - /*function print_pre($s) - { - echo '
', print_r($s, true). '
'; - }*/ - - ?> \ No newline at end of file Index: branches/RC/core/admin_templates/js/forms.js =================================================================== diff -u -N -r10579 -r10832 --- branches/RC/core/admin_templates/js/forms.js (.../forms.js) (revision 10579) +++ branches/RC/core/admin_templates/js/forms.js (.../forms.js) (revision 10832) @@ -129,9 +129,9 @@ // if we got here, it means that we are closing window ilegally (through OS interace X button) // alert('closing window'); // we need to clear temp tables then - - window.opener.WatchClosing(window, _DropTempUrl); - + if (window.opener) { + window.opener.WatchClosing(window, _DropTempUrl); + } } }); Index: branches/RC/core/units/stylesheets/stylesheets_item.php =================================================================== diff -u -N -r10098 -r10832 --- branches/RC/core/units/stylesheets/stylesheets_item.php (.../stylesheets_item.php) (revision 10098) +++ branches/RC/core/units/stylesheets/stylesheets_item.php (.../stylesheets_item.php) (revision 10832) @@ -21,7 +21,7 @@ $ret .= $this->GetDBField('AdvancedCSS'); $compile_ts = adodb_mktime(); - $css_path = FULL_PATH.'/kernel/stylesheets/'; + $css_path = (defined('WRITEABLE') ? WRITEABLE : FULL_PATH . '/kernel') . '/stylesheets/'; $css_file = $css_path.mb_strtolower($this->GetDBField('Name')).'-'.$compile_ts.'.css'; Index: branches/RC/kernel/install/english.lang =================================================================== diff -u -N --- branches/RC/kernel/install/english.lang (revision 0) +++ branches/RC/kernel/install/english.lang (revision 10832) @@ -0,0 +1,2983 @@ + + m/d/Yg:i:s Am/d/Yg:i:s A.,iso-8859-12 + + WW91ciBwYXNzd29yZCBoYXMgYmVlbiByZXNldC4gWW91IHdpbGwgcmVjZWl2ZSB5b3VyIG5ldyBwYXNzd29yZCBpbiB0aGUgZW1haWwgc2hvcnRseS4= + QmxvY2sgU2hpcHBpbmcgQWRkcmVzcyBFZGl0aW5n + QWN0aXZl + QWRk + QWRkZWQ= + QWRkIFRv + QWRtaW5pc3RyYXRpdmUgQ29uc29sZQ== + QWxsb3cgZGVsZXRpbmcgTW9kdWxlIFJvb3QgQ2F0ZWdvcnk= + QWx3YXlz + YW5k + QWN0aXZl + QXV0aG9y + RGF0ZQ== + QXJ0aWNsZSBFeGNlcnB0 + SGl0cw== + UmF0aW5n + QXJ0aWNsZSByZXZpZXdlZA== + QXJ0aWNsZSBUaXRsZQ== + QXV0bw== + QXV0b21hdGlj + QXZhaWxhYmxlIENvbHVtbnM= + QmFja2dyb3VuZA== + QmFuIGVtYWlsIGFkZHJlc3M= + QmFuIElQIGFkZHJlc3M= + QmFuIHVzZXIgbmFtZQ== + SW1wb3J0ZWQ= + Qm9yZGVycw== + Q2hhbmdl + RG93bg== + VXA= + T0s= + Ynl0ZXM= + QnkgdGhlbWU= + Q2FuY2Vs + Q2F0ZWdvcnk= + RGF0ZQ== + TnVtYmVyIG9mIGRheXMgZm9yIGEgY2F0LiB0byBiZSBORVc= + Q2F0ZWdvcnkgRGVzY3JpcHRpb24= + RGVmYXVsdCBNRVRBIGRlc2NyaXB0aW9u + RGVmYXVsdCBNRVRBIEtleXdvcmRz + Q2F0ZWdvcnkgTmFtZQ== + TnVtYmVyIG9mIGNhdGVnb3JpZXMgcGVyIHBhZ2U= + Q2F0ZWdvcmllcyBQZXIgUGFnZSAoU2hvcnRsaXN0KQ== + UGljaw== + UG9wdWxhcml0eQ== + RGlzcGxheSBlZGl0b3IgUElDS3MgYWJvdmUgcmVndWxhciBjYXRlZ29yaWVz + QW5kIHRoZW4gYnk= + T3JkZXIgY2F0ZWdvcmllcyBieQ== + Q2xvc2U= + QWx0IFZhbHVl + Q2Vuc29yZWQgV29yZA== + Q3JlYXRlZCBPbg== + RGF0ZS9UaW1l + U3RhdHVz + TGFiZWw= + RmllbGQgTmFtZQ== + VHlwZQ== + SW1hZ2U= + SW5oZXJpdGVkIEZyb20= + SXRlbQ== + SXRlbSBGaWVsZA== + SXRlbSBUeXBl + SXRlbSBWYWx1ZQ== + Q29tcGFyaXNvbiBPcGVyYXRvcg== + TGluayBOYW1l + QWNjZXNz + SW5oZXJpdGVk + UG9zdGVy + UHJldmlldw== + UmVwbGFjZW1lbnQ= + UmVwbGllcw== + UnVsZSBUeXBl + U3RhdHVz + VG9waWM= + VVJM + U3RhdHVz + VmFsaWRhdGVkIE9u + VmFsdWU= + Vmlld3M= + Q29sb24= + QWNjZXNz + QWRkaXRpb25hbA== + QWRtaW4gSW50ZXJmYWNl + QmFzZWQgT24= + Q2F0ZWdvcnk= + Q2F0ZWdvcnkgTmFtZQ== + Q3JlYXRlZCBPbg== + RGVzY3JpcHRpb24= + RHVyYXRpb24= + RHVyYXRpb24gVHlwZQ== + RWZmZWN0aXZl + RW1haWw= + Jm5ic3A7 + RXZlbnQ= + RmllbGQgTmFtZQ== + Rmlyc3QgTmFtZQ== + R3JvdXAgTmFtZQ== + SUQ= + U3RhdHVz + SW1hZ2U= + VVJM + SW5oZXJpdGVk + SW5oZXJpdGVkIEZyb20= + UG9wdWxhcg== + UHJpbWFyeQ== + U3lzdGVt + S2V5d29yZA== + TGFiZWw= + TGFzdCBDaGFuZ2Vk + TGFzdCBDb21waWxlZA== + TGFzdCBOYW1l + TGluayBVUkw= + TmFtZQ== + TWVtYmVyc2hpcCBFeHBpcmVz + TW9kdWxl + TmFtZQ== + UGFjayBOYW1l + QWRk + RGVsZXRl + RWRpdA== + UGVybWlzc2lvbiBOYW1l + QWNjZXNz + Vmlldw== + VHlwZQ== + UHJldmlldw== + UHJpbWFyeSBHcm91cA== + UHJpbWFyeSBWYWx1ZQ== + RmllbGQgUHJvbXB0 + RGF0ZQ== + JA== + JQ== + UmVsYXRpb24gVHlwZQ== + UmV2aWV3ZWQgQnk= + UmV2aWV3IFRleHQ= + U2VsZWN0b3I= + U3RhdHVz + SXRlbQ== + SXRlbSBUeXBl + VGl0bGU= + VmFsdWU= + VHlwZQ== + VXNlciBDb3VudA== + RmllbGQgVmFsdWU= + VmVyc2lvbg== + VmlzaXQgRGF0ZQ== + Q29tbWE= + QXNjZW5kaW5n + RGF0ZQ== + RGVzY2VuZGluZw== + UmV2aWV3IFRleHQ= + UmV2aWV3IG5vdCBhZGRlZCBkdWUgdG8gYSBzeXN0ZW0gZXJyb3I= + QXV0by1SZWZyZXNoIEludGVydmFscyBmb3IgR3JpZHM= + QmFja3VwIFBhdGg= + U3dpdGNoIENhdGFsb2cgdGFicyBiYXNlZCBvbiBNb2R1bGU= + Q29tcGFueQ== + RGVmYXVsdCBDU1YgRXhwb3J0IERlbGltaXRlcg== + RGVmYXVsdCBDU1YgRXhwb3J0IEVuY2xvc3VyZSBDaGFyYWN0ZXI= + RGVmYXVsdCBDU1YgRXhwb3J0IEVuY29kaW5n + RGVmYXVsdCBDU1YgRXhwb3J0IE5ldyBMaW5lIFNlcGFyYXRvcg== + RGVmYXVsdCBSZWdpc3RyYXRpb24gQ291bnRyeQ== + RmlsZSBub3QgZm91bmQgKDQwNCkgdGVtcGxhdGU= + Rmlyc3QgRGF5IE9mIFdlZWs= + UmVkaXJlY3QgdG8gSFRUUCB3aGVuIFNTTCBpcyBub3QgcmVxdWlyZWQ= + RnVsbCBpbWFnZSBIZWlnaHQ= + RnVsbCBpbWFnZSBXaWR0aA== + SGVhZGVyIFNlcGFyYXRvciBUeXBl + TWF4aW11bSBudW1iZXIgb2YgaW1hZ2Vz + TmFtZQ== + SW5zdWZmaWNlbnQgcGVybWlzc2lvbnMgdGVtcGxhdGU= + R1pJUCBjb21wcmVzc2lvbiBsZXZlbCAwLTk= + UmV2aWV3cyBwZXIgcGFnZQ== + IlJlY3ljbGUgQmluIiBDYXRlZ29yeUlk + UmVnaXN0cmF0aW9uIE51bWJlcg== + UmVxdWlyZSBTU0wgZm9yIGxvZ2luICYgY2hlY2tvdXQ= + UmVtZW1iZXIgTGFzdCBBZG1pbiBUZW1wbGF0ZQ== + U2VydmVyIE5hbWU= + U2VydmVyIFBhdGg= + VGltZSB6b25lIG9mIHRoZSBzaXRl + U1NMIEZ1bGwgVVJMIChodHRwczovL3d3dy5kb21haW4uY29tL3BhdGgp + VGh1bWJuYWlsIEhlaWdodA== + VGh1bWJuYWlsIFdpZHRo + VGltZSB6b25lIG9mIHRoZSBzZXJ2ZXI= + VHJpbSBSZXF1aXJlZCBmaWVsZHM= + RW5hYmxlIENoYW5nZSBMb2cgKEJldGEp + VXNlIGNvbHVtbiBmcmVlemVy + RW5hYmxlIEhUTUwgR1pJUCBjb21wcmVzc2lvbg== + VXNlIFBhZ2VIaXQgY291bnRlcg== + VXNlIFNtYWxsIEhlYWRlcg== + VXNlIFRvb2xiYXIgTGFiZWxz + VXNlIEphdmFTY3JpcHQgcmVkaXJlY3Rpb24gYWZ0ZXIgbG9naW4vbG9nb3V0IChmb3IgSUlTKQ== + VXNlIE1PRCBSRVdSSVRF + RW5hYmxlIE1PRF9SRVdSSVRFIGZvciBTU0w= + V2Vic2l0ZSBhZGRyZXNz + V2Vic2l0ZSBuYW1l + V2ViIGFkZHJlc3M= + QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBzZWxlY3RlZCBFeHBvcnQgUHJlc2V0Pw== + VGhlIGNhdGVnb3J5IHRyZWUgbXVzdCBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIGxhdGVzdCBjaGFuZ2Vz + Q29udGludWU= + QXJ1YmE= + QWZnaGFuaXN0YW4= + QW5nb2xh + QW5ndWlsbGE= + QWxiYW5pYQ== + QW5kb3JyYQ== + TmV0aGVybGFuZHMgQW50aWxsZXM= + VW5pdGVkIEFyYWIgRW1pcmF0ZXM= + QXJnZW50aW5h + QXJtZW5pYQ== + QW1lcmljYW4gc2Ftb2E= + QW50YXJjdGljYQ== + RnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVz + QW50aWd1YSBhbmQgYmFyYnVkYQ== + QXVzdHJhbGlh + QXVzdHJpYQ== + QXplcmJhaWphbg== + QnVydW5kaQ== + QmVsZ2l1bQ== + QmVuaW4= + QnVya2luYSBGYXNv + QmFuZ2xhZGVzaA== + QnVsZ2FyaWE= + QmFocmFpbg== + QmFoYW1hcw== + Qm9zbmlhIGFuZCBIZXJ6ZWdvd2luYQ== + QmVsYXJ1cw== + QmVsaXpl + QmVybXVkYQ== + Qm9saXZpYQ== + QnJhemls + QmFyYmFkb3M= + QnJ1bmVpIERhcnVzc2FsYW0= + Qmh1dGFu + Qm91dmV0IElzbGFuZA== + Qm90c3dhbmE= + Q2VudHJhbCBBZnJpY2FuIFJlcHVibGlj + Q2FuYWRh + Q29jb3MgKEtlZWxpbmcpIElzbGFuZHM= + U3dpdHplcmxhbmQ= + Q2hpbGU= + Q2hpbmE= + Q290ZSBkJ0l2b2lyZQ== + Q2FtZXJvb24= + Q29uZ28sIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YgKFdhcyBaYWlyZSk= + Q29uZ28sIFBlb3BsZSdzIFJlcHVibGljIG9m + Q29vayBJc2xhbmRz + Q29sb21iaWE= + Q29tb3Jvcw== + Q2FwZSBWZXJkZQ== + Q29zdGEgUmljYQ== + Q3ViYQ== + Q2hyaXN0bWFzIElzbGFuZA== + Q2F5bWFuIElzbGFuZHM= + Q3lwcnVz + Q3plY2ggUmVwdWJsaWM= + R2VybWFueQ== + RGppYm91dGk= + RG9taW5pY2E= + RGVubWFyaw== + RG9taW5pY2FuIFJlcHVibGlj + QWxnZXJpYQ== + RWN1YWRvcg== + RWd5cHQ= + RXJpdHJlYQ== + V2VzdGVybiBTYWhhcmE= + U3BhaW4= + RXN0b25pYQ== + RXRoaW9waWE= + RmlubGFuZA== + RmlqaQ== + RmFsa2xhbmQgSXNsYW5kcyAoTWFsdmluYXMp + RnJhbmNl + RmFyb2UgSXNsYW5kcw== + TWljcm9uZXNpYSwgRmVkZXJhdGVkIFN0YXRlcyBvZg== + RnJhbmNlLCBNZXRyb3BvbGl0YW4= + R2Fib24= + VW5pdGVkIEtpbmdkb20= + R2VvcmdpYQ== + R2hhbmE= + R2licmFsdGFy + R3VpbmVh + R3VhZGVsb3VwZQ== + R2FtYmlh + R3VpbmVhLUJpc3NhdQ== + RXF1YXRvcmlhbCBHdWluZWE= + R3JlZWNl + R3JlbmFkYQ== + R3JlZW5sYW5k + R3VhdGVtYWxh + RnJlbmNoIEd1aWFuYQ== + R3VhbQ== + R3V5YW5h + SG9uZyBrb25n + SGVhcmQgYW5kIE1jIERvbmFsZCBJc2xhbmRz + SG9uZHVyYXM= + Q3JvYXRpYSAobG9jYWwgbmFtZTogSHJ2YXRza2Ep + SGFpdGk= + SHVuZ2FyeQ== + SW5kb25lc2lh + SW5kaWE= + QnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5 + SXJlbGFuZA== + SXJhbiAoSXNsYW1pYyBSZXB1YmxpYyBvZik= + SXJhcQ== + SWNlbGFuZA== + SXNyYWVs + SXRhbHk= + SmFtYWljYQ== + Sm9yZGFu + SmFwYW4= + S2F6YWtoc3Rhbg== + S2VueWE= + S3lyZ3l6c3Rhbg== + Q2FtYm9kaWE= + S2lyaWJhdGk= + U2FpbnQgS2l0dHMgYW5kIE5ldmlz + S29yZWEsIFJlcHVibGljIG9m + S3V3YWl0 + TGFvIFBlb3BsZSdzIERlbW9jcmF0aWMgUmVwdWJsaWM= + TGViYW5vbg== + TGliZXJpYQ== + TGlieWFuIEFyYWIgSmFtYWhpcml5YQ== + U2FpbnQgTHVjaWE= + TGllY2h0ZW5zdGVpbg== + U3JpIGxhbmth + TGVzb3Robw== + TGl0aHVhbmlh + THV4ZW1ib3VyZw== + TGF0dmlh + TWFjYXU= + TW9yb2Njbw== + TW9uYWNv + TW9sZG92YSwgUmVwdWJsaWMgb2Y= + TWFkYWdhc2Nhcg== + TWFsZGl2ZXM= + TWV4aWNv + TWFyc2hhbGwgSXNsYW5kcw== + TWFjZWRvbmlh + TWFsaQ== + TWFsdGE= + TXlhbm1hcg== + TW9uZ29saWE= + Tm9ydGhlcm4gTWFyaWFuYSBJc2xhbmRz + TW96YW1iaXF1ZQ== + TWF1cml0YW5pYQ== + TW9udHNlcnJhdA== + TWFydGluaXF1ZQ== + TWF1cml0aXVz + TWFsYXdp + TWFsYXlzaWE= + TWF5b3R0ZQ== + TmFtaWJpYQ== + TmV3IENhbGVkb25pYQ== + TmlnZXI= + Tm9yZm9sayBJc2xhbmQ= + TmlnZXJpYQ== + TmljYXJhZ3Vh + Tml1ZQ== + TmV0aGVybGFuZHM= + Tm9yd2F5 + TmVwYWw= + TmF1cnU= + TmV3IFplYWxhbmQ= + T21hbg== + UGFraXN0YW4= + UGFuYW1h + UGl0Y2Fpcm4= + UGVydQ== + UGhpbGlwcGluZXM= + UGFsYXU= + UGFwdWEgTmV3IEd1aW5lYQ== + UG9sYW5k + UHVlcnRvIFJpY28= + S29yZWEsIERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2Y= + UG9ydHVnYWw= + UGFyYWd1YXk= + UGFsZXN0aW5pYW4gVGVycml0b3J5LCBPY2N1cGllZA== + RnJlbmNoIFBvbHluZXNpYQ== + UWF0YXI= + UmV1bmlvbg== + Um9tYW5pYQ== + UnVzc2lhbiBGZWRlcmF0aW9u + UndhbmRh + U2F1ZGkgQXJhYmlh + U3VkYW4= + U2VuZWdhbA== + U2luZ2Fwb3Jl + U291dGggR2VvcmdpYSBhbmQgVGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHM= + U3QuIGhlbGVuYQ== + U3ZhbGJhcmQgYW5kIEphbiBNYXllbiBJc2xhbmRz + U29sb21vbiBJc2xhbmRz + U2llcnJhIExlb25l + RWwgU2FsdmFkb3I= + U2FuIE1hcmlubw== + U29tYWxpYQ== + U3QuIFBpZXJyZSBhbmQgTWlxdWVsb24= + U2FvIFRvbWUgYW5kIFByaW5jaXBl + U3VyaW5hbWU= + U2xvdmFraWEgKFNsb3ZhayBSZXB1YmxpYyk= + U2xvdmVuaWE= + U3dlZGVu + U3dhemlsYW5k + U2V5Y2hlbGxlcw== + U3lyaWFuIEFyYWIgUmVwdWJsaWM= + VHVya3MgYW5kIENhaWNvcyBJc2xhbmRz + Q2hhZA== + VG9nbw== + VGhhaWxhbmQ= + VGFqaWtpc3Rhbg== + VG9rZWxhdQ== + VHVya21lbmlzdGFu + RWFzdCBUaW1vcg== + VG9uZ2E= + VHJpbmlkYWQgYW5kIFRvYmFnbw== + VHVuaXNpYQ== + VHVya2V5 + VHV2YWx1 + VGFpd2Fu + VGFuemFuaWEsIFVuaXRlZCBSZXB1YmxpYyBvZg== + VWdhbmRh + VWtyYWluZQ== + VW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRz + VXJ1Z3VheQ== + VW5pdGVkIFN0YXRlcw== + VXpiZWtpc3Rhbg== + VmF0aWNhbiBDaXR5IFN0YXRlIChIb2x5IFNlZSk= + U2FpbnQgVmluY2VudCBhbmQgVGhlIEdyZW5hZGluZXM= + VmVuZXp1ZWxh + VmlyZ2luIElzbGFuZHMgKEJyaXRpc2gp + VmlyZ2luIElzbGFuZHMgKFUuUy4p + VmlldG5hbQ== + VmFudWF0dQ== + V2FsbGlzIGFuZCBGdXR1bmEgSXNsYW5kcw== + U2Ftb2E= + WWVtZW4= + WXVnb3NsYXZpYQ== + U291dGggQWZyaWNh + WmFtYmlh + WmltYmFid2U= + Q3JlYXRlZCBPbg== + Q3JlZGl0cw== + ZGF5cw== + RGVmYXVsdCBDb3VudHJ5 + QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgaXRlbShzKT8gVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS4= + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgSW4tQnVsbGV0aW4gc2V0dGluZ3M= + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgY2Vuc29yZWQgd29yZHMgYW5kIHRoZWlyIHJlcGxhY2VtZW50cw== + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgY3VzdG9tIGZpZWxkcw== + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgSW4tYnVsbHRlaW4gZW1haWwgc2V0dGluZ3M= + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2Ugc2ltbGV5cw== + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgSW4tYnVsbHRlaW4gb3V0cHV0IHNldHRpbmdz + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgSW4tYnVsbHRlaW4gZGVmYXVsdCBzZWFyY2ggc2V0dGluZ3M= + SW4tYnVsbGV0aW4gZ2VuZXJhbCBjb25maWd1cmF0aW9uIG9wdGlvbnM= + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgSW4tbGluayBzZXR0aW5ncw== + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgY3VzdG9tIGZpZWxkcw== + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgZW1haWwgZXZlbnRz + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgSW4tbGluayBvdXRwdXQgc2V0dGluZ3M= + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2Ugc2VhcmNoIHNldHRpbmdzIGFuZCBmaWVsZHM= + SW4tTGluayBHZW5lcmFsIENvbmZpZ3VyYXRpb24gT3B0aW9ucw== + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBydW4gdmFsaWRhdGlvbiBvbiB0aGUgbGlua3M= + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgSW4tbmV3eiBzZXR0aW5ncw== + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgSW4tbmV3eiBjdXN0b20gZmllbGRz + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgSW4tbmV3eiBlbWFpbCBjb25maWd1cmF0aW9u + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgSW4tbmV3eiBvdXRwdXQgc2V0dGluZ3M= + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgSW4tbmV3eiBkZWZhdWx0IHNlYXJjaCBjb25maWd1cmF0aW9u + SW4tTmV3eiBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucw== + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBpbnN0YWxsIG5ldyBtb2R1bGVz + VGhpcyBzZWN0aW9uIGFsbG93cyB5b3UgdG8gbWFuYWdlIGNhdGVnb3JpZXMgYW5kIGl0ZW1zIGFjcm9zcyBhbGwgY2F0ZWdvcmllcw== + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBwZXJmb3JtIHN5c3RlbSBiYWNrdXBz + VGhpcyBzZWN0aW9uIGFsbG93cyB5b3UgdG8gYnJvd3NlIHRoZSBjYXRhbG9nIGFuZCBtYW5hZ2UgY2F0ZWdvcmllcyBhbmQgaXRlbXM= + VGhpcyBzZWN0aW9uIGFsbG93cyB5b3UgdG8gY29uZmlndXJlIGNhdGVnb3J5IGN1c3RvbSBmaWVsZHM= + Q29uZmlndXJlIENhdGVnb3J5IEVtYWlsIEV2ZW50cw== + Q29uZmlndXJlIENhdGVnb3J5IHNlYXJjaCBvcHRpb25z + VGhpcyBzZWN0aW9uIGFsbG93cyB5b3UgdG8gY29uZmlndXJlIGdlbmVyYWwgY2F0ZWdvcnkgc2V0dGluZ3M= + VGhpcyBpcyBhIGdlbmVyYWwgY29uZmd1cmF0aW9uIHNlY3Rpb24= + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgcmVnaW9uYWwgc2V0dGluZ3MsIG1hbmFnZSBhbmQgZWRpdCBsYW5ndWFnZXM= + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgQ1NTIHN0eWxlc2hlZXRzIGZvciB0aGVtZXMu + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYW5hZ2UgdGhlbWVzIGFuZCBlZGl0IHRoZSBpbmRpdmlkdWFsIHRlbXBsYXRlcw== + VGhpcyBzZWN0aW9uIGFsbG93cyB5b3UgdG8gY29uZmlndXJlIGdlbmVyYWwgdXNlciBzZXR0aW5ncw== + VGhpcyBzZWN0aW9uIHNob3dzIGFsbCBlLW1haWxzIHNlbnQgYnkgSW4tUG9ydGFs + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBleHBvcnQgSW4tcG9ydGFsIGRhdGE= + SGVscCBzZWN0aW9uIGZvciBJbi1wb3J0YWwgYW5kIGFsbCBvZiBpdHMgbW9kdWxlcy4gQWxzbyBhY2Nlc3NpYmxlIHZpYSB0aGUgc2VjdGlvbi1zcGVjaWZpYyBpbnRlcmFjdGl2ZSBoZWxwIGZlYXR1cmUu + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBpbXBvcnQgZGF0YSBmcm9tIG90aGVyIHByb2dyYW1zIGludG8gSW4tcG9ydGFs + VGhpcyBzZWN0aW9uIHNob3dzIHN1bW1hcnkgc3RhdGlzdGljcw== + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBwZXJmb3JtIGRhdGEgaW1wb3J0IGZyb20gb3RoZXIgc3lzdGVtcw== + TWFuYWdlIHN0YXR1cyBvZiBhbGwgbW9kdWxlcyB3aGljaCBhcmUgaW5zdGFsbGVkIG9uIHlvdXIgSW4tcG9ydGFsIHN5c3RlbS4= + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBlbmFibGVkIGFuZCBkaXNhYmxlIG1vZHVsZXM= + VmlldyBzeXN0ZW0gc3RhdGlzdGljcywgbG9ncyBhbmQgcmVwb3J0cw== + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBwZXJmb3JtIGRhdGFiYXNlIHJlc3RvcmVz + VGhpcyBzZWN0aW9uIGRpc3BsYXlzIGEgbGlzdCBvZiBhbGwgcmV2aWV3cyBpbiB0aGUgc3lzdGVtLg== + VGhpcyBzZWN0aW9uIHNob3dzIHRoZSBzZWFyY2ggbG9nIGFuZCBhbGxvd3MgdG8gbWFuYWdlIGl0 + VGhpcyBzZWN0aW9uIGFsbG93cyB0byB2aWV3IFBIUCBjb25maWd1cmF0aW9u + VGhpcyBzZWN0aW9uIHNob3dzIGFsbCBhY3RpdmUgc2Vzc2lvbnMgYW5kIGFsbG93cyB0byBtYW5hZ2UgdGhlbQ== + TWFuYWdlIHRoZSBzdHJ1Y3R1cmUgb2YgeW91ciBzaXRlLCBpbmNsdWRpbmcgY2F0ZWdvcmllcywgaXRlbXMgYW5kIGNhdGVnb3J5IHNldHRpbmdzLg== + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBwZXJmb3JtIGRpcmVjdCBTUUwgcXVlcmllcyBvbiBJbi1wb3J0YWwgZGF0YWJhc2U= + TWFuYWdlIHN5c3RlbS13aWRlIHNldHRpbmdzLCBlZGl0IHRoZW1lcyBhbmQgbGFuZ3VhZ2Vz + VGhpcyBzZWN0aW9uIHNob3dzIGF2YWlsYWJsZSB0YWdzIGZvciB1c2luZyBpbiB0ZW1wbGF0ZXM= + VXNlIHZhcmlvdXMgSW4tcG9ydGFsIGRhdGEgbWFuYWdlbWVudCB0b29scywgaW5jbHVkaW5nIGJhY2t1cCwgcmVzdG9yZSwgaW1wb3J0IGFuZCBleHBvcnQ= + TWFuYWdlIHVzZXJzIGFuZCBncm91cHMsIHNldCB1c2VyICYgZ3JvdXAgcGVybWlzc2lvbnMgYW5kIGRlZmluZSB1c2VyIHNldHRpbmdzLg== + TWFuYWdlIFVzZXIgQmFuIFJ1bGVz + VGhpcyBzZWN0aW9uIGFsbG93cyB5b3UgdG8gY29uZmlndXJlIHVzZXIgY3VzdG9tIGZpZWxkcw== + Q29uZmlndXJlIFVzZXIgZW1haWwgZXZlbnRz + VGhpcyBzZWN0aW9uIGFsbG93cyB0byBtYWdhbmUgZ3JvdXBzLCBhc3NpZ24gdXNlcnMgdG8gZ3JvdXBzIGFuZCBwZXJmb3JtIG1hc3MgZW1haWwgc2VuZGluZw== + VGhpcyBzZWN0aW9ucyBhbGxvd3MgdG8gbWFuYWdlIHVzZXJzLCB0aGVpciBwZXJtaXNzaW9ucyBhbmQgcGVyZm9ybSBtYXNzIGVtYWls + VGhpcyBzZWN0aW9uIHNob3dzIHRoZSBzaXRlIHZpc2l0b3JzIGxvZw== + RGlzYWJsZWQ= + RG91YmxlLXF1b3Rlcw== + RG93bmxvYWQgRXhwb3J0IEZpbGU= + RG93bmxvYWQgTGFuZ3VhZ2UgRXhwb3J0 + WW91IGhhdmUgbm90IHNhdmVkIGNoYW5nZXMgdG8gdGhlIGl0ZW0geW91IGFyZSBlZGl0aW5nITxiciAvPkNsaWNrIE9LIHRvIGxvb3NlIGNoYW5nZXMgYW5kIGdvIHRvIHRoZSBzZWxlY3RlZCBzZWN0aW9uPGJyIC8+b3IgQ2FuY2VsIHRvIHN0YXkgaW4gdGhlIGN1cnJlbnQgc2VjdGlvbi4= + RmlsZSBpcyBlbXB0eQ== + IA== + RmlsZSBpcyBlbXB0eQ== + RW5hYmxlZA== + Q2FuJ3Qgc2F2ZSBhIGZpbGU= + RXJyb3IgY29weWluZyBzdWJjYXRlZ29yaWVz + Q3VzdG9tIGZpZWxkIHdpdGggaWRlbnRpY2FsIG5hbWUgYWxyZWFkeSBleGlzdHM= + VXNlcm5hbWUgeW91IGhhdmUgZW50ZXJlZCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3lzdGVtLCBwbGVhc2UgY2hvb3NlIGFub3RoZXIgdXNlcm5hbWUu + RmlsZSBpcyB0b28gbGFyZ2U= + SW52YWxpZCBGaWxlIEZvcm1hdA== + aW52YWxpZCBvcHRpb24= + RXJyb3IgbW92aW5nIHN1YmNhdGVnb3J5 + UGFzc3dvcmRzIGRvIG5vdCBtYXRjaCE= + cmVxdWlyZWQgY29sdW1ucyBtaXNzaW5n + Um9vdCBjYXRlZ29yeSBvZiB0aGUgbW9kdWxlKHMpIGNhbiBub3QgYmUgZGVsZXRlZCE= + Q2F0ZWdvcnkgZmllbGQgbm90IHVuaXF1ZQ== + VW5rbm93biBjYXRlZ29yeQ== + dXNlciBub3QgZm91bmQ= + SW5jb3JyZWN0IGRhdGUgZm9ybWF0LCBwbGVhc2UgdXNlICglcykgZXguICglcyk= + SW5jb3JyZWN0IGRhdGEgZm9ybWF0LCBwbGVhc2UgdXNlICVz + SW52YWxpZCBGb3JtYXQ= + RmllbGQgaXMgb3V0IG9mIHJhbmdl + RmllbGQgaXMgcmVxdWlyZWQ= + RmllbGQgdmFsdWUgbXVzdCBiZSB1bmlxdWU= + RmllbGQgaXMgb3V0IG9mIHJhbmdlLCBwb3NzaWJsZSB2YWx1ZXMgZnJvbSAlcyB0byAlcw== + QWRkIEFydGljbGU= + QXBwcm92ZSBBcnRpY2xl + RGVjbGluZSBBcnRpY2xl + TW9kaWZ5IEFydGljbGU= + QXBwcm92ZSBBcnRpY2xlIE1vZGlmaWNhdGlvbg== + RGVjbGluZSBBcnRpY2xlIE1vZGlmaWNhdGlvbg== + QXJ0aWNsZSBSZXZpZXcgQWRkZWQ= + UGVuZGluZyBBcnRpY2xlIFJldmlldyBBZGRlZA== + QXBwcm92ZSBBcnRpY2xlIFJldmlldw== + RGVjbGluZSBBcnRpY2xlIFJldmlldw== + QWRkIENhdGVnb3J5 + QWRkIFBlbmRpbmcgQ2F0ZWdvcnk= + QXBwcm92ZSBDYXRlZ29yeQ== + RGVueSBDYXRlZ29yeQ== + TW9kaWZ5IENhdGVnb3J5 + RGVsZXRlIENhdGVnb3J5 + Q29tbW9uIEZvb3RlciBUZW1wbGF0ZQ== + RW1haWwgZXZlbnRzIGltcG9ydCBwcm9ncmVzcw== + QWRkIExpbms= + QWRkIFBlbmRpbmcgTGluaw== + QXBwcm92ZSBQZW5kaW5nIExpbms= + RGVueSBMaW5r + TW9kaWZ5IExpbms= + QXBwcm92ZSBMaW5rIE1vZGlmaWNhdGlvbg== + RGVjbGluZSBsaW5rIG1vZGlmaWNhdGlvbg== + TGluayBNb2RpZmljYXRpb24gUGVuZGluZw== + TGluayBSZXZpZXcgQWRkZWQ= + UGVuZGluZyBSZXZpZXcgQWRkZWQ= + QXBwcm92ZSBMaW5rIFJldmlldw== + RGVjbGluZSBMaW5rIFJldmlldw== + TmV3IFByaXZhdGUgTWVzc2FnZQ== + UG9zdCBBZGRlZA== + UG9zdCBNb2RpZmllZA== + VG9waWMgQWRkZWQ= + QWRkIFVzZXI= + QWRkIFBlbmRpbmcgVXNlcg== + QXBwcm92ZSBVc2Vy + RGVueSBVc2Vy + Rm9yZ290IFBhc3N3b3Jk + TWVtYmVyc2hpcCBleHBpcmF0aW9uIG5vdGljZQ== + TWVtYmVyc2hpcCBleHBpcmVk + UGFzc3dvcmQgQ29uZmlybWF0aW9u + VXNlciBzdWJzY3JpYmVk + U3VnZ2VzdCB0byBhIGZyaWVuZA== + VXNlciB1bnN1YnNjcmliZWQ= + VmFsaWRhdGUgVXNlcg== + RXhwb3J0IGZvbGRlciBpcyBub3Qgd3JpdGFibGU= + RmllbGQ= + RGlzcGxheSBPcmRlcg== + QWRkcmVzcyBMaW5l + QWRtaW4gSW50ZXJmYWNl + QWR2YW5jZWQgQ1NT + QWx0IFZhbHVl + QXNzaWduZWQgQ291cG9u + QXR0YWNobWVudA== + QXV0b21hdGljIEZpbGVuYW1l + QXZhaWxhYmxlIENvbHVtbnM= + QmFja2dyb3VuZA== + QmFja2dyb3VuZCBBdHRhY2htZW50 + QmFja2dyb3VuZCBDb2xvcg== + QmFja2dyb3VuZCBJbWFnZQ== + QmFja2dyb3VuZCBQb3NpdGlvbg== + QmFja2dyb3VuZCBSZXBlYXQ= + Qm9yZGVyIEJvdHRvbQ== + Qm9yZGVyIExlZnQ= + Qm9yZGVyIFJpZ2h0 + Qm9yZGVycw== + Qm9yZGVyIFRvcA== + Q2F0ZWdvcnk= + QXV0b21hdGljIERpcmVjdG9yeSBOYW1l + RGlyZWN0b3J5IE5hbWU= + Q2F0ZWdvcnkgRm9ybWF0 + Q2F0ZWdvcnkgSUQ= + Q2F0ZWdvcnkgc2VwYXJhdG9y + Q2F0ZWdvcnkgVGVtcGxhdGU= + Q2hhcnNldA== + Q2hlY2sgRHVwbGljYXRlcyBieQ== + Q29tcGFueQ== + Q29weSBMYWJlbHMgZnJvbSB0aGlzIExhbmd1YWdl + Q3JlYXRlZCBCeQ== + Q3JlYXRlZCBPbg== + Q3Vyc29y + Q3VzdG9tIERldGFpbHMgVGVtcGxhdGU= + DQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KRGV0YWlscyBUZW1wbGF0ZQ== + RGF0ZSBGb3JtYXQ= + RGVjaW1hbCBQb2ludA== + RGVzY3JpcHRpb24= + RGlzcGxheQ== + QXMgUGxhaW4gVGV4dA== + RHVyYXRpb24= + RWRpdG9ycyBQaWNr + RWxhcHNlZCBUaW1l + RW5hYmxlZA== + RXN0aW1hdGVkIFRpbWU= + RXhwaXJl + RXhwb3J0IGNvbHVtbnM= + RXhwb3J0IEZpbGVuYW1l + RXhwb3J0IGZvcm1hdA== + RXhwb3J0IE1vZHVsZXM= + RXhwb3J0IFBocmFzZSBUeXBlcw== + RXhwb3J0IFByZXNldCBUaXRsZQ== + RXhwb3J0IFByZXNldA== + U2F2ZS9VcGRhdGUgRXhwb3J0IFByZXNldA== + RXh0ZXJuYWwgVVJM + RXh0cmEgSGVhZGVycw== + RmF4 + RmllbGRzIGVuY2xvc2VkIGJ5 + RmllbGRzIHNlcGFyYXRlZCBieQ== + RmllbGQgVGl0bGVz + RmlsZW5hbWU= + Rmlyc3QgTmFtZQ== + Rm9udA== + Rm9udCBDb2xvcg== + Rm9udCBGYW1pbHk= + Rm9udCBTaXpl + Rm9udCBTdHlsZQ== + Rm9udCBXZWlnaHQ= + SUQ= + R3JvdXAgTmFtZQ== + SGVpZ2h0 + SGl0cw== + SG90 + SFRNTCBWZXJzaW9u + SWNvbiBVUkw= + SUQ= + SW1hZ2UgSUQ= + SW1wb3J0IENhdGVnb3J5 + SW1wb3J0IEZpbGVuYW1l + SW5jbHVkZSBmaWVsZCB0aXRsZXM= + SW5wdXQgRGF0ZSBGb3JtYXQ= + SW5wdXQgVGltZSBGb3JtYXQ= + SW5zdGFsbCBNb2R1bGVz + SW5zdGFsbCBQaHJhc2UgVHlwZXM= + VXNlIGN1cnJlbnQgY2F0ZWdvcnkgYXMgcm9vdCBmb3IgdGhlIGV4cG9ydA== + VXNlIGFzIEZyZWUgUHJvbW8gU2hpcHBpbmc= + UHJpbWFyeQ== + SXMgU3lzdGVt + SXRlbSBUZW1wbGF0ZQ== + TGFuZ3VhZ2UgRmlsZQ== + TGFuZ3VhZ2UgSUQ= + TGFzdCBOYW1l + TGVmdA== + TGluZSBlbmRpbmdz + TGluZSBFbmRpbmdzIEluc2lkZSBGaWVsZHM= + TG9jYWwgTmFtZQ== + TG9jYXRpb24= + TG9nbw== + TWFyZ2luIEJvdHRvbQ== + TWFyZ2luIExlZnQ= + TWFyZ2luIFJpZ2h0 + TWFyZ2lucw== + TWFyZ2luIFRvcA== + TWF4aW11bSBudW1iZXIgb2YgQ2F0ZWdvcmllcyBvbiBJdGVtIGNhbiBiZSBhZGRlZCB0bw== + Q3VzdG9tIE1lbnUgSWNvbiAoaWUuIGltZy9tZW51X3Byb2R1Y3RzLmdpZik= + TWVzc2FnZSBCb2R5 + TWVzc2FnZSBUeXBl + TW9kaWZpZWQ= + TW9kdWxl + TXVsdGlsaW5ndWFs + TmFtZQ== + TmV3 + UGFjayBOYW1l + UGFkZGluZyBCb3R0b20= + UGFkZGluZyBMZWZ0 + UGFkZGluZyBSaWdodA== + UGFkZGluZ3M= + UGFkZGluZyBUb3A= + UGVyY2VudHMgQ29tcGxldGVk + TGFiZWw= + UGhyYXNlIFR5cGU= + UG9w + UG9wdWxhcg== + UG9zaXRpb24= + UHJpbWFyeQ== + UHJpbWFyeSBDYXRlZ29yeQ== + UHJpbWFyeQ== + UHJpbWFyeSBUcmFuc2xhdGlvbg== + UHJpb3JpdHk= + TWluaW11bSBxdWFudGl0eSBmb3IgRnJlZSBTaGlwcGluZw== + UmF0aW5n + S2V5d29yZA== + UmVsYXRpb24gSUQ= + VHlwZQ== + UmVtb3RlIFVSTA== + UmVwbGFjZSBEdXBsaWNhdGVz + UmV2aWV3IElE + UmV2aWV3IFRleHQ= + U2FtZSBBcyBUaHVtYg== + QmFzZWQgT24= + U3R5bGU= + U2VsZWN0b3IgSUQ= + U2VsZWN0b3IgTmFtZQ== + U2tpcCBGaXJzdCBSb3c= + U3RhdHVz + U3R5bGVzaGVldCBJRA== + U3ViamVjdA== + UG9pbnRzIHRvIENhdGVnb3J5 + SXRlbQ== + VGV4dCBBbGlnbg== + VGV4dCBEZWNvcmF0aW9u + VGV4dCBWZXJzaW9u + VGhvdXNhbmRzIFNlcGFyYXRvcg== + VGltZSBGb3JtYXQ= + VGl0bGU= + VG8= + VG9w + VmFsdWU= + TWVhc3VyZXMgU3lzdGVt + VXBsb2FkIEZpbGUgRnJvbSBMb2NhbCBQQw== + VVJM + TGluayB0byBFeHRlcm5hbCBVUkw= + VXNlIEN1c3RvbSBNZW51IEljb24= + VmVyc2lvbg== + VmlzaWJpbGl0eQ== + Vm90ZXM= + V2lkdGg= + Wi1JbmRleA== + Rm9udCBQcm9wZXJ0aWVz + RnJvbSBEYXRl + RnJvbnQgZW5k + Z2lnYWJ5dGUocyk= + VGhpcyBoZWxwIHNlY3Rpb24gZG9lcyBub3QgeWV0IGV4aXN0LCBpdCdzIGNvbWluZyBzb29uIQ== + aHRtbA== + SUQgRmllbGQ= + SW1wb3J0aW5nIEVtYWlsIEV2ZW50cyAuLi4= + SW1wb3J0aW5nIExhbmd1YWdlcyAuLi4= + SW1wb3J0aW5nIFBocmFzZXMgLi4u + RW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCB1bmRvIGFueSBjaGFuZ2VzIHlvdSBoYXZlIG1hZGUgdG8gZXhpc3RpbmcgcGhyYXNlcw== + SW1wb3J0aW5nIFBocmFzZXM= + SW4tbGluaw== + SW52YWxpZCBFLU1haWw= + SW5jb3JyZWN0IGRhdGEgZm9ybWF0LCBwbGVhc2UgdXNlIGludGVnZXI= + TWlzc2luZyBvciBpbnZhbGlkIEluLVBvcnRhbCBMaWNlbnNl + SW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZA== + SW52YWxpZCBzdGF0ZQ== + Q2F0ZWdvcmllcw== + TGlua3M= + QXJ0aWNsZXM= + VG9waWNz + SzQgQWR2YW5jZWQgVmlldw== + SzQgQ2F0YWxvZw== + S0I= + TGFuZ3VhZ2U= + SW1wb3J0IHByb2dyZXNz + TGFzdCBVcGRhdGVk + RGF0ZQ== + TGluayBEZXNjcmlwdGlvbg== + RGlzcGxheSBlZGl0b3IgUElDS3MgYWJvdmUgcmVndWxhciBsaW5rcw== + SGl0cw== + TGluayBOYW1l + TnVtYmVyIG9mIGRheXMgZm9yIGEgbGluayB0byBiZSBORVc= + TnVtYmVyIG9mIGxpbmtzIHBlciBwYWdl + TnVtYmVyIG9mIGxpbmtzIHBlciBwYWdlIG9uIGEgc2hvcnQgbGlzdGluZw== + UmF0aW5n + TGluayByZXZpZXdlZA== + QW5kIHRoZW4gYnk= + T3JkZXIgbGlua3MgYnk= + YW5kIHRoZW4gYnk= + U29ydCByZXZpZXdzIGJ5 + VVJM + RGlzcGxheSBsaW5rIFVSTCBpbiBzdGF0dXMgYmFy + TGludXggKG4p + TG9jYWwgSW1hZ2U= + TG9nZ2VkIGluIGFz + TG9naW4= + KEdNVCk= + KEdNVCAtMDE6MDAp + KEdNVCAtMTA6MDAp + KEdNVCAtMTE6MDAp + KEdNVCAtMTI6MDAp + KEdNVCAtMDI6MDAp + KEdNVCAtMDM6MDAp + KEdNVCAtMDQ6MDAp + KEdNVCAtMDU6MDAp + KEdNVCAtMDY6MDAp + KEdNVCAtMDc6MDAp + KEdNVCAtMDg6MDAp + KEdNVCAtMDk6MDAp + TWFyZ2lucw== + TUI= + R3JvdXAgTWVtYmVyc2hpcCBFeHBpcmF0aW9uIFJlbWluZGVyIChkYXlzKQ== + TWFpbiBNZW51 + TWV0cmlj + TWlzc2luZyBJbiBUaGVtZQ== + Q2F0ZWdvcnkgcGF0aCBpbiBvbmUgZmllbGQ= + TW9kdWxlIG5vdCBsaWNlbnNlZA== + TW9uZGF5 + TmV2ZXI= + TmV2ZXIgRXhwaXJlcw== + TmV3 + TnVtYmVyIG9mIGRheXMgdG8gYXJjaGl2ZSBhcnRpY2xlcyBhdXRvbWF0aWNhbGx5 + RGlzcGxheSBlZGl0b3IgUElDS3MgYWJvdmUgcmVndWxhciBhcnRpY2xlcw== + TnVtYmVyIG9mIGRheXMgZm9yIGEgYXJ0aWNsZSB0byBiZSBORVc= + TnVtYmVyIG9mIGFydGljbGVzIHBlciBwYWdl + QXJ0aWNsZXMgUGVyIFBhZ2UgKFNob3J0bGlzdCk= + QW5kIHRoZW4gYnk= + T3JkZXIgYXJ0aWNsZXMgYnk= + QW5kIHRoZW4gYnk= + U29ydCByZXZpZXdzIGJ5 + TmV4dCBjYXRlZ29yeQ== + TmV4dCBncm91cA== + TmV4dCBVc2Vy + Tm8= + Tm9uZQ== + Tm8gU3ViamVjdA== + Tm8gdG9waWNz + TnVtYmVyIG9mIFBvc3Rz + b2Y= + T2Zm + T24= + T25lIFdheQ== + ZGF5KHMp + aG91cihzKQ== + bWludXRlKHMp + bW9udGgocyk= + c2Vjb25kKHMp + d2VlayhzKQ== + eWVhcihzKQ== + T3JpZ2luYWwgVmFsdWVz + T3JpZ2luYWwgVmFsdWU= + T3JpZ2luYWwgVmFsdWVz + T3RoZXIgRmllbGRz + KEdNVCArMDE6MDAp + KEdNVCArMTA6MDAp + KEdNVCArMTE6MDAp + KEdNVCArMTI6MDAp + KEdNVCArMTM6MDAp + KEdNVCArMDI6MDAp + KEdNVCArMDM6MDAp + KEdNVCArMDQ6MDAp + KEdNVCArMDU6MDAp + KEdNVCArMDY6MDAp + KEdNVCArMDc6MDAp + KEdNVCArMDg6MDAp + KEdNVCArMDk6MDAp + UGFkZGluZ3M= + UGFnZQ== + VG8gY2hhbmdlIHRoZSBwYXNzd29yZCwgZW50ZXIgdGhlIHBhc3N3b3JkIGhlcmUgYW5kIGluIHRoZSBib3ggYmVsb3c= + UGVuZGluZw== + UGVyZm9ybWluZyBCYWNrdXA= + UGVyZm9ybWluZyBFeHBvcnQ= + UGVyZm9ybWluZyBJbXBvcnQ= + UGVyZm9ybWluZyBSZXN0b3Jl + QWxsb3dzIGFjY2VzcyB0byB0aGUgQWRtaW5pc3RyYXRpb24gdXRpbGl0eQ== + UmVhZC1Pbmx5IEFjY2VzcyBUbyBEYXRhYmFzZQ== + Q2F0ZWdvcmllcw== + TGlua3M= + QXJ0aWNsZXM= + VG9waWNz + UGVybWlzc2lvbiBUeXBlIEFkbWlu + QWRtaW5pc3RyYXRpb24= + UGVybWlzc2lvbiBUeXBlIEZyb250IEVuZA== + RnJvbnQgRW5k + Tm90IFRyYW5zbGF0ZWQ= + VHJhbnNsYXRlZA== + QWRtaW4= + Qm90aA== + RnJvbnQ= + RWRpdG9yJ3MgcGljaw== + U2VsZWN0ZWQgQ29sdW1ucw== + UG9w + UG9zaXRpb24gQW5kIFZpc2liaWxpdHk= + TmV3IHBvc3RzIChkYXlzKQ== + TnVtYmVyIG9mIHBvc3RzIHBlciBwYWdl + UG9zdHM= + UHJldmlvdXMgY2F0ZWdvcnk= + UHJldmlvdXMgZ3JvdXA= + UHJldmlvdXMgVXNlcg== + UHJpbWFyeQ== + QWN0aXZlIEFydGljbGVz + QWN0aXZlIENhdGVnb3JpZXM= + QWN0aXZlIExpbmtz + QWN0aXZlIFRvcGljcw== + QWN0aXZlIFVzZXJz + QWRkIE1vZHVsZQ== + U2VudCBUbw== + QWRtaW4gZ3JvdXA= + TWVzc2FnZXMgZnJvbSBTaXRlIEFkbWluIGFyZSBmcm9t + QWR2YW5jZWQgU2VhcmNo + QWxsb3cgcGFzc3dvcmQgcmVzZXQgYWZ0ZXI= + QWxsIHRlbXBsYXRlcw== + QWx0IHZhbHVl + QXBwbHlpbmcgQmFuIExpc3QgdG8gRXhpc3RpbmcgVXNlcnMuLg== + Q29udGludWUgdG8gcmVzdG9yZSBhdCBteSBvd24gcmlzaz8= + QXJjaGl2ZWQ= + QXJjaGl2YXRpb24gRGF0ZQ== + QXZlcmFnZSBSYXRpbmcgb2YgQXJ0aWNsZXM= + QXJ0aWNsZSBCb2R5 + QXJ0aWNsZSBFeGNlcnB0 + QXJ0aWNsZSBFeGNlcnB0 + VG90YWwgQXJ0aWNsZSBSZXZpZXdz + QWN0aXZlIEFydGljbGVz + QXJjaGl2ZWQgQXJ0aWNsZXM= + UGVuZGluZyBBcnRpY2xlcw== + VG90YWwgQXJ0aWNsZXM= + QXR0YWNobWVudA== + QXR0ZW50aW9uIQ== + QXV0aG9y + R2VuZXJhdGUgZnJvbSB0aGUgYXJ0aWNsZSBib2R5 + QXV0b21hdGljIERpcmVjdG9yeSBOYW1l + QXV0b21hdGljIEZpbGVuYW1l + TW9kdWxlcw== + QmFjayBVcCBEYXRl + QmFja3VwIFBhdGg= + QmFja3VwIHN0YXR1cw== + QmFubmVkIFVzZXJz + RGF0ZSBvZiBCaXJ0aA== + Q2FjaGUgVGltZW91dCAoc2Vjb25kcyk= + RWRpdG9yJ3MgUGljayBDYXRlZ29yaWVz + Q2F0ZWdvcnkgSUQ= + Q2F0ZWdvcnkgTGVhZCBTdG9yeSBBcnRpY2xlcw== + Q2F0ZWdvcnkgUGVybWlzc2lvbnM= + Q2F0ZWdvcnkgTGVhZCBTdG9yeQ== + Q2Vuc29yc2hpcCBJZA== + Q2Vuc29yc2hpcCBXb3Jk + Q2hhcnNldA== + Q2l0eQ== + Q29tbWVudHM= + Q29udGludWU= + Q29weSBMYWJlbHMgZnJvbSB0aGlzIExhbmd1YWdl + Q291bnRyeQ== + Q3JlYXRlZCBieQ== + Q3JlYXRlZCBvbg== + Q3JlYXRlZCBhdA== + Q3VycmVudCBTZXNzaW9ucw== + Q3VzdG9tIEZpbGVuYW1l + RGF0YWJhc2UgU2V0dGluZ3M= + VG90YWwgU2l6ZSBvZiB0aGUgRGF0YWJhc2U= + KG1tLWRkLXl5eXkp + U2VydmVyIERhdGFiYXNl + U2VydmVyIFBhc3N3b3Jk + RGF0YWJhc2UgVXNlciBOYW1l + RGVjaW1hbCBQb2ludA== + RGVmYXVsdA== + RGVsZXRl + RGVzY3JpcHRpb24= + RGlyZWN0b3J5IE5hbWU= + RGlzYWJsZWQgQXJ0aWNsZXM= + RGlzYWJsZWQgQ2F0ZWdvcmllcw== + RGlzYWJsZWQgTGlua3M= + RGlzcGxheSBPcmRlcg== + RG93bmxvYWQgTGFuZ3VhZ2UgRXhwb3J0Og== + QWxsb3cgRHVwbGljYXRlIFJhdGluZyBWb3Rlcw== + QWxsb3cgRHVwbGljYXRlIFJldmlld3M= + RWRpdA== + RWRpdG9yJ3MgUGljaw== + RWRpdG9yJ3MgUGljayBBcnRpY2xlcw== + RWRpdG9yJ3MgUGljayBMaW5rcw== + RWRpdG9yIFBpY2sgVG9waWNz + RWRpdCBRdWVyeQ== + RW1haWw= + RW1haWwgQm9keQ== + RW1haWwgZGVsaXZlcnkgYWJvcnRlZA== + VGhlIEVtYWlsIE1lc3NhZ2UgaGFzIGJlZW4gc2VudA== + UGxlYXNlIFdhaXQgd2hpbGUgSW4tUG9ydGFsIHByZXBhcmVzIHRvIHNlbmQgdGhlIG1lc3NhZ2UuLg== + RW1haWwgU3ViamVjdA== + RW1vdGlvbiBJZA== + RW5hYmxlIFRlbXBsYXRlIENhY2hpbmc= + RW5hYmxlZA== + RW5hYmxlIEhUTUw/ + RXJyb3IgVGFn + RXZlbnQ= + RXhwaXJhdGlvbiBEYXRl + RXhwb3J0IEZpbGVuYW1l + R2VuZXJhbCBlcnJvcjogdW5hYmxlIHRvIGV4cG9ydA== + RmllbGQgSWQ= + RmllbGQgTGFiZWw= + RmllbGQgTmFtZQ== + RmllbGQgUHJvbXB0 + RmlsZSBJZA== + RmlsZSBuYW1l + Rmlyc3QgTmFtZQ== + Rmlyc3QgTmFtZQ== + RnJlcXVlbmN5 + RnJvbS9UbyBVc2Vy + RnJvbQ== + RnJvbnQgcGFnZSBsZWFkIGFydGljbGU= + R2VuZXJhbCBQZXJtaXNzaW9ucw== + R3JvdXAgTmFtZQ== + RXh0cmEgTWFpbCBIZWFkZXJz + SGVhZGluZw== + KE1pbmltdW0gNCk= + SGl0cw== + SG90 + SG90IEFydGljbGVz + SG90IExpbmtz + SG90IFRvcGljcw== + SFRNTA== + SFRNTCBWZXJzaW9u + SWNvbiBVUkw= + SW1hZ2U= + SW1hZ2UgSUQ= + SW1wb3J0IGVuY291bnRlcmVkIGFuIGVycm9yIGFuZCBkaWQgbm90IGNvbXBsZXRlLg== + TGluayBJbWFnZSBOYW1l + VGFibGUgTmFtZSBQcmVmaXg= + SW5pdGlhbCBJbXBvcnQgQ2F0ZWdvcnk= + SW4tTGluayBEYXRhYmFzZSBOYW1l + SW4tTGluayBEYXRhYmFzZSBQYXNzd29yZA== + SW4tTGluayBEYXRhYmFzZSBVc2VybmFtZQ== + SW4tTGluayBTZXJ2ZXIgTmFtZQ== + SW4tTGluayBTUUwgVHlwZQ== + SW5wdXQgVHlwZQ== + SW5zdGFsbGF0aW9uIFN0YXR1cw== + SVAgQWRkcmVzcw== + SVAgQWRkcmVzcw== + SXRlbQ== + SXRlbSBGaWVsZA== + RmllbGQgVmFsdWU= + RmllbGQgQ29tcGFyaXNvbg== + S2V5IFN0cm9rZQ== + S2V5d29yZA== + TGFiZWw= + TGFuZ3VhZ2UgRmlsZQ== + TGFuZ3VhZ2UgSWQ= + TGFuZ3VhZ2UgQ2FjaGUgVGltZW91dA== + RGF0ZSBGb3JtYXQ= + VGltZSBGb3JtYXQ= + TGFzdCBVcGRhdGVkIEFydGljbGU= + TGFzdCBDYXRlZ29yeSBVcGRhdGU= + TGFzdCBVcGRhdGVkIExpbms= + TGFzdCBOYW1l + TGFzdCBVcGRhdGVkIFBvc3QgRGF0ZQ== + TGFzdCBVcGRhdGVkIFBvc3QgVGltZQ== + TGFzdCBVcGRhdGVkIFRvcGljIERhdGU= + TGFzdCBVcGRhdGVkIFRvcGljIFRpbWU= + TGFzdCBOYW1l + U2l0ZSBMZWFkIFN0b3J5 + Q2F0ZWdvcnkgbGVhZCBhcnRpY2xl + TGVhZCBTdG9yeSBBcnRpY2xlcw== + TGluayBJZA== + VG90YWwgTGluayBSZXZpZXdz + QXZlcmFnZSBSYXRpbmcgb2YgTGlua3M= + TGluayBPd25lcg== + SW5zdGFsbCBQaHJhc2UgVHlwZXM6 + TG9jYWwgTmFtZQ== + TG9jYXRpb24= + U2VydmVyIFJlcXVpcmVzIEF1dGhlbnRpY2F0aW9u + U2VuZCBIVE1MIGVtYWls + UG9ydCAoZS5nLiBwb3J0IDI1KQ== + TWFpbCBTZXJ2ZXIgQWRkcmVzcw== + TWF4aW11bSBIaXRzIG9mIGFuIEFydGljbGU= + TWF4aW11bSBIaXRzIG9mIGEgTGluaw== + TWF4aW11bSBWb3RlcyBvZiBhIExpbms= + VG9waWMgTWF4aW11bSBIaXRz + VG9waWMgTWF4aW11bSBWb3Rlcw== + TWF4aW11bSBWb3RlcyBvZiBhbiBBcnRpY2xl + TWF4aW1hbCBpbXBvcnRlZCBjYXRlZ29yeSBsZXZlbA== + TWVtYmVyc2hpcCBFeHBpcmVz + Rm9ybWF0 + TWV0YSBEZXNjcmlwdGlvbg== + TWV0YSBLZXl3b3Jkcw== + TWluaW11bSBrZXl3b3JkIGxlbmd0aA== + TW9kaWZpZWQgT24= + TW9kaWZpZWQgYXQ= + TW9kdWxl + TW92ZSBkb3du + TW92ZSB1cA== + U2hvdyBtdWx0aXBsZQ== + TmFtZQ== + TmV3 + TmV3IEFydGljbGVz + TmV3IENhdGVnb3JpZXM= + TmV3ZXN0IEFydGljbGUgRGF0ZQ== + TmV3ZXN0IENhdGVnb3J5IERhdGU= + TmV3ZXN0IExpbmsgRGF0ZQ== + TmV3ZXN0IFBvc3QgRGF0ZQ== + TmV3ZXN0IFBvc3QgVGltZQ== + TmV3ZXN0IFRvcGljIERhdGU= + TmV3ZXN0IFRvcGljIFRpbWU= + TmV3ZXN0IFVzZXIgRGF0ZQ== + TmV3IExpbmtz + TmV3cyBBcnRpY2xlIElE + TmV3IFRvcGljcw== + Q3VycmVudGx5IEFjdGl2ZSBVc2VyIFNlc3Npb25z + Tm90aWZ5IE93bmVy + TGluayBwZXJtaXNzaW9uIElEIGZvciBhbGwgdW5yZWdpc3RlcmVkIHVzZXJzIHRvIHZpZXcgaXQ= + T3ZlcndyaXRlIEV4aXN0aW5nIFBocmFzZXM= + UGFjayBOYW1l + UGFyYW1ldGVy + UGFyZW50IHRlbXBsYXRlcw== + UGFzc3dvcmQ= + UmVwZWF0IFBhc3N3b3Jk + UGVuZGluZw== + UGVuZGluZyBDYXRlZ29yaWVz + UGVuZGluZyBJdGVtcw== + UGVuZGluZyBMaW5rcw== + UGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBub3c/ + UGVyIFBhZ2U= + UGVyc29uYWwgSW5mb3JtYXRpb24= + UGhvbmU= + UGhyYXNlIElk + UGhyYXNlcw== + UGhyYXNlIFR5cGU= + UGxhaW4gVGV4dA== + UG9wdWxhcml0eQ== + UG9wdWxhciBBcnRpY2xlcw== + UG9wdWxhciBMaW5rcw== + UG9wdWxhciBUb3BpY3M= + UG9zdGVkIGJ5 + UG9zdHMgdG8gbG9jaw== + VG90YWwgUG9zdHM= + UHJpbWFyeQ== + UHJpbWFyeSBHcm91cA== + UHJpbWFyeSBWYWx1ZQ== + UHJpb3JpdHk= + UHJvcGVydGllcw== + UmF0aW5n + KE1pbmltdW0gMCwgTWF4aW11bSA1KQ== + TnVtYmVyIG9mIERhdGFiYXNlIFJlY29yZHM= + TnVtYmVyIG9mIFJlZ2lvbiBQYWNrcw== + UmVndWxhciBVc2VyIEdyb3Vw + TGluayBwZXJtaXNzaW9uIElEIGZvciBhbGwgcmVnaXN0ZXJlZCB1c2VycyB0byB2aWV3IGl0 + UmVsYXRpb24gSUQ= + UmVsYXRpb24gVHlwZQ== + U2VhcmNoIFJlbGV2YW5jZSBkZXBlbmRzIG9u + U2VhcmNoIFJlbGV2ZW5jZSBTZXR0aW5ncw== + VXNlIHJlbW90ZSBpbWFnZSAoVVJMKQ== + UmVwbGFjZW1lbnQgV29yZA== + SW5jcmVhc2UgaW1wb3J0YW5jZSBpZiBmaWVsZCBjb250YWlucyBhIHJlcXVpcmVkIGtleXdvcmQgYnk= + UmVzdG9yZSBoYXMgZmFpbGVkIGFuIGVycm9yIG9jY3VyZWQ6 + Q2hvb3NlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGJhY2t1cCBkYXRlcyB0byByZXN0b3JlIG9yIGRlbGV0ZQ== + UmVzdG9yZSBTdGF0dXM= + UmVzdG9yZSBoYXMgYmVlbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5 + UmV2aWV3ZWQgQnk= + UmV2aWV3IElE + UmV2aWV3IFRleHQ= + U2VsZWN0IE1vZHVsZSBSb290IENhdGVnb3J5Og== + Um9vdCBjYXRlZ29yeSBuYW1lIChsYW5ndWFnZSB2YXJpYWJsZSk= + Um9vdCBQYXNzd29yZA== + UGxlYXNlIGVudGVyIHRoZSBSb290IHBhc3N3b3Jk + VmVyaWZ5IFJvb3QgUGFzc3dvcmQ= + UnVsZSBUeXBl + VmFsaWRhdGlvbiBQcm9ncmVzcw== + U2VhcmNo + U2VhcmNoIFR5cGU= + U2VsZWN0IFNvdXJjZSBMYW5ndWFnZQ== + U2VuZCBFbWFpbCBBcw== + U2VudCBPbg== + U2VydmVyIEhvc3RuYW1l + U0lE + U2Vzc2lvbiBDb29raWUgTmFtZQ== + U2Vzc2lvbiBNYW5hZ2VtZW50IE1ldGhvZA== + U2Vzc2lvbiBJbmFjdGl2aXR5IFRpbWVvdXQgKHNlY29uZHMp + U2hvdyBvbiB0aGUgZ2VuZXJhbCB0YWI= + U2ltcGxlIFNlYXJjaA== + QWRkaXRpb25hbCBNZXNzYWdlIEhlYWRlcnM= + TWFpbCBTZXJ2ZXIgUGFzc3dvcmQ= + TWFpbCBTZXJ2ZXIgVXNlcm5hbWU= + VXNlIG5vbi1ibG9ja2luZyBzb2NrZXQgbW9kZQ== + U1FMIFF1ZXJ5Og== + QW4gU1FMIGVycm9yIGhhcyBvY2N1cmVk + UGVyZm9ybSBTUUwgUXVlcnk= + U1FMIFF1ZXJ5IFJlc3VsdHM= + U2VydmVyIFR5cGU= + U3RhcnQgRGF0ZQ== + U3RhdGU= + U3RhdHVz + U3RlcCBPbmU= + U3RyZWV0 + U3R5bGVzaGVldA== + U3ViamVjdA== + U3ViIFNlYXJjaA== + RW5hYmxlIFRhZyBDYWNoaW5n + VG90YWwgU2l6ZSBvZiBTeXN0ZW0gRmlsZXM= + U3lzdGVtIHByZW1pc3Npb25z + TnVtYmVyIG9mIERhdGFiYXNlIFRhYmxlcw== + VGVtcGxhdGU= + VGV4dCBWZXJzaW9u + VGhlbWU= + TnVtYmVyIG9mIFRoZW1lcw== + VGhlbWUgSWQ= + VGhvdXNhbmRzIFNlcGFyYXRvcg== + UmVtb3RlIFVSTA== + KGhoOm1tOnNzKQ== + VGl0bGU= + VG8= + VG9waWNzIEF2ZXJhZ2UgUmF0aW5n + VG9waWMgSUQ= + VG9waWMgTG9ja2Vk + VG90YWwgVG9waWMgUmV2aWV3cw== + QWN0aXZlIFRvcGljcw== + RGlzYWJsZWQgVG9waWNz + UGVuZGluZyBUb3BpY3M= + VG90YWwgVG9waWNz + VG90YWwgVXNlcnMgd2l0aCBUb3BpY3M= + VG90YWwgQ2F0ZWdvcmllcw== + VG90YWwgTGlua3M= + VG90YWwgVXNlciBHcm91cHM= + VHlwZQ== + VXBkYXRpbmc= + VXBsb2FkIGltYWdlIGZyb20gbG9jYWwgUEM= + VVJM + VXNlciBDb3VudA== + VXNlcm5hbWU= + VXNlcm5hbWU= + QWN0aXZlIFVzZXJz + RGlzYWJsZWQgVXNlcnM= + UGVuZGluZyBVc2Vycw== + TnVtYmVyIG9mIFVuaXF1ZSBDb3VudHJpZXMgb2YgVXNlcnM= + TnVtYmVyIG9mIFVuaXF1ZSBTdGF0ZXMgb2YgVXNlcnM= + VmFsdWU= + TGlzdCBvZiBWYWx1ZXM= + Vmlld3M= + VmlzaWJsZQ== + KE1pbmltdW0gMSk= + Vm90ZXM= + V2FybmluZyE= + V2VpZ2h0 + Wmlw + U2Vzc2lvbiBSZWZlcnJlciBDaGVja2luZw== + U2luZ2xlLXF1b3Rl + bGFfUmF0aW5n + QWxyZWFkeSB2b3RlZA== + UmVjaXByb2NhbA== + VXNlIENhcHRjaGEgY29kZSBvbiBSZWdpc3RyYXRpb24= + UmVtb3ZlIEZyb20= + Tm90IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIGZpbGxlZC4gUGxlYXNlIGZpbGwgdGhlbSBmaXJzdC4= + QWNjZXNzIGRlbmllZA== + RmlsZSBlcnJvcg== + RmlsZSBub3QgZm91bmQ= + VW5hYmxlIHRvIHJlYWQgZnJvbSBmaWxl + QW4gdW5kZWZpbmVkIGVycm9yIGhhcyBvY2N1cmVk + UmV2aWV3ZXI= + UmV2aWV3IGFkZGVkIHN1Y2Nlc3NmdWxseQ== + VGhpcyBpdGVtIGhhcyBhbHJlYWR5IGJlZW4gcmV2aWV3ZWQ= + RXJyb3IgYWRkaW5nIHJldmlldw== + UmV2aWV3cyBQZXIgUGFnZQ== + UmV2aWV3cyBQZXIgUGFnZSAoU2hvcnRsaXN0KQ== + RXJyb3IgdmVyaWZ5aW5nIHBhc3N3b3Jk + UnVubmluZyBRdWVyeQ== + U2FtcGxlIFRleHQ= + U2F2ZQ== + U2VhcmNo + U2VhcmNo + U2VhcmNoIENhdGVnb3JpZXM= + U2VhcmNoIExpbmtz + U2VhcmNoIEFydGljbGVz + U2VhcmNoIFRvcGljcw== + Q2F0ZWdvcmllczE= + Q2xlYXIgU2VhcmNo + TmV3IFNlYXJjaA== + TUVUQSBJbmZvcm1hdGlvbg== + Q2F0ZWdvcnk= + Q291bnRlcnM= + Q3VzdG9tIEZpZWxkcw== + RnVsbCBTaXplIEltYWdl + R2VuZXJhbA== + SW1hZ2U= + SW1hZ2UgU2V0dGluZ3M= + VXNlciBJdGVtcw== + TWVzc2FnZQ== + U2VjdGlvbiBPdmVydmlldw== + UHJvcGVydGllcw== + UXVpY2sgTGlua3M= + UmVsYXRpb24= + VGVtcGxhdGVz + VGh1bWJuYWlsIEltYWdl + VHJhbnNsYXRpb24= + U2VhcmNoIFVzZXJz + U2VsZWN0IENvbHVtbnM= + U2VsZWN0aW5nIENhdGVnb3JpZXM= + RW1wdHkgc2VsZWN0aW9u + U2VtaWNvbG9u + T25lIGZpZWxkIGZvciBlYWNoIGNhdGVnb3J5IGxldmVs + Q2xvbmU= + RWRpdA== + RXhwb3J0 + R28gVXA= + SW1wb3J0 + TW92ZSBEb3du + TW92ZSBVcA== + UmVidWlsZA== + UmVzY2FuIFRoZW1lcw== + U2V0IFByaW1hcnk= + U2hvd2luZyBMb2dz + U2hvd2luZyBTdGF0aXN0aWNz + U2hvdyBFbWFpbCBMb2c= + U2hvd2luZyBMb2dz + QW5kIHRoZW4gYnk= + U3BhY2U= + QWxiZXJ0YQ== + QWxhc2th + QWxhYmFtYQ== + QXJrYW5zYXM= + QXJpem9uYQ== + QnJpdGlzaCBDb2x1bWJpYQ== + Q2FsaWZvcm5pYQ== + Q29sb3JhZG8= + Q29ubmVjdGljdXQ= + RGlzdHJpY3Qgb2YgQ29sdW1iaWE= + RGVsYXdhcmU= + RmxvcmlkYQ== + R2VvcmdpYQ== + SGF3YWlp + SW93YQ== + SWRhaG8= + SWxsaW5vaXM= + SW5kaWFuYQ== + S2Fuc2Fz + S2VudHVja3k= + TG91aXNpYW5h + TWFzc2FjaHVzZXR0cw== + TWFuaXRvYmE= + TWFyeWxhbmQ= + TWFpbmU= + TWljaGlnYW4= + TWlubmVzb3Rh + TWlzc291cmk= + TWlzc2lzc2lwcGk= + TW9udGFuYQ== + TmV3IEJydW5zd2ljaw== + Tm9ydGggQ2Fyb2xpbmE= + Tm9ydGggRGFrb3Rh + TmVicmFza2E= + TmV3IEhhbXBzaGlyZQ== + TmV3IEplcnNleQ== + TmV3Zm91bmRsYW5kIGFuZCBMYWJyYWRvcg== + TmV3IE1leGljbw== + Tm92YSBTY290aWE= + Tm9ydGh3ZXN0IFRlcnJpdG9yaWVz + TnVuYXZ1dA== + TmV2YWRh + TmV3IFlvcms= + T2hpbw== + T2tsYWhvbWE= + T250YXJpbw== + T3JlZ29u + UGVubnN5bHZhbmlh + UHJpbmNlIEVkd2FyZCBJc2xhbmQ= + UHVlcnRvIFJpY28= + UXVlYmVj + UmhvZGUgSXNsYW5k + U291dGggQ2Fyb2xpbmE= + U291dGggRGFrb3Rh + U2Fza2F0Y2hld2Fu + VGVubmVzc2Vl + VGV4YXM= + VXRhaA== + VmlyZ2luaWE= + VmVybW9udA== + V2FzaGluZ3Rvbg== + V2lzY29uc2lu + V2VzdCBWaXJnaW5pYQ== + V3lvbWluZw== + WXVrb24= + U3RlcA== + RGVmaW5pdGlvbg== + UHJldmlldw== + U3VuZGF5 + VGFi + QWRtaW5pc3RyYXRpb24gUGFuZWwgVUk= + QWR2YW5jZWQgVmlldw== + QmFja3Vw + VXNlciBCYW4gTGlzdA== + QmFzZSBTdHlsZXM= + QmxvY2sgU3R5bGVz + Q2F0YWxvZw== + Q2F0ZWdvcmllcw== + U2VsZWN0IEl0ZW0= + Q2F0ZWdvcnkgU2VsZWN0 + Q2Vuc29yc2hpcA== + Q29tbXVuaXR5 + R2VuZXJhbCBTZXR0aW5ncw== + Q2Vuc29yc2hpcA== + Q3VzdG9tIEZpZWxkcw== + RS1tYWlsIFNldHRpbmdz + R2VuZXJhbCBTZXR0aW5ncw== + T3V0cHV0IFNldHRpbmdz + U2VhcmNoIFNldHRpbmdz + R2VuZXJhbCBTZXR0aW5ncw== + U21pbGV5cw== + R2VuZXJhbCBTZXR0aW5ncw== + Q3VzdG9t + RWRpdGluZyBSZXZpZXc= + RW1haWwgRXZlbnRz + RW1haWwgTG9n + RW1haWwgTWVzc2FnZQ== + RXhwb3J0IERhdGE= + RXhwb3J0IExhbmd1YWdlIFBhY2s= + RmlsZXM= + R2VuZXJhbA== + R2VuZXJhbCBTZXR0aW5ncw== + R3JvdXA= + R3JvdXBz + U2VsZWN0IEdyb3Vw + SGVscA== + SW1hZ2Vz + SW1wb3J0IERhdGE= + SW1wb3J0IExhbmd1YWdlIFBhY2s= + SW4tbGluayBpbXBvcnQ= + SW5zdGFsbA== + SXRlbSBMaXN0 + SXRlbXM= + TGFiZWw= + TGFiZWxz + TGluayBWYWxpZGF0aW9u + TWFpbCBMaXN0 + TWVzc2FnZQ== + TWlzc2luZyBMYWJlbHM= + TW9kdWxlcw== + TW9kdWxlcyBNYW5hZ2VtZW50 + TW9kdWxlcyAmIFNldHRpbmdz + T3ZlcnZpZXc= + UGFja2FnZSBDb250ZW50 + UGVybWlzc2lvbnM= + cGhwQkIgSW1wb3J0 + UHJvcGVydGllcw== + UXVlcnkgRGF0YWJhc2U= + UmVnaW9uYWw= + UmVsYXRlZCBTZWFyY2hlcw== + UmVsYXRpb25z + U3VtbWFyeSAmIExvZ3M= + UmVzdG9yZQ== + UmV2aWV3 + UmV2aWV3cw== + UnVsZSBQcm9wZXJ0aWVz + U2VhcmNo + U2VhcmNoIExvZw== + U2VhcmNoIEdyb3Vwcw== + U2VhcmNoIFVzZXJz + U2VuZCBlLW1haWw= + U2VydmVyIEluZm9ybWF0aW9u + U2VydmljZQ== + U2Vzc2lvbiBMb2c= + R2VuZXJhbCBTZXR0aW5ncw== + U3RydWN0dXJlICYgRGF0YQ== + U3RhdGlzdGljcw== + U3R5bGVzaGVldHM= + U3VtbWFyeQ== + Q29uZmlndXJhdGlvbg== + VGFnIGxpYnJhcnk= + VGVtcGxhdGU= + VGVtcGxhdGVz + VGhlbWVz + VG9vbHM= + VXBkYXRlIExpY2Vuc2U= + QmFuIHVzZXI= + VXNlciBCYW4gTGlzdA== + VXNlcnM= + VXNlciBTZWxlY3Q= + R3JvdXBz + VXNlcnM= + VmlzaXRz + VGFnIExpYnJhcnk= + VGFnIExpYnJhcnk= + dGVyYWJ5dGUocyk= + dGV4dA== + SW52YWxpZCB1c2VyIG5hbWUgb3IgcGFzc3dvcmQ= + QWN0aXZl + QWRkaW5n + QWRkcmVzcw== + TG9naW4gbm90IGFsbG93ZWQgZnJvbSB0aGlzIGFkZHJlc3M= + QWRtaW4= + QWRtaW5pc3RyYXRvciBSZWNlaXZlIE5vdGljZXMgV2hlbg== + QWR2YW5jZWQ= + QWxs + QWxsb3c= + QW55 + QXJjaGl2ZWQ= + QXJ0aWNsZQ== + QXJ0aWNsZXM= + YXM= + QXV0by1SZWZyZXNo + QmFja2luZyB1cA== + QmFjayB1cCBoYXMgYmVlbiBjb21wbGV0ZWQuIFRoZSBiYWNrdXAgZmlsZSBpczo= + QmFja3VwIFBhdGg= + SW4tUG9ydGFsIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIHdyaXRlIHRvIHRoaXMgZGlyZWN0b3J5 + VGhpcyB1dGlsaXR5IGFsbG93cyB5b3UgdG8gYmFja3VwIHlvdXIgY3VycmVudCBkYXRhIGZyb20gSW4tUG9ydGFsIGRhdGFiYXNlLg== + QmFja3VwIGluIHByb2dyZXNz + QmFu + VXNlciBCYW4gUnVsZXM= + QmFuIFVzZXIgSW5mb3JtYXRpb24= + QmxhbmsgdXNlcm5hbWUgb3IgcGFzc3dvcmQ= + Qm90aA== + QnVpbHQgSW4= + Ynl0ZXM= + Q2F0YWxvZw== + Q2F0ZWdvcmllcw== + Q2F0ZWdvcnk= + Q2Vuc29yc2hpcA== + Q2l0eQ== + WW91IGFyZSBhYm91dCB0byBjbGVhciBjbGlwYm9hcmQgY29udGVudCENClByZXNzIE9LIHRvIGNvbnRpbnVlIG9yIENhbmNlbCB0byByZXR1cm4gdG8gcHJldmlvdXMgc2NyZWVuLg== + U2VjdGlvbiBDb21pbmcgU29vbg== + Q29tcGxldGU= + Q29uZmlndXJhdGlvbg== + Q29udGFpbnM= + Q291bnRlcnM= + Q1NWIEV4cG9ydA== + Q3VycmVudA== + Q3VzdG9t + Q3VzdG9tIEZpZWxk + Q3VzdG9tIEZpZWxkcw== + RGF0YWJhc2UgU2V0dGluZ3MgLSBJbnRlY2huaWMgSW4tTGluayAyLng= + Y2F0ZWdvcmllcw== + RGF0YSBUeXBlIDI= + cG9zdA== + bGlua3M= + dXNlcnM= + RGF0ZS9UaW1lIFNldHRpbmdz + RGF5 + UnVubmluZyB0aGlzIHV0aWxpdHkgd2lsbCBhZmZlY3QgeW91ciBkYXRhYmFzZS4gIFBsZWFzZSBiZSBhZHZpc2VkIHRoYXQgeW91IGNhbiB1c2UgdGhpcyB1dGlsaXR5IGF0IHlvdXIgb3duIHJpc2suICBJbnRlY2huaWMgQ29ycG9yYXRpb24gY2FuIG5vdCBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGNvcnJ1cHQgZGF0YSBvciBkYXRhIGxvc3Mu + RGVmYXVsdA== + RGVsZXRl + RGVuaWVk + RGVueQ== + RGlzYWJsZQ== + RGlzYWJsZWQ= + UnVubmluZyB0aGlzIHV0aWxpdHkgd2lsbCBhZmZlY3QgeW91ciBkYXRhYmFzZS4gUGxlYXNlIGJlIGFkdmlzZWQgdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHV0aWxpdHkgYXQgeW91ciBvd24gcmlzay4gSW50ZWNobmljIENvcnBvcmF0aW9uIGNhbiBub3QgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBjb3JydXB0IGRhdGEgb3IgZGF0YSBsb3NzLg== + UGxlYXNlIG1ha2Ugc3VyZSB0byBiYWNrIHVwIHlvdXIgZGF0YWJhc2UocykgYmVmb3JlIHJ1bm5pbmcgdGhpcyB1dGlsaXR5Lg== + RWRpdA== + RWRpdGluZw== + RWRpdG9y + RW1haWw= + RW1vdGlvbiBJY29ucw== + RW5hYmxl + RW5hYmxlZA== + RXZlbnRz + RXhhbXBsZQ== + RXhpc3Rz + RXhwaXJlZA== + RXhwb3J0 + RmllbGRz + RmlsdGVy + Rmlyc3QgTmFtZQ== + Zm9y + RnJvbnQ= + RnJvbnQgRW5k + RnJvbnQtZW5kIE9ubHk= + RnVsbA== + RnVsbCBTaXplIEltYWdl + R2VuZXJhbA== + R3JlYXRlciBUaGFu + R3JvdXA= + R3JvdXBz + R3JvdXAgTmFtZQ== + R3Vlc3Q= + R3Vlc3QgVXNlcnM= + SG90 + SG91cg== + SSBhZ3JlZSB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnM= + SW1hZ2U= + SW1hZ2Vz + SW5hY3RpdmU= + SW4gRGV2ZWxvcG1lbnQ= + SW5zdGFsbA== + SW5zdGFsbGVk + SW52YWxpZA== + SW52ZXJ0 + SVAgQWRkcmVzcw== + SXM= + SXMgTm90 + SXRlbXM= + S2V5d29yZA== + TGFiZWw= + TGFuZ3VhZ2UgSW1wb3J0 + TGFuZ3VhZ2U= + TGFzdCBOYW1l + TGVhZGluZw== + TGVzcyBUaGFu + TGljZW5zZQ== + TGluaw== + TGlua3M= + VmFsaWRhdGluZyBMaW5rcw== + TG9jYWw= + TG9ja2Vk + VXNlcm5hbWU= + RW1haWwgRXZlbnQ= + RGVmYXVsdCBNRVRBIGtleXdvcmRz + TWluaW11bSBrZXl3b3JkIGxlbmd0aA== + TWludXRl + TWluaW11bSBwYXNzd29yZCBsZW5ndGg= + TWluaW11bSB1c2VyIG5hbWUgbGVuZ3Ro + QmxhbmsgcGFzc3dvcmRzIGFyZSBub3QgYWxsb3dlZA== + QmxhbmsgdXNlciBuYW1l + TW9kdWxlcw== + TW9udGhz + U2hvdyBtdWx0aXBsZQ== + TmV3 + TmV3IENlbnNvciBXb3Jk + TmV3IEZpZWxk + TmV3IFRoZW1l + Tm8gQ2F0ZWdvcmllcw== + Tm9uZQ== + Tm8gcGVybWlzc2lvbnM= + RG9lcyBOb3QgQ29udGFpbg== + Tm90IFZhbGlkYXRlZA== + Tm8gcGVybWlzc2lvbnM= + T25lIFdheQ== + UGFjaw== + UGVuZGluZw== + UGVybWlzc2lvbg== + UGhvbmU= + UG9wdWxhcg== + UG9wdWxhcml0eQ== + UG9zdCBCb2R5 + UG9zdHM= + UHJlcmVxdWlzaXRlIG5vdCBmdWxmaWxsZWQsIGluc3RhbGxhdGlvbiBjYW5ub3QgY29udGludWUh + UHJpbWFyeQ== + UXVpY2sgbGlua3M= + UmVhZCBPbmx5 + UmVhZHkgdG8gSW5zdGFsbA== + UmVjaXByb2NhbA== + UmVsYXRpb24= + UmVsYXRpb25z + UmVwbGllcw== + VGhlIHZlcnNpb25zIG9mIHRoZSBiYWNrdXAgYW5kIHlvdXIgY29kZSBkb24ndCBtYXRjaC4gWW91ciBpbnN0YWxsYXRpb24gd2lsbCBwcm9iYWJseSBiZSBub24gb3BlcmF0aW9uYWwu + SGVyZSB5b3UgY2FuIHJlc3RvcmUgeW91ciBkYXRhYmFzZSBmcm9tIGEgcHJldmlvdXNseSBiYWNrZWQgdXAgc25hcHNob3QuIFJlc3RvcmluZyB5b3VyIGRhdGFiYXNlIHdpbGwgZGVsZXRlIGFsbCBvZiB5b3VyIGN1cnJlbnQgZGF0YSBhbmQgbG9nIHlvdSBvdXQgb2YgdGhlIHN5c3RlbS4= + UmVzdG9yZSBpcyBpbiBwcm9ncmVzcw== + IFJ1bm5pbmcgdGhpcyB1dGlsaXR5IHdpbGwgYWZmZWN0IHlvdXIgZGF0YWJhc2UuICBQbGVhc2UgYmUgYWR2aXNlZCB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgdXRpbGl0eSBhdCB5b3VyIG93biByaXNrLiAgSW50ZWNobmljIGNvcnBvcmF0aW9uIGNhbiBub3QgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBjb3JydXB0IGRhdGEgb3IgZGF0YSBsb3NzLiAgUGxlYXNlIG1ha2Ugc3VyZSB0byBiYWNrIHVwIHlvdXIgZGF0YWJhc2UocykgYmVmb3JlIHJ1bm5p + UmVzdHJpY3Rpb25z + UmVzdWx0cw== + UmV2aWV3 + UmV2aWV3cw== + Um9vdA== + TW9kdWxlIFJvb3QgQ2F0ZWdvcnk= + cm93KHMp + UnVsZQ== + U2FtZQ== + U2FtZSBhcyB0aHVtYm5haWw= + U2F2ZQ== + U2Nhbm5pbmc= + U2VhcmNoIFJlc3VsdHM= + U2Vjb25kcw== + U2VsZWN0 + U2VuZA== + U2Vzc2lvbnM= + U2Vzc2lvbiBFeHBpcmVk + U2V0dGluZ3M= + U2hvd2luZyBHcm91cHM= + U2hvd2luZyBVc2Vycw== + U2ltcGxl + U2l6ZQ== + U21pbGV5 + U01UUCAobWFpbCkgU2VydmVy + U29ydA== + U3RhdGU= + U3RlcA== + U3ViQ2F0cw== + U3ViSXRlbXM= + VGFibGU= + VGVtcGxhdGU= + VGVtcGxhdGVz + VGhlbWU= + VGh1bWJuYWls + VGh1bWJuYWlsIEltYWdl + dG8= + VG9waWM= + VG9waWNz + VHlwZQ== + dHlwZXM= + SXMgVW5pcXVl + VW5zZWxlY3Q= + VXBkYXRlIExpY2Vuc2U= + WW91ciBkYXRhIHdpbGwgYmUgbW9kaWZpZWQgZHVyaW5nIHRoZSB1cGdyYWRlLiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCB5b3UgbWFrZSBhIGJhY2t1cCBvZiB5b3VyIGRhdGFiYXNlLiBQcm9jZWVkIHdpdGggdGhlIHVwZ3JhZGU/ + VXBsb2Fk + VXNlcg== + VXNlciBSZWNlaXZlcyBOb3RpY2VzIFdoZW4= + VXNlcnM= + VXNlciBDb3VudA== + VmFsaWQ= + VmVyc2lvbg== + Vmlldw== + Vmlld3M= + V2Vic2l0ZQ== + V2Vla3M= + V2l0aGlu + WWVhcnM= + Wmlw + QWRkaW5nIEN1c3RvbSBGaWVsZA== + QWRkaW5nIEZpbGU= + QWRkaW5nIEJhc2UgU3R5bGU= + QWRkaW5nIEJsb2NrIFN0eWxl + QWRkaW5nIENhdGVnb3J5 + QWRkaW5nIEdyb3Vw + QWRkaW5nIEltYWdl + QWRkaW5nIExhbmd1YWdl + QWRkaW5nIFBocmFzZQ== + QWRkaW5nIEtleXdvcmQ= + QWRkaW5nIFJlbGF0aW9uc2hpcA== + QWRkaW5nIFJldmlldw== + QWRkaW5nIFN0eWxlc2hlZXQ= + QWRkaW5nIFVzZXI= + QWRkaXRpb25hbCBQZXJtaXNzaW9ucw== + QWRkIE1vZHVsZQ== + QWR2YW5jZWQgVmlldw== + QmFja3Vw + QmFzZSBTdHlsZXM= + QmxvY2sgU3R5bGVz + Q2F0YWxvZw== + Q2F0ZWdvcmllcw== + U2VsZWN0IHJlbGF0aW9u + U2VsZWN0IGNhdGVnb3J5 + Q2Vuc29yc2hpcA== + Q29sdW1uIFBpY2tlcg== + Q29tbXVuaXR5 + Q29uZmlndXJhdGlvbg== + Q29udGFjdCBJbmZvcm1hdGlvbg== + Q291cG9uIFNlbGVjdG9y + Q3VzdG9t + Q3VzdG9tIEZpZWxkcw== + RG9uZQ== + RWRpdGluZyBFbWFpbCBFdmVudA== + RWRpdGluZyBGaWxl + RWRpdGluZyBHcm91cA== + RWRpdGluZyBTdHlsZQ== + RWRpdGluZyBUcmFuc2xhdGlvbg== + RWRpdGluZyBCYXNlIFN0eWxl + RWRpdGluZyBCbG9jayBTdHlsZQ== + RWRpdGluZyBDYXRlZ29yeQ== + RWRpdGluZyBDdXN0b20gRmllbGQ= + RWRpdGluZyBHcm91cA== + RWRpdGluZyBJbWFnZQ== + RWRpdGluZyBMYW5ndWFnZQ== + RWRpdGluZyBQaHJhc2U= + RWRpdGluZyBLZXl3b3Jk + S2V5d29yZA== + RWRpdGluZyBSZWxhdGlvbnNoaXA= + RWRpdGluZyBSZXZpZXc= + RWRpdGluZyBTdHlsZXNoZWV0 + RWRpdCBVc2Vy + U2l0ZSBTdHJ1Y3R1cmU= + RWRpdCBDYXRlZ29yeQ== + RWRpdCBHcm91cA== + U2l0ZSBTdHJ1Y3R1cmU= + U2l0ZSBTdHJ1Y3R1cmU= + RWRpdCBVc2Vy + RS1tYWlsIEV2ZW50cw== + RS1tYWlsIFNldHRpbmdz + RXhwb3J0IERhdGE= + RXhwb3J0IExhbmd1YWdlIFBhY2s= + RXhwb3J0IExhbmd1YWdlIFBhY2sgLSBSZXN1bHRz + RXhwb3J0IExhbmd1YWdlIFBhY2sgLSBTdGVwMQ== + RmlsZXM= + R2VuZXJhbA== + R2VuZXJhbCBDb25maWd1cmF0aW9u + R3JvdXBz + U2VsZWN0IGdyb3Vw + SGVscA== + SW1hZ2Vz + SW1wb3J0IERhdGE= + SW1wb3J0IExhbmd1YWdlIFBhY2s= + SW4tYnVsbGV0aW4= + SW4tbGluaw== + SW4tbmV3eg== + SW5zdGFsbGF0aW9uIEhlbHA= + SW5zdGFsbCBMYW5ndWFnZSBQYWNrIC0gU3RlcCAx + SW5zdGFsbCBMYW5ndWFnZSBQYWNrIC0gU3RlcCAy + SXRlbXM= + TGFiZWw= + TGFiZWxz + SW5zdGFsbCBMYW5ndWFnZSBQYWNr + TGFuZ3VhZ2UgUGFja3M= + TG9hZGluZyAuLi4= + TW9kdWxlIFN0YXR1cw== + TmV3IEN1c3RvbSBGaWVsZA== + TmV3IEZpbGU= + TmV3IEJhc2UgU3R5bGU= + TmV3IEJsb2NrIFN0eWxl + TmV3IENhdGVnb3J5 + TmV3IEdyb3Vw + TmV3IEltYWdl + TmV3IExhbmd1YWdl + TmV3IFBocmFzZQ== + TmV3IFJlbGF0aW9uc2hpcA== + TmV3IFJldmlldw== + TmV3IFN0eWxlc2hlZXQ= + Tm8gUGVybWlzc2lvbnM= + UGVybWlzc2lvbnM= + UGxlYXNlIFdhaXQ= + UHJvcGVydGllcw== + UmVnaW9uYWw= + UmVnaW9uYWwgU2V0dGluZ3M= + UmVsYXRlZCBTZWFyY2hlcw== + UmVsYXRpb25z + U3VtbWFyeSAmIExvZ3M= + UmVzdG9yZQ== + UmV2aWV3cw== + U2VhcmNoIExvZw== + U2VhcmNoIFJlc3VsdHM= + U2VsZWN0IFVzZXI= + U2VsZWN0IGl0ZW0= + U2VsZWN0IGl0ZW0= + U2VuZCBFLW1haWw= + U2VuZGluZyBQcmVwYXJlZCBFLW1haWxz + UHJlcGFyaW5nIHRvIFNlbmQgTWFpbA== + U2VuZCBlbWFpbA== + Q2FuY2VsIHNlbmRpbmcgbWFpbA== + TWFpbCBoYXMgYmVlbiBzZW50IFN1Y2Nlc3NmdWxseQ== + UHJlcGFyaW5nIHRvIFNlbmQgTWVzc2FnZXM= + U2VuZGluZyBNZXNzYWdlLi4= + U2Vzc2lvbiBMb2c= + TW9kdWxlcyAmIFNldHRpbmdz + U3RydWN0dXJlICYgRGF0YQ== + U3R5bGVzaGVldHM= + U3VtbWFyeQ== + Q29uZmlndXJhdGlvbg== + VG9vbHM= + VXBkYXRpbmcgQ2F0ZWdvcmllcw== + VXNlcnM= + U2VsZWN0IHVzZXI= + VmlzaXRz + dG8= + Q3Vyci4gQ2F0ZWdvcnk= + RG93bg== + VXA= + QWRk + QWRkIFVzZXIgdG8gR3JvdXA= + QWRkIFVzZXIgVG8gR3JvdXA= + QWRkIENhdGVnb3J5 + QWRkIFByb2R1Y3Q= + QXBwbHkgUnVsZXM= + QXBwcm92ZQ== + QmFjaw== + QmFu + Q2FuY2Vs + Q2xlYXIgQ2xpcGJvYXJk + Q2xvbmU= + Q2xvc2U= + Q29udGludWUgTGluayBWYWxpZGF0aW9u + Q29weQ== + Q3V0 + RGVjbGluZQ== + RGVsZXRl + RGVsZXRlIEFsbA== + RGVsZXRlIFVzZXIgRnJvbSBHcm91cA== + RGVueQ== + RGlzYWJsZQ== + RWRpdA== + RWRpdCBDdXJyZW50IENhdGVnb3J5 + RGlzYWJsZQ== + RW5hYmxl + RnJvbnQgT25seQ== + U2VsZWN0IFVzZXI= + RW5hYmxl + RXhwb3J0 + RXhwb3J0IExhbmd1YWdl + SG9tZQ== + SW1wb3J0 + SW1wb3J0IExhbmd1YWdl + SW1wb3J0IGEgTGFnbnVhZ2UgUGFja2FnZQ== + TW92ZSBEb3du + TW92ZSBVcA== + TW92ZSBEb3du + TW92ZSBVcA== + TmV3IEJhc2UgU3R5bGU= + TmV3IEJsb2NrIFN0eWxl + TmV3IEdyb3Vw + TmV3IGxhYmVs + TmV3IExhbmd1YWdl + TmV3IFJldmlldw== + TmV3IFNlYXJjaCBGaWVsZA== + TmV3IFN0eWxlc2hlZXQ= + TmV3IFRoZW1l + TmV3IFVzZXI= + U3RhcnQgTmV3IFZhbGlkYXRpb24= + TmV3IENhdGVnb3J5 + TmV3IENlbnNvciBXb3Jk + TmV3IENvdXBvbg== + TmV3IEN1c3RvbSBGaWVsZA== + TmV3IERpc2NvdW50 + TmV3IEVtb3Rpb24gSWNvbg== + TmV3IEltYWdl + TmV3IEltYWdlcw== + QWRkIEtleXdvcmQ= + QWRkIG5ldyBsYWJlbA== + TmV3IExhbmd1YWdlIFBhY2s= + TmV3IFBlcm1pc3Npb24= + TmV3IFJlbGF0aW9u + TmV3IFJldmlldw== + TmV3IFJ1bGU= + TmV3IFRlbXBsYXRl + TmV3IFRoZW1l + TmV3IFVzZXI= + TmV4dA== + TmV4dCBzdGVw + UGFzdGU= + UHJldmlvdXM= + UHJldmlldw== + UHJldmlvdXM= + UHJldmlvdXMgc3RlcA== + U2V0IFByaW1hcnkgVGhlbWU= + U2V0IFByaW1hcnkgR3JvdXA= + UHJpbnQ= + UmVidWlsZCBDYXRlZ29yeSBDYWNoZQ== + UmVmcmVzaA== + RGVsZXRlIFVzZXIgRnJvbSBHcm91cA== + UmVzY2FuIFRoZW1lcw== + UmVzZXQ= + UmVzZXQgVG8gQmFzZQ== + UmVzZXQgVmFsaWRhdGlvbiBTdGF0dXM= + UmVzdG9yZQ== + U2F2ZQ== + U2VhcmNo + UmVzZXQ= + U2VsZWN0 + U2VsZWN0IFVzZXI= + U2VuZCBFLW1haWw= + U2VuZCBFLW1haWw= + U2V0IFByaW1hcnk= + U2V0IFByaW1hcnkgQ2F0ZWdvcnk= + U2V0IFByaW1hcnkgTGFuZ3VhZ2U= + Q2FuY2Vs + VXAgYSBDYXRlZ29yeQ== + VmFsaWRhdGU= + Vmlldw== + RGlzcGxheSBlZGl0b3IgcGlja3MgYWJvdmUgcmVndWxhciB0b3BpY3M= + TmV3IFRvcGljcyAoRGF5cyk= + TnVtYmVyIG9mIHRvcGljcyBwZXIgcGFnZQ== + VG9waWNzIFBlciBQYWdlIChTaG9ydGxpc3Qp + UGljaw== + VG9waWMgcmV2aWV3ZWQ= + QW5kIHRoZW4gYnk= + QW5kIHRoZW4gYnk= + YW5kIHRoZW4gYnk= + T3JkZXIgVG9waWNzIEJ5 + U29ydCB0b3BpY3MgYnk= + QW5kIHRoZW4gYnk= + T3JkZXIgdG9waWNzIGJ5 + VG9waWMgVGV4dA== + Vmlld3M= + VG8gRGF0ZQ== + VHJhbnNsYXRl + Q2hlY2tib3hlcw== + RGF0ZQ== + RGF0ZSAmIFRpbWU= + TGFiZWw= + TXVsdGlwbGUgU2VsZWN0 + UGFzc3dvcmQgZmllbGQ= + UmFkaW8gYnV0dG9ucw== + RHJvcCBkb3duIGZpZWxk + Q2hlY2tib3g= + VGV4dCBmaWVsZA== + VGV4dCBhcmVh + VW5jaGFuZ2Vk + VW5kZWZpbmVk + VW5pY29kZQ== + VXBkYXRpbmcgQ29uZmlndXJhdGlvbg== + VXBkYXRpbmcgUnVsZXM= + VXNlIENyb24gZm9yIFJ1bm5pbmcgUmVndWxhciBFdmVudHM= + QWxsb3cgbmV3IHVzZXIgcmVnaXN0cmF0aW9u + QXNzaWduIEFsbCBVc2VycyBUbyBHcm91cA== + VmFsaWRhdGUgZS1tYWlsIGFkZHJlc3M= + QXNzaWduIHVzZXJzIG5vdCBsb2dnZWQgaW4gdG8gZ3JvdXA= + QXNzaWduIHJlZ2lzdGVyZWQgdXNlcnMgdG8gZ3JvdXA= + QXNzaWduIHBhc3N3b3JkIGF1dG9tYXRpY2FsbHk= + TnVtYmVyIG9mIGRheXMgdG8gZGVueSBtdWx0aXBsZSByZXZpZXdzIGZyb20gdGhlIHNhbWUgdXNlcg== + QXNzaWduIG1haWxpbmcgbGlzdCBzdWJzY3JpYmVycyB0byBncm91cA== + TnVtYmVyIG9mIGRheXMgdG8gZGVueSBtdWx0aXBsZSB2b3RlcyBmcm9tIHRoZSBzYW1lIHVzZXI= + SW5zdGFudA== + Tm90IEFsbG93ZWQ= + VXBvbiBBcHByb3ZhbA== + VXNlIFRvb2xiYXIgTGFiZWxz + VXNlIEVtYWlscyBBcyBMb2dpbg== + VVMvVUs= + UGxlYXNlIGNoZWNrIHRoZSByZXF1aXJlZCBmaWVsZHMgYW5kIHRyeSBhZ2FpbiE= + VmFsdWU= + RW50ZXIgbGlzdCBvZiB2YWx1ZXMgYW5kIHRoZWlyIGRlc2NyaXB0aW9ucywgbGlrZSAxPU9uZSwgMj1Ud28= + QWN0aXZl + QWx3YXlz + QXV0bw== + RGlzYWJsZWQ= + RW5hYmxlZA== + TmV2ZXI= + SW52YWxpZCBQYXNzd29yZA== + UGVuZGluZw== + UmVxdWlyZWQgRmllbGQ= + SW52YWxpZCBVc2VybmFtZQ== + RGlyZWN0IGFjY2VzcyBvciBib29rbWFyaw== + Vm90ZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5 + V2FybmluZzogRW5hYmxpbmcgSFRNTCBpcyBhIHNlY3VyaXR5IHJpc2sgYW5kIGNvdWxkIGRhbWFnZSB0aGUgc3lzdGVtIGlmIHVzZWQgaW1wcm9wZXJseSE= + QSBzZWFyY2ggb3IgYSBmaWx0ZXIgaXMgaW4gZWZmZWN0LiBZb3UgbWF5IG5vdCBiZSBzZWVpbmcgYWxsIG9mIHRoZSBkYXRhLg== + WW91IGFyZSBhYm91dCB0byBkZWxldGUgdGhlIHByaW1hcnkgdGhlbWUuIENvbnRpbnVlPw== + TW9kaWZpY2F0aW9ucyB3aWxsIG5vdCB0YWtlIGVmZmVjdCB1bnRpbCB5b3UgY2xpY2sgdGhlIFNhdmUgYnV0dG9uIQ== + d2Vlaw== + V2luZG93cyAocm4p + eWVhcg== + WWVz + WW91IGRvIG5vdCBoYXZlIGFjY2VzcyB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9u + QWNjb3VudCBJbmZvcm1hdGlvbg== + QWN0aW9u + QWN0aW9uIEJveA== + SGVyZSBZb3UgQ2FuOg== + QWRk + U3VnZ2VzdCBDYXRlZ29yeSBSZXN1bHRz + Q2F0ZWdvcnkgQWRkZWQgUGVuZGluZyBBcHByb3ZhbA== + WW91ciBjYXRlZ29yeSBzdWdnZXN0aW9uIGhhcyBiZWVuIGFjY2VwdGVkIGFuZCBpcyBwZW5kaW5nIGFkbWluaXN0cmF0aXZlIGFwcHJvdmFsLg== + VGhlIENhdGVnb3J5IHlvdSBzdWdnZXN0ZWQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHN5c3RlbS4= + QWRkZWQ= + QWRkZWQgdG9kYXk= + QWRkZWQgVG9kYXk= + QWRkaXRpb25hbCBjYXRlZ29yaWVz + QWRkIExpbmsgUmVzdWx0cw== + QWRkIFBlbmRpbmcgTGluayBSZXN1bHRz + WW91ciBsaW5rIGhhcyBiZWVuIGFkZGVkIHBlbmRpbmcgYWRtaW5pc3RyYXRpdmUgYXBwcm92YWwu + VGhlIGxpbmsgeW91IGhhdmUgc3VnZ2VzdGVkIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBkYXRhYmFzZS4= + QWRkcmVzcw== + QWRkcmVzcyBMaW5l + QWRkcmVzcyBMaW5lIDE= + QWRkcmVzcyBMaW5lIDI= + QWRkIEZyaWVuZA== + QWRkIExpbms= + U2VuZCBQcml2YXRlIE1lc3NhZ2U= + QWRkIFJldmlldw== + QWRkIFRvcGlj + QWRkIHRvIEZhdm9yaXRlcw== + QWR2YW5jZWQgU2VhcmNo + QWR2YW5jZWQgU2VhcmNo + QWR2YW5jZWQ= + QW55 + Q29udGFpbnM= + SXMgRXF1YWwgVG8= + SXMgTm90IEVxdWFsIFRv + RG9lcyBOb3QgQ29udGFpbg== + QWxsIFByb2R1Y3Rz + QWxsIHJpZ2h0cyByZXNlcnZlZC4= + RW50aXJlIFdlYnNpdGU= + IGhhcyBhbHJlYWR5IGJlZW4gc3VnZ2VzdGVkIHRvIHRoaXMgc2l0ZSBvbg== + QW5k + QU9MIElN + QXBy + VGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGZvcm0sIHBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbWVzc2FnZXMgYmVsb3cu + VGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGZvcm0sIHBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbWVzc2FnZXMgYmVsb3c= + QXJ0aWNsZXM= + QXJ0aWNsZSBEZXRhaWxz + QXJ0aWNsZSBuYW1l + QXJ0aWNsZSBSZXZpZXdz + QXNjZW5kaW5n + QXVn + QXV0aG9y + QXV0b21hdGlj + RGlzYWJsZWQgYXZhdGFy + QmFjaw== + QkJDb2Rl + QmlydGggRGF0ZQ== + QmxhbmsgcGFzc3dvcmQ= + Ym94 + QnJvd3NlIEJ5IENhdGVnb3JpZXM= + QWRkIFJldmlldw== + QWRkIFRvIEZhdm9yaXRlcw== + QWRkIFRvIFdpc2ggTGlzdA== + QWR2YW5jZWQgc2VhcmNo + Q2FuY2Vs + Q2xlYXI= + Q2xvc2UgV2luZG93 + Q29udGFjdA== + Q3JlYXRl + RGVsZXRl + RGVsZXRlIEZpbGU= + RGVsZXRlIEltYWdl + RGV0YWlscw== + RmluZCBpdA== + R28= + TW9kaWZ5 + TW9yZSBJbWFnZXM= + TmV3IExpbms= + TmV3IHRvcGlj + Tm8= + T0s= + UmVjb21tZW5k + UmVnaXN0ZXI= + UmVtb3ZlIEZyb20gRmF2b3JpdGVz + UmVzZXQ= + U2VsZWN0 + UmVjb3ZlciBQYXNzd29yZA== + U2V0 + U29ydA== + U3Vic2NyaWJl + VW5zdWJzY3JpYmU= + VXBkYXRl + WWVz + U2VuZCBQYXNzd29yZA== + R28= + Sm9pbg== + U3Vic2NyaWJl + Tm8= + T2s= + UmF0ZQ== + U2VhcmNo + VW5zdWJzY3JpYmU= + WWVz + Ynk= + Q2FuY2Vs + U2VjdXJpdHkgY29kZQ== + U2VjdXJpdHkgY29kZSBlbnRlcmVkIGluY29ycmVjdGx5 + RW50ZXIgU2VjdXJpdHkgQ29kZQ== + Q2F0ZWdvcnk= + Q2F0ZWdvcmllcw== + TGFzdCB1cGRhdGVkIG9u + Y2F0ZWdvcmllcyB1cGRhdGVk + Q2F0ZWdvcnk= + Q2F0ZWdvcnkgSW5mb3JtYXRpb24= + Q2F0ZWdvcnkgU2VhcmNoIFJlc3VsdHM= + Q2F0ZWdvcnkgTGVhZCBTdG9yeQ== + Q2F0ZWdvcmllcw== + Q2hlY2tvdXQ= + Q2l0eQ== + Y2xpY2sgaGVyZQ== + Q2xvc2U= + Q2xvc2UgV2luZG93 + UGFzc3dvcmQgcmVzZXQgaGFzIGNvZGUgZXhwaXJlZA== + UGFzc3dvcmQgcmVzZXQgY29kZSBpcyBub3QgdmFsaWQ= + QWNjb3VudCBJbmZvcm1hdGlvbg== + Q3VycmVudCBWYWx1ZQ== + RGF0ZQ== + RGlzcGxheSB0byBQdWJsaWM= + RW1haWw= + TGFzdCBVcGRhdGU= + T25saW5l + TG9naW4= + TWVtYmVyIHNpbmNl + TWVzc2FnZQ== + TmFtZQ== + UHJpY2U= + Vmlld3M= + UHJpY2VzIG9mIG9uZSBvciBtb3JlIGl0ZW1zIGluIHlvdXIgc2hvcHBpbmcgY2FydCBoYXZlIGJlZW4gY2hhbmdlZCBkdWUgdG8geW91ciBsb2dpbiwgcGxlYXNlIHJldmlldyBjaGFuZ2VzLg== + RW1haWxBZGRyZXNz + R28= + Tm8gUGVybWlzc2lvbnM= + UGFnZQ== + UHJvZHVjdCBEZXNjcmlwdGlvbg== + Q29tcGFueQ== + Y29uZmlybQ== + Q29uZmlybWF0aW9uIFRpdGxl + WW91IGFyZSBhYm91dCB0byBkZWxldGUgdGhlIGxpbmsgYmVsb3cu + Q29uZmlybWF0aW9uIFN1YnRpdGxl + Q29uZmlybWF0aW9uIHRleHQ= + Q29udGFjdCBVcw== + Q29udGFjdCBJbmZvcm1hdGlvbg== + Q29udGludWU= + Q29va2llcw== + UGxlYXNlIGVuYWJsZSBjb29raWVzIHRvIGxvZ2luIQ== + Q291bnRyeQ== + Y3JlYXRlZA== + Q3JlYXRlIFBhc3N3b3Jk + Q3JlZGl0IENhcmRz + WW91ciBUaGVtZQ== + Q3VycmVudCBWYWx1ZQ== + RGF0ZQ== + RGF0ZSBjcmVhdGVk + RGVj + RW5hYmxlIEJCQ29kZQ== + Tm90aWZ5IG1lIG9uIGNoYW5nZXMgdG8gdG9waWNzIEkgY3JlYXRl + UmVjZWl2ZSBQcml2YXRlIE1lc3NhZ2UgTm90aWZpY2F0aW9ucw== + QXR0YXRjaCBNeSBTaWduYXR1cmUgdG8gUG9zdHM= + U2ltbGllcyBvbiBieSBkZWZhdWx0 + U2lnbmF0dXJlcyBvbiBieSBkZWZhdWx0 + RGVsZXRl + Q29uZmlybSBEZWxldGU= + RGVsZXRlIEZyaWVuZA== + QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGxpbms/ + VGhlIGxpbmsgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkIGZyb20gIEZhdm9yaXRlcy4= + RGVzY2VuZGluZw== + RGVzY3JpcHRpb24gQSB0byBa + RGVzY3JpcHRpb24gWiB0byBB + WW91ciBGYXZvcml0ZSBJdGVtcw== + RWRpdCB5b3VyIFByZWZlcmVuY2Vz + WW91ciBQcm9maWxlIEluZm9ybWF0aW9u + WW91ciBQcml2YXRlIE1lc3NhZ2Vz + RGV0YWlscw== + ZGV0YWlscyB1cGRhdGVk + RGlyZWN0b3J5 + RGlzYWJsZQ== + TW9kaWZ5 + RWRpdGVkIEJ5 + RWRpdG9ycyBQaWNr + RWRpdG9yJ3MgUGlja3M= + RWRpdCBUb3BpYyBSZXN1bHRz + VG9waWMgbW9kaWZpZWQ= + VG9waWMgaGFzIGJlZW4gbW9kaWZpZWQgcGVuZGluZyBhZG1pbmlzdHJhdGl2ZSBhcHByb3ZhbA== + Q2hhbmdlcyBtYWRlIHRvIHRoZSB0b3BpYyBoYXZlIGJlZW4gc2F2ZWQu + TW9kaWZ5IFBvc3Q= + TW9kaWZ5IFRvcGlj + RS1NYWls + QSB1c2VyIHdpdGggc3VjaCBlLW1haWwgYWxyZWFkeSBleGlzdHMu + TWFpbCBzZW5kaW5nIGZhaWxlZA== + RW5hYmxlZA== + RW5kIE9u + Wm9vbSBpbg== + RW50ZXI= + RnJpZW5kJ3MgZS1tYWlsIGFkZHJlc3M= + WW91ciBlLW1haWwgYWRkcmVzcw== + RW50ZXIgeW91ciBFbWFpbCBBZGRyZXNzIGJlbG93IHRvIGhhdmUgeW91ciBhY2NvdW50IGluZm9ybWF0aW9uIHNlbnQgdG8gdGhlIGVtYWlsIGFkZHJlc3Mgb2YgeW91ciBhY2NvdW50Lg== + RW50ZXIgeW91ciBVc2VybmFtZSBvciBFbWFpbCBBZGRyZXNzIGJlbG93IHRvIGhhdmUgeW91ciBhY2NvdW50IGluZm9ybWF0aW9uIHNlbnQgdG8gdGhlIGVtYWlsIGFkZHJlc3Mgb2YgeW91ciBhY2NvdW50Lg== + WW91IGhhdmUgYWxyZWFkeSByZXZpZXdlZCB0aGlzIGl0ZW0hIFlvdXIgYXBwcm92ZWQgcmV2aWV3cyBhcmUgbGlzdGVkIGJlbG93Lg== + TWlzc2luZyBvciBpbnZhbGlkIHZhbHVlcy4gUGxlYXNlIGNoZWNrIGFsbCB0aGUgZmllbGRzIGFuZCB0cnkgYWdhaW4u + U29ycnksIHRoZSByZXF1ZXN0ZWQgVVJMIHdhcyBub3QgZm91bmQgb24gb3VyIHNlcnZlci4= + RXJyb3IgNDA0IC0gTm90IEZvdW5k + Q2F0ZWdvcnkgYWxyZWFkeSBhZGRlZCE= + Q2F0ZWdvcnkgbGltaXQgcmVhY2hlZCE= + UmVxdWlyZWQ= + RXJyb3I= + RXJyb3I= + VXNlciBOb3QgRm91bmQ= + RXhpc3RpbmcgVXNlcnM= + RXhwaXJlcw== + RmFsc2U= + RmF2b3JpdGU= + VW5hYmxlIHRvIGFkZCBmYXZvcml0ZSwgYWNjZXNzIGRlbmllZA== + RmVi + WW91IG11c3QgZW50ZXIgYSBVc2VybmFtZSBvciBFbWFpbCBBZGRyZXNzIHRvIHJldHJpdmUgeW91ciBhY2NvdW50IGluZm9ybWF0aW9u + Qm90aCBhIFVzZXJuYW1lIGFuZCBQYXNzd29yZCBpcyByZXF1aXJlZA== + UGxlYXNlIGVudGVyIHlvdXIgcGFzc3dvcmQgYW5kIHRyeSBhZ2Fpbg== + WW91IGRpZCBub3QgZW50ZXIgeW91ciBVc2VybmFtZQ== + RGF0ZSBvZiBiaXJ0aCBpcyByZXF1aXJlZA== + TWlzc2luZyBmaXJzdCBuYW1l + TWlzc2luZyB1c2Vy + RGF0ZSBvZiBiaXJ0aCBpcyByZXF1aXJlZA== + RW1haWwgaXMgcmVxdWlyZWQ= + Rmlyc3QgbmFtZSBpcyByZXF1aXJlZA== + UGFzc3dvcmQgcmVxdWlyZWQ= + QWNjZXNzIGRlbmllZA== + UGFzc3dvcmRzIGRvIG5vdCBtYXRjaA== + VGhlIHBhc3N3b3JkIGlzIHRvbyBsb25n + UGFzc3dvcmQgaXMgdG9vIHNob3J0 + Tm90IHJlc2V0 + WW91IGhhdmUgYWxyZWFkeSByZXZpZXdlZCB0aGlzIGl0ZW0u + RmlsZSBpcyB0b28gbGFyZ2U= + VXNlciBhY2NvdW50IHdpdGggZ2l2ZW4gRS1tYWlsIG5vdCBmb3VuZA== + VXNlciBhY2NvdW50IHdpdGggZ2l2ZW4gVXNlcm5hbWUgbm90IGZvdW5k + VXNlciBuYW1lIGlzIHRvbyBzaG9ydA== + V3JvbmcgZmlsZSB0eXBl + Y2Mx + Y2My + Y2Mz + Y2M0 + Y2M1 + Y2M2 + bGMx + bGMy + bGMz + bGM0 + bGM1 + bGM2 + dWMx + dWMy + dWMz + dWM0 + dWM1 + dWM2 + QXJjaGl2ZSBEYXRl + QXJ0aWNsZSBBdXRob3I= + QXJ0aWNsZSBCb2R5 + TnVtYmVyIG9mIERlc2NlbmRhbnRz + Q2F0ZWdvcnkgUGF0aA== + UmF0aW5n + TnVtYmVyIG9mIFJldmlld3M= + TnVtYmVyIG9mIFJhdGluZyBWb3Rlcw== + Q2F0ZWdvcnkgSWQ= + Q2l0eQ== + Q291bnRyeQ== + Q3JlYXRlZCBCeSBVc2VyIElE + RGF0ZSBDcmVhdGVk + RGVzY3JpcHRpb24= + RGF0ZSBvZiBCaXJ0aA== + RWRpdG9yJ3MgcGljaw== + RS1tYWls + RW5kcyBPbg== + QXJ0aWNsZSBFeGNlcnB0 + Rmlyc3QgTmFtZQ== + SGl0cw== + SXRlbSBJcyBIb3Q= + TGFzdCBOYW1l + TGFzdCBQb3N0IElE + Q2F0ZWdvcnkgTGVhZCBTdG9yeT8= + TGVhZCBTdG9yeT8= + TGluayBJRA== + TG9naW4gKFVzZXIgbmFtZSk= + TWV0YSBEZXNjcmlwdGlvbg== + TWV0YSBLZXl3b3Jkcw== + TGFzdCBNb2RpZmllZCBEYXRl + TW9kaWZpZWQgQnkgVXNlciBJRA== + TmFtZQ== + SXRlbSBJcyBOZXc= + QXJ0aWNsZSBJRA== + Tm90aWZ5IE93bmVyIG9mIENoYW5nZXM= + T3JpZ2luYWwgSXRlbSBJRA== + T3duZXIgVXNlciBJRA== + UGFyZW50IElk + UGFyZW50IENhdGVnb3J5IFBhdGg= + UGFzc3dvcmQ= + VGVsZXBob25l + SXRlbSBJcyBQb3B1bGFy + VXNlciBJRA== + UG9zdGVkIEJ5 + VG9waWMgUG9zdHM= + UHJpb3JpdHk= + UXR5IFNvbGQ= + UmVzb3VyY2UgSUQ= + U3RhcnQgRGF0ZQ== + U3RhdGU= + U3RhdHVz + U3RyZWV0IEFkZHJlc3M= + QXJ0aWNsZSBUZXh0 + QXJ0aWNsZSBUaXRsZQ== + VG9waWMgSUQ= + VG9waWMgVGV4dA== + VG9waWMgVHlwZQ== + SXRlbSBJcyBhIFRvcCBTZWxsZXI= + VGltZSBab25l + VVJM + Vmlld3M= + WmlwIChQb3N0YWwpIENvZGU= + Rmlyc3QgTmFtZQ== + QWRkcmVzcyBsaW5lIDE= + QWRkcmVzcyBsaW5lIDI= + RGF0ZSBvZiBiaXJ0aA== + Qm9keQ== + Q2FwdGNoYSBJbWFnZQ== + Q2l0eQ== + UXVlc3Rpb25z + Q29tcGFueQ== + Q291bnRyeQ== + RGVzY3JpcHRpb24= + RHVyYXRpb24= + RS1NYWls + RmF4 + UHJpbWFyeSBGaWxl + Mm5kIEZpbGU= + M3JkIEZpbGU= + RmlsZW5hbWU= + Rmlyc3QgbmFtZQ== + RnVsbCBuYW1l + Mm5kIEltYWdl + M3JkIEltYWdl + TGFzdCBuYW1l + VXNlcm5hbWU= + TW9kdWxl + QWRkaXRpb25hbCBDYXRlZ29yaWVz + TmFtZQ== + UGFzc3dvcmQ= + UGhvbmU= + UGhyYXNl + UHJpY2U= + UHJpbWFyeSBJbWFnZQ== + UHJpbWFyeSBUcmFuc2xhdGlvbg== + UmF0aW5n + UmVmZXJyZXI= + UmV2aWV3IHRleHQ= + UGxlYXNlIHNlbGVjdCB5b3VyIGFkZHJlc3M= + U2l6ZQ== + U3RhdGU= + U3RyZWV0 + VGl0bGU= + VHJhbnNsYXRpb24= + VmVyaWZ5IFBhc3N3b3Jk + VmVyc2lvbg== + WmlwIGNvZGU= + WmlwIGNvZGU= + SW5ib3g= + Rm9yZ290IHBhc3N3b3Jk + UGFzc3dvcmQgUmVxdWVzdCBDb25maXJtYXRpb24= + Q29uZmlybSBwYXNzd29yZCByZXNldA== + WW91IGhhdmUgY2hvc2VkIHRvIHJlc2V0IHlvdXIgcGFzc3dvcmQuIEEgbmV3IHBhc3N3b3JkIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBzeXN0ZW0uIEl0IGhhcyBiZWVuIGVtYWlsZWQgdG8geW91ciBhZGRyZXNzIG9uIGZpbGUu + UGxlYXNlIGNvbmZpcm0gdGhhdCB5b3Ugd2FudCB0byByZXNldCB5b3VyIHBhc3N3b3JkLg== + Rm9yZ290IFBhc3N3b3Jk + Rm9yZ290IFBhc3N3b3Jk + RW50ZXIgeW91ciBVc2VybmFtZSBvciBFbWFpbCBBZGRyZXNzIGJlbG93IHRvIGhhdmUgeW91ciBhY2NvdW50IGluZm9ybWF0aW9uIHNlbnQgdG8gdGhlIGVtYWlsIGFkZHJlc3Mgb2YgeW91ciBhY2NvdW50Lg== + Rm9ydW1z + V2VsY29tZSB0byBJbi1wb3J0YWwgZm9ydW1zIQ== + V2VsY29tZSB0byBJbi1idWxsZXRpbiBGb3J1bXMh + Rm9ydW0gaXMgbG9ja2VkIGZvciBwb3N0aW5n + Rm91bmQ6 + RnJvbQ== + RnVsbCBuYW1l + RnVsbCBTdG9yeQ== + R2V0dGluZyBSYXRlZA== + WW91IG1heSBwbGFjZSB0aGUgZm9sbG93aW5nIEhUTUwgY29kZSBvbiB5b3VyIHdlYiBzaXRlIHRvIGFsbG93IHlvdXIgc2l0ZSB2aXNpdG9ycyB0byB2b3RlIGZvciB0aGlzIHJlc291cmNl + R28= + R3Vlc3Q= + SGVscA== + SGVyZQ== + SGl0cw== + SGl0cyBIbyB0byBMb3c= + SGl0cyBMb3cgdG8gSGk= + SG9tZQ== + SG90 + SG90IExpbmtz + aW4= + SW5ib3g= + VXNlcm5hbWUvUGFzc3dvcmQgSW5jb3JyZWN0 + SW5kaWNhdGVzIFJlcXVpcmVkIGZpZWxkcw== + SW52YWxpZCBlLW1haWwgYWRkcmVzcw== + RS1tYWlsIGFkZHJlc3MgbWlzc2luZyBvciBpbnZhbGlk + SW52YWxpZCBQYXNzd29yZA== + SW4gdGhpcyBtZXNzYWdl + UHJpbWFyeSBDYXRlZ29yeQ== + SXRlbXMgUGVyIFBhZ2U= + SXRlbXMgc2luY2UgbGFzdCBsb2dpbg== + SmFu + Sm9pbmVk + SnVs + SnVu + S2V5d29yZCBpcyB0b28gc2hvcnQ= + TGFzdCBQb3N0 + TGFzdCBQb3N0IEJ5 + TGFzdCBVcGRhdGU= + TGFzdCBOYW1l + TGVnZW5k + TGlua3M= + bGlua3MgdXBkYXRlZA== + WW91ciByZXZpZXcgaGFzIGJlZW4gYWRkZWQgcGVuZGluZyBhZG1pbmlzdHJhdGl2ZSBhcHByb3ZhbA== + WW91ciByZXZpZXcgaGFzIGJlZW4gYWRkZWQ= + TGluayBEZXRhaWxz + TGluayBJbmZvcm1hdGlvbg== + TGluayBOYW1l + TGluayBSYXRpbmcgUmVzdWx0cw== + WW91IGhhdmUgYWxyZWFkeSByYXRlZCB0aGlzIGxpbmsu + VGhhbmsgZm9yIHJhdGluZyB0aGlzIGxpbmsuICBZb3VyIGlucHV0IGhhcyBiZWVuIHJlY29yZGVkLg== + TGluayBSZXZpZXdz + TGluayBSZXZpZXcgUmVzdWx0cw== + TGluayBSZXZpZXcgUGVuZGluZw== + TGluayBTZWFyY2ggUmVzdWx0cw== + TG9jYXRpb24= + TG9ja2VkIHRvcGlj + TG9jay9VbmxvY2s= + TG9naW4= + TG9naW4gSW5mb3JtYXRpb24= + TG9naW4gTmFtZQ== + TG9naW4= + TG9nIE91dA== + TG9nb3V0IG9mIHlvdXIgYWNjb3VudA== + TG9nIG91dCBvZiB0aGUgc3lzdGVt + TWFpbGluZyBMaXN0 + TWFy + TWF5 + TWVzc2FnZQ== + TWVzc2FnZSBCb2R5 + UGFzc3dvcmQgcmVzZXQgaW50ZXJ2YWw= + TWlzc2luZyBUZW1wbGF0ZQ== + TW9kaWZpZWQ= + TGluayBNb2RpZmljYXRpb24gQ29uZmlybWF0aW9u + WW91ciBsaW5rIGhhcyBiZWVuIG1vZGlmaWVkLg== + TGluayBtb2RpZmljYXRpb24gY29tcGxldGU= + WW91ciBsaW5rIG1vZGlmaWNhdGlvbiBoYXMgYmVlbiBzdWJtaXR0ZWQgcGVuZGluZyBhZG1pbmlzdHJhdGl2ZSBhcHByb3ZhbA== + TW9kaWZ5IExpbms= + TW9yZQ== + TW9yZSBkZXRhaWxz + TW9yZSBJbmZv + V2VsY29tZQ== + TXkgQWNjb3VudA== + TXkgRmF2b3JpdGVz + TXkgUHJlZmVyZW5jZXM= + TXkgUHJvZmlsZQ== + TXkgQXJ0aWNsZXM= + TmV3cyBBcnRpY2xlcyB5b3UgaGF2ZSB3cml0dGVu + TXkgRmF2b3JpdGVz + SXRlbXMgeW91IGhhdmUgbWFya2VkIGFzIGZhdm9yaXRl + TXkgRnJpZW5kcw== + VmlldyB5b3VyIGxpc3Qgb2YgZnJpZW5kcw== + TXkgUHJvZmlsZQ== + WW91ciBBY2NvdW50IEluZm9ybWF0aW9u + TXkgSXRlbXM= + TXkgTGlua3M= + TGlua3MgeW91IGhhdmUgYWRkZWQgdG8gdGhlIHN5c3RlbQ== + TXkgRmF2b3JpdGVz + TXkgTmV3cw== + RmF2b3JpdGUgQXJ0aWNsZXM= + TXkgUHJlZmVyZW5jZXM= + RWRpdCB5b3VyIEluLVBvcnRhbCBQcmVmZXJlbmNlcw== + TXkgUHJvZmlsZQ== + TXkgVG9waWNz + RGlzY3Vzc2lvbnMgeW91IGhhdmUgY3JlYXRlZA== + TXkgVG9waWNz + TmFtZQ== + QWRkIExpbms= + TmV3 + TmV3IEN1c3RvbWVycw== + TmV3IFByaXZhdGUgTWVzc2FnZSBDb25maXJtYXRpb24= + WW91ciBwcml2YXRlIG1lc3NhZ2UgaGFzIGJlZW4gc2VudC4= + TmV3cw== + VGhlIGFydGljbGUgcmV2aWV3IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBkYXRhYmFzZS4= + QXJ0aWNsZSByZXZpZXcgaGFzIGJlZW4gc3VibWl0dGVkIHBlbmRpbmcgYWRtaW5pc3RyYXRpdmUgYXBwcm92YWw= + TmV3cyBEZXRhaWxz + UmF0ZSBBcnRpY2xlIFJlc3VsdHM= + WW91IGhhdmUgYWxyZWFkeSByYXRlZCB0aGlzIGFydGljbGU= + VGhhbmsgeW91IGZvciByYXRpbmcgdGhpcyBhcnRpY2xlLiBZb3VyIHZvdGUgaGFzIGJlZW4gcmVjb3JkZWQu + VGhlIHJldmlldyBoYXMgYmVlbiBhZGRlZA== + QXJ0aWNsZSByZXZpZXcgc3VibWl0dGVk + U2VhcmNoIFJlc3VsdHM= + bmV3cyB1cGRhdGVk + QWRkIFRvcGljIFJlc3VsdHM= + WW91ciB0b3BpYyBoYXMgYmVlbiBhZGRlZA== + VGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIG11c3QgYXBwcm92ZSB5b3VyIHRvcGljIGJlZm9yZSBpdCBpcyBwdWJsaWNseSBhdmFpbGFibGUu + VGhlIFRvcGljIHlvdSBoYXZlIGNyZWF0ZWQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHN5c3RlbQ== + TmV3IGFydGljbGVz + TmV3IExpbmtz + TmV3IGFydGljbGVz + TmV3IFByaXZhdGUgTWVzc2FnZQ== + Rm9ydW0gaGFzIG5ldyBwb3N0cw== + TmV3IHByaXZhdGUgbWVzc2FnZQ== + TmV3IGxpbmtz + TmV3IGFydGljbGVz + TmV3IHRvcGljcw== + TmV3IFRvcGlj + TmV3IFVzZXJz + Tm8= + U29ycnksIHlvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIHBhZ2Uh + Tm8gQ2F0ZWdvcmllcw== + Tm8gZmF2b3JpdGUgaXRlbXMgc2F2ZWQ= + Tm8gbWVtYmVycyBmb3VuZA== + Tm9uZQ== + QmUgdGhlIGZpcnN0IHRvIHJldmlldw== + Tm90aWZ5IG1lIHdoZW4gcG9zdHMgYXJlIG1hZGUgaW4gdGhpcyB0b3BpYw== + bm90IGxvZ2dlZCBpbg== + Tm90IGxvZ2dlZCBpbg== + Tm92 + Tm8gQXJ0aWNsZXM= + Tm8gQ2F0ZWdvcmllcw== + Tm8gZXhwaXJhdGlvbg== + Tm8gZmF2b3JpdGVz + Tm8gSXRlbXM= + S2V5d29yZCBtaXNzaW5n + Tm8gTGlua3M= + Rm9ydW0gaGFzIG5vIG5ldyBwb3N0cw== + Tm8gUGVybWlzc2lvbnM= + Tm8gUmVsYXRlZCBDYXRlZ29yaWVz + RXJyb3I6IG5vIHNlc3Npb24= + TWlzc2luZyB0ZW1wbGF0ZQ== + Tm8gVG9waWNz + T2N0 + b2Y= + T2ZmbGluZQ== + T2s= + T2xkIHRvIFJlY2VudA== + b24= + T25saW5l + b24gdGhpcyBwb3N0 + WW91IGRvIG5vdCBoYXZlIGFjY2VzcyB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9u + T3B0aW9uYWw= + T3B0aW9ucw== + U2VsZWN0IENhdGVnb3J5 + b3I= + UGFnZQ== + UGFnZTo= + UGFzc3dvcmQ= + UGFzc3dvcmRzIGRvIG5vdCBtYXRjaA== + UGFzc3dvcmQgaXMgdG9vIHNob3J0LCBwbGVhc2UgZW50ZXIgYXQgbGVhc3QgJXMgY2hhcmFjdGVycw== + UGFzc3dvcmQgQWdhaW4= + cGVuZGluZyBpdGVt + UGVuZGluZyBBcHByb3ZhbA== + QWRtaW4gTG9naW4= + QWRkIFBlbmRpbmcgQ2F0ZWdvcnk= + QWRkIENhdGVnb3J5 + RGVsZXRlIENhdGVnb3J5 + TW9kaWZ5IENhdGVnb3J5 + VmlldyBDYXRlZ29yeQ== + QXBwZW5kIHBocGluZm8gdG8gYWxsIHBhZ2VzIChEZWJ1Zyk= + RGlzcGxheSBJdGVtIFF1ZXJpZXMgKERlYnVnKQ== + RGlzcGxheSBJdGVtIExpc3QgUXVlcmllcyAoRGVidWcp + QWxsb3cgZmF2b3JpdGVz + UGVuZGluZyBMaW5r + QWRkIExpbms= + RGVsZXRlIExpbms= + TW9kaWZ5IExpbmsgUGVuZGluZw== + TW9kaWZ5IExpbms= + TGluayBEZWxldGUgYnkgT3duZXI= + TGluayBNb2RpZnkgUGVuZGluZyBieSBPd25lcg== + TGluayBNb2RpZnkgYnkgT3duZXI= + UmF0ZSBMaW5r + UmV2aWV3IExpbms= + UmV2aWV3IExpbmsgUGVuZGluZw== + VmlldyBMaW5r + QWxsb3cgTG9naW4= + QWRkIFBlbmRpbmcgTmV3cw== + QWRkIE5ld3M= + RGVsZXRlIE5ld3M= + TW9kaWZ5IE5ld3M= + UmF0ZSBOZXdz + UmV2aWV3IE5ld3MgUGVuZGluZw== + UmV2aWV3IE5ld3M= + VmlldyBOZXdz + Q2hhbmdlIFVzZXIgUHJvZmlsZXM= + U2hvdyBMYW5ndWFnZSBUYWdz + QWRkIFBlbmRpbmcgVG9waWM= + QWRkIFRvcGlj + RGVsZXRlIFRvcGlj + TG9jay9VbmxvY2sgVG9waWNz + TW9kaWZ5IFRvcGljIFBlbmRpbmc= + TW9kaWZ5IFRvcGlj + VG9waWMgT3duZXIgRGVsZXRl + T3duZXIgTW9kaWZ5IFRvcGljIFBlbmRpbmc= + VG9waWMgT3duZXIgTW9kaWZ5 + UmF0ZSBUb3BpYw== + QWRkIFRvcGljIFJlcGx5 + RGVsZXRlIFRvcGlj + UmVwbHkgVG9waWMgTW9kaWZ5 + UG9zdCBPd25lciBEZWxldGU= + UG9zdCBPd25lciBNb2RpZnk= + VmlldyBUb3BpYyBSZXBseQ== + UmV2aWV3IFRvcGlj + VmlldyBUb3BpYw== + UGhvbmU= + UGljaw== + RWRpdG9yJ3MgUGljayBMaW5rcw== + RWRpdG9yJ3MgUGljayBBcnRpY2xlcw== + RWRpdG9yJ3MgcGljayB0b3BpY3M= + UGxlYXNlIFJlZ2lzdGVy + QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHByaXZhdGUgbWVzc2FnZT8= + UHJpdmF0ZSBNZXNzYWdlcw== + UHJpdmF0ZSBNZXNzYWdlcw== + UG9wdWxhcg== + TW9zdCBQb3B1bGFyIExpbmtz + UG9zdA== + UG9zdGVk + UG9zdGVy + cG9zdHM= + cG9zdHMgdXBkYXRlZA== + UG93ZXJlZCBieQ== + Q2l0eQ== + Q29tcGFueQ== + Q291bnRyeQ== + QmlydGhkYXRl + RS1tYWls + RmF4 + Rmlyc3QgTmFtZQ== + TGFzdCBOYW1l + UGhvbmU= + U3RhdGU= + U3RyZWV0 + U3RyZWV0IDI= + Wmlw + UHJpdmFjeQ== + UHJpdmFjeSBQb2xpY3k= + UHJpdmF0ZSBtZXNzYWdlcyB1cGRhdGVk + UHJpdmF0ZSBNZXNzYWdlcw== + UHJvZHVjdHMgdXBkYXRlZA== + UHJvZmlsZQ== + UHJvZmlsZQ== + cHJvZmlsZSB1cGRhdGVk + QXZhdGFyIEltYWdl + RGVzY3JpcHRpb24= + Q2F0ZWdvcnkgTmFtZQ== + RW1haWw= + RnVsbC1TaXplIEltYWdlOg== + RGVzY3JpcHRpb24= + TGluayBOYW1l + VVJM + TWV0YSBUYWcgRGVzY3JpcHRpb24= + TWV0YSBUYWcgS2V5d29yZHM= + UGFzc3dvcmQ= + UG9zdHMgUGVyIFBhZ2U= + VG9waWNzIFBlciBQYWdl + UG9zdCBTdWJqZWN0 + UmVjb21tZW5kIHRoaXMgc2l0ZSB0byBhIGZyaWVuZA== + UmV2aWV3Og== + U2lnbmF0dXJl + RW50ZXIgeW91ciBlLW1haWwgYWRkcmVzcyB0byBzdWJzY3JpYmUgdG8gdGhlIG1haWxpbmcgbGlzdC4= + VGh1bWJuYWlsIEltYWdlOg== + VXNlcm5hbWU= + RGlzcGxheSB0byBQdWJsaWM= + UXVlcnkgU3RyaW5n + UXVlc3Rpb25z + UXVpY2sgU2VhcmNo + UXVpY2sgTGlua3M= + UmVwbHkgUXVvdGVk + UmF0ZSBUaGlzIExpbms= + VW5hYmxlIHRvIHJhdGUsIGFjY2VzcyBkZW5pZWQ= + UmF0ZSB0aGlzIGFydGljbGU= + UmF0ZSBMaW5r + UmF0ZSBBcnRpY2xl + UmF0ZSB0aGlzIGFydGljbGU= + UmF0ZSBUb3BpYw== + UmF0aW5n + UmF0aW5nIEhpIHRvIExvdw== + UmF0aW5nIExvdyB0byBIaQ== + UG9vcg== + RmFpcg== + QXZlcmFnZQ== + R29vZA== + VmVyeSBHb29k + RXhjZWxsZW50 + QWxyZWFkeSB2b3RlZA== + VW5hYmxlIHRvIHJlYWQgZnJvbSBmaWxl + UmVjZW50IHRvIE9sZA== + VGhlIHJlY2lwaWVudCBpcyByZXF1aXJlZA== + VXNlciBkb2VzIG5vdCBleGlzdA== + VGhlIHJlY2lwaWVudCBkb2VzIG5vdCBleGlzdA== + UmVjb21tZW5k + UmVjb21tZW5kIHRvIGEgRnJpZW5k + UmVjb21tZW5kYXRpb24gQ29uZmlybWF0aW9u + VGhhbmtzIGZvciByZWNvbW1lbmRpbmcgb3VyIHNpdGUgdG8geW91ciBmcmllbmQuIFRoZSBlbWFpbCBoYXMgYmVlbiBzZW50IG91dC4= + UmVjb21tZW5kIHRvIGEgZnJpZW5k + Q2xpY2sgaGVyZSBpZiB5b3VyIGJyb3dzZXIgZG9lcyBub3QgYXV0b21hdGljYWxseSByZWRpcmVjdCB5b3Uu + UmVkaXJlY3RpbmcgLi4u + UmVnaXN0ZXI= + UmVnaXN0cmF0aW9uIENvbmZpcm1hdGlvbg== + UmVnaXN0cmF0aW9uIENvbXBsZXRl + VGhhbmsgeW91IGZvciBSZWdpc3RlcmluZyEgIFBsZWFzZSBlbnRlciB5b3VyIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBiZWxvdw== + UmVnaXN0ZXIgd2l0aCBJbi1Qb3J0YWwgZm9yIGNvbnZlbmllbnQgYWNjZXNzIHRvIHVzZXIgYWNjb3VudCBzZXR0aW5ncyBhbmQgcHJlZmVyZW5jZXMu + VGhhbmsgWW91LiBSZWdpc3RyYXRpb24gY29tcGxldGVkLg== + WW91ciBsb2dpbiBpbmZvcm1hdGlvbiBoYXMgYmVlbiBlbWFpbGVkIHRvIHlvdS4gUGxlYXNlIGNoZWNrIHlvdXIgZW1haWwu + UmVsYXRlZCBhcnRpY2xlcw== + UmVsYXRlZCBDYXRlZ29yaWVz + UmVsYXRlZCBDYXRlZ29yaWVz + UmVsYXRlZCBMaW5rcw== + UmVsYXRlZCBOZXdz + UmVsZXZhbmNl + UmVtZW1iZXIgTG9naW4= + UmVtb3Zl + UmVtb3ZlIEZyb20gRmF2b3JpdGVz + UmVwZWF0IFBhc3N3b3Jk + UmVwbGllcw== + UmVwbHk= + UmVxdWlyZWQgRmllbGQ= + UmVzZXQ= + QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlc2V0IHRoZSBwYXNzd29yZD8= + UGxlYXNlIGNvbmZpcm0gdGhhdCB5b3Ugd2FudCB0byByZXNldCB5b3VyIHBhc3N3b3JkLg== + UmV0dXJuIHRvIGhvbWVwYWdl + UmV2aWV3cw== + cmV2aWV3cyB1cGRhdGVk + VW5hYmxlIHRvIHJldmlldywgYWNjZXNzIGRlbmllZA== + UmV2aWV3IGFydGljbGU= + UmV2aWV3IExpbms= + UmV2aWV3IG5ld3MgYXJ0aWNsZQ== + UmV2aWV3IHRoaXMgYXJ0aWNsZQ== + SG9tZQ== + U2VhcmNo + U2VhcmNoZWQgRm9yOg== + U2VhcmNoIFByb2R1Y3Rz + U2VhcmNoIEFydGljbGVz + U2VhcmNoIENhdGVnb3JpZXM= + U2VhcmNoIExpbmtz + U2VhcmNoIFRvcGljcw== + U2VhcmNoIEFnYWlu + Rm9ybSBFcnJvcg== + U2VhcmNoIFJlc3VsdHM= + U2VhcmNoIFRpcHM= + U2VhcmNoIFR5cGU= + U2VhcmNoIFJlc3VsdHM= + QWRkaXRpb25hbCBJbWFnZXM= + SW1hZ2Vz + TXlBY2NvdW50 + TXkgSXRlbXM= + UmV2aWV3cw== + U2VlIEFsc28= + U2VsZWN0IExhbmd1YWdl + U2VsZWN0IFRoZW1l + U2VsZWN0IFVzZXJuYW1l + U2VuZA== + U2VuZCBQcml2YXRlIE1lc3NhZ2U= + U2VudA== + U2Vw + U2hvcHBpbmcgQ2FydA== + U2hvdw== + U2hvdyBTaWduYXR1cmU= + U2hvdyBNeSBTaWduYXR1cmU= + U2l0ZSBMZWFkIFN0b3J5 + U2l0ZW1hcA== + U2l0ZSBNYXA= + U21pbGV5cw== + U29ydGVkIGxpc3Q= + U29ydA== + U3RhdGU= + U3RhdGlzdGljcw== + U3RyZWV0 + U3RyZWV0IDI= + QWxzbyBZb3UgQ2FuOg== + U3ViY2F0ZWdvcmllcw== + U3ViamVjdA== + U3VibWl0dGluZyB0bw== + U3Vic2NyaXB0aW9uIGRlbmllZA== + U3Vic2NyaXB0aW9uIENvbmZpcm1hdGlvbg== + QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHN1YnNjcmliZSB0byBvdXIgbWFpbGluZyBsaXN0PyAoWW91IGNhbiB1bnN1YnNjcmliZSBhbnkgdGltZSBieSBlbnRlcmluZyB5b3VyIGVtYWlsIG9uIHRoZSBmcm9udCBwYWdlKS4= + VGhhbmsgeW91IGZvciBzdWJzY3JpYmluZyB0byBvdXIgbWFpbGluZyBsaXN0IQ== + Rm9ybSBFcnJvcg== + TWlzc2luZyBlbWFpbCBhZGRyZXNz + RS1tYWlsIGFkZHJlc3MgbWlzc2luZyBvciBpbnZhbGlk + U3Vic2NyaXB0aW9uIHN1Y2Nlc3NmdWw= + U3Vic2NyaWJlZA== + VW5kZWZpbmVkIGVycm9yIG9jY3VycmVkLCBzdWJzY3JpcHRpb24gbm90IGNvbXBsZXRlZA== + U3VibWl0dGluZyB0byBDYXRlZ29yaWVz + U3VnZ2VzdCBDYXRlZ29yeQ== + U3VnZ2VzdCBDYXRlZ29yeQ== + Q2F0ZWdvcnkgU3VnZ2VzdGVkIChQZW5kaW5nIEFwcHJvdmFsKQ== + Rm9ybSBFcnJvcg== + U3VnZ2VzdCBMaW5r + RS1tYWlsIGFkZHJlc3MgbWlzc2luZyBvciBpbnZhbGlk + VGhhbmsgeW91IGZvciBzdWdnZXN0aW5nIG91ciBzaXRlIHRv + UHJpdmFjeQ== + VGVtcGxhdGUgRXJyb3I= + VGVybXMgYW5kIENvbmRpdGlvbnMgb2YgVXNl + IFdlIGFyZSBzb3JyeSB5b3UgaGF2ZSB1bnN1YnNjcmliZWQgZnJvbSBvdXIgbWFpbGluZyBsaXN0 + WW91ciBwYXNzd29yZCBoYXMgYmVlbiByZXNldC4gVGhlIG5ldyBwYXNzd29yZCBoYXMgYmVlbiBzZW50IHRvIHlvdXIgZS1tYWlsIGFkZHJlc3MuIFlvdSBtYXkgbm93IGxvZ2luIHdpdGggdGhlIG5ldyBwYXNzd29yZC4= + WW91IGhhdmUgY2hvc2VuIHRvIHJlc2V0IHlvdXIgcGFzc3dvcmQuPEJSLz48QlIvPg0KQW4gYXV0b21hdGljIGVtYWlsIGhhcyBiZWVuIHNlbnQgdG8geW91ciBlbWFpbCBhZGRyZXNzIG9uIGZpbGUuIFBsZWFzZSBmb2xsb3cgdGhlIGxpbmsgaW4gdGhlIGVtYWlsIGluIG9yZGVyIHRvIHJlY2VpdmUgYSBuZXcgcGFzc3dvcmQu + S2V5d29yZA== + VGhlIGtleXdvcmQgaXMgdG9vIHNob3J0 + Tm8gcGVybWlzc2lvbnMgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbg== + Tm8gcGVybWlzc2lvbnMgdG8gc3VnZ2VzdCBuZXcgY2F0ZWdvcmllcyBpbnRvIGN1cnJlbnQgY2F0ZWdvcnku + Tm90aGluZyBGb3VuZA== + NDA0LiBQYWdlIG5vdCBmb3VuZCBvbiB0aGUgc2VydmVyLg== + UGxlYXNlIGNvbmZpcm0gdGhhdCB5b3Ugd2FudCB0byByZXNldCB5b3VyIHBhc3N3b3JkLg== + VGhhbmsgeW91IGZvciByZWdpc3RlcmluZyBvbiBvdXIgd2Vic2l0ZS4gWW91ciByZWdpc3RyYXRpb24gaXMgcGVuZGluZyBhZG1pbmlzdHJhdGl2ZSBhcHByb3ZhbC4gWW91IHdpbGwgZ2V0IGEgc2VwYXJhdGUgZW1haWwgb25jZSBpdCdzIGFjdGl2YXRlZC4= + VGhhbmsgeW91IGZvciBzdWdnZXN0aW5nIHlvdXIgY2F0ZWdvcnku + U3VnZ2VzdGVkIGNhdGVnb3J5IGlzIHBlbmRpbmcgZm9yIEFkbWluaXN0cmF0aXZlIGFwcHJvdmFsIA== + VGhhbmsgeW91IGZvciBzdWJtaXR0aW5nIHlvdXIgcmVxdWVzdC4= + VGhhbmsgeW91IGZvciBzdWJzY3JpYmluZyB0byBvdXIgbWFpbGluZyBsaXN0 + Q3VycmVudCBDYXRlZ29yeQ== + QWN0aW9uIEJveA== + QWRkaW5nIEFkZHJlc3M= + QWR2ZXJ0aXNlbWVudHM= + Q2F0ZWdvcmllcw== + Q29uZmlybWF0aW9u + Q29udGVudCBQYWdlcw== + RWRpdCBBZGRyZXNz + WW91ciBGYXZvcml0ZSBJdGVtcw== + WW91ciBGYXZvcml0ZXM= + Rm9yZ290IFBhc3N3b3Jk + Rm9yZ290IFBhc3N3b3JkIENvbmZpcm1hdGlvbg== + Rm9yZ290IFBhc3N3b3JkIE5vdGlmaWNhdGlvbg== + TG9naW4gQm94 + TWFpbGluZyBMaXN0 + TWVtYmVycw== + TWlzc2luZyBQaHJhc2UgQWRkaW5n + TXkgQWNjb3VudA== + TXkgQWRkcmVzc2Vz + TXkgRmF2b3JpdGVz + TXkgSXRlbXM= + TXkgUHJlZmVyZW5jZXM= + TXkgUHJvZmlsZQ== + Tm8gUGVybWlzc2lvbg== + UGFnZSBOb3QgRm91bmQ= + UGFzc3dvcmQgUmVxdWVzdCBDb25maXJtYXRpb24= + UHJpdmFjeSBQb2xpY3k= + UmVjb21tZW5kIENvbmZpcm1hdGlvbg== + UmVjb21tZW5kIHRvIGEgRnJpZW5k + VXNlciBSZWdpc3RyYXRpb24gQ29uZmlybWF0aW9u + VXNlciBSZWdpc3RyYXRpb24gUGVuZGluZw== + UmVsYXRlZCBDYXRlZ29yaWVz + UmVsYXRlZCBJdGVtcw== + UmVsYXRlZCBTZWFyY2hlcw== + UmV2aWV3cw== + U2VhcmNoIEJveA== + U2VhcmNoIFJlc3VsdHM= + U2l0ZSBtYXA= + U3Vic2NyaXB0aW9uIENvbmZpcm1hdGlvbg== + U3Vic2NyaXB0aW9uIENvbmZpcm1lZA== + U3VnZ2VzdCBDYXRlZ29yeQ== + Q2F0ZWdvcnkgQWRkZWQ= + Q2F0ZWdvcnkgUGVuZGluZw== + VGVybXMgYW5kIENvbmRpdGlvbnM= + VGhhbmsgeW91IQ== + VW5zdWJzY3JpYmUgQ29uZmlybWF0aW9u + VW5zdWJzY3JpcHRpb24gQ29uZmlybWVk + VXNlciBQcm9maWxl + VXNlciBSZWdpc3RyYXRpb24= + V2VsY29tZSB0byBJbi1Qb3J0YWw= + VG8= + VG9wIFJhdGVk + VG9waWNz + VG9waWNzIFVwZGF0ZWQ= + VG9waWMgUmF0aW5nIFJlc3VsdHM= + WW91IGhhdmUgYWxyZWFkeSByYXRlZCB0aGlzIHRvcGlj + VGhhbmsgeW91IGZvciB2b3RpbmchICBZb3VyIGlucHV0IGhhcyBiZWVuIHJlY29yZGVkLg== + UG9zdCBSZXBseQ== + VG9waWMgU2VhcmNoIFJlc3VsdHM= + VG9waWMgVXBkYXRlZA== + VG9wIFJhdGVkIExpbmtz + VG90YWwgQ2F0ZWdvcmllcw== + VG90YWwgQ2F0ZWdvcmllcw== + VG90YWwgbGlua3MgaW4gdGhlIGRhdGFiYXNl + VG90YWwgQXJ0aWNsZXM= + VG90YWwgVG9waWNz + VHJ1ZQ== + Ti9B + U3lzdGVtIGVycm9yIGhhcyBvY2N1cmVk + VW5zb3J0ZWQgbGlzdA== + VW5zdWJzY3JpcHRpb24gQ29uZmlybWF0aW9u + QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVuc3Vic2NyaWJlIGZyb20gb3VyIG1haWxpbmcgbGlzdD8gKFlvdSBjYW4gYWx3YXlzIHN1YnNjcmliZSBhZ2FpbiBieSBlbnRlcmluZyB5b3VyIGVtYWlsIGF0IHRoZSBob21lIHBhZ2Up + V2UgYXJlIHNvcnJ5IHlvdSBoYXZlIHVuc3Vic2NyaWJlZCBmcm9tIG91ciBtYWlsaW5nIGxpc3Q= + VW5zdWJzY3JpYmU= + VXBkYXRl + VXNlcm5hbWU= + VXNlcnMgT25saW5l + QSB1c2VyIHdpdGggc3VjaCB1c2VybmFtZSBhbHJlYWR5IGV4aXN0cy4= + QSB1c2VyIHdpdGggc3VjaCB1c2VybmFtZS9lLW1haWwgYWxyZWFkeSBleGlzdHMu + VXNlciBhbHJlYWR5IGV4aXN0cw== + UGVuZGluZyBSZWdpc3RyYXRpb24gQ29tcGxldGU= + VGhhbmsgeW91IGZvciByZWdpc3RlcmluZy4gWW91ciByZWdpc3RyYXRpb24gaXMgcGVuZGluZyBhZG1pbmlzdHJhdGl2ZSBhcHByb3ZhbC4= + VmVyaWZ5IHBhc3N3b3Jk + Vmlld3M= + VmlldyBGbGF0 + VmlldyBQTQ== + VmlldyBVc2VyIFByb2ZpbGU= + VmlldyBUaHJlYWRlZA== + VmlldyBZb3VyIFByb2ZpbGU= + RGlyZWN0IGFjY2VzcyBvciBib29rbWFyaw== + Vm90ZXM= + Vm90ZXMgSGkgdG8gTG93 + Vm90ZXMgTG93IHRvIEhp + V2FybmluZw== + V2UgYWNjZXB0IGNyZWRpdCBjYXJkcw== + d3JvdGU= + WWVz + WW91ciBBY2NvdW50 + U2hvcHBpbmcgQ2FydA== + Q3VycmVuY3k= + TGFuZ3VhZ2U= + WW91ciBXaXNoIExpc3Q= + Wmlw + WklQIENvZGU= + WklQIENvZGU= + Wm9vbQ== + TXkgU2V0dGluZ3M= + TmV4dCBUaGVtZQ== + UHJldmlvdXMgVGhlbWU= + dGVzdCAy + + + U3ViamVjdDogQ2F0ZWdvcnkgYWRkZWQKCllvdXIgc3VnZ2VzdGVkIGNhdGVnb3J5ICI8aW5wOm1fY2F0ZWdvcnlfZmllbGQgX0ZpZWxkPSJOYW1lIiBfU3RyaXBIVE1MPSIxIi8+IiBoYXMgYmVlbiBhZGRlZC4= + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogQSBjYXRlZ29yeSBoYXMgYmVlbiBhZGRlZAoKQSBjYXRlZ29yeSAiPGlucDptX2NhdGVnb3J5X2ZpZWxkIF9GaWVsZD0iTmFtZSIgX1N0cmlwSFRNTD0iMSIvPiIgaGFzIGJlZW4gYWRkZWQu + + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogQ2F0ZWdvcnkgYWRkZWQgKHBlbmRpbmcpCgpBIGNhdGVnb3J5ICI8aW5wOm1fY2F0ZWdvcnlfZmllbGQgX0ZpZWxkPSJOYW1lIiBfU3RyaXBIVE1MPSIxIi8+IiBoYXMgYmVlbiBhZGRlZCwgcGVuZGluZyB5b3VyIGNvbmZpcm1hdGlvbi4gIFBsZWFzZSByZXZpZXcgdGhlIGNhdGVnb3J5IGFuZCBhcHByb3ZlIG9yIGRlbnkgaXQu + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogQSBjYXRlZ29yeSBoYXMgYmVlbiBhcHByb3ZlZAoKWW91ciBzdWdnZXN0ZWQgY2F0ZWdvcnkgIjxpbnA6bV9jYXRlZ29yeV9maWVsZCBfRmllbGQ9Ik5hbWUiIF9TdHJpcEhUTUw9IjEiLz4iIGhhcyBiZWVuIGFwcHJvdmVkLg== + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogQSBjYXRlZ29yeSBoYXMgYmVlbiBhcHByb3ZlZAoKQSBjYXRlZ29yeSAiPGlucDptX2NhdGVnb3J5X2ZpZWxkIF9GaWVsZD0iTmFtZSIgX1N0cmlwSFRNTD0iMSIvPiIgaGFzIGJlZW4gYXBwcm92ZWQu + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogQSBjYXRlZ29yeSBoYXMgYmVlbiBkZWxldGVkCgpBIGNhdGVnb3J5ICI8aW5wOm1fY2F0ZWdvcnlfZmllbGQgX0ZpZWxkPSJOYW1lIiBfU3RyaXBIVE1MPSIxIi8+IiBoYXMgYmVlbiBkZWxldGVkLg== + WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IEEgY2F0ZWdvcnkgaGFzIGJlZW4gZGVsZXRlZAoKQSBjYXRlZ29yeSAiPGlucDptX2NhdGVnb3J5X2ZpZWxkIF9GaWVsZD0iTmFtZSIgX1N0cmlwSFRNTD0iMSIvPiIgaGFzIGJlZW4gZGVsZXRlZC4= + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogQSBjYXRlZ29yeSBoYXMgYmVlbiBkZW5pZWQKCllvdXIgY2F0ZWdvcnkgc3VnZ2VzdGlvbiAiPGlucDptX2NhdGVnb3J5X2ZpZWxkIF9GaWVsZD0iTmFtZSIgX1N0cmlwSFRNTD0iMSIvPiIgaGFzIGJlZW4gZGVuaWVkLg== + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogQSBjYXRlZ29yeSBoYXMgYmVlbiBkZW5pZWQKCkEgY2F0ZWdvcnkgIjxpbnA6bV9jYXRlZ29yeV9maWVsZCBfRmllbGQ9Ik5hbWUiIF9TdHJpcEhUTUw9IjEiLz4iIGhhcyBiZWVuIGRlbmllZC4= + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogQSBjYXRlZ29yeSBoYXMgYmVlbiBtb2RpZmllZAoKWW91ciBzdWdnZXN0ZWQgY2F0ZWdvcnkgIjxpbnA6bV9jYXRlZ29yeV9maWVsZCBfRmllbGQ9Ik5hbWUiIF9TdHJpcEhUTUw9IjEiLz4iIGhhcyBiZWVuIG1vZGlmaWVkLg== + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogQSBjYXRlZ29yeSBoYXMgYmVlbiBtb2RpZmllZAoKQSBjYXRlZ29yeSAiPGlucDptX2NhdGVnb3J5X2ZpZWxkIF9GaWVsZD0iTmFtZSIgX1N0cmlwSFRNTD0iMSIvPiIgaGFzIGJlZW4gbW9kaWZpZWQu + WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IENvbW1vbiBGb290ZXIgVGVtcGxhdGUKCg== + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogSW4tcG9ydGFsIHJlZ2lzdHJhdGlvbgoKRGVhciA8aW5wOnRvdXNlciBfRmllbGQ9IkZpcnN0TmFtZSIgLz4gPGlucDp0b3VzZXIgX0ZpZWxkPSJMYXN0TmFtZSIgLz4sDQoNClRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDptX3BhZ2VfdGl0bGUgLz4uIFlvdXIgcmVnaXN0cmF0aW9uIGlzIG5vdyBhY3RpdmUu + WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IE5ldyB1c2VyIGhhcyBiZWVuIGFkZGVkCgpBIG5ldyB1c2VyICI8aW5wOnRvdXNlciBfRmllbGQ9IkxvZ2luIiAvPiIgaGFzIGJlZW4gYWRkZWQu + WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IEluLVBvcnRhbCBSZWdpc3RyYXRpb24KCkRlYXIgPGlucDp0b3VzZXIgX0ZpZWxkPSJGaXJzdE5hbWUiIC8+IDxpbnA6dG91c2VyIF9GaWVsZD0iTGFzdE5hbWUiIC8+LA0KDQpUaGFuayB5b3UgZm9yIHJlZ2lzdGVyaW5nIG9uIDxpbnA6bV9wYWdlX3RpdGxlIC8+LiBZb3VyIHJlZ2lzdHJhdGlvbiB3aWxsIGJlIGFjdGl2ZSBhZnRlciBhcHByb3ZhbC4= + WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IFVzZXIgcmVnaXN0ZXJlZAoKQSBuZXcgdXNlciAiPGlucDp0b3VzZXIgX0ZpZWxkPSJMb2dpbiIgLz4iIGhhcyByZWdpc3RlcmVkIGFuZCBpcyBwZW5kaW5nIGFkbWluaXN0cmF0aXZlIGFwcHJvdmFsLg== + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogWW91IGhhdmUgYmVlbiBhcHByb3ZlZAoKV2VsY29tZSB0byBJbi1wb3J0YWwhDQpZb3VyIHVzZXIgcmVnaXN0cmF0aW9uIGhhcyBiZWVuIGFwcHJvdmVkLiBZb3VyIHVzZXIgbmFtZSBpcyAiPGlucDp0b3VzZXIgX0ZpZWxkPSJVc2VyTmFtZSIgLz4iLg== + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogVXNlciBhcHByb3ZlZAoKVXNlciAiPGlucDp0b3VzZXIgX0ZpZWxkPSJVc2VyTmFtZSIgLz4iIGhhcyBiZWVuIGFwcHJvdmVkLg== + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogQWNjZXNzIGRlbmllZAoKWW91ciByZWdpc3RyYXRpb24gdG8gPGlucDptX3BhZ2VfdGl0bGUgLz4gaGFzIGJlZW4gZGVuaWVkLg== + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogVXNlciBkZW5pZWQKClVzZXIgIjxpbnA6dG91c2VyIF9GaWVsZD0iVXNlck5hbWUiIC8+IiBoYXMgYmVlbiBkZW5pZWQu + WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IE1lbWJlcnNoaXAgZXhwaXJhdGlvbiBub3RpY2UKCk1lbWJlcnNoaXAgZXhwaXJhdGlvbiBub3RpY2U= + WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IE1lbWJlcnNoaXAgZXhwaXJhdGlvbiBub3RpY2UKCk1lbWJlcnNoaXAgZXhwaXJhdGlvbiBub3RpY2U= + WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IE1lbWJlcnNoaXAgZXhwaXJlZAoKTWVtYmVyc2hpcCBleHBpcmVk + WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IE1lbWJlcnNoaXAgZXhwaXJlZAoKTWVtYmVyc2hpcCBleHBpcmVk + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogTG9zdCBwYXNzd29yZAoKWW91ciBsb3N0IHBhc3N3b3JkIGhhcyBiZWVuIHJlc2V0LiBZb3VyIG5ldyBwYXNzd29yZCBpczogIjxpbnAyOnVfRm9yZ290dGVuUGFzc3dvcmQgLz4iLg== + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogTG9zdCBwYXNzd29yZAoKWW91ciBsb3N0IHBhc3N3b3JkIGhhcyBiZWVuIHJlc2V0LiBZb3VyIG5ldyBwYXNzd29yZCBpczogIjxpbnAyOnVfRm9yZ290dGVuUGFzc3dvcmQgLz4iLg== + WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IFBhc3N3b3JkIHJlc2V0IGNvbmZpcm1hdGlvbgoKSGVsbG8sDQoNCkl0IHNlZW1zIHRoYXQgeW91IGhhdmUgcmVxdWVzdGVkIGEgcGFzc3dvcmQgcmVzZXQgZm9yIHlvdXIgSW4tcG9ydGFsIGFjY291bnQuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHByb2NlZWQgYW5kIGNoYW5nZSB0aGUgcGFzc3dvcmQsIHBsZWFzZSBjbGljayBvbiB0aGUgbGluayBiZWxvdzoNCjxpbnAyOnVfQ29uZmlybVBhc3N3b3JkTGluayBub19hbXA9IjEiLz4NCg0KWW91IHdpbGwgcmVjZWl2ZSBhIHNlY29uZCBlbWFpbCB3aXRoIHlvdXIgbmV3IHBhc3N3b3JkIHNob3J0bHkuDQoNCklmIHlvdSBiZWxpZXZlIHlvdSBoYXZlIHJlY2VpdmVkIHRoaXMgZW1haWwgaW4gZXJyb3IsIHBsZWFzZSBpZ25vcmUgdGhpcyBlbWFpbC4gWW91ciBwYXNzd29yZCB3aWxsIG5vdCBiZSBjaGFuZ2VkIHVubGVzcyB5b3UgaGF2ZSBjbGlja2VkIG9uIHRoZSBhYm92ZSBsaW5rLg0K + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogU3Vic2NyaXB0aW9uIGNvbmZpcm1hdGlvbgoKWW91IGhhdmUgc3Vic2NyaWJlZCB0byA8aW5wOm1fcGFnZV90aXRsZSAvPiBtYWlsaW5nIGxpc3Qu + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogQSB1c2VyIGhhcyBzdWJzY3JpYmVkCgpBIHVzZXIgaGFzIHN1YnNjcmliZWQgdG8gPGlucDptX3BhZ2VfdGl0bGUgLz4gbWFpbGluZyBsaXN0Lg== + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogQ2hlY2sgb3V0IHRoaXMgc2l0ZQoKSGksDQoNClRoaXMgbWVzc2FnZSBoYXMgYmVlbiBzZW50IHRvIHlvdSBmcm9tIG9uZSBvZiB5b3VyIGZyaWVuZHMuDQpDaGVjayBvdXQgdGhpcyBzaXRlOiA8YSBocmVmPSI8aW5wOm1fdGhlbWVfdXJsIF9wYWdlPSJjdXJyZW50Ii8+Ij48aW5wOm1fcGFnZV90aXRsZSAvPjwvYT4h + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogVGhlIHNpdGUgaGFzIGJlZW4gc3VnZ2VzdGVkCgpBIHZpc2l0b3Igc3VnZ2VzdGVkIHlvdXIgc2l0ZSB0byBhIGZyaWVuZC4= + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogWW91IGhhdmUgYmVlbiB1bnN1YnNjcmliZWQKCllvdSBoYXZlIHN1Y2Nlc3NmdWxseSB1bnN1YnNyaWJlZCBmcm9tIDxpbnA6bV9wYWdlX3RpdGxlIC8+IG1haWxpbmcgbGlzdC4= + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogVXNlciB1bnN1YnNyaWJlZAoKQSB1c2VyIGhhcyB1bnN1YnNjcmliZWQu + WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IEluLXBvcnRhbCByZWdpc3RyYXRpb24KCldlbGNvbWUgdG8gSW4tcG9ydGFsIQ0KDQpZb3VyIHVzZXIgcmVnaXN0cmF0aW9uIGhhcyBiZWVuIGFwcHJvdmVkIQ0KDQpZb3VyIHVzZXIgcmVnaXN0cmF0aW9uIGhhcyBiZWVuIGFwcHJvdmVkLiBZb3UgY2FuIGxvZ2luIG5vdyB1c2luZyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOg0KDQo9PT09PT09PT09PT09PT09PT0NClVzZXJuYW1lOiAiPGlucDp0b3VzZXIgX0ZpZWxkPSJVc2VyTmFtZSIgLz4iDQpQYXNzd29yZDogIjxpbnA6dG91c2VyIF9GaWVsZD0icGFzc3dvcmQiIC8+Ig0KPT09PT09PT09PT09PT09PT09DQo= + WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogVXNlciB2YWxpZGF0ZWQKClVzZXIgIjxpbnA6dG91c2VyIF9GaWVsZD0iVXNlck5hbWUiIC8+IiBoYXMgYmVlbiB2YWxpZGF0ZWQu + + + \ No newline at end of file Index: branches/RC/core/install/install_toolkit.php =================================================================== diff -u -N --- branches/RC/core/install/install_toolkit.php (revision 0) +++ branches/RC/core/install/install_toolkit.php (revision 10832) @@ -0,0 +1,681 @@ +Application =& kApplication::Instance(); + $this->Conn =& $this->Application->GetADODBConnection(); + } + + $this->INIFile = FULL_PATH . '/config.php'; + + $this->systemConfig = $this->ParseConfig(true); + } + + /** + * Sets installator + * + * @param kInstallator $instance + */ + function setInstallator(&$instance) + { + $this->_installator =& $instance; + } + + /** + * Checks prerequisities before module install or upgrade + * + * @param string $module_path + * @param string $versions + * @param string $mode upgrade mode = {install, standalone, upgrade} + */ + function CheckPrerequisites($module_path, $versions, $mode) + { + $prerequisites_file = sprintf(PREREQUISITE_FILE, $module_path); + if (!file_exists($prerequisites_file) || !$versions) { + return Array (); + } + + include_once $prerequisites_file; + + $prerequisite_object = new $prerequisite_class(); + if (method_exists($prerequisite_object, 'setToolkit')) { + $prerequisite_object->setToolkit(&$this); + } + + // some errors possible + return $prerequisite_object->CheckPrerequisites($versions, $mode); + } + + /** + * Processes one license, received from server + * + * @param string $file_data + */ + function processLicense($file_data) + { + $modules_helper =& $this->Application->recallObject('ModulesHelper'); + /* @var $modules_helper kModulesHelper */ + + $file_data = explode('Code==:', $file_data); + $file_data[0] = str_replace('In-Portal License File - do not edit!' . "\n", '', $file_data[0]); + $file_data = array_map('trim', $file_data); + + if ($modules_helper->verifyLicense($file_data[0])) { + $this->setSystemConfig('Intechnic', 'License', $file_data[0]); + if (array_key_exists(1, $file_data)) { + $this->setSystemConfig('Intechnic', 'LicenseCode', $file_data[1]); + } + else { + $this->setSystemConfig('Intechnic', 'LicenseCode'); + } + $this->SaveConfig(); + } + else { + // invalid license received from licensing server + $this->_installator->errorMessage = 'Invalid License File'; + } + } + + /** + * Saves given configuration values to database + * + * @param Array $config + */ + function saveConfigValues($config) + { + foreach ($config as $config_var => $value) { + $sql = 'UPDATE ' . TABLE_PREFIX . 'ConfigurationValues + SET VariableValue = ' . $this->Conn->qstr($value) . ' + WHERE VariableName = ' . $this->Conn->qstr($config_var); + $this->Conn->Query($sql); + } + } + + /** + * Sets module version to passed + * + * @param string $module_name + * @param string $version + */ + function SetModuleVersion($module_name, $version = false) + { + if ($version === false) { + $version = $this->GetMaxModuleVersion($module_name); + } + + // get table prefix from config, because application may not be available here + $table_prefix = $this->getSystemConfig('Database', 'TablePrefix'); + + if ($module_name == 'kernel') { + $module_name = 'in-portal'; + } + + $sql = 'UPDATE ' . $table_prefix . 'Modules + SET Version = "' . $version . '" + WHERE LOWER(Name) = "' . strtolower($module_name) . '"'; + $this->Conn->Query($sql); + } + + /** + * Sets module root category to passed + * + * @param string $module_name + * @param string $category_id + */ + function SetModuleRootCategory($module_name, $category_id = 0) + { + // get table prefix from config, because application may not be available here + $table_prefix = $this->getSystemConfig('Database', 'TablePrefix'); + + if ($module_name == 'kernel') { + $module_name = 'in-portal'; + } + + $sql = 'UPDATE ' . $table_prefix . 'Modules + SET RootCat = ' . $category_id . ' + WHERE LOWER(Name) = "' . strtolower($module_name) . '"'; + $this->Conn->Query($sql); + } + + /** + * Returns maximal version of given module by scanning it's upgrade scripts + * + * @param string $module_name + * @return string + */ + function GetMaxModuleVersion($module_name) + { + $upgrades_file = sprintf(UPGRADES_FILE, mb_strtolower($module_name).'/', 'sql'); + if (!file_exists($upgrades_file)) { + // no upgrade file + return '4.0.1'; + } + + $sqls = file_get_contents($upgrades_file); + $versions_found = preg_match_all('/'.VERSION_MARK.'/s', $sqls, $regs); + if (!$versions_found) { + // upgrades file doesn't contain version definitions + return '4.0.1'; + } + + return end($regs[1]); + } + + /** + * Runs SQLs from file + * + * @param string $filename + * @param mixed $replace_from + * @param mixed $replace_to + */ + function RunSQL($filename, $replace_from = null, $replace_to = null) + { + if (!file_exists(FULL_PATH.$filename)) { + return ; + } + + $sqls = file_get_contents(FULL_PATH.$filename); + if (!$this->RunSQLText($sqls, $replace_from, $replace_to)) { + if (is_object($this->_installator)) { + $this->_installator->Done(); + } + else { + if (isset($this->Application)) { + $this->Application->Done(); + } + + exit; + } + } + } + + /** + * Runs SQLs from string + * + * @param string $sqls + * @param mixed $replace_from + * @param mixed $replace_to + */ + function RunSQLText(&$sqls, $replace_from = null, $replace_to = null, $start_from=0) + { + $table_prefix = $this->getSystemConfig('Database', 'TablePrefix'); + + // add prefix to all tables + if (strlen($table_prefix) > 0) { + $replacements = Array ('CREATE TABLE ', 'INSERT INTO ', 'UPDATE ', 'ALTER TABLE ', 'DELETE FROM ', 'REPLACE INTO '); + foreach ($replacements as $replacement) { + $sqls = str_replace($replacement, $replacement.$table_prefix, $sqls); + } + $sqls = str_replace('DROP TABLE ', 'DROP TABLE IF EXISTS '.$table_prefix, $sqls); + } + + if (isset($replace_from) && isset($replace_to)) { + // replace something additionally, e.g. module root category + $sqls = str_replace($replace_from, $replace_to, $sqls); + } + + $sqls = str_replace("\r\n", "\n", $sqls); // convert to linux line endings + $sqls = preg_replace("/#([^;]*?)\n/", '', $sqls); // remove all comments + $sqls = explode(";\n", $sqls . "\n"); // ensures that last sql won't have ";" in it + + $db_collation = $this->getSystemConfig('Database', 'DBCollation'); + for ($i=$start_from; $i add collation + $sql .= ' COLLATE \'' . $db_collation . '\''; + } + + $this->Conn->Query($sql); + if ($this->Conn->getErrorCode() != 0) { + if (is_object($this->_installator)) { + $this->_installator->errorMessage = 'Error: ('.$this->Conn->getErrorCode().') '.$this->Conn->getErrorMsg().'

Last Database Query:
'; + $this->_installator->LastQueryNum = $i + 1; + } + return false; + } + } + return true; + } + + /** + * Performs clean language import from given xml file + * + * @param string $lang_file + * @param bool $upgrade + */ + function ImportLanguage($lang_file, $upgrade = false) + { + $lang_file = FULL_PATH.$lang_file.'.lang'; + if (!file_exists($lang_file)) { + return ; + } + + $lang_xml =& $this->Application->recallObject('LangXML'); + /* @var $lang_xml LangXML_Parser */ + + $lang_xml->Parse($lang_file, '|0|1|2|', '', $upgrade ? LANG_SKIP_EXISTING : LANG_OVERWRITE_EXISTING); + } + + /** + * Converts module version in format X.Y.Z to signle integer + * + * @param string $version + * @return int + */ + function ConvertModuleVersion($version) + { + $parts = explode('.', $version); + + $bin = ''; + foreach ($parts as $part) { + $bin .= str_pad(decbin($part), 8, '0', STR_PAD_LEFT); + } + + return bindec($bin); + } + + /** + * Returns themes, found in system + * + * @param bool $rebuild + * @return int + */ + function getThemes($rebuild = false) + { + if ($rebuild) { + $this->rebuildThemes(); + } + + $id_field = $this->Application->getUnitOption('theme', 'IDField'); + $table_name = $this->Application->getUnitOption('theme', 'TableName'); + + $sql = 'SELECT Name, ' . $id_field . ' + FROM ' . $table_name; + return $this->Conn->GetCol($sql, $id_field); + } + + function ParseConfig($parse_section = false) + { + if (!file_exists($this->INIFile)) { + return Array(); + } + + if( file_exists($this->INIFile) && !is_readable($this->INIFile) ) { + die('Could Not Open Ini File'); + } + + $contents = file($this->INIFile); + + $retval = Array(); + $section = ''; + $ln = 1; + $resave = false; + foreach ($contents as $line) { + if ($ln == 1 && $line != '<'.'?'.'php die() ?'.">\n") { + $resave = true; + } + + $ln++; + $line = trim($line); + $line = eregi_replace(';[.]*','',$line); + if (strlen($line) > 0) { + //echo $line . " - "; + if(eregi('^[[a-z]+]$',str_replace(' ', '', $line))) { + //echo 'section'; + $section = mb_substr($line, 1, (mb_strlen($line) - 2)); + if ($parse_section) { + $retval[$section] = array(); + } + continue; + } elseif (eregi('=',$line)) { + //echo 'main element'; + list ($key, $val) = explode(' = ', $line); + if (!$parse_section) { + $retval[trim($key)] = str_replace('"', '', $val); + } + else { + $retval[$section][trim($key)] = str_replace('"', '', $val); + } + } + } + } + + if ($resave) { + $fp = fopen($this->INIFile, 'w'); + reset($contents); + fwrite($fp,'<'.'?'.'php die() ?'.">\n\n"); + foreach ($contents as $line) { + fwrite($fp,"$line"); + } + fclose($fp); + } + + return $retval; + } + + function SaveConfig() + { + if (!is_writeable($this->INIFile)) { + trigger_error('Cannot write to "' . $this->INIFile . '" file.', E_USER_ERROR); + return ; + } + + $fp = fopen($this->INIFile, 'w'); + fwrite($fp,'<'.'?'.'php die() ?'.">\n\n"); + + foreach ($this->systemConfig as $section_name => $section_data) { + fwrite($fp, '['.$section_name."]\n"); + foreach ($section_data as $key => $value) { + fwrite($fp, $key.' = "'.$value.'"'."\n"); + } + fwrite($fp, "\n"); + } + fclose($fp); + } + + /** + * Sets value to system config (yet SaveConfig must be called to write it to file) + * + * @param string $section + * @param string $key + * @param string $value + */ + function setSystemConfig($section, $key, $value = null) + { + if (isset($value)) { + if (!array_key_exists($section, $this->systemConfig)) { + // create section, when missing + $this->systemConfig[$section] = Array (); + } + + // create key in section + $this->systemConfig[$section][$key] = $value; + return ; + } + + unset($this->systemConfig[$section][$key]); + } + + /** + * Returns information from system config + * + * @return string + */ + function getSystemConfig($section, $key) + { + if (!array_key_exists($section, $this->systemConfig)) { + return false; + } + + if (!array_key_exists($key, $this->systemConfig[$section])) { + return false; + } + + return $this->systemConfig[$section][$key] ? $this->systemConfig[$section][$key] : false; + } + + /** + * Checks if system config is present and is not empty + * + * @return bool + */ + function systemConfigFound() + { + return file_exists($this->INIFile) && $this->systemConfig; + } + + /** + * Checks if given section is present in config + * + * @param string $section + * @return bool + */ + function sectionFound($section) + { + return array_key_exists($section, $this->systemConfig); + } + + /** + * Returns formatted module name based on it's root folder + * + * @param string $module_folder + * @return string + */ + function getModuleName($module_folder) + { + if ($module_folder == 'kernel') { + $module_folder = 'in-portal'; + } + + return implode('-', array_map('ucfirst', explode('-', $module_folder))); + } + + /** + * Creates module root category in "Home" category using given data and returns it + * + * @param string $name + * @param string $description + * @param string $category_template + * @param string $status + * @return kDBItem + */ + function &createModuleCategory($name, $description, $category_template = null, $status = 1) + { + static $fields = null; + + if (!isset($fields)) { + $ml_formatter =& $this->Application->recallObject('kMultiLanguage'); + + $fields['name'] = $ml_formatter->LangFieldName('Name'); + $fields['description'] = $ml_formatter->LangFieldName('Description'); + } + + $category =& $this->Application->recallObject('c', null, Array ('skip_autoload' => true)); + /* @var $category kDBItem */ + + $category_fields = Array ( + $fields['name'] => $name, 'Filename' => $name, 'AutomaticFilename' => 1, + $fields['description'] => $description, 'Status' => $status, 'ParentId' => 0, + ); + + if (isset($category_template)) { + $category_fields['CategoryTemplate'] = $category_template; + $category_fields['CachedCategoryTemplate'] = $category_template; + } + + $category->Clear(); + $category->SetDBFieldsFromHash($category_fields); + + $category->Create(); + + return $category; + } + + /** + * Sets category item template into custom field for given prefix + * + * @param kDBItem $category + * @param string $prefix + * @param string $item_template + */ + function setModuleItemTemplate(&$category, $prefix, $item_template) + { + $this->Application->removeObject('c-cdata'); + + $category->defineFields(); + $category->SetDBField('cust_' . $prefix .'_ItemTemplate', $item_template); + $category->Update(); + } + + /** + * Link custom field records with search config records + create custom field columns + * + * @param string $module_folder + * @param int $item_type + */ + function linkCustomFields($module_folder, $prefix, $item_type) + { + $module_folder = strtolower($module_folder); + $module_name = ($module_folder == 'kernel') ? 'in-portal' : $module_folder; + + $db =& $this->Application->GetADODBConnection(); + + $sql = 'SELECT FieldName, CustomFieldId + FROM ' . TABLE_PREFIX . 'CustomField + WHERE Type = ' . $item_type . ' AND IsSystem = 0'; // config is not read here yet :( $this->Application->getUnitOption('p', 'ItemType'); + $custom_fields = $db->GetCol($sql, 'CustomFieldId'); + + foreach ($custom_fields as $cf_id => $cf_name) { + $sql = 'UPDATE ' . TABLE_PREFIX . 'SearchConfig + SET CustomFieldId = ' . $cf_id . ' + WHERE (TableName = "CustomField") AND (LOWER(ModuleName) = "' . $module_name . '") AND (FieldName = ' . $db->qstr($cf_name) . ')'; + $db->Query($sql); + } + + $this->Application->refreshModuleInfo(); // this module configs are now processed + + // because of configs was read only from installed before modules (in-portal), then reread configs + $unit_config_reader =& $this->Application->recallObject('kUnitConfigReader'); + $unit_config_reader->scanModules(MODULES_PATH . '/' . $module_folder); + + // create correct columns in CustomData table + $ml_helper =& $this->Application->recallObject('kMultiLanguageHelper'); + $ml_helper->createFields($prefix . '-cdata', true); + } + + /** + * Deletes cache, useful after separate module install and installator last step + * + */ + function deleteCache($refresh_permissions = false) + { + $sql = 'DELETE FROM ' . TABLE_PREFIX . 'Cache + WHERE VarName IN ("config_files", "configs_parsed", "sections_parsed")'; + $this->Conn->Query($sql); + + if ($refresh_permissions) { + if ($this->Application->isModuleEnabled('In-Portal')) { + // refresh permissions with ajax progress bar (when available) + $fields_hash = Array ( + 'VarName' => 'ForcePermCacheUpdate', + 'Data' => 1, + ); + + $this->Conn->doInsert($fields_hash, TABLE_PREFIX . 'Cache'); + } + else { + // refresh permission without progress bar + $updater =& $this->Application->recallObject('kPermCacheUpdater'); + /* @var $updater kPermCacheUpdater */ + + $updater->OneStepRun(); + } + } + } + + /** + * Perform redirect after separate module install + * + * @param string $module_folder + * @param bool $refresh_permissions + */ + function finalizeModuleInstall($module_folder, $refresh_permissions = false) + { + if (!$this->Application->GetVar('redirect')) { + return ; + } + + $this->SetModuleVersion($module_folder); + + $this->deleteCache($refresh_permissions); + + $url_params = Array ( + 'pass' => 'm', 'admin' => 1, + 'RefreshTree' => 1, 'index_file' => 'index.php', + ); + $this->Application->Redirect('modules/modules_list', $url_params); + } + + /** + * Performs rebuild of themes + * + */ + function rebuildThemes() + { + $this->Application->HandleEvent($themes_event, 'adm:OnRebuildThemes'); + } + } \ No newline at end of file Index: branches/RC/kernel/install/prerequisites.php =================================================================== diff -u -N --- branches/RC/kernel/install/prerequisites.php (revision 0) +++ branches/RC/kernel/install/prerequisites.php (revision 10832) @@ -0,0 +1,50 @@ +_toolkit =& $instance; + } + + /** + * Checks minimal version, that could be upgradeable + * + * @param string $mode when called mode {install, upgrade) + */ + function CheckPrerequisites($versions, $mode) + { + $errors = Array (); + + if ($mode == 'upgrade') { + $min_version = '4.3.2'; + + $current_version = $this->_toolkit->ConvertModuleVersion($versions[0]); + $needed_version = $this->_toolkit->ConvertModuleVersion($min_version); + if ($current_version < $needed_version) { + $errors[] = 'Please upgrade "In-Portal" to version ' . $min_version . ' or above'; + } + } + + return $errors; + } + } + +?> \ No newline at end of file Index: branches/RC/core/install/step_templates/db_reconfig.tpl =================================================================== diff -u -N --- branches/RC/core/install/step_templates/db_reconfig.tpl (revision 0) +++ branches/RC/core/install/step_templates/db_reconfig.tpl (revision 10832) @@ -0,0 +1,67 @@ + + Server Type*: + + + + + + + Hostname*: + + + + + + + Database Name*: + + + + + + + Database Collation*: + + + + + + + Database User Name*: + + + + + + + Database User Password: + + + + + + + Table Name Prefix: + + + + \ No newline at end of file Index: branches/RC/core/units/custom_data/custom_data_event_handler.php =================================================================== diff -u -N -r10492 -r10832 --- branches/RC/core/units/custom_data/custom_data_event_handler.php (.../custom_data_event_handler.php) (revision 10492) +++ branches/RC/core/units/custom_data/custom_data_event_handler.php (.../custom_data_event_handler.php) (revision 10832) @@ -69,6 +69,9 @@ function OnAfterConfigRead(&$event) { $main_prefix = $this->Application->getUnitOption($event->Prefix, 'ParentPrefix'); + if (!$main_prefix) { + return false; + } $custom_fields = $this->scanCustomFields($main_prefix); if (!$custom_fields) { Index: branches/RC/kernel/install/install_data.sql =================================================================== diff -u -N --- branches/RC/kernel/install/install_data.sql (revision 0) +++ branches/RC/kernel/install/install_data.sql (revision 10832) @@ -0,0 +1,243 @@ +INSERT INTO ConfigurationAdmin VALUES ('AllowDeleteRootCats', 'la_Text_General', 'la_AllowDeleteRootCats', 'checkbox', NULL , NULL , 10.09, 0, 0); +INSERT INTO ConfigurationAdmin VALUES ('Catalog_PreselectModuleTab', 'la_Text_General', 'la_config_CatalogPreselectModuleTab', 'checkbox', NULL, NULL, 10.10, 0, 1); +INSERT INTO ConfigurationAdmin VALUES ('RecycleBinFolder', 'la_Text_General', 'la_config_RecycleBinFolder', 'text', NULL , NULL , 10.11, 0, 0); + +INSERT INTO ConfigurationValues VALUES (DEFAULT, 'AllowDeleteRootCats', '0', 'In-Portal', 'in-portal:configure_categories'); +INSERT INTO ConfigurationValues VALUES (DEFAULT, 'Catalog_PreselectModuleTab', 1, 'In-Portal', 'in-portal:configure_categories'); +INSERT INTO ConfigurationValues VALUES (DEFAULT, 'RecycleBinFolder', '', 'In-Portal', 'in-portal:configure_categories'); + +INSERT INTO ItemTypes VALUES (1, 'In-Portal', 'c', 'Category', 'Name', 'CreatedById', NULL, NULL, 'la_ItemTab_Categories', 1, 'admin/category/addcategory.php', 'clsCategory', 'Category'); +INSERT INTO ItemTypes VALUES (6, 'In-Portal', 'u', 'PortalUser', 'Login', 'PortalUserId', NULL, NULL, '', 0, '', 'clsPortalUser', 'User'); + +INSERT INTO PermissionConfig VALUES (DEFAULT, 'CATEGORY.ADD', 'lu_PermName_Category.Add_desc', 'lu_PermName_Category.Add_error', 'In-Portal'); +INSERT INTO PermissionConfig VALUES (DEFAULT, 'CATEGORY.DELETE', 'lu_PermName_Category.Delete_desc', 'lu_PermName_Category.Delete_error', 'In-Portal'); +INSERT INTO PermissionConfig VALUES (DEFAULT, 'CATEGORY.ADD.PENDING', 'lu_PermName_Category.AddPending_desc', 'lu_PermName_Category.AddPending_error', 'In-Portal'); +INSERT INTO PermissionConfig VALUES (DEFAULT, 'CATEGORY.MODIFY', 'lu_PermName_Category.Modify_desc', 'lu_PermName_Category.Modify_error', 'In-Portal'); +INSERT INTO PermissionConfig VALUES (DEFAULT, 'ADMIN', 'lu_PermName_Admin_desc', 'lu_PermName_Admin_error', 'Admin'); +INSERT INTO PermissionConfig VALUES (DEFAULT, 'LOGIN', 'lu_PermName_Login_desc', 'lu_PermName_Admin_error', 'Front'); +INSERT INTO PermissionConfig VALUES (DEFAULT, 'DEBUG.ITEM', 'lu_PermName_Debug.Item_desc', '', 'Admin'); +INSERT INTO PermissionConfig VALUES (DEFAULT, 'DEBUG.LIST', 'lu_PermName_Debug.List_desc', '', 'Admin'); +INSERT INTO PermissionConfig VALUES (DEFAULT, 'DEBUG.INFO', 'lu_PermName_Debug.Info_desc', '', 'Admin'); +INSERT INTO PermissionConfig VALUES (DEFAULT, 'PROFILE.MODIFY', 'lu_PermName_Profile.Modify_desc', '', 'Admin'); +INSERT INTO PermissionConfig VALUES (DEFAULT, 'SHOWLANG', 'lu_PermName_ShowLang_desc', '', 'Admin'); +INSERT INTO PermissionConfig VALUES (DEFAULT, 'FAVORITES', 'lu_PermName_favorites_desc', 'lu_PermName_favorites_error', 'In-Portal'); +INSERT INTO PermissionConfig VALUES (DEFAULT, 'SYSTEM_ACCESS.READONLY', 'la_PermName_SystemAccess.ReadOnly_desc', 'la_PermName_SystemAccess.ReadOnly_error', 'Admin'); + +INSERT INTO Permissions VALUES (DEFAULT, 'LOGIN', 12, 1, 1, 0); + +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:site.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:browse.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:advanced_view.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:reviews.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_categories.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_categories.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_search.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_search.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_email.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_email.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_custom.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_custom.add', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_custom.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configuration_custom.delete', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:users.view', 11, 1, 1, 0); + +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_list.advanced:ban', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_list.advanced:send_email', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_groups.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_groups.add', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_groups.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_groups.delete', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_groups.advanced:send_email', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_groups.advanced:manage_permissions', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_users.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_users.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_email.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_email.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_custom.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_custom.add', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_custom.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_custom.delete', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_banlist.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_banlist.add', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_banlist.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:user_banlist.delete', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:reports.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:log_summary.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:searchlog.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:searchlog.delete', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:sessionlog.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:sessionlog.delete', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:emaillog.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:emaillog.delete', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:visits.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:visits.delete', 11, 1, 1, 0); + +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_general.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_general.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:modules.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:mod_status.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:mod_status.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:mod_status.advanced:approve', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:mod_status.advanced:decline', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:addmodule.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:addmodule.add', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:addmodule.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:tag_library.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_themes.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_themes.add', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_themes.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_themes.delete', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_styles.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_styles.add', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_styles.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_styles.delete', 11, 1, 1, 0); + +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_lang.advanced:set_primary', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_lang.advanced:import', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:configure_lang.advanced:export', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:tools.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:backup.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:restore.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:export.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:main_import.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:sql_query.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:sql_query.edit', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:server_info.view', 11, 1, 1, 0); +INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:help.view', 11, 1, 1, 0); + +INSERT INTO SearchConfig VALUES ('Category', 'NewItem', 0, 1, 'lu_fielddesc_category_newitem', 'lu_field_newitem', 'In-Portal', 'la_text_category', 18, DEFAULT, 0, 'boolean', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'PopItem', 0, 1, 'lu_fielddesc_category_popitem', 'lu_field_popitem', 'In-Portal', 'la_text_category', 19, DEFAULT, 0, 'boolean', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'HotItem', 0, 1, 'lu_fielddesc_category_hotitem', 'lu_field_hotitem', 'In-Portal', 'la_text_category', 17, DEFAULT, 0, 'boolean', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'MetaDescription', 0, 1, 'lu_fielddesc_category_metadescription', 'lu_field_metadescription', 'In-Portal', 'la_text_category', 16, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'ParentPath', 0, 1, 'lu_fielddesc_category_parentpath', 'lu_field_parentpath', 'In-Portal', 'la_text_category', 15, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'ResourceId', 0, 1, 'lu_fielddesc_category_resourceid', 'lu_field_resourceid', 'In-Portal', 'la_text_category', 14, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'CreatedById', 0, 1, 'lu_fielddesc_category_createdbyid', 'lu_field_createdbyid', 'In-Portal', 'la_text_category', 13, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'CachedNavbar', 0, 1, 'lu_fielddesc_category_cachednavbar', 'lu_field_cachednavbar', 'In-Portal', 'la_text_category', 12, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'CachedDescendantCatsQty', 0, 1, 'lu_fielddesc_category_cacheddescendantcatsqty', 'lu_field_cacheddescendantcatsqty', 'In-Portal', 'la_text_category', 11, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'MetaKeywords', 0, 1, 'lu_fielddesc_category_metakeywords', 'lu_field_metakeywords', 'In-Portal', 'la_text_category', 10, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'Priority', 0, 1, 'lu_fielddesc_category_priority', 'lu_field_priority', 'In-Portal', 'la_text_category', 9, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'Status', 0, 1, 'lu_fielddesc_category_status', 'lu_field_status', 'In-Portal', 'la_text_category', 7, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'EditorsPick', 0, 1, 'lu_fielddesc_category_editorspick', 'lu_field_editorspick', 'In-Portal', 'la_text_category', 6, DEFAULT, 0, 'boolean', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'CreatedOn', 0, 1, 'lu_fielddesc_category_createdon', 'lu_field_createdon', 'In-Portal', 'la_text_category', 5, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'Description', 1, 1, 'lu_fielddesc_category_description', 'lu_field_description', 'In-Portal', 'la_text_category', 4, DEFAULT, 2, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'Name', 1, 1, 'lu_fielddesc_category_name', 'lu_field_name', 'In-Portal', 'la_text_category', 3, DEFAULT, 2, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'ParentId', 0, 1, 'lu_fielddesc_category_parentid', 'lu_field_parentid', 'In-Portal', 'la_text_category', 2, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'CategoryId', 0, 1, 'lu_fielddesc_category_categoryid', 'lu_field_categoryid', 'In-Portal', 'la_text_category', 0, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'Modified', 0, 1, 'lu_fielddesc_category_modified', 'lu_field_modified', 'In-Portal', 'la_text_category', 20, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('Category', 'ModifiedById', 0, 1, 'lu_fielddesc_category_modifiedbyid', 'lu_field_modifiedbyid', 'In-Portal', 'la_text_category', 21, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +INSERT INTO SearchConfig VALUES ('PortalUser', 'PortalUserId', -1, 0, 'lu_fielddesc_user_portaluserid', 'lu_field_portaluserid', 'In-Portal', 'la_text_user', 0, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'Login', -1, 0, 'lu_fielddesc_user_login', 'lu_field_login', 'In-Portal', 'la_text_user', 1, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'Password', -1, 0, 'lu_fielddesc_user_password', 'lu_field_password', 'In-Portal', 'la_text_user', 2, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'tz', -1, 0, 'lu_fielddesc_user_tz', 'lu_field_tz', 'In-Portal', 'la_text_user', 17, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'dob', -1, 0, 'lu_fielddesc_user_dob', 'lu_field_dob', 'In-Portal', 'la_text_user', 16, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'Modified', -1, 0, 'lu_fielddesc_user_modified', 'lu_field_modified', 'In-Portal', 'la_text_user', 15, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'Status', -1, 0, 'lu_fielddesc_user_status', 'lu_field_status', 'In-Portal', 'la_text_user', 14, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'ResourceId', -1, 0, 'lu_fielddesc_user_resourceid', 'lu_field_resourceid', 'In-Portal', 'la_text_user', 13, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'Country', -1, 0, 'lu_fielddesc_user_country', 'lu_field_country', 'In-Portal', 'la_text_user', 12, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'Zip', -1, 0, 'lu_fielddesc_user_zip', 'lu_field_zip', 'In-Portal', 'la_text_user', 11, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'State', -1, 0, 'lu_fielddesc_user_state', 'lu_field_state', 'In-Portal', 'la_text_user', 10, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'City', -1, 0, 'lu_fielddesc_user_city', 'lu_field_city', 'In-Portal', 'la_text_user', 9, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'Street', -1, 0, 'lu_fielddesc_user_street', 'lu_field_street', 'In-Portal', 'la_text_user', 8, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'Phone', -1, 0, 'lu_fielddesc_user_phone', 'lu_field_phone', 'In-Portal', 'la_text_user', 7, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'CreatedOn', -1, 0, 'lu_fielddesc_user_createdon', 'lu_field_createdon', 'In-Portal', 'la_text_user', 6, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'Email', -1, 0, 'lu_fielddesc_user_email', 'lu_field_email', 'In-Portal', 'la_text_user', 5, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'LastName', -1, 0, 'lu_fielddesc_user_lastname', 'lu_field_lastname', 'In-Portal', 'la_text_user', 4, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO SearchConfig VALUES ('PortalUser', 'FirstName', -1, 0, 'lu_fielddesc_user_firstname', 'lu_field_firstname', 'In-Portal', 'la_text_user', 3, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT count(*) FROM <%prefix%>Category WHERE Status=1 ', NULL, 'la_prompt_ActiveCategories', '0', '1'); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT count(*) FROM <%prefix%>PortalUser WHERE Status=1 ', NULL, 'la_prompt_ActiveUsers', '0', '1'); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT count(*) FROM <%prefix%>UserSession', NULL, 'la_prompt_CurrentSessions', '0', '1'); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) as CategoryCount FROM <%prefix%>Category', NULL, 'la_prompt_TotalCategories', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS ActiveCategories FROM <%prefix%>Category WHERE Status = 1', NULL, 'la_prompt_ActiveCategories', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS PendingCategories FROM <%prefix%>Category WHERE Status = 2', NULL, 'la_prompt_PendingCategories', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS DisabledCategories FROM <%prefix%>Category WHERE Status = 0', NULL, 'la_prompt_DisabledCategories', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS NewCategories FROM <%prefix%>Category WHERE (NewItem = 1) OR ( (UNIX_TIMESTAMP() - CreatedOn) <= <%m:config name="Category_DaysNew"%>*86400 AND (NewItem = 2) )', NULL, 'la_prompt_NewCategories', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) FROM <%prefix%>Category WHERE EditorsPick = 1', NULL, 'la_prompt_CategoryEditorsPick', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT <%m:post_format field="MAX(CreatedOn)" type="date"%> FROM <%prefix%>Category', NULL, 'la_prompt_NewestCategoryDate', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT <%m:post_format field="MAX(Modified)" type="date"%> FROM <%prefix%>Category', NULL, 'la_prompt_LastCategoryUpdate', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS TotalUsers FROM <%prefix%>PortalUser', NULL, 'la_prompt_TopicsUsers', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS ActiveUsers FROM <%prefix%>PortalUser WHERE Status = 1', NULL, 'la_prompt_UsersActive', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS PendingUsers FROM <%prefix%>PortalUser WHERE Status = 2', NULL, 'la_prompt_UsersPending', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS DisabledUsers FROM <%prefix%>PortalUser WHERE Status = 0', NULL, 'la_prompt_UsersDisabled', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT <%m:post_format field="MAX(CreatedOn)" type="date"%> FROM <%prefix%>PortalUser', NULL, 'la_prompt_NewestUserDate', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT( DISTINCT LOWER( Country ) ) FROM <%prefix%>PortalUser WHERE LENGTH(Country) > 0', NULL, 'la_prompt_UsersUniqueCountries', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT( DISTINCT LOWER( State ) ) FROM <%prefix%>PortalUser WHERE LENGTH(State) > 0', NULL, 'la_prompt_UsersUniqueStates', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS TotalUserGroups FROM <%prefix%>PortalGroup', NULL, 'la_prompt_TotalUserGroups', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS BannedUsers FROM <%prefix%>PortalUser WHERE IsBanned = 1', NULL, 'la_prompt_BannedUsers', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS NonExipedSessions FROM <%prefix%>UserSession WHERE Status = 1', NULL, 'la_prompt_NonExpiredSessions', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS ThemeCount FROM <%prefix%>Theme', NULL, 'la_prompt_ThemeCount', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', 'SELECT COUNT(*) AS RegionsCount FROM <%prefix%>Language', NULL, 'la_prompt_RegionsCount', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', '<%m:sql_action sql="SHOW+TABLES" action="COUNT" field="*"%>', NULL, 'la_prompt_TablesCount', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', '<%m:sql_action sql="SHOW+TABLE+STATUS" action="SUM" field="Rows"%>', NULL, 'la_prompt_RecordsCount', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', '<%m:custom_action sql="empty" action="SysFileSize"%>', NULL, 'la_prompt_SystemFileSize', 0, 2); +INSERT INTO StatItem VALUES (DEFAULT, 'In-Portal', '<%m:sql_action sql="SHOW+TABLE+STATUS" action="SUM" format_as="file" field="Data_length"%>', NULL, 'la_prompt_DataSize', 0, 2); + +INSERT INTO StylesheetSelectors VALUES (169, 8, 'Calendar''s selected days', '.calendar tbody .selected', 'a:0:{}', '', 1, 'font-weight: bold;\r\nbackground-color: #9ED7ED;\r\nborder: 1px solid #83B2C5;', 0); +INSERT INTO StylesheetSelectors VALUES (118, 8, 'Data grid row', 'td.block-data-row', 'a:0:{}', '', 2, 'border-bottom: 1px solid #cccccc;', 48); +INSERT INTO StylesheetSelectors VALUES (81, 8, '"More" link', 'a.link-more', 'a:0:{}', '', 2, 'text-decoration: underline;', 64); +INSERT INTO StylesheetSelectors VALUES (88, 8, 'Block data, separated rows', 'td.block-data-grid', 'a:0:{}', '', 2, 'border: 1px solid #cccccc;', 48); +INSERT INTO StylesheetSelectors VALUES (42, 8, 'Block Header', 'td.block-header', 'a:4:{s:5:"color";s:16:"rgb(0, 159, 240)";s:9:"font-size";s:4:"20px";s:11:"font-weight";s:6:"normal";s:7:"padding";s:3:"5px";}', 'Block Header', 1, 'font-family: Verdana, Helvetica, sans-serif;', 0); +INSERT INTO StylesheetSelectors VALUES (76, 8, 'Navigation bar menu', 'tr.head-nav td', 'a:0:{}', '', 1, 'vertical-align: middle;', 0); +INSERT INTO StylesheetSelectors VALUES (48, 8, 'Block data', 'td.block-data', 'a:2:{s:9:"font-size";s:5:"12px;";s:7:"padding";s:3:"5px";}', '', 1, '', 0); +INSERT INTO StylesheetSelectors VALUES (78, 8, 'Body main style', 'body', 'a:0:{}', '', 1, 'padding: 0px; \r\nbackground-color: #ffffff; \r\nfont-family: arial, verdana, helvetica; \r\nfont-size: small;\r\nwidth: auto;\r\nmargin: 0px;', 0); +INSERT INTO StylesheetSelectors VALUES (58, 8, 'Main table', 'table.main-table', 'a:0:{}', '', 1, 'width: 770px;\r\nmargin: 0px;\r\n/*table-layout: fixed;*/', 0); +INSERT INTO StylesheetSelectors VALUES (79, 8, 'Block: header of data block', 'span.block-data-grid-header', 'a:0:{}', '', 1, 'font-family: Arial, Helvetica, sans-serif;\r\ncolor: #009DF6;\r\nfont-size: 12px;\r\nfont-weight: bold;\r\nbackground-color: #E6EEFF;\r\npadding: 6px;\r\nwhite-space: nowrap;', 0); +INSERT INTO StylesheetSelectors VALUES (64, 8, 'Link', 'a', 'a:0:{}', '', 1, '', 0); +INSERT INTO StylesheetSelectors VALUES (46, 8, 'Product title link', 'a.link-product1', 'a:0:{}', 'Product title link', 1, 'color: #62A1DE;\r\nfont-size: 14px;\r\nfont-weight: bold;\r\nline-height: 20px;\r\npadding-bottom: 10px;', 0); +INSERT INTO StylesheetSelectors VALUES (75, 8, 'Copy of Main path link', 'table.main-path td a:hover', 'a:0:{}', '', 1, 'color: #ffffff;', 0); +INSERT INTO StylesheetSelectors VALUES (160, 8, 'Current item in navigation bar', '.checkout-step-current', 'a:0:{}', '', 1, 'color: #A20303;\r\nfont-weight: bold;', 0); +INSERT INTO StylesheetSelectors VALUES (51, 8, 'Right block data', 'td.right-block-data', 'a:1:{s:9:"font-size";s:4:"11px";}', '', 2, 'padding: 7px;\r\nbackground: #e3edf6 url("/in-commerce4/themes/default/img/bgr_login.jpg") repeat-y scroll left top;\r\nborder-bottom: 1px solid #64a1df;', 48); +INSERT INTO StylesheetSelectors VALUES (67, 8, 'Pagination bar: text', 'table.block-pagination td', 'a:3:{s:5:"color";s:7:"#8B898B";s:9:"font-size";s:4:"12px";s:11:"font-weight";s:6:"normal";}', '', 1, '', 0); +INSERT INTO StylesheetSelectors VALUES (45, 8, 'Category link', 'a.subcat', 'a:0:{}', 'Category link', 1, 'color: #2069A4', 0); +INSERT INTO StylesheetSelectors VALUES (68, 8, 'Pagination bar: link', 'table.block-pagination td a', 'a:3:{s:5:"color";s:7:"#8B898B";s:9:"font-size";s:5:"12px;";s:11:"font-weight";s:6:"normal";}', '', 1, '', 0); +INSERT INTO StylesheetSelectors VALUES (69, 8, 'Product description in product list', '.product-list-description', 'a:2:{s:5:"color";s:7:"#8B898B";s:9:"font-size";s:4:"12px";}', '', 1, '', 0); +INSERT INTO StylesheetSelectors VALUES (73, 8, 'Main path link', 'table.main-path td a', 'a:0:{}', '', 1, 'color: #d5e231;', 0); +INSERT INTO StylesheetSelectors VALUES (83, 8, 'Product title link in list (shopping cart)', 'a.link-product-cart', 'a:0:{}', 'Product title link', 1, 'color: #18559C;\r\nfont-size: 12px;\r\nfont-weight: bold;\r\ntext-decoration: none;\r\n\r\n', 0); +INSERT INTO StylesheetSelectors VALUES (72, 8, 'Main path block text', 'table.main-path td', 'a:0:{}', '', 1, 'color: #ffffff;\r\nfont-size: 10px;\r\nfont-weight: normal;\r\npadding: 1px;\r\n', 0); +INSERT INTO StylesheetSelectors VALUES (61, 8, 'Block: header of data table', 'td.block-data-grid-header', 'a:6:{s:4:"font";s:28:"Arial, Helvetica, sans-serif";s:5:"color";s:7:"#009DF6";s:9:"font-size";s:4:"12px";s:11:"font-weight";s:4:"bold";s:16:"background-color";s:7:"#E6EEFF";s:7:"padding";s:3:"6px";}', '', 1, 'white-space: nowrap;\r\npadding-left: 10px;\r\n/*\r\nbackground-image: url(/in-commerce4/themes/default/img/bullet1.gif);\r\nbackground-position: 10px 12px;\r\nbackground-repeat: no-repeat;\r\n*/', 0); +INSERT INTO StylesheetSelectors VALUES (65, 8, 'Link in product list additional row', 'td.product-list-additional a', 'a:1:{s:5:"color";s:7:"#8B898B";}', '', 2, '', 64); +INSERT INTO StylesheetSelectors VALUES (55, 8, 'Main table, left column', 'td.main-column-left', 'a:0:{}', '', 1, 'width:180px;\r\nborder: 1px solid #62A1DE;\r\nborder-top: 0px;', 0); +INSERT INTO StylesheetSelectors VALUES (70, 8, 'Product title link in list (category)', 'a.link-product-category', 'a:0:{}', 'Product title link', 1, 'color: #18559C;\r\nfont-size: 12px;\r\nfont-weight: bold;\r\ntext-decoration: none;\r\n\r\n', 0); +INSERT INTO StylesheetSelectors VALUES (66, 8, 'Pagination bar block', 'table.block-pagination', 'a:0:{}', '', 1, '', 0); +INSERT INTO StylesheetSelectors VALUES (49, 8, 'Bulleted list inside block', 'td.block-data ul li', 'a:0:{}', '', 1, ' list-style-image: url(/in-commerce4/themes/default/img/bullet2.gif);\r\n margin-bottom: 10px;\r\n font-size: 11px;', 0); +INSERT INTO StylesheetSelectors VALUES (87, 8, 'Cart item input form element', 'td.cart-item-atributes input', 'a:0:{}', '', 1, 'border: 1px solid #7BB2E6;', 0); +INSERT INTO StylesheetSelectors VALUES (119, 8, 'Data grid row header', 'td.block-data-row-hdr', 'a:0:{}', 'Used in order preview', 2, 'background-color: #eeeeee;\r\nborder-bottom: 1px solid #dddddd;\r\nborder-top: 1px solid #cccccc;\r\nfont-weight: bold;', 48); +INSERT INTO StylesheetSelectors VALUES (82, 8, '"More" link image', 'a.link-more img', 'a:0:{}', '', 2, 'text-decoration: none;\r\npadding-left: 5px;', 64); +INSERT INTO StylesheetSelectors VALUES (63, 8, 'Additional info under product description in list', 'td.product-list-additional', 'a:5:{s:5:"color";s:7:"#8B898B";s:9:"font-size";s:4:"11px";s:11:"font-weight";s:6:"normal";s:10:"border-top";s:18:"1px dashed #8B898B";s:13:"border-bottom";s:18:"1px dashed #8B898B";}', '', 2, '', 48); +INSERT INTO StylesheetSelectors VALUES (43, 8, 'Block', 'table.block', 'a:2:{s:16:"background-color";s:7:"#E3EEF9";s:6:"border";s:17:"1px solid #64A1DF";}', 'Block', 1, 'border: 0; \r\nmargin-bottom: 1px;\r\nwidth: 100%;', 0); +INSERT INTO StylesheetSelectors VALUES (84, 8, 'Cart item cell', 'td.cart-item', 'a:0:{}', '', 1, 'background-color: #F6FAFF;\r\nborder-left: 1px solid #ffffff;\r\nborder-bottom: 1px solid #ffffff;\r\npadding: 4px;', 0); +INSERT INTO StylesheetSelectors VALUES (57, 8, 'Main table, right column', 'td.main-column-right', 'a:0:{}', '', 1, 'width:220px;\r\nborder: 1px solid #62A1DE;\r\nborder-top: 0px;', 0); +INSERT INTO StylesheetSelectors VALUES (161, 8, 'Block for sub categories', 'td.block-data-subcats', 'a:0:{}', '', 2, ' background: #FFFFFF\r\nurl(/in-commerce4/themes/default/in-commerce/img/bgr_categories.jpg);\r\n background-repeat: no-repeat;\r\n background-position: top right;\r\nborder-bottom: 5px solid #DEEAFF;\r\npadding-left: 10px;', 48); +INSERT INTO StylesheetSelectors VALUES (77, 8, 'Left block header', 'td.left-block-header', 'a:0:{}', '', 2, 'font-family : verdana, helvetica, sans-serif;\r\ncolor : #ffffff;\r\nfont-size : 12px;\r\nfont-weight : bold;\r\ntext-decoration : none;\r\nbackground-color: #64a1df;\r\npadding: 5px;\r\npadding-left: 7px;', 42); +INSERT INTO StylesheetSelectors VALUES (80, 8, 'Right block data - text', 'td.right-block-data td', 'a:1:{s:9:"font-size";s:5:"11px;";}', '', 2, '', 48); +INSERT INTO StylesheetSelectors VALUES (53, 8, 'Right block header', 'td.right-block-header', 'a:0:{}', '', 2, 'font-family : verdana, helvetica, sans-serif;\r\ncolor : #ffffff;\r\nfont-size : 12px;\r\nfont-weight : bold;\r\ntext-decoration : none;\r\nbackground-color: #64a1df;\r\npadding: 5px;\r\npadding-left: 7px;', 42); +INSERT INTO StylesheetSelectors VALUES (85, 8, 'Cart item cell with attributes', 'td.cart-item-attributes', 'a:0:{}', '', 1, 'background-color: #E6EEFF;\r\nborder-left: 1px solid #ffffff;\r\nborder-bottom: 1px solid #ffffff;\r\npadding: 4px;\r\ntext-align: center;\r\nvertical-align: middle;\r\nfont-size: 12px;\r\nfont-weight: normal;', 0); +INSERT INTO StylesheetSelectors VALUES (86, 8, 'Cart item cell with name', 'td.cart-item-name', 'a:0:{}', '', 1, 'background-color: #F6FAFF;\r\nborder-left: 1px solid #ffffff;\r\nborder-bottom: 1px solid #ffffff;\r\npadding: 3px;', 0); +INSERT INTO StylesheetSelectors VALUES (47, 8, 'Block content of featured product', 'td.featured-block-data', 'a:0:{}', '', 1, 'font-family: Arial,Helvetica,sans-serif;\r\nfont-size: 12px;', 0); +INSERT INTO StylesheetSelectors VALUES (56, 8, 'Main table, middle column', 'td.main-column-center', 'a:0:{}', '', 1, '\r\n', 0); +INSERT INTO StylesheetSelectors VALUES (50, 8, 'Product title link in list', 'a.link-product2', 'a:0:{}', 'Product title link', 1, 'color: #62A1DE;\r\nfont-size: 12px;\r\nfont-weight: bold;\r\ntext-decoration: none;\r\n\r\n', 0); +INSERT INTO StylesheetSelectors VALUES (71, 8, 'Main path block', 'table.main-path', 'a:0:{}', '', 1, 'background: #61b0ec url("/in-commerce4/themes/default/img/bgr_path.jpg") repeat-y scroll left top;\r\nwidth: 100%;\r\nmargin-bottom: 1px;\r\nmargin-right: 1px; \r\nmargin-left: 1px;', 0); +INSERT INTO StylesheetSelectors VALUES (62, 8, 'Block: columns header for data table', 'table.block-no-border th', 'a:6:{s:4:"font";s:28:"Arial, Helvetica, sans-serif";s:5:"color";s:7:"#18559C";s:9:"font-size";s:4:"11px";s:11:"font-weight";s:4:"bold";s:16:"background-color";s:7:"#B4D2EE";s:7:"padding";s:3:"6px";}', '', 1, 'text-align: left;', 0); +INSERT INTO StylesheetSelectors VALUES (59, 8, 'Block without border', 'table.block-no-border', 'a:0:{}', '', 1, 'border: 0px; \r\nmargin-bottom: 10px;\r\nwidth: 100%;', 0); +INSERT INTO StylesheetSelectors VALUES (74, 8, 'Main path language selector cell', 'td.main-path-language', 'a:0:{}', '', 1, 'vertical-align: middle;\r\ntext-align: right;\r\npadding-right: 6px;', 0); +INSERT INTO StylesheetSelectors VALUES (171, 8, 'Calendar''s highlighted day', '.calendar tbody .hilite', 'a:0:{}', '', 1, 'background-color: #f6f6f6;\r\nborder: 1px solid #83B2C5 !important;', 0); +INSERT INTO StylesheetSelectors VALUES (175, 8, 'Calendar''s days', '.calendar tbody .day', 'a:0:{}', '', 1, 'text-align: right;\r\npadding: 2px 4px 2px 2px;\r\nwidth: 2em;\r\nborder: 1px solid #fefefe;', 0); +INSERT INTO StylesheetSelectors VALUES (170, 8, 'Calendar''s weekends', '.calendar .weekend', 'a:0:{}', '', 1, 'color: #990000;', 0); +INSERT INTO StylesheetSelectors VALUES (173, 8, 'Calendar''s control buttons', '.calendar .calendar_button', 'a:0:{}', '', 1, 'color: black;\r\nfont-size: 12px;\r\nbackground-color: #eeeeee;', 0); +INSERT INTO StylesheetSelectors VALUES (174, 8, 'Calendar''s day names', '.calendar thead .name', 'a:0:{}', '', 1, 'background-color: #DEEEF6;\r\nborder-bottom: 1px solid #000000;', 0); +INSERT INTO StylesheetSelectors VALUES (172, 8, 'Calendar''s top and bottom titles', '.calendar .title', 'a:0:{}', '', 1, 'color: #FFFFFF;\r\nbackground-color: #62A1DE;\r\nborder: 1px solid #107DC5;\r\nborder-top: 0px;\r\npadding: 1px;', 0); +INSERT INTO StylesheetSelectors VALUES (60, 8, 'Block header for featured product', 'td.featured-block-header', 'a:0:{}', '', 2, '\r\n', 42); +INSERT INTO StylesheetSelectors VALUES (54, 8, 'Right block', 'table.right-block', 'a:0:{}', '', 2, 'background-color: #E3EEF9;\r\nborder: 0px;\r\nwidth: 100%;', 43); +INSERT INTO StylesheetSelectors VALUES (44, 8, 'Block content', 'td.block-data-big', 'a:0:{}', 'Block content', 1, ' background: #DEEEF6\r\nurl(/in-commerce4/themes/default/img/menu_bg.gif);\r\n background-repeat: no-repeat;\r\n background-position: top right;\r\n', 0); + +INSERT INTO Stylesheets VALUES (8, 'Default', 'In-Portal Default Theme', '', 1124952555, 1); + +INSERT INTO Counters VALUES (DEFAULT, 'members_count', 'SELECT COUNT(*) FROM <%PREFIX%>PortalUser WHERE Status = 1', NULL , NULL , '3600', '0', '|PortalUser|'); +INSERT INTO Counters VALUES (DEFAULT, 'members_online', 'SELECT COUNT(*) FROM <%PREFIX%>UserSession WHERE PortalUserId > 0', NULL , NULL , '3600', '0', '|UserSession|'); +INSERT INTO Counters VALUES (DEFAULT, 'guests_online', 'SELECT COUNT(*) FROM <%PREFIX%>UserSession WHERE PortalUserId <= 0', NULL , NULL , '3600', '0', '|UserSession|'); +INSERT INTO Counters VALUES (DEFAULT, 'users_online', 'SELECT COUNT(*) FROM <%PREFIX%>UserSession', NULL , NULL , '3600', '0', '|UserSession|'); + +UPDATE ConfigurationValues SET VariableValue = 1 WHERE VariableName = 'KeepSessionOnBrowserClose'; + +INSERT INTO Modules VALUES ('In-Portal', 'kernel/', 'm', '0.0.0', 1, 0, '', 0, '1054738405'); Index: branches/RC/core/install/step_templates/install_setup.tpl =================================================================== diff -u -N -r8929 -r10832 --- branches/RC/core/install/step_templates/install_setup.tpl (.../install_setup.tpl) (revision 8929) +++ branches/RC/core/install/step_templates/install_setup.tpl (.../install_setup.tpl) (revision 10832) @@ -3,15 +3,15 @@ In order to use the installation tool, please provide your Intechnic account information: - + Username*: - + - + Password*: @@ -23,34 +23,33 @@ - + - - + 'Upgrade In-Portal', 1 => 'Clean out the In-Portal database and reinstall', - 4 => 'Clean out the In-Portal database and reinstall from backup', 2 => 'Install to a new database', - 3 => 'Update License Information', + 'update_license'=> 'Update License Information', 'db_reconfig' => 'Change Database Configuration', 'fix_paths' => 'Fix Paths', ); - + $upgradable_modules = $this->GetUpgradableModules(); if (!$upgradable_modules) { unset($options['upgrade']); } - - $td_class = 'table-color1'; + + $td_class = 'table-color1'; foreach ($options as $option_key => $option_title) { $checked = $this->GetVar('next_preset') == $option_key ? ' checked' : ''; echo sprintf($option_tpl, $option_key, $checked, $option_title, $td_class); $td_class = ($td_class == 'table-color1') ? 'table-color2' : 'table-color1'; } - + ?> \ No newline at end of file Index: branches/RC/core/admin_templates/regional/languages_import.tpl =================================================================== diff -u -N -r9853 -r10832 --- branches/RC/core/admin_templates/regional/languages_import.tpl (.../languages_import.tpl) (revision 9853) +++ branches/RC/core/admin_templates/regional/languages_import.tpl (.../languages_import.tpl) (revision 10832) @@ -12,7 +12,8 @@
- + @@ -23,34 +23,34 @@ - +
  blocks
In-Portal Version GetMaxModuleVersion('Core'); ?>: English US
In-Portal Version toolkit->GetMaxModuleVersion('Core'); ?>: English US
blocks2

- - + + - - + + + - +

Installation - +
    PrintSteps('
  1. %s
  2. ', '
  3. %s
  4. '); ?>
-
 GetStepInfo('step_title'); ?>

- + @@ -65,7 +65,7 @@
- + @@ -81,16 +81,16 @@
- + - + +
- + GetStepBody(); ?> - + - - + +
@@ -101,31 +101,31 @@

- + GetStepNumber() > 1 && $this->GetNextStep() != -1) { echo ''; } ?> - +
- - + + @@ -134,13 +134,13 @@
GetStepInfo('help_title'); ?>
GetStepInfo('help_title'); ?>
GetStepInfo('help_body'); ?>
-